ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_HurricaneDiagnostics.H File Reference
#include <AMReX.H>
#include <AMReX_MultiFab.H>
#include <AMReX_ParallelReduce.H>
#include <limits>
#include "ERF_DataStruct.H"
Include dependency graph for ERF_HurricaneDiagnostics.H:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define M_PI   3.14159265358979323846
 

Functions

AMREX_FORCE_INLINE void ComputeGlobalMinLocation (const amrex::Geometry &geom, const amrex::Vector< amrex::MultiFab > &S_data, const amrex::Vector< amrex::MultiFab > *forecast_state_at_lev, amrex::Real *d_val_min_ptr, int *d_i_min_ptr, int *d_j_min_ptr, amrex::Real &global_val_min, int &global_i_min, int &global_j_min, amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_eye_track_xy, amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_eye_track_latlon)
 
AMREX_FORCE_INLINE void HurricaneTrackerCircle (const amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_eye_track_xy, amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_tracker_circle)
 
AMREX_FORCE_INLINE void HurricaneEyeTrackerInitial (const amrex::Geometry &geom, const amrex::Vector< amrex::MultiFab > &S_data, const amrex::Vector< amrex::MultiFab > *forecast_state_at_lev, amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_eye_track_xy, amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_eye_track_latlon, const amrex::Real &hurricane_eye_latitude, const amrex::Real &hurricane_eye_longitude)
 
AMREX_FORCE_INLINE void HurricaneEyeTrackerNotInitial (const amrex::Geometry &geom, const amrex::Vector< amrex::MultiFab > &S_data, MoistureType moisture_type, const amrex::Vector< amrex::MultiFab > *forecast_state_at_lev, amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_eye_track_xy, amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_eye_track_latlon)
 
AMREX_FORCE_INLINE void HurricaneEyeTracker (const amrex::Geometry &geom, const amrex::Vector< amrex::MultiFab > &S_data, MoistureType moisture_type, const amrex::Vector< amrex::MultiFab > *forecast_state_at_lev, const amrex::Real &hurricane_eye_latitude, const amrex::Real &hurricane_eye_longitude, amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_eye_track_xy, amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_eye_track_latlon, amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_tracker_circle)
 
AMREX_FORCE_INLINE void HurricaneMaxVelTracker (const amrex::Geometry &geom, const amrex::MultiFab &mf_cc_vel, const amrex::Real &time, const amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_eye_track_xy, amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_maxvel_vs_time)
 
AMREX_FORCE_INLINE void HurricaneMinPressureTracker (MoistureType moisture_type, const amrex::Geometry &geom, const amrex::MultiFab &mf_cons_var, const amrex::Real &time, const amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_eye_track_xy, amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_minpressure_vs_time)
 

Variables

struct {
   amrex::Real   value
 
   int   rank
 
in
 
struct {
   amrex::Real   value
 
