Ejemplo n.º 1
0
double mesh_heart::get_z(double x,double y,double ans_start,double balance_check)//根据给定的x,y以及迭代初值求z值
{
	double a;
	double b;
	a = x*x + (9.0/4.0)*y*y -1;
	b = x*x + (9.0/80.0)*y*y;
	for(int i = 0; i < 200; ++i)//牛顿迭代
	{
		ans_start = ans_start - balance_check*find_f(a,b,ans_start) / find_f1(a,b,ans_start);
	}
	double check = find_f(a,b,ans_start);
	if(check > 0.000000001 || check < -0.000000001)
	{
		return -999.0;//未找到逼近解,返回失败
	}
	else
	{
		return ans_start;//返回找到的解
	}
}
Ejemplo n.º 2
0
void
ClayOMBiomod::set_rates (const Soil& soil, const std::vector<SMB*>& smb) const
{ 
  // We always have two SMB pools in BIOMOD.
  daisy_assert (smb.size () == 2);

  // Total death and maintenance.
  const double t_SMB1 = smb[0]->turnover_rate + smb[0]->maintenance;
  const double t_SMB2 = smb[1]->turnover_rate + smb[1]->maintenance;

  // The ratios we want to change.
  const double r_SMB1 = smb[0]->turnover_rate / t_SMB1;
  const double r_SMB2 = smb[1]->turnover_rate / t_SMB2;

  for (unsigned int i  = 0; i < soil.size (); i++)
    {
      // Find modifier.
      const double f = find_f (r_SMB1, r_SMB2, soil.clay (i));
      daisy_assert (f > 0.0);

      // Update turnover rate and maintence.
      const double clay_rate1 = smb[0]->turnover_rate * f;
      daisy_assert (clay_rate1 < 1.0);
      smb[0]->clay_turnover.push_back (clay_rate1);
      daisy_assert (t_SMB1 >= clay_rate1);
      smb[0]->clay_maintenance.push_back (t_SMB1 - clay_rate1);
      const double clay_rate2 = smb[1]->turnover_rate * f;
      daisy_assert (clay_rate2 < 1.0);
      smb[1]->clay_turnover.push_back (clay_rate2);
      daisy_assert (t_SMB2 >= clay_rate2);
      smb[1]->clay_maintenance.push_back (t_SMB2 - clay_rate2);
    }

  for (unsigned int i = 0; i < smb.size (); i++)
    {
      daisy_assert (smb[i]->clay_turnover.size () == soil.size ());
      daisy_assert (smb[i]->clay_maintenance.size () == soil.size ());
    }
}
Ejemplo n.º 3
0
      err.error ("\
You must have exactly two SMB pool with the 'biomod' clay model");
      return false;
    }

  // Total death and maintenance.
  const double t_SMB1 = smb[0]->turnover_rate + smb[0]->maintenance;
  const double t_SMB2 = smb[1]->turnover_rate + smb[1]->maintenance;

  // The ratios we want to change.
  const double r_SMB1 = smb[0]->turnover_rate / t_SMB1;
  const double r_SMB2 = smb[1]->turnover_rate / t_SMB2;

#ifdef OLD_VERSION
  // The ratio modifier at 0.1 clay.
  const double f = find_f (r_SMB1, r_SMB2, 0.1);
  if (!approximate (f, 1.0, 0.01))
    {
      std::ostringstream tmp;
      tmp << "\
The biomod clay model is calibrated so f (0.1) must be 1.0, that is,\n\
the turnover and maintenance parameters are normalized for 10% clay content.\n\
However, f (0.1) is " << f << ", which mean any results produced are bogus";
      err.warning (tmp.str ());
    }
#else // !OLD_VERSION
  // The ratio modifier at 0.0 clay.
  const double f = find_f (r_SMB1, r_SMB2, 0.0);
  if (!approximate (f, 1.0, 0.01))
    {
      std::ostringstream tmp;