Télécharger excomp.eso

Retour à la liste

Numérotation des lignes :

excomp
  1. C EXCOMP SOURCE PV090527 24/02/29 21:15:03 11854
  2. SUBROUTINE EXCOMP
  3. C=======================================================================
  4. C
  5. C OPERATEUR EXTRACTION D UNE COMPOSANTE D UN CHPOINT
  6. C D UN MCHAML
  7. C DE QUELQUES COMPOSANTES D UN MCHAML
  8. C
  9. C CH2 = EXCO | MOT1 (MOT2) | (n1) (n2) ('NOID') CH1 ...
  10. C | LISM1 (LISM2) |
  11. C
  12. C ... ('NATURE' |'INDETER'| ) ;
  13. C |'DIFFUS' |
  14. C |'DISCRET'|
  15. C
  16. C=======================================================================
  17. IMPLICIT INTEGER(I-N)
  18. IMPLICIT REAL*8(A-H,O-Z)
  19.  
  20. -INC PPARAM
  21. -INC CCOPTIO
  22. -INC SMLMOTS
  23. -INC SMCHPOI
  24. -INC SMCHAML
  25.  
  26. CHARACTER*4 NOVE(1),NATU(3)
  27. CHARACTER*(LOCOMP) MOT,MOT2,MOT3
  28. DATA NOVE/'NOID'/
  29. DATA NATU/'INDE','DIFF','DISC'/
  30.  
  31. C
  32. C LISTE DE MOT OU MOT SIMPLE
  33. C
  34.  
  35. MOT =' '
  36. LISM1= 0
  37. LISM2= 0
  38. C Syntaxe 2 : on tente de lire un LISTMOTS
  39. CALL LIROBJ('LISTMOTS',LISM1,0,IRT1)
  40. C Syntaxe 1 : si abscence de LISTMOTS, on lit un simple MOT
  41. IF(IRT1.EQ.0) THEN
  42. MOT2='SCAL'
  43. CALL LIRCHA(MOT,1,IRETOU)
  44. IF(IERR.NE.0) RETURN
  45. ENDIF
  46. C
  47. Cbp : Lecture eventuelle de l'harmonique de Fourier en entre /sortie
  48. CALL LIRENT(NIF1,0,IRET1)
  49. IF(IRET1.NE.0) THEN
  50. CALL LIRENT(NIF2,0,IRET2)
  51. IF(IRET2.EQ.0) NIF2=NIFOUR
  52. ELSE
  53. NIF1=NIFOUR
  54. NIF2=NIFOUR
  55. ENDIF
  56. IF(IERR.NE.0) RETURN
  57. C
  58. C Lecture de l'option 'NOID'
  59. CALL LIRMOT(NOVE,1,NOID,0)
  60. * pv NOID automatique le 29/2/24
  61. NOID=1
  62. C
  63. C Pour la syntaxe 2, on tente la lecture d'un second LISTMLOTS
  64. IF(IRT1.NE.0) THEN
  65. CALL LIROBJ('LISTMOTS',LISM2,0,IRL2)
  66. ENDIF
  67. C
  68. C
  69. C-----------------------------------------------
  70. C CAS D'UN OBJET CHPOINT
  71. C-----------------------------------------------
  72. CALL LIROBJ('CHPOINT ',IPCH1,0,IRT2)
  73. IF(IRT2.EQ.0) GOTO 100
  74. CALL ACTOBJ('CHPOINT ',IPCH1,1)
  75. C On essaie de lire le nouveau nom et la nature (facultatif)
  76. CALL LIRCHA(MOT2,0,IRETOU)
  77. MCHPOI = IPCH1
  78. JATT1 = JATTRI(1)+1
  79. IF (IRETOU .GE. 1) THEN
  80. IF (MOT2(1:4) .EQ. 'NATU' ) THEN
  81. C jatt va stocker la nature
  82. CALL LIRMOT(NATU,3,JATT1,1)
  83. IF(IERR.NE.0) RETURN
  84. MOT2='SCAL'
  85. ELSE
  86. C MOT2 est le nouveau nom de la composante
  87. C on essaie a nouveau de lire la nature
  88. CALL LIRCHA(MOT3,0,IRETOU)
  89. IF (IRETOU .GE. 1) THEN
  90. IF (MOT3(1:4) .EQ. 'NATU' ) THEN
  91. CALL LIRMOT(NATU,3,JATT1,1)
  92. IF(IERR.NE.0) RETURN
  93. ELSE
  94. C 'NATU' n'est pas specifie on continue...
  95. CALL REFUS
  96. ENDIF
  97. ENDIF
  98. ENDIF
  99. ENDIF
  100.  
  101. C Syntaxe 1 (avec des MOTs simples)
  102. IF (LISM1.EQ.0) THEN
  103. CALL EXCOPP(IPCH1,MOT,NIF1,IPCH2,MOT2,NIF2,NOID)
  104. IF(IERR.NE.0) RETURN
  105. C Syntaxe 2 (avec des LISTMOTS)
  106. ELSE
  107. MLMOTS=LISM1
  108. SEGACT MLMOTS
  109. C Erreur si les deux LISTMOTS ne sont pas de meme dimension
  110. IF (LISM2.NE.0) THEN
  111. MLMOT2=LISM2
  112. SEGACT,MLMOT2
  113. IF (MOTS(/2).NE.MLMOT2.MOTS(/2)) THEN
  114. CALL ERREUR(217)
  115. RETURN
  116. ENDIF
  117. ENDIF
  118. IPCH2=0
  119.  
  120.  
  121. C Erreur si le premier LISTMOTS est vide
  122. IF (MOTS(/2).EQ.0) THEN
  123. NAT =1
  124. NSOUPO=0
  125. SEGINI,MCHPOI
  126. IPCH2 =MCHPOI
  127.  
  128. C On place un soucis avec le numero de l'erreur qu'on pourrait emettre
  129. MOTERR(1:8)='LISTMOTS'
  130. INTERR(1)=MLMOTS
  131. CALL SOUCIS(356)
  132.  
  133. ELSE
  134. C On fait le job en bouclant sur les mots
  135. DO IM=1,MOTS(/2)
  136. MOT =MOTS(IM)
  137. IF (LISM2.NE.0) THEN
  138. MOT2=MLMOT2.MOTS(IM)
  139. ELSE
  140. MOT2=MOTS(IM)
  141. ENDIF
  142.  
  143. CALL EXCOPP(IPCH1,MOT,NIF1,IPCH3,MOT2,NIF2,NOID)
  144. IF(IERR.NE.0) RETURN
  145.  
  146. IF(IPCH2.EQ.0) THEN
  147. IPCH2=IPCH3
  148. ELSE
  149. CALL ADCHPO(IPCH2,IPCH3,IPCHR,1D0,1D0)
  150. IF(IERR.NE.0) RETURN
  151. IPCH2=IPCHR
  152. ENDIF
  153. ENDDO
  154. ENDIF
  155. ENDIF
  156. C On ajuste la nature du champ
  157. MCHPOI=IPCH2
  158. mochde='CHPOINT cree par EXCOMP'
  159. mtypoi='SCALAIRE'
  160. JATTRI(1)=JATT1-1
  161.  
  162. C On ecrit le CHPOINT resultat dans la pile
  163. CALL ACTOBJ('CHPOINT ',IPCH2,1)
  164. CALL ECROBJ('CHPOINT ',IPCH2)
  165. RETURN
  166.  
  167.  
  168. C ---------------------------------------------
  169. C CAS D'UN OBJET MCHAML
  170. C ---------------------------------------------
  171. 100 CONTINUE
  172. CALL LIROBJ('MCHAML ',ICHE1,0,IRT3)
  173. IF(IRT3.EQ.0) GO TO 300
  174. CALL ACTOBJ('MCHAML ',ICHE1,1)
  175. CALL LIRCHA(MOT2,0,IRETOU)
  176. IF(IRETOU.EQ.0) MOT2=MOT
  177. IF (LISM1.EQ.0) THEN
  178. C Syntaxe 1 (avec des MOTs simples)
  179. CALL EXCOC1(ICHE1,MOT,ICHE2,MOT2,NOID)
  180. IF(IERR.NE.0) RETURN
  181. ELSE
  182. C Syntaxe 2 (avec des LISTMOTS)
  183. MLMOTS=LISM1
  184. SEGACT MLMOTS
  185.  
  186. C Erreur si les deux LISTMOTS ne sont pas de meme dimension
  187. IF (LISM2.NE.0) THEN
  188. MLMOT2=LISM2
  189. SEGACT,MLMOT2
  190. IF (MOTS(/2).NE.MLMOT2.MOTS(/2)) THEN
  191. CALL ERREUR(217)
  192. RETURN
  193. ENDIF
  194.  
  195. ELSE
  196. MLMOT2 = MLMOTS
  197. ENDIF
  198.  
  199. C Si le premier LISTMOTS est vide
  200. IF (MOTS(/2).EQ.0) THEN
  201. N1=0
  202. N3=0
  203. L1=8
  204.  
  205. SEGINI,MCHELM
  206. ICHE2 =MCHELM
  207. IFOCHE=IFOMOD
  208. TITCHE=' '
  209.  
  210. C On place un soucis avec le numero de l'erreur qu'on pourrait emettre
  211. MOTERR(1:8)='LISTMOTS'
  212. INTERR(1)=MLMOTS
  213. CALL SOUCIS(356)
  214.  
  215. ELSE
  216. CALL EXCOC2(ICHE1,MLMOTS,ICHE2,MLMOT2,NOID)
  217. ENDIF
  218. ENDIF
  219.  
  220. C On ecrit le MCHAML resultat dans la pile
  221. CALL ACTOBJ('MCHAML ',ICHE2,1)
  222. CALL ECROBJ('MCHAML ',ICHE2)
  223. RETURN
  224. C
  225. C PAS D OPERANDE CORRECTE TROUVE
  226. C
  227. 300 CALL QUETYP(MOTERR(1:8),0,IRETOU)
  228. IF(IRETOU.NE.0) THEN
  229. CALL ERREUR (39)
  230. ELSE
  231. CALL ERREUR(533)
  232. ENDIF
  233. END
  234.  
  235.  
  236.  
  237.  

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