Commit c9131cf1 authored by Steven J. Plimpton's avatar Steven J. Plimpton
Browse files

drop FFTW2 support, and change doc pages

parent 023c8e5d
Loading
Loading
Loading
Loading
+9 −23
Original line number Diff line number Diff line
@@ -33,27 +33,25 @@ LAMMPS can use them if they are available on your system.

[CMake variables]:

-D FFT=value              # KISS or FFTW3 or FFTW2 or MKL, default is FFTW3 if found, else KISS
-D FFT=value              # FFTW3 or MKL or KISS, default is FFTW3 if found, else KISS
-D FFT_SINGLE=value       # yes or no (default), no = double precision
-D FFT_PACK=value         # array (default) or pointer or memcpy :pre

NOTE: The values for the FFT variable must be in upper-case.
This is an exception to the rule that all CMake variables can
be specified with lower-case values.
NOTE: The values for the FFT variable must be in upper-case.  This is
an exception to the rule that all CMake variables can be specified
with lower-case values.

Usually these settings are all that is needed.  If CMake cannot find
the FFT library, you can set these variables:

-D FFTW3_INCLUDE_DIRS=path  # path to FFTW3 include files
-D FFTW3_LIBRARIES=path     # path to FFTW3 libraries
-D FFTW2_INCLUDE_DIRS=path  # ditto for FFTW2
-D FFTW2_LIBRARIES=path
-D MKL_INCLUDE_DIRS=path    # ditto for Intel MKL library
-D MKL_LIBRARIES=path :pre

[Makefile.machine settings]:

FFT_INC = -DFFT_FFTW3         # -DFFT_FFTW3, -DFFT_FFTW2, -DFFT_FFTW (same as -DFFT_FFTW3), -DFFT_MKL, or -DFFT_KISS
FFT_INC = -DFFT_FFTW3         # -DFFT_FFTW3, -DFFT_FFTW (same as -DFFT_FFTW3), -DFFT_MKL, or -DFFT_KISS
                              # default is KISS if not specified
FFT_INC = -DFFT_SINGLE        # do not specify for double precision
FFT_INC = -DFFT_PACK_ARRAY    # or -DFFT_PACK_POINTER or -DFFT_PACK_MEMCPY :pre
@@ -63,8 +61,6 @@ FFT_INC = -I/usr/local/include
FFT_PATH =      -L/usr/local/lib
FFT_LIB =	-lfftw3             # FFTW3 double precision
FFT_LIB =	-lfftw3 -lfftw3f    # FFTW3 single precision
FFT_LIB =	-lfftw              # FFTW2 double precision, or -ldfftw
FFT_LIB =	-lsfftw             # FFTW2 single precision
FFT_LIB =       -lmkl_intel_lp64 -lmkl_sequential -lmkl_core  # MKL with Intel compiler
FFT_LIB =       -lmkl_gf_lp64 -lmkl_sequential -lmkl_core     # MKL with GNU compier :pre

@@ -89,12 +85,8 @@ details.

FFTW is a fast, portable FFT library that should also work on any
platform and can be faster than the KISS FFT library.  You can
download it from "www.fftw.org"_http://www.fftw.org.  Both the
(obsolete) legacy version 2.1.X and the newer 3.X versions are
supported.

NOTE: FFTW2 has not been updated since 1999 and has been declared
obsolete by its developers.
download it from "www.fftw.org"_http://www.fftw.org.  LAMMPS requires
version 3.X; the legacy version 2.1.X is no longer supported.

Building FFTW for your box should be as simple as ./configure; make;
make install.  The install command typically requires root privileges
@@ -116,8 +108,8 @@ error is less than the difference in precision. Using the -DFFT_SINGLE
setting trades off a little accuracy for reduced memory use and
parallel communication costs for transposing 3d FFT data.

When using -DFFT_SINGLE with FFTW3 or FFTW2, you may need to build the
FFTW library a second time with support for single-precision.
When using -DFFT_SINGLE with FFTW3 you may need to build the FFTW
library a second time with support for single-precision.

