Turing : la bibliothèque FFTW

Description

FFTW est une bibliothèque de FFT 1D, 2D et 3D scalaire et parallèle.

Versions installées

  • FFTW 2.1.5
  • FFTW 3.2.2
  • FFTW 3.3.2
  • FFTW 3.3.3 (version par défaut)

Caractéristiques

  • la version 2.1.5 est parallélisée MPI; elle est aussi monoprocesseur et multithreadée.
    Attention : cette ancienne version (plus de 10 ans) n'est PAS compatible avec les versions suivantes.
  • la version 3.2.2 n'est pas parallélisée MPI; elle est uniquement monoprocesseur et multithreadée.
  • les versions 3.3.2 et 3.3.3 sont parallélisées MPI et multithreadée (pthreads et OpenMP). De plus, elles intègrent une nouvelle interface Fortran 2003.

Utilisation

La commande module permet d'accéder aux différentes versions. Pour utiliser la version par défaut, il suffit de taper :

$ module load fftw
$ mpixlf95_r mon_code_fftw.f90

Pour compiler avec une version spécifique :

$ module load fftw/3.3.3
$ mpixlf95_r mon_code_fftw.f90

Exemple

fftw_1d_f2003.f90
module FFTW3
  use, intrinsic :: iso_c_binding
  include 'fftw3.f03'
end module FFTW3
 
program fftw_1d
 
  use FFTW3
  implicit none
  integer(kind=C_INT), parameter  :: n = 16
  complex(kind=C_DOUBLE_COMPLEX), dimension(n)  :: in, out
  type(C_PTR) :: p, p2
  integer i,j
  real fact
 
  do i=1,N
     j=i-1
     in(i)=cmplx(j*j,1)
  enddo
 
  write(*,*)"create plans"
 
  p  = fftw_plan_dft_1d(N,in,out,FFTW_FORWARD,FFTW_ESTIMATE)
  p2 = fftw_plan_dft_1d(N,in,out,FFTW_BACKWARD,FFTW_ESTIMATE)
 
  write(*,*)"do it"
 
  call fftw_execute_dft(p, in, out)
  do i=1,N
     write(*,"(f12.4,1x,f12.4)")out(i)
  enddo
 
  write(*,*)
  write(*,*)"undo it"
 
  call fftw_execute_dft(p2, out,in)
  fact=1.0/N
  do i=1,N
     write(*,"(f10.2,1x,f10.2)")in(i)*fact
  enddo
 
  write(*,*)"clean up"
  call fftw_destroy_plan(p)
  call fftw_destroy_plan(p2)
 
end program fftw_1d
$ module load fftw
$ mpixlf90_r fftw_1d_f2003.f90

Remarque

Le type fftw_plan figurant dans les arguments d'appel des routines correspond à une adresse C; ce type doit être explicitement codé en Fortran INTEGER(kind=8) ou plus rigoureusement type(C_PTR) en utilisant l'interface Fortran 2003 comme dans l'exemple ci-dessus.

Documentation