1 Optimization Approach

The algorithm sweeps the parameters generation_factor and storage_capacity accross their ranges to determine the lowest cost system that maintains the hours of shortages below max_shortage_hours,

2 Model Assumptions

2.1 Model Parameters

Table 1. Model Parameters

Variable Units Description
Engineering Parameters
Energy Generation
Generation kW Hourly energy generation at a given location throughout the year
Baseline_generation kw Wave energy generation profile when average energy generation is equal to average community demand. The energy generation needed to meet demand is always above baseline.
Generation_factor Generation = baseline_generation * generation_factor
Generation_capacity kW Energy generation capacity or the maximum output of the energy system
max_wave_height meters Wave height at which the wave energy system submerges
Energy Storage
Storage_capacity kWh Energy Storage Capacity
Round_trip_efficiency rate The proportion of energy put into the ESS that can be retrieved from the ESS. This rate accounts for the losses during the charging and discharging of the ESS
Min_storage_rate rate Minimum energy that the energy storage system (ESS) needs to store as a proportion of the energy storage capacity.
Self_discharge_per_day rate Proportion of energy stored in the ESS lost to self-discharge per day. Flywheel ESS can have a self-discharge rate of 5 % per day (“Flywheel storage power system - Wikipedia” 2019).
Energy Resource Characteristics
Baseline_generation kW Hourly wave power profile for a given location over 1 year
Wind_power_profile kW Hourly wind power profile for a given location
Energy Demand Characteristics
Demand kW Hourly energy demand profile for a given location over 1 year
Max_shortage_hours hours per year Acceptable hours of shortages per year. In the U.S. each resident experienced about 8 hours of shortages on average in 2017. In remote communities shortages are more frequent (“Microgrid Market” 2018).
Economic Parameters
Generation_capex $/kW Capital expenditure per kW of generation capacity
Generation_opex $/kW/year Operating expenditure per kW of generation capacity per year
ESS_capex $/kWh Energy Storage Cost per kWh of ESS capacity
ESS_opex $/kWh/year Operating expenditure per kWh of ESS capacity per year

Initial Values for Input Parameters

max_wave_height = 2.8 # meters. The average wave height in the Alaska Bay is 2 meters and peak wave height is 10 meters. The ARE system submerges to more closely match its energy generation capacity with the ambient wave power. At a max_wave_height of 2.8 meters ARE will harvest energy from the strongest ambient waves 80% of the time. 


round_trip_efficiency = 0.87  # Wikipedia: https://en.wikipedia.org/wiki/Flywheel_energy_storage, round-trip efficiency up to 90%. http://energystorage.org/energy-storage/technologies/flywheels: 85 - 87%
min_storage_rate = 0.03 #Proportion of energy storage capacity required at all times. Our estimate for the FESS is based on the engineering estimated from the ARE Overall Feasibility Model.

min_storage_rate = 0.03 #Proportion of energy storage capacity required at all times

self_discharge_per_day =  0.05  #Proportion of energy stored in the ESS lost to self-discharge per day.  (https://en.wikipedia.org/wiki/Flywheel_storage_power_system#Energy_loss. The Wikipedia article refers to the German technology company ATZ (http://www.atz-gmbh.com) that claim that the flywheel ESS that they developed has under 5% self-discharge rate per day.)


max_shortage_hours = 10 #According to Rural Utilities Service, the residents of the villages served by the Alaska Village Electric Coop experienced power outages for 11 hours in 2014 (@Allen2016). The average hours that an average U.S. resident experienced in 2017 was 7.8 hours @EIA2018.

# ARE generation parameters (wave energy generation and flywheel energy storage (fess))
wave_generation_capex = 5027.88 #$/kW. Source: ARE Overall Feasibility Model
wave_generation_opex = 70 #$/kW/year. 1.4 % of CapEx. Source: ARE Overall Feasibility Model. 
fess_capex =  224.265 #$/kWh. Source: ARE Overall Feasibility Model
fess_opex = 3 # $/kWh. 1.4 % of CapEx. OpEx are low because the ESS is protected from the elements and movement in the ESS occurs without friction. We expect virtually unlimited number of charge and discharge cycles. 

