REMORA
Regional Modeling of Oceans Refined Adaptively
Loading...
Searching...
No Matches
REMORA_InitAnalyticBathymetry_Upwelling_ML.H
Go to the documentation of this file.
1
2 int rrx = remora.refRatio(0)[0];
3 int rry = remora.refRatio(0)[1];
4
5 // Must not be doubly periodic, and must have terrain
6 //AMREX_ALWAYS_ASSERT( !NSPeriodic || !EWPeriodic);
7 AMREX_ALWAYS_ASSERT( !m_solverChoice.flat_bathymetry);
8
9 mf_h.setVal(geomdata.ProbHi(2));
10
11 if (lev==0 && m_solverChoice.init_l1ad_T) {
12 const int Lm = geom.Domain().size()[0] * rrx;
13 const int Mm = geom.Domain().size()[1] * rry;
14 BoxArray old_ba(mf_h.boxArray());
15 BoxArray tmp_ba = old_ba.refine(IntVect(rrx,rry,1));
16 DistributionMapping tmp_dm(tmp_ba);
17 MultiFab mf_h_hires(tmp_ba, tmp_dm, 2, mf_h.nGrow());
18 mf_h_hires.setVal(geomdata.ProbHi(2));
19
20 for ( MFIter mfi(mf_h_hires, TilingIfNotGPU()); mfi.isValid(); ++mfi )
21 {
22 Array4<Real> const& h = (mf_h_hires).array(mfi);
23
24 Box bx = mfi.tilebox();
25 Box gbx3 = bx;
26 gbx3.grow(IntVect(NGROW+1,NGROW+1,0));
27
28 Box gbx3D = gbx3;
29 gbx3D.makeSlab(2,0);
30
31 Gpu::streamSynchronize();
32
33 if (EWPeriodic) {
34
35 ParallelFor(gbx3D, [=] AMREX_GPU_DEVICE (int i, int j, int )
36 {
37 int jFort = j+1; // (+1 is to match the Fortran indexing in ROMS)
38
39 Real val1 = (jFort<=Mm/2.0) ? jFort : Mm+1-jFort;
40 val1 -= 0.5;
41 Real adj = geomdata.CellSize()[0]/(1000.0_rt * rrx);
42
43 h(i,j,0) = std::min(-geomdata.ProbLo(2),(84.5_rt+66.526_rt*std::tanh((val1*adj-10.0_rt)/7.0_rt)));
44 });
45 } else if (NSPeriodic) {
46
47 ParallelFor(gbx3D, [=] AMREX_GPU_DEVICE (int i, int j, int )
48 {
49 int iFort = i+1; // (+1 is to match the Fortran indexing in ROMS)
50
51 Real val1 = (iFort <= Lm/2.0) ? iFort : Lm+1-iFort;
52 val1 -= 0.5;
53 Real adj = geomdata.CellSize()[1]/(1000.0_rt * rry);
54
55 h(i,j,0) = std::min(-geomdata.ProbLo(2),(84.5_rt+66.526_rt*std::tanh((val1*adj-10.0_rt)/7.0_rt)));
56 });
57 }
58 } // mfi
59 average_down(mf_h_hires, mf_h, 0, mf_h.nComp(), IntVect(rrx,rry,1));
60 } else {
61 const int Lm = geom.Domain().size()[0];
62 const int Mm = geom.Domain().size()[1];
63 for ( MFIter mfi(mf_h, TilingIfNotGPU()); mfi.isValid(); ++mfi )
64 {
65 Array4<Real> const& h = (mf_h).array(mfi);
66
67 Box bx = mfi.tilebox();
68 Box gbx3 = bx;
69 gbx3.grow(IntVect(NGROW+1,NGROW+1,0));
70
71 Box gbx3D = gbx3;
72 gbx3D.makeSlab(2,0);
73
74 Gpu::streamSynchronize();
75
76 if (EWPeriodic) {
77
78 ParallelFor(gbx3D, [=] AMREX_GPU_DEVICE (int i, int j, int )
79 {
80 int jFort = j+1; // (+1 is to match the Fortran indexing in ROMS)
81
82 Real val1 = (jFort<=Mm/2.0) ? jFort : Mm+1-jFort;
83 val1 -= 0.5;
84 Real adj = geomdata.CellSize()[0]/1000.0_rt;
85
86 h(i,j,0) = std::min(-geomdata.ProbLo(2),(84.5_rt+66.526_rt*std::tanh((val1*adj-10.0_rt)/7.0_rt)));
87 });
88 } else if (NSPeriodic) {
89
90 ParallelFor(gbx3D, [=] AMREX_GPU_DEVICE (int i, int j, int )
91 {
92 int iFort = i+1; // (+1 is to match the Fortran indexing in ROMS)
93
94 Real val1 = (iFort <= Lm/2.0) ? iFort : Lm+1-iFort;
95 val1 -= 0.5;
96 Real adj = geomdata.CellSize()[1]/1000.0_rt;
97
98 h(i,j,0) = std::min(-geomdata.ProbLo(2),(84.5_rt+66.526_rt*std::tanh((val1*adj-10.0_rt)/7.0_rt)));
99 });
100 }
101 } // mfi
102 }
#define NGROW
AMREX_ALWAYS_ASSERT(!m_solverChoice.flat_bathymetry)