SimulatorFullyImplicitBlackoilOutput.hpp
Go to the documentation of this file.
1 /*
2  Copyright (c) 2014 SINTEF ICT, Applied Mathematics.
3  Copyright (c) 2015 IRIS AS
4 
5  This file is part of the Open Porous Media project (OPM).
6 
7  OPM is free software: you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation, either version 3 of the License, or
10  (at your option) any later version.
11 
12  OPM is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with OPM. If not, see <http://www.gnu.org/licenses/>.
19 */
20 #ifndef OPM_SIMULATORFULLYIMPLICITBLACKOILOUTPUT_HEADER_INCLUDED
21 #define OPM_SIMULATORFULLYIMPLICITBLACKOILOUTPUT_HEADER_INCLUDED
22 #include <opm/core/grid.h>
23 #include <opm/core/simulator/BlackoilState.hpp>
24 #include <opm/core/simulator/WellState.hpp>
25 #include <opm/core/utility/DataMap.hpp>
26 #include <opm/common/ErrorMacros.hpp>
27 #include <opm/core/utility/miscUtilities.hpp>
28 #include <opm/core/utility/parameters/ParameterGroup.hpp>
29 
30 #include <opm/core/io/OutputWriter.hpp>
31 #include <opm/core/io/eclipse/EclipseWriter.hpp>
32 
35 
37 
38 #include <string>
39 #include <sstream>
40 #include <iomanip>
41 #include <fstream>
42 
43 #include <boost/filesystem.hpp>
44 
45 #ifdef HAVE_DUNE_CORNERPOINT
46 #include <dune/grid/CpGrid.hpp>
47 #endif
48 namespace Opm
49 {
50 
51  void outputStateVtk(const UnstructuredGrid& grid,
52  const Opm::SimulatorState& state,
53  const int step,
54  const std::string& output_dir);
55 
56 
57  void outputStateMatlab(const UnstructuredGrid& grid,
58  const Opm::SimulatorState& state,
59  const int step,
60  const std::string& output_dir);
61 
62  void outputWellStateMatlab(const Opm::WellState& well_state,
63  const int step,
64  const std::string& output_dir);
65 #ifdef HAVE_DUNE_CORNERPOINT
66  void outputStateVtk(const Dune::CpGrid& grid,
67  const Opm::SimulatorState& state,
68  const int step,
69  const std::string& output_dir);
70 #endif
71 
72  template<class Grid>
73  void outputStateMatlab(const Grid& grid,
74  const Opm::SimulatorState& state,
75  const int step,
76  const std::string& output_dir)
77  {
78  Opm::DataMap dm;
79  dm["saturation"] = &state.saturation();
80  dm["pressure"] = &state.pressure();
81  for( unsigned int i=0; i<state.cellDataNames().size(); ++ i )
82  {
83  const std::string& name = state.cellDataNames()[ i ];
84  std::string key;
85  if( name == "SURFACEVOL" ) {
86  key = "surfvolume";
87  }
88  else if( name == "RV" ) {
89  key = "rv";
90  }
91  else if( name == "GASOILRATIO" ) {
92  key = "rs";
93  }
94  else { // otherwise skip entry
95  continue;
96  }
97  // set data to datmap
98  dm[ key ] = &state.cellData()[ i ];
99  }
100 
101  std::vector<double> cell_velocity;
102  Opm::estimateCellVelocity(AutoDiffGrid::numCells(grid),
103  AutoDiffGrid::numFaces(grid),
104  AutoDiffGrid::beginFaceCentroids(grid),
105  UgGridHelpers::faceCells(grid),
106  AutoDiffGrid::beginCellCentroids(grid),
107  AutoDiffGrid::beginCellVolumes(grid),
108  AutoDiffGrid::dimensions(grid),
109  state.faceflux(), cell_velocity);
110  dm["velocity"] = &cell_velocity;
111 
112  // Write data (not grid) in Matlab format
113  for (Opm::DataMap::const_iterator it = dm.begin(); it != dm.end(); ++it) {
114  std::ostringstream fname;
115  fname << output_dir << "/" << it->first;
116  boost::filesystem::path fpath = fname.str();
117  try {
118  create_directories(fpath);
119  }
120  catch (...) {
121  OPM_THROW(std::runtime_error, "Creating directories failed: " << fpath);
122  }
123  fname << "/" << std::setw(3) << std::setfill('0') << step << ".txt";
124  std::ofstream file(fname.str().c_str());
125  if (!file) {
126  OPM_THROW(std::runtime_error, "Failed to open " << fname.str());
127  }
128  file.precision(15);
129  const std::vector<double>& d = *(it->second);
130  std::copy(d.begin(), d.end(), std::ostream_iterator<double>(file, "\n"));
131  }
132  }
133 
135  template <class Grid>
136  class BlackoilVTKWriter : public OutputWriter
137  {
138  public:
139  // constructor taking grid and directory
140  BlackoilVTKWriter(const Grid& grid,
141  const std::string& outputDir)
142  : grid_( grid ),
143  outputDir_( outputDir )
144  {}
145 
147  void writeInit(const SimulatorTimerInterface& /* timer */)
148  {}
149 
151  void writeTimeStep(const SimulatorTimerInterface& timer,
152  const SimulatorState& state,
153  const WellState&,
154  bool /*substep*/ = false)
155  {
156  outputStateVtk(grid_, state, timer.currentStepNum(), outputDir_);
157  }
158 
159  protected:
160  const Grid& grid_;
161  const std::string outputDir_;
162  };
163 
165  template <class Grid>
166  class BlackoilMatlabWriter : public OutputWriter
167  {
168  public:
169  // constructor taking grid and directory
170  BlackoilMatlabWriter(const Grid& grid,
171  const std::string& outputDir)
172  : grid_( grid ),
173  outputDir_( outputDir )
174  {}
175 
177  void writeInit(const SimulatorTimerInterface& /* timer */)
178  {}
179 
181  void writeTimeStep(const SimulatorTimerInterface& timer,
182  const SimulatorState& reservoirState,
183  const WellState& wellState,
184  bool /*substep*/ = false)
185  {
186  outputStateMatlab(grid_, reservoirState, timer.currentStepNum(), outputDir_);
187  outputWellStateMatlab(wellState, timer.currentStepNum(), outputDir_);
188  }
189  protected:
190  const Grid& grid_;
191  const std::string outputDir_;
192  };
193 
195  class BlackoilOutputWriter : public OutputWriter
196  {
197  public:
198  // constructor creating different sub writers
199  template <class Grid>
200  BlackoilOutputWriter(const Grid& grid,
201  const parameter::ParameterGroup& param,
202  Opm::EclipseStateConstPtr eclipseState,
203  const Opm::PhaseUsage &phaseUsage,
204  const double* permeability );
205 
207  void writeInit(const SimulatorTimerInterface &timer);
208 
210  void writeTimeStep(const SimulatorTimerInterface& timer,
211  const SimulatorState& reservoirState,
212  const WellState& wellState,
213  bool substep = false);
214 
216  const std::string& outputDirectory() const { return outputDir_; }
217 
219  bool output () const { return output_; }
220 
221  void restore(SimulatorTimerInterface& timer,
222  BlackoilState& state,
224  const std::string& filename,
225  const int desiredReportStep);
226 
227  protected:
228  const bool output_;
229  std::unique_ptr< ParallelDebugOutputInterface > parallelOutput_;
230 
231  // Parameters for output.
232  const std::string outputDir_;
233  const int output_interval_;
234 
236 
237  std::ofstream backupfile_;
238  std::unique_ptr< OutputWriter > vtkWriter_;
239  std::unique_ptr< OutputWriter > matlabWriter_;
240  std::unique_ptr< EclipseWriter > eclWriter_;
241  };
242 
243 
245  //
246  // Implementation
247  //
249  template <class Grid>
250  inline
252  BlackoilOutputWriter(const Grid& grid,
253  const parameter::ParameterGroup& param,
254  Opm::EclipseStateConstPtr eclipseState,
255  const Opm::PhaseUsage &phaseUsage,
256  const double* permeability )
257  : output_( param.getDefault("output", true) ),
258  parallelOutput_( output_ ? new ParallelDebugOutput< Grid >( grid, eclipseState, phaseUsage.num_phases, permeability ) : 0 ),
259  outputDir_( output_ ? param.getDefault("output_dir", std::string("output")) : "." ),
260  output_interval_( output_ ? param.getDefault("output_interval", 1): 0 ),
261  lastBackupReportStep_( -1 ),
262  vtkWriter_( output_ && param.getDefault("output_vtk",false) ?
263  new BlackoilVTKWriter< Grid >( grid, outputDir_ ) : 0 ),
264  matlabWriter_( output_ && parallelOutput_->isIORank() &&
265  param.getDefault("output_matlab", false) ?
266  new BlackoilMatlabWriter< Grid >( grid, outputDir_ ) : 0 ),
267  eclWriter_( output_ && parallelOutput_->isIORank() &&
268  param.getDefault("output_ecl", true) ?
269  new EclipseWriter(param, eclipseState, phaseUsage,
270  parallelOutput_->numCells(),
271  parallelOutput_->globalCell() )
272  : 0 )
273  {
274  // For output.
275  if (output_ && parallelOutput_->isIORank() ) {
276  // Ensure that output dir exists
277  boost::filesystem::path fpath(outputDir_);
278  try {
279  create_directories(fpath);
280  }
281  catch (...) {
282  OPM_THROW(std::runtime_error, "Creating directories failed: " << fpath);
283  }
284 
285  std::string backupfilename = param.getDefault("backupfile", std::string("") );
286  if( ! backupfilename.empty() )
287  {
288  backupfile_.open( backupfilename.c_str() );
289  }
290  }
291  }
292 }
293 #endif
const bool output_
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:228
BlackoilOutputWriter(const Grid &grid, const parameter::ParameterGroup &param, Opm::EclipseStateConstPtr eclipseState, const Opm::PhaseUsage &phaseUsage, const double *permeability)
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:252
void writeTimeStep(const SimulatorTimerInterface &timer, const SimulatorState &reservoirState, const WellState &wellState, bool substep=false)
void writeInit(const SimulatorTimerInterface &)
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:147
const std::string outputDir_
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:232
void restore(SimulatorTimerInterface &timer, BlackoilState &state, WellStateFullyImplicitBlackoil &wellState, const std::string &filename, const int desiredReportStep)
Definition: AdditionalObjectDeleter.hpp:22
BlackoilVTKWriter(const Grid &grid, const std::string &outputDir)
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:140
std::unique_ptr< EclipseWriter > eclWriter_
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:240
std::unique_ptr< ParallelDebugOutputInterface > parallelOutput_
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:229
Definition: WellStateFullyImplicitBlackoil.hpp:41
int lastBackupReportStep_
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:235
const std::string outputDir_
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:161
void outputStateVtk(const UnstructuredGrid &grid, const Opm::SimulatorState &state, const int step, const std::string &output_dir)
BlackoilMatlabWriter(const Grid &grid, const std::string &outputDir)
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:170
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:136
STL namespace.
std::unique_ptr< OutputWriter > vtkWriter_
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:238
std::unique_ptr< OutputWriter > matlabWriter_
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:239
void outputWellStateMatlab(const Opm::WellState &well_state, const int step, const std::string &output_dir)
const std::string & outputDirectory() const
return output directory
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:216
bool output() const
return true if output is enabled
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:219
std::ofstream backupfile_
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:237
void writeInit(const SimulatorTimerInterface &)
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:177
const int output_interval_
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:233
Definition: ParallelDebugOutput.hpp:57
const std::string outputDir_
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:191
Wrapper class for VTK, Matlab, and ECL output.
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:195
void writeTimeStep(const SimulatorTimerInterface &timer, const SimulatorState &state, const WellState &, bool=false)
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:151
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:166
const Grid & grid_
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:160
void outputStateMatlab(const UnstructuredGrid &grid, const Opm::SimulatorState &state, const int step, const std::string &output_dir)
void writeInit(const SimulatorTimerInterface &timer)
const Grid & grid_
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:190
void writeTimeStep(const SimulatorTimerInterface &timer, const SimulatorState &reservoirState, const WellState &wellState, bool=false)
Definition: SimulatorFullyImplicitBlackoilOutput.hpp:181