39 #ifndef SORPTION_IMPL_HH_
40 #define SORPTION_IMPL_HH_
44 #include <boost/math/tools/roots.hpp>
61 eps = T(ldexp(1.0F, 1-bits));
66 return fabs(a - b) <= (
eps * (std::max)(fabs(a), fabs(b)));
166 double aqua_density,
double scale_aqua,
double scale_sorbed,
167 double c_aqua_limit,
double mult_coef,
double second_coef);
179 inline void compute(
double &c_aqua,
double &c_sorbed);
186 inline void interpolate(
double &c_aqua,
double &c_sorbed);
200 void make_table(
const Func &isotherm,
int n_points);
206 inline ConcPair
solve_conc(ConcPair c_pair,
const Func &isotherm);
270 template <
class Func>
274 CrossFunction(
const Func &func_,
double total_mass,
double scale_aqua,
double scale_sorbed,
double rho_aqua)
296 double rho_aqua,
double scale_aqua,
double scale_sorbed,
297 double c_aqua_limit,
double mult_coef,
double second_coef)
324 c_sorbed=result.
solid;
335 c_sorbed=result.
solid;
343 int total_mass_idx = static_cast <
int>(std::floor(total_mass_steps));
345 if ( total_mass_idx < 0 ) {
xprintf(
UsrErr,
"total_mass %f seems to have negative value.\n", total_mass); }
373 boost::uintmax_t max_iter = 20;
377 double upper_solution_bound;
379 if(total_mass >= mass_limit)
381 mass_limit = total_mass;
387 pair<double,double> solution;
389 solution = boost::math::tools::toms748_solve(eq_func, 0.0, upper_solution_bound, toler, max_iter);
391 difference = (solution.second - solution.first)/2;
392 double c_aqua = solution.first + difference;
394 (total_mass -
scale_aqua_ * c_aqua)/scale_sorbed_);
442 for(
int i=0; i<= n_steps; i++) {