NeoN
WIP Prototype of a modern OpenFOAM core
Loading...
Searching...
No Matches
gaussGreenDiv.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2// SPDX-FileCopyrightText: 2024 NeoN authors
3
4#pragma once
5
12
14{
15
16template<typename ValueType>
18 const SurfaceField<scalar>& faceFlux,
19 const VolumeField<ValueType>& phi,
20 const SurfaceInterpolation<ValueType>& surfInterp,
21 Vector<ValueType>& divPhi,
22 const dsl::Coeff operatorScaling
23);
24
25template<typename ValueType>
28 const SurfaceField<scalar>& faceFlux,
29 const VolumeField<ValueType>& phi,
30 const dsl::Coeff operatorScaling,
31 const SparsityPattern& sparsityPattern
32);
33
34template<typename ValueType>
36 public DivOperatorFactory<ValueType>::template Register<GaussGreenDiv<ValueType>>
37{
39
40public:
41
42 static std::string name() { return "Gauss"; }
43
44 static std::string doc() { return "Gauss-Green Divergence"; }
45
46 static std::string schema() { return "none"; }
47
48 GaussGreenDiv(const Executor& exec, const UnstructuredMesh& mesh, const Input& inputs)
49 : Base(exec, mesh), surfaceInterpolation_(exec, mesh, inputs),
50 sparsityPattern_(SparsityPattern::readOrCreate(mesh)) {};
51
52 virtual void
54 const SurfaceField<scalar>& faceFlux,
55 const VolumeField<ValueType>& phi,
56 const dsl::Coeff operatorScaling) const override
57 {
58 computeDivExp<ValueType>(
59 faceFlux, phi, surfaceInterpolation_, divPhi.internalVector(), operatorScaling
60 );
61 }
62
63 virtual void
65 const SurfaceField<scalar>& faceFlux,
66 const VolumeField<ValueType>& phi,
67 const dsl::Coeff operatorScaling) const override
68 {
69 computeDivImp(ls, faceFlux, phi, operatorScaling, *sparsityPattern_.get());
70 };
71
72 virtual void
74 const SurfaceField<scalar>& faceFlux,
75 const VolumeField<ValueType>& phi,
76 const dsl::Coeff operatorScaling) const override
77 {
78 computeDivExp<ValueType>(faceFlux, phi, surfaceInterpolation_, divPhi, operatorScaling);
79 };
80
82 div(const SurfaceField<scalar>& faceFlux,
83 const VolumeField<ValueType>& phi,
84 const dsl::Coeff operatorScaling) const override
85 {
86 std::string name = "div(" + faceFlux.name + "," + phi.name + ")";
88 this->exec_,
89 name,
90 this->mesh_,
92 );
93 NeoN::fill(divPhi.internalVector(), zero<ValueType>());
94 NeoN::fill(divPhi.boundaryData().value(), zero<ValueType>());
95 computeDivExp<ValueType>(
96 faceFlux, phi, surfaceInterpolation_, divPhi.internalVector(), operatorScaling
97 );
98 return divPhi;
99 };
100
101 std::unique_ptr<DivOperatorFactory<ValueType>> clone() const override
102 {
103 return std::make_unique<GaussGreenDiv<ValueType>>(*this);
104 }
105
106private:
107
108 SurfaceInterpolation<ValueType> surfaceInterpolation_;
109
110 // TODO why store as shared_ptr
111 const std::shared_ptr<SparsityPattern> sparsityPattern_;
112};
113
114template class GaussGreenDiv<scalar>;
115template class GaussGreenDiv<Vec3>;
116
117} // namespace NeoN
const Vector< T > & value() const
Get the view storing the computed values from the boundary condition.
Represents an unstructured mesh in NeoN.
A class to contain the data and executors for a field and define some basic operations.
Definition vector.hpp:53
A class that represents a coefficient for the NeoN dsl.
Definition coeff.hpp:22
const BoundaryData< ValueType > & boundaryData() const
Returns a const reference to the boundary field.
Definition domain.hpp:100
const Vector< ValueType > & internalVector() const
Returns a const reference to the internal field.
Definition domain.hpp:79
virtual VolumeField< ValueType > div(const SurfaceField< scalar > &faceFlux, const VolumeField< ValueType > &phi, const dsl::Coeff operatorScaling) const override
virtual void div(Vector< ValueType > &divPhi, const SurfaceField< scalar > &faceFlux, const VolumeField< ValueType > &phi, const dsl::Coeff operatorScaling) const override
virtual void div(la::LinearSystem< ValueType, localIdx > &ls, const SurfaceField< scalar > &faceFlux, const VolumeField< ValueType > &phi, const dsl::Coeff operatorScaling) const override
std::unique_ptr< DivOperatorFactory< ValueType > > clone() const override
GaussGreenDiv(const Executor &exec, const UnstructuredMesh &mesh, const Input &inputs)
virtual void div(VolumeField< ValueType > &divPhi, const SurfaceField< scalar > &faceFlux, const VolumeField< ValueType > &phi, const dsl::Coeff operatorScaling) const override
Represents a surface field in a finite volume method.
Represents a volume boundary field for a cell-centered finite volume method.
Represents a volume field in a finite volume method.
A class representing a linear system of equations.
A template class for registering derived classes with a base class.
void computeDivImp(la::LinearSystem< ValueType, localIdx > &ls, const SurfaceField< scalar > &faceFlux, const VolumeField< ValueType > &phi, const dsl::Coeff operatorScaling, const SparsityPattern &sparsityPattern)
std::vector< BoundaryType > createCalculatedBCs(const UnstructuredMesh &mesh)
Definition boundary.hpp:27
void computeDivExp(const SurfaceField< scalar > &faceFlux, const VolumeField< ValueType > &phi, const SurfaceInterpolation< ValueType > &surfInterp, Vector< ValueType > &divPhi, const dsl::Coeff operatorScaling)
std::variant< Dictionary, TokenList > Input
Definition input.hpp:13
void fill(Vector< ValueType > &a, const std::type_identity_t< ValueType > value, std::pair< localIdx, localIdx > range={0, 0})
Fill the field with a scalar value using a specific executor.
std::variant< SerialExecutor, CPUExecutor, GPUExecutor > Executor
Definition executor.hpp:16