summaryrefslogtreecommitdiff
path: root/src/qms.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/qms.h')
-rw-r--r--src/qms.h272
1 files changed, 14 insertions, 258 deletions
diff --git a/src/qms.h b/src/qms.h
index f88c0a8..d8a69e6 100644
--- a/src/qms.h
+++ b/src/qms.h
@@ -1,145 +1,17 @@
+#ifndef QMS_QMS_H
+#define QMS_QMS_H
-#include <inttypes.h>
+#include "common.h"
+#if HAVE_OPENCL
#include <cl.h>
+#endif
-#include "cctk.h"
-
-#define POLAR (1)
-
-#define CCZ4 (0)
-
-#define SQR(x) ((x) * (x))
-#define SGN(x) ((x) >= 0.0 ? 1.0 : -1.0)
-#define MAX(x, y) ((x) > (y) ? (x) : (y))
-#define MIN(x, y) ((x) > (y) ? (y) : (x))
-#define ARRAY_ELEMS(arr) (sizeof(arr) / sizeof(*arr))
-
-/*
- * small number to avoid r=0 singularities
- */
-#define EPS 1E-08
-
-#define SCALE_FACTOR scale_factor
-
-/* indices (in our code, not cactus structs) of the grid functions which we'll need to
- * interpolate on the pseudospectral grid */
-enum MetricVars {
- GTXX = 0,
- GTYY,
- GTZZ,
- GTXY,
- GTXZ,
- GTYZ,
- PHI,
- ATXX,
- ATYY,
- ATZZ,
- ATXY,
- ATXZ,
- ATYZ,
- K,
- XTX,
- XTY,
- XTZ,
- BETAX,
- BETAY,
- BETAZ,
- ALPHA,
- KDOT_XX,
- KDOT_YY,
- KDOT_ZZ,
- KDOT_XY,
- KDOT_XZ,
- KDOT_YZ,
- XTDOT_X,
- XTDOT_Y,
- XTDOT_Z,
- PHIDOT,
- NB_METRIC_VARS,
-};
-
-/* indices of the interpolated values of the above grid functions and their derivatives */
-enum InterpMetricVars {
- I_GTXX = 0,
- I_GTYY,
- I_GTZZ,
- I_GTXY,
- I_GTXZ,
- I_GTYZ,
- I_PHI,
- I_PHI_DX,
- I_PHI_DY,
- I_PHI_DZ,
- I_ATXX,
- I_ATYY,
- I_ATZZ,
- I_ATXY,
- I_ATXZ,
- I_ATYZ,
- I_K,
- I_K_DX,
- I_K_DY,
- I_K_DZ,
- I_XTX,
- I_XTY,
- I_XTZ,
- I_BETAX,
- I_BETAY,
- I_BETAZ,
- I_ALPHA,
- I_ALPHA_DX,
- I_ALPHA_DY,
- I_ALPHA_DZ,
- I_ALPHA_DXX,
- I_ALPHA_DYY,
- I_ALPHA_DZZ,
- I_ALPHA_DXY,
- I_ALPHA_DXZ,
- I_ALPHA_DYZ,
- I_KDOT_XX,
- I_KDOT_YY,
- I_KDOT_ZZ,
- I_KDOT_XY,
- I_KDOT_XZ,
- I_KDOT_YZ,
- I_XTDOT_X,
- I_XTDOT_Y,
- I_XTDOT_Z,
- I_PHIDOT,
- I_PHIDOT_DX,
- I_PHIDOT_DY,
- I_PHIDOT_DZ,
- NB_INTERP_VARS,
-};
-
-/* a set of basis functions */
-typedef struct BasisSet {
- /* evaluate the idx-th basis function at the specified point*/
- double (*eval) (double coord, int idx);
- /* evaluate the first derivative of the idx-th basis function at the specified point*/
- double (*eval_diff1)(double coord, int idx);
- /* evaluate the second derivative of the idx-th basis function at the specified point*/
- double (*eval_diff2)(double coord, int idx);
- /**
- * Get the idx-th collocation point for the specified order.
- * idx runs from 0 to order - 1 (inclusive)
- */
- double (*colloc_point)(int order, int idx);
-} BasisSet;
-
-extern const BasisSet qms_cheb_basis;
-extern const BasisSet qms_cheb_even_basis;
-extern const BasisSet qms_full_basis;
-extern const BasisSet qms_tb_even_basis;
-extern const BasisSet qms_sb_even_basis;
-extern const BasisSet qms_tl_basis;
-extern const BasisSet qms_cos_even_basis;
+#include <inttypes.h>
-extern double scale_factor;
+#include "cctk.h"
-typedef struct MGContext MGContext;
-typedef struct SORContext SORContext;
+#include "qms_solve.h"
/* precomputed values for a given refined grid */
typedef struct CoordPatch {
@@ -156,31 +28,14 @@ typedef struct CoordPatch {
double *transform_matrix1;
double *transform_tmp;
double *one;
+ double *w_scale;
int y_idx;
-
- MGContext *mg;
- SORContext *sor;
} CoordPatch;
-/* state and scratch storage for the BiCGSTAB solver */
-typedef struct BiCGSTABContext {
- double *p, *v, *y, *z, *t;
- double *res, *res0;
- double *k;
-
- cl_mem cl_p, cl_v, cl_y, cl_z, cl_t;
- cl_mem cl_res, cl_res0;
- cl_mem cl_k, cl_mat;
- cl_mem cl_rho, cl_alpha, cl_beta, cl_omega, cl_omega1;
- cl_mem cl_tmp, cl_tmp1;
-
-} BiCGSTABContext;
-
-typedef struct MaximalSlicingContext {
+typedef struct QMSContext {
+ QMSSolver *solver;
cGH *gh;
- const BasisSet *basis;
- const BasisSet *basis1;
struct {
double time;
@@ -190,112 +45,13 @@ typedef struct MaximalSlicingContext {
double *coeffs_eval;
- BiCGSTABContext bicgstab;
- int steps_since_inverse;
-
- uint64_t solve_count;
- uint64_t solve_time;
-
- uint64_t lu_solves_count;
- uint64_t lu_solves_time;
-
- uint64_t cg_solve_count;
- uint64_t cg_iter_count;
- uint64_t cg_time_total;
-
- uint64_t interp_geometry_count;
- uint64_t interp_geometry_time;
-
- uint64_t calc_eq_coeffs_count;
- uint64_t calc_eq_coeffs_time;
-
- uint64_t construct_matrix_count;
- uint64_t construct_matrix_time;
-
uint64_t grid_expand_count;
uint64_t grid_expand_time;
- // the grid of collocation points
- double *colloc_grid[2];
-
- // interpolation parameters
- int coord_system;
- int interp_operator;
- int interp_params;
-
- CCTK_REAL *interp_coords[3];
-
- int interp_vars_indices[NB_METRIC_VARS];
-
- CCTK_REAL *interp_values[NB_INTERP_VARS];
- CCTK_REAL *interp_values_prefilter[NB_INTERP_VARS];
- CCTK_INT interp_value_codes[NB_INTERP_VARS];
-
- CCTK_REAL *metric_u[6];
-
- CCTK_REAL *kij_kij;
- CCTK_REAL *trk;
-
- int nb_coeffs_x;
- int nb_coeffs_z;
- int nb_coeffs;
-
- int nb_colloc_points_x;
- int nb_colloc_points_z;
- int nb_colloc_points;
-
- int colloc_grid_order_x;
- int colloc_grid_order_z;
-
- double *mat;
- double *mat_f;
- double *rhs;
- double *coeffs;
- int *ipiv;
- double *basis_x_val;
- double *basis_x_dval;
- double *basis_x_d2val;
-
- double *basis_z_val;
- double *basis_z_dval;
- double *basis_z_d2val;
-
- double *basis_val_00;
- double *basis_val_20;
- double *basis_val_02;
- double *basis_val_11;
- double *basis_val_10;
- double *basis_val_01;
-
- double *eq_coeff_00;
- double *eq_coeff_20;
- double *eq_coeff_02;
- double *eq_coeff_11;
- double *eq_coeff_10;
- double *eq_coeff_01;
-
- double *coeff_scale;
-
- double *input_filter;
-
CoordPatch *patches;
int nb_patches;
+} QMSContext;
- // OpenCL / CLBLAS stuff
- cl_context cl_ctx;
- cl_command_queue cl_queue;
- cl_device_id ocl_device;
-
- cl_mem ocl_coeffs;
-} MaximalSlicingContext;
-
-int qms_maximal_solve(MaximalSlicingContext *ms);
-
-#include <sys/time.h>
-static inline int64_t gettime(void)
-{
- struct timeval tv;
- gettimeofday(&tv, NULL);
- return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
-}
+int qms_maximal_solve(QMSContext *ms);
+#endif /* QMS_QMS_H */