00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef OPM_FLOWMAINPOLYMER_HEADER_INCLUDED
00022 #define OPM_FLOWMAINPOLYMER_HEADER_INCLUDED
00023
00024
00025
00026 #include <opm/autodiff/FlowMain.hpp>
00027 #include <opm/polymer/PolymerProperties.hpp>
00028 #include <opm/polymer/fullyimplicit/PolymerPropsAd.hpp>
00029
00030
00031
00032 namespace Opm
00033 {
00034
00035
00036 template <class Grid, class Simulator>
00037 class FlowMainPolymer : public FlowMainBase<FlowMainPolymer<Grid, Simulator>, Grid, Simulator>
00038 {
00039 protected:
00040 using Base = FlowMainBase<FlowMainPolymer<Grid, Simulator>, Grid, Simulator>;
00041 using Base::eclipse_state_;
00042 using Base::param_;
00043 using Base::fis_solver_;
00044 using Base::parallel_information_;
00045 friend Base;
00046
00047
00048 std::unique_ptr<PolymerProperties> polymer_props_legacy_;
00049 std::unique_ptr<PolymerPropsAd> polymer_props_;
00050
00051
00052
00053
00054
00055 void printStartupMessage()
00056 {
00057 if (Base::output_cout_) {
00058 const std::string version = moduleVersionName();
00059 std::cout << "**********************************************************************\n";
00060 std::cout << "* *\n";
00061 std::cout << "* This is Flow-Polymer (version " << version << ")"
00062 << std::string(18 - version.size(), ' ') << "*\n";
00063 std::cout << "* *\n";
00064 std::cout << "* Flow-Polymer is a simulator for fully implicit three-phase, *\n";
00065 std::cout << "* four-component (black-oil + polymer) flow, and is part of OPM. *\n";
00066 std::cout << "* For more information see http://opm-project.org *\n";
00067 std::cout << "* *\n";
00068 std::cout << "**********************************************************************\n\n";
00069
00070 }
00071 }
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 void setupGridAndProps()
00083 {
00084 Base::setupGridAndProps();
00085
00086 if (Base::deck_->hasKeyword("POLYMER")) {
00087 polymer_props_legacy_.reset(new PolymerProperties(*Base::deck_, *Base::eclipse_state_));
00088 polymer_props_.reset(new PolymerPropsAd(*polymer_props_legacy_));
00089 }
00090 }
00091
00092
00093
00094
00095
00096 void setupLinearSolver()
00097 {
00098 const std::string cprSolver = "cpr";
00099 const std::string interleavedSolver = "interleaved";
00100 const std::string directSolver = "direct";
00101 const std::string flowDefaultSolver = interleavedSolver;
00102
00103 const Opm::SimulationConfig& simCfg = eclipse_state_->getSimulationConfig();
00104 std::string solver_approach = flowDefaultSolver;
00105
00106 if (param_.has("solver_approach")) {
00107 solver_approach = param_.template get<std::string>("solver_approach");
00108 } else {
00109 if (simCfg.useCPR()) {
00110 solver_approach = cprSolver;
00111 }
00112 }
00113
00114 if (solver_approach == cprSolver) {
00115 OPM_THROW( std::runtime_error , "CPR solver is not ready for use with polymer solver yet.");
00116 } else if (solver_approach == interleavedSolver) {
00117 fis_solver_.reset(new NewtonIterationBlackoilInterleaved(param_, parallel_information_));
00118 } else if (solver_approach == directSolver) {
00119 fis_solver_.reset(new NewtonIterationBlackoilSimple(param_, parallel_information_));
00120 } else {
00121 OPM_THROW( std::runtime_error , "Internal error - solver approach " << solver_approach << " not recognized.");
00122 }
00123 }
00124
00125
00126
00127
00128
00129
00130
00131
00132 void createSimulator()
00133 {
00134
00135 Base::simulator_.reset(new Simulator(Base::param_,
00136 Base::grid_init_->grid(),
00137 *Base::geoprops_,
00138 *Base::fluidprops_,
00139 *polymer_props_,
00140 Base::rock_comp_->isActive() ? Base::rock_comp_.get() : nullptr,
00141 *Base::fis_solver_,
00142 Base::gravity_.data(),
00143 Base::deck_->hasKeyword("DISGAS"),
00144 Base::deck_->hasKeyword("VAPOIL"),
00145 Base::deck_->hasKeyword("POLYMER"),
00146 Base::deck_->hasKeyword("PLYSHLOG"),
00147 Base::deck_->hasKeyword("SHRATE"),
00148 Base::eclipse_state_,
00149 *Base::output_writer_,
00150 Base::deck_,
00151 Base::threshold_pressures_));
00152 }
00153
00154
00155 };
00156
00157
00158 }
00159
00160
00161
00162
00163 #endif // OPM_FLOWMAINPOLYMER_HEADER_INCLUDED