1#ifndef DUNE_FEM_DATAOUTPUT_HH
2#define DUNE_FEM_DATAOUTPUT_HH
15#define USE_VTKWRITER 1
18#include <dune/common/hybridutilities.hh>
19#include <dune/common/typeutilities.hh>
36#ifndef ENABLE_VTXPROJECTION
37#define ENABLE_VTXPROJECTION 1
42#if ENABLE_VTXPROJECTION
48#define USE_GRAPE HAVE_GRAPE
52#include <dune/grid/io/visual/grapedatadisplay.hh>
71 :
public LocalParameter< DataOutputParameters, DataOutputParameters >
88 virtual std::string
path()
const
95 std::string absPath =
parameter().
getValue< std::string >(
"fem.prefix",
"." ) +
"/";
96 const std::string relPath =
path();
111 static const std::string formatTable[]
112 = {
"vtk-cell",
"vtk-vertex",
"sub-vtk-cell",
"binary" ,
"gnuplot" ,
"none" };
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 +
"\"/>" );
343 const double saveTimeEps = 2*std::numeric_limits< double >::epsilon()*
saveTime_;
358 void write(
const std::string& outstring )
const
396 void writeData (
double sequenceStamp,
const std::string &outstring )
const;
413 const std::string &
path ()
const
439 static constexpr bool isNotEmpty = std::tuple_size< DataImp >::value > 0;
440 return getGridPart( std::integral_constant< bool, isNotEmpty > () );
451 return std::get< 0 >(
data_ )->gridPart();
455 std::string writeVTKOutput ()
const;
463 DUNE_THROW(NotImplemented,
"Format 'binary' not supported by DataOutput, use DataWriter instead." );
474 template<
class OutputTupleType >
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;
518 typedef typename DFType::FunctionSpaceType FunctionSpaceType;
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;
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 >
586 void forEach (
const T& data )
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 >
636 void forEach (
const T& data )
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 ));
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 >
700 void forEach (
const T& data )
702 std::tuple< T > tup( data );
712 template<
class Gr
idImp,
class DataImp >
713 inline DataOutput< GridImp, 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();
732 IOInterface :: createGlobalPath (
grid_.comm(),
path_ );
737 auto outputFormat =
param_->outputformat();
738 switch( outputFormat )
747 DUNE_THROW(NotImplemented,
"DataOutput::init: wrong output format");
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();
815 DUNE_THROW(NotImplemented,
"DataOutput::write: VTKWriter was disabled by USE_VTKWRITER 0");
817 case gnuplot : filename = writeGnuPlotOutput();
break;
819 DUNE_THROW(NotImplemented,
"DataOutput::write: wrong output format = " << outputFormat_);
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 >
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 ) )
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_);
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;
960 inline static auto makeSingleIOTuple ( DF &&df, PriorityTag< 1 > )
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 );
968 inline static auto makeSingleIOTuple ( DF &&df, PriorityTag< 0 > )
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 > >
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 )... );
1070 template<
class Grid,
class... Args, std::enable_if_t<
Std::And( Impl::ValidDataOutputArgument< Args >::value... ),
int > = 0 >
1073 auto ioTuple = Impl::makeIOTuple( std::forward< Args >( args )... );
1074 auto parameters = Impl::getDataOutputParameters( std::forward< Args >( args )... );
static void interpolate(const GridFunction &u, DiscreteFunction &v)
perform native interpolation of a discrete function space
Definition: common/interpolate.hh:54
Definition: bindguard.hh:11
static auto dataOutput(const Grid &grid, Args &&... args)
Definition: dataoutput.hh:1063
typename Impl::ConstLocalFunction< GridFunction >::Type ConstLocalFunction
Definition: const.hh:604
BasicParameterReader< std::function< const std::string *(const std::string &, const std::string *) > > ParameterReader
Definition: reader.hh:315
std::string generateFilename(const std::string &fn, int ntime, int precision=6)
Definition: iointerface.hh:47
static void forEach(IndexRange< T, sz > range, F &&f)
Definition: hybrid.hh:129
static constexpr bool And()
Definition: utility.hh:125
Definition: adaptivefunction/adaptivefunction.hh:48
Lagrange discrete function space.
Definition: lagrange/space.hh:131
Parameter class for Dune::Fem::DataOutput.
Definition: dataoutput.hh:73
DataOutputParameters(const ParameterReader ¶meter=Parameter::container())
Definition: dataoutput.hh:83
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
DataOutputParameters(std::string keyPrefix, const ParameterReader ¶meter=Parameter::container())
Definition: dataoutput.hh:79
ParameterReader parameter_
Definition: dataoutput.hh:76
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 bool conformingoutput() const
Definition: dataoutput.hh:117
const ParameterReader & parameter() const noexcept
Definition: dataoutput.hh:182
virtual std::string prefix() const
base of file name for data file (fem.io.datafileprefix)
Definition: dataoutput.hh:103
virtual std::string absolutePath() const
Definition: dataoutput.hh:93
virtual std::string path() const
path where the data is stored (always relative to fem.prefix)
Definition: dataoutput.hh:88
const std::string keyPrefix_
Definition: dataoutput.hh:75
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
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
int writeCalls_
Definition: dataoutput.hh:490
const std::string & path() const
return output path name
Definition: dataoutput.hh:413
int writeStep_
Definition: dataoutput.hh:488
DataOutput(const GridType &grid, OutPutDataType &data, const ParameterReader ¶meter=Parameter::container())
Definition: dataoutput.hh:302
void write() const
write given data to disc, evaluates parameter savecount
Definition: dataoutput.hh:366
double saveTime_
Definition: dataoutput.hh:492
int writeCalls() const
return write calls
Definition: dataoutput.hh:425
DataOutput(const GridType &grid, OutPutDataType &data, const TimeProviderBase &tp, const ParameterReader ¶meter=Parameter::container())
Definition: dataoutput.hh:330
DataOutput(const GridType &grid, OutPutDataType &data, const TimeProviderBase &tp, std::unique_ptr< const DataOutputParameters > parameters)
Constructor creating data writer.
Definition: dataoutput.hh:313
auto getGridPart(std::integral_constant< bool, true >) const
Definition: dataoutput.hh:449
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
double saveStep_
Definition: dataoutput.hh:494
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
OutputFormat
Definition: dataoutput.hh:276
@ none
Definition: dataoutput.hh:276
@ vtkvtx
Definition: dataoutput.hh:276
@ gnuplot
Definition: dataoutput.hh:276
@ subvtk
Definition: dataoutput.hh:276
@ vtk
Definition: dataoutput.hh:276
@ binary
Definition: dataoutput.hh:276
std::unique_ptr< const DataOutputParameters > param_
Definition: dataoutput.hh:502
virtual void display() const
display data with grape
Definition: dataoutput.hh:467
std::string path_
Definition: dataoutput.hh:482
DataImp OutPutDataType
type of data tuple
Definition: dataoutput.hh:281
bool conformingOutput_
Definition: dataoutput.hh:499
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
bool grapeDisplay_
Definition: dataoutput.hh:485
OutputFormat outputFormat_
Definition: dataoutput.hh:498
double saveTime() const
return save time
Definition: dataoutput.hh:431
std::unique_ptr< PVDWriter > pvd_
Definition: dataoutput.hh:501
std::string writeGnuPlotOutput() const
Definition: dataoutput.hh:905
OutPutDataType data_
Definition: dataoutput.hh:479
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
std::unique_ptr< FileWriter > sequence_
Definition: dataoutput.hh:500
auto getGridPart(std::integral_constant< bool, false >) const
Definition: dataoutput.hh:443
int saveCount_
Definition: dataoutput.hh:496
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
void consistentSaveStep(const TimeProviderBase &tp) const
Definition: dataoutput.hh:780
auto getGridPart() const
Definition: dataoutput.hh:437
std::string datapref_
Definition: dataoutput.hh:483
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
IOInterface to write data to hard disk.
Definition: iointerface.hh:161
static void addToDisplay(Disp &disp, const DINFO *dinf, double time, Tuple &tuple)
Definition: iotuple.hh:269
static ParameterContainer & container()
Definition: io/parameter.hh:193
static bool verbose()
obtain the cached value for fem.verbose
Definition: io/parameter.hh:445
static void write(const std::string &filename, const std::string &fileextension="", bool writeAll=true)
write the parameter database to a file
Definition: io/parameter.hh:516
Definition: io/parameter.hh:551
int getEnum(const std::string &key, const std::string(&values)[n]) const
Definition: reader.hh:225
T getValue(const std::string &key) const
get mandatory parameter
Definition: reader.hh:159
static auto project(const Function &f, DiscreteFunction &u, Weight &weight) -> std::enable_if_t< std::is_void< decltype(interpolate(f, u, weight, u)) >::value >
Definition: vtxprojection.hh:212
general base for time providers
Definition: timeprovider.hh:36
double time() const
obtain the current time
Definition: timeprovider.hh:94