package main import ( "encoding/binary" "fmt" "math" "os" mmap "github.com/edsrzf/mmap-go" ) var pressureLevels = []float64{ 1000, 975, 950, 925, 900, 875, 850, 825, 800, 775, 750, 725, 700, 675, 650, 625, 600, 575, 550, 525, 500, 475, 450, 425, 400, 375, 350, 325, 300, 275, 250, 225, 200, 175, 150, 125, 100, 70, 50, 30, 20, 10, 7, 5, 3, 2, 1, } func main() { f, _ := os.Open("C:/tmp/grib/20260212_12.cube") mm, _ := mmap.Map(f, mmap.RDONLY, 0) defer mm.Unmap() defer f.Close() const ( nT = 97 nP = 47 nLat = 721 nLon = 1440 ) bytesPerVar := int64(nT * nP * nLat * nLon * 4) val := func(varIdx, ti, pi, y, x int) float32 { idx := (((ti*nP + pi) * nLat) + y) * nLon + x off := int64(varIdx)*bytesPerVar + int64(idx)*4 bits := binary.LittleEndian.Uint32(mm[off : off+4]) return math.Float32frombits(bits) } // Check gh values at lat=52.2N (y=(90-52.2)*4=151.2 → y=151), lon=0.1E (x=0.1*4=0.4 → x=0) // Time step 9 (9 hours into forecast) ti := 9 y := 151 x := 0 fmt.Println("GH values at (52.25N, 0E), t=+9h:") fmt.Printf("%8s %8s %10s\n", "Level", "hPa", "GH(m)") for pi := 0; pi < nP; pi++ { gh := val(0, ti, pi, y, x) fmt.Printf("%8d %8.0f %10.1f\n", pi, pressureLevels[pi], gh) } fmt.Println("\nU-wind values at same point:") fmt.Printf("%8s %8s %10s\n", "Level", "hPa", "U(m/s)") for pi := 0; pi < nP; pi++ { u := val(1, ti, pi, y, x) fmt.Printf("%8d %8.0f %10.2f\n", pi, pressureLevels[pi], u) } }