OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
i22main_tri.F File Reference
#include "implicit_f.inc"
#include "comlock.inc"
#include "com01_c.inc"
#include "com04_c.inc"
#include "com08_c.inc"
#include "param_c.inc"
#include "task_c.inc"
#include "parit_c.inc"
#include "timeri_c.inc"
#include "inter22.inc"
#include "lockon.inc"
#include "lockoff.inc"

Go to the source code of this file.

Functions/Subroutines

subroutine i22main_tri (timers, ipari, x, v, ms, nin, itask, mwag, weight, isendto, ircvfrom, retri, iad_elem, fr_elem, itab, kinet, temp, nrtm_t, renum, nsnfiold, eshift, num_imp, ind_imp, nodnx_sms, ixs, igrbric, ale_connectivity, intbuf_tab, count_remslv, h3d_data, multi_fvm, nodadt_therm)
subroutine i22solid_getminmax (x, ixs, bufbric, nbric, itab, itask, nin)
subroutine i22shell_getminmax (x, irect, nrtm, stfe, itask, itab, eshift, bminma, marge)

Function/Subroutine Documentation

◆ i22main_tri()

subroutine i22main_tri ( type(timer_) timers,
integer, dimension(npari,ninter) ipari,
x,
v,
ms,
integer nin,
integer itask,
integer, dimension(*) mwag,
integer, dimension(*) weight,
integer, dimension(ninter+1,*) isendto,
integer, dimension(ninter+1,*) ircvfrom,
integer retri,
integer, dimension(2,*) iad_elem,
integer, dimension(*) fr_elem,
integer, dimension(*) itab,
integer, dimension(*) kinet,
temp,
integer nrtm_t,
integer, dimension(numnod) renum,
integer, dimension(nspmd) nsnfiold,
integer eshift,
integer num_imp,
integer, dimension(*) ind_imp,
integer, dimension(*) nodnx_sms,
integer, dimension(nixs,*) ixs,
type (group_), dimension(ngrbric) igrbric,
type(t_ale_connectivity), intent(in) ale_connectivity,
type(intbuf_struct_) intbuf_tab,
integer, dimension(*) count_remslv,
type(h3d_database) h3d_data,
type(multi_fvm_struct), intent(inout) multi_fvm,
integer, intent(in) nodadt_therm )

Definition at line 57 of file i22main_tri.F.

