Télécharger raff.eso

Retour à la liste

Numérotation des lignes :

raff
  1. C RAFF SOURCE OF166741 26/04/22 21:15:02 12520
  2. SUBROUTINE RAFF
  3. C----------------------------------------------------------------------C
  4. C Operateur RAFF C
  5. C----------------------------------------------------------------------C
  6. C
  7. C Syntaxe 1 : GEO2 = RAFF GEO1 CHPO1 ;
  8. C
  9. C Syntaxe 2 : LRE2 = RAFF LRE1 ENT1 ;
  10. C
  11. C----------------------------------------------------------------------C
  12. IMPLICIT REAL*8(A-H,O-Z)
  13. IMPLICIT INTEGER(I-N)
  14.  
  15. -INC PPARAM
  16. -INC CCOPTIO
  17. -INC CCGEOME
  18. c-INC CCREEL
  19.  
  20. -INC SMCOORD
  21. -INC SMELEME
  22. -INC SMCHPOI
  23. -INC SMMODEL
  24. -INC SMCHAML
  25.  
  26. INTEGER MCOL,NCOL
  27. C--------------------------------
  28. C B) VARIABLES RELATIVES A LA 2D !
  29. C--------------------------------
  30. SEGMENT KARETE(NBNDS,NCOL)
  31. SEGMENT KARET2(NBNDS,NCOL)
  32. SEGMENT KMILIE(NBNDS,NCOL)
  33. SEGMENT KARPOS(NBNDS)
  34. C
  35. C--------------------------------
  36. C C) VARIABLES RELATIVES A LA 3D !
  37. C--------------------------------
  38. SEGMENT IRELA(NBNDS)
  39. SEGMENT JPLANS(JPLA1,JPLA2)
  40. SEGMENT JPLAN2(JPLA1,JPLA2)
  41. SEGMENT JPLAN3(JPLA1,JPLA2)
  42. SEGMENT JPLCOM(JPLA1)
  43. SEGMENT JNOEFA(JNBFA,5)
  44. SEGMENT IWORK2(JNBSOM)
  45. SEGMENT JFARAF(JNBFA,LLLL)
  46. SEGMENT IWORK1(IJKLMN)
  47. C--------------------------
  48. C A) VARIABLES 'GENERALES' !
  49. C--------------------------
  50. SEGMENT ICPR(nbpts,2)
  51. SEGMENT LTYPE(NBLIS,2)
  52. SEGMENT LTYPE2(NBLIS2,4)
  53. SEGMENT LTYPE3(NBLIS3,2)
  54. SEGMENT LTYPE4(NBLIS3,2)
  55. SEGMENT IDENSI
  56. REAL*8 DENSI(NBNDS)
  57. ENDSEGMENT
  58. SEGMENT XDEN(nbpts)
  59. XPETI= 1E-30
  60. C
  61. C---------------------------------------------------
  62. C D) VARIABLES RELATIVES AUX MAILLAGES DE RELATIONS !
  63. C---------------------------------------------------
  64. POINTEUR IPT10.MELEME
  65. POINTEUR IPT11.MELEME
  66. POINTEUR IPT12.MELEME
  67. POINTEUR IPT13.MELEME
  68.  
  69. POINTEUR IPT14.MELEME
  70. POINTEUR IPT15.MELEME
  71. POINTEUR IPT16.MELEME
  72. SEGMENT MAIREL(NBMAIL)
  73. C=======================================================================
  74. C Lecture des donnees utilisateurs
  75. C=======================================================================
  76. C
  77. C SYNTAXE 2 : cas du LISTREEL
  78. C ---------------------------
  79. CALL LIROBJ('LISTREEL',ILRE1,0,IRETOU)
  80. IF (IERR.NE.0) RETURN
  81. C
  82. IF (IRETOU.NE.0) THEN
  83. ICAS = 0
  84. CALL LIRENT(KR1,0,IRETOU)
  85. IF (IERR.NE.0) RETURN
  86. IF (IRETOU.EQ.0) THEN
  87. CALL LIRREE(XR1,1,IRETOU)
  88. IF (IERR.NE.0) RETURN
  89. ICAS = 2
  90. ELSE
  91. ICAS = 1
  92. ENDIF
  93. CALL RAFLRE(ILRE1,KR1,XR1,ICAS,ILRE2)
  94. IF (IERR.NE.0) RETURN
  95. IF (ILRE2.NE.0) THEN
  96. CALL ECROBJ('LISTREEL',ILRE2)
  97. ELSE
  98. CALL ERREUR(5)
  99. ENDIF
  100. RETURN
  101. ENDIF
  102.  
  103. C SYNTAXE 1 : cas du MAILLAGE
  104. C ---------------------------
  105. C On lit le maillage a raffiner et le champoint de densite a affecter
  106. c ipt1 : maillage initial a raffiner
  107. c mchpo1 : chpoint de densite voulu (qui devrait etre defini sur ipt1)
  108. CALL LIROBJ('MAILLAGE',IPT1,1,IRETOU)
  109. CALL ACTOBJ('MAILLAGE',IPT1,1)
  110. IF (IERR.NE.0) RETURN
  111. CALL LIROBJ('CHPOINT',MCHPO1,1,IRETOU)
  112. CALL ACTOBJ('CHPOINT',MCHPO1,1)
  113. IF (IERR.NE.0) RETURN
  114.  
  115. C=======================================================================
  116. C Initialisations - Declarations
  117. C=======================================================================
  118. NCOL=0
  119. MCOL=0
  120. NBOUCL=0
  121. NPTINI=nbpts
  122.  
  123. IJKLMN=4
  124. SEGINI IWORK1
  125. IWORK1(1)=4
  126. IWORK1(2)=8
  127. IWORK1(3)=6
  128. IWORK1(4)=10
  129.  
  130. SEGINI,XDEN
  131.  
  132. C=======================================================================
  133. C Tests sur les donnees
  134. C=======================================================================
  135. C On teste pour savoir si le maillage IPT1 (maillage 1) a un type
  136. C d'elements implemente.
  137. c TRI3 TRI6 QUA4 QUA8 CUB8 CUB26 PRY6 PR15 TET4 TET10 SURE
  138. C les pyramides 5 et 13 ont été débranchés
  139. c creation du tableau
  140. NBSOU1 = IPT1.LISOUS(/1)
  141. NBLIS = MAX(1,NBSOU1)
  142. NSURE=0
  143. SEGINI LTYPE
  144. IPT2=IPT1
  145. DO 1 INB=1,NBLIS
  146. IF (NBSOU1.NE.0) IPT2=IPT1.LISOUS(INB)
  147. NT=IPT2.ITYPEL
  148. IF (NT.EQ.48) NSURE=NSURE+1
  149. LTYPE(INB,1)=INB
  150. LTYPE(INB,2)=NT
  151. IF (NT.EQ.16) THEN
  152. write (*,*) 'Attention le raffinement PRI6 a debrancher !'
  153. ENDIF
  154. IF (NT.EQ.23) THEN
  155. write (*,*) 'Attention le raffinement TET4 a debrancher !'
  156. ENDIF
  157. IF ((NT.NE.4).AND.(NT.NE.6).AND.(NT.NE.8).AND.(NT.NE.10).AND.
  158. + (NT.NE.14).AND.(NT.NE.15).AND.(NT.NE.16).AND.(NT.NE.17).AND.
  159. + (NT.NE.23).AND.(NT.NE.24).AND.(NT.NE.48)) THEN
  160. WRITE(*,*) 'Erreur, type d element non pris en compte'
  161. RETURN
  162. ENDIF
  163. c write(*,*) 'type d elem du maillage de depart', LTYPE(INB,1),
  164. c + LTYPE(INB,2)
  165.  
  166. C IF ((NT.NE.4).AND.(NT.NE.6).AND.(NT.NE.8).AND.(NT.NE.10).AND.
  167. C + (NT.NE.14).AND.(NT.NE.15).AND.(NT.NE.16).AND.(NT.NE.17).AND.
  168. C + (NT.NE.23).AND.(NT.NE.24).AND.(NT.NE.48).AND.(NT.NE.25).AND.
  169. C + (NT.NE.26)) RETURN
  170. IF ((NBSOU1.EQ.0).AND.(NT.EQ.48)) RETURN
  171. 1 CONTINUE
  172.  
  173. C=======================================================================
  174. C Separation du maillage initial
  175. C=======================================================================
  176. C Si le maillage initial comporte des lisous de type 48, on le separe
  177. C en deux maillages dont un ne sera compose que des lisous de type 48.
  178. C Maillage d'elements de type 48 : IPT6
  179. C Maillage sans elements de type 48 : IPT5
  180. C IPT1 reste le maillage initial complet
  181. LCONF2=0
  182. IF (NSURE.EQ.0) GOTO 7
  183. LCONF2=1
  184. 7 CONTINUE
  185. C-------------------------------
  186. C A) Creation du maillage IPT6 !
  187. C-------------------------------
  188. C A.1/** Cas ou il n'y a qu'un lisous de type 48
  189. IF (NSURE.EQ.1) THEN
  190. DO 2 K=1,LTYPE(/1)
  191. IF (LTYPE(K,2).EQ.48) IPT6=IPT1.LISOUS(LTYPE(K,1))
  192. 2 CONTINUE
  193. ENDIF
  194. C
  195. C A.2/** Cas ou il y a plusieurs lisous de type 48
  196. IF (NSURE.GT.1) THEN
  197. NBREF=0
  198. NBSOUS=NSURE
  199. NBNN=0
  200. NBELEM=0
  201. SEGINI IPT6
  202. KLISOU=0
  203. DO 3 K=1,LTYPE(/1)
  204. IF (LTYPE(K,2).EQ.48) THEN
  205. KLISOU=KLISOU+1
  206. IPT6.LISOUS(KLISOU)=IPT1.LISOUS(LTYPE(K,1))
  207. ENDIF
  208. 3 CONTINUE
  209. ENDIF
  210. IF (NSURE.EQ.0) THEN
  211. NBREF=0
  212. NBSOUS=NSURE
  213. NBNN=0
  214. NBELEM=0
  215. SEGINI IPT6
  216. ENDIF
  217. C
  218. C------------------------------
  219. C B) Creation de IPT5 !
  220. C------------------------------
  221. C
  222. NBSOUS=LTYPE(/1)-NSURE
  223. NBREF=0
  224. NBNN=0
  225. NBELEM=0
  226. C B.0/** Cas ou il n'y a qu'un lisous en tout
  227. IF ((NBSOUS.EQ.1).AND.(NSURE.EQ.0)) THEN
  228. IPT5=IPT1
  229. ENDIF
  230. C B.1/** Cas ou il n'y a qu'un lisous de type different de 48
  231. IF ((NBSOUS.EQ.1).AND.(NSURE.NE.0)) THEN
  232. DO 4 K=1,LTYPE(/1)
  233. IF (LTYPE(K,2).NE.48) IPT5=IPT1.LISOUS(LTYPE(K,1))
  234. 4 CONTINUE
  235. ENDIF
  236. C
  237. C B.2/** Cas ou il y a plusieurs lisous de types differents de 48
  238. IF (NBSOUS.GT.1) THEN
  239. SEGINI IPT5
  240. KLISOU=0
  241. DO 5 K=1,LTYPE(/1)
  242. IF (LTYPE(K,2).NE.48) THEN
  243. KLISOU=KLISOU+1
  244. IPT5.LISOUS(KLISOU)=IPT1.LISOUS(LTYPE(K,1))
  245. ENDIF
  246. 5 CONTINUE
  247. ENDIF
  248.  
  249. c compteur de relaton globale
  250. LCONF3=LCONF2
  251. C=======================================================================
  252. C Debut de la boucle sur les itérations de Raffinement
  253. C=======================================================================
  254. 9 CONTINUE
  255.  
  256. c write(*,*) 'RAFF: ITERATION boucle 9',NBOUCL
  257. c write(*,*) 'ipt5 : ', ipt5
  258. c write(*,*) 'ipt6 : ', ipt6
  259. c write(*,*) 'lconf3 : ', lconf3
  260. C
  261. C=======================================================================
  262. C Renumerotation locale des noeuds du maillage
  263. C=======================================================================
  264. C ICPR(I,1)=J : Le Ieme noeud global est le Jeme local
  265. C ICPR(I,2)=J : Le Ieme noeud global appartient a J elements
  266.  
  267. c* SEGACT IPT5
  268.  
  269. NBOUCL=NBOUCL+1
  270. SEGINI ICPR
  271. NBNDS=0
  272. NCOL=0
  273. NBS5 = IPT5.LISOUS(/1)
  274. IPT2=IPT5
  275. DO 11 INB=1,MAX(1,NBS5)
  276. IF (NBS5.NE.0) THEN
  277. IPT2=IPT5.LISOUS(INB)
  278. c* SEGACT IPT2
  279. ENDIF
  280. IF (IPT2.ITYPEL.EQ.48) GOTO 11
  281. DO 10 J=1,IPT2.NUM(/2)
  282. DO 110 I=1,IPT2.NUM(/1)
  283. ITMP=IPT2.NUM(I,J)
  284. IF (ICPR(ITMP,1).NE.0) THEN
  285. ICPR(ITMP,2)=ICPR(ITMP,2)+1
  286. NCOL=MAX(NCOL,ICPR(ITMP,2))
  287. ELSE
  288. NBNDS=NBNDS+1
  289. ICPR(ITMP,1)=NBNDS
  290. ICPR(ITMP,2)=1
  291. NCOL=MAX(NCOL,ICPR(ITMP,2))
  292. ENDIF
  293. 110 CONTINUE
  294. 10 CONTINUE
  295. 11 CONTINUE
  296. IF (IDIM.EQ.2) NCOL=NCOL*2
  297. IF (IDIM.EQ.3) NCOL=NCOL*4
  298.  
  299. C=======================================================================
  300. C Prise en compte des noeuds de relations
  301. C=======================================================================
  302. C IRELA(I,1) = 1 si le noeud I (en numerotation locale) est un noeud
  303. C de relation ("hanging node")
  304. C IRELA(I,1) = 0 sinon
  305. SEGINI IRELA
  306. IF (LCONF3.EQ.0) GOTO 1200
  307. SEGACT IPT6
  308. DO 1218 LAA=1,MAX(1,IPT6.LISOUS(/1))
  309. IF (IPT6.LISOUS(/1).EQ.0) THEN
  310. IPT2=IPT6
  311. ELSE
  312. IPT2=IPT6.LISOUS(LAA)
  313. ENDIF
  314. SEGACT IPT2
  315. IF (IPT2.ITYPEL.NE.48) GOTO 1218
  316. DO 1220 J=1,IPT2.NUM(/2)
  317. IRELA(ICPR(IPT2.NUM(1,J),1))=1
  318. 1220 CONTINUE
  319. 1218 CONTINUE
  320. 1200 CONTINUE
  321.  
  322. C
  323. C=======================================================================
  324. C Prise en compte du champoint de densite
  325. C=======================================================================
  326. C On affecte une densite a chacun des noeuds du maillage. On calcule
  327. C cette densite a partir des densites existantes dans le champoint, a
  328. C l'aide de la fonction RAFDEN.
  329. C Remarque : on ne prend pas en compte les densites qui pourraient
  330. C exister dans le tableau XCOOR.
  331.  
  332. C------------------------------------------
  333. C A) Recuperation des valeurs du champoint !
  334. C------------------------------------------
  335. C XDEN(I,1) = densite affectee au noeud I (en numerotation globale)
  336. IF (NBOUCL.EQ.1) THEN
  337. SEGACT MCHPO1
  338. IF (MCHPO1.IPCHP(/1).NE.1) RETURN
  339. MSOUPO=MCHPO1.IPCHP(1)
  340. SEGACT MSOUPO
  341. IPT3=IGEOC
  342. MPOVA1=IPOVAL
  343. SEGACT IPT3
  344. SEGACT MPOVA1
  345. IF (MPOVA1.VPOCHA(/2).NE.1) RETURN
  346. NBPTCH=IPT3.NUM(/2)
  347. c SEGINI ICHPO
  348. DO 13 I=1,NBPTCH
  349. J=IPT3.NUM(1,I)
  350. c XR(I)=XCOOR((J-1)*(IDIM+1)+1)
  351. c YR(I)=XCOOR((J-1)*(IDIM+1)+2)
  352. c IF (IDIM.EQ.3) ZR(I)=XCOOR((J-1)*(IDIM+1)+3)
  353. c DEN(I)=MPOVA1.VPOCHA(I,1)
  354. c if(J.eq.115.or.J.eq.321.or.
  355. c . J.eq.6261.or.J.eq.5815) then
  356. C write(*,*) 'RAFF: #',J,'DEN(',I,'/',NBPTCH,')=',DEN(I)
  357. c endif
  358. XDEN(J)=MPOVA1.VPOCHA(I,1)
  359. 13 CONTINUE
  360. C Rem ;seulement pour les noeud "peres",
  361. C pour les "fils" raff2d remplit XDEN
  362. ENDIF
  363. C
  364. C--------------------------------------------------------------
  365. C B) Affectation d'une densite a chacun des noeuds du maillage !
  366. C--------------------------------------------------------------
  367. C IDENSI(I,1) = densite affectee au noeud I (en numerotation locale)
  368. SEGINI IDENSI
  369. DO 15 INB=1,MAX(1,IPT5.LISOUS(/1))
  370. IF (IPT5.LISOUS(/1).EQ.0) THEN
  371. IPT2=IPT5
  372. ELSE
  373. IPT2=IPT5.LISOUS(INB)
  374. SEGACT IPT2
  375. ENDIF
  376. c write(*,*) 'ipt2 : ', ipt2, 'type', IPT2.ITYPEL
  377. c write(*,*) IPT2.NUM(/2), IPT2.NUM(/1)
  378. c IF (IPT2.ITYPEL.EQ.48) GOTO 15
  379. DO 14 J=1,IPT2.NUM(/2)
  380. DO 114 I=1,IPT2.NUM(/1)
  381. NGLOB=IPT2.NUM(I,J)
  382. NLOC=ICPR(NGLOB,1)
  383. c XPT=XCOOR((NGLOB-1)*(IDIM+1)+1)
  384. c YPT=XCOOR((NGLOB-1)*(IDIM+1)+2)
  385. c ZPT=0
  386. c IF (IDIM.EQ.3) ZPT=XCOOR((NGLOB-1)*(IDIM+1)+3)
  387. c CALL RAFDEN(ICHPO,XPT,YPT,ZPT,IDIM,DENPT)
  388. c DENSI(NLOC)=DENPT
  389. DENSI(NLOC)=XDEN(NGLOB)
  390. c WRITE (*,*) 'densite au pt', NGLOB, XDEN(NGLOB), XPETI
  391. IF (XDEN(NGLOB).LT.XPETI) THEN
  392. WRITE (*,*) 'Champ de densité en entrée nul au point',
  393. + NGLOB, 'impossible de raffiner'
  394. RETURN
  395. ENDIF
  396. 114 CONTINUE
  397. 14 CONTINUE
  398. 15 CONTINUE
  399. C
  400. C=======================================================================
  401. C Remplissage du tableau KARETE
  402. C=======================================================================
  403. C On remplit le tableau KARETE avec les donnees provenant de l'analyse
  404. C du maillage.
  405. C KARETE(i,j)=k : le ieme noeud local forme une arete
  406. C avec le keme noeud local (k>i)
  407. C KARPOS(i)=k : compteur de position (k=nb d'aretes touchant i)
  408. C KARET2(i,j)=k : l'arete i-j appartient a k elements
  409. JPLA1=NBNDS
  410. JPLA2=NCOL
  411. SEGINI KARETE,KARPOS,KARET2
  412. NBARET=0
  413. NCOL=1
  414. DO 18 INB=1,MAX(1,IPT5.LISOUS(/1))
  415. IF (IPT5.LISOUS(/1).EQ.0) THEN
  416. IPT2=IPT5
  417. ELSE
  418. IPT2=IPT5.LISOUS(INB)
  419. SEGACT IPT2
  420. ENDIF
  421. c IF (IPT2.ITYPEL.EQ.48) GOTO 18
  422. ILPL=LPL(IPT2.ITYPEL)
  423. ILPT=LPT(IPT2.ITYPEL)
  424. DO 17 J=1,IPT2.NUM(/2)
  425. DO 117 K=1,ILPL*2-1,2
  426. NPTA=IPT2.NUM(KSEGM(ILPT+K-1),J)
  427. NPTB=IPT2.NUM(KSEGM(ILPT+K),J)
  428. NMIN=MIN(ICPR(NPTA,1),ICPR(NPTB,1))
  429. NMAX=MAX(ICPR(NPTA,1),ICPR(NPTB,1))
  430. NEXIST=0
  431. DO 16 I=1,MAX(1,KARPOS(NMIN))
  432. IF (KARETE(NMIN,I).EQ.NMAX) NEXIST=I
  433. 16 CONTINUE
  434. c création d'une nouvelle arrète
  435. IF (NEXIST.EQ.0) THEN
  436. IF ((KARPOS(NMIN)+1).GT.NCOL) THEN
  437. NCOL=KARPOS(NMIN)+1
  438. SEGADJ KARETE, KARET2
  439. ENDIF
  440. KARPOS(NMIN)=KARPOS(NMIN)+1
  441. KARETE(NMIN,KARPOS(NMIN))=NMAX
  442. KARET2(NMIN,KARPOS(NMIN))=1
  443. NBARET=NBARET+1
  444. c NCOL=MAX(NCOL,KARPOS(NMIN))
  445. ENDIF
  446. IF (NEXIST.NE.0) THEN
  447. KARET2(NMIN,NEXIST)=KARET2(NMIN,NEXIST)+1
  448. ENDIF
  449. 117 CONTINUE
  450. 17 CONTINUE
  451. 18 CONTINUE
  452. c SEGADJ KARETE,KARET2
  453. SEGDES KARETE,KARPOS,KARET2
  454. C
  455. C=======================================================================
  456. C Remplissage des tableaux JPLANS et JNOEFA
  457. C=======================================================================
  458. C On remplit les tableaux de description des faces dans le cas 3D.
  459. C JPLANS(i,j)=k : la jeme face dont le plus petit sommet en
  460. C numerotation locale est le sommet i est la face k
  461. C JNOEFA(i,1-3)=j-k-l : Les 3 plus petits sommets en numerotation
  462. C locale de la face i sont les noeuds j,k et l
  463. C JNOEFA(i,4-5)=j-k : La face identifiee par les 3 sommets precedents
  464. C appartient aux lisous de type j et k
  465. C JPLCOM(i)=k : compteur de position (k=nb de faces touchant i)
  466. IF (IDIM.NE.3) GOTO 40
  467. C----------------------------------------------------
  468. C A) Comptage du nombre d'elements total du maillage !
  469. C----------------------------------------------------
  470. NELTOT=0
  471. DO 50 INB=1,MAX(1,IPT5.LISOUS(/1))
  472. IF (IPT5.LISOUS(/1).EQ.0) THEN
  473. IPT2=IPT5
  474. ELSE
  475. IPT2=IPT5.LISOUS(INB)
  476. SEGACT IPT2
  477. ENDIF
  478. NELTOT=NELTOT+IPT2.NUM(/2)
  479. 50 CONTINUE
  480. C
  481. C-------------------------------------------------
  482. C B) Initialisation des tableaux JPLANS et JNOEFA !
  483. C-------------------------------------------------
  484. JNBFA=NELTOT*6
  485. JMAXPL=0
  486. JNUMFA=0
  487. SEGINI JPLANS,JPLCOM,JNOEFA
  488. C
  489. C-----------------------------------------------
  490. C C) Remplissage des tableaux JPLANS et JNOEFA !
  491. C-----------------------------------------------
  492. DO 51 INB=1,MAX(1,IPT5.LISOUS(/1))
  493. IF (IPT5.LISOUS(/1).EQ.0) THEN
  494. IPT2=IPT5
  495. ELSE
  496. IPT2=IPT5.LISOUS(INB)
  497. c* SEGACT IPT2
  498. ENDIF
  499. JTYP2=IPT2.ITYPEL
  500. C IF (JTYP2.EQ.48) GOTO 51
  501. DO 52 KELEM=1,IPT2.NUM(/2)
  502. JLTEL1=LTEL(1,JTYP2)
  503. JLTEL2=LTEL(2,JTYP2)
  504. DO 53 IBB=1,JLTEL1
  505. JLDEL1=LDEL(1,JLTEL2-1+IBB)
  506. JTYFAC=IWORK1(JLDEL1)
  507. JLDEL2=LDEL(2,JLTEL2-1+IBB)
  508. JNBSOM=NBSOM(JTYFAC)
  509. JSPOS=NSPOS(JTYFAC)
  510. SEGINI IWORK2
  511. DO 54 IAA=1,JNBSOM
  512. NGLOBA=IPT2.NUM(LFAC(JLDEL2-1+IBSOM(JSPOS-1+IAA)),KELEM)
  513. IWORK2(IAA)=NGLOBA
  514. 54 CONTINUE
  515. C
  516. C----------------------------------------------------
  517. C D) Tri des sommets de la face par ordre croissant !
  518. C----------------------------------------------------
  519. C On va ranger les 3 plus petits sommets de la face (en numerotation
  520. C globale) dans les variables NPTA, NPTB, NPTC. On les classe par ordre
  521. C croissant.
  522. C
  523. C 1/ Classement des 3 sommets par ordre croissant (num globale)
  524. NPTA=nbpts+1
  525. NPTB=NPTA+1
  526. NPTC=NPTB+1
  527. DO 55 ICC=1,JNBSOM
  528. IF (IWORK2(ICC).LT.NPTA) THEN
  529. NPTC=NPTB
  530. NPTB=NPTA
  531. NPTA=IWORK2(ICC)
  532. ELSEIF (IWORK2(ICC).LT.NPTB) THEN
  533. NPTC=NPTB
  534. NPTB=IWORK2(ICC)
  535. ELSEIF (IWORK2(ICC).LT.NPTC) THEN
  536. NPTC=IWORK2(ICC)
  537. ENDIF
  538. 55 CONTINUE
  539. C
  540. C 2/ Classement des 3 sommets par ordre croissant (num locale)
  541. NPTA2=ICPR(NPTA,1)
  542. NPTB2=ICPR(NPTB,1)
  543. NPTC2=ICPR(NPTC,1)
  544. IF ((NPTA2.LT.NPTB2).AND.(NPTA2.LT.NPTC2)) THEN
  545. NPTA=NPTA2
  546. NPTB=MIN(NPTB2,NPTC2)
  547. NPTC=MAX(NPTB2,NPTC2)
  548. ENDIF
  549. IF ((NPTB2.LT.NPTA2).AND.(NPTB2.LT.NPTC2)) THEN
  550. NPTA=NPTB2
  551. NPTB=MIN(NPTA2,NPTC2)
  552. NPTC=MAX(NPTA2,NPTC2)
  553. ENDIF
  554. IF ((NPTC2.LT.NPTA2).AND.(NPTC2.LT.NPTB2)) THEN
  555. NPTA=NPTC2
  556. NPTB=MIN(NPTA2,NPTB2)
  557. NPTC=MAX(NPTA2,NPTB2)
  558. ENDIF
  559. C
  560. C----------------------------------------
  561. C E) Renseignement des nouvelles faces !
  562. C----------------------------------------
  563. SEGACT LTYPE
  564. c IHERED=0
  565. c DO 1022 MOI=1,IPT2.NUM(/1)
  566. c IHERED=IHERED+IRELA(ICPR(IPT2.NUM(MOI,KELEM),1))
  567. c 1022 CONTINUE
  568.  
  569. C Si NPTA Ne correspond a aucune face : On cree une face
  570. IF (JPLCOM(NPTA).EQ.0) THEN
  571. JNUMFA=JNUMFA+1
  572. JPLCOM(NPTA)=JPLCOM(NPTA)+1
  573. JPLANS(NPTA,JPLCOM(NPTA))=JNUMFA
  574. JNOEFA(JNUMFA,1)=NPTA
  575. JNOEFA(JNUMFA,2)=NPTB
  576. JNOEFA(JNUMFA,3)=NPTC
  577. JNOEFA(JNUMFA,4)=LTYPE(INB,2)
  578. c IF (IHERED.NE.0) JNOEFA(JNUMFA,5)=LTYPE(INB,2)
  579. C On signale les sous face de faces supportant un sure
  580. C JNOEFA(JNUMFA,5)= 48
  581. IF (LCONF3.NE.0) THEN
  582. SEGACT IPT6
  583. DO 501 LAA1=1,MAX(1,IPT6.LISOUS(/1))
  584. IF (IPT6.LISOUS(/1).EQ.0) THEN
  585. IPT4=IPT6
  586. ELSE
  587. IPT4=IPT6.LISOUS(LAA1)
  588. ENDIF
  589. SEGACT IPT4
  590. IF (IPT4.ITYPEL.NE.48) GOTO 501
  591. IF (IPT4.ICOLOR(1).NE.3) GOTO 501
  592. DO 502,MAA1=1,IPT4.NUM(/2)
  593. NEXI1=0
  594. NEXI2=0
  595. DO 503 ICC1=1,JNBSOM
  596. IF (IWORK2(ICC1).EQ.IPT4.NUM(1, MAA1)) THEN
  597. NEXI1=NEXI1+1
  598. ENDIF
  599. 503 CONTINUE
  600. IF (NEXI1.GT.0) THEN
  601. DO 504 ICC2=1,JNBSOM
  602. DO 1504 INN2=2,IPT4.NUM(/1)
  603. IF (IWORK2(ICC2).EQ.IPT4.NUM(INN2,MAA1)) THEN
  604. NEXI2=NEXI2+1
  605. ENDIF
  606. 1504 CONTINUE
  607. 504 CONTINUE
  608. IF (NEXI2.GT.0) JNOEFA(JNUMFA,5)= 48
  609. ENDIF
  610. 502 CONTINUE
  611. 501 CONTINUE
  612. ENDIF
  613.  
  614.  
  615. C Si NPTA correspond a aumoins une face
  616. ELSE
  617. NEXIST=0
  618. DO 56 IDD=1,JPLCOM(NPTA)
  619. ITEMP1=JPLANS(NPTA,IDD)
  620. NAA=JNOEFA(ITEMP1,1)
  621. NBB=JNOEFA(ITEMP1,2)
  622. NCC=JNOEFA(ITEMP1,3)
  623. C Si la face que actuelle existe déja : on renseigne JNOEFA(NEXIST,5)
  624. IF (NAA.EQ.NPTA.AND.NBB.EQ.NPTB.AND.NCC.EQ.NPTC) THEN
  625. NEXIST=ITEMP1
  626. JNOEFA(NEXIST,5)=LTYPE(INB,2)
  627. ENDIF
  628.  
  629.  
  630. 56 CONTINUE
  631. C Si la face que actuelle n'existe pas : On cree une face
  632. IF (NEXIST.EQ.0) THEN
  633. JNUMFA=JNUMFA+1
  634. JPLCOM(NPTA)=JPLCOM(NPTA)+1
  635. JPLANS(NPTA,JPLCOM(NPTA))=JNUMFA
  636. JNOEFA(JNUMFA,1)=NPTA
  637. JNOEFA(JNUMFA,2)=NPTB
  638. JNOEFA(JNUMFA,3)=NPTC
  639. JNOEFA(JNUMFA,4)=LTYPE(INB,2)
  640. c IF (IHERED.NE.0) JNOEFA(JNUMFA,5)=LTYPE(INB,2)
  641.  
  642. C On signale les sous face de faces supportant un sure
  643. C JNOEFA(JNUMFA,5)= 48
  644. IF (LCONF3.NE.0) THEN
  645. SEGACT IPT6
  646. DO 505 LAA1=1,MAX(1,IPT6.LISOUS(/1))
  647. IF (IPT6.LISOUS(/1).EQ.0) THEN
  648. IPT4=IPT6
  649. ELSE
  650. IPT4=IPT6.LISOUS(LAA1)
  651. ENDIF
  652. SEGACT IPT4
  653. IF (IPT4.ITYPEL.NE.48) GOTO 505
  654. IF (IPT4.ICOLOR(1).NE.3) GOTO 505
  655. DO 506,MAA1=1,IPT4.NUM(/2)
  656. NEXI1=0
  657. NEXI2=0
  658. DO 507 ICC1=1,JNBSOM
  659. IF (IWORK2(ICC1).EQ.IPT4.NUM(1, MAA1)) THEN
  660. NEXI1=NEXI1+1
  661. ENDIF
  662. 507 CONTINUE
  663. IF (NEXI1.GT.0) THEN
  664. DO 508 ICC2=1,JNBSOM
  665. DO 1508 INN2=2,IPT4.NUM(/1)
  666. IF (IWORK2(ICC2).EQ.IPT4.NUM(INN2,MAA1)) THEN
  667. NEXI2=NEXI2+1
  668. ENDIF
  669. 1508 CONTINUE
  670. 508 CONTINUE
  671. IF (NEXI2.GT.0) JNOEFA(JNUMFA,5)= 48
  672. ENDIF
  673. 506 CONTINUE
  674. 505 CONTINUE
  675. ENDIF
  676. ENDIF
  677. ENDIF
  678.  
  679. JMAXPL=MAX(JMAXPL,JPLCOM(NPTA))
  680. 53 CONTINUE
  681. 52 CONTINUE
  682. 51 CONTINUE
  683. JPLA2=JMAXPL
  684. JNBFA=JNUMFA
  685. SEGADJ JPLANS,JPLCOM,JNOEFA
  686. SEGDES LTYPE
  687. C
  688. C=======================================================================
  689. C Pre-remplissage du tableau KMILIE
  690. C=======================================================================
  691. C On remplit le tableau lorsqu'il y a des maillages de relations de
  692. C type 48 (IPT6, LCONF3 non nul)
  693. C KARETE(i,j)=k ET KMILIE(i,j)=n : le noeud global n est situe
  694. C au milieu de l'arete [i,k]
  695. 40 CONTINUE
  696. SEGINI KMILIE
  697. SEGACT KARETE*MOD,KARPOS*MOD,KARET2*MOD
  698. IF (LCONF3.EQ.0) THEN
  699. GOTO 28
  700. ENDIF
  701. 22 CONTINUE
  702. NBRELA=0
  703. SEGACT IPT6
  704. DO 218 LAA=1,MAX(1,IPT6.LISOUS(/1))
  705. IF (IPT6.LISOUS(/1).EQ.0) THEN
  706. IPT2=IPT6
  707. ELSE
  708. IPT2=IPT6.LISOUS(LAA)
  709. ENDIF
  710. SEGACT IPT2
  711. IF (IPT2.ITYPEL.NE.48) GOTO 218
  712. IF ((IPT2.ICOLOR(1).NE.1).AND.(IPT2.ICOLOR(1).NE.2)) GOTO 218
  713. DO 220 J=1,IPT2.NUM(/2)
  714.  
  715. NPTA=IPT2.NUM(2,J)
  716. NPTB=IPT2.NUM(3,J)
  717. NPTC=IPT2.NUM(1,J)
  718. NMIN=MIN(ICPR(NPTA,1),ICPR(NPTB,1))
  719. NMAX=MAX(ICPR(NPTA,1),ICPR(NPTB,1))
  720. NEXIST=0
  721. DO 219 I=1,MAX(1,KARPOS(NMIN))
  722. IF (KARETE(NMIN,I).EQ.NMAX) NEXIST=I
  723. 219 CONTINUE
  724.  
  725. IF (NEXIST.NE.0) then
  726. KMILIE(NMIN,NEXIST)=NPTC
  727. c WRITE (*,*) 'REPORT ANCIENNE RELA AU NOEUD:', NPTC
  728. c write (*,*) 'karret2(nmin nexist)', KARET2(NMIN,NEXIST)
  729. KARET2(NMIN,NEXIST)=2
  730. ELSE
  731. IF (IDIM.EQ.2) goto 27
  732. IF ((KARPOS(NMIN)+1).GT.NCOL) THEN
  733. NCOL=KARPOS(NMIN)+1
  734. SEGADJ KARETE, KARET2, KMILIE
  735. ENDIF
  736. JPOSI = KARPOS(NMIN)
  737. KARPOS(NMIN)=JPOSI+1
  738. KARETE(NMIN,JPOSI+1)=NMAX
  739. KARET2(NMIN,JPOSI+1)=2
  740. KMILIE(NMIN,JPOSI+1)=NPTC
  741. c WRITE (*,*) 'création de l arrete:', NMIN, NMAX
  742. ENDIF
  743. C
  744. C-----------------------------------------------
  745. C Prise en compte des relations "hereditaires" !
  746. C-----------------------------------------------
  747. C Cette partie sert a traiter le cas ou un element serait raffine
  748. C plusieurs fois alors qu'a sa frontiere les autres elements ne le
  749. C seraient pas. Il y aurait donc plusieurs points sur une arete ayant
  750. C des relations de conformite et plus seulement le noeud milieu.
  751. C
  752. c dans l'exenple ci dessous ou les noeuds C et D sont des hanging nodes
  753. c L'arete [C B] n'a pas encore ete creee c'est ce qui est fait ici.
  754. c
  755. c | |
  756. c | |
  757. c |A C D |B
  758. c x---------X----X----X
  759. c | | | |
  760. c | | | |
  761. 27 CONTINUE
  762. IF (IDIM.EQ.2) THEN
  763. C 1/ Test sur la premiere arete : NMIN-NPTC
  764. IF (NEXIST.NE.0) THEN
  765. NEXIS2=0
  766. NMIN2=MIN(NMIN,ICPR(NPTC,1))
  767. NMAX2=MAX(NMIN,ICPR(NPTC,1))
  768. DO 24 I=1,MAX(1,KARPOS(NMIN2))
  769. IF (KARETE(NMIN2,I).EQ.NMAX2) NEXIS2=I
  770. 24 CONTINUE
  771. IF (NEXIS2.EQ.0) THEN
  772. NBRELA=NBRELA+1
  773. JNBCOL=KARETE(/2)
  774. JPOSI=KARPOS(NMIN2)
  775. IF (JNBCOL.GT.JPOSI) THEN
  776. KARPOS(NMIN2)=JPOSI+1
  777. KARETE(NMIN2,JPOSI+1)=NMAX2
  778. KARET2(NMIN2,JPOSI+1)=2
  779. ELSEIF (JNBCOL.EQ.JPOSI) THEN
  780. NCOL=JNBCOL+1
  781. SEGADJ KARETE,KMILIE,KARET2
  782. KARETE(NMIN2,JPOSI+1)=NMAX2
  783. KARPOS(NMIN2)=JPOSI+1
  784. KARET2(NMIN2,JPOSI+1)=2
  785. ENDIF
  786. c WRITE (*,*) 'creation de l arrete:', NMIN2, NMAX2
  787. ELSE
  788. KARET2(NMIN2,NEXIS2)=2
  789. ENDIF
  790. C
  791. C 2/ Test sur la deuxieme arete : NMAX-NPTC
  792. NEXIS2=0
  793. NMIN2=MIN(NMAX,ICPR(NPTC,1))
  794. NMAX2=MAX(NMAX,ICPR(NPTC,1))
  795. DO 25 I=1,MAX(1,KARPOS(NMIN2))
  796. IF (KARETE(NMIN2,I).EQ.NMAX2) NEXIS2=I
  797. 25 CONTINUE
  798. IF (NEXIS2.EQ.0) THEN
  799. NBRELA=NBRELA+1
  800. JNBCOL=KARETE(/2)
  801. JPOSI=KARPOS(NMIN2)
  802. IF (JNBCOL.GT.JPOSI) THEN
  803. KARPOS(NMIN2)=JPOSI+1
  804. KARETE(NMIN2,JPOSI+1)=NMAX2
  805. KARET2(NMIN2,JPOSI+1)=2
  806. ELSEIF (JNBCOL.EQ.JPOSI) THEN
  807. NCOL=JNBCOL+1
  808. SEGADJ KARETE,KMILIE,KARET2
  809. KARETE(NMIN2,JPOSI+1)=NMAX2
  810. KARPOS(NMIN2)=JPOSI+1
  811. KARET2(NMIN2,JPOSI+1)=2
  812. ENDIF
  813. c WRITE(*,*) 'creation de l arrete:', NMIN2, NMAX2
  814. ELSE
  815. KARET2(NMIN2,NEXIS2)=2
  816. ENDIF
  817. ENDIF
  818. ENDIF
  819. 220 CONTINUE
  820. 218 CONTINUE
  821. IF (NBRELA.NE.0) GOTO 22
  822. 28 CONTINUE
  823.  
  824. C=======================================================================
  825. C Pre-remplissage du tableau JFARAF
  826. C=======================================================================
  827. C On remplit le tableau JFARAF et JPLAN3 lorsqu'il y a des maillages de
  828. C relations de type 48 (IPT6, LCONF3 non nul).
  829. c
  830. C Si JPLANS(i,j)=k et JFARAF(k , (l-1)*2+1)= n : le noeud n (en
  831. C numérotation globale) est le hanging node au centre de la jieme face
  832. C dont le plus petit sommet en numerotation locale est le sommet i.
  833. C
  834. C Si de plus la face en question est un TRI6 et JFARAF(k , l*2)=m :
  835. C le noeud m (en numérotation globale) est le 4ieme noeud de l'element
  836. C 48 coul 4
  837. C
  838. C Si de plus la face en question est un QUA8-1 et JFARAF(k , l*2)=m :
  839. C le noeud m (en numérotation globale) est le 5eme noeud de l'element
  840. c 48 coul 4
  841. C
  842. C si JPLAN3(i,j)=k il y a k relation de compatibilité de faces associé a
  843. C la jieme face dont le plus petit sommet en numerotation locale est le
  844. C sommet i.
  845.  
  846. IF (IDIM.NE.3) GOTO 711
  847. JNBFA=JNOEFA(/1)
  848. LLLL=10
  849. SEGINI JFARAF
  850. SEGINI JPLAN2,JPLAN3
  851. IF (LCONF3.EQ.0) GOTO 711
  852. MPOS25=0
  853. JNBSOM=0
  854. 1287 CONTINUE
  855. NBRELA=0
  856. DO 670 MIE=1,MAX(1,IPT6.LISOUS(/1))
  857. IF (IPT6.LISOUS(/1).EQ.0) THEN
  858. IPT2=IPT6
  859. ELSE
  860. IPT2=IPT6.LISOUS(MIE)
  861. ENDIF
  862. SEGACT IPT2
  863. IF (IPT2.ITYPEL.NE.48) GOTO 670
  864. IF ((IPT2.ICOLOR(1).EQ.1).OR.(IPT2.ICOLOR(1).EQ.2)) GOTO 670
  865. LIGNUM=IPT2.NUM(/1)
  866. IF (IPT2.ICOLOR(1).EQ.4) MPOS25=4
  867. IF (IPT2.ICOLOR(1).EQ.5) MPOS25=5
  868. IF (IPT2.ICOLOR(1).EQ.3) JNBSOM=4
  869. IF (IPT2.ICOLOR(1).EQ.4) JNBSOM=3
  870. IF (IPT2.ICOLOR(1).EQ.5) JNBSOM=4
  871. IF (IPT2.ICOLOR(1).EQ.6) JNBSOM=4
  872. SEGINI IWORK2
  873. C
  874. C-------------------------
  875. C A) Recherche de la face !
  876. C-------------------------
  877. C 1/ Classement des 3 sommets par ordre croissant (num globale)
  878. DO 671,MAA=1,IPT2.NUM(/2)
  879. DO 673 MBB=1,JNBSOM
  880. IWORK2(MBB)=IPT2.NUM(LIGNUM-JNBSOM+MBB,MAA)
  881. 673 CONTINUE
  882. NPTA=nbpts+1
  883. NPTB=NPTA+1
  884. NPTC=NPTB+1
  885. DO 672 ICC=1,JNBSOM
  886. IF (IWORK2(ICC).LT.NPTA) THEN
  887. NPTC=NPTB
  888. NPTB=NPTA
  889. NPTA=IWORK2(ICC)
  890. ELSEIF (IWORK2(ICC).LT.NPTB) THEN
  891. NPTC=NPTB
  892. NPTB=IWORK2(ICC)
  893. ELSEIF (IWORK2(ICC).LT.NPTC) THEN
  894. NPTC=IWORK2(ICC)
  895. ENDIF
  896. 672 CONTINUE
  897. C
  898. C 2/ Classement des 3 sommets par ordre croissant (num locale)
  899. NPTA1=NPTA
  900. NPTB1=NPTB
  901. NPTC1=NPTC
  902. NPTA2=ICPR(NPTA,1)
  903. NPTB2=ICPR(NPTB,1)
  904. NPTC2=ICPR(NPTC,1)
  905. IF ((NPTA2.LT.NPTB2).AND.(NPTA2.LT.NPTC2)) THEN
  906. NPTA=NPTA2
  907. NPTB=MIN(NPTB2,NPTC2)
  908. NPTC=MAX(NPTB2,NPTC2)
  909. ENDIF
  910. IF ((NPTB2.LT.NPTA2).AND.(NPTB2.LT.NPTC2)) THEN
  911. NPTA=NPTB2
  912. NPTB=MIN(NPTA2,NPTC2)
  913. NPTC=MAX(NPTA2,NPTC2)
  914. ENDIF
  915. IF ((NPTC2.LT.NPTA2).AND.(NPTC2.LT.NPTB2)) THEN
  916. NPTA=NPTC2
  917. NPTB=MIN(NPTA2,NPTB2)
  918. NPTC=MAX(NPTA2,NPTB2)
  919. ENDIF
  920. C
  921. C 3/ Recherche du numero de la face
  922. NEXIS2=0
  923. DO 674 IEE=1,JPLCOM(NPTA)
  924. MTMP=JPLANS(NPTA,IEE)
  925. JJ1=JNOEFA(MTMP,1)
  926. JJ2=JNOEFA(MTMP,2)
  927. JJ3=JNOEFA(MTMP,3)
  928. IF(JJ1.EQ.NPTA.AND.JJ2.EQ.NPTB.AND.JJ3.EQ.NPTC) THEN
  929. NEXIS2=IEE
  930. ENDIF
  931. 674 CONTINUE
  932. c 3.1/ si la face en question n'existe pas, dans le cas général on
  933. c s'arrète
  934. IF ((NEXIS2.EQ.0).AND.(IPT2.ICOLOR(1).NE.3)) THEN
  935. c WRITE (*,*) 'IPT2.ICOLOR(1)', IPT2.ICOLOR(1)
  936. WRITE (*,*) 'Raffinement impossible, le champ de densite
  937. + presente des variations trop brusques'
  938. WRITE (*,*) 'sure concerne', MAA
  939. WRITE (*,*) 'premier nd du sure concerne', IPT2.NUM(1,MAA)
  940. WRITE (*,*) 'numero du 1er nd de la face concernee', NPTA
  941. KARAF2=0
  942. c GOTO 679
  943. ENDIF
  944. c 3.2/ si la face en question n'existe pas dans le cas d'une relation
  945. c de face QUA4 il suffie de la créer
  946.  
  947. IF ((NEXIS2.EQ.0).AND.(IPT2.ICOLOR(1).EQ.3)) THEN
  948. JPLCOM(NPTA)= JPLCOM(NPTA)+1
  949. JNUMFA=JNUMFA+1
  950. JNUMFS=JNUMFA
  951. JNUMF1=JPLCOM(NPTA)
  952. JMAXPL=MAX(JMAXPL,JPLCOM(NPTA))
  953. c 3.2.1/ ajustement des segments
  954. JPLA2=JMAXPL
  955. JNBFA=JNUMFA
  956. SEGADJ JPLANS
  957. SEGADJ JNOEFA
  958. SEGADJ JPLAN3
  959. SEGADJ JFARAF
  960. C 3.2.1 Renseignement des iformation de la nouvelle face dans JPLANS et
  961. c JNOEFA, initialisation de JPLAN3
  962. JPLANS(NPTA,JNUMF1)=JNUMFA
  963. JPLAN3(NPTA,JNUMF1)=0
  964. JNOEFA(JNUMFA,1)= NPTA
  965. JNOEFA(JNUMFA,2)= NPTB
  966. JNOEFA(JNUMFA,3)= NPTC
  967. JNOEFA(JNUMFA,4)= 48
  968. JNOEFA(JNUMFA,5)= 48
  969. ENDIF
  970.  
  971. IF (NEXIS2.NE.0) THEN
  972. JNUMFS=JPLANS(NPTA,NEXIS2)
  973. ENDIF
  974. C
  975. C 4/ Recherche de la position de la face dans JPLANS
  976. NEXIS2=0
  977. DO 675 MAC=1,JPLCOM(NPTA)
  978. IF (JPLANS(NPTA,MAC).EQ.JNUMFS) NEXIS2=MAC
  979. 675 CONTINUE
  980. C
  981. C-------------------------------------
  982. C B) Renseignement de JFARAF et JPLAN3!
  983. C-------------------------------------
  984.  
  985. JPLAN3(NPTA,NEXIS2)=JPLAN3(NPTA,NEXIS2)+1
  986. LTEMPO=(JPLAN3(NPTA,NEXIS2)-1)*2+1
  987. JFARAF(JNUMFS,LTEMPO)=IPT2.NUM(1,MAA)
  988. IF (MPOS25.NE.0) JFARAF(JNUMFS,LTEMPO+1)=IPT2.NUM(MPOS25,MAA)
  989. IF (JNOEFA(JNUMFS,5).EQ.0) JNOEFA(JNUMFS,5)=48
  990.  
  991.  
  992. 671 CONTINUE
  993. 670 CONTINUE
  994. C IF (NBRELA.NE.0) GOTO 1287
  995. 711 CONTINUE
  996.  
  997. C=======================================================================
  998. C Calcul du critere et raffinement si necessaire
  999. C=======================================================================
  1000. C Pour calculer le critere, on a besoin d'un modele et d'un chamelem
  1001. C constant egal a 1.
  1002. C
  1003. C------------------------------------------
  1004. C A) Creation d'un modele simple : MMODE1 !
  1005. C------------------------------------------
  1006. MN3 =12
  1007. NFOR=1
  1008. NMAT=2
  1009. NPARMO=0
  1010. NOBMOD=0
  1011. N1=1
  1012. SEGINI MMODE1
  1013. SEGINI IMODE1
  1014. MMODE1.KMODEL(1)=IMODE1
  1015. IMODE1.FORMOD(1)='MECANIQUE'
  1016. IMODE1.MATMOD(1)='ELASTIQUE'
  1017. IMODE1.MATMOD(2)='ISOTROPE'
  1018. IMODE1.CONMOD =' '
  1019.  
  1020. KARAF2=0
  1021. C=======================================================================
  1022. C Boucle sur les eventuels sous-domaines de IPT5
  1023. C=======================================================================
  1024.  
  1025. c-----------------------------------------------------------------------
  1026. c initialisation de LTYPE3 qui va contenir les tableau LTYP2
  1027. c correspondant à chaque sous domaine de IPT5. Ces tableau LTYP2
  1028. c contiendront eux même les maillages raffinés issue des
  1029. c différents sous domaine de IPT5.
  1030. c LTYPE3(I,1)=LTYP2 pour le sous domaine I de IPT5
  1031. c LTYPE3(I,2)=IRR le permier indice d'un maillage 48 dans LTYP2
  1032. c-----------------------------------------------------------------------
  1033. NBSOU5=IPT5.LISOUS(/1)
  1034. NBLIS3=MAX(1,NBSOU5)
  1035. SEGINI LTYPE3
  1036. MCONF=0
  1037. NSUR = 0
  1038. DO 33 INB=1,NBLIS3
  1039. IF (NBSOU5.EQ.0) THEN
  1040. IPT2=IPT5
  1041. ELSE
  1042. IPT2=IPT5.LISOUS(INB)
  1043. ENDIF
  1044.  
  1045. IMODE1.IMAMOD=IPT2
  1046. IMODE1.NEFMOD=IPT2.ITYPEL
  1047. CALL PRQUOI(IMODE1)
  1048. c PRQUOI n'active que le dernier MINTE de INFMOD qui n'est pas forcement
  1049. c celui utilise par INTGCA. Appel a ACTOBJ pour activer tous les MINTE.
  1050. CALL ACTOBJ('MMODEL ',MMODE1,1)
  1051.  
  1052. C-------------------------------------------------------
  1053. C B) Creation d'un chamelem constant egal a 1 : MCHEL1 !
  1054. C-------------------------------------------------------
  1055. CALL ZEROP(MMODE1,'NOEUD ',MCHEL1)
  1056. c* SEGACT MCHEL1
  1057. MCHAM1=MCHEL1.ICHAML(1)
  1058. SEGACT MCHAM1
  1059. MELVA1=MCHAM1.IELVAL(1)
  1060. SEGACT MELVA1*MOD
  1061. MELVA1.VELCHE(1,1)=1.D0
  1062. C
  1063. C-------------------------------------------------------------
  1064. C C) Calcul de la surface ou du volume des elements : MCHEL2 !
  1065. C-------------------------------------------------------------
  1066. ichm2 = 0
  1067. CALL INTGCA(MMODE1,MCHEL1,ichm2,1,IRET,XRET,MCHEL2)
  1068. IF (IRET.NE.1) RETURN
  1069. IF (XRET.LT.XPETI) THEN
  1070. WRITE (*,*) 'Volume(resp surf) de la zone a raffiner nul'
  1071. RETURN
  1072. ENDIF
  1073. c* SEGACT IPT2
  1074.  
  1075. C---------------------------------------------------------------------
  1076. C D) Creation d'un chamelem indiquant les elements a raffiner MCHAM2 !
  1077. C---------------------------------------------------------------------
  1078. SEGACT KMILIE*MOD
  1079. SEGACT MCHEL2
  1080. MCHAM2=MCHEL2.ICHAML(1)
  1081. SEGACT MCHAM2
  1082. MELVA2=MCHAM2.IELVAL(1)
  1083. SEGACT MELVA2*MOD
  1084. NACREE=0
  1085. KARAF=0
  1086.  
  1087. XDIM=1.D0/IDIM
  1088.  
  1089. NBNN2=IPT2.NUM(/1)
  1090. JTYP2=IPT2.ITYPEL
  1091.  
  1092. c boucles sur les éléments de ipt2
  1093. DO 32 J=1,IPT2.NUM(/2)
  1094.  
  1095. XMOY=0.D0
  1096. DO 29 I=1,NBNN2
  1097. NGLOB=IPT2.NUM(I,J)
  1098. NLOC=ICPR(NGLOB,1)
  1099. DENPT=DENSI(NLOC)
  1100. XMOY=XMOY+DENPT/NBNN2
  1101. 29 CONTINUE
  1102.  
  1103. XINT=MELVA2.VELCHE(1,J)
  1104. C Un element est a raffiner si la moyenne des densites affectees a
  1105. C l'ensemble de ses noeuds est inférieure a la racine carree de sa
  1106. C surface (en 2D) ou a la racine cubique de son volume (en 3D)
  1107. C WRITE (*,*) 'XMOY', XMOY, '(XINT**XDIM)',(XINT**XDIM)
  1108. IF ((XMOY-(XINT**XDIM)).LT.0) THEN
  1109. c c y a t'il des +epsilon...?
  1110. c XDIFF = XMOY-(XINT**XDIM)
  1111. c if(XDIFF.ge.0.and.XDIFF.lt.0.001*XMOY) then
  1112. c write(*,*) 'RAFF : XMOY,XDIFF=',XMOY,XDIFF,
  1113. c & 'pour l EF',J,(IPT2.NUM(iou,J),iou=1,IPT2.NUM(/1))
  1114. c endif
  1115. c IF (XDIFF.LT.0) THEN
  1116. MELVA2.VELCHE(1,J)=1
  1117. c KARAF nombre d'éléments à rafiner dans le sous domaine
  1118. KARAF=KARAF+1
  1119. ILPT=LPT(JTYP2)
  1120. ILPL=LPL(JTYP2)
  1121.  
  1122. c boucle sur les segments de l'élément à raffiner
  1123. DO 31 K=1,ILPL*2-1,2
  1124. NPTA=IPT2.NUM(KSEGM(ILPT+K-1),J)
  1125. NPTB=IPT2.NUM(KSEGM(ILPT+K),J)
  1126. NMIN=MIN(ICPR(NPTA,1),ICPR(NPTB,1))
  1127. NMAX=MAX(ICPR(NPTA,1),ICPR(NPTB,1))
  1128. NEXIST=0
  1129. DO 30 I=1,MAX(1,KARPOS(NMIN))
  1130. IF (KARETE(NMIN,I).EQ.NMAX) NEXIST=I
  1131. 30 CONTINUE
  1132. c On met dans kmilie les arêtes où il faudra mettre un nouveau noeud
  1133. c On leur associe la valeur -1
  1134. IF (KMILIE(NMIN,NEXIST).EQ.0) THEN
  1135. NACREE=NACREE+1
  1136. KMILIE(NMIN,NEXIST)=-1
  1137. ENDIF
  1138. 31 CONTINUE
  1139. C
  1140. C-------------------------------------------
  1141. C E) Comptage du nombre de faces a raffiner !
  1142. C-------------------------------------------
  1143. C 1/ Initialisations
  1144. IF (IDIM.NE.3) GOTO 32
  1145. JLTEL1=LTEL(1,JTYP2)
  1146. JLTEL2=LTEL(2,JTYP2)
  1147. DO 73 IBB=1,JLTEL1
  1148. JLDEL1=LDEL(1,JLTEL2-1+IBB)
  1149. JTYFAC=IWORK1(JLDEL1)
  1150. JLDEL2=LDEL(2,JLTEL2-1+IBB)
  1151. C JNBPTS=NBNNE(JTYFAC)
  1152. JNBSOM=NBSOM(JTYFAC)
  1153. JSPOS=NSPOS(JTYFAC)
  1154. SEGINI IWORK2
  1155. DO 74 IAA=1,JNBSOM
  1156. NGLOBA=IPT2.NUM(LFAC(JLDEL2-1+IBSOM(JSPOS-1+IAA)),J)
  1157. IWORK2(IAA)=NGLOBA
  1158. 74 CONTINUE
  1159. C
  1160. C 2/ Classement des 3 sommets par ordre croissant (num globale)
  1161. NPTA=nbpts+1
  1162. NPTB=NPTA+1
  1163. NPTC=NPTB+1
  1164. DO 75 ICC=1,JNBSOM
  1165. IF (IWORK2(ICC).LT.NPTA) THEN
  1166. NPTC=NPTB
  1167. NPTB=NPTA
  1168. NPTA=IWORK2(ICC)
  1169. ELSEIF (IWORK2(ICC).LT.NPTB) THEN
  1170. NPTC=NPTB
  1171. NPTB=IWORK2(ICC)
  1172. ELSEIF (IWORK2(ICC).LT.NPTC) THEN
  1173. NPTC=IWORK2(ICC)
  1174. ENDIF
  1175. 75 CONTINUE
  1176. C
  1177. C 3/ Classement des 3 sommets par ordre croissant (num locale)
  1178. NPTA2=ICPR(NPTA,1)
  1179. NPTB2=ICPR(NPTB,1)
  1180. NPTC2=ICPR(NPTC,1)
  1181. IF ((NPTA2.LT.NPTB2).AND.(NPTA2.LT.NPTC2)) THEN
  1182. NPTA=NPTA2
  1183. NPTB=MIN(NPTB2,NPTC2)
  1184. NPTC=MAX(NPTB2,NPTC2)
  1185. ENDIF
  1186. IF ((NPTB2.LT.NPTA2).AND.(NPTB2.LT.NPTC2)) THEN
  1187. NPTA=NPTB2
  1188. NPTB=MIN(NPTA2,NPTC2)
  1189. NPTC=MAX(NPTA2,NPTC2)
  1190. ENDIF
  1191. IF ((NPTC2.LT.NPTA2).AND.(NPTC2.LT.NPTB2)) THEN
  1192. NPTA=NPTC2
  1193. NPTB=MIN(NPTA2,NPTB2)
  1194. NPTC=MAX(NPTA2,NPTB2)
  1195. ENDIF
  1196. C
  1197. C 4/ Calcul du nombre de points a creer pour raffiner la face
  1198. NEXIS2=0
  1199. DO 76 IEE=1,JPLCOM(NPTA)
  1200. MTMP=JPLANS(NPTA,IEE)
  1201. JJ1=JNOEFA(MTMP,1)
  1202. JJ2=JNOEFA(MTMP,2)
  1203. JJ3=JNOEFA(MTMP,3)
  1204. IF(JJ1.EQ.NPTA.AND.JJ2.EQ.NPTB.AND.JJ3.EQ.NPTC) THEN
  1205. NEXIS2=IEE
  1206. ENDIF
  1207. 76 CONTINUE
  1208. IF (NEXIS2.NE.0) THEN
  1209. KFARAF=JPLAN2(NPTA,NEXIS2)
  1210. IF (KFARAF.EQ.0) THEN
  1211. NACREE=NACREE+NBINTE(JTYFAC)
  1212. JPLAN2(NPTA,NEXIS2)=JPLAN2(NPTA,NEXIS2)+1
  1213. ENDIF
  1214. ENDIF
  1215. 73 CONTINUE
  1216. ELSE
  1217.  
  1218. MELVA2.VELCHE(1,J)=0
  1219. ENDIF
  1220. 32 CONTINUE
  1221.  
  1222. c KARAF2 nombre d'éléments à rafiner sur tout les sous domaines
  1223. KARAF2=KARAF2+KARAF
  1224. c si aucun élément à raffiner on stoque directement IPT2 dans LTYPE3
  1225. c on stoque également les anciennes relations et on passe au
  1226. c sous-domaine suivant.
  1227.  
  1228. c ATTENTION SI NBOUCL=1 il est possible que des relations surabondantes
  1229.  
  1230. c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  1231. c forcage : nb max itération de raff
  1232. c IF (NBOUCL.EQ.3) THEN
  1233. c KARAF2=0
  1234. c KARAF=0
  1235. c ENDIF
  1236. c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  1237. IF (KARAF.EQ.0) THEN
  1238. IF (NBOUCL.EQ.1) THEN
  1239. IF (LCONF3.GT.0) THEN
  1240. SEGACT IPT6
  1241. NBLIS2=1+MAX(1,IPT6.LISOUS(/1))
  1242. SEGINI LTYPE2
  1243. LTYPE2(1,1)=1
  1244. LTYPE2(1,2)=IPT2.ITYPEL
  1245. LTYPE2(1,3)=IPT2
  1246. LTYPE2(1,4)=IPT2.ICOLOR(1)
  1247. LTYPE3(INB,2)=0
  1248. DO 676 MIE=1,MAX(1,IPT6.LISOUS(/1))
  1249. IF (IPT6.LISOUS(/1).EQ.0) THEN
  1250. IPT4=IPT6
  1251. ELSE
  1252. IPT4=IPT6.LISOUS(MIE)
  1253. ENDIF
  1254. NSUR=1
  1255. SEGACT IPT4
  1256. LTYPE2(1+MIE,1)=1+MIE
  1257. LTYPE2(1+MIE,2)=IPT4.ITYPEL
  1258. LTYPE2(1+MIE,3)=IPT4
  1259. LTYPE2(1+MIE,4)=IPT4.ICOLOR(1)
  1260. LTYPE3(INB,2)=2
  1261. 676 CONTINUE
  1262. ELSE
  1263. NBLIS2=1
  1264. SEGINI LTYPE2
  1265. LTYPE2(1,1)=1
  1266. LTYPE2(1,2)=IPT2.ITYPEL
  1267. LTYPE2(1,3)=IPT2
  1268. LTYPE2(1,4)=IPT2.ICOLOR(1)
  1269. LTYPE3(INB,2)=0
  1270. ENDIF
  1271. LTYPE3(INB,1)=LTYPE2
  1272. ELSE
  1273. SEGACT LTYPE4
  1274. LTYPE3(INB,1)=LTYPE4(INB,1)
  1275. LTYPE3(INB,2)=LTYPE4(INB,2)
  1276. ENDIF
  1277. GOTO 33
  1278. ENDIF
  1279. C
  1280. C----------------------------
  1281. C F) Raffinement du maillage !
  1282. C----------------------------
  1283. NML=2
  1284. C
  1285. C 1/ Raffinement d'un maillage 2D
  1286. C On recupere dans MELEME le maillage raffine sans ses relations de
  1287. C conformite et dans IPT8 les relations de ce maillage
  1288. C (IPT8 encore incomplet en sortie de RAFF2D)
  1289. c entrees de raff2D:
  1290. c - IPT2: maillage élémentaire à raffiner
  1291. c (ici sous domaine de ipt5)
  1292. c - ICPR: tableau de passage noeuds local/global
  1293. c (ici à partir de ipt5 interne à la boucle 9)
  1294. c - KARPOS: tableau du nb d'arretes par noeuds
  1295. c (ici à partir de ipt5, mis a jour avec ipt6)
  1296. c - KARETE: tableau des d'arretes KARETE(i,j)=k
  1297. c (ici à partir de ipt5, mis a jour avec ipt6)
  1298. c - KMILIE: tableau des hanging nodes associés au arrètes
  1299. c en entrée: à partir des relations de ipt6 et
  1300. c des nouveau noeuds à construires
  1301. c si relation issue de ipt6
  1302. c KMILIE(i,j)=n : le noeud global n est situe
  1303. c au milieu de l'arete [i,k]
  1304. c si nouvelle relation
  1305. c KMILIE(i,j)=-1 : il faut construire un noeud
  1306. c au milieu de l'arete [i,k]
  1307. c - MELVA2: champ par elem valait 1 pour les élem à raffiner
  1308. c et 0 pour les autres
  1309. c (ici à partir de ipt2 et de densi)
  1310. c - NACREE: nombre de noeuds à créer dans ipt2
  1311. c - KARAF: nombre d'élément à raffiner dans ipt2
  1312. c - IDCP : ??? variable non utilisé ???
  1313. c - XDEN : densité aux noeuds en notation globale
  1314. c (ici à partir de mchpo1)
  1315. c - KARET2: tableau du nombre d'éléments touchant les arretes
  1316. c (ici à partir de ipt5, mis a jour avec ipt6)
  1317. csorties de raff2D :
  1318. c - KMILIE: tableau des hanging nodes associés au arrètes
  1319. c en sortie: à partir des relations donnée en
  1320. c entrée et de celles crées
  1321. c si anciene relation à garder
  1322. c KMILIE(i,j)=n : le noeud global n est situe
  1323. c au milieu de l'arete [i,k]
  1324. c si anciene relation à suprimer
  1325. c KMILIE(i,j)=0 :
  1326. c si nouvelle relation
  1327. c KMILIE(i,j)=n : le noeud n à été construit au
  1328. c milieu de l'arete [i,k]
  1329. c - MELEME: Maillage élémentaire raffiné à partir de ipt2
  1330. c sans relations
  1331. c - IPT8 : Maillage de relation incomplet
  1332. c si J nouvel élément 48:
  1333. c IPT8.NUM(1,j) = nouveau hanging node
  1334. c IPT8.NUM(2:4,j) = autres noeuds de la relation
  1335. c IPT8.NUM(5,j) = 1 si arête a 2 noeuds
  1336. c 2 si arête a 3 noeuds
  1337. c si J nouvel élément 48:
  1338. c IPT8.NUM(1,j) = nouveau hanging node
  1339. c IPT8.NUM(2:5,j) = 0
  1340. c - XDEN : densité aux noeuds en notation globale
  1341. c interpolé aux nouveaux noeuds.
  1342. IF (IDIM.EQ.2) CALL RAFF2D(IPT2,ICPR,KARPOS,KARETE,KMILIE,
  1343. + MELVA2,NACREE,KARAF,MELEME,IDCP,IPT8,KARET2,XDEN)
  1344. C
  1345. C 2/ Raffinement d'un maillage 3D
  1346. IF (IDIM.EQ.3) THEN
  1347. NML=0
  1348. IF ((IPT2.ITYPEL.EQ.25).OR.(IPT2.ITYPEL.EQ.26)) NML=1
  1349. ENDIF
  1350. C a) Maillage 3D contenant des pyramides
  1351. IPT9=0
  1352. IF (NML.EQ.1) CALL RAFPYR(IPT2,ICPR,KARPOS,KARETE,KMILIE,
  1353. + MELVA2,NACREE,KARAF,MELEME,JPLANS,JPLAN3,JPLCOM,JNOEFA,
  1354. + IPT8,JFARAF,KARET2,IPT9,XDEN)
  1355. C b) Maillage 3D sans pyramides
  1356. IF (NML.EQ.0) CALL RAFF3D(IPT2,IPT6,ICPR,KARPOS,KARETE,KMILIE,
  1357. + MELVA2,NACREE,KARAF,MELEME,JPLANS,JPLAN3,JPLCOM,JNOEFA,
  1358. + IPT8,JFARAF,KARET2,XDEN)
  1359. C
  1360. C=======================================================================
  1361. C Creation du maillage de relations de conformite
  1362. C=======================================================================
  1363. C--------------------
  1364. C A) Initialisations !
  1365. C--------------------
  1366. IPT10=0
  1367. IPT11=0
  1368. IPT12=0
  1369. IPT13=0
  1370. IPT14=0
  1371. IPT15=0
  1372. IPT16=0
  1373. MCONF=0
  1374. c IF (KARAF2.EQ.0) GOTO 33
  1375. IF (IPT8.NE.0) THEN
  1376. C
  1377. C---------------------------------------
  1378. C B) Traitement des anciennes relations !
  1379. C---------------------------------------
  1380. C A ce stade, IPT8 contient les relations crees lors du dernier
  1381. C raffinement (noeud de relation + noeuds formant la relation) et les
  1382. C anciennes relations a reporter (noeud de relation seulement)
  1383.  
  1384. C 1/ Recherche de l'existence d'anciennes relations a reporter
  1385. NB10=0
  1386. MLONG=IPT8.NUM(/1)
  1387. DO 775 MM=1,IPT8.NUM(/2)
  1388. IF (IPT8.NUM(MLONG,MM).EQ.0) NB10=NB10+1
  1389. 775 CONTINUE
  1390.  
  1391. IF (NB10.NE.0) THEN
  1392. C
  1393. C 2/ Creation de IPT10
  1394. c MCOL=0
  1395. c NBNN=9
  1396. c NBELEM=NB10
  1397. c NBREF=0
  1398. c NBSOUS=0
  1399. c SEGINI IPT10
  1400. c IPT10.ITYPEL=48
  1401. C
  1402. C 3/ Recherche des anciennes relations a reporter
  1403. C Cette partie permet de compléter IPT8 avec les noeuds formant les
  1404. C relations, pour les anciennes relations à reporter
  1405. DO 628 MM11=1,IPT8.NUM(/2)
  1406. IF (IPT8.NUM(MLONG,MM11).NE.0) GOTO 628
  1407. INRELA=IPT8.NUM(1,MM11)
  1408. c On active pous le cas ou IPT6=IPT2.
  1409. SEGACT IPT6
  1410. DO 625 KOU=1,MAX(1,IPT6.LISOUS(/1))
  1411. IF (IPT6.LISOUS(/1).EQ.0) THEN
  1412. IPT2=IPT6
  1413. ELSE
  1414. IPT2=IPT6.LISOUS(KOU)
  1415. ENDIF
  1416. SEGACT IPT2
  1417. IF (IPT2.ITYPEL.NE.48) GOTO 625
  1418. DO 626 JKG=1,IPT2.NUM(/2)
  1419. INOEGL=IPT2.NUM(1,JKG)
  1420. IF (INOEGL.NE.INRELA) GOTO 626
  1421. MCOL=MCOL+1
  1422. DO 627 MTMP=1,IPT2.NUM(/1)
  1423. IPT8.NUM(MTMP,MM11)=IPT2.NUM(MTMP,JKG)
  1424. IPT8.NUM(MLONG,MM11)= IPT2.ICOLOR(JKG)
  1425. 627 CONTINUE
  1426. GOTO 628
  1427. 626 CONTINUE
  1428. 625 CONTINUE
  1429. 628 CONTINUE
  1430. ENDIF
  1431. c à ce stade le maillage de relation ipt8 est complet
  1432. C
  1433. C---------------------------------------
  1434. C C) Traitement des nouvelles relations !
  1435. C---------------------------------------
  1436. C Ici, IPT8 contient toutes les relations du nouveau maillage
  1437. C On les trie par type de relations
  1438.  
  1439. C 1/ Recherche de l'existence de nouvelles relations
  1440. NB11=0
  1441. NB12=0
  1442. NB13=0
  1443. NB14=0
  1444. NB15=0
  1445. NB16=0
  1446. MLONG=IPT8.NUM(/1)
  1447. DO 776 MM=1,IPT8.NUM(/2)
  1448. IF (IPT8.NUM(MLONG,MM).EQ.1) NB11=NB11+1
  1449. IF (IPT8.NUM(MLONG,MM).EQ.2) NB12=NB12+1
  1450. IF (IPT8.NUM(MLONG,MM).EQ.3) NB13=NB13+1
  1451. IF (IPT8.NUM(MLONG,MM).EQ.4) NB14=NB14+1
  1452. IF (IPT8.NUM(MLONG,MM).EQ.5) NB15=NB15+1
  1453. IF (IPT8.NUM(MLONG,MM).EQ.6) NB16=NB16+1
  1454. 776 CONTINUE
  1455. C
  1456. C 2/ Cas des relations 'aretes a 2 noeuds'
  1457. IF (NB11.NE.0) THEN
  1458. MCONF=MCONF+1
  1459. MCOL=0
  1460. NBNN=3
  1461. NBELEM=NB11
  1462. NBREF=0
  1463. NBSOUS=0
  1464. SEGINI IPT11
  1465. IPT11.ITYPEL=48
  1466. DO 778 MM11=1,IPT8.NUM(/2)
  1467. IF (IPT8.NUM(MLONG,MM11).NE.1) GOTO 778
  1468. MCOL=MCOL+1
  1469. DO 777 MTMP=1,3
  1470. IPT11.NUM(MTMP,MCOL)=IPT8.NUM(MTMP,MM11)
  1471. IPT11.ICOLOR(MCOL)=1
  1472. 777 CONTINUE
  1473. 778 CONTINUE
  1474. ENDIF
  1475. C
  1476. C 3/ Cas des relations 'aretes a 3 noeuds'
  1477. IF (NB12.NE.0) THEN
  1478. MCONF=MCONF+1
  1479. MCOL=0
  1480. NBNN=4
  1481. NBELEM=NB12
  1482. NBREF=0
  1483. NBSOUS=0
  1484. SEGINI IPT12
  1485. IPT12.ITYPEL=48
  1486. DO 668 MM11=1,IPT8.NUM(/2)
  1487. IF (IPT8.NUM(MLONG,MM11).NE.2) GOTO 668
  1488. MCOL=MCOL+1
  1489. DO 667 MTMP=1,4
  1490. IPT12.NUM(MTMP,MCOL)=IPT8.NUM(MTMP,MM11)
  1491. IPT12.ICOLOR(MCOL)=2
  1492. 667 CONTINUE
  1493. 668 CONTINUE
  1494. ENDIF
  1495. C
  1496. C 4/ Cas des relations 'face QUA4'
  1497. IF (NB13.NE.0) THEN
  1498. MCONF=MCONF+1
  1499. MCOL=0
  1500. NBNN=5
  1501. NBELEM=NB13
  1502. NBREF=0
  1503. NBSOUS=0
  1504. SEGINI IPT13
  1505. IPT13.ITYPEL=48
  1506. DO 658 MM11=1,IPT8.NUM(/2)
  1507. IF (IPT8.NUM(MLONG,MM11).NE.3) GOTO 658
  1508. MCOL=MCOL+1
  1509. DO 657 MTMP=1,5
  1510. IPT13.NUM(MTMP,MCOL)=IPT8.NUM(MTMP,MM11)
  1511. IPT13.ICOLOR(MCOL)=3
  1512. 657 CONTINUE
  1513. 658 CONTINUE
  1514. ENDIF
  1515. C
  1516. C 5/ Cas des relations 'face TRI6'
  1517. IF (NB14.NE.0) THEN
  1518. MCONF=MCONF+1
  1519. MCOL=0
  1520. NBNN=7
  1521. NBELEM=NB14
  1522. NBREF=0
  1523. NBSOUS=0
  1524. SEGINI IPT14
  1525. IPT14.ITYPEL=48
  1526. DO 648 MM11=1,IPT8.NUM(/2)
  1527. IF (IPT8.NUM(MLONG,MM11).NE.4) GOTO 648
  1528. MCOL=MCOL+1
  1529. DO 647 MTMP=1,7
  1530. IPT14.NUM(MTMP,MCOL)=IPT8.NUM(MTMP,MM11)
  1531. IPT14.ICOLOR(MCOL)=4
  1532. 647 CONTINUE
  1533. 648 CONTINUE
  1534. ENDIF
  1535. C
  1536. C 6/ Cas des relations 'face QUA8-1'
  1537. IF (NB15.NE.0) THEN
  1538. MCONF=MCONF+1
  1539. MCOL=0
  1540. NBNN=9
  1541. NBELEM=NB15
  1542. NBREF=0
  1543. NBSOUS=0
  1544. SEGINI IPT15
  1545. IPT15.ITYPEL=48
  1546. DO 638 MM11=1,IPT8.NUM(/2)
  1547. IF (IPT8.NUM(MLONG,MM11).NE.5) GOTO 638
  1548. MCOL=MCOL+1
  1549. DO 637 MTMP=1,9
  1550. IPT15.NUM(MTMP,MCOL)=IPT8.NUM(MTMP,MM11)
  1551. IPT15.ICOLOR(MCOL)=5
  1552. 637 CONTINUE
  1553. 638 CONTINUE
  1554. ENDIF
  1555. C
  1556. C 7/ Cas des relations 'face QUA8-2'
  1557. IF (NB16.NE.0) THEN
  1558. MCONF=MCONF+1
  1559. MCOL=0
  1560. NBNN=9
  1561. NBELEM=NB16
  1562. NBREF=0
  1563. NBSOUS=0
  1564. SEGINI IPT16
  1565. IPT16.ITYPEL=48
  1566. DO 678 MM11=1,IPT8.NUM(/2)
  1567. IF (IPT8.NUM(MLONG,MM11).NE.6) GOTO 678
  1568. MCOL=MCOL+1
  1569. DO 677 MTMP=1,9
  1570. IPT16.NUM(MTMP,MCOL)=IPT8.NUM(MTMP,MM11)
  1571. IPT16.ICOLOR(MCOL)=6
  1572. 677 CONTINUE
  1573. 678 CONTINUE
  1574. ENDIF
  1575. C
  1576. ENDIF
  1577. C
  1578. C--------------------------------------
  1579. C D) Creation du maillage de relations !
  1580. C--------------------------------------
  1581. C 1/ Initialisation de MAIREL
  1582. C MAIREL contient tous les maillages de relations, certains étant vides
  1583. C car il n'y a aucune relation du type considéré dans le nveau maillage
  1584. NBMAIL=6
  1585. SEGINI MAIREL
  1586. MAIREL(1)=IPT11
  1587. MAIREL(2)=IPT12
  1588. MAIREL(3)=IPT13
  1589. MAIREL(4)=IPT14
  1590. MAIREL(5)=IPT15
  1591. MAIREL(6)=IPT16
  1592. C
  1593. C 2/ Initialisation de LTYPE2
  1594. C LTYPE2 va contenir tous les sous-objets du nouveau maillage,
  1595. C relations et non relations
  1596. NBLIS2=MCONF+MAX(1,MELEME.LISOUS(/1))
  1597. SEGINI LTYPE2
  1598. C
  1599. C 3/ Renseignement des lisous non 48 dans LTYPE2
  1600. C S'il y a N sous-objets de non-relations dans le nouveau maillage,
  1601. C les N-ièmes premières colonnes de LTYPE2 contiennent ces sous-objets
  1602. DO 685 IZZ=1,MAX(1,MELEME.LISOUS(/1))
  1603. IF (MELEME.LISOUS(/1).EQ.0) THEN
  1604. IPT2=MELEME
  1605. ELSE
  1606. IPT2=MELEME.LISOUS(IZZ)
  1607. SEGACT IPT2
  1608. ENDIF
  1609. LTYPE2(IZZ,1)=IZZ
  1610. LTYPE2(IZZ,2)=IPT2.ITYPEL
  1611. LTYPE2(IZZ,3)=IPT2
  1612. LTYPE2(IZZ,4)=0
  1613. 685 CONTINUE
  1614. C
  1615. C 4/ Renseignement des lisous 48 dans LTYPE2
  1616. C Les colonnes suivantes contiennent les sous-objets de relations,
  1617. C chaque sous-objet correspondant a un type de relations de conformité
  1618. IZZ=NBLIS2-MCONF
  1619. DO 686 IXX=1,6
  1620. IF (MAIREL(IXX).EQ.0) GOTO 686
  1621. IPT2=MAIREL(IXX)
  1622. IZZ=IZZ+1
  1623. LTYPE2(IZZ,1)=IZZ
  1624. LTYPE2(IZZ,2)=IPT2.ITYPEL
  1625. LTYPE2(IZZ,3)=IPT2
  1626. LTYPE2(IZZ,4)=IPT2.ICOLOR(1)
  1627. 686 CONTINUE
  1628. C--------------------------------------
  1629. C E) Renseignement de LTYPE2 interne a
  1630. c la boucle 33 dans LTYPE3 externe a
  1631. c la boucle 33
  1632. C--------------------------------------C
  1633. C
  1634.  
  1635. LTYPE3(INB,1)=LTYPE2
  1636. IF (MCONF.EQ.0) THEN
  1637. LTYPE3(INB,2)=0
  1638. ELSE
  1639. LTYPE3(INB,2)=NBLIS2-MCONF+1
  1640. ENDIF
  1641. c fin de boucle sur les sous domaines d'ipt5
  1642. 33 CONTINUE
  1643. c SEGSUP IPT2
  1644.  
  1645.  
  1646. C Mise a jour des maillages en entrée sortie de la boucle 9
  1647. C IPT5, IPT6, IPT7
  1648. C=======================================================================
  1649. 679 CONTINUE
  1650. C--------------------------------------C
  1651. C A) initialisation
  1652. C--------------------------------------C
  1653.  
  1654. c 1/ initialisaton de IPT7 maillage stockant tout les sous maillage
  1655. c à la fin d'une itération de la boucle 9
  1656. NBS7=0
  1657. DO 331 I3=1,LTYPE3(/1)
  1658. LTYPE2=LTYPE3(I3, 1)
  1659. SEGACT LTYPE2
  1660. NBS7=NBS7+LTYPE2(/1)+1
  1661. 331 CONTINUE
  1662. IF (NBS7.EQ.1) NBS7=0
  1663. NBNN=0
  1664. NBELEM=0
  1665. NBREF=0
  1666. NBSOUS=NBS7
  1667. SEGINI IPT7
  1668.  
  1669. c 2/ initialisaton de IPT6 maillage stockant tout les sous maillage
  1670. c de relation à la fin d'une itération de la boucle 9
  1671. NBS6=0
  1672.  
  1673. DO 332 I3=1,LTYPE3(/1)
  1674. LTYPE2=LTYPE3(I3, 1)
  1675. SEGACT LTYPE2
  1676. IF (LTYPE3(I3,2).NE.0) NBS6=NBS6+(LTYPE2(/1)-LTYPE3(I3,2)+1)
  1677. 332 CONTINUE
  1678. IF (NBS6.EQ.1) NBS6=0
  1679. NBNN=0
  1680. NBELEM=0
  1681. NBREF=0
  1682. NBSOUS=NBS6
  1683. SEGINI IPT6
  1684. c 3/ initialisaton de IPT5 maillage stockant tout les sous maillage
  1685. c non relation à la fin d'une itération de la boucle 9
  1686. NBS5=0
  1687. DO 333 I3=1,LTYPE3(/1)
  1688. LTYPE2=LTYPE3(I3, 1)
  1689. SEGACT LTYPE2
  1690. IF (LTYPE3(I3,2).EQ.0) THEN
  1691. NBS5=NBS5+LTYPE2(/1)
  1692. ELSE
  1693. NBS5=NBS5+(LTYPE3(I3,2)-1)
  1694. ENDIF
  1695. 333 CONTINUE
  1696. IF (NBS5.EQ.1) NBS5=0
  1697. NBNN=0
  1698. NBELEM=0
  1699. NBREF=0
  1700. NBSOUS=NBS5
  1701. SEGINI IPT5
  1702. C--------------------------------------C
  1703. C B) assemblage des nouveaux maillages a
  1704. c partir des sous maillages stockes
  1705. c dans LTYP3
  1706. C--------------------------------------C
  1707. IND5=0
  1708. IND6=0
  1709. IND7=0
  1710. c 1/assemblage des nouveaux maillages non relation a partir des sous
  1711. c maillages stockes dans LTYP3
  1712.  
  1713. DO 35 I3=1,LTYPE3(/1)
  1714. c extraction d'un LTYPE2 de LTYPE3
  1715. LTYPE2=LTYPE3(I3, 1)
  1716. SEGACT LTYPE2
  1717. c NBNN=0
  1718. c NBELEM=0
  1719. c NBREF=0
  1720. c NBSOUS=0
  1721. DO 613 I2=1,MAX(1,(LTYPE3(I3,2)-1))
  1722. c extraction d'un MAILLAGE non relation de LTYPE2
  1723. IPT2=LTYPE2(I2,3)
  1724. SEGACT IPT2
  1725. IND5=IND5+1
  1726. IF (NBS5.EQ.0) THEN
  1727. IPT5=IPT2
  1728. c write (*,*) 'IPT5.' , IPT5
  1729. c write (*,*) 'type', IPT2.ITYPEL, 'Nbel' , IPT2.num(/2)
  1730. ELSE
  1731. IPT5.LISOUS(IND5)=IPT2
  1732. c write (*,*) 'IPT5.LISOUS(',IND5,')' , IPT5.LISOUS(IND5)
  1733. c write (*,*) 'type', IPT2.ITYPEL, 'Nbel' , IPT2.num(/2)
  1734. ENDIF
  1735. IND7=IND7+1
  1736. IF (NBS7.EQ.0) THEN
  1737. IPT7=IPT2
  1738. ELSE
  1739. IPT7.LISOUS(IND7)=IPT2
  1740. c write (*,*) 'IPT7.LISOUS(',IND7,')' , IPT7.LISOUS(IND7)
  1741. c write (*,*) 'type', IPT2.ITYPEL, 'Nbel' , IPT2.num(/2)
  1742. ENDIF
  1743. 613 CONTINUE
  1744. 35 CONTINUE
  1745.  
  1746. c 2/assemblage des nouveaux maillage de relation à partir des derniers
  1747. c sous maillages stockés dans LTYPE3
  1748.  
  1749. DO 36 I3=1,LTYPE3(/1)
  1750. c extraction d'un LTYPE2 de LTYPE3
  1751. c write (*,*) 'I3', I3
  1752. c write (*,*) 'LTYPE3(I3,2)', LTYPE3(I3,2)
  1753. IF (LTYPE3(I3,2).EQ.0) GOTO 36
  1754. SEGACT LTYPE2
  1755. LTYPE2=LTYPE3(I3, 1)
  1756. NBNN=0
  1757. NBELEM=0
  1758. NBREF=0
  1759. NBSOUS=0
  1760. DO 614 I2=LTYPE3(I3,2), LTYPE2(/1)
  1761. c extraction d'un MAILLAGE de relation de LTYPE2
  1762. c write (*,*) 'I2', I2
  1763. SEGINI IPT2
  1764. IPT2=LTYPE2(I2,3)
  1765. SEGACT IPT2
  1766. c write (*,*) 'IPT2: Type', IPT2.ITYPEL,'nbelem', IPT2.NUM(/2)
  1767. c write (*,*) 'coul IPT2' , IPT2.ICOLOR(1)
  1768. IND6=IND6+1
  1769. IF (NBS6.EQ.0) THEN
  1770. IPT6=IPT2
  1771. c write (*,*) 'IPT6' , IPT6
  1772. c write (*,*) 'type', IPT2.ITYPEL, 'Nbel' , IPT2.num(/2)
  1773. ELSE
  1774. IPT6.LISOUS(IND6)=IPT2
  1775.  
  1776. c write (*,*) 'IPT6.LISOUS(',IND6,')' , IPT6.LISOUS(IND6)
  1777. c write (*,*) 'type', IPT2.ITYPEL, 'Nbel' , IPT2.num(/2)
  1778. ENDIF
  1779. 614 CONTINUE
  1780. 36 CONTINUE
  1781.  
  1782. c 3/ Concatenation des sous maillages de relation de même couleur
  1783.  
  1784. c GG 11 juin 2018 : attention il peut encore y avoir des problemes a la
  1785. c jonctions entre deux sous zones dans le cas ou on raffine plusieurs
  1786. c types d'element differents (passer cette etape de concatenation dans
  1787. c la boucle 33 ?
  1788.  
  1789. IF (NBS6.EQ.0) then
  1790. IND7=IND7+1
  1791. IPT7.LISOUS(IND7) = IPT6
  1792. c write (*,*) 'IPT7.LISOUS(',IND7,')' , IPT7.LISOUS(IND7)
  1793. c write (*,*) 'type', IPT2.ITYPEL, 'Nbel' , IPT2.num(/2)
  1794.  
  1795. goto 370
  1796. ENDIF
  1797. NBS60 = 0
  1798. SEGACT IPT6
  1799.  
  1800. c boucle sur les couleurs
  1801. NBELEM = 0
  1802. NBNN= 0
  1803. NBREF= 0
  1804. NBSOUS=6
  1805. SEGINI IPT4
  1806. DO 37 ICOUL = 1, 6
  1807. c boucle sur les sous maillages de ipt6
  1808. NCOl = 0
  1809. DO 38 I6 = 1, NBS6
  1810. IPT3 = IPT6.LISOUS(I6)
  1811. SEGACT IPT3
  1812. IF ((IPT3.icolor(1)).EQ.ICOUL) then
  1813. NCOL = NCOL+1
  1814. IF (NCOL.EQ.1) THEN
  1815. SEGINI IPT2
  1816. IPT2 = IPT6.LISOUS(I6)
  1817.  
  1818. ENDIF
  1819. IF (NCOL.GE.2) THEN
  1820.  
  1821. c IPT3 = IPT6.LISOUS(I6)
  1822. c SEGACT IPT3
  1823. c Plusieurs sous maillages de même couleur on concatene IPT2 et IPT3
  1824. NBELEM = IPT2.NUM(/2)
  1825. NBNN= IPT2.NUM(/1)
  1826. NBREF=0
  1827. NBSOUS=0
  1828. NBELE0 = NBELEM
  1829. DO 381 IE3 = 1, IPT3.NUM(/2)
  1830. DO 382 IE2 = 1, NBELE0
  1831. IF ((IPT3.NUM(1,IE3)).EQ.(IPT2.NUM(1,IE2))) GOTO 381
  1832. 382 CONTINUE
  1833. NBELEM = NBELEM +1
  1834. SEGADJ IPT2
  1835. DO IN2 = 1, NBNN
  1836. IPT2.NUM(IN2 , NBELEM) = IPT3.NUM(IN2, IE3)
  1837. IPT2.icolor(NBELEM) = IPT3.icolor(IE3)
  1838. ENDDO
  1839. 381 CONTINUE
  1840. ENDIF
  1841. ENDIF
  1842. 38 CONTINUE
  1843. IF (NCOL.GE.1) THEN
  1844. IPT4.LISOUS(ICOUL) = IPT2
  1845. NBS60= NBS60+1
  1846. ENDIF
  1847.  
  1848. 37 CONTINUE
  1849.  
  1850. c mise a jour de ipt6 et ipt7
  1851. IF (NBS60.EQ.1) then
  1852. IPT6 = IPT2
  1853. segact ipt6
  1854.  
  1855. c write (*,*) 'IPT6' , IPT6
  1856. c write (*,*) 'type', IPT6.ITYPEL, 'Nbel' , IPT6.num(/2)
  1857. IND7=IND7+1
  1858. IPT7.LISOUS(IND7) = IPT2
  1859. c write (*,*) 'IPT7.LISOUS(',IND7,')' , IPT7.LISOUS(IND7)
  1860. c write (*,*) 'type', IPT2.ITYPEL, 'Nbel' , IPT2.num(/2)
  1861. ELSE
  1862. SEGACT IPT4
  1863. NBELEM = 0
  1864. NBNN = 0
  1865. NBREF = 0
  1866. NBSOUS = NBS60
  1867. SEGINI IPT6
  1868. IS6=0
  1869. DO ICOUL = 1, 6
  1870. IF ((IPT4.LISOUS(ICOUL)).NE.0) THEN
  1871. IS6 = IS6+1
  1872. IPT6.LISOUS(IS6)= IPT4.LISOUS(ICOUL)
  1873. c write (*,*) 'IPT6.LISOUS(',IND6,')' , IPT6.LISOUS(IND6)
  1874. c write (*,*) 'type', IPT4.ITYPEL, 'Nbel' , IPT4.num(/2)
  1875.  
  1876. IND7=IND7+1
  1877. IPT7.LISOUS(IND7) = IPT4.LISOUS(ICOUL)
  1878. ENDIF
  1879. ENDDO
  1880. ENDIF
  1881. 370 CONTINUE
  1882. NBELEM = 0
  1883. NBNN = 0
  1884. NBREF = 0
  1885. NBSOUS = IND7
  1886.  
  1887. SEGADJ IPT7
  1888.  
  1889. SEGINI LTYPE4
  1890. LTYPE4 = LTYPE3
  1891.  
  1892. c mise a jour du nombre global de relations
  1893. LCONF3 = MCONF
  1894.  
  1895. C=======================================================================
  1896. C Test sur la progression du raffinement
  1897. C=======================================================================
  1898. C
  1899. C CB215821 Retrait du caractere *MOD le cas echeant
  1900. SEGACT IPT5,MCHPO1,MSOUPO,MPOVA1,IPT3,KMILIE
  1901. c SEGSUP ICPR,KARETE,KARPOS,KARET2,ICHPO,IDENSI
  1902. c SEGSUP ICPR,KARETE,KARPOS,KARET2,IDENSI
  1903. SEGSUP ICPR,KARETE,KARPOS,KARET2
  1904. SEGSUP MCHAM1,MELVA1,MCHAM2,MELVA2,IMODE1
  1905. SEGSUP MMODE1,MCHEL1,MCHEL2
  1906.  
  1907. IF ((IDIM.EQ.3).AND.(NBOUCL.NE.1)) SEGSUP JPLANS,JPLAN2,JPLAN3,
  1908. +JPLCOM,JNOEFA,IWORK2,JFARAF, IPT9
  1909.  
  1910. C S'il y a eu a raffiner des elements lors de l'iteration courante,
  1911. C on passe a l'iteration suivante
  1912. C
  1913. c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  1914. c forcage : nb max itération de raff
  1915. c IF (NBOUCL.EQ.3) THEN
  1916. c KARAF2=0
  1917. c KARAF=0
  1918. c ENDIF
  1919. c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  1920. IF (KARAF2.NE.0) GOTO 9
  1921.  
  1922. C ### SORTIE TEMPORAIRE DU PROGRAMME ###
  1923. C Si on est a la premiere iteration de RAFF et qu'il n'y a pas
  1924. C d'elements a raffiner, on retourne en sortie le maillage de depart,
  1925. C donné en entree
  1926. IF ((KARAF2.EQ.0).AND.(NBOUCL.EQ.1)) THEN
  1927. WRITE(*,*) 'il n est pas necessaire de raffiner le maillage'
  1928. MELEME=IPT1
  1929. GOTO 998
  1930. ENDIF
  1931.  
  1932. C=======================================================================
  1933. C Mises a jour diverses
  1934. C=======================================================================
  1935. C ** On affecte une densite a chaque noeud que l'on a cree
  1936. c DO 37 I=NPTINI+1,XCOOR(/1)/(IDIM+1)
  1937. c XCOOR(I*(IDIM+1))=DENSI(ICPR(I,1))
  1938. c 37 CONTINUE
  1939.  
  1940. C=======================================================================
  1941. C Fin du programme
  1942. C=======================================================================
  1943.  
  1944. MELEME=IPT7
  1945.  
  1946. SEGSUP XDEN
  1947. 998 CONTINUE
  1948.  
  1949. CALL ACTOBJ('MAILLAGE',MELEME,1)
  1950. CALL ECROBJ('MAILLAGE',MELEME)
  1951.  
  1952. c RETURN
  1953. END
  1954.  
  1955.  
  1956.  

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