REMORA
Regional Modeling of Oceans Refined Adaptively
Loading...
Searching...
No Matches
REMORA_vert_mean_3d.cpp
Go to the documentation of this file.
1#include <REMORA.H>
2
3using namespace amrex;
4
5/**
6 * @param[in ] phi_bx box to update on
7 * @param[in ] ioff x-direction offset
8 * @param[in ] joff y-direction offset
9 * @param[inout] phi velocity (u or v)
10 * @param[in ] Dphi_avg1 time average of barotropic velocity
11 * @param DC temporary
12 * @param CF temporary
13 * @param[in ] pm_or_pn 1/dx or 1/dy
14 * @param[in ] msk land-sea mask
15 * @param[in ] nnew index of time step to update
16 * @param[in ] N number of vertical levels
17 */
18void
19REMORA::vert_mean_3d (const Box& phi_bx, const int ioff, const int joff,
20 const Array4<Real >& phi,
21 const Array4<Real const>& Hz,
22 const Array4<Real const>& Dphi_avg1,
23 const Array4<Real >& DC,
24 const Array4<Real >& CF,
25 const Array4<Real const>& pm_or_pn,
26 const Array4<Real const>& msk,
27 const int nnew, const int N)
28{
29
30 ParallelFor(makeSlab(phi_bx,2,0),
31 [=] AMREX_GPU_DEVICE (int i, int j, int )
32 {
33 Real Hzk_on_face = 0.5_rt*(Hz(i-ioff,j-joff,0)+Hz(i,j,0));
34 CF(i,j,-1) = Hzk_on_face;
35 DC(i,j,-1) = phi(i,j,0,nnew)*Hzk_on_face;
36
37 for (int k=1; k<=N; k++) {
38 Hzk_on_face = 0.5_rt*(Hz(i-ioff,j-joff,k)+Hz(i,j,k));
39 CF(i,j,-1) += Hzk_on_face;
40 DC(i,j,-1) += phi(i,j,k,nnew)*Hzk_on_face;
41 }
42 });
43
44 ParallelFor(makeSlab(phi_bx,2,0), [=] AMREX_GPU_DEVICE (int i, int j, int )
45 {
46 Real on_u_or_om_v = 2.0_rt / (pm_or_pn(i-ioff,j-joff,0) + pm_or_pn(i,j,0));
47 Real cff1=1.0_rt/(CF(i,j,-1)*(on_u_or_om_v));
48 DC(i,j,-1) = (DC(i,j,-1)*(on_u_or_om_v) - Dphi_avg1(i,j,0))*cff1; // recursive
49 });
50
51 ParallelFor(phi_bx, [=] AMREX_GPU_DEVICE (int i, int j, int k)
52 {
53 phi(i,j,k) -= DC(i,j,-1);
54 phi(i,j,k) *= msk(i,j,0);
55 });
56}
void vert_mean_3d(const amrex::Box &bx, const int ioff, const int joff, const amrex::Array4< amrex::Real > &phi, const amrex::Array4< amrex::Real const > &Hz, const amrex::Array4< amrex::Real const > &Dphi_avg1, const amrex::Array4< amrex::Real > &DC, const amrex::Array4< amrex::Real > &CF, const amrex::Array4< amrex::Real const > &pm_or_pn, const amrex::Array4< amrex::Real const > &msk, const int nnew, const int N)
Adjust 3D momentum variables based on vertical mean momentum.