/home/runner/work/kynema-sgf/kynema-sgf/src/fvm/nonLinearSum.H Source File

Kynema-SGF API: /home/runner/work/kynema-sgf/kynema-sgf/src/fvm/nonLinearSum.H Source File
Kynema-SGF API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
nonLinearSum.H
Go to the documentation of this file.
1#ifndef NONLINEARSUM_H
2#define NONLINEARSUM_H
3
4#include "src/fvm/fvm_utils.H"
5
6namespace kynema_sgf::fvm {
7
12template <typename FTypeIn, typename FTypeOut>
14{
15 NonLinearSum(FTypeOut& strphi, const FTypeIn& phi)
16 : m_strphi(strphi), m_phi(phi)
17 {
18 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
19 AMREX_SPACEDIM == m_phi.num_comp(),
20 "AMREX_SPACEDIM = " + std::to_string(AMREX_SPACEDIM) +
21 ", m_phi.num_comp() = " + std::to_string(m_phi.num_comp()));
22 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
23 m_phi.num_grow() > amrex::IntVect(0),
24 "m_phi.num_grow() = (" + std::to_string(m_phi.num_grow()[0]) +
25 ", " + std::to_string(m_phi.num_grow()[1]) + ", " +
26 std::to_string(m_phi.num_grow()[2]) + ")");
27 }
28
29 template <typename Stencil>
30 void apply(const int lev) const
31 {
32 const auto& geom = m_phi.repo().mesh().Geom(lev);
33 const auto& idx = geom.InvCellSizeArray();
34 const auto dlo = geom.Domain().smallEnd();
35 const auto dhi = geom.Domain().bigEnd();
36
37 auto& out_mf = m_strphi(lev);
38 auto const& in_arrs = m_phi(lev).const_arrays();
39 auto const& out_arrs = out_mf.arrays();
40
41 amrex::ParallelFor(
42 out_mf, amrex::IntVect(0),
43 [=] AMREX_GPU_DEVICE(int nbx, int i, int j, int k) {
44 if (!Stencil::applies_to(i, j, k, dlo, dhi)) {
45 return;
46 }
47 auto const& phi = in_arrs[nbx];
48 auto const& strphi = out_arrs[nbx];
49 const amrex::Real ux = ((Stencil::c00 * phi(i + 1, j, k, 0)) +
50 (Stencil::c01 * phi(i, j, k, 0)) +
51 (Stencil::c02 * phi(i - 1, j, k, 0))) *
52 idx[0];
53 const amrex::Real vx = ((Stencil::c00 * phi(i + 1, j, k, 1)) +
54 (Stencil::c01 * phi(i, j, k, 1)) +
55 (Stencil::c02 * phi(i - 1, j, k, 1))) *
56 idx[0];
57 const amrex::Real wx = ((Stencil::c00 * phi(i + 1, j, k, 2)) +
58 (Stencil::c01 * phi(i, j, k, 2)) +
59 (Stencil::c02 * phi(i - 1, j, k, 2))) *
60 idx[0];
61 const amrex::Real uy = ((Stencil::c10 * phi(i, j + 1, k, 0)) +
62 (Stencil::c11 * phi(i, j, k, 0)) +
63 (Stencil::c12 * phi(i, j - 1, k, 0))) *
64 idx[1];
65 const amrex::Real vy = ((Stencil::c10 * phi(i, j + 1, k, 1)) +
66 (Stencil::c11 * phi(i, j, k, 1)) +
67 (Stencil::c12 * phi(i, j - 1, k, 1))) *
68 idx[1];
69 const amrex::Real wy = ((Stencil::c10 * phi(i, j + 1, k, 2)) +
70 (Stencil::c11 * phi(i, j, k, 2)) +
71 (Stencil::c12 * phi(i, j - 1, k, 2))) *
72 idx[1];
73 const amrex::Real uz = ((Stencil::c20 * phi(i, j, k + 1, 0)) +
74 (Stencil::c21 * phi(i, j, k, 0)) +
75 (Stencil::c22 * phi(i, j, k - 1, 0))) *
76 idx[2];
77 const amrex::Real vz = ((Stencil::c20 * phi(i, j, k + 1, 1)) +
78 (Stencil::c21 * phi(i, j, k, 1)) +
79 (Stencil::c22 * phi(i, j, k - 1, 1))) *
80 idx[2];
81 const amrex::Real wz = ((Stencil::c20 * phi(i, j, k + 1, 2)) +
82 (Stencil::c21 * phi(i, j, k, 2)) +
83 (Stencil::c22 * phi(i, j, k - 1, 2))) *
84 idx[2];
85 // N11
86 strphi(i, j, k, 0) = ((ux * ux) + (uy * vx) + (uz * wx)) -
87 ((ux * ux) + (uy * uy) + (uz * uz)) +
88 (3 * ((ux * ux) + (vx * vx) + (wx * wx))) +
89 ((ux * ux) + (vx * uy) + (wx * uz));
90 // N12
91 strphi(i, j, k, 1) = ((ux * uy) + (uy * vy) + (uz * wy)) -
92 ((ux * vx) + (uy * vy) + (uz * vz)) +
93 (3 * ((ux * uy) + (vx * vy) + (wx * wy))) +
94 ((ux * vx) + (vx * vy) + (wx * vz));
95 // N13
96 strphi(i, j, k, 2) = ((ux * uz) + (uy * vz) + (uz * wz)) -
97 ((ux * wx) + (uy * wy) + (uz * wz)) +
98 (3 * ((ux * uz) + (vx * vz) + (wx * wz))) +
99 ((ux * wx) + (vx * wy) + (wx * wz));
100 // N21
101 strphi(i, j, k, 3) = ((vx * ux) + (vy * vx) + (vz * wx)) -
102 ((vx * ux) + (vy * uy) + (vz * uz)) +
103 (3 * ((uy * ux) + (vy * vx) + (wy * wx))) +
104 ((uy * ux) + (vy * uy) + (wy * uz));
105 // N22
106 strphi(i, j, k, 4) = ((vx * uy) + (vy * vy) + (vz * wy)) -
107 ((vx * vx) + (vy * vy) + (vz * vz)) +
108 (3 * ((uy * vx) + (vy * vy) + (wy * wy))) +
109 ((uy * vx) + (vy * vy) + (wy * vz));
110 // N23
111 strphi(i, j, k, 5) = ((vx * uz) + (vy * vz) + (vz * wz)) -
112 ((vx * wx) + (vy * wy) + (vz * wz)) +
113 (3 * ((uy * wx) + (vy * vz) + (wy * wz))) +
114 ((uy * wx) + (vy * wy) + (wy * wz));
115 // N31
116 strphi(i, j, k, 6) = ((wx * ux) + (wy * vx) + (wz * wx)) -
117 ((wx * ux) + (wy * uy) + (wz * uz)) +
118 (3 * ((uz * ux) + (vz * vx) + (wz * wx))) +
119 ((uz * ux) + (vz * uy) + (wz * uz));
120 // N32
121 strphi(i, j, k, 7) = ((wx * uy) + (wy * vy) + (wz * wy)) -
122 ((wx * vx) + (wy * vy) + (wz * vz)) +
123 (3 * ((uz * uy) + (vz * vy) + (wz * wy))) +
124 ((uz * vx) + (vz * vy) + (wz * vz));
125 // N33
126 strphi(i, j, k, 8) = ((wx * uz) + (wy * vz) + (wz * wz)) -
127 ((wx * wx) + (wy * wy) + (wz * wz)) +
128 (3 * ((uz * uz) + (vz * vz) + (wz * wz))) +
129 ((uz * wx) + (vz * wy) + (wz * wz));
130 });
131 }
132
133 FTypeOut& m_strphi;
134 const FTypeIn& m_phi;
135};
136
143template <typename FTypeIn, typename FTypeOut>
144void nonlinearsum(FTypeOut& strphi, const FTypeIn& phi)
145{
146 BL_PROFILE("kynema-sgf::fvm::nonlinearsum");
147 NonLinearSum<FTypeIn, FTypeOut> str(strphi, phi);
148 impl::apply(str, phi);
149}
150
156template <typename FType>
157std::unique_ptr<ScratchField> nonlinearsum(const FType& phi)
158{
159 const std::string gname = phi.name() + "_nonlinearsum";
160 auto strphi = phi.repo().create_scratch_field(gname, 9);
161 nonlinearsum(*strphi, phi);
162 return strphi;
163}
164
165} // namespace kynema_sgf::fvm
166
167#endif /* NONLINEARSUM_H */
void nonlinearsum(FTypeOut &strphi, const FTypeIn &phi)
Definition nonLinearSum.H:144
AMREX_INLINE void apply(const FvmOp &fvmop, const FType &fld)
Definition fvm_utils.H:20
Definition SchemeTraits.H:6
Definition nonLinearSum.H:14
const FTypeIn & m_phi
Definition nonLinearSum.H:134
NonLinearSum(FTypeOut &strphi, const FTypeIn &phi)
Definition nonLinearSum.H:15
FTypeOut & m_strphi
Definition nonLinearSum.H:133
void apply(const int lev) const
Definition nonLinearSum.H:30