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

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