Télécharger oooadj.eso

Retour à la liste

Numérotation des lignes :

oooadj
  1. C OOOADJ SOURCE PV090527 26/04/24 08:22:59 12524
  2. SUBROUTINE OOOADJ (LRET,PSEG,IDI1,JDES,NTAB)
  3. C--------------------------------------------------------------------
  4. C
  5. C REALISER LA FONCTION : SEGADJ , PSEG
  6. C
  7. C PSEG POINTEUR SUR LE SEGMENT A AJUSTER (VOIR : ISEG=PSEG)
  8. C IDI1 TEL QUE : ISEG((IDI1-4)+1) = VALEUR DE LA PREMIERE
  9. C DIMENSION DU PREMIER TABLEAU DE PSEG .
  10. C JDES POUR LE I IEME TABLEAU DU SEGMENT , (I=1,NTAB) :
  11. C
  12. C TYPE=JDES(I) : TYPE DES ELEMENTS DU TABLEAU
  13. C SOUS LA FORME : TYLN*10000+NBBE
  14. C NBBE : NOMBRE DE BITS PAR ELEMENT DU TABLEAU
  15. C TYLN : (KTYP-1)*3+KLNI
  16. C
  17. C NBBM=JDES(NT+1) : NOMBRE DE BITS PAR MOT
  18. C
  19. C LDIM=JDES(NT+1+I) : INDICE DE LA DESCRIPTION
  20. C NDIM=JDES(NT+2+I)-LDIM-1 : NOMBRE DE DIMENSIONS
  21. C JDIM=2*NT+2+LDIM
  22. C NEWD=JDES(JDIM+K) : K IEME DIMENSION AJUSTEE
  23. C
  24. C POUR TOUT LES TABLEAUX SAUF LE PREMIER , JDES(JDIM)
  25. C PEUT ETRE UTILISE COMME MEMOIRE DE TRAVAIL PAR OOOADJ
  26. C
  27. C POUR LE PREMIER TABLEAU AAA , JDES(JDIM) CONTIENT
  28. C LE DEPLACEMENT IDO1 DE AAA PAR RAPPORT AU DEBUT DE
  29. C PSEG . TEL QUE SI XXX DU MEME TYPE QUE AAA MIS EN
  30. C EQUIVALENCE AVEC LE DEBUT DE PSEG :
  31. C XXX(IDO1+1) <=> AAA(1)
  32. C
  33. C KLNI
  34. C 1 2 3
  35. C ----------------------------------------------
  36. C I LOGICAL I LOGICAL*2 I LOGICAL*1 I 1
  37. C ----------------------------------------------
  38. C I INTEGER I INTEGER*2 I INTEGER*1 I 2
  39. C ----------------------------------------------
  40. C I REAL I REAL *8 I REAL *16 I 3 KTYP
  41. C ----------------------------------------------
  42. C I COMPLEX I COMPLEX*16 I COMPLEX*32 I 4
  43. C ----------------------------------------------
  44. C I CHARACTER I I I 5
  45. C ----------------------------------------------
  46. C
  47. C
  48. C-----------------------------------------------------------------------
  49. C
  50. C LA METHODE UTILISEE
  51. C
  52. C ON EFFECTUE DEUX PASSAGES SUR TOUT LES TABLEAUX DU SEGMENT
  53. C
  54. C PREMIER PASSAGE : EXAMEN DES TABLEAUX DANS L'ORDRE GAUCHE
  55. C DROITE A LA RECHERCHE DES REDUCTIONS DE
  56. C DIMENSION QU'ON EFFECTUE A MESURE .
  57. C REDUCTION EVENTUELLE DU SEGMENT (OOOXTR)
  58. C
  59. C DEUXIEME PASSAGE : EXTENSION EVENTUELLE DU SEGMENT (OOOXTN)
  60. C EXAMEN DES TABLEAUX DANS L'ORDRE DROITE
  61. C GAUCHE A LA RECHERCHE DES EXTENSIONS DE
  62. C DIMENSION QU'ON EFFECTUE A MESURE .
  63. C
  64. C MODIFICATION POUR UN TABLEAU
  65. C
  66. C SOIT TN UN TABLEAU FORTRAN A K INDICES DE DIMENSIONS
  67. C RESPECTIVES N1 , N2 , ... , NK POUR MODIFIER (REDUIRE
  68. C OU AUGMENTER) LA DIMENSION DU I IEME INDICE ET REALISER
  69. C L'IMPLANTATION MEMOIRE CORRESPONDANT A CETTE MODIFICATION
  70. C ON CONSIDERE LE TABLEAU FORTRAN EQUIVALENT A DEUX INDICES
  71. C TM(M1,M2) AVEC : M1 = N1*...*NI , M2 = (N1*...*NK)/M1
  72. C DANS LEQUEL ON MODIFIE LE PREMIER INDICE .
  73. C
  74. C SOIT MM LE NOUVEAU PREMIER INDICE :
  75. C
  76. C SI MM < M1
  77. C
  78. C DO J = 2 , M2
  79. C DO I = 1 , MM
  80. C TM(I+(J-1)*MM) = TM(I+(J-1)*M1)
  81. C
  82. C SI MM > M1
  83. C
  84. C DO J = M2 , 2 , -1
  85. C DO I = M1 , 1 , -1
  86. C TM(I+(J-1)*MM) = TM(I+(J-1)*M1)
  87. C
  88. C PROGRAMMEUR : MOUGIN
  89. C MODIF : 11/02/87 => ERREURS DANS DES CAS DE DIMENSIONS NULLES
  90. C MODIF : 27/01/89 INTRODUIRE DANS LA FAMILLE OOOW..
  91. C
  92. C-----------------------------------------------------------------------
  93. %INC IOOWCOM
  94. %INC IOOUNIT
  95. %INC IOOSGM
  96. %INC IOOADR
  97. %INC IOODES
  98.  
  99. C-----------------------------------------------------------------------
  100. C
  101. C EN PREALABLE AUX REDUCTIONS DE TABLEAUX
  102. C
  103. C ->NBBM NOMBRE DE BITS PAR MOT
  104. C ->JDES(JDIM) LES DEPLACEMENTS DES TABLEAUX APRES REDUCTION
  105. C ->KTAB L'INDICE DU PREMIER TABLEAU AYANT UNE REDUCTION
  106. C ->NMOT NOMBRE DE MOTS DU NOUVEAU SEGMENT
  107. C
  108. C NDIM NOMBRE DE DIMENSIONS DU TABLEAU
  109. C IDIM INDICE DANS ISEG DES DEPLACEMENT ET DIMENSIONS
  110. C JDIM INDICE DANS JDES DE LA DESCRIPTION DU TABLEAU
  111. C NBBE NOMBRE DE BITS PAR ELEMENT DU TABLEAU
  112. C NEL0 DEPLACEMENT INITIAL DU TABLEAU
  113. C NEL1 DEPLACEMENT DU TABLEAU
  114. C NELB NOMBRE D'ELEMENTS DU TABLEAU
  115. C NBIT NOMBRE DE BITS DU SEGMENT
  116. C
  117. C-----------------------------------------------------------------------
  118.  
  119. %IF UNIX32,WIN32
  120. C Pour eviter l'overflow sur nbit
  121. REAL*8 NBIT,NBBE
  122. %ENDIF
  123.  
  124. INTEGER TYLN , JDES(NTAB)
  125. LOGICAL LMODJ
  126. SEGMENT , ISEG(0)*I
  127. POINTEUR PSEG.ISEG
  128.  
  129. C LWAIT=.TRUE. duree dans ooowait seulement
  130. C LGLL =.TRUE. duree dans ooogll seulement
  131. INTEGER ITTIME(4)
  132. LOGICAL LGLL,LWAIT
  133. CHARACTER*(6) HDUREE
  134.  
  135. C Logique pour chronométrer l'attente
  136. LGLL =MZATTE .LT. 0 .AND. thread
  137. LWAIT =MZATTE .GT. 0
  138.  
  139. LRET=2
  140. igll=1
  141.  
  142. NBBM=JDES(NTAB+1)
  143. ISEG=PSEG
  144. KTAB=NTAB+1
  145. DO JTAB=1,NTAB
  146. LDIM=JDES(NTAB+1+JTAB)
  147. NDIM=JDES(NTAB+2+JTAB)-LDIM-1
  148. JDIM=LDIM+2*NTAB+2
  149. IDIM=LDIM+IDI1-5
  150. NBBE=MOD(JDES(JTAB),10000)
  151. IF (JTAB.EQ.1) THEN
  152. NEL1=JDES(JDIM)
  153. ELSE
  154. NEL0=ISEG(IDIM)
  155. NEL1=(NBIT+NBBE-1)/NBBE
  156. JDES(JDIM)=NEL1
  157. IF (NEL1.GT.NEL0) GO TO 901
  158. ENDIF
  159. NELB=1
  160. DO KDIM=1,NDIM
  161. IIII=ISEG(IDIM+KDIM)
  162. IF (IIII.LT. 0) GO TO 902
  163. JJJJ=JDES(JDIM+KDIM)
  164. IF (JJJJ.LT. 0) GO TO 903
  165. IF (JJJJ.LT.IIII) KTAB=MIN(KTAB,JTAB)
  166. NELB=NELB*MIN(JJJJ,IIII)
  167. ENDDO
  168. NBIT=(NEL1+NELB)*NBBE
  169. ENDDO
  170. NMOT=(NBIT+NBBM-1)/NBBM
  171. C-----------------------------------------------------------------------
  172. C
  173. C POUR CHACUN DES TABLEAUX , DE GAUCHE A DROITE
  174. C ON EFFECTUE TOUTES LES REDUCTIONS
  175. C
  176. IF (KTAB.LE.NTAB) THEN
  177. DO JTAB=KTAB,NTAB
  178.  
  179. C ->IDOA DEPLACEMENT DU TABLEAU AVANT DECALAGE GLOBAL
  180.  
  181. LDIM=JDES(NTAB+1+JTAB)
  182. NDIM=JDES(NTAB+2+JTAB)-LDIM-1
  183. IDIM=LDIM+IDI1-5
  184. JDIM=LDIM+2*NTAB+2
  185. IF (JTAB.EQ.1) THEN
  186. IDOA=JDES(JDIM)
  187. ELSE
  188. IDOA=ISEG(IDIM)
  189. ENDIF
  190.  
  191. C ->LMODJ VRAI SI AU MOINS UNE DES DIMENSIONS EST REDUITE
  192. C ->NELA LE NOMBRE D'ELEMENT DU TABLEAU DE DEPART
  193. C ->NELB LE NOMBRE D'ELEMENT DU TABLEAU REDUIT
  194.  
  195. LMODJ=.FALSE.
  196. NELA = 1
  197. NELB = 1
  198. DO KDIM=1,NDIM
  199. LMODJ= LMODJ .OR. (ISEG(IDIM+KDIM) .GT. JDES(JDIM+KDIM))
  200. NELA = NELA * ISEG(IDIM+KDIM)
  201. NELB = NELB * MIN(ISEG(IDIM+KDIM) , JDES(JDIM+KDIM))
  202. ENDDO
  203.  
  204. C DECALAGE GLOBAL A GAUCHE DU TABLEAU
  205. C MISE A JOUR DU DEPLACEMENT DANS LE SEGMENT
  206. C
  207. C TYLN TYPE DES ELEMENTS DU TABLEAU
  208. C NBBE NOMBRE DE BITS PAR ELEMENT DU TABLEAU
  209. C IDOZ CORRECTION AUX DEPLACEMENTS POUR TENIR COMPTE DES
  210. C DIMENSIONS DES SEGMENT D'ACCES (VOIR : OOOADG)
  211. C IDOB DEPLACEMENT DU TABLEAU APRES DECALAGE GLOBAL
  212.  
  213. TYLN= JDES(JTAB)/10000
  214. NBBE=MOD(JDES(JTAB),10000)
  215. IDOZ=MAX(1,INT(NBBM/NBBE))
  216. IDOB=JDES(JDIM)
  217. IDOO=IDOB-IDOZ
  218. IF (IDOB.LT.IDOA) THEN
  219. IF (NELB.GT.0) then
  220. if (thread .and. igll .eq. 1) call ooogll(0)
  221. igll=0
  222. endif
  223. CALL OOOADG (ISEG,TYLN,NELA,IDOO,IDOA-IDOZ)
  224. ISEG(IDIM)=IDOB
  225. ENDIF
  226.  
  227. C POUR CHACUNE DES DIMENSIONS DU TABLEAU
  228.  
  229. IF (LMODJ) THEN
  230. MM =1
  231. DO KDIM=1,NDIM
  232.  
  233. C ->M1 LA PREMIERE DIMENSION DU TABLEAU TM
  234. C ->MM LA PREMIERE DIMENSION DU TABLEAU TM AJUSTEE
  235.  
  236. IIII= ISEG(IDIM+KDIM)
  237. JJJJ=MIN(JDES(JDIM+KDIM),IIII)
  238. M1 =MM*IIII
  239. MM =MM*JJJJ
  240. IF (JJJJ.LT.IIII) THEN
  241.  
  242. C MISE A JOUR DE LA DIMENSION DANS LE SEGMENT
  243.  
  244. ISEG(IDIM+KDIM)=JJJJ
  245. IF (NELB.GT.0) THEN
  246.  
  247. C ->M2 LA DEUXIEME DIMENSION DU TABLEAU TM
  248. C ->NELA DIMENSION TOTALE DU TABLEAU TM AJUSTEE
  249.  
  250. M2 =NELA/M1
  251. NELA=MM*M2
  252.  
  253. C DECALAGE A GAUCHE DU TABLEAU
  254.  
  255. IF (M2.GT.1.and.mm.gt.0) THEN
  256. if (thread .and. igll .eq. 1) call ooogll(0)
  257. igll=0
  258. DO J=2,M2
  259. CALL OOOADG (ISEG,TYLN,MM,IDOO+(J-1)*MM,IDOO+(J-1)*M1)
  260. ENDDO
  261. ENDIF
  262. ENDIF
  263. ENDIF
  264. ENDDO
  265. ENDIF
  266. ENDDO
  267.  
  268. C EFFECTUER LA REDUCTION DE TAILLE DU SEGMENT
  269. C Mesure du TEMPS
  270. if (LGLL) CALL oootps(ITTIME,nth)
  271. if (thread .and. igll .eq. 0) then
  272. call ooogll(1)
  273. igll=1
  274. endif
  275. if (LGLL) then
  276. C Mesure de l'attente
  277. ITPS0=ITTIME(1)+ITTIME(2)
  278. CALL oootps(ITTIME,nth)
  279. IELAPS=ITTIME(1)+ITTIME(2)-ITPS0
  280. IF(IELAPS .ge. ABS(MZATTE))THEN
  281. WRITE(HDUREE,'(i6)') IELAPS
  282. CALL OOOMES(PSEG,'GEMAT ATTEND'//HDUREE)
  283. ENDIF
  284. endif
  285. NMOTR=((NMOT+(MSLSM-1))/MSLSM)*MSLSM
  286. CALL OOOXTR (ISEG,NMOTR)
  287.  
  288. ENDIF
  289. C-----------------------------------------------------------------------
  290. C
  291. C EN PREALABLE AUX EXTENTIONS DE TABLEAUX
  292. C
  293. C ->JDES(JDIM) LES DEPLACEMENTS DES TABLEAUX APRES EXTENSION
  294. C ->KTAB L'INDICE DU PREMIER TABLEAU AYANT UNE EXTENSION
  295. C ->NMOT NOMBRE DE MOTS DU NOUVEAU SEGMENT
  296.  
  297. KTAB=NTAB+1
  298. DO JTAB=1,NTAB
  299. LDIM=JDES(NTAB+1+JTAB)
  300. NDIM=JDES(NTAB+2+JTAB)-LDIM-1
  301. JDIM=LDIM+2*NTAB+2
  302. IDIM=LDIM+IDI1-5
  303. NBBE=MOD(JDES(JTAB),10000)
  304. IF (JTAB.EQ.1) THEN
  305. NEL1=JDES(JDIM)
  306. ELSE
  307. NEL1=(NBIT+NBBE-1)/NBBE
  308. JDES(JDIM)=NEL1
  309. ENDIF
  310. NELB=1
  311. DO KDIM=1,NDIM
  312. IIII=ISEG(IDIM+KDIM)
  313. JJJJ=JDES(JDIM+KDIM)
  314. IF (JJJJ.GT.IIII) KTAB=MIN(KTAB,JTAB)
  315. NELB=NELB*JJJJ
  316. ENDDO
  317. NBIT=(NEL1+NELB)*NBBE
  318. ENDDO
  319. NMOT=(NBIT+NBBM-1)/NBBM
  320. C-----------------------------------------------------------------------
  321. C
  322. C POUR CHACUN DES TABLEAUX , DE DROITE A GAUCHE
  323. C ON EFFECTUE TOUTES LES EXTENSIONS
  324. C
  325.  
  326. IF (KTAB.LE.NTAB) THEN
  327.  
  328. C EFFECTUER L'EXTENSION DE TAILLE DU SEGMENT
  329. LSG1 = MSLS1(MDISG(ISEG))
  330. LSG2 = (((NMOT+MSLCZ)+(MSLSM-1))/MSLSM)*MSLSM
  331. IF (LSG2.GT.LSG1) THEN
  332. C Mesure du TEMPS
  333. if (LGLL) CALL oootps(ITTIME,nth)
  334. if (thread .and. igll .eq. 0) then
  335. call ooogll(1)
  336. igll=1
  337. endif
  338. if (LGLL) then
  339. C Mesure de l'attente
  340. ITPS0=ITTIME(1)+ITTIME(2)
  341. CALL oootps(ITTIME,nth)
  342. IELAPS=ITTIME(1)+ITTIME(2)-ITPS0
  343. IF(IELAPS .ge. ABS(MZATTE))THEN
  344. WRITE(HDUREE,'(i6)') IELAPS
  345. CALL OOOMES(PSEG,'GEMAT ATTEND'//HDUREE)
  346. ENDIF
  347. endif
  348.  
  349. NMOT1=NMOT+NMOT/10+MSLSM
  350. NMOTR=((NMOT1+(MSLSM-1))/MSLSM)*MSLSM
  351. CALL OOOEXT (LRET,ISEG,NMOTR)
  352. if (thread .and. igll .eq. 1) call ooogll(0)
  353. igll=0
  354. IF (LRET.EQ.1) RETURN
  355. ENDIF
  356. if (thread .and. igll .eq. 1) call ooogll(0)
  357. igll=0
  358.  
  359. DO JTAB=NTAB,KTAB,-1
  360.  
  361. C ->IDOA DEPLACEMENT DU TABLEAU AVANT DECALAGE GLOBAL
  362.  
  363. LDIM=JDES(NTAB+1+JTAB)
  364. NDIM=JDES(NTAB+2+JTAB)-LDIM-1
  365. IDIM=LDIM+IDI1-5
  366. JDIM=LDIM+2*NTAB+2
  367. IF (JTAB.EQ.1) THEN
  368. IDOA=JDES(JDIM)
  369. ELSE
  370. IDOA=ISEG(IDIM)
  371. ENDIF
  372.  
  373. C ->LMODJ VRAI SI AU MOINS UNE DES DIMENSIONS EST AUGMENTEE
  374. C ->NELA LE NOMBRE D'ELEMENT DU TABLEAU DE DEPART
  375. C ->NELB LE NOMBRE D'ELEMENT DU TABLEAU ETENDU
  376.  
  377. LMODJ = .FALSE.
  378. NELA = 1
  379. NELB = 1
  380. DO KDIM=1,NDIM
  381. LMODJ = LMODJ .OR. (ISEG(IDIM+KDIM) .LT. JDES(JDIM+KDIM))
  382. NELA = NELA * ISEG(IDIM+KDIM)
  383. NELB = NELB * JDES(JDIM+KDIM)
  384. ENDDO
  385.  
  386. C DECALAGE GLOBAL A DROITE DU TABLEAU
  387. C MISE A JOUR DU DEPLACEMENT DANS LE SEGMENT
  388. C
  389. C TYLN TYPE DES ELEMENTS DU TABLEAU
  390. C NBBE NOMBRE DE BITS PAR ELEMENT DU TABLEAU
  391. C IDOZ CORRECTION AUX DEPLACEMENTS POUR TENIR COMPTE DES
  392. C DIMENSIONS DES SEGMENT D'ACCES (VOIR : OOOADD)
  393. C IDOB DEPLACEMENT DU TABLEAU APRES DECALAGE GLOBAL
  394. C
  395. C IDOO IDOB-IDOZ
  396.  
  397. TYLN= JDES(JTAB)/10000
  398. NBBE=MOD(JDES(JTAB),10000)
  399. IDOZ=MAX(1,INT(NBBM/NBBE))
  400. IDOB=JDES(JDIM)
  401. IDOO=IDOB-IDOZ
  402. IF (IDOB.GT.IDOA) THEN
  403.  
  404.  
  405. IF (NELA.GT.0) CALL OOOADD (ISEG,TYLN,NELA,IDOO,IDOA-IDOZ)
  406. ISEG(IDIM)=IDOB
  407. ENDIF
  408.  
  409. C POUR CHACUNE DES DIMENSIONS DU TABLEAU
  410.  
  411. IF (NELB.GT.NELA) THEN
  412. CALL OOOADZ (ISEG,TYLN,NELB-NELA,IDOO+NELA)
  413. ENDIF
  414. IF (LMODJ) THEN
  415. MM =1
  416. DO KDIM=1,NDIM
  417.  
  418. C ->M1 LA PREMIERE DIMENSION DU TABLEAU TM
  419. C ->MM LA PREMIERE DIMENSION DU TABLEAU TM AJUSTEE
  420.  
  421. IIII=ISEG(IDIM+KDIM)
  422. JJJJ=JDES(JDIM+KDIM)
  423. M1 =MM*IIII
  424. MM =MM*JJJJ
  425. IF (JJJJ.GT.IIII) THEN
  426.  
  427. C MISE A JOUR DE LA DIMENSION DANS LE SEGMENT
  428.  
  429. ISEG(IDIM+KDIM)=JJJJ
  430.  
  431. C ->M2 LA DEUXIEME DIMENSION DU TABLEAU TM
  432. C ->NELA DIMENSION TOTALE DU TABLEAU TM AJUSTEE
  433.  
  434. IF (NELA.GT.0) THEN
  435. M2 =NELA/M1
  436. NELA=MM*M2
  437.  
  438. C DECALAGE A DROITE DU TABLEAU
  439.  
  440. IF (M2.GT.1) THEN
  441. DO J=M2,2,-1
  442. CALL OOOADD (ISEG,TYLN,M1,IDOO+(J-1)*MM,IDOO+(J-1)*M1)
  443. CALL OOOADZ (ISEG,TYLN,MM-M1,IDOO+(J-1)*MM+M1)
  444. ENDDO
  445. ENDIF
  446. CALL OOOADZ (ISEG,TYLN,MM-M1,IDOO +M1)
  447. ENDIF
  448. ENDIF
  449. ENDDO
  450. ENDIF
  451. ENDDO
  452. ELSE
  453. if (thread .and. igll .eq. 1) call ooogll(0)
  454. igll=0
  455. ENDIF
  456.  
  457. RETURN
  458. C-----------------------------------------------------------------------
  459. C
  460. C MESSAGES D'ERREUR
  461. C
  462. 901 CALL OOOERR (NEL0,1,'DEPLACEMENT DETRUIT DANS LE SEGMENT')
  463. GO TO 950
  464. 902 CALL OOOERR (IIII,1,'DIMENSION NEGATIVE DANS LE SEGMENT')
  465. GO TO 950
  466. 903 CALL OOOERR (JJJJ,1,'DIMENSION NEGATIVE DEMANDEE')
  467. GO TO 950
  468. 950 STOP 16
  469. END
  470.  
  471.  

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