65C============================================================================
66C M o d u l e s
67C-----------------------------------------------
68 USE timer_mod
69 USE tri7box
70 USE i22tri_mod
71 USE message_mod
72 USE intbufdef_mod
74 USE h3d_mod
75 USE groupdef_mod
76 USE multi_fvm_mod
78 use check_sorting_criteria_mod , only : check_sorting_criteria
79C-----------------------------------------------
80C I m p l i c i t T y p e s
81C-----------------------------------------------
82#include "implicit_f.inc"
83#include "comlock.inc"
84C-----------------------------------------------
85C C o m m o n B l o c k s
86C-----------------------------------------------
87#include "com01_c.inc"
88#include "com04_c.inc"
89#include "com08_c.inc"
90#include "param_c.inc"
91#include "task_c.inc"
92#include "parit_c.inc"
93#include "timeri_c.inc"
94#include "inter22.inc"
95C common pour variable globale en memoire partagee
96 COMMON /i22mainc/bminma_lag,bminma_flu,result,nsnr,nsnrold,i_memg,
97 . curv_max_max
98 INTEGER RESULT,NSNR,NSNROLD,I_MEMG
99 my_real
100 . bminma_lag(6), !dimensions domaine lagrangien local
101 . bminma_flu(6), !dimensions domaine fluide local
102 . curv_max_max
103C-----------------------------------------------
104C D u m m y A r g u m e n t s
105C-----------------------------------------------
106 TYPE(TIMER_) :: TIMERS
107 INTEGER NIN ,ITASK, RETRI, NRTM_T,ESHIFT,
108 . NUM_IMP ,IND_IMP(*),
109 . ITAB(*), KINET(*),
110 . IPARI(NPARI,NINTER), MWAG(*),
111 . ISENDTO(NINTER+1,*),IRCVFROM(NINTER+1,*),
112 . WEIGHT(*), IAD_ELEM(2,*) ,FR_ELEM(*),
113 . RENUM(NUMNOD), NSNFIOLD(NSPMD), NODNX_SMS(*),
114 . IXS(NIXS,*),NSHELL, COUNT_REMSLV(*)
115 INTEGER , INTENT(IN) :: NODADT_THERM
116 my_real
117 . x(3,*), v(3,*), ms(*),temp(*)
118 TYPE(INTBUF_STRUCT_) INTBUF_TAB
119 TYPE(H3D_DATABASE) :: H3D_DATA
120 TYPE(MULTI_FVM_STRUCT), INTENT(INOUT) :: MULTI_FVM
121
122C-----------------------------------------------
123 TYPE (GROUP_) , DIMENSION(NGRBRIC) :: IGRBRIC
124 TYPE(t_ale_connectivity), INTENT(IN) :: ALE_CONNECTIVITY
125C-----------------------------------------------
126C L o c a l V a r i a b l e s
127C-----------------------------------------------
128 INTEGER LOC_PROC, P,
129 . I, IP0, IP1, IP2, IP21, I_SK_OLD, I_STOK1,
130 . ADD1, NB_N_B, NOINT, INACTI, MULTIMP, IGAP, IFQ,
131 . IAD, J, NF, NL, I1, I2, REM_P(NSPMD-1)
132 INTEGER ::
133 . NBRIC_G, !Nombre de brique dans tout le modele
134 . NBRIC_L, !Nombre de brique du domaine (non fragmentate sur les thread)
135 . NSHEL_G, !Nombre de facettes dans tout le modele
136 . NSHEL_L, !Nombre de facettes du domaine
137 . NSHEL_T, !Nombre de facettes du domaine associe au THREAD concerne
138 . NSHELR_L !Nombre de facettes remote du domaine
139! . NSHELR_T !Nombre de facettes remote du domaine (pour le thread courant)
140 INTEGER
141 . ILD, NCONT, NCONTACT, INACTII, INACIMP, INTTH,
142 . I_MEM,CAND_N_OLD,IDUM1(1),
143 . ISU1, ISU2, NBF, NBL, IBID, COUNT_CAND, CT,INTFRIC
144 LOGICAL ::
145 . IS_CONTACT
146 my_real
147 . gap,maxbox,minbox,tzinf,
148 . xmaxl, ymaxl, zmaxl, xminl, yminl, zminl, gapmin, gapmax,
149 . c_maxl,bid,
150 . curv_max(nrtm_t),rdum1(1), stfe,
151 . bminma_and_r(6), !intersection fluid in local domain and remote lag faces
152 . bminma_and(6), !intersection fluid in local domain and all faces
153 . vel(4), vel_max
154 INTEGER :: NRTM,NSN,NTY,NMN
155 logical :: need_computation
156C-----------------------------------------------
157
158 ! --------------
159 ! check if the current interface needs to be sorted
160 call check_sorting_criteria( need_computation,nin,npari,nspmd,
161 . itask,ipari(1,nin),tt,intbuf_tab )
162 if( .not.need_computation ) return
163 ! --------------
164
165 i_memg = 0
166 i_mem = 0
167 is_contact=.false.
168
169C -------------------------------------------------------------
170C CRITERE DE RETRI
171C -------------------------------------------------------------
172 retri = 1
173C
174C -------------------------------------------------------------
175C INITIALISATIONS
176C -------------------------------------------------------------
177 nrtm =ipari(4,nin)
178 nsn =ipari(5,nin)
179 nmn =ipari(6,nin)
180 nty =ipari(7,nin)
181 noint =ipari(15,nin)
182 ncont =ipari(18,nin)
183 inacti =ipari(22,nin)
184 multimp=ipari(23,nin)
185 ncontact=multimp*ncont
186 !IFQ =IPARI(31,NIN)
187 i_sk_old=0
188 !INTTH = IPARI(47,NIN)
189 nsnrold = 0
190 gap =intbuf_tab%VARIABLES(2)
191 gapmin=intbuf_tab%VARIABLES(13)
192 gapmax=intbuf_tab%VARIABLES(16)
193 intbuf_tab%I_STOK(1)=0 !initialisation du nombre de condidat (II_STOK = INTBUF_TAB%I_STOK(1) )
194
195 !nombre d elements pour l interface (total, domaine, thread)
196 !---BRIQUES---!
197 nbric_g = ipari(32,nin)
198 isu1 = ipari(45,nin)
199 nbric_l = igrbric(isu1)%NENTITY
200!no IAD = IPARI(39,NIN) !ddsplit IPARI(39) <- IGRN(3) could change in ddsplit
201 !---SHELL---!
202 nshel_g = ipari(33,nin)
203 nshel_l = ipari(4,nin)
204 !ISU2 = IPARI(46,NIN)
205 !NSHEL_T = IGRN(2,ISU2)
206 nshel_t = nrtm_t
207 !---REMOTES---!
208 nsnr = 0
209 nshelr_l = 0
210 !NSHELR_T = NSNR
211
212 nirect_l = nshel_g !est un majorant de NSHEL_L+NSHELR_L
213
214C -------------------------------------------------------------
215C ALLOCATIONS
216C -------------------------------------------------------------
217 IF(itask==0)THEN
218 ALLOCATE (irect_l(siz_irect_l,nshel_g))
219 ALLOCATE(xmins(nbric_l))
220 ALLOCATE(ymins(nbric_l))
221 ALLOCATE(zmins(nbric_l))
222 ALLOCATE(xmaxs(nbric_l))
223 ALLOCATE(ymaxs(nbric_l))
224 ALLOCATE(zmaxs(nbric_l))
225 ALLOCATE(nsnr_g(nthread))
226 ALLOCATE(xmine(nshel_l))
227 ALLOCATE(ymine(nshel_l))
228 ALLOCATE(zmine(nshel_l))
229 ALLOCATE(xmaxe(nshel_l))
230 ALLOCATE(ymaxe(nshel_l))
231 ALLOCATE(zmaxe(nshel_l))
232 bminma_lag(1) = -ep30
233 bminma_lag(2) = -ep30
234 bminma_lag(3) = -ep30
235 bminma_lag(4) = ep30
236 bminma_lag(5) = ep30
237 bminma_lag(6) = ep30
238 dx22_min = ep30 !cinematic time step
239 v22_max = zero !cinematic time step
240 dt22_min = ep30 !cinematic time step
241 END IF
242
243 !cinematic time step
244 dx22min_l(itask) = ep30
245 v22max_l(itask) = zero
246
247 CALL my_barrier ! waiting for allocations
248
249 nsnr_g(1:nthread) = 0
250 loc_proc=ispmd+1
251
252C -------------------------------------------------------------
253C INITIALISATION DIMENSIONS DU DOMAINE LAGRANGIEN LOCAL
254C -------------------------------------------------------------
255 maxbox = intbuf_tab%VARIABLES(9)
256 minbox = intbuf_tab%VARIABLES(12)
257 tzinf = intbuf_tab%VARIABLES(8)
258
259C -------------------------------------------------------------
260C CALCUL BORNE DU DOMAINE LAGRANGIEN DU THREAD
261C -------------------------------------------------------------
262C eshift : decalage du groupe de facette, passage de NSHEL_T(thread) NSHEL_L(local)
263 CALL i22xsave(
264 1 x ,intbuf_tab%NSV ,intbuf_tab%MSR ,nsn ,nmn ,
265 2 itask ,intbuf_tab%XSAV ,xminl ,yminl ,zminl ,
266 3 xmaxl ,ymaxl ,zmaxl ,c_maxl ,curv_max ,
267 4 ipari(39,nin) ,intbuf_tab%IRECTM(1+4*eshift) ,nrtm_t )
268
269#include "lockon.inc"
270 bminma_lag(1) = max(bminma_lag(1),xmaxl)
271 bminma_lag(2) = max(bminma_lag(2),ymaxl)
272 bminma_lag(3) = max(bminma_lag(3),zmaxl)
273 bminma_lag(4) = min(bminma_lag(4),xminl)
274 bminma_lag(5) = min(bminma_lag(5),yminl)
275 bminma_lag(6) = min(bminma_lag(6),zminl)
276#include "lockoff.inc"
277 result = 0
278C BARRIER II_STOK et RESULT
279 CALL my_barrier !les bornes BMINMA doivent etre dans SPMD_TRI22VOX0 CELLE DU DOMAIN ET NON CELLE DU THREAD
280 !attendre les contributions de chaque thread
281
282C a conserver pour cas inacti est modifie sur p0
283 inacti=ipari(22,nin)
284 IF(itask==0)THEN
285 IF(abs(bminma_lag(6)-bminma_lag(3))>2*ep30.OR.
286 + abs(bminma_lag(5)-bminma_lag(2))>2*ep30.OR.
287 + abs(bminma_lag(4)-bminma_lag(1))>2*ep30)THEN
288 CALL ancmsg(msgid=87,anmode=aninfo,
289 . i1=noint,c1='(I22BUCE)')
290 CALL arret(2)
291 END IF
292
293 !extension du domaine lagrangien avec TZINF (verifier calcul de TZINF)
294 if(itask==0.and.ibug22_tri==1)print *,
295 . "applying TZINF extension to lag domain", tzinf
296
297 bminma_lag(1)=bminma_lag(1)+tzinf
298 bminma_lag(2)=bminma_lag(2)+tzinf
299 bminma_lag(3)=bminma_lag(3)+tzinf
300 bminma_lag(4)=bminma_lag(4)-tzinf
301 bminma_lag(5)=bminma_lag(5)-tzinf
302 bminma_lag(6)=bminma_lag(6)-tzinf
303
304 IF(nspmd > lrvoxelp)THEN
305 CALL ancmsg(msgid=36,anmode=aninfo,
306 . c1='(I22MAINTRI)')
307 CALL arret(2)
308 END IF
309 END IF
310
311
312C -------------------------------------------------------------
313C COMMUNICATION BORNES DES DOMAINES LAGRANGIENS
314C BMINMA_LAG_G(1:6) is global model data
315C -------------------------------------------------------------
316 IF(nspmd > 1) THEN
317 IF(itask==0)THEN
318 ALLOCATE(bminma_lag_spmd(6,nspmd))
319 IF(imonm > 0) CALL startime(timers,25)
321 . bminma_lag_spmd, bminma_lag, isendto ,ircvfrom , nin)
322 IF(imonm > 0) CALL stoptime(timers,25)
323
324 if(itask==0.and.ibug22_tri==1)print *, "BMINMA=",
325 . bminma_lag(4:6),bminma_lag(1:3)
326 j=1
327 !listing all remote proc in REM_P(1:NSPMD-1)
328C -------------------------------------------------------------
329C CALCUL DES DIMENSIONS DES DOMAINES :
330C + LAGRANGIENS REMOTES : BMINMA_LAG_R
331C + LAGRANGIEN GLOBAL : BMINMA_LAG_G
332C -------------------------------------------------------------
333 DO p=1,nspmd
334 IF(p==loc_proc)cycle
335 rem_p(j)=p
336 j=j+1
337 END DO
338 p=loc_proc
339 j=nspmd-1
340 !lagrangian bounds for all remote faces
341 bminma_lag_r(4) = minval(bminma_lag_spmd(4,rem_p(1:j)))
342 bminma_lag_r(5) = minval(bminma_lag_spmd(5,rem_p(1:j)))
343 bminma_lag_r(6) = minval(bminma_lag_spmd(6,rem_p(1:j)))
344 bminma_lag_r(1) = maxval(bminma_lag_spmd(1,rem_p(1:j)))
345 bminma_lag_r(2) = maxval(bminma_lag_spmd(2,rem_p(1:j)))
346 bminma_lag_r(3) = maxval(bminma_lag_spmd(3,rem_p(1:j)))
347 !lagrangian bounds for all faces in model
348 bminma_lag_g(4) = min(bminma_lag_r(4),bminma_lag_spmd(4,p))
349 bminma_lag_g(5) = min(bminma_lag_r(5),bminma_lag_spmd(5,p))
350 bminma_lag_g(6) = min(bminma_lag_r(6),bminma_lag_spmd(6,p))
351 bminma_lag_g(1) = max(bminma_lag_r(1),bminma_lag_spmd(1,p))
352 bminma_lag_g(2) = max(bminma_lag_r(2),bminma_lag_spmd(2,p))
353 bminma_lag_g(3) = max(bminma_lag_r(3),bminma_lag_spmd(3,p))
354 !---------------debug--------------!
355 if(itask==0.and.ibug22_tri==1)then
356 print *, ""
357 print *, "TZINF=", tzinf
358 print *, ""
359 print *, "---------------------------------------------------"
360 print *, "CURRENT DOMAIN =", loc_proc
361 print *, "--------BOUNDS FOR CURRENT LAG DOMAIN--------------"
362 print *, " BMINMAL=", bminma_lag(4:6),bminma_lag(1:3)
363 print *, "--------BOUNDS FOR ALL LAG DOMAINS-----------------"
364 DO i=1, nspmd
365 print *, "DOMAIN =", ispmd+1
366 print *, " BMINMAL=",
367 . bminma_lag_spmd(4:6,i),bminma_lag_spmd(1:3,i)
368 END DO
369 print *, "--------bounds for al remote lag domains-----------"
370 print *, " bminmal=", BMINMA_LAG_R(4:6),BMINMA_LAG_R(1:3)
371 print *, "--------bounds for lag global domains--------------"
372 print *, " bminmal=", BMINMA_LAG_G(4:6),BMINMA_LAG_G(1:3)
373 print *, "---------------------------------------------------"
374 !print *, ""
375 end if
376 !---------------debug--------------!
377 END IF
378 ELSE
379 IF(ITASK==0) BMINMA_LAG_G = BMINMA_LAG
380 END IF
381
382C -------------------------------------------------------------
383C CALCUL DES DIMENSIONS DU DOMAINE FLUIDE LOCAL (multi-threading)
384C -------------------------------------------------------------
385 !Initialisation des bornes du domaine Fluide
386 BMINMA_FLU(1) = -EP30
387 BMINMA_FLU(2) = -EP30
388 BMINMA_FLU(3) = -EP30
389 BMINMA_FLU(4) = EP30
390 BMINMA_FLU(5) = EP30
391 BMINMA_FLU(6) = EP30
392
393
394 !IBUFSSG(IAD)[1:NBRIC_L] is multi-threaded
395 !computing MIN/MAX for 3D fluid elems
396 CALL I22SOLID_GETMINMAX (
397 1 X, IXS, IGRBRIC(ISU1)%ENTITY, NBRIC_L,
398 2 ITAB, ITASK, NIN )
399
400 CALL MY_BARRIER
401
402 !Calcul des bornes du domaine Fluide
403#include "lockon.inc"
404 BMINMA_FLU(1) = MAX(BMINMA_FLU(1),MAXVAL(XMAXS))
405 BMINMA_FLU(2) = MAX(BMINMA_FLU(2),MAXVAL(YMAXS))
406 BMINMA_FLU(3) = MAX(BMINMA_FLU(3),MAXVAL(ZMAXS))
407 BMINMA_FLU(4) = MIN(BMINMA_FLU(4),MINVAL(XMINS))
408 BMINMA_FLU(5) = MIN(BMINMA_FLU(5),MINVAL(YMINS))
409 BMINMA_FLU(6) = MIN(BMINMA_FLU(6),MINVAL(ZMINS))
410#include "lockoff.inc"
411
412 CALL MY_BARRIER ! waiting for fluid local domain bounds definition (multi-threading)
413
414 IF(ITASK==0) THEN
415 BMINMA_FLU(1) = BMINMA_FLU(1)+TZINF
416 BMINMA_FLU(2) = BMINMA_FLU(2)+TZINF
417 BMINMA_FLU(3) = BMINMA_FLU(3)+TZINF
418 BMINMA_FLU(4) = BMINMA_FLU(4)-TZINF
419 BMINMA_FLU(5) = BMINMA_FLU(5)-TZINF
420 BMINMA_FLU(6) = BMINMA_FLU(6)-TZINF
421 !---------------debug--------------!
422.and. if(itask==0ibug22_tri==1)then
423 print *, "--------local fluid domain-------------"
424 print *, " bminmal_flu=", BMINMA_FLU(4:6),BMINMA_FLU(1:3)
425 print *, "---------------------------------------------------"
426 print *, ""
427 end if
428 !---------------debug--------------!
429 END IF
430
431C -------------------------------------------------------------
432C CALCUL DES MIN/MAX DES FACETTES DE CHAQUE THREAD DU DOMAINE
433C -------------------------------------------------------------
434
435 !computing MIN/MAX for 2D elems
436 CALL I22SHELL_GETMINMAX(
437 1 X, INTBUF_TAB%IRECTM(1+4*ESHIFT), NRTM_T, INTBUF_TAB%STFM(1+ESHIFT), ITASK,
438 2 ITAB, ESHIFT, BMINMA_FLU, TZINF )
439
440 CALL MY_BARRIER !XMINE,XMAXE,... must be defined by all threads before going on.
441
442
443C -------------------------------------------------------------
444C RECHERCHE DANS LES AUTRES DOMAINES DES FACETTES A PROXIMITE
445C DU DOMAINE FLUIDE LOCAL (REMOTE). ALLOCATION DE XREM
446C -------------------------------------------------------------
447
448 IF(NSPMD > 1) THEN
449
450 IF(ITASK==0) CRVOXEL(0:LRVOXEL,0:LRVOXEL,LOC_PROC)=0
451 CALL MY_BARRIER ! waiting for crvoxel init.
452.AND. IF (IMONM > 0 ITASK == 0) CALL STARTIME(TIMERS,26)
453
454 CALL SPMD_TRI22VOX0(
455 1 X, BMINMA_FLU , NBRIC_L, IXS, IGRBRIC(ISU1)%ENTITY,
456 2 ITASK, ITAB , XMINS , YMINS, ZMINS ,
457 3 XMAXS, YMAXS , ZMAXS ,BMINMA_LAG_R, IS_CONTACT,
458 4 BMINMA_AND_R )
459
460 CALL MY_BARRIER ! all thread has to mark local domain Voxel before reading it above.
461
462.AND. IF (IMONM > 0 ITASK == 0) CALL STOPTIME(TIMERS,26)
463 IF(ITASK==0)THEN
464 IF (IMONM > 0 ) CALL STARTIME(TIMERS,25)
465 !CONTACT=TRUE si intersection non nulle entre domaine FLUIDE LOCAL / LAG DISTANTS
466 IF(IS_CONTACT) CALL SPMD_TRI22VOX(
467 1 INTBUF_TAB%IRECTM ,NSHEL_L ,X ,V ,BMINMA_AND_R, !envoyer les shell du domaine.
468 2 INTBUF_TAB%STFM ,NIN ,ISENDTO ,IRCVFROM ,IAD_ELEM ,
469 3 FR_ELEM ,NSNR ,ITAB ,ITASK )
470
471 IF (IMONM > 0) CALL STOPTIME(TIMERS,25)
472
473 NIRECT_L = NSHEL_L + NSNR !on avait un majorant de NSHEL_L+NSHELR_L, on connait mainteannt la taille exacte car NSHELR_L=NSNR (nb candidat remote)
474
475 ELSE
476 !verifier si contact avec intersection des domaines
477
478 END IF
479
480 CALL MY_BARRIER ! attendre l'allocation et le remplissage de XREM pour remplir IRECT_L
481 NSHELR_L = NSNR
482 !NSHELR_T = NSNR
483
484 END IF
485
486
487C -------------------------------------------------------------
488C DEFINITION DU TABLEAU GLOBAL DE COQUES (LOCAL + REMOTES)
489C -------------------------------------------------------------
490C IRECT_L( 1: 4, :) : Four Node ITAB( ID) : numero glolocal pour unicit avec XREM
491C IRECT_L( 5: 8, :) : X-coordinates
492C IRECT_L( 9:12, :) : Y-coordinates
493C IRECT_L(13:16, :) : Z-coordinates
494C IRECT_L(17:19, :) : Minimum X,Y,Z
495C IRECT_L(20:22, :) : Maximum X,Y,Z
496C IRECT_L(23 , :) : Stiffness
497C IRECT_L(24:26, :) : Lagrangian Velocity (mean)
498C IRECT_L( :,1+4*ESHIFT:4*ESHIFT+NRTM_T) : element data on current Thread
499C IRECT_L( :,NRTM+1:NRTM + NSNR) : remotes elements data
500
501! Filling with local data
502 DO I=0,NSHEL_T-1
503 IP1=I+1
504 J = ESHIFT + IP1 !numero global (local+remote)
505 STFE = INTBUF_TAB%STFM(1+ESHIFT+I) ! rigidite dans le groupe de shell du thread
506 IRECT_L(23 , J) = STFE ! Stiffness
507 !IF(STFE==ZERO) CYCLE
508 I1 = 1+4*ESHIFT+4*I
509 I2 = I1+3
510 IRECT_L(1:4 , J) = ITAB(INTBUF_TAB%IRECTM(I1:I2)) ! User Nodes
511 IRECT_L(5:8 , J) = X(1,INTBUF_TAB%IRECTM(I1:I2)) ! X-coordinates
512 IRECT_L(9:12 , J) = X(2,INTBUF_TAB%IRECTM(I1:I2)) ! Y-coordinates
513 IRECT_L(13:16, J) = X(3,INTBUF_TAB%IRECTM(I1:I2)) ! Z-coordinates
514 IRECT_L(17:19, J) = (/XMINE(J),YMINE(J),ZMINE(J)/) ! Minimum X,Y,Z
515 IRECT_L(20:22, J) = (/XMAXE(J),YMAXE(J),ZMAXE(J)/) ! Maximum X,Y,Z
516 IRECT_L(24, J) = SUM(V(1,INTBUF_TAB%IRECTM(I1:I2)))/FOUR ! X-Velocity (mean)
517 IRECT_L(25, J) = SUM(V(2,INTBUF_TAB%IRECTM(I1:I2)))/FOUR ! Y-Velocity (mean)
518 IRECT_L(26, J) = SUM(V(3,INTBUF_TAB%IRECTM(I1:I2)))/FOUR ! Z-Velocity (mean)
519
520 !cinematic time step
521 vel(1) = dot_product(V(1:3,INTBUF_TAB%IRECTM(I1+0)),V(1:3,INTBUF_TAB%IRECTM(I1+0)))
522 vel(2) = dot_product(V(1:3,INTBUF_TAB%IRECTM(I1+1)),V(1:3,INTBUF_TAB%IRECTM(I1+1)))
523 vel(3) = dot_product(V(1:3,INTBUF_TAB%IRECTM(I1+2)),V(1:3,INTBUF_TAB%IRECTM(I1+2)))
524 vel(4) = dot_product(V(1:3,INTBUF_TAB%IRECTM(I1+3)),V(1:3,INTBUF_TAB%IRECTM(I1+3)))
525 vel(1) = SQRT(vel(1))
526 vel(2) = SQRT(vel(2))
527 vel(3) = SQRT(vel(3))
528 vel(4) = SQRT(vel(4))
529 v22max_l(ITASK) = MAX(v22max_l(ITASK), MAXVAL(vel) )
530
531 END DO
532
533! Filling with remote faces data
534 NF = 1+ITASK*NSHELR_L/NTHREAD
535 NL = (ITASK+1)*NSHELR_L/NTHREAD
536 DO I=NF,NL !1,NSNR
537 J = NSHEL_L+I
538 IRECT_L(1:4 , J) = XREM( 1:4,I) ! User Nodes
539 IRECT_L(5:8 , J) = XREM( 5:8,I) ! X-coordinates
540 IRECT_L(9:12 , J) = XREM( 9:12,I) ! Y-coordinates
541 IRECT_L(13:16 , J) = XREM(13:16,I) ! Z-coordinates
542 IRECT_L(17:19 , J) = XREM(17:19,I) ! Minimum X,Y,Z
543 IRECT_L(20:22 , J) = XREM(20:22,I) ! Maximum X,Y,Z
544 IRECT_L(23 , J) = XREM( 23,I) ! Stiffness (forcemment non nul)
545 IRECT_L(24:26 , J) = XREM(24:26,I) ! XYZ-Velocity (mean)
546
547 !missing SPMD cinematic time step
548 END DO
549!
550
551C--------------------------------------------------------------
552C CINEMATIC TIME STEP (MAXIMUM SPEED)
553C--------------------------------------------------------------
554 CALL MY_BARRIER
555#include "lockon.inc"
556 v22_max = MAX(v22_max,v22max_l(ITASK))
557#include "lockoff.inc"
558
559C -------------------------------------------------------------
560
561C -------------------------------------------------------------
562
563 CAND_N_OLD = INTBUF_TAB%I_STOK(1)
564 40 CONTINUE !verifier
565
566 ILD = 0
567 NB_N_B = 1
568
569C -------------------------------------------------------------
570C CALCUL DES DIMENSIONS DOMAINE D'INTERET
571C INTERSECTION DE : {FLUIDE LOCAL} & {LAGRANGIEN GLOBAL}
572C -------------------------------------------------------------
573
574 BMINMA_AND(1) = MIN(BMINMA_FLU(1),BMINMA_LAG_G(1))
575 BMINMA_AND(2) = MIN(BMINMA_FLU(2),BMINMA_LAG_G(2))
576 BMINMA_AND(3) = MIN(BMINMA_FLU(3),BMINMA_LAG_G(3))
577 BMINMA_AND(4) = MAX(BMINMA_FLU(4),BMINMA_LAG_G(4))
578 BMINMA_AND(5) = MAX(BMINMA_FLU(5),BMINMA_LAG_G(5))
579 BMINMA_AND(6) = MAX(BMINMA_FLU(6),BMINMA_LAG_G(6))
580
581.and. if(itask==0ibug22_tri==1)print *,
582 . "faire test si dimension negative ",
583 . "=>candidat=0 ! ici ou dans i22trivox"
584
585
586 50 CALL my_barrier
587
588 IF (bminma_and(1)-bminma_and(4)<0)GOTO 999
589 IF (bminma_and(2)-bminma_and(5)<0)GOTO 999
590 IF (bminma_and(3)-bminma_and(6)<0)GOTO 999
591
592 iskip22 = 0
593
594C -------------------------------------------------------------
595C RECHERCHE DES COUPLES CANDIDATS POUR L'INTERACTION
596C -------------------------------------------------------------
597
598 IF (imonm > 0) CALL startime(timers,30)
599 CALL i22buce(
600 1 x ,intbuf_tab%IRECTM(1+4*eshift) ,intbuf_tab%NSV ,inacti ,iskip22 ,
601 2 nmn ,nshel_t ,nsn ,intbuf_tab%CAND_E ,intbuf_tab%CAND_N ,
602 3 gap ,noint ,intbuf_tab%I_STOK(1) ,ncontact ,bminma_and ,
603 4 tzinf ,maxbox ,minbox ,mwag ,curv_max ,
604 6 nb_n_b ,eshift ,ild ,ifq ,ibid ,
605 8 intbuf_tab%STFNS ,nin ,intbuf_tab%STFM(1+eshift) ,ipari(21,nin) ,
606 a nshelr_l ,ncont ,renum ,nsnrold ,
607 b gapmin ,gapmax ,curv_max_max ,num_imp ,
608 c intth ,itask ,intbuf_tab%VARIABLES(7) ,i_mem ,
609 d ixs ,igrbric(isu1)%ENTITY ,nbric_l ,itab ,nshel_l ,
610 e ale_connectivity ,ipari(1,nin) )
611C
612C Upgrade MultiMP
613 IF (i_mem == 2)THEN
614#include "lockon.inc"
615 i_memg = i_mem
616#include "lockoff.inc"
617 ENDIF
618C New barrier needed for Dynamic MultiMP
619 CALL my_barrier
620
621 IF(i_memg /=0)THEN
622!$OMP SINGLE
623 multimp = ipari(23,nin) + 4
624 CALL upgrade_multimp(nin,multimp,intbuf_tab)
625!$OMP END SINGLE
626 i_mem = 0
627 i_memg = 0
628 intbuf_tab%i_STOK(1) = cand_n_old
629 multimp = ipari(23,nin)
630 ncontact = multimp*ncont
631C eshift : decalage sur cand_e
632 GOTO 40
633 ENDIF
634
635 IF (imonm > 0) CALL stoptime(timers,30)
636C
637 count_cand = intbuf_tab%I_STOK(1)
638 ct = intbuf_tab%I_STOK(1)
639#include "lockon.inc"
640 intbuf_tab%VARIABLES(9) = min(maxbox,intbuf_tab%VARIABLES(9))
641 intbuf_tab%VARIABLES(12) = min(minbox,intbuf_tab%VARIABLES(12))
642 intbuf_tab%VARIABLES(8) = min(tzinf,intbuf_tab%VARIABLES(8))
643 intbuf_tab%VARIABLES(5) = intbuf_tab%VARIABLES(8)-gap
644 result = result + ild
645 lskyi_count = lskyi_count+count_cand*5
646 count_remslv(nin) = count_remslv(nin)+ct
647#include "lockoff.inc"
648
649
650
651C--------------------------------------------------------------
652C--------------------------------------------------------------
653 CALL my_barrier
654 IF (result/=0) THEN
655 CALL my_barrier
656 IF (itask==0) THEN
657C utile si on revient
658 intbuf_tab%I_STOK(1) = i_sk_old
659 result = 0
660 ENDIF
661 CALL my_barrier
662 ild = 0
663 maxbox = intbuf_tab%VARIABLES(9)
664 minbox = intbuf_tab%VARIABLES(12)
665 tzinf = intbuf_tab%VARIABLES(8)
666 GOTO 50
667 ENDIF
668C mise a - de dist temporairement pour reperage dans partie frontiere
669 IF(nspmd>1)THEN
670C mono tache
671!$OMP SINGLE
672 IF (imonm > 0) CALL startime(timers,26)
673 intbuf_tab%VARIABLES(5) = -intbuf_tab%VARIABLES(5)
674C
675 intfric = 0
676 CALL spmd_tri7gat(
677 1 result ,nsn ,intbuf_tab%CAND_N,intbuf_tab%I_STOK(1),nin,
678 2 ipari(21,nin),nsnr,multimp ,nty,ipari(47,nin),
679 3 idum1 ,nsnfiold, ipari, h3d_data,intfric,
680 4 multi_fvm,nodadt_therm)
681 ipari(24,nin) = nsnr
682C
683 IF (num_imp>0)
684 . CALL imp_rnumcd(intbuf_tab%CAND_N,nin,nsn,num_imp,ind_imp )
685C
686 IF (imonm > 0) CALL stoptime(timers,26)
687!$OMP END SINGLE
688 END IF
689
690C--------------------------------------------------------------
691C DEALLOCATE
692C--------------------------------------------------------------
693
694 999 CONTINUE !JUMP IF DOMAINE INTERSECTION VIDE (PAS DE CANDIDATS)
695
696
697 IF(itask==0)THEN
698 !DEALLOCATE(IRECT_L)
699 DEALLOCATE(xmins)
700 DEALLOCATE(ymins)
701 DEALLOCATE(zmins)
702 DEALLOCATE(xmaxs)
703 DEALLOCATE(ymaxs)
704 DEALLOCATE(zmaxs)
705 DEALLOCATE(nsnr_g)
706 DEALLOCATE(xmine)
707 DEALLOCATE(ymine)
708 DEALLOCATE(zmine)
709 DEALLOCATE(xmaxe)
710 DEALLOCATE(ymaxe)
711 DEALLOCATE(zmaxe)
712 IF(ALLOCATED(bminma_lag_spmd))DEALLOCATE(bminma_lag_spmd)
713 END IF
714
715 RETURN
#define my_real
Definition cppsort.cpp:32
subroutine i22buce(x, irect, nsv, inacti, iskip, nmn, nshel_t, nsn, cand_e, cand_b, gap, noint, ii_stok, ncontact, bminma, tzinf, maxbox, minbox, mwag, curv_max, nb_n_b, eshift, ild, ifq, ifpen, stfn, nin, stf, igap, nshelr_l, ncont, renum, nsnrold, gapmin, gapmax, curv_max_max, num_imp, intth, itask, bgapsmx, i_mem, ixs, bufbric, nbric, itab, nshel_l, ale_connectivity, ipari)
Definition i22buce.F:55
subroutine i22xsave(x, nsv, msr, nsn, nmn, itask, xsav, xmin, ymin, zmin, xmax, ymax, zmax, c_max, curv_max, icurv, irect, nrtm_t)
Definition i22xsave.F:33
subroutine imp_rnumcd(cand_n, nin, nsn, num_imp, index)
Definition imp_int_k.F:1542
#define min(a, b)
Definition macros.h:20
#define max(a, b)
Definition macros.h:21
for(i8=*sizetab-1;i8 >=0;i8--)
integer, dimension(:), allocatable nsnr_g
integer lrvoxelp
Definition tri7box.F:522
subroutine spmd_tri7gat(result, nsn, cand_n, i_stok, nin, igap, nsnr, multimp, ity, intth, ilev, nsnfiold, ipari, h3d_data, intfric, multi_fvm, nodadt_therm)
Definition spmd_int.F:3002
subroutine spmd_lagbounds_exch_i22(bminmal_spmd, bminmal, isendto, ircvfrom, nin)
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)
Definition message.F:889
subroutine arret(nn)
Definition arret.F:87
subroutine my_barrier
Definition machine.F:31
subroutine startime(event, itask)
Definition timer.F:93
subroutine stoptime(event, itask)
Definition timer.F:135
subroutine upgrade_multimp(ni, multimp_parameter, intbuf_tab)

