Télécharger opobje.eso

Retour à la liste

Numérotation des lignes :

opobje
  1. C OPOBJE SOURCE CB215821 23/10/18 21:15:09 11760
  2. SUBROUTINE OPOBJE(IOPERA)
  3. C----------------------------------------------------------------------C
  4. C Cette source permet de faire les opérations elementaires sur
  5. C les OBJETS suivants :
  6. C - MCHAML
  7. C - CHPOINT
  8. C - LISTREEL
  9. C - FLOTTANT
  10. C - EVOLUTION (travail effectue sur les ordonnees seulement)
  11. C Nouveau 2014 ==> Certaines fonctions ne le geraient pas
  12. C - LISTENTI (Nouveau 2014 ==> Renvoie un LISTREEL sauf pour ABS)
  13. C - ENTIER (Nouveau 2014 ==> Renvoie un FLOTTANT sauf pour ABS)
  14. C
  15. C
  16. C ENTREE
  17. C Operations elementaires entre les OBJETS et un ENTIER ou FLOTTANT
  18. C IOPERA= 1 PUISSANCE
  19. C = 2 PRODUIT
  20. C = 3 ADDITION
  21. C = 4 SOUSTRACTION
  22. C = 5 DIVISION
  23. C
  24. C Fonctions sur les OBJETS
  25. C IOPERA= 6 COSINUS
  26. C = 7 SINUS
  27. C = 8 TANGENTE
  28. C = 9 ARCOSINUS
  29. C = 10 ARCSINUS
  30. C = 11 ARCTANGENTE
  31. C = 12 EXPONENTIELLE
  32. C = 13 LOGARITHME
  33. C = 14 VALEUR ABSOLUE
  34. C = 15 COSINUS HYPERBOLIQUE
  35. C = 16 SINUS HYPERBOLIQUE
  36. C = 17 TANGENTE HYPERBOLIQUE
  37. C = 18 ERF FONCTION D''ERRREUR DE GAUSS
  38. C = 19 ERFC FONCTION D''ERRREUR complementaire DE GAUSS (1-erf(x))
  39. C = 20 ARGCH (Fonction reciproque de COSH)
  40. C = 21 ARGSH (Fonction reciproque de SINH)
  41. C = 22 ARGTH (Fonction reciproque de TANH)
  42. C = 23 SIGN (renvoie -1 ou +1, resultat du meme type)
  43. C = 24 BESSEL J0
  44. C = 25 BESSEL J1
  45. C = 26 BESSEL Y0
  46. C = 27 BESSEL Y1
  47. C = 28 FRESNEL CX
  48. C = 29 FRESNEL SX
  49. C = 30 GAMMA (Fonction Gamma d'Euler)
  50. C = 31 BESSEL JN
  51. C = 32 BESSEL YN
  52. C
  53. C IARGU = 0 ==> ARGUMENT I1 ET FLO INUTILISES
  54. C IARGU = 1 ==> ARGUMENT I1 UTILISE
  55. C IARGU = 11 ==> ARGUMENT I1 UTILISE MAIS COMMUTE AVEC LE TABLEAU (SOUSTRACTION, DIVISION : POSITIONNEL)
  56. C IARGU = 2 ==> ARGUMENT FLO UTILISE
  57. C IARGU = 21 ==> ARGUMENT FLO UTILISE MAIS COMMUTE AVEC LE TABLEAU (SOUSTRACTION, DIVISION : POSITIONNEL)
  58. C
  59. C HISTORIQUE :
  60. C - CB215821 24/07/2014 --> Remise en conformite
  61. C - CB215821 10/12/2015 --> Parallelisation des operations sur les CHPOINTS
  62. C - CB215821 31/08/2016 --> Mise a jour des Commentaires
  63. C - CB215821 05/06/2018 --> Ajout de la fonction SIGN a un argument
  64. C - CB215821 17/10/2023 --> Ajout des fonctions BESSEL, FRESNEL et GAMMA
  65. C----------------------------------------------------------------------C
  66.  
  67. IMPLICIT INTEGER(I-N)
  68. IMPLICIT REAL*8 (A-H,O-Z)
  69.  
  70. PARAMETER (NCLEVO = 2)
  71. CHARACTER*4 CLEVO(NCLEVO)
  72. DATA CLEVO/'ABSC','ORDO'/
  73.  
  74. LOGICAL BATAN2
  75.  
  76. INTEGER IPO1,IPO2,IR1,IR2,IOUT,IOPERA
  77. INTEGER IARGU,I1,IRET
  78.  
  79. REAL*8 XR,XR1,XR2,XOUT,FLO
  80. REAL*8 XVAL(3)
  81.  
  82.  
  83.  
  84. C-INC CCREEL
  85.  
  86. -INC PPARAM
  87. -INC CCOPTIO
  88. -INC SMLREEL
  89. -INC SMLENTI
  90.  
  91. BATAN2 = .FALSE.
  92.  
  93. IRET = 0
  94. IPO1 = 0
  95. IPO2 = 0
  96. IOUT = 0
  97. IR1 = 0
  98. IR2 = 0
  99. XR = REAL(0.D0)
  100. XR1 = REAL(0.D0)
  101. XR2 = REAL(0.D0)
  102. XOUT = REAL(0.D0)
  103.  
  104. C IARGU = 0 pour ignorer I1 et FLO
  105. IARGU = 0
  106. I1 = 0
  107. FLO = REAL(0.D0)
  108.  
  109.  
  110. C Cas des fonctions de Bessel JN et YN
  111. IF(IOPERA.EQ.31 .OR. IOPERA.EQ.32)THEN
  112. C Lecture obligatoire d'un 'ENTIER' pour l'ordre
  113. CALL LIRENT(I1,1,IRETOU)
  114. IF(IERR .NE. 0)RETURN
  115. IARGU = 1
  116. ENDIF
  117.  
  118. C
  119. C CAS DU MCHAML
  120. CALL LIROBJ('MCHAML ',IPO1,0,IRETOU)
  121. IF (IRETOU.EQ.0) GOTO 10
  122. CALL ACTOBJ('MCHAML ',IPO1,1)
  123. CALL LIROBJ('MCHAML ',IPO2,0,IRETOU)
  124. IF(IRETOU .NE. 0) CALL ACTOBJ('MCHAML ',IPO2,1)
  125. CALL OPCHE1(IPO1,IOPERA,IARGU,I1,FLO,IPO2,IRET)
  126. IF(IRET .EQ. 1) THEN
  127. CALL ACTOBJ('MCHAML ',IPO2,1)
  128. CALL ECROBJ('MCHAML ',IPO2)
  129. ELSE
  130. CALL ERREUR(26)
  131. ENDIF
  132. RETURN
  133. C
  134. C CAS DU CHPOINT
  135. 10 CONTINUE
  136. CALL LIROBJ('CHPOINT ',IPO1,0,IRETOU)
  137. IF(IRETOU.EQ.0) GOTO 20
  138. CALL ACTOBJ('CHPOINT ',IPO1,1)
  139. CALL LIROBJ('CHPOINT',IPO2,0,IRETOU)
  140. IF (IRETOU.NE.0) THEN
  141. CALL ACTOBJ('CHPOINT ',IPO2,1)
  142. C Pour l'instant l'ATAN2 a 2 arguments est realisee en Sequentiel...
  143. CALL OPCHPO(IPO1,IOPERA,IPO2)
  144. ELSE
  145. CALL OPCHP1(IPO1,IOPERA,IARGU,I1,FLO,IPO2,IRET)
  146. IF(IRET .EQ. 0) THEN
  147. CALL ERREUR(26)
  148. RETURN
  149. ENDIF
  150. ENDIF
  151. CALL ACTOBJ('CHPOINT ',IPO2,1)
  152. CALL ECROBJ('CHPOINT ',IPO2)
  153. RETURN
  154. C
  155. C CAS D''UN LISTREEL
  156. 20 CONTINUE
  157. CALL LIROBJ('LISTREEL',IPO1,0,IRETOU)
  158. IF(IRETOU.EQ.0) GOTO 25
  159. MLREEL=IPO1
  160. SEGACT,MLREEL
  161. CALL LIROBJ('LISTREEL',IPO2,0,IRETOU)
  162. IF(IRETOU .NE. 0)THEN
  163. MLREEL=IPO2
  164. SEGACT,MLREEL
  165. ENDIF
  166. CALL OPLRE1(IPO1,IOPERA,IARGU,I1,FLO,IPO2,IRET)
  167. IF(IRET .EQ. 0) THEN
  168. CALL ERREUR(26)
  169. RETURN
  170. ENDIF
  171. MLREEL=IPO2
  172. SEGACT,MLREEL
  173. CALL ECROBJ('LISTREEL',IPO2)
  174. RETURN
  175. C
  176. C CAS D''UN ENTIER
  177. 25 CONTINUE
  178. CALL LIRENT(IR1,0,IRETOU)
  179. IF(IRETOU.EQ.0) GO TO 30
  180. IF (IOPERA .EQ. 11) THEN
  181. CALL LIRENT(IR2,0,IRETO2)
  182. IF(IRETO2.NE.0) THEN
  183. BATAN2 = .TRUE.
  184. ELSE
  185. IR2 = 0.D0
  186. ENDIF
  187. ENDIF
  188.  
  189. CALL OPENTI(IR1,IR2,BATAN2,IOPERA,IOUT,XOUT)
  190.  
  191. C Resultat ENTIER attendu pour ABS (IOPERA = 14 OU 23)
  192. IF (IOPERA .EQ. 14 .OR. IOPERA .EQ. 23) THEN
  193. CALL ECRENT(IOUT)
  194. ELSE
  195. CALL ECRREE(XOUT)
  196. ENDIF
  197. RETURN
  198. C
  199. C CAS D''UN FLOTTANT
  200. 30 CONTINUE
  201. CALL LIRREE(XR1,0,IRETOU)
  202. IF(IRETOU.EQ.0) GO TO 40
  203.  
  204. NN0 = 1
  205. NTABEN = 1
  206. XVAL(1)= XR1
  207. IF (IOPERA .EQ. 11) THEN
  208. C Cas de ARCTANGENTE : on essaye de lire un deuxieme argument ==> ATAN
  209. CALL LIRREE(XR2,0,IRETO2)
  210. IF(IRETO2 .NE. 0)THEN
  211. NTABEN = 2
  212. XVAL(2)= XR2
  213. ENDIF
  214. ENDIF
  215.  
  216. CALL OPTABJ(1 ,0,IOPERA,NTABEN,
  217. & XVAL(1),XVAL(2),XVAL(3),
  218. & NN0 ,NN0 ,NN0 ,0 ,0 ,0.D0 ,IRETOU)
  219.  
  220. CALL ECRREE(XVAL(3))
  221. RETURN
  222.  
  223. C EVOLUTION
  224. 40 CONTINUE
  225. CALL LIROBJ('EVOLUTIO',IPO1,0,IRETOU)
  226. IF (IRETOU.EQ.0) GO TO 50
  227. CALL ACTOBJ('EVOLUTIO',IPO1,1)
  228. C Pas tres clair de donner 2 arguments pour ATAN avec des EVOLUTIONS
  229. C Du coup un seul sera accepté
  230. C IF (IOPERA .EQ. 11) CALL LIROBJ('EVOLUTIO',IPO2,0,IRETOU)
  231. ICLE = 0
  232. CALL LIRMOT(CLEVO,NCLEVO,ICLE,0)
  233. IF (ICLE.EQ.0) ICLE = 2
  234. CALL OPEVO1(IPO1,IOPERA,IARGU,ICLE,I1,FLO,IPO2,IRET)
  235. IF(IRET .EQ. 0) THEN
  236. CALL ERREUR(26)
  237. RETURN
  238. ENDIF
  239. CALL ACTOBJ('EVOLUTIO',IPO2,1)
  240. CALL ECROBJ('EVOLUTIO',IPO2)
  241. RETURN
  242. C
  243. C CAS D''UN LISTENTI
  244. 50 CONTINUE
  245. CALL LIROBJ('LISTENTI',IPO1,0,IRETOU)
  246. IF(IRETOU.EQ.0) GOTO 60
  247. MLENTI=IPO1
  248. SEGACT,MLENTI
  249. IF (IOPERA .EQ. 11) THEN
  250. CALL LIROBJ('LISTENTI',IPO2,0,IRETOU)
  251. IF(IRETOU .NE. 0) THEN
  252. MLENTI=IPO2
  253. SEGACT,MLENTI
  254. ENDIF
  255. ENDIF
  256. CALL OPLENT(IPO1,IOPERA,IPO2)
  257. C Resultat LISTENTI attendu pour ABS (IOPERA = 14 OU 23)
  258. IF (IOPERA .EQ. 14 .OR. IOPERA .EQ. 23) THEN
  259. MLENTI=IPO2
  260. SEGACT,MLENTI
  261. CALL ECROBJ('LISTENTI',IPO2)
  262. ELSE
  263. MLREEL=IPO2
  264. SEGACT,MLREEL
  265. CALL ECROBJ('LISTREEL',IPO2)
  266. ENDIF
  267. RETURN
  268. C
  269. C PAS D''OPERANDE CORRECTE TROUVE
  270. 60 CALL QUETYP(MOTERR(1:8),0,IRETOU)
  271. IF(IRETOU.NE.0) THEN
  272. CALL ERREUR (39)
  273. ELSE
  274. CALL ERREUR(533)
  275. ENDIF
  276.  
  277. END
  278.  
  279.  
  280.  
  281.  
  282.  

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