Skip to content

File fftlibraryinterface.h

File List > code_source > templat > include > TempLat > fft > fftlibraryinterface.h

Go to the documentation of this file

#ifndef TEMPLAT_FFT_FFTLIBRARYINTERFACE_H
#define TEMPLAT_FFT_FFTLIBRARYINTERFACE_H

/* This file is part of TempLat, available at https://cosmolattice.github.io/templat .
   Copyright 2021-2026 The TempLat authors, see AUTHORS.md.
   Released under the MIT license, see LICENSE.md. */

// File info: Main contributor(s): Wessel Valkenburg, Year: 2019

#include "TempLat/lattice/memory/memorylayouts/fftlayoutstruct.h"

#include "TempLat/lattice/memory/memoryblock.h"
#include "TempLat/parallel/mpi/cartesian/mpicartesiangroup.h"
namespace TempLat
{

  class FFTSessionGuard
  {
  public:
    virtual ~FFTSessionGuard() = default;
  };

  template <typename T, size_t NDim> class FFTPlanInterface
  {
  public:
    /* virtual desctructor can not be abstract: https://stackoverflow.com/a/13444839/2295722 */
    virtual ~FFTPlanInterface() = default;
    virtual void c2r(MemoryBlock<T, NDim> &mBlock) = 0;
    virtual void r2c(MemoryBlock<T, NDim> &mBlock) = 0;
  };

  template <size_t NDim> class FFTLibraryInterface
  {
  public:
    // Put public methods here. These should change very little over time.
    FFTLibraryInterface() = default;
    virtual ~FFTLibraryInterface() = default;

    virtual device::Idx getMaximumNumberOfDimensionsToDivide(device::Idx nDimensions) = 0;

    virtual IntrinsicScales getIntrinsicRescaleToGetUnnormalizedFFT(device::Idx nGridPoints) = 0;

    virtual FFTLayoutStruct<NDim> computeLocalSizes(MPICartesianGroup group, device::IdxArray<NDim> nGridPoints,
                                                    bool forbidTransposition = false) = 0;

    virtual void setPlannerPatience(int level) = 0;

    virtual std::shared_ptr<FFTPlanInterface<float, NDim>> getPlans_float(const MPICartesianGroup &group,
                                                                          const FFTLayoutStruct<NDim> &layout) = 0;
    virtual std::shared_ptr<FFTPlanInterface<double, NDim>> getPlans_double(const MPICartesianGroup &group,
                                                                            const FFTLayoutStruct<NDim> &layout) = 0;
  };

} // namespace TempLat

#endif