Télécharger vmdisc.eso

Retour à la liste

Numérotation des lignes :

vmdisc
  1. C VMDISC SOURCE BP208322 16/11/18 21:21:55 9177
  2. SUBROUTINE VMDISC(melle)
  3. IMPLICIT INTEGER(I-N)
  4. IMPLICIT REAL*8(A-H,O-Z)
  5. C
  6. C=======================================================================
  7. C Le but de cette subroutine est de savoir s'il n'y a pas
  8. C d'éléments connectés à des éléments d'une autre forme.
  9. C Ex: un CUB8 connecté à deux PRI6.
  10. C On utilise l'enveloppe car elle détecte ce genre de connexions.
  11. C On lit les sous objets et on compare leurs éléments.
  12. C Si un élément a tous ses points qui appartiennent aussi à un
  13. C autre élément on est dans le cas de figure à détecter.
  14. C
  15. C=======================================================================
  16. C
  17. C NB: On considère qu'il n'y a plus de points doubles inopportuns.
  18. C
  19. C=======================================================================
  20. C
  21. C Modifications :
  22. C
  23. C P. Maugis (04/08/2005) :
  24. C on lieu de faire une erreur sur une sous-zone non pertinente,
  25. C on passe à la sous-zone suivante
  26. C
  27. C=======================================================================
  28. C
  29.  
  30. -INC PPARAM
  31. -INC CCOPTIO
  32. -INC CCGEOME
  33. -INC SMELEME
  34. -INC SMCOORD
  35. C
  36. C
  37. C=======================================================================
  38. C STOCK EST UN SEGMENT QUI CONTIENT UN VECTEUR STOCKANT LES
  39. C NUMEROS DES POINTS D'UN ELEMENT
  40. C=======================================================================
  41. SEGMENT STOCK
  42. INTEGER ivnum(jTAIL)
  43. ENDSEGMENT
  44. POINTEUR VINT.STOCK
  45. C
  46. C=======================================================================
  47. C UTILISATION D'ENVELOPPE (ON OBTIENT DES SURFACES)
  48. C=======================================================================
  49.  
  50. C Uniquement en 3D
  51. IF(IDIM.NE.3) RETURN
  52.  
  53. C On récupère l'enveloppe (plante si doublons)
  54. CALL ECROBJ('MAILLAGE',MELLE)
  55. CALL ENVELO
  56. CALL LIROBJ('MAILLAGE',MELEME,1,IRETOU)
  57. IF (IERR.NE.0) RETURN
  58.  
  59. SEGACT MELEME
  60. IPT1=MELEME
  61. C
  62. C Si l'on obtient un objet géométrique simple : pas de problème
  63. IF (LISOUS(/1).EQ.0) GOTO 14
  64.  
  65.  
  66. C=======================================================================
  67. C BOUCLE SUR LES SOUS OBJETS
  68. C=======================================================================
  69.  
  70. DO 1 I=1,LISOUS(/1)-1
  71. IPT1=LISOUS(I)
  72. SEGACT IPT1
  73.  
  74. * Vérifications d'usage
  75. K=IPT1.ITYPEL
  76. C on ne traite que les éléments surfaciques
  77. IF (K.NE.KSURF(K)) GOTO 1
  78.  
  79. IDEP=NSPOS(K)
  80. IF (NBSOM(K).GT.0) THEN
  81. IFEP=IDEP+NBSOM(K)-1
  82. ELSE
  83. C Cas du polygone
  84. IFEP=IDEP+IPT1.NUM(/1)-1
  85. ENDIF
  86.  
  87. * Il faut au moins deux points par face
  88. IF (IDEP.GT.IFEP) THEN
  89. write(IOIMP,*) 'Une face doit avoir au moins 3 points'
  90. CALL ERREUR (16)
  91. RETURN
  92. ENDIF
  93.  
  94. jtail=IFEP-IDEP+1
  95. SEGINI STOCK
  96.  
  97. C=======================================================================
  98. C BOUCLE SUR LES ELEMENTS DU SOUS OBJET N° I
  99. C=======================================================================
  100. vint=0
  101. DO 2 NEL=1,IPT1.NUM(/2)
  102. II=0
  103. C Enregistrement des n° des sommets de l'élément
  104. DO 3 NSP=IDEP,IFEP
  105. NSO=IBSOM(NSP)
  106. II=II+1
  107. ivnum(II)=IPT1.NUM(NSO,NEL)
  108. 3 CONTINUE
  109. MARQUE=0
  110.  
  111. C=======================================================================
  112. C 2e BOUCLE SUR LES SOUS OBJETS (IS>I)
  113. C=======================================================================
  114.  
  115. DO 4 IS=I+1,LISOUS(/1)
  116.  
  117. IPT2=LISOUS(IS)
  118. SEGACT IPT2
  119. KS=IPT2.ITYPEL
  120. IDEPS=NSPOS(KS)
  121. IF (NBSOM(KS).GT.0) THEN
  122. IFEPS=IDEPS+NBSOM(KS)-1
  123. ELSE
  124. C Cas du polygone
  125. IFEPS=IDEPS+IPT1.NUM(/1)-1
  126. ENDIF
  127. IF (IDEPS.GT.IFEPS) THEN
  128. write(IOIMP,*) 'Une face doit avoir au moins 3 points'
  129. CALL ERREUR (16)
  130. RETURN
  131. ENDIF
  132.  
  133. C=======================================================================
  134. C BOUCLE SUR LES ELEMENTS DU SOUS OBJET N° IS
  135. C=======================================================================
  136.  
  137. DO 5 NELS=1,IPT2.NUM(/2)
  138. C Relecture de ivnum s'il avait été modifié
  139. IF (MARQUE.EQ.1) THEN
  140. jtail=mtailm
  141. SEGADJ STOCK
  142. DO 6 L=1,jtail
  143. ivnum(L)=VINT.ivnum(L)
  144. 6 CONTINUE
  145. MARQUE=0
  146. ENDIF
  147.  
  148. C=======================================================================
  149. C On parcourt les sommets de nels, on parcourt
  150. C les coordonnées de vecnum en testant s'ils
  151. C ont les memes n°.
  152. C=======================================================================
  153.  
  154. NSPS=IDEPS-1
  155. 7 CONTINUE
  156.  
  157. NSPS=NSPS+1
  158. NSOS=IBSOM(NSPS)
  159. IF (NSPS.GT.IFEPS) GOTO 10
  160. jcp=0
  161. 8 CONTINUE
  162.  
  163. jcp=jcp+1
  164. IF (jcp.GT.jtail) GOTO 5
  165. IF (IPT2.NUM(NSOS,NELS).EQ.ivnum(jcp)) THEN
  166. C On enregistre ivnum avant de le modifier
  167. IF (MARQUE.EQ.0) THEN
  168. mtailm=jtail
  169. SEGINI VINT
  170. DO 9 L=1,mtailm
  171. VINT.ivnum(L)=ivnum(L)
  172. 9 CONTINUE
  173. MARQUE=1
  174. ENDIF
  175. C On supprime la coordonée n° jcp de ivnum
  176. INT=ivnum(jtail)
  177. ivnum(jtail)=ivnum(jcp)
  178. ivnum(jcp)=INT
  179. jtail=jtail-1
  180. IF (jtail.EQ.0) GOTO 11
  181. SEGADJ STOCK
  182. GOTO 7
  183. ELSE
  184. GOTO 8
  185. ENDIF
  186.  
  187. 10 CONTINUE
  188. INTERR(1)=NELS
  189. MOTERR(1:4)=NOMS(KS)
  190. INTERR(2)=NEL
  191. MOTERR(5:8)=NOMS(K)
  192. CALL ERREUR(-334)
  193. GOTO 12
  194.  
  195. 11 CONTINUE
  196. INTERR(1)=NEL
  197. MOTERR(1:4)=NOMS(K)
  198. INTERR(2)=NELS
  199. MOTERR(5:8)=NOMS(KS)
  200. CALL ERREUR(-334)
  201.  
  202. 12 CONTINUE
  203. 5 CONTINUE
  204. 4 CONTINUE
  205. IF (MARQUE.EQ.1) THEN
  206. jtail=mtailm
  207. SEGADJ STOCK
  208. DO 13 L=1,jtail
  209. ivnum(L)=VINT.ivnum(L)
  210. 13 CONTINUE
  211. MARQUE=0
  212. ENDIF
  213.  
  214. 2 CONTINUE
  215. SEGDES STOCK
  216. IF(VINT.NE.0)SEGSUP VINT
  217. 1 CONTINUE
  218.  
  219. 14 CONTINUE
  220. SEGDES MELEME
  221.  
  222. RETURN
  223. END
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  

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