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