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); }
/*使用双数组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++); } } };