Skip to content

File abstractfield.h

File List > code_source > templat > include > TempLat > lattice > field > abstractfield.h

Go to the documentation of this file

#ifndef TEMPLAT_LATTICE_FIELD_ABSTRACTFIELD_H
#define TEMPLAT_LATTICE_FIELD_ABSTRACTFIELD_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): Adrien Florio, Franz R. Sattler, Year: 2025

#include "TempLat/lattice/algebra/spacestateinterface.h"
#include "TempLat/lattice/latticeparameters.h"
#include "TempLat/lattice/memory/memorylayoutstate.h"
#include "TempLat/lattice/memory/memorymanager.h"
#include "TempLat/lattice/memory/memorytoolbox.h"

#include "TempLat/lattice/algebra/helpers/getderiv.h"

namespace TempLat
{

  MakeException(FieldValueGetterException);

  enum CANONICALTYPE { AMPLITUDE, MOMENTUM };

  template <typename T, size_t _NDim> class AbstractField
  {
  public:
    // Put public methods here. These should change very little over time.

    static constexpr size_t NDim = _NDim;

    AbstractField(std::string name, device::memory::host_ptr<MemoryToolBox<NDim>> toolBox, LatticeParameters<T> pLatPar)
        : mToolBox(toolBox), mManager(mToolBox, name), latPar(pLatPar)
    {
    }

    inline void confirmSpace(const LayoutStruct<NDim> &newLayout, const SpaceStateType &spaceType) const
    {
      switch (spaceType) {
      case SpaceStateType::Fourier:
        mManager->confirmFourierSpace();
        break;
      case SpaceStateType::Configuration:
      default:
        mManager->confirmConfigSpace();
        break;
      }
    }

    device::memory::host_ptr<MemoryToolBox<NDim>> getToolBox() const { return mToolBox; }

    device::Idx confirmGhostsUpToDate() const { return this->mManager->confirmGhostsUpToDate(); }

    // Mostly for testing purpose

    bool isConfigSpace() const { return mManager->isConfigSpace(); }

    bool isFourierSpace() const { return mManager->isFourierSpace(); }

    void setGhostsAreStale() const { mManager->setGhostsAreStale(); }
    bool areGhostsStale() const { return mManager->areGhostsStale(); }

    device::memory::host_ptr<MemoryManager<T, NDim>> getMemoryManager() const { return mManager; }

    auto getDx() const { return latPar.getDx(); }
    auto getKIR() const { return latPar.getKIR(); }
    auto getLatParams() const { return latPar; }

  protected:
    /* Put all member variables and private methods here. These may change arbitrarily. */

    device::memory::host_ptr<MemoryToolBox<NDim>> mToolBox;
    device::memory::host_ptr<MemoryManager<T, NDim>> mManager;

    const LatticeParameters<T> latPar; // Information about the lattice (dx, kir...)
                                       // Conceptually not amazing but really useful.
  };
} // namespace TempLat

#endif