Actual source code: prefix.c
1: /*
2: Provides utility routines for manulating any type of PETSc object.
3: */
4: #include <petsc/private/petscimpl.h>
6: /*@
7: PetscObjectGetOptions - Gets the options database used by the object that has been set with `PetscObjectSetOptions()`
9: Collective
11: Input Parameter:
12: . obj - any PETSc object, for example a `Vec`, `Mat` or `KSP`.
14: Output Parameter:
15: . options - the options database
17: Level: advanced
19: Note:
20: If this is not called the object will use the default options database
22: Developer Notes:
23: This functionality is not used in PETSc and should, perhaps, be removed
25: .seealso: `PetscOptionsCreate()`, `PetscOptionsDestroy()`, `PetscObjectSetOptionsPrefix()`, `PetscObjectAppendOptionsPrefix()`, `PetscObjectPrependOptionsPrefix()`,
26: `PetscObjectGetOptionsPrefix()`, `PetscObjectSetOptions()`
27: @*/
28: PetscErrorCode PetscObjectGetOptions(PetscObject obj, PetscOptions *options)
29: {
30: PetscFunctionBegin;
32: *options = obj->options;
33: PetscFunctionReturn(PETSC_SUCCESS);
34: }
36: /*@
37: PetscObjectSetOptions - Sets the options database used by the object. Call immediately after creating the object.
39: Collective
41: Input Parameters:
42: + obj - any PETSc object, for example a `Vec`, `Mat` or `KSP`.
43: - options - the options database, use NULL for default
45: Level: advanced
47: Note:
48: If this is not called the object will use the default options database
50: Developer Notes:
51: This functionality is not used in PETSc and should, perhaps, be removed
53: .seealso: `PetscOptionsCreate()`, `PetscOptionsDestroy()`, `PetscObjectSetOptionsPrefix()`, `PetscObjectAppendOptionsPrefix()`, `PetscObjectPrependOptionsPrefix()`,
54: `PetscObjectGetOptionsPrefix()`, `PetscObjectGetOptions()`
55: @*/
56: PetscErrorCode PetscObjectSetOptions(PetscObject obj, PetscOptions options)
57: {
58: PetscFunctionBegin;
60: obj->options = options;
61: PetscFunctionReturn(PETSC_SUCCESS);
62: }
64: /*@
65: PetscObjectSetOptionsPrefix - Sets the prefix used for searching for all
66: options for the given object in the database.
68: Collective
70: Input Parameters:
71: + obj - any PETSc object, for example a `Vec`, `Mat` or `KSP`.
72: - prefix - the prefix string to prepend to option requests of the object.
74: Level: advanced
76: Note:
77: A hyphen (-) must NOT be given at the beginning of the prefix name.
78: The first character of all runtime options is AUTOMATICALLY the
79: hyphen.
81: .seealso: `PetscOptionsCreate()`, `PetscOptionsDestroy()`, `PetscObjectAppendOptionsPrefix()`, `PetscObjectPrependOptionsPrefix()`,
82: `PetscObjectGetOptionsPrefix()`, `TSSetOptionsPrefix()`, `SNESSetOptionsPrefix()`, `KSPSetOptionsPrefix()`
83: @*/
84: PetscErrorCode PetscObjectSetOptionsPrefix(PetscObject obj, const char prefix[])
85: {
86: PetscFunctionBegin;
88: if (prefix) {
89: PetscAssertPointer(prefix, 2);
90: PetscCheck(prefix[0] != '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Options prefix should not begin with a hyphen");
91: if (prefix != obj->prefix) {
92: size_t len;
94: PetscCall(PetscFree(obj->prefix));
95: PetscCall(PetscStrlen(prefix, &len));
96: if (len) PetscCall(PetscStrallocpy(prefix, &obj->prefix));
97: }
98: } else PetscCall(PetscFree(obj->prefix));
99: PetscFunctionReturn(PETSC_SUCCESS);
100: }
102: /*@
103: PetscObjectAppendOptionsPrefix - Appends to the prefix used for searching for options for the given object in the database.
105: Input Parameters:
106: + obj - any PETSc object, for example a `Vec`, `Mat` or `KSP`.
107: - prefix - the prefix string to prepend to option requests of the object.
109: Level: advanced
111: Note:
112: A hyphen (-) must NOT be given at the beginning of the prefix name.
113: The first character of all runtime options is AUTOMATICALLY the
114: hyphen.
116: .seealso: `PetscOptionsCreate()`, `PetscOptionsDestroy()`, `PetscObjectSetOptionsPrefix()`, `PetscObjectPrependOptionsPrefix()`,
117: `PetscObjectGetOptionsPrefix()`, `TSAppendOptionsPrefix()`, `SNESAppendOptionsPrefix()`, `KSPAppendOptionsPrefix()`
118: @*/
119: PetscErrorCode PetscObjectAppendOptionsPrefix(PetscObject obj, const char prefix[])
120: {
121: size_t len1, len2, new_len;
123: PetscFunctionBegin;
125: if (!prefix) PetscFunctionReturn(PETSC_SUCCESS);
126: if (!obj->prefix) {
127: PetscCall(PetscObjectSetOptionsPrefix(obj, prefix));
128: PetscFunctionReturn(PETSC_SUCCESS);
129: }
130: PetscCheck(prefix[0] != '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Options prefix should not begin with a hyphen");
132: PetscCall(PetscStrlen(obj->prefix, &len1));
133: PetscCall(PetscStrlen(prefix, &len2));
134: new_len = len1 + len2 + 1;
135: PetscCall(PetscRealloc(new_len * sizeof(*obj->prefix), &obj->prefix));
136: PetscCall(PetscStrncpy(obj->prefix + len1, prefix, len2 + 1));
137: PetscFunctionReturn(PETSC_SUCCESS);
138: }
140: /*@
141: PetscObjectGetOptionsPrefix - Gets the prefix of the `PetscObject` used for searching in the options database
143: Input Parameter:
144: . obj - any PETSc object, for example a `Vec`, `Mat` or `KSP`.
146: Output Parameter:
147: . prefix - pointer to the prefix string used is returned
149: Level: advanced
151: .seealso: `PetscOptionsCreate()`, `PetscOptionsDestroy()`, `PetscObjectSetOptionsPrefix()`, `PetscObjectAppendOptionsPrefix()`, `PetscObjectPrependOptionsPrefix()`,
152: `TSGetOptionsPrefix()`, `SNESGetOptionsPrefix()`, `KSPGetOptionsPrefix()`
153: @*/
154: PetscErrorCode PetscObjectGetOptionsPrefix(PetscObject obj, const char *prefix[])
155: {
156: PetscFunctionBegin;
158: PetscAssertPointer(prefix, 2);
159: *prefix = obj->prefix;
160: PetscFunctionReturn(PETSC_SUCCESS);
161: }
163: /*@
164: PetscObjectPrependOptionsPrefix - Sets the prefix used for searching for options of for this object in the database.
166: Input Parameters:
167: + obj - any PETSc object, for example a `Vec`, `Mat` or `KSP`.
168: - prefix - the prefix string to prepend to option requests of the object.
170: Level: advanced
172: Note:
173: A hyphen (-) must NOT be given at the beginning of the prefix name.
174: The first character of all runtime options is AUTOMATICALLY the
175: hyphen.
177: .seealso: `PetscOptionsCreate()`, `PetscOptionsDestroy()`, `PetscObjectSetOptionsPrefix()`, `PetscObjectAppendOptionsPrefix()`,
178: `PetscObjectGetOptionsPrefix()`
179: @*/
180: PetscErrorCode PetscObjectPrependOptionsPrefix(PetscObject obj, const char prefix[])
181: {
182: char *buf;
183: size_t len1, len2, new_len;
185: PetscFunctionBegin;
187: if (!prefix) PetscFunctionReturn(PETSC_SUCCESS);
188: if (!obj->prefix) {
189: PetscCall(PetscObjectSetOptionsPrefix(obj, prefix));
190: PetscFunctionReturn(PETSC_SUCCESS);
191: }
192: PetscCheck(prefix[0] != '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Options prefix should not begin with a hyphen");
194: PetscCall(PetscStrlen(prefix, &len1));
195: PetscCall(PetscStrlen(obj->prefix, &len2));
196: buf = obj->prefix;
197: new_len = len1 + len2 + 1;
198: PetscCall(PetscMalloc1(new_len, &obj->prefix));
199: PetscCall(PetscStrncpy(obj->prefix, prefix, len1 + 1));
200: PetscCall(PetscStrncpy(obj->prefix + len1, buf, len2 + 1));
201: PetscCall(PetscFree(buf));
202: PetscFunctionReturn(PETSC_SUCCESS);
203: }