/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_v<Scheme, fvm::Godunov> ? FieldState::New
64
65 const int nlevels = fields.repo.num_active_levels();
66 auto& field = fields.field;
67 const auto& field_old = field.state(FieldState::Old);
68 const auto& conv_term = fields.conv_term.state(fstate);
69
70 for (int lev = 0; lev < nlevels; ++lev) {
71 const auto& phi_arrs = field(lev).arrays();
72 const auto& phi_o_arrs = field_old(lev).const_arrays();
73 const auto& ddt_o_arrs = conv_term(lev).const_arrays();
74
75 amrex::ParallelFor(
76 field(lev), [=] AMREX_GPU_DEVICE(int nbx, int i, int j, int k) {
77 phi_arrs[nbx](i, j, k) = phi_o_arrs[nbx](i, j, k) +
78 (dt * ddt_o_arrs[nbx](i, j, k));
79 // Defer n+1/2 update to the time-stepping algorithm
80 // phi_nph(i, j, k) = 0.5_rt * (phi(i, j, k) + phi_o(i, j,
81 // k));
82 });
83 }
84 amrex::Gpu::streamSynchronize();
85 }
86
88 const DiffusionType /*unused*/,
89 const amrex::Real dt,
90 bool /*mesh_mapping*/)
91 {
92 const int nlevels = fields.repo.num_active_levels();
93 auto& field = fields.field;
94 const auto& field_old = field.state(FieldState::Old);
95 const auto& conv_term = fields.conv_term;
96 const auto& conv_term_old = fields.conv_term.state(FieldState::Old);
97
98 for (int lev = 0; lev < nlevels; ++lev) {
99 auto phi_arrs = field(lev).arrays();
100 const auto phi_o_arrs = field_old(lev).const_arrays();
101 const auto ddt_arrs = conv_term(lev).const_arrays();
102 const auto ddt_o_arrs = conv_term_old(lev).const_arrays();
103
104 amrex::ParallelFor(
105 field(lev), [=] AMREX_GPU_DEVICE(int nbx, int i, int j, int k) {
106 phi_arrs[nbx](i, j, k) =
107 phi_o_arrs[nbx](i, j, k) +
108 (dt * 0.5_rt *
109 (ddt_o_arrs[nbx](i, j, k) + ddt_arrs[nbx](i, j, k)));
110 // Defer n+1/2 update to time-stepping algorithm
111 // phi_nph(i, j, k) =
112 // 0.5_rt * (phi(i, j, k) + phi_o(i, j, k));
113 });
114 }
115 amrex::Gpu::streamSynchronize();
116 }
117
118 void improve_explicit_diff(const amrex::Real /*unused*/) {}
119
120 // data members
122};
123
127template <>
129{
130 PostSolveOp(CFDSim& sim, PDEFields& fields) : m_sim(sim), m_fields(fields)
131 {}
132
133 void operator()(const amrex::Real /*unused*/)
134 {
135 m_fields.field.fillpatch(m_sim.time().current_time());
136 auto& multiphase = m_sim.physics_manager().get<MultiPhase>();
137 multiphase.set_density_via_levelset();
138 }
139
142};
143
144} // namespace amr_wind::pde
145
146#endif /* LEVELSET_OPS_H */
Definition CFDSim.H:54
Definition MultiPhase.H:31
Definition SimTime.H:33
@ New
Same as FieldState::NP1.
Definition FieldDescTypes.H:22
@ Old
Same as FieldState::N.
Definition FieldDescTypes.H:23
DiffusionType
Definition incflo_enums.H:6
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:52
void corrector_rhs(const DiffusionType, const amrex::Real dt, bool)
Definition levelset_ops.H:87
void improve_explicit_diff(const amrex::Real)
Definition levelset_ops.H:118
ComputeRHSOp(PDEFields &fields_in)
Definition levelset_ops.H:53
PDEFields & fields
Definition levelset_ops.H:121
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:133
PostSolveOp(CFDSim &sim, PDEFields &fields)
Definition levelset_ops.H:130
PDEFields & m_fields
Definition levelset_ops.H:141
CFDSim & m_sim
Definition levelset_ops.H:140