/// @brief Computes total mobility and omega for a set of saturation values. /// @param[in] props rock and fluid properties /// @param[in] cells cells with which the saturation values are associated /// @param[in] s saturation values (for all phases) /// @param[out] totmob total mobility /// @param[out] omega fractional-flow weighted fluid densities. void computeTotalMobilityOmega(const Opm::IncompPropertiesInterface& props, const std::vector<int>& cells, const std::vector<double>& s, std::vector<double>& totmob, std::vector<double>& omega) { std::vector<double> pmobc; computePhaseMobilities(props, cells, s, pmobc); const std::size_t np = props.numPhases(); const std::vector<int>::size_type nc = cells.size(); std::vector<double>(cells.size(), 0.0).swap(totmob); std::vector<double>(cells.size(), 0.0).swap(omega ); const double* rho = props.density(); for (std::vector<int>::size_type c = 0; c < nc; ++c) { for (std::size_t p = 0; p < np; ++p) { totmob[ c ] += pmobc[c*np + p]; omega [ c ] += pmobc[c*np + p] * rho[ p ]; } omega[ c ] /= totmob[ c ]; } }
void computeFractionalFlow(const Opm::IncompPropertiesInterface& props, const std::vector<int>& cells, const std::vector<double>& saturations, std::vector<double>& fractional_flows) { const int num_phases = props.numPhases(); computePhaseMobilities(props, cells, saturations, fractional_flows); for (std::vector<int>::size_type i = 0; i < cells.size(); ++i) { double phase_sum = 0.0; for (int phase = 0; phase < num_phases; ++phase) { phase_sum += fractional_flows[i * num_phases + phase]; } for (int phase = 0; phase < num_phases; ++phase) { fractional_flows[i * num_phases + phase] /= phase_sum; } } }
/// @brief Computes total mobility for a set of saturation values. /// @param[in] props rock and fluid properties /// @param[in] cells cells with which the saturation values are associated /// @param[in] p pressure (one value per cell) /// @param[in] z surface-volume values (for all P phases) /// @param[in] s saturation values (for all phases) /// @param[out] totmob total mobilities. void computeTotalMobility(const Opm::BlackoilPropertiesInterface& props, const std::vector<int>& cells, const std::vector<double>& press, const std::vector<double>& z, const std::vector<double>& s, std::vector<double>& totmob) { std::vector<double> pmobc; computePhaseMobilities(props, cells, press, z, s, pmobc); const std::size_t np = props.numPhases(); const std::vector<int>::size_type nc = cells.size(); totmob.clear(); totmob.resize(nc, 0.0); for (std::vector<int>::size_type c = 0; c < nc; ++c) { for (std::size_t p = 0; p < np; ++p) { totmob[ c ] += pmobc[c*np + p]; } } }