NeoN
A framework for CFD software
Loading...
Searching...
No Matches
surfaceInterpolation.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2023 - 2025 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"
18
20{
21
22/* @class SurfaceInterpolationFactory
23**
24*/
25template<typename ValueType>
28 SurfaceInterpolationFactory<ValueType>,
29 Parameters<const Executor&, const UnstructuredMesh&, const Input&>>
30{
32
33public:
34
35 static std::unique_ptr<SurfaceInterpolationFactory<ValueType>>
36 create(const Executor& exec, const UnstructuredMesh& uMesh, const Input& inputs)
37 {
38 // input is dictionary the key is "interpolation"
39 std::string key =
40 (std::holds_alternative<NeoN::Dictionary>(inputs))
41 ? std::get<NeoN::Dictionary>(inputs).get<std::string>("surfaceInterpolation")
42 : std::get<NeoN::TokenList>(inputs).next<std::string>();
43
45 return SurfaceInterpolationFactory<ValueType>::table().at(key)(exec, uMesh, inputs);
46 }
47
48 static std::string name() { return "SurfaceInterpolationFactory"; }
49
51 : exec_(exec), mesh_(mesh) {};
52
53 virtual ~SurfaceInterpolationFactory() {} // Virtual destructor
54
55 virtual void
57
58 virtual void interpolate(
59 const SurfaceField<scalar>& flux,
60 const VolumeField<ValueType>& src,
62 ) const = 0;
63
64 virtual void weight(const VolumeField<ValueType>& src, SurfaceField<scalar>& weight) const = 0;
65
66 virtual void weight(
67 const SurfaceField<scalar>& flux,
68 const VolumeField<ValueType>& src,
70 ) const = 0;
71
72 // Pure virtual function for cloning
73 virtual std::unique_ptr<SurfaceInterpolationFactory<ValueType>> clone() const = 0;
74
75protected:
76
79};
80
81template<typename ValueType>
83{
84
85 using VectorValueType = ValueType;
86
87public:
88
90 : exec_(surfInterp.exec_), mesh_(surfInterp.mesh_),
91 interpolationKernel_(surfInterp.interpolationKernel_->clone()) {};
92
94 : exec_(surfInterp.exec_), mesh_(surfInterp.mesh_),
95 interpolationKernel_(std::move(surfInterp.interpolationKernel_)) {};
96
98 const Executor& exec,
99 const UnstructuredMesh& mesh,
100 std::unique_ptr<SurfaceInterpolationFactory<ValueType>> interpolationKernel
101 )
102 : exec_(exec), mesh_(mesh), interpolationKernel_(std::move(interpolationKernel)) {};
103
104 SurfaceInterpolation(const Executor& exec, const UnstructuredMesh& mesh, const Input& input)
105 : exec_(exec), mesh_(mesh),
106 interpolationKernel_(SurfaceInterpolationFactory<ValueType>::create(exec, mesh, input)) {
107 };
108
109
111 {
112 interpolationKernel_->interpolate(src, dst);
113 }
114
116 const SurfaceField<scalar>& flux,
117 const VolumeField<ValueType>& src,
119 ) const
120 {
121 interpolationKernel_->interpolate(flux, src, dst);
122 }
123
125 {
126 interpolationKernel_->weight(src, weight);
127 }
128
129 void weight(
130 const SurfaceField<scalar>& flux,
131 const VolumeField<ValueType>& src,
133 ) const
134 {
135 interpolationKernel_->weight(flux, src, weight);
136 }
137
138
140 {
141 std::string nameInterpolated = "interpolated_" + src.name;
143 exec_, nameInterpolated, mesh_, createCalculatedBCs<SurfaceBoundary<ValueType>>(mesh_)
144 );
145 interpolate(src, dst);
146 return dst;
147 }
148
151 {
152 std::string name = "interpolated_" + src.name;
155 );
156 interpolate(flux, src, dst);
157 return dst;
158 }
159
161 {
162 std::string name = "weight_" + src.name;
163 SurfaceField<scalar> weightVector(
165 );
166 weight(src, weightVector);
167 return weightVector;
168 }
169
172 {
173 std::string name = "weight_" + src.name;
174 SurfaceField<scalar> weightVector(
176 );
177 weight(flux, src, weightVector);
178 return weightVector;
179 }
180
181private:
182
183 const Executor exec_;
184 const UnstructuredMesh& mesh_;
185 std::unique_ptr<SurfaceInterpolationFactory<ValueType>> interpolationKernel_;
186};
187
188
189} // 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:28
std::variant< Dictionary, TokenList > Input
Definition input.hpp:15
std::variant< SerialExecutor, CPUExecutor, GPUExecutor > Executor
Definition executor.hpp:18
const std::string & name(const NeoN::Document &doc)
Retrieves the name of a Document.