Flow123d  master-7bf36fe
msh_pvdreader.cc
Go to the documentation of this file.
1 /*!
2  *
3  * Copyright (C) 2015 Technical University of Liberec. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU General Public License version 3 as published by the
7  * Free Software Foundation. (http://www.gnu.org/licenses/gpl-3.0.en.html)
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12  *
13  *
14  * @file msh_pvdreader.cc
15  * @brief
16  * @author dalibor
17  */
18 
19 
20 #include <iostream>
21 #include <vector>
22 #include <pugixml.hpp>
23 
24 #include "msh_pvdreader.hh"
25 #include "msh_vtkreader.hh"
26 
27 
28 
30 : BaseMeshReader(file_name)
31 {
32  data_section_name_ = "DataArray";
33  has_compatible_mesh_ = false;
34  pvd_path_dir_ = file_name.parent_path();
36 }
37 
38 
40 {
41  for (auto file_data : file_list_) {
42  if (file_data.reader != nullptr) delete file_data.reader;
43  }
44 }
45 
46 
48  // will be implemented later
49  // ASSERT_PERMANENT(0).error("Not implemented!");
50 }
51 
52 
54  file_list_[0].reader = new VtkMeshReader(file_list_[0].file_name, this->element_data_values_, file_list_[0].time);
55  file_list_[0].reader->read_nodes(mesh);
56 }
57 
58 
60  file_list_[0].reader->read_elements(mesh);
61 }
62 
63 
65  list_it_->reader->read_element_data(data_cache, header);
66 }
67 
68 
70  pugi::xml_document doc;;
71  doc.load_file( tok_.f_name().c_str() );
72  pugi::xml_node node = doc.child("VTKFile").child("Collection");
73 
74  double last_time = -numeric_limits<double>::infinity(); // check ascending order of times
75  std::vector<std::string> sub_paths; //allow construct paths of VTK files
76  sub_paths.resize(2);
77  sub_paths[0] = pvd_path_dir_;
78 
79  // read PVD data
80  for (pugi::xml_node subnode = node.child("DataSet"); subnode; subnode = subnode.next_sibling("DataSet")) {
81  double time = subnode.attribute("timestep").as_double();
82  if (time <= last_time) {
83  WarningOut().fmt("Wrong time order in PVD file '{}', time '{}'. Skipping this time step.\n", tok_.f_name(), time );
84  } else {
85  sub_paths[1] = subnode.attribute("file").as_string();
86  FilePath vtk_path(sub_paths, FilePath::input_file);
87  last_time = time;
88  file_list_.push_back( VtkFileData(time, vtk_path) );
89  }
90  }
91 }
92 
93 
95  auto comp = [](double t, const VtkFileData &a) {
96  return t * (1.0 + 2.0*numeric_limits<double>::epsilon()) < a.time;
97  };
98 
99  // find iterator to data of VTK file
100  list_it_ = std::upper_bound(file_list_.begin(),
101  file_list_.end(),
102  header_query.time,
103  comp);
104  --list_it_;
105 
106  // check if VTK reader exists and eventually creates its
107  if (!list_it_->reader) {
108  list_it_->reader = new VtkMeshReader(list_it_->file_name, this->element_data_values_, list_it_->time);
109  list_it_->reader->bulk_elements_id_ = this->bulk_elements_id_;
110  list_it_->reader->boundary_elements_id_ = this->boundary_elements_id_;
111  list_it_->reader->has_compatible_mesh_ = true;
112  }
113 
114  return list_it_->reader->find_header(header_query);
115 }
116 
PvdMeshReader::find_header
MeshDataHeader & find_header(HeaderQuery &header_query) override
Definition: msh_pvdreader.cc:94
BaseMeshReader::tok_
Tokenizer tok_
Tokenizer used for reading ASCII file format.
Definition: msh_basereader.hh:257
BaseMeshReader::boundary_elements_id_
vector< LongIdx > boundary_elements_id_
Definition: msh_basereader.hh:262
PvdMeshReader::read_physical_names
void read_physical_names(Mesh *mesh) override
Definition: msh_pvdreader.cc:47
FilePath
Dedicated class for storing path to input and output files.
Definition: file_path.hh:54
PvdMeshReader::make_header_table
void make_header_table() override
Definition: msh_pvdreader.cc:69
VtkMeshReader
Definition: msh_vtkreader.hh:40
std::vector< std::string >
PvdMeshReader::VtkFileData
Represents data of one VTK file defined in PVD file.
Definition: msh_pvdreader.hh:58
PvdMeshReader::pvd_path_dir_
std::string pvd_path_dir_
Path to PVD file allows construct FilePath objects of VTK files.
Definition: msh_pvdreader.hh:93
PvdMeshReader::file_list_
std::vector< VtkFileData > file_list_
Store list of VTK files and time steps declared in PVD file.
Definition: msh_pvdreader.hh:90
FilePath::parent_path
string parent_path() const
Definition: file_path.cc:183
PvdMeshReader::read_element_data
void read_element_data(ElementDataCacheBase &data_cache, MeshDataHeader header) override
Definition: msh_pvdreader.cc:64
PvdMeshReader::read_nodes
void read_nodes(Mesh *mesh) override
Definition: msh_pvdreader.cc:53
PvdMeshReader::read_elements
void read_elements(Mesh *mesh) override
Definition: msh_pvdreader.cc:59
BaseMeshReader::element_data_values_
std::shared_ptr< ElementDataFieldMap > element_data_values_
Cache with last read element data.
Definition: msh_basereader.hh:254
PvdMeshReader::PvdMeshReader
PvdMeshReader(const FilePath &file_name)
Definition: msh_pvdreader.cc:29
BaseMeshReader
Definition: msh_basereader.hh:58
PvdMeshReader::~PvdMeshReader
~PvdMeshReader()
Destructor.
Definition: msh_pvdreader.cc:39
ElementDataCacheBase
Definition: element_data_cache_base.hh:33
msh_pvdreader.hh
PvdMeshReader::list_it_
std::vector< VtkFileData >::iterator list_it_
Iterator to items of file_list_.
Definition: msh_pvdreader.hh:96
BaseMeshReader::MeshDataHeader
Definition: msh_basereader.hh:104
Mesh
Definition: mesh.h:362
WarningOut
#define WarningOut()
Macro defining 'warning' record of log.
Definition: logger.hh:278
FilePath::input_file
@ input_file
Definition: file_path.hh:68
msh_vtkreader.hh
BaseMeshReader::data_section_name_
std::string data_section_name_
Store name of field data section specify for type of mesh file.
Definition: msh_basereader.hh:251
BaseMeshReader::MeshDataHeader::time
double time
Time of field data (used only for GMSH reader)
Definition: msh_basereader.hh:129
BaseMeshReader::HeaderQuery::time
double time
Time of field data (used only for GMSH and PVD reader)
Definition: msh_basereader.hh:142
BaseMeshReader::has_compatible_mesh_
bool has_compatible_mesh_
Definition: msh_basereader.hh:248
BaseMeshReader::HeaderQuery
Definition: msh_basereader.hh:136
BaseMeshReader::bulk_elements_id_
vector< LongIdx > bulk_elements_id_
Definition: msh_basereader.hh:262