38 SUBROUTINE inigrav_load(ELBUF_TAB ,IPART ,IGRPART ,IPARG ,IPARTTG ,
39 1 IPARTS ,IPARTQ ,X ,IXS ,IXQ ,
40 2 IXTG ,PM ,IPM ,BUFMAT ,MULTI_FVM,
41 3 ALE_CONNECTIVITY ,NV46 ,IGRSURF ,ITAB ,EBCS_TAB,
75 use element_mod ,
only : nixs,nixc,nixq,nixtg
79#include "implicit_f.inc"
87#include "vect01_c.inc"
92#include "tabsiz_c.inc"
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
107 TYPE (GROUP_) ,
DIMENSION(NGRPART) :: IGRPART
109 INTEGER,
INTENT(IN)::NPF(SNPC)
110 my_real,
INTENT(IN)::TF(STF)
111 TYPE(matparam_struct_) ,
DIMENSION(NUMMAT),
INTENT(IN) :: MAT_PARAM
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(mvsiz),vfrac,p(3,1:4)
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
121 INTEGER :: NOD(8), MATID, IADBUF,IFORM,NEL2,LIST(MVSIZ),NBMAT,MATLAW,NIX,UID,SURF_TYPE,IELTYP
122 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: IP
123 TYPE(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
145 grav0 = linigrav(07,k)
149 psurf = linigrav(11,k)
150 IF (grav0==zero)cycle
153 npart_in_group = igrpart(igrp)%NENTITY
154 ALLOCATE(ip(npart_in_group),stat=ierror)
155 IF(ierror/=0)
CALL ancmsg(msgid = 268,
157 . msgtype = msgerror,
159 ip(1:npart_in_group) = ipart(4,igrpart(igrp)%ENTITY(1:npart_in_group))
165 l_planar_surf = .false.
166 l_user_surf = .false.
168 IF(isurf>0)surf_type=igrsurf(isurf)%TYPE
169 IF(surf_type==200 .OR. surf_type == -1)
THEN
171 ELSEIF(surf_type == 0)
THEN
173 nseg = igrsurf(isurf)%NSEG
175 ALLOCATE(max_coor(3,nseg),min_coor(3,nseg),n_surf
178 IF(igrsurf(isurf)%NODES(iseg,4)==0)ltria=.true.
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))
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))
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
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))
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))
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,iseg))
229 iad = iparg(4,ng) - 1
230 gbuf => elbuf_tab(ng)%GBUF
233 IF( (ity == 1. .AND.n2d==0) .OR. ((ity ==
THEN
236 m(1:nel) = iparts(1+nft:nel+nft)
239 m(1:nel) = ipartq(1+nft:nel+nft)
242 m(1:nel) = iparttg(1+nft:nel+nft)
255 DO q=1,npart_in_group
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)
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) = fourth*(sum(n(1,1:4)))
301 z(2) = fourth*(sum(n(2,1:4)))
302 z(3) = fourth*(sum(n(3,1:4)))
303 userid = ixq(nixq,ie)
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))
309 z(1) = third*(sum(n(1,1:3)))
310 z(2) = third*(sum(n(2,1:3)))
311 z(3) = third*(sum(n(3,1:3)))
312 userid = ixtg(nixtg,ie)
315 IF(l_planar_surf)
THEN
323 alpha = (bx-z(1))*nx+(by-z(2))*ny+(bz-z(3))*nz / (ngx*nx+ngy*ny+ngz*nz)
331 depth(kk) = -depth(kk)
334 ELSEIF(l_user_surf)
THEN
345 IF(z(1)+tol < min_coor(1,iseg) .OR. z(1)-tol > max_coor(1,iseg))cycle
351 IF(z(3)+tol < min_coor(3,iseg) .OR. z(3)-tol > max_coor(3,iseg
353 dotp = n_surf(1,iseg)*ngx + n_surf(2,iseg)*ngy + n_surf(3,iseg)*ngz
354 IF(abs(dotp)<=em04)
THEN
357 . msgtype = msgerror,
359 . c1=
"INPUT SURFACE HAS INCOMPATIBLE SLOPE WITH GRAVITY DIRECTION"
364 p(1,1:4)=x(1,igrsurf(isurf)%NODES(iseg,1:4))
365 p(2,1:4)=x(2,igrsurf(isurf)%NODES(iseg
366 p(3,1:4)=x(3,igrsurf(isurf)%NODES(iseg,1:4))
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
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
386 IF(abs(dept) < abs(depth(kk)))
THEN
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
397 . msgtype = msgerror,
406 IF(.NOT.lfound_proj)
EXIT
411 matid = ixs(1, 1 + nft)
413 matid = ixq(1, 1 + nft)
415 matid = ixtg(1, 1 + nft)
417 iadbuf =
max(1,ipm(7, matid))
423 CASE (3, 4, 6, 10, 49)
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)
431 CALL inigrav_m37(nel,nel2, ng, matid, ipm, grav0, depth, pm, bufmat(iadbuf), elbuf_tab, psurf, list)
437 ix => ixs(1:nixs, 1:numels)
439 ELSEIF (ity == 2) then
440 ix => ixq(1:nixq, 1:numelq)
442 ELSEIF (ity == 7) then
443 ix => ixtg(1:nixtg, 1:numeltg)
446 iform = bufmat(iadbuf + 31 - 1)
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)
453 . msgtype = msgwarning
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 ! trias
466 ix => ixtg(1:nixtg, lft + nft:llt + nft)
468 nbmat = mat_param(ix(1, 1))%MULTIMAT%NB
474 matlaw = ipm(2, matid)
475 rho0 = rho0+pm(1,matid)*volfrac
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 , mlw, npf,tf,nummat,mat_param)
493 gbuf%SIG(i + 1 * nel) = -pgrav(kk)
494 gbuf%SIG(i + 2 * nel) = -pgrav(kk)
499 lbuf => elbuf_tab(ng)%BUFLY(imat)%LBUF(1, 1, 1)
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)
504 gbuf%SIG(i + 0 * nel) = -pgrav(kk)
505 gbuf%SIG(i + 1 * nel) = -pgrav(kk)
506 gbuf%SIG(i + 2 * nel) = -pgrav(kk)
514 ix => ixs(1:nixs, 1:numels)
516 ELSEIF (ity == 2) then
517 ix => ixq(1:nixq, 1:numelq)
519 ELSEIF (ity == 7) then
520 ix => ixtg(1:nixtg, 1:numeltg)
525 . msgtype = msgwarning,
527 . i2 = ipart(4,m(i)),
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)
540 IF(
ALLOCATED(ip))
DEALLOCATE(ip)