Télécharger sfac3d.eso

Retour à la liste

Numérotation des lignes :

sfac3d
  1. C SFAC3D SOURCE CHAT 05/01/13 03:15:00 5004
  2. C *****************************************************************
  3. C MODULE : ST (STRUCTURE DES DONNEES)
  4. C FICHIER : ST3D_STRUCT.F
  5. C OBJET : CONSULTATION, CONSTRUCTION ET MODIFICATION DE LA
  6. C STRUCTURE DE DONNE DU MAILLAGE 3D
  7. C FONCT. :
  8. C
  9. C SFAC3D : RECHERCHE LA FACE COMMUNE A 2 ELEMENTS 3D
  10. C
  11. C S3NBCO : CALCUL DU NOMBRE DE COTE D'UN ELEMENT
  12. C S3NBCF : CALCUL DU NOMBRE DE COTE DE LA FACE D'UN ELEMENT
  13. C
  14. C S3FDIA : FACE DIRECTE SUR UNE ARETE (INDICE RELATIF)
  15. C S3A2FA : ARETE COMMUNE A 2 FACES (INDICE RELATIF)
  16. C S3FASO : K SOMMETS DE LA FACE (INDICE RELATIF)
  17. C S3SOFA : K FACES AU SOMMET (INDICE RELATIF)
  18. C S3OPFA : ENTITE OPPOSEE A FACE (INDICE RELATIF)
  19. C
  20. C S3INVE : INVERSE L'ORIENTATION D'UN ELEMENT 3D
  21. C
  22. C AUTEUR : O. STAB
  23. C DATE : 03.95
  24. C TESTS : A FAIRE
  25. C
  26. C MODIFICATIONS :
  27. C AUTEUR : O.STAB
  28. C DATE : 26.06.96
  29. C OBJET : AJOUT SFAC3D (A TERMINER)
  30. C
  31. C MODIFICATIONS :
  32. C AUTEUR, DATE, OBJET :
  33. C
  34. C
  35. C *****************************************************************
  36. C
  37. INTEGER FUNCTION SFAC3D( IT1, IT2, N1, N2, I1, I2 )
  38. C *****************************************************************
  39. C OBJET : RECHERCHE LA FACE COMMUME A 2 ELEMENTS
  40. C RENVOI LES INDICES I1 ET I2 CORRESPONDANTS AUX FRONTIERES
  41. C COMMUNES DES ELEMENTS IT1 ET IT2.
  42. C
  43. C EN ENTREE:
  44. C IT1,IT2: LES ELEMENTS A TESTER
  45. C N1 : (2..4) NOMBRE DE NOEUDS DE IT1
  46. C N2 : (2..4) NOMBRE DE NOEUDS DE IT2
  47. C
  48. C EN SORTIE:
  49. C I1,I2 : INDICES DES FRONTIERES COMMUNES
  50. C SFAC3D : 0 SI AUCUNE ARETE COMMUNE
  51. C -1 SI I1 ET I2 SONT PARCOURUS DANS LE MEME
  52. C SENS POUR IT1 ET IT2
  53. C 1 SI " " " " DANS LE SENS INVERSE
  54. C
  55. C CONDITION D'APPLICATION : TETRA, HEXA...
  56. C REMARQUE : N'UTILISE PAS LA STRUCTURE DE DONNEES MAILLAGE
  57. C N'EXPLOITE AUCUNE HYPOTHESE SUR IT1 ET IT2
  58. C *****************************************************************
  59. IMPLICIT INTEGER(I-N)
  60. INTEGER IT1(N1), IT2(N2), N1,N2, I1, I2
  61. C
  62. INTEGER IT12(16),ISOM(16)
  63. INTEGER NBNF1(6),NBNF2(6),ISOMT1(4,6),ISOMT2(4,6)
  64. INTEGER I,IFF,IFF1,IFF2,NBF1,NBF2,INO,IDE,ISENS,NBNC,INO2
  65. INTEGER S3NBCO,S3FASO
  66. EXTERNAL S3NBCO,S3FASO
  67. C
  68. C WRITE(6,*) 'ON ENTRE DANS SFAC3D it1,it2 = ',IT1,IT2
  69. IDE = 3
  70. C WRITE(*,*) 'ON COMPARE :'
  71. C WRITE(*,*) (IT1(I),I=1,N1), 'ET '
  72. C WRITE(*,*) (IT2(I),I=1,N2)
  73. C
  74. C COMPARER LA SIGNATURE DES 4 NOEUDS POUR OPTIMISER
  75. C --------------------------------------------------
  76. DO 50 I=1,N1
  77. ISOM(I) = IT1(I)
  78. 50 CONTINUE
  79. DO 51 I=1,N2
  80. ISOM(I+N1) = IT2(I)
  81. 51 CONTINUE
  82. CALL KNUTA(N1+N2,ISOM)
  83. NBNC = 0
  84. DO 52 I=1,(N1+N2-1)
  85. IF(ISOM(I).EQ.ISOM(I+1))NBNC = NBNC+1
  86. 52 CONTINUE
  87. C WRITE(*,*) 'NOMBRE DE NOEUDS EN COMMUN :',NBNC
  88. C
  89. IF( NBNC.LT.3 )THEN
  90. SFAC3D = 0
  91. GOTO 9999
  92. ENDIF
  93. C
  94. IF(((N1.EQ.8).OR.(N2.EQ.8)).AND.(NBNC.EQ.3))THEN
  95. SFAC3D = 0
  96. GOTO 9999
  97. ENDIF
  98. C WRITE(6,*) 'IT1,IT2 = ',IT1,IT2
  99. C
  100. C --- IL Y A AU MOINS 3 NOEUDS EN COMMUN ---
  101. C IL FAUT TROUVER LES FACES ET LEURS INDICES
  102. C
  103. C --- LES FACES DE IT1 ---
  104. C
  105. C WRITE(*,*) 'PREMIER ELEMENT'
  106. ISENS = 1
  107. NBF1 = S3NBCO(N1)
  108. DO 61 IFF=1,NBF1
  109. NBNF1(IFF) = S3FASO(IFF,N1,ISENS,ISOMT1(1,IFF))
  110. C WRITE(*,*) 'FACE :',IFF,' DE ',NBNF1(IFF),' SOMMETS ='
  111. C WRITE(*,*) (ISOMT1(INO,IFF),INO=1,3)
  112. C WRITE(*,*) 'ELEMENT =',(IT1(INO),INO=1,4)
  113. DO 60 INO=1,NBNF1(IFF)
  114. ISOMT1(INO,IFF)= IT1(ISOMT1(INO,IFF))
  115. C WRITE(*,*) ISOMT1(INO,IFF)
  116. 60 CONTINUE
  117. C CALL KNUTA(NBNF1(IFF),ISOMT1(1,IFF))
  118. 61 CONTINUE
  119. C
  120. C --- LES FACES DE IT2 ---
  121. C
  122. C WRITE(*,*) 'SECOND ELEMENT'
  123. NBF2 = S3NBCO(N2)
  124. DO 63 IFF=1,NBF2
  125. NBNF2(IFF) = S3FASO(IFF,N2,ISENS,ISOMT2(1,IFF))
  126. C WRITE(*,*) 'FACE :',IFF,' DE ',NBNF2(IFF),' SOMMETS ='
  127. C WRITE(*,*) (ISOMT2(INO,IFF),INO=1,3)
  128. DO 62 INO=1,NBNF2(IFF)
  129. ISOMT2(INO,IFF)= IT2(ISOMT2(INO,IFF))
  130. 62 CONTINUE
  131. C CALL KNUTA(NBNF2(IFF),ISOMT2(1,IFF))
  132. 63 CONTINUE
  133. C
  134. C --- COMPARAISON ---
  135. C
  136. C WRITE(*,*) 'COMPARAISON'
  137. C WRITE(*,*) 'FACES = ',((ISOMT1(INO,IFF1),INO=1,3),'/',IFF1=1,4)
  138. C WRITE(*,*) 'FACES = ',((ISOMT2(INO,IFF1),INO=1,3),'/',IFF1=1,4)
  139. DO 80 IFF1=1,NBF1
  140. DO 75 IFF2=1,NBF2
  141. IF( NBNF1(IFF1).EQ.NBNF2(IFF2) )THEN
  142. INO = 1
  143. INO2 = 1
  144. C ---- ON CHERCHE LE DEBUT ---------------------
  145. 74 IF( ISOMT1(INO,IFF1).NE.ISOMT2(INO2,IFF2))THEN
  146. INO2 = INO2 + 1
  147. IF( INO2.GT.NBNF2(IFF2) ) GOTO 75
  148. GOTO 74
  149. ENDIF
  150. C ---- ON RECHERCHE LE SENS --------------------
  151. IF( ISOMT1(INO+1,IFF1).NE.
  152. > ISOMT2(MOD(INO2,NBNF2(IFF2))+1,IFF2))THEN
  153. ISENS = -1
  154. ELSE
  155. ISENS = 1
  156. ENDIF
  157. C
  158. C ---- ON COMPARE 2 LISTES CIRCULAIRES ---------
  159. C
  160. 77 INO = INO+1
  161. IF(ISENS.EQ.1)THEN
  162. INO2 = MOD(INO2,NBNF2(IFF2)) + 1
  163. ELSE
  164. INO2 = NBNF2(IFF2) - MOD(NBNF2(IFF2)+1-INO2,NBNF2(IFF2))
  165. ENDIF
  166. IF( ISOMT1(INO,IFF1).NE.ISOMT2(INO2,IFF2))GOTO 75
  167. C ----
  168. IF( INO.EQ. NBNF1(IFF1) )THEN
  169. I1 = IFF1
  170. I2 = IFF2
  171. SFAC3D = -ISENS
  172. C WRITE(*,*) 'FACE COMMUNE :',I1,I2
  173. GOTO 9999
  174. ENDIF
  175. GOTO 77
  176. ENDIF
  177. 75 CONTINUE
  178. 80 CONTINUE
  179. C
  180. SFAC3D = 0
  181. C
  182. 9999 END
  183.  
  184.  
  185.  

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