1625 lines
76 KiB
C++
1625 lines
76 KiB
C++
/*@HEADER
|
|
// ***********************************************************************
|
|
//
|
|
// AztecOO: An Object-Oriented Aztec Linear Solver Package
|
|
// Copyright (2002) Sandia Corporation
|
|
//
|
|
// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
|
|
// license for use of this work by or on behalf of the U.S. Government.
|
|
//
|
|
// This library is free software; you can redistribute it and/or modify
|
|
// it under the terms of the GNU Lesser General Public License as
|
|
// published by the Free Software Foundation; either version 2.1 of the
|
|
// License, or (at your option) any later version.
|
|
//
|
|
// This library 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
|
|
// Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
// License along with this library; if not, write to the Free Software
|
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
|
// USA
|
|
// Questions? Contact Michael A. Heroux (maherou@sandia.gov)
|
|
//
|
|
// ***********************************************************************
|
|
//@HEADER
|
|
*/
|
|
|
|
/*====================================================================
|
|
* ------------------------
|
|
* | CVS File Information |
|
|
* ------------------------
|
|
*
|
|
* $RCSfile: az_aztec.h,v $
|
|
*
|
|
* $Author: william $
|
|
*
|
|
* $Date: 2006/11/13 18:05:47 $
|
|
*
|
|
* $Revision: 1.24 $
|
|
*
|
|
* $Name: trilinos-release-8-0-branch $
|
|
*====================================================================*/
|
|
|
|
/*
|
|
* Include file for inclusion in any routine which will call the solver
|
|
* library. Contains necessary constants and prototypes.
|
|
*
|
|
* Author: Scott A. Hutchinson, SNL
|
|
* John N. Shadid, SNL
|
|
* Ray S. Tuminaro, SNL
|
|
*/
|
|
#ifndef __AZTECH__
|
|
|
|
/* Set variable to indicate that this file has already been included */
|
|
|
|
#define __AZTECH__
|
|
|
|
#include "az_aztec_defs.h"
|
|
#include "az_f77func.h"
|
|
/* Some older codes use AZ_MPI to set MPI mode for AztecOO/Aztec.
|
|
* Check to see if AZ_MPI is defined, and define AZTEC_MPI if
|
|
* it is not already defined.
|
|
*/
|
|
|
|
#if defined(AZ_MPI) && !defined(AZTEC_MPI)
|
|
#define AZTEC_MPI
|
|
#endif
|
|
|
|
/* Force AZTEC_MPI to be defined if ML_MPI is defined */
|
|
|
|
#if defined(ML_MPI) && !defined(AZTEC_MPI)
|
|
#define AZTEC_MPI
|
|
#endif
|
|
|
|
/* The definition of MPI_AZRequest and MPI_AZComm depend on
|
|
* whether or not we are using MPI.
|
|
* NOTE: This technique can cause problems if az_aztec.h (this file)
|
|
* is included with AZTEC_MPI undefined in some files and with
|
|
* AZTEC_MPI defined in other files. Therefore, users must
|
|
* make sure that AZTEC_MPI is either defined or undefined for
|
|
* all files that are compiled and including az_aztec.h.
|
|
*/
|
|
|
|
#ifdef AZTEC_MPI
|
|
#include <mpi.h>
|
|
#define MPI_AZRequest MPI_Request
|
|
#define MPI_AZComm MPI_Comm
|
|
#else
|
|
#define MPI_AZRequest int
|
|
#define MPI_AZComm int
|
|
#endif
|
|
|
|
|
|
/*structure definitions*/
|
|
|
|
|
|
struct AZ_MATRIX_STRUCT {
|
|
|
|
/* Used to represent matrices. In particular, two structures are */
|
|
/* passed into AZ_iterate: */
|
|
/* AZ_iterate(..., AZ_MATRIX *Amat, AZ_MATRIX *Precond, ...) */
|
|
/* corresponding to matrix-vector products and preconditioners. */
|
|
/* */
|
|
/* For matrix-vector products, a subroutine Amat.'user_function'*/
|
|
/* can be supplied. 'Amat' is be passed to this routine and thus*/
|
|
/* relevant data can be placed in this structure. If a matrix- */
|
|
/* vector product is not supplied, either an MSR or VBR matrix */
|
|
/* must be used by specifying the arrays bindx,indx,rpntr,cpntr,*/
|
|
/* bpntr, and val. In this case, Aztec supplies the matrix- */
|
|
/* vector product. */
|
|
/* */
|
|
/* NOTE: Fortran users never explicitly see this structure but */
|
|
/* instead pass matrix-vector product and preconditioning */
|
|
/* information through parameters which Aztec copies to this */
|
|
/* structure. */
|
|
|
|
int matrix_type; /* Indicates whether the matrix is MSR, */
|
|
/* VBR, or user-supplied. */
|
|
/* */
|
|
int N_local, /* Number of local and ghost unknowns */
|
|
N_ghost; /* */
|
|
/* */
|
|
int mat_create_called;/* =1 indicates that AZ_matrix_create() */
|
|
/* was invoked. */
|
|
int must_free_data_org;/* =1 indicates that data_org was created */
|
|
/* via the matrix_free set functions and */
|
|
/* needs to be freed during destroy oper. */
|
|
/* */
|
|
int *rpntr,*cpntr,/* arrays to support MSR & VBR formats */
|
|
*bpntr,*bindx;/* */
|
|
int *indx; /* */
|
|
double *val; /* */
|
|
int *data_org; /* array to support matvec communication */
|
|
/* */
|
|
/* Begin Aztec 2.1 mheroux mod */
|
|
int N_update; /* Number of nodes updated on this proc */
|
|
/* */
|
|
int *update; /* array containing global indices map */
|
|
/* */
|
|
int has_global_indices; /* true/false for say bindx has global */
|
|
/* */
|
|
/* End Aztec 2.1 mheroux mod */
|
|
void (*matvec)(double *, /* function ptr to user-defined routine */
|
|
double *, struct AZ_MATRIX_STRUCT *, int *);
|
|
double (*matnorminf)(struct AZ_MATRIX_STRUCT *); /* function ptr to user-routine */
|
|
/*********************************************************************/
|
|
/*********************************************************************/
|
|
int (*getrow)(int columns[], double values[], int row_lengths[],
|
|
struct AZ_MATRIX_STRUCT *Amat, int N_requested,
|
|
int requested_rows[], int allocated_space);
|
|
/* function ptr to user-defined routine */
|
|
/* Get some matrix rows ( requested_rows[0 ... N_requested_rows-1] ) */
|
|
/* from the user's matrix and return this information in */
|
|
/* 'row_lengths, columns, values'. If there is not enough space to */
|
|
/* complete this operation, return 0. Otherwise, return 1. */
|
|
/* */
|
|
/* Parameters */
|
|
/* ========== */
|
|
/* data On input, points to user's data containing */
|
|
/* matrix values. */
|
|
/* N_requested_rows On input, number of rows for which nonzero are */
|
|
/* to be returned. */
|
|
/* requested_rows On input, requested_rows[0...N_requested_rows-1] */
|
|
/* give the row indices of the rows for which */
|
|
/* nonzero values are returned. */
|
|
/* row_lengths On output, row_lengths[i] is the number of */
|
|
/* nonzeros in the row 'requested_rows[i]' */
|
|
/* ( 0 <= i < N_requested_rows). NOTE: this */
|
|
/* array is of size 'N_requested_rows'. */
|
|
/* columns,values On output, columns[k] and values[k] contains the */
|
|
/* column number and value of a matrix nonzero where*/
|
|
/* all the nonzeros for requested_rows[0] appear */
|
|
/* first followed by the nonzeros for */
|
|
/* requested_rows[1], etc. NOTE: these arrays are */
|
|
/* of size 'allocated_space'. */
|
|
/* allocated_space On input, indicates the space available in */
|
|
/* 'columns' and 'values' for storing nonzeros. If */
|
|
/* more space is needed, return 0. */
|
|
/*********************************************************************/
|
|
/*********************************************************************/
|
|
int (*user_comm)(double *, struct AZ_MATRIX_STRUCT *);
|
|
/* user communication routine before */
|
|
/* doing matvecs. Only used when doing */
|
|
/* matrix-free. */
|
|
|
|
double matrix_norm; /* norm of the matrix A used in the case */
|
|
/* of least square preconditioning if the */
|
|
/* matrix A is of type AZ_USER_MATRIX */
|
|
/* */
|
|
/* */
|
|
int **aux_ival; /* integer, double precision, function, */
|
|
double **aux_dval; /* generic, and matrix pointers at the */
|
|
void *aux_ptr; /* product routine: 'matvec()'. */
|
|
void *matvec_data;
|
|
void *getrow_data;
|
|
struct AZ_MATRIX_STRUCT
|
|
**aux_matrix;
|
|
int N_nz, max_per_row, /* Total number of nonzeros, maximum */
|
|
largest_band; /* nonzeros per row, and bandwidth. */
|
|
/* ONLY used for matrix-free */
|
|
|
|
struct AZ_CONVERGE_STRUCT * conv_info;
|
|
char *print_string; /* Description of problem */
|
|
};
|
|
|
|
struct grid_level {
|
|
int N;
|
|
struct AZ_MATRIX_STRUCT *transfer_to_prev_grid;
|
|
struct AZ_MATRIX_STRUCT *transfer_to_next_grid;
|
|
struct AZ_MATRIX_STRUCT *discretization_op;
|
|
struct AZ_PREC_STRUCT *smoother1;
|
|
struct AZ_PREC_STRUCT *smoother2;
|
|
void *mesh;
|
|
};
|
|
|
|
struct AZ_PREC_STRUCT {
|
|
|
|
/* Used to represent preconditioners. In particular, */
|
|
/* two structures are */
|
|
/* passed into AZ_iterate: */
|
|
/* AZ_iterate(..., AZ_MATRIX *Amat, AZ_PRECOND *Precond, ...) */
|
|
/* corresponding to matrix and preconditioner descriptions. */
|
|
/* */
|
|
/* For matrix-vector products, a subroutine Amat.'matvec'*/
|
|
/* can be supplied. 'Amat' is be passed to this routine and thus*/
|
|
/* relevant data can be placed in this structure. If a matrix- */
|
|
/* vector product is not supplied, either an MSR or VBR matrix */
|
|
/* must be used by specifying the arrays bindx,indx,rpntr,cpntr,*/
|
|
/* bpntr, and val. In this case, Aztec supplies the matrix- */
|
|
/* vector product as well as a number of preconditioners. */
|
|
/* */
|
|
/* Likewise, a preconditioner can be supplied via the routine */
|
|
/* 'Precond.prec_function'. In this case options[AZ_precond] */
|
|
/* must be set to "AZ_user_precond". Otherwise */
|
|
/* options[AZ_precond] must be set to one of the preconditioners*/
|
|
/* supplied by Aztec and the matrix must be a MSR or VBR format */
|
|
/* The matrix used as preconditionner is descibed in a AZ_MATRIX*/
|
|
/* structure which could be either the same as Amat */
|
|
/* (precond.Pmat = Amat) or a different matrix described */
|
|
/* by the arrays bindx,indx,rpntr,cpntr, bpntr, and val. */
|
|
/* */
|
|
/* NOTE: Fortran users never explicitly see these structures but*/
|
|
/* instead pass matrix and preconditioning information through */
|
|
/* parameters which Aztec copies to this structure. */
|
|
/* */
|
|
|
|
struct AZ_MATRIX_STRUCT *Pmat; /* matrix used by the precondtioner */
|
|
/* when not using multilevel stuff */
|
|
/* */
|
|
int prec_create_called;/* =1 indicates that AZ_precond_create() */
|
|
/* was invoked. */
|
|
|
|
void (*prec_function)(double *, /* function ptr to user-defined */
|
|
int *, int *, double *,/* preconditioning routine */
|
|
struct AZ_MATRIX_STRUCT *,
|
|
struct AZ_PREC_STRUCT *);
|
|
|
|
int *options; /* used to determine preconditioner */
|
|
double *params; /* when options[AZ_precond] is set */
|
|
struct AZ_PREC_STRUCT *next_prec; /* to AZ_multilevel. The series of */
|
|
/* preconditioners is done in a */
|
|
/* multiplicative fashion. */
|
|
struct context *context;
|
|
struct grid_level grid_levels[10]; /* multilevel stuff */
|
|
void *ml_ptr; /* MLDIFF */
|
|
double timing[2]; /* preconditioner timing array */
|
|
void *precond_data;
|
|
char *print_string;
|
|
};
|
|
|
|
|
|
typedef struct AZ_MATRIX_STRUCT AZ_MATRIX;
|
|
typedef struct AZ_PREC_STRUCT AZ_PRECOND;
|
|
|
|
struct AZ_CONVERGE_STRUCT {
|
|
double r0_norm, A_norm, b_norm;
|
|
int total_N;
|
|
int not_initialized;
|
|
struct AZ_SCALING *scaling;
|
|
double epsilon;
|
|
int isnan;
|
|
int converged;
|
|
int iteration;
|
|
int print_info;
|
|
int sol_updated;
|
|
void * res_vec_object; /* This points to an already constructed Epetra_Vector used to pass the residual vector */
|
|
void * conv_object; /* This will contain the pointer to the AztecOO_StatusTest object */
|
|
void (*conv_function)(void * conv_test_obj,/* pointer to AztecOO_StatusTest object */
|
|
void * res_vector_obj, /* pointer to Epetra_Vector that will hold res_vector */
|
|
int iteration, /* current iteration */
|
|
double * res_vector, /* current natural residual vector */
|
|
int print_info, /* no info print if 0, else print info */
|
|
int sol_updated, /* solution not updated if = 0, else it is
|
|
and is consistent with res_vector */
|
|
int * converged, /* = 0 on return if not converged, otherwise converged */
|
|
int * isnan, /* = 0 on return if not NaN, otherwise NaNs detected */
|
|
double * rnorm, /* = current norm on return */
|
|
int * r_avail); /* If set to AZ_TRUE on return, the residual vector is needed
|
|
by this convergence on subsequent calls and it should be
|
|
supplied by the calling routine */
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct aztec_choices {
|
|
int *options;
|
|
double *params;
|
|
};
|
|
struct context { /* This structure is used to */
|
|
int *iu, *iflag, *ha, *ipvt; /* hold variables specific to */
|
|
int *dblock, *space_holder; /* the preconditioner */
|
|
int extra_fact_nz_per_row;
|
|
int N_large_int_arrays, N_large_dbl_arrays;
|
|
int N_nz_factors,N_nz_matrix, N_blk_rows, max_row;
|
|
double *pivot;
|
|
struct AZ_MATRIX_STRUCT *A_overlapped;
|
|
struct aztec_choices *aztec_choices;
|
|
double *x_pad, *ext_vals, *x_reord;
|
|
int *padded_data_org, *map, *ordering, *inv_ordering;
|
|
int N, N_unpadded, N_nz, N_nz_allocated;
|
|
char *tag;
|
|
int *proc_config;
|
|
int Pmat_computed; /* indicates that the has */
|
|
/* been called at least once */
|
|
/* before with this context. */
|
|
/* Begin Aztec 2.1 mheroux mod */
|
|
void *precon;
|
|
/* End Aztec 2.1 mheroux mod */
|
|
};
|
|
|
|
|
|
/*****************************************************************************/
|
|
/*****************************************************************************/
|
|
/*****************************************************************************/
|
|
|
|
struct AZ_SCALING { /* Left and right matrices to scale */
|
|
/* the problem */
|
|
int action;
|
|
double A_norm;
|
|
int mat_name;
|
|
int scaling_opt;
|
|
|
|
/* Define a function pointer that can be called to perform
|
|
scalings for user-defined matrices that can't be scaled
|
|
by Aztec's AZ_scale_f function.
|
|
*/
|
|
int (*scale)(int action,
|
|
AZ_MATRIX* Amat,
|
|
int options[],
|
|
double b[],
|
|
double x[],
|
|
int proc_config[],
|
|
struct AZ_SCALING* scaling);
|
|
|
|
/* A void pointer that can be used to store data for later reuse.
|
|
*/
|
|
void* scaling_data;
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
/*****************************************************************************/
|
|
/*****************************************************************************/
|
|
|
|
struct grid { /* used to define a grid. Still under */
|
|
/* construction */
|
|
int *element_vertex_lists;
|
|
int *Nvertices_per_element;
|
|
int Nelements;
|
|
int Nvertices;
|
|
double *vertices;
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
/*****************************************************************************/
|
|
/*****************************************************************************/
|
|
|
|
|
|
/* Aztec's previous AZ_solve() is renamed to AZ_oldsolve() with 3 new */
|
|
/* parameters appended to it: Amat, precond, scaling. */
|
|
/* This routine is never called directly by an application. It is only */
|
|
/* used internally by Aztec. */
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
extern void AZ_oldsolve(double x[], double b[], int options[], double params[],
|
|
double status[], int proc_config[], AZ_MATRIX *Amat,
|
|
AZ_PRECOND *precond, struct AZ_SCALING *scaling);
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
/*****************************************************************************/
|
|
/*****************************************************************************/
|
|
|
|
|
|
/* This is the new Aztec interface. This routine calls AZ_oldsolve() passing */
|
|
/* in for example Amat->indx for the indx[] parameter in AZ_oldsolve(). */
|
|
/* */
|
|
/* NOTE: User's can still invoke AZ_solve() in the old Aztec way. AZ_solve */
|
|
/* also calls AZ_oldsolve(). However, matrix-free and coarse grid */
|
|
/* capabilities are not available via AZ_solve(). */
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
extern void AZ_iterate(double x[], double b[], int options[], double params[],
|
|
double status[], int proc_config[],
|
|
AZ_MATRIX *Amat, AZ_PRECOND *precond, struct AZ_SCALING *scaling);
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#ifdef next_release
|
|
/*****************************************************************************/
|
|
/*****************************************************************************/
|
|
/*****************************************************************************/
|
|
|
|
/* This is the new fortran interface to Aztec. There is a wrapper so that */
|
|
/* fortran user's can invoke AZ_iterate (like 'C' users), however the */
|
|
/* parameters are different as the information that is captured in the */
|
|
/* structures Amat, precond, and scaling must now be passed as parameters. */
|
|
/* */
|
|
/* Note: Multilevel stuff is currently not provided to Fortran users. */
|
|
|
|
extern void AZ_fortransolve(double x[], double b[], int options[],
|
|
double params[], int data_org[], double status[], int proc_config[],
|
|
|
|
int indx[], int bindx[], /* VBR & MSR arrays. Note: all of these */
|
|
int rpntr[], int cpntr[], /* arrays are passed to 'user_Avec' and */
|
|
int bpntr[], double val[], /* to 'user_precond' if supplied. */
|
|
/* */
|
|
AZ_FUNCTION_PTR user_Avec, /* user's matrix-free matvec */
|
|
/* If doing matrix-free, the following */
|
|
/* arrays and functions are passed to the */
|
|
/* user's matvec: */
|
|
int A_ival0[], int A_ival1[],
|
|
int A_ival2[], int A_ival3[],
|
|
double A_dval0[], double A_dval1[],
|
|
double A_dval2[], double A_dval3[],
|
|
AZ_FUNCTION_PTR A_fun0, AZ_FUNCTION_PTR A_fun1,
|
|
AZ_FUNCTION_PTR A_fun2, AZ_FUNCTION_PTR A_fun3,
|
|
|
|
AZ_FUNCTION_PTR user_precond, /* user's preconditioning routine */
|
|
/* */
|
|
/* The following arrays and functions are */
|
|
/* passed to the user's preconditioner: */
|
|
int M_ival0[], int M_ival1[],
|
|
int M_ival2[], int M_ival3[],
|
|
double M_dval0[], double M_dval1[],
|
|
double M_dval2[], double M_dval3[],
|
|
AZ_FUNCTION_PTR M_fun0, AZ_FUNCTION_PTR M_fun1,
|
|
AZ_FUNCTION_PTR M_fun2, AZ_FUNCTION_PTR M_fun3,
|
|
|
|
/* Vectors used to scale the problem. */
|
|
|
|
double left_scale[], double right_scale[]);
|
|
#endif
|
|
|
|
/*****************************************************************************/
|
|
/*****************************************************************************/
|
|
/*****************************************************************************
|
|
|
|
The C user's matrix-vector product must look like this:
|
|
|
|
'Amat.user_function'(double x[], double b[], int options[], double params[],
|
|
AZ_MATRIX *Amat, int proc_config[])
|
|
|
|
where on output b = A * x. The user can put what he wants in 'Amat'
|
|
when he calls AZ_iterate() so that he can use it inside this function.
|
|
|
|
The C user's preconditioner must look like this:
|
|
|
|
'Prec.user_precond'(double x[], int options[], double params[],
|
|
AZ_MATRIX *Prec, int proc_config[])
|
|
|
|
where on output x = M * x. The user can put what he wants in 'Prec'
|
|
when he calls AZ_iterate() so that he can use it inside this function.
|
|
|
|
|
|
|
|
The Fortran user's matrix-vector product must look like this:
|
|
|
|
'user_matvec'(x, b, options, params, data_org, proc_config,
|
|
indx, bindx, rpntr, cpntr, bpntr, val,
|
|
A_ival0, A_ivals1, A_ival2, A_ival3,
|
|
A_dval0, A_dvals1, A_dval2, A_dval3,
|
|
A_fun0, A_fun1, A_fun2, A_fun3)
|
|
|
|
The user can put what he wants in the integer arrays (A_ival*),
|
|
double precision arrays (A_dval*) and functions (A_fun*) when invoking
|
|
Aztec so that he can use them inside this function.
|
|
|
|
NOTE: Additionally, if not using MSR or VBR matrices, the arrays
|
|
indx,bindx,rpntr,cpntr,bpntr, and val can also be used to pass information.
|
|
|
|
|
|
The Fortran user's preconditioner must look like this:
|
|
|
|
'user_precond'(x, options, params, data_org, proc_config,
|
|
indx, bindx, rpntr, cpntr, bpntr, val,
|
|
M_ival0, M_ivals1, M_ival2, M_ival3,
|
|
M_dval0, M_dvals1, M_dval2, M_dval3,
|
|
M_fun0, M_fun1, M_fun2, M_fun3)
|
|
|
|
The user can put what he wants in the integer arrays (M_ival*),
|
|
double precision arrays (M_dval*) and functions (M_fun*) when invoking
|
|
Aztec so that he can use them inside this function.
|
|
|
|
NOTE: Additionally, if not using MSR or VBR matrices, the arrays
|
|
indx,bindx,rpntr,cpntr,bpntr, and val can also be used to pass information.
|
|
|
|
*/
|
|
|
|
|
|
/* Finally, some crude code that defines a function mymatvec() and
|
|
myprecond() each of which use the function myfun() as well as the
|
|
vbr arrays to generate a result.
|
|
|
|
C:
|
|
Amat.bindx = bindx;
|
|
Amat.indx = indx;
|
|
Amat.rpntr = rpntr;
|
|
Amat.cpntr = cpntr;
|
|
Amat.bpntr = bpntr;
|
|
Amat.val = val;
|
|
Amat.user_function = mymatvec;
|
|
Amat.aux_funs = (AZ_FUNCTION_PTR *) calloc(1,sizeof(AZ_FUNCTION_PTR));
|
|
Amat.aux_funs[0] = myfun;
|
|
|
|
Prec.bindx = bindx;
|
|
Prec.indx = indx;
|
|
Prec.rpntr = rpntr;
|
|
Prec.cpntr = cpntr;
|
|
Prec.bpntr = bpntr;
|
|
Prec.val = val;
|
|
Prec.user_function = myprecond;
|
|
Prec.aux_funs = (AZ_FUNCTION_PTR *) calloc(1,sizeof(AZ_FUNCTION_PTR));
|
|
Prec.aux_funs[0] = myfun;
|
|
|
|
AZ_iterate(x, ax, options, params, status, proc_config,
|
|
&Amat, &Prec, &Scaling);
|
|
|
|
Fortran:
|
|
|
|
call AZ_iterate(x,b, options, params, data_org, status,
|
|
$ proc_config, NULL,bindx,NULL,NULL,NULL, val,
|
|
$ mymatvec, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
$ NULL, NULL, myfun, NULL, NULL, NULL,
|
|
$ myprecond, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
$ NULL, NULL, myfun, NULL, NULL, NULL,
|
|
$ NULL, NULL)
|
|
|
|
*/
|
|
/* constants */
|
|
|
|
|
|
/* function definitions */
|
|
|
|
#ifndef AZ_MAX
|
|
#define AZ_MAX(x,y) (( (x) > (y) ) ? (x) : (y)) /* max function */
|
|
#endif
|
|
#ifndef AZ_MIN
|
|
#define AZ_MIN(x,y) (( (x) < (y) ) ? (x) : (y)) /* min function */
|
|
#endif
|
|
#ifndef AZ_SGN
|
|
#define AZ_SGN(x) (( (x) < 0.0 ) ? -1.0 : 1.0) /* sign function */
|
|
#endif
|
|
|
|
/*
|
|
* There are different conventions for external names for fortran subroutines.
|
|
* In addition, different compilers return differing caluse for a fortran
|
|
* subroutine call. In this section we take these into account.
|
|
*/
|
|
|
|
# define AZ_FNROOT_F77 F77_FUNC_(az_fnroot,AZ_FNROOT)
|
|
# define MC64AD_F77 F77_FUNC(mc64ad,MC64AD)
|
|
# define AZ_RCM_F77 F77_FUNC_(az_rcm,AZ_RCM)
|
|
# define AZ_BROADCAST_F77 F77_FUNC_(az_broadcast,AZ_BROADCAST)
|
|
# define AZ_CHECK_INPUT_F77 F77_FUNC_(az_check_input,AZ_CHECK_INPUT)
|
|
# define AZ_CHECK_MSR_F77 F77_FUNC_(az_check_msr,AZ_CHECK_MSR)
|
|
# define AZ_CHECK_VBR_F77 F77_FUNC_(az_check_vbr,AZ_CHECK_VBR)
|
|
# define AZ_DEFAULTS_F77 F77_FUNC_(az_defaults,AZ_DEFAULTS)
|
|
# define AZ_EXCHANGE_BDRY_F77 F77_FUNC_(az_exchange_bdry,AZ_EXCHANGE_BDRY)
|
|
# define AZ_FIND_INDEX_F77 F77_FUNC_(az_find_index,AZ_FIND_INDEX)
|
|
# define AZ_FIND_LOCAL_INDICES_F77 F77_FUNC_(az_find_local_indices,AZ_FIND_LOCAL_INDICES)
|
|
# define AZ_FIND_PROCS_FOR_EXTERNS_F77 F77_FUNC_(az_find_procs_for_externs,AZ_FIND_PROCS_FOR_EXTERNS)
|
|
# define AZ_FREE_MEMORY_F77 F77_FUNC_(az_free_memory,AZ_FREE_MEMORY)
|
|
# define AZ_GAVG_DOUBLE_F77 F77_FUNC_(az_gavg_double,AZ_GAVG_DOUBLE)
|
|
# define AZ_GDOT_F77 F77_FUNC_(az_gdot,AZ_GDOT)
|
|
# define AZ_GMAX_DOUBLE_F77 F77_FUNC_(az_gmax_double,AZ_GMAX_DOUBLE)
|
|
# define AZ_GMAX_INT_F77 F77_FUNC_(az_gmax_int,AZ_GMAX_INT)
|
|
# define AZ_GMAX_MATRIX_NORM_F77 F77_FUNC_(az_gmax_matrix_norm,AZ_GMAX_MATRIX_NORM)
|
|
# define AZ_GMAX_VEC_F77 F77_FUNC_(az_gmax_vec,AZ_GMAX_VEC)
|
|
# define AZ_GMIN_DOUBLE_F77 F77_FUNC_(az_gmin_double,AZ_GMIN_DOUBLE)
|
|
# define AZ_GMIN_INT_F77 F77_FUNC_(az_gmin_int,AZ_GMIN_INT)
|
|
# define AZ_GSUM_DOUBLE_F77 F77_FUNC_(az_gsum_double,AZ_GSUM_DOUBLE)
|
|
# define AZ_GSUM_INT_F77 F77_FUNC_(az_gsum_int,AZ_GSUM_INT)
|
|
# define AZ_GSUM_VEC_F77 F77_FUNC_(az_gsum_vec,AZ_GSUM_VEC)
|
|
# define AZ_GVECTOR_NORM_F77 F77_FUNC_(az_gvector_norm,AZ_GVECTOR_NORM)
|
|
# define AZ_INIT_QUICK_FIND_F77 F77_FUNC_(az_init_quick_find,AZ_INIT_QUICK_FIND)
|
|
# define AZ_INVORDER_VEC_F77 F77_FUNC_(az_invorder_vec,AZ_INVORDER_VEC)
|
|
# define AZ_MATVEC_MULT_F77 F77_FUNC_(az_matvec_mult,AZ_MATVEC_MULT)
|
|
# define AZ_VBR_MATVEC_MULT_F77 F77_FUNC_(az_VBR_matvec_mult,AZ_VBR_MATVEC_MULT)
|
|
# define AZ_MSR_MATVEC_MULT_F77 F77_FUNC_(az_MSR_matvec_mult,AZ_MSR_MATVEC_MULT)
|
|
# define AZ_MSR2VBR_F77 F77_FUNC_(az_msr2vbr,AZ_MSR2VBR)
|
|
# define AZ_ORDER_ELE_F77 F77_FUNC_(az_order_ele,AZ_ORDER_ELE)
|
|
# define AZ_PR_ERROR_F77 F77_FUNC_(az_pr_error,AZ_PR_ERROR)
|
|
# define AZ_PRINT_OUT_F77 F77_FUNC_(az_print_out,AZ_PRINT_OUT)
|
|
# define AZ_PROCESSOR_INFO_F77 F77_FUNC_(az_processor_info,AZ_PROCESSOR_INFO)
|
|
# define AZ_QUICK_FIND_F77 F77_FUNC_(az_quick_find,AZ_QUICK_FIND)
|
|
# define AZ_READ_MSR_MATRIX_F77 F77_FUNC_(az_read_msr_matrix,AZ_READ_MSR_MATRIX)
|
|
# define AZ_READ_UPDATE_F77 F77_FUNC_(az_read_update,AZ_READ_UPDATE)
|
|
# define AZ_REORDER_MATRIX_F77 F77_FUNC_(az_reorder_matrix,AZ_REORDER_MATRIX)
|
|
# define AZ_REORDER_VEC_F77 F77_FUNC_(az_reorder_vec,AZ_REORDER_VEC)
|
|
# define AZ_GET_COMM_F77 F77_FUNC_(az_get_comm,AZ_GET_COMM)
|
|
# define AZ_SET_COMM_F77 F77_FUNC_(az_set_comm,AZ_SET_COMM)
|
|
# define AZ_SET_MESSAGE_INFO_F77 F77_FUNC_(az_set_message_info,AZ_SET_MESSAGE_INFO)
|
|
# define AZ_SET_PROC_CONFIG_F77 F77_FUNC_(az_set_proc_config,AZ_SET_PROC_CONFIG)
|
|
# define AZ_SORT_F77 F77_FUNC_(az_sort,AZ_SORT)
|
|
# define AZ_SOLVE_F77 F77_FUNC_(az_solve,AZ_SOLVE)
|
|
# define AZ_TRANSFORM_F77 F77_FUNC_(az_transform,AZ_TRANSFORM)
|
|
|
|
#if defined(CRAY_T3X)
|
|
|
|
#define AZ_DLASWP_F77 F77_FUNC_(az_slaswp,AZ_SLASWP)
|
|
#define AZ_DLAIC1_F77 F77_FUNC_(az_slaic1,AZ_SLAIC1)
|
|
|
|
#else
|
|
|
|
#define AZ_DLASWP_F77 F77_FUNC_(az_dlaswp,AZ_DLASWP)
|
|
#define AZ_DLAIC1_F77 F77_FUNC_(az_dlaic1,AZ_DLAIC1)
|
|
|
|
#endif
|
|
|
|
#ifndef FSUB_TYPE
|
|
#define FSUB_TYPE void
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
#include <stdio.h>
|
|
extern "C" {
|
|
#endif
|
|
|
|
void PREFIX AZ_DLASWP_F77(int *, double *, int *, int *, int *, int *, int *);
|
|
|
|
void PREFIX AZ_DLAIC1_F77(int * , int *, double *, double *, double *, double *,
|
|
double *, double *, double *);
|
|
void PREFIX AZ_SLASWP_F77(int *, float *, int *, int *, int *, int *, int *);
|
|
|
|
void PREFIX AZ_SLAIC1_F77(int * , int *, float *, float *, float *, float *,
|
|
float *, float *, float *);
|
|
|
|
/* Aztec function prototypes that can be called by the user */
|
|
|
|
extern void AZ_solve(
|
|
double x[], /* On input 'x' contains the initial guess. On output*/
|
|
/* 'x' contains the solution to our linear system. */
|
|
/* NOTE: THis vector must be of size >= N + NExt */
|
|
double b[], /* right hand side of linear system. */
|
|
/* NOTE: This vector must be of size >= N */
|
|
int options[],
|
|
double params[],
|
|
int indx[], /* The ith element of indx points to the location in */
|
|
/* val of the (0,0) entry of the ith block entry. The*/
|
|
/* last element is the number of nonzero entries of */
|
|
/* matrix A plus one. */
|
|
int bindx[], /* Contains the block column indices of the non-zero */
|
|
/* block entries. */
|
|
int rpntr[], /* The ith element of rpntr indicates the first point*/
|
|
/* row in the ith block row. The last element is the */
|
|
/* number of block rows plus one. */
|
|
int cpntr[], /* The jth element of cpntr indicates the first point*/
|
|
/* column in the jth block column. The last element */
|
|
/* is the number of block columns plus one. */
|
|
int bpntr[], /* The ith element of bpntr points to the first block*/
|
|
/* entry of the ith row in bindx. The last element is*/
|
|
/* the number of nonzero blocks of matrix A plus one.*/
|
|
double val[], /* matrix A in sparse format (VBR) . */
|
|
/* Indicates current level of factorization */
|
|
/* factor_flag = */
|
|
/* 1: indicates first call to precond. routine */
|
|
/* that performs some type of factorization */
|
|
/* preprocessing such as an incomplete LU. */
|
|
/* */
|
|
/* 2: use preprocessing info. from a previous */
|
|
/* call. Implies some further change in the */
|
|
/* the numerical entries rather than the sparse */
|
|
/* pattern. */
|
|
/* */
|
|
/* 3: use precondtioner from last level 1 or 2 */
|
|
/* call to precond. (see specific precondioner */
|
|
/* for more info) */
|
|
int data_org[], double status[], int proc_config[]);
|
|
|
|
extern int AZ_initialize(double x[], double b[], int options[],
|
|
double params[], double status[], int proc_config[], AZ_MATRIX *Amat,
|
|
AZ_PRECOND *precond, int save_old_values[], struct AZ_SCALING *);
|
|
|
|
extern void AZ_finalize(double x[], double b[], int options[], int
|
|
proc_config[], AZ_MATRIX *Amat, AZ_PRECOND *precond, int save_old_values[],
|
|
struct AZ_SCALING *scaling);
|
|
|
|
extern void AZ_iterate_setup(int options[], double params[], int proc_config[],
|
|
AZ_MATRIX *Amat, AZ_PRECOND *precond);
|
|
|
|
extern void AZ_iterate_finish(int options[], AZ_MATRIX *Amat,
|
|
AZ_PRECOND *precond);
|
|
|
|
extern int AZ_oldsolve_setup(double x[], double b[], int options[],
|
|
double params[], double status[], int proc_config[], AZ_MATRIX *Amat,
|
|
AZ_PRECOND *precond, int save_old_values[], struct AZ_SCALING *);
|
|
|
|
extern void AZ_oldsolve_finish(double x[], double b[], int options[],
|
|
int proc_config[], AZ_MATRIX *Amat, int save_old_values[],
|
|
struct AZ_SCALING *);
|
|
|
|
extern void AZ_abs_matvec_mult (double *b, double *c,AZ_MATRIX *Amat,int proc_config[]);
|
|
|
|
extern void AZ_add_new_ele(int cnptr[], int col, int blk_row, int bindx[],
|
|
int bnptr[], int indx[], double val[], int therow,
|
|
double new_ele, int maxcols, int blk_space,
|
|
int nz_space, int blk_type);
|
|
|
|
extern void AZ_add_new_row(int therow, int *nz_ptr, int *current, double
|
|
**val, int **bindx, char *input,FILE *dfp,
|
|
int *msr_len, int *column0);
|
|
|
|
extern int AZ_adjust_N_nz_to_fit_memory(int N, int , int);
|
|
|
|
extern char *AZ_allocate(unsigned int iii);
|
|
|
|
extern char *AZ_allocate_or_free(void *ptr, unsigned int size, int action);
|
|
|
|
extern void AZ_backsolve(double newa[], double pivot[], double x[], int snr[],
|
|
int ha[], int iflag[], int *ifail, int *nn, int *n, int *iha);
|
|
|
|
extern void AZ_block_diagonal_scaling(int action, AZ_MATRIX *Amat, double val[],
|
|
int indx[], int bindx[], int rpntr[], int cpntr[], int bpntr[],
|
|
int data_org[], double b[], int options[], int proc_config[],
|
|
struct AZ_SCALING *scaling);
|
|
|
|
|
|
extern int AZ_breakdown_f(int N, double v[], double w[], double inner,
|
|
int proc_config[]);
|
|
|
|
extern void AZ_broadcast(char *ptr, int length, int proc_config[], int action);
|
|
|
|
extern unsigned int AZ_broadcast_info(char buffer[], int proc_config[],
|
|
unsigned int length);
|
|
|
|
extern void AZ_calc_blk_diag_inv(double *val, int *indx, int *bindx,
|
|
int *rpntr, int *cpntr, int *bpntr,
|
|
double *d_inv, int *d_indx, int *d_bindx,
|
|
int *d_rpntr, int *d_bpntr, int data_org[]);
|
|
|
|
extern void AZ_calc_blk_diag_LU(double *val, int *indx, int *bindx, int *rpntr,
|
|
int *cpntr, int *bpntr, double *d_inv, int *d_indx,
|
|
int *d_bindx, int *d_rpntr, int *d_bpntr,
|
|
int *data_org, int *ipvt);
|
|
|
|
extern double AZ_calc_iter_flops(int solver_flag, double inner_flops,
|
|
double daxpy_flops, double matvec_flops,
|
|
int total_its, double gnnz, double K);
|
|
|
|
extern double AZ_calc_precond_flops(int solver_flag, int options[],
|
|
double daxpy_flops, double matvec_flops,
|
|
int total_its, int gn, double gnnz,
|
|
int data_org[], int proc_config[]);
|
|
|
|
extern double AZ_calc_solve_flops(int options[], int, double , int , double,
|
|
int data_org[], int proc_config[]);
|
|
|
|
extern void AZ_change_it(int indx[], int length, int *first, int *total,
|
|
int b[]);
|
|
|
|
extern void AZ_change_sign(double *lambda_max, double val[], int indx[],
|
|
int bindx[], int rpntr[], int cpntr[], int bpntr[],
|
|
int data_org[]);
|
|
extern void AZ_check_block_sizes(int bindx[], int cpntr[], int Nrows,
|
|
int *new_block);
|
|
|
|
extern int AZ_check_input(int data_org[], int options[], double params[],
|
|
int proc_config[]);
|
|
|
|
extern void AZ_check_msr(int *bindx, int N_update, int N_external,
|
|
int option, int *proc_config);
|
|
|
|
extern int AZ_check_options(int * , int ,int data_org[], int,double *,
|
|
AZ_MATRIX *, AZ_PRECOND *);
|
|
|
|
extern void AZ_check_vbr(int N_update, int N_external, int option,
|
|
int bindx[], int bnptr[], int cnptr[], int rnptr[],
|
|
int proc_config[]);
|
|
|
|
extern void AZ_combine_overlapped_values(int sym_flag, int data_org[],
|
|
int options[], double x[], int map[], double ext_vals[], int name,
|
|
int proc_config[]);
|
|
|
|
extern int AZ_compare_update_vs_soln(int N, double, double alpha, double p[],
|
|
double x[],
|
|
double update_reduction, int ouput_flag, int proc_config[], int *first_time);
|
|
|
|
extern int AZ_compress_msr(int *ibindx[], double *ival[], int allocated,
|
|
int needed, int name, struct context *context);
|
|
|
|
extern void AZ_compute_global_scalars(AZ_MATRIX *Amat,
|
|
double x[], double b[], double r[],
|
|
double w[], double *r_norm,
|
|
double *scaled_r_norm, int option_i[],
|
|
int data_org[], int proc_config[],
|
|
int *use_r, double v1[], double v2[],
|
|
double *value,
|
|
struct AZ_CONVERGE_STRUCT *);
|
|
|
|
extern void AZ_compute_matrix_size(AZ_MATRIX *Amat, int options[],
|
|
int N_nz_unpadded, int N_unpadded, int *N_nz_padded, int N_external,
|
|
int *max_row, int *N, int *N_nz, double fill,int *extra_fact_nz_per_row,
|
|
int Nb_unpadded, int *bandwidth);
|
|
|
|
extern int AZ_compute_max_nz_per_row(AZ_MATRIX *Amat, int N, int Nb,
|
|
int *largest_band);
|
|
|
|
|
|
extern void AZ_compute_residual( double b[], double u[], double r[],
|
|
int proc_config[], AZ_MATRIX *);
|
|
|
|
extern void AZ_convert_ptrs_to_values(int array[], int length);
|
|
|
|
extern void AZ_convert_values_to_ptrs(int array[], int length, int start);
|
|
|
|
extern struct AZ_CONVERGE_STRUCT *AZ_converge_create(void);
|
|
extern void AZ_converge_destroy(struct AZ_CONVERGE_STRUCT **temp);
|
|
|
|
extern AZ_MATRIX *AZ_create_matrix(int local, int additional, int matrix_type,
|
|
int local_blks, int *not_using);
|
|
|
|
extern void AZ_defaults(int options[], double params[]);
|
|
|
|
extern void AZ_delete_matrix(AZ_MATRIX *ptr);
|
|
|
|
extern void AZ_dgemv2(int m, int n, double *a, double *x, double *y);
|
|
|
|
extern void AZ_dgemv3(int m, int n, double *a, double *x, double *y);
|
|
|
|
extern void AZ_direct_sort(int b[], int indx[], char buffer[], char a[],
|
|
int *start, int buf_len, int *ind_index,
|
|
int *the_first, int *real_lists, int *pre_mid);
|
|
|
|
extern void AZ_divide_block(int i, int j, double val[], int indx[],
|
|
int bindx[], int cpntr[], double *z,
|
|
double *blockj, double *blocki, int *ipvt);
|
|
|
|
extern void AZ_divide_block0(int i, int j, double val[], int indx[],
|
|
int bindx[], int cpntr[], int *ipvt);
|
|
|
|
extern void AZ_domain_decomp(double x[], AZ_MATRIX *Amat, int options[],
|
|
int proc_config[], double params[],
|
|
struct context *context);
|
|
|
|
extern void AZ_dtrans(int *, int *, double *);
|
|
|
|
extern void AZ_equil_scaling(int action, AZ_MATRIX *Amat,
|
|
double b[],
|
|
double x[], int options[],
|
|
int proc_config[], struct AZ_SCALING *scaling);
|
|
|
|
extern void AZ_exchange_bdry(double x[], int data_org[], int proc_config[]);
|
|
|
|
extern void AZ_exchange_local_info(int N_neighbors, int proc_num_neighbor[],
|
|
char *message_send_add[],
|
|
unsigned int message_send_length[],
|
|
char *message_recv_add[],
|
|
unsigned int message_recv_length[],
|
|
int type, int proc_config[]);
|
|
|
|
extern int AZ_exit(int input);
|
|
|
|
extern int AZ_extract_comm_info(int **idata_org, int (*user_comm)(double *,
|
|
AZ_MATRIX *), AZ_MATRIX *,
|
|
int proc_config[], int N_cols, int Nghost);
|
|
|
|
extern void AZ_fact_bilu(int new_blks, AZ_MATRIX *A_overlapped,
|
|
int *diag_block, int *pivot);
|
|
|
|
extern void AZ_fact_chol(int bindx[], double val[], int N,
|
|
double rthresh, double athresh);
|
|
|
|
extern void AZ_fact_ilut( int *, AZ_MATRIX *, double *a, int *ja,
|
|
double drop, int extra_fact_nz_per_row, int shift,
|
|
int *iu, double *cr, double *unorm, int *ind,
|
|
int *nz_used, int *jnz,
|
|
double rthresh, double athresh);
|
|
|
|
extern void AZ_fact_lu(double x[], AZ_MATRIX *A_overlapped, double *aflag, double *pivot,
|
|
int *rnr, int *ha, int *iflag, int *, int*, int *, int *, int *);
|
|
|
|
extern void AZ_fact_rilu(int N, int *nz_used, int *iu, int *iw,
|
|
AZ_MATRIX *A_overlapped, double omega,
|
|
double rthresh, double athresh);
|
|
|
|
extern void AZ_factor_subdomain(struct context *context, int N,
|
|
int N_nz, int *nz_used);
|
|
|
|
extern int AZ_fill_sparsity_pattern(struct context *context, int ifill,
|
|
int bindx[], double val[], int N);
|
|
|
|
extern int AZ_find_block_col(int cnptr[], int column, int maxcols,
|
|
int blk_type);
|
|
|
|
extern int AZ_find_block_in_row(int bindx[], int bnptr[], int i, int blk_col,
|
|
int indx[], int, double val[], int blk_space,
|
|
int nz_space);
|
|
|
|
extern void AZ_find_MSR_ordering(int bindx2[],int **ordering,int N,
|
|
int **inv_ordering, int name, struct context *);
|
|
|
|
extern int AZ_find_closest_not_larger(int key, int list[], int length);
|
|
|
|
extern int AZ_find_index(int key, int list[], int length);
|
|
|
|
extern void AZ_find_local_indices(int N_update, int bindx[], int update[],
|
|
int **external, int *N_external, int mat_type,
|
|
int bpntr[]);
|
|
|
|
extern void AZ_find_procs_for_externs(int N_update, int update[],
|
|
int external[], int N_external,
|
|
int proc_config[], int **extern_proc);
|
|
|
|
extern int AZ_find_simple(int, int *, int, int *, int, int *, int *);
|
|
|
|
extern void AZ_find_global_ordering(int proc_config[], AZ_MATRIX *Amat,
|
|
int **global_bindx, int **update);
|
|
|
|
extern void AZ_revert_to_global(int proc_config[], AZ_MATRIX *Amat,
|
|
int **global_bindx, int **update);
|
|
|
|
|
|
extern void AZ_fix_pt(double *, double *, double *, int *, double * , int * ,
|
|
double *, AZ_MATRIX *, AZ_PRECOND *, struct AZ_CONVERGE_STRUCT *);
|
|
|
|
extern void AZ_flop_rates(int data_org[],int indx[],int bpntr[], int bindx[],
|
|
int options[], double status[], double total_time,
|
|
int proc_config[]);
|
|
|
|
extern void AZ_free(void *ptr);
|
|
|
|
extern void AZ_free_memory(int label);
|
|
|
|
extern void AZ_free_space_holder(struct context *variables);
|
|
|
|
extern void AZ_gappend(int vals[], int *cur_length, int total_length,
|
|
int proc_config[]);
|
|
|
|
extern double AZ_gavg_double(double var, int proc_config[]);
|
|
|
|
extern double AZ_gdot(int N, double r[], double z[], int proc_config[]);
|
|
|
|
extern void AZ_gdot_vec(int N, double dots[], double dots2[],
|
|
int proc_config[]);
|
|
|
|
extern int AZ_get_block(int j, int k, int bindx[], int bpntr[], int *ptr_j);
|
|
|
|
extern unsigned int AZ_get_sol_param_size(void);
|
|
|
|
extern int AZ_get_new_eps(double *epsilon, double, double, int options[],
|
|
int proc_config[]);
|
|
|
|
extern void AZ_get_poly_coefficients(int power, double b, double c[],
|
|
int param_flag);
|
|
|
|
extern int AZ_get_sym_indx(int, int, int *, int *, int *);
|
|
|
|
extern void AZ_get_x_incr(int options[], int data_org[], int proc_config[],
|
|
double params[], int i, double **hh, double *rs,
|
|
double *trash, double **ss, AZ_MATRIX *,
|
|
AZ_PRECOND *, double *, int *, int *, int);
|
|
|
|
extern double AZ_gmax_double(double, int proc_config[]);
|
|
|
|
extern int AZ_gmax_int(int val, int proc_config[]);
|
|
|
|
extern double AZ_gmax_matrix_norm(double val[], int indx[], int bindx[],
|
|
int rpntr[], int cpntr[], int bpntr[],
|
|
int proc_config[], int data_org[]);
|
|
|
|
extern double AZ_gmax_vec(int N, double vec[], int proc_config[]);
|
|
|
|
extern double AZ_gmin_double(double var, int proc_config[]);
|
|
|
|
extern int AZ_gmin_int(int val, int proc_config[]);
|
|
|
|
extern double AZ_gsum_double(double , int proc_config[]);
|
|
|
|
extern int AZ_gsum_int(int totals, int proc_config[]);
|
|
|
|
extern void AZ_gsum_vec_int(int vals[], int vals2[], int length,
|
|
int proc_config[]);
|
|
|
|
extern double AZ_gvector_norm(int n, int p, double *x, int *);
|
|
|
|
extern void AZ_hold_space(struct context *context, int N);
|
|
|
|
extern void AZ_init_quick_find(int list[], int length, int *shift, int *bins);
|
|
|
|
extern void AZ_init_subdomain_solver(struct context *context);
|
|
|
|
extern void AZ_invorder_vec(double vec[], int data_org[], int update_index[],
|
|
int rpntr[],double newarray[]);
|
|
|
|
extern void AZ_list_print(int ivec[] , int length, double dvec[], int length2);
|
|
|
|
extern void AZ_loc_avg(AZ_MATRIX *Amat, double r[], double newr[], int N_fixed,
|
|
int fixed_pts[], int proc_config[]);
|
|
|
|
extern void AZ_lower_triang_vbr_solve(int Nrows, int cpntr[], int bpntr[],
|
|
int indx[], int bindx[], double val[], double b[]);
|
|
|
|
extern void AZ_lower_icc(int bindx[],double val[],int N, double rhs[]);
|
|
|
|
extern void AZ_lower_tsolve(double x[],int , double l[], int il[],
|
|
int jl[], double y[] );
|
|
|
|
extern double *AZ_manage_memory(unsigned int size, int action, int type,
|
|
char *name, int *status);
|
|
|
|
extern struct AZ_MATRIX_STRUCT *AZ_matrix_create(int local);
|
|
|
|
extern struct AZ_MATRIX_STRUCT *AZ_submatrix_create(AZ_MATRIX *Amat, int Nsub_rows,
|
|
int sub_rows[], int Nsub_cols, int sub_cols[], int proc_config[]);
|
|
|
|
void AZ_submatrix_destroy(AZ_MATRIX **submat);
|
|
|
|
extern struct AZ_MATRIX_STRUCT *AZ_blockmatrix_create(AZ_MATRIX **submat_list, int Nsub_mats,
|
|
int **submat_locs, int Nblock_rows, int Nblock_cols, int Nsub_rows[], int **sub_rows,
|
|
int Nsub_cols[], int **sub_cols, int proc_config[]);
|
|
|
|
void AZ_blockmatrix_destroy(AZ_MATRIX **blockmat);
|
|
|
|
extern void AZ_matrix_init(AZ_MATRIX *Amat, int local);
|
|
|
|
typedef void (*AZ_PREC_FUN)(double*, int*, int*, double*,
|
|
struct AZ_MATRIX_STRUCT*,
|
|
struct AZ_PREC_STRUCT*);
|
|
|
|
extern struct AZ_PREC_STRUCT *AZ_precond_create(struct AZ_MATRIX_STRUCT *Pmat,
|
|
AZ_PREC_FUN,
|
|
void *data);
|
|
|
|
extern void AZ_matrix_destroy( struct AZ_MATRIX_STRUCT **Amat);
|
|
extern void AZ_precond_destroy(struct AZ_PREC_STRUCT **precond);
|
|
|
|
|
|
|
|
extern void AZ_matfree_Nnzs(AZ_MATRIX *Amat);
|
|
|
|
extern void AZ_matfree_2_msr(AZ_MATRIX *Amat,double *val, int *bindx, int N_nz);
|
|
|
|
#ifdef AZ_COL_REORDER
|
|
extern void AZ_mat_colperm(int N, int bindx2[], double val2[],
|
|
int **inv_ordering, int name, struct context *);
|
|
#endif
|
|
|
|
extern void AZ_mat_reorder(int n, int bindx[], double val[], int perm[],
|
|
int invp[]);
|
|
|
|
extern void AZ_matvec_mult(double *val, int *indx, int *bindx, int *rpntr,
|
|
int *cpntr, int *bpntr, double *b, double *c,
|
|
int exchange_flag, int *data_org);
|
|
|
|
extern void AZ_mk_context(int options[], double params[], int data_org[],
|
|
AZ_PRECOND *precond, int proc_config[]);
|
|
|
|
extern void AZ_mk_identifier(double *params, int *options,
|
|
int *data_org, char *tag);
|
|
|
|
extern void AZ_MSR_mult_patterns(int *bindx, int N, int *work1, int length,
|
|
int *work2);
|
|
|
|
extern void AZ__MPI_comm_space_ok(void);
|
|
|
|
extern int AZ_MSR_getrow(int columns[], double values[], int row_lengths[],
|
|
struct AZ_MATRIX_STRUCT *Amat, int N_requested_rows,
|
|
int requested_rows[], int allocated_space);
|
|
|
|
extern int AZ_VBR_getrow(int columns[], double values[], int row_lengths[],
|
|
struct AZ_MATRIX_STRUCT *Amat, int N_requested_rows,
|
|
int requested_rows[], int allocated_space);
|
|
|
|
|
|
|
|
|
|
extern void AZ_msr2lu(int oldN, AZ_MATRIX *A_overlapped, int *rnr);
|
|
|
|
extern void AZ_msr2vbr(double val[], int indx[], int rnptr[], int cnptr[],
|
|
int bnptr[], int bindx[], int msr_bindx[],
|
|
double msr_val[], int total_blk_rows,
|
|
int total_blk_cols, int blk_space, int nz_space,
|
|
int blk_type);
|
|
|
|
extern void AZ_msr2vbr_mem_efficient(int N, int **ibindx, double **ival,
|
|
int **icpntr, int **ibpntr, int **iindx,
|
|
int *N_blk_rows, int name, char *label, int);
|
|
|
|
extern void AZ_order(int M, double *val_old, double *val_new, int *bindx,
|
|
int *indx_old, int *indx_new, int *bpntr,
|
|
int *diag_bloc);
|
|
|
|
extern void AZ_order_ele(int update_index[], int extern_index[],
|
|
int *internal, int *border, int N_update,
|
|
int msr_bindx[], int bindx[], int extern_proc[],
|
|
int N_external, int option, int m_type);
|
|
|
|
extern void AZ_p_error(char *str, int proc);
|
|
|
|
extern void AZ_pad_matrix(struct context *context, int proc_config[],
|
|
int N_unpadded, int *N, int **map, int **padded_data_org,
|
|
int *N_nz, int estimated_requirements);
|
|
|
|
extern void AZ_pbicgstab(double *, double *, double *, int *, double *,
|
|
int *, double *, AZ_MATRIX *, AZ_PRECOND *, struct AZ_CONVERGE_STRUCT *);
|
|
|
|
extern void AZ_pcg_f(double *, double *, double *, int *, double * , int * ,
|
|
double *, AZ_MATRIX *, AZ_PRECOND *, struct AZ_CONVERGE_STRUCT *);
|
|
|
|
extern void AZ_pcgs(double *, double *, double *, int *, double * , int * ,
|
|
double *, AZ_MATRIX *, AZ_PRECOND *, struct AZ_CONVERGE_STRUCT *);
|
|
|
|
extern void AZ_perror(char *string);
|
|
|
|
extern void AZ_pgmresr(double *, double *, double *, int *, double * , int * ,
|
|
double *, AZ_MATRIX *, AZ_PRECOND *, struct AZ_CONVERGE_STRUCT *);
|
|
|
|
extern void AZ_pgmres(double *, double *, double *, int *, double * , int * ,
|
|
double *, AZ_MATRIX *, AZ_PRECOND *, struct AZ_CONVERGE_STRUCT *);
|
|
|
|
extern void AZ_polynomial_expansion( double z[], int options[],
|
|
int proc_config[], AZ_PRECOND *);
|
|
|
|
extern int AZ_pos( int , int bindx[] , int position[], int inv_ordering[],
|
|
double , int );
|
|
|
|
|
|
extern void AZ_precondition(double x[], int options[], int proc_config[],
|
|
double params[], AZ_MATRIX *, AZ_PRECOND *);
|
|
|
|
extern void AZ_pqmrs(double *, double *, double *, int *, double * , int * ,
|
|
double *, AZ_MATRIX *, AZ_PRECOND *, struct AZ_CONVERGE_STRUCT *);
|
|
|
|
extern void AZ_print_call_iter_solve(int * , double *, int , int, AZ_MATRIX *, AZ_PRECOND *);
|
|
|
|
extern void AZ_print_error(int error_code);
|
|
|
|
extern void AZ_print_header(int options[], int mem_overlapped,
|
|
int mem_orig, int mem_factor);
|
|
|
|
#ifdef AZ_ENABLE_CAPTURE_MATRIX
|
|
extern void AZ_capture_matrix(AZ_MATRIX * Amat,
|
|
int proc_config[], int data_org[], double b[]);
|
|
#endif
|
|
|
|
extern void AZ_print_out(int update_index[], int extern_index[], int update[],
|
|
int external[],
|
|
double val[], int indx[], int
|
|
bindx[], int rpntr[], int cpntr[], int bpntr[], int
|
|
proc_config[], int choice, int matrix, int N_update,
|
|
int N_external, int off_set );
|
|
|
|
extern void AZ_print_sync_start(int proc,int do_print_line,int proc_config[]);
|
|
|
|
extern void AZ_print_sync_end(int proc_config[], int do_print_line);
|
|
|
|
extern void AZ_processor_info(int proc_config[]);
|
|
|
|
extern void AZ_put_in_dbl_heap(int *row, double vals[], int heap[],
|
|
int *length);
|
|
extern void AZ_put_in_heap(int heap[], int *val,int *length);
|
|
|
|
extern int AZ_quick_find(int key, int list[],int length, int shift,
|
|
int bins[]);
|
|
|
|
extern void AZ_random_vector(double u[], int data_org[], int proc_config[]);
|
|
|
|
extern void AZ_read_msr_matrix(int update[], double **val, int **bindx,
|
|
int N_update, int proc_config[]);
|
|
|
|
extern void AZ_read_update(int *N_update_blks, int *update_blks[],
|
|
int proc_config[], int bigN, int chunk,
|
|
int input_option);
|
|
|
|
extern void AZ_input_msr_matrix(char datafile[], int update[], double **val, int **bindx,
|
|
int N_update, int proc_config[]);
|
|
|
|
extern void AZ_input_update(char datafile[], int *N_update_blks, int *update_blks[],
|
|
int proc_config[], int bigN, int chunk,
|
|
int input_option);
|
|
|
|
extern char *AZ_realloc(void *ptr, unsigned int size);
|
|
|
|
extern void AZ_recover_sol_params(int instance, int **sub_options,
|
|
double **sub_params, double **sub_status, AZ_MATRIX **sub_matrix,
|
|
AZ_PRECOND **sub_precond, struct AZ_SCALING **);
|
|
|
|
extern void AZ_reorder_matrix(int N_update, int bindx[], double val[],
|
|
int update_index[], int extern_index[],
|
|
int indx[], int rnptr[], int bnptr[],
|
|
int N_external, int cnptr[], int option,
|
|
int);
|
|
|
|
extern void AZ_reorder_vec(double vec[], int data_org[], int update_index[],
|
|
int rpntr[]);
|
|
|
|
extern void AZ_global2local(int data_org[], int bindx[], int update[],
|
|
int update_index[], int externs[], int extern_index[]);
|
|
|
|
extern void AZ_restore_unreordered_bindx(int bindx[], double val[], int update[],
|
|
int update_index[], int external[],
|
|
int extern_index[], int data_org[]);
|
|
|
|
extern void AZ_reverse_it(int indx[], int length, int first, int total,
|
|
int b[]);
|
|
|
|
extern void AZ_rm_context(int options[], double params[], int data_org[]);
|
|
|
|
extern void AZ_rm_dbl_heap_root(int heap[], double vals[], int *length);
|
|
|
|
extern void AZ_rm_heap_root(int heap[], int *length);
|
|
|
|
extern void AZ_rm_duplicates(int array[], int *N);
|
|
|
|
extern void AZ_row_sum_scaling(int action, AZ_MATRIX *Amat,
|
|
double b[], int options[],
|
|
struct AZ_SCALING *scaling);
|
|
|
|
extern void AZ_scale_f(int action, AZ_MATRIX *Amat, int options[], double b[],
|
|
double x[], int proc_config[], struct AZ_SCALING *scaling);
|
|
|
|
extern struct AZ_SCALING *AZ_scale_matrix_only(AZ_MATRIX *Amat, int options[],
|
|
int proc_config[]);
|
|
|
|
extern void AZ_scale_rhs_only(double b[], AZ_MATRIX *Amat, int options[],
|
|
int proc_config[], struct AZ_SCALING *scaling);
|
|
|
|
extern void AZ_scale_sol_only(double x[], AZ_MATRIX *Amat, int options[],
|
|
int proc_config[], struct AZ_SCALING *scaling);
|
|
|
|
extern void AZ_scale_rhs_sol_before_iterate(double x[], double b[],
|
|
AZ_MATRIX *Amat, int options[], int proc_config[], struct AZ_SCALING *scaling);
|
|
|
|
extern void AZ_unscale_after_iterate(double x[], double b[], AZ_MATRIX *Amat,
|
|
int options[], int proc_config[],
|
|
struct AZ_SCALING *scaling);
|
|
|
|
extern void AZ_clean_scaling(struct AZ_SCALING **scaling);
|
|
|
|
|
|
extern void AZ_scale_true_residual(double x[], double b[], double v[],
|
|
double w[], double *actual_residual,
|
|
double *scaled_r_norm, int options[],
|
|
int data_org[], int proc_config[],
|
|
AZ_MATRIX *Amat,
|
|
struct AZ_CONVERGE_STRUCT *);
|
|
|
|
extern struct AZ_SCALING *AZ_scaling_create(void);
|
|
|
|
extern void AZ_scaling_destroy(struct AZ_SCALING **temp);
|
|
|
|
extern double AZ_second(void);
|
|
|
|
extern MPI_AZComm *AZ_get_comm(int proc_config[]);
|
|
|
|
extern void AZ_set_comm(int proc_config[], MPI_AZComm );
|
|
|
|
extern void AZ_set_MATFREE_name(AZ_MATRIX *Amat, int name);
|
|
|
|
extern void AZ_set_matrix_print_string(AZ_MATRIX *Amat,const char str[]);
|
|
|
|
extern void AZ_set_MATFREE_matrix_norm(AZ_MATRIX *Amat, double mat_norm);
|
|
|
|
extern void AZ_set_MATFREE(AZ_MATRIX *Amat, void *data,
|
|
void (*matvec)(double *, double *, struct AZ_MATRIX_STRUCT *, int *));
|
|
|
|
extern void AZ_set_MATNORMINF(AZ_MATRIX *Amat, void *data,
|
|
double (*matnorminf)(struct AZ_MATRIX_STRUCT *));
|
|
|
|
extern void AZ_set_MATFREE_getrow(AZ_MATRIX *Amat, void *data,
|
|
int (*getrow)(int *, double *, int *, struct AZ_MATRIX_STRUCT *, int ,
|
|
int *, int),
|
|
int (*user_comm)(double *, AZ_MATRIX *), int N_ghost, int proc_config[]);
|
|
|
|
extern void AZ_set_MSR(AZ_MATRIX *Amat, int bindx[], double val[],
|
|
int data_org[], int N_update, int update[], int option);
|
|
|
|
extern void AZ_set_VBR(AZ_MATRIX *Amat, int rpntr[], int cpntr[], int bpntr[],
|
|
int indx[], int bindx[], double val[], int data_org[],
|
|
int N_update, int update[], int option);
|
|
|
|
|
|
extern void AZ_set_message_info(int N_external, int extern_index[],
|
|
int N_update, int external[],
|
|
int extern_proc[], int update[],
|
|
int update_index[], int proc_config[],
|
|
int cnptr[], int *data_org[], int);
|
|
|
|
extern void AZ_set_precond_print_string(struct AZ_PREC_STRUCT *precond,
|
|
const char str[]);
|
|
|
|
extern void AZ_set_proc_config(int proc_config[], MPI_AZComm );
|
|
|
|
extern int AZ_set_solver_parameters(double *params, int *options, AZ_MATRIX *Amat,
|
|
AZ_PRECOND *Pmat, struct AZ_SCALING *S);
|
|
|
|
extern void AZ_setup_dd_olap_msr(int N_rows, int *New_N_rows, int *bindx,
|
|
double *val, int olap_size, int *proc_config, int *data_org[], int **map3,
|
|
int bindx_length,int name, int *prev_data_org,int estimated_requirements,
|
|
struct context *context);
|
|
|
|
extern double AZ_condest(int N, struct context *context);
|
|
|
|
extern void AZ_solve_subdomain(double x[],int N, struct context *context);
|
|
|
|
extern void AZ_sort(int list[], int N, int list2[], double list3[]);
|
|
|
|
extern void AZ_sort_dble(char a[], int indx[], int start, int end, int b[],
|
|
int *mid, int real_lists, char buffer[], int buf_len,
|
|
int afirst, int );
|
|
|
|
extern void AZ_sort_ints(char a[], int indx[], int start, int end, int b[],
|
|
int *mid, int real_lists, char buffer[], int buf_len,
|
|
int afirst, int );
|
|
|
|
extern void AZ_sort_msr(int bindx[], double val[], int N);
|
|
|
|
extern void AZ_sortqlists(char a[], int b[], int lists[], int length,
|
|
int type_length, int ind_length);
|
|
|
|
extern void AZ_space_for_factors(double input_fill, int N_nz, int N,
|
|
int *extra_factor_nonzeros, int options[],int bandwidth, int );
|
|
|
|
extern void AZ_space_for_kvecs(int request, int **kvec_sizes, double ***saveme,
|
|
double **ptap, int *options, int *data_org, char *suffix, int proc, double **);
|
|
|
|
extern void AZ_space_for_padded_matrix(int overlap, int N_nonzeros, int N,
|
|
int *extra_rows, int *extra_nonzeros, int N_external, int *largest);
|
|
|
|
extern void AZ_splitup_big_msg(int num_neighbors, char *buffer, char *buf2,
|
|
unsigned int element_size,
|
|
int *start_send_proc,
|
|
int *actual_send_length,int *num_nonzeros_recv,
|
|
int *proc_num_neighbor, int type,
|
|
int *total_num_recv, int *proc_config);
|
|
|
|
extern double AZ_srandom1(int *seed);
|
|
|
|
extern void AZ_sum_bdry(double x[], int data_org[], int proc_config[]);
|
|
|
|
|
|
extern void AZ_sym_block_diagonal_scaling(double val[], int indx[],
|
|
int bindx[], int rpntr[],
|
|
int cpntr[], int bpntr[],
|
|
double b[], int options[],
|
|
int data_org[],
|
|
int proc_config[]
|
|
/* struct AZ_SCALING * */);
|
|
|
|
extern void AZ_sym_diagonal_scaling(int action, AZ_MATRIX *Amat,
|
|
double b[], double x[], int options[],
|
|
int proc_config[], struct AZ_SCALING *scaling);
|
|
|
|
|
|
extern void AZ_sym_gauss_seidel(void);
|
|
|
|
extern void AZ_sym_gauss_seidel_sl(double val[], int bindx[], double x[],
|
|
int data_org[], int options[], struct context *,
|
|
int proc_config[]);
|
|
|
|
extern void AZ_sym_reinvscale_sl(double x[], int data_org[], int options[],
|
|
int proc_config[], struct AZ_SCALING *scaling);
|
|
|
|
extern void AZ_sym_rescale_sl(double x[], int data_org[], int options[],
|
|
int proc_config[],struct AZ_SCALING * );
|
|
|
|
extern void AZ_sym_row_sum_scaling(int action, AZ_MATRIX *Amat,
|
|
double b[],
|
|
double x[], int options[],
|
|
int proc_config[], struct AZ_SCALING *scaling);
|
|
|
|
extern void AZ_sync(int proc_config[]);
|
|
|
|
extern void AZ_terminate_status_print(int situation, int iter,
|
|
double status[], double rec_residual,
|
|
double params[], double scaled_r_norm,
|
|
double actual_residual, int options[],
|
|
int proc_config[]);
|
|
|
|
extern void AZ_transform(int proc_config[], int *external[], int bindx[],
|
|
double val[], int update[], int *update_index[],
|
|
int *extern_index[], int *data_org[], int N_update,
|
|
int indx[], int bnptr[], int rnptr[], int *cnptr[],
|
|
int mat_type);
|
|
|
|
extern void AZ_update_block(int i, int k, int j, double val[], int indx[],
|
|
int bindx[], int cpntr[]);
|
|
|
|
extern void AZ_upper_icc( int bindx[],double val[],int N, double rhs[]);
|
|
|
|
extern void AZ_upper_triang_vbr_solve(int Nrows, int cpntr[], int bpntr[],
|
|
int indx[], int bindx[], double val[], double b[], int piv[], int dblock[]);
|
|
|
|
extern void AZ_upper_tsolve( double x[],int ,double u[],int iui[],
|
|
int ju[]);
|
|
|
|
extern void AZ_vb2msr(int m, double val[], int indx[], int bindx[],
|
|
int rpntr[], int cpntr[], int bpntr[], double msr_val[],
|
|
int msr_bindx[]);
|
|
|
|
void AZ_zero_out_context(struct context *);
|
|
|
|
void AZ_version(char string[]);
|
|
|
|
extern void AZ_MSR_matvec_mult(double x[], double b[], AZ_MATRIX *Amat,
|
|
int proc_config[]);
|
|
|
|
extern void AZ_VBR_matvec_mult(double x[], double b[], AZ_MATRIX *Amat,
|
|
int proc_config[]);
|
|
|
|
extern void PAZ_compose_external(int, int*, int *, int *, int **);
|
|
|
|
extern void PAZ_find_local_indices(int,int*,int*,int*,int,int*);
|
|
|
|
extern void PAZ_order_ele(int*,int,int*, int, int*, int*, int);
|
|
|
|
extern void PAZ_set_message_info(int, int, int*, int*, int*, int*,
|
|
int **, int ,int,int ,struct context*);
|
|
|
|
extern int PAZ_sorted_search(int, int, int*);
|
|
|
|
extern void AZ_pgmres_condnum(double b[], double x[], double weight[], int options[],
|
|
double params[], int proc_config[],double status[],
|
|
AZ_MATRIX *Amat, AZ_PRECOND *precond,
|
|
struct AZ_CONVERGE_STRUCT *convergence_info );
|
|
|
|
extern void AZ_pcg_f_condnum(double b[], double x[], double weight[], int options[],
|
|
double params[], int proc_config[],double status[],
|
|
AZ_MATRIX *Amat, AZ_PRECOND *precond,
|
|
struct AZ_CONVERGE_STRUCT *convergence_info );
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* IFPACK interface routine */
|
|
/*****************************************************************************/
|
|
#ifdef IFPACK
|
|
extern void az2ifp_blockmatrix (void **bmat, AZ_MATRIX *Amat);
|
|
extern void ifp_freebiluk( void *precon);
|
|
#endif
|
|
|
|
/*****************************************************************************/
|
|
/* Machine Dependent communication routines */
|
|
/*****************************************************************************/
|
|
extern unsigned int md_wrap_iread(void *, unsigned int, int *, int *, MPI_AZRequest *);
|
|
|
|
extern unsigned int md_wrap_iwrite(void *,unsigned int, int , int ,int *, MPI_AZRequest *);
|
|
|
|
extern unsigned int md_wrap_wait(void *, unsigned int, int *, int *,int *,MPI_AZRequest *);
|
|
|
|
extern unsigned int md_wrap_write(void *, unsigned int , int , int , int *);
|
|
|
|
extern unsigned int md_wrap_request_free(MPI_AZRequest *);
|
|
|
|
#define mdwrap_request_free(a) md_wrap_request_free(a)
|
|
#ifdef AZTEC_MPI
|
|
#define mdwrap_wait(a,b,c,x,y,z) md_mpi_wait(a,b,c,(x),(y),(z),proc_config)
|
|
#define mdwrap_iwrite(a,b,c,x,y,z) md_mpi_iwrite(a,b,c,(x),(y),(z),proc_config)
|
|
#define mdwrap_iread(a,b,c,x,y) md_mpi_iread((a),(b),(c),(x),(y),proc_config)
|
|
#define mdwrap_write(a,b,c,x,y) md_mpi_write((a),(b),(c),(x),(y),proc_config)
|
|
|
|
extern unsigned int md_mpi_iread(void *, unsigned int, int *, int *,
|
|
MPI_AZRequest *, int *);
|
|
|
|
extern unsigned int md_mpi_iwrite(void *,unsigned int, int , int ,int *,
|
|
MPI_AZRequest *, int *);
|
|
|
|
extern unsigned int md_mpi_wait(void *, unsigned int, int *, int *,int *,
|
|
MPI_AZRequest *, int *);
|
|
|
|
extern unsigned int md_mpi_write(void *, unsigned int ,int , int , int *,int *);
|
|
#else
|
|
#define mdwrap_wait(a,b,c,x,y,z) md_wrap_wait(a,b,c,(x),(y),(z))
|
|
#define mdwrap_iwrite(a,b,c,x,y,z) md_wrap_iwrite(a,b,c,(x),(y),(z))
|
|
#define mdwrap_iread(a,b,c,x,y) md_wrap_iread((a),(b),(c),(x),(y))
|
|
#define mdwrap_write(a,b,c,x,y) md_wrap_write((a),(b),(c),(x),(y))
|
|
#endif
|
|
/*****************************************************************************/
|
|
/* Auxilliary fortran rroutines needed by Aztec */
|
|
/*****************************************************************************/
|
|
|
|
extern void AZ_FNROOT_F77(int *,int *,int *,int *, int *, int *, int *);
|
|
|
|
extern void MC64AD_F77(int *, int *, int *, int *, int *, double*,
|
|
int *, int *, int *, int *, int *, double*,
|
|
int *, int *);
|
|
|
|
extern void AZ_RCM_F77(int *, int *,int *, int *,int *, int *, int *);
|
|
|
|
/*****************************************************************************/
|
|
/* Auxilliary routines available to users */
|
|
/*****************************************************************************/
|
|
|
|
extern void AZ_check_update(int update[], int N_update, int proc_config[]);
|
|
|
|
extern void AZ_clear_solver_parameters(int handle);
|
|
|
|
extern void AZ_mysleep(int i);
|
|
|
|
extern void AZ_output_matrix(double val[], int indx[], int bindx[],
|
|
int rpntr[], int cpntr[], int bpntr[],
|
|
int proc_config[], int data_org[]);
|
|
|
|
extern void AZ_print_vbr_matrix(
|
|
int matrix_flag, /* = 0 no matrix output, = 1 output matrix */
|
|
int Proc, /* Processor number */
|
|
int itotal_nodes,/* Number of internal + border nodes */
|
|
int ext_nodes, /* Number of external nodes */
|
|
double val[], /* matrix A in sparse format (VBR) */
|
|
int indx[], /* The ith element of indx points to the location in */
|
|
/* val of the (0,0) entry of the ith block entry. The*/
|
|
/* last element is the number of nonzero entries of */
|
|
/* matrix A plus one. */
|
|
int bindx[], /* Contains the block column indices of the non-zero */
|
|
/* block entries. */
|
|
int rpntr[], /* The ith element of rpntr indicates the first point*/
|
|
/* row in the ith block row. The last element is the */
|
|
/* number of block rows plus one. */
|
|
int bpntr[] /* The ith element of bpntr points to the first block*/
|
|
/* entry of the ith row in bindx. The last element is*/
|
|
/* the number of nonzero blocks of matrix A plus one.*/
|
|
);
|
|
|
|
extern double AZ_sync_timer(int proc_config[]);
|
|
|
|
/* most Aztec code calls the following functions for stdout/stderr output
|
|
rather than the regular printf and fprintf(stderr,...) functions. This
|
|
allows for the possibility that a C++ user (such as the AztecOO class)
|
|
can specify arbitrary C++ std::ostreams to receive Aztec's output instead
|
|
of having it go to stdout/stderr. The C++ functions for setting the
|
|
ostreams are in AZOO_printf.[h,cpp].
|
|
*/
|
|
extern int AZ_printf_out(const char* format, ...);
|
|
extern int AZ_printf_err(const char* format, ...);
|
|
|
|
extern void AZ_flush_out();
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* Routines just used locally at Sandia */
|
|
/*****************************************************************************/
|
|
|
|
#ifdef Sandia
|
|
extern void AZ_dvbr_diag_sparax(int m, double *val, int *rpntr, int *bpntr,
|
|
double *b, double *c);
|
|
|
|
extern void AZ_transpose(int N, double l[], int ijl[], double lt[],
|
|
int ijlt[], int row_counter[]);
|
|
|
|
extern void AZ_psymmlq(double *, double *, double *, int *, double *, int * ,
|
|
double *, AZ_MATRIX *, AZ_PRECOND *);
|
|
|
|
|
|
|
|
extern void AZ_gather_mesg_info(double x[],int data_org[],char **, char **,
|
|
int *, int *);
|
|
|
|
extern void AZ_read_local_info(int data_org[], char *message_recv_add[],
|
|
int message_recv_length[]);
|
|
extern void AZ_write_local_info(int data_org[], char *message_recv_add[],
|
|
char *message_send_add[],
|
|
int message_recv_length[],
|
|
int message_send_length[]);
|
|
|
|
#endif
|
|
|
|
/*****************************************************************************/
|
|
/* Timing Routine */
|
|
/*****************************************************************************/
|
|
|
|
#ifdef TIME_VB
|
|
extern void AZ_time_kernals(int , int , double , double *, int *, int *,
|
|
int *, int *, int *, double *, double *, int,
|
|
double *,AZ_MATRIX *);
|
|
#endif
|
|
|
|
#ifdef next_version
|
|
extern void AZ_sym_rescale_vbr(double x[], int data_org[], int options[]);
|
|
#endif
|
|
|
|
/* When calling this fortran routine from C we need to include an extra */
|
|
/* parameter on the end indicating the string length of the first parameter */
|
|
|
|
/* #ifdef AZ_PA_RISC */
|
|
/* extern void dgemvnsqr_(int *, double *, double *, double *); */
|
|
/* extern void vec_$dcopy(double *, double *, int *); */
|
|
/* extern void blas_$dgemm(char *, char *, int *, int *, int *, double *, */
|
|
/* double *, int *, double *, int *, double *, double *, */
|
|
/* int *, int, int); */
|
|
/*#endif */
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|