⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 superlu_zdefs.h

📁 SuperLU 2.2版本。对大型、稀疏、非对称的线性系统的直接求解
💻 H
字号:
/* * -- Distributed SuperLU routine (version 2.1) -- * Lawrence Berkeley National Lab, Univ. of California Berkeley. * November 1, 2007 * */#ifndef __SUPERLU_zDEFS /* allow multiple inclusions */#define __SUPERLU_zDEFS/* * File name:	superlu_zdefs.h * Purpose:     Distributed SuperLU data types and function prototypes * History: */#include "superlu_defs.h"#include "dcomplex.h"/*  * On each processor, the blocks in L are stored in compressed block * column format, the blocks in U are stored in compressed block row format. */typedef struct {    int_t   **Lrowind_bc_ptr; /* size ceil(NSUPERS/Pc)                 */    doublecomplex  **Lnzval_bc_ptr;  /* size ceil(NSUPERS/Pc)                 */    int_t   **Ufstnz_br_ptr;  /* size ceil(NSUPERS/Pr)                 */    doublecomplex  **Unzval_br_ptr;  /* size ceil(NSUPERS/Pr)                 */#if 0    int_t   *Lsub_buf;        /* Buffer for the remote subscripts of L */    double  *Lval_buf;        /* Buffer for the remote nonzeros of L   */#endif    int_t   *Lsub_buf_2[2];   /* Buffers for the remote subscripts of L*/    doublecomplex  *Lval_buf_2[2];   /* Buffers for the remote nonzeros of L  */    int_t   *Usub_buf;        /* Buffer for the remote subscripts of U */    doublecomplex  *Uval_buf;        /* Buffer for the remote nonzeros of U   */    doublecomplex  *ujrow;           /* used in panel factorization.          */    int_t   bufmax[NBUFFERS]; /* Buffer size; 5 entries			       *     0 : size of Lsub_buf[]			       *     1 : size of Lval_buf[]			       *     2 : size of Usub_buf[] 			       *     3 : size of Uval_buf[]			       *     4 : size of tempv[LDA]			       */    /*-- Record communication schedule for factorization. --*/    int_t   *ToRecv;          /* Recv from no one (0), left (1), and up (2).*/    int_t   *ToSendD;         /* Whether need to send down block row.       */    int_t   **ToSendR;        /* List of processes to send right block col. */    /*-- Record communication schedule for solves. --*/    int_t   *fmod;            /* Modification count for L-solve            */    int_t   **fsendx_plist;   /* Column process list to send down Xk       */    int_t   *frecv;           /* Modifications to be recv'd in proc row    */    int_t   nfrecvx;          /* Number of Xk I will receive in L-solve    */    int_t   nfsendx;          /* Number of Xk I will send in L-solve       */    int_t   *bmod;            /* Modification count for U-solve            */    int_t   **bsendx_plist;   /* Column process list to send down Xk       */    int_t   *brecv;           /* Modifications to be recv'd in proc row    */    int_t   nbrecvx;          /* Number of Xk I will receive in U-solve    */    int_t   nbsendx;          /* Number of Xk I will send in U-solve       */    /*-- Auxiliary arrays used for solves. --*/    int_t   *ilsum;           /* Starting position of each supernode in lsum				 (local)  */    int_t   ldalsum;          /* LDA of lsum (local) */    int_t   SolveMsgSent;     /* Number of actual messages sent in LU-solve */    int_t   SolveMsgVol;      /* Volume of messages sent in the solve phase */} LocalLU_t;typedef struct {    int_t *etree;    Glu_persist_t *Glu_persist;    LocalLU_t *Llu;} LUstruct_t;/*-- Auxiliary data type used in PxGSTRS/PxGSTRS1. */typedef struct {    int_t lbnum;  /* Row block number (local).      */    int_t indpos; /* Starting position in Uindex[]. */} Ucb_indptr_t;/*-- Data structure for communication during matrix-vector multiplication. */typedef struct {    int_t *extern_start;    int_t *ind_tosend;    /* X indeices to be sent to other processes */    int_t *ind_torecv;    /* X indeices to be received from other processes */    int_t *ptr_ind_tosend;/* Printers to ind_tosend[] (Size procs)			     (also point to val_torecv) */    int_t *ptr_ind_torecv;/* Printers to ind_torecv[] (Size procs)			     (also point to val_tosend) */    int   *SendCounts;    /* Numbers of X indices to be sent			     (also numbers of X values to be received) */    int   *RecvCounts;    /* Numbers of X indices to be received			     (also numbers of X values to be sent) */    doublecomplex *val_tosend;   /* X values to be sent to other processes */    doublecomplex *val_torecv;   /* X values to be received from other processes */    int_t TotalIndSend;   /* Total number of indices to be sent			     (also total number of values to be received) */    int_t TotalValSend;   /* Total number of values to be sent.			     (also total number of indices to be received) */} pzgsmv_comm_t;/*-- Data structure for redistribution of B and X --*/typedef struct {    int  *B_to_X_SendCnt;    int  *X_to_B_SendCnt;    int  *ptr_to_ibuf, *ptr_to_dbuf;} pxgstrs_comm_t;/*-- Data structure holding the information for the solution phase --*/typedef struct {    int_t *row_to_proc;    int_t *inv_perm_c;    int_t num_diag_procs, *diag_procs, *diag_len;    pzgsmv_comm_t *gsmv_comm;    pxgstrs_comm_t *gstrs_comm;    int_t *A_colind_gsmv; /* After pzgsmv_init(), the global column                             indices of A are translated into the relative                             positions in the gathered x-vector.                             This is re-used in repeated calls to pzgsmv() */} SOLVEstruct_t;/*********************************************************************** * Function prototypes ***********************************************************************/#ifdef __cplusplusextern "C" {#endif/* Supernodal LU factor related */extern voidzCreate_CompCol_Matrix_dist(SuperMatrix *, int_t, int_t, int_t, doublecomplex *,			    int_t *, int_t *, Stype_t, Dtype_t, Mtype_t);extern voidzCreate_CompRowLoc_Matrix_dist(SuperMatrix *, int_t, int_t, int_t, int_t,			       int_t, doublecomplex *, int_t *, int_t *,			       Stype_t, Dtype_t, Mtype_t);extern voidzCompRow_to_CompCol_dist(int_t, int_t, int_t, doublecomplex *, int_t *, int_t *,                         doublecomplex **, int_t **, int_t **);extern intpzCompRow_loc_to_CompCol_global(int_t, SuperMatrix *, gridinfo_t *,	 		        SuperMatrix *);extern voidzCopy_CompCol_Matrix_dist(SuperMatrix *, SuperMatrix *);extern voidzCreate_Dense_Matrix_dist(SuperMatrix *, int_t, int_t, doublecomplex *, int_t,			  Stype_t, Dtype_t, Mtype_t);extern voidzCreate_SuperNode_Matrix_dist(SuperMatrix *, int_t, int_t, int_t, doublecomplex *, 			      int_t *, int_t *, int_t *, int_t *, int_t *,			      Stype_t, Dtype_t, Mtype_t);extern voidzCopy_Dense_Matrix_dist(int_t, int_t, doublecomplex *, int_t,                        doublecomplex *, int_t);extern void    zallocateA_dist (int_t, int_t, doublecomplex **, int_t **, int_t **);extern void    zGenXtrue_dist (int_t, int_t, doublecomplex *, int_t);extern void    zFillRHS_dist (char *, int_t, doublecomplex *, int_t,                              SuperMatrix *, doublecomplex *, int_t);extern int     zcreate_matrix(SuperMatrix *, int, doublecomplex **, int *, 			      doublecomplex **, int *, FILE *, gridinfo_t *);/* Driver related */extern void    zgsequ_dist (SuperMatrix *, double *, double *, double *,			    double *, double *, int_t *);extern double  zlangs_dist (char *, SuperMatrix *);extern void    zlaqgs_dist (SuperMatrix *, double *, double *, double,			    double, double, char *);extern void    pzgsequ (SuperMatrix *, double *, double *, double *,			double *, double *, int_t *, gridinfo_t *);extern double  pzlangs (char *, SuperMatrix *, gridinfo_t *);extern void    pzlaqgs (SuperMatrix *, double *, double *, double,			double, double, char *);extern int     pzPermute_Dense_Matrix(int_t, int_t, int_t [], int_t[],				      doublecomplex [], int, doublecomplex [], int, int,				      gridinfo_t *);extern int     sp_ztrsv_dist (char *, char *, char *, SuperMatrix *,			      SuperMatrix *, doublecomplex *, int *);extern int     sp_zgemv_dist (char *, doublecomplex, SuperMatrix *, doublecomplex *,			      int, doublecomplex, doublecomplex *, int);extern int     sp_zgemm_dist (char *, char *, int, int, int, doublecomplex,			SuperMatrix *, doublecomplex *, int, doublecomplex, 			doublecomplex *, int);extern int_t zdistribute(fact_t, int_t, SuperMatrix *, Glu_freeable_t *, 			 LUstruct_t *, gridinfo_t *);extern void  pzgssvx_ABglobal(superlu_options_t *, SuperMatrix *, 			      ScalePermstruct_t *, doublecomplex *,			      int, int, gridinfo_t *, LUstruct_t *, double *,			      SuperLUStat_t *, int *);extern int_t pzdistribute(fact_t, int_t, SuperMatrix *, 			 ScalePermstruct_t *, Glu_freeable_t *, 			 LUstruct_t *, gridinfo_t *);extern void  pzgssvx(superlu_options_t *, SuperMatrix *, 		     ScalePermstruct_t *, doublecomplex *,		     int, int, gridinfo_t *, LUstruct_t *,		     SOLVEstruct_t *, double *, SuperLUStat_t *, int *);extern int  zSolveInit(superlu_options_t *, SuperMatrix *, int_t [], int_t [],		       int_t, LUstruct_t *, gridinfo_t *, SOLVEstruct_t *);extern int_t pxgstrs_init(int_t, int_t, int_t, int_t,	                  int_t [], int_t [], gridinfo_t *grid,	                  Glu_persist_t *, SOLVEstruct_t *);extern void pxgstrs_finalize(pxgstrs_comm_t *);extern void zSolveFinalize(superlu_options_t *, SOLVEstruct_t *);extern void zldperm(int_t, int_t, int_t, int_t [], int_t [],		    doublecomplex [], int_t *, double [], double []);extern int_t pzgstrf(superlu_options_t *, int, int, double,		    LUstruct_t*, gridinfo_t*, SuperLUStat_t*, int*);extern void pzgstrs_Bglobal(int_t, LUstruct_t *, gridinfo_t *,			     doublecomplex *, int_t, int, SuperLUStat_t *, int *);extern void pzgstrs(int_t, LUstruct_t *, ScalePermstruct_t *, gridinfo_t *,		    doublecomplex *, int_t, int_t, int_t, int, SOLVEstruct_t *,		    SuperLUStat_t *, int *);extern void zlsum_fmod(doublecomplex *, doublecomplex *, doublecomplex *, doublecomplex *,		       int, int, int_t , int_t *, int_t, int_t, int_t,		       int_t *, gridinfo_t *, LocalLU_t *, 		       MPI_Request [], SuperLUStat_t *);extern void zlsum_bmod(doublecomplex *, doublecomplex *, doublecomplex *,                       int, int_t, int_t *, int_t *, Ucb_indptr_t **,                       int_t **, int_t *, gridinfo_t *, LocalLU_t *,		       MPI_Request [], SuperLUStat_t *);extern void pzgsrfs(int_t, SuperMatrix *, double, LUstruct_t *,		    ScalePermstruct_t *, gridinfo_t *,		    doublecomplex [], int_t, doublecomplex [], int_t, int,		    SOLVEstruct_t *, double *, SuperLUStat_t *, int *);extern void pzgsrfs_ABXglobal(int_t, SuperMatrix *, double, LUstruct_t *,		  gridinfo_t *, doublecomplex *, int_t, doublecomplex *, int_t,		  int, double *, SuperLUStat_t *, int *);extern int   pzgsmv_AXglobal_setup(SuperMatrix *, Glu_persist_t *,				   gridinfo_t *, int_t *, int_t *[],				   doublecomplex *[], int_t *[], int_t []);extern int  pzgsmv_AXglobal(int_t, int_t [], doublecomplex [], int_t [],	                       doublecomplex [], doublecomplex []);extern int  pzgsmv_AXglobal_abs(int_t, int_t [], doublecomplex [], int_t [],				 doublecomplex [], double []);extern void pzgsmv_init(SuperMatrix *, int_t *, gridinfo_t *,			pzgsmv_comm_t *);extern void pzgsmv(int_t, SuperMatrix *, gridinfo_t *, pzgsmv_comm_t *,		   doublecomplex x[], doublecomplex ax[]);extern void pzgsmv_finalize(pzgsmv_comm_t *);/* Memory-related */extern doublecomplex  *doublecomplexMalloc_dist(int_t);extern doublecomplex  *doublecomplexCalloc_dist(int_t);extern double  *doubleMalloc_dist(int_t);extern double  *doubleCalloc_dist(int_t);extern void  *duser_malloc_dist (int_t, int_t);extern void  duser_free_dist (int_t, int_t);extern int_t zQuerySpace_dist(int_t, LUstruct_t *, gridinfo_t *, mem_usage_t *);extern void    Destroy_LU(int_t, gridinfo_t *, LUstruct_t *);extern void    LUstructInit(const int_t, const int_t, LUstruct_t *);extern void    LUstructFree(LUstruct_t *);/* Auxiliary routines */extern void    zfill_dist (doublecomplex *, int_t, doublecomplex);extern void    zinf_norm_error_dist (int_t, int_t, doublecomplex*, int_t,                                     doublecomplex*, int_t, gridinfo_t*);extern void    pzinf_norm_error(int, int_t, int_t, doublecomplex [], int_t,				doublecomplex [], int_t , gridinfo_t *);extern void  zreadhb_dist (int, FILE *, int_t *, int_t *, int_t *, 			   doublecomplex **, int_t **, int_t **);/* Distribute the data for numerical factorization */extern int_t zdist_psymbtonum(fact_t, int_t, SuperMatrix *, ScalePermstruct_t *, Pslu_freeable_t *,  LUstruct_t *, gridinfo_t *);/* Routines for debugging */extern void  zPrintLblocks(int_t, int_t, gridinfo_t *, Glu_persist_t *,		 	   LocalLU_t *);extern void  zPrintUblocks(int_t, int_t, gridinfo_t *, Glu_persist_t *,			   LocalLU_t *);extern void  zPrint_CompCol_Matrix_dist(SuperMatrix *);extern void  zPrint_Dense_Matrix_dist(SuperMatrix *);extern int   zPrint_CompRowLoc_Matrix_dist(SuperMatrix *);extern void  PrintDoublecomplex(char *, int_t, doublecomplex *);extern int   file_PrintDoublecomplex(FILE *fp, char *, int_t, doublecomplex *);/* BLAS */#ifdef USE_VENDOR_BLASextern int zgemm_(char*, char*, int*, int*, int*, doublecomplex*,                  doublecomplex*, int*, doublecomplex*, int*, doublecomplex*,                  doublecomplex*, int*, int, int);extern int ztrsv_(char*, char*, char*, int*, doublecomplex*, int*,                  doublecomplex*, int*, int, int, int);#elseextern int zgemm_(char*, char*, int*, int*, int*, doublecomplex*,                  doublecomplex*, int*, doublecomplex*, int*, doublecomplex*,                  doublecomplex*, int*);extern int ztrsv_(char*, char*, char*, int*, doublecomplex*, int*,                  doublecomplex*, int*);#endifextern int zger_(int*, int*, doublecomplex*, doublecomplex*, int*,                 doublecomplex*, int*, doublecomplex*, int*);#ifdef __cplusplus  }#endif#endif /* __SUPERLU_dDEFS */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -