Télécharger opnua1.eso

Retour à la liste

Numérotation des lignes :

opnua1
  1. C OPNUA1 SOURCE PASCAL 22/11/21 21:15:06 11502
  2. SUBROUTINE OPNUA1(IPO1,IOPERA,IARGU,COMP,I1,X1,IPO2,IRET)
  3. C=======================================================================
  4. C
  5. C ENTREES
  6. C IPO1 = POINTEUR SUR LE NUAGE
  7. C I1 = ENTIER
  8. C X1 = FLOTTANT
  9. C
  10. C
  11. C /!\ **** OPERATIONS PAS DISPONIBLES POUR TOUS LES TYPES DE COMPOSANTES
  12. C /!\ **** VOIR NOTICES
  13. C
  14. C Operations elementaires entre un NUAGE et un ENTIER ou FLOTTANT
  15. C IOPERA= 1 PUISSANCE
  16. C = 2 PRODUIT
  17. C = 3 ADDITION
  18. C = 4 SOUSTRACTION
  19. C = 5 DIVISION
  20. C
  21. C Fonctions sur un NUAGE
  22. C IOPERA= 6 COSINUS
  23. C = 7 SINUS
  24. C = 8 TANGENTE
  25. C = 9 ARCOSINUS
  26. C = 10 ARCSINUS
  27. C = 11 ARCTANGENTE (ATAN A UN ARGUMENT)
  28. C = 12 EXPONENTIELLE
  29. C = 13 LOGARITHME
  30. C = 14 VALEUR ABSOLUE
  31. C = 15 COSINUS HYPERBOLIQUE
  32. C = 16 SINUS HYPERBOLIQUE
  33. C = 17 TANGENTE HYPERBOLIQUE
  34. C = 18 ERF FONCTION D''ERRREUR DE GAUSS
  35. C = 19 ERFC FONCTION D''ERRREUR complementaire DE GAUSS (1-ERF(X))
  36. C = 20 ARGCH (FONCTION RECIPROQUE DE COSH)
  37. C = 21 ARGSH (FONCTION RECIPROQUE DE SINH)
  38. C = 22 ARGTH (FONCTION RECIPROQUE DE TANH)
  39. C = 23 SIGN (renvoie -1 ou +1, resultat du meme type)
  40. C
  41. C IARGU = 0 ==> ARGUMENT I1I ET X1I INUTILISES
  42. C IARGU = 1 ==> ARGUMENT I1I UTILISE
  43. C IARGU = 11 ==> ARGUMENT I1I UTILISE MAIS COMMUTE AVEC LE TABLEAU (SOUSTRACTION, DIVISION : POSITIONNEL)
  44. C IARGU = 2 ==> ARGUMENT X1I UTILISE
  45. C IARGU = 21 ==> ARGUMENT X1I UTILISE MAIS COMMUTE AVEC LE TABLEAU (SOUSTRACTION, DIVISION : POSITIONNEL)
  46. C
  47. C COMP = NOM DE LA COMPOSANTE SUR LAQUELLE ON EFFECTUE L'OPERATION
  48. C
  49. C SORTIES
  50. C IPO2 = NUAGE SOLUTION
  51. C IRET = 1 SI L OPERATION EST POSSIBLE
  52. C = 0 SI L OPERATION EST IMPOSSIBLE
  53. C
  54. C HISTORIQUE :
  55. C - SP204843 18/11/2022 --> Creation
  56. C
  57. C=======================================================================
  58.  
  59. IMPLICIT INTEGER(I-N)
  60. IMPLICIT REAL*8 (A-H,O-Z)
  61.  
  62. -INC PPARAM
  63. -INC CCOPTIO
  64. -INC SMNUAGE
  65. -INC SMEVOLL
  66. -INC SMLREEL
  67. -INC SMLENTI
  68. -INC SMLMOTS
  69. -INC CCREEL
  70.  
  71. PARAMETER (NTYP=7,NCLEVO=2)
  72. CHARACTER*8 CTYP,COMP,MTYP(NTYP)
  73. CHARACTER*4 CLEVO(NCLEVO)
  74.  
  75. C DATA DES TYPES DE DONNEES COMPATIBLES AVEC OPERATION
  76. DATA MTYP/'ENTIER ','FLOTTANT','LISTENTI','LISTREEL','EVOLUTIO',
  77. & 'CHPOINT ','MCHAML '/
  78.  
  79. C MOTS-CLE POUR OPERATION CUR COMPOSANTES TYPE EVOLUTION
  80. DATA CLEVO/'ABSC','ORDO'/
  81.  
  82.  
  83. C Segment quelconque pour la desactivation des segements
  84. SEGMENT ISEG(0)
  85.  
  86. C Code retour
  87. IRET = 0
  88.  
  89. C======================================================================C
  90. C Activation des SEGMENTS
  91. C======================================================================C
  92. MNUAG1=IPO1
  93.  
  94. SEGINI,MNUAGE=MNUAG1
  95. IPO2 = MNUAGE
  96.  
  97. N=MNUAG1.NUANOM(/2)
  98. IF (N .EQ. 0)THEN
  99. C Cas de le NUAGE vide
  100. IRET = 1
  101. RETURN
  102. ENDIF
  103.  
  104. C==== VERIFICATIONS SUR LA COMPOSANTE
  105. C
  106. C EST-ELLE BIEN DANS LE NUAGE ?
  107. ICP1 = 0
  108. DO 10 IA1=1,N
  109. IF (MNUAG1.NUANOM(IA1).EQ.COMP) THEN
  110. ICP1 = IA1
  111. GOTO 11
  112. ENDIF
  113. 10 CONTINUE
  114. MOTERR(1:8) = COMP
  115. INTERR(1) = MNUAG1
  116. CALL ERREUR(644)
  117. RETURN
  118.  
  119. 11 CONTINUE
  120. C SON TYPE EST-IL COMPATIBLE AVEC OPERATION
  121. CTYP = MNUAG1.NUATYP(ICP1)
  122. CALL PLACE(MTYP,NTYP,IPLA,CTYP)
  123. IF (IPLA.EQ.0) THEN
  124. CALL ERREUR(21)
  125. RETURN
  126. ENDIF
  127.  
  128. C QUELQUES VERIFICATIONS SUPLLEMENTAIRES SUR LES TYPES
  129. C NUAGE D'ENTIERS (ou LISTENTI) OPER FLOTTANT => ERREUR
  130. IF ((IPLA.EQ.1.OR.IPLA.EQ.3).AND.(IARGU.EQ.2.OR.IARGU.EQ.21)) THEN
  131. CALL ERREUR(8)
  132. RETURN
  133. ENDIF
  134.  
  135. C BRANCHEMENT DE L'OPERATION EN FONCTION DU TYPE DE LA COMPOSANTE
  136. GOTO (100,200,300,400,500,600,700),IPLA
  137. CALL ERREUR(5)
  138. RETURN
  139.  
  140. C----------------------------------------------------------------------C
  141. C COMPOSANTE DE TYPE ENTIER
  142. C----------------------------------------------------------------------C
  143. 100 CONTINUE
  144. NUAVI1 = MNUAG1.NUAPOI(ICP1)
  145. NBCOUP = NUAVI1.NUAINT(/1)
  146. SEGINI,NUAVIN
  147. I2 = I1
  148. IF (IOPERA.EQ.4.AND.IARGU.EQ.1) I2 = -1*I2
  149.  
  150. C---------- NUA1 +/- ENT1 :
  151.  
  152. IF (IOPERA.EQ.3.OR.(IOPERA.EQ.4.AND.IARGU.EQ.1)) THEN
  153. DO 101 IA1=1,NBCOUP
  154. NUAVIN.NUAINT(IA1) = NUAVI1.NUAINT(IA1)+I2
  155. 101 CONTINUE
  156.  
  157. C---------- ENT1 - NUA1 :
  158.  
  159. ELSEIF (IOPERA.EQ.4.AND.IARGU.EQ.11) THEN
  160. DO 102 IA1=1,NBCOUP
  161. NUAVIN.NUAINT(IA1) = I2-NUAVI1.NUAINT(IA1)
  162. 102 CONTINUE
  163.  
  164. C---------- ENT1 * NUA1 :
  165.  
  166. ELSEIF (IOPERA.EQ.2) THEN
  167. DO 103 IA1=1,NBCOUP
  168. NUAVIN.NUAINT(IA1) = I2*NUAVI1.NUAINT(IA1)
  169. 103 CONTINUE
  170.  
  171. C---------- NUA1 / ENT1 :
  172.  
  173. ELSEIF (IOPERA.EQ.5.AND.IARGU.EQ.1) THEN
  174. DO 104 IA1=1,NBCOUP
  175. NUAVIN.NUAINT(IA1) = NUAVI1.NUAINT(IA1)/I2
  176. 104 CONTINUE
  177.  
  178. C---------- ENT1 / NUA1 :
  179.  
  180. ELSEIF (IOPERA.EQ.5.AND.IARGU.EQ.11) THEN
  181. DO 105 IA1=1,NBCOUP
  182. IF (NUAVI1.NUAINT(IA1).EQ.0) GOTO 190
  183. NUAVIN.NUAINT(IA1) = I2/NUAVI1.NUAINT(IA1)
  184. 105 CONTINUE
  185.  
  186. C---------- NUA1 ** ENT1 :
  187.  
  188. ELSEIF (IOPERA.EQ.1.AND.IARGU.EQ.1) THEN
  189. DO 106 IA1=1,NBCOUP
  190. IF (I2.EQ.0) THEN
  191. NUAVIN.NUAINT(IA1) = 1
  192. ELSE
  193. IF ((NUAVI1.NUAINT(IA1).EQ.0).AND.I2.LT.0) GOTO 190
  194. NUAVIN.NUAINT(IA1) = NUAVI1.NUAINT(IA1)**I2
  195. ENDIF
  196. 106 CONTINUE
  197.  
  198. C---------- ENT1 ** NUA1 :
  199.  
  200. ELSEIF (IOPERA.EQ.1.AND.IARGU.EQ.11) THEN
  201. DO 107 IA1=1,NBCOUP
  202. IF (NUAVI1.NUAINT(IA1).EQ.0) THEN
  203. NUAVIN.NUAINT(IA1) = 1
  204. ELSE
  205. IF (I2.EQ.0.AND.(NUAVI1.NUAINT(IA1).LT.0)) GOTO 190
  206. NUAVIN.NUAINT(IA1) = I2**NUAVI1.NUAINT(IA1)
  207. ENDIF
  208. 107 CONTINUE
  209.  
  210. C---------- Operations non encore traitees :
  211. ELSE
  212. CALL ERREUR(251)
  213. RETURN
  214.  
  215. ENDIF
  216. MNUAGE.NUAPOI(ICP1) = NUAVIN
  217. IRET = 1
  218. RETURN
  219.  
  220. C DIVISION PAR 0
  221. 190 CONTINUE
  222. CALL ERREUR(835)
  223. RETURN
  224.  
  225. C----------------------------------------------------------------------C
  226. C COMPOSANTE DE TYPE FLOTTANT
  227. C----------------------------------------------------------------------C
  228. 200 CONTINUE
  229. NUAVF1 = MNUAG1.NUAPOI(ICP1)
  230. NBCOUP = NUAVF1.NUAFLO(/1)
  231. SEGINI,NUAVFL
  232.  
  233. C SI OPERATION AVEC NUAGE REELS ET ENTIER, ON CONVERTIT L'ENTIER
  234. C SAUF SI EXPOSANT OPERATION PUISSANCE
  235. IF (IARGU.EQ.1.AND.IOPERA.NE.1) THEN
  236. X1 = REAL(I1)
  237. IARGU = 2
  238. ENDIF
  239. IF (IARGU.EQ.11) THEN
  240. X1 = REAL(I1)
  241. IARGU = 21
  242. ENDIF
  243. X2 = X1
  244. IF (IOPERA.EQ.4.AND.IARGU.EQ.2) X2 = -1*X2
  245.  
  246. C---------- NUA1 +/- FLOT1 :
  247.  
  248. IF (IOPERA.EQ.3.OR.(IOPERA.EQ.4.AND.IARGU.EQ.2)) THEN
  249. DO 201 IA1=1,NBCOUP
  250. NUAVFL.NUAFLO(IA1) = NUAVF1.NUAFLO(IA1)+X2
  251. 201 CONTINUE
  252.  
  253. C---------- FLOT1 - NUA1 :
  254.  
  255. ELSEIF (IOPERA.EQ.4.AND.IARGU.EQ.21) THEN
  256. DO 202 IA1=1,NBCOUP
  257. NUAVFL.NUAFLO(IA1) = X2-NUAVF1.NUAFLO(IA1)
  258. 202 CONTINUE
  259.  
  260. C---------- FLOT1 * NUA1 :
  261.  
  262. ELSEIF (IOPERA.EQ.2) THEN
  263. DO 203 IA1=1,NBCOUP
  264. NUAVFL.NUAFLO(IA1) = X2*NUAVF1.NUAFLO(IA1)
  265. 203 CONTINUE
  266.  
  267. C---------- NUA1 / FLOT1 :
  268.  
  269. ELSEIF (IOPERA.EQ.5.AND.IARGU.EQ.2) THEN
  270. DO 204 IA1=1,NBCOUP
  271. NUAVFL.NUAFLO(IA1) = NUAVF1.NUAFLO(IA1)/X2
  272. 204 CONTINUE
  273.  
  274. C---------- FLOT1 / NUA1 :
  275.  
  276. ELSEIF (IOPERA.EQ.5.AND.IARGU.EQ.21) THEN
  277. DO 205 IA1=1,NBCOUP
  278. XVNUA1 = NUAVF1.NUAFLO(IA1)
  279. IF (ABS(XVNUA1).LT.XPETIT) GOTO 290
  280. NUAVFL.NUAFLO(IA1) = X2/XVNUA1
  281. 205 CONTINUE
  282.  
  283. C---------- NUA1 ** ENT1 :
  284.  
  285. ELSEIF (IOPERA.EQ.1.AND.IARGU.EQ.1) THEN
  286. DO 206 IA1=1,NBCOUP
  287. NUAVFL.NUAFLO(IA1) = NUAVF1.NUAFLO(IA1)**I1
  288. 206 CONTINUE
  289.  
  290. C---------- NUA1 ** FLOT1 :
  291.  
  292. ELSEIF (IOPERA.EQ.1.AND.IARGU.EQ.2) THEN
  293. C Le calcul de la puissance est repris de operpu, FLOT1**FLOT2
  294. DO 207 IA1=1,NBCOUP
  295. XVNUA1 = NUAVF1.NUAFLO(IA1)
  296. IF (ABS(XVNUA1).LT.XPETIT.AND.X2.LT.REAL(0.D0)) THEN
  297. REAERR(1)=XVNUA1
  298. REAERR(2)=X2
  299. MOTERR(1:4)=' ** '
  300. CALL ERREUR(1062)
  301. RETURN
  302. ELSE
  303. I2 = NINT(X2)
  304. XFLOT = ABS(X2 - REAL(I2))
  305. IF (XFLOT.LE.(XZPREC*ABS(X2)*REAL(2.D0))) THEN
  306. NUAVFL.NUAFLO(IA1) = XVNUA1**I2
  307. ELSEIF (XVNUA1.LT.REAL(0.D0)) THEN
  308. REAERR(1)=XVNUA1
  309. REAERR(2)=X2
  310. MOTERR(1:4)=' ** '
  311. CALL ERREUR(1062)
  312. RETURN
  313. ELSE
  314. NUAVFL.NUAFLO(IA1) = XVNUA1**X2
  315. ENDIF
  316. ENDIF
  317. 207 CONTINUE
  318.  
  319. C---------- FLOT1 ** NUA1 :
  320.  
  321. ELSEIF (IOPERA.EQ.1.AND.IARGU.EQ.21) THEN
  322. C Le calcul de la puissance est repris de operpu, FLOT1**FLOT2
  323. DO 208 IA1=1,NBCOUP
  324. XVNUA1 = NUAVF1.NUAFLO(IA1)
  325. IF (ABS(X2).LT.XPETIT.AND.XVNUA1.LT.REAL(0.D0)) THEN
  326. REAERR(1)=X2
  327. REAERR(2)=XVNUA1
  328. MOTERR(1:4)=' ** '
  329. CALL ERREUR(1062)
  330. RETURN
  331. ELSE
  332. I2 = NINT(XVNUA1)
  333. XFLOT = ABS(XVNUA1 - REAL(I2))
  334. IF (XFLOT.LE.(XZPREC*ABS(XVNUA1)*REAL(2.D0))) THEN
  335. NUAVFL.NUAFLO(IA1) = X2**I2
  336. ELSEIF (X2.LT.REAL(0.D0))THEN
  337. REAERR(1)=X2
  338. REAERR(2)=XVNUA1
  339. MOTERR(1:4)=' ** '
  340. CALL ERREUR(1062)
  341. RETURN
  342. ELSE
  343. NUAVFL.NUAFLO(IA1) = X2**XVNUA1
  344. ENDIF
  345. ENDIF
  346. 208 CONTINUE
  347.  
  348. C---------- Operations non encore traitees :
  349. ELSE
  350. CALL ERREUR(251)
  351. RETURN
  352.  
  353. ENDIF
  354. MNUAGE.NUAPOI(ICP1) = NUAVFL
  355. IRET = 1
  356. RETURN
  357.  
  358. C ERREUR DIVISION PAR 0.
  359. 290 CONTINUE
  360. CALL ERREUR(835)
  361. RETURN
  362.  
  363. C----------------------------------------------------------------------C
  364. C COMPOSANTE DE TYPE LISTENTI
  365. C----------------------------------------------------------------------C
  366. 300 CONTINUE
  367. CALL ERREUR(251)
  368. RETURN
  369.  
  370. C----------------------------------------------------------------------C
  371. C COMPOSANTE DE TYPE LISTREEL
  372. C----------------------------------------------------------------------C
  373. 400 CONTINUE
  374. CALL ERREUR(251)
  375. RETURN
  376.  
  377. C----------------------------------------------------------------------C
  378. C COMPOSANTE DE TYPE EVOLUTION
  379. C----------------------------------------------------------------------C
  380. 500 CONTINUE
  381. NUAVI1 = MNUAG1.NUAPOI(ICP1)
  382. NBCOUP = NUAVI1.NUAINT(/1)
  383. SEGINI,NUAVIN
  384. C Lecture du mot ABSC ou ORDO
  385. ICLE = 0
  386. CALL LIRMOT(CLEVO,NCLEVO,ICLE,0)
  387. IF (ICLE.EQ.0) ICLE = 2
  388. DO 501 IA1=1,NBCOUP
  389. ICH = NUAVI1.NUAINT(IA1)
  390. CALL OPEVO1(ICH,IOPERA,IARGU,ICLE,I1,X1,ICHR,IRET)
  391. IF (IRET.EQ.0) GOTO 590
  392. NUAVIN.NUAINT(IA1) = ICHR
  393. 501 CONTINUE
  394. MNUAGE.NUAPOI(ICP1) = NUAVIN
  395. IRET = 1
  396. RETURN
  397.  
  398. 590 CONTINUE
  399. CALL ERREUR(26)
  400. RETURN
  401.  
  402. C----------------------------------------------------------------------C
  403. C COMPOSANTE DE TYPE CHPOINT
  404. C----------------------------------------------------------------------C
  405. 600 CONTINUE
  406. CALL ERREUR(251)
  407. RETURN
  408.  
  409. C----------------------------------------------------------------------C
  410. C COMPOSANTE DE TYPE MCHALM
  411. C----------------------------------------------------------------------C
  412. 700 CONTINUE
  413. CALL ERREUR(251)
  414. RETURN
  415.  
  416. END
  417.  
  418.  

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