ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
SimpleAD Class Reference

#include <ERF_SimpleAD.H>

Inheritance diagram for SimpleAD:
Collaboration diagram for SimpleAD:

Public Member Functions

 SimpleAD ()
 
virtual ~SimpleAD ()=default
 
void advance (const amrex::Geometry &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
 
void compute_freestream_velocity (const amrex::MultiFab &cons_in, const amrex::MultiFab &U_old, const amrex::MultiFab &V_old, const amrex::MultiFab &mf_SMark)
 
void source_terms_cellcentered (const amrex::Geometry &geom, const amrex::MultiFab &cons_in, const amrex::MultiFab &mf_Smark, amrex::MultiFab &mf_vars_simpleAD)
 
void update (const double &dt_advance, amrex::MultiFab &cons_in, amrex::MultiFab &U_old, amrex::MultiFab &V_old, const amrex::MultiFab &mf_vars)
 
void compute_power_output (const double &time)
 
- Public Member Functions inherited from NullWindFarm
 NullWindFarm ()
 
virtual ~NullWindFarm ()=default
 
virtual void set_turb_spec (const amrex::Real &rotor_rad, const amrex::Real &hub_height, const amrex::Real &thrust_coeff_standing, const amrex::Vector< amrex::Real > &wind_speed, const amrex::Vector< amrex::Real > &thrust_coeff, const amrex::Vector< amrex::Real > &power)
 
virtual void set_turb_loc (const amrex::Vector< amrex::Real > &xloc, const amrex::Vector< amrex::Real > &yloc)
 
virtual void set_turb_disk_angle (const amrex::Real &turb_disk_angle)
 
virtual void set_blade_spec (const amrex::Vector< amrex::Real > &bld_rad_loc, const amrex::Vector< amrex::Real > &bld_twist, const amrex::Vector< amrex::Real > &bld_chord)
 
virtual void set_blade_airfoil_spec (const amrex::Vector< amrex::Vector< amrex::Real >> &bld_airfoil_aoa, const amrex::Vector< amrex::Vector< amrex::Real >> &bld_airfoil_Cl, const amrex::Vector< amrex::Vector< amrex::Real >> &bld_airfoil_Cd)
 
virtual void set_turb_spec_extra (const amrex::Vector< amrex::Real > &velocity, const amrex::Vector< amrex::Real > &C_P, const amrex::Vector< amrex::Real > &C_T, const amrex::Vector< amrex::Real > &rotor_RPM, const amrex::Vector< amrex::Real > &blade_pitch)
 
void get_turb_spec (amrex::Real &rotor_rad, amrex::Real &hub_height, amrex::Real &thrust_coeff_standing, amrex::Vector< amrex::Real > &wind_speed, amrex::Vector< amrex::Real > &thrust_coeff, amrex::Vector< amrex::Real > &power)
 
void get_turb_loc (amrex::Vector< amrex::Real > &xloc, amrex::Vector< amrex::Real > &yloc)
 
void get_turb_disk_angle (amrex::Real &turb_disk_angle)
 
void get_blade_spec (amrex::Vector< amrex::Real > &bld_rad_loc, amrex::Vector< amrex::Real > &bld_twist, amrex::Vector< amrex::Real > &bld_chord)
 
void get_blade_airfoil_spec (amrex::Vector< amrex::Vector< amrex::Real >> &bld_airfoil_aoa, amrex::Vector< amrex::Vector< amrex::Real >> &bld_airfoil_Cl, amrex::Vector< amrex::Vector< amrex::Real >> &bld_airfoil_Cd)
 
void get_turb_spec_extra (amrex::Vector< amrex::Real > &velocity, amrex::Vector< amrex::Real > &C_P, amrex::Vector< amrex::Real > &C_T, amrex::Vector< amrex::Real > &rotor_RPM, amrex::Vector< amrex::Real > &blade_pitch)
 

Protected Attributes

amrex::Vector< amrex::Realxloc
 
amrex::Vector< amrex::Realyloc
 
amrex::Real turb_disk_angle
 
amrex::Real hub_height
 
amrex::Real rotor_rad
 
amrex::Real thrust_coeff_standing
 
amrex::Real nominal_power
 
amrex::Vector< amrex::Realwind_speed
 
amrex::Vector< amrex::Realthrust_coeff
 
amrex::Vector< amrex::Realpower
 
amrex::Vector< amrex::Realfreestream_velocity
 
amrex::Vector< amrex::Realfreestream_phi
 
amrex::Vector< amrex::Realdisk_cell_count
 
- Protected Attributes inherited from NullWindFarm
amrex::Vector< amrex::Realm_xloc
 
amrex::Vector< amrex::Realm_yloc
 
amrex::Real m_turb_disk_angle
 
amrex::Real m_hub_height
 
amrex::Real m_rotor_rad
 
amrex::Real m_thrust_coeff_standing
 
amrex::Real m_nominal_power
 
amrex::Vector< amrex::Realm_wind_speed
 
amrex::Vector< amrex::Realm_thrust_coeff
 
amrex::Vector< amrex::Realm_power
 
amrex::Vector< amrex::Realm_bld_rad_loc
 
amrex::Vector< amrex::Realm_bld_twist
 
amrex::Vector< amrex::Realm_bld_chord
 
amrex::Vector< amrex::Vector< amrex::Real > > m_bld_airfoil_aoa
 
amrex::Vector< amrex::Vector< amrex::Real > > m_bld_airfoil_Cl
 
amrex::Vector< amrex::Vector< amrex::Real > > m_bld_airfoil_Cd
 
amrex::Vector< amrex::Realm_velocity
 
amrex::Vector< amrex::Realm_C_P
 
amrex::Vector< amrex::Realm_C_T
 
amrex::Vector< amrex::Realm_rotor_RPM
 
amrex::Vector< amrex::Realm_blade_pitch
 

Additional Inherited Members

- Static Public Member Functions inherited from NullWindFarm
static AMREX_GPU_DEVICE bool find_if_marked (amrex::Real x1, amrex::Real x2, amrex::Real y1, amrex::Real y2, amrex::Real x0, amrex::Real y0, amrex::Real nx, amrex::Real ny, amrex::Real d_hub_height, amrex::Real d_rotor_rad, amrex::Real z)
 

Constructor & Destructor Documentation

◆ SimpleAD()

SimpleAD::SimpleAD ( )
inline
12 {}

◆ ~SimpleAD()

virtual SimpleAD::~SimpleAD ( )
virtualdefault

Member Function Documentation

◆ advance()

void SimpleAD::advance ( const amrex::Geometry &  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 
)
overridevirtual

Implements NullWindFarm.

18 {
19  AMREX_ALWAYS_ASSERT(W_old.nComp() > 0);
20  AMREX_ALWAYS_ASSERT(mf_Nturb.nComp() > 0);
21  compute_freestream_velocity(cons_in, U_old, V_old, mf_SMark);
22  source_terms_cellcentered(geom, cons_in, mf_SMark, mf_vars_simpleAD);
23  update(dt_advance, cons_in, U_old, V_old, mf_vars_simpleAD);
25 }
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
void update(const double &dt_advance, amrex::MultiFab &cons_in, amrex::MultiFab &U_old, amrex::MultiFab &V_old, const amrex::MultiFab &mf_vars)
Definition: ERF_AdvanceSimpleAD.cpp:57
void compute_freestream_velocity(const amrex::MultiFab &cons_in, const amrex::MultiFab &U_old, const amrex::MultiFab &V_old, const amrex::MultiFab &mf_SMark)
Definition: ERF_AdvanceSimpleAD.cpp:84
void compute_power_output(const double &time)
Definition: ERF_AdvanceSimpleAD.cpp:28
void source_terms_cellcentered(const amrex::Geometry &geom, const amrex::MultiFab &cons_in, const amrex::MultiFab &mf_Smark, amrex::MultiFab &mf_vars_simpleAD)
Definition: ERF_AdvanceSimpleAD.cpp:165
Here is the call graph for this function:

◆ compute_freestream_velocity()

void SimpleAD::compute_freestream_velocity ( const amrex::MultiFab &  cons_in,
const amrex::MultiFab &  U_old,
const amrex::MultiFab &  V_old,
const amrex::MultiFab &  mf_SMark 
)
88 {
90  freestream_velocity.clear();
91  freestream_phi.clear();
92  disk_cell_count.clear();
93  freestream_velocity.resize(xloc.size(),zero);
94  freestream_phi.resize(xloc.size(),zero);
95  disk_cell_count.resize(xloc.size(),zero);
96 
97  Gpu::DeviceVector<Real> d_freestream_velocity(xloc.size());
98  Gpu::DeviceVector<Real> d_freestream_phi(yloc.size());
99  Gpu::DeviceVector<Real> d_disk_cell_count(yloc.size());
100  Gpu::copy(Gpu::hostToDevice, freestream_velocity.begin(), freestream_velocity.end(), d_freestream_velocity.begin());
101  Gpu::copy(Gpu::hostToDevice, freestream_phi.begin(), freestream_phi.end(), d_freestream_phi.begin());
102  Gpu::copy(Gpu::hostToDevice, disk_cell_count.begin(), disk_cell_count.end(), d_disk_cell_count.begin());
103 
104  Real* d_freestream_velocity_ptr = d_freestream_velocity.data();
105  Real* d_freestream_phi_ptr = d_freestream_phi.data();
106  Real* d_disk_cell_count_ptr = d_disk_cell_count.data();
107 
108 
109  for ( MFIter mfi(cons_in,TilingIfNotGPU()); mfi.isValid(); ++mfi) {
110 
111  auto SMark_array = mf_SMark.array(mfi);
112  auto u_vel = U_old.array(mfi);
113  auto v_vel = V_old.array(mfi);
114  // NOTE: this reduction is driven by the cell-centered SMark, so it must
115  // run over the cell-centered tilebox. Using nodaltilebox(0) here
116  // would include the plane at bigEnd(0)+1, which is a ghost cell of
117  // this box and a valid cell of its x-neighbor, and so would count
118  // that plane twice in the sums below.
119  Box tbx = mfi.tilebox();
120 
121  ParallelFor(tbx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
122 
123  if(SMark_array(i,j,k,0) != -one) {
124  int turb_index = static_cast<int>(SMark_array(i,j,k,0));
125  Real phi = std::atan2(v_vel(i,j,k),u_vel(i,j,k)); // Wind direction w.r.t the x-direction
126  Gpu::Atomic::Add(&d_freestream_velocity_ptr[turb_index],std::pow(u_vel(i,j,k)*u_vel(i,j,k) + v_vel(i,j,k)*v_vel(i,j,k),myhalf));
127  Gpu::Atomic::Add(&d_disk_cell_count_ptr[turb_index],one);
128  Gpu::Atomic::Add(&d_freestream_phi_ptr[turb_index],phi);
129  }
130  });
131  }
132 
133  // Copy back to host
134  Gpu::copy(Gpu::deviceToHost, d_freestream_velocity.begin(), d_freestream_velocity.end(), freestream_velocity.begin());
135  Gpu::copy(Gpu::deviceToHost, d_freestream_phi.begin(), d_freestream_phi.end(), freestream_phi.begin());
136  Gpu::copy(Gpu::deviceToHost, d_disk_cell_count.begin(), d_disk_cell_count.end(), disk_cell_count.begin());
137 
138  // Reduce the data on every processor
139  amrex::ParallelAllReduce::Sum(freestream_velocity.data(),
140  static_cast<int>(freestream_velocity.size()),
141  amrex::ParallelContext::CommunicatorAll());
142 
143  amrex::ParallelAllReduce::Sum(freestream_phi.data(),
144  static_cast<int>(freestream_phi.size()),
145  amrex::ParallelContext::CommunicatorAll());
146 
147 
148  amrex::ParallelAllReduce::Sum(disk_cell_count.data(),
149  static_cast<int>(disk_cell_count.size()),
150  amrex::ParallelContext::CommunicatorAll());
151 
153  /*if (ParallelDescriptor::IOProcessor()){
154  for(int it=0; it<xloc.size(); it++){
155 
156  std::cout << "turbine index, freestream velocity is " << it << " " << freestream_velocity[it] << " " <<
157  disk_cell_count[it] << " " <<
158  freestream_velocity[it]/(disk_cell_count[it] + 1e-10) << " " <<
159  freestream_phi[it]/(disk_cell_count[it] + 1e-10) << "\n";
160  }
161  }*/
162 }
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
ParallelFor(fab_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
amrex::Real Real
Definition: ERF_ShocInterface.H:19
void get_turb_loc(amrex::Vector< amrex::Real > &xloc, amrex::Vector< amrex::Real > &yloc)
Definition: ERF_NullWindFarm.H:96
amrex::Vector< amrex::Real > disk_cell_count
Definition: ERF_SimpleAD.H:50
amrex::Vector< amrex::Real > freestream_velocity
Definition: ERF_SimpleAD.H:50
amrex::Vector< amrex::Real > xloc
Definition: ERF_SimpleAD.H:46
amrex::Vector< amrex::Real > yloc
Definition: ERF_SimpleAD.H:46
amrex::Vector< amrex::Real > freestream_phi
Definition: ERF_SimpleAD.H:50
Here is the call graph for this function:

◆ compute_power_output()

void SimpleAD::compute_power_output ( const double &  time)
29 {
33 
34  const int n_spec_table = static_cast<int>(wind_speed.size());
35  // Compute power based on the look-up table
36 
37  if (ParallelDescriptor::IOProcessor()){
38  static std::ofstream file("power_output_SimpleAD.txt", std::ios::app);
39  // Check if the file opened successfully
40  if (!file.is_open()) {
41  std::cerr << "Error opening file!" << std::endl;
42  Abort("Could not open file to write power output in ERF_AdvanceSimpleAD.cpp");
43  }
44  Real total_power = zero;
45  for(int it=0; it<static_cast<int>(xloc.size()); it++){
46  Real avg_vel = freestream_velocity[it]/(disk_cell_count[it] + Real(1e-10));
47  Real turb_power = interpolate_1d(wind_speed.data(), power.data(), avg_vel, n_spec_table);
48  total_power = total_power + turb_power;
49  //printf("avg vel and power is %d %0.15g, %0.15g\n", it, avg_vel, turb_power);
50  }
51  file << time << " " << total_power << "\n";
52  file.flush();
53  }
54 }
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real interpolate_1d(const amrex::Real *alpha, const amrex::Real *beta, const amrex::Real alpha_interp, const int alpha_size)
Definition: ERF_Interpolation_1D.H:14
void get_turb_spec(amrex::Real &rotor_rad, amrex::Real &hub_height, amrex::Real &thrust_coeff_standing, amrex::Vector< amrex::Real > &wind_speed, amrex::Vector< amrex::Real > &thrust_coeff, amrex::Vector< amrex::Real > &power)
Definition: ERF_NullWindFarm.H:84
amrex::Real rotor_rad
Definition: ERF_SimpleAD.H:48
amrex::Vector< amrex::Real > thrust_coeff
Definition: ERF_SimpleAD.H:49
amrex::Real thrust_coeff_standing
Definition: ERF_SimpleAD.H:48
amrex::Vector< amrex::Real > wind_speed
Definition: ERF_SimpleAD.H:49
amrex::Vector< amrex::Real > power
Definition: ERF_SimpleAD.H:49
amrex::Real hub_height
Definition: ERF_SimpleAD.H:48
Here is the call graph for this function:

◆ source_terms_cellcentered()

void SimpleAD::source_terms_cellcentered ( const amrex::Geometry &  geom,
const amrex::MultiFab &  cons_in,
const amrex::MultiFab &  mf_Smark,
amrex::MultiFab &  mf_vars_simpleAD 
)
169 {
170 
174 
175  Gpu::DeviceVector<Real> d_xloc(xloc.size());
176  Gpu::DeviceVector<Real> d_yloc(yloc.size());
177  Gpu::copy(Gpu::hostToDevice, xloc.begin(), xloc.end(), d_xloc.begin());
178  Gpu::copy(Gpu::hostToDevice, yloc.begin(), yloc.end(), d_yloc.begin());
179 
180  auto dx = geom.CellSizeArray();
181 
182  // Domain valid box
183  const amrex::Box& domain = geom.Domain();
184  int domlo_x = domain.smallEnd(0);
185  int domhi_x = domain.bigEnd(0) + 1;
186  int domlo_y = domain.smallEnd(1);
187  int domhi_y = domain.bigEnd(1) + 1;
188  int domlo_z = domain.smallEnd(2);
189  int domhi_z = domain.bigEnd(2) + 1;
190 
191  // The order of variables are - Vabs dVabsdt, dudt, dvdt, dTKEdt
192  mf_vars_simpleAD.setVal(0.0);
193 
194  long unsigned int nturbs = static_cast<long unsigned int>(xloc.size());
195 
196  Gpu::DeviceVector<Real> d_freestream_velocity(nturbs);
197  Gpu::DeviceVector<Real> d_freestream_phi(nturbs);
198  Gpu::DeviceVector<Real> d_disk_cell_count(nturbs);
199  Gpu::copy(Gpu::hostToDevice, freestream_velocity.begin(), freestream_velocity.end(), d_freestream_velocity.begin());
200  Gpu::copy(Gpu::hostToDevice, freestream_phi.begin(), freestream_phi.end(), d_freestream_phi.begin());
201  Gpu::copy(Gpu::hostToDevice, disk_cell_count.begin(), disk_cell_count.end(), d_disk_cell_count.begin());
202 
203  Real* d_freestream_velocity_ptr = d_freestream_velocity.data();
204  Real* d_freestream_phi_ptr = d_freestream_phi.data();
205  Real* d_disk_cell_count_ptr = d_disk_cell_count.data();
206 
208  Real nx = -std::cos(turb_disk_angle);
209  Real ny = -std::sin(turb_disk_angle);
210 
211  // How much rotor area to attribute to each cell that the disk passes through.
212  // WindFarm::fill_SMark_multifab marks the staircase of cells that the disk plane
213  // cuts -- one cell per crossing -- so the average area of disk inside a marked cell
214  // is dz times the mean chord of a line with normal (nx,ny) across a dx by dy cell,
215  //
216  // A_cell = dx*dy*dz / (|nx|*dx + |ny|*dy)
217  //
218  // This is dy*dz for a disk facing x and dx*dz for a disk facing y, and summing it
219  // over the marked cells recovers the rotor area at any angle in between. It replaces
220  // a signed dy*dz*cos(turb_disk_angle), which vanished for a disk facing y (i.e. for
221  // erf.turb_disk_angle_from_x of 0 or 180) and changed sign past 180 degrees, turning
222  // the momentum sink into a source (issue #3673)
223  Real area_over_vol = one/(std::abs(nx)*dx[0] + std::abs(ny)*dx[1]);
224 
225  Gpu::DeviceVector<Real> d_wind_speed(wind_speed.size());
226  Gpu::DeviceVector<Real> d_thrust_coeff(thrust_coeff.size());
227 
228  // Copy data from host vectors to device vectors
229  Gpu::copy(Gpu::hostToDevice, wind_speed.begin(), wind_speed.end(), d_wind_speed.begin());
230  Gpu::copy(Gpu::hostToDevice, thrust_coeff.begin(), thrust_coeff.end(), d_thrust_coeff.begin());
231 
232  const Real* wind_speed_d = d_wind_speed.dataPtr();
233  const Real* thrust_coeff_d = d_thrust_coeff.dataPtr();
234  const int n_spec_table = static_cast<int>(d_wind_speed.size());
235 
236  for ( MFIter mfi(cons_in,TilingIfNotGPU()); mfi.isValid(); ++mfi) {
237 
238  const Box& gbx = mfi.growntilebox(1);
239  auto SMark_array = mf_SMark.array(mfi);
240  auto simpleAD_array = mf_vars_simpleAD.array(mfi);
241 
242  ParallelFor(gbx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
243  int ii = amrex::min(amrex::max(i, domlo_x), domhi_x);
244  int jj = amrex::min(amrex::max(j, domlo_y), domhi_y);
245  int kk = amrex::min(amrex::max(k, domlo_z), domhi_z);
246 
247 
248  Real source_x = zero;
249  Real source_y = zero;
250 
251  int it = static_cast<int>(SMark_array(ii,jj,kk,1));
252 
253  if(it != -1) {
254  Real avg_vel = d_freestream_velocity_ptr[it]/(d_disk_cell_count_ptr[it] + Real(1e-10));
255  Real phi = d_freestream_phi_ptr[it]/(d_disk_cell_count_ptr[it] + Real(1e-10));
256 
257  Real C_T = interpolate_1d(wind_speed_d, thrust_coeff_d, avg_vel, n_spec_table);
258  Real a;
259  if(C_T <= 1) {
260  a = myhalf - myhalf*std::pow(one-C_T,myhalf);
261  }
262  Real Uinfty_dot_nhat = avg_vel*(std::cos(phi)*nx + std::sin(phi)*ny);
263  if(C_T <= 1) {
264  source_x = -two*std::pow(Uinfty_dot_nhat, two)*a*(one-a)*area_over_vol*std::cos(phi);
265  source_y = -two*std::pow(Uinfty_dot_nhat, two)*a*(one-a)*area_over_vol*std::sin(phi);
266  }
267  else {
268  source_x = -myhalf*C_T*std::pow(Uinfty_dot_nhat, two)*area_over_vol*std::cos(phi);
269  source_y = -myhalf*C_T*std::pow(Uinfty_dot_nhat, two)*area_over_vol*std::sin(phi);
270  }
271  }
272 
273  simpleAD_array(i,j,k,0) = source_x;
274  simpleAD_array(i,j,k,1) = source_y;
275  });
276  }
277 }
constexpr amrex::Real two
Definition: ERF_Constants.H:10
const Real dx
Definition: ERF_InitCustomPert_ABL.H:44
void get_turb_disk_angle(amrex::Real &turb_disk_angle)
Definition: ERF_NullWindFarm.H:103
amrex::Real turb_disk_angle
Definition: ERF_SimpleAD.H:47
Here is the call graph for this function:

