Télécharger solpyr.eso

Retour à la liste

Numérotation des lignes :

solpyr
  1. C SOLPYR SOURCE PV 17/09/12 21:15:03 9542
  2. C---------------------------------------------------------------------|
  3. C |
  4. LOGICAL FUNCTION SOLPYR(IF1,IF2,IF3,IF4,IF5)
  5. C |
  6. C CETTE FONCTION LOGIQUE TESTE SI LA PYRAMIDE DECRIT PAR LES |
  7. C FACETTES IF1..IF5 EST VIDE DE POINT. |
  8. C LES ENTIERS N1..N5 INDIQUENT L'ORIENTATION DES FACETTES |
  9. C SOLPYR EST VRAI SI LA PYRAMIDE EST VIDE (DONC VALIDE) |
  10. C SOLPYR EST FAUX SI LA PYRAMIDE CONTIENT UN POINT (ET EST |
  11. C DONC INVALIDE) |
  12. C |
  13. C---------------------------------------------------------------------|
  14. C
  15. IMPLICIT INTEGER(I-N)
  16. IMPLICIT REAL*8(A-H,O-Z)
  17.  
  18. -INC PPARAM
  19. -INC CCOPTIO
  20. -INC TDEMAIT
  21. LOGICAL FACET3,FACET2,vervol
  22. dimension ift(5)
  23. ift(1)=if1
  24. ift(2)=if2
  25. ift(3)=if3
  26. ift(4)=if4
  27. ift(5)=if5
  28. C
  29. C CHERCHER SI LES FACETTES SONT NOUVELLES OU ANCIENNES
  30. N1=-1
  31. N2=-1
  32. N3=-1
  33. N4=-1
  34. N5=-1
  35. IF (IFAT(IF1).NE.0) N1=1
  36. IF (IFAT(IF2).NE.0) N2=1
  37. IF (IFAT(IF3).NE.0) N3=1
  38. IF (IFAT(IF4).NE.0) N4=1
  39. IF (IFAT(IF5).NE.0) N5=1
  40. 10 CONTINUE
  41. * encadrer l'hexaedre
  42. xmin=1e30
  43. xmax=-1e30
  44. ymin=1e30
  45. ymax=-1e30
  46. zmin=1e30
  47. zmax=-1e30
  48. do 92 j=1,5
  49. do 90 i=1,3
  50. xmin=min(xmin,xyz(1,nfc(i,ift(j))))
  51. xmax=max(xmax,xyz(1,nfc(i,ift(j))))
  52. ymin=min(ymin,xyz(2,nfc(i,ift(j))))
  53. ymax=max(ymax,xyz(2,nfc(i,ift(j))))
  54. zmin=min(zmin,xyz(3,nfc(i,ift(j))))
  55. zmax=max(zmax,xyz(3,nfc(i,ift(j))))
  56. 90 continue
  57. 92 continue
  58. iteste=0
  59. * DO 100 I=1,NPTMAX
  60. DO 100 I=1,0
  61. IF (NPF(1,I).EQ.0) GOTO 100
  62. DO 110 J=1,4
  63. IF (I.EQ.NFC(J,IF1)) GOTO 100
  64. IF (I.EQ.NFC(J,IF2)) GOTO 100
  65. IF (I.EQ.NFC(J,IF3)) GOTO 100
  66. IF (I.EQ.NFC(J,IF4)) GOTO 100
  67. IF (I.EQ.NFC(J,IF5)) GOTO 100
  68. 110 CONTINUE
  69. if (iteste.ne.0) then
  70. if (xyz(1,i).lt.xmin.or.xyz(1,i).gt.xmax) goto 100
  71. if (xyz(2,i).lt.ymin.or.xyz(2,i).gt.ymax) goto 100
  72. if (xyz(3,i).lt.zmin.or.xyz(3,i).gt.zmax) goto 100
  73. endif
  74. iteste=1
  75. C
  76. V1=N1*VOL(I,NFC(1,IF1),NFC(2,IF1),NFC(3,IF1))
  77. V2=N1*VOL(I,NFC(1,IF1),NFC(3,IF1),NFC(4,IF1))
  78. V3=N2*VOL(I,NFC(1,IF2),NFC(2,IF2),NFC(3,IF2))
  79. V4=N3*VOL(I,NFC(1,IF3),NFC(2,IF3),NFC(3,IF3))
  80. V5=N4*VOL(I,NFC(1,IF4),NFC(2,IF4),NFC(3,IF4))
  81. V6=N5*VOL(I,NFC(1,IF5),NFC(2,IF5),NFC(3,IF5))
  82. VV=V1+V2+V3+V4+V5+V6
  83. IF (VV.LE.0.) then
  84. if(IVERB.EQ.1) write (6,*) ' pyramide volume negatif '
  85. solpyr=.false.
  86. return
  87. GOTO 120
  88. endif
  89. IF (V1.LE.-0.01*VV) GOTO 100
  90. IF (V2.LE.-0.01*VV) GOTO 100
  91. IF (V3.LE.-0.01*VV) GOTO 100
  92. IF (V4.LE.-0.01*VV) GOTO 100
  93. IF (V5.LE.-0.01*VV) GOTO 100
  94. IF (V6.LE.-0.01*VV) GOTO 100
  95. GOTO 120
  96. C
  97. C
  98. 100 CONTINUE
  99. C
  100. C IL N'EXISTE PAS DE POINTS INTERNES AU VOLUME
  101. SOLPYR=.TRUE.
  102. C RAJOUT PV TEST INTERSECTION DES FACETTES
  103. IF (N1.EQ.1) SOLPYR=SOLPYR.AND.FACET2(IF1)
  104. IF (.NOT.SOLPYR) RETURN
  105. IF (N2.EQ.1) SOLPYR=SOLPYR.AND.FACET2(IF2)
  106. IF (.NOT.SOLPYR) RETURN
  107. IF (N3.EQ.1) SOLPYR=SOLPYR.AND.FACET2(IF3)
  108. IF (.NOT.SOLPYR) RETURN
  109. IF (N4.EQ.1) SOLPYR=SOLPYR.AND.FACET2(IF4)
  110. IF (.NOT.SOLPYR) RETURN
  111. IF (N5.EQ.1) SOLPYR=SOLPYR.AND.FACET2(IF5)
  112. IF (.NOT.SOLPYR) RETURN
  113. C
  114. C on teste maintenant qu'on ne recouvre pas un autre volume
  115. ip1=nfc(1,if1)
  116. ip2=nfc(2,if1)
  117. ip3=nfc(3,if1)
  118. ip4=nfc(4,if1)
  119. ip5=nfc(1,if2)
  120. if (ip5.eq.ip1.or.ip5.eq.ip2.or.ip5.eq.ip3.or.ip5.eq.ip4)
  121. * ip5=nfc(2,if2)
  122. if (ip5.eq.ip1.or.ip5.eq.ip2.or.ip5.eq.ip3.or.ip5.eq.ip4)
  123. * ip5=nfc(3,if2)
  124. * write (6,*) ' solpyr sommets ',ip1,ip2,ip3,ip4,ip5
  125. * write (6,*) ' solpyr coordonnees '
  126. * write (6,*) xyz(1,ip1),xyz(2,ip1),xyz(3,ip1)
  127. * write (6,*) xyz(1,ip2),xyz(2,ip2),xyz(3,ip2)
  128. * write (6,*) xyz(1,ip3),xyz(2,ip3),xyz(3,ip3)
  129. * write (6,*) xyz(1,ip4),xyz(2,ip4),xyz(3,ip4)
  130. * write (6,*) xyz(1,ip5),xyz(2,ip5),xyz(3,ip5)
  131. xbar=(xyz(1,ip1)+xyz(1,ip2)+xyz(1,ip3)+xyz(1,ip4)+xyz(1,ip5))/5.
  132. ybar=(xyz(2,ip1)+xyz(2,ip2)+xyz(2,ip3)+xyz(2,ip4)+xyz(2,ip5))/5.
  133. zbar=(xyz(3,ip1)+xyz(3,ip2)+xyz(3,ip3)+xyz(3,ip4)+xyz(3,ip5))/5.
  134. * write (6,*) ' bary ',xbar,ybar,zbar
  135. xfac=(xyz(1,ip1)+xyz(1,ip2)+xyz(1,ip3)+xyz(1,ip4))/4.
  136. yfac=(xyz(2,ip1)+xyz(2,ip2)+xyz(2,ip3)+xyz(2,ip4))/4.
  137. zfac=(xyz(3,ip1)+xyz(3,ip2)+xyz(3,ip3)+xyz(3,ip4))/4.
  138. xyz(1,nptmax+1)=xfac+0.1*(xbar-xfac)
  139. xyz(2,nptmax+1)=yfac+0.1*(ybar-yfac)
  140. xyz(3,nptmax+1)=zfac+0.1*(zbar-zfac)
  141. solpyr=solpyr.and.vervol(nptmax+1,ip1,ip2,ip3,ip4,ip5,-1,-1,-1)
  142. if (.not.solpyr) return
  143. xfac=(xyz(1,ip1)+xyz(1,ip2)+xyz(1,ip5))/3.
  144. yfac=(xyz(2,ip1)+xyz(2,ip2)+xyz(2,ip5))/3.
  145. zfac=(xyz(3,ip1)+xyz(3,ip2)+xyz(3,ip5))/3.
  146. xyz(1,nptmax+1)=xfac+0.1*(xbar-xfac)
  147. xyz(2,nptmax+1)=yfac+0.1*(ybar-yfac)
  148. xyz(3,nptmax+1)=zfac+0.1*(zbar-zfac)
  149. solpyr=solpyr.and.vervol(nptmax+1,ip1,ip2,ip3,ip4,ip5,-1,-1,-1)
  150. if (.not.solpyr) return
  151. xfac=(xyz(1,ip2)+xyz(1,ip3)+xyz(1,ip5))/3.
  152. yfac=(xyz(2,ip2)+xyz(2,ip3)+xyz(2,ip5))/3.
  153. zfac=(xyz(3,ip2)+xyz(3,ip3)+xyz(3,ip5))/3.
  154. xyz(1,nptmax+1)=xfac+0.1*(xbar-xfac)
  155. xyz(2,nptmax+1)=yfac+0.1*(ybar-yfac)
  156. xyz(3,nptmax+1)=zfac+0.1*(zbar-zfac)
  157. solpyr=solpyr.and.vervol(nptmax+1,ip1,ip2,ip3,ip4,ip5,-1,-1,-1)
  158. if (.not.solpyr) return
  159. xfac=(xyz(1,ip3)+xyz(1,ip4)+xyz(1,ip5))/3.
  160. yfac=(xyz(2,ip3)+xyz(2,ip4)+xyz(2,ip5))/3.
  161. zfac=(xyz(3,ip3)+xyz(3,ip4)+xyz(3,ip5))/3.
  162. xyz(1,nptmax+1)=xfac+0.1*(xbar-xfac)
  163. xyz(2,nptmax+1)=yfac+0.1*(ybar-yfac)
  164. xyz(3,nptmax+1)=zfac+0.1*(zbar-zfac)
  165. solpyr=solpyr.and.vervol(nptmax+1,ip1,ip2,ip3,ip4,ip5,-1,-1,-1)
  166. if (.not.solpyr) return
  167. xfac=(xyz(1,ip4)+xyz(1,ip1)+xyz(1,ip5))/3.
  168. yfac=(xyz(2,ip4)+xyz(2,ip1)+xyz(2,ip5))/3.
  169. zfac=(xyz(3,ip4)+xyz(3,ip1)+xyz(3,ip5))/3.
  170. xyz(1,nptmax+1)=xfac+0.1*(xbar-xfac)
  171. xyz(2,nptmax+1)=yfac+0.1*(ybar-yfac)
  172. xyz(3,nptmax+1)=zfac+0.1*(zbar-zfac)
  173. solpyr=solpyr.and.vervol(nptmax+1,ip1,ip2,ip3,ip4,ip5,-1,-1,-1)
  174. if (.not.solpyr) return
  175. RETURN
  176. C
  177. 120 CONTINUE
  178. C LE POINT I EST INTERNE AU VOLUME
  179. IF (IVERB.EQ.1) WRITE(6,1010)I
  180. 1010 FORMAT(' LE POINT ',I5,' EST INTERNE A la pyramide CREEe')
  181. IF (IVERB.EQ.1) write (6,*) xyz(1,i),xyz(2,i),xyz(3,i)
  182. SOLPYR=.FALSE.
  183. RETURN
  184. END
  185.  
  186.  
  187.  
  188.  
  189.  

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