Actual source code: meshbardhan.c

petsc-3.4.5 2014-06-29
  1: #include <petscdmmesh_formats.hh>   /*I      "petscmesh.h"   I*/

  3: namespace ALE {
  4: namespace Bardhan {
  5: void Builder::readInpFile(MPI_Comm comm, const std::string& filename, const int dim, const int numCorners, int& numElements, int *vertices[], int& numVertices, PetscReal *coordinates[], PetscReal *faceNormals[])
  6: {
  7:   PetscViewer    viewer;
  8:   FILE           *f;
  9:   PetscReal      *coords;
 10:   PetscReal      *normals;
 11:   PetscInt       *verts;
 12:   PetscInt       commRank;
 13:   char           buf[2048];

 16:   MPI_Comm_rank(comm, &commRank);
 17:   if (commRank != 0) return;
 18:   PetscViewerCreate(PETSC_COMM_SELF, &viewer);
 19:   PetscViewerSetType(viewer, PETSCVIEWERASCII);
 20:   PetscViewerFileSetMode(viewer, FILE_MODE_READ);
 21:   PetscViewerFileSetName(viewer, filename.c_str());
 22:   PetscViewerASCIIGetPointer(viewer, &f);
 23:   // Read header
 24:   if (!fgets(buf, 2048, f)) throw ALE::Exception("File ended prematurely");
 25:   // Number of vertices
 26:   const char *x = strtok(buf, " ");
 27:   numVertices = atoi(x);
 28:   // Number of elements
 29:   x           = strtok(NULL, " ");
 30:   numElements = atoi(x);

 32:   PetscMalloc(numVertices*(dim+1) * sizeof(PetscReal), &coords);CHKERRXX(ierr);
 33:   PetscMalloc(numVertices*(dim+1) * sizeof(PetscReal), &normals);CHKERRXX(ierr);

 35:   for (PetscInt i = 0; i < numVertices; ++i) {
 36:     if (!fgets(buf, 2048, f)) throw ALE::Exception("File ended prematurely");
 37:     x = strtok(buf, " ");
 38:     for (int c = 0; c < dim+1; c++) {
 39:       coords[i*(dim+1)+c] = atof(x);

 41:       x = strtok(NULL, " ");
 42:     }
 43:     for (int c = 0; c < dim+1; c++) {
 44:       normals[i*(dim+1)+c] = atof(x);

 46:       x = strtok(NULL, " ");
 47:     }
 48:     // Ignore ???
 49:     x = strtok(NULL, " ");
 50:     // Ignore ???
 51:     x = strtok(NULL, " ");
 52:     // Ignore ???
 53:     x = strtok(NULL, " ");
 54:   }
 55:   *coordinates = coords;
 56:   *faceNormals = normals;
 57:   PetscMalloc(numElements*numCorners * sizeof(PetscInt), &verts);CHKERRXX(ierr);
 58:   for (PetscInt i = 0; i < numElements; ++i) {
 59:     if (!fgets(buf, 2048, f)) throw ALE::Exception("File ended prematurely");
 60:     x = strtok(buf, " ");
 61:     for (int c = 0; c < numCorners; c++) {
 62:       verts[i*numCorners+c] = atoi(x) - 1;

 64:       x = strtok(NULL, " ");
 65:     }
 66:     // Ignore ???
 67:     x = strtok(NULL, " ");
 68:     // Ignore ???
 69:     x = strtok(NULL, " ");
 70:   }
 71:   *vertices = verts;
 72:   PetscViewerDestroy(&viewer);
 73: };
 74: Obj<Builder::Mesh> Builder::readMesh(MPI_Comm comm, const int dim, const std::string& filename, const bool interpolate = false, const int debug = 0)
 75: {
 76:   typedef ALE::Mesh<PetscInt,PetscScalar> FlexMesh;
 77:   Obj<Mesh>                                   mesh  = new Mesh(comm, dim, debug);
 78:   Obj<sieve_type>                             sieve = new sieve_type(comm, debug);
 79:   Obj<FlexMesh>                               m     = new FlexMesh(comm, dim, debug);
 80:   Obj<FlexMesh::sieve_type>                   s     = new FlexMesh::sieve_type(comm, debug);
 81:   std::map<Mesh::point_type,Mesh::point_type> renumbering;
 82:   int                                         *cells;
 83:   PetscReal                                   *coordinates, *normals;
 84:   int                                         numCells = 0, numVertices = 0, numCorners = dim+1;
 85:   PetscErrorCode                              ierr;

 87:   mesh->setSieve(sieve);
 88:   Builder::readInpFile(comm, filename, dim, numCorners, numCells, &cells, numVertices, &coordinates, &normals);
 89:   ALE::SieveBuilder<FlexMesh>::buildTopology(s, dim, numCells, cells, numVertices, interpolate, numCorners, -1, m->getArrowSection("orientation"));
 90:   m->setSieve(s);
 91:   m->stratify();
 92:   ALE::SieveBuilder<FlexMesh>::buildCoordinates(m, dim+1, coordinates);
 93:   PetscFree(cells);CHKERRXX(ierr);
 94:   PetscFree(coordinates);CHKERRXX(ierr);
 95:   PetscFree(normals);CHKERRXX(ierr);
 96:   ALE::ISieveConverter::convertMesh(*m, *mesh, renumbering, false);
 97:   return mesh;
 98: };
 99: }
100: }