Actual source code: veccreate.c
1: #include <petsc/private/vecimpl.h>
2: #include <../src/vec/vec/impls/mpi/pvecimpl.h>
4: static PetscErrorCode VecCreate_Common_Private(Vec v)
5: {
6: PetscFunctionBegin;
7: v->array_gotten = PETSC_FALSE;
8: v->petscnative = PETSC_FALSE;
9: v->offloadmask = PETSC_OFFLOAD_UNALLOCATED;
10: #if defined(PETSC_HAVE_VIENNACL) || defined(PETSC_HAVE_CUDA) || defined(PETSC_HAVE_HIP)
11: v->minimum_bytes_pinned_memory = 0;
12: v->pinned_memory = PETSC_FALSE;
13: #endif
14: #if defined(PETSC_HAVE_DEVICE)
15: v->boundtocpu = PETSC_TRUE;
16: #endif
17: PetscCall(PetscStrallocpy(PETSCRANDER48, &v->defaultrandtype));
18: PetscFunctionReturn(PETSC_SUCCESS);
19: }
21: /*@
22: VecCreate - Creates an empty vector object. The type can then be set with `VecSetType()`,
23: or `VecSetFromOptions().`
25: Collective
27: Input Parameter:
28: . comm - The communicator for the vector object
30: Output Parameter:
31: . vec - The vector object
33: Level: beginner
35: Notes:
36: If you never call `VecSetType()` or `VecSetFromOptions()` it will generate an
37: error when you try to use the vector.
39: .seealso: [](ch_vectors), `Vec`, `VecSetType()`, `VecSetSizes()`, `VecCreateMPIWithArray()`, `VecCreateMPI()`, `VecDuplicate()`,
40: `VecDuplicateVecs()`, `VecCreateGhost()`, `VecCreateSeq()`, `VecPlaceArray()`
41: @*/
42: PetscErrorCode VecCreate(MPI_Comm comm, Vec *vec)
43: {
44: Vec v;
46: PetscFunctionBegin;
47: PetscAssertPointer(vec, 2);
48: PetscCall(VecInitializePackage());
50: PetscCall(PetscHeaderCreate(v, VEC_CLASSID, "Vec", "Vector", "Vec", comm, VecDestroy, VecView));
51: PetscCall(PetscLayoutCreate(comm, &v->map));
52: PetscCall(VecCreate_Common_Private(v));
53: *vec = v;
54: PetscFunctionReturn(PETSC_SUCCESS);
55: }
57: /*@
58: VecCreateFromOptions - Creates a vector whose type is set from the options database
60: Collective
62: Input Parameters:
63: + comm - The communicator for the vector object
64: . prefix - [optional] prefix for the options database
65: . bs - the block size (commonly 1)
66: . m - the local size (or `PETSC_DECIDE`)
67: - n - the global size (or `PETSC_DETERMINE`)
69: Output Parameter:
70: . vec - The vector object
72: Options Database Keys:
73: . -vec_type - see `VecType`, for example `seq`, `mpi`, `cuda`, defaults to `mpi`
75: Level: beginner
77: .seealso: [](ch_vectors), `Vec`, `VecSetType()`, `VecSetSizes()`, `VecCreateMPIWithArray()`, `VecCreateMPI()`, `VecDuplicate()`,
78: `VecDuplicateVecs()`, `VecCreateGhost()`, `VecCreateSeq()`, `VecPlaceArray()`, `VecCreate()`, `VecType`
79: @*/
80: PetscErrorCode VecCreateFromOptions(MPI_Comm comm, const char *prefix, PetscInt bs, PetscInt m, PetscInt n, Vec *vec)
81: {
82: PetscFunctionBegin;
83: PetscAssertPointer(vec, 6);
84: PetscCall(VecCreate(comm, vec));
85: if (prefix) PetscCall(VecSetOptionsPrefix(*vec, prefix));
86: PetscCall(VecSetBlockSize(*vec, bs));
87: PetscCall(VecSetSizes(*vec, m, n));
88: PetscCall(VecSetFromOptions(*vec));
89: PetscFunctionReturn(PETSC_SUCCESS);
90: }
92: /* Create a vector with the given layout. The reference count of the input layout will be increased by 1 */
93: PetscErrorCode VecCreateWithLayout_Private(PetscLayout map, Vec *vec)
94: {
95: Vec v;
97: PetscFunctionBegin;
98: PetscAssertPointer(vec, 2);
99: *vec = NULL;
100: PetscCall(VecInitializePackage());
101: PetscCall(PetscHeaderCreate(v, VEC_CLASSID, "Vec", "Vector", "Vec", map->comm, VecDestroy, VecView));
102: v->map = map;
103: map->refcnt++;
104: PetscCall(VecCreate_Common_Private(v));
105: v->bstash.bs = map->bs;
106: *vec = v;
107: PetscFunctionReturn(PETSC_SUCCESS);
108: }