Solid * DistributionsSolidMix::GetSample(const std::vector<double> & u, const std::vector<double> & trend_params, const std::vector<Solid *> & solid_samples) { size_t n_solids = solid_samples.size(); std::vector<double> volume_fraction(n_solids, 0.0); size_t missing_index = n_solids; for(size_t i = 0; i < n_solids; ++i) { if (u[i] != RMISSING) volume_fraction[i] = distr_vol_frac_[i]->GetQuantileValue(u[i], trend_params[0], trend_params[1]); else missing_index = i; } if (missing_index != n_solids) { double sum = 0.0; for (size_t i = 0; i < n_solids; ++i) sum += volume_fraction[i]; volume_fraction[missing_index] = 1.0 - sum; } Solid * solid_mixed = new SolidMix(solid_samples, volume_fraction, u, mix_method_); return solid_mixed; }
/* Return the gradient of partiality wrt parameter 'k' given the current status * of 'image'. */ double p_gradient(Crystal *cr, int k, Reflection *refl, PartialityModel pmodel) { double glow, ghigh; double rlow, rhigh, p; struct image *image = crystal_get_image(cr); double R = crystal_get_profile_radius(cr); get_partial(refl, &rlow, &rhigh, &p); if ( k == GPARAM_R ) { double Rglow, Rghigh; double D, psph; D = rlow - rhigh; psph = volume_fraction(rlow, rhigh, R, pmodel); Rglow = volume_fraction_rgradient(rlow, R, pmodel); Rghigh = volume_fraction_rgradient(rhigh, R, pmodel); return 4.0*psph/(3.0*D) + (4.0*R/(3.0*D))*(Rglow - Rghigh); } /* Calculate the gradient of partiality wrt excitation error. */ glow = partiality_gradient(rlow, R, pmodel, rlow, rhigh); ghigh = partiality_gradient(rhigh, R, pmodel, rlow, rhigh); if ( k == GPARAM_DIV ) { double D, psph, ds; signed int hs, ks, ls; D = rlow - rhigh; psph = volume_fraction(rlow, rhigh, R, pmodel); get_symmetric_indices(refl, &hs, &ks, &ls); ds = 2.0 * resolution(crystal_get_cell(cr), hs, ks, ls); return (ds/2.0)*(glow+ghigh) - 4.0*R*psph*ds/(3.0*D*D); } return r_gradient(crystal_get_cell(cr), k, refl, image) * (glow-ghigh); }
void RockMixOfSolidAndFluid::ComputeSeismicVariables() { size_t size = solid_.size() + fluid_.size(); std::vector<double> volume_fraction(size); std::vector<double> k(size); std::vector<double> mu(size); std::vector<double> rho(size); size_t solid_size = solid_.size(); for (size_t i = 0; i < solid_size; i++) { solid_[i]->GetElasticParams(k[i], mu[i], rho[i]); volume_fraction[i] = volume_fraction_solid_[i]; } for (size_t i = solid_.size(); i < size; i++) { fluid_[i - solid_size]->GetElasticParams(k[i], rho[i]); mu[i] = 0; volume_fraction[i] = volume_fraction_fluid_[i - solid_size]; } double k_eff = 0; double mu_eff = 0; switch (mix_method_) { case DEMTools::Hill : k_eff = DEMTools::CalcEffectiveElasticModuliUsingHill(k, volume_fraction); mu_eff = DEMTools::CalcEffectiveElasticModuliUsingHill(mu, volume_fraction); break; case DEMTools::Reuss : k_eff = DEMTools::CalcEffectiveElasticModuliUsingReuss(k, volume_fraction); // homogeneous mu_eff = DEMTools::CalcEffectiveElasticModuliUsingReuss(mu, volume_fraction); break; case DEMTools::Voigt : k_eff = DEMTools::CalcEffectiveElasticModuliUsingVoigt(k, volume_fraction); mu_eff = DEMTools::CalcEffectiveElasticModuliUsingVoigt(mu, volume_fraction); break; default : throw NRLib::Exception("Invalid rock mixing algorithm specified."); } rho_ = DEMTools::CalcEffectiveDensity(rho, volume_fraction); DEMTools::CalcSeismicParamsFromElasticParams(k_eff, mu_eff, rho_, vp_, vs_); }
void estimate_volume_fractions(Array3f& volumes, const Vec3f& start_centre, const float dx, const Array3f& phi, const Vec3f& phi_origin, const float phi_dx) { for(int k = 0; k < volumes.nk; ++k) for(int j = 0; j < volumes.nj; ++j) for(int i = 0; i < volumes.ni; ++i) { Vec3f centre = start_centre + Vec3f(i*dx, j*dx, k*dx); float offset = 0.5f*dx; float phi000 = interpolate_phi(centre + Vec3f(-offset,-offset,-offset), phi, phi_origin, phi_dx); float phi001 = interpolate_phi(centre + Vec3f(-offset,-offset,+offset), phi, phi_origin, phi_dx); float phi010 = interpolate_phi(centre + Vec3f(-offset,+offset,-offset), phi, phi_origin, phi_dx); float phi011 = interpolate_phi(centre + Vec3f(-offset,+offset,+offset), phi, phi_origin, phi_dx); float phi100 = interpolate_phi(centre + Vec3f(+offset,-offset,-offset), phi, phi_origin, phi_dx); float phi101 = interpolate_phi(centre + Vec3f(+offset,-offset,+offset), phi, phi_origin, phi_dx); float phi110 = interpolate_phi(centre + Vec3f(+offset,+offset,-offset), phi, phi_origin, phi_dx); float phi111 = interpolate_phi(centre + Vec3f(+offset,+offset,+offset), phi, phi_origin, phi_dx); volumes(i,j,k) = volume_fraction(phi000, phi100, phi010, phi110, phi001, phi101, phi011, phi111); } }