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