|
|
|
|
||
|
DEFINITION MODULE SimDatAux; (******************************************************************* Module SimDatAux (SD_Version_2.0) Copyright (c) 1997-2006 by Andreas Fischlin and ETH Zurich. Purpose Support the use of models and their needed data as provided by data frames. Remarks The core routine is AssignDatFraData, which assigns data from all data frames currently stored in memory to all models and model objects via identifier match. Provides menu commands which can be installed with a single command or can be used for installation in any other context of all major functions provided by this module. This module provides operations to make the link between data frames and models plus model objects declared via SimBase from ModelWorks. See also modules SimBase (from ModelWorks), SimDatAccess, DataFrames, and DatFraViewer. This module does not let you look at the data frames, which remain hidden in memory at all times. However, module DatFraViewer lets you view, inspect, and even manage data frames. Uses SimDatAccess, SimDatDump, and DataFrames plus ModelWorks and the "Dialog Machine". Programming o Design Andreas Fischlin 17/09/1997 o Implementation Andreas Fischlin 17/09/1997 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: 25/05/1998 AF *******************************************************************) FROM DMMenus IMPORT Menu; FROM DMLanguage IMPORT userBase; (* Error constants: simDatAuxErrOffset = DMLanguage.userBase + 380 .. 390-1 *) (******************************************) (* Model Data Base menu and menu commands *) (******************************************) PROCEDURE InstallSDAMenuCmds (title: ARRAY OF CHAR); (* Installs a menu with the title 'title' plus the basic model data base management commands (see routines below). Typical usage: InstallSDAMenuCmds(''). In case 'title' is the empty string, a default menu title will be provided. *) PROCEDURE RemoveSDAMenuCmds; (* Reverts the effect of InstallSDAMenuCmds by removing the current model base menu (plus any possibly client installed commands as well!). *) (*---------------*) (* Customization *) (*---------------*) PROCEDURE SimDatAuxMenu(): Menu; (* Returns the model data base's menu in order to customize the menu by installing additional commands in it, e.g. by using routines from DMMenus. *) PROCEDURE SetSDAPreferences( clearAtDeassignMode : BOOLEAN; showIDsAlways : BOOLEAN; reportOnCheckFail : BOOLEAN; packageErrMode : INTEGER; globLikePkgErrMode : BOOLEAN); PROCEDURE GetSDAPreferences(VAR clearAtDeassignMode : BOOLEAN; VAR showIDsAlways : BOOLEAN; VAR reportOnCheckFail : BOOLEAN; VAR packageErrMode : INTEGER; VAR globLikePkgErrMode : BOOLEAN); (* Lets you control the current preferences. The values will be remembered and stored as part of the permanent preferences. Meaning: clearAtDeassignMode A call to routine DeassignData clears all assignments instead of restoring the last present before last call to AssignDatFraData showIDsAlways Identifiers are shown of model objects even if they have been fully cleared reportOnCheckFail After an assignment of data using core procedure AssignDatFraData from this module a dialog will report in case any model objects have still invalid data. This warns the user about possible failures of subsequent simulations. *) CONST suppressAllErrMode = 0; (* values used for packageErrMode *) warnOnceErrMode = 1; immediateErrMode = 2; debugErrMode = 3; (* Routines GetSDAPreferences and SetSDAPreferences recognize these values for preference packageErrMode packageErrMode meaning -------------- ------- suppressAllErrMode Never show any error messages, i.e. SuppressMsgDisplay from Errors is called. Investigation of error presence and possible display of them is completely the callees responsibility. Use module Errors to check for error occurrence and display of possibly accumulated errors. warnOnceErrMode Inform about single or warn and ask for inspection if many errors (default mode). immediateErrMode No suppression of error displays at all and all errors are shown immediately, i.e. SuppressMsgDisplay from Errors is not called like in above modes. debugErrMode Similar to above but offers the advantage that Errors.Info messages are displayed as Errors.Halt messages and may display additional, internal debugging messages (calls Errors.SetDebugMode(TRUE)). Note, if you call SetSDAPreferences and change packageErrMode, this may trigger the display of errors if the mode changes to a less quiet one. You can use this effect for instance to acchieve temporarily a completely quiet mode (suppressAllErrMode) and then call SetSDAPreferences to change to warnOnceErrMode to learn about the possible presence of some errors encountered in the past. IMPLEMENTATION RESTRICTION: Note changing packageErrMode values by calling SetSDAPreferences affects the error mode of the packages ModelWorks Data extension (SimData, menu "Data") and ISIS throughout. globLikePkgErrMode This flags lets you control the behavior of error handling for the category of global errors identical to that as defined by packageErrMode. Note, any errors not falling within the range DMLanguage.userBase + 300 and + 450, i.e. [600..750]) are not affected by packageErrMode. All errors as defined by modules DMLanguage (or Errors) are predefined global errors and may also be raised by any operation of the SimData package, e.g. file opening or memory shortage errors etc. *) PROCEDURE GetSDAMenuAliasChars ( VAR loadDatAlCh, loadDatFromAlCh, sdfAlCh, sasdfAlCh, assgnDatAlCh, deassignDatAlCh, assgnGloSiPsAlCh, chMLevAlCh, chTLevAlCh, placeWinsAlCh, chkErrAlCh, editPrefsAlCh, editAlChsAlCh: CHAR); PROCEDURE SetSDAMenuAliasChars ( loadDatAlCh, loadDatFromAlCh, sdfAlCh, sasdfAlCh, assgnDatAlCh, deassignDatAlCh, assgnGloSiPsAlCh, chMLevAlCh, chTLevAlCh, placeWinsAlCh, chkErrAlCh, editPrefsAlCh, editAlChsAlCh: CHAR); (* Above two procedures lets you control the keyboard short cuts used by the model data base menu commands. GetSDAMenuAliasChars is typically used if you wish to modify only a few of the keyboard shortcuts in a GetSDAMenuAliasChars(loadDatAlCh,... ; SetSDAMenuAliasChars(loadDatAlCh,... sequence. The values will be remembered and stored as part of the permanent preferences. The characters are used as alias characters for the commands (see below) as follows: loadDatAlCh - LoadDFFromFileIntoMem loadDatFromAlCh - LoadDFFromOtherFileIntoMem sdfAlCh - SaveDF sasdfAlCh - SaveAsDF assgnDatAlCh - AssignDatFraData deassignDatAlCh - DeassignData assgnGloSiPsAlCh - AssignGlobSimPars chMLevAlCh - AssignModelsMonitoringForLevel chTLevAlCh - AssignModelsTallyingForLevel placeWinsAlCh - PlaceSimEnvsWindows chkErrAlCh - CheckForErrPresence editPrefsAlCh - (not available, but see SetSDAPreferences) editAlChsAlCh - (not available, but see SetSDAMenuAliasChars) *) PROCEDURE ResetSDAToPresettings; (*****************************) (* Model Data Base Functions *) (*****************************) (* each function is available as a command in the default menu *) PROCEDURE LoadDFFromFileIntoMem; (* Starting from the current anchor file, routine LoadDFFromFileIntoMem scans the file's (and possibly therein referenced other files') content and loads all the data found into memory (for details see module DataFrames). Note, no filtering takes place and all data frames and file references are recognized during this reading and loading process. If the user has never selected an anchor file, this routine behaves like LoadDFFromOtherFileIntoMem (called with empty string parameters). After successful completion data are kept in memory and are ready to be used, e.g. to be assigned to models and model objects. Use AssignDatFraData to actually assign the data to the currently known model and model objects. Loading can also be repeated and the result will be a merging and accumulation of all data encountered during any previous loading process. However, if the same data are encountered, especially if the data frame identifier is identical, the previously stored data are discarded and replaced with the latest read, supporting a convenient updating. NOTE: As an alternative you may also use module DatFraViewer to load data frames into memory. The latter module offers the advantage to allow for inspection of the data currently stored in memory, plus many more functions, such as unloading and versatile filtering during the loading process etc. Note, it does not matter by which method data were actually loaded into memory; the data are always accessible via the retrieval methods offered by module DataFrames. *) PROCEDURE LoadDFFromOtherFileIntoMem(path,filename: ARRAY OF CHAR); (* Like LoadDFFromFileIntoMem but operates on the anchor file denoted by path and filename. In case path and filename are the empty string, this routine offers the standard file opening dialog to interactively select an anchor file for reading. *) (********************************************) (*##### Assigning/Deassigning Data #####*) (********************************************) PROCEDURE AssignDatFraData; (* Assigns all data presently stored in memory in form of so called data frames (see module DataFrames) to the currently known models and model objects. Use DeassignData to revert the effect of this routine. Such an assignment is only possible if the identifier of a particular model object and its owning model match the identifier given by the data value definition (see module DataFrames for details). For instance the following data given according to the data frame syntax (for EBNF see module DataFrames): (*============================================================*) (* Model Parameters *) (*============================================================*) DATAFRAME Parameters; REMARK = 'For any logistic growth model' ; MODEL = ANY; KEYCOLUMN = Ident; DATA: (*============================================================*) Ident Descr DfltVal MinVal MaxVal Unit RTC ; (*------------------------------------------------------------*) r 'Relative growth rate' 0.7 0.0 10.0 'd^-1' TRUE ; K 'Carrying capacity' 700.0 0.0 1.0E+38 'g/m^2' FALSE ; (*------------------------------------------------------------*) END Parameters; (*============================================================*) will match model objects of the logistic growth model equation, given they have been declared in the model definition program with matching identifiers like this: VAR m : Model; grass : StateVar; grassDot : Derivative; r, K : Parameter; DeclP(r, 0.7, 0.0, 10.0, rtc, "r (growth rate of grass)", "r", "/day"); DeclP(K, 700.0, 0.0, 10000.0, rtc, "K (carrying capacity)", "K", "g dry weight/m^2"); Routine DeclP is available from module SimBase. Above data frame Parameters can be assigned to any model (see phrase MODEL = ANY) as long as the identifiers listed in the key column headed with the identifier 'Ident' (see phrase KEYCOLUMN = Ident) match those specified in DeclP. E.g. the DfltVal 0.7 tabulated for Ident = r is assigned to the variable r (type Parameter). With the phrase MODEL = LogGrowth it would be possible to have a more specific match, i.e. 'LogGrowth.r'. The success of AssignDatFraData requires the model has been declared as follows: DeclM(m, Euler, NoInitialize, NoInput, NoOutput, Dynamic, NoTerminate, ModelObjects, "Logistic grass growth model", "LogGrowth", NoAbout); Routine DeclM is available from module SimBase. To numerically solve the logistic equation use the parameters r and K in this procedure as follows: PROCEDURE Dynamic; BEGIN grassDot:= r*((K-grass)/K)*grass; END Dynamic; Data frames can be formatted freely, as long as they observe the syntax (see module DataFrames). In addition AssignDatFraData requires that column headers use reserved identifiers. These are: Reserved identifier State Model Monitoring Variables Parameters attributes ------------------- --------- ---------- ---------- S Ident yes yes yes S Descr yes yes yes S Unit yes yes - R DfltInit yes - - R MinInit yes - - R DfltVal - yes - R MinVal - yes - R MaxVal - yes - B RTC - yes - R ScaleMin - - yes R ScaleMax - - yes B Filing - - yes B Tabulation - - yes I Graphing * - - yes where S = Identifier or string, R = real, I = integer number, B = boolean. * denotes monitoring level *) PROCEDURE DeassignData; (* Discards all data possibly assigned by AssignDatFraData and assigns to all model objects an undefined value. Note: This routine has no effect if executed in the ModelWorks state simulating or sub-state running (see module SimMaster) respectively to avoid a crash during simulation because you typically assign undefREAL (from module DMConversions) to model objects which are used in calculations. Instead a sound is generated to inform the simulationist about the refused operation. *) PROCEDURE AssignGlobSimPars; (* Assigns all data presently stored in memory in form of so called data frames (see module DataFrames) to the global simulation parameters. Use DeassignData to revert the effect of this routine. Such an assignment is only possible if the identifier of a particular global simulation parameter matches the identifier given by the data value definition (see module DataFrames and routine AssignGlobalSimulationData from module SysDatAccess for details). *) PROCEDURE AssignModelsMonitoringForLevel; (* Offers an entry form which let's the user define a level on which the monitoring attributes are to be assigned to the currently present model objects. If the dialog is answered with OK all monitoring attributes of the entered level such as curves, scales, or colors, are assigned accordingly. The monitoring level is an integer as tabulated in a column with reserved heading 'MonitLev'. Any variable whose monitoring level is equal the current monitoring level will be in display, any other will remain invisible. At monitoring level 0 all monitoring variables are discarded and there is normally no monitoring done. Beyond an upper limit the same settings from the last level are used at all times. This mechanism allows for easy activation or deactivation, respectively, of many monitoring variables with a single command. There are even keyboard short cuts available to alter the current monitoring level without this dialog. IMPORTANT NOTE: Each time the monitoring level is changed there happens actually a full assignment (calls AssignAllMonitoring from module SimDatAccess), i.e. any graphs, tables, graphing settings etc. present previously to the switch of the level will be discarded and overwritten. Thus, always save the current state to the a data frame if you wish to preserve at least the monitoring settings before changing to another level. Moreover, from this principle follows, if you wish to preserve the monitoring settings from several levels, make sure you always save AND load (!) the to and from the data frame before switching the monitoring level. Otherwise you loose your precious editing since the saving does only write newly edited monitoring attributes to the data frame for the current monitoring level; for all other monitoring levels it uses only the values currently stored in memory from the last load of the data frame. IMPLEMENTATION RESTRICTION: Only a maximum of 7 monitoring levels are fully remembered. *) PROCEDURE AssignModelsTallyingForLevel; (* Similar to AssignModelsMonitoringForLevel. Offers an entry form which lets the simulationist edit the tallying level and cause an assignment of the tallying attributes to the present model objects. For any model object with a TallyLev equal to the current tallying level tally statistics will be computed and output made according to the current tallying specifications, typically provided by means of data frames. Implies a data assignment as provided by the routine AssignAllTallying from module SimDatAccess. *) PROCEDURE PlaceSimEnvsWindows; (* Places all windows according to the frame definitions as specified in the data frame with name "Windows". In case the data frame has not been loaded into memory, procedure does nothing. (Note, that the RAMSES shell may automatically call this procedure when entering the Simulation Session in case the sessions preferences are set such that the data frame utils are automatically activated!) *) (***********************************************************) (*##### Storing Current Data on a Data Frame File #####*) (***********************************************************) PROCEDURE SaveDF; (* Saves the data of all currently available models and model objects as data frames in the current anchor file. Separate data frames are created for each class of model objects, i.e. one for variables, for parameters, and for monitoring attributes, again on a per model basis. Note, all these data frames are written into the same file, regardless of the number of files the data may have come from when they were originally loaded. Upon first time call to SaveDF, the standard file creating dialog is offered, which lets the user choose the file on which to save the data. Subsequent calls will write to the same file unless SaveAsDF is called. IMPORTANT NOTE: During the first call to this routine after having loaded freshly data, the user is asked whether the original data may actually be overwritten. However, subsequent calls quietly overwrite the file without any warning!!! *) PROCEDURE SaveAsDF; (* Similar to SaveDF but offers always a file creating dialog. *) (********************************) (*##### Error Handling #####*) (********************************) PROCEDURE CheckForErrPresence; (* Checks for the presence of errors which might have been encountered during past operations. In case packageErrMode = suppressAllErrMode OR packageErrMode = warnOnceErrMode possibly occurring errors are not displayed but kept in memory for display till you call this procedure. *) END SimDatAux.
|
||
|
|
|