Télécharger part7.eso

Retour à la liste

Numérotation des lignes :

part7
  1. C PART7 SOURCE CB215821 24/04/12 21:16:50 11897
  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 150 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. 150 CONTINUE
  246.  
  247. 100 CONTINUE
  248.  
  249. * Nombre de noeuds distincts dans le maillage
  250. NODES=IKOU
  251.  
  252. * MAILLAGE vide => on sort des maintenant
  253. IF (NODES.EQ.0) THEN
  254. M=0
  255. SEGINI,MTABLE
  256. ITAB=MTABLE
  257. MLOTAB=0
  258. GOTO 9999
  259. ENDIF
  260.  
  261. *
  262. * IDENTIFICATION DES ELEMENTS OU APPARAISSENT TOUS LES NOEUDS
  263. * => IMEMO = NUMERO DE ELEMENT
  264. * => LMEMO = NUMERO DU SOUS-MAILLGE
  265. * JMEM(I)+1 IDENTIFIE LA POSITION DANS IMEMO/LMEMO DU PREMIER
  266. * ELEMENT ASSOCIE AU NOEUD I
  267. * ***************************************************************
  268.  
  269. SEGINI,JMEM
  270.  
  271. * On compte combien de fois chaque noeud apparait dans le maillage
  272. DO 200 IO=1,NBS
  273. IF (NBSOUS.GT.0) IPT1=LISOUS(IO)
  274. DO 250 J=1,IPT1.NUM(/2)
  275. DO 250 I=1,IPT1.NUM(/1)
  276. IJ=ICPR(IPT1.NUM(I,J))
  277. JMEM(IJ)=JMEM(IJ)+1
  278. 250 CONTINUE
  279. 200 CONTINUE
  280. *
  281. * On en deduit par cumul la position de depart dans IMEMO/LMEMO
  282. DO 290 I=1+1,NODES+1
  283. JMEM(I)=JMEM(I)+JMEM(I-1)
  284. 290 CONTINUE
  285. NBV=JMEM(NODES)
  286. *
  287. * Remplissage de IMEMO et LMEMO
  288. SEGINI,IMEMO,LMEMO
  289. DO 300 IO=1,NBS
  290. IF (NBSOUS.GT.0) IPT1=LISOUS(IO)
  291. DO 350 J=1,IPT1.NUM(/2)
  292. DO 350 I=1,IPT1.NUM(/1)
  293. IJ=ICPR(IPT1.NUM(I,J))
  294. IMEMO(JMEM(IJ))=J
  295. LMEMO(JMEM(IJ))=IO
  296. JMEM(IJ)=JMEM(IJ)-1
  297. 350 CONTINUE
  298. 300 CONTINUE
  299.  
  300.  
  301. * OPTION 'MAIL' => ON REMPLIT DE LA MEME MANIERE ICPR2, JMEM2,
  302. * IMEMO2 ET LMEMO2
  303. * ************************************************************
  304.  
  305. IF (KMA.GT.0) THEN
  306.  
  307. * Tableau ICPR2
  308. SEGINI,ICPR2
  309. IPT2=MEL2
  310. SEGACT,IPT2
  311. NBSOU2=IPT2.LISOUS(/1)
  312. NBS2=MAX(1,NBSOU2)
  313. IPT5=IPT2
  314. IKOU=0
  315. DO 400 IO=1,NBS2
  316. IF (NBSOU2.GT.0) THEN
  317. IPT5=IPT2.LISOUS(IO)
  318. SEGACT,IPT5
  319. ENDIF
  320. DO 401 J=1,IPT5.NUM(/2)
  321. DO 401 I=1,IPT5.NUM(/1)
  322. IJ=IPT5.NUM(I,J)
  323. IF (ICPR2(IJ).EQ.0) THEN
  324. IKOU=IKOU+1
  325. ICPR2(IJ)=IKOU
  326. ENDIF
  327. 401 CONTINUE
  328. 400 CONTINUE
  329. NODES2=IKOU
  330.  
  331. * MAILLAGE vide => l'option 'MAIL' est desactivee
  332. IF (NODES2.EQ.0) THEN
  333. DO 410 IO=1,NBS2
  334. IF (NBSOU2.GT.0) IPT5=IPT2.LISOUS(IO)
  335. SEGDES,IPT5
  336. 410 CONTINUE
  337. SEGSUP,ICPR2
  338. KMA=0
  339. GOTO 499
  340. ENDIF
  341.  
  342. * Tableaux JMEM2, IMEMO2 et LMEMO2
  343. SEGINI,JMEM2
  344. DO 420 IO=1,NBS2
  345. IF (NBSOU2.GT.0) IPT5=IPT2.LISOUS(IO)
  346. DO 421 J=1,IPT5.NUM(/2)
  347. DO 421 I=1,IPT5.NUM(/1)
  348. IJ=ICPR2(IPT5.NUM(I,J))
  349. JMEM2(IJ)=JMEM2(IJ)+1
  350. 421 CONTINUE
  351. 420 CONTINUE
  352. DO 430 I=1+1,NODES2+1
  353. JMEM2(I)=JMEM2(I)+JMEM2(I-1)
  354. 430 CONTINUE
  355. NBV2=JMEM2(NODES2)
  356. SEGINI,IMEMO2,LMEMO2
  357. DO 440 IO=1,NBS2
  358. IF (NBSOU2.GT.0) IPT5=IPT2.LISOUS(IO)
  359. DO 441 J=1,IPT5.NUM(/2)
  360. DO 441 I=1,IPT5.NUM(/1)
  361. IJ=ICPR2(IPT5.NUM(I,J))
  362. IMEMO2(JMEM2(IJ))=J
  363. LMEMO2(JMEM2(IJ))=IO
  364. JMEM2(IJ)=JMEM2(IJ)-1
  365. 441 CONTINUE
  366. 440 CONTINUE
  367.  
  368. * On cree aussi le segment LISIN qui servira plus bas
  369. SEGINI,LISIN
  370.  
  371. ENDIF
  372. 499 CONTINUE
  373.  
  374.  
  375. * CREATION D'UN SEGMENT INDIC POUR CHAQUE LISOUS
  376. * **********************************************
  377.  
  378. SEGINI,LISIND
  379. NELTOT=0
  380. DO 500 IO=1,NBS
  381. IF (NBSOUS.NE.0) IPT1=LISOUS(IO)
  382. NBEL=IPT1.NUM(/2)
  383. NELTOT=NELTOT+NBEL
  384. SEGINI,INDIC
  385. LISIND(IO)=INDIC
  386. 500 CONTINUE
  387. SEGINI LISCO1,LISCO2
  388.  
  389.  
  390.  
  391. * +---------------------------------------------------------------+
  392. * | |
  393. * | C O N S T R U C T I O N D E S Z O N E S |
  394. * | |
  395. * +---------------------------------------------------------------+
  396.  
  397. IOC=1
  398. IELC=0
  399.  
  400. * LABEL 1000 : PARCOURS DES SEGMENTS INDIC A LA RECHERCHE D'UN
  401. * ELEMENT ENCORE NON ATTRIBUE
  402. * ************************************************************
  403. 1000 CONTINUE
  404.  
  405. IELC=IELC+1
  406. DO 1010 IO=IOC,NBS
  407. IF (NBSOUS.NE.0) IPT1=LISOUS(IO)
  408. INDIC=LISIND(IO)
  409. DO 1020 IEL=IELC,IPT1.NUM(/2)
  410. IF (INDIC(IEL).EQ.0) GOTO 1030
  411. 1020 CONTINUE
  412. IELC=1
  413. 1010 CONTINUE
  414.  
  415. C TOUS LES ELEMENTS ONT ETE CLASSES => ON A FINI
  416. GOTO 1500
  417.  
  418. * ON A TROUVE UN ELEMENT DE DEPART D'UNE NOUVELLE ZONE
  419. * => ON VA ETENDRE AUX ELEMENTS VOISINS
  420. * ****************************************************
  421. 1030 CONTINUE
  422. IOC=IO
  423. IELC=IEL
  424.  
  425. * On attribue une zone a l'element trouve
  426.  
  427. * ILRMP = Nombre d'elements ajoutes a LISCO1/LISCO2
  428. * ILEXT = Nombre d'elements parcourus dans LISCO1/LISCO2
  429. ILRMP=1
  430. ILEXT=1
  431.  
  432. * On reinitialise LISCO1/LISCO2 avec seulement cet element
  433. LISCO1(ILRMP)=IO
  434. LISCO2(ILRMP)=IEL
  435.  
  436. * BOUCLE DE REMPLISSAGE DE LISCO1/LISCO2, DE VOISIN EN VOISIN
  437. * ***********************************************************
  438.  
  439. * Label 1120 => element suivant dans les listes LISCO1/LISCO2
  440. 1120 CONTINUE
  441. IF (ILEXT.GT.ILRMP) GOTO 1130
  442.  
  443. ION=LISCO1(ILEXT)
  444. IEL=LISCO2(ILEXT)
  445. IF (NBSOUS.NE.0) IPT1=LISOUS(ION)
  446. IF (KAN.GT.0) THEN
  447. * Vecteur directeur de l'element 1 (option 'ANGL')
  448. MELVAL=IELVAX(ION)
  449. IELMIN=MIN(IEL,MELVAL.VELCHE(/2))
  450. X1=VELCHE(1,IELMIN)
  451. MELVAL=IELVAY(ION)
  452. IELMIN=MIN(IEL,MELVAL.VELCHE(/2))
  453. Y1=VELCHE(1,IELMIN)
  454. IF (IDIM.EQ.3) THEN
  455. MELVAL=IELVAZ(ION)
  456. IELMIN=MIN(IEL,MELVAL.VELCHE(/2))
  457. Z1=VELCHE(1,IELMIN)
  458. ENDIF
  459. ENDIF
  460.  
  461. * Label 1100 => noeud IP suivant de l'element courant
  462. DO 1100 IN=1,IPT1.NUM(/1)
  463. IP=ICPR(IPT1.NUM(IN,IEL))
  464.  
  465. * Label 1110 => voisin suivant via le noeud IP
  466. DO 1110 KK=JMEM(IP)+1,JMEM(IP+1)
  467. JON=LMEMO(KK)
  468. JEL=IMEMO(KK)
  469. INDIC=LISIND(JON)
  470.  
  471.  
  472. * TESTS SUR L'ELEMENT VOISIN (JON;JEL) : SI L'UN DES TESTS
  473. * ECHOUE, ALORS CET ELEMENT N'APPARTIENT PAS A CETTE ZONE
  474. * ********************************************************
  475.  
  476. * 1) CONDITION SINE QUA NONE : IL N'A PAS DEJA ETE ATTRIBUE
  477. * A UNE AUTRE ZONE
  478. * ======================================================
  479. IF (INDIC(JEL).NE.0) GOTO 1110
  480.  
  481. * 2) OPTION 'FACE' (UNIQUEMENT POUR LES MAILLAGES DE SURFACES)
  482. * =========================================================
  483. IF (KFA.GT.0) THEN
  484. IF (NBSOUS.NE.0) THEN
  485. IPT3=LISOUS(JON)
  486. ELSE
  487. IPT3=MELEME
  488. ENDIF
  489.  
  490. * a) Verification que les elements ont au moins 1 autre
  491. * noeud que IP en commun (attention : on ne verifie
  492. * pas qu'ils appartiennent a une meme arete)
  493. DO 1150 I1=1,IPT1.NUM(/1)
  494. IP1=ICPR(IPT1.NUM(I1,IEL))
  495. IF (IP1.EQ.IP) GOTO 1150
  496. DO 1160 I2=1,IPT3.NUM(/1)
  497. IP2=ICPR(IPT3.NUM(I2,JEL))
  498. IF (IP1.EQ.IP2) GOTO 1170
  499. 1160 CONTINUE
  500. 1150 CONTINUE
  501. GOTO 1110
  502.  
  503. * b) Verification qu'il n'y a que 2 elements qui
  504. * contiennent les noeuds IP et IP1
  505. 1170 CONTINUE
  506. NL=0
  507. DO 1180 K1=JMEM(IP)+1,JMEM(IP+1)
  508. IF (K1.EQ.KK) GOTO 1180
  509. I1=LMEMO(K1)
  510. J1=IMEMO(K1)
  511. DO 1190 K2=JMEM(IP1)+1,JMEM(IP1+1)
  512. I2=LMEMO(K2)
  513. J2=IMEMO(K2)
  514. IF (I1.EQ.I2.AND.J1.EQ.J2) NL=NL+1
  515. 1190 CONTINUE
  516. 1180 CONTINUE
  517. IF (NL.NE.1) GOTO 1110
  518. ENDIF
  519.  
  520. * 3) OPTION 'LIGN' (UNIQUEMENT POUR LES MAILLAGES DE LIGNES)
  521. * VERIFICATION QU'IL N'Y A QUE 2 ELEMENTS QUI CONTIENNENT
  522. * LE NOEUD IP
  523. * =======================================================
  524. IF (KLI.GT.0) THEN
  525. IF (JMEM(IP+1)-JMEM(IP).NE.2) GOTO 1110
  526. ENDIF
  527.  
  528. * 4) OPTION 'ANGL' (POUR LES MAILLAGES DE LIGNES ET/OU DE
  529. * SURFACE) : VERIFICATION QUE L'ANGLE ENTRE 2 ELEMENTS
  530. * VOISINS EST INFERIEUR A UNE VALEUR SEUIL
  531. * ====================================================
  532. IF (KAN.GT.0) THEN
  533.  
  534. * Vecteur directeur de l'element 2
  535. * (vecteur directeur de l'element 1 sorti de la boucle)
  536. MELVAL=IELVAX(JON)
  537. JELMIN=MIN(JEL,MELVAL.VELCHE(/2))
  538. X2=VELCHE(1,JELMIN)
  539. MELVAL=IELVAY(JON)
  540. JELMIN=MIN(JEL,MELVAL.VELCHE(/2))
  541. Y2=VELCHE(1,JELMIN)
  542.  
  543. * Produit scalaire et norme
  544. XN1=X1*X1+Y1*Y1
  545. XN2=X2*X2+Y2*Y2
  546. CA=X1*X2+Y1*Y2
  547.  
  548. * Prise en compte 3eme direction le cas echeant
  549. IF (IDIM.EQ.3) THEN
  550. MELVAL=IELVAZ(JON)
  551. JELMIN=MIN(JEL,MELVAL.VELCHE(/2))
  552. Z2=VELCHE(1,JELMIN)
  553.  
  554. XN1=XN1+Z1*Z1
  555. XN2=XN2+Z2*Z2
  556. CA=CA+Z1*Z2
  557. ENDIF
  558.  
  559. * Determination de l'angle en degres entre les 2 vecteurs
  560. CA=CA/((XN1*XN2)**0.5)
  561. IF (CA.GT.1.D0) CA=1.D0
  562. IF (CA.LT.-1.D0) CA=-1.D0
  563.  
  564. IF ((ITQ.GT.0.OR.(ITQ.LE.0.AND.CA.NE.-1.D0)).AND.
  565. & (CA.LT.ANG)) GOTO 1110
  566. ENDIF
  567.  
  568. * 5) OPTION 'MAIL' : VERIFICATION QUE L'INTERFACE COMMUNE
  569. * ENTRE 2 ELEMENTS VOISINS N'APPARTIENT PAS A MEL2
  570. * ====================================================
  571. IF (KMA.GT.0) THEN
  572.  
  573. * Test rapide grace au noeud commun deja connu (IP et IPP
  574. * sont les numeros locaux du meme noeud dans MEL1 et MEL2)
  575. IPP=ICPR2(IPT1.NUM(IN,IEL))
  576. IF (IPP.EQ.0) GOTO 999
  577.  
  578. * Nb. de noeuds a l'interface entre ION/IEL et JON/JEL
  579. * (IMPOSSIBLE A SAVOIR A PRIORI => EXEMPLE : CUB8/PY5)
  580. IF (NBSOUS.NE.0) THEN
  581. IPT3=LISOUS(JON)
  582. ELSE
  583. IPT3=MELEME
  584. ENDIF
  585. NBNIN=0
  586. DO 1200 I1=1,IPT1.NUM(/1)
  587. IP1=ICPR(IPT1.NUM(I1,IEL))
  588. IF (IP1.EQ.IP) GOTO 1200
  589. DO I2=1,IPT3.NUM(/1)
  590. IP2=ICPR(IPT3.NUM(I2,JEL))
  591. IF (IP1.EQ.IP2) THEN
  592. * On a trouve un noeud de l'interface, mais s'il
  593. * n'est pas dans MEL2 => inutile d'aller plus loin
  594. IF (ICPR2(IPT3.NUM(I2,JEL)).EQ.0) GOTO 999
  595. * Sinon on le memorise et on en cherche d'autres
  596. NBNIN=NBNIN+1
  597. LISIN(NBNIN)=IPT3.NUM(I2,JEL)
  598. GOTO 1200
  599. ENDIF
  600. ENDDO
  601. 1200 CONTINUE
  602.  
  603. * A ce stade, on connait tous les noeuds a l'interface
  604. * entre les 2 elements voisins, et on sait qu'ils sont
  605. * tous dans MEL2 => IL RESTE A VERIFIER QU'ILS SONT DANS
  606. * UN MEME ELEMENT DE MEL2 (la liste des possibilites
  607. * est reduite grace aux tableaux JMEM2/IMEMO2/LMEMO2)
  608. DO 1210 K2=JMEM2(IPP)+1,JMEM2(IPP+1)
  609. KON=LMEMO2(K2)
  610. KEL=IMEMO2(K2)
  611. IF (NBSOU2.NE.0) THEN
  612. IPT5=IPT2.LISOUS(KON)
  613. ELSE
  614. IPT5=IPT2
  615. ENDIF
  616.  
  617. * Inutile de tester cet element de MEL2 s'il n'a pas
  618. * assez de noeuds...
  619. IF (NBNNE(IPT5.ITYPEL).LT.NBNIN+1) GOTO 1210
  620.  
  621. * Test de tous les noeuds de l'interface
  622. DO 1220 K1=1,NBNIN
  623. INO=LISIN(K1)
  624. IF (ICPR2(INO).EQ.IPP) GOTO 1220
  625. DO K3=1,IPT5.NUM(/1)
  626. IF (INO.EQ.IPT5.NUM(K3,KEL)) GOTO 1220
  627. ENDDO
  628. GOTO 1210
  629. 1220 CONTINUE
  630.  
  631. * => L'INTERFACE ENTRE LES DEUX VOISINS EST INCLUSE
  632. * DANS UN ELEMENT DE MEL2
  633. GOTO 1110
  634.  
  635. 1210 CONTINUE
  636.  
  637. ENDIF
  638.  
  639. * => TOUS LES TESTS SONT PASSES : ON AJOUTE L'ELEMENT AUX
  640. * LISTES LISCO1/LISCO2 ET ON LUI ATTRIBUE LA ZONE COURANTE
  641. 999 CONTINUE
  642. ILRMP=ILRMP+1
  643. LISCO1(ILRMP)=JON
  644. LISCO2(ILRMP)=JEL
  645.  
  646. 1110 CONTINUE
  647. 1100 CONTINUE
  648.  
  649. * Tous les voisins de l'element courant ont ete testes : on va
  650. * regarder s'il reste des elements dans LISCO1/LISCO2
  651. ILEXT=ILEXT+1
  652. GOTO 1120
  653.  
  654. * ON A FINI, ON ENCHAINE SUR LA ZONE SUIVANTE
  655. 1130 CONTINUE
  656. GOTO 1000
  657.  
  658.  
  659. * +---------------------------------------------------------------+
  660. * | |
  661. * | C R E A T I O N D E L ' O B J E T D E S O R T I E |
  662. * | |
  663. * +---------------------------------------------------------------+
  664.  
  665. 1500 CONTINUE
  666. NBCOMP=NBCOMP-1
  667.  
  668. * CREATION DE L'OBJET TABLE DE SORTIE
  669. * ***********************************
  670. IF (KESCL.GT.0) M=M+2
  671. SEGINI,MTABLE
  672. ITAB=MTABLE
  673. IF (KESCL.GT.0) THEN
  674. CALL ECCTAB(ITAB,'MOT',0,0.D0,'SOUSTYPE',.TRUE.,
  675. & 0,'MOT',0,0.D0,'ESCLAVE',.TRUE.,0)
  676. CALL ECCTAB(ITAB,'MOT',0,0.D0,'CREATEUR',.TRUE.,
  677. & 0,'MOT',0,0.D0,'PART',.TRUE.,0)
  678. ENDIF
  679.  
  680.  
  681. * CREATION DES MAILLAGES DES DIFFERENTES ZONES TROUVEES
  682. * *****************************************************
  683. DO 2000 ICOMP=1,NBCOMP
  684. ISS=0
  685.  
  686. NBNN=0
  687. NBELEM=0
  688. NBSOUS=0
  689. NBREF=0
  690. SEGINI,IPT7
  691.  
  692. * Boucle sur les LISOUS du maillage initial
  693. DO 2010 IS=1,NBS
  694. IF (LISOUS(/1).NE.0) IPT1=LISOUS(IS)
  695. INDIC=LISIND(IS)
  696.  
  697. * Decompte du nombre d'elements du LISOUS initial appartenant
  698. * a la composante courante
  699. IELEM=0
  700. DO 2001 I=1,INDIC(/1)
  701. IF (INDIC(I).EQ.ICOMP) IELEM=IELEM+1
  702. 2001 CONTINUE
  703.  
  704. * Si besoin, on cree et on remplit le LISOUS correspondant
  705. * dans IPT7
  706. IF (IELEM.NE.0) THEN
  707. ISS=ISS+1
  708. NBNN=IPT1.NUM(/1)
  709. NBELEM=IELEM
  710. NBSOUS=0
  711. NBREF=0
  712. SEGINI,IPT3
  713. IPT3.ITYPEL=IPT1.ITYPEL
  714. IELEM=0
  715. DO 2005 I=1,INDIC(/1)
  716. IF (INDIC(I).NE.ICOMP) GOTO 2005
  717. IELEM=IELEM+1
  718. DO 2006 J=1,IPT1.NUM(/1)
  719. IPT3.NUM(J,IELEM)=IPT1.NUM(J,I)
  720. 2006 CONTINUE
  721. IPT3.ICOLOR(IELEM)=IPT1.ICOLOR(I)
  722. 2005 CONTINUE
  723. NBNN=0
  724. NBELEM=0
  725. NBSOUS=IPT7.LISOUS(/1)+1
  726. NBREF=0
  727. SEGADJ,IPT7
  728. IPT7.LISOUS(NBSOUS)=IPT3
  729. SEGDES,IPT3
  730. ENDIF
  731. 2010 CONTINUE
  732. *
  733. * S'il n'y a qu'un seul LISOUS, on modifie la structure de IPT7
  734. IF (IPT7.LISOUS(/1).EQ.1) THEN
  735. IPT=IPT7.LISOUS(1)
  736. SEGSUP,IPT7
  737. IPT7=IPT
  738. ENDIF
  739. SEGDES,IPT7
  740.  
  741. * Ajout de IPT7 a l'indice ICOMP de MTABLE
  742. CALL ECCTAB(MTABLE,'ENTIER ',ICOMP,CC,' ',.TRUE.,I,
  743. & 'MAILLAGE',I,XX,' ',.TRUE.,IPT7)
  744. 2000 CONTINUE
  745.  
  746. * FIN DE LA SUBROUTINE : UN PEU DE MENAGE...
  747. * ******************************************
  748. SEGSUP,JMEM,LMEMO,IMEMO,LISCO1,LISCO2
  749. DO I=1,LISIND(/1)
  750. INDIC=LISIND(I)
  751. SEGSUP,INDIC
  752. ENDDO
  753. SEGSUP,LISIND
  754. IF (KMA.NE.0) THEN
  755. SEGSUP,ICPR2,JMEM2,LMEMO2,IMEMO2,LISIN
  756. IF (NBSOU2.GT.0) THEN
  757. DO I=1,IPT2.LISOUS(/1)
  758. IPT5=IPT2.LISOUS(I)
  759. SEGDES,IPT5
  760. ENDDO
  761. ENDIF
  762. SEGDES,IPT2
  763. ENDIF
  764. 9999 CONTINUE
  765. SEGSUP,ICPR
  766. NBSOUS=LISOUS(/1)
  767. IF (NBSOUS.GT.0) THEN
  768. DO I=1,NBSOUS
  769. IPT1=LISOUS(I)
  770. SEGDES,IPT1
  771. ENDDO
  772. ENDIF
  773. SEGDES,MELEME
  774. IF (KAN.GT.0) THEN
  775. DO K=1,N1
  776. MELVAL=IELVAX(K)
  777. SEGSUP,MELVAL
  778. MELVAL=IELVAY(K)
  779. SEGSUP,MELVAL
  780. IF (IDIM.EQ.3) THEN
  781. MELVAL=IELVAZ(K)
  782. SEGSUP,MELVAL
  783. ENDIF
  784. ENDDO
  785. SEGSUP,MIELVA
  786. ENDIF
  787.  
  788. END
  789.  
  790.  
  791.  
  792.  
  793.  
  794.  
  795.  
  796.  
  797.  
  798.  
  799.  

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