cpdundon_cli_app_take3 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5b48bd944597f877f8b830ac3d7b66439b15d706fa03c566b5b6946c691bde28
4
- data.tar.gz: 9b763e0b85cd1220f4aab67d52613558c425b6fd630e4a85333497e445d526f9
3
+ metadata.gz: 8747d93fdbefa5c663566af241e89f3372d242dc0ae5c84869fd34aeb7de36df
4
+ data.tar.gz: bfedcf261b3646e023e50100112c12c2e3b71d69d3ea9eadd3bbc850cc7a516d
5
5
  SHA512:
6
- metadata.gz: 6caf45a05d5af1480f2a7b012a5ad1f53e23a9ccb14a5e44dfeef90b55c7a9ba94a17a27d5e79ea5f1331317d6d0ff3704e108cf775aa5fdf992e1def1b19933
7
- data.tar.gz: 6d771f3441842916b7bd7e9232ce003bcfeb6f5100c8d1e8f06f90e7a30469f032d9c73b88b0afbcb9cd5231e0088b0b9991486faddcfd520d3cbe2c9ed5790b
6
+ metadata.gz: 34adc7972f13db9fa45e86ae4484bbd3f2e3671cebac643e1e0f428a85ec486c29c7bd835623d25ae4a50c9ab7ae468c249bc6d6f5534a8c60dfbcda1c31e74a
7
+ data.tar.gz: 04d7585f2d165093e0c9fdda89b74ce7f1670d3c4bb6fc6faf05dc0aaf3e01dd74c8389f854b84aa7b074daa6cde7bf0f2bd28f98b6a7c78bef582b77977364e
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/config'
4
+
5
+ cli = CLICurrent.new
6
+ cli.main
@@ -0,0 +1,99 @@
1
+ require_relative './config'
2
+
3
+ # ========================================================
4
+ # This is proof of concept code. It can be extended
5
+ # to allow for a great deal more realistic take on
6
+ # estuary currents. CPD - 12-May-2018
7
+ # ========================================================
8
+
9
+ class CalcCurrent
10
+
11
+ include Math
12
+ attr_reader :depth_delta
13
+
14
+ Gamma = 0.005 #Tanh scale factor
15
+ Depth = 25 #Meters
16
+ Estuary_Width = 1000 #Meters
17
+ Estuary_Length = 115000 #Meters
18
+ Shaft_Radius = 5000 #Meters
19
+ Meters_Knots = 1.94384 #Meter/Sec to Knots
20
+ SixMin_Secs = 360
21
+
22
+ @@static_data = []
23
+ @@tanh_fac = nil
24
+
25
+ def self.static
26
+ @@static_data
27
+ end
28
+
29
+ def self.tanh_fac
30
+ @@tanh_fac
31
+ end
32
+
33
+ def initialize
34
+ return if self.class.static.size != 0
35
+ @@tanh_fac = tanh_normalization_factor
36
+ static_bootstrap
37
+ end
38
+
39
+ def calc_surface_current(location, depth_delta = nil)
40
+ @depth_delta = depth_delta / SixMin_Secs if !!depth_delta
41
+
42
+ return "Missisng Depth Delta information." if !!!self.depth_delta
43
+
44
+ depth = depth_from_loc(location) # this maps location to a depth from radial tdc in the river channel.
45
+
46
+ stat = self.class.static
47
+ rdh = stat.select { |e| e.depth == depth.to_i }[0]
48
+
49
+ surf_current = self.depth_delta * rdh.normalized_tanh * Estuary_Length
50
+
51
+ rdu = RiverData_Surf.new
52
+ rdu.tdc_radius = Shaft_Radius
53
+ rdu.c_velocity_ms = surf_current
54
+ rdu.c_velocity_kts = surf_current * Meters_Knots
55
+ rdu.surf_loc = location
56
+ rdu.surf_radius = rdh.depth_radius
57
+
58
+ rdu
59
+ end
60
+
61
+ private
62
+ def tanh_normalization_factor
63
+ tnf = 0
64
+ (0..Depth).each do |i|
65
+ tnf += tanh(Gamma * i)
66
+ end
67
+ tnf
68
+ end
69
+
70
+ def static_bootstrap
71
+ (0..Depth).each do |i|
72
+ rdh = RiverData_Shaft.new
73
+ rdh.depth = Depth - i
74
+ rdh.height = i
75
+ rdh.depth_radius = Shaft_Radius - i
76
+ rdh.normalized_tanh = tanh(Gamma * i) / self.class.tanh_fac
77
+ self.class.static << rdh
78
+ end
79
+ end
80
+
81
+ def depth_from_loc(loc)
82
+ r_tdc = Shaft_Radius - Depth
83
+
84
+ r_tdc2 = r_tdc ** 2
85
+ l2 = loc ** 2
86
+ r_loc = sqrt(r_tdc2 + l2)
87
+ depth = (r_loc - r_tdc).floor
88
+ depth
89
+ end
90
+
91
+ end
92
+
93
+ class RiverData_Shaft
94
+ attr_accessor :depth, :height, :depth_radius, :normalized_tanh
95
+ end
96
+
97
+ class RiverData_Surf
98
+ attr_accessor :surf_radius, :surf_loc, :c_velocity_ms, :c_velocity_kts, :tdc_radius
99
+ end
data/lib/cli.rb CHANGED
@@ -91,8 +91,8 @@ private
91
91
  wl_data = gwl.pull_data(self.tideID)
