12eac72dbSBarry Smith /* 237f753daSBarry Smith Defines the vector component of PETSc. Vectors generally represent 337f753daSBarry Smith degrees of freedom for finite element/finite difference functions 484cb2905SBarry Smith on a grid. They have more mathematical structure then simple arrays. 52eac72dbSBarry Smith */ 62eac72dbSBarry Smith 70a835dfdSSatish Balay #ifndef __PETSCVEC_H 80a835dfdSSatish Balay #define __PETSCVEC_H 90a835dfdSSatish Balay #include "petscis.h" 100a835dfdSSatish Balay #include "petscsys.h" 11e9fa29b7SSatish Balay PETSC_EXTERN_CXX_BEGIN 122eac72dbSBarry Smith 1309321671SBarry Smith /*S 148a124369SBarry Smith PetscMap - Abstract PETSc object that defines the layout of vector and 15013c094aSBarry Smith matrices across processors 1609321671SBarry Smith 1709321671SBarry Smith Level: advanced 1809321671SBarry Smith 1909321671SBarry Smith Notes: 2009321671SBarry Smith Does not play a role in the PETSc design, can be ignored 2109321671SBarry Smith 2209321671SBarry Smith Concepts: parallel decomposition 2309321671SBarry Smith 248a124369SBarry Smith .seealso: PetscMapCreateMPI() 2509321671SBarry Smith S*/ 268a124369SBarry Smith typedef struct _p_PetscMap* PetscMap; 2709321671SBarry Smith 28d772e1d7SMatthew Knepley #define MAP_SEQ "seq" 29d772e1d7SMatthew Knepley #define MAP_MPI "mpi" 3049773a63SBarry Smith #define PetscMapType char* 31d772e1d7SMatthew Knepley 32d772e1d7SMatthew Knepley /* Logging support */ 336849ba73SBarry Smith extern PetscCookie MAP_COOKIE; 34d772e1d7SMatthew Knepley 35dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapCreate(MPI_Comm,PetscMap*); 3632dcc486SBarry Smith EXTERN PetscErrorCode PetscMapCreateMPI(MPI_Comm,PetscInt,PetscInt,PetscMap*); 37dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapSetFromOptions(PetscMap); 38dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapPrintHelp(PetscMap); 39dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapDestroy(PetscMap); 40d772e1d7SMatthew Knepley 4132dcc486SBarry Smith EXTERN PetscErrorCode PetscMapSetLocalSize(PetscMap,PetscInt); 4232dcc486SBarry Smith EXTERN PetscErrorCode PetscMapGetLocalSize(PetscMap,PetscInt *); 4332dcc486SBarry Smith EXTERN PetscErrorCode PetscMapSetSize(PetscMap,PetscInt); 4432dcc486SBarry Smith EXTERN PetscErrorCode PetscMapGetSize(PetscMap,PetscInt *); 4532dcc486SBarry Smith EXTERN PetscErrorCode PetscMapGetLocalRange(PetscMap,PetscInt *,PetscInt *); 4632dcc486SBarry Smith EXTERN PetscErrorCode PetscMapGetGlobalRange(PetscMap,PetscInt *[]); 47d772e1d7SMatthew Knepley 48d772e1d7SMatthew Knepley /* Dynamic creation and loading functions */ 49d772e1d7SMatthew Knepley extern PetscFList PetscMapList; 50d772e1d7SMatthew Knepley extern PetscTruth PetscMapRegisterAllCalled; 51dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapSetType(PetscMap, const PetscMapType); 52dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapGetType(PetscMap, PetscMapType *); 536849ba73SBarry Smith EXTERN PetscErrorCode PetscMapRegister(const char[],const char[],const char[],PetscErrorCode (*)(PetscMap)); 54dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapRegisterAll(const char []); 55dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapRegisterDestroy(void); 56d772e1d7SMatthew Knepley #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 57d772e1d7SMatthew Knepley #define PetscMapRegisterDynamic(a,b,c,d) PetscMapRegister(a,b,c,0) 58d772e1d7SMatthew Knepley #else 59d772e1d7SMatthew Knepley #define PetscMapRegisterDynamic(a,b,c,d) PetscMapRegister(a,b,c,d) 60d772e1d7SMatthew Knepley #endif 61d772e1d7SMatthew Knepley 6209321671SBarry Smith /*S 6309321671SBarry Smith Vec - Abstract PETSc vector object 6409321671SBarry Smith 6509321671SBarry Smith Level: beginner 6609321671SBarry Smith 6709321671SBarry Smith Concepts: field variables, unknowns, arrays 6809321671SBarry Smith 6909321671SBarry Smith .seealso: VecCreate(), VecType, VecSetType() 7009321671SBarry Smith S*/ 71f09e8eb9SSatish Balay typedef struct _p_Vec* Vec; 7209321671SBarry Smith 7309321671SBarry Smith /*S 7409321671SBarry Smith VecScatter - Object used to manage communication of data 7509321671SBarry Smith between vectors in parallel. Manages both scatters and gathers 7609321671SBarry Smith 7709321671SBarry Smith Level: beginner 7809321671SBarry Smith 7909321671SBarry Smith Concepts: scatter 8009321671SBarry Smith 8109321671SBarry Smith .seealso: VecScatterCreate(), VecScatterBegin(), VecScatterEnd() 8209321671SBarry Smith S*/ 83f09e8eb9SSatish Balay typedef struct _p_VecScatter* VecScatter; 8409321671SBarry Smith 8509321671SBarry Smith /*E 8609321671SBarry Smith VecType - String with the name of a PETSc vector or the creation function 8709321671SBarry Smith with an optional dynamic library name, for example 8809321671SBarry Smith http://www.mcs.anl.gov/petsc/lib.a:myveccreate() 8909321671SBarry Smith 9009321671SBarry Smith Level: beginner 9109321671SBarry Smith 9209321671SBarry Smith .seealso: VecSetType(), Vec 9309321671SBarry Smith E*/ 940676abe4SMatthew Knepley #define VECSEQ "seq" 950676abe4SMatthew Knepley #define VECMPI "mpi" 960676abe4SMatthew Knepley #define VECFETI "feti" 970676abe4SMatthew Knepley #define VECSHARED "shared" 9849773a63SBarry Smith #define VecType char* 992eac72dbSBarry Smith 100fd487807SMatthew Knepley /* Logging support */ 101552e946dSBarry Smith #define VEC_FILE_COOKIE 1211214 1026849ba73SBarry Smith extern PetscCookie VEC_COOKIE, VEC_SCATTER_COOKIE; 1036849ba73SBarry Smith extern PetscEvent VEC_View, VEC_Max, VEC_Min, VEC_DotBarrier, VEC_Dot, VEC_MDotBarrier, VEC_MDot, VEC_TDot, VEC_MTDot; 1046849ba73SBarry Smith extern PetscEvent VEC_Norm, VEC_Normalize, VEC_Scale, VEC_Copy, VEC_Set, VEC_AXPY, VEC_AYPX, VEC_WAXPY, VEC_MAXPY; 1056849ba73SBarry Smith extern PetscEvent VEC_AssemblyEnd, VEC_PointwiseMult, VEC_SetValues, VEC_Load, VEC_ScatterBarrier, VEC_ScatterBegin, VEC_ScatterEnd; 1066849ba73SBarry Smith extern PetscEvent VEC_SetRandom, VEC_ReduceArithmetic, VEC_ReduceBarrier, VEC_ReduceCommunication; 1076849ba73SBarry Smith extern PetscEvent VEC_Swap, VEC_AssemblyBegin, VEC_NormBarrier; 1088ba1e511SMatthew Knepley 109dfbe8321SBarry Smith EXTERN PetscErrorCode VecInitializePackage(char *); 110fd487807SMatthew Knepley 111dfbe8321SBarry Smith EXTERN PetscErrorCode VecCreate(MPI_Comm,Vec *); 11232dcc486SBarry Smith EXTERN PetscErrorCode VecCreateSeq(MPI_Comm,PetscInt,Vec*); 11332dcc486SBarry Smith EXTERN PetscErrorCode VecCreateMPI(MPI_Comm,PetscInt,PetscInt,Vec*); 11432dcc486SBarry Smith EXTERN PetscErrorCode VecCreateSeqWithArray(MPI_Comm,PetscInt,const PetscScalar[],Vec*); 11532dcc486SBarry Smith EXTERN PetscErrorCode VecCreateMPIWithArray(MPI_Comm,PetscInt,PetscInt,const PetscScalar[],Vec*); 11632dcc486SBarry Smith EXTERN PetscErrorCode VecCreateShared(MPI_Comm,PetscInt,PetscInt,Vec*); 117dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetFromOptions(Vec); 118dfbe8321SBarry Smith EXTERN PetscErrorCode VecPrintHelp(Vec); 119dfbe8321SBarry Smith EXTERN PetscErrorCode VecDestroy(Vec); 1204b0e389bSBarry Smith 12132dcc486SBarry Smith EXTERN PetscErrorCode VecSetSizes(Vec,PetscInt,PetscInt); 122fd487807SMatthew Knepley 123dfbe8321SBarry Smith EXTERN PetscErrorCode VecDot(Vec,Vec,PetscScalar*); 124dfbe8321SBarry Smith EXTERN PetscErrorCode VecTDot(Vec,Vec,PetscScalar*); 12532dcc486SBarry Smith EXTERN PetscErrorCode VecMDot(PetscInt,Vec,const Vec[],PetscScalar*); 12632dcc486SBarry Smith EXTERN PetscErrorCode VecMTDot(PetscInt,Vec,const Vec[],PetscScalar*); 127cddf8d76SBarry Smith 12809321671SBarry Smith /*E 12909321671SBarry Smith NormType - determines what type of norm to compute 13009321671SBarry Smith 13109321671SBarry Smith Level: beginner 13209321671SBarry Smith 13309321671SBarry Smith .seealso: VecNorm(), VecNormBegin(), VecNormEnd(), MatNorm() 13409321671SBarry Smith E*/ 13593c39befSBarry Smith typedef enum {NORM_1=1,NORM_2=2,NORM_FROBENIUS=3,NORM_INFINITY=4,NORM_1_AND_2=5} NormType; 136cddf8d76SBarry Smith #define NORM_MAX NORM_INFINITY 13709321671SBarry Smith 1389b250c83SBarry Smith /*MC 1399b250c83SBarry Smith NORM_1 - the one norm, ||v|| = sum_i | v_i |. ||A|| = max_j || v_*j ||, maximum column sum 1409b250c83SBarry Smith 1419b250c83SBarry Smith Level: beginner 1429b250c83SBarry Smith 1439b250c83SBarry Smith .seealso: NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_2, NORM_FROBENIUS, 1449b250c83SBarry Smith NORM_INFINITY, NORM_1_AND_2 1459b250c83SBarry Smith 1469b250c83SBarry Smith M*/ 1479b250c83SBarry Smith 1489b250c83SBarry Smith /*MC 1499b250c83SBarry Smith NORM_2 - the two norm, ||v|| = sqrt(sum_i (v_i)^2) (vectors only) 1509b250c83SBarry Smith 1519b250c83SBarry Smith Level: beginner 1529b250c83SBarry Smith 1539b250c83SBarry Smith .seealso: NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_FROBENIUS, 1549b250c83SBarry Smith NORM_INFINITY, NORM_1_AND_2 1559b250c83SBarry Smith 1569b250c83SBarry Smith M*/ 1579b250c83SBarry Smith 1589b250c83SBarry Smith /*MC 1599b250c83SBarry Smith NORM_FROBENIUS - ||A|| = sqrt(sum_ij (A_ij)^2), same as NORM_2 for vectors 1609b250c83SBarry Smith 1619b250c83SBarry Smith Level: beginner 1629b250c83SBarry Smith 1639b250c83SBarry Smith .seealso: NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2, 1649b250c83SBarry Smith NORM_INFINITY, NORM_1_AND_2 1659b250c83SBarry Smith 1669b250c83SBarry Smith M*/ 1679b250c83SBarry Smith 1689b250c83SBarry Smith /*MC 1699b250c83SBarry Smith NORM_INFINITY - ||v|| = max_i |v_i|. ||A|| = max_i || v_i* ||, maximum row sum 1709b250c83SBarry Smith 1719b250c83SBarry Smith Level: beginner 1729b250c83SBarry Smith 1739b250c83SBarry Smith .seealso: NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2, 1749b250c83SBarry Smith NORM_FROBINIUS, NORM_1_AND_2 1759b250c83SBarry Smith 1769b250c83SBarry Smith M*/ 1779b250c83SBarry Smith 1789b250c83SBarry Smith /*MC 1799b250c83SBarry Smith NORM_1_AND_2 - computes both the 1 and 2 norm of a vector 1809b250c83SBarry Smith 1819b250c83SBarry Smith Level: beginner 1829b250c83SBarry Smith 1839b250c83SBarry Smith .seealso: NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2, 1849b250c83SBarry Smith NORM_FROBINIUS, NORM_INFINITY 1859b250c83SBarry Smith 1869b250c83SBarry Smith M*/ 1879b250c83SBarry Smith 1889b250c83SBarry Smith /*MC 1899b250c83SBarry Smith NORM_MAX - see NORM_INFINITY 1909b250c83SBarry Smith 191d41222bbSBarry Smith Level: beginner 192d41222bbSBarry Smith 1939b250c83SBarry Smith M*/ 1949b250c83SBarry Smith 195dfbe8321SBarry Smith EXTERN PetscErrorCode VecNorm(Vec,NormType,PetscReal *); 19632dcc486SBarry Smith EXTERN PetscErrorCode VecNormComposedDataID(NormType,PetscInt*); 197dfbe8321SBarry Smith EXTERN PetscErrorCode VecNormalize(Vec,PetscReal *); 198dfbe8321SBarry Smith EXTERN PetscErrorCode VecSum(Vec,PetscScalar*); 19932dcc486SBarry Smith EXTERN PetscErrorCode VecMax(Vec,PetscInt*,PetscReal *); 20032dcc486SBarry Smith EXTERN PetscErrorCode VecMin(Vec,PetscInt*,PetscReal *); 201dfbe8321SBarry Smith EXTERN PetscErrorCode VecScale(const PetscScalar *a,Vec v); 202dfbe8321SBarry Smith EXTERN PetscErrorCode VecCopy(Vec,Vec); 203dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetRandom(PetscRandom,Vec); 204dfbe8321SBarry Smith EXTERN PetscErrorCode VecSet(const PetscScalar*,Vec); 205dfbe8321SBarry Smith EXTERN PetscErrorCode VecSwap(Vec,Vec); 206dfbe8321SBarry Smith EXTERN PetscErrorCode VecAXPY(const PetscScalar*,Vec,Vec); 207dfbe8321SBarry Smith EXTERN PetscErrorCode VecAXPBY(const PetscScalar*,const PetscScalar *,Vec,Vec); 20832dcc486SBarry Smith EXTERN PetscErrorCode VecMAXPY(PetscInt,const PetscScalar*,Vec,Vec*); 209dfbe8321SBarry Smith EXTERN PetscErrorCode VecAYPX(const PetscScalar*,Vec,Vec); 210dfbe8321SBarry Smith EXTERN PetscErrorCode VecWAXPY(const PetscScalar*,Vec,Vec,Vec); 211dfbe8321SBarry Smith EXTERN PetscErrorCode VecPointwiseMult(Vec,Vec,Vec); 212dfbe8321SBarry Smith EXTERN PetscErrorCode VecPointwiseDivide(Vec,Vec,Vec); 213dfbe8321SBarry Smith EXTERN PetscErrorCode VecMaxPointwiseDivide(Vec,Vec,PetscReal*); 214dfbe8321SBarry Smith EXTERN PetscErrorCode VecShift(const PetscScalar*,Vec); 215dfbe8321SBarry Smith EXTERN PetscErrorCode VecReciprocal(Vec); 216dfbe8321SBarry Smith EXTERN PetscErrorCode VecPermute(Vec, IS, PetscTruth); 217dfbe8321SBarry Smith EXTERN PetscErrorCode VecSqrt(Vec); 218dfbe8321SBarry Smith EXTERN PetscErrorCode VecAbs(Vec); 219dfbe8321SBarry Smith EXTERN PetscErrorCode VecDuplicate(Vec,Vec*); 22032dcc486SBarry Smith EXTERN PetscErrorCode VecDuplicateVecs(Vec,PetscInt,Vec*[]); 2214bf112e7SSatish Balay EXTERN PetscErrorCode VecDestroyVecs(Vec[],PetscInt); 222dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetPetscMap(Vec,PetscMap*); 2232eac72dbSBarry Smith 224dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideNormAll(Vec,NormType,PetscReal*); 22532dcc486SBarry Smith EXTERN PetscErrorCode VecStrideMaxAll(Vec,PetscInt *,PetscReal *); 22632dcc486SBarry Smith EXTERN PetscErrorCode VecStrideMinAll(Vec,PetscInt *,PetscReal *); 227dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideScaleAll(Vec,PetscScalar*); 2284a560884SBarry Smith 22932dcc486SBarry Smith EXTERN PetscErrorCode VecStrideNorm(Vec,PetscInt,NormType,PetscReal*); 23032dcc486SBarry Smith EXTERN PetscErrorCode VecStrideMax(Vec,PetscInt,PetscInt *,PetscReal *); 23132dcc486SBarry Smith EXTERN PetscErrorCode VecStrideMin(Vec,PetscInt,PetscInt *,PetscReal *); 23232dcc486SBarry Smith EXTERN PetscErrorCode VecStrideScale(Vec,PetscInt,PetscScalar*); 23332dcc486SBarry Smith EXTERN PetscErrorCode VecStrideGather(Vec,PetscInt,Vec,InsertMode); 23432dcc486SBarry Smith EXTERN PetscErrorCode VecStrideScatter(Vec,PetscInt,Vec,InsertMode); 235dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideGatherAll(Vec,Vec*,InsertMode); 236dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideScatterAll(Vec*,Vec,InsertMode); 237d2655a18SBarry Smith 23832dcc486SBarry Smith EXTERN PetscErrorCode VecSetValues(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 239dfbe8321SBarry Smith EXTERN PetscErrorCode VecAssemblyBegin(Vec); 240dfbe8321SBarry Smith EXTERN PetscErrorCode VecAssemblyEnd(Vec); 24132dcc486SBarry Smith EXTERN PetscErrorCode VecStashSetInitialSize(Vec,PetscInt,PetscInt); 242dfbe8321SBarry Smith EXTERN PetscErrorCode VecStashView(Vec,PetscViewer); 24332dcc486SBarry Smith EXTERN PetscErrorCode VecStashGetInfo(Vec,PetscInt*,PetscInt*,PetscInt*,PetscInt*); 24462dc5420SSatish Balay 24532dcc486SBarry Smith extern PetscInt VecSetValue_Row; 2461d73ed98SBarry Smith extern PetscScalar VecSetValue_Value; 24730de9b25SBarry Smith /*MC 24830de9b25SBarry Smith VecSetValue - Set a single entry into a vector. 24930de9b25SBarry Smith 25030de9b25SBarry Smith Synopsis: 251*d360dc6fSBarry Smith PetscErrorCode VecSetValue(Vec v,int row,PetscScalar value, InsertMode mode); 25230de9b25SBarry Smith 25330de9b25SBarry Smith Not Collective 25430de9b25SBarry Smith 25530de9b25SBarry Smith Input Parameters: 25630de9b25SBarry Smith + v - the vector 25730de9b25SBarry Smith . row - the row location of the entry 25830de9b25SBarry Smith . value - the value to insert 25930de9b25SBarry Smith - mode - either INSERT_VALUES or ADD_VALUES 26030de9b25SBarry Smith 26130de9b25SBarry Smith Notes: 26230de9b25SBarry Smith For efficiency one should use VecSetValues() and set several or 26330de9b25SBarry Smith many values simultaneously if possible. 26430de9b25SBarry Smith 2651d73ed98SBarry Smith These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd() 2661d73ed98SBarry Smith MUST be called after all calls to VecSetValues() have been completed. 2671d73ed98SBarry Smith 2681d73ed98SBarry Smith VecSetValues() uses 0-based indices in Fortran as well as in C. 2691d73ed98SBarry Smith 2701d73ed98SBarry Smith Level: beginner 2711d73ed98SBarry Smith 2721d73ed98SBarry Smith .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValueLocal() 2731d73ed98SBarry Smith M*/ 2741d73ed98SBarry Smith #define VecSetValue(v,i,va,mode) (VecSetValue_Row = i, VecSetValue_Value = va, VecSetValues(v,1,&VecSetValue_Row,&VecSetValue_Value,mode)) 2751d73ed98SBarry Smith 2761d73ed98SBarry Smith /*MC 2771d73ed98SBarry Smith VecSetValueLocal - Set a single entry into a vector using the local numbering 2781d73ed98SBarry Smith 2791d73ed98SBarry Smith Synopsis: 280*d360dc6fSBarry Smith PetscErrorCode VecSetValueLocal(Vec v,int row,PetscScalar value, InsertMode mode); 2811d73ed98SBarry Smith 2821d73ed98SBarry Smith Not Collective 2831d73ed98SBarry Smith 2841d73ed98SBarry Smith Input Parameters: 2851d73ed98SBarry Smith + v - the vector 2861d73ed98SBarry Smith . row - the row location of the entry 2871d73ed98SBarry Smith . value - the value to insert 2881d73ed98SBarry Smith - mode - either INSERT_VALUES or ADD_VALUES 2891d73ed98SBarry Smith 2901d73ed98SBarry Smith Notes: 2911d73ed98SBarry Smith For efficiency one should use VecSetValues() and set several or 2921d73ed98SBarry Smith many values simultaneously if possible. 29330de9b25SBarry Smith 29430de9b25SBarry Smith These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd() 29530de9b25SBarry Smith MUST be called after all calls to VecSetValues() have been completed. 29630de9b25SBarry Smith 29730de9b25SBarry Smith VecSetValues() uses 0-based indices in Fortran as well as in C. 29830de9b25SBarry Smith 29930de9b25SBarry Smith Level: beginner 30030de9b25SBarry Smith 3011d73ed98SBarry Smith .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValue() 30230de9b25SBarry Smith M*/ 3031d73ed98SBarry Smith #define VecSetValueLocal(v,i,va,mode) (VecSetValue_Row = i,VecSetValue_Value = va,VecSetValuesLocal(v,1,&VecSetValue_Row,&VecSetValue_Value,mode)) 30430de9b25SBarry Smith 30532dcc486SBarry Smith EXTERN PetscErrorCode VecSetBlockSize(Vec,PetscInt); 30632dcc486SBarry Smith EXTERN PetscErrorCode VecGetBlockSize(Vec,PetscInt*); 30732dcc486SBarry Smith EXTERN PetscErrorCode VecSetValuesBlocked(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 3088ed539a5SBarry Smith 309fd487807SMatthew Knepley /* Dynamic creation and loading functions */ 310fd487807SMatthew Knepley extern PetscFList VecList; 311d772e1d7SMatthew Knepley extern PetscTruth VecRegisterAllCalled; 312dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetType(Vec, const VecType); 313dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetType(Vec, VecType *); 3146849ba73SBarry Smith EXTERN PetscErrorCode VecRegister(const char[],const char[],const char[],PetscErrorCode (*)(Vec)); 315dfbe8321SBarry Smith EXTERN PetscErrorCode VecRegisterAll(const char []); 316dfbe8321SBarry Smith EXTERN PetscErrorCode VecRegisterDestroy(void); 31730de9b25SBarry Smith 31830de9b25SBarry Smith /*MC 31930de9b25SBarry Smith VecRegisterDynamic - Adds a new vector component implementation 32030de9b25SBarry Smith 32130de9b25SBarry Smith Synopsis: 322*d360dc6fSBarry Smith PetscErrorCode VecRegisterDynamic(char *name, char *path, char *func_name, PetscErrorCode (*create_func)(Vec)) 32330de9b25SBarry Smith 32430de9b25SBarry Smith Not Collective 32530de9b25SBarry Smith 32630de9b25SBarry Smith Input Parameters: 32730de9b25SBarry Smith + name - The name of a new user-defined creation routine 32830de9b25SBarry Smith . path - The path (either absolute or relative) of the library containing this routine 32930de9b25SBarry Smith . func_name - The name of routine to create method context 33030de9b25SBarry Smith - create_func - The creation routine itself 33130de9b25SBarry Smith 33230de9b25SBarry Smith Notes: 33330de9b25SBarry Smith VecRegisterDynamic() may be called multiple times to add several user-defined vectors 33430de9b25SBarry Smith 33530de9b25SBarry Smith If dynamic libraries are used, then the fourth input argument (routine_create) is ignored. 33630de9b25SBarry Smith 33730de9b25SBarry Smith Sample usage: 33830de9b25SBarry Smith .vb 33930de9b25SBarry Smith VecRegisterDynamic("my_vec","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyVectorCreate", MyVectorCreate); 34030de9b25SBarry Smith .ve 34130de9b25SBarry Smith 34230de9b25SBarry Smith Then, your vector type can be chosen with the procedural interface via 34330de9b25SBarry Smith .vb 34430de9b25SBarry Smith VecCreate(MPI_Comm, Vec *); 34530de9b25SBarry Smith VecSetType(Vec,"my_vector_name"); 34630de9b25SBarry Smith .ve 34730de9b25SBarry Smith or at runtime via the option 34830de9b25SBarry Smith .vb 34930de9b25SBarry Smith -vec_type my_vector_name 35030de9b25SBarry Smith .ve 35130de9b25SBarry Smith 35230de9b25SBarry Smith Notes: $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values. 35330de9b25SBarry Smith If your function is not being put into a shared library then use VecRegister() instead 35430de9b25SBarry Smith 35530de9b25SBarry Smith Level: advanced 35630de9b25SBarry Smith 35730de9b25SBarry Smith .keywords: Vec, register 35830de9b25SBarry Smith .seealso: VecRegisterAll(), VecRegisterDestroy(), VecRegister() 35930de9b25SBarry Smith M*/ 360aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 361f1af5d2fSBarry Smith #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,0) 36288d459dfSBarry Smith #else 363f1af5d2fSBarry Smith #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,d) 36488d459dfSBarry Smith #endif 36588d459dfSBarry Smith 36609321671SBarry Smith 367dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterCreate(Vec,IS,Vec,IS,VecScatter *); 368dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterPostRecvs(Vec,Vec,InsertMode,ScatterMode,VecScatter); 369dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterBegin(Vec,Vec,InsertMode,ScatterMode,VecScatter); 370dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterEnd(Vec,Vec,InsertMode,ScatterMode,VecScatter); 371dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterDestroy(VecScatter); 372dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterCopy(VecScatter,VecScatter *); 373dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterView(VecScatter,PetscViewer); 37432dcc486SBarry Smith EXTERN PetscErrorCode VecScatterRemap(VecScatter,PetscInt *,PetscInt*); 3752195c698SBarry Smith 376cb5b572fSBarry Smith typedef enum {PIPELINE_DOWN=0,PIPELINE_UP=1} PipelineDirection; 377cb5b572fSBarry Smith typedef enum {PIPELINE_NONE=1,PIPELINE_SEQUENTIAL=2, 3788ea6152fSSatish Balay PIPELINE_REDBLACK=3,PIPELINE_MULTICOLOR=4} PipelineType; 379cb5b572fSBarry Smith 380cb5b572fSBarry Smith typedef struct _p_VecPipeline* VecPipeline; 381cb5b572fSBarry Smith 382dfbe8321SBarry Smith EXTERN PetscErrorCode VecPipelineCreate(MPI_Comm,Vec,IS,Vec,IS,VecPipeline *); 383dfbe8321SBarry Smith EXTERN PetscErrorCode VecPipelineSetType(VecPipeline,PipelineType,PetscObject); 384dfbe8321SBarry Smith EXTERN PetscErrorCode VecPipelineSetup(VecPipeline); 385dfbe8321SBarry Smith EXTERN PetscErrorCode VecPipelineBegin(Vec,Vec,InsertMode,ScatterMode,PipelineDirection,VecPipeline); 386dfbe8321SBarry Smith EXTERN PetscErrorCode VecPipelineEnd(Vec,Vec,InsertMode,ScatterMode,PipelineDirection,VecPipeline); 387dfbe8321SBarry Smith EXTERN PetscErrorCode VecPipelineView(VecPipeline,PetscViewer); 388dfbe8321SBarry Smith EXTERN PetscErrorCode VecPipelineDestroy(VecPipeline); 389cb5b572fSBarry Smith 390dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetArray_Private(Vec,PetscScalar*[]); 391dfbe8321SBarry Smith EXTERN PetscErrorCode VecRestoreArray_Private(Vec,PetscScalar*[]); 39232dcc486SBarry Smith EXTERN PetscErrorCode VecGetArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]); 39332dcc486SBarry Smith EXTERN PetscErrorCode VecRestoreArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]); 39432dcc486SBarry Smith EXTERN PetscErrorCode VecGetArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]); 39532dcc486SBarry Smith EXTERN PetscErrorCode VecRestoreArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]); 39632dcc486SBarry Smith EXTERN PetscErrorCode VecGetArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]); 39732dcc486SBarry Smith EXTERN PetscErrorCode VecRestoreArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]); 39832dcc486SBarry Smith EXTERN PetscErrorCode VecGetArray1d(Vec,PetscInt,PetscInt,PetscScalar *[]); 39932dcc486SBarry Smith EXTERN PetscErrorCode VecRestoreArray1d(Vec,PetscInt,PetscInt,PetscScalar *[]); 400ab360428SBarry Smith 401dfbe8321SBarry Smith EXTERN PetscErrorCode VecPlaceArray(Vec,const PetscScalar[]); 402dfbe8321SBarry Smith EXTERN PetscErrorCode VecResetArray(Vec); 403dfbe8321SBarry Smith EXTERN PetscErrorCode VecReplaceArray(Vec,const PetscScalar[]); 40432dcc486SBarry Smith EXTERN PetscErrorCode VecGetArrays(const Vec[],PetscInt,PetscScalar**[]); 40532dcc486SBarry Smith EXTERN PetscErrorCode VecRestoreArrays(const Vec[],PetscInt,PetscScalar**[]); 40684cb2905SBarry Smith 407dfbe8321SBarry Smith EXTERN PetscErrorCode VecValid(Vec,PetscTruth*); 408dfbe8321SBarry Smith EXTERN PetscErrorCode VecView(Vec,PetscViewer); 409dfbe8321SBarry Smith EXTERN PetscErrorCode VecViewFromOptions(Vec, char *); 410dfbe8321SBarry Smith EXTERN PetscErrorCode VecEqual(Vec,Vec,PetscTruth*); 411dfbe8321SBarry Smith EXTERN PetscErrorCode VecLoad(PetscViewer,const VecType,Vec*); 412dfbe8321SBarry Smith EXTERN PetscErrorCode VecLoadIntoVector(PetscViewer,Vec); 4138ed539a5SBarry Smith 41432dcc486SBarry Smith EXTERN PetscErrorCode VecGetSize(Vec,PetscInt*); 41532dcc486SBarry Smith EXTERN PetscErrorCode VecGetLocalSize(Vec,PetscInt*); 41632dcc486SBarry Smith EXTERN PetscErrorCode VecGetOwnershipRange(Vec,PetscInt*,PetscInt*); 4178ed539a5SBarry Smith 418dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping); 41932dcc486SBarry Smith EXTERN PetscErrorCode VecSetValuesLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 420dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping); 42132dcc486SBarry Smith EXTERN PetscErrorCode VecSetValuesBlockedLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 42290f02eecSBarry Smith 423dfbe8321SBarry Smith EXTERN PetscErrorCode VecDotBegin(Vec,Vec,PetscScalar *); 424dfbe8321SBarry Smith EXTERN PetscErrorCode VecDotEnd(Vec,Vec,PetscScalar *); 425dfbe8321SBarry Smith EXTERN PetscErrorCode VecTDotBegin(Vec,Vec,PetscScalar *); 426dfbe8321SBarry Smith EXTERN PetscErrorCode VecTDotEnd(Vec,Vec,PetscScalar *); 427dfbe8321SBarry Smith EXTERN PetscErrorCode VecNormBegin(Vec,NormType,PetscReal *); 428dfbe8321SBarry Smith EXTERN PetscErrorCode VecNormEnd(Vec,NormType,PetscReal *); 429d3c178dbSBarry Smith 430fdbc4c26SBarry Smith typedef enum {VEC_IGNORE_OFF_PROC_ENTRIES,VEC_TREAT_OFF_PROC_ENTRIES} VecOption; 431dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetOption(Vec,VecOption); 43290f02eecSBarry Smith 433ebe3b25bSBarry Smith /* 434ebe3b25bSBarry Smith Expose VecGetArray()/VecRestoreArray() to users. Allows this to work without any function 435ebe3b25bSBarry Smith call overhead on any 'native' Vecs. 436ebe3b25bSBarry Smith */ 4373c94ec11SBarry Smith #include "vecimpl.h" 438ebe3b25bSBarry Smith 439dfbe8321SBarry Smith EXTERN PetscErrorCode VecContourScale(Vec,PetscReal,PetscReal); 440522c5e43SBarry Smith 44115091d37SBarry Smith /* 44215091d37SBarry Smith These numbers need to match the entries in 4433c94ec11SBarry Smith the function table in vecimpl.h 44415091d37SBarry Smith */ 445b1bcba4aSBarry Smith typedef enum { VECOP_VIEW = 32, 446b1bcba4aSBarry Smith VECOP_LOADINTOVECTOR = 38 44715091d37SBarry Smith } VecOperation; 448dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetOperation(Vec,VecOperation,void(*)(void)); 449b19c1e4cSBarry Smith 450e182c471SBarry Smith /* 451e182c471SBarry Smith Routines for dealing with ghosted vectors: 452e182c471SBarry Smith vectors with ghost elements at the end of the array. 453e182c471SBarry Smith */ 45432dcc486SBarry Smith EXTERN PetscErrorCode VecCreateGhost(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*); 45532dcc486SBarry Smith EXTERN PetscErrorCode VecCreateGhostWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*); 45632dcc486SBarry Smith EXTERN PetscErrorCode VecCreateGhostBlock(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*); 45732dcc486SBarry Smith EXTERN PetscErrorCode VecCreateGhostBlockWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*); 458dfbe8321SBarry Smith EXTERN PetscErrorCode VecGhostGetLocalForm(Vec,Vec*); 459dfbe8321SBarry Smith EXTERN PetscErrorCode VecGhostRestoreLocalForm(Vec,Vec*); 460dfbe8321SBarry Smith EXTERN PetscErrorCode VecGhostUpdateBegin(Vec,InsertMode,ScatterMode); 461dfbe8321SBarry Smith EXTERN PetscErrorCode VecGhostUpdateEnd(Vec,InsertMode,ScatterMode); 462e182c471SBarry Smith 463dfbe8321SBarry Smith EXTERN PetscErrorCode VecConjugate(Vec); 46434233285SBarry Smith 465dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterCreateToAll(Vec,VecScatter*,Vec*); 466dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterCreateToZero(Vec,VecScatter*,Vec*); 467bba1ac68SSatish Balay 468dfbe8321SBarry Smith EXTERN PetscErrorCode PetscViewerMathematicaGetVector(PetscViewer, Vec); 469dfbe8321SBarry Smith EXTERN PetscErrorCode PetscViewerMathematicaPutVector(PetscViewer, Vec); 4707dbadf16SMatthew Knepley 471d59c15a7SBarry Smith /*S 472d59c15a7SBarry Smith Vecs - Collection of vectors where the data for the vectors is stored in 473d59c15a7SBarry Smith one continquous memory 474d59c15a7SBarry Smith 475d59c15a7SBarry Smith Level: advanced 476d59c15a7SBarry Smith 477d59c15a7SBarry Smith Notes: 478d59c15a7SBarry Smith Temporary construct for handling multiply right hand side solves 479d59c15a7SBarry Smith 480d59c15a7SBarry Smith This is faked by storing a single vector that has enough array space for 481d59c15a7SBarry Smith n vectors 482d59c15a7SBarry Smith 483d59c15a7SBarry Smith Concepts: parallel decomposition 484d59c15a7SBarry Smith 485d59c15a7SBarry Smith S*/ 48632dcc486SBarry Smith struct _p_Vecs {PetscInt n; Vec v;}; 487d59c15a7SBarry Smith typedef struct _p_Vecs* Vecs; 488d59c15a7SBarry Smith #define VecsDestroy(x) (VecDestroy((x)->v) || PetscFree(x)) 489d59c15a7SBarry Smith #define VecsCreateSeq(comm,p,m,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeq(comm,p*m,&(*(x))->v) || (-1 == ((*(x))->n = (m)))) 490d59c15a7SBarry Smith #define VecsCreateSeqWithArray(comm,p,m,a,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeqWithArray(comm,p*m,a,&(*(x))->v) || (-1 == ((*(x))->n = (m)))) 491d59c15a7SBarry Smith #define VecsDuplicate(x,y) (PetscNew(struct _p_Vecs,y) || VecDuplicate(x->v,&(*(y))->v) || (-1 == ((*(y))->n = (x)->n))) 492e9fa29b7SSatish Balay 493e9fa29b7SSatish Balay 494e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END 4952eac72dbSBarry Smith #endif 496