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

#include <ERF_LatLonMap.H>

Collaboration diagram for LatLonMap:

Public Member Functions

 LatLonMap (const amrex::MultiFab &lat, const amrex::MultiFab &lon, const amrex::BoxArray &ba2d, const amrex::DistributionMapping &dm, const amrex::Geometry &geom0)
 
LatLonStatus locate (amrex::Real req_lat, amrex::Real req_lon, LatLonLocation &loc) const
 
void rotation_at (amrex::Real x, amrex::Real y, amrex::Real &cos_alpha, amrex::Real &sin_alpha) const
 

Private Attributes

amrex::MultiFab m_ll
 
amrex::Box m_dom
 
amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > m_problo
 
amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > m_dx
 

Constructor & Destructor Documentation

◆ LatLonMap()

LatLonMap::LatLonMap ( const amrex::MultiFab &  lat,
const amrex::MultiFab &  lon,
const amrex::BoxArray &  ba2d,
const amrex::DistributionMapping &  dm,
const amrex::Geometry &  geom0 
)
153  : m_problo(geom0.ProbLoArray()),
154  m_dx(geom0.CellSizeArray())
155 {
156  m_dom = geom0.Domain();
157  m_dom.setRange(2,0);
158 
159  // Gather the level-0 mass-point latitude and longitude onto the IO rank.
160  // This is a setup-time, level-0, 2D array, so the gather is affordable and
161  // keeps the search and the inverse map as plain host code.
162  //
163  // The ceiling is one rank holding 2 Reals per level-0 column -- 100 MB or
164  // so for the largest domains ERF is run on -- and a search of that array
165  // per point, once.
166  MultiFab latlon(ba2d, dm, 2, 0);
167  pack_latlon(latlon, lat, lon);
168 
169  BoxArray ba_one(m_dom);
170  Vector<int> pmap(1, ParallelDescriptor::IOProcessorNumber());
171  DistributionMapping dm_one(pmap);
172  m_ll.define(ba_one, dm_one, 2, 0, MFInfo().SetArena(The_Pinned_Arena()));
173  m_ll.ParallelCopy(latlon, 0, 0, 2);
174 
175  // The copy is device-side in a GPU build; the searches are host code
176  Gpu::streamSynchronize();
177 }
void pack_latlon(MultiFab &latlon, const MultiFab &lat, const MultiFab &lon)
Definition: ERF_LatLonMap.cpp:46
amrex::Box m_dom
Definition: ERF_LatLonMap.H:159
amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > m_dx
Definition: ERF_LatLonMap.H:161
amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > m_problo
Definition: ERF_LatLonMap.H:160
amrex::MultiFab m_ll
Definition: ERF_LatLonMap.H:158
Here is the call graph for this function:

Member Function Documentation

◆ locate()

LatLonStatus LatLonMap::locate ( amrex::Real  req_lat,
amrex::Real  req_lon,
LatLonLocation &  loc 
) const
181 {
182  Real out[9] = {Real(0.0), Real(0.0), Real(0.0), Real(0.0), Real(0.0),
183  Real(0.0), Real(0.0), Real(0.0), Real(0.0)};
184 
185  if (ParallelDescriptor::IOProcessor()) {
186  LatLonLocation l;
187  const LatLonStatus status = locate_latlon_on_grid(m_ll.const_array(0), m_dom, m_problo, m_dx,
188  req_lat, req_lon, l);
189  out[0] = l.x; out[1] = l.y;
190  out[2] = l.lat; out[3] = l.lon;
191  out[4] = l.near_lat; out[5] = l.near_lon;
192  out[6] = l.cos_alpha; out[7] = l.sin_alpha;
193  out[8] = static_cast<Real>(static_cast<int>(status));
194  }
195 
196  ParallelDescriptor::Bcast(out, 9, ParallelDescriptor::IOProcessorNumber());
197 
198  loc.x = out[0]; loc.y = out[1];
199  loc.lat = out[2]; loc.lon = out[3];
200  loc.near_lat = out[4]; loc.near_lon = out[5];
201  loc.cos_alpha = out[6]; loc.sin_alpha = out[7];
202  return static_cast<LatLonStatus>(static_cast<int>(std::lround(out[8])));
203 }
LatLonStatus
Definition: ERF_LatLonMap.H:105
LatLonStatus locate_latlon_on_grid(const Array4< const Real > &ll, const Box &dom, const GpuArray< Real, AMREX_SPACEDIM > &problo, const GpuArray< Real, AMREX_SPACEDIM > &dx, Real req_lat, Real req_lon, LatLonLocation &loc)
Definition: ERF_LatLonMap.cpp:86
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_LatLonMap.H:86
amrex::Real cos_alpha
Definition: ERF_LatLonMap.H:101
amrex::Real lat
Definition: ERF_LatLonMap.H:93
amrex::Real x
Definition: ERF_LatLonMap.H:88
amrex::Real near_lat
Definition: ERF_LatLonMap.H:97
amrex::Real y
Definition: ERF_LatLonMap.H:89
amrex::Real sin_alpha
Definition: ERF_LatLonMap.H:102
amrex::Real near_lon
Definition: ERF_LatLonMap.H:98
amrex::Real lon
Definition: ERF_LatLonMap.H:94

Referenced by ObsNudging::resolve_positions(), and ERF::resolve_station_positions().

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

◆ rotation_at()

void LatLonMap::rotation_at ( amrex::Real  x,
amrex::Real  y,
amrex::Real &  cos_alpha,
amrex::Real &  sin_alpha 
) const
207 {
208  Real out[2] = {Real(1.0), Real(0.0)};
209 
210  if (ParallelDescriptor::IOProcessor()) {
211  const int i = std::clamp(static_cast<int>(std::floor((x - m_problo[0]) / m_dx[0])),
212  m_dom.smallEnd(0), m_dom.bigEnd(0));
213  const int j = std::clamp(static_cast<int>(std::floor((y - m_problo[1]) / m_dx[1])),
214  m_dom.smallEnd(1), m_dom.bigEnd(1));
215  grid_rotation_from_latlon(m_ll.const_array(0), m_dom, i, j, out[0], out[1]);
216  }
217 
218  ParallelDescriptor::Bcast(out, 2, ParallelDescriptor::IOProcessorNumber());
219  cos_alpha = out[0];
220  sin_alpha = out[1];
221 }
void grid_rotation_from_latlon(const Array4< const Real > &ll, const Box &dom, int i, int j, Real &cos_alpha, Real &sin_alpha)
Definition: ERF_LatLonMap.cpp:62
Real sin_alpha
Definition: ERF_Plotfile2DInterpolator.cpp:28
Real cos_alpha
Definition: ERF_Plotfile2DInterpolator.cpp:27

Referenced by ObsNudging::resolve_positions().

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

Member Data Documentation

◆ m_dom

amrex::Box LatLonMap::m_dom
private

Referenced by LatLonMap(), locate(), and rotation_at().

◆ m_dx

amrex::GpuArray<amrex::Real, AMREX_SPACEDIM> LatLonMap::m_dx
private

Referenced by locate(), and rotation_at().

◆ m_ll

amrex::MultiFab LatLonMap::m_ll
private

Referenced by LatLonMap(), locate(), and rotation_at().

◆ m_problo

amrex::GpuArray<amrex::Real, AMREX_SPACEDIM> LatLonMap::m_problo
private

Referenced by locate(), and rotation_at().


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