12764a2aaSMatthew G. Knepley #include <petsc-private/petscdsimpl.h> /*I "petscds.h" I*/ 22764a2aaSMatthew G. Knepley 32764a2aaSMatthew G. Knepley PetscClassId PETSCDS_CLASSID = 0; 42764a2aaSMatthew G. Knepley 52764a2aaSMatthew G. Knepley PetscFunctionList PetscDSList = NULL; 62764a2aaSMatthew G. Knepley PetscBool PetscDSRegisterAllCalled = PETSC_FALSE; 72764a2aaSMatthew G. Knepley 82764a2aaSMatthew G. Knepley #undef __FUNCT__ 92764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSRegister" 102764a2aaSMatthew G. Knepley /*@C 112764a2aaSMatthew G. Knepley PetscDSRegister - Adds a new PetscDS implementation 122764a2aaSMatthew G. Knepley 132764a2aaSMatthew G. Knepley Not Collective 142764a2aaSMatthew G. Knepley 152764a2aaSMatthew G. Knepley Input Parameters: 162764a2aaSMatthew G. Knepley + name - The name of a new user-defined creation routine 172764a2aaSMatthew G. Knepley - create_func - The creation routine itself 182764a2aaSMatthew G. Knepley 192764a2aaSMatthew G. Knepley Notes: 202764a2aaSMatthew G. Knepley PetscDSRegister() may be called multiple times to add several user-defined PetscDSs 212764a2aaSMatthew G. Knepley 222764a2aaSMatthew G. Knepley Sample usage: 232764a2aaSMatthew G. Knepley .vb 242764a2aaSMatthew G. Knepley PetscDSRegister("my_ds", MyPetscDSCreate); 252764a2aaSMatthew G. Knepley .ve 262764a2aaSMatthew G. Knepley 272764a2aaSMatthew G. Knepley Then, your PetscDS type can be chosen with the procedural interface via 282764a2aaSMatthew G. Knepley .vb 292764a2aaSMatthew G. Knepley PetscDSCreate(MPI_Comm, PetscDS *); 302764a2aaSMatthew G. Knepley PetscDSSetType(PetscDS, "my_ds"); 312764a2aaSMatthew G. Knepley .ve 322764a2aaSMatthew G. Knepley or at runtime via the option 332764a2aaSMatthew G. Knepley .vb 342764a2aaSMatthew G. Knepley -petscds_type my_ds 352764a2aaSMatthew G. Knepley .ve 362764a2aaSMatthew G. Knepley 372764a2aaSMatthew G. Knepley Level: advanced 382764a2aaSMatthew G. Knepley 392764a2aaSMatthew G. Knepley .keywords: PetscDS, register 402764a2aaSMatthew G. Knepley .seealso: PetscDSRegisterAll(), PetscDSRegisterDestroy() 412764a2aaSMatthew G. Knepley 422764a2aaSMatthew G. Knepley @*/ 432764a2aaSMatthew G. Knepley PetscErrorCode PetscDSRegister(const char sname[], PetscErrorCode (*function)(PetscDS)) 442764a2aaSMatthew G. Knepley { 452764a2aaSMatthew G. Knepley PetscErrorCode ierr; 462764a2aaSMatthew G. Knepley 472764a2aaSMatthew G. Knepley PetscFunctionBegin; 482764a2aaSMatthew G. Knepley ierr = PetscFunctionListAdd(&PetscDSList, sname, function);CHKERRQ(ierr); 492764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 502764a2aaSMatthew G. Knepley } 512764a2aaSMatthew G. Knepley 522764a2aaSMatthew G. Knepley #undef __FUNCT__ 532764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSSetType" 542764a2aaSMatthew G. Knepley /*@C 552764a2aaSMatthew G. Knepley PetscDSSetType - Builds a particular PetscDS 562764a2aaSMatthew G. Knepley 572764a2aaSMatthew G. Knepley Collective on PetscDS 582764a2aaSMatthew G. Knepley 592764a2aaSMatthew G. Knepley Input Parameters: 602764a2aaSMatthew G. Knepley + prob - The PetscDS object 612764a2aaSMatthew G. Knepley - name - The kind of system 622764a2aaSMatthew G. Knepley 632764a2aaSMatthew G. Knepley Options Database Key: 642764a2aaSMatthew G. Knepley . -petscds_type <type> - Sets the PetscDS type; use -help for a list of available types 652764a2aaSMatthew G. Knepley 662764a2aaSMatthew G. Knepley Level: intermediate 672764a2aaSMatthew G. Knepley 682764a2aaSMatthew G. Knepley .keywords: PetscDS, set, type 692764a2aaSMatthew G. Knepley .seealso: PetscDSGetType(), PetscDSCreate() 702764a2aaSMatthew G. Knepley @*/ 712764a2aaSMatthew G. Knepley PetscErrorCode PetscDSSetType(PetscDS prob, PetscDSType name) 722764a2aaSMatthew G. Knepley { 732764a2aaSMatthew G. Knepley PetscErrorCode (*r)(PetscDS); 742764a2aaSMatthew G. Knepley PetscBool match; 752764a2aaSMatthew G. Knepley PetscErrorCode ierr; 762764a2aaSMatthew G. Knepley 772764a2aaSMatthew G. Knepley PetscFunctionBegin; 782764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 792764a2aaSMatthew G. Knepley ierr = PetscObjectTypeCompare((PetscObject) prob, name, &match);CHKERRQ(ierr); 802764a2aaSMatthew G. Knepley if (match) PetscFunctionReturn(0); 812764a2aaSMatthew G. Knepley 822764a2aaSMatthew G. Knepley if (!PetscDSRegisterAllCalled) {ierr = PetscDSRegisterAll();CHKERRQ(ierr);} 832764a2aaSMatthew G. Knepley ierr = PetscFunctionListFind(PetscDSList, name, &r);CHKERRQ(ierr); 842764a2aaSMatthew G. Knepley if (!r) SETERRQ1(PetscObjectComm((PetscObject) prob), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscDS type: %s", name); 852764a2aaSMatthew G. Knepley 862764a2aaSMatthew G. Knepley if (prob->ops->destroy) { 872764a2aaSMatthew G. Knepley ierr = (*prob->ops->destroy)(prob);CHKERRQ(ierr); 882764a2aaSMatthew G. Knepley prob->ops->destroy = NULL; 892764a2aaSMatthew G. Knepley } 902764a2aaSMatthew G. Knepley ierr = (*r)(prob);CHKERRQ(ierr); 912764a2aaSMatthew G. Knepley ierr = PetscObjectChangeTypeName((PetscObject) prob, name);CHKERRQ(ierr); 922764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 932764a2aaSMatthew G. Knepley } 942764a2aaSMatthew G. Knepley 952764a2aaSMatthew G. Knepley #undef __FUNCT__ 962764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSGetType" 972764a2aaSMatthew G. Knepley /*@C 982764a2aaSMatthew G. Knepley PetscDSGetType - Gets the PetscDS type name (as a string) from the object. 992764a2aaSMatthew G. Knepley 1002764a2aaSMatthew G. Knepley Not Collective 1012764a2aaSMatthew G. Knepley 1022764a2aaSMatthew G. Knepley Input Parameter: 1032764a2aaSMatthew G. Knepley . prob - The PetscDS 1042764a2aaSMatthew G. Knepley 1052764a2aaSMatthew G. Knepley Output Parameter: 1062764a2aaSMatthew G. Knepley . name - The PetscDS type name 1072764a2aaSMatthew G. Knepley 1082764a2aaSMatthew G. Knepley Level: intermediate 1092764a2aaSMatthew G. Knepley 1102764a2aaSMatthew G. Knepley .keywords: PetscDS, get, type, name 1112764a2aaSMatthew G. Knepley .seealso: PetscDSSetType(), PetscDSCreate() 1122764a2aaSMatthew G. Knepley @*/ 1132764a2aaSMatthew G. Knepley PetscErrorCode PetscDSGetType(PetscDS prob, PetscDSType *name) 1142764a2aaSMatthew G. Knepley { 1152764a2aaSMatthew G. Knepley PetscErrorCode ierr; 1162764a2aaSMatthew G. Knepley 1172764a2aaSMatthew G. Knepley PetscFunctionBegin; 1182764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 119c959eef4SJed Brown PetscValidPointer(name, 2); 1202764a2aaSMatthew G. Knepley if (!PetscDSRegisterAllCalled) {ierr = PetscDSRegisterAll();CHKERRQ(ierr);} 1212764a2aaSMatthew G. Knepley *name = ((PetscObject) prob)->type_name; 1222764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 1232764a2aaSMatthew G. Knepley } 1242764a2aaSMatthew G. Knepley 1252764a2aaSMatthew G. Knepley #undef __FUNCT__ 1267d8a60eaSMatthew G. Knepley #define __FUNCT__ "PetscDSView_Ascii" 1277d8a60eaSMatthew G. Knepley static PetscErrorCode PetscDSView_Ascii(PetscDS prob, PetscViewer viewer) 1287d8a60eaSMatthew G. Knepley { 1297d8a60eaSMatthew G. Knepley PetscViewerFormat format; 1307d8a60eaSMatthew G. Knepley PetscInt f; 1317d8a60eaSMatthew G. Knepley PetscErrorCode ierr; 1327d8a60eaSMatthew G. Knepley 1337d8a60eaSMatthew G. Knepley PetscFunctionBegin; 1347d8a60eaSMatthew G. Knepley ierr = PetscViewerGetFormat(viewer, &format);CHKERRQ(ierr); 1357d8a60eaSMatthew G. Knepley ierr = PetscViewerASCIIPrintf(viewer, "Discrete System with %d fields\n", prob->Nf);CHKERRQ(ierr); 1367d8a60eaSMatthew G. Knepley ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1377d8a60eaSMatthew G. Knepley for (f = 0; f < prob->Nf; ++f) { 1387d8a60eaSMatthew G. Knepley PetscObject obj; 1397d8a60eaSMatthew G. Knepley PetscClassId id; 1407d8a60eaSMatthew G. Knepley const char *name; 1417d8a60eaSMatthew G. Knepley PetscInt Nc; 1427d8a60eaSMatthew G. Knepley 1437d8a60eaSMatthew G. Knepley ierr = PetscDSGetDiscretization(prob, f, &obj);CHKERRQ(ierr); 1447d8a60eaSMatthew G. Knepley ierr = PetscObjectGetClassId(obj, &id);CHKERRQ(ierr); 1457d8a60eaSMatthew G. Knepley ierr = PetscObjectGetName(obj, &name);CHKERRQ(ierr); 1467d8a60eaSMatthew G. Knepley ierr = PetscViewerASCIIPrintf(viewer, "Field %s", name ? name : "<unknown>");CHKERRQ(ierr); 1477d8a60eaSMatthew G. Knepley if (id == PETSCFE_CLASSID) { 1487d8a60eaSMatthew G. Knepley ierr = PetscFEGetNumComponents((PetscFE) obj, &Nc);CHKERRQ(ierr); 1497d8a60eaSMatthew G. Knepley ierr = PetscViewerASCIIPrintf(viewer, " FEM");CHKERRQ(ierr); 1507d8a60eaSMatthew G. Knepley } else if (id == PETSCFV_CLASSID) { 1517d8a60eaSMatthew G. Knepley ierr = PetscFVGetNumComponents((PetscFV) obj, &Nc);CHKERRQ(ierr); 1527d8a60eaSMatthew G. Knepley ierr = PetscViewerASCIIPrintf(viewer, " FVM");CHKERRQ(ierr); 1537d8a60eaSMatthew G. Knepley } 1547d8a60eaSMatthew G. Knepley else SETERRQ1(PetscObjectComm((PetscObject) prob), PETSC_ERR_ARG_WRONG, "Unknown discretization type for field %d", f); 1557d8a60eaSMatthew G. Knepley if (Nc > 1) {ierr = PetscViewerASCIIPrintf(viewer, "%d components", Nc);CHKERRQ(ierr);} 1567d8a60eaSMatthew G. Knepley else {ierr = PetscViewerASCIIPrintf(viewer, "%d component", Nc);CHKERRQ(ierr);} 1577d8a60eaSMatthew G. Knepley ierr = PetscViewerASCIIPrintf(viewer, "\n");CHKERRQ(ierr); 1587d8a60eaSMatthew G. Knepley if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 1597d8a60eaSMatthew G. Knepley if (id == PETSCFE_CLASSID) {ierr = PetscFEView((PetscFE) obj, viewer);CHKERRQ(ierr);} 1607d8a60eaSMatthew G. Knepley else if (id == PETSCFV_CLASSID) {ierr = PetscFVView((PetscFV) obj, viewer);CHKERRQ(ierr);} 1617d8a60eaSMatthew G. Knepley } 1627d8a60eaSMatthew G. Knepley } 1637d8a60eaSMatthew G. Knepley ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1647d8a60eaSMatthew G. Knepley PetscFunctionReturn(0); 1657d8a60eaSMatthew G. Knepley } 1667d8a60eaSMatthew G. Knepley 1677d8a60eaSMatthew G. Knepley #undef __FUNCT__ 1682764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSView" 1692764a2aaSMatthew G. Knepley /*@C 1702764a2aaSMatthew G. Knepley PetscDSView - Views a PetscDS 1712764a2aaSMatthew G. Knepley 1722764a2aaSMatthew G. Knepley Collective on PetscDS 1732764a2aaSMatthew G. Knepley 1742764a2aaSMatthew G. Knepley Input Parameter: 1752764a2aaSMatthew G. Knepley + prob - the PetscDS object to view 1762764a2aaSMatthew G. Knepley - v - the viewer 1772764a2aaSMatthew G. Knepley 1782764a2aaSMatthew G. Knepley Level: developer 1792764a2aaSMatthew G. Knepley 1802764a2aaSMatthew G. Knepley .seealso PetscDSDestroy() 1812764a2aaSMatthew G. Knepley @*/ 1822764a2aaSMatthew G. Knepley PetscErrorCode PetscDSView(PetscDS prob, PetscViewer v) 1832764a2aaSMatthew G. Knepley { 1847d8a60eaSMatthew G. Knepley PetscBool iascii; 1852764a2aaSMatthew G. Knepley PetscErrorCode ierr; 1862764a2aaSMatthew G. Knepley 1872764a2aaSMatthew G. Knepley PetscFunctionBegin; 1882764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 1892764a2aaSMatthew G. Knepley if (!v) {ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject) prob), &v);CHKERRQ(ierr);} 1907d8a60eaSMatthew G. Knepley else {PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 2);} 1917d8a60eaSMatthew G. Knepley ierr = PetscObjectTypeCompare((PetscObject) v, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr); 1927d8a60eaSMatthew G. Knepley if (iascii) {ierr = PetscDSView_Ascii(prob, v);CHKERRQ(ierr);} 1932764a2aaSMatthew G. Knepley if (prob->ops->view) {ierr = (*prob->ops->view)(prob, v);CHKERRQ(ierr);} 1942764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 1952764a2aaSMatthew G. Knepley } 1962764a2aaSMatthew G. Knepley 1972764a2aaSMatthew G. Knepley #undef __FUNCT__ 1982764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSViewFromOptions" 1992764a2aaSMatthew G. Knepley /* 2002764a2aaSMatthew G. Knepley PetscDSViewFromOptions - Processes command line options to determine if/how a PetscDS is to be viewed. 2012764a2aaSMatthew G. Knepley 2022764a2aaSMatthew G. Knepley Collective on PetscDS 2032764a2aaSMatthew G. Knepley 2042764a2aaSMatthew G. Knepley Input Parameters: 2052764a2aaSMatthew G. Knepley + prob - the PetscDS 2062764a2aaSMatthew G. Knepley . prefix - prefix to use for viewing, or NULL to use prefix of 'rnd' 2072764a2aaSMatthew G. Knepley - optionname - option to activate viewing 2082764a2aaSMatthew G. Knepley 2092764a2aaSMatthew G. Knepley Level: intermediate 2102764a2aaSMatthew G. Knepley 2112764a2aaSMatthew G. Knepley .keywords: PetscDS, view, options, database 2122764a2aaSMatthew G. Knepley .seealso: VecViewFromOptions(), MatViewFromOptions() 2132764a2aaSMatthew G. Knepley */ 2142764a2aaSMatthew G. Knepley PetscErrorCode PetscDSViewFromOptions(PetscDS prob, const char prefix[], const char optionname[]) 2152764a2aaSMatthew G. Knepley { 2162764a2aaSMatthew G. Knepley PetscViewer viewer; 2172764a2aaSMatthew G. Knepley PetscViewerFormat format; 2182764a2aaSMatthew G. Knepley PetscBool flg; 2192764a2aaSMatthew G. Knepley PetscErrorCode ierr; 2202764a2aaSMatthew G. Knepley 2212764a2aaSMatthew G. Knepley PetscFunctionBegin; 2222764a2aaSMatthew G. Knepley if (prefix) {ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject) prob), prefix, optionname, &viewer, &format, &flg);CHKERRQ(ierr);} 2232764a2aaSMatthew G. Knepley else {ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject) prob), ((PetscObject) prob)->prefix, optionname, &viewer, &format, &flg);CHKERRQ(ierr);} 2242764a2aaSMatthew G. Knepley if (flg) { 2252764a2aaSMatthew G. Knepley ierr = PetscViewerPushFormat(viewer, format);CHKERRQ(ierr); 2262764a2aaSMatthew G. Knepley ierr = PetscDSView(prob, viewer);CHKERRQ(ierr); 2272764a2aaSMatthew G. Knepley ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 2282764a2aaSMatthew G. Knepley ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 2292764a2aaSMatthew G. Knepley } 2302764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 2312764a2aaSMatthew G. Knepley } 2322764a2aaSMatthew G. Knepley 2332764a2aaSMatthew G. Knepley #undef __FUNCT__ 2342764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSSetFromOptions" 2352764a2aaSMatthew G. Knepley /*@ 2362764a2aaSMatthew G. Knepley PetscDSSetFromOptions - sets parameters in a PetscDS from the options database 2372764a2aaSMatthew G. Knepley 2382764a2aaSMatthew G. Knepley Collective on PetscDS 2392764a2aaSMatthew G. Knepley 2402764a2aaSMatthew G. Knepley Input Parameter: 2412764a2aaSMatthew G. Knepley . prob - the PetscDS object to set options for 2422764a2aaSMatthew G. Knepley 2432764a2aaSMatthew G. Knepley Options Database: 2442764a2aaSMatthew G. Knepley 2452764a2aaSMatthew G. Knepley Level: developer 2462764a2aaSMatthew G. Knepley 2472764a2aaSMatthew G. Knepley .seealso PetscDSView() 2482764a2aaSMatthew G. Knepley @*/ 2492764a2aaSMatthew G. Knepley PetscErrorCode PetscDSSetFromOptions(PetscDS prob) 2502764a2aaSMatthew G. Knepley { 2512764a2aaSMatthew G. Knepley const char *defaultType; 2522764a2aaSMatthew G. Knepley char name[256]; 2532764a2aaSMatthew G. Knepley PetscBool flg; 2542764a2aaSMatthew G. Knepley PetscErrorCode ierr; 2552764a2aaSMatthew G. Knepley 2562764a2aaSMatthew G. Knepley PetscFunctionBegin; 2572764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 2582764a2aaSMatthew G. Knepley if (!((PetscObject) prob)->type_name) { 2592764a2aaSMatthew G. Knepley defaultType = PETSCDSBASIC; 2602764a2aaSMatthew G. Knepley } else { 2612764a2aaSMatthew G. Knepley defaultType = ((PetscObject) prob)->type_name; 2622764a2aaSMatthew G. Knepley } 2632764a2aaSMatthew G. Knepley if (!PetscDSRegisterAllCalled) {ierr = PetscDSRegisterAll();CHKERRQ(ierr);} 2642764a2aaSMatthew G. Knepley 2652764a2aaSMatthew G. Knepley ierr = PetscObjectOptionsBegin((PetscObject) prob);CHKERRQ(ierr); 2662764a2aaSMatthew G. Knepley ierr = PetscOptionsFList("-petscds_type", "Discrete System", "PetscDSSetType", PetscDSList, defaultType, name, 256, &flg);CHKERRQ(ierr); 2672764a2aaSMatthew G. Knepley if (flg) { 2682764a2aaSMatthew G. Knepley ierr = PetscDSSetType(prob, name);CHKERRQ(ierr); 2692764a2aaSMatthew G. Knepley } else if (!((PetscObject) prob)->type_name) { 2702764a2aaSMatthew G. Knepley ierr = PetscDSSetType(prob, defaultType);CHKERRQ(ierr); 2712764a2aaSMatthew G. Knepley } 2722764a2aaSMatthew G. Knepley if (prob->ops->setfromoptions) {ierr = (*prob->ops->setfromoptions)(prob);CHKERRQ(ierr);} 2732764a2aaSMatthew G. Knepley /* process any options handlers added with PetscObjectAddOptionsHandler() */ 2742764a2aaSMatthew G. Knepley ierr = PetscObjectProcessOptionsHandlers((PetscObject) prob);CHKERRQ(ierr); 2752764a2aaSMatthew G. Knepley ierr = PetscOptionsEnd();CHKERRQ(ierr); 2762764a2aaSMatthew G. Knepley ierr = PetscDSViewFromOptions(prob, NULL, "-petscds_view");CHKERRQ(ierr); 2772764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 2782764a2aaSMatthew G. Knepley } 2792764a2aaSMatthew G. Knepley 2802764a2aaSMatthew G. Knepley #undef __FUNCT__ 2812764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSSetUp" 2822764a2aaSMatthew G. Knepley /*@C 2832764a2aaSMatthew G. Knepley PetscDSSetUp - Construct data structures for the PetscDS 2842764a2aaSMatthew G. Knepley 2852764a2aaSMatthew G. Knepley Collective on PetscDS 2862764a2aaSMatthew G. Knepley 2872764a2aaSMatthew G. Knepley Input Parameter: 2882764a2aaSMatthew G. Knepley . prob - the PetscDS object to setup 2892764a2aaSMatthew G. Knepley 2902764a2aaSMatthew G. Knepley Level: developer 2912764a2aaSMatthew G. Knepley 2922764a2aaSMatthew G. Knepley .seealso PetscDSView(), PetscDSDestroy() 2932764a2aaSMatthew G. Knepley @*/ 2942764a2aaSMatthew G. Knepley PetscErrorCode PetscDSSetUp(PetscDS prob) 2952764a2aaSMatthew G. Knepley { 2962764a2aaSMatthew G. Knepley const PetscInt Nf = prob->Nf; 2972764a2aaSMatthew G. Knepley PetscInt dim, work, NcMax = 0, NqMax = 0, f; 2982764a2aaSMatthew G. Knepley PetscErrorCode ierr; 2992764a2aaSMatthew G. Knepley 3002764a2aaSMatthew G. Knepley PetscFunctionBegin; 3012764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 3022764a2aaSMatthew G. Knepley if (prob->setup) PetscFunctionReturn(0); 3032764a2aaSMatthew G. Knepley /* Calculate sizes */ 3042764a2aaSMatthew G. Knepley ierr = PetscDSGetSpatialDimension(prob, &dim);CHKERRQ(ierr); 3052764a2aaSMatthew G. Knepley prob->totDim = prob->totDimBd = prob->totComp = 0; 3062764a2aaSMatthew G. Knepley ierr = PetscMalloc4(Nf,&prob->basis,Nf,&prob->basisDer,Nf,&prob->basisBd,Nf,&prob->basisDerBd);CHKERRQ(ierr); 3072764a2aaSMatthew G. Knepley for (f = 0; f < Nf; ++f) { 3082764a2aaSMatthew G. Knepley PetscFE feBd = (PetscFE) prob->discBd[f]; 3099de99aefSMatthew G. Knepley PetscObject obj; 3109de99aefSMatthew G. Knepley PetscClassId id; 3112764a2aaSMatthew G. Knepley PetscQuadrature q; 3129de99aefSMatthew G. Knepley PetscInt Nq = 0, Nb, Nc; 3132764a2aaSMatthew G. Knepley 3149de99aefSMatthew G. Knepley ierr = PetscDSGetDiscretization(prob, f, &obj);CHKERRQ(ierr); 3159de99aefSMatthew G. Knepley ierr = PetscObjectGetClassId(obj, &id);CHKERRQ(ierr); 3169de99aefSMatthew G. Knepley if (id == PETSCFE_CLASSID) { 3179de99aefSMatthew G. Knepley PetscFE fe = (PetscFE) obj; 3189de99aefSMatthew G. Knepley 3192764a2aaSMatthew G. Knepley ierr = PetscFEGetQuadrature(fe, &q);CHKERRQ(ierr); 3202764a2aaSMatthew G. Knepley ierr = PetscFEGetDimension(fe, &Nb);CHKERRQ(ierr); 3212764a2aaSMatthew G. Knepley ierr = PetscFEGetNumComponents(fe, &Nc);CHKERRQ(ierr); 3222764a2aaSMatthew G. Knepley ierr = PetscFEGetDefaultTabulation(fe, &prob->basis[f], &prob->basisDer[f], NULL);CHKERRQ(ierr); 3239de99aefSMatthew G. Knepley } else if (id == PETSCFV_CLASSID) { 3249de99aefSMatthew G. Knepley PetscFV fv = (PetscFV) obj; 3259de99aefSMatthew G. Knepley 3269de99aefSMatthew G. Knepley ierr = PetscFVGetQuadrature(fv, &q);CHKERRQ(ierr); 3279de99aefSMatthew G. Knepley Nb = 1; 3289de99aefSMatthew G. Knepley ierr = PetscFVGetNumComponents(fv, &Nc);CHKERRQ(ierr); 3296c1a3d01SMatthew G. Knepley ierr = PetscFVGetDefaultTabulation(fv, &prob->basis[f], &prob->basisDer[f], NULL);CHKERRQ(ierr); 330abac5ca0SMatthew G. Knepley } else SETERRQ1(PetscObjectComm((PetscObject) prob), PETSC_ERR_ARG_WRONG, "Unknown discretization type for field %d", f); 3319de99aefSMatthew G. Knepley if (q) {ierr = PetscQuadratureGetData(q, NULL, &Nq, NULL, NULL);CHKERRQ(ierr);} 3322764a2aaSMatthew G. Knepley NqMax = PetscMax(NqMax, Nq); 3332764a2aaSMatthew G. Knepley NcMax = PetscMax(NcMax, Nc); 3342764a2aaSMatthew G. Knepley prob->totDim += Nb*Nc; 3352764a2aaSMatthew G. Knepley prob->totComp += Nc; 3362764a2aaSMatthew G. Knepley if (feBd) { 3372764a2aaSMatthew G. Knepley ierr = PetscFEGetDimension(feBd, &Nb);CHKERRQ(ierr); 3382764a2aaSMatthew G. Knepley ierr = PetscFEGetNumComponents(feBd, &Nc);CHKERRQ(ierr); 3392764a2aaSMatthew G. Knepley ierr = PetscFEGetDefaultTabulation(feBd, &prob->basisBd[f], &prob->basisDerBd[f], NULL);CHKERRQ(ierr); 3402764a2aaSMatthew G. Knepley prob->totDimBd += Nb*Nc; 3412764a2aaSMatthew G. Knepley } 3422764a2aaSMatthew G. Knepley } 3432764a2aaSMatthew G. Knepley work = PetscMax(prob->totComp*dim, PetscSqr(NcMax*dim)); 3442764a2aaSMatthew G. Knepley /* Allocate works space */ 3452764a2aaSMatthew G. Knepley ierr = PetscMalloc5(prob->totComp,&prob->u,prob->totComp,&prob->u_t,prob->totComp*dim,&prob->u_x,dim,&prob->x,work,&prob->refSpaceDer);CHKERRQ(ierr); 3462764a2aaSMatthew G. Knepley ierr = PetscMalloc6(NqMax*NcMax,&prob->f0,NqMax*NcMax*dim,&prob->f1,NqMax*NcMax*NcMax,&prob->g0,NqMax*NcMax*NcMax*dim,&prob->g1,NqMax*NcMax*NcMax*dim,&prob->g2,NqMax*NcMax*NcMax*dim*dim,&prob->g3);CHKERRQ(ierr); 3472764a2aaSMatthew G. Knepley if (prob->ops->setup) {ierr = (*prob->ops->setup)(prob);CHKERRQ(ierr);} 3482764a2aaSMatthew G. Knepley prob->setup = PETSC_TRUE; 3492764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 3502764a2aaSMatthew G. Knepley } 3512764a2aaSMatthew G. Knepley 3522764a2aaSMatthew G. Knepley #undef __FUNCT__ 3532764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSDestroyStructs_Static" 3542764a2aaSMatthew G. Knepley static PetscErrorCode PetscDSDestroyStructs_Static(PetscDS prob) 3552764a2aaSMatthew G. Knepley { 3562764a2aaSMatthew G. Knepley PetscErrorCode ierr; 3572764a2aaSMatthew G. Knepley 3582764a2aaSMatthew G. Knepley PetscFunctionBegin; 3592764a2aaSMatthew G. Knepley ierr = PetscFree4(prob->basis,prob->basisDer,prob->basisBd,prob->basisDerBd);CHKERRQ(ierr); 3602764a2aaSMatthew G. Knepley ierr = PetscFree5(prob->u,prob->u_t,prob->u_x,prob->x,prob->refSpaceDer);CHKERRQ(ierr); 3612764a2aaSMatthew G. Knepley ierr = PetscFree6(prob->f0,prob->f1,prob->g0,prob->g1,prob->g2,prob->g3);CHKERRQ(ierr); 3622764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 3632764a2aaSMatthew G. Knepley } 3642764a2aaSMatthew G. Knepley 3652764a2aaSMatthew G. Knepley #undef __FUNCT__ 3662764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSEnlarge_Static" 3672764a2aaSMatthew G. Knepley static PetscErrorCode PetscDSEnlarge_Static(PetscDS prob, PetscInt NfNew) 3682764a2aaSMatthew G. Knepley { 3692764a2aaSMatthew G. Knepley PetscObject *tmpd, *tmpdbd; 3702764a2aaSMatthew G. Knepley PointFunc *tmpobj, *tmpf, *tmpg; 3712764a2aaSMatthew G. Knepley BdPointFunc *tmpfbd, *tmpgbd; 3720c2f2876SMatthew G. Knepley RiemannFunc *tmpr; 3730c2f2876SMatthew G. Knepley void **tmpctx; 3742764a2aaSMatthew G. Knepley PetscInt Nf = prob->Nf, f; 3752764a2aaSMatthew G. Knepley PetscErrorCode ierr; 3762764a2aaSMatthew G. Knepley 3772764a2aaSMatthew G. Knepley PetscFunctionBegin; 3782764a2aaSMatthew G. Knepley if (Nf >= NfNew) PetscFunctionReturn(0); 3792764a2aaSMatthew G. Knepley prob->setup = PETSC_FALSE; 3802764a2aaSMatthew G. Knepley ierr = PetscDSDestroyStructs_Static(prob);CHKERRQ(ierr); 3812764a2aaSMatthew G. Knepley ierr = PetscMalloc1(NfNew, &tmpd);CHKERRQ(ierr); 3822764a2aaSMatthew G. Knepley for (f = 0; f < Nf; ++f) tmpd[f] = prob->disc[f]; 3832764a2aaSMatthew G. Knepley for (f = Nf; f < NfNew; ++f) {ierr = PetscContainerCreate(PetscObjectComm((PetscObject) prob), (PetscContainer *) &tmpd[f]);CHKERRQ(ierr);} 3842764a2aaSMatthew G. Knepley ierr = PetscFree(prob->disc);CHKERRQ(ierr); 3852764a2aaSMatthew G. Knepley prob->Nf = NfNew; 3862764a2aaSMatthew G. Knepley prob->disc = tmpd; 3870c2f2876SMatthew G. Knepley ierr = PetscCalloc5(NfNew, &tmpobj, NfNew*2, &tmpf, NfNew*NfNew*4, &tmpg, NfNew, &tmpr, NfNew, &tmpctx);CHKERRQ(ierr); 3882764a2aaSMatthew G. Knepley for (f = 0; f < Nf; ++f) tmpobj[f] = prob->obj[f]; 3892764a2aaSMatthew G. Knepley for (f = 0; f < Nf*2; ++f) tmpf[f] = prob->f[f]; 3902764a2aaSMatthew G. Knepley for (f = 0; f < Nf*Nf*4; ++f) tmpg[f] = prob->g[f]; 3910c2f2876SMatthew G. Knepley for (f = 0; f < Nf; ++f) tmpr[f] = prob->r[f]; 3920c2f2876SMatthew G. Knepley for (f = 0; f < Nf; ++f) tmpctx[f] = prob->ctx[f]; 3932764a2aaSMatthew G. Knepley for (f = Nf; f < NfNew; ++f) tmpobj[f] = NULL; 3942764a2aaSMatthew G. Knepley for (f = Nf*2; f < NfNew*2; ++f) tmpf[f] = NULL; 3952764a2aaSMatthew G. Knepley for (f = Nf*Nf*4; f < NfNew*NfNew*4; ++f) tmpg[f] = NULL; 3960c2f2876SMatthew G. Knepley for (f = Nf; f < NfNew; ++f) tmpr[f] = NULL; 3970c2f2876SMatthew G. Knepley for (f = Nf; f < NfNew; ++f) tmpctx[f] = NULL; 3980c2f2876SMatthew G. Knepley ierr = PetscFree5(prob->obj, prob->f, prob->g, prob->r, prob->ctx);CHKERRQ(ierr); 3992764a2aaSMatthew G. Knepley prob->obj = tmpobj; 4002764a2aaSMatthew G. Knepley prob->f = tmpf; 4012764a2aaSMatthew G. Knepley prob->g = tmpg; 4020c2f2876SMatthew G. Knepley prob->r = tmpr; 4030c2f2876SMatthew G. Knepley prob->ctx = tmpctx; 4042764a2aaSMatthew G. Knepley ierr = PetscMalloc1(NfNew, &tmpdbd);CHKERRQ(ierr); 4052764a2aaSMatthew G. Knepley for (f = 0; f < Nf; ++f) tmpdbd[f] = prob->discBd[f]; 4062764a2aaSMatthew G. Knepley for (f = Nf; f < NfNew; ++f) tmpdbd[f] = NULL; 4072764a2aaSMatthew G. Knepley ierr = PetscFree(prob->discBd);CHKERRQ(ierr); 4082764a2aaSMatthew G. Knepley prob->discBd = tmpdbd; 4092764a2aaSMatthew G. Knepley ierr = PetscCalloc2(NfNew*2, &tmpfbd, NfNew*NfNew*4, &tmpgbd);CHKERRQ(ierr); 4102764a2aaSMatthew G. Knepley for (f = 0; f < Nf*2; ++f) tmpfbd[f] = prob->fBd[f]; 4112764a2aaSMatthew G. Knepley for (f = 0; f < Nf*Nf*4; ++f) tmpgbd[f] = prob->gBd[f]; 4122764a2aaSMatthew G. Knepley for (f = Nf*2; f < NfNew*2; ++f) tmpfbd[f] = NULL; 4132764a2aaSMatthew G. Knepley for (f = Nf*Nf*4; f < NfNew*NfNew*4; ++f) tmpgbd[f] = NULL; 4142764a2aaSMatthew G. Knepley ierr = PetscFree2(prob->fBd, prob->gBd);CHKERRQ(ierr); 4152764a2aaSMatthew G. Knepley prob->fBd = tmpfbd; 4162764a2aaSMatthew G. Knepley prob->gBd = tmpgbd; 4172764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 4182764a2aaSMatthew G. Knepley } 4192764a2aaSMatthew G. Knepley 4202764a2aaSMatthew G. Knepley #undef __FUNCT__ 4212764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSDestroy" 4222764a2aaSMatthew G. Knepley /*@ 4232764a2aaSMatthew G. Knepley PetscDSDestroy - Destroys a PetscDS object 4242764a2aaSMatthew G. Knepley 4252764a2aaSMatthew G. Knepley Collective on PetscDS 4262764a2aaSMatthew G. Knepley 4272764a2aaSMatthew G. Knepley Input Parameter: 4282764a2aaSMatthew G. Knepley . prob - the PetscDS object to destroy 4292764a2aaSMatthew G. Knepley 4302764a2aaSMatthew G. Knepley Level: developer 4312764a2aaSMatthew G. Knepley 4322764a2aaSMatthew G. Knepley .seealso PetscDSView() 4332764a2aaSMatthew G. Knepley @*/ 4342764a2aaSMatthew G. Knepley PetscErrorCode PetscDSDestroy(PetscDS *prob) 4352764a2aaSMatthew G. Knepley { 4362764a2aaSMatthew G. Knepley PetscInt f; 4372764a2aaSMatthew G. Knepley PetscErrorCode ierr; 4382764a2aaSMatthew G. Knepley 4392764a2aaSMatthew G. Knepley PetscFunctionBegin; 4402764a2aaSMatthew G. Knepley if (!*prob) PetscFunctionReturn(0); 4412764a2aaSMatthew G. Knepley PetscValidHeaderSpecific((*prob), PETSCDS_CLASSID, 1); 4422764a2aaSMatthew G. Knepley 4432764a2aaSMatthew G. Knepley if (--((PetscObject)(*prob))->refct > 0) {*prob = 0; PetscFunctionReturn(0);} 4442764a2aaSMatthew G. Knepley ((PetscObject) (*prob))->refct = 0; 4452764a2aaSMatthew G. Knepley ierr = PetscDSDestroyStructs_Static(*prob);CHKERRQ(ierr); 4462764a2aaSMatthew G. Knepley for (f = 0; f < (*prob)->Nf; ++f) { 4472764a2aaSMatthew G. Knepley ierr = PetscObjectDereference((*prob)->disc[f]);CHKERRQ(ierr); 4482764a2aaSMatthew G. Knepley ierr = PetscObjectDereference((*prob)->discBd[f]);CHKERRQ(ierr); 4492764a2aaSMatthew G. Knepley } 4502764a2aaSMatthew G. Knepley ierr = PetscFree((*prob)->disc);CHKERRQ(ierr); 4512764a2aaSMatthew G. Knepley ierr = PetscFree((*prob)->discBd);CHKERRQ(ierr); 4520c2f2876SMatthew G. Knepley ierr = PetscFree5((*prob)->obj,(*prob)->f,(*prob)->g,(*prob)->r,(*prob)->ctx);CHKERRQ(ierr); 4532764a2aaSMatthew G. Knepley ierr = PetscFree2((*prob)->fBd,(*prob)->gBd);CHKERRQ(ierr); 4542764a2aaSMatthew G. Knepley if ((*prob)->ops->destroy) {ierr = (*(*prob)->ops->destroy)(*prob);CHKERRQ(ierr);} 4552764a2aaSMatthew G. Knepley ierr = PetscHeaderDestroy(prob);CHKERRQ(ierr); 4562764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 4572764a2aaSMatthew G. Knepley } 4582764a2aaSMatthew G. Knepley 4592764a2aaSMatthew G. Knepley #undef __FUNCT__ 4602764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSCreate" 4612764a2aaSMatthew G. Knepley /*@ 4622764a2aaSMatthew G. Knepley PetscDSCreate - Creates an empty PetscDS object. The type can then be set with PetscDSSetType(). 4632764a2aaSMatthew G. Knepley 4642764a2aaSMatthew G. Knepley Collective on MPI_Comm 4652764a2aaSMatthew G. Knepley 4662764a2aaSMatthew G. Knepley Input Parameter: 4672764a2aaSMatthew G. Knepley . comm - The communicator for the PetscDS object 4682764a2aaSMatthew G. Knepley 4692764a2aaSMatthew G. Knepley Output Parameter: 4702764a2aaSMatthew G. Knepley . prob - The PetscDS object 4712764a2aaSMatthew G. Knepley 4722764a2aaSMatthew G. Knepley Level: beginner 4732764a2aaSMatthew G. Knepley 4742764a2aaSMatthew G. Knepley .seealso: PetscDSSetType(), PETSCDSBASIC 4752764a2aaSMatthew G. Knepley @*/ 4762764a2aaSMatthew G. Knepley PetscErrorCode PetscDSCreate(MPI_Comm comm, PetscDS *prob) 4772764a2aaSMatthew G. Knepley { 4782764a2aaSMatthew G. Knepley PetscDS p; 4792764a2aaSMatthew G. Knepley PetscErrorCode ierr; 4802764a2aaSMatthew G. Knepley 4812764a2aaSMatthew G. Knepley PetscFunctionBegin; 4822764a2aaSMatthew G. Knepley PetscValidPointer(prob, 2); 4832764a2aaSMatthew G. Knepley *prob = NULL; 4842764a2aaSMatthew G. Knepley ierr = PetscDSInitializePackage();CHKERRQ(ierr); 4852764a2aaSMatthew G. Knepley 4862764a2aaSMatthew G. Knepley ierr = PetscHeaderCreate(p, _p_PetscDS, struct _PetscDSOps, PETSCDS_CLASSID, "PetscDS", "Discrete System", "PetscDS", comm, PetscDSDestroy, PetscDSView);CHKERRQ(ierr); 4872764a2aaSMatthew G. Knepley ierr = PetscMemzero(p->ops, sizeof(struct _PetscDSOps));CHKERRQ(ierr); 4882764a2aaSMatthew G. Knepley 4892764a2aaSMatthew G. Knepley p->Nf = 0; 4902764a2aaSMatthew G. Knepley p->setup = PETSC_FALSE; 4912764a2aaSMatthew G. Knepley 4922764a2aaSMatthew G. Knepley *prob = p; 4932764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 4942764a2aaSMatthew G. Knepley } 4952764a2aaSMatthew G. Knepley 4962764a2aaSMatthew G. Knepley #undef __FUNCT__ 4972764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSGetNumFields" 498bc4ae4beSMatthew G. Knepley /*@ 499bc4ae4beSMatthew G. Knepley PetscDSGetNumFields - Returns the number of fields in the DS 500bc4ae4beSMatthew G. Knepley 501bc4ae4beSMatthew G. Knepley Not collective 502bc4ae4beSMatthew G. Knepley 503bc4ae4beSMatthew G. Knepley Input Parameter: 504bc4ae4beSMatthew G. Knepley . prob - The PetscDS object 505bc4ae4beSMatthew G. Knepley 506bc4ae4beSMatthew G. Knepley Output Parameter: 507bc4ae4beSMatthew G. Knepley . Nf - The number of fields 508bc4ae4beSMatthew G. Knepley 509bc4ae4beSMatthew G. Knepley Level: beginner 510bc4ae4beSMatthew G. Knepley 511bc4ae4beSMatthew G. Knepley .seealso: PetscDSGetSpatialDimension(), PetscDSCreate() 512bc4ae4beSMatthew G. Knepley @*/ 5132764a2aaSMatthew G. Knepley PetscErrorCode PetscDSGetNumFields(PetscDS prob, PetscInt *Nf) 5142764a2aaSMatthew G. Knepley { 5152764a2aaSMatthew G. Knepley PetscFunctionBegin; 5162764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 5172764a2aaSMatthew G. Knepley PetscValidPointer(Nf, 2); 5182764a2aaSMatthew G. Knepley *Nf = prob->Nf; 5192764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 5202764a2aaSMatthew G. Knepley } 5212764a2aaSMatthew G. Knepley 5222764a2aaSMatthew G. Knepley #undef __FUNCT__ 5232764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSGetSpatialDimension" 524bc4ae4beSMatthew G. Knepley /*@ 525bc4ae4beSMatthew G. Knepley PetscDSGetSpatialDimension - Returns the spatial dimension of the DS 526bc4ae4beSMatthew G. Knepley 527bc4ae4beSMatthew G. Knepley Not collective 528bc4ae4beSMatthew G. Knepley 529bc4ae4beSMatthew G. Knepley Input Parameter: 530bc4ae4beSMatthew G. Knepley . prob - The PetscDS object 531bc4ae4beSMatthew G. Knepley 532bc4ae4beSMatthew G. Knepley Output Parameter: 533bc4ae4beSMatthew G. Knepley . dim - The spatial dimension 534bc4ae4beSMatthew G. Knepley 535bc4ae4beSMatthew G. Knepley Level: beginner 536bc4ae4beSMatthew G. Knepley 537bc4ae4beSMatthew G. Knepley .seealso: PetscDSGetNumFields(), PetscDSCreate() 538bc4ae4beSMatthew G. Knepley @*/ 5392764a2aaSMatthew G. Knepley PetscErrorCode PetscDSGetSpatialDimension(PetscDS prob, PetscInt *dim) 5402764a2aaSMatthew G. Knepley { 5412764a2aaSMatthew G. Knepley PetscErrorCode ierr; 5422764a2aaSMatthew G. Knepley 5432764a2aaSMatthew G. Knepley PetscFunctionBegin; 5442764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 5452764a2aaSMatthew G. Knepley PetscValidPointer(dim, 2); 5462764a2aaSMatthew G. Knepley *dim = 0; 5479de99aefSMatthew G. Knepley if (prob->Nf) { 5489de99aefSMatthew G. Knepley PetscObject obj; 5499de99aefSMatthew G. Knepley PetscClassId id; 5509de99aefSMatthew G. Knepley 5519de99aefSMatthew G. Knepley ierr = PetscDSGetDiscretization(prob, 0, &obj);CHKERRQ(ierr); 5529de99aefSMatthew G. Knepley ierr = PetscObjectGetClassId(obj, &id);CHKERRQ(ierr); 5539de99aefSMatthew G. Knepley if (id == PETSCFE_CLASSID) {ierr = PetscFEGetSpatialDimension((PetscFE) obj, dim);CHKERRQ(ierr);} 5549de99aefSMatthew G. Knepley else if (id == PETSCFV_CLASSID) {ierr = PetscFVGetSpatialDimension((PetscFV) obj, dim);CHKERRQ(ierr);} 5559de99aefSMatthew G. Knepley else SETERRQ1(PetscObjectComm((PetscObject) prob), PETSC_ERR_ARG_WRONG, "Unknown discretization type for field %d", 0); 5569de99aefSMatthew G. Knepley } 5572764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 5582764a2aaSMatthew G. Knepley } 5592764a2aaSMatthew G. Knepley 5602764a2aaSMatthew G. Knepley #undef __FUNCT__ 5612764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSGetTotalDimension" 562bc4ae4beSMatthew G. Knepley /*@ 563bc4ae4beSMatthew G. Knepley PetscDSGetTotalDimension - Returns the total size of the approximation space for this system 564bc4ae4beSMatthew G. Knepley 565bc4ae4beSMatthew G. Knepley Not collective 566bc4ae4beSMatthew G. Knepley 567bc4ae4beSMatthew G. Knepley Input Parameter: 568bc4ae4beSMatthew G. Knepley . prob - The PetscDS object 569bc4ae4beSMatthew G. Knepley 570bc4ae4beSMatthew G. Knepley Output Parameter: 571bc4ae4beSMatthew G. Knepley . dim - The total problem dimension 572bc4ae4beSMatthew G. Knepley 573bc4ae4beSMatthew G. Knepley Level: beginner 574bc4ae4beSMatthew G. Knepley 575bc4ae4beSMatthew G. Knepley .seealso: PetscDSGetNumFields(), PetscDSCreate() 576bc4ae4beSMatthew G. Knepley @*/ 5772764a2aaSMatthew G. Knepley PetscErrorCode PetscDSGetTotalDimension(PetscDS prob, PetscInt *dim) 5782764a2aaSMatthew G. Knepley { 5792764a2aaSMatthew G. Knepley PetscErrorCode ierr; 5802764a2aaSMatthew G. Knepley 5812764a2aaSMatthew G. Knepley PetscFunctionBegin; 5822764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 5832764a2aaSMatthew G. Knepley ierr = PetscDSSetUp(prob);CHKERRQ(ierr); 5842764a2aaSMatthew G. Knepley PetscValidPointer(dim, 2); 5852764a2aaSMatthew G. Knepley *dim = prob->totDim; 5862764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 5872764a2aaSMatthew G. Knepley } 5882764a2aaSMatthew G. Knepley 5892764a2aaSMatthew G. Knepley #undef __FUNCT__ 5902764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSGetTotalBdDimension" 591bc4ae4beSMatthew G. Knepley /*@ 592c3ac4435SMatthew G. Knepley PetscDSGetTotalBdDimension - Returns the total size of the boundary approximation space for this system 593bc4ae4beSMatthew G. Knepley 594bc4ae4beSMatthew G. Knepley Not collective 595bc4ae4beSMatthew G. Knepley 596bc4ae4beSMatthew G. Knepley Input Parameter: 597bc4ae4beSMatthew G. Knepley . prob - The PetscDS object 598bc4ae4beSMatthew G. Knepley 599bc4ae4beSMatthew G. Knepley Output Parameter: 600bc4ae4beSMatthew G. Knepley . dim - The total boundary problem dimension 601bc4ae4beSMatthew G. Knepley 602bc4ae4beSMatthew G. Knepley Level: beginner 603bc4ae4beSMatthew G. Knepley 604bc4ae4beSMatthew G. Knepley .seealso: PetscDSGetNumFields(), PetscDSCreate() 605bc4ae4beSMatthew G. Knepley @*/ 6062764a2aaSMatthew G. Knepley PetscErrorCode PetscDSGetTotalBdDimension(PetscDS prob, PetscInt *dim) 6072764a2aaSMatthew G. Knepley { 6082764a2aaSMatthew G. Knepley PetscErrorCode ierr; 6092764a2aaSMatthew G. Knepley 6102764a2aaSMatthew G. Knepley PetscFunctionBegin; 6112764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 6122764a2aaSMatthew G. Knepley ierr = PetscDSSetUp(prob);CHKERRQ(ierr); 6132764a2aaSMatthew G. Knepley PetscValidPointer(dim, 2); 6142764a2aaSMatthew G. Knepley *dim = prob->totDimBd; 6152764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 6162764a2aaSMatthew G. Knepley } 6172764a2aaSMatthew G. Knepley 6182764a2aaSMatthew G. Knepley #undef __FUNCT__ 6192764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSGetTotalComponents" 620bc4ae4beSMatthew G. Knepley /*@ 621bc4ae4beSMatthew G. Knepley PetscDSGetTotalComponents - Returns the total number of components in this system 622bc4ae4beSMatthew G. Knepley 623bc4ae4beSMatthew G. Knepley Not collective 624bc4ae4beSMatthew G. Knepley 625bc4ae4beSMatthew G. Knepley Input Parameter: 626bc4ae4beSMatthew G. Knepley . prob - The PetscDS object 627bc4ae4beSMatthew G. Knepley 628bc4ae4beSMatthew G. Knepley Output Parameter: 629bc4ae4beSMatthew G. Knepley . dim - The total number of components 630bc4ae4beSMatthew G. Knepley 631bc4ae4beSMatthew G. Knepley Level: beginner 632bc4ae4beSMatthew G. Knepley 633bc4ae4beSMatthew G. Knepley .seealso: PetscDSGetNumFields(), PetscDSCreate() 634bc4ae4beSMatthew G. Knepley @*/ 6352764a2aaSMatthew G. Knepley PetscErrorCode PetscDSGetTotalComponents(PetscDS prob, PetscInt *Nc) 6362764a2aaSMatthew G. Knepley { 6372764a2aaSMatthew G. Knepley PetscErrorCode ierr; 6382764a2aaSMatthew G. Knepley 6392764a2aaSMatthew G. Knepley PetscFunctionBegin; 6402764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 6412764a2aaSMatthew G. Knepley ierr = PetscDSSetUp(prob);CHKERRQ(ierr); 6422764a2aaSMatthew G. Knepley PetscValidPointer(Nc, 2); 6432764a2aaSMatthew G. Knepley *Nc = prob->totComp; 6442764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 6452764a2aaSMatthew G. Knepley } 6462764a2aaSMatthew G. Knepley 6472764a2aaSMatthew G. Knepley #undef __FUNCT__ 6482764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSGetDiscretization" 649bc4ae4beSMatthew G. Knepley /*@ 650bc4ae4beSMatthew G. Knepley PetscDSGetDiscretization - Returns the discretization object for the given field 651bc4ae4beSMatthew G. Knepley 652bc4ae4beSMatthew G. Knepley Not collective 653bc4ae4beSMatthew G. Knepley 654bc4ae4beSMatthew G. Knepley Input Parameters: 655bc4ae4beSMatthew G. Knepley + prob - The PetscDS object 656bc4ae4beSMatthew G. Knepley - f - The field number 657bc4ae4beSMatthew G. Knepley 658bc4ae4beSMatthew G. Knepley Output Parameter: 659bc4ae4beSMatthew G. Knepley . disc - The discretization object 660bc4ae4beSMatthew G. Knepley 661bc4ae4beSMatthew G. Knepley Level: beginner 662bc4ae4beSMatthew G. Knepley 663bc4ae4beSMatthew G. Knepley .seealso: PetscDSSetDiscretization(), PetscDSAddDiscretization(), PetscDSGetBdDiscretization(), PetscDSGetNumFields(), PetscDSCreate() 664bc4ae4beSMatthew G. Knepley @*/ 6652764a2aaSMatthew G. Knepley PetscErrorCode PetscDSGetDiscretization(PetscDS prob, PetscInt f, PetscObject *disc) 6662764a2aaSMatthew G. Knepley { 6672764a2aaSMatthew G. Knepley PetscFunctionBegin; 6682764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 6692764a2aaSMatthew G. Knepley PetscValidPointer(disc, 3); 6702764a2aaSMatthew G. Knepley if ((f < 0) || (f >= prob->Nf)) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be in [0, %d)", f, prob->Nf); 6712764a2aaSMatthew G. Knepley *disc = prob->disc[f]; 6722764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 6732764a2aaSMatthew G. Knepley } 6742764a2aaSMatthew G. Knepley 6752764a2aaSMatthew G. Knepley #undef __FUNCT__ 6762764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSGetBdDiscretization" 677bc4ae4beSMatthew G. Knepley /*@ 678bc4ae4beSMatthew G. Knepley PetscDSGetBdDiscretization - Returns the boundary discretization object for the given field 679bc4ae4beSMatthew G. Knepley 680bc4ae4beSMatthew G. Knepley Not collective 681bc4ae4beSMatthew G. Knepley 682bc4ae4beSMatthew G. Knepley Input Parameters: 683bc4ae4beSMatthew G. Knepley + prob - The PetscDS object 684bc4ae4beSMatthew G. Knepley - f - The field number 685bc4ae4beSMatthew G. Knepley 686bc4ae4beSMatthew G. Knepley Output Parameter: 687bc4ae4beSMatthew G. Knepley . disc - The boundary discretization object 688bc4ae4beSMatthew G. Knepley 689bc4ae4beSMatthew G. Knepley Level: beginner 690bc4ae4beSMatthew G. Knepley 691bc4ae4beSMatthew G. Knepley .seealso: PetscDSSetBdDiscretization(), PetscDSAddBdDiscretization(), PetscDSGetDiscretization(), PetscDSGetNumFields(), PetscDSCreate() 692bc4ae4beSMatthew G. Knepley @*/ 6932764a2aaSMatthew G. Knepley PetscErrorCode PetscDSGetBdDiscretization(PetscDS prob, PetscInt f, PetscObject *disc) 6942764a2aaSMatthew G. Knepley { 6952764a2aaSMatthew G. Knepley PetscFunctionBegin; 6962764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 6972764a2aaSMatthew G. Knepley PetscValidPointer(disc, 3); 6982764a2aaSMatthew G. Knepley if ((f < 0) || (f >= prob->Nf)) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be in [0, %d)", f, prob->Nf); 6992764a2aaSMatthew G. Knepley *disc = prob->discBd[f]; 7002764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 7012764a2aaSMatthew G. Knepley } 7022764a2aaSMatthew G. Knepley 7032764a2aaSMatthew G. Knepley #undef __FUNCT__ 7042764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSSetDiscretization" 705bc4ae4beSMatthew G. Knepley /*@ 706bc4ae4beSMatthew G. Knepley PetscDSSetDiscretization - Sets the discretization object for the given field 707bc4ae4beSMatthew G. Knepley 708bc4ae4beSMatthew G. Knepley Not collective 709bc4ae4beSMatthew G. Knepley 710bc4ae4beSMatthew G. Knepley Input Parameters: 711bc4ae4beSMatthew G. Knepley + prob - The PetscDS object 712bc4ae4beSMatthew G. Knepley . f - The field number 713bc4ae4beSMatthew G. Knepley - disc - The discretization object 714bc4ae4beSMatthew G. Knepley 715bc4ae4beSMatthew G. Knepley Level: beginner 716bc4ae4beSMatthew G. Knepley 717bc4ae4beSMatthew G. Knepley .seealso: PetscDSGetDiscretization(), PetscDSAddDiscretization(), PetscDSGetNumFields(), PetscDSCreate() 718bc4ae4beSMatthew G. Knepley @*/ 7192764a2aaSMatthew G. Knepley PetscErrorCode PetscDSSetDiscretization(PetscDS prob, PetscInt f, PetscObject disc) 7202764a2aaSMatthew G. Knepley { 7212764a2aaSMatthew G. Knepley PetscErrorCode ierr; 7222764a2aaSMatthew G. Knepley 7232764a2aaSMatthew G. Knepley PetscFunctionBegin; 7242764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 7252764a2aaSMatthew G. Knepley PetscValidPointer(disc, 3); 7262764a2aaSMatthew G. Knepley if (f < 0) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be non-negative", f); 7272764a2aaSMatthew G. Knepley ierr = PetscDSEnlarge_Static(prob, f+1);CHKERRQ(ierr); 7282764a2aaSMatthew G. Knepley if (prob->disc[f]) {ierr = PetscObjectDereference(prob->disc[f]);CHKERRQ(ierr);} 7292764a2aaSMatthew G. Knepley prob->disc[f] = disc; 7302764a2aaSMatthew G. Knepley ierr = PetscObjectReference(disc);CHKERRQ(ierr); 7312764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 7322764a2aaSMatthew G. Knepley } 7332764a2aaSMatthew G. Knepley 7342764a2aaSMatthew G. Knepley #undef __FUNCT__ 7352764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSSetBdDiscretization" 736bc4ae4beSMatthew G. Knepley /*@ 737bc4ae4beSMatthew G. Knepley PetscDSSetBdDiscretization - Sets the boundary discretization object for the given field 738bc4ae4beSMatthew G. Knepley 739bc4ae4beSMatthew G. Knepley Not collective 740bc4ae4beSMatthew G. Knepley 741bc4ae4beSMatthew G. Knepley Input Parameters: 742bc4ae4beSMatthew G. Knepley + prob - The PetscDS object 743bc4ae4beSMatthew G. Knepley . f - The field number 744bc4ae4beSMatthew G. Knepley - disc - The boundary discretization object 745bc4ae4beSMatthew G. Knepley 746bc4ae4beSMatthew G. Knepley Level: beginner 747bc4ae4beSMatthew G. Knepley 748bc4ae4beSMatthew G. Knepley .seealso: PetscDSGetBdDiscretization(), PetscDSAddBdDiscretization(), PetscDSGetNumFields(), PetscDSCreate() 749bc4ae4beSMatthew G. Knepley @*/ 7502764a2aaSMatthew G. Knepley PetscErrorCode PetscDSSetBdDiscretization(PetscDS prob, PetscInt f, PetscObject disc) 7512764a2aaSMatthew G. Knepley { 7522764a2aaSMatthew G. Knepley PetscErrorCode ierr; 7532764a2aaSMatthew G. Knepley 7542764a2aaSMatthew G. Knepley PetscFunctionBegin; 7552764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 7562764a2aaSMatthew G. Knepley if (disc) PetscValidPointer(disc, 3); 7572764a2aaSMatthew G. Knepley if (f < 0) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be non-negative", f); 7582764a2aaSMatthew G. Knepley ierr = PetscDSEnlarge_Static(prob, f+1);CHKERRQ(ierr); 7592764a2aaSMatthew G. Knepley if (prob->discBd[f]) {ierr = PetscObjectDereference(prob->discBd[f]);CHKERRQ(ierr);} 7602764a2aaSMatthew G. Knepley prob->discBd[f] = disc; 7612764a2aaSMatthew G. Knepley ierr = PetscObjectReference(disc);CHKERRQ(ierr); 7622764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 7632764a2aaSMatthew G. Knepley } 7642764a2aaSMatthew G. Knepley 7652764a2aaSMatthew G. Knepley #undef __FUNCT__ 7662764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSAddDiscretization" 767bc4ae4beSMatthew G. Knepley /*@ 768bc4ae4beSMatthew G. Knepley PetscDSAddDiscretization - Adds a discretization object 769bc4ae4beSMatthew G. Knepley 770bc4ae4beSMatthew G. Knepley Not collective 771bc4ae4beSMatthew G. Knepley 772bc4ae4beSMatthew G. Knepley Input Parameters: 773bc4ae4beSMatthew G. Knepley + prob - The PetscDS object 774bc4ae4beSMatthew G. Knepley - disc - The boundary discretization object 775bc4ae4beSMatthew G. Knepley 776bc4ae4beSMatthew G. Knepley Level: beginner 777bc4ae4beSMatthew G. Knepley 778bc4ae4beSMatthew G. Knepley .seealso: PetscDSGetDiscretization(), PetscDSSetDiscretization(), PetscDSGetNumFields(), PetscDSCreate() 779bc4ae4beSMatthew G. Knepley @*/ 7802764a2aaSMatthew G. Knepley PetscErrorCode PetscDSAddDiscretization(PetscDS prob, PetscObject disc) 7812764a2aaSMatthew G. Knepley { 7822764a2aaSMatthew G. Knepley PetscErrorCode ierr; 7832764a2aaSMatthew G. Knepley 7842764a2aaSMatthew G. Knepley PetscFunctionBegin; 7852764a2aaSMatthew G. Knepley ierr = PetscDSSetDiscretization(prob, prob->Nf, disc);CHKERRQ(ierr); 7862764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 7872764a2aaSMatthew G. Knepley } 7882764a2aaSMatthew G. Knepley 7892764a2aaSMatthew G. Knepley #undef __FUNCT__ 7902764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSAddBdDiscretization" 791bc4ae4beSMatthew G. Knepley /*@ 792bc4ae4beSMatthew G. Knepley PetscDSAddBdDiscretization - Adds a boundary discretization object 793bc4ae4beSMatthew G. Knepley 794bc4ae4beSMatthew G. Knepley Not collective 795bc4ae4beSMatthew G. Knepley 796bc4ae4beSMatthew G. Knepley Input Parameters: 797bc4ae4beSMatthew G. Knepley + prob - The PetscDS object 798bc4ae4beSMatthew G. Knepley - disc - The boundary discretization object 799bc4ae4beSMatthew G. Knepley 800bc4ae4beSMatthew G. Knepley Level: beginner 801bc4ae4beSMatthew G. Knepley 802bc4ae4beSMatthew G. Knepley .seealso: PetscDSGetBdDiscretization(), PetscDSSetBdDiscretization(), PetscDSGetNumFields(), PetscDSCreate() 803bc4ae4beSMatthew G. Knepley @*/ 8042764a2aaSMatthew G. Knepley PetscErrorCode PetscDSAddBdDiscretization(PetscDS prob, PetscObject disc) 8052764a2aaSMatthew G. Knepley { 8062764a2aaSMatthew G. Knepley PetscErrorCode ierr; 8072764a2aaSMatthew G. Knepley 8082764a2aaSMatthew G. Knepley PetscFunctionBegin; 8092764a2aaSMatthew G. Knepley ierr = PetscDSSetBdDiscretization(prob, prob->Nf, disc);CHKERRQ(ierr); 8102764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 8112764a2aaSMatthew G. Knepley } 8122764a2aaSMatthew G. Knepley 8132764a2aaSMatthew G. Knepley #undef __FUNCT__ 8142764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSGetObjective" 8152764a2aaSMatthew G. Knepley PetscErrorCode PetscDSGetObjective(PetscDS prob, PetscInt f, 8162764a2aaSMatthew G. Knepley void (**obj)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], PetscScalar obj[])) 8172764a2aaSMatthew G. Knepley { 8182764a2aaSMatthew G. Knepley PetscFunctionBegin; 8192764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 8202764a2aaSMatthew G. Knepley PetscValidPointer(obj, 2); 8212764a2aaSMatthew G. Knepley if ((f < 0) || (f >= prob->Nf)) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be in [0, %d)", f, prob->Nf); 8222764a2aaSMatthew G. Knepley *obj = prob->obj[f]; 8232764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 8242764a2aaSMatthew G. Knepley } 8252764a2aaSMatthew G. Knepley 8262764a2aaSMatthew G. Knepley #undef __FUNCT__ 8272764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSSetObjective" 8282764a2aaSMatthew G. Knepley PetscErrorCode PetscDSSetObjective(PetscDS prob, PetscInt f, 8292764a2aaSMatthew G. Knepley void (*obj)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], PetscScalar obj[])) 8302764a2aaSMatthew G. Knepley { 8312764a2aaSMatthew G. Knepley PetscErrorCode ierr; 8322764a2aaSMatthew G. Knepley 8332764a2aaSMatthew G. Knepley PetscFunctionBegin; 8342764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 8352764a2aaSMatthew G. Knepley PetscValidFunction(obj, 2); 8362764a2aaSMatthew G. Knepley if (f < 0) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be non-negative", f); 8372764a2aaSMatthew G. Knepley ierr = PetscDSEnlarge_Static(prob, f+1);CHKERRQ(ierr); 8382764a2aaSMatthew G. Knepley prob->obj[f] = obj; 8392764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 8402764a2aaSMatthew G. Knepley } 8412764a2aaSMatthew G. Knepley 8422764a2aaSMatthew G. Knepley #undef __FUNCT__ 8432764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSGetResidual" 8442764a2aaSMatthew G. Knepley PetscErrorCode PetscDSGetResidual(PetscDS prob, PetscInt f, 8452764a2aaSMatthew G. Knepley void (**f0)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], PetscScalar f0[]), 8462764a2aaSMatthew G. Knepley void (**f1)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], PetscScalar f1[])) 8472764a2aaSMatthew G. Knepley { 8482764a2aaSMatthew G. Knepley PetscFunctionBegin; 8492764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 8502764a2aaSMatthew G. Knepley if ((f < 0) || (f >= prob->Nf)) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be in [0, %d)", f, prob->Nf); 8512764a2aaSMatthew G. Knepley if (f0) {PetscValidPointer(f0, 3); *f0 = prob->f[f*2+0];} 8522764a2aaSMatthew G. Knepley if (f1) {PetscValidPointer(f1, 4); *f1 = prob->f[f*2+1];} 8532764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 8542764a2aaSMatthew G. Knepley } 8552764a2aaSMatthew G. Knepley 8562764a2aaSMatthew G. Knepley #undef __FUNCT__ 8572764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSSetResidual" 8582764a2aaSMatthew G. Knepley PetscErrorCode PetscDSSetResidual(PetscDS prob, PetscInt f, 8592764a2aaSMatthew G. Knepley void (*f0)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], PetscScalar f0[]), 8602764a2aaSMatthew G. Knepley void (*f1)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], PetscScalar f1[])) 8612764a2aaSMatthew G. Knepley { 8622764a2aaSMatthew G. Knepley PetscErrorCode ierr; 8632764a2aaSMatthew G. Knepley 8642764a2aaSMatthew G. Knepley PetscFunctionBegin; 8652764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 8662764a2aaSMatthew G. Knepley PetscValidFunction(f0, 3); 8672764a2aaSMatthew G. Knepley PetscValidFunction(f1, 4); 8682764a2aaSMatthew G. Knepley if (f < 0) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be non-negative", f); 8692764a2aaSMatthew G. Knepley ierr = PetscDSEnlarge_Static(prob, f+1);CHKERRQ(ierr); 8702764a2aaSMatthew G. Knepley prob->f[f*2+0] = f0; 8712764a2aaSMatthew G. Knepley prob->f[f*2+1] = f1; 8722764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 8732764a2aaSMatthew G. Knepley } 8742764a2aaSMatthew G. Knepley 8752764a2aaSMatthew G. Knepley #undef __FUNCT__ 8762764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSGetJacobian" 8772764a2aaSMatthew G. Knepley PetscErrorCode PetscDSGetJacobian(PetscDS prob, PetscInt f, PetscInt g, 8782764a2aaSMatthew G. Knepley void (**g0)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], PetscScalar g0[]), 8792764a2aaSMatthew G. Knepley void (**g1)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], PetscScalar g1[]), 8802764a2aaSMatthew G. Knepley void (**g2)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], PetscScalar g2[]), 8812764a2aaSMatthew G. Knepley void (**g3)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], PetscScalar g3[])) 8822764a2aaSMatthew G. Knepley { 8832764a2aaSMatthew G. Knepley PetscFunctionBegin; 8842764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 8852764a2aaSMatthew G. Knepley if ((f < 0) || (f >= prob->Nf)) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be in [0, %d)", f, prob->Nf); 8862764a2aaSMatthew G. Knepley if ((g < 0) || (g >= prob->Nf)) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be in [0, %d)", g, prob->Nf); 8872764a2aaSMatthew G. Knepley if (g0) {PetscValidPointer(g0, 4); *g0 = prob->g[(f*prob->Nf + g)*4+0];} 8882764a2aaSMatthew G. Knepley if (g1) {PetscValidPointer(g1, 5); *g1 = prob->g[(f*prob->Nf + g)*4+1];} 8892764a2aaSMatthew G. Knepley if (g2) {PetscValidPointer(g2, 6); *g2 = prob->g[(f*prob->Nf + g)*4+2];} 8902764a2aaSMatthew G. Knepley if (g3) {PetscValidPointer(g3, 7); *g3 = prob->g[(f*prob->Nf + g)*4+3];} 8912764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 8922764a2aaSMatthew G. Knepley } 8932764a2aaSMatthew G. Knepley 8942764a2aaSMatthew G. Knepley #undef __FUNCT__ 8952764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSSetJacobian" 8962764a2aaSMatthew G. Knepley PetscErrorCode PetscDSSetJacobian(PetscDS prob, PetscInt f, PetscInt g, 8972764a2aaSMatthew G. Knepley void (*g0)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], PetscScalar g0[]), 8982764a2aaSMatthew G. Knepley void (*g1)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], PetscScalar g1[]), 8992764a2aaSMatthew G. Knepley void (*g2)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], PetscScalar g2[]), 9002764a2aaSMatthew G. Knepley void (*g3)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], PetscScalar g3[])) 9012764a2aaSMatthew G. Knepley { 9022764a2aaSMatthew G. Knepley PetscErrorCode ierr; 9032764a2aaSMatthew G. Knepley 9042764a2aaSMatthew G. Knepley PetscFunctionBegin; 9052764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 9062764a2aaSMatthew G. Knepley if (g0) PetscValidFunction(g0, 4); 9072764a2aaSMatthew G. Knepley if (g1) PetscValidFunction(g1, 5); 9082764a2aaSMatthew G. Knepley if (g2) PetscValidFunction(g2, 6); 9092764a2aaSMatthew G. Knepley if (g3) PetscValidFunction(g3, 7); 9102764a2aaSMatthew G. Knepley if (f < 0) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be non-negative", f); 9112764a2aaSMatthew G. Knepley if (g < 0) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be non-negative", g); 9122764a2aaSMatthew G. Knepley ierr = PetscDSEnlarge_Static(prob, PetscMax(f, g)+1);CHKERRQ(ierr); 9132764a2aaSMatthew G. Knepley prob->g[(f*prob->Nf + g)*4+0] = g0; 9142764a2aaSMatthew G. Knepley prob->g[(f*prob->Nf + g)*4+1] = g1; 9152764a2aaSMatthew G. Knepley prob->g[(f*prob->Nf + g)*4+2] = g2; 9162764a2aaSMatthew G. Knepley prob->g[(f*prob->Nf + g)*4+3] = g3; 9172764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 9182764a2aaSMatthew G. Knepley } 9192764a2aaSMatthew G. Knepley 9202764a2aaSMatthew G. Knepley #undef __FUNCT__ 9210c2f2876SMatthew G. Knepley #define __FUNCT__ "PetscDSGetRiemannSolver" 9220c2f2876SMatthew G. Knepley /*@C 9230c2f2876SMatthew G. Knepley PetscDSGetRiemannSolver - Returns the Riemann solver for the given field 9240c2f2876SMatthew G. Knepley 9250c2f2876SMatthew G. Knepley Not collective 9260c2f2876SMatthew G. Knepley 9270c2f2876SMatthew G. Knepley Input Arguments: 9280c2f2876SMatthew G. Knepley + prob - The PetscDS object 9290c2f2876SMatthew G. Knepley - f - The field number 9300c2f2876SMatthew G. Knepley 9310c2f2876SMatthew G. Knepley Output Argument: 9320c2f2876SMatthew G. Knepley . r - Riemann solver 9330c2f2876SMatthew G. Knepley 9340c2f2876SMatthew G. Knepley Calling sequence for r: 9350c2f2876SMatthew G. Knepley 9360c2f2876SMatthew G. Knepley $ r(const PetscReal x[], const PetscReal n[], const PetscScalar uL[], const PetscScalar uR[], PetscScalar flux[], void *ctx) 9370c2f2876SMatthew G. Knepley 9380c2f2876SMatthew G. Knepley + x - The coordinates at a point on the interface 9390c2f2876SMatthew G. Knepley . n - The normal vector to the interface 9400c2f2876SMatthew G. Knepley . uL - The state vector to the left of the interface 9410c2f2876SMatthew G. Knepley . uR - The state vector to the right of the interface 9420c2f2876SMatthew G. Knepley . flux - output array of flux through the interface 9430c2f2876SMatthew G. Knepley - ctx - optional user context 9440c2f2876SMatthew G. Knepley 9450c2f2876SMatthew G. Knepley Level: intermediate 9460c2f2876SMatthew G. Knepley 9470c2f2876SMatthew G. Knepley .seealso: PetscDSSetRiemannSolver() 9480c2f2876SMatthew G. Knepley @*/ 9490c2f2876SMatthew G. Knepley PetscErrorCode PetscDSGetRiemannSolver(PetscDS prob, PetscInt f, 9500c2f2876SMatthew G. Knepley void (**r)(const PetscReal x[], const PetscReal n[], const PetscScalar uL[], const PetscScalar uR[], PetscScalar flux[], void *ctx)) 9510c2f2876SMatthew G. Knepley { 9520c2f2876SMatthew G. Knepley PetscFunctionBegin; 9530c2f2876SMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 9540c2f2876SMatthew G. Knepley if ((f < 0) || (f >= prob->Nf)) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be in [0, %d)", f, prob->Nf); 9550c2f2876SMatthew G. Knepley PetscValidPointer(r, 3); 9560c2f2876SMatthew G. Knepley *r = prob->r[f]; 9570c2f2876SMatthew G. Knepley PetscFunctionReturn(0); 9580c2f2876SMatthew G. Knepley } 9590c2f2876SMatthew G. Knepley 9600c2f2876SMatthew G. Knepley #undef __FUNCT__ 9610c2f2876SMatthew G. Knepley #define __FUNCT__ "PetscDSSetRiemannSolver" 9620c2f2876SMatthew G. Knepley /*@C 9630c2f2876SMatthew G. Knepley PetscDSSetRiemannSolver - Sets the Riemann solver for the given field 9640c2f2876SMatthew G. Knepley 9650c2f2876SMatthew G. Knepley Not collective 9660c2f2876SMatthew G. Knepley 9670c2f2876SMatthew G. Knepley Input Arguments: 9680c2f2876SMatthew G. Knepley + prob - The PetscDS object 9690c2f2876SMatthew G. Knepley . f - The field number 9700c2f2876SMatthew G. Knepley - r - Riemann solver 9710c2f2876SMatthew G. Knepley 9720c2f2876SMatthew G. Knepley Calling sequence for r: 9730c2f2876SMatthew G. Knepley 9740c2f2876SMatthew G. Knepley $ r(const PetscReal x[], const PetscReal n[], const PetscScalar uL[], const PetscScalar uR[], PetscScalar flux[], void *ctx) 9750c2f2876SMatthew G. Knepley 9760c2f2876SMatthew G. Knepley + x - The coordinates at a point on the interface 9770c2f2876SMatthew G. Knepley . n - The normal vector to the interface 9780c2f2876SMatthew G. Knepley . uL - The state vector to the left of the interface 9790c2f2876SMatthew G. Knepley . uR - The state vector to the right of the interface 9800c2f2876SMatthew G. Knepley . flux - output array of flux through the interface 9810c2f2876SMatthew G. Knepley - ctx - optional user context 9820c2f2876SMatthew G. Knepley 9830c2f2876SMatthew G. Knepley Level: intermediate 9840c2f2876SMatthew G. Knepley 9850c2f2876SMatthew G. Knepley .seealso: PetscDSGetRiemannSolver() 9860c2f2876SMatthew G. Knepley @*/ 9870c2f2876SMatthew G. Knepley PetscErrorCode PetscDSSetRiemannSolver(PetscDS prob, PetscInt f, 9880c2f2876SMatthew G. Knepley void (*r)(const PetscReal x[], const PetscReal n[], const PetscScalar uL[], const PetscScalar uR[], PetscScalar flux[], void *ctx)) 9890c2f2876SMatthew G. Knepley { 9900c2f2876SMatthew G. Knepley PetscErrorCode ierr; 9910c2f2876SMatthew G. Knepley 9920c2f2876SMatthew G. Knepley PetscFunctionBegin; 9930c2f2876SMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 9940c2f2876SMatthew G. Knepley PetscValidFunction(r, 3); 9950c2f2876SMatthew G. Knepley if (f < 0) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be non-negative", f); 9960c2f2876SMatthew G. Knepley ierr = PetscDSEnlarge_Static(prob, f+1);CHKERRQ(ierr); 9970c2f2876SMatthew G. Knepley prob->r[f] = r; 9980c2f2876SMatthew G. Knepley PetscFunctionReturn(0); 9990c2f2876SMatthew G. Knepley } 10000c2f2876SMatthew G. Knepley 10010c2f2876SMatthew G. Knepley #undef __FUNCT__ 10020c2f2876SMatthew G. Knepley #define __FUNCT__ "PetscDSGetContext" 10030c2f2876SMatthew G. Knepley PetscErrorCode PetscDSGetContext(PetscDS prob, PetscInt f, void **ctx) 10040c2f2876SMatthew G. Knepley { 10050c2f2876SMatthew G. Knepley PetscFunctionBegin; 10060c2f2876SMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 10070c2f2876SMatthew G. Knepley if ((f < 0) || (f >= prob->Nf)) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be in [0, %d)", f, prob->Nf); 10080c2f2876SMatthew G. Knepley PetscValidPointer(ctx, 3); 10090c2f2876SMatthew G. Knepley *ctx = prob->ctx[f]; 10100c2f2876SMatthew G. Knepley PetscFunctionReturn(0); 10110c2f2876SMatthew G. Knepley } 10120c2f2876SMatthew G. Knepley 10130c2f2876SMatthew G. Knepley #undef __FUNCT__ 10140c2f2876SMatthew G. Knepley #define __FUNCT__ "PetscDSSetContext" 10150c2f2876SMatthew G. Knepley PetscErrorCode PetscDSSetContext(PetscDS prob, PetscInt f, void *ctx) 10160c2f2876SMatthew G. Knepley { 10170c2f2876SMatthew G. Knepley PetscErrorCode ierr; 10180c2f2876SMatthew G. Knepley 10190c2f2876SMatthew G. Knepley PetscFunctionBegin; 10200c2f2876SMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 10210c2f2876SMatthew G. Knepley if (f < 0) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be non-negative", f); 10220c2f2876SMatthew G. Knepley ierr = PetscDSEnlarge_Static(prob, f+1);CHKERRQ(ierr); 10230c2f2876SMatthew G. Knepley prob->ctx[f] = ctx; 10240c2f2876SMatthew G. Knepley PetscFunctionReturn(0); 10250c2f2876SMatthew G. Knepley } 10260c2f2876SMatthew G. Knepley 10270c2f2876SMatthew G. Knepley #undef __FUNCT__ 10282764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSGetBdResidual" 10292764a2aaSMatthew G. Knepley PetscErrorCode PetscDSGetBdResidual(PetscDS prob, PetscInt f, 10302764a2aaSMatthew G. Knepley void (**f0)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], const PetscReal n[], PetscScalar f0[]), 10312764a2aaSMatthew G. Knepley void (**f1)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], const PetscReal n[], PetscScalar f1[])) 10322764a2aaSMatthew G. Knepley { 10332764a2aaSMatthew G. Knepley PetscFunctionBegin; 10342764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 10352764a2aaSMatthew G. Knepley if ((f < 0) || (f >= prob->Nf)) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be in [0, %d)", f, prob->Nf); 10362764a2aaSMatthew G. Knepley if (f0) {PetscValidPointer(f0, 3); *f0 = prob->fBd[f*2+0];} 10372764a2aaSMatthew G. Knepley if (f1) {PetscValidPointer(f1, 4); *f1 = prob->fBd[f*2+1];} 10382764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 10392764a2aaSMatthew G. Knepley } 10402764a2aaSMatthew G. Knepley 10412764a2aaSMatthew G. Knepley #undef __FUNCT__ 10422764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSSetBdResidual" 10432764a2aaSMatthew G. Knepley PetscErrorCode PetscDSSetBdResidual(PetscDS prob, PetscInt f, 10442764a2aaSMatthew G. Knepley void (*f0)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], const PetscReal n[], PetscScalar f0[]), 10452764a2aaSMatthew G. Knepley void (*f1)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], const PetscReal n[], PetscScalar f1[])) 10462764a2aaSMatthew G. Knepley { 10472764a2aaSMatthew G. Knepley PetscErrorCode ierr; 10482764a2aaSMatthew G. Knepley 10492764a2aaSMatthew G. Knepley PetscFunctionBegin; 10502764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 10512764a2aaSMatthew G. Knepley if (f < 0) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be non-negative", f); 10522764a2aaSMatthew G. Knepley ierr = PetscDSEnlarge_Static(prob, f+1);CHKERRQ(ierr); 10532764a2aaSMatthew G. Knepley if (f0) {PetscValidFunction(f0, 3); prob->fBd[f*2+0] = f0;} 10542764a2aaSMatthew G. Knepley if (f1) {PetscValidFunction(f1, 4); prob->fBd[f*2+1] = f1;} 10552764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 10562764a2aaSMatthew G. Knepley } 10572764a2aaSMatthew G. Knepley 10582764a2aaSMatthew G. Knepley #undef __FUNCT__ 10592764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSGetBdJacobian" 10602764a2aaSMatthew G. Knepley PetscErrorCode PetscDSGetBdJacobian(PetscDS prob, PetscInt f, PetscInt g, 10612764a2aaSMatthew G. Knepley void (**g0)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], const PetscReal n[], PetscScalar g0[]), 10622764a2aaSMatthew G. Knepley void (**g1)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], const PetscReal n[], PetscScalar g1[]), 10632764a2aaSMatthew G. Knepley void (**g2)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], const PetscReal n[], PetscScalar g2[]), 10642764a2aaSMatthew G. Knepley void (**g3)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], const PetscReal n[], PetscScalar g3[])) 10652764a2aaSMatthew G. Knepley { 10662764a2aaSMatthew G. Knepley PetscFunctionBegin; 10672764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 10682764a2aaSMatthew G. Knepley if ((f < 0) || (f >= prob->Nf)) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be in [0, %d)", f, prob->Nf); 10692764a2aaSMatthew G. Knepley if ((g < 0) || (g >= prob->Nf)) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be in [0, %d)", g, prob->Nf); 10702764a2aaSMatthew G. Knepley if (g0) {PetscValidPointer(g0, 4); *g0 = prob->gBd[(f*prob->Nf + g)*4+0];} 10712764a2aaSMatthew G. Knepley if (g1) {PetscValidPointer(g1, 5); *g1 = prob->gBd[(f*prob->Nf + g)*4+1];} 10722764a2aaSMatthew G. Knepley if (g2) {PetscValidPointer(g2, 6); *g2 = prob->gBd[(f*prob->Nf + g)*4+2];} 10732764a2aaSMatthew G. Knepley if (g3) {PetscValidPointer(g3, 7); *g3 = prob->gBd[(f*prob->Nf + g)*4+3];} 10742764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 10752764a2aaSMatthew G. Knepley } 10762764a2aaSMatthew G. Knepley 10772764a2aaSMatthew G. Knepley #undef __FUNCT__ 10782764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSSetBdJacobian" 10792764a2aaSMatthew G. Knepley PetscErrorCode PetscDSSetBdJacobian(PetscDS prob, PetscInt f, PetscInt g, 10802764a2aaSMatthew G. Knepley void (*g0)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], const PetscReal n[], PetscScalar g0[]), 10812764a2aaSMatthew G. Knepley void (*g1)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], const PetscReal n[], PetscScalar g1[]), 10822764a2aaSMatthew G. Knepley void (*g2)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], const PetscReal n[], PetscScalar g2[]), 10832764a2aaSMatthew G. Knepley void (*g3)(const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], const PetscReal x[], const PetscReal n[], PetscScalar g3[])) 10842764a2aaSMatthew G. Knepley { 10852764a2aaSMatthew G. Knepley PetscErrorCode ierr; 10862764a2aaSMatthew G. Knepley 10872764a2aaSMatthew G. Knepley PetscFunctionBegin; 10882764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 10892764a2aaSMatthew G. Knepley if (g0) PetscValidFunction(g0, 4); 10902764a2aaSMatthew G. Knepley if (g1) PetscValidFunction(g1, 5); 10912764a2aaSMatthew G. Knepley if (g2) PetscValidFunction(g2, 6); 10922764a2aaSMatthew G. Knepley if (g3) PetscValidFunction(g3, 7); 10932764a2aaSMatthew G. Knepley if (f < 0) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be non-negative", f); 10942764a2aaSMatthew G. Knepley if (g < 0) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be non-negative", g); 10952764a2aaSMatthew G. Knepley ierr = PetscDSEnlarge_Static(prob, PetscMax(f, g)+1);CHKERRQ(ierr); 10962764a2aaSMatthew G. Knepley prob->gBd[(f*prob->Nf + g)*4+0] = g0; 10972764a2aaSMatthew G. Knepley prob->gBd[(f*prob->Nf + g)*4+1] = g1; 10982764a2aaSMatthew G. Knepley prob->gBd[(f*prob->Nf + g)*4+2] = g2; 10992764a2aaSMatthew G. Knepley prob->gBd[(f*prob->Nf + g)*4+3] = g3; 11002764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 11012764a2aaSMatthew G. Knepley } 11022764a2aaSMatthew G. Knepley 11032764a2aaSMatthew G. Knepley #undef __FUNCT__ 11042764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSGetFieldOffset" 1105bc4ae4beSMatthew G. Knepley /*@ 1106bc4ae4beSMatthew G. Knepley PetscDSGetFieldOffset - Returns the offset of the given field in the full space basis 1107bc4ae4beSMatthew G. Knepley 1108bc4ae4beSMatthew G. Knepley Not collective 1109bc4ae4beSMatthew G. Knepley 1110bc4ae4beSMatthew G. Knepley Input Parameters: 1111bc4ae4beSMatthew G. Knepley + prob - The PetscDS object 1112bc4ae4beSMatthew G. Knepley - f - The field number 1113bc4ae4beSMatthew G. Knepley 1114bc4ae4beSMatthew G. Knepley Output Parameter: 1115bc4ae4beSMatthew G. Knepley . off - The offset 1116bc4ae4beSMatthew G. Knepley 1117bc4ae4beSMatthew G. Knepley Level: beginner 1118bc4ae4beSMatthew G. Knepley 1119bc4ae4beSMatthew G. Knepley .seealso: PetscDSGetBdFieldOffset(), PetscDSGetNumFields(), PetscDSCreate() 1120bc4ae4beSMatthew G. Knepley @*/ 11212764a2aaSMatthew G. Knepley PetscErrorCode PetscDSGetFieldOffset(PetscDS prob, PetscInt f, PetscInt *off) 11222764a2aaSMatthew G. Knepley { 11232764a2aaSMatthew G. Knepley PetscInt g; 11242764a2aaSMatthew G. Knepley PetscErrorCode ierr; 11252764a2aaSMatthew G. Knepley 11262764a2aaSMatthew G. Knepley PetscFunctionBegin; 11272764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 11282764a2aaSMatthew G. Knepley PetscValidPointer(off, 3); 11292764a2aaSMatthew G. Knepley if ((f < 0) || (f >= prob->Nf)) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be in [0, %d)", f, prob->Nf); 11302764a2aaSMatthew G. Knepley *off = 0; 11312764a2aaSMatthew G. Knepley for (g = 0; g < f; ++g) { 11322764a2aaSMatthew G. Knepley PetscFE fe = (PetscFE) prob->disc[g]; 11332764a2aaSMatthew G. Knepley PetscInt Nb, Nc; 11342764a2aaSMatthew G. Knepley 11352764a2aaSMatthew G. Knepley ierr = PetscFEGetDimension(fe, &Nb);CHKERRQ(ierr); 11362764a2aaSMatthew G. Knepley ierr = PetscFEGetNumComponents(fe, &Nc);CHKERRQ(ierr); 11372764a2aaSMatthew G. Knepley *off += Nb*Nc; 11382764a2aaSMatthew G. Knepley } 11392764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 11402764a2aaSMatthew G. Knepley } 11412764a2aaSMatthew G. Knepley 11422764a2aaSMatthew G. Knepley #undef __FUNCT__ 11432764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSGetBdFieldOffset" 1144bc4ae4beSMatthew G. Knepley /*@ 1145c3ac4435SMatthew G. Knepley PetscDSGetBdFieldOffset - Returns the offset of the given field in the full space boundary basis 1146bc4ae4beSMatthew G. Knepley 1147bc4ae4beSMatthew G. Knepley Not collective 1148bc4ae4beSMatthew G. Knepley 1149bc4ae4beSMatthew G. Knepley Input Parameters: 1150bc4ae4beSMatthew G. Knepley + prob - The PetscDS object 1151bc4ae4beSMatthew G. Knepley - f - The field number 1152bc4ae4beSMatthew G. Knepley 1153bc4ae4beSMatthew G. Knepley Output Parameter: 1154bc4ae4beSMatthew G. Knepley . off - The boundary offset 1155bc4ae4beSMatthew G. Knepley 1156bc4ae4beSMatthew G. Knepley Level: beginner 1157bc4ae4beSMatthew G. Knepley 1158bc4ae4beSMatthew G. Knepley .seealso: PetscDSGetFieldOffset(), PetscDSGetNumFields(), PetscDSCreate() 1159bc4ae4beSMatthew G. Knepley @*/ 11602764a2aaSMatthew G. Knepley PetscErrorCode PetscDSGetBdFieldOffset(PetscDS prob, PetscInt f, PetscInt *off) 11612764a2aaSMatthew G. Knepley { 11622764a2aaSMatthew G. Knepley PetscInt g; 11632764a2aaSMatthew G. Knepley PetscErrorCode ierr; 11642764a2aaSMatthew G. Knepley 11652764a2aaSMatthew G. Knepley PetscFunctionBegin; 11662764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 11672764a2aaSMatthew G. Knepley PetscValidPointer(off, 3); 11682764a2aaSMatthew G. Knepley if ((f < 0) || (f >= prob->Nf)) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be in [0, %d)", f, prob->Nf); 11692764a2aaSMatthew G. Knepley *off = 0; 11702764a2aaSMatthew G. Knepley for (g = 0; g < f; ++g) { 11712764a2aaSMatthew G. Knepley PetscFE fe = (PetscFE) prob->discBd[g]; 11722764a2aaSMatthew G. Knepley PetscInt Nb, Nc; 11732764a2aaSMatthew G. Knepley 11742764a2aaSMatthew G. Knepley ierr = PetscFEGetDimension(fe, &Nb);CHKERRQ(ierr); 11752764a2aaSMatthew G. Knepley ierr = PetscFEGetNumComponents(fe, &Nc);CHKERRQ(ierr); 11762764a2aaSMatthew G. Knepley *off += Nb*Nc; 1177*6ce16762SMatthew G. Knepley } 1178*6ce16762SMatthew G. Knepley PetscFunctionReturn(0); 1179*6ce16762SMatthew G. Knepley } 1180*6ce16762SMatthew G. Knepley 1181*6ce16762SMatthew G. Knepley #undef __FUNCT__ 1182*6ce16762SMatthew G. Knepley #define __FUNCT__ "PetscDSGetComponentOffset" 1183*6ce16762SMatthew G. Knepley /*@ 1184*6ce16762SMatthew G. Knepley PetscDSGetComponentOffset - Returns the offset of the given field on an evaluation point 1185*6ce16762SMatthew G. Knepley 1186*6ce16762SMatthew G. Knepley Not collective 1187*6ce16762SMatthew G. Knepley 1188*6ce16762SMatthew G. Knepley Input Parameters: 1189*6ce16762SMatthew G. Knepley + prob - The PetscDS object 1190*6ce16762SMatthew G. Knepley - f - The field number 1191*6ce16762SMatthew G. Knepley 1192*6ce16762SMatthew G. Knepley Output Parameter: 1193*6ce16762SMatthew G. Knepley . off - The offset 1194*6ce16762SMatthew G. Knepley 1195*6ce16762SMatthew G. Knepley Level: beginner 1196*6ce16762SMatthew G. Knepley 1197*6ce16762SMatthew G. Knepley .seealso: PetscDSGetBdFieldOffset(), PetscDSGetNumFields(), PetscDSCreate() 1198*6ce16762SMatthew G. Knepley @*/ 1199*6ce16762SMatthew G. Knepley PetscErrorCode PetscDSGetComponentOffset(PetscDS prob, PetscInt f, PetscInt *off) 1200*6ce16762SMatthew G. Knepley { 1201*6ce16762SMatthew G. Knepley PetscInt g; 1202*6ce16762SMatthew G. Knepley PetscErrorCode ierr; 1203*6ce16762SMatthew G. Knepley 1204*6ce16762SMatthew G. Knepley PetscFunctionBegin; 1205*6ce16762SMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 1206*6ce16762SMatthew G. Knepley PetscValidPointer(off, 3); 1207*6ce16762SMatthew G. Knepley if ((f < 0) || (f >= prob->Nf)) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field number %d must be in [0, %d)", f, prob->Nf); 1208*6ce16762SMatthew G. Knepley *off = 0; 1209*6ce16762SMatthew G. Knepley for (g = 0; g < f; ++g) { 1210*6ce16762SMatthew G. Knepley PetscFE fe = (PetscFE) prob->disc[g]; 1211*6ce16762SMatthew G. Knepley PetscInt Nc; 1212*6ce16762SMatthew G. Knepley 1213*6ce16762SMatthew G. Knepley ierr = PetscFEGetNumComponents(fe, &Nc);CHKERRQ(ierr); 1214*6ce16762SMatthew G. Knepley *off += Nc; 12152764a2aaSMatthew G. Knepley } 12162764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 12172764a2aaSMatthew G. Knepley } 12182764a2aaSMatthew G. Knepley 12192764a2aaSMatthew G. Knepley #undef __FUNCT__ 12202764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSGetTabulation" 122168c9edb9SMatthew G. Knepley /*@C 122268c9edb9SMatthew G. Knepley PetscDSGetTabulation - Return the basis tabulation at quadrature points for the volume discretization 122368c9edb9SMatthew G. Knepley 122468c9edb9SMatthew G. Knepley Not collective 122568c9edb9SMatthew G. Knepley 122668c9edb9SMatthew G. Knepley Input Parameter: 122768c9edb9SMatthew G. Knepley . prob - The PetscDS object 122868c9edb9SMatthew G. Knepley 122968c9edb9SMatthew G. Knepley Output Parameters: 123068c9edb9SMatthew G. Knepley + basis - The basis function tabulation at quadrature points 123168c9edb9SMatthew G. Knepley - basisDer - The basis function derivative tabulation at quadrature points 123268c9edb9SMatthew G. Knepley 123368c9edb9SMatthew G. Knepley Level: intermediate 123468c9edb9SMatthew G. Knepley 123568c9edb9SMatthew G. Knepley .seealso: PetscDSGetBdTabulation(), PetscDSCreate() 123668c9edb9SMatthew G. Knepley @*/ 12372764a2aaSMatthew G. Knepley PetscErrorCode PetscDSGetTabulation(PetscDS prob, PetscReal ***basis, PetscReal ***basisDer) 12382764a2aaSMatthew G. Knepley { 12392764a2aaSMatthew G. Knepley PetscErrorCode ierr; 12402764a2aaSMatthew G. Knepley 12412764a2aaSMatthew G. Knepley PetscFunctionBegin; 12422764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 12432764a2aaSMatthew G. Knepley ierr = PetscDSSetUp(prob);CHKERRQ(ierr); 12442764a2aaSMatthew G. Knepley if (basis) {PetscValidPointer(basis, 2); *basis = prob->basis;} 12452764a2aaSMatthew G. Knepley if (basisDer) {PetscValidPointer(basisDer, 3); *basisDer = prob->basisDer;} 12462764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 12472764a2aaSMatthew G. Knepley } 12482764a2aaSMatthew G. Knepley 12492764a2aaSMatthew G. Knepley #undef __FUNCT__ 12502764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSGetBdTabulation" 125168c9edb9SMatthew G. Knepley /*@C 125268c9edb9SMatthew G. Knepley PetscDSGetBdTabulation - Return the basis tabulation at quadrature points for the boundary discretization 125368c9edb9SMatthew G. Knepley 125468c9edb9SMatthew G. Knepley Not collective 125568c9edb9SMatthew G. Knepley 125668c9edb9SMatthew G. Knepley Input Parameter: 125768c9edb9SMatthew G. Knepley . prob - The PetscDS object 125868c9edb9SMatthew G. Knepley 125968c9edb9SMatthew G. Knepley Output Parameters: 126068c9edb9SMatthew G. Knepley + basis - The basis function tabulation at quadrature points 126168c9edb9SMatthew G. Knepley - basisDer - The basis function derivative tabulation at quadrature points 126268c9edb9SMatthew G. Knepley 126368c9edb9SMatthew G. Knepley Level: intermediate 126468c9edb9SMatthew G. Knepley 126568c9edb9SMatthew G. Knepley .seealso: PetscDSGetTabulation(), PetscDSCreate() 126668c9edb9SMatthew G. Knepley @*/ 12672764a2aaSMatthew G. Knepley PetscErrorCode PetscDSGetBdTabulation(PetscDS prob, PetscReal ***basis, PetscReal ***basisDer) 12682764a2aaSMatthew G. Knepley { 12692764a2aaSMatthew G. Knepley PetscErrorCode ierr; 12702764a2aaSMatthew G. Knepley 12712764a2aaSMatthew G. Knepley PetscFunctionBegin; 12722764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 12732764a2aaSMatthew G. Knepley ierr = PetscDSSetUp(prob);CHKERRQ(ierr); 12742764a2aaSMatthew G. Knepley if (basis) {PetscValidPointer(basis, 2); *basis = prob->basisBd;} 12752764a2aaSMatthew G. Knepley if (basisDer) {PetscValidPointer(basisDer, 3); *basisDer = prob->basisDerBd;} 12762764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 12772764a2aaSMatthew G. Knepley } 12782764a2aaSMatthew G. Knepley 12792764a2aaSMatthew G. Knepley #undef __FUNCT__ 12802764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSGetEvaluationArrays" 12812764a2aaSMatthew G. Knepley PetscErrorCode PetscDSGetEvaluationArrays(PetscDS prob, PetscScalar **u, PetscScalar **u_t, PetscScalar **u_x) 12822764a2aaSMatthew G. Knepley { 12832764a2aaSMatthew G. Knepley PetscErrorCode ierr; 12842764a2aaSMatthew G. Knepley 12852764a2aaSMatthew G. Knepley PetscFunctionBegin; 12862764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 12872764a2aaSMatthew G. Knepley ierr = PetscDSSetUp(prob);CHKERRQ(ierr); 12882764a2aaSMatthew G. Knepley if (u) {PetscValidPointer(u, 2); *u = prob->u;} 12892764a2aaSMatthew G. Knepley if (u_t) {PetscValidPointer(u_t, 3); *u_t = prob->u_t;} 12902764a2aaSMatthew G. Knepley if (u_x) {PetscValidPointer(u_x, 4); *u_x = prob->u_x;} 12912764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 12922764a2aaSMatthew G. Knepley } 12932764a2aaSMatthew G. Knepley 12942764a2aaSMatthew G. Knepley #undef __FUNCT__ 12952764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSGetWeakFormArrays" 12962764a2aaSMatthew G. Knepley PetscErrorCode PetscDSGetWeakFormArrays(PetscDS prob, PetscScalar **f0, PetscScalar **f1, PetscScalar **g0, PetscScalar **g1, PetscScalar **g2, PetscScalar **g3) 12972764a2aaSMatthew G. Knepley { 12982764a2aaSMatthew G. Knepley PetscErrorCode ierr; 12992764a2aaSMatthew G. Knepley 13002764a2aaSMatthew G. Knepley PetscFunctionBegin; 13012764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 13022764a2aaSMatthew G. Knepley ierr = PetscDSSetUp(prob);CHKERRQ(ierr); 13032764a2aaSMatthew G. Knepley if (f0) {PetscValidPointer(f0, 2); *f0 = prob->f0;} 13042764a2aaSMatthew G. Knepley if (f1) {PetscValidPointer(f1, 3); *f1 = prob->f1;} 13052764a2aaSMatthew G. Knepley if (g0) {PetscValidPointer(g0, 4); *g0 = prob->g0;} 13062764a2aaSMatthew G. Knepley if (g1) {PetscValidPointer(g1, 5); *g1 = prob->g1;} 13072764a2aaSMatthew G. Knepley if (g2) {PetscValidPointer(g2, 6); *g2 = prob->g2;} 13082764a2aaSMatthew G. Knepley if (g3) {PetscValidPointer(g3, 7); *g3 = prob->g3;} 13092764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 13102764a2aaSMatthew G. Knepley } 13112764a2aaSMatthew G. Knepley 13122764a2aaSMatthew G. Knepley #undef __FUNCT__ 13132764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSGetRefCoordArrays" 13142764a2aaSMatthew G. Knepley PetscErrorCode PetscDSGetRefCoordArrays(PetscDS prob, PetscReal **x, PetscScalar **refSpaceDer) 13152764a2aaSMatthew G. Knepley { 13162764a2aaSMatthew G. Knepley PetscErrorCode ierr; 13172764a2aaSMatthew G. Knepley 13182764a2aaSMatthew G. Knepley PetscFunctionBegin; 13192764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCDS_CLASSID, 1); 13202764a2aaSMatthew G. Knepley ierr = PetscDSSetUp(prob);CHKERRQ(ierr); 13212764a2aaSMatthew G. Knepley if (x) {PetscValidPointer(x, 2); *x = prob->x;} 13222764a2aaSMatthew G. Knepley if (refSpaceDer) {PetscValidPointer(refSpaceDer, 3); *refSpaceDer = prob->refSpaceDer;} 13232764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 13242764a2aaSMatthew G. Knepley } 13252764a2aaSMatthew G. Knepley 13262764a2aaSMatthew G. Knepley #undef __FUNCT__ 13272764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSDestroy_Basic" 1328bc4ae4beSMatthew G. Knepley static PetscErrorCode PetscDSDestroy_Basic(PetscDS prob) 13292764a2aaSMatthew G. Knepley { 13302764a2aaSMatthew G. Knepley PetscFunctionBegin; 13312764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 13322764a2aaSMatthew G. Knepley } 13332764a2aaSMatthew G. Knepley 13342764a2aaSMatthew G. Knepley #undef __FUNCT__ 13352764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSInitialize_Basic" 1336bc4ae4beSMatthew G. Knepley static PetscErrorCode PetscDSInitialize_Basic(PetscDS prob) 13372764a2aaSMatthew G. Knepley { 13382764a2aaSMatthew G. Knepley PetscFunctionBegin; 13392764a2aaSMatthew G. Knepley prob->ops->setfromoptions = NULL; 13402764a2aaSMatthew G. Knepley prob->ops->setup = NULL; 13412764a2aaSMatthew G. Knepley prob->ops->view = NULL; 13422764a2aaSMatthew G. Knepley prob->ops->destroy = PetscDSDestroy_Basic; 13432764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 13442764a2aaSMatthew G. Knepley } 13452764a2aaSMatthew G. Knepley 13462764a2aaSMatthew G. Knepley /*MC 13472764a2aaSMatthew G. Knepley PETSCDSBASIC = "basic" - A discrete system with pointwise residual and boundary residual functions 13482764a2aaSMatthew G. Knepley 13492764a2aaSMatthew G. Knepley Level: intermediate 13502764a2aaSMatthew G. Knepley 13512764a2aaSMatthew G. Knepley .seealso: PetscDSType, PetscDSCreate(), PetscDSSetType() 13522764a2aaSMatthew G. Knepley M*/ 13532764a2aaSMatthew G. Knepley 13542764a2aaSMatthew G. Knepley #undef __FUNCT__ 13552764a2aaSMatthew G. Knepley #define __FUNCT__ "PetscDSCreate_Basic" 13562764a2aaSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscDSCreate_Basic(PetscDS prob) 13572764a2aaSMatthew G. Knepley { 13582764a2aaSMatthew G. Knepley PetscDS_Basic *b; 13592764a2aaSMatthew G. Knepley PetscErrorCode ierr; 13602764a2aaSMatthew G. Knepley 13612764a2aaSMatthew G. Knepley PetscFunctionBegin; 13622764a2aaSMatthew G. Knepley PetscValidHeaderSpecific(prob, PETSCSPACE_CLASSID, 1); 13632764a2aaSMatthew G. Knepley ierr = PetscNewLog(prob, &b);CHKERRQ(ierr); 13642764a2aaSMatthew G. Knepley prob->data = b; 13652764a2aaSMatthew G. Knepley 13662764a2aaSMatthew G. Knepley ierr = PetscDSInitialize_Basic(prob);CHKERRQ(ierr); 13672764a2aaSMatthew G. Knepley PetscFunctionReturn(0); 13682764a2aaSMatthew G. Knepley } 1369