Template:CMI Example CMI run CXX

From CSDMS
  this->log.info ("Updating.");
  this->log.info (this->CMI_get_status ());

  if (this->status == CMI_STATUS_UPDATING)
    return TRUE;
  else
    this->status = CMI_STATUS_UPDATING;

  {
    double print_time = this->print_q.next_print_time ();
    while (print_time>0 && print_time<time_interval)
    {
      this->status = CMI_STATUS_UPDATED;

      this->log.info ("Running until next print time.");
      this->CMI_run (print_time);

      this->print_q.print_all (print_time);
      print_time = this->print_q.next_print_time ();
    }
  }

  { // Run model until the stop time
    double now = this->state.get_current_time ();
    double port_queue_dt = CMI_PORT_QUEUE_DT;
    double t = now + port_queue_dt;
    for (; t<time_interval; t+=port_queue_dt)
    {
#if CMI_TURN_OFF_PORTS
      this->log.warning ("Forgetting ports for now.");
#else
      this->log.info ("Updating ports.");
      this->ports.run_ports (now);
#endif

#if CMI_TURN_OFF_MAPPING
      this->log.warning ("Not mapping values.");
#else
      this->log.info ("Mapping values.");
      this->ports.run_mappers ();
#endif

      this->log.info ("Updating myself.");
      this->state.update_until (t);

      now = this->state.get_current_time ();
    }

    if (t>time_interval)
    { // The last partial time step (if necessary).
#if CMI_TURN_OFF_PORTS
      this->log.warning ("Forgetting ports for now.");
#else
      this->log.info ("Updating ports.");
      this->ports.run_ports (now);
#endif

#if CMI_TURN_OFF_MAPPING
      this->log.warning ("Not mapping values.");
#else
      this->log.info ("Mapping values.");
      this->ports.run_mappers ();
#endif

      this->log.info ("Updating myself.");
      this->state.update_until (time_interval);
    }
  }

  this->status = CMI_STATUS_UPDATED;
  ::std::cerr << CMI_COMPONENT_NAME ": Status is "
              << this->CMI_get_status () << ::std::endl;

  this->log.info ("Updated.");
  this->log.info (this->CMI_get_status ());
  return TRUE;