Télécharger fibs3d.eso

Retour à la liste

Numérotation des lignes :

fibs3d
  1. C FIBS3D SOURCE GOUNAND 26/08/19 21:15:02 12620
  2. subroutine fibs3d(Df,Lf,lech,mw,rtec,rhof,eo,vf1,vf2,Gf,
  3. #cokf1,cokf2,cowp1,cowp2,cofp,cow03,cowf,mink01,maxk01,mink02,
  4. #maxk02,minwp1,maxwp1,minwp2,maxwp2,minfp,maxfp,minw03,maxw03,
  5. #minwf,maxwf,sigf06,vwpl6,wmax,wmoy,etw,ncf,sigfr,wmax6,le,
  6. #nc0,wmoy0,etw0,vw30,rig0t,wmax0,vw3,rmax1,rmax2,rmax3,phimoy,
  7. #wferm,sigdec,iloc,wpsigt,wmiloc,sigmaxt,vecw33,sigfx6,wmaxd,
  8. #wmaxd0,epstf6,Ef,fu,young,xmt,dtiso,epict,rt00,cvar,wplmax)
  9.  
  10. implicit real*8 (a-h,o-z)
  11. implicit integer (i-n)
  12. integer err1,nvari,ncalc,rmax,r,rmaxi,rmax1,rmax2,rmax3
  13. integer i,j,k,l,iloc(3)
  14. parameter (PI=3.141592653589793D0)
  15. real*8 incremwlis,precision1,precision2
  16. parameter (incremwlis=2.5d-6,precision1=1.0d-8,precision2=1.0d-8)
  17.  
  18.  
  19. real*8 rhof,Df,Lf,phicrit,Rtec,mw,Rtb,lech,le(3),Gf
  20. real*8 young,xmt,epict,dt3
  21.  
  22. parameter (nvari=7,phicrit=55.d0,npos=10)
  23. c attention npos doit être redefini dans disp3d
  24. c Rtec est celui de lech
  25. C parameter(mu=0.5d0,Td=6.4d0,Tmax=8.d0,rhof=0.02,
  26. C # Ef=210000.d0,Df=2.0d-4,Hf=8000000.d0,sk=3.0d-2,
  27. C # F0=5.0d-6,alphad=30.d0,M0=8.d0,
  28. C # Rtec=4.d0,fu=2800.d0,L0=5.0d-3,
  29. C # Lf=0.013d0,lech=1.d0,mw=12.d0)
  30. c parameter (ncalc=max(int(Lf/(incremwlis)),1000))
  31. parameter (ncalc=1000)
  32. parameter (rmaxi=10)
  33. real*8 vecw(3),wmax0(3)
  34. real*8 Eo(3),Vwpl6(6),vwpl33(3,3),vw3(3)
  35. real*8 veo(3,3),vecw33(3,3)
  36. real*8 stri(npos,2*npos-2),xg(npos,2*npos-2),yg(npos,2*npos-2)
  37. real*8 zg(npos,2*npos-2),vei(3)
  38. real*8 phi1,phi1d(npos,2*npos-2),f1(npos,2*npos-2)
  39. real*8 pscal(npos,2*npos-2),normv
  40. real*8 si0(npos,2*npos-2),si1,Reiw(npos,2*npos-2)
  41. real*8 wmaxa(3,3),wmaxac(3,3),wmaxact(3),wmax6(6),wmax33(3,3)
  42. real*8 rig0(3,rmaxi),sig0(3),vwfi(3,ncalc)
  43. real*8 sigmax(3,rmaxi),sigf(3,rmaxi,ncalc),sigf06(6)
  44. real*8 sigf033(3,3),sigf03(3)
  45. real*8 ratio(npos,2*npos-2),vwfi0(3),wfis(3)
  46. real*8 wpsig(3,rmaxi),wmi0(1),cvar(3),wplmax(3)
  47. real*8 wmiloc(3),phimoy(3),nf(npos,2*npos-2)
  48. real*8 Romeg(npos,2*npos-2),Sr(3),Sigb(3),Sig(3),wfist(3)
  49. real*8 nc(rmaxi),Rt(rmaxi),nct(rmaxi),Romeg1(npos,2*npos-2)
  50. real*8 wmi(rmaxi),wt(3,ncalc),sigt(3,ncalc),wmul(3,rmaxi)
  51.  
  52. c variables pour la reduction du modele
  53. real*8 k0m, wp,fp,f03,w03,wf
  54. real*8 cokf1(10),cokf2(10),cowp1(10),cowp2(10)
  55. real*8 cofp(10),cowf(10),cow03(10)
  56. real*8 maxfp,minfp,maxwp1,minwp1,maxwf,minwf,maxw03,minw03
  57. real*8 maxwp2,minwp2,B,vf1(3),vf2(3)
  58. real*8 maxk02,mink02,maxk01,mink01,phi2d(npos,2*npos-2)
  59. real*8 tri(npos,2*npos-2,3,3),Reiw1,Reiw2,Reiw3,vst1(3),vst2(3)
  60. real*8 vst3(3),theta1,gamma1,theta2,gamma2,theta3,gamma3
  61.  
  62. c variable ajoutée pour contrainte totale
  63. real*8 wpsigt(3),rig0t(3),sigmaxt(3),sigfr(3),rt00
  64. logical loc(3),dtiso
  65. real*8 varft(nvari,ncalc),rig0td(3),gfap(3)
  66. real*8 wmr(rmaxi),wer(rmaxi),wmoy(3),etw(3),wmax(3)
  67. real*8 sigfp33(3,3),sigfx33(3,3),sigfx6(6),ncf(3)
  68. real*8 dw3(3),vw30(3),wmoy0(3),etw0(3),nc0(3)
  69. real*8 wferm(3),sigdec(3),sigfe(3),epse13(3),vecwj(3)
  70. real*8 wmaxd(3),wmaxd0(3),w1(3),rtmin,epstf6(6),epse133(3,3)
  71. real*8 vecs33(3,3)
  72. * pv
  73. s1 = 0.d0
  74. do i=1,3
  75. sig(i)=-1.d0
  76. enddo
  77. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  78. c CONSTRUCTION DES 3 COURBES CONTRAINTES - OUVERTURE TOTALES DANS LA BASE
  79. c CCCCCCCCCCCCCCCC DE FISSURE ACTUELLE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  80. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  81.  
  82.  
  83. c recuperation des ouvertures max
  84. call x6x33(wmax6,wmax33)
  85. call x6x33(vwpl6,vwpl33)
  86. c vw3 : vecteur des valeurs principales de fissures
  87. c vecw33 matrice des vecteurs d'orientation des fissures actuelles
  88. call b3_v33(vwpl33,vw3,vecw33)
  89.  
  90. C print*,vecw33(1,1),vecw33(2,1),vecw33(3,1),"vw1"
  91. C print*,vecw33(1,2),vecw33(2,2),vecw33(3,2),"vw2"
  92. C print*,vecw33(1,3),vecw33(2,3),vecw33(3,3),"vw3"
  93.  
  94.  
  95. c on passe le tenseur d'ouverture max dans la base de fissure actuelle
  96. c pour comparer les valeurs max et actuelles
  97. c vecw33t=transpose(vecw33)
  98. wmaxa=matmul(transpose(vecw33),wmax33)
  99. wmaxac=matmul(wmaxa,vecw33)
  100.  
  101. c on récupère les valeurs diag
  102. c c'est cette valeur qu'on va décomposer en multifissure
  103. do i=1,3
  104. do j=1,3
  105. if(i.eq.j) then
  106. wmaxact(i)=wmaxac(i,j)
  107. end if
  108. end do
  109. end do
  110.  
  111. c recuperation du tenseur des contraintes fibres du pas d avant
  112. c il sert a calculer une eventuelle decharge
  113. call x6x33(sigf06,sigf033)
  114. call b3_v33(sigf033,sigf03,vecs33)
  115. c print*,sigf03(1),sigf03(2),sigf03(3),"contraintes fibres 0"
  116.  
  117. c tenseur d orientation des fibres dans la base d'orientations principales
  118. if((Eo(1).eq.0.d0).or.(Eo(2).eq.0.d0).or.(Eo(3).eq.0.d0)) then
  119. print*,"arret du prigramme dans fibs3d.eso"
  120. print*,"Donnez des valeurs du tenseur d'orientation non nulles"
  121. stop
  122. err1=1
  123. end if
  124.  
  125. c vecteurs principaux du tenseur d'orientation des fibres dans la base du maillage
  126. c on donne 2 vecteurs et on calcule le 3ème
  127. veo(1,1)=vf1(1)
  128. veo(2,1)=vf1(2)
  129. veo(3,1)=vf1(3)
  130.  
  131. veo(1,2)=vf2(1)
  132. veo(2,2)=vf2(2)
  133. veo(3,2)=vf2(3)
  134.  
  135. veo(1,3)=veo(2,1)*veo(3,2)-veo(3,1)*veo(2,2)
  136. veo(2,3)=veo(3,1)*veo(1,2)-veo(1,1)*veo(3,2)
  137. veo(3,3)=veo(1,1)*veo(2,2)-veo(2,1)*veo(1,2)
  138.  
  139. if(abs(
  140. # veo(1,1)*veo(1,2)+veo(2,1)*veo(2,2)+veo(3,1)*veo(3,2)).gt.
  141. # precision1) then
  142. print*,"arret du prigramme dans fibs3d.eso"
  143. print*,"Donnez vecteurs orthogonaux d'orientation des fibres "
  144. c read*
  145. stop
  146. err1=1
  147. end if
  148.  
  149. c normalisation des vecteurs
  150. do i=1,3
  151. normv=sqrt(veo(1,i)**2+veo(2,i)**2+veo(3,i)**2)
  152. veo(1,i)=veo(1,i)/normv
  153. veo(2,i)=veo(2,i)/normv
  154. veo(3,i)=veo(3,i)/normv
  155. end do
  156. c discrétisation de l'espace en angles solides
  157. call disp3d(stri,xg,yg,zg,tri,npos)
  158. c traitement des fissures
  159. do i=1,3
  160. c initialisation
  161. loc(i)=.false.
  162. c wmi=0.d0
  163. if(i.eq.1) then
  164. rmax=rmax1
  165. else if(i.eq.2) then
  166. rmax=rmax2
  167. else if(i.eq.3) then
  168. rmax=rmax3
  169. end if
  170.  
  171. if(vw3(i).lt.precision2) then
  172. sigfr(i)=0.d0
  173. wmax(i)=0.d0
  174. rig0t(i)=0.d0
  175. wmoy(i)=0.d0
  176. etw(i)=0.d0
  177. wmi=0.d0
  178. wmul=0.d0
  179. wmr=0.d0
  180. wer=0.d0
  181. nc=0.d0
  182. nct=0.d0
  183.  
  184. if(wmaxact(i).lt.precision2) then
  185. wmoy(i)=0.d0
  186. etw(i)=0.d0
  187. ncf(i)=0.d0
  188. sigfr(i)=0.d0
  189. if(nc0(i).gt.0.d0) then
  190. ncf(i)=nc0(i)
  191. else
  192. ncf(i)=0.d0
  193. end if
  194. else
  195. ncf(i)=nc0(i)
  196. end if
  197.  
  198. c calcul de phimoy
  199.  
  200. phimoy(i)=0.d0
  201.  
  202.  
  203. go to 70
  204. end if
  205.  
  206. if((wmaxact(i).gt.0.d0).and.(nc0(i).eq.0.d0)) then
  207. nc0(i)=1.d0
  208. end if
  209.  
  210. c vecteurs orientations de fissure
  211. c vecw(j,i) : orientation de la fissure i (normé? --> oui)
  212. vecw(1)=vecw33(1,i)
  213. vecw(2)=vecw33(2,i)
  214. vecw(3)=vecw33(3,i)
  215.  
  216.  
  217. c on construit les rayons de l ellipse et les angles une seule fois pour toute
  218. c c'est les memes pour tous
  219. do n=1,npos
  220. do k=1,2*npos-2
  221. c vecteur sommet des triangles vst(sommet,coordonnée)
  222. c sommet 1
  223. vst1(1)=tri(n,k,1,1)
  224. vst1(2)=tri(n,k,1,2)
  225. vst1(3)=tri(n,k,1,3)
  226. c sommet 2
  227. vst2(1)=tri(n,k,2,1)
  228. vst2(2)=tri(n,k,2,2)
  229. vst2(3)=tri(n,k,2,3)
  230. c sommet 3
  231. vst3(1)=tri(n,k,3,1)
  232. vst3(2)=tri(n,k,3,2)
  233. vst3(3)=tri(n,k,3,3)
  234. c vecteur dans la direction ei (il est déjà normalisé dans disp3d)
  235. vei(1)=xg(n,k)
  236. vei(2)=yg(n,k)
  237. vei(3)=zg(n,k)
  238.  
  239. c passage de vei dans la base du maillage puis de fissuration
  240. c NON vecw est dans la base du maillage, il suffit de passer
  241. c vei dans la base du maillage
  242. c veo est la matrice de passage P du maillage a l ellipse
  243. c ici on veut passer de l'ellipse au maillage donc P A
  244. vei=matmul(veo,vei)
  245. c vei=matmul(vecw33,vei)
  246. c produit scalaire entre l'orientation de la fissure et de ei
  247. pscal(n,k)=abs(sum(vei*vecw))
  248. c calcul de l'angle entre la fissure et la direction ei
  249. phi1=acos(pscal(n,k))
  250. phi1d(n,k)=180.d0*phi1/pi
  251. c calculs sont effectues dans la base de l ellipse
  252. c calcul des angles d'orientation de chaque sommet du triangle n,k
  253. theta1=acos(vst1(3))
  254. gamma1=atan2(vst1(2),vst1(1))
  255. theta2=acos(vst2(3))
  256. gamma2=atan2(vst2(2),vst2(1))
  257. theta3=acos(vst3(3))
  258. gamma3=atan2(vst3(2),vst3(1))
  259.  
  260. c rayon de l'ellipse d'orientation des fibres dans la direction des sommets
  261. Reiw1 = (Eo(1) ** 2 * Eo(3) ** 2 * sin(theta1)**2*sin(gamma1)** 2
  262. #- Eo(2) ** 2 * Eo(3) ** 2 * sin(theta1) ** 2*sin(gamma1) ** 2-Eo(1
  263. #) ** 2 * Eo(2) ** 2 * sin(theta1) ** 2 + Eo(2) ** 2 * Eo(3) ** 2 *
  264. #sin(theta1) ** 2+ Eo(1) ** 2 * Eo(2) ** 2) ** (-0.1D1 / 0.2D1) * E
  265. #o(3) * Eo(2) * Eo(1)
  266.  
  267. Reiw2 = (Eo(1) ** 2 * Eo(3) ** 2 * sin(theta2)**2*sin(gamma2)** 2
  268. #- Eo(2) ** 2 * Eo(3) ** 2 * sin(theta2) ** 2*sin(gamma2) ** 2-Eo(1
  269. #) ** 2 * Eo(2) ** 2 * sin(theta2) ** 2 + Eo(2) ** 2 * Eo(3) ** 2 *
  270. #sin(theta2) ** 2+ Eo(1) ** 2 * Eo(2) ** 2) ** (-0.1D1 / 0.2D1) * E
  271. #o(3) * Eo(2) * Eo(1)
  272.  
  273. Reiw3 = (Eo(1) ** 2 * Eo(3) ** 2 * sin(theta3)**2*sin(gamma3)** 2
  274. #- Eo(2) ** 2 * Eo(3) ** 2 * sin(theta3) ** 2*sin(gamma3) ** 2-Eo(1
  275. #) ** 2 * Eo(2) ** 2 * sin(theta3) ** 2 + Eo(2) ** 2 * Eo(3) ** 2 *
  276. #sin(theta3) ** 2+ Eo(1) ** 2 * Eo(2) ** 2) ** (-0.1D1 / 0.2D1) * E
  277. #o(3) * Eo(2) * Eo(1)
  278.  
  279. Reiw(n,k)=(Reiw1+Reiw2+Reiw3)/3.d0
  280.  
  281. c stockage de reiw*omegai
  282. Romeg(n,k)=Reiw(n,k)*stri(n,k)
  283. Romeg1(n,k)=Reiw(n,k)*stri(n,k)*pscal(n,k)
  284. c terme proportionnel à la densité volumique de fibres dans une direction ei
  285. c car on ne sait pas calculer la somme rei*omegai
  286. c ratio(n,k)=Reiw(n,k)*stri(n,k)*rhof
  287. c proportionnel au nombre de fibres du paquet n,k traversant la fissure i
  288. c nf(n,k)=4*ratio(n,k)*pscal(n,k)/(pi*Df**2)
  289. c proportionnel a l ancrage moyen des fibres du paquet ei pondéré par le nombre de fibres traversant la fissure
  290. c Lm(n,k)=(Lf/2-Lf/(4*cos(phi1)))*nf(n,k)
  291. c l angle moyen reflete les fibres qui traversent effectivement le plan
  292. phi2d(n,k)=Reiw(n,k)*stri(n,k)*phi1d(n,k)*pscal(n,k)
  293. c fin de la 1ere boucle sur n,k qui sert a connaitre reiw(n,k) et phi1d(n,k)
  294. end do
  295. c fin de boucle sur k
  296. end do
  297. c fin de boucle sur n
  298. c angle moyen
  299. phimoy(i)=sum(phi2d)/sum(romeg1)
  300.  
  301. if(vw3(i).gt.wplmax(i)) then
  302. wplmax(i)=vw3(i)
  303. end if
  304.  
  305.  
  306. c if((vw3(i).ge.wmaxact(i)).and.(vw3(i).ge.vw30(i))) then
  307. c if(vw3(i).ge.wmaxact(i)) then
  308.  
  309. if(vw3(i).lt.wferm(i)) then
  310. go to 100
  311. end if
  312.  
  313. if((vw3(i).ge.wplmax(i))) then
  314. ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  315. c on ouvre la fissure i
  316. ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  317. c modif
  318. c wpsigt0(i)=wpsigt(i)
  319.  
  320. rtmin=Rtec*(lech/(0.5d0*sqrt(2*pi)))**(1/mw)
  321. do r=1,rmax
  322. if(r.eq.1) then
  323. Rt(r)=rt00
  324. else
  325. Rt(r)=Rtec*(lech*2.d0**(r-1)/le(i))**(1/mw)
  326. end if
  327.  
  328. if(rt(r).lt.rtmin) then
  329. rt(r)=rtmin
  330. end if
  331. end do
  332. c Rtec valeur pour lech quand r=1 on fait les fissures a le/2
  333.  
  334. c initialisation
  335. wmi=0.d0
  336. cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  337. c ici on test si on etait dans une phase de localisation
  338. c si c est le cas on ne reconstruit pas les courbes on va
  339. c directement dans la phase de localisation
  340. cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  341.  
  342. if(iloc(i).eq.1) then
  343. go to 80
  344. end if
  345.  
  346.  
  347.  
  348. do r=1,rmax
  349. Rtb=Rt(r)
  350. cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  351. c construction des courbes contraintes ouvertures de fissures pour chaque rt
  352. c pour 1 fissure fictive incrementale dans la base de fissuration actuelle
  353. ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  354. do l=1,ncalc
  355.  
  356. c récupération de la contrainte du pas fictif d'avant
  357. if(l.eq.1) then
  358. sig0(1)=0.d0
  359. sig0(2)=0.d0
  360. sig0(3)=0.d0
  361. vwfi0(1)=0.d0
  362. vwfi0(2)=0.d0
  363. vwfi0(3)=0.d0
  364. else
  365. sig0(1)=varft(1,l-1)
  366. sig0(2)=varft(2,l-1)
  367. sig0(3)=varft(3,l-1)
  368. vwfi0(1)=varft(4,l-1)
  369. vwfi0(2)=varft(5,l-1)
  370. vwfi0(3)=varft(6,l-1)
  371. end if
  372.  
  373. c fissure fictive
  374. vwfi(i,l)=l*incremwlis
  375.  
  376. c et ici on recommence donc une boucle ou on va calculer les contraintes
  377. c jusqu au pic pour tous les Rt
  378. do n=1,npos
  379. do k=1,2*npos-2
  380. c calcul de la force moyenne pour une fibre traversant la fissure i inclinée de phi1d
  381. c calcul des points caractéristiques de la courbe force ouverture de fissure pour Td et phid
  382. c rigidité initiale
  383. if(phi1d(n,k).le.phicrit) then
  384. call reconf(cokf1,k0m,Rtb,phi1d(n,k),mink01,maxk01)
  385. else
  386. call reconf(cokf2,k0m,Rtb,phi1d(n,k),mink02,maxk02)
  387. end if
  388. c ouverture au pic
  389. if(phi1d(n,k).le.phicrit) then
  390. call reconf(cowp1,wp,Rtb,phi1d(n,k),minwp1,maxwp1)
  391. else
  392. call reconf(cowp2,wp,Rtb,phi1d(n,k),minwp2,maxwp2)
  393. end if
  394. c force au pic
  395. call reconf(cofp,fp,Rtb,phi1d(n,k),minfp,maxfp)
  396. c force intermédiaire post pic
  397. f03=0.3d0*fp
  398. c ouverture pour f=0.3fp
  399. call reconf(cow03,w03,Rtb,phi1d(n,k),minw03,maxw03)
  400. if(w03.le.wp) then
  401. w03=3.0d0*wp
  402. end if
  403. c ouverture finale (f=0)
  404. call reconf(cowf,wf,Rtb,phi1d(n,k),minwf,maxwf)
  405. if(wf.le.w03) then
  406. wf=3.0d0*w03
  407. end if
  408. c calcul de la force dans la fissure i pour les fibres orientées selon ei
  409. if(vwfi(i,l).le.wp) then
  410. B=(k0m*wp-fp)/(fp*wp)
  411. f1(n,k)=k0m*vwfi(i,l)/(B*vwfi(i,l)+1.d0)
  412. else
  413. if(vwfi(i,l).lt.wf) then
  414. f1(n,k)=fp*exp(log(f03/fp)*(vwfi(i,l)-wp)/(w03-wp))
  415. c print*,2,f1(n,k),wp,wf
  416. else
  417. f1(n,k)=precision1
  418. end if
  419. end if
  420. c calcul du terme à l'intérieur de la somme de la contrainte
  421. si0(n,k)=Reiw(n,k)*stri(n,k)*pscal(n,k)*f1(n,k)
  422. end do
  423. c fin de boucle sur k
  424. end do
  425. c fin de boucle sur n
  426. c valeurs fictives
  427. si1=sum(si0)
  428. sigf(i,r,l)=4.d0*rhof*si1/(pi*Df**2*(sum(Romeg)))
  429.  
  430.  
  431. c stockage de la rigidité initiale
  432. if(l.eq.1) then
  433. rig0(i,r)=sigf(i,r,l)/incremwlis
  434. end if
  435. if(rig0(i,r).ne.rig0(i,r).or.(rig0(i,r).eq.0.d0)) then
  436.  
  437. print*, "Probleme de rigidite initiale",rig0(i,r)
  438. err1=1
  439. end if
  440.  
  441. if((sigf(i,r,l).lt.sig0(i)).or.(vwfi(i,l).gt.(vw3(i)
  442. # +2.d0*incremwlis))) then
  443. c on calcule la contrainte jusqu'au pic uniquement ou l ouverture actuelle
  444. wpsig(i,r)=vwfi0(i)
  445. sigmax(i,r)=sig0(i)
  446. go to 10
  447. c on passe au rt d'apres (on sort de l) pour les rt autres que la premiere fissure
  448. end if
  449.  
  450. c stockage des variables fictives du pas
  451. varft(1,l)=sigf(1,r,l)
  452. varft(2,l)=sigf(2,r,l)
  453. varft(3,l)=sigf(3,r,l)
  454. varft(4,l)=vwfi(1,l)
  455. varft(5,l)=vwfi(2,l)
  456. varft(6,l)=vwfi(3,l)
  457. end do
  458. c fin de boucle sur l
  459. 10 continue
  460. C if(i.eq.3) then
  461. C print*,sigf(i,r,l),r,l,rig0(i,r),rt(r),si1
  462. C end if
  463. end do
  464. c fin de boucle sur les Rtb
  465.  
  466.  
  467. cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  468. c on recommence une boucle de fissures fictives pour avoir la loi totale
  469. cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  470. nct=0.d0
  471. do l=1,ncalc
  472. c récupération de la contrainte du pas fictif d'avant
  473. if(l.eq.1) then
  474. sig0(1)=0.d0
  475. sig0(2)=0.d0
  476. sig0(3)=0.d0
  477. vwfi0(1)=0.d0
  478. vwfi0(2)=0.d0
  479. vwfi0(3)=0.d0
  480. wmi0(1)=0.d0
  481. c wt(i,l-1)=0.d0
  482. c sigt(i,l-1)=0.d0
  483. else
  484. sig0(1)=varft(1,l-1)
  485. sig0(2)=varft(2,l-1)
  486. sig0(3)=varft(3,l-1)
  487. vwfi0(1)=varft(4,l-1)
  488. vwfi0(2)=varft(5,l-1)
  489. vwfi0(3)=varft(6,l-1)
  490. wmi0(1)=varft(7,l-1)
  491. end if
  492. c fissure fictive totale cette fois ci
  493. vwfi(i,l)=l*incremwlis
  494.  
  495. call endo3f(vwfi(i,l),gf,young,
  496. # xmt,dtiso,dt3,epict,rt(1),le(i))
  497.  
  498. c wk1=(Gf-gfap(i))/Rt(1)
  499. c wk1=(Gf)/Rt(1)
  500.  
  501. if(l.eq.1) then
  502. epse13(i)=vwfi(i,l)/le(i)
  503. else
  504. epse13(i)=wt(i,l-1)/le(i)
  505. end if
  506.  
  507. sigfe(i)=(1.d0-dt3)*
  508. #rhof*max(min(Ef*epse13(i)*cos(phimoy(i)*
  509. #pi/180.d0)**2,fu*cos(phimoy(i)*pi/180.d0)**2),-fu)
  510.  
  511. * sigfe(i)=0.d0
  512.  
  513. sigb(i)=Rt(1)*(1.d0-dt3)
  514. sig(i)=sigb(i)+sigf(i,1,l)*dt3+
  515. #sigfe(i)
  516.  
  517. c print*,sig(i),sigb(i),sigf(i,1,l),dt3,sigfe(i),"precons"
  518.  
  519. Sr(i)=lech/exp(log(sig(i)/Rtec)*mw)
  520.  
  521. c on fixe la limite
  522.  
  523. s1=Rtec*(lech*8.d0/(Lf*cos(pi*phimoy(i)/180.d0)))**(1/mw)
  524.  
  525.  
  526.  
  527. c if(Sr(i).lt.Lf*cos(pi*phimoy(i)/180.d0)/4) then
  528. if(sig(i).gt.s1) then
  529. Sr(i)=Lf*cos(pi*phimoy(i)/180.d0)/4
  530. c wmiloc(i)=vwfi(i,l)
  531. sig(i)=s1
  532. loc(i)=.true.
  533. end if
  534.  
  535. if(sig(i).lt.rt(2)) then
  536.  
  537. c il n y a qu une seule fissure
  538. wfist(i)=vwfi(i,l)
  539. nct(1)=1.d0
  540. wmi(1)=vwfi(i,l)
  541. wt(i,l)=wfist(i)
  542. sigt(i,l)=sigf(i,1,l)
  543. else
  544. c on multifissure
  545.  
  546. do r=1,rmax
  547. if(r.eq.1) then
  548. nct(r)=1.d0
  549. wmi(1)=vwfi(i,l)
  550. else
  551. if(Sr(i).le.le(i)/(2.d0**(r-1))) then
  552. if(le(i)/Sr(i).lt.2.d0**(r)) then
  553. nct(r)=(le(i)/Sr(i)-(2.d0**(r-1)))/2.d0
  554. else
  555. nct(r)=2.d0**(r-2)
  556. end if
  557. do k=1,ncalc
  558.  
  559. c ici pour trouver les ouvertures de micro fissures on peut aussi equilibrer avec sigf(i,1,l) au lieu de sig(i)
  560. c ca paraitrait peut etre plus logique ?
  561. C if(sig(i)-sigf(i,r,k).le.0.d0) then
  562. C if(k.eq.1) then
  563. C wmi(r)=(sig(i)-(sigf(i,r,k)-((sigf(i,r,k)-0)/
  564. C #incremwlis)*vwfi(i,k)))/((sigf(i,r,k)-0)/incremwlis)
  565. C else
  566. C wmi(r)=(sig(i)-(sigf(i,r,k)-((sigf(i,r,k)-sigf(i,r,k-1))/
  567. C #incremwlis)*vwfi(i,k)))/((sigf(i,r,k)-sigf(i,r,k-1))/incremwlis)
  568. C end if
  569. C go to 20
  570. C end if
  571.  
  572. if(sigf(i,1,l)*dt3-sigf(i,r,k).le.0.d0) then
  573. if(k.eq.1) then
  574. wmi(r)=(sigf(i,1,l)*dt3-(sigf(i,r,k)-((sigf(i,r,k)-0)/
  575. #incremwlis)*vwfi(i,k)))/((sigf(i,r,k)-0)/incremwlis)
  576. else
  577. wmi(r)=(sigf(i,1,l)*dt3-(sigf(i,r,k)-((sigf(i,r,k)-sigf(i,r,k-1))/
  578. #incremwlis)*vwfi(i,k)))/((sigf(i,r,k)-sigf(i,r,k-1))/incremwlis)
  579.  
  580.  
  581. end if
  582. go to 20
  583. end if
  584.  
  585. end do
  586.  
  587. 20 continue
  588.  
  589. C if(i.eq.3) then
  590. C print*,wmi(r),r,nct(r),"pre",sr(i),sig(i),rt(r)
  591. C end if
  592.  
  593. if(wmi(r).lt.0.d0) then
  594. print*,wmi(r)
  595. read*
  596. end if
  597. wmi(r)=nct(r)*wmi(r)
  598. else
  599. c wmi(r)=0.d0
  600. go to 30
  601. end if
  602. end if
  603.  
  604.  
  605. end do
  606. c fin de boucle sur les Rt
  607. 30 continue
  608. c ici on va calculer des segments de droite pour reconstruire notre courbe
  609. wfist(i)=sum(wmi)
  610. wt(i,l)=wfist(i)
  611. sigt(i,l)=sigf(i,1,l)
  612.  
  613.  
  614. end if
  615.  
  616. c fin du si on multifissure
  617.  
  618. c stockage de la rigidité initiale
  619. if(l.eq.1) then
  620. rig0t(i)=sigf(i,1,l)/incremwlis
  621. end if
  622.  
  623. if(l.gt.1) then
  624. if(rig0t(i).ne.rig0t(i).or.(rig0t(i).eq.0.d0)) then
  625. print*, "Probleme de rigidite initiale",rig0t(i)
  626. err1=1
  627. end if
  628. end if
  629.  
  630.  
  631. if(l.gt.1) then
  632. if((vwfi(i,l).gt.wpsig(i,1)).or.(loc(i)).or.(wt(i,l-1).gt.vw3(i)
  633. # )) then
  634.  
  635. c print*, vwfi(i,l),wpsig(i,1),loc(i),wt(i,l-1),vw3(i),"w",vwfi0(i)
  636.  
  637. c on calcule la contrainte jusqu'au pic uniquement
  638. wpsigt(i)=vwfi0(i)
  639. c modif
  640. C if(wpsigt(i).lt.wpsigt0(i)) then
  641. C wpsigt(i)=wpsigt0(i)
  642. C end if
  643. wmiloc(i)=wmi0(1)
  644. sigmaxt(i)=sig0(i)
  645. go to 40
  646. c on sort de la boucle des deuxiemes fissures fictives l
  647. end if
  648. end if
  649.  
  650. c stockage des variables fictives du pas
  651. varft(1,l)=sigf(1,1,l)
  652. varft(2,l)=sigf(2,1,l)
  653. varft(3,l)=sigf(3,1,l)
  654. varft(4,l)=wfist(1)
  655. varft(5,l)=wfist(2)
  656. varft(6,l)=wfist(3)
  657. varft(7,l)=wmi(1)
  658.  
  659. end do
  660. c fin de boucle sur les fissures fictives l
  661.  
  662. 40 continue
  663. c print*,l,"l1"
  664. cccccccccccccccccccccccccccccccccccccccccccccccc
  665. c on passe au calcul reel ici
  666. cccccccccccccccccccccccccccccccccccccccccccccccc
  667. if(vw3(i).le.wpsigt(i)) then
  668. ccccccccccccccccccccccccccccccccccccccccccccccccccc
  669. c on charge
  670. cccccccccccccccccccccccccccccccccccccccccccccccccccc
  671. wmul=0.d0
  672. wmr=0.d0
  673. wer=0.d0
  674. nc=0.d0
  675.  
  676. c on calcule la contrainte relle dans la fissure i et l'ouverture de la première fissure
  677. c on peut calculer l ouverture w1 car wt a été construit en imposant vwfi dans la premiere fissure
  678. if(vw3(i).gt.0.d0) then
  679.  
  680. do l=1,ncalc
  681. if(wt(i,l)-vw3(i).gt.0.d0) then
  682. if(l.eq.1) then
  683. sigfr(i)=(sigt(i,l)-0)/(wt(i,l)-0)*
  684. #vw3(i)+sigt(i,l)-(sigt(i,l)-0)/(wt(i,l)-0)*
  685. #wt(i,l)
  686.  
  687. w1(i)=vwfi(i,l)/wt(i,l)*vw3(i)
  688. else
  689.  
  690. sigfr(i)=(sigt(i,l)-sigt(i,l-1))/(wt(i,l)-wt(i,l-1))*
  691. #vw3(i)+sigt(i,l)-(sigt(i,l)-sigt(i,l-1))/(wt(i,l)-wt(i,l-1))*
  692. #wt(i,l)
  693.  
  694. w1(i)=(vwfi(i,l)-vwfi(i,l-1))/(wt(i,l)-wt(i,l-1))*vw3(i)+
  695. #vwfi(i,l)-(vwfi(i,l)-vwfi(i,l-1))/(wt(i,l)-wt(i,l-1))*wt(i,l)
  696. end if
  697. go to 50
  698. end if
  699. end do
  700.  
  701.  
  702.  
  703.  
  704.  
  705. else
  706. sigfr(i)=0.d0
  707. sigb(i)=0.d0
  708. end if
  709. 50 continue
  710. c print*,l,"l2"
  711.  
  712. call endo3f(w1(i),gf,young,
  713. # xmt,dtiso,dt3,epict,rt(1),le(i))
  714.  
  715. c calcul de la déformation totale de l element pour prendre en compte lacontrainteelastique des fibres
  716. call x6x33(epstf6,epse133)
  717.  
  718. do j=1,3
  719. vecwj(1)=vecw33(1,j)
  720. vecwj(2)=vecw33(2,j)
  721. vecwj(3)=vecw33(3,j)
  722. epse13(j)=sum(matmul(vecw,epse133)*vecw)
  723. sigfe(j)=(1.d0-dt3)*
  724. #rhof*max(min(Ef*epse13(j)*cos(phimoy(j)*
  725. #pi/180.d0)**2,fu*cos(phimoy(j)*pi/180.d0)**2),-fu)
  726. end do
  727.  
  728. * sigfe(i)=0.d0
  729.  
  730. sigb(i)=Rt(1)*(1.d0-dt3)
  731. sig(i)=sigb(i)+sigfr(i)*dt3+
  732. #sigfe(i)
  733.  
  734. c print*,sig(i),s1,"calc reel"
  735.  
  736.  
  737. c print*,sig(i),sigb(i),sigfr(i),dt3,sigfe(i)
  738.  
  739.  
  740. if(sig(i).gt.0.d0) then
  741. Sr(i)=lech/exp(log(sig(i)/Rtec)*mw)
  742. s1=Rtec*(lech*8.d0/(Lf*cos(pi*phimoy(i)/180.d0)))**(1/mw)
  743. c print*,sr(i),Lf*cos(pi*phimoy(i)/180.d0)/4.d0
  744. if(sig(i).gt.s1) then
  745. sig(i)=s1
  746. Sr(i)=Lf*cos(pi*phimoy(i)/180.d0)/4.d0
  747. wpsigt(i)=vw3(i)
  748. sigmaxt(i)=min(sigfr(i),sig(i))
  749. c sigmaxt(i)=sig(i)
  750. c sigmaxt(i)=sigf03(i)
  751. c print*,sigfr(3),sig(3),sigfe(i),sigb(i)
  752.  
  753. end if
  754. else
  755. Sr(i)=le(i)
  756. end if
  757.  
  758. c ici l ouverture de la fissure 1 est calculée de maniuere exacte
  759. c mais pour les autres on suppose que l endo du beton est le meme pour tous
  760. if(sig(i).lt.rt(2)) then
  761. nc(1)=1.d0
  762. wmul(i,1)=vw3(i)
  763. else
  764. c on multifissure
  765. nc(1)=1.d0
  766. wmul(i,1)=w1(i)
  767. do r=2,rmax
  768.  
  769.  
  770. if(Sr(i).le.le(i)/(2.d0**(r-1))) then
  771. if(le(i)/Sr(i).lt.2.d0**(r)) then
  772. nc(r)=(le(i)/Sr(i)-(2.d0**(r-1)))/2.d0
  773. else
  774. nc(r)=2.d0**(r-2)
  775. end if
  776. if(r.eq.1) then
  777. nc(r)=1.d0
  778. end if
  779. do k=1,ncalc
  780. c ici sig(i) est remplacé par sigfr(i)
  781. c ca ne change apparemment rien
  782. if(sigfr(i)*dt3-sigf(i,r,k).lt.0.d0) then
  783. if(k.eq.1) then
  784. wmul(i,r)=sigfr(i)*dt3*incremwlis/sigf(i,r,k)
  785. else
  786. wmul(i,r)=(sigfr(i)*dt3-(sigf(i,r,k)-((sigf(i,r,k)-sigf(i,r,k-1))/
  787. #incremwlis)*vwfi(i,k)))/((sigf(i,r,k)-sigf(i,r,k-1))/incremwlis)
  788. c fin remplacement
  789. end if
  790. go to 60
  791. end if
  792. end do
  793. 60 continue
  794.  
  795. c print*,k,"k2",r,"r"
  796.  
  797.  
  798.  
  799. else
  800. wmul(i,r)=0.d0
  801. nc(r)=0.d0
  802. if(r.eq.1) then
  803. nc(1)=1.d0
  804. wmul(i,1)=vw3(i)
  805. end if
  806. end if
  807. C if(i.eq.3) then
  808. C print*,r,nc(r),sr(i),"calc",sig(i),s1
  809. C end if
  810. end do
  811. c fin de boucle sur les Rt
  812. end if
  813. c fin du si sig(i).lt.rt(2)
  814.  
  815.  
  816.  
  817. if(vw3(i).gt.0.d0) then
  818. c calcul de l'ouverture moyenne
  819. do r=1,rmax
  820.  
  821. wmr(r)=nc(r)*wmul(i,r)
  822. end do
  823. c print*,wmr,nc,"nc",sig(i),rt(2)
  824. c print*,Sr(i),le(i)/(2.d0**(1-1)),"test1"
  825. c print*,le(i)/Sr(i),2.d0**(1),"test2"
  826. wmoy(i)=sum(wmr)/sum(nc)
  827.  
  828. if(wmoy(i).ne.wmoy(i)) then
  829. print*,"pb wmr,nc",sum(wmr),sum(nc),rmax,sig(i),rt(2),Sr(i),
  830. #le(i)
  831. print*,"elements finis trop petits"
  832. read*
  833. end if
  834. c calcul de l'ecart type d ouverture
  835. do r=1,rmax
  836. if(nc(r).eq.0.d0) then
  837. wer(r)=0.d0
  838. else
  839. wer(r)=nc(r)*(wmul(i,r)-wmoy(i))**2
  840. end if
  841. end do
  842. Etw(i)=sqrt(sum(wer)/sum(nc))
  843. cvar(i)=etw(i)/wmoy(i)
  844. else
  845. wmoy(i)=0.d0
  846. etw(i)=0.d0
  847. wmr=0.d0
  848. wer=0.d0
  849. cvar(i)=0.d0
  850. end if
  851. c ouverture max
  852. wmax(i)=wmul(i,1)
  853.  
  854. c nombre total de fissures
  855. ncf(i)=sum(nc)
  856.  
  857. if(ncf(i).lt.nc0(i)) then
  858. ncf(i)=nc0(i)
  859. end if
  860.  
  861.  
  862.  
  863. if(sig(i).ge.s1) then
  864. go to 80
  865. end if
  866.  
  867.  
  868. c sauvegarde de la contrainte de decharge
  869. c sigdec(i)=sigf03(i)
  870. sigdec(i)=sigfr(i)
  871.  
  872.  
  873.  
  874.  
  875.  
  876. ** AM
  877. ** else
  878. endif
  879. ccccccccccccccccccccccccccccccccccccccccc
  880. c on localise la fissure en ouvrant
  881. ccccccccccccccccccccccccccccccccccccccccc
  882. 80 continue
  883.  
  884. ** AM
  885.  
  886. if( ((VW3(I).LE.WPSIGT(I)).and.(SIG(I).GE.S1)) . OR.
  887. & (VW3(I).GT.WPSIGT(I)) ) then
  888. iloc(i)=1
  889.  
  890. c le nombre fissure ne peut plus augmenter
  891. ncf(i)=nc0(i)
  892. c seule la fissure 1 continue de s ouvrir les autres ne se dechargent pas...
  893. wfis(i)=wmiloc(i)+(vw3(i)-wpsigt(i))
  894. C if(vw3(i).lt.wpsigt(i)) then
  895. C wfis(i)=vw3(i)
  896. C end if
  897.  
  898.  
  899. C et donc ici on peut recalculer la contrainte comme provenant d'une mono fissure
  900. c rt a bien ete construit dans tous les cas
  901. Rtb=Rt(1)
  902. do n=1,npos
  903. do k=1,2*npos-2
  904. c calcul de la force moyenne pour une fibre traversant la fissure i inclinée de phi1d
  905. c calcul des points caractéristiques de la courbe force ouverture de fissure pour Td et phid
  906. c rigidité initiale
  907. if(phi1d(n,k).le.phicrit) then
  908. call reconf(cokf1,k0m,Rtb,phi1d(n,k),mink01,maxk01)
  909. else
  910. call reconf(cokf2,k0m,Rtb,phi1d(n,k),mink02,maxk02)
  911. end if
  912. c ouverture au pic
  913. if(phi1d(n,k).le.phicrit) then
  914. call reconf(cowp1,wp,Rtb,phi1d(n,k),minwp1,maxwp1)
  915. else
  916. call reconf(cowp2,wp,Rtb,phi1d(n,k),minwp2,maxwp2)
  917. end if
  918. c force au pic
  919. call reconf(cofp,fp,Rtb,phi1d(n,k),minfp,maxfp)
  920. c force intermédiaire post pic
  921. f03=0.3d0*fp
  922. c ouverture pour f=0.3fp
  923. call reconf(cow03,w03,Rtb,phi1d(n,k),minw03,maxw03)
  924. if(w03.le.wp) then
  925. w03=3.0d0*wp
  926. end if
  927. c ouverture finale (f=0)
  928. call reconf(cowf,wf,Rtb,phi1d(n,k),minwf,maxwf)
  929. if(wf.le.w03) then
  930. wf=3.0d0*w03
  931. end if
  932. c calcul de la force dans la fissure i pour les fibres orientées selon ei
  933. if(wfis(i).le.wp) then
  934. B=(k0m*wp-fp)/(fp*wp)
  935. f1(n,k)=k0m*wfis(i)/(B*wfis(i)+1.d0)
  936. else
  937. if(wfis(i).lt.wf) then
  938. f1(n,k)=fp*exp(log(f03/fp)*(wfis(i)-wp)/(w03-wp))
  939. c print*,2,f1(n,k),wp,wf
  940. else
  941. f1(n,k)=precision1
  942. end if
  943. end if
  944. c calcul du terme à l'intérieur de la somme de la contrainte
  945. si0(n,k)=Reiw(n,k)*stri(n,k)*pscal(n,k)*f1(n,k)
  946.  
  947. end do
  948. c fin de boucle sur k
  949. end do
  950. c fin de boucle sur n
  951. c calc de la contrainte
  952. si1=sum(si0)
  953. c wk1=(Gf-gfap(i))/Rt(1)
  954. c wk1=(Gf)/Rt(1)
  955. sigfr(i)=4.d0*rhof*si1/(pi*Df**2*(sum(Romeg)))
  956.  
  957. if(sigfr(i).gt.sigmaxt(i)) then
  958. sigfr(i)=sigmaxt(i)
  959. end if
  960.  
  961.  
  962. if(wfis(i).gt.0.d0) then
  963. c calcul de l'ouverture moyenne
  964. C do r=1,rmax
  965. C nc(r)=ncr0(r)
  966. C if(r.eq.1) then
  967. C wmr(1)=wfis(i)
  968. C else
  969. C wmr(r)=nc(r)*wmul(i,r)
  970. C end if
  971. C end do
  972. C wmoy(i)=sum(wmr)/(sum(nc))
  973. dw3(i)= vw3(i)-vw30(i)
  974.  
  975. c calcul de l'ecart type d ouverture
  976. C do r=1,rmax
  977. C if(r.eq.1) then
  978. C wer(1)=(wfis(i)-wmoy(i))**2
  979. C else
  980. C wer(r)=nc(r)*(wmul(i,r)-wmoy(i))**2
  981. C end if
  982. C end do
  983. C Etw(i)=sqrt(sum(wer)/sum(nc))
  984. if(nc0(i).eq.1.d0) then
  985. etw(i)=0.d0
  986. wmoy(i)=vw3(i)
  987. else
  988. c wmoy(i)=wmoy0(i)+dw3(i)/nc0(i)
  989. wmoy(i)=wmoy0(i)
  990. C on conserve le coefficient de variation lors de la localisation
  991. etw(i)=etw0(i)
  992. end if
  993.  
  994. else
  995. wmoy(i)=0.d0
  996. etw(i)=0.d0
  997. wmr=0.d0
  998. wer=0.d0
  999. end if
  1000. c ouverture max
  1001. wmax(i)=wfis(i)
  1002. c print*,wmax(i),i,"loc",vw3(i),vw30(i),wmaxact(i),rmax,le(i)
  1003. c print*, wpsigt(i),sigmaxt(i),sum(Romeg),sigfr(i),wfis(i),nc0(i),
  1004. c # wmiloc(i)
  1005. c print*,"loc",dw3(i),vw30(i),etw(i),etw0(i),wmoy(i),i
  1006.  
  1007.  
  1008. c sauvegarde de la contrainte pour decharge
  1009. c sigdec(i)=sigf03(i)
  1010. sigdec(i)=sigfr(i)
  1011.  
  1012. c print*,sigdec(i),i,vw3(i),vw30(i),wmaxact(i)
  1013.  
  1014. if(vw3(i).le.wferm(i)) then
  1015. go to 100
  1016. end if
  1017.  
  1018. C if(sigfr(i).lt.0.d0) then
  1019. C print*,sigfr(i),vw3(i),vw30(i),wmaxact(i),wfis(i),
  1020. C #wmiloc(i),vw3(i),wpsigt(i)
  1021. C read*
  1022. C end if
  1023. ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  1024. end if
  1025. c fin calcul avec w qui augmente
  1026. ccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  1027.  
  1028.  
  1029. ** AM
  1030. ** else
  1031. endif
  1032.  
  1033. ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  1034. c on a vw3(i).lt.wmaxact(i) donc on a fermé la fissure on est dans une phase décharge
  1035. cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  1036.  
  1037. 100 continue
  1038. ** AM
  1039. IF( (VW3(I).LT.WFERM(I)) .OR.
  1040. & (VW3(I).LT.WPLMAX(I))) THEN
  1041.  
  1042.  
  1043. C if(vw30(i).ge.vw3(i)) then
  1044. C sigfr(i)=sigf03(i)-rig0t(i)*(vw30(i)-vw3(i))
  1045. C else
  1046. C print*,"comme par hasard",vw30(i),vw3(i)
  1047. C read*
  1048. C if(sigf03(i)-rig0t(i)*(vw30(i)-vw3(i)).gt.sigf03(i)) then
  1049. C sigfr(i)=sigf03(i)
  1050. C else
  1051. C sigfr(i)=sigf03(i)-rig0t(i)*(vw30(i)-vw3(i))
  1052. C end if
  1053. C end if
  1054.  
  1055. c modif
  1056. c sigfr(i)=sigf03(i)-rig0t(i)*(wmaxact(i)-vw3(i))
  1057.  
  1058.  
  1059. if(vw30(i).ge.vw3(i)) then
  1060. sigfr(i)=sigf03(i)-rig0t(i)*(vw30(i)-vw3(i))
  1061. c else if(wmaxact(i).ge.vw3(i)) then
  1062. c sigfr(i)=sigf03(i)-rig0t(i)*(wmaxact(i)-vw3(i))
  1063. else if(sigf03(i)-rig0t(i)*(vw30(i)-vw3(i)).ge.sigf03(i)) then
  1064. sigfr(i)=sigf03(i)-rig0t(i)*(vw30(i)-vw3(i))
  1065. c else if(sigf03(i)-rig0t(i)*(wmaxact(i)-vw3(i)).ge.sigf03(i)) then
  1066. c sigfr(i)=sigf03(i)-rig0t(i)*(wmaxact(i)-vw3(i))
  1067. end if
  1068.  
  1069. c print*,sigfr(i),sigf03(i),sigdec(i)
  1070.  
  1071.  
  1072. if((sigfr(i).lt.0.d0).and.(sigf03(i).gt.0.d0)) then
  1073. sigfr(i)=0.d0
  1074. if(vw3(i).gt.wferm(i)) then
  1075. wferm(i)=vw3(i)
  1076. end if
  1077. end if
  1078.  
  1079. if(sigfr(i).lt.0.d0) then
  1080. sigfr(i)=0.d0
  1081. else if(sigfr(i).gt.sigdec(i)) then
  1082. sigfr(i)=sigdec(i)
  1083. end if
  1084.  
  1085. if(vw3(i).lt.wferm(i)) then
  1086. sigfr(i)=0.d0
  1087. end if
  1088.  
  1089.  
  1090. ncf(i)=nc0(i)
  1091. dw3(i)= vw3(i)-vw30(i)
  1092.  
  1093.  
  1094.  
  1095. if(nc0(i).eq.1.d0) then
  1096. etw(i)=0.d0
  1097. wmoy(i)=vw3(i)
  1098. wmax(i)=vw3(i)
  1099. else
  1100. wmoy(i)=wmoy0(i)+dw3(i)/nc0(i)
  1101. c Etw(i)=etw0(i)/wmoy0(i)*wmoy(i)
  1102. Etw(i)=cvar(i)*wmoy(i)
  1103. end if
  1104. wmax(i)=wmax0(i)+dw3(i)/nc0(i)
  1105. if(wmax(i).lt.0.d0) then
  1106. wmax(i)=0.d0
  1107. end if
  1108.  
  1109. end if
  1110.  
  1111. 70 continue
  1112.  
  1113. if(ncf(i).lt.nc0(i)) then
  1114. print*,"le nombre de fissures a diminue"
  1115. print*,ncf(i),nc0(i),i,vw3(i),vw30(i),wmaxact(i)
  1116. stop
  1117. end if
  1118.  
  1119. if(wmax(i).ge.wmaxd0(i)) then
  1120. wmaxd(i)=wmax(i)
  1121. else
  1122. wmaxd(i)=wmaxd0(i)
  1123. end if
  1124. end do
  1125. c fin de boucle sur les fissures
  1126.  
  1127. C print*,sigfr(1),sigfr(2),sigfr(3),"sig"
  1128. C print*,vw3(1),vw3(2),vw3(3),"vw"
  1129. C print*,ncf(1),ncf(2),ncf(3),"nc"
  1130. C print*,etw(1),etw(2),etw(3),"etw"
  1131.  
  1132. if(etw(1).ne.etw(1).or.etw(2).ne.etw(2).or.etw(3).ne.etw(3)) then
  1133. print*,"probleme ecart type fissure" ,etw(1),etw(2),etw(3)
  1134. print*,Etw0(1),vw3(1),dw3(1),wmoy(1),nc0(1),wmaxact(1),wmoy0(1),
  1135. #ncf(1),iloc(1)
  1136. print*,Etw0(2),vw3(2),dw3(2),wmoy(2),nc0(2),wmaxact(2),wmoy0(2),
  1137. #ncf(2),iloc(2)
  1138. print*,Etw0(3),vw3(3),dw3(3),wmoy(3),nc0(3),wmaxact(3),wmoy0(3),
  1139. #ncf(3),iloc(3)
  1140. read*
  1141. end if
  1142.  
  1143. C if(nc(3).gt.16.d0) then
  1144. C print*,'pb'
  1145. C read*
  1146. C end if
  1147.  
  1148. c reconstruction du tenseur des contraintesde fibres avec endo dans la base fixe
  1149. do i=1,3
  1150. do j=1,3
  1151. if(i.eq.j) then
  1152. sigfp33(i,j)=sigfr(i)
  1153. else
  1154. sigfp33(i,j)=0.d0
  1155. end if
  1156. end do
  1157. end do
  1158. c sigfx33=matmul(matmul(transpose(vecw33),sigfp33),vecw33)
  1159. c vecw33 est la matrice de passage de la base maillage a fissuration
  1160. c ici on veut faire l inverse cad : P A tP
  1161. sigfx33=matmul(matmul(vecw33,sigfp33),transpose(vecw33))
  1162. call x33x6(sigfx33,sigfx6)
  1163.  
  1164. C print*,"wmax",wmax
  1165. C print*,"wmoy",wmoy
  1166. C print*,"etw",etw
  1167. C print*,"ncf",ncf
  1168. C if(sum(sigfx6*sigfx6).gt.0.d0) then
  1169. C print*,"sigfx6",sigfx6
  1170. C end if
  1171.  
  1172. C print*,"sig(3)",sig(3),"sigfr",sigfr(3),s1
  1173. C #,"dt3","wmaxd",wmaxd(3),dt3
  1174. return
  1175.  
  1176. end
  1177.  
  1178.  

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