diff --git a/opm/simulators/timestepping/SimulatorReport.cpp b/opm/simulators/timestepping/SimulatorReport.cpp index b885df1dd..0a1987215 100644 --- a/opm/simulators/timestepping/SimulatorReport.cpp +++ b/opm/simulators/timestepping/SimulatorReport.cpp @@ -1,5 +1,5 @@ /* - Copyright 2012 SINTEF ICT, Applied Mathematics. + Copyright 2012, 2020 SINTEF Digital, Mathematics and Cybernetics. This file is part of the Open Porous Media project (OPM). @@ -20,6 +20,8 @@ #include "config.h" #include +#include +#include #include #include @@ -33,7 +35,7 @@ namespace Opm total_time(0.0), solver_time(0.0), assemble_time(0.0), - linear_solve_setup_time(0.0), + linear_solve_setup_time(0.0), linear_solve_time(0.0), update_time(0.0), output_write_time(0.0), @@ -43,7 +45,7 @@ namespace Opm total_linear_iterations( 0 ), converged(false), exit_status(EXIT_SUCCESS), - global_time(0), + global_time(0), verbose_(verbose) { } @@ -52,7 +54,7 @@ namespace Opm { pressure_time += sr.pressure_time; transport_time += sr.transport_time; - linear_solve_setup_time += sr.linear_solve_setup_time; + linear_solve_setup_time += sr.linear_solve_setup_time; linear_solve_time += sr.linear_solve_time; solver_time += sr.solver_time; assemble_time += sr.assemble_time; @@ -63,21 +65,21 @@ namespace Opm total_linearizations += sr.total_linearizations; total_newton_iterations += sr.total_newton_iterations; total_linear_iterations += sr.total_linear_iterations; - global_time = sr.global_time; + global_time = sr.global_time; } - void SimulatorReportBase::report(std::ostream& os) - { - if ( verbose_ ) - { - os << "Total time taken: " << total_time - << "\n Pressure time: " << pressure_time - << "\n Transport time: " << transport_time - << "\n Overall Newton Iterations: " << total_newton_iterations - << "\n Overall Linear Iterations: " << total_linear_iterations - << std::endl; - } - } + // void SimulatorReportBase::report(std::ostream& os) + // { + // if ( verbose_ ) + // { + // os << "Total time taken: " << total_time + // << "\n Pressure time: " << pressure_time + // << "\n Transport time: " << transport_time + // << "\n Overall Newton Iterations: " << total_newton_iterations + // << "\n Overall Linear Iterations: " << total_linear_iterations + // << std::endl; + // } + // } void SimulatorReportBase::reportStep(std::ostringstream& ss) { @@ -124,14 +126,14 @@ namespace Opm } os << std::endl; - t = linear_solve_setup_time + (failureReport ? failureReport->linear_solve_setup_time : 0.0); + t = linear_solve_setup_time + (failureReport ? failureReport->linear_solve_setup_time : 0.0); os << " Linear solve setup time (seconds): " << t; if (failureReport) { - os << " (Failed: " << failureReport->linear_solve_setup_time << "; " - << 100*failureReport->linear_solve_setup_time/t << "%)"; + os << " (Failed: " << failureReport->linear_solve_setup_time << "; " + << 100*failureReport->linear_solve_setup_time/t << "%)"; } os << std::endl; - + t = update_time + (failureReport ? failureReport->update_time : 0.0); os << " Update time (seconds): " << t; if (failureReport) { @@ -180,44 +182,35 @@ namespace Opm } } - void SimulatorReportBase::reportParam(std::ostream& os) + void SimulatorReport::fullReports(std::ostream& os) { - if ( verbose_ ) - { - os << "/timing/total_time=" << total_time - << "\n/timing/pressure/total_time=" << pressure_time - << "\n/timing/transport/total_time=" << transport_time - << "\n/timing/newton/iterations=" << total_newton_iterations - << "\n/timing/linear/iterations=" << total_linear_iterations - << std::endl; + os << " Time(sec) Time(day) Assembly LSolve LSetup Update Output WellIt Lins NewtIt LinIt Conv\n"; + SimulatorReportBase all; + for (size_t i = 0; i < stepreports.size(); ++i) { + SimulatorReportBase& sr = stepreports[i]; + all += sr; + os.precision(10); + os << std::defaultfloat; + os << std::setw(11) << sr.global_time << " "; + os << std::setw(11) << unit::convert::to(sr.global_time, unit::day) << " "; + os.precision(4); + os << std::fixed; + os << std::setw(9) << sr.assemble_time << " "; + os << std::setw(9) << sr.linear_solve_setup_time << " "; + os << std::setw(9) << sr.linear_solve_time << " "; + os << std::setw(9) << sr.update_time << " "; + os << std::setw(9) << sr.output_write_time << " "; + os.precision(6); + os << std::defaultfloat; + os << std::setw(6) << sr.total_well_iterations << " "; + os << std::setw(4) << sr.total_linearizations << " "; + os << std::setw(6) << sr.total_newton_iterations << " "; + os << std::setw(5) << sr.total_linear_iterations << " "; + os << std::setw(4) << sr.converged << "\n"; + } + if (not(this->linear_solve_time == all.linear_solve_time)) { + OpmLog::debug("Inconsistency between timestep report and total report"); } } - void SimulatorReport::fullReports(std::ostream& os){ - SimulatorReportBase all; - for(size_t i=0; i < stepreports.size(); ++i){ - SimulatorReportBase& sr = stepreports[i]; - all += sr; - os << sr.global_time<< " "; - //os << sr.pressure_time<< " "; - //os << sr.transport_time<< " "; - //os << sr.total_time<< " "; - //os << sr.solver_time<< " "; - os << sr.assemble_time<< " "; - os << sr.linear_solve_setup_time<< " "; - os << sr.linear_solve_time<< " "; - os << sr.update_time<< " "; - os << sr.output_write_time<< " "; - os<< sr.total_well_iterations<< " "; - os << sr.total_linearizations<< " "; - os << sr.total_newton_iterations<< " "; - os << sr.total_linear_iterations<< " "; - os << sr.converged<< " "; - os << sr.exit_status<< " "; - os << std::endl; - } - if(not(this->linear_solve_time == all.linear_solve_time)){ - Opm::debug("Inconsistency between timestep report and total report"); - } - } - + } // namespace Opm diff --git a/opm/simulators/timestepping/SimulatorReport.hpp b/opm/simulators/timestepping/SimulatorReport.hpp index cd5709a8a..9e96ec739 100644 --- a/opm/simulators/timestepping/SimulatorReport.hpp +++ b/opm/simulators/timestepping/SimulatorReport.hpp @@ -51,48 +51,51 @@ namespace Opm /// Default constructor initializing all times to 0.0. explicit SimulatorReportBase(bool verbose=true); /// Copy constructor - SimulatorReportBase(const SimulatorReportBase&) = default; + // SimulatorReportBase(const SimulatorReportBase&) = default; /// Increment this report's times by those in sr. void operator+=(const SimulatorReportBase& sr); /// Print a report to the given stream. - void report(std::ostream& os); + // void report(std::ostream& os); void reportStep(std::ostringstream& os); /// Print a report, leaving out the transport time. void reportFullyImplicit(std::ostream& os, const SimulatorReportBase* failedReport = nullptr); - void reportParam(std::ostream& os); + // void reportParam(std::ostream& os); private: // Whether to print statistics to std::cout bool verbose_; }; - struct SimulatorReport: public SimulatorReportBase{ - std::vector stepreports; - explicit SimulatorReport(bool verbose=true) : - SimulatorReportBase(verbose), - stepreports() - { - } - void operator+=(const SimulatorReportBase& sr){ - SimulatorReportBase::operator+=(sr); - // if(stepreports.size()>0){ - // assert(stepreports.back().global_time != sr.global_time); - // } - stepreports.push_back(sr); - } - void operator+=(const SimulatorReport& sr){ - SimulatorReportBase::operator+=(sr); - // if(stepreports.size()>0){ - // assert(stepreports.back().global_time != sr.global_time); - // } - if(sr.stepreports.size()>0){ - stepreports.insert(stepreports.end(),sr.stepreports.begin(),sr.stepreports.end()); - }else{ - stepreports.push_back(sr); - } - //stepreports.push_back(sr); - } - void fullReports(std::ostream& os); + + struct SimulatorReport : public SimulatorReportBase { + std::vector stepreports; + explicit SimulatorReport(bool verbose = true) + : SimulatorReportBase(verbose) + , stepreports() + { + } + void operator+=(const SimulatorReportBase& sr) + { + SimulatorReportBase::operator+=(sr); + // if(stepreports.size()>0){ + // assert(stepreports.back().global_time != sr.global_time); + // } + stepreports.push_back(sr); + } + void operator+=(const SimulatorReport& sr) + { + SimulatorReportBase::operator+=(sr); + // if(stepreports.size()>0){ + // assert(stepreports.back().global_time != sr.global_time); + // } + if (sr.stepreports.size() > 0) { + stepreports.insert(stepreports.end(), sr.stepreports.begin(), sr.stepreports.end()); + } else { + stepreports.push_back(sr); + } + // stepreports.push_back(sr); + } + void fullReports(std::ostream& os); }; - -} // namespace Opm + + } // namespace Opm #endif // OPM_SIMULATORREPORT_HEADER_INCLUDED