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,
58! ityp = 5 - line of beams
78#include "implicit_f.inc"
86#include "vect01_c.inc"
91#include "tabsiz_c.inc"
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), bufmat(*)
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
106 TYPE (GROUP_) ,
DIMENSION(NGRPART) :: IGRPART
108 INTEGER,
INTENT(IN)::NPF(SNPC)
109 my_real,
INTENT(IN)::TF(STF)
110 TYPE(matparam_struct_) ,
DIMENSION(NUMMAT),
INTENT(IN) :: MAT_PARAM
114 my_real :: grav0,bx,by,bz,nx,ny,nz,dotprod,dotp,rho0,ngx,ngy,ngz,
alpha,
interp(3),vala,valb,
norm
115 my_real :: z(3), depth(mvsiz), n(3,8),vec(3), delta_p(mvsiz),psurf,pgrav(mvsiz),vfrac,p(3,1:4)
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 :: K,KK,IGRP,ISURF,IGRAV,NPART_IN_GROUP,MLW,NG,IAD0,II,NEL,J,IE,I,,IMAT,M(MVSIZ),Q,NSEG,ISEG
120 INTEGER :: NOD(8), MATID, IADBUF,IFORM,NEL2,LIST(MVSIZ),NBMAT,,NIX,UID,SURF_TYPE,IELTYP
121 INTEGER,
ALLOCATABLE,
DIMENSION(:) ::
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
144 grav0 = linigrav(07,k)
148 psurf = linigrav(11,k)
149 IF (grav0==zero)cycle
152 npart_in_group = igrpart(igrp)%NENTITY
153 ALLOCATE(ip(npart_in_group),stat=ierror)
154 IF(ierror/=0)
CALL ancmsg(msgid = 268,
156 . msgtype = msgerror,
158 ip(1:npart_in_group) = ipart(4,igrpart(igrp)%ENTITY(1:npart_in_group))
160 !by default treat all parts
164 l_planar_surf = .false.
165 l_user_surf = .false.
167 IF(isurf>0)surf_type=igrsurf(isurf)%TYPE
168 IF(surf_type==200 .OR. surf_type == -1)
THEN
170 ELSEIF(surf_type == 0)
THEN
172 nseg = igrsurf(isurf)%NSEG
174 ALLOCATE(max_coor(3,nseg),min_coor(3,nseg),n_surf(3,nseg),zf(3,nseg))
177 IF(igrsurf(isurf)%NODES(iseg,4)==0)ltria=.true.
182 p(1,1:4)=x(1,igrsurf(isurf)%NODES(iseg,1:4))
184 p(3,1:4)=x(3,igrsurf(isurf)%NODES(iseg,1:4))
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))
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(2,4)-p(2,2))
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
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))
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))
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))
228 iad = iparg(4,ng) - 1
229 gbuf => elbuf_tab(ng)%GBUF
232 IF( (ity == 1. .AND.n2d==0) .OR. ((ity == 2. .OR. ity == 7).AND.n2d/=0) )
THEN
235 m(1:nel) = iparts(1+nft:nel+nft)
238 m(1:nel) = ipartq(1+nft:nel+nft)
241 m(1:nel) = iparttg(1+nft:nel+nft)
254 DO q=1,npart_in_group
255 IF(ipart(4,m(i))==ip(q))
THEN
281 n(1:3,1) = x(1:3,ixs(2,ie))
282 n(1:3,2) = x(1:3,ixs(3,ie))
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(2,1:8)))
291 z(3) = one_over_8*(sum(n(3,1:8)))
292 userid = ixs(nixs,ie)
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)
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))
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)
313 IF(l_planar_surf)
THEN
321 alpha = (bx-z(1))*nx+(by-z(2))*ny+(bz-z(3))*nz / (ngx*nx+ngy*ny+ngz*nz)
332 ELSEIF(l_user_surf)
THEN
334 ! --- calcul des distances ---
343 IF(z(1)+tol < min_coor(1,iseg) .OR. z(1)-tol > max_coor(1,iseg))cycle
346 IF(z(2)+tol < min_coor(2,iseg) .OR. z(2)-tol > max_coor(2,iseg))cycle
349 IF(z(3)+tol < min_coor(3,iseg) .OR. z(3)-tol > max_coor(3,iseg))cycle
351 dotp = n_surf(1,iseg)*ngx + n_surf(2,iseg)*ngy + n_surf(3,iseg)*ngz
352 IF(abs(dotp)<=em04)
THEN
355 . msgtype = msgerror,
357 . c1=
"INPUT SURFACE HAS INCOMPATIBLE SLOPE WITH GRAVITY DIRECTION"
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))
366 !
interp = z + lambda*ng(colinear to gravity direction , ng gravity vector, z cell centroid, lambda unknown scalar)
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
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
384 depth(kk) = -depth(kk)
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
393 . msgtype = msgerror,
402 IF(.NOT.lfound_proj)
EXIT
407 matid = ixs(1, 1 + nft)
409 matid = ixq(1, 1 + nft)
411 matid = ixtg(1, 1 + nft)
413 iadbuf =
max(1,ipm(7, matid))
419 CASE (3, 4, 6, 10, 49)
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)
427 CALL inigrav_m37(nel,nel2, ng, matid, ipm, grav0, depth, pm, bufmat(iadbuf), elbuf_tab, psurf, list)
433 ix => ixs(1:nixs, 1:numels)
435 ELSEIF (ity == 2) then
436 ix => ixq(1:nixq, 1:numelq)
438 ELSEIF (ity == 7) then
439 ix => ixtg(1:nixtg, 1:numeltg)
442 iform = bufmat(iadbuf + 31 - 1)
444 CALL inigrav_m51(nel , nel2, ng, matid, ipm, grav0, depth, pm, bufmat(iadbuf), elbuf_tab,
445 . psurf, list, ale_connectivity, nv46, ix , nix , nft , bufmat, iparg)
449 . msgtype = msgwarning
458 ix => ixs(1:nixs, lft + nft:llt + nft)
459 ELSEIF (ity == 2) then
460 ix => ixq(1:nixq, lft + nft:llt + nft)
461 ELSEIF (ity == 7)
THEN
462 ix => ixtg(1:nixtg, lft + nft:llt + nft)
464 nbmat = mat_param(ix(1, 1))%MULTIMAT%NB
468 matid = mat_param(ix(1, 1))%MULTIMAT%MID(imat)
469 volfrac= mat_param(ix(1, 1))%MULTIMAT%VFRAC(imat)
470 matlaw = ipm(2, matid)
471 rho0 = rho0+pm(1,matid)*volfrac
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)
488 gbuf%SIG(i + 0 * nel) = -pgrav(kk)
489 gbuf%SIG(i + 1 * nel) = -pgrav(kk)
490 gbuf%SIG(i + 2 * nel) = -pgrav(kk)
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)
500 gbuf%SIG(i + 0 * nel) = -pgrav(kk)
501 gbuf%SIG(i + 1 * nel) = -pgrav(kk)
502 gbuf%SIG(i + 2 * nel) = -pgrav(kk)
510 ix => ixs(1:nixs, 1:numels)
512 ELSEIF (ity == 2) then
513 ix => ixq(1:nixq, 1:numelq)
515 ELSEIF (ity == 7) then
516 ix => ixtg(1:nixtg, 1:numeltg)
521 . msgtype = msgwarning,
523 . i2 = ipart(4,m(i)),
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)
536 IF(
ALLOCATED(ip))
DEALLOCATE(ip)
subroutine initia(iparg, elbuf, ms, in, v, x, ixs, ixq, ixc, ixt, ixp, ixr, detonators, geo, pm, rby, npby, lpby, npc, npts, pld, veul, ale_connectivity, skew, fill, ipart, itab, sensors, skvol, ixtg, thk, nloc_dmg, group_param_tab, glob_therm, igrnod, igrsurf, bufsf, vr, bufmat, xlas, las, dtelem, mss, msq, msc, mst, msp, msr, mstg, ptg, inc, nod2eltg, knod2eltg, inp, inr, intg, index, itri, kxx, ixx, xelemwa, iwa, nod2elq, knod2elq, nod2els, knod2els, kxsp, ixsp, nod2sp, ispcond, icode, iskew, iskn, ispsym, xframe, isptag, spbuf, mssx, nsigi, npbyl, lpbyl, rbyl, msnf, mssf, nsigsh, igeo, ipm, nsigs, nsigsph, vns, vnsx, stc, stt, stp, str, sttg, stur, bns, bnsx, volnod, bvolnod, etnod, nshnod, stifint, fxbdep, fxbvit, fxbacc, fxbipm, fxbrpm, fxbelm, fxbsig, fxbmod, ins, ptshel, ptsh3n, ptsol, ptquad, wma, ptsph, fxbnod, mbufel, mdepl, fxani, numel, nsigrs, sh4tree, sh3tree, mcp, temp, imerge2, iadmerge2, slnrbm, nslnrbm, rmstifn, rmstifr, ms_layer, zi_layer, itag, itagel, mcpc, mcptg, xrefc, xreftg, xrefs, mssa, msrt, irbe2, lrbe2, inivol, kvol, nbsubmat, ixs10, ixs16, ixs20, totaddmas, ipmas, stifn, msz2, itagn, sitage, itage, ixr_kj, elbuf_tab, nom_opt, ptr_nopt_rbe2, ptr_nopt_adm, ptr_nopt_fun, sol2sph, irst, sh3trim, xfem_tab, kxig3d, ixig3d, msig3d, knot, nctrlmax, wige, stack, rnoise, drape, sh4ang, sh3ang, geo_stack, igeo_stack, stifintr, strc, strp, strr, strtg, perturb, itagnd, nativ_sms, iloadp, facload, ptspri, nsigbeam, ptbeam, nsigtruss, pttruss, multi_fvm, sigi, sigsh, sigsp, sigsph, sigrs, sigbeam, sigtruss, strsglob, straglob, orthoglob, isigsh, iyldini, ksigsh3, fail_ini, iusolyld, iuser, iddlevel, inimap1d, inimap2d, func2d, fvm_inivel, tagprt_sms, igrbric, igrquad, igrsh4n, igrsh3n, igrpart, totmas, knotlocpc, knotlocel, vnige, bnige, fxbglm, fxbcpm, fxbcps, fxblm, fxbfls, fxbdls, fxb_matrix, fxb_matrix_add, fxb_last_adress, ptr_nopt_fxb, r_skew, knod2el1d, nod2el1d, ebcs_tab, rby_iniaxis, alea, knod2elc, nod2elc, dr, slrbody, drapeg, ipari, intbuf_tab, interfaces, mat_param, npreload_a, preload_a, fail_fractal, fail_brokmann, defaults, ndamp_freq_range, dampr, ibeam_vector, rbeam_vector, ikine)