◆ i22shell_getminmax()

subroutine i22shell_getminmax ( x,
integer, dimension(4,nrtm) irect,
integer nrtm,
stfe,
integer itask,
integer, dimension(*) itab,
integer eshift,
bminma,
marge )

Definition at line 818 of file i22main_tri.F.

821C============================================================================
822C M o d u l e s
823C-----------------------------------------------
824 USE tri7box
825 USE i22tri_mod
826C-----------------------------------------------
827C I m p l i c i t T y p e s
828C-----------------------------------------------
829#include "implicit_f.inc"
830C-----------------------------------------------
831C D u m m y A r g u m e n t s
832C-----------------------------------------------
833 INTEGER NRTM,IRECT(4,NRTM), ITASK, ESHIFT
834 my_real
835 . x(3,*), stfe(nrtm), bminma(6), marge
836C-----------------------------------------------
837C L o c a l V a r i a b l e s
838C-----------------------------------------------
839 INTEGER ::
840 . IE, NE, N(4), NRTMR
841
842 my_real ::
843 . xx(4), yy(4), zz(4),
844 . xmin,ymin,zmin,
845 . xmax,ymax,zmax
846 INTEGER TAB(4*NRTM), J, I, ITAB(*)
847 CHARACTER*8 KEY
848C-----------------------------------------------
849
850!---------------debug---------------
851! DO I=0,NRTM-1
852! J = 4*I
853! TAB(J+1:J+4)=ITAB(IRECT(1:4,I+1))
854! END DO
855! KEY="FACETTE0"
856! write(KEY(8:8),'(i1.1)')ISPMD
857! print *, " ...marking node from local shells "
858! print *, KEY//".txt"
859! CALL HM_MARKNOD ( ISPMD,ITASK, TAB, 4*NRTM, KEY//".txt")
860! print *, " ...write OK"
861!---------------debug---------------
862
863!---------------debug---------------
864! !print *, "NRTMR=", NRTMR
865! DO I=0,NRTMR-1
866! J = 4*I
867! TAB(J+1)=itab(xrem( 8,i+1))
868! TAB(J+2)=ITAB(XREM(15,I+1))
869! TAB(J+3)=ITAB(XREM(22,I+1))
870! TAB(J+4)=ITAB(XREM(29,I+1))
871! END DO
872! KEY="REMOTE_0"
873! write(KEY(8:8),'(i1.1)')ISPMD
874! print *, " ...marking node from remote shells "
875! print *, KEY//".txt"
876! CALL hm_marknod ( ispmd,itask, tab, 4*nrtmr, key//".txt")
877! print *, " ...write OK"
878!---------------debug---------------
879
880 ! On verifie au passage que les face locales sont a proximit (marge) du domaine local fluide (bminma)
881 xmin = bminma(4)-marge
882 ymin = bminma(5)-marge
883 zmin = bminma(6)-marge
884 xmax = bminma(1)+marge
885 ymax = bminma(2)+marge
886 zmax = bminma(3)+marge
887
888 DO ie=1,nrtm
889 IF(stfe(ie)==zero)cycle
890 j = ie+eshift
891 n(1:4) = irect(1:4,ie)
892 !-------------------------------------------!
893 ! Eight X-coordinates of the eight nodes !
894 !-------------------------------------------!
895 xx(1:4) = x(1,n(1:4))
896 xmaxe(j) = maxval(xx)
897 xmine(j) = minval(xx)
898 !-------------------------------------------!
899 ! Eight Y-coordinates of the eight nodes !
900 !-------------------------------------------!
901 yy(1:4) = x(2,n(1:4))
902 ymaxe(j) = maxval(yy)
903 ymine(j) = minval(yy)
904 !-------------------------------------------!
905 ! Eight Z-coordinates of the eight nodes !
906 !-------------------------------------------!
907 zz(1:4) = x(3,n(1:4))
908 zmaxe(j) = maxval(zz)
909 zmine(j) = minval(zz)
910 ENDDO !IB=1,NRTM
911
912 RETURN
subroutine ymax(idn, fac, npc, pld, stiffmin, stiffmax, stiffini, stiffavg)
Definition law100_upd.F:272

◆ i22solid_getminmax()

subroutine i22solid_getminmax ( x,
integer, dimension(nixs,*) ixs,
integer, dimension(nbric) bufbric,
integer nbric,
integer, dimension(*) itab,
integer itask,
integer, intent(in) nin )

Definition at line 726 of file i22main_tri.F.

729C============================================================================
730C-----------------------------------------------
731C M o d u l e s
732C-----------------------------------------------
733 USE i22bufbric_mod
734 USE i22tri_mod
735C-----------------------------------------------
736C I m p l i c i t T y p e s
737C-----------------------------------------------
738#include "implicit_f.inc"
739C-----------------------------------------------
740C G l o b a l P a r a m e t e r s
741C-----------------------------------------------
742#include "task_c.inc"
743C-----------------------------------------------
744C C o m m o n B l o c k s
745C-----------------------------------------------
746C
747C-----------------------------------------------
748C D u m m y A r g u m e n t s
749C-----------------------------------------------
750 INTEGER ::
751 . IXS(NIXS,*), NBRIC,ITASK,
752 . BUFBRIC(NBRIC),ITAB(*)
753 INTEGER,INTENT(IN) :: NIN
754
755 my_real ::
756 . x(3,*)
757C-----------------------------------------------
758C L o c a l V a r i a b l e s
759C-----------------------------------------------
760 INTEGER IB, NE, TAB(8*NBRIC)
761 my_real
762 . xx(8), yy(8), zz(8), diag(4)
763 CHARACTER*8 KEY
764 INTEGER I,J, NBF, NBL
765C-----------------------------------------------
766
767!---------------debug---------------
768! DO I=0,NBRIC-1
769! J = 8*I
770! TAB(J+1:J+8)=ITAB(IXS(2:9,I+1))
771! END DO
772! KEY="BRIQUE_0"
773! write(KEY(8:8),'(i1.1)')ISPMD
774! print *, " ...marking node from local bricks "
775! print *, KEY//".txt"
776! CALL HM_MARKNOD ( ISPMD,ITASK, TAB, 8*NBRIC, KEY//".txt")
777! print *, " ...write OK"
778!---------------debug---------------
779
780 nbf = 1+itask*nbric/nthread
781 nbl = (itask+1)*nbric/nthread
782
783 DO ib=nbf,nbl !1,NBRIC
784 ne = bufbric(ib)
785 !-------------------------------------------!
786 ! Eight X-coordinates of the eight nodes !
787 !-------------------------------------------!
788 xx(1:8) = x(1,ixs(2:9,ne))
789 xmaxs(ib)= maxval(xx)
790 xmins(ib)= minval(xx)
791 !-------------------------------------------!
792 ! Eight Y-coordinates of the eight nodes !
793 !-------------------------------------------!
794 yy(1:8) = x(2,ixs(2:9,ne))
795 ymaxs(ib) = maxval(yy)
796 ymins(ib) = minval(yy)
797 !-------------------------------------------!
798 ! Eight Z-coordinates of the eight nodes !
799 !-------------------------------------------!
800 zz(1:8) = x(3,ixs(2:9,ne))
801 zmaxs(ib) = maxval(zz)
802 zmins(ib) = minval(zz)
803 !
804 ENDDO !IB=1,NBRIC
805
806 RETURN