⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlmesh.cpp

📁 Dolfin provide a high-performance linear algebra library
💻 CPP
字号:
// Copyright (C) 2003-2006 Anders Logg.// Licensed under the GNU LGPL Version 2.1.//// First added:  2003-10-21// Last changed: 2006-06-22#include <dolfin/dolfin_log.h>#include <dolfin/CellType.h>#include <dolfin/Mesh.h>#include <dolfin/XMLMesh.h>using namespace dolfin;//-----------------------------------------------------------------------------XMLMesh::XMLMesh(Mesh& mesh) : XMLObject(), _mesh(mesh), state(OUTSIDE){  // Do nothing}//-----------------------------------------------------------------------------XMLMesh::~XMLMesh(){  // Do nothing}//-----------------------------------------------------------------------------void XMLMesh::startElement(const xmlChar *name, const xmlChar **attrs){  switch ( state )  {  case OUTSIDE:        if ( xmlStrcasecmp(name, (xmlChar *) "mesh") == 0 )    {      readMesh(name, attrs);      state = INSIDE_MESH;    }        break;  case INSIDE_MESH:        if ( xmlStrcasecmp(name, (xmlChar *) "vertices") == 0 )    {      readVertices(name, attrs);      state = INSIDE_VERTICES;    }    else if ( xmlStrcasecmp(name, (xmlChar *) "cells") == 0 )    {      readCells(name, attrs);      state = INSIDE_CELLS;    }        break;      case INSIDE_VERTICES:        if ( xmlStrcasecmp(name, (xmlChar *) "vertex") == 0 )      readVertex(name, attrs);    break;      case INSIDE_CELLS:        if ( xmlStrcasecmp(name, (xmlChar *) "interval") == 0 )      readInterval(name, attrs);    else if ( xmlStrcasecmp(name, (xmlChar *) "triangle") == 0 )      readTriangle(name, attrs);    else if ( xmlStrcasecmp(name, (xmlChar *) "tetrahedron") == 0 )      readTetrahedron(name, attrs);        break;      default:    ;  }}//-----------------------------------------------------------------------------void XMLMesh::endElement(const xmlChar *name){  switch ( state )  {  case INSIDE_MESH:        if ( xmlStrcasecmp(name, (xmlChar *) "mesh") == 0 )    {      closeMesh();      state = DONE;    }        break;      case INSIDE_VERTICES:        if ( xmlStrcasecmp(name, (xmlChar *) "vertices") == 0 )      state = INSIDE_MESH;        break;  case INSIDE_CELLS:	     if ( xmlStrcasecmp(name, (xmlChar *) "cells") == 0 )      state = INSIDE_MESH;        break;      default:    ;  }}//-----------------------------------------------------------------------------void XMLMesh::open(std::string filename){  // Do nothing}//-----------------------------------------------------------------------------bool XMLMesh::close(){  return state == DONE;}//-----------------------------------------------------------------------------void XMLMesh::readMesh(const xmlChar *name, const xmlChar **attrs){  // Parse values  std::string type = parseString(name, attrs, "celltype");  uint gdim = parseUnsignedInt(name, attrs, "dim");    // Create cell type to get topological dimension  CellType* cell_type = CellType::create(type);  uint tdim = cell_type->dim();  delete cell_type;  // Open mesh for editing  editor.open(_mesh, CellType::string2type(type), tdim, gdim);}//-----------------------------------------------------------------------------void XMLMesh::readVertices(const xmlChar *name, const xmlChar **attrs){  // Parse values  uint num_vertices = parseUnsignedInt(name, attrs, "size");  // Set number of vertices  editor.initVertices(num_vertices);}//-----------------------------------------------------------------------------void XMLMesh::readCells(const xmlChar *name, const xmlChar **attrs){  // Parse values  uint num_cells = parseUnsignedInt(name, attrs, "size");  // Set number of vertices  editor.initCells(num_cells);}//-----------------------------------------------------------------------------void XMLMesh::readVertex(const xmlChar *name, const xmlChar **attrs){  // Read index  uint v = parseUnsignedInt(name, attrs, "index");    // Handle differently depending on geometric dimension  switch ( _mesh.geometry().dim() )  {  case 1:    {      real x = parseReal(name, attrs, "x");      editor.addVertex(v, x);    }    break;  case 2:    {      real x = parseReal(name, attrs, "x");      real y = parseReal(name, attrs, "y");      editor.addVertex(v, x, y);    }    break;  case 3:    {      real x = parseReal(name, attrs, "x");      real y = parseReal(name, attrs, "y");      real z = parseReal(name, attrs, "z");      editor.addVertex(v, x, y, z);    }    break;  default:    error("Dimension of mesh must be 1, 2 or 3.");  }}//-----------------------------------------------------------------------------void XMLMesh::readInterval(const xmlChar *name, const xmlChar **attrs){  // Check dimension  if ( _mesh.topology().dim() != 1 )    error("Mesh entity (interval) does not match dimension of mesh (%d).",		 _mesh.topology().dim());  // Parse values  uint c  = parseUnsignedInt(name, attrs, "index");  uint v0 = parseUnsignedInt(name, attrs, "v0");  uint v1 = parseUnsignedInt(name, attrs, "v1");    // Add cell  editor.addCell(c, v0, v1);}//-----------------------------------------------------------------------------void XMLMesh::readTriangle(const xmlChar *name, const xmlChar **attrs){  // Check dimension  if ( _mesh.topology().dim() != 2 )    error("Mesh entity (triangle) does not match dimension of mesh (%d).",		 _mesh.topology().dim());  // Parse values  uint c  = parseUnsignedInt(name, attrs, "index");  uint v0 = parseUnsignedInt(name, attrs, "v0");  uint v1 = parseUnsignedInt(name, attrs, "v1");  uint v2 = parseUnsignedInt(name, attrs, "v2");    // Add cell  editor.addCell(c, v0, v1, v2);}//-----------------------------------------------------------------------------void XMLMesh::readTetrahedron(const xmlChar *name, const xmlChar **attrs){  // Check dimension  if ( _mesh.topology().dim() != 3 )    error("Mesh entity (tetrahedron) does not match dimension of mesh (%d).",		 _mesh.topology().dim());  // Parse values  uint c  = parseUnsignedInt(name, attrs, "index");  uint v0 = parseUnsignedInt(name, attrs, "v0");  uint v1 = parseUnsignedInt(name, attrs, "v1");  uint v2 = parseUnsignedInt(name, attrs, "v2");  uint v3 = parseUnsignedInt(name, attrs, "v3");    // Add cell  editor.addCell(c, v0, v1, v2, v3);}//-----------------------------------------------------------------------------void XMLMesh::closeMesh(){  editor.close();}//-----------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -