Télécharger tfor.eso

Retour à la liste

Numérotation des lignes :

tfor
  1. C TFOR SOURCE CB215821 25/04/23 21:15:48 12247
  2.  
  3. SUBROUTINE TFOR(IOPT)
  4.  
  5. IMPLICIT INTEGER(I-N)
  6. IMPLICIT REAL*8(A-H,O-V)
  7. IMPLICIT COMPLEX*16 (W-Z)
  8. C
  9. C=======================================================================
  10. C CALCULS IMPLIQUANT UNE TRANSFORMEE DE FOURIER RAPIDE D'UN SIGNAL
  11. C=======================================================================
  12. C
  13. C +-----------+------+----------------------------------------------+
  14. C | OPERATEUR | IOPT | CALCUL |
  15. C +-----------+------+----------------------------------------------+
  16. C | TFR | +1 | TRANSFORMEE DE FOURIER RAPIDE D'UN SIGNAL |
  17. C +-----------+------+----------------------------------------------+
  18. C | DSPR | +2 | DENSITE SPECTRALE DE PUISSANCE D'UN SIGNAL |
  19. C +-----------+------+----------------------------------------------+
  20. C
  21. C SYNTAXE : voir notices des operateurs
  22. C -------
  23. C
  24. C NOMENCLATURE DE LA SOURCE :
  25. C -------------------------
  26. C EXP2 : EXPOSANT DANS NPOINT=2^EXP2, NPOINT ETANT
  27. C LE NOMBRE DE REELS DANS LISTREEL
  28. C EVO1 : OBJET DE TYPE EVOLUTIO CONTENANT LE SIGNAL A TRAITER
  29. C SORT : TYPE DE SORTIE ;
  30. C = 'REIM' PART REEL & PART IMAG / FREQ
  31. C = 'MOPH' MODULE & PHASE / FREQ
  32. C FMIN : MOT-CLE
  33. C V1 : FREQUENCE MINIE A VISUALISER
  34. C FMAX : MOT-CLE
  35. C V2 : FREQUENCE MAXIE A VISUALISER
  36. C COU1 : COULEUR ATTRIBUEE A LA PREMIERE COURBE (FACULTATIF)
  37. C COU2 : COULEUR ATTRIBUEE A LA DEUXIEME COURBE (FACULTATIF)
  38. C
  39. C CREATION/MODIF :
  40. C --------------
  41. C - 16/04/87, BEAUFILS
  42. C - 20/05/2015, Benoit Prabel : extension aux LISTCHPO,
  43. C - 2018-10-01, Benoit Prabel : branchement de FFTPACK5.1
  44. c - 2021-08-04, BP : aiguillage de DSPR vers tfor.eso pour mutualiser
  45. C
  46. c TODO :
  47. c ----
  48. c - brancher aussi les lischpo a FFTPACK
  49. c en inversant les boucles + //iser sur les inconnues
  50. C
  51. C=======================================================================
  52. C
  53. -INC CCGEOME
  54. -INC PPARAM
  55. -INC CCOPTIO
  56. -INC CCREEL
  57. -INC SMEVOLL
  58. -INC SMLREEL
  59. -INC SMLCHPO
  60. -INC SMCHPOI
  61. -INC SMCOORD
  62. C
  63. c segments pour appel a WEXP + FFTL
  64. SEGMENT MTRAV2
  65. IMPLIED W(NEXP)
  66. ENDSEGMENT
  67.  
  68. SEGMENT MTRAV3
  69. IMPLIED XXX(NCOU,NDDL),YYY(NCOU)
  70. ENDSEGMENT
  71.  
  72. SEGMENT,LIPOV(NIPOV)
  73. SEGMENT,LIPOV2(NIPOV)
  74. SEGMENT,LIPOV3(NIPOV)
  75.  
  76. c segment pour appel a fftpack5.1
  77. segment wfft51
  78. real*8 work(lenwrk)
  79. real*8 wsave(lensav)
  80. real*8 XX51(NCOU)
  81. endsegment
  82. C
  83. CHARACTER *72 TI
  84. CHARACTER *24 MOTY
  85. CHARACTER *4 NSORT(2),MCLE(2)
  86. LOGICAL INV
  87.  
  88. DATA NSORT(1),NSORT(2)/'REIM','MOPH'/
  89. DATA MCLE(1),MCLE(2)/'FMIN','FMAX'/
  90. C
  91. C==== INITIALISATIONS ==================================================
  92. C
  93.  
  94. IPSIG=0
  95. IPTAB=0
  96. c FFT toujours directe ici
  97. INV=.FALSE.
  98.  
  99. C
  100. C==== LECTURES =========================================================
  101. C
  102. C LECTURE DE EXP2
  103. C
  104. CALL LIRENT(N2,1,IRET1)
  105. IF(IRET1.EQ.0)GOTO 666
  106. NPOINT=2**N2
  107. IF(IIMPI.EQ.1) write(ioimp,*) 'NPOINT=2**',N2,'=',NPOINT
  108. IF(N2 .LT. 2)THEN
  109. CALL ERREUR(21)
  110. GOTO 666
  111. ENDIF
  112. C
  113. C LECTURE DE L'OBJET EVOLUTIO CONTENANT LE SIGNAL
  114. C ou de L'OBJET LISTCHPO contenant la suite de chpoint + liste des temps
  115. C
  116. CALL LIROBJ('EVOLUTIO',IPSIG,0,IRET2)
  117. IF(IRET2.EQ.0) THEN
  118. CALL LIROBJ ('LISTCHPO',IPLCH,1,IRET2)
  119. IF(IRET2.EQ.0)GOTO 666
  120. CALL LIROBJ ('LISTREEL',IPREE1,1,IRET2)
  121. IF(IRET2.EQ.0)GOTO 666
  122. ENDIF
  123. IF(IIMPI.EQ.1) write(ioimp,*) 'signal=',IPSIG,IPLCH,IPREE1
  124. C
  125. C TYPE DE SORTIE : LECTURE si TFR de 'REel/IMaginaire' ou 'MOdule/PHase'
  126. C necessairement MODULE**2 pour DSPR
  127. IF(IOPT.EQ.1) THEN
  128. CALL LIRMOT(NSORT,2,ISORT,0)
  129. IF(ISORT.EQ.0) ISORT=1
  130. ELSEIF(IOPT.EQ.2) THEN
  131. ISORT=3
  132. ELSE
  133. WRITE(IOIMP,*) 'tfor: valeur de IOPT incorrect'
  134. CALL ERREUR(5)
  135. ENDIF
  136. IF(IIMPI.EQ.1) write(ioimp,*) 'sortie :',ISORT
  137. C
  138. C LECTURE DE LA FREQUENCE MINI FMIN -> FRMI
  139. C
  140. CALL LIRMOT(MCLE(1),1,IRET,0)
  141. IF(IRET.EQ.1) THEN
  142. CALL LIRREE(FRMI,0,IRET1)
  143. IF(IRET1.EQ.0) THEN
  144. MOTERR=MCLE(1)(1:4)
  145. CALL ERREUR(166)
  146. GOTO 666
  147. ENDIF
  148. IF(FRMI.LT.(-1.D-20)) FRMI=-FRMI
  149. IF(ABS(FRMI).LT.1.D-20) FRMA=-1.D0
  150. ELSE
  151. FRMI=-1.D0
  152. ENDIF
  153. C
  154. C LECTURE DE LA FREQUENCE MAXI FMAX -> FRMA
  155. C
  156. CALL LIRMOT(MCLE(2),1,IRET,0)
  157. IF(IRET.EQ.1) THEN
  158. CALL LIRREE(FRMA,0,IRET1)
  159. IF(IRET1.EQ.0) THEN
  160. MOTERR=MCLE(2)(1:4)
  161. CALL ERREUR(166)
  162. GOTO 666
  163. ENDIF
  164. IF(FRMA.LT.(-1.D-20)) FRMA=-FRMA
  165. IF(ABS(FRMA).LT.1.D-20) FRMA=-1.D0
  166. ELSE
  167. FRMA=-1.D0
  168. ENDIF
  169. IF(IIMPI.EQ.1) write(ioimp,*) FRMI,' < FREQ <',FRMA
  170. C
  171. C LECTURE DE LA COULEUR
  172. C
  173. CALL LIRMOT(NCOUL,NBCOUL,ICOU1,0)
  174. IF (ICOU1.EQ.0) ICOU1=IDCOUL+1
  175. ICOU1=ICOU1-1
  176. CALL LIRMOT(NCOUL,NBCOUL,ICOU2,0)
  177. IF (ICOU2.EQ.0) ICOU2=IDCOUL+1
  178. ICOU2=ICOU2-1
  179. IF(IIMPI.EQ.1) write(ioimp,*) 'couleurs=',ICOU1,ICOU2
  180. C
  181. IF(IERR.NE.0) GOTO 666
  182. C
  183. C VERIFICATION DU NOMBRE DE PAS DE TEMPS ...
  184. C
  185. IF(IPSIG.NE.0) THEN
  186. C ...POUR L'EVOLUTION EN ENTREE
  187. MEVOL1=IPSIG
  188. CALL ACTOBJ('EVOLUTIO',IPSIG,1)
  189. IF(MEVOL1.IEVOLL(/1).NE.1) THEN
  190. CALL ERREUR(687)
  191. ENDIF
  192. KEVOL1=MEVOL1.IEVOLL(1)
  193. MLREE1=KEVOL1.IPROGX
  194. MLREE2=KEVOL1.IPROGY
  195. L1 =MLREE1.PROG(/1)
  196. IF(L1 .GE. 2)THEN
  197. DT=MLREE1.PROG(2)-MLREE1.PROG(1)
  198. ELSE
  199. CALL ERREUR(199)
  200. RETURN
  201. ENDIF
  202. IF(DT.LE.XPETIT) THEN
  203. CALL ERREUR(206)
  204. GOTO 666
  205. ENDIF
  206. ELSE
  207. C ...POUR LA LISTE DE CHPOINTs EN ENTREE
  208. MLCHPO=IPLCH
  209. SEGACT,MLCHPO
  210. N1=ICHPOI(/1)
  211. MLREE1=IPREE1
  212. SEGACT MLREE1
  213. L1=MLREE1.PROG(/1)
  214. IF(L1 .GE. 2)THEN
  215. DT=MLREE1.PROG(2)-MLREE1.PROG(1)
  216. ELSE
  217. CALL ERREUR(199)
  218. RETURN
  219. ENDIF
  220. IF(IIMPI.EQ.1) write(ioimp,*) 'N1,L1,DT=',N1,L1,DT
  221. IF(DT.LE.XPETIT) THEN
  222. CALL ERREUR(206)
  223. GO TO 666
  224. ENDIF
  225. IF(N1.LT.L1) THEN
  226. CALL ERREUR(217)
  227. goto 666
  228. ENDIF
  229. ENDIF
  230.  
  231. c qq ecritures pour le debuggage
  232. IF(IIMPI.EQ.1) THEN
  233.  
  234. PRINT *,'NPOINT=',NPOINT,'L1=',L1
  235. IF(NPOINT.GT.L1) THEN
  236. WRITE(IOIMP,1000) L1,N2,NPOINT
  237. 1000 FORMAT(1H ,'LE NOMBRE DE POINTS DANS LISTEMPS ',I6, ' EST ',
  238. & 'INFERIEURE @ 2**',I5,
  239. & /' ON PRENDRA UNE LONGUEUR DE LISTEMPS DE ',I6,' MOTS ',
  240. & /' ET ON COMPLETERA PAR DES ZEROS')
  241. ELSE
  242. IF(NPOINT.LT.L1) THEN
  243. WRITE(IOIMP,1010) N2
  244. 1010 FORMAT(1H ,'ON TRONQUE LE SIGNAL A 2**',I5,' MOTS',/)
  245. ELSE
  246. WRITE(IOIMP,1030)N2,NPOINT
  247. 1030 FORMAT(1H ,'LA LONGUEUR DU LISTEMP EST EGALE A 2**',I5,
  248. & ' = ',I6,/)
  249. ENDIF
  250. ENDIF
  251. ENDIF
  252.  
  253. C CALCUL DE QUELQUES VARIABLES UTILES
  254. cbp : inutile? NDIBLK=NPOINT
  255. C IND1 = indice max pour le remplissage temporel
  256. IND1=L1
  257. IF(NPOINT.LT.L1) IND1 = NPOINT
  258. DUREE=DT*REAL(NPOINT)
  259. DUR05=0.5D0*DUREE
  260. DFREQ=1.D0/DUREE
  261. KHALF=INT(NPOINT/2)+1
  262. KMIN=INT(FRMI/DFREQ)+1
  263. KMAX=INT(FRMA/DFREQ)+1
  264. KDEBU=1
  265. IF(KMIN.GT.0) KDEBU=KMIN
  266. IF((KMAX.LT.KHALF).AND.(FRMA.GT.0.D0)) THEN
  267. KHALF=KMAX
  268. KFIN =KHALF
  269. ELSE
  270. KFIN =KHALF-1
  271. ENDIF
  272. NNN=KHALF-KDEBU+1
  273.  
  274. c si pas d'evolution (alors listchpo) -> on go en 700
  275. IF(IPSIG.eq.0) GOTO 700
  276.  
  277.  
  278. C=======================================================================
  279. C CAS EVOLUTION
  280. C=======================================================================
  281. IF(IIMPI.EQ.1) write(ioimp,*) '=== CAS EVOLUTION ==='
  282. C
  283. C==== CHARGEMENT DES TABLEAUX DE TRAVAIL ===============================
  284. C
  285. C creation du tableau de travail pour FFTPACK5.1
  286. NCOU=NPOINT
  287. lenwrk = 2 * NPOINT
  288. lensav = NPOINT + int(log ( real (NPOINT) ) / log (2.0) ) + 4
  289. segini,wfft51
  290. DO 10 I=1,IND1
  291. XX51(I)=MLREE2.PROG(I)
  292. c write(*,FMT="(I6,A,E24.16)") I,' ',XX51(I)
  293. 10 CONTINUE
  294. C On complete avec des 0 (utile meme apres SEGINI)
  295. IF(NPOINT.GT.L1) THEN
  296. L2=L1+1
  297. DO 11 I=L2,NPOINT
  298. XX51(I)=0.d0
  299. 11 CONTINUE
  300. ENDIF
  301. do ii=1,lenwrk
  302. work(ii)=0.d0
  303. enddo
  304. do iii=1,lensav
  305. wsave(iii)=0.d0
  306. enddo
  307. C
  308. C==== CALCUL DE LA FFT =================================================
  309. C
  310. IF(IIMPI.EQ.1) WRITE(IOIMP,*)' CALCUL DE LA FFT DU SIGNAL '
  311.  
  312. c +++ via FFTPACK5.1 +++
  313.  
  314. c Initialize the WSAVE array.
  315. call rfft1i (NPOINT,wsave,lensav,ier)
  316. IF (IERR.ne.0) RETURN
  317. c do iou=1,lensav
  318. c write(*,FMT="(I6,A,E24.16)") iou,' ',wsave(iou)
  319. c enddo
  320. c
  321. c Compute the FFT coefficients.
  322. inc = 1
  323. lenr = NPOINT
  324. c do iou=1,NPOINT
  325. c write(*,*) 'XX51_avant (',iou,')=',XX51(iou)
  326. c enddo
  327. call rfft1f (NPOINT,inc,XX51,lenr,wsave,lensav,work,lenwrk,ier)
  328. IF (IERR.ne.0) RETURN
  329. IF(IIMPI.EQ.1) WRITE(IOIMP,*)' FFT CALCULEE '
  330. C
  331. C==== CREATION ET REMPLISSAGE DES LISTES DE LA FFT =====================
  332. C
  333. IF(IIMPI.EQ.1) WRITE(IOIMP,*)' CHARGEMENT DE LA FFT '
  334. JG=NNN
  335. SEGINI MLREE1,MLREE2,MLREE3
  336. C
  337. C==== PARTIE REELLE & IMAGINAIRE / FREQUENCE (par defaut) ==============
  338. C
  339. ITY=0
  340. c souhaite-t-on le terme constant (f=0Hz) ?
  341. IF (KDEBU.EQ.1) THEN
  342. c WRITE(*,*) 'on remplit: 1 (ordre 0)'
  343. MLREE1.PROG(1)=0.d0
  344. MLREE2.PROG(1)=DUREE*XX51(1)
  345. MLREE3.PROG(1)=0.d0
  346. KDEBU=KDEBU+1
  347. ITY=ITY+1
  348. ENDIF
  349. c DO 20 I=KDEBU,(KHALF-2)
  350. DO 20 I=KDEBU,KFIN
  351. FREQ=REAL(I-1)*DFREQ
  352. ITY=ITY+1
  353. c WRITE(*,*) 'LOOP20: on remplit: ',ITY,'(ordre',I,')f=',FREQ
  354. MLREE1.PROG(ITY)=FREQ
  355. MLREE2.PROG(ITY)=(-1)**(2*I) *DUR05*XX51(2*I-2)
  356. MLREE3.PROG(ITY)=(-1)**(2*I+1)*DUR05*XX51(2*I-1)
  357. 20 CONTINUE
  358. c derniere valeur seulement si :
  359. c + on a un nombre pair en entree (tjrs vrai car NPOINT=2**N2)
  360. c + on cherche la dernier valeur
  361. IF (KFIN.EQ.(KHALF-1)) THEN
  362. FREQ=FREQ+DFREQ
  363. ITY=ITY+1
  364. c WRITE(*,*) 'on remplit: ',ITY,'(ordre',I,')f=',FREQ
  365. MLREE1.PROG(ITY)=FREQ
  366. MLREE2.PROG(ITY)=DUREE*XX51(NPOINT)
  367. MLREE3.PROG(ITY)=0.D0
  368. ENDIF
  369. c MOTY(1:24)='PART REEL PART IMAG'
  370. C
  371. C==== SORTIE EN MODULE & PHASE / FREQUENCE : on retraite ===============
  372. C
  373. IF (ISORT.EQ.2) THEN
  374. DO 21 ITY=1,NNN
  375. PREEL=MLREE2.PROG(ITY)
  376. PIMAG=MLREE3.PROG(ITY)
  377. c module
  378. PMODU=SQRT(PREEL**2+PIMAG**2)
  379. MLREE2.PROG(ITY)=PMODU
  380. c phase
  381. CALL FACOMP(PREEL,PIMAG,PMODU)
  382. MLREE3.PROG(ITY)=PMODU
  383. 21 CONTINUE
  384. c MOTY(1:8)='MODULE'
  385. c MOTY(9:12)=' '
  386. c MOTY(13:20)='PHASE'
  387. c MOTY(21:24)=' '
  388. ENDIF
  389. C
  390. C==== SORTIE DSPR : on retraite un peu différemment ===============
  391. C
  392. IF (ISORT.EQ.3) THEN
  393. DFREQ2=2.D0*DFREQ
  394. DO 22 ITY=1,NNN
  395. PREEL=MLREE2.PROG(ITY)
  396. PIMAG=MLREE3.PROG(ITY)
  397. PMODU=PREEL**2+PIMAG**2
  398. MLREE2.PROG(ITY)=DFREQ2*PMODU
  399. 22 CONTINUE
  400. ENDIF
  401.  
  402. SEGSUP wfft51
  403.  
  404. C
  405. C==== CREATION DE L'OBJET EVOLUTIO FFT =================================
  406. C
  407. c longueur du titre de l'evol en entree
  408. CALL LENCHA(KEVOL1.KEVTEX,LEN1)
  409. LEN1=min(LEN1,65)
  410.  
  411. c evol de sortie
  412. IF (ISORT.EQ.3) THEN
  413. N=1
  414. ELSE
  415. N=2
  416. ENDIF
  417. SEGINI MEVOLL
  418. IPVO=MEVOLL
  419. TI(1:72)=TITREE
  420. IEVTEX=TI
  421. IF (ISORT.EQ.3) THEN
  422. ITYEVO='REEL'
  423. ELSE
  424. ITYEVO='COMPLEXE'
  425. ENDIF
  426. C
  427. C -- PREMIERE SOUS-COURBE --
  428. c
  429. SEGINI KEVOLL
  430. IEVOLL(1)=KEVOLL
  431. C abscisses
  432. TYPX='LISTREEL'
  433. IPROGX=MLREE1
  434. NOMEVX='f (Hz)'
  435. C ordonnees
  436. TYPY='LISTREEL'
  437. IPROGY=MLREE2
  438. c NOMEVY=MOTY(1:12)
  439. C couleur
  440. NUMEVX=ICOU1
  441. c titre des abscisses, type et titre de la courbe (legende)
  442. IF(ISORT.EQ.1) THEN
  443. NOMEVY='Re(X)'
  444. NUMEVY='PREE'
  445. KEVTEX='Re TF('//KEVOL1.KEVTEX(1:LEN1)//')'
  446. ELSEIF(ISORT.EQ.2) THEN
  447. NOMEVY='|X|'
  448. NUMEVY='MODU'
  449. KEVTEX='Amp TF('//KEVOL1.KEVTEX(1:LEN1)//')'
  450. ELSEIF(ISORT.EQ.3) THEN
  451. NOMEVY='S_{x}'
  452. c bp : on omet l'unite = unite_de_x**2/Hz
  453. NUMEVY='REEL'
  454. KEVTEX='DSP('//KEVOL1.KEVTEX(1:LEN1)//')'
  455. ENDIF
  456. C
  457. C -- DEUXIEME SOUS-COURBE --
  458. c
  459. IF (N.GE.2) THEN
  460. SEGINI KEVOLL
  461. IEVOLL(2)=KEVOLL
  462. C
  463. TYPX='LISTREEL'
  464. IPROGX=MLREE1
  465. NOMEVX='f (Hz)'
  466. C
  467. TYPY='LISTREEL'
  468. IPROGY=MLREE3
  469. C
  470. NUMEVX=ICOU2
  471. IF(ISORT.EQ.1) THEN
  472. NOMEVY='Im(X)'
  473. NUMEVY='PIMA'
  474. KEVTEX='Im TF('//KEVOL1.KEVTEX(1:LEN1)//')'
  475. ELSEIF(ISORT.EQ.2) THEN
  476. NOMEVY='\j(X)'
  477. NUMEVY='PHAS'
  478. KEVTEX='\j TF('//KEVOL1.KEVTEX(1:LEN1)//')'
  479. ENDIF
  480. ELSE
  481. SEGSUP,MLREE3
  482. ENDIF
  483. C
  484. C -- ECRITURE --
  485. CALL ACTOBJ('EVOLUTIO',IPVO,1)
  486. CALL ECROBJ('EVOLUTIO',IPVO)
  487. 666 CONTINUE
  488. RETURN
  489.  
  490.  
  491. 700 CONTINUE
  492.  
  493. C=======================================================================
  494. C CAS LISTCHPO
  495. C=======================================================================
  496. IF(IIMPI.EQ.1) write(ioimp,*) '=== CAS LISTCHPO ==='
  497. C
  498. C==== CALCUL DE L'EXPONENTIEL ==========================================
  499. C
  500. IF(IIMPI.EQ.1) WRITE(IOIMP,*)' CALCUL DE L EXPONENTIEL'
  501. NEXP=NPOINT/2
  502. SEGINI MTRAV2
  503. CALL WEXP(INV,NPOINT,W(1))
  504. IF(IIMPI.EQ.1) write(ioimp,*) 'W=',(W(iou),iou=1,NEXP)
  505.  
  506. C creation des listchpo de sortie
  507. N1=NNN
  508. SEGINI,MLCHP2,MLCHP3
  509.  
  510. C---- boucle sur les ddls des chpoints----------------------------------
  511. c on suppose tous les chpoints de la meme forme que le 1er !
  512.  
  513. C on stocke les MPOVAL dans le tableau LIPOV
  514. NIPOV =IND1
  515. segini,LIPOV
  516. NIPOV =NNN
  517. segini,LIPOV2,LIPOV3
  518.  
  519. C==== BOUCLE SUR LES MSOUPO DES CHPOINTS ===============================
  520. IFOCHS = -99
  521. ISOUPO=0
  522. 710 ISOUPO=ISOUPO+1
  523. IF(IIMPI.EQ.1) write(ioimp,*) '-------- zone',ISOUPO,' --------'
  524.  
  525. c---- on ouvre les MSOUPO de tous les chpoints ----
  526. c DO I1=1,L1
  527. DO I1=1,IND1
  528. MCHPOI=ICHPOI(I1)
  529. CALL ACTOBJ('CHPOINT',MCHPOI,1)
  530. IF(ISOUPO.EQ.1) THEN
  531. c IF(IIMPI.EQ.1) write(ioimp,*) 'Time',I1,': on ouvre',MCHPOI
  532. NSOUPO=IPCHP(/1)
  533. IF(I1.EQ.1) NSOUP1=NSOUPO
  534. IF(NSOUP1.NE.NSOUPO) THEN
  535. CALL ERREUR(214)
  536. return
  537. ENDIF
  538. IF (I1.EQ.1) IFOCHS = MCHPOI.IFOPOI
  539. IF (MCHPOI.IFOPOI.NE.IFOCHS) THEN
  540. interr(1)=IFOCHS
  541. interr(2)=MCHPOI.IFOPOI
  542. interr(3)=IFOUR
  543. c-dbg write(ioimp,*) '1132 TFOR',IFOCHS,MCHPOI.IFOPOI
  544. call erreur(1132)
  545. IFORIG = IFOUR
  546. ENDIF
  547. ENDIF
  548. MSOUPO = IPCHP(ISOUPO)
  549. MPOVAL = IPOVAL
  550. LIPOV(I1)= MPOVAL
  551. NC = VPOCHA(/2)
  552. N = VPOCHA(/1)
  553. IF(I1.EQ.1) THEN
  554. NC1=NC
  555. N1=N
  556. ENDIF
  557. IF(NC1.NE.NC.OR.N1.NE.N) THEN
  558. CALL ERREUR(214)
  559. return
  560. ENDIF
  561. c rem : on pourrait aussi verifier les noms de composantes, etc...
  562. ENDDO
  563.  
  564. C---- creation du chpoint de sortie ----
  565. DO I1=1,NNN
  566. IF(ISOUPO.EQ.1) THEN
  567. NAT=2
  568. SEGINI,MCHPO2,MCHPO3
  569. MLCHP2.ICHPOI(I1)=MCHPO2
  570. MCHPO2.MTYPOI='REEL '
  571. MCHPO2.MOCHDE='CHAMP PAR POINTS CREE PAR TFR '
  572. MCHPO2.IFOPOI=IFOCHS
  573. MLCHP3.ICHPOI(I1)=MCHPO3
  574. MCHPO3.MTYPOI='IMAG '
  575. MCHPO3.MOCHDE='CHAMP PAR POINTS CREE PAR TFR '
  576. MCHPO3.IFOPOI=IFOCHS
  577. ELSE
  578. MCHPO2=MLCHP2.ICHPOI(I1)
  579. MCHPO3=MLCHP3.ICHPOI(I1)
  580. ENDIF
  581. C creation du MSOUP2 et du MPOVA2 de sortie
  582. SEGINI,MSOUP2=MSOUPO
  583. MCHPO2.IPCHP(ISOUPO)=MSOUP2
  584. SEGINI,MPOVA2=MPOVAL
  585. MSOUP2.IPOVAL=MPOVA2
  586. LIPOV2(I1)=MPOVA2
  587. SEGINI,MSOUP3=MSOUPO
  588. MCHPO3.IPCHP(ISOUPO)=MSOUP3
  589. SEGINI,MPOVA3=MPOVAL
  590. MSOUP3.IPOVAL=MPOVA3
  591. LIPOV3(I1)=MPOVA3
  592. ENDDO
  593.  
  594.  
  595. C==== CHARGEMENT DU TABLEAU DE TRAVAIL =================================
  596.  
  597. C creation du tableau de travail pour ce MSOUPO
  598. NCOU=NPOINT
  599. NDDL=N*NC
  600. SEGINI MTRAV3
  601.  
  602. C boucle sur les pas de temps = boucle sur les chpoints
  603. DO 720 I=1,IND1
  604. C => pour ce MSOUPO, boucle sur les pas de temps = boucle sur les MPOVAL
  605. MPOVAL=LIPOV(I)
  606. C boucle sur les ddls = boucle sur sur les composantes + noeuds
  607. IDDL=0
  608. C boucle sur les composantes
  609. DO 730 IC=1,NC
  610. C boucle sur les noeuds
  611. DO 731 IN=1,N
  612. IDDL=IDDL+1
  613. XXX(I,IDDL)= VPOCHA(IN,IC)
  614. 731 CONTINUE
  615. 730 CONTINUE
  616. c IF(IIMPI.EQ.1)
  617. c & write(ioimp,*) 'XXX(',I,')=',(XXX(I,iou),iou=1,IDDL)
  618. 720 CONTINUE
  619. C On ne complete pas avec des 0 (inutile apres SEGINI MTRAV3)
  620.  
  621. C==== CALCUL DE LA FFT =================================================
  622.  
  623. c boucle sur les ddls
  624. IDDL=0
  625. DO 740 IC=1,NC
  626. DO 741 IN=1,N
  627. IDDL=IDDL+1
  628. IF(IIMPI.EQ.1) WRITE(IOIMP,*)' CALCUL DE LA FFT DU SIGNAL ',IDDL
  629. CALL FFTL(XXX(1,IDDL),YYY(1),W(1),NPOINT)
  630. 741 CONTINUE
  631. 740 CONTINUE
  632. IF(IIMPI.EQ.1) WRITE(IOIMP,*)' FFT CALCULEE '
  633. C
  634. C==== REMPLISSAGE DES LISTES DE CHPOINTS DE LA FFT =====================
  635. C
  636. C creation de la liste des frequences
  637. IF(ISOUPO.eq.1) THEN
  638. JG=NNN
  639. SEGINI MLREE1
  640. ENDIF
  641.  
  642. IF(IIMPI.EQ.1) WRITE(IOIMP,*)' SORTIE DE ',NNN,' POINTS '
  643.  
  644. IF(ISORT.EQ.1) THEN
  645. C
  646. C SORTIE EN PARTIE REELLE & IMAGINAIRE / FREQUENCE
  647. C
  648. c Boucle sur les frequences = sur les chpoints
  649. DO 750 I=KDEBU,KHALF
  650. FREQ=REAL(I-1)*DFREQ
  651. c IF(IIMPI.EQ.1) write(ioimp,*) I,' FREQ=',FREQ
  652. c IF(IIMPI.EQ.1)
  653. c & write(ioimp,*)'XXX(',I,')=',(XXX(I,iou),iou=1,IDDL)
  654. ITY=I-KDEBU+1
  655. IF(ISOUPO.eq.1) MLREE1.PROG(ITY)=FREQ
  656. MPOVA2=LIPOV2(ITY)
  657. MPOVA3=LIPOV3(ITY)
  658. C boucle sur les ddls = boucle sur sur les composantes + noeuds
  659. IDDL=0
  660. C boucle sur les composantes
  661. DO 760 IC=1,NC
  662. C boucle sur les noeuds
  663. DO 761 IN=1,N
  664. IDDL=IDDL+1
  665. MPOVA2.VPOCHA(IN,IC)=DT*CXTORE(XXX(I,IDDL))
  666. MPOVA3.VPOCHA(IN,IC)=DT*CXTOIM(XXX(I,IDDL))
  667. 761 CONTINUE
  668. 760 CONTINUE
  669.  
  670. 750 CONTINUE
  671.  
  672. ELSE
  673. C
  674. C SORTIE EN MODULE & PHASE / FREQUENCE
  675. C
  676. ENDIF
  677.  
  678. C SUPPRESSION
  679. SEGSUP,MTRAV3
  680. IF(ISOUPO.LT.NSOUPO) GOTO 710
  681. C ici, on boucle sur les SOUPO...
  682.  
  683. C
  684. C==== DESACTIVATION ET ECRITURE DES LISTCHPOINT ET LISTREEL ============
  685. C
  686. IF(IIMPI.EQ.1) WRITE(IOIMP,*)'NETTOYAGE'
  687. SEGSUP MTRAV2
  688. SEGSUP LIPOV,LIPOV2,LIPOV3
  689. SEGDES MLCHPO,MLCHP2,MLCHP3,MLREE1
  690. CALL ECROBJ('LISTREEL',MLREE1)
  691. CALL ECROBJ('LISTCHPO',MLCHP3)
  692. CALL ECROBJ('LISTCHPO',MLCHP2)
  693.  
  694. 777 CONTINUE
  695. RETURN
  696. END
  697.  
  698.  
  699.  
  700.  
  701.  

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