Télécharger psphe.eso

Retour à la liste

Numérotation des lignes :

psphe
  1. C PSPHE SOURCE CB215821 26/08/24 21:18:03 12622
  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 112 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. 112 CONTINUE
  119. DNORM=SQRT (XNORM**2+YNORM**2+ZNORM**2)
  120. XNORM=XNORM/DNORM
  121. YNORM=YNORM/DNORM
  122. ZNORM=ZNORM/DNORM
  123. C FORMATION DU REPERE
  124. IF (ABS(XNORM).LT.0.1) THEN
  125. XVEC1=1-XNORM*XNORM
  126. YVEC1= -XNORM*YNORM
  127. ZVEC1= -XNORM*ZNORM
  128. ELSE
  129. XVEC1= -YNORM*XNORM
  130. YVEC1=1-YNORM*YNORM
  131. ZVEC1= -YNORM*ZNORM
  132. ENDIF
  133. DVEC1=XVEC1**2+YVEC1**2+ZVEC1**2
  134. DVEC1=SQRT(DVEC1)
  135. XVEC1=XVEC1/DVEC1
  136. YVEC1=YVEC1/DVEC1
  137. ZVEC1=ZVEC1/DVEC1
  138. XVEC2=YNORM*ZVEC1-ZNORM*YVEC1
  139. YVEC2=ZNORM*XVEC1-XNORM*ZVEC1
  140. ZVEC2=XNORM*YVEC1-YNORM*XVEC1
  141. tcval(1)=xvec1
  142. tcval(2)=yvec1
  143. tcval(3)=Zvec1
  144. tcval(4)=xvec2
  145. tcval(5)=Yvec2
  146. tcval(6)=Zvec2
  147. C EN AVANT POUR LA PROJECTION
  148. DO 53 I=INCT,max(IMCT,mai(itour+2))
  149. II=NFI(I)
  150. NFI(I)=I
  151. XRE=XINT(1,I)-XGRAV
  152. YRE=XINT(2,I)-YGRAV
  153. ZRE=XINT(3,I)-ZGRAV
  154. XPROJ(1,I)=XRE*XVEC1+YRE*YVEC1+ZRE*ZVEC1
  155. XPROJ(2,I)=XRE*XVEC2+YRE*YVEC2+ZRE*ZVEC2
  156. XTEST =XRE*XNORM+YRE*YNORM+ZRE*ZNORM
  157. IF (ABS(XTEST).GT.DNORM*1E-2.and.i.le.imct) CALL ERREUR(21)
  158. IF (IERR.NE.0) RETURN
  159. XPROJ(3,I)=XCOOR(II*4)
  160. 53 CONTINUE
  161. C VERIFIER LES DENSITES
  162. DO 113 IT=1,ITOUR
  163. II1=MAI(IT-1+1)+1
  164. II2=MAI(IT+1)
  165. DO 54 I=II1,II2
  166. IF (XPROJ(3,I).NE.0) GOTO 54
  167. IAP=I+1
  168. IF (IAP.GT.II2) IAP=II1
  169. XPROJ(3,I)=SQRT((XPROJ(1,I)-XPROJ(1,IAP))**2+(XPROJ(2,I)-XPROJ(2,
  170. # IAP))**2)
  171. 54 CONTINUE
  172. 113 CONTINUE
  173. SEGSUP XINT
  174. RETURN
  175. 100 CONTINUE
  176. C ON RECONSTITUE LE MAILLAGE
  177. xvec1=tcval(1)
  178. yvec1=tcval(2)
  179. zvec1=tcval(3)
  180. xvec2=tcval(4)
  181. yvec2=tcval(5)
  182. zvec2=tcval(6)
  183. xgrav=tcval(7)
  184. ygrav=tcval(8)
  185. zgrav=tcval(9)
  186. raynv=tcval(10)
  187. xinv=tcval(11)
  188. yinv=tcval(12)
  189. zinv=tcval(13)
  190. SEGACT MCOORD*mod
  191. IF (NDEB.GT.NUMNP) GOTO 111
  192. NBPTA=nbpts
  193. NBPTS=NBPTA+NUMNP-NDEB+1
  194. SEGADJ MCOORD
  195. DO 110 I=NDEB,NUMNP
  196. XI=XPROJ(1,I)*XVEC1+XPROJ(2,I)*XVEC2+XGRAV
  197. YI=XPROJ(1,I)*YVEC1+XPROJ(2,I)*YVEC2+YGRAV
  198. ZI=XPROJ(1,I)*ZVEC1+XPROJ(2,I)*ZVEC2+ZGRAV
  199. DI=XI**2+YI**2+ZI**2
  200. XCOOR(NBPTA*(IDIM+1)+1)=XI*RAYNV/DI+XINV
  201. XCOOR(NBPTA*(IDIM+1)+2)=YI*RAYNV/DI+YINV
  202. XCOOR(NBPTA*(IDIM+1)+3)=ZI*RAYNV/DI+ZINV
  203. XCOOR((NBPTA+1)*(IDIM+1))=XPROJ(3,I)
  204. NBPTA=NBPTA+1
  205. 110 CONTINUE
  206. 111 CONTINUE
  207. SEGSUP XPROJ
  208. RETURN
  209. END
  210.  
  211.  
  212.  
  213.  
  214.  
  215.  

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