1*afc8d9b6SBarry Smith /* $Id: vec.h,v 1.37 1995/11/01 19:12:32 bsmith Exp bsmith $ */ 22eac72dbSBarry Smith /* 32eac72dbSBarry Smith This defines the abstract vector component. These are patterned 42eac72dbSBarry Smith after the Level-1 Blas, but with some additions that have proved 52eac72dbSBarry Smith useful. These include routines to allocate and free vectors. 62eac72dbSBarry Smith 72eac72dbSBarry Smith Note that the routines that are normally thought of as returning a 82eac72dbSBarry Smith value (e.g., dot, norm) return their value through an argument. 92eac72dbSBarry Smith This allows these routines to be used with other datatype, such 102eac72dbSBarry Smith as float and dcomplex. 112eac72dbSBarry Smith 122eac72dbSBarry Smith All vectors should be declared as a Vec. All vector routines begin 132eac72dbSBarry Smith with Vec. 142eac72dbSBarry Smith 152eac72dbSBarry Smith 162eac72dbSBarry Smith */ 172eac72dbSBarry Smith 182eac72dbSBarry Smith #ifndef __VEC_PACKAGE 192eac72dbSBarry Smith #define __VEC_PACKAGE 202eac72dbSBarry Smith #include "is.h" 212eac72dbSBarry Smith 229e25ed09SBarry Smith #define VEC_COOKIE PETSC_COOKIE+3 239e25ed09SBarry Smith #define VEC_SCATTER_COOKIE PETSC_COOKIE+4 249e25ed09SBarry Smith 25b56ba379SLois Curfman McInnes typedef enum { VECSAME=-1, VECSEQ, VECMPI } VecType; 26f0479e8cSBarry Smith 272eac72dbSBarry Smith typedef struct _Vec* Vec; 2808480c60SBarry Smith typedef struct _VecScatter* VecScatter; 292eac72dbSBarry Smith 30de7da479SBarry Smith extern int VecCreateSeq(MPI_Comm,int,Vec *); 318ed539a5SBarry Smith extern int VecCreateMPI(MPI_Comm,int,int,Vec *); 326469c4f9SBarry Smith extern int VecCreate(MPI_Comm,int,Vec *); 332eac72dbSBarry Smith 348ed539a5SBarry Smith extern int VecDot(Vec, Vec, Scalar*); 358ed539a5SBarry Smith extern int VecTDot(Vec, Vec, Scalar*); 368ed539a5SBarry Smith extern int VecMDot(int, Vec ,Vec*,Scalar*); 378ed539a5SBarry Smith extern int VecMTDot(int, Vec ,Vec*,Scalar*); 38cddf8d76SBarry Smith 39cddf8d76SBarry Smith typedef enum {NORM_1=1,NORM_2=2,NORM_FROBENIUS=3,NORM_INFINITY=4} NormType; 40cddf8d76SBarry Smith #define NORM_MAX NORM_INFINITY 41cddf8d76SBarry Smith extern int VecNorm(Vec,NormType,double *); 42ee50ffe9SBarry Smith extern int VecSum(Vec,Scalar*); 437c16e1c9SBarry Smith extern int VecMax(Vec, int *, double*); 447c16e1c9SBarry Smith extern int VecMin(Vec, int *, double*); 458ed539a5SBarry Smith extern int VecScale(Scalar*, Vec); 468ed539a5SBarry Smith extern int VecCopy(Vec, Vec); 478ed539a5SBarry Smith extern int VecSet(Scalar*, Vec); 488ed539a5SBarry Smith extern int VecSwap(Vec, Vec); 498ed539a5SBarry Smith extern int VecAXPY(Scalar*, Vec, Vec); 508ed539a5SBarry Smith extern int VecMAXPY(int, Scalar*, Vec ,Vec*); 518ed539a5SBarry Smith extern int VecAYPX(Scalar*, Vec, Vec); 528ed539a5SBarry Smith extern int VecWAXPY(Scalar*, Vec, Vec, Vec); 538ed539a5SBarry Smith extern int VecPMult(Vec, Vec, Vec); 548ed539a5SBarry Smith extern int VecPDiv(Vec, Vec, Vec); 556469c4f9SBarry Smith extern int VecDuplicate(Vec,Vec *); 568ed539a5SBarry Smith extern int VecDestroy(Vec); 57*afc8d9b6SBarry Smith extern int VecDuplicateVecs(Vec, int,Vec **); 588ed539a5SBarry Smith extern int VecFreeVecs(Vec*,int); 592eac72dbSBarry Smith 6064119d58SLois Curfman McInnes typedef enum {NOT_SET_VALUES, INSERT_VALUES, ADD_VALUES} InsertMode; 6120563c6bSBarry Smith 6220563c6bSBarry Smith extern int VecSetValues(Vec, int, int *,Scalar*,InsertMode); 63ee50ffe9SBarry Smith extern int VecAssemblyBegin(Vec); 64ee50ffe9SBarry Smith extern int VecAssemblyEnd(Vec); 658ed539a5SBarry Smith 6664119d58SLois Curfman McInnes typedef enum {SCATTER_REVERSE=1,SCATTER_DOWN=2,SCATTER_UP=4,SCATTER_ALL=8, 6764119d58SLois Curfman McInnes SCATTER_ALL_REVERSE=9} ScatterMode; 68ee50ffe9SBarry Smith 6908480c60SBarry Smith extern int VecScatterBegin(Vec,Vec,InsertMode,ScatterMode,VecScatter); 7008480c60SBarry Smith extern int VecScatterEnd(Vec,Vec,InsertMode,ScatterMode,VecScatter); 7108480c60SBarry Smith extern int VecScatterCreate(Vec,IS,Vec,IS,VecScatter *); 7208480c60SBarry Smith extern int VecScatterDestroy(VecScatter); 7308480c60SBarry Smith extern int VecScatterCopy(VecScatter,VecScatter *); 7408480c60SBarry Smith extern int VecScatterView(VecScatter,Viewer); 75d6dfbf8fSBarry Smith 7664119d58SLois Curfman McInnes typedef enum {PIPELINE_DOWN=0,PIPELINE_UP=1} PipelineMode; 77ee50ffe9SBarry Smith 7808480c60SBarry Smith extern int VecPipelineBegin(Vec,Vec,InsertMode,PipelineMode,VecScatter); 7908480c60SBarry Smith extern int VecPipelineEnd(Vec,Vec,InsertMode,PipelineMode,VecScatter); 808ed539a5SBarry Smith 81c01c455dSBarry Smith extern int VecShift(Scalar *,Vec); 828ed539a5SBarry Smith extern int VecGetArray(Vec,Scalar**); 836b5873e3SBarry Smith extern int VecRestoreArray(Vec,Scalar**); 84*afc8d9b6SBarry Smith extern int VecPlaceArray(Vec,Scalar*); 85707f76d8SBarry Smith extern int VecGetArrays(Vec*,int,Scalar***); 86707f76d8SBarry Smith extern int VecRestoreArrays(Vec*,int,Scalar***); 878ed539a5SBarry Smith extern int VecValidVector(Vec); 888ed539a5SBarry Smith extern int VecView(Vec,Viewer); 895f52d6abSBarry Smith extern int VecLoad(Viewer,Vec*); 908ed539a5SBarry Smith 918ed539a5SBarry Smith extern int VecGetSize(Vec,int *); 928ed539a5SBarry Smith extern int VecGetLocalSize(Vec,int *); 93d6dfbf8fSBarry Smith extern int VecGetOwnershipRange(Vec,int*,int*); 948ed539a5SBarry Smith 95*afc8d9b6SBarry Smith 968ed539a5SBarry Smith /* utility routines */ 978ed539a5SBarry Smith extern int VecReciprocal(Vec); 98bfe6c5c8SBarry Smith extern int VecAbs(Vec); 992eac72dbSBarry Smith 10034233285SBarry Smith #if defined(__DRAW_PACKAGE) 10134233285SBarry Smith extern int DrawTensorContour(DrawCtx,int,int,double *,double *,Vec); 10234233285SBarry Smith #endif 10334233285SBarry Smith 1042eac72dbSBarry Smith #endif 1052eac72dbSBarry Smith 1062eac72dbSBarry Smith 107