/*+ BSprivate.h - Include file for the sparse solver package. This file is for use only inside the BlockSolve package. +*/ #ifndef __BSprivateh #define __BSprivateh /* include the "system" dependent routines */ #include "BSdepend.h" /* include the "public" include file as well */ #include "BSsparse.h" /* include the special message passing stuff that I wrote */ #include "BMmsg.h" /* include some logging stuff that I wrote */ #include "BSlog.h" /* ****************************************************************** */ /* Definitions of misc. constants */ /* ****************************************************************** */ #define MAT_NAME_MSG 10000 #define RHS_NAME_MSG 10001 #define OFFSETD_MSG 10002 #define OFFSETU_MSG 10003 #define BB_SQ_MSG 10004 #define BB_SA_MSG 10005 #define COLOR_MSG 10006 #define SETUP_FORWARD_MSG 10007 #define SETUP_ORIGINAL_MSG 10008 #define SETUP_FACTOR_MSG 10009 #define DEGREE_MSG 10010 /* these next three messages need a lot of room */ /* this next message number is actually a range of messages */ /* needed by the BMcomp_msg routines. The total number */ /* of messages used is MAX_NUM_MSGS*nprocs */ /* MAX_NUM_MSGS should be greater than the number of messages */ /* that a processor sends in one compiled message execution */ /* For example, one compiled message execution is typically */ /* an entire parallel forward matrix solution. So the number */ /* of messages is less than or equal to the number of processors */ /* that a single processor is connected to in the graph of the */ /* matrix times the number of colors used to color the graph */ /* we think the current setting of 10,000 is ample, but feel free */ /* to change it (recompile EVERYTHING if you do) */ #define COMP_MSG_BASE 10020 #define MAX_NUM_MSGS 10000 /* used in coloring */ #define NO_COLOR -2 /* used in cg and symmlq */ #define CG_MATVECR 1 #define CG_MATVECZ 2 #define CG_MSOLVE 3 #define CG_ERROR -1 #define SYMM_MATVECXR 1 #define SYMM_MATVECVZ 2 #define SYMM_MSOLVE1 3 #define SYMM_MSOLVE2 4 #define SYMM_MSOLVEB 5 #define SYMM_DONE 6 #define SYMM_ERROR -1 #define TRUE 1 #define FALSE 0 /* ****************************************************************** */ /* End of section */ /* ****************************************************************** */ /* ****************************************************************** */ /* Definitions of data structures */ /* ****************************************************************** */ /* used to store new global address for each row */ typedef struct __BSkey_arr { int length; int **array; } BSkey_arr; /* Bulletin Board */ typedef struct __BSbb { int length; /* the number of elements */ BSmapping *map; /* the mapping to use */ int *info; /* the information to store in the BB */ } BSbb; /* Bulletin Board for floating point */ typedef struct __BSbb_d { int length; /* the number of elements */ BSmapping *map; /* the mapping to use */ FLOAT *info; /* the information to store in the BB */ } BSbb_d; /* ****************************************************************** */ /* End of section */ /* ****************************************************************** */ /* ****************************************************************** */ /* Definitions of misc macros */ /* ****************************************************************** */ #define MY_SETERR(a) {SETERR(a); return;} #define MY_SETERRN(a) {SETERR(a); return(0);} #define MY_SETERRC(a,s) {SETERRC(a,s); return;} #define MY_SETERRCN(a,s) {SETERRC(a,s); return(0);} #define MY_MALLOC(a,b,c,d) { \ if (c == 0) { \ a = NULL; \ } else { \ if ((a = b MALLOC(c)) == NULL) {MY_SETERRC(MEM_ERROR,"Out of Memory\n");} \ } \ } #define MY_MALLOCN(a,b,c,d) { \ if (c == 0) { \ a = NULL; \ } else { \ if ((a = b MALLOC(c)) == NULL) {MY_SETERRCN(MEM_ERROR,"Out of Memory\n");} \ } \ } #define MY_FREE(a) \ { \ if (a != NULL) FREE(a); \ } #define MY_FREEN(a) \ { \ if (a != NULL) FREE(a); \ } /* ****************************************************************** */ /* End of section */ /* ****************************************************************** */ /* ****************************************************************** */ /* Declarations of my functions */ /* ****************************************************************** */ /* BMmsg functions */ extern BMcomp_msg *BMcomp_init(int); extern void BMfree_comp_msg(BMcomp_msg *); extern BMphase *BMget_phase(BMcomp_msg *,int); extern void BMadd_msg(BMcomp_msg *,BMmsg *,BSprocinfo *); extern BMmsg *BMcreate_msg(int,int,MPI_Datatype,int); extern int BMget_msg_size(BMmsg *); extern void BMset_msg_size(BMmsg *,int); extern void BMinit_user(BMuser_data *); extern void BMfree_user(BMuser_data *); extern void BMfree_user_data(BMmsg *); extern void BMfree_setup_data(BMmsg *); extern void BMset_user(BMuser_data *,int *,int,void (*)(int *)); extern void BMset_user_data(BMmsg *,int *,int,void (*)(int *)); extern void BMset_setup_data(BMmsg *,int *,int,void (*)(int *)); extern int *BMget_user(BMmsg *,int *); extern int *BMget_setup(BMmsg *,int *); extern void BMset_msg_ptr(BMmsg *,void *); extern void *BMget_msg_ptr(BMmsg *); extern BMmsg *BMnext_msg(BMphase *,BMmsg *); extern void BMalloc_msg(BMcomp_msg *); extern int BMfix_send(int,int,MPI_Datatype,BMcomp_msg *,BMphase *,void(*)(int *), BSprocinfo *); extern void BMinit_comp_msg(BMcomp_msg *,BSprocinfo *); extern void BMfinish_comp_msg(BMcomp_msg *,BSprocinfo *); extern void BMsendf_msg(BMmsg *,BSprocinfo *); extern void BMcheck_on_async_block(BMphase *); extern void BMfinish_on_async_block(BMphase *); extern void BMsend_block_msg(BMphase *,BMmsg *,BSprocinfo *); extern BMmsg *BMrecv_block_msg(BMphase *,BSprocinfo *); extern BMmsg *BMrecv_msg(BMphase *); extern void BMfree_block_msg(BMphase *); extern void BMfree_msg(BMmsg *); /* other BS private functions */ extern BSnumbering *BSfnd_inode(BSspmat *,int,BSprocinfo *); extern BSnumbering *BSalloc_numbering(int); extern void BSfree_numbering(BSnumbering *); extern BSpermutation *BSnum2perm(BSnumbering *,BSdistribution *); extern BSpermutation *BSalloc_permutation(int); extern void BSreset_permutation(int,BSpermutation *); extern void BSfree_permutation(BSpermutation *); extern BSdistribution *BSalloc_distribution(int); extern void BSfree_distribution(BSdistribution *); extern BSdistribution *BSnum2distr(BSnumbering *); extern BSnumbering *BSfnd_clique(BSspmat *,int,int *,BSprocinfo *); extern BSkey_arr *BSalloc_key_arr(int); extern void BSfree_key_arr(BSkey_arr *key_arr); extern void BSperm_ivec(int *,int *,BSpermutation *); extern void BSiperm_ivec(int *,int *,BSpermutation *); extern void BSperm_dvec(FLOAT *,FLOAT *,BSpermutation *); extern void BSiperm_dvec(FLOAT *,FLOAT *,BSpermutation *); extern void BSperm2iperm(BSpermutation *,BSpermutation *); extern BSspmat *BSdo_contract(BSspmat *,BSnumbering *,BSpermutation *, BSprocinfo *,int); extern BSbb *BSinit_bb(int,BSmapping *); extern void BSfree_bb(BSbb *); extern void BSpost_bb(BSbb *,int,int *,int *); extern void BSpost_noaddr_bb(BSbb *,int,int *); extern void BSquery_match_bb(BSbb *,int,int *,int *,BSprocinfo *); extern void BSquery_nomatch_bb(BSbb *,int,int *,int *,BSprocinfo *); extern BSbb_d *BSinit_bb_d(int,BSmapping *); extern void BSfree_bb_d(BSbb_d *); extern void BSpost_bb_d(BSbb_d *,int,int *,FLOAT *); extern void BSpost_noaddr_bb_d(BSbb_d *,int,FLOAT *); extern void BSquery_match_bb_d(BSbb_d *,int,int *,FLOAT *,BSprocinfo *); extern void BSquery_nomatch_bb_d(BSbb_d *,int,int *,FLOAT *,BSprocinfo *); extern void BSx_color(int *,BSspmat *,BSprocinfo *,int *,int); extern void BSido_color(int *,int,BSspmat *,int *,int **,int *,int *,int *, int *,int *,int *,BSprocinfo *); extern void BSsdo_color(int *,int,BSspmat *,int *,int **,int *,int *, int *,int *,int *,int *,BSprocinfo *); extern void BSpack_n_send(BSmsg_list *,int,int *,BSspmat *,BSprocinfo *, int *,int *,int *,int *,int,int); extern int BSmy_rand(int); extern BSnumbering *BSoff_gnum(BSnumbering *,BSnumbering *,BSdistribution *); extern BSdistribution *BSfold_distr(BSdistribution *,BSdistribution *,BSnumbering *); extern BScl_2_inode *BStrans_perm_cl(BSspmat *,BSnumbering *,BSprocinfo *); extern BSinode_list *BStrans_perm_in(BSspmat *,BSnumbering *,BSnumbering *, BSdistribution *,BSprocinfo *); extern void BSclique_2_inode(BSspmat *,BScl_2_inode *,BSinode_list *, BSprocinfo *); extern void BSrem_diag(BSspmat *); extern void BSins_diag(BSspmat *); extern BSkey_arr *BSperm_rows(BSspmat *,BSnumbering *,BSpermutation *, BSdistribution *,BSprocinfo *,int,int *); extern int BSrows_2_inode(BSspmat *,BSnumbering *,BSpermutation *, BSpermutation *, BSsprow **,BSinode_list *,BScl_2_inode *, BSkey_arr *,BSnumbering *,BSdistribution *,BSprocinfo *); extern void BSnz_2_inode(BSspmat *,BSsprow **,BSinode_list *, BScl_2_inode *,BSprocinfo *); extern void BSsort_rows(BSspmat *,BSpermutation *,BSdistribution *,int); extern BSpermutation *BSglobal_perm(BSnumbering *); extern BSsprow **BSrow_perm(BSspmat *,BSpermutation *); extern void BSfree_cl_2_inode(BScl_2_inode *,int); extern void BSfree_inode_list(BSinode_list *); extern BSnumbering *BSlow2high(BSspmat *,BSnumbering *,BSdistribution *, BSprocinfo *); extern BSnumbering *BSbase(BSdistribution *,BSprocinfo *); extern BSnumbering *BScolor_2_clique(BSnumbering *,BScl_2_inode *); extern void BSfree_reperm(BSreperm *); extern void BSorig_inode(BSpar_mat *,BSprocinfo *); FLOAT BSpar_ip(int,FLOAT *,FLOAT *,BSprocinfo *); extern void BSpar_bip(int,FLOAT *,FLOAT *,int,FLOAT *,BSprocinfo *); extern int BSpar_symmlq(int,FLOAT *,FLOAT *,FLOAT *,FLOAT *,FLOAT *,FLOAT *, FLOAT *,FLOAT *,FLOAT *,FLOAT *,FLOAT *,FLOAT *,FLOAT *,FLOAT *, FLOAT *,FLOAT *,FLOAT *,FLOAT *,FLOAT *,FLOAT *,int *,int,int *, int *,BSprocinfo *); extern int BSpar_bcg(int,FLOAT *,FLOAT *,FLOAT *,FLOAT *,FLOAT *,FLOAT *, FLOAT *,int *,int *,int,BSprocinfo *); extern void BSrow_err_check(BSspmat *,BSprocinfo *); extern int BScount_nz(BSpar_mat *,BSprocinfo *); extern int BSnonlocalnz(BSspmat *,int *,BSprocinfo *); extern void BScopy_cliques(BSpar_mat *,BSpar_mat *); extern void BSheap_sort0(int,int *); extern void BSheap_sort1(int,int *,int *); extern void BSheap_sort2(int,int *,int *,int *); extern void BSheap_sorthl1(int,int *,int *); extern void BSheap_sort1d(int,int *,FLOAT *); extern void BSiheap_sort1(int,int *,int *); extern void BSiheap_sort2(int,int *,int *,int *); extern int BSfactor1(BSpar_mat *,BScomm *,BSprocinfo *); extern int BSfactorn(BSpar_mat *,BScomm *,BSprocinfo *); extern int BSilu_factor1(BSpar_mat *,BScomm *,BSprocinfo *); extern int BSilu_factorn(BSpar_mat *,BScomm *,BSprocinfo *); /* ****************************************************************** */ /* End of section */ /* ****************************************************************** */ #endif