Télécharger part7.eso

Retour à la liste

Numérotation des lignes :

part7
  1. C PART7 SOURCE GOUNAND 26/01/09 21:15:47 12442
  2. ************************************************************************
  3. * NOM : PART7
  4. * DESCRIPTION : Sous-programme dedie a la separation en composantes
  5. * connexes d'un maillage + regles supplementaires de
  6. * separation en differentes zones
  7. ************************************************************************
  8. * APPELE PAR : part.eso ; ccon.eso (obsolete)
  9. ************************************************************************
  10. * ENTREES :: MEL1 = pointeur sur le maillage a partitionner
  11. * KLI > 0 si option 'LIGN'
  12. * KFA > 0 si option 'FACE'
  13. * KMA > 0 si option 'MAIL'
  14. * MEL2 = pointeur sur le maillage separateur (option 'MAIL')
  15. * KAN > 0 si option 'ANGL'
  16. * ANG = valeur seuil pour l'angle (option 'ANGL')
  17. * ITQ > 0 si mot-cle 'TELQ' present (option 'ANGL')
  18. * KESCL > 0 si besoin des indices SOUSTYPE et CREATEUR
  19. * SORTIES :: ITAB = pointeur vers la table de partitionnement
  20. ************************************************************************
  21. SUBROUTINE PART7(MEL1,KLI,KFA,KMA,MEL2,KAN,ANG,ITQ,ITAB,KESCL)
  22.  
  23. IMPLICIT INTEGER(I-N)
  24. IMPLICIT REAL*8 (A-H,O-Z)
  25.  
  26.  
  27. -INC PPARAM
  28. -INC CCOPTIO
  29. -INC CCGEOME
  30. -INC SMCOORD
  31. -INC SMELEME
  32. -INC SMTABLE
  33. -INC SMCHAML
  34. -INC SMMODEL
  35.  
  36. SEGMENT JMEM(NODES+1)
  37. C JMEM CONTIENT LE NOMBRE D'ELEMENTS AUQUEL APPARTIENT CHAQUE NOEUD
  38. C PUIS LA POSITION DU PREMIER ELEMENT DANS IMEMO ET LMEMO
  39.  
  40. SEGMENT ICPR(nbpts)
  41. C ICPR(I) DONNE LE NUMERO LOCAL (DANS LES TABLEAUX DE LA PRESENTE
  42. C SUBROUTINE) DU I-EME NOEUD GLOBAL (DANS LA TABLE MCOORD)
  43.  
  44. SEGMENT IMEMO(NBV),LMEMO(NBV)
  45. C CONTIENT LA LISTE DES ELEMENTS APPARTENANT AU NOEUD 1, 2, 3...
  46. C (IMEMO => NUMERO DE L'ELEMENT ET LMEMO => NUMERO DU LISOUS)
  47.  
  48. SEGMENT LISIND(NBS)
  49. C POINTE VERS LES SEGMENTS INDIC ASSOCIES A CHAQUE SOUS-MAILLAGE
  50.  
  51. SEGMENT JMEM2(NODES2+1),ICPR2(nbpts),IMEMO2(NBV2),
  52. & LMEMO2(NBV2)
  53. C IDEM, MAIS POUR LE MAILLAGE SEPARATEUR
  54.  
  55. SEGMENT INDIC(NBEL)
  56. C INDICATEUR DU NUMERO DE ZONE
  57.  
  58. SEGMENT LISCO1(NELTOT),LISCO2(NELTOT)
  59. C LISTES DES ELEMENTS VOISINS
  60.  
  61. SEGMENT LISIN(NNOMAX)
  62. C LISTE DES NOEUDS A L'INTERFACE ENTRE DEUX ELEMENTS VOISINS
  63.  
  64. SEGMENT MIELVA
  65. INTEGER IELVAX(N1)
  66. INTEGER IELVAY(N1)
  67. INTEGER IELVAZ(N1)
  68. ENDSEGMENT
  69. C POINTEURS VERS LES SEGMENTS MELVAL (OPTION 'ANGL')
  70.  
  71. LOGICAL KDIM1,KDIM2,KDIM3
  72. INTEGER NNOMAX
  73.  
  74.  
  75.  
  76.  
  77. * +---------------------------------------------------------------+
  78. * | |
  79. * | I N I T I A L I S A T I O N S |
  80. * | |
  81. * +---------------------------------------------------------------+
  82.  
  83.  
  84.  
  85. * VERIFICATION QUE LE MAILLAGE EST COMPATIBLE AVEC LES OPTIONS
  86. * FOURNIES
  87. * ************************************************************
  88. NNOMAX=0
  89. MELEME=MEL1
  90. SEGACT,MELEME
  91. IPT1=MELEME
  92.  
  93. IDIM1=0
  94. IDIM2=0
  95. IDIM3=0
  96. DO ISO=1,MAX(1,LISOUS(/1))
  97. IF (LISOUS(/1).GT.1) THEN
  98. IPT1=LISOUS(ISO)
  99. SEGACT,IPT1
  100. ENDIF
  101.  
  102. ITY=IPT1.ITYPEL
  103. NNOMAX=MAX(NNOMAX,NBNNE(ITY))
  104.  
  105. * KDIM1=(LDLR(ITY).EQ.1.AND.ITY.NE.12.AND.ITY.NE.13)
  106. * KDIM2=(ITY.EQ.KSURF(ITY))
  107. * KDIM3=(LDLR(ITY).EQ.3.AND.ITY.NE.30.AND.ITY.NE.31)
  108. KDIM1=(LDLR(ITY).EQ.1)
  109. KDIM2=(LDLR(ITY).EQ.2)
  110. KDIM3=(LDLR(ITY).EQ.3)
  111.  
  112. * Element special type 'MULT' ou 'SUPE'
  113. IF (.NOT.(KDIM1.OR.KDIM2.OR.KDIM3)) THEN
  114. CALL ERREUR(16)
  115. RETURN
  116. ENDIF
  117.  
  118. IF (KDIM1) IDIM1=IDIM1+1
  119. IF (KDIM2) IDIM2=IDIM2+1
  120. IF (KDIM3) IDIM3=IDIM3+1
  121. ENDDO
  122.  
  123. IF ((KFA.GT.0.AND.(IDIM1.GT.0.OR.IDIM3.GT.0)).OR.
  124. & (KLI.GT.0.AND.(IDIM2.GT.0.OR.IDIM3.GT.0)).OR.
  125. & (KAN.GT.0.AND.IDIM3.GT.0)) THEN
  126. CALL ERREUR(16)
  127. RETURN
  128. ENDIF
  129.  
  130.  
  131. * OPTION 'ANGL' => CREATION DES TABLEAUX DONNANT LE VECTEUR
  132. * NORMAL/TANGENT A CHAQUE ELEMENT
  133. * *********************************************************
  134.  
  135. IF (KAN.GT.0) THEN
  136.  
  137. * Transformation en un maillage lineaire
  138. CALL ECROBJ('MAILLAGE',MELEME)
  139. CALL CHANLI
  140. IF (IERR.NE.0) RETURN
  141. CALL LIROBJ('MAILLAGE',MELEME,1,IRET)
  142. IF (IERR.NE.0) RETURN
  143.  
  144. * Creation d'un objet MMODEL temporaire (le type est sans
  145. * importance)
  146. CALL ECRCHA('POUT')
  147. CALL ECRCHA('COQ4')
  148. CALL ECRCHA('COQ3')
  149. CALL ECRCHA('ELASTIQUE')
  150. CALL ECRCHA('MECANIQUE')
  151. CALL ECROBJ('MAILLAGE',MELEME)
  152. CALL MODELI
  153. IF (IERR.NE.0) RETURN
  154. CALL LIROBJ('MMODEL ',IPMODL,1,IRET)
  155. CALL ACTOBJ('MMODEL ',IPMODL,1)
  156. IF (IERR.NE.0) RETURN
  157.  
  158. * Calcul des vecteurs directeurs
  159. SEGACT,MCOORD
  160. CALL JACONO(IPMODL,1,IPCHE5,IRET)
  161. IF (IERR.NE.0) RETURN
  162.  
  163. * On ne garde qu'une seule valeur par element (=> type GRAVITE)
  164. CALL CHASUP(IPMODL,IPCHE5,IPCHE2,IRET,2)
  165. IF (IERR.NE.0) RETURN
  166. IF (IRET.NE.0) THEN
  167. CALL ERREUR(IRET)
  168. RETURN
  169. ENDIF
  170.  
  171. * On recupere le MELEME pour etre sur d'avoir le bon ordre de
  172. * description des elements
  173. CALL ECRCHA('MAIL')
  174. CALL ECROBJ('MCHAML',IPCHE2)
  175. CALL EXTRAI
  176. IF (IERR.NE.0) RETURN
  177. CALL LIROBJ('MAILLAGE',MELEME,1,IRET)
  178. IF (IERR.NE.0) RETURN
  179.  
  180. * Suppression de l'objet MMODEL
  181. MMODEL=IPMODL
  182. SEGACT,MMODEL
  183. DO K=1,KMODEL(/1)
  184. IMODEL=KMODEL(K)
  185. SEGSUP,IMODEL
  186. ENDDO
  187. SEGSUP,MMODEL
  188.  
  189. * Remplissage du segment MIELVA (pointeurs vers les MELVAL)
  190. MCHELM=IPCHE2
  191. SEGACT,MCHELM
  192. N1=ICHAML(/1)
  193. SEGINI,MIELVA
  194. DO I=1,N1
  195. MCHAML=ICHAML(I)
  196. SEGACT,MCHAML
  197.  
  198. IELVAX(I)=IELVAL(1)
  199. MELVAL=IELVAX(I)
  200. SEGACT,MELVAL
  201.  
  202. IELVAY(I)=IELVAL(2)
  203. MELVAL=IELVAY(I)
  204. SEGACT,MELVAL
  205.  
  206. IF (IDIM.EQ.3) THEN
  207. IELVAZ(I)=IELVAL(3)
  208. MELVAL=IELVAZ(I)
  209. SEGACT,MELVAL
  210. ENDIF
  211.  
  212. SEGSUP,MCHAML
  213. ENDDO
  214. SEGSUP,MCHELM
  215.  
  216. ENDIF
  217.  
  218.  
  219. * CORRESPONDANCE ENTRE LES NUMEROTATIONS LOCALE/GLOBALE
  220. * *****************************************************
  221.  
  222. SEGINI,ICPR
  223.  
  224. SEGACT,MELEME
  225. NBSOUS=LISOUS(/1)
  226. NBS=MAX(1,NBSOUS)
  227. IPT1=MELEME
  228.  
  229. * Boucle sur les eventuels sous-maillages
  230. IKOU=0
  231. DO 100 IO=1,NBS
  232. IF (NBSOUS.GT.0) THEN
  233. IPT1=LISOUS(IO)
  234. SEGACT,IPT1
  235. ENDIF
  236.  
  237. * Remplissage du tableau de correspondance ICPR
  238. DO 150 J=1,IPT1.NUM(/2)
  239. DO 151 I=1,IPT1.NUM(/1)
  240. IJ=IPT1.NUM(I,J)
  241. IF (ICPR(IJ).EQ.0) THEN
  242. IKOU=IKOU+1
  243. ICPR(IJ)=IKOU
  244. ENDIF
  245. 151 CONTINUE
  246. 150 CONTINUE
  247.  
  248. 100 CONTINUE
  249.  
  250. * Nombre de noeuds distincts dans le maillage
  251. NODES=IKOU
  252.  
  253. * MAILLAGE vide => on sort des maintenant
  254. IF (NODES.EQ.0) THEN
  255. M=0
  256. SEGINI,MTABLE
  257. ITAB=MTABLE
  258. MLOTAB=0
  259. GOTO 9999
  260. ENDIF
  261.  
  262. *
  263. * IDENTIFICATION DES ELEMENTS OU APPARAISSENT TOUS LES NOEUDS
  264. * => IMEMO = NUMERO DE ELEMENT
  265. * => LMEMO = NUMERO DU SOUS-MAILLGE
  266. * JMEM(I)+1 IDENTIFIE LA POSITION DANS IMEMO/LMEMO DU PREMIER
  267. * ELEMENT ASSOCIE AU NOEUD I
  268. * ***************************************************************
  269.  
  270. SEGINI,JMEM
  271.  
  272. * On compte combien de fois chaque noeud apparait dans le maillage
  273. DO 200 IO=1,NBS
  274. IF (NBSOUS.GT.0) IPT1=LISOUS(IO)
  275. DO 250 J=1,IPT1.NUM(/2)
  276. DO 251 I=1,IPT1.NUM(/1)
  277. IJ=ICPR(IPT1.NUM(I,J))
  278. JMEM(IJ)=JMEM(IJ)+1
  279. 251 CONTINUE
  280. 250 CONTINUE
  281. 200 CONTINUE
  282. *
  283. * On en deduit par cumul la position de depart dans IMEMO/LMEMO
  284. DO 290 I=1+1,NODES+1
  285. JMEM(I)=JMEM(I)+JMEM(I-1)
  286. 290 CONTINUE
  287. NBV=JMEM(NODES)
  288. *
  289. * Remplissage de IMEMO et LMEMO
  290. SEGINI,IMEMO,LMEMO
  291. DO 300 IO=1,NBS
  292. IF (NBSOUS.GT.0) IPT1=LISOUS(IO)
  293. DO 350 J=1,IPT1.NUM(/2)
  294. DO 351 I=1,IPT1.NUM(/1)
  295. IJ=ICPR(IPT1.NUM(I,J))
  296. IMEMO(JMEM(IJ))=J
  297. LMEMO(JMEM(IJ))=IO
  298. JMEM(IJ)=JMEM(IJ)-1
  299. 351 CONTINUE
  300. 350 CONTINUE
  301. 300 CONTINUE
  302.  
  303.  
  304. * OPTION 'MAIL' => ON REMPLIT DE LA MEME MANIERE ICPR2, JMEM2,
  305. * IMEMO2 ET LMEMO2
  306. * ************************************************************
  307.  
  308. IF (KMA.GT.0) THEN
  309.  
  310. * Tableau ICPR2
  311. SEGINI,ICPR2
  312. IPT2=MEL2
  313. SEGACT,IPT2
  314. NBSOU2=IPT2.LISOUS(/1)
  315. NBS2=MAX(1,NBSOU2)
  316. IPT5=IPT2
  317. IKOU=0
  318. DO 400 IO=1,NBS2
  319. IF (NBSOU2.GT.0) THEN
  320. IPT5=IPT2.LISOUS(IO)
  321. SEGACT,IPT5
  322. ENDIF
  323. DO 401 J=1,IPT5.NUM(/2)
  324. DO 402 I=1,IPT5.NUM(/1)
  325. IJ=IPT5.NUM(I,J)
  326. IF (ICPR2(IJ).EQ.0) THEN
  327. IKOU=IKOU+1
  328. ICPR2(IJ)=IKOU
  329. ENDIF
  330. 402 CONTINUE
  331. 401 CONTINUE
  332. 400 CONTINUE
  333. NODES2=IKOU
  334.  
  335. * MAILLAGE vide => l'option 'MAIL' est desactivee
  336. IF (NODES2.EQ.0) THEN
  337. DO 410 IO=1,NBS2
  338. IF (NBSOU2.GT.0) IPT5=IPT2.LISOUS(IO)
  339. SEGDES,IPT5
  340. 410 CONTINUE
  341. SEGSUP,ICPR2
  342. KMA=0
  343. GOTO 499
  344. ENDIF
  345.  
  346. * Tableaux JMEM2, IMEMO2 et LMEMO2
  347. SEGINI,JMEM2
  348. DO 420 IO=1,NBS2
  349. IF (NBSOU2.GT.0) IPT5=IPT2.LISOUS(IO)
  350. DO 421 J=1,IPT5.NUM(/2)
  351. DO 422 I=1,IPT5.NUM(/1)
  352. IJ=ICPR2(IPT5.NUM(I,J))
  353. JMEM2(IJ)=JMEM2(IJ)+1
  354. 422 CONTINUE
  355. 421 CONTINUE
  356. 420 CONTINUE
  357. DO 430 I=1+1,NODES2+1
  358. JMEM2(I)=JMEM2(I)+JMEM2(I-1)
  359. 430 CONTINUE
  360. NBV2=JMEM2(NODES2)
  361. SEGINI,IMEMO2,LMEMO2
  362. DO 440 IO=1,NBS2
  363. IF (NBSOU2.GT.0) IPT5=IPT2.LISOUS(IO)
  364. DO 441 J=1,IPT5.NUM(/2)
  365. DO 442 I=1,IPT5.NUM(/1)
  366. IJ=ICPR2(IPT5.NUM(I,J))
  367. IMEMO2(JMEM2(IJ))=J
  368. LMEMO2(JMEM2(IJ))=IO
  369. JMEM2(IJ)=JMEM2(IJ)-1
  370. 442 CONTINUE
  371. 441 CONTINUE
  372. 440 CONTINUE
  373.  
  374. * On cree aussi le segment LISIN qui servira plus bas
  375. SEGINI,LISIN
  376.  
  377. ENDIF
  378. 499 CONTINUE
  379.  
  380.  
  381. * CREATION D'UN SEGMENT INDIC POUR CHAQUE LISOUS
  382. * **********************************************
  383.  
  384. SEGINI,LISIND
  385. NELTOT=0
  386. DO 500 IO=1,NBS
  387. IF (NBSOUS.NE.0) IPT1=LISOUS(IO)
  388. NBEL=IPT1.NUM(/2)
  389. NELTOT=NELTOT+NBEL
  390. SEGINI,INDIC
  391. LISIND(IO)=INDIC
  392. 500 CONTINUE
  393. SEGINI LISCO1,LISCO2
  394.  
  395.  
  396.  
  397. * +---------------------------------------------------------------+
  398. * | |
  399. * | C O N S T R U C T I O N D E S Z O N E S |
  400. * | |
  401. * +---------------------------------------------------------------+
  402.  
  403. IOC=1
  404. IELC=0
  405.  
  406. * LABEL 1000 : PARCOURS DES SEGMENTS INDIC A LA RECHERCHE D'UN
  407. * ELEMENT ENCORE NON ATTRIBUE
  408. * ************************************************************
  409. 1000 CONTINUE
  410.  
  411. IELC=IELC+1
  412. DO 1010 IO=IOC,NBS
  413. IF (NBSOUS.NE.0) IPT1=LISOUS(IO)
  414. INDIC=LISIND(IO)
  415. DO 1020 IEL=IELC,IPT1.NUM(/2)
  416. IF (INDIC(IEL).EQ.0) GOTO 1030
  417. 1020 CONTINUE
  418. IELC=1
  419. 1010 CONTINUE
  420.  
  421. C TOUS LES ELEMENTS ONT ETE CLASSES => ON A FINI
  422. GOTO 1500
  423.  
  424. * ON A TROUVE UN ELEMENT DE DEPART D'UNE NOUVELLE ZONE
  425. * => ON VA ETENDRE AUX ELEMENTS VOISINS
  426. * ****************************************************
  427. 1030 CONTINUE
  428. IOC=IO
  429. IELC=IEL
  430.  
  431. * On attribue une zone a l'element trouve
  432.  
  433. * ILRMP = Nombre d'elements ajoutes a LISCO1/LISCO2
  434. * ILEXT = Nombre d'elements parcourus dans LISCO1/LISCO2
  435. ILRMP=1
  436. ILEXT=1
  437.  
  438. * On reinitialise LISCO1/LISCO2 avec seulement cet element
  439. LISCO1(ILRMP)=IO
  440. LISCO2(ILRMP)=IEL
  441.  
  442. * BOUCLE DE REMPLISSAGE DE LISCO1/LISCO2, DE VOISIN EN VOISIN
  443. * ***********************************************************
  444.  
  445. * Label 1120 => element suivant dans les listes LISCO1/LISCO2
  446. 1120 CONTINUE
  447. IF (ILEXT.GT.ILRMP) GOTO 1130
  448.  
  449. ION=LISCO1(ILEXT)
  450. IEL=LISCO2(ILEXT)
  451. IF (NBSOUS.NE.0) IPT1=LISOUS(ION)
  452. IF (KAN.GT.0) THEN
  453. * Vecteur directeur de l'element 1 (option 'ANGL')
  454. MELVAL=IELVAX(ION)
  455. IELMIN=MIN(IEL,MELVAL.VELCHE(/2))
  456. X1=VELCHE(1,IELMIN)
  457. MELVAL=IELVAY(ION)
  458. IELMIN=MIN(IEL,MELVAL.VELCHE(/2))
  459. Y1=VELCHE(1,IELMIN)
  460. IF (IDIM.EQ.3) THEN
  461. MELVAL=IELVAZ(ION)
  462. IELMIN=MIN(IEL,MELVAL.VELCHE(/2))
  463. Z1=VELCHE(1,IELMIN)
  464. ENDIF
  465. ENDIF
  466.  
  467. * Label 1100 => noeud IP suivant de l'element courant
  468. DO 1100 IN=1,IPT1.NUM(/1)
  469. IP=ICPR(IPT1.NUM(IN,IEL))
  470.  
  471. * Label 1110 => voisin suivant via le noeud IP
  472. DO 1110 KK=JMEM(IP)+1,JMEM(IP+1)
  473. JON=LMEMO(KK)
  474. JEL=IMEMO(KK)
  475. INDIC=LISIND(JON)
  476.  
  477.  
  478. * TESTS SUR L'ELEMENT VOISIN (JON;JEL) : SI L'UN DES TESTS
  479. * ECHOUE, ALORS CET ELEMENT N'APPARTIENT PAS A CETTE ZONE
  480. * ********************************************************
  481.  
  482. * 1) CONDITION SINE QUA NONE : IL N'A PAS DEJA ETE ATTRIBUE
  483. * A UNE AUTRE ZONE
  484. * ======================================================
  485. IF (INDIC(JEL).NE.0) GOTO 1110
  486.  
  487. * 2) OPTION 'FACE' (UNIQUEMENT POUR LES MAILLAGES DE SURFACES)
  488. * =========================================================
  489. IF (KFA.GT.0) THEN
  490. IF (NBSOUS.NE.0) THEN
  491. IPT3=LISOUS(JON)
  492. ELSE
  493. IPT3=MELEME
  494. ENDIF
  495.  
  496. * a) Verification que les elements ont au moins 1 autre
  497. * noeud que IP en commun (attention : on ne verifie
  498. * pas qu'ils appartiennent a une meme arete)
  499. DO 1150 I1=1,IPT1.NUM(/1)
  500. IP1=ICPR(IPT1.NUM(I1,IEL))
  501. IF (IP1.EQ.IP) GOTO 1150
  502. DO 1160 I2=1,IPT3.NUM(/1)
  503. IP2=ICPR(IPT3.NUM(I2,JEL))
  504. IF (IP1.EQ.IP2) GOTO 1170
  505. 1160 CONTINUE
  506. 1150 CONTINUE
  507. GOTO 1110
  508.  
  509. * b) Verification qu'il n'y a que 2 elements qui
  510. * contiennent les noeuds IP et IP1
  511. 1170 CONTINUE
  512. NL=0
  513. DO 1180 K1=JMEM(IP)+1,JMEM(IP+1)
  514. IF (K1.EQ.KK) GOTO 1180
  515. I1=LMEMO(K1)
  516. J1=IMEMO(K1)
  517. DO 1190 K2=JMEM(IP1)+1,JMEM(IP1+1)
  518. I2=LMEMO(K2)
  519. J2=IMEMO(K2)
  520. IF (I1.EQ.I2.AND.J1.EQ.J2) NL=NL+1
  521. 1190 CONTINUE
  522. 1180 CONTINUE
  523. IF (NL.NE.1) GOTO 1110
  524. ENDIF
  525.  
  526. * 3) OPTION 'LIGN' (UNIQUEMENT POUR LES MAILLAGES DE LIGNES)
  527. * VERIFICATION QU'IL N'Y A QUE 2 ELEMENTS QUI CONTIENNENT
  528. * LE NOEUD IP
  529. * =======================================================
  530. IF (KLI.GT.0) THEN
  531. IF (JMEM(IP+1)-JMEM(IP).NE.2) GOTO 1110
  532. ENDIF
  533.  
  534. * 4) OPTION 'ANGL' (POUR LES MAILLAGES DE LIGNES ET/OU DE
  535. * SURFACE) : VERIFICATION QUE L'ANGLE ENTRE 2 ELEMENTS
  536. * VOISINS EST INFERIEUR A UNE VALEUR SEUIL
  537. * ====================================================
  538. IF (KAN.GT.0) THEN
  539.  
  540. * Vecteur directeur de l'element 2
  541. * (vecteur directeur de l'element 1 sorti de la boucle)
  542. MELVAL=IELVAX(JON)
  543. JELMIN=MIN(JEL,MELVAL.VELCHE(/2))
  544. X2=VELCHE(1,JELMIN)
  545. MELVAL=IELVAY(JON)
  546. JELMIN=MIN(JEL,MELVAL.VELCHE(/2))
  547. Y2=VELCHE(1,JELMIN)
  548.  
  549. * Produit scalaire et norme
  550. XN1=X1*X1+Y1*Y1
  551. XN2=X2*X2+Y2*Y2
  552. CA=X1*X2+Y1*Y2
  553.  
  554. * Prise en compte 3eme direction le cas echeant
  555. IF (IDIM.EQ.3) THEN
  556. MELVAL=IELVAZ(JON)
  557. JELMIN=MIN(JEL,MELVAL.VELCHE(/2))
  558. Z2=VELCHE(1,JELMIN)
  559.  
  560. XN1=XN1+Z1*Z1
  561. XN2=XN2+Z2*Z2
  562. CA=CA+Z1*Z2
  563. ENDIF
  564.  
  565. * Determination de l'angle en degres entre les 2 vecteurs
  566. CA=CA/((XN1*XN2)**0.5)
  567. IF (CA.GT.1.D0) CA=1.D0
  568. IF (CA.LT.-1.D0) CA=-1.D0
  569.  
  570. IF ((ITQ.GT.0.OR.(ITQ.LE.0.AND.CA.NE.-1.D0)).AND.
  571. & (CA.LT.ANG)) GOTO 1110
  572. ENDIF
  573.  
  574. * 5) OPTION 'MAIL' : VERIFICATION QUE L'INTERFACE COMMUNE
  575. * ENTRE 2 ELEMENTS VOISINS N'APPARTIENT PAS A MEL2
  576. * ====================================================
  577. IF (KMA.GT.0) THEN
  578.  
  579. * Test rapide grace au noeud commun deja connu (IP et IPP
  580. * sont les numeros locaux du meme noeud dans MEL1 et MEL2)
  581. IPP=ICPR2(IPT1.NUM(IN,IEL))
  582. IF (IPP.EQ.0) GOTO 999
  583.  
  584. * Nb. de noeuds a l'interface entre ION/IEL et JON/JEL
  585. * (IMPOSSIBLE A SAVOIR A PRIORI => EXEMPLE : CUB8/PY5)
  586. IF (NBSOUS.NE.0) THEN
  587. IPT3=LISOUS(JON)
  588. ELSE
  589. IPT3=MELEME
  590. ENDIF
  591. NBNIN=0
  592. DO 1200 I1=1,IPT1.NUM(/1)
  593. IP1=ICPR(IPT1.NUM(I1,IEL))
  594. IF (IP1.EQ.IP) GOTO 1200
  595. DO I2=1,IPT3.NUM(/1)
  596. IP2=ICPR(IPT3.NUM(I2,JEL))
  597. IF (IP1.EQ.IP2) THEN
  598. * On a trouve un noeud de l'interface, mais s'il
  599. * n'est pas dans MEL2 => inutile d'aller plus loin
  600. IF (ICPR2(IPT3.NUM(I2,JEL)).EQ.0) GOTO 999
  601. * Sinon on le memorise et on en cherche d'autres
  602. NBNIN=NBNIN+1
  603. LISIN(NBNIN)=IPT3.NUM(I2,JEL)
  604. GOTO 1200
  605. ENDIF
  606. ENDDO
  607. 1200 CONTINUE
  608.  
  609. * A ce stade, on connait tous les noeuds a l'interface
  610. * entre les 2 elements voisins, et on sait qu'ils sont
  611. * tous dans MEL2 => IL RESTE A VERIFIER QU'ILS SONT DANS
  612. * UN MEME ELEMENT DE MEL2 (la liste des possibilites
  613. * est reduite grace aux tableaux JMEM2/IMEMO2/LMEMO2)
  614. DO 1210 K2=JMEM2(IPP)+1,JMEM2(IPP+1)
  615. KON=LMEMO2(K2)
  616. KEL=IMEMO2(K2)
  617. IF (NBSOU2.NE.0) THEN
  618. IPT5=IPT2.LISOUS(KON)
  619. ELSE
  620. IPT5=IPT2
  621. ENDIF
  622.  
  623. * Inutile de tester cet element de MEL2 s'il n'a pas
  624. * assez de noeuds...
  625. IF (NBNNE(IPT5.ITYPEL).LT.NBNIN+1) GOTO 1210
  626.  
  627. * Test de tous les noeuds de l'interface
  628. DO 1220 K1=1,NBNIN
  629. INO=LISIN(K1)
  630. IF (ICPR2(INO).EQ.IPP) GOTO 1220
  631. DO K3=1,IPT5.NUM(/1)
  632. IF (INO.EQ.IPT5.NUM(K3,KEL)) GOTO 1220
  633. ENDDO
  634. GOTO 1210
  635. 1220 CONTINUE
  636.  
  637. * => L'INTERFACE ENTRE LES DEUX VOISINS EST INCLUSE
  638. * DANS UN ELEMENT DE MEL2
  639. GOTO 1110
  640.  
  641. 1210 CONTINUE
  642.  
  643. ENDIF
  644.  
  645. * => TOUS LES TESTS SONT PASSES : ON AJOUTE L'ELEMENT AUX
  646. * LISTES LISCO1/LISCO2 ET ON LUI ATTRIBUE LA ZONE COURANTE
  647. 999 CONTINUE
  648. ILRMP=ILRMP+1
  649. LISCO1(ILRMP)=JON
  650. LISCO2(ILRMP)=JEL
  651.  
  652. 1110 CONTINUE
  653. 1100 CONTINUE
  654.  
  655. * Tous les voisins de l'element courant ont ete testes : on va
  656. * regarder s'il reste des elements dans LISCO1/LISCO2
  657. ILEXT=ILEXT+1
  658. GOTO 1120
  659.  
  660. * ON A FINI, ON ENCHAINE SUR LA ZONE SUIVANTE
  661. 1130 CONTINUE
  662. GOTO 1000
  663.  
  664.  
  665. * +---------------------------------------------------------------+
  666. * | |
  667. * | C R E A T I O N D E L ' O B J E T D E S O R T I E |
  668. * | |
  669. * +---------------------------------------------------------------+
  670.  
  671. 1500 CONTINUE
  672. NBCOMP=NBCOMP-1
  673.  
  674. * CREATION DE L'OBJET TABLE DE SORTIE
  675. * ***********************************
  676. IF (KESCL.GT.0) M=M+2
  677. SEGINI,MTABLE
  678. ITAB=MTABLE
  679. IF (KESCL.GT.0) THEN
  680. CALL ECCTAB(ITAB,'MOT',0,0.D0,'SOUSTYPE',.TRUE.,
  681. & 0,'MOT',0,0.D0,'ESCLAVE',.TRUE.,0)
  682. CALL ECCTAB(ITAB,'MOT',0,0.D0,'CREATEUR',.TRUE.,
  683. & 0,'MOT',0,0.D0,'PART',.TRUE.,0)
  684. ENDIF
  685.  
  686.  
  687. * CREATION DES MAILLAGES DES DIFFERENTES ZONES TROUVEES
  688. * *****************************************************
  689. DO 2000 ICOMP=1,NBCOMP
  690. ISS=0
  691.  
  692. NBNN=0
  693. NBELEM=0
  694. NBSOUS=0
  695. NBREF=0
  696. SEGINI,IPT7
  697.  
  698. * Boucle sur les LISOUS du maillage initial
  699. DO 2010 IS=1,NBS
  700. IF (LISOUS(/1).NE.0) IPT1=LISOUS(IS)
  701. INDIC=LISIND(IS)
  702.  
  703. * Decompte du nombre d'elements du LISOUS initial appartenant
  704. * a la composante courante
  705. IELEM=0
  706. DO 2001 I=1,INDIC(/1)
  707. IF (INDIC(I).EQ.ICOMP) IELEM=IELEM+1
  708. 2001 CONTINUE
  709.  
  710. * Si besoin, on cree et on remplit le LISOUS correspondant
  711. * dans IPT7
  712. IF (IELEM.NE.0) THEN
  713. ISS=ISS+1
  714. NBNN=IPT1.NUM(/1)
  715. NBELEM=IELEM
  716. NBSOUS=0
  717. NBREF=0
  718. SEGINI,IPT3
  719. IPT3.ITYPEL=IPT1.ITYPEL
  720. IELEM=0
  721. DO 2005 I=1,INDIC(/1)
  722. IF (INDIC(I).NE.ICOMP) GOTO 2005
  723. IELEM=IELEM+1
  724. DO 2006 J=1,IPT1.NUM(/1)
  725. IPT3.NUM(J,IELEM)=IPT1.NUM(J,I)
  726. 2006 CONTINUE
  727. IPT3.ICOLOR(IELEM)=IPT1.ICOLOR(I)
  728. 2005 CONTINUE
  729. NBNN=0
  730. NBELEM=0
  731. NBSOUS=IPT7.LISOUS(/1)+1
  732. NBREF=0
  733. SEGADJ,IPT7
  734. IPT7.LISOUS(NBSOUS)=IPT3
  735. SEGDES,IPT3
  736. ENDIF
  737. 2010 CONTINUE
  738. *
  739. * S'il n'y a qu'un seul LISOUS, on modifie la structure de IPT7
  740. IF (IPT7.LISOUS(/1).EQ.1) THEN
  741. IPT=IPT7.LISOUS(1)
  742. SEGSUP,IPT7
  743. IPT7=IPT
  744. ENDIF
  745. SEGDES,IPT7
  746.  
  747. * Ajout de IPT7 a l'indice ICOMP de MTABLE
  748. CALL ECCTAB(MTABLE,'ENTIER ',ICOMP,CC,' ',.TRUE.,I,
  749. & 'MAILLAGE',I,XX,' ',.TRUE.,IPT7)
  750. 2000 CONTINUE
  751.  
  752. * FIN DE LA SUBROUTINE : UN PEU DE MENAGE...
  753. * ******************************************
  754. SEGSUP,JMEM,LMEMO,IMEMO,LISCO1,LISCO2
  755. DO I=1,LISIND(/1)
  756. INDIC=LISIND(I)
  757. SEGSUP,INDIC
  758. ENDDO
  759. SEGSUP,LISIND
  760. IF (KMA.NE.0) THEN
  761. SEGSUP,ICPR2,JMEM2,LMEMO2,IMEMO2,LISIN
  762. IF (NBSOU2.GT.0) THEN
  763. DO I=1,IPT2.LISOUS(/1)
  764. IPT5=IPT2.LISOUS(I)
  765. SEGDES,IPT5
  766. ENDDO
  767. ENDIF
  768. SEGDES,IPT2
  769. ENDIF
  770. 9999 CONTINUE
  771. SEGSUP,ICPR
  772. NBSOUS=LISOUS(/1)
  773. IF (NBSOUS.GT.0) THEN
  774. DO I=1,NBSOUS
  775. IPT1=LISOUS(I)
  776. SEGDES,IPT1
  777. ENDDO
  778. ENDIF
  779. SEGDES,MELEME
  780. IF (KAN.GT.0) THEN
  781. DO K=1,N1
  782. MELVAL=IELVAX(K)
  783. SEGSUP,MELVAL
  784. MELVAL=IELVAY(K)
  785. SEGSUP,MELVAL
  786. IF (IDIM.EQ.3) THEN
  787. MELVAL=IELVAZ(K)
  788. SEGSUP,MELVAL
  789. ENDIF
  790. ENDDO
  791. SEGSUP,MIELVA
  792. ENDIF
  793.  
  794. END
  795.  
  796.  

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