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