class Standard
  # @!group AirConditionerVariableRefrigerantFlow

  # Prototype AirConditionerVariableRefrigerantFlow object
  # Enters in default curves for coil by type of coil
  # @param name [String] the name of the system, or nil in which case it will be defaulted
  # @param schedule [String] name of the availability schedule, or [<OpenStudio::Model::Schedule>] Schedule object, or nil in which case default to always on
  # @param type [String] the type of unit to reference for the correct curve set
  # @param cooling_cop [Double] rated cooling coefficient of performance
  # @param heating_cop [Double] rated heating coefficient of performance
  # @param heat_recovery [Bool] does the unit have heat recovery
  # @param defrost_strategy [String] type of defrost strategy. options are ReverseCycle or Resistive
  # @param condenser_type [String] type of condenser
  #   options are AirCooled (default), WaterCooled, and EvaporativelyCooled.
  #   if WaterCooled, the user most include a condenser_loop
  # @param master_zone [<OpenStudio::Model::ThermalZone>] master control zone to switch between heating and cooling
  # @param priority_control_type [String] type of master thermostat priority control type
  #   options are LoadPriority, ZonePriority, ThermostatOffsetPriority, MasterThermostatPriority
  def create_air_conditioner_variable_refrigerant_flow(model,
                                                       name: "VRF System",
                                                       schedule: nil,
                                                       type: nil,
                                                       cooling_cop: 4.287,
                                                       heating_cop: 4.147,
                                                       heat_recovery: true,
                                                       defrost_strategy: "Resistive",
                                                       condenser_type: "AirCooled",
                                                       condenser_loop: nil,
                                                       master_zone: nil,
                                                       priority_control_type: "LoadPriority")

    vrf_outdoor_unit = OpenStudio::Model::AirConditionerVariableRefrigerantFlow.new(model)

    # set name
    if name.nil?
      vrf_outdoor_unit.setName("VRF System")
    else
      vrf_outdoor_unit.setName(name)
    end

    # set availability schedule
    if schedule.nil?
      # default always on
      availability_schedule = model.alwaysOnDiscreteSchedule
    elsif schedule.class == String
      availability_schedule = model_add_schedule(model, schedule)

      if availability_schedule.nil? && schedule == "alwaysOffDiscreteSchedule"
        availability_schedule = model.alwaysOffDiscreteSchedule
      elsif availability_schedule.nil?
        availability_schedule = model.alwaysOnDiscreteSchedule
      end
    elsif !schedule.to_Schedule.empty?
      availability_schedule = schedule
    else
      availability_schedule = model.alwaysOnDiscreteSchedule
    end
    vrf_outdoor_unit.setAvailabilitySchedule(availability_schedule)

    # set cops
    vrf_outdoor_unit.setRatedCoolingCOP(cooling_cop)
    vrf_outdoor_unit.setRatedHeatingCOP(heating_cop)

    # heat recovery
    if heat_recovery
      vrf_outdoor_unit.setHeatPumpWasteHeatRecovery(true)
    else
      vrf_outdoor_unit.setHeatPumpWasteHeatRecovery(false)
    end

    # defrost strategy
    vrf_outdoor_unit.setDefrostStrategy(defrost_strategy)

    # defaults
    vrf_outdoor_unit.setMinimumOutdoorTemperatureinCoolingMode(-15.0)
    vrf_outdoor_unit.setMaximumOutdoorTemperatureinCoolingMode(50.0)
    vrf_outdoor_unit.setMinimumOutdoorTemperatureinHeatingMode(-25.0)
    vrf_outdoor_unit.setMaximumOutdoorTemperatureinHeatingMode(16.1)
    vrf_outdoor_unit.setMinimumOutdoorTemperatureinHeatRecoveryMode (-10.0)
    vrf_outdoor_unit.setMaximumOutdoorTemperatureinHeatRecoveryMode(27.2)
    vrf_outdoor_unit.setEquivalentPipingLengthusedforPipingCorrectionFactorinCoolingMode(30.48)
    vrf_outdoor_unit.setEquivalentPipingLengthusedforPipingCorrectionFactorinHeatingMode(30.48)
    vrf_outdoor_unit.setVerticalHeightusedforPipingCorrectionFactor(10.668)

    # condenser type
    if condenser_type == "WaterCooled"
      vrf_outdoor_unit.setString(56, condenser_type)
      # require condenser_loop
      unless condenser_loop
        OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Must specify condenser_loop for vrf_outdoor_unit if WaterCooled")
      end
      condenser_loop.addDemandBranchForComponent(vrf_outdoor_unit)
    elsif condenser_type == "EvaporativelyCooled"
      vrf_outdoor_unit.setString(56, condenser_type)
    end

    # set master zone
    unless master_zone.to_ThermalZone.empty?
      vrf_outdoor_unit.setZoneforMasterThermostatLocation(master_zone)
      vrf_outdoor_unit.setMasterThermostatPriorityControlType(priority_control_type)
    end

    vrf_cool_cap_f_of_low_temp = nil
    vrf_cool_cap_ratio_boundary = nil
    vrf_cool_cap_f_of_high_temp = nil
    vrf_cool_eir_f_of_low_temp = nil
    vrf_cool_eir_ratio_boundary = nil
    vrf_cool_eir_f_of_high_temp = nil
    vrf_cooling_eir_low_plr = nil
    vrf_cooling_eir_high_plr = nil
    vrf_cooling_comb_ratio = nil
    vrf_cooling_cplffplr = nil
    vrf_heat_cap_f_of_low_temp = nil
    vrf_heat_cap_ratio_boundary = nil
    vrf_heat_cap_f_of_high_temp = nil
    vrf_heat_eir_f_of_low_temp = nil
    vrf_heat_eir_boundary = nil
    vrf_heat_eir_f_of_high_temp = nil
    vrf_heating_eir_low_plr = nil
    vrf_heating_eir_hi_plr = nil
    vrf_heating_comb_ratio = nil
    vrf_heating_cplffplr = nil
    vrf_defrost_eir_f_of_temp = nil

    # curve sets
    if type == 'OS default'

      # use OS default curves

    else # default curve set

      # based on DAIKINREYQ 120 on BCL

      # Cooling Capacity Ratio Modifier Function of Low Temperature Curve
      vrf_cool_cap_f_of_low_temp = OpenStudio::Model::CurveBiquadratic.new(model)
      vrf_cool_cap_f_of_low_temp.setName("vrf_cool_cap_f_of_low_temp")
      vrf_cool_cap_f_of_low_temp.setCoefficient1Constant(-1.69653019339465)
      vrf_cool_cap_f_of_low_temp.setCoefficient2x(0.207248180531939)
      vrf_cool_cap_f_of_low_temp.setCoefficient3xPOW2(-0.00343146229659024)
      vrf_cool_cap_f_of_low_temp.setCoefficient4y(0.016381597419714)
      vrf_cool_cap_f_of_low_temp.setCoefficient5yPOW2(-6.7387172629965e-05)
      vrf_cool_cap_f_of_low_temp.setCoefficient6xTIMESY(-0.000849848402870241)
      vrf_cool_cap_f_of_low_temp.setMinimumValueofx(13.9)
      vrf_cool_cap_f_of_low_temp.setMaximumValueofx(23.9)
      vrf_cool_cap_f_of_low_temp.setMinimumValueofy(-5.0)
      vrf_cool_cap_f_of_low_temp.setMaximumValueofy(43.3)
      vrf_cool_cap_f_of_low_temp.setMinimumCurveOutput(0.59)
      vrf_cool_cap_f_of_low_temp.setMaximumCurveOutput(1.33)

      # Cooling Capacity Ratio Boundary Curve
      vrf_cool_cap_ratio_boundary = OpenStudio::Model::CurveCubic.new(model)
      vrf_cool_cap_ratio_boundary.setName("vrf_cool_cap_ratio_boundary")
      vrf_cool_cap_ratio_boundary.setCoefficient1Constant(25.73)
      vrf_cool_cap_ratio_boundary.setCoefficient2x(-0.03150043)
      vrf_cool_cap_ratio_boundary.setCoefficient3xPOW2(-0.01416595)
      vrf_cool_cap_ratio_boundary.setCoefficient4xPOW3(0.0)
      vrf_cool_cap_ratio_boundary.setMinimumValueofx(11.0)
      vrf_cool_cap_ratio_boundary.setMaximumValueofx(30.0)

      # Cooling Capacity Ratio Modifier Function of High Temperature Curve
      vrf_cool_cap_f_of_high_temp = OpenStudio::Model::CurveBiquadratic.new(model)
      vrf_cool_cap_f_of_high_temp.setName("vrf_cool_cap_f_of_high_temp")
      vrf_cool_cap_f_of_high_temp.setCoefficient1Constant(0.6867358)
      vrf_cool_cap_f_of_high_temp.setCoefficient2x(0.0207631)
      vrf_cool_cap_f_of_high_temp.setCoefficient3xPOW2(0.0005447)
      vrf_cool_cap_f_of_high_temp.setCoefficient4y(-0.0016218)
      vrf_cool_cap_f_of_high_temp.setCoefficient5yPOW2(-4.259e-07)
      vrf_cool_cap_f_of_high_temp.setCoefficient6xTIMESY(-0.0003392)
      vrf_cool_cap_f_of_high_temp.setMinimumValueofx(15.0)
      vrf_cool_cap_f_of_high_temp.setMaximumValueofx(24.0)
      vrf_cool_cap_f_of_high_temp.setMinimumValueofy(16.0)
      vrf_cool_cap_f_of_high_temp.setMaximumValueofy(43.0)

      # Cooling Energy Input Ratio Modifier Function of Low Temperature Curve
      vrf_cool_eir_f_of_low_temp = OpenStudio::Model::CurveBiquadratic.new(model)
      vrf_cool_eir_f_of_low_temp.setName("vrf_cool_eir_f_of_low_temp")
      vrf_cool_eir_f_of_low_temp.setCoefficient1Constant(-1.61908214818635)
      vrf_cool_eir_f_of_low_temp.setCoefficient2x(0.185964818731756)
      vrf_cool_eir_f_of_low_temp.setCoefficient3xPOW2(-0.00389610393381592)
      vrf_cool_eir_f_of_low_temp.setCoefficient4y(-0.00901995326324613)
      vrf_cool_eir_f_of_low_temp.setCoefficient5yPOW2(0.00030340007815629)
      vrf_cool_eir_f_of_low_temp.setCoefficient6xTIMESY(0.000476048529099348)
      vrf_cool_eir_f_of_low_temp.setMinimumValueofx(13.9)
      vrf_cool_eir_f_of_low_temp.setMaximumValueofx(23.9)
      vrf_cool_eir_f_of_low_temp.setMinimumValueofy(-5.0)
      vrf_cool_eir_f_of_low_temp.setMaximumValueofy(43.3)
      vrf_cool_eir_f_of_low_temp.setMinimumCurveOutput(0.27)
      vrf_cool_eir_f_of_low_temp.setMaximumCurveOutput(1.15)

      # Cooling Energy Input Ratio Boundary Curve
      vrf_cool_eir_ratio_boundary = OpenStudio::Model::CurveCubic.new(model)
      vrf_cool_eir_ratio_boundary.setName("vrf_cool_eir_ratio_boundary")
      vrf_cool_eir_ratio_boundary.setCoefficient1Constant(25.73473775)
      vrf_cool_eir_ratio_boundary.setCoefficient2x(-0.03150043)
      vrf_cool_eir_ratio_boundary.setCoefficient3xPOW2(-0.01416595)
      vrf_cool_eir_ratio_boundary.setCoefficient4xPOW3(0.0)
      vrf_cool_eir_ratio_boundary.setMinimumValueofx(15.0)
      vrf_cool_eir_ratio_boundary.setMaximumValueofx(24.0)

      # Cooling Energy Input Ratio Modifier Function of High Temperature Curve
      vrf_cool_eir_f_of_high_temp = OpenStudio::Model::CurveBiquadratic.new(model)
      vrf_cool_eir_f_of_high_temp.setName("vrf_cool_eir_f_of_high_temp")
      vrf_cool_eir_f_of_high_temp.setCoefficient1Constant(-1.4395110176)
      vrf_cool_eir_f_of_high_temp.setCoefficient2x(0.1619850459)
      vrf_cool_eir_f_of_high_temp.setCoefficient3xPOW2(-0.0034911781)
      vrf_cool_eir_f_of_high_temp.setCoefficient4y(0.0269442645)
      vrf_cool_eir_f_of_high_temp.setCoefficient5yPOW2(0.0001346163)
      vrf_cool_eir_f_of_high_temp.setCoefficient6xTIMESY(-0.0006714941)
      vrf_cool_eir_f_of_high_temp.setMinimumValueofx(15.0)
      vrf_cool_eir_f_of_high_temp.setMaximumValueofx(23.9)
      vrf_cool_eir_f_of_high_temp.setMinimumValueofy(16.8)
      vrf_cool_eir_f_of_high_temp.setMaximumValueofy(43.3)

      # Cooling Energy Input Ratio Modifier Function of Low Part-Load Ratio Curve
      vrf_cooling_eir_low_plr = OpenStudio::Model::CurveCubic.new(model)
      vrf_cooling_eir_low_plr.setName("vrf_cool_eir_f_of_low_temp")
      vrf_cooling_eir_low_plr.setCoefficient1Constant(0.0734992169827752)
      vrf_cooling_eir_low_plr.setCoefficient2x(0.334783365234032)
      vrf_cooling_eir_low_plr.setCoefficient3xPOW2(0.591613015486343)
      vrf_cooling_eir_low_plr.setCoefficient4xPOW3(0.0)
      vrf_cooling_eir_low_plr.setMinimumValueofx(0.25)
      vrf_cooling_eir_low_plr.setMaximumValueofx(1.0)
      vrf_cooling_eir_low_plr.setMinimumCurveOutput(0.0)
      vrf_cooling_eir_low_plr.setMaximumCurveOutput(1.0)

      # Cooling Energy Input Ratio Modifier Function of High Part-Load Ratio Curve
      vrf_cooling_eir_high_plr = OpenStudio::Model::CurveCubic.new(model)
      vrf_cooling_eir_high_plr.setName("vrf_cooling_eir_high_plr")
      vrf_cooling_eir_high_plr.setCoefficient1Constant(1.0)
      vrf_cooling_eir_high_plr.setCoefficient2x(0.0)
      vrf_cooling_eir_high_plr.setCoefficient3xPOW2(0.0)
      vrf_cooling_eir_high_plr.setCoefficient4xPOW3(0.0)
      vrf_cooling_eir_high_plr.setMinimumValueofx(1.0)
      vrf_cooling_eir_high_plr.setMaximumValueofx(1.5)

      # Cooling Combination Ratio Correction Factor Curve
      vrf_cooling_comb_ratio = OpenStudio::Model::CurveCubic.new(model)
      vrf_cooling_comb_ratio.setName("vrf_cooling_comb_ratio")
      vrf_cooling_comb_ratio.setCoefficient1Constant(0.24034)
      vrf_cooling_comb_ratio.setCoefficient2x(-0.21873)
      vrf_cooling_comb_ratio.setCoefficient3xPOW2(1.97941)
      vrf_cooling_comb_ratio.setCoefficient4xPOW3(-1.02636)
      vrf_cooling_comb_ratio.setMinimumValueofx(0.5)
      vrf_cooling_comb_ratio.setMaximumValueofx(2.0)
      vrf_cooling_comb_ratio.setMinimumCurveOutput(0.5)
      vrf_cooling_comb_ratio.setMaximumCurveOutput(1.056)

      # Cooling Part-Load Fraction Correlation Curve
      vrf_cooling_cplffplr = OpenStudio::Model::CurveCubic.new(model)
      vrf_cooling_cplffplr.setName("vrf_cooling_cplffplr")
      vrf_cooling_cplffplr.setCoefficient1Constant(0.85)
      vrf_cooling_cplffplr.setCoefficient2x(0.15)
      vrf_cooling_cplffplr.setCoefficient3xPOW2(0.0)
      vrf_cooling_cplffplr.setCoefficient4xPOW3(0.0)
      vrf_cooling_cplffplr.setMinimumValueofx(1.0)
      vrf_cooling_cplffplr.setMaximumValueofx(1.0)

      # Heating Capacity Ratio Modifier Function of Low Temperature Curve Name
      vrf_heat_cap_f_of_low_temp = OpenStudio::Model::CurveBiquadratic.new(model)
      vrf_heat_cap_f_of_low_temp.setName("vrf_heat_cap_f_of_low_temp")
      vrf_heat_cap_f_of_low_temp.setCoefficient1Constant(0.983220174655636)
      vrf_heat_cap_f_of_low_temp.setCoefficient2x(0.0157167577703294)
      vrf_heat_cap_f_of_low_temp.setCoefficient3xPOW2(-0.000835032422884084)
      vrf_heat_cap_f_of_low_temp.setCoefficient4y(0.0522939264581759)
      vrf_heat_cap_f_of_low_temp.setCoefficient5yPOW2(-0.000531556035364549)
      vrf_heat_cap_f_of_low_temp.setCoefficient6xTIMESY(-0.00190605953116024)
      vrf_heat_cap_f_of_low_temp.setMinimumValueofx(16.1)
      vrf_heat_cap_f_of_low_temp.setMaximumValueofx(23.9)
      vrf_heat_cap_f_of_low_temp.setMinimumValueofy(-25.0)
      vrf_heat_cap_f_of_low_temp.setMaximumValueofy(13.3)
      vrf_heat_cap_f_of_low_temp.setMinimumCurveOutput(0.515151515151515)
      vrf_heat_cap_f_of_low_temp.setMaximumCurveOutput(1.2)

      # Heating Capacity Ratio Boundary Curve Name
      vrf_heat_cap_ratio_boundary = OpenStudio::Model::CurveCubic.new(model)
      vrf_heat_cap_ratio_boundary.setName("vrf_heat_cap_ratio_boundary")
      vrf_heat_cap_ratio_boundary.setCoefficient1Constant(58.577)
      vrf_heat_cap_ratio_boundary.setCoefficient2x(-3.0255)
      vrf_heat_cap_ratio_boundary.setCoefficient3xPOW2(0.0193)
      vrf_heat_cap_ratio_boundary.setCoefficient4xPOW3(0.0)
      vrf_heat_cap_ratio_boundary.setMinimumValueofx(15)
      vrf_heat_cap_ratio_boundary.setMaximumValueofx(23.9)

      # Heating Capacity Ratio Modifier Function of High Temperature Curve Name
      vrf_heat_cap_f_of_high_temp = OpenStudio::Model::CurveBiquadratic.new(model)
      vrf_heat_cap_f_of_high_temp.setName("vrf_heat_cap_f_of_high_temp")
      vrf_heat_cap_f_of_high_temp.setCoefficient1Constant(2.5859872368)
      vrf_heat_cap_f_of_high_temp.setCoefficient2x(-0.0953227101)
      vrf_heat_cap_f_of_high_temp.setCoefficient3xPOW2(0.0009553288)
      vrf_heat_cap_f_of_high_temp.setCoefficient4y(0.0)
      vrf_heat_cap_f_of_high_temp.setCoefficient5yPOW2(0.0)
      vrf_heat_cap_f_of_high_temp.setCoefficient6xTIMESY(0.0)
      vrf_heat_cap_f_of_high_temp.setMinimumValueofx(21.1)
      vrf_heat_cap_f_of_high_temp.setMaximumValueofx(27.2)
      vrf_heat_cap_f_of_high_temp.setMinimumValueofy(-944)
      vrf_heat_cap_f_of_high_temp.setMaximumValueofy(15)

      # Heating Energy Input Ratio Modifier Function of Low Temperature Curve Name
      vrf_heat_eir_f_of_low_temp = OpenStudio::Model::CurveBiquadratic.new(model)
      vrf_heat_eir_f_of_low_temp.setName("vrf_heat_eir_f_of_low_temp")
      vrf_heat_eir_f_of_low_temp.setCoefficient1Constant(0.756830029796909)
      vrf_heat_eir_f_of_low_temp.setCoefficient2x(0.0457499799042671)
      vrf_heat_eir_f_of_low_temp.setCoefficient3xPOW2(-0.00136357240431388)
      vrf_heat_eir_f_of_low_temp.setCoefficient4y(0.0554884599902023)
      vrf_heat_eir_f_of_low_temp.setCoefficient5yPOW2(-0.00120700875497686)
      vrf_heat_eir_f_of_low_temp.setCoefficient6xTIMESY(-0.00303329271420931)
      vrf_heat_eir_f_of_low_temp.setMinimumValueofx(16.1)
      vrf_heat_eir_f_of_low_temp.setMaximumValueofx(23.9)
      vrf_heat_eir_f_of_low_temp.setMinimumValueofy(-25.0)
      vrf_heat_eir_f_of_low_temp.setMaximumValueofy(13.3)
      vrf_heat_eir_f_of_low_temp.setMinimumCurveOutput(0.7)
      vrf_heat_eir_f_of_low_temp.setMaximumCurveOutput(1.184)

      # Heating Energy Input Ratio Boundary Curve Name
      vrf_heat_eir_boundary = OpenStudio::Model::CurveCubic.new(model)
      vrf_heat_eir_boundary.setName("vrf_heat_eir_boundary")
      vrf_heat_eir_boundary.setCoefficient1Constant(58.577)
      vrf_heat_eir_boundary.setCoefficient2x(-3.0255)
      vrf_heat_eir_boundary.setCoefficient3xPOW2(0.0193)
      vrf_heat_eir_boundary.setCoefficient4xPOW3(0.0)
      vrf_heat_eir_boundary.setMinimumValueofx(15.0)
      vrf_heat_eir_boundary.setMaximumValueofx(23.9)

      # Heating Energy Input Ratio Modifier Function of High Temperature Curve Name
      vrf_heat_eir_f_of_high_temp = OpenStudio::Model::CurveBiquadratic.new(model)
      vrf_heat_eir_f_of_high_temp.setName("vrf_heat_eir_f_of_high_temp")
      vrf_heat_eir_f_of_high_temp.setCoefficient1Constant(1.3885703646)
      vrf_heat_eir_f_of_high_temp.setCoefficient2x(-0.0229771462)
      vrf_heat_eir_f_of_high_temp.setCoefficient3xPOW2(0.000537274)
      vrf_heat_eir_f_of_high_temp.setCoefficient4y(-0.0273936962)
      vrf_heat_eir_f_of_high_temp.setCoefficient5yPOW2(0.0004030426)
      vrf_heat_eir_f_of_high_temp.setCoefficient6xTIMESY(-5.9786e-05)
      vrf_heat_eir_f_of_high_temp.setMinimumValueofx(21.1)
      vrf_heat_eir_f_of_high_temp.setMaximumValueofx(27.2)
      vrf_heat_eir_f_of_high_temp.setMinimumValueofy(0.0)
      vrf_heat_eir_f_of_high_temp.setMaximumValueofy(1.0)

      # Heating Performance Curve Outdoor Temperature Type
      vrf_outdoor_unit.setHeatingPerformanceCurveOutdoorTemperatureType("WetBulbTemperature")

      # Heating Energy Input Ratio Modifier Function of Low Part-Load Ratio Curve Name
      vrf_heating_eir_low_plr = OpenStudio::Model::CurveCubic.new(model)
      vrf_heating_eir_low_plr.setName("vrf_heating_eir_low_plr")
      vrf_heating_eir_low_plr.setCoefficient1Constant(0.0724906507105475)
      vrf_heating_eir_low_plr.setCoefficient2x(0.658189977561701)
      vrf_heating_eir_low_plr.setCoefficient3xPOW2(0.269259536275246)
      vrf_heating_eir_low_plr.setCoefficient4xPOW3(0.0)
      vrf_heating_eir_low_plr.setMinimumValueofx(0.25)
      vrf_heating_eir_low_plr.setMaximumValueofx(1.0)
      vrf_heating_eir_low_plr.setMinimumCurveOutput(0.0)
      vrf_heating_eir_low_plr.setMaximumCurveOutput(1.0)

      # Heating Energy Input Ratio Modifier Function of High Part-Load Ratio Curve Name
      vrf_heating_eir_hi_plr = OpenStudio::Model::CurveCubic.new(model)
      vrf_heating_eir_hi_plr.setName("vrf_heating_eir_hi_plr")
      vrf_heating_eir_hi_plr.setCoefficient1Constant(1.0)
      vrf_heating_eir_hi_plr.setCoefficient2x(0.0)
      vrf_heating_eir_hi_plr.setCoefficient3xPOW2(0.0)
      vrf_heating_eir_hi_plr.setCoefficient4xPOW3(0.0)
      vrf_heating_eir_hi_plr.setMinimumValueofx(1.0)
      vrf_heating_eir_hi_plr.setMaximumValueofx(1.5)

      # Heating Combination Ratio Correction Factor Curve Name
      vrf_heating_comb_ratio = OpenStudio::Model::CurveCubic.new(model)
      vrf_heating_comb_ratio.setName("vrf_heating_comb_ratio")
      vrf_heating_comb_ratio.setCoefficient1Constant(0.62115)
      vrf_heating_comb_ratio.setCoefficient2x(-1.55798)
      vrf_heating_comb_ratio.setCoefficient3xPOW2(3.36817)
      vrf_heating_comb_ratio.setCoefficient4xPOW3(-1.4224)
      vrf_heating_comb_ratio.setMinimumValueofx(0.5)
      vrf_heating_comb_ratio.setMaximumValueofx(2.0)
      vrf_heating_comb_ratio.setMinimumCurveOutput(0.5)
      vrf_heating_comb_ratio.setMaximumCurveOutput(1.155)

      # Heating Part-Load Fraction Correlation Curve Name
      vrf_heating_cplffplr = OpenStudio::Model::CurveCubic.new(model)
      vrf_heating_cplffplr.setName("vrf_heating_cplffplr")
      vrf_heating_cplffplr.setCoefficient1Constant(0.85)
      vrf_heating_cplffplr.setCoefficient2x(0.15)
      vrf_heating_cplffplr.setCoefficient3xPOW2(0.0)
      vrf_heating_cplffplr.setCoefficient4xPOW3(0.0)
      vrf_heating_cplffplr.setMinimumValueofx(1.0)
      vrf_heating_cplffplr.setMaximumValueofx(1.0)

      # Defrost Energy Input Ratio Modifier Function of Temperature Curve
      vrf_defrost_eir_f_of_temp = OpenStudio::Model::CurveBiquadratic.new(model)
      vrf_defrost_eir_f_of_temp.setName("vrf_defrost_eir_f_of_temp")
      vrf_defrost_eir_f_of_temp.setCoefficient1Constant(-1.61908214818635)
      vrf_defrost_eir_f_of_temp.setCoefficient2x(0.185964818731756)
      vrf_defrost_eir_f_of_temp.setCoefficient3xPOW2(-0.00389610393381592)
      vrf_defrost_eir_f_of_temp.setCoefficient4y(-0.00901995326324613)
      vrf_defrost_eir_f_of_temp.setCoefficient5yPOW2(0.00030340007815629)
      vrf_defrost_eir_f_of_temp.setCoefficient6xTIMESY(0.000476048529099348)
      vrf_defrost_eir_f_of_temp.setMinimumValueofx(13.9)
      vrf_defrost_eir_f_of_temp.setMaximumValueofx(23.9)
      vrf_defrost_eir_f_of_temp.setMinimumValueofy(-5.0)
      vrf_defrost_eir_f_of_temp.setMaximumValueofy(50.0)
      vrf_defrost_eir_f_of_temp.setMinimumCurveOutput(0.27)
      vrf_defrost_eir_f_of_temp.setMaximumCurveOutput(1.155)

      # set defrost control
      vrf_outdoor_unit.setDefrostStrategy("ReverseCycle")
      vrf_outdoor_unit.setDefrostControl("OnDemand")

    end

    vrf_outdoor_unit.setCoolingCapacityRatioModifierFunctionofLowTemperatureCurve(vrf_cool_cap_f_of_low_temp) unless vrf_cool_cap_f_of_low_temp.nil?
    vrf_outdoor_unit.setCoolingCapacityRatioBoundaryCurve(vrf_cool_cap_ratio_boundary) unless vrf_cool_cap_ratio_boundary.nil?
    vrf_outdoor_unit.setCoolingCapacityRatioModifierFunctionofHighTemperatureCurve(vrf_cool_cap_f_of_high_temp) unless vrf_cool_cap_f_of_high_temp.nil?
    vrf_outdoor_unit.setCoolingEnergyInputRatioModifierFunctionofLowTemperatureCurve(vrf_cool_eir_f_of_low_temp) unless vrf_cool_eir_f_of_low_temp.nil?
    vrf_outdoor_unit.setCoolingEnergyInputRatioBoundaryCurve(vrf_cool_eir_ratio_boundary) unless vrf_cool_eir_ratio_boundary.nil?
    vrf_outdoor_unit.setCoolingEnergyInputRatioModifierFunctionofHighTemperatureCurve(vrf_cool_eir_f_of_high_temp) unless vrf_cool_eir_f_of_high_temp.nil?
    vrf_outdoor_unit.setCoolingEnergyInputRatioModifierFunctionofLowPartLoadRatioCurve(vrf_cooling_eir_low_plr) unless vrf_cooling_eir_low_plr.nil?
    vrf_outdoor_unit.setCoolingEnergyInputRatioModifierFunctionofHighPartLoadRatioCurve(vrf_cooling_eir_high_plr) unless vrf_cooling_eir_high_plr.nil?
    vrf_outdoor_unit.setCoolingCombinationRatioCorrectionFactorCurve(vrf_cooling_comb_ratio) unless vrf_cooling_comb_ratio.nil?
    vrf_outdoor_unit.setCoolingPartLoadFractionCorrelationCurve(vrf_cooling_cplffplr) unless vrf_cooling_cplffplr.nil?
    vrf_outdoor_unit.setHeatingCapacityRatioModifierFunctionofLowTemperatureCurve(vrf_heat_cap_f_of_low_temp) unless vrf_heat_cap_f_of_low_temp.nil?
    vrf_outdoor_unit.setHeatingCapacityRatioBoundaryCurve(vrf_heat_cap_ratio_boundary) unless vrf_heat_cap_ratio_boundary.nil?
    vrf_outdoor_unit.setHeatingCapacityRatioModifierFunctionofHighTemperatureCurve(vrf_heat_cap_f_of_high_temp) unless vrf_heat_cap_f_of_high_temp.nil?
    vrf_outdoor_unit.setHeatingEnergyInputRatioModifierFunctionofLowTemperatureCurve(vrf_heat_eir_f_of_low_temp) unless vrf_heat_eir_f_of_low_temp.nil?
    vrf_outdoor_unit.setHeatingEnergyInputRatioBoundaryCurve(vrf_heat_eir_boundary) unless vrf_heat_eir_boundary.nil?
    vrf_outdoor_unit.setHeatingEnergyInputRatioModifierFunctionofHighTemperatureCurve(vrf_heat_eir_f_of_high_temp) unless vrf_heat_eir_f_of_high_temp.nil?
    vrf_outdoor_unit.setHeatingEnergyInputRatioModifierFunctionofLowPartLoadRatioCurve(vrf_heating_eir_low_plr) unless vrf_heating_eir_low_plr.nil?
    vrf_outdoor_unit.setHeatingEnergyInputRatioModifierFunctionofHighPartLoadRatioCurve(vrf_heating_eir_hi_plr) unless vrf_heating_eir_hi_plr.nil?
    vrf_outdoor_unit.setHeatingCombinationRatioCorrectionFactorCurve(vrf_heating_comb_ratio) unless vrf_heating_comb_ratio.nil?
    vrf_outdoor_unit.setHeatingPartLoadFractionCorrelationCurve(vrf_heating_cplffplr) unless vrf_heating_cplffplr.nil?
    vrf_outdoor_unit.setDefrostEnergyInputRatioModifierFunctionofTemperatureCurve(vrf_defrost_eir_f_of_temp) unless vrf_defrost_eir_f_of_temp.nil?

    return vrf_outdoor_unit
  end
end