92
92
  wv_data = gwv.pull_data(self.windID)
93
93
 
94
- wl = NOAA_SOAP.most_recent(wl_data)
95
- wv = NOAA_SOAP.most_recent(wv_data)
94
+ wl = NOAA_SOAP.most_recent(wl_data)[0]
95
+ wv = NOAA_SOAP.most_recent(wv_data)[0]
96
96
 
97
97
  puts "Using #{self.windLocation}:"
98
98
  puts "Wind station time is #{wv[:time_stamp]} GMT:"
@@ -0,0 +1,121 @@
1
+ require_relative './config'
2
+
3
+ class CLICurrent
4
+
5
+ attr_accessor :windID, :tideID, :windLocation, :tideLocation
6
+
7
+ def initialize ()
8
+ @windID = nil
9
+ @tideID = nil
10
+ @windLocation = nil
11
+ @tideLocation = nil
12
+ end
13
+
14
+ def main()
15
+ input = nil
16
+
17
+ input = decision("tide")
18
+ return input if input == "exit"
19
+
20
+ input = current_cycle
21
+ input
22
+ end
23
+
24
+ private
25
+ def decision(flag)
26
+ input = nil
27
+ iCaptured = nil
28
+ puts
29
+ puts "================================="
30
+ puts "'Exit' will stop data collection."
31
+ puts "================================="
32
+
33
+ if flag.strip.downcase == "winds"
34
+ stations = GetActiveStations.winds
35
+ else
36
+ stations = GetActiveStations.water_level
37
+ end
38
+
39
+ stations = stations.sort {|x,y| x.name <=> y.name}
40
+
41
+ sz = stations.size
42
+ until (input == "exit" || iCaptured)
43
+ puts
44
+ puts "Enter the index number of the #{flag.upcase} station you want to use."
45
+ (1..sz).each do |i|
46
+ puts "#{i}. Station named '#{stations[i-1].name}'."
47
+ end
48
+ puts
49
+ puts "Enter the index number of the #{flag.upcase} station you want to use."
50
+ input = gets.strip.downcase
51
+ iCaptured = (input == input.to_i.to_s) && input.to_i > 0 && input.to_i <= sz
52
+ end
53
+
54
+ if input != "exit" && flag == "winds"
55
+ sta = stations[input.to_i - 1]
56
+ self.windLocation = sta.name
57
+ self.windID = sta.iD
58
+ elsif input != "exit"
59
+ sta = stations[input.to_i - 1]
60
+ self.tideLocation = sta.name
61
+ self.tideID = sta.iD
62
+ end
63
+
64
+ input
65
+ end
66
+
67
+ def current_cycle()
68
+ input = nil
69
+ puts
70
+ puts "======================================="
71
+ puts "'Exit' will terminate this application."
72
+ puts "======================================="
73
+ puts
74
+
75
+
76
+ gwl = GetWaterLevel.new
77
+ wl_data = gwl.pull_data(self.tideID)
78
+ wl_chg_data = NOAA_SOAP.most_recent(wl_data, 2)
79
+ wl_delta_6min = wl_chg_data[0][:wl].to_f - wl_chg_data[1][:wl].to_f
80
+ t = wl_chg_data[0][:time_stamp]
81
+
82
+ cc = CalcCurrent.new
83
+
84
+ until (input == "exit") do
85
+ puts "Enter your location in meters away from center channel (-500...500)."
86
+ puts "OR..."
87
+ puts "Enter 'New' to query NOAA for the latest water level measurement."
88
+ puts
89
+ puts "***The NOAA Service Updates Every 6 Minutes***"
90
+ puts
91
+
92
+ input = gets.strip.downcase
93
+ puts
94
+
95
+ if input == input.to_i.to_s && input.to_i >= -500 && input.to_i <= 500
96
+
97
+ rdu = cc.calc_surface_current(input.to_i, wl_delta_6min)
98
+ return "Error" if rdu.class != RiverData_Surf
99
+
100
+ kts = rdu.c_velocity_kts
101
+
102
+ puts "Using #{self.tideLocation} at #{t.slice(0, t.length-5)} GMT:"
103
+ puts "The 6 minute water level difference is #{'%.3f' %wl_delta_6min} meters:"
104
+ puts "The current #{input} meter(s) away from center channel is #{'%.2f' %kts} knots."
105
+ end
106
+
107
+ if input == "new"
108
+ gwl = GetWaterLevel.new
109
+ wl_data = gwl.pull_data(self.tideID)
110
+ wl_chg_data = NOAA_SOAP.most_recent(wl_data, 2)
111
+ wl_delta_6min = wl_chg_data[0][:wl].to_f - wl_chg_data[1][:wl].to_f
112
+ t = wl_chg_data[0][:time_stamp]
113
+ puts
114
+ puts "The new data has a time stamp of #{t.slice(0, t.length-5)} GMT."
115
+ end
116
+
117
+ puts
118
+ end
119
+ input
120
+ end
121
+ end
@@ -1,11 +1,13 @@
1
- require_relative './gmt'
2
1
  require_relative './noaa_soap'
