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

Kynema-SGF API: /home/runner/work/kynema-sgf/kynema-sgf/src/fvm/gradient.H Source File
Kynema-SGF API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
gradient.H
Go to the documentation of this file.
1#ifndef GRADIENT_H
2#define GRADIENT_H
3
4#include "src/fvm/fvm_utils.H"
5
6namespace kynema_sgf::fvm {
7
11template <typename FTypeIn, typename FTypeOut>
13{
18 Gradient(FTypeOut& gradphi, const FTypeIn& phi)
19 : m_gradphi(gradphi), m_phi(phi)
20 {
21 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
22 gradphi.num_comp() == AMREX_SPACEDIM * phi.num_comp(),
23 "gradphi.num_comp() = " + std::to_string(gradphi.num_comp()) +
24 ", AMREX_SPACEDIM = " + std::to_string(AMREX_SPACEDIM) +
25 ", phi.num_comp() = " + std::to_string(phi.num_comp()));
26 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
27 m_phi.num_grow() > amrex::IntVect(0),
28 "m_phi.num_grow() = (" + std::to_string(m_phi.num_grow()[0]) +
29 ", " + std::to_string(m_phi.num_grow()[1]) + ", " +
30 std::to_string(m_phi.num_grow()[2]) + ")");
31 }
32
33 template <typename Stencil>
34 void apply(const int lev) const
35 {
36 const int ncomp = m_phi.num_comp();
37 const auto& geom = m_phi.repo().mesh().Geom(lev);
38 const auto& idx = geom.InvCellSizeArray();
39 const auto dlo = geom.Domain().smallEnd();
40 const auto dhi = geom.Domain().bigEnd();
41
42 auto& out_mf = m_gradphi(lev);
43 auto const& in_arrs = m_phi(lev).const_arrays();
44 auto const& out_arrs = out_mf.arrays();
45
46 amrex::ParallelFor(
47 out_mf, amrex::IntVect(0),
48 [=] AMREX_GPU_DEVICE(int nbx, int i, int j, int k) {
49 if (!Stencil::applies_to(i, j, k, dlo, dhi)) {
50 return;
51 }
52 auto const& phi_arr = in_arrs[nbx];
53 auto const& gradphi_arr = out_arrs[nbx];
54 for (int icomp = 0; icomp < ncomp; icomp++) {
55 gradphi_arr(i, j, k, (icomp * AMREX_SPACEDIM) + 0) =
56 ((Stencil::c00 * phi_arr(i + 1, j, k, icomp)) +
57 (Stencil::c01 * phi_arr(i, j, k, icomp)) +
58 (Stencil::c02 * phi_arr(i - 1, j, k, icomp))) *
59 idx[0];
60
61 gradphi_arr(i, j, k, (icomp * AMREX_SPACEDIM) + 1) =
62 ((Stencil::c10 * phi_arr(i, j + 1, k, icomp)) +
63 (Stencil::c11 * phi_arr(i, j, k, icomp)) +
64 (Stencil::c12 * phi_arr(i, j - 1, k, icomp))) *
65 idx[1];
66
67 gradphi_arr(i, j, k, (icomp * AMREX_SPACEDIM) + 2) =
68 ((Stencil::c20 * phi_arr(i, j, k + 1, icomp)) +
69 (Stencil::c21 * phi_arr(i, j, k, icomp)) +
70 (Stencil::c22 * phi_arr(i, j, k - 1, icomp))) *
71 idx[2];
72 }
73 });
74 }
75
76 FTypeOut& m_gradphi;
77 const FTypeIn& m_phi;
78};
79
86template <typename FTypeIn, typename FTypeOut>
87void gradient(FTypeOut& gradphi, const FTypeIn& phi)
88{
89 BL_PROFILE("kynema-sgf::fvm::gradient");
90 Gradient<FTypeIn, FTypeOut> grad(gradphi, phi);
91 impl::apply(grad, phi);
92}
93
99template <typename FType>
100std::unique_ptr<ScratchField> gradient(const FType& phi)
101{
102 const std::string gname = phi.name() + "_gradient";
103 auto gradphi =
104 phi.repo().create_scratch_field(gname, phi.num_comp() * AMREX_SPACEDIM);
105 gradient(*gradphi, phi);
106 return gradphi;
107}
108
109} // namespace kynema_sgf::fvm
110
111#endif /* GRADIENT_H */
void gradient(FTypeOut &gradphi, const FTypeIn &phi)
Definition gradient.H:87
AMREX_INLINE void apply(const FvmOp &fvmop, const FType &fld)
Definition fvm_utils.H:20
Definition SchemeTraits.H:6
Definition gradient.H:13
void apply(const int lev) const
Definition gradient.H:34
FTypeOut & m_gradphi
Definition gradient.H:76
const FTypeIn & m_phi
Definition gradient.H:77
Gradient(FTypeOut &gradphi, const FTypeIn &phi)
Definition gradient.H:18