43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 USE elbufdef_mod
70 USE multi_fvm_mod
72 USE ebcs_mod
74 USE matparam_def_mod
75
76
77
78#include "implicit_f.inc"
79
80
81
82#include "mvsiz_p.inc"
83
84
85
86#include "vect01_c.inc"
87#include "param_c.inc"
88#include "com01_c.inc"
89#include "com04_c.inc"
90#include "scr17_c.inc"
91#include "tabsiz_c.inc"
92
93
94
95 INTEGER, INTENT(IN),TARGET :: IPART(LIPART1,*)
96 INTEGER, INTENT(IN) :: IPARTS(NUMELS), IPARTQ(NUMELQ), IPARTTG(NUMELTG)
97 INTEGER, INTENT(IN) :: IPM(NPROPMI, NUMMAT),ITAB(NUMNOD)
98 INTEGER, INTENT(IN) :: IPARG(NPARG,NGROUP),NV46
99 INTEGER, INTENT(IN), TARGET :: IXS(NIXS, NUMELS), IXQ(NIXQ, NUMELQ), IXTG(NIXTG, NUMELTG)
100 TYPE(ELBUF_STRUCT_),DIMENSION(NGROUP),TARGET :: ELBUF_TAB
101 my_real,
INTENT(IN) :: x(3,numnod), pm(npropm,nummat
102 TYPE(MULTI_FVM_STRUCT), INTENT(IN) :: MULTI_FVM
103 TYPE (SURF_), DIMENSION(NSURF),INTENT(IN) :: IGRSURF
104 TYPE(T_EBCS_TAB), INTENT(INOUT) :: EBCS_TAB
105
106 TYPE (GROUP_) , DIMENSION(NGRPART) :: IGRPART
107 TYPE(t_ale_connectivity), INTENT(INOUT) :: ALE_CONNECTIVITY
108 INTEGER,INTENT(IN)::NPF(SNPC)
110 TYPE(MATPARAM_STRUCT_) ,DIMENSION(NUMMAT), INTENT(IN) :: MAT_PARAM
111
112
113
114 my_real :: grav0,bx,by,bz,nx,ny,nz,dotprod,dotp,rho0
115 my_real :: z(3), depth(mvsiz), n(3,8),vec(3), delta_p(mvsiz),psurf,pgrav(mvsiz),vfrac,p
116 my_real :: lambda,diag1(3),diag2(3),tol,dist,b(3),volfrac
117 my_real,
ALLOCATABLE,
DIMENSION(:,:) :: min_coor, max_coor, n_surf, zf
118 INTEGER :: ,KK,IGRP,ISURF,IGRAV,NPART_IN_GROUP,MLW,NG,IAD0,II,NEL,J,IE,I,IERROR,IMAT,M(MVSIZ),Q,NSEG,ISEG
119 INTEGER :: USERID
120 INTEGER :: NOD(8), MATID, IADBUF,IFORM,NEL2,LIST(MVSIZ),NBMAT,,NIX,UID,SURF_TYPE,IELTYP
121 INTEGER, ALLOCATABLE, DIMENSION(:) :: IP
122 TYPE(G_BUFEL_) ,POINTER :: GBUF
123 TYPE(L_BUFEL_), POINTER :: LBUF
124 LOGICAL :: lCYCLE,lERROR,lTRIA,lFOUND_PROJ,lTEST,l_PLANAR_SURF,l_USER_SURF
125 INTEGER, DIMENSION(:, :), POINTER :: IX
126 character*64 :: ERRMSG
127
128
129
130
131 CALL inigrav_part_list( ipart ,igrpart, ebcs_tab ) !list related parts to apply gravity loading with /ebcs/nrf
132
133 DO k=1,ninigrav
138 bx = linigrav(01,k)
139 by = linigrav(02,k)
140 bz = linigrav(03,k)
141 nx = linigrav(04,k)
142 ny = linigrav(05,k)
143 nz = linigrav(06,k)
144 grav0 = linigrav(07,k)
145 ngx = linigrav(08,k)
146 ngy = linigrav(09,k)
147 ngz = linigrav(10,k)
148 psurf = linigrav(11,k)
149 IF (grav0==zero)cycle
150
151 IF(igrp/=0)THEN
152 npart_in_group = igrpart(igrp)%NENTITY
153 ALLOCATE(ip(npart_in_group),stat=ierror)
154 IF(ierror/=0)
CALL ancmsg(msgid = 268,
155 . anmode = aninfo,
156 . msgtype = msgerror,
157 . c1 = 'INIGRAV')
158 ip(1:npart_in_group) = ipart(4,igrpart(igrp)%ENTITY(1:npart_in_group))
159 ELSE
160
161 iad0 = 0
162 npart_in_group = 0
163 ENDIF
164 l_planar_surf = .false.
165 l_user_surf = .false.
166 surf_type=-1
167 IF(isurf>0)surf_type=igrsurf(isurf)%TYPE
168 IF(surf_type==200 .OR. surf_type == -1)THEN
169 l_planar_surf=.true.
170 ELSEIF(surf_type == 0) THEN
171 l_user_surf=.true.
172 nseg = igrsurf(isurf)%NSEG
173
174 ALLOCATE(max_coor(3,nseg),min_coor(3,nseg),n_surf(3,nseg),zf(3,nseg))
175 DO iseg=1,nseg
176 ltria=.false.
177 IF(igrsurf(isurf)%NODES(iseg,4)==0)ltria=.true.
178 IF(ltria)THEN
179 p(1:3,4)=p(1:3,3)
180 ENDIF
181
182 p(1,1:4)=x(1,igrsurf(isurf)%NODES(iseg,1:4))
183 p(2,1:4)=x(2,igrsurf(isurf)%NODES(iseg,1:4))
184 p(3,1:4)=x(3,igrsurf(isurf)%NODES(iseg,1:4))
185
186 min_coor(1,iseg)=
min(p(1,1),p(1,2),p(1,3),p(1,4))
187 min_coor(2,iseg)=
min(p(2,1),p(2,2),p(2,3),p(2,4))
188 min_coor(3,iseg)=
min(p(3,1),p(3,2),p(3,3),p(3,4))
189 max_coor(1,iseg)=
max(p(1,1),p(1,2),p(1,3),p(1,4))
190 max_coor(2,iseg)=
max(p(2,1),p(2,2),p(2,3),p(2,4))
191 max_coor(3,iseg)=
max(p(3,1),p(3,2),p(3,3),p(3,4))
192
193 diag1(1)=(p(1,3)-p(1,1))
194 diag1(2)=(p(2,3)-p(2,1))
195 diag1(3)=(p(3,3)-p(3,1))
196 diag2(1)=(p(1,4)-p(1,2))
197 diag2(2)=(p(
198 diag2(3)=(p(3,4)-p(3,2))
199 n_surf(1,iseg)= diag1(2)*diag2(3)-diag1(3)*diag2(2)
200 n_surf(2,iseg)=-diag1(1)*diag2(3)+diag1(3)*diag2(1)
201 n_surf(3,iseg)= diag1(1)*diag2(2)-diag1(2)*diag2(1)
202 norm = sqrt(n_surf(1,iseg)*n_surf(1,iseg)+n_surf(2,iseg)*n_surf(2,iseg)+n_surf(3,iseg)*n_surf(3,iseg))
203 n_surf(1,iseg)=n_surf(1,iseg)/
norm
204 n_surf(2,iseg)=n_surf(2,iseg)/
norm
205 n_surf(3,iseg)=n_surf(3,iseg)/
norm
206
207 IF(ltria)THEN
208 zf(1,iseg)=third*sum(p(1,1:3))
209 zf(2,iseg)=third*sum(p(2,1:3))
210 zf(3,iseg)=third*sum(p(3,1:3))
211 ELSE
212 zf(1,iseg)=fourth*sum(p(1,1:4))
213 zf(2,iseg)=fourth*sum(p(2,1:4))
214 zf(3,iseg)=fourth*sum(p(3,1:4))
215 ENDIF
216 ENDDO
217
218 iseg=1
219 tol=em02*
max(max_coor(1,iseg)-min_coor(1,iseg), max_coor(2,iseg)-min_coor(2,iseg), max_coor(3,iseg)-min_coor(3,iseg))
220 ENDIF
221
222
223 DO ng=1,ngroup
224 mlw = iparg(1,ng)
225 ity = iparg(5,ng)
226 nel = iparg(2,ng)
227 nft = iparg(3,ng)
228 iad = iparg(4,ng) - 1
229 gbuf => elbuf_tab(ng)%GBUF
230 pgrav(1:nel)=zero
231 IF(mlw==0)cycle
232 IF( (ity == 1. .AND.n2d==0) .OR. ((ity == 2. .OR. ity == 7).AND.n2d/=0) )THEN
233 IF(ity==1)THEN
234 imat = ixs(1,1+nft)
235 m(1:nel) = iparts(1+nft:nel+nft)
236 ELSEIF(ity==2)THEN
237 imat = ixq(1,1+nft)
238 m(1:nel) = ipartq(1+nft:nel+nft)
239 ELSEIF(ity==7)THEN
240 imat = ixtg(1,1+nft)
241 m(1:nel) = iparttg(1+nft:nel+nft)
242 ENDIF
243
244 list(1:mvsiz) = 0
245 nel2 = 0
246
247
248
249
250
251 IF(igrp/=0)THEN
252 lcycle = .true.
253 DO i=1,nel
254 DO q=1,npart_in_group
255 IF(ipart(4,m(i))==ip(q))THEN
256 nel2 = nel2+1
257 list(nel2) = i
258 lcycle = .false.
259 EXIT
260 ENDIF
261 ENDDO
262 enddo
263 IF(lcycle)cycle
264 ELSE
265 nel2=nel
266 DO i=1,nel
267 list(i) = i
268 ENDDO
269 ENDIF
270
271
272
273
274
275
276 DO kk=1,nel2
277 i = list(kk)
278 ie = i + nft
279 userid = 0
280 IF(n2d==0)THEN
281 n(1:3,1) = x(1:3,ixs(2,ie))
282 n(1:3,2)
283 n(1:3,3) = x(1:3,ixs(4,ie))
284 n(1:3,4) = x(1:3,ixs(5,ie))
285 n(1:3,5) = x(1:3,ixs(6,ie))
286 n(1:3,6) = x(1:3,ixs(7,ie))
287 n(1:3,7) = x(1:3,ixs(8,ie))
288 n(1:3,8) = x(1:3,ixs(9,ie))
289 z(1) = one_over_8*(sum(n(1,1:8)))
290 z(2) = one_over_8*(sum(n
291 z(3) = one_over_8*(sum(n(3,1:8)))
292 userid = ixs(nixs,ie)
293 ELSEIF(ity==2)THEN
294 n(1:3,1) = x(1:3,ixq(2,ie))
295 n(1:3,2) = x(1:3,ixq(3,ie))
296 n(1:3,3) = x(1:3,ixq(4,ie))
297 n(1:3,4) = x(1:3,ixq(5,ie))
298 z(1) = fourth*(sum(n(1,1:4)))
299 z(2) = fourth*(sum(n(2,1:4)))
300 z(3) = fourth*(sum(n(3,1:4)))
301 userid = ixq(nixq,ie)
302 ELSEIF(ity==7)THEN
303 n(1:3,1) = x(1:3,ixtg(2,ie))
304 n(1:3,2) = x(1:3,ixtg(3,ie))
305 n(1:3,3) = x(1:3,ixtg(4,ie))
306 n(1:3,4) = zero
307 z(1) = third*(sum(n(1,1:3)))
308 z(2) = third*(sum(n(2,1:3)))
309 z(3) = third*(sum(n(3,1:3)))
310 userid = ixtg(nixtg,ie)
311 ENDIF
312
313 IF(l_planar_surf)THEN
314
315
316
317
318
319
320 !intersection point such as
interp = z +
alpha . ng et
321 alpha = (bx-z(1))*nx+(by-z(2))*ny+(bz-z(3))*nz / (ngx*nx+ngy*ny+ngz*nz)
325
326
327
329 depth(kk) = -depth(kk)
330 lerror=.false.
331 lfound_proj=.true.
332 ELSEIF(l_user_surf) THEN
333 !===================================================================
334
335
336
337
338 lerror=.false.
339 lfound_proj=.false.
340 DO iseg=1,nseg
341
342 IF(ngx==zero)THEN
343 IF(z(1)+tol < min_coor(1,iseg) .OR. z(1)-tol > max_coor(1,iseg))cycle
344 ENDIF
345 IF(ngy==zero)THEN
346 IF(z(2)+tol < min_coor(2,iseg) .OR. z(2)-tol > max_coor(2,iseg))cycle
347 ENDIF
348 IF(ngz==zero)THEN
349 IF(z(3)+tol < min_coor(3,iseg) .OR. z(3)-tol > max_coor(3,iseg))cycle
350 ENDIF
351 dotp = n_surf(1,iseg)*ngx + n_surf(2,iseg)*ngy + n_surf(3,iseg)*ngz
352 IF(abs(dotp)<=em04)THEN
354 . anmode = aninfo,
355 . msgtype = msgerror,
356 . i1=uid,
357 . c1="INPUT SURFACE HAS INCOMPATIBLE SLOPE WITH GRAVITY DIRECTION"
358 . )
359 lerror=.true.
360 EXIT
361 ENDIF
362 p(1,1:4)=x(1,igrsurf(isurf)%NODES(iseg,1:4))
363 p(2,1:4)=x(2,igrsurf(isurf)%NODES(iseg,1:4))
364 p(3,1:4)=x(3,igrsurf(isurf)%NODES(iseg,1:4))
365
366
367
368
369 b(1:3)=zf(1:3,iseg)
370 dist=(b(1)-z(1))*(b(1)-z(1)) + (b(2)-z(2))*(b(2)-z(2)) + (b(3)-z(3))*(b(3)-z(3))
371 IF(dist<=tol*tol)THEN
372
373 b(1:3)=p(1:3,1)
374 ENDIF
375 lambda = (b(1)-z(1))*n_surf(1,iseg) + (b(2)-z(2))*n_surf(2,iseg) + (b(3)-z(3))*n_surf(3,iseg)
376 lambda = lambda / dotp
377 interp(1) = z(1)+lambda*ngx
378 interp(2) = z(2)+lambda*ngy
379 interp(3) = z(3)+lambda*ngz
380
382 IF(.NOT.ltest)cycle
384 depth(kk) = -depth(kk)
385 lfound_proj=.true.
386 ENDDO
387 IF(lerror)EXIT
388 IF(.NOT.lfound_proj)THEN
389 errmsg =
"UNABLE TO PROJECT ON SURFACE CENTROID FROM CELL ID= "
390 WRITE(
errmsg(52:62),fmt=
'(I10)')userid
392 . anmode = aninfo,
393 . msgtype = msgerror,
394 . i1=uid,
396 . )
397 EXIT
398 ENDIF
399 ENDIF
400 ENDDO
401 IF(lerror)EXIT
402 IF(.NOT.lfound_proj)EXIT
403
404
405
406 IF (n2d == 0) THEN
407 matid = ixs(1, 1 + nft)
408 ELSEIF(ity==2)THEN
409 matid = ixq(1, 1 + nft)
410 ELSEIF(ity==7)THEN
411 matid = ixtg(1, 1 + nft)
412 ENDIF
413 iadbuf =
max(1,ipm(7, matid))
414
415 SELECT CASE (mlw)
416
417
418
419 CASE (3, 4, 6, 10, 49)
420 rho0 = pm(1,matid)
421 CALL inigrav_eos(nel,nel2, ng, matid, ipm, grav0, rho0, depth, pm, bufmat(iadbuf),
422 . elbuf_tab, psurf, list , pgrav, 0 ,mlw, npf, tf ,nummat,mat_param)
423
424
425
426 CASE (37)
427 CALL inigrav_m37(nel,nel2, ng, matid, ipm, grav0, depth, pm, bufmat(iadbuf), elbuf_tab, psurf, list)
428
429
430
431 CASE (51)
432 IF (n2d == 0) THEN
433 ix => ixs(1:nixs, 1:numels)
434 nix = nixs
435 ELSEIF (ity == 2) then
436 ix => ixq(1:nixq, 1:numelq)
437 nix = nixq
438 ELSEIF (ity == 7) then
439 ix => ixtg(1:nixtg, 1:numeltg)
440 nix = nixtg
441 ENDIF
442 iform = bufmat(iadbuf + 31 - 1)
443 IF (iform /= 3) THEN
444 CALL inigrav_m51(nel , nel2, ng, matid, ipm, grav0, depth, pm, bufmat
445 . psurf, list, ale_connectivity, nv46, ix , nix , nft , bufmat, iparg)
446 ELSE
448 . anmode = aninfo,
449 . msgtype = msgwarning
450 . )
451 ENDIF
452
453
454
455 CASE(151)
456
457 IF (n2d == 0) THEN
458 ix => ixs(1:nixs, lft + nft:llt + nft)
459 ELSEIF (ity == 2) then! quads
460 ix => ixq(1:nixq, lft + nft:llt + nft)
461 ELSEIF (ity == 7) THEN
462 ix => ixtg(1:nixtg, lft + nft:llt + nft)
463 ENDIF
464 nbmat = mat_param(ix(1, 1))%MULTIMAT%NB
465
466 rho0=zero
467 DO imat=1,nbmat
468
469 volfrac= mat_param(ix(1, 1))%MULTIMAT%VFRAC(imat)
470 matlaw = ipm(2, matid)
471 rho0 = rho0+pm(1,matid)*volfrac
472 ENDDO
473
474 DO imat=1,nbmat
475 matid = mat_param(ix(1, 1))%MULTIMAT%MID(imat)
476 matlaw = ipm(2, matid)
477 CALL inigrav_eos(nel, nel2 , ng , matid, ipm, grav0, rho0, depth, pm, bufmat(iadbuf), elbuf_tab,
478 . psurf, list , pgrav, imat , mlw, npf,tf,nummat,mat_param)
479 ENDDO
480
481 DO kk=1,nel2
482 i = list(kk)
483 IF(nbmat==1)THEN
484
485
486
487
488 gbuf%SIG(i
489 gbuf%SIG(i + 1 * nel) = -pgrav(kk)
490 gbuf%SIG(i + 2 * nel) = -pgrav(kk)
491 ELSE
492 gbuf%RHO(i) = zero
493 gbuf%EINT(i) = zero
494 DO imat=1,nbmat
495 lbuf => elbuf_tab(ng)%BUFLY(imat)%LBUF(1, 1, 1)
496 vfrac = lbuf%VOL(i) / gbuf%VOL(i)
497 gbuf%EINT(i) = gbuf%EINT(i) + vfrac*lbuf%EINT(i)
498 gbuf%RHO(i) = gbuf%RHO(i) + vfrac*lbuf%RHO(i)
499 ENDDO
500 gbuf%SIG(i + 0 * nel) = -pgrav(kk)
501 gbuf%SIG(i + 1 * nel) = -pgrav(kk)
502 gbuf%SIG(i
503 ENDIF
504 ENDDO
505
506
507
508 CASE DEFAULT
509 IF (n2d == 0) THEN
510 ix => ixs(1:nixs, 1:numels)
511 nix = nixs
512 ELSEIF (ity == 2) then
513 ix => ixq(1:nixq, 1:numelq)
514 nix = nixq
515 ELSEIF (ity == 7) then
516 ix => ixtg(1:nixtg, 1:numeltg)
517 nix = nixtg
518 ENDIF
520 . anmode = aninfo,
521 . msgtype = msgwarning,
522 . i1 = uid,
523 . i2 = ipart(4,m(i)),
524 . i3 = mlw)
525 EXIT
526 END SELECT
527
528 ENDIF
529 ENDDO
530
531 IF(ALLOCATED(max_coor))DEALLOCATE(max_coor)
532 IF(ALLOCATED(min_coor))DEALLOCATE(min_coor)
533 IF(ALLOCATED(n_surf))DEALLOCATE(n_surf)
534 IF(ALLOCATED(zf))DEALLOCATE(zf)
535 IF(igrp/=0)THEN
536 IF(ALLOCATED(ip))DEALLOCATE(ip)
537 ENDIF
538
539 ENDDO
540
541 RETURN
norm(diag(diag(diag(inv(mat))) -id.SOL), 2) % destroy mumps instance id.JOB
subroutine inigrav_eos(nelg, nel, ng, matid, ipm, grav0, rho0, depth, pm, bufmat, elbuf_tab, psurf, list, pres, imat, mlw, npf, tf, nummat, mat_param)
subroutine check_is_on_segment(p, z, h, ltria, ltest)
subroutine inigrav_m37(nelg, nel, ng, matid, ipm, grav0, depth, pm, bufmat, elbuf_tab, psurf, list)
subroutine inigrav_m51(nelg, nel, ng, matid, ipm, grav0, depth, pm, bufmat, elbuf_tab, psurf, list, ale_connectivity, nv46, ix, nix, nft, bufmatg, iparg)
subroutine inigrav_part_list(ipart, igrpart, ebcs_tab)
subroutine interp(tf, tt, npoint, f, tg)
integer, dimension(:,:), allocatable inigrv
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)