Actual source code: plexexodusii.c
1: #include <petsc/private/dmpleximpl.h>
2: #include <petsc/private/viewerimpl.h>
4: /*@
5: PetscViewerExodusIIGetId - Get the file id of the `PETSCVIEWEREXODUSII` file
7: Logically Collective
9: Input Parameter:
10: . viewer - the `PetscViewer`
12: Output Parameter:
13: . exoid - The ExodusII file id
15: Level: intermediate
17: .seealso: `PETSCVIEWEREXODUSII`, `PetscViewer`, `PetscViewerFileSetMode()`, `PetscViewerCreate()`, `PetscViewerSetType()`, `PetscViewerBinaryOpen()`
18: @*/
19: PetscErrorCode PetscViewerExodusIIGetId(PetscViewer viewer, int *exoid)
20: {
21: PetscFunctionBegin;
23: PetscTryMethod(viewer, "PetscViewerGetId_C", (PetscViewer, int *), (viewer, exoid));
24: PetscFunctionReturn(PETSC_SUCCESS);
25: }
27: /*@
28: PetscViewerExodusIISetOrder - Set the elements order in the ExodusII file.
30: Collective
32: Input Parameters:
33: + viewer - the `PETSCVIEWEREXODUSII` viewer
34: - order - elements order
36: Output Parameter:
38: Level: beginner
40: .seealso: `PETSCVIEWEREXODUSII`, `PetscViewer`, `PetscViewerExodusIIGetId()`, `PetscViewerExodusIIGetOrder()`
41: @*/
42: PetscErrorCode PetscViewerExodusIISetOrder(PetscViewer viewer, PetscInt order)
43: {
44: PetscFunctionBegin;
46: PetscTryMethod(viewer, "PetscViewerSetOrder_C", (PetscViewer, PetscInt), (viewer, order));
47: PetscFunctionReturn(PETSC_SUCCESS);
48: }
50: /*@
51: PetscViewerExodusIIGetOrder - Get the elements order in the ExodusII file.
53: Collective
55: Input Parameters:
56: + viewer - the `PETSCVIEWEREXODUSII` viewer
57: - order - elements order
59: Output Parameter:
61: Level: beginner
63: .seealso: `PETSCVIEWEREXODUSII`, `PetscViewer`, `PetscViewerExodusIIGetId()`, `PetscViewerExodusIISetOrder()`
64: @*/
65: PetscErrorCode PetscViewerExodusIIGetOrder(PetscViewer viewer, PetscInt *order)
66: {
67: PetscFunctionBegin;
69: PetscTryMethod(viewer, "PetscViewerGetOrder_C", (PetscViewer, PetscInt *), (viewer, order));
70: PetscFunctionReturn(PETSC_SUCCESS);
71: }
73: /*@
74: PetscViewerExodusIIOpen - Opens a file for ExodusII input/output.
76: Collective
78: Input Parameters:
79: + comm - MPI communicator
80: . name - name of file
81: - type - type of file
82: .vb
83: FILE_MODE_WRITE - create new file for binary output
84: FILE_MODE_READ - open existing file for binary input
85: FILE_MODE_APPEND - open existing file for binary output
86: .ve
88: Output Parameter:
89: . exo - `PETSCVIEWEREXODUSII` `PetscViewer` for Exodus II input/output to use with the specified file
91: Level: beginner
93: .seealso: `PETSCVIEWEREXODUSII`, `PetscViewer`, `PetscViewerPushFormat()`, `PetscViewerDestroy()`,
94: `DMLoad()`, `PetscFileMode`, `PetscViewerSetType()`, `PetscViewerFileSetMode()`, `PetscViewerFileSetName()`
95: @*/
96: PetscErrorCode PetscViewerExodusIIOpen(MPI_Comm comm, const char name[], PetscFileMode type, PetscViewer *exo)
97: {
98: PetscFunctionBegin;
99: PetscCall(PetscViewerCreate(comm, exo));
100: PetscCall(PetscViewerSetType(*exo, PETSCVIEWEREXODUSII));
101: PetscCall(PetscViewerFileSetMode(*exo, type));
102: PetscCall(PetscViewerFileSetName(*exo, name));
103: PetscCall(PetscViewerSetFromOptions(*exo));
104: PetscFunctionReturn(PETSC_SUCCESS);
105: }
107: /*@
108: DMPlexCreateExodusFromFile - Create a `DMPLEX` mesh from an ExodusII file.
110: Collective
112: Input Parameters:
113: + comm - The MPI communicator
114: . filename - The name of the ExodusII file
115: - interpolate - Create faces and edges in the mesh
117: Output Parameter:
118: . dm - The `DM` object representing the mesh
120: Level: beginner
122: .seealso: [](ch_unstructured), `DM`, `PETSCVIEWEREXODUSII`, `DMPLEX`, `DMCreate()`, `DMPlexCreateExodus()`
123: @*/
124: PetscErrorCode DMPlexCreateExodusFromFile(MPI_Comm comm, const char filename[], PetscBool interpolate, DM *dm)
125: {
126: PetscFunctionBegin;
127: #if defined(PETSC_HAVE_EXODUSII)
128: PetscMPIInt rank;
129: PetscExodusIIInt CPU_word_size = sizeof(PetscReal), IO_word_size = 0, exoid = -1;
130: float version;
132: PetscAssertPointer(filename, 2);
133: PetscCallMPI(MPI_Comm_rank(comm, &rank));
134: if (rank == 0) {
135: exoid = ex_open(filename, EX_READ, &CPU_word_size, &IO_word_size, &version);
136: PetscCheck(exoid > 0, PETSC_COMM_SELF, PETSC_ERR_LIB, "ex_open(\"%s\",...) did not return a valid file ID", filename);
137: }
138: PetscCall(DMPlexCreateExodus(comm, exoid, interpolate, dm));
139: if (rank == 0) PetscCallExternal(ex_close, exoid);
140: PetscFunctionReturn(PETSC_SUCCESS);
141: #else
142: SETERRQ(comm, PETSC_ERR_SUP, "Loading meshes requires EXODUSII support. Reconfigure using --with-exodusii-dir or -download-exodusii");
143: #endif
144: }