NeoN
A framework for CFD software
Loading...
Searching...
No Matches
surfaceInterpolation.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2023 - 2026 NeoN authors
2//
3// SPDX-License-Identifier: MIT
4
5#pragma once
6
7#include <functional>
8
9#include <Kokkos_Core.hpp>
10
12#include "NeoN/core/input.hpp"
19
21{
22
23/* @class SurfaceInterpolationFactory
24**
25*/
26template<typename ValueType>
29 SurfaceInterpolationFactory<ValueType>,
30 Parameters<const Executor&, const UnstructuredMesh&, const Input&>>
31{
33
34public:
35
36 static std::unique_ptr<SurfaceInterpolationFactory<ValueType>>
37 create(const Executor& exec, const UnstructuredMesh& uMesh, const Input& inputs)
38 {
39 // input is dictionary the key is "interpolation"
40 std::string key =
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>();
44
46 return SurfaceInterpolationFactory<ValueType>::table().at(key)(exec, uMesh, inputs);
47 }
48
49 static std::string name() { return "SurfaceInterpolationFactory"; }
50
52 : exec_(exec), mesh_(mesh) {};
53
54 virtual ~SurfaceInterpolationFactory() {} // Virtual destructor
55
56 virtual void
58
59 virtual void interpolate(
60 const SurfaceField<scalar>& flux,
61 const VolumeField<ValueType>& src,
63 ) const = 0;
64
65 virtual void weight(const VolumeField<ValueType>& src, SurfaceField<scalar>& weight) const = 0;
66
67 virtual void weight(
68 const SurfaceField<scalar>& flux,
69 const VolumeField<ValueType>& src,
71 ) const = 0;
72
73 /* @brief Whether this scheme adds an explicit (deferred) correction on top of its implicit
74 * weights, e.g. linearUpwind. For corrected schemes interpolate() returns the weighted value
75 * plus correction(); implicit assemblers add surfaceIntegrate(faceFlux*correction()) to the
76 * rhs.
77 */
78 virtual bool corrected() const { return false; }
79
80 /* @brief The explicit correction part of interpolate(), i.e. interpolate() minus the value
81 * reconstructed from weight(). Defaults to zero for uncorrected schemes; assemblers only call
82 * it when corrected() returns true.
83 */
84 virtual void correction(
85 [[maybe_unused]] const SurfaceField<scalar>& flux,
86 [[maybe_unused]] const VolumeField<ValueType>& src,
88 ) const
89 {
90 fill(corr.internalVector(), zero<ValueType>());
91 fill(corr.boundaryData().value(), zero<ValueType>());
92 }
93
94 // Pure virtual function for cloning
95 virtual std::unique_ptr<SurfaceInterpolationFactory<ValueType>> clone() const = 0;
96
97protected:
98
101};
102
103template<typename ValueType>
105{
106
107 using VectorValueType = ValueType;
108
109public:
110
112 : exec_(surfInterp.exec_), mesh_(surfInterp.mesh_),
113 interpolationKernel_(surfInterp.interpolationKernel_->clone()) {};
114
116 : exec_(surfInterp.exec_), mesh_(surfInterp.mesh_),
117 interpolationKernel_(std::move(surfInterp.interpolationKernel_)) {};
118
120 const Executor& exec,
121 const UnstructuredMesh& mesh,
122 std::unique_ptr<SurfaceInterpolationFactory<ValueType>> interpolationKernel
123 )
124 : exec_(exec), mesh_(mesh), interpolationKernel_(std::move(interpolationKernel)) {};
125
126 SurfaceInterpolation(const Executor& exec, const UnstructuredMesh& mesh, const Input& input)
127 : exec_(exec), mesh_(mesh),
128 interpolationKernel_(SurfaceInterpolationFactory<ValueType>::create(exec, mesh, input)) {
129 };
130
131
133 {
134 interpolationKernel_->interpolate(src, dst);
135 }
136
138 const SurfaceField<scalar>& flux,
139 const VolumeField<ValueType>& src,
141 ) const
142 {
143 interpolationKernel_->interpolate(flux, src, dst);
144 }
145
147 {
148 interpolationKernel_->weight(src, weight);
149 }
150
151 void weight(
152 const SurfaceField<scalar>& flux,
153 const VolumeField<ValueType>& src,
155 ) const
156 {
157 interpolationKernel_->weight(flux, src, weight);
158 }
159
160 bool corrected() const { return interpolationKernel_->corrected(); }
161
163 const SurfaceField<scalar>& flux,
164 const VolumeField<ValueType>& src,
166 ) const
167 {
168 interpolationKernel_->correction(flux, src, corr);
169 }
170
171
173 {
174 std::string nameInterpolated = "interpolated_" + src.name;
176 exec_, nameInterpolated, mesh_, createCalculatedBCs<SurfaceBoundary<ValueType>>(mesh_)
177 );
178 interpolate(src, dst);
179 return dst;
180 }
181
184 {
185 std::string name = "interpolated_" + src.name;
188 );
189 interpolate(flux, src, dst);
190 return dst;
191 }
192
194 {
195 std::string name = "weight_" + src.name;
196 SurfaceField<scalar> weightVector(
198 );
199 weight(src, weightVector);
200 return weightVector;
201 }
202
205 {
206 std::string name = "weight_" + src.name;
207 SurfaceField<scalar> weightVector(
209 );
210 weight(flux, src, weightVector);
211 return weightVector;
212 }
213
214private:
215
216 const Executor exec_;
217 const UnstructuredMesh& mesh_;
218 std::unique_ptr<SurfaceInterpolationFactory<ValueType>> interpolationKernel_;
219};
220
221
222} // namespace NeoN
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.
Definition domain.hpp:101
const Vector< ValueType > & internalVector() const
Returns a const reference to the internal field.
Definition domain.hpp:80
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
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 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(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:35
std::variant< Dictionary, TokenList > Input
Definition input.hpp:15
std::variant< SerialExecutor, CPUExecutor, GPUExecutor > Executor
Definition executor.hpp:20
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.