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