1#ifndef __CS_SLES_IT_PRIV_H__
2#define __CS_SLES_IT_PRIV_H__
91#define HUGE_VAL 1.E+12
132typedef struct _cs_sles_it_setup_t {
134 double initial_residual;
150typedef struct _cs_sles_it_add_t {
159struct _cs_sles_it_t {
168 bool ignore_convergence;
172 int restart_interval;
177 cs_sles_it_solve_t *solve;
189 unsigned n_iterations_last;
191 unsigned n_iterations_min;
193 unsigned n_iterations_max;
195 unsigned long long n_iterations_tot;
211# if defined(HAVE_MPI)
213 MPI_Comm caller_comm;
217#if defined(HAVE_NCCL)
218 ncclComm_t nccl_comm;
221 const struct _cs_sles_it_t *shared;
225 cs_sles_it_add_t *add_data;
227 cs_sles_it_setup_t *setup_data;
233 int fallback_n_max_iter;
244struct _cs_sles_it_convergence_t {
250 unsigned n_iterations;
251 unsigned n_iterations_max;
280 double s =
cs_dot(c->setup_data->n_rows, x, y);
284 if (c->comm != MPI_COMM_NULL) {
286 MPI_Allreduce(&s, &_sum, 1, MPI_DOUBLE, MPI_SUM, c->comm);
316 if (c->comm != MPI_COMM_NULL) {
318 MPI_Allreduce(&s, &_sum, 1, MPI_DOUBLE, MPI_SUM, c->comm);
351 if (c->comm != MPI_COMM_NULL) {
353 MPI_Allreduce(s, _sum, 2, MPI_DOUBLE, MPI_SUM, c->comm);
390 if (c->comm != MPI_COMM_NULL) {
392 MPI_Allreduce(s, _sum, 2, MPI_DOUBLE, MPI_SUM, c->comm);
431 if (c->comm != MPI_COMM_NULL) {
434 MPI_Allreduce(s, _sum, 3, MPI_DOUBLE, MPI_SUM, c->comm);
479 if (c->comm != MPI_COMM_NULL) {
481 MPI_Allreduce(s, _sum, 5, MPI_DOUBLE, MPI_SUM, c->comm);
482 memcpy(s, _sum, 5*
sizeof(
double));
514 aux[ii] = (c[ii] - b[ii]);
518 x[ii] = mat[3*ii + 0]*aux[0]
519 + mat[3*ii + 1]*aux[1]
520 + mat[3*ii + 2]*aux[2];
543 assert(db_size <= DB_SIZE_MAX);
547 for (
cs_lnum_t ii = 0; ii < db_size; ii++) {
548 aux[ii] = (c[ii] - b[ii]);
551 for (
cs_lnum_t ii = 0; ii < db_size; ii++) {
553 for (
cs_lnum_t jj = 0; jj < db_size; jj++) {
554 x[ii] += aux[jj]*mat[ii*db_size + jj];
581 const char *solver_name,
611 bool block_nn_inverse,
double cs_dot(cs_lnum_t n, const cs_real_t *x, const cs_real_t *y)
Return the dot product of 2 vectors: x.y.
Definition: cs_blas.cpp:1644
void cs_dot_xx_yy_xy_xz_yz(cs_lnum_t n, const cs_real_t *restrict x, const cs_real_t *restrict y, const cs_real_t *restrict z, double *xx, double *yy, double *xy, double *xz, double *yz)
Return 5 dot products of 3 vectors: x.x, y.y, x.y, x.z, and y.z.
Definition: cs_blas.cpp:1833
double cs_dot_xx(cs_lnum_t n, const cs_real_t *x)
Return dot products of a vector with itself: x.x.
Definition: cs_blas.cpp:1665
void cs_dot_xy_yz(cs_lnum_t n, const cs_real_t *restrict x, const cs_real_t *restrict y, const cs_real_t *restrict z, double *xy, double *yz)
Return 2 dot products of 3 vectors: x.y, and y.z.
Definition: cs_blas.cpp:1772
void cs_dot_xx_xy_yz(cs_lnum_t n, const cs_real_t *restrict x, const cs_real_t *restrict y, const cs_real_t *restrict z, double *xx, double *xy, double *yz)
Return 3 dot products of 3 vectors: x.x, x.y, and y.z.
Definition: cs_blas.cpp:1801
void cs_dot_xx_xy(cs_lnum_t n, const cs_real_t *restrict x, const cs_real_t *restrict y, double *xx, double *xy)
Return 2 dot products of 2 vectors: x.x, and x.y.
Definition: cs_blas.cpp:1745
#define restrict
Definition: cs_defs.h:158
#define BEGIN_C_DECLS
Definition: cs_defs.h:554
double cs_real_t
Floating-point value.
Definition: cs_defs.h:357
#define END_C_DECLS
Definition: cs_defs.h:555
int cs_lnum_t
local mesh entity id
Definition: cs_defs.h:350
struct _cs_matrix_t cs_matrix_t
Definition: cs_matrix.h:114
cs_sles_convergence_state_t
Definition: cs_sles.h:56
struct _cs_sles_it_t cs_sles_it_t
Definition: cs_sles_it.h:95
struct _cs_sles_it_convergence_t cs_sles_it_convergence_t
Definition: cs_sles_it.h:99
cs_sles_it_type_t
Definition: cs_sles_it.h:55
cs_sles_pc_state_t() cs_sles_pc_apply_t(void *context, const cs_real_t *x_in, cs_real_t *x_out)
Function pointer for application of a preconditioner.
Definition: cs_sles_pc.h:145
struct _cs_sles_pc_t cs_sles_pc_t
Definition: cs_sles_pc.h:66
struct _cs_time_plot_t cs_time_plot_t
Definition: cs_time_plot.h:48
Definition: cs_timer.h:55