Actual source code: plexexodusii.c
1: #define PETSCDM_DLL
2: #include <petsc/private/dmpleximpl.h>
3: #include <petsc/private/viewerimpl.h>
5: /*@
6: PetscViewerExodusIIGetId - Get the file id of the `PETSCVIEWEREXODUSII` file
8: Logically Collective
10: Input Parameter:
11: . viewer - the `PetscViewer`
13: Output Parameter:
14: . exoid - The ExodusII file id
16: Level: intermediate
18: .seealso: `PETSCVIEWEREXODUSII`, `PetscViewer`, `PetscViewerFileSetMode()`, `PetscViewerCreate()`, `PetscViewerSetType()`, `PetscViewerBinaryOpen()`
19: @*/
20: PetscErrorCode PetscViewerExodusIIGetId(PetscViewer viewer, int *exoid)
21: {
22: PetscFunctionBegin;
24: PetscTryMethod(viewer, "PetscViewerGetId_C", (PetscViewer, int *), (viewer, exoid));
25: PetscFunctionReturn(PETSC_SUCCESS);
26: }
28: /*@
29: PetscViewerExodusIISetOrder - Set the elements order in the exodusII file.
31: Collective
33: Input Parameters:
34: + viewer - the `PETSCVIEWEREXODUSII` viewer
35: - order - elements order
37: Output Parameter:
39: Level: beginner
41: .seealso: `PETSCVIEWEREXODUSII`, `PetscViewer`, `PetscViewerExodusIIGetId()`, `PetscViewerExodusIIGetOrder()`
42: @*/
43: PetscErrorCode PetscViewerExodusIISetOrder(PetscViewer viewer, PetscInt order)
44: {
45: PetscFunctionBegin;
47: PetscTryMethod(viewer, "PetscViewerSetOrder_C", (PetscViewer, PetscInt), (viewer, order));
48: PetscFunctionReturn(PETSC_SUCCESS);
49: }
51: /*@
52: PetscViewerExodusIIGetOrder - Get the elements order in the exodusII file.
54: Collective
56: Input Parameters:
57: + viewer - the `PETSCVIEWEREXODUSII` viewer
58: - order - elements order
60: Output Parameter:
62: Level: beginner
64: .seealso: `PETSCVIEWEREXODUSII`, `PetscViewer`, `PetscViewerExodusIIGetId()`, `PetscViewerExodusIISetOrder()`
65: @*/
66: PetscErrorCode PetscViewerExodusIIGetOrder(PetscViewer viewer, PetscInt *order)
67: {
68: PetscFunctionBegin;
70: PetscTryMethod(viewer, "PetscViewerGetOrder_C", (PetscViewer, PetscInt *), (viewer, order));
71: PetscFunctionReturn(PETSC_SUCCESS);
72: }
74: /*@
75: PetscViewerExodusIIOpen - Opens a file for ExodusII input/output.
77: Collective
79: Input Parameters:
80: + comm - MPI communicator
81: . name - name of file
82: - type - type of file
83: .vb
84: FILE_MODE_WRITE - create new file for binary output
85: FILE_MODE_READ - open existing file for binary input
86: FILE_MODE_APPEND - open existing file for binary output
87: .ve
89: Output Parameter:
90: . exo - `PETSCVIEWEREXODUSII` `PetscViewer` for Exodus II input/output to use with the specified file
92: Level: beginner
94: .seealso: `PETSCVIEWEREXODUSII`, `PetscViewer`, `PetscViewerPushFormat()`, `PetscViewerDestroy()`,
95: `DMLoad()`, `PetscFileMode`, `PetscViewerSetType()`, `PetscViewerFileSetMode()`, `PetscViewerFileSetName()`
96: @*/
97: PetscErrorCode PetscViewerExodusIIOpen(MPI_Comm comm, const char name[], PetscFileMode type, PetscViewer *exo)
98: {
99: PetscFunctionBegin;
100: PetscCall(PetscViewerCreate(comm, exo));
101: PetscCall(PetscViewerSetType(*exo, PETSCVIEWEREXODUSII));
102: PetscCall(PetscViewerFileSetMode(*exo, type));
103: PetscCall(PetscViewerFileSetName(*exo, name));
104: PetscCall(PetscViewerSetFromOptions(*exo));
105: PetscFunctionReturn(PETSC_SUCCESS);
106: }
108: /*@
109: DMPlexCreateExodusFromFile - Create a `DMPLEX` mesh from an ExodusII file.
111: Collective
113: Input Parameters:
114: + comm - The MPI communicator
115: . filename - The name of the ExodusII file
116: - interpolate - Create faces and edges in the mesh
118: Output Parameter:
119: . dm - The `DM` object representing the mesh
121: Level: beginner
123: .seealso: [](ch_unstructured), `DM`, `PETSCVIEWEREXODUSII`, `DMPLEX`, `DMCreate()`, `DMPlexCreateExodus()`
124: @*/
125: PetscErrorCode DMPlexCreateExodusFromFile(MPI_Comm comm, const char filename[], PetscBool interpolate, DM *dm)
126: {
127: PetscFunctionBegin;
128: #if defined(PETSC_HAVE_EXODUSII)
129: PetscMPIInt rank;
130: PetscExodusIIInt CPU_word_size = sizeof(PetscReal), IO_word_size = 0, exoid = -1;
131: float version;
133: PetscAssertPointer(filename, 2);
134: PetscCallMPI(MPI_Comm_rank(comm, &rank));
135: if (rank == 0) {
136: exoid = ex_open(filename, EX_READ, &CPU_word_size, &IO_word_size, &version);
137: PetscCheck(exoid > 0, PETSC_COMM_SELF, PETSC_ERR_LIB, "ex_open(\"%s\",...) did not return a valid file ID", filename);
138: }
139: PetscCall(DMPlexCreateExodus(comm, exoid, interpolate, dm));
140: if (rank == 0) PetscCallExternal(ex_close, exoid);
141: PetscFunctionReturn(PETSC_SUCCESS);
142: #else
143: SETERRQ(comm, PETSC_ERR_SUP, "Loading meshes requires EXODUSII support. Reconfigure using --with-exodusii-dir or -download-exodusii");
144: #endif
145: }