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

📄 xmlfile.cpp

📁 利用C
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Copyright (C) 2002-2008 Anders Logg.// Licensed under the GNU LGPL Version 2.1.//// Modified by Erik Svensson 2003.// Modified by Garth N. Wells 2006.// Modified by Ola Skavhaug 2006.// Modified by Magnus Vikstrom 2007.//// First added:  2002-12-03// Last changed: 2008-04-22#include <stdarg.h>#include <dolfin/log/log.h>#include <dolfin/common/constants.h>#include <dolfin/common/Array.h>#include <dolfin/la/GenericVector.h>#include <dolfin/la/GenericMatrix.h>#include <dolfin/mesh/Mesh.h>#include <dolfin/mesh/Vertex.h>#include <dolfin/mesh/Cell.h>#include <dolfin/graph/Graph.h>#include <dolfin/mesh/MeshFunction.h>#include <dolfin/function/Function.h>#include <dolfin/function/DiscreteFunction.h>#include <dolfin/fem/DofMap.h>#include <dolfin/parameter/Parameter.h>#include <dolfin/parameter/ParameterList.h>#include "XMLObject.h"#include "XMLVector.h"#include "XMLMatrix.h"#include "XMLMesh.h"#include "XMLMeshFunction.h"#include "XMLDofMap.h"#include "XMLFunction.h"#include "XMLFiniteElement.h"#include "XMLParameterList.h"#include "XMLBLASFormData.h"#include "XMLGraph.h"#include "XMLFile.h"using namespace dolfin;//-----------------------------------------------------------------------------XMLFile::XMLFile(const std::string filename) : GenericFile(filename),					       header_written(false),					       mark(0){  type = "XML";  xmlObject = 0;}//-----------------------------------------------------------------------------XMLFile::~XMLFile(){  if ( xmlObject )    delete xmlObject;}//-----------------------------------------------------------------------------void XMLFile::operator>>(GenericVector& x){  message(1, "Reading vector from file %s.", filename.c_str());  if ( xmlObject )    delete xmlObject;  xmlObject = new XMLVector(x);  parseFile();}//-----------------------------------------------------------------------------void XMLFile::operator>>(GenericMatrix& A){  message(1, "Reading matrix from file %s.", filename.c_str());  if ( xmlObject )    delete xmlObject;  xmlObject = new XMLMatrix(A);  parseFile();}//-----------------------------------------------------------------------------void XMLFile::operator>>(Mesh& mesh){  message(1, "Reading mesh from file %s.", filename.c_str());  if ( xmlObject )    delete xmlObject;  xmlObject = new XMLMesh(mesh);  parseFile();}//-----------------------------------------------------------------------------void XMLFile::operator>>(MeshFunction<int>& meshfunction){  message(1, "Reading int-valued mesh function from file %s.", filename.c_str());  if ( xmlObject )    delete xmlObject;  xmlObject = new XMLMeshFunction(meshfunction);  parseFile();}//-----------------------------------------------------------------------------void XMLFile::operator>>(MeshFunction<unsigned int>& meshfunction){  message(1, "Reading uint-valued mesh function from file %s.", filename.c_str());  if ( xmlObject )    delete xmlObject;  xmlObject = new XMLMeshFunction(meshfunction);  parseFile();}//-----------------------------------------------------------------------------void XMLFile::operator>>(MeshFunction<double>& meshfunction){  message(1, "Reading real-valued mesh function from file %s.", filename.c_str());  if ( xmlObject )    delete xmlObject;  xmlObject = new XMLMeshFunction(meshfunction);  parseFile();}//-----------------------------------------------------------------------------void XMLFile::operator>>(MeshFunction<bool>& meshfunction){  message(1, "Reading bool-valued mesh function from file %s.", filename.c_str());  if ( xmlObject )    delete xmlObject;  xmlObject = new XMLMeshFunction(meshfunction);  parseFile();}//-----------------------------------------------------------------------------void XMLFile::operator>>(Function& f){  // We are cheating here. Instead of actually parsing the XML for  // Function data nested inside <function></function>, we just ignore  // the nesting and look for the first occurence of the data which  // might be outide of <function></function>  message(1, "Reading function from %s.", filename.c_str());  // Read the vector  Vector* x = new Vector();  *this >> *x;  // Read the mesh  Mesh* mesh = new Mesh();  *this >> *mesh;  // Read the finite element specification  std::string finite_element_signature;  if ( xmlObject )    delete xmlObject;  xmlObject = new XMLFiniteElement(finite_element_signature);  parseFile();   // Read the dof map specification  std::string dof_map_signature;  if ( xmlObject )    delete xmlObject;  xmlObject = new XMLDofMap(dof_map_signature);  parseFile();   // Read the function  if ( xmlObject )    delete xmlObject;  xmlObject = new XMLFunction(f);  parseFile();     // Create the function (we're all friends here)  if ( f.f )    delete f.f;  f.f = new DiscreteFunction(*mesh, *x, finite_element_signature, dof_map_signature);  f._type = Function::discrete;  f.rename("u", "discrete function from file data");}//-----------------------------------------------------------------------------void XMLFile::operator>>(ParameterList& parameters){  message(1, "Reading parameter list from file %s.", filename.c_str());  if ( xmlObject )    delete xmlObject;  xmlObject = new XMLParameterList(parameters);  parseFile();}//-----------------------------------------------------------------------------void XMLFile::operator>>(BLASFormData& blas){  if ( xmlObject )    delete xmlObject;  xmlObject = new XMLBLASFormData(blas);  parseFile();}//-----------------------------------------------------------------------------void XMLFile::operator>>(Graph& graph){  message(1, "Reading graph from file %s.", filename.c_str());  if ( xmlObject )    delete xmlObject;  xmlObject = new XMLGraph(graph);  parseFile();}//-----------------------------------------------------------------------------void XMLFile::operator<<(GenericVector& x){  // Open file  FILE* fp = openFile();  // Get vector values  real* values = new real[x.size()];  x.get(values);    // Write vector in XML format  fprintf(fp, "  <vector size=\"%u\"> \n", x.size() );  for (unsigned int i = 0; i < x.size(); i++)   {    fprintf(fp, "    <entry row=\"%u\" value=\"%.15g\"/>\n", i, values[i]);    if ( i == (x.size() - 1))      fprintf(fp, "  </vector>\n");  }    // Delete vector values  delete [] values;  // Close file  closeFile(fp);  //  message(1, "Saved vector %s (%s) to file %s in DOLFIN XML format.", x.name().c_str(), x.label().c_str(), filename.c_str());  message(1, "Saved vector  to file %s in DOLFIN XML format.", filename.c_str());}//-----------------------------------------------------------------------------void XMLFile::operator<<(GenericMatrix& A){  // Open file  FILE *fp = openFile();    // Write matrix in XML format  fprintf(fp, "  <matrix rows=\"%u\" columns=\"%u\">\n", A.size(0), A.size(1));          Array<uint> columns;  Array<real> values;  for (unsigned int i = 0; i < A.size(0); i++)  {    A.getrow(i, columns, values);    if (columns.size() > 0)      fprintf(fp, "    <row row=\"%u\" size=\"%d\">\n", i, (int)columns.size());    for (uint pos = 0; pos < columns.size(); pos++)    {      unsigned int j = columns[pos];      real aij = values[pos];      fprintf(fp, "      <entry column=\"%u\" value=\"%.15g\"/>\n", j, aij);    }    if (columns.size() > 0 )      fprintf(fp, "    </row>\n");  }  fprintf(fp, "  </matrix>\n");  // Close file  closeFile(fp);  message(1, "Saved matrix file %s in DOLFIN XML format.", filename.c_str());}//-----------------------------------------------------------------------------void XMLFile::operator<<(Mesh& mesh){  // Open file  FILE *fp = openFile();    // Get cell type  CellType::Type cell_type = mesh.type().cellType();  // Write mesh in XML format  fprintf(fp, "  <mesh celltype=\"%s\" dim=\"%u\">\n",          CellType::type2string(cell_type).c_str(), mesh.geometry().dim());  fprintf(fp, "    <vertices size=\"%u\">\n", mesh.numVertices());    for(VertexIterator v(mesh); !v.end(); ++v)  {    Point p = v->point();    switch ( mesh.geometry().dim() ) {    case 1:      fprintf(fp, "      <vertex index=\"%u\" x=\"%g\"/>\n",              v->index(), p.x());      break;    case 2:      fprintf(fp, "      <vertex index=\"%u\" x=\"%g\" y=\"%g\"/>\n",              v->index(), p.x(), p.y());      break;    case 3:      fprintf(fp, "      <vertex index=\"%u\" x=\"%g\" y=\"%g\" z=\"%g\" />\n",              v->index(), p.x(), p.y(), p.z());      break;    default:      error("The XML mesh file format only supports 1D, 2D and 3D meshes.");    }  }  fprintf(fp, "    </vertices>\n");  fprintf(fp, "    <cells size=\"%u\">\n", mesh.numCells());  for (CellIterator c(mesh); !c.end(); ++c)  {    uint* vertices = c->entities(0);    dolfin_assert(vertices);    switch ( cell_type )    {    case CellType::interval:      fprintf(fp, "      <interval index=\"%u\" v0=\"%u\" v1=\"%u\"/>\n",	      c->index(), vertices[0], vertices[1]);      break;    case CellType::triangle:      fprintf(fp, "      <triangle index=\"%u\" v0=\"%u\" v1=\"%u\" v2=\"%u\"/>\n",	      c->index(), vertices[0], vertices[1], vertices[2]);      break;    case CellType::tetrahedron:      fprintf(fp, "      <tetrahedron index=\"%u\" v0=\"%u\" v1=\"%u\" v2=\"%u\" v3=\"%u\"/>\n",              c->index(), vertices[0], vertices[1], vertices[2], vertices[3]);      break;    default:      error("Unknown cell type: %u.", cell_type);    }  }  fprintf(fp, "    </cells>\n");  fprintf(fp, "  </mesh>\n");   // Close file  closeFile(fp);  message(1, "Saved mesh to file %s in DOLFIN XML format.", filename.c_str());}//-----------------------------------------------------------------------------void XMLFile::operator<<(MeshFunction<int>& meshfunction){  // Open file  FILE *fp = openFile();    // Write mesh in XML format  fprintf(fp, "  <meshfunction type=\"int\" dim=\"%u\" size=\"%u\">\n",          meshfunction.dim(), meshfunction.size());    Mesh& mesh = meshfunction.mesh();  for(MeshEntityIterator e(mesh, meshfunction.dim()); !e.end(); ++e)  {      fprintf(fp, "    <entity index=\"%u\" value=\"%d\"/>\n",              e->index(), meshfunction(*e));  }

⌨️ 快捷键说明

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