/home/runner/work/kynema-sgf/kynema-sgf/src/wind_energy/actuator/turbine/external/ExtTurbIface.H Source File

Kynema-SGF API: /home/runner/work/kynema-sgf/kynema-sgf/src/wind_energy/actuator/turbine/external/ExtTurbIface.H Source File
Kynema-SGF API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
ExtTurbIface.H
Go to the documentation of this file.
1#ifndef EXTTURBIFACE_H
2#define EXTTURBIFACE_H
3
4#include <map>
5#include <vector>
8#include "AMReX_REAL.H"
9
10using namespace amrex::literals;
11
12namespace ncutils {
13class NCFile;
14}
15
16namespace kynema_sgf {
17class CFDSim;
18}
19
20namespace ext_turb {
21
22template <typename SolverTurbine, typename SolverData>
24 : public ::kynema_sgf::ExtSolver::Register<
25 ExtTurbIface<SolverTurbine, SolverData>>
26{
27public:
28 static std::string identifier() { return ext_id<SolverData>(); }
29
30 explicit ExtTurbIface(const ::kynema_sgf::CFDSim& sim);
31
32 /* -- General for all external turbines -- */
33 int register_turbine(SolverTurbine& data);
34
35 void init_turbine(const int local_id);
36
37 void advance_turbine(const int local_id);
38
40 {
41 return static_cast<int>(m_turbine_data.size());
42 }
43
45 {
46 return m_solver_data.m_offset_velocity;
47 }
48
49 /* -- Specific to each type of external turbine -- */
50
51 ~ExtTurbIface() override;
52
54 const kynema_sgf::CFDSim& /*sim*/, const std::string& /*inp_name*/);
55
56 void init_solution(const int local_id);
57
58 void get_hub_stats(const int local_id);
59
60 void do_turbine_step(SolverTurbine& fi);
61
63
64protected:
66
67 void ext_init_turbine(SolverTurbine& /*fi*/);
68
69 void ext_restart_turbine(SolverTurbine& /*fi*/);
70
71 void ext_replay_turbine(SolverTurbine& /*fi*/);
72
73 void prepare_netcdf_file(SolverTurbine& /*unused*/);
74
75 void write_velocity_data(const SolverTurbine& /*unused*/);
76
77 static void read_velocity_data(
78 SolverTurbine& /*unused*/,
79 const ncutils::NCFile& /*unused*/,
80 const size_t tid);
81
83 std::map<int, int> m_turbine_map;
84
85 std::vector<SolverTurbine*> m_turbine_data;
86
87 amrex::Real m_dt_cfd{0.0_rt};
88 amrex::Real m_start_time{0.0_rt};
89 amrex::Real m_stop_time{-1.0_rt};
91
92 SolverData m_solver_data;
93
94 bool m_is_initialized{false};
95};
96
97// General implementations of some functions
98template <typename SolverTurbine, typename SolverData>
102
103template <typename SolverTurbine, typename SolverData>
105 SolverTurbine& data)
106{
107 BL_PROFILE("kynema-sgf::ExtTurbIface::register_turbine");
108 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
110 "m_is_initialized = " + std::to_string(m_is_initialized));
111 const int local_id = static_cast<int>(m_turbine_data.size());
112 const int gid = data.tid_global;
113 m_turbine_map[gid] = local_id;
114 data.tid_local = local_id;
115 m_turbine_data.emplace_back(&data);
116
117 return local_id;
118}
119
120template <typename SolverTurbine, typename SolverData>
122{
123 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
124 local_id < static_cast<int>(m_turbine_data.size()),
125 "local_id = " + std::to_string(local_id) +
126 ", m_turbine_data.size() = " +
127 std::to_string(m_turbine_data.size()));
128 if (!m_is_initialized) {
130 }
131 auto& fi = *m_turbine_data[local_id];
132
133 switch (fi.sim_mode) {
134 case ::ext_turb::SimMode::init: {
137 break;
138 }
139
140 case ::ext_turb::SimMode::replay: {
143 break;
144 }
145
146 case ::ext_turb::SimMode::restart: {
149 break;
150 }
151 }
152}
153
154template <typename SolverTurbine, typename SolverData>
156 const int local_id)
157{
158 BL_PROFILE("kynema-sgf::ExtTurbIface::advance_turbine");
159 AMREX_ASSERT(local_id < static_cast<int>(m_turbine_data.size()));
160
161 auto& fi = *m_turbine_data[local_id];
162 AMREX_ASSERT(!fi.is_solution0);
163 {
164 // Default is off, unless a turbine model reads, populates stop_time
165 const auto& tmax = fi.stop_time;
166 const auto& telapsed = (fi.time_index + fi.num_substeps) * fi.dt_ext;
167 if (telapsed > (tmax + std::numeric_limits<float>::epsilon()) &&
168 fi.stop_time > 0.0_rt) {
169 // clang-format off
170 amrex::OutStream()
171 << "\nWARNING: ExtTurbIface:\n"
172 << " Elapsed simulation time will exceed max "
173 << "time set for External Turbine Solver"
174 << std::endl << std::endl;
175 // clang-format on
176 }
177 }
178
180 for (int i = 0; i < fi.num_substeps; ++i, ++fi.time_index) {
181 do_turbine_step(fi);
182 }
183
184 if (fi.chkpt_interval > 0 &&
185 (fi.time_index / fi.num_substeps) % fi.chkpt_interval == 0) {
186 write_turbine_checkpoint(fi.tid_local);
187 }
188}
189
190} // namespace ext_turb
191
192#endif /* EXTTURBIFACE_H */
void init_solution(const int local_id)
amrex::Real m_stop_time
Definition ExtTurbIface.H:89
void write_velocity_data(const SolverTurbine &)
void parse_inputs(const kynema_sgf::CFDSim &, const std::string &)
amrex::Real m_start_time
Definition ExtTurbIface.H:88
std::map< int, int > m_turbine_map
Global to local index lookup map.
Definition ExtTurbIface.H:83
ExtTurbIface(const ::kynema_sgf::CFDSim &sim)
Definition ExtTurbIface.H:99
void ext_replay_turbine(SolverTurbine &)
void do_turbine_step(SolverTurbine &fi)
int num_local_turbines() const
Definition ExtTurbIface.H:39
void get_hub_stats(const int local_id)
std::vector< SolverTurbine * > m_turbine_data
Definition ExtTurbIface.H:85
static void read_velocity_data(SolverTurbine &, const ncutils::NCFile &, const size_t tid)
::ext_turb::SimMode m_sim_mode
Definition ExtTurbIface.H:90
void advance_turbine(const int local_id)
Definition ExtTurbIface.H:155
void prepare_netcdf_file(SolverTurbine &)
bool m_is_initialized
Definition ExtTurbIface.H:94
int register_turbine(SolverTurbine &data)
Definition ExtTurbIface.H:104
void ext_init_turbine(SolverTurbine &)
int offset_velocity_points() const
Definition ExtTurbIface.H:44
static std::string identifier()
Definition ExtTurbIface.H:28
SolverData m_solver_data
Definition ExtTurbIface.H:92
void write_turbine_checkpoint(int &tid)
void ext_restart_turbine(SolverTurbine &)
void init_turbine(const int local_id)
Definition ExtTurbIface.H:121
amrex::Real m_dt_cfd
Definition ExtTurbIface.H:87
Definition CFDSim.H:55
Definition nc_interface.H:285
Definition external_base_types.H:11
SimMode
Definition external_base_types.H:13
@ init
Clean start.
Definition external_base_types.H:14
std::string ext_id()
This test case is intended as an evaluation of the momentum advection scheme.
Definition BCInterface.cpp:12
Definition nc_interface.cpp:12