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(
zero);
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) ==
one) {
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),
myhalf);
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);
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";
constexpr amrex::Real zero
Definition: ERF_Constants.H:6
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:11
ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept { const Real *dx=geomdata.CellSize();const Real x=(i+0.5) *dx[0];const Real y=(j+0.5) *dx[1];const Real Omg=erf_vortex_Gaussian(x, y, xc, yc, R, beta, sigma);const Real deltaT=-(gamma - 1.0)/(2.0 *sigma *sigma) *Omg *Omg;const Real rho_norm=std::pow(1.0+deltaT, inv_gm1);const Real T=(1.0+deltaT) *T_inf;const Real p=std::pow(rho_norm, Gamma)/Gamma *rho_0 *a_inf *a_inf;const Real rho_theta=rho_0 *rho_norm *(T *std::pow(p_0/p, rdOcp));state_pert(i, j, k, RhoTheta_comp)=rho_theta - getRhoThetagivenP(p_hse(i, j, k));const Real r2d_xy=std::sqrt((x-xc) *(x-xc)+(y-yc) *(y-yc));state_pert(i, j, k, RhoScalar_comp)=0.25 *(1.0+std::cos(PI *std::min(r2d_xy, R)/R));})
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: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