some code optimization (instead of mu_w_eff, use its inverse).

This commit is contained in:
Xavier Raynaud 2012-04-26 09:25:46 +02:00
parent af79b9555c
commit 6748a6e5e9
2 changed files with 53 additions and 44 deletions

View File

@ -124,25 +124,33 @@ namespace Opm
} }
void PolymerProperties::effectiveVisc(const double c, const double* visc, double* visc_eff) const { void PolymerProperties::effectiveVisc(const double c, const double* visc, double& mu_w_eff) const {
effectiveViscBoth(c, visc, visc_eff, 0, false); effectiveInvVisc(c, visc, mu_w_eff);
mu_w_eff = 1./mu_w_eff;
} }
void PolymerProperties::effectiveInvVisc(const double c, const double* visc, double* inv_visc_eff) const void PolymerProperties::effectiveViscWithDer(const double c, const double* visc, double& mu_w_eff, double dmu_w_eff_dc) const {
effectiveInvViscWithDer(c, visc, mu_w_eff, dmu_w_eff_dc);
mu_w_eff = 1./mu_w_eff;
dmu_w_eff_dc = -dmu_w_eff_dc*mu_w_eff*mu_w_eff;
}
void PolymerProperties::effectiveInvVisc(const double c, const double* visc, double& inv_mu_w_eff) const
{ {
effectiveViscBoth(c, visc, inv_visc_eff, 0, false); double dummy;
inv_visc_eff[0] = 1./inv_visc_eff[0]; effectiveInvViscBoth(c, visc, inv_mu_w_eff, dummy, false);
inv_visc_eff[1] = 1./inv_visc_eff[1];
} }
void PolymerProperties::effectiveViscWithDer(const double c, const double* visc, double* visc_eff, void PolymerProperties::effectiveInvViscWithDer(const double c, const double* visc,
double* dvisc_eff_dc) const { double& inv_mu_w_eff,
effectiveViscBoth(c, visc, visc_eff, dvisc_eff_dc, true); double& dinv_mu_w_eff_dc) const {
effectiveInvViscBoth(c, visc, inv_mu_w_eff, dinv_mu_w_eff_dc, true);
} }
void PolymerProperties::effectiveViscBoth(const double c, const double* visc, double* visc_eff, void PolymerProperties::effectiveInvViscBoth(const double c, const double* visc,
double* dvisc_eff_dc, bool if_with_der) const double& inv_mu_w_eff,
{ double& dinv_mu_w_eff_dc,
bool if_with_der) const {
double cbar = c/c_max_; double cbar = c/c_max_;
double mu_w = visc[0]; double mu_w = visc[0];
double mu_m; double mu_m;
@ -155,19 +163,15 @@ namespace Opm
mu_m = viscMult(c)*mu_w; mu_m = viscMult(c)*mu_w;
} }
double mu_p = viscMult(c_max_)*mu_w; double mu_p = viscMult(c_max_)*mu_w;
double mu_m_omega = std::pow(mu_m, mix_param_); double inv_mu_m_omega = std::pow(mu_m, -omega);
double mu_w_e = mu_m_omega*std::pow(mu_w, 1.0 - mix_param_); double inv_mu_w_e = inv_mu_m_omega*std::pow(mu_w, omega - 1.);
double mu_p_eff = mu_m_omega*std::pow(mu_p, 1.0 - mix_param_); double inv_mu_p_eff = inv_mu_m_omega*std::pow(mu_p, omega - 1.);
double mu_w_eff = 1./((1.0 - cbar)/mu_w_e + cbar/mu_p_eff); inv_mu_w_eff = (1.0 - cbar)*inv_mu_w_e + cbar*inv_mu_p_eff;
visc_eff[0] = mu_w_eff;
visc_eff[1] = visc[1];
if (if_with_der) { if (if_with_der) {
double dmu_w_e_dc = omega*dmu_m_dc*std::pow(mu_m, omega - 1)*std::pow(mu_w, 1 - omega); double dinv_mu_w_e_dc = -omega*dmu_m_dc*std::pow(mu_m, -omega - 1)*std::pow(mu_w, omega - 1);
double dmu_p_eff_dc = omega*dmu_m_dc*std::pow(mu_m, omega - 1)*std::pow(mu_p, 1 - omega); double dinv_mu_p_eff_dc = -omega*dmu_m_dc*std::pow(mu_m, -omega - 1)*std::pow(mu_p, omega - 1);
dvisc_eff_dc[0] = -1./c_max_*mu_w_eff*mu_w_eff*(1./mu_p_eff - 1./mu_w_e) + (1-cbar)*(mu_w_eff*mu_w_eff/(mu_w_e*mu_w_e))*dmu_w_e_dc + cbar*(mu_w_eff*mu_w_eff/(mu_p_eff*mu_p_eff))*dmu_p_eff_dc; dinv_mu_w_eff_dc = (1 - cbar)*dinv_mu_w_e_dc + cbar*dinv_mu_p_eff_dc +
dvisc_eff_dc[1] = 0.; 1/c_max_*(inv_mu_p_eff - inv_mu_w_e);
} else {
dvisc_eff_dc = 0;
} }
} }
@ -252,11 +256,9 @@ namespace Opm
double& dmobwat_dc, double& dmobwat_dc,
bool if_with_der) const bool if_with_der) const
{ {
double visc_eff[2]; double inv_mu_w_eff;
double dvisc_eff_dc[2]; double dinv_mu_w_eff_dc;
effectiveViscBoth(c, visc, visc_eff, dvisc_eff_dc, if_with_der); effectiveInvViscBoth(c, visc, inv_mu_w_eff, dinv_mu_w_eff_dc, if_with_der);
double mu_w_eff = visc_eff[0];
double dmu_w_eff_dc = dvisc_eff_dc[0];
double eff_relperm_wat; double eff_relperm_wat;
double deff_relperm_wat_ds; double deff_relperm_wat_ds;
double deff_relperm_wat_dc; double deff_relperm_wat_dc;
@ -266,16 +268,16 @@ namespace Opm
deff_relperm_wat_ds, deff_relperm_wat_dc, deff_relperm_wat_ds, deff_relperm_wat_dc,
if_with_der); if_with_der);
mob[0] = eff_relperm_wat/visc_eff[0]; mob[0] = eff_relperm_wat*inv_mu_w_eff;
mob[1] = relperm[1]/visc_eff[1]; mob[1] = relperm[1]/visc[1];
if (if_with_der) { if (if_with_der) {
dmobwat_dc = - eff_relperm_wat*dmu_w_eff_dc/(mu_w_eff*mu_w_eff) dmobwat_dc = eff_relperm_wat*dinv_mu_w_eff_dc
+ deff_relperm_wat_dc/mu_w_eff; + deff_relperm_wat_dc*inv_mu_w_eff;
dmob_ds[0*2 + 0] = deff_relperm_wat_ds/visc_eff[0]; dmob_ds[0*2 + 0] = deff_relperm_wat_ds*inv_mu_w_eff;
dmob_ds[0*2 + 1] = drelperm_ds[0*2 + 1]/visc_eff[1]; dmob_ds[0*2 + 1] = drelperm_ds[0*2 + 1]/visc[1];
dmob_ds[1*2 + 0] = drelperm_ds[1*2 + 0]/visc_eff[0]; dmob_ds[1*2 + 0] = drelperm_ds[1*2 + 0]*inv_mu_w_eff;
dmob_ds[1*2 + 1] = drelperm_ds[1*2 + 1]/visc_eff[1]; dmob_ds[1*2 + 1] = drelperm_ds[1*2 + 1]/visc[1];
} }
} }

