1#ifndef AMREX_MLNODELAP_2D_K_H_
2#define AMREX_MLNODELAP_2D_K_H_
3#include <AMReX_Config.H>
9 Array4<int const>
const& msk,
int fine_flag)
noexcept
13 if (msk(i-1,j-1,0) == fine_flag &&
14 msk(i ,j-1,0) == fine_flag &&
15 msk(i-1,j ,0) == fine_flag &&
16 msk(i ,j ,0) == fine_flag)
18 phi(i,j,0) =
Real(0.0);
28 Array4<Real const>
const&
fine)
noexcept
32 crse(i,j,k) = a*b/(a+b);
41 crse(i,j,k) = a*b/(a+b);
46 Array4<Real const>
const&
fine,
int idir)
noexcept
72 Real facx =
Real(1./6.)*dxinv[0]*dxinv[0];
73 Real facy =
Real(1./6.)*dxinv[1]*dxinv[1];
74 Real y =
x(i-1,j-1,k)*(facx*sx(i-1,j-1,k)+facy*sy(i-1,j-1,k))
75 +
x(i+1,j-1,k)*(facx*sx(i ,j-1,k)+facy*sy(i ,j-1,k))
76 +
x(i-1,j+1,k)*(facx*sx(i-1,j ,k)+facy*sy(i-1,j ,k))
77 +
x(i+1,j+1,k)*(facx*sx(i ,j ,k)+facy*sy(i ,j ,k))
78 +
x(i-1,j,k)*(
Real(2.0)*facx*(sx(i-1,j-1,k)+sx(i-1,j,k))
79 - facy*(sy(i-1,j-1,k)+sy(i-1,j,k)))
80 +
x(i+1,j,k)*(
Real(2.0)*facx*(sx(i ,j-1,k)+sx(i ,j,k))
81 - facy*(sy(i ,j-1,k)+sy(i ,j,k)))
82 +
x(i,j-1,k)*( -facx*(sx(i-1,j-1,k)+sx(i,j-1,k))
83 +
Real(2.0)*facy*(sy(i-1,j-1,k)+sy(i,j-1,k)))
84 +
x(i,j+1,k)*( -facx*(sx(i-1,j ,k)+sx(i,j ,k))
85 +
Real(2.0)*facy*(sy(i-1,j ,k)+sy(i,j ,k)))
86 +
x(i,j,k)*(-
Real(2.0))*(facx*(sx(i-1,j-1,k)+sx(i,j-1,k)+sx(i-1,j,k)+sx(i,j,k))
87 +facy*(sy(i-1,j-1,k)+sy(i,j-1,k)+sy(i-1,j,k)+sy(i,j,k)));
89 Real fp = facy /
static_cast<Real>(2*i+1);
90 Real fm = facy /
static_cast<Real>(2*i-1);
91 y += (fm*sy(i-1,j ,k)-fp*sy(i,j ,k))*(
x(i,j+1,k)-
x(i,j,k))
92 + (fm*sy(i-1,j-1,k)-fp*sy(i,j-1,k))*(
x(i,j-1,k)-
x(i,j,k));
106 Real facx =
Real(1.0/6.0)*dxinv[0]*dxinv[0];
107 Real facy =
Real(1.0/6.0)*dxinv[1]*dxinv[1];
108 Real fxy = facx + facy;
111 Real y =
x(i-1,j-1,k)*fxy*sig(i-1,j-1,k)
112 +
x(i+1,j-1,k)*fxy*sig(i ,j-1,k)
113 +
x(i-1,j+1,k)*fxy*sig(i-1,j ,k)
114 +
x(i+1,j+1,k)*fxy*sig(i ,j ,k)
115 +
x(i-1,j,k)*f2xmy*(sig(i-1,j-1,k)+sig(i-1,j,k))
116 +
x(i+1,j,k)*f2xmy*(sig(i ,j-1,k)+sig(i ,j,k))
117 +
x(i,j-1,k)*fmx2y*(sig(i-1,j-1,k)+sig(i,j-1,k))
118 +
x(i,j+1,k)*fmx2y*(sig(i-1,j ,k)+sig(i,j ,k))
119 +
x(i,j,k)*(-
Real(2.0))*fxy*(sig(i-1,j-1,k)+sig(i,j-1,k)
120 +sig(i-1,j,k)+sig(i,j,k));
122 Real fp = facy /
static_cast<Real>(2*i+1);
123 Real fm = facy /
static_cast<Real>(2*i-1);
124 y += (fm*sig(i-1,j ,k)-fp*sig(i,j ,k))*(
x(i,j+1,k)-
x(i,j,k))
125 + (fm*sig(i-1,j-1,k)-fp*sig(i,j-1,k))*(
x(i,j-1,k)-
x(i,j,k));
139 Real facx =
Real(1.0/6.0)*dxinv[0]*dxinv[0];
140 Real facy =
Real(1.0/6.0)*dxinv[1]*dxinv[1];
141 Real fxy = facx + facy;
144 Real y = (
x(i-1,j-1,k)*fxy
148 +
x(i-1,j,k)*f2xmy*
Real(2.)
149 +
x(i+1,j,k)*f2xmy*
Real(2.)
150 +
x(i,j-1,k)*fmx2y*
Real(2.)
151 +
x(i,j+1,k)*fmx2y*
Real(2.)
154 Real fp = facy /
static_cast<Real>(2*i+1);
155 Real fm = facy /
static_cast<Real>(2*i-1);
156 y += ((fm-fp)*(
x(i,j+1,k)-
x(i,j,k))
157 + (fm-fp)*(
x(i,j-1,k)-
x(i,j,k)));
168 Real facx =
Real(1.0/6.0)*dxinv[0]*dxinv[0];
169 Real facy =
Real(1.0/6.0)*dxinv[1]*dxinv[1];
172 x(i,j,k) /= (-
Real(2.0))*(facx*(sx(i-1,j-1,k)+sx(i,j-1,k)+sx(i-1,j,k)+sx(i,j,k))
173 +facy*(sy(i-1,j-1,k)+sy(i,j-1,k)+sy(i-1,j,k)+sy(i,j,k)));
179 Array4<int const>
const& msk, GpuArray<Real,AMREX_SPACEDIM>
const& dxinv)
noexcept
181 Real facx =
Real(1.0/6.0)*dxinv[0]*dxinv[0];
182 Real facy =
Real(1.0/6.0)*dxinv[1]*dxinv[1];
183 Real fxy = facx + facy;
186 x(i,j,k) /= (-
Real(2.0))*fxy*(sig(i-1,j-1,k)+sig(i,j-1,k)+sig(i-1,j,k)+sig(i,j,k));
196 Real facx = -
Real(2.0/6.0)*dxinv[0]*dxinv[0];
197 Real facy = -
Real(2.0/6.0)*dxinv[1]*dxinv[1];
200 sol(i,j,k) =
Real(0.0);
202 sol(i,j,k) +=
Real(2.0/3.0) * (rhs(i,j,k) - Ax)
203 / (facx*(sx(i-1,j-1,k)+sx(i,j-1,k)+sx(i-1,j,k)+sx(i,j,k))
204 + facy*(sy(i-1,j-1,k)+sy(i,j-1,k)+sy(i-1,j,k)+sy(i,j,k)));
214 Real facx = -
Real(2.0/6.0)*dxinv[0]*dxinv[0];
215 Real facy = -
Real(2.0/6.0)*dxinv[1]*dxinv[1];
220 sol(i,j,k) =
Real(0.0);
222 sol(i,j,k) +=
Real(2.0/3.0) * (rhs(i,j,k) - Ax(i,j,k))
223 / (facx*(sx(i-1,j-1,k)+sx(i,j-1,k)+sx(i-1,j,k)+sx(i,j,k))
224 + facy*(sy(i-1,j-1,k)+sy(i,j-1,k)+sy(i-1,j,k)+sy(i,j,k)));
231 Array4<Real const>
const& rhs, Array4<Real const>
const& sig,
232 Array4<int const>
const& msk, GpuArray<Real,AMREX_SPACEDIM>
const& dxinv)
noexcept
234 Real fac = -
Real(2.0/6.0)*(dxinv[0]*dxinv[0] + dxinv[1]*dxinv[1]);
237 sol(i,j,k) =
Real(0.0);
239 sol(i,j,k) +=
Real(2.0/3.0) * (rhs(i,j,k) - Ax)
240 / (fac*(sig(i-1,j-1,k)+sig(i,j-1,k)+sig(i-1,j,k)+sig(i,j,k)));
246 Array4<Real const>
const& rhs,
Real sig,
247 Array4<int const>
const& msk, GpuArray<Real,AMREX_SPACEDIM>
const& dxinv)
noexcept
249 Real fac = -
Real(2.0/6.0)*(dxinv[0]*dxinv[0] + dxinv[1]*dxinv[1]);
252 sol(i,j,k) =
Real(0.0);
254 sol(i,j,k) +=
Real(2.0/3.0) * (rhs(i,j,k) - Ax)
255 / (fac*
Real(4.)*sig);
261 Array4<Real const>
const& rhs, Array4<Real const>
const& sig,
262 Array4<int const>
const& msk, GpuArray<Real,AMREX_SPACEDIM>
const& dxinv)
noexcept
264 Real fac = -
Real(2.0/6.0)*(dxinv[0]*dxinv[0] + dxinv[1]*dxinv[1]);
269 sol(i,j,k) =
Real(0.0);
271 sol(i,j,k) +=
Real(2.0/3.0) * (rhs(i,j,k) - Ax(i,j,k))
272 / (fac*(sig(i-1,j-1,k)+sig(i,j-1,k)+sig(i-1,j,k)+sig(i,j,k)));
278void mlndlap_jacobi_c (
Box const& bx, Array4<Real>
const& sol, Array4<Real const>
const& Ax,
279 Array4<Real const>
const& rhs,
Real sig,
280 Array4<int const>
const& msk, GpuArray<Real,AMREX_SPACEDIM>
const& dxinv)
noexcept
282 Real fac = -
Real(2.0/6.0)*(dxinv[0]*dxinv[0] + dxinv[1]*dxinv[1]);
287 sol(i,j,k) =
Real(0.0);
289 sol(i,j,k) +=
Real(2.0/3.0) * (rhs(i,j,k) - Ax(i,j,k))
290 / (fac*
Real(4.)*sig);
302 Real facx =
Real(1.0/6.0)*dxinv[0]*dxinv[0];
303 Real facy =
Real(1.0/6.0)*dxinv[1]*dxinv[1];
308 sol(i,j,k) =
Real(0.0);
310 Real s0 =
Real(-2.0)*(facx*(sx(i-1,j-1,k)+sx(i,j-1,k)+sx(i-1,j,k)+sx(i,j,k))
311 +facy*(sy(i-1,j-1,k)+sy(i,j-1,k)+sy(i-1,j,k)+sy(i,j,k)));
313 Real Ax = sol(i-1,j-1,k)*(facx*sx(i-1,j-1,k)+facy*sy(i-1,j-1,k))
314 + sol(i+1,j-1,k)*(facx*sx(i ,j-1,k)+facy*sy(i ,j-1,k))
315 + sol(i-1,j+1,k)*(facx*sx(i-1,j ,k)+facy*sy(i-1,j ,k))
316 + sol(i+1,j+1,k)*(facx*sx(i ,j ,k)+facy*sy(i ,j ,k))
317 + sol(i-1,j,k)*(
Real(2.0)*facx*(sx(i-1,j-1,k)+sx(i-1,j,k))
318 - facy*(sy(i-1,j-1,k)+sy(i-1,j,k)))
319 + sol(i+1,j,k)*(
Real(2.0)*facx*(sx(i ,j-1,k)+sx(i ,j,k))
320 - facy*(sy(i ,j-1,k)+sy(i ,j,k)))
321 + sol(i,j-1,k)*( -facx*(sx(i-1,j-1,k)+sx(i,j-1,k))
322 +
Real(2.0)*facy*(sy(i-1,j-1,k)+sy(i,j-1,k)))
323 + sol(i,j+1,k)*( -facx*(sx(i-1,j ,k)+sx(i,j ,k))
324 +
Real(2.0)*facy*(sy(i-1,j ,k)+sy(i,j ,k)))
328 Real fp = facy /
static_cast<Real>(2*i+1);
329 Real fm = facy /
static_cast<Real>(2*i-1);
330 Real frzlo = fm*sy(i-1,j-1,k)-fp*sy(i,j-1,k);
331 Real frzhi = fm*sy(i-1,j ,k)-fp*sy(i,j ,k);
332 s0 += - frzhi - frzlo;
333 Ax += frzhi*(sol(i,j+1,k)-sol(i,j,k))
334 + frzlo*(sol(i,j-1,k)-sol(i,j,k));
337 sol(i,j,k) += (rhs(i,j,k) - Ax) / s0;
349 Real facx =
Real(1.0/6.0)*dxinv[0]*dxinv[0];
350 Real facy =
Real(1.0/6.0)*dxinv[1]*dxinv[1];
351 Real fxy = facx + facy;
358 sol(i,j,k) =
Real(0.0);
360 Real s0 = (-
Real(2.0))*fxy*(sig(i-1,j-1,k)+sig(i,j-1,k)+sig(i-1,j,k)+sig(i,j,k));
361 Real Ax = sol(i-1,j-1,k)*fxy*sig(i-1,j-1,k)
362 + sol(i+1,j-1,k)*fxy*sig(i ,j-1,k)
363 + sol(i-1,j+1,k)*fxy*sig(i-1,j ,k)
364 + sol(i+1,j+1,k)*fxy*sig(i ,j ,k)
365 + sol(i-1,j,k)*f2xmy*(sig(i-1,j-1,k)+sig(i-1,j,k))
366 + sol(i+1,j,k)*f2xmy*(sig(i ,j-1,k)+sig(i ,j,k))
367 + sol(i,j-1,k)*fmx2y*(sig(i-1,j-1,k)+sig(i,j-1,k))
368 + sol(i,j+1,k)*fmx2y*(sig(i-1,j ,k)+sig(i,j ,k))
372 Real fp = facy /
static_cast<Real>(2*i+1);
373 Real fm = facy /
static_cast<Real>(2*i-1);
374 Real frzlo = fm*sig(i-1,j-1,k)-fp*sig(i,j-1,k);
375 Real frzhi = fm*sig(i-1,j ,k)-fp*sig(i,j ,k);
376 s0 += - frzhi - frzlo;
377 Ax += frzhi*(sol(i,j+1,k)-sol(i,j,k))
378 + frzlo*(sol(i,j-1,k)-sol(i,j,k));
381 sol(i,j,k) += (rhs(i,j,k) - Ax) / s0;
393 Real facx =
Real(1.0/6.0)*dxinv[0]*dxinv[0];
394 Real facy =
Real(1.0/6.0)*dxinv[1]*dxinv[1];
395 Real fxy = facx + facy;
402 sol(i,j,k) =
Real(0.0);
405 Real Ax = sol(i-1,j-1,k)*fxy
409 + sol(i-1,j,k)*f2xmy*
Real(2.)
410 + sol(i+1,j,k)*f2xmy*
Real(2.)
411 + sol(i,j-1,k)*fmx2y*
Real(2.)
412 + sol(i,j+1,k)*fmx2y*
Real(2.)
416 Real fp = facy /
static_cast<Real>(2*i+1);
417 Real fm = facy /
static_cast<Real>(2*i-1);
420 s0 += - frzhi - frzlo;
421 Ax += frzhi*(sol(i,j+1,k)-sol(i,j,k))
422 + frzlo*(sol(i,j-1,k)-sol(i,j,k));
425 sol(i,j,k) += (rhs(i,j,k) - Ax*sig) / (s0*sig);
436 u_ls(0) = r_ls(0) / bet;
438 for (
int i = 1; i <= ilen - 1; i++) {
439 gam(i) = c_ls(i-1) / bet;
440 bet = b_ls(i) - a_ls(i)*gam(i);
442 u_ls(i) = (r_ls(i)-a_ls(i)*u_ls(i-1)) / bet;
444 for (
int i = ilen-2; i >= 0; i--) {
445 u_ls(i) = u_ls(i) - gam(i+1)*u_ls(i+1);
456 Real facx =
Real(1.0/6.0)*dxinv[0]*dxinv[0];
457 Real facy =
Real(1.0/6.0)*dxinv[1]*dxinv[1];
458 Real fxy = facx + facy;
463 amrex::Abort(
"mlndlap_gauss_seidel_with_line_solve_aa is not implemented in r-z 2D ");
472 if (dxinv[0] <= dxinv[1]) {
474 ilen = hi.y - lo.y + 1;
476 if (dxinv[1] <= dxinv[0]) {
478 ilen = hi.x - lo.x + 1;
482 amrex::Abort(
"mlndlap_gauss_seidel_with_line_solve_aa is hard-wired to be no longer than 32");
488 for (
int i = lo.x; i <= hi.x; ++i)
490 for (
int j = lo.y; j <= hi.y; ++j)
501 Real s0 = (-
Real(2.0))*fxy*(sig(i-1,j-1,k)+sig(i,j-1,k)+sig(i-1,j,k)+sig(i,j,k));
503 Real Ax = sol(i-1,j-1,k)*fxy*sig(i-1,j-1,k)
504 + sol(i+1,j-1,k)*fxy*sig(i ,j-1,k)
505 + sol(i-1,j+1,k)*fxy*sig(i-1,j ,k)
506 + sol(i+1,j+1,k)*fxy*sig(i ,j ,k)
507 + sol(i-1,j,k)*f2xmy*(sig(i-1,j-1,k)+sig(i-1,j,k))
508 + sol(i+1,j,k)*f2xmy*(sig(i ,j-1,k)+sig(i ,j,k));
510 a_ls(j-lo.y) = fmx2y*(sig(i-1,j-1,k)+sig(i,j-1,k));
512 c_ls(j-lo.y) = fmx2y*(sig(i-1,j ,k)+sig(i,j ,k));
514 r_ls(j-lo.y) = rhs(i,j,k) - Ax;
519 for (
int j = lo.y; j <= hi.y; ++j)
521 sol(i,j,k) = u_ls(j-lo.y);
524 }
else if (
idir == 0) {
525 for (
int j = lo.y ;j <= hi.y; ++j)
527 for (
int i = lo.x; i <= hi.x; ++i)
538 Real s0 = (-
Real(2.0))*fxy*(sig(i-1,j-1,k)+sig(i,j-1,k)+sig(i-1,j,k)+sig(i,j,k));
540 Real Ax = sol(i-1,j-1,k)*fxy*sig(i-1,j-1,k)
541 + sol(i+1,j-1,k)*fxy*sig(i ,j-1,k)
542 + sol(i-1,j+1,k)*fxy*sig(i-1,j ,k)
543 + sol(i+1,j+1,k)*fxy*sig(i ,j ,k)
544 + sol(i,j-1,k)*fmx2y*(sig(i-1,j-1,k)+sig(i,j-1,k))
545 + sol(i,j+1,k)*fmx2y*(sig(i-1,j ,k)+sig(i,j ,k));
547 a_ls(i-lo.x) = f2xmy*(sig(i-1,j-1,k)+sig(i-1,j,k));
549 c_ls(i-lo.x) = f2xmy*(sig(i ,j-1,k)+sig(i ,j,k));
551 r_ls(i-lo.x) = rhs(i,j,k) - Ax;
557 for (
int i = lo.x; i <= hi.x; ++i)
559 sol(i,j,k) = u_ls(i-lo.x);
563 amrex::Abort(
"mlndlap_gauss_seidel_with_line_solve_aa is wrong direction.");
574 int i,
int j,
int ic,
int jc)
noexcept
576 Real w1 = sig(i-1,j-1,0) + sig(i-1,j,0);
577 Real w2 = sig(i ,j-1,0) + sig(i ,j,0);
578 return (w1*
crse(ic,jc,0)+w2*
crse(ic+1,jc,0))/(w1+w2);
583 int i,
int j,
int ic,
int jc)
noexcept
585 Real w1 = sig(i-1,j-1,0) + sig(i,j-1,0);
586 Real w2 = sig(i-1,j ,0) + sig(i,j ,0);
587 return (w1*
crse(ic,jc,0)+w2*
crse(ic,jc+1,0))/(w1+w2);
592 int i,
int j,
int ic,
int jc)
noexcept
594 Real w1 = sig(i-1,j-1,0) + sig(i-1,j,0);
595 Real w2 = sig(i ,j-1,0) + sig(i ,j,0);
596 Real w3 = sig(i-1,j-1,0) + sig(i,j-1,0);
597 Real w4 = sig(i-1,j ,0) + sig(i,j ,0);
606 Array4<Real const>
const&
crse,
607 Array4<int const>
const& msk)
noexcept
612 bool i_is_odd = (ic*2 != i);
613 bool j_is_odd = (jc*2 != j);
614 if (i_is_odd && j_is_odd) {
620 }
else if (i_is_odd) {
623 }
else if (j_is_odd) {
635 Array4<Real const>
const&
crse, Array4<Real const>
const& sig,
636 Array4<int const>
const& msk)
noexcept
641 bool i_is_odd = (ic*2 != i);
642 bool j_is_odd = (jc*2 != j);
643 if (i_is_odd && j_is_odd) {
646 }
else if (i_is_odd) {
649 }
else if (j_is_odd) {
661 Array4<Real const>
const&
crse, Array4<Real const>
const& sig,
662 Array4<int const>
const& msk,
int idir)
noexcept
668 bool i_is_odd = (ic*2 != i);
677 }
else if (
idir == 0 ) {
681 bool j_is_odd = (ic*2 != i);
696 int i,
int j,
int ic,
int jc)
noexcept
698 Real w1 = sigx(i-1,j-1,0) + sigx(i-1,j,0);
699 Real w2 = sigx(i ,j-1,0) + sigx(i ,j,0);
700 Real w3 = sigy(i-1,j-1,0) + sigy(i,j-1,0);
701 Real w4 = sigy(i-1,j ,0) + sigy(i,j ,0);
717 bool i_is_odd = (ic*2 != i);
718 bool j_is_odd = (jc*2 != j);
719 if (i_is_odd && j_is_odd) {
722 }
else if (i_is_odd) {
725 }
else if (j_is_odd) {
742 Box const& nodal_domain,
754 rhs(i,j,k) =
Real(0.0);
767 zero_ilo =
Real(0.0);
772 zero_ihi =
Real(0.0);
777 zero_jlo =
Real(0.0);
782 zero_jhi =
Real(0.0);
785 rhs(i,j,k) = facx*(-vel(i-1,j-1,k,0)*zero_jlo + vel(i,j-1,k,0)*zero_jlo
786 -vel(i-1,j ,k,0)*zero_jhi + vel(i,j ,k,0)*zero_jhi)
787 + facy*(-vel(i-1,j-1,k,1)*zero_ilo - vel(i,j-1,k,1)*zero_ihi
788 +vel(i-1,j ,k,1)*zero_ilo + vel(i,j ,k,1)*zero_ihi);
791 Real fm = facy /
static_cast<Real>(6*i-3);
792 Real fp = facy /
static_cast<Real>(6*i+3);
793 rhs(i,j,k) += fm*(vel(i-1,j,k,1)-vel(i-1,j-1,k,1))
794 - fp*(vel(i ,j,k,1)-vel(i ,j-1,k,1));
801 Array4<int const>
const& msk)
noexcept
807 r =
Real(0.25) * (rhcc(i-1,j-1,k)+rhcc(i,j-1,k)+rhcc(i-1,j,k)+rhcc(i,j,k));
819 u(i,j,k,0) -= sig(i,j,k)*facx*(-p(i,j,k)+p(i+1,j,k)-p(i,j+1,k)+p(i+1,j+1,k));
820 u(i,j,k,1) -= sig(i,j,k)*facy*(-p(i,j,k)-p(i+1,j,k)+p(i,j+1,k)+p(i+1,j+1,k));
822 Real frz = sig(i,j,k)*facy /
static_cast<Real>(6*i+3);
823 u(i,j,k,1) += frz*(p(i,j,k)-p(i+1,j,k)-p(i,j+1,k)+p(i+1,j+1,k));
834 u(i,j,k,0) -= sig*facx*(-p(i,j,k)+p(i+1,j,k)-p(i,j+1,k)+p(i+1,j+1,k));
835 u(i,j,k,1) -= sig*facy*(-p(i,j,k)-p(i+1,j,k)+p(i,j+1,k)+p(i+1,j+1,k));
837 Real frz = sig*facy /
static_cast<Real>(6*i+3);
838 u(i,j,k,1) += frz*(p(i,j,k)-p(i+1,j,k)-p(i,j+1,k)+p(i+1,j+1,k));
846 Real fm = is_rz ? facy /
static_cast<Real>(6*ii-3) :
Real(0.0);
847 Real fp = is_rz ? facy /
static_cast<Real>(6*ii+3) :
Real(0.0);
850 if (velbx.contains(ii-1,jj-1,0)) {
851 Df += -facx*vel(ii-1,jj-1,0,0) - (facy+fm)*vel(ii-1,jj-1,0,1);
853 if (velbx.contains(ii,jj-1,0)) {
854 Df += facx*vel(ii,jj-1,0,0) - (facy-fp)*vel(ii,jj-1,0,1);
856 if (velbx.contains(ii-1,jj,0)) {
857 Df += -facx*vel(ii-1,jj,0,0) + (facy+fm)*vel(ii-1,jj,0,1);
859 if (velbx.contains(ii,jj,0)) {
860 Df += facx*vel(ii,jj,0,0) + (facy-fp)*vel(ii,jj,0,1);
875 const Real facx =
Real(0.5)*dxinv[0];
876 const Real facy =
Real(0.5)*dxinv[1];
880 const int ilo =
amrex::max(ii-rr+1, fvbx.smallEnd(0));
881 const int ihi =
amrex::min(ii+rr-1, fvbx.bigEnd (0));
882 const int jlo =
amrex::max(jj-rr+1, fvbx.smallEnd(1));
883 const int jhi =
amrex::min(jj+rr-1, fvbx.bigEnd (1));
885 for (
int joff = jlo; joff <= jhi; ++joff) {
886 for (
int ioff = ilo; ioff <= ihi; ++ioff) {
888 (rr-std::abs(jj-joff)));
889 if (fvbx.strictly_contains(ioff,joff,0)) {
890 Df +=
scale * frhs(ioff,joff,0);
896 rhs(i,j,0) = Df * (
Real(1.0)/
static_cast<Real>(rr*rr*rr*rr));
898 rhs(i,j,0) =
Real(0.0);
905 Array4<Real>
const& rhs, Array4<Real const>
const& cc,
906 Array4<int const>
const& msk)
noexcept
913 const int ilo =
amrex::max(ii-rr , ccbx.smallEnd(0));
914 const int ihi =
amrex::min(ii+rr-1, ccbx.bigEnd (0));
915 const int jlo =
amrex::max(jj-rr , ccbx.smallEnd(1));
916 const int jhi =
amrex::min(jj+rr-1, ccbx.bigEnd (1));
918 for (
int joff = jlo; joff <= jhi; ++joff) {
919 for (
int ioff = ilo; ioff <= ihi; ++ioff) {
921 * (
static_cast<Real>(rr)-std::abs(
static_cast<Real>(joff-jj)+
Real(0.5)));
922 tmp += cc(ioff,joff,0) *
scale;
925 rhs(i,j,0) += tmp * (
Real(1.0)/
Real(rr*rr*rr*rr));
962 Box const& ccdom_p,
Box const& veldom,
Box const& nddom,
966 using namespace nodelap_detail;
968 if (!dmsk(i,j,0) && ndmsk(i,j,0) == crse_fine_node) {
971 Real tmp = fc(i,j,0);
973 Real fm = is_rz ? facy /
static_cast<Real>(6*i-3) :
Real(0.0);
974 Real fp = is_rz ? facy /
static_cast<Real>(6*i+3) :
Real(0.0);
979 if (ccmsk(i-1,j-1,0) == crse_cell && veldom.contains(i-1,j-1,0)) {
980 tmp += -facx*vel(i-1,j-1,0,0) - (facy+fm)*vel(i-1,j-1,0,1);
981 if (rhcc && ccdom_p.contains(i-1,j-1,0)) {
982 tmp +=
Real(0.25) * rhcc(i-1,j-1,0);
986 if (ccmsk(i,j-1,0) == crse_cell && veldom.contains(i,j-1,0)) {
987 tmp += facx*vel(i,j-1,0,0) - (facy-fp)*vel(i,j-1,0,1);
988 if (rhcc && ccdom_p.contains(i,j-1,0)) {
989 tmp +=
Real(0.25) * rhcc(i,j-1,0);
993 if (ccmsk(i-1,j,0) == crse_cell && veldom.contains(i-1,j,0)) {
994 tmp += -facx*vel(i-1,j,0,0) + (facy+fm)*vel(i-1,j,0,1);
995 if (rhcc && ccdom_p.contains(i-1,j,0)) {
996 tmp +=
Real(0.25) * rhcc(i-1,j,0);
1000 if (ccmsk(i,j,0) == crse_cell && veldom.contains(i,j,0)) {
1001 tmp += facx*vel(i,j,0,0) + (facy-fp)*vel(i,j,0,1);
1002 if (rhcc && ccdom_p.contains(i,j,0)) {
1003 tmp +=
Real(0.25) * rhcc(i,j,0);
1017 Array4<Real const>
const& rhs, Array4<int const>
const& msk,
1018 Box const& nddom, GpuArray<LinOpBCType,AMREX_SPACEDIM>
const& bclo,
1019 GpuArray<LinOpBCType,AMREX_SPACEDIM>
const& bchi,
1020 bool neumann_doubling)
noexcept
1022 if ( msk(i-1,j-1,k ) == 0 ||
1023 msk(i ,j-1,k ) == 0 ||
1024 msk(i-1,j ,k ) == 0 ||
1025 msk(i ,j ,k ) == 0 )
1028 if (neumann_doubling) {
1045 resid(i,j,k) = (rhs(i,j,k) - resid(i,j,k)) * fac;
1047 resid(i,j,k) =
Real(0.);
1055 template <
typename P,
typename S>
1063 fp = facy /
static_cast<Real>(2*i+1);
1064 fm = facy /
static_cast<Real>(2*i-1);
1066 if (pred(i-1,j-1)) {
1067 Ax += sig(i-1,j-1,0)*(facx*(
Real(2.)*(phi(i-1,j ,0)-phi(i ,j ,0))
1068 + (phi(i-1,j-1,0)-phi(i ,j-1,0)))
1069 + facy*(
Real(2.)*(phi(i ,j-1,0)-phi(i ,j ,0))
1070 + (phi(i-1,j-1,0)-phi(i-1,j ,0)))
1071 + fm * (phi(i ,j-1,0)-phi(i ,j ,0)));
1074 Ax += sig(i,j-1,0)*(facx*(
Real(2.)*(phi(i+1,j ,0)-phi(i ,j ,0))
1075 + (phi(i+1,j-1,0)-phi(i ,j-1,0)))
1076 + facy*(
Real(2.)*(phi(i ,j-1,0)-phi(i ,j ,0))
1077 + (phi(i+1,j-1,0)-phi(i+1,j ,0)))
1078 - fp * (phi(i ,j-1,0)-phi(i ,j ,0)));
1081 Ax += sig(i-1,j,0)*(facx*(
Real(2.)*(phi(i-1,j ,0)-phi(i ,j ,0))
1082 + (phi(i-1,j+1,0)-phi(i ,j+1,0)))
1083 + facy*(
Real(2.)*(phi(i ,j+1,0)-phi(i ,j ,0))
1084 + (phi(i-1,j+1,0)-phi(i-1,j ,0)))
1085 + fm * (phi(i ,j+1,0)-phi(i ,j ,0)));
1088 Ax += sig(i,j,0)*(facx*(
Real(2.)*(phi(i+1,j ,0)-phi(i ,j ,0))
1089 + (phi(i+1,j+1,0)-phi(i ,j+1,0)))
1090 + facy*(
Real(2.)*(phi(i ,j+1,0)-phi(i ,j ,0))
1091 + (phi(i+1,j+1,0)-phi(i+1,j ,0)))
1092 - fp * (phi(i ,j+1,0)-phi(i ,j ,0)));
1097 template <
int rr,
typename S>
1106 const int ii = rr*i;
1107 const int jj = rr*j;
1109 Real facx =
Real(1./6.)*dxinv[0]*dxinv[0];
1110 Real facy =
Real(1./6.)*dxinv[1]*dxinv[1];
1112 auto is_fine = [&ccbx] (
int ix,
int iy) ->
bool {
1113 return ccbx.contains(ix,iy,0);
1118 const int ilo =
amrex::max(ii-rr+1, ndbx.smallEnd(0));
1119 const int ihi =
amrex::min(ii+rr-1, ndbx.bigEnd (0));
1120 const int jlo =
amrex::max(jj-rr+1, ndbx.smallEnd(1));
1121 const int jhi =
amrex::min(jj+rr-1, ndbx.bigEnd (1));
1123 for (
int joff = jlo; joff <= jhi; ++joff) {
1124 for (
int ioff = ilo; ioff <= ihi; ++ioff) {
1126 (rr-std::abs(jj-joff)));
1127 if (ndbx.strictly_contains(ioff,joff,0)) {
1128 Df +=
scale * (rhs(ioff,joff,0)-res(ioff,joff,0));
1131 (is_fine, sig, ioff, joff, facx, facy, phi, is_rz);
1135 f(i,j,0) = Df * (
Real(1.0)/
static_cast<Real>(rr*rr*rr*rr));
1137 f(i,j,0) =
Real(0.0);
1150 mlndlap_Ax_fine_contrib_doit<rr>
1151 ([&sig] (
int ix,
int iy,
int) ->
Real const& {
return sig(ix,iy,0); },
1152 i,j,ndbx,ccbx,f,res,rhs,phi,msk,is_rz,dxinv);
1164 mlndlap_Ax_fine_contrib_doit<rr>
1165 ([=] (
int,
int,
int) ->
Real {
return sig; },
1166 i,j,ndbx,ccbx,f,res,rhs,phi,msk,is_rz,dxinv);
1176 Box const& ccdom_p,
Box const& nddom,
1180 bool neumann_doubling)
noexcept
1182 using namespace nodelap_detail;
1184 if (!dmsk(i,j,0) && ndmsk(i,j,0) == crse_fine_node) {
1185 Real facx =
Real(1./6.)*dxinv[0]*dxinv[0];
1186 Real facy =
Real(1./6.)*dxinv[1]*dxinv[1];
1190 return ccdom_p.contains(ix,iy,0)
1191 && (ccmsk(ix,iy,0) == crse_cell);
1193 [&sig] (
int ix,
int iy, int) ->
Real const&
1195 return sig(ix,iy,0);
1197 i, j, facx, facy, phi, is_rz);
1200 res(i,j,0) = rhs(i,j,0) - Ax*ns;
1211 Box const& ccdom_p,
Box const& nddom,
1215 bool neumann_doubling)
noexcept
1217 using namespace nodelap_detail;
1219 if (!dmsk(i,j,0) && ndmsk(i,j,0) == crse_fine_node) {
1220 Real facx =
Real(1./6.)*dxinv[0]*dxinv[0];
1221 Real facy =
Real(1./6.)*dxinv[1]*dxinv[1];
1225 return ccdom_p.contains(ix,iy,0)
1226 && (ccmsk(ix,iy,0) == crse_cell);
1228 [=] (int, int, int) ->
Real
1232 i, j, facx, facy, phi, is_rz);
1235 res(i,j,0) = rhs(i,j,0) - Ax*ns;
1245 Array4<Real const>
const& sigma,
1246 GpuArray<Real,AMREX_SPACEDIM>
const& dxinv)
noexcept
1248 Real facx =
Real(1.0/6.0)*dxinv[0]*dxinv[0];
1249 Real facy =
Real(1.0/6.0)*dxinv[1]*dxinv[1];
1250 Real fxy = facx + facy;
1251 Real f2xmy =
Real(2.0)*facx - facy;
1252 Real fmx2y =
Real(2.0)*facy - facx;
1256 sten(i,j,k,1) = f2xmy*(sigma(i,j-1,k)+sigma(i,j,k));
1257 sten(i,j,k,2) = fmx2y*(sigma(i-1,j,k)+sigma(i,j,k));
1258 sten(i,j,k,3) = fxy*sigma(i,j,k);
1265 using namespace nodelap_detail;
1267 sten(i,j,k,0) = -(sten(i-1,j ,k,1) + sten(i ,j ,k,1)
1268 + sten(i ,j-1,k,2) + sten(i ,j ,k,2)
1269 + sten(i-1,j-1,k,3) + sten(i ,j-1,k,3)
1270 + sten(i-1,j ,k,3) + sten(i ,j ,k,3));
1271 sten(i,j,k,4) =
Real(1.0) / (std::abs(sten(i-1,j ,k,1)) + std::abs(sten(i,j ,k,1))
1272 + std::abs(sten(i ,j-1,k,2)) + std::abs(sten(i,j ,k,2))
1273 + std::abs(sten(i-1,j-1,k,3)) + std::abs(sten(i,j-1,k,3))
1274 + std::abs(sten(i-1,j ,k,3)) + std::abs(sten(i,j ,k,3)) + eps);
1279 Array4<Real const>
const& fsten)
noexcept
1281 using namespace nodelap_detail;
1283 constexpr int k = 0;
1286 auto interp_from_mm_to = [&fsten] (
int i_,
int j_) ->
Real {
1287 Real wxm = std::abs(fsten(i_-1,j_ ,0,1))/(std::abs(fsten(i_-1,j_-1,0,3))+std::abs(fsten(i_-1,j_ ,0,3))+eps);
1288 Real wym = std::abs(fsten(i_ ,j_-1,0,2))/(std::abs(fsten(i_-1,j_-1,0,3))+std::abs(fsten(i_ ,j_-1,0,3))+eps);
1289 Real wmm = std::abs(fsten(i_-1,j_-1,0,3)) * (
Real(1.) + wxm + wym);
1290 return wmm * fsten(i_,j_,0,4);
1294 auto interp_from_mp_to = [&fsten] (
int i_,
int j_) ->
Real {
1295 Real wxm = std::abs(fsten(i_-1,j_ ,0,1))/(std::abs(fsten(i_-1,j_-1,0,3))+std::abs(fsten(i_-1,j_ ,0,3))+eps);
1296 Real wyp = std::abs(fsten(i_ ,j_ ,0,2))/(std::abs(fsten(i_-1,j_ ,0,3))+std::abs(fsten(i_ ,j_ ,0,3))+eps);
1297 Real wmp = std::abs(fsten(i_-1,j_ ,0,3)) *(
Real(1.) + wxm + wyp);
1298 return wmp * fsten(i_,j_,0,4);
1301 auto interp_from_pm_to = [&fsten] (
int i_,
int j_) ->
Real {
1302 Real wxp = std::abs(fsten(i_ ,j_ ,0,1))/(std::abs(fsten(i_ ,j_-1,0,3))+std::abs(fsten(i_ ,j_ ,0,3))+eps);
1303 Real wym = std::abs(fsten(i_ ,j_-1,0,2))/(std::abs(fsten(i_-1,j_-1,0,3))+std::abs(fsten(i_ ,j_-1,0,3))+eps);
1304 Real wpm = std::abs(fsten(i_ ,j_-1,0,3)) * (
Real(1.) + wxp + wym);
1305 return wpm * fsten(i_,j_,0,4);
1308 auto interp_from_pp_to = [&fsten] (
int i_,
int j_) ->
Real {
1309 Real wxp = std::abs(fsten(i_ ,j_ ,0,1))/(std::abs(fsten(i_ ,j_-1,0,3))+std::abs(fsten(i_ ,j_ ,0,3))+eps);
1310 Real wyp = std::abs(fsten(i_ ,j_ ,0,2))/(std::abs(fsten(i_-1,j_ ,0,3))+std::abs(fsten(i_ ,j_ ,0,3))+eps);
1311 Real wpp = std::abs(fsten(i_ ,j_ ,0,3)) * (
Real(1.) + wxp + wyp);
1312 return wpp * fsten(i_,j_,0,4);
1315 auto interp_from_m0_to = [&fsten] (
int i_,
int j_) ->
Real {
1316 return std::abs(fsten(i_-1,j_,0,1))/(std::abs(fsten(i_-1,j_,0,1))+std::abs(fsten(i_,j_,0,1))+eps);
1319 auto interp_from_p0_to = [&fsten] (
int i_,
int j_) ->
Real {
1320 return std::abs(fsten(i_,j_,0,1))/(std::abs(fsten(i_-1,j_,0,1))+std::abs(fsten(i_,j_,0,1))+eps);
1323 auto interp_from_0m_to = [&fsten] (
int i_,
int j_) ->
Real {
1324 return std::abs(fsten(i_,j_-1,0,2))/(std::abs(fsten(i_,j_-1,0,2))+std::abs(fsten(i_,j_,0,2))+eps);
1327 auto interp_from_0p_to = [&fsten] (
int i_,
int j_) ->
Real {
1328 return std::abs(fsten(i_,j_,0,2))/(std::abs(fsten(i_,j_-1,0,2))+std::abs(fsten(i_,j_,0,2))+eps);
1332 auto Amm = [&fsten] (
int i_,
int j_) ->
Real {
1333 return fsten(i_-1,j_-1,0,3);
1337 auto A0m = [&fsten] (
int i_,
int j_) ->
Real {
1338 return fsten(i_,j_-1,0,2);
1341 auto Apm = [&fsten] (
int i_,
int j_) ->
Real {
1342 return fsten(i_,j_-1,0,3);
1345 auto Am0 = [&fsten] (
int i_,
int j_) ->
Real {
1346 return fsten(i_-1,j_,0,1);
1349 auto A00 = [&fsten] (
int i_,
int j_) ->
Real {
1350 return fsten(i_,j_,0,0);
1353 auto Ap0 = [&fsten] (
int i_,
int j_) ->
Real {
1354 return fsten(i_,j_,0,1);
1357 auto Amp = [&fsten] (
int i_,
int j_) ->
Real {
1358 return fsten(i_-1,j_,0,3);
1361 auto A0p = [&fsten] (
int i_,
int j_) ->
Real {
1362 return fsten(i_,j_,0,2);
1365 auto App = [&fsten] (
int i_,
int j_) ->
Real {
1366 return fsten(i_,j_,0,3);
1370 auto restrict_from_mm_to = [&fsten] (
int ii_,
int jj_) ->
Real {
1371 Real wxp = std::abs(fsten(ii_-1,jj_-1,0,1))/(std::abs(fsten(ii_-1,jj_-2,0,3))+std::abs(fsten(ii_-1,jj_-1,0,3))+eps);
1372 Real wyp = std::abs(fsten(ii_-1,jj_-1,0,2))/(std::abs(fsten(ii_-2,jj_-1,0,3))+std::abs(fsten(ii_-1,jj_-1,0,3))+eps);
1373 Real wpp = std::abs(fsten(ii_-1,jj_-1,0,3))*(
Real(1.)+wxp+wyp);
1374 return wpp * fsten(ii_-1,jj_-1,0,4);
1378 auto restrict_from_0m_to = [&fsten] (
int ii_,
int jj_) ->
Real {
1379 return std::abs(fsten(ii_,jj_-1,0,2))/(std::abs(fsten(ii_,jj_-2,0,2))+std::abs(fsten(ii_,jj_-1,0,2))+eps);
1382 auto restrict_from_pm_to = [&fsten] (
int ii_,
int jj_) ->
Real {
1383 Real wxm = std::abs(fsten(ii_ ,jj_-1,0,1))/(std::abs(fsten(ii_,jj_-2,0,3))+std::abs(fsten(ii_ ,jj_-1,0,3))+eps);
1384 Real wyp = std::abs(fsten(ii_+1,jj_-1,0,2))/(std::abs(fsten(ii_,jj_-1,0,3))+std::abs(fsten(ii_+1,jj_-1,0,3))+eps);
1385 Real wmp = std::abs(fsten(ii_ ,jj_-1,0,3)) *(
Real(1.) + wxm + wyp);
1386 return wmp * fsten(ii_+1,jj_-1,0,4);
1389 auto restrict_from_m0_to = [&fsten] (
int ii_,
int jj_) ->
Real {
1390 return std::abs(fsten(ii_-1,jj_,0,1))/(std::abs(fsten(ii_-2,jj_,0,1))+std::abs(fsten(ii_-1,jj_,0,1))+eps);
1393 auto restrict_from_p0_to = [&fsten] (
int ii_,
int jj_) ->
Real {
1394 return std::abs(fsten(ii_,jj_,0,1))/(std::abs(fsten(ii_,jj_,0,1))+std::abs(fsten(ii_+1,jj_,0,1))+eps);
1397 auto restrict_from_mp_to = [&fsten] (
int ii_,
int jj_) ->
Real {
1398 Real wxp = std::abs(fsten(ii_-1,jj_+1,0,1))/(std::abs(fsten(ii_-1,jj_,0,3))+std::abs(fsten(ii_-1,jj_+1,0,3))+eps);
1399 Real wym = std::abs(fsten(ii_-1,jj_ ,0,2))/(std::abs(fsten(ii_-2,jj_,0,3))+std::abs(fsten(ii_-1,jj_ ,0,3))+eps);
1400 Real wpm = std::abs(fsten(ii_-1,jj_ ,0,3)) * (
Real(1.) + wxp + wym);
1401 return wpm * fsten(ii_-1,jj_+1,0,4);
1404 auto restrict_from_0p_to = [&fsten] (
int ii_,
int jj_) ->
Real {
1405 return std::abs(fsten(ii_,jj_,0,2))/(std::abs(fsten(ii_,jj_,0,2))+std::abs(fsten(ii_,jj_+1,0,2))+eps);
1408 auto restrict_from_pp_to = [&fsten] (
int ii_,
int jj_) ->
Real {
1409 Real wxm = std::abs(fsten(ii_ ,jj_+1,0,1))/(std::abs(fsten(ii_ ,jj_ ,0,3))+std::abs(fsten(ii_ ,jj_+1,0,3))+eps);
1410 Real wym = std::abs(fsten(ii_+1,jj_ ,0,2))/(std::abs(fsten(ii_ ,jj_ ,0,3))+std::abs(fsten(ii_+1,jj_ ,0,3))+eps);
1411 Real wmm = std::abs(fsten(ii_ ,jj_ ,0,3)) * (
Real(1.) + wxm + wym);
1412 return wmm * fsten(ii_+1,jj_+1,0,4);
1417 Array2D<
Real,-1,1,-1,1> ap, p;
1420 p(-1,-1) = interp_from_pp_to(ii+1,jj-1);
1421 p( 0,-1) = interp_from_0p_to(ii+2,jj-1);
1422 p(-1, 0) = interp_from_p0_to(ii+1,jj );
1423 p( 0, 0) =
Real(1.);
1424 p(-1, 1) = interp_from_pm_to(ii+1,jj+1);
1425 p( 0, 1) = interp_from_0m_to(ii+2,jj+1);
1427 ap(0,-1) = Ap0(ii,jj-1)*p(-1,-1) + App(ii,jj-1)*p(-1,0);
1428 ap(1,-1) = A00(ii+1,jj-1)*p(-1,-1) + Ap0(ii+1,jj-1)*p(0,-1)
1429 + A0p(ii+1,jj-1)*p(-1,0) + App(ii+1,jj-1)*p(0,0);
1430 ap(0,0) = Apm(ii,jj)*p(-1,-1) + Ap0(ii,jj)*p(-1,0) + App(ii,jj)*p(-1,1);
1431 ap(1,0) = A0m(ii+1,jj)*p(-1,-1) + Apm(ii+1,jj)*p(0,-1)
1432 + A00(ii+1,jj)*p(-1,0) + Ap0(ii+1,jj)*p(0,0)
1433 + A0p(ii+1,jj)*p(-1,1) + App(ii+1,jj)*p(0,1);
1434 ap(0,1) = Apm(ii,jj+1)*p(-1,0) + Ap0(ii,jj+1)*p(-1,1);
1435 ap(1,1) = A0m(ii+1,jj+1)*p(-1,0) + Apm(ii+1,jj+1)*p(0,0)
1436 + A00(ii+1,jj+1)*p(-1,1) + Ap0(ii+1,jj+1)*p(0,1);
1438 csten(i,j,k,1) =
Real(0.25)*(restrict_from_0m_to(ii,jj)*ap(0,-1)
1439 + restrict_from_pm_to(ii,jj)*ap(1,-1)
1441 + restrict_from_p0_to(ii,jj)*ap(1,0)
1442 + restrict_from_0p_to(ii,jj)*ap(0,1)
1443 + restrict_from_pp_to(ii,jj)*ap(1,1));
1446 p(-1,-1) = interp_from_pp_to(ii-1,jj+1);
1447 p( 0,-1) = interp_from_0p_to(ii ,jj+1);
1448 p( 1,-1) = interp_from_mp_to(ii+1,jj+1);
1449 p(-1, 0) = interp_from_p0_to(ii-1,jj+2);
1450 p( 0, 0) =
Real(1.);
1451 p( 1, 0) = interp_from_m0_to(ii+1,jj+2);
1453 ap(-1,0) = A0p(ii-1,jj)*p(-1,-1) + App(ii-1,jj)*p(0,-1);
1454 ap(0,0) = Amp(ii,jj)*p(-1,-1) + A0p(ii,jj)*p(0,-1) + App(ii,jj)*p(1,-1);
1455 ap(1,0) = Amp(ii+1,jj)*p(0,-1) + A0p(ii+1,jj)*p(1,-1);
1456 ap(-1,1) = A00(ii-1,jj+1)*p(-1,-1) + Ap0(ii-1,jj+1)*p(0,-1)
1457 + A0p(ii-1,jj+1)*p(-1,0) + App(ii-1,jj+1)*p(0,0);
1458 ap(0,1) = Am0(ii,jj+1)*p(-1,-1) + A00(ii,jj+1)*p(0,-1) + Ap0(ii,jj+1)*p(1,-1)
1459 + Amp(ii,jj+1)*p(-1,0) + A0p(ii,jj+1)*p(0,0) + App(ii,jj+1)*p(1,0);
1460 ap(1,1) = Am0(ii+1,jj+1)*p(0,-1) + A00(ii+1,jj+1)*p(1,-1)
1461 + Amp(ii+1,jj+1)*p(0,0) + A0p(ii+1,jj+1)*p(1,0);
1463 csten(i,j,k,2) =
Real(0.25)*(restrict_from_m0_to(ii,jj)*ap(-1,0)
1465 + restrict_from_p0_to(ii,jj)*ap(1,0)
1466 + restrict_from_mp_to(ii,jj)*ap(-1,1)
1467 + restrict_from_0p_to(ii,jj)*ap(0,1)
1468 + restrict_from_pp_to(ii,jj)*ap(1,1));
1471 p(-1,-1) = interp_from_pp_to(ii+1,jj+1);
1472 p( 0,-1) = interp_from_0p_to(ii+2,jj+1);
1473 p(-1, 0) = interp_from_p0_to(ii+1,jj+2);
1474 p( 0, 0) =
Real(1.);
1476 ap(0,0) = App(ii,jj)*p(-1,-1);
1477 ap(1,0) = A0p(ii+1,jj)*p(-1,-1) + App(ii+1,jj)*p(0,-1);
1478 ap(0,1) = Ap0(ii,jj+1)*p(-1,-1) + App(ii,jj+1)*p(-1,0);
1479 ap(1,1) = A00(ii+1,jj+1)*p(-1,-1) + Ap0(ii+1,jj+1)*p(0,-1)
1480 + A0p(ii+1,jj+1)*p(-1,0) + App(ii+1,jj+1)*p(0,0);
1483 + restrict_from_p0_to(ii,jj)*ap(1,0)
1484 + restrict_from_0p_to(ii,jj)*ap(0,1)
1485 + restrict_from_pp_to(ii,jj)*ap(1,1));
1487 p(0,-1) = interp_from_0p_to(ii,jj+1);
1488 p(1,-1) = interp_from_mp_to(ii+1,jj+1);
1490 p(1, 0) = interp_from_m0_to(ii+1,jj+2);
1492 ap(-1,0) = Amp(ii+1,jj)*p(0,-1) + A0p(ii+1,jj)*p(1,-1);
1493 ap( 0,0) = Amp(ii+2,jj)*p(1,-1);
1494 ap(-1,1) = Am0(ii+1,jj+1)*p(0,-1) + A00(ii+1,jj+1)*p(1,-1) + Amp(ii+1,jj+1)*p(0,0)
1495 + A0p(ii+1,jj+1)*p(1,0);
1496 ap( 0,1) = Am0(ii+2,jj+1)*p(1,-1) + Amp(ii+2,jj+1)*p(1,0);
1499 + restrict_from_m0_to(ii+2,jj)*ap(-1,0)
1500 + restrict_from_mp_to(ii+2,jj)*ap(-1,1)
1501 + restrict_from_0p_to(ii+2,jj)*ap( 0,1));
1503 csten(i,j,k,3) =
Real(0.5)*(cross1+cross2);
1510 return x(i-1,j-1,k)*sten(i-1,j-1,k,3)
1511 +
x(i ,j-1,k)*sten(i ,j-1,k,2)
1512 +
x(i+1,j-1,k)*sten(i ,j-1,k,3)
1513 +
x(i-1,j ,k)*sten(i-1,j ,k,1)
1514 +
x(i ,j ,k)*sten(i ,j ,k,0)
1515 +
x(i+1,j ,k)*sten(i ,j ,k,1)
1516 +
x(i-1,j+1,k)*sten(i-1,j ,k,3)
1517 +
x(i ,j+1,k)*sten(i ,j ,k,2)
1518 +
x(i+1,j+1,k)*sten(i ,j ,k,3);
1523 Array4<Real const>
const& sten, Array4<int const>
const& msk)
noexcept
1539 sol(i,j,k) =
Real(0.0);
1540 }
else if (sten(i,j,k,0) !=
Real(0.0)) {
1542 sol(i,j,k) += (rhs(i,j,k) - Ax) / sten(i,j,k,0);
1548 Array4<Real const>
const& rhs,
1549 Array4<Real const>
const& sten,
1550 Array4<int const>
const& msk)
noexcept
1560 Array4<Real const>
const&
crse, Array4<Real const>
const& sten,
1561 Array4<int const>
const& msk)
noexcept
1563 using namespace nodelap_detail;
1565 if (!msk(i,j,0) && sten(i,j,0,0) !=
Real(0.0)) {
1568 bool ieven = ic*2 == i;
1569 bool jeven = jc*2 == j;
1571 if (ieven && jeven) {
1574 Real wym = std::abs(sten(i,j-1,0,2));
1575 Real wyp = std::abs(sten(i,j ,0,2));
1576 fv = (wym*
crse(ic,jc,0) + wyp*
crse(ic,jc+1,0)) / (wym+wyp+eps);
1578 Real wxm = std::abs(sten(i-1,j,0,1));
1579 Real wxp = std::abs(sten(i ,j,0,1));
1580 fv = (wxm*
crse(ic,jc,0) + wxp*
crse(ic+1,jc,0)) / (wxm+wxp+eps);
1582 Real wxm = std::abs(sten(i-1,j ,0,1)) /
1583 (std::abs(sten(i-1,j-1,0,3))+std::abs(sten(i-1,j ,0,3))+eps);
1584 Real wxp = std::abs(sten(i ,j ,0,1)) /
1585 (std::abs(sten(i ,j-1,0,3))+std::abs(sten(i ,j ,0,3))+eps);
1586 Real wym = std::abs(sten(i ,j-1,0,2)) /
1587 (std::abs(sten(i-1,j-1,0,3))+std::abs(sten(i ,j-1,0,3))+eps);
1588 Real wyp = std::abs(sten(i ,j ,0,2)) /
1589 (std::abs(sten(i-1,j ,0,3))+std::abs(sten(i ,j ,0,3))+eps);
1590 Real wmm = std::abs(sten(i-1,j-1,0,3)) * (
Real(1.0) + wxm + wym);
1591 Real wpm = std::abs(sten(i,j-1,0,3)) * (
Real(1.0) + wxp + wym);
1592 Real wmp = std::abs(sten(i-1,j,0,3)) *(
Real(1.0) + wxm + wyp);
1593 Real wpp = std::abs(sten(i,j,0,3)) * (
Real(1.0) + wxp + wyp);
1594 fv = (wmm*
crse(ic,jc,0) + wpm*
crse(ic+1,jc,0)
1595 + wmp*
crse(ic,jc+1,0) + wpp*
crse(ic+1,jc+1,0))
1596 / (wmm+wpm+wmp+wpp+eps);
1605 Array4<Real const>
const&
fine, Array4<Real const>
const& sten,
1606 Array4<int const>
const& msk)
noexcept
1608 using namespace nodelap_detail;
1617 +
fine(ii-1,jj ,0)*std::abs(sten(ii-1,jj ,0,1))
1618 / (std::abs(sten(ii-2,jj ,0,1))
1619 +std::abs(sten(ii-1,jj ,0,1))+eps)
1620 +
fine(ii+1,jj ,0)*std::abs(sten(ii ,jj ,0,1))
1621 / (std::abs(sten(ii ,jj ,0,1))
1622 +std::abs(sten(ii+1,jj ,0,1))+eps)
1623 +
fine(ii ,jj-1,0)*std::abs(sten(ii ,jj-1,0,2))
1624 / (std::abs(sten(ii ,jj-2,0,2))
1625 +std::abs(sten(ii ,jj-1,0,2))+eps)
1626 +
fine(ii ,jj+1,0)*std::abs(sten(ii ,jj ,0,2))
1627 / (std::abs(sten(ii ,jj ,0,2))
1628 +std::abs(sten(ii ,jj+1,0,2))+eps);
1630 Real wxp = std::abs(sten(ii-1,jj-1,0,1))
1631 / (std::abs(sten(ii-1,jj-2,0,3))
1632 +std::abs(sten(ii-1,jj-1,0,3))+eps);
1633 Real wyp = std::abs(sten(ii-1,jj-1,0,2))
1634 / (std::abs(sten(ii-2,jj-1,0,3))
1635 +std::abs(sten(ii-1,jj-1,0,3))+eps);
1636 Real wpp = std::abs(sten(ii-1,jj-1,0,3))*(
Real(1.0) + wxp + wyp);
1637 cv += wpp*sten(ii-1,jj-1,0,4)*
fine(ii-1,jj-1,0);
1639 Real wxm = std::abs(sten(ii ,jj-1,0,1))
1640 / (std::abs(sten(ii ,jj-2,0,3))
1641 +std::abs(sten(ii ,jj-1,0,3))+eps);
1642 wyp = std::abs(sten(ii+1,jj-1,0,2))
1643 / (std::abs(sten(ii ,jj-1,0,3))
1644 +std::abs(sten(ii+1,jj-1,0,3))+eps);
1645 Real wmp = std::abs(sten(ii ,jj-1,0,3))*(
Real(1.0) + wxm + wyp);
1646 cv += wmp*sten(ii+1,jj-1,0,4)*
fine(ii+1,jj-1,0);
1648 wxp = std::abs(sten(ii-1,jj+1,0,1))
1649 / (std::abs(sten(ii-1,jj ,0,3))
1650 +std::abs(sten(ii-1,jj+1,0,3))+eps);
1651 Real wym = std::abs(sten(ii-1,jj ,0,2))
1652 / (std::abs(sten(ii-2,jj ,0,3))
1653 +std::abs(sten(ii-1,jj ,0,3))+eps);
1654 Real wpm = std::abs(sten(ii-1,jj ,0,3)) * (
Real(1.0) + wxp + wym);
1655 cv += wpm*sten(ii-1,jj+1,0,4)*
fine(ii-1,jj+1,0);
1657 wxm = std::abs(sten(ii ,jj+1,0,1))
1658 / (std::abs(sten(ii ,jj ,0,3))
1659 +std::abs(sten(ii ,jj+1,0,3))+eps);
1660 wym = std::abs(sten(ii+1,jj ,0,2))
1661 / (std::abs(sten(ii ,jj ,0,3))
1662 +std::abs(sten(ii+1,jj ,0,3))+eps);
1663 Real wmm = std::abs(sten(ii ,jj ,0,3)) * (
Real(1.0) + wxm + wym);
1664 cv += wmm*sten(ii+1,jj+1,0,4)*
fine(ii+1,jj+1,0);
1673namespace nodelap_detail {
1674 constexpr int i_S_x = 0;
1675 constexpr int i_S_y = 1;
1676 constexpr int i_S_x2 = 2;
1677 constexpr int i_S_y2 = 3;
1678 constexpr int i_S_xy = 4;
1679 constexpr int n_Sintg = 5;
1681 constexpr int i_B_x = 0;
1682 constexpr int i_B_y = 1;
1683 constexpr int i_B_xy = 2;
1684 constexpr int n_Bintg = 3;
1693 using namespace nodelap_detail;
1695 if (flag(i,j,0).isCovered()) {
1696 for (
int n = 0; n < 6; ++n) { conn(i,j,0,n) =
Real(0.); }
1697 }
else if (flag(i,j,0).isRegular() || vol(i,j,0) >= almostone) {
1698 for (
int n = 0; n < 6; ++n) { conn(i,j,0,n) =
Real(1.); }
1702 conn(i,j,0,0) =
Real(3.)*(
Real(0.25)*vol(i,j,0) + intg(i,j,0,i_S_y2) - intg(i,j,0,i_S_y));
1703 conn(i,j,0,1) =
Real(6.)*(
Real(0.25)*vol(i,j,0) - intg(i,j,0,i_S_y2));
1704 conn(i,j,0,2) =
Real(3.)*(
Real(0.25)*vol(i,j,0) + intg(i,j,0,i_S_y2) + intg(i,j,0,i_S_y));
1706 conn(i,j,0,3) =
Real(3.)*(
Real(0.25)*vol(i,j,0) + intg(i,j,0,i_S_x2) - intg(i,j,0,i_S_x));
1707 conn(i,j,0,4) =
Real(6.)*(
Real(0.25)*vol(i,j,0) - intg(i,j,0,i_S_x2));
1708 conn(i,j,0,5) =
Real(3.)*(
Real(0.25)*vol(i,j,0) + intg(i,j,0,i_S_x2) + intg(i,j,0,i_S_x));
1717 Real facx =
Real(1./6.)*dxinv[0]*dxinv[0];
1718 Real facy =
Real(1./6.)*dxinv[1]*dxinv[1];
1720 sten(i,j,0,1) =
Real(2.)*facx*(sig(i,j-1,0)*conn(i,j-1,0,2)+sig(i,j,0)*conn(i,j,0,0))
1721 -facy*(sig(i,j-1,0)*conn(i,j-1,0,4)+sig(i,j,0)*conn(i,j,0,4));
1722 sten(i,j,0,2) =
Real(2.)*facy*(sig(i-1,j,0)*conn(i-1,j,0,5)+sig(i,j,0)*conn(i,j,0,3))
1723 -facx*(sig(i-1,j,0)*conn(i-1,j,0,1)+sig(i,j,0)*conn(i,j,0,1));
1724 sten(i,j,0,3) = (facx*conn(i,j,0,1)+facy*conn(i,j,0,4))*sig(i,j,0);
1732 Box const& nodal_domain,
1754 zero_ilo =
Real(0.0);
1759 zero_ihi =
Real(0.0);
1764 zero_jlo =
Real(0.0);
1769 zero_jhi =
Real(0.0);
1772 rhs(i,j,0) = facx*(-vel(i-1,j-1,0,0)*(vfrac(i-1,j-1,0)+
Real(2.)*intg(i-1,j-1,0,1))*zero_jlo
1773 +vel(i ,j-1,0,0)*(vfrac(i ,j-1,0)+
Real(2.)*intg(i ,j-1,0,1))*zero_jlo
1774 -vel(i-1,j ,0,0)*(vfrac(i-1,j ,0)-
Real(2.)*intg(i-1,j ,0,1))*zero_jhi
1775 +vel(i ,j ,0,0)*(vfrac(i ,j ,0)-
Real(2.)*intg(i ,j ,0,1))*zero_jhi)
1776 + facy*(-vel(i-1,j-1,0,1)*(vfrac(i-1,j-1,0)+
Real(2.)*intg(i-1,j-1,0,0))*zero_ilo
1777 -vel(i ,j-1,0,1)*(vfrac(i ,j-1,0)-
Real(2.)*intg(i ,j-1,0,0))*zero_ihi
1778 +vel(i-1,j ,0,1)*(vfrac(i-1,j ,0)+
Real(2.)*intg(i-1,j ,0,0))*zero_ilo
1779 +vel(i ,j ,0,1)*(vfrac(i ,j ,0)-
Real(2.)*intg(i ,j ,0,0))*zero_ihi);
1781 rhs(i,j,0) =
Real(0.);
1792 using namespace nodelap_detail;
1794 Real fac_eb = 0.25 *dxinv[0];
1797 rhs(i,j,0) += fac_eb*(
1798 eb_vel_dot_n(i-1,j-1,0)*( bareaarr(i-1,j-1,0)
1799 +
Real(2.)*sintg(i-1,j-1,0,i_B_x )
1800 +
Real(2.)*sintg(i-1,j-1,0,i_B_y )
1801 +
Real(4.)*sintg(i-1,j-1,0,i_B_xy))
1802 +eb_vel_dot_n(i ,j-1,0)*( bareaarr(i ,j-1,0)
1803 -
Real(2.)*sintg(i ,j-1,0,i_B_x )
1804 +
Real(2.)*sintg(i ,j-1,0,i_B_y )
1805 -
Real(4.)*sintg(i ,j-1,0,i_B_xy))
1806 +eb_vel_dot_n(i-1,j ,0)*( bareaarr(i-1,j ,0)
1807 +
Real(2.)*sintg(i-1,j ,0,i_B_x )
1808 -
Real(2.)*sintg(i-1,j ,0,i_B_y )
1809 -
Real(4.)*sintg(i-1,j ,0,i_B_xy))
1810 +eb_vel_dot_n(i ,j ,0)*( bareaarr(i ,j ,0)
1811 -
Real(2.)*sintg(i ,j ,0,i_B_x )
1812 -
Real(2.)*sintg(i ,j ,0,i_B_y )
1813 +
Real(4.)*sintg(i ,j ,0,i_B_xy)));
1824 if (vfrac(i,j,0) ==
Real(0.)) {
1825 u(i,j,0,0) = u(i,j,0,1) =
Real(0.);
1827 Real dpdx = facx*(-p(i,j,0)+p(i+1,j,0)-p(i,j+1,0)+p(i+1,j+1,0));
1828 Real dpdy = facy*(-p(i,j,0)-p(i+1,j,0)+p(i,j+1,0)+p(i+1,j+1,0));
1829 Real dpp = (p(i,j,0)+p(i+1,j+1,0)-p(i+1,j,0)-p(i,j+1,0))/vfrac(i,j,0);
1830 u(i,j,0,0) -= sig(i,j,0)*(dpdx + dxinv[0]*intg(i,j,0,1)*dpp);
1831 u(i,j,0,1) -= sig(i,j,0)*(dpdy + dxinv[1]*intg(i,j,0,0)*dpp);
1842 if (vfrac(i,j,0) ==
Real(0.)) {
1843 u(i,j,0,0) = u(i,j,0,1) =
Real(0.);
1845 Real dpdx = facx*(-p(i,j,0)+p(i+1,j,0)-p(i,j+1,0)+p(i+1,j+1,0));
1846 Real dpdy = facy*(-p(i,j,0)-p(i+1,j,0)+p(i,j+1,0)+p(i+1,j+1,0));
1847 Real dpp = (p(i,j,0)+p(i+1,j+1,0)-p(i+1,j,0)-p(i,j+1,0))/vfrac(i,j,0);
1848 u(i,j,0,0) -= sig*(dpdx + dxinv[0]*intg(i,j,0,1)*dpp);
1849 u(i,j,0,1) -= sig*(dpdy + dxinv[1]*intg(i,j,0,0)*dpp);
1858 using namespace nodelap_detail;
1862 rhcc(i ,j ,0)*(
Real(0.25)*vfrac(i ,j ,0)-intg(i ,j ,0,i_S_x)-intg(i ,j ,0,i_S_y)+intg(i ,j ,0,i_S_xy)) +
1863 rhcc(i-1,j ,0)*(
Real(0.25)*vfrac(i-1,j ,0)+intg(i-1,j ,0,i_S_x)-intg(i-1,j ,0,i_S_y)-intg(i-1,j ,0,i_S_xy)) +
1864 rhcc(i-1,j-1,0)*(
Real(0.25)*vfrac(i-1,j-1,0)+intg(i-1,j-1,0,i_S_x)+intg(i-1,j-1,0,i_S_y)+intg(i-1,j-1,0,i_S_xy)) +
1865 rhcc(i ,j-1,0)*(
Real(0.25)*vfrac(i ,j-1,0)-intg(i ,j-1,0,i_S_x)+intg(i ,j-1,0,i_S_y)-intg(i ,j-1,0,i_S_xy));
1874 using namespace nodelap_detail;
1876 intg(i,j,0,i_S_x ) =
Real(0.);
1877 intg(i,j,0,i_S_y ) =
Real(0.);
1878 intg(i,j,0,i_S_x2) =
Real(1./12.);
1879 intg(i,j,0,i_S_y2) =
Real(1./12.);
1880 intg(i,j,0,i_S_xy) =
Real(0.);
1886 using namespace nodelap_detail;
1888 sintg(i,j,0,i_B_x ) =
Real(0.);
1889 sintg(i,j,0,i_B_y ) =
Real(0.);
1890 sintg(i,j,0,i_B_xy) =
Real(0.);
1899 using namespace nodelap_detail;
1901 if (flag(i,j,0).isCovered()) {
1902 intg(i,j,0,i_S_x ) =
Real(0.);
1903 intg(i,j,0,i_S_y ) =
Real(0.);
1904 intg(i,j,0,i_S_x2) =
Real(0.);
1905 intg(i,j,0,i_S_y2) =
Real(0.);
1906 intg(i,j,0,i_S_xy) =
Real(0.);
1907 }
else if (flag(i,j,0).isRegular() || vol(i,j,0) >= almostone) {
1908 intg(i,j,0,i_S_x ) =
Real(0.);
1909 intg(i,j,0,i_S_y ) =
Real(0.);
1910 intg(i,j,0,i_S_x2) =
Real(1./12.);
1911 intg(i,j,0,i_S_y2) =
Real(1./12.);
1912 intg(i,j,0,i_S_xy) =
Real(0.);
1914 Real axm = ax(i,j,0);
1915 Real axp = ax(i+1,j,0);
1916 Real aym = ay(i,j,0);
1917 Real ayp = ay(i,j+1,0);
1919 Real apnorm = std::sqrt((axm-axp)*(axm-axp) + (aym-ayp)*(aym-ayp));
1920 if (apnorm ==
Real(0.)) {
1921 amrex::Abort(
"amrex_mlndlap_set_integral: we are in trouble");
1925 Real anrmx = (axm-axp) * apnorminv;
1926 Real anrmy = (aym-ayp) * apnorminv;
1928 Real bcx = bcen(i,j,0,0);
1929 Real bcy = bcen(i,j,0,1);
1931 Real Sx, Sy, Sx2, Sy2, Sxy;
1932 if (std::abs(anrmx) <= almostzero) {
1934 Sx2 =
Real(1./24.)*(axm+axp);
1936 }
else if (std::abs(anrmy) <= almostzero) {
1937 Sx =
Real(1./8.) *(axp-axm) + anrmx*
Real(0.5)*(bcx*bcx);
1938 Sx2 =
Real(1./24.)*(axp+axm) + anrmx*
Real(1./3.)*(bcx*bcx*bcx);
1942 if (anrmx >
Real(0.)) {
1949 Real xmin3 = xmin*xmin*xmin;
1950 Real xmin4 = xmin3*xmin;
1951 Real xmax3 = xmax*xmax*xmax;
1952 Real xmax4 = xmax3*xmax;
1953 Sx =
Real(1./8.) *(axp-axm) + (anrmx/std::abs(anrmy))*
Real(1./6.) *(xmax3-xmin3);
1954 Sx2 =
Real(1./24.)*(axp+axm) + (anrmx/std::abs(anrmy))*
Real(1./12.)*(xmax4-xmin4);
1956 Real kk = -anrmx/anrmy;
1957 Real bb = bcy-kk*bcx;
1958 Sxy =
Real(1./8.)*kk*kk*(xmax4-xmin4) +
Real(1./3.)*kk*bb*(xmax3-xmin3)
1959 + (
Real(0.25)*bb*bb-
Real(1./16.))*(xmax*xmax-xmin*xmin);
1960 Sxy = std::copysign(Sxy, anrmy);
1963 if (std::abs(anrmy) <= almostzero) {
1965 Sy2 =
Real(1./24.)*(aym+ayp);
1966 }
else if (std::abs(anrmx) <= almostzero) {
1967 Sy =
Real(1./8.) *(ayp-aym) + anrmy*
Real(0.5)*(bcy*bcy);
1968 Sy2 =
Real(1./24.)*(ayp+aym) + anrmy*
Real(1./3.)*(bcy*bcy*bcy);
1971 if (anrmy >
Real(0.)) {
1978 Real ymin3 = ymin*ymin*ymin;
1979 Real ymin4 = ymin3*ymin;
1980 Real ymax3 = ymax*ymax*ymax;
1981 Real ymax4 = ymax3*ymax;
1982 Sy =
Real(1./8.) *(ayp-aym) + (anrmy/std::abs(anrmx))*
Real(1./6.) *(ymax3-ymin3);
1983 Sy2 =
Real(1./24.)*(ayp+aym) + (anrmy/std::abs(anrmx))*
Real(1./12.)*(ymax4-ymin4);
1986 intg(i,j,0,i_S_x ) = Sx;
1987 intg(i,j,0,i_S_y ) = Sy;
1988 intg(i,j,0,i_S_x2) = Sx2;
1989 intg(i,j,0,i_S_y2) = Sy2;
1990 intg(i,j,0,i_S_xy) = Sxy;
2001 using namespace nodelap_detail;
2003 if (flag(i,j,0).isCovered() || flag(i,j,0).isRegular()) {
2004 sintg(i,j,0,i_B_x ) =
Real(0.);
2005 sintg(i,j,0,i_B_y ) =
Real(0.);
2006 sintg(i,j,0,i_B_xy) =
Real(0.);
2008 Real bcx = bcen(i,j,0,0);
2009 Real bcy = bcen(i,j,0,1);
2014 Real x0 = bcx -
Real(0.5)*barea(i,j,0)*btanx;
2015 Real x1 = bcx +
Real(0.5)*barea(i,j,0)*btanx;
2017 Real y0 = bcy -
Real(0.5)*barea(i,j,0)*btany;
2018 Real y1 = bcy +
Real(0.5)*barea(i,j,0)*btany;
2020 Real Bx = barea(i,j,0)*
Real(0.5)*(x1 + x0);
2021 Real By = barea(i,j,0)*
Real(0.5)*(y1 + y0);
2022 Real Bxy = barea(i,j,0)*(x0*y0 + (x0*(y1 - y0) + y0*(x1 - x0))/
Real(2.) + (x1 - x0)*(y1 - y0)/
Real(3.));
2024 sintg(i,j,0,i_B_x ) = Bx;
2025 sintg(i,j,0,i_B_y ) = By;
2026 sintg(i,j,0,i_B_xy) = Bxy;
2032#if defined(AMREX_USE_HYPRE)
2034template <
typename HypreInt,
typename AtomicInt>
2035void mlndlap_fillijmat_sten_cpu (
Box const& ndbx,
2036 Array4<AtomicInt const>
const& gid,
2037 Array4<int const>
const& lid,
2038 HypreInt* ncols, HypreInt* cols,
2040 Array4<Real const>
const& sten)
noexcept
2042 constexpr auto gidmax = std::numeric_limits<AtomicInt>::max();
2043 HypreInt nelems = 0;
2046 if (lid(i,j,k) >= 0)
2048 cols[nelems] = gid(i,j,k);
2049 mat[nelems] = sten(i,j,k,0);
2053 if (gid(i-1,j-1,k) < gidmax) {
2054 cols[nelems] = gid(i-1,j-1,k);
2055 mat[nelems] = sten(i-1,j-1,k,3);
2059 if (gid(i,j-1,k) < gidmax) {
2060 cols[nelems] = gid(i,j-1,k);
2061 mat[nelems] = sten(i,j-1,k,2);
2065 if (gid(i+1,j-1,k) < gidmax) {
2066 cols[nelems] = gid(i+1,j-1,k);
2067 mat[nelems] = sten(i ,j-1,k,3);
2071 if (gid(i-1,j,k) < gidmax) {
2072 cols[nelems] = gid(i-1,j,k);
2073 mat[nelems] = sten(i-1,j,k,1);
2077 if (gid(i+1,j,k) < gidmax) {
2078 cols[nelems] = gid(i+1,j,k);
2079 mat[nelems] = sten(i ,j,k,1);
2083 if (gid(i-1,j+1,k) < gidmax) {
2084 cols[nelems] = gid(i-1,j+1,k);
2085 mat[nelems] = sten(i-1,j ,k,3);
2089 if (gid(i,j+1,k) < gidmax) {
2090 cols[nelems] = gid(i,j+1,k);
2091 mat[nelems] = sten(i,j ,k,2);
2095 if (gid(i+1,j+1,k) < gidmax) {
2096 cols[nelems] = gid(i+1,j+1,k);
2097 mat[nelems] = sten(i ,j ,k,3);
2101 ncols[lid(i,j,k)] = nelems - nelems_old;
2106template <
typename HypreInt,
typename AtomicInt>
2107void mlndlap_fillijmat_aa_cpu (
Box const& ndbx,
2108 Array4<AtomicInt const>
const& gid,
2109 Array4<int const>
const& lid,
2110 HypreInt* ncols, HypreInt* cols,
2112 Array4<Real const>
const& sig,
2113 GpuArray<Real,AMREX_SPACEDIM>
const& dxinv,
2114 Box const& ccdom,
bool is_rz)
noexcept
2116 Real facx =
Real(1.0/6.0)*dxinv[0]*dxinv[0];
2117 Real facy =
Real(1.0/6.0)*dxinv[1]*dxinv[1];
2118 Real fxy = facx + facy;
2119 Real f2xmy =
Real(2.0)*facx - facy;
2120 Real fmx2y =
Real(2.0)*facy - facx;
2125 constexpr auto gidmax = std::numeric_limits<AtomicInt>::max();
2126 HypreInt nelems = 0;
2129 if (lid(i,j,k) >= 0)
2133 fp = facy /
static_cast<Real>(2*i+1);
2134 fm = facy /
static_cast<Real>(2*i-1);
2136 fp = fm =
Real(0.0);
2139 HypreInt nelems_old = nelems;
2140 cols[nelems_old] = gid(i,j,k);
2144 if (nddom.contains(i-1,j-1,k)) {
2145 Real tmp = fxy*sig(i-1,j-1,k);
2147 if ( gid(i-1,j-1,k) < gidmax) {
2148 cols[nelems] = gid(i-1,j-1,k);
2154 if (nddom.contains(i,j-1,k)) {
2156 if ( ccdom.contains(i-1,j-1,k)) {
2157 tmp += sig(i-1,j-1,k) * (fmx2y + fm);
2159 if ( ccdom.contains(i,j-1,k)) {
2160 tmp += sig(i,j-1,k) * (fmx2y - fp);
2163 if (gid(i,j-1,k) < gidmax) {
2164 cols[nelems] = gid(i,j-1,k);
2170 if (nddom.contains(i+1,j-1,k)) {
2171 Real tmp = fxy*sig(i ,j-1,k);
2173 if (gid(i+1,j-1,k) < gidmax) {
2174 cols[nelems] = gid(i+1,j-1,k);
2180 if (nddom.contains(i-1,j,k)) {
2182 if ( ccdom.contains(i-1,j-1,k)) {
2183 tmp += f2xmy*sig(i-1,j-1,k);
2185 if ( ccdom.contains(i-1,j,k)) {
2186 tmp += f2xmy*sig(i-1,j,k);
2189 if (gid(i-1,j,k) < gidmax) {
2190 cols[nelems] = gid(i-1,j,k);
2196 if (nddom.contains(i+1,j,k)) {
2198 if ( ccdom.contains(i ,j-1,k)) {
2199 tmp += f2xmy*sig(i ,j-1,k);
2201 if ( ccdom.contains(i ,j,k)) {
2202 tmp += f2xmy*sig(i ,j,k);
2205 if (gid(i+1,j,k) < gidmax) {
2206 cols[nelems] = gid(i+1,j,k);
2212 if (nddom.contains(i-1,j+1,k)) {
2213 Real tmp = fxy*sig(i-1,j ,k);
2215 if (gid(i-1,j+1,k) < gidmax) {
2216 cols[nelems] = gid(i-1,j+1,k);
2222 if (nddom.contains(i,j+1,k)) {
2224 if ( ccdom.contains(i-1,j ,k)) {
2225 tmp += sig(i-1,j ,k) * (fmx2y + fm);
2227 if ( ccdom.contains(i,j ,k)) {
2228 tmp += sig(i,j ,k) * (fmx2y - fp);
2231 if (gid(i,j+1,k) < gidmax) {
2232 cols[nelems] = gid(i,j+1,k);
2238 if (nddom.contains(i+1,j+1,k)) {
2239 Real tmp = fxy*sig(i ,j ,k);
2241 if (gid(i+1,j+1,k) < gidmax) {
2242 cols[nelems] = gid(i+1,j+1,k);
2248 mat[nelems_old] = m0;
2249 ncols[lid(i,j,k)] = nelems - nelems_old;
2254template <
typename HypreInt,
typename AtomicInt>
2255void mlndlap_fillijmat_ha_cpu (
Box const& ndbx,
2256 Array4<AtomicInt const>
const& gid,
2257 Array4<int const>
const& lid,
2258 HypreInt* ncols, HypreInt* cols,
2260 Array4<Real const>
const& sx,
2261 Array4<Real const>
const& sy,
2262 GpuArray<Real,AMREX_SPACEDIM>
const& dxinv,
2263 Box const& ccdom,
bool is_rz)
noexcept
2265 Real facx =
Real(1.0/6.0)*dxinv[0]*dxinv[0];
2266 Real facy =
Real(1.0/6.0)*dxinv[1]*dxinv[1];
2271 constexpr auto gidmax = std::numeric_limits<AtomicInt>::max();
2272 HypreInt nelems = 0;
2275 if (lid(i,j,k) >= 0)
2279 fp = facy /
static_cast<Real>(2*i+1);
2280 fm = facy /
static_cast<Real>(2*i-1);
2282 fp = fm =
Real(0.0);
2285 HypreInt nelems_old = nelems;
2286 cols[nelems_old] = gid(i,j,k);
2290 if (nddom.contains(i-1,j-1,k)) {
2291 Real tmp = facx*sx(i-1,j-1,k) + facy*sy(i-1,j-1,k);
2293 if ( gid(i-1,j-1,k) < gidmax) {
2294 cols[nelems] = gid(i-1,j-1,k);
2300 if (nddom.contains(i,j-1,k)) {
2302 if ( ccdom.contains(i-1,j-1,k)) {
2303 tmp += sy(i-1,j-1,k) * (facy *
Real(2.0) + fm)
2304 - sx(i-1,j-1,k) * facx;
2306 if ( ccdom.contains(i,j-1,k)) {
2307 tmp += sy(i,j-1,k) * (facy *
Real(2.0) - fp)
2308 - sx(i,j-1,k) * facx;
2311 if (gid(i,j-1,k) < gidmax) {
2312 cols[nelems] = gid(i,j-1,k);
2318 if (nddom.contains(i+1,j-1,k)) {
2319 Real tmp = facx*sx(i ,j-1,k) + facy*sy(i ,j-1,k);
2321 if (gid(i+1,j-1,k) < gidmax) {
2322 cols[nelems] = gid(i+1,j-1,k);
2328 if (nddom.contains(i-1,j,k)) {
2330 if ( ccdom.contains(i-1,j-1,k)) {
2331 tmp += sx(i-1,j-1,k) * facx*
Real(2.0)
2332 - sy(i-1,j-1,k) * facy;
2334 if ( ccdom.contains(i-1,j,k)) {
2335 tmp += sx(i-1,j,k) * facx*
Real(2.0)
2336 - sy(i-1,j,k) * facy;
2339 if (gid(i-1,j,k) < gidmax) {
2340 cols[nelems] = gid(i-1,j,k);
2346 if (nddom.contains(i+1,j,k)) {
2348 if ( ccdom.contains(i ,j-1,k)) {
2349 tmp += sx(i ,j-1,k) * facx*
Real(2.0)
2350 - sy(i ,j-1,k) * facy;
2352 if ( ccdom.contains(i ,j,k)) {
2353 tmp += sx(i ,j,k) * facx*
Real(2.0)
2354 - sy(i ,j,k) * facy;
2357 if (gid(i+1,j,k) < gidmax) {
2358 cols[nelems] = gid(i+1,j,k);
2364 if (nddom.contains(i-1,j+1,k)) {
2365 Real tmp = facx*sx(i-1,j ,k) + facy*sy(i-1,j ,k);
2367 if (gid(i-1,j+1,k) < gidmax) {
2368 cols[nelems] = gid(i-1,j+1,k);
2374 if (nddom.contains(i,j+1,k)) {
2376 if ( ccdom.contains(i-1,j ,k)) {
2377 tmp += sy(i-1,j ,k) * (facy*
Real(2.0) + fm)
2378 - sx(i-1,j ,k) * facx;
2380 if ( ccdom.contains(i,j ,k)) {
2381 tmp += sy(i,j ,k) * (facy*
Real(2.0) - fp)
2382 - sx(i,j ,k) * facx;
2385 if (gid(i,j+1,k) < gidmax) {
2386 cols[nelems] = gid(i,j+1,k);
2392 if (nddom.contains(i+1,j+1,k)) {
2393 Real tmp = facx*sx(i ,j ,k) + facy*sy(i ,j ,k);
2395 if (gid(i+1,j+1,k) < gidmax) {
2396 cols[nelems] = gid(i+1,j+1,k);
2402 mat[nelems_old] = m0;
2403 ncols[lid(i,j,k)] = nelems - nelems_old;
2408template <
typename HypreInt,
typename AtomicInt>
2409void mlndlap_fillijmat_cs_cpu (
Box const& ndbx,
2410 Array4<AtomicInt const>
const& gid,
2411 Array4<int const>
const& lid,
2412 HypreInt* ncols, HypreInt* cols,
2415 GpuArray<Real,AMREX_SPACEDIM>
const& dxinv,
2416 Box const& ccdom,
bool is_rz)
noexcept
2418 Real facx =
Real(1.0/6.0)*dxinv[0]*dxinv[0] * sig;
2419 Real facy =
Real(1.0/6.0)*dxinv[1]*dxinv[1] * sig;
2420 Real fxy = facx + facy;
2421 Real f2xmy =
Real(2.0)*facx - facy;
2422 Real fmx2y =
Real(2.0)*facy - facx;
2427 constexpr auto gidmax = std::numeric_limits<AtomicInt>::max();
2428 HypreInt nelems = 0;
2431 if (lid(i,j,k) >= 0)
2435 fp = facy /
static_cast<Real>(2*i+1);
2436 fm = facy /
static_cast<Real>(2*i-1);
2438 fp = fm =
Real(0.0);
2441 HypreInt nelems_old = nelems;
2442 cols[nelems_old] = gid(i,j,k);
2446 if (nddom.contains(i-1,j-1,k)) {
2449 if ( gid(i-1,j-1,k) < gidmax) {
2450 cols[nelems] = gid(i-1,j-1,k);
2456 if (nddom.contains(i,j-1,k)) {
2458 if ( ccdom.contains(i-1,j-1,k)) {
2461 if ( ccdom.contains(i,j-1,k)) {
2465 if (gid(i,j-1,k) < gidmax) {
2466 cols[nelems] = gid(i,j-1,k);
2472 if (nddom.contains(i+1,j-1,k)) {
2475 if (gid(i+1,j-1,k) < gidmax) {
2476 cols[nelems] = gid(i+1,j-1,k);
2482 if (nddom.contains(i-1,j,k)) {
2484 if ( ccdom.contains(i-1,j-1,k)) {
2487 if ( ccdom.contains(i-1,j,k)) {
2491 if (gid(i-1,j,k) < gidmax) {
2492 cols[nelems] = gid(i-1,j,k);
2498 if (nddom.contains(i+1,j,k)) {
2500 if ( ccdom.contains(i ,j-1,k)) {
2503 if ( ccdom.contains(i ,j,k)) {
2507 if (gid(i+1,j,k) < gidmax) {
2508 cols[nelems] = gid(i+1,j,k);
2514 if (nddom.contains(i-1,j+1,k)) {
2517 if (gid(i-1,j+1,k) < gidmax) {
2518 cols[nelems] = gid(i-1,j+1,k);
2524 if (nddom.contains(i,j+1,k)) {
2526 if ( ccdom.contains(i-1,j ,k)) {
2529 if ( ccdom.contains(i,j ,k)) {
2533 if (gid(i,j+1,k) < gidmax) {
2534 cols[nelems] = gid(i,j+1,k);
2540 if (nddom.contains(i+1,j+1,k)) {
2543 if (gid(i+1,j+1,k) < gidmax) {
2544 cols[nelems] = gid(i+1,j+1,k);
2550 mat[nelems_old] = m0;
2551 ncols[lid(i,j,k)] = nelems - nelems_old;
2558template <
typename HypreInt,
typename AtomicInt>
2560void mlndlap_fillijmat_sten_gpu (
const int ps,
const int i,
const int j,
const int k,
2562 Array4<AtomicInt const>
const& gid,
2563 Array4<int const>
const& lid,
2564 HypreInt* ncols, HypreInt* cols,
2566 Array4<Real const>
const& sten)
noexcept
2568 if (lid(i,j,k) >= 0)
2570 constexpr auto gidmax = std::numeric_limits<AtomicInt>::max();
2574 if (gid(i-1,j-1,k) < gidmax) {
2576 cols[ps] = gid(i-1,j-1,k);
2577 mat[ps] = sten(i-1,j-1,k,3);
2581 if (
offset != 0) {
return; }
2585 if (gid(i,j-1,k) < gidmax) {
2587 cols[ps] = gid(i,j-1,k);
2588 mat[ps] = sten(i,j-1,k,2);
2592 if (
offset != 0) {
return; }
2596 if (gid(i+1,j-1,k) < gidmax) {
2598 cols[ps] = gid(i+1,j-1,k);
2599 mat[ps] = sten(i ,j-1,k,3);
2603 if (
offset != 0) {
return; }
2607 if (gid(i-1,j,k) < gidmax) {
2609 cols[ps] = gid(i-1,j,k);
2610 mat[ps] = sten(i-1,j,k,1);
2614 if (
offset != 0) {
return; }
2618 if (gid(i+1,j,k) < gidmax) {
2620 cols[ps] = gid(i+1,j,k);
2621 mat[ps] = sten(i ,j,k,1);
2625 if (
offset != 0) {
return; }
2629 if (gid(i-1,j+1,k) < gidmax) {
2631 cols[ps] = gid(i-1,j+1,k);
2632 mat[ps] = sten(i-1,j ,k,3);
2636 if (
offset != 0) {
return; }
2640 if (gid(i,j+1,k) < gidmax) {
2642 cols[ps] = gid(i,j+1,k);
2643 mat[ps] = sten(i,j ,k,2);
2647 if (
offset != 0) {
return; }
2651 if (gid(i+1,j+1,k) < gidmax) {
2653 cols[ps] = gid(i+1,j+1,k);
2654 mat[ps] = sten(i ,j ,k,3);
2658 if (
offset != 0) {
return; }
2662 cols[ps] = gid(i,j,k);
2663 mat[ps] = sten(i,j,k,0);
2664 ncols[lid(i,j,k)] = nelems+1;
2668template <
typename HypreInt,
typename AtomicInt>
2670void mlndlap_fillijmat_aa_gpu (
const int ps,
const int i,
const int j,
const int k,
2672 Box const& ndbx, Array4<AtomicInt const>
const& gid,
2673 Array4<int const>
const& lid,
2674 HypreInt* ncols, HypreInt* cols,
2676 Array4<Real const>
const& sig,
2677 GpuArray<Real,AMREX_SPACEDIM>
const& dxinv,
2678 Box const& ccdom,
bool is_rz)
noexcept
2680 if (lid(i,j,k) >= 0)
2682 Real facx =
Real(1.0/6.0)*dxinv[0]*dxinv[0];
2683 Real facy =
Real(1.0/6.0)*dxinv[1]*dxinv[1];
2684 Real fxy = facx + facy;
2685 Real f2xmy =
Real(2.0)*facx - facy;
2686 Real fmx2y =
Real(2.0)*facy - facx;
2690 fp = facy /
static_cast<Real>(2*i+1);
2691 fm = facy /
static_cast<Real>(2*i-1);
2693 fp = fm =
Real(0.0);
2698 constexpr auto gidmax = std::numeric_limits<AtomicInt>::max();
2703 if (nddom.contains(i-1,j-1,k)) {
2704 Real tmp = fxy*sig(i-1,j-1,k);
2706 if (gid(i-1,j-1,k) < gidmax) {
2708 cols[ps] = gid(i-1,j-1,k);
2714 if (
offset != 0) {
return; }
2718 if (nddom.contains(i,j-1,k)) {
2720 if ( ccdom.contains(i-1,j-1,k)) {
2721 tmp += sig(i-1,j-1,k) * (fmx2y + fm);
2723 if ( ccdom.contains(i,j-1,k)) {
2724 tmp += sig(i,j-1,k) * (fmx2y - fp);
2727 if (gid(i,j-1,k) < gidmax) {
2729 cols[ps] = gid(i,j-1,k);
2735 if (
offset != 0) {
return; }
2739 if (nddom.contains(i+1,j-1,k)) {
2740 Real tmp = fxy*sig(i ,j-1,k);
2742 if (gid(i+1,j-1,k) < gidmax) {
2744 cols[ps] = gid(i+1,j-1,k);
2750 if (
offset != 0) {
return; }
2754 if (nddom.contains(i-1,j,k)) {
2756 if ( ccdom.contains(i-1,j-1,k)) {
2757 tmp += f2xmy*sig(i-1,j-1,k);
2759 if ( ccdom.contains(i-1,j,k)) {
2760 tmp += f2xmy*sig(i-1,j,k);
2763 if (gid(i-1,j,k) < gidmax) {
2765 cols[ps] = gid(i-1,j,k);
2771 if (
offset != 0) {
return; }
2775 if (nddom.contains(i+1,j,k)) {
2777 if ( ccdom.contains(i ,j-1,k)) {
2778 tmp += f2xmy*sig(i ,j-1,k);
2780 if ( ccdom.contains(i ,j,k)) {
2781 tmp += f2xmy*sig(i ,j,k);
2784 if (gid(i+1,j,k) < gidmax) {
2786 cols[ps] = gid(i+1,j,k);
2792 if (
offset != 0) {
return; }
2796 if (nddom.contains(i-1,j+1,k)) {
2797 Real tmp = fxy*sig(i-1,j ,k);
2799 if (gid(i-1,j+1,k) < gidmax) {
2801 cols[ps] = gid(i-1,j+1,k);
2807 if (
offset != 0) {
return; }
2811 if (nddom.contains(i,j+1,k)) {
2813 if ( ccdom.contains(i-1,j ,k)) {
2814 tmp += sig(i-1,j ,k) * (fmx2y + fm);
2816 if ( ccdom.contains(i,j ,k)) {
2817 tmp += sig(i,j ,k) * (fmx2y - fp);
2820 if (gid(i,j+1,k) < gidmax) {
2822 cols[ps] = gid(i,j+1,k);
2828 if (
offset != 0) {
return; }
2832 if (nddom.contains(i+1,j+1,k)) {
2833 Real tmp = fxy*sig(i ,j ,k);
2835 if (gid(i+1,j+1,k) < gidmax) {
2837 cols[ps] = gid(i+1,j+1,k);
2843 if (
offset != 0) {
return; }
2847 cols[ps] = gid(i,j,k);
2849 ncols[lid(i,j,k)] = nelems+1;
2853template <
typename HypreInt,
typename AtomicInt>
2855void mlndlap_fillijmat_ha_gpu (
const int ps,
const int i,
const int j,
const int k,
2857 Box const& ndbx, Array4<AtomicInt const>
const& gid,
2858 Array4<int const>
const& lid,
2859 HypreInt* ncols, HypreInt* cols,
2861 Array4<Real const>
const& sx,
2862 Array4<Real const>
const& sy,
2863 GpuArray<Real,AMREX_SPACEDIM>
const& dxinv,
2864 Box const& ccdom,
bool is_rz)
noexcept
2866 if (lid(i,j,k) >= 0)
2868 Real facx =
Real(1.0/6.0)*dxinv[0]*dxinv[0];
2869 Real facy =
Real(1.0/6.0)*dxinv[1]*dxinv[1];
2873 fp = facy /
static_cast<Real>(2*i+1);
2874 fm = facy /
static_cast<Real>(2*i-1);
2876 fp = fm =
Real(0.0);
2881 constexpr auto gidmax = std::numeric_limits<AtomicInt>::max();
2886 if (nddom.contains(i-1,j-1,k)) {
2887 Real tmp = facx*sx(i-1,j-1,k) + facy*sy(i-1,j-1,k);
2889 if ( gid(i-1,j-1,k) < gidmax) {
2891 cols[ps] = gid(i-1,j-1,k);
2897 if (
offset != 0) {
return; }
2901 if (nddom.contains(i,j-1,k)) {
2903 if ( ccdom.contains(i-1,j-1,k)) {
2904 tmp += sy(i-1,j-1,k) * (facy *
Real(2.0) + fm)
2905 - sx(i-1,j-1,k) * facx;
2907 if ( ccdom.contains(i,j-1,k)) {
2908 tmp += sy(i,j-1,k) * (facy *
Real(2.0) - fp)
2909 - sx(i,j-1,k) * facx;
2912 if (gid(i,j-1,k) < gidmax) {
2914 cols[ps] = gid(i,j-1,k);
2920 if (
offset != 0) {
return; }
2924 if (nddom.contains(i+1,j-1,k)) {
2925 Real tmp = facx*sx(i ,j-1,k) + facy*sy(i ,j-1,k);
2927 if (gid(i+1,j-1,k) < gidmax) {
2929 cols[ps] = gid(i+1,j-1,k);
2935 if (
offset != 0) {
return; }
2939 if (nddom.contains(i-1,j,k)) {
2941 if ( ccdom.contains(i-1,j-1,k)) {
2942 tmp += sx(i-1,j-1,k) * facx*
Real(2.0)
2943 - sy(i-1,j-1,k) * facy;
2945 if ( ccdom.contains(i-1,j,k)) {
2946 tmp += sx(i-1,j,k) * facx*
Real(2.0)
2947 - sy(i-1,j,k) * facy;
2950 if (gid(i-1,j,k) < gidmax) {
2952 cols[ps] = gid(i-1,j,k);
2958 if (
offset != 0) {
return; }
2962 if (nddom.contains(i+1,j,k)) {
2964 if ( ccdom.contains(i ,j-1,k)) {
2965 tmp += sx(i ,j-1,k) * facx*
Real(2.0)
2966 - sy(i ,j-1,k) * facy;
2968 if ( ccdom.contains(i ,j,k)) {
2969 tmp += sx(i ,j,k) * facx*
Real(2.0)
2970 - sy(i ,j,k) * facy;
2973 if (gid(i+1,j,k) < gidmax) {
2975 cols[ps] = gid(i+1,j,k);
2981 if (
offset != 0) {
return; }
2985 if (nddom.contains(i-1,j+1,k)) {
2986 Real tmp = facx*sx(i-1,j ,k) + facy*sy(i-1,j ,k);
2988 if (gid(i-1,j+1,k) < gidmax) {
2990 cols[ps] = gid(i-1,j+1,k);
2996 if (
offset != 0) {
return; }
3000 if (nddom.contains(i,j+1,k)) {
3002 if ( ccdom.contains(i-1,j ,k)) {
3003 tmp += sy(i-1,j ,k) * (facy*
Real(2.0) + fm)
3004 - sx(i-1,j ,k) * facx;
3006 if ( ccdom.contains(i,j ,k)) {
3007 tmp += sy(i,j ,k) * (facy*
Real(2.0) - fp)
3008 - sx(i,j ,k) * facx;
3011 if (gid(i,j+1,k) < gidmax) {
3013 cols[ps] = gid(i,j+1,k);
3019 if (
offset != 0) {
return; }
3023 if (nddom.contains(i+1,j+1,k)) {
3024 Real tmp = facx*sx(i ,j ,k) + facy*sy(i ,j ,k);
3026 if (gid(i+1,j+1,k) < gidmax) {
3028 cols[ps] = gid(i+1,j+1,k);
3034 if (
offset != 0) {
return; }
3038 cols[ps] = gid(i,j,k);
3040 ncols[lid(i,j,k)] = nelems+1;
3044template <
typename HypreInt,
typename AtomicInt>
3046void mlndlap_fillijmat_cs_gpu (
const int ps,
const int i,
const int j,
const int k,
3048 Box const& ndbx, Array4<AtomicInt const>
const& gid,
3049 Array4<int const>
const& lid,
3050 HypreInt* ncols, HypreInt* cols,
3052 Real sig, GpuArray<Real,AMREX_SPACEDIM>
const& dxinv,
3053 Box const& ccdom,
bool is_rz)
noexcept
3055 if (lid(i,j,k) >= 0)
3057 Real facx =
Real(1.0/6.0)*dxinv[0]*dxinv[0] * sig;
3058 Real facy =
Real(1.0/6.0)*dxinv[1]*dxinv[1] * sig;
3059 Real fxy = facx + facy;
3060 Real f2xmy =
Real(2.0)*facx - facy;
3061 Real fmx2y =
Real(2.0)*facy - facx;
3065 fp = facy /
static_cast<Real>(2*i+1);
3066 fm = facy /
static_cast<Real>(2*i-1);
3068 fp = fm =
Real(0.0);
3074 constexpr auto gidmax = std::numeric_limits<AtomicInt>::max();
3079 if (nddom.contains(i-1,j-1,k)) {
3082 if ( gid(i-1,j-1,k) < gidmax) {
3084 cols[ps] = gid(i-1,j-1,k);
3090 if (
offset != 0) {
return; }
3094 if (nddom.contains(i,j-1,k)) {
3096 if ( ccdom.contains(i-1,j-1,k)) {
3099 if ( ccdom.contains(i,j-1,k)) {
3103 if (gid(i,j-1,k) < gidmax) {
3105 cols[ps] = gid(i,j-1,k);
3111 if (
offset != 0) {
return; }
3115 if (nddom.contains(i+1,j-1,k)) {
3118 if (gid(i+1,j-1,k) < gidmax) {
3120 cols[ps] = gid(i+1,j-1,k);
3126 if (
offset != 0) {
return; }
3130 if (nddom.contains(i-1,j,k)) {
3132 if ( ccdom.contains(i-1,j-1,k)) {
3135 if ( ccdom.contains(i-1,j,k)) {
3139 if (gid(i-1,j,k) < gidmax) {
3141 cols[ps] = gid(i-1,j,k);
3147 if (
offset != 0) {
return; }
3151 if (nddom.contains(i+1,j,k)) {
3153 if ( ccdom.contains(i ,j-1,k)) {
3156 if ( ccdom.contains(i ,j,k)) {
3160 if (gid(i+1,j,k) < gidmax) {
3162 cols[ps] = gid(i+1,j,k);
3168 if (
offset != 0) {
return; }
3172 if (nddom.contains(i-1,j+1,k)) {
3175 if (gid(i-1,j+1,k) < gidmax) {
3177 cols[ps] = gid(i-1,j+1,k);
3183 if (
offset != 0) {
return; }
3187 if (nddom.contains(i,j+1,k)) {
3189 if ( ccdom.contains(i-1,j ,k)) {
3192 if ( ccdom.contains(i,j ,k)) {
3196 if (gid(i,j+1,k) < gidmax) {
3198 cols[ps] = gid(i,j+1,k);
3204 if (
offset != 0) {
return; }
3208 if (nddom.contains(i+1,j+1,k)) {
3211 if (gid(i+1,j+1,k) < gidmax) {
3213 cols[ps] = gid(i+1,j+1,k);
3219 if (
offset != 0) {
return; }
3223 cols[ps] = gid(i,j,k);
3225 ncols[lid(i,j,k)] = nelems+1;
3236 return (i%2) + (j%2)*2;
3244 bool is_rz)
noexcept
3248 sol(i,j,k) =
Real(0.0);
3250 Real facx =
Real(1.0/6.0)*dxinv[0]*dxinv[0];
3251 Real facy =
Real(1.0/6.0)*dxinv[1]*dxinv[1];
3253 Real s0 =
Real(-2.0)*(facx*(sx(i-1,j-1,k)+sx(i,j-1,k)+sx(i-1,j,k)+sx(i,j,k))
3254 +facy*(sy(i-1,j-1,k)+sy(i,j-1,k)+sy(i-1,j,k)+sy(i,j,k)));
3256 Real Ax = sol(i-1,j-1,k)*(facx*sx(i-1,j-1,k)+facy*sy(i-1,j-1,k))
3257 + sol(i+1,j-1,k)*(facx*sx(i ,j-1,k)+facy*sy(i ,j-1,k))
3258 + sol(i-1,j+1,k)*(facx*sx(i-1,j ,k)+facy*sy(i-1,j ,k))
3259 + sol(i+1,j+1,k)*(facx*sx(i ,j ,k)+facy*sy(i ,j ,k))
3260 + sol(i-1,j,k)*(
Real(2.0)*facx*(sx(i-1,j-1,k)+sx(i-1,j,k))
3261 - facy*(sy(i-1,j-1,k)+sy(i-1,j,k)))
3262 + sol(i+1,j,k)*(
Real(2.0)*facx*(sx(i ,j-1,k)+sx(i ,j,k))
3263 - facy*(sy(i ,j-1,k)+sy(i ,j,k)))
3264 + sol(i,j-1,k)*( -facx*(sx(i-1,j-1,k)+sx(i,j-1,k))
3265 +
Real(2.0)*facy*(sy(i-1,j-1,k)+sy(i,j-1,k)))
3266 + sol(i,j+1,k)*( -facx*(sx(i-1,j ,k)+sx(i,j ,k))
3267 +
Real(2.0)*facy*(sy(i-1,j ,k)+sy(i,j ,k)))
3271 Real fp = facy /
static_cast<Real>(2*i+1);
3272 Real fm = facy /
static_cast<Real>(2*i-1);
3273 Real frzlo = fm*sy(i-1,j-1,k)-fp*sy(i,j-1,k);
3274 Real frzhi = fm*sy(i-1,j ,k)-fp*sy(i,j ,k);
3275 s0 += - frzhi - frzlo;
3276 Ax += frzhi*(sol(i,j+1,k)-sol(i,j,k))
3277 + frzlo*(sol(i,j-1,k)-sol(i,j,k));
3280 sol(i,j,k) += (rhs(i,j,k) - Ax) / s0;
3290 bool is_rz)
noexcept
3294 sol(i,j,k) =
Real(0.0);
3296 Real facx =
Real(1.0/6.0)*dxinv[0]*dxinv[0];
3297 Real facy =
Real(1.0/6.0)*dxinv[1]*dxinv[1];
3298 Real fxy = facx + facy;
3299 Real f2xmy =
Real(2.0)*facx - facy;
3300 Real fmx2y =
Real(2.0)*facy - facx;
3302 Real s0 = (-
Real(2.0))*fxy*(sig(i-1,j-1,k)+sig(i,j-1,k)+sig(i-1,j,k)+sig(i,j,k));
3303 Real Ax = sol(i-1,j-1,k)*fxy*sig(i-1,j-1,k)
3304 + sol(i+1,j-1,k)*fxy*sig(i ,j-1,k)
3305 + sol(i-1,j+1,k)*fxy*sig(i-1,j ,k)
3306 + sol(i+1,j+1,k)*fxy*sig(i ,j ,k)
3307 + sol(i-1,j,k)*f2xmy*(sig(i-1,j-1,k)+sig(i-1,j,k))
3308 + sol(i+1,j,k)*f2xmy*(sig(i ,j-1,k)+sig(i ,j,k))
3309 + sol(i,j-1,k)*fmx2y*(sig(i-1,j-1,k)+sig(i,j-1,k))
3310 + sol(i,j+1,k)*fmx2y*(sig(i-1,j ,k)+sig(i,j ,k))
3314 Real fp = facy /
static_cast<Real>(2*i+1);
3315 Real fm = facy /
static_cast<Real>(2*i-1);
3316 Real frzlo = fm*sig(i-1,j-1,k)-fp*sig(i,j-1,k);
3317 Real frzhi = fm*sig(i-1,j ,k)-fp*sig(i,j ,k);
3318 s0 += - frzhi - frzlo;
3319 Ax += frzhi*(sol(i,j+1,k)-sol(i,j,k))
3320 + frzlo*(sol(i,j-1,k)-sol(i,j,k));
3323 sol(i,j,k) += (rhs(i,j,k) - Ax) / s0;
3333 bool is_rz)
noexcept
3337 sol(i,j,k) =
Real(0.0);
3339 Real facx =
Real(1.0/6.0)*dxinv[0]*dxinv[0];
3340 Real facy =
Real(1.0/6.0)*dxinv[1]*dxinv[1];
3341 Real fxy = facx + facy;
3342 Real f2xmy =
Real(2.0)*facx - facy;
3343 Real fmx2y =
Real(2.0)*facy - facx;
3346 Real Ax = sol(i-1,j-1,k)*fxy
3347 + sol(i+1,j-1,k)*fxy
3348 + sol(i-1,j+1,k)*fxy
3349 + sol(i+1,j+1,k)*fxy
3350 + sol(i-1,j,k)*f2xmy*
Real(2.)
3351 + sol(i+1,j,k)*f2xmy*
Real(2.)
3352 + sol(i,j-1,k)*fmx2y*
Real(2.)
3353 + sol(i,j+1,k)*fmx2y*
Real(2.)
3357 Real fp = facy /
static_cast<Real>(2*i+1);
3358 Real fm = facy /
static_cast<Real>(2*i-1);
3361 s0 += - frzhi - frzlo;
3362 Ax += frzhi*(sol(i,j+1,k)-sol(i,j,k))
3363 + frzlo*(sol(i,j-1,k)-sol(i,j,k));
3366 sol(i,j,k) += (rhs(i,j,k) - Ax*sig) / (s0*sig);
3373 Array4<Real const>
const& rhs,
3374 Array4<Real const>
const& sten,
3375 Array4<int const>
const& msk,
int color)
noexcept
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_GPU_DEVICE
Definition AMReX_GpuQualifiers.H:18
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
int idir
Definition AMReX_HypreMLABecLap.cpp:1093
Array4< int const > offset
Definition AMReX_HypreMLABecLap.cpp:1089
Array4< Real > fine
Definition AMReX_InterpFaceRegister.cpp:90
Array4< Real const > crse
Definition AMReX_InterpFaceRegister.cpp:92
#define AMREX_LOOP_3D(bx, i, j, k, block)
Definition AMReX_Loop.nolint.H:4
HYPRE_Int Int
Definition AMReX_HypreNodeLap.H:36
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:79
__host__ __device__ BoxND< dim > coarsen(const BoxND< dim > &b, int ref_ratio) noexcept
Coarsen BoxND by given (positive) coarsening ratio.
Definition AMReX_Box.H:1409
Definition AMReX_Amr.cpp:49
__host__ __device__ Dim3 ubound(Array4< T > const &a) noexcept
Definition AMReX_Array4.H:319
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void mlndlap_jacobi_ha(int i, int, int, Array4< Real > const &sol, Real Ax, Array4< Real const > const &rhs, Array4< Real const > const &sx, Array4< int const > const &msk, GpuArray< Real, 3 > const &dxinv) noexcept
Definition AMReX_MLNodeLap_1D_K.H:92
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_set_connection(int i, int j, int, Array4< Real > const &conn, Array4< Real const > const &intg, Array4< Real const > const &vol, Array4< EBCellFlag const > const &flag) noexcept
Definition AMReX_MLNodeLap_2D_K.H:1689
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real mlndlap_adotx_aa(int i, int j, int k, Array4< Real const > const &x, Array4< Real const > const &sx, Array4< int const > const &msk, GpuArray< Real, 3 > const &dxinv) noexcept
Definition AMReX_MLNodeLap_1D_K.H:66
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_mknewu_c(int i, int, int, Array4< Real > const &u, Array4< Real const > const &p, Real sig, GpuArray< Real, 3 > const &dxinv) noexcept
Definition AMReX_MLNodeLap_1D_K.H:322
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void mlndlap_gscolor_ha(int i, int j, int k, Array4< Real > const &sol, Array4< Real const > const &rhs, Array4< Real const > const &sx, Array4< int const > const &msk, GpuArray< Real, 3 > const &dxinv, int color) noexcept
Definition AMReX_MLNodeLap_1D_K.H:426
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_divu_fine_contrib(int i, int j, int, Box const &fvbx, Box const &velbx, Array4< Real > const &rhs, Array4< Real const > const &vel, Array4< Real const > const &frhs, Array4< int const > const &msk, GpuArray< Real, 3 > const &dxinv, bool is_rz) noexcept
Definition AMReX_MLNodeLap_2D_K.H:867
__host__ __device__ BoxND< dim > surroundingNodes(const BoxND< dim > &b, int dir) noexcept
Return a BoxND with NODE based coordinates in direction dir that encloses BoxND b....
Definition AMReX_Box.H:1522
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_semi_avgdown_coeff(int i, int j, int k, Array4< Real > const &crse, Array4< Real const > const &fine, int) noexcept
Definition AMReX_MLNodeLap_1D_K.H:30
void mlndlap_gauss_seidel_aa(Box const &bx, Array4< Real > const &sol, Array4< Real const > const &rhs, Array4< Real const > const &sx, Array4< int const > const &msk, GpuArray< Real, 3 > const &dxinv) noexcept
Definition AMReX_MLNodeLap_1D_K.H:193
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_interpadd_rap(int, int, int, Array4< Real > const &, Array4< Real const > const &, Array4< Real const > const &, Array4< int const > const &) noexcept
Definition AMReX_MLNodeLap_1D_K.H:408
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_avgdown_coeff_y(int i, int j, int k, Array4< Real > const &crse, Array4< Real const > const &fine) noexcept
Definition AMReX_MLNodeLap_2D_K.H:36
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void mlndlap_gscolor_aa(int i, int j, int k, Array4< Real > const &sol, Array4< Real const > const &rhs, Array4< Real const > const &sx, Array4< int const > const &msk, GpuArray< Real, 3 > const &dxinv, int color) noexcept
Definition AMReX_MLNodeLap_1D_K.H:448
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_normalize_ha(int i, int, int, Array4< Real > const &x, Array4< Real const > const &sx, Array4< int const > const &msk, GpuArray< Real, 3 > const &dxinv) noexcept
Definition AMReX_MLNodeLap_1D_K.H:74
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real mlndlap_adotx_sten(int, int, int, Array4< Real const > const &, Array4< Real const > const &, Array4< int const > const &) noexcept
Definition AMReX_MLNodeLap_1D_K.H:396
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_interpadd_c(int i, int, int, Array4< Real > const &fine, Array4< Real const > const &crse, Array4< int const > const &msk) noexcept
Definition AMReX_MLNodeLap_1D_K.H:233
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_set_stencil_s0(int, int, int, Array4< Real > const &) noexcept
Definition AMReX_MLNodeLap_1D_K.H:387
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_crse_resid(int, int, int, Array4< Real > const &, Array4< Real const > const &, Array4< int const > const &, Box const &, GpuArray< LinOpBCType, 3 > const &, GpuArray< LinOpBCType, 3 > const &, bool) noexcept
Definition AMReX_MLNodeLap_1D_K.H:349
void mlndlap_gauss_seidel_with_line_solve_aa(Box const &, Array4< Real > const &, Array4< Real const > const &, Array4< Real const > const &, Array4< int const > const &, GpuArray< Real, 3 > const &) noexcept
Definition AMReX_MLNodeLap_1D_K.H:225
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void mlndlap_gscolor_c(int i, int j, int k, Array4< Real > const &sol, Array4< Real const > const &rhs, Real sig, Array4< int const > const &msk, GpuArray< Real, 3 > const &dxinv, int color) noexcept
Definition AMReX_MLNodeLap_1D_K.H:458
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_mknewu_eb(int i, int j, int, Array4< Real > const &u, Array4< Real const > const &p, Array4< Real const > const &sig, Array4< Real const > const &vfrac, Array4< Real const > const &intg, GpuArray< Real, 3 > const &dxinv) noexcept
Definition AMReX_MLNodeLap_2D_K.H:1818
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_Ax_fine_contrib_cs(int i, int j, int, Box const &ndbx, Box const &ccbx, Array4< Real > const &f, Array4< Real const > const &res, Array4< Real const > const &rhs, Array4< Real const > const &phi, Real const sig, Array4< int const > const &msk, bool is_rz, GpuArray< Real, 3 > const &dxinv) noexcept
Definition AMReX_MLNodeLap_2D_K.H:1157
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_res_cf_contrib_cs(int, int, int, Array4< Real > const &, Array4< Real const > const &, Array4< Real const > const &, Real, Array4< int const > const &, Array4< int const > const &, Array4< int const > const &, Array4< Real const > const &, GpuArray< Real, 3 > const &, Box const &, GpuArray< LinOpBCType, 3 > const &, GpuArray< LinOpBCType, 3 > const &, bool) noexcept
Definition AMReX_MLNodeLap_1D_K.H:369
BoxND< 3 > Box
Box is an alias for amrex::BoxND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:27
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real mlndlap_sum_Ax(P const &pred, S const &sig, int i, int j, Real facx, Real facy, Array4< Real const > const &phi, bool is_rz) noexcept
Definition AMReX_MLNodeLap_2D_K.H:1057
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_mknewu_eb_c(int i, int j, int, Array4< Real > const &u, Array4< Real const > const &p, Real sig, Array4< Real const > const &vfrac, Array4< Real const > const &intg, GpuArray< Real, 3 > const &dxinv) noexcept
Definition AMReX_MLNodeLap_2D_K.H:1836
__host__ __device__ constexpr const T & min(const T &a, const T &b) noexcept
Definition AMReX_Algorithm.H:21
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_mknewu(int i, int, int, Array4< Real > const &u, Array4< Real const > const &p, Array4< Real const > const &sig, GpuArray< Real, 3 > const &dxinv) noexcept
Definition AMReX_MLNodeLap_1D_K.H:312
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_rhcc_fine_contrib(int, int, int, Box const &, Array4< Real > const &, Array4< Real const > const &, Array4< int const > const &) noexcept
Definition AMReX_MLNodeLap_1D_K.H:332
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_semi_interpadd_aa(int, int, int, Array4< Real > const &, Array4< Real const > const &, Array4< Real const > const &, Array4< int const > const &, int) noexcept
Definition AMReX_MLNodeLap_1D_K.H:270
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_set_stencil(Box const &, Array4< Real > const &, Array4< Real const > const &, GpuArray< Real, 3 > const &) noexcept
Definition AMReX_MLNodeLap_1D_K.H:381
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real neumann_scale(int i, int j, Box const &nddom, GpuArray< LinOpBCType, 3 > const &bclo, GpuArray< LinOpBCType, 3 > const &bchi) noexcept
Definition AMReX_MLNodeLap_2D_K.H:930
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real aa_interp_line_y(Array4< Real const > const &crse, Array4< Real const > const &sig, int i, int j, int ic, int jc) noexcept
Definition AMReX_MLNodeLap_2D_K.H:582
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_set_integral_eb(int i, int j, int, Array4< Real > const &intg, Array4< EBCellFlag const > const &flag, Array4< Real const > const &vol, Array4< Real const > const &ax, Array4< Real const > const &ay, Array4< Real const > const &bcen) noexcept
Definition AMReX_MLNodeLap_2D_K.H:1894
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_zero_fine(int i, int, int, Array4< Real > const &phi, Array4< int const > const &msk, int fine_flag) noexcept
Definition AMReX_MLNodeLap_1D_K.H:8
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_Ax_fine_contrib_doit(S const &sig, int i, int j, Box const &ndbx, Box const &ccbx, Array4< Real > const &f, Array4< Real const > const &res, Array4< Real const > const &rhs, Array4< Real const > const &phi, Array4< int const > const &msk, bool is_rz, GpuArray< Real, 3 > const &dxinv) noexcept
Definition AMReX_MLNodeLap_2D_K.H:1099
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_set_stencil_eb(int i, int j, int, Array4< Real > const &sten, Array4< Real const > const &sig, Array4< Real const > const &conn, GpuArray< Real, 3 > const &dxinv) noexcept
Definition AMReX_MLNodeLap_2D_K.H:1713
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_normalize_aa(int i, int j, int k, Array4< Real > const &x, Array4< Real const > const &sx, Array4< int const > const &msk, GpuArray< Real, 3 > const &dxinv) noexcept
Definition AMReX_MLNodeLap_1D_K.H:84
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real ha_interp_face_xy(Array4< Real const > const &crse, Array4< Real const > const &sigx, Array4< Real const > const &sigy, int i, int j, int ic, int jc) noexcept
Definition AMReX_MLNodeLap_2D_K.H:694
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_interpadd_aa(int i, int, int, Array4< Real > const &fine, Array4< Real const > const &crse, Array4< Real const > const &sig, Array4< int const > const &msk) noexcept
Definition AMReX_MLNodeLap_1D_K.H:251
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_set_integral(int i, int j, int, Array4< Real > const &intg) noexcept
Definition AMReX_MLNodeLap_2D_K.H:1872
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_divu(int i, int, int, Array4< Real > const &rhs, Array4< Real const > const &vel, Array4< int const > const &msk, GpuArray< Real, 3 > const &dxinv, Box const &, GpuArray< LinOpBCType, 3 > const &, GpuArray< LinOpBCType, 3 > const &) noexcept
Definition AMReX_MLNodeLap_1D_K.H:284
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_Ax_fine_contrib(int i, int j, int, Box const &ndbx, Box const &ccbx, Array4< Real > const &f, Array4< Real const > const &res, Array4< Real const > const &rhs, Array4< Real const > const &phi, Array4< Real const > const &sig, Array4< int const > const &msk, bool is_rz, GpuArray< Real, 3 > const &dxinv) noexcept
Definition AMReX_MLNodeLap_2D_K.H:1143
void mlndlap_gauss_seidel_sten(Box const &, Array4< Real > const &, Array4< Real const > const &, Array4< Real const > const &, Array4< int const > const &) noexcept
Definition AMReX_MLNodeLap_1D_K.H:401
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real mlndlap_rhcc_eb(int i, int j, int, Array4< Real const > const &rhcc, Array4< Real const > const &vfrac, Array4< Real const > const &intg, Array4< int const > const &msk) noexcept
Definition AMReX_MLNodeLap_2D_K.H:1854
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real mlndlap_adotx_ha(int i, int, int, Array4< Real const > const &x, Array4< Real const > const &sx, Array4< int const > const &msk, GpuArray< Real, 3 > const &dxinv) noexcept
Definition AMReX_MLNodeLap_1D_K.H:52
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void mlndlap_jacobi_c(int i, int, int, Array4< Real > const &sol, Real Ax, Array4< Real const > const &rhs, Real sig, Array4< int const > const &msk, GpuArray< Real, 3 > const &dxinv) noexcept
Definition AMReX_MLNodeLap_1D_K.H:141
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_set_surface_integral(int i, int j, int, Array4< Real > const &sintg) noexcept
Definition AMReX_MLNodeLap_2D_K.H:1884
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_gscolor_sten(int, int, int, Array4< Real > const &, Array4< Real const > const &, Array4< Real const > const &, Array4< int const > const &, int) noexcept
Definition AMReX_MLNodeLap_1D_K.H:479
__host__ __device__ constexpr const T & max(const T &a, const T &b) noexcept
Definition AMReX_Algorithm.H:35
void mlndlap_gauss_seidel_ha(Box const &bx, Array4< Real > const &sol, Array4< Real const > const &rhs, Array4< Real const > const &sx, Array4< int const > const &msk, GpuArray< Real, 3 > const &dxinv) noexcept
Definition AMReX_MLNodeLap_1D_K.H:170
void mlndlap_gauss_seidel_c(Box const &bx, Array4< Real > const &sol, Array4< Real const > const &rhs, Real sig, Array4< int const > const &msk, GpuArray< Real, 3 > const &dxinv) noexcept
Definition AMReX_MLNodeLap_1D_K.H:203
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real mlndlap_adotx_c(int i, int, int, Array4< Real const > const &x, Real sigma, Array4< int const > const &msk, GpuArray< Real, 3 > const &dxinv) noexcept
Definition AMReX_MLNodeLap_1D_K.H:37
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_divu_cf_contrib(int, int, int, Array4< Real > const &, Array4< Real const > const &, Array4< Real const > const &, Array4< Real const > const &, Array4< int const > const &, Array4< int const > const &, Array4< int const > const &, GpuArray< Real, 3 > const &, Box const &, GpuArray< LinOpBCType, 3 > const &, GpuArray< LinOpBCType, 3 > const &, bool) noexcept
Definition AMReX_MLNodeLap_1D_K.H:338
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_restriction_rap(int, int, int, Array4< Real > const &, Array4< Real const > const &, Array4< Real const > const &, Array4< int const > const &) noexcept
Definition AMReX_MLNodeLap_1D_K.H:414
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void add_eb_flow_contribution(int i, int j, int, Array4< Real > const &rhs, Array4< int const > const &msk, GpuArray< Real, 3 > const &dxinv, Array4< Real const > const &bareaarr, Array4< Real const > const &sintg, Array4< Real const > const &eb_vel_dot_n) noexcept
Definition AMReX_MLNodeLap_2D_K.H:1786
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_set_surface_integral_eb(int i, int j, int, Array4< Real > const &sintg, Array4< EBCellFlag const > const &flag, Array4< Real const > const &bcen, Array4< Real const > const &barea, Array4< Real const > const &bnorm) noexcept
Definition AMReX_MLNodeLap_2D_K.H:1995
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real mlndlap_sum_Df(int ii, int jj, Real facx, Real facy, Array4< Real const > const &vel, Box const &velbx, bool is_rz) noexcept
Definition AMReX_MLNodeLap_2D_K.H:843
void LoopConcurrentOnCpu(Dim3 lo, Dim3 hi, F const &f) noexcept
Definition AMReX_Loop.H:388
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real aa_interp_face_xy(Array4< Real const > const &crse, Array4< Real const > const &sig, int i, int j, int ic, int jc) noexcept
Definition AMReX_MLNodeLap_2D_K.H:591
AMREX_GPU_DEVICE AMREX_FORCE_INLINE int mlndlap_color(int i, int, int)
Definition AMReX_MLNodeLap_1D_K.H:420
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition AMReX.cpp:230
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void mlndlap_jacobi_aa(int i, int j, int k, Array4< Real > const &sol, Real Ax, Array4< Real const > const &rhs, Array4< Real const > const &sig, Array4< int const > const &msk, GpuArray< Real, 3 > const &dxinv) noexcept
Definition AMReX_MLNodeLap_1D_K.H:125
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_avgdown_coeff_x(int i, int, int, Array4< Real > const &crse, Array4< Real const > const &fine) noexcept
Definition AMReX_MLNodeLap_1D_K.H:21
void LoopOnCpu(Dim3 lo, Dim3 hi, F const &f) noexcept
Definition AMReX_Loop.H:365
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_interpadd_ha(int i, int j, int k, Array4< Real > const &fine, Array4< Real const > const &crse, Array4< Real const > const &sig, Array4< int const > const &msk) noexcept
Definition AMReX_MLNodeLap_1D_K.H:276
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real aa_interp_line_x(Array4< Real const > const &crse, Array4< Real const > const &sig, int i, int j, int ic, int jc) noexcept
Definition AMReX_MLNodeLap_2D_K.H:573
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_stencil_rap(int, int, int, Array4< Real > const &, Array4< Real const > const &) noexcept
Definition AMReX_MLNodeLap_1D_K.H:391
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real mlndlap_adotx_sten_doit(int i, int j, int k, Array4< Real const > const &x, Array4< Real const > const &sten) noexcept
Definition AMReX_MLNodeLap_2D_K.H:1507
AMREX_FORCE_INLINE void tridiagonal_solve(Array1D< T, 0, 31 > &a_ls, Array1D< T, 0, 31 > &b_ls, Array1D< T, 0, 31 > &c_ls, Array1D< T, 0, 31 > &r_ls, Array1D< T, 0, 31 > &u_ls, Array1D< T, 0, 31 > &gam, int ilen) noexcept
Definition AMReX_MLABecLap_3D_K.H:432
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real mlndlap_rhcc(int i, int, int, Array4< Real const > const &rhcc, Array4< int const > const &msk) noexcept
Definition AMReX_MLNodeLap_1D_K.H:299
__host__ __device__ IntVectND< dim > scale(const IntVectND< dim > &p, int s) noexcept
Returns a IntVectND obtained by multiplying each of the components of this IntVectND by s.
Definition AMReX_IntVect.H:1016
__host__ __device__ void LoopConcurrent(Dim3 lo, Dim3 hi, F const &f) noexcept
Definition AMReX_Loop.H:152
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_divu_eb(int i, int j, int, Array4< Real > const &rhs, Array4< Real const > const &vel, Array4< Real const > const &vfrac, Array4< Real const > const &intg, Array4< int const > const &msk, GpuArray< Real, 3 > const &dxinv, Box const &nodal_domain, GpuArray< LinOpBCType, 3 > const &bclo, GpuArray< LinOpBCType, 3 > const &bchi) noexcept
Definition AMReX_MLNodeLap_2D_K.H:1729
__host__ __device__ Dim3 lbound(Array4< T > const &a) noexcept
Definition AMReX_Array4.H:312
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void mlndlap_res_cf_contrib(int, int, int, Array4< Real > const &, Array4< Real const > const &, Array4< Real const > const &, Array4< Real const > const &, Array4< int const > const &, Array4< int const > const &, Array4< int const > const &, Array4< Real const > const &, GpuArray< Real, 3 > const &, Box const &, GpuArray< LinOpBCType, 3 > const &, GpuArray< LinOpBCType, 3 > const &, bool) noexcept
Definition AMReX_MLNodeLap_1D_K.H:357
Definition AMReX_Array.H:199
Definition AMReX_Array4.H:61
Fixed-size array that can be used on GPU.
Definition AMReX_Array.H:40