9#include <Kokkos_Core.hpp>
26template<
typename ValueType>
29 SurfaceInterpolationFactory<ValueType>,
30 Parameters<const Executor&, const UnstructuredMesh&, const Input&>>
36 static std::unique_ptr<SurfaceInterpolationFactory<ValueType>>
41 (std::holds_alternative<NeoN::Dictionary>(inputs))
42 ? std::get<NeoN::Dictionary>(inputs).get<std::string>(
"surfaceInterpolation")
43 : std::get<NeoN::TokenList>(inputs).next<std::string>();
49 static std::string
name() {
return "SurfaceInterpolationFactory"; }
95 virtual std::unique_ptr<SurfaceInterpolationFactory<ValueType>>
clone()
const = 0;
103template<
typename ValueType>
107 using VectorValueType = ValueType;
112 : exec_(surfInterp.exec_), mesh_(surfInterp.mesh_),
113 interpolationKernel_(surfInterp.interpolationKernel_->clone()) {};
116 : exec_(surfInterp.exec_), mesh_(surfInterp.mesh_),
117 interpolationKernel_(std::move(surfInterp.interpolationKernel_)) {};
124 : exec_(exec), mesh_(mesh), interpolationKernel_(std::move(interpolationKernel)) {};
127 : exec_(exec), mesh_(mesh),
134 interpolationKernel_->interpolate(src, dst);
143 interpolationKernel_->interpolate(flux, src, dst);
148 interpolationKernel_->weight(src,
weight);
157 interpolationKernel_->weight(flux, src,
weight);
160 bool corrected()
const {
return interpolationKernel_->corrected(); }
168 interpolationKernel_->correction(flux, src, corr);
174 std::string nameInterpolated =
"interpolated_" + src.
name;
185 std::string
name =
"interpolated_" + src.
name;
195 std::string
name =
"weight_" + src.
name;
199 weight(src, weightVector);
206 std::string
name =
"weight_" + src.
name;
210 weight(flux, src, weightVector);
218 std::unique_ptr<SurfaceInterpolationFactory<ValueType>> interpolationKernel_;
A factory class for runtime selection of derived classes.
Represents an unstructured mesh in NeoN.
const BoundaryData< ValueType > & boundaryData() const
Returns a const reference to the boundary field.
const Vector< ValueType > & internalVector() const
Returns a const reference to the internal field.
Represents a surface boundary field for a cell-centered finite volume method.
virtual bool corrected() const
virtual void interpolate(const VolumeField< ValueType > &src, SurfaceField< ValueType > &dst) const =0
static std::string name()
const UnstructuredMesh & mesh_
virtual void interpolate(const SurfaceField< scalar > &flux, const VolumeField< ValueType > &src, SurfaceField< ValueType > &dst) const =0
virtual void weight(const VolumeField< ValueType > &src, SurfaceField< scalar > &weight) const =0
virtual void correction(const SurfaceField< scalar > &flux, const VolumeField< ValueType > &src, SurfaceField< ValueType > &corr) const
SurfaceInterpolationFactory(const Executor &exec, const UnstructuredMesh &mesh)
static std::unique_ptr< SurfaceInterpolationFactory< ValueType > > create(const Executor &exec, const UnstructuredMesh &uMesh, const Input &inputs)
virtual ~SurfaceInterpolationFactory()
virtual void weight(const SurfaceField< scalar > &flux, const VolumeField< ValueType > &src, SurfaceField< scalar > &weight) const =0
virtual std::unique_ptr< SurfaceInterpolationFactory< ValueType > > clone() const =0
SurfaceField< scalar > weight(const VolumeField< ValueType > &src) const
SurfaceField< scalar > weight(const SurfaceField< scalar > &flux, const VolumeField< ValueType > &src) const
void interpolate(const VolumeField< ValueType > &src, SurfaceField< ValueType > &dst) const
SurfaceInterpolation(const Executor &exec, const UnstructuredMesh &mesh, const Input &input)
void correction(const SurfaceField< scalar > &flux, const VolumeField< ValueType > &src, SurfaceField< ValueType > &corr) const
void weight(const VolumeField< ValueType > &src, SurfaceField< scalar > &weight) const
SurfaceInterpolation(const Executor &exec, const UnstructuredMesh &mesh, std::unique_ptr< SurfaceInterpolationFactory< ValueType > > interpolationKernel)
SurfaceInterpolation(SurfaceInterpolation &&surfInterp)
SurfaceInterpolation(const SurfaceInterpolation &surfInterp)
void weight(const SurfaceField< scalar > &flux, const VolumeField< ValueType > &src, SurfaceField< scalar > &weight) const
SurfaceField< ValueType > interpolate(const SurfaceField< ValueType > &flux, const VolumeField< ValueType > &src) const
void interpolate(const SurfaceField< scalar > &flux, const VolumeField< ValueType > &src, SurfaceField< ValueType > &dst) const
SurfaceField< ValueType > interpolate(const VolumeField< ValueType > &src) const
Represents a volume field in a finite volume method.
std::vector< BoundaryType > createCalculatedBCs(const UnstructuredMesh &mesh)
std::variant< Dictionary, TokenList > Input
std::variant< SerialExecutor, CPUExecutor, GPUExecutor > Executor
const std::string & name(const NeoN::Document &doc)
Retrieves the name of a Document.
void fill(ContType< ValueType > &cont, const std::type_identity_t< ValueType > value, std::pair< localIdx, localIdx > range={0, 0})
Fill the field with a vector value using a specific executor.