#Offshore Wind Parameters

cut_in_wind_speed = 3.6 #m/s. Most wind turbines start generating electricity at wind speeds of around 3.6 meters per second (m/s), (8 miles per hour). (DOE, EERE 'How do Wind Turbines Survive Severe Storms?') (DOE, EERE 'How #do Wind Turbines Survive Severe Storms?').
cut_out_wind_speed = 25 # m/s. The cut-out speed of a typical wind turbine is 25 m/s or above (DOE, EERE 'How do Wind Turbines Survive Severe Storms?') (DOE, EERE 'How #do Wind Turbines Survive Severe Storms?').



offshore_wind_generation_capex = 9600 #$/kW. Source: https://atb.nrel.gov/electricity/2018/index.html?t=ow
offshore_wind_generation_opex = 145 # $/kW/year

#Lithium Ion Battery Parameters
li_ion_self_discharge_per_day = 0.0007 #https://www.cei.washington.edu/education/science-of-solar/battery-technology/.1.5-2% per month. 
li_ion_ess_round_trip_efficiency = 0.9 # http://css.umich.edu/factsheets/us-grid-energy-storage-factsheet: Battery storage efficiency: 60-95%
li_ion_ess_min_storage_rate = 0.03
li_ion_ess_self_discharge_per_day =  0.001 # low
li_ion_ess_capex = 652 # $/kWh. Lazard reorts that the average capital cost needed to integrate a compressed air, pumped hydro, thermal, or lithium ion battery storage system is $159/kWh, $263/kWh, $331/kWh, and $652/kWh, respectively. (http://www.intertek.com/blog/2017-10-06-grid-scale-energy/)
li_ion_ess_opex= 10# $/kWh

2.2 Sweeping generation_factor and storage_capacity for Offshore Wind Energy Generation + Lithium Ion Battery ESS

#Parameters refer to offshore wind energy generation and Li Ion energy storage
generation_capex <- offshore_wind_generation_capex
generation_opex <- offshore_wind_generation_opex
ess_capex <- li_ion_ess_capex
ess_opex <-  li_ion_ess_opex


round_trip_efficiency <- li_ion_ess_round_trip_efficiency
min_storage_rate <- li_ion_ess_min_storage_rate
self_discharge_per_day <-  li_ion_ess_self_discharge_per_day


capex=matrix(nrow=15,ncol=20) #rows sweep generation factors and columns sweep energy storage factors from lowest to highest
generation_capex_table <- capex #portion of capex from generation
storage_capex_table <- capex #portion of capex from storage

opex=capex
shortages=capex
lcoe=capex
generation_capacity_table = capex
storage_capacity_table =  capex

for (i in 1:15){
  generation_factor <- 0.1+(i-1)*0.5
  data$generation <-  data$baseline_generation*generation_factor
  for (j in 1:20){
    storage_factor <- (j-1)*20
    storage_capacity <- storage_factor*mean(data$demand)

    dat <- dispatch_storage_schedule(generation=data$generation,demand = data$demand, storage_capacity = storage_capacity, self_discharge_per_day = self_discharge_per_day,min_storage_rate = min_storage_rate, round_trip_efficiency= round_trip_efficiency)

    capex[i,j] <- generation_capex*max(data$generation)+ess_capex*storage_capacity # $
    generation_capex_table[i,j] <- generation_capex*max(data$generation)
    storage_capex_table[i,j] <- ess_capex*storage_capacity
    opex[i,j] <- generation_opex*max(data$generation)+ess_opex*storage_capacity # $/year
    shortages[i,j] <- sum(dat$dispatch<dat$demand)

    #Save energy generation and storage capacities
    generation_capacity_table[i,j] <- max(dat$generation)
    storage_capacity_table[i,j] <- storage_capacity

     present_value_factor <- 8.5
    lcoe[i,j]=(capex[i,j]/present_value_factor+opex[i,j])/sum(dat$dispatch)
  }

}

