private static double GetBiasCorrectedFlow(double value,
List<double> obs_flow, List<double> obs_exc, LNFit obs_stats,
List<double> sim_flow, List<double> sim_exc, LNFit sim_stats)
{
double rval;
//if simulated value is zero return zero
if (value > -0.001 && value < 0.001)
{
return 0;
}
double quantile = -1;
double ln3anom = (Math.Log(value) - sim_stats.lnmean) / sim_stats.lnstd;
double thresh = 3.5;
//check if flow higher or lower than any quantile value
bool outRangeFlow = (value > sim_flow[0]
|| value < sim_flow[sim_flow.Count - 1]);
if (!outRangeFlow)
{
quantile = Interpolate(value, sim_flow, sim_exc);
}
//check if quantile is out of range of observed quantile
bool outRangeQuantile = (quantile > obs_exc[obs_exc.Count - 1]
|| quantile < obs_exc[0] || outRangeFlow);
if (outRangeQuantile)
{
rval = Math.Exp(obs_stats.lnstd * ln3anom + obs_stats.lnmean);
}
else
{
rval = Interpolate(quantile, obs_exc, obs_flow);
}
//if simulated value is sufficiently out of range as defined by
//threshold value, use simple scaling technique
if (ln3anom < (-1 * thresh) || ln3anom > thresh)
{
rval = value / sim_stats.mean * obs_stats.mean;
}
return rval;
}