NeoFOAM
WIP Prototype of a modern OpenFOAM core
Loading...
Searching...
No Matches
faceNormalGradient.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2// SPDX-FileCopyrightText: 2023 NeoFOAM authors
3
4#pragma once
5
6#include <functional>
7
8#include <Kokkos_Core.hpp>
9
17
19{
20
21template<typename ValueType>
24 FaceNormalGradientFactory<ValueType>,
25 Parameters<const Executor&, const UnstructuredMesh&, const Input&>>
26{
27
28public:
29
30 static std::unique_ptr<FaceNormalGradientFactory>
31 create(const Executor& exec, const UnstructuredMesh& uMesh, const Input& inputs)
32 {
33 // input is dictionary the key is "interpolation"
34 std::string key =
35 (std::holds_alternative<NeoFOAM::Dictionary>(inputs))
36 ? std::get<NeoFOAM::Dictionary>(inputs).get<std::string>("faceNormalGradient")
37 : std::get<NeoFOAM::TokenList>(inputs).next<std::string>();
38
40 return FaceNormalGradientFactory<ValueType>::table().at(key)(exec, uMesh, inputs);
41 }
42
43 static std::string name() { return "FaceNormalGradientFactory"; }
44
46 : exec_(exec), mesh_(mesh) {};
47
48 virtual ~FaceNormalGradientFactory() {} // Virtual destructor
49
50 virtual void faceNormalGrad(
51 const VolumeField<ValueType>& volField, SurfaceField<ValueType>& surfaceField
52 ) const = 0;
53
54 virtual const SurfaceField<scalar>& deltaCoeffs() const = 0;
55
56 // Pure virtual function for cloning
57 virtual std::unique_ptr<FaceNormalGradientFactory<ValueType>> clone() const = 0;
58
59protected:
60
63};
64
65template<typename ValueType>
67{
68
69public:
70
72 : exec_(faceNGrad.exec_), mesh_(faceNGrad.mesh_),
73 faceNormalGradKernel_(faceNGrad.faceNormalGradKernel_->clone()) {};
74
76 : exec_(faceNGrad.exec_), mesh_(faceNGrad.mesh_),
77 faceNormalGradKernel_(std::move(faceNGrad.faceNormalGradKernel_)) {};
78
80 const Executor& exec,
81 const UnstructuredMesh& mesh,
82 std::unique_ptr<FaceNormalGradientFactory<ValueType>> faceNormalGradient
83 )
84 : exec_(exec), mesh_(mesh), faceNormalGradKernel_(std::move(faceNormalGradient)) {};
85
86 FaceNormalGradient(const Executor& exec, const UnstructuredMesh& mesh, const Input& input)
87 : exec_(exec), mesh_(mesh),
88 faceNormalGradKernel_(FaceNormalGradientFactory<ValueType>::create(exec, mesh, input)) {};
89
90
92 const VolumeField<ValueType>& volField, SurfaceField<ValueType>& surfaceField
93 ) const
94 {
95 faceNormalGradKernel_->faceNormalGrad(volField, surfaceField);
96 }
97
98 const SurfaceField<scalar>& deltaCoeffs() const { return faceNormalGradKernel_->deltaCoeffs(); }
99
100
102 {
103 std::string nameInterpolated = "interpolated_" + volField.name;
104 SurfaceField<ValueType> surfaceField(
105 exec_, nameInterpolated, mesh_, createCalculatedBCs<SurfaceBoundary<ValueType>>(mesh_)
106 );
107 faceNormalGrad(volField, surfaceField);
108 return surfaceField;
109 }
110
111private:
112
113 const Executor exec_;
114 const UnstructuredMesh& mesh_;
115 std::unique_ptr<FaceNormalGradientFactory<ValueType>> faceNormalGradKernel_;
116};
117
118
119} // namespace NeoFOAM
A factory class for runtime selection of derived classes.
Represents an unstructured mesh in NeoFOAM.
virtual std::unique_ptr< FaceNormalGradientFactory< ValueType > > clone() const =0
static std::unique_ptr< FaceNormalGradientFactory > create(const Executor &exec, const UnstructuredMesh &uMesh, const Input &inputs)
virtual void faceNormalGrad(const VolumeField< ValueType > &volField, SurfaceField< ValueType > &surfaceField) const =0
virtual const SurfaceField< scalar > & deltaCoeffs() const =0
FaceNormalGradientFactory(const Executor &exec, const UnstructuredMesh &mesh)
FaceNormalGradient(const Executor &exec, const UnstructuredMesh &mesh, std::unique_ptr< FaceNormalGradientFactory< ValueType > > faceNormalGradient)
FaceNormalGradient(const Executor &exec, const UnstructuredMesh &mesh, const Input &input)
SurfaceField< ValueType > faceNormalGrad(const VolumeField< ValueType > &volField) const
void faceNormalGrad(const VolumeField< ValueType > &volField, SurfaceField< ValueType > &surfaceField) const
FaceNormalGradient(const FaceNormalGradient &faceNGrad)
Represents a surface boundary field for a cell-centered finite volume method.
Represents a surface field in a finite volume method.
Represents a volume field in a finite volume method.
std::vector< BoundaryType > createCalculatedBCs(const UnstructuredMesh &mesh)
Definition boundary.hpp:26
std::variant< Dictionary, TokenList > Input
Definition input.hpp:13
std::variant< SerialExecutor, CPUExecutor, GPUExecutor > Executor
Definition executor.hpp:16