Télécharger triele.eso

Retour à la liste

Numérotation des lignes :

triele
  1. C TRIELE SOURCE PV090527 26/04/30 21:16:43 12529
  2. C=======================================================================
  3. C CREATION : bp, le 18.10.2005
  4. C MODIFS : -modif de la projection : bp, le 07/02/2006
  5. c -refonte de l'operateur pour integration dans Cast3M (aout2008)
  6. c -mise à 0. de Phi et Psi moins aleatoire (septembre 2009)
  7. c -syntaxe 2 (bp, juin 2010)
  8. c -ajout option 'DESENRICHISSEMENT' (bp, avril 2012)
  9. c -ajout SURE, GG 2017-2019
  10. c
  11. C=======================================================================
  12. C FONCTION :
  13. C TRIE LES ELEMENTS SELON LES ISOZEROS DES CHPOINTS LEVEL SET
  14. C
  15. C=======================================================================
  16. c SYNTAXE 1 :
  17. c chelX_n+1 | | = TRIE mod_n psi_n+1 phi_n+1 | | ;
  18. c | | | 'SAUT' |
  19. c | relaX | | 'DESENR' |
  20. c
  21. c (mod_n est actualisé --> mod_n+1)
  22. C
  23. C E: phi_n+1 = MCHPOI distance au plan de fissure a linstant n+1
  24. C E: psi_n+1 = MCHPOI distance au front de fissure a linstant n+1
  25. C E: mod_n = MMODEL a linstant n
  26. C (contient eventuellement une zone avec des element X-FEM
  27. C et IVAMOD pointe alors vers chelX_n)
  28. C E: 'SAUT' = mot cle optionnel permettant de limiter le niveau
  29. C d'enrichissement a H. La pointe doit etre sur un bord
  30. C d'element
  31. C E: 'DESENR' = mot cle optionnel permettant de 'desenrichir' le modele
  32. C S: mod_n+1 = MMODEL a linstant n+1 (mise a jour de IVAMOD)
  33. C S: chelX_n+1 = MCHELM d'enrichissement a linstant n+1
  34. C (construit d'apres les iso-zero de phi et psi)
  35. C S: relaX : relation associée au desenrichissement
  36. c (mise a zero des 'pointes devenues obsolètes')
  37. C
  38. C=======================================================================
  39. c SYNTAXE 2 :
  40. c TRIE mod_? chelX_n+1
  41. c mod_n+1
  42. c
  43. C E: mod_? = MMODEL contenant ou pas des enrichissements
  44. C E: chelX_n+1 = MCHELM d'enrichissement a l instant n+1
  45. C S: mod_n+1 = MMODEL pointant vers chelX_n+1 (inscrit dans IVAMOD)
  46. C
  47. C=======================================================================
  48. C
  49. SUBROUTINE TRIELE
  50. c
  51. C=======================================================================
  52. c
  53. IMPLICIT INTEGER(I-N)
  54. IMPLICIT REAL*8 (A-H,O-Z)
  55.  
  56. C SEGMENTS INCLUDE
  57.  
  58. -INC PPARAM
  59. -INC CCOPTIO
  60. -INC SMCOORD
  61. -INC SMELEME
  62. -INC SMCHPOI
  63. -INC SMMODEL
  64. -INC SMCHAML
  65. -INC SMLREEL
  66. -INC SMINTE
  67. -INC SMRIGID
  68.  
  69. LOGICAL LOG1
  70. CHARACTER*(LOCOMP) nomc1,nomc2
  71. C CHARACTER*(LOCOMP) char1
  72. PARAMETER (NMOT0=2)
  73. CHARACTER*4 MOTCLE(NMOT0)
  74. DATA MOTCLE/'SAUT','DESE'/
  75.  
  76. PARAMETER (NDDL1=12)
  77. CHARACTER*4 MOTPR1(NDDL1),MOTDU1(NDDL1)
  78. DATA MOTPR1/'B1X ','B1Y ','B1Z ','C1X ','C1Y ','C1Z ',
  79. >'D1X ','D1Y ','D1Z ','E1X ','E1Y ','E1Z '/
  80. DATA MOTDU1/'FB1X','FB1Y','FB1Z','FC1X','FC1Y','FC1Z',
  81. >'FD1X','FD1Y','FD1Z','FE1X','FE1Y','FE1Z'/
  82. CHARACTER*4 MOTPR2(NDDL1),MOTDU2(NDDL1)
  83. DATA MOTPR2/'B2X ','B2Y ','B2Z ','C2X ','C2Y ','C2Z ',
  84. >'D2X ','D2Y ','D2Z ','E2X ','E2Y ','E2Z '/
  85. DATA MOTDU2/'FB2X','FB2Y','FB2Z','FC2X','FC2Y','FC2Z',
  86. >'FD2X','FD2Y','FD2Z','FE2X','FE2Y','FE2Z'/
  87.  
  88. C
  89. SEGMENT ITYPND(NI)
  90. SEGMENT NDPT1(NI)
  91. SEGMENT NDPT2(NI)
  92. SEGMENT NUMND(NI)
  93. SEGMENT KKGAU(NI)
  94. SEGMENT IDEJVU(NBPTI)
  95.  
  96. c segment pour tableau de travail de reel
  97. SEGMENT XPSI(NI)
  98. SEGMENT XPHI(NI)
  99.  
  100. c autrespointeurs
  101. POINTEUR MCHEX1.MCHELM,MCHEX2.MCHELM
  102. POINTEUR IPTX1.MELEME
  103. POINTEUR MINT1.MINTE,MINT2.MINTE,MINT0.MINTE
  104.  
  105. C=======================================================================
  106. c
  107. NDPT1=0
  108. NDPT2=0
  109. IDIM1 = IDIM + 1
  110. segact,MCOORD*mod
  111.  
  112.  
  113. C=======================================================================
  114. c
  115. c LECTURE DES ARGUMENTS
  116. c
  117. C=======================================================================
  118.  
  119. C++++ le modele a l'instant n
  120. CALL LIROBJ('MMODEL ',MMODE1,1,IRETOU)
  121. IF (IERR .NE. 0) RETURN
  122. CALL ACTOBJ('MMODEL ',MMODE1,1)
  123.  
  124. c++++ L'option pour le niveau d'enrichissement max souhaité
  125. *as 2010_01_20 : selon l'option le niveau d'enrichissement est limité à 1 ou non:
  126. lsaut=100
  127. c CALL LIRCHA(char1,0,iretou)
  128. c if (iretou.ne.0) then
  129. c if (char1.ne.'SAUT') then
  130. c MOTERR=char1
  131. c CALL ERREUR(7)
  132. c RETURN
  133. c else
  134. c lsaut=1000
  135. c endif
  136. c endif
  137. *fin as 2010_01_20
  138. CALL LIRMOT(MOTCLE,NMOT0,IMOT0,0)
  139. if(IMOT0.eq.1) lsaut=1000
  140.  
  141. c++++ lecture d un MCHEX1 d'enrichissement a brancher
  142. CALL LIROBJ('MCHAML',IPIN,0,ISYNTAX)
  143. IF (IERR .NE. 0) RETURN
  144. ISYNTAX=ISYNTAX+1
  145.  
  146. C (syntaxe 2)
  147. if (ISYNTAX .eq. 2) then
  148. CALL ACTOBJ('MCHAML',IPIN,1)
  149. CALL REDUAF(IPIN,MMODE1,MCHEX1,0,IR,KER)
  150. IF(IR .NE. 1) CALL ERREUR(KER)
  151. IF(IERR .NE. 0) RETURN
  152. segact,MCHEX1
  153. c verif : il doit etre de type enrichissement
  154. if ((MCHEX1.TITCHE).ne.'ENRICHIS') then
  155. MOTERR='MCHAML'
  156. MOTERR(9:16)='ENRICHIS'
  157. c "On attendait un %M1:8 de %m9:24"
  158. CALL ERREUR(1025)
  159. return
  160. endif
  161. c verif : il doit comporter au moins 1 sous-zone
  162. if(MCHEX1.ICHAML(/1) .EQ. 0) THEN
  163. if (impi.ge.1) write(ioimp,*)
  164. & 'MCHAML doit avoir au moins 1 zone !'
  165. c "On n'a pas trouve, dans un MCHAML, de zone geometrique ou de
  166. c constituant correspondant a l'objet MODELE"
  167. CALL ERREUR(472)
  168. RETURN
  169. ENDIF
  170.  
  171. C++++ OU lecture des Level Set (syntaxe 1)
  172. else
  173.  
  174. CALL LIROBJ('CHPOINT ',MCHPO1,1,IRETOU)
  175. CALL ACTOBJ('CHPOINT ',MCHPO1,1)
  176. CALL LIROBJ('CHPOINT ',MCHPO2,1,IRETOU)
  177. CALL ACTOBJ('CHPOINT ',MCHPO2,1)
  178. if (IERR.ne.0) then
  179. CALL ERREUR(181)
  180. c write(*,*) 'Besoin des chpoints Level Sets'
  181. c return
  182. endif
  183. C qq verif de base sur les chpoints
  184. segact MCHPO1,MCHPO2
  185. nsoup1 = MCHPO1.IPCHP(/1)
  186. nsoup2 = MCHPO2.IPCHP(/1)
  187. if ((nsoup1.ne.1).or.(nsoup2.ne.1)) then
  188. INTERR = MCHPO1
  189. c CALL ERREUR(377)
  190. c write(*,*) 'Chpoint avec plus d 1 zone: Non traite test1'
  191. c return
  192. endif
  193. MSOUP1 = MCHPO1.IPCHP(1)
  194. MSOUP2 = MCHPO2.IPCHP(1)
  195. C composante des chpoints: 1=PSI 2=PHI
  196. segact MSOUP1,MSOUP2
  197. nc1 = MSOUP1.NOCOMP(/2)
  198. nc2 = MSOUP2.NOCOMP(/2)
  199. if ((nc1.ne.1).or.(nc2.ne.1)) then
  200. CALL ERREUR(181)
  201. c write(*,*) 'Chpoint avec plus d 1 composante: Non traite'
  202. c return
  203. endif
  204. nomc1 = MSOUP1.NOCOMP(1)
  205. nomc2 = MSOUP2.NOCOMP(1)
  206. if (nomc1.ne.'PSI ') then
  207. MOTERR = 'PSI'
  208. CALL ERREUR(243)
  209. c write(*,*) 'Chpoint 1 doit avoir pour composante PSI '
  210. c return
  211. endif
  212. if (nomc2.ne.'PHI ') then
  213. MOTERR = 'PHI'
  214. CALL ERREUR(243)
  215. c write(*,*) 'Chpoint 2 doit avoir pour composante PHI '
  216. c return
  217. endif
  218. C recuperation des maillages et valeurs
  219. IPT1 = MSOUP1.IGEOC
  220. IPT2 = MSOUP2.IGEOC
  221. c if (IPT1.ne.IPT2) then
  222. c write(*,*) 'Chpoints doivent avoir le meme support maillage'
  223. c return
  224. c bp (07/07/2011) : trop contraignant on introduit ndpt2 et on
  225. c va faire des test + tard
  226. c endif
  227. MPOVA1 = MSOUP1.IPOVAL
  228. MPOVA2 = MSOUP2.IPOVAL
  229. C on crée MPOVA3 et MPOVA4 = versions "simplifiées" de MPOVA1 et MPOVA2
  230. SEGINI,MPOVA3=MPOVA1
  231. SEGINI,MPOVA4=MPOVA2
  232.  
  233. endif
  234. C++++ fin distinction syntaxe 2/1
  235.  
  236. C Initialisation des tableaux de sortie info erichissement a
  237. C chaques noeuds
  238. NI = nbpts
  239. SEGINI,ITYPND
  240.  
  241.  
  242. C=======================================================================
  243. c
  244. C PREMIERE BOUCLE SUR LES SOUS MODELES
  245. c
  246. c cas syntaxe 1 : on cree un nouveau MCHEX2+MCHAM2 a partir de :
  247. c - copie de l'ancien MCHEX1+MCHAM1 existant
  248. c - ou nouveau MCHEX1+MCHAM1 vide
  249. c si desenrichissement, on cree les relations IPRIG2
  250. c
  251. c cas syntaxe 2 : on branche le MCHEX1 fourni
  252. c
  253. C=======================================================================
  254.  
  255. SEGACT,MMODE1
  256. NBSMOD = MMODE1.KMODEL(/1)
  257. DO 100 ISMOD1 = 1,NBSMOD
  258. c
  259. CcccccC ouverture du sous modele
  260. IMODEL = MMODE1.KMODEL(ISMOD1)
  261. segact IMODEL*mod
  262.  
  263. c on travaille seulement si EF XFEM
  264. if(NEFMOD.ne.263.and.NEFMOD.ne.264) goto 100
  265.  
  266. NOBMO1 = IVAMOD(/1)
  267.  
  268. ccccccC branchement d 1 eventuel MCHEX1 d'enrichissement fourni (syntaxe 2)
  269. if (ISYNTAX.EQ.2) then
  270. NOBMO1 = IVAMOD(/1)
  271. c NOBMOD = NOBMO1 + 1
  272. c if(NOBMO1.ne.0) write(6,*)'Attention: Les objets contenus',
  273. c & ' dans le IVAMOD du modele seront oubliés !!!'
  274. NOBMOD=1
  275. cbp: attention: on ecrase tout pour l instant
  276. MN3 = INFMOD(/1)
  277. NFOR = FORMOD(/2)
  278. NMAT = MATMOD(/2)
  279. segadj,IMODEL
  280. TYMODE(NOBMOD)='MCHAML '
  281. IVAMOD(NOBMOD)= MCHEX1
  282. goto 100
  283. endif
  284.  
  285. ccccccC (syntaxe 1) :
  286. ccccccC recup du MCHEX1 d'enrichissement pre-existant
  287. if (NOBMO1.ne.0) then
  288. do iobmo1=1,NOBMO1
  289. if ((TYMODE(iobmo1)).eq.'MCHAML ') then
  290. MCHEX1 = IVAMOD(iobmo1)
  291. segact,MCHEX1
  292. if ((MCHEX1.TITCHE).eq.'ENRICHIS') then
  293. isouX=1
  294. MCHAM1 = MCHEX1.ICHAML(isouX)
  295. cbp: on suppose donc l'exitence d'autant de MCHEX1 (avec 1 seul MCHAM1)
  296. c que de zones elementaires, au lieu de 1 MCHEX1 avec autant de MCHAM1
  297. c que de zones elementaires... il faudrait corriger ca tres vite...
  298. segact,MCHAM1
  299. goto 101
  300. endif
  301. endif
  302. enddo
  303. endif
  304.  
  305. ccccccC OU creation d un MCHEX1 d'enrichissement vierge
  306. c write(*,*) 'Le modele ne contient pas le MCHELM ENRICHIS'
  307. c write(*,*) '=> On initialise a 0 le MCHELM ENRICHIS'
  308. L1 = 8
  309. N1 = 1
  310. N3 = 6
  311. SEGINI,MCHEX1
  312. MCHEX1.TITCHE = 'ENRICHIS'
  313. MCHEX1.IFOCHE = IFOUR
  314. MCHEX1.IMACHE(1)= IMAMOD
  315. MCHEX1.CONCHE(1)= IMODEL.CONMOD
  316. MCHEX1.INFCHE(1,2) = 0
  317. MCHEX1.INFCHE(1,3) = NIFOUR
  318. MCHEX1.INFCHE(1,6) = 1
  319. *as 2010_01_20:
  320. * N2 = 2
  321. N2 = 1
  322. SEGINI,MCHAM1
  323. MCHEX1.ICHAML(1) = MCHAM1
  324. MELEME=IMAMOD
  325. SEGACT,MELEME
  326. N1PTEL = 0
  327. N1EL = 0
  328. N2PTEL = NUM(/1)
  329. N2EL = NUM(/2)
  330. MCHAM1.NOMCHE(1)= 'H '
  331. *as 2010_01_20:
  332. * MCHAM1.NOMCHE(2)= 'F1 '
  333. DO I2=1,N2
  334. MCHAM1.TYPCHE(I2)= 'POINTEURLISTREEL'
  335. SEGINI,MELVA1
  336. MCHAM1.IELVAL(I2) = MELVA1
  337. ENDDO
  338. c on ajoute une petite place dans IVAMOD
  339. NOBMOD=NOBMO1+1
  340. MN3=INFMOD(/1)
  341. NFOR=FORMOD(/2)
  342. NMAT=MATMOD(/2)
  343. segadj,IMODEL
  344. iobmo1=NOBMOD
  345.  
  346. ccccccC point de rassemblement une fois obtenu MCHEX1 et MCHAM1
  347. 101 continue
  348. c qq verif de base
  349. NCHAM1 = MCHEX1.ICHAML(/1)
  350. if (NCHAM1.ne.1) then
  351. INTERR(1) = MCHEX1.ICHAML
  352. c CALL ERREUR(377)
  353. c write(*,*) 'MCHELM doit avoir 1 seule zone test2'
  354. endif
  355.  
  356. c recup du maillage et du MCHAML associé a cette zone
  357. MELEME = MCHEX1.IMACHE(1)
  358. if (MELEME.ne.IMAMOD) then
  359. if (impi.ge.1) write(ioimp,*)
  360. & 'MCHAML et MODELE doivent avoir le meme support !'
  361. c "Geometrie incompatible avec le MCHAML"
  362. call ERREUR(706)
  363. return
  364. endif
  365. segact,MELEME
  366. MCHAM1 = MCHEX1.ICHAML(1)
  367.  
  368. c recup de l enrichissement précédent (ITIP1) et calcul suivant (ITIP2)
  369. ITIP1=MCHEX1.INFCHE(1,2)
  370. if(ITIP1.lt.0.or.ITIP1.gt.2) then
  371. if (impi.ge.1) write(ioimp,*) 'Pb : MCHEX1.INFCHE(1,2)=',ITIP1
  372. call erreur(5)
  373. return
  374. endif
  375. c cas option 'SAUT' (H-only)
  376. if(IMOT0.eq.1) then
  377. ITIP2=0
  378. c autre cas (H, F1 et F2 enrichissement) : on permute
  379. else
  380. if(ITIP1.eq.1) then
  381. ITIP2=2
  382. else
  383. c cas ou ITIP1 = 0 (initial) ou 2
  384. ITIP2=1
  385. endif
  386. endif
  387.  
  388.  
  389. C=======================================================
  390. c write(*,*) 'CREATION D UN JOLI MCHEX2 identique au MCHEX1'
  391. c et eventuellement d une matrice de relation pour désenrichir
  392. C=======================================================
  393.  
  394. SEGINI,MCHEX2=MCHEX1
  395. IVAMOD(iobmo1)=MCHEX2
  396. TYMODE(iobmo1)='MCHAML '
  397. MELE = NEFMOD
  398. SEGINI,MCHAM2=MCHAM1
  399. MCHEX2.ICHAML(1)=MCHAM2
  400. MCHEX2.INFCHE(1,2)=ITIP2
  401. N2ENR = MCHAM2.IELVAL(/1)
  402. do i2enr=1,N2ENR
  403. MELVA1 = MCHAM1.IELVAL(i2enr)
  404. SEGINI,MELVA2=MELVA1
  405. MCHAM2.IELVAL(i2enr) = MELVA2
  406. enddo
  407.  
  408. c --- DESENRICHISSEMENT ---
  409. IPRIG2=0
  410. if(IMOT0.eq.2) then
  411.  
  412. c -On "oublie" les très vieux enrichissements devenus obsolètes
  413. c et qu on va réutiliser pour la nouvelle pointe de fissure
  414. if(MCHAM2.IELVAL(/1).ge.ITIP2+1) then
  415. MELVA2=MCHAM2.IELVAL(ITIP2+1)
  416. segact,MELVA2*mod
  417. do j=1,MELVA2.IELCHE(/2)
  418. do i=1,MELVA2.IELCHE(/1)
  419. MELVA2.IELCHE(i,j)=0
  420. enddo
  421. enddo
  422. endif
  423.  
  424. c -On met a 0 (avec une relation) les vieux enrichissements
  425. if(MCHAM2.IELVAL(/1).ge.ITIP1+1) then
  426.  
  427. c On commence par creer un maillage prototype de la rigidite (IPT6)
  428. c en reperant les noeuds a traiter via idejvu
  429. NBPTI=NBPTS
  430. segini,idejvu
  431. NBSOUS=0
  432. NBREF=0
  433. NBNN=2
  434. NBELEM=1000
  435. segini,IPT6
  436. IPT6.ITYPEL=22
  437. c on noublie pas de créer des noeuds pour les LX
  438. NBPTS0=NBPTS
  439. iilx=NBPTS0
  440. NBPTS=NBPTS+NBELEM
  441. segadj,MCOORD
  442. c on travaille sur le melva2 de la pointe précédente
  443. MELVA2=MCHAM2.IELVAL(ITIP1+1)
  444. segact,MELVA2*mod
  445. ii2=0
  446. do 120 j=1,MELVA2.IELCHE(/2)
  447. do 121 i=1,MELVA2.IELCHE(/1)
  448. i120 = NUM(i,j)
  449. c rem: commme l enrichissement est nodal et que l on travaille sur 1 seul
  450. c enrichissement a annuler on se permet les lignes ci dessous
  451. if(idejvu(i120).gt.0) goto 121
  452. idejvu(i120)=1
  453. if (MELVA2.IELCHE(i,j).ne.0) then
  454. ii2=ii2+1
  455. if(ii2.gt.NBELEM) then
  456. NBELEM=NBELEM + 1000
  457. NBPTS=NBPTS + 1000
  458. segadj,IPT6,MCOORD
  459. endif
  460. c on crée un noeud pour le multiplicateur de lagrange LX
  461. c iilx = NBPTS0+ii2
  462. iilx = iilx+1
  463. XCOOR((iilx-1)*(IDIM1)+1) = XCOOR((i120-1)*(IDIM1)+1)
  464. XCOOR((iilx-1)*(IDIM1)+2) = XCOOR((i120-1)*(IDIM1)+2)
  465. if(idim.eq.3)
  466. & XCOOR((iilx-1)*(IDIM1)+3) = XCOOR((i120-1)*(IDIM1)+3)
  467. XCOOR(iilx*(IDIM1)) = XCOOR(i120*(IDIM1))
  468. IPT6.NUM(1,ii2)=iilx
  469. IPT6.NUM(2,ii2)=i120
  470. endif
  471. 121 continue
  472. 120 continue
  473. c on ajuste IPT6 et on supprime
  474. NBELEM=ii2
  475. segadj,IPT6
  476. segsup,idejvu
  477.  
  478. c on finit d ajuster MCOORD
  479. NRIGEL=idim*4
  480. NBPTS = NBPTS0+(ii2*NRIGEL)
  481. segadj,MCOORD
  482.  
  483. c On crée la relation qui permet de désenrichir
  484. segini,MRIGID
  485. IPRIG2=MRIGID
  486. IFORIG = IFOUR
  487. MTYMAT ='RIGIDITE'
  488. NLIGRD=2
  489. NLIGRP=2
  490. NELRIG=ii2
  491. jb=0
  492. jdim=0
  493. do iriri=1,NRIGEL
  494. COERIG(iriri)=1.d0
  495. rigrel=0
  496. segini,DESCR,XMATRI
  497. c IRIGEL(1,iriri)=IPT6
  498. c On duplique le maillage prototype de la rigidite
  499. if(iriri.eq.1) then
  500. IPT7=IPT6
  501. else
  502. segini,IPT7=IPT6
  503. c on crée un noeud pour le multiplicateur de lagrange LX
  504. c pour chaque element de ipt7
  505. do ii2=1,NBELEM
  506. iilx = iilx+1
  507. c iilx6=IPT6.NUM(1,ii2) on prend ipt7 actif et pas ipt6
  508. iilx6=IPT7.NUM(1,ii2)
  509. XCOOR((iilx-1)*(IDIM1)+1) = XCOOR((iilx6-1)*(IDIM1)+1)
  510. XCOOR((iilx-1)*(IDIM1)+2) = XCOOR((iilx6-1)*(IDIM1)+2)
  511. if(idim.eq.3)
  512. & XCOOR((iilx-1)*(IDIM1)+3) = XCOOR((iilx6-1)*(IDIM1)+3)
  513. XCOOR(iilx*(IDIM1)) = XCOOR(iilx6*(IDIM1))
  514. IPT7.NUM(1,ii2)=iilx
  515. enddo
  516. endif
  517. IRIGEL(1,iriri)=IPT7
  518. IRIGEL(2,iriri)=0
  519. IRIGEL(3,iriri)=DESCR
  520. IRIGEL(4,iriri)=XMATRI
  521. IRIGEL(5,iriri)=NIFOUR
  522. IRIGEL(6,iriri)=0
  523. IRIGEL(7,iriri)=0
  524. IRIGEL(8,iriri)=0
  525. c remplissage du DESCR
  526. LISINC(1)='LX'
  527. LISDUA(1)='FLX'
  528. jb=jb+1
  529. jdim=jdim+1
  530. if(ITIP1.eq.1) then
  531. LISINC(2)=MOTPR1(jb)
  532. LISDUA(2)=MOTDU1(jb)
  533. elseif(ITIP1.eq.2) then
  534. LISINC(2)=MOTPR2(jb)
  535. LISDUA(2)=MOTDU2(jb)
  536. endif
  537. c petit ajustement pour "sauter" les composantes en Z
  538. if(jdim.eq.idim) then
  539. jdim=0
  540. if(idim.eq.2) jb=jb+1
  541. endif
  542. do jinc=1,NLIGRP
  543. NOELEP(jinc)=jinc
  544. NOELED(jinc)=jinc
  545. enddo
  546. c remplissage de XMATRI
  547. do jel=1,NELRIG
  548. RE(1,1,jel)=0.d0
  549. RE(1,2,jel)=1.d0
  550. RE(2,1,jel)=1.d0
  551. RE(2,2,jel)=0.d0
  552. enddo
  553. segdes,DESCR,XMATRI
  554. enddo
  555. segdes,MRIGID
  556. 139 continue
  557. endif
  558.  
  559. endif
  560. c --- fin du cas DESENRICHISSEMENT ---
  561.  
  562.  
  563. C=======================================================
  564. c BOUCLE SUR LES POINTS DES CHPOINTS
  565. c pour creer une numerotation locale
  566. c --> NDPT1/2(#global) = #chpo1/2
  567. C=======================================================
  568.  
  569. c -chpoint psi
  570. segact,IPT1
  571. NBNO1 = IPT1.NUM(/2)
  572. C on crée la table qui depuis num de noeud donne point dans chpoint
  573. NI = nbpts
  574. SEGINI,NDPT1
  575. cccccc Vrai Debut de boucle
  576. DO I1=1,NBNO1
  577. C on recupere le numero de noeud
  578. INUM1 = IPT1.NUM(1,I1)
  579. C on remplit la table
  580. NDPT1(INUM1) = I1
  581. ENDDO
  582.  
  583. c -chpoint phi
  584. if (IPT1.eq.IPT2) then
  585. NDPT2=NDPT1
  586. else
  587. segact,IPT2
  588. NBNO2 = IPT2.NUM(/2)
  589. if (NBNO1.ne.NBNO2) then
  590. MOTERR='CHPOINT POINTS !'
  591. c "Les deux objets de type %m1:8 n'ont pas le meme nombre de %m9:16"
  592. call ERREUR(403)
  593. return
  594. endif
  595. SEGINI,NDPT2
  596. DO I2=1,NBNO2
  597. C on recupere le numero de noeud
  598. INUM2 = IPT2.NUM(1,I2)
  599. if (NDPT1(INUM2).eq.0) then
  600. IF(IMPI.GE.1) write(IOIMP,*) 'Les chpoints PSI et PHI ',
  601. & 'doivent avoir les memes points suuports !'
  602. c "Les champs par point ont des supports geometriques incompatibles"
  603. call ERREUR(348)
  604. return
  605. endif
  606. C on remplit la table
  607. NDPT2(INUM2) = I2
  608. ENDDO
  609. endif
  610. C=======FIN DE BOUCLE SUR LES POINTS DES CHPOINTS=======
  611.  
  612.  
  613. C=======================================================
  614. c 1ere BOUCLE SUR LES ELEMENTS
  615. c POUR LA "SIMPLIFICATION" des level sets :
  616. c MPOVA1/2 --> MPOVA3/4
  617. C=======================================================
  618. C Ouverture du maillage et des chpoints level set
  619. c SEGACT MELEME,MPOVA1,MPOVA2
  620. SEGACT MPOVA1,MPOVA2
  621. NBNN1 = NUM(/1)
  622. NBEL1 = NUM(/2)
  623. c on recupere les coord dans l element parents des noeuds
  624. MINT0 = INFMOD(3)
  625. segact,MINT0
  626. c on recupere les coord dans l element parents des points de gauss
  627. MINT1 = INFMOD(5)
  628. segact,MINT1
  629. c segment integration ef std correspondant -> inutile pour l instant
  630. c MINT2 = INFELE(12)
  631. c if(MINT2.ne.0) segact,MINT2
  632. c recherche du num du pt de gauss KKGAU le plus proche du noeud inode1
  633. NGAU1 = INFELE(6)
  634. NI = NBNN1
  635. segini,KKGAU
  636. do inode1=1,NBNN1
  637. kgau1 = 1
  638. DXi1 = ((MINT1.QSIGAU(kgau1)) - (MINT0.QSIGAU(inode1)))**2
  639. & + ((MINT1.ETAGAU(kgau1)) - (MINT0.ETAGAU(inode1)))**2
  640. & + ((MINT1.DZEGAU(kgau1)) - (MINT0.DZEGAU(inode1)))**2
  641. do kgau2=2,NGAU1
  642. DXi2 = ((MINT1.QSIGAU(kgau2)) - (MINT0.QSIGAU(inode1)))**2
  643. & + ((MINT1.ETAGAU(kgau2)) - (MINT0.ETAGAU(inode1)))**2
  644. & + ((MINT1.DZEGAU(kgau2)) - (MINT0.DZEGAU(inode1)))**2
  645. if (DXi2.lt.DXi1) then
  646. DXi1 = DXi2
  647. kgau1 = kgau2
  648. endif
  649. enddo
  650. KKGAU(inode1) = kgau1
  651. enddo
  652.  
  653. NI = NBEL1
  654. C Initialisation des tableaux de travail
  655. NI = NBNN1
  656. segini,NUMND,XPSI,XPHI
  657.  
  658.  
  659. c++++++ Debut de boucle sur les elements
  660. DO 200 J=1,NBEL1
  661.  
  662. C++++++++ Mini-Boucle(S) sur les noeuds de l element
  663. DO K=1,NBNN1
  664. C numero INUM du Kieme noeud du Jieme element
  665. INUM = NUM(K,J)
  666. C numero du point correspondant des chpoints
  667. I1 = NDPT1(INUM)
  668. I2 = NDPT2(INUM)
  669. c on verifie que le chpoint y est bien defini sinon on saute tout!
  670. if(I1.eq.0) goto 200
  671. C valeurs de psi et phi au Kieme noeud
  672. XPSI(K) = MPOVA1.VPOCHA(I1,1)
  673. XPHI(K) = MPOVA2.VPOCHA(I2,1)
  674. ENDDO
  675. C++++++++ Fin de la Mini-Boucle sur les noeuds de l element
  676.  
  677.  
  678. C++++++++ Mini-Boucle(S) sur les noeuds de l element
  679. DO K=1,NBNN1
  680. C on calcule phi au pts de gauss le + proche du noeud considéré
  681. kgau1 = KKGAU(K)
  682. XPSIGAU = 0.d0
  683. XPHIGAU = 0.d0
  684. do ii1=1,NBNN1
  685. XPSIGAU = XPSIGAU
  686. & + ( (MINT1.SHPTOT(1,ii1,kgau1)) * (XPSI(ii1)) )
  687. XPHIGAU = XPHIGAU
  688. & + ( (MINT1.SHPTOT(1,ii1,kgau1)) * (XPHI(ii1)) )
  689. enddo
  690. C numero INUM du Kieme noeud du Jieme element
  691. INUM = NUM(K,J)
  692. C numero du point correspondant des chpoints
  693. I1 = NDPT1(INUM)
  694. I2 = NDPT2(INUM)
  695. c C simplification
  696. c IF (((XPSI(K))*XPSIGAU).LE.0.d0) THEN
  697. c c XPSI(K) = 0.d0
  698. c MPOVA3.VPOCHA(I1,1) = 0.d0
  699. c ELSEIF (ABS(XPSI(K)).LE.XTOL) THEN
  700. c XPSI(K) = 0.d0
  701. c MPOVA3.VPOCHA(I1,1) = 0.d0
  702. c ENDIF
  703. c IF (((XPHI(K))*XPHIGAU).LE.0.d0) THEN
  704. c c XPHI(K) = 0.d0
  705. c MPOVA4.VPOCHA(I2,1) = 0.d0
  706. c ELSEIF (ABS(XPHI(K)).LE.XTOL) THEN
  707. c c XPHI(K) = 0.d0
  708. c MPOVA4.VPOCHA(I2,1) = 0.d0
  709. c ENDIF
  710. C simplification (bp: 13./07/2011)
  711. IF(((XPSI(K))*XPSIGAU).LE.0.d0)
  712. & MPOVA3.VPOCHA(I1,1) = 0.d0
  713. IF(((XPHI(K))*XPHIGAU).LE.0.d0)
  714. & MPOVA4.VPOCHA(I2,1) = 0.d0
  715. ENDDO
  716. C++++++++ Fin de la Mini-Boucle sur les noeuds de l element
  717.  
  718. 200 CONTINUE
  719. C=======FIN DE la 1ere BOUCLE SUR LES ELEMENTS==========
  720.  
  721.  
  722. C=======================================================
  723. c 2EME BOUCLE SUR LES ELEMENTS
  724. C POUR LE TRI DES NOEUDS ("TEST EN PAGAILLE")
  725. c --> ITYPND(#global) = 0 : noeud pas vu
  726. c 1 : standard (non enrichi)
  727. c 10 : H-enrichi
  728. c 100 : F-enrichi
  729. C=======================================================
  730.  
  731. c++++++ Debut de boucle sur les elements
  732. DO 222 J=1,NBEL1
  733.  
  734. C++++++++ Mini-Boucle(S) sur les noeuds de l element
  735. DO K=1,NBNN1
  736. C numero INUM du Kieme noeud du Jieme element
  737. INUM = NUM(K,J)
  738. C numero du point correspondant des chpoints
  739. I1 = NDPT1(INUM)
  740. I2 = NDPT2(INUM)
  741. c on verifie que le chpoint y est bien defini sinon on saute tout!
  742. if(I1.eq.0) goto 222
  743. C numero INUM du Kieme noeud de l'element en cours (le Jieme)
  744. NUMND(K) = INUM
  745. C valeurs de psi et phi au Kieme noeud
  746. XPSIK = MPOVA3.VPOCHA(I1,1)
  747. XPHIK = MPOVA4.VPOCHA(I1,1)
  748. XPSI(K) = XPSIK
  749. XPHI(K) = XPHIK
  750. C Calcul de valeurs utiles POUR LE TRI
  751. if (K.eq.1) then
  752. PSIMAX = XPSIK
  753. PSIMIN = XPSIK
  754. PSIMIA = ABS(XPSIK)
  755. PHIMAX = XPHIK
  756. PHIMIN = XPHIK
  757. PHIMIA = ABS(XPHIK)
  758. else
  759. PSIMAX = MAX(PSIMAX,XPSIK)
  760. PSIMIN = MIN(PSIMIN,XPSIK)
  761. PSIMIA = MIN(PSIMIA,ABS(XPSIK))
  762. PHIMAX = MAX(PHIMAX,XPHIK)
  763. PHIMIN = MIN(PHIMIN,XPHIK)
  764. PHIMIA = MIN(PHIMIA,ABS(XPHIK))
  765. endif
  766.  
  767. ENDDO
  768. C++++++++ Fin de la Mini-Boucle sur les noeuds de l element
  769. PSIPRD = PSIMAX * PSIMIN
  770. PHIPRD = PHIMAX * PHIMIN
  771. c
  772. C
  773. C++++++++ Tests en pagaille pour trier
  774.  
  775. c LOG1 = Tous les noeuds de lelement sont situés en arriere du front?
  776. LOG1 = (PSIMAX.LE.0.d0)
  777. c ...noeuds en arriere du front + element coupé par la fissure
  778. IF (LOG1.AND.(PHIPRD.LT.0.d0)) THEN
  779. C => tous les noeud doivent etre H-enrichi (=10)
  780. DO K=1,NBNN1
  781. INUM = NUMND(K)
  782. ITYPND(INUM) = MAX(10,ITYPND(INUM))
  783. ENDDO
  784. C
  785. c ...noeuds en arriere du front + element tangent avec la fissure
  786. ELSEIF (LOG1.AND.(PHIMIA.EQ.0.d0)) THEN
  787. C => seuls les noeud tangents doivent etre H-enrichi (=10)
  788. DO K=1,NBNN1
  789. IF (XPHI(K).EQ.0.d0) THEN
  790. INUM = NUMND(K)
  791. ITYPND(INUM) = MAX(10,ITYPND(INUM))
  792. ENDIF
  793. ENDDO
  794. C
  795. c Element contenant la pointe de fissure
  796. ELSEIF ((PSIPRD.LT.0.d0).AND.(PHIPRD.LT.0.d0)) THEN
  797. C => tous les noeud doivent etre F-enrichi (=100)
  798. DO K=1,NBNN1
  799. INUM = NUMND(K)
  800. ITYPND(INUM) = 100
  801. ENDDO
  802. C
  803. c Element dont un bord contient la pointe de fissure
  804. ELSEIF ((PSIPRD.LT.0.d0).AND.(PHIMIA.EQ.0.d0)) THEN
  805. C => tous les noeud doivent etre F-enrichi (=100)
  806. DO K=1,NBNN1
  807. INUM = NUMND(K)
  808. ITYPND(INUM) = 100
  809. ENDDO
  810. C
  811. c La pointe arrive sur un bord de l element
  812. ELSEIF ((PSIMIA.EQ.0.d0).AND.(PHIPRD.LT.0.d0)) THEN
  813. C => choix: seuls les noeud en avant du front sont F-enrichi (=100)
  814. DO K=1,NBNN1
  815. INUM = NUMND(K)
  816. if (XPSI(K).GE.0.d0) ITYPND(INUM) = 100
  817. ENDDO
  818. C
  819. c Element dont un coin contient la pointe de fissure
  820. ELSEIF ((PSIMIA.EQ.0.d0).AND.(PHIMIA.EQ.0.d0)) THEN
  821. C => choix: seuls les noeud en avant du front sont F-enrichi (=100)
  822. DO K=1,NBNN1
  823. INUM = NUMND(K)
  824. if (XPSI(K).GE.0.d0) ITYPND(INUM) = 100
  825. ENDDO
  826. C
  827. c Les autres elements ne sont pas directement coupés ni tangents avec la fissure
  828. ELSE
  829. C => on met a 1 pour dire qu on les a vu
  830. DO K=1,NBNN1
  831. INUM = NUMND(K)
  832. ITYPND(INUM) = MAX(1,ITYPND(INUM))
  833. ENDDO
  834. C
  835. ENDIF
  836. C++++++++ Fin des Tests en pagaille pour trier
  837.  
  838.  
  839. 222 CONTINUE
  840. C=======FIN DE la 2eme BOUCLE SUR LES ELEMENTS==========
  841. segsup,NUMND,XPSI,XPHI,KKGAU
  842.  
  843.  
  844. 100 CONTINUE
  845. C=====FIN DE LA PREMIERE BOUCLE SUR LES SOUS MODELES================
  846.  
  847. C A ce stade, pour la syntaxe 1,
  848. c on a cree le champ par point ITYPND qui vaut :
  849. c 1 -> noeud non enrichi
  850. c 10 -> noeud H enrichi
  851. c 100 -> noeud F1 ou F2 enrichi
  852.  
  853. cbp, TODO : surement a revoir ...
  854. IF (ISYNTAX.EQ.2) GOTO 999
  855.  
  856.  
  857.  
  858. C=======================================================================
  859. c
  860. C 2EME BOUCLE SUR LES SOUS MODELES
  861. c
  862. c --> remplissage de MCHAM2.IELVAL(1/2/3) = MELVA2
  863. c avec MELVA2.IELCHE(K,J) = listreel de phi ou psi associe
  864. c a l'enrichissement du Kieme noeud du Jieme element
  865. c
  866. c --> ITYPND =101/102 selon F1/F2-enrichi
  867. c
  868. c --> creation de MCHAM3.IELVAL(1/2/3) = MELVA3
  869. c associee aux elements SURE
  870. c avec MELVA3.VELCHE(1,J) = 1. si H/F1/F2-enrichi , 0. sinon
  871. c
  872. c --> ITYPND = ITYPND + 200/2000/20000 si le hanging node appartient
  873. c a une relation ou l'un des noeuds est H/F1/F2-enrichi
  874. c
  875. C=======================================================================
  876.  
  877. nexsur = 0
  878. DO 400 ISMOD1 = 1,NBSMOD
  879. c write (*,*) 'boucle 400 : sous modele ', ISMOD1,'/',NBSMOD
  880. c
  881. CcccccC ouverture du sous modele
  882. IMODEL = MMODE1.KMODEL(ISMOD1)
  883. segact IMODEL*mod
  884. IPT3 = IMODEL.IMAMOD
  885. SEGACT IPT3
  886.  
  887. c travail specifique pour les elements SURE
  888. if (NEFMOD.EQ.259) GOTO 410
  889. c on travaille seulement si EF XFEM
  890. if(NEFMOD.ne.263.and.NEFMOD.ne.264) goto 400
  891.  
  892.  
  893. C=======================================================
  894. c 3EME BOUCLE SUR LES ELEMENTS
  895. C POUR ATTRIBUER L'ENRICHISSEMENT
  896. C=======================================================
  897. c write(*,*) 'MCHAM2=',MCHAM2
  898. cbp : il n'y en a qu'1 --> deja en segini segact,MCHAM2
  899. c on evite d'ouvrir les MELVA2 pour chaque element
  900. DO I2ENR=1,N2ENR
  901. MELVA2 = MCHAM2.IELVAL(I2ENR)
  902. if(MELVA2.ne.0) segact,MELVA2*mod
  903. ENDDO
  904. segact,MPOVA1,MPOVA2
  905.  
  906.  
  907. c++++++ Debut de boucle sur les elements
  908. DO 300 J=1,NBEL1
  909. c write(*,*) '***** ELEM', J,'/', NBEL1
  910.  
  911. c pour eviter de creer bcp de listreels on utilise l astuce :
  912. mphi =0
  913. mpsiph=0
  914. c++++++++ Boucle sur les noeuds de l element j
  915. DO 310 K=1,NBNN1
  916. C Kieme noeud du Jieme element a pour numero INUM
  917. INUM = NUM(K,J)
  918. c write(*,*) 'INUM', INUM, 'ITYPND(INUM)', ITYPND(INUM)
  919. c on saute les noeuds non enrichis
  920. if((ITYPND(INUM)).le.1) goto 310
  921. Ccccccccccc noeud H-enrichi
  922. if ((ITYPND(INUM)).eq.10) then
  923. MELVA2 = MCHAM2.IELVAL(1)
  924. c segact,MELVA2*mod
  925. MLREE1 = MELVA2.IELCHE(K,J)
  926.  
  927. c on H-enrichit ssi ce noeud n etait pas deja H-enrichi
  928. if (MLREE1.eq.0) then
  929. if (mphi.ne.0) then
  930. MELVA2.IELCHE(K,J) = mphi
  931. else
  932. JG = NBNN1
  933. segini,MLREE2
  934. MELVA2.IELCHE(K,J) = MLREE2
  935. c on remplit la listreel des valeurs de PHI aux noeuds de l element
  936. do inode=1,NBNN1
  937. INUM2 = NUM(inode,J)
  938. I2 = NDPT2(INUM2)
  939. MLREE2.PROG(inode) = MPOVA2.VPOCHA(I2,1)
  940. enddo
  941. mphi=MLREE2
  942. endif
  943. endif
  944. endif
  945. Ccccccccccc fin des noeud H-enrichi
  946.  
  947.  
  948. Ccccccccccc noeud F-enrichi
  949. * if((ITYPND(INUM)).eq.100) then
  950. *as 2010_01_20: lsaut =1000 si option 'SAUT' , =100 sinon
  951. c if (((ITYPND(INUM)).eq.lsaut).OR.((ITYPND(INUM)).eq.101)) then
  952. c write(*,*) 'ITYPND(INUM)', ITYPND(INUM), 'lsaut', lsaut
  953. c write(*,*) 'Nelem', j , 'INUM', inum
  954. if (((ITYPND(INUM)).ge.lsaut)) then
  955.  
  956. c si F1 pas prevu on le rajoute
  957. if (N2ENR.lt.2) then
  958. N2ENR = 2
  959. N2 = N2ENR
  960. segadj,MCHAM2
  961. MCHAM2.NOMCHE(N2ENR) = 'F1'
  962. MCHAM2.TYPCHE(N2ENR) = 'POINTEURLISTREEL'
  963. N1PTEL=0
  964. N1EL =0
  965. N2PTEL=NBNN1
  966. N2EL =NBEL1
  967. segini,MELVA2
  968. MCHAM2.IELVAL(N2ENR) = MELVA2
  969. else
  970. MELVA2 = MCHAM2.IELVAL(2)
  971. c segact,MELVA2*mod
  972. endif
  973.  
  974. c - on F1-enrichit si ce noeud n etait pas deja F1-enrichi
  975. c OU si on est dans une stratégie de désenrichissement
  976. c et que c'est le tour de F1 (on alterne F1, F2, F1, etc.)
  977. MLREE1 = MELVA2.IELCHE(K,J)
  978. c if (MLREE1.eq.0) then
  979. if ((MLREE1.eq.0.and.IMOT0.ne.2).OR
  980. & .(ITIP2.eq.1.and.IMOT0.eq.2)) then
  981.  
  982. ITYPND(INUM)=101;
  983. if (mpsiph.ne.0) then
  984. MELVA2.IELCHE(K,J) = mpsiph
  985. else
  986. NBLV7=2
  987. JG = NBLV7*NBNN1
  988. segini,MLREE2
  989. MELVA2.IELCHE(K,J) = MLREE2
  990. c on remplit la listreel des valeurs de PSI et PHI
  991. do inode=1,NBNN1
  992. INUM2 = NUM(inode,J)
  993. I1 = NDPT1(INUM2)
  994. I2 = NDPT2(INUM2)
  995. MLREE2.PROG(inode) = MPOVA1.VPOCHA(I1,1)
  996. MLREE2.PROG(NBNN1+inode) = MPOVA2.VPOCHA(I2,1)
  997. enddo
  998. mpsiph=MLREE2
  999. endif
  1000.  
  1001. c - si noeud deja F1-enrichi, alors on essaie de le F2-enrichir
  1002. c OU si on est dans une stratégie de désenrichissement
  1003. c et que c'est le tour de F2
  1004. else
  1005. ITYPND(INUM)=102;
  1006. c si F2 pas prevu on le rajoute
  1007. if (N2ENR.lt.3) then
  1008. N2ENR = 3
  1009. N2 = N2ENR
  1010. segadj,MCHAM2
  1011. MCHAM2.NOMCHE(N2ENR) = 'F2'
  1012. MCHAM2.TYPCHE(N2ENR) = 'POINTEURLISTREEL'
  1013. N1PTEL=0
  1014. N1EL =0
  1015. N2PTEL=NBNN1
  1016. N2EL =NBEL1
  1017. segini,MELVA2
  1018. MCHAM2.IELVAL(N2ENR) = MELVA2
  1019. else
  1020. MELVA2 = MCHAM2.IELVAL(3)
  1021. segact,MELVA2*mod
  1022. endif
  1023. c +-- on F2-enrichit si ce noeud n etait pas deja F1-enrichi
  1024. MLREE1 = MELVA2.IELCHE(K,J)
  1025. if (MLREE1.eq.0) then
  1026. if (mpsiph.ne.0) then
  1027. MELVA2.IELCHE(K,J) = mpsiph
  1028. else
  1029. NBLV7=2
  1030. JG = NBLV7*NBNN1
  1031. segini,MLREE2
  1032. MELVA2.IELCHE(K,J) = MLREE2
  1033. c on remplit la listreel des valeurs de PSI et PHI
  1034. do inode=1,NBNN1
  1035. INUM2 = NUM(inode,J)
  1036. I1 = NDPT1(INUM2)
  1037. I2 = NDPT2(INUM2)
  1038. MLREE2.PROG(inode) = MPOVA1.VPOCHA(I1,1)
  1039. MLREE2.PROG(NBNN1+inode) = MPOVA2.VPOCHA(I2,1)
  1040. enddo
  1041. mpsiph=MLREE2
  1042. endif
  1043.  
  1044. c +-- si on est la, c est que le noeud est deja F1 et F2 enrichi
  1045. c => pour l instant on genere une erreur,
  1046. c mais pour le futur ajouter la possiblite d avoir N2ENR >3
  1047. else
  1048. if(impi.ge.1) write(ioimp,*)
  1049. & 'Trop d enrichissement (> 2 pointes) pour le ',
  1050. & 'noeud',INUM,' = ',K,'ieme noeud du',J,'ieme element'
  1051. c "Nombre maximum de fonctions de forme atteint au noeud %i1."
  1052. INTERR(1)=INUM
  1053. CALL ERREUR(1112)
  1054. RETURN
  1055. endif
  1056. c +-- fin de la distinction noeud deja F2-enrichi ou pas
  1057.  
  1058. endif
  1059. c - fin de la distinction noeud deja F1-enrichi ou pas
  1060.  
  1061. endif
  1062. Ccccccccccc fin du cas noeud F-enrichi
  1063.  
  1064. 310 CONTINUE
  1065. c++++++++ Fin de Boucle sur les noeuds de l element j
  1066.  
  1067.  
  1068. 300 CONTINUE
  1069. C=======FIN DE la 3eme BOUCLE SUR LES ELEMENTS===========
  1070.  
  1071. C A ce stade,
  1072. c ITYPND(#global) = 1 -> noeud non enrichi
  1073. c 10 -> noeud H enrichi
  1074. c 101 -> noeud F1 enrichi
  1075. c 102 -> noeud F2 enrichi
  1076. c
  1077. C On a construit le champ par element MCHAM2 à 3 composantes :
  1078. C 1. MCHAM2.IELVAL(1) :
  1079. C champ par elements qui vaut phi sur les elements h-enrichis
  1080. C 2. MCHAM2.IELVAL(2)
  1081. C champ par elements contenant les valeurs de psi et phi
  1082. C aux noeuds F1-enrichis
  1083. C 3. MCHAM2.IELVAL(3)
  1084. C champ par elements contenant les valeurs de psi et phi
  1085. C aux noeuds F2-enrichis
  1086.  
  1087. c on n' plus besoin des level-sets simplifiees
  1088. SEGSUP,MPOVA3,MPOVA4
  1089. C if(NDPT1.ne.NDPT2) SEGSUP,NDPT2
  1090. C SEGSUP,NDPT1
  1091.  
  1092.  
  1093. C=======================================================
  1094. c 4eme BOUCLE SUR LES ELEMENTS
  1095. C construction d'un champ d'enrichissement associée aux SURE
  1096. C=======================================================
  1097.  
  1098. 410 CONTINUE
  1099. IF(NEFMOD.NE.259 ) GOTO 400
  1100. IF(infele(13).NE.63) GOTO 400
  1101. C gg 2017_07_05 : traitement des elements sure
  1102. c (pour les relations de compatibilite issues de RAFF)
  1103. nexsur = 1
  1104.  
  1105. c recuperation du maillage support du sous-modele de sure
  1106. NBNN3 = IPT3.NUM(/1)
  1107. NBEL3 = IPT3.NUM(/2)
  1108.  
  1109. MN3=IMODEL.INFMOD(/1)
  1110. NFOR=IMODEL.FORMOD(/2)
  1111. NMAT=IMODEL.MATMOD(/2)
  1112. * on ajoute au sous-modele . IVAMOD(1) = MCHAM3
  1113. NOBMOD = 1
  1114. SEGADJ, IMODEL
  1115.  
  1116. C write(*,*) 'Creation du champ d enrichissement de sure'
  1117. C++++ INITIALISATION d'un nouveau MCHAML vierge MCHAM3
  1118. c L1 = 8
  1119. C nombre de sous champs
  1120. c N1 = 1
  1121. c N3 = 6
  1122. c SEGINI, MCHEX3
  1123. c MCHEX3.TITCHE = 'ENRICHIS'
  1124. c MCHEX3.IFOCHE = IFOUR
  1125. c MCHEX3.IMACHE(1)= IMAMOD
  1126. c MCHEX3.CONCHE(1)= IMODEL.CONMOD
  1127. c MCHEX3.INFCHE(1,2) = 0
  1128. c MCHEX3.INFCHE(1,3) = NIFOUR
  1129. c MCHEX3.INFCHE(1,6) = 1
  1130. C nombre de composantes
  1131. N2 = 3
  1132. SEGINI, MCHAM3
  1133. c MCHEX3.ICHAML(1)=MCHAM3
  1134. MCHAM3.NOMCHE(1)= 'H '
  1135. MCHAM3.NOMCHE(2)= 'F1 '
  1136. MCHAM3.NOMCHE(3)= 'F2 '
  1137. N1PTEL=NBNN3
  1138. N1EL =NBEL3
  1139. N2PTEL=0
  1140. N2EL =0
  1141. SEGINI, MELVA3
  1142. DO 409 NCOMP2=1,N2
  1143. MCHAM3.TYPCHE(NCOMP2)= 'REAL*8'
  1144. SEGINI, MELVA3
  1145. MCHAM3.IELVAL(NCOMP2)=MELVA3
  1146. 409 CONTINUE
  1147.  
  1148. c on branche dans le sous-modele le nouveau MCHAM3
  1149. cbp, TODO : ligne ci-dessous me semble etre une bidouille --> a verifier
  1150. TYMODE(1)='MCHAMLL '
  1151. IVAMOD(1)=MCHAM3
  1152.  
  1153. c ajout du nouveau sous-champ d'enrichissement de sure MCHAM3
  1154. c dans le champ d'enrichissement de sortie MCHEX2
  1155. SEGACT MCHEX2
  1156. L1 = 8
  1157. N3 = 6
  1158. N1 = MCHEX2.IMACHE(/1) + 1
  1159. SEGADJ,MCHEX2
  1160. SEGACT MCHEX2*mod
  1161. MCHEX2.IMACHE(N1)= IPT3
  1162. MCHEX2.CONCHE(N1)= IMODEL.CONMOD
  1163. MCHEX2.ICHAML(N1)= MCHAM3
  1164. MCHEX2.INFCHE(N1,2) = 0
  1165. MCHEX2.INFCHE(N1,3) = NIFOUR
  1166. MCHEX2.INFCHE(N1,6) = 1
  1167.  
  1168. c++++++ Debut de boucle sur les elements
  1169. DO 411 J=1,NBEL3
  1170. c compteurs d'enrichissements dans l'element
  1171. Nenrh = 0
  1172. Nenrf1 = 0
  1173. Nenrf2 = 0
  1174.  
  1175. c++++++++ Boucle sur les noeuds de l element j
  1176. DO 412 K=1,NBNN3
  1177.  
  1178. C Kieme noeud du Jieme element a pour numero INUM
  1179. INUM = IPT3.NUM(K,J)
  1180. c on saute les noeuds non enrichis
  1181. if((ITYPND(INUM)).le.1) goto 412
  1182.  
  1183. Ccccccccccc noeud H-enrichi
  1184. if ((ITYPND(INUM)).eq.10) then
  1185. MELVA3 = MCHAM3.IELVAL(1)
  1186. segact,MELVA3*mod
  1187. MELVA3.VELCHE(K,J) = 1.0
  1188. Nenrh = Nenrh +1
  1189.  
  1190. Ccccccccccc noeud F1-enrichi
  1191. elseif ((ITYPND(INUM)).eq.101) then
  1192. MELVA3 = MCHAM3.IELVAL(2)
  1193. segact,MELVA3*mod
  1194. MELVA3.VELCHE(K,J) = 1.0
  1195. Nenrf1 = Nenrf1 + 1
  1196.  
  1197. Ccccccccccc noeud F2-enrichi
  1198. elseif ((ITYPND(INUM)).eq.102) then
  1199. MELVA3 = MCHAM3.IELVAL(3)
  1200. segact,MELVA3*mod
  1201. MELVA3.VELCHE(K,J) = 1.0
  1202. Nenrf2 = Nenrf2 + 1
  1203. endif
  1204.  
  1205. 412 CONTINUE
  1206.  
  1207. Ccccccccccc reperage des hanging nodes a enrichir
  1208.  
  1209. if (ITYPND(IPT3.NUM(1,J)).le.1) then
  1210. if (nenrh.gt.0) then
  1211. ITYPND(IPT3.NUM(1,J))= ITYPND(IPT3.NUM(1,J)) + 200
  1212. endif
  1213. endif
  1214. if (ITYPND(IPT3.NUM(1,J)).lt.11) then
  1215. if (nenrf1.gt.0) then
  1216. ITYPND(IPT3.NUM(1,J))= ITYPND(IPT3.NUM(1,J)) + 2000
  1217. endif
  1218. if (nenrf2.gt.0) then
  1219. ITYPND(IPT3.NUM(1,J))= ITYPND(IPT3.NUM(1,J)) + 20000
  1220. endif
  1221. endif
  1222. 411 CONTINUE
  1223. c++++++ fin de boucle sur les elements
  1224.  
  1225. 400 CONTINUE
  1226. C=====FIN DE LA DEUXIEME BOUCLE SUR LES SOUS MODELES================
  1227.  
  1228. C A ce stade,
  1229. c ITYPND(#global) =
  1230. c 1 -> noeud non enrichi
  1231. c 10 -> noeud H enrichi
  1232. c 101 -> noeud F1 enrichi
  1233. c 102 -> noeud F2 enrichi
  1234. c 201 -> noeud non enrichi à H enrichir
  1235. c 301 -> noeud F1 enrichi à H enrichir
  1236. c 302 -> noeud F2 enrichi à H enrichir
  1237. c 2001 -> noeud non enrichi à F1 enrichir
  1238. c 2010 -> noeud H enrichi à F1 enrichier
  1239. c 2102 -> noeud F2 enrichi à F1 enrichir
  1240. c 2201 -> noeud non enrichi à F1 enrichir et H enrichir
  1241. c 2302 -> noeud F2 enrichi à F1 enrichir et H enrichir
  1242. c 20001 -> noeud non enrichi à F2 enrichir
  1243. c 20010 -> noeud H enrichi à F2 enrichir
  1244. c 20101 -> noeud F1 enrichi à F2 enrichir
  1245. c 20201 -> noeud non enrichi à F2 enrichir et H enrichir
  1246. c 20301 -> noeud F1 enrichi à F2 enrichir et H enrichir
  1247. C 22001 -> noeud non enrichi à F2 enrichir et F1 enrichir
  1248. c 22010 -> noeud H enrichi à F2 enrichir et F1 enrichir
  1249. c 22201 -> noeud non enrichi à F2 enrichir, F1 enrichir et H enrichir
  1250.  
  1251. c
  1252. C On a construit le champ par element à 3 composantes
  1253. C Portant sur le maillage de XC8R ou XQ4R
  1254. C MCHAM2.IELVAL(1)
  1255. C-> champ par elements qui vaut phi sur les elements h-enrichis
  1256. C MCHAM2.IELVAL(2)
  1257. C-> champ par elements contenant les valeurs de psi et phi
  1258. C aux noeds F1-enrichis
  1259. C MCHAM2.IELVAL(3)
  1260. C-> champ par elements contenant les valeurs de psi et phi
  1261. C aux noeds F2-enrichis
  1262.  
  1263. C On a construit le champ par element à 3 composantes
  1264. C Portant sur le maillage de SURE
  1265. C MCHAM3.IELVAL(1)
  1266. C-> champ par elements qui vaut 1 sur les noeud h-enrichis
  1267. C MCHAM3.IELVAL(2)
  1268. C--> champ par elements qui vaut 1 sur les noeud F1-enrichis
  1269. C MCHAM3.IELVAL(3)
  1270. C--> champ par elements qui vaut 1 sur les noeud F2-enrichis
  1271.  
  1272. if (nexsur.eq.0) goto 999
  1273. C=======================================================================
  1274. c
  1275. C 3EME BOUCLE SUR LES SOUS MODELES
  1276. c
  1277. C=======================================================================
  1278.  
  1279. DO 500 ISMOD1 = 1,NBSMOD
  1280. c
  1281. CcccccC ouverture du sous modele
  1282. IMODEL = MMODE1.KMODEL(ISMOD1)
  1283. segact IMODEL*mod
  1284. IPT4 = IMODEL.IMAMOD
  1285. SEGACT IPT4
  1286. NBNN4 = IPT4.NUM(/1)
  1287. NBEL4 = IPT4.NUM(/2)
  1288. c on travaille seulement si EF XFEM
  1289. if(NEFMOD.ne.263.and.NEFMOD.ne.264) goto 500
  1290.  
  1291.  
  1292. C=======================================================
  1293. c 5EME BOUCLE SUR LES ELEMENTS
  1294. C pour attribuer un enrichissement aux hanging nodes non enrichis
  1295. c dont les sure vont etre enrichis
  1296. C=======================================================
  1297.  
  1298. segact,MCHAM2
  1299. c on evite d'ouvrir les MELVA2 pour chaque element
  1300. c DO I2ENR=1,N2ENR
  1301. c MELVA2 = MCHAM2.IELVAL(I2ENR)
  1302. c if(MELVA2.ne.0) segact,MELVA2*mod
  1303. c ENDDO
  1304. segact,MPOVA1,MPOVA2
  1305.  
  1306. c++++++ Debut de boucle sur les elements
  1307. DO 600 J=1,NBEL4
  1308. c pour eviter de creer bcp de listreels on utilise l astuce :
  1309. mphi =0
  1310. mpsiph=0
  1311.  
  1312. c++++++++ Boucle sur les noeuds de l element j
  1313. DO 610 K=1,NBNN4
  1314.  
  1315. C Kieme noeud du Jieme element a pour numero INUM
  1316. INUM = IPT4.NUM(K,J)
  1317. if (INUM.EQ.132) then
  1318. endif
  1319.  
  1320. c on saute les noeuds qui ne nous interessent pas
  1321. if((ITYPND(INUM)).le.200) goto 610
  1322.  
  1323. Ccccccccccc noeud H-enrichi
  1324. if ((ITYPND(INUM)).eq.201) GOTO 611
  1325. if ((ITYPND(INUM)).eq.301) GOTO 611
  1326. if ((ITYPND(INUM)).eq.302) GOTO 611
  1327. if ((ITYPND(INUM)).eq.2201) GOTO 611
  1328. if ((ITYPND(INUM)).eq.2302) GOTO 611
  1329. if ((ITYPND(INUM)).eq.20201) GOTO 611
  1330. if ((ITYPND(INUM)).eq.20301) GOTO 611
  1331. if ((ITYPND(INUM)).eq.22201) GOTO 611
  1332. GOTO 612
  1333. 611 CONTINUE
  1334. MELVA2 = MCHAM2.IELVAL(1)
  1335. segact,MELVA2*mod
  1336. MLREE1 = MELVA2.IELCHE(K,J)
  1337.  
  1338. c on H-enrichit ssi ce noeud n etait pas deja H-enrichi
  1339. if (MLREE1.eq.0) then
  1340. if (mphi.ne.0) then
  1341. MELVA2.IELCHE(K,J) = mphi
  1342. else
  1343. JG = NBNN1
  1344. segini,MLREE2
  1345. MELVA2.IELCHE(K,J) = MLREE2
  1346. c on remplit la listreel des valeurs de PHI aux noeuds de l element
  1347. do inode=1,NBNN1
  1348. INUM2 = IPT4.NUM(inode,J)
  1349. I2 = NDPT2(INUM2)
  1350. MLREE2.PROG(inode) = MPOVA2.VPOCHA(I2,1)
  1351. enddo
  1352. mphi=MLREE2
  1353. endif
  1354. endif
  1355. Ccccccccccc fin des noeud H-enrichi
  1356.  
  1357. 612 CONTINUE
  1358. Ccccccccccc noeud F1-enrichi
  1359. if ((ITYPND(INUM)).eq.2001) GOTO 613
  1360. if ((ITYPND(INUM)).eq.2010) GOTO 613
  1361. if ((ITYPND(INUM)).eq.2102) GOTO 613
  1362. if ((ITYPND(INUM)).eq.2201) GOTO 613
  1363. if ((ITYPND(INUM)).eq.2302) GOTO 613
  1364. if ((ITYPND(INUM)).eq.22001) GOTO 613
  1365. if ((ITYPND(INUM)).eq.22010) GOTO 613
  1366. if ((ITYPND(INUM)).eq.22201) GOTO 613
  1367. goto 614
  1368. 613 CONTINUE
  1369. MELVA2 = MCHAM2.IELVAL(2)
  1370. segact,MELVA2*mod
  1371.  
  1372. if (mpsiph.ne.0) then
  1373. MELVA2.IELCHE(K,J) = mpsiph
  1374. else
  1375.  
  1376. NBLV7=2
  1377. JG = NBLV7*NBNN1
  1378. segini,MLREE2
  1379. MELVA2.IELCHE(K,J) = MLREE2
  1380. c on remplit la listreel des valeurs de PSI et PHI
  1381. do inode=1,NBNN4
  1382. INUM2 = IPT4.NUM(inode,J)
  1383. I1 = NDPT1(INUM2)
  1384. I2 = NDPT2(INUM2)
  1385. MLREE2.PROG(inode) = MPOVA1.VPOCHA(I1,1)
  1386. MLREE2.PROG(NBNN1+inode) = MPOVA2.VPOCHA(I2,1)
  1387. enddo
  1388. mpsiph=MLREE2
  1389. endif
  1390.  
  1391. Ccccccccccc fin des noeud F1-enrichi
  1392. 614 CONTINUE
  1393.  
  1394. Ccccccccccc noeud F2-enrichi
  1395. if ((ITYPND(INUM)).eq.20001) GOTO 615
  1396. if ((ITYPND(INUM)).eq.20010) GOTO 615
  1397. if ((ITYPND(INUM)).eq.20101) GOTO 615
  1398. if ((ITYPND(INUM)).eq.20201) GOTO 615
  1399. if ((ITYPND(INUM)).eq.20301) GOTO 615
  1400. if ((ITYPND(INUM)).eq.22001) GOTO 615
  1401. if ((ITYPND(INUM)).eq.22010) GOTO 615
  1402. if ((ITYPND(INUM)).eq.22201) GOTO 615
  1403. goto 610
  1404. 615 CONTINUE
  1405. MELVA2 = MCHAM2.IELVAL(3)
  1406. segact,MELVA2*mod
  1407.  
  1408. if (mpsiph.ne.0) then
  1409. MELVA2.IELCHE(K,J) = mpsiph
  1410. else
  1411. NBLV7=2
  1412. JG = NBLV7*NBNN1
  1413. segini,MLREE2
  1414. MELVA2.IELCHE(K,J) = MLREE2
  1415. c on remplit la listreel des valeurs de PSI et PHI
  1416. do inode=1,NBNN1
  1417. INUM2 = IPT4.NUM(inode,J)
  1418. I1 = NDPT1(INUM2)
  1419. I2 = NDPT2(INUM2)
  1420. MLREE2.PROG(inode) = MPOVA1.VPOCHA(I1,1)
  1421. MLREE2.PROG(NBNN1+inode) = MPOVA2.VPOCHA(I2,1)
  1422. enddo
  1423. mpsiph=MLREE2
  1424. endif
  1425. Ccccccccccc fin du cas noeud F2-enrichi
  1426. 610 CONTINUE
  1427. 600 CONTINUE
  1428. c++++++++ Fin de Boucle sur les noeuds de l element j
  1429. 500 CONTINUE
  1430. c fin de la boucle sur les sous modeles
  1431.  
  1432.  
  1433. 999 CONTINUE
  1434.  
  1435. C=======================================================================
  1436. c MENAGE
  1437. C=======================================================================
  1438. if(NDPT1.ne.0) then
  1439. if(NDPT1.ne.NDPT2.and.NDPT2.ne.0) SEGSUP,NDPT2
  1440. SEGSUP,NDPT1
  1441. endif
  1442. SEGSUP,ITYPND
  1443.  
  1444. C=======================================================================
  1445. c ECRITURE DES RESULTATS DE L'OPERATEUR
  1446. C=======================================================================
  1447. IF(ISYNTAX.EQ.1) THEN
  1448. if(IPRIG2.ne.0) CALL ECROBJ('RIGIDITE',IPRIG2)
  1449. CALL ACTOBJ('MCHAML ',MCHEX2,1)
  1450. CALL ECROBJ('MCHAML ',MCHEX2)
  1451. ENDIF
  1452. c rem : pour la SYNTAXE 2, c'est une directive --> rien a faire
  1453.  
  1454. END
  1455.  
  1456.  
  1457.  
  1458.  
  1459.  
  1460.  
  1461.  
  1462.  
  1463.  
  1464.  
  1465.  
  1466.  
  1467.  

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