13#ifndef dealii_data_out_base_h
14#define dealii_data_out_base_h
30#include <boost/serialization/map.hpp>
255 template <
int dim,
int spacedim = dim>
292 std::array<unsigned int, GeometryInfo<dim>::faces_per_cell>
neighbors;
394 <<
"It is not possible to have a structural dimension of " << arg1
395 <<
" to be larger than the space dimension of the surrounding"
396 <<
" space " << arg2);
417 template <
int spacedim>
546 <<
"It is not possible to have a structural dimension of " << arg1
547 <<
" to be larger than the space dimension of the surrounding"
548 <<
" space " << arg2);
564 template <
typename FlagsType>
598 template <
typename FlagsType>
604 template <
typename FlagsType>
610 template <
typename FlagsType>
614 return sizeof(FlagsType);
763 "There should be at least one space dimension per spatial "
764 "dimension (extras are ignored).");
981 const double min_value,
982 const double max_value);
1002 const double min_value,
1003 const double max_value);
1012 const double min_value,
1013 const double max_value);
1023 const double min_value,
1024 const double max_value);
1032 const unsigned int size = 300,
1175 std::map<std::string, std::vector<std::pair<std::string, AttributeValue>>>
1183 const double time = -std::numeric_limits<double>::infinity(),
1185 const std::map<std::string,
1186 std::vector<std::pair<std::string, AttributeValue>>>
1316 const double time = std::numeric_limits<double>::lowest(),
1375 const bool margin =
true,
1512 const unsigned int start,
1513 const std::array<unsigned int, dim> &offsets);
1522 const unsigned int start,
1523 const unsigned int n_points,
1534 const unsigned int dimension,
1535 const unsigned int set_num,
1551 std::vector<unsigned int> &cell_data)
const;
1629 return (one[0] < two[0] ||
1630 (!(two[0] < one[0]) &&
1631 (one[1] < two[1] || (!(two[1] < one[1]) && one[2] < two[2]))));
1691 const unsigned int pt_index);
1780 template <
int dim,
int spacedim>
1783 const std::vector<Patch<dim, spacedim>> &patches,
1784 const std::vector<std::string> &data_names,
1786 std::tuple<
unsigned int,
1790 &nonscalar_data_ranges,
1791 const DXFlags &flags,
1838 template <
int spacedim>
1841 const std::vector<Patch<2, spacedim>> &patches,
1842 const std::vector<std::string> &data_names,
1844 std::tuple<
unsigned int,
1848 &nonscalar_data_ranges,
1849 const EpsFlags &flags,
1857 template <
int dim,
int spacedim>
1860 const std::vector<Patch<dim, spacedim>> &patches,
1861 const std::vector<std::string> &data_names,
1863 std::tuple<
unsigned int,
1867 &nonscalar_data_ranges,
1868 const EpsFlags &flags,
1881 template <
int dim,
int spacedim>
1884 const std::vector<Patch<dim, spacedim>> &patches,
1885 const std::vector<std::string> &data_names,
1887 std::tuple<
unsigned int,
1891 &nonscalar_data_ranges,
1892 const GmvFlags &flags,
1950 template <
int dim,
int spacedim>
1953 const std::vector<Patch<dim, spacedim>> &patches,
1954 const std::vector<std::string> &data_names,
1956 std::tuple<
unsigned int,
1960 &nonscalar_data_ranges,
1961 const GnuplotFlags &flags,
2009 template <
int dim,
int spacedim>
2012 const std::vector<Patch<dim, spacedim>> &patches,
2013 const std::vector<std::string> &data_names,
2015 std::tuple<
unsigned int,
2019 &nonscalar_data_ranges,
2020 const PovrayFlags &flags,
2029 template <
int dim,
int spacedim>
2032 const std::vector<Patch<dim, spacedim>> &patches,
2033 const std::vector<std::string> &data_names,
2035 std::tuple<
unsigned int,
2039 &nonscalar_data_ranges,
2040 const TecplotFlags &flags,
2057 template <
int dim,
int spacedim>
2060 const std::vector<Patch<dim, spacedim>> &patches,
2061 const std::vector<std::string> &data_names,
2063 std::tuple<
unsigned int,
2067 &nonscalar_data_ranges,
2068 const UcdFlags &flags,
2090 template <
int dim,
int spacedim>
2093 const std::vector<Patch<dim, spacedim>> &patches,
2094 const std::vector<std::string> &data_names,
2096 std::tuple<
unsigned int,
2100 &nonscalar_data_ranges,
2101 const VtkFlags &flags,
2128 template <
int dim,
int spacedim>
2131 const std::vector<Patch<dim, spacedim>> &patches,
2132 const std::vector<std::string> &data_names,
2134 std::tuple<
unsigned int,
2138 &nonscalar_data_ranges,
2139 const VtkFlags &flags,
2165 template <
int dim,
int spacedim>
2168 const std::vector<Patch<dim, spacedim>> &patches,
2169 const std::vector<std::string> &data_names,
2171 std::tuple<
unsigned int,
2175 &nonscalar_data_ranges,
2176 const VtkFlags &flags,
2223 const std::vector<std::string> &piece_names,
2224 const std::vector<std::string> &data_names,
2226 std::tuple<
unsigned int,
2230 &nonscalar_data_ranges,
2231 const VtkFlags &flags);
2284 const std::vector<std::pair<double, std::string>> ×_and_names);
2299 const std::vector<std::string> &piece_names);
2330 const std::vector<std::vector<std::string>> &piece_names);
2367 const std::vector<std::pair<
double, std::vector<std::string>>>
2368 ×_and_piece_names);
2390 template <
int spacedim>
2393 const std::vector<Patch<2, spacedim>> &patches,
2394 const std::vector<std::string> &data_names,
2396 std::tuple<
unsigned int,
2400 &nonscalar_data_ranges,
2401 const SvgFlags &flags,
2441 template <
int dim,
int spacedim>
2444 const std::vector<Patch<dim, spacedim>> &patches,
2445 const std::vector<std::string> &data_names,
2447 std::tuple<
unsigned int,
2451 &nonscalar_data_ranges,
2452 const Deal_II_IntermediateFlags &flags,
2463 template <
int dim,
int spacedim>
2466 const std::vector<Patch<dim, spacedim>> &patches,
2467 const std::vector<std::string> &data_names,
2469 std::tuple<
unsigned int,
2473 &nonscalar_data_ranges,
2474 const Deal_II_IntermediateFlags &flags,
2475 const std::string &filename,
2483 template <
int dim,
int spacedim>
2486 const DataOutFilter &data_filter,
2488 const std::string &filename,
2498 template <
int dim,
int spacedim>
2501 const DataOutFilter &data_filter,
2503 const bool write_mesh_file,
2504 const std::string &mesh_filename,
2505 const std::string &solution_filename,
2512 template <
int dim,
int spacedim>
2515 const DataOutFilter &data_filter,
2517 const std::string &filename,
2526 template <
int dim,
int spacedim>
2529 const std::vector<Patch<dim, spacedim>> &patches,
2530 const std::vector<std::string> &data_names,
2532 std::tuple<
unsigned int,
2536 &nonscalar_data_ranges,
2537 DataOutFilter &filtered_data);
2550 std::pair<unsigned int, unsigned int>
2608 <<
"The number of points in this data set is " << arg1
2609 <<
", but we expected " << arg2
2610 <<
" in each space direction.");
2615 "You are trying to write graphical data into a file, but "
2616 "no data is available in the intermediate format that "
2617 "the DataOutBase functions require. Did you forget to "
2618 "call a function such as DataOut::build_patches()?");
2623 "The error code of one of the Tecplot functions was "
2624 "not zero as expected.");
2630 <<
"There was an error opening Tecplot file " << arg1
2748template <
int dim,
int spacedim = dim>
2891 const std::vector<std::string> &piece_names)
const;
2956 const std::string &directory,
2957 const std::string &filename_without_extension,
2958 const unsigned int counter,
2961 const unsigned int n_groups = 0)
const;
2991 const std::string &filename,
3002 const std::string &h5_filename,
3003 const double cur_time,
3013 const std::string &h5_mesh_filename,
3014 const std::string &h5_solution_filename,
3015 const double cur_time,
3044 const std::string &filename,
3063 const std::string &filename,
3075 const bool write_mesh_file,
3076 const std::string &mesh_filename,
3077 const std::string &solution_filename,
3122 const std::string &filename,
3144 write(std::ostream &out,
3160 template <
typename FlagType>
3219 virtual const std::vector<DataOutBase::Patch<dim, spacedim>> &
3226 virtual std::vector<std::string>
3247 virtual std::vector<
3248 std::tuple<
unsigned int,
3399template <
int dim,
int spacedim = dim>
3409 read(std::istream &in);
3447 "You are trying to merge two sets of patches for which the "
3448 "declared names of the variables do not match.");
3453 "You are trying to merge two sets of patches for which the "
3454 "number of subdivisions or the number of vector components "
3464 <<
"Either the dimensions <" << arg1 <<
"> and <" << arg2
3465 <<
"> or the space dimensions <" << arg3 <<
"> and <" << arg4
3466 <<
"> do not match!");
3477 virtual const std::vector<::DataOutBase::Patch<dim, spacedim>> &
3486 virtual std::vector<std::string>
3507 virtual std::vector<
3508 std::tuple<
unsigned int,
3519 std::vector<::DataOutBase::Patch<dim, spacedim>>
patches;
3527 std::tuple<
unsigned int,
3559 const std::uint64_t nodes,
3560 const std::uint64_t cells,
3561 const unsigned int dim_,
3569 XDMFEntry(
const std::string &mesh_filename,
3570 const std::string &solution_filename,
3572 const std::uint64_t nodes,
3573 const std::uint64_t cells,
3574 const unsigned int dim_,
3581 XDMFEntry(
const std::string &mesh_filename,
3582 const std::string &solution_filename,
3584 const std::uint64_t nodes,
3585 const std::uint64_t cells,
3586 const unsigned int dim_,
3587 const unsigned int spacedim,
3601 template <
class Archive>
3706 template <
int dim,
int spacedim>
3718 template <
int dim,
int spacedim>
const double * get_data_set(const unsigned int set_num) const
std::map< unsigned int, unsigned int > filtered_points
std::string get_data_set_name(const unsigned int set_num) const
std::multimap< Point< 3 >, unsigned int, Point3Comp > Map3DPoint
void internal_add_cell(const unsigned int cell_index, const unsigned int pt_index)
void write_cell(const unsigned int index, const unsigned int start, const std::array< unsigned int, dim > &offsets)
std::vector< unsigned int > data_set_dims
unsigned int n_nodes() const
void fill_node_data(std::vector< double > &node_data) const
std::vector< std::vector< double > > data_sets
unsigned int get_data_set_dim(const unsigned int set_num) const
void write_data_set(const std::string &name, const unsigned int dimension, const unsigned int set_num, const Table< 2, double > &data_vectors)
std::map< unsigned int, unsigned int > filtered_cells
std::vector< std::string > data_set_names
void fill_cell_data(const unsigned int local_node_offset, std::vector< unsigned int > &cell_data) const
void write_point(const unsigned int index, const Point< dim > &p)
void write_cell_single(const unsigned int index, const unsigned int start, const unsigned int n_points, const ReferenceCell< dim > &reference_cell)
unsigned int n_cells() const
DataOutBase::DataOutFilterFlags flags
Map3DPoint existing_points
unsigned int n_data_sets() const
XDMFEntry create_xdmf_entry(const DataOutBase::DataOutFilter &data_filter, const std::string &h5_filename, const double cur_time, const MPI_Comm comm) const
virtual std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > get_nonscalar_data_ranges() const
unsigned int default_subdivisions
void parse_parameters(ParameterHandler &prm)
DataOutBase::Deal_II_IntermediateFlags deal_II_intermediate_flags
void write_filtered_data(DataOutBase::DataOutFilter &filtered_data) const
void write_cf_parallel(const DataOutBase::DataOutFilter &data_filter, const std::string &filename, const MPI_Comm comm) const
void write_pvtu_record(std::ostream &out, const std::vector< std::string > &piece_names) const
static void declare_parameters(ParameterHandler &prm)
virtual std::vector< std::string > get_dataset_names() const =0
DataOutBase::TecplotFlags tecplot_flags
void write_ucd(std::ostream &out) const
void write_povray(std::ostream &out) const
std::string default_suffix(const DataOutBase::OutputFormat output_format=DataOutBase::default_format) const
void write_xdmf_file(const std::vector< XDMFEntry > &entries, const std::string &filename, const MPI_Comm comm) const
DataOutBase::GmvFlags gmv_flags
std::size_t memory_consumption() const
void set_default_format(const DataOutBase::OutputFormat default_format)
DataOutBase::Hdf5Flags hdf5_flags
DataOutBase::PovrayFlags povray_flags
DataOutBase::UcdFlags ucd_flags
void write(std::ostream &out, const DataOutBase::OutputFormat output_format=DataOutBase::default_format) const
DataOutBase::OutputFormat default_fmt
DataOutBase::GnuplotFlags gnuplot_flags
void write_gnuplot(std::ostream &out) const
virtual ~DataOutInterface()=default
DataOutBase::CFFlags cf_flags
void write_vtu(std::ostream &out) const
void write_hdf5_parallel(const DataOutBase::DataOutFilter &data_filter, const std::string &filename, const MPI_Comm comm) const
void write_tecplot(std::ostream &out) const
void write_deal_II_intermediate_in_parallel(const std::string &filename, const MPI_Comm comm, const DataOutBase::CompressionLevel compression) const
void write_svg(std::ostream &out) const
void write_vtu_in_parallel(const std::string &filename, const MPI_Comm comm) const
DataOutBase::SvgFlags svg_flags
void validate_dataset_names() const
void set_flags(const FlagType &flags)
void write_vtk(std::ostream &out) const
virtual const std::vector< DataOutBase::Patch< dim, spacedim > > & get_patches() const =0
DataOutBase::VtkFlags vtk_flags
void write_gmv(std::ostream &out) const
std::string write_vtu_with_pvtu_record(const std::string &directory, const std::string &filename_without_extension, const unsigned int counter, const MPI_Comm mpi_communicator, const unsigned int n_digits_for_counter=numbers::invalid_unsigned_int, const unsigned int n_groups=0) const
DataOutBase::EpsFlags eps_flags
void write_eps(std::ostream &out) const
DataOutBase::DXFlags dx_flags
void write_dx(std::ostream &out) const
void write_deal_II_intermediate(std::ostream &out) const
void merge(const DataOutReader< dim, spacedim > &other)
void read_whole_parallel_file(std::istream &in)
std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > nonscalar_data_ranges
virtual const std::vector<::DataOutBase::Patch< dim, spacedim > > & get_patches() const override
void read(std::istream &in)
virtual std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > get_nonscalar_data_ranges() const override
virtual std::vector< std::string > get_dataset_names() const override
std::vector< std::string > dataset_names
std::vector<::DataOutBase::Patch< dim, spacedim > > patches
unsigned int n_vertices_per_cell
std::string h5_sol_filename
void serialize(Archive &ar, const unsigned int)
std::string cell_type_name
std::string h5_mesh_filename
std::string get_xdmf_content(const unsigned int indent_level) const
void add_attribute(const std::string &attr_name, const unsigned int dimension)
std::map< std::string, unsigned int > attribute_dims
unsigned int space_dimension
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcIncompatiblePatchLists()
#define DeclException4(Exception4, type1, type2, type3, type4, outsequence)
static ::ExceptionBase & ExcNotEnoughSpaceDimensionLabels()
static ::ExceptionBase & ExcInvalidCombinationOfDimensions(int arg1, int arg2)
static ::ExceptionBase & ExcNoPatches()
static ::ExceptionBase & ExcTecplotAPIError()
#define DeclException2(Exception2, type1, type2, outsequence)
static ::ExceptionBase & ExcIncompatibleDimensions(int arg1, int arg2, int arg3, int arg4)
#define DeclExceptionMsg(Exception, defaulttext)
static ::ExceptionBase & ExcIncompatibleDatasetNames()
#define DeclException1(Exception1, type1, outsequence)
static ::ExceptionBase & ExcInvalidDatasetSize(int arg1, int arg2)
static ::ExceptionBase & ExcErrorOpeningTecplotFile(char *arg1)
DataComponentInterpretation
void write_eps(const std::vector< Patch< 2, spacedim > > &patches, const std::vector< std::string > &data_names, const std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > &nonscalar_data_ranges, const EpsFlags &flags, std::ostream &out)
std::pair< unsigned int, unsigned int > determine_intermediate_format_dimensions(std::istream &input)
std::ostream & operator<<(std::ostream &out, const Patch< dim, spacedim > &patch)
void write_deal_II_intermediate_in_parallel(const std::vector< Patch< dim, spacedim > > &patches, const std::vector< std::string > &data_names, const std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > &nonscalar_data_ranges, const Deal_II_IntermediateFlags &flags, const std::string &filename, const MPI_Comm comm, const CompressionLevel compression)
void write_ucd(const std::vector< Patch< dim, spacedim > > &patches, const std::vector< std::string > &data_names, const std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > &nonscalar_data_ranges, const UcdFlags &flags, std::ostream &out)
void write_cf_parallel(const std::vector< Patch< dim, spacedim > > &patches, const DataOutFilter &data_filter, const DataOutBase::CFFlags &flags, const std::string &filename, const MPI_Comm comm)
void write_dx(const std::vector< Patch< dim, spacedim > > &patches, const std::vector< std::string > &data_names, const std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > &nonscalar_data_ranges, const DXFlags &flags, std::ostream &out)
void write_vtu_header(std::ostream &out, const VtkFlags &flags)
void write_vtu(const std::vector< Patch< dim, spacedim > > &patches, const std::vector< std::string > &data_names, const std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > &nonscalar_data_ranges, const VtkFlags &flags, std::ostream &out)
void write_gmv(const std::vector< Patch< dim, spacedim > > &patches, const std::vector< std::string > &data_names, const std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > &nonscalar_data_ranges, const GmvFlags &flags, std::ostream &out)
void write_vtu_main(const std::vector< Patch< dim, spacedim > > &patches, const std::vector< std::string > &data_names, const std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > &nonscalar_data_ranges, const VtkFlags &flags, std::ostream &out)
void write_pvd_record(std::ostream &out, const std::vector< std::pair< double, std::string > > ×_and_names)
void write_deal_II_intermediate(const std::vector< Patch< dim, spacedim > > &patches, const std::vector< std::string > &data_names, const std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > &nonscalar_data_ranges, const Deal_II_IntermediateFlags &flags, std::ostream &out)
void write_vtu_footer(std::ostream &out)
void write_tecplot(const std::vector< Patch< dim, spacedim > > &patches, const std::vector< std::string > &data_names, const std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > &nonscalar_data_ranges, const TecplotFlags &flags, std::ostream &out)
void write_filtered_data(const std::vector< Patch< dim, spacedim > > &patches, const std::vector< std::string > &data_names, const std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > &nonscalar_data_ranges, DataOutFilter &filtered_data)
OutputFormat parse_output_format(const std::string &format_name)
void write_hdf5_parallel(const std::vector< Patch< dim, spacedim > > &patches, const DataOutFilter &data_filter, const DataOutBase::Hdf5Flags &flags, const std::string &filename, const MPI_Comm comm)
std::istream & operator>>(std::istream &in, Patch< dim, spacedim > &patch)
std::string get_output_format_names()
void write_svg(const std::vector< Patch< 2, spacedim > > &patches, const std::vector< std::string > &data_names, const std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > &nonscalar_data_ranges, const SvgFlags &flags, std::ostream &out)
void write_visit_record(std::ostream &out, const std::vector< std::string > &piece_names)
std::string default_suffix(const OutputFormat output_format)
void write_povray(const std::vector< Patch< dim, spacedim > > &patches, const std::vector< std::string > &data_names, const std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > &nonscalar_data_ranges, const PovrayFlags &flags, std::ostream &out)
void write_gnuplot(const std::vector< Patch< dim, spacedim > > &patches, const std::vector< std::string > &data_names, const std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > &nonscalar_data_ranges, const GnuplotFlags &flags, std::ostream &out)
void write_vtk(const std::vector< Patch< dim, spacedim > > &patches, const std::vector< std::string > &data_names, const std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > &nonscalar_data_ranges, const VtkFlags &flags, std::ostream &out)
void write_pvtu_record(std::ostream &out, const std::vector< std::string > &piece_names, const std::vector< std::string > &data_names, const std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > &nonscalar_data_ranges, const VtkFlags &flags)
constexpr unsigned int invalid_unsigned_int
std::map< std::string, std::vector< std::pair< std::string, AttributeValue > > > attributes
std::variant< int, double, std::string > AttributeValue
void parse_parameters(const ParameterHandler &prm)
static void declare_parameters(ParameterHandler &prm)
static void declare_parameters(ParameterHandler &prm)
std::size_t memory_consumption() const
void parse_parameters(const ParameterHandler &prm)
bool filter_duplicate_vertices
bool operator()(const Point< 3 > &one, const Point< 3 > &two) const
static void declare_parameters(ParameterHandler &prm)
static RgbValues default_color_function(const double value, const double min_value, const double max_value)
void parse_parameters(const ParameterHandler &prm)
ColorFunction color_function
RgbValues(*)(const double value, const double min_value, const double max_value) ColorFunction
static RgbValues grey_scale_color_function(const double value, const double min_value, const double max_value)
unsigned int color_vector
static RgbValues reverse_grey_scale_color_function(const double value, const double min_value, const double max_value)
@ width
Scale to given width.
@ height
Scale to given height.
unsigned int height_vector
std::vector< std::string > space_dimension_labels
std::size_t memory_consumption() const
DataOutBase::CompressionLevel compression_level
std::size_t memory_consumption() const
static void declare_parameters(ParameterHandler &prm)
void parse_parameters(const ParameterHandler &prm)
static const unsigned int n_subdivisions
bool points_are_available
static const ReferenceCell< 0 > reference_cell
std::size_t memory_consumption() const
static const unsigned int no_neighbor
bool operator==(const Patch &patch) const
ReferenceCell< dim > reference_cell
void swap(Patch< dim, spacedim > &other_patch) noexcept
static const unsigned int space_dim
unsigned int n_subdivisions
std::array< Point< spacedim >, GeometryInfo< dim >::vertices_per_cell > vertices
bool points_are_available
std::array< unsigned int, GeometryInfo< dim >::faces_per_cell > neighbors
static void declare_parameters(ParameterHandler &prm)
void parse_parameters(const ParameterHandler &prm)
unsigned int height_vector
unsigned int line_thickness
std::size_t memory_consumption() const
void parse_parameters(const ParameterHandler &prm)
static void declare_parameters(ParameterHandler &prm)
std::map< std::string, std::string > physical_units
bool write_higher_order_cells
DataOutBase::CompressionLevel compression_level