483 int imin_orig = amrex::lbound(amrex::Box(orig_data)).x;
484 int imax_orig = amrex::ubound(amrex::Box(orig_data)).x;
485 int jmin_orig = amrex::lbound(amrex::Box(orig_data)).y;
486 int jmax_orig = amrex::ubound(amrex::Box(orig_data)).y;
487 int kmax_orig = amrex::ubound(amrex::Box(orig_data)).z;
488 int kmax_new = kmax + 1;
490 AMREX_ASSERT(kmax_orig < 256);
491 AMREX_ASSERT(kmax_new < 256);
493 amrex::GpuArray<amrex::Real,256> new_z;
494 amrex::GpuArray<amrex::Real,256> new_p;
495 amrex::GpuArray<amrex::Real,256> new_data;
499 for (
int k=0; k < kmax_new; k++) {
501 new_z_p[k] =
fourth*(new_z_full(i,j,k)+new_z_full(i,j+1,k)+new_z_full(i,j,k+1)+new_z_full(i,j+1,k+1));
502 }
else if (stag ==
'Y') {
503 new_z_p[k] =
fourth*(new_z_full(i,j,k)+new_z_full(i+1,j,k)+new_z_full(i,j,k+1)+new_z_full(i+1,j,k+1));
504 }
else if (stag ==
'M') {
505 new_z_p[k] =
amrex::Real(0.125)*(new_z_full(i,j,k )+new_z_full(i,j+1,k )+new_z_full(i+1,j,k )+new_z_full(i+1,j+1,k )+
506 new_z_full(i,j,k+1)+new_z_full(i,j+1,k+1)+new_z_full(i+1,j,k+1)+new_z_full(i+1,j+1,k+1));
511 amrex::GpuArray<amrex::Real,256> orig_z;
513 for (
int k=0; k < kmax_orig; k++) {
515 orig_z_p[k] = orig_z_full(i,j,k);
516 }
else if (stag ==
'X') {
517 if (i <= imin_orig) {
518 orig_z_p[k] = orig_z_full(i,j,k);
519 }
else if (i >= imax_orig) {
520 orig_z_p[k] = orig_z_full(imax_orig-1,j,k);
522 orig_z_p[k] =
myhalf*(orig_z_full(i,j,k)+orig_z_full(i-1,j,k));
524 }
else if (stag ==
'Y') {
525 if (j <= jmin_orig) {
526 orig_z_p[k] = orig_z_full(i,j,k);
527 }
else if (j >= jmax_orig) {
528 orig_z_p[k] = orig_z_full(i,jmax_orig-1,k);
530 orig_z_p[k] =
myhalf*(orig_z_full(i,j,k)+orig_z_full(i,j-1,k));
536 bool flip_data_required =
false;
537 if (orig_z[1] > orig_z[kmax_orig-1]) flip_data_required =
true;
538 if (flip_data_required) amrex::Abort(
"metgrid initialization flip_data_required. Not yet implemented.");
544 for (
int k=1; k < kmax_orig; k++) {
545 if (orig_z_p[k] > orig_z_p[0]) {
552 amrex::GpuArray<amrex::Real,256> ordered_z;
553 amrex::GpuArray<amrex::Real,256> ordered_data;
556 if (k_above_sfc > 1) {
562 for (
int k=1; k < k_above_sfc; k++) {
563 ordered_z_p[count] = orig_z_p[k];
564 ordered_data_p[count] = orig_data(i,j,k,src_comp);
578 if (Pl-Pu < metgrid_proximity) {
583 ordered_z_p[count] = orig_z_p[0];
584 ordered_data_p[count] = orig_data(i,j,0,src_comp);
589 int knext = k_above_sfc;
595 if (metgrid_force_sfc_k > 0) {
596 for (
int k=k_above_sfc; k < kmax_orig; k++) {
597 if (orig_z_p[k] > new_z_p[metgrid_force_sfc_k-1]) {
608 if (Pl-Pu < metgrid_proximity) {
613 for (
int k=knext; k < kmax_orig; k++) {
614 ordered_z_p[count] = orig_z_p[k];
615 ordered_data_p[count] = orig_data(i,j,k,src_comp);
624 ordered_z_p[0] = orig_z[0];
625 ordered_data_p[0] = orig_data(i,j,0,src_comp);
631 if (metgrid_force_sfc_k > 0) {
632 for (
int k=knext; k < kmax_orig; k++) {
633 if (orig_z_p[k] > new_z_p[metgrid_force_sfc_k]) {
642 for (
int k=knext; k < kmax_orig; k++) {
646 if (Pl-Pu < metgrid_proximity) {
649 ordered_z_p[count] = orig_z_p[k];
650 ordered_data_p[count] = orig_data(i,j,k,src_comp);
656 int ksta(0), kend(0);
657 if (metgrid_use_below_sfc && metgrid_use_sfc) {
661 }
else if (metgrid_use_below_sfc && !metgrid_use_sfc) {
664 for (
int k=0; k < kmax_orig; k++) {
665 if (ordered_z_p[k] == orig_z_p[0]) {
670 for (
int k=ksfc; k < kmax_orig-1; k++) {
671 ordered_z_p[k] = ordered_z_p[k+1];
672 ordered_data_p[k] = ordered_data_p[k+1];
676 }
else if (!metgrid_use_below_sfc && metgrid_use_sfc) {
679 for (
int k=0; k < kend_order; k++) {
680 if (ordered_z_p[k] == orig_z_p[0]) {
689 amrex::Abort(
"metgrid initialization, !use_levels below_ground && !metgrid_use_sfc");
705 amrex::GpuArray<amrex::Real,256> ordered_p;
707 for (
int k=0; k < kend_order; k++) {
713 amrex::GpuArray<amrex::Real,256> final_z;
714 amrex::GpuArray<amrex::Real,256> final_p;
715 amrex::GpuArray<amrex::Real,256> final_data;
719 final_z_p[0] = ordered_z[ksta];
720 final_p_p[0] = ordered_p[ksta];
721 final_data_p[0] = ordered_data[ksta];
722 for (
int k=ksta+1; k <= kend; k++) {
723 if ((final_p_p[new_n]-ordered_p_p[k]) < metgrid_proximity) {
727 final_z_p[new_n] = ordered_z_p[k];
728 final_p_p[new_n] = ordered_p_p[k];
729 final_data_p[new_n] = ordered_data_p[k];
751 if (metgrid_retain_sfc) new_data[0] = ordered_data[0];
754 for (
int k=0; k < kmax_new; k++) {
755 new_data_full(i,j,k,dst_comp) = new_data[k];
constexpr amrex::Real fourth
Definition: ERF_Constants.H:12
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:11
AMREX_FORCE_INLINE AMREX_GPU_DEVICE void calc_p_isothermal(const amrex::Real &z, amrex::Real &p)
Definition: ERF_MetgridUtils.H:451
AMREX_FORCE_INLINE AMREX_GPU_DEVICE void lagrange_setup(char var_type, const bool &exp_interp, const int &orig_n, const int &new_n, const int &order, const int &i, const int &j, amrex::Real *orig_x_z, amrex::Real *orig_x_p, amrex::Real *orig_y, amrex::Real *new_x_z, amrex::Real *new_x_p, amrex::Real *new_y)
Definition: ERF_MetgridUtils.H:147