From d061ce13362424715eed5a7fb78d66f7b56565a5 Mon Sep 17 00:00:00 2001 From: Mark Chadwick Date: Tue, 1 May 2018 12:53:58 +1200 Subject: [PATCH] add tides package (#279) --- README.md | 4 + test.sh | 1 + tides/README.md | 113 ++ tides/auto.go | 2414 ++++++++++++++++++++++++++++++++++++++++ tides/generate/main.go | 125 +++ tides/tides.go | 54 + tides/tides_test.go | 26 + 7 files changed, 2737 insertions(+) create mode 100644 tides/README.md create mode 100644 tides/auto.go create mode 100644 tides/generate/main.go create mode 100644 tides/tides.go create mode 100644 tides/tides_test.go diff --git a/README.md b/README.md index 4dc095200..7337282ea 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,10 @@ Golang module to load the meta data csv files. Golang module to configure and describe instrument responses. +## tides + +Golang module to configure and describe tsunami gauge tidal parameters. + ## tools Golang tools to manage and process the meta data. diff --git a/test.sh b/test.sh index 740b6bb78..e8b47b8a7 100755 --- a/test.sh +++ b/test.sh @@ -10,6 +10,7 @@ error_handler () { trap error_handler ERR go test ./meta +go test ./tides go test ./tests go test ./tools/stationxml go test ./tools/altus diff --git a/tides/README.md b/tides/README.md new file mode 100644 index 000000000..a03254605 --- /dev/null +++ b/tides/README.md @@ -0,0 +1,113 @@ + + +# tides +`import "github.com/GeoNet/delta/tides"` + +* [Overview](#pkg-overview) +* [Index](#pkg-index) +* [Subdirectories](#pkg-subdirectories) + +## Overview +Package tides provides an embeddable mechanism for providing tidal constituents for given gauge sites +that can be used for tide predication. + + + + +## Index +* [type Constituent](#Constituent) + * [func (c Constituent) String() string](#Constituent.String) +* [type Tide](#Tide) + * [func Lookup(code string) *Tide](#Lookup) + * [func (t Tide) Zone() float64](#Tide.Zone) + + +#### Package files +[auto.go](/src/github.com/GeoNet/delta/tides/auto.go) [tides.go](/src/github.com/GeoNet/delta/tides/tides.go) + + + + + + +## type [Constituent](/src/target/tides.go?s=451:534#L14) +``` go +type Constituent struct { + Name string + Amplitude float64 + Lag float64 +} +``` +Constitutent stores the calculated amplotude and lag for a named tidal phase, the amplitude +and lag are given in units of meters and degrees respectively. + + + + + + + + + + +### func (Constituent) [String](/src/target/tides.go?s=607:643#L21) +``` go +func (c Constituent) String() string +``` +String provides a standard representation of the tidal constituent. + + + + +## type [Tide](/src/target/tides.go?s=1024:1202#L29) +``` go +type Tide struct { + Code string + Network string + Number string + TimeZone float64 + Latitude float64 + Longitude float64 + Crex string + + Constituents []Constituent +} +``` +Tide provides the general parameters needed to predict tides at a given site and the +associated tidal consitituents. The TimeZone, Latitude, and Longitude are expected +to be the parameters used to generated the tidal prediction constituents and may +differ from the geographic values recorded elsewhere. + + + + + + + +### func [Lookup](/src/target/tides.go?s=1508:1538#L49) +``` go +func Lookup(code string) *Tide +``` +Lookup will return a Tide pointer for the requested site code. +A nil pointer will be returned if a code cannot be found. + + + + + +### func (Tide) [Zone](/src/target/tides.go?s=1311:1339#L43) +``` go +func (t Tide) Zone() float64 +``` +Zone provides a conversion of the time zone parameter for use with common tidal +prediction software. + + + + + + + + +- - - +Generated by [godoc2md](http://godoc.org/github.com/davecheney/godoc2md) diff --git a/tides/auto.go b/tides/auto.go new file mode 100644 index 000000000..f0b4a8838 --- /dev/null +++ b/tides/auto.go @@ -0,0 +1,2414 @@ +package tides + +/* + * WARNING: CODE GENERATED AUTOMATICALLY. + * + * To update: run "go generate" in the tide directory and + * commit any changes to the generated files. + * + * THIS FILE SHOULD NOT BE EDITED BY HAND. + * + */ + +var _tides = map[string]Tide{ + + "AUCT": { + Code: "AUCT", + Network: "TG", + Number: "363", + TimeZone: 180, + Latitude: 36.5, + Longitude: 174.47, + Crex: "-3683144 17478654 AUCT", + Constituents: []Constituent{ + + { + Name: "Z0", + Amplitude: 186.2448, + Lag: 0, + }, + + { + Name: "SA", + Amplitude: 3.8781, + Lag: 112.03, + }, + + { + Name: "O1", + Amplitude: 1.7004, + Lag: 129.97, + }, + + { + Name: "P1", + Amplitude: 2.3003, + Lag: 170.28, + }, + + { + Name: "K1", + Amplitude: 7.033, + Lag: 175.54, + }, + + { + Name: "EPS2", + Amplitude: 0.7139, + Lag: 144.26, + }, + + { + Name: "2N2", + Amplitude: 2.9473, + Lag: 149.14, + }, + + { + Name: "MU2", + Amplitude: 3.2652, + Lag: 157.63, + }, + + { + Name: "N2", + Amplitude: 23.3629, + Lag: 172.04, + }, + + { + Name: "NU2", + Amplitude: 4.5124, + Lag: 175.16, + }, + + { + Name: "H1", + Amplitude: 0.8018, + Lag: 121.68, + }, + + { + Name: "M2", + Amplitude: 114.3039, + Lag: 204.7, + }, + + { + Name: "LDA2", + Amplitude: 1.0073, + Lag: 215.52, + }, + + { + Name: "L2", + Amplitude: 2.7755, + Lag: 223.51, + }, + + { + Name: "T2", + Amplitude: 1.4558, + Lag: 310.15, + }, + + { + Name: "S2", + Amplitude: 17.6408, + Lag: 276.08, + }, + + { + Name: "K2", + Amplitude: 4.2893, + Lag: 264.95, + }, + + { + Name: "M3", + Amplitude: 1.3673, + Lag: 203.22, + }, + + { + Name: "SK3", + Amplitude: 1.3465, + Lag: 340.68, + }, + + { + Name: "MN4", + Amplitude: 0.6515, + Lag: 99.46, + }, + + { + Name: "M4", + Amplitude: 2.5989, + Lag: 116.36, + }, + + { + Name: "MS4", + Amplitude: 1.3002, + Lag: 217.92, + }, + + { + Name: "2MN6", + Amplitude: 0.7282, + Lag: 249.37, + }, + + { + Name: "M6", + Amplitude: 1.2431, + Lag: 288.19, + }, + + { + Name: "2MS6", + Amplitude: 0.4797, + Lag: 303.58, + }, + + { + Name: "M8", + Amplitude: 0.5229, + Lag: 232.85, + }, + }, + }, + + "CHIT": { + Code: "CHIT", + Network: "TG", + Number: "352", + TimeZone: 180, + Latitude: 44.02, + Longitude: 176.22, + Crex: "-4402404 -17636748 CHIT", + Constituents: []Constituent{ + + { + Name: "Z0", + Amplitude: 281.9627, + Lag: 0, + }, + + { + Name: "Q1", + Amplitude: 0.5506, + Lag: 346.94, + }, + + { + Name: "O1", + Amplitude: 2.1752, + Lag: 340.81, + }, + + { + Name: "NO1", + Amplitude: 0.5028, + Lag: 81, + }, + + { + Name: "K1", + Amplitude: 1.8459, + Lag: 71.91, + }, + + { + Name: "MU2", + Amplitude: 1.3109, + Lag: 57.42, + }, + + { + Name: "N2", + Amplitude: 10.7514, + Lag: 100.13, + }, + + { + Name: "M2", + Amplitude: 46.9906, + Lag: 136.69, + }, + + { + Name: "S2", + Amplitude: 1.9529, + Lag: 236.94, + }, + + { + Name: "MO3", + Amplitude: 0.2862, + Lag: 260.88, + }, + + { + Name: "2MK5", + Amplitude: 0.2592, + Lag: 292.52, + }, + }, + }, + + "CHST": { + Code: "CHST", + Network: "TG", + Number: "407", + TimeZone: 180, + Latitude: 41.54, + Longitude: 171.26, + Crex: "-4190301 17143411 CHST", + Constituents: []Constituent{ + + { + Name: "Z0", + Amplitude: 241.3055, + Lag: 0, + }, + + { + Name: "Q1", + Amplitude: 1.1179, + Lag: 19.86, + }, + + { + Name: "O1", + Amplitude: 3.006, + Lag: 45.04, + }, + + { + Name: "K1", + Amplitude: 2.0385, + Lag: 171.85, + }, + + { + Name: "2N2", + Amplitude: 3.3697, + Lag: 262.96, + }, + + { + Name: "MU2", + Amplitude: 3.2984, + Lag: 274.32, + }, + + { + Name: "N2", + Amplitude: 22.0065, + Lag: 287.35, + }, + + { + Name: "NU2", + Amplitude: 4.2226, + Lag: 289.84, + }, + + { + Name: "M2", + Amplitude: 106.9059, + Lag: 308.06, + }, + + { + Name: "L2", + Amplitude: 3.0678, + Lag: 324.78, + }, + + { + Name: "T2", + Amplitude: 1.6444, + Lag: 1.58, + }, + + { + Name: "S2", + Amplitude: 27.6077, + Lag: 346.51, + }, + + { + Name: "K2", + Amplitude: 7.8118, + Lag: 338.56, + }, + + { + Name: "SK3", + Amplitude: 0.532, + Lag: 136.75, + }, + + { + Name: "M6", + Amplitude: 0.791, + Lag: 22.5, + }, + + { + Name: "2MS6", + Amplitude: 1.0329, + Lag: 104.47, + }, + }, + }, + + "CPIT": { + Code: "CPIT", + Network: "TG", + Number: "313", + TimeZone: 180, + Latitude: 40.55, + Longitude: 176.13, + Crex: "-4089929 17623168 CPIT", + Constituents: []Constituent{ + + { + Name: "Z0", + Amplitude: 156.3866, + Lag: 0, + }, + + { + Name: "Q1", + Amplitude: 0.8068, + Lag: 9.99, + }, + + { + Name: "O1", + Amplitude: 3.0819, + Lag: 26.65, + }, + + { + Name: "P1", + Amplitude: 1.0222, + Lag: 93.39, + }, + + { + Name: "S1", + Amplitude: 0.4633, + Lag: 228.36, + }, + + { + Name: "K1", + Amplitude: 3.1159, + Lag: 99.48, + }, + + { + Name: "EPS2", + Amplitude: 0.582, + Lag: 62.77, + }, + + { + Name: "2N2", + Amplitude: 2.2475, + Lag: 78.61, + }, + + { + Name: "MU2", + Amplitude: 2.26, + Lag: 79.39, + }, + + { + Name: "N2", + Amplitude: 14.3866, + Lag: 105.5, + }, + + { + Name: "NU2", + Amplitude: 2.7041, + Lag: 112.94, + }, + + { + Name: "H1", + Amplitude: 0.5816, + Lag: 43.96, + }, + + { + Name: "M2", + Amplitude: 63.2718, + Lag: 146.91, + }, + + { + Name: "LDA2", + Amplitude: 0.4427, + Lag: 162.88, + }, + + { + Name: "L2", + Amplitude: 2.2918, + Lag: 197.26, + }, + + { + Name: "T2", + Amplitude: 0.7059, + Lag: 291.38, + }, + + { + Name: "S2", + Amplitude: 2.7174, + Lag: 228.36, + }, + + { + Name: "K2", + Amplitude: 0.4287, + Lag: 172.82, + }, + + { + Name: "MO3", + Amplitude: 0.2572, + Lag: 324.87, + }, + + { + Name: "M3", + Amplitude: 0.4612, + Lag: 156.92, + }, + + { + Name: "SO3", + Amplitude: 0.1932, + Lag: 74.78, + }, + + { + Name: "SK3", + Amplitude: 0.3169, + Lag: 277.67, + }, + + { + Name: "MN4", + Amplitude: 0.2732, + Lag: 106.69, + }, + + { + Name: "M4", + Amplitude: 0.4454, + Lag: 146.35, + }, + + { + Name: "MS4", + Amplitude: 0.0943, + Lag: 165.66, + }, + + { + Name: "S4", + Amplitude: 0.1067, + Lag: 206.41, + }, + + { + Name: "M6", + Amplitude: 0.1033, + Lag: 93.61, + }, + + { + Name: "2MS6", + Amplitude: 0.1234, + Lag: 183.87, + }, + }, + }, + + "GBIT": { + Code: "GBIT", + Network: "TG", + Number: "371", + TimeZone: 180, + Latitude: 36.11, + Longitude: 175.29, + Crex: "-3618905 17548887 GBIT", + Constituents: []Constituent{ + + { + Name: "Z0", + Amplitude: 576.5416, + Lag: 0, + }, + + { + Name: "SA", + Amplitude: 6.2418, + Lag: 128.1, + }, + + { + Name: "O1", + Amplitude: 1.3198, + Lag: 125.51, + }, + + { + Name: "P1", + Amplitude: 1.6012, + Lag: 161.65, + }, + + { + Name: "K1", + Amplitude: 5.7465, + Lag: 169.47, + }, + + { + Name: "J1", + Amplitude: 0.473, + Lag: 190.1, + }, + + { + Name: "EPS2", + Amplitude: 0.5373, + Lag: 111.62, + }, + + { + Name: "2N2", + Amplitude: 2.0005, + Lag: 133.47, + }, + + { + Name: "MU2", + Amplitude: 2.2433, + Lag: 132.77, + }, + + { + Name: "N2", + Amplitude: 15.8293, + Lag: 162.8, + }, + + { + Name: "NU2", + Amplitude: 3.1929, + Lag: 163.77, + }, + + { + Name: "H1", + Amplitude: 0.652, + Lag: 132.08, + }, + + { + Name: "M2", + Amplitude: 78.2303, + Lag: 194.67, + }, + + { + Name: "LDA2", + Amplitude: 0.248, + Lag: 216.42, + }, + + { + Name: "L2", + Amplitude: 2.0753, + Lag: 274.03, + }, + + { + Name: "T2", + Amplitude: 0.9781, + Lag: 298.31, + }, + + { + Name: "S2", + Amplitude: 11.3867, + Lag: 265.12, + }, + + { + Name: "K2", + Amplitude: 2.7357, + Lag: 252.56, + }, + + { + Name: "M3", + Amplitude: 0.5029, + Lag: 187.16, + }, + + { + Name: "SK3", + Amplitude: 0.4444, + Lag: 331.2, + }, + + { + Name: "M4", + Amplitude: 0.2162, + Lag: 235.47, + }, + }, + }, + + "GIST": { + Code: "GIST", + Network: "TG", + Number: "78", + TimeZone: 180, + Latitude: 38.4, + Longitude: 178.02, + Crex: "-3867541 17802288 GIST", + Constituents: []Constituent{ + + { + Name: "Z0", + Amplitude: 122.83, + Lag: 0, + }, + + { + Name: "O1", + Amplitude: 1.2133, + Lag: 84.85, + }, + + { + Name: "P1", + Amplitude: 1.5217, + Lag: 155.55, + }, + + { + Name: "S1", + Amplitude: 1.2203, + Lag: 258.04, + }, + + { + Name: "K1", + Amplitude: 4.124, + Lag: 157.74, + }, + + { + Name: "EPS2", + Amplitude: 0.6472, + Lag: 70, + }, + + { + Name: "2N2", + Amplitude: 2.005, + Lag: 97.72, + }, + + { + Name: "MU2", + Amplitude: 2.0504, + Lag: 100.01, + }, + + { + Name: "N2", + Amplitude: 14.1895, + Lag: 123.49, + }, + + { + Name: "NU2", + Amplitude: 2.7409, + Lag: 130.76, + }, + + { + Name: "H1", + Amplitude: 0.7865, + Lag: 73.77, + }, + + { + Name: "M2", + Amplitude: 64.0412, + Lag: 163.89, + }, + + { + Name: "L2", + Amplitude: 2.433, + Lag: 201.14, + }, + + { + Name: "T2", + Amplitude: 0.7684, + Lag: 294.53, + }, + + { + Name: "S2", + Amplitude: 4.963, + Lag: 254.9, + }, + + { + Name: "K2", + Amplitude: 0.92, + Lag: 234.57, + }, + + { + Name: "M3", + Amplitude: 0.4629, + Lag: 167, + }, + }, + }, + + "KAIT": { + Code: "KAIT", + Network: "TG", + Number: "106", + TimeZone: 180, + Latitude: 42.25, + Longitude: 173.42, + Crex: "-4241288 17370277 KAIT", + Constituents: []Constituent{ + + { + Name: "Z0", + Amplitude: 107.6, + Lag: 0, + }, + + { + Name: "2Q1", + Amplitude: 0.3485, + Lag: 348.01, + }, + + { + Name: "Q1", + Amplitude: 1.0443, + Lag: 21.05, + }, + + { + Name: "O1", + Amplitude: 3.7728, + Lag: 39.91, + }, + + { + Name: "P1", + Amplitude: 1.2025, + Lag: 84.03, + }, + + { + Name: "S1", + Amplitude: 0.7756, + Lag: 249.61, + }, + + { + Name: "K1", + Amplitude: 3.5816, + Lag: 92.16, + }, + + { + Name: "EPS2", + Amplitude: 0.5174, + Lag: 36.21, + }, + + { + Name: "2N2", + Amplitude: 2.1596, + Lag: 58.33, + }, + + { + Name: "MU2", + Amplitude: 2.3646, + Lag: 66.39, + }, + + { + Name: "N2", + Amplitude: 14.5616, + Lag: 95.19, + }, + + { + Name: "NU2", + Amplitude: 2.8618, + Lag: 99.84, + }, + + { + Name: "H1", + Amplitude: 0.8941, + Lag: 349.09, + }, + + { + Name: "M2", + Amplitude: 64.718, + Lag: 134.03, + }, + + { + Name: "H2", + Amplitude: 0.7224, + Lag: 356.63, + }, + + { + Name: "LDA2", + Amplitude: 0.4588, + Lag: 140.08, + }, + + { + Name: "L2", + Amplitude: 1.7848, + Lag: 189.49, + }, + + { + Name: "T2", + Amplitude: 0.7229, + Lag: 283.32, + }, + + { + Name: "S2", + Amplitude: 2.5611, + Lag: 169.44, + }, + + { + Name: "K2", + Amplitude: 0.9921, + Lag: 130.57, + }, + + { + Name: "MO3", + Amplitude: 0.3681, + Lag: 339.22, + }, + + { + Name: "M3", + Amplitude: 0.3884, + Lag: 154.79, + }, + + { + Name: "SO3", + Amplitude: 0.282, + Lag: 68.01, + }, + + { + Name: "SK3", + Amplitude: 0.3675, + Lag: 288.98, + }, + + { + Name: "2MS6", + Amplitude: 0.179, + Lag: 171.97, + }, + }, + }, + + "LOTT": { + Code: "LOTT", + Network: "TG", + Number: "357", + TimeZone: 180, + Latitude: 37.33, + Longitude: 178.1, + Crex: "-3755040 17815904 LOTT", + Constituents: []Constituent{ + + { + Name: "Z0", + Amplitude: 322.4234, + Lag: 0, + }, + + { + Name: "O1", + Amplitude: 1.6056, + Lag: 133.28, + }, + + { + Name: "P1", + Amplitude: 2.2381, + Lag: 169.35, + }, + + { + Name: "K1", + Amplitude: 5.7158, + Lag: 174.41, + }, + + { + Name: "J1", + Amplitude: 0.5407, + Lag: 198.32, + }, + + { + Name: "2N2", + Amplitude: 1.8528, + Lag: 123.64, + }, + + { + Name: "MU2", + Amplitude: 2.0458, + Lag: 123.04, + }, + + { + Name: "N2", + Amplitude: 15.4855, + Lag: 150.11, + }, + + { + Name: "NU2", + Amplitude: 3.0762, + Lag: 155, + }, + + { + Name: "M2", + Amplitude: 69.4474, + Lag: 183.62, + }, + + { + Name: "L2", + Amplitude: 0.6569, + Lag: 196.08, + }, + + { + Name: "S2", + Amplitude: 9.0037, + Lag: 264.37, + }, + + { + Name: "K2", + Amplitude: 2.0797, + Lag: 249.37, + }, + + { + Name: "M3", + Amplitude: 0.4583, + Lag: 163.47, + }, + }, + }, + + "MNKT": { + Code: "MNKT", + Network: "TG", + Number: "90", + TimeZone: 180, + Latitude: 37.03, + Longitude: 174.31, + Crex: "-3704657 17451175 MNKT", + Constituents: []Constituent{ + + { + Name: "Z0", + Amplitude: 271.5374, + Lag: 0, + }, + + { + Name: "MSM", + Amplitude: 2.4209, + Lag: 132.22, + }, + + { + Name: "MM", + Amplitude: 2.7595, + Lag: 92.85, + }, + + { + Name: "MSF", + Amplitude: 1.6804, + Lag: 236.47, + }, + + { + Name: "MF", + Amplitude: 2.0731, + Lag: 57.15, + }, + + { + Name: "O1", + Amplitude: 1.4126, + Lag: 94.86, + }, + + { + Name: "P1", + Amplitude: 1.8264, + Lag: 190.15, + }, + + { + Name: "K1", + Amplitude: 5.6148, + Lag: 197.2, + }, + + { + Name: "2N2", + Amplitude: 2.7489, + Lag: 252.48, + }, + + { + Name: "MU2", + Amplitude: 2.8021, + Lag: 291.88, + }, + + { + Name: "N2", + Amplitude: 20.5731, + Lag: 268.13, + }, + + { + Name: "NU2", + Amplitude: 4.2849, + Lag: 259.92, + }, + + { + Name: "M2", + Amplitude: 108.9206, + Lag: 284.95, + }, + + { + Name: "L2", + Amplitude: 3.7672, + Lag: 301.64, + }, + + { + Name: "T2", + Amplitude: 1.8093, + Lag: 353.76, + }, + + { + Name: "S2", + Amplitude: 28.7419, + Lag: 331.9, + }, + + { + Name: "K2", + Amplitude: 7.9585, + Lag: 322.77, + }, + + { + Name: "M4", + Amplitude: 1.9089, + Lag: 62.72, + }, + + { + Name: "MS4", + Amplitude: 0.9103, + Lag: 117.11, + }, + + { + Name: "2MN6", + Amplitude: 0.5579, + Lag: 158.3, + }, + + { + Name: "M6", + Amplitude: 0.9071, + Lag: 184.18, + }, + + { + Name: "2MS6", + Amplitude: 0.8261, + Lag: 243.29, + }, + + { + Name: "2SM6", + Amplitude: 0.2891, + Lag: 293.05, + }, + }, + }, + + "NAPT": { + Code: "NAPT", + Network: "TG", + Number: "97", + TimeZone: 180, + Latitude: 39.29, + Longitude: 176.55, + Crex: "-3947566 17692007 NAPT", + Constituents: []Constituent{ + + { + Name: "Z0", + Amplitude: 93.5663, + Lag: 0, + }, + + { + Name: "Q1", + Amplitude: 0.6303, + Lag: 2.84, + }, + + { + Name: "O1", + Amplitude: 2.4184, + Lag: 29.76, + }, + + { + Name: "P1", + Amplitude: 1.0036, + Lag: 119.36, + }, + + { + Name: "S1", + Amplitude: 1.1244, + Lag: 248.57, + }, + + { + Name: "K1", + Amplitude: 3.1537, + Lag: 118.67, + }, + + { + Name: "EPS2", + Amplitude: 0.4664, + Lag: 67.53, + }, + + { + Name: "2N2", + Amplitude: 1.938, + Lag: 88.99, + }, + + { + Name: "MU2", + Amplitude: 2.3182, + Lag: 90.11, + }, + + { + Name: "N2", + Amplitude: 15.4426, + Lag: 118.8, + }, + + { + Name: "NU2", + Amplitude: 2.9327, + Lag: 122.53, + }, + + { + Name: "H1", + Amplitude: 0.6002, + Lag: 76.42, + }, + + { + Name: "M2", + Amplitude: 68.055, + Lag: 155.7, + }, + + { + Name: "L2", + Amplitude: 0.9891, + Lag: 190.43, + }, + + { + Name: "T2", + Amplitude: 0.7463, + Lag: 289.92, + }, + + { + Name: "S2", + Amplitude: 4.074, + Lag: 242.7, + }, + + { + Name: "K2", + Amplitude: 0.6126, + Lag: 210.04, + }, + + { + Name: "M3", + Amplitude: 0.4546, + Lag: 155.78, + }, + + { + Name: "SK3", + Amplitude: 0.3699, + Lag: 287.81, + }, + + { + Name: "M4", + Amplitude: 0.3403, + Lag: 191.09, + }, + }, + }, + + "NCPT": { + Code: "NCPT", + Network: "TG", + Number: "162", + TimeZone: 180, + Latitude: 34.25, + Longitude: 173.02, + Crex: "-3441483 17304870 NCPT", + Constituents: []Constituent{ + + { + Name: "Z0", + Amplitude: 432.9637, + Lag: 0, + }, + + { + Name: "O1", + Amplitude: 2.0779, + Lag: 159.53, + }, + + { + Name: "P1", + Amplitude: 2.5027, + Lag: 179.24, + }, + + { + Name: "K1", + Amplitude: 7.4575, + Lag: 189.91, + }, + + { + Name: "J1", + Amplitude: 0.5498, + Lag: 210.11, + }, + + { + Name: "2N2", + Amplitude: 1.9818, + Lag: 163.88, + }, + + { + Name: "MU2", + Amplitude: 1.976, + Lag: 166.19, + }, + + { + Name: "N2", + Amplitude: 16.4199, + Lag: 188.52, + }, + + { + Name: "NU2", + Amplitude: 3.1869, + Lag: 193.02, + }, + + { + Name: "M2", + Amplitude: 79.8633, + Lag: 218.03, + }, + + { + Name: "LDA2", + Amplitude: 0.6805, + Lag: 238.69, + }, + + { + Name: "L2", + Amplitude: 1.1228, + Lag: 240.05, + }, + + { + Name: "S2", + Amplitude: 15.2094, + Lag: 280.14, + }, + + { + Name: "K2", + Amplitude: 3.8989, + Lag: 268.37, + }, + + { + Name: "M3", + Amplitude: 0.2933, + Lag: 194.32, + }, + + { + Name: "SK3", + Amplitude: 0.3195, + Lag: 3.12, + }, + }, + }, + + "OTAT": { + Code: "OTAT", + Network: "TG", + Number: "362", + TimeZone: 180, + Latitude: 45.49, + Longitude: 170.39, + Crex: "-4581435 17062939 OTAT", + Constituents: []Constituent{ + + { + Name: "Z0", + Amplitude: 111.9086, + Lag: 0, + }, + + { + Name: "Q1", + Amplitude: 0.9754, + Lag: 37.07, + }, + + { + Name: "O1", + Amplitude: 2.8872, + Lag: 51.83, + }, + + { + Name: "P1", + Amplitude: 0.9447, + Lag: 91.55, + }, + + { + Name: "K1", + Amplitude: 2.6964, + Lag: 90.12, + }, + + { + Name: "EPS2", + Amplitude: 0.3992, + Lag: 27.22, + }, + + { + Name: "2N2", + Amplitude: 2.3698, + Lag: 41.01, + }, + + { + Name: "MU2", + Amplitude: 2.0833, + Lag: 48.64, + }, + + { + Name: "N2", + Amplitude: 17.78, + Lag: 70.29, + }, + + { + Name: "NU2", + Amplitude: 3.4956, + Lag: 73.37, + }, + + { + Name: "H1", + Amplitude: 0.6899, + Lag: 13.77, + }, + + { + Name: "M2", + Amplitude: 77.428, + Lag: 99.4, + }, + + { + Name: "H2", + Amplitude: 0.4902, + Lag: 327.52, + }, + + { + Name: "LDA2", + Amplitude: 0.8605, + Lag: 78.8, + }, + + { + Name: "L2", + Amplitude: 2.5239, + Lag: 94.93, + }, + + { + Name: "S2", + Amplitude: 9.6171, + Lag: 110.44, + }, + + { + Name: "K2", + Amplitude: 3.1924, + Lag: 98.01, + }, + + { + Name: "SK3", + Amplitude: 0.5901, + Lag: 294.85, + }, + + { + Name: "MN4", + Amplitude: 0.8293, + Lag: 196.54, + }, + + { + Name: "M4", + Amplitude: 1.1298, + Lag: 200.29, + }, + + { + Name: "MS4", + Amplitude: 0.4152, + Lag: 198.34, + }, + + { + Name: "2MN6", + Amplitude: 0.9237, + Lag: 264.7, + }, + + { + Name: "M6", + Amplitude: 1.5875, + Lag: 299.93, + }, + + { + Name: "2MS6", + Amplitude: 0.4971, + Lag: 311.97, + }, + + { + Name: "M8", + Amplitude: 0.2221, + Lag: 83.27, + }, + }, + }, + + "PUYT": { + Code: "PUYT", + Network: "TG", + Number: "355", + TimeZone: 180, + Latitude: 46.05, + Longitude: 166.35, + Crex: "-4608478 16658941 PUYT", + Constituents: []Constituent{ + + { + Name: "Z0", + Amplitude: 622.0381, + Lag: 0, + }, + + { + Name: "Q1", + Amplitude: 1.3092, + Lag: 15.22, + }, + + { + Name: "O1", + Amplitude: 3.5668, + Lag: 55.65, + }, + + { + Name: "P1", + Amplitude: 0.7953, + Lag: 112.15, + }, + + { + Name: "K1", + Amplitude: 2.8795, + Lag: 132.31, + }, + + { + Name: "EPS2", + Amplitude: 0.7567, + Lag: 272.75, + }, + + { + Name: "2N2", + Amplitude: 2.5772, + Lag: 286.01, + }, + + { + Name: "MU2", + Amplitude: 2.8693, + Lag: 295.34, + }, + + { + Name: "N2", + Amplitude: 17.5359, + Lag: 316.89, + }, + + { + Name: "NU2", + Amplitude: 3.2478, + Lag: 316.79, + }, + + { + Name: "H1", + Amplitude: 0.6575, + Lag: 273.18, + }, + + { + Name: "M2", + Amplitude: 78.2863, + Lag: 337.96, + }, + + { + Name: "H2", + Amplitude: 0.7376, + Lag: 234.65, + }, + + { + Name: "LDA2", + Amplitude: 0.7338, + Lag: 333.63, + }, + + { + Name: "L2", + Amplitude: 1.3218, + Lag: 352.56, + }, + + { + Name: "T2", + Amplitude: 0.9637, + Lag: 29.05, + }, + + { + Name: "S2", + Amplitude: 18.704, + Lag: 14, + }, + + { + Name: "K2", + Amplitude: 5.1745, + Lag: 3.54, + }, + + { + Name: "M3", + Amplitude: 0.2856, + Lag: 191.52, + }, + + { + Name: "SK3", + Amplitude: 0.338, + Lag: 208.78, + }, + + { + Name: "M4", + Amplitude: 0.2844, + Lag: 192.89, + }, + + { + Name: "2MS6", + Amplitude: 0.2441, + Lag: 136.69, + }, + }, + }, + + "RBCT": { + Code: "RBCT", + Network: "TG", + Number: "367", + TimeZone: 180, + Latitude: 29.17, + Longitude: -177.54, + Crex: "-2928002 -17789440 RBCT", + Constituents: []Constituent{ + + { + Name: "Z0", + Amplitude: 394.7686, + Lag: 0, + }, + + { + Name: "MM", + Amplitude: 2.4847, + Lag: 69.9, + }, + + { + Name: "O1", + Amplitude: 2.9761, + Lag: 208.52, + }, + + { + Name: "K1", + Amplitude: 5.7027, + Lag: 228.32, + }, + + { + Name: "MU2", + Amplitude: 2.7986, + Lag: 124.25, + }, + + { + Name: "N2", + Amplitude: 12.4652, + Lag: 160.72, + }, + + { + Name: "M2", + Amplitude: 51.0005, + Lag: 195.61, + }, + + { + Name: "S2", + Amplitude: 7.1953, + Lag: 291.88, + }, + + { + Name: "M3", + Amplitude: 0.4157, + Lag: 205.91, + }, + + { + Name: "MN4", + Amplitude: 0.2634, + Lag: 204.55, + }, + + { + Name: "M4", + Amplitude: 0.3722, + Lag: 246.23, + }, + }, + }, + + "RFRT": { + Code: "RFRT", + Network: "TG", + Number: "198", + TimeZone: 180, + Latitude: 29.15, + Longitude: -177.55, + Crex: "-2925114 -17790384 RFRT", + Constituents: []Constituent{ + + { + Name: "Z0", + Amplitude: 272.0115, + Lag: 0, + }, + + { + Name: "O1", + Amplitude: 2.1801, + Lag: 204.63, + }, + + { + Name: "P1", + Amplitude: 1.781, + Lag: 113.24, + }, + + { + Name: "K1", + Amplitude: 5.941, + Lag: 211.88, + }, + + { + Name: "2N2", + Amplitude: 1.2662, + Lag: 128.22, + }, + + { + Name: "MU2", + Amplitude: 1.565, + Lag: 127.41, + }, + + { + Name: "N2", + Amplitude: 11.2711, + Lag: 161.39, + }, + + { + Name: "NU2", + Amplitude: 2.1586, + Lag: 164.4, + }, + + { + Name: "M2", + Amplitude: 53.2427, + Lag: 195.03, + }, + + { + Name: "S2", + Amplitude: 8.2156, + Lag: 280.72, + }, + + { + Name: "K2", + Amplitude: 1.9792, + Lag: 274.41, + }, + + { + Name: "M3", + Amplitude: 0.415, + Lag: 191.37, + }, + }, + }, + + "SUMT": { + Code: "SUMT", + Network: "TG", + Number: "370", + TimeZone: 180, + Latitude: 43.34, + Longitude: 172.46, + Crex: "-4357010 17277383 SUMT", + Constituents: []Constituent{ + + { + Name: "Z0", + Amplitude: 11.2714, + Lag: 0, + }, + + { + Name: "Q1", + Amplitude: 0.7754, + Lag: 48.24, + }, + + { + Name: "O1", + Amplitude: 2.5452, + Lag: 51.28, + }, + + { + Name: "P1", + Amplitude: 1.4832, + Lag: 100.01, + }, + + { + Name: "S1", + Amplitude: 1.0575, + Lag: 212.93, + }, + + { + Name: "K1", + Amplitude: 4.6079, + Lag: 94.68, + }, + + { + Name: "EPS2", + Amplitude: 0.6091, + Lag: 40.74, + }, + + { + Name: "2N2", + Amplitude: 2.6123, + Lag: 59.35, + }, + + { + Name: "MU2", + Amplitude: 2.9501, + Lag: 60.91, + }, + + { + Name: "N2", + Amplitude: 19.1924, + Lag: 89.65, + }, + + { + Name: "NU2", + Amplitude: 3.6012, + Lag: 93.93, + }, + + { + Name: "M2", + Amplitude: 83.4363, + Lag: 125.55, + }, + + { + Name: "L2", + Amplitude: 1.8929, + Lag: 160.28, + }, + + { + Name: "S2", + Amplitude: 5.4494, + Lag: 151.84, + }, + + { + Name: "K2", + Amplitude: 1.826, + Lag: 121.83, + }, + + { + Name: "SK3", + Amplitude: 0.5647, + Lag: 278.57, + }, + + { + Name: "M4", + Amplitude: 0.5722, + Lag: 72.95, + }, + + { + Name: "MS4", + Amplitude: 0.3989, + Lag: 132.34, + }, + + { + Name: "M6", + Amplitude: 0.6521, + Lag: 80.38, + }, + + { + Name: "2MS6", + Amplitude: 0.6001, + Lag: 148.12, + }, + }, + }, + + "TAUT": { + Code: "TAUT", + Network: "TG", + Number: "73", + TimeZone: 180, + Latitude: 37.39, + Longitude: 176.11, + Crex: "-3764109 17618118 TAUT", + Constituents: []Constituent{ + + { + Name: "Z0", + Amplitude: 103.8549, + Lag: 0, + }, + + { + Name: "SA", + Amplitude: 3.8358, + Lag: 111.75, + }, + + { + Name: "O1", + Amplitude: 1.3311, + Lag: 132.24, + }, + + { + Name: "P1", + Amplitude: 1.6652, + Lag: 176.73, + }, + + { + Name: "S1", + Amplitude: 0.5511, + Lag: 247.93, + }, + + { + Name: "K1", + Amplitude: 5.3781, + Lag: 180.96, + }, + + { + Name: "J1", + Amplitude: 0.3675, + Lag: 212.91, + }, + + { + Name: "2N2", + Amplitude: 1.7845, + Lag: 141.53, + }, + + { + Name: "MU2", + Amplitude: 1.6915, + Lag: 158.27, + }, + + { + Name: "N2", + Amplitude: 14.2833, + Lag: 165.09, + }, + + { + Name: "NU2", + Amplitude: 2.7682, + Lag: 166.84, + }, + + { + Name: "M2", + Amplitude: 70.1175, + Lag: 199.04, + }, + + { + Name: "LDA2", + Amplitude: 0.7923, + Lag: 213.96, + }, + + { + Name: "L2", + Amplitude: 2.4379, + Lag: 220.38, + }, + + { + Name: "T2", + Amplitude: 0.7983, + Lag: 311.91, + }, + + { + Name: "S2", + Amplitude: 8.73, + Lag: 278.6, + }, + + { + Name: "K2", + Amplitude: 2.0518, + Lag: 267.65, + }, + + { + Name: "MSN2", + Amplitude: 0.1916, + Lag: 116.25, + }, + + { + Name: "MO3", + Amplitude: 0.2406, + Lag: 37.16, + }, + + { + Name: "M3", + Amplitude: 0.458, + Lag: 193, + }, + + { + Name: "MK3", + Amplitude: 0.3188, + Lag: 162.97, + }, + + { + Name: "SK3", + Amplitude: 0.3649, + Lag: 321.24, + }, + + { + Name: "MN4", + Amplitude: 0.8921, + Lag: 172.11, + }, + + { + Name: "M4", + Amplitude: 1.9453, + Lag: 203.79, + }, + + { + Name: "MS4", + Amplitude: 0.4649, + Lag: 293.63, + }, + + { + Name: "2MK5", + Amplitude: 0.1509, + Lag: 230.46, + }, + + { + Name: "2MN6", + Amplitude: 0.6261, + Lag: 232.01, + }, + + { + Name: "M6", + Amplitude: 1.2038, + Lag: 267.17, + }, + + { + Name: "2MS6", + Amplitude: 0.2655, + Lag: 348.54, + }, + + { + Name: "M8", + Amplitude: 0.2489, + Lag: 199.77, + }, + }, + }, + + "WLGT": { + Code: "WLGT", + Network: "TG", + Number: "71", + TimeZone: 180, + Latitude: 41.17, + Longitude: 174.47, + Crex: "-4128448 17477985 WLGT", + Constituents: []Constituent{ + + { + Name: "Z0", + Amplitude: 108.3282, + Lag: 0, + }, + + { + Name: "Q1", + Amplitude: 0.9496, + Lag: 6.46, + }, + + { + Name: "O1", + Amplitude: 3.1988, + Lag: 28.22, + }, + + { + Name: "P1", + Amplitude: 0.9666, + Lag: 83.63, + }, + + { + Name: "K1", + Amplitude: 2.538, + Lag: 88.25, + }, + + { + Name: "2N2", + Amplitude: 1.5607, + Lag: 63.52, + }, + + { + Name: "MU2", + Amplitude: 1.8484, + Lag: 68.29, + }, + + { + Name: "N2", + Amplitude: 12.1684, + Lag: 96.37, + }, + + { + Name: "NU2", + Amplitude: 2.2328, + Lag: 101.88, + }, + + { + Name: "H1", + Amplitude: 0.5161, + Lag: 125.27, + }, + + { + Name: "M2", + Amplitude: 49.1058, + Lag: 136.28, + }, + + { + Name: "H2", + Amplitude: 0.5215, + Lag: 107.7, + }, + + { + Name: "L2", + Amplitude: 0.7445, + Lag: 151.97, + }, + + { + Name: "T2", + Amplitude: 0.7202, + Lag: 316.02, + }, + + { + Name: "S2", + Amplitude: 2.5238, + Lag: 351.12, + }, + + { + Name: "K2", + Amplitude: 0.966, + Lag: 28.22, + }, + + { + Name: "MO3", + Amplitude: 0.2923, + Lag: 359.52, + }, + + { + Name: "M3", + Amplitude: 0.6959, + Lag: 174.18, + }, + + { + Name: "SO3", + Amplitude: 0.3806, + Lag: 93.1, + }, + + { + Name: "MK3", + Amplitude: 0.346, + Lag: 141.6, + }, + + { + Name: "SK3", + Amplitude: 0.4333, + Lag: 213, + }, + + { + Name: "MN4", + Amplitude: 0.3199, + Lag: 217.66, + }, + + { + Name: "M4", + Amplitude: 0.9474, + Lag: 252.51, + }, + + { + Name: "MS4", + Amplitude: 0.5105, + Lag: 314.85, + }, + + { + Name: "2MN6", + Amplitude: 0.2465, + Lag: 46.05, + }, + + { + Name: "M6", + Amplitude: 0.45, + Lag: 98.33, + }, + + { + Name: "2MS6", + Amplitude: 0.4391, + Lag: 159.8, + }, + }, + }, +} diff --git a/tides/generate/main.go b/tides/generate/main.go new file mode 100644 index 000000000..09d981958 --- /dev/null +++ b/tides/generate/main.go @@ -0,0 +1,125 @@ +package main + +import ( + "bytes" + "flag" + "fmt" + "os" + "text/template" + + "github.com/GeoNet/delta/internal/metadb" + "github.com/GeoNet/delta/meta" +) + +const tmpl = ` +package tides + +/* + * WARNING: CODE GENERATED AUTOMATICALLY. + * + * To update: run "go generate" in the tide directory and + * commit any changes to the generated files. + * + * THIS FILE SHOULD NOT BE EDITED BY HAND. + * + */ + + +var _tides = map[string]Tide{ +{{ range $s := .}} +"{{$s.Gauge.Code}}": { +Code: "{{$s.Gauge.Code}}", +Network: "{{$s.Gauge.Network}}", +Number: "{{$s.Gauge.Number}}", +TimeZone: {{$s.Gauge.TimeZone}}, +Latitude: {{$s.Gauge.Latitude}}, +Longitude: {{$s.Gauge.Longitude}}, +Crex: "{{$s.Gauge.Crex}}", +Constituents: []Constituent{ +{{ range $c := $s.Constituents}} +{ +Name: "{{$c.Name}}", +Amplitude: {{$c.Amplitude}}, +Lag: {{$c.Lag}}, +}, +{{end}} +}, +}, +{{ end }} +} + +` + +// Tide represents a model of the tidal parameters at a recording station +// together with the installed datalogger pairs, allowing for multiple sensors +// at the same time but different locations. +type Tide struct { + Gauge meta.Gauge + Constituents []meta.Constituent +} + +func main() { + + flag.Usage = func() { + fmt.Fprintf(os.Stderr, "\n") + fmt.Fprintf(os.Stderr, "Provide an auto generated go tide file\n") + fmt.Fprintf(os.Stderr, "\n") + fmt.Fprintf(os.Stderr, "Usage:\n") + fmt.Fprintf(os.Stderr, "\n") + fmt.Fprintf(os.Stderr, " %s [options]\n", os.Args[0]) + fmt.Fprintf(os.Stderr, "\n") + fmt.Fprintf(os.Stderr, "General Options:\n") + fmt.Fprintf(os.Stderr, "\n") + flag.PrintDefaults() + } + + var base string + flag.StringVar(&base, "base", "..", "base of delta files on disk") + + flag.Parse() + + // load delta meta helper + db := metadb.NewMetaDB(base) + + // build the set of known tidal + tides := make(map[string]Tide) + + // recover linz tide gauge sites + gauges, err := db.Gauges() + if err != nil { + fmt.Fprintf(os.Stderr, "problem loading gauges from db %s: %v\n", base, err) + os.Exit(1) + } + + // for each linz gauge site + for _, gauge := range gauges { + + // and the associated linz tidal constituents + constituents, err := db.GaugeConstituents(gauge.Code) + if err != nil { + fmt.Fprintf(os.Stderr, "problem loading constituents from db %s [%s]: %v\n", base, gauge.Code, err) + os.Exit(1) + } + + // remember this tide + tides[gauge.Code] = Tide{ + Gauge: gauge, + //Station: *station, + Constituents: constituents, + } + } + + tmpl, err := template.New("config").Parse(string(tmpl)) + if err != nil { + fmt.Fprintf(os.Stderr, "problem compiling template: %v\n", err) + os.Exit(1) + } + + var res bytes.Buffer + if err := tmpl.Execute(&res, tides); err != nil { + fmt.Fprintf(os.Stderr, "problem parsing template: %v\n", err) + os.Exit(1) + } + + fmt.Fprintln(os.Stdout, res.String()) +} diff --git a/tides/tides.go b/tides/tides.go new file mode 100644 index 000000000..6ca1da140 --- /dev/null +++ b/tides/tides.go @@ -0,0 +1,54 @@ +// Package tides provides an embeddable mechanism for providing tidal constituents for given gauge sites +// that can be used for tide predication. +package tides + +import ( + "fmt" + "strings" +) + +//go:generate bash -c "go run generate/*.go | gofmt -s > auto.go; test -s auto.go || rm auto.go" + +// Constitutent stores the calculated amplotude and lag for a named tidal phase, the amplitude +// and lag are given in units of meters and degrees respectively. +type Constituent struct { + Name string + Amplitude float64 + Lag float64 +} + +// String provides a standard representation of the tidal constituent. +func (c Constituent) String() string { + return fmt.Sprintf("%s/%g/%g", c.Name, c.Amplitude, c.Lag) +} + +// Tide provides the general parameters needed to predict tides at a given site and the +// associated tidal consitituents. The TimeZone, Latitude, and Longitude are expected +// to be the parameters used to generated the tidal prediction constituents and may +// differ from the geographic values recorded elsewhere. +type Tide struct { + Code string + Network string + Number string + TimeZone float64 + Latitude float64 + Longitude float64 + Crex string + + Constituents []Constituent +} + +// Zone provides a conversion of the time zone parameter for use with common tidal +// prediction software. +func (t Tide) Zone() float64 { + return (360.0 - t.TimeZone) / 15.0 +} + +// Lookup will return a Tide pointer for the requested site code. +// A nil pointer will be returned if a code cannot be found. +func Lookup(code string) *Tide { + if t, ok := _tides[strings.ToUpper(code)]; ok { + return &t + } + return nil +} diff --git a/tides/tides_test.go b/tides/tides_test.go new file mode 100644 index 000000000..6c30d0750 --- /dev/null +++ b/tides/tides_test.go @@ -0,0 +1,26 @@ +package tides + +import ( + "reflect" + "testing" +) + +func TestTide(t *testing.T) { + for _, g := range _tides { + t.Run("check gauge: "+g.Code, func(t *testing.T) { + r := Lookup(g.Code) + if r == nil { + t.Fatalf("unable to lookup tide: %s", g.Code) + } + if !reflect.DeepEqual(&g, r) { + t.Errorf("unable to match tide: expected %v, found %v", g, r) + } + }) + } + + t.Run("check bad gauge", func(t *testing.T) { + if g := Lookup("XXXX"); g != nil { + t.Fatal("shouldn't be able to lookup XXXX") + } + }) +}