43 Gpu::DeviceVector<Real> d_wind_speed(
wind_speed.size());
44 Gpu::DeviceVector<Real> d_power(
wind_speed.size());
46 Gpu::copy(Gpu::hostToDevice,
power.begin(),
power.end(), d_power.begin());
48 Gpu::DeviceScalar<Real> d_total_power(0.0);
49 Real* d_total_power_ptr = d_total_power.dataPtr();
51 const Real* d_wind_speed_ptr = d_wind_speed.dataPtr();
52 const Real* d_power_ptr = d_power.dataPtr();
54 for ( MFIter mfi(cons_in,TilingIfNotGPU()); mfi.isValid(); ++mfi) {
56 auto SMark_array = mf_SMark.array(mfi);
57 auto Nturb_array = mf_Nturb.array(mfi);
58 auto u_vel = U_old.array(mfi);
59 auto v_vel = V_old.array(mfi);
60 auto w_vel = W_old.array(mfi);
61 Box tbx = mfi.nodaltilebox(0);
63 ParallelFor(tbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
65 if(SMark_array(i,j,k,0) == 1.0) {
66 Real avg_vel = std::pow(u_vel(i,j,k)*u_vel(i,j,k) +
67 v_vel(i,j,k)*v_vel(i,j,k) +
68 w_vel(i,j,k)*w_vel(i,j,k),0.5);
69 Real turb_power =
interpolate_1d(d_wind_speed_ptr, d_power_ptr, avg_vel, n_spec_table);
70 turb_power = turb_power*Nturb_array(i,j,k,0);
71 Gpu::Atomic::Add(d_total_power_ptr,turb_power);
76 Real h_total_power = 0.0;
77 Gpu::copy(Gpu::deviceToHost, d_total_power.dataPtr(), d_total_power.dataPtr()+1, &h_total_power);
79 amrex::ParallelAllReduce::Sum(&h_total_power, 1, amrex::ParallelContext::CommunicatorAll());
81 if (ParallelDescriptor::IOProcessor()){
82 static std::ofstream file(
"power_output_EWP.txt", std::ios::app);
84 if (!file.is_open()) {
85 std::cerr <<
"Error opening file!" << std::endl;
86 Abort(
"Could not open file to write power output in ERF_AdvanceSimpleAD.cpp");
88 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:12
amrex::Real Real
Definition: ERF_ShocInterface.H:16
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