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