Télécharger opche1.eso

Retour à la liste

Numérotation des lignes :

opche1
  1. C OPCHE1 SOURCE PV090527 25/01/03 21:15:20 12111
  2. SUBROUTINE OPCHE1(IPO1,IOPERA,IARGU,I1,X1,IPO2,IRET)
  3. C=======================================================================
  4. C
  5. C ENTREES
  6. C IPO1 = POINTEUR SUR LE MCHELM
  7. C IPO2 = POINTEUR SUR LE MCHELM (Second Argument ATAN2)
  8. C I1 = ENTIER
  9. C X1 = FLOTTANT
  10. C
  11. C Operations elementaires entre un MCHELM 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 MCHELM
  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 SORTIES
  45. C IPO2 = MCHELM SOLUTION
  46. C IRET = 1 SI L OPERATION EST POSSIBLE
  47. C = 0 SI L OPERATION EST IMPOSSIBLE
  48. C
  49. C HISTORIQUE :
  50. C - CB215821 05/09/2016 --> Creation
  51. C - CB215821 05/06/2018 --> Ajout de la fonction SIGN a un argument
  52. C
  53. C=======================================================================
  54.  
  55. IMPLICIT INTEGER(I-N)
  56. IMPLICIT REAL*8 (A-H,O-Z)
  57.  
  58. -INC PPARAM
  59. -INC CCOPTIO
  60. -INC SMCOORD
  61. -INC SMCHAML
  62. -INC SMLREEL
  63. -INC SMLENTI
  64. -INC SMEVOLL
  65. -INC SMLMOTS
  66. -INC CCASSIS
  67. -INC TMVALUE
  68. INTEGER IPO1
  69. INTEGER IOPERA
  70. INTEGER IARGU
  71. INTEGER I1
  72. REAL *8 X1
  73. INTEGER IPO2
  74. INTEGER IRET
  75. INTEGER NT1
  76.  
  77. C Segment quelconque pour la desactivation des segements
  78. SEGMENT ISEG(0)
  79.  
  80. EXTERNAL OPTABi
  81. LOGICAL BTHRD
  82.  
  83. C Pour afficher les lignes gibianes appelees decommenter le CALL
  84. C CALL TRBAC
  85. * write(6,*) 'Entree ds opche1',IPO1,IOPERA,IARGU,I1,X1,IPO2,IRET
  86.  
  87.  
  88. IRET = 0
  89. MCHELM= 0
  90. MCHEL2= 0
  91. MELVA2= 0
  92. MLREE2= 0
  93. MLENT2= 0
  94. NN0 = 0
  95. NN1 = 0
  96. N1PTEL= 0
  97. N1PT0 = 0
  98. N1PT1 = 0
  99.  
  100. N1EL = 0
  101. N1EL0 = 0
  102. N1EL1 = 0
  103. NT1 = 0
  104.  
  105. NN2 = 0
  106. N2PTEL= 0
  107. N2EL = 0
  108. N2EL0 = 0
  109. N2EL1 = 0
  110. N2PT0 = 0
  111. N2PT1 = 0
  112.  
  113. C======================================================================C
  114. C Activation des SEGMENTS pour placer les MELVAL dans le SVALUE
  115. C======================================================================C
  116. MCHEL1=IPO1
  117.  
  118. C IF ((IOPERA .EQ. 3) .OR. (IOPERA .EQ. 4)) THEN
  119. CC Pour les operations + - on n'accepte que les MCHAML a 1
  120. CC seule composante.
  121. CC Pour les fonctions, on traite toutes les composantes en présence
  122. C CALL EXTR17(IPO1,MLMOTS)
  123. C SEGACT,MLMOTS
  124. C JGM=MLMOTS.MOTS(/2)
  125. C IF(JGM .GT. 1)THEN
  126. C CALL ERREUR(320)
  127. C RETURN
  128. C ENDIF
  129. C ENDIF
  130.  
  131. N1 = MCHEL1.ICHAML(/1)
  132.  
  133. IF (N1 .EQ. 0)THEN
  134. C Cas du MCHELM vide
  135. N3=0
  136. L1=8
  137. SEGINI,MCHELM
  138. TITCHE=' '
  139. IFOCHE=IFOMOD
  140. IPO2 = MCHELM
  141. IRET = 1
  142. RETURN
  143. ENDIF
  144.  
  145. C Ajout lecture second argument pour ATAN2 au lieu de ATAN
  146. IF (IPO2 .GT. 0) THEN
  147. MCHEL2=IPO2
  148. N12=MCHEL2.ICHAML(/1)
  149. C Les deux objets doivent etre de meme taille
  150. IF (N1 .NE. N12 ) THEN
  151. CALL ERREUR(329)
  152. RETURN
  153. ENDIF
  154.  
  155. DO I=1,N1
  156. IF (MCHEL1.IMACHE(I).NE.MCHEL2.IMACHE(I)) THEN
  157. CALL ERREUR(329)
  158. RETURN
  159. ENDIF
  160. ENDDO
  161. ENDIF
  162.  
  163. C Regalge fait sur PC40 pour determiner le nombre de NOEUDS optimum
  164. C par thread
  165. IOPTIM = 100
  166.  
  167. NBPOIN=0
  168. IPOS1 =0
  169.  
  170. C Decompte simplement du nombre de TABLEAUX a placer dans le SEGMENT SVALUE
  171. DO IA=1,N1
  172. MCHAM1 = MCHEL1.ICHAML(IA)
  173. N2 = MCHAM1.IELVAL(/1)
  174. DO IB=1,N2
  175. MELVA1 = MCHAM1.IELVAL(IB)
  176. N2PT0 = MELVA1.IELCHE(/1)
  177. N2EL0 = MELVA1.IELCHE(/2)
  178. IF (N2PT0 .EQ. 0 .AND. N2EL0.EQ. 0) THEN
  179. C Cas des 'REAL*8'
  180. NBPOIN = NBPOIN + 1
  181. ELSEIF(MCHAM1.TYPCHE(IB) .EQ. 'POINTEURLISTREEL' .OR.
  182. & MCHAM1.TYPCHE(IB) .EQ. 'POINTEURLISTENTI' ) THEN
  183. NBPOIN = NBPOIN + (N2PT0*N2EL0)
  184. ELSEIF(MCHAM1.TYPCHE(IB) .EQ. 'POINTEUREVOLUTIO' ) THEN
  185. DO IEL=1,N2EL0
  186. DO IPEL=1,N2PT0
  187. MEVOL1=MELVA1.IELCHE(IPEL,IEL)
  188. N=MEVOL1.IEVOLL(/1)
  189. NBPOIN = NBPOIN + N
  190. ENDDO
  191. ENDDO
  192. ELSE
  193. MOTERR(1:16 ) = MCHAM1.TYPCHE(IB)
  194. MOTERR(17:20) = MCHAM1.NOMCHE(IB)
  195. MOTERR(21:36) = 'argument '
  196. CALL ERREUR(552)
  197. RETURN
  198. ENDIF
  199. ENDDO
  200. ENDDO
  201.  
  202. CALL oooprl(1)
  203. SEGINI,SVALUE
  204.  
  205. N3 = MCHEL1.INFCHE(/2)
  206. L1 = MCHEL1.TITCHE(/1)
  207. SEGINI,MCHELM
  208. IPO2=MCHELM
  209. DO 40 IA=1,N1
  210. MCHAM1=MCHEL1.ICHAML(IA)
  211. N2 =MCHAM1.IELVAL(/1)
  212. SEGINI,MCHAML
  213. MCHELM.ICHAML(IA)=MCHAML
  214.  
  215. C Verif du meme nombre de composante si second argument
  216. IF(MCHEL2 .GT. 0) THEN
  217. MCHAM2 = MCHEL2.ICHAML(IA)
  218. IF(MCHAM2.IELVAL(/1).NE. N2) THEN
  219. CALL ERREUR(488)
  220. RETURN
  221. ENDIF
  222. ENDIF
  223.  
  224. C Travail sur les COMPOSANTES
  225. DO J = 1,N2
  226. MCHAML.NOMCHE(J)=MCHAM1.NOMCHE(J)
  227. MCHAML.TYPCHE(J)=MCHAM1.TYPCHE(J)
  228.  
  229. MELVA1 = MCHAM1.IELVAL(J)
  230. N1PT0 = MELVA1.VELCHE(/1)
  231. N1EL0 = MELVA1.VELCHE(/2)
  232. N2PT0 = MELVA1.IELCHE(/1)
  233. N2EL0 = MELVA1.IELCHE(/2)
  234.  
  235. NN0 = MAX(N1PT0*N1EL0,N2PT0*N2EL0)
  236.  
  237. C On a donne 2 arguments, des verifications supplementaires sont necessaires
  238. IF(MCHEL2 .GT. 0) THEN
  239. C Verification du Type
  240. IF (MCHAM2.TYPCHE(J) .NE. 'REAL*8') THEN
  241. C Le type %m1:16 de la composante %m17:20 du champ par
  242. C element %m21:36 ne correspond pas a celui attendu
  243. MOTERR(1:16 ) = MCHAM2.TYPCHE(J)
  244. MOTERR(17:20) = MCHAM2.NOMCHE(J)
  245. MOTERR(21:36) = 'argument '
  246. CALL ERREUR(552)
  247. RETURN
  248. ENDIF
  249.  
  250. C Verification des composantes
  251. IF(MCHAML.NOMCHE(J) .NE. MCHAM2.NOMCHE(J)) THEN
  252. CALL ERREUR(488)
  253. RETURN
  254. ENDIF
  255.  
  256. MELVA2 = MCHAM2.IELVAL(J)
  257. N1PT1 = MELVA2.VELCHE(/1)
  258. N1EL1 = MELVA2.VELCHE(/2)
  259. N2PT1 = MELVA2.IELCHE(/1)
  260. N2EL1 = MELVA2.IELCHE(/2)
  261. NN1 = MAX(N1PT1*N1EL1,N2PT1*N2EL1)
  262. ENDIF
  263.  
  264. NN2 = MAX(NN0 ,NN1 )
  265. N1PTEL = MAX(N1PT0,N1PT1)
  266. N1EL = MAX(N1EL0,N1EL1)
  267. N2PTEL = MAX(N2PT0,N2PT1)
  268. N2EL = MAX(N2EL0,N2EL1)
  269. SEGINI,MELVAL
  270. MCHAML.IELVAL(J) = MELVAL
  271.  
  272. IF (MCHAML.TYPCHE(J) .EQ. 'REAL*8' ) THEN
  273. IPOS1 = IPOS1 + 1
  274. SVALUE.ITYPOI (IPOS1 )= 2
  275. SVALUE.IPOI0 (IPOS1,1)= MELVA1
  276. SVALUE.IPOI1 (IPOS1,1)= MELVA2
  277. SVALUE.IPOI2 (IPOS1,1)= MELVAL
  278. SVALUE.IPOI0 (IPOS1,2)= NN0
  279. SVALUE.IPOI1 (IPOS1,2)= NN1
  280. SVALUE.IPOI2 (IPOS1,2)= NN2
  281. IF (IPOS1 .EQ. 1) THEN
  282. NT1 = NN2 / IOPTIM
  283. ELSE
  284. NT1 = MAX(NT1, NN2/IOPTIM)
  285. ENDIF
  286.  
  287. ELSEIF(MCHAML.TYPCHE(J) .EQ. 'POINTEURLISTREEL') THEN
  288. MLREE2 = 0
  289. DO IEL=1,N2EL0
  290. DO IPEL=1,N2PT0
  291. MLREE1 = MELVA1.IELCHE(IPEL,IEL)
  292. JG = MLREE1.PROG(/1)
  293. SEGINI,MLREEL
  294. MELVAL.IELCHE(IPEL,IEL) = MLREEL
  295.  
  296. IPOS1 = IPOS1 + 1
  297. SVALUE.ITYPOI (IPOS1 )= 3
  298. SVALUE.IPOI0 (IPOS1,1)= MLREE1
  299. SVALUE.IPOI1 (IPOS1,1)= MLREE2
  300. SVALUE.IPOI2 (IPOS1,1)= MLREEL
  301. SVALUE.IPOI0 (IPOS1,2)= JG
  302. SVALUE.IPOI1 (IPOS1,2)= JG
  303. SVALUE.IPOI2 (IPOS1,2)= JG
  304. IF (IPOS1 .EQ. 1) THEN
  305. NT1 = JG / IOPTIM
  306. ELSE
  307. NT1 = MAX(NT1, JG/IOPTIM)
  308. ENDIF
  309. ENDDO
  310. ENDDO
  311.  
  312. ELSEIF(MCHAML.TYPCHE(J) .EQ. 'POINTEURLISTENTI') THEN
  313. MLENT2 = 0
  314. DO IEL=1,N2EL0
  315. DO IPEL=1,N2PT0
  316. MLENT1 = MELVA1.IELCHE(IPEL,IEL)
  317. JG = MLENT1.LECT(/1)
  318. SEGINI,MLENTI
  319. MELVAL.IELCHE(IPEL,IEL) = MLENTI
  320.  
  321. IPOS1 = IPOS1 + 1
  322. SVALUE.ITYPOI (IPOS1 )= 4
  323. SVALUE.IPOI0 (IPOS1,1)= MLENT1
  324. SVALUE.IPOI1 (IPOS1,1)= MLENT2
  325. SVALUE.IPOI2 (IPOS1,1)= MLENTI
  326. SVALUE.IPOI0 (IPOS1,2)= JG
  327. SVALUE.IPOI1 (IPOS1,2)= JG
  328. SVALUE.IPOI2 (IPOS1,2)= JG
  329. IF (IPOS1 .EQ. 1) THEN
  330. NT1 = JG / IOPTIM
  331. ELSE
  332. NT1 = MAX(NT1, JG/IOPTIM)
  333. ENDIF
  334. ENDDO
  335. ENDDO
  336.  
  337. ELSEIF(MCHAML.TYPCHE(J) .EQ. 'POINTEUREVOLUTIO') THEN
  338. MLREE2 = 0
  339. MLENT2 = 0
  340. DO IEL=1,N2EL0
  341. DO IPEL=1,N2PT0
  342. MEVOL1 = MELVA1.IELCHE(IPEL,IEL)
  343. SEGINI,MEVOLL=MEVOL1
  344. MELVAL.IELCHE(IPEL,IEL)=MEVOLL
  345. N=MEVOLL.IEVOLL(/1)
  346. DO IEV1=1,N
  347. KEVOL1 = MEVOLL.IEVOLL(IEV1)
  348. SEGINI,KEVOLL=KEVOL1
  349. MEVOLL.IEVOLL(IEV1)=KEVOLL
  350. IF (KEVOLL.TYPY .EQ. 'LISTREEL') THEN
  351. MLREE1 = KEVOLL.IPROGY
  352. JG = MLREE1.PROG(/1)
  353. SEGINI,MLREEL
  354. KEVOLL.IPROGY = MLREEL
  355.  
  356. IPOS1 = IPOS1 + 1
  357. SVALUE.ITYPOI (IPOS1 )= 3
  358. SVALUE.IPOI0 (IPOS1,1)= MLREE1
  359. SVALUE.IPOI1 (IPOS1,1)= MLREE2
  360. SVALUE.IPOI2 (IPOS1,1)= MLREEL
  361. SVALUE.IPOI0 (IPOS1,2)= JG
  362. SVALUE.IPOI1 (IPOS1,2)= JG
  363. SVALUE.IPOI2 (IPOS1,2)= JG
  364. IF (IPOS1 .EQ. 1) THEN
  365. NT1 = JG / IOPTIM
  366. ELSE
  367. NT1 = MAX(NT1, JG/IOPTIM)
  368. ENDIF
  369.  
  370. ELSEIF (KEVOLL.TYPY .EQ. 'LISTENTI') THEN
  371. MLENT1 = KEVOLL.IPROGY
  372. JG = MLENT1.LECT(/1)
  373. SEGINI,MLENTI
  374. KEVOLL.IPROGY = MLENTI
  375.  
  376. IPOS1 = IPOS1 + 1
  377. SVALUE.ITYPOI (IPOS1 )= 4
  378. SVALUE.IPOI0 (IPOS1,1)= MLENT1
  379. SVALUE.IPOI1 (IPOS1,1)= MLENT2
  380. SVALUE.IPOI2 (IPOS1,1)= MLENTI
  381. SVALUE.IPOI0 (IPOS1,2)= JG
  382. SVALUE.IPOI1 (IPOS1,2)= JG
  383. SVALUE.IPOI2 (IPOS1,2)= JG
  384. IF (IPOS1 .EQ. 1) THEN
  385. NT1 = JG / IOPTIM
  386. ELSE
  387. NT1 = MAX(NT1, JG/IOPTIM)
  388. ENDIF
  389.  
  390. ELSE
  391. MOTERR(1:8 )=KEVOLL.TYPY
  392. IF (IARGU .EQ. 1 .OR. IARGU .EQ. 11) THEN
  393. MOTERR(9:16)='ENTIER '
  394. CALL ERREUR(532)
  395. ELSEIF (IARGU .EQ. 2 .OR. IARGU .EQ. 21) THEN
  396. MOTERR(9:16)='FLOTTANT'
  397. CALL ERREUR(532)
  398. ELSE
  399. MOTERR(9:16)='???? '
  400. CALL ERREUR(532)
  401. ENDIF
  402. RETURN
  403. ENDIF
  404. ENDDO
  405. ENDDO
  406. ENDDO
  407.  
  408. ELSE
  409. C Le type %m1:16 de la composante %m17:20 du champ par
  410. C element %m21:36 ne correspond pas a celui attendu
  411. MOTERR(1:16 ) = MCHAML.TYPCHE(J)
  412. MOTERR(17:20) = MCHAML.NOMCHE(J)
  413. MOTERR(21:36) = 'argument '
  414. CALL ERREUR(552)
  415. RETURN
  416. ENDIF
  417. ENDDO
  418.  
  419. 40 CONTINUE
  420.  
  421. SVALUE.NPUTIL=IPOS1
  422.  
  423. C======================================================================C
  424. C Partie pour lancer le travail sur les Threads en parallele
  425. C======================================================================C
  426. ITH = 0
  427. IF (NBESC .NE. 0) ith=oothrd
  428. C CB215821 : DESACTIVE LA PARALLELISATION PTHREAD LORSQUE ON EST
  429. C DEJA DANS LES ASSISTANTS
  430. IF ((NT1 .LE. 1) .OR. (NBTHRS .EQ. 1) .OR. (ITH .GT. 0)) THEN
  431. NBTHR = 1
  432. BTHRD = .FALSE.
  433. ELSE
  434. NBTHR = MIN(NT1, NBTHRS)
  435. BTHRD = .TRUE.
  436. CALL THREADII
  437. ENDIF
  438.  
  439. SEGINI,SPARAL
  440. CALL oooprl(0)
  441.  
  442. SPARAL.NBTHRD = NBTHR
  443. SPARAL.IVALUE = SVALUE
  444. SPARAL.IOPE = IOPERA
  445. SPARAL.IARG = IARGU
  446. SPARAL.I1I = I1
  447. SPARAL.X1I = X1
  448.  
  449. IF (BTHRD) THEN
  450. C Remplissage du 'COMMON/optabc'
  451. IPARAL=SPARAL
  452. DO ith=2,NBTHR
  453. CALL THREADID(ith,OPTABi)
  454. ENDDO
  455. CALL OPTABi(1)
  456.  
  457. C Attente de la fin de tous les threads en cours de travail
  458. DO ith=2,NBTHR
  459. CALL THREADIF(ith)
  460. ENDDO
  461.  
  462. C On libère les Threads
  463. CALL THREADIS
  464.  
  465. C Verification de l'erreur (Apres liberation des THREADS)
  466. DO ith=1,NBTHR
  467. IRETOU=SPARAL.IERROR(ith)
  468. IF (IRETOU .GT. 0) THEN
  469. CALL ERREUR(IRETOU)
  470. RETURN
  471. ENDIF
  472. ENDDO
  473.  
  474. ELSE
  475. C Appel de la SUBROUTINE qui fait le travail
  476. CALL OPTAB0(1,SPARAL)
  477.  
  478. IRETOU=SPARAL.IERROR(1)
  479. IF (IRETOU .GT. 0) THEN
  480. CALL ERREUR(IRETOU)
  481. RETURN
  482. ENDIF
  483. ENDIF
  484.  
  485.  
  486. C Copie des infos manquantes de MCHEL1
  487. C Unroll pour aller plus vite
  488. DO ii=1,N1
  489. MCHELM.CONCHE(ii)=MCHEL1.CONCHE(ii)
  490. ENDDO
  491. DO ii=1,N1
  492. MCHELM.IMACHE(ii)=MCHEL1.IMACHE(ii)
  493. ENDDO
  494. DO kk=1,N3
  495. DO ii=1,N1
  496. MCHELM.INFCHE(ii,kk)=MCHEL1.INFCHE(ii,kk)
  497. ENDDO
  498. ENDDO
  499. MCHELM.TITCHE=MCHEL1.TITCHE
  500. MCHELM.IFOCHE=MCHEL1.IFOCHE
  501. SEGSUP,SVALUE,SPARAL
  502.  
  503. IRET = 1
  504. END
  505.  
  506.  
  507.  
  508.  
  509.  
  510.  
  511.  

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