xref: /petsc/src/dm/impls/plex/plexfluent.c (revision 2f0bd6dcb9a57d90d41f28dab0c7c03dccc1eb08)
1 #define PETSCDM_DLL
2 #include <petsc-private/dmpleximpl.h>    /*I   "petscdmplex.h"   I*/
3 
4 #undef __FUNCT__
5 #define __FUNCT__ "DMPlexCreateFluentFromFile"
6 /*@C
7   DMPlexCreateFluentFromFile - Create a DMPlex mesh from a Fluent mesh file
8 
9 + comm        - The MPI communicator
10 . filename    - Name of the Fluent mesh file
11 - interpolate - Create faces and edges in the mesh
12 
13   Output Parameter:
14 . dm  - The DM object representing the mesh
15 
16   Level: beginner
17 
18 .seealso: DMPlexCreateFromFile(), DMPlexCreateFluent(), DMPlexCreate()
19 @*/
20 PetscErrorCode DMPlexCreateFluentFromFile(MPI_Comm comm, const char filename[], PetscBool interpolate, DM *dm)
21 {
22   PetscViewer     viewer;
23   PetscErrorCode  ierr;
24 
25   PetscFunctionBegin;
26   /* Create file viewer and build plex */
27   ierr = PetscViewerCreate(comm, &viewer);CHKERRQ(ierr);
28   ierr = PetscViewerSetType(viewer, PETSCVIEWERASCII);CHKERRQ(ierr);
29   ierr = PetscViewerFileSetMode(viewer, FILE_MODE_READ);CHKERRQ(ierr);
30   ierr = PetscViewerFileSetName(viewer, filename);CHKERRQ(ierr);
31   ierr = DMPlexCreateFluent(comm, viewer, interpolate, dm);CHKERRQ(ierr);
32   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
33   PetscFunctionReturn(0);
34 }
35 
36 #undef __FUNCT__
37 #define __FUNCT__ "DMPlexCreateFluent_ReadString"
38 PetscErrorCode DMPlexCreateFluent_ReadString(PetscViewer viewer, char *buffer, char delim)
39 {
40   PetscInt i = 0;
41   PetscErrorCode ierr;
42 
43   PetscFunctionBegin;
44   do {ierr = PetscViewerRead(viewer, &(buffer[i++]), 1, PETSC_CHAR);CHKERRQ(ierr);}
45   while (buffer[i-1] != '\0' && buffer[i-1] != delim);
46   buffer[i] = '\0';
47   PetscFunctionReturn(0);
48 }
49 
50 #undef __FUNCT__
51 #define __FUNCT__ "DMPlexCreateFluent_ReadSection"
52 PetscErrorCode DMPlexCreateFluent_ReadSection(PetscViewer viewer, FluentSection *s)
53 {
54   char           buffer[PETSC_MAX_PATH_LEN];
55   int            snum;
56   PetscErrorCode ierr;
57 
58   PetscFunctionBegin;
59   /* Fast-forward to next section and derive its index */
60   ierr = DMPlexCreateFluent_ReadString(viewer, buffer, '(');CHKERRQ(ierr);
61   ierr = DMPlexCreateFluent_ReadString(viewer, buffer, ' ');CHKERRQ(ierr);
62   snum = sscanf(buffer, "%d", &(s->index));
63   /* If we can't match an index return -1 to signal end-of-file */
64   if (snum < 1) {s->index = -1;   PetscFunctionReturn(0);}
65 
66   if (s->index == 0) {           /* Comment */
67     ierr = DMPlexCreateFluent_ReadString(viewer, buffer, ')');CHKERRQ(ierr);
68 
69   } else if (s->index == 2) {    /* Dimension */
70     ierr = DMPlexCreateFluent_ReadString(viewer, buffer, ')');CHKERRQ(ierr);
71     snum = sscanf(buffer, "%d", &(s->nd));
72     if (snum != 1) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "File is not a valid Fluent file");
73 
74   } else if (s->index == 10) {   /* Vertices */
75     ierr = DMPlexCreateFluent_ReadString(viewer, buffer, ')');CHKERRQ(ierr);
76     snum = sscanf(buffer, "(%x %x %x %d %d)", &(s->zoneID), &(s->first), &(s->last), &(s->type), &(s->nd));
77     if (snum != 5) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "File is not a valid Fluent file");
78     ierr = DMPlexCreateFluent_ReadString(viewer, buffer, ')');CHKERRQ(ierr);
79 
80   } else if (s->index == 12) {   /* Cells */
81     ierr = DMPlexCreateFluent_ReadString(viewer, buffer, ')');CHKERRQ(ierr);
82     snum = sscanf(buffer, "(%x", &(s->zoneID));
83     if (snum != 1) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "File is not a valid Fluent file");
84     if (s->zoneID == 0) {  /* Header section */
85       snum = sscanf(buffer, "(%x %x %x %d)", &(s->zoneID), &(s->first), &(s->last), &(s->nd));
86       if (snum != 4) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "File is not a valid Fluent file");
87     } else {
88       snum = sscanf(buffer, "(%x %x %x %d %d)", &(s->zoneID), &(s->first), &(s->last), &(s->type), &(s->nd));
89       if (snum != 5) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "File is not a valid Fluent file");
90     }
91     ierr = DMPlexCreateFluent_ReadString(viewer, buffer, ')');CHKERRQ(ierr);
92 
93   } else if (s->index == 13) {   /* Faces */
94     ierr = DMPlexCreateFluent_ReadString(viewer, buffer, ')');CHKERRQ(ierr);
95     snum = sscanf(buffer, "(%x", &(s->zoneID));
96     if (snum != 1) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "File is not a valid Fluent file");
97     if (s->zoneID == 0) {  /* Header section */
98       snum = sscanf(buffer, "(%x %x %x %d)", &(s->zoneID), &(s->first), &(s->last), &(s->nd));
99       if (snum != 4) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "File is not a valid Fluent file");
100     } else {
101       snum = sscanf(buffer, "(%x %x %x %d %d)", &(s->zoneID), &(s->first), &(s->last), &(s->type), &(s->nd));
102       if (snum != 5) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "File is not a valid Fluent file");
103     }
104     ierr = DMPlexCreateFluent_ReadString(viewer, buffer, ')');CHKERRQ(ierr);
105 
106   } else {                       /* Unknown section type */
107     PetscInt depth = 1;
108     do {
109       /* Match parentheses when parsing unknown sections */
110       do {ierr = PetscViewerRead(viewer, &(buffer[0]), 1, PETSC_CHAR);CHKERRQ(ierr);}
111       while (buffer[0] != '(' && buffer[0] != ')');
112       if (buffer[0] == '(') depth++;
113       if (buffer[0] == ')') depth--;
114     } while (depth > 0);
115     ierr = DMPlexCreateFluent_ReadString(viewer, buffer, '\n');CHKERRQ(ierr);
116   }
117   PetscFunctionReturn(0);
118 }
119 
120 #undef __FUNCT__
121 #define __FUNCT__ "DMPlexCreateFluent"
122 /*@C
123   DMPlexCreateFluent - Create a DMPlex mesh from a Fluent mesh file.
124 
125   Collective on comm
126 
127   Input Parameters:
128 + comm  - The MPI communicator
129 . viewer - The Viewer associated with a Fluent mesh file
130 - interpolate - Create faces and edges in the mesh
131 
132   Output Parameter:
133 . dm  - The DM object representing the mesh
134 
135   Note: http://aerojet.engr.ucdavis.edu/fluenthelp/html/ug/node1490.htm
136 
137   Level: beginner
138 
139 .keywords: mesh, fluent, case
140 .seealso: DMPLEX, DMCreate()
141 @*/
142 PetscErrorCode DMPlexCreateFluent(MPI_Comm comm, PetscViewer viewer, PetscBool interpolate, DM *dm)
143 {
144   PetscMPIInt    rank;
145   PetscErrorCode ierr;
146 
147   PetscFunctionBegin;
148   ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
149 
150   if (!rank) {
151     FluentSection s;
152     do {
153       ierr = DMPlexCreateFluent_ReadSection(viewer, &s);CHKERRQ(ierr);
154       if (s.index == 2) {                 /* Dimension */
155 
156       } else if (s.index == 10) {         /* Vertices */
157 
158       } else if (s.index == 12) {         /* Cells */
159 
160       } else if (s.index == 13) {         /* Facets */
161 
162       }
163     } while (s.index >= 0);
164   }
165   PetscFunctionReturn(0);
166 }
167