1 #ifndef ERF_TERRAIN_METRIC_H_
2 #define ERF_TERRAIN_METRIC_H_
5 #include <AMReX_Geometry.H>
6 #include <AMReX_MultiFab.H>
14 amrex::MultiFab& z_phys_nd, amrex::MultiFab& z_phys_cc);
21 void init_zlevels (amrex::Vector<amrex::Vector<amrex::Real>> & zlevels_stag,
22 amrex::Vector<amrex::Vector<amrex::Real>> & stretched_dz_h,
23 amrex::Vector<amrex::Gpu::DeviceVector<amrex::Real>> & stretched_dz_d,
24 amrex::Vector<amrex::Geometry>
const& geom,
25 amrex::Vector<amrex::IntVect>
const& ref_ratio,
26 const amrex::Real grid_stretching_ratio,
27 const amrex::Real zsurf,
28 const amrex::Real dz0);
31 amrex::MultiFab& z_phys_nd,
32 amrex::Vector<amrex::Real>
const& z_levels_h,
33 amrex::GpuArray<ERF_BC, AMREX_SPACEDIM*2>& phys_bc_type);
36 amrex::MultiFab& z_phys_nd,
37 amrex::Vector<amrex::Real>
const& z_levels_h);
48 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
49 const amrex::Array4<const amrex::Real>& z_nd)
51 amrex::Real dzInv = cellSizeInv[2];
52 amrex::Real met_h_zeta = 0.25 * dzInv *
53 ( z_nd(i+1,j,k+1) + z_nd(i+1,j+1,k+1) + z_nd(i,j,k+1) + z_nd(i,j+1,k+1)
54 -z_nd(i+1,j,k ) - z_nd(i+1,j+1,k ) - z_nd(i,j,k ) - z_nd(i,j+1,k ) );
63 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
64 const amrex::Array4<const amrex::Real>& z_nd)
66 amrex::Real dxInv = cellSizeInv[0];
67 amrex::Real met_h_xi = 0.25 * dxInv *
68 ( z_nd(i+1,j,k) + z_nd(i+1,j+1,k) + z_nd(i+1,j,k+1) + z_nd(i+1,j+1,k+1)
69 -z_nd(i ,j,k) - z_nd(i ,j+1,k) - z_nd(i ,j,k+1) - z_nd(i ,j+1,k+1) );
78 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
79 const amrex::Array4<const amrex::Real>& z_nd)
81 amrex::Real dyInv = cellSizeInv[1];
82 amrex::Real met_h_eta = 0.25 * dyInv *
83 ( z_nd(i,j+1,k) + z_nd(i+1,j+1,k) + z_nd(i,j+1,k+1) + z_nd(i+1,j+1,k+1)
84 -z_nd(i,j ,k) - z_nd(i+1,j ,k) - z_nd(i,j ,k+1) - z_nd(i+1,j ,k+1) );
97 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
98 const amrex::Array4<const amrex::Real>& z_nd)
100 amrex::Real dzInv = cellSizeInv[2];
101 amrex::Real met_h_zeta = 0.5 * dzInv * ( z_nd(i,j,k+1) + z_nd(i,j+1,k+1)
102 - z_nd(i,j,k ) - z_nd(i,j+1,k ) );
111 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
112 const amrex::Array4<const amrex::Real>& z_nd)
114 amrex::Real dxInv = cellSizeInv[0];
115 amrex::Real met_h_xi = 0.125 * dxInv *
116 ( z_nd(i+1,j,k) + z_nd(i+1,j,k+1) + z_nd(i+1,j+1,k) + z_nd(i+1,j+1,k+1)
117 -z_nd(i-1,j,k) - z_nd(i-1,j,k+1) - z_nd(i-1,j+1,k) - z_nd(i-1,j+1,k+1) );
126 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
127 const amrex::Array4<const amrex::Real>& z_nd)
129 amrex::Real dyInv = cellSizeInv[1];
130 amrex::Real met_h_eta = 0.5 * dyInv * ( z_nd(i,j+1,k ) + z_nd(i,j+1,k+1)
131 - z_nd(i,j ,k ) - z_nd(i,j ,k+1) );
140 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
141 const amrex::Array4<const amrex::Real>& z_nd)
143 amrex::Real dzInv = cellSizeInv[2];
144 amrex::Real met_h_zeta = 0.5 * dzInv * ( z_nd(i,j,k+1) + z_nd(i+1,j,k+1)
145 - z_nd(i,j,k ) - z_nd(i+1,j,k ) );
154 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
155 const amrex::Array4<const amrex::Real>& z_nd)
157 amrex::Real dxInv = cellSizeInv[0];
158 amrex::Real met_h_xi = 0.5 * dxInv * ( z_nd(i+1,j,k) + z_nd(i+1,j,k+1)
159 -z_nd(i ,j,k) - z_nd(i ,j,k+1) );
168 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
169 const amrex::Array4<const amrex::Real>& z_nd)
171 amrex::Real dyInv = cellSizeInv[1];
172 amrex::Real met_h_eta = 0.125 * dyInv *
173 ( z_nd(i,j+1,k) + z_nd(i,j+1,k+1) + z_nd(i+1,j+1,k) + z_nd(i+1,j+1,k+1)
174 -z_nd(i,j-1,k) - z_nd(i,j-1,k+1) - z_nd(i+1,j-1,k) - z_nd(i+1,j-1,k+1) );
183 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
184 const amrex::Array4<const amrex::Real>& z_nd)
186 amrex::Real dzInv = cellSizeInv[2];
187 amrex::Real met_h_zeta = 0.125 * dzInv *
188 ( z_nd(i,j,k+1) + z_nd(i+1,j,k+1) + z_nd(i,j+1,k+1) + z_nd(i+1,j+1,k+1)
189 -z_nd(i,j,k-1) - z_nd(i+1,j,k-1) - z_nd(i,j+1,k-1) - z_nd(i+1,j+1,k-1) );
198 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
199 const amrex::Array4<const amrex::Real>& z_nd)
201 amrex::Real dxInv = cellSizeInv[0];
202 amrex::Real met_h_xi = 0.5 * dxInv * ( z_nd(i+1,j,k) + z_nd(i+1,j+1,k)
203 -z_nd(i ,j,k) - z_nd(i ,j+1,k) );
212 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
213 const amrex::Array4<const amrex::Real>& z_nd)
215 amrex::Real dyInv = cellSizeInv[1];
216 amrex::Real met_h_eta = 0.5 * dyInv * ( z_nd(i,j+1,k) + z_nd(i+1,j+1,k)
217 -z_nd(i,j ,k) - z_nd(i+1,j ,k) );
232 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
233 const amrex::Array4<const amrex::Real>& z_nd)
235 amrex::Real dzInv = cellSizeInv[2];
236 amrex::Real met_h_zeta = dzInv * (z_nd(i,j,k+1) - z_nd(i,j,k));
245 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
246 const amrex::Array4<const amrex::Real>& z_nd)
248 amrex::Real dxInv = cellSizeInv[0];
249 amrex::Real met_h_xi = 0.25 * dxInv *
250 ( z_nd(i+1,j,k) + z_nd(i+1,j,k+1)
251 -z_nd(i-1,j,k) - z_nd(i-1,j,k+1) );
260 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
261 const amrex::Array4<const amrex::Real>& z_nd)
263 amrex::Real dyInv = cellSizeInv[1];
264 amrex::Real met_h_eta = 0.25 * dyInv *
265 ( z_nd(i,j+1,k) + z_nd(i,j+1,k+1)
266 -z_nd(i,j-1,k) - z_nd(i,j-1,k+1) );
277 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
278 const amrex::Array4<const amrex::Real>& z_nd)
280 amrex::Real dzInv = cellSizeInv[2];
281 amrex::Real met_h_zeta = 0.25 * dzInv * ( z_nd(i,j,k+1) + z_nd(i,j+1,k+1)
282 -z_nd(i,j,k-1) - z_nd(i,j+1,k-1) );
291 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
292 const amrex::Array4<const amrex::Real>& z_nd)
294 amrex::Real dxInv = cellSizeInv[0];
295 amrex::Real met_h_xi = 0.25 * dxInv *
296 ( z_nd(i+1,j+1,k) + z_nd(i+1,j ,k)
297 -z_nd(i-1,j+1,k) - z_nd(i-1,j ,k) );
306 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
307 const amrex::Array4<const amrex::Real>& z_nd)
309 amrex::Real dyInv = cellSizeInv[1];
310 amrex::Real met_h_eta = dyInv * ( z_nd(i,j+1,k) - z_nd(i,j,k) );
321 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
322 const amrex::Array4<const amrex::Real>& z_nd)
324 amrex::Real dzInv = cellSizeInv[2];
325 amrex::Real met_h_zeta = 0.25 * dzInv * ( z_nd(i,j,k+1) + z_nd(i+1,j,k+1)
326 -z_nd(i,j,k-1) - z_nd(i+1,j,k-1) );
335 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
336 const amrex::Array4<const amrex::Real>& z_nd)
338 amrex::Real dxInv = cellSizeInv[0];
339 amrex::Real met_h_xi = dxInv * ( z_nd(i+1,j,k) - z_nd(i,j,k) );
348 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
349 const amrex::Array4<const amrex::Real>& z_nd)
351 amrex::Real dyInv = cellSizeInv[1];
352 amrex::Real met_h_eta = 0.25 * dyInv *
353 ( z_nd(i+1,j+1,k) + z_nd(i,j+1,k)
354 -z_nd(i+1,j-1,k) - z_nd(i,j-1,k) );
363 const amrex::Array4<const amrex::Real>& z_nd)
365 const amrex::Real z_cc = 0.125*( z_nd(i ,j ,k ) + z_nd(i ,j ,k+1) +
366 + z_nd(i+1,j ,k ) + z_nd(i ,j ,k+1)
367 + z_nd(i ,j+1,k ) + z_nd(i ,j+1,k+1)
368 + z_nd(i+1,j+1,k ) + z_nd(i ,j+1,k+1));
378 const amrex::Array4<const amrex::Real>& z_nd)
380 const amrex::Real z_wf = 0.25*( z_nd(i ,j ,k ) + z_nd(i+1,j ,k )
381 + z_nd(i ,j+1,k ) + z_nd(i+1,j+1,k ) );
391 const amrex::Array4<const amrex::Real>& z_nd)
393 const amrex::Real z_cc = 0.125*( z_nd(i ,j ,k ) + z_nd(i ,j ,k+1) +
394 + z_nd(i+1,j ,k ) + z_nd(i ,j ,k+1)
395 + z_nd(i ,j+1,k ) + z_nd(i ,j+1,k+1)
396 + z_nd(i+1,j+1,k ) + z_nd(i ,j+1,k+1));
400 const amrex::Real z0_cc = 0.25*( z_nd(i ,j ,0) + z_nd(i ,j+1,0)
401 + z_nd(i+1,j ,0) + z_nd(i+1,j+1,0));
403 return (z_cc - z0_cc);
416 const amrex::Array4<const amrex::Real>& u_arr,
417 const amrex::Array4<const amrex::Real>& v_arr,
418 const amrex::Array4<const amrex::Real>& mf_u,
419 const amrex::Array4<const amrex::Real>& mf_v,
420 const amrex::Array4<const amrex::Real>& z_nd,
421 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxInv)
428 amrex::Real met_xi = (amrex::Real(1.0/12.0)*(z_x_m2 - z_x_p2)
429 + amrex::Real(8.0/12.0)*(z_x_p1 - z_x_m1)) * dxInv[0];
436 amrex::Real met_eta = (amrex::Real(1.0/12.0)*(z_y_m2 - z_y_p2)
437 + amrex::Real(8.0/12.0)*(z_y_p1 - z_y_m1)) * dxInv[1];
440 amrex::Real u_hi = (k == 0) ? 1.5 * u_arr(i+1,j ,k ) - 0.5 * u_arr(i+1,j ,k+1) :
441 0.5 * ( u_arr(i+1,j ,k-1) + u_arr(i+1,j ,k ) );
442 amrex::Real u_lo = (k == 0) ? 1.5 * u_arr(i ,j ,k ) - 0.5 * u_arr(i ,j ,k+1) :
443 0.5 * ( u_arr(i ,j ,k-1) + u_arr(i ,j ,k ) );
444 amrex::Real mf_u_hi = mf_u(i+1,j,0);
445 amrex::Real mf_u_lo = mf_u(i ,j,0);
447 amrex::Real v_hi = (k == 0) ? 1.5 * v_arr(i ,j+1,k ) - 0.5 * v_arr(i ,j+1,k+1) :
448 0.5 * ( v_arr(i ,j+1,k-1) + v_arr(i ,j+1,k ) );
449 amrex::Real v_lo = (k == 0) ? 1.5 * v_arr(i ,j ,k ) - 0.5 * v_arr(i ,j ,k+1) :
450 0.5 * ( v_arr(i ,j ,k-1) + v_arr(i ,j ,k ) );
451 amrex::Real mf_v_hi = mf_v(i,j+1,0);
452 amrex::Real mf_v_lo = mf_v(i,j ,0);
454 amrex::Real u_met = met_xi * 0.5 * ( u_hi*mf_u_hi + u_lo*mf_u_lo );
455 amrex::Real v_met = met_eta * 0.5 * ( v_hi*mf_v_hi + v_lo*mf_v_lo );
457 amrex::Real
omega = w - u_met - v_met;
466 const amrex::Array4<const amrex::Real>& u_arr,
467 const amrex::Array4<const amrex::Real>& v_arr,
468 const amrex::Array4<const amrex::Real>& mf_u,
469 const amrex::Array4<const amrex::Real>& mf_v,
470 const amrex::Array4<const amrex::Real>& z_nd,
471 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxInv)
478 amrex::Real met_xi = (amrex::Real(1.0/12.0)*(z_x_m2 - z_x_p2)
479 + amrex::Real(8.0/12.0)*(z_x_p1 - z_x_m1)) * dxInv[0];
486 amrex::Real met_eta = (amrex::Real(1.0/12.0)*(z_y_m2 - z_y_p2)
487 + amrex::Real(8.0/12.0)*(z_y_p1 - z_y_m1)) * dxInv[1];
490 amrex::Real u_hi = (k == 0) ? 1.5 * u_arr(i+1,j ,k ) - 0.5 * u_arr(i+1,j ,k+1) :
491 0.5 * ( u_arr(i+1,j ,k-1) + u_arr(i+1,j ,k ) );
492 amrex::Real u_lo = (k == 0) ? 1.5 * u_arr(i ,j ,k ) - 0.5 * u_arr(i ,j ,k+1) :
493 0.5 * ( u_arr(i ,j ,k-1) + u_arr(i ,j ,k ) );
494 amrex::Real mf_u_hi = mf_u(i+1,j,0);
495 amrex::Real mf_u_lo = mf_u(i ,j,0);
497 amrex::Real v_hi = (k == 0) ? 1.5 * v_arr(i ,j+1,k ) - 0.5 * v_arr(i ,j+1,k+1) :
498 0.5 * ( v_arr(i ,j+1,k-1) + v_arr(i ,j+1,k ) );
499 amrex::Real v_lo = (k == 0) ? 1.5 * v_arr(i ,j ,k ) - 0.5 * v_arr(i ,j ,k+1) :
500 0.5 * ( v_arr(i ,j ,k-1) + v_arr(i ,j ,k ) );
501 amrex::Real mf_v_hi = mf_v(i,j+1,0);
502 amrex::Real mf_v_lo = mf_v(i,j ,0);
504 amrex::Real u_met = met_xi * 0.5 * ( u_hi*mf_u_hi + u_lo*mf_u_lo );
505 amrex::Real v_met = met_eta * 0.5 * ( v_hi*mf_v_hi + v_lo*mf_v_lo );
507 amrex::Real w =
omega + u_met + v_met;
520 OmegaFromW (
int& i,
int& j,
int& k, amrex::Real w,
521 const amrex::Array4<const amrex::Real>& u_arr,
522 const amrex::Array4<const amrex::Real>& v_arr,
523 const amrex::Array4<const amrex::Real>& mf_u,
524 const amrex::Array4<const amrex::Real>& mf_v,
525 const amrex::Array4<const amrex::Real>& z_nd,
526 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxInv)
531 amrex::Real met_xi = 0.5 * (z_x_h - z_x_l) * dxInv[0];
536 amrex::Real met_eta = 0.5 * (z_y_h - z_y_l) * dxInv[1];
539 amrex::Real u_hi = (k == 0) ? 1.5 * u_arr(i+1,j ,k ) - 0.5 * u_arr(i+1,j ,k+1) :
540 0.5 * ( u_arr(i+1,j ,k-1) + u_arr(i+1,j ,k ) );
541 amrex::Real u_lo = (k == 0) ? 1.5 * u_arr(i ,j ,k ) - 0.5 * u_arr(i ,j ,k+1) :
542 0.5 * ( u_arr(i ,j ,k-1) + u_arr(i ,j ,k ) );
543 amrex::Real mf_u_hi = mf_u(i+1,j,0);
544 amrex::Real mf_u_lo = mf_u(i ,j,0);
546 amrex::Real v_hi = (k == 0) ? 1.5 * v_arr(i ,j+1,k ) - 0.5 * v_arr(i ,j+1,k+1) :
547 0.5 * ( v_arr(i ,j+1,k-1) + v_arr(i ,j+1,k ) );
548 amrex::Real v_lo = (k == 0) ? 1.5 * v_arr(i ,j ,k ) - 0.5 * v_arr(i ,j ,k+1) :
549 0.5 * ( v_arr(i ,j ,k-1) + v_arr(i ,j ,k ) );
550 amrex::Real mf_v_hi = mf_v(i,j+1,0);
551 amrex::Real mf_v_lo = mf_v(i,j ,0);
553 amrex::Real u_met = met_xi * 0.5 * ( u_hi*mf_u_hi + u_lo*mf_u_lo );
554 amrex::Real v_met = met_eta * 0.5 * ( v_hi*mf_v_hi + v_lo*mf_v_lo );
556 amrex::Real
omega = w - u_met - v_met;
565 const amrex::Array4<const amrex::Real>& u_arr,
566 const amrex::Array4<const amrex::Real>& v_arr,
567 const amrex::Array4<const amrex::Real>& mf_u,
568 const amrex::Array4<const amrex::Real>& mf_v,
569 const amrex::Array4<const amrex::Real>& z_nd,
570 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxInv)
575 amrex::Real met_xi = 0.5 * (z_x_h - z_x_l) * dxInv[0];
580 amrex::Real met_eta = 0.5 * (z_y_h - z_y_l) * dxInv[1];
583 amrex::Real u_hi = (k == 0) ? 1.5 * u_arr(i+1,j ,k ) - 0.5 * u_arr(i+1,j ,k+1) :
584 0.5 * ( u_arr(i+1,j ,k-1) + u_arr(i+1,j ,k ) );
585 amrex::Real u_lo = (k == 0) ? 1.5 * u_arr(i ,j ,k ) - 0.5 * u_arr(i ,j ,k+1) :
586 0.5 * ( u_arr(i ,j ,k-1) + u_arr(i ,j ,k ) );
587 amrex::Real mf_u_hi = mf_u(i+1,j,0);
588 amrex::Real mf_u_lo = mf_u(i ,j,0);
590 amrex::Real v_hi = (k == 0) ? 1.5 * v_arr(i ,j+1,k ) - 0.5 * v_arr(i ,j+1,k+1) :
591 0.5 * ( v_arr(i ,j+1,k-1) + v_arr(i ,j+1,k ) );
592 amrex::Real v_lo = (k == 0) ? 1.5 * v_arr(i ,j ,k ) - 0.5 * v_arr(i ,j ,k+1) :
593 0.5 * ( v_arr(i ,j ,k-1) + v_arr(i ,j ,k ) );
594 amrex::Real mf_v_hi = mf_v(i,j+1,0);
595 amrex::Real mf_v_lo = mf_v(i,j ,0);
597 amrex::Real u_met = met_xi * 0.5 * ( u_hi*mf_u_hi + u_lo*mf_u_lo );
598 amrex::Real v_met = met_eta * 0.5 * ( v_hi*mf_v_hi + v_lo*mf_v_lo );
600 amrex::Real w =
omega + u_met + v_met;
615 const amrex::Real& flux,
616 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxInv,
617 const amrex::Array4<const amrex::Real>& zphys_arr,
618 const amrex::Array4<amrex::Real>& phi1_arr,
619 const amrex::Array4<amrex::Real>& phi2_arr,
620 const amrex::Array4<amrex::Real>& phi3_arr)
624 amrex::Real InvNorm = 1.0 / std::sqrt(1.0 + h_xi*h_xi + h_eta*h_eta);
625 phi1_arr(i,j,klo) = -h_xi * flux * InvNorm;
626 phi2_arr(i,j,klo) = -h_eta * flux * InvNorm;
627 phi3_arr(i,j,klo) = flux * InvNorm;
636 const amrex::Real& flux,
637 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxInv,
638 const amrex::Array4<const amrex::Real>& zphys_arr,
639 const amrex::Array4<const amrex::Real>& u_arr,
640 const amrex::Array4<const amrex::Real>& v_arr,
641 const amrex::Array4<const amrex::Real>& w_arr,
642 const amrex::Array4<amrex::Real>& tau11_arr,
643 const amrex::Array4<amrex::Real>& tau22_arr,
644 const amrex::Array4<amrex::Real>& tau33_arr,
645 const amrex::Array4<amrex::Real>& tau12_arr,
646 const amrex::Array4<amrex::Real>& tau21_arr,
647 const amrex::Array4<amrex::Real>& tau13_arr,
648 const amrex::Array4<amrex::Real>& tau31_arr,
649 const amrex::Array4<amrex::Real>& tau23_arr,
650 const amrex::Array4<amrex::Real>& tau32_arr)
653 amrex::Array1D<amrex::Real,0,2> n_hat;
656 amrex::Array1D<amrex::Real,0,2> t_hat_1;
657 amrex::Array1D<amrex::Real,0,2> t_hat_2;
658 amrex::Array1D<amrex::Real,0,2> u_t_hat;
661 amrex::Array1D<amrex::Real,0,2> a_hat;
664 amrex::Array2D<amrex::Real,0,2,0,2> R_mat;
671 amrex::Real Inormn = 1./std::sqrt(1.0 + h_xi*h_xi + h_eta*h_eta);
672 n_hat(0) = -Inormn*h_xi; n_hat(1) = -Inormn*h_eta; n_hat(2) = Inormn;
675 amrex::Real Inorm1 = 1./std::sqrt(1.0 + h_xi*h_xi);
676 amrex::Real Inorm2 = 1./std::sqrt(1.0 + h_eta*h_eta);
677 t_hat_1(0) = Inorm1; t_hat_2(1) = Inorm2;
678 t_hat_1(2) = Inorm1*h_xi; t_hat_2(2) = Inorm2*h_eta;
681 amrex::Real Norm_u_t = 0.0;
682 amrex::Real mag1 = (u_arr(i,j,klo) + h_xi *w_arr(i,j,klo))*Inorm1;
683 amrex::Real mag2 = (v_arr(i,j,klo) + h_eta*w_arr(i,j,klo))*Inorm2;
684 for (
int icol(0); icol<3; ++icol) {
685 u_t_hat(icol) = mag1*t_hat_1(icol) + mag2*t_hat_2(icol);
686 Norm_u_t += u_t_hat(icol)*u_t_hat(icol);
688 for (
int icol(0); icol<3; ++icol) {
689 u_t_hat(icol) /= std::sqrt(Norm_u_t);
693 a_hat(0) = n_hat(1)*u_t_hat(2) - n_hat(2)*u_t_hat(1);
694 a_hat(1) = -(n_hat(0)*u_t_hat(2) - n_hat(2)*u_t_hat(0));
695 a_hat(2) = n_hat(1)*u_t_hat(1) - n_hat(1)*u_t_hat(0);
700 for (
int icol(0); icol<3; ++icol) {
701 R_mat(icol,jrow) = u_t_hat(icol);
704 for (
int icol(0); icol<3; ++icol) {
705 R_mat(icol,jrow) = a_hat(icol);
708 for (
int icol(0); icol<3; ++icol) {
709 R_mat(icol,jrow) = n_hat(icol);
713 tau11_arr(i,j,klo) = 2.0*R_mat(0,0)*R_mat(2,0)*flux;
714 tau22_arr(i,j,klo) = 2.0*R_mat(0,1)*R_mat(2,1)*flux;
715 tau33_arr(i,j,klo) = 2.0*R_mat(0,2)*R_mat(2,2)*flux;
717 tau12_arr(i,j,klo) = (R_mat(0,0)*R_mat(2,1) + R_mat(2,0)*R_mat(0,1))*flux;
718 tau21_arr(i,j,klo) = tau12_arr(i,j,klo);
720 tau13_arr(i,j,klo) = (R_mat(0,0)*R_mat(2,2) + R_mat(0,2)*R_mat(2,0))*flux;
721 tau31_arr(i,j,klo) = tau13_arr(i,j,klo);
723 tau23_arr(i,j,klo) = (R_mat(0,1)*R_mat(2,2) + R_mat(0,2)*R_mat(2,1))*flux;
724 tau32_arr(i,j,klo) = tau23_arr(i,j,klo);
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real OmegaFromW(int &i, int &j, int &k, amrex::Real w, const amrex::Array4< const amrex::Real > &u_arr, const amrex::Array4< const amrex::Real > &v_arr, const amrex::Array4< const amrex::Real > &mf_u, const amrex::Array4< const amrex::Real > &mf_v, const amrex::Array4< const amrex::Real > &z_nd, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv)
Definition: ERF_TerrainMetrics.H:415
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtEdgeCenterJ(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:305
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtEdgeCenterK(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:244
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtEdgeCenterJ(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:290
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtIface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:110
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtEdgeCenterJ(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:276
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtEdgeCenterK(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:231
void init_zlevels(amrex::Vector< amrex::Vector< amrex::Real >> &zlevels_stag, amrex::Vector< amrex::Vector< amrex::Real >> &stretched_dz_h, amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real >> &stretched_dz_d, amrex::Vector< amrex::Geometry > const &geom, amrex::Vector< amrex::IntVect > const &ref_ratio, const amrex::Real grid_stretching_ratio, const amrex::Real zsurf, const amrex::Real dz0)
AMREX_FORCE_INLINE AMREX_GPU_DEVICE amrex::Real Compute_h_zeta_AtCellCenter(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:47
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtEdgeCenterI(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:320
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_Zrel_AtCellCenter(const int &i, const int &j, const int &k, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:390
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtCellCenter(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:77
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtKface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:182
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_Z_AtCellCenter(const int &i, const int &j, const int &k, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:362
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void rotate_scalar_flux(const int &i, const int &j, const int &klo, const amrex::Real &flux, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv, const amrex::Array4< const amrex::Real > &zphys_arr, const amrex::Array4< amrex::Real > &phi1_arr, const amrex::Array4< amrex::Real > &phi2_arr, const amrex::Array4< amrex::Real > &phi3_arr)
Definition: ERF_TerrainMetrics.H:612
void init_default_zphys(int lev, const amrex::Geometry &geom, amrex::MultiFab &z_phys_nd, amrex::MultiFab &z_phys_cc)
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtIface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:96
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void rotate_stress_tensor(const int &i, const int &j, const int &klo, const amrex::Real &flux, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv, const amrex::Array4< const amrex::Real > &zphys_arr, const amrex::Array4< const amrex::Real > &u_arr, const amrex::Array4< const amrex::Real > &v_arr, const amrex::Array4< const amrex::Real > &w_arr, const amrex::Array4< amrex::Real > &tau11_arr, const amrex::Array4< amrex::Real > &tau22_arr, const amrex::Array4< amrex::Real > &tau33_arr, const amrex::Array4< amrex::Real > &tau12_arr, const amrex::Array4< amrex::Real > &tau21_arr, const amrex::Array4< amrex::Real > &tau13_arr, const amrex::Array4< amrex::Real > &tau31_arr, const amrex::Array4< amrex::Real > &tau23_arr, const amrex::Array4< amrex::Real > &tau32_arr)
Definition: ERF_TerrainMetrics.H:633
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtJface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:153
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_Z_AtWFace(const int &i, const int &j, const int &k, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:377
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtKface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:197
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtEdgeCenterK(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:259
void init_which_terrain_grid(int lev, const amrex::Geometry &geom, amrex::MultiFab &z_phys_nd, amrex::Vector< amrex::Real > const &z_levels_h)
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtIface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:125
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtEdgeCenterI(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:334
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtJface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:139
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtCellCenter(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:62
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtJface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:167
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtEdgeCenterI(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:347
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtKface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:211
void make_terrain_fitted_coords(int lev, const amrex::Geometry &geom, amrex::MultiFab &z_phys_nd, amrex::Vector< amrex::Real > const &z_levels_h, amrex::GpuArray< ERF_BC, AMREX_SPACEDIM *2 > &phys_bc_type)
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real WFromOmega(int &i, int &j, int &k, amrex::Real omega, const amrex::Array4< const amrex::Real > &u_arr, const amrex::Array4< const amrex::Real > &v_arr, const amrex::Array4< const amrex::Real > &mf_u, const amrex::Array4< const amrex::Real > &mf_v, const amrex::Array4< const amrex::Real > &z_nd, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv)
Definition: ERF_TerrainMetrics.H:465
@ omega
Definition: ERF_Morrison.H:53