NeoN
A framework for CFD software
Loading...
Searching...
No Matches
symmetry.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 <Kokkos_Core.hpp>
8
13
15{
16
17namespace detail
18{
19
20// Primary declaration
21template<typename ValueType>
23 Field<ValueType>& domainVector,
24 const UnstructuredMesh& mesh,
25 std::pair<localIdx, localIdx> range
26);
27
28// --- Scalar specialization ---
29template<>
31 Field<NeoN::scalar>& domainVector,
32 const UnstructuredMesh& mesh,
33 std::pair<localIdx, localIdx> range
34)
35{
36 const auto internalV = domainVector.internalVector().view();
37
38 auto [refGradV, valueV, valueFractionV, refValueV, faceCellsV] = views(
39 domainVector.boundaryData().refGrad(),
40 domainVector.boundaryData().value(),
41 domainVector.boundaryData().valueFraction(),
42 domainVector.boundaryData().refValue(),
43 mesh.boundaryMesh().faceCells()
44 );
45
47 domainVector.exec(),
48 range,
49 KOKKOS_LAMBDA(const localIdx i) {
50 const localIdx owner = faceCellsV[i];
51 const auto v = internalV[owner];
52
53 // Scalar symmetry → zero-gradient
54 refValueV[i] = v;
55 valueV[i] = v;
56 valueFractionV[i] = 0.0;
57 refGradV[i] = 0.0;
58 },
59 "setSymmetryValue(scalar)"
60 );
61}
62
63// --- Vec3 specialization ---
64template<>
66 Field<NeoN::Vec3>& domainVector,
67 const UnstructuredMesh& mesh,
68 std::pair<localIdx, localIdx> range
69)
70{
71 const auto internalV = domainVector.internalVector().view();
72
73 auto [refGradV, valueV, valueFractionV, refValueV, faceCellsV, nHatV] = views(
74 domainVector.boundaryData().refGrad(),
75 domainVector.boundaryData().value(),
76 domainVector.boundaryData().valueFraction(),
77 domainVector.boundaryData().refValue(),
78 mesh.boundaryMesh().faceCells(),
79 mesh.boundaryMesh().nf()
80 );
81
83 domainVector.exec(),
84 range,
85 KOKKOS_LAMBDA(const localIdx i) {
86 const localIdx owner = faceCellsV[i];
87 const auto v = internalV[owner];
88 const auto n = nHatV[i];
89
90 // Tangential projection (remove normal component)
91 const auto vn = v & n;
92 const auto vtan = v - n * vn;
93
94 refValueV[i] = vtan;
95 valueV[i] = vtan;
96 valueFractionV[i] = 0.0;
97 refGradV[i] = NeoN::zero<NeoN::Vec3>();
98 },
99 "setSymmetryValue(Vec3)"
100 );
101}
102
103} // namespace detail
104
105
106template<typename ValueType>
107class Symmetry : public VolumeBoundaryFactory<ValueType>::template Register<Symmetry<ValueType>>
108{
110
111public:
112
114
115 Symmetry(const UnstructuredMesh& mesh, const Dictionary& dict, localIdx patchID)
116 : Base(mesh, dict, patchID, {.assignable = false}), mesh_(mesh)
117 {}
118
119 virtual void correctBoundaryCondition(Field<ValueType>& domainVector) final
120 {
121 detail::setSymmetryValue(domainVector, mesh_, this->range());
122 }
123
124 static std::string name() { return "symmetry"; }
125
126 static std::string doc()
127 {
128 return "Symmetry plane (scalar: zero-gradient; vector: tangential projection).";
129 }
130
131 static std::string schema() { return "none"; }
132
133 virtual std::unique_ptr<VolumeBoundaryFactory<ValueType>> clone() const final
134 {
135 return std::make_unique<Symmetry>(*this);
136 }
137
138private:
139
140 const UnstructuredMesh& mesh_;
141};
142
143} // namespace NeoN::finiteVolume::cellCentred::volumeBoundary
const Vector< T > & refGrad() const
Get the view storing the Neumann boundary values.
const Vector< T > & refValue() const
Get the view storing the Dirichlet boundary values.
const Vector< T > & value() const
Get the view storing the computed values from the boundary condition.
const Vector< scalar > & valueFraction() const
Get the view storing the fraction of the boundary value.
const vectorVector & nf() const
Get the field of face unit normals.
const labelVector & faceCells() const
Get the field of face cells.
A class representing a dictionary that stores key-value pairs.
Represents the domain fields for a computational domain.
Definition field.hpp:36
const BoundaryData< ValueType > & boundaryData() const
Definition field.hpp:98
const Executor & exec() const
Definition field.hpp:103
const Vector< ValueType > & internalVector() const
Definition field.hpp:92
Represents an unstructured mesh in NeoN.
const BoundaryMesh & boundaryMesh() const
Get the boundary mesh.
virtual void correctBoundaryCondition(Field< ValueType > &domainVector) final
Definition symmetry.hpp:119
virtual std::unique_ptr< VolumeBoundaryFactory< ValueType > > clone() const final
Definition symmetry.hpp:133
Symmetry(const UnstructuredMesh &mesh, const Dictionary &dict, localIdx patchID)
Definition symmetry.hpp:115
A template class for registering derived classes with a base class.
void setSymmetryValue(Field< ValueType > &domainVector, const UnstructuredMesh &mesh, std::pair< localIdx, localIdx > range)
void setSymmetryValue< NeoN::scalar >(Field< NeoN::scalar > &domainVector, const UnstructuredMesh &mesh, std::pair< localIdx, localIdx > range)
Definition symmetry.hpp:30
void setSymmetryValue< NeoN::Vec3 >(Field< NeoN::Vec3 > &domainVector, const UnstructuredMesh &mesh, std::pair< localIdx, localIdx > range)
Definition symmetry.hpp:65
int32_t localIdx
Definition label.hpp:32
void parallelFor(const ExecutorType &exec, std::pair< localIdx, localIdx > range, Kernel kernel, std::string name)
auto views(Types &... args)
Unpacks all views of the passed classes.
Definition view.hpp:110