   int   rank
 
out
 

Macro Definition Documentation

◆ M_PI

#define M_PI   3.14159265358979323846

Routines to compute hurricane diagnostics

Function Documentation

◆ ComputeGlobalMinLocation()

AMREX_FORCE_INLINE void ComputeGlobalMinLocation ( const amrex::Geometry &  geom,
const amrex::Vector< amrex::MultiFab > &  S_data,
const amrex::Vector< amrex::MultiFab > *  forecast_state_at_lev,
amrex::Real d_val_min_ptr,
int *  d_i_min_ptr,
int *  d_j_min_ptr,
amrex::Real global_val_min,
int &  global_i_min,
int &  global_j_min,
amrex::Vector< std::array< amrex::Real, 2 >> &  hurricane_eye_track_xy,
amrex::Vector< std::array< amrex::Real, 2 >> &  hurricane_eye_track_latlon 
)
36 {
37  amrex::Real h_val_min;
38  int h_i_min, h_j_min;
39 
40  amrex::Gpu::copy(amrex::Gpu::deviceToHost, d_val_min_ptr, d_val_min_ptr + 1, &h_val_min);
41  amrex::Gpu::copy(amrex::Gpu::deviceToHost, d_i_min_ptr, d_i_min_ptr + 1, &h_i_min);
42  amrex::Gpu::copy(amrex::Gpu::deviceToHost, d_j_min_ptr, d_j_min_ptr + 1, &h_j_min);
43  amrex::Gpu::synchronize();
44 
45  amrex::Real local_val_min = h_val_min;
46  int local_i_min = h_i_min;
47  int local_j_min = h_j_min;
48 
49  int rank = amrex::ParallelDescriptor::MyProc();
50 
51  in.value = local_val_min;
52  in.rank = rank;
53 
54  #ifdef AMREX_USE_MPI
55  MPI_Allreduce(&in, &out, 1, MPI_DOUBLE_INT, MPI_MINLOC, MPI_COMM_WORLD);
56  #else
57  out = in;
58  #endif
59 
60  global_val_min = out.value;
61  int owner_rank = out.rank;
62 
63  // Broadcast the indices from the rank that owns the minimum
64  global_i_min = local_i_min;
65  global_j_min = local_j_min;
66 
67  amrex::ParallelDescriptor::Bcast(&global_i_min, 1, owner_rank);
68  amrex::ParallelDescriptor::Bcast(&global_j_min, 1, owner_rank);
69 
70  if (rank == 0) {
71  amrex::Print() << "Global minimum distance to hurricane eye (k=0): "
72  << global_val_min << " at (i,j) = ("
73  << global_i_min << ", " << global_j_min << ")\n";
74  }
75 
76  amrex::Gpu::DeviceScalar<amrex::Real> d_eye_lat(0.0), d_eye_lon(0.0);
77 
78  amrex::Real* d_eye_lat_ptr = d_eye_lat.dataPtr();
79  amrex::Real* d_eye_lon_ptr = d_eye_lon.dataPtr();
80 
81  // On owner_rank, compute eye_lat and eye_lon
82  if (rank == owner_rank) {
83  for (amrex::MFIter mfi(S_data[IntVars::cons]); mfi.isValid(); ++mfi) {
84  const amrex::Box& box = mfi.validbox();
85  const auto latlon_arr = (*forecast_state_at_lev)[4].array(mfi);
86  amrex::ParallelFor(box, [=] AMREX_GPU_DEVICE(int i, int j, int k) {
87  if (i == global_i_min && j == global_j_min && k == 0) {
88  *d_eye_lat_ptr = latlon_arr(i,j,k,0);
89  *d_eye_lon_ptr = latlon_arr(i,j,k,1);
90  }
91  });
92  }
93  }
94 
95  amrex::Real eye_lat = d_eye_lat.dataValue();
96  amrex::Real eye_lon = d_eye_lon.dataValue();
97 
98  // Synchronize to ensure the owner has computed values
99  amrex::Gpu::synchronize();
100 
101  amrex::ParallelDescriptor::Bcast(&eye_lat, 1, owner_rank);
102  amrex::ParallelDescriptor::Bcast(&eye_lon, 1, owner_rank);
103 
104  const auto dx = geom.CellSizeArray();
105  const auto prob_lo = geom.ProbLoArray();
106 
107  amrex::Real eye_x = prob_lo[0] + (global_i_min+0.5)*dx[0];
108  amrex::Real eye_y = prob_lo[1] + (global_j_min+0.5)*dx[1];
109 
110  hurricane_eye_track_xy.push_back({eye_x, eye_y});
111  hurricane_eye_track_latlon.push_back({eye_lon, eye_lat});
112 }
struct @19 out
int rank
Definition: ERF_HurricaneDiagnostics.H:21
struct @19 in
amrex::Real Real
Definition: ERF_ShocInterface.H:19
@ cons
Definition: ERF_IndexDefines.H:158

Referenced by HurricaneEyeTrackerInitial(), and HurricaneEyeTrackerNotInitial().

Here is the caller graph for this function:

◆ HurricaneEyeTracker()

AMREX_FORCE_INLINE void HurricaneEyeTracker ( const amrex::Geometry &  geom,
const amrex::Vector< amrex::MultiFab > &  S_data,
MoistureType  moisture_type,
const amrex::Vector< amrex::MultiFab > *  forecast_state_at_lev,
const amrex::Real hurricane_eye_latitude,
const amrex::Real hurricane_eye_longitude,
amrex::Vector< std::array< amrex::Real, 2 >> &  hurricane_eye_track_xy,
amrex::Vector< std::array< amrex::Real, 2 >> &  hurricane_eye_track_latlon,
amrex::Vector< std::array< amrex::Real, 2 >> &  hurricane_tracker_circle 
)
273 {
274  static bool is_start = true;
275  if(is_start){
276  HurricaneEyeTrackerInitial(geom, S_data,
277  forecast_state_at_lev, hurricane_eye_track_xy,
278  hurricane_eye_track_latlon,
279  hurricane_eye_latitude, hurricane_eye_longitude);
280  is_start = false;
281  } else {
282  HurricaneEyeTrackerNotInitial(geom, S_data, moisture_type,
283  forecast_state_at_lev, hurricane_eye_track_xy,
284  hurricane_eye_track_latlon);
285  }
286  HurricaneTrackerCircle(hurricane_eye_track_xy, hurricane_tracker_circle);
287 }
AMREX_FORCE_INLINE void HurricaneEyeTrackerInitial(const amrex::Geometry &geom, const amrex::Vector< amrex::MultiFab > &S_data, const amrex::Vector< amrex::MultiFab > *forecast_state_at_lev, amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_eye_track_xy, amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_eye_track_latlon, const amrex::Real &hurricane_eye_latitude, const amrex::Real &hurricane_eye_longitude)
Definition: ERF_HurricaneDiagnostics.H:145
AMREX_FORCE_INLINE void HurricaneEyeTrackerNotInitial(const amrex::Geometry &geom, const amrex::Vector< amrex::MultiFab > &S_data, MoistureType moisture_type, const amrex::Vector< amrex::MultiFab > *forecast_state_at_lev, amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_eye_track_xy, amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_eye_track_latlon)
Definition: ERF_HurricaneDiagnostics.H:194
AMREX_FORCE_INLINE void HurricaneTrackerCircle(const amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_eye_track_xy, amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_tracker_circle)
Definition: ERF_HurricaneDiagnostics.H:117

Referenced by ERF::post_timestep().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ HurricaneEyeTrackerInitial()

AMREX_FORCE_INLINE void HurricaneEyeTrackerInitial ( const amrex::Geometry &  geom,
const amrex::Vector< amrex::MultiFab > &  S_data,
const amrex::Vector< amrex::MultiFab > *  forecast_state_at_lev,
amrex::Vector< std::array< amrex::Real, 2 >> &  hurricane_eye_track_xy,
amrex::Vector< std::array< amrex::Real, 2 >> &  hurricane_eye_track_latlon,
const amrex::Real hurricane_eye_latitude,
const amrex::Real hurricane_eye_longitude 
)
152 {
153  amrex::Gpu::DeviceScalar<amrex::Real> d_val_min(1e10);
154  amrex::Gpu::DeviceScalar<int> d_i_min(-1), d_j_min(-1);
155 
156  amrex::Real* d_val_min_ptr = d_val_min.dataPtr();
157  int* d_i_min_ptr = d_i_min.dataPtr();
158  int* d_j_min_ptr = d_j_min.dataPtr();
159 
160  for (amrex::MFIter mfi(S_data[IntVars::cons]); mfi.isValid(); ++mfi) {
161  const amrex::Box& box = mfi.validbox();
162  const auto latlon_arr = (*forecast_state_at_lev)[4].array(mfi);
163 
164  amrex::ParallelFor(box, [=] AMREX_GPU_DEVICE(int i, int j, int k) {
165  if (k==0) {
166 
167  amrex::Real dlat = latlon_arr(i,j,k,0) - hurricane_eye_latitude;
168  amrex::Real dlon = latlon_arr(i,j,k,1) - hurricane_eye_longitude;
169  amrex::Real dist = std::sqrt(dlat*dlat + dlon*dlon);
170  // Atomic min using device pointer from DeviceVector
171  amrex::Real old = amrex::Gpu::Atomic::Min(&d_val_min_ptr[0], dist);
172  //amrex::Gpu::Atomic::Min(&d_val_min_ptr[0], dist);
173  if (dist < old) {
174  // We are the new minimum; record indices
175  d_i_min_ptr[0] = i;
176  d_j_min_ptr[0] = j;
177  }
178  }
179  });
180  }
181 
182  amrex::Real global_val_min;
183  int global_i_min, global_j_min;
184 
185  ComputeGlobalMinLocation(geom, S_data, forecast_state_at_lev,
186  d_val_min_ptr, d_i_min_ptr, d_j_min_ptr,
187  global_val_min, global_i_min, global_j_min,
188  hurricane_eye_track_xy,
189  hurricane_eye_track_latlon);
190 }
AMREX_FORCE_INLINE void ComputeGlobalMinLocation(const amrex::Geometry &geom, const amrex::Vector< amrex::MultiFab > &S_data, const amrex::Vector< amrex::MultiFab > *forecast_state_at_lev, amrex::Real *d_val_min_ptr, int *d_i_min_ptr, int *d_j_min_ptr, amrex::Real &global_val_min, int &global_i_min, int &global_j_min, amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_eye_track_xy, amrex::Vector< std::array< amrex::Real, 2 >> &hurricane_eye_track_latlon)
Definition: ERF_HurricaneDiagnostics.H:25

Referenced by HurricaneEyeTracker().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ HurricaneEyeTrackerNotInitial()

AMREX_FORCE_INLINE void HurricaneEyeTrackerNotInitial ( const amrex::Geometry &  geom,
const amrex::Vector< amrex::MultiFab > &  S_data,
MoistureType  moisture_type,
const amrex::Vector< amrex::MultiFab > *  forecast_state_at_lev,
amrex::Vector< std::array< amrex::Real, 2 >> &  hurricane_eye_track_xy,
amrex::Vector< std::array< amrex::Real, 2 >> &  hurricane_eye_track_latlon 
)
200 {
201 
202  if (hurricane_eye_track_xy.empty()) {
203  amrex::Print() << "Error: hurricane_eye_track_xy is empty!\n";
204  amrex::Abort("Attempted to access hurricane_eye_track_xy[0]");
205  }
206 
207  amrex::Real tmp_x_eye = hurricane_eye_track_xy.back()[0];
208  amrex::Real tmp_y_eye = hurricane_eye_track_xy.back()[1];
209 
210  if(amrex::ParallelDescriptor::IOProcessor()){
211  std::cout << "The value of x y are " << tmp_x_eye << " " << tmp_y_eye << std::endl;
212  }
213 
214  amrex::Gpu::DeviceScalar<amrex::Real> d_val_min(1e10);
215  amrex::Gpu::DeviceScalar<int> d_i_min(-1), d_j_min(-1);
216 
217  amrex::Real* d_val_min_ptr = d_val_min.dataPtr();
218  int* d_i_min_ptr = d_i_min.dataPtr();
219  int* d_j_min_ptr = d_j_min.dataPtr();
220 
221  bool use_moisture = (moisture_type != MoistureType::None);
222  const int ncomp = S_data[IntVars::cons].nComp();
223 
224  const auto dx = geom.CellSizeArray();
225  const auto prob_lo = geom.ProbLoArray();
226 
227  for (amrex::MFIter mfi(S_data[IntVars::cons]); mfi.isValid(); ++mfi) {
228  const amrex::Box& box = mfi.validbox();
229  const amrex::Array4<amrex::Real const>& S_arr = S_data[IntVars::cons].const_array(mfi);
230 
231  amrex::ParallelFor(box,[=] AMREX_GPU_DEVICE(int i, int j, int k) {
232  if(k==0) {
233  amrex::Real x = prob_lo[0] + (i+0.5)*dx[0];
234  amrex::Real y = prob_lo[1] + (j+0.5)*dx[1];
235  amrex::Real dist = std::sqrt((x-tmp_x_eye)*(x-tmp_x_eye) + (y-tmp_y_eye)*(y-tmp_y_eye));
236  if(dist < 200e3) {
237  amrex::Real qv_for_p = (use_moisture && (ncomp > RhoQ1_comp)) ? S_arr(i,j,k,RhoQ1_comp)/S_arr(i,j,k,Rho_comp) : 0;
238  const amrex::Real rhotheta = S_arr(i,j,k,RhoTheta_comp);
239  amrex::Real pressure = getPgivenRTh(rhotheta,qv_for_p);
240  amrex::Real old = amrex::Gpu::Atomic::Min(&d_val_min_ptr[0], pressure);
241  //amrex::Gpu::Atomic::Min(&d_val_min_ptr[0], dist);
242  if (old > pressure) {
243  // We are the new minimum; record indices
244  d_i_min_ptr[0] = i;
245  d_j_min_ptr[0] = j;
246  }
247  }
248  }
249  });
250  }
251 
252  amrex::Real global_val_min;
253  int global_i_min, global_j_min;
254 
255  ComputeGlobalMinLocation(geom, S_data, forecast_state_at_lev,
256  d_val_min_ptr, d_i_min_ptr, d_j_min_ptr,
257  global_val_min, global_i_min, global_j_min,
258  hurricane_eye_track_xy,
259  hurricane_eye_track_latlon);
260 }
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getPgivenRTh(const amrex::Real rhotheta, const amrex::Real qv=0.)
Definition: ERF_EOS.H:81
#define Rho_comp
Definition: ERF_IndexDefines.H:36
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:37
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:42

Referenced by HurricaneEyeTracker().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ HurricaneMaxVelTracker()

AMREX_FORCE_INLINE void HurricaneMaxVelTracker ( const amrex::Geometry &  geom,
const amrex::MultiFab &  mf_cc_vel,
const amrex::Real time,
const amrex::Vector< std::array< amrex::Real, 2 >> &  hurricane_eye_track_xy,
amrex::Vector< std::array< amrex::Real, 2 >> &  hurricane_maxvel_vs_time 
)
296 {
297  const int ncomp = AMREX_SPACEDIM;
298 
299  amrex::Real* d_val_max_ptr;
300  amrex::Gpu::DeviceVector<amrex::Real> d_val_max(1, -1.0e30);
301  d_val_max_ptr = d_val_max.data();
302 
303  const auto [x_last, y_last] = hurricane_eye_track_xy.back();
304  const auto dx = geom.CellSizeArray();
305  const auto prob_lo = geom.ProbLoArray();
306 
307  amrex::Real x_eye = x_last;
308  amrex::Real y_eye = y_last;
309 
310  for (amrex::MFIter mfi(mf_cc_vel); mfi.isValid(); ++mfi) {
311  const amrex::Box& box = mfi.validbox();
312  const auto& vel_arr = mf_cc_vel.const_array(mfi);
313 
314  amrex::ParallelFor(box, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
315  amrex::Real x = prob_lo[0] + (i+0.5)*dx[0];
316  amrex::Real y = prob_lo[1] + (j+0.5)*dx[1];
317  amrex::Real dist = std::sqrt((x-x_eye)*(x-x_eye) +
318  (y-y_eye)*(y-y_eye));
319  if(k==1 && dist < 200e3) {
320  amrex::Real velmag = 0.0;
321  for (int comp = 0; comp < ncomp; ++comp) {
322  amrex::Real vel = vel_arr(i, j, k, comp);
323  velmag += vel * vel;
324  }
325  velmag = std::sqrt(velmag)*3.6; // km/hr
326  amrex::Gpu::Atomic::Max(&d_val_max_ptr[0], velmag);
327  }
328  });
329  }
330 
331  amrex::Gpu::synchronize();
332 
333  amrex::Real h_val_max_local = -1.0e30;
334  amrex::Gpu::copy(amrex::Gpu::deviceToHost, d_val_max.begin(), d_val_max.end(), &h_val_max_local);
335 
336  amrex::Real h_val_max_global = -1.0e30;
337  #ifdef AMREX_USE_MPI
338  MPI_Allreduce(&h_val_max_local, &h_val_max_global, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);
339  #else
340  h_val_max_global = h_val_max_local;
341  #endif
342 
343  amrex::Real time_in_hrs = time / 3600.0;
344  hurricane_maxvel_vs_time.push_back({time_in_hrs, h_val_max_global});
345 }

Referenced by ERF::post_timestep().

Here is the caller graph for this function:

◆ HurricaneMinPressureTracker()

AMREX_FORCE_INLINE void HurricaneMinPressureTracker ( MoistureType  moisture_type,
const amrex::Geometry &  geom,
const amrex::MultiFab &  mf_cons_var,
const amrex::Real time,
const amrex::Vector< std::array< amrex::Real, 2 >> &  hurricane_eye_track_xy,
amrex::Vector< std::array< amrex::Real, 2 >> &  hurricane_minpressure_vs_time 
)
355 {
356 
357  amrex::Real* d_val_min_ptr;
358  amrex::Gpu::DeviceVector<amrex::Real> d_val_min(1, 1.0e30);
359  d_val_min_ptr = d_val_min.data();
360 
361  const amrex::Real x_last = hurricane_eye_track_xy.back()[0];
362  const amrex::Real y_last = hurricane_eye_track_xy.back()[1];
363  const auto dx = geom.CellSizeArray();
364  const auto prob_lo = geom.ProbLoArray();
365 
366  const int ncomp = mf_cons_var.nComp();
367  bool use_moisture = (moisture_type != MoistureType::None);
368 
369  for (amrex::MFIter mfi(mf_cons_var); mfi.isValid(); ++mfi) {
370  const amrex::Box& box = mfi.validbox();
371  const auto& S_arr = mf_cons_var.const_array(mfi);
372 
373  amrex::ParallelFor(box, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
374  amrex::Real x = prob_lo[0] + (i+0.5)*dx[0];
375  amrex::Real y = prob_lo[1] + (j+0.5)*dx[1];
376  amrex::Real dist2 = (x-x_last)*(x-x_last) +
377  (y-y_last)*(y-y_last);
378  if(k==1 && dist2 < 200e3*200e3) {
379  const amrex::Real rhotheta = S_arr(i,j,k,RhoTheta_comp);
380  const amrex::Real qv_for_p = (use_moisture && (ncomp > RhoQ1_comp)) ? S_arr(i,j,k,RhoQ1_comp)/S_arr(i,j,k,Rho_comp) : 0;
381  const amrex::Real pressure = getPgivenRTh(rhotheta,qv_for_p);
382  amrex::Gpu::Atomic::Min(&d_val_min_ptr[0], pressure);
383  }
384  });
385  }
386 
387  amrex::Gpu::synchronize();
388 
389  amrex::Real h_val_min_local = 1.0e30;
390  amrex::Gpu::copy(amrex::Gpu::deviceToHost, d_val_min.begin(), d_val_min.end(), &h_val_min_local);
391 
392  amrex::Real h_val_min_global = 1.0e30;
393  #ifdef AMREX_USE_MPI
394  MPI_Allreduce(&h_val_min_local, &h_val_min_global, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD);
395  #else
396  h_val_min_global = h_val_min_local;
397  #endif
398 
399  amrex::Real time_in_hrs = time / 3600.0;
400  hurricane_minpressure_vs_time.push_back({time_in_hrs, h_val_min_global});
401 }