For FFTW3, do the following, which should produce the additional
library libfftw3f.a
@@ -125,12 +117,6 @@ library libfftw3f.a
make clean
./configure --enable-single; make; make install :pre

For FFTW2, do the following, which should produce the additional
library libsfftw.a

make clean
./configure --enable-float --enable-type-prefix; make; make install :pre

Performing 3d FFTs requires communication to transpose the 3d FFT
grid.  The data packing/unpacking for this can be done in one of 3
modes (ARRAY, POINTER, MEMCPY) as set by the FFT_PACK syntax above.
+13 −1
Original line number Diff line number Diff line
@@ -104,11 +104,13 @@ void fft_3d(FFT_DATA *in, FFT_DATA *out, int flag, struct fft_plan_3d *plan)
    DftiComputeForward(plan->handle_fast,data);
  else
    DftiComputeBackward(plan->handle_fast,data);
  /*
#elif defined(FFT_FFTW2)
  if (flag == -1)
    fftw(plan->plan_fast_forward,total/length,data,1,length,NULL,0,0);
  else
   fftw(plan->plan_fast_backward,total/length,data,1,length,NULL,0,0);
  */
#elif defined(FFT_FFTW3)
  if (flag == -1)
    theplan=plan->plan_fast_forward;
@@ -143,11 +145,13 @@ void fft_3d(FFT_DATA *in, FFT_DATA *out, int flag, struct fft_plan_3d *plan)
    DftiComputeForward(plan->handle_mid,data);
  else
    DftiComputeBackward(plan->handle_mid,data);
  /*
#elif defined(FFT_FFTW2)
  if (flag == -1)
    fftw(plan->plan_mid_forward,total/length,data,1,length,NULL,0,0);
  else
    fftw(plan->plan_mid_backward,total/length,data,1,length,NULL,0,0);
  */
#elif defined(FFT_FFTW3)
  if (flag == -1)
    theplan=plan->plan_mid_forward;
@@ -182,11 +186,13 @@ void fft_3d(FFT_DATA *in, FFT_DATA *out, int flag, struct fft_plan_3d *plan)
    DftiComputeForward(plan->handle_slow,data);
  else
    DftiComputeBackward(plan->handle_slow,data);
  /*
#elif defined(FFT_FFTW2)
  if (flag == -1)
    fftw(plan->plan_slow_forward,total/length,data,1,length,NULL,0,0);
  else
    fftw(plan->plan_slow_backward,total/length,data,1,length,NULL,0,0);
  */
#elif defined(FFT_FFTW3)
  if (flag == -1)
    theplan=plan->plan_slow_forward;
@@ -520,6 +526,7 @@ struct fft_plan_3d *fft_3d_create_plan(
      (out_khi-out_klo+1);
  }

  /*
#elif defined(FFT_FFTW2)

  plan->plan_fast_forward =
@@ -561,6 +568,7 @@ struct fft_plan_3d *fft_3d_create_plan(
    plan->normnum = (out_ihi-out_ilo+1) * (out_jhi-out_jlo+1) *
      (out_khi-out_klo+1);
  }
  */

#elif defined(FFT_FFTW3)
  plan->plan_fast_forward =
@@ -660,6 +668,7 @@ void fft_3d_destroy_plan(struct fft_plan_3d *plan)
  DftiFreeDescriptor(&(plan->handle_fast));
  DftiFreeDescriptor(&(plan->handle_mid));
  DftiFreeDescriptor(&(plan->handle_slow));
  /*
#elif defined(FFT_FFTW2)
  if (plan->plan_slow_forward != plan->plan_fast_forward &&
      plan->plan_slow_forward != plan->plan_mid_forward) {
@@ -672,6 +681,7 @@ void fft_3d_destroy_plan(struct fft_plan_3d *plan)
  }
  fftw_destroy_plan(plan->plan_fast_forward);
  fftw_destroy_plan(plan->plan_fast_backward);
  */
