OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
i9wal2.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!|| i9wal2 ../engine/source/interfaces/int09/i9wal2.F
25!||--- called by ------------------------------------------------------
26!|| i9wale ../engine/source/interfaces/int09/i9wale.F
27!||--- calls -----------------------------------------------------
28!|| bcs2 ../engine/source/constraints/general/bcs/bcs2.F
29!|| i9grd2 ../engine/source/interfaces/int09/i9grd2.F
30!|| spmd_glob_dsum9 ../engine/source/mpi/interfaces/spmd_th.F
31!|| spmd_glob_isum9 ../engine/source/mpi/interfaces/spmd_th.F
32!|| spmd_ibcast ../engine/source/mpi/generic/spmd_ibcast.F
33!|| spmd_rbcast ../engine/source/mpi/generic/spmd_rbcast.F
34!||--- uses -----------------------------------------------------
35!|| elbufdef_mod ../common_source/modules/mat_elem/elbufdef_mod.F90
36!||====================================================================
37 SUBROUTINE i9wal2(X,V ,W ,A ,CRST ,
38 2 NSV ,ILOC ,IRTL ,ICODE ,ISKEW ,
39 3 SKEW ,MSR ,LMSR ,NSEG ,IRECTS ,
40 4 IRECT ,UPW ,IXQ ,ELBUF_TAB ,
41 5 IPARG ,PM ,NALE ,EE ,IELES ,
42 6 IELEM ,TSTIF ,INTTH ,IEULT ,STENS ,
43 7 ISIZES ,ISIZEM, NRTS, NRTM,NSN,NMN)
44C-----------------------------------------------
45C M o d u l e s
46C-----------------------------------------------
47 USE elbufdef_mod
48C-----------------------------------------------
49C I m p l i c i t T y p e s
50C-----------------------------------------------
51#include "implicit_f.inc"
52C-----------------------------------------------
53C C o m m o n B l o c k s
54C-----------------------------------------------
55#include "com01_c.inc"
56#include "com08_c.inc"
57#include "scr08_a_c.inc"
58#include "param_c.inc"
59#include "task_c.inc"
60C-----------------------------------------------
61C D u m m y A r g u m e n t s
62C-----------------------------------------------
63 INTEGER, INTENT(IN) :: NRTS, NRTM,NSN,NMN
64 INTEGER IRECT(4,*), NSV(NSN), ILOC(*), IRTL(NSN), ICODE(*), ISKEW(*),
65 . MSR(*), IRECTS(4,*), LMSR(*), NSEG(*),IXQ(NIXQ,*),
66 . IPARG(NPARG,*), IELES(*), IELEM(*),NALE(*) ,
67 . INTTH, IEULT, ISIZES, ISIZEM
68C REAL
70 . upw, tstif,ttt, stens,
71 . x(3,*), v(3,*), w(3,*), a(3,*), crst(2,*), skew(lskew,*),
72 . pm(npropm,*),ee(*)
73 TYPE (ELBUF_STRUCT_), TARGET, DIMENSION(NGROUP) :: ELBUF_TAB
74C-----------------------------------------------
75C L o c a l V a r i a b l e s
76C-----------------------------------------------
77 INTEGER II, N, L, JJ, NN, LL, LL1, LL2, LG, KK, KKK, K1, K2,
78 . I1, I2, IERR, IGROU, IELN,
79 . ixx(4), iperm(2), jperm(2),
80 . itemp(2), is, im, ilen,
81 . tags(isizes),tagm(isizem), lists(isizes),listm(isizem),
82 . icomerr(isizem+isizes),icomngr(isizem+isizes),
83 . icomnel(isizem+isizes)
84C REAL
85 my_real h(2),
86 . vmx, vmy, vmz, vx, vy, vz, vv, nx, ny, nz, vt,
87 . nnx, nny, nnz, fac, p, x1, y1, z1,x2, y2, z2, tx, ty, tz,
88 . efric, vols, volm, ts, tm ,tstifm, tstifs, dvn,
89 . tstift, phi, areas, aream, vn, wn, stensy, stensz,
90 . comarea(isizem+isizes),comstf(isizem+isizes),
91 . comt(isizem+isizes),comvol(isizem+isizes),combuf(isizem+isizes)
92 TYPE(g_bufel_) ,POINTER :: GBUF
93c
94 DATA IPERM/ 2, 1/,JPERM/ 1, -1/
95C-----------------------------------------------
96C
97C Phase de Preparation pour SPMD
98C
99 IF(intth/=zero) THEN
100 IF(ispmd==0) THEN
101 DO ii = 1, nrts
102 tags(ii) = 0
103 ENDDO
104 DO ii = 1, nrtm
105 tagm(ii) = 0
106 ENDDO
107 is = 0
108 im = 0
109 DO ii = 1, nsn
110 l = irtl(ii)
111 IF(iloc(ii)>0.AND.nmn>0)THEN
112 IF(tagm(l)==0)THEN
113 im = im + 1
114 listm(im) = l
115 tagm(l) = im
116 END IF
117 ll1=nseg(ii)
118 ll2=nseg(ii+1)-1
119 DO ll=ll1,ll2
120 lg = lmsr(ll)
121 IF(tags(lg)==0) THEN
122 is = is + 1
123 lists(is) = lg
124 tags(lg) = is
125 ENDIF
126 ENDDO
127 ENDIF
128 ENDDO
129C
130C Compactage listes elem
131C
132 itemp(1) = is
133 itemp(2) = im
134 ENDIF
135C
136C Envoi liste facettes seconds/mains en contact
137C
138 IF(nspmd > 1) THEN
139 CALL spmd_ibcast(itemp,itemp,1,2,0,2)
140 is = itemp(1)
141 im = itemp(2)
142 ilen = im+is
143 CALL spmd_ibcast(listm,listm,1,im,0,2)
144 CALL spmd_ibcast(lists,lists,1,is,0,2)
145 END IF
146 DO ii = 1, im
147 l = listm(ii)
148 ix(1) = msr(irect(1,l))
149 ix(2) = msr(irect(2,l))
150 IF(ielem(l)>0) THEN
151 CALL i9grd2(
152 1 ierr ,comarea(ii),comstf(ii),comt(ii),comvol(ii),
153 2 ielem(l) ,x ,ixq(1,ielem(l)),ix ,
154 3 iparg,pm ,elbuf_tab , igrou ,ieln )
155 icomerr(ii) = ierr
156 icomngr(ii) = igrou
157 icomnel(ii) = ieln
158 ELSE
159 comarea(ii) = zero
160 comstf(ii) = zero
161 comt(ii) = zero
162 comvol(ii) = zero
163 icomerr(ii) = 0
164 icomngr(ii) = 0
165 icomnel(ii) = 0
166 ENDIF
167 combuf(ii) = zero
168 ENDDO
169C
170 DO ii = 1, is
171 l = lists(ii)
172 ixx(1)=nsv(irects(1,l))
173 ixx(2)=nsv(irects(2,l))
174 IF(ieles(l)>0) THEN
175 CALL i9grd2(
176 1 ierr ,comarea(im+ii),comstf(im+ii),comt(im+ii),comvol(im+ii),
177 2 ieles(l) ,x ,ixq(1,ieles(l)) ,ixx ,
178 3 iparg,pm ,elbuf_tab ,igrou ,ieln )
179 icomerr(im+ii) = ierr
180 icomngr(im+ii) = igrou
181 icomnel(im+ii) = ieln
182 ELSE
183 comarea(im+ii) = zero
184 comstf(im+ii) = zero
185 comt(im+ii) = zero
186 comvol(im+ii) = zero
187 icomerr(im+ii) = 0
188 icomngr(im+ii) = 0
189 icomnel(im+ii) = 0
190 ENDIF
191 combuf(im+ii) = zero
192 ENDDO
193C
194 IF (nspmd > 1) THEN
195C
196C gather des valeurs
197C
198 CALL spmd_glob_dsum9(comarea,ilen)
199 CALL spmd_glob_dsum9(comstf,ilen)
200 CALL spmd_glob_dsum9(comt,ilen)
201 CALL spmd_glob_dsum9(comvol,ilen)
202 CALL spmd_glob_isum9(icomerr,ilen)
203 CALL spmd_glob_isum9(icomngr,ilen)
204 CALL spmd_glob_isum9(icomnel,ilen)
205C partie noeud sur P0 uniquement
206 IF(ispmd/=0) GOTO 900
207 END IF
208C interface traitee par p0
209 ELSE
210 IF(ispmd/=0) RETURN
211 ENDIF
212C
213 DO 800 ii=1,nsn
214 ll1=nseg(ii)
215 ll2=nseg(ii+1)-1
216 n=nsv(ii)
217 IF(iloc(ii)>0.AND.nmn>0)THEN
218C---------------------------------
219C CONTACT
220C---------------------------------
221 l=irtl(ii)
222 DO 10 jj=1,2
223 nn=irect(jj,l)
224 10 ix(jj)=msr(nn)
225C
226 h(1) = half*(one - crst(1,ii))
227 h(2) = half*(one + crst(1,ii))
228C---------------------------------
229C VITESSE DE MAILLAGE
230C---------------------------------
231 vmy=zero
232 vmz=zero
233C
234 DO jj=1,2
235 vmy=vmy+w(2,ix(jj))*h(jj)
236 vmz=vmz+w(3,ix(jj))*h(jj)
237 ENDDO
238C
239 w(2,n)=vmy
240 w(3,n)=vmz
241C---------------------------------
242C PONT THERMIQUE
243C---------------------------------
244 IF(intth/=zero)THEN
245 kk = tagm(l)
246 efric = half * ee(ii) / (ll2-ll1+1)
247 ierr = icomerr(kk)
248 aream = comarea(kk)
249 tstifm = comstf(kk)
250 tm = comt(kk)
251 volm = comvol(kk)
252 IF(ierr==0) THEN
253 DO ll = ll1,ll2
254 lg = lmsr(ll)
255 jj = tags(lg) + im
256 ierr = icomerr(jj)
257 areas = comarea(jj)
258 tstifs = comstf(jj)
259 ts = comt(jj)
260 vols = comvol(jj)
261 IF(ierr==0) THEN
262 tstift = tstifm + tstifs + tstif
263 phi = areas * dt1 * (tm-ts) / tstift
264 combuf(jj) = combuf(jj)
265 + + (efric+phi)/vols
266 combuf(kk) = combuf(kk)
267 + + (efric-phi)/volm
268 ENDIF
269 ENDDO
270 ENDIF
271c ENDIF
272 ENDIF
273C
274 ELSEIF(iloc(ii)<0.OR.nmn==0)THEN
275C---------------------------------------
276C PAS DE CONTACT => SURFACE LIBRE
277C---------------------------------------
278 iloc(ii) = -iloc(ii)
279C
280 vy = v(2,n) - w(2,n)
281 vz = v(3,n) - w(3,n)
282 vv = max(em30,sqrt(vy**2+vz**2))
283 nny = zero
284 nnz = zero
285C------------------------------------------------------
286C BOUCLE SUR LES FACETTES CONNECTEES AU NOEUD II
287C------------------------------------------------------
288 DO 300 ll=ll1,ll2
289 lg=lmsr(ll)
290 DO 200 kkk=1,2
291 kk=kkk
292 200 IF(irects(kk,lg)==ii) GO TO 250
293 250 CONTINUE
294C------------------------------------------------------
295C CALCUL DE LA NORMALE AVEC UPWIND SUR L'AMONT
296C------------------------------------------------------
297 k1 = iperm(kk)
298 i1 = nsv(irects(k1,lg))
299 ty = x(2,i1) - x(2,n)
300 tz = x(3,i1) - x(3,n)
301 ttt = max(em30,sqrt(ty**2+tz**2))
302C VT = VY*TY + VZ*TZ
303 vt = v(2,n)*ty + v(3,n)*tz
304 p = onep0001 - upw*(half + sign(half,vt))
305 ny = tz
306 nz =-ty
307C FAC = P / MAX(EM30,SQRT(NY**2+NZ**2))
308 fac = p * jperm(kk)
309 nny = nny + ny*fac
310 nnz = nnz + nz*fac
311C-------------------------------------
312C TENSION DE SURFACE
313C-------------------------------------
314 stensy = stens * ty / ttt
315 stensz = stens * tz / ttt
316 a(2,n) = a(2,n) + stensy
317 a(3,n) = a(3,n) + stensz
318 300 CONTINUE
319 fac = max(em30,sqrt(nny**2+nnz**2))
320 nny = nny/fac
321 nnz = nnz/fac
322C---------------------------------
323C BCS DE GRILLE
324C---------------------------------
325 IF(icode(n)/=0)THEN
326C---------------------------------
327C W LAGRANGIEN SUIVANT N
328C---------------------------------
329 dvn = vy * nny + vz * nnz
330 w(2,n) = w(2,n) + dvn * nny
331 w(3,n) = w(3,n) + dvn * nnz
332 CALL bcs2(w(1,n),skew(1,iskew(n)),iskew(n),icode(n))
333 vn = v(2,n)*nny + v(3,n)*nnz
334 wn = w(2,n)*nny + w(3,n)*nnz
335C-------------------------------------
336C W LAGRANGIEN SUIVANT N + BCS
337C-------------------------------------
338 IF(abs(wn)>em30)THEN
339 fac = vn / wn
340 w(2,n) = w(2,n) * fac
341 w(3,n) = w(3,n) * fac
342 ENDIF
343 ELSEIF(ieult/=0)THEN
344C-------------------------------------
345C W LAGRANGIEN SUIVANT N
346C W EULERIEN SUIVANT T
347C---------------------------------
348 vn = v(2,n) * nny + v(3,n) * nnz
349 w(2,n) = vn * nny
350 w(3,n) = vn * nnz
351 ELSE
352C-------------------------------------
353C W LAGRANGIEN SUIVANT N
354C LIBRE SUIVANT T
355C---------------------------------
356 dvn = vy * nny + vz * nnz
357 w(2,n) = w(2,n) + dvn * nny
358 w(3,n) = w(3,n) + dvn * nnz
359 ENDIF
360 ENDIF
361C
362 800 CONTINUE
363C
364C Phase de Finalisation pour SPMD
365C
366 900 CONTINUE
367 IF(intth/=zero) THEN
368 IF(nspmd > 1) THEN
369C
370C Envoi buffer elems updates
371C
372 CALL spmd_rbcast(combuf,combuf,1,ilen,0,2)
373 END IF
374C
375C Mise a jour ELBUF local
376C
377 DO ii = 1, im
378 l = listm(ii)
379 IF(ielem(l)>0) THEN
380 igrou = icomngr(ii)
381 ieln = icomnel(ii)
382 elbuf_tab(igrou)%GBUF%EINT(ieln) =
383 . elbuf_tab(igrou)%GBUF%EINT(ieln) + combuf(ii)
384 ENDIF
385 ENDDO
386C
387 DO ii = 1, is
388 l = lists(ii)
389 IF(ieles(l)>0) THEN
390 igrou = icomngr(im+ii)
391 ieln = icomnel(im+ii)
392 elbuf_tab(igrou)%GBUF%EINT(ieln) =
393 . elbuf_tab(igrou)%GBUF%EINT(ieln) + combuf(im+ii)
394 ENDIF
395 ENDDO
396 ENDIF
397C
398 RETURN
399 END
subroutine bcs2(a, b, j, k)
Definition bcs2.F:32
#define my_real
Definition cppsort.cpp:32
subroutine i9grd2(ierr, area, tstif, t, vol, ii, x, ixq, ix, iparg, pm, elbuf_tab, igrou, ieln)
Definition i9grd2.F:36
subroutine i9wal2(x, v, w, a, crst, nsv, iloc, irtl, icode, iskew, skew, msr, lmsr, nseg, irects, irect, upw, ixq, elbuf_tab, iparg, pm, nale, ee, ieles, ielem, tstif, intth, ieult, stens, isizes, isizem, nrts, nrtm, nsn, nmn)
Definition i9wal2.F:44
#define max(a, b)
Definition macros.h:21
subroutine spmd_ibcast(tabi, tabr, n1, n2, from, add)
Definition spmd_ibcast.F:57
subroutine spmd_rbcast(tabi, tabr, n1, n2, from, add)
Definition spmd_rbcast.F:62
subroutine spmd_glob_dsum9(v, len)
Definition spmd_th.F:380
subroutine spmd_glob_isum9(v, len)
Definition spmd_th.F:523