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

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/fvm/divergence.H Source File
AMR-Wind 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
5#include "AMReX_Array4.H"
6#include "AMReX_Geometry.H"
7#include "AMReX_MFIter.H"
8
9namespace amr_wind::fvm {
10
14template <typename FTypeIn, typename FTypeOut>
16{
17 Divergence(FTypeOut& divphi, const FTypeIn& phi)
18 : m_divphi(divphi), m_phi(phi)
19 {
20 AMREX_ALWAYS_ASSERT(
21 AMREX_SPACEDIM * divphi.num_comp() == phi.num_comp());
22 AMREX_ALWAYS_ASSERT(m_phi.num_grow() > amrex::IntVect(0));
23 }
24
25 template <typename Stencil>
26 void apply(const int lev, const amrex::MFIter& mfi) const
27 {
28 const int ncomp = m_divphi.num_comp();
29 const auto& geom = m_phi.repo().mesh().Geom(lev);
30 const auto& idx = geom.InvCellSizeArray();
31 const auto& divphi_arr = m_divphi(lev).array(mfi);
32 const auto& phi_arr = m_phi(lev).const_array(mfi);
33
34 const auto& bx_in = mfi.tilebox();
35 const auto& bx = Stencil::box(bx_in, geom);
36 if (bx.isEmpty()) {
37 return;
38 }
39
40 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) {
41 for (int icomp = 0; icomp < ncomp; icomp++) {
42 amrex::Real cp1 = Stencil::c00;
43 amrex::Real c = Stencil::c01;
44 amrex::Real cm1 = Stencil::c02;
45 divphi_arr(i, j, k, icomp) =
46 (cp1 * phi_arr(i + 1, j, k, (icomp * AMREX_SPACEDIM) + 0) +
47 c * phi_arr(i, j, k, (icomp * AMREX_SPACEDIM) + 0) +
48 cm1 * phi_arr(i - 1, j, k, (icomp * AMREX_SPACEDIM) + 0)) *
49 idx[0];
50
51 cp1 = Stencil::c10;
52 c = Stencil::c11;
53 cm1 = Stencil::c12;
54 divphi_arr(i, j, k, icomp) +=
55 (cp1 * phi_arr(i, j + 1, k, (icomp * AMREX_SPACEDIM) + 1) +
56 c * phi_arr(i, j, k, (icomp * AMREX_SPACEDIM) + 1) +
57 cm1 * phi_arr(i, j - 1, k, (icomp * AMREX_SPACEDIM) + 1)) *
58 idx[1];
59
60 cp1 = Stencil::c20;
61 c = Stencil::c21;
62 cm1 = Stencil::c22;
63 divphi_arr(i, j, k, icomp) +=
64 (cp1 * phi_arr(i, j, k + 1, (icomp * AMREX_SPACEDIM) + 2) +
65 c * phi_arr(i, j, k, (icomp * AMREX_SPACEDIM) + 2) +
66 cm1 * phi_arr(i, j, k - 1, (icomp * AMREX_SPACEDIM) + 2)) *
67 idx[2];
68 }
69 });
70 }
71
72 FTypeOut& m_divphi;
73 const FTypeIn& m_phi;
74};
75
79template <typename FTypeIn, typename FTypeOut>
80void divergence(FTypeOut& divphi, const FTypeIn& phi)
81{
82 BL_PROFILE("amr-wind::fvm::divergence");
83 Divergence<FTypeIn, FTypeOut> grad(divphi, phi);
84 impl::apply(grad, phi);
85}
86
90template <typename FType>
91std::unique_ptr<ScratchField> divergence(const FType& phi)
92{
93 AMREX_ALWAYS_ASSERT(phi.num_comp() >= AMREX_SPACEDIM);
94 AMREX_ALWAYS_ASSERT(phi.num_comp() % AMREX_SPACEDIM == 0);
95 const std::string gname = phi.name() + "_divergence";
96 auto divphi =
97 phi.repo().create_scratch_field(gname, phi.num_comp() / AMREX_SPACEDIM);
98 divergence(*divphi, phi);
99 return divphi;
100}
101
102} // namespace amr_wind::fvm
103
104#endif /* DIVERGENCE_H */
void divergence(FTypeOut &divphi, const FTypeIn &phi)
Definition divergence.H:80
AMREX_INLINE void apply(const FvmOp &fvmop, const FType &fld)
Definition fvm_utils.H:14
Definition SchemeTraits.H:6
Definition divergence.H:16
Divergence(FTypeOut &divphi, const FTypeIn &phi)
Definition divergence.H:17
FTypeOut & m_divphi
Definition divergence.H:72
void apply(const int lev, const amrex::MFIter &mfi) const
Definition divergence.H:26
const FTypeIn & m_phi
Definition divergence.H:73