/home/runner/work/amr-wind/amr-wind/amr-wind/fvm/nonLinearSum.H Source File

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/fvm/nonLinearSum.H Source File
AMR-Wind 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
5
6namespace amr_wind::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(AMREX_SPACEDIM == m_phi.num_comp());
19 AMREX_ALWAYS_ASSERT(m_phi.num_grow() > amrex::IntVect(0));
20 }
21
22 template <typename Stencil>
23 void apply(const int lev, const amrex::MFIter& mfi) const
24 {
25 const auto& geom = m_phi.repo().mesh().Geom(lev);
26 const auto& idx = geom.InvCellSizeArray();
27 const auto& strphi = m_strphi(lev).array(mfi);
28 const auto& phi = m_phi(lev).const_array(mfi);
29
30 const auto& bx_in = mfi.tilebox();
31 const auto& bx = Stencil::box(bx_in, geom);
32 if (bx.isEmpty()) {
33 return;
34 }
35
36 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) {
37 amrex::Real cp1, c, cm1, ux, uy, uz, vx, vy, vz, wx, wy, wz;
38 cp1 = Stencil::c00;
39 c = Stencil::c01;
40 cm1 = Stencil::c02;
41
42 ux = (cp1 * phi(i + 1, j, k, 0) + c * phi(i, j, k, 0) +
43 cm1 * phi(i - 1, j, k, 0)) *
44 idx[0];
45 vx = (cp1 * phi(i + 1, j, k, 1) + c * phi(i, j, k, 1) +
46 cm1 * phi(i - 1, j, k, 1)) *
47 idx[0];
48 wx = (cp1 * phi(i + 1, j, k, 2) + c * phi(i, j, k, 2) +
49 cm1 * phi(i - 1, j, k, 2)) *
50 idx[0];
51
52 cp1 = Stencil::c10;
53 c = Stencil::c11;
54 cm1 = Stencil::c12;
55
56 uy = (cp1 * phi(i, j + 1, k, 0) + c * phi(i, j, k, 0) +
57 cm1 * phi(i, j - 1, k, 0)) *
58 idx[1];
59 vy = (cp1 * phi(i, j + 1, k, 1) + c * phi(i, j, k, 1) +
60 cm1 * phi(i, j - 1, k, 1)) *
61 idx[1];
62 wy = (cp1 * phi(i, j + 1, k, 2) + c * phi(i, j, k, 2) +
63 cm1 * phi(i, j - 1, k, 2)) *
64 idx[1];
65
66 cp1 = Stencil::c20;
67 c = Stencil::c21;
68 cm1 = Stencil::c22;
69
70 uz = (cp1 * phi(i, j, k + 1, 0) + c * phi(i, j, k, 0) +
71 cm1 * phi(i, j, k - 1, 0)) *
72 idx[2];
73 vz = (cp1 * phi(i, j, k + 1, 1) + c * phi(i, j, k, 1) +
74 cm1 * phi(i, j, k - 1, 1)) *
75 idx[2];
76 wz = (cp1 * phi(i, j, k + 1, 2) + c * phi(i, j, k, 2) +
77 cm1 * phi(i, j, k - 1, 2)) *
78 idx[2];
79
80 // N11
81 strphi(i, j, k, 0) = (ux * ux + uy * vx + uz * wx) -
82 (ux * ux + uy * uy + uz * uz) +
83 (3 * (ux * ux + vx * vx + wx * wx)) +
84 (ux * ux + vx * uy + wx * uz);
85 // N12
86 strphi(i, j, k, 1) = (ux * uy + uy * vy + uz * wy) -
87 (ux * vx + uy * vy + uz * vz) +
88 (3 * (ux * uy + vx * vy + wx * wy)) +
89 (ux * vx + vx * vy + wx * vz);
90 // N13
91 strphi(i, j, k, 2) = (ux * uz + uy * vz + uz * wz) -
92 (ux * wx + uy * wy + uz * wz) +
93 (3 * (ux * uz + vx * vz + wx * wz)) +
94 (ux * wx + vx * wy + wx * wz);
95 // N21
96 strphi(i, j, k, 3) = (vx * ux + vy * vx + vz * wx) -
97 (vx * ux + vy * uy + vz * uz) +
98 (3 * (uy * ux + vy * vx + wy * wx)) +
99 (uy * ux + vy * uy + wy * uz);
100 // N22
101 strphi(i, j, k, 4) = (vx * uy + vy * vy + vz * wy) -
102 (vx * vx + vy * vy + vz * vz) +
103 (3 * (uy * vx + vy * vy + wy * wy)) +
104 (uy * vx + vy * vy + wy * vz);
105 // N23
106 strphi(i, j, k, 5) = (vx * uz + vy * vz + vz * wz) -
107 (vx * wx + vy * wy + vz * wz) +
108 (3 * (uy * wx + vy * vz + wy * wz)) +
109 (uy * wx + vy * wy + wy * wz);
110 // N31
111 strphi(i, j, k, 6) = (wx * ux + wy * vx + wz * wx) -
112 (wx * ux + wy * uy + wz * uz) +
113 (3 * (uz * ux + vz * vx + wz * wx)) +
114 (uz * ux + vz * uy + wz * uz);
115 // N32
116 strphi(i, j, k, 7) = (wx * uy + wy * vy + wz * wy) -
117 (wx * vx + wy * vy + wz * vz) +
118 (3 * (uz * uy + vz * vy + wz * wy)) +
119 (uz * vx + vz * vy + wz * vz);
120 // N33
121 strphi(i, j, k, 8) = (wx * uz + wy * vz + wz * wz) -
122 (wx * wx + wy * wy + wz * wz) +
123 (3 * (uz * uz + vz * vz + wz * wz)) +
124 (uz * wx + vz * wy + wz * wz);
125 });
126 }
127
128 FTypeOut& m_strphi;
129 const FTypeIn& m_phi;
130};
131
138template <typename FTypeIn, typename FTypeOut>
139void nonlinearsum(FTypeOut& strphi, const FTypeIn& phi)
140{
141 BL_PROFILE("amr-wind::fvm::nonlinearsum");
142 NonLinearSum<FTypeIn, FTypeOut> str(strphi, phi);
143 impl::apply(str, phi);
144}
145
151template <typename FType>
152std::unique_ptr<ScratchField> nonlinearsum(const FType& phi)
153{
154 const std::string gname = phi.name() + "_nonlinearsum";
155 auto strphi = phi.repo().create_scratch_field(gname, 9);
156 nonlinearsum(*strphi, phi);
157 return strphi;
158}
159
160} // namespace amr_wind::fvm
161
162#endif /* NONLINEARSUM_H */
void nonlinearsum(FTypeOut &strphi, const FTypeIn &phi)
Definition nonLinearSum.H:139
AMREX_INLINE void apply(const FvmOp &fvmop, const FType &fld)
Definition fvm_utils.H:14
Definition SchemeTraits.H:6
Definition nonLinearSum.H:14
void apply(const int lev, const amrex::MFIter &mfi) const
Definition nonLinearSum.H:23
const FTypeIn & m_phi
Definition nonLinearSum.H:129
FTypeOut & m_strphi
Definition nonLinearSum.H:128
NonLinearSum(FTypeOut &strphi, const FTypeIn &phi)
Definition nonLinearSum.H:15