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 8*d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerSetFromOptions_CGNS(PetscViewer v, PetscOptionItems *PetscOptionsObject) 9*d71ae5a4SJacob Faibussowitsch { 105f34f2dcSJed Brown PetscFunctionBegin; 115f34f2dcSJed Brown PetscOptionsHeadBegin(PetscOptionsObject, "CGNS Viewer Options"); 125f34f2dcSJed Brown PetscOptionsHeadEnd(); 135f34f2dcSJed Brown PetscFunctionReturn(0); 145f34f2dcSJed Brown } 155f34f2dcSJed Brown 16*d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerView_CGNS(PetscViewer v, PetscViewer viewer) 17*d71ae5a4SJacob Faibussowitsch { 185f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS *)v->data; 195f34f2dcSJed Brown 205f34f2dcSJed Brown PetscFunctionBegin; 2148a46eb9SPierre Jolivet if (cgv->filename) PetscCall(PetscViewerASCIIPrintf(viewer, "Filename: %s\n", cgv->filename)); 225f34f2dcSJed Brown PetscFunctionReturn(0); 235f34f2dcSJed Brown } 245f34f2dcSJed Brown 25*d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileClose_CGNS(PetscViewer viewer) 26*d71ae5a4SJacob Faibussowitsch { 275f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS *)viewer->data; 285f34f2dcSJed Brown 295f34f2dcSJed Brown PetscFunctionBegin; 305f34f2dcSJed Brown if (cgv->output_times) { 315f34f2dcSJed Brown size_t size, width = 32; 325f34f2dcSJed Brown char *solnames; 335f34f2dcSJed Brown PetscReal *times; 345f34f2dcSJed Brown cgsize_t num_times; 355f34f2dcSJed Brown PetscCall(PetscSegBufferGetSize(cgv->output_times, &size)); 365f34f2dcSJed Brown PetscCall(PetscSegBufferExtractInPlace(cgv->output_times, ×)); 375f34f2dcSJed Brown num_times = size; 385f34f2dcSJed Brown PetscCallCGNS(cg_biter_write(cgv->file_num, cgv->base, "TimeIterValues", num_times)); 395f34f2dcSJed Brown PetscCallCGNS(cg_goto(cgv->file_num, cgv->base, "BaseIterativeData_t", 1, NULL)); 405f34f2dcSJed Brown PetscCallCGNS(cg_array_write("TimeValues", CGNS_ENUMV(RealDouble), 1, &num_times, times)); 415f34f2dcSJed Brown PetscCall(PetscSegBufferDestroy(&cgv->output_times)); 425f34f2dcSJed Brown PetscCallCGNS(cg_ziter_write(cgv->file_num, cgv->base, cgv->zone, "ZoneIterativeData")); 435f34f2dcSJed Brown PetscCallCGNS(cg_goto(cgv->file_num, cgv->base, "Zone_t", cgv->zone, "ZoneIterativeData_t", 1, NULL)); 445f34f2dcSJed Brown PetscCall(PetscMalloc(size * width + 1, &solnames)); 455f34f2dcSJed Brown for (size_t i = 0; i < size; i++) PetscCall(PetscSNPrintf(&solnames[i * width], width + 1, "FlowSolution%-20zu", i)); 465f34f2dcSJed Brown cgsize_t shape[2] = {(cgsize_t)width, (cgsize_t)size}; 475f34f2dcSJed Brown PetscCallCGNS(cg_array_write("FlowSolutionPointers", CGNS_ENUMV(Character), 2, shape, solnames)); 485f34f2dcSJed Brown // The VTK reader looks for names like FlowSolution*Pointers. 495f34f2dcSJed Brown for (size_t i = 0; i < size; i++) PetscCall(PetscSNPrintf(&solnames[i * width], width + 1, "%-32s", "CellInfo")); 505f34f2dcSJed Brown PetscCallCGNS(cg_array_write("FlowSolutionCellInfoPointers", CGNS_ENUMV(Character), 2, shape, solnames)); 515f34f2dcSJed Brown PetscCall(PetscFree(solnames)); 525f34f2dcSJed Brown 535f34f2dcSJed Brown PetscCallCGNS(cg_simulation_type_write(cgv->file_num, cgv->base, CGNS_ENUMV(TimeAccurate))); 545f34f2dcSJed Brown } 555f34f2dcSJed Brown PetscCall(PetscFree(cgv->filename)); 565f34f2dcSJed Brown #if defined(PETSC_HDF5_HAVE_PARALLEL) 575f34f2dcSJed Brown PetscCallCGNS(cgp_close(cgv->file_num)); 585f34f2dcSJed Brown #else 595f34f2dcSJed Brown if (cgv->file_num) PetscCallCGNS(cg_close(cgv->file_num)); 605f34f2dcSJed Brown #endif 615f34f2dcSJed Brown cgv->file_num = 0; 625f34f2dcSJed Brown PetscFunctionReturn(0); 635f34f2dcSJed Brown } 645f34f2dcSJed Brown 65*d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerDestroy_CGNS(PetscViewer viewer) 66*d71ae5a4SJacob Faibussowitsch { 675f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS *)viewer->data; 685f34f2dcSJed Brown 695f34f2dcSJed Brown PetscFunctionBegin; 705f34f2dcSJed Brown PetscCall(PetscViewerFileClose_CGNS(viewer)); 715f34f2dcSJed Brown PetscCall(PetscFree(cgv->node_l2g)); 725f34f2dcSJed Brown PetscCall(PetscFree(cgv->nodal_field)); 735f34f2dcSJed Brown PetscCall(PetscFree(cgv)); 745f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileSetName_C", NULL)); 755f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileGetName_C", NULL)); 765f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileSetMode_C", NULL)); 775f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileGetMode_C", NULL)); 785f34f2dcSJed Brown PetscFunctionReturn(0); 795f34f2dcSJed Brown } 805f34f2dcSJed Brown 81*d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileSetMode_CGNS(PetscViewer viewer, PetscFileMode type) 82*d71ae5a4SJacob Faibussowitsch { 835f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS *)viewer->data; 845f34f2dcSJed Brown 855f34f2dcSJed Brown PetscFunctionBegin; 865f34f2dcSJed Brown cgv->btype = type; 875f34f2dcSJed Brown PetscFunctionReturn(0); 885f34f2dcSJed Brown } 895f34f2dcSJed Brown 90*d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileGetMode_CGNS(PetscViewer viewer, PetscFileMode *type) 91*d71ae5a4SJacob Faibussowitsch { 925f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS *)viewer->data; 935f34f2dcSJed Brown 945f34f2dcSJed Brown PetscFunctionBegin; 955f34f2dcSJed Brown *type = cgv->btype; 965f34f2dcSJed Brown PetscFunctionReturn(0); 975f34f2dcSJed Brown } 985f34f2dcSJed Brown 99*d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileSetName_CGNS(PetscViewer viewer, const char *filename) 100*d71ae5a4SJacob Faibussowitsch { 1015f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS *)viewer->data; 1025f34f2dcSJed Brown 1035f34f2dcSJed Brown PetscFunctionBegin; 1045f34f2dcSJed Brown if (cgv->file_num) PetscCallCGNS(cg_close(cgv->file_num)); 1055f34f2dcSJed Brown PetscCall(PetscFree(cgv->filename)); 1065f34f2dcSJed Brown PetscCall(PetscStrallocpy(filename, &cgv->filename)); 1075f34f2dcSJed Brown 1085f34f2dcSJed Brown switch (cgv->btype) { 109*d71ae5a4SJacob Faibussowitsch case FILE_MODE_READ: 110*d71ae5a4SJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "FILE_MODE_READ not yet implemented"); 111*d71ae5a4SJacob Faibussowitsch break; 1125f34f2dcSJed Brown case FILE_MODE_WRITE: 1135f34f2dcSJed Brown #if defined(PETSC_HDF5_HAVE_PARALLEL) 1145f34f2dcSJed Brown PetscCallCGNS(cgp_mpi_comm(PetscObjectComm((PetscObject)viewer))); 1155f34f2dcSJed Brown PetscCallCGNS(cgp_open(filename, CG_MODE_WRITE, &cgv->file_num)); 1165f34f2dcSJed Brown #else 1175f34f2dcSJed Brown PetscCallCGNS(cg_open(filename, CG_MODE_WRITE, &cgv->file_num)); 1185f34f2dcSJed Brown #endif 1195f34f2dcSJed Brown break; 120*d71ae5a4SJacob Faibussowitsch case FILE_MODE_UNDEFINED: 121*d71ae5a4SJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_ORDER, "Must call PetscViewerFileSetMode() before PetscViewerFileSetName()"); 122*d71ae5a4SJacob Faibussowitsch default: 123*d71ae5a4SJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Unsupported file mode %s", PetscFileModes[cgv->btype]); 1245f34f2dcSJed Brown } 1255f34f2dcSJed Brown PetscFunctionReturn(0); 1265f34f2dcSJed Brown } 1275f34f2dcSJed Brown 128*d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileGetName_CGNS(PetscViewer viewer, const char **filename) 129*d71ae5a4SJacob Faibussowitsch { 1305f34f2dcSJed Brown PetscViewer_CGNS *cgv = (PetscViewer_CGNS *)viewer->data; 1315f34f2dcSJed Brown 1325f34f2dcSJed Brown PetscFunctionBegin; 1335f34f2dcSJed Brown *filename = cgv->filename; 1345f34f2dcSJed Brown PetscFunctionReturn(0); 1355f34f2dcSJed Brown } 1365f34f2dcSJed Brown 1375f34f2dcSJed Brown /*MC 1385f34f2dcSJed Brown PETSCVIEWERCGNS - A viewer for CGNS files 1395f34f2dcSJed Brown 1405f34f2dcSJed Brown Level: beginner 141811af0c4SBarry Smith 142811af0c4SBarry Smith .seealso: `PetscViewerCreate()`, `VecView()`, `DMView()`, `PetscViewerFileSetName()`, `PetscViewerFileSetMode()` 1435f34f2dcSJed Brown M*/ 1445f34f2dcSJed Brown 145*d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscViewerCreate_CGNS(PetscViewer v) 146*d71ae5a4SJacob Faibussowitsch { 1475f34f2dcSJed Brown PetscViewer_CGNS *cgv; 1485f34f2dcSJed Brown 1495f34f2dcSJed Brown PetscFunctionBegin; 1504dfa11a4SJacob Faibussowitsch PetscCall(PetscNew(&cgv)); 1515f34f2dcSJed Brown 1525f34f2dcSJed Brown v->data = cgv; 1535f34f2dcSJed Brown v->ops->destroy = PetscViewerDestroy_CGNS; 1545f34f2dcSJed Brown v->ops->setfromoptions = PetscViewerSetFromOptions_CGNS; 1555f34f2dcSJed Brown v->ops->view = PetscViewerView_CGNS; 1565f34f2dcSJed Brown cgv->btype = FILE_MODE_UNDEFINED; 1575f34f2dcSJed Brown cgv->filename = NULL; 1585f34f2dcSJed Brown 1595f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileSetName_C", PetscViewerFileSetName_CGNS)); 1605f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileGetName_C", PetscViewerFileGetName_CGNS)); 1615f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileSetMode_C", PetscViewerFileSetMode_CGNS)); 1625f34f2dcSJed Brown PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileGetMode_C", PetscViewerFileGetMode_CGNS)); 1635f34f2dcSJed Brown PetscFunctionReturn(0); 1645f34f2dcSJed Brown } 165