Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
/* 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);
}
Exemplo n.º 3
0
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_);
}
Exemplo n.º 4
0
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);

   }

}