ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_FFTUtils.H
Go to the documentation of this file.
1 #ifndef ERF_FFT_UTILS_H_
2 #define ERF_FFT_UTILS_H_
3 
4 #ifdef ERF_USE_FFT
5 
6 using namespace amrex;
7 
8 inline Array<std::pair<FFT::Boundary,FFT::Boundary>,AMREX_SPACEDIM>
9 get_fft_bc (Geometry const& lev_geom,
10  Array<std::string,2*AMREX_SPACEDIM> l_domain_bc_type,
11  Box const& bounding_box, bool use_real_bcs) noexcept
12 {
13  Array<std::pair<FFT::Boundary,FFT::Boundary>,AMREX_SPACEDIM> r;
14 
15  FFT::Boundary first, second;
16 
17  for (int dir = 0; dir <= 2; dir++)
18  {
19  auto bc_type_lo = l_domain_bc_type[Orientation(dir,Orientation::low)];
20  if ( lev_geom.isPeriodic(dir) &&
21  (lev_geom.Domain().smallEnd(dir) == bounding_box.smallEnd(dir)) )
22  {
23  first = FFT::Boundary::periodic;
24  // amrex::Print() << "SETTING FIRST OF " << dir << " TO PERIODIC " << std::endl;
25  }
26 
27  else if ( (lev_geom.Domain().smallEnd(dir) == bounding_box.smallEnd(dir)) &&
28  (bc_type_lo == "Outflow" || bc_type_lo == "Open") && (dir == 2 || !use_real_bcs) )
29  {
30  first = FFT::Boundary::odd;
31  // amrex::Print() << "SETTING FIRST OF " << dir << " TO ODD " << std::endl;
32  }
33 
34  else
35  {
36  first = FFT::Boundary::even;
37  // amrex::Print() << "SETTING FIRST OF " << dir << " TO EVEN " << std::endl;
38  }
39 
40  auto bc_type_hi = l_domain_bc_type[Orientation(dir,Orientation::high)];
41  if ( lev_geom.isPeriodic(dir) &&
42  (lev_geom.Domain().bigEnd(dir) == bounding_box.bigEnd(dir)) )
43  {
44  second = FFT::Boundary::periodic;
45  // amrex::Print() << "SETTING SECOND OF " << dir << " TO PERIODIC " << std::endl;
46  }
47 
48  else if ( (lev_geom.Domain().bigEnd(dir) == bounding_box.bigEnd(dir)) &&
49  (bc_type_hi == "Outflow" || bc_type_hi == "Open") && (dir == 2 || !use_real_bcs) )
50  {
51  second = FFT::Boundary::odd;
52  // amrex::Print() << "SETTING SECOND OF " << dir << " TO ODD " << std::endl;
53  }
54 
55  else
56  {
57  second = FFT::Boundary::even;
58  // amrex::Print() << "SETTING SECOND OF " << dir << " TO EVEN " << std::endl;
59  }
60 
61  r[dir] = std::make_pair(first,second);
62 
63  } // dir
64 
65  return r;
66 }
67 #endif
68 #endif
Definition: ERF_ConsoleIO.cpp:12