V PolymerPropsAd::effectiveInvWaterVisc(const V& c, const double* visc) const { const int nc = c.size(); V inv_mu_w_eff(nc); for (int i = 0; i < nc; ++i) { double im = 0; polymer_props_.effectiveInvVisc(c(i), visc, im); inv_mu_w_eff(i) = im; } return inv_mu_w_eff; }
V PolymerPropsAd::effectiveInvWaterVisc(const V& c, const V& mu_w) const { assert(c.size() == mu_w.size()); const int nc = c.size(); V inv_mu_w_eff(nc); for (int i = 0; i < nc; ++i) { double im = 0; polymer_props_.effectiveInvVisc(c(i), mu_w(i), im); inv_mu_w_eff(i) = im; } return inv_mu_w_eff; }
ADB PolymerPropsAd::effectiveInvWaterVisc(const ADB& c, const double* visc) const { const int nc = c.size(); V inv_mu_w_eff(nc); V dinv_mu_w_eff(nc); for (int i = 0; i < nc; ++i) { double im = 0, dim = 0; polymer_props_.effectiveInvViscWithDer(c.value()(i), visc, im, dim); inv_mu_w_eff(i) = im; dinv_mu_w_eff(i) = dim; } ADB::M dim_diag = spdiag(dinv_mu_w_eff); const int num_blocks = c.numBlocks(); std::vector<ADB::M> jacs(num_blocks); for (int block = 0; block < num_blocks; ++block) { jacs[block] = dim_diag * c.derivative()[block]; } return ADB::function(std::move(inv_mu_w_eff), std::move(jacs)); }