Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- from scipy.optimize import curve_fit
- from vast import models
- import math
- import scipy
- import data_analysis as DA
- import operator
- import random
- class Weather:
- wind_force = None
- wind_direction = None
- wave_height = None
- wave_direction = None
- swell_height = None
- swell_direction = None
- current_speed=None
- current_direction=None
- def print_me(self):
- print "Wind force: %s,\tWind direction: %s,\tWave height: %s,\tWave direction: %s,\tSwell height: %s,\tSwell direction: %s" % (str(self.wind_force), str(self.wind_direction), str(self.wave_height), str(self.wave_direction), str(self.swell_height), str(self.swell_direction))
- def return_me(self):
- string = "Wind force: %s,\tWind direction: %s,\tWave height: %s,\tWave direction: %s,\tSwell height: %s,\tSwell direction: %s" % (str(self.wind_force), str(self.wind_direction), str(self.wave_height), str(self.wave_direction), str(self.swell_height), str(self.swell_direction))
- return string
- class Speed_Schedule: # We make a Speed_Schedule object for every 6 hours of the path
- weather = None # and initialise it with calculated values
- eco_rpm = None
- eco_speed = None
- actual_speed = None
- actual_rpm = None
- quarters_to_go = None
- distance_covered = None
- foc = None
- load_disp = None
- params_aw_speed = None
- def __init__(self, weather):
- self.weather = None # and initialise it with calculated values
- self.eco_rpm = None
- self.eco_speed = None
- self.actual_speed = None
- self.actual_rpm = None
- self.quarters_to_go = None
- self.distance_covered = None
- self.foc = None
- self.load_disp = None
- self.params_aw_speed = None
- self.weather = weather
- def print_me(self):
- print "Eco rpm: %s,\tEco speed: %s,\tActual speed: %s,\tDist covered: %s,\tFO Cons: %s" \
- % (str(self.eco_rpm), str(self.eco_speed), str(self.actual_speed), str(self.distance_covered), str(self.foc))
- def return_me(self):
- string = "Eco rpm: %s,\tEco speed: %s,\tActual speed: %s,\tDist covered: %s,\tFO Cons: %s" \
- % (str(self.eco_rpm), str(self.eco_speed), str(self.actual_speed), str(self.distance_covered), str(self.foc))
- return string
- # def find_eco_rpm(self, params_foc, params_speed):
- # self.params_foc = params_foc
- # self.params_speed = params_speed
- # x = [[], [], []] # [[rpm], [load_disp], [steaming_hours]]
- # rpm = range(60, 120)
- # for i in xrange(0, 60):
- # x[0].append( rpm[i] )
- # x[1].append( self.load_disp )
- # x[2].append( 6 )
- # x = np.array(x)
- # a1, b1, c1, d1 = params_foc
- # a2, b2, c2 = params_speed
- # # print x
- # foc = DA.fit_rpm_vs_fo_cons(x, a1, b1, c1, d1)
- # speed = DA.fit_rpm_vs_speed(x, a2, b2, c2)
- # optimum_ratio = 10000000.0
- # for i in xrange(0, 60):
- # if float(foc[i]) / float(speed[i]) < optimum_ratio:
- # optimum_ratio = float(foc[i]) / float(speed[i])
- # eco_rpm = rpm[i]
- # return float(eco_rpm)
- def find_eco_speed(self, params_fw_speed):
- x = [self.eco_rpm, self.load_disp]
- x = np.array(x)
- a1, b1, c1 = params_fw_speed
- fw_speed = DA.fit_rpm_vs_speed(x, a1, b1, c1) # fair weather eco_speed
- #print "DEBUG>>>>> fw_speed: " + str(fw_speed)
- return self.find_actual_speed(fw_speed) # actual weather eco_speed
- def find_actual_rpm(self, params_speed_rpm):
- return math.pow( (self.actual_speed / self.eco_speed), 1/params_speed_rpm[1] ) \
- * self.eco_rpm
- def find_actual_speed(self, fw_speed):
- params_aw_speed = self.params_aw_speed # actual weather speed params
- gs_theta, gw_theta, sine_theta_r = DA.theta_funcs( self.weather.wind_direction )
- wind_speed = DA.wind_force_speed( self.weather.wind_force )
- x = [fw_speed, gw_theta, self.weather.wave_height, wind_speed, sine_theta_r,
- gs_theta, self.weather.swell_height]
- #print x
- a = params_aw_speed
- aw_speed = DA.fit_speed_vs_weather(x, a)
- return aw_speed[0]
- class Voyage_Plan:
- distance = None
- total_safe_quarters = None
- weather_expected = [] # size equal to number of quarters
- speed_schedule = [] # size equal to number of quarters
- load_disp = None
- params_foc = None
- params_speed_rpm = None
- net_avg_rpm = 0.0
- total_foc = 0.0
- net_avg_speed = 0.0
- total_voyage_hours = 0
- def print_me(self):
- print "Distance: %s" % str(self.distance)
- print "Total quarters: %s" % str(self.total_safe_quarters)
- print "Load Displacement: %s" % str(self.load_disp)
- print "Total FOC: %s" % str(total_foc)
- print "Net average rpm: %s" % str(net_avg_rpm)
- print "Net average speed: %s" % str(net_avg_speed)
- for i in xrange(0, self.total_safe_quarters):
- print "\nWEATHER for quarter %d:" % (i+1)
- self.weather_expected[i].print_me()
- print "SCHEDULE for quarter %d:" % (i+1)
- self.speed_schedule[i].print_me()
- def return_me(self):
- string = "Distance: %s" % str(self.distance)
- string += "Total quarters: %s" % str(self.total_safe_quarters)
- string += "Load Displacement: %s" % str(self.load_disp)
- for i in xrange(0, self.total_safe_quarters):
- string += "\nWEATHER for quarter %d:" % (i+1)
- string += self.weather_expected[i].return_me()
- string += "SCHEDULE for quarter %d:" % (i+1)
- string += self.speed_schedule[i].return_me()
- return string
- def __init__(self, distance, total_safe_quarters, weather_expected, load_disp):
- self.distance = None
- self.total_safe_quarters = None
- self.weather_expected = [] # size equal to number of quarters
- self.speed_schedule = [] # size equal to number of quarters
- self.load_disp = None
- self.params_foc = None
- self.params_speed_rpm = None
- self.net_avg_rpm = 0.0
- self.total_foc = 0.0
- self.net_avg_speed = 0.0
- self.total_voyage_hours = 0
- self.params_foc = DA.rpm_vs_fo_cons()
- self.params_speed_rpm = DA.rpm_vs_speed()
- self.distance = distance
- self.total_safe_quarters = total_safe_quarters
- self.weather_expected = weather_expected
- self.load_disp = load_disp
- self.initialize_speed_schedule()
- def initialize_speed_schedule(self):
- parmas_fw_speed = DA.rpm_vs_speed()
- params_foc = DA.rpm_vs_fo_cons()
- params_speed = DA.rpm_vs_speed()
- eco_rpm = self.find_eco_rpm()
- params_aw_speed = DA.speed_vs_weather()
- for i in xrange(0, self.total_safe_quarters + 100):
- S = Speed_Schedule(self.weather_expected[i])
- S.quarters_to_go = self.total_safe_quarters
- S.load_disp = self.load_disp
- S.eco_rpm = eco_rpm
- # print "eco rpm"
- S.params_aw_speed = params_aw_speed
- S.eco_speed = S.find_eco_speed(parmas_fw_speed)
- # S.eco_speed = 12
- # print "eco.. speed"
- # S.actual_speed = S.find_actual_speed(S.eco_speed)
- self.speed_schedule.append(S)
- def find_eco_rpm(self):
- x = [[], [], []] # [[rpm], [load_disp], [steaming_hours]]
- rpm = range(60, 120)
- for i in xrange(0, 60):
- x[0].append( rpm[i] )
- x[1].append( self.load_disp )
- x[2].append( 6 )
- x = np.array(x)
- a1, b1, c1, d1 = self.params_foc
- a2, b2, c2 = self.params_speed_rpm
- # print x
- foc = DA.fit_rpm_vs_fo_cons(x, a1, b1, c1, d1)
- speed = DA.fit_rpm_vs_speed(x, a2, b2, c2)
- optimum_ratio = 10000000.0
- for i in xrange(0, 60):
- if float(foc[i]) / float(speed[i]) < optimum_ratio:
- optimum_ratio = float(foc[i]) / float(speed[i])
- eco_rpm = rpm[i]
- return float(eco_rpm)
- def plan_voyage_economic(self):
- eco_dist = 0
- flag, eco_dist = self.can_go_eco()
- if flag:
- dist_covered = 0.0
- for i in xrange(0, self.total_safe_quarters):
- if dist_covered > self.distance:
- break
- ss = self.speed_schedule[i]
- ss.actual_speed = ss.eco_speed
- ss.distance_covered = ss.actual_speed * 6.0 * 1.852
- dist_covered += ss.distance_covered
- ss.actual_rpm = ss.eco_rpm
- a, b, c, d = self.params_foc
- x = np.array( [ss.actual_rpm, self.load_disp, 6] )
- ss.foc = DA.fit_rpm_vs_fo_cons(x, a, b, c, d)
- self.total_foc += ss.foc
- else:
- # Plan new voyage
- ratio_denominator = 0.0
- ratios = []
- distance_split = []
- distance_left = self.distance - eco_dist
- for weather in self.weather_expected:
- if weather.wind_force < 8:
- if weather.wind_force == 0:
- weather.wind_force = 0.1
- ratio_denominator += 1.0 / weather.wind_force
- for i in xrange(0, self.total_safe_quarters):
- weather = self.weather_expected[i]
- if weather.wind_force < 8:
- ratios.append( (1.0 / weather.wind_force) / ratio_denominator)
- else:
- ratios.append(0.0)
- #print "i= %d, %d, %d" % (i-1, len(distance_split), len(ratios))
- distance_split.append( distance_left * ratios[i-1] )
- ss = self.speed_schedule[i-1]
- ss.actual_speed = ss.eco_speed + (distance_split[i-1] / 6.0/ 1.852)
- ss.distance_covered = ss.actual_speed * 6.0 * 1.852
- ss.actual_rpm = ss.find_actual_rpm(self.params_speed_rpm)
- a, b, c, d = self.params_foc
- x = np.array( [ss.actual_rpm, self.load_disp, 6] )
- ss.foc = DA.fit_rpm_vs_fo_cons(x, a, b, c, d)
- self.total_foc += ss.foc
- self.calc_net_avg()
- def plan_voyage_at_speed(self, speed):
- dist_covered = 0
- quarter = 0
- while dist_covered < self.distance:
- ss = self.speed_schedule[quarter]
- ss.actual_speed = ss.find_actual_speed( speed )
- ss.actual_rpm = ss.find_actual_rpm( self.params_speed_rpm )
- dist_covered += ss.actual_speed * 6.0 * 1.852
- ss.distance_covered = ss.actual_speed * 6.0 * 1.852
- a, b, c, d = self.params_foc
- x = np.array( [ss.actual_rpm, self.load_disp, 6] )
- ss.foc = DA.fit_rpm_vs_fo_cons(x, a, b, c, d)
- self.total_foc += ss.foc
- quarter += 1
- self.calc_net_avg()
- def calc_net_avg(self):
- ctr = 0
- for ss in self.speed_schedule:
- if (ss.actual_speed):
- ctr += 1
- self.net_avg_speed += ss.actual_speed
- self.net_avg_rpm += ss.actual_rpm
- self.total_voyage_hours += 6
- self.net_avg_rpm /= ctr
- self.net_avg_speed /= ctr
- def can_go_eco(self):
- dist = 0
- for i in xrange(0, self.total_safe_quarters):
- #self.speed_schedule[i].print_me()
- dist += self.speed_schedule[i].eco_speed * 6.0 * 1.852
- if dist > self.distance:
- return True, dist
- else:
- return False, dist
- def do_it():
- distance1 = 7776
- total_safe_quarters1 = 60
- we = []
- for i in xrange(0, 60):
- we1 = Weather()
- we1.wind_force = random.randint(1, 5)
- we1.wind_direction = random.randint(0, 360)
- we1.wave_direction = we1.wind_direction
- wind_speed = DA.wind_force_speed(we1.wind_force)
- we1.wave_height = wind_speed * 0.06
- we1.swell_height = 2
- we1.swell_direction = 1
- we.append(we1)
- load_disp = 90000
- v = Voyage_Plan(distance1, total_safe_quarters1, we, load_disp)
- v.plan_voyage_economic()
- #v.print_me()
- string = v.return_me()
- f = open( 'results', 'w')
- f.write(string)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement