Program Listing for File eqdsk_field.h

↰ Return to documentation for file (src/pcms/field/eqdsk_field.h)

#ifndef PCMS_EQDSK_FIELD_H
#define PCMS_EQDSK_FIELD_H

#include "pcms/utility/eqdsk.h"
#include "pcms/field/layout/uniform_grid.h"
#include "pcms/field/function_space/spline.h"

#include <string>
#include "pcms/field/coordinate_systems/cylindrical.hpp"

namespace pcms
{

struct EQDSKField
{
  std::shared_ptr<SplineFunctionSpace> space;
  Field<Real> field;
};

// TODD: @jacobmerson replace with Function.
struct EQDSKFieldWithData
{
  EQDSKData data;
  std::shared_ptr<SplineFunctionSpace> space;
  Field<Real> field;
};

inline EQDSKField MakeEQDSKField(const EQDSKData& eqdsk_data)
{
  // EQDSK is a poloidal plane in cylindrical RZ coordinates
  auto space = SplineFunctionSpace::FromUniformGrid(
    eqdsk_data.grid, csys::CylindricalRZ::Create());
  Field<Real> field = space->CreateFunction<Real>();
  field.SetDOFHolderDataUnchecked(Rank2View<const Real, DeviceMemorySpace>(
    eqdsk_data.PSIZR.data(), eqdsk_data.PSIZR.extent(0), 1));
  return {std::move(space), std::move(field)};
}

inline EQDSKFieldWithData MakeEQDSKField(const std::string& filename)
{
  auto eqdsk_data = EQDSKData(filename);
  auto [space, field] = MakeEQDSKField(eqdsk_data);
  return {std::move(eqdsk_data), std::move(space), std::move(field)};
}

} // namespace pcms

#endif // PCMS_EQDSK_FIELD_H