NeoN
A framework for CFD software
Loading...
Searching...
No Matches
gaussGreenDiv.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2024 - 2025 NeoN authors
2//
3// SPDX-License-Identifier: MIT
4
5#pragma once
6
13
15{
16
17template<typename ValueType>
19 const SurfaceField<scalar>& faceFlux,
20 const VolumeField<ValueType>& phi,
21 const SurfaceInterpolation<ValueType>& surfInterp,
22 Vector<ValueType>& divPhi,
23 const dsl::Coeff operatorScaling
24);
25
26template<typename ValueType>
29 const SurfaceField<scalar>& faceFlux,
30 const VolumeField<ValueType>& phi,
31 const SurfaceInterpolation<ValueType>& surfInterp,
32 const dsl::Coeff operatorScaling,
33 const la::SparsityPattern& sparsityPattern
34);
35
36/* @brief
37 *
38 */
39template<typename ValueType>
41 public DivOperatorFactory<ValueType>::template Register<GaussGreenDiv<ValueType>>
42{
44
45public:
46
47 static std::string name() { return "Gauss"; }
48
49 static std::string doc() { return "Gauss-Green Divergence"; }
50
51 static std::string schema() { return "none"; }
52
53 GaussGreenDiv(const Executor& exec, const UnstructuredMesh& mesh, const Input& inputs)
54 : Base(exec, mesh), surfaceInterpolation_(exec, mesh, inputs) {};
55
57 div(const SurfaceField<scalar>& faceFlux,
58 const VolumeField<ValueType>& phi,
59 const dsl::Coeff operatorScaling) const override
60 {
61 std::string name = "div(" + faceFlux.name + "," + phi.name + ")";
63 this->exec_,
64 name,
65 this->mesh_,
67 );
68 NeoN::fill(divPhi.internalVector(), zero<ValueType>());
69 NeoN::fill(divPhi.boundaryData().value(), zero<ValueType>());
70 computeDivExp<ValueType>(
71 faceFlux, phi, surfaceInterpolation_, divPhi.internalVector(), operatorScaling
72 );
73 return divPhi;
74 };
75
76 virtual void
78 const SurfaceField<scalar>& faceFlux,
79 const VolumeField<ValueType>& phi,
80 const dsl::Coeff operatorScaling) const override
81 {
82 computeDivExp<ValueType>(
83 faceFlux, phi, surfaceInterpolation_, divPhi.internalVector(), operatorScaling
84 );
85 }
86
87 virtual void
89 const SurfaceField<scalar>& faceFlux,
90 const VolumeField<ValueType>& phi,
91 const dsl::Coeff operatorScaling) const override
92 {
93 computeDivExp<ValueType>(faceFlux, phi, surfaceInterpolation_, divPhi, operatorScaling);
94 };
95
96 virtual void
98 const SurfaceField<scalar>& faceFlux,
99 const VolumeField<ValueType>& phi,
100 const dsl::Coeff operatorScaling) const override
101 {
103 ls, faceFlux, phi, surfaceInterpolation_, operatorScaling, this->getSparsityPattern()
104 );
105 };
106
107 std::unique_ptr<DivOperatorFactory<ValueType>> clone() const override
108 {
109 return std::make_unique<GaussGreenDiv<ValueType>>(*this);
110 }
111
112private:
113
114 SurfaceInterpolation<ValueType> surfaceInterpolation_;
115};
116
117template class GaussGreenDiv<scalar>;
118template class GaussGreenDiv<Vec3>;
119
120} // 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:30
A class that represents a coefficient for the NeoN dsl.
Definition coeff.hpp:24
const BoundaryData< ValueType > & boundaryData() const
Returns a const reference to the boundary field.
Definition domain.hpp:101
const Vector< ValueType > & internalVector() const
Returns a const reference to the internal field.
Definition domain.hpp:80
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:28
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:15
std::variant< SerialExecutor, CPUExecutor, GPUExecutor > Executor
Definition executor.hpp:18
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.