aboutsummaryrefslogtreecommitdiff
path: root/src/qlm_interpolate.F90
diff options
context:
space:
mode:
Diffstat (limited to 'src/qlm_interpolate.F90')
-rw-r--r--src/qlm_interpolate.F90602
1 files changed, 602 insertions, 0 deletions
diff --git a/src/qlm_interpolate.F90 b/src/qlm_interpolate.F90
new file mode 100644
index 0000000..82ec27e
--- /dev/null
+++ b/src/qlm_interpolate.F90
@@ -0,0 +1,602 @@
+#include "cctk.h"
+#include "cctk_Arguments.h"
+#include "cctk_Functions.h"
+#include "cctk_Parameters.h"
+
+
+
+! TODO:
+! instead of interpolating to the symmetry points, copy them
+
+
+
+! A convenient shortcut
+#define P(x) CCTK_PointerTo(x)
+
+
+
+subroutine qlm_interpolate (CCTK_ARGUMENTS, hn)
+ use cctk
+ use qlm_variables
+ implicit none
+ DECLARE_CCTK_ARGUMENTS
+ DECLARE_CCTK_FUNCTIONS
+ DECLARE_CCTK_PARAMETERS
+ integer :: hn
+
+ CCTK_INT, parameter :: izero = 0
+ integer, parameter :: ik = kind(izero)
+ integer, parameter :: sk = kind(interpolator)
+ CCTK_REAL, parameter :: one = 1
+
+ integer :: len_coordsystem
+ integer :: len_interpolator
+ integer :: len_interpolator_options
+
+ character :: fort_coordsystem*100
+ character :: fort_interpolator*100
+ character :: fort_interpolator_options*1000
+
+ integer :: nvars
+
+ integer :: coord_handle
+ integer :: interp_handle
+ integer :: options_table
+
+ integer :: ninputs
+ integer :: noutputs
+
+ CCTK_REAL, allocatable :: xcoord(:,:)
+ CCTK_REAL, allocatable :: ycoord(:,:)
+ CCTK_REAL, allocatable :: zcoord(:,:)
+
+ integer :: ind_gxx, ind_gxy, ind_gxz, ind_gyy, ind_gyz, ind_gzz
+ integer :: ind_kxx, ind_kxy, ind_kxz, ind_kyy, ind_kyz, ind_kzz
+ integer :: ind_alpha
+ integer :: ind_betax, ind_betay, ind_betaz
+
+ integer :: coord_type
+ CCTK_POINTER :: coords(3)
+ CCTK_INT :: inputs(16)
+ CCTK_INT :: output_types(88)
+ CCTK_POINTER :: outputs(88)
+ CCTK_INT :: operand_indices(88)
+ CCTK_INT :: operation_codes(88)
+ integer :: npoints
+
+ character :: msg*1000
+
+ integer :: ni, nj
+
+ integer :: ierr
+
+
+
+ if (veryverbose/=0) then
+ call CCTK_INFO ("Interpolating 3d grid functions")
+ end if
+
+
+
+ if (shift_state==0) then
+ call CCTK_WARN (0, "The shift must have storage")
+ end if
+
+
+
+ ! Get coordinate system
+ call CCTK_FortranString &
+ (len_coordsystem, int(coordsystem,sk), fort_coordsystem)
+ call CCTK_CoordSystemHandle (coord_handle, fort_coordsystem)
+ if (coord_handle<0) then
+ write (msg, '("The coordinate system """, a, """ does not exist")') &
+ trim(fort_coordsystem)
+ call CCTK_WARN (0, msg)
+ end if
+
+ ! Get interpolator
+ call CCTK_FortranString &
+ (len_interpolator, int(interpolator,sk), fort_interpolator)
+ call CCTK_InterpHandle (interp_handle, fort_interpolator)
+ if (interp_handle<0) then
+ write (msg, '("The interpolator """,a,""" does not exist")') &
+ trim(fort_interpolator)
+ call CCTK_WARN (0, msg)
+ end if
+
+ ! Get interpolator options
+ call CCTK_FortranString &
+ (len_interpolator_options, int(interpolator_options,sk), &
+ fort_interpolator_options)
+ call Util_TableCreateFromString (options_table, fort_interpolator_options)
+ if (options_table<0) then
+ write (msg, '("The interpolator_options """,a,""" have a wrong syntax")') &
+ trim(fort_interpolator_options)
+ call CCTK_WARN (0, msg)
+ end if
+
+
+
+ if (hn > 0) then
+
+ ni = qlm_ntheta(hn)
+ nj = qlm_nphi(hn)
+
+ allocate (xcoord(ni,nj))
+ allocate (ycoord(ni,nj))
+ allocate (zcoord(ni,nj))
+
+ xcoord(:,:) = qlm_x(:ni,:nj,hn)
+ ycoord(:,:) = qlm_y(:ni,:nj,hn)
+ zcoord(:,:) = qlm_z(:ni,:nj,hn)
+
+ end if
+
+
+
+ ! TODO: check the excision mask
+
+ ! Get variable indices
+ call CCTK_VarIndex (ind_gxx , "ADMBase::gxx" )
+ call CCTK_VarIndex (ind_gxy , "ADMBase::gxy" )
+ call CCTK_VarIndex (ind_gxz , "ADMBase::gxz" )
+ call CCTK_VarIndex (ind_gyy , "ADMBase::gyy" )
+ call CCTK_VarIndex (ind_gyz , "ADMBase::gyz" )
+ call CCTK_VarIndex (ind_gzz , "ADMBase::gzz" )
+ call CCTK_VarIndex (ind_kxx , "ADMBase::kxx" )
+ call CCTK_VarIndex (ind_kxy , "ADMBase::kxy" )
+ call CCTK_VarIndex (ind_kxz , "ADMBase::kxz" )
+ call CCTK_VarIndex (ind_kyy , "ADMBase::kyy" )
+ call CCTK_VarIndex (ind_kyz , "ADMBase::kyz" )
+ call CCTK_VarIndex (ind_kzz , "ADMBase::kzz" )
+ call CCTK_VarIndex (ind_alpha, "ADMBase::alp" )
+ call CCTK_VarIndex (ind_betax, "ADMBase::betax")
+ call CCTK_VarIndex (ind_betay, "ADMBase::betay")
+ call CCTK_VarIndex (ind_betaz, "ADMBase::betaz")
+
+
+
+ ! Set up the interpolator arguments
+ coord_type = CCTK_VARIABLE_REAL
+ if (hn > 0) then
+ npoints = ni * nj
+ coords(:) = (/ P(xcoord), P(ycoord), P(zcoord) /)
+ else
+ npoints = 0
+ coords(:) = CCTK_NullPointer()
+ end if
+
+ inputs = (/ &
+ ind_gxx, ind_gxy, ind_gxz, ind_gyy, ind_gyz, ind_gzz, &
+ ind_kxx, ind_kxy, ind_kxz, ind_kyy, ind_kyz, ind_kzz, &
+ ind_alpha, &
+ ind_betax, ind_betay, ind_betaz /)
+ call CCTK_NumVars (nvars)
+ if (nvars < 0) call CCTK_WARN (0, "internal error")
+ if (any(inputs /= -1 .and. (inputs < 0 .or. inputs >= nvars))) then
+ call CCTK_WARN (0, "internal error")
+ end if
+
+ operand_indices = (/ &
+ 00, 01, 02, 03, 04, 05, & ! g_ij
+ 00, 01, 02, 03, 04, 05, & ! g_ij,k
+ 00, 01, 02, 03, 04, 05, &
+ 00, 01, 02, 03, 04, 05, &
+ 00, 01, 02, 03, 04, 05, & ! g_ij,kl
+ 00, 01, 02, 03, 04, 05, &
+ 00, 01, 02, 03, 04, 05, &
+ 00, 01, 02, 03, 04, 05, &
+ 00, 01, 02, 03, 04, 05, &
+ 00, 01, 02, 03, 04, 05, &
+ 06, 07, 08, 09, 10, 11, & ! K_ij
+ 06, 07, 08, 09, 10, 11, & ! K_ij,k
+ 06, 07, 08, 09, 10, 11, &
+ 06, 07, 08, 09, 10, 11, &
+ 12, & ! alp
+ 13, 14, 15 /) ! beta^i
+
+ operation_codes = (/ &
+ 0, 0, 0, 0, 0, 0, & ! g_ij
+ 1, 1, 1, 1, 1, 1, & ! g_ij,k
+ 2, 2, 2, 2, 2, 2, &
+ 3, 3, 3, 3, 3, 3, &
+ 11, 11, 11, 11, 11, 11, & ! g_ij,kl
+ 12, 12, 12, 12, 12, 12, &
+ 13, 13, 13, 13, 13, 13, &
+ 22, 22, 22, 22, 22, 22, &
+ 23, 23, 23, 23, 23, 23, &
+ 33, 33, 33, 33, 33, 33, &
+ 0, 0, 0, 0, 0, 0, & ! K_ij
+ 1, 1, 1, 1, 1, 1, & ! K_ij,k
+ 2, 2, 2, 2, 2, 2, &
+ 3, 3, 3, 3, 3, 3, &
+ 0, & ! alp
+ 0, 0, 0 /) ! beta^i
+
+ output_types(:) = CCTK_VARIABLE_REAL
+ if (hn > 0) then
+ outputs = (/ &
+ P(qlm_gxx), P(qlm_gxy), P(qlm_gxz), P(qlm_gyy), P(qlm_gyz), P(qlm_gzz), &
+ P(qlm_dgxxx), P(qlm_dgxyx), P(qlm_dgxzx), P(qlm_dgyyx), P(qlm_dgyzx), P(qlm_dgzzx), &
+ P(qlm_dgxxy), P(qlm_dgxyy), P(qlm_dgxzy), P(qlm_dgyyy), P(qlm_dgyzy), P(qlm_dgzzy), &
+ P(qlm_dgxxz), P(qlm_dgxyz), P(qlm_dgxzz), P(qlm_dgyyz), P(qlm_dgyzz), P(qlm_dgzzz), &
+ P(qlm_ddgxxxx), P(qlm_ddgxyxx), P(qlm_ddgxzxx), P(qlm_ddgyyxx), P(qlm_ddgyzxx), P(qlm_ddgzzxx), &
+ P(qlm_ddgxxxy), P(qlm_ddgxyxy), P(qlm_ddgxzxy), P(qlm_ddgyyxy), P(qlm_ddgyzxy), P(qlm_ddgzzxy), &
+ P(qlm_ddgxxxz), P(qlm_ddgxyxz), P(qlm_ddgxzxz), P(qlm_ddgyyxz), P(qlm_ddgyzxz), P(qlm_ddgzzxz), &
+ P(qlm_ddgxxyy), P(qlm_ddgxyyy), P(qlm_ddgxzyy), P(qlm_ddgyyyy), P(qlm_ddgyzyy), P(qlm_ddgzzyy), &
+ P(qlm_ddgxxyz), P(qlm_ddgxyyz), P(qlm_ddgxzyz), P(qlm_ddgyyyz), P(qlm_ddgyzyz), P(qlm_ddgzzyz), &
+ P(qlm_ddgxxzz), P(qlm_ddgxyzz), P(qlm_ddgxzzz), P(qlm_ddgyyzz), P(qlm_ddgyzzz), P(qlm_ddgzzzz), &
+ P(qlm_kxx), P(qlm_kxy), P(qlm_kxz), P(qlm_kyy), P(qlm_kyz), P(qlm_kzz), &
+ P(qlm_dkxxx), P(qlm_dkxyx), P(qlm_dkxzx), P(qlm_dkyyx), P(qlm_dkyzx), P(qlm_dkzzx), &
+ P(qlm_dkxxy), P(qlm_dkxyy), P(qlm_dkxzy), P(qlm_dkyyy), P(qlm_dkyzy), P(qlm_dkzzy), &
+ P(qlm_dkxxz), P(qlm_dkxyz), P(qlm_dkxzz), P(qlm_dkyyz), P(qlm_dkyzz), P(qlm_dkzzz), &
+ P(qlm_alpha), &
+ P(qlm_betax), P(qlm_betay), P(qlm_betaz) /)
+ else
+ outputs(:) = CCTK_NullPointer()
+ end if
+
+
+
+ ninputs = size(inputs)
+ noutputs = size(outputs)
+
+
+
+#if 0
+ ! Poison the output variables
+#define poison -42
+ qlm_gxx = poison
+ qlm_gxy = poison
+ qlm_gxz = poison
+ qlm_gyy = poison
+ qlm_gyz = poison
+ qlm_gzz = poison
+ qlm_dgxxx = poison
+ qlm_dgxyx = poison
+ qlm_dgxzx = poison
+ qlm_dgyyx = poison
+ qlm_dgyzx = poison
+ qlm_dgzzx = poison
+ qlm_dgxxy = poison
+ qlm_dgxyy = poison
+ qlm_dgxzy = poison
+ qlm_dgyyy = poison
+ qlm_dgyzy = poison
+ qlm_dgzzy = poison
+ qlm_dgxxz = poison
+ qlm_dgxyz = poison
+ qlm_dgxzz = poison
+ qlm_dgyyz = poison
+ qlm_dgyzz = poison
+ qlm_dgzzz = poison
+ qlm_ddgxxxx = poison
+ qlm_ddgxyxx = poison
+ qlm_ddgxzxx = poison
+ qlm_ddgyyxx = poison
+ qlm_ddgyzxx = poison
+ qlm_ddgzzxx = poison
+ qlm_ddgxxxy = poison
+ qlm_ddgxyxy = poison
+ qlm_ddgxzxy = poison
+ qlm_ddgyyxy = poison
+ qlm_ddgyzxy = poison
+ qlm_ddgzzxy = poison
+ qlm_ddgxxxz = poison
+ qlm_ddgxyxz = poison
+ qlm_ddgxzxz = poison
+ qlm_ddgyyxz = poison
+ qlm_ddgyzxz = poison
+ qlm_ddgzzxz = poison
+ qlm_ddgxxyy = poison
+ qlm_ddgxyyy = poison
+ qlm_ddgxzyy = poison
+ qlm_ddgyyyy = poison
+ qlm_ddgyzyy = poison
+ qlm_ddgzzyy = poison
+ qlm_ddgxxyz = poison
+ qlm_ddgxyyz = poison
+ qlm_ddgxzyz = poison
+ qlm_ddgyyyz = poison
+ qlm_ddgyzyz = poison
+ qlm_ddgzzyz = poison
+ qlm_ddgxxzz = poison
+ qlm_ddgxyzz = poison
+ qlm_ddgxzzz = poison
+ qlm_ddgyyzz = poison
+ qlm_ddgyzzz = poison
+ qlm_ddgzzzz = poison
+ qlm_kxx = poison
+ qlm_kxy = poison
+ qlm_kxz = poison
+ qlm_kyy = poison
+ qlm_kyz = poison
+ qlm_kzz = poison
+ qlm_dkxxx = poison
+ qlm_dkxyx = poison
+ qlm_dkxzx = poison
+ qlm_dkyyx = poison
+ qlm_dkyzx = poison
+ qlm_dkzzx = poison
+ qlm_dkxxy = poison
+ qlm_dkxyy = poison
+ qlm_dkxzy = poison
+ qlm_dkyyy = poison
+ qlm_dkyzy = poison
+ qlm_dkzzy = poison
+ qlm_dkxxz = poison
+ qlm_dkxyz = poison
+ qlm_dkxzz = poison
+ qlm_dkyyz = poison
+ qlm_dkyzz = poison
+ qlm_dkzzz = poison
+ qlm_alpha = poison
+ qlm_betax = poison
+ qlm_betay = poison
+ qlm_betaz = poison
+#endif
+
+
+
+ ! Call the interpolator
+ call Util_TableSetIntArray &
+ (ierr, options_table, noutputs, &
+ operand_indices, "operand_indices")
+ if (ierr /= 0) call CCTK_WARN (0, "internal error")
+ call Util_TableSetIntArray &
+ (ierr, options_table, noutputs, &
+ operation_codes, "operation_codes")
+ if (ierr /= 0) call CCTK_WARN (0, "internal error")
+
+ call CCTK_InterpGridArrays &
+ (ierr, cctkGH, 3, &
+ interp_handle, options_table, coord_handle, &
+ npoints, coord_type, coords, &
+ ninputs, inputs, &
+ noutputs, output_types, outputs)
+
+ if (ierr /= 0) then
+ if (hn > 0) then
+ qlm_calc_error(hn) = 1
+ end if
+ call CCTK_WARN (1, "Interpolator failed")
+ return
+ end if
+
+
+
+ ! Unpack the variables
+ if (hn > 0) then
+
+ call unpack (qlm_gxx , ni, nj)
+ call unpack (qlm_gxy , ni, nj)
+ call unpack (qlm_gxz , ni, nj)
+ call unpack (qlm_gyy , ni, nj)
+ call unpack (qlm_gyz , ni, nj)
+ call unpack (qlm_gzz , ni, nj)
+ call unpack (qlm_dgxxx , ni, nj)
+ call unpack (qlm_dgxyx , ni, nj)
+ call unpack (qlm_dgxzx , ni, nj)
+ call unpack (qlm_dgyyx , ni, nj)
+ call unpack (qlm_dgyzx , ni, nj)
+ call unpack (qlm_dgzzx , ni, nj)
+ call unpack (qlm_dgxxy , ni, nj)
+ call unpack (qlm_dgxyy , ni, nj)
+ call unpack (qlm_dgxzy , ni, nj)
+ call unpack (qlm_dgyyy , ni, nj)
+ call unpack (qlm_dgyzy , ni, nj)
+ call unpack (qlm_dgzzy , ni, nj)
+ call unpack (qlm_dgxxz , ni, nj)
+ call unpack (qlm_dgxyz , ni, nj)
+ call unpack (qlm_dgxzz , ni, nj)
+ call unpack (qlm_dgyyz , ni, nj)
+ call unpack (qlm_dgyzz , ni, nj)
+ call unpack (qlm_dgzzz , ni, nj)
+ call unpack (qlm_ddgxxxx , ni, nj)
+ call unpack (qlm_ddgxyxx , ni, nj)
+ call unpack (qlm_ddgxzxx , ni, nj)
+ call unpack (qlm_ddgyyxx , ni, nj)
+ call unpack (qlm_ddgyzxx , ni, nj)
+ call unpack (qlm_ddgzzxx , ni, nj)
+ call unpack (qlm_ddgxxxy , ni, nj)
+ call unpack (qlm_ddgxyxy , ni, nj)
+ call unpack (qlm_ddgxzxy , ni, nj)
+ call unpack (qlm_ddgyyxy , ni, nj)
+ call unpack (qlm_ddgyzxy , ni, nj)
+ call unpack (qlm_ddgzzxy , ni, nj)
+ call unpack (qlm_ddgxxxz , ni, nj)
+ call unpack (qlm_ddgxyxz , ni, nj)
+ call unpack (qlm_ddgxzxz , ni, nj)
+ call unpack (qlm_ddgyyxz , ni, nj)
+ call unpack (qlm_ddgyzxz , ni, nj)
+ call unpack (qlm_ddgzzxz , ni, nj)
+ call unpack (qlm_ddgxxyy , ni, nj)
+ call unpack (qlm_ddgxyyy , ni, nj)
+ call unpack (qlm_ddgxzyy , ni, nj)
+ call unpack (qlm_ddgyyyy , ni, nj)
+ call unpack (qlm_ddgyzyy , ni, nj)
+ call unpack (qlm_ddgzzyy , ni, nj)
+ call unpack (qlm_ddgxxyz , ni, nj)
+ call unpack (qlm_ddgxyyz , ni, nj)
+ call unpack (qlm_ddgxzyz , ni, nj)
+ call unpack (qlm_ddgyyyz , ni, nj)
+ call unpack (qlm_ddgyzyz , ni, nj)
+ call unpack (qlm_ddgzzyz , ni, nj)
+ call unpack (qlm_ddgxxzz , ni, nj)
+ call unpack (qlm_ddgxyzz , ni, nj)
+ call unpack (qlm_ddgxzzz , ni, nj)
+ call unpack (qlm_ddgyyzz , ni, nj)
+ call unpack (qlm_ddgyzzz , ni, nj)
+ call unpack (qlm_ddgzzzz , ni, nj)
+ call unpack (qlm_kxx , ni, nj)
+ call unpack (qlm_kxy , ni, nj)
+ call unpack (qlm_kxz , ni, nj)
+ call unpack (qlm_kyy , ni, nj)
+ call unpack (qlm_kyz , ni, nj)
+ call unpack (qlm_kzz , ni, nj)
+ call unpack (qlm_dkxxx , ni, nj)
+ call unpack (qlm_dkxyx , ni, nj)
+ call unpack (qlm_dkxzx , ni, nj)
+ call unpack (qlm_dkyyx , ni, nj)
+ call unpack (qlm_dkyzx , ni, nj)
+ call unpack (qlm_dkzzx , ni, nj)
+ call unpack (qlm_dkxxy , ni, nj)
+ call unpack (qlm_dkxyy , ni, nj)
+ call unpack (qlm_dkxzy , ni, nj)
+ call unpack (qlm_dkyyy , ni, nj)
+ call unpack (qlm_dkyzy , ni, nj)
+ call unpack (qlm_dkzzy , ni, nj)
+ call unpack (qlm_dkxxz , ni, nj)
+ call unpack (qlm_dkxyz , ni, nj)
+ call unpack (qlm_dkxzz , ni, nj)
+ call unpack (qlm_dkyyz , ni, nj)
+ call unpack (qlm_dkyzz , ni, nj)
+ call unpack (qlm_dkzzz , ni, nj)
+ call unpack (qlm_alpha , ni, nj)
+ call unpack (qlm_betax , ni, nj)
+ call unpack (qlm_betay , ni, nj)
+ call unpack (qlm_betaz , ni, nj)
+
+
+
+#if 0
+ ! Check for poison
+ if (any(qlm_gxx == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_gxy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_gxz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_gyy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_gyz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_gzz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dgxxx == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dgxyx == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dgxzx == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dgyyx == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dgyzx == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dgzzx == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dgxxy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dgxyy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dgxzy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dgyyy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dgyzy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dgzzy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dgxxz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dgxyz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dgxzz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dgyyz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dgyzz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dgzzz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgxxxx == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgxyxx == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgxzxx == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgyyxx == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgyzxx == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgzzxx == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgxxxy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgxyxy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgxzxy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgyyxy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgyzxy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgzzxy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgxxxz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgxyxz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgxzxz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgyyxz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgyzxz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgzzxz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgxxyy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgxyyy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgxzyy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgyyyy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgyzyy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgzzyy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgxxyz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgxyyz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgxzyz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgyyyz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgyzyz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgzzyz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgxxzz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgxyzz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgxzzz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgyyzz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgyzzz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_ddgzzzz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_kxx == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_kxy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_kxz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_kyy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_kyz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_kzz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dkxxx == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dkxyx == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dkxzx == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dkyyx == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dkyzx == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dkzzx == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dkxxy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dkxyy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dkxzy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dkyyy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dkyzy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dkzzy == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dkxxz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dkxyz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dkxzz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dkyyz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dkyzz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_dkzzz == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_alpha == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_betax == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_betay == poison)) call CCTK_WARN (0, "poison found")
+ if (any(qlm_betaz == poison)) call CCTK_WARN (0, "poison found")
+#endif
+
+ end if
+
+
+
+ ! Free interpolator options
+ call Util_TableDestroy (ierr, options_table)
+
+
+
+ if (hn > 0) then
+
+ qlm_have_valid_data(hn) = 1
+
+ deallocate (xcoord)
+ deallocate (ycoord)
+ deallocate (zcoord)
+
+ end if
+
+
+
+contains
+
+ subroutine pack (arr, ni, nj)
+ integer, intent(in) :: ni, nj
+ CCTK_REAL, intent(inout) :: arr(:,:)
+ CCTK_REAL :: tmp(ni,nj)
+ tmp(:,:) = arr(:ni, :nj)
+ call copy (arr, tmp, size(tmp))
+ end subroutine pack
+
+ subroutine unpack (arr, ni, nj)
+ integer, intent(in) :: ni, nj
+ CCTK_REAL, intent(inout) :: arr(:,:)
+ CCTK_REAL :: tmp(ni,nj)
+ call copy (tmp, arr, size(tmp))
+ arr(:ni, :nj) = tmp(:,:)
+ arr(ni+1:, :nj) = 0
+ arr(:, nj+1:) = 0
+ end subroutine unpack
+
+ subroutine copy (a, b, n)
+ integer, intent(in) :: n
+ CCTK_REAL, intent(out) :: a(n)
+ CCTK_REAL, intent(in) :: b(n)
+ a = b
+ end subroutine copy
+
+end subroutine qlm_interpolate