◆ update()

void SimpleAD::update ( const double &  dt_advance,
amrex::MultiFab &  cons_in,
amrex::MultiFab &  U_old,
amrex::MultiFab &  V_old,
const amrex::MultiFab &  mf_vars 
)
61 {
62 
63  for ( MFIter mfi(cons_in,TilingIfNotGPU()); mfi.isValid(); ++mfi) {
64 
65  Box tbx = mfi.nodaltilebox(0);
66  Box tby = mfi.nodaltilebox(1);
67 
68  auto simpleAD_array = mf_vars_simpleAD.array(mfi);
69  auto u_vel = U_old.array(mfi);
70  auto v_vel = V_old.array(mfi);
71 
72  ParallelFor(tbx, tby,
73  [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept
74  {
75  u_vel(i,j,k) = u_vel(i,j,k) + (simpleAD_array(i-1,j,k,0) + simpleAD_array(i,j,k,0))/two*dt_advance;
76  },
77  [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept
78  {
79  v_vel(i,j,k) = v_vel(i,j,k) + (simpleAD_array(i,j-1,k,1) + simpleAD_array(i,j,k,1))/two*dt_advance;
80  });
81  }
82 }
Here is the call graph for this function:

Member Data Documentation

◆ disk_cell_count

amrex::Vector<amrex::Real> SimpleAD::disk_cell_count
protected

◆ freestream_phi

amrex::Vector<amrex::Real> SimpleAD::freestream_phi
protected

◆ freestream_velocity

amrex::Vector<amrex::Real> SimpleAD::freestream_velocity
protected

◆ hub_height

amrex::Real SimpleAD::hub_height
protected

◆ nominal_power

amrex::Real SimpleAD::nominal_power
protected

◆ power

amrex::Vector<amrex::Real> SimpleAD::power
protected

◆ rotor_rad

amrex::Real SimpleAD::rotor_rad
protected

◆ thrust_coeff

amrex::Vector<amrex::Real> SimpleAD::thrust_coeff
protected

◆ thrust_coeff_standing

amrex::Real SimpleAD::thrust_coeff_standing
protected

◆ turb_disk_angle

amrex::Real SimpleAD::turb_disk_angle
protected

◆ wind_speed

amrex::Vector<amrex::Real> SimpleAD::wind_speed
protected

◆ xloc

amrex::Vector<amrex::Real> SimpleAD::xloc
protected

◆ yloc

amrex::Vector<amrex::Real> SimpleAD::yloc
protected

The documentation for this class was generated from the following files: