xref: /petsc/src/sys/classes/bm/interfaces/bm.c (revision 834855d6effb0d027771461c8e947ee1ce5a1e17)
13444e80cSBarry Smith #include <petsc/private/petscimpl.h>
23444e80cSBarry Smith #include <petsc/private/bmimpl.h> /*I  "petscbm.h"   I*/
33444e80cSBarry Smith #include <petscviewer.h>
43444e80cSBarry Smith 
53444e80cSBarry Smith PetscClassId             BM_CLASSID;
63444e80cSBarry Smith static PetscBool         PetscBenchPackageInitialized = PETSC_FALSE;
73444e80cSBarry Smith static PetscFunctionList PetscBenchList               = NULL;
83444e80cSBarry Smith 
93444e80cSBarry Smith // PetscClangLinter pragma disable: -fdoc-internal-linkage
103444e80cSBarry Smith /*@C
113444e80cSBarry Smith   PetscBenchFinalizePackage - This function destroys everything in the `PetscBench` package. It is
123444e80cSBarry Smith   called from `PetscFinalize()`.
133444e80cSBarry Smith 
143444e80cSBarry Smith   Level: developer
153444e80cSBarry Smith 
163444e80cSBarry Smith .seealso: `PetscFinalize()`, `PetscBenchInitializePackage()`, `PetscBenchCreate()`, `PetscBench`, `PetscBenchType`
173444e80cSBarry Smith @*/
PetscBenchFinalizePackage(void)183444e80cSBarry Smith static PetscErrorCode PetscBenchFinalizePackage(void)
193444e80cSBarry Smith {
203444e80cSBarry Smith   PetscFunctionBegin;
213444e80cSBarry Smith   PetscCall(PetscFunctionListDestroy(&PetscBenchList));
223444e80cSBarry Smith   PetscBenchPackageInitialized = PETSC_FALSE;
233444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
243444e80cSBarry Smith }
253444e80cSBarry Smith 
263444e80cSBarry Smith /*@C
273444e80cSBarry Smith   PetscBenchInitializePackage - This function initializes everything in the `PetscBench` package.
283444e80cSBarry Smith 
293444e80cSBarry Smith   Level: developer
303444e80cSBarry Smith 
313444e80cSBarry Smith .seealso: `PetscInitialize()`, `PetscBenchCreate()`, `PetscBench`, `PetscBenchType`
323444e80cSBarry Smith @*/
PetscBenchInitializePackage(void)333444e80cSBarry Smith PetscErrorCode PetscBenchInitializePackage(void)
343444e80cSBarry Smith {
353444e80cSBarry Smith   PetscFunctionBegin;
363444e80cSBarry Smith   if (PetscBenchPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
373444e80cSBarry Smith   PetscBenchPackageInitialized = PETSC_TRUE;
383444e80cSBarry Smith   PetscCall(PetscClassIdRegister("PetscBench", &BM_CLASSID));
393444e80cSBarry Smith   PetscCall(PetscRegisterFinalize(PetscBenchFinalizePackage));
403444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
413444e80cSBarry Smith }
423444e80cSBarry Smith 
433444e80cSBarry Smith /*@C
443444e80cSBarry Smith   PetscBenchRegister -  Adds a benchmark test, `PetscBenchType`, to the `PetscBench` package
453444e80cSBarry Smith 
46cc4c1da9SBarry Smith   Not Collective, No Fortran Support
473444e80cSBarry Smith 
483444e80cSBarry Smith   Input Parameters:
493444e80cSBarry Smith + sname    - name of a new benchmark
503444e80cSBarry Smith - function - routine to create benchmark
513444e80cSBarry Smith 
523444e80cSBarry Smith   Level: advanced
533444e80cSBarry Smith 
543444e80cSBarry Smith   Note:
553444e80cSBarry Smith   `PetscBenchRegister()` may be called multiple times
563444e80cSBarry Smith 
573444e80cSBarry Smith .seealso: `PetscBenchInitializePackage()`, `PetscBenchCreate()`, `PetscBench`, `PetscBenchType`, `PetscBenchSetType()`, `PetscBenchGetType()`
583444e80cSBarry Smith @*/
PetscBenchRegister(const char sname[],PetscErrorCode (* function)(PetscBench))593444e80cSBarry Smith PetscErrorCode PetscBenchRegister(const char sname[], PetscErrorCode (*function)(PetscBench))
603444e80cSBarry Smith {
613444e80cSBarry Smith   PetscFunctionBegin;
623444e80cSBarry Smith   PetscCall(PetscBenchInitializePackage());
633444e80cSBarry Smith   PetscCall(PetscFunctionListAdd(&PetscBenchList, sname, function));
643444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
653444e80cSBarry Smith }
663444e80cSBarry Smith 
67cc4c1da9SBarry Smith /*@
683444e80cSBarry Smith   PetscBenchReset - removes all the intermediate data structures in a `PetscBench`
693444e80cSBarry Smith 
703444e80cSBarry Smith   Collective
713444e80cSBarry Smith 
723444e80cSBarry Smith   Input Parameter:
733444e80cSBarry Smith . bm - the `PetscBench`
743444e80cSBarry Smith 
753444e80cSBarry Smith   Level: advanced
763444e80cSBarry Smith 
773444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchView()`, `PetscBenchSetFromOptions()`, `PetscBenchCreate()`, `PetscBenchDestroy()`, `PetscBenchSetUp()`, `PetscBenchSetType()`
783444e80cSBarry Smith @*/
PetscBenchReset(PetscBench bm)793444e80cSBarry Smith PetscErrorCode PetscBenchReset(PetscBench bm)
803444e80cSBarry Smith {
813444e80cSBarry Smith   PetscFunctionBegin;
823444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
833444e80cSBarry Smith   PetscCall(PetscLogHandlerDestroy(&bm->lhdlr)); // Temporarily here until PetscLogHandlerReset() exists
843444e80cSBarry Smith   PetscTryTypeMethod(bm, reset);
853444e80cSBarry Smith   bm->setupcalled = PETSC_FALSE;
863444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
873444e80cSBarry Smith }
883444e80cSBarry Smith 
895d83a8b1SBarry Smith /*@
903444e80cSBarry Smith   PetscBenchDestroy - Destroys a `PetscBench`
913444e80cSBarry Smith 
923444e80cSBarry Smith   Collective
933444e80cSBarry Smith 
943444e80cSBarry Smith   Input Parameter:
953444e80cSBarry Smith . bm - the `PetscBench`
963444e80cSBarry Smith 
973444e80cSBarry Smith   Level: advanced
983444e80cSBarry Smith 
993444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchView()`, `PetscBenchSetFromOptions()`, `PetscBenchCreate()`
1003444e80cSBarry Smith @*/
PetscBenchDestroy(PetscBench * bm)1013444e80cSBarry Smith PetscErrorCode PetscBenchDestroy(PetscBench *bm)
1023444e80cSBarry Smith {
1033444e80cSBarry Smith   PetscFunctionBegin;
1043444e80cSBarry Smith   PetscAssertPointer(bm, 1);
1053444e80cSBarry Smith   if (!*bm) PetscFunctionReturn(PETSC_SUCCESS);
106f4f49eeaSPierre Jolivet   PetscValidHeaderSpecific(*bm, BM_CLASSID, 1);
107f4f49eeaSPierre Jolivet   if (--((PetscObject)*bm)->refct > 0) {
1083444e80cSBarry Smith     *bm = NULL;
1093444e80cSBarry Smith     PetscFunctionReturn(PETSC_SUCCESS);
1103444e80cSBarry Smith   }
1113444e80cSBarry Smith   PetscCall(PetscBenchReset(*bm));
1123444e80cSBarry Smith   PetscTryTypeMethod(*bm, destroy);
1133444e80cSBarry Smith   PetscCall(PetscHeaderDestroy(bm));
1143444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
1153444e80cSBarry Smith }
1163444e80cSBarry Smith 
1173444e80cSBarry Smith /*@
1183444e80cSBarry Smith   PetscBenchSetUp - sets up the `PetscBench`
1193444e80cSBarry Smith 
1203444e80cSBarry Smith   Collective
1213444e80cSBarry Smith 
1223444e80cSBarry Smith   Input Parameter:
1233444e80cSBarry Smith . bm - the `PetscBench`
1243444e80cSBarry Smith 
1253444e80cSBarry Smith   Level: advanced
1263444e80cSBarry Smith 
1273444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchView()`, `PetscBenchSetFromOptions()`, `PetscBenchCreate()`, `PetscBenchDestroy()`, `PetscBenchSetType()`,
1283444e80cSBarry Smith           `PetscBenchRun()`, `PetscBenchSetSize()`, `PetscBenchGetSize()`
1293444e80cSBarry Smith @*/
PetscBenchSetUp(PetscBench bm)1303444e80cSBarry Smith PetscErrorCode PetscBenchSetUp(PetscBench bm)
1313444e80cSBarry Smith {
1323444e80cSBarry Smith   PetscFunctionBegin;
1333444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
1343444e80cSBarry Smith   if (bm->setupcalled) PetscFunctionReturn(PETSC_SUCCESS);
1353444e80cSBarry Smith   PetscCall(PetscLogHandlerCreate(PETSC_COMM_WORLD, &bm->lhdlr)); // Temporarily here until PetscLogHandlerReset() exists
1363444e80cSBarry Smith   PetscCall(PetscLogHandlerSetType(bm->lhdlr, PETSCLOGHANDLERDEFAULT));
1373444e80cSBarry Smith   PetscTryTypeMethod(bm, setup);
1383444e80cSBarry Smith   bm->setupcalled = PETSC_TRUE;
1393444e80cSBarry Smith   PetscTryTypeMethod(bm, run);
1403444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
1413444e80cSBarry Smith }
1423444e80cSBarry Smith 
1433444e80cSBarry Smith /*@
1443444e80cSBarry Smith   PetscBenchRun - runs the `PetscBench`
1453444e80cSBarry Smith 
1463444e80cSBarry Smith   Collective
1473444e80cSBarry Smith 
1483444e80cSBarry Smith   Input Parameter:
1493444e80cSBarry Smith . bm - the `PetscBench`
1503444e80cSBarry Smith 
1513444e80cSBarry Smith   Level: advanced
1523444e80cSBarry Smith 
1533444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchView()`, `PetscBenchSetFromOptions()`, `PetscBenchCreate()`, `PetscBenchDestroy()`, `PetscBenchSetUp()`, `PetscBenchSetType()`,
1543444e80cSBarry Smith           `PetscBenchSetSize()`, `PetscBenchGetSize()`
1553444e80cSBarry Smith @*/
PetscBenchRun(PetscBench bm)1563444e80cSBarry Smith PetscErrorCode PetscBenchRun(PetscBench bm)
1573444e80cSBarry Smith {
1583444e80cSBarry Smith   PetscFunctionBegin;
1593444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
1603444e80cSBarry Smith   if (!bm->setupcalled) PetscCall(PetscBenchSetUp(bm));
1613444e80cSBarry Smith   PetscCall(PetscLogHandlerStart(bm->lhdlr));
1623444e80cSBarry Smith   PetscTryTypeMethod(bm, run);
1633444e80cSBarry Smith   PetscCall(PetscLogHandlerStop(bm->lhdlr));
1643444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
1653444e80cSBarry Smith }
1663444e80cSBarry Smith 
1673444e80cSBarry Smith /*@
1683444e80cSBarry Smith   PetscBenchSetFromOptions - Sets options to a `PetscBench` using the options database
1693444e80cSBarry Smith 
1703444e80cSBarry Smith   Collective
1713444e80cSBarry Smith 
1723444e80cSBarry Smith   Input Parameter:
1733444e80cSBarry Smith . bm - the `PetscBench`
1743444e80cSBarry Smith 
1753444e80cSBarry Smith   Level: advanced
1763444e80cSBarry Smith 
1773444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchView()`, `PetscBenchRun()`, `PetscBenchCreate()`, `PetscBenchDestroy()`, `PetscBenchSetUp()`, `PetscBenchSetType()`,
1783444e80cSBarry Smith           `PetscBenchSetSize()`, `PetscBenchGetSize()`
1793444e80cSBarry Smith @*/
PetscBenchSetFromOptions(PetscBench bm)1803444e80cSBarry Smith PetscErrorCode PetscBenchSetFromOptions(PetscBench bm)
1813444e80cSBarry Smith {
1823444e80cSBarry Smith   char      type[256];
1833444e80cSBarry Smith   PetscBool flg;
1843444e80cSBarry Smith   PetscInt  m;
1853444e80cSBarry Smith 
1863444e80cSBarry Smith   PetscFunctionBegin;
1873444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
1883444e80cSBarry Smith   PetscObjectOptionsBegin((PetscObject)bm);
1893444e80cSBarry Smith   PetscCall(PetscOptionsFList("-bm_type", "PetscBench", "PetscBenchSetType", PetscBenchList, ((PetscObject)bm)->type_name, type, sizeof(type), &flg));
190*3a7d0413SPierre Jolivet   if (flg) PetscCall(PetscBenchSetType(bm, type));
1913444e80cSBarry Smith   PetscCheck(((PetscObject)bm)->type_name, PetscObjectComm((PetscObject)bm), PETSC_ERR_ARG_WRONGSTATE, "No PetscBenchType provided for PetscBench");
1923444e80cSBarry Smith   PetscCall(PetscOptionsInt("-bm_size", "Size of benchmark", "PetscBenchSetSize", bm->size, &m, &flg));
1933444e80cSBarry Smith   if (flg) PetscCall(PetscBenchSetSize(bm, m));
1943444e80cSBarry Smith   PetscTryTypeMethod(bm, setfromoptions, PetscOptionsObject);
1953444e80cSBarry Smith   PetscOptionsEnd();
1963444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
1973444e80cSBarry Smith }
1983444e80cSBarry Smith 
199ffeef943SBarry Smith /*@
2003444e80cSBarry Smith   PetscBenchView - Views a PETSc benchmark `PetscBench`
2013444e80cSBarry Smith 
2023444e80cSBarry Smith   Collective
2033444e80cSBarry Smith 
2043444e80cSBarry Smith   Input Parameters:
2053444e80cSBarry Smith + bm     - the `PetscBench`
2063444e80cSBarry Smith - viewer - location to view `bm`
2073444e80cSBarry Smith 
2083444e80cSBarry Smith   Level: advanced
2093444e80cSBarry Smith 
2103444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchSetFromOptions()`, `PetscBenchRun()`, `PetscBenchCreate()`, `PetscBenchDestroy()`, `PetscBenchSetUp()`, `PetscBenchSetType()`,
2113444e80cSBarry Smith           `PetscBenchSetSize()`, `PetscBenchGetSize()`, `PetscBenchViewFromOptions()`
2123444e80cSBarry Smith @*/
PetscBenchView(PetscBench bm,PetscViewer viewer)2133444e80cSBarry Smith PetscErrorCode PetscBenchView(PetscBench bm, PetscViewer viewer)
2143444e80cSBarry Smith {
2153444e80cSBarry Smith   PetscFunctionBegin;
2163444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
2173444e80cSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
2183444e80cSBarry Smith   PetscTryTypeMethod(bm, view, viewer);
2193444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
2203444e80cSBarry Smith }
2213444e80cSBarry Smith 
222ffeef943SBarry Smith /*@
2233444e80cSBarry Smith   PetscBenchViewFromOptions - Processes command line options to determine if/how a `PetscBench` is to be viewed.
2243444e80cSBarry Smith 
2253444e80cSBarry Smith   Collective
2263444e80cSBarry Smith 
2273444e80cSBarry Smith   Input Parameters:
2283444e80cSBarry Smith + bm         - the object
2293444e80cSBarry Smith . bobj       - optional other object that provides prefix (if `NULL` then the prefix in `bm` is used)
2303444e80cSBarry Smith - optionname - option to activate viewing
2313444e80cSBarry Smith 
2323444e80cSBarry Smith   Level: advanced
2333444e80cSBarry Smith 
2343444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchSetFromOptions()`, `PetscBenchRun()`, `PetscBenchCreate()`, `PetscBenchDestroy()`, `PetscBenchSetUp()`, `PetscBenchSetType()`,
2353444e80cSBarry Smith           `PetscBenchSetSize()`, `PetscBenchGetSize()`
2363444e80cSBarry Smith @*/
PetscBenchViewFromOptions(PetscBench bm,PetscObject bobj,const char optionname[])2373444e80cSBarry Smith PetscErrorCode PetscBenchViewFromOptions(PetscBench bm, PetscObject bobj, const char optionname[])
2383444e80cSBarry Smith {
2393444e80cSBarry Smith   PetscFunctionBegin;
2403444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
2413444e80cSBarry Smith   PetscCall(PetscObjectViewFromOptions((PetscObject)bm, bobj, optionname));
2423444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
2433444e80cSBarry Smith }
2443444e80cSBarry Smith 
245cc4c1da9SBarry Smith /*@
2463444e80cSBarry Smith   PetscBenchCreate - Create a PETSc benchmark `PetscBench` object
2473444e80cSBarry Smith 
2483444e80cSBarry Smith   Collective
2493444e80cSBarry Smith 
2503444e80cSBarry Smith   Input Parameter:
2513444e80cSBarry Smith . comm - communicator to share the `PetscBench`
2523444e80cSBarry Smith 
2533444e80cSBarry Smith   Output Parameter:
2543444e80cSBarry Smith . bm - the `PetscBench`
2553444e80cSBarry Smith 
2563444e80cSBarry Smith   Level: advanced
2573444e80cSBarry Smith 
2583444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchSetFromOptions()`, `PetscBenchRun()`, `PetscBenchViewFromOptions()`, `PetscBenchDestroy()`, `PetscBenchSetUp()`, `PetscBenchSetType()`,
2593444e80cSBarry Smith           `PetscBenchSetSize()`, `PetscBenchGetSize()`
2603444e80cSBarry Smith @*/
PetscBenchCreate(MPI_Comm comm,PetscBench * bm)2613444e80cSBarry Smith PetscErrorCode PetscBenchCreate(MPI_Comm comm, PetscBench *bm)
2623444e80cSBarry Smith {
2633444e80cSBarry Smith   PetscFunctionBegin;
2643444e80cSBarry Smith   PetscAssertPointer(bm, 2);
2653444e80cSBarry Smith   PetscCall(PetscBenchInitializePackage());
266377f809aSBarry Smith 
2673444e80cSBarry Smith   PetscCall(PetscHeaderCreate(*bm, BM_CLASSID, "BM", "PetscBench", "BM", comm, PetscBenchDestroy, PetscBenchView));
2683444e80cSBarry Smith   (*bm)->size = PETSC_DECIDE;
2693444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
2703444e80cSBarry Smith }
2713444e80cSBarry Smith 
272cc4c1da9SBarry Smith /*@
2733444e80cSBarry Smith   PetscBenchSetOptionsPrefix - Sets the prefix used for searching for all `PetscBench` items in the options database.
2743444e80cSBarry Smith 
2753444e80cSBarry Smith   Logically Collective
2763444e80cSBarry Smith 
2773444e80cSBarry Smith   Input Parameters:
2783444e80cSBarry Smith + bm  - the `PetscBench`
2793444e80cSBarry Smith - pre - the prefix to prepend all `PetscBench` option names
2803444e80cSBarry Smith 
2813444e80cSBarry Smith   Level: advanced
2823444e80cSBarry Smith 
2833444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchSetFromOptions()`, `PetscBenchRun()`, `PetscBenchViewFromOptions()`, `PetscBenchDestroy()`, `PetscBenchSetUp()`, `PetscBenchSetType()`,
2843444e80cSBarry Smith           `PetscBenchSetSize()`, `PetscBenchGetSize()`
2853444e80cSBarry Smith @*/
PetscBenchSetOptionsPrefix(PetscBench bm,const char pre[])2863444e80cSBarry Smith PetscErrorCode PetscBenchSetOptionsPrefix(PetscBench bm, const char pre[])
2873444e80cSBarry Smith {
2883444e80cSBarry Smith   PetscFunctionBegin;
2893444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
2903444e80cSBarry Smith   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)bm, pre));
2913444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
2923444e80cSBarry Smith }
2933444e80cSBarry Smith 
294cc4c1da9SBarry Smith /*@
2953444e80cSBarry Smith   PetscBenchSetSize - Sets the size of the `PetscBench` benchmark to run
2963444e80cSBarry Smith 
2973444e80cSBarry Smith   Logically Collective
2983444e80cSBarry Smith 
2993444e80cSBarry Smith   Input Parameters:
3003444e80cSBarry Smith + bm - the `PetscBench`
3013444e80cSBarry Smith - n  - the size
3023444e80cSBarry Smith 
3033444e80cSBarry Smith   Level: advanced
3043444e80cSBarry Smith 
3053444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchSetFromOptions()`, `PetscBenchRun()`, `PetscBenchViewFromOptions()`, `PetscBenchDestroy()`, `PetscBenchSetUp()`, `PetscBenchSetType()`,
3063444e80cSBarry Smith           `PetscBenchSetOptionsPrefix()`, `PetscBenchGetSize()`
3073444e80cSBarry Smith @*/
PetscBenchSetSize(PetscBench bm,PetscInt n)3083444e80cSBarry Smith PetscErrorCode PetscBenchSetSize(PetscBench bm, PetscInt n)
3093444e80cSBarry Smith {
3103444e80cSBarry Smith   PetscFunctionBegin;
3113444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
3123444e80cSBarry Smith   if (bm->size > 0 && bm->size != n && bm->setupcalled) {
3133444e80cSBarry Smith     PetscCall(PetscBenchReset(bm));
3143444e80cSBarry Smith     bm->setupcalled = PETSC_FALSE;
3153444e80cSBarry Smith   }
3163444e80cSBarry Smith   PetscCheck(n > 0, PetscObjectComm((PetscObject)bm), PETSC_ERR_ARG_OUTOFRANGE, "Illegal value of n. Must be > 0");
3173444e80cSBarry Smith   bm->size = n;
3183444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
3193444e80cSBarry Smith }
3203444e80cSBarry Smith 
321cc4c1da9SBarry Smith /*@
3223444e80cSBarry Smith   PetscBenchGetSize - Gets the size of the `PetscBench` benchmark to run
3233444e80cSBarry Smith 
3243444e80cSBarry Smith   Logically Collective
3253444e80cSBarry Smith 
3263444e80cSBarry Smith   Input Parameter:
3273444e80cSBarry Smith . bm - the `PetscBench`
3283444e80cSBarry Smith 
3293444e80cSBarry Smith   Output Parameter:
3303444e80cSBarry Smith . n - the size
3313444e80cSBarry Smith 
3323444e80cSBarry Smith   Level: advanced
3333444e80cSBarry Smith 
3343444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchSetFromOptions()`, `PetscBenchRun()`, `PetscBenchViewFromOptions()`, `PetscBenchDestroy()`, `PetscBenchSetUp()`, `PetscBenchSetType()`,
3353444e80cSBarry Smith           `PetscBenchSetOptionsPrefix()`, `PetscBenchSetSize()`
3363444e80cSBarry Smith @*/
PetscBenchGetSize(PetscBench bm,PetscInt * n)3373444e80cSBarry Smith PetscErrorCode PetscBenchGetSize(PetscBench bm, PetscInt *n)
3383444e80cSBarry Smith {
3393444e80cSBarry Smith   PetscFunctionBegin;
3403444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
3413444e80cSBarry Smith   PetscAssertPointer(n, 2);
3423444e80cSBarry Smith   *n = bm->size;
3433444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
3443444e80cSBarry Smith }
3453444e80cSBarry Smith 
346cc4c1da9SBarry Smith /*@
3473444e80cSBarry Smith   PetscBenchSetType - set the type of `PetscBench` benchmark to run
3483444e80cSBarry Smith 
3493444e80cSBarry Smith   Collective
3503444e80cSBarry Smith 
3513444e80cSBarry Smith   Input Parameters:
3523444e80cSBarry Smith + bm   - the `PetscBench`
3533444e80cSBarry Smith - type - a known method
3543444e80cSBarry Smith 
3553444e80cSBarry Smith   Options Database Key:
3563444e80cSBarry Smith . -bm_type <type> - Sets `PetscBench` type
3573444e80cSBarry Smith 
3583444e80cSBarry Smith   Level: advanced
3593444e80cSBarry Smith 
3603444e80cSBarry Smith   Developer Note:
3613444e80cSBarry Smith   `PetscBenchRegister()` is used to add new benchmark types
3623444e80cSBarry Smith 
3633444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchSetFromOptions()`, `PetscBenchRun()`, `PetscBenchViewFromOptions()`, `PetscBenchDestroy()`, `PetscBenchSetUp()`, `PetscBenchGetSize()`,
3643444e80cSBarry Smith           `PetscBenchSetOptionsPrefix()`, `PetscBenchSetSize()`, `PetscBenchGetType()`, `PetscBenchCreate()`
3653444e80cSBarry Smith @*/
PetscBenchSetType(PetscBench bm,PetscBenchType type)3663444e80cSBarry Smith PetscErrorCode PetscBenchSetType(PetscBench bm, PetscBenchType type)
3673444e80cSBarry Smith {
3683444e80cSBarry Smith   PetscBool match;
3693444e80cSBarry Smith   PetscErrorCode (*r)(PetscBench);
3703444e80cSBarry Smith 
3713444e80cSBarry Smith   PetscFunctionBegin;
3723444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
3733444e80cSBarry Smith   PetscAssertPointer(type, 2);
3743444e80cSBarry Smith 
3753444e80cSBarry Smith   PetscCall(PetscObjectTypeCompare((PetscObject)bm, type, &match));
3763444e80cSBarry Smith   if (match) PetscFunctionReturn(PETSC_SUCCESS);
3773444e80cSBarry Smith 
3783444e80cSBarry Smith   PetscCall(PetscFunctionListFind(PetscBenchList, type, &r));
3793444e80cSBarry Smith   PetscCheck(r, PetscObjectComm((PetscObject)bm), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unable to find requested PetscBench type %s", type);
3803444e80cSBarry Smith   /* Destroy the previous private BM context */
3813444e80cSBarry Smith   PetscTryTypeMethod(bm, destroy);
3823444e80cSBarry Smith   bm->ops->destroy = NULL;
3833444e80cSBarry Smith   bm->data         = NULL;
3843444e80cSBarry Smith 
3853444e80cSBarry Smith   PetscCall(PetscFunctionListDestroy(&((PetscObject)bm)->qlist));
3863444e80cSBarry Smith   /* Reinitialize function pointers in PetscBenchOps structure */
3873444e80cSBarry Smith   PetscCall(PetscMemzero(bm->ops, sizeof(struct _PetscBenchOps)));
3883444e80cSBarry Smith 
3893444e80cSBarry Smith   PetscCall(PetscObjectChangeTypeName((PetscObject)bm, type));
3903444e80cSBarry Smith   PetscCall((*r)(bm));
3913444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
3923444e80cSBarry Smith }
3933444e80cSBarry Smith 
394cc4c1da9SBarry Smith /*@
3953444e80cSBarry Smith   PetscBenchGetType - Gets the `PetscBenchType` (as a string) from the `PetscBench`
3963444e80cSBarry Smith   context.
3973444e80cSBarry Smith 
3983444e80cSBarry Smith   Not Collective
3993444e80cSBarry Smith 
4003444e80cSBarry Smith   Input Parameter:
4013444e80cSBarry Smith . bm - the `PetscBench`
4023444e80cSBarry Smith 
4033444e80cSBarry Smith   Output Parameter:
4043444e80cSBarry Smith . type - name of benchmark method
4053444e80cSBarry Smith 
4063444e80cSBarry Smith   Level: intermediate
4073444e80cSBarry Smith 
4083444e80cSBarry Smith .seealso: `PetscBench`, `PetscBenchType`, `PetscBenchSetType()`, `PetscBenchCreate()`
4093444e80cSBarry Smith @*/
PetscBenchGetType(PetscBench bm,PetscBenchType * type)4103444e80cSBarry Smith PetscErrorCode PetscBenchGetType(PetscBench bm, PetscBenchType *type)
4113444e80cSBarry Smith {
4123444e80cSBarry Smith   PetscFunctionBegin;
4133444e80cSBarry Smith   PetscValidHeaderSpecific(bm, BM_CLASSID, 1);
4143444e80cSBarry Smith   PetscAssertPointer(type, 2);
4153444e80cSBarry Smith   *type = ((PetscObject)bm)->type_name;
4163444e80cSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
4173444e80cSBarry Smith }
418