Télécharger voro2.eso

Retour à la liste

Numérotation des lignes :

voro2
  1. C VORO2 SOURCE CB215821 20/11/25 13:42:39 10792
  2. C
  3. SUBROUTINE VORO2(IPT1,IPT2,DDMAX,MCHPOI,MTAB1)
  4. C----------------------------------------------------------------------C
  5. C Decoupage de la partition de Voronoi selon C
  6. C un contour (2D) ou une enveloppe (3D) C
  7. C C
  8. C IPT1 = maillage de POI1, centres des cellules C
  9. C IPT2 = maillage contour/enveloppe limitant la partition de C
  10. C Voronoi C
  11. C XZERO = Zero relatif a la taille de la partition a creer. C
  12. C Utile pour considerer deux sommets de cellule de Voronoi C
  13. C confondus afin de supprimer les aretes trop petites C
  14. C MTAB1 = table contenant le maillage des cellules de Voronoi non C
  15. C coupees, obtenue avec VORO1. C
  16. C C
  17. C MTAB1 est modifiee pour correspondre a la nouvelle C
  18. C partition de Voronoi restreinte par IPT2 C
  19. C C
  20. C L'algorithme utilise pour la decoupe est issu de : C
  21. C Yan D-M et al. Efficient computation of clipped Voronoi diagram for C
  22. C mesh generation, Computer-Aided Design (2011) C
  23. C C
  24. C----------------------------------------------------------------------C
  25. IMPLICIT INTEGER(I-N)
  26. IMPLICIT REAL*8 (A-H,O-Z)
  27. -INC SMCHPOI
  28.  
  29. -INC PPARAM
  30. -INC CCOPTIO
  31. -INC SMELEME
  32. -INC SMCOORD
  33. -INC CCGEOME
  34. -INC SMLENTI
  35. -INC SMLREEL
  36. -INC SMTABLE
  37. LOGICAL BOOL1,BOOL2,BOOL3,BOOL4,BOOL5,BOOL6,BOOL7,BOOL8,BOOL9
  38. C Listes d'entiers utilisees un peu partout
  39. POINTEUR LV1.MLENTI,LV2.MLENTI,LV3.MLENTI,LV4.MLENTI,LV5.MLENTI
  40. POINTEUR LV6.MLENTI
  41. POINTEUR LC.MLENTI,LT.MLENTI
  42. C Tables, maillages et listes pour la table de sortie
  43. POINTEUR MTAB11.MTABLE,IPTG.MELEME,MTABC.MTABLE,MTABI1.MTABLE
  44. POINTEUR IPTI1.MELEME,LFI1.MLENTI,IPTVI1.MELEME,MTABF.MTABLE
  45. POINTEUR IPTF1.MELEME,LA1.MLENTI,MTABA.MTABLE,IPTA1.MELEME
  46. POINTEUR MTABI2.MTABLE,IPTI2.MELEME,IPTVI2.MELEME
  47. C Tables, maillages et listes intermediaires
  48. POINTEUR MTAB10.MTABLE,IPTG0.MELEME,MTABCC.MTABLE,MTABI0.MTABLE
  49. POINTEUR IPTI0.MELEME,LFI0.MLENTI,IPTVI0.MELEME,MTABFF.MTABLE
  50. POINTEUR MTABF0.MTABLE,IPTF0.MELEME,LA0.MLENTI,MTABAA.MTABLE
  51. POINTEUR IPTA0.MELEME
  52. POINTEUR LA2.MLENTI,LA3.MLENTI
  53. C Tables, maillages et listes pour la table d'entree
  54. POINTEUR MTABCCC.MTABLE,MTABI00.MTABLE,MTABJ00.MTABLE
  55. POINTEUR LFI00.MLENTI,LFJ00.MLENTI,MTABFFF.MTABLE
  56. POINTEUR MTABF100.MTABLE,IPTVI00.MELEME
  57. POINTEUR LA00.MLENTI,LA000.MLENTI,MTABAAA.MTABLE
  58. C Liste de flottants (pour les coordonnees barycentriques des
  59. C points internes)
  60. POINTEUR LZ1.MLREEL
  61. C Tableau destine a decrire les elements adjacents de l'enveloppe
  62. SEGMENT,MADJACEN
  63. INTEGER LEAC(NBL1,IDIM,2)
  64. ENDSEGMENT
  65. POINTEUR ILEA1.MADJACEN
  66. C Tableau d'entiers a deux dimensions
  67. SEGMENT,MVORO
  68. INTEGER LACT(N1,N2)
  69. ENDSEGMENT
  70. POINTEUR ITL1.MVORO,ITARE1.MVORO,ITFAC1.MVORO
  71. C
  72. C Tableau de flottants a deux dimensions
  73. SEGMENT,MVORO2
  74. REAL*8 XACT(N1,N2)
  75. ENDSEGMENT
  76. POINTEUR LTL1.MVORO2,LTL2.MVORO2
  77. C
  78. CHARACTER*8 CHARIN,CHARRE
  79. LOGICAL LOGIN ,LOGRE
  80. C
  81. C
  82. IVALIN=0
  83. IVALRE=0
  84. XVALIN=0.D0
  85. XVALRE=0.D0
  86. CHARIN=' '
  87. CHARRE=' '
  88. LOGIN =.FALSE.
  89. LOGRE =.FALSE.
  90.  
  91.  
  92. IDIMP1=IDIM+1
  93. NBSOUS=0
  94. NBREF=0
  95. C
  96. C ZERO & ZERO2 : tolerances pour eliminer noeuds confondus,
  97. C aretes coplanaires...
  98. XTOL = DDMAX*1.D-10
  99. ZERO=1D-14*DDMAX
  100. ZERO2=1D-10*DDMAX
  101. segact mcoord*mod
  102. C
  103. C----------------------------------------------------------------------C
  104. C PARTIE 1 : Pre-traitement C
  105. C - creation d'une table des elements adjacents du maillage C
  106. C contour/enveloppe IPT2 --> ILEA1 C
  107. C----------------------------------------------------------------------C
  108. C Le tableau ILEA1.LEAC comporte 3 dimensions : ILEA1.LEAC(I,J,K)
  109. C dimension 1 : I est le numero de l'element du contour/enveloppe
  110. C dimension 2 : J est le numero du noeud de l'element I
  111. C dimension 3 : K=1 --> renvoie le numero de l'element adjacent a
  112. C l'element I par rapport au noeud J
  113. C K=2 --> renvoie le numero du noeud de l'element
  114. C adjacent situe en vis a vis du noeud J
  115. C On a donc les symetries suivantes :
  116. C si ILEA1.LEAC(I,J,1) = I' et ILEA1.LEAC(I,J,2) = J'
  117. C alors ILEA1.LEAC(I',J',1) = I et ILEA1.LEAC(I',J',2) = J
  118. C
  119. C Initialisation de la table des elements adjacents
  120. NBL1=IPT2.NUM(/2)
  121. NBL2=IPT2.NUM(/1)
  122. SEGINI,ILEA1
  123. JG=IPT2.NUM(/1)
  124. SEGINI,LV1
  125. C Nombre de noeuds en commun a trouver
  126. NNREF=IPT2.NUM(/1)-1
  127. C Somme des numeros des noeuds
  128. IF (IDIM.EQ.2) THEN
  129. NSREF=1+2
  130. ELSE
  131. NSREF=1+2+3
  132. ENDIF
  133. C Boucle sur les elements de IPT2
  134. DO I=1,IPT2.NUM(/2)
  135. C Numeros des noeuds de l'element I
  136. DO J=1,IPT2.NUM(/1)
  137. LV1.LECT(J)=IPT2.NUM(J,I)
  138. ENDDO
  139. C Deuxieme boucle sur les elements de numero superieurs a I
  140. DO II=I+1,IPT2.NUM(/2)
  141. NNC=0
  142. NSOMA=0
  143. NSOMB=0
  144. C Test si l'element II a des noeuds communs a l'element I
  145. DO J=1,IPT2.NUM(/1)
  146. NTEST=IPT2.NUM(J,II)
  147. DO K=1,IPT2.NUM(/1)
  148. IF (NTEST.EQ.LV1.LECT(K)) THEN
  149. NNC=NNC+1
  150. NSOMA=NSOMA+K
  151. NSOMB=NSOMB+J
  152. ENDIF
  153. ENDDO
  154. ENDDO
  155. C Si l'element II est bien adjacent a l'element I
  156. IF (NNC.EQ.NNREF) THEN
  157. NI=NSREF-NSOMA
  158. NII=NSREF-NSOMB
  159. ILEA1.LEAC(I,NI,1)=II
  160. ILEA1.LEAC(I,NI,2)=NII
  161. ILEA1.LEAC(II,NII,1)=I
  162. ILEA1.LEAC(II,NII,2)=NI
  163. ENDIF
  164. ENDDO
  165. C Test si on a bien trouve un voisin pour chaque cote de I
  166. DO J=1,IPT2.NUM(/1)
  167. IF (ILEA1.LEAC(I,J,1).EQ.0) THEN
  168. C Le contour n'est pas reconnu ferme
  169. CALL ERREUR(28)
  170. GOTO 999
  171. ENDIF
  172. ENDDO
  173. ENDDO
  174. C
  175. C
  176. C----------------------------------------------------------------------C
  177. C PARTIE 2 C
  178. C Construction de la surface externe de la partition de Voronoi C
  179. C par decoupage en parcourant la surface enveloppe C
  180. C----------------------------------------------------------------------C
  181. C
  182. IF (IDIM.EQ.2) THEN
  183. C Idee : on parcoure les segments de l'enveloppe et pour chacun
  184. C d'eux on determine son intersection avec la partition de
  185. C Voronoi
  186. C On construit ainsi la liste des couples (Ti;Ci) possedant une
  187. C intersection non vide
  188. C Ti : le numero de segment dans IPT2
  189. C Ci : le numero de la cellule dans IPT1
  190. C La liste des couples (Ti;Ci) a traiter est incrementee au fur
  191. C et a mesure des rencontres
  192. C
  193. C------- Etape 1 : Initialisations
  194. C Initialisation d'une file pour les Ci et Tj
  195. C on utilise deux listes d'entiers LT et LC
  196. JG=(IPT2.NUM(/2))*(IPT1.NUM(/2))
  197. SEGINI,LT,LC
  198. C On demarre sur le premier segment de l'enveloppe
  199. NLT=1
  200. NT0=1
  201. LT.LECT(NLT)=NT0
  202. C Recherche d'une cellule intersectant le segment NT0, on prend
  203. C celle dont le centre est le plus proche du barycentre du
  204. C segment NT0
  205. NRA=IPT2.NUM(1,NT0)
  206. NRB=IPT2.NUM(2,NT0)
  207. XG=((XCOOR((NRA-1)*IDIMP1+1))+(XCOOR((NRB-1)*IDIMP1+1)))/2.
  208. YG=((XCOOR((NRA-1)*IDIMP1+2))+(XCOOR((NRB-1)*IDIMP1+2)))/2.
  209. DO NCJ=1,IPT1.NUM(/2)
  210. NRCJ=IPT1.NUM(1,NCJ)
  211. XCJ=XCOOR((NRCJ-1)*IDIMP1+1)
  212. YCJ=XCOOR((NRCJ-1)*IDIMP1+2)
  213. DJG=SQRT(((XCJ-XG)*(XCJ-XG))+((YCJ-YG)*(YCJ-YG)))
  214. IF (NCJ.EQ.1) THEN
  215. DJG0=DJG
  216. NCJ0=NCJ
  217. NRCJ0=NRCJ
  218. ENDIF
  219. IF (DJG.LT.DJG0) THEN
  220. DJG0=DJG
  221. NCJ0=NCJ
  222. NRCJ0=NRCJ
  223. ENDIF
  224. ENDDO
  225. LC.LECT(NLT)=NCJ0
  226. C Initialisation d'une table pour les couples (Ti,Ci)
  227. N1=IPT2.NUM(/2)
  228. N2=IPT1.NUM(/2)
  229. SEGINI,ITL1
  230. ITL1.LACT(NT0,NCJ0)=1
  231. C Maillage global IPTG des aretes de la partition coupee
  232. NBNN=2
  233. NBELEM=200
  234. SEGINI,IPTG
  235. IPTG.ITYPEL=2
  236. NBELEG=0
  237. C Liste de tous les points ajoutes a MCOORD suite au decoupage
  238. JG=0
  239. SEGINI,LV1
  240. NLV1=0
  241. C Maillage global IPT6 des centres des cellules dans la
  242. C partition coupee
  243. NBNN=1
  244. NBELEM=IPT1.NUM(/2)
  245. SEGINI,IPT6
  246. IPT6.ITYPEL=1
  247. NBELE6=0
  248. C Table de sortie MTAB11
  249. CALL CRTABL(MTAB11)
  250. CALL CRTABL(MTABC)
  251. CALL CRTABL(MTABA)
  252. CALL ECCTAB(MTAB11,'MOT ',0,0,'VISU',0,0,
  253. & 'MAILLAGE',0,0,0,0,IPTG)
  254. CALL ECCTAB(MTAB11,'MOT ',0,0,'CELL',0,0,
  255. & 'TABLE ',0,0,0,0,MTABC)
  256. CALL ECCTAB(MTAB11,'MOT ',0,0,'ARTS',0,0,
  257. & 'TABLE ',0,0,0,0,MTABA)
  258. C
  259. C------- Etape 2 : Calcul des intersections
  260. C Maintenant que la file (LT,LC) est non vide, on debute
  261. C les iterations. Pour chaque couple, on determine le segment
  262. C d'intersection et on le range dans la table de sortie.
  263. C On incremente egalement la file avec les cellules voisines et
  264. C les segments voisins du segment d'intersection
  265. C Les iterations s'arretent lorsque la file est vide
  266. C
  267. C Tables des cellules et des aretes non coupees
  268. CALL ACCTAB(MTAB1,'MOT ',0,0,'CELL',0,0,
  269. & 'TABLE ',0,0,0,0,MTABCCC)
  270. CALL ACCTAB(MTAB1,'MOT ',0,0,'ARTS',0,0,
  271. & 'TABLE ',0,0,0,0,MTABAAA)
  272. C Debut de la boucle sur la file (LT,LC)
  273. NB1=IPT1.NUM(/2)*IPT2.NUM(/2)
  274. DO I=1,NB1
  275. C Test d'arret de la boucle (la file est vide)
  276. IF (I.GT.NLT) THEN
  277. GOTO 35
  278. ENDIF
  279. C NTI designe le numero de segment dans IPT2
  280. NTI=LT.LECT(I)
  281. C NCI designe le numero la cellule dans IPT1
  282. NCI=LC.LECT(I)
  283. C NRCI designe le numero du point centre de la cellule NCI
  284. NRCI=IPT1.NUM(1,NCI)
  285. C Creation d'un indice NRCI dans la table MTAB11.CELL
  286. C si besoin
  287. CALL ECROBJ('POINT ',NRCI)
  288. CALL ECROBJ('TABLE ',MTABC)
  289. CALL EXIS
  290. CALL LIRLOG(BOOL1,1,IRETOU)
  291. IF (BOOL1) THEN
  292. C Si MTAB11.CELL.NRCI existe, on va le chercher
  293. CALL ACCTAB(MTABC,'POINT ',0,0,' ',0,NRCI,
  294. & 'TABLE ',0,0,0,0,MTABI1)
  295. C Recuperation des indices VISU, ARTS et VOIS
  296. CALL ACCTAB(MTABI1,'MOT ',0,0,'VISU',0,0,
  297. & 'MAILLAGE',0,0,0,0,IPTI1)
  298. CALL ACCTAB(MTABI1,'MOT ',0,0,'ARTS',0,0,
  299. & 'LISTENTI',0,0,0,0,LA1)
  300. CALL ACCTAB(MTABI1,'MOT ',0,0,'VOIS',0,0,
  301. & 'MAILLAGE',0,0,0,0,IPTVI1)
  302. ELSE
  303. C Sinon, on cree un nouvel indice
  304. CALL CRTABL(MTABI1)
  305. CALL ECCTAB(MTABC,'POINT ',0,0,' ',0,NRCI,
  306. & 'TABLE ',0,0,0,0,MTABI1)
  307. C Initialisation des indices VISU, ARTS et VOIS
  308. NBNN=2
  309. NBELEM=0
  310. SEGINI,IPTI1
  311. IPTI1.ITYPEL=2
  312. CALL ECCTAB(MTABI1,'MOT ',0,0,'VISU',0,0,
  313. & 'MAILLAGE',0,0,0,0,IPTI1)
  314. JG=0
  315. SEGINI,LA1
  316. CALL ECCTAB(MTABI1,'MOT ',0,0,'ARTS',0,0,
  317. & 'LISTENTI',0,0,0,0,LA1)
  318. NBNN=1
  319. NBELEM=0
  320. SEGINI,IPTVI1
  321. IPTVI1.ITYPEL=1
  322. CALL ECCTAB(MTABI1,'MOT ',0,0,'VOIS',0,0,
  323. & 'MAILLAGE',0,0,0,0,IPTVI1)
  324. NBELE6=NBELE6+1
  325. IPT6.NUM(1,NBELE6)=NRCI
  326. ENDIF
  327. C Determination de l'intersection entre le segment NTI et
  328. C le polygone NCI
  329. C Clipping selon l'algorithme de Sutherland et Hodgman
  330. C Le segment resultant de l'intersection est decrit par la
  331. C table LTL1 avec :
  332. C LTL1.XACT(i,j) = coordonnee j du i-eme noeud du segment
  333. C i valant 1 ou 2
  334. C --> initialisation de LTL1 aux noeuds du segment NTI
  335. NRTI1=IPT2.NUM(1,NTI)
  336. NRTI2=IPT2.NUM(2,NTI)
  337. N1=2
  338. N2=3
  339. SEGINI,LTL1
  340. XI10=XCOOR((NRTI1-1)*IDIMP1+1)
  341. YI10=XCOOR((NRTI1-1)*IDIMP1+2)
  342. XI20=XCOOR((NRTI2-1)*IDIMP1+1)
  343. YI20=XCOOR((NRTI2-1)*IDIMP1+2)
  344. LTL1.XACT(1,1)=XI10
  345. LTL1.XACT(1,2)=YI10
  346. LTL1.XACT(2,1)=XI20
  347. LTL1.XACT(2,2)=YI20
  348. C --> table du polygone NRCI infini (MTABI0)
  349. CALL ACCTAB(MTABCCC,'POINT ',0,0,' ',0,NRCI,
  350. & 'TABLE ',0,0,0,0,MTABI00)
  351. C --> liste de ses aretes
  352. CALL ACCTAB(MTABI00,'MOT ',0,0,'ARTS',0,0,
  353. & 'LISTENTI',0,0,0,0,LA00)
  354. C --> maillage de ses voisins
  355. CALL ACCTAB(MTABI00,'MOT ',0,0,'VOIS',0,0,
  356. & 'MAILLAGE',0,0,0,0,IPT3)
  357. C Boucle sur toutes les aretes du polygone NCI
  358. DO J=1,LA00.LECT(/1)
  359. C Maillage IPT4 de l'arete J du polygone NCI
  360. NFJ=LA00.LECT(J)
  361. CALL ACCTAB(MTABAAA,'ENTIER ',NFJ,0,' ',0,0,
  362. & 'MAILLAGE',0,0,0,0,IPT4)
  363. NREFA=IPT4.NUM(1,1)
  364. NREFB=IPT4.NUM(2,1)
  365. C Massicotage du segment LTL1 selon le demi plan definit
  366. C la ligne IPT4 et le centre I du polygone de Voronoi
  367. C Coordonnees des points P1 et P2
  368. X1=LTL1.XACT(1,1)
  369. Y1=LTL1.XACT(1,2)
  370. X2=LTL1.XACT(2,1)
  371. Y2=LTL1.XACT(2,2)
  372. C Intersection du segment P1P2 avec le demi plan
  373. CALL INTPSEG2(NREFA,NREFB,NRCI,X1,Y1,X2,Y2,
  374. & IINT,XI1,YI1,XI2,YI2)
  375. C Il y a 2 cas possibles
  376. C -1) l'intersection est vide --> erreur
  377. IF (IINT.EQ.0) THEN
  378. C WRITE(6,*) '> Intersection segment/polygone vide'
  379. C WRITE(6,*) 'Numero du segment concerne:',nti
  380. C WRITE(6,*) 'Point de la cellule concernee',nrci
  381. INTERR(1)=nti
  382. INTERR(2)=nrci
  383. CALL ERREUR(1032)
  384. GOTO 999
  385. ENDIF
  386. C -2) l'intersection n'est pas vide
  387. IF (IINT.EQ.1) THEN
  388. LTL1.XACT(1,1)=XI1
  389. LTL1.XACT(1,2)=YI1
  390. LTL1.XACT(2,1)=XI2
  391. LTL1.XACT(2,2)=YI2
  392. ENDIF
  393. ENDDO
  394. C
  395. C
  396. C Maintenant, on va incrementer la file (LT,LC)
  397. C avec les intersections voisines
  398. C
  399. C Extremite 1 du segment d'intersection LTL1
  400. XI1=LTL1.XACT(1,1)
  401. YI1=LTL1.XACT(1,2)
  402. C 1er cas : P1 correspond l'extremite 1 du segment NTI
  403. C donc le segment adjacent a NTI coupe aussi la
  404. C cellule NCI
  405. IF ((XI1.EQ.XI10).AND.(YI1.EQ.YI10)) THEN
  406. NTVI=ILEA1.LEAC(NTI,2,1)
  407. C On a trouve le segment NTVI coupant la cellule NCI
  408. C On verifie que le couple (NTVI,NCI) n'a pas deja
  409. C ete traite et on l'ajoute a la file
  410. IF (ITL1.LACT(NTVI,NCI).EQ.0) THEN
  411. ITL1.LACT(NTVI,NCI)=1
  412. NLT=NLT+1
  413. LT.LECT(NLT)=NTVI
  414. LC.LECT(NLT)=NCI
  415. ENDIF
  416. C 2eme cas : P1 est un point d'intersection
  417. C donc le polygone voisin coupe le segment NTI
  418. ELSE
  419. C Recherche du polygone voisin en question
  420. C Boucle sur voisins du polygone NCI (on ne s'interesse
  421. C qu'aux aretes internes)
  422. DO J=1,IPT3.NUM(/2)
  423. NRCJ=IPT3.NUM(1,J)
  424. C Liste des aretes du polyedre NRCJ
  425. CALL ACCTAB(MTABCCC,'POINT ',0,0,' ',0,NRCJ,
  426. & 'TABLE ',0,0,0,0,MTABJ00)
  427. CALL ACCTAB(MTABJ00,'MOT ',0,0,'ARTS',0,0,
  428. & 'LISTENTI',0,0,0,0,LA000)
  429. C Recherche du numero de l'arete entre NRCI et NRCJ
  430. C cette arete est a la fois dans LA00 et LA000
  431. NAJ=0
  432. DO K=1,LA00.LECT(/1)
  433. NAJ=LA00.LECT(K)
  434. DO L=1,LA000.LECT(/1)
  435. IF (LA000.LECT(L).EQ.NAJ) GOTO 27
  436. ENDDO
  437. ENDDO
  438. 27 CONTINUE
  439. C Maillage IPT5 de l'arete J
  440. CALL ACCTAB(MTABAAA,'ENTIER ',NAJ,0,' ',0,0,
  441. & 'MAILLAGE',0,0,0,0,IPT5)
  442. C Points AB definissant l'arete IPT5
  443. NRA=IPT5.NUM(1,1)
  444. NRB=IPT5.NUM(2,1)
  445. XA=XCOOR((NRA-1)*IDIMP1+1)
  446. YA=XCOOR((NRA-1)*IDIMP1+2)
  447. XB=XCOOR((NRB-1)*IDIMP1+1)
  448. YB=XCOOR((NRB-1)*IDIMP1+2)
  449. C Test si P1 est situe entre A et B
  450. DA1=SQRT(((XA-XI1)**2)+((YA-YI1)**2))
  451. DB1=SQRT(((XB-XI1)**2)+((YB-YI1)**2))
  452. DAB=SQRT(((XA-XB)**2)+((YA-YB)**2))
  453. DTEST=(DA1+DB1-DAB)/DAB
  454. IF (DTEST.LT.ZERO2) THEN
  455. C NRCJ est bien le voisin de NRCI qui coupe aussi NTI
  456. C Identification de la cellule associee au point NRCJ
  457. NCJ=0
  458. DO K=1,IPT1.NUM(/2)
  459. NRTEST=IPT1.NUM(1,K)
  460. IF (NRTEST.EQ.NRCJ) THEN
  461. NCJ=K
  462. GOTO 28
  463. ENDIF
  464. ENDDO
  465. ENDIF
  466. ENDDO
  467. C Si on passe ici c'est que l'on a pas trouve la cellule
  468. C voisine partageant l'arete
  469. C WRITE(6,*) ' > Cellule voisine non trouvee'
  470. INTERR(1)=NRCI
  471. INTERR(2)=NAJ
  472. CALL ERREUR(1034)
  473. GOTO 999
  474. 28 CONTINUE
  475. C On a trouve la cellule NCJ coupant le segment NTI
  476. C On verifie que le couple (NTI,NCJ) n'a pas deja
  477. C ete traite et on l'ajoute a la file
  478. IF (ITL1.LACT(NTI,NCJ).EQ.0) THEN
  479. ITL1.LACT(NTI,NCJ)=1
  480. NLT=NLT+1
  481. LT.LECT(NLT)=NTI
  482. LC.LECT(NLT)=NCJ
  483. ENDIF
  484. ENDIF
  485. C
  486. C Extremite 2 du segment d'intersection LTL1
  487. XI2=LTL1.XACT(2,1)
  488. YI2=LTL1.XACT(2,2)
  489. C 1er cas : P2 correspond l'extremite 2 du segment NTI
  490. C donc le segment adjacent a NTI coupe aussi la
  491. C cellule NCI
  492. IF ((XI2.EQ.XI20).AND.(YI2.EQ.YI20)) THEN
  493. NTVI=ILEA1.LEAC(NTI,1,1)
  494. C On a trouve le segment NTVI coupant la cellule NCI
  495. C On verifie que le couple (NTVI,NCI) n'a pas deja
  496. C ete traite et on l'ajoute a la file
  497. IF (ITL1.LACT(NTVI,NCI).EQ.0) THEN
  498. ITL1.LACT(NTVI,NCI)=1
  499. NLT=NLT+1
  500. LT.LECT(NLT)=NTVI
  501. LC.LECT(NLT)=NCI
  502. ENDIF
  503. C 2eme cas : P2 est un point d'intersection
  504. C donc le polygone voisin coupe le segment NTI
  505. ELSE
  506. C Recherche du polygone voisin en question
  507. C Boucle sur voisins du polygone NCI (on ne s'interesse
  508. C qu'aux aretes internes)
  509. DO J=1,IPT3.NUM(/2)
  510. NRCJ=IPT3.NUM(1,J)
  511. C Liste des aretes du polyedre NRCJ
  512. CALL ACCTAB(MTABCCC,'POINT ',0,0,' ',0,NRCJ,
  513. & 'TABLE ',0,0,0,0,MTABJ00)
  514. CALL ACCTAB(MTABJ00,'MOT ',0,0,'ARTS',0,0,
  515. & 'LISTENTI',0,0,0,0,LA000)
  516. C Recherche du numero de l'arete entre NRCI et NRCJ
  517. C cette arete est a la fois dans LA00 et LA000
  518. NAJ=0
  519. DO K=1,LA00.LECT(/1)
  520. NAJ=LA00.LECT(K)
  521. DO L=1,LA000.LECT(/1)
  522. IF (LA000.LECT(L).EQ.NAJ) GOTO 29
  523. ENDDO
  524. ENDDO
  525. 29 CONTINUE
  526. C Maillage IPT5 de l'arete J du polygone NCI
  527. CALL ACCTAB(MTABAAA,'ENTIER ',NAJ,0,' ',0,0,
  528. & 'MAILLAGE',0,0,0,0,IPT5)
  529. C Points AB definissant l'arete IPT5
  530. NRA=IPT5.NUM(1,1)
  531. NRB=IPT5.NUM(2,1)
  532. XA=XCOOR((NRA-1)*IDIMP1+1)
  533. YA=XCOOR((NRA-1)*IDIMP1+2)
  534. XB=XCOOR((NRB-1)*IDIMP1+1)
  535. YB=XCOOR((NRB-1)*IDIMP1+2)
  536. C Test si P2 est situe entre A et B
  537. DA2=SQRT(((XA-XI2)**2)+((YA-YI2)**2))
  538. DB2=SQRT(((XB-XI2)**2)+((YB-YI2)**2))
  539. DAB=SQRT(((XA-XB)**2)+((YA-YB)**2))
  540. DTEST=(DA2+DB2-DAB)/DAB
  541. IF (DTEST.LT.ZERO2) THEN
  542. C NRCJ est bien le voisin de NRCI qui coupe aussi NTI
  543. C Identification de la cellule associee au point NRCJ
  544. NCJ=0
  545. DO K=1,IPT1.NUM(/2)
  546. NRTEST=IPT1.NUM(1,K)
  547. IF (NRTEST.EQ.NRCJ) THEN
  548. NCJ=K
  549. GOTO 30
  550. ENDIF
  551. ENDDO
  552. ENDIF
  553. ENDDO
  554. C Si on passe ici c'est que l'on a pas trouve la cellule
  555. C voisine partageant l'arete
  556. C WRITE(6,*) ' > Cellule voisine non trouvee'
  557. INTERR(1)=NRCI
  558. INTERR(2)=NAJ
  559. CALL ERREUR(1034)
  560. GOTO 999
  561. 30 CONTINUE
  562. C On a trouve la cellule NCJ coupant le segment NTI
  563. C On verifie que le couple (NTI,NCJ) n'a pas deja
  564. C ete traite et on l'ajoute a la file
  565. IF (ITL1.LACT(NTI,NCJ).EQ.0) THEN
  566. ITL1.LACT(NTI,NCJ)=1
  567. NLT=NLT+1
  568. LT.LECT(NLT)=NTI
  569. LC.LECT(NLT)=NCJ
  570. ENDIF
  571. ENDIF
  572. C
  573. C Determination des noeuds P1 et P2 de l'arete
  574. C Doit on creer de nouveaux noeuds ?
  575. C On examine la liste LV1 des noeuds crees
  576. C test si P1 est deja present ou non dans LV1
  577. BOOL2=.FALSE.
  578. DO L=1,LV1.LECT(/1)
  579. NRL=LV1.LECT(L)
  580. XL=XCOOR((NRL-1)*IDIMP1+1)
  581. YL=XCOOR((NRL-1)*IDIMP1+2)
  582. IF ((ABS(XL-XI1).LT.XTOL).AND.
  583. & (ABS(YL-YI1).LT.XTOL)) THEN
  584. BOOL2=.TRUE.
  585. NRP1=NRL
  586. GOTO 31
  587. ENDIF
  588. ENDDO
  589. IF (.NOT.BOOL2) THEN
  590. C ajout d'un nouveau noeud dans MCOORD
  591. NRP1=nbpts+1
  592. NBPTS=NRP1
  593. SEGADJ,MCOORD
  594. XCOOR((NRP1-1)*IDIMP1+1)=XI1
  595. XCOOR((NRP1-1)*IDIMP1+2)=YI1
  596. NLV1=NLV1+1
  597. IF (NLV1.GT.LV1.LECT(/1)) THEN
  598. JG=NLV1
  599. SEGADJ,LV1
  600. ENDIF
  601. LV1.LECT(NLV1)=NRP1
  602. ENDIF
  603. 31 CONTINUE
  604. C test si P2 est deja present ou non dans LV1
  605. BOOL2=.FALSE.
  606. DO L=1,LV1.LECT(/1)
  607. NRL=LV1.LECT(L)
  608. XL=XCOOR((NRL-1)*IDIMP1+1)
  609. YL=XCOOR((NRL-1)*IDIMP1+2)
  610. IF ((ABS(XL-XI2).LT.XTOL).AND.
  611. & (ABS(YL-YI2).LT.XTOL)) THEN
  612. BOOL2=.TRUE.
  613. NRP2=NRL
  614. GOTO 32
  615. ENDIF
  616. ENDDO
  617. IF (.NOT.BOOL2) THEN
  618. C ajout d'un nouveau noeud dans MCOORD
  619. NRP2=nbpts+1
  620. NBPTS=NRP2
  621. SEGADJ,MCOORD
  622. XCOOR((NRP2-1)*IDIMP1+1)=XI2
  623. XCOOR((NRP2-1)*IDIMP1+2)=YI2
  624. NLV1=NLV1+1
  625. IF (NLV1.GT.LV1.LECT(/1)) THEN
  626. JG=NLV1
  627. SEGADJ,LV1
  628. ENDIF
  629. LV1.LECT(NLV1)=NRP2
  630. ENDIF
  631. 32 CONTINUE
  632. C Test sur l'existence de l'arete P1 P2 dans IPTG
  633. IAE=0
  634. DO L=1,NBELEG
  635. NG1=IPTG.NUM(1,L)
  636. NG2=IPTG.NUM(2,L)
  637. IF (((NG1.EQ.NRP1).AND.(NG2.EQ.NRP2)).OR.
  638. & ((NG2.EQ.NRP1).AND.(NG1.EQ.NRP2))) THEN
  639. C si l'arete P1 P2 a deja ete creee, on
  640. C l'indique au moyen de IAE
  641. IAE=1
  642. NAE=L
  643. GOTO 33
  644. ENDIF
  645. ENDDO
  646. 33 CONTINUE
  647. C --> Ajout de l'arete dans MTAB11.VISU
  648. IF (IAE.EQ.0) THEN
  649. NBELEG=NBELEG+1
  650. IPTG.NUM(1,NBELEG)=NRP1
  651. IPTG.NUM(2,NBELEG)=NRP2
  652. IF (NBELEG.EQ.IPTG.NUM(/2)) THEN
  653. NBNN=IPTG.NUM(/1)
  654. NBELEM=IPTG.NUM(/2)+100
  655. SEGADJ,IPTG
  656. ENDIF
  657. NAE=NBELEG
  658. ENDIF
  659. C --> Ajout de l'arete dans MTAB11.ARTS
  660. IF (IAE.EQ.0) THEN
  661. NBNN=2
  662. NBELEM=1
  663. SEGINI,IPTA1
  664. IPTA1.ITYPEL=2
  665. IPTA1.NUM(1,1)=NRP1
  666. IPTA1.NUM(2,1)=NRP2
  667. CALL ECCTAB(MTABA,'ENTIER ',NAE,0,' ',0,0,
  668. & 'MAILLAGE',0,0,0,0,IPTA1)
  669. ENDIF
  670. C --> Ajout de l'arete dans MTAB11.CELL.NRCI si besoin
  671. DO L=1,LA1.LECT(/1)
  672. NAL=LA1.LECT(L)
  673. IF (NAL.EQ.NAE) GOTO 34
  674. ENDDO
  675. C dans le maillage de la cellule
  676. NBNN=IPTI1.NUM(/1)
  677. NBELEM=IPTI1.NUM(/2)+1
  678. SEGADJ,IPTI1
  679. IPTI1.NUM(1,NBELEM)=NRP1
  680. IPTI1.NUM(2,NBELEM)=NRP2
  681. C et la liste des aretes de la cellule
  682. JG=LA1.LECT(/1)+1
  683. SEGADJ,LA1
  684. LA1.LECT(JG)=NAE
  685. 34 CONTINUE
  686. ENDDO
  687. 35 CONTINUE
  688. C Ajustement du maillage global des centres des cellules dans la
  689. C partition coupee IPT6
  690. NBNN=IPT6.NUM(/1)
  691. NBELEM=NBELE6
  692. SEGADJ,IPT6
  693. C Ajustement du maillage global des aretes IPTG
  694. NBNN=IPTG.NUM(/1)
  695. NBELEM=NBELEG
  696. SEGADJ,IPTG
  697. C
  698. C
  699. C Fusion des aretes coplanaires (a faire)
  700. C
  701. C
  702. C
  703. ELSEIF (IDIM.EQ.3) THEN
  704. C Idee : on parcoure les triangles de l'enveloppe et pour chacun
  705. C d'eux on determine son intersection avec la partition de
  706. C Voronoi
  707. C On construit ainsi la liste des couples (Ti;Ci) possedant une
  708. C intersection non vide
  709. C Ti : le numero de triangle dans IPT2
  710. C Ci : le numero de la cellule dans IPT1
  711. C La liste des couples (Ti;Ci) a traiter est incrementee au fur
  712. C et a mesure des rencontres
  713. C
  714. C------- Etape 1 : Initialisations
  715. C Initialisation d'une file pour les Ci et Tj
  716. C on utilise deux listes d'entiers LT et LC
  717. JG=(IPT2.NUM(/2))*(IPT1.NUM(/2))
  718. SEGINI,LT,LC
  719. C On demarre sur le premier triangle de l'enveloppe
  720. NLT=1
  721. NT0=1
  722. LT.LECT(NLT)=NT0
  723. C Recherche d'une cellule intersectant le triangle NT0, on prend
  724. C celle dont le centre est le plus proche du barycentre du
  725. C triangle NT0
  726. NRA=IPT2.NUM(1,NT0)
  727. NRB=IPT2.NUM(2,NT0)
  728. NRC=IPT2.NUM(3,NT0)
  729. XG=((XCOOR((NRA-1)*IDIMP1+1))+(XCOOR((NRB-1)*IDIMP1+1))+
  730. & (XCOOR((NRC-1)*IDIMP1+1)))/3.
  731. YG=((XCOOR((NRA-1)*IDIMP1+2))+(XCOOR((NRB-1)*IDIMP1+2))+
  732. & (XCOOR((NRC-1)*IDIMP1+2)))/3.
  733. ZG=((XCOOR((NRA-1)*IDIMP1+3))+(XCOOR((NRB-1)*IDIMP1+3))+
  734. & (XCOOR((NRC-1)*IDIMP1+3)))/3.
  735. DO NCJ=1,IPT1.NUM(/2)
  736. NRCJ=IPT1.NUM(1,NCJ)
  737. XCJ=XCOOR((NRCJ-1)*IDIMP1+1)
  738. YCJ=XCOOR((NRCJ-1)*IDIMP1+2)
  739. ZCJ=XCOOR((NRCJ-1)*IDIMP1+3)
  740. DJG=SQRT(((XCJ-XG)*(XCJ-XG))+((YCJ-YG)*(YCJ-YG))+
  741. & ((ZCJ-ZG)*(ZCJ-ZG)))
  742. IF (NCJ.EQ.1) THEN
  743. DJG0=DJG
  744. NCJ0=NCJ
  745. NRCJ0=NRCJ
  746. ENDIF
  747. IF (DJG.LT.DJG0) THEN
  748. DJG0=DJG
  749. NCJ0=NCJ
  750. NRCJ0=NRCJ
  751. ENDIF
  752. ENDDO
  753. LC.LECT(NLT)=NCJ0
  754. C Initialisation d'une table pour les couples (Ti,Ci)
  755. N1=IPT2.NUM(/2)
  756. N2=IPT1.NUM(/2)
  757. SEGINI,ITL1
  758. ITL1.LACT(NT0,NCJ0)=1
  759. C Maillage global IPTG des aretes de la partition coupee
  760. NBNN=2
  761. NBELEM=200
  762. SEGINI,IPTG
  763. IPTG.ITYPEL=2
  764. NBELEG=0
  765. C Liste de tous les points ajoutes a MCOORD suite au decoupage
  766. JG=0
  767. SEGINI,LV1
  768. NLV1=0
  769. C Maillage global IPT6 des centres des cellules dans la
  770. C partition coupee
  771. NBNN=1
  772. NBELEM=IPT1.NUM(/2)
  773. SEGINI,IPT6
  774. IPT6.ITYPEL=1
  775. NBELE6=0
  776. C Table de sortie MTAB11
  777. CALL CRTABL(MTAB11)
  778. CALL CRTABL(MTABC)
  779. CALL CRTABL(MTABF)
  780. CALL CRTABL(MTABA)
  781. CALL ECCTAB(MTAB11,'MOT ',0,0,'VISU',0,0,
  782. & 'MAILLAGE',0,0,0,0,IPTG)
  783. CALL ECCTAB(MTAB11,'MOT ',0,0,'CELL',0,0,
  784. & 'TABLE ',0,0,0,0,MTABC)
  785. CALL ECCTAB(MTAB11,'MOT ',0,0,'FACS',0,0,
  786. & 'TABLE ',0,0,0,0,MTABF)
  787. CALL ECCTAB(MTAB11,'MOT ',0,0,'ARTS',0,0,
  788. & 'TABLE ',0,0,0,0,MTABA)
  789. C
  790. C------- Etape 2 : Calcul des intersections
  791. C Maintenant que la file (LT,LC) est non vide, on debute
  792. C les iterations. Pour chaque couple, on determine le polygone
  793. C d'intersection et on le range dans la table de sortie.
  794. C On incremente egalement la file avec les cellules voisines et
  795. C les triangles voisins du polygone d'intersection
  796. C Les iterations s'arretent lorsque la file est vide
  797. C
  798. C Tables des cellules et des faces non coupees
  799. CALL ACCTAB(MTAB1,'MOT ',0,0,'CELL',0,0,
  800. & 'TABLE ',0,0,0,0,MTABCCC)
  801. CALL ACCTAB(MTAB1,'MOT ',0,0,'FACS',0,0,
  802. & 'TABLE ',0,0,0,0,MTABFFF)
  803. C
  804. C NF : nombre de faces total dans la partition coupee
  805. NF=0
  806. C ITFAC1 : donne le numero de face pour chaque couple de cellules
  807. N1=IPT1.NUM(/2)
  808. N2=IPT1.NUM(/2)
  809. SEGINI,ITFAC1
  810. C On construit LV5 et LV6 qui donnent le couple de cellule
  811. C associe a chaque numero de face (inverse de ITFAC1)
  812. C LV5(f1)=ci et LV6(f1)=cj --> la face f1 est interne et separe
  813. C les cellules ci et cj
  814. C LV5(f1)=0 et LV6(f1)=0 --> la face f1 est externe
  815. JG=2*IPT2.NUM(/2)
  816. SEGINI,LV5,LV6
  817. C Debut de la boucle sur la file (LT,LC)
  818. NB1=IPT1.NUM(/2)*IPT2.NUM(/2)
  819. DO I=1,NB1
  820. C Test d'arret de la boucle (la file est vide)
  821. IF (I.GT.NLT) THEN
  822. GOTO 1
  823. ENDIF
  824. NF=NF+1
  825. C NTI designe le numero de triangle dans IPT2
  826. NTI=LT.LECT(I)
  827. C NCI designe le numero la cellule dans IPT1
  828. NCI=LC.LECT(I)
  829. C NRCI designe le numero du point centre de la cellule NCI
  830. NRCI=IPT1.NUM(1,NCI)
  831. C Creation d'un indice NRCI dans la table MTAB11.CELL
  832. C si besoin
  833. CALL ECROBJ('POINT ',NRCI)
  834. CALL ECROBJ('TABLE ',MTABC)
  835. CALL EXIS
  836. CALL LIRLOG(BOOL1,1,IRETOU)
  837. IF (BOOL1) THEN
  838. C Si MTAB11.CELL.NRCI existe, on va le chercher
  839. CALL ACCTAB(MTABC,'POINT ',0,0,' ',0,NRCI,
  840. & 'TABLE ',0,0,0,0,MTABI1)
  841. C Recuperation des indices VISU, FACS et VOIS
  842. CALL ACCTAB(MTABI1,'MOT ',0,0,'VISU',0,0,
  843. & 'MAILLAGE',0,0,0,0,IPTI1)
  844. CALL ACCTAB(MTABI1,'MOT ',0,0,'FACS',0,0,
  845. & 'LISTENTI',0,0,0,0,LFI1)
  846. CALL ACCTAB(MTABI1,'MOT ',0,0,'VOIS',0,0,
  847. & 'MAILLAGE',0,0,0,0,IPTVI1)
  848. ELSE
  849. C Sinon, on cree un nouvel indice
  850. CALL CRTABL(MTABI1)
  851. CALL ECCTAB(MTABC,'POINT ',0,0,' ',0,NRCI,
  852. & 'TABLE ',0,0,0,0,MTABI1)
  853. C Initialisation des indices VISU, FACS et VOIS
  854. NBNN=2
  855. NBELEM=0
  856. SEGINI,IPTI1
  857. IPTI1.ITYPEL=2
  858. CALL ECCTAB(MTABI1,'MOT ',0,0,'VISU',0,0,
  859. & 'MAILLAGE',0,0,0,0,IPTI1)
  860. JG=0
  861. SEGINI,LFI1
  862. CALL ECCTAB(MTABI1,'MOT ',0,0,'FACS',0,0,
  863. & 'LISTENTI',0,0,0,0,LFI1)
  864. NBNN=1
  865. NBELEM=0
  866. SEGINI,IPTVI1
  867. IPTVI1.ITYPEL=1
  868. CALL ECCTAB(MTABI1,'MOT ',0,0,'VOIS',0,0,
  869. & 'MAILLAGE',0,0,0,0,IPTVI1)
  870. NBELE6=NBELE6+1
  871. IPT6.NUM(1,NBELE6)=NRCI
  872. ENDIF
  873. C Determination de l'intersection entre le triangle NTI et
  874. C le polyedre NCI
  875. C Clipping selon l'algorithme de Sutherland et Hodgman
  876. C Le polygone resultant de l'intersection est decrit par la
  877. C table LTL1 avec :
  878. C LTL1.XACT(i,j) = coordonnee j du i-eme noeud du polygone
  879. C --> initialisation de LTL1 aux noeuds du triangle NTI
  880. NRTI1=IPT2.NUM(1,NTI)
  881. NRTI2=IPT2.NUM(2,NTI)
  882. NRTI3=IPT2.NUM(3,NTI)
  883. N1=3
  884. N2=3
  885. SEGINI,LTL1
  886. LTL1.XACT(1,1)=XCOOR((NRTI1-1)*IDIMP1+1)
  887. LTL1.XACT(1,2)=XCOOR((NRTI1-1)*IDIMP1+2)
  888. LTL1.XACT(1,3)=XCOOR((NRTI1-1)*IDIMP1+3)
  889. LTL1.XACT(2,1)=XCOOR((NRTI2-1)*IDIMP1+1)
  890. LTL1.XACT(2,2)=XCOOR((NRTI2-1)*IDIMP1+2)
  891. LTL1.XACT(2,3)=XCOOR((NRTI2-1)*IDIMP1+3)
  892. LTL1.XACT(3,1)=XCOOR((NRTI3-1)*IDIMP1+1)
  893. LTL1.XACT(3,2)=XCOOR((NRTI3-1)*IDIMP1+2)
  894. LTL1.XACT(3,3)=XCOOR((NRTI3-1)*IDIMP1+3)
  895. C --> table du polyedre NRCI (MTABI0)
  896. CALL ACCTAB(MTABCCC,'POINT ',0,0,' ',0,NRCI,
  897. & 'TABLE ',0,0,0,0,MTABI00)
  898. C --> liste des faces du polyedre NRCI
  899. CALL ACCTAB(MTABI00,'MOT ',0,0,'FACS',0,0,
  900. & 'LISTENTI',0,0,0,0,LFI00)
  901. C --> maillage IPT3 des voisins du polyedre NRCI
  902. CALL ACCTAB(MTABI00,'MOT ',0,0,'VOIS',0,0,
  903. & 'MAILLAGE',0,0,0,0,IPT3)
  904. C Boucle sur toutes les faces du polyedre NCI
  905. DO J=1,LFI00.LECT(/1)
  906. C Maillage IPT4 de la face J du polyedre NCI
  907. NFJ=LFI00.LECT(J)
  908. CALL ACCTAB(MTABFFF,'ENTIER ',NFJ,0,' ',0,0,
  909. & 'TABLE ',0,0,0,0,MTABF100)
  910. CALL ACCTAB(MTABF100,'MOT ',0,0,'VISU',0,0,
  911. & 'MAILLAGE',0,0,0,0,IPT4)
  912. NREFA=IPT4.NUM(1,1)
  913. NREFB=IPT4.NUM(1,2)
  914. NREFC=IPT4.NUM(1,3)
  915. C Massicotage du polygone LTL1 selon le demi espace definit
  916. C par le plan de IPT4 et le centre I du polyedre de Voronoi
  917. C Boucle sur les aretes du polygone LTL1
  918. C On utilise un polygone temporaire LTL2
  919. N1=LTL1.XACT(/1)+20
  920. N2=LTL1.XACT(/2)
  921. SEGINI,LTL2
  922. NLV2=0
  923. DO K=1,LTL1.XACT(/1)
  924. C Coordonnees des points P1 et P2
  925. X1=LTL1.XACT(K,1)
  926. Y1=LTL1.XACT(K,2)
  927. Z1=LTL1.XACT(K,3)
  928. IF (K.EQ.LTL1.XACT(/1)) THEN
  929. X2=LTL1.XACT(1,1)
  930. Y2=LTL1.XACT(1,2)
  931. Z2=LTL1.XACT(1,3)
  932. ELSE
  933. X2=LTL1.XACT(K+1,1)
  934. Y2=LTL1.XACT(K+1,2)
  935. Z2=LTL1.XACT(K+1,3)
  936. ENDIF
  937. C Intersection du segment P1P2 avec le demi plan ABC,I
  938. CALL INTPSEG(NREFA,NREFB,NREFC,NRCI,X1,Y1,Z1,X2,Y2,Z2,
  939. & IINT,XI1,YI1,ZI1,XI2,YI2,ZI2,ZERO)
  940. C Il y a 4 cas possibles
  941. C -1) le segment P1P2 est entierment hors du demi plan
  942. C on ajoute rien dans LTL2
  943. IF (IINT.EQ.0) THEN
  944. ENDIF
  945. C -2) le segment P1P2 rentre le demi plan
  946. C on ajoute le point d'intersection et P2 dans LTL2
  947. IF (IINT.EQ.1) THEN
  948. NLV2=NLV2+1
  949. LTL2.XACT(NLV2,1)=XI1
  950. LTL2.XACT(NLV2,2)=YI1
  951. LTL2.XACT(NLV2,3)=ZI1
  952. NLV2=NLV2+1
  953. LTL2.XACT(NLV2,1)=XI2
  954. LTL2.XACT(NLV2,2)=YI2
  955. LTL2.XACT(NLV2,3)=ZI2
  956. ENDIF
  957. C -3) le segment P1P2 est entierement dans le demi plan
  958. C on ajoute P2 dans LTL2
  959. IF (IINT.EQ.2) THEN
  960. NLV2=NLV2+1
  961. LTL2.XACT(NLV2,1)=XI2
  962. LTL2.XACT(NLV2,2)=YI2
  963. LTL2.XACT(NLV2,3)=ZI2
  964. ENDIF
  965. C -4) le segment P1P2 quitte le demi plan
  966. C on ajoute le point d'intersection dans LTL2
  967. IF (IINT.EQ.3) THEN
  968. NLV2=NLV2+1
  969. LTL2.XACT(NLV2,1)=XI2
  970. LTL2.XACT(NLV2,2)=YI2
  971. LTL2.XACT(NLV2,3)=ZI2
  972. ENDIF
  973. C Augmentation eventuelle de LTL2
  974. IF (NLV2.GE.(LTL2.XACT(/1)-1)) THEN
  975. N1=NLV2+20
  976. N2=LTL2.XACT(/2)
  977. SEGADJ,LTL2
  978. ENDIF
  979. ENDDO
  980. C Ajustement final de LTL2, ce polygone est l'intersection
  981. C de LTL1 avec le demi espace definit par la face J
  982. IF (NLV2.LT.3) THEN
  983. C WRITE(6,*) ' > Intersection triangle/cellule vide'
  984. C WRITE(6,*) 'NLV2=',nlv2
  985. C WRITE(6,*) 'Numero du triangle concerne:',nti
  986. C WRITE(6,*) 'Points de la face concernee',nrci,nrcj
  987. INTERR(1)=nti
  988. INTERR(2)=nrci
  989. CALL ERREUR(1033)
  990. GOTO 999
  991. ENDIF
  992. N1=NLV2
  993. N2=LTL2.XACT(/2)
  994. SEGADJ,LTL2
  995. C Le polygone LTL1 devient LTL2 puis on passe a la face
  996. C suivante
  997. LTL1=LTL2
  998. ENDDO
  999. C --> Elimination des "petites aretes" selon la tolerance XZERO
  1000. C on fusionne les sommets du polygonne LTL1 trop proches
  1001. N1=LTL1.XACT(/1)
  1002. N2=LTL1.XACT(/2)
  1003. SEGINI,LTL2
  1004. NLTL2=0
  1005. DO J=1,LTL1.XACT(/1)
  1006. JJ=J+1
  1007. IF (J.EQ.LTL1.XACT(/1)) JJ=1
  1008. X1=LTL1.XACT(J,1)
  1009. Y1=LTL1.XACT(J,2)
  1010. Z1=LTL1.XACT(J,3)
  1011. JJ=J+1
  1012. IF (J.EQ.LTL1.XACT(/1)) JJ=1
  1013. X2=LTL1.XACT(JJ,1)
  1014. Y2=LTL1.XACT(JJ,2)
  1015. Z2=LTL1.XACT(JJ,3)
  1016. D12=SQRT(((X2-X1)**2)+((Y2-Y1)**2)+((Z2-Z1)**2))
  1017. c-----------------------------------------------------------------------
  1018. c IF (D12.GE.XZERO) THEN
  1019. IF (D12.GE.XTOL) THEN
  1020. c-----------------------------------------------------------------------
  1021. NLTL2=NLTL2+1
  1022. LTL2.XACT(NLTL2,1)=X1
  1023. LTL2.XACT(NLTL2,2)=Y1
  1024. LTL2.XACT(NLTL2,3)=Z1
  1025. ENDIF
  1026. ENDDO
  1027. N1=NLTL2
  1028. N2=LTL2.XACT(/2)
  1029. SEGADJ,LTL2
  1030. LTL1=LTL2
  1031. C
  1032. C
  1033. C Maintenant, on va incrementer la file (LT,LC)
  1034. C avec les intersections voisines
  1035. C Au fur et a mesure que l'on identifie les aretes du polygone
  1036. C LTL1, on cree un maillage que l'on range dans MTAB11
  1037. C
  1038. C Nombre d'aretes identifiees (a comparer au nombre de points
  1039. C du polygone LTL1 pour verification)
  1040. NAI=0
  1041. C
  1042. C 1er cas : recherche des cellules voisines de NCI coupant le
  1043. C triangle NTI
  1044. NFF=NF
  1045. C Boucle sur voisins du polyedre NCI (on ne s'interesse qu'aux
  1046. C faces internes)
  1047. DO J=1,IPT3.NUM(/2)
  1048. NRCJ=IPT3.NUM(1,J)
  1049. C Liste des faces du polyedre NRCJ
  1050. CALL ACCTAB(MTABCCC,'POINT ',0,0,' ',0,NRCJ,
  1051. & 'TABLE ',0,0,0,0,MTABJ00)
  1052. CALL ACCTAB(MTABJ00,'MOT ',0,0,'FACS',0,0,
  1053. & 'LISTENTI',0,0,0,0,LFJ00)
  1054. C Recherche du numero de la face entre NRCI et NRCJ
  1055. C cette face est a la fois dans LFI00 et LFJ00
  1056. NFJ=0
  1057. DO K=1,LFI00.LECT(/1)
  1058. NFJ=LFI00.LECT(K)
  1059. DO L=1,LFJ00.LECT(/1)
  1060. IF (LFJ00.LECT(L).EQ.NFJ) GOTO 25
  1061. ENDDO
  1062. ENDDO
  1063. 25 CONTINUE
  1064. C Maillage IPT5 de la face J du polyedre NCI
  1065. CALL ACCTAB(MTABFFF,'ENTIER ',NFJ,0,' ',0,0,
  1066. & 'TABLE ',0,0,0,0,MTABF100)
  1067. CALL ACCTAB(MTABF100,'MOT ',0,0,'VISU',0,0,
  1068. & 'MAILLAGE',0,0,0,0,IPT5)
  1069. C Points ABC definissant le plan de la face IPT5
  1070. SEGINI,IPT7=IPT5
  1071. CALL CHANGE(IPT7,1)
  1072. NRA=IPT7.NUM(1,1)
  1073. NRB=IPT7.NUM(1,2)
  1074. XA=XCOOR((NRA-1)*IDIMP1+1)
  1075. YA=XCOOR((NRA-1)*IDIMP1+2)
  1076. ZA=XCOOR((NRA-1)*IDIMP1+3)
  1077. XB=XCOOR((NRB-1)*IDIMP1+1)
  1078. YB=XCOOR((NRB-1)*IDIMP1+2)
  1079. ZB=XCOOR((NRB-1)*IDIMP1+3)
  1080. C Boucle pour trouver un point C non aligne avec les points
  1081. C A et B
  1082. DO K=3,IPT7.NUM(/2)
  1083. NRC=IPT7.NUM(1,K)
  1084. XC=XCOOR((NRC-1)*IDIMP1+1)
  1085. YC=XCOOR((NRC-1)*IDIMP1+2)
  1086. ZC=XCOOR((NRC-1)*IDIMP1+3)
  1087. C Calcul d'un vecteur normal au plan (ABC)
  1088. XN=((YB-YA)*(ZC-ZA))-((ZB-ZA)*(YC-YA))
  1089. YN=((ZB-ZA)*(XC-XA))-((XB-XA)*(ZC-ZA))
  1090. ZN=((XB-XA)*(YC-YA))-((YB-YA)*(XC-XA))
  1091. DN=SQRT((XN**2)+(YN**2)+(ZN**2))
  1092. IF (DN.GE.ZERO2) GOTO 24
  1093. ENDDO
  1094. C Si l'on passe ici, c'est que l'on a pas trouve 3 points
  1095. C suffisament espaces pour definir le plan
  1096. C WRITE(6,*) '> Impossible de determiner l''equation du plan'
  1097. C WRITE(6,*) ' points alignes (1)'
  1098. INTERR(1)=NFJ
  1099. INTERR(2)=NRCI
  1100. CALL ERREUR(1035)
  1101. GOTO 999
  1102. 24 CONTINUE
  1103. XN=XN/DN
  1104. YN=YN/DN
  1105. ZN=ZN/DN
  1106. W=-1D0*((XN*XA)+(YN*YA)+(ZN*ZA))
  1107. C Recherche des aretes du polygone LTL1 dans le plan ABC
  1108. DO K=1,LTL1.XACT(/1)
  1109. IAE=0
  1110. C Coordonnees des points 41 et 42 de l'arete K
  1111. X41=LTL1.XACT(K,1)
  1112. Y41=LTL1.XACT(K,2)
  1113. Z41=LTL1.XACT(K,3)
  1114. IF (K.EQ.LTL1.XACT(/1)) THEN
  1115. X42=LTL1.XACT(1,1)
  1116. Y42=LTL1.XACT(1,2)
  1117. Z42=LTL1.XACT(1,3)
  1118. ELSE
  1119. X42=LTL1.XACT(K+1,1)
  1120. Y42=LTL1.XACT(K+1,2)
  1121. Z42=LTL1.XACT(K+1,3)
  1122. ENDIF
  1123. C Test si P41 et P42 sont dans le plan ABC
  1124. D41=(XN*X41)+(YN*Y41)+(ZN*Z41)+W
  1125. D42=(XN*X42)+(YN*Y42)+(ZN*Z42)+W
  1126. IF ((ABS(D41).LT.ZERO2).AND.(ABS(D42).LT.ZERO2)) THEN
  1127. C L'arete K du polygone LTL1 est dans le plan ABC
  1128. C Identification de la cellule associee au point NRCJ
  1129. NCJ=0
  1130. DO L=1,IPT1.NUM(/2)
  1131. NRTEST=IPT1.NUM(1,L)
  1132. IF (NRTEST.EQ.NRCJ) THEN
  1133. NCJ=L
  1134. GOTO 2
  1135. ENDIF
  1136. ENDDO
  1137. 2 CONTINUE
  1138. C On verifie que le couple (NTI,NCJ) n'a pas deja
  1139. C ete traite et on l'ajoute a la file
  1140. IF (ITL1.LACT(NTI,NCJ).EQ.0) THEN
  1141. ITL1.LACT(NTI,NCJ)=1
  1142. NLT=NLT+1
  1143. LT.LECT(NLT)=NTI
  1144. LC.LECT(NLT)=NCJ
  1145. ELSE
  1146. ENDIF
  1147. C Determination des noeuds P1 et P2 de l'arete
  1148. C Doit on creer de nouveaux noeuds ?
  1149. C LV2 liste des noeuds a examiner = LV1 et les
  1150. C noeuds de la face I,J
  1151. JG=LV1.LECT(/1)
  1152. SEGINI,LV2=LV1
  1153. JG=LV2.LECT(/1)+IPT5.NUM(/2)
  1154. SEGADJ,LV2
  1155. NLV2=LV1.LECT(/1)
  1156. DO L=1,IPT5.NUM(/2)
  1157. NLV2=NLV2+1
  1158. LV2.LECT(NLV2)=IPT5.NUM(1,L)
  1159. ENDDO
  1160. C test si P1 est deja present ou non dans LV2
  1161. BOOL2=.FALSE.
  1162. DO L=1,LV2.LECT(/1)
  1163. NRL=LV2.LECT(L)
  1164. XL=XCOOR((NRL-1)*IDIMP1+1)
  1165. YL=XCOOR((NRL-1)*IDIMP1+2)
  1166. ZL=XCOOR((NRL-1)*IDIMP1+3)
  1167. IF ((ABS(XL-X41).LT.XTOL).AND.
  1168. & (ABS(YL-Y41).LT.XTOL).AND.
  1169. & (ABS(ZL-Z41).LT.XTOL)) THEN
  1170. BOOL2=.TRUE.
  1171. NRP1=NRL
  1172. GOTO 4
  1173. ENDIF
  1174. ENDDO
  1175. IF (.NOT.BOOL2) THEN
  1176. C ajout d'un nouveau noeud dans MCOORD
  1177. NRP1=nbpts+1
  1178. NBPTS=NRP1
  1179. SEGADJ,MCOORD
  1180. XCOOR((NRP1-1)*IDIMP1+1)=X41
  1181. XCOOR((NRP1-1)*IDIMP1+2)=Y41
  1182. XCOOR((NRP1-1)*IDIMP1+3)=Z41
  1183. NLV1=NLV1+1
  1184. IF (NLV1.GT.LV1.LECT(/1)) THEN
  1185. JG=NLV1
  1186. SEGADJ,LV1
  1187. ENDIF
  1188. LV1.LECT(NLV1)=NRP1
  1189. ENDIF
  1190. 4 CONTINUE
  1191. C test si P2 est deja present ou non dans LV2
  1192. BOOL2=.FALSE.
  1193. DO L=1,LV2.LECT(/1)
  1194. NRL=LV2.LECT(L)
  1195. XL=XCOOR((NRL-1)*IDIMP1+1)
  1196. YL=XCOOR((NRL-1)*IDIMP1+2)
  1197. ZL=XCOOR((NRL-1)*IDIMP1+3)
  1198. IF ((ABS(XL-X42).LT.XTOL).AND.
  1199. & (ABS(YL-Y42).LT.XTOL).AND.
  1200. & (ABS(ZL-Z42).LT.XTOL)) THEN
  1201. BOOL2=.TRUE.
  1202. NRP2=NRL
  1203. GOTO 5
  1204. ENDIF
  1205. ENDDO
  1206. IF (.NOT.BOOL2) THEN
  1207. C ajout d'un nouveau noeud dans MCOORD
  1208. NRP2=nbpts+1
  1209. NBPTS=NRP2
  1210. SEGADJ,MCOORD
  1211. XCOOR((NRP2-1)*IDIMP1+1)=X42
  1212. XCOOR((NRP2-1)*IDIMP1+2)=Y42
  1213. XCOOR((NRP2-1)*IDIMP1+3)=Z42
  1214. NLV1=NLV1+1
  1215. IF (NLV1.GT.LV1.LECT(/1)) THEN
  1216. JG=NLV1
  1217. SEGADJ,LV1
  1218. ENDIF
  1219. LV1.LECT(NLV1)=NRP2
  1220. ENDIF
  1221. 5 CONTINUE
  1222. C Test sur l'existence de l'arete P1 P2 dans IPTG
  1223. DO L=1,NBELEG
  1224. NG1=IPTG.NUM(1,L)
  1225. NG2=IPTG.NUM(2,L)
  1226. IF (((NG1.EQ.NRP1).AND.(NG2.EQ.NRP2)).OR.
  1227. & ((NG2.EQ.NRP1).AND.(NG1.EQ.NRP2))) THEN
  1228. C si l'arete P1 P2 a deja ete creee, on
  1229. C l'indique au moyen de IAE
  1230. IAE=1
  1231. NAE=L
  1232. GOTO 21
  1233. ENDIF
  1234. ENDDO
  1235. 21 CONTINUE
  1236. C --> Ajout de l'arete dans MTAB11.VISU
  1237. IF (IAE.EQ.0) THEN
  1238. NBELEG=NBELEG+1
  1239. IPTG.NUM(1,NBELEG)=NRP1
  1240. IPTG.NUM(2,NBELEG)=NRP2
  1241. IF (NBELEG.EQ.IPTG.NUM(/2)) THEN
  1242. NBNN=IPTG.NUM(/1)
  1243. NBELEM=IPTG.NUM(/2)+100
  1244. SEGADJ,IPTG
  1245. ENDIF
  1246. NAE=NBELEG
  1247. ENDIF
  1248. C --> Ajout de l'arete dans MTAB11.ARTS
  1249. IF (IAE.EQ.0) THEN
  1250. NBNN=2
  1251. NBELEM=1
  1252. SEGINI,IPTA1
  1253. IPTA1.ITYPEL=2
  1254. IPTA1.NUM(1,1)=NRP1
  1255. IPTA1.NUM(2,1)=NRP2
  1256. CALL ECCTAB(MTABA,'ENTIER ',NAE,0,' ',0,0,
  1257. & 'MAILLAGE',0,0,0,0,IPTA1)
  1258. ENDIF
  1259. C --> Ajout de l'arete dans MTAB11.FACS
  1260. CALL ECROBJ('ENTIER ',NF)
  1261. CALL ECROBJ('TABLE ',MTABF)
  1262. CALL EXIS
  1263. CALL LIRLOG(BOOL1,1,IRETOU)
  1264. IF (.NOT.BOOL1) THEN
  1265. C si MTAB11.FACS.NF n'existe pas, on le cree
  1266. CALL CRTABL(MTABF1)
  1267. CALL ECCTAB(MTABF,'ENTIER ',NF,0,' ',0,0,
  1268. & 'TABLE ',0,0,0,0,MTABF1)
  1269. NBNN=2
  1270. NBELEM=0
  1271. SEGINI,IPTF1
  1272. IPTF1.ITYPEL=2
  1273. CALL ECCTAB(MTABF1,'MOT ',0,0,'VISU',0,0,
  1274. & 'MAILLAGE',0,0,0,0,IPTF1)
  1275. JG=0
  1276. SEGINI,LA1
  1277. CALL ECCTAB(MTABF1,'MOT ',0,0,'ARTS',0,0,
  1278. & 'LISTENTI',0,0,0,0,LA1)
  1279. ENDIF
  1280. C acces a la table de la face NF
  1281. CALL ACCTAB(MTABF,'ENTIER ',NF,0,' ',0,0,
  1282. & 'TABLE ',0,0,0,0,MTABF1)
  1283. C ajout d'une arete dans l'indice VISU
  1284. CALL ACCTAB(MTABF1,'MOT ',0,0,'VISU',0,0,
  1285. & 'MAILLAGE',0,0,0,0,IPTF1)
  1286. NBNN=IPTF1.NUM(/1)
  1287. NBELEM=IPTF1.NUM(/2)+1
  1288. SEGADJ,IPTF1
  1289. IPTF1.NUM(1,NBELEM)=NRP1
  1290. IPTF1.NUM(2,NBELEM)=NRP2
  1291. C ajout du numero de l'arete l'indice ARTS
  1292. CALL ACCTAB(MTABF1,'MOT ',0,0,'ARTS',0,0,
  1293. & 'LISTENTI',0,0,0,0,LA1)
  1294. JG=LA1.LECT(/1)+1
  1295. SEGADJ,LA1
  1296. LA1.LECT(JG)=NAE
  1297. C --> Ecriture dans MTAB11.CELL.NRCI
  1298. C ajout d'une arete dans l'indice VISU si besoin
  1299. DO L=1,IPTI1.NUM(/2)
  1300. NI1=IPTI1.NUM(1,L)
  1301. NI2=IPTI1.NUM(2,L)
  1302. IF (((NI1.EQ.NRP1).AND.(NI2.EQ.NRP2)).OR.
  1303. & ((NI2.EQ.NRP1).AND.(NI1.EQ.NRP2))) GOTO 15
  1304. ENDDO
  1305. NBNN=IPTI1.NUM(/1)
  1306. NBELEM=IPTI1.NUM(/2)+1
  1307. SEGADJ,IPTI1
  1308. IPTI1.NUM(1,NBELEM)=NRP1
  1309. IPTI1.NUM(2,NBELEM)=NRP2
  1310. 15 CONTINUE
  1311. C ajout du numero de la face dans l'indice FACS
  1312. C si besoin
  1313. CALL ECRENT(NF)
  1314. CALL ECROBJ('LISTENTI',LFI1)
  1315. CALL EXIS
  1316. CALL LIRLOG(BOOL1,1,IRETOU)
  1317. SEGACT,LFI1
  1318. IF (.NOT.BOOL1) THEN
  1319. JG=LFI1.LECT(/1)+1
  1320. SEGADJ,LFI1
  1321. LFI1.LECT(JG)=NF
  1322. ENDIF
  1323. C ajout de NRCJ dans l'indice VOIS si besion
  1324. CALL ECROBJ('MAILLAGE',IPTVI1)
  1325. CALL ECROBJ('POINT ',NRCJ)
  1326. CALL DANS
  1327. SEGACT,IPTVI1
  1328. CALL LIRLOG(BOOL1,1,IRETOU)
  1329. IF (.NOT.BOOL1) THEN
  1330. NBNN=IPTVI1.NUM(/1)
  1331. NBELEM=IPTVI1.NUM(/2)+1
  1332. SEGADJ,IPTVI1
  1333. IPTVI1.NUM(1,NBELEM)=NRCJ
  1334. ENDIF
  1335. C Cette arete appartient aussi a la face interne
  1336. C situee entre NRCI et NRCJ
  1337. C --> Ecriture dans MTAB11.CELL.NRCJ
  1338. MMTABI1=MTABI1
  1339. IIPTI1=IPTI1
  1340. LLFI1=LFI1
  1341. IIPTVI1=IPTVI1
  1342. CALL ECROBJ('POINT ',NRCJ)
  1343. CALL ECROBJ('TABLE ',MTABC)
  1344. CALL EXIS
  1345. CALL LIRLOG(BOOL1,1,IRETOU)
  1346. C si MATB11.CELL.NRCJ n'existe pas on le cree
  1347. IF (.NOT.BOOL1) THEN
  1348. CALL CRTABL(MTABI1)
  1349. CALL ECCTAB(MTABC,'POINT ',0,0,' ',0,NRCJ,
  1350. & 'TABLE ',0,0,0,0,MTABI1)
  1351. NBNN=2
  1352. NBELEM=0
  1353. SEGINI,IPTI1
  1354. IPTI1.ITYPEL=2
  1355. CALL ECCTAB(MTABI1,'MOT ',0,0,'VISU',0,0,
  1356. & 'MAILLAGE',0,0,0,0,IPTI1)
  1357. JG=0
  1358. SEGINI,LFI1
  1359. CALL ECCTAB(MTABI1,'MOT ',0,0,'FACS',0,0,
  1360. & 'LISTENTI',0,0,0,0,LFI1)
  1361. NBNN=1
  1362. NBELEM=0
  1363. SEGINI,IPTVI1
  1364. IPTVI1.ITYPEL=1
  1365. CALL ECCTAB(MTABI1,'MOT ',0,0,'VOIS',0,0,
  1366. & 'MAILLAGE',0,0,0,0,IPTVI1)
  1367. NBELE6=NBELE6+1
  1368. IPT6.NUM(1,NBELE6)=NRCJ
  1369. ENDIF
  1370. C acces a la table de la cellule NRCJ
  1371. CALL ACCTAB(MTABC,'POINT ',0,0,' ',0,NRCJ,
  1372. & 'TABLE ',0,0,0,0,MTABI1)
  1373. CALL ACCTAB(MTABI1,'MOT ',0,0,'VISU',0,0,
  1374. & 'MAILLAGE',0,0,0,0,IPTI1)
  1375. CALL ACCTAB(MTABI1,'MOT ',0,0,'FACS',0,0,
  1376. & 'LISTENTI',0,0,0,0,LFI1)
  1377. CALL ACCTAB(MTABI1,'MOT ',0,0,'VOIS',0,0,
  1378. & 'MAILLAGE',0,0,0,0,IPTVI1)
  1379. C ajout d'une arete dans l'indice VISU si besoin
  1380. DO L=1,IPTI1.NUM(/2)
  1381. NI1=IPTI1.NUM(1,L)
  1382. NI2=IPTI1.NUM(2,L)
  1383. IF (((NI1.EQ.NRP1).AND.(NI2.EQ.NRP2)).OR.
  1384. & ((NI2.EQ.NRP1).AND.(NI1.EQ.NRP2))) GOTO 16
  1385. ENDDO
  1386. NBNN=IPTI1.NUM(/1)
  1387. NBELEM=IPTI1.NUM(/2)+1
  1388. SEGADJ,IPTI1
  1389. IPTI1.NUM(1,NBELEM)=NRP1
  1390. IPTI1.NUM(2,NBELEM)=NRP2
  1391. 16 CONTINUE
  1392. C s'agit il d'une nouvelle face ou pas et si oui
  1393. C laquelle ?
  1394. NFI=ITFAC1.LACT(NCI,NCJ)
  1395. IF (NFI.EQ.0) THEN
  1396. C on renseigne cette nouvelle face dans ITFAC1
  1397. NFF=NFF+1
  1398. ITFAC1.LACT(NCI,NCJ)=NFF
  1399. ITFAC1.LACT(NCJ,NCI)=NFF
  1400. NFI=NFF
  1401. C ainsi que dans LV5 et LV6
  1402. IF (NFF.GT.LV5.LECT(/1)) THEN
  1403. JG=NFF+100
  1404. SEGADJ,LV5,LV6
  1405. ENDIF
  1406. IF (LV5.LECT(NFF).EQ.0) THEN
  1407. LV5.LECT(NFF)=NCI
  1408. LV6.LECT(NFF)=NCJ
  1409. ENDIF
  1410. ENDIF
  1411. C ajout du numero de la face dans l'indice FACS
  1412. C si besoin
  1413. CALL ECRENT(NFI)
  1414. CALL ECROBJ('LISTENTI',LFI1)
  1415. CALL EXIS
  1416. CALL LIRLOG(BOOL1,1,IRETOU)
  1417. SEGACT,LFI1
  1418. IF (.NOT.BOOL1) THEN
  1419. JG=LFI1.LECT(/1)+1
  1420. SEGADJ,LFI1
  1421. LFI1.LECT(JG)=NFI
  1422. ENDIF
  1423. C ajout de NRCI dans l'indice VOIS si besion
  1424. BOOL1=.FALSE.
  1425. DO L=1,IPTVI1.NUM(/2)
  1426. IF (IPTVI1.NUM(1,L).EQ.NRCI) BOOL1=.TRUE.
  1427. ENDDO
  1428. IF (.NOT.BOOL1) THEN
  1429. NBNN=IPTVI1.NUM(/1)
  1430. NBELEM=IPTVI1.NUM(/2)+1
  1431. SEGADJ,IPTVI1
  1432. IPTVI1.NUM(1,NBELEM)=NRCI
  1433. ENDIF
  1434. MTABI1=MMTABI1
  1435. IPTI1=IIPTI1
  1436. LFI1=LLFI1
  1437. IPTVI1=IIPTVI1
  1438. C ajout de l'arete dans MTAB11.FACS.NFI
  1439. MMTABF1=MTABF1
  1440. IIPTF1=IPTF1
  1441. LLA1=LA1
  1442. CALL ECROBJ('ENTIER ',NFI)
  1443. CALL ECROBJ('TABLE ',MTABF)
  1444. CALL EXIS
  1445. CALL LIRLOG(BOOL1,1,IRETOU)
  1446. IF (.NOT.BOOL1) THEN
  1447. C si MTAB11.FACS.NFI n'existe pas, on le cree
  1448. CALL CRTABL(MTABF1)
  1449. CALL ECCTAB(MTABF,'ENTIER ',NFI,0,' ',0,0,
  1450. & 'TABLE ',0,0,0,0,MTABF1)
  1451. NBNN=2
  1452. NBELEM=0
  1453. SEGINI,IPTF1
  1454. IPTF1.ITYPEL=2
  1455. CALL ECCTAB(MTABF1,'MOT ',0,0,'VISU',0,0,
  1456. & 'MAILLAGE',0,0,0,0,IPTF1)
  1457. JG=0
  1458. SEGINI,LA1
  1459. CALL ECCTAB(MTABF1,'MOT ',0,0,'ARTS',0,0,
  1460. & 'LISTENTI',0,0,0,0,LA1)
  1461. ENDIF
  1462. C acces a la table de la face NFI
  1463. CALL ACCTAB(MTABF,'ENTIER ',NFI,0,' ',0,0,
  1464. & 'TABLE ',0,0,0,0,MTABF1)
  1465. C ajout d'une arete dans la face si besoin
  1466. CALL ACCTAB(MTABF1,'MOT ',0,0,'VISU',0,0,
  1467. & 'MAILLAGE',0,0,0,0,IPTF1)
  1468. CALL ACCTAB(MTABF1,'MOT ',0,0,'ARTS',0,0,
  1469. & 'LISTENTI',0,0,0,0,LA1)
  1470. CALL ECRENT(NAE)
  1471. CALL ECROBJ('LISTENTI',LA1)
  1472. CALL EXIS
  1473. SEGACT,LA1
  1474. CALL LIRLOG(BOOL1,1,IRETOU)
  1475. IF (.NOT.BOOL1) THEN
  1476. JG=LA1.LECT(/1)+1
  1477. SEGADJ,LA1
  1478. LA1.LECT(JG)=NAE
  1479. NBNN=IPTF1.NUM(/1)
  1480. NBELEM=IPTF1.NUM(/2)+1
  1481. SEGADJ,IPTF1
  1482. IPTF1.NUM(1,NBELEM)=NRP1
  1483. IPTF1.NUM(2,NBELEM)=NRP2
  1484. ENDIF
  1485. MTABF1=MMTABF1
  1486. IPTF1=IIPTF1
  1487. LA1=LLA1
  1488. C On incremente le nombre d'aretes identifiees
  1489. NAI=NAI+1
  1490. ENDIF
  1491. ENDDO
  1492. ENDDO
  1493. C
  1494. C 2eme cas : recherche des triangles voisins de NTI coupant
  1495. C la cellule NCI
  1496. C Boucle sur les cotes du triangle NTI
  1497. DO J=1,3
  1498. IF (J.EQ.1) THEN
  1499. NRA=IPT2.NUM(2,NTI)
  1500. NRB=IPT2.NUM(3,NTI)
  1501. ENDIF
  1502. IF (J.EQ.2) THEN
  1503. NRA=IPT2.NUM(1,NTI)
  1504. NRB=IPT2.NUM(3,NTI)
  1505. ENDIF
  1506. IF (J.EQ.3) THEN
  1507. NRA=IPT2.NUM(1,NTI)
  1508. NRB=IPT2.NUM(2,NTI)
  1509. ENDIF
  1510. XA=XCOOR((NRA-1)*IDIMP1+1)
  1511. YA=XCOOR((NRA-1)*IDIMP1+2)
  1512. ZA=XCOOR((NRA-1)*IDIMP1+3)
  1513. XB=XCOOR((NRB-1)*IDIMP1+1)
  1514. YB=XCOOR((NRB-1)*IDIMP1+2)
  1515. ZB=XCOOR((NRB-1)*IDIMP1+3)
  1516. C La droite (AB) est definie par les deux equations de plan
  1517. C Ax + By + Cy + D = 0
  1518. C Ex + Fy + Gy + H = 0
  1519. C --> pour le plan 1, on definit un point C dans ce plan
  1520. XC=XA+(YB-YA)
  1521. YC=YA+(ZB-ZA)
  1522. ZC=ZA+(XB-XA)
  1523. C --> vecteur normal au plan ABC : n=AB^AC
  1524. A=((YB-YA)*(ZC-ZA))-((ZB-ZA)*(YC-YA))
  1525. B=((ZB-ZA)*(XC-XA))-((XB-XA)*(ZC-ZA))
  1526. C=((XB-XA)*(YC-YA))-((YB-YA)*(XC-XA))
  1527. C --> calcul de D, sachant que A est dans le plan
  1528. D=-1D0*((A*XA)+(B*YA)+(C*ZA))
  1529. C --> pour le plan 2, on definit un point D dans ce plan
  1530. XD=XA+(ZB-ZA)
  1531. YD=YA+(XB-XA)
  1532. ZD=ZA+(YB-YA)
  1533. C --> vecteur normal au plan ABD : n=AB^AD
  1534. E=((YB-YA)*(ZD-ZA))-((ZB-ZA)*(YD-YA))
  1535. F=((ZB-ZA)*(XD-XA))-((XB-XA)*(ZD-ZA))
  1536. G=((XB-XA)*(YD-YA))-((YB-YA)*(XD-XA))
  1537. C --> calcul de H, sachant que A est dans le plan
  1538. H=-1D0*((E*XA)+(F*YA)+(G*ZA))
  1539. C Recherche des aretes du polygone LTL1 sur la droite AB
  1540. DO K=1,LTL1.XACT(/1)
  1541. IAE=0
  1542. X41=LTL1.XACT(K,1)
  1543. Y41=LTL1.XACT(K,2)
  1544. Z41=LTL1.XACT(K,3)
  1545. IF (K.EQ.LTL1.XACT(/1)) THEN
  1546. X42=LTL1.XACT(1,1)
  1547. Y42=LTL1.XACT(1,2)
  1548. Z42=LTL1.XACT(1,3)
  1549. ELSE
  1550. X42=LTL1.XACT(K+1,1)
  1551. Y42=LTL1.XACT(K+1,2)
  1552. Z42=LTL1.XACT(K+1,3)
  1553. ENDIF
  1554. C Test si les points 1 et 2 de l'arete K sont sur la
  1555. C droite (AB)
  1556. I41=0
  1557. I42=0
  1558. C Test si P1 est sur la droite (AB)
  1559. V41=(A*X41)+(B*Y41)+(C*Z41)+D
  1560. W41=(E*X41)+(F*Y41)+(G*Z41)+H
  1561. IF ((ABS(V41).LT.ZERO2).AND.(ABS(W41).LT.ZERO2)) THEN
  1562. I41=1
  1563. ELSE
  1564. GOTO 3
  1565. ENDIF
  1566. C Test si P2 est sur la droite (AB)
  1567. V42=(A*X42)+(B*Y42)+(C*Z42)+D
  1568. W42=(E*X42)+(F*Y42)+(G*Z42)+H
  1569. IF ((ABS(V42).LT.ZERO2).AND.(ABS(W42).LT.ZERO2)) THEN
  1570. I42=1
  1571. ELSE
  1572. GOTO 3
  1573. ENDIF
  1574. C Si N41 et N42 sont sur l'arete [AB], on va chercher le
  1575. C numero du triangle adjacent sur cette arete
  1576. IF ((I41.EQ.1).AND.(I42.EQ.1)) THEN
  1577. NTVI=ILEA1.LEAC(NTI,J,1)
  1578. C On verifie que le couple (NTVI,NCI) n'a pas deja
  1579. C ete traite et on l'ajoute a la file
  1580. IF (ITL1.LACT(NTVI,NCI).EQ.0) THEN
  1581. ITL1.LACT(NTVI,NCI)=1
  1582. NLT=NLT+1
  1583. LT.LECT(NLT)=NTVI
  1584. LC.LECT(NLT)=NCI
  1585. ENDIF
  1586. ENDIF
  1587. C Determination des noeuds P1 et P2 de l'arete
  1588. C Doit on creer de nouveaux noeuds ?
  1589. C LV2 liste des noeuds a examiner = LV1 et NRA et NRB
  1590. JG=LV1.LECT(/1)
  1591. SEGINI,LV2=LV1
  1592. JG=LV2.LECT(/1)+2
  1593. SEGADJ,LV2
  1594. NLV2=LV1.LECT(/1)
  1595. NLV2=NLV2+1
  1596. LV2.LECT(NLV2)=NRA
  1597. NLV2=NLV2+1
  1598. LV2.LECT(NLV2)=NRB
  1599. C test si P1 est deja present ou non dans LV2
  1600. BOOL1=.FALSE.
  1601. DO L=1,LV2.LECT(/1)
  1602. NRL=LV2.LECT(L)
  1603. XL=XCOOR((NRL-1)*IDIMP1+1)
  1604. YL=XCOOR((NRL-1)*IDIMP1+2)
  1605. ZL=XCOOR((NRL-1)*IDIMP1+3)
  1606. IF ((ABS(XL-X41).LT.XTOL).AND.
  1607. & (ABS(YL-Y41).LT.XTOL).AND.
  1608. & (ABS(ZL-Z41).LT.XTOL)) THEN
  1609. BOOL1=.TRUE.
  1610. NRP1=NRL
  1611. GOTO 6
  1612. ENDIF
  1613. ENDDO
  1614. IF (.NOT.BOOL1) THEN
  1615. C ajout d'un nouveau noeud dans MCOORD
  1616. NRP1=nbpts+1
  1617. NBPTS=NRP1
  1618. SEGADJ,MCOORD
  1619. XCOOR((NRP1-1)*IDIMP1+1)=X41
  1620. XCOOR((NRP1-1)*IDIMP1+2)=Y41
  1621. XCOOR((NRP1-1)*IDIMP1+3)=Z41
  1622. NLV1=NLV1+1
  1623. IF (NLV1.GT.LV1.LECT(/1)) THEN
  1624. JG=NLV1
  1625. SEGADJ,LV1
  1626. ENDIF
  1627. LV1.LECT(NLV1)=NRP1
  1628. ENDIF
  1629. 6 CONTINUE
  1630. C test si P2 est deja present ou non dans LV2
  1631. BOOL1=.FALSE.
  1632. DO L=1,LV2.LECT(/1)
  1633. NRL=LV2.LECT(L)
  1634. XL=XCOOR((NRL-1)*IDIMP1+1)
  1635. YL=XCOOR((NRL-1)*IDIMP1+2)
  1636. ZL=XCOOR((NRL-1)*IDIMP1+3)
  1637. IF ((ABS(XL-X42).LT.XTOL).AND.
  1638. & (ABS(YL-Y42).LT.XTOL).AND.
  1639. & (ABS(ZL-Z42).LT.XTOL)) THEN
  1640. BOOL1=.TRUE.
  1641. NRP2=NRL
  1642. GOTO 7
  1643. ENDIF
  1644. ENDDO
  1645. IF (.NOT.BOOL1) THEN
  1646. NRP2=nbpts+1
  1647. NBPTS=NRP2
  1648. SEGADJ,MCOORD
  1649. XCOOR((NRP2-1)*IDIMP1+1)=X42
  1650. XCOOR((NRP2-1)*IDIMP1+2)=Y42
  1651. XCOOR((NRP2-1)*IDIMP1+3)=Z42
  1652. NLV1=NLV1+1
  1653. IF (NLV1.GT.LV1.LECT(/1)) THEN
  1654. JG=NLV1
  1655. SEGADJ,LV1
  1656. ENDIF
  1657. LV1.LECT(NLV1)=NRP2
  1658. ENDIF
  1659. 7 CONTINUE
  1660. C Test sur l'existence de l'arete P1 P2 dans IPTG
  1661. DO L=1,NBELEG
  1662. NG1=IPTG.NUM(1,L)
  1663. NG2=IPTG.NUM(2,L)
  1664. IF (((NG1.EQ.NRP1).AND.(NG2.EQ.NRP2)).OR.
  1665. & ((NG2.EQ.NRP1).AND.(NG1.EQ.NRP2))) THEN
  1666. C si l'arete P1 P2 a deja ete creee, on
  1667. C l'indique au moyen de IAE
  1668. IAE=1
  1669. NAE=L
  1670. GOTO 19
  1671. ENDIF
  1672. ENDDO
  1673. 19 CONTINUE
  1674. C --> Ajout de l'arete dans MTAB11.VISU
  1675. IF (IAE.EQ.0) THEN
  1676. NBELEG=NBELEG+1
  1677. IPTG.NUM(1,NBELEG)=NRP1
  1678. IPTG.NUM(2,NBELEG)=NRP2
  1679. IF (NBELEG.EQ.IPTG.NUM(/2)) THEN
  1680. NBNN=IPTG.NUM(/1)
  1681. NBELEM=IPTG.NUM(/2)+100
  1682. SEGADJ,IPTG
  1683. ENDIF
  1684. NAE=NBELEG
  1685. ENDIF
  1686. C --> Ajout de l'arete dans MTAB11.ARTS
  1687. IF (IAE.EQ.0) THEN
  1688. NBNN=2
  1689. NBELEM=1
  1690. SEGINI,IPTA1
  1691. IPTA1.ITYPEL=2
  1692. IPTA1.NUM(1,1)=NRP1
  1693. IPTA1.NUM(2,1)=NRP2
  1694. CALL ECCTAB(MTABA,'ENTIER ',NAE,0,' ',0,0,
  1695. & 'MAILLAGE',0,0,0,0,IPTA1)
  1696. ENDIF
  1697. C --> Ajout de l'arete dans MTAB11.FACS
  1698. CALL ECROBJ('ENTIER ',NF)
  1699. CALL ECROBJ('TABLE ',MTABF)
  1700. CALL EXIS
  1701. CALL LIRLOG(BOOL1,1,IRETOU)
  1702. IF (.NOT.BOOL1) THEN
  1703. C si MTAB11.FACS.NF n'existe pas, on le cree
  1704. CALL CRTABL(MTABF1)
  1705. CALL ECCTAB(MTABF,'ENTIER ',NF,0,' ',0,0,
  1706. & 'TABLE ',0,0,0,0,MTABF1)
  1707. NBNN=2
  1708. NBELEM=0
  1709. SEGINI,IPTF1
  1710. IPTF1.ITYPEL=2
  1711. CALL ECCTAB(MTABF1,'MOT ',0,0,'VISU',0,0,
  1712. & 'MAILLAGE',0,0,0,0,IPTF1)
  1713. JG=0
  1714. SEGINI,LA1
  1715. CALL ECCTAB(MTABF1,'MOT ',0,0,'ARTS',0,0,
  1716. & 'LISTENTI',0,0,0,0,LA1)
  1717. ENDIF
  1718. C acces a MTAB11.FACS.NF
  1719. CALL ACCTAB(MTABF,'ENTIER ',NF,0,' ',0,0,
  1720. & 'TABLE ',0,0,0,0,MTABF1)
  1721. C ajout d'une arete dans l'indice VISU
  1722. CALL ACCTAB(MTABF1,'MOT ',0,0,'VISU',0,0,
  1723. & 'MAILLAGE',0,0,0,0,IPTF1)
  1724. NBNN=IPTF1.NUM(/1)
  1725. NBELEM=IPTF1.NUM(/2)+1
  1726. SEGADJ,IPTF1
  1727. IPTF1.NUM(1,NBELEM)=NRP1
  1728. IPTF1.NUM(2,NBELEM)=NRP2
  1729. C ajout du numero de l'arete l'indice ARTS
  1730. CALL ACCTAB(MTABF1,'MOT ',0,0,'ARTS',0,0,
  1731. & 'LISTENTI',0,0,0,0,LA1)
  1732. JG=LA1.LECT(/1)+1
  1733. SEGADJ,LA1
  1734. LA1.LECT(JG)=NAE
  1735. C --> Ecriture dans MTAB11.CELL.NRCI
  1736. C ajout d'une arete dans l'indice VISU si besoin
  1737. DO L=1,IPTI1.NUM(/2)
  1738. NI1=IPTI1.NUM(1,L)
  1739. NI2=IPTI1.NUM(2,L)
  1740. IF (((NI1.EQ.NRP1).AND.(NI2.EQ.NRP2)).OR.
  1741. & ((NI2.EQ.NRP1).AND.(NI1.EQ.NRP2))) GOTO 17
  1742. ENDDO
  1743. NBNN=IPTI1.NUM(/1)
  1744. NBELEM=IPTI1.NUM(/2)+1
  1745. SEGADJ,IPTI1
  1746. IPTI1.NUM(1,NBELEM)=NRP1
  1747. IPTI1.NUM(2,NBELEM)=NRP2
  1748. 17 CONTINUE
  1749. C ajout du numero de la face dans l'indice FACS
  1750. C si besoin
  1751. CALL ECRENT(NF)
  1752. CALL ECROBJ('LISTENTI',LFI1)
  1753. CALL EXIS
  1754. CALL LIRLOG(BOOL1,1,IRETOU)
  1755. SEGACT,LFI1
  1756. IF (.NOT.BOOL1) THEN
  1757. JG=LFI1.LECT(/1)+1
  1758. SEGADJ,LFI1
  1759. LFI1.LECT(JG)=NF
  1760. ENDIF
  1761. NAI=NAI+1
  1762. 3 CONTINUE
  1763. ENDDO
  1764. ENDDO
  1765. NF=NFF
  1766. C
  1767. C Test pour verifier que le nombre d'aretes identifiees est
  1768. C bien egal au nombre de sommets du polygone d'intersection
  1769. IF (NAI.NE.LTL1.XACT(/1)) THEN
  1770. C WRITE(6,*) '> Le nombre d''aretes identifiees est'
  1771. C WRITE(6,*) ' different du nombre de sommets du polygone'
  1772. C WRITE(6,*) nai,LTL1.XACT(/1)
  1773. C WRITE(6,*) 'Numero du triangle concerne:',nti
  1774. C WRITE(6,*) 'Point de la cellule concernee',nrci
  1775. CALL ERREUR(1036)
  1776. GOTO 999
  1777. ENDIF
  1778. ENDDO
  1779. 1 CONTINUE
  1780. C Ajustement du maillage global des centres des cellules dans la
  1781. C partition coupee IPT6
  1782. NBNN=IPT6.NUM(/1)
  1783. NBELEM=NBELE6
  1784. SEGADJ,IPT6
  1785. C Ajustement du maillage global des aretes IPTG
  1786. NBNN=IPTG.NUM(/1)
  1787. NBELEM=NBELEG
  1788. SEGADJ,IPTG
  1789. C Ajustement de la liste des faces internes LV5 et LV6
  1790. JG=NF
  1791. SEGADJ,LV5,LV6
  1792. C
  1793. C
  1794. C Fusion des faces coplanaires
  1795. C On construit la liste des faces regroupees : LV1
  1796. C si LV1(n1)=n1 la face n1 est seule (interne ou englobante)
  1797. C si LV1(n1)=n2 la face n1 est reliee a la face n2 qui constitue
  1798. C sa face "englobante" et donc LV1(n2)=n2
  1799. JG=NF
  1800. SEGINI,LV1
  1801. C Boucle sur les cellules existantes
  1802. DO I=1,IPT6.NUM(/2)
  1803. NRCI=IPT6.NUM(1,I)
  1804. CALL ACCTAB(MTABC,'POINT ',0,0,' ',0,NRCI,
  1805. & 'TABLE ',0,0,0,0,MTABI1)
  1806. CALL ACCTAB(MTABI1,'MOT ',0,0,'FACS',0,0,
  1807. & 'LISTENTI',0,0,0,0,LFI1)
  1808. C Boucle sur les faces de la cellule NRCI
  1809. DO J=1,LFI1.LECT(/1)
  1810. NFJ=LFI1.LECT(J)
  1811. C Si cette face a deja ete regroupee, on examine la face
  1812. C suivante
  1813. IF (LV1.LECT(NFJ).NE.0) GOTO 9
  1814. C Sinon, on la considere comme englobante
  1815. LV1.LECT(NFJ)=NFJ
  1816. C Mais s'il s'agit d'une face interne, pas besoin de
  1817. C checher des faces coplanaires, on examine la suivante
  1818. IF (LV5.LECT(NFJ).NE.0) GOTO 9
  1819. C A partir d'ici, on va rechercher les autres faces de la
  1820. C cellule NRCI qui sont coplanaires a NFJ
  1821. C Ces faces sont listees dans LV2, utilisee par la suite
  1822. C pour regrouper les maillages des faces
  1823. JG=0
  1824. SEGINI,LV2
  1825. CALL ACCTAB(MTABF,'ENTIER ',NFJ,0,' ',0,0,
  1826. & 'TABLE ',0,0,0,0,MTABF1)
  1827. CALL ACCTAB(MTABF1,'MOT ',0,0,'VISU',0,0,
  1828. & 'MAILLAGE',0,0,0,0,IPTF1)
  1829. C Determination de l'equation du plan NFJ avec 3 points
  1830. C A, B et C non alignes
  1831. SEGINI,IPT3=IPTF1
  1832. CALL CHANGE(IPT3,1)
  1833. NRA=IPT3.NUM(1,1)
  1834. NRB=IPT3.NUM(1,2)
  1835. C Boucle pour trouver un point C non aligne avec les points
  1836. C A et B
  1837. DO K=3,IPT3.NUM(/2)
  1838. NRC=IPT3.NUM(1,K)
  1839. XA=XCOOR((NRA-1)*IDIMP1+1)
  1840. YA=XCOOR((NRA-1)*IDIMP1+2)
  1841. ZA=XCOOR((NRA-1)*IDIMP1+3)
  1842. XB=XCOOR((NRB-1)*IDIMP1+1)
  1843. YB=XCOOR((NRB-1)*IDIMP1+2)
  1844. ZB=XCOOR((NRB-1)*IDIMP1+3)
  1845. XC=XCOOR((NRC-1)*IDIMP1+1)
  1846. YC=XCOOR((NRC-1)*IDIMP1+2)
  1847. ZC=XCOOR((NRC-1)*IDIMP1+3)
  1848. C Calcul d'un vecteur normal au plan (ABC)
  1849. XN=((YB-YA)*(ZC-ZA))-((ZB-ZA)*(YC-YA))
  1850. YN=((ZB-ZA)*(XC-XA))-((XB-XA)*(ZC-ZA))
  1851. ZN=((XB-XA)*(YC-YA))-((YB-YA)*(XC-XA))
  1852. DN=SQRT((XN**2)+(YN**2)+(ZN**2))
  1853. IF (DN.GE.ZERO) GOTO 14
  1854. ENDDO
  1855. C Si l'on passe ici, c'est que l'on a pas trouve 3 points
  1856. C suffisament espaces pour definir le plan
  1857. C WRITE(6,*) ' > Impossible de determiner l''equation du plan'
  1858. C WRITE(6,*) ' points alignes (2)'
  1859. INTERR(1)=NFJ
  1860. INTERR(2)=NRCI
  1861. CALL ERREUR(1035)
  1862. GOTO 999
  1863. 14 CONTINUE
  1864. XN=XN/DN
  1865. YN=YN/DN
  1866. ZN=ZN/DN
  1867. W=-1D0*((XN*XA)+(YN*YA)+(ZN*ZA))
  1868. C Boucle sur les faces suivantes
  1869. MMTABF1=MTABF1
  1870. IIPTF1=IPTF1
  1871. DO K=J+1,LFI1.LECT(/1)
  1872. NFK=LFI1.LECT(K)
  1873. C S'il s'agit d'une face interne, on ne regarde pas
  1874. C la coplaneite et on examine la face suivante
  1875. IF (LV5.LECT(NFK).NE.0) GOTO 8
  1876. C Si la face NFK a ete traitee (ratachee a une face ou
  1877. C bien considere comme face englobante), on recupere le
  1878. C numero de ratachement
  1879. IF (LV1.LECT(NFK).NE.0) THEN
  1880. NFK=LV1.LECT(NFK)
  1881. ENDIF
  1882. C Si la face NFK est deja reliee a la face NFJ,
  1883. C on ne refait pas le travail
  1884. IF (NFK.EQ.NFJ) GOTO 8
  1885. C Acces au maillage de la face NFK
  1886. CALL ACCTAB(MTABF,'ENTIER ',NFK,0,' ',0,0,
  1887. & 'TABLE ',0,0,0,0,MTABF1)
  1888. CALL ACCTAB(MTABF1,'MOT ',0,0,'VISU',0,0,
  1889. & 'MAILLAGE',0,0,0,0,IPTF1)
  1890. C Verification que les points de la face NFK sont dans
  1891. C le plan ABC
  1892. SEGINI,IPT4=IPTF1
  1893. CALL CHANGE(IPT4,1)
  1894. DO L=1,IPT4.NUM(/2)
  1895. NRL=IPT4.NUM(1,L)
  1896. XL=XCOOR((NRL-1)*IDIMP1+1)
  1897. YL=XCOOR((NRL-1)*IDIMP1+2)
  1898. ZL=XCOOR((NRL-1)*IDIMP1+3)
  1899. DTEST=(XN*XL)+(YN*YL)+(ZN*ZL)+W
  1900. IF (ABS(DTEST).GE.ZERO2) GOTO 8
  1901. ENDDO
  1902. C Si on passe ici, c'est que la face NFK est coplanaire
  1903. C a la face NFJ, on le note dans LV2 et on modifie
  1904. C l'indice NFK de LV1 pour rediriger vers la face NFJ
  1905. JG=LV2.LECT(/1)+1
  1906. SEGADJ,LV2
  1907. LV2.LECT(JG)=NFK
  1908. LV1.LECT(NFK)=NFJ
  1909. 8 CONTINUE
  1910. ENDDO
  1911. MTABF1=MMTABF1
  1912. IPTF1=IIPTF1
  1913. C Si on a trouve aucune face coplanaire a NFJ, on itere
  1914. IF (LV2.LECT(/1).EQ.0) GOTO 9
  1915. C On a determine la liste LV2 des faces coplanaires la face
  1916. C NFJ, on incorpore les aretes dans la table MTABF1 dediee
  1917. C a la face NFJ
  1918. MMTABF1=MTABF1
  1919. CALL ACCTAB(MTABF1,'MOT ',0,0,'ARTS',0,0,
  1920. & 'LISTENTI',0,0,0,0,LA1)
  1921. C Boucle sur les faces coplanaires a la face NFJ
  1922. DO K=1,LV2.LECT(/1)
  1923. NFK=LV2.LECT(K)
  1924. CALL ACCTAB(MTABF,'ENTIER ',NFK,0,' ',0,0,
  1925. & 'TABLE ',0,0,0,0,MTABF1)
  1926. CALL ACCTAB(MTABF1,'MOT ',0,0,'ARTS',0,0,
  1927. & 'LISTENTI',0,0,0,0,LA2)
  1928. C Boucle sur les aretes de cette face NFK
  1929. DO L=1,LA2.LECT(/1)
  1930. NAL=LA2.LECT(L)
  1931. C Si l'arete NAL est presente dans LA1, alors elle
  1932. C est supprimee de la face NFJ car elle est commune a
  1933. C deux faces coplanaires
  1934. DO M=1,LA1.LECT(/1)
  1935. IF ((LA1.LECT(M)).EQ.NAL) THEN
  1936. CALL ENLEV2(LA1,M,LA3,0)
  1937. SEGACT,LA1,LA3
  1938. LA1=LA3
  1939. GOTO 13
  1940. ENDIF
  1941. ENDDO
  1942. C Si on passe ici, c'est que l'arete NAL est absente
  1943. C de LA1, donc elle est ajoutee et contribue ainsi a
  1944. C la face NFJ
  1945. JG=LA1.LECT(/1)+1
  1946. SEGADJ,LA1
  1947. LA1.LECT(JG)=NAL
  1948. 13 CONTINUE
  1949. ENDDO
  1950. ENDDO
  1951. MTABF1=MMTABF1
  1952. C Ecriture de la nouvelle liste d'aretes pour la face NFJ
  1953. CALL ECCTAB(MTABF1,'MOT ',0,0,'ARTS',0,0,
  1954. & 'LISTENTI',0,0,0,0,LA1)
  1955. C Reconstruction du maillage de la face NFJ
  1956. IIPTF1=IPTF1
  1957. CALL ACCTAB(MTABF1,'MOT ',0,0,'VISU',0,0,
  1958. & 'MAILLAGE',0,0,0,0,IPTF1)
  1959. NBNN=IPTF1.NUM(/1)
  1960. NBELEM=LA1.LECT(/1)
  1961. SEGINI,IPTF1
  1962. IPTF1.ITYPEL=2
  1963. DO K=1,LA1.LECT(/1)
  1964. NAK=LA1.LECT(K)
  1965. CALL ACCTAB(MTABA,'ENTIER ',NAK,0,' ',0,0,
  1966. & 'MAILLAGE',0,0,0,0,IPTA1)
  1967. IPTF1.NUM(1,K)=IPTA1.NUM(1,1)
  1968. IPTF1.NUM(2,K)=IPTA1.NUM(2,1)
  1969. ENDDO
  1970. CALL ECCTAB(MTABF1,'MOT ',0,0,'VISU',0,0,
  1971. & 'MAILLAGE',0,0,0,0,IPTF1)
  1972. IPTF1=IIPTF1
  1973. 9 CONTINUE
  1974. ENDDO
  1975. ENDDO
  1976. C
  1977. C Ainsi, les faces englobees sont identifiees dans LV1,
  1978. C les faces englobantes aussi et leur maillage et liste
  1979. C d'aretes sont mises a jour dans MTABF1
  1980. C Il faut maintenant re-numeroter les faces et ne plus faire
  1981. C apparaitre les faces englobees
  1982. C
  1983. C Re-ecriture de la table de sortie pour ne plus faire figurer
  1984. C les faces/aretes supprimees
  1985. CALL CRTABL(MTAB10)
  1986. CALL CRTABL(MTABCC)
  1987. CALL CRTABL(MTABFF)
  1988. CALL CRTABL(MTABAA)
  1989. NBARETES=0
  1990. NBFACES=0
  1991. C listes faisant la correspondance entre les anciens et les
  1992. C nouveaux elements numerotes :
  1993. C LV3(n)=m l'ancienne arete numero n porte maintenant le numero m
  1994. C LV4(n)=m l'ancienne face numero n porte maintenant le numero m
  1995. C n doit correpondre a une face englobante
  1996. C si n correspond a une face "englobee" alors LV4(n)=0
  1997. JG=IPTG.NUM(/2)
  1998. SEGINI,LV3
  1999. JG=NF
  2000. SEGINI,LV4
  2001. C initialisation du nouveau maillage global des aretes
  2002. NBNN=2
  2003. NBELEM=IPTG.NUM(/2)
  2004. SEGINI,IPTG0
  2005. IPTG0.ITYPEL=2
  2006. CALL ECCTAB(MTAB10,'MOT ',0,0,'VISU',0,0,
  2007. & 'MAILLAGE',0,0,0,0,IPTG0)
  2008. C initialisation de la table des cellules MTABCC
  2009. CALL ECCTAB(MTAB10,'MOT ',0,0,'CELL',0,0,
  2010. & 'TABLE ',0,0,0,0,MTABCC)
  2011. C initialisation de la table des faces MTABF0
  2012. CALL ECCTAB(MTAB10,'MOT ',0,0,'FACS',0,0,
  2013. & 'TABLE ',0,0,0,0,MTABFF)
  2014. C initialisation de la table des aretes MTABA0
  2015. CALL ECCTAB(MTAB10,'MOT ',0,0,'ARTS',0,0,
  2016. & 'TABLE ',0,0,0,0,MTABAA)
  2017. C boucle sur les cellules
  2018. DO I=1,IPT6.NUM(/2)
  2019. NRCI=IPT6.NUM(1,I)
  2020. C initialisation de la table MTABI0 de la cellule NRCI
  2021. CALL CRTABL(MTABI0)
  2022. CALL ECCTAB(MTABCC,'POINT ',0,0,' ',0,NRCI,
  2023. & 'TABLE ',0,0,0,0,MTABI0)
  2024. C initialisation du maillage IPTI0 de la cellule NRCI
  2025. NBNN=2
  2026. NBELEM=0
  2027. SEGINI,IPTI0
  2028. IPTI0.ITYPEL=2
  2029. CALL ECCTAB(MTABI0,'MOT ',0,0,'VISU',0,0,
  2030. & 'MAILLAGE',0,0,0,0,IPTI0)
  2031. C initialisation de la liste LFI0 des faces de NRCI
  2032. JG=0
  2033. SEGINI,LFI0
  2034. CALL ECCTAB(MTABI0,'MOT ',0,0,'FACS',0,0,
  2035. & 'LISTENTI',0,0,0,0,LFI0)
  2036. C ecriture du maillage IPTVI0 des voisins de NRCI (inchange)
  2037. CALL ACCTAB(MTABC,'POINT ',0,0,' ',0,NRCI,
  2038. & 'TABLE ',0,0,0,0,MTABI1)
  2039. CALL ACCTAB(MTABI1,'MOT ',0,0,'VOIS',0,0,
  2040. & 'MAILLAGE',0,0,0,0,IPTVI1)
  2041. CALL ECCTAB(MTABI0,'MOT ',0,0,'VOIS',0,0,
  2042. & 'MAILLAGE',0,0,0,0,IPTVI1)
  2043. C boucle sur les faces de la cellule NRCI
  2044. CALL ACCTAB(MTABI1,'MOT ',0,0,'FACS',0,0,
  2045. & 'LISTENTI',0,0,0,0,LFI1)
  2046. DO J=1,LFI1.LECT(/1)
  2047. NFJ=LFI1.LECT(J)
  2048. C s'il s'agit il d'une face englobee, on passe a la face
  2049. C suivante
  2050. IF (LV1.LECT(NFJ).NE.NFJ) GOTO 18
  2051. C la face est elle nouvelle pour cette re-numerotation ?
  2052. NNFJ=LV4.LECT(NFJ)
  2053. BOOL1=NNFJ.EQ.0
  2054. IF (BOOL1) THEN
  2055. C NFJ n'a pas ete re-numerotee, donc on le fait ici
  2056. C NFJ est re-numerotee en NNFJ
  2057. NBFACES=NBFACES+1
  2058. NNFJ=NBFACES
  2059. LV4.LECT(NFJ)=NNFJ
  2060. C creation de la table MTABF0 de la face NNFJ
  2061. CALL CRTABL(MTABF0)
  2062. CALL ECCTAB(MTABFF,'ENTIER ',NNFJ,0,' ',0,0,
  2063. & 'TABLE ',0,0,0,0,MTABF0)
  2064. ELSE
  2065. C NFJ correspond a une face deja re-numerotee, on va
  2066. C chercher sa table
  2067. CALL ACCTAB(MTABFF,'ENTIER ',NNFJ,0,' ',0,0,
  2068. & 'TABLE ',0,0,0,0,MTABF0)
  2069. ENDIF
  2070. C ajout de cette face dans la liste LFI0 de la cellule NRCI
  2071. JG=LFI0.LECT(/1)+1
  2072. SEGADJ,LFI0
  2073. LFI0.LECT(JG)=NNFJ
  2074. C acces a la liste des aretes de cette face
  2075. CALL ACCTAB(MTABF,'ENTIER ',NFJ,0,' ',0,0,
  2076. & 'TABLE ',0,0,0,0,MTABF1)
  2077. CALL ACCTAB(MTABF1,'MOT ',0,0,'VISU',0,0,
  2078. & 'MAILLAGE',0,0,0,0,IPTF1)
  2079. CALL ACCTAB(MTABF1,'MOT ',0,0,'ARTS',0,0,
  2080. & 'LISTENTI',0,0,0,0,LA1)
  2081. C attention, la liste des aretes LA1 contient les anciens
  2082. C numeros d'arete
  2083. IF (BOOL1) THEN
  2084. C si la face NFJ vient d'etre re-numerotee NNFJ, alors
  2085. C on ecrit le maillage de la face dans MTABF0
  2086. CALL ECCTAB(MTABF0,'MOT ',0,0,'VISU',0,0,
  2087. & 'MAILLAGE',0,0,0,0,IPTF1)
  2088. C initialisation de la liste LA0 des aretes de la face
  2089. C NNFJ que l'on va remplir de suite
  2090. JG=LA1.LECT(/1)
  2091. SEGINI,LA0
  2092. NA0=0
  2093. CALL ECCTAB(MTABF0,'MOT ',0,0,'ARTS',0,0,
  2094. & 'LISTENTI',0,0,0,0,LA0)
  2095. ENDIF
  2096. C boucle sur les aretes de la face
  2097. DO K=1,LA1.LECT(/1)
  2098. C ancien numero d'arete
  2099. NAK=LA1.LECT(K)
  2100. CALL ACCTAB(MTABA,'ENTIER ',NAK,0,' ',0,0,
  2101. & 'MAILLAGE',0,0,0,0,IPTA1)
  2102. NRA=IPTA1.NUM(1,1)
  2103. NRB=IPTA1.NUM(2,1)
  2104. C acces au nouveau numero de cette arete
  2105. NNAK=LV3.LECT(NAK)
  2106. C s'il s'agit d'une nouvelle face
  2107. IF (BOOL1) THEN
  2108. C s'agit il d'une arete non re-numerotee ?
  2109. IF (NNAK.EQ.0) THEN
  2110. NBARETES=NBARETES+1
  2111. NNAK=NBARETES
  2112. LV3.LECT(NAK)=NNAK
  2113. C ecriture du maillage IPTA0 (identique a IPTA1)
  2114. C de l'arete NNAK
  2115. CALL ECCTAB(MTABAA,'ENTIER ',NNAK,0,' ',0,0,
  2116. & 'MAILLAGE',0,0,0,0,IPTA1)
  2117. C ajout cette arete dans le maillage global IPTG0
  2118. IPTG0.NUM(1,NBARETES)=NRA
  2119. IPTG0.NUM(2,NBARETES)=NRB
  2120. ENDIF
  2121. C ajout du numero d'arete dans la liste LA0
  2122. NA0=NA0+1
  2123. LA0.LECT(NA0)=NNAK
  2124. ENDIF
  2125. C ajout de l'arete dans le maillage IPTI0 de la cellule
  2126. C si elle n'y est pas deja
  2127. BOOL2=.FALSE.
  2128. DO L=1,IPTI0.NUM(/2)
  2129. NRL1=IPTI0.NUM(1,L)
  2130. NRL2=IPTI0.NUM(2,L)
  2131. IF (((NRA.EQ.NRL1).AND.(NRB.EQ.NRL2)).OR.
  2132. & ((NRA.EQ.NRL2).AND.(NRB.EQ.NRL1))) THEN
  2133. BOOL2=.TRUE.
  2134. GOTO 23
  2135. ENDIF
  2136. ENDDO
  2137. 23 CONTINUE
  2138. IF (.NOT.BOOL2) THEN
  2139. NBNN=IPTI0.NUM(/1)
  2140. NBELEM=IPTI0.NUM(/2)+1
  2141. SEGADJ,IPTI0
  2142. IPTI0.NUM(1,NBELEM)=NRA
  2143. IPTI0.NUM(2,NBELEM)=NRB
  2144. ENDIF
  2145. ENDDO
  2146. 18 CONTINUE
  2147. ENDDO
  2148. ENDDO
  2149. C Ajustement de IPTG0
  2150. NBNN=IPTG0.NUM(/1)
  2151. NBELEM=NBARETES
  2152. SEGADJ,IPTG0
  2153. C Mise a jour de ITFAC1 avec cette nouvelle numerotation
  2154. DO I=1,LV5.LECT(/1)
  2155. C cellules definissant l'ancienne face I
  2156. NCI=LV5.LECT(I)
  2157. NCJ=LV6.LECT(I)
  2158. IF (NCI.NE.0) THEN
  2159. C ancienne face englobante de I
  2160. NFOLD=LV1.LECT(I)
  2161. C nouveau numero de cette face
  2162. NFNEW=LV4.LECT(NFOLD)
  2163. ITFAC1.LACT(NCI,NCJ)=NFNEW
  2164. ITFAC1.LACT(NCJ,NCI)=NFNEW
  2165. ENDIF
  2166. ENDDO
  2167. C Ecrasement des tables et maillages precedents
  2168. MTAB11=MTAB10
  2169. IPTG=IPTG0
  2170. MTABC=MTABCC
  2171. MTABF=MTABFF
  2172. MTABA=MTABAA
  2173. NF=NBFACES
  2174. ENDIF
  2175. C
  2176. C
  2177. C
  2178. C----------------------------------------------------------------------C
  2179. C PARTIE 3 C
  2180. C Construction des cellules entieres en ajoutant les aretes internes C
  2181. C----------------------------------------------------------------------C
  2182. C
  2183. IF (IDIM.EQ.2) THEN
  2184. C IPT3 : maillage des cellules non coupees de MTAB1
  2185. CALL ACCTAB(MTAB1,'MOT ',0,0,'VISU',0,0,
  2186. & 'MAILLAGE',0,0,0,0,IPT3)
  2187. C ITARE1 : tableau donnant les cellules appuyees sur chaque
  2188. C arete de IPT3
  2189. CALL ACCTAB(MTAB1,'MOT ',0,0,'TAR',0,0,
  2190. & 'MVORO ',0,0,0,0,ITARE1)
  2191. SEGACT,IPT3,ITARE1
  2192. C MTABCC : table des cellules coupees fixee
  2193. SEGINI,MTABCC=MTABC
  2194. C Balayage des aretes non coupees IPT3 et ajout dans MTAB11 si
  2195. C elles sont contenues dans l'enveloppe
  2196. DO I=1,IPT3.NUM(/2)
  2197. C LV1 : liste des cellules appuyees sur l'arete I
  2198. JG=ITARE1.LACT(/1)
  2199. SEGINI,LV1
  2200. DO J=1,ITARE1.LACT(/1)
  2201. NCJ=ITARE1.LACT(J,I)
  2202. IF (NCJ.EQ.0) THEN
  2203. JG=J-1
  2204. GOTO 36
  2205. ENDIF
  2206. LV1.LECT(J)=NCJ
  2207. ENDDO
  2208. 36 CONTINUE
  2209. SEGADJ,LV1
  2210. C Si l'arete s'appuie sur 1 cellule, elle est forcement
  2211. C externe, donc on ne l'examine meme pas !
  2212. IF (LV1.LECT(/1).LT.1) THEN
  2213. GOTO 39
  2214. ENDIF
  2215. C Extremites de l'arete non coupee
  2216. NPA=IPT3.NUM(1,I)
  2217. NPB=IPT3.NUM(2,I)
  2218. C LV2 : Liste des noeuds situes sur l'arete de A vers B
  2219. JG=2
  2220. SEGINI,LV2
  2221. LV2.LECT(1)=NPA
  2222. LV2.LECT(2)=NPB
  2223. C LV3 : Indique si les noeuds de LV2 sont a inclure dans le
  2224. C maillage de l'arete coupee a sortir
  2225. JG=LV2.LECT(/1)
  2226. SEGINI,LV3
  2227. IA=0
  2228. CALL DEDANS(NPA,IPT2,ZERO2,BOOL1)
  2229. IF (BOOL1) IA=1
  2230. LV3.LECT(1)=IA
  2231. IB=0
  2232. CALL DEDANS(NPB,IPT2,ZERO2,BOOL1)
  2233. IF (BOOL1) IB=1
  2234. LV3.LECT(2)=IB
  2235. C LZ1 : Coordonnees barycentriques des noeuds de LV2
  2236. C 0 pour A, 1 pour B
  2237. JG=LV2.LECT(/1)
  2238. SEGINI,LZ1
  2239. LZ1.PROG(1)=0D0
  2240. LZ1.PROG(2)=1D0
  2241. C La premiere cellule de LV1 est elle une cellule coupee ?
  2242. BOOL1=.FALSE.
  2243. NC1=LV1.LECT(1)
  2244. NRC1=IPT1.NUM(1,NC1)
  2245. CALL ECROBJ('POINT ',NRC1)
  2246. CALL ECROBJ('TABLE ',MTABCC)
  2247. CALL EXIS
  2248. CALL LIRLOG(BOOL1,1,IRETOU)
  2249. IF (BOOL1) THEN
  2250. C La cellule C1 est coupee, donc l'arete I est peut etre
  2251. C coupee. Elle peut etre en plusieurs morceaux, on etablit
  2252. C la liste des noeuds definissant cette arete grace a
  2253. C LV2 et LV3 en ordonnant de PA vers PB
  2254. C Examen des noeuds de MTAB11.CELL.NRC1.VISU alignes
  2255. C sur la droite PA PB
  2256. CALL ACCTAB(MTABC,'POINT ',0,0,' ',0,NRC1,
  2257. & 'TABLE ',0,0,0,0,MTABI1)
  2258. CALL ACCTAB(MTABI1,'MOT ',0,0,'VISU',0,0,
  2259. & 'MAILLAGE',0,0,0,0,IPTI1)
  2260. SEGINI,IPT4=IPTI1
  2261. CALL CHANGE(IPT4,1)
  2262. DO J=1,IPT4.NUM(/2)
  2263. NPC=IPT4.NUM(1,J)
  2264. IF ((NPC.EQ.NPA).OR.(NPC.EQ.NPB)) GOTO 37
  2265. C C est il dans le segment [AB] ?
  2266. XA=XCOOR((NPA-1)*IDIMP1+1)
  2267. YA=XCOOR((NPA-1)*IDIMP1+2)
  2268. XB=XCOOR((NPB-1)*IDIMP1+1)
  2269. YB=XCOOR((NPB-1)*IDIMP1+2)
  2270. XC=XCOOR((NPC-1)*IDIMP1+1)
  2271. YC=XCOOR((NPC-1)*IDIMP1+2)
  2272. C Test sur les distances, si AC+CB=AB alors A,C,B
  2273. C sont alignes et se suivent
  2274. AB=SQRT(((XB-XA)**2)+((YB-YA)**2))
  2275. AC=SQRT(((XC-XA)**2)+((YC-YA)**2))
  2276. CB=SQRT(((XB-XC)**2)+((YB-YC)**2))
  2277. c-----------------------------------------------------------------------
  2278. IF ((ABS((AC+CB)-AB))/AB.LT.ZERO) THEN
  2279. c IF (ABS((AC+CB)-AB).LT.ZERO) THEN
  2280. c-----------------------------------------------------------------------
  2281. C Rangement du point C dans LV2 et LV3 selon sa
  2282. C coordonnee barycentrique LC
  2283. GC=AC/AB
  2284. DO K=1,LZ1.PROG(/1)-1
  2285. G1=LZ1.PROG(K)
  2286. G2=LZ1.PROG(K+1)
  2287. IF ((G1.LT.GC).AND.(GC.LT.G2)) THEN
  2288. IEME=K+1
  2289. GOTO 38
  2290. ENDIF
  2291. ENDDO
  2292. 38 CONTINUE
  2293. CALL INSER1(LZ1,IEME,GC)
  2294. SEGACT,LZ1
  2295. CALL INSER2(LV2,IEME,NPC)
  2296. SEGACT,LV2
  2297. IC=0
  2298. CALL DEDANS(NPC,IPT2,ZERO2,BOOL2)
  2299. IF (BOOL2) IC=1
  2300. CALL INSER2(LV3,IEME,IC)
  2301. SEGACT,LV3
  2302. ENDIF
  2303. 37 CONTINUE
  2304. ENDDO
  2305. ELSE
  2306. C La cellule C1 n'est pas coupee, donc l'arete I n'est pas
  2307. C coupee. Est elle a inclure ou bien a exclure ?
  2308. C Test si le centre NRC1 est dans l'enveloppe
  2309. CALL DEDANS(NRC1,IPT2,ZERO2,BOOL2)
  2310. IF (BOOL2) THEN
  2311. C L'arete (LV2,LV3) est a inclure entierement et ne
  2312. C contient que les points A et B
  2313. LV3.LECT(1)=1
  2314. LV3.LECT(2)=1
  2315. ELSE
  2316. C L'arete LV2 est a exclure entierement, on itere
  2317. GOTO 39
  2318. ENDIF
  2319. ENDIF
  2320. C Test si l'arete decrite par LV2 et LV3 est externe
  2321. BOOL1=.FALSE.
  2322. DO J=1,LV3.LECT(/1)
  2323. IF (LV3.LECT(J).NE.0) BOOL1=.TRUE.
  2324. ENDDO
  2325. IF (.NOT.BOOL1) THEN
  2326. GOTO 39
  2327. ENDIF
  2328. C Maillage IPT4 de l'arete suivant les listes LV2 et LV3
  2329. C IPT4 peut contenir plusieurs elements si cette arete est
  2330. C en plusieurs morceaux
  2331. NBNN=2
  2332. NBELEM=0
  2333. SEGINI,IPT4
  2334. IPT4.ITYPEL=2
  2335. BOOL1=.TRUE.
  2336. DO J=1,(LV2.LECT(/1)-1)
  2337. NA=LV2.LECT(J)
  2338. IA=LV3.LECT(J)
  2339. NB=LV2.LECT(J+1)
  2340. IB=LV3.LECT(J+1)
  2341. IF ((IA.EQ.1).AND.(IB.EQ.1).AND.BOOL1) THEN
  2342. C Ajout d'un element de maillage pour l'arete IPT4
  2343. NBNN=IPT4.NUM(/1)
  2344. NBELEM=IPT4.NUM(/2)+1
  2345. SEGADJ,IPT4
  2346. IPT4.NUM(1,NBELEM)=NA
  2347. IPT4.NUM(2,NBELEM)=NB
  2348. BOOL1=.FALSE.
  2349. ELSE
  2350. BOOL1=.TRUE.
  2351. ENDIF
  2352. ENDDO
  2353. C Recuperation du maillage, de la liste des aretes et du
  2354. C maillage des voisins pour les 2 cellules concernees
  2355. NC1=LV1.LECT(1)
  2356. NC2=LV1.LECT(2)
  2357. NRC1=IPT1.NUM(1,NC1)
  2358. NRC2=IPT1.NUM(1,NC2)
  2359. CALL ECROBJ('POINT ',NRC1)
  2360. CALL ECROBJ('TABLE ',MTABC)
  2361. CALL EXIS
  2362. CALL LIRLOG(BOOL1,1,IRETOU)
  2363. IF (.NOT.BOOL1) THEN
  2364. CALL CRTABL(MTABI1)
  2365. CALL ECCTAB(MTABC,'POINT ',0,0,' ',0,NRC1,
  2366. & 'TABLE ',0,0,0,0,MTABI1)
  2367. NBNN=2
  2368. NBELEM=0
  2369. SEGINI,IPTI1
  2370. IPTI1.ITYPEL=2
  2371. CALL ECCTAB(MTABI1,'MOT ',0,0,'VISU',0,0,
  2372. & 'MAILLAGE',0,0,0,0,IPTI1)
  2373. JG=0
  2374. SEGINI,LA1
  2375. CALL ECCTAB(MTABI1,'MOT ',0,0,'ARTS',0,0,
  2376. & 'LISTENTI',0,0,0,0,LA1)
  2377. NBNN=1
  2378. NBELEM=0
  2379. SEGINI,IPTVI1
  2380. IPTVI1.ITYPEL=1
  2381. CALL ECCTAB(MTABI1,'MOT ',0,0,'VOIS',0,0,
  2382. & 'MAILLAGE',0,0,0,0,IPTVI1)
  2383. ENDIF
  2384. CALL ACCTAB(MTABC,'POINT ',0,0,' ',0,NRC1,
  2385. & 'TABLE ',0,0,0,0,MTABI1)
  2386. CALL ACCTAB(MTABI1,'MOT ',0,0,'VISU',0,0,
  2387. & 'MAILLAGE',0,0,0,0,IPTI1)
  2388. CALL ACCTAB(MTABI1,'MOT ',0,0,'ARTS',0,0,
  2389. & 'LISTENTI',0,0,0,0,LA1)
  2390. CALL ACCTAB(MTABI1,'MOT ',0,0,'VOIS',0,0,
  2391. & 'MAILLAGE',0,0,0,0,IPTVI1)
  2392. CALL ECROBJ('POINT ',NRC2)
  2393. CALL ECROBJ('TABLE ',MTABC)
  2394. CALL EXIS
  2395. CALL LIRLOG(BOOL1,1,IRETOU)
  2396. IF (.NOT.BOOL1) THEN
  2397. CALL CRTABL(MTABI2)
  2398. CALL ECCTAB(MTABC,'POINT ',0,0,' ',0,NRC2,
  2399. & 'TABLE ',0,0,0,0,MTABI2)
  2400. NBNN=2
  2401. NBELEM=0
  2402. SEGINI,IPTI2
  2403. IPTI2.ITYPEL=2
  2404. CALL ECCTAB(MTABI2,'MOT ',0,0,'VISU',0,0,
  2405. & 'MAILLAGE',0,0,0,0,IPTI2)
  2406. JG=0
  2407. SEGINI,LA2
  2408. CALL ECCTAB(MTABI2,'MOT ',0,0,'ARTS',0,0,
  2409. & 'LISTENTI',0,0,0,0,LA2)
  2410. NBNN=1
  2411. NBELEM=0
  2412. SEGINI,IPTVI2
  2413. IPTVI2.ITYPEL=1
  2414. CALL ECCTAB(MTABI2,'MOT ',0,0,'VOIS',0,0,
  2415. & 'MAILLAGE',0,0,0,0,IPTVI2)
  2416. ENDIF
  2417. CALL ACCTAB(MTABC,'POINT ',0,0,' ',0,NRC2,
  2418. & 'TABLE ',0,0,0,0,MTABI2)
  2419. CALL ACCTAB(MTABI2,'MOT ',0,0,'VISU',0,0,
  2420. & 'MAILLAGE',0,0,0,0,IPTI2)
  2421. CALL ACCTAB(MTABI2,'MOT ',0,0,'ARTS',0,0,
  2422. & 'LISTENTI',0,0,0,0,LA2)
  2423. CALL ACCTAB(MTABI2,'MOT ',0,0,'VOIS',0,0,
  2424. & 'MAILLAGE',0,0,0,0,IPTVI2)
  2425. C Rangement des elements de IPT4 dans les indices de la table
  2426. C de sortie TAB11
  2427. C --> Ajout de(s) arete(s) dans TAB11.VISU et TAB11.ARTS
  2428. C ainsi que dans les tables des 2 cellules NRC1 et NRC2
  2429. NBELEG0=IPTG.NUM(/2)
  2430. NBNN=IPTG.NUM(/1)
  2431. NBELEM=NBELEG0+IPT4.NUM(/2)
  2432. SEGADJ,IPTG
  2433. DO J=1,IPT4.NUM(/2)
  2434. C pour IPTG
  2435. JJ=J+NBELEG0
  2436. IPTG.NUM(1,JJ)=IPT4.NUM(1,J)
  2437. IPTG.NUM(2,JJ)=IPT4.NUM(2,J)
  2438. C pour la table des aretes MTABA
  2439. NBNN=2
  2440. NBELEM=1
  2441. SEGINI,IPT5
  2442. IPT5.ITYPEL=2
  2443. IPT5.NUM(1,1)=IPT4.NUM(1,J)
  2444. IPT5.NUM(2,1)=IPT4.NUM(2,J)
  2445. CALL ECCTAB(MTABA,'ENTIER ',JJ,0,' ',0,0,
  2446. & 'MAILLAGE',0,0,0,0,IPT5)
  2447. C indice VISU pour la cellule NRC1
  2448. NBNN=IPTI1.NUM(/1)
  2449. NBELEM=IPTI1.NUM(/2)+1
  2450. SEGADJ,IPTI1
  2451. IPTI1.NUM(1,NBELEM)=IPT4.NUM(1,J)
  2452. IPTI1.NUM(2,NBELEM)=IPT4.NUM(2,J)
  2453. C indice ARTS pour la cellule NRC1
  2454. JG=LA1.LECT(/1)+1
  2455. SEGADJ,LA1
  2456. LA1.LECT(JG)=JJ
  2457. C indice VOIS pour la cellule NRC1
  2458. NBNN=IPTVI1.NUM(/1)
  2459. NBELEM=IPTVI1.NUM(/2)+1
  2460. SEGADJ,IPTVI1
  2461. IPTVI1.NUM(1,NBELEM)=NRC2
  2462. C indice VISU pour la cellule NRC2
  2463. NBNN=IPTI2.NUM(/1)
  2464. NBELEM=IPTI2.NUM(/2)+1
  2465. SEGADJ,IPTI2
  2466. IPTI2.NUM(1,NBELEM)=IPT4.NUM(1,J)
  2467. IPTI2.NUM(2,NBELEM)=IPT4.NUM(2,J)
  2468. C indice ARTS pour la cellule NRC2
  2469. JG=LA2.LECT(/1)+1
  2470. SEGADJ,LA2
  2471. LA2.LECT(JG)=JJ
  2472. C indice VOIS pour la cellule NRC2
  2473. NBNN=IPTVI2.NUM(/1)
  2474. NBELEM=IPTVI2.NUM(/2)+1
  2475. SEGADJ,IPTVI2
  2476. IPTVI2.NUM(1,NBELEM)=NRC1
  2477. ENDDO
  2478. 39 CONTINUE
  2479. ENDDO
  2480. C
  2481. C
  2482. ELSEIF (IDIM.EQ.3) THEN
  2483. NF0=NF
  2484. C IPT3 : maillage MAV cellules non coupees de MTAB1
  2485. CALL ACCTAB(MTAB1,'MOT ',0,0,'VISU',0,0,
  2486. & 'MAILLAGE',0,0,0,0,IPT3)
  2487. C ITARE1 : tableau donnant les cellules appuyees sur chaque
  2488. C arete de IPT3
  2489. CALL ACCTAB(MTAB1,'MOT ',0,0,'TAR',0,0,
  2490. & 'MVORO ',0,0,0,0,ITARE1)
  2491. SEGACT,IPT3,ITARE1
  2492. C MTABCC : table des cellules coupees fixee
  2493. SEGINI,MTABCC=MTABC
  2494. C Balayage des aretes non coupees IPT3 et ajout dans MTAB11 si
  2495. C elles sont contenues dans l'enveloppe
  2496. DO I=1,IPT3.NUM(/2)
  2497. C LV1 : liste des cellules appuyees sur l'arete I
  2498. JG=ITARE1.LACT(/1)
  2499. SEGINI,LV1
  2500. DO J=1,ITARE1.LACT(/1)
  2501. NCJ=ITARE1.LACT(J,I)
  2502. IF (NCJ.EQ.0) THEN
  2503. JG=J-1
  2504. GOTO 10
  2505. ENDIF
  2506. LV1.LECT(J)=NCJ
  2507. ENDDO
  2508. 10 CONTINUE
  2509. SEGADJ,LV1
  2510. C Si l'arete s'appuie sur moins de 3 cellules, elle est
  2511. C forcement externe, donc on ne l'examine meme pas !
  2512. IF (LV1.LECT(/1).LT.3) THEN
  2513. GOTO 11
  2514. ENDIF
  2515. C Extremites de l'arete non coupee
  2516. NPA=IPT3.NUM(1,I)
  2517. NPB=IPT3.NUM(2,I)
  2518. C LV2 : Liste des noeuds situes sur l'arete de A vers B
  2519. JG=2
  2520. SEGINI,LV2
  2521. LV2.LECT(1)=NPA
  2522. LV2.LECT(2)=NPB
  2523. C LV3 : Indique si les noeuds de LV2 sont a inclure dans le
  2524. C maillage de l'arete coupee a sortir
  2525. JG=LV2.LECT(/1)
  2526. SEGINI,LV3
  2527. IA=0
  2528. CALL DEDANS(NPA,IPT2,ZERO2,BOOL1)
  2529. IF (BOOL1) IA=1
  2530. LV3.LECT(1)=IA
  2531. IB=0
  2532. CALL DEDANS(NPB,IPT2,ZERO2,BOOL1)
  2533. IF (BOOL1) IB=1
  2534. LV3.LECT(2)=IB
  2535. C LZ1 : Coordonnees barycentriques des noeuds de LV2
  2536. C 0 pour A, 1 pour B
  2537. JG=LV2.LECT(/1)
  2538. SEGINI,LZ1
  2539. LZ1.PROG(1)=0D0
  2540. LZ1.PROG(2)=1D0
  2541. C La premiere cellule de LV1 est elle une cellule coupee ?
  2542. BOOL1=.FALSE.
  2543. NC1=LV1.LECT(1)
  2544. NRC1=IPT1.NUM(1,NC1)
  2545. CALL ECROBJ('POINT ',NRC1)
  2546. CALL ECROBJ('TABLE ',MTABCC)
  2547. CALL EXIS
  2548. CALL LIRLOG(BOOL1,1,IRETOU)
  2549. IF (BOOL1) THEN
  2550. C La cellule C1 est coupee, donc l'arete I est peut etre
  2551. C coupee. Elle peut etre en plusieurs morceaux, on etablit
  2552. C la liste des noeuds definissant cette arete grace a
  2553. C LV2 et LV3 en ordonnant de PA vers PB
  2554. C Examen des noeuds de MTAB11.CELL.NRC1.VISU alignes
  2555. C sur la droite PA PB
  2556. CALL ACCTAB(MTABC,'POINT ',0,0,' ',0,NRC1,
  2557. & 'TABLE ',0,0,0,0,MTABI1)
  2558. CALL ACCTAB(MTABI1,'MOT ',0,0,'VISU',0,0,
  2559. & 'MAILLAGE',0,0,0,0,IPTI1)
  2560. SEGINI,IPT4=IPTI1
  2561. CALL CHANGE(IPT4,1)
  2562. DO J=1,IPT4.NUM(/2)
  2563. NPC=IPT4.NUM(1,J)
  2564. IF ((NPC.EQ.NPA).OR.(NPC.EQ.NPB)) GOTO 22
  2565. C C est il dans le segment [AB] ?
  2566. XA=XCOOR((NPA-1)*IDIMP1+1)
  2567. YA=XCOOR((NPA-1)*IDIMP1+2)
  2568. ZA=XCOOR((NPA-1)*IDIMP1+3)
  2569. XB=XCOOR((NPB-1)*IDIMP1+1)
  2570. YB=XCOOR((NPB-1)*IDIMP1+2)
  2571. ZB=XCOOR((NPB-1)*IDIMP1+3)
  2572. XC=XCOOR((NPC-1)*IDIMP1+1)
  2573. YC=XCOOR((NPC-1)*IDIMP1+2)
  2574. ZC=XCOOR((NPC-1)*IDIMP1+3)
  2575. C Test sur les distances, si AC+CB=AB alors A,C,B
  2576. C sont alignes et se suivent
  2577. AB=SQRT(((XB-XA)**2)+((YB-YA)**2)+((ZB-ZA)**2))
  2578. AC=SQRT(((XC-XA)**2)+((YC-YA)**2)+((ZC-ZA)**2))
  2579. CB=SQRT(((XB-XC)**2)+((YB-YC)**2)+((ZB-ZC)**2))
  2580. c-----------------------------------------------------------------------
  2581. IF ((ABS((AC+CB)-AB))/AB.LT.ZERO) THEN
  2582. c IF (ABS((AC+CB)-AB).LT.ZERO) THEN
  2583. c-----------------------------------------------------------------------
  2584. C Rangement du point C dans LV2 et LV3 selon sa
  2585. C coordonnee barycentrique LC
  2586. GC=AC/AB
  2587. DO K=1,LZ1.PROG(/1)-1
  2588. G1=LZ1.PROG(K)
  2589. G2=LZ1.PROG(K+1)
  2590. IF ((G1.LT.GC).AND.(GC.LT.G2)) THEN
  2591. IEME=K+1
  2592. GOTO 12
  2593. ENDIF
  2594. ENDDO
  2595. 12 CONTINUE
  2596. CALL INSER1(LZ1,IEME,GC)
  2597. SEGACT,LZ1
  2598. CALL INSER2(LV2,IEME,NPC)
  2599. SEGACT,LV2
  2600. IC=0
  2601. CALL DEDANS(NPC,IPT2,ZERO2,BOOL2)
  2602. IF (BOOL2) IC=1
  2603. CALL INSER2(LV3,IEME,IC)
  2604. SEGACT,LV3
  2605. ENDIF
  2606. 22 CONTINUE
  2607. ENDDO
  2608. ELSE
  2609. C La cellule C1 n'est pas coupee, donc l'arete I n'est pas
  2610. C coupee. Est elle a inclure ou bien a exclure ?
  2611. C Test si le centre NRC1 est dans l'enveloppe
  2612. CALL DEDANS(NRC1,IPT2,ZERO2,BOOL2)
  2613. IF (BOOL2) THEN
  2614. C L'arete (LV2,LV3) est a inclure entierement et ne
  2615. C contient que les points A et B
  2616. LV3.LECT(1)=1
  2617. LV3.LECT(2)=1
  2618. ELSE
  2619. C L'arete LV2 est a exclure entierement, on itere
  2620. GOTO 11
  2621. ENDIF
  2622. ENDIF
  2623. C Test si l'arete decrite par LV2 et LV3 est externe
  2624. BOOL1=.FALSE.
  2625. DO J=1,LV3.LECT(/1)
  2626. IF (LV3.LECT(J).NE.0) BOOL1=.TRUE.
  2627. ENDDO
  2628. IF (.NOT.BOOL1) THEN
  2629. GOTO 11
  2630. ENDIF
  2631. C Maillage IPT4 de l'arete suivant les listes LV2 et LV3
  2632. C IPT4 peut contenir plusieurs elements si cette arete est
  2633. C en plusieurs morceaux
  2634. NBNN=2
  2635. NBELEM=0
  2636. SEGINI,IPT4
  2637. IPT4.ITYPEL=2
  2638. BOOL1=.TRUE.
  2639. DO J=1,(LV2.LECT(/1)-1)
  2640. NA=LV2.LECT(J)
  2641. IA=LV3.LECT(J)
  2642. NB=LV2.LECT(J+1)
  2643. IB=LV3.LECT(J+1)
  2644. IF ((IA.EQ.1).AND.(IB.EQ.1).AND.BOOL1) THEN
  2645. C Ajout d'un element de maillage pour l'arete IPT4
  2646. NBNN=IPT4.NUM(/1)
  2647. NBELEM=IPT4.NUM(/2)+1
  2648. SEGADJ,IPT4
  2649. IPT4.NUM(1,NBELEM)=NA
  2650. IPT4.NUM(2,NBELEM)=NB
  2651. BOOL1=.FALSE.
  2652. ELSE
  2653. BOOL1=.TRUE.
  2654. ENDIF
  2655. ENDDO
  2656. C Rangement des elements de IPT4 dans les indices de la table
  2657. C de sortie TAB11
  2658. C --> Ajout de(s) arete(s) dans TAB11.VISU et TAB11.ARTS
  2659. NBELEG0=IPTG.NUM(/2)
  2660. NBNN=IPTG.NUM(/1)
  2661. NBELEM=NBELEG0+IPT4.NUM(/2)
  2662. SEGADJ,IPTG
  2663. DO J=1,IPT4.NUM(/2)
  2664. JJ=J+NBELEG0
  2665. IPTG.NUM(1,JJ)=IPT4.NUM(1,J)
  2666. IPTG.NUM(2,JJ)=IPT4.NUM(2,J)
  2667. NBNN=2
  2668. NBELEM=1
  2669. SEGINI,IPT5
  2670. IPT5.ITYPEL=2
  2671. IPT5.NUM(1,1)=IPT4.NUM(1,J)
  2672. IPT5.NUM(2,1)=IPT4.NUM(2,J)
  2673. CALL ECCTAB(MTABA,'ENTIER ',JJ,0,' ',0,0,
  2674. & 'MAILLAGE',0,0,0,0,IPT5)
  2675. ENDDO
  2676. C --> Ajout de(s) arete(s) pour chaque cellule concernee dans
  2677. C TAB11.CELL.NRC1
  2678. DO J=1,LV1.LECT(/1)
  2679. NC1=LV1.LECT(J)
  2680. NRC1=IPT1.NUM(1,NC1)
  2681. CALL ECROBJ('POINT ',NRC1)
  2682. CALL ECROBJ('TABLE ',MTABC)
  2683. CALL EXIS
  2684. CALL LIRLOG(BOOL1,1,IRETOU)
  2685. IF (.NOT.BOOL1) THEN
  2686. CALL CRTABL(MTABI1)
  2687. CALL ECCTAB(MTABC,'POINT ',0,0,' ',0,NRC1,
  2688. & 'TABLE ',0,0,0,0,MTABI1)
  2689. NBNN=2
  2690. NBELEM=0
  2691. SEGINI,IPTI1
  2692. IPTI1.ITYPEL=2
  2693. CALL ECCTAB(MTABI1,'MOT ',0,0,'VISU',0,0,
  2694. & 'MAILLAGE',0,0,0,0,IPTI1)
  2695. JG=0
  2696. SEGINI,LFI1
  2697. CALL ECCTAB(MTABI1,'MOT ',0,0,'FACS',0,0,
  2698. & 'LISTENTI',0,0,0,0,LFI1)
  2699. NBNN=1
  2700. NBELEM=0
  2701. SEGINI,IPTVI1
  2702. IPTVI1.ITYPEL=1
  2703. CALL ECCTAB(MTABI1,'MOT ',0,0,'VOIS',0,0,
  2704. & 'MAILLAGE',0,0,0,0,IPTVI1)
  2705. ENDIF
  2706. CALL ACCTAB(MTABC,'POINT ',0,0,' ',0,NRC1,
  2707. & 'TABLE ',0,0,0,0,MTABI1)
  2708. C ajout des elements de l'arete IPT4 dans l'indice
  2709. C TAB11.CELL.NRC1.VISU
  2710. CALL ACCTAB(MTABI1,'MOT ',0,0,'VISU',0,0,
  2711. & 'MAILLAGE',0,0,0,0,IPTI1)
  2712. NBELEI10=IPTI1.NUM(/2)
  2713. NBNN=IPTI1.NUM(/1)
  2714. NBELEM=NBELEI10+IPT4.NUM(/2)
  2715. SEGADJ,IPTI1
  2716. DO K=1,IPT4.NUM(/2)
  2717. KK=K+NBELEI10
  2718. IPTI1.NUM(1,KK)=IPT4.NUM(1,K)
  2719. IPTI1.NUM(2,KK)=IPT4.NUM(2,K)
  2720. ENDDO
  2721. CALL ACCTAB(MTABI1,'MOT ',0,0,'FACS',0,0,
  2722. & 'LISTENTI',0,0,0,0,LFI1)
  2723. CALL ACCTAB(MTABI1,'MOT ',0,0,'VOIS',0,0,
  2724. & 'MAILLAGE',0,0,0,0,IPTVI1)
  2725. C renseignement des faces/voisins pour le polyedre NRC1
  2726. C boucle sur les autres cellules partageant l'arete IPT4
  2727. DO K=1,LV1.LECT(/1)
  2728. IF (K.EQ.J) GOTO 20
  2729. C la cellule NRC2 partage l'arete IPT4
  2730. NC2=LV1.LECT(K)
  2731. NRC2=IPT1.NUM(1,NC2)
  2732. C mais est elle voisine de NRC1 ? on regarde dans le
  2733. C maillage de ses voisins
  2734. CALL ACCTAB(MTAB1,'MOT ',0,0,'CELL',0,0,
  2735. & 'TABLE ',0,0,0,0,MTABCCC)
  2736. CALL ACCTAB(MTABCCC,'POINT ',0,0,' ',0,NRC1,
  2737. & 'TABLE ',0,0,0,0,MTABI00)
  2738. CALL ACCTAB(MTABI00,'MOT ',0,0,'VOIS',0,0,
  2739. & 'MAILLAGE',0,0,0,0,IPTVI00)
  2740. BOOL1=.FALSE.
  2741. DO L=1,IPTVI00.NUM(/2)
  2742. IF (IPTVI00.NUM(1,L).EQ.NRC2) THEN
  2743. BOOL1=.TRUE.
  2744. GOTO 26
  2745. ENDIF
  2746. ENDDO
  2747. 26 CONTINUE
  2748. IF (BOOL1) THEN
  2749. C si oui, NC1.NC2 forment une face mais laquelle ?
  2750. C on va checher le numero de la face dans ITFAC1
  2751. NF12=ITFAC1.LACT(NC1,NC2)
  2752. IF (NF12.EQ.0) THEN
  2753. C il s'agit d'une nouvelle face a creer
  2754. NF=NF+1
  2755. NF12=NF
  2756. ITFAC1.LACT(NC1,NC2)=NF12
  2757. ITFAC1.LACT(NC2,NC1)=NF12
  2758. ENDIF
  2759. C ajout du numero NF12 a la liste des faces si besoin
  2760. CALL ECRENT(NF12)
  2761. CALL ECROBJ('LISTENTI',LFI1)
  2762. CALL EXIS
  2763. SEGACT,LFI1
  2764. CALL LIRLOG(BOOL2,1,IRETOU)
  2765. IF (.NOT.BOOL2) THEN
  2766. JG=LFI1.LECT(/1)+1
  2767. SEGADJ,LFI1
  2768. LFI1.LECT(JG)=NF12
  2769. ENDIF
  2770. C ajout du point NRC2 au maillage des voisins
  2771. C si besoin
  2772. CALL ECROBJ('MAILLAGE',IPTVI1)
  2773. CALL ECROBJ('POINT ',NRC2)
  2774. CALL DANS
  2775. SEGACT,IPTVI1
  2776. CALL LIRLOG(BOOL2,1,IRETOU)
  2777. IF (.NOT.BOOL2) THEN
  2778. NBNN=IPTVI1.NUM(/1)
  2779. NBELEM=IPTVI1.NUM(/2)+1
  2780. SEGADJ,IPTVI1
  2781. IPTVI1.NUM(1,NBELEM)=NRC2
  2782. ENDIF
  2783. C ajout de(s) arete(s) dans la face NF12 si besoin
  2784. CALL ECRENT(NF12)
  2785. CALL ECROBJ('TABLE ',MTABF)
  2786. CALL EXIS
  2787. CALL LIRLOG(BOOL2,1,IRETOU)
  2788. IF (.NOT.BOOL2) THEN
  2789. CALL CRTABL(MTABF1)
  2790. CALL ECCTAB(MTABF,'ENTIER ',NF12,0,' ',0,0,
  2791. & 'TABLE ',0,0,0,0,MTABF1)
  2792. NBNN=2
  2793. NBELEM=0
  2794. SEGINI,IPTF1
  2795. IPTF1.ITYPEL=2
  2796. CALL ECCTAB(MTABF1,'MOT ',0,0,'VISU',0,0,
  2797. & 'MAILLAGE',0,0,0,0,IPTF1)
  2798. JG=0
  2799. SEGINI,LA1
  2800. CALL ECCTAB(MTABF1,'MOT ',0,0,'ARTS',0,0,
  2801. & 'LISTENTI',0,0,0,0,LA1)
  2802.  
  2803. ENDIF
  2804. CALL ACCTAB(MTABF,'ENTIER ',NF12,0,' ',0,0,
  2805. & 'TABLE ',0,0,0,0,MTABF1)
  2806. CALL ACCTAB(MTABF1,'MOT ',0,0,'VISU',0,0,
  2807. & 'MAILLAGE',0,0,0,0,IPTF1)
  2808. CALL ACCTAB(MTABF1,'MOT ',0,0,'ARTS',0,0,
  2809. & 'LISTENTI',0,0,0,0,LA1)
  2810. DO L=1,IPT4.NUM(/2)
  2811. NARETL=NBELEG0+L
  2812. CALL ECRENT(NARETL)
  2813. CALL ECROBJ('LISTENTI',LA1)
  2814. CALL EXIS
  2815. SEGACT,LA1
  2816. CALL LIRLOG(BOOL2,1,IRETOU)
  2817. IF (.NOT.BOOL2) THEN
  2818. JG=LA1.LECT(/1)+1
  2819. SEGADJ,LA1
  2820. LA1.LECT(JG)=NARETL
  2821. NBNN=IPTF1.NUM(/1)
  2822. NBELEM=IPTF1.NUM(/2)+1
  2823. SEGADJ,IPTF1
  2824. IPTF1.NUM(1,NBELEM)=IPT4.NUM(1,L)
  2825. IPTF1.NUM(2,NBELEM)=IPT4.NUM(2,L)
  2826. ENDIF
  2827. ENDDO
  2828. ENDIF
  2829. 20 CONTINUE
  2830. ENDDO
  2831. ENDDO
  2832. 11 CONTINUE
  2833. ENDDO
  2834. ENDIF
  2835. C
  2836. C
  2837. c enregistrer le champ par point
  2838. IF (MCHPOI .ne. 0) then
  2839. CALL ECCTAB(MTAB11,'MOT ',0,0,'POND',0,0,
  2840. & 'CHPOINT',0,0,0,0,MCHPOI)
  2841. ENDIF
  2842. C
  2843. C----------------------------------------------------------------------C
  2844. C PARTIE 4 C
  2845. C On rend la table MTAB11 C
  2846. C----------------------------------------------------------------------C
  2847. C
  2848. C
  2849. MTAB1=MTAB11
  2850. 999 RETURN
  2851. END
  2852.  
  2853.  
  2854.  
  2855.  
  2856.  
  2857.  
  2858.  
  2859.  
  2860.  
  2861.  
  2862.  
  2863.  

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