/home/runner/work/amr-wind/amr-wind/amr-wind/wind_energy/actuator/turbine/external/ExtTurbIface.H Source File

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/wind_energy/actuator/turbine/external/ExtTurbIface.H Source File
AMR-Wind 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 amr_wind {
17class CFDSim;
18}
19
20namespace ext_turb {
21
22template <typename SolverTurbine, typename SolverData>
24 : public ::amr_wind::ExtSolver::Register<
25 ExtTurbIface<SolverTurbine, SolverData>>
26{
27public:
28 static std::string identifier() { return ext_id<SolverData>(); }
29
30 explicit ExtTurbIface(const ::amr_wind::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
44 /* -- Specific to each type of external turbine -- */
45
46 ~ExtTurbIface() override;
47
49 const amr_wind::CFDSim& /*sim*/, const std::string& /*inp_name*/);
50
51 void init_solution(const int local_id);
52
53 void get_hub_stats(const int local_id);
54
55 void do_turbine_step(SolverTurbine& fi);
56
58
59protected:
61
62 void ext_init_turbine(SolverTurbine& /*fi*/);
63
64 void ext_restart_turbine(SolverTurbine& /*fi*/);
65
66 void ext_replay_turbine(SolverTurbine& /*fi*/);
67
68 void prepare_netcdf_file(SolverTurbine& /*unused*/);
69
70 void write_velocity_data(const SolverTurbine& /*unused*/);
71
72 static void read_velocity_data(
73 SolverTurbine& /*unused*/,
74 const ncutils::NCFile& /*unused*/,
75 const size_t tid);
76
78 std::map<int, int> m_turbine_map;
79
80 std::vector<SolverTurbine*> m_turbine_data;
81
82 amrex::Real m_dt_cfd{0.0_rt};
83 amrex::Real m_start_time{0.0_rt};
84 amrex::Real m_stop_time{-1.0_rt};
86
87 SolverData m_solver_data;
88
89 bool m_is_initialized{false};
90};
91
92// General implementations of some functions
93template <typename SolverTurbine, typename SolverData>
97
98template <typename SolverTurbine, typename SolverData>
100 SolverTurbine& data)
101{
102 BL_PROFILE("amr-wind::ExtTurbIface::register_turbine");
103 AMREX_ALWAYS_ASSERT(!m_is_initialized);
104 const int local_id = static_cast<int>(m_turbine_data.size());
105 const int gid = data.tid_global;
106 m_turbine_map[gid] = local_id;
107 data.tid_local = local_id;
108 m_turbine_data.emplace_back(&data);
109
110 return local_id;
111}
112
113template <typename SolverTurbine, typename SolverData>
115{
116 AMREX_ALWAYS_ASSERT(local_id < static_cast<int>(m_turbine_data.size()));
117 if (!m_is_initialized) {
119 }
120 auto& fi = *m_turbine_data[local_id];
121
122 switch (fi.sim_mode) {
123 case ::ext_turb::SimMode::init: {
126 break;
127 }
128
129 case ::ext_turb::SimMode::replay: {
132 break;
133 }
134
135 case ::ext_turb::SimMode::restart: {
138 break;
139 }
140 }
141}
142
143template <typename SolverTurbine, typename SolverData>
145 const int local_id)
146{
147 BL_PROFILE("amr-wind::ExtTurbIface::advance_turbine");
148 AMREX_ASSERT(local_id < static_cast<int>(m_turbine_data.size()));
149
150 auto& fi = *m_turbine_data[local_id];
151 AMREX_ASSERT(!fi.is_solution0);
152 {
153 // Default is off, unless a turbine model reads, populates stop_time
154 const auto& tmax = fi.stop_time;
155 const auto& telapsed = (fi.time_index + fi.num_substeps) * fi.dt_ext;
156 if (telapsed > (tmax + std::numeric_limits<float>::epsilon()) &&
157 fi.stop_time > 0.0_rt) {
158 // clang-format off
159 amrex::OutStream()
160 << "\nWARNING: ExtTurbIface:\n"
161 << " Elapsed simulation time will exceed max "
162 << "time set for External Turbine Solver"
163 << std::endl << std::endl;
164 // clang-format on
165 }
166 }
167
169 for (int i = 0; i < fi.num_substeps; ++i, ++fi.time_index) {
170 do_turbine_step(fi);
171 }
172
173 if (fi.chkpt_interval > 0 &&
174 (fi.time_index / fi.num_substeps) % fi.chkpt_interval == 0) {
175 write_turbine_checkpoint(fi.tid_local);
176 }
177}
178
179} // namespace ext_turb
180
181#endif /* EXTTURBIFACE_H */
Definition CFDSim.H:54
void init_solution(const int local_id)
amrex::Real m_stop_time
Definition ExtTurbIface.H:84
void write_velocity_data(const SolverTurbine &)
void parse_inputs(const amr_wind::CFDSim &, const std::string &)
amrex::Real m_start_time
Definition ExtTurbIface.H:83
std::map< int, int > m_turbine_map
Global to local index lookup map.
Definition ExtTurbIface.H:78
void ext_replay_turbine(SolverTurbine &)
ExtTurbIface(const ::amr_wind::CFDSim &sim)
Definition ExtTurbIface.H:94
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:80
static void read_velocity_data(SolverTurbine &, const ncutils::NCFile &, const size_t tid)
::ext_turb::SimMode m_sim_mode
Definition ExtTurbIface.H:85
void advance_turbine(const int local_id)
Definition ExtTurbIface.H:144
void prepare_netcdf_file(SolverTurbine &)
bool m_is_initialized
Definition ExtTurbIface.H:89
int register_turbine(SolverTurbine &data)
Definition ExtTurbIface.H:99
void ext_init_turbine(SolverTurbine &)
static std::string identifier()
Definition ExtTurbIface.H:28
SolverData m_solver_data
Definition ExtTurbIface.H:87
void write_turbine_checkpoint(int &tid)
void ext_restart_turbine(SolverTurbine &)
void init_turbine(const int local_id)
Definition ExtTurbIface.H:114
amrex::Real m_dt_cfd
Definition ExtTurbIface.H:82
Definition nc_interface.H:293
This test case is intended as an evaluation of the momentum advection scheme.
Definition BCInterface.cpp:10
Definition external_base_types.H:9
SimMode
Definition external_base_types.H:11
@ init
Clean start.
Definition external_base_types.H:12
std::string ext_id()
Definition nc_interface.cpp:12