Télécharger triele.eso

Retour à la liste

Numérotation des lignes :

triele
  1. C TRIELE SOURCE MB234859 25/09/08 21:16:11 12358
  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. segini,DESCR,XMATRI
  496. c IRIGEL(1,iriri)=IPT6
  497. c On duplique le maillage prototype de la rigidite
  498. if(iriri.eq.1) then
  499. IPT7=IPT6
  500. else
  501. segini,IPT7=IPT6
  502. c on crée un noeud pour le multiplicateur de lagrange LX
  503. c pour chaque element de ipt7
  504. do ii2=1,NBELEM
  505. iilx = iilx+1
  506. c iilx6=IPT6.NUM(1,ii2) on prend ipt7 actif et pas ipt6
  507. iilx6=IPT7.NUM(1,ii2)
  508. XCOOR((iilx-1)*(IDIM1)+1) = XCOOR((iilx6-1)*(IDIM1)+1)
  509. XCOOR((iilx-1)*(IDIM1)+2) = XCOOR((iilx6-1)*(IDIM1)+2)
  510. if(idim.eq.3)
  511. & XCOOR((iilx-1)*(IDIM1)+3) = XCOOR((iilx6-1)*(IDIM1)+3)
  512. XCOOR(iilx*(IDIM1)) = XCOOR(iilx6*(IDIM1))
  513. IPT7.NUM(1,ii2)=iilx
  514. enddo
  515. endif
  516. IRIGEL(1,iriri)=IPT7
  517. IRIGEL(2,iriri)=0
  518. IRIGEL(3,iriri)=DESCR
  519. IRIGEL(4,iriri)=XMATRI
  520. IRIGEL(5,iriri)=NIFOUR
  521. IRIGEL(6,iriri)=0
  522. IRIGEL(7,iriri)=0
  523. IRIGEL(8,iriri)=0
  524. c remplissage du DESCR
  525. LISINC(1)='LX'
  526. LISDUA(1)='FLX'
  527. jb=jb+1
  528. jdim=jdim+1
  529. if(ITIP1.eq.1) then
  530. LISINC(2)=MOTPR1(jb)
  531. LISDUA(2)=MOTDU1(jb)
  532. elseif(ITIP1.eq.2) then
  533. LISINC(2)=MOTPR2(jb)
  534. LISDUA(2)=MOTDU2(jb)
  535. endif
  536. c petit ajustement pour "sauter" les composantes en Z
  537. if(jdim.eq.idim) then
  538. jdim=0
  539. if(idim.eq.2) jb=jb+1
  540. endif
  541. do jinc=1,NLIGRP
  542. NOELEP(jinc)=jinc
  543. NOELED(jinc)=jinc
  544. enddo
  545. c remplissage de XMATRI
  546. do jel=1,NELRIG
  547. RE(1,1,jel)=0.d0
  548. RE(1,2,jel)=1.d0
  549. RE(2,1,jel)=1.d0
  550. RE(2,2,jel)=0.d0
  551. enddo
  552. segdes,DESCR,XMATRI
  553. enddo
  554. segdes,MRIGID
  555. 139 continue
  556. endif
  557.  
  558. endif
  559. c --- fin du cas DESENRICHISSEMENT ---
  560.  
  561.  
  562. C=======================================================
  563. c BOUCLE SUR LES POINTS DES CHPOINTS
  564. c pour creer une numerotation locale
  565. c --> NDPT1/2(#global) = #chpo1/2
  566. C=======================================================
  567.  
  568. c -chpoint psi
  569. segact,IPT1
  570. NBNO1 = IPT1.NUM(/2)
  571. C on crée la table qui depuis num de noeud donne point dans chpoint
  572. NI = nbpts
  573. SEGINI,NDPT1
  574. cccccc Vrai Debut de boucle
  575. DO I1=1,NBNO1
  576. C on recupere le numero de noeud
  577. INUM1 = IPT1.NUM(1,I1)
  578. C on remplit la table
  579. NDPT1(INUM1) = I1
  580. ENDDO
  581.  
  582. c -chpoint phi
  583. if (IPT1.eq.IPT2) then
  584. NDPT2=NDPT1
  585. else
  586. segact,IPT2
  587. NBNO2 = IPT2.NUM(/2)
  588. if (NBNO1.ne.NBNO2) then
  589. MOTERR='CHPOINT POINTS !'
  590. c "Les deux objets de type %m1:8 n'ont pas le meme nombre de %m9:16"
  591. call ERREUR(403)
  592. return
  593. endif
  594. SEGINI,NDPT2
  595. DO I2=1,NBNO2
  596. C on recupere le numero de noeud
  597. INUM2 = IPT2.NUM(1,I2)
  598. if (NDPT1(INUM2).eq.0) then
  599. IF(IMPI.GE.1) write(IOIMP,*) 'Les chpoints PSI et PHI ',
  600. & 'doivent avoir les memes points suuports !'
  601. c "Les champs par point ont des supports geometriques incompatibles"
  602. call ERREUR(348)
  603. return
  604. endif
  605. C on remplit la table
  606. NDPT2(INUM2) = I2
  607. ENDDO
  608. endif
  609. C=======FIN DE BOUCLE SUR LES POINTS DES CHPOINTS=======
  610.  
  611.  
  612. C=======================================================
  613. c 1ere BOUCLE SUR LES ELEMENTS
  614. c POUR LA "SIMPLIFICATION" des level sets :
  615. c MPOVA1/2 --> MPOVA3/4
  616. C=======================================================
  617. C Ouverture du maillage et des chpoints level set
  618. c SEGACT MELEME,MPOVA1,MPOVA2
  619. SEGACT MPOVA1,MPOVA2
  620. NBNN1 = NUM(/1)
  621. NBEL1 = NUM(/2)
  622. c on recupere les coord dans l element parents des noeuds
  623. MINT0 = INFMOD(3)
  624. segact,MINT0
  625. c on recupere les coord dans l element parents des points de gauss
  626. MINT1 = INFMOD(5)
  627. segact,MINT1
  628. c segment integration ef std correspondant -> inutile pour l instant
  629. c MINT2 = INFELE(12)
  630. c if(MINT2.ne.0) segact,MINT2
  631. c recherche du num du pt de gauss KKGAU le plus proche du noeud inode1
  632. NGAU1 = INFELE(6)
  633. NI = NBNN1
  634. segini,KKGAU
  635. do inode1=1,NBNN1
  636. kgau1 = 1
  637. DXi1 = ((MINT1.QSIGAU(kgau1)) - (MINT0.QSIGAU(inode1)))**2
  638. & + ((MINT1.ETAGAU(kgau1)) - (MINT0.ETAGAU(inode1)))**2
  639. & + ((MINT1.DZEGAU(kgau1)) - (MINT0.DZEGAU(inode1)))**2
  640. do kgau2=2,NGAU1
  641. DXi2 = ((MINT1.QSIGAU(kgau2)) - (MINT0.QSIGAU(inode1)))**2
  642. & + ((MINT1.ETAGAU(kgau2)) - (MINT0.ETAGAU(inode1)))**2
  643. & + ((MINT1.DZEGAU(kgau2)) - (MINT0.DZEGAU(inode1)))**2
  644. if (DXi2.lt.DXi1) then
  645. DXi1 = DXi2
  646. kgau1 = kgau2
  647. endif
  648. enddo
  649. KKGAU(inode1) = kgau1
  650. enddo
  651.  
  652. NI = NBEL1
  653. C Initialisation des tableaux de travail
  654. NI = NBNN1
  655. segini,NUMND,XPSI,XPHI
  656.  
  657.  
  658. c++++++ Debut de boucle sur les elements
  659. DO 200 J=1,NBEL1
  660.  
  661. C++++++++ Mini-Boucle(S) sur les noeuds de l element
  662. DO K=1,NBNN1
  663. C numero INUM du Kieme noeud du Jieme element
  664. INUM = NUM(K,J)
  665. C numero du point correspondant des chpoints
  666. I1 = NDPT1(INUM)
  667. I2 = NDPT2(INUM)
  668. c on verifie que le chpoint y est bien defini sinon on saute tout!
  669. if(I1.eq.0) goto 200
  670. C valeurs de psi et phi au Kieme noeud
  671. XPSI(K) = MPOVA1.VPOCHA(I1,1)
  672. XPHI(K) = MPOVA2.VPOCHA(I2,1)
  673. ENDDO
  674. C++++++++ Fin de la Mini-Boucle sur les noeuds de l element
  675.  
  676.  
  677. C++++++++ Mini-Boucle(S) sur les noeuds de l element
  678. DO K=1,NBNN1
  679. C on calcule phi au pts de gauss le + proche du noeud considéré
  680. kgau1 = KKGAU(K)
  681. XPSIGAU = 0.d0
  682. XPHIGAU = 0.d0
  683. do ii1=1,NBNN1
  684. XPSIGAU = XPSIGAU
  685. & + ( (MINT1.SHPTOT(1,ii1,kgau1)) * (XPSI(ii1)) )
  686. XPHIGAU = XPHIGAU
  687. & + ( (MINT1.SHPTOT(1,ii1,kgau1)) * (XPHI(ii1)) )
  688. enddo
  689. C numero INUM du Kieme noeud du Jieme element
  690. INUM = NUM(K,J)
  691. C numero du point correspondant des chpoints
  692. I1 = NDPT1(INUM)
  693. I2 = NDPT2(INUM)
  694. c C simplification
  695. c IF (((XPSI(K))*XPSIGAU).LE.0.d0) THEN
  696. c c XPSI(K) = 0.d0
  697. c MPOVA3.VPOCHA(I1,1) = 0.d0
  698. c ELSEIF (ABS(XPSI(K)).LE.XTOL) THEN
  699. c XPSI(K) = 0.d0
  700. c MPOVA3.VPOCHA(I1,1) = 0.d0
  701. c ENDIF
  702. c IF (((XPHI(K))*XPHIGAU).LE.0.d0) THEN
  703. c c XPHI(K) = 0.d0
  704. c MPOVA4.VPOCHA(I2,1) = 0.d0
  705. c ELSEIF (ABS(XPHI(K)).LE.XTOL) THEN
  706. c c XPHI(K) = 0.d0
  707. c MPOVA4.VPOCHA(I2,1) = 0.d0
  708. c ENDIF
  709. C simplification (bp: 13./07/2011)
  710. IF(((XPSI(K))*XPSIGAU).LE.0.d0)
  711. & MPOVA3.VPOCHA(I1,1) = 0.d0
  712. IF(((XPHI(K))*XPHIGAU).LE.0.d0)
  713. & MPOVA4.VPOCHA(I2,1) = 0.d0
  714. ENDDO
  715. C++++++++ Fin de la Mini-Boucle sur les noeuds de l element
  716.  
  717. 200 CONTINUE
  718. C=======FIN DE la 1ere BOUCLE SUR LES ELEMENTS==========
  719.  
  720.  
  721. C=======================================================
  722. c 2EME BOUCLE SUR LES ELEMENTS
  723. C POUR LE TRI DES NOEUDS ("TEST EN PAGAILLE")
  724. c --> ITYPND(#global) = 0 : noeud pas vu
  725. c 1 : standard (non enrichi)
  726. c 10 : H-enrichi
  727. c 100 : F-enrichi
  728. C=======================================================
  729.  
  730. c++++++ Debut de boucle sur les elements
  731. DO 222 J=1,NBEL1
  732.  
  733. C++++++++ Mini-Boucle(S) sur les noeuds de l element
  734. DO K=1,NBNN1
  735. C numero INUM du Kieme noeud du Jieme element
  736. INUM = NUM(K,J)
  737. C numero du point correspondant des chpoints
  738. I1 = NDPT1(INUM)
  739. I2 = NDPT2(INUM)
  740. c on verifie que le chpoint y est bien defini sinon on saute tout!
  741. if(I1.eq.0) goto 222
  742. C numero INUM du Kieme noeud de l'element en cours (le Jieme)
  743. NUMND(K) = INUM
  744. C valeurs de psi et phi au Kieme noeud
  745. XPSIK = MPOVA3.VPOCHA(I1,1)
  746. XPHIK = MPOVA4.VPOCHA(I1,1)
  747. XPSI(K) = XPSIK
  748. XPHI(K) = XPHIK
  749. C Calcul de valeurs utiles POUR LE TRI
  750. if (K.eq.1) then
  751. PSIMAX = XPSIK
  752. PSIMIN = XPSIK
  753. PSIMIA = ABS(XPSIK)
  754. PHIMAX = XPHIK
  755. PHIMIN = XPHIK
  756. PHIMIA = ABS(XPHIK)
  757. else
  758. PSIMAX = MAX(PSIMAX,XPSIK)
  759. PSIMIN = MIN(PSIMIN,XPSIK)
  760. PSIMIA = MIN(PSIMIA,ABS(XPSIK))
  761. PHIMAX = MAX(PHIMAX,XPHIK)
  762. PHIMIN = MIN(PHIMIN,XPHIK)
  763. PHIMIA = MIN(PHIMIA,ABS(XPHIK))
  764. endif
  765.  
  766. ENDDO
  767. C++++++++ Fin de la Mini-Boucle sur les noeuds de l element
  768. PSIPRD = PSIMAX * PSIMIN
  769. PHIPRD = PHIMAX * PHIMIN
  770. c
  771. C
  772. C++++++++ Tests en pagaille pour trier
  773.  
  774. c LOG1 = Tous les noeuds de lelement sont situés en arriere du front?
  775. LOG1 = (PSIMAX.LE.0.d0)
  776. c ...noeuds en arriere du front + element coupé par la fissure
  777. IF (LOG1.AND.(PHIPRD.LT.0.d0)) THEN
  778. C => tous les noeud doivent etre H-enrichi (=10)
  779. DO K=1,NBNN1
  780. INUM = NUMND(K)
  781. ITYPND(INUM) = MAX(10,ITYPND(INUM))
  782. ENDDO
  783. C
  784. c ...noeuds en arriere du front + element tangent avec la fissure
  785. ELSEIF (LOG1.AND.(PHIMIA.EQ.0.d0)) THEN
  786. C => seuls les noeud tangents doivent etre H-enrichi (=10)
  787. DO K=1,NBNN1
  788. IF (XPHI(K).EQ.0.d0) THEN
  789. INUM = NUMND(K)
  790. ITYPND(INUM) = MAX(10,ITYPND(INUM))
  791. ENDIF
  792. ENDDO
  793. C
  794. c Element contenant la pointe de fissure
  795. ELSEIF ((PSIPRD.LT.0.d0).AND.(PHIPRD.LT.0.d0)) THEN
  796. C => tous les noeud doivent etre F-enrichi (=100)
  797. DO K=1,NBNN1
  798. INUM = NUMND(K)
  799. ITYPND(INUM) = 100
  800. ENDDO
  801. C
  802. c Element dont un bord contient la pointe de fissure
  803. ELSEIF ((PSIPRD.LT.0.d0).AND.(PHIMIA.EQ.0.d0)) THEN
  804. C => tous les noeud doivent etre F-enrichi (=100)
  805. DO K=1,NBNN1
  806. INUM = NUMND(K)
  807. ITYPND(INUM) = 100
  808. ENDDO
  809. C
  810. c La pointe arrive sur un bord de l element
  811. ELSEIF ((PSIMIA.EQ.0.d0).AND.(PHIPRD.LT.0.d0)) THEN
  812. C => choix: seuls les noeud en avant du front sont F-enrichi (=100)
  813. DO K=1,NBNN1
  814. INUM = NUMND(K)
  815. if (XPSI(K).GE.0.d0) ITYPND(INUM) = 100
  816. ENDDO
  817. C
  818. c Element dont un coin contient la pointe de fissure
  819. ELSEIF ((PSIMIA.EQ.0.d0).AND.(PHIMIA.EQ.0.d0)) THEN
  820. C => choix: seuls les noeud en avant du front sont F-enrichi (=100)
  821. DO K=1,NBNN1
  822. INUM = NUMND(K)
  823. if (XPSI(K).GE.0.d0) ITYPND(INUM) = 100
  824. ENDDO
  825. C
  826. c Les autres elements ne sont pas directement coupés ni tangents avec la fissure
  827. ELSE
  828. C => on met a 1 pour dire qu on les a vu
  829. DO K=1,NBNN1
  830. INUM = NUMND(K)
  831. ITYPND(INUM) = MAX(1,ITYPND(INUM))
  832. ENDDO
  833. C
  834. ENDIF
  835. C++++++++ Fin des Tests en pagaille pour trier
  836.  
  837.  
  838. 222 CONTINUE
  839. C=======FIN DE la 2eme BOUCLE SUR LES ELEMENTS==========
  840. segsup,NUMND,XPSI,XPHI,KKGAU
  841.  
  842.  
  843. 100 CONTINUE
  844. C=====FIN DE LA PREMIERE BOUCLE SUR LES SOUS MODELES================
  845.  
  846. C A ce stade, pour la syntaxe 1,
  847. c on a cree le champ par point ITYPND qui vaut :
  848. c 1 -> noeud non enrichi
  849. c 10 -> noeud H enrichi
  850. c 100 -> noeud F1 ou F2 enrichi
  851.  
  852. cbp, TODO : surement a revoir ...
  853. IF (ISYNTAX.EQ.2) GOTO 999
  854.  
  855.  
  856.  
  857. C=======================================================================
  858. c
  859. C 2EME BOUCLE SUR LES SOUS MODELES
  860. c
  861. c --> remplissage de MCHAM2.IELVAL(1/2/3) = MELVA2
  862. c avec MELVA2.IELCHE(K,J) = listreel de phi ou psi associe
  863. c a l'enrichissement du Kieme noeud du Jieme element
  864. c
  865. c --> ITYPND =101/102 selon F1/F2-enrichi
  866. c
  867. c --> creation de MCHAM3.IELVAL(1/2/3) = MELVA3
  868. c associee aux elements SURE
  869. c avec MELVA3.VELCHE(1,J) = 1. si H/F1/F2-enrichi , 0. sinon
  870. c
  871. c --> ITYPND = ITYPND + 200/2000/20000 si le hanging node appartient
  872. c a une relation ou l'un des noeuds est H/F1/F2-enrichi
  873. c
  874. C=======================================================================
  875.  
  876. nexsur = 0
  877. DO 400 ISMOD1 = 1,NBSMOD
  878. c write (*,*) 'boucle 400 : sous modele ', ISMOD1,'/',NBSMOD
  879. c
  880. CcccccC ouverture du sous modele
  881. IMODEL = MMODE1.KMODEL(ISMOD1)
  882. segact IMODEL*mod
  883. IPT3 = IMODEL.IMAMOD
  884. SEGACT IPT3
  885.  
  886. c travail specifique pour les elements SURE
  887. if (NEFMOD.EQ.259) GOTO 410
  888. c on travaille seulement si EF XFEM
  889. if(NEFMOD.ne.263.and.NEFMOD.ne.264) goto 400
  890.  
  891.  
  892. C=======================================================
  893. c 3EME BOUCLE SUR LES ELEMENTS
  894. C POUR ATTRIBUER L'ENRICHISSEMENT
  895. C=======================================================
  896. c write(*,*) 'MCHAM2=',MCHAM2
  897. cbp : il n'y en a qu'1 --> deja en segini segact,MCHAM2
  898. c on evite d'ouvrir les MELVA2 pour chaque element
  899. DO I2ENR=1,N2ENR
  900. MELVA2 = MCHAM2.IELVAL(I2ENR)
  901. if(MELVA2.ne.0) segact,MELVA2*mod
  902. ENDDO
  903. segact,MPOVA1,MPOVA2
  904.  
  905.  
  906. c++++++ Debut de boucle sur les elements
  907. DO 300 J=1,NBEL1
  908. c write(*,*) '***** ELEM', J,'/', NBEL1
  909.  
  910. c pour eviter de creer bcp de listreels on utilise l astuce :
  911. mphi =0
  912. mpsiph=0
  913. c++++++++ Boucle sur les noeuds de l element j
  914. DO 310 K=1,NBNN1
  915. C Kieme noeud du Jieme element a pour numero INUM
  916. INUM = NUM(K,J)
  917. c write(*,*) 'INUM', INUM, 'ITYPND(INUM)', ITYPND(INUM)
  918. c on saute les noeuds non enrichis
  919. if((ITYPND(INUM)).le.1) goto 310
  920. Ccccccccccc noeud H-enrichi
  921. if ((ITYPND(INUM)).eq.10) then
  922. MELVA2 = MCHAM2.IELVAL(1)
  923. c segact,MELVA2*mod
  924. MLREE1 = MELVA2.IELCHE(K,J)
  925.  
  926. c on H-enrichit ssi ce noeud n etait pas deja H-enrichi
  927. if (MLREE1.eq.0) then
  928. if (mphi.ne.0) then
  929. MELVA2.IELCHE(K,J) = mphi
  930. else
  931. JG = NBNN1
  932. segini,MLREE2
  933. MELVA2.IELCHE(K,J) = MLREE2
  934. c on remplit la listreel des valeurs de PHI aux noeuds de l element
  935. do inode=1,NBNN1
  936. INUM2 = NUM(inode,J)
  937. I2 = NDPT2(INUM2)
  938. MLREE2.PROG(inode) = MPOVA2.VPOCHA(I2,1)
  939. enddo
  940. mphi=MLREE2
  941. endif
  942. endif
  943. endif
  944. Ccccccccccc fin des noeud H-enrichi
  945.  
  946.  
  947. Ccccccccccc noeud F-enrichi
  948. * if((ITYPND(INUM)).eq.100) then
  949. *as 2010_01_20: lsaut =1000 si option 'SAUT' , =100 sinon
  950. c if (((ITYPND(INUM)).eq.lsaut).OR.((ITYPND(INUM)).eq.101)) then
  951. c write(*,*) 'ITYPND(INUM)', ITYPND(INUM), 'lsaut', lsaut
  952. c write(*,*) 'Nelem', j , 'INUM', inum
  953. if (((ITYPND(INUM)).ge.lsaut)) then
  954.  
  955. c si F1 pas prevu on le rajoute
  956. if (N2ENR.lt.2) then
  957. N2ENR = 2
  958. N2 = N2ENR
  959. segadj,MCHAM2
  960. MCHAM2.NOMCHE(N2ENR) = 'F1'
  961. MCHAM2.TYPCHE(N2ENR) = 'POINTEURLISTREEL'
  962. N1PTEL=0
  963. N1EL =0
  964. N2PTEL=NBNN1
  965. N2EL =NBEL1
  966. segini,MELVA2
  967. MCHAM2.IELVAL(N2ENR) = MELVA2
  968. else
  969. MELVA2 = MCHAM2.IELVAL(2)
  970. c segact,MELVA2*mod
  971. endif
  972.  
  973. c - on F1-enrichit si ce noeud n etait pas deja F1-enrichi
  974. c OU si on est dans une stratégie de désenrichissement
  975. c et que c'est le tour de F1 (on alterne F1, F2, F1, etc.)
  976. MLREE1 = MELVA2.IELCHE(K,J)
  977. c if (MLREE1.eq.0) then
  978. if ((MLREE1.eq.0.and.IMOT0.ne.2).OR
  979. & .(ITIP2.eq.1.and.IMOT0.eq.2)) then
  980.  
  981. ITYPND(INUM)=101;
  982. if (mpsiph.ne.0) then
  983. MELVA2.IELCHE(K,J) = mpsiph
  984. else
  985. NBLV7=2
  986. JG = NBLV7*NBNN1
  987. segini,MLREE2
  988. MELVA2.IELCHE(K,J) = MLREE2
  989. c on remplit la listreel des valeurs de PSI et PHI
  990. do inode=1,NBNN1
  991. INUM2 = NUM(inode,J)
  992. I1 = NDPT1(INUM2)
  993. I2 = NDPT2(INUM2)
  994. MLREE2.PROG(inode) = MPOVA1.VPOCHA(I1,1)
  995. MLREE2.PROG(NBNN1+inode) = MPOVA2.VPOCHA(I2,1)
  996. enddo
  997. mpsiph=MLREE2
  998. endif
  999.  
  1000. c - si noeud deja F1-enrichi, alors on essaie de le F2-enrichir
  1001. c OU si on est dans une stratégie de désenrichissement
  1002. c et que c'est le tour de F2
  1003. else
  1004. ITYPND(INUM)=102;
  1005. c si F2 pas prevu on le rajoute
  1006. if (N2ENR.lt.3) then
  1007. N2ENR = 3
  1008. N2 = N2ENR
  1009. segadj,MCHAM2
  1010. MCHAM2.NOMCHE(N2ENR) = 'F2'
  1011. MCHAM2.TYPCHE(N2ENR) = 'POINTEURLISTREEL'
  1012. N1PTEL=0
  1013. N1EL =0
  1014. N2PTEL=NBNN1
  1015. N2EL =NBEL1
  1016. segini,MELVA2
  1017. MCHAM2.IELVAL(N2ENR) = MELVA2
  1018. else
  1019. MELVA2 = MCHAM2.IELVAL(3)
  1020. segact,MELVA2*mod
  1021. endif
  1022. c +-- on F2-enrichit si ce noeud n etait pas deja F1-enrichi
  1023. MLREE1 = MELVA2.IELCHE(K,J)
  1024. if (MLREE1.eq.0) then
  1025. if (mpsiph.ne.0) then
  1026. MELVA2.IELCHE(K,J) = mpsiph
  1027. else
  1028. NBLV7=2
  1029. JG = NBLV7*NBNN1
  1030. segini,MLREE2
  1031. MELVA2.IELCHE(K,J) = MLREE2
  1032. c on remplit la listreel des valeurs de PSI et PHI
  1033. do inode=1,NBNN1
  1034. INUM2 = NUM(inode,J)
  1035. I1 = NDPT1(INUM2)
  1036. I2 = NDPT2(INUM2)
  1037. MLREE2.PROG(inode) = MPOVA1.VPOCHA(I1,1)
  1038. MLREE2.PROG(NBNN1+inode) = MPOVA2.VPOCHA(I2,1)
  1039. enddo
  1040. mpsiph=MLREE2
  1041. endif
  1042.  
  1043. c +-- si on est la, c est que le noeud est deja F1 et F2 enrichi
  1044. c => pour l instant on genere une erreur,
  1045. c mais pour le futur ajouter la possiblite d avoir N2ENR >3
  1046. else
  1047. if(impi.ge.1) write(ioimp,*)
  1048. & 'Trop d enrichissement (> 2 pointes) pour le ',
  1049. & 'noeud',INUM,' = ',K,'ieme noeud du',J,'ieme element'
  1050. c "Nombre maximum de fonctions de forme atteint au noeud %i1."
  1051. INTERR(1)=INUM
  1052. CALL ERREUR(1112)
  1053. RETURN
  1054. endif
  1055. c +-- fin de la distinction noeud deja F2-enrichi ou pas
  1056.  
  1057. endif
  1058. c - fin de la distinction noeud deja F1-enrichi ou pas
  1059.  
  1060. endif
  1061. Ccccccccccc fin du cas noeud F-enrichi
  1062.  
  1063. 310 CONTINUE
  1064. c++++++++ Fin de Boucle sur les noeuds de l element j
  1065.  
  1066.  
  1067. 300 CONTINUE
  1068. C=======FIN DE la 3eme BOUCLE SUR LES ELEMENTS===========
  1069.  
  1070. C A ce stade,
  1071. c ITYPND(#global) = 1 -> noeud non enrichi
  1072. c 10 -> noeud H enrichi
  1073. c 101 -> noeud F1 enrichi
  1074. c 102 -> noeud F2 enrichi
  1075. c
  1076. C On a construit le champ par element MCHAM2 à 3 composantes :
  1077. C 1. MCHAM2.IELVAL(1) :
  1078. C champ par elements qui vaut phi sur les elements h-enrichis
  1079. C 2. MCHAM2.IELVAL(2)
  1080. C champ par elements contenant les valeurs de psi et phi
  1081. C aux noeuds F1-enrichis
  1082. C 3. MCHAM2.IELVAL(3)
  1083. C champ par elements contenant les valeurs de psi et phi
  1084. C aux noeuds F2-enrichis
  1085.  
  1086. c on n' plus besoin des level-sets simplifiees
  1087. SEGSUP,MPOVA3,MPOVA4
  1088. C if(NDPT1.ne.NDPT2) SEGSUP,NDPT2
  1089. C SEGSUP,NDPT1
  1090.  
  1091.  
  1092. C=======================================================
  1093. c 4eme BOUCLE SUR LES ELEMENTS
  1094. C construction d'un champ d'enrichissement associée aux SURE
  1095. C=======================================================
  1096.  
  1097. 410 CONTINUE
  1098. IF(NEFMOD.NE.259 ) GOTO 400
  1099. IF(infele(13).NE.63) GOTO 400
  1100. C gg 2017_07_05 : traitement des elements sure
  1101. c (pour les relations de compatibilite issues de RAFF)
  1102. nexsur = 1
  1103.  
  1104. c recuperation du maillage support du sous-modele de sure
  1105. NBNN3 = IPT3.NUM(/1)
  1106. NBEL3 = IPT3.NUM(/2)
  1107.  
  1108. MN3=IMODEL.INFMOD(/1)
  1109. NFOR=IMODEL.FORMOD(/2)
  1110. NMAT=IMODEL.MATMOD(/2)
  1111. * on ajoute au sous-modele . IVAMOD(1) = MCHAM3
  1112. NOBMOD = 1
  1113. SEGADJ, IMODEL
  1114.  
  1115. C write(*,*) 'Creation du champ d enrichissement de sure'
  1116. C++++ INITIALISATION d'un nouveau MCHAML vierge MCHAM3
  1117. c L1 = 8
  1118. C nombre de sous champs
  1119. c N1 = 1
  1120. c N3 = 6
  1121. c SEGINI, MCHEX3
  1122. c MCHEX3.TITCHE = 'ENRICHIS'
  1123. c MCHEX3.IFOCHE = IFOUR
  1124. c MCHEX3.IMACHE(1)= IMAMOD
  1125. c MCHEX3.CONCHE(1)= IMODEL.CONMOD
  1126. c MCHEX3.INFCHE(1,2) = 0
  1127. c MCHEX3.INFCHE(1,3) = NIFOUR
  1128. c MCHEX3.INFCHE(1,6) = 1
  1129. C nombre de composantes
  1130. N2 = 3
  1131. SEGINI, MCHAM3
  1132. c MCHEX3.ICHAML(1)=MCHAM3
  1133. MCHAM3.NOMCHE(1)= 'H '
  1134. MCHAM3.NOMCHE(2)= 'F1 '
  1135. MCHAM3.NOMCHE(3)= 'F2 '
  1136. N1PTEL=NBNN3
  1137. N1EL =NBEL3
  1138. N2PTEL=0
  1139. N2EL =0
  1140. SEGINI, MELVA3
  1141. DO 409 NCOMP2=1,N2
  1142. MCHAM3.TYPCHE(NCOMP2)= 'REAL*8'
  1143. SEGINI, MELVA3
  1144. MCHAM3.IELVAL(NCOMP2)=MELVA3
  1145. 409 CONTINUE
  1146.  
  1147. c on branche dans le sous-modele le nouveau MCHAM3
  1148. cbp, TODO : ligne ci-dessous me semble etre une bidouille --> a verifier
  1149. TYMODE(1)='MCHAMLL '
  1150. IVAMOD(1)=MCHAM3
  1151.  
  1152. c ajout du nouveau sous-champ d'enrichissement de sure MCHAM3
  1153. c dans le champ d'enrichissement de sortie MCHEX2
  1154. SEGACT MCHEX2
  1155. L1 = 8
  1156. N3 = 6
  1157. N1 = MCHEX2.IMACHE(/1) + 1
  1158. SEGADJ,MCHEX2
  1159. SEGACT MCHEX2*mod
  1160. MCHEX2.IMACHE(N1)= IPT3
  1161. MCHEX2.CONCHE(N1)= IMODEL.CONMOD
  1162. MCHEX2.ICHAML(N1)= MCHAM3
  1163. MCHEX2.INFCHE(N1,2) = 0
  1164. MCHEX2.INFCHE(N1,3) = NIFOUR
  1165. MCHEX2.INFCHE(N1,6) = 1
  1166.  
  1167. c++++++ Debut de boucle sur les elements
  1168. DO 411 J=1,NBEL3
  1169. c compteurs d'enrichissements dans l'element
  1170. Nenrh = 0
  1171. Nenrf1 = 0
  1172. Nenrf2 = 0
  1173.  
  1174. c++++++++ Boucle sur les noeuds de l element j
  1175. DO 412 K=1,NBNN3
  1176.  
  1177. C Kieme noeud du Jieme element a pour numero INUM
  1178. INUM = IPT3.NUM(K,J)
  1179. c on saute les noeuds non enrichis
  1180. if((ITYPND(INUM)).le.1) goto 412
  1181.  
  1182. Ccccccccccc noeud H-enrichi
  1183. if ((ITYPND(INUM)).eq.10) then
  1184. MELVA3 = MCHAM3.IELVAL(1)
  1185. segact,MELVA3*mod
  1186. MELVA3.VELCHE(K,J) = 1.0
  1187. Nenrh = Nenrh +1
  1188.  
  1189. Ccccccccccc noeud F1-enrichi
  1190. elseif ((ITYPND(INUM)).eq.101) then
  1191. MELVA3 = MCHAM3.IELVAL(2)
  1192. segact,MELVA3*mod
  1193. MELVA3.VELCHE(K,J) = 1.0
  1194. Nenrf1 = Nenrf1 + 1
  1195.  
  1196. Ccccccccccc noeud F2-enrichi
  1197. elseif ((ITYPND(INUM)).eq.102) then
  1198. MELVA3 = MCHAM3.IELVAL(3)
  1199. segact,MELVA3*mod
  1200. MELVA3.VELCHE(K,J) = 1.0
  1201. Nenrf2 = Nenrf2 + 1
  1202. endif
  1203.  
  1204. 412 CONTINUE
  1205.  
  1206. Ccccccccccc reperage des hanging nodes a enrichir
  1207.  
  1208. if (ITYPND(IPT3.NUM(1,J)).le.1) then
  1209. if (nenrh.gt.0) then
  1210. ITYPND(IPT3.NUM(1,J))= ITYPND(IPT3.NUM(1,J)) + 200
  1211. endif
  1212. endif
  1213. if (ITYPND(IPT3.NUM(1,J)).lt.11) then
  1214. if (nenrf1.gt.0) then
  1215. ITYPND(IPT3.NUM(1,J))= ITYPND(IPT3.NUM(1,J)) + 2000
  1216. endif
  1217. if (nenrf2.gt.0) then
  1218. ITYPND(IPT3.NUM(1,J))= ITYPND(IPT3.NUM(1,J)) + 20000
  1219. endif
  1220. endif
  1221. 411 CONTINUE
  1222. c++++++ fin de boucle sur les elements
  1223.  
  1224. 400 CONTINUE
  1225. C=====FIN DE LA DEUXIEME BOUCLE SUR LES SOUS MODELES================
  1226.  
  1227. C A ce stade,
  1228. c ITYPND(#global) =
  1229. c 1 -> noeud non enrichi
  1230. c 10 -> noeud H enrichi
  1231. c 101 -> noeud F1 enrichi
  1232. c 102 -> noeud F2 enrichi
  1233. c 201 -> noeud non enrichi à H enrichir
  1234. c 301 -> noeud F1 enrichi à H enrichir
  1235. c 302 -> noeud F2 enrichi à H enrichir
  1236. c 2001 -> noeud non enrichi à F1 enrichir
  1237. c 2010 -> noeud H enrichi à F1 enrichier
  1238. c 2102 -> noeud F2 enrichi à F1 enrichir
  1239. c 2201 -> noeud non enrichi à F1 enrichir et H enrichir
  1240. c 2302 -> noeud F2 enrichi à F1 enrichir et H enrichir
  1241. c 20001 -> noeud non enrichi à F2 enrichir
  1242. c 20010 -> noeud H enrichi à F2 enrichir
  1243. c 20101 -> noeud F1 enrichi à F2 enrichir
  1244. c 20201 -> noeud non enrichi à F2 enrichir et H enrichir
  1245. c 20301 -> noeud F1 enrichi à F2 enrichir et H enrichir
  1246. C 22001 -> noeud non enrichi à F2 enrichir et F1 enrichir
  1247. c 22010 -> noeud H enrichi à F2 enrichir et F1 enrichir
  1248. c 22201 -> noeud non enrichi à F2 enrichir, F1 enrichir et H enrichir
  1249.  
  1250. c
  1251. C On a construit le champ par element à 3 composantes
  1252. C Portant sur le maillage de XC8R ou XQ4R
  1253. C MCHAM2.IELVAL(1)
  1254. C-> champ par elements qui vaut phi sur les elements h-enrichis
  1255. C MCHAM2.IELVAL(2)
  1256. C-> champ par elements contenant les valeurs de psi et phi
  1257. C aux noeds F1-enrichis
  1258. C MCHAM2.IELVAL(3)
  1259. C-> champ par elements contenant les valeurs de psi et phi
  1260. C aux noeds F2-enrichis
  1261.  
  1262. C On a construit le champ par element à 3 composantes
  1263. C Portant sur le maillage de SURE
  1264. C MCHAM3.IELVAL(1)
  1265. C-> champ par elements qui vaut 1 sur les noeud h-enrichis
  1266. C MCHAM3.IELVAL(2)
  1267. C--> champ par elements qui vaut 1 sur les noeud F1-enrichis
  1268. C MCHAM3.IELVAL(3)
  1269. C--> champ par elements qui vaut 1 sur les noeud F2-enrichis
  1270.  
  1271. if (nexsur.eq.0) goto 999
  1272. C=======================================================================
  1273. c
  1274. C 3EME BOUCLE SUR LES SOUS MODELES
  1275. c
  1276. C=======================================================================
  1277.  
  1278. DO 500 ISMOD1 = 1,NBSMOD
  1279. c
  1280. CcccccC ouverture du sous modele
  1281. IMODEL = MMODE1.KMODEL(ISMOD1)
  1282. segact IMODEL*mod
  1283. IPT4 = IMODEL.IMAMOD
  1284. SEGACT IPT4
  1285. NBNN4 = IPT4.NUM(/1)
  1286. NBEL4 = IPT4.NUM(/2)
  1287. c on travaille seulement si EF XFEM
  1288. if(NEFMOD.ne.263.and.NEFMOD.ne.264) goto 500
  1289.  
  1290.  
  1291. C=======================================================
  1292. c 5EME BOUCLE SUR LES ELEMENTS
  1293. C pour attribuer un enrichissement aux hanging nodes non enrichis
  1294. c dont les sure vont etre enrichis
  1295. C=======================================================
  1296.  
  1297. segact,MCHAM2
  1298. c on evite d'ouvrir les MELVA2 pour chaque element
  1299. c DO I2ENR=1,N2ENR
  1300. c MELVA2 = MCHAM2.IELVAL(I2ENR)
  1301. c if(MELVA2.ne.0) segact,MELVA2*mod
  1302. c ENDDO
  1303. segact,MPOVA1,MPOVA2
  1304.  
  1305. c++++++ Debut de boucle sur les elements
  1306. DO 600 J=1,NBEL4
  1307. c pour eviter de creer bcp de listreels on utilise l astuce :
  1308. mphi =0
  1309. mpsiph=0
  1310.  
  1311. c++++++++ Boucle sur les noeuds de l element j
  1312. DO 610 K=1,NBNN4
  1313.  
  1314. C Kieme noeud du Jieme element a pour numero INUM
  1315. INUM = IPT4.NUM(K,J)
  1316. if (INUM.EQ.132) then
  1317. endif
  1318.  
  1319. c on saute les noeuds qui ne nous interessent pas
  1320. if((ITYPND(INUM)).le.200) goto 610
  1321.  
  1322. Ccccccccccc noeud H-enrichi
  1323. if ((ITYPND(INUM)).eq.201) GOTO 611
  1324. if ((ITYPND(INUM)).eq.301) GOTO 611
  1325. if ((ITYPND(INUM)).eq.302) GOTO 611
  1326. if ((ITYPND(INUM)).eq.2201) GOTO 611
  1327. if ((ITYPND(INUM)).eq.2302) GOTO 611
  1328. if ((ITYPND(INUM)).eq.20201) GOTO 611
  1329. if ((ITYPND(INUM)).eq.20301) GOTO 611
  1330. if ((ITYPND(INUM)).eq.22201) GOTO 611
  1331. GOTO 612
  1332. 611 CONTINUE
  1333. MELVA2 = MCHAM2.IELVAL(1)
  1334. segact,MELVA2*mod
  1335. MLREE1 = MELVA2.IELCHE(K,J)
  1336.  
  1337. c on H-enrichit ssi ce noeud n etait pas deja H-enrichi
  1338. if (MLREE1.eq.0) then
  1339. if (mphi.ne.0) then
  1340. MELVA2.IELCHE(K,J) = mphi
  1341. else
  1342. JG = NBNN1
  1343. segini,MLREE2
  1344. MELVA2.IELCHE(K,J) = MLREE2
  1345. c on remplit la listreel des valeurs de PHI aux noeuds de l element
  1346. do inode=1,NBNN1
  1347. INUM2 = IPT4.NUM(inode,J)
  1348. I2 = NDPT2(INUM2)
  1349. MLREE2.PROG(inode) = MPOVA2.VPOCHA(I2,1)
  1350. enddo
  1351. mphi=MLREE2
  1352. endif
  1353. endif
  1354. Ccccccccccc fin des noeud H-enrichi
  1355.  
  1356. 612 CONTINUE
  1357. Ccccccccccc noeud F1-enrichi
  1358. if ((ITYPND(INUM)).eq.2001) GOTO 613
  1359. if ((ITYPND(INUM)).eq.2010) GOTO 613
  1360. if ((ITYPND(INUM)).eq.2102) GOTO 613
  1361. if ((ITYPND(INUM)).eq.2201) GOTO 613
  1362. if ((ITYPND(INUM)).eq.2302) GOTO 613
  1363. if ((ITYPND(INUM)).eq.22001) GOTO 613
  1364. if ((ITYPND(INUM)).eq.22010) GOTO 613
  1365. if ((ITYPND(INUM)).eq.22201) GOTO 613
  1366. goto 614
  1367. 613 CONTINUE
  1368. MELVA2 = MCHAM2.IELVAL(2)
  1369. segact,MELVA2*mod
  1370.  
  1371. if (mpsiph.ne.0) then
  1372. MELVA2.IELCHE(K,J) = mpsiph
  1373. else
  1374.  
  1375. NBLV7=2
  1376. JG = NBLV7*NBNN1
  1377. segini,MLREE2
  1378. MELVA2.IELCHE(K,J) = MLREE2
  1379. c on remplit la listreel des valeurs de PSI et PHI
  1380. do inode=1,NBNN4
  1381. INUM2 = IPT4.NUM(inode,J)
  1382. I1 = NDPT1(INUM2)
  1383. I2 = NDPT2(INUM2)
  1384. MLREE2.PROG(inode) = MPOVA1.VPOCHA(I1,1)
  1385. MLREE2.PROG(NBNN1+inode) = MPOVA2.VPOCHA(I2,1)
  1386. enddo
  1387. mpsiph=MLREE2
  1388. endif
  1389.  
  1390. Ccccccccccc fin des noeud F1-enrichi
  1391. 614 CONTINUE
  1392.  
  1393. Ccccccccccc noeud F2-enrichi
  1394. if ((ITYPND(INUM)).eq.20001) GOTO 615
  1395. if ((ITYPND(INUM)).eq.20010) GOTO 615
  1396. if ((ITYPND(INUM)).eq.20101) GOTO 615
  1397. if ((ITYPND(INUM)).eq.20201) GOTO 615
  1398. if ((ITYPND(INUM)).eq.20301) GOTO 615
  1399. if ((ITYPND(INUM)).eq.22001) GOTO 615
  1400. if ((ITYPND(INUM)).eq.22010) GOTO 615
  1401. if ((ITYPND(INUM)).eq.22201) GOTO 615
  1402. goto 610
  1403. 615 CONTINUE
  1404. MELVA2 = MCHAM2.IELVAL(3)
  1405. segact,MELVA2*mod
  1406.  
  1407. if (mpsiph.ne.0) then
  1408. MELVA2.IELCHE(K,J) = mpsiph
  1409. else
  1410. NBLV7=2
  1411. JG = NBLV7*NBNN1
  1412. segini,MLREE2
  1413. MELVA2.IELCHE(K,J) = MLREE2
  1414. c on remplit la listreel des valeurs de PSI et PHI
  1415. do inode=1,NBNN1
  1416. INUM2 = IPT4.NUM(inode,J)
  1417. I1 = NDPT1(INUM2)
  1418. I2 = NDPT2(INUM2)
  1419. MLREE2.PROG(inode) = MPOVA1.VPOCHA(I1,1)
  1420. MLREE2.PROG(NBNN1+inode) = MPOVA2.VPOCHA(I2,1)
  1421. enddo
  1422. mpsiph=MLREE2
  1423. endif
  1424. Ccccccccccc fin du cas noeud F2-enrichi
  1425. 610 CONTINUE
  1426. 600 CONTINUE
  1427. c++++++++ Fin de Boucle sur les noeuds de l element j
  1428. 500 CONTINUE
  1429. c fin de la boucle sur les sous modeles
  1430.  
  1431.  
  1432. 999 CONTINUE
  1433.  
  1434. C=======================================================================
  1435. c MENAGE
  1436. C=======================================================================
  1437. if(NDPT1.ne.0) then
  1438. if(NDPT1.ne.NDPT2.and.NDPT2.ne.0) SEGSUP,NDPT2
  1439. SEGSUP,NDPT1
  1440. endif
  1441. SEGSUP,ITYPND
  1442.  
  1443. C=======================================================================
  1444. c ECRITURE DES RESULTATS DE L'OPERATEUR
  1445. C=======================================================================
  1446. IF(ISYNTAX.EQ.1) THEN
  1447. if(IPRIG2.ne.0) CALL ECROBJ('RIGIDITE',IPRIG2)
  1448. CALL ACTOBJ('MCHAML ',MCHEX2,1)
  1449. CALL ECROBJ('MCHAML ',MCHEX2)
  1450. ENDIF
  1451. c rem : pour la SYNTAXE 2, c'est une directive --> rien a faire
  1452.  
  1453. END
  1454.  
  1455.  
  1456.  
  1457.  
  1458.  
  1459.  
  1460.  
  1461.  
  1462.  
  1463.  
  1464.  

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