42 const int n_spec_table =
static_cast<int>(
wind_speed.size());
44 Gpu::DeviceVector<Real> d_wind_speed(
wind_speed.size());
45 Gpu::DeviceVector<Real> d_power(
wind_speed.size());
47 Gpu::copy(Gpu::hostToDevice,
power.begin(),
power.end(), d_power.begin());
49 Gpu::DeviceScalar<Real> d_total_power(
zero);
50 Real* d_total_power_ptr = d_total_power.dataPtr();
52 const Real* d_wind_speed_ptr = d_wind_speed.dataPtr();
53 const Real* d_power_ptr = d_power.dataPtr();
55 for ( MFIter mfi(cons_in,TilingIfNotGPU()); mfi.isValid(); ++mfi) {
57 auto SMark_array = mf_SMark.array(mfi);
58 auto Nturb_array = mf_Nturb.array(mfi);
59 auto u_vel = U_old.array(mfi);
60 auto v_vel = V_old.array(mfi);
61 auto w_vel = W_old.array(mfi);
67 Box tbx = mfi.tilebox();
69 ParallelFor(tbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
71 if(SMark_array(i,j,k,0) ==
one) {
72 Real avg_vel = std::pow(u_vel(i,j,k)*u_vel(i,j,k) +
73 v_vel(i,j,k)*v_vel(i,j,k) +
74 w_vel(i,j,k)*w_vel(i,j,k),
myhalf);
75 Real turb_power =
interpolate_1d(d_wind_speed_ptr, d_power_ptr, avg_vel, n_spec_table);
76 turb_power = turb_power*Nturb_array(i,j,k,0);
77 Gpu::Atomic::Add(d_total_power_ptr,turb_power);
83 Gpu::copy(Gpu::deviceToHost, d_total_power.dataPtr(), d_total_power.dataPtr()+1, &h_total_power);
85 amrex::ParallelAllReduce::Sum(&h_total_power, 1, amrex::ParallelContext::CommunicatorAll());
87 if (ParallelDescriptor::IOProcessor()){
88 static std::ofstream file(
"power_output_EWP.txt", std::ios::app);
90 if (!file.is_open()) {
91 std::cerr <<
"Error opening file!" << std::endl;
92 Abort(
"Could not open file to write power output in ERF_AdvanceSimpleAD.cpp");
94 file << time <<
" " << h_total_power <<
"\n";
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
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);})
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:29
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:34
amrex::Real Real
Definition: ERF_ShocInterface.H:19
amrex::Real thrust_coeff_standing
Definition: ERF_EWP.H:52
amrex::Real hub_height
Definition: ERF_EWP.H:52
amrex::Vector< amrex::Real > wind_speed
Definition: ERF_EWP.H:53
amrex::Vector< amrex::Real > xloc
Definition: ERF_EWP.H:51
amrex::Vector< amrex::Real > thrust_coeff
Definition: ERF_EWP.H:53
amrex::Vector< amrex::Real > power
Definition: ERF_EWP.H:53
amrex::Real rotor_rad
Definition: ERF_EWP.H:52
amrex::Vector< amrex::Real > yloc
Definition: ERF_EWP.H:51
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
void get_turb_loc(amrex::Vector< amrex::Real > &xloc, amrex::Vector< amrex::Real > &yloc)
Definition: ERF_NullWindFarm.H:96