ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_WindFarm.H
Go to the documentation of this file.
1 #ifndef ERF_WINDFARM_H
2 #define ERF_WINDFARM_H
3 
4 #include <ERF_DataStruct.H>
5 #include <AMReX_Geometry.H>
6 #include <AMReX_MultiFab.H>
7 
8 #include "ERF_NullWindFarm.H"
9 #include "ERF_Fitch.H"
10 #include "ERF_EWP.H"
11 #include "ERF_SimpleAD.H"
12 #include "ERF_GeneralAD.H"
13 
14 /**
15  * @brief Manage a collection of wind turbine models.
16  */
17 class WindFarm : public NullWindFarm {
18 
19 public:
20 
21  WindFarm (){}
22 
23  virtual ~WindFarm () = default;
24 
25  WindFarm (int nlev,
26  const WindFarmType& a_windfarm_type)
27  {
28  m_windfarm_model.resize(nlev);
29  if (a_windfarm_type == WindFarmType::Fitch) {
30  SetModel<Fitch>();
31  amrex::Print() << "Fitch windfarm model!\n";
32  }
33  else if (a_windfarm_type == WindFarmType::EWP) {
34  SetModel<EWP>();
35  amrex::Print() << "EWP windfarm model!\n";
36  }
37  else if (a_windfarm_type == WindFarmType::SimpleAD) {
38  SetModel<SimpleAD>();
39  amrex::Print() << "Simplified actuator disk windfarm model!\n";
40  }
41  else if (a_windfarm_type == WindFarmType::GeneralAD) {
42  SetModel<GeneralAD>();
43  amrex::Print() << "Generalized actuator disk windfarm model!\n";
44  }
45  else {
46  amrex::Abort("WindFarm: Dont know this windfarm_type!") ;
47  }
48  }
49 
50  /**
51  * @brief Read turbine location and specification tables.
52  * @param[in] windfarm_loc_table Path to the location table.
53  * @param[in] windfarm_spec_table Path to the specification table.
54  * @param[in] x_y Whether to use Cartesian coordinates.
55  * @param[in] lat_lon Whether to use latitude and longitude coordinates.
56  * @param[in] windfarm_x_shift X-coordinate shift.
57  * @param[in] windfarm_y_shift Y-coordinate shift.
58  */
59  void read_tables (std::string windfarm_loc_table,
60  std::string windfarm_spec_table,
61  bool x_y, bool lat_lon,
62  const amrex::Real windfarm_x_shift = zero,
63  const amrex::Real windfarm_y_shift = zero);
64 
65  /**
66  * @brief Initialize wind farm using latitude and longitude coordinates.
67  * @param[in] windfarm_loc_table Path to the location table.
68  * @param[in] windfarm_x_shift X-coordinate shift.
69  * @param[in] windfarm_y_shift Y-coordinate shift.
70  */
71  void init_windfarm_lat_lon (const std::string windfarm_loc_table,
72  const amrex::Real windfarm_x_shift,
73  const amrex::Real windfarm_y_shift);
74 
75  /**
76  * @brief Initialize wind farm using Cartesian coordinates.
77  * @param[in] windfarm_loc_table Path to the location table.
78  */
79  void init_windfarm_x_y (const std::string windfarm_loc_table);
80 
81  /**
82  * @brief Read the turbine location table.
83  * @param[in] windfarm_loc_table Path to the location table.
84  * @param[in] x_y Whether to use Cartesian coordinates.
85  * @param[in] lat_lon Whether to use latitude and longitude coordinates.
86  * @param[in] windfarm_x_shift X-coordinate shift.
87  * @param[in] windfarm_y_shift Y-coordinate shift.
88  */
89  void read_windfarm_locations_table (const std::string windfarm_loc_table,
90  bool x_y, bool lat_lon,
91  const amrex::Real windfarm_x_shift = zero,
92  const amrex::Real windfarm_y_shift = zero);
93 
94  /**
95  * @brief Read the turbine specification table.
96  * @param[in] windfarm_spec_table Path to the specification table.
97  */
98  void read_windfarm_spec_table (const std::string windfarm_spec_table);
99 
100  /**
101  * @brief Read the turbine blade table.
102  * @param[in] windfarm_blade_table Path to the blade table.
103  */
104  void read_windfarm_blade_table (const std::string windfarm_blade_table);
105 
106  /**
107  * @brief Read the airfoil tables.
108  * @param[in] windfarm_airfoil_tables Path to the airfoil tables.
109  * @param[in] windfarm_blade_table Path to the blade table.
110  */
111  void read_windfarm_airfoil_tables (const std::string windfarm_airfoil_tables,
112  const std::string windfarm_blade_table);
113 
114  /**
115  * @brief Read extra turbine specifications.
116  * @param[in] windfarm_spec_table_extra Path to the extra specification table.
117  */
118  void read_windfarm_spec_table_extra (const std::string windfarm_spec_table_extra);
119 
120  /**
121  * @brief Fill the turbine count MultiFab.
122  * @param[in] geom Geometry
123  * @param[out] mf_Nturb MultiFab to fill with turbine counts.
124  * @param[in,out] z_phys_nd Physical height MultiFab.
125  */
126  void fill_Nturb_multifab (const amrex::Geometry& geom,
127  amrex::MultiFab& mf_Nturb,
128  std::unique_ptr<amrex::MultiFab>& z_phys_nd);
129 
130  /**
131  * @brief Fill the SMark MultiFab.
132  * @param[in] geom Geometry
133  * @param[out] mf_SMark MultiFab to fill with SMark values.
134  * @param[in] sampling_distance_by_D Sampling distance normalized by rotor diameter.
135  * @param[in] turb_disk_angle Turbine disk angle.
136  * @param[in,out] z_phys_cc Physical height MultiFab.
137  */
138  void fill_SMark_multifab (const amrex::Geometry& geom,
139  amrex::MultiFab& mf_SMark,
140  const amrex::Real& sampling_distance_by_D,
141  const amrex::Real& turb_disk_angle,
142  std::unique_ptr<amrex::MultiFab>& z_phys_cc);
143 
144  /**
145  * @brief Fill the SMark MultiFab for mesoscale models.
146  * @param[in] geom Geometry
147  * @param[out] mf_SMark MultiFab to fill with SMark values.
148  * @param[in] mf_Nturb MultiFab containing turbine counts.
149  * @param[in,out] z_phys_cc Physical height MultiFab.
150  */
151  void fill_SMark_multifab_mesoscale_models (const amrex::Geometry& geom,
152  amrex::MultiFab& mf_SMark,
153  const amrex::MultiFab& mf_Nturb,
154  std::unique_ptr<amrex::MultiFab>& z_phys_cc);
155 
156  /**
157  * @brief Write turbine locations to a VTK file.
158  */
160 
161  /**
162  * @brief Write actuator disks to a VTK file.
163  * @param[in] geom Geometry
164  * @param[in] sampling_distance_by_D Sampling distance normalized by rotor diameter.
165  */
166  void write_actuator_disks_vtk (const amrex::Geometry& geom,
167  const amrex::Real& sampling_distance_by_D);
168 
169  /**
170  * @brief Advance the wind farm model in time.
171  * @param[in] a_geom Geometry
172  * @param[in] dt_advance Timestep.
173  * @param[in,out] cons_in Conservative variables.
174  * @param[in,out] mf_vars_windfarm Wind farm variables MultiFab.
175  * @param[in,out] U_old Old x-velocity MultiFab.
176  * @param[in,out] V_old Old y-velocity MultiFab.
177  * @param[in,out] W_old Old z-velocity MultiFab.
178  * @param[in] mf_Nturb Turbine count MultiFab.
179  * @param[in] mf_SMark SMark MultiFab.
180  * @param[in] time Current simulation time.
181  */
182  void advance (const amrex::Geometry& a_geom,
183  const double& dt_advance,
184  amrex::MultiFab& cons_in,
185  amrex::MultiFab& mf_vars_windfarm,
186  amrex::MultiFab& U_old,
187  amrex::MultiFab& V_old,
188  amrex::MultiFab& W_old,
189  const amrex::MultiFab& mf_Nturb,
190  const amrex::MultiFab& mf_SMark,
191  const double& time) override
192  {
193  m_windfarm_model[0]->advance(a_geom, dt_advance, cons_in, mf_vars_windfarm,
194  U_old, V_old, W_old, mf_Nturb, mf_SMark, time);
195  }
196 
197  /**
198  * @brief Set general turbine specifications.
199  * @param[in] a_rotor_rad Rotor radius.
200  * @param[in] a_hub_height Hub height.
201  * @param[in] a_thrust_coeff_standing Standing thrust coefficient.
202  * @param[in] a_wind_speed Wind speed vector.
203  * @param[in] a_thrust_coeff Thrust coefficient vector.
204  * @param[in] a_power Power vector.
205  */
206  void set_turb_spec (const amrex::Real& a_rotor_rad, const amrex::Real& a_hub_height,
207  const amrex::Real& a_thrust_coeff_standing, const amrex::Vector<amrex::Real>& a_wind_speed,
208  const amrex::Vector<amrex::Real>& a_thrust_coeff,
209  const amrex::Vector<amrex::Real>& a_power) override
210  {
211  m_windfarm_model[0]->set_turb_spec(a_rotor_rad, a_hub_height, a_thrust_coeff_standing,
212  a_wind_speed, a_thrust_coeff, a_power);
213  }
214 
215  /**
216  * @brief Set turbine locations.
217  * @param[in] a_xloc X locations.
218  * @param[in] a_yloc Y locations.
219  */
220  void set_turb_loc (const amrex::Vector<amrex::Real>& a_xloc,
221  const amrex::Vector<amrex::Real>& a_yloc) override
222  {
223  m_windfarm_model[0]->set_turb_loc(a_xloc, a_yloc);
224  }
225 
226  /**
227  * @brief Set the turbine disk angle.
228  * @param[in] a_turb_disk_angle Disk angle.
229  */
230  void set_turb_disk_angle (const amrex::Real& a_turb_disk_angle) override
231  {
232  m_windfarm_model[0]->set_turb_disk_angle(a_turb_disk_angle);
233  }
234 
235  /**
236  * @brief Set blade specifications.
237  * @param[in] a_bld_rad_loc Blade radial locations.
238  * @param[in] a_bld_twist Blade twist.
239  * @param[in] a_bld_chord Blade chord.
240  */
241  void set_blade_spec (const amrex::Vector<amrex::Real>& a_bld_rad_loc,
242  const amrex::Vector<amrex::Real>& a_bld_twist,
243  const amrex::Vector<amrex::Real>& a_bld_chord) override
244  {
245  m_windfarm_model[0]->set_blade_spec(a_bld_rad_loc, a_bld_twist, a_bld_chord);
246  }
247 
248  /**
249  * @brief Set blade airfoil specifications.
250  * @param[in] a_bld_airfoil_aoa Angle of attack.
251  * @param[in] a_bld_airfoil_Cl Lift coefficient.
252  * @param[in] a_bld_airfoil_Cd Drag coefficient.
253  */
254  void set_blade_airfoil_spec (const amrex::Vector<amrex::Vector<amrex::Real>>& a_bld_airfoil_aoa,
255  const amrex::Vector<amrex::Vector<amrex::Real>>& a_bld_airfoil_Cl,
256  const amrex::Vector<amrex::Vector<amrex::Real>>& a_bld_airfoil_Cd) override
257  {
258  m_windfarm_model[0]->set_blade_airfoil_spec(a_bld_airfoil_aoa, a_bld_airfoil_Cl, a_bld_airfoil_Cd);
259  }
260 
261  /**
262  * @brief Set extra turbine specifications.
263  * @param[in] a_velocity Velocity.
264  * @param[in] a_C_P Power coefficient.
265  * @param[in] a_C_T Thrust coefficient.
266  * @param[in] a_rotor_RPM Rotor RPM.
267  * @param[in] a_blade_pitch Blade pitch.
268  */
269  void set_turb_spec_extra (const amrex::Vector<amrex::Real>& a_velocity,
270  const amrex::Vector<amrex::Real>& a_C_P,
271  const amrex::Vector<amrex::Real>& a_C_T,
272  const amrex::Vector<amrex::Real>& a_rotor_RPM,
273  const amrex::Vector<amrex::Real>& a_blade_pitch) override
274  {
275  m_windfarm_model[0]->set_turb_spec_extra(a_velocity, a_C_P, a_C_T, a_rotor_RPM, a_blade_pitch);
276  }
277 
278 protected:
279 
280  amrex::Vector<amrex::Real> xloc, yloc, zloc;
283  amrex::Vector<amrex::Real> wind_speed, thrust_coeff, power;
284  amrex::Vector<amrex::Real> bld_rad_loc, bld_twist, bld_chord;
285  amrex::Vector<amrex::Vector<amrex::Real>> bld_airfoil_aoa, bld_airfoil_Cl, bld_airfoil_Cd;
287  amrex::Vector<amrex::Real> velocity, C_P, C_T, rotor_RPM, blade_pitch;
288 
289  /*! \brief Create and set the specified windfarm model */
290  template<class NewWindFarmModel>
291  void SetModel ()
292  {
293  for (int lev(0); lev<m_windfarm_model.size(); ++lev) {
294  m_windfarm_model[lev] = std::make_unique<NewWindFarmModel>();
295  }
296  }
297 
298 private:
299  amrex::Vector<std::unique_ptr<NullWindFarm>> m_windfarm_model; /*!< windfarm model */
300 };
301 
302 #endif
303 
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_NullWindFarm.H:9
Manage a collection of wind turbine models.
Definition: ERF_WindFarm.H:17
amrex::Real my_turb_disk_angle
Definition: ERF_WindFarm.H:281
amrex::Vector< amrex::Real > yloc
Definition: ERF_WindFarm.H:280
virtual ~WindFarm()=default
amrex::Vector< amrex::Vector< amrex::Real > > bld_airfoil_Cl
Definition: ERF_WindFarm.H:285
amrex::Vector< amrex::Real > blade_pitch
Definition: ERF_WindFarm.H:287
WindFarm()
Definition: ERF_WindFarm.H:21
void set_turb_spec_extra(const amrex::Vector< amrex::Real > &a_velocity, const amrex::Vector< amrex::Real > &a_C_P, const amrex::Vector< amrex::Real > &a_C_T, const amrex::Vector< amrex::Real > &a_rotor_RPM, const amrex::Vector< amrex::Real > &a_blade_pitch) override
Set extra turbine specifications.
Definition: ERF_WindFarm.H:269
void read_windfarm_spec_table_extra(const std::string windfarm_spec_table_extra)
Read extra turbine specifications.
Definition: ERF_WindFarm.cpp:300
amrex::Vector< amrex::Vector< amrex::Real > > bld_airfoil_aoa
Definition: ERF_WindFarm.H:285
amrex::Vector< amrex::Real > velocity
Definition: ERF_WindFarm.H:287
void read_windfarm_blade_table(const std::string windfarm_blade_table)
Read the turbine blade table.
Definition: ERF_WindFarm.cpp:262
amrex::Vector< amrex::Real > wind_speed
Definition: ERF_WindFarm.H:283
void set_turb_loc(const amrex::Vector< amrex::Real > &a_xloc, const amrex::Vector< amrex::Real > &a_yloc) override
Set turbine locations.
Definition: ERF_WindFarm.H:220
void set_blade_spec(const amrex::Vector< amrex::Real > &a_bld_rad_loc, const amrex::Vector< amrex::Real > &a_bld_twist, const amrex::Vector< amrex::Real > &a_bld_chord) override
Set blade specifications.
Definition: ERF_WindFarm.H:241
void SetModel()
Create and set the specified windfarm model.
Definition: ERF_WindFarm.H:291
amrex::Vector< amrex::Real > C_P
Definition: ERF_WindFarm.H:287
amrex::Real hub_height
Definition: ERF_WindFarm.H:282
amrex::Vector< amrex::Real > zloc
Definition: ERF_WindFarm.H:280
amrex::Vector< amrex::Real > bld_twist
Definition: ERF_WindFarm.H:284
void fill_SMark_multifab_mesoscale_models(const amrex::Geometry &geom, amrex::MultiFab &mf_SMark, const amrex::MultiFab &mf_Nturb, std::unique_ptr< amrex::MultiFab > &z_phys_cc)
Fill the SMark MultiFab for mesoscale models.
Definition: ERF_WindFarm.cpp:557
void write_actuator_disks_vtk(const amrex::Geometry &geom, const amrex::Real &sampling_distance_by_D)
Write actuator disks to a VTK file.
Definition: ERF_WindFarm.cpp:843
amrex::Vector< amrex::Vector< amrex::Real > > bld_airfoil_Cd
Definition: ERF_WindFarm.H:285
amrex::Vector< amrex::Real > C_T
Definition: ERF_WindFarm.H:287
amrex::Vector< amrex::Real > thrust_coeff
Definition: ERF_WindFarm.H:283
void read_windfarm_spec_table(const std::string windfarm_spec_table)
Read the turbine specification table.
Definition: ERF_WindFarm.cpp:209
void read_windfarm_locations_table(const std::string windfarm_loc_table, bool x_y, bool lat_lon, const amrex::Real windfarm_x_shift=zero, const amrex::Real windfarm_y_shift=zero)
Read the turbine location table.
Definition: ERF_WindFarm.cpp:44
int n_bld_sections
Definition: ERF_WindFarm.H:286
WindFarm(int nlev, const WindFarmType &a_windfarm_type)
Definition: ERF_WindFarm.H:25
void advance(const amrex::Geometry &a_geom, const double &dt_advance, amrex::MultiFab &cons_in, amrex::MultiFab &mf_vars_windfarm, amrex::MultiFab &U_old, amrex::MultiFab &V_old, amrex::MultiFab &W_old, const amrex::MultiFab &mf_Nturb, const amrex::MultiFab &mf_SMark, const double &time) override
Advance the wind farm model in time.
Definition: ERF_WindFarm.H:182
void read_tables(std::string windfarm_loc_table, std::string windfarm_spec_table, bool x_y, bool lat_lon, const amrex::Real windfarm_x_shift=zero, const amrex::Real windfarm_y_shift=zero)
Read turbine location and specification tables.
Definition: ERF_WindFarm.cpp:19
amrex::Real nominal_power
Definition: ERF_WindFarm.H:282
void set_blade_airfoil_spec(const amrex::Vector< amrex::Vector< amrex::Real >> &a_bld_airfoil_aoa, const amrex::Vector< amrex::Vector< amrex::Real >> &a_bld_airfoil_Cl, const amrex::Vector< amrex::Vector< amrex::Real >> &a_bld_airfoil_Cd) override
Set blade airfoil specifications.
Definition: ERF_WindFarm.H:254
void init_windfarm_x_y(const std::string windfarm_loc_table)
Initialize wind farm using Cartesian coordinates.
Definition: ERF_WindFarm.cpp:178
amrex::Vector< amrex::Real > bld_chord
Definition: ERF_WindFarm.H:284
void init_windfarm_lat_lon(const std::string windfarm_loc_table, const amrex::Real windfarm_x_shift, const amrex::Real windfarm_y_shift)
Initialize wind farm using latitude and longitude coordinates.
Definition: ERF_WindFarm.cpp:71
void set_turb_spec(const amrex::Real &a_rotor_rad, const amrex::Real &a_hub_height, const amrex::Real &a_thrust_coeff_standing, const amrex::Vector< amrex::Real > &a_wind_speed, const amrex::Vector< amrex::Real > &a_thrust_coeff, const amrex::Vector< amrex::Real > &a_power) override
Set general turbine specifications.
Definition: ERF_WindFarm.H:206
amrex::Real thrust_coeff_standing
Definition: ERF_WindFarm.H:282
amrex::Vector< amrex::Real > xloc
Definition: ERF_WindFarm.H:280
void fill_Nturb_multifab(const amrex::Geometry &geom, amrex::MultiFab &mf_Nturb, std::unique_ptr< amrex::MultiFab > &z_phys_nd)
Fill the turbine count MultiFab.
Definition: ERF_WindFarm.cpp:432
void read_windfarm_airfoil_tables(const std::string windfarm_airfoil_tables, const std::string windfarm_blade_table)
Read the airfoil tables.
Definition: ERF_WindFarm.cpp:345
amrex::Real rotor_rad
Definition: ERF_WindFarm.H:282
void fill_SMark_multifab(const amrex::Geometry &geom, amrex::MultiFab &mf_SMark, const amrex::Real &sampling_distance_by_D, const amrex::Real &turb_disk_angle, std::unique_ptr< amrex::MultiFab > &z_phys_cc)
Fill the SMark MultiFab.
Definition: ERF_WindFarm.cpp:618
void write_turbine_locations_vtk()
Write turbine locations to a VTK file.
Definition: ERF_WindFarm.cpp:818
amrex::Vector< amrex::Real > rotor_RPM
Definition: ERF_WindFarm.H:287
amrex::Vector< amrex::Real > power
Definition: ERF_WindFarm.H:283
amrex::Vector< amrex::Real > bld_rad_loc
Definition: ERF_WindFarm.H:284
void set_turb_disk_angle(const amrex::Real &a_turb_disk_angle) override
Set the turbine disk angle.
Definition: ERF_WindFarm.H:230
amrex::Vector< std::unique_ptr< NullWindFarm > > m_windfarm_model
Definition: ERF_WindFarm.H:299