860 amrex::Vector<amrex::Real> m_xterrain,m_yterrain,m_zterrain;
862 int nx = 0;
int ny = 0;
864 if (amrex::ParallelDescriptor::IOProcessor()) {
866 amrex::Print()<<
"Reading terrain file: "<< fname<< std::endl;
867 std::ifstream file(fname);
869 if (!file.is_open()) {
870 amrex::Abort(
"Error: Could not open the file " + fname+
"\n");
874 if (file.peek() == std::ifstream::traits_type::eof()) {
875 amrex::Abort(
"Error: The file " + fname+
" is empty.\n");
883 file >> lon_min >> lat_min;
885 amrex::Error(
"The value of longitude for entry in the first line in " + fname
886 +
" should not exceed amrex::Real(180.) It is " + std::to_string(lon_min));
889 amrex::Error(
"The value of latitude for entry in the first line in " + fname
890 +
" should not exceed amrex::Real(90.) It is " + std::to_string(lat_min));
896 while (file >> value1 >> value2 >> value3) {
897 m_xterrain.push_back(value1);
899 m_yterrain.push_back(value2);
901 m_zterrain.push_back(value3);
904 AMREX_ASSERT(m_xterrain.size() ==
static_cast<long int>(
nx*
ny));
905 AMREX_ASSERT(m_yterrain.size() ==
static_cast<long int>(
ny));
906 AMREX_ASSERT(m_zterrain.size() ==
static_cast<long int>(
nx*
ny));
910 nx = erf_get_single_value<int>(file,cnt); cnt++;
911 ny = erf_get_single_value<int>(file,cnt); cnt++;
912 amrex::Print()<<
"Expecting " <<
nx <<
" values of x, " <<
913 ny <<
" values of y, and " <<
914 nx*
ny <<
" values of z" << std::endl;
917 m_xterrain.resize(
nx);
918 m_yterrain.resize(
ny);
919 m_zterrain.resize(
nx *
ny);
920 for (
int n = 0; n <
nx; n++) {
921 m_xterrain[n] = erf_get_single_value<amrex::Real>(file,cnt);
924 for (
int n = 0; n <
ny; n++) {
925 m_yterrain[n] = erf_get_single_value<amrex::Real>(file,cnt);
928 for (
int n = 0; n <
nx *
ny; n++) {
929 m_zterrain[n] = erf_get_single_value<amrex::Real>(file,cnt);
938 amrex::ParallelDescriptor::Bcast(&
nx,1,amrex::ParallelDescriptor::IOProcessorNumber());
939 amrex::ParallelDescriptor::Bcast(&
ny,1,amrex::ParallelDescriptor::IOProcessorNumber());
945 "USGS terrain file must have at least two points in each direction");
949 int nx_vals = is_usgs ? (
nx *
ny) :
nx;
951 m_xterrain.resize(nx_vals);
952 m_yterrain.resize(
ny);
953 m_zterrain.resize(nz);
955 amrex::ParallelDescriptor::Bcast(m_xterrain.data(),nx_vals,amrex::ParallelDescriptor::IOProcessorNumber());
956 amrex::ParallelDescriptor::Bcast(m_yterrain.data(),
ny,amrex::ParallelDescriptor::IOProcessorNumber());
957 amrex::ParallelDescriptor::Bcast(m_zterrain.data(),nz,amrex::ParallelDescriptor::IOProcessorNumber());
960 amrex::Gpu::DeviceVector<amrex::Real> d_xterrain(nx_vals),d_yterrain(
ny),d_zterrain(nz);
961 amrex::Gpu::copy(amrex::Gpu::hostToDevice, m_xterrain.begin(), m_xterrain.end(), d_xterrain.begin());
962 amrex::Gpu::copy(amrex::Gpu::hostToDevice, m_yterrain.begin(), m_yterrain.end(), d_yterrain.begin());
963 amrex::Gpu::copy(amrex::Gpu::hostToDevice, m_zterrain.begin(), m_zterrain.end(), d_zterrain.begin());
969 auto dx = geom.CellSizeArray();
970 auto ProbLoArr = geom.ProbLoArray();
972 int ilo = geom.Domain().smallEnd(0);
973 int jlo = geom.Domain().smallEnd(1);
974 int klo = geom.Domain().smallEnd(2);
975 int ihi = geom.Domain().bigEnd(0) + 1;
976 int jhi = geom.Domain().bigEnd(1) + 1;
978 amrex::Box zbx = terrain_fab.box();
979 amrex::Array4<amrex::Real>
const& z_arr = terrain_fab.array();
984 int ii = amrex::min(amrex::max(i,ilo),ihi);
985 int jj = amrex::min(amrex::max(j,jlo),jhi);
991 int ind11, ind12, ind21, ind22;
994 int iindex_terrain=-1;
995 int jindex_terrain=-1;
1005 bool jfound =
false;
1006 for (
int it = 0; it <
ny && !jfound; it++) {
1008 jindex_terrain = it-1; jfound =
true;
1012 jindex_terrain =
ny-1;
1015 jindex_terrain = amrex::min(amrex::max(jindex_terrain,0),
ny-2);
1017 int gstart = (jindex_terrain )*
nx;
1018 int gend = (jindex_terrain+1)*
nx-1;
1019 bool ifound =
false;
1020 for (
int it = gstart; it <= gend && !ifound; it++) {
1022 iindex_terrain = it-gstart-1; ifound =
true;
1026 iindex_terrain =
nx-1;
1029 iindex_terrain = amrex::min(amrex::max(iindex_terrain,0),
nx-2);
1032 ind11 = jindex_terrain*
nx + iindex_terrain;
1039 y1 = d_yt[jindex_terrain];
1040 y2 = d_yt[jindex_terrain+1];
1046 z_arr(i,j,
klo) = d_zt[ind11];
1054 z_arr(i,j,
klo) = w_11*d_zt[ind11] + w_12*d_zt[ind12] + w_21*d_zt[ind21] + w_22*d_zt[ind22];
1059 bool jfound =
false;
1060 for (
int it = 0; it <
ny && !jfound; it++) {
1062 jindex_terrain = it-1; jfound =
true;
1067 jindex_terrain =
ny-1;
1069 jindex_terrain = amrex::max(jindex_terrain,0);
1071 bool ifound =
false;
1072 for (
int it = 0; it <
nx && !ifound; it++) {
1074 iindex_terrain = it-1; ifound =
true;
1079 iindex_terrain =
nx-1;
1081 iindex_terrain = amrex::max(iindex_terrain,0);
1085 int ip1 = amrex::min(iindex_terrain+1,
nx-1);
1086 int jp1 = amrex::min(jindex_terrain+1,
ny-1);
1089 x1 = d_xt[iindex_terrain];
1091 y1 = d_yt[jindex_terrain];
1098 ind11 = iindex_terrain *
ny + jindex_terrain;
1099 ind21 = ip1 *
ny + jindex_terrain;
1101 ind12 = iindex_terrain *
ny + jp1;
1102 ind22 = ip1 *
ny + jp1;
1108 ind11 = jindex_terrain *
nx + iindex_terrain;
1109 ind12 = jp1 *
nx + iindex_terrain;
1111 ind21 = jindex_terrain *
nx + ip1;
1112 ind22 = jp1 *
nx + ip1;
1116 bool interp_x = (ip1 != iindex_terrain) && (x2 != x1);
1117 bool interp_y = (jp1 != jindex_terrain) && (y2 != y1);
1119 if (!interp_x && !interp_y)
1121 z_arr(i,j,
klo) = d_zt[ind11];
1123 else if (interp_x && !interp_y)
1128 z_arr(i,j,
klo) = (w_11*d_zt[ind11] + w_21*d_zt[ind21])/denom;
1130 else if (!interp_x && interp_y)
1135 z_arr(i,j,
klo) = (w_11*d_zt[ind11] + w_12*d_zt[ind12])/denom;
1144 z_arr(i,j,
klo) = (w_11*d_zt[ind11] + w_12*d_zt[ind12] + w_21*d_zt[ind21] + w_22*d_zt[ind22]) / denom;
const int nx
Definition: ERF_InitCustomPertVels_CloudChamber.H:14
const int ny
Definition: ERF_InitCustomPertVels_CloudChamber.H:15
const int klo
Definition: ERF_InitCustomPert_ABL.H:75
const Real dx
Definition: ERF_InitCustomPert_ABL.H:44
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_cloud_chamber_config.active, "Cloud Chamber: initializer reached without a parsed configuration")
ParallelFor(fab_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
amrex::Real Real
Definition: ERF_ShocInterface.H:19