Using the OASIS3-MCT coupling library, the user has the flexibility to reproduce different coupling algorithms defining LAG values for the different coupling fields . In the components, the sending and receiving routines, respectively oasis_put and oasis_get, can be called at each component timestep, with the appropriate date argument giving the actual time (at the beginning of the timestep), expressed in number of seconds since the start of the run, or in any other time units as long as the same are used in all components and in the namcouple (see section 2.2.7). This date argument is automatically analysed by the coupling library and depending on the coupling period and the lag chosen by the user for the coupling field in the namcouple (LAG), different coupling algorithms can be reproduced without modifying the component codes themselves.
The lag (LAG) must be expressed in the time unit used (that must be the same in the components and in the namcouple, see section 2.2.7) and can be positive or negative but should never be larger (in absolute magnitude) than the coupling period of any field due to problems with restartability and dead-locking. When a component calls a oasis_put, the value of the lag is automatically added to the value of the date argument and the “put” is actually performed when the sum date+lag is a coupling time; in the target component, this “put” will match a oasis_get for which the date argument is the same coupling time. So the lag only shifts the time at which the data is sent but not the time at which the data is received.
When the lag is positive, a restart file must be available to initiate the coupling. For a field with positive lag, the source component automatically reads the field in the restart file during the coupling initialization phase (below the oasis_enddef) and send the data to match the oasis_get performed at time=0 in the target component. The final coupling data on the source side will then be automatically written to the restart file for use in the next run7.
On the 4 figures in this section, short black arrows correspond to oasis_put or oasis_get called in the component that do not lead to any “put" or receiving action; long black arrows correspond to oasis_put or oasis_get called in the components that do actually lead to a “put" or “get” action; long red arrows correspond to oasis_put or oasis_get called in the component models that lead to a reading or writing of the coupling field from or to a coupling restart file.
A first coupling algorithm, exploiting the LAG concept, is illustrated on figure 2.9.
During a coupling timestep, model A receives and then sends ; its timestep length is 4. During a coupling timestep, model B receives and then sends ; its timestep length is 6. and coupling periods are respectively 12 and 24. If / “put" action by model A/B was used at a coupling timestep to match the model B/A “get" action, a deadlock would occur as both models would be initially waiting on a “get" action. To prevent this, and produced at the timestep before have to be used to match respectively the model B and model A “get" actions.
This implies that a lag of respectively 4 and 6 seconds must be defined for and . For , the oasis_put performed at time 8 and 20 by model A will then lead to “put" actions (as 8 + 4 = 12 and 20 + 4 = 24 which are coupling periods) that match the “get" actions performed by oasis_get called by model B at times 12 and 24. For , the oasis_put performed at time 18 by model B then leads to a “put" action (as 18 + 6 = 24 which is a coupling period) that matches the “get" action performed at time 24 by the oasis_get called by model A.
At the beginning of the run, as their LAG index is greater than 0, the first oasis_get of and will automatically be fulfilled with fields read from their respective coupling restart files. The user therefore has to create those coupling restart files before the first run in the experiment. At the end of the run, having a lag greater than 0, is automatically written to its coupling restart file below the last oasis_put as the date+lag equals the total run time. The analogue is true for . These coupling restart fields will automatically be read in at the beginning of the next run below the respective oasis_get.
A second coupling algorithm exploiting the LAG concept is illustrated on figure 2.10. During its timestep, model A receives , sends and then ; its timestep length is 6. During its timestep, model B receives , receives and then sends ; its timestep length is also 6. , and coupling periods are both supposed to be equal to 12.
For and the situation is similar to the first example. Without any lag specified and without any restart file, a deadlock would occur as both models would be waiting on a “get" action. To prevent this, and produced at the timestep before have to be used to match the model A and model B “get" actions, which means that a lag of 6 must be defined for both and . For both coupling fields, the oasis_put performed at times 6 and 18 by the source model then lead to “put" actions (as 6 + 6 = 12 and 18 + 6 = 24 which are coupling periods) that match the “get" action performed at time 12 and 24 by the oasis_get called by the target model.
For , sent by model A and received by model B, no lag needs to be defined: the coupling field produced by model A at the coupling timestep can be “consumed” by model B without causing a deadlock situation.
As in the first example, the oasis_get performed at the beginning of the run for and , will automatically receive data read from their coupling restart files, and the last oasis_put performed at the end of the run automatically write them to their coupling restart file. For , no coupling restart file is needed.
We see here how the introduction of appropriate LAG indices results in receiving in the target component the coupling fields produced by the source component the time step before; this is, in some coupling configurations, essential to avoid deadlock situations.