View File

@ -153,14 +153,20 @@ namespace Opm
void adsorptionWithDer(double c, double cmax, void adsorptionWithDer(double c, double cmax,
double& c_ads, double& dc_ads_dc) const; double& c_ads, double& dc_ads_dc) const;
void effectiveVisc(const double c, const double* visc, double* visc_eff) const; void effectiveVisc(const double c, const double* visc,
double& mu_w_eff) const;
void effectiveViscWithDer(const double c, const double* visc
, double& mu_w_eff
, double dmu_w_eff_dc) const;
void effectiveInvVisc(const double c, const double* visc, void effectiveInvVisc(const double c, const double* visc,
double* inv_visc_eff) const; double& inv_mu_w_eff) const;
void effectiveViscWithDer(const double c, const double* visc,
double* visc_eff, double* dvisc_eff_dc) const;
void effectiveInvViscWithDer(const double c,
const double* visc,
double& inv_mu_w_eff,
double& dinv_mu_w_eff_dc) const;
void effectiveRelperm(const double c, void effectiveRelperm(const double c,
const double cmax, const double cmax,
const double* relperm, const double* relperm,
@ -247,8 +253,9 @@ namespace Opm
void adsorptionBoth(double c, double cmax, void adsorptionBoth(double c, double cmax,
double& c_ads, double& dc_ads_dc, double& c_ads, double& dc_ads_dc,
bool if_with_der) const; bool if_with_der) const;
void effectiveViscBoth(const double c, const double* visc, double* visc_eff, void effectiveInvViscBoth(const double c, const double* visc,
double* dvisc_eff_dc, bool if_with_der) const; double& inv_mu_w_eff,
double& dinv_mu_w_eff_dc, bool if_with_der) const;
void effectiveRelpermBoth(const double c, void effectiveRelpermBoth(const double c,
const double cmax, const double cmax,
const double* relperm, const double* relperm,