40 const int ioff,
const int joff,
41 const Array4<Real >& vel,
42 const Array4<Real const>& vel_old,
43 const Array4<Real >& rvel,
44 const Array4<Real const>& Hz,
45 const Array4<Real const>& Akv,
46 const Array4<Real >& DC,
47 const Array4<Real >& FC,
48 const Array4<Real const>& sstr,
49 const Array4<Real const>& bstr,
50 const Array4<Real const>& z_r,
51 const Array4<Real const>& pm,
52 const Array4<Real const>& pn,
53 const int iic,
const int ntfirst,
const int nnew,
int nstp,
int nrhs,
int N,
54 const Real lambda,
const Real dt_lev)
57 BoxArray ba_gbxvel = intersect(BoxArray(vel_bx), gbx);
58 AMREX_ASSERT((ba_gbxvel.size() == 1));
59 Box gbxvel = ba_gbxvel[0];
67 Real oml_dt = dt_lev*(1.0_rt-lambda);
72 amrex::Print() <<
"in update_vel_3d with box " << vel_bx << std::endl;
73 Print() <<
"vel old " << Box(vel_old) << std::endl;
74 Print() <<
"Akv " << Box(Akv) << std::endl;
77 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
81 Real cff = 1.0_rt / ( z_r(i,j,k+1)+z_r(i-ioff,j-joff,k+1)
82 -z_r(i,j,k )-z_r(i-ioff,j-joff,k ));
83 FC(i,j,k) = oml_dt * cff * (vel_old(i,j,k+1,nstp)-vel_old(i,j,k,nstp)) *
84 (Akv(i,j,k) +Akv(i-ioff,j-joff,k));
88 FC(i,j,-1) = dt_lev*bstr(i,j,0);
92 FC(i,j, N) = dt_lev*sstr(i,j,0);
95 DC(i,j,k) = 0.25_rt * dt_lev * (pm(i,j,0)+pm(i-ioff,j-joff,0))
96 * (pn(i,j,0)+pn(i-ioff,j-joff,0));
100 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
102 Real cff3=dt_lev*(1.0_rt-lambda);
103 Real cff1 = 0.0_rt, cff2 = 0.0_rt, cff4;
111 cff1=vel_old(i,j,k,nstp)*0.5_rt*(Hz(i,j,k)+Hz(i-ioff,j-joff,k));
112 cff2=FC(i,j,k)-FC(i,j,k-1);
113 vel(i,j,k,nnew)=cff1+cff2;
117 cff1=vel_old(i,j,k,nstp)*0.5_rt*(Hz(i,j,k)+Hz(i-ioff,j-joff,k));
118 cff2=FC(i,j,k)-dt_lev*bstr(i,j,0);
119 vel(i,j,k,nnew)=cff1+cff2;
123 cff1=vel_old(i,j,k,nstp)*0.5_rt*(Hz(i,j,k)+Hz(i-ioff,j-joff,k));
124 cff2=dt_lev*sstr(i,j,0)-FC(i,j,k-1);
125 vel(i,j,k,nnew)=cff1+cff2;
128 }
else if(iic==ntfirst+1) {
131 cff1=vel_old(i,j,k,nstp)*0.5_rt*(Hz(i,j,k)+Hz(i-ioff,j-joff,k));
132 cff2=FC(i,j,k)-FC(i,j,k-1);
135 cff1=vel_old(i,j,k,nstp)*0.5_rt*(Hz(i,j,k)+Hz(i-ioff,j-joff,k));
136 cff2=FC(i,j,k)-dt_lev*bstr(i,j,0);
139 cff1=vel_old(i,j,k,nstp)*0.5_rt*(Hz(i,j,k)+Hz(i-ioff,j-joff,k));
140 cff2=dt_lev*sstr(i,j,0)-FC(i,j,k-1);
143 cff3=0.5_rt*DC(i,j,k);
145 if (ioff==0&&joff==0) {
146 vel(i,j,k,nnew)=cff1 + cff2;
149 Real r_swap= rvel(i,j,k,indx);
150 rvel(i,j,k,indx) = rvel(i,j,k,nrhs);
151 rvel(i,j,k,nrhs) = r_swap;
152 vel(i,j,k,nnew)=cff1- cff3*rvel(i,j,k,indx)+ cff2;
155 cff1 = 5.0_rt/12.0_rt;
156 cff2 = 16.0_rt/12.0_rt;
158 cff3=vel_old(i,j,k,nstp)*0.5_rt*(Hz(i,j,k)+Hz(i-ioff,j-joff,k));
159 cff4=FC(i,j,k)-dt_lev*bstr(i,j,0);
163 cff3=vel_old(i,j,k,nstp)*0.5_rt*(Hz(i,j,k)+Hz(i-ioff,j-joff,k));
164 cff4=dt_lev*sstr(i,j,0)-FC(i,j,k-1);
167 cff3=vel_old(i,j,k,nstp)*0.5_rt*(Hz(i,j,k)+Hz(i-ioff,j-joff,k));
168 cff4=FC(i,j,k)-FC(i,j,k-1);
171 if (ioff==0 && joff==0) {
172 vel(i,j,k,nnew) = cff3 + cff4;
175 Real r_swap= rvel(i,j,k,indx);
176 rvel(i,j,k,indx) = rvel(i,j,k,nrhs);
177 rvel(i,j,k,nrhs) = r_swap;
179 vel(i,j,k,nnew) = cff3 + DC(i,j,k)*(cff1*rvel(i,j,k,nrhs)-
180 cff2*rvel(i,j,k,indx))+cff4;
181 rvel(i,j,k,nrhs) = 0.0_rt;
void prestep_diffusion(const amrex::Box &bx, const amrex::Box &gbx, const int ioff, const int joff, const amrex::Array4< amrex::Real > &vel, const amrex::Array4< amrex::Real const > &vel_old, const amrex::Array4< amrex::Real > &rvel, const amrex::Array4< amrex::Real const > &Hz, const amrex::Array4< amrex::Real const > &Akv, const amrex::Array4< amrex::Real > &DC, const amrex::Array4< amrex::Real > &FC, const amrex::Array4< amrex::Real const > &sstr, const amrex::Array4< amrex::Real const > &bstr, const amrex::Array4< amrex::Real const > &z_r, const amrex::Array4< amrex::Real const > &pm, const amrex::Array4< amrex::Real const > &pn, const int iic, const int ntfirst, const int nnew, int nstp, int nrhs, int N, const amrex::Real lambda, const amrex::Real dt_lev)
Update velocities or tracers with diffusion/viscosity as the last part of the prestep.