173f4d377SMatthew Knepley /* $Id: petscvec.h,v 1.127 2001/09/11 16:31:30 bsmith Exp $ */ 22eac72dbSBarry Smith /* 337f753daSBarry Smith Defines the vector component of PETSc. Vectors generally represent 437f753daSBarry Smith degrees of freedom for finite element/finite difference functions 584cb2905SBarry Smith on a grid. They have more mathematical structure then simple arrays. 62eac72dbSBarry Smith */ 72eac72dbSBarry Smith 80a835dfdSSatish Balay #ifndef __PETSCVEC_H 90a835dfdSSatish Balay #define __PETSCVEC_H 100a835dfdSSatish Balay #include "petscis.h" 110a835dfdSSatish Balay #include "petscsys.h" 12*e9fa29b7SSatish Balay PETSC_EXTERN_CXX_BEGIN 132eac72dbSBarry Smith 1409321671SBarry Smith /*S 158a124369SBarry Smith PetscMap - Abstract PETSc object that defines the layout of vector and 16013c094aSBarry Smith matrices across processors 1709321671SBarry Smith 1809321671SBarry Smith Level: advanced 1909321671SBarry Smith 2009321671SBarry Smith Notes: 2109321671SBarry Smith Does not play a role in the PETSc design, can be ignored 2209321671SBarry Smith 2309321671SBarry Smith Concepts: parallel decomposition 2409321671SBarry Smith 258a124369SBarry Smith .seealso: PetscMapCreateMPI() 2609321671SBarry Smith S*/ 278a124369SBarry Smith typedef struct _p_PetscMap* PetscMap; 2809321671SBarry Smith 29d772e1d7SMatthew Knepley #define MAP_SEQ "seq" 30d772e1d7SMatthew Knepley #define MAP_MPI "mpi" 31d772e1d7SMatthew Knepley typedef char *PetscMapType; 32d772e1d7SMatthew Knepley 33d772e1d7SMatthew Knepley #define MAP_SER_MPI_BINARY "mpi_binary" 34d772e1d7SMatthew Knepley typedef char *PetscMapSerializeType; 35d772e1d7SMatthew Knepley 36d772e1d7SMatthew Knepley /* Logging support */ 37d772e1d7SMatthew Knepley extern int MAP_COOKIE; 38d772e1d7SMatthew Knepley 39d772e1d7SMatthew Knepley EXTERN int PetscMapCreate(MPI_Comm,PetscMap*); 40d772e1d7SMatthew Knepley EXTERN int PetscMapCreateMPI(MPI_Comm,int,int,PetscMap*); 41d772e1d7SMatthew Knepley EXTERN int PetscMapSerialize(MPI_Comm,PetscMap *,PetscViewer,PetscTruth); 42d772e1d7SMatthew Knepley EXTERN int PetscMapSetFromOptions(PetscMap); 43d772e1d7SMatthew Knepley EXTERN int PetscMapPrintHelp(PetscMap); 44d772e1d7SMatthew Knepley EXTERN int PetscMapDestroy(PetscMap); 45d772e1d7SMatthew Knepley 46d772e1d7SMatthew Knepley EXTERN int PetscMapSetLocalSize(PetscMap,int); 47d772e1d7SMatthew Knepley EXTERN int PetscMapGetLocalSize(PetscMap,int *); 48d772e1d7SMatthew Knepley EXTERN int PetscMapSetSize(PetscMap,int); 49d772e1d7SMatthew Knepley EXTERN int PetscMapGetSize(PetscMap,int *); 50d772e1d7SMatthew Knepley EXTERN int PetscMapGetLocalRange(PetscMap,int *,int *); 51d772e1d7SMatthew Knepley EXTERN int PetscMapGetGlobalRange(PetscMap,int *[]); 52d772e1d7SMatthew Knepley 53d772e1d7SMatthew Knepley /* Dynamic creation and loading functions */ 54d772e1d7SMatthew Knepley extern PetscFList PetscMapList; 55d772e1d7SMatthew Knepley extern PetscTruth PetscMapRegisterAllCalled; 56d772e1d7SMatthew Knepley EXTERN int PetscMapSetType(PetscMap, PetscMapType); 57d772e1d7SMatthew Knepley EXTERN int PetscMapGetType(PetscMap, PetscMapType *); 58d772e1d7SMatthew Knepley EXTERN int PetscMapRegister(const char[],const char[],const char[],int(*)(PetscMap)); 59d772e1d7SMatthew Knepley EXTERN int PetscMapRegisterAll(const char []); 60d772e1d7SMatthew Knepley EXTERN int PetscMapRegisterDestroy(void); 61d772e1d7SMatthew Knepley #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 62d772e1d7SMatthew Knepley #define PetscMapRegisterDynamic(a,b,c,d) PetscMapRegister(a,b,c,0) 63d772e1d7SMatthew Knepley #else 64d772e1d7SMatthew Knepley #define PetscMapRegisterDynamic(a,b,c,d) PetscMapRegister(a,b,c,d) 65d772e1d7SMatthew Knepley #endif 66d772e1d7SMatthew Knepley 67d772e1d7SMatthew Knepley extern PetscFList PetscMapSerializeList; 68d772e1d7SMatthew Knepley extern PetscTruth PetscMapSerializeRegisterAllCalled; 69d772e1d7SMatthew Knepley EXTERN int PetscMapSetSerializeType(PetscMap, PetscMapSerializeType); 70d772e1d7SMatthew Knepley EXTERN int PetscMapGetSerializeType(PetscMap, PetscMapSerializeType *); 71d772e1d7SMatthew Knepley EXTERN int PetscMapSerializeRegister(const char [], const char [], const char [], int (*)(MPI_Comm, PetscMap *, PetscViewer, PetscTruth)); 72d772e1d7SMatthew Knepley EXTERN int PetscMapSerializeRegisterAll(const char []); 73d772e1d7SMatthew Knepley EXTERN int PetscMapSerializeRegisterDestroy(void); 74d772e1d7SMatthew Knepley #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 75d772e1d7SMatthew Knepley #define PetscMapSerializeRegisterDynamic(a,b,c,d) PetscMapSerializeRegister(a,b,c,0) 76d772e1d7SMatthew Knepley #else 77d772e1d7SMatthew Knepley #define PetscMapSerializeRegisterDynamic(a,b,c,d) PetscMapSerializeRegister(a,b,c,d) 78d772e1d7SMatthew Knepley #endif 79d772e1d7SMatthew Knepley 8009321671SBarry Smith /*S 8109321671SBarry Smith Vec - Abstract PETSc vector object 8209321671SBarry Smith 8309321671SBarry Smith Level: beginner 8409321671SBarry Smith 8509321671SBarry Smith Concepts: field variables, unknowns, arrays 8609321671SBarry Smith 8709321671SBarry Smith .seealso: VecCreate(), VecType, VecSetType() 8809321671SBarry Smith S*/ 89f09e8eb9SSatish Balay typedef struct _p_Vec* Vec; 9009321671SBarry Smith 9109321671SBarry Smith /*S 9209321671SBarry Smith VecScatter - Object used to manage communication of data 9309321671SBarry Smith between vectors in parallel. Manages both scatters and gathers 9409321671SBarry Smith 9509321671SBarry Smith Level: beginner 9609321671SBarry Smith 9709321671SBarry Smith Concepts: scatter 9809321671SBarry Smith 9909321671SBarry Smith .seealso: VecScatterCreate(), VecScatterBegin(), VecScatterEnd() 10009321671SBarry Smith S*/ 101f09e8eb9SSatish Balay typedef struct _p_VecScatter* VecScatter; 10209321671SBarry Smith 10309321671SBarry Smith /*E 10409321671SBarry Smith VecType - String with the name of a PETSc vector or the creation function 10509321671SBarry Smith with an optional dynamic library name, for example 10609321671SBarry Smith http://www.mcs.anl.gov/petsc/lib.a:myveccreate() 10709321671SBarry Smith 10809321671SBarry Smith Level: beginner 10909321671SBarry Smith 11009321671SBarry Smith .seealso: VecSetType(), Vec 11109321671SBarry Smith E*/ 1120676abe4SMatthew Knepley #define VECSEQ "seq" 1130676abe4SMatthew Knepley #define VECMPI "mpi" 1140676abe4SMatthew Knepley #define VECFETI "feti" 1150676abe4SMatthew Knepley #define VECSHARED "shared" 1160676abe4SMatthew Knepley #define VECESI "esi" 1170676abe4SMatthew Knepley #define VECPETSCESI "petscesi" 1183f1db9ecSBarry Smith typedef char* VecType; 1192eac72dbSBarry Smith 120fd487807SMatthew Knepley #define VEC_SER_SEQ_BINARY "seq_binary" 121fd487807SMatthew Knepley #define VEC_SER_MPI_BINARY "mpi_binary" 122fd487807SMatthew Knepley typedef char *VecSerializeType; 123fd487807SMatthew Knepley 124fd487807SMatthew Knepley /* Logging support */ 125552e946dSBarry Smith #define VEC_FILE_COOKIE 1211214 1268ba1e511SMatthew Knepley extern int VEC_COOKIE; 127fd487807SMatthew Knepley extern int VEC_SCATTER_COOKIE; 128d5ba7fb7SMatthew Knepley extern int VEC_View, VEC_Max, VEC_Min, VEC_DotBarrier, VEC_Dot, VEC_MDotBarrier, VEC_MDot, VEC_TDot, VEC_MTDot, VEC_NormBarrier; 1297bdeda15SDinesh Kaushik extern int VEC_Norm, VEC_Normalize, VEC_Scale, VEC_Copy, VEC_Set, VEC_AXPY, VEC_AYPX, VEC_WAXPY, VEC_MAXPY, VEC_Swap, VEC_AssemblyBegin; 130d5ba7fb7SMatthew Knepley extern int VEC_AssemblyEnd, VEC_PointwiseMult, VEC_SetValues, VEC_Load, VEC_ScatterBarrier, VEC_ScatterBegin, VEC_ScatterEnd; 131d5ba7fb7SMatthew Knepley extern int VEC_SetRandom, VEC_ReduceArithmetic, VEC_ReduceBarrier, VEC_ReduceCommunication; 1328ba1e511SMatthew Knepley 1338ba1e511SMatthew Knepley EXTERN int VecInitializePackage(char *); 134fd487807SMatthew Knepley 135d772e1d7SMatthew Knepley EXTERN int VecCreate(MPI_Comm,Vec *); 136ca44d042SBarry Smith EXTERN int VecCreateSeq(MPI_Comm,int,Vec*); 137ca44d042SBarry Smith EXTERN int VecCreateMPI(MPI_Comm,int,int,Vec*); 138ea709b57SSatish Balay EXTERN int VecCreateSeqWithArray(MPI_Comm,int,const PetscScalar[],Vec*); 139ea709b57SSatish Balay EXTERN int VecCreateMPIWithArray(MPI_Comm,int,int,const PetscScalar[],Vec*); 140ca44d042SBarry Smith EXTERN int VecCreateShared(MPI_Comm,int,int,Vec*); 1417097b907SMatthew Knepley EXTERN int VecSerialize(MPI_Comm,Vec *,PetscViewer,PetscTruth); 142ca44d042SBarry Smith EXTERN int VecSetFromOptions(Vec); 143fd487807SMatthew Knepley EXTERN int VecPrintHelp(Vec); 144ca44d042SBarry Smith EXTERN int VecDestroy(Vec); 1454b0e389bSBarry Smith 1467097b907SMatthew Knepley EXTERN int VecSetSizes(Vec,int,int); 147fd487807SMatthew Knepley 14887828ca2SBarry Smith EXTERN int VecDot(Vec,Vec,PetscScalar*); 14987828ca2SBarry Smith EXTERN int VecTDot(Vec,Vec,PetscScalar*); 15087828ca2SBarry Smith EXTERN int VecMDot(int,Vec,const Vec[],PetscScalar*); 15187828ca2SBarry Smith EXTERN int VecMTDot(int,Vec,const Vec[],PetscScalar*); 152cddf8d76SBarry Smith 15309321671SBarry Smith /*E 15409321671SBarry Smith NormType - determines what type of norm to compute 15509321671SBarry Smith 15609321671SBarry Smith Level: beginner 15709321671SBarry Smith 15809321671SBarry Smith .seealso: VecNorm(), VecNormBegin(), VecNormEnd(), MatNorm() 15909321671SBarry Smith E*/ 16093c39befSBarry Smith typedef enum {NORM_1=1,NORM_2=2,NORM_FROBENIUS=3,NORM_INFINITY=4,NORM_1_AND_2=5} NormType; 161cddf8d76SBarry Smith #define NORM_MAX NORM_INFINITY 16209321671SBarry Smith 163b0a32e0cSBarry Smith EXTERN int VecNorm(Vec,NormType,PetscReal *); 1647bdeda15SDinesh Kaushik EXTERN int VecNormalize(Vec,PetscReal *); 16587828ca2SBarry Smith EXTERN int VecSum(Vec,PetscScalar*); 166b0a32e0cSBarry Smith EXTERN int VecMax(Vec,int*,PetscReal *); 167b0a32e0cSBarry Smith EXTERN int VecMin(Vec,int*,PetscReal *); 168ea709b57SSatish Balay EXTERN int VecScale(const PetscScalar *a,Vec v); 169ca44d042SBarry Smith EXTERN int VecCopy(Vec,Vec); 170ca44d042SBarry Smith EXTERN int VecSetRandom(PetscRandom,Vec); 171ea709b57SSatish Balay EXTERN int VecSet(const PetscScalar*,Vec); 172ca44d042SBarry Smith EXTERN int VecSwap(Vec,Vec); 173ea709b57SSatish Balay EXTERN int VecAXPY(const PetscScalar*,Vec,Vec); 174ea709b57SSatish Balay EXTERN int VecAXPBY(const PetscScalar*,const PetscScalar *,Vec,Vec); 175ea709b57SSatish Balay EXTERN int VecMAXPY(int,const PetscScalar*,Vec,Vec*); 176ea709b57SSatish Balay EXTERN int VecAYPX(const PetscScalar*,Vec,Vec); 177ea709b57SSatish Balay EXTERN int VecWAXPY(const PetscScalar*,Vec,Vec,Vec); 178ca44d042SBarry Smith EXTERN int VecPointwiseMult(Vec,Vec,Vec); 179ca44d042SBarry Smith EXTERN int VecPointwiseDivide(Vec,Vec,Vec); 180b10e564cSKris Buschelman EXTERN int VecMaxPointwiseDivide(Vec,Vec,PetscReal*); 181ea709b57SSatish Balay EXTERN int VecShift(const PetscScalar*,Vec); 182ca44d042SBarry Smith EXTERN int VecReciprocal(Vec); 183deeb6e72SMatthew Knepley EXTERN int VecPermute(Vec, IS, PetscTruth); 184deeb6e72SMatthew Knepley EXTERN int VecSqrt(Vec); 185ca44d042SBarry Smith EXTERN int VecAbs(Vec); 186ca44d042SBarry Smith EXTERN int VecDuplicate(Vec,Vec*); 187ca44d042SBarry Smith EXTERN int VecDuplicateVecs(Vec,int,Vec*[]); 188ca44d042SBarry Smith EXTERN int VecDestroyVecs(const Vec[],int); 1898a124369SBarry Smith EXTERN int VecGetPetscMap(Vec,PetscMap*); 1902eac72dbSBarry Smith 191147746d1SBarry Smith EXTERN int VecStrideNormAll(Vec,NormType,PetscReal*); 192147746d1SBarry Smith EXTERN int VecStrideMaxAll(Vec,int *,PetscReal *); 193147746d1SBarry Smith EXTERN int VecStrideMinAll(Vec,int *,PetscReal *); 194147746d1SBarry Smith EXTERN int VecStrideScaleAll(Vec,PetscScalar*); 1954a560884SBarry Smith 19687828ca2SBarry Smith EXTERN int VecStrideNorm(Vec,int,NormType,PetscReal*); 19787828ca2SBarry Smith EXTERN int VecStrideMax(Vec,int,int *,PetscReal *); 19887828ca2SBarry Smith EXTERN int VecStrideMin(Vec,int,int *,PetscReal *); 1994a560884SBarry Smith EXTERN int VecStrideScale(Vec,int,PetscScalar*); 2004a560884SBarry Smith EXTERN int VecStrideGather(Vec,int,Vec,InsertMode); 2014a560884SBarry Smith EXTERN int VecStrideScatter(Vec,int,Vec,InsertMode); 202ca44d042SBarry Smith EXTERN int VecStrideGatherAll(Vec,Vec*,InsertMode); 203ca44d042SBarry Smith EXTERN int VecStrideScatterAll(Vec*,Vec,InsertMode); 204d2655a18SBarry Smith 205ea709b57SSatish Balay EXTERN int VecSetValues(Vec,int,const int[],const PetscScalar[],InsertMode); 206ca44d042SBarry Smith EXTERN int VecAssemblyBegin(Vec); 207ca44d042SBarry Smith EXTERN int VecAssemblyEnd(Vec); 208ca44d042SBarry Smith EXTERN int VecSetStashInitialSize(Vec,int,int); 209b0a32e0cSBarry Smith EXTERN int VecStashView(Vec,PetscViewer); 21062dc5420SSatish Balay 21130de9b25SBarry Smith /*MC 21230de9b25SBarry Smith VecSetValue - Set a single entry into a vector. 21330de9b25SBarry Smith 21430de9b25SBarry Smith Synopsis: 21530de9b25SBarry Smith int VecSetValue(Vec v,int row,PetscScalar value, InsertMode mode); 21630de9b25SBarry Smith 21730de9b25SBarry Smith Not Collective 21830de9b25SBarry Smith 21930de9b25SBarry Smith Input Parameters: 22030de9b25SBarry Smith + v - the vector 22130de9b25SBarry Smith . row - the row location of the entry 22230de9b25SBarry Smith . value - the value to insert 22330de9b25SBarry Smith - mode - either INSERT_VALUES or ADD_VALUES 22430de9b25SBarry Smith 22530de9b25SBarry Smith Notes: 22630de9b25SBarry Smith For efficiency one should use VecSetValues() and set several or 22730de9b25SBarry Smith many values simultaneously if possible. 22830de9b25SBarry Smith 22930de9b25SBarry Smith Note that VecSetValue() does NOT return an error code (since this 23030de9b25SBarry Smith is checked internally). 23130de9b25SBarry Smith 23230de9b25SBarry Smith These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd() 23330de9b25SBarry Smith MUST be called after all calls to VecSetValues() have been completed. 23430de9b25SBarry Smith 23530de9b25SBarry Smith VecSetValues() uses 0-based indices in Fortran as well as in C. 23630de9b25SBarry Smith 23730de9b25SBarry Smith Level: beginner 23830de9b25SBarry Smith 23930de9b25SBarry Smith .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal() 24030de9b25SBarry Smith M*/ 241bdea15b1SBarry Smith #define VecSetValue(v,i,va,mode) 0;\ 242ea709b57SSatish Balay {int _ierr,_row = i; PetscScalar _va = va; \ 243b951964fSBarry Smith _ierr = VecSetValues(v,1,&_row,&_va,mode);CHKERRQ(_ierr); \ 244b951964fSBarry Smith } 24530de9b25SBarry Smith 246ca44d042SBarry Smith EXTERN int VecSetBlockSize(Vec,int); 247ca44d042SBarry Smith EXTERN int VecGetBlockSize(Vec,int*); 248ea709b57SSatish Balay EXTERN int VecSetValuesBlocked(Vec,int,const int[],const PetscScalar[],InsertMode); 2498ed539a5SBarry Smith 250fd487807SMatthew Knepley /* Dynamic creation and loading functions */ 251fd487807SMatthew Knepley extern PetscFList VecList; 252d772e1d7SMatthew Knepley extern PetscTruth VecRegisterAllCalled; 253d772e1d7SMatthew Knepley EXTERN int VecSetType(Vec, VecType); 254d772e1d7SMatthew Knepley EXTERN int VecGetType(Vec, VecType *); 255d772e1d7SMatthew Knepley EXTERN int VecRegister(const char[],const char[],const char[],int(*)(Vec)); 256d772e1d7SMatthew Knepley EXTERN int VecRegisterAll(const char []); 257d772e1d7SMatthew Knepley EXTERN int VecRegisterDestroy(void); 25830de9b25SBarry Smith 25930de9b25SBarry Smith /*MC 26030de9b25SBarry Smith VecRegisterDynamic - Adds a new vector component implementation 26130de9b25SBarry Smith 26230de9b25SBarry Smith Synopsis: 26330de9b25SBarry Smith VecRegisterDynamic(char *name, char *path, char *func_name, int (*create_func)(Vec)) 26430de9b25SBarry Smith 26530de9b25SBarry Smith Not Collective 26630de9b25SBarry Smith 26730de9b25SBarry Smith Input Parameters: 26830de9b25SBarry Smith + name - The name of a new user-defined creation routine 26930de9b25SBarry Smith . path - The path (either absolute or relative) of the library containing this routine 27030de9b25SBarry Smith . func_name - The name of routine to create method context 27130de9b25SBarry Smith - create_func - The creation routine itself 27230de9b25SBarry Smith 27330de9b25SBarry Smith Notes: 27430de9b25SBarry Smith VecRegisterDynamic() may be called multiple times to add several user-defined vectors 27530de9b25SBarry Smith 27630de9b25SBarry Smith If dynamic libraries are used, then the fourth input argument (routine_create) is ignored. 27730de9b25SBarry Smith 27830de9b25SBarry Smith Sample usage: 27930de9b25SBarry Smith .vb 28030de9b25SBarry Smith VecRegisterDynamic("my_vec","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyVectorCreate", MyVectorCreate); 28130de9b25SBarry Smith .ve 28230de9b25SBarry Smith 28330de9b25SBarry Smith Then, your vector type can be chosen with the procedural interface via 28430de9b25SBarry Smith .vb 28530de9b25SBarry Smith VecCreate(MPI_Comm, Vec *); 28630de9b25SBarry Smith VecSetType(Vec,"my_vector_name"); 28730de9b25SBarry Smith .ve 28830de9b25SBarry Smith or at runtime via the option 28930de9b25SBarry Smith .vb 29030de9b25SBarry Smith -vec_type my_vector_name 29130de9b25SBarry Smith .ve 29230de9b25SBarry Smith 29330de9b25SBarry Smith Notes: $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values. 29430de9b25SBarry Smith If your function is not being put into a shared library then use VecRegister() instead 29530de9b25SBarry Smith 29630de9b25SBarry Smith Level: advanced 29730de9b25SBarry Smith 29830de9b25SBarry Smith .keywords: Vec, register 29930de9b25SBarry Smith .seealso: VecRegisterAll(), VecRegisterDestroy(), VecRegister() 30030de9b25SBarry Smith M*/ 301aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 302f1af5d2fSBarry Smith #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,0) 30388d459dfSBarry Smith #else 304f1af5d2fSBarry Smith #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,d) 30588d459dfSBarry Smith #endif 30688d459dfSBarry Smith 307fd487807SMatthew Knepley extern PetscFList VecSerializeList; 308d772e1d7SMatthew Knepley extern PetscTruth VecSerializeRegisterAllCalled; 309d772e1d7SMatthew Knepley EXTERN int VecSetSerializeType(Vec, VecSerializeType); 310d772e1d7SMatthew Knepley EXTERN int VecGetSerializeType(Vec, VecSerializeType *); 311d772e1d7SMatthew Knepley EXTERN int VecSerializeRegister(const char [], const char [], const char [], int (*)(MPI_Comm, Vec *, PetscViewer, PetscTruth)); 312d772e1d7SMatthew Knepley EXTERN int VecSerializeRegisterAll(const char []); 313d772e1d7SMatthew Knepley EXTERN int VecSerializeRegisterDestroy(void); 31430de9b25SBarry Smith 31530de9b25SBarry Smith /*MC 31630de9b25SBarry Smith VecSerializeRegisterDynamic - Adds a serialization method to the vec package. 31730de9b25SBarry Smith 31830de9b25SBarry Smith Synopsis: 31930de9b25SBarry Smith 32030de9b25SBarry Smith VecSerializeRegisterDynamic(char *name, char *path, char *func_name, 32130de9b25SBarry Smith int (*serialize_func)(MPI_Comm, Vec *, PetscViewer, PetscTruth)) 32230de9b25SBarry Smith 32330de9b25SBarry Smith Not Collective 32430de9b25SBarry Smith 32530de9b25SBarry Smith Input Parameters: 32630de9b25SBarry Smith + name - The name of a new user-defined serialization routine 32730de9b25SBarry Smith . path - The path (either absolute or relative) of the library containing this routine 32830de9b25SBarry Smith . func_name - The name of the serialization routine 32930de9b25SBarry Smith - serialize_func - The serialization routine itself 33030de9b25SBarry Smith 33130de9b25SBarry Smith Notes: 33230de9b25SBarry Smith VecSerializeRegister() may be called multiple times to add several user-defined serializers. 33330de9b25SBarry Smith 33430de9b25SBarry Smith If dynamic libraries are used, then the fourth input argument (serialize_func) is ignored. 33530de9b25SBarry Smith 33630de9b25SBarry Smith Sample usage: 33730de9b25SBarry Smith .vb 33830de9b25SBarry Smith VecSerializeRegisterDynamic("my_store", "/home/username/my_lib/lib/libO/solaris/libmy.a", "MyStoreFunc", MyStoreFunc); 33930de9b25SBarry Smith .ve 34030de9b25SBarry Smith 34130de9b25SBarry Smith Then, your serialization can be chosen with the procedural interface via 34230de9b25SBarry Smith .vb 34330de9b25SBarry Smith VecSetSerializeType(vec, "my_store") 34430de9b25SBarry Smith .ve 34530de9b25SBarry Smith or at runtime via the option 34630de9b25SBarry Smith .vb 34730de9b25SBarry Smith -vec_serialize_type my_store 34830de9b25SBarry Smith .ve 34930de9b25SBarry Smith 35030de9b25SBarry Smith Note: $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values. 35130de9b25SBarry Smith 35230de9b25SBarry Smith Level: advanced 35330de9b25SBarry Smith 35430de9b25SBarry Smith .keywords: Vec, register 35530de9b25SBarry Smith .seealso: VecSerializeRegisterAll(), VecSerializeRegisterDestroy() 35630de9b25SBarry Smith M*/ 357fd487807SMatthew Knepley #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 358fd487807SMatthew Knepley #define VecSerializeRegisterDynamic(a,b,c,d) VecSerializeRegister(a,b,c,0) 359fd487807SMatthew Knepley #else 360fd487807SMatthew Knepley #define VecSerializeRegisterDynamic(a,b,c,d) VecSerializeRegister(a,b,c,d) 361fd487807SMatthew Knepley #endif 36209321671SBarry Smith 363ca44d042SBarry Smith EXTERN int VecScatterCreate(Vec,IS,Vec,IS,VecScatter *); 364ca44d042SBarry Smith EXTERN int VecScatterPostRecvs(Vec,Vec,InsertMode,ScatterMode,VecScatter); 365ca44d042SBarry Smith EXTERN int VecScatterBegin(Vec,Vec,InsertMode,ScatterMode,VecScatter); 366ca44d042SBarry Smith EXTERN int VecScatterEnd(Vec,Vec,InsertMode,ScatterMode,VecScatter); 367ca44d042SBarry Smith EXTERN int VecScatterDestroy(VecScatter); 368ca44d042SBarry Smith EXTERN int VecScatterCopy(VecScatter,VecScatter *); 369b0a32e0cSBarry Smith EXTERN int VecScatterView(VecScatter,PetscViewer); 370ca44d042SBarry Smith EXTERN int VecScatterRemap(VecScatter,int *,int*); 3712195c698SBarry Smith 372cb5b572fSBarry Smith typedef enum {PIPELINE_DOWN=0,PIPELINE_UP=1} PipelineDirection; 373cb5b572fSBarry Smith typedef enum {PIPELINE_NONE=1,PIPELINE_SEQUENTIAL=2, 3748ea6152fSSatish Balay PIPELINE_REDBLACK=3,PIPELINE_MULTICOLOR=4} PipelineType; 375cb5b572fSBarry Smith 376cb5b572fSBarry Smith typedef struct _p_VecPipeline* VecPipeline; 377cb5b572fSBarry Smith 378ca44d042SBarry Smith EXTERN int VecPipelineCreate(MPI_Comm,Vec,IS,Vec,IS,VecPipeline *); 379ca44d042SBarry Smith EXTERN int VecPipelineSetType(VecPipeline,PipelineType,PetscObject); 380ca44d042SBarry Smith EXTERN int VecPipelineSetup(VecPipeline); 381ca44d042SBarry Smith EXTERN int VecPipelineBegin(Vec,Vec,InsertMode,ScatterMode,PipelineDirection,VecPipeline); 382ca44d042SBarry Smith EXTERN int VecPipelineEnd(Vec,Vec,InsertMode,ScatterMode,PipelineDirection,VecPipeline); 383b0a32e0cSBarry Smith EXTERN int VecPipelineView(VecPipeline,PetscViewer); 384ca44d042SBarry Smith EXTERN int VecPipelineDestroy(VecPipeline); 385cb5b572fSBarry Smith 38687828ca2SBarry Smith EXTERN int VecGetArray(Vec,PetscScalar*[]); 38787828ca2SBarry Smith EXTERN int VecRestoreArray(Vec,PetscScalar*[]); 38887828ca2SBarry Smith EXTERN int VecGetArray4d(Vec,int,int,int,int,int,int,int,int,PetscScalar****[]); 38987828ca2SBarry Smith EXTERN int VecRestoreArray4d(Vec,int,int,int,int,int,int,int,int,PetscScalar****[]); 39087828ca2SBarry Smith EXTERN int VecGetArray3d(Vec,int,int,int,int,int,int,PetscScalar***[]); 39187828ca2SBarry Smith EXTERN int VecRestoreArray3d(Vec,int,int,int,int,int,int,PetscScalar***[]); 39287828ca2SBarry Smith EXTERN int VecGetArray2d(Vec,int,int,int,int,PetscScalar**[]); 39387828ca2SBarry Smith EXTERN int VecRestoreArray2d(Vec,int,int,int,int,PetscScalar**[]); 39487828ca2SBarry Smith EXTERN int VecGetArray1d(Vec,int,int,PetscScalar *[]); 39587828ca2SBarry Smith EXTERN int VecRestoreArray1d(Vec,int,int,PetscScalar *[]); 396ab360428SBarry Smith 397ea709b57SSatish Balay EXTERN int VecPlaceArray(Vec,const PetscScalar[]); 398b0a32e0cSBarry Smith EXTERN int VecResetArray(Vec); 399ea709b57SSatish Balay EXTERN int VecReplaceArray(Vec,const PetscScalar[]); 40087828ca2SBarry Smith EXTERN int VecGetArrays(const Vec[],int,PetscScalar**[]); 40187828ca2SBarry Smith EXTERN int VecRestoreArrays(const Vec[],int,PetscScalar**[]); 40284cb2905SBarry Smith 403ca44d042SBarry Smith EXTERN int VecValid(Vec,PetscTruth*); 404b0a32e0cSBarry Smith EXTERN int VecView(Vec,PetscViewer); 40591d0cc33SMatthew Knepley EXTERN int VecViewFromOptions(Vec, char *); 406ca44d042SBarry Smith EXTERN int VecEqual(Vec,Vec,PetscTruth*); 407b0a32e0cSBarry Smith EXTERN int VecLoad(PetscViewer,Vec*); 408b0a32e0cSBarry Smith EXTERN int VecLoadIntoVector(PetscViewer,Vec); 4098ed539a5SBarry Smith 410ca44d042SBarry Smith EXTERN int VecGetSize(Vec,int*); 411ca44d042SBarry Smith EXTERN int VecGetLocalSize(Vec,int*); 412ca44d042SBarry Smith EXTERN int VecGetOwnershipRange(Vec,int*,int*); 4138ed539a5SBarry Smith 414ca44d042SBarry Smith EXTERN int VecSetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping); 415ea709b57SSatish Balay EXTERN int VecSetValuesLocal(Vec,int,const int[],const PetscScalar[],InsertMode); 416323b833fSBarry Smith EXTERN int VecSetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping); 417ea709b57SSatish Balay EXTERN int VecSetValuesBlockedLocal(Vec,int,const int[],const PetscScalar[],InsertMode); 41890f02eecSBarry Smith 41987828ca2SBarry Smith EXTERN int VecDotBegin(Vec,Vec,PetscScalar *); 42087828ca2SBarry Smith EXTERN int VecDotEnd(Vec,Vec,PetscScalar *); 42187828ca2SBarry Smith EXTERN int VecTDotBegin(Vec,Vec,PetscScalar *); 42287828ca2SBarry Smith EXTERN int VecTDotEnd(Vec,Vec,PetscScalar *); 42387828ca2SBarry Smith EXTERN int VecNormBegin(Vec,NormType,PetscReal *); 42487828ca2SBarry Smith EXTERN int VecNormEnd(Vec,NormType,PetscReal *); 425d3c178dbSBarry Smith 426fdbc4c26SBarry Smith typedef enum {VEC_IGNORE_OFF_PROC_ENTRIES,VEC_TREAT_OFF_PROC_ENTRIES} VecOption; 427ca44d042SBarry Smith EXTERN int VecSetOption(Vec,VecOption); 42890f02eecSBarry Smith 42987828ca2SBarry Smith EXTERN int VecContourScale(Vec,PetscReal,PetscReal); 430522c5e43SBarry Smith 43115091d37SBarry Smith /* 43215091d37SBarry Smith These numbers need to match the entries in 43315091d37SBarry Smith the function table in src/vec/vecimpl.h 43415091d37SBarry Smith */ 435b1bcba4aSBarry Smith typedef enum { VECOP_VIEW = 32, 436b1bcba4aSBarry Smith VECOP_LOADINTOVECTOR = 38 43715091d37SBarry Smith } VecOperation; 438c134de8dSSatish Balay EXTERN int VecSetOperation(Vec,VecOperation,void(*)(void)); 439b19c1e4cSBarry Smith 440e182c471SBarry Smith /* 441e182c471SBarry Smith Routines for dealing with ghosted vectors: 442e182c471SBarry Smith vectors with ghost elements at the end of the array. 443e182c471SBarry Smith */ 444ca44d042SBarry Smith EXTERN int VecCreateGhost(MPI_Comm,int,int,int,const int[],Vec*); 445ea709b57SSatish Balay EXTERN int VecCreateGhostWithArray(MPI_Comm,int,int,int,const int[],const PetscScalar[],Vec*); 446ca44d042SBarry Smith EXTERN int VecCreateGhostBlock(MPI_Comm,int,int,int,int,const int[],Vec*); 447ea709b57SSatish Balay EXTERN int VecCreateGhostBlockWithArray(MPI_Comm,int,int,int,int,const int[],const PetscScalar[],Vec*); 448ca44d042SBarry Smith EXTERN int VecGhostGetLocalForm(Vec,Vec*); 449ca44d042SBarry Smith EXTERN int VecGhostRestoreLocalForm(Vec,Vec*); 450ca44d042SBarry Smith EXTERN int VecGhostUpdateBegin(Vec,InsertMode,ScatterMode); 451ca44d042SBarry Smith EXTERN int VecGhostUpdateEnd(Vec,InsertMode,ScatterMode); 452e182c471SBarry Smith 4537b200f87SKris Buschelman EXTERN int VecConjugate(Vec); 45434233285SBarry Smith 455bba1ac68SSatish Balay EXTERN int VecConvertMPIToSeqAll(Vec vin,Vec *vout); 456bba1ac68SSatish Balay EXTERN int VecConvertMPIToMPIZero(Vec vin,Vec *vout); 457bba1ac68SSatish Balay 458bba1ac68SSatish Balay 459bba1ac68SSatish Balay EXTERN int VecESISetType(Vec,char*); 460bba1ac68SSatish Balay EXTERN int VecESISetFromOptions(Vec); 461bba1ac68SSatish Balay 4627dbadf16SMatthew Knepley EXTERN int PetscViewerMathematicaGetVector(PetscViewer, Vec); 4637dbadf16SMatthew Knepley EXTERN int PetscViewerMathematicaPutVector(PetscViewer, Vec); 4647dbadf16SMatthew Knepley 465d59c15a7SBarry Smith /*S 466d59c15a7SBarry Smith Vecs - Collection of vectors where the data for the vectors is stored in 467d59c15a7SBarry Smith one continquous memory 468d59c15a7SBarry Smith 469d59c15a7SBarry Smith Level: advanced 470d59c15a7SBarry Smith 471d59c15a7SBarry Smith Notes: 472d59c15a7SBarry Smith Temporary construct for handling multiply right hand side solves 473d59c15a7SBarry Smith 474d59c15a7SBarry Smith This is faked by storing a single vector that has enough array space for 475d59c15a7SBarry Smith n vectors 476d59c15a7SBarry Smith 477d59c15a7SBarry Smith Concepts: parallel decomposition 478d59c15a7SBarry Smith 479d59c15a7SBarry Smith S*/ 480d59c15a7SBarry Smith struct _p_Vecs {int n; Vec v;}; 481d59c15a7SBarry Smith typedef struct _p_Vecs* Vecs; 482d59c15a7SBarry Smith #define VecsDestroy(x) (VecDestroy((x)->v) || PetscFree(x)) 483d59c15a7SBarry Smith #define VecsCreateSeq(comm,p,m,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeq(comm,p*m,&(*(x))->v) || (-1 == ((*(x))->n = (m)))) 484d59c15a7SBarry Smith #define VecsCreateSeqWithArray(comm,p,m,a,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeqWithArray(comm,p*m,a,&(*(x))->v) || (-1 == ((*(x))->n = (m)))) 485d59c15a7SBarry Smith #define VecsDuplicate(x,y) (PetscNew(struct _p_Vecs,y) || VecDuplicate(x->v,&(*(y))->v) || (-1 == ((*(y))->n = (x)->n))) 486*e9fa29b7SSatish Balay 487*e9fa29b7SSatish Balay 488*e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END 4892eac72dbSBarry Smith #endif 490