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 @*/ 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 @*/ 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 @*/ 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 @*/ 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 893444e80cSBarry Smith /*@C 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 @*/ 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 @*/ 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 @*/ 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 @*/ 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)); 1903444e80cSBarry Smith 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 199*ffeef943SBarry 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 @*/ 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 222*ffeef943SBarry 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 @*/ 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 @*/ 2613444e80cSBarry Smith PetscErrorCode PetscBenchCreate(MPI_Comm comm, PetscBench *bm) 2623444e80cSBarry Smith { 2633444e80cSBarry Smith PetscFunctionBegin; 2643444e80cSBarry Smith PetscAssertPointer(bm, 2); 2653444e80cSBarry Smith *bm = NULL; 2663444e80cSBarry Smith PetscCall(PetscBenchInitializePackage()); 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 @*/ 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 @*/ 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 @*/ 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 @*/ 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 @*/ 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