<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Fortran 3-D FFT real-to-complex and complex-to-real examples in Intel® oneAPI Math Kernel Library</title>
    <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Fortran-3-D-FFT-real-to-complex-and-complex-to-real-examples/m-p/824592#M5047</link>
    <description>&lt;DIV id="_mcePaste"&gt;Hi,&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;I have tried to put together a real-to-complex, complex-to-real Fourier transform with ifort and the MKL library. I found that often the documentation was spotty: for example, there's no example of a back Fourier transform in the documentation or in the forum. I essentially want to use the CCE storage format: there is an option to specify CCE storage, but it can be forced with the strides system.&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;I provide an example of 3-D real-to-complex, and complex-to-real Fourier transforms in Fortran. I obtain similar results with FFTW3. The example is functional, but some updates of the descriptor might be redundant:&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;with the definitions&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;#define WRITE_MKL_DEBUG_INFO(i) IF (i .NE. 0) THEN; IF (.NOT. DftiErrorClass(i,DFTI_NO_ERROR)) THEN; WRITE_DEBUG_INFO; WRITE (0,*) DftiErrorMessage(i); STOP 1; END IF; END IF&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;DIV id="_mcePaste"&gt;#define FFT_FORWARD -1&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;#define FFT_INVERSE=1&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;the FFT subroutine is&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;SUBROUTINE fft3(data,sx1,sx2,sx3,dx1,dx2,dx3,direction)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; REAL*4, DIMENSION(0:*), INTENT(INOUT) :: data&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; REAL*8, INTENT(IN) :: dx1,dx2,dx3&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; INTEGER, INTENT(IN) :: sx1,sx2,sx3,direction&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; INTEGER :: iret,size(3),rstrides(4),cstrides(4)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; TYPE(DFTI_DESCRIPTOR), POINTER :: desc&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; REAL*4 :: scale&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; rstrides=(/ 0,1,sx1+2,(sx1+2)*sx2 /)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; cstrides=(/ 0,1,sx1/2+1,(sx1/2+1)*sx2 /)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; size=(/ sx1,sx2,sx3 /)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; iret=DftiCreateDescriptor(desc,DFTI_SINGLE,DFTI_REAL,3,size)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; iret=DftiSetValue(desc,DFTI_FORWARD_DOMAIN,DFTI_REAL)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; iret=DftiSetValue(desc,DFTI_CONJUGATE_EVEN_STORAGE,DFTI_COMPLEX_COMPLEX)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; iret=DftiSetValue(desc,DFTI_PACKED_FORMAT,DFTI_CCE_FORMAT)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; WRITE_MKL_DEBUG_INFO(iret)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; IF (FFT_FORWARD == direction) THEN&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   scale=dx1*dx2*dx3&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiSetValue(desc,DFTI_FORWARD_SCALE,scale)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiSetValue(desc,DFTI_INPUT_STRIDES,rstrides);&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiSetValue(desc,DFTI_OUTPUT_STRIDES,cstrides);&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiCommitDescriptor(desc)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiComputeForward(desc,data)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; ELSE&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   scale=1._4/(sx1*dx1*sx2*dx2*sx3*dx3)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiSetValue(desc,DFTI_BACKWARD_SCALE,scale)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiSetValue(desc,DFTI_INPUT_STRIDES,cstrides);&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiSetValue(desc,DFTI_OUTPUT_STRIDES,rstrides);&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiCommitDescriptor(desc)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiComputeBackward(desc,data)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; END IF&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; iret=DftiFreeDescriptor(desc)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; WRITE_MKL_DEBUG_INFO(iret)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;END SUBROUTINE fft3&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;and an exert of the makefile:&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;META charset="utf-8" /&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;LIBPATH=-L/sw/lib -L/opt/intel/Compiler/11.1/084/Frameworks/mkl/lib/em64t/ -L/opt/intel/Compiler/11.1/084/lib/&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;INCPATH=-I/sw/include -I/opt/intel/Compiler/11.1/084/Frameworks/mkl/include&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;BR style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" /&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;LIBS=-lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -openmp -lpthread&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;BR style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" /&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;FC=ifort -openmp&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;BR style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" /&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;OBJ = *.o&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;%.o : %.f90&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;   $(FC) $(FFLAGS) -c $^&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;BR style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" /&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;program: $(OBJ)&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;   $(FC) $(FFLAGS) -o $@ $^ $(LIBPATH) $(LIBS)&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;Let me know if the code can be trimmed a bit.&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;Thanks,&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;Sylvain Barbot&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;</description>
    <pubDate>Thu, 06 May 2010 23:56:31 GMT</pubDate>
    <dc:creator>sbarbot</dc:creator>
    <dc:date>2010-05-06T23:56:31Z</dc:date>
    <item>
      <title>Fortran 3-D FFT real-to-complex and complex-to-real examples</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Fortran-3-D-FFT-real-to-complex-and-complex-to-real-examples/m-p/824592#M5047</link>
      <description>&lt;DIV id="_mcePaste"&gt;Hi,&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;I have tried to put together a real-to-complex, complex-to-real Fourier transform with ifort and the MKL library. I found that often the documentation was spotty: for example, there's no example of a back Fourier transform in the documentation or in the forum. I essentially want to use the CCE storage format: there is an option to specify CCE storage, but it can be forced with the strides system.&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;I provide an example of 3-D real-to-complex, and complex-to-real Fourier transforms in Fortran. I obtain similar results with FFTW3. The example is functional, but some updates of the descriptor might be redundant:&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;with the definitions&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;#define WRITE_MKL_DEBUG_INFO(i) IF (i .NE. 0) THEN; IF (.NOT. DftiErrorClass(i,DFTI_NO_ERROR)) THEN; WRITE_DEBUG_INFO; WRITE (0,*) DftiErrorMessage(i); STOP 1; END IF; END IF&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;DIV id="_mcePaste"&gt;#define FFT_FORWARD -1&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;#define FFT_INVERSE=1&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;the FFT subroutine is&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;SUBROUTINE fft3(data,sx1,sx2,sx3,dx1,dx2,dx3,direction)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; REAL*4, DIMENSION(0:*), INTENT(INOUT) :: data&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; REAL*8, INTENT(IN) :: dx1,dx2,dx3&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; INTEGER, INTENT(IN) :: sx1,sx2,sx3,direction&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; INTEGER :: iret,size(3),rstrides(4),cstrides(4)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; TYPE(DFTI_DESCRIPTOR), POINTER :: desc&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; REAL*4 :: scale&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; rstrides=(/ 0,1,sx1+2,(sx1+2)*sx2 /)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; cstrides=(/ 0,1,sx1/2+1,(sx1/2+1)*sx2 /)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; size=(/ sx1,sx2,sx3 /)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; iret=DftiCreateDescriptor(desc,DFTI_SINGLE,DFTI_REAL,3,size)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; iret=DftiSetValue(desc,DFTI_FORWARD_DOMAIN,DFTI_REAL)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; iret=DftiSetValue(desc,DFTI_CONJUGATE_EVEN_STORAGE,DFTI_COMPLEX_COMPLEX)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; iret=DftiSetValue(desc,DFTI_PACKED_FORMAT,DFTI_CCE_FORMAT)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; WRITE_MKL_DEBUG_INFO(iret)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; IF (FFT_FORWARD == direction) THEN&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   scale=dx1*dx2*dx3&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiSetValue(desc,DFTI_FORWARD_SCALE,scale)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiSetValue(desc,DFTI_INPUT_STRIDES,rstrides);&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiSetValue(desc,DFTI_OUTPUT_STRIDES,cstrides);&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiCommitDescriptor(desc)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiComputeForward(desc,data)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; ELSE&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   scale=1._4/(sx1*dx1*sx2*dx2*sx3*dx3)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiSetValue(desc,DFTI_BACKWARD_SCALE,scale)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiSetValue(desc,DFTI_INPUT_STRIDES,cstrides);&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiSetValue(desc,DFTI_OUTPUT_STRIDES,rstrides);&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiCommitDescriptor(desc)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiComputeBackward(desc,data)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; END IF&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; iret=DftiFreeDescriptor(desc)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; WRITE_MKL_DEBUG_INFO(iret)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;END SUBROUTINE fft3&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;and an exert of the makefile:&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;META charset="utf-8" /&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;LIBPATH=-L/sw/lib -L/opt/intel/Compiler/11.1/084/Frameworks/mkl/lib/em64t/ -L/opt/intel/Compiler/11.1/084/lib/&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;INCPATH=-I/sw/include -I/opt/intel/Compiler/11.1/084/Frameworks/mkl/include&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;BR style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" /&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;LIBS=-lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -openmp -lpthread&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;BR style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" /&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;FC=ifort -openmp&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;BR style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" /&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;OBJ = *.o&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;%.o : %.f90&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;   $(FC) $(FFLAGS) -c $^&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;BR style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" /&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;program: $(OBJ)&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;   $(FC) $(FFLAGS) -o $@ $^ $(LIBPATH) $(LIBS)&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;Let me know if the code can be trimmed a bit.&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;Thanks,&lt;/DIV&gt;&lt;DIV style="font-family: verdana, sans-serif; padding: 0px; margin: 0px;" id="_mcePaste"&gt;Sylvain Barbot&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;</description>
      <pubDate>Thu, 06 May 2010 23:56:31 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Fortran-3-D-FFT-real-to-complex-and-complex-to-real-examples/m-p/824592#M5047</guid>
      <dc:creator>sbarbot</dc:creator>
      <dc:date>2010-05-06T23:56:31Z</dc:date>
    </item>
    <item>
      <title>Fortran 3-D FFT real-to-complex and complex-to-real examples</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Fortran-3-D-FFT-real-to-complex-and-complex-to-real-examples/m-p/824593#M5048</link>
      <description>Hi Sylvain,&lt;BR /&gt;&lt;BR /&gt;It looks likeodd sx1 will be mishandled.The following changewould do processing them:&lt;BR /&gt;&lt;TT&gt;&lt;BR /&gt;- rstrides=(/ 0,1,sx1+2,(sx1+2)*sx2 /)&lt;BR /&gt;+ rstrides=(/ 0,1,(sx1/2+1)*2,((sx1/2+1)*2)*sx2 /)&lt;BR /&gt;&lt;BR /&gt;The line setting DFTI_FORWARD_DOMAIN is redundant, and in fact is an error because this parameter is read-only (it is already set by DftiCreateDescriptor). &lt;BR /&gt;&lt;BR /&gt;The line setting DFTI_PACKED_FORMAT is redundant after DFTI_CONJUGATE_EVEN_STORAGE is set to DFTI_COMPLEX_COMPLEX.&lt;BR /&gt;&lt;BR /&gt;Thanks&lt;BR /&gt;Dima&lt;BR /&gt;&lt;/TT&gt;</description>
      <pubDate>Fri, 07 May 2010 03:28:07 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Fortran-3-D-FFT-real-to-complex-and-complex-to-real-examples/m-p/824593#M5048</guid>
      <dc:creator>Dmitry_B_Intel</dc:creator>
      <dc:date>2010-05-07T03:28:07Z</dc:date>
    </item>
    <item>
      <title>Fortran 3-D FFT real-to-complex and complex-to-real examples</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Fortran-3-D-FFT-real-to-complex-and-complex-to-real-examples/m-p/824594#M5049</link>
      <description>Hi Dima,&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;Thanks for your answer. I updated the function as you suggested. Everything works well.&lt;/DIV&gt;&lt;DIV&gt;For completeness, I want to mention that one needs to set the environment variableDYLD_LIBRARY_PATH to&lt;/DIV&gt;&lt;META charset="utf-8" /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;export DYLD_LIBRARY_PATH="/opt/intel/Compiler/11.1/084/lib:$DYLD_LIBRARY_PATH"&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;in order to load the libraries successfully at runtime.I am running the same program under two implementations of the FFT. One is FFTW3 with 16 threads and another is Intel MKL FFT with 16 threads.&lt;/DIV&gt;&lt;DIV&gt;I find a factor of x4 improvement of the Intel FFT over the FFTW3.&lt;/DIV&gt;&lt;DIV&gt;Pretty impressive.&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;I show the updated code for reference. Thank you again. Sylvain&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV id="_mcePaste"&gt;SUBROUTINE fft3(data,sx1,sx2,sx3,dx1,dx2,dx3,direction)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; REAL*4, DIMENSION(0:*), INTENT(INOUT) :: data&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; REAL*8, INTENT(IN) :: dx1,dx2,dx3&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; INTEGER, INTENT(IN) :: sx1,sx2,sx3,direction&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; INTEGER :: iret,size(3),rstrides(4),cstrides(4)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; TYPE(DFTI_DESCRIPTOR), POINTER :: desc&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; REAL*4 :: scale&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; rstrides=(/ 0,1,(sx1/2+1)*2,(sx1/2+1)*2*sx2 /)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; cstrides=(/ 0,1,sx1/2+1,(sx1/2+1)*sx2 /)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; size=(/ sx1,sx2,sx3 /)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; iret=DftiCreateDescriptor(desc,DFTI_SINGLE,DFTI_REAL,3,size)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; iret=DftiSetValue(desc,DFTI_CONJUGATE_EVEN_STORAGE,DFTI_COMPLEX_COMPLEX)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; WRITE_MKL_DEBUG_INFO(iret)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; IF (FFT_FORWARD == direction) THEN&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   scale=dx1*dx2*dx3&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiSetValue(desc,DFTI_FORWARD_SCALE,scale)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiSetValue(desc,DFTI_INPUT_STRIDES,rstrides);&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiSetValue(desc,DFTI_OUTPUT_STRIDES,cstrides);&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiCommitDescriptor(desc)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiComputeForward(desc,data)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; ELSE&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   scale=1._4/(sx1*dx1*sx2*dx2*sx3*dx3)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiSetValue(desc,DFTI_BACKWARD_SCALE,scale)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiSetValue(desc,DFTI_INPUT_STRIDES,cstrides);&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiSetValue(desc,DFTI_OUTPUT_STRIDES,rstrides);&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiCommitDescriptor(desc)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;   iret=DftiComputeBackward(desc,data)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; END IF&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; iret=DftiFreeDescriptor(desc)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; WRITE_MKL_DEBUG_INFO(iret)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;END SUBROUTINE fft3&lt;/DIV&gt;&lt;/DIV&gt;</description>
      <pubDate>Fri, 07 May 2010 18:20:29 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Fortran-3-D-FFT-real-to-complex-and-complex-to-real-examples/m-p/824594#M5049</guid>
      <dc:creator>sbarbot</dc:creator>
      <dc:date>2010-05-07T18:20:29Z</dc:date>
    </item>
  </channel>
</rss>

