CarpetX: a Cactus driver for the Einstein Toolkit based on AMReX
#include <loop.hxx>

#include <cctk.h>
#include <cctk_Arguments_Checked.h>
#include <cctk_Parameters.h>

namespace Coordinates {

extern "C" void Coordinates_Setup(CCTK_ARGUMENTS) {
  DECLARE_CCTK_ARGUMENTS_Coordinates_Setup;
  DECLARE_CCTK_PARAMETERS;

  const Loop::GF3D<CCTK_REAL, 0, 0, 0> vcoordx_(cctkGH, vcoordx);
  const Loop::GF3D<CCTK_REAL, 0, 0, 0> vcoordy_(cctkGH, vcoordy);
  const Loop::GF3D<CCTK_REAL, 0, 0, 0> vcoordz_(cctkGH, vcoordz);

  const Loop::GF3D<CCTK_REAL, 1, 1, 1> ccoordx_(cctkGH, ccoordx);
  const Loop::GF3D<CCTK_REAL, 1, 1, 1> ccoordy_(cctkGH, ccoordy);
  const Loop::GF3D<CCTK_REAL, 1, 1, 1> ccoordz_(cctkGH, ccoordz);

  const Loop::GF3D<CCTK_REAL, 1, 1, 1> cvol_(cctkGH, cvol);

  Loop::loop_all<0, 0, 0>(
      cctkGH, [&](const Loop::PointDesc &p) { vcoordx_(p.I) = p.x; });
  Loop::loop_all<0, 0, 0>(
      cctkGH, [&](const Loop::PointDesc &p) { vcoordy_(p.I) = p.y; });
  Loop::loop_all<0, 0, 0>(
      cctkGH, [&](const Loop::PointDesc &p) { vcoordz_(p.I) = p.z; });

  Loop::loop_all<1, 1, 1>(
      cctkGH, [&](const Loop::PointDesc &p) { ccoordx_(p.I) = p.x; });
  Loop::loop_all<1, 1, 1>(
      cctkGH, [&](const Loop::PointDesc &p) { ccoordy_(p.I) = p.y; });
  Loop::loop_all<1, 1, 1>(
      cctkGH, [&](const Loop::PointDesc &p) { ccoordz_(p.I) = p.z; });

  Loop::loop_all<1, 1, 1>(cctkGH, [&](const Loop::PointDesc &p) {
    cvol_(p.I) = p.dx * p.dy * p.dz;
  });
}

} // namespace Coordinates