11#include < cctk.h>
2+ #include < cctk_Parameters.h>
23
34#include < loop_device.hxx>
45#include < driver.hxx>
@@ -207,6 +208,7 @@ void NewRadX_Apply(const cGH *restrict const cctkGH,
207208 using namespace CapyrX ::MultiPatch::GlobalDerivatives;
208209
209210 DECLARE_CCTK_ARGUMENTS;
211+ DECLARE_CCTK_PARAMETERS;
210212
211213 const auto symmetries = CarpetX::ghext->patchdata .at (cctk_patch).symmetries ;
212214 const vect<vect<bool , Loop::dim>, 2 > is_sym_bnd{
@@ -221,35 +223,41 @@ void NewRadX_Apply(const cGH *restrict const cctkGH,
221223 grid.loop_outermost_int_device <0 , 0 , 0 >(
222224 grid.nghostzones , is_sym_bnd,
223225 [=] CCTK_DEVICE (const Loop::PointDesc &p) CCTK_ATTRIBUTE_ALWAYS_INLINE {
224- // Make sure we are always on the outer boundary of a patch system
225- assert (p.patch != 0 );
226- assert (p.NI [2 ] >= 0 );
226+ // Skip inner radial boundary unless requested
227+ if (!apply_inner_boundary && p.NI [2 ] == -1 ) {
228+ return ;
229+ }
230+
231+ // At the outer boundary absorb outgoing waves; at the inner
232+ // boundary absorb incoming waves (flip sign of v0).
233+ const CCTK_REAL sign = (p.NI [2 ] == -1 ) ? -1.0 : 1.0 ;
234+ const auto sv0 = sign * v0;
227235
228236 // Find local wave speeds at radiative boundary point p.I
229237 const auto x = vcoordx (p.I );
230238 const auto y = vcoordy (p.I );
231239 const auto z = vcoordz (p.I );
232240 const auto r = sqrt (pow2 (x) + pow2 (y) + pow2 (z));
233241
234- const auto vx = v0 * vcoordx (p. I ) / r;
235- const auto vy = v0 * vcoordy (p. I ) / r;
236- const auto vz = v0 * vcoordz (p. I ) / r;
242+ const auto vx = sv0 * x / r;
243+ const auto vy = sv0 * y / r;
244+ const auto vz = sv0 * z / r;
237245
238- // Local derivatives
239- const LocalFirstDerivatives l_dvar{.da = r2o <0 >(p, p. I , var),
240- .db = r2o <1 >(p, p. I , var),
241- .dc = r2o <2 >(p, p. I , var)};
246+ // Local derivatives (stencil auto-selected by boundary location)
247+ const LocalFirstDerivatives l_dvar{.da = calc_deriv <0 >(p, var),
248+ .db = calc_deriv <1 >(p, var),
249+ .dc = calc_deriv <2 >(p, var)};
242250
243251 // Global derivatives
244252 const Jacobians jac{VERTEX_JACOBIANS (p)};
245253 const auto g_dvar{project_first (l_dvar, jac)};
246254
247255 // radiative rhs
248256 rhs (p.I ) = -vx * g_dvar.dx - vy * g_dvar.dy - vz * g_dvar.dz -
249- v0 * (var (p.I ) - var0) / r;
257+ sv0 * (var (p.I ) - var0) / r;
250258
251259 if (radpower > 0.0 ) {
252- // TODO
260+ // TODO: Coulomb correction (port from Cartesian overload)
253261 }
254262 });
255263}
0 commit comments