Télécharger symetr.eso

Retour à la liste

Numérotation des lignes :

symetr
  1. C SYMETR SOURCE SP204843 24/03/15 21:15:08 11871
  2.  
  3. C Sousprogramme relaisant la symetrie d'un ou plusieurs objets
  4. C 10/2003 : modifications traitant du cas IDIM=1
  5.  
  6. SUBROUTINE SYMETR
  7.  
  8. IMPLICIT INTEGER(I-N)
  9. IMPLICIT REAL*8 (A-H,O-Z)
  10.  
  11. COMMON / CTOURN / XPT1,YPT1,ZPT1,XV1,YV1,ZV1,XV2,YV2,ZV2,
  12. . XVEC,YVEC,ZVEC,ANGLE,ICLE,XP1,YP1,ZP1
  13.  
  14.  
  15. -INC PPARAM
  16. -INC CCOPTIO
  17. -INC SMCOORD
  18. -INC SMELEME
  19.  
  20. CHARACTER*4 MCLE(3)
  21. DATA MCLE / 'POIN','DROI','PLAN' /
  22. SEGMENT ICPR(nbpts)
  23.  
  24. idimp1=IDIM+1
  25.  
  26. C Lecture du mot-cle
  27. CALL MESLIR(-242)
  28. CALL LIRMOT(MCLE,3,ICLE,1)
  29. IF (IERR.NE.0) RETURN
  30. IF (((IDIM.EQ.1).AND.(ICLE.NE.1)).OR.
  31. . ((IDIM.EQ.2).AND.(ICLE.EQ.3))) THEN
  32. MOTERR(1:4)=MCLE(ICLE)
  33. INTERR(1)=IDIM
  34. CALL ERREUR(971)
  35. ENDIF
  36. ICLE=ICLE+4
  37.  
  38. C Lecture des objets a transformer
  39. CALL MESLIR(-131)
  40. CALL LIROBJ('MAILLAGE',IP1,0,IROT)
  41. CALL MESLIR(-131)
  42. IF (IROT.EQ.0) THEN
  43. CALL LIROBJ('POINT ',IP1,1,IRETOU)
  44. IF (IERR.NE.0) RETURN
  45. ELSE
  46. CALL LIROBJ('CHPOINT ',IP2,0,IROT1)
  47. ENDIF
  48. C Lecture des points definissant la symetrie
  49. MOTERR(1:4)=MCLE(ICLE-4)
  50. CALL MESLIR(-241)
  51. CALL LIROBJ('POINT ',IPT1,1,IRETOU)
  52. IF (ICLE.GT.5) THEN
  53. MOTERR(1:4)=MCLE(ICLE-4)
  54. CALL MESLIR(-240)
  55. CALL LIROBJ('POINT ',IPT2,1,IRETOU)
  56. IF (IERR.NE.0) RETURN
  57. IF (ICLE.GT.6) THEN
  58. MOTERR(1:4)=MCLE(ICLE-4)
  59. CALL MESLIR(-239)
  60. CALL LIROBJ('POINT ',IPT3,1,IRETOU)
  61. IF (IERR.NE.0) RETURN
  62. ENDIF
  63. ENDIF
  64.  
  65. C Recuperation des coordonnees des points definissant la symetrie
  66. C Coordonnees stockees dans le COMMON CTOURN
  67. SEGACT MCOORD
  68. IREF=(IPT1-1)*idimp1
  69. XPT1=XCOOR(IREF+1)
  70. YPT1=0.
  71. IF (IDIM.GE.2) YPT1=XCOOR(IREF+2)
  72. ZPT1=0.
  73. IF (IDIM.GE.3) ZPT1=XCOOR(IREF+3)
  74. C Rappel : ICLE=6 valide pour IDIM=2 ou 3 - ICLE=7 pour IDIM=3
  75. IF (ICLE.GT.5) THEN
  76. IREF=(IPT2-1)*idimp1
  77. XPT2=XCOOR(IREF+1)
  78. YPT2=XCOOR(IREF+2)
  79. ZPT2=0.
  80. IF (IDIM.GE.3) ZPT2=XCOOR(IREF+3)
  81. XVEC=XPT2-XPT1
  82. YVEC=YPT2-YPT1
  83. ZVEC=ZPT2-ZPT1
  84. DVEC=SQRT(XVEC*XVEC+YVEC*YVEC+ZVEC*ZVEC)
  85. IF (DVEC.EQ.0.) THEN
  86. CALL ERREUR(21)
  87. RETURN
  88. ENDIF
  89. C Cas ICLE=6 : (XYZ)VEC vecteur directeur de la droite POIN1 POIN2
  90. XVEC=XVEC/DVEC
  91. YVEC=YVEC/DVEC
  92. ZVEC=ZVEC/DVEC
  93. IF (ICLE.GT.6) THEN
  94. IREF=(IPT3-1)*idimp1
  95. XPT3=XCOOR(IREF+1)
  96. YPT3=XCOOR(IREF+2)
  97. ZPT3=0.
  98. IF (IDIM.GE.3) ZPT3=XCOOR(IREF+3)
  99. XV1=XVEC
  100. YV1=YVEC
  101. ZV1=ZVEC
  102. XV2=XPT3-XPT1
  103. YV2=YPT3-YPT1
  104. ZV2=ZPT3-ZPT1
  105. XVEC=YV1*ZV2-ZV1*YV2
  106. YVEC=ZV1*XV2-XV1*ZV2
  107. ZVEC=XV1*YV2-YV1*XV2
  108. DVEC=SQRT(XVEC*XVEC+YVEC*YVEC+ZVEC*ZVEC)
  109. IF (DVEC.EQ.0.) THEN
  110. CALL ERREUR(21)
  111. RETURN
  112. ENDIF
  113. C Cas ICLE=7 : (XYZ)VEC normale (unitaire) au plan POIN1 POIN2 POIN3
  114. XVEC=XVEC/DVEC
  115. YVEC=YVEC/DVEC
  116. ZVEC=ZVEC/DVEC
  117. ENDIF
  118. ENDIF
  119.  
  120. C Transformation d'un MAILLAGE
  121. IF (IROT.EQ.1) THEN
  122. C Transformation d'un MAILLAGE et d'un CHPOINT
  123. IF (IROT1.EQ.1) THEN
  124. CALL INTOP1(IP2,IP1)
  125. ELSE
  126. C Transformation d'un MAILLAGE seul
  127. CALL INTOPE(IP1)
  128. ENDIF
  129. RETURN
  130. ENDIF
  131.  
  132. C Transformation du point IP1 (LIROBJ)
  133. IREF=(IP1-1)*idimp1
  134. XD=XCOOR(IREF+1)-XPT1
  135. YD=0.
  136. IF (IDIM.GE.2) YD=XCOOR(IREF+2)-YPT1
  137. ZD=0.
  138. IF (IDIM.GE.3) ZD=XCOOR(IREF+3)-ZPT1
  139. XDENS=XCOOR(IREF+idimp1)
  140. segact mcoord*mod
  141. nbpts=nbpts+1
  142. SEGADJ MCOORD
  143. IREF=(NBPTS-1)*idimp1
  144. ICAS=ICLE-4
  145. GOTO (11,12,13),ICAS
  146. C Option 'POINT' (1D/2D/3D) :
  147. C ----------------------------
  148. 11 XCOOR(IREF+1)=XPT1-XD
  149. IF (IDIM.GE.2) XCOOR(IREF+2)=YPT1-YD
  150. IF (IDIM.GE.3) XCOOR(IREF+3)=ZPT1-ZD
  151. GOTO 15
  152. C Option 'DROIT' (2D/3D) :
  153. C --------------------------
  154. 12 PVEC=2*(XD*XVEC+YD*YVEC+ZD*ZVEC)
  155. XCOOR(IREF+1)=XPT1+PVEC*XVEC-XD
  156. XCOOR(IREF+2)=YPT1+PVEC*YVEC-YD
  157. IF (IDIM.GE.3) XCOOR(IREF+3)=ZPT1+PVEC*ZVEC-ZD
  158. GOTO 15
  159. C Option 'PLAN' (3D) :
  160. C ----------------------
  161. 13 PVEC=2*(XD*XVEC+YD*YVEC+ZD*ZVEC)
  162. XCOOR(IREF+1)=XPT1+XD-PVEC*XVEC
  163. XCOOR(IREF+2)=YPT1+YD-PVEC*YVEC
  164. XCOOR(IREF+3)=ZPT1+ZD-PVEC*ZVEC
  165. C Ecriture du point transforme :
  166. 15 XCOOR(IREF+idimp1)=XDENS
  167. CALL ECROBJ('POINT ',NBPTS)
  168.  
  169. RETURN
  170. END
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  

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