*** JMFFT 8.1 - émulation des FFTs de la SciLib de CRAY - (c) CNRS/IDRIS ***
NOM
CCFFTM - Applique une Transformée de Fourier rapide (FFT) multiple
complexe-complexe.
SYNTAXE
CALL CCFFTM (isign, n, lot, scale, x, ldx, y, ldy, table, work, isys)
IMPLEMENTATION
Ce sous-programme émule le sous-programme de même nom de la SCILIB de
CRAY. Tous les arguments réels ou complexes doivent être déclarés
en double précision.
DESCRIPTION
CCFFTM calcule la FFT de chaque colonne de la matrice complexe X, et retourne
le résultat dans une colonne de la matrice complexe Y.
Soient deux tableaux X et Y dimensionnés de la façon suivante :
COMPLEX(KIND=8), DIMENSION(0:ldx-1, 0:lot-1) :: X
COMPLEX(KIND=8), DIMENSION(0:ldy-1, 0:lot-1) :: Y
avec ldx >= n et ldy >= n.
Selon la formule suivante, la colonne L du tableau Y est la FFT
de la colonne L du tableau X :
n-1
Y(k, L) = scale * Sum [ X(j)*w**(isign*j*k) ]
j=0
pour k = 0, ..., n-1
L = 0, ..., lot-1
où,
w = exp(2*pi*i/n),
i = + sqrt(-1),
pi = 3.14159...,
isign = +1 ou -1
lot = nombre de colonne à transformer
En général, si une FFT est appliquée avec des valeurs particulières de
isign et scale, alors son inverse est calculée avec les valeurs -isign
et 1/(n*scale).
En particulier, avec les valeurs isign = +1 et scale = 1.0, la FFT
inverse se calcule en prenant isign = -1 et scale = 1.0/n
ARGUMENTS
isign Scalaire du type INTEGER. (entrée)
Indique si la table des coefficients doit être initialisée ou s'il faut
appliquer une FFT ou son inverse.
Si isign = 0, le sous-programme initialise le tableau table et
retourne sa valeur. Dans ce cas, seuls les arguments isign, n et
table sont vérifés et utilisés.
Si isign = +1 ou -1, la FFT ou son inverse est appliquée.
n Scalaire du type INTEGER. (entrée).
Longueur de chaque colonne à transformer.
C'est aussi la première dimension des matrices x et y. n > 0.
lot Scalaire du type INTEGER. (entrée).
Nombre de transmormée à calculer.
C'est aussi la deuxième dimension des matrices x et y. lot > 0.
scale Scalaire du type REAL(KIND=8). (entrée)
Facteur d'échelle. Chaque élément du vecteur y est multiplié par
scale une fois la FFT effectuée ainsi qu'il est spécifié dans la
formule ci-dessus.
x Tableau du type COMPLEX(KIND=8) de dimension (0:ldx-1, 0:lot-1). (entrée)
Tableau contenant la valeurs des éléments à transformer.
ldx Scalaire du type INTEGER. (entrée).
Nombre de lignes déclarés dans le tableau x. ldx >= max(n, 1).
y Tableau du type COMPLEX(KIND=8) de dimension (0:ldy-1, 0:lot-1). (sortie)
Tableau contenant en sortie les valeurs transformées. On peut
utiliser le tableau d'entrée x. Dans ce cas, ldx = ldy.
ldy Scalaire du type INTEGER. (entrée).
Nombre de lignes déclarés dans le tableau y. ldx >= max(n, 1).
table Tableau du type REAL(KIND=8) de dimension 100 + 2*n. (entrée ou sortie)
Tableau contenant la table des coefficients et des fonctions
trigonométriques.
Si isign = 0, le sous-programme initialise table (table est en
sortie seulement).
Si isign = +1 ou -1, table est supposé être déja initialisé
(table est en entrée seulement).
work Tableau du type REAL(KIND=8) de dimension 4*lot*n.
Tableau de travail.
isys Scalaire du type INTEGER. (entrée)
Cet argument n'est pas utilisé. Il est conservé pour des raisons
de compatibilité avec la SCILIB de CRAY.
EXEMPLES
Exemple 1 : initialise le tableau TABLE dans le but d'appliquer
ultérieurement une FFT de dimension N=128. Dans ce cas, seuls les
arguments ISIGN, N et TABLE sont utilisés.
REAL(KIND=8), DIMENSION(100 + 2*128) :: TABLE
CALL CCFFTM(0, 128, 0, 0.d0, DUMMY, 1, DUMMY, 1, TABLE, DUMMY, 0)
Exemple 2 : X et Y sont des tableaux déclarés du type complexe et de
dimensions (0:128,0:55). Nous appliquons une FFT sur les 128
premiers éléments de chaque colonne. Nous réalisons une FFT sur les 50
premières colonnes de X. Le résultat sera enregistré dans les 50
premières colonnes de Y. Avant d'appliquer la FFT, nous initialisons le
tableau TABLE comme dans l'exemple 1.
COMPLEX(KIND=8), DIMENSION(0:128, 0:55) :: X
COMPLEX(KIND=8), DIMENSION(0:128, 0:55) :: Y
REAL(KIND=8), DIMENSION(100 + 2*128) :: TABLE
REAL(KIND=8), DIMENSION(4*128*50) :: WORK
...
CALL CCFFTM(0, 128, 50, 1.d0, X, 129, Y, 129, TABLE, WORK, 0)
CALL CCFFTM(1, 128, 50, 1.d0, X, 129, Y, 129, TABLE, WORK, 0)
Exemple 3 : ici nous poursuivons l'exemple 2 en affectuant la FFT inverse
de Y et en enregistrant le résultat dans X. Le facteur d'échelle est
ici égale à 1/128. Nous supposons que le tableau TABLE ait été initialisé
auparavant.
CALL CCFFTM(-1, 128, 50, 1.d0/128.d0, Y, 129, X, 129, TABLE,WORK,0)
Exemple 4 : nous effectuons ici un calcul analogue à celui de l'exemple 2
en supposant toutefois que les indices des tableaux X et Y démarrent à 1
et non plus à 0.
COMPLEX(KIND=8), DIMENSION(129, 55) :: X
COMPLEX(KIND=8), DIMENSION(129, 55) :: Y
...
CALL CCFFTM(0, 128, 50, 1.d0, X, 129, Y, 129, TABLE, WORK, 0)
CALL CCFFTM(1, 128, 50, 1.d0, X, 129, Y, 129, TABLE, WORK, 0)
Exemple 5 : calcul semblable à l'exemple 4 sauf qu'ici nous utilisons X à
la fois en entrée et en sortie. Nous supposons que le tableau TABLE ait
été initialisé auparavant.
COMPLEX(KIND=8), DIMENSION(129, 55) :: X
...
CALL CCFFTM(1, 128, 50, 1.d0, X, 129, X, 129, TABLE, WORK, 0)
VOIR AUSSI
CCFFT, SCFFT, SCFFTM