DEFINITION MODULE SimObjects;
(*****************************************************************
Module SimObjects (MW_V3.0)
Copyright (c) 1991-2006 by Dimitrios Gyalistras, Andreas Fischlin
and ETH Zurich.
Purpose Access to the model and model objects base of
'ModelWorks', plus procedures to attach reference
attributes to 'ModelWorks' objects.
Remarks This module is part of the optional client interface of
'ModelWorks', an interactive Modula-2 modelling and
simulation environment.
Programming
o Design
Dimitrios Gyalistras 25/07/1991
Andreas Fischlin 27/11/1992
o Implementation
Dimitrios Gyalistras 31/07/1991
Andreas Fischlin 27/11/1992
ETH Zurich
Systems Ecology
CHN E 35.1
Universitaetstrasse 16
8092 Zurich
SWITZERLAND
URLs:
<mailto:RAMSES@env.ethz.ch>
<http://www.sysecol.ethz.ch>
<http://www.sysecol.ethz.ch/SimSoftware/RAMSES>
Last revision of definition: 30/05/1998 AF
*******************************************************************)
FROM SYSTEM IMPORT ADDRESS;
FROM DMStrings IMPORT String;
FROM SimBase IMPORT Model, StashFiling, Tabulation, Graphing;
(****************************)
(*##### Attributes #####*)
(****************************)
TYPE
RefAttr;
VAR
aDetachedRefAttr: RefAttr; (* read only variable *)
PROCEDURE AttachRefAttrToModel (m: Model; VAR a: RefAttr; val: ADDRESS);
PROCEDURE DetachRefAttrFromModel(m: Model; VAR a: RefAttr );
PROCEDURE AttachRefAttrToObject (m: Model; VAR o: REAL; VAR a: RefAttr; val: ADDRESS);
PROCEDURE DetachRefAttrFromObject(m: Model; VAR o: REAL; VAR a: RefAttr );
PROCEDURE FindModelRefAttr (m: Model; VAR a: RefAttr);
PROCEDURE FindObjectRefAttr(m: Model; VAR o: REAL; VAR a: RefAttr);
PROCEDURE SetRefAttr(a: RefAttr; val: ADDRESS);
PROCEDURE GetRefAttr(a: RefAttr): ADDRESS;
(*
You may associate with any model or model object an address
attribute by calling AttachRefAttrToModel respectively
AttachRefAttrToObject. The attribute's value may then be
freely used via SetRefAttr for assignments or GetRefAttr for
retrieval purposes. RefAttrs are particularly useful when using
one of the SimBase.DoForAllXYZ procedures. Note that in case
there is currently no attribute attached to a model or object,
the value aDetachedRefAttr is passed by ModelWorks. It is also
possible to access an attribute via model respectively model
plus object by the procedures FindModelRefAttr respectively
FindObjectRefAttr. Note however, that the latter method is
less efficient and is therefore not recommended in heavy
number-crunching simulations. Again aDetachedRefAttr is
returned in case there is currently no attribute attached.
*)
PROCEDURE CurCalcMRefAttr(): ADDRESS;
(*
Returns first attribute associated to the model of which the
initialize, input, output, or dynamic etc. procedure is
currently calculated. The value NIL is returned if
(SimMaster.MWState <> simulating) or (SimMaster.MWSubState <>
running), or if no attribute has been attached to the model.
*)
PROCEDURE CurAboutMRefAttr(): ADDRESS;
(*
Returns first attribute associated to the model of which the
about procedure is currently executed. The value NIL is returned
if this procedure is called outside 'about'.
*)
(***********************************)
(*##### Subprogram levels #####*)
(***********************************)
(*
Only of relevance if implementation features a dynamic linking-loader
such as is the case for MacMETH.
*)
PROCEDURE ModelLevel(m: Model): CARDINAL;
(*
Returns the program level at which model m has been
instanciated if the model exists, otherwise 0.
*)
PROCEDURE ObjectLevel(m: Model; VAR o: REAL): CARDINAL;
(*
Returns the program level at which object o of model m has been
instanciated if such an object exists, otherwise 0.
*)
(*********************************************)
(*##### Direct object manipulations #####*)
(*********************************************)
(*
the following type and procedures allow for very efficient access to
the most important ModelWorks objects. These information are provided
for the advanced client who writes additional, generally usable tools
for the ModelWorks environment. The direct access to some of these
data can be risky - the programmer ought to understand well what
he/she does.
*)
TYPE
MWObj = (Mo, SV, Pa, MV, AV );
RealPtr = POINTER TO REAL;
PtrToClientObject = ADDRESS;
ModelPtr = POINTER TO ModelHeader;
ModelHeader = RECORD
ident : String;
descr : String;
fill1 : String; (* not used *)
fill2 : RealPtr; (* not used *)
fill3, (* not used *)
fill4 : REAL; (* not used *)
nrAttr : INTEGER;
refAttr : PtrToClientObject; (* read only *)
chAttr : CHAR; (* may be freely used to mark the object *)
kind : MWObj; (* read only!! *)
parentM : Model; (* owning model/system, used for hierarchical modeling *)
next : ModelPtr; (* read only!! *)
prev : ModelPtr; (* read only!! *)
lev : CARDINAL; (* read only!! *)
END(*ModelHeader*);
MObjPtr = POINTER TO MObjectHeader;
MObjectHeader = RECORD
ident : String;
descr : String;
unit : String;
varAdr : RealPtr; (* read only!!; real itself may be altered
is the actual state var in case of an sv *)
min, max : REAL; (* is curScaleMin, curScaleMax in case of mv *)
nrAttr : INTEGER; (* SimBase.Attribute *)
refAttr : PtrToClientObject; (* read only *)
chAttr : CHAR; (* may be freely used to mark the object;
e.g. used by module IdentifyPars to mark
parameters for identification. *)
kind : MWObj; (* read only!! *)
parentM : Model; (* read only!! *)
next : MObjPtr; (* read only!! *)
prev : MObjPtr; (* read only!! *)
lev : CARDINAL; (* read only!! *)
END(*MObjectHeader*);
(*
Note: In case of a state variable, its derivative or new
state, respectively, plus its initial values are not
among the fields of MObjectHeader; use procedure SVsDeriv
and GetSVsInits to access them. Similarily, in case of a
monitoring variable, the monitoring attributes can only
be accessed via the routines GetMVsDfltMon and GetMVsCurMon.
*)
PROCEDURE MPtrToM(m: ModelPtr): Model;
PROCEDURE MToMPtr(m: Model): ModelPtr;
PROCEDURE FirstM(): ModelPtr;
PROCEDURE FirstSV( m: Model ): MObjPtr;
PROCEDURE SVsDeriv( objp: MObjPtr ): RealPtr;
PROCEDURE GetSVsInits( objp: MObjPtr; VAR defaultInit,curInit: REAL);
PROCEDURE FirstP ( m: Model ): MObjPtr;
PROCEDURE FirstMV( m: Model ): MObjPtr;
PROCEDURE GetMVsDfltMon ( objp: MObjPtr;
VAR defaultScaleMin,defaultScaleMax: REAL;
VAR defaultSf: StashFiling;
VAR defaultT: Tabulation;
VAR defaultG: Graphing);
PROCEDURE GetMVsCurMon( objp: MObjPtr;
VAR curSf: StashFiling;
VAR curT: Tabulation;
VAR curG: Graphing);
PROCEDURE IsSystem(m: ModelPtr): BOOLEAN;
(*
Lets you learn whether the model m is a pseudo model
representing only an ISIS System (see ISIS module
SysModBase). Ignore such models, since they are no real
dynamic models belonging to ModelWorks. WARNING: Never
remove any of these models, in particular not the very first
or you risk to seriously disrupt the functioning of the
overall system dynamics. Note, however, it is still safe
to call SimBase.RemoveAllModels.
*)
PROCEDURE LastM(): ModelPtr;
PROCEDURE LastSV( m: Model ): MObjPtr;
PROCEDURE LastP ( m: Model ): MObjPtr;
PROCEDURE LastMV( m: Model ): MObjPtr;
(****************************************)
(*##### Removing model objects #####*)
(****************************************)
PROCEDURE RemoveAllSVsOfM (m: Model);
PROCEDURE RemoveAllPsOfM (m: Model);
PROCEDURE RemoveAllMVsOfM (m: Model);
PROCEDURE RemoveAllOfM (m: Model);
(*
Efficient removal routines which let you remove model objects
without having to remove the owning model itself (useful to
preserve relative positioning of models, yet to efficiently
remove model objects).
*)
END SimObjects.