Télécharger sjonl2.eso

Retour à la liste

Numérotation des lignes :

sjonl2
  1. C SJONL2 SOURCE PASCAL 21/09/24 21:15:01 11108
  2. SUBROUTINE SJONL2(sigi, depst, vari, xmat, trac, jtrac ,
  3. > tras, jtras, trat, jtrat, sigf, varf,
  4. > depsp, ireturn)
  5. c --- SJONL2 ---
  6. c computing plastic flow in joint element
  7. c under 2D plane (strain) conditions
  8. c
  9. c former version 13-06-00 ylp.
  10. c update 15-03-01 ylp.
  11. c a shear unloading parameter has been added --> beta
  12. *
  13. c sigi IN initial stress
  14. c depst IN total strain increment
  15. c vari IN initial internal variable
  16. c xmat IN material properties
  17. c tras IN shear plastic softening behaviour
  18. c jtras IN <tras> number of points
  19. c trat IN tensile plastic softening behaviour
  20. c jtrat IN <trat> number of points
  21. c sigf OUT final stress
  22. c varf OUT final internal variable
  23. c depsp OUT plastic strain increment
  24. c ireturn OUT routine control integer
  25.  
  26. IMPLICIT REAL*8(A-H,K-Z)
  27.  
  28. IMPLICIT INTEGER(I-J)
  29. dimension sigi(*), depst(*), vari(*),
  30. > sigf(*), depsp(*), varf(*)
  31. dimension ddepst(2), ddepsp(2)
  32. dimension xmat(*)
  33. c xmat 1 --> Ks elastic shear modulus
  34. c 2 --> Kt elastic traction modulus
  35. c 3 --> rho? mass per unit volume
  36. c 4 --> alpha? thermal coefficient
  37. c 5 --> edge location of the edge of the friction cone
  38. c 6 --> cplg make damage dependencies
  39. c 7 --> beta control shear unloading
  40. dimension trac(2,jtrac), tras(2,jtras), trat(2,jtrat)
  41. c 1 --> strain
  42. c 2 --> stress
  43. c WARNING original version
  44. c dimension TRAS(2,NTRAT), TRAT(2,NTRAS) ?????
  45. c_______________________________________________________________________
  46. c
  47. * save iloop
  48. * data iloop/0/
  49. * iloop = iloop + 1
  50. c do i=1,2
  51. c print *,'depst ',depst(i)
  52. c print *,'vari ', vari(i)
  53. c print *,'sigi ', sigi(i)
  54. c print *,'sigf ', sigf(i)
  55. c print *,'varf ',varf(i)
  56. c print *,'depst ',depst(i)
  57. c enddo
  58. c do i=1,6
  59. c print *,'xmat ', xmat(i)
  60. c enddo
  61. c print *,'tras ', tras ,' jtras ', jtras
  62. c print *,'trat ', trat ,' jtrat ', jtrat
  63. c print *,'trac ', trac ,' jtrac ', jtrac
  64. c
  65. c print *,'ireturn ', ireturn
  66. c look at xmat(6) and deduce elastic/plastic...
  67. c
  68. c ...coupled/uncoupled variables.
  69. c all variables Jxxx are integer used as logical with the
  70. c following rule (0 is true, 1 is false)
  71. c JCP : use plastic law in compression
  72. c JSP : use plastic law in shear
  73. c JTP : use plastic law in tension
  74. c JST : couple shear and tension
  75. c JSC : couple shear and compression
  76. call sjoncpl(xmat(6),JCP,JSP,JTP,JST,JSC)
  77. * print *,'DEBUG --> entree dans sjonl2'
  78. * print *,'DepsN DepsS ' ,depst(2), depst(1)
  79. * set some usefull variables
  80. ZERO = 0.0d0
  81. ONE = 1.0d0
  82. c set the initial location of the edge of the cone
  83. ETi = xmat(5)
  84. c index definition
  85. Ipress = 2
  86. Ishear = 1
  87. Itotal = 3
  88. Icompr = 4
  89. Istrain = 1
  90. Istress = 2
  91. c unloading constitutive parameters
  92. c the unloading shear stiffness is computed by using a linear
  93. c interpolation between the elastic stiffness and the
  94. c damaged stiffness... Beta is equal to 0 to obtain a
  95. c simple elastic unloading and is equal to 1 to get the
  96. c damaged stiffness
  97. Beta = xmat(7)
  98. c number of increments
  99. INCR = 5
  100. c______________________________________________________________________
  101. c
  102. c elastic initialisation of the joint stiffness --> K
  103. c K[z]
  104. c with z = t tensile ; s shear ; c compression
  105. Kt0 = xmat(Ipress)
  106. Ks0 = xmat(Ishear)
  107. Kc0 = Kt0
  108. c print *,'Deps - tension ',depst(Ipress)
  109. c print *,'Deps - shear ',depst(Ishear)
  110. c split the displacement increment in few smaller increments
  111. ddepst(Ipress) = depst(Ipress)/INCR
  112. ddepst(Ishear) = depst(Ishear)/INCR
  113. c STARTING MAIN LOOP
  114. c [0
  115. do iflag =1 , INCR
  116. c______________________________________________________________________
  117. c
  118. c initial residual strength
  119. c RTS --> tensile
  120. c RSS --> shear
  121. c
  122. c internal variables initialisation --> Alpha
  123. c A[xyz]
  124. c with x = i initial ; f final ; k intermediate computational value
  125. c y = p plastic ; t total
  126. c z = t tensile ; s shear
  127. c [1
  128. c if ( JTP .ne. 0 ) then
  129. Aipt = vari(Ipress)
  130. c \--> initial plastic tensile strain
  131. c print *,'initial plastic tensile strain',Aipt
  132. c compute the tensile stress RTS corresponding to the initial
  133. c plastic tensile strain with <trat> evolution
  134. call yofxcu(Aipt ,trat, jtrat, RTS, dRTS, ireturn)
  135. c \--> Aipt initial plastic tensile strain
  136. c RTS OUT
  137. c dRTS = dTkt/dAkps useless value
  138. c check if Aipt has a positive value or zero
  139.  
  140. c [2
  141. if ( ireturn .ne. 0 ) return
  142. c 2]
  143. c \--> ERROR
  144. c print *,'tensile stress RTS', RTS
  145. c endif
  146. c 1]
  147. c [1
  148. c if ( JSP .ne. 0 ) then
  149. Aips = vari(Ishear)
  150. c \--> initial plastic shear strain
  151. c print *,'initial plastic shear strain', Aips
  152. c compute the initial cohesion residual
  153. c print *,tras(Istress,1)
  154. call yofxcu(Aips, tras, jtras, RSS, dRSS, ireturn)
  155. c [2
  156. if (ireturn .ne. 0) return
  157. c \--> ERROR
  158. c 2]
  159. c print *,'initial cohesion residual',RSS
  160. c endif
  161. c 1]
  162. c if ( JCP .eq. 0 ) then
  163. Aipc = vari(Icompr)
  164. c \--> initial plastic compression strain
  165. c compute the initial compressive strength
  166. call yofxcu(Aipc, trac, jtrac, RCS, dRCS, ireturn)
  167. c print *,'Aipc RCS ',Aipc, RCS
  168. c [2
  169. if (ireturn .ne. 0) return
  170. c \--> ERROR
  171. c 2]
  172. c endif
  173. c 1]
  174. c______________________________________________________________________
  175. c
  176. c compute the predicted elastic stress state
  177. c using the secant stiffness
  178. c
  179. c first, look at the tension modulus...
  180. c maximal (initial) tensile stress initialisation
  181. c N.B.: it is thus assumed that the behaviour in tension is elastic
  182. c plastic, and that the peak value features the end of the elastic
  183. c regime.
  184. c check whether tension or compression region is reached
  185. Aitt = vari(Itotal)
  186. c \--> initial total tensile strain
  187. c compute final total tensile strain...
  188. Aftt = Aitt + ddepst(Ipress)
  189. * write(6,*) 'Aitt, Aftt =',Aitt, Aftt
  190. c ... and the initial tensile strength...
  191. TT0 = trat(Istress,1)
  192. c ... and the elastic compressive strength
  193. TC0 = trac(Istress,1)
  194. c print *,'TC0 ',TC0
  195. c check one or two things if entering sjonl2 for first time
  196. c [1
  197. ** mise en commentaire par TC
  198.  
  199. * if ( iloop .eq. 1) then
  200. c [2
  201. * if ( TT0 .eq. ZERO ) then
  202. * print *,'cut-off tensile strength is zero'
  203. * print *,'denied option'
  204. * return
  205. * endif
  206. c 2]
  207. c [2
  208. * if ( TT0 .gt. ETi ) then
  209. * print *,'WARNING cut-off ouside the friction cone...'
  210. * print *,'... tensile strength at the edge of the cone'
  211. * print *,'set to cut-off tensile strength'
  212. * endif
  213. c 2]
  214. * endif
  215. * fin de mise en commentaire par TC
  216. c 1]
  217. c initialization of the damage variables
  218. Dtensi = 1.0d0
  219. Dshear = 1.0d0
  220. Dcompr = 1.0d0
  221. c WARNING the damage variables are understand here as :
  222. c D = 1 means no damage
  223. c D = 0 means full damage...
  224. c which is exactly the opposite of the usual definition !!!
  225. c [1
  226. if ( Aftt .gt. ZERO ) then
  227. c \--> tensile region reached...
  228. c [2
  229. if ( JTP .ne. 0 ) then
  230. c \--> use elastic law
  231. Kt = Kt0
  232. else
  233. c \--> use damage predictor
  234. c [3
  235. if ( RTS .eq. ZERO ) then
  236. c \--> zero residual tensile strength
  237. Kt = ZERO
  238. c \--> tensile modulus set to zero
  239. else
  240. c \--> still got residual tensile strength
  241. Kt = RTS / ( Aipt + TT0 / Kt0 )
  242. c \--> damaged stiffness
  243. endif
  244. c 3]
  245. c update tensile damage variable to enable coupling effect
  246. c [3
  247. if ( JST .eq. 0) Dtensi = RTS / TT0
  248. c 3]
  249. endif
  250. c 2]
  251. c print *,'Dtensi ' ,Dtensi
  252. JCT = 0
  253. c JCT is an integer value used as a logical to control the location
  254. c of the stress state with respect to tension or compression:
  255. c tension --> JCT = 0
  256. c compression --> JCT = 1
  257. else
  258. c \--> compression region reached...
  259. c [2
  260. if ( JCP .ne. 0 ) then
  261. c \--> use elastic law
  262. Kc = Kc0
  263. else
  264. c \--> use damage predictor
  265. c [3
  266. if ( RCS .eq. ZERO ) then
  267. Kc = ZERO
  268. else
  269. Kc = RCS / (Aipc + TC0 / Kc0 )
  270. endif
  271. c 3]
  272. c update compression damage variable
  273. c Dcompr = Kc / Kc0 --> too fast
  274. c ... try something else...
  275. c print *,ubound(trac)
  276. endif
  277. c 2]
  278. JCT = 1
  279. endif
  280. c ]1
  281. c ... then, look at the shear modulus
  282. TS0 = tras(Istress,1)
  283. c [1
  284. if (JSP .ne. 0 ) then
  285. Ks = Ks0
  286. else
  287. c [2
  288. if ( RSS .eq. ZERO ) then
  289. c \--> zero residual shear strength
  290. c or opened bonds
  291. Ks = ZERO
  292. c \--> shear modulus set to zero
  293. c Such case shall only appear if the bonds are opened.
  294. c otherwise, residual cohesion is generally observed
  295. else
  296. c \--> still got residual shear strength
  297. Ksd = RSS / (Aips + TS0 / Ks0)
  298. c [3
  299. if ( RSS .eq. TS0 ) then
  300. c \--> still in the elastic regime
  301. Ks = Ksd
  302. else
  303. c \--> non linear regime...
  304. c the stiffness is computed by using an
  305. c interpolation between the elastic stiffness
  306. c and the damaged stiffness
  307. Ks = ( ( 1.0D0 - Beta ) * Ks0 ) + ( Beta * Ksd )
  308. endif
  309. c 3]
  310. endif
  311. c update the shear damage variable
  312. if (JST .eq. 0) Dshear = RSS / TS0
  313. c print *,'Dshear ' , Dshear
  314. c 2]
  315. endif
  316. c 1]
  317.  
  318. c [1
  319. if (JCT .eq. 0) then
  320. c check if previous stress state was in compression
  321. c [2
  322. if ( (Aitt * Aftt) .lt. ZERO ) then
  323. Tft = Kt * Aftt * Dtensi
  324. else
  325. Tft = sigi(Ipress) + ( ddepst(Ipress) * Kt * Dshear)
  326. endif
  327. c 2]
  328. Tfs = sigi(Ishear) + ( ddepst(Ishear) * Ks * Dtensi)
  329. else
  330. c check if previous stress state was in tension
  331. c [2
  332. if ( (Aitt * Aftt) .lt. ZERO ) then
  333. Tfc = Kc * Aftt * Dcompr
  334. else
  335. c Tfc = sigi(Ipress) + ( ddepst(Ipress) * Kc * Dshear)
  336. Tfc = sigi(Ipress) + ( ddepst(Ipress) * Kc )
  337. endif
  338. c 2]
  339. Tfs = sigi(Ishear) + ( ddepst(Ishear) * Ks * Dcompr)
  340. endif
  341. c 1]
  342.  
  343. c print *,'stress state elastic prediction'
  344. c print *,'tension compression shear'
  345. c print *,Tft, Tfc, Tfs
  346. c______________________________________________________________________
  347. c
  348. c before checking if any kind of yielding occured, update the
  349. c final internal variables in the case of simple elastic regime.
  350. Afpt = Aipt
  351. Afps = Aips
  352. Afpc = Aipc
  353. c______________________________________________________________________
  354. c
  355. c now, check yielding
  356. c N.B.: note that each mode might be activated independently
  357. c without any restriction!!!!
  358. c first, look at the tension/compression mode...
  359. c [1
  360. if ( JCT .eq. 0 ) then
  361. c [2
  362. if ( JTP .eq. 0 ) then
  363. c [3
  364. if ( abs(Tft) .gt. RTS*Dshear ) then
  365. c \--> YIELDING IN TENSION
  366. c print *,'yielding in tension...'
  367. c Afpt = Aftt - TT0 / Kt0
  368. Afpt = Aipt + (Tft-RTS*Dshear)/Kt
  369. c print *,'Afpt ',Afpt
  370. c \--> updated plastic tensile strain
  371. c print *,'updated plastic tensile strain ', Afpt
  372. c compute the updated residual tensile strength...
  373. call yofxcu(Afpt, trat, jtrat, RTS ,dRTS, ireturn)
  374. c \--> Afpt updated plastic tensile strain
  375. c RTS updated residual tensile strength
  376. c dTkt dummy
  377. Tft = RTS * Dshear
  378. c \--> compute the final tensile stress
  379. c print *,'residual tensile strength ',Tft
  380. endif
  381. c 3]
  382. endif
  383. c 2]
  384. else
  385. c [2
  386. if ( JCP .eq. 0 ) then
  387. c if ( abs(Tfc) .gt. abs(RCS)*Dshear) then
  388. c [3
  389. if ( abs(Tfc) .gt. abs(RCS) ) then
  390. c \--> YIELDING IN COMPRESSION
  391. c print *,'yielding in compression'
  392. c Afpc = abs(Aftt) - TC0 / Kc0
  393. c Afpc = Aipc + ((Tfc*-1.0d0)-RCS*Dshear)/Kc
  394. Afpc = Aipc + ((Tfc*(-1.0d0))-RCS)/Kc
  395. c \--> updated plastic compression strain
  396. c print *,'updated plastic compression strain ', Afpc
  397. c compute the updated residual compression strength
  398. call yofxcu(Afpc, trac, jtrac, RCS , dRCS, ireturn)
  399. c then, go back to the compression domain (negative stress)
  400. Tfc = RCS * (-1.0d0)
  401. c print *,'residual compressive strength ',RCS
  402. endif
  403. c 3]
  404. endif
  405. c 2]
  406. endif
  407. c 1]
  408. c ... finally, look at the shear mode...
  409. c compute the tensile value at the edge using an homothetic transform.
  410. c the cut-off value plays the role of a drag-stress
  411. c ETf = RTS + ETi - TT0
  412. c ... definitely not relevant!!!!
  413. c ... try something else... like a simple homothetic rule related to
  414. c the location of the residual cut-off with regard to the initial
  415. c location of the edge of the friction cone
  416. ETf = ETi * RTS / TT0
  417. c the behaviour in shear is assumed to follow a
  418. c homothetic rule with respect to the behaviour in pure shear
  419. c the coefficient of this homothetic transform is given by...
  420. c [1
  421. if ( JSP .eq. 0 ) then
  422. c [2
  423. if ( ETf .ne. ZERO ) then
  424. c [3
  425. if ( JCT .eq. 0 ) then
  426. c \--> shear yielding with tension
  427. Chom = (ETf - Tft)/(ETf)*Dtensi
  428. c print *,'Coef. hom. ', Chom
  429. c WARNING the original version used
  430. c Chom = (RTS - Tft)/(RTS +Pnor)
  431. c xmat(5) or PNOR is a simple numerical value used is order to
  432. c avoid division by zero if the residual cohesion vanishes.
  433. c print *,'???', Dtensi, ONE
  434. c [4
  435. if ( Dtensi .eq. ONE) then
  436. c \--> no tensile damage
  437. c [5
  438. if ( abs(Tfs) .gt. (RSS*Chom) ) then
  439. c \--> YIELDING IN SHEAR
  440. c print *,'YIELDING IN SHEAR'
  441. c compute the total plastic shear strain...
  442. Afps = Aips + ((abs(Tfs)/Chom)-RSS)/Ks
  443. c print *,'plasti shear strain ', Afps
  444. c ...and the final cohesion residual
  445. call yofxcu(Afps,tras,jtras,RSS,dRSS,ireturn)
  446. c [6
  447. if (ireturn .ne. 0) return
  448. c \--> ERROR
  449. c 6]
  450. Tfs = sign(Chom*RSS , Tfs)
  451. c print *,'updated shear stress ',Tfs
  452. endif
  453. c 5]
  454. else
  455. c \--> already got some damage due to tension
  456. Afpstmp = Aips+ (abs(Tfs)/Chom-RSS)/(Ks*Dtensi)
  457. c print *, Afpstmp
  458. c [5
  459. if ( Afpstmp .gt. ZERO ) then
  460. call yofxcu(Afpstmp,tras,jtras,RSSTMP,dRSS,ireturn)
  461. c [6
  462. if (ireturn .ne. 0) return
  463. c \--> ERROR
  464. c 6]
  465. c print *,'RSSTMP', RSSTMP
  466. c [6
  467. if ( abs(Tfs) .gt. (Chom*RSSTMP) ) then
  468. c \--> YIELDING IN SHEAR
  469. Afps = Afpstmp
  470. c print *,'YIELDING IN SHEAR 2'
  471. RSS = RSSTMP
  472. Tfs = sign(Chom*RSS , Tfs)
  473. c print *,'updated shear stress ',Tfs
  474. endif
  475. c 6]
  476. endif
  477. c 5]
  478. endif
  479. c 4]
  480. else
  481. c \--> check shear yielding in compression region
  482. Chom = (ETf - Tfc)/(ETf)*Dcompr
  483. c print *,'Coef. hom. ', Chom
  484. c print *,'???', Dcompr, ONE
  485. c [4
  486. if ( Dcompr .eq. ONE) then
  487. c \--> no crushing damage
  488. c [5
  489. if ( abs(Tfs) .gt. (RSS*Chom) ) then
  490. c \--> YIELDING IN SHEAR
  491. c print *,'YIELDING IN SHEAR'
  492. c compute the total plastic shear strain...
  493. Afps = Aips + ((abs(Tfs)/Chom)-RSS)/Ks
  494. c print *,'plasti shear strain ', Afps
  495. c ...and the final cohesion residual
  496. call yofxcu(Afps,tras,jtras,RSS,dRSS,ireturn)
  497. c [6
  498. if (ireturn .ne. 0) return
  499. c \--> ERROR
  500. c 6]
  501. Tfs = sign(Chom*RSS , Tfs)
  502. c print *,'updated shear stress ',Tfs
  503. endif
  504. c 5]
  505. else
  506. c \--> already got some damage due to compression
  507. Afpstmp = Aips+ (abs(Tfs)/Chom-RSS)/(Ks*Dcompr)
  508. c print *, Afpstmp
  509. c [5
  510. if ( Afpstmp .gt. ZERO ) then
  511. call yofxcu(Afpstmp,tras,jtras,RSSTMP,dRSS,ireturn)
  512. c [6
  513. if (ireturn .ne. 0) return
  514. c \--> ERROR
  515. c 6]
  516. c print *,'RSSTMP', RSSTMP
  517. c [6
  518. if ( abs(Tfs) .gt. (Chom*RSSTMP) ) then
  519. c \--> YIELDING IN SHEAR
  520. Afps = Afpstmp
  521. c print *,'YIELDING IN SHEAR 2'
  522. RSS = RSSTMP
  523. Tfs = sign(Chom*RSS , Tfs)
  524. c print *,'updated shear stress ',Tfs
  525. endif
  526. c 6]
  527. endif
  528. c 5]
  529. endif
  530. c 4]
  531. endif
  532. c 3]
  533. else
  534. c \--> the edge has reach the origin... no homothetic rule
  535. c can be computed !
  536. c print *,'EDGE ZERO -- ERROR'
  537. endif
  538. c 2]
  539. endif
  540. c 1]
  541. c______________________________________________________________________
  542. c
  543. c final stage --> updating the output variables...
  544. c ... first the final stress...
  545. c [1
  546. if ( JCT .eq. 0 ) then
  547. sigf(Ipress) = Tft
  548. sigi(Ipress) = Tft
  549. else
  550. sigf(Ipress) = Tfc
  551. sigi(Ipress) = Tfc
  552. endif
  553. c 1]
  554. sigf(Ishear) = Tfs
  555. sigi(Ishear) = Tfs
  556. c ... then the final internal variables...
  557. varf(Ipress) = Afpt
  558. varf(Ishear) = Afps
  559. varf(Icompr) = Afpc
  560. varf(Itotal) = Aftt
  561. c ... and finally, the plastic strain increments.
  562. c [1
  563. if ( JCT .eq. 0 ) then
  564. ddepsp(Ipress) = varf(Ipress) - vari(Ipress)
  565. else
  566. ddepsp(Ipress) = varf(Icompr) - vari(Icompr)
  567. endif
  568. c 1]
  569. ddepsp(Ishear) = varf(Ishear) - vari(Ishear)
  570. vari(Ipress) = Afpt
  571. vari(Ishear) = Afps
  572. vari(Icompr) = Afpc
  573. vari(Itotal) = Aftt
  574. depsp(Ipress) = depsp(Ipress) + ddepsp(Ipress)
  575. depsp(Ishear) = depsp(Ishear) + ddepsp(Ishear)
  576. c END OF MAIN LOOP
  577. c 0]
  578. enddo
  579. c print *,'output variables :'
  580. c print *,' --> stress state - normal shear'
  581. c print *, sigf(Ipress), sigf(Ishear)
  582. c print *,'internal variables - normal - shear - total'
  583. c print *, varf(Ipress), varf(Ishear), varf(Itotal)
  584. c print *,'plastic strain - normal - shear'
  585. c print *, depsp(Ipress), depsp(Ishear)
  586. c And, that's all folks !!!!
  587. c print *,'sjonl2 ended normaly...'
  588. end
  589.  
  590.  
  591.  
  592.  
  593.  
  594.  

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