void initialize (const Texture& texture,
                   double rho_b, const bool top_soil, const double CEC,
                   const double center_z, Treelog& msg)
  {
    TREELOG_MODEL (msg);
    std::ostringstream tmp;

    // Find Theta_sat.
    if (Theta_sat < 0.0)
      {
        if (rho_b < 0.0)
          {
            msg.error ("You must specify either dry bulk density or porosity");
            rho_b = 1.5;
            tmp << "Forcing rho_b = "  << rho_b << " g/cm^3\n";
          }
        Theta_sat = 1.0 - rho_b / texture.rho_soil_particles ();
        tmp << "(Theta_sat " << Theta_sat << " [])\n";
        daisy_assert (Theta_sat < 1.0);
      }
    if (Theta_sat <= Theta_fc)
      {
        msg.error ("Field capacity must be below saturation point");
        Theta_sat = (1.0 + 4.0 * Theta_fc) / 5.0;
        tmp << "Forcing Theta_sat = " << Theta_sat << " []\n";
      }

    // Find Theta_wp.
    if (Theta_wp < 0.0)
      {
        const double clay_lim // USDA Clay
          = texture.fraction_of_minerals_smaller_than ( 2.0 /* [um] */);
        const double silt_lim // USDA Silt 
          = texture.fraction_of_minerals_smaller_than (50.0 /* [um] */);
        daisy_assert (clay_lim >= 0.0);
        daisy_assert (silt_lim >= clay_lim);
        daisy_assert (silt_lim <= 1.0);
        const double mineral = texture.mineral ();
        const double clay = mineral * clay_lim * 100 /* [%] */;
        const double silt = mineral * (silt_lim - clay_lim) * 100 /* [%] */;
        const double humus = texture.humus * 100 /* [%] */;
        // Madsen and Platou (1983).
        Theta_wp = 0.758 * humus + 0.520 * clay + 0.075 * silt + 0.42;
        Theta_wp /= 100.0;      // [%] -> []
      }

    b = find_b (Theta_wp, Theta_fc);
    h_b = find_h_b (Theta_wp, Theta_fc, Theta_sat, b);
    tmp << "(b " << b << " [])\n"
        << "(h_b " << h_b << " [cm])";
    msg.debug (tmp.str ());

    // Must be called last (K_init depends on the other parameters).
    Hydraulic::initialize (texture, rho_b, top_soil, CEC, center_z, msg);
  }    
Example #2
0
File: zseg.cpp Project: thinxer/tau
/*使用双数组trie树查表为动态规划程序搜使用的数据初始化*/
void put_values(){
    //清零
    values[0][0]=0;values[0][1]=0;
    values[0][2]=0;values[0][3]=0;
    /*每一个字的unigram,与它邻接的共3个字的标注有关,每个字有4种标注,
    所以需要赋予12个不同的特征值*/
    for(int i=0;i<len;i++){
        int* p=find_u(sequence[i]);
        if(p==NULL){
            if(i+1<len){
                values[i+1][0]=0;values[i+1][1]=0;
                values[i+1][2]=0;values[i+1][3]=0;
            }
            continue;
        }
        if(i>0){
            values[i-1][0]+=*(p++);values[i-1][1]+=*(p++);
            values[i-1][2]+=*(p++);values[i-1][3]+=*(p++);
        }else p+=4;
        values[i][0]+=*(p++);values[i][1]+=*(p++);
        values[i][2]+=*(p++);values[i][3]+=*(p++);
        if(i+1<len){
            values[i+1][0]=*(p++);values[i+1][1]=*(p++);
            values[i+1][2]=*(p++);values[i+1][3]=*(p++);
        }
    }
    /*每一个字的bigram,与它邻接的共4个字的标注有关,每个字有4种标注,
    所以需要赋予16个不同的特征值*/
    for(int i=0;i<len-1;i++){
        //用双数组trie树找到该bigram对应的16个特征的特征值指针
        int* p=find_b(sequence[i],sequence[i+1]);
        if(p==NULL)continue;
        if(i>0){
            values[i-1][0]+=*(p++);values[i-1][1]+=*(p++);
            values[i-1][2]+=*(p++);values[i-1][3]+=*(p++);
        }else p+=4;
        values[i][0]+=*(p++);values[i][1]+=*(p++);
        values[i][2]+=*(p++);values[i][3]+=*(p++);
        values[i+1][0]+=*(p++);values[i+1][1]+=*(p++);
        values[i+1][2]+=*(p++);values[i+1][3]+=*(p++);
        if(i+2<len){
            values[i+2][0]+=*(p++);values[i+2][1]+=*(p++);
            values[i+2][2]+=*(p++);values[i+2][3]+=*(p++);
        }
    }
};