34 lines
714 B
Go
34 lines
714 B
Go
package grib
|
|
|
|
import (
|
|
"fmt"
|
|
"hash/fnv"
|
|
"time"
|
|
)
|
|
|
|
// Generate steps from 0 to 96 with step 1 hour (97 steps total)
|
|
// GFS provides hourly data for 0-120 hours, we use first 96 hours
|
|
var steps = func() []int {
|
|
result := make([]int, 0, 97)
|
|
for i := 0; i <= 96; i++ {
|
|
result = append(result, i)
|
|
}
|
|
return result
|
|
}()
|
|
|
|
func nearestRun(t time.Time) time.Time {
|
|
h := t.UTC().Hour() - t.UTC().Hour()%6
|
|
return time.Date(t.Year(), t.Month(), t.Day(), h, 0, 0, 0, time.UTC)
|
|
}
|
|
|
|
func fileName(run time.Time, step int) string {
|
|
return fmt.Sprintf("gfs.t%02dz.pgrb2.0p50.f%03d", run.Hour(), step)
|
|
}
|
|
|
|
func encodeKey(a ...any) uint64 {
|
|
h := fnv.New64a()
|
|
for _, v := range a {
|
|
fmt.Fprint(h, v)
|
|
}
|
|
return h.Sum64()
|
|
}
|