Referenced by ERF::post_timestep().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ HurricaneTrackerCircle()

AMREX_FORCE_INLINE void HurricaneTrackerCircle ( const amrex::Vector< std::array< amrex::Real, 2 >> &  hurricane_eye_track_xy,
amrex::Vector< std::array< amrex::Real, 2 >> &  hurricane_tracker_circle 
)
119 {
120  // Check that there is at least one eye position
121  if (hurricane_eye_track_xy.empty()) return;
122 
123  // Get the last known (x, y) position of the eye
124  const auto [x_last, y_last] = hurricane_eye_track_xy.back();
125 
126  // Define circle properties
127  const int n_points = 100; // number of points on the circle
128  const amrex::Real radius = 200e3; // radius in meters (example: 50 km)
129 
130  // Clear previous points and reserve space
131  hurricane_tracker_circle.clear();
132  hurricane_tracker_circle.reserve(n_points);
133 
134  // Fill the circle points
135  for (int i = 0; i < n_points; ++i) {
136  amrex::Real theta = 2.0 * M_PI * i / n_points;
137  amrex::Real x = x_last + radius * std::cos(theta);
138  amrex::Real y = y_last + radius * std::sin(theta);
139  hurricane_tracker_circle.push_back({x, y});
140  }
141 }
#define M_PI
Definition: ERF_HurricaneDiagnostics.H:16
@ theta
Definition: ERF_MM5.H:20

Referenced by HurricaneEyeTracker().

Here is the caller graph for this function:

Variable Documentation

◆ 

◆ 

◆ rank

int rank

◆ value