Thread Previous • Date Previous • Date Next • Thread Next |
Hi, Is it possible to consider a new output format for 1D problems? I'm using it for some time and now I've updated it to dolfin-0.9.9. The solutions file contain a list of x y coordinates. (analogous to the xyz format) It could be used directly with Xgraphic (wich is part of Xd3d), gnuplot or with simple python/matplotlib scripts for instance. Hope it works. Nuno Lopes
# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: ndl@an9-20100908165948-xqvxgx0834mlrkpt # target_branch: bzr+ssh://bazaar.launchpad.net/~dolfin-\ # core/dolfin/main/ # testament_sha1: 1a4383b33310156a890260ef4c35ceba6d7930e8 # timestamp: 2010-09-08 18:01:16 +0100 # base_revision_id: johannr@xxxxxxxxx-20100908084437-u2bw3adyeepm4de3 # # Begin patch === modified file 'dolfin/io/File.cpp' --- dolfin/io/File.cpp 2010-09-06 15:19:48 +0000 +++ dolfin/io/File.cpp 2010-09-08 16:59:48 +0000 @@ -9,19 +9,20 @@ // Modified by Ola Skavhaug 2009. // // First added: 2002-11-12 -// Last changed: 2010-09-06 +// Last changed: 2010-09-08 +#include <boost/filesystem.hpp> #include <fstream> -#include <boost/filesystem.hpp> +#include <dolfin/main/MPI.h> +#include <dolfin/log/dolfin_log.h> #include <dolfin/function/Function.h> -#include <dolfin/log/dolfin_log.h> -#include <dolfin/main/MPI.h> #include "File.h" #include "XMLFile.h" #include "PythonFile.h" #include "VTKFile.h" #include "RAWFile.h" #include "XYZFile.h" +#include "XYFile.h" #include "BinaryFile.h" using namespace dolfin; @@ -34,14 +35,11 @@ const std::string extension = boost::filesystem::extension(path); // Create directory if we have a parent path - if (path.has_parent_path()) + if ( path.has_parent_path() ) { const boost::filesystem::path directory = path.parent_path(); - if (!boost::filesystem::is_directory(directory)) - { - cout << "Creating directory \"" << directory.string() << "\"." << endl; - boost::filesystem::create_directories(directory); - } + cout << "Creating directory \"" << directory.string() << "\"." << endl; + boost::filesystem::create_directories(directory); } // Choose format based on extension @@ -64,6 +62,8 @@ file.reset(new RAWFile(filename)); else if (extension == ".xyz") file.reset(new XYZFile(filename)); + else if (extension == ".xy") + file.reset(new XYFile(filename)); else if (extension == ".bin") file.reset(new BinaryFile(filename)); else @@ -89,6 +89,9 @@ case xyz: file.reset(new XYZFile(filename)); break; + case xy: + file.reset(new XYFile(filename)); + break; case binary: file.reset(new BinaryFile(filename)); break; === modified file 'dolfin/io/File.h' --- dolfin/io/File.h 2010-08-26 21:44:34 +0000 +++ dolfin/io/File.h 2010-09-08 16:59:48 +0000 @@ -7,7 +7,7 @@ // Modified by Ola Skavhaug 2009 // // First added: 2002-11-12 -// Last changed: 2010-02-10 +// Last changed: 2010-09-08 #ifndef __FILE_H #define __FILE_H @@ -33,7 +33,7 @@ public: /// File formats - enum Type {xml, vtk, python, raw, xyz, binary}; + enum Type {xml, vtk, python, raw, xyz, xy, binary}; /// Create a file with given name File(const std::string filename, std::string encoding = "ascii"); === added file 'dolfin/io/XYFile.cpp' --- dolfin/io/XYFile.cpp 1970-01-01 00:00:00 +0000 +++ dolfin/io/XYFile.cpp 2010-09-08 16:59:48 +0000 @@ -0,0 +1,143 @@ +// Copyright (C) 2005-2007 Garth N.Wells. +// Licensed under the GNU LGPL Version 2.1. +// +// Modified by Nuno Lopes 2010. +// +// First added: 2010-09-08 + +#include <sstream> +#include <fstream> +#include <dolfin/fem/FiniteElement.h> +#include <dolfin/mesh/Mesh.h> +#include <dolfin/mesh/MeshFunction.h> +#include <dolfin/mesh/Vertex.h> +#include <dolfin/mesh/Cell.h> +#include <dolfin/function/Function.h> +#include <dolfin/function/FunctionSpace.h> +#include <dolfin/la/Vector.h> +#include "XYFile.h" + +using namespace dolfin; + +//---------------------------------------------------------------------------- +XYFile::XYFile(const std::string filename) : GenericFile(filename) +{ + type = "XY"; +} +//---------------------------------------------------------------------------- +XYFile::~XYFile() +{ + // Do nothing +} +//---------------------------------------------------------------------------- +void XYFile::operator<<(const Function& u) +{ + // Update xy file name and clear file + xy_name_update(counter); + + // Write results + results_write(u); + + // Increase the number of times we have saved the function + counter++; + + cout << "Saved function " << u.name() << " (" << u.label() + << ") to file " << filename << " in xgraphic xy format." << endl; +} +//---------------------------------------------------------------------------- +void XYFile::results_write(const Function& u) const +{ + // Open file + std::ofstream fp(xy_filename.c_str(), std::ios_base::app); + if (!fp) + error("Unable to open file %s", filename.c_str()); + + const uint rank = u.function_space().element().value_rank(); + if(rank > 1) + error("Only scalar functions can be saved in xy format."); + + // Get number of components + uint dim = 1; + for (uint i = 0; i < rank; i++) + dim *= u.function_space().element().value_dimension(i); + + const Mesh& mesh = u.function_space().mesh(); + + // Allocate memory for function values at vertices + const uint size = mesh.num_vertices()*dim; + Array<double> values(size); + + // Get function values at vertices + u.compute_vertex_values(values,mesh); + + // Write function data at mesh vertices + + if ( dim > 1 ) + error("Cannot handle XY file for non-scalar functions. "); + + + + std::ostringstream ss; + ss << std::scientific; + for (VertexIterator vertex(mesh); !vertex.end(); ++vertex) + { + ss.str(""); + ss<<vertex->x(0)<<" "<< values[ vertex->index()]; + ss<<std::endl; + fp<<ss.str( ); + } +} +//---------------------------------------------------------------------------- +void XYFile::xy_name_update(int counter) +{ + std::string filestart, extension; + std::ostringstream fileid, newfilename; + + fileid.fill('0'); + fileid.width(6); + + filestart.assign(filename, 0, filename.find(".")); + extension.assign(filename, filename.find("."), filename.size()); + + fileid << counter; + newfilename << filestart << fileid.str() << ".xy"; + + xy_filename = newfilename.str(); + + // Make sure file is empty + FILE* fp = fopen(xy_filename.c_str(), "w"); + if (!fp) + error("Unable to open file %s", filename.c_str()); + fclose(fp); +} +//---------------------------------------------------------------------------- +template<class T> +void XYFile::mesh_function_write(T& meshfunction) +{ + // Update xy file name and clear file + xy_name_update(counter); + + Mesh& mesh = meshfunction.mesh(); + + if( meshfunction.dim() != mesh.topology().dim() ) + error("XY output of mesh functions is implemenetd for cell-based functions only."); + + // Open file + std::ofstream fp(xy_filename.c_str(), std::ios_base::app); + + fp<<mesh.num_cells( ) <<std::endl; + for (CellIterator cell(mesh); !cell.end(); ++cell) + fp << meshfunction.get( cell->index() ) << std::endl; + + // Close file + fp.close(); + + // Increase the number of times we have saved the mesh function + counter++; + + cout << "saved mesh function " << counter << " times." << endl; + + cout << "Saved mesh function " << mesh.name() << " (" << mesh.label() + << ") to file " << filename << " in XY format." << endl; +} +//---------------------------------------------------------------------------- === added file 'dolfin/io/XYFile.h' --- dolfin/io/XYFile.h 1970-01-01 00:00:00 +0000 +++ dolfin/io/XYFile.h 2010-09-08 16:59:48 +0000 @@ -0,0 +1,45 @@ +// Copyright (C) 2005-2007 Garth N.Wells. +// Licensed under the GNU LGPL Version 2.1. +// +// Modified by Nuno Lopes 2010. +// +// First added: 2010-02-17 + +#ifndef __XY_FILE_H +#define __XY_FILE_H + +#include <fstream> +#include "GenericFile.h" + +namespace dolfin +{ + + class XYFile : public GenericFile + { + public: + + /// Simple and light file format for use with Xd3d. Supports + /// scalar solution on 2D convex domains. The files only have a + /// list of xy coordinates 'x , u(x)=y' + + XYFile(const std::string filename); + ~XYFile(); + + void operator<< (const Function& u); + + private: + + void results_write(const Function& u) const; + void xy_name_update(const int counter); + + template<class T> + void mesh_function_write(T& meshfunction); + + // raw filename + std::string xy_filename; + + }; + +} + +#endif # Begin bundle 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
Thread Previous • Date Previous • Date Next • Thread Next |