boost::optional<IdfObject> ForwardTranslator::translateControllerWaterCoil( ControllerWaterCoil & modelObject )
{
  boost::optional<std::string> s;
  boost::optional<double> value;

  IdfObject idfObject(IddObjectType::Controller_WaterCoil);

  m_idfObjects.push_back(idfObject);

  // Name

  s = modelObject.name();
  if( s )
  {
    idfObject.setName(*s);
  }

  // ControlVariable

  if( s = modelObject.controlVariable() )
  {
    idfObject.setString(Controller_WaterCoilFields::ControlVariable,s.get());
  }

  // Action

  if( s = modelObject.action() )
  {
    idfObject.setString(Controller_WaterCoilFields::Action,s.get());
  }

  // ActuatorVariable

  if( s = modelObject.actuatorVariable() )
  {
    idfObject.setString(Controller_WaterCoilFields::ActuatorVariable,s.get());
  }

  // SensorNodeName

  if( boost::optional<Node> node = modelObject.sensorNode() )
  {
    idfObject.setString(Controller_WaterCoilFields::SensorNodeName,node->name().get());
  }

  // ActuatorNodeName

  if( boost::optional<Node> node = modelObject.actuatorNode() )
  {
    idfObject.setString(Controller_WaterCoilFields::ActuatorNodeName,node->name().get());
  }

  // ControllerConvergenceTolerance

  if( modelObject.isControllerConvergenceToleranceAutosized() )
  {
    idfObject.setString(Controller_WaterCoilFields::ControllerConvergenceTolerance,"Autosize");
  }
  else if( value = modelObject.controllerConvergenceTolerance() )
  {
    idfObject.setDouble(Controller_WaterCoilFields::ControllerConvergenceTolerance,value.get());
  }

  // MaximumActuatedFlow

  if( modelObject.isMaximumActuatedFlowAutosized() )
  {
    idfObject.setString(Controller_WaterCoilFields::MaximumActuatedFlow,"Autosize");
  }
  else if( value = modelObject.maximumActuatedFlow() )
  {
    idfObject.setDouble(Controller_WaterCoilFields::MaximumActuatedFlow,value.get());
  }

  // MinimumActuatedFlow

  if( value = modelObject.minimumActuatedFlow() )
  {
    idfObject.setDouble(Controller_WaterCoilFields::MinimumActuatedFlow,value.get());
  }

  return boost::optional<IdfObject>(idfObject);
}
boost::optional<IdfObject> ForwardTranslator::translateControllerWaterCoil( ControllerWaterCoil & modelObject )
{
  boost::optional<std::string> s;
  boost::optional<double> value;

  IdfObject idfObject(IddObjectType::Controller_WaterCoil);

  m_idfObjects.push_back(idfObject);

  // Name

  s = modelObject.name();
  if( s )
  {
    idfObject.setName(*s);
  }

  // ControlVariable

  if( (s = modelObject.controlVariable()) )
  {
    idfObject.setString(Controller_WaterCoilFields::ControlVariable,s.get());
  }

  // Action

  if( (s = modelObject.action()) )
  {
    idfObject.setString(Controller_WaterCoilFields::Action,s.get());
  }

  // ActuatorVariable

  if( (s = modelObject.actuatorVariable()) )
  {
    idfObject.setString(Controller_WaterCoilFields::ActuatorVariable,s.get());
  }

  boost::optional<model::WaterToAirComponent> waterCoil;
  if( auto hvacComp = modelObject.getImpl<model::detail::ControllerWaterCoil_Impl>()->waterCoil() ) {
    waterCoil = hvacComp->optionalCast<model::WaterToAirComponent>();
  }

  // SensorNodeName

  if( boost::optional<Node> node = modelObject.sensorNode() ) {
    idfObject.setString(Controller_WaterCoilFields::SensorNodeName,node->name().get());
  } else if( waterCoil ) {
    if( auto node = waterCoil->airOutletModelObject() ) {
      idfObject.setString(Controller_WaterCoilFields::SensorNodeName,node->name().get());
    }
  }

  // ActuatorNodeName

  if( boost::optional<Node> node = modelObject.actuatorNode() ) {
    idfObject.setString(Controller_WaterCoilFields::ActuatorNodeName,node->name().get());
  } else if( waterCoil ) {
    if( auto node = waterCoil->waterInletModelObject() ) {
      idfObject.setString(Controller_WaterCoilFields::ActuatorNodeName,node->name().get());
    }
  }

  // ControllerConvergenceTolerance

  if( modelObject.isControllerConvergenceToleranceAutosized() )
  {
    idfObject.setString(Controller_WaterCoilFields::ControllerConvergenceTolerance,"Autosize");
  }
  else if( (value = modelObject.controllerConvergenceTolerance()) )
  {
    idfObject.setDouble(Controller_WaterCoilFields::ControllerConvergenceTolerance,value.get());
  }

  // MaximumActuatedFlow

  if( modelObject.isMaximumActuatedFlowAutosized() )
  {
    idfObject.setString(Controller_WaterCoilFields::MaximumActuatedFlow,"Autosize");
  }
  else if( (value = modelObject.maximumActuatedFlow()) )
  {
    idfObject.setDouble(Controller_WaterCoilFields::MaximumActuatedFlow,value.get());
  }

  // MinimumActuatedFlow

  if( (value = modelObject.minimumActuatedFlow()) )
  {
    idfObject.setDouble(Controller_WaterCoilFields::MinimumActuatedFlow,value.get());
  }

  return boost::optional<IdfObject>(idfObject);
}