60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
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)
|
|
}
|
|
}
|