xref: /petsc/src/sys/classes/bm/interfaces/bm.c (revision 3444e80c71aec716d9691741146d976c79c1d102)
1*3444e80cSBarry Smith #include <petsc/private/petscimpl.h>
2*3444e80cSBarry Smith #include <petsc/private/bmimpl.h> /*I  "petscbm.h"   I*/
3*3444e80cSBarry Smith #include <petscviewer.h>
4*3444e80cSBarry Smith 
5*3444e80cSBarry Smith PetscClassId             BM_CLASSID;
6*3444e80cSBarry Smith static PetscBool         PetscBenchPackageInitialized = PETSC_FALSE;
7*3444e80cSBarry Smith static PetscFunctionList PetscBenchList               = NULL;
8*3444e80cSBarry Smith 
9*3444e80cSBarry Smith // PetscClangLinter pragma disable: -fdoc-internal-linkage
10*3444e80cSBarry Smith /*@C
11*3444e80cSBarry Smith   PetscBenchFinalizePackage - This function destroys everything in the `PetscBench` package. It is
12*3444e80cSBarry Smith   called from `PetscFinalize()`.
13*3444e80cSBarry Smith 
14*3444e80cSBarry Smith   Level: developer
15*3444e80cSBarry Smith 
16*3444e80cSBarry Smith .seealso: `PetscFinalize()`, `PetscBenchInitializePackage()`, `PetscBenchCreate()`, `PetscBench`, `PetscBenchType`
17*3444e80cSBarry Smith @*/
18*3444e80cSBarry Smith static PetscErrorCode PetscBenchFinalizePackage(void)
19*3444e80cSBarry Smith {
20*3444e80cSBarry Smith   PetscFunctionBegin;
21*3444e80cSBarry Smith   PetscCall(PetscFunctionListDestroy(&PetscBenchList));
22*3444e80cSBarry Smith   PetscBenchPackageInitialized = PETSC_FALSE;
23*3444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
24*3444e80cSBarry Smith }
25*3444e80cSBarry Smith 
26*3444e80cSBarry Smith /*@C
27*3444e80cSBarry Smith   PetscBenchInitializePackage - This function initializes everything in the `PetscBench` package.
28*3444e80cSBarry Smith 
29*3444e80cSBarry Smith   Level: developer
30*3444e80cSBarry Smith 
31*3444e80cSBarry Smith .seealso: `PetscInitialize()`, `PetscBenchCreate()`, `PetscBench`, `PetscBenchType`
32*3444e80cSBarry Smith @*/
33*3444e80cSBarry Smith PetscErrorCode PetscBenchInitializePackage(void)
34*3444e80cSBarry Smith {
35*3444e80cSBarry Smith   PetscFunctionBegin;
36*3444e80cSBarry Smith   if (PetscBenchPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
37*3444e80cSBarry Smith   PetscBenchPackageInitialized = PETSC_TRUE;
38*3444e80cSBarry Smith   PetscCall(PetscClassIdRegister("PetscBench", &BM_CLASSID));
39*3444e80cSBarry Smith   PetscCall(PetscRegisterFinalize(PetscBenchFinalizePackage));
40*3444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
41*3444e80cSBarry Smith }
42*3444e80cSBarry Smith 
43*3444e80cSBarry Smith /*@C
44*3444e80cSBarry Smith   PetscBenchRegister -  Adds a benchmark test, `PetscBenchType`, to the `PetscBench` package
45*3444e80cSBarry Smith 
46*3444e80cSBarry Smith   Not Collective
47*3444e80cSBarry Smith 
48*3444e80cSBarry Smith   Input Parameters:
49*3444e80cSBarry Smith + sname    - name of a new benchmark
50*3444e80cSBarry Smith - function - routine to create benchmark
51*3444e80cSBarry Smith 
52*3444e80cSBarry Smith   Level: advanced
53*3444e80cSBarry Smith 
54*3444e80cSBarry Smith   Note:
55*3444e80cSBarry Smith   `PetscBenchRegister()` may be called multiple times
56*3444e80cSBarry Smith 
57*3444e80cSBarry Smith .seealso: `PetscBenchInitializePackage()`, `PetscBenchCreate()`, `PetscBench`, `PetscBenchType`, `PetscBenchSetType()`, `PetscBenchGetType()`
58*3444e80cSBarry Smith @*/
59*3444e80cSBarry Smith PetscErrorCode PetscBenchRegister(const char sname[], PetscErrorCode (*function)(PetscBench))
60*3444e80cSBarry Smith {
61*3444e80cSBarry Smith   PetscFunctionBegin;
62*3444e80cSBarry Smith   PetscCall(PetscBenchInitializePackage());
63*3444e80cSBarry Smith   PetscCall(PetscFunctionListAdd(&PetscBenchList, sname, function));
64*3444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
65*3444e80cSBarry Smith }
66*3444e80cSBarry Smith 
67*3444e80cSBarry Smith /*@C
68*3444e80cSBarry Smith   PetscBenchReset - removes all the intermediate data structures in a `PetscBench`
69*3444e80cSBarry Smith 
70*3444e80cSBarry Smith   Collective
71*3444e80cSBarry Smith 
72*3444e80cSBarry Smith   Input Parameter:
73*3444e80cSBarry Smith . bm - the `PetscBench`
74*3444e80cSBarry Smith 
75*3444e80cSBarry Smith   Level: advanced
76*3444e80cSBarry Smith 
77*3444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchView()`, `PetscBenchSetFromOptions()`, `PetscBenchCreate()`, `PetscBenchDestroy()`, `PetscBenchSetUp()`, `PetscBenchSetType()`
78*3444e80cSBarry Smith @*/
79*3444e80cSBarry Smith PetscErrorCode PetscBenchReset(PetscBench bm)
80*3444e80cSBarry Smith {
81*3444e80cSBarry Smith   PetscFunctionBegin;
82*3444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
83*3444e80cSBarry Smith   PetscCall(PetscLogHandlerDestroy(&bm->lhdlr)); // Temporarily here until PetscLogHandlerReset() exists
84*3444e80cSBarry Smith   PetscTryTypeMethod(bm, reset);
85*3444e80cSBarry Smith   bm->setupcalled = PETSC_FALSE;
86*3444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
87*3444e80cSBarry Smith }
88*3444e80cSBarry Smith 
89*3444e80cSBarry Smith /*@C
90*3444e80cSBarry Smith   PetscBenchDestroy - Destroys a `PetscBench`
91*3444e80cSBarry Smith 
92*3444e80cSBarry Smith   Collective
93*3444e80cSBarry Smith 
94*3444e80cSBarry Smith   Input Parameter:
95*3444e80cSBarry Smith . bm - the `PetscBench`
96*3444e80cSBarry Smith 
97*3444e80cSBarry Smith   Level: advanced
98*3444e80cSBarry Smith 
99*3444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchView()`, `PetscBenchSetFromOptions()`, `PetscBenchCreate()`
100*3444e80cSBarry Smith @*/
101*3444e80cSBarry Smith PetscErrorCode PetscBenchDestroy(PetscBench *bm)
102*3444e80cSBarry Smith {
103*3444e80cSBarry Smith   PetscFunctionBegin;
104*3444e80cSBarry Smith   PetscAssertPointer(bm, 1);
105*3444e80cSBarry Smith   if (!*bm) PetscFunctionReturn(PETSC_SUCCESS);
106*3444e80cSBarry Smith   PetscValidHeaderSpecific((*bm), BM_CLASSID, 1);
107*3444e80cSBarry Smith   if (--((PetscObject)(*bm))->refct > 0) {
108*3444e80cSBarry Smith     *bm = NULL;
109*3444e80cSBarry Smith     PetscFunctionReturn(PETSC_SUCCESS);
110*3444e80cSBarry Smith   }
111*3444e80cSBarry Smith   PetscCall(PetscBenchReset(*bm));
112*3444e80cSBarry Smith   PetscTryTypeMethod(*bm, destroy);
113*3444e80cSBarry Smith   PetscCall(PetscHeaderDestroy(bm));
114*3444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
115*3444e80cSBarry Smith }
116*3444e80cSBarry Smith 
117*3444e80cSBarry Smith /*@
118*3444e80cSBarry Smith   PetscBenchSetUp - sets up the `PetscBench`
119*3444e80cSBarry Smith 
120*3444e80cSBarry Smith   Collective
121*3444e80cSBarry Smith 
122*3444e80cSBarry Smith   Input Parameter:
123*3444e80cSBarry Smith . bm - the `PetscBench`
124*3444e80cSBarry Smith 
125*3444e80cSBarry Smith   Level: advanced
126*3444e80cSBarry Smith 
127*3444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchView()`, `PetscBenchSetFromOptions()`, `PetscBenchCreate()`, `PetscBenchDestroy()`, `PetscBenchSetType()`,
128*3444e80cSBarry Smith           `PetscBenchRun()`, `PetscBenchSetSize()`, `PetscBenchGetSize()`
129*3444e80cSBarry Smith @*/
130*3444e80cSBarry Smith PetscErrorCode PetscBenchSetUp(PetscBench bm)
131*3444e80cSBarry Smith {
132*3444e80cSBarry Smith   PetscFunctionBegin;
133*3444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
134*3444e80cSBarry Smith   if (bm->setupcalled) PetscFunctionReturn(PETSC_SUCCESS);
135*3444e80cSBarry Smith   PetscCall(PetscLogHandlerCreate(PETSC_COMM_WORLD, &bm->lhdlr)); // Temporarily here until PetscLogHandlerReset() exists
136*3444e80cSBarry Smith   PetscCall(PetscLogHandlerSetType(bm->lhdlr, PETSCLOGHANDLERDEFAULT));
137*3444e80cSBarry Smith   PetscTryTypeMethod(bm, setup);
138*3444e80cSBarry Smith   bm->setupcalled = PETSC_TRUE;
139*3444e80cSBarry Smith   PetscTryTypeMethod(bm, run);
140*3444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
141*3444e80cSBarry Smith }
142*3444e80cSBarry Smith 
143*3444e80cSBarry Smith /*@
144*3444e80cSBarry Smith   PetscBenchRun - runs the `PetscBench`
145*3444e80cSBarry Smith 
146*3444e80cSBarry Smith   Collective
147*3444e80cSBarry Smith 
148*3444e80cSBarry Smith   Input Parameter:
149*3444e80cSBarry Smith . bm - the `PetscBench`
150*3444e80cSBarry Smith 
151*3444e80cSBarry Smith   Level: advanced
152*3444e80cSBarry Smith 
153*3444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchView()`, `PetscBenchSetFromOptions()`, `PetscBenchCreate()`, `PetscBenchDestroy()`, `PetscBenchSetUp()`, `PetscBenchSetType()`,
154*3444e80cSBarry Smith           `PetscBenchSetSize()`, `PetscBenchGetSize()`
155*3444e80cSBarry Smith @*/
156*3444e80cSBarry Smith PetscErrorCode PetscBenchRun(PetscBench bm)
157*3444e80cSBarry Smith {
158*3444e80cSBarry Smith   PetscFunctionBegin;
159*3444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
160*3444e80cSBarry Smith   if (!bm->setupcalled) PetscCall(PetscBenchSetUp(bm));
161*3444e80cSBarry Smith   PetscCall(PetscLogHandlerStart(bm->lhdlr));
162*3444e80cSBarry Smith   PetscTryTypeMethod(bm, run);
163*3444e80cSBarry Smith   PetscCall(PetscLogHandlerStop(bm->lhdlr));
164*3444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
165*3444e80cSBarry Smith }
166*3444e80cSBarry Smith 
167*3444e80cSBarry Smith /*@
168*3444e80cSBarry Smith   PetscBenchSetFromOptions - Sets options to a `PetscBench` using the options database
169*3444e80cSBarry Smith 
170*3444e80cSBarry Smith   Collective
171*3444e80cSBarry Smith 
172*3444e80cSBarry Smith   Input Parameter:
173*3444e80cSBarry Smith . bm - the `PetscBench`
174*3444e80cSBarry Smith 
175*3444e80cSBarry Smith   Level: advanced
176*3444e80cSBarry Smith 
177*3444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchView()`, `PetscBenchRun()`, `PetscBenchCreate()`, `PetscBenchDestroy()`, `PetscBenchSetUp()`, `PetscBenchSetType()`,
178*3444e80cSBarry Smith           `PetscBenchSetSize()`, `PetscBenchGetSize()`
179*3444e80cSBarry Smith @*/
180*3444e80cSBarry Smith PetscErrorCode PetscBenchSetFromOptions(PetscBench bm)
181*3444e80cSBarry Smith {
182*3444e80cSBarry Smith   char      type[256];
183*3444e80cSBarry Smith   PetscBool flg;
184*3444e80cSBarry Smith   PetscInt  m;
185*3444e80cSBarry Smith 
186*3444e80cSBarry Smith   PetscFunctionBegin;
187*3444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
188*3444e80cSBarry Smith   PetscObjectOptionsBegin((PetscObject)bm);
189*3444e80cSBarry Smith   PetscCall(PetscOptionsFList("-bm_type", "PetscBench", "PetscBenchSetType", PetscBenchList, ((PetscObject)bm)->type_name, type, sizeof(type), &flg));
190*3444e80cSBarry Smith   if (flg) { PetscCall(PetscBenchSetType(bm, type)); }
191*3444e80cSBarry Smith   PetscCheck(((PetscObject)bm)->type_name, PetscObjectComm((PetscObject)bm), PETSC_ERR_ARG_WRONGSTATE, "No PetscBenchType provided for PetscBench");
192*3444e80cSBarry Smith   PetscCall(PetscOptionsInt("-bm_size", "Size of benchmark", "PetscBenchSetSize", bm->size, &m, &flg));
193*3444e80cSBarry Smith   if (flg) PetscCall(PetscBenchSetSize(bm, m));
194*3444e80cSBarry Smith   PetscTryTypeMethod(bm, setfromoptions, PetscOptionsObject);
195*3444e80cSBarry Smith   PetscOptionsEnd();
196*3444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
197*3444e80cSBarry Smith }
198*3444e80cSBarry Smith 
199*3444e80cSBarry Smith /*@C
200*3444e80cSBarry Smith   PetscBenchView - Views a PETSc benchmark `PetscBench`
201*3444e80cSBarry Smith 
202*3444e80cSBarry Smith   Collective
203*3444e80cSBarry Smith 
204*3444e80cSBarry Smith   Input Parameters:
205*3444e80cSBarry Smith + bm     - the `PetscBench`
206*3444e80cSBarry Smith - viewer - location to view `bm`
207*3444e80cSBarry Smith 
208*3444e80cSBarry Smith   Level: advanced
209*3444e80cSBarry Smith 
210*3444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchSetFromOptions()`, `PetscBenchRun()`, `PetscBenchCreate()`, `PetscBenchDestroy()`, `PetscBenchSetUp()`, `PetscBenchSetType()`,
211*3444e80cSBarry Smith           `PetscBenchSetSize()`, `PetscBenchGetSize()`, `PetscBenchViewFromOptions()`
212*3444e80cSBarry Smith @*/
213*3444e80cSBarry Smith PetscErrorCode PetscBenchView(PetscBench bm, PetscViewer viewer)
214*3444e80cSBarry Smith {
215*3444e80cSBarry Smith   PetscFunctionBegin;
216*3444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
217*3444e80cSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
218*3444e80cSBarry Smith   PetscTryTypeMethod(bm, view, viewer);
219*3444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
220*3444e80cSBarry Smith }
221*3444e80cSBarry Smith 
222*3444e80cSBarry Smith /*@C
223*3444e80cSBarry Smith   PetscBenchViewFromOptions - Processes command line options to determine if/how a `PetscBench` is to be viewed.
224*3444e80cSBarry Smith 
225*3444e80cSBarry Smith   Collective
226*3444e80cSBarry Smith 
227*3444e80cSBarry Smith   Input Parameters:
228*3444e80cSBarry Smith + bm         - the object
229*3444e80cSBarry Smith . bobj       - optional other object that provides prefix (if `NULL` then the prefix in `bm` is used)
230*3444e80cSBarry Smith - optionname - option to activate viewing
231*3444e80cSBarry Smith 
232*3444e80cSBarry Smith   Level: advanced
233*3444e80cSBarry Smith 
234*3444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchSetFromOptions()`, `PetscBenchRun()`, `PetscBenchCreate()`, `PetscBenchDestroy()`, `PetscBenchSetUp()`, `PetscBenchSetType()`,
235*3444e80cSBarry Smith           `PetscBenchSetSize()`, `PetscBenchGetSize()`
236*3444e80cSBarry Smith @*/
237*3444e80cSBarry Smith PetscErrorCode PetscBenchViewFromOptions(PetscBench bm, PetscObject bobj, const char optionname[])
238*3444e80cSBarry Smith {
239*3444e80cSBarry Smith   PetscFunctionBegin;
240*3444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
241*3444e80cSBarry Smith   PetscCall(PetscObjectViewFromOptions((PetscObject)bm, bobj, optionname));
242*3444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
243*3444e80cSBarry Smith }
244*3444e80cSBarry Smith 
245*3444e80cSBarry Smith /*@C
246*3444e80cSBarry Smith   PetscBenchCreate - Create a PETSc benchmark `PetscBench` object
247*3444e80cSBarry Smith 
248*3444e80cSBarry Smith   Collective
249*3444e80cSBarry Smith 
250*3444e80cSBarry Smith   Input Parameter:
251*3444e80cSBarry Smith . comm - communicator to share the `PetscBench`
252*3444e80cSBarry Smith 
253*3444e80cSBarry Smith   Output Parameter:
254*3444e80cSBarry Smith . bm - the `PetscBench`
255*3444e80cSBarry Smith 
256*3444e80cSBarry Smith   Level: advanced
257*3444e80cSBarry Smith 
258*3444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchSetFromOptions()`, `PetscBenchRun()`, `PetscBenchViewFromOptions()`, `PetscBenchDestroy()`, `PetscBenchSetUp()`, `PetscBenchSetType()`,
259*3444e80cSBarry Smith           `PetscBenchSetSize()`, `PetscBenchGetSize()`
260*3444e80cSBarry Smith @*/
261*3444e80cSBarry Smith PetscErrorCode PetscBenchCreate(MPI_Comm comm, PetscBench *bm)
262*3444e80cSBarry Smith {
263*3444e80cSBarry Smith   PetscFunctionBegin;
264*3444e80cSBarry Smith   PetscAssertPointer(bm, 2);
265*3444e80cSBarry Smith   *bm = NULL;
266*3444e80cSBarry Smith   PetscCall(PetscBenchInitializePackage());
267*3444e80cSBarry Smith   PetscCall(PetscHeaderCreate(*bm, BM_CLASSID, "BM", "PetscBench", "BM", comm, PetscBenchDestroy, PetscBenchView));
268*3444e80cSBarry Smith   (*bm)->size = PETSC_DECIDE;
269*3444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
270*3444e80cSBarry Smith }
271*3444e80cSBarry Smith 
272*3444e80cSBarry Smith /*@C
273*3444e80cSBarry Smith   PetscBenchSetOptionsPrefix - Sets the prefix used for searching for all `PetscBench` items in the options database.
274*3444e80cSBarry Smith 
275*3444e80cSBarry Smith   Logically Collective
276*3444e80cSBarry Smith 
277*3444e80cSBarry Smith   Input Parameters:
278*3444e80cSBarry Smith + bm  - the `PetscBench`
279*3444e80cSBarry Smith - pre - the prefix to prepend all `PetscBench` option names
280*3444e80cSBarry Smith 
281*3444e80cSBarry Smith   Level: advanced
282*3444e80cSBarry Smith 
283*3444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchSetFromOptions()`, `PetscBenchRun()`, `PetscBenchViewFromOptions()`, `PetscBenchDestroy()`, `PetscBenchSetUp()`, `PetscBenchSetType()`,
284*3444e80cSBarry Smith           `PetscBenchSetSize()`, `PetscBenchGetSize()`
285*3444e80cSBarry Smith @*/
286*3444e80cSBarry Smith PetscErrorCode PetscBenchSetOptionsPrefix(PetscBench bm, const char pre[])
287*3444e80cSBarry Smith {
288*3444e80cSBarry Smith   PetscFunctionBegin;
289*3444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
290*3444e80cSBarry Smith   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)bm, pre));
291*3444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
292*3444e80cSBarry Smith }
293*3444e80cSBarry Smith 
294*3444e80cSBarry Smith /*@C
295*3444e80cSBarry Smith   PetscBenchSetSize - Sets the size of the `PetscBench` benchmark to run
296*3444e80cSBarry Smith 
297*3444e80cSBarry Smith   Logically Collective
298*3444e80cSBarry Smith 
299*3444e80cSBarry Smith   Input Parameters:
300*3444e80cSBarry Smith + bm - the `PetscBench`
301*3444e80cSBarry Smith - n  - the size
302*3444e80cSBarry Smith 
303*3444e80cSBarry Smith   Level: advanced
304*3444e80cSBarry Smith 
305*3444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchSetFromOptions()`, `PetscBenchRun()`, `PetscBenchViewFromOptions()`, `PetscBenchDestroy()`, `PetscBenchSetUp()`, `PetscBenchSetType()`,
306*3444e80cSBarry Smith           `PetscBenchSetOptionsPrefix()`, `PetscBenchGetSize()`
307*3444e80cSBarry Smith @*/
308*3444e80cSBarry Smith PetscErrorCode PetscBenchSetSize(PetscBench bm, PetscInt n)
309*3444e80cSBarry Smith {
310*3444e80cSBarry Smith   PetscFunctionBegin;
311*3444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
312*3444e80cSBarry Smith   if (bm->size > 0 && bm->size != n && bm->setupcalled) {
313*3444e80cSBarry Smith     PetscCall(PetscBenchReset(bm));
314*3444e80cSBarry Smith     bm->setupcalled = PETSC_FALSE;
315*3444e80cSBarry Smith   }
316*3444e80cSBarry Smith   PetscCheck(n > 0, PetscObjectComm((PetscObject)bm), PETSC_ERR_ARG_OUTOFRANGE, "Illegal value of n. Must be > 0");
317*3444e80cSBarry Smith   bm->size = n;
318*3444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
319*3444e80cSBarry Smith }
320*3444e80cSBarry Smith 
321*3444e80cSBarry Smith /*@C
322*3444e80cSBarry Smith   PetscBenchGetSize - Gets the size of the `PetscBench` benchmark to run
323*3444e80cSBarry Smith 
324*3444e80cSBarry Smith   Logically Collective
325*3444e80cSBarry Smith 
326*3444e80cSBarry Smith   Input Parameter:
327*3444e80cSBarry Smith . bm - the `PetscBench`
328*3444e80cSBarry Smith 
329*3444e80cSBarry Smith   Output Parameter:
330*3444e80cSBarry Smith . n - the size
331*3444e80cSBarry Smith 
332*3444e80cSBarry Smith   Level: advanced
333*3444e80cSBarry Smith 
334*3444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchSetFromOptions()`, `PetscBenchRun()`, `PetscBenchViewFromOptions()`, `PetscBenchDestroy()`, `PetscBenchSetUp()`, `PetscBenchSetType()`,
335*3444e80cSBarry Smith           `PetscBenchSetOptionsPrefix()`, `PetscBenchSetSize()`
336*3444e80cSBarry Smith @*/
337*3444e80cSBarry Smith PetscErrorCode PetscBenchGetSize(PetscBench bm, PetscInt *n)
338*3444e80cSBarry Smith {
339*3444e80cSBarry Smith   PetscFunctionBegin;
340*3444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
341*3444e80cSBarry Smith   PetscAssertPointer(n, 2);
342*3444e80cSBarry Smith   *n = bm->size;
343*3444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
344*3444e80cSBarry Smith }
345*3444e80cSBarry Smith 
346*3444e80cSBarry Smith /*@C
347*3444e80cSBarry Smith   PetscBenchSetType - set the type of `PetscBench` benchmark to run
348*3444e80cSBarry Smith 
349*3444e80cSBarry Smith   Collective
350*3444e80cSBarry Smith 
351*3444e80cSBarry Smith   Input Parameters:
352*3444e80cSBarry Smith + bm   - the `PetscBench`
353*3444e80cSBarry Smith - type - a known method
354*3444e80cSBarry Smith 
355*3444e80cSBarry Smith   Options Database Key:
356*3444e80cSBarry Smith . -bm_type <type> - Sets `PetscBench` type
357*3444e80cSBarry Smith 
358*3444e80cSBarry Smith   Level: advanced
359*3444e80cSBarry Smith 
360*3444e80cSBarry Smith   Developer Note:
361*3444e80cSBarry Smith   `PetscBenchRegister()` is used to add new benchmark types
362*3444e80cSBarry Smith 
363*3444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchSetFromOptions()`, `PetscBenchRun()`, `PetscBenchViewFromOptions()`, `PetscBenchDestroy()`, `PetscBenchSetUp()`, `PetscBenchGetSize()`,
364*3444e80cSBarry Smith           `PetscBenchSetOptionsPrefix()`, `PetscBenchSetSize()`, `PetscBenchGetType()`, `PetscBenchCreate()`
365*3444e80cSBarry Smith @*/
366*3444e80cSBarry Smith PetscErrorCode PetscBenchSetType(PetscBench bm, PetscBenchType type)
367*3444e80cSBarry Smith {
368*3444e80cSBarry Smith   PetscBool match;
369*3444e80cSBarry Smith   PetscErrorCode (*r)(PetscBench);
370*3444e80cSBarry Smith 
371*3444e80cSBarry Smith   PetscFunctionBegin;
372*3444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
373*3444e80cSBarry Smith   PetscAssertPointer(type, 2);
374*3444e80cSBarry Smith 
375*3444e80cSBarry Smith   PetscCall(PetscObjectTypeCompare((PetscObject)bm, type, &match));
376*3444e80cSBarry Smith   if (match) PetscFunctionReturn(PETSC_SUCCESS);
377*3444e80cSBarry Smith 
378*3444e80cSBarry Smith   PetscCall(PetscFunctionListFind(PetscBenchList, type, &r));
379*3444e80cSBarry Smith   PetscCheck(r, PetscObjectComm((PetscObject)bm), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unable to find requested PetscBench type %s", type);
380*3444e80cSBarry Smith   /* Destroy the previous private BM context */
381*3444e80cSBarry Smith   PetscTryTypeMethod(bm, destroy);
382*3444e80cSBarry Smith   bm->ops->destroy = NULL;
383*3444e80cSBarry Smith   bm->data         = NULL;
384*3444e80cSBarry Smith 
385*3444e80cSBarry Smith   PetscCall(PetscFunctionListDestroy(&((PetscObject)bm)->qlist));
386*3444e80cSBarry Smith   /* Reinitialize function pointers in PetscBenchOps structure */
387*3444e80cSBarry Smith   PetscCall(PetscMemzero(bm->ops, sizeof(struct _PetscBenchOps)));
388*3444e80cSBarry Smith 
389*3444e80cSBarry Smith   PetscCall(PetscObjectChangeTypeName((PetscObject)bm, type));
390*3444e80cSBarry Smith   PetscCall((*r)(bm));
391*3444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
392*3444e80cSBarry Smith }
393*3444e80cSBarry Smith 
394*3444e80cSBarry Smith /*@C
395*3444e80cSBarry Smith   PetscBenchGetType - Gets the `PetscBenchType` (as a string) from the `PetscBench`
396*3444e80cSBarry Smith   context.
397*3444e80cSBarry Smith 
398*3444e80cSBarry Smith   Not Collective
399*3444e80cSBarry Smith 
400*3444e80cSBarry Smith   Input Parameter:
401*3444e80cSBarry Smith . bm - the `PetscBench`
402*3444e80cSBarry Smith 
403*3444e80cSBarry Smith   Output Parameter:
404*3444e80cSBarry Smith . type - name of benchmark method
405*3444e80cSBarry Smith 
406*3444e80cSBarry Smith   Level: intermediate
407*3444e80cSBarry Smith 
408*3444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchType`, `PetscBenchSetType()`, `PetscBenchCreate()`
409*3444e80cSBarry Smith @*/
410*3444e80cSBarry Smith PetscErrorCode PetscBenchGetType(PetscBench bm, PetscBenchType *type)
411*3444e80cSBarry Smith {
412*3444e80cSBarry Smith   PetscFunctionBegin;
413*3444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
414*3444e80cSBarry Smith   PetscAssertPointer(type, 2);
415*3444e80cSBarry Smith   *type = ((PetscObject)bm)->type_name;
416*3444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
417*3444e80cSBarry Smith }
418