/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(!m_is_initialized);
109 const int local_id = static_cast<int>(m_turbine_data.size());
110 const int gid = data.tid_global;
111 m_turbine_map[gid] = local_id;
112 data.tid_local = local_id;
113 m_turbine_data.emplace_back(&data);
114
115 return local_id;
116}
117
118template <typename SolverTurbine, typename SolverData>
120{
121 AMREX_ALWAYS_ASSERT(local_id < static_cast<int>(m_turbine_data.size()));
122 if (!m_is_initialized) {
124 }
125 auto& fi = *m_turbine_data[local_id];
126
127 switch (fi.sim_mode) {
128 case ::ext_turb::SimMode::init: {
131 break;
132 }
133
134 case ::ext_turb::SimMode::replay: {
137 break;
138 }
139
140 case ::ext_turb::SimMode::restart: {
143 break;
144 }
145 }
146}
147
148template <typename SolverTurbine, typename SolverData>
150 const int local_id)
151{
152 BL_PROFILE("kynema-sgf::ExtTurbIface::advance_turbine");
153 AMREX_ASSERT(local_id < static_cast<int>(m_turbine_data.size()));
154
155 auto& fi = *m_turbine_data[local_id];
156 AMREX_ASSERT(!fi.is_solution0);
157 {
158 // Default is off, unless a turbine model reads, populates stop_time
159 const auto& tmax = fi.stop_time;
160 const auto& telapsed = (fi.time_index + fi.num_substeps) * fi.dt_ext;
161 if (telapsed > (tmax + std::numeric_limits<float>::epsilon()) &&
162 fi.stop_time > 0.0_rt) {
163 // clang-format off
164 amrex::OutStream()
165 << "\nWARNING: ExtTurbIface:\n"
166 << " Elapsed simulation time will exceed max "
167 << "time set for External Turbine Solver"
168 << std::endl << std::endl;
169 // clang-format on
170 }
171 }
172
174 for (int i = 0; i < fi.num_substeps; ++i, ++fi.time_index) {
175 do_turbine_step(fi);
176 }
177
178 if (fi.chkpt_interval > 0 &&
179 (fi.time_index / fi.num_substeps) % fi.chkpt_interval == 0) {
180 write_turbine_checkpoint(fi.tid_local);
181 }
182}
183
184} // namespace ext_turb
185
186#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:149
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:119
amrex::Real m_dt_cfd
Definition ExtTurbIface.H:87
Definition CFDSim.H:55
Definition nc_interface.H:285
Definition external_base_types.H:10
SimMode
Definition external_base_types.H:12
@ init
Clean start.
Definition external_base_types.H:13
std::string ext_id()
This test case is intended as an evaluation of the momentum advection scheme.
Definition BCInterface.cpp:10
Definition nc_interface.cpp:12