Actual source code: vecreg.c
1: #define PETSCVEC_DLL
3: #include vecimpl.h
5: PetscFList VecList = PETSC_NULL;
6: PetscTruth VecRegisterAllCalled = PETSC_FALSE;
10: /*@C
11: VecSetType - Builds a vector, for a particular vector implementation.
13: Collective on Vec
15: Input Parameters:
16: + vec - The vector object
17: - method - The name of the vector type
19: Options Database Key:
20: . -vec_type <type> - Sets the vector type; use -help for a list
21: of available types
23: Notes:
24: See "petsc/include/vec.h" for available vector types (for instance, VECSEQ, VECMPI, or VECSHARED).
26: Use VecDuplicate() or VecDuplicateVecs() to form additional vectors of the same type as an existing vector.
28: Level: intermediate
30: .keywords: vector, set, type
31: .seealso: VecGetType(), VecCreate()
32: @*/
33: PetscErrorCode PETSCVEC_DLLEXPORT VecSetType(Vec vec, VecType method)
34: {
35: PetscErrorCode (*r)(Vec);
36: PetscTruth match;
41: PetscTypeCompare((PetscObject) vec, method, &match);
42: if (match) return(0);
44: if (vec->n < 0 && vec->N < 0) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call VecSetSizes() first");
46: /* Get the function pointers for the vector requested */
47: if (!VecRegisterAllCalled) {
48: VecRegisterAll(PETSC_NULL);
49: }
50: PetscFListFind(vec->comm, VecList, method,(void (**)(void)) &r);
51: if (!r) SETERRQ1(PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown vector type: %s", method);
53: if (vec->ops->destroy) {
54: (*vec->ops->destroy)(vec);
55: }
56: (*r)(vec);
58: PetscObjectChangeTypeName((PetscObject) vec, method);
59: return(0);
60: }
64: /*@C
65: VecGetType - Gets the vector type name (as a string) from the Vec.
67: Not Collective
69: Input Parameter:
70: . vec - The vector
72: Output Parameter:
73: . type - The vector type name
75: Level: intermediate
77: .keywords: vector, get, type, name
78: .seealso: VecSetType(), VecCreate()
79: @*/
80: PetscErrorCode PETSCVEC_DLLEXPORT VecGetType(Vec vec, VecType *type)
81: {
87: if (!VecRegisterAllCalled) {
88: VecRegisterAll(PETSC_NULL);
89: }
90: *type = vec->type_name;
91: return(0);
92: }
95: /*--------------------------------------------------------------------------------------------------------------------*/
99: /*@C
100: VecRegister - See VecRegisterDynamic()
102: Level: advanced
103: @*/
104: PetscErrorCode PETSCVEC_DLLEXPORT VecRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(Vec))
105: {
106: char fullname[PETSC_MAX_PATH_LEN];
110: PetscStrcpy(fullname, path);
111: PetscStrcat(fullname, ":");
112: PetscStrcat(fullname, name);
113: PetscFListAdd(&VecList, sname, fullname, (void (*)(void)) function);
114: return(0);
115: }
118: /*--------------------------------------------------------------------------------------------------------------------*/
121: /*@C
122: VecRegisterDestroy - Frees the list of Vec methods that were registered by VecRegister()/VecRegisterDynamic().
124: Not Collective
126: Level: advanced
128: .keywords: Vec, register, destroy
129: .seealso: VecRegister(), VecRegisterAll(), VecRegisterDynamic()
130: @*/
131: PetscErrorCode PETSCVEC_DLLEXPORT VecRegisterDestroy(void)
132: {
136: if (VecList) {
137: PetscFListDestroy(&VecList);
138: VecList = PETSC_NULL;
139: }
140: VecRegisterAllCalled = PETSC_FALSE;
141: return(0);
142: }