34 . NUMELS,IPM, SIZE_IRUP,
36 . POIN_PART_SOL,MID_PID_SOL,IPARTS,BUFMAT,
37 . MID_OLD,PID_OLD,MLN_OLD,RECHERCHE,ISOL_OLD,
38 . TELT_PRO,TABMP_L,NPART,MAT_PARAM)
45 use element_mod ,
only : nixs
49#include "implicit_f.inc"
55#include "tablen_c.inc"
56#include "ddspmd_c.inc"
63 . IXS(NIXS,*),IGEO(NPROPGI,NUMGEO),ISOLNOD(*),
64 . IPM(NPROPMI,*),TABMP_L,NPART
65 INTEGER,
INTENT(IN) :: SIZE_IRUP
68 . PM(NPROPM,*), GEO(NPROPG,*),BUFMAT(*)
70 INTEGER MID_OLD,PID_OLD,MLN_OLD,RECHERCHE,ISOL_OLD
73 INTEGER,
DIMENSION(2,NPART,*),
INTENT(IN) :: POIN_PART_SOL
74 INTEGER,
DIMENSION(*),
INTENT(IN) :: IPARTS
75 TYPE(
mid_pid_type),
DIMENSION(NUMMAT,*),
INTENT(INOUT) :: MID_PID_SOL
76 TYPE(matparam_struct_) ,
DIMENSION(NUMMAT),
INTENT(IN) :: MAT_PARAM
78 INTEGER OFF, NPN, MID, PID, JHBE, IGT, MLN,
79 . istrain, ithk, ihbe, ipla, issn, mtn, i, j, k,l,
80 . nfunc,mpt,npts,nptt,nptr,nptot,iflag,jsrot,ivisc,
81 . i_mid,i_pid,i_mid_old,i_pid_old,puid,muid,
82 . elm_typ,elm_typ_old,ilaw,ilaw_old,test_mat,
83 . i_pro,isol2,muid_old,puid_old,
84 . test,nfunc1,nfunc2,nfail,irup2,
85 . isol,indi,iad,indi2,mult
86 INTEGER :: INDI3,ADD_OPTION,INDI_OPT_1,INDI_OPT_2
87 INTEGER :: IRUP_TAB(SIZE_IRUP)
88 my_real :: OPT_1,OPT_2
91 . wtype(9),fwihbe,fac8,
92 . tabmat(3),tabx(3),timmat,npt,telt,poids,w,
93 . batozmult,tmat,trup,tmatadd,wd_local
94 INTEGER :: FLAG_NICE_NEWTON,FLAG_GURSON,FLAG_NON_LOCAL
95 INTEGER :: SPECIAL_OPTION,,SPE_I_2,SPE_I_3
96 my_real :: INVTREF,MULT_SPE
97 INTEGER :: INDI4,POIN_PID,POIN_MID,POIN_PART,COST_CHECK,POIN_ELM_TYP
98 my_real :: INVTELT_PRO
99 my_real :: cc,a,b,a1,a2
101 INTEGER :: OVERCOST_ELM ,ICPR,NUMBER_LAYER
103LOGICAL :: COMPOSITE_OPTION
105 LOGICAL :: ISMSTR_COST
106 INTEGER :: ISMSTR,ISMSTR_L,ISM0,ICP0
109 DATA wtype /1.6 ,1. ,1. ,.9 ,1.1 ,1.4 ,0.65 ,.9 ,2.0/
120 IF(dd_optimization==1)
THEN
122#include "weights_p4linux964_spmd_avx512.inc"
123 ELSEIF(dd_optimization==2)
THEN
125#include "weights_p4linux964_spmd_sse3.inc"
126 ELSEIF(dd_optimization==3)
THEN
128#include "weights_p4linuxa964_spmd.inc"
133#include "weights_p4linuxa964_spmd.inc"
136#include "weights_p4linux964_spmd.inc"
150 mln = nint(pm(19,abs(mid)))
154 IF(recherche==1)
THEN
164 ELSEIF(isol==10)
THEN
166 ELSEIF(isol==16)
THEN
168 ELSEIF(isol==20)
THEN
184 nfail = mat_param(abs(mid))%NFAIL
185 irup_tab(1:nfail) = 0
188 irup_tab(j) = mat_param(abs(mid))%FAIL(j)%IRUPT
205 composite_option = .false.
206 IF (igeo(30,pid)>0 .AND. igeo(11,pid)==22)
THEN
207 composite_option = .true.
213 ismstr_cost = .false.
215 IF((mln<28).OR.(mln==49).OR.(mln==59))
THEN
223 ism0 = mat_param(abs(mid))%SMSTR
224 icp0 = mat_param(abs(mid))%STRAIN_FORMULATION
225 IF (icp0 ==2.AND.jhbe/=16)
THEN
238 IF (mln == 1.AND.jhbe/=16) ismstr_l = 12
242 IF ( mln==1.OR.mln==38.OR.
243 . mln==90.OR.mln==92.OR.mln==94 )
THEN
244 IF (ismstr_l==10.OR.ismstr_l==12)
THEN
250 IF (mat_param(abs(mid))%IVISC > 0)
THEN
251 visc_prony = visc_prony_cost * mat_param(abs(mid))%VISC%IPARAM(1)
260 IF (mat_param(abs(mid))%IVISC > 0)
THEN
261 visc_prony = visc_prony_cost * mat_param(abs(mid))%VISC%IPARAM(1)
266 IF (mat_param(abs(mid))%iparam(1)==1)
THEN
271 IF (mat_param(abs(mid))%IVISC > 0)
THEN
275 ELSEIF (mln == 36)
THEN
276 nfunc =
max(ipm(10,mid) - 3,1)
279 ELSEIF (nfunc>2.AND.nfunc<=7)
THEN
281 ELSEIF (nfunc>7)
THEN
284 IF (mat_param(abs(mid))%IVISC > 0)
THEN
285 visc_prony = visc_prony_cost * mat_param(abs(mid))%VISC%IPARAM(1)
287 ELSEIF (mln==33)
THEN
290 IF((nfunc1/=0).OR.(nfunc2/=0))
THEN
295 IF (mat_param(abs(mid))%IVISC > 0)
THEN
296 visc_prony = visc_prony_cost * mat_param(abs(mid))%VISC%IPARAM(1)
298 ELSEIF((mln==42).OR.(mln==62).OR.(mln==69))
THEN
301 IF (mln==42) nfunc = mat_param(abs(mid))%IPARAM(2)
303 iad = ipm(7,abs(mid))-1
304 nfunc = nint(bufmat(iad+3))
308 ivisc = mat_param(abs(mid))%IVISC
309 IF (ivisc == 1 .or. ivisc == 2)
THEN
310 visc_prony = visc_prony_cost * mat_param(abs(mid))%VISC%IPARAM(1)
312 ELSEIF(nfunc==1)
THEN
314 ELSEIF(nfunc==2)
THEN
321 ELSEIF((mln==82))
THEN
322 iad=ipm(7,abs(mid))-1
323 nfunc=nint(bufmat(iad+1))
326 IF (mat_param(abs(mid))%IVISC > 0)
THEN
327 visc_prony = visc_prony_cost * mat_param(abs(mid))%VISC%IPARAM(1)
329 ELSEIF(nfunc==2)
THEN
331 ELSEIF(nfunc==3)
THEN
338 ELSEIF(mln==100)
THEN
344 iad=ipm(7,abs(mid))-1
353 IF(nint(bufmat(iad+5))>0)
THEN
359 IF(nint(bufmat(iad+1))>0)
THEN
360 opt_2 = nint(bufmat(iad+1))
368 ELSEIF(mln==104)
THEN
369 iad=ipm(7,abs(mid))-1
370 flag_nice_newton=nint(bufmat(iad+11))
371 IF(flag_nice_newton==2)
THEN
376 flag_gurson=nint(bufmat(iad+30))
377 IF(flag_gurson/=0)
THEN
382 IF(flag_gurson==1)
THEN
384 ELSEIF(flag_gurson==2)
THEN
386 ELSEIF(flag_gurson==3)
THEN
389 flag_non_local = mat_param(abs(mid))%NLOC
390 IF (mat_param(abs(mid))%IVISC > 0)
THEN
391 visc_prony = visc_prony_cost * mat_param(abs(mid))%VISC%IPARAM(1)
395 IF (mat_param(abs(mid))%IVISC > 0)
THEN
396 visc_prony = visc_prony_cost * mat_param(abs(mid))%VISC%IPARAM(1)
399 IF(ismstr_cost) add_over_cost = elm_over_cost(1)
403 IF(flag_non_local/=0)
THEN
411! ---------------------------
412 IF (isol==4.AND. (jsrot /= 1))
THEN
414 IF(recherche==0.AND.test_poids/=0)
THEN
415 poin_part = iparts(i)
416 poin_mid = poin_part_sol(1,poin_part,6)
417 poin_pid = poin_part_sol(2,poin_part,6)
418 IF(poin_mid/=0.AND.poin_pid/=0)
THEN
419 IF(mid_pid_sol(poin_mid,6)%COST1D(poin_pid)/=zero)
THEN
422 telt = mid_pid_sol(poin_mid,poin_elm_typ)%COST1D(poin_pid)
427 IF(cost_check==0)
THEN
428 IF( ddweights(1,1,iabs(mid))/=0)
THEN
429 tmat = ddweights(1,1,iabs(mid)) * tpsref
431 IF(mult/=0) tmatadd = mult * (tet4tnl(mln,indi)-tet4tnl(mln,indi2))
432 IF(add_option/=0) tmatadd = opt_1 * tet4tnl(mln,indi_opt_1) + opt_2 * tet4tnl(mln,indi_opt_2)
433 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
434 tmat = tet4tnl(mln,indi) + tmatadd
440 trup = trup + rupture_tet4(irup_tab(j),irup2)
444 telt = tmat + tet4telt(1) + trup + mult_spe*nlocal_option(spe_i_3) + add_over_cost +
visc_prony
450 ELSEIF ((isol==10).OR.(isol==4.AND. jsrot==1))
THEN
452 IF(recherche==0.AND.test_poids/=0)
THEN
454 poin_part = iparts(i)
455 poin_mid = poin_part_sol(1,poin_part,2)
456 poin_pid = poin_part_sol(2,poin_part,2)
459 IF(poin_mid/=0.AND.poin_pid/=0)
THEN
460 IF(mid_pid_sol(poin_mid,2)%COST1D(poin_pid)/=zero)
THEN
463 telt = mid_pid_sol(poin_mid,poin_elm_typ)%COST1D(poin_pid)
466 ELSEIF(isol==4.AND. jsrot==1)
THEN
467 poin_part = iparts(i)
468 poin_mid = poin_part_sol(1,poin_part,6)
469 poin_pid = poin_part_sol(2,poin_part,6)
472 IF(poin_mid/=0.AND.poin_pid/=0)
THEN
473 IF(mid_pid_sol(poin_mid,6)%COST1D(poin_pid)/=zero)
THEN
476 telt = mid_pid_sol(poin_mid,poin_elm_typ)%COST1D(poin_pid)
482 IF(cost_check==0)
THEN
483 IF( ddweights(1,1,iabs(mid))/=0)
THEN
484 tmat = ddweights(1,1,iabs(mid)) * tpsref
486 IF(mult/=0) tmatadd = mult * (tet10tnl(mln,indi)-tet10tnl(mln,indi2))
487 IF(add_option/=0) tmatadd = opt_1 * tet10tnl(mln,indi_opt_1) + opt_2 * tet10tnl(mln,indi_opt_2)
488 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
489 tmat = tet10tnl(mln,indi) + tmatadd
495 trup = trup + rupture_tet10(irup_tab(j),irup2)
499 IF(isol==10) telt = tet10telt(1)
500 IF(isol==4.AND. jsrot==1) telt = tet4telt(2)
501 telt = tmat + telt + trup + mult_spe*nlocal_option(spe_i_3) + 4.*(add_over_cost +
visc_prony)
509 IF(recherche==0.AND.test_poids/=0)
THEN
514 ELSEIF(isol==16)
THEN
516 ELSEIF(isol==20)
THEN
521 poin_part = iparts(i)
522 poin_mid = poin_part_sol(1,poin_part,poin_elm_typ)
523 poin_pid = poin_part_sol(2,poin_part,poin_elm_typ)
526 IF(poin_mid/=0.AND.poin_pid/=0)
THEN
527 IF(mid_pid_sol(poin_mid,poin_elm_typ)%COST1D(poin_pid)/=zero)
THEN
529 telt = mid_pid_sol(poin_mid,poin_elm_typ)%COST1D(poin_pid)
534 IF(cost_check==0)
THEN
537 IF( ddweights(1,1,iabs(mid))/=0)
THEN
538 tmat = ddweights(1,1,iabs(mid)) * tpsref
540 IF(mult/=0) tmatadd = mult * (sol1tnl(mln,indi)-sol1tnl(mln,indi2))
541 IF(add_option/=0) tmatadd = opt_1 * sol1tnl(mln,indi_opt_1) + opt_2 * sol1tnl(mln,indi_opt_2)
542 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
543 tmat = sol1tnl(mln,indi) + tmatadd
549 trup = trup + rupture_sol(irup_tab(j),irup2)
554 ELSEIF (jhbe==2)
THEN
556 IF( ddweights(1,1,iabs(mid))/=0)
THEN
557 tmat = ddweights(1,1,iabs(mid)) * tpsref
559 IF(mult/=0) tmatadd = mult * (sol1tnl(mln,indi)-sol1tnl(mln,indi2))
560 IF(add_option/=0) tmatadd = opt_1 * sol1tnl(mln,indi_opt_1) + opt_2 * sol1tnl(mln,indi_opt_2)
561 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
562 tmat = sol1tnl(mln,indi) + tmatadd
568 trup = trup + rupture_sol(irup_tab(j),irup2)
572 telt = tmat + soltelt(2) + trup + mult_spe*nlocal_option(spe_i_3) + add_over_cost +
visc_prony
573 ELSEIF (jhbe==24.OR.jhbe==104)
THEN
575 IF( ddweights(1,1,iabs(mid))/=0)
THEN
576 tmat = ddweights(1,1,iabs(mid)) * tpsref
578 IF(mult/=0) tmatadd = mult * (sol1tnl(mln,indi)-sol1tnl(mln,indi2))
579 IF(add_option/=0) tmatadd = opt_1 * sol1tnl(mln,indi_opt_1) + opt_2 * sol1tnl(mln,indi_opt_2)
580 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
581 tmat = sol1tnl(mln,indi) + tmatadd
587 trup = trup + rupture_sol(irup_tab(j),irup2)
591 telt = tmat + soltelt(3) + trup + mult_spe*nlocal_option(spe_i_3) + add_over_cost +
visc_prony
593 ELSEIF (jhbe==12)
THEN
595 IF( ddweights(1,1,iabs(mid))/=0)
THEN
596 tmat = ddweights(1,1,iabs(mid)) * tpsref
598 IF(mult/=0) tmatadd = mult * (sol8tnl(mln,indi)-sol8tnl(mln,indi2))
599 IF(add_option/=0) tmatadd = opt_1 * sol8tnl(mln,indi_opt_1) + opt_2 * sol8tnl(mln,indi_opt_2)
600 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
601 tmat = sol8tnl(mln,indi) + tmatadd
607 trup = trup + rupture_sol12(irup_tab(j),irup2)
611 telt = tmat + soltelt(4) + trup + mult_spe*nlocal_option(spe_i_3) + 8.*(add_over_cost +
visc_prony)
612 ELSEIF ( (jhbe==14.OR.(jhbe>=222.AND.jhbe<=999)).AND.(igt/=20.AND.igt/=21.AND.igt/=22))
THEN
615 nptr =
max(mpt/100,1)
616 npts =
max(mod(mpt/10,10),1)
617 nptt =
max(mod(mpt,10),1)
618 nptot = npts*nptt*nptr
620 IF( ddweights(1,1,iabs(mid))/=0)
THEN
621 tmat = ddweights(1,1,iabs(mid)) * tpsref
623 IF(mult/=0) tmatadd = mult * (sol1tnl(mln,indi)-sol1tnl(mln,indi2))
624 IF(add_option/=0) tmatadd = opt_1 * sol1tnl(mln,indi_opt_1) + opt_2 * sol1tnl(mln,indi_opt_2)
625 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
626 tmat = sol1tnl(mln,indi
632 trup = trup + rupture_sol(irup_tab(j),irup2)
639 IF(nptot>8) overcost_elm = nptot-8
640 telt = nptot*(tmat+trup+add_over_cost+
visc_prony)+soltelt(5) +overcost_elm *soltelt(6) +
641 . mult_spe*nlocal_option(spe_i_3)
642 ELSEIF(jhbe==14.AND.(igt==20.OR.igt==21.OR.igt==22))
THEN
645 nptr =
max(mpt/100,1)
646 npts =
max(mod(mpt/10,10),1)
647 nptt =
max(mod(mpt,10),1)
648 nptot = npts*nptt*nptr
650 IF( ddweights(1,1,iabs(mid))/=0)
THEN
651 tmat = ddweights(1,1,iabs(mid)) * tpsref
653 IF(mult/=0) tmatadd = mult * (sol1tnl(mln,indi)-sol1tnl(mln,indi2))
654 IF(add_option/=0) tmatadd = opt_1 * sol1tnl(mln,indi_opt_1) + opt_2 * sol1tnl(mln,indi_opt_2)
655 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
660 IF(igeo(30,pid)>9)
THEN
661 number_layer = igeo(30,pid)
665 overcost_elm = npts*nptt
666 ELSEIF(icpr==10)
THEN ! sharp
667 overcost_elm = nptt*nptr
669 overcost_elm = npts*nptr
674 number_layer = igeo(30,pid)
678 overcost_elm = npts*nptt
679 ELSEIF(icpr==10)
THEN
681 overcost_elm = nptt*nptr
684 overcost_elm = npts*nptr
690 IF(composite_option)
THEN
691 DO nlay=1,number_layer
692 composite_mid = igeo(100+nlay,pid)
693 composite_mln = nint(pm(19,abs(composite_mid)))
694 tmatadd = tmatadd + sol1tnl(composite_mln,indi)
696 tmatadd = tmatadd - sol1tnl(mln,indi)
698 tmat = sol1tnl(mln,indi) + tmatadd
704 trup = trup + rupture_sol(irup_tab(j),irup2)
710 telt = overcost_elm*(tmat+
visc_prony)+nptot*trup +
711 . overcost_elm*number_layer*soltelt(10) + mult_spe*nlocal_option(spe_i_3) +
712 . overcost_elm * add_over_cost
713 ELSEIF(jhbe==15)
THEN
717 IF( ddweights(1,1,iabs(mid))/=0)
THEN
718 tmat = ddweights(1,1,iabs(mid)) * tpsref
720 IF(mult/=0) tmatadd = mult * (sol1tnl(mln,indi)-sol1tnl(mln,indi2))
721 IF(add_option/=0) tmatadd = opt_1 * sol1tnl(mln,indi_opt_1) + opt_2 * sol1tnl(mln,indi_opt_2)
722 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
723 tmat = sol1tnl(mln,indi) + tmatadd
729 trup = trup + rupture_sol(irup_tab(j),irup2)
736 telt = nptot*(tmat+trup+
visc_prony) + soltelt(11) + nptot*soltelt(12) +
737 . mult_spe*nlocal_option(spe_i_3) + add_over_cost
739 ELSEIF (jhbe==17)
THEN
742 IF( ddweights(1,1,iabs(mid))/=0)
THEN
743 tmat = ddweights(1,1,iabs(mid)) * tpsref
745 IF(mult/=0) tmatadd = mult * (sol1tnl(mln,indi)-sol1tnl(mln,indi2))
746 IF(add_option/=0) tmatadd = opt_1 * sol1tnl(mln,indi_opt_1) + opt_2 * sol1tnl(mln,indi_opt_2)
747 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
748 tmat = sol1tnl(mln,indi) + tmatadd
754 trup = trup + rupture_sol(irup_tab(j),irup2)
758 telt = (tmat+trup+add_over_cost+
visc_prony)*8 + soltelt(7) + mult_spe*nlocal_option(spe_i_3)
759 ELSEIF (jhbe==18)
THEN
761 IF( ddweights(1,1,iabs(mid))/=0)
THEN
762 tmat = ddweights(1,1,iabs(mid)) * tpsref
764 IF(mult/=0) tmatadd = mult * (sol1tnl(mln,indi)-sol1tnl(mln,indi2))
765 IF(add_option/=0) tmatadd = opt_1 * sol1tnl(mln,indi_opt_1) + opt_2 * sol1tnl(mln,indi_opt_2)
766 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
767 tmat = sol1tnl(mln,indi) + tmatadd
773 trup = trup + rupture_sol(irup_tab(j),irup2)
777 telt = (tmat+trup+add_over_cost+
visc_prony)*8 + soltelt(9) + mult_spe*nlocal_option(spe_i_3)
783 trup = trup + rupture_sol(irup_tab(j),irup2)
787 telt = sol1tnl(mln,1) + soltelt(1) + trup
788 . + mult_spe*nlocal_option(spe_i_3) + add_over_cost +
visc_prony
793 poids = telt * invtref
795 IF(recherche==0)
THEN
796 IF (wd_local==0..AND.mln/=0)
THEN
798 poin_part = iparts(i)
799 IF (isol==4.AND. (jsrot /= 1))
THEN
801 ELSEIF( (isol==10).OR.(isol==4.AND. jsrot==1) )
THEN
812 ELSEIF(isol==16)
THEN
814 ELSEIF(isol==20)
THEN
820 poin_part = iparts(i)
821 poin_mid = poin_part_sol(1,poin_part,poin_elm_typ)
822 poin_pid = poin_part_sol(2,poin_part,poin_elm_typ)
823 IF(poin_mid/=0.AND.poin_pid/=0) mid_pid_sol(poin_mid,poin_elm_typ)%COST1D(poin_pid) = telt