1#ifndef DUNE_FEM_DATAOUTPUT_HH
2#define DUNE_FEM_DATAOUTPUT_HH
15#define USE_VTKWRITER 1
18#include <dune/common/hybridutilities.hh>
21#include <dune/fem/common/utility.hh>
22#include <dune/fem/function/adaptivefunction.hh>
23#include <dune/fem/gridpart/adaptiveleafgridpart.hh>
24#include <dune/fem/io/file/iointerface.hh>
25#include <dune/fem/io/file/iotuple.hh>
26#include <dune/fem/io/file/vtkio.hh>
27#include <dune/fem/io/parameter.hh>
28#include <dune/fem/operator/projection/vtxprojection.hh>
29#include <dune/fem/quadrature/cachingquadrature.hh>
30#include <dune/fem/solver/timeprovider.hh>
31#include <dune/fem/space/common/loadbalancer.hh>
32#include <dune/fem/space/common/interpolate.hh>
33#include <dune/fem/gridpart/adaptiveleafgridpart.hh>
34#include <dune/fem/space/lagrange.hh>
36#ifndef ENABLE_VTXPROJECTION
37#define ENABLE_VTXPROJECTION 1
41#include <dune/fem/io/file/vtkio.hh>
42#if ENABLE_VTXPROJECTION
43#include <dune/fem/operator/projection/vtxprojection.hh>
48#define USE_GRAPE HAVE_GRAPE
52#include <dune/grid/io/visual/grapedatadisplay.hh>
71 :
public LocalParameter< DataOutputParameters, DataOutputParameters >
75 const std::string keyPrefix_;
76 ParameterReader parameter_;
79 explicit DataOutputParameters ( std::string keyPrefix,
const ParameterReader ¶meter = Parameter::container() )
80 : keyPrefix_( std::move( keyPrefix ) ), parameter_( parameter )
84 : keyPrefix_(
"fem.io." ), parameter_( parameter )
88 virtual std::string
path()
const
90 return parameter().getValue< std::string >( keyPrefix_ +
"path",
"./" );
93 virtual std::string absolutePath ()
const
95 std::string absPath = parameter().getValue< std::string >(
"fem.prefix",
"." ) +
"/";
96 const std::string relPath =
path();
105 return parameter().getValue< std::string >( keyPrefix_ +
"datafileprefix",
"" );
111 static const std::string formatTable[]
112 = {
"vtk-cell",
"vtk-vertex",
"sub-vtk-cell",
"binary" ,
"gnuplot" ,
"none" };
113 int format = parameter().getEnum( keyPrefix_ +
"outputformat", formatTable, 0 );
117 virtual bool conformingoutput ()
const
119 return parameter().getValue<
bool >( keyPrefix_ +
"conforming", false );
126 return (parameter().getValue( keyPrefix_ +
"grapedisplay", 0 ) == 1);
135 return parameter().getValue<
double >( keyPrefix_ +
"savestep", 0 );
141 return parameter().getValue<
int >( keyPrefix_ +
"savecount", 0 );
147 return parameter().getValue<
int >( keyPrefix_ +
"subsamplinglevel", 1 );
182 const ParameterReader ¶meter () const noexcept {
return parameter_; }
194 template<
class Gr
idImp,
class DataImp >
201 template<
class VTKIOType >
204 virtual ~VTKListEntry ()
206 virtual void add ( VTKIOType & )
const = 0;
213#if ENABLE_VTXPROJECTION
214 template<
class VTKIOType,
class DFType >
217 template<
class VTKOut >
218 struct VTKOutputerLagrange;
221 template<
class VTKOut >
222 struct VTKOutputerDG;
225 template<
class Gr
idPartType >
226 class GnuplotOutputer;
230 FileWriter ( std::string name )
234 std::cout <<
"could not write file: " << name << std::endl;
237 void operator() (
const std::string &s ) { file_ << s << std::endl; }
246 PVDWriter ( std::string name )
249 file_ <<
"<?xml version=\"1.0\"?>" << std::endl;
250 file_ <<
"<VTKFile type=\"Collection\" version=\"0.1\" byte_order=\"LittleEndian\">" << std::endl;
251 file_ <<
" <Collection>" << std::endl;
256 file_ <<
" </Collection>" << std::endl;
257 file_ <<
"</VTKFile>" << std::endl;
260 void operator() (
double sequenceStamp, std::string filename )
265 auto pos = filename.find_last_of(
'/' );
266 if( pos != filename.npos )
267 filename = filename.substr( pos+1, filename.npos );
268 static_cast< FileWriter &
>( *this )(
" <DataSet timestep=\"" + std::to_string( sequenceStamp ) +
"\" group=\"\" part=\"0\" file=\"" + filename +
"\"/>" );
276 enum OutputFormat { vtk = 0, vtkvtx = 1, subvtk = 2 , binary = 3, gnuplot = 4, none = 5 };
302 DataOutput (
const GridType &grid,
OutPutDataType &data,
const ParameterReader ¶meter = Parameter::container() )
316 consistentSaveStep( tp );
334 void consistentSaveStep (
const TimeProviderBase &tp )
const;
341 consistentSaveStep( tp );
343 const double saveTimeEps = 2*std::numeric_limits< double >::epsilon()*saveTime_;
344 const bool writeStep = (saveStep_ > 0) && (tp.
time() - saveTime_ >= -saveTimeEps);
345 const bool writeCount = (saveCount_ > 0) && (writeCalls_ % saveCount_ == 0);
346 return param_->willWrite(
writeStep || writeCount );
352 return param_->willWrite( (saveCount_ > 0) && (writeCalls_ % saveCount_ == 0) );
358 void write(
const std::string& outstring )
const
396 void writeData (
double sequenceStamp,
const std::string &outstring )
const;
413 const std::string &
path ()
const
437 auto getGridPart()
const
439 static constexpr bool isNotEmpty = std::tuple_size< DataImp >::value > 0;
440 return getGridPart( std::integral_constant< bool, isNotEmpty > () );
443 auto getGridPart( std::integral_constant< bool, false > )
const
445 typedef Dune::Fem::LeafGridPart< GridType > GridPartType;
446 return GridPartType(
const_cast<GridType&
> (
grid_) );
449 auto getGridPart( std::integral_constant< bool, true > )
const
451 return std::get< 0 >( data_ )->gridPart();
455 std::string writeVTKOutput ()
const;
458 std::string writeGnuPlotOutput ()
const;
474 template<
class OutputTupleType >
483 std::string datapref_;
488 mutable int writeStep_;
490 mutable int writeCalls_;
492 mutable double saveTime_;
498 OutputFormat outputFormat_;
499 bool conformingOutput_;
500 std::unique_ptr< FileWriter > sequence_;
501 std::unique_ptr< PVDWriter > pvd_;
502 std::unique_ptr< const DataOutputParameters > param_;
511#if ENABLE_VTXPROJECTION
512 template<
class Gr
idImp,
class DataImp >
513 template<
class VTKIOType,
class DFType >
515 :
public VTKListEntry< VTKIOType >
517 typedef typename VTKIOType::GridPartType GridPartType;
524 VTKFunc (
const GridPartType &gridPart,
const DFType &df )
526 space_(
const_cast< GridPartType &
>( gridPart ) )
529 virtual void add ( VTKIOType &vtkio )
const
531 func_.reset(
new NewFunctionType( df_.name()+
"vtx-prj" , space_ ) );
532 if( df_.continuous() )
538 WeightDefault<GridPartType> weight;
539 VtxProjectionImpl::project( df_, *func_, weight );
541 vtkio.addVertexData( *func_ );
544 VTKFunc (
const VTKFunc & ) =
delete;
548 LagrangeSpaceType space_;
549 mutable std::unique_ptr<NewFunctionType> func_;
560 template<
class Gr
idImp,
class DataImp >
561 template<
class VTKOut >
562 struct DataOutput< GridImp, DataImp >::VTKOutputerDG
564 template<
class... Args >
565 explicit VTKOutputerDG (
bool conforming, Args &&... args )
566 : conforming_(
conforming ), vtkOut_(
std::forward< Args >( args )... )
569 template<
typename ... T >
570 void forEach (
const std::tuple< T ... >& data )
574 auto df( std::get< i >( data ) );
577 if( conforming_ || ( df->order() == 0 ) )
578 vtkOut_.addCellData( *df );
580 vtkOut_.addVertexData( *df );
585 template<
typename T >
588 std::tuple< T > tup( data );
592 std::string
write (
bool parallel,
const std::string &name,
const std::string &
path )
594 return (parallel ? vtkOut_.pwrite( name,
path,
"." ) : vtkOut_.write( name ));
609#if ENABLE_VTXPROJECTION
610 template<
class Gr
idImp,
class DataImp >
611 template<
class VTKOut >
612 struct DataOutput< GridImp, DataImp >::VTKOutputerLagrange
615 template<
class... Args >
616 explicit VTKOutputerLagrange ( Args &&... args )
617 : vtkOut_(
std::forward< Args >( args )... )
620 template<
typename ... T >
621 void forEach (
const std::tuple< T ... >& data )
625 auto df( std::get< i >( data ) );
628 typedef typename std::remove_pointer<
decltype( df ) >::type DFType;
629 vec_.emplace_back(
new VTKFunc< VTKOut, DFType >( vtkOut_.gridPart(), *df ) );
630 vec_.back()->add( vtkOut_ );
635 template<
typename T >
638 std::tuple< T > tup( data );
642 std::string
write (
bool parallel,
const std::string &name,
const std::string &
path )
644 return (parallel ? vtkOut_.pwrite( name,
path,
"." ) : vtkOut_.write( name ));
648 std::vector< std::unique_ptr< VTKListEntry< VTKOut > > > vec_;
658 template<
class Gr
idImp,
class DataImp >
659 template<
class Gr
idPartType >
660 class DataOutput< GridImp, DataImp >::GnuplotOutputer
662 typedef typename GridPartType::template Codim< 0 >::IteratorType::Entity Entity;
664 CachingQuadrature<GridPartType,0> &quad_;
670 GnuplotOutputer ( std::ostream& out,
671 CachingQuadrature<GridPartType,0> &quad,
674 : out_(out), quad_(quad), i_(i), en_(en)
677 template<
typename ... T >
678 void forEach (
const std::tuple< T ... >& data )
682 auto df( std::get< i >( data ));
685 ConstLocalFunction<std::decay_t<
decltype(*df)> > lf(*df);
687 typedef typename std::remove_pointer<
decltype( df ) >::type DFType;
688 typename DFType::FunctionSpaceType::RangeType u;
689 lf.evaluate( quad_[ i_ ], u );
691 constexpr int dimRange = DFType::FunctionSpaceType::dimRange;
692 for(
auto k = 0; k < dimRange; ++k )
693 out_ <<
" " << u[ k ];
699 template<
typename T >
702 std::tuple< T > tup( data );
712 template<
class Gr
idImp,
class DataImp >
715 std::unique_ptr< const DataOutputParameters > parameters )
723 outputFormat_(vtkvtx),
724 conformingOutput_( false ),
725 param_(
std::move( parameters ) )
727 const bool writeMode = param_->writeMode();
728 path_ = param_->absolutePath();
735 datapref_ += param_->prefix();
737 auto outputFormat = param_->outputformat();
738 switch( outputFormat )
740 case 0: outputFormat_ = vtk;
break;
741 case 1: outputFormat_ = vtkvtx;
break;
742 case 2: outputFormat_ = subvtk;
break;
743 case 3: outputFormat_ = binary;
break;
744 case 4: outputFormat_ = gnuplot;
break;
745 case 5: outputFormat_ = none;
break;
750 conformingOutput_ = param_->conformingoutput();
752 grapeDisplay_ = param_->grapedisplay();
755 saveStep_ = param_->savestep();
756 saveCount_ = param_->savecount();
759 writeStep_ = param_->startcounter();
760 writeCalls_ = param_->startcall();
761 saveTime_ = param_->startsavetime();
768 sequence_.reset(
new FileWriter( path_ +
"/" + datapref_ +
".series" ) );
769 pvd_.reset(
new PVDWriter( path_ +
"/" + datapref_ +
".pvd" ) );
773 Parameter::write(
"parameter.log");
778 template<
class Gr
idImp,
class DataImp >
785 const auto oldTime = tp.
time() - saveStep_;
786 while( saveTime_ <= oldTime )
789 saveTime_ += saveStep_;
795 template<
class Gr
idImp,
class DataImp >
797 ::writeData (
double sequenceStamp,
const std::string &outstring )
const
799 std::string filename;
802 switch( outputFormat_ )
806 case binary: writeBinaryData( sequenceStamp );
break;
812 filename = writeVTKOutput();
817 case gnuplot : filename = writeGnuPlotOutput();
break;
822 if( outputFormat_ !=
none )
825 (*sequence_)( std::to_string( writeStep_ ) +
" " + filename +
" " + std::to_string( sequenceStamp ) + outstring );
828 (*pvd_)( sequenceStamp, filename );
834 std::cout << myClassName() <<
"[" << grid_.comm().rank() <<
"]::write data"
835 <<
" writestep=" << writeStep_
836 <<
" sequenceStamp=" << sequenceStamp
842 saveTime_ += saveStep_;
847 template<
class Gr
idImp,
class DataImp >
850 std::string filename;
852 const bool vertexData = (outputFormat_ == vtkvtx);
855 const bool parallel = (grid_.comm().size() > 1);
858 auto name = generateFilename( (parallel ? datapref_ : path_ +
"/" + datapref_ ), writeStep_ );
861 const auto& gridPart = getGridPart();
862 typedef typename std::decay<
decltype( gridPart ) >::type GridPartType;
866#if ENABLE_VTXPROJECTION
868 VTKOutputerLagrange< VTKIO< GridPartType > > io( gridPart, VTK::conforming, param_->parameter() );
874 filename = io.write( parallel, name, path_ );
877 else if ( outputFormat_ == vtk )
880 VTKOutputerDG< VTKIO< GridPartType > > io( conformingOutput_, gridPart, conformingOutput_ ? VTK::conforming : VTK::nonconforming, param_->parameter() );
886 filename = io.write( parallel, name, path_ );
888 else if ( outputFormat_ == subvtk )
891 VTKOutputerDG< SubsamplingVTKIO < GridPartType > > io( conformingOutput_, gridPart,
static_cast< unsigned int >( param_->subsamplingLevel() ), param_->parameter() );
897 filename = io.write( parallel, name, path_ );
904 template<
class Gr
idImp,
class DataImp >
905 inline std::string DataOutput< GridImp, DataImp >::writeGnuPlotOutput ()
const
908 auto name = generateFilename( path_ +
"/" + datapref_, writeStep_ );
910 std::ofstream gnuout(name.c_str());
911 gnuout << std::scientific << std::setprecision( 16 );
914 const auto& gridPart = getGridPart();
915 typedef typename std::decay<
decltype( gridPart ) >::type GridPartType;
916 for(
const auto& entity : elements( gridPart ) )
918 CachingQuadrature< GridPartType, 0 > quad( entity, 1 );
919 for(
decltype(quad.nop()) i = 0; i < quad.nop(); ++i )
921 const auto x = entity.geometry().global( quad.point( i ) );
922 for(
auto k = 0; k < x.dimension; ++k )
923 gnuout << (k > 0 ?
" " :
"") << x[ k ];
924 GnuplotOutputer< GridPartType > io( gnuout, quad, i, entity );
934 template<
class Gr
idImp,
class DataImp >
935 template<
class OutputTupleType >
938 GrapeDataDisplay<GridType> grape(grid_);
939 IOTuple<OutPutDataType>::addToDisplay(grape,data);
943 template<
class Gr
idImp,
class DataImp >
944 template<
class OutputTupleType >
947 std::cerr <<
"WARNING: HAVE_GRAPE == 0, but grapeDisplay == true, recompile with grape support for online display!" << std::endl;
961 -> std::enable_if_t< std::is_reference< DF >::value && std::is_base_of< Fem::HasLocalFunction, std::decay_t< DF > >::value,
962 std::tuple< std::decay_t< DF > * > >
964 return std::make_tuple( &df );
974 template<
class... Args >
975 inline static auto makeIOTuple ( Args &&... args )
977 return std::tuple_cat( makeSingleIOTuple( std::forward< Args >( args ), PriorityTag< 42 >() )... );
985 inline static auto getSingleDataOutputParameters ( std::unique_ptr< const DataOutputParameters > parameters )
987 return std::make_tuple( std::move( parameters ) );
990 inline static auto getSingleDataOutputParameters (
const DataOutputParameters ¶meters )
992 return std::make_tuple( std::unique_ptr< const DataOutputParameters >( parameters.clone() ) );
995 inline static auto getSingleDataOutputParameters (
const ParameterReader ¶meter )
997 return std::make_tuple( std::make_unique< const DataOutputParameters >( parameter ) );
1000 template<
class Arg >
1001 inline static auto getSingleDataOutputParameters ( Arg &&arg, PriorityTag< 1 > )
1002 ->
decltype( getSingleDataOutputParameters( std::declval< Arg >() ) )
1004 return getSingleDataOutputParameters( std::forward< Arg >( arg ) );
1007 template<
class Arg >
1008 inline static std::tuple<> getSingleDataOutputParameters ( Arg &&arg, PriorityTag< 0 > )
1013 template<
class... Args >
1014 inline static auto getDataOutputParametersTuple ( Args &&... args )
1015 ->
decltype( std::tuple_cat( getSingleDataOutputParameters( std::declval< Args >(), PriorityTag< 42 >() )... ) )
1017 return std::tuple_cat( getSingleDataOutputParameters( std::forward< Args >( args ), PriorityTag< 42 >() )... );
1020 template<
class... Args >
1021 inline static auto getDataOutputParameters ( Args &&... args )
1022 -> std::enable_if_t< (std::tuple_size< decltype( getDataOutputParametersTuple( std::declval< Args >()... ) ) >::value == 0), std::unique_ptr< const DataOutputParameters > >
1024 return std::make_unique< const DataOutputParameters >( Parameter::container() );
1027 template<
class... Args >
1028 inline static auto getDataOutputParameters ( Args &&... args )
1029 -> std::enable_if_t< (std::tuple_size< decltype( getDataOutputParametersTuple( std::declval< Args >()... ) ) >::value > 0), std::unique_ptr< const DataOutputParameters > >
1031 static_assert( (std::tuple_size< decltype( Impl::getDataOutputParametersTuple( std::declval< Args >()... ) ) >::value == 1),
"Cannot pass multiple DataOutputParameters to DataOutput" );
1032 return std::get< 0 >( getDataOutputParametersTuple( std::forward< Args >( args )... ) );
1040 template<
class Arg,
class =
void >
1041 struct ValidDataOutputArgument
1042 :
public std::false_type
1045 template<
class DF >
1046 struct ValidDataOutputArgument< DF,
std::enable_if_t< std::is_base_of< Fem::HasLocalFunction, std::decay_t< DF > >::value > >
1047 :
public std::true_type
1050 template<
class Arg >
1051 struct ValidDataOutputArgument< Arg,
void_t< decltype( getSingleDataOutputParameters(
std::declval< Arg >() ) ) > >
1052 :
public std::true_type
1062 template<
class Grid,
class... Args, std::enable_if_t< Std::And( Impl::ValidDataOutputArgument< Args >::value... ),
int > = 0 >
1063 inline static auto dataOutput (
const Grid &grid, Args &&... args )
1065 auto ioTuple = Impl::makeIOTuple( std::forward< Args >( args )... );
1066 auto parameters = Impl::getDataOutputParameters( std::forward< Args >( args )... );
1067 return DataOutput< Grid, decltype( ioTuple ) >( grid, ioTuple, std::move( parameters ) );
1070 template<
class Grid,
class... Args, std::enable_if_t< Std::And( Impl::ValidDataOutputArgument< Args >::value... ),
int > = 0 >
1071 inline static auto dataOutput (
const Grid &grid,
const TimeProviderBase &tp, Args &&... args )
1073 auto ioTuple = Impl::makeIOTuple( std::forward< Args >( args )... );
1074 auto parameters = Impl::getDataOutputParameters( std::forward< Args >( args )... );
1075 return DataOutput< Grid, decltype( ioTuple ) >( grid, ioTuple, tp, std::move( parameters ) );
Definition: adaptivefunction.hh:48
Implementation of the Dune::Fem::IOInterface. This class manages data output. Available output format...
Definition: dataoutput.hh:197
DataOutput(const GridType &grid, OutPutDataType &data, const TimeProviderBase &tp, const DataOutputParameters ¶meter)
Constructor creating data writer.
Definition: dataoutput.hh:326
const std::string & path() const
return output path name
Definition: dataoutput.hh:413
void write() const
write given data to disc, evaluates parameter savecount
Definition: dataoutput.hh:366
int writeCalls() const
return write calls
Definition: dataoutput.hh:425
DataOutput(const GridType &grid, OutPutDataType &data, const TimeProviderBase &tp, std::unique_ptr< const DataOutputParameters > parameters)
Constructor creating data writer.
Definition: dataoutput.hh:313
GridImp GridType
type of grid used
Definition: dataoutput.hh:279
void writeData(double sequenceStamp) const
write data with a given sequence stamp
Definition: dataoutput.hh:401
void write(const std::string &outstring) const
write given data to disc, evaluates parameter savecount
Definition: dataoutput.hh:358
void grapeDisplay(OutputTupleType &data) const
display data with grape
Definition: dataoutput.hh:945
virtual void display() const
display data with grape
Definition: dataoutput.hh:467
DataImp OutPutDataType
type of data tuple
Definition: dataoutput.hh:281
int writeStep() const
return write step
Definition: dataoutput.hh:419
void writeData(double sequenceStamp, const std::string &outstring) const
write data with a given sequence stamp and outstring
Definition: dataoutput.hh:797
virtual bool willWrite(const TimeProviderBase &tp) const
returns true if data will be written on next write call
Definition: dataoutput.hh:338
double saveTime() const
return save time
Definition: dataoutput.hh:431
void write(const TimeProviderBase &tp, const std::string &outstring) const
write given data to disc, evaluates parameter savecount and savestep
Definition: dataoutput.hh:377
virtual bool willWrite() const
returns true if data will be written on next write call
Definition: dataoutput.hh:350
virtual const char * myClassName() const
print class name
Definition: dataoutput.hh:407
virtual void writeBinaryData(const double) const
write binary data
Definition: dataoutput.hh:461
DataOutput(const GridType &grid, OutPutDataType &data, const DataOutputParameters ¶meter)
Constructor creating data output class.
Definition: dataoutput.hh:298
const GridType & grid_
type of this class
Definition: dataoutput.hh:478
DataOutput(const GridType &grid, OutPutDataType &data, std::unique_ptr< const DataOutputParameters > parameters)
Constructor creating data output class.
Definition: dataoutput.hh:714
void write(const TimeProviderBase &tp) const
write given data to disc, evaluates parameter savecount and savestep
Definition: dataoutput.hh:387
A vector valued function space.
Definition: functionspace.hh:60
IOInterface to write data to hard disk.
Definition: iointerface.hh:156
static void createGlobalPath(const CommunicatorType &comm, const std::string &path)
create global path for data output
Definition: iointerface.hh:262
static bool verbose()
obtain the cached value for fem.verbose with default verbosity level 2
Definition: parameter.hh:466
general base for time providers
Definition: timeprovider.hh:36
double time() const
obtain the current time
Definition: timeprovider.hh:94
Default exception for dummy implementations.
Definition: exceptions.hh:263
@ conforming
Output conforming data.
Definition: common.hh:73
typename Impl::voider< Types... >::type void_t
Is void for all valid input types. The workhorse for C++11 SFINAE-techniques.
Definition: typetraits.hh:40
static void interpolate(const GridFunction &u, DiscreteFunction &v)
perform native interpolation of a discrete function space
Definition: interpolate.hh:54
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
constexpr GeometryType none(unsigned int dim)
Returns a GeometryType representing a singular of dimension dim.
Definition: type.hh:471
constexpr void forEach(Range &&range, F &&f)
Range based for loop.
Definition: hybridutilities.hh:256
Dune namespace.
Definition: alignedallocator.hh:13
Parameter class for Dune::Fem::DataOutput.
Definition: dataoutput.hh:73
virtual int outputformat() const
format of output (fem.io.outputformat)
Definition: dataoutput.hh:109
virtual int savecount() const
save data every savecount calls to write method (fem.io.savecount)
Definition: dataoutput.hh:139
virtual int subsamplingLevel() const
save data every subsamplingLevel (fem.io.subsamplinglevel)
Definition: dataoutput.hh:145
virtual int startcounter() const
number for first data file (no parameter available)
Definition: dataoutput.hh:151
virtual int startcall() const
number of first call (no parameter available)
Definition: dataoutput.hh:157
virtual double startsavetime() const
value of first save time (no parameter available)
Definition: dataoutput.hh:163
virtual bool willWrite(bool write) const
Definition: dataoutput.hh:170
virtual std::string prefix() const
base of file name for data file (fem.io.datafileprefix)
Definition: dataoutput.hh:103
virtual std::string path() const
path where the data is stored (always relative to fem.prefix)
Definition: dataoutput.hh:88
virtual double savestep() const
save data every savestep interval (fem.io.savestep)
Definition: dataoutput.hh:133
virtual bool writeMode() const
Definition: dataoutput.hh:177
virtual bool grapedisplay() const
use online grape display (fem.io.grapedisplay)
Definition: dataoutput.hh:123
Helper class for tagging priorities.
Definition: typeutilities.hh:87
Helper class for tagging priorities.
Definition: typeutilities.hh:73
Utilities for type computations, constraining overloads, ...