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