Télécharger contou.eso

Retour à la liste

Numérotation des lignes :

contou
  1. C CONTOU SOURCE GOUNAND 21/04/07 21:15:01 10943
  2. ************************************************************************
  3. * NOM : CONTOU
  4. * DESCRIPTION : Construit le contour d'un objet maillage
  5. * (fonctionne suivant un principe inspire de TRAC)
  6. * Cette version est une adaptation de l'opérateur standard adapté
  7. * aux besoins du mailleur topologique :
  8. * * Pas de passage en numérotation locale : déjà fait plus haut
  9. * * Pas de LIROBJ, ECROBJ, LIRMOT : passage des arguments
  10. * * deux entiers IELDEB et IELFIN précisant les éléments du maillage
  11. * desquels on va calculer le contour (sous-entendu maillage simple
  12. * à un seul type d'élément)
  13. * * Plus tard : segment KON initialisé et détruit par ailleurs
  14. * et recyclé pour plusieurs appels à CONT
  15. *
  16. ************************************************************************
  17. * APPELE PAR : topv3.eso, prcont.eso (dans le futur)
  18. ************************************************************************
  19. C VERSION : v1, 16/11/2017, version initiale
  20. C HISTORIQUE : v1, 16/11/2017, création
  21. C HISTORIQUE :
  22. C HISTORIQUE :
  23. C***********************************************************************
  24. ************************************************************************
  25. SUBROUTINE CONTOU(MELINI,IELDEB,IELFIN,ICPR,IDCP,ITE,IMOT1,IMOT2
  26. $ ,MELCON)
  27.  
  28. IMPLICIT INTEGER(I-N)
  29.  
  30. -INC PPARAM
  31. -INC CCOPTIO
  32. -INC CCGEOME
  33. -INC SMELEME
  34. POINTEUR MELCON.MELEME
  35. -INC SMCOORD
  36. -INC CCASSIS
  37.  
  38. SEGMENT ICPR(nbpts)
  39. SEGMENT IDCP(ITE)
  40. SEGMENT KON(NBCON,NMAX,3)
  41.  
  42. CHARACTER*8 CHAIN1
  43.  
  44. MELEME=MELINI
  45. igr=nbpts+1
  46.  
  47.  
  48. * REMPLISSAGE DU TABLEAU DE CONNECTIVITE VIA LES ARETES KON(I,J,K)
  49. * ******************************************************************
  50. * => KON(I,J,K) CONTIENT LES INFORMATIONS ASSOCIEES A LA I-EME
  51. * ARETE CONNECTEE AU J-EME NOEUD (NUMEROTATION LOCALE)
  52. * K=1 NOEUD A L'AUTRE EXTREMITE DE L'ARETE
  53. * K=2 NOEUD MILIEU (=1 POUR LES ELT D'ORDRE 1)
  54. * K=3 DESIGNE LA COULEUR DE L'ARETE + 1
  55. *
  56. * => I EST COMPRIS ENTRE 1 ET NBCON=7, OR IL PEUT Y AVOIR BEAUCOUP
  57. * PLUS D'ARETES CONNECTEES A UN NOEUD J DONNE
  58. * SOLUTION : LA 7EME ARETE EST STOCKEE DANS DANS KON(1,L,K) AVEC
  59. * L=KON(7,J,1) ET AINSI DE SUITE POUR LES SUIVANTES
  60. * (CE QUI EXPLIQUE QUE J VARIE DE 1 A NMAX>ITE)
  61. *
  62. * => LE SIGNE DEVANT LE NUMERO DU NOEUD MILIEU (K=2) PEUT ETRE
  63. * POSITIF OU NEGATIF SELON LE SENS DE PARCOURS DU CONTOUR
  64. *
  65. * => LA DEUXIEME FOIS QU'UNE ARETE EST RENCONTREE, LE NUMERO DU
  66. * NOEUD D'EXTREMITE (K=1) DEVIENT NEGATIF => ARETE HORS CONTOUR
  67. *
  68. * => LA TROISIEME FOIS QU'UNE ARETE EST RECONTREE, LE NUMERO DE LA
  69. * COULEUR (K=3) DEVIENT NEGATIF => CONTOUR INTERNE DETECTE
  70. * ******************************************************************
  71. NBCON=7
  72. NBCONR=NBCON-1
  73. NMAX=(10*ITE)/NBCON
  74. SEGINI,KON
  75.  
  76. * NBNN designe le nombre de noeuds par arete (type = SEG2 ou SEG3)
  77. * COMPT est incremente des qu'on recontre un nouveau type de segment
  78. NBNN=0
  79. COMPT=0
  80.  
  81. * ICHAIN est l'indice J "apres debordement" permettant de definir
  82. * plus de 6 aretes pour un meme noeud
  83. ICHAIN=ITE
  84.  
  85. * BOUCLE SUR LES SOUS-MAILLAGES ELEMENTAIRES
  86. IPT1=MELEME
  87. DO 30 IO=1,MAX(1,LISOUS(/1))
  88. IF (LISOUS(/1).NE.0) IPT1=LISOUS(IO)
  89.  
  90. K=IPT1.ITYPEL
  91.  
  92. * Le test ci-dessous filtre les sous-maillages non surfaciques
  93. IF (K.NE.KSURF(K)) GOTO 21
  94.  
  95. * Reperage des indices de debut/fin de parcours de tous les
  96. * noeuds de la face (tableau LFAC)
  97. KK=LTEL(2,K)
  98. ITYP=LDEL(1,KK)
  99. IF (NBNN.NE.KDEGRE(K)) THEN
  100. NBNN=KDEGRE(K)
  101. COMPT=COMPT+1
  102. ENDIF
  103. IPAS=NBNN-1
  104. IDEP=LDEL(2,KK)
  105. IF (ITYP.NE.6) THEN
  106. IFEP=IDEP+KDFAC(1,ITYP)-1
  107. * [SG 2016-07-11] Pour les faces TRI7 et QUA9, on ignore le
  108. * dernier point (centre de la face)
  109. IF (ITYP.EQ.7.OR.ITYP.EQ.8) IFEP=IFEP-1
  110. ELSE
  111. * Cas particulier de l'element POLYgone
  112. IFEP= IDEP+IPT1.NUM(/1)-1
  113. ENDIF
  114.  
  115. * PARCOURS DES NOEUDS SOMMETS DE TOUS LES ELEMENTS
  116. * goo
  117. IF (LISOUS(/1).EQ.0.AND.IELDEB.GT.0.AND.IELFIN.GT.0) THEN
  118. ILDEB=IELDEB
  119. ILFIN=IELFIN
  120. ELSE
  121. ILDEB=1
  122. ILFIN=IPT1.NUM(/2)
  123. ENDIF
  124. * goo DO 22 I=1,IPT1.NUM(/2)
  125. DO 22 I=ILDEB,ILFIN
  126. DO 221 J=IDEP,IFEP,IPAS
  127.  
  128. * DETERMINATION DES CARACTERISTIQUES DE L'ARETE
  129. * => NI=sommet courant
  130. * => NJ=sommet a l'autre extremite de l'arete
  131. * => NMIL=noeud milieu si existant (ou alors IGR)
  132. * => KSCOL=couleur+1
  133. NMIL=IGR
  134. * (VALEUR QUI PERMET DE DISTINGUER SEG2 ET SEG3 CAR LE
  135. * igr n'est pas un numero de noeud possible
  136. * goo N1=ICPR(IPT1.NUM(LFAC(J),I))
  137. IF (ICPR.NE.0) THEN
  138. N1=ICPR(IPT1.NUM(LFAC(J),I))
  139. ELSE
  140. N1=IPT1.NUM(LFAC(J),I)
  141. ENDIF
  142. JSUIV=J+IPAS
  143. IF (JSUIV.GT.IFEP) JSUIV=IDEP
  144. * goo N2=ICPR(IPT1.NUM(LFAC(JSUIV),I))
  145. IF (ICPR.NE.0) THEN
  146. N2=ICPR(IPT1.NUM(LFAC(JSUIV),I))
  147. ELSE
  148. N2=IPT1.NUM(LFAC(JSUIV),I)
  149. ENDIF
  150.  
  151. IF (IPAS.EQ.2) NMIL=IPT1.NUM(LFAC(J+1),I)
  152. NI=N1
  153. NJ=N2
  154. IF (N1*N2.EQ.0) THEN
  155. CALL ERREUR(26)
  156. * goo SEGSUP,KON,ICPR,IDCP
  157. * goo SEGDES,MELEME
  158. SEGSUP,KON
  159. RETURN
  160. ENDIF
  161. KSCOL=IPT1.ICOLOR(I)+1
  162.  
  163. * PARCOURS DU TABLEAU KON POUR Y AJOUTER L'ARETE COURANTE,
  164. * OU POUR INDIQUER QU'ON L'A VUE 2 OU 3 FOIS
  165. * (en cas d'ajout, IPO permet d'ajouter aussi dans KON
  166. * l'arete parcourue en sens inverse)
  167. IPO=0
  168. 23 CONTINUE
  169.  
  170. * On cherche si l'arete existe deja, ou bien sinon la
  171. * premiere place libre pour l'ajouter
  172. 24 DO 25 K=1,NBCONR
  173. IF (KON(K,NI,1).EQ.0) GOTO 26
  174. IF (ABS(KON(K,NI,1)).EQ.NJ.AND.
  175. > ABS(KON(K,NI,2)).EQ.abs(NMIL)) GOTO 27
  176. 25 CONTINUE
  177. * Au-dela de I=6 : soit on a trouve une place libre, soit
  178. * on continue a parcourir KON a l'indice J de "debordement"
  179. * (car il y a deja au moins 7 aretes associees a NI)
  180. IF (KON(NBCON,NI,1).EQ.0) GOTO 28
  181. NI=KON(NBCON,NI,1)
  182. GOTO 24
  183.  
  184. * ON AVAIT DEJA RENCONTRE CETTE ARETE...
  185. 27 CONTINUE
  186. IF (KON(K,NI,1).GT.0) THEN
  187. * ...UNE SEULE FOIS => ON L'EXCLUT DU CONTOUR
  188. KON(K,NI,1)=-NJ
  189. ELSE
  190. * ...AU MOINS 2 FOIS => ON L'AJOUTE AU CONTOUR INTERNE
  191. KON(K,NI,3)=-KSCOL
  192. ENDIF
  193. GOTO 29
  194.  
  195. * ARETE JAMAIS RENCONTREE : AJOUT A LA PREMIERE PLACE LIBRE
  196. 26 KON(K,NI,1)=NJ
  197. KON(K,NI,2)=NMIL
  198. KON(K,NI,3)=KSCOL
  199. GOTO 29
  200.  
  201. * ARETE JAMAIS RENCONTREE, MAIS LA PREMIERE PLACE LIBRE
  202. * SE TROUVE DANS LE PROCHAIN BLOC DE 6
  203. 28 ICHAIN=ICHAIN+1
  204. IF (ICHAIN.GE.NMAX) THEN
  205. NMAX=NMAX*2
  206. SEGADJ,KON
  207. ENDIF
  208. KON(NBCON,NI,1)=ICHAIN
  209. K=1
  210. NI=ICHAIN
  211. GOTO 26
  212.  
  213. * A CHAQUE FOIS QU'UNE NOUVELLE ARETE EST RENCONTREE, ON
  214. * AJOUTE AUSSI DANS KON CELLE PARCOURUE EN SENS INVERSE
  215. 29 IF (IPO.EQ.1) GOTO 221
  216. NMIL=-NMIL
  217. NI=N2
  218. NJ=N1
  219. IPO=1
  220. GOTO 23
  221. 221 CONTINUE
  222. 22 CONTINUE
  223.  
  224. 21 CONTINUE
  225.  
  226. 30 CONTINUE
  227.  
  228. * WARNING : contour complexe detecte (SEG2 et SEG3)
  229. IF (COMPT.GT.1) CALL ERREUR(-333)
  230.  
  231. * ####################################################
  232. * IMPRESSIONS POUR DEBUGAGE (OPTI 'IMPI')
  233. IF (IIMPI.NE.0) THEN
  234.  
  235. IF (ICPR.NE.0) THEN
  236. * CONTENU DU TABLEAU ICPR
  237. WRITE(IOIMP,FMT='("ICPR(",I7,")=",I7)')(I,ICPR(I),I=1,ICPR(
  238. $ /1))
  239. WRITE(IOIMP,*) '********************'
  240. ENDIF
  241.  
  242. IF (IDCP.NE.0) THEN
  243. * CONTENU DU TABLEAU IDCP
  244. WRITE(IOIMP,FMT='("IDCP(",I7,")=",I7)')(I,IDCP(I),I=1,IDCP(
  245. $ /1))
  246. WRITE(IOIMP,*) '********************'
  247. ENDIF
  248.  
  249. * CONTENU DU TABLEAU KON
  250. IF (IIMPI.EQ.2) THEN
  251. DO J=1,NMAX
  252. WRITE(IOIMP,FMT='(A,I7,A,I7)') 'J=',J,'/',NMAX
  253. WRITE(IOIMP,FMT='(3I7)') ((KON(I,J,K),K=1,3),I=1,NBCON)
  254. ENDDO
  255. ENDIF
  256.  
  257. * ON VERIFIE SI CHAQUE NOEUD DU CONTOUR EST BIEN RELIE UNIQUEMENT
  258. * A DEUX ELEMENTS
  259. NNOEUD=0
  260. CHAIN1='NODE'
  261. DO 70 NI=1,ITE
  262. NINTT=NI
  263. NKON=0
  264. 72 CONTINUE
  265. DO 71 J=1,NBCONR
  266. IF (KON(J,NINTT,1).EQ.0) GOTO 71
  267. IF (KON(J,NINTT,1).GT.0) NKON=NKON+1
  268. 71 CONTINUE
  269. IF (KON(NBCON,NINTT,1).NE.0) THEN
  270. NINTT=KON(NBCON,NINTT,1)
  271. GOTO 72
  272. ENDIF
  273. IF (NKON.GT.2) THEN
  274. NNOEUD=NNOEUD+1
  275. JP1=IDCP(NI)
  276. NNO=NNOEUD
  277. IF (NNO.LE.9) THEN
  278. WRITE(CHAIN1(5:5),FMT='(I1)') NNO
  279. ELSEIF(NNO.LE.99) THEN
  280. WRITE(CHAIN1(5:6),FMT='(I2)') NNO
  281. ELSEIF(NNO.LE.999) THEN
  282. WRITE(CHAIN1(5:7),FMT='(I3)') NNO
  283. ELSEIF(NNO.LE.9999) THEN
  284. WRITE(CHAIN1(5:8),FMT='(I4)') NNO
  285. ELSEIF(NNO.LE.99999) THEN
  286. WRITE(CHAIN1(4:8),FMT='(I5)') NNO
  287. ELSEIF(NNO.LE.999999) THEN
  288. WRITE(CHAIN1(3:8),FMT='(I6)') NNO
  289. ENDIF
  290. CALL NOMOBJ('POINT',CHAIN1,JP1)
  291. MOTERR(1:8)=CHAIN1
  292. INTERR(1)=NKON
  293. CALL ERREUR(-335)
  294. ENDIF
  295. 70 CONTINUE
  296.  
  297. ENDIF
  298. * ####################################################
  299.  
  300. * goo SEGDES,MELEME
  301. * goo SEGSUP,ICPR
  302.  
  303.  
  304. * CREATION DU MAILLAGE CONTENANT LE CONTOUR
  305. * *****************************************
  306.  
  307.  
  308. * ON COMMENCE PAR COMPTER LE NOMBRE D'ELEMENTS DU CONTOUR
  309. NBELEM2=0
  310. NBELEM3=0
  311. DO 41 J=1,ITE
  312. JJ=J
  313. 43 DO 42 I=1,NBCONR
  314. KON1=KON(I,JJ,1)
  315. KON3=KON(I,JJ,3)
  316. if (kon1.eq.0) goto 42
  317. IF ((IMOT1.EQ.3.AND.KON1.LT.0.AND.KON3.GT.0)
  318. & .OR.(IMOT1.EQ.2.AND.(KON1.GT.0.OR.KON3.GT.0))
  319. & .OR.(IMOT1.EQ.1.AND.KON1.LT.0)) GOTO 42
  320. * noeud milieu or not noeud milieu?
  321. if (abs(kon(i,jj,2)).eq.igr) then
  322. nbelem2=nbelem2+1
  323. else
  324. nbelem3=nbelem3+1
  325. endif
  326. 42 CONTINUE
  327. IF (KON(NBCON,JJ,1).EQ.0) GOTO 41
  328. JJ=KON(NBCON,JJ,1)
  329. GOTO 43
  330. 41 CONTINUE
  331. * on a compte les aretes une fois dans chaque sens
  332. NBELEM2=NBELEM2/2
  333. NBELEM3=NBELEM3/2
  334. IF (IIMPI.NE.0) WRITE(IOIMP,1111) NBELEM2,nbelem3
  335. 1111 FORMAT(' NOMBRE D''ELEMENTS DU CONTOUR : ',2I6)
  336.  
  337. IF (NBELEM2+nbelem3.EQ.0) THEN
  338. IF (IMOT2.EQ.0) THEN
  339. MELEME=0
  340. CALL ERREUR(26)
  341. GOTO 64
  342. ELSE
  343. NBELEM=0
  344. NBNN=2
  345. NBSOUS=0
  346. NBREF=0
  347. SEGINI MELEME
  348. ITYPEL=NBNN
  349. GOTO 66
  350. ENDIF
  351. ENDIF
  352.  
  353. * CREATION DES meleme elementaires
  354. NBELem=nbelem2
  355. NBNN=2
  356. NBSOUS=0
  357. NBREF=0
  358. if (nbelem.ne.0) then
  359. SEGINI,IPT2
  360. ipt2.ITYPEL=NBNN
  361. endif
  362. NBELem=nbelem3
  363. NBNN=3
  364. if (nbelem.ne.0) then
  365. SEGINI,IPT3
  366. ipt3.ITYPEL=NBNN
  367. endif
  368.  
  369. * REMPLISSAGE SELON L'OPTION IMOT1 DEMANDEE (EXTE, INTE, TOUT)
  370. IEL2=0
  371. IEL3=0
  372.  
  373. * Recherche d'une arete pas encore ajoutee au contour
  374. KAUX=0
  375. 53 KAUX=KAUX+1
  376. IF (KAUX.EQ.ITE+1) GOTO 63
  377. KPRESS=KAUX
  378. ideb=1
  379. * Recherche de l'arete suivante
  380. 57 CONTINUE
  381. DO 56 L=1,NBCONR
  382. M=KON(L,K,1)
  383. IF (M.EQ.0) GOTO 56
  384. M2=KON(L,K,2)
  385. ** IF (M2.LT.0) GOTO 56
  386. M3=KON(L,K,3)
  387. IF ((IMOT1.EQ.1.AND.M.LT.0) .OR.
  388. & (IMOT1.EQ.2.AND.(M.GT.0.OR.M3.GT.0)))GOTO 56
  389. IF (IMOT1.EQ.3.AND.M.LT.0.AND.M3.GT.0) GOTO 56
  390. GOTO 58
  391. 56 CONTINUE
  392. K=KON(NBCON,K,1)
  393. IF (K.EQ.0) GOTO 53
  394. GOTO 57
  395.  
  396. * Ajout d'un element SEG2 ou SEG3 joignant KPRESS a M
  397. 58 CONTINUE
  398. IF (ABS(M2).eq.IGR) then
  399. iel2=iel2+1
  400. * write (6,*) 'iel2 nbelem2 ',iel2,nbelem2,m,m2,m3
  401. if (iel2.GT.nbelem2) then
  402. call erreur(5)
  403. return
  404. endif
  405. * goo
  406. if (idcp.ne.0) then
  407. ipt2.NUM(1,IEL2)=IDCP(KPRESS)
  408. ipt2.NUM(2,IEL2)=IDCP(abs(m))
  409. else
  410. ipt2.NUM(1,IEL2)=KPRESS
  411. ipt2.NUM(2,IEL2)=abs(m)
  412. endif
  413. ipt2.icolor(iel2)=abs(m3)-1
  414. ELSE
  415. iel3=iel3+1
  416. ** write (6,*) 'iel3 nbelem3 ',iel3,nbelem3,m,m2,m3
  417. if (iel3.GT.nbelem3) then
  418. call erreur(5)
  419. return
  420. endif
  421. * goo
  422. if (idcp.ne.0) then
  423. ipt3.NUM(1,IEL3)=IDCP(KPRESS)
  424. IPT3.NUM(2,IEL3)=ABS(M2)
  425. ipt3.NUM(3,IEL3)=IDCP(abs(m))
  426. else
  427. ipt3.NUM(1,IEL3)=KPRESS
  428. IPT3.NUM(2,IEL3)=ABS(M2)
  429. ipt3.NUM(3,IEL3)=abs(m)
  430. endif
  431. ipt3.icolor(iel3)=abs(m3)-1
  432. ENDIF
  433.  
  434. * On met a 0 KON(*,*,1) pour indiquer que l'element
  435. * a deja ete ajoute au contour
  436.  
  437. KON(L,K,1)=0
  438. ** write (6,*) 'mise a zero directe ',l,k
  439. * Idem, pour l'arete parcourue en sens inverse...
  440. M1=ABS(M)
  441. 59 DO 60 L=1,NBCONR
  442. IF (ABS(KON(L,M1,2)).NE.ABS(M2)) GOTO 60
  443. IF (KON(L,M1,1).EQ.0) GOTO 60
  444. IF (ABS(KON(L,M1,1)).EQ.KPRESS) GOTO 61
  445. 60 CONTINUE
  446. M1=KON(NBCON,M1,1)
  447. IF (M1.EQ.0) then
  448. ** write (6,*) ' rien a mettre a zero apres 60 '
  449. GOTO 62
  450. endif
  451. GOTO 59
  452. 61 KON(L,M1,1)=0
  453. ** write (6,*) 'mise a zero inverse ',l,m1
  454. 62 CONTINUE
  455. * si on est en debut de chaine, on inverse eventuellement l'arete
  456. if (ideb.eq.1.and.m2.lt.0) then
  457. if (abs(m2).eq.IGR) then
  458. it=ipt2.num(1,iel2)
  459. ipt2.num(1,iel2)=ipt2.num(2,iel2)
  460. ipt2.num(2,iel2)=it
  461. else
  462. it=ipt3.num(1,iel3)
  463. ipt3.num(1,iel3)=ipt3.num(3,iel3)
  464. ipt3.num(3,iel3)=it
  465. endif
  466. else
  467. KPRESS=abs(m)
  468. endif
  469. * ...puis on continue de suivre le contour
  470. ideb=0
  471. GOTO 57
  472. 63 CONTINUE
  473. *
  474. * on cree le chapeau correct si il y a lieu
  475. *
  476. * write (6,*) ' nbelem2, iel2, nbelem3 =', nbelem2, iel2, nbelem3
  477. if (nbelem2.eq.0) then
  478. if (iel3.lt.nbelem3) then
  479. NBNN=2
  480. NBELEM=iel3
  481. NBSOUS=0
  482. NBREF=0
  483. segadj,ipt3
  484. endif
  485. meleme=ipt3
  486. elseif(nbelem3.eq.0) then
  487. if (iel2.lt.nbelem2) then
  488. NBNN=2
  489. NBELEM=iel2
  490. NBSOUS=0
  491. NBREF=0
  492. segadj,ipt2
  493. endif
  494. meleme=ipt2
  495. else
  496. if (iel2.lt.nbelem2) then
  497. NBNN=2
  498. NBELEM=iel2
  499. NBSOUS=0
  500. NBREF=0
  501. segadj,ipt2
  502. endif
  503. if (iel3.lt.nbelem3) then
  504. NBNN=2
  505. NBELEM=iel3
  506. NBSOUS=0
  507. NBREF=0
  508. segadj,ipt3
  509. endif
  510. nbnn=0
  511. nbelem=0
  512. nbsous=2
  513. nbref=0
  514. segini meleme
  515. lisous(1)=ipt2
  516. lisous(2)=ipt3
  517. endif
  518. 66 continue
  519. 64 CONTINUE
  520. MELCON=MELEME
  521. SEGSUP,KON
  522. RETURN
  523. END
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  

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