xref: /petsc/src/sys/objects/prefix.c (revision 4ed52fbab78b399ce72c2d0e95f8168ba21e8101)
17d0a6c19SBarry Smith 
2e5c89e4eSSatish Balay /*
3e5c89e4eSSatish Balay      Provides utility routines for manulating any type of PETSc object.
4e5c89e4eSSatish Balay */
5af0996ceSBarry Smith #include <petsc/private/petscimpl.h>  /*I   "petscsys.h"    I*/
6e5c89e4eSSatish Balay 
7e5c89e4eSSatish Balay #undef __FUNCT__
8c5929fdfSBarry Smith #define __FUNCT__ "PetscObjectSetOptions"
9c5929fdfSBarry Smith /*@C
10c5929fdfSBarry Smith    PetscObjectSetOptions - Sets the options database used by the object
11c5929fdfSBarry Smith 
1296a0c994SBarry Smith    Collective on PetscObject
1396a0c994SBarry Smith 
14c5929fdfSBarry Smith    Input Parameters:
15c5929fdfSBarry Smith +  obj - any PETSc object, for example a Vec, Mat or KSP.
16c5929fdfSBarry Smith -  options - the options database, use NULL for default
17c5929fdfSBarry Smith 
18c5929fdfSBarry Smith    Notes: if this is not called the object will use the default options database
19c5929fdfSBarry Smith 
2096a0c994SBarry Smith   Level: advanced
2196a0c994SBarry Smith 
22c5929fdfSBarry Smith .seealso: PetscOptionsCreate(), PetscOptionsDestroy()
23c5929fdfSBarry Smith 
2496a0c994SBarry Smith @*/
25c5929fdfSBarry Smith PetscErrorCode  PetscObjectSetOptions(PetscObject obj,PetscOptions options)
26c5929fdfSBarry Smith {
27c5929fdfSBarry Smith   PetscFunctionBegin;
28c5929fdfSBarry Smith   PetscValidHeader(obj,1);
29c5929fdfSBarry Smith   obj->options = options;
30c5929fdfSBarry Smith   PetscFunctionReturn(0);
31c5929fdfSBarry Smith }
32c5929fdfSBarry Smith 
33c5929fdfSBarry Smith #undef __FUNCT__
34e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectSetOptionsPrefix"
35e5c89e4eSSatish Balay /*
36e5c89e4eSSatish Balay    PetscObjectSetOptionsPrefix - Sets the prefix used for searching for all
37e5c89e4eSSatish Balay    options of PetscObjectType in the database.
38e5c89e4eSSatish Balay 
3996a0c994SBarry Smith    Collective on Object
4096a0c994SBarry Smith 
41e5c89e4eSSatish Balay    Input Parameters:
42e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP.
43e5c89e4eSSatish Balay .  prefix - the prefix string to prepend to option requests of the object.
44e5c89e4eSSatish Balay 
45e5c89e4eSSatish Balay    Notes:
46e5c89e4eSSatish Balay    A hyphen (-) must NOT be given at the beginning of the prefix name.
47e5c89e4eSSatish Balay    The first character of all runtime options is AUTOMATICALLY the
48e5c89e4eSSatish Balay    hyphen.
49e5c89e4eSSatish Balay 
50e5c89e4eSSatish Balay    Concepts: prefix^setting
51e5c89e4eSSatish Balay 
52e5c89e4eSSatish Balay */
537087cfbeSBarry Smith PetscErrorCode  PetscObjectSetOptionsPrefix(PetscObject obj,const char prefix[])
54e5c89e4eSSatish Balay {
55e5c89e4eSSatish Balay   PetscErrorCode ierr;
56e5c89e4eSSatish Balay 
57e5c89e4eSSatish Balay   PetscFunctionBegin;
583cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
59e5c89e4eSSatish Balay   if (!prefix) {
60503cfb0cSBarry Smith     ierr = PetscFree(obj->prefix);CHKERRQ(ierr);
61e5c89e4eSSatish Balay   } else {
62e32f2f54SBarry Smith     if (prefix[0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Options prefix should not begin with a hypen");
63*4ed52fbaSBarry Smith     if (prefix != obj->prefix) {
64503cfb0cSBarry Smith       ierr = PetscFree(obj->prefix);CHKERRQ(ierr);
65e5c89e4eSSatish Balay       ierr = PetscStrallocpy(prefix,&obj->prefix);CHKERRQ(ierr);
66e5c89e4eSSatish Balay     }
67*4ed52fbaSBarry Smith   }
68e5c89e4eSSatish Balay   PetscFunctionReturn(0);
69e5c89e4eSSatish Balay }
70e5c89e4eSSatish Balay 
71e5c89e4eSSatish Balay #undef __FUNCT__
72e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectAppendOptionsPrefix"
73e5c89e4eSSatish Balay /*
74e5c89e4eSSatish Balay    PetscObjectAppendOptionsPrefix - Sets the prefix used for searching for all
75e5c89e4eSSatish Balay    options of PetscObjectType in the database.
76e5c89e4eSSatish Balay 
77e5c89e4eSSatish Balay    Input Parameters:
78e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP.
79e5c89e4eSSatish Balay .  prefix - the prefix string to prepend to option requests of the object.
80e5c89e4eSSatish Balay 
81e5c89e4eSSatish Balay    Notes:
82e5c89e4eSSatish Balay    A hyphen (-) must NOT be given at the beginning of the prefix name.
83e5c89e4eSSatish Balay    The first character of all runtime options is AUTOMATICALLY the
84e5c89e4eSSatish Balay    hyphen.
85e5c89e4eSSatish Balay 
86e5c89e4eSSatish Balay    Concepts: prefix^setting
87e5c89e4eSSatish Balay 
88e5c89e4eSSatish Balay */
897087cfbeSBarry Smith PetscErrorCode  PetscObjectAppendOptionsPrefix(PetscObject obj,const char prefix[])
90e5c89e4eSSatish Balay {
91e5c89e4eSSatish Balay   char           *buf = obj->prefix;
92e5c89e4eSSatish Balay   PetscErrorCode ierr;
93e5c89e4eSSatish Balay   size_t         len1,len2;
94e5c89e4eSSatish Balay 
95e5c89e4eSSatish Balay   PetscFunctionBegin;
963cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
97a297a907SKarl Rupp   if (!prefix) PetscFunctionReturn(0);
98e5c89e4eSSatish Balay   if (!buf) {
99e5c89e4eSSatish Balay     ierr = PetscObjectSetOptionsPrefix(obj,prefix);CHKERRQ(ierr);
100e5c89e4eSSatish Balay     PetscFunctionReturn(0);
101e5c89e4eSSatish Balay   }
102e32f2f54SBarry Smith   if (prefix[0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Options prefix should not begin with a hypen");
103e5c89e4eSSatish Balay 
104e5c89e4eSSatish Balay   ierr = PetscStrlen(prefix,&len1);CHKERRQ(ierr);
105e5c89e4eSSatish Balay   ierr = PetscStrlen(buf,&len2);CHKERRQ(ierr);
106854ce69bSBarry Smith   ierr = PetscMalloc1(1+len1+len2,&obj->prefix);CHKERRQ(ierr);
107e5c89e4eSSatish Balay   ierr = PetscStrcpy(obj->prefix,buf);CHKERRQ(ierr);
108e5c89e4eSSatish Balay   ierr = PetscStrcat(obj->prefix,prefix);CHKERRQ(ierr);
109e5c89e4eSSatish Balay   ierr = PetscFree(buf);CHKERRQ(ierr);
110e5c89e4eSSatish Balay   PetscFunctionReturn(0);
111e5c89e4eSSatish Balay }
112e5c89e4eSSatish Balay 
113e5c89e4eSSatish Balay #undef __FUNCT__
114e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectGetOptionsPrefix"
115e5c89e4eSSatish Balay /*
116e5c89e4eSSatish Balay    PetscObjectGetOptionsPrefix - Gets the prefix of the PetscObject.
117e5c89e4eSSatish Balay 
118e5c89e4eSSatish Balay    Input Parameters:
119e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP.
120e5c89e4eSSatish Balay 
121e5c89e4eSSatish Balay    Output Parameters:
122e5c89e4eSSatish Balay .  prefix - pointer to the prefix string used is returned
123e5c89e4eSSatish Balay 
124e5c89e4eSSatish Balay    Concepts: prefix^getting
125e5c89e4eSSatish Balay 
126e5c89e4eSSatish Balay */
1277087cfbeSBarry Smith PetscErrorCode  PetscObjectGetOptionsPrefix(PetscObject obj,const char *prefix[])
128e5c89e4eSSatish Balay {
129e5c89e4eSSatish Balay   PetscFunctionBegin;
1303cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
1313cfa8680SLisandro Dalcin   PetscValidPointer(prefix,2);
132e5c89e4eSSatish Balay   *prefix = obj->prefix;
133e5c89e4eSSatish Balay   PetscFunctionReturn(0);
134e5c89e4eSSatish Balay }
135e5c89e4eSSatish Balay 
136e5c89e4eSSatish Balay #undef __FUNCT__
137e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectPrependOptionsPrefix"
138e5c89e4eSSatish Balay /*
139e5c89e4eSSatish Balay    PetscObjectPrependOptionsPrefix - Sets the prefix used for searching for all
140e5c89e4eSSatish Balay    options of PetscObjectType in the database.
141e5c89e4eSSatish Balay 
142e5c89e4eSSatish Balay    Input Parameters:
143e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP.
144e5c89e4eSSatish Balay .  prefix - the prefix string to prepend to option requests of the object.
145e5c89e4eSSatish Balay 
146e5c89e4eSSatish Balay    Notes:
147e5c89e4eSSatish Balay    A hyphen (-) must NOT be given at the beginning of the prefix name.
148e5c89e4eSSatish Balay    The first character of all runtime options is AUTOMATICALLY the
149e5c89e4eSSatish Balay    hyphen.
150e5c89e4eSSatish Balay 
151e5c89e4eSSatish Balay    Concepts: prefix^setting
152e5c89e4eSSatish Balay 
153e5c89e4eSSatish Balay */
1547087cfbeSBarry Smith PetscErrorCode  PetscObjectPrependOptionsPrefix(PetscObject obj,const char prefix[])
155e5c89e4eSSatish Balay {
1565c7534e4SLisandro Dalcin   char           *buf;
157e5c89e4eSSatish Balay   size_t         len1,len2;
1585c7534e4SLisandro Dalcin   PetscErrorCode ierr;
159e5c89e4eSSatish Balay 
160e5c89e4eSSatish Balay   PetscFunctionBegin;
1613cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
1625c7534e4SLisandro Dalcin   buf = obj->prefix;
163a297a907SKarl Rupp   if (!prefix) PetscFunctionReturn(0);
164e5c89e4eSSatish Balay   if (!buf) {
165e5c89e4eSSatish Balay     ierr = PetscObjectSetOptionsPrefix(obj,prefix);CHKERRQ(ierr);
166e5c89e4eSSatish Balay     PetscFunctionReturn(0);
167e5c89e4eSSatish Balay   }
168e32f2f54SBarry Smith   if (prefix[0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Options prefix should not begin with a hypen");
169e5c89e4eSSatish Balay 
170e5c89e4eSSatish Balay   ierr = PetscStrlen(prefix,&len1);CHKERRQ(ierr);
171e5c89e4eSSatish Balay   ierr = PetscStrlen(buf,&len2);CHKERRQ(ierr);
172854ce69bSBarry Smith   ierr = PetscMalloc1(1+len1+len2,&obj->prefix);CHKERRQ(ierr);
173e5c89e4eSSatish Balay   ierr = PetscStrcpy(obj->prefix,prefix);CHKERRQ(ierr);
174e5c89e4eSSatish Balay   ierr = PetscStrcat(obj->prefix,buf);CHKERRQ(ierr);
175e5c89e4eSSatish Balay   ierr = PetscFree(buf);CHKERRQ(ierr);
176e5c89e4eSSatish Balay   PetscFunctionReturn(0);
177e5c89e4eSSatish Balay }
178e5c89e4eSSatish Balay 
179