#elif defined(FFT_FFTW3)
  FFTW_API(destroy_plan)(plan->plan_slow_forward);
  FFTW_API(destroy_plan)(plan->plan_slow_backward);
@@ -809,6 +819,7 @@ void fft_1d_only(FFT_DATA *data, int nsize, int flag, struct fft_plan_3d *plan)
    DftiComputeBackward(plan->handle_mid,data);
    DftiComputeBackward(plan->handle_slow,data);
  }
  /*
#elif defined(FFT_FFTW2)
  if (flag == -1) {
    fftw(plan->plan_fast_forward,total1/length1,data,1,0,NULL,0,0);
@@ -819,6 +830,7 @@ void fft_1d_only(FFT_DATA *data, int nsize, int flag, struct fft_plan_3d *plan)
    fftw(plan->plan_mid_backward,total2/length2,data,1,0,NULL,0,0);
    fftw(plan->plan_slow_backward,total3/length3,data,1,0,NULL,0,0);
  }
  */
#elif defined(FFT_FFTW3)
  FFTW_API(plan) theplan;
  if (flag == -1)
+22 −22
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ typedef float FFT_SCALAR;
typedef double FFT_SCALAR;
#endif

// set default fftw library. switch to FFT_FFTW3 when convenient.
// if user set FFTW, it means FFTW3

#ifdef FFT_FFTW
#define FFT_FFTW3
@@ -41,13 +41,13 @@ typedef double FFT_SCALAR;
typedef float _Complex FFT_DATA;
#define FFT_MKL_PREC DFTI_SINGLE

#elif defined(FFT_FFTW2)
#if defined(FFTW_SIZE)
#include "sfftw.h"
#else
#include "fftw.h"
#endif
typedef FFTW_COMPLEX FFT_DATA;
//#elif defined(FFT_FFTW2)
//#if defined(FFTW_SIZE)
//#include "sfftw.h"
//#else
//#include "fftw.h"
//#endif
//typedef FFTW_COMPLEX FFT_DATA;

#elif defined(FFT_FFTW3)
#include "fftw3.h"
@@ -82,13 +82,13 @@ typedef struct kiss_fft_state* kiss_fft_cfg;
typedef double _Complex FFT_DATA;
#define FFT_MKL_PREC DFTI_DOUBLE

#elif defined(FFT_FFTW2)
#if defined(FFTW_SIZE)
#include "dfftw.h"
#else
#include "fftw.h"
#endif
typedef FFTW_COMPLEX FFT_DATA;
//#elif defined(FFT_FFTW2)
//#if defined(FFTW_SIZE)
//#include "dfftw.h"
//#else
//#include "fftw.h"
//#endif
//typedef FFTW_COMPLEX FFT_DATA;

#elif defined(FFT_FFTW3)
#include "fftw3.h"
@@ -139,13 +139,13 @@ struct fft_plan_3d {
  DFTI_DESCRIPTOR *handle_fast;
  DFTI_DESCRIPTOR *handle_mid;
  DFTI_DESCRIPTOR *handle_slow;
#elif defined(FFT_FFTW2)
  fftw_plan plan_fast_forward;
  fftw_plan plan_fast_backward;
  fftw_plan plan_mid_forward;
  fftw_plan plan_mid_backward;
  fftw_plan plan_slow_forward;
  fftw_plan plan_slow_backward;
//#elif defined(FFT_FFTW2)
//  fftw_plan plan_fast_forward;
//  fftw_plan plan_fast_backward;
//  fftw_plan plan_mid_forward;
//  fftw_plan plan_mid_backward;
//fftw_plan plan_slow_forward;
//fftw_plan plan_slow_backward;
#elif defined(FFT_FFTW3)
  FFTW_API(plan) plan_fast_forward;
  FFTW_API(plan) plan_fast_backward;