Initializing help system before first use

Stopping the submodel execution

If a submodel execution takes a long time it may be desirable to interrupt the submodel without stopping the master model itself. The following modified version of our master model (file runsubwait.mos) shows how this can be achieved by adding a duration (in seconds) to the wait statement. If the submodel has not yet sent the termination event message after executing for one second it is stopped by the call to stop with the model reference.

model "Run model testsub"
 uses "mmjobs"

 declarations
  modSub: Model
 end-declarations
                                   ! Compile the model file
 if compile("testsub.mos")<>0 then exit(1); end-if
 load(modSub, "testsub.bim")       ! Load the bim file
 run(modSub)                       ! Start model execution
 wait(1)                           ! Wait 1 second for an event

 if isqueueempty then              ! No event has been sent: model still runs
  writeln_("Stopping the submodel")
  stop(modSub)                     ! Stop the model
  wait                             ! Wait for model termination
 end-if
 dropnextevent                     ! Ignore termination event message

end-model 

A more precise time measurement can be obtained by retrieving a "model ready" user event from the submodel before we begin to wait for a given duration. With heavy operating system loads the actual submodel start may be delayed, and the event sent by the submodel tells the master model the exact point of time when its processing is started. Class codes for user events can take any integer value greater than 1 (values 0 and 1 are reserved respectively for the nullevent and the predefined class EVENT_END).

model "Run model testsub"
 uses "mmjobs"

 declarations
  modSub: Model
  ev: Event
  SUBMODREADY = 2                  ! User event class code
 end-declarations
                                   ! Compile the model file
 if compile("testsubev.mos")<>0 then exit(1); end-if
 load(modSub, "testsubev.bim")     ! Load the bim file
 run(modSub)                       ! Start model execution
 wait                              ! Wait for an event
 if getclass(getnextevent) <> SUBMODREADY then
  writeln_("Problem with submodel run")
  exit(1)
 end-if

 wait(1)                           ! Let the submodel run for 1 second

 if isqueueempty then              ! No event has been sent: model still runs
  stop(modSub)                     ! Stop the model
  wait                             ! Wait for model termination
 end-if

 ev:=getnextevent                  ! An event is available: model finished
 writeln_("Event class: ", getclass(ev))
 writeln_("Event value: ", getvalue(ev))
 writeln_("Exit code  : ", getexitcode(modSub))

end-model 

The modified submodel testsubev.mos now looks as follows. The user event class must be the same as in the master model. In this example we are not interested in the value sent with the event and therefore simply leave it at 0.

model "Test submodel (Event)"
 uses "mmjobs"

 declarations
  SUBMODREADY = 2                  ! User event class code
 end-declarations

 send(SUBMODREADY, 0)              ! Send "submodel ready" event

 forall(i in 10..20) write(i^2, " ")
 writeln

end-model