15f34f2dcSJed Brown #include <petsc/private/viewercgnsimpl.h> /*I "petscviewer.h" I*/ 25f34f2dcSJed Brown #if defined(PETSC_HDF5_HAVE_PARALLEL) 35f34f2dcSJed Brown #include <pcgnslib.h> 45f34f2dcSJed Brown #else 55f34f2dcSJed Brown #include <cgnslib.h> 65f34f2dcSJed Brown #endif 75f34f2dcSJed Brown 89371c9d4SSatish Balay static PetscErrorCode PetscViewerSetFromOptions_CGNS(PetscViewer v, PetscOptionItems *PetscOptionsObject) { 95f34f2dcSJed Brown PetscFunctionBegin; 105f34f2dcSJed Brown PetscOptionsHeadBegin(PetscOptionsObject, "CGNS Viewer Options"); 115f34f2dcSJed Brown PetscOptionsHeadEnd(); 125f34f2dcSJed Brown PetscFunctionReturn(0); 135f34f2dcSJed Brown } 145f34f2dcSJed Brown 159371c9d4SSatish Balay static PetscErrorCode PetscViewerView_CGNS(PetscViewer v, PetscViewer viewer) { 165f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS *)v->data; 175f34f2dcSJed Brown 185f34f2dcSJed Brown PetscFunctionBegin; 1948a46eb9SPierre Jolivet if (cgv->filename) PetscCall(PetscViewerASCIIPrintf(viewer, "Filename: %s\n", cgv->filename)); 205f34f2dcSJed Brown PetscFunctionReturn(0); 215f34f2dcSJed Brown } 225f34f2dcSJed Brown 239371c9d4SSatish Balay static PetscErrorCode PetscViewerFileClose_CGNS(PetscViewer viewer) { 245f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS *)viewer->data; 255f34f2dcSJed Brown 265f34f2dcSJed Brown PetscFunctionBegin; 275f34f2dcSJed Brown if (cgv->output_times) { 285f34f2dcSJed Brown size_t size, width = 32; 295f34f2dcSJed Brown char *solnames; 305f34f2dcSJed Brown PetscReal *times; 315f34f2dcSJed Brown cgsize_t num_times; 325f34f2dcSJed Brown PetscCall(PetscSegBufferGetSize(cgv->output_times, &size)); 335f34f2dcSJed Brown PetscCall(PetscSegBufferExtractInPlace(cgv->output_times, ×)); 345f34f2dcSJed Brown num_times = size; 355f34f2dcSJed Brown PetscCallCGNS(cg_biter_write(cgv->file_num, cgv->base, "TimeIterValues", num_times)); 365f34f2dcSJed Brown PetscCallCGNS(cg_goto(cgv->file_num, cgv->base, "BaseIterativeData_t", 1, NULL)); 375f34f2dcSJed Brown PetscCallCGNS(cg_array_write("TimeValues", CGNS_ENUMV(RealDouble), 1, &num_times, times)); 385f34f2dcSJed Brown PetscCall(PetscSegBufferDestroy(&cgv->output_times)); 395f34f2dcSJed Brown PetscCallCGNS(cg_ziter_write(cgv->file_num, cgv->base, cgv->zone, "ZoneIterativeData")); 405f34f2dcSJed Brown PetscCallCGNS(cg_goto(cgv->file_num, cgv->base, "Zone_t", cgv->zone, "ZoneIterativeData_t", 1, NULL)); 415f34f2dcSJed Brown PetscCall(PetscMalloc(size * width + 1, &solnames)); 425f34f2dcSJed Brown for (size_t i = 0; i < size; i++) PetscCall(PetscSNPrintf(&solnames[i * width], width + 1, "FlowSolution%-20zu", i)); 435f34f2dcSJed Brown cgsize_t shape[2] = {(cgsize_t)width, (cgsize_t)size}; 445f34f2dcSJed Brown PetscCallCGNS(cg_array_write("FlowSolutionPointers", CGNS_ENUMV(Character), 2, shape, solnames)); 455f34f2dcSJed Brown // The VTK reader looks for names like FlowSolution*Pointers. 465f34f2dcSJed Brown for (size_t i = 0; i < size; i++) PetscCall(PetscSNPrintf(&solnames[i * width], width + 1, "%-32s", "CellInfo")); 475f34f2dcSJed Brown PetscCallCGNS(cg_array_write("FlowSolutionCellInfoPointers", CGNS_ENUMV(Character), 2, shape, solnames)); 485f34f2dcSJed Brown PetscCall(PetscFree(solnames)); 495f34f2dcSJed Brown 505f34f2dcSJed Brown PetscCallCGNS(cg_simulation_type_write(cgv->file_num, cgv->base, CGNS_ENUMV(TimeAccurate))); 515f34f2dcSJed Brown } 525f34f2dcSJed Brown PetscCall(PetscFree(cgv->filename)); 535f34f2dcSJed Brown #if defined(PETSC_HDF5_HAVE_PARALLEL) 545f34f2dcSJed Brown PetscCallCGNS(cgp_close(cgv->file_num)); 555f34f2dcSJed Brown #else 565f34f2dcSJed Brown if (cgv->file_num) PetscCallCGNS(cg_close(cgv->file_num)); 575f34f2dcSJed Brown #endif 585f34f2dcSJed Brown cgv->file_num = 0; 595f34f2dcSJed Brown PetscFunctionReturn(0); 605f34f2dcSJed Brown } 615f34f2dcSJed Brown 629371c9d4SSatish Balay static PetscErrorCode PetscViewerDestroy_CGNS(PetscViewer viewer) { 635f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS *)viewer->data; 645f34f2dcSJed Brown 655f34f2dcSJed Brown PetscFunctionBegin; 665f34f2dcSJed Brown PetscCall(PetscViewerFileClose_CGNS(viewer)); 675f34f2dcSJed Brown PetscCall(PetscFree(cgv->node_l2g)); 685f34f2dcSJed Brown PetscCall(PetscFree(cgv->nodal_field)); 695f34f2dcSJed Brown PetscCall(PetscFree(cgv)); 705f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileSetName_C", NULL)); 715f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileGetName_C", NULL)); 725f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileSetMode_C", NULL)); 735f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileGetMode_C", NULL)); 745f34f2dcSJed Brown PetscFunctionReturn(0); 755f34f2dcSJed Brown } 765f34f2dcSJed Brown 779371c9d4SSatish Balay static PetscErrorCode PetscViewerFileSetMode_CGNS(PetscViewer viewer, PetscFileMode type) { 785f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS *)viewer->data; 795f34f2dcSJed Brown 805f34f2dcSJed Brown PetscFunctionBegin; 815f34f2dcSJed Brown cgv->btype = type; 825f34f2dcSJed Brown PetscFunctionReturn(0); 835f34f2dcSJed Brown } 845f34f2dcSJed Brown 859371c9d4SSatish Balay static PetscErrorCode PetscViewerFileGetMode_CGNS(PetscViewer viewer, PetscFileMode *type) { 865f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS *)viewer->data; 875f34f2dcSJed Brown 885f34f2dcSJed Brown PetscFunctionBegin; 895f34f2dcSJed Brown *type = cgv->btype; 905f34f2dcSJed Brown PetscFunctionReturn(0); 915f34f2dcSJed Brown } 925f34f2dcSJed Brown 939371c9d4SSatish Balay static PetscErrorCode PetscViewerFileSetName_CGNS(PetscViewer viewer, const char *filename) { 945f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS *)viewer->data; 955f34f2dcSJed Brown 965f34f2dcSJed Brown PetscFunctionBegin; 975f34f2dcSJed Brown if (cgv->file_num) PetscCallCGNS(cg_close(cgv->file_num)); 985f34f2dcSJed Brown PetscCall(PetscFree(cgv->filename)); 995f34f2dcSJed Brown PetscCall(PetscStrallocpy(filename, &cgv->filename)); 1005f34f2dcSJed Brown 1015f34f2dcSJed Brown switch (cgv->btype) { 1029371c9d4SSatish Balay case FILE_MODE_READ: SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "FILE_MODE_READ not yet implemented"); break; 1035f34f2dcSJed Brown case FILE_MODE_WRITE: 1045f34f2dcSJed Brown #if defined(PETSC_HDF5_HAVE_PARALLEL) 1055f34f2dcSJed Brown PetscCallCGNS(cgp_mpi_comm(PetscObjectComm((PetscObject)viewer))); 1065f34f2dcSJed Brown PetscCallCGNS(cgp_open(filename, CG_MODE_WRITE, &cgv->file_num)); 1075f34f2dcSJed Brown #else 1085f34f2dcSJed Brown PetscCallCGNS(cg_open(filename, CG_MODE_WRITE, &cgv->file_num)); 1095f34f2dcSJed Brown #endif 1105f34f2dcSJed Brown break; 1119371c9d4SSatish Balay case FILE_MODE_UNDEFINED: SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_ORDER, "Must call PetscViewerFileSetMode() before PetscViewerFileSetName()"); 1129371c9d4SSatish Balay default: SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Unsupported file mode %s", PetscFileModes[cgv->btype]); 1135f34f2dcSJed Brown } 1145f34f2dcSJed Brown PetscFunctionReturn(0); 1155f34f2dcSJed Brown } 1165f34f2dcSJed Brown 1179371c9d4SSatish Balay static PetscErrorCode PetscViewerFileGetName_CGNS(PetscViewer viewer, const char **filename) { 1185f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS *)viewer->data; 1195f34f2dcSJed Brown 1205f34f2dcSJed Brown PetscFunctionBegin; 1215f34f2dcSJed Brown *filename = cgv->filename; 1225f34f2dcSJed Brown PetscFunctionReturn(0); 1235f34f2dcSJed Brown } 1245f34f2dcSJed Brown 1255f34f2dcSJed Brown /*MC 1265f34f2dcSJed Brown PETSCVIEWERCGNS - A viewer for CGNS files 1275f34f2dcSJed Brown 1285f34f2dcSJed Brown Level: beginner 129811af0c4SBarry Smith 130811af0c4SBarry Smith .seealso: `PetscViewerCreate()`, `VecView()`, `DMView()`, `PetscViewerFileSetName()`, `PetscViewerFileSetMode()` 1315f34f2dcSJed Brown M*/ 1325f34f2dcSJed Brown 1339371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PetscViewerCreate_CGNS(PetscViewer v) { 1345f34f2dcSJed Brown PetscViewer_CGNS *cgv; 1355f34f2dcSJed Brown 1365f34f2dcSJed Brown PetscFunctionBegin; 137*4dfa11a4SJacob Faibussowitsch PetscCall(PetscNew(&cgv)); 1385f34f2dcSJed Brown 1395f34f2dcSJed Brown v->data = cgv; 1405f34f2dcSJed Brown v->ops->destroy = PetscViewerDestroy_CGNS; 1415f34f2dcSJed Brown v->ops->setfromoptions = PetscViewerSetFromOptions_CGNS; 1425f34f2dcSJed Brown v->ops->view = PetscViewerView_CGNS; 1435f34f2dcSJed Brown cgv->btype = FILE_MODE_UNDEFINED; 1445f34f2dcSJed Brown cgv->filename = NULL; 1455f34f2dcSJed Brown 1465f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileSetName_C", PetscViewerFileSetName_CGNS)); 1475f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileGetName_C", PetscViewerFileGetName_CGNS)); 1485f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileSetMode_C", PetscViewerFileSetMode_CGNS)); 1495f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileGetMode_C", PetscViewerFileGetMode_CGNS)); 1505f34f2dcSJed Brown PetscFunctionReturn(0); 1515f34f2dcSJed Brown } 152