double runoff_getTimeStep(DateTime currentDate) // // Input: currentDate = current simulation date/time // Output: time step (sec) // Purpose: computes a time step to use for runoff calculations. // { int j; long timeStep; long maxStep = DryStep; // --- find shortest time until next evaporation or rainfall value // (this represents the maximum possible time step) timeStep = datetime_timeDiff(climate_getNextEvap(currentDate), currentDate); if ( timeStep < maxStep ) maxStep = timeStep; for (j = 0; j < Nobjects[GAGE]; j++) { timeStep = datetime_timeDiff(gage_getNextRainDate(j, currentDate), currentDate); if ( timeStep > 0 && timeStep < maxStep ) maxStep = timeStep; } // --- determine whether wet or dry time step applies if ( IsRaining || HasSnow || HasRunoff ) timeStep = WetStep; else timeStep = DryStep; // --- limit time step if necessary if ( timeStep > maxStep ) timeStep = maxStep; return (double)timeStep; }
void saveAccumRainfall(Project* project, DateTime date1, int hour, int minute, long v) // // Input: date1 = date of latest rainfall reading (in DateTime format) // hour = hour of day of latest rain reading // minute = minute of hour of latest rain reading // v = accumulated rainfall reading in hundreths of inches // Output: none // Purpose: divides accumulated rainfall evenly into individual recording // periods over the accumulation period and writes each period's // rainfall to the binary rainfall file. // { DateTime date2; int n, j; float x; // --- return if accumulated start date is missing if ( project->AccumStartDate == NO_DATE ) return; // --- find number of recording intervals over accumulation period date2 = date1 + datetime_encodeTime(hour, minute, 0); n = (datetime_timeDiff(date2, project->AccumStartDate) / project->Interval) + 1; // --- update count of rain or missing periods if ( v == 99999 ) { project->RainStats.periodsMissing += n; return; } project->RainStats.periodsRain += n; // --- divide accumulated amount evenly into each period x = (float)v / (float)n / 100.0f; // --- save this amount to file for each period if ( x > 0.0f ) { date2 = datetime_addSeconds(project->AccumStartDate, -project->TimeOffset); if ( project->RainStats.startDate == NO_DATE ) project->RainStats.startDate = date2; for (j = 0; j < n; j++) { fwrite(&date2, sizeof(DateTime), 1, project->Frain.file); fwrite(&x, sizeof(float), 1, project->Frain.file); date2 = datetime_addSeconds(date2, project->Interval); project->RainStats.endDate = date2; } } // --- reset start of accumulation period project->AccumStartDate = NO_DATE; }