/home/runner/work/amr-wind/amr-wind/amr-wind/equation_systems/levelset/levelset_ops.H Source File

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/equation_systems/levelset/levelset_ops.H Source File
AMR-Wind API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
levelset_ops.H
Go to the documentation of this file.
1#ifndef LEVELSET_OPS_H
2#define LEVELSET_OPS_H
3
6#include "AMReX_REAL.H"
7
8using namespace amrex::literals;
9
10namespace amr_wind::pde {
11
15template <typename Scheme>
16struct FieldRegOp<Levelset, Scheme>
17{
18 explicit FieldRegOp(CFDSim& sim_in) : sim(sim_in) {}
19
21 {
22 auto& repo = sim.repo();
23 auto fields = create_fields_instance<Levelset, Scheme>(time, repo);
24
25 auto& normal =
26 repo.declare_cc_field("interface_normal", AMREX_SPACEDIM, 1, 1);
27 auto& curvature = repo.declare_cc_field("interface_curvature", 1, 1, 1);
28
29 normal.template register_fill_patch_op<FieldFillPatchOps<FieldBCNoOp>>(
30 repo.mesh(), time);
31 curvature
32 .template register_fill_patch_op<FieldFillPatchOps<FieldBCNoOp>>(
33 repo.mesh(), time);
34
35 // Register fields for output/restart
36 auto& iomgr = sim.io_manager();
37 iomgr.register_io_var(fields.field.name());
38 iomgr.register_io_var(normal.name());
39 iomgr.register_io_var(curvature.name());
40
41 return fields;
42 }
43
45};
46
50template <typename Scheme>
51struct ComputeRHSOp<Levelset, Scheme>
52{
53 explicit ComputeRHSOp(PDEFields& fields_in) : fields(fields_in) {}
54
56 const DiffusionType /*unused*/,
57 const amrex::Real dt,
58 bool /*mesh_mapping*/)
59 {
60 // Field states for diffusion and advection terms. In Godunov scheme
61 // these terms only have one state.
62 auto fstate = std::is_same<Scheme, fvm::Godunov>::value
65
66 const int nlevels = fields.repo.num_active_levels();
67 auto& field = fields.field;
68 const auto& field_old = field.state(FieldState::Old);
69 const auto& conv_term = fields.conv_term.state(fstate);
70
71 for (int lev = 0; lev < nlevels; ++lev) {
72 const auto& phi_arrs = field(lev).arrays();
73 const auto& phi_o_arrs = field_old(lev).const_arrays();
74 const auto& ddt_o_arrs = conv_term(lev).const_arrays();
75
76 amrex::ParallelFor(
77 field(lev),
78 [=] AMREX_GPU_DEVICE(int nbx, int i, int j, int k) noexcept {
79 phi_arrs[nbx](i, j, k) = phi_o_arrs[nbx](i, j, k) +
80 dt * ddt_o_arrs[nbx](i, j, k);
81 // Defer n+1/2 update to the time-stepping algorithm
82 // phi_nph(i, j, k) = 0.5_rt * (phi(i, j, k) + phi_o(i, j,
83 // k));
84 });
85 }
86 amrex::Gpu::streamSynchronize();
87 }
88
90 const DiffusionType /*unused*/,
91 const amrex::Real dt,
92 bool /*mesh_mapping*/)
93 {
94 const int nlevels = fields.repo.num_active_levels();
95 auto& field = fields.field;
96 const auto& field_old = field.state(FieldState::Old);
97 const auto& conv_term = fields.conv_term;
98 const auto& conv_term_old = fields.conv_term.state(FieldState::Old);
99
100 for (int lev = 0; lev < nlevels; ++lev) {
101 auto phi_arrs = field(lev).arrays();
102 const auto phi_o_arrs = field_old(lev).const_arrays();
103 const auto ddt_arrs = conv_term(lev).const_arrays();
104 const auto ddt_o_arrs = conv_term_old(lev).const_arrays();
105
106 amrex::ParallelFor(
107 field(lev),
108 [=] AMREX_GPU_DEVICE(int nbx, int i, int j, int k) noexcept {
109 phi_arrs[nbx](i, j, k) =
110 phi_o_arrs[nbx](i, j, k) +
111 dt * 0.5_rt *
112 (ddt_o_arrs[nbx](i, j, k) + ddt_arrs[nbx](i, j, k));
113 // Defer n+1/2 update to time-stepping algorithm
114 // phi_nph(i, j, k) =
115 // 0.5_rt * (phi(i, j, k) + phi_o(i, j, k));
116 });
117 }
118 amrex::Gpu::streamSynchronize();
119 }
120
121 void improve_explicit_diff(const amrex::Real /*unused*/) {}
122
123 // data members
125};
126
130template <>
132{
133 PostSolveOp(CFDSim& sim, PDEFields& fields) : m_sim(sim), m_fields(fields)
134 {}
135
136 void operator()(const amrex::Real /*unused*/)
137 {
138 m_fields.field.fillpatch(m_sim.time().current_time());
139 auto& multiphase = m_sim.physics_manager().get<MultiPhase>();
140 multiphase.set_density_via_levelset();
141 }
142
145};
146
147} // namespace amr_wind::pde
148
149#endif /* LEVELSET_OPS_H */
Definition CFDSim.H:54
Definition MultiPhase.H:30
Definition SimTime.H:33
@ New
Same as FieldState::NP1.
Definition FieldDescTypes.H:20
@ Old
Same as FieldState::N.
Definition FieldDescTypes.H:21
DiffusionType
Definition incflo_enums.H:4
Definition height_functions.H:8
Definition AdvOp_Godunov.H:21
PDEFields create_fields_instance(const SimTime &time, FieldRepo &repo, const FieldInterpolator itype=FieldInterpolator::CellConsLinear)
Definition PDEHelpers.H:49
void corrector_rhs(const DiffusionType, const amrex::Real dt, bool)
Definition levelset_ops.H:89
void improve_explicit_diff(const amrex::Real)
Definition levelset_ops.H:121
ComputeRHSOp(PDEFields &fields_in)
Definition levelset_ops.H:53
PDEFields & fields
Definition levelset_ops.H:124
void predictor_rhs(const DiffusionType, const amrex::Real dt, bool)
Definition levelset_ops.H:55
FieldRegOp(CFDSim &sim_in)
Definition levelset_ops.H:18
CFDSim & sim
Definition levelset_ops.H:44
PDEFields operator()(const SimTime &time)
Definition levelset_ops.H:20
Definition levelset.H:31
Definition PDEFields.H:27
void operator()(const amrex::Real)
Definition levelset_ops.H:136
PostSolveOp(CFDSim &sim, PDEFields &fields)
Definition levelset_ops.H:133
PDEFields & m_fields
Definition levelset_ops.H:144
CFDSim & m_sim
Definition levelset_ops.H:143