2
+ require_relative './cli'
3
+ require_relative './cli_current'
4
+ require_relative './gmt'
3
5
  require_relative './get_water_level'
4
6
  require_relative './get_wind'
5
7
  require_relative './get_active_stations'
6
- require_relative './cli'
7
8
  require_relative './station'
9
+ require_relative './calc_current'
8
10
 
9
- require 'time'
10
- require 'savon'
11
11
  require 'nokogiri'
12
+ require 'savon'
13
+ require 'time'
@@ -6,7 +6,9 @@ module CpdundonCliAppTake3
6
6
  require 'get_water_level'
7
7
  require 'get_wind'
8
8
  require 'cli'
9
+ require 'cli_current'
9
10
  require 'config'
10
11
  require 'station'
11
12
  require 'get_active_stations'
13
+ require 'calc_current'
12
14
  end
@@ -1,3 +1,3 @@
1
1
  module CpdundonCliAppTake3
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -3,9 +3,14 @@ require_relative './config'
3
3
  class NOAA_SOAP
4
4
  attr_reader :client
5
5
 
6
- def self.most_recent(data)
7
- d = data.sort { |x,y| y[:time_stamp] <=> x[:time_stamp] }[0]
8
- d
6
+ def self.most_recent(data, count = 1)
7
+ rtn = []
8
+ d = data.sort { |x,y| y[:time_stamp] <=> x[:time_stamp] }
9
+
10
+ (1..count).each do |i|
11
+ rtn << d[i - 1]
12
+ end
13
+ rtn
9
14
  end
10
15
 
11
16
  def initialize(wsdl)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cpdundon_cli_app_take3
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christopher P. Dundon
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-11 00:00:00.000000000 Z
11
+ date: 2018-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -83,10 +83,13 @@ files:
83
83
  - README.md
84
84
  - Rakefile
85
85
  - bin/bin
86
+ - bin/bin_current
86
87
  - bin/console
87
88
  - bin/setup
88
89
  - cpdundon_cli_app_take3.gemspec
90
+ - lib/calc_current.rb
89
91
  - lib/cli.rb
92
+ - lib/cli_current.rb
90
93
  - lib/config.rb
91
94
  - lib/cpdundon_cli_app_take3.rb
92
95
  - lib/cpdundon_cli_app_take3/version.rb