REMORA
Regional Modeling of Oceans Refined Adaptively
Loading...
Searching...
No Matches
REMORA_Derive.cpp
Go to the documentation of this file.
1#include "REMORA_Derive.H"
3
4using namespace amrex;
5
6namespace derived {
7
8void
10 const amrex::Box& /*bx*/,
11 amrex::FArrayBox& /*derfab*/,
12 int /*dcomp*/,
13 int /*ncomp*/,
14 const amrex::FArrayBox& /*datfab*/,
15 const amrex::Array4<const amrex::Real>& /*pm*/,
16 const amrex::Array4<const amrex::Real>& /*pn*/,
17 const amrex::Array4<const amrex::Real>& /*maskr*/,
18 const amrex::Geometry& /*geomdata*/,
19 amrex::Real /*time*/,
20 const int* /*bcrec*/,
21 const int /*level*/)
22{
23 // This routine does nothing -- we use it as a placeholder.
24}
25
26/*
27 * \brief Function to calculate vorticity for derived field output
28 *
29 * @param[in ] bx box to calculate on
30 * @param[ out] derfab derived field output
31 * @param[in ] dcomp component to store derived field
32 * @param[in ] ncomp number of components
33 * @param[in ] datfab velocity to be used to calculate derived field
34 * @param[in ] pm 1/dx
35 * @param[in ] pn 1/dy
36 * @param[in ] geomdata geometry data
37 * @param[in ] time current time
38 * @param[in ] bcrec BC info
39 * @param[in ] level current level
40 */
41void
43 const amrex::Box& bx,
44 amrex::FArrayBox& derfab,
45 int dcomp,
46 int ncomp,
47 const amrex::FArrayBox& datfab,
48 const amrex::Array4<const amrex::Real>& pm,
49 const amrex::Array4<const amrex::Real>& pn,
50 const amrex::Array4<const amrex::Real>& /*maskr*/,
51 const amrex::Geometry& /*geomdata*/,
52 amrex::Real /*time*/,
53 const int* /*bcrec*/,
54 const int /*level*/)
55{
56 AMREX_ALWAYS_ASSERT(ncomp == 1);
57
58 auto const dat = datfab.array(); // cell-centered velocity
59 auto tfab = derfab.array(); // cell-centered vorticity
60
61 ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept
62 {
63 Real d2x = 0.5_rt / pm(i-1,j, 0) + 1.0_rt / pm(i,j,0) + 0.5_rt / pm(i+1,j,0);
64 Real d2y = 0.5_rt / pn(i, j-1,0) + 1.0_rt / pn(i,j,0) + 0.5_rt / pm(i,j+1,0);
65 tfab(i,j,k,dcomp) = (dat(i+1,j,k,1) - dat(i-1,j,k,1)) / (d2x) // dv/dx
66 - (dat(i,j+1,k,0) - dat(i,j-1,k,0)) / (d2y); // du/dy
67 /*TODO: Add masking to vorticity. Need to calculate psi mask first.*/
68 });
69}
70}
71
void remora_dervort(const amrex::Box &bx, amrex::FArrayBox &derfab, int dcomp, int ncomp, const amrex::FArrayBox &datfab, const amrex::Array4< const amrex::Real > &pm, const amrex::Array4< const amrex::Real > &pn, const amrex::Array4< const amrex::Real > &, const amrex::Geometry &, amrex::Real, const int *, const int)
void remora_dernull(const amrex::Box &, amrex::FArrayBox &, int, int, const amrex::FArrayBox &, const amrex::Array4< const amrex::Real > &, const amrex::Array4< const amrex::Real > &, const amrex::Array4< const amrex::Real > &, const amrex::Geometry &, amrex::Real, const int *, const int)