Télécharger opevo1.eso

Retour à la liste

Numérotation des lignes :

opevo1
  1. C OPEVO1 SOURCE PASCAL 22/07/13 21:15:08 11409
  2. SUBROUTINE OPEVO1(IPO1,IOPERA,IARGU,ICLE,I1,X1,IPO2,IRET)
  3. C=======================================================================
  4. C
  5. C ENTREES
  6. C IPO1 = POINTEUR SUR LE EVOLUTIO
  7. C I1 = ENTIER
  8. C X1 = FLOTTANT
  9. C
  10. C
  11. C Operations elementaires entre un EVOLUTIO et un ENTIER ou FLOTTANT
  12. C IOPERA= 1 PUISSANCE
  13. C = 2 PRODUIT
  14. C = 3 ADDITION
  15. C = 4 SOUSTRACTION
  16. C = 5 DIVISION
  17. C
  18. C Fonctions sur un EVOLUTIO
  19. C IOPERA= 6 COSINUS
  20. C = 7 SINUS
  21. C = 8 TANGENTE
  22. C = 9 ARCOSINUS
  23. C = 10 ARCSINUS
  24. C = 11 ARCTANGENTE (ATAN A UN ARGUMENT)
  25. C = 12 EXPONENTIELLE
  26. C = 13 LOGARITHME
  27. C = 14 VALEUR ABSOLUE
  28. C = 15 COSINUS HYPERBOLIQUE
  29. C = 16 SINUS HYPERBOLIQUE
  30. C = 17 TANGENTE HYPERBOLIQUE
  31. C = 18 ERF FONCTION D''ERRREUR DE GAUSS
  32. C = 19 ERFC FONCTION D''ERRREUR complementaire DE GAUSS (1-ERF(X))
  33. C = 20 ARGCH (FONCTION RECIPROQUE DE COSH)
  34. C = 21 ARGSH (FONCTION RECIPROQUE DE SINH)
  35. C = 22 ARGTH (FONCTION RECIPROQUE DE TANH)
  36. C = 23 SIGN (renvoie -1 ou +1, resultat du meme type)
  37. C
  38. C IARGU = 0 ==> ARGUMENT I1I ET X1I INUTILISES
  39. C IARGU = 1 ==> ARGUMENT I1I UTILISE
  40. C IARGU = 11 ==> ARGUMENT I1I UTILISE MAIS COMMUTE AVEC LE TABLEAU (SOUSTRACTION, DIVISION : POSITIONNEL)
  41. C IARGU = 2 ==> ARGUMENT X1I UTILISE
  42. C IARGU = 21 ==> ARGUMENT X1I UTILISE MAIS COMMUTE AVEC LE TABLEAU (SOUSTRACTION, DIVISION : POSITIONNEL)
  43. C
  44. C ICLE = 1 operation sur les abscisses
  45. C ICLE = 2 operation sur les ordonnees (defaut)
  46. C
  47. C SORTIES
  48. C IPO2 = EVOLUTIO SOLUTION
  49. C IRET = 1 SI L OPERATION EST POSSIBLE
  50. C = 0 SI L OPERATION EST IMPOSSIBLE
  51. C
  52. C HISTORIQUE :
  53. C - CB215821 07/12/2015 --> Creation
  54. C - CB215821 01/09/2016 --> Ajout de l''include TMVALUE
  55. C - CB215821 05/06/2018 --> Ajout de la fonction SIGN a un argument
  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 SMEVOLL
  65. -INC SMLREEL
  66. -INC SMLENTI
  67. -INC SMLMOTS
  68. -INC CCASSIS
  69. -INC TMVALUE
  70.  
  71. CHARACTER*8 CTYP
  72.  
  73. C Segment quelconque pour la desactivation des segements
  74. SEGMENT ISEG(0)
  75.  
  76. EXTERNAL OPTABi
  77. LOGICAL BTHRD
  78.  
  79. C Pour afficher les lignes gibianes appelees decommenter le CALL
  80. C CALL TRBAC
  81.  
  82. C======================================================================C
  83. C Activation des SEGMENTS pour placer les LISTREEL dans le SVALUE
  84. C======================================================================C
  85. MEVOL1=IPO1
  86.  
  87. SEGINI,MEVOLL=MEVOL1
  88. IPO2 = MEVOLL
  89.  
  90. N=MEVOLL.IEVOLL(/1)
  91. IF (N .EQ. 0)THEN
  92. C Cas de l'EVOLUTION vide
  93. IRET = 1
  94. RETURN
  95. ENDIF
  96.  
  97. C Regalge fait sur PC40 pour determiner le nombre de NOEUDS optimum
  98. C par thread
  99. IOPTIM = 100
  100.  
  101. IPOS1 = 0
  102. NBPOIN=N
  103. SEGINI,SVALUE
  104.  
  105. DO 40 IA=1,N
  106. KEVOL1=MEVOLL.IEVOLL(IA)
  107. SEGINI,KEVOLL=KEVOL1
  108. MEVOLL.IEVOLL(IA)=KEVOLL
  109.  
  110. IF (ICLE.EQ.1) THEN
  111. CTYP = KEVOLL.TYPX
  112. IPRG = KEVOLL.IPROGX
  113. ELSE
  114. C Les ordonnees dans tout autre cas :
  115. CTYP = KEVOLL.TYPY
  116. IPRG = KEVOLL.IPROGY
  117. ENDIF
  118.  
  119. IF (CTYP .EQ. 'LISTMOTS') THEN
  120. C Cas des ordonnees de type LISTMOTS
  121. C Cela sert pour DESS pour mettre les petits triangles au niveau
  122. C des points nommes sur l''abscisse curviligne
  123. GOTO 40
  124.  
  125. ELSEIF (CTYP .EQ. 'LISTREEL') THEN
  126. C Cas des ordonnees de type LISTREEL
  127. MLREE1=IPRG
  128. JG =MLREE1.PROG(/1)
  129. SEGINI,MLREEL
  130. IF (ICLE.EQ.1) THEN
  131. KEVOLL.IPROGX=MLREEL
  132. ELSE
  133. KEVOLL.IPROGY=MLREEL
  134. ENDIF
  135. IPOS1 = IPOS1 + 1
  136. SVALUE.ITYPOI (IPOS1 )= 3
  137. SVALUE.IPOI0 (IPOS1,1)= MLREE1
  138. SVALUE.IPOI1 (IPOS1,1)= 0
  139. SVALUE.IPOI2 (IPOS1,1)= MLREEL
  140. SVALUE.IPOI0 (IPOS1,2)= JG
  141. SVALUE.IPOI1 (IPOS1,2)= 0
  142. SVALUE.IPOI2 (IPOS1,2)= JG
  143.  
  144. ELSEIF(CTYP .EQ. 'LISTENTI') THEN
  145. C Cas des ordonnees de type LISTENTI
  146. MLENT1=IPRG
  147. JG =MLENT1.LECT(/1)
  148. SEGINI,MLENTI
  149. IF (ICLE.EQ.1) THEN
  150. KEVOLL.IPROGX=MLENTI
  151. ELSE
  152. KEVOLL.IPROGY=MLENTI
  153. ENDIF
  154. IPOS1 = IPOS1 + 1
  155. SVALUE.ITYPOI (IPOS1 )= 4
  156. SVALUE.IPOI0 (IPOS1,1)= MLENT1
  157. SVALUE.IPOI1 (IPOS1,1)= 0
  158. SVALUE.IPOI2 (IPOS1,1)= MLENTI
  159. SVALUE.IPOI0 (IPOS1,2)= JG
  160. SVALUE.IPOI1 (IPOS1,2)= 0
  161. SVALUE.IPOI2 (IPOS1,2)= JG
  162.  
  163. ELSE
  164. C Cas des ordonnees de type Different
  165. MOTERR(1:8) = CTYP
  166. IF (IARGU .EQ. 1 .OR. IARGU .EQ. 11) THEN
  167. MOTERR(9:16)='ENTIER '
  168. CALL ERREUR(532)
  169. ELSEIF (IARGU .EQ. 2 .OR. IARGU .EQ. 21) THEN
  170. MOTERR(9:16)='FLOTTANT'
  171. CALL ERREUR(532)
  172. ELSE
  173. MOTERR(9:16)='???? '
  174. CALL ERREUR(532)
  175. ENDIF
  176. RETURN
  177. ENDIF
  178.  
  179. IF (IA .EQ. 1) THEN
  180. NT1 = JG / IOPTIM
  181. ELSE
  182. NT1 = MAX(NT1, JG/IOPTIM)
  183. ENDIF
  184. 40 CONTINUE
  185. SVALUE.NPUTIL=IPOS1
  186.  
  187. C======================================================================C
  188. C Partie pour lancer le travail sur les Threads en parallele
  189. C======================================================================C
  190. ITH = 0
  191. IF (NBESC .NE. 0) ith=oothrd
  192. C CB215821 : DESACTIVE LA PARALLELISATION PTHREAD LORSQUE ON EST
  193. C DEJA DANS LES ASSISTANTS
  194. IF ((NT1 .LE. 1) .OR. (NBTHRS .EQ. 1) .OR. (ITH .GT. 0)) THEN
  195. NBTHR = 1
  196. BTHRD = .FALSE.
  197. ELSE
  198. NBTHR = MIN(NT1, NBTHRS)
  199. BTHRD = .TRUE.
  200. CALL THREADII
  201. ENDIF
  202.  
  203. SEGINI,SPARAL
  204. SPARAL.NBTHRD = NBTHR
  205. SPARAL.IVALUE = SVALUE
  206. SPARAL.IOPE = IOPERA
  207. SPARAL.IARG = IARGU
  208. SPARAL.I1I = I1
  209. SPARAL.X1I = X1
  210.  
  211. IF (BTHRD) THEN
  212. C Remplissage du 'COMMON/optabc'
  213. IPARAL=SPARAL
  214. DO ith=2,NBTHR
  215. CALL THREADID(ith,OPTABi)
  216. ENDDO
  217. CALL OPTABi(1)
  218.  
  219. C Attente de la fin de tous les threads en cours de travail
  220. DO ith=2,NBTHR
  221. CALL THREADIF(ith)
  222. ENDDO
  223.  
  224. C On libère les Threads
  225. CALL THREADIS
  226.  
  227. C Verification de l'erreur (Apres liberation des THREADS)
  228. DO ith=1,NBTHR
  229. IRETOU=SPARAL.IERROR(ith)
  230. IF (IRETOU .GT. 0) THEN
  231. CALL ERREUR(IRETOU)
  232. RETURN
  233. ENDIF
  234. ENDDO
  235.  
  236. ELSE
  237. C Appel de la SUBROUTINE qui fait le travail
  238. CALL OPTAB0(1,SPARAL)
  239.  
  240. IRETOU=SPARAL.IERROR(1)
  241. IF (IRETOU .GT. 0) THEN
  242. CALL ERREUR(IRETOU)
  243. RETURN
  244. ENDIF
  245. ENDIF
  246.  
  247. SEGSUP,SVALUE,SPARAL
  248.  
  249. IRET = 1
  250. END
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  

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