Télécharger psphe.eso

Retour à la liste

Numérotation des lignes :

psphe
  1. C PSPHE SOURCE PV 20/03/24 21:21:01 10554
  2. C CE SOUS-PROGRAMME RAMENNE UNE SPHERE SUR SES COORDONNEES PROPRES
  3. C
  4. SUBROUTINE PSPHE(IOP,FER,XPROJ,NDEB,NUMNP,ICENT,tcval)
  5. IMPLICIT INTEGER(I-N)
  6. IMPLICIT REAL*8 (A-H,O-Z)
  7. -INC SMCOORD
  8.  
  9. -INC PPARAM
  10. -INC CCOPTIO
  11. real*8 tcval(*)
  12. SEGMENT/FER/(NFI(ITT),MAI(IPP),ITOUR)
  13. SEGMENT XPROJ(3,IMAX)
  14. SEGMENT XINT(3,max(MAI(ITOUR+1),mai(itour+2)))
  15. * tcval (1) 2 3 4 5 6 7 8 9
  16. * SAVE XVEC1,YVEC1,ZVEC1,XVEC2,YVEC2,ZVEC2,XGRAV,YGRAV,ZGRAV
  17. * tcval (10) 11 12 13
  18. * SAVE RAYNV,XINV,YINV,ZINV
  19. IF (IOP.EQ.2) GOTO 100
  20. IMCT=MAI(ITOUR+1)
  21. INCT=MAI(1)+1
  22. IMAX=(IMCT**2)/4+10
  23. CALL LIRENT(IMAX,0,IRETOU)
  24. IF (IRETOU.NE.0) IMAX=MAX(1,IMAX)
  25. NDEB=IMCT+1
  26. SEGINI XPROJ
  27. SEGINI XINT
  28. SEGACT MCOORD*mod
  29. C CENTRE DE LA SPHERE
  30. IREF=ICENT*4-3
  31. XCENT=XCOOR(IREF)
  32. YCENT=XCOOR(IREF+1)
  33. ZCENT=XCOOR(IREF+2)
  34. C CENTRE DE GRAVITE POUR DETERMINER LE CENTRE DE L'INVERSION
  35. C CALCUL DU RAYON DE LA SPHERE
  36. XGRAVS=0
  37. YGRAVS=0
  38. ZGRAVS=0
  39. RAYON=0.
  40. DO 1 I=INCT,IMCT
  41. IREF=NFI(I)*4-3
  42. XP=XCOOR(IREF)
  43. YP=XCOOR(IREF+1)
  44. ZP=XCOOR(IREF+2)
  45. XGRAVS=XGRAVS+XP
  46. YGRAVS=YGRAVS+YP
  47. ZGRAVS=ZGRAVS+ZP
  48. RAYON=RAYON+(XCENT-XP)**2+(YCENT-YP)**2+(ZCENT-ZP)**2
  49. 1 CONTINUE
  50. XGRAVS=XGRAVS/(IMCT-INCT+1)
  51. YGRAVS=YGRAVS/(IMCT-INCT+1)
  52. ZGRAVS=ZGRAVS/(IMCT-INCT+1)
  53. RAYON=SQRT(RAYON/(IMCT-INCT+1))
  54.  
  55. C CENTRE DE L'INVERSION
  56. XDIR=XCENT-XGRAVS
  57. YDIR=YCENT-YGRAVS
  58. ZDIR=ZCENT-ZGRAVS
  59. DDIR=SQRT(XDIR**2+YDIR**2+ZDIR**2)
  60. COF=RAYON/DDIR
  61. XINV=XCENT+COF*XDIR
  62. YINV=YCENT+COF*YDIR
  63. ZINV=ZCENT+COF*ZDIR
  64. tcval(11)=xinv
  65. tcval(12)=yinv
  66. tcval(13)=zinv
  67. C EN AVANT POUR L'INVERSION ATTENTION AU CALCUL DE LA DENSITE
  68. RAYNV=4*RAYON**2
  69. tcval(10)=raynv
  70. DO 40 I=INCT,max(IMCT,mai(itour+2))
  71. II=NFI(I)
  72. IREF=II*4-3
  73. XV=XCOOR(IREF)-XINV
  74. YV=XCOOR(IREF+1)-YINV
  75. ZV=XCOOR(IREF+2)-ZINV
  76. DV=XV**2+YV**2+ZV**2
  77. IF (DV.EQ.0.) CALL ERREUR(21)
  78. IF (IERR.NE.0) RETURN
  79. XINT(1,I)=XV*RAYNV/DV
  80. XINT(2,I)=YV*RAYNV/DV
  81. XINT(3,I)=ZV*RAYNV/DV
  82. 40 CONTINUE
  83. C CENTRE DE GRAVITE DU PLAN DE PROJECTION
  84. XGRAV=0
  85. YGRAV=0
  86. ZGRAV=0
  87. DO 51 I=INCT,IMCT
  88. XGRAV=XGRAV+XINT(1,I)
  89. YGRAV=YGRAV+XINT(2,I)
  90. ZGRAV=ZGRAV+XINT(3,I)
  91. 51 CONTINUE
  92. XGRAV=XGRAV/(IMCT-INCT+1)
  93. YGRAV=YGRAV/(IMCT-INCT+1)
  94. ZGRAV=ZGRAV/(IMCT-INCT+1)
  95. tcval(7)=xgrav
  96. tcval(8)=ygrav
  97. tcval(9)=zgrav
  98. C VECTEUR NORMAL
  99. XNORM=0
  100. YNORM=0
  101. ZNORM=0
  102. DO 52 IT=1,ITOUR
  103. IPR=MAI(IT+1)
  104. XV1=XINT(1,IPR)-XGRAV
  105. YV1=XINT(2,IPR)-YGRAV
  106. ZV1=XINT(3,IPR)-ZGRAV
  107. DO 52 I=MAI(IT-1+1)+1,MAI(IT+1)
  108. XV2=XINT(1,I)-XGRAV
  109. YV2=XINT(2,I)-YGRAV
  110. ZV2=XINT(3,I)-ZGRAV
  111. XNORM=XNORM+YV1*ZV2-ZV1*YV2
  112. YNORM=YNORM+ZV1*XV2-XV1*ZV2
  113. ZNORM=ZNORM+XV1*YV2-XV2*YV1
  114. XV1=XV2
  115. YV1=YV2
  116. ZV1=ZV2
  117. 52 CONTINUE
  118. DNORM=SQRT (XNORM**2+YNORM**2+ZNORM**2)
  119. XNORM=XNORM/DNORM
  120. YNORM=YNORM/DNORM
  121. ZNORM=ZNORM/DNORM
  122. C FORMATION DU REPERE
  123. IF (ABS(XNORM).LT.0.1) THEN
  124. XVEC1=1-XNORM*XNORM
  125. YVEC1= -XNORM*YNORM
  126. ZVEC1= -XNORM*ZNORM
  127. ELSE
  128. XVEC1= -YNORM*XNORM
  129. YVEC1=1-YNORM*YNORM
  130. ZVEC1= -YNORM*ZNORM
  131. ENDIF
  132. DVEC1=XVEC1**2+YVEC1**2+ZVEC1**2
  133. DVEC1=SQRT(DVEC1)
  134. XVEC1=XVEC1/DVEC1
  135. YVEC1=YVEC1/DVEC1
  136. ZVEC1=ZVEC1/DVEC1
  137. XVEC2=YNORM*ZVEC1-ZNORM*YVEC1
  138. YVEC2=ZNORM*XVEC1-XNORM*ZVEC1
  139. ZVEC2=XNORM*YVEC1-YNORM*XVEC1
  140. tcval(1)=xvec1
  141. tcval(2)=yvec1
  142. tcval(3)=Zvec1
  143. tcval(4)=xvec2
  144. tcval(5)=Yvec2
  145. tcval(6)=Zvec2
  146. C EN AVANT POUR LA PROJECTION
  147. DO 53 I=INCT,max(IMCT,mai(itour+2))
  148. II=NFI(I)
  149. NFI(I)=I
  150. XRE=XINT(1,I)-XGRAV
  151. YRE=XINT(2,I)-YGRAV
  152. ZRE=XINT(3,I)-ZGRAV
  153. XPROJ(1,I)=XRE*XVEC1+YRE*YVEC1+ZRE*ZVEC1
  154. XPROJ(2,I)=XRE*XVEC2+YRE*YVEC2+ZRE*ZVEC2
  155. XTEST =XRE*XNORM+YRE*YNORM+ZRE*ZNORM
  156. IF (ABS(XTEST).GT.DNORM*1E-2.and.i.le.imct) CALL ERREUR(21)
  157. IF (IERR.NE.0) RETURN
  158. XPROJ(3,I)=XCOOR(II*4)
  159. 53 CONTINUE
  160. C VERIFIER LES DENSITES
  161. DO 54 IT=1,ITOUR
  162. II1=MAI(IT-1+1)+1
  163. II2=MAI(IT+1)
  164. DO 54 I=II1,II2
  165. IF (XPROJ(3,I).NE.0) GOTO 54
  166. IAP=I+1
  167. IF (IAP.GT.II2) IAP=II1
  168. XPROJ(3,I)=SQRT((XPROJ(1,I)-XPROJ(1,IAP))**2+(XPROJ(2,I)-XPROJ(2,
  169. # IAP))**2)
  170. 54 CONTINUE
  171. SEGSUP XINT
  172. RETURN
  173. 100 CONTINUE
  174. C ON RECONSTITUE LE MAILLAGE
  175. xvec1=tcval(1)
  176. yvec1=tcval(2)
  177. zvec1=tcval(3)
  178. xvec2=tcval(4)
  179. yvec2=tcval(5)
  180. zvec2=tcval(6)
  181. xgrav=tcval(7)
  182. ygrav=tcval(8)
  183. zgrav=tcval(9)
  184. raynv=tcval(10)
  185. xinv=tcval(11)
  186. yinv=tcval(12)
  187. zinv=tcval(13)
  188. SEGACT MCOORD*mod
  189. IF (NDEB.GT.NUMNP) GOTO 111
  190. NBPTA=nbpts
  191. NBPTS=NBPTA+NUMNP-NDEB+1
  192. SEGADJ MCOORD
  193. DO 110 I=NDEB,NUMNP
  194. XI=XPROJ(1,I)*XVEC1+XPROJ(2,I)*XVEC2+XGRAV
  195. YI=XPROJ(1,I)*YVEC1+XPROJ(2,I)*YVEC2+YGRAV
  196. ZI=XPROJ(1,I)*ZVEC1+XPROJ(2,I)*ZVEC2+ZGRAV
  197. DI=XI**2+YI**2+ZI**2
  198. XCOOR(NBPTA*(IDIM+1)+1)=XI*RAYNV/DI+XINV
  199. XCOOR(NBPTA*(IDIM+1)+2)=YI*RAYNV/DI+YINV
  200. XCOOR(NBPTA*(IDIM+1)+3)=ZI*RAYNV/DI+ZINV
  201. XCOOR((NBPTA+1)*(IDIM+1))=XPROJ(3,I)
  202. NBPTA=NBPTA+1
  203. 110 CONTINUE
  204. 111 CONTINUE
  205. SEGSUP XPROJ
  206. RETURN
  207. END
  208.  
  209.  
  210.  
  211.  
  212.  

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