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