xref: /petsc/src/sys/objects/gcomm.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
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 
7ce94432eSBarry Smith /*@C
8ce94432eSBarry Smith    PetscObjectComm - Gets the MPI communicator for any PetscObject   regardless of the type.
9ce94432eSBarry Smith 
10ce94432eSBarry Smith    Not Collective
11ce94432eSBarry Smith 
12ce94432eSBarry Smith    Input Parameter:
13ce94432eSBarry Smith .  obj - any PETSc object, for example a Vec, Mat or KSP. Thus must be
14ce94432eSBarry Smith          cast with a (PetscObject), for example,
15ce94432eSBarry Smith          SETERRQ(PetscObjectComm((PetscObject)mat,...);
16ce94432eSBarry Smith 
17ce94432eSBarry Smith    Output Parameter:
18ce94432eSBarry Smith .  comm - the MPI communicator or MPI_COMM_NULL if object is not valid
19ce94432eSBarry Smith 
20ce94432eSBarry Smith    Level: advanced
21ce94432eSBarry Smith 
2295452b02SPatrick Sanan    Notes:
2395452b02SPatrick Sanan     Never use this in the form
24ce94432eSBarry Smith $       comm = PetscObjectComm((PetscObject)obj);
25ce94432eSBarry Smith         instead use PetscObjectGetComm()
26ce94432eSBarry Smith 
27db781477SPatrick Sanan .seealso: `PetscObjectGetComm()`
28ce94432eSBarry Smith @*/
29*9371c9d4SSatish Balay MPI_Comm PetscObjectComm(PetscObject obj) {
305f80ce2aSJacob Faibussowitsch   return obj ? obj->comm : MPI_COMM_NULL;
31ce94432eSBarry Smith }
32ce94432eSBarry Smith 
33e5c89e4eSSatish Balay /*@C
34e5c89e4eSSatish Balay    PetscObjectGetComm - Gets the MPI communicator for any PetscObject,
35e5c89e4eSSatish Balay    regardless of the type.
36e5c89e4eSSatish Balay 
37e5c89e4eSSatish Balay    Not Collective
38e5c89e4eSSatish Balay 
39e5c89e4eSSatish Balay    Input Parameter:
40e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP. Thus must be
41e5c89e4eSSatish Balay          cast with a (PetscObject), for example,
42e5c89e4eSSatish Balay          PetscObjectGetComm((PetscObject)mat,&comm);
43e5c89e4eSSatish Balay 
44e5c89e4eSSatish Balay    Output Parameter:
45e5c89e4eSSatish Balay .  comm - the MPI communicator
46e5c89e4eSSatish Balay 
47e5c89e4eSSatish Balay    Level: advanced
48e5c89e4eSSatish Balay 
49db781477SPatrick Sanan .seealso: `PetscObjectComm()`
50e5c89e4eSSatish Balay @*/
51*9371c9d4SSatish Balay PetscErrorCode PetscObjectGetComm(PetscObject obj, MPI_Comm *comm) {
52e5c89e4eSSatish Balay   PetscFunctionBegin;
533cfa8680SLisandro Dalcin   PetscValidHeader(obj, 1);
543cfa8680SLisandro Dalcin   PetscValidPointer(comm, 2);
559566063dSJacob Faibussowitsch   if (obj->bops->getcomm) PetscCall(obj->bops->getcomm(obj, comm));
565f80ce2aSJacob Faibussowitsch   else *comm = obj->comm;
57e5c89e4eSSatish Balay   PetscFunctionReturn(0);
58e5c89e4eSSatish Balay }
59e5c89e4eSSatish Balay 
60cbf1b8bfSBarry Smith /*@
611cee3971SBarry Smith    PetscObjectGetTabLevel - Gets the number of tabs that ASCII output for that object use
62e5c89e4eSSatish Balay 
631cee3971SBarry Smith    Not Collective
641cee3971SBarry Smith 
651cee3971SBarry Smith    Input Parameter:
661cee3971SBarry Smith .  obj - any PETSc object, for example a Vec, Mat or KSP. Thus must be
671cee3971SBarry Smith          cast with a (PetscObject), for example,
681cee3971SBarry Smith          PetscObjectGetComm((PetscObject)mat,&comm);
691cee3971SBarry Smith 
701cee3971SBarry Smith    Output Parameter:
711cee3971SBarry Smith .   tab - the number of tabs
721cee3971SBarry Smith 
731cee3971SBarry Smith    Level: developer
741cee3971SBarry Smith 
7595452b02SPatrick Sanan     Notes:
766aad120cSJose E. Roman     this is used to manage the output from options that are embedded in other objects. For example
77a5b23f4aSJose E. Roman       the KSP object inside a SNES object. By indenting each lower level further the hierarchy of objects
781cee3971SBarry Smith       is very clear.
791cee3971SBarry Smith 
80db781477SPatrick Sanan .seealso: `PetscObjectIncrementTabLevel()`
811cee3971SBarry Smith 
821cee3971SBarry Smith @*/
83*9371c9d4SSatish Balay PetscErrorCode PetscObjectGetTabLevel(PetscObject obj, PetscInt *tab) {
841cee3971SBarry Smith   PetscFunctionBegin;
851cee3971SBarry Smith   PetscValidHeader(obj, 1);
865f80ce2aSJacob Faibussowitsch   PetscValidIntPointer(tab, 2);
871cee3971SBarry Smith   *tab = obj->tablevel;
881cee3971SBarry Smith   PetscFunctionReturn(0);
891cee3971SBarry Smith }
901cee3971SBarry Smith 
91da35de2aSMatthew G Knepley /*@
92da35de2aSMatthew G Knepley    PetscObjectSetTabLevel - Sets the number of tabs that ASCII output for that object use
93da35de2aSMatthew G Knepley 
94da35de2aSMatthew G Knepley    Not Collective
95da35de2aSMatthew G Knepley 
96da35de2aSMatthew G Knepley    Input Parameters:
97da35de2aSMatthew G Knepley +  obj - any PETSc object, for example a Vec, Mat or KSP. Thus must be
98da35de2aSMatthew G Knepley          cast with a (PetscObject), for example,
99da35de2aSMatthew G Knepley          PetscObjectGetComm((PetscObject)mat,&comm);
100da35de2aSMatthew G Knepley -   tab - the number of tabs
101da35de2aSMatthew G Knepley 
102da35de2aSMatthew G Knepley    Level: developer
103da35de2aSMatthew G Knepley 
10495452b02SPatrick Sanan     Notes:
1056aad120cSJose E. Roman     this is used to manage the output from options that are embedded in other objects. For example
106a5b23f4aSJose E. Roman       the KSP object inside a SNES object. By indenting each lower level further the hierarchy of objects
107da35de2aSMatthew G Knepley       is very clear.
108da35de2aSMatthew G Knepley 
109db781477SPatrick Sanan .seealso: `PetscObjectIncrementTabLevel()`
110da35de2aSMatthew G Knepley @*/
111*9371c9d4SSatish Balay PetscErrorCode PetscObjectSetTabLevel(PetscObject obj, PetscInt tab) {
112da35de2aSMatthew G Knepley   PetscFunctionBegin;
113da35de2aSMatthew G Knepley   PetscValidHeader(obj, 1);
114da35de2aSMatthew G Knepley   obj->tablevel = tab;
115da35de2aSMatthew G Knepley   PetscFunctionReturn(0);
116da35de2aSMatthew G Knepley }
117da35de2aSMatthew G Knepley 
118cbf1b8bfSBarry Smith /*@
1191cee3971SBarry Smith    PetscObjectIncrementTabLevel - Sets the number of tabs that ASCII output for that object use based on
1201cee3971SBarry Smith          the tablevel of another object. This should be called immediately after the object is created.
1211cee3971SBarry Smith 
1221cee3971SBarry Smith    Not Collective
1231cee3971SBarry Smith 
124d8d19677SJose E. Roman    Input Parameters:
1251cee3971SBarry Smith +  obj - any PETSc object where we are changing the tab
1261cee3971SBarry Smith .  oldobj - the object providing the tab
1271cee3971SBarry Smith -  tab - the increment that is added to the old objects tab
1281cee3971SBarry Smith 
1291cee3971SBarry Smith    Level: developer
1301cee3971SBarry Smith 
13195452b02SPatrick Sanan     Notes:
1326aad120cSJose E. Roman     this is used to manage the output from options that are embedded in other objects. For example
133a5b23f4aSJose E. Roman       the KSP object inside a SNES object. By indenting each lower level further the hierarchy of objects
1341cee3971SBarry Smith       is very clear.
1351cee3971SBarry Smith 
136db781477SPatrick Sanan .seealso: `PetscObjectSetTabLevel()`, `PetscObjectGetTabLevel()`
1371cee3971SBarry Smith 
1381cee3971SBarry Smith @*/
139*9371c9d4SSatish Balay PetscErrorCode PetscObjectIncrementTabLevel(PetscObject obj, PetscObject oldobj, PetscInt tab) {
1401cee3971SBarry Smith   PetscFunctionBegin;
1411cee3971SBarry Smith   PetscValidHeader(obj, 1);
1425f80ce2aSJacob Faibussowitsch   if (oldobj) PetscValidHeader(oldobj, 2);
1435f80ce2aSJacob Faibussowitsch   obj->tablevel = (oldobj ? oldobj->tablevel : 0) + tab;
1441cee3971SBarry Smith   PetscFunctionReturn(0);
1451cee3971SBarry Smith }
146