Hurray! 

--
Marie

On 2. juli 2011, at 13:12, [email protected] wrote:

> Merge authors:
>  Garth Wells (garth-wells)
> ------------------------------------------------------------
> revno: 6015 [merge]
> committer: Garth N. Wells <[email protected]>
> branch nick: dolfin-main
> timestamp: Sat 2011-07-02 12:11:14 +0100
> message:
>  merge
> modified:
>  dolfin/io/GenericFile.cpp
>  dolfin/io/GenericFile.h
>  dolfin/io/XMLFile.cpp
>  dolfin/io/XMLFile.h
>  dolfin/io/XMLIndent.cpp
>  dolfin/io/XMLIndent.h
>  dolfin/io/XMLMesh.cpp
>  dolfin/io/XMLMesh.h
>  dolfin/io/XMLVector.cpp
>  dolfin/io/XMLVector.h
>  dolfin/la/GenericMatrix.h
>  dolfin/mesh/Mesh.h
>  test/unit/io/python/xml_vector.py
> 
> 
> --
> lp:dolfin
> https://code.launchpad.net/~dolfin-core/dolfin/main
> 
> Your team DOLFIN Core Team is subscribed to branch lp:dolfin.
> To unsubscribe from this branch go to 
> https://code.launchpad.net/~dolfin-core/dolfin/main/+edit-subscription
> === modified file 'dolfin/io/GenericFile.cpp' --- dolfin/io/GenericFile.cpp   
> 2011-06-21 00:01:06 +0000 +++ dolfin/io/GenericFile.cpp 2011-07-02 09:11:13 
> +0000 @@ -42,6 +42,11 @@ // Do nothing } 
> //-----------------------------------------------------------------------------
>  +GenericFile::~GenericFile() +{ + // Do nothing +} 
> +//-----------------------------------------------------------------------------
>  void GenericFile::operator>> (Mesh& mesh) { read_not_impl("Mesh"); === 
> modified file 'dolfin/io/GenericFile.h' --- dolfin/io/GenericFile.h     
> 2011-06-21 00:01:06 +0000 +++ dolfin/io/GenericFile.h   2011-07-02 09:11:13 
> +0000 @@ -48,6 +48,9 @@ /// Constructor GenericFile(const std::string 
> filename); + /// Destructor +    virtual ~GenericFile(); + // Input virtual 
> void operator>> (Mesh& mesh); virtual void operator>> (GenericVector& x); === 
> modified file 'dolfin/io/XMLFile.cpp' --- dolfin/io/XMLFile.cpp     
> 2011-07-01 21:55:17 +0000 +++ dolfin/io/XMLFile.cpp     2011-07-02 11:11:14 
> +0000 @@ -57,6 +57,11 @@ // Do nothing } 
> //-----------------------------------------------------------------------------
>  +XMLFile::~XMLFile() +{ + // Do nothing +} 
> +//-----------------------------------------------------------------------------
>  void XMLFile::operator>> (Mesh& input_mesh) { // Create XML doc and get 
> DOLFIN node @@ -72,16 +77,12 @@ if (MPI::num_processes() > 1) error("Mesh XML 
> output in parallel not yet supported"); - // Open file on process 0 for 
> distributed objects and on all processes - // for local objects -  
> open_file(); - - // Note: 'write' is being called on all processes since 
> collective MPI - // calls might be used. - XMLMesh::write(output_mesh, 
> *outstream, 1); - - // Close file - close_file(); + pugi::xml_document doc; + 
> pugi::xml_node node = write_dolfin(doc); + XMLMesh::write(output_mesh, node); 
> + + // FIXME: Implement copy to stream + doc.save_file(filename.c_str(), " 
> "); } 
> //-----------------------------------------------------------------------------
>  void XMLFile::operator>> (LocalMeshData& input_data) @@ -148,15 +149,19 @@ 
> // Open file on process 0 for distributed objects and on all processes // for 
> local objects if (MPI::process_number() == 0) - open_file(); - - // Note: 
> 'write' is being called on all processes since collective MPI - // calls 
> might be used. - XMLVector::write(output, *outstream, 1); - - // Close file - 
> if (MPI::process_number() == 0) - close_file(); + { + pugi::xml_document doc; 
> + pugi::xml_node node = write_dolfin(doc); + XMLVector::write(output, node, 
> true); + + // FIXME: Implement copy to stream + 
> doc.save_file(filename.c_str(), " "); + } + else + { + pugi::xml_node 
> node(0); + XMLVector::write(output, node, false); + } } 
> //-----------------------------------------------------------------------------
>  void XMLFile::operator>> (Parameters& input) @@ -172,12 +177,13 @@ void 
> XMLFile::operator<< (const Parameters& output) { if (MPI::process_number() == 
> 0) - open_file(); - - XMLParameters::write(output, *outstream, 1); - - if 
> (MPI::process_number() == 0) - close_file(); + { + open_write_file(); + 
> XMLParameters::write(output, *outstream, 1); + close_write_file(); + } + else 
> + XMLParameters::write(output, *outstream, 1); } 
> //-----------------------------------------------------------------------------
>  void XMLFile::operator>> (FunctionPlotData& input) @@ -193,12 +199,13 @@ 
> void XMLFile::operator<< (const FunctionPlotData& output) { if 
> (MPI::process_number() == 0) - open_file(); - - 
> XMLFunctionPlotData::write(output, *outstream, 1); - - if 
> (MPI::process_number() == 0) - close_file(); + { + open_write_file(); + 
> XMLFunctionPlotData::write(output, *outstream, 1); + close_write_file(); + } 
> + else + XMLFunctionPlotData::write(output, *outstream, 1); } 
> //-----------------------------------------------------------------------------
>  void XMLFile::write_start(std::ostream& outfile, uint indentation_level) @@ 
> -229,12 +236,13 @@ const std::string type) { if (MPI::process_number() == 0) 
> - open_file(); - - XMLMeshFunction::write(t, type, *outstream, 1); - - if 
> (MPI::process_number() == 0) - close_file(); + { + open_write_file(); + 
> XMLMeshFunction::write(t, type, *outstream, 1); + close_write_file(); + } + 
> else + XMLMeshFunction::write(t, type, *outstream, 1); } 
> //-----------------------------------------------------------------------------
>  const pugi::xml_node XMLFile::get_dolfin_xml_node(pugi::xml_document& 
> xml_doc, @@ -273,27 +281,38 @@ // Check that we have a DOLFIN XML file const 
> pugi::xml_node dolfin_node = xml_doc.child("dolfin"); if (!dolfin_node) - 
> error("Not a DOLFIN XML file"); + error("XMLFile::get_dolfin_xml_node: not a 
> DOLFIN XML file"); return dolfin_node; } 
> //-----------------------------------------------------------------------------
>  -void XMLFile::open_file() +pugi::xml_node 
> XMLFile::write_dolfin(pugi::xml_document& xml_doc) +{ + pugi::xml_node node = 
> xml_doc.append_child("dolfin"); + node.append_attribute("xmlns:dolfin") = 
> "http://www.fenicsproject.org";; + return node; +} 
> +//-----------------------------------------------------------------------------
>  +void XMLFile::open_write_file() {    // Convert to ofstream std::ofstream* 
> outfile = dynamic_cast(outstream.get()); if (outfile) { - // Open file - 
> outfile->open(filename.c_str()); + // Open file (erase contents) + 
> outfile->open(filename.c_str(), std::ios::out | std::ios::trunc); + + if 
> (!outfile->is_open()) + error("Error opening XML file."); // Go to end of 
> file - outfile->seekp(0, std::ios::end); + //outfile->seekp(0, 
> std::ios::end); } + assert(outstream); XMLFile::write_start(*outstream); } 
> //-----------------------------------------------------------------------------
>  -void XMLFile::close_file() +void XMLFile::close_write_file() { 
> XMLFile::write_end(*outstream); @@ -301,15 +320,9 @@ const 
> boost::filesystem::path path(filename);    const std::string extension = 
> boost::filesystem::extension(path); if (extension == ".gz") - { 
> error("Compressed XML output not yet supported."); - } - else - { - // 
> Convert to ofstream - std::ofstream* outfile = dynamic_cast(outstream.get()); 
> - if (outfile) - outfile->close(); - } + + // Finalise (closes file is stream 
> is a file stream) + outstream.reset(); } 
> //-----------------------------------------------------------------------------
>  === modified file 'dolfin/io/XMLFile.h' --- dolfin/io/XMLFile.h      
> 2011-06-30 12:57:51 +0000 +++ dolfin/io/XMLFile.h       2011-07-02 11:09:24 
> +0000 @@ -53,6 +53,8 @@ /// Constructor from a stream XMLFile(std::ostream& 
> s); + ~XMLFile(); + // Mesh void operator>> (Mesh& input); void operator<< 
> (const Mesh& output); @@ -111,9 +113,11 @@ const pugi::xml_node 
> get_dolfin_xml_node(pugi::xml_document& xml_doc, const std::string filename) 
> const; + static pugi::xml_node write_dolfin(pugi::xml_document& doc); + // 
> Open/close files - void open_file(); - void close_file(); + void 
> open_write_file(); + void close_write_file(); boost::shared_ptr outstream; 
> === modified file 'dolfin/io/XMLIndent.cpp' --- dolfin/io/XMLIndent.cpp  
> 2011-06-30 12:57:51 +0000 +++ dolfin/io/XMLIndent.cpp   2011-07-02 09:11:13 
> +0000 @@ -45,10 +45,8 @@ -- indentation_level; } 
> //-----------------------------------------------------------------------------
>  -std::string XMLIndent::operator()() +std::string XMLIndent::operator()() 
> const { - std::ostringstream ss; - ss << 
> std::setw(indentation_level*step_size) << ""; - return ss.str(); + return 
> std::string(indentation_level*step_size, ' '); } 
> //-----------------------------------------------------------------------------
>  === modified file 'dolfin/io/XMLIndent.h' --- dolfin/io/XMLIndent.h  
> 2011-06-30 12:57:51 +0000 +++ dolfin/io/XMLIndent.h     2011-07-02 09:11:13 
> +0000 @@ -44,7 +44,7 @@ void operator--(); - std::string operator() (); + 
> std::string operator() () const; dolfin::uint level() { return 
> indentation_level; } === modified file 'dolfin/io/XMLMesh.cpp' --- 
> dolfin/io/XMLMesh.cpp   2011-06-30 12:57:51 +0000 +++ dolfin/io/XMLMesh.cpp   
>   2011-07-02 11:09:24 +0000 @@ -143,6 +143,85 @@ outfile << indent() << "" << 
> std::endl; } 
> //-----------------------------------------------------------------------------
>  +void XMLMesh::write(const Mesh& mesh, pugi::xml_node xml_node) +{ +  // Add 
> mesh node + pugi::xml_node mesh_node = xml_node.append_child("mesh"); + + // 
> Add mesh attributes + const CellType::Type _cell_type = 
> mesh.type().cell_type(); + const std::string cell_type = 
> CellType::type2string(_cell_type); + mesh_node.append_attribute("celltype") = 
> cell_type.c_str(); + mesh_node.append_attribute("dim") = 
> mesh.geometry().dim(); + + // Add vertices node + pugi::xml_node 
> vertices_node = mesh_node.append_child("vertices"); + 
> vertices_node.append_attribute("size") = mesh.num_vertices(); + + // Write 
> each vertex + for(VertexIterator v(mesh); !v.end(); ++v) + { + pugi::xml_node 
> vertex_node = vertices_node.append_child("vertex"); + 
> vertex_node.append_attribute("index") = v->index(); + + const Point p = 
> v->point(); + switch (mesh.geometry().dim()) + { + case 1: + 
> vertex_node.append_attribute("x") = p.x(); + break; + case 2: + 
> vertex_node.append_attribute("x") = p.x(); + 
> vertex_node.append_attribute("y") = p.y(); + break; + case 3: + 
> vertex_node.append_attribute("x") = p.x(); + 
> vertex_node.append_attribute("y") = p.y(); + 
> vertex_node.append_attribute("z") = p.z(); + break; + default: + error("The 
> XML mesh file format only supports 1D, 2D and 3D meshes."); + } + } + +  // 
> Add cells node + pugi::xml_node cells_node = mesh_node.append_child("cells"); 
> + cells_node.append_attribute("size") = mesh.num_cells(); + + // Add each 
> cell + for (CellIterator c(mesh); !c.end(); ++c) + { + pugi::xml_node 
> cell_node = cells_node.append_child(cell_type.c_str()); + 
> cell_node.append_attribute("index") = c->index(); + + const uint* vertices = 
> c->entities(0); + assert(vertices); + + switch (_cell_type) + { + case 
> CellType::interval: + cell_node.append_attribute("v0") = vertices[0]; + 
> cell_node.append_attribute("v1") = vertices[1]; + break; + case 
> CellType::triangle: + cell_node.append_attribute("v0") = vertices[0]; + 
> cell_node.append_attribute("v1") = vertices[1]; + 
> cell_node.append_attribute("v2") = vertices[2]; + break; + case 
> CellType::tetrahedron: + cell_node.append_attribute("v0") = vertices[0]; + 
> cell_node.append_attribute("v1") = vertices[1]; + 
> cell_node.append_attribute("v2") = vertices[2]; + 
> cell_node.append_attribute("v3") = vertices[3]; + break; + default: + 
> error("Unknown cell type: %u.", _cell_type); + } + } + + // FIXME: Write mesh 
> data +} 
> +//-----------------------------------------------------------------------------
>  void XMLMesh::read_mesh(Mesh& mesh, const pugi::xml_node xml_mesh) { // Get 
> cell type and geometric dimension === modified file 'dolfin/io/XMLMesh.h' --- 
> dolfin/io/XMLMesh.h    2011-06-30 12:57:51 +0000 +++ dolfin/io/XMLMesh.h      
>  2011-07-02 11:09:24 +0000 @@ -47,6 +47,8 @@ static void write(const Mesh& 
> mesh, std::ostream& outfile, unsigned int indentation_level=0); + /// Write 
> the XML file + static void write(const Mesh& mesh, pugi::xml_node xml_node); 
> private: === modified file 'dolfin/io/XMLVector.cpp' --- 
> dolfin/io/XMLVector.cpp     2011-06-30 13:30:14 +0000 +++ 
> dolfin/io/XMLVector.cpp   2011-07-02 11:09:24 +0000 @@ -37,12 +37,12 @@ // 
> Check that we have a XML Vector const pugi::xml_node xml_vector_node = 
> xml_dolfin.child("vector"); if (!xml_vector_node) - error("Not a DOLFIN 
> Vector file."); + error("XMLVector::read: not a DOLFIN Vector file."); // Get 
> type and size const pugi::xml_node array = xml_vector_node.child("array"); if 
> (!array) - error("Not a DOLFIN array inside Vector XML file."); + 
> error("XMLVector::read: not a DOLFIN array inside Vector XML file."); const 
> unsigned int size = array.attribute("size").as_uint(); const std::string type 
> = array.attribute("type").value(); @@ -68,37 +68,72 @@ // Check that we have 
> a XML Vector const pugi::xml_node xml_vector_node = 
> xml_dolfin.child("vector"); if (!xml_vector_node) - error("Not a DOLFIN 
> Vector file."); + error("XMLVector::read_size: not a DOLFIN Vector file."); 
> // Get size const pugi::xml_node array = xml_vector_node.child("array"); if 
> (!array) - std::cout << "Not a DOLFIN Array" << std::endl; + std::cout << 
> "XMLVector::read_size: not a DOLFIN Array" << std::endl; return 
> array.attribute("size").as_uint(); } 
> //-----------------------------------------------------------------------------
>  void XMLVector::write(const GenericVector& vector, std::ostream& outfile, - 
> unsigned int indentation_level) + bool write_to_stream, unsigned int 
> indentation_level) { - bool write_to_stream = false; + // Gather entries from 
> process i on process 0 +  Array x; + if (MPI::num_processes() > 1) + 
> vector.gather_on_zero(x); + else + vector.get_local(x); + + const uint size = 
> vector.size(); if (MPI::process_number() == 0) - write_to_stream = true; - - 
> XMLIndent indent(indentation_level); - - // Write vector header + assert(size 
> == x.size()); + if (write_to_stream) { - outfile << indent() << "" << 
> std::endl; -    ++indent; - - // Write array header - outfile << indent() << 
> "<< vector.size() - << "\">" << std::endl; - ++indent; + XMLIndent 
> indent(indentation_level); + + // Write vector header + if (write_to_stream) 
> + { + outfile << indent() << "" << std::endl; + ++indent; + + // Write array 
> header + outfile << indent() << "<< size + << "\">" << std::endl; + ++indent; 
> + } + + + // Write vector entries + if (write_to_stream) + { + for (uint i = 
> 0; i < x.size(); ++i) + { + outfile << indent() + << "<< i +

_______________________________________________
Mailing list: https://launchpad.net/~dolfin
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~dolfin
More help   : https://help.launchpad.net/ListHelp

Reply via email to