NeoN
A framework for CFD software
Loading...
Searching...
No Matches
faceNormalGradient.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
22template<typename ValueType>
25 FaceNormalGradientFactory<ValueType>,
26 Parameters<const Executor&, const UnstructuredMesh&, const Input&>>
27{
28
29public:
30
31 static std::unique_ptr<FaceNormalGradientFactory>
32 create(const Executor& exec, const UnstructuredMesh& uMesh, const Input& inputs)
33 {
34 // input is dictionary the key is "interpolation"
35 std::string key =
36 (std::holds_alternative<NeoN::Dictionary>(inputs))
37 ? std::get<NeoN::Dictionary>(inputs).get<std::string>("faceNormalGradient")
38 : std::get<NeoN::TokenList>(inputs).next<std::string>();
39
41 return FaceNormalGradientFactory<ValueType>::table().at(key)(exec, uMesh, inputs);
42 }
43
44 static std::string name() { return "FaceNormalGradientFactory"; }
45
47 : exec_(exec), mesh_(mesh) {};
48
49 virtual ~FaceNormalGradientFactory() {} // Virtual destructor
50
51 virtual void faceNormalGrad(
52 const VolumeField<ValueType>& volVector, SurfaceField<ValueType>& surfaceVector
53 ) const = 0;
54
55 virtual const SurfaceField<scalar>& deltaCoeffs() const = 0;
56
57 // Pure virtual function for cloning
58 virtual std::unique_ptr<FaceNormalGradientFactory<ValueType>> clone() const = 0;
59
60protected:
61
64};
65
66template<typename ValueType>
68{
69
70public:
71
73 : exec_(faceNGrad.exec_), mesh_(faceNGrad.mesh_),
74 faceNormalGradKernel_(faceNGrad.faceNormalGradKernel_->clone()) {};
75
77 : exec_(faceNGrad.exec_), mesh_(faceNGrad.mesh_),
78 faceNormalGradKernel_(std::move(faceNGrad.faceNormalGradKernel_)) {};
79
81 const Executor& exec,
82 const UnstructuredMesh& mesh,
83 std::unique_ptr<FaceNormalGradientFactory<ValueType>> faceNormalGradient
84 )
85 : exec_(exec), mesh_(mesh), faceNormalGradKernel_(std::move(faceNormalGradient)) {};
86
87 FaceNormalGradient(const Executor& exec, const UnstructuredMesh& mesh, const Input& input)
88 : exec_(exec), mesh_(mesh),
89 faceNormalGradKernel_(FaceNormalGradientFactory<ValueType>::create(exec, mesh, input)) {};
90
91
93 const VolumeField<ValueType>& volVector, SurfaceField<ValueType>& surfaceVector
94 ) const
95 {
96 faceNormalGradKernel_->faceNormalGrad(volVector, surfaceVector);
97 }
98
99 const SurfaceField<scalar>& deltaCoeffs() const { return faceNormalGradKernel_->deltaCoeffs(); }
100
101
103 {
104 std::string nameInterpolated = "interpolated_" + volVector.name;
105 SurfaceField<ValueType> surfaceVector(
106 exec_, nameInterpolated, mesh_, createCalculatedBCs<SurfaceBoundary<ValueType>>(mesh_)
107 );
108 faceNormalGrad(volVector, surfaceVector);
109 return surfaceVector;
110 }
111
112private:
113
114 const Executor exec_;
115 const UnstructuredMesh& mesh_;
116 std::unique_ptr<FaceNormalGradientFactory<ValueType>> faceNormalGradKernel_;
117};
118
119
120} // namespace NeoN
A factory class for runtime selection of derived classes.
Represents an unstructured mesh in NeoN.
static std::unique_ptr< FaceNormalGradientFactory > create(const Executor &exec, const UnstructuredMesh &uMesh, const Input &inputs)
virtual void faceNormalGrad(const VolumeField< ValueType > &volVector, SurfaceField< ValueType > &surfaceVector) const =0
virtual const SurfaceField< scalar > & deltaCoeffs() const =0
virtual std::unique_ptr< FaceNormalGradientFactory< ValueType > > clone() const =0
FaceNormalGradientFactory(const Executor &exec, const UnstructuredMesh &mesh)
FaceNormalGradient(const Executor &exec, const UnstructuredMesh &mesh, const Input &input)
const SurfaceField< scalar > & deltaCoeffs() const
FaceNormalGradient(const Executor &exec, const UnstructuredMesh &mesh, std::unique_ptr< FaceNormalGradientFactory< ValueType > > faceNormalGradient)
SurfaceField< ValueType > faceNormalGrad(const VolumeField< ValueType > &volVector) const
FaceNormalGradient(const FaceNormalGradient &faceNGrad)
void faceNormalGrad(const VolumeField< ValueType > &volVector, SurfaceField< ValueType > &surfaceVector) const
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:28
std::variant< Dictionary, TokenList > Input
Definition input.hpp:15
std::variant< SerialExecutor, CPUExecutor, GPUExecutor > Executor
Definition executor.hpp:18