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
36template<typename ValueType>
38 public DivOperatorFactory<ValueType>::template Register<GaussGreenDiv<ValueType>>
39{
41
42public:
43
44 static std::string name() { return "Gauss"; }
45
46 static std::string doc() { return "Gauss-Green Divergence"; }
47
48 static std::string schema() { return "none"; }
49
50 GaussGreenDiv(const Executor& exec, const UnstructuredMesh& mesh, const Input& inputs)
51 : Base(exec, mesh), surfaceInterpolation_(exec, mesh, inputs) {};
52
53 virtual void
55 const SurfaceField<scalar>& faceFlux,
56 const VolumeField<ValueType>& phi,
57 const dsl::Coeff operatorScaling) const override
58 {
59 computeDivExp<ValueType>(
60 faceFlux, phi, surfaceInterpolation_, divPhi.internalVector(), operatorScaling
61 );
62 }
63
64 virtual void
66 const SurfaceField<scalar>& faceFlux,
67 const VolumeField<ValueType>& phi,
68 const dsl::Coeff operatorScaling) const override
69 {
71 ls, faceFlux, phi, surfaceInterpolation_, operatorScaling, this->getSparsityPattern()
72 );
73 };
74
75 virtual void
77 const SurfaceField<scalar>& faceFlux,
78 const VolumeField<ValueType>& phi,
79 const dsl::Coeff operatorScaling) const override
80 {
81 computeDivExp<ValueType>(faceFlux, phi, surfaceInterpolation_, divPhi, operatorScaling);
82 };
83
85 div(const SurfaceField<scalar>& faceFlux,
86 const VolumeField<ValueType>& phi,
87 const dsl::Coeff operatorScaling) const override
88 {
89 std::string name = "div(" + faceFlux.name + "," + phi.name + ")";
91 this->exec_,
92 name,
93 this->mesh_,
95 );
96 NeoN::fill(divPhi.internalVector(), zero<ValueType>());
97 NeoN::fill(divPhi.boundaryData().value(), zero<ValueType>());
98 computeDivExp<ValueType>(
99 faceFlux, phi, surfaceInterpolation_, divPhi.internalVector(), operatorScaling
100 );
101 return divPhi;
102 };
103
104 std::unique_ptr<DivOperatorFactory<ValueType>> clone() const override
105 {
106 return std::make_unique<GaussGreenDiv<ValueType>>(*this);
107 }
108
109private:
110
111 SurfaceInterpolation<ValueType> surfaceInterpolation_;
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: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.