save(shortages,file='wind_shortages.RData')
save(lcoe,file='wind_lcoe.RData')
save(capex,file='wind_capex.RData')
save(generation_capex_table, file='wind_generation_capex.RData')
save(storage_capex_table, file='wind_storage_capex.RData')
save(opex,file='wind_opex.RData')
save(generation_capacity_table, file='wind_generation_capacity.RData')
save(storage_capacity_table, file='wind_storage_capacity.RData')


load('wind_shortages.RData')
load('wind_lcoe.RData')
load('wind_capex.RData')
load('wind_generation_capex.RData')
load('wind_storage_capex.RData')
load('wind_opex.RData')
load('wind_generation_capacity.RData')
load('wind_storage_capacity.RData')
#print(shortages)
print(generation_capex_table)
           [,1]      [,2]      [,3]      [,4]      [,5]      [,6]
 [1,]  12338707  12338707  12338707  12338707  12338707  12338707
 [2,]  74032243  74032243  74032243  74032243  74032243  74032243
 [3,] 135725779 135725779 135725779 135725779 135725779 135725779
 [4,] 197419315 197419315 197419315 197419315 197419315 197419315
 [5,] 259112850 259112850 259112850 259112850 259112850 259112850
 [6,] 320806386 320806386 320806386 320806386 320806386 320806386
 [7,] 382499922 382499922 382499922 382499922 382499922 382499922
 [8,] 444193458 444193458 444193458 444193458 444193458 444193458
 [9,] 505886993 505886993 505886993 505886993 505886993 505886993
[10,] 567580529 567580529 567580529 567580529 567580529 567580529
[11,] 629274065 629274065 629274065 629274065 629274065 629274065
[12,] 690967601 690967601 690967601 690967601 690967601 690967601
[13,] 752661137 752661137 752661137 752661137 752661137 752661137
[14,] 814354672 814354672 814354672 814354672 814354672 814354672
[15,] 876048208 876048208 876048208 876048208 876048208 876048208
           [,7]      [,8]      [,9]     [,10]     [,11]     [,12]
 [1,]  12338707  12338707  12338707  12338707  12338707  12338707
 [2,]  74032243  74032243  74032243  74032243  74032243  74032243
 [3,] 135725779 135725779 135725779 135725779 135725779 135725779
 [4,] 197419315 197419315 197419315 197419315 197419315 197419315
 [5,] 259112850 259112850 259112850 259112850 259112850 259112850
 [6,] 320806386 320806386 320806386 320806386 320806386 320806386
 [7,] 382499922 382499922 382499922 382499922 382499922 382499922
 [8,] 444193458 444193458 444193458 444193458 444193458 444193458
 [9,] 505886993 505886993 505886993 505886993 505886993 505886993
[10,] 567580529 567580529 567580529 567580529 567580529 567580529
[11,] 629274065 629274065 629274065 629274065 629274065 629274065
[12,] 690967601 690967601 690967601 690967601 690967601 690967601
[13,] 752661137 752661137 752661137 752661137 752661137 752661137
[14,] 814354672 814354672 814354672 814354672 814354672 814354672
[15,] 876048208 876048208 876048208 876048208 876048208 876048208
          [,13]     [,14]     [,15]     [,16]     [,17]     [,18]
 [1,]  12338707  12338707  12338707  12338707  12338707  12338707
 [2,]  74032243  74032243  74032243  74032243  74032243  74032243
 [3,] 135725779 135725779 135725779 135725779 135725779 135725779
 [4,] 197419315 197419315 197419315 197419315 197419315 197419315
 [5,] 259112850 259112850 259112850 259112850 259112850 259112850
 [6,] 320806386 320806386 320806386 320806386 320806386 320806386
 [7,] 382499922 382499922 382499922 382499922 382499922 382499922
 [8,] 444193458 444193458 444193458 444193458 444193458 444193458
 [9,] 505886993 505886993 505886993 505886993 505886993 505886993
