1*5f34f2dcSJed Brown #include <petsc/private/viewercgnsimpl.h> /*I "petscviewer.h" I*/ 2*5f34f2dcSJed Brown #if defined(PETSC_HDF5_HAVE_PARALLEL) 3*5f34f2dcSJed Brown #include <pcgnslib.h> 4*5f34f2dcSJed Brown #else 5*5f34f2dcSJed Brown #include <cgnslib.h> 6*5f34f2dcSJed Brown #endif 7*5f34f2dcSJed Brown 8*5f34f2dcSJed Brown static PetscErrorCode PetscViewerSetFromOptions_CGNS(PetscOptionItems *PetscOptionsObject,PetscViewer v) 9*5f34f2dcSJed Brown { 10*5f34f2dcSJed Brown PetscFunctionBegin; 11*5f34f2dcSJed Brown PetscOptionsHeadBegin(PetscOptionsObject,"CGNS Viewer Options"); 12*5f34f2dcSJed Brown PetscOptionsHeadEnd(); 13*5f34f2dcSJed Brown PetscFunctionReturn(0); 14*5f34f2dcSJed Brown } 15*5f34f2dcSJed Brown 16*5f34f2dcSJed Brown static PetscErrorCode PetscViewerView_CGNS(PetscViewer v,PetscViewer viewer) 17*5f34f2dcSJed Brown { 18*5f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS*)v->data; 19*5f34f2dcSJed Brown 20*5f34f2dcSJed Brown PetscFunctionBegin; 21*5f34f2dcSJed Brown if (cgv->filename) { 22*5f34f2dcSJed Brown PetscCall(PetscViewerASCIIPrintf(viewer,"Filename: %s\n", cgv->filename)); 23*5f34f2dcSJed Brown } 24*5f34f2dcSJed Brown PetscFunctionReturn(0); 25*5f34f2dcSJed Brown } 26*5f34f2dcSJed Brown 27*5f34f2dcSJed Brown static PetscErrorCode PetscViewerFileClose_CGNS(PetscViewer viewer) 28*5f34f2dcSJed Brown { 29*5f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS*)viewer->data; 30*5f34f2dcSJed Brown 31*5f34f2dcSJed Brown PetscFunctionBegin; 32*5f34f2dcSJed Brown if (cgv->output_times) { 33*5f34f2dcSJed Brown size_t size, width = 32; 34*5f34f2dcSJed Brown char *solnames; 35*5f34f2dcSJed Brown PetscReal *times; 36*5f34f2dcSJed Brown cgsize_t num_times; 37*5f34f2dcSJed Brown PetscCall(PetscSegBufferGetSize(cgv->output_times, &size)); 38*5f34f2dcSJed Brown PetscCall(PetscSegBufferExtractInPlace(cgv->output_times, ×)); 39*5f34f2dcSJed Brown num_times = size; 40*5f34f2dcSJed Brown PetscCallCGNS(cg_biter_write(cgv->file_num, cgv->base, "TimeIterValues", num_times)); 41*5f34f2dcSJed Brown PetscCallCGNS(cg_goto(cgv->file_num, cgv->base, "BaseIterativeData_t", 1, NULL)); 42*5f34f2dcSJed Brown PetscCallCGNS(cg_array_write("TimeValues", CGNS_ENUMV(RealDouble), 1, &num_times, times)); 43*5f34f2dcSJed Brown PetscCall(PetscSegBufferDestroy(&cgv->output_times)); 44*5f34f2dcSJed Brown PetscCallCGNS(cg_ziter_write(cgv->file_num, cgv->base, cgv->zone, "ZoneIterativeData")); 45*5f34f2dcSJed Brown PetscCallCGNS(cg_goto(cgv->file_num, cgv->base, "Zone_t", cgv->zone, "ZoneIterativeData_t", 1, NULL)); 46*5f34f2dcSJed Brown PetscCall(PetscMalloc(size*width+1, &solnames)); 47*5f34f2dcSJed Brown for (size_t i=0; i<size; i++) PetscCall(PetscSNPrintf(&solnames[i*width], width+1, "FlowSolution%-20zu", i)); 48*5f34f2dcSJed Brown cgsize_t shape[2] = {(cgsize_t)width, (cgsize_t)size}; 49*5f34f2dcSJed Brown PetscCallCGNS(cg_array_write("FlowSolutionPointers", CGNS_ENUMV(Character), 2, shape, solnames)); 50*5f34f2dcSJed Brown // The VTK reader looks for names like FlowSolution*Pointers. 51*5f34f2dcSJed Brown for (size_t i=0; i<size; i++) PetscCall(PetscSNPrintf(&solnames[i*width], width+1, "%-32s", "CellInfo")); 52*5f34f2dcSJed Brown PetscCallCGNS(cg_array_write("FlowSolutionCellInfoPointers", CGNS_ENUMV(Character), 2, shape, solnames)); 53*5f34f2dcSJed Brown PetscCall(PetscFree(solnames)); 54*5f34f2dcSJed Brown 55*5f34f2dcSJed Brown PetscCallCGNS(cg_simulation_type_write(cgv->file_num, cgv->base, CGNS_ENUMV(TimeAccurate))); 56*5f34f2dcSJed Brown } 57*5f34f2dcSJed Brown PetscCall(PetscFree(cgv->filename)); 58*5f34f2dcSJed Brown #if defined(PETSC_HDF5_HAVE_PARALLEL) 59*5f34f2dcSJed Brown PetscCallCGNS(cgp_close(cgv->file_num)); 60*5f34f2dcSJed Brown #else 61*5f34f2dcSJed Brown if (cgv->file_num) PetscCallCGNS(cg_close(cgv->file_num)); 62*5f34f2dcSJed Brown #endif 63*5f34f2dcSJed Brown cgv->file_num = 0; 64*5f34f2dcSJed Brown PetscFunctionReturn(0); 65*5f34f2dcSJed Brown } 66*5f34f2dcSJed Brown 67*5f34f2dcSJed Brown static PetscErrorCode PetscViewerDestroy_CGNS(PetscViewer viewer) 68*5f34f2dcSJed Brown { 69*5f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS*)viewer->data; 70*5f34f2dcSJed Brown 71*5f34f2dcSJed Brown PetscFunctionBegin; 72*5f34f2dcSJed Brown PetscCall(PetscViewerFileClose_CGNS(viewer)); 73*5f34f2dcSJed Brown PetscCall(PetscFree(cgv->node_l2g)); 74*5f34f2dcSJed Brown PetscCall(PetscFree(cgv->nodal_field)); 75*5f34f2dcSJed Brown PetscCall(PetscFree(cgv)); 76*5f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetName_C",NULL)); 77*5f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetName_C",NULL)); 78*5f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetMode_C",NULL)); 79*5f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetMode_C",NULL)); 80*5f34f2dcSJed Brown PetscFunctionReturn(0); 81*5f34f2dcSJed Brown } 82*5f34f2dcSJed Brown 83*5f34f2dcSJed Brown static PetscErrorCode PetscViewerFileSetMode_CGNS(PetscViewer viewer, PetscFileMode type) 84*5f34f2dcSJed Brown { 85*5f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS*)viewer->data; 86*5f34f2dcSJed Brown 87*5f34f2dcSJed Brown PetscFunctionBegin; 88*5f34f2dcSJed Brown cgv->btype = type; 89*5f34f2dcSJed Brown PetscFunctionReturn(0); 90*5f34f2dcSJed Brown } 91*5f34f2dcSJed Brown 92*5f34f2dcSJed Brown static PetscErrorCode PetscViewerFileGetMode_CGNS(PetscViewer viewer, PetscFileMode *type) 93*5f34f2dcSJed Brown { 94*5f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS*)viewer->data; 95*5f34f2dcSJed Brown 96*5f34f2dcSJed Brown PetscFunctionBegin; 97*5f34f2dcSJed Brown *type = cgv->btype; 98*5f34f2dcSJed Brown PetscFunctionReturn(0); 99*5f34f2dcSJed Brown } 100*5f34f2dcSJed Brown 101*5f34f2dcSJed Brown static PetscErrorCode PetscViewerFileSetName_CGNS(PetscViewer viewer, const char *filename) 102*5f34f2dcSJed Brown { 103*5f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS*)viewer->data; 104*5f34f2dcSJed Brown 105*5f34f2dcSJed Brown PetscFunctionBegin; 106*5f34f2dcSJed Brown if (cgv->file_num) PetscCallCGNS(cg_close(cgv->file_num)); 107*5f34f2dcSJed Brown PetscCall(PetscFree(cgv->filename)); 108*5f34f2dcSJed Brown PetscCall(PetscStrallocpy(filename, &cgv->filename)); 109*5f34f2dcSJed Brown 110*5f34f2dcSJed Brown switch (cgv->btype) { 111*5f34f2dcSJed Brown case FILE_MODE_READ: 112*5f34f2dcSJed Brown SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"FILE_MODE_READ not yet implemented"); 113*5f34f2dcSJed Brown break; 114*5f34f2dcSJed Brown case FILE_MODE_WRITE: 115*5f34f2dcSJed Brown #if defined(PETSC_HDF5_HAVE_PARALLEL) 116*5f34f2dcSJed Brown PetscCallCGNS(cgp_mpi_comm(PetscObjectComm((PetscObject)viewer))); 117*5f34f2dcSJed Brown PetscCallCGNS(cgp_open(filename, CG_MODE_WRITE, &cgv->file_num)); 118*5f34f2dcSJed Brown #else 119*5f34f2dcSJed Brown PetscCallCGNS(cg_open(filename, CG_MODE_WRITE, &cgv->file_num)); 120*5f34f2dcSJed Brown #endif 121*5f34f2dcSJed Brown break; 122*5f34f2dcSJed Brown case FILE_MODE_UNDEFINED: 123*5f34f2dcSJed Brown SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_ORDER, "Must call PetscViewerFileSetMode() before PetscViewerFileSetName()"); 124*5f34f2dcSJed Brown default: 125*5f34f2dcSJed Brown SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP, "Unsupported file mode %s",PetscFileModes[cgv->btype]); 126*5f34f2dcSJed Brown } 127*5f34f2dcSJed Brown PetscFunctionReturn(0); 128*5f34f2dcSJed Brown } 129*5f34f2dcSJed Brown 130*5f34f2dcSJed Brown static PetscErrorCode PetscViewerFileGetName_CGNS(PetscViewer viewer, const char **filename) 131*5f34f2dcSJed Brown { 132*5f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS*)viewer->data; 133*5f34f2dcSJed Brown 134*5f34f2dcSJed Brown PetscFunctionBegin; 135*5f34f2dcSJed Brown *filename = cgv->filename; 136*5f34f2dcSJed Brown PetscFunctionReturn(0); 137*5f34f2dcSJed Brown } 138*5f34f2dcSJed Brown 139*5f34f2dcSJed Brown /*MC 140*5f34f2dcSJed Brown PETSCVIEWERCGNS - A viewer for CGNS files 141*5f34f2dcSJed Brown 142*5f34f2dcSJed Brown .seealso: `PetscViewerCreate()`, `VecView()`, `DMView()`, `PetscViewerFileSetName()`, `PetscViewerFileSetMode()` 143*5f34f2dcSJed Brown 144*5f34f2dcSJed Brown Level: beginner 145*5f34f2dcSJed Brown M*/ 146*5f34f2dcSJed Brown 147*5f34f2dcSJed Brown PETSC_EXTERN PetscErrorCode PetscViewerCreate_CGNS(PetscViewer v) 148*5f34f2dcSJed Brown { 149*5f34f2dcSJed Brown PetscViewer_CGNS *cgv; 150*5f34f2dcSJed Brown 151*5f34f2dcSJed Brown PetscFunctionBegin; 152*5f34f2dcSJed Brown PetscCall(PetscNewLog(v,&cgv)); 153*5f34f2dcSJed Brown 154*5f34f2dcSJed Brown v->data = cgv; 155*5f34f2dcSJed Brown v->ops->destroy = PetscViewerDestroy_CGNS; 156*5f34f2dcSJed Brown v->ops->setfromoptions = PetscViewerSetFromOptions_CGNS; 157*5f34f2dcSJed Brown v->ops->view = PetscViewerView_CGNS; 158*5f34f2dcSJed Brown cgv->btype = FILE_MODE_UNDEFINED; 159*5f34f2dcSJed Brown cgv->filename = NULL; 160*5f34f2dcSJed Brown 161*5f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileSetName_C",PetscViewerFileSetName_CGNS)); 162*5f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileGetName_C",PetscViewerFileGetName_CGNS)); 163*5f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileSetMode_C",PetscViewerFileSetMode_CGNS)); 164*5f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileGetMode_C",PetscViewerFileGetMode_CGNS)); 165*5f34f2dcSJed Brown PetscFunctionReturn(0); 166*5f34f2dcSJed Brown } 167