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)
48#include "implicit_f.inc"
54#include "tablen_c.inc"
55#include "ddspmd_c.inc"
62 . (NIXS,*),IGEO(NPROPGI,NUMGEO),ISOLNOD(*),
63 . IPM(NPROPMI,*),TABMP_L,NPART
64 INTEGER,
INTENT(IN) :: SIZE_IRUP
67 . PM(NPROPM,*), GEO(NPROPG,*),BUFMAT(*)
69 INTEGER MID_OLD,PID_OLD,MLN_OLD,RECHERCHE,ISOL_OLD
72 INTEGER,
DIMENSION(2,NPART,*),
INTENT(IN) :: POIN_PART_SOL
73 INTEGER,
DIMENSION(*),
INTENT(IN) :: IPARTS
74 TYPE(
mid_pid_type),
DIMENSION(NUMMAT,*),
INTENT(INOUT) :: MID_PID_SOL
75 TYPE(matparam_struct_) ,
DIMENSION(NUMMAT),
INTENT(IN) :: MAT_PARAM
77 INTEGER OFF, NPN, MID, PID, JHBE, IGT, MLN,
78 . istrain, ithk, ihbe, ipla, issn, mtn, i, j, k,l,
79 . nfunc,mpt,npts,nptt,nptr,nptot,iflag,jsrot,ivisc,
80 . i_mid,i_pid,i_mid_old,i_pid_old,puid,muid,
81 . elm_typ,elm_typ_old,ilaw,ilaw_old,test_mat,
82 . i_pro,isol2,muid_old,puid_old,
83 . test,nfunc1,nfunc2,nfail,irup2,
84 . isol,indi,iad,indi2,mult
85 INTEGER :: INDI3,ADD_OPTION,INDI_OPT_1,INDI_OPT_2
86 INTEGER :: IRUP_TAB(SIZE_IRUP)
87 my_real :: OPT_1,OPT_2
90 . wtype(9),fwihbe,fac8,
91 . tabmat(3),tabx(3),timmat,npt,telt,poids,w,
92 . batozmult,tmat,trup,tmatadd,wd_local
93 INTEGER :: FLAG_NICE_NEWTON,FLAG_GURSON,FLAG_NON_LOCAL
94 INTEGER :: SPECIAL_OPTION,SPE_I_1,SPE_I_2,SPE_I_3
95 my_real :: INVTREF,MULT_SPE
96 INTEGER :: INDI4,POIN_PID,POIN_MID,POIN_PART,COST_CHECK,POIN_ELM_TYP
98 my_real :: cc,a,b,a1,a2
100 INTEGER :: OVERCOST_ELM ,ICPR,NUMBER_LAYER
101 INTEGER :: NLAY,COMPOSITE_MID,COMPOSITE_MLN
102 LOGICAL :: COMPOSITE_OPTION
104 LOGICAL :: ISMSTR_COST
105 INTEGER :: ISMSTR,ISMSTR_L,ISM0,ICP0
108 DATA wtype /1.6 ,1. ,1. ,.9 ,1.1 ,1.4 ,0.65 ,.9 ,2.0/
119 IF(dd_optimization==1)
THEN
121#include "weights_p4linux964_spmd_avx512.inc"
122 ELSEIF(dd_optimization==2)
THEN
124#include "weights_p4linux964_spmd_sse3.inc"
125 ELSEIF(dd_optimization==3)
THEN
127#include "weights_p4linuxa964_spmd.inc"
132#include "weights_p4linuxa964_spmd.inc"
135#include "weights_p4linux964_spmd.inc"
149 mln = nint(pm(19,abs(mid)))
153 IF(recherche==1)
THEN
163 ELSEIF(isol==10)
THEN
165 ELSEIF(isol==16)
THEN
167 ELSEIF(isol==20)
THEN
183 nfail = mat_param(abs(mid))%NFAIL
184 irup_tab(1:nfail) = 0
187 irup_tab(j) = mat_param(abs(mid))%FAIL(j)%IRUPT
204 composite_option = .false.
205 IF (igeo(30,pid)>0 .AND. igeo(11,pid)==22)
THEN
206 composite_option = .true.
212 ismstr_cost = .false.
214 IF((mln<28).OR.(mln==49).OR.(mln==59))
THEN
222 ism0 = mat_param(abs(mid))%SMSTR
223 icp0 = mat_param(abs(mid))%STRAIN_FORMULATION
224 IF (icp0 ==2.AND.jhbe/=16)
THEN
237 IF (mln == 1.AND.jhbe/=16) ismstr_l = 12
241 IF ( mln==1.OR.mln==38.OR.
242 . mln==90.OR.mln==92.OR.mln==94 )
THEN
243 IF (ismstr_l==10.OR.ismstr_l==12)
THEN
249 IF (mat_param(abs(mid))%IVISC > 0)
THEN
250 visc_prony = visc_prony_cost * mat_param(abs(mid))%VISC%IPARAM(1)
259 IF (mat_param(abs(mid))%IVISC > 0)
THEN
260 visc_prony = visc_prony_cost * mat_param(abs(mid
265 IF (mat_param(abs(mid))%iparam(1)==1)
THEN
270 IF (mat_param(abs(mid))%IVISC > 0)
THEN
271 visc_prony = visc_prony_cost * mat_param(abs(mid))%VISC%IPARAM(1)
274 ELSEIF (mln == 36)
THEN
275 nfunc =
max(ipm(10,mid) - 3,1)
278 ELSEIF (nfunc>2.AND.nfunc<=7)
THEN
280 ELSEIF (nfunc>7)
THEN
283 IF (mat_param(abs(mid))%IVISC > 0)
THEN
284 visc_prony = visc_prony_cost * mat_param(abs(mid))%VISC%IPARAM(1)
286 ELSEIF (mln==33)
THEN
289 IF((nfunc1/=0).OR.(nfunc2/=0))
THEN
294 IF (mat_param(abs(mid))%IVISC > 0)
THEN
295 visc_prony = visc_prony_cost * mat_param(abs(mid))%VISC%IPARAM(1)
297 ELSEIF((mln==42).OR.(mln==62).OR.(mln==69))
THEN
300 IF (mln==42) nfunc = mat_param(abs(mid))%IPARAM(2)
302 iad = ipm(7,abs(mid))-1
303 nfunc = nint(bufmat(iad+3))
307 ivisc = mat_param(abs(mid))%IVISC
308 IF (ivisc == 1 .or. ivisc == 2)
THEN
309 visc_prony = visc_prony_cost * mat_param(abs(mid))%VISC%IPARAM(1)
311 ELSEIF(nfunc==1)
THEN
313 ELSEIF(nfunc==2)
THEN
320 ELSEIF((mln==82))
THEN
321 iad=ipm(7,abs(mid))-1
322 nfunc=nint(bufmat(iad+1))
325 IF (mat_param(abs(mid))%IVISC > 0)
THEN
326 visc_prony = visc_prony_cost * mat_param(abs(mid))%VISC%IPARAM(1)
328 ELSEIF(nfunc==2)
THEN
330 ELSEIF(nfunc==3)
THEN
337 ELSEIF(mln==100)
THEN
343 iad=ipm(7,abs(mid))-1
352 IF(nint(bufmat(iad+5))>0)
THEN
358 IF(nint(bufmat(iad+1))>0)
THEN
359 opt_2 = nint(bufmat(iad+1))
367 ELSEIF(mln==104)
THEN
368 iad=ipm(7,abs(mid))-1
369 flag_nice_newton=nint(bufmat(iad+11))
370 IF(flag_nice_newton==2)
THEN
375 flag_gurson=nint(bufmat(iad+30))
376 IF(flag_gurson/=0)
THEN
381 IF(flag_gurson==1)
THEN
383 ELSEIF(flag_gurson==2)
THEN
385 ELSEIF(flag_gurson==3)
THEN
388 flag_non_local = mat_param(abs(mid))%NLOC
389 IF (mat_param(abs(mid))%IVISC > 0)
THEN
390 visc_prony = visc_prony_cost * mat_param(abs(mid))%VISC%IPARAM(1)
394 IF (mat_param(abs(mid))%IVISC > 0)
THEN
395 visc_prony = visc_prony_cost * mat_param(abs(mid))%VISC%IPARAM(1)
398 IF(ismstr_cost) add_over_cost = elm_over_cost(1)
402 IF(flag_non_local/=0)
THEN
411 IF (isol==4.AND. (jsrot /= 1))
THEN
413 IF(recherche==0.AND.test_poids/=0)
THEN
414 poin_part = iparts(i)
415 poin_mid = poin_part_sol(1,poin_part,6)
416 poin_pid = poin_part_sol(2,poin_part,6)
417 IF(poin_mid/=0.AND.poin_pid/=0)
THEN
418 IF(mid_pid_sol(poin_mid,6)%COST1D(poin_pid)/=zero
THEN
421 telt = mid_pid_sol(poin_mid,poin_elm_typ)%COST1D(poin_pid)
426 IF(cost_check==0)
THEN
427 IF( ddweights(1,1,iabs(mid))/=0)
THEN
428 tmat = ddweights(1,1,iabs(mid)) * tpsref
430 IF(mult/=0) tmatadd = mult * (tet4tnl(mln,indi)-tet4tnl(mln,indi2))
431 IF(add_option/=0) tmatadd = opt_1 * tet4tnl(mln,indi_opt_1) + opt_2 * tet4tnl(mln,indi_opt_2)
432 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
433 tmat = tet4tnl(mln,indi) + tmatadd
439 trup = trup + rupture_tet4(irup_tab(j),irup2)
443 telt = tmat + tet4telt(1) + trup + mult_spe*nlocal_option(spe_i_3) + add_over_cost +
visc_prony
449 ELSEIF ((isol==10).OR.(isol==4.AND. jsrot==1))
THEN
451 IF(recherche==0.AND.test_poids/=0)
THEN
453 poin_part = iparts(i)
454 poin_mid = poin_part_sol(1,poin_part,2)
455 poin_pid = poin_part_sol(2,poin_part,2)
458 IF(poin_mid/=0.AND.poin_pid/=0)
THEN
459 IF(mid_pid_sol(poin_mid,2)%COST1D(poin_pid)/=zero)
THEN
462 telt = mid_pid_sol(poin_mid,poin_elm_typ)%COST1D(poin_pid)
465 ELSEIF(isol==4.AND. jsrot==1)
THEN
466 poin_part = iparts(i)
467 poin_mid = poin_part_sol(1,poin_part,6)
468 poin_pid = poin_part_sol(2,poin_part,6)
471 IF(poin_mid/=0.AND.poin_pid/=0)
THEN
472 IF(mid_pid_sol(poin_mid,6)%COST1D(poin_pid)/=zero)
THEN
475 telt = mid_pid_sol(poin_mid,poin_elm_typ)%COST1D(poin_pid)
481 IF(cost_check==0)
THEN
482 IF( ddweights(1,1,iabs(mid))/=0)
THEN
483 tmat = ddweights(1,1,iabs(mid)) * tpsref
485 IF(mult/=0) tmatadd = mult * (tet10tnl(mln,indi)-tet10tnl(mln,indi2))
486 IF(add_option/=0) tmatadd = opt_1 * tet10tnl(mln,indi_opt_1) + opt_2 * tet10tnl(mln,indi_opt_2)
487 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
488 tmat = tet10tnl(mln,indi) + tmatadd
494 trup = trup + rupture_tet10(irup_tab(j),irup2)
498 IF(isol==10) telt = tet10telt(1)
499 IF(isol==4.AND. jsrot==1) telt = tet4telt(2)
500 telt = tmat + telt + trup + mult_spe*nlocal_option(spe_i_3) + 4.*(add_over_cost +
visc_prony)
508 IF(recherche==0.AND.test_poids/=0)
THEN
513 ELSEIF(isol==16)
THEN
515 ELSEIF(isol==20)
THEN
520 poin_part = iparts(i)
521 poin_mid = poin_part_sol(1,poin_part,poin_elm_typ)
522 poin_pid = poin_part_sol(2,poin_part,poin_elm_typ)
525 IF(poin_mid/=0.AND.poin_pid/=0)
THEN
526 IF(mid_pid_sol(poin_mid,poin_elm_typ)%COST1D(poin_pid)/=zero)
THEN
528 telt = mid_pid_sol(poin_mid,poin_elm_typ)%COST1D(poin_pid)
533 IF(cost_check==0)
THEN
536 IF( ddweights(1,1,iabs(mid))/=0)
THEN
537 tmat = ddweights(1,1,iabs(mid)) * tpsref
539 IF(mult/=0) tmatadd = mult * (sol1tnl(mln,indi)-sol1tnl(mln,indi2))
540 IF(add_option/=0) tmatadd = opt_1 * sol1tnl(mln,indi_opt_1) + opt_2 * sol1tnl(mln,indi_opt_2)
541 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
542 tmat = sol1tnl(mln,indi) + tmatadd
548 trup = trup + rupture_sol(irup_tab(j),irup2)
552 telt = tmat + soltelt(1) + trup + mult_spe*nlocal_option(spe_i_3) + add_over_cost +
visc_prony
553 ELSEIF (jhbe==2)
THEN
555 IF( ddweights(1,1,iabs(mid))/=0)
THEN
556 tmat = ddweights(1,1,iabs(mid)) * tpsref
558 IF(mult/=0) tmatadd = mult * (sol1tnl(mln,indi)-sol1tnl(mln,indi2))
559 IF(add_option/=0) tmatadd = opt_1 * sol1tnl(mln,indi_opt_1) + opt_2 * sol1tnl(mln,indi_opt_2)
560 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
561 tmat = sol1tnl(mln,indi) + tmatadd
567 trup = trup + rupture_sol(irup_tab(j),irup2)
571 telt = tmat + soltelt(2) + trup + mult_spe*nlocal_option(spe_i_3) + add_over_cost +
visc_prony
572 ELSEIF (jhbe==24.OR.jhbe==104)
THEN
574 IF( ddweights(1,1,iabs(mid))/=0)
THEN
575 tmat = ddweights(1,1,iabs(mid)) * tpsref
577 IF(mult/=0) tmatadd = mult * (sol1tnl(mln,indi)-sol1tnl(mln,indi2))
578 IF(add_option/=0) tmatadd = opt_1 * sol1tnl(mln,indi_opt_1) + opt_2 * sol1tnl
579 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
580 tmat = sol1tnl(mln,indi) + tmatadd
586 trup = trup + rupture_sol(irup_tab(j),irup2)
590 telt = tmat + soltelt(3) + trup + mult_spe*nlocal_option(spe_i_3) + add_over_cost +
visc_prony
592 ELSEIF (jhbe==12)
THEN
594 IF( ddweights(1,1,iabs(mid))/=0)
THEN
595 tmat = ddweights(1,1,iabs(mid)) * tpsref
597 IF(mult/=0) tmatadd = mult * (sol8tnl(mln,indi)-sol8tnl(mln,indi2))
598 IF(add_option/=0) tmatadd = opt_1 * sol8tnl(mln,indi_opt_1) + opt_2 * sol8tnl(mln,indi_opt_2)
599 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
600 tmat = sol8tnl(mln,indi) + tmatadd
606 trup = trup + rupture_sol12(irup_tab(j),irup2)
610 telt = tmat + soltelt(4) + trup + mult_spe*nlocal_option(spe_i_3) + 8.*(add_over_cost +
visc_prony)
611 ELSEIF ( (jhbe==14.OR.(jhbe>=222.AND.jhbe<=999)).AND.(igt/=20.AND.igt/=21.AND.igt/=22))
THEN
614 nptr =
max(mpt/100,1)
615 npts =
max(mod(mpt/10,10),1)
616 nptt =
max(mod(mpt,10),1)
617 nptot = npts*nptt*nptr
619 IF( ddweights(1,1,iabs(mid))/=0)
THEN
620 tmat = ddweights(1,1,iabs(mid)) * tpsref
622 IF(mult/=0) tmatadd = mult * (sol1tnl(mln,indi)-sol1tnl(mln,indi2))
623 IF(add_option/=0) tmatadd = opt_1 * sol1tnl(mln,indi_opt_1) + opt_2 * sol1tnl(mln,indi_opt_2)
624 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
625 tmat = sol1tnl(mln,indi) + tmatadd
631 trup = trup + rupture_sol(irup_tab(j),irup2)
638 IF(nptot>8) overcost_elm = nptot-8
639 telt = nptot*(tmat+trup+add_over_cost+
visc_prony)+soltelt(5) +overcost_elm *soltelt(6) +
640 . mult_spe*nlocal_option(spe_i_3)
641 ELSEIF(jhbe==14.AND.(igt==20.OR.igt==21.OR.igt==22))
THEN
644 nptr =
max(mpt/100,1)
645 npts =
max(mod(mpt/10,10),1)
646 nptt =
max(mod(mpt,10),1)
647 nptot = npts*nptt*nptr
649 IF( ddweights(1,1,iabs(mid))/=0)
THEN
650 tmat = ddweights(1,1,iabs(mid)) * tpsref
652 IF(mult/=0) tmatadd = mult * (sol1tnl(mln,indi)-sol1tnl(mln,indi2))
653 IF(add_option/=0) tmatadd = opt_1 * sol1tnl(mln,indi_opt_1) + opt_2 * sol1tnl(mln,indi_opt_2)
654 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
659 IF(igeo(30,pid)>9)
THEN
660 number_layer = igeo(30,pid)
664 overcost_elm = npts*nptt
665 ELSEIF(icpr==10)
THEN
666 overcost_elm = nptt*nptr
668 overcost_elm = npts*nptr
673 number_layer = igeo(30,pid)
677 overcost_elm = npts*nptt
678 ELSEIF(icpr==10)
THEN
680 overcost_elm = nptt*nptr
683 overcost_elm = npts*nptr
689 IF(composite_option)
THEN
690 DO nlay=1,number_layer
691 composite_mid = igeo(100+nlay,pid)
692 composite_mln = nint(pm(19,abs(composite_mid)))
693 tmatadd = tmatadd + sol1tnl(composite_mln,indi)
695 tmatadd = tmatadd - sol1tnl(mln,indi)
697 tmat = sol1tnl(mln,indi) + tmatadd
703 trup = trup + rupture_sol(irup_tab
709 telt = overcost_elm*(tmat+
visc_prony)+nptot*trup +
710 . overcost_elm*number_layer*soltelt(10) + mult_spe*nlocal_option(spe_i_3) +
711 . overcost_elm * add_over_cost
712 ELSEIF(jhbe==15)
THEN
716 IF( ddweights(1,1,iabs(mid))/=0)
THEN
717 tmat = ddweights(1,1,iabs(mid)) * tpsref
719 IF(mult/=0) tmatadd = mult * (sol1tnl(mln,indi)-sol1tnl(mln,indi2))
720 IF(add_option/=0) tmatadd = opt_1 * sol1tnl(mln,indi_opt_1) + opt_2
721 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
722 tmat = sol1tnl(mln,indi) + tmatadd
728 trup = trup + rupture_sol(irup_tab
735 telt = nptot*(tmat+trup+
visc_prony) + soltelt(11) + nptot*soltelt(12) +
736 . mult_spe*nlocal_option(spe_i_3) + add_over_cost
738 ELSEIF (jhbe==17)
THEN
741 IF( ddweights(1,1,iabs(mid))/=0)
THEN
742 tmat = ddweights(1,1,iabs(mid)) * tpsref
744 IF(mult/=0) tmatadd = mult * (sol1tnl(mln,indi)-sol1tnl(mln,indi2))
745 IF(add_option/=0) tmatadd = opt_1 * sol1tnl(mln,indi_opt_1) + opt_2 * sol1tnl(mln,indi_opt_2)
746 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
747 tmat = sol1tnl(mln,indi) + tmatadd
753 trup = trup + rupture_sol(irup_tab(j),irup2)
757 telt = (tmat+trup+add_over_cost+
visc_prony)*8 + soltelt(7) + mult_spe*nlocal_option(spe_i_3)
758 ELSEIF (jhbe==18)
THEN
760 IF( ddweights(1,1,iabs(mid))/=0)
THEN
761 tmat = ddweights(1,1,iabs(mid)) * tpsref
763 IF(mult/=0) tmatadd = mult * (sol1tnl(mln,indi)-sol1tnl(mln,indi2))
764 IF(add_option/=0) tmatadd = opt_1 * sol1tnl(mln,indi_opt_1) + opt_2 * sol1tnl(mln,indi_opt_2)
765 IF(special_option/=0) tmatadd = tmatadd + sol_option(spe_i_1,spe_i_2)
766 tmat = sol1tnl(mln,indi) + tmatadd
772 trup = trup + rupture_sol(irup_tab(j),irup2)
776 telt = (tmat+trup+add_over_cost+
visc_prony)*8 + soltelt(9) + mult_spe*nlocal_option(spe_i_3)
782 trup = trup + rupture_sol(irup_tab(j),irup2)
786 telt = sol1tnl(mln,1) + soltelt(1) + trup
787 . + mult_spe*nlocal_option(spe_i_3) + add_over_cost +
visc_prony
792 poids = telt * invtref
794 IF(recherche==0)
THEN
797 poin_part = iparts(i)
798 IF (isol==4.AND. (jsrot /= 1))
THEN
800 ELSEIF( (isol==10).OR.(isol==4.AND. jsrot==1) )
THEN
811 ELSEIF(isol==16)
THEN
813 ELSEIF(isol==20)
THEN
820 poin_mid = poin_part_sol(1,poin_part,poin_elm_typ)
821 poin_pid = poin_part_sol(2,poin_part,poin_elm_typ)