116 typename MF::value_type alpha,
117 typename MF::value_type eta)
121 using T =
typename MF::value_type;
125 rhsx.
ixType() == U.ixType(),
127 rhsy.
ixType() == V.ixType(),
129 rhsz.
ixType() == W.ixType()));
133#if (BL_SPACEDIM == 3)
137 MF
const* rhsxmf = &rhsx;
138 MF
const* rhsymf = &rhsy;
139#if (BL_SPACEDIM == 3)
140 MF
const* rhszmf = &rhsz;
144#if (BL_SPACEDIM == 3)
148 if (m_domain_lo != 0) {
149 detail::shift_mfs(m_domain_lo, U, rhsx, Utmp, rhsxtmp);
150 detail::shift_mfs(m_domain_lo, V, rhsy, Vtmp, rhsytmp);
151#if (BL_SPACEDIM == 3)
152 detail::shift_mfs(m_domain_lo, W, rhsz, Wtmp, rhsztmp);
154 detail::shift_mf(m_domain_lo, p, ptmp);
157#if (BL_SPACEDIM == 3)
163#if (BL_SPACEDIM == 3)
169 auto const& dxinv = m_geom.InvCellSizeArray();
170 auto const scaling = r2c.scalingFactor();
171 auto const& [cba, cdm] = r2c.getSpectralDataLayout();
173 cMF phat(cba, cdm, 1, 0);
175 cMF rxhat(cba,cdm,1,0);
176 r2c.forward(*rhsxmf, rxhat);
178 cMF ryhat(cba,cdm,1,0);
179 r2c.forward(*rhsymf, ryhat);
181#if (BL_SPACEDIM == 3)
182 cMF rzhat(cba,cdm,1,0);
183 r2c.forward(*rhszmf, rzhat);
187 T
constexpr tol = std::numeric_limits<T>::epsilon() * T(10);
188 int const nx = m_geom.Domain().length(0);
189#if (AMREX_SPACEDIM >= 2)
190 int const ny = m_geom.Domain().length(1);
192#if (AMREX_SPACEDIM == 3)
193 int const nz = m_geom.Domain().length(2);
196 auto const& pb = phat[mfi].
box();
197 auto const& parr = phat[mfi].
array();
198 auto const& rx = rxhat[mfi].
array();
199 auto const& ry = ryhat[mfi].
array();
200#if (BL_SPACEDIM == 3)
201 auto const& rz = rzhat[mfi].
array();
204 T kwy = T(2)*Math::pi<T>()/T(ny);,
205 T kwz = T(2)*Math::pi<T>()/T(nz);)
209 int jk = (j <= ny/2) ? j : j - ny;,
210 int kk = (k <= nz/2) ? k : k - nz);
214 T delsqk =
AMREX_D_TERM(T(2)*(std::cos(kwave[0])-T(1))*(dxinv[0]*dxinv[0]),
215 + T(2)*(std::cos(kwave[1])-T(1))*(dxinv[1]*dxinv[1]),
216 + T(2)*(std::cos(kwave[2])-T(1))*(dxinv[2]*dxinv[2]));
219 {
AMREX_D_DECL(Complex((std::cos(kwave[0])-T(1))*dxinv[0],
220 std::sin(kwave[0]) *dxinv[0]),
221 Complex((std::cos(kwave[1])-T(1))*dxinv[1],
222 std::sin(kwave[1]) *dxinv[1]),
223 Complex((std::cos(kwave[2])-T(1))*dxinv[2],
224 std::sin(kwave[2]) *dxinv[2]))};
227 {
AMREX_D_DECL(Complex((T(1)-std::cos(kwave[0]))*dxinv[0],
228 std::sin(kwave[0]) *dxinv[0]),
229 Complex((T(1)-std::cos(kwave[1]))*dxinv[1],
230 std::sin(kwave[1]) *dxinv[1]),
231 Complex((T(1)-std::cos(kwave[2]))*dxinv[2],
232 std::sin(kwave[2]) *dxinv[2]))};
235 Complex
const ryk = ry(i,j,k);,
236 Complex
const rzk = rz(i,j,k);)
238 Complex rhsdotdp = scaling * (
AMREX_D_TERM(rxk*delkp[0],
242 if (std::abs(delsqk) > tol) {
243 parr(i,j,k)= rhsdotdp / delsqk;
248 T diffop = alpha - eta*delsqk;
250 rx(i,j,k) = (scaling*rxk - parr(i,j,k)*delkm[0])/diffop;
251 ry(i,j,k) = (scaling*ryk - parr(i,j,k)*delkm[1])/diffop;
252#if (BL_SPACEDIM == 3)
253 rz(i,j,k) = (scaling*rzk - parr(i,j,k)*delkm[2])/diffop;
258#if (BL_SPACEDIM == 3)
266 r2c.backward(phat, *pmf);
267 r2c.backward(rxhat, *Umf);
268 r2c.backward(ryhat, *Vmf);
269#if (BL_SPACEDIM == 3)
270 r2c.backward(rzhat, *Wmf);
void solve(MF &U, MF &V, MF &W, MF &p, MF const &rhsx, MF const &rhsy, MF const &rhsz, typename MF::value_type alpha, typename MF::value_type eta)
Solve the generalized Stokes problem in spectral space.
Definition AMReX_FFT_Stokes.H:105