fvbaseproblem.hh
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3/*
4 This file is part of the Open Porous Media project (OPM).
5
6 OPM is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 2 of the License, or
9 (at your option) any later version.
10
11 OPM is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with OPM. If not, see <http://www.gnu.org/licenses/>.
18
19 Consult the COPYING file in the top-level source directory of this
20 module for the precise wording of the license and the list of
21 copyright holders.
22*/
28#ifndef EWOMS_FV_BASE_PROBLEM_HH
29#define EWOMS_FV_BASE_PROBLEM_HH
30
33
37
38#include <dune/common/fvector.hh>
39
40#include <iostream>
41#include <limits>
42#include <string>
43
44#include <sys/stat.h>
45
46namespace Opm::Properties {
47
48template <class TypeTag, class MyTypeTag>
49struct NewtonMethod;
50
51} // namespace Opm::Properties
52
53namespace Opm {
54
64template<class TypeTag>
66{
67private:
68 using Implementation = GetPropType<TypeTag, Properties::Problem>;
70
71 static const int vtkOutputFormat = getPropValue<TypeTag, Properties::VtkOutputFormat>();
73
79
82
87
88 enum {
89 dim = GridView::dimension,
90 dimWorld = GridView::dimensionworld
91 };
92
93 using Element = typename GridView::template Codim<0>::Entity;
94 using Vertex = typename GridView::template Codim<dim>::Entity;
95 using VertexIterator = typename GridView::template Codim<dim>::Iterator;
96
97 using CoordScalar = typename GridView::Grid::ctype;
98 using GlobalPosition = Dune::FieldVector<CoordScalar, dimWorld>;
99
100public:
101 // the default restriction and prolongation for adaptation is simply an empty one
103
104private:
105 // copying a problem is not a good idea
106 FvBaseProblem(const FvBaseProblem& ) = delete;
107
108public:
117 : nextTimeStepSize_(0.0)
118 , gridView_(simulator.gridView())
119 , elementMapper_(gridView_, Dune::mcmgElementLayout())
120 , vertexMapper_(gridView_, Dune::mcmgVertexLayout())
121 , boundingBoxMin_(std::numeric_limits<double>::max())
122 , boundingBoxMax_(-std::numeric_limits<double>::max())
123 , simulator_(simulator)
124 , defaultVtkWriter_(0)
125 {
126 // calculate the bounding box of the local partition of the grid view
127 VertexIterator vIt = gridView_.template begin<dim>();
128 const VertexIterator vEndIt = gridView_.template end<dim>();
129 for (; vIt!=vEndIt; ++vIt) {
130 for (unsigned i=0; i<dim; i++) {
131 boundingBoxMin_[i] = std::min(boundingBoxMin_[i], vIt->geometry().corner(0)[i]);
132 boundingBoxMax_[i] = std::max(boundingBoxMax_[i], vIt->geometry().corner(0)[i]);
133 }
134 }
135
136 // communicate to get the bounding box of the whole domain
137 for (unsigned i = 0; i < dim; ++i) {
138 boundingBoxMin_[i] = gridView_.comm().min(boundingBoxMin_[i]);
139 boundingBoxMax_[i] = gridView_.comm().max(boundingBoxMax_[i]);
140 }
141
142 if (enableVtkOutput_()) {
143 bool asyncVtkOutput =
144 simulator_.gridView().comm().size() == 1 &&
145 Parameters::Get<Parameters::EnableAsyncVtkOutput>();
146
147 // asynchonous VTK output currently does not work in conjunction with grid
148 // adaptivity because the async-IO code assumes that the grid stays
149 // constant. complain about that case.
150 bool enableGridAdaptation = Parameters::Get<Parameters::EnableGridAdaptation>();
151 if (asyncVtkOutput && enableGridAdaptation)
152 throw std::runtime_error("Asynchronous VTK output currently cannot be used "
153 "at the same time as grid adaptivity");
154
155 std::string outputDir = asImp_().outputDir();
156
157 defaultVtkWriter_ =
158 new VtkMultiWriter(asyncVtkOutput, gridView_, outputDir, asImp_().name());
159 }
160 }
161
163 { delete defaultVtkWriter_; }
164
169 static void registerParameters()
170 {
171 Model::registerParameters();
172 Parameters::Register<Parameters::MaxTimeStepSize<Scalar>>
173 ("The maximum size to which all time steps are limited to [s]");
174 Parameters::Register<Parameters::MinTimeStepSize<Scalar>>
175 ("The minimum size to which all time steps are limited to [s]");
176 Parameters::Register<Parameters::MaxTimeStepDivisions>
177 ("The maximum number of divisions by two of the timestep size "
178 "before the simulation bails out");
179 Parameters::Register<Parameters::EnableAsyncVtkOutput>
180 ("Dispatch a separate thread to write the VTK output");
181 Parameters::Register<Parameters::ContinueOnConvergenceError>
182 ("Continue with a non-converged solution instead of giving up "
183 "if we encounter a time step size smaller than the minimum time "
184 "step size.");
185 }
186
195 { return true; }
196
205 std::string outputDir() const
206 {
207 std::string outputDir = Parameters::Get<Parameters::OutputDir>();
208
209 if (outputDir.empty())
210 outputDir = ".";
211
212 // TODO: replace this by std::filesystem once we require c++-2017
213 struct stat st;
214 if (::stat(outputDir.c_str(), &st) != 0)
215 throw std::runtime_error("Could not access output directory '"+outputDir+"':"
216 +strerror(errno));
217 if (!S_ISDIR(st.st_mode))
218 throw std::runtime_error("Path to output directory '"+outputDir+"' exists but is not a directory");
219
220 if (access(outputDir.c_str(), W_OK) != 0)
221 throw std::runtime_error("Output directory '"+outputDir+"' exists but is not writeable");
222
223 return outputDir;
224 }
225
232 static std::string helpPreamble(int,
233 const char **argv)
234 {
235 std::string desc = Implementation::briefDescription();
236 if (!desc.empty())
237 desc = desc + "\n";
238
239 return
240 "Usage: "+std::string(argv[0]) + " [OPTIONS]\n"
241 + desc;
242 }
243
250 static std::string briefDescription()
251 { return ""; }
252
253 // TODO (?): detailedDescription()
254
271 static int handlePositionalParameter(std::set<std::string>&,
272 std::string& errorMsg,
273 int,
274 const char** argv,
275 int paramIdx,
276 int)
277 {
278 errorMsg = std::string("Illegal parameter \"")+argv[paramIdx]+"\".";
279 return 0;
280 }
281
288 { }
289
294 void prefetch(const Element&) const
295 {
296 // do nothing by default
297 }
298
303 {
304#if DUNE_VERSION_NEWER(DUNE_GRID, 2, 8)
305 elementMapper_.update(gridView_);
306 vertexMapper_.update(gridView_);
307#else
308 elementMapper_.update();
309 vertexMapper_.update();
310#endif
311
312 if (enableVtkOutput_())
313 defaultVtkWriter_->gridChanged();
314 }
315
325 template <class Context>
326 void boundary(BoundaryRateVector&,
327 const Context&,
328 unsigned,
329 unsigned) const
330 { throw std::logic_error("Problem does not provide a boundary() method"); }
331
342 template <class Context>
343 void constraints(Constraints&,
344 const Context&,
345 unsigned,
346 unsigned) const
347 { throw std::logic_error("Problem does not provide a constraints() method"); }
348
361 template <class Context>
362 void source(RateVector&,
363 const Context&,
364 unsigned,
365 unsigned) const
366 { throw std::logic_error("Problem does not provide a source() method"); }
367
378 template <class Context>
379 void initial(PrimaryVariables&,
380 const Context&,
381 unsigned,
382 unsigned) const
383 { throw std::logic_error("Problem does not provide a initial() method"); }
384
400 template <class Context>
401 Scalar extrusionFactor(const Context&,
402 unsigned,
403 unsigned) const
404 { return asImp_().extrusionFactor(); }
405
406 Scalar extrusionFactor() const
407 { return 1.0; }
408
414 {}
415
420 { }
421
426 { }
427
432 { }
433
438 { }
439
447 { }
448
455 {
456 std::cerr << "The end of episode " << simulator().episodeIndex() + 1 << " has been "
457 << "reached, but the problem does not override the endEpisode() method. "
458 << "Doing nothing!\n";
459 }
460
464 void finalize()
465 {
466 const auto& executionTimer = simulator().executionTimer();
467
468 Scalar executionTime = executionTimer.realTimeElapsed();
469 Scalar setupTime = simulator().setupTimer().realTimeElapsed();
470 Scalar prePostProcessTime = simulator().prePostProcessTimer().realTimeElapsed();
471 Scalar localCpuTime = executionTimer.cpuTimeElapsed();
472 Scalar globalCpuTime = executionTimer.globalCpuTimeElapsed();
473 Scalar writeTime = simulator().writeTimer().realTimeElapsed();
474 Scalar linearizeTime = simulator().linearizeTimer().realTimeElapsed();
475 Scalar solveTime = simulator().solveTimer().realTimeElapsed();
476 Scalar updateTime = simulator().updateTimer().realTimeElapsed();
477 unsigned numProcesses = static_cast<unsigned>(this->gridView().comm().size());
478 unsigned threadsPerProcess = ThreadManager::maxThreads();
479 if (gridView().comm().rank() == 0) {
480 std::cout << std::setprecision(3)
481 << "Simulation of problem '" << asImp_().name() << "' finished.\n"
482 << "\n"
483 << "------------------------ Timing ------------------------\n"
484 << "Setup time: " << setupTime << " seconds" << Simulator::humanReadableTime(setupTime)
485 << ", " << setupTime/(executionTime + setupTime)*100 << "%\n"
486 << "Simulation time: " << executionTime << " seconds" << Simulator::humanReadableTime(executionTime)
487 << ", " << executionTime/(executionTime + setupTime)*100 << "%\n"
488 << " Linearization time: " << linearizeTime << " seconds" << Simulator::humanReadableTime(linearizeTime)
489 << ", " << linearizeTime/executionTime*100 << "%\n"
490 << " Linear solve time: " << solveTime << " seconds" << Simulator::humanReadableTime(solveTime)
491 << ", " << solveTime/executionTime*100 << "%\n"
492 << " Newton update time: " << updateTime << " seconds" << Simulator::humanReadableTime(updateTime)
493 << ", " << updateTime/executionTime*100 << "%\n"
494 << " Pre/postprocess time: " << prePostProcessTime << " seconds" << Simulator::humanReadableTime(prePostProcessTime)
495 << ", " << prePostProcessTime/executionTime*100 << "%\n"
496 << " Output write time: " << writeTime << " seconds" << Simulator::humanReadableTime(writeTime)
497 << ", " << writeTime/executionTime*100 << "%\n"
498 << "First process' simulation CPU time: " << localCpuTime << " seconds" << Simulator::humanReadableTime(localCpuTime) << "\n"
499 << "Number of processes: " << numProcesses << "\n"
500 << "Threads per processes: " << threadsPerProcess << "\n"
501 << "Total CPU time: " << globalCpuTime << " seconds" << Simulator::humanReadableTime(globalCpuTime) << "\n"
502 << "\n"
503 << "----------------------------------------------------------------\n"
504 << std::endl;
505 }
506 }
507
513 {
514 unsigned maxFails = asImp_().maxTimeIntegrationFailures();
515 Scalar minTimeStepSize = asImp_().minTimeStepSize();
516
517 std::string errorMessage;
518 for (unsigned i = 0; i < maxFails; ++i) {
519 bool converged = model().update();
520 if (converged)
521 return;
522
523 Scalar dt = simulator().timeStepSize();
524 Scalar nextDt = dt / 2.0;
525 if (dt < minTimeStepSize*(1 + 1e-9)) {
526 if (asImp_().continueOnConvergenceError()) {
527 if (gridView().comm().rank() == 0)
528 std::cout << "Newton solver did not converge with minimum time step of "
529 << dt << " seconds. Continuing with unconverged solution!\n"
530 << std::flush;
531 return;
532 }
533 else {
534 errorMessage =
535 "Time integration did not succeed with the minumum time step size of "
536 + std::to_string(double(minTimeStepSize)) + " seconds. Giving up!";
537 break; // give up: we can't make the time step smaller anymore!
538 }
539 }
540 else if (nextDt < minTimeStepSize)
541 nextDt = minTimeStepSize;
542 simulator().setTimeStepSize(nextDt);
543
544 // update failed
545 if (gridView().comm().rank() == 0)
546 std::cout << "Newton solver did not converge with "
547 << "dt=" << dt << " seconds. Retrying with time step of "
548 << nextDt << " seconds\n" << std::flush;
549 }
550
551 if (errorMessage.empty())
552 errorMessage =
553 "Newton solver didn't converge after "
554 +std::to_string(maxFails)+" time-step divisions. dt="
555 +std::to_string(double(simulator().timeStepSize()));
556 throw std::runtime_error(errorMessage);
557 }
558
562 Scalar minTimeStepSize() const
563 { return Parameters::Get<Parameters::MinTimeStepSize<Scalar>>(); }
564
570 { return Parameters::Get<Parameters::MaxTimeStepDivisions>(); }
571
578 { return Parameters::Get<Parameters::ContinueOnConvergenceError>(); }
579
583 void setNextTimeStepSize(Scalar dt)
584 { nextTimeStepSize_ = dt; }
585
591 Scalar nextTimeStepSize() const
592 {
593 if (nextTimeStepSize_ > 0.0)
594 return nextTimeStepSize_;
595
596 Scalar dtNext = std::min(Parameters::Get<Parameters::MaxTimeStepSize<Scalar>>(),
597 newtonMethod().suggestTimeStepSize(simulator().timeStepSize()));
598
599 if (dtNext < simulator().maxTimeStepSize()
600 && simulator().maxTimeStepSize() < dtNext*2)
601 {
602 dtNext = simulator().maxTimeStepSize()/2 * 1.01;
603 }
604
605 return dtNext;
606 }
607
617 {
618 return simulator().timeStepIndex() > 0 &&
619 (simulator().timeStepIndex() % 10 == 0);
620 }
621
630 bool shouldWriteOutput() const
631 { return true; }
632
639 { model().advanceTimeLevel(); }
640
648 std::string name() const
649 { return "sim"; }
650
654 const GridView& gridView() const
655 { return gridView_; }
656
661 const GlobalPosition& boundingBoxMin() const
662 { return boundingBoxMin_; }
663
668 const GlobalPosition& boundingBoxMax() const
669 { return boundingBoxMax_; }
670
674 const VertexMapper& vertexMapper() const
675 { return vertexMapper_; }
676
680 const ElementMapper& elementMapper() const
681 { return elementMapper_; }
682
686 Simulator& simulator()
687 { return simulator_; }
688
692 const Simulator& simulator() const
693 { return simulator_; }
694
698 Model& model()
699 { return simulator_.model(); }
700
704 const Model& model() const
705 { return simulator_.model(); }
706
710 NewtonMethod& newtonMethod()
711 { return model().newtonMethod(); }
712
716 const NewtonMethod& newtonMethod() const
717 { return model().newtonMethod(); }
718 // \}
719
725 {
727 }
728
737 {
738 return 0;
739 }
740
754 template <class Restarter>
755 void serialize(Restarter& res)
756 {
757 if (enableVtkOutput_())
758 defaultVtkWriter_->serialize(res);
759 }
760
771 template <class Restarter>
772 void deserialize(Restarter& res)
773 {
774 if (enableVtkOutput_())
775 defaultVtkWriter_->deserialize(res);
776 }
777
784 void writeOutput(bool verbose = true)
785 {
786 if (!enableVtkOutput_())
787 return;
788
789 if (verbose && gridView().comm().rank() == 0)
790 std::cout << "Writing visualization results for the current time step.\n"
791 << std::flush;
792
793 // calculate the time _after_ the time was updated
794 Scalar t = simulator().time() + simulator().timeStepSize();
795
796 defaultVtkWriter_->beginWrite(t);
797 model().prepareOutputFields();
798 model().appendOutputFields(*defaultVtkWriter_);
799 defaultVtkWriter_->endWrite();
800
801 }
802
808 { return defaultVtkWriter_; }
809
810protected:
812
813private:
814 bool enableVtkOutput_() const
815 { return Parameters::Get<Parameters::EnableVtkOutput>(); }
816
818 Implementation& asImp_()
819 { return *static_cast<Implementation *>(this); }
820
822 const Implementation& asImp_() const
823 { return *static_cast<const Implementation *>(this); }
824
825 // Grid management stuff
826 const GridView gridView_;
827 ElementMapper elementMapper_;
828 VertexMapper vertexMapper_;
829 GlobalPosition boundingBoxMin_;
830 GlobalPosition boundingBoxMax_;
831
832 // Attributes required for the actual simulation
833 Simulator& simulator_;
834 mutable VtkMultiWriter *defaultVtkWriter_;
835};
836
837} // namespace Opm
838
839#endif
Definition: restrictprolong.hh:142
Base class for all problems which use a finite volume spatial discretization.
Definition: fvbaseproblem.hh:66
std::string name() const
The problem name.
Definition: fvbaseproblem.hh:648
const Simulator & simulator() const
Returns Simulator object used by the simulation.
Definition: fvbaseproblem.hh:692
void writeOutput(bool verbose=true)
Write the relevant secondary variables of the current solution into an VTK output file.
Definition: fvbaseproblem.hh:784
void boundary(BoundaryRateVector &, const Context &, unsigned, unsigned) const
Evaluate the boundary conditions for a boundary segment.
Definition: fvbaseproblem.hh:326
void finalize()
Called after the simulation has been run sucessfully.
Definition: fvbaseproblem.hh:464
Simulator & simulator()
Returns Simulator object used by the simulation.
Definition: fvbaseproblem.hh:686
const Model & model() const
Returns numerical model used for the problem.
Definition: fvbaseproblem.hh:704
static void registerParameters()
Registers all available parameters for the problem and the model.
Definition: fvbaseproblem.hh:169
void source(RateVector &, const Context &, unsigned, unsigned) const
Evaluate the source term for all phases within a given sub-control-volume.
Definition: fvbaseproblem.hh:362
bool recycleFirstIterationStorage() const
Return if the storage term of the first iteration is identical to the storage term for the solution o...
Definition: fvbaseproblem.hh:194
unsigned maxTimeIntegrationFailures() const
Returns the maximum number of subsequent failures for the time integration before giving up.
Definition: fvbaseproblem.hh:569
unsigned markForGridAdaptation()
Mark grid cells for refinement or coarsening.
Definition: fvbaseproblem.hh:736
void serialize(Restarter &res)
This method writes the complete state of the problem to the harddisk.
Definition: fvbaseproblem.hh:755
void beginIteration()
Called by the simulator before each Newton-Raphson iteration.
Definition: fvbaseproblem.hh:431
~FvBaseProblem()
Definition: fvbaseproblem.hh:162
void endTimeStep()
Called by the simulator after each time integration.
Definition: fvbaseproblem.hh:446
FvBaseProblem(Simulator &simulator)
Definition: fvbaseproblem.hh:116
const GlobalPosition & boundingBoxMax() const
The coordinate of the corner of the GridView's bounding box with the largest values.
Definition: fvbaseproblem.hh:668
RestrictProlongOperator restrictProlongOperator()
return restriction and prolongation operator
Definition: fvbaseproblem.hh:724
void timeIntegration()
Called by Opm::Simulator in order to do a time integration on the model.
Definition: fvbaseproblem.hh:512
Model & model()
Returns numerical model used for the problem.
Definition: fvbaseproblem.hh:698
Scalar extrusionFactor() const
Definition: fvbaseproblem.hh:406
void endEpisode()
Called when the end of an simulation episode is reached.
Definition: fvbaseproblem.hh:454
void beginTimeStep()
Called by the simulator before each time integration.
Definition: fvbaseproblem.hh:425
static std::string helpPreamble(int, const char **argv)
Returns the string that is printed before the list of command line parameters in the help message.
Definition: fvbaseproblem.hh:232
void deserialize(Restarter &res)
This method restores the complete state of the problem from disk.
Definition: fvbaseproblem.hh:772
void prefetch(const Element &) const
Allows to improve the performance by prefetching all data which is associated with a given element.
Definition: fvbaseproblem.hh:294
Scalar extrusionFactor(const Context &, unsigned, unsigned) const
Return how much the domain is extruded at a given sub-control volume.
Definition: fvbaseproblem.hh:401
bool shouldWriteRestartFile() const
Returns true if a restart file should be written to disk.
Definition: fvbaseproblem.hh:616
Scalar nextTimeStepSize() const
Called by Opm::Simulator whenever a solution for a time step has been computed and the simulation tim...
Definition: fvbaseproblem.hh:591
Scalar minTimeStepSize() const
Returns the minimum allowable size of a time step.
Definition: fvbaseproblem.hh:562
static int handlePositionalParameter(std::set< std::string > &, std::string &errorMsg, int, const char **argv, int paramIdx, int)
Handles positional command line parameters.
Definition: fvbaseproblem.hh:271
void beginEpisode()
Called at the beginning of an simulation episode.
Definition: fvbaseproblem.hh:419
void initial(PrimaryVariables &, const Context &, unsigned, unsigned) const
Evaluate the initial value for a control volume.
Definition: fvbaseproblem.hh:379
std::string outputDir() const
Determine the directory for simulation output.
Definition: fvbaseproblem.hh:205
Scalar nextTimeStepSize_
Definition: fvbaseproblem.hh:811
const VertexMapper & vertexMapper() const
Returns the mapper for vertices to indices.
Definition: fvbaseproblem.hh:674
void gridChanged()
Handle changes of the grid.
Definition: fvbaseproblem.hh:302
const GlobalPosition & boundingBoxMin() const
The coordinate of the corner of the GridView's bounding box with the smallest values.
Definition: fvbaseproblem.hh:661
static std::string briefDescription()
Returns a human readable description of the problem for the help message.
Definition: fvbaseproblem.hh:250
void endIteration()
Called by the simulator after each Newton-Raphson update.
Definition: fvbaseproblem.hh:437
void setNextTimeStepSize(Scalar dt)
Impose the next time step size to be used externally.
Definition: fvbaseproblem.hh:583
bool continueOnConvergenceError() const
Returns if we should continue with a non-converged solution instead of giving up if we encounter a ti...
Definition: fvbaseproblem.hh:577
void constraints(Constraints &, const Context &, unsigned, unsigned) const
Evaluate the constraints for a control volume.
Definition: fvbaseproblem.hh:343
void finishInit()
Called by the Opm::Simulator in order to initialize the problem.
Definition: fvbaseproblem.hh:287
const NewtonMethod & newtonMethod() const
Returns object which implements the Newton method.
Definition: fvbaseproblem.hh:716
const GridView & gridView() const
The GridView which used by the problem.
Definition: fvbaseproblem.hh:654
EmptyRestrictProlong RestrictProlongOperator
Definition: fvbaseproblem.hh:102
NewtonMethod & newtonMethod()
Returns object which implements the Newton method.
Definition: fvbaseproblem.hh:710
bool shouldWriteOutput() const
Returns true if the current solution should be written to disk (i.e. as a VTK file)
Definition: fvbaseproblem.hh:630
void initialSolutionApplied()
Callback used by the model to indicate that the initial solution has been determined for all degrees ...
Definition: fvbaseproblem.hh:413
void advanceTimeLevel()
Called by the simulator after everything which can be done about the current time step is finished an...
Definition: fvbaseproblem.hh:638
VtkMultiWriter & defaultVtkWriter() const
Method to retrieve the VTK writer which should be used to write the default ouput after each time ste...
Definition: fvbaseproblem.hh:807
const ElementMapper & elementMapper() const
Returns the mapper for elements to indices.
Definition: fvbaseproblem.hh:680
static std::string humanReadableTime(Scalar timeInSeconds, bool isAmendment=true)
Given a time step size in seconds, return it in a format which is more easily parsable by humans.
Definition: simulator.hh:822
static unsigned maxThreads()
Return the maximum number of threads of the current process.
Definition: threadmanager.hh:118
Simplifies writing multi-file VTK datasets.
Definition: vtkmultiwriter.hh:66
void endWrite(bool onlyDiscard=false)
Finalizes the current writer.
Definition: vtkmultiwriter.hh:389
void deserialize(Restarter &res)
Read the multi-writer's state from a restart file.
Definition: vtkmultiwriter.hh:442
void gridChanged()
Updates the internal data structures after mesh refinement.
Definition: vtkmultiwriter.hh:165
void beginWrite(double t)
Called whenever a new time step must be written.
Definition: vtkmultiwriter.hh:179
void serialize(Restarter &res)
Write the multi-writer's state to a restart file.
Definition: vtkmultiwriter.hh:408
Declare the properties used by the infrastructure code of the finite volume discretizations.
Declare the properties used by the infrastructure code of the finite volume discretizations.
auto Get(bool errorIfNotRegistered=true)
Retrieve a runtime parameter.
Definition: parametersystem.hh:840
Definition: fvbaseprimaryvariables.hh:141
Definition: blackoilmodel.hh:72
Definition: blackoilboundaryratevector.hh:37
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(....
Definition: propertysystem.hh:235
Specify the maximum size of a time integration [s].
Definition: fvbaseparameters.hh:106