Esempio n. 1
0
 boost::optional<ModelObject> ScheduleBase_Impl::scheduleTypeLimitsAsModelObject() const {
   OptionalModelObject result;
   OptionalScheduleTypeLimits intermediate = scheduleTypeLimits();
   if (intermediate) {
     result = *intermediate;
   }
   return result;
 }
boost::optional<IdfObject> ForwardTranslator::translateZoneControlThermostatStagedDualSetpoint( ZoneControlThermostatStagedDualSetpoint& modelObject )
{
  boost::optional<std::string> s;
  boost::optional<double> value;
  int num;

  IdfObject idfObject(openstudio::IddObjectType::ZoneControl_Thermostat_StagedDualSetpoint);

  m_idfObjects.push_back(idfObject);

  s = modelObject.name();
  idfObject.setName(s.get());

  boost::optional<IdfObject> _zone;
  // ZoneorZoneListName
  if( auto zone = modelObject.thermalZone() ) {
    if( (_zone = translateAndMapModelObject(zone.get())) ) {
      idfObject.setString(ZoneControl_Thermostat_StagedDualSetpointFields::ZoneorZoneListName,_zone->name().get());
    }
  }

  // NumberofHeatingStages
  num = modelObject.numberofHeatingStages();
  idfObject.setInt(ZoneControl_Thermostat_StagedDualSetpointFields::NumberofHeatingStages,num);

  // HeatingTemperatureSetpointScheduleName
  boost::optional<IdfObject> _heatingSchedule;
  if( auto heatingSchedule = modelObject.heatingTemperatureSetpointSchedule() ) {
    if( (_heatingSchedule = translateAndMapModelObject(heatingSchedule.get())) ) {
      idfObject.setString(ZoneControl_Thermostat_StagedDualSetpointFields::HeatingTemperatureSetpointScheduleName,_heatingSchedule->name().get());
    }
  }

  // HeatingThrottlingTemperatureRange
  if( (value = modelObject.heatingThrottlingTemperatureRange()) ) {
    idfObject.setDouble(ZoneControl_Thermostat_StagedDualSetpointFields::HeatingThrottlingTemperatureRange,value.get());
  }

  // Stage1HeatingTemperatureOffset
  if( (value = modelObject.stage1HeatingTemperatureOffset()) ) {
    idfObject.setDouble(ZoneControl_Thermostat_StagedDualSetpointFields::Stage1HeatingTemperatureOffset,value.get());
  }

  // Stage2HeatingTemperatureOffset
  if( (value = modelObject.stage2HeatingTemperatureOffset()) ) {
    idfObject.setDouble(ZoneControl_Thermostat_StagedDualSetpointFields::Stage2HeatingTemperatureOffset,value.get());
  }

  // Stage3HeatingTemperatureOffset
  if( (value = modelObject.stage3HeatingTemperatureOffset()) ) {
    idfObject.setDouble(ZoneControl_Thermostat_StagedDualSetpointFields::Stage3HeatingTemperatureOffset,value.get());
  }

  // Stage4HeatingTemperatureOffset
  if( (value = modelObject.stage4HeatingTemperatureOffset()) ) {
    idfObject.setDouble(ZoneControl_Thermostat_StagedDualSetpointFields::Stage4HeatingTemperatureOffset,value.get());
  }

  // NumberofCoolingStages
  num = modelObject.numberofCoolingStages();
  idfObject.setInt(ZoneControl_Thermostat_StagedDualSetpointFields::NumberofCoolingStages,num);

  // CoolingTemperatureSetpointBaseScheduleName
  boost::optional<IdfObject> _coolingSchedule;
  if( auto coolingSchedule = modelObject.coolingTemperatureSetpointBaseSchedule() ) {
    if( (_coolingSchedule = translateAndMapModelObject(coolingSchedule.get())) ) {
      idfObject.setString(ZoneControl_Thermostat_StagedDualSetpointFields::CoolingTemperatureSetpointBaseScheduleName,_coolingSchedule->name().get());
    }
  }

  // CoolingThrottlingTemperatureRange
  if( (value = modelObject.coolingThrottlingTemperatureRange()) ) {
    idfObject.setDouble(ZoneControl_Thermostat_StagedDualSetpointFields::CoolingThrottlingTemperatureRange,value.get());
  }

  // Stage1CoolingTemperatureOffset
  if( (value = modelObject.stage1CoolingTemperatureOffset()) ) {
    idfObject.setDouble(ZoneControl_Thermostat_StagedDualSetpointFields::Stage1CoolingTemperatureOffset,value.get());
  }

  // Stage2CoolingTemperatureOffset
  if( (value = modelObject.stage2CoolingTemperatureOffset()) ) {
    idfObject.setDouble(ZoneControl_Thermostat_StagedDualSetpointFields::Stage2CoolingTemperatureOffset,value.get());
  }

  // Stage3CoolingTemperatureOffset
  if( (value = modelObject.stage3CoolingTemperatureOffset()) ) {
    idfObject.setDouble(ZoneControl_Thermostat_StagedDualSetpointFields::Stage3CoolingTemperatureOffset,value.get());
  }

  // Stage4CoolingTemperatureOffset
  if( (value = modelObject.stage4CoolingTemperatureOffset()) ) {
    idfObject.setDouble(ZoneControl_Thermostat_StagedDualSetpointFields::Stage4CoolingTemperatureOffset,value.get());
  }

  // This is a workaround for EnergyPlus 8.1 bug
  if( _zone && _heatingSchedule && _coolingSchedule ) {
    std::string baseName = _zone->name().get();

    IdfObject zoneControlThermostat(openstudio::IddObjectType::ZoneControl_Thermostat);
    zoneControlThermostat.setString(ZoneControl_ThermostatFields::Name,baseName + " AutoGenerated ZoneControl");
    zoneControlThermostat.setString(ZoneControl_ThermostatFields::ZoneorZoneListName,_zone->name().get());
    m_idfObjects.push_back(zoneControlThermostat);

    IdfObject scheduleCompact(openstudio::IddObjectType::Schedule_Compact);
    scheduleCompact.setName(baseName + " AutoGenerated Thermostat Type Schedule");
    m_idfObjects.push_back(scheduleCompact);
    scheduleCompact.setString(1,baseName + " AutoGenerated Thermostat Type Limits");
    scheduleCompact.setString(2,"Through: 12/31");
    scheduleCompact.setString(3,"For: AllDays");
    scheduleCompact.setString(4,"Until: 24:00");
    scheduleCompact.setString(5,"4");

    IdfObject scheduleTypeLimits(openstudio::IddObjectType::ScheduleTypeLimits);
    scheduleTypeLimits.setName(baseName + " AutoGenerated Thermostat Type Limits");
    m_idfObjects.push_back(scheduleTypeLimits);
    scheduleTypeLimits.setString(1,"0");
    scheduleTypeLimits.setString(2,"4");
    scheduleTypeLimits.setString(3,"DISCRETE");
    zoneControlThermostat.setString(ZoneControl_ThermostatFields::ControlTypeScheduleName,scheduleCompact.name().get());

    IdfObject idfThermostat(openstudio::IddObjectType::ThermostatSetpoint_DualSetpoint);
    m_idfObjects.push_back(idfThermostat);
    idfThermostat.setName(baseName + " AutoGenerated Thermostat");
    idfThermostat.setString(ThermostatSetpoint_DualSetpointFields::HeatingSetpointTemperatureScheduleName,_heatingSchedule->name().get());
    idfThermostat.setString(ThermostatSetpoint_DualSetpointFields::CoolingSetpointTemperatureScheduleName,_coolingSchedule->name().get());

    StringVector values(zoneControlThermostat.iddObject().properties().numExtensible);
    values[ZoneControl_ThermostatExtensibleFields::ControlObjectType] = idfThermostat.iddObject().name();
    values[ZoneControl_ThermostatExtensibleFields::ControlName] = idfThermostat.name().get();
    IdfExtensibleGroup eg = zoneControlThermostat.pushExtensibleGroup(values);
  }

  return boost::optional<IdfObject>(idfObject);
}
OptionalModelObject ReverseTranslator::translateScheduleTypeLimits( const WorkspaceObject & workspaceObject )
{
  if( workspaceObject.iddObject().type() != IddObjectType::ScheduleTypeLimits )
  {
    LOG(Error, "WorkspaceObject is not IddObjectType: ScheduleTypeLimits");
    return boost::none;
  }

  openstudio::model::ScheduleTypeLimits scheduleTypeLimits( m_model );
  OptionalString s = workspaceObject.name();
  if (s) {
    if ((workspaceObject.numFields() == 1u) &&
        (istringEqual(*s,"Any Number") || istringEqual(*s,"Number")))
    {
      // Do not translate ScheduleTypeLimits called "Any Number" or "Number" and
      // with no other fields specified. Instead, let ModelObjects assign more
      // meaningful limits.
      LOG(Info,"The energyplus::ReverseTranslator throws out all 'Any Number' ScheduleTypeLimits "
          << "to leave the OpenStudio model free to apply the appropriate units and limits.");
      return boost::none;
    }
    scheduleTypeLimits.setName(*s);
  }

  OptionalDouble d = workspaceObject.getDouble(ScheduleTypeLimitsFields::LowerLimitValue);
  if (d) {
    scheduleTypeLimits.setLowerLimitValue(*d);
  }

  d = workspaceObject.getDouble(ScheduleTypeLimitsFields::UpperLimitValue);
  if (d) {
    scheduleTypeLimits.setUpperLimitValue(*d);
  }

  s = workspaceObject.getString(ScheduleTypeLimitsFields::NumericType);
  if (s) {
    scheduleTypeLimits.setNumericType(*s);
  }

  s = workspaceObject.getString(ScheduleTypeLimitsFields::UnitType);
  if (s) {
    scheduleTypeLimits.setUnitType(*s);
  }
  else {
    bool test;
    // Attempt to default based on name (many EnergyPlus files do not have this field filled out).
    std::string name = scheduleTypeLimits.name().get();
    if (boost::regex_search(name,boost::regex("[Tt][Ee][Mm][Pp]"))) {
      if (boost::regex_search(name,boost::regex("[Dd][Ee][Ll][Tt][Aa]"))) {
        test = scheduleTypeLimits.setUnitType("DeltaTemperature");
        BOOST_ASSERT(test);
      }
      else {
        test = scheduleTypeLimits.setUnitType("Temperature");
        BOOST_ASSERT(test);
      }
    }
    else if (boost::regex_search(name,boost::regex("[Oo][Nn]")) &&
             boost::regex_search(name,boost::regex("[Oo][Ff][Ff]")))
    {
      test = scheduleTypeLimits.setUnitType("Availability");
      BOOST_ASSERT(test);
    }
    else if (boost::regex_search(name,boost::regex("[Cc][Oo][Nn][Tt][Rr][Oo][Ll]"))) {
      test = scheduleTypeLimits.setUnitType("ControlMode");
      BOOST_ASSERT(test);
    }
  }

  return scheduleTypeLimits;
}