NeoN
WIP Prototype of a modern OpenFOAM core
Loading...
Searching...
No Matches
surfaceInterpolation.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2// SPDX-FileCopyrightText: 2023 NeoN authors
3
4#pragma once
5
6#include <functional>
7
8#include <Kokkos_Core.hpp>
9
11#include "NeoN/core/input.hpp"
17
19{
20
21/* @class SurfaceInterpolationFactory
22**
23*/
24template<typename ValueType>
27 SurfaceInterpolationFactory<ValueType>,
28 Parameters<const Executor&, const UnstructuredMesh&, const Input&>>
29{
31
32public:
33
34 static std::unique_ptr<SurfaceInterpolationFactory<ValueType>>
35 create(const Executor& exec, const UnstructuredMesh& uMesh, const Input& inputs)
36 {
37 // input is dictionary the key is "interpolation"
38 std::string key =
39 (std::holds_alternative<NeoN::Dictionary>(inputs))
40 ? std::get<NeoN::Dictionary>(inputs).get<std::string>("surfaceInterpolation")
41 : std::get<NeoN::TokenList>(inputs).next<std::string>();
42
44 return SurfaceInterpolationFactory<ValueType>::table().at(key)(exec, uMesh, inputs);
45 }
46
47 static std::string name() { return "SurfaceInterpolationFactory"; }
48
50 : exec_(exec), mesh_(mesh) {};
51
52 virtual ~SurfaceInterpolationFactory() {} // Virtual destructor
53
54 virtual void
56
57 virtual void interpolate(
58 const SurfaceField<scalar>& flux,
59 const VolumeField<ValueType>& src,
61 ) const = 0;
62
63 virtual void weight(const VolumeField<ValueType>& src, SurfaceField<scalar>& weight) const = 0;
64
65 virtual void weight(
66 const SurfaceField<scalar>& flux,
67 const VolumeField<ValueType>& src,
69 ) const = 0;
70
71 // Pure virtual function for cloning
72 virtual std::unique_ptr<SurfaceInterpolationFactory<ValueType>> clone() const = 0;
73
74protected:
75
78};
79
80template<typename ValueType>
82{
83
84 using VectorValueType = ValueType;
85
86public:
87
89 : exec_(surfInterp.exec_), mesh_(surfInterp.mesh_),
90 interpolationKernel_(surfInterp.interpolationKernel_->clone()) {};
91
93 : exec_(surfInterp.exec_), mesh_(surfInterp.mesh_),
94 interpolationKernel_(std::move(surfInterp.interpolationKernel_)) {};
95
97 const Executor& exec,
98 const UnstructuredMesh& mesh,
99 std::unique_ptr<SurfaceInterpolationFactory<ValueType>> interpolationKernel
100 )
101 : exec_(exec), mesh_(mesh), interpolationKernel_(std::move(interpolationKernel)) {};
102
103 SurfaceInterpolation(const Executor& exec, const UnstructuredMesh& mesh, const Input& input)
104 : exec_(exec), mesh_(mesh),
105 interpolationKernel_(SurfaceInterpolationFactory<ValueType>::create(exec, mesh, input)) {
106 };
107
108
110 {
111 interpolationKernel_->interpolate(src, dst);
112 }
113
115 const SurfaceField<scalar>& flux,
116 const VolumeField<ValueType>& src,
118 ) const
119 {
120 interpolationKernel_->interpolate(flux, src, dst);
121 }
122
124 {
125 interpolationKernel_->weight(src, weight);
126 }
127
128 void weight(
129 const SurfaceField<scalar>& flux,
130 const VolumeField<ValueType>& src,
132 ) const
133 {
134 interpolationKernel_->weight(flux, src, weight);
135 }
136
137
139 {
140 std::string nameInterpolated = "interpolated_" + src.name;
142 exec_, nameInterpolated, mesh_, createCalculatedBCs<SurfaceBoundary<ValueType>>(mesh_)
143 );
144 interpolate(src, dst);
145 return dst;
146 }
147
150 {
151 std::string name = "interpolated_" + src.name;
154 );
155 interpolate(flux, src, dst);
156 return dst;
157 }
158
160 {
161 std::string name = "weight_" + src.name;
162 SurfaceField<scalar> weightVector(
164 );
165 weight(src, weightVector);
166 return weightVector;
167 }
168
171 {
172 std::string name = "weight_" + src.name;
173 SurfaceField<scalar> weightVector(
175 );
176 weight(flux, src, weightVector);
177 return weightVector;
178 }
179
180private:
181
182 const Executor exec_;
183 const UnstructuredMesh& mesh_;
184 std::unique_ptr<SurfaceInterpolationFactory<ValueType>> interpolationKernel_;
185};
186
187
188} // namespace NeoN
A factory class for runtime selection of derived classes.
Represents an unstructured mesh in NeoN.
Represents a surface boundary field for a cell-centered finite volume method.
virtual void interpolate(const VolumeField< ValueType > &src, SurfaceField< ValueType > &dst) const =0
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
SurfaceInterpolationFactory(const Executor &exec, const UnstructuredMesh &mesh)
static std::unique_ptr< SurfaceInterpolationFactory< ValueType > > create(const Executor &exec, const UnstructuredMesh &uMesh, const Input &inputs)
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 weight(const VolumeField< ValueType > &src, SurfaceField< scalar > &weight) const
SurfaceInterpolation(const Executor &exec, const UnstructuredMesh &mesh, std::unique_ptr< SurfaceInterpolationFactory< ValueType > > interpolationKernel)
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)
Definition boundary.hpp:27
std::variant< Dictionary, TokenList > Input
Definition input.hpp:13
std::variant< SerialExecutor, CPUExecutor, GPUExecutor > Executor
Definition executor.hpp:16
const std::string & name(const NeoN::Document &doc)
Retrieves the name of a Document.