[10,] 567580529 567580529 567580529 567580529 567580529 567580529
[11,] 629274065 629274065 629274065 629274065 629274065 629274065
[12,] 690967601 690967601 690967601 690967601 690967601 690967601
[13,] 752661137 752661137 752661137 752661137 752661137 752661137
[14,] 814354672 814354672 814354672 814354672 814354672 814354672
[15,] 876048208 876048208 876048208 876048208 876048208 876048208
          [,19]     [,20]
 [1,]  12338707  12338707
 [2,]  74032243  74032243
 [3,] 135725779 135725779
 [4,] 197419315 197419315
 [5,] 259112850 259112850
 [6,] 320806386 320806386
 [7,] 382499922 382499922
 [8,] 444193458 444193458
 [9,] 505886993 505886993
[10,] 567580529 567580529
[11,] 629274065 629274065
[12,] 690967601 690967601
[13,] 752661137 752661137
[14,] 814354672 814354672
[15,] 876048208 876048208
print(storage_capex_table)
      [,1]    [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]
 [1,]    0 7978210 15956421 23934631 31912842 39891052 47869263 55847473
 [2,]    0 7978210 15956421 23934631 31912842 39891052 47869263 55847473
 [3,]    0 7978210 15956421 23934631 31912842 39891052 47869263 55847473
 [4,]    0 7978210 15956421 23934631 31912842 39891052 47869263 55847473
 [5,]    0 7978210 15956421 23934631 31912842 39891052 47869263 55847473
 [6,]    0 7978210 15956421 23934631 31912842 39891052 47869263 55847473
 [7,]    0 7978210 15956421 23934631 31912842 39891052 47869263 55847473
 [8,]    0 7978210 15956421 23934631 31912842 39891052 47869263 55847473
 [9,]    0 7978210 15956421 23934631 31912842 39891052 47869263 55847473
[10,]    0 7978210 15956421 23934631 31912842 39891052 47869263 55847473
[11,]    0 7978210 15956421 23934631 31912842 39891052 47869263 55847473
[12,]    0 7978210 15956421 23934631 31912842 39891052 47869263 55847473
[13,]    0 7978210 15956421 23934631 31912842 39891052 47869263 55847473
[14,]    0 7978210 15956421 23934631 31912842 39891052 47869263 55847473
[15,]    0 7978210 15956421 23934631 31912842 39891052 47869263 55847473
          [,9]    [,10]    [,11]    [,12]    [,13]     [,14]     [,15]
 [1,] 63825684 71803894 79782104 87760315 95738525 103716736 111694946
 [2,] 63825684 71803894 79782104 87760315 95738525 103716736 111694946
 [3,] 63825684 71803894 79782104 87760315 95738525 103716736 111694946
 [4,] 63825684 71803894 79782104 87760315 95738525 103716736 111694946
 [5,] 63825684 71803894 79782104 87760315 95738525 103716736 111694946
 [6,] 63825684 71803894 79782104 87760315 95738525 103716736 111694946
 [7,] 63825684 71803894 79782104 87760315 95738525 103716736 111694946
 [8,] 63825684 71803894 79782104 87760315 95738525 103716736 111694946
 [9,] 63825684 71803894 79782104 87760315 95738525 103716736 111694946
[10,] 63825684 71803894 79782104 87760315 95738525 103716736 111694946
[11,] 63825684 71803894 79782104 87760315 95738525 103716736 111694946
[12,] 63825684 71803894 79782104 87760315 95738525 103716736 111694946
[13,] 63825684 71803894 79782104 87760315 95738525 103716736 111694946
[14,] 63825684 71803894 79782104 87760315 95738525 103716736 111694946
[15,] 63825684 71803894 79782104 87760315 95738525 103716736 111694946
          [,16]     [,17]     [,18]     [,19]     [,20]
 [1,] 119673157 127651367 135629578 143607788 151585998
 [2,] 119673157 127651367 135629578 143607788 151585998
 [3,] 119673157 127651367 135629578 143607788 151585998
 [4,] 119673157 127651367 135629578 143607788 151585998
 [5,] 119673157 127651367 135629578 143607788 151585998
 [6,] 119673157 127651367 135629578 143607788 151585998
 [7,] 119673157 127651367 135629578 143607788 151585998
 [8,] 119673157 127651367 135629578 143607788 151585998
 [9,] 119673157 127651367 135629578 143607788 151585998
[10,] 119673157 127651367 135629578 143607788 151585998
[11,] 119673157 127651367 135629578 143607788 151585998
[12,] 119673157 127651367 135629578 143607788 151585998
[13,] 119673157 127651367 135629578 143607788 151585998
[14,] 119673157 127651367 135629578 143607788 151585998
[15,] 119673157 127651367 135629578 143607788 151585998
#print(lcoe)
#print(capex)
#print(opex)
#print(generation_capacity_table)
#print(storage_capacity_table)

2.2.1 System that Minimizes LCOE for a Given Level of Reliability

#Function provides the characteristics of a system for a given maximum hours of shortages allowed
optimal_system <- function(max_shortages){ #Highest number of shortages per year
  w <- which(shortages<=max_shortages) #indeces of shortages table with allowable shortage hours 
  allowable_lcoe <- as.vector(lcoe)[w]# lcoe when shortages do not exceed the max
  minlcoe <- min(allowable_lcoe) #smallest lcoe when shortages do not exceed max
  i <- which(lcoe==minlcoe) # the index of the position of minlcoe in the lcoe table
  c <- rbind(as.vector(shortages)[i],round(minlcoe,digits=2), round(as.vector(capex)[i]/1000,2), round(as.vector(opex)[i]/1000,2),round(as.vector(generation_capacity_table)[i]/1000,2), round(as.vector(storage_capacity_table)[i]/1000,2),((i-1)%%15)+1,floor((i-1)/15)+1)
  rownames(c) <- c("Hours of shortages","LCOE","CapEx in 1,000$","OpEx in 1,000$/year","Generation capacity in MW","Storage capacity in MWh","index_row","index_column")
  return(c)
}

#c10 <- optimal_system(10) #Reliability level for Alaska Village Electric Cooperative 
c0 <- optimal_system(0)
c87 <- optimal_system(87) #99% reliability
c1732 <-  optimal_system(1732) #80% relability
c8760 <- optimal_system(8760)
c <- cbind(c0,c87,c1732,c8760)
colnames(c) <- c("Reliable","99% Reliable","80% Reliable","Min LCOE")
save(c, file='wind_results.RData')             
Optimal Wind and Battery System for Different Reliability Requirements
Reliable 99% Reliable 80% Reliable Min LCOE
Hours of shortages 0.00 81.00 1697.00 8625.00
LCOE 11.04 10.31 6.72 3.12
CapEx in 1,000$ 440479.54 408566.70 229332.16 12338.71
OpEx in 1,000$/year 6680.99 6191.53 3471.31 186.37
Generation capacity in MW 33.42 33.42 20.56 1.29
Storage capacity in MWh 183.55 134.60 48.95 0.00
index_row 6.00 6.00 4.00 1.00
index_column 16.00 12.00 5.00 1.00

References

“Flywheel storage power system - Wikipedia.” 2019. Accessed August 10. https://en.wikipedia.org/wiki/Flywheel{\_}storage{\_}power{\_}system{\#}Energy{\_}loss.