void calculate_densities(MatrixScalar &densities, const Scalar &tot_dens, const VectorScalar &molar_frac, const Scalar &zmin,const Scalar &zmax,const Scalar &zstep, const VectorScalar &T, const VectorScalar &mm) { unsigned int iz(0); Scalar Mm; Antioch::set_zero(Mm); for(unsigned int s = 0; s < molar_frac.size(); s++) { Mm += molar_frac[s] * mm[s]; } Mm *= 1e-3;//to kg densities.clear(); densities.resize(molar_frac.size()); for(Scalar z = zmin; z <= zmax; z += zstep) { for(unsigned int s = 0; s < molar_frac.size(); s++) { densities[s].push_back(molar_frac[s] * barometry(zmin,z,T[iz],Mm,tot_dens)); } iz++; } return; }
void linear_interpolation(const VectorScalar &temp0, const VectorScalar &alt0, const VectorScalar &alt1, VectorScalar &temp1) { unsigned int j(0); typename Antioch::value_type<VectorScalar>::type a; typename Antioch::value_type<VectorScalar>::type b; temp1.resize(alt1.size()); for(unsigned int iz = 0; iz < alt1.size(); iz++) { while(alt0[j] < alt1[iz]) { j++; if(!(j < alt0.size()))break; } if(j == 0) { Antioch::set_zero(a); b = temp0[j]; }else if(j < alt0.size() - 1) { a = (temp0[j] - temp0[j-1])/(alt0[j] - alt0[j-1]); b = temp0[j] - a * alt0[j]; }else { Antioch::set_zero(a); b = temp0.back(); } temp1[iz] = a * alt1[iz] + b; } }
typename Antioch::value_type<VectorScalar>::type k_photo(const VectorScalar &solar_lambda, const VectorScalar &solar_irr, const VectorScalar &sigma_lambda, const VectorScalar &sigma_sigma) { Antioch::SigmaBinConverter<VectorScalar> bin; VectorScalar sigma_rescaled(solar_lambda.size()); bin.y_on_custom_grid(sigma_lambda,sigma_sigma,solar_lambda,sigma_rescaled); typename Antioch::value_type<VectorScalar>::type _k(0.L); for(unsigned int il = 0; il < solar_irr.size() - 1; il++) { _k += sigma_rescaled[il] * solar_irr[il] * (solar_lambda[il+1] - solar_lambda[il]); } return _k; }