Télécharger triele.eso

Retour à la liste

Numérotation des lignes :

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

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