OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
spmd_anim_ply_init.F
Go to the documentation of this file.
1Copyright> OpenRadioss
2Copyright> Copyright (C) 1986-2025 Altair Engineering Inc.
3Copyright>
4Copyright> This program is free software: you can redistribute it and/or modify
5Copyright> it under the terms of the GNU Affero General Public License as published by
6Copyright> the Free Software Foundation, either version 3 of the License, or
7Copyright> (at your option) any later version.
8Copyright>
9Copyright> This program is distributed in the hope that it will be useful,
10Copyright> but WITHOUT ANY WARRANTY; without even the implied warranty of
11Copyright> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12Copyright> GNU Affero General Public License for more details.
13Copyright>
14Copyright> You should have received a copy of the GNU Affero General Public License
15Copyright> along with this program. If not, see <https://www.gnu.org/licenses/>.
16Copyright>
17Copyright>
18Copyright> Commercial Alternative: Altair Radioss Software
19Copyright>
20Copyright> As an alternative to this open-source version, Altair also offers Altair Radioss
21Copyright> software under a commercial license. Contact Altair to discuss further if the
22Copyright> commercial version may interest you: https://www.altair.com/radioss/.
23!||====================================================================
24!|| spmd_anim_ply_init ../starter/source/spmd/spmd_anim_ply_init.F
25!||--- called by ------------------------------------------------------
26!|| lectur ../starter/source/starter/lectur.F
27!||--- uses -----------------------------------------------------
28!|| plyxfem_mod ../starter/share/modules1/plyxfem_mod.F
29!|| stack_mod ../starter/share/modules1/stack_mod.F
30!||====================================================================
31 SUBROUTINE spmd_anim_ply_init (IGEO, GEO ,IPARG ,IXC ,IXTG ,
32 . IPARTC,IPARTQ,IPARTTG,STACK)
33C-----------------------------------------------
34C M o d u l e s
35C-----------------------------------------------
36 USE plyxfem_mod
37 USE stack_mod
38 use element_mod , only : nixc,nixtg
39C-----------------------------------------------
40C I m p l i c i t T y p e s
41C-----------------------------------------------
42#include "implicit_f.inc"
43C-----------------------------------------------
44C C o m m o n B l o c k s
45C-----------------------------------------------
46#include "com01_c.inc"
47#include "com04_c.inc"
48#include "param_c.inc"
49C-----------------------------------------------
50C D u m m y A r g u m e n t s
51C-----------------------------------------------
52C REAL
54 . geo(npropg,*)
55 INTEGER IXC(NIXC,*),IPARTQ(*),IPARTTG(*),IXTG(NIXTG,*),
56 . iparg(nparg,*), ipartc(*),igeo(npropgi,*)
57C
58 TYPE (STACK_PLY) :: STACK
59C-----------------------------------------------
60C L O C A L V A R I A B L E S
61C-----------------------------------------------
62 LOGICAL :: COMPUTATION_NEEDED
63 INTEGER IE,NG, ITY, LFT, LLT, NPT, N, I,
64 . iprt, nel, iad, nft,mtn,
65 . k, ihbe,ishplyxfem,ipid,ipt,
66 . iply,ippid,jpid,
67 . ncount,shcount,mater(npart),isubstack
68 INTEGER, DIMENSION(:), ALLOCATABLE :: TAG_ARRAY,TAG_SHELLS
69
70C-----------------------------------------------
71 ALLOCATE(tag_array(numnod))
72 ALLOCATE(tag_shells(numelc))
73 DO i=1,npart
74 mater(i)=0
75 ENDDO
76
77 computation_needed = .false.
78 DO ng = 1, ngroup
79 nel =iparg(2,ng)
80 nft =iparg(3,ng)
81 ity =iparg(5,ng)
82 IF(ity==2)THEN
83 DO i = 1, nel
84 n = i + nft
85 mater(ipartq(n)) = 1
86 ENDDO
87 ELSEIF(ity==3)THEN
88 DO i = 1, nel
89 n = i + nft
90 mater(ipartc(n)) = 1
91 ENDDO
92 ELSEIF(ity==7)THEN
93 DO i = 1, nel
94 n = i + nft
95 mater(iparttg(n)) = 1
96 ENDDO
97 ENDIF
98 ishplyxfem = iparg(50,ng)
99 IF(ishplyxfem/=0) computation_needed = .true.
100 ENDDO
101
102c
103
104C INITIALISATION
105
106 ALLOCATE(plynod(nplymax))
107
108 DO i=1,nplymax
109 plynod(i)%PLYNUMNODS = 0
110 ENDDO
111
112 ALLOCATE(plyshell(nplymax))
113 DO i=1,nplymax
114 plyshell(i)%PLYNUMSHELL = 0
115 ENDDO
116C-----------------------------------------------
117C NORMALE
118C-----------------------------------------------
119 ie = 0
120C-----------------------------------------------
121 ippid = 100
122C-----------------------------------------------
123C PART
124C-----------------------------------------------
125 ALLOCATE (idpid_ply(nplymax))
126 idpid_ply= 0
127 IF(computation_needed) THEN
128 DO k=1,nplymax
129 tag_array=0
130 tag_shells=0
131 shcount=0
132 DO 500 iprt=1,npart
133 IF(mater(iprt) == 0)GOTO 500
134 DO 490 ng=1,ngroup
135 mtn =iparg(1,ng)
136 nel =iparg(2,ng)
137 nft =iparg(3,ng)
138 iad =iparg(4,ng)
139 ity =iparg(5,ng)
140 ishplyxfem = iparg(50,ng)
141 lft=1
142 llt=nel
143
144 IF(ishplyxfem > 0) THEN
145C-----------------------------------------------
146C COQUES
147C-----------------------------------------------
148 IF(ity==3)THEN
149 npt =iparg(6,ng)
150 ihbe = iparg(23,ng)
151 isubstack = iparg(71,ng)
152 ippid = 2
153 DO 130 i=lft,llt
154 n = i + nft
155 IF(ipartc(n)/=iprt)GOTO 130
156 ipid = ixc(6,n)
157 DO ipt=1,npt
158 jpid = stack%IGEO(ippid + ipt, isubstack)
159 iply = igeo(102 ,jpid)
160 idpid_ply(iply) =igeo(1 ,jpid)
161 IF (iply == k) THEN
162 tag_array(ixc(2,n))=1
163 tag_array(ixc(3,n))=1
164 tag_array(ixc(4,n))=1
165 tag_array(ixc(5,n))=1
166
167 tag_shells(n) = ipt
168 plyshell(k)%PLYNUMSHELL = plyshell(k)%PLYNUMSHELL+1
169 ENDIF
170
171 ENDDO
172130 CONTINUE
173
174C-----------------------------------------------
175C COQUES 3 NOEUDS
176C-----------------------------------------------
177 ELSEIF(ity==7)THEN
178C
179 ENDIF
180 ENDIF
181 490 CONTINUE
182C
183 500 CONTINUE
184C
185C Ply Nodes Post treatments
186C
187 DO i=1,numnod
188 IF (tag_array(i)==1) plynod(k)%PLYNUMNODS = plynod(k)%PLYNUMNODS + 1
189 ENDDO
190 ALLOCATE (plynod(k)%NODES(plynod(k)%PLYNUMNODS))
191
192 ncount = 0
193 DO i=1,numnod
194 IF (tag_array(i)==1) THEN
195 ncount=ncount+1
196 plynod(k)%NODES(ncount)=i
197 ENDIF
198 ENDDO
199C
200C Ply Shells Post treatments
201C
202 ALLOCATE (plyshell(k)%SHID(plyshell(k)%PLYNUMSHELL))
203 ALLOCATE (plyshell(k)%SHELLIPT(plyshell(k)%PLYNUMSHELL))
204
205C debugs print*,'PLYSHELL : ',PLYSHELL(K)%plynumshell,NUMELC
206
207 shcount=0
208 DO i=1, numelc
209 IF (tag_shells(i) > 0)THEN
210 shcount=shcount+1
211 plyshell(k)%SHID(shcount)=i
212 plyshell(k)%SHELLIPT(shcount)=tag_shells(i)
213 ENDIF
214 ENDDO
215 ENDDO
216
217 ELSE
218 DO k=1,nplymax
219 ALLOCATE (plynod(k)%NODES(plynod(k)%PLYNUMNODS))
220 ALLOCATE (plyshell(k)%SHID(plyshell(k)%PLYNUMSHELL))
221 ALLOCATE (plyshell(k)%SHELLIPT(plyshell(k)%PLYNUMSHELL))
222 ENDDO
223 ENDIF
224C-------------------------------
225C Numeros globaux des shell ply
226C-------------------------------
227 ncount = 0
228 DO k=1,nplymax
229 ALLOCATE(plyshell(k)%SHELLID(plyshell(k)%PLYNUMSHELL))
230 DO i=1,plyshell(k)%PLYNUMSHELL
231 ncount=ncount+1
232 plyshell(k)%SHELLID(i)=ncount
233 ENDDO
234 ENDDO
235
236C-------------------------------
237C Global numbers of the ply nodes
238C-------------------------------
239 ncount = 0
240 DO k=1,nplymax
241 ALLOCATE(plynod(k)%PLYNODID(plynod(k)%PLYNUMNODS))
242 DO i=1,plynod(k)%PLYNUMNODS
243 ncount=ncount+1
244 plynod(k)%PLYNODID(i)=ncount
245 ENDDO
246 ENDDO
247
248C-------------------------------
249C Plyparts
250C-------------------------------
251 ALLOCATE (indx_ply(nplymax))
252 nplypart = 0
253 indx_ply = 0
254 DO k=1,nplymax
255 IF ( plyshell(k)%PLYNUMSHELL >0) THEN
256 nplypart = nplypart + 1
257 indx_ply(nplypart) = k
259 ENDIF
260 ENDDO
261
262 nplynodg = 0
263 DO k=1,nplymax
264 nplynodg = nplynodg + plynod(k)%PLYNUMNODS
265 ENDDO
266
267 DEALLOCATE(tag_array)
268 DEALLOCATE(tag_shells)
269
270
271 RETURN
272 END
273!||====================================================================
274!|| get_ply_nod ../starter/source/spmd/spmd_anim_ply_init.F
275!||--- called by ------------------------------------------------------
276!|| w_anim_ply ../starter/source/restart/ddsplit/w_anim_ply.F
277!||--- uses -----------------------------------------------------
278!|| plyxfem_mod ../starter/share/modules1/plyxfem_mod.F
279!||====================================================================
280 INTEGER FUNCTION get_ply_nod(IPLY,NODID)
281C-----------------------------------------------
282C M o d u l e s
283C-----------------------------------------------
284 USE plyxfem_mod
285C-----------------------------------------------
286C I m p l i c i t T y p e s
287C-----------------------------------------------
288#include "implicit_f.inc"
289C-----------------------------------------------
290C D u m m y A r g u m e n t s
291C-----------------------------------------------
292 INTEGER iply,nodid
293C-----------------------------------------------
294C L O C A L V A R I A B L E S
295C-----------------------------------------------
296 INTEGER i,binf,bsup,milieu,size,empl,taille
297C-----------------------------------------------
298 size=plynod(iply)%PLYNUMNODS
299
300 binf=1
301 empl = - huge(empl)
302 bsup=SIZE
303
304 IF (plynod(iply)%NODES(binf)==nodid)THEN
305 empl=binf
306 GOTO 100
307 ENDIF
308
309 IF (plynod(iply)%NODES(bsup)==nodid)THEN
310 empl=bsup
311 GOTO 100
312 ENDIF
313
314 taille = bsup-binf+1
315 DO WHILE ( taille > 5)
316 milieu = (bsup-binf)/2 + binf
317
318 IF (plynod(iply)%NODES(milieu) == nodid) THEN
319 empl = milieu
320 GOTO 100
321 ENDIF
322 IF ( plynod(iply)%NODES(milieu) < nodid) THEN
323 binf = milieu
324 ELSE
325 bsup = milieu
326 ENDIF
327 taille = bsup-binf+1
328 ENDDO
329
330 DO i=binf,bsup
331 IF (plynod(iply)%NODES(i) == nodid) THEN
332 empl = i
333 GOTO 100
334 ENDIF
335 ENDDO
336
337 100 CONTINUE
338
339 get_ply_nod = empl
340
341 RETURN
342 END
343
344
345!||====================================================================
346!|| get_ply_nodid ../starter/source/spmd/spmd_anim_ply_init.F
347!||--- uses -----------------------------------------------------
348!|| plyxfem_mod ../starter/share/modules1/plyxfem_mod.F
349!||====================================================================
350 INTEGER FUNCTION get_ply_nodid(IPLY,NODID,OFFSET)
351C-----------------------------------------------
352C M o d u l e s
353C-----------------------------------------------
354 USE plyxfem_mod
355C-----------------------------------------------
356C I m p l i c i t T y p e s
357C-----------------------------------------------
358#include "implicit_f.inc"
359C-----------------------------------------------
360C D u m m y A r g u m e n t s
361C-----------------------------------------------
362 INTEGER iply,nodid,offset
363C-----------------------------------------------
364C L O C A L V A R I A B L E S
365C-----------------------------------------------
366 INTEGER i,binf,bsup,milieu,size,empl,taille
367C-----------------------------------------------
368 size=plynod(iply)%PLYNUMNODS
369
370 binf=1
371 bsup=SIZE
372
373 IF (plynod(iply)%NODES(binf)==nodid)THEN
374 empl=binf
375 GOTO 100
376 ENDIF
377
378 IF (plynod(iply)%NODES(bsup)==nodid)THEN
379 empl=bsup
380 GOTO 100
381 ENDIF
382
383 taille = bsup-binf+1
384 DO WHILE ( taille > 5)
385 milieu = (bsup-binf)/2 + binf
386
387 IF (plynod(iply)%NODES(milieu) == nodid) THEN
388 empl = milieu
389 GOTO 100
390 ENDIF
391 IF ( plynod(iply)%NODES(milieu) < nodid) THEN
392 binf = milieu
393 ELSE
394 bsup = milieu
395 ENDIF
396 taille = bsup-binf+1
397 ENDDO
398
399 DO i=binf,bsup
400 IF (plynod(iply)%NODES(i) == nodid) THEN
401 empl = i
402 GOTO 100
403 ENDIF
404 ENDDO
405
406 100 CONTINUE
407
408 get_ply_nodid = plynod(iply)%PLYNODID(empl)+offset
409
410 RETURN
411 END
#define my_real
Definition cppsort.cpp:32
type(plynods), dimension(:), allocatable plynod
Definition plyxfem_mod.F:44
integer, dimension(:), allocatable indx_ply
Definition plyxfem_mod.F:60
integer nplypart
Definition plyxfem_mod.F:59
integer, dimension(:), allocatable idpid_ply
Definition plyxfem_mod.F:61
type(plyshells), dimension(:), allocatable plyshell
Definition plyxfem_mod.F:56
integer function get_ply_nodid(iply, nodid, offset)
integer function get_ply_nod(iply, nodid)
subroutine spmd_anim_ply_init(igeo, geo, iparg, ixc, ixtg, ipartc, ipartq, iparttg, stack)