2017-07-04 3 views
1

Je veux utiliser le système de sagesse FFTW pour me souvenir des plans FFTW entre les travaux. L'utilisation de la sagesse d'un programme C est documentée ici: http://www.fftw.org/fftw2_doc/fftw_2.html Pour C, la chaîne pertinente serait modifiée à FFTW_MEASURE | FFTW_USE_WISDOM. J'ai essayé d'imiter ce ici:Comment utiliser la sagesse FFTW du Fortran moderne

!! to compile: gfortran -O3 --fast-math -I/usr/include -o usewisdom usewisdom.f90 -lfftw3 
Module FFTW3 
    use, intrinsic :: iso_c_binding 
    include 'fftw3.f03' 
End Module FFTW3 

Program usewisdom 
    use FFTW3 
    integer (kind=c_int), parameter :: nx=2048,ny=2048,np=ny/2+1 
    real (kind=c_double) :: omega(ny,nx)=1.d0 
    complex (kind=c_double_complex) :: fftomega(np,nx) 
    ier=fftw_import_wisdom_from_filename("wisdom") 
    print *,"wisdom output should not be 0:",ier 
    call dfftw_plan_dft_r2c_2d(fwd,ny,nx,omega,fftomega,& 
     &FFTW_PATIENT | FFTW_USE_WISDOM) 
    call dfftw_execute_dft_r2c(fwd,omega,fftomega) !rem clobbers omega 

End Program usewisdom 

mais gfortran n'aime pas la chaîne:

gfortran -O3 --fast-math -I/usr/include -o usewisdom usewisdom.f90 -lfftw3 
usewisdom.f90:16:21: 

    &FFTW_PATIENT | FFTW_USE_WISDOM) 
       1 
Error: Syntax error in argument list at (1) 

Toutes les suggestions?

+0

vous utilisez FFTW3 pendant que vous suivez la documentation de FFTW2 !! . –

+0

@ M.Chinoune des suggestions sur la façon dont cela devrait être fait dans FFTW3? –

+0

Il suffit de suivre la documentation de [FFTW3] (http://www.fftw.org/fftw3_doc/Accessing-the-wisdom-API-from-Fortran.html) –

Répondre

1

Selon le Modern Fortran interface documentation:

Multiple planner flags are combined with ior (equivalent to ‘ | ’ in C). e.g. FFTW_MEASURE | FFTW_DESTROY_INPUT becomes ior(FFTW_MEASURE, FFTW_DESTROY_INPUT) . (You can also use ‘ + ’ as long as you don’t try to include a given flag more than once.)

Vous devriez donc inclure le drapeau planificateur FFTW_USE_WISDOM comme suit:

call dfftw_plan_dft_r2c_2d(fwd,ny,nx,omega,fftomega,& 
    &ior(FFTW_PATIENT, FFTW_USE_WISDOM)) 

ou

call dfftw_plan_dft_r2c_2d(fwd,ny,nx,omega,fftomega,& 
    &FFTW_PATIENT + FFTW_USE_WISDOM) 

Notez qu'une syntaxe similaire pour combiner des drapeaux peut également être utilisé pour Legacy Fortran comme décrit dans this section of the documentation.

+0

Le deuxième formulaire donné dans votre réponse fait l'affaire. La première forme permet gfortran malheureux: « gfortran -O3 --fast-math -I/usr/include -o Newjet newJet.f90 -lfftw3 newJet.f90: 219: 26: & ior (FFTW_PATIENT, FFTW_USE_WISDOM)) Erreur: L'argument 'j' de 'ior' intrinsic at (1) doit être INTEGER –