NeoN
A framework for CFD software
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 SurfaceInterpolation<ValueType>& surfInterp,
31 const dsl::Coeff operatorScaling,
32 const la::SparsityPattern& sparsityPattern
33);
34
35template<typename ValueType>
37 public DivOperatorFactory<ValueType>::template Register<GaussGreenDiv<ValueType>>
38{
40
41public:
42
43 static std::string name() { return "Gauss"; }
44
45 static std::string doc() { return "Gauss-Green Divergence"; }
46
47 static std::string schema() { return "none"; }
48
49 GaussGreenDiv(const Executor& exec, const UnstructuredMesh& mesh, const Input& inputs)
50 : Base(exec, mesh), surfaceInterpolation_(exec, mesh, inputs) {};
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 {
70 ls, faceFlux, phi, surfaceInterpolation_, operatorScaling, this->getSparsityPattern()
71 );
72 };
73
74 virtual void
76 const SurfaceField<scalar>& faceFlux,
77 const VolumeField<ValueType>& phi,
78 const dsl::Coeff operatorScaling) const override
79 {
80 computeDivExp<ValueType>(faceFlux, phi, surfaceInterpolation_, divPhi, operatorScaling);
81 };
82
84 div(const SurfaceField<scalar>& faceFlux,
85 const VolumeField<ValueType>& phi,
86 const dsl::Coeff operatorScaling) const override
87 {
88 std::string name = "div(" + faceFlux.name + "," + phi.name + ")";
90 this->exec_,
91 name,
92 this->mesh_,
94 );
95 NeoN::fill(divPhi.internalVector(), zero<ValueType>());
96 NeoN::fill(divPhi.boundaryData().value(), zero<ValueType>());
97 computeDivExp<ValueType>(
98 faceFlux, phi, surfaceInterpolation_, divPhi.internalVector(), operatorScaling
99 );
100 return divPhi;
101 };
102
103 std::unique_ptr<DivOperatorFactory<ValueType>> clone() const override
104 {
105 return std::make_unique<GaussGreenDiv<ValueType>>(*this);
106 }
107
108private:
109
110 SurfaceInterpolation<ValueType> surfaceInterpolation_;
111};
112
113template class GaussGreenDiv<scalar>;
114template class GaussGreenDiv<Vec3>;
115
116} // 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:28
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 SurfaceInterpolation< ValueType > &surfInterp, const dsl::Coeff operatorScaling, const la::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
std::variant< SerialExecutor, CPUExecutor, GPUExecutor > Executor
Definition executor.hpp:16
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.