///////////////////////////////////////////////////////////////////////////////////////
/// \file driver.h
/// \brief Environmental driver calculation/transformation
///
/// \author Ben Smith
/// $Date: 2018-08-21 09:29:22 +0200 (mar, 21 aoû 2018) $
///
///////////////////////////////////////////////////////////////////////////////////////

// WHAT SHOULD THIS FILE CONTAIN?
// Module header files need normally contain only declarations of functions defined in
// the module that are to be accessible to the calling framework or to other modules.

#ifndef LPJ_GUESS_DRIVER_H
#define LPJ_GUESS_DRIVER_H

#include "guess.h"
#include <limits>

double randfrac(long& seed);
void soilparameters(Soiltype& soiltype,int soilcode);
void ifssoilparameters(Soiltype& soiltype,int soilcode); // ecev3


void interp_monthly_means_conserve(const double* mvals, double* dvals, bool isleapyear,
                                   double minimum = -std::numeric_limits<double>::max(),
                                   double maximum = std::numeric_limits<double>::max());
void interp_monthly_totals_conserve(const double* mvals, double* dvals, bool isleapyear,
                                   double minimum = -std::numeric_limits<double>::max(),
                                   double maximum = std::numeric_limits<double>::max());
void distribute_ndep(const double* mndry, const double* mnwet,
                     const double* dprec, int* ndaymonth, double* dndep);
void prdaily(double* mval_prec, double* dval_prec, double* mval_wet, long& seed, bool truncate = true);
void dailyaccounting_gridcell(Gridcell& gridcell, bool firstsimulationday); // ecev3 - added firstsimulationday
void dailyaccounting_stand(Stand& stand);
void dailyaccounting_patch(Patch& patch, bool prescribe_ifs_soiltemp);
void respiration_temperature_response(double temp,double& gtemp);
void daylengthinsoleet(Climate& climate);
void soiltemp(Climate& climate,Soil& soil);

#endif // LPJ_GUESS_DRIVER_H
