Télécharger endo3d.eso

Retour à la liste

Numérotation des lignes :

endo3d
  1. C ENDO3D SOURCE FD218221 24/02/07 21:15:10 11834
  2. subroutine endo3d(XMAT,NMAT,sig0,sigf,deps,nstrs,
  3. # VAR0,VARF,NVARI,nbelas3d,teta1,teta2,dt,ierr1,iso,mfr,ifou,
  4. # istep,epst0,epstf,NBRFLU3D,NBSUPP3D,
  5. c #NBRENF3D,NBPARR3D,
  6. # NMAT1,NMAT2,NVARFLU3D,NVARSUP3D,NBVSCAL,NBVTENS,NBVPTENS,
  7. c NVARENF3D,
  8. # NBNMAX3D,NBNB3D,IDIMB3D,XE3D,tetaref)
  9. C # NBNLOC3D,INLVIA3D,NBVIA3D,NBNLISO,NBNLUNI,NBPARISO,
  10. C # NBPARUNI,NBVARNL3D,NBVARISO,NBVARUNI,METHODNL,DHI,DHU,VU,
  11. C # IVALMAT3D)
  12.  
  13.  
  14. c tables de dimension fixe pour resolution des sytemes lineaires
  15. implicit real*8 (a-h,o-z)
  16. implicit integer (i-n)
  17.  
  18. c *** declaration complementaires si renforts **********************
  19.  
  20. c nombre maxi de renforts==NBRENF3D
  21. c integer NBRENF
  22. c nombre de parametres materiaux par renfort==NBPARR3D
  23. c integer NBPARR
  24. c nombre de variables internes par renfort NVARENF==NVARENF3D
  25. c integer NVARENF
  26. c dimension compatibles avec cfluendo et idvar4
  27. c parameter (NBRENF=0,NBPARR=25,NVARENF=25)
  28. c si NBRENF >0 inclure le fichier de declare_rnfr3d.h
  29.  
  30. c *** declaration pour le non local ********************************
  31. C include './declare_non_local3d.h'
  32.  
  33. c precision
  34. real*8 precision3d
  35. parameter(precision3d=1.0d-8)
  36. c nombre maxi de sous iterations
  37. integer itermax,iprint
  38. parameter(itermax=50000,iprint=itermax-100)
  39. c endommagement maxi
  40. real*8 dmaxi
  41. parameter (dmaxi=1.d0-precision3d)
  42. c methode de prise en compte de l endo post pic de cisaillement
  43. logical orthodp
  44. parameter (orthodp=.false.)
  45.  
  46. c variable logique pour matrice init isotrope
  47. logical iso
  48.  
  49. c decalage Gauss pour la plasticite en cas de fluage nf0
  50. c et decalage de la taille nmat1, ifou numero de la formulation
  51. integer nf0,nmat1,nmat2,ifou,istep
  52.  
  53. c *** nombre de parametres materiaux *******************************
  54. integer NBRFLU3D,NBSUPP3D,NBRENF3D
  55. c nombre de parametres materiau par renfort
  56. c integer NBPARR3D
  57. c *** nombre de vari scalaire et pseudovecteur *********************
  58. integer NBVSCAL,NBVTENS,NBVPTENS
  59. c compteur associees
  60. integer iscal,itens,icomp3d
  61.  
  62. c *** nombre de variables internes *********************************
  63. c nombre de variables internes
  64. integer NVARFLU3D,NVARSUP3D
  65. c nombre de variables internes par renfort
  66. c integer NVARENF3D
  67.  
  68. c **** tableau des coordonnees des neouds de l element *************
  69. integer NBNMAX3D,NBNB3D,IDIMB3D
  70. real*8 xe3d(3,NBNMAX3D)
  71. c methode de calcul de la taille des elements
  72. logical Mjacob,Mnoeuds
  73. parameter (Mjacob=.false.,Mnoeuds=.true.)
  74.  
  75. c *** declaration des variables externes ***************************
  76. integer nmat,nstrs,NVARI,nbelas3d,ierr1,mfr
  77. real*8 xmat(nmat),sig0(nstrs),sigf(nstrs),deps(nstrs)
  78. integer IVALMAT3D(nmat)
  79. real*8 epst0(nstrs),epstf(nstrs)
  80. real*8 var0(NVARI),varf(NVARI)
  81. real*8 dt,teta1,teta2,tetaref
  82.  
  83. c *** tableau pour la resolution des systemes lineaires ************
  84. c taille maxi du systeme lineaire
  85. integer ngf
  86. parameter (ngf=65)
  87. real*8 XN(ngf),BN(ngf),ANN(ngf,(ngf+1))
  88. integer ipzero(ngf)
  89. c variable de controle d erreur dans methode de gauss
  90. integer errgauss
  91.  
  92. c **** variables locales a plastendo3d *****************************
  93. c criteres
  94. integer ncr
  95. parameter (ncr=5)
  96. logical actif(ncr)
  97. real*8 fcr(ncr)
  98. c parametres materiaux donnes
  99. real*8 young,nu,rt,ept,gft,ref,gfr,rc,epc,delta,beta,dcpp,dcpk
  100. real*8 ekdc,poro,pcc,mcc,ppcc,pfcc
  101. c coeff elastique
  102. real*8 MK,MG
  103. c variables generales
  104. integer i,j,k,l
  105. c indicateur premier passage
  106. logical ppas
  107. c coeff pour theta methode
  108. real*8 theta
  109. parameter (theta=0.5d0)
  110. C cohesions de DP
  111. real*8 Cdp_min,Cdp_max,Rcmin
  112. c pression de consolidation de CC
  113. real*8 Ptmax,Pt,Pcmin,Pc
  114. c indicateur d endommagement prepic
  115. logical logdtpp,logdcpp
  116. c resistance effective et endommagement prepic
  117. real*8 dtppmax,dcppmax,rteff,rceff
  118. c invariant de la deformation plastique de DP
  119. real*8 EPLDPV,EPLDPD
  120. c invariant de la deformation plastique de CC
  121. real*8 EPLCCV,EPCCD
  122. c deformations elastique et plastique de compression
  123. real*8 EEPC,EPLPIC,EDPPIC
  124. c module d ecrouissage
  125. real*8 Hcc,Hdp
  126. c vecteur de deformations mecaniques
  127. real*8 deps6(6),epst06(6),epstf6(6)
  128. c matrice deps
  129. real*8 deps33(3,3),deps3(3),vdeps33(3,3),vdeps33t(3,3)
  130. c contraintes effectives
  131. real*8 dsig3(3),dsig6(6),sigef33(3,3),sigef3(3),vsigef33(3,3)
  132. c contraintes bornées utilisees dans DP et CC
  133. real*8 sigdp3(3)
  134. c tenseurs variables internes DP et CC debut de pas
  135. real*8 EPLDP6(6),EPLCC6(6)
  136. c fin de passage
  137. real*8 epldp6f(6),eplcc6f(6)
  138. c plasticite de traction
  139. real*8 eplr60(6),eplr6f(6),eplr33(3,3),eplr3(3)
  140. c gestion des ouvertures de fissures
  141. real*8 wplt06(6),wplt6(6),wpltx06(6)
  142. real*8 wpltx6(6),wpl3(3),vwpl33(3,3),vwpl33t(3,3)
  143. real*8 wplx3(3),vwplx33(3,3),vwplx33t(3,3)
  144. c contraintes finales
  145. real*8 sigef6(6),sigf6d(6),sigf6(6),sigt6(6),sigt6d(6)
  146. c pseudo tenseur auxiliaire
  147. real*8 xp6(6),xp33(3,3),vxp33(3,3),vxp33t(3,3),xp3(3)
  148. real*8 aux3(3)
  149. c logique pour reduire l increment
  150. logical log_reduc,ecoul
  151. real*8 reduc
  152. integer iter
  153. c endommagement
  154. real*8 umdt
  155. c contrainte hydrique
  156. real*8 sigp
  157. c base ouverture des fissures
  158. real*8 depr3(3),vdepr33(3,3),vdepr33t(3,3),dir3(3),long3(3)
  159. c increment def plastique traction
  160. real*8 deplr3(3),deplr6(6)
  161. c increment def plastique dp
  162. real*8 depldp3(3),depldp6(6)
  163. c increment def plastique cc
  164. real*8 deplcc3(3),deplcc6(6)
  165. c increment de def elastique pour retour radial
  166. real*8 depse3(3),depse6(6)
  167. c multiplicateurs plastiques
  168. real*8 lr1,lr2,lr3,ldp,lcc
  169. c parametre de la loi de reduction thermique pour rc,rt,e
  170. c ordre defini dans idvic et idvar4
  171. real*8 tt0(3),tt1(3),mtt(3),ptt(3),red(3)
  172. integer ntt
  173. parameter (ntt=4)
  174. c prise en compte variation module due a theta
  175. real*8 dx,dMK,dMG
  176. c compte sur la boucle de reduction d increment plastique
  177. integer jter
  178. c exposant endommagement prepic
  179. real*8 m1,dcpp0,dpic,spic,smin,s
  180. c endommagements de traction-refermeture
  181. real*8 dt3(3),ref3(3),wkt
  182. c calcul de la matrice d endo orthotrope
  183. real*8 sn3(3),dt66(6,6)
  184. c partition des contraintes effectives
  185. real*8 sigf3(3),vsigf33(3,3),vsigf33t(3,3)
  186. real*8 sigft6(6),sigfc6(6),sigfc3(3),sigft3(3)
  187. real*8 sigft6p(6),sigft6d(6),sigft6dp(6)
  188. c refermeture des fissures
  189. real*8 dr66(6,6)
  190. real*8 sigfc6p(6),sigfc6dp(6),sigfc6d(6)
  191. real*8 sigf61(6),sigft61(6)
  192. real*8 sigf62(6),sigft62(6)
  193. c flambage des bielttes comprimees
  194. real*8 dct3(3)
  195. c coeff de couplage endo traction/flambage bielettes de compression
  196. real*8 altc,dctmax
  197. c endo ortho de DP
  198. real*8 dcc3(3),dcdp,dcom,pentendo,nendo
  199. c indicateur de mise a zero du reducteur de retour plastique
  200. logical log_reduc_zero,log_err
  201.  
  202. c ***** declaration parametres materiaux des renforts repartis *****
  203. c include './declare_rnfr3d.h'
  204. c ! ne rien déclarer apres cet include qui contient des commandes !
  205.  
  206. c***********************************************************************
  207. c initialisation des parametres
  208.  
  209. c ** indicateur de premier passage
  210. if (var0(1).ne.1.) then
  211. ppas=.true.
  212. else
  213. ppas=.false.
  214. end if
  215.  
  216. c initialisation de la variable de controle d erreur
  217. ierr1=0
  218.  
  219.  
  220. c *********** chargement des parametres materiaux depuis xmat ******
  221.  
  222. c Module d young
  223. young=xmat(1)
  224. c coefficient de Poisson
  225. nu=xmat(2)
  226. c calcul des autres coeffs elastiques
  227. MK=young/(3.d0*(1.d0-2.0d0*nu))
  228. MG=young/(2.d0*(1.d0+nu))
  229. c resistance a la traction
  230. rt=xmat(nbelas3d+1)
  231. c deformation au pic de traction
  232. ept=xmat(nbelas3d+2)
  233. if (ept.eq.0.) then
  234. ept=rt/young
  235. end if
  236. c energie de fissuration en traction directe
  237. gft=xmat(nbelas3d+3)
  238. if (gft.eq.0.) then
  239. print*,'Il manque l energie de fissuration GFT ds plasendo3d '
  240. ierr1=1
  241. end if
  242. c seuil pour la refermeture des fissures
  243. ref=xmat(nbelas3d+4)
  244. if(ref.lt.(precision3d*rt)) then
  245. ref=rt*precision3d
  246. end if
  247. c energie de fissuration pour l endo de traction
  248. gfr=xmat(nbelas3d+5)
  249. if(gfr.eq.0.) then
  250. print*,'Il manque l energie de refermeture GFR ds plastendo3d'
  251. ierr1=1
  252. end if
  253. c resistance en compression-par cisaillement
  254. rc=xmat(nbelas3d+6)
  255. c deformation au pic de compression
  256. epc=xmat(nbelas3d+7)
  257. c endommagement au pic de compression
  258. dcpk=xmat(nbelas3d+8)
  259. c coeff drucker prager
  260. delta=xmat(nbelas3d+9)
  261. c coeff dilatance de cisaillement
  262. beta=xmat(nbelas3d+10)
  263. c deformation caracteristique endo de compression
  264. ekdc=xmat(nbelas3d+11)
  265. if(ekdc.eq.0.) then
  266. print*,'il manque EKDC dans plastendo3d'
  267. ierr1=1
  268. end if
  269. c porosite initiale
  270. poro=xmat(nbelas3d+12)
  271. c Module d ecrouissage initial pour Cam Clay
  272. mcc=xmat(nbelas3d+13)
  273.  
  274. c recup des caracteristiques pour la reduc thermique
  275. do i=1,3
  276. tt0(i)=xmat(nbelas3d+14+(i-1)*ntt+1)
  277. tt1(i)=xmat(nbelas3d+14+(i-1)*ntt+2)
  278. mtt(i)=xmat(nbelas3d+14+(i-1)*ntt+3)
  279. ptt(i)=xmat(nbelas3d+14+(i-1)*ntt+4)
  280. c print*,tt0(i),tt1(i),mtt(i),ptt(i)
  281. end do
  282. c coeff de couplage endo traction/endo compression
  283. altc=xmat(nbelas3d+27)
  284. c pression de préconsolidation (initiale) pour camclay
  285. ppcc=xmat(nbelas3d+28)
  286. c pour eviter une singulariute sur le gradient de CC iso avec pt=pc
  287. c il faut PPCC>RT
  288. if(ppcc.lt.rt*(1.d0+precision3d)) then
  289. print*,'Dans endo3d il faut PPCC>Rt'
  290. ierr1=1
  291. endif
  292. c pression de fin de consolidation pour CamClay
  293. pfcc=xmat(nbelas3d+14)
  294.  
  295. c***********************************************************************
  296. c initialisation des variables internes finales
  297. c***********************************************************************
  298.  
  299. do iscal=1,NBVSCAL
  300. varf(iscal)=var0(iscal)
  301. end do
  302. do itens=1,NBVTENS
  303. do ICOMP3D=1,NBVPTENS
  304. nv3d=NBVSCAL+(ITENS-1)*NBVPTENS+ICOMP3D
  305. varf(nv3d)=var0(nv3d)
  306. end do
  307. end do
  308.  
  309. c***********************************************************************
  310. c prise en compte de la temperature
  311. c***********************************************************************
  312.  
  313.  
  314. c *** reduction des proprietes mecaniquess *************************
  315.  
  316. c actualisation de la temperature maximale atteinte
  317. varf(15)=max(var0(15),teta2)
  318.  
  319. c calcul de la reduction fin de pas
  320. do i=1,3
  321. call thed3d(teta2,tt0(i),tt1(i),mtt(i),ptt(i),red(i))
  322. c print*,'red(',i,')=',red(i)
  323. c le coeff de reductin thermique ne peut pas reaugmenter
  324. if(.not.ppas) then
  325. red(i)=min(red(i),var0(11+i))
  326. end if
  327. varf(11+i)=red(i)
  328. end do
  329. c ppt meca effectees par la temperature
  330. c compression et parametres associes
  331. rc=rc*red(1)
  332. c epc=epc/red(1)
  333. c traction et parametres associes
  334. rt=rt*red(2)
  335. gft=gft*red(2)
  336. ref=ref*red(2)
  337. gfr=gfr*red(2)
  338. c module d young et deformations associees
  339. young=young*red(3)
  340.  
  341.  
  342. c ** prise en compte de la variation du module *********************
  343.  
  344. c variation du coeff de reduction du module
  345. dx=varf(14)-var0(14)
  346. c rajout de dE*epse sir le module varie
  347. if((abs(dx).gt.precision3d).and.(.not.ppas)) then
  348. c le module d Young a varie
  349. c recup def elastique pas precedent
  350. ITENS=2
  351. do ICOMP3D=1,6
  352. nv3d=NBVSCAL+(ITENS-1)*NBVPTENS+ICOMP3D
  353. xp6(ICOMP3D)=var0(nv3d)
  354. end do
  355. c modification de la contrainte du a la variation du module
  356. dMK=dx*MK
  357. dMG=dx*MG
  358. c diagonalisation du vecteur des deformations elastiques
  359. call x6x33(xp6,xp33)
  360. call b3_v33(xp33,xp3,vxp33)
  361. c increment de contrainte associees
  362. call DSDE3D(dsig3,xp3,dMK,dMG)
  363. c passage en base fixe
  364. call CHRE36(dsig3,dsig6,vxp33)
  365. c mise a jour des contraintes
  366. ITENS=1
  367. do ICOMP3D=1,6
  368. nv3d=NBVSCAL+(ITENS-1)*NBVPTENS+ICOMP3D
  369. varf(nv3d)=varf(nv3d)+dsig6(ICOMP3D)
  370. sigef6(ICOMP3D)=varf(nv3d)
  371. c print*,'dans endo3d A sigef(',icomp3d,')=',sigef6(icomp3d)
  372. end do
  373. c read*
  374. end if
  375.  
  376. c actualisation des coeffs elastiques
  377. MK=young/(3.d0*(1.d0-2.0d0*nu))
  378. MG=young/(2.d0*(1.d0+nu))
  379.  
  380. c ***********test de coherence des donnees pour la matrice *********
  381.  
  382. c ** existance d un endommagement pre pic en traction **************
  383.  
  384. if (ept.gt.((rt/young)*(1.d0+precision3d)))then
  385. c il existe un endommagement pre pic en traction
  386. logdtpp=.true.
  387. c endo pre pic maxi
  388. dtppmax=1.d0-rt/(young*ept)
  389. rteff=rt/(1.d0-dtppmax)
  390. else
  391. logdtpp=.false.
  392. dtppmax=0.d0
  393. ept=rt/young
  394. rteff=rt
  395. end if
  396. c on continue avec rteff
  397. rt=rteff
  398. c deformation elastique au pic de traction
  399. EEPT=rt/young
  400. c pas de plasticite pre pic en traction
  401. EPPT=0.d0
  402. c deformation au pic de traction
  403. EPT=EEPT
  404.  
  405. c ** existance d un endommagement pre pic en compression ***********
  406.  
  407. c ** verif validite de la dilatance
  408. if(beta.gt.(sqrt(3.d0)*(1.d0-precision3d))) then
  409. print*,'Dilatance beta excessive dans plastendo3d'
  410. ierr1=1
  411. end if
  412.  
  413. c ** verif validite de l angle de frottement
  414. if(delta.gt.(sqrt(3.d0)*(1.d0-precision3d))) then
  415. print*,'Coeff de confinement excessif dans plastendo3d'
  416. ierr1=1
  417. end if
  418.  
  419. if(dcpk.gt.precision3d) then
  420. c on veut un endo de compression pre pic
  421. if(epc.gt.((rc/young)*(1.d0+precision3d))) then
  422. c endo pre pic compression possible
  423. logdcpp=.true.
  424. if(dcpk.le.(1.d0-rc/(young*epc)))then
  425. c l endommagement prepic de compression est conserve
  426. dcppmax=dcpk
  427. else
  428. c l endommagement pre pic est trop grand , on le limite
  429. dcppmax=1.d0-rc/(young*epc)
  430. end if
  431. rceff=rc/(1.d0-dcppmax)
  432. else
  433. c endo compression impossible
  434. c print*,'dcpp,Rc, et EPC sont incompatibles'
  435. c ierr1=1
  436. logdcpp=.false.
  437. dcppmax=0.d0
  438. rceff=rc
  439. end if
  440. else
  441. c pas d endo de compression
  442. logdcpp=.false.
  443. dcppmax=0.d0
  444. rceff=rc
  445. end if
  446. c deformation elastique au pic de compression
  447. EEPC=rceff/young
  448. c deformation plastique au pic de compression
  449. EPLPIC=EPC-EEPC
  450. c deformation plastique equivalente au pic de compression
  451. EDPPIC= 0.3D1 * eplpic / (sqrt(0.3D1) - beta)
  452. c on continue avec rceff
  453. rc=rceff
  454.  
  455. c *** initialisation des parametres calculees a partir des donnees *
  456.  
  457. c cohesion finale de drucker prager pour atteindre Rc
  458. Cdp_max=rc*(1.d0/sqrt(3.d0)-delta/3.d0)
  459. c cohesion initiale de Drucker prager pour activer Rankine en
  460. c avant d'activer DP
  461. Cdp_min = Rt * delta
  462. c Cdp_minmanuel=0.8*rc*(1.d0/sqrt(3.d0)-delta/3.d0)
  463. c Cdp_min = min(max(Rt * delta, Rt*(1.d0/sqrt(3.d0)
  464. c # +(2.d0*delta/3.d0)),Cdp_minmanuel),0.9*Cdp_max*(1.0-dcppmax))
  465. Cdp_min = min(max(Rt * delta, Rt*(1.d0/sqrt(3.d0)
  466. # +(2.d0*delta/3.d0))),0.9*Cdp_max*(1.0-dcppmax))
  467. c coherence Rt, Rc pour que les Rankine et DP puissent etres actifs
  468. if((Cdp_min*(1.d0+precision3d)).gt.Cdp_max) then
  469. print*,'Rt/Rc trop grand dans plastendo3d pour activer DP'
  470. print*,'il faut: Rt/Rc< (sqrt(3)-delta)/(sqrt(3)+2*delta):'
  471. ierr1=1
  472. end if
  473.  
  474. c *** initialisation des pressions de consolidation ****************
  475.  
  476. if(ppcc.lt.precision3d*rt) then
  477. print*,'dans ENDO3D'
  478. print*,'La pression de preconsolidation ne peut pas etre nulle'
  479. print*,'il faut PPCC=',PPCC,'>> ',precision3d*rt
  480. ierr1=1
  481. return
  482. else if (pfcc.lt.ppcc*(1.d0+precision3d)) then
  483. print*,'dans ENDO3D'
  484. print*,'La pression de fin de consolidation ne peut pas '
  485. print*,'etre inferieure a la pression de preconsolidation'
  486. print*,'il faut PFCC=',PFCC,'>> ',PPCC
  487. ierr1=1
  488. return
  489. end if
  490.  
  491.  
  492. c ********** parametres pour le non local **************************
  493.  
  494. C include './initialise_non_local3d.h'
  495.  
  496. c *** bilan analyse des donnees ************************************
  497. if(ierr1.eq.1) then
  498. print*,'Incoherence dans les donnees de plastendo3d '
  499. return
  500. end if
  501.  
  502. c***********************************************************************
  503. c chargement increment de deformation imposee et deformation finale
  504. c***********************************************************************
  505. if(nstrs.lt.6) then
  506. do i=1,nstrs
  507. deps6(i)=deps(i)
  508. epstf6(i)=epstf(i)
  509. epst06(i)=epst0(i)
  510. end do
  511. do i=nstrs+1,6
  512. deps6(i)=0.d0
  513. epstf6(i)=0.d0
  514. epst06(i)=0.d0
  515. end do
  516. else
  517. do i=1,6
  518. deps6(i)=deps(i)
  519. epstf6(i)=epstf(i)
  520. epst06(i)=epst0(i)
  521. end do
  522. end if
  523. c passage en epsilon
  524. do i=4,6
  525. deps6(i)=0.5d0*deps6(i)
  526. epstf6(i)=0.5d0*epstf6(i)
  527. epst06(i)=0.5d0*epst06(i)
  528. end do
  529. c mise a jour deformation elastique dans les varf
  530. ITENS=2
  531. do ICOMP3D=1,6
  532. nv3d=NBVSCAL+(ITENS-1)*NBVPTENS+ICOMP3D
  533. varf(nv3d)=varf(nv3d)+deps6(ICOMP3D)
  534. end do
  535.  
  536.  
  537. c***********************************************************************
  538. c tir elastique
  539. c***********************************************************************
  540.  
  541. c ** directions principales de l increment de deformation *********
  542. c diagonalisation du vecteur des d eps
  543. call x6x33(deps6,deps33)
  544. call b3_v33(deps33,deps3,vdeps33)
  545. c loi elastique
  546. call DSDE3D(dsig3,deps3,MK,MG)
  547. if(dsig3(1).ne.dsig3(1)) then
  548. print*,'Pb2-1 lors du tir elastique dans endo3d'
  549. ierr1=1
  550. return
  551. end if
  552. c passage en base fixe
  553. call CHRE36(dsig3,dsig6,vdeps33)
  554. c mise a jour des contraintes
  555. ITENS=1
  556. do ICOMP3D=1,6
  557. nv3d=NBVSCAL+(ITENS-1)*NBVPTENS+ICOMP3D
  558. varf(nv3d)=varf(nv3d)+dsig6(ICOMP3D)
  559. sigef6(ICOMP3D)=varf(nv3d)
  560. c print*,'dans endo3d A sigef(',icomp3d,')=',sigef6(icomp3d)
  561. end do
  562. c***********************************************************************
  563. c criteres de plasticité et ecoulements
  564. c***********************************************************************
  565.  
  566.  
  567. c ******************************************************************
  568. c recuperation deformation plastique debut et fin de de pas pour
  569. c controle de refermeture
  570. itens=3
  571. do ICOMP3D=1,6
  572. nv3d=NBVSCAL+(ITENS-1)*NBVPTENS+ICOMP3D
  573. eplr60(ICOMP3D)=var0(nv3d)
  574. eplr6f(ICOMP3D)=eplr60(ICOMP3D)
  575. end do
  576. c recuperation des deformation debut et fin de pas pour dp
  577. itens=4
  578. do ICOMP3D=1,6
  579. nv3d=NBVSCAL+(ITENS-1)*NBVPTENS+ICOMP3D
  580. epldp6(ICOMP3D)=var0(nv3d)
  581. epldp6f(ICOMP3D)=epldp6(ICOMP3D)
  582. end do
  583.  
  584. c **********debut des sous iterations locales *********************
  585. iter=0
  586. c mise a jour num iteration plastique
  587. 10 iter=iter+1
  588. c reinitialisation du compteur sur la boucle de reduction de la
  589. c taille de l increment plastique
  590. jter=0
  591.  
  592. c ******************************************************************
  593. c actualisation des parametres ecrouissables des criteres
  594. c ******************************************************************
  595.  
  596. c ***** cohesion de DP (norme du deviateur) ************************
  597.  
  598. c deformation plastique equivalente de DP debut de sous iteration
  599. EPLDPD=varf(9)
  600. c actualisation de la cohesion de DP
  601. if(EDPPIC.gt.precision3d) then
  602. c il existe un ecrouissage pre pic en compression
  603. call ecrp3d(epldpd,edppic,Cdp_min,Cdp_max,Cdp,Hdp)
  604. else
  605. c cohesion max directement
  606. Cdp=Cdp_max
  607. c ecrouissage pre pic neglige
  608. Hdp=0.d0
  609. endif
  610. c stockage de la nouvelle cohesion
  611. varf(2)=Cdp
  612. c actualisation de la resistance a la compression pour DP
  613. Rc=Cdp/(1.d0/sqrt(3.d0)-delta/3.d0)
  614. c if(ppas) then
  615. c print*,'EPLDPD',EPLDPD
  616. c print*,'rcmin',Cdp_min/(1.d0/sqrt(3.d0)-delta/3.d0)
  617. c print*,'rcmax',Cdp_max/(1.d0/sqrt(3.d0)-delta/3.d0)
  618. c print*,'Hdp',hdp
  619. c read*
  620. c end if
  621.  
  622. c **** pressions limites pour camclay ******************************
  623.  
  624. c prise en compte de la deformation volumique de CamClay
  625. EPLCCV=0.d0
  626. ITENS=5
  627. do ICOMP3D=1,6
  628. nv3d=NBVSCAL+(ITENS-1)*NBVPTENS+ICOMP3D
  629. EPLCC6(ICOMP3D)=varf(nv3d)
  630. if(ICOMP3D.le.3) then
  631. EPLCCV=EPLCCV+EPLCC6(ICOMP3D)
  632. end if
  633. end do
  634. c print*,'endo3d pbcc', eplccv,iter
  635. c actualisation pc et pt en fonction de de la variation de volume
  636. call PCCD3D(precision3d,poro,EPLCCV,ppcc,pfcc,pc,rt,pt)
  637. if(pc.ne.pc.or.pt.ne.pt) then
  638. print*,'Pb4 dans endo3: calcul de pc et pt de CamClay'
  639. print*,'precision3d,poro,EPLCCV,ppcc,pfcc,pc,rt,pt'
  640. print*,precision3d,poro,EPLCCV,ppcc,pfcc,pc,rt,pt
  641. ierr1=1
  642. return
  643. else
  644. varf(3)=pc
  645. varf(4)=pt
  646. end if
  647. c actualisation du module tangent de CamClay
  648. c (si EPLCCV mis a zero : on garde un ecrouissage constant)
  649. call HCCD3D(pfcc,ppcc,poro,EPLCCV,Hcc)
  650. c **** tir elastique ***********************************************
  651.  
  652. c diagonalisation du vecteur des contraintes effectives
  653. call x6x33(sigef6,sigef33)
  654. if(sigef33(1,1).ne.sigef33(1,1)) then
  655. print*,'Pb3 dans endo3d sigef6',sigef6
  656. print*,'iter',iter,' jter',jter
  657. do i=1,ncr
  658. write(*,100) 'critere:',i,'activite:',
  659. # actif(i),'fcr(',i,'):',fcr(i)
  660. end do
  661. do itens=1,7
  662. do ICOMP3D=1,6
  663. nv3d=NBVSCAL+(ITENS-1)*NBVPTENS+ICOMP3D
  664. print*,'Itenseur',itens,'v(',icomp3d,')=',varf(nv3d)
  665. end do
  666. end do
  667. ierr1=1
  668. return
  669. end if
  670. call b3_v33(sigef33,sigef3,vsigef33)
  671. c deformation plastique normale de Rankine dans la base principales
  672. call chrep6(eplr6f,vsigef33,.false.,xp6)
  673. do i=1,3
  674. eplr3(i)=xp6(i)
  675. end do
  676. c ***** test activite des criteres ********************************
  677.  
  678. call CREN3D(sigef3,precision3d,Rt,Rc,Ref,eplr3,
  679. # sigdp3,Cdp,delta,Mcc,pt,pc,ncr,actif,fcr,ppcc,pfcc,poro,eplccv)
  680. if(ierr1.eq.1) return
  681. c affichage des causes de sous iterations
  682. 100 format (a9,i2,1x,a9,l1,1x,a4,i1,a2,e10.3)
  683. if(iter.ge.iprint) then
  684. print*,'Endo3d sous iteration locale:',iter
  685. do i=1,ncr
  686. write(*,100) 'critere:',i,'activite:',
  687. # actif(i),'fcr(',i,'):',fcr(i)
  688. end do
  689. if (iter.eq.(itermax+1)) then
  690. print*,'Nbr maxi de sous iterations locales'
  691. print*,'atteint dans endo3d: ', iter-1
  692. ierr1=1
  693. return
  694. end if
  695. end if
  696. c test necessite de l ecoulement
  697. 20 ecoul=.false.
  698. do i=1,ncr
  699. ecoul=ecoul.or.actif(i)
  700. end do
  701. if ((jter.ge.iprint).and.ecoul) then
  702. print*,'Criteres residuels pour iteration ',iter
  703. do i=1,ncr
  704. if ((iter.ge.iprint).or.(jter.ge.iprint)) then
  705. print*,'dans endo3d actif(',i,')=',actif(i)
  706. write(*,100) 'critere:',i,'activite:',
  707. # actif(i),'fcr(',i,'):',fcr(i)
  708. end if
  709. end do
  710. end if
  711. c print*,'dans endo3d ecoul:',ecoul
  712. c reinitialisation du log_reduc
  713. log_reduc=.false.
  714. c retour le cas echeant
  715. if(ecoul) then
  716. c initialisation des increments
  717. do i=1,3
  718. deplr3(i)=0.d0
  719. depldp3(i)=0.d0
  720. deplcc3(i)=0.d0
  721. end do
  722. c choix de l ecoulement en fonction des criteres actifs
  723. if(actif(1).and.actif(2).and.actif(3)) then
  724. c tri-traction-refermeture
  725. call EPLR3D(MG,MK,sigef3(1),sigef3(2),sigef3(3),
  726. # fcr(1),fcr(2),fcr(3),deplr3,3)
  727. c print*,'endo3d: R1 R2 R3', deplr3(1),deplr3(2),deplr3(2)
  728. c verif eplr3 final > 0
  729. call TSTD3D(fcr,eplr3,deplr3,actif,ncr,
  730. # precision3d,log_reduc,reduc)
  731. c pas cc ni dp
  732. lcc=0.d0
  733. ldp=0.d0
  734. else if (actif(1).and.actif(2).and.actif(4)) then
  735. c 2 Rankine et et un DP
  736. c choix des contraintes limite pour DP
  737. if(fcr(1).gt.0.d0) then
  738. R1=Rt
  739. else
  740. R1=-Ref
  741. end if
  742. if(fcr(2).gt.0.d0) then
  743. R2=Rt
  744. else
  745. R2=-Ref
  746. end if
  747. c calcul des multiplicateurs
  748. call LR12LDP3D(MK,MG,beta,delta,sigef3(1),sigef3(2),
  749. # sigef3(3),Hdp,fcr(1),R1,fcr(2),R2,fcr(4),lr1,lr2,ldp,
  750. # precision3d,log_err)
  751. if(log_err) then
  752. c on resoud par familles de criteres
  753. if(0.5d0*(abs(fcr(1))+abs(fcr(2))).gt.fcr(4)) then
  754. actif(1)=.true.
  755. actif(2)=.true.
  756. actif(4)=.false.
  757. else
  758. actif(1)=.false.
  759. actif(2)=.false.
  760. actif(4)=.true.
  761. end if
  762. c on recommence
  763. goto 20
  764. end if
  765. c print*,'endo3d: R1 R2 et DP ',lr1, lr2 ,ldp
  766. c calcul de l ecoulement de DP
  767. call EPLD3D(R1,R2,sigef3(3),beta,ldp,depldp3)
  768. c ecoulement R1 et R2
  769. deplr3(1)=lr1
  770. deplr3(2)=lr2
  771. deplr3(3)=0.d0
  772. call TSTD3D(fcr,eplr3,deplr3,actif,ncr,
  773. # precision3d,log_reduc,reduc)
  774. c pas cc
  775. lr3=0.d0
  776. lcc=0.d0
  777. else if (actif(2).and.actif(3).and.actif(4)) then
  778. c 2 Rankine et un DP
  779. c choix des contraintes limite pour DP
  780. if(fcr(2).gt.0.) then
  781. R2=Rt
  782. else
  783. R2=-Ref
  784. end if
  785. if(fcr(3).gt.0.) then
  786. R3=Rt
  787. else
  788. R3=-Ref
  789. end if
  790. c calcul des multiplicateurs
  791. call LR12LDP3D(MK,MG,beta,delta,sigef3(2),sigef3(3),
  792. # sigef3(1),Hdp,fcr(2),R2,fcr(3),R3,fcr(4),lr2,lr3,ldp,
  793. # precision3d,log_err)
  794. if(log_err) then
  795. c on resoud par familles de criteres
  796. if(0.5d0*(abs(fcr(2))+abs(fcr(3))).GT.fcr(4)) then
  797. actif(2)=.true.
  798. actif(3)=.true.
  799. actif(4)=.false.
  800. else
  801. actif(2)=.false.
  802. actif(3)=.false.
  803. actif(4)=.true.
  804. end if
  805. c on recommence
  806. goto 20
  807. end if
  808. c print*,'endo3d: R2 R3 et DP ',lr2, lr3 ,ldp
  809. c calcul de l ecoulement de DP
  810. call EPLD3D(R2,R3,sigef3(1),beta,ldp,aux3)
  811. depldp3(1)=aux3(3)
  812. depldp3(2)=aux3(1)
  813. depldp3(3)=aux3(2)
  814. c ecoulement R1 et R2
  815. deplr3(1)=0.d0
  816. deplr3(2)=lr2
  817. deplr3(3)=lr3
  818. call TSTD3D(fcr,eplr3,deplr3,actif,ncr,
  819. # precision3d,log_reduc,reduc)
  820. c pas cc
  821. lcc=0.d0
  822. lr1=0.d0
  823. else if (actif(1).and.actif(3).and.actif(4)) then
  824. c 2 Rankine et et un DP
  825. c choix des contraintes limite pour DP
  826. if(fcr(1).gt.0.) then
  827. R1=Rt
  828. else
  829. R1=-Ref
  830. end if
  831. if(fcr(3).gt.0.) then
  832. R3=Rt
  833. else
  834. R3=-Ref
  835. end if
  836. c calcul des multiplicateurs
  837. call LR12LDP3D(MK,MG,beta,delta,sigef3(1),sigef3(3),
  838. # sigef3(2),Hdp,fcr(1),R1,fcr(3),R3,fcr(4),lr1,lr3,ldp,
  839. # precision3d,log_err)
  840. if(log_err) then
  841. c on resoud par familles de criteres
  842. if(0.5d0*(abs(fcr(1))+abs(fcr(3))).GT.fcr(4)) then
  843. actif(1)=.true.
  844. actif(3)=.true.
  845. actif(4)=.false.
  846. else
  847. actif(1)=.false.
  848. actif(3)=.false.
  849. actif(4)=.true.
  850. end if
  851. c on recommance
  852. goto 20
  853. end if
  854. c print*,'endo3d: R1 R3 et DP ',lr1, lr3 ,ldp
  855. c calcul de l ecoulement de DP
  856. call EPLD3D(R1,R3,sigef3(2),beta,ldp,aux3)
  857. depldp3(1)=aux3(1)
  858. depldp3(2)=aux3(3)
  859. depldp3(3)=aux3(2)
  860. c ecoulement R1 et R3
  861. deplr3(1)=lr1
  862. deplr3(2)=0.d0
  863. deplr3(3)=lr3
  864. call TSTD3D(fcr,eplr3,deplr3,actif,ncr,
  865. # precision3d,log_reduc,reduc)
  866. c pas cc
  867. lcc=0.d0
  868. lr2=0.d0
  869. else if (actif(1).and.actif(2)) then
  870. c bi-traction-refermeture
  871. call EPLR3D(MG,MK,sigef3(1),sigef3(2),sigef3(3),
  872. # fcr(1),fcr(2),fcr(3),deplr3,2)
  873. c print*,'endo3d: R1 et R2 ', deplr3(1),deplr3(2)
  874. c verif eplr3 final > 0
  875. call TSTD3D(fcr,eplr3,deplr3,actif,ncr,
  876. # precision3d,log_reduc,reduc)
  877. c pas cc ni dp
  878. lcc=0.d0
  879. ldp=0.d0
  880. else if (actif(1).and.actif(3)) then
  881. c bi-traction-refermeture
  882. call EPLR3D(MG,MK,sigef3(1),sigef3(3),sigef3(2),
  883. # fcr(1),fcr(3),fcr(2),aux3,2)
  884. c print*,'endo3d: R1 et R3 ', aux3(1),aux3(2)
  885. deplr3(1)=aux3(1)
  886. deplr3(2)=aux3(3)
  887. deplr3(3)=aux3(2)
  888. c verif eplr3 final > 0
  889. call TSTD3D(fcr,eplr3,deplr3,actif,ncr,
  890. # precision3d,log_reduc,reduc)
  891. c pas cc ni dp
  892. lcc=0.d0
  893. ldp=0.d0
  894. else if (actif(2).and.actif(3)) then
  895. c bi-traction-refermeture
  896. call EPLR3D(MG,MK,sigef3(2),sigef3(3),sigef3(1),
  897. # fcr(2),fcr(3),fcr(1),aux3,2)
  898. c print*,'endo3d: R2 et R3 ', aux3(1),aux3(2)
  899. deplr3(1)=aux3(3)
  900. deplr3(2)=aux3(1)
  901. deplr3(3)=aux3(2)
  902. c verif eplr3 final > 0
  903. call TSTD3D(fcr,eplr3,deplr3,actif,ncr,
  904. # precision3d,log_reduc,reduc)
  905. c pas cc ni dp
  906. lcc=0.d0
  907. ldp=0.d0
  908. else if (actif(1).and.actif(4)) then
  909. c 1 rankine et dp actifs
  910. c choix de la contrainte limite pour DP
  911. if(fcr(1).gt.0.) then
  912. R1=Rt
  913. else
  914. R1=-Ref
  915. end if
  916. c multiplicateurs plastiques
  917. call LR1LDP3D(MK,MG,beta,delta,sigef3(1),sigef3(2),
  918. # sigef3(3),Hdp,fcr(1),R1,fcr(4),lr1,ldp,precision3d,
  919. # log_err)
  920. if(log_err) then
  921. if(abs(fcr(1)).gt.fcr(4)) then
  922. actif(1)=.true.
  923. actif(4)=.false.
  924. else
  925. actif(1)=.false.
  926. actif(4)=.true.
  927. end if
  928. goto 20
  929. end if
  930. c print*,'endo3d: R1 et DP ',lr1 ,ldp
  931. c calcul de l ecoulement de DP
  932. call EPLD3D(R1,sigef3(2),sigef3(3),beta,ldp,aux3)
  933. depldp3(1)=aux3(1)
  934. depldp3(2)=aux3(2)
  935. depldp3(3)=aux3(3)
  936. c ecoulement R1 et R2
  937. deplr3(1)=lr1
  938. deplr3(2)=0.d0
  939. deplr3(3)=0.d0
  940. call TSTD3D(fcr,eplr3,deplr3,actif,ncr,
  941. # precision3d,log_reduc,reduc)
  942. c pas cc
  943. lcc=0.d0
  944. else if (actif(2).and.actif(4)) then
  945. c 1 rankine et dp actifs
  946. c choix de la contrainte limite pour DP
  947. if(fcr(2).gt.0.) then
  948. R2=Rt
  949. else
  950. R2=-Ref
  951. end if
  952. c multiplicateurs plastiques
  953. call LR1LDP3D(MK,MG,beta,delta,sigef3(2),sigef3(1),
  954. # sigef3(3),Hdp,fcr(2),R2,fcr(4),lr2,ldp,precision3d,
  955. # log_err)
  956. if(log_err) then
  957. if(abs(fcr(2)).gt.fcr(4)) then
  958. actif(2)=.true.
  959. actif(4)=.false.
  960. else
  961. actif(2)=.false.
  962. actif(4)=.true.
  963. end if
  964. goto 20
  965. end if
  966. c print*,'endo3d: R4 et DP ',lr2 ,ldp
  967. c calcul de l ecoulement de DP
  968. call EPLD3D(R2,sigef3(1),sigef3(3),beta,ldp,aux3)
  969. depldp3(1)=aux3(2)
  970. depldp3(2)=aux3(1)
  971. depldp3(3)=aux3(3)
  972. c ecoulement R1 et R2
  973. deplr3(1)=0.d0
  974. deplr3(2)=lr2
  975. deplr3(3)=0.d0
  976. call TSTD3D(fcr,eplr3,deplr3,actif,ncr,
  977. # precision3d,log_reduc,reduc)
  978. c pas cc
  979. lcc=0.d0
  980. else if (actif(3).and.actif(4)) then
  981. c 1 rankine et dp actifs
  982. c choix de la contrainte limite pour DP
  983. if(fcr(3).gt.0.) then
  984. R3=Rt
  985. else
  986. R3=-Ref
  987. end if
  988. c multiplicateurs plastiques
  989. call LR1LDP3D(MK,MG,beta,delta,sigef3(3),sigef3(2),
  990. # sigef3(1),Hdp,fcr(3),R3,fcr(4),lr3,ldp,precision3d,
  991. # log_err)
  992. if(log_err) then
  993. if(abs(fcr(3)).gt.fcr(4)) then
  994. actif(3)=.true.
  995. actif(4)=.false.
  996. else
  997. actif(3)=.false.
  998. actif(4)=.true.
  999. end if
  1000. goto 20
  1001. end if
  1002. c print*,'endo3d: R3 et DP ',lr3 ,ldp
  1003. c calcul de l ecoulement de DP
  1004. call EPLD3D(R3,sigef3(2),sigef3(1),beta,ldp,aux3)
  1005. depldp3(1)=aux3(3)
  1006. depldp3(2)=aux3(2)
  1007. depldp3(3)=aux3(1)
  1008. c ecoulement R1 et R2
  1009. deplr3(1)=0.d0
  1010. deplr3(2)=0.d0
  1011. deplr3(3)=lr3
  1012. call TSTD3D(fcr,eplr3,deplr3,actif,ncr,
  1013. # precision3d,log_reduc,reduc)
  1014. c pas cc
  1015. lcc=0.d0
  1016. else if (actif(4).and.actif(5)) then
  1017. c DP et CC actifs
  1018. c calcul de derivee de dcc=d(fcc) / d(lcc)
  1019. call DCCD3D(pt,pc,Mcc,Hcc,sigef3(1),sigef3(2),
  1020. # sigef3(3),dcc)
  1021. c calcul des multiplicateurs
  1022. call LCCL3D(Mcc,MK,MG,beta,delta,pt,pc,sigef3(1),
  1023. # sigef3(2),sigef3(3),dcc,Hdp,lcc,ldp,fcr(5),fcr(4),
  1024. # precision3d,log_err)
  1025. if(log_err) then
  1026. if(fcr(5).gt.fcr(4)) then
  1027. actif(5)=.true.
  1028. actif(4)=.false.
  1029. else
  1030. actif(5)=.false.
  1031. actif(4)=.true.
  1032. end if
  1033. goto 20
  1034. end if
  1035. c ecoulement de DP
  1036. call EPLD3D(sigef3(1),sigef3(2),sigef3(3),beta,
  1037. # ldp,depldp3)
  1038. c ecoulement de CC
  1039. call EPLC3D(pt,pc,Mcc,sigef3(1),sigef3(2),sigef3(3),
  1040. # lcc,deplcc3)
  1041. print*,'endo3d: DP et CC actifs ',ldp ,lcc
  1042. c test de proprosité non negative
  1043. call TSTC3D(poro,EPLCCV,deplcc3,precision3d,
  1044. # log_reduc,reduc)
  1045. if(reduc.lt.precision3d) then
  1046. actif(5)=.false.
  1047. fcr(5)=0.d0
  1048. lcc=0.d0
  1049. log_reduc=.true.
  1050. do i=1,3
  1051. deplcc3(i)=0.d0
  1052. end do
  1053. end if
  1054. else if (actif(1)) then
  1055. call EPLR3D(MG,MK,sigef3(1),sigef3(2),sigef3(3),
  1056. # fcr(1),fcr(2),fcr(3),aux3,1)
  1057. c print*,'endo3d: R1 seul ', aux3(1)
  1058. deplr3(1)=aux3(1)
  1059. deplr3(2)=aux3(2)
  1060. deplr3(3)=aux3(3)
  1061. c verif eplr3 final > 0
  1062. call TSTD3D(fcr,eplr3,deplr3,actif,ncr,
  1063. # precision3d,log_reduc,reduc)
  1064. c pas cc ni dp
  1065. lcc=0.d0
  1066. ldp=0.d0
  1067. else if (actif(2)) then
  1068. call EPLR3D(MG,MK,sigef3(2),sigef3(1),sigef3(3),
  1069. # fcr(2),fcr(1),fcr(3),aux3,1)
  1070. c print*,'endo3d: R2 seul ', aux3(1)
  1071. deplr3(1)=aux3(2)
  1072. deplr3(2)=aux3(1)
  1073. deplr3(3)=aux3(3)
  1074. c verif eplr3 final > 0
  1075. call TSTD3D(fcr,eplr3,deplr3,actif,ncr,
  1076. # precision3d,log_reduc,reduc)
  1077. c pas cc ni dp
  1078. lcc=0.d0
  1079. ldp=0.d0
  1080. else if (actif(3)) then
  1081. call EPLR3D(MG,MK,sigef3(3),sigef3(1),sigef3(2),
  1082. # fcr(3),fcr(1),fcr(2),aux3,1)
  1083. c print*,'endo3d: R3 seul ', aux3(1)
  1084. deplr3(1)=aux3(2)
  1085. deplr3(2)=aux3(3)
  1086. deplr3(3)=aux3(1)
  1087. c verif eplr3 final > 0
  1088. call TSTD3D(fcr,eplr3,deplr3,actif,ncr,
  1089. # precision3d,log_reduc,reduc)
  1090. c pas cc ni dp
  1091. lcc=0.d0
  1092. ldp=0.d0
  1093. else if (actif(4)) then
  1094. c Drucker Prager seul
  1095. call LDPD3D(fcr(4),MK,MG,beta,delta,Hdp,ldp)
  1096. c print*,'endo3d: DP seul ',ldp
  1097. c ecoulement de DP
  1098. call EPLD3D(sigef3(1),sigef3(2),sigef3(3),beta,
  1099. # ldp,depldp3)
  1100. c pas de rankine ni de cc
  1101. 200 format(a8,i1,a2,e10.3)
  1102. lcc=0.d0
  1103. else if (actif(5)) then
  1104. c CamClay seul
  1105. c calcul de derivee de dcc=d(fcc) / d(lcc)
  1106. call DCCD3D(pt,pc,Mcc,Hcc,sigef3(1),sigef3(2),
  1107. # sigef3(3),dcc)
  1108. c multiplicateur plastique
  1109. call LCCD3D(pt,pc,Mcc,sigef3(1),sigef3(2),sigef3(3),MK,
  1110. # MG,dcc,fcr(5),lcc,precision3d)
  1111. c print*,'endo3d: CC seul lcc=',lcc
  1112. c print*,pt,pc,Mcc,sigef3(1),sigef3(2),sigef3(3),MK,
  1113. c # MG,dcc,fcr(5),lcc
  1114. c ecoulement cc
  1115. call EPLC3D(pt,pc,Mcc,sigef3(1),sigef3(2),sigef3(3),
  1116. # lcc,deplcc3)
  1117. c do i=1,3
  1118. c print*,'deplcc3(',i,')=',deplcc3(i)
  1119. c end do
  1120. c test de porosité non negative
  1121. call TSTC3D(poro,EPLCCV,deplcc3,precision3d,
  1122. # log_reduc,reduc)
  1123. if(reduc.lt.precision3d) then
  1124. actif(5)=.false.
  1125. fcr(5)=0.d0
  1126. lcc=0.d0
  1127. log_reduc=.true.
  1128. do i=1,3
  1129. deplcc3(i)=0.d0
  1130. end do
  1131. end if
  1132. else
  1133. print*,'configuration imprevue dans endo3d'
  1134. do i=1,5
  1135. print*,'critere:',i,actif(i),' fcr(',i,')=',fcr(i)
  1136. end do
  1137. ierr1=1
  1138. return
  1139. end if
  1140. c read*
  1141. c test de dissipation sur les criteres CC et DP
  1142. if(reduc.lt.precision3d) then
  1143. log_reduc_zero=.true.
  1144. else
  1145. log_reduc_zero=.false.
  1146. end if
  1147. if(((ldp.lt.-precision3d).and.actif(4)) .or.
  1148. # ((lcc.lt.-precision3d).and.actif(5))) then
  1149. c print*,' Endo3d multiplicateurs negatif',ldp,lcc
  1150. c on indique qu il ne faut pas garder ce retour
  1151. log_reduc=.true.
  1152. c on met le retour a zero
  1153. reduc=0.d0
  1154. c indicateur associe
  1155. log_reduc_zero=.true.
  1156. c on desactive les critere fautifs
  1157. if ((ldp.lt.-precision3d).and.actif(4)) then
  1158. c print*,'ldp',ldp
  1159. actif(4)=.false.
  1160. else if ((lcc.lt.-precision3d).and.actif(5)) then
  1161. c print*,'lcc',lcc
  1162. actif(5)=.false.
  1163. else
  1164. print*,'pb6 dans endo3d'
  1165. ierr1=1
  1166. return
  1167. end if
  1168. end if
  1169. c modification de l ecoulement en cas de reduction de la refermeture
  1170. if(log_reduc) then
  1171. c print*,'Cas log_reduc: reduc=',reduc
  1172. do i=1,3
  1173. c print*,'avant reduc deplr3(',i,')=',deplr3(i)
  1174. deplr3(i)=reduc*deplr3(i)
  1175. depldp3(i)=reduc*depldp3(i)
  1176. deplcc3(i)=reduc*deplcc3(i)
  1177. end do
  1178. c reduction des multiplicaterus possiblement utilises apres
  1179. lcc=lcc*reduc
  1180. ldp=ldp*reduc
  1181. c traitement suivant la reduction
  1182. c on recommance l ecoulement sans les criteres desactives
  1183. c dans testref3d
  1184. jter=jter+1
  1185. if(jter.ge.iprint) then
  1186. print*,'sous iteration Endo3d'
  1187. print*,'reduction a la refermeture:',jter
  1188. end if
  1189. if(jter.eq.itermax) then
  1190. print*,'Itermax Reduction a la refartmeture atteint'
  1191. print*,'Criteres residuels pour itertation ',iter
  1192. do i=1,ncr
  1193. write(*,100) 'critere:',i,'activite:',
  1194. # actif(i),'fcr(',i,'):',fcr(i)
  1195. end do
  1196. ierr1=1
  1197. return
  1198. else
  1199. c nouvelle iteration
  1200. c print*,'log_reduc_zero=',log_reduc_zero
  1201. if(log_reduc_zero) then
  1202. c pas de plasticité, on recommence en eliminant les
  1203. c criteres non dissipatifs sans modifier la contrainte
  1204. goto 20
  1205. end if
  1206. end if
  1207. end if
  1208. c mise a jour des deformations plastiques de traction
  1209. call CHRE36(deplr3,deplr6,vsigef33)
  1210. itens=3
  1211. do ICOMP3D=1,6
  1212. nv3d=NBVSCAL+(ITENS-1)*NBVPTENS+ICOMP3D
  1213. varf(nv3d)=varf(nv3d)+deplr6(ICOMP3D)
  1214. eplr6f(ICOMP3D)=varf(nv3d)
  1215. end do
  1216. c mise a jour des deformations plastiques de dp
  1217. call CHRE36(depldp3,depldp6,vsigef33)
  1218. itens=4
  1219. do ICOMP3D=1,6
  1220. nv3d=NBVSCAL+(ITENS-1)*NBVPTENS+ICOMP3D
  1221. varf(nv3d)=varf(nv3d)+depldp6(ICOMP3D)
  1222. epldp6f(ICOMP3D)=varf(nv3d)
  1223. end do
  1224. c deformation equivalente de dp
  1225. epldpd=epldpd+ldp
  1226. varf(9)=epldpd
  1227. c mise a jour des deformations plastiques de cc
  1228. call CHRE36(deplcc3,deplcc6,vsigef33)
  1229. itens=5
  1230. do ICOMP3D=1,6
  1231. nv3d=NBVSCAL+(ITENS-1)*NBVPTENS+ICOMP3D
  1232. varf(nv3d)=varf(nv3d)+deplcc6(ICOMP3D)
  1233. eplcc6f(ICOMP3D)=varf(nv3d)
  1234. end do
  1235. c mise a jour def elastique dans les varf
  1236. log_err=.false.
  1237. do i=1,3
  1238. depse3(i)=-(deplr3(i)+depldp3(i)+deplcc3(i))
  1239. if(depse3(i).ne.depse3(i)) then
  1240. log_err=.true.
  1241. print*,'Dans endo3d pb5-0'
  1242. print*,'deplr3(i),depldp3(i),deplcc3(i)'
  1243. print*, deplr3(i),depldp3(i),deplcc3(i)
  1244. end if
  1245. end do
  1246. if (log_err) then
  1247. print*,'Endo3d Pb5 a l iter:',iter
  1248. do i=1,ncr
  1249. write(*,100) 'critere:',i,'activite:',
  1250. # actif(i),'fcr(',i,'):',fcr(i)
  1251. end do
  1252. ierr1=1
  1253. return
  1254. end if
  1255. call chre36(depse3,depse6,vsigef33)
  1256. ITENS=2
  1257. do ICOMP3D=1,6
  1258. nv3d=NBVSCAL+(ITENS-1)*NBVPTENS+ICOMP3D
  1259. varf(nv3d)=varf(nv3d)+depse6(ICOMP3D)
  1260. end do
  1261. c mise a jour des contraintes
  1262. call DSDE3D(dsig3,depse3,MK,MG)
  1263. c retour en base fixe
  1264. call CHRE36(dsig3,dsig6,vsigef33)
  1265. c mise a jour des contraintes
  1266. ITENS=1
  1267. do ICOMP3D=1,6
  1268. nv3d=NBVSCAL+(ITENS-1)*NBVPTENS+ICOMP3D
  1269. varf(nv3d)=varf(nv3d)+dsig6(ICOMP3D)
  1270. sigef6(ICOMP3D)=varf(nv3d)
  1271. c print*,'dans endo3d B sigef(',icomp3d,')=',sigef6(icomp3d)
  1272. end do
  1273. c on teste a nouveau les criteres
  1274. goto 10
  1275. else
  1276. c aucun des criteres n est actif
  1277. continue
  1278. end if
  1279. c recuperation des contraintes effectives convergees
  1280. 30 ITENS=1
  1281. do ICOMP3D=1,6
  1282. nv3d=NBVSCAL+(ITENS-1)*NBVPTENS+ICOMP3D
  1283. sigef6(ICOMP3D)=varf(nv3d)
  1284. c print*,'dans endo3d B sigef(',icomp3d,')=',sigef6(icomp3d)
  1285. end do
  1286. c fin des procedures elasto-plastiques
  1287. c***********************************************************************
  1288.  
  1289.  
  1290. c***********************************************************************
  1291. c ouvertures de fissure debut de pas
  1292. c***********************************************************************
  1293.  
  1294. itens=6
  1295. do ICOMP3D=1,6
  1296. nv3d=NBVSCAL+(ITENS-1)*NBVPTENS+ICOMP3D
  1297. wplt06(ICOMP3D)=var0(nv3d)
  1298. end do
  1299. c ouvertures de fissure maxi debut de pas
  1300. itens=7
  1301. do ICOMP3D=1,6
  1302. nv3d=NBVSCAL+(ITENS-1)*NBVPTENS+ICOMP3D
  1303. wpltx06(ICOMP3D)=var0(nv3d)
  1304. end do
  1305. c base principale des ouvertures de fissures
  1306. call bsfs3d(eplr6f,eplr60,depr3,vdepr33,vdepr33t)
  1307. c longueurs de l element dans cette base
  1308. do i=1,3
  1309. do l=1,3
  1310. dir3(l)=vdepr33(l,i)
  1311. end do
  1312. call LNUD3D(long3(i),xe3d,NBNMAX3D,NBNB3D,dir3)
  1313. end do
  1314. c mise a jour des ouvertures de fissures
  1315. call wfis3d(depr3,long3,vdepr33t,wplt06,wplt6,
  1316. # vwpl33,vwpl33t,wpl3,wpltx06,wpltx6,vwplx33,vwplx33t,wplx3)
  1317. itens=6
  1318. do ICOMP3D=1,6
  1319. nv3d=NBVSCAL+(ITENS-1)*NBVPTENS+ICOMP3D
  1320. varf(nv3d)=wplt6(ICOMP3D)
  1321. end do
  1322. c ouvertures maxi de fissure fin de pas
  1323. itens=7
  1324. do ICOMP3D=1,6
  1325. nv3d=NBVSCAL+(ITENS-1)*NBVPTENS+ICOMP3D
  1326. varf(nv3d)=wpltx6(ICOMP3D)
  1327. end do
  1328. c ouverture maxi actuelle
  1329. varf(5)=max(wpl3(1),wpl3(2),wpl3(3))
  1330.  
  1331.  
  1332. c***********************************************************************
  1333. c endommagements
  1334. c***********************************************************************
  1335.  
  1336. c **** partition du tenseur des contraintes **********************
  1337.  
  1338. call prtt3d(sigef6,sigf3,vsigf33,vsigf33t,
  1339. # sigft6,sigfc6,sigfc3,sigft3)
  1340.  
  1341. c *** endommagement prepic de compression ************************
  1342.  
  1343. if(logdcpp) then
  1344. c endo pre pic de compression possible
  1345. dcpp0=var0(8)
  1346. dpic=dcppmax
  1347. spic=Cdp_max
  1348. smin=Cdp_min
  1349. c contrainte equivalente de DP
  1350. c s=fcr(4)+Cdp
  1351. s=Cdp
  1352. if((epldpd.lt.edppic).and.(edppic.ge.precision3d)) then
  1353. c endommagement pre pic lineaire
  1354. c dcpp=dpic * ((s - smin) / (spic - smin))
  1355. if (s.gt.smin) then
  1356. pentendo=(Cdp_max*(1.d0-dpic)-Cdp_min)
  1357. # /sqrt(Cdp_max-Cdp_min)
  1358. if (Cdp.eq.0.) then
  1359. ierr1=1
  1360. print*,'il faut dcp_min>0 dans endo3d'
  1361. end if
  1362. dcpp=1.d0-(Cdp_min+pentendo*sqrt(Cdp-Cdp_min))/Cdp
  1363. c print*,dcpp
  1364. else
  1365. dcpp=0.d0
  1366. end if
  1367. else
  1368. c pas de plasticite pre pic, on utilise le critere DP en
  1369. c contrainte effective pour l endo pre pic
  1370. c exposant de la loi d endommagement
  1371. m1=(-0.1D1 + dpic) / spic / dpic * (-spic + smin)
  1372. dcpp=dpic * ((s - smin) / (spic - smin)) ** m1
  1373. end if
  1374. dcpp=max(dcpp,dcpp0)
  1375. else
  1376. dcpp=0.d0
  1377. dcpp0=0.d0
  1378. end if
  1379. varf(8)=dcpp
  1380.  
  1381. c *** endommagement prepic de traction **************************
  1382.  
  1383. if(logdtpp) then
  1384. c endo pre pic de compression possible
  1385. dtpp0=var0(7)
  1386. dpic=dtppmax
  1387. spic=rteff
  1388. smin=0.d0
  1389. c contrainte equivalente de DP
  1390. s=max(sigef3(1),sigef3(2),sigef3(3),0.d0)
  1391. c exposant de la loi d endommagement
  1392. m1=(-0.1D1 + dpic) / spic / dpic * (-spic + smin)
  1393. c endommagement pre pic tension
  1394. dtpp=dpic * ((s - smin) / (spic - smin)) ** m1
  1395. dtpp=max(dtpp,dtpp0)
  1396. else
  1397. dtpp=0.d0
  1398. end if
  1399. varf(7)=dtpp
  1400.  
  1401. c *** endommagement complet de traction **************************
  1402.  
  1403. c ouverture caracteristique pour l' endommagement de traction
  1404. wkt=gft/rt
  1405. dtra=0.d0
  1406. do i=1,3
  1407. c endo localise base principale de fissuration
  1408. dt3(i)=wplx3(i)*(wplx3(i)+2.d0*wkt)/(wkt+wplx3(i))**2
  1409. c borne de dt a dmaxi
  1410. dt3(i)=min(dmaxi,dt3(i))
  1411. c endommagement global de traction pour affichage
  1412. dtra=max(dtra,dt3(i))
  1413. c indice de fissure
  1414. sn3(i)=1.d0/(1.d0-dt3(i))
  1415. end do
  1416. c matrice d endommagement de traction incluant l endo pre pic
  1417. call b3_d66(nu,sn3,dt66,.false.,.false.)
  1418. c passage des contraintes effectives dans la base prin des endo
  1419. call chrep6(sigft6,vwplx33,.false.,sigft6p)
  1420. c application du tenseur d endommagement
  1421. do i=1,6
  1422. sigft6dp(i)=sigft6p(i)
  1423. do j=1,6
  1424. sigft6dp(i)=sigft6dp(i)-dt66(i,j)*sigft6p(j)
  1425. end do
  1426. end do
  1427. c retour des contraintes positives en base fixe
  1428. call chrep6(sigft6dp,vwplx33t,.false.,sigft6d)
  1429. c reconstruction du tenseur des contraintes endommage
  1430. do i=1,6
  1431. c prise en compte de l endo iso prepic de traction
  1432. sigf61(i)=sigfc6(i)+sigft6d(i)*(1.d0-dtpp)
  1433. end do
  1434. varf(11)=1.d0-(1.d0-dtra)*(1.d0-dtpp)
  1435. c Nouvelle partition du tenseur des contraintes endommagés
  1436. call prtt3d(sigf61,sigf3,vsigf33,vsigf33t,
  1437. # sigft61,sigfc6,sigfc3,sigft3)
  1438.  
  1439. c *** fonction de refermeture ************************************
  1440.  
  1441. c ouverture caracteristique pour l' endommagement de traction
  1442. wkr=gfr/ref
  1443. do i=1,3
  1444. c endo localise base principale de fissuration
  1445. ref3(i)=1.d0-wpl3(i)*(wpl3(i)+2.d0*wkr)/(wkr+wpl3(i))**2
  1446. c ajustement borne mini
  1447. ref3(i)=max(ref3(i),0.d0)
  1448. c ajustement borne maxi
  1449. ref3(i)=min(ref3(i),1.d0)
  1450. c indice de refermeture
  1451. sn3(i)=1.d0/ref3(i)
  1452. end do
  1453. c matrice des fonctions de refermeture
  1454. call b3_d66(nu,sn3,dr66,.false.,.false.)
  1455. c passage des contraintes effectives dans la base prin des endo
  1456. call chrep6(sigfc6,vwplx33,.false.,sigfc6p)
  1457. c application du tenseur de refermeture aux contraintes negatives
  1458. do i=1,6
  1459. sigfc6dp(i)=sigfc6p(i)
  1460. do j=1,6
  1461. sigfc6dp(i)=sigfc6dp(i)-dr66(i,j)*sigfc6p(j)
  1462. end do
  1463. end do
  1464. c retour des contraintes positives en base fixe
  1465. call chrep6(sigfc6dp,vwplx33t,.false.,sigfc6d)
  1466. c reconstruction du tenseur des contraintes avec refermetures
  1467. do i=1,6
  1468. sigf62(i)=sigfc6d(i)+sigft61(i)
  1469. end do
  1470. c Nouvelle partition du tenseur des contraintes endommagés
  1471. call prtt3d(sigf62,sigf3,vsigf33,vsigf33t,
  1472. # sigft62,sigfc6,sigfc3,sigft3)
  1473.  
  1474. c *** endommagement de flambage des bielettes comprimees *********
  1475.  
  1476. call buck3d(altc,dt3,dct3,vwplx33,vwplx33t,sigfc6)
  1477. dctmax=max(dct3(1),dct3(2),dct3(3))
  1478.  
  1479.  
  1480. c *** endommagement de cisaillement ******************************
  1481.  
  1482. c dilatance transverse au pic de l essai uniaxial
  1483. if(orthodp) then
  1484. dvtp = eplpic *(0.2D1*beta+sqrt(0.3D1))/(sqrt(0.3D1)-beta)
  1485. else
  1486. dvtp = 0.3D1 * beta * eplpic / (sqrt(0.3D1) - beta)
  1487. end if
  1488. c endo de cisaillement initial
  1489. dcdp=1.d0-(1.d0-var0(10))/(1.d0-dcpp0)
  1490. c actualisation endo de cisaillement
  1491. call damdp3d(precision3d,ekdc,dvtp,epldp6f,dcc3,sigfc6,
  1492. # sigft62,dcdp,orthodp)
  1493. if(orthodp) then
  1494. dccmax=max(dct3(1),dct3(2),dct3(3))
  1495. else
  1496. dccmax=dcdp
  1497. end if
  1498. c prise en compte endommagement isotrope prepic de compression
  1499. do i=1,6
  1500. c sigf6(i)=(sigft62(i)+sigfc6(i))*(1.d0-dcpp)
  1501. sigf6(i)=sigft62(i)+sigfc6(i)*(1.d0-dcpp)
  1502. end do
  1503. c actualisation endo de cisaillement complet
  1504. dcom=1.d0-(1.d0-dccmax)*(1.d0-dcpp)
  1505. varf(10)=dcom
  1506.  
  1507.  
  1508. c***********************************************************************
  1509. c traitement des erreurs
  1510. if(ierr1.eq.1) then
  1511. print*,'pb lors du calcul des endommagements dans endo3d'
  1512. return
  1513. end if
  1514.  
  1515.  
  1516. c***********************************************************************
  1517. c affectation dans le tableau de sortie des contraintes
  1518. c et prise encompte des contribution des renforts
  1519. do i=1,nstrs
  1520. sigf(i)=sigf6(i)
  1521. c print*,'sigf(',i,')=',sigf(i)
  1522. end do
  1523.  
  1524. c indicateur de fin de 1er pas
  1525. if(ppas.and.((istep.eq.2).or.(istep.eq.0))) then
  1526. varf(1)=1.d0
  1527. else
  1528. if(ppas) then
  1529. varf(1)=0.d0
  1530. else
  1531. varf(1)=var0(1)
  1532. end if
  1533. end if
  1534.  
  1535. c ******traitement erreur residuelle************************************
  1536. if(ierr1.eq.1) then
  1537. return
  1538. end if
  1539.  
  1540. return
  1541.  
  1542. end
  1543. c***********************************************************************
  1544.  
  1545.  
  1546.  
  1547.  
  1548.  
  1549.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales