Télécharger rond.eso

Retour à la liste

Numérotation des lignes :

rond
  1. C ROND SOURCE CB215821 23/01/25 21:15:33 11573
  2. C 1234567890124567890124567898012456789012345678901234567890123456
  3.  
  4. C SOURCE : L. DI VALENTIN LE 17/06/97
  5.  
  6. C Cette subroutine appele par l'operateur LIGN (grace au mot cle
  7. C ROTA) prepare les donnees a transmettre a la subroutine ARC
  8. C pour construire un arc de cercle dont on connait le centre
  9. C (CENTRE), un point (POINT1) et l'angle d'ouverture en degre a
  10. C partir de ce point.
  11.  
  12. C En dimension 3, il est necessaire de fournir la normale au
  13. C cercle, ce qui fournit a la fois le plan contenant le cercle
  14. C et le sens trigonometrique positif dans ce plan.
  15.  
  16.  
  17. SUBROUTINE ROND
  18.  
  19.  
  20. IMPLICIT INTEGER(I-N)
  21. IMPLICIT REAL*8 (A-H,O-Z)
  22. -INC CCREEL
  23.  
  24. -INC PPARAM
  25. -INC CCOPTIO
  26. -INC SMELEME
  27. -INC SMCOORD
  28.  
  29.  
  30. INTEGER INBR,IRET,POINT1,POINT2,NORMAL,CENTRE
  31. REAL*8 ANGLE,DENS1,DENS2,NORME
  32. CHARACTER*(4) TYPE*8
  33. CHARACTER*4 MOTCLE(2)
  34. logical ltelq
  35.  
  36.  
  37. DATA MOTCLE/'DINI','DFIN'/
  38.  
  39.  
  40. INBR = 0
  41. CALL LIRENT(INBR,0,IRET)
  42.  
  43.  
  44. * IF (DENS1*DENS2.LE.0.D0.AND.INBR.LE.0) THEN
  45. * CALL ERREUR(17)
  46. * RETURN
  47. * ENDIF
  48.  
  49.  
  50. C Lecture du centre.
  51.  
  52. CALL LIROBJ('POINT',CENTRE,1,IRET)
  53. IF (IRET.EQ.0) RETURN
  54.  
  55.  
  56. C Si on a un maillage, on extrait le dernier point
  57. IPT1=0
  58. CALL LIROBJ('MAILLAGE',IPT1,0,IRET)
  59. IF (IRET.EQ.1) THEN
  60. CALL ACTOBJ('MAILLAGE',IPT1,1)
  61. CALL EXTRPO(IPT1,1,POINT1)
  62. IF(IERR .NE. 0)RETURN
  63. ELSE
  64. CALL LIROBJ('POINT',POINT1,1,IRET)
  65. ENDIF
  66. IF (IERR.NE.0) RETURN
  67.  
  68. C Lecture de l'angle de rotation.
  69.  
  70. CALL LIRREE(ANGLE,1,IRET)
  71. IF (IRET.EQ.0) RETURN
  72.  
  73. ANGLE = ANGLE * XPI / 180.D0
  74.  
  75.  
  76. C En dimension 3, lecture du point fournissant le sens
  77. C trigonométrique
  78.  
  79. IF (IDIM.EQ.3) THEN
  80. CALL LIROBJ('POINT',NORMAL,1,IRET)
  81. IF (IRET.EQ.0) RETURN
  82. ENDIF
  83.  
  84.  
  85. C On recupere les coordonnees du CENTRE
  86. SEGACT,MCOORD
  87.  
  88. XCEN = XCOOR((CENTRE-1)*(IDIM+1) + 1)
  89. YCEN = XCOOR((CENTRE-1)*(IDIM+1) + 2)
  90. IF (IDIM.EQ.3) THEN
  91. ZCEN = XCOOR((CENTRE-1)*(IDIM+1) + 3)
  92. ENDIF
  93. DENS2=XCOOR((CENTRE)*(IDIM+1))
  94.  
  95. C On recupere les coordonnees du vecteur (CENTRE -> POINT1)
  96.  
  97. X1 = XCOOR((POINT1-1)*(IDIM+1) + 1) - XCEN
  98. Y1 = XCOOR((POINT1-1)*(IDIM+1) + 2) - YCEN
  99.  
  100. IF (IDIM.EQ.3) THEN
  101. Z1 = XCOOR((POINT1-1)*(IDIM+1) + 3) - ZCEN
  102. ELSE
  103. Z1 = 0.D0
  104. ENDIF
  105. DENS1=XCOOR((POINT1)*(IDIM+1))
  106.  
  107. C On cree une place memoire pour le deuxieme point extremite
  108.  
  109. SEGACT,MCOORD*MOD
  110. NBPTS = nbpts+1
  111. POINT2 = NBPTS
  112. SEGADJ,MCOORD
  113.  
  114.  
  115. C Calcul des coordonnees de ce point :
  116.  
  117.  
  118. C Si IDIM = 3 on recupere le vecteur normal.
  119.  
  120. IF (IDIM.EQ.3) THEN
  121.  
  122. Xn = XCOOR((NORMAL-1)*(IDIM+1) + 1)
  123. Yn = XCOOR((NORMAL-1)*(IDIM+1) + 2)
  124. Zn = XCOOR((NORMAL-1)*(IDIM+1) + 3)
  125.  
  126. NORME = SQRT(Xn*Xn + Yn*Yn + Zn*Zn)
  127.  
  128. Xn = Xn/NORME
  129. Yn = Yn/NORME
  130. Zn = Zn/NORME
  131.  
  132. ELSE
  133.  
  134. Xn = 0.D0
  135. Yn = 0.D0
  136. Zn = 1.D0
  137.  
  138. ENDIF
  139.  
  140.  
  141. C POINT3 = NORMAL vectoriel POINT1 :
  142.  
  143. X3 = Yn*Z1 - Zn*Y1
  144. Y3 = Zn*X1 - Xn*Z1
  145. Z3 = Xn*Y1 - Yn*X1
  146.  
  147.  
  148. C Calcul des coordonnees de POINT2 (point extremite)
  149.  
  150. XCOOR((POINT2-1)*(IDIM+1) + 1) = XCEN + COS(ANGLE)*X1
  151. & + SIN(ANGLE)*X3
  152. XCOOR((POINT2-1)*(IDIM+1) + 2) = YCEN + COS(ANGLE)*Y1
  153. & + SIN(ANGLE)*Y3
  154. IF (IDIM.EQ.3) THEN
  155. XCOOR((POINT2-1)*(IDIM+1) + 3) = ZCEN + COS(ANGLE)*Z1
  156. & + SIN(ANGLE)*Z3
  157. ENDIF
  158. DENS2=SQRT(ABS(DENS1*DENS2))
  159. XCOOR(POINT2*(IDIM+1))=DENS2
  160.  
  161.  
  162. 413 CALL LIRMOT(MOTCLE,2,IRET,0)
  163.  
  164. IF (IRET.EQ.1) THEN
  165. CALL LIRREE(DENS1,1,IRET)
  166. IF (IRET.EQ.0) RETURN
  167. GOTO 413
  168.  
  169. ELSEIF (IRET.EQ.2) THEN
  170. CALL MESLIR(-169)
  171. CALL LIRREE(DENS2,1,IRET)
  172. IF (IRET.EQ.0) RETURN
  173. GOTO 413
  174.  
  175. ENDIF
  176.  
  177.  
  178. CALL ARC(POINT1,CENTRE,NORMAL,ANGLE,INBR,DENS1,DENS2,POINT2)
  179. SEGDES,MCOORD
  180.  
  181. IF (IERR.NE.0) RETURN
  182. IF (IPT1.NE.0) THEN
  183. CALL LIROBJ('MAILLAGE',IPT2,1,IRETOU)
  184. IF (IERR.NE.0) RETURN
  185. CALL ACTOBJ('MAILLAGE',IPT2,1)
  186. ltelq=.false.
  187. CALL FUSE(IPT1,IPT2,IPT3,ltelq)
  188. IF (IERR.NE.0) RETURN
  189. SEGSUP IPT2
  190. CALL ACTOBJ('MAILLAGE',IPT3,1)
  191. CALL ECROBJ('MAILLAGE',IPT3)
  192. ENDIF
  193. RETURN
  194.  
  195. END
  196.  
  197.  

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