aboutsummaryrefslogtreecommitdiff
path: root/residual_calc.h
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2019-01-30 11:36:34 +0100
committerAnton Khirnov <anton@khirnov.net>2019-01-30 11:36:34 +0100
commitb584bfe20168ac6208154b1eef395b3805b35e77 (patch)
tree1882c7708e474adfc864bc3c1a1bd90a4b83d7fd /residual_calc.h
parent783d260e0d47d6adb4388fea9ed8e35122d4f6c2 (diff)
ell_grid_solve: split residual computation into its own file
Diffstat (limited to 'residual_calc.h')
-rw-r--r--residual_calc.h77
1 files changed, 77 insertions, 0 deletions
diff --git a/residual_calc.h b/residual_calc.h
new file mode 100644
index 0000000..af1bf39
--- /dev/null
+++ b/residual_calc.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2019 Anton Khirnov <anton@khirnov.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef MG2D_RESIDUAL_CALC_H
+#define MG2D_RESIDUAL_CALC_H
+
+#include <stddef.h>
+
+#include <threadpool.h>
+
+typedef struct ResidualCalcInternal ResidualCalcInternal;
+
+/**
+ * Context for computing the residual, allocated by mg2di_residual_calc_alloc(),
+ * freed by mg2di_residual_calc_free()
+ */
+typedef struct ResidualCalcContext {
+ ResidualCalcInternal *priv;
+
+ /**
+ * The thread pool, must be set by the caller before
+ * mg2di_residual_calc_init().
+ */
+ TPContext *tp;
+
+ /**
+ * FD stencil size, must be set by the caller before
+ * mg2di_residual_calc_init().
+ */
+ size_t fd_stencil;
+
+ /**
+ * Flags indicating supported CPU features, must be set by the caller
+ * before mg2di_residual_calc_init().
+ */
+ int cpuflags;
+} ResidualCalcContext;
+
+/**
+ * Allocate and retur a new ResidualCalcContext.
+ */
+ResidualCalcContext *mg2di_residual_calc_alloc(void);
+/**
+ * Free a ResidualCalcContext and write NULL into the supplied pointer.
+ */
+void mg2di_residual_calc_free(ResidualCalcContext **ctx);
+
+/**
+ * Reinitialize the context for updated parameters. Must be called at least once
+ * before mg2di_residual_calc().
+ */
+int mg2di_residual_calc_init(ResidualCalcContext *ctx);
+
+/**
+ * Calculate the residual.
+ */
+int mg2di_residual_calc(ResidualCalcContext *ctx, size_t size[2], ptrdiff_t stride,
+ double *res_max,
+ double *dst, const double *u, const double *rhs,
+ const double * const diff_coeffs[MG2D_DIFF_COEFF_NB],
+ const double *fd_factors);
+
+#endif // MG2D_RESIDUAL_CALC_H