482 int imin_orig = amrex::lbound(amrex::Box(orig_data)).x;
483 int imax_orig = amrex::ubound(amrex::Box(orig_data)).x;
484 int jmin_orig = amrex::lbound(amrex::Box(orig_data)).y;
485 int jmax_orig = amrex::ubound(amrex::Box(orig_data)).y;
486 int kmax_orig = amrex::ubound(amrex::Box(orig_data)).z;
487 int kmax_new = kmax + 1;
489 AMREX_ASSERT(kmax_orig < 256);
490 AMREX_ASSERT(kmax_new < 256);
492 amrex::GpuArray<amrex::Real,256> new_z;
493 amrex::GpuArray<amrex::Real,256> new_p;
494 amrex::GpuArray<amrex::Real,256> new_data;
498 for (
int k=0; k < kmax_new; k++) {
500 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));
501 }
else if (stag ==
'Y') {
502 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));
503 }
else if (stag ==
'M') {
504 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 )+
505 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));
510 amrex::GpuArray<amrex::Real,256> orig_z;
512 for (
int k=0; k < kmax_orig; k++) {
514 orig_z_p[k] = orig_z_full(i,j,k);
515 }
else if (stag ==
'X') {
516 if (i <= imin_orig) {
517 orig_z_p[k] = orig_z_full(i,j,k);
518 }
else if (i >= imax_orig) {
519 orig_z_p[k] = orig_z_full(imax_orig-1,j,k);
521 orig_z_p[k] =
myhalf*(orig_z_full(i,j,k)+orig_z_full(i-1,j,k));
523 }
else if (stag ==
'Y') {
524 if (j <= jmin_orig) {
525 orig_z_p[k] = orig_z_full(i,j,k);
526 }
else if (j >= jmax_orig) {
527 orig_z_p[k] = orig_z_full(i,jmax_orig-1,k);
529 orig_z_p[k] =
myhalf*(orig_z_full(i,j,k)+orig_z_full(i,j-1,k));
535 bool flip_data_required =
false;
536 if (orig_z[1] > orig_z[kmax_orig-1]) flip_data_required =
true;
537 if (flip_data_required) amrex::Abort(
"metgrid initialization flip_data_required. Not yet implemented.");
543 for (
int k=1; k < kmax_orig; k++) {
544 if (orig_z_p[k] > orig_z_p[0]) {
551 amrex::GpuArray<amrex::Real,256> ordered_z;
552 amrex::GpuArray<amrex::Real,256> ordered_data;
555 if (k_above_sfc > 1) {
561 for (
int k=1; k < k_above_sfc; k++) {
562 ordered_z_p[count] = orig_z_p[k];
563 ordered_data_p[count] = orig_data(i,j,k,src_comp);
577 if (Pl-Pu < metgrid_proximity) {
582 ordered_z_p[count] = orig_z_p[0];
583 ordered_data_p[count] = orig_data(i,j,0,src_comp);
588 int knext = k_above_sfc;
594 if (metgrid_force_sfc_k > 0) {
595 for (
int k=k_above_sfc; k < kmax_orig; k++) {
596 if (orig_z_p[k] > new_z_p[metgrid_force_sfc_k-1]) {
607 if (Pl-Pu < metgrid_proximity) {
612 for (
int k=knext; k < kmax_orig; k++) {
613 ordered_z_p[count] = orig_z_p[k];
614 ordered_data_p[count] = orig_data(i,j,k,src_comp);
623 ordered_z_p[0] = orig_z[0];
624 ordered_data_p[0] = orig_data(i,j,0,src_comp);
630 if (metgrid_force_sfc_k > 0) {
631 for (
int k=knext; k < kmax_orig; k++) {
632 if (orig_z_p[k] > new_z_p[metgrid_force_sfc_k]) {
641 for (
int k=knext; k < kmax_orig; k++) {
645 if (Pl-Pu < metgrid_proximity) {
648 ordered_z_p[count] = orig_z_p[k];
649 ordered_data_p[count] = orig_data(i,j,k,src_comp);
655 int ksta(0), kend(0);
656 if (metgrid_use_below_sfc && metgrid_use_sfc) {
660 }
else if (metgrid_use_below_sfc && !metgrid_use_sfc) {
663 for (
int k=0; k < kmax_orig; k++) {
664 if (ordered_z_p[k] == orig_z_p[0]) {
669 for (
int k=ksfc; k < kmax_orig-1; k++) {
670 ordered_z_p[k] = ordered_z_p[k+1];
671 ordered_data_p[k] = ordered_data_p[k+1];
675 }
else if (!metgrid_use_below_sfc && metgrid_use_sfc) {
678 for (
int k=0; k < kend_order; k++) {
679 if (ordered_z_p[k] == orig_z_p[0]) {
688 amrex::Abort(
"metgrid initialization, !use_levels below_ground && !metgrid_use_sfc");
704 amrex::GpuArray<amrex::Real,256> ordered_p;
706 for (
int k=0; k < kend_order; k++) {
712 amrex::GpuArray<amrex::Real,256> final_z;
713 amrex::GpuArray<amrex::Real,256> final_p;
714 amrex::GpuArray<amrex::Real,256> final_data;
718 final_z_p[0] = ordered_z[ksta];
719 final_p_p[0] = ordered_p[ksta];
720 final_data_p[0] = ordered_data[ksta];
721 for (
int k=ksta+1; k <= kend; k++) {
722 if ((final_p_p[new_n]-ordered_p_p[k]) < metgrid_proximity) {
726 final_z_p[new_n] = ordered_z_p[k];
727 final_p_p[new_n] = ordered_p_p[k];
728 final_data_p[new_n] = ordered_data_p[k];
750 if (metgrid_retain_sfc) new_data[0] = ordered_data[0];
753 for (
int k=0; k < kmax_new; k++) {
754 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:450
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:146