From 4458ef24c8d09de9c56b62f1e711708186481cbf Mon Sep 17 00:00:00 2001 From: Bonnie Kwiatkowski Date: Mon, 18 Oct 2021 14:49:18 -0400 Subject: [PATCH] Add code and instructions Initial version of the Substitutable Resource model --- Install and Run ResourceSubstitutable.docx | Bin 0 -> 337914 bytes README.md | 28 +- ResourceSubstitutable.txt | 183 ++ modelshell/FileioGrid.pas | 18 + modelshell/FmGridMain.pas | 1599 +++++++++++++ modelshell/Options.lfm | 469 ++++ modelshell/Options.pas | 737 ++++++ modelshell/ParamList.lfm | 80 + modelshell/ParamList.pas | 142 ++ modelshell/ProgressBar.lfm | 58 + modelshell/ProgressBar.pas | 62 + modelshell/ReloadDlg.lfm | 82 + modelshell/ReloadDlg.pas | 57 + modelshell/ScaleDlg.lfm | 150 ++ modelshell/ScaleDlg.pas | 132 ++ modelshell/SeriesForm.lfm | 82 + modelshell/SeriesForm.pas | 104 + modelshell/aboutbox.lfm | 228 ++ modelshell/aboutbox.pas | 46 + modelshell/batchmain.lfm | 106 + modelshell/batchmain.pas | 698 ++++++ modelshell/calculate.lfm | 98 + modelshell/calculate.pas | 108 + modelshell/create_equations/CrEquations.ico | Bin 0 -> 137040 bytes modelshell/create_equations/CrEquations.lpi | 345 +++ modelshell/create_equations/CrEquations.lpr | 19 + modelshell/create_equations/CrEquations.res | Bin 0 -> 139052 bytes .../create_equations/Model description.txt | 49 + modelshell/create_equations/crmain.lfm | 101 + modelshell/create_equations/crmain.pas | 2010 +++++++++++++++++ .../create_equations/equationsblank.pas | 302 +++ modelshell/create_equations/stypes.pas | 257 +++ modelshell/data.lfm | 121 + modelshell/data.pas | 245 ++ modelshell/display.lfm | 614 +++++ modelshell/display.pas | 1528 +++++++++++++ modelshell/equations.pas | 1166 ++++++++++ modelshell/fileio.pas | 1310 +++++++++++ modelshell/frontend.lfm | 476 ++++ modelshell/frontend.pas | 1029 +++++++++ modelshell/integrator.pas | 143 ++ modelshell/modelbatch.lpi | 182 ++ modelshell/modelbatch.lpr | 37 + modelshell/modelbatch.lps | 358 +++ modelshell/modelbatch.res | Bin 0 -> 2348 bytes modelshell/modelshellv654.ico | Bin 0 -> 137040 bytes modelshell/modelshellv654.lpi | 562 +++++ modelshell/modelshellv654.lpr | 47 + modelshell/modelshellv654.res | Bin 0 -> 139052 bytes modelshell/note.lfm | 74 + modelshell/note.pas | 145 ++ modelshell/parameter.lfm | 80 + modelshell/parameter.pas | 179 ++ modelshell/stypes.pas | 259 +++ modelshell/trouble.lfm | 1896 ++++++++++++++++ modelshell/trouble.pas | 79 + 56 files changed, 18879 insertions(+), 1 deletion(-) create mode 100644 Install and Run ResourceSubstitutable.docx create mode 100644 ResourceSubstitutable.txt create mode 100644 modelshell/FileioGrid.pas create mode 100644 modelshell/FmGridMain.pas create mode 100644 modelshell/Options.lfm create mode 100644 modelshell/Options.pas create mode 100644 modelshell/ParamList.lfm create mode 100644 modelshell/ParamList.pas create mode 100644 modelshell/ProgressBar.lfm create mode 100644 modelshell/ProgressBar.pas create mode 100644 modelshell/ReloadDlg.lfm create mode 100644 modelshell/ReloadDlg.pas create mode 100644 modelshell/ScaleDlg.lfm create mode 100644 modelshell/ScaleDlg.pas create mode 100644 modelshell/SeriesForm.lfm create mode 100644 modelshell/SeriesForm.pas create mode 100644 modelshell/aboutbox.lfm create mode 100644 modelshell/aboutbox.pas create mode 100644 modelshell/batchmain.lfm create mode 100644 modelshell/batchmain.pas create mode 100644 modelshell/calculate.lfm create mode 100644 modelshell/calculate.pas create mode 100644 modelshell/create_equations/CrEquations.ico create mode 100644 modelshell/create_equations/CrEquations.lpi create mode 100644 modelshell/create_equations/CrEquations.lpr create mode 100644 modelshell/create_equations/CrEquations.res create mode 100644 modelshell/create_equations/Model description.txt create mode 100644 modelshell/create_equations/crmain.lfm create mode 100644 modelshell/create_equations/crmain.pas create mode 100644 modelshell/create_equations/equationsblank.pas create mode 100644 modelshell/create_equations/stypes.pas create mode 100644 modelshell/data.lfm create mode 100644 modelshell/data.pas create mode 100644 modelshell/display.lfm create mode 100644 modelshell/display.pas create mode 100644 modelshell/equations.pas create mode 100644 modelshell/fileio.pas create mode 100644 modelshell/frontend.lfm create mode 100644 modelshell/frontend.pas create mode 100644 modelshell/integrator.pas create mode 100644 modelshell/modelbatch.lpi create mode 100644 modelshell/modelbatch.lpr create mode 100644 modelshell/modelbatch.lps create mode 100644 modelshell/modelbatch.res create mode 100644 modelshell/modelshellv654.ico create mode 100644 modelshell/modelshellv654.lpi create mode 100644 modelshell/modelshellv654.lpr create mode 100644 modelshell/modelshellv654.res create mode 100644 modelshell/note.lfm create mode 100644 modelshell/note.pas create mode 100644 modelshell/parameter.lfm create mode 100644 modelshell/parameter.pas create mode 100644 modelshell/stypes.pas create mode 100644 modelshell/trouble.lfm create mode 100644 modelshell/trouble.pas diff --git a/Install and Run ResourceSubstitutable.docx b/Install and Run ResourceSubstitutable.docx new file mode 100644 index 0000000000000000000000000000000000000000..f6f5f7a5f3c62dc3855748bc0ebe0734302f3261 GIT binary patch literal 337914 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 SeBc+Djig)BF|yq4JhuQ@oa6y!t!3y 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

@;MYYtKPsFAuVGRc*YUH>g1*yrSH=gtsh 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 z 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 idYes then Exit; +// RichEdit1.Lines.SaveToFile(FileName); + FFileName := FileName; +// RichEdit1.Modified := False; + end; + end; +end; + +procedure TFmGridMEL.FileSend1Execute(Sender: TObject); +var + MapiMessage: TMapiMessage; + MError: Cardinal; +begin + with MapiMessage do + begin + ulReserved := 0; + lpszSubject := nil; +// lpszNoteText := PChar(RichEdit1.Lines.Text); + lpszMessageType := nil; + lpszDateReceived := nil; + lpszConversationID := nil; + flFlags := 0; + lpOriginator := nil; + nRecipCount := 0; + lpRecips := nil; + nFileCount := 0; + lpFiles := nil; + end; + + MError := MapiSendMail(0, Application.Handle, MapiMessage, + MAPI_DIALOG or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0); + if MError <> 0 then MessageDlg(SSendError, mtError, [mbOK], 0); +end; + +procedure TFmGridMEL.FormCreate(Sender: TObject); +begin + FDEMFilename := 'NA'; + FVegClassFilename := 'NA'; + FVeg1ParamFilename := 'NA'; + FVeg2ParamFilename := 'NA'; + FSoilClassFilename := 'NA'; + FSoilPropFilename := 'NA'; + FDriver1Filename := 'NA'; + FDriver2Filename := 'NA'; + FCellOrderFilename := ''; + FRunOptionsFilename := ''; +// FmShellMain.Visible := False; +// FmShellMain.RunningInteractive := false; + + CurrentDirectory := GetCurrentDir; + NumLayers := 4; + + FCellInfoList := TList.Create; + GTSoilLayers := 2; +end; + +procedure TFmGridMEL.FormDestroy(Sender: TObject); +var + i, k: integer; + PACell: ^TCellProp; +begin + for I := FCellInfoList.Count - 1 downto 0 do + begin + PACell := FCellInfoList[i]; + for k := 1 to Numlayers do + begin + PACell^.RDocl[k].Clear; + PACell^.RDonl[k].Clear; + PACell^.Rnh4l[k].Clear; + PACell^.Rno3l[k].Clear; + PACell^.RDocl[k].Free; + PACell^.RDonl[k].Free; + PACell^.Rnh4l[k].Free; + PACell^.Rno3l[k].Free; + end; + end; + dispose(PACell); + FCellInfoLIst.Clear; + FCellInfoList.Free; +end; + +procedure TFmGridMEL.BtnRunClick(Sender: TObject); +var + i, j, k: integer; + PCurrCell: ^TCellProp; + PCellH1, PCellH2, PCellH3, PCellH4, PCellH5, PCellH6, PCellH7, PCellH8: PCellProp; + Wrcol, QwH1col, QwH2col, QwH3col, QwH4col, QwH5col, QwH6col, QwH7col, QwH8col, Qwd, + GTWrcol, GTQwH1col, GTQwH2col, GTQwH3col, GTQwH4col, GTQwH5col, GTQwH6col, + GTQwH7col, GTQwH8col, GTQwd, Lnh4lcol, Lno3lcol, Ldoclcol, Ldonlcol, Rnh4lcol, + Rno3lcol, Rdoclcol, Rdonlcol: array[1..4] of integer; + tempstring, tempstring2: string; + +function GetColumnNumber(asgname, colname:string):integer; +var + i,colnum:integer; + tempstring:string; +begin + i := 0; + colnum := 0; + if lowercase(asgname) = 'sgmodeloutput' then + repeat + tempstring := FmDisplayData.SgModelOutput.Cells[i,1]; + tempstring := trim(tempstring); + if tempstring = colname then colnum := i; + i := i + 1; + until (colnum <> 0) or (i > FmDisplayData.SgModelOutput.Colcount - 1) + else if lowercase(asgname) = 'asggtoutput' then + repeat + tempstring := AsgGToutput.Cells[i,0]; + tempstring := trim(tempstring); + if tempstring = colname then colnum := i; + i := i + 1; + until (colnum <> 0) or (i > AsgGToutput.Colcount - 1) + else {if lower(asgname) = 'asgcelldriver' then } + repeat + tempstring := AsgCellDriver.Cells[i,0]; + tempstring := trim(tempstring); + if tempstring = colname then colnum := i; + i := i + 1; + until (colnum <> 0) or (i > AsgCellDriver.Colcount - 1); + + if colnum = 0 then result := -1 else result := colnum; +end; + +begin + BtnRun.Enabled := False; + BtnRun.Caption := 'Running'; + ReadRunOptionsFile; // This procedure MUST be called before ReadCellOrderFile so the param and driver files are defined. + ReadCellOrderFile; + try + for I := 0 to FCellInfoList.Count - 1 do + begin + PCurrCell := FCellInfoList[i]; + AsgCellDriver.LoadFromCSV(CurrentDirectory + '\' + PCurrCell^.DriverFile); + AsgGToutput.LoadFromCSV(CurrentDirectory + '\Cell_' + inttostr(PCurrCell^.RowPos) + + '_' + inttostr(PCurrCell^.ColPos) + '.drr'); + // Add row to GT output to account for the units in driver file + AsgGToutput.InsertRows(1,1); + // Make sure the files are all the same length. + if AsgCellDriver.RowCount <> Ftimestop - Ftimestart + 2 {names, units} then + AsgCellDriver.RemoveRows(round(Ftimestop - Ftimestart + 2), + AsgCellDriver.RowCount - round(Ftimestop - Ftimestart + 2)); + if AsgGToutput.RowCount <> Ftimestop - Ftimestart + 2 {names, units} then + AsgGToutput.RemoveRows(round(Ftimestop - Ftimestart + 2), + AsgGToutput.RowCount - round(Ftimestop - Ftimestart + 2)); + // Copy soil moisture, lateral flows, and drainage to driver file + for k := 1 to 4 do + begin // Get source and destination column numbers for variables + GTWrcol[k] := GetColumnNumber('AsgGToutput', 'sm' + inttostr(k) + '(mm)'); + GTQwH1col[k] := GetColumnNumber('AsgGToutput', 'Q' + inttostr(k) + '_1'); + GTQwH2col[k] := GetColumnNumber('AsgGToutput', 'Q' + inttostr(k) + '_2'); + GTQwH3col[k] := GetColumnNumber('AsgGToutput', 'Q' + inttostr(k) + '_3'); + GTQwH4col[k] := GetColumnNumber('AsgGToutput', 'Q' + inttostr(k) + '_4'); + GTQwH5col[k] := GetColumnNumber('AsgGToutput', 'Q' + inttostr(k) + '_5'); + GTQwH6col[k] := GetColumnNumber('AsgGToutput', 'Q' + inttostr(k) + '_6'); + GTQwH7col[k] := GetColumnNumber('AsgGToutput', 'Q' + inttostr(k) + '_7'); + GTQwH8col[k] := GetColumnNumber('AsgGToutput', 'Q' + inttostr(k) + '_8'); + GTQwd[k] := GetColumnNumber('AsgGToutput', 'G' + inttostr(k) + inttostr(k+1)); + + Wrcol[k] := GetColumnNumber('AsgCellDriver', '*D: H2O content' + inttostr(k)); + QwH1col[k] := GetColumnNumber('AsgCellDriver', '*D: FlxH2O lateral H1-' + inttostr(k)); + QwH2col[k] := GetColumnNumber('AsgCellDriver', '*D: FlxH2O lateral H2-' + inttostr(k)); + QwH3col[k] := GetColumnNumber('AsgCellDriver', '*D: FlxH2O lateral H3-' + inttostr(k)); + QwH4col[k] := GetColumnNumber('AsgCellDriver', '*D: FlxH2O lateral H4-' + inttostr(k)); + QwH5col[k] := GetColumnNumber('AsgCellDriver', '*D: FlxH2O lateral H5-' + inttostr(k)); + QwH6col[k] := GetColumnNumber('AsgCellDriver', '*D: FlxH2O lateral H6-' + inttostr(k)); + QwH7col[k] := GetColumnNumber('AsgCellDriver', '*D: FlxH2O lateral H7-' + inttostr(k)); + QwH8col[k] := GetColumnNumber('AsgCellDriver', '*D: FlxH2O lateral H8-' + inttostr(k)); + Qwd[k] := GetColumnNumber('AsgCellDriver', '*D: FlxH2O drainage lay' + inttostr(k)); + + // Copy column title and units to GT output so that when I copy the columns over the name and units are right + if (Wrcol[k] <> -1) then + if (GTWrcol[k] <> -1) then + begin + AsgGToutput.Cells[GTWrcol[k], 0] := AsgCellDriver.Cells[Wrcol[k], 0]; + AsgGToutput.Cells[GTWrcol[k], 1] := AsgCellDriver.Cells[Wrcol[k], 1]; + AsgCellDriver.Cols[Wrcol[k]] := AsgGToutput.Cols[GTWrcol[k]]; + end + else if k <= GTSoilLayers then + raise Exception.Create('GT and MEL disagree on number of soil layers, variable ' + + 'GTWrcol[' + inttostr(k) + ']' + '. Run aborted.'); + if (QwH1col[k] <> -1) then + if GTQwH1col[k] <> -1 then + begin + AsgGToutput.Cells[GTQwH1col[k], 0] := AsgCellDriver.Cells[QwH1col[k], 0]; + AsgGToutput.Cells[GTQwH1col[k], 1] := AsgCellDriver.Cells[QwH1col[k], 1]; + AsgCellDriver.Cols[QwH1col[k]] := AsgGToutput.Cols[GTQwH1col[k]]; + end + else if k <= GTSoilLayers then + raise Exception.Create('GT and MEL disagree on number of soil layers, variable ' + + 'GTQwH1col[' + inttostr(k) + ']' + '. Run aborted.'); + + if (QwH2col[k] <> -1) then + if GTQwH2col[k] <> -1 then + begin + AsgGToutput.Cells[GTQwH2col[k], 0] := AsgCellDriver.Cells[QwH2col[k], 0]; + AsgGToutput.Cells[GTQwH2col[k], 1] := AsgCellDriver.Cells[QwH2col[k], 1]; + AsgCellDriver.Cols[QwH2col[k]] := AsgGToutput.Cols[GTQwH2col[k]]; + end + else if k <= GTSoilLayers then + raise Exception.Create('GT and MEL disagree on number of soil layers, variable ' + + 'GTQwH2col[' + inttostr(k) + ']' + '. Run aborted.'); + if (QwH3col[k] <> -1) then + if GTQwH3col[k] <> -1 then + begin + AsgGToutput.Cells[GTQwH3col[k], 0] := AsgCellDriver.Cells[QwH3col[k], 0]; + AsgGToutput.Cells[GTQwH3col[k], 1] := AsgCellDriver.Cells[QwH3col[k], 1]; + AsgCellDriver.Cols[QwH3col[k]] := AsgGToutput.Cols[GTQwH3col[k]]; + end + else if k <= GTSoilLayers then + raise Exception.Create('GT and MEL disagree on number of soil layers, variable ' + + 'GTQwH3col[' + inttostr(k) + ']' + '. Run aborted.'); + if (QwH4col[k] <> -1) then + if GTQwH4col[k] <> -1 then + begin + AsgGToutput.Cells[GTQwH4col[k], 0] := AsgCellDriver.Cells[QwH4col[k], 0]; + AsgGToutput.Cells[GTQwH4col[k], 1] := AsgCellDriver.Cells[QwH4col[k], 1]; + AsgCellDriver.Cols[QwH4col[k]] := AsgGToutput.Cols[GTQwH4col[k]]; + end + else if k <= GTSoilLayers then + raise Exception.Create('GT and MEL disagree on number of soil layers, variable ' + + 'GTQwH4col[' + inttostr(k) + ']' + '. Run aborted.'); + if (QwH5col[k] <> -1) then + if GTQwH5col[k] <> -1 then + begin + AsgGToutput.Cells[GTQwH5col[k], 0] := AsgCellDriver.Cells[QwH5col[k], 0]; + AsgGToutput.Cells[GTQwH5col[k], 1] := AsgCellDriver.Cells[QwH5col[k], 1]; + AsgCellDriver.Cols[QwH5col[k]] := AsgGToutput.Cols[GTQwH5col[k]]; + end + else if k <= GTSoilLayers then + raise Exception.Create('GT and MEL disagree on number of soil layers, variable ' + + 'GTQwH5col[' + inttostr(k) + ']' + '. Run aborted.'); + if (QwH6col[k] <> -1) then + if GTQwH6col[k] <> -1 then + begin + AsgGToutput.Cells[GTQwH6col[k], 0] := AsgCellDriver.Cells[QwH6col[k], 0]; + AsgGToutput.Cells[GTQwH6col[k], 1] := AsgCellDriver.Cells[QwH6col[k], 1]; + AsgCellDriver.Cols[QwH6col[k]] := AsgGToutput.Cols[GTQwH6col[k]]; + end + else if k <= GTSoilLayers then + raise Exception.Create('GT and MEL disagree on number of soil layers, variable ' + + 'GTQwH6col[' + inttostr(k) + ']' + '. Run aborted.'); + if (QwH7col[k] <> -1) then + if GTQwH7col[k] <> -1 then + begin + AsgGToutput.Cells[GTQwH7col[k], 0] := AsgCellDriver.Cells[QwH7col[k], 0]; + AsgGToutput.Cells[GTQwH7col[k], 1] := AsgCellDriver.Cells[QwH7col[k], 1]; + AsgCellDriver.Cols[QwH7col[k]] := AsgGToutput.Cols[GTQwH7col[k]]; + end + else if k <= GTSoilLayers then + raise Exception.Create('GT and MEL disagree on number of soil layers, variable ' + + 'GTQwH7col[' + inttostr(k) + ']' + '. Run aborted.'); + if (QwH8col[k] <> -1) then + if GTQwH8col[k] <> -1 then + begin + AsgGToutput.Cells[GTQwH8col[k], 0] := AsgCellDriver.Cells[QwH8col[k], 0]; + AsgGToutput.Cells[GTQwH8col[k], 1] := AsgCellDriver.Cells[QwH8col[k], 1]; + AsgCellDriver.Cols[QwH8col[k]] := AsgGToutput.Cols[GTQwH8col[k]]; + end + else if k <= GTSoilLayers then + raise Exception.Create('GT and MEL disagree on number of soil layers, variable ' + + 'GTQwH8col[' + inttostr(k) + ']' + '. Run aborted.'); + if (Qwd[k] <> -1) then + if GTQwd[k] <> -1 then + begin + AsgGToutput.Cells[GTQwd[k], 0] := AsgCellDriver.Cells[Qwd[k], 0]; + AsgGToutput.Cells[GTQwd[k], 1] := AsgCellDriver.Cells[Qwd[k], 1]; + AsgCellDriver.Cols[Qwd[k]] := AsgGToutput.Cols[GTQwd[k]]; + end + else if k <= GTSoilLayers - 1 then + raise Exception.Create('GT and MEL disagree on number of soil layers, variable ' + + 'GTQwd[' + inttostr(k) + ']' + '. Run aborted.'); + + // Copy lateral N and C inputs to driver file grid + if PCurrCell^.Rnh4l[k].Count <> 0 then // Assume if one input has values then they all have. + begin + Rnh4lcol[k] := GetColumnNumber('AsgCellDriver', '*D: NH4 lateral input' + inttostr(k)); + Rno3lcol[k] := GetColumnNumber('AsgCellDriver', '*D: NO3 lateral input' + inttostr(k)); + Rdonlcol[k] := GetColumnNumber('AsgCellDriver', '*D: DON lateral input' + inttostr(k)); + Rdoclcol[k] := GetColumnNumber('AsgCellDriver', '*D: DOC lateral input' + inttostr(k)); + for j := 1 to AsgCellDriver.RowCount - 1 do + begin + AsgCellDriver.Cells[Rnh4lcol[k], j] := PCurrCell^.Rnh4l[k].Strings[j]; + AsgCellDriver.Cells[Rno3lcol[k], j] := PCurrCell^.Rno3l[k].Strings[j]; + AsgCellDriver.Cells[Rdoclcol[k], j] := PCurrCell^.Rdocl[k].Strings[j]; + AsgCellDriver.Cells[Rdonlcol[k], j] := PCurrCell^.Rdonl[k].Strings[j]; + end; + end; + end; + tempstring := PCurrCell^.DriverFile; + tempstring2 := ExtractFileExt(tempstring); + delete(tempstring, pos(tempstring2, tempstring), length(tempstring)); + PCurrCell^.DriverFile := tempstring + '_Cell' + inttostr(PCurrCell^.RowPos) + + '_' + inttostr(PCurrCell^.ColPos) + '.drr'; + AsgCellDriver.SavetoCSV(CurrentDirectory + '\' + PCurrCell^.DriverFile); + + + // Run MEL for this cell + FmShellMain.RunningInteractive := False; // This tells Shellmain not to show dialog boxes + Time_start := FTimeStart; + Time_stop := FTimeStop; + Paramfilename := PCurrCell^.ParamFile; + FmShellMain.ChooseParamFile(BtnRun); + driverfilename := PCurrCell^.DriverFile; + outfilename := PCurrCell^.OuputFile; + if PCurrCell^.VegClass = FVegInfo[0].VegType then + FmOptions.RunOptions := FVegInfo[0].RunOptions + else if PCurrCell^.VegClass = FVegInfo[1].VegType then + FmOptions.RunOptions := FVegInfo[1].RunOptions + else + raise Exception.Create('No Run options for vegetaton type ' + + inttostr(PCurrCell^.VegClass) + '. Run aborted.'); + FmOptions.RunOptions := FmOptions.DefaultRunOptions; // This line is to initialize options that aren't in the batch file yet. + FmShellMain.BtnRunClick(BtnRun); + // Get Run output + FmDisplayData.Filename := outfilename; + FmDisplayData.UpdateStringGrid; +// Save N flows to eight neighbors + // Get Cell Locations for headings 1-8 + PCellH1 := + FindCellInList(PCurrCell^.RowPos, PCurrCell^.ColPos+1); + PCellH2 := + FindCellInList(PCurrCell^.RowPos+1, PCurrCell^.ColPos+1); + PCellH3 := + FindCellInList(PCurrCell^.RowPos+1, PCurrCell^.ColPos); + PCellH4 := + FindCellInList(PCurrCell^.RowPos+1, PCurrCell^.ColPos-1); + PCellH5 := + FindCellInList(PCurrCell^.RowPos, PCurrCell^.ColPos-1); + PCellH6 := + FindCellInList(PCurrCell^.RowPos-1, PCurrCell^.ColPos-1); + PCellH7 := + FindCellInList(PCurrCell^.RowPos-1, PCurrCell^.ColPos); + PCellH8 := + FindCellInList(PCurrCell^.RowPos-1, PCurrCell^.ColPos+1); + // Copy N flow to appropriate cellProp item + // H1 + for k := 1 to 4 do + begin + if PCellH1 <> nil then + begin + Lnh4lcol[k] := GetColumnNumber('sgmodeloutput', '*N NH4 loss lateral H1-' + + inttostr(k)); + Lno3lcol[k] := GetColumnNumber('sgmodeloutput', '*N NO3 loss lateral H1-' + + inttostr(k)); + Ldoclcol[k] := GetColumnNumber('sgmodeloutput', '*C DOC loss lateral H1-' + + inttostr(k)); + Ldonlcol[k] := GetColumnNumber('sgmodeloutput', '*N DON loss lateral H1-' + + inttostr(k)); + if (PCellH1^.Rnh4l[k].Count = 0) and (Lnh4lcol[k] <> -1) then + begin + PCellH1^.Rnh4l[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Lnh4lcol[k]]); + PCellH1^.Rnh4l[k].Delete(0); + end + else if (Lnh4lcol[k] <> -1) then + for j := 2 to PCellH1^.Rnh4l[k].Count - 1 do + PCellH1^.Rnh4l[k].Strings[j] := + floattostr(strtofloat(PCellH1^.Rnh4l[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Lnh4lcol[k],j+1])); + if (PCellH1^.Rno3l[k].Count = 0) and (Lno3lcol[k] <> -1) then + begin + PCellH1^.Rno3l[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Lno3lcol[k]]); + PCellH1^.Rno3l[k].Delete(0); + end + else if (Lno3lcol[k] <> -1) then + for j := 2 to PCellH1^.Rno3l[k].Count - 1 do + PCellH1^.Rno3l[k].Strings[j] := + floattostr(strtofloat(PCellH1^.Rno3l[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Lno3lcol[k],j+1])); + if (PCellH1^.Rdocl[k].Count = 0) and (Ldoclcol[k] <> -1) then + begin + PCellH1^.Rdocl[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Ldoclcol[k]]); + PCellH1^.Rdocl[k].Delete(0); + end + else if (Ldoclcol[k] <> -1) then + for j := 2 to PCellH1^.Rdocl[k].Count - 1 do + PCellH1^.Rdocl[k].Strings[j] := + floattostr(strtofloat(PCellH1^.Rdocl[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Ldoclcol[k],j+1])); + if (PCellH1^.Rdonl[k].Count = 0) and (Ldonlcol[k] <> -1) then + begin + PCellH1^.Rdonl[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Ldonlcol[k]]); + PCellH1^.Rdonl[k].Delete(0); + end + else if (Ldonlcol[k] <> -1) then + for j := 2 to PCellH1^.Rdonl[k].Count - 1 do + PCellH1^.Rdonl[k].Strings[j] := + floattostr(strtofloat(PCellH1^.Rdonl[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Ldonlcol[k],j+1])); + end; + + // H2 + if PCellH2 <> nil then + begin + Lnh4lcol[k] := GetColumnNumber('sgmodeloutput', '*N NH4 loss lateral H2-' + + inttostr(k)); + Lno3lcol[k] := GetColumnNumber('sgmodeloutput', '*N NO3 loss lateral H2-' + + inttostr(k)); + Ldoclcol[k] := GetColumnNumber('sgmodeloutput', '*C DOC loss lateral H2-' + + inttostr(k)); + Ldonlcol[k] := GetColumnNumber('sgmodeloutput', '*N DON loss lateral H2-' + + inttostr(k)); + if (PCellH2^.Rnh4l[k].Count = 0) and (Lnh4lcol[k] <> -1) then + begin + PCellH2^.Rnh4l[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Lnh4lcol[k]]); + PCellH2^.Rnh4l[k].Delete(0); + end + else if (Lnh4lcol[k] <> -1) then + for j := 2 to PCellH2^.Rnh4l[k].Count - 1 do + PCellH2^.Rnh4l[k].Strings[j] := + floattostr(strtofloat(PCellH2^.Rnh4l[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Lnh4lcol[k],j+1])); + if (PCellH2^.Rno3l[k].Count = 0) and (Lno3lcol[k] <> -1) then + begin + PCellH2^.Rno3l[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Lno3lcol[k]]); + PCellH2^.Rno3l[k].Delete(0); + end + else if (Lno3lcol[k] <> -1) then + for j := 2 to PCellH2^.Rno3l[k].Count - 1 do + PCellH2^.Rno3l[k].Strings[j] := + floattostr(strtofloat(PCellH2^.Rno3l[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Lno3lcol[k],j+1])); + if (PCellH2^.Rdocl[k].Count = 0) and (Ldoclcol[k] <> -1) then + begin + PCellH2^.Rdocl[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Ldoclcol[k]]); + PCellH2^.Rdocl[k].Delete(0); + end + else if (Ldoclcol[k] <> -1) then + for j := 2 to PCellH2^.Rdocl[k].Count - 1 do + PCellH2^.Rdocl[k].Strings[j] := + floattostr(strtofloat(PCellH2^.Rdocl[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Ldoclcol[k],j+1])); + if (PCellH2^.Rdonl[k].Count = 0) and (Ldonlcol[k] <> -1) then + begin + PCellH2^.Rdonl[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Ldonlcol[k]]); + PCellH2^.Rdonl[k].Delete(0); + end + else if (Ldonlcol[k] <> -1) then + for j := 2 to PCellH2^.Rdonl[k].Count - 1 do + PCellH2^.Rdonl[k].Strings[j] := + floattostr(strtofloat(PCellH2^.Rdonl[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Ldonlcol[k],j+1])); + end; + + // H3 + if PCellH3 <> nil then + begin + Lnh4lcol[k] := GetColumnNumber('sgmodeloutput', '*N NH4 loss lateral H3-' + + inttostr(k)); + Lno3lcol[k] := GetColumnNumber('sgmodeloutput', '*N NO3 loss lateral H3-' + + inttostr(k)); + Ldoclcol[k] := GetColumnNumber('sgmodeloutput', '*C DOC loss lateral H3-' + + inttostr(k)); + Ldonlcol[k] := GetColumnNumber('sgmodeloutput', '*N DON loss lateral H3-' + + inttostr(k)); + if (PCellH3^.Rnh4l[k].Count = 0) and (Lnh4lcol[k] <> -1) then + begin + PCellH3^.Rnh4l[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Lnh4lcol[k]]); + PCellH3^.Rnh4l[k].Delete(0); + end + else if (Lnh4lcol[k] <> -1) then + for j := 2 to PCellH3^.Rnh4l[k].Count - 1 do + PCellH3^.Rnh4l[k].Strings[j] := + floattostr(strtofloat(PCellH3^.Rnh4l[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Lnh4lcol[k],j+1])); + if (PCellH3^.Rno3l[k].Count = 0) and (Lno3lcol[k] <> -1) then + begin + PCellH3^.Rno3l[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Lno3lcol[k]]); + PCellH3^.Rno3l[k].Delete(0); + end + else if (Lno3lcol[k] <> -1) then + for j := 2 to PCellH3^.Rno3l[k].Count - 1 do + PCellH3^.Rno3l[k].Strings[j] := + floattostr(strtofloat(PCellH3^.Rno3l[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Lno3lcol[k],j+1])); + if (PCellH3^.Rdocl[k].Count = 0) and (Ldoclcol[k] <> -1) then + begin + PCellH3^.Rdocl[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Ldoclcol[k]]); + PCellH3^.Rdocl[k].Delete(0); + end + else if (Ldoclcol[k] <> -1) then + for j := 2 to PCellH3^.Rdocl[k].Count - 1 do + PCellH3^.Rdocl[k].Strings[j] := + floattostr(strtofloat(PCellH3^.Rdocl[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Ldoclcol[k],j+1])); + if (PCellH3^.Rdonl[k].Count = 0) and (Ldonlcol[k] <> -1) then + begin + PCellH3^.Rdonl[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Ldonlcol[k]]); + PCellH3^.Rdonl[k].Delete(0); + end + else if (Ldonlcol[k] <> -1) then + for j := 2 to PCellH3^.Rdonl[k].Count - 1 do + PCellH3^.Rdonl[k].Strings[j] := + floattostr(strtofloat(PCellH3^.Rdonl[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Ldonlcol[k],j+1])); + end; + + // H4 + if PCellH4 <> nil then + begin + Lnh4lcol[k] := GetColumnNumber('sgmodeloutput', '*N NH4 loss lateral H4-' + + inttostr(k)); + Lno3lcol[k] := GetColumnNumber('sgmodeloutput', '*N NO3 loss lateral H4-' + + inttostr(k)); + Ldoclcol[k] := GetColumnNumber('sgmodeloutput', '*C DOC loss lateral H4-' + + inttostr(k)); + Ldonlcol[k] := GetColumnNumber('sgmodeloutput', '*N DON loss lateral H4-' + + inttostr(k)); + if (PCellH4^.Rnh4l[k].Count = 0) and (Lnh4lcol[k] <> -1) then + begin + PCellH4^.Rnh4l[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Lnh4lcol[k]]); + PCellH4^.Rnh4l[k].Delete(0); + end + else if (Lnh4lcol[k] <> -1) then + for j := 2 to PCellH4^.Rnh4l[k].Count - 1 do + PCellH4^.Rnh4l[k].Strings[j] := + floattostr(strtofloat(PCellH4^.Rnh4l[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Lnh4lcol[k],j+1])); + if (PCellH4^.Rno3l[k].Count = 0) and (Lno3lcol[k] <> -1) then + begin + PCellH4^.Rno3l[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Lno3lcol[k]]); + PCellH4^.Rno3l[k].Delete(0); + end + else if (Lno3lcol[k] <> -1) then + for j := 2 to PCellH4^.Rno3l[k].Count - 1 do + PCellH4^.Rno3l[k].Strings[j] := + floattostr(strtofloat(PCellH4^.Rno3l[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Lno3lcol[k],j+1])); + if (PCellH4^.Rdocl[k].Count = 0) and (Ldoclcol[k] <> -1) then + begin + PCellH4^.Rdocl[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Ldoclcol[k]]); + PCellH4^.Rdocl[k].Delete(0); + end + else if (Ldoclcol[k] <> -1) then + for j := 2 to PCellH4^.Rdocl[k].Count - 1 do + PCellH4^.Rdocl[k].Strings[j] := + floattostr(strtofloat(PCellH4^.Rdocl[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Ldoclcol[k],j+1])); + if (PCellH4^.Rdonl[k].Count = 0) and (Ldonlcol[k] <> -1) then + begin + PCellH4^.Rdonl[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Ldonlcol[k]]); + PCellH4^.Rdonl[k].Delete(0); + end + else if (Ldonlcol[k] <> -1) then + for j := 2 to PCellH4^.Rdonl[k].Count - 1 do + PCellH4^.Rdonl[k].Strings[j] := + floattostr(strtofloat(PCellH4^.Rdonl[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Ldonlcol[k],j+1])); + end; + + // H5 + if PCellH5 <> nil then + begin + Lnh4lcol[k] := GetColumnNumber('sgmodeloutput', '*N NH4 loss lateral H5-' + + inttostr(k)); + Lno3lcol[k] := GetColumnNumber('sgmodeloutput', '*N NO3 loss lateral H5-' + + inttostr(k)); + Ldoclcol[k] := GetColumnNumber('sgmodeloutput', '*C DOC loss lateral H5-' + + inttostr(k)); + Ldonlcol[k] := GetColumnNumber('sgmodeloutput', '*N DON loss lateral H5-' + + inttostr(k)); + if (PCellH5^.Rnh4l[k].Count = 0) and (Lnh4lcol[k] <> -1) then + begin + PCellH5^.Rnh4l[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Lnh4lcol[k]]); + PCellH5^.Rnh4l[k].Delete(0); + end + else if (Lnh4lcol[k] <> -1) then + for j := 2 to PCellH5^.Rnh4l[k].Count - 1 do + PCellH5^.Rnh4l[k].Strings[j] := + floattostr(strtofloat(PCellH5^.Rnh4l[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Lnh4lcol[k],j+1])); + if (PCellH5^.Rno3l[k].Count = 0) and (Lno3lcol[k] <> -1) then + begin + PCellH5^.Rno3l[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Lno3lcol[k]]); + PCellH5^.Rno3l[k].Delete(0); + end + else if (Lno3lcol[k] <> -1) then + for j := 2 to PCellH5^.Rno3l[k].Count - 1 do + PCellH5^.Rno3l[k].Strings[j] := + floattostr(strtofloat(PCellH5^.Rno3l[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Lno3lcol[k],j+1])); + if (PCellH5^.Rdocl[k].Count = 0) and (Ldoclcol[k] <> -1) then + begin + PCellH5^.Rdocl[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Ldoclcol[k]]); + PCellH5^.Rdocl[k].Delete(0); + end + else if (Ldoclcol[k] <> -1) then + for j := 2 to PCellH5^.Rdocl[k].Count - 1 do + PCellH5^.Rdocl[k].Strings[j] := + floattostr(strtofloat(PCellH5^.Rdocl[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Ldoclcol[k],j+1])); + if (PCellH5^.Rdonl[k].Count = 0) and (Ldonlcol[k] <> -1) then + begin + PCellH5^.Rdonl[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Ldonlcol[k]]); + PCellH5^.Rdonl[k].Delete(0); + end + else if (Ldonlcol[k] <> -1) then + for j := 2 to PCellH5^.Rdonl[k].Count - 1 do + PCellH5^.Rdonl[k].Strings[j] := + floattostr(strtofloat(PCellH5^.Rdonl[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Ldonlcol[k],j+1])); + end; + + // H6 + if PCellH6 <> nil then + begin + Lnh4lcol[k] := GetColumnNumber('sgmodeloutput', '*N NH4 loss lateral H6-' + + inttostr(k)); + Lno3lcol[k] := GetColumnNumber('sgmodeloutput', '*N NO3 loss lateral H6-' + + inttostr(k)); + Ldoclcol[k] := GetColumnNumber('sgmodeloutput', '*C DOC loss lateral H6-' + + inttostr(k)); + Ldonlcol[k] := GetColumnNumber('sgmodeloutput', '*N DON loss lateral H6-' + + inttostr(k)); + if (PCellH6^.Rnh4l[k].Count = 0) and (Lnh4lcol[k] <> -1) then + begin + PCellH6^.Rnh4l[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Lnh4lcol[k]]); + PCellH6^.Rnh4l[k].Delete(0); + end + else if (Lnh4lcol[k] <> -1) then + for j := 2 to PCellH6^.Rnh4l[k].Count - 1 do + PCellH6^.Rnh4l[k].Strings[j] := + floattostr(strtofloat(PCellH6^.Rnh4l[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Lnh4lcol[k],j+1])); + if (PCellH6^.Rno3l[k].Count = 0) and (Lno3lcol[k] <> -1) then + begin + PCellH6^.Rno3l[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Lno3lcol[k]]); + PCellH6^.Rno3l[k].Delete(0); + end + else if (Lno3lcol[k] <> -1) then + for j := 2 to PCellH6^.Rno3l[k].Count - 1 do + PCellH6^.Rno3l[k].Strings[j] := + floattostr(strtofloat(PCellH6^.Rno3l[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Lno3lcol[k],j+1])); + if (PCellH6^.Rdocl[k].Count = 0) and (Ldoclcol[k] <> -1) then + begin + PCellH6^.Rdocl[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Ldoclcol[k]]); + PCellH6^.Rdocl[k].Delete(0); + end + else if (Ldoclcol[k] <> -1) then + for j := 2 to PCellH6^.Rdocl[k].Count - 1 do + PCellH6^.Rdocl[k].Strings[j] := + floattostr(strtofloat(PCellH6^.Rdocl[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Ldoclcol[k],j+1])); + if (PCellH6^.Rdonl[k].Count = 0) and (Ldonlcol[k] <> -1) then + begin + PCellH6^.Rdonl[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Ldonlcol[k]]); + PCellH6^.Rdonl[k].Delete(0); + end + else if (Ldonlcol[k] <> -1) then + for j := 2 to PCellH6^.Rdonl[k].Count - 1 do + PCellH6^.Rdonl[k].Strings[j] := + floattostr(strtofloat(PCellH6^.Rdonl[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Ldonlcol[k],j+1])); + end; + + // H7 + if PCellH7 <> nil then + begin + Lnh4lcol[k] := GetColumnNumber('sgmodeloutput', '*N NH4 loss lateral H7-' + + inttostr(k)); + Lno3lcol[k] := GetColumnNumber('sgmodeloutput', '*N NO3 loss lateral H7-' + + inttostr(k)); + Ldoclcol[k] := GetColumnNumber('sgmodeloutput', '*C DOC loss lateral H7-' + + inttostr(k)); + Ldonlcol[k] := GetColumnNumber('sgmodeloutput', '*N DON loss lateral H7-' + + inttostr(k)); + if (PCellH7^.Rnh4l[k].Count = 0) and (Lnh4lcol[k] <> -1) then + begin + PCellH7^.Rnh4l[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Lnh4lcol[k]]); + PCellH7^.Rnh4l[k].Delete(0); + end + else if (Lnh4lcol[k] <> -1) then + for j := 2 to PCellH7^.Rnh4l[k].Count - 1 do + PCellH7^.Rnh4l[k].Strings[j] := + floattostr(strtofloat(PCellH7^.Rnh4l[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Lnh4lcol[k],j+1])); + if (PCellH7^.Rno3l[k].Count = 0) and (Lno3lcol[k] <> -1) then + begin + PCellH7^.Rno3l[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Lno3lcol[k]]); + PCellH7^.Rno3l[k].Delete(0); + end + else if (Lno3lcol[k] <> -1) then + for j := 2 to PCellH7^.Rno3l[k].Count - 1 do + PCellH7^.Rno3l[k].Strings[j] := + floattostr(strtofloat(PCellH7^.Rno3l[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Lno3lcol[k],j+1])); + if (PCellH7^.Rdocl[k].Count = 0) and (Ldoclcol[k] <> -1) then + begin + PCellH7^.Rdocl[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Ldoclcol[k]]); + PCellH7^.Rdocl[k].Delete(0); + end + else if (Ldoclcol[k] <> -1) then + for j := 2 to PCellH7^.Rdocl[k].Count - 1 do + PCellH7^.Rdocl[k].Strings[j] := + floattostr(strtofloat(PCellH7^.Rdocl[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Ldoclcol[k],j+1])); + if (PCellH7^.Rdonl[k].Count = 0) and (Ldonlcol[k] <> -1) then + begin + PCellH7^.Rdonl[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Ldonlcol[k]]); + PCellH7^.Rdonl[k].Delete(0); + end + else if (Ldonlcol[k] <> -1) then + for j := 2 to PCellH7^.Rdonl[k].Count - 1 do + PCellH7^.Rdonl[k].Strings[j] := + floattostr(strtofloat(PCellH7^.Rdonl[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Ldonlcol[k],j+1])); + end; + + // H8 + if PCellH8 <> nil then + begin + Lnh4lcol[k] := GetColumnNumber('sgmodeloutput', '*N NH4 loss lateral H8-' + + inttostr(k)); + Lno3lcol[k] := GetColumnNumber('sgmodeloutput', '*N NO3 loss lateral H8-' + + inttostr(k)); + Ldoclcol[k] := GetColumnNumber('sgmodeloutput', '*C DOC loss lateral H8-' + + inttostr(k)); + Ldonlcol[k] := GetColumnNumber('sgmodeloutput', '*N DON loss lateral H8-' + + inttostr(k)); + if (PCellH8^.Rnh4l[k].Count = 0) and (Lnh4lcol[k] <> -1) then + begin + PCellH8^.Rnh4l[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Lnh4lcol[k]]); + PCellH8^.Rnh4l[k].Delete(0); + end + else if (Lnh4lcol[k] <> -1) then + for j := 2 to PCellH8^.Rnh4l[k].Count - 1 do + PCellH8^.Rnh4l[k].Strings[j] := + floattostr(strtofloat(PCellH8^.Rnh4l[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Lnh4lcol[k],j+1])); + if (PCellH8^.Rno3l[k].Count = 0) and (Lno3lcol[k] <> -1) then + begin + PCellH8^.Rno3l[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Lno3lcol[k]]); + PCellH8^.Rno3l[k].Delete(0); + end + else if (Lno3lcol[k] <> -1) then + for j := 2 to PCellH8^.Rno3l[k].Count - 1 do + PCellH8^.Rno3l[k].Strings[j] := + floattostr(strtofloat(PCellH8^.Rno3l[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Lno3lcol[k],j+1])); + if (PCellH8^.Rdocl[k].Count = 0) and (Ldoclcol[k] <> -1) then + begin + PCellH8^.Rdocl[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Ldoclcol[k]]); + PCellH8^.Rdocl[k].Delete(0); + end + else if (Ldoclcol[k] <> -1) then + for j := 2 to PCellH8^.Rdocl[k].Count - 1 do + PCellH8^.Rdocl[k].Strings[j] := + floattostr(strtofloat(PCellH8^.Rdocl[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Ldoclcol[k],j+1])); + if (PCellH8^.Rdonl[k].Count = 0) and (Ldonlcol[k] <> -1) then + begin + PCellH8^.Rdonl[k].AddStrings(FmDisplayData.SgModelOutput.Cols[Ldonlcol[k]]); + PCellH8^.Rdonl[k].Delete(0); + end + else if (Ldonlcol[k] <> -1) then + for j := 2 to PCellH8^.Rdonl[k].Count - 1 do + PCellH8^.Rdonl[k].Strings[j] := + floattostr(strtofloat(PCellH8^.Rdonl[k].Strings[j]) + + strtofloat(FmDisplayData.SgModelOutput.Cells[Ldonlcol[k],j+1])); + end; + end; + end; + finally + Dispose(PCurrCell); + if PCellH1 <> nil then Dispose(PCellH1); + if PCellH2 <> nil then Dispose(PCellH2); + if PCellH3 <> nil then Dispose(PCellH3); + if PCellH4 <> nil then Dispose(PCellH4); + if PCellH5 <> nil then Dispose(PCellH5); + if PCellH6 <> nil then Dispose(PCellH6); + if PCellH7 <> nil then Dispose(PCellH7); + if PCellH8 <> nil then Dispose(PCellH8); + BtnRun.Caption := 'Done'; + end; +end; + +function TFmGridMEL.FindCellInList(RowNum, Colnum: integer): PCellProp; +var + j: integer; + cellfound: Boolean; + PCurrCell: PCellProp; +begin + j := 0; + cellfound := false; + repeat + PCurrCell := FCellInfoList[j]; + if (PCurrCell.rowpos = rownum) and (PCurrCell.colpos = colnum) then + cellfound := True; + j := j + 1; + until cellfound or (j = FCellInfoList.Count - 1); + if cellfound then result := PCurrCell else result := nil; +end; + +procedure TFmGridMEL.UpdateForm(Sender: TObject); +begin + //check if files selected + // update currentdirectory. + CurrentDirectory := GetCurrentDir; + if {(LedDEMFile.text <> '') and (LedVegClassFile.text <> '') and + (LedSoilClassFile.text <> '') and (LedVeg1ParamFile.text <> '') and + (LedVeg2ParamFile.text <> '') and (LedSoilPropFile.text <> '') and } + (LedCellOrderFile.text <> ''){ and (LedDriver1File.Text <> '') and + (LedDriver2File.Text <> '') }and (LedRunOptionsFile.text <> '') + then BtnRun.Enabled := True; +end; + +procedure TFmGridMEL.ReadCellOrderFile; +var + CellOrderFile, Aline: TStringList; + PACell: ^TCellProp; + j, k: integer; +begin + CellOrderFile := TstringList.create; + Aline := Tstringlist.Create; + Aline.Delimiter := ','; + try + CellOrderFile.LoadFromFile(FCellOrderFilename); + for j := 1 to CellOrderFile.Count - 1 do // Skip first line of file, it contains column headings + begin + Aline.DelimitedText := CellOrderFile[j]; + New(PACell); + PACell^.RowPos := strtoint(Aline[0]); + PACell^.ColPos := strtoint(Aline[1]); + PACell^.elevation := strtofloat(Aline[2]); + // FIX Need to enter Runposition here +{ PACellInfoItem^.SoilClass := Aline[3]; + PACellInfoItem^. := Aline[4]; + PACellInfoItem^.RowPos := Aline[5]; + PACellInfoItem^.RowPos := Aline[6]; + PACellInfoItem^.RowPos := Aline[7]; } + PACell^.VegClass := strtoint(Aline[8]); + case strtoint(Aline[8]) {VegClass} of + 501: PACell^.ParamFile := FVegInfo[0].Filenames.ParamFilename; + 502: PACell^.ParamFile := FVegInfo[1].Filenames.ParamFilename; + end; + case strtoint(Aline[8]) {VegClass} of + 501: PACell^.DriverFile := FVegInfo[0].Filenames.DriverFilename; + 502: PACell^.DriverFile := FVegInfo[1].Filenames.DriverFilename; + end; + PACell^.OuputFile := CurrentDirectory + + '\Cell' + Aline[0] + '_' + Aline[1] + '.out'; + for k := 1 to 4 do // Create lists to hold lateral inputs + begin + PACell^.RDocl[k] := Tstringlist.Create; + PACell^.RDonl[k] := Tstringlist.Create; + PACell^.Rnh4l[k] := Tstringlist.Create; + PACell^.Rno3l[k] := Tstringlist.Create; + end; + FCellInfoList.Add(PACell); + end; + finally +// dispose(PACell); + CellOrderFile.Clear; + CellOrderFile.Free; + Aline.Clear; + Aline.Free; + end; +end; + +procedure TFmGridMEL.ReadRunOptionsFile; +var + RunOptionsFile, Aline: TStringList; + j: integer; +begin + RunOptionsFile := TstringList.create; + Aline := Tstringlist.Create; + Aline.Delimiter := ','; + try + RunOptionsFile.LoadFromFile(FRunOptionsFilename); + for j := 0 to RunOptionsFile.Count - 1 - 1 do // One less than total count because first line of file is column headings + begin + Aline.DelimitedText := RunOptionsFile[j+1]; //Skip first line of the file because it contains column headings + FVegInfo[j].VegType := strtoint(Aline[0]); + FVegInfo[j].Filenames.ParamFilename := Aline[1]; + FVegInfo[j].Filenames.DriverFilename := Aline[2]; + FTimeStart := strtofloat(Aline[4]); + FTimeStop := strtofloat(Aline[5]); + FVegInfo[j].RunOptions.Time_step := strtofloat(Aline[6]); + FVegInfo[j].RunOptions.DiscreteStep := strtofloat(Aline[7]); + if (Aline[8][1] = 't') or (Aline[8][1] = 'T') then + FVegInfo[j].RunOptions.NormalRun := True + else + FVegInfo[j].RunOptions.NormalRun := False; + if (Aline[9][1] = 't') or (Aline[9][1] = 'T') then + FVegInfo[j].RunOptions.RepeatDrivers := True + else + FVegInfo[j].RunOptions.RepeatDrivers := False; +// FVegInfo[j].RunOptions.RepeatDrivers := Aline[9]; + FVegInfo[j].RunOptions.RepeatDriveTIme := strtoint(Aline[10]); + if (Aline[11][1] = 't') or (Aline[11][1] = 'T') then + FVegInfo[j].RunOptions.ResetStates := True + else + FVegInfo[j].RunOptions.ResetStates := False; +// FVegInfo[j].RunOptions.ResetStates := Aline[11]; + FVegInfo[j].RunOptions.ResetStateTime := strtoint(Aline[12]); + if (Aline[13][1] = 't') or (Aline[13][1] = 'T') then + FVegInfo[j].RunOptions.RuntoSS := True + else + FVegInfo[j].RunOptions.RuntoSS := False; +// FVegInfo[j].RunOptions.RuntoSS := Aline[13]; + FVegInfo[j].RunOptions.SSCriteria := strtofloat(Aline[14]); + FVegInfo[j].RunOptions.SSTime := strtoint(Aline[15]); + if (Aline[16][1] = 't') or (Aline[16][1] = 'T') then + FVegInfo[j].RunOptions.HoldStatesConstant := True + else + FVegInfo[j].RunOptions.HoldStatesConstant := False; +// FVegInfo[j].RunOptions.HoldStatesConstant := Aline[16]; + FVegInfo[j].RunOptions.Outputstep := strtoint(Aline[17]); + FVegInfo[j].RunOptions.Outputoffset := strtoint(Aline[18]); + if (Aline[17][1] = 't') or (Aline[17][1] = 'T') then + FVegInfo[j].RunOptions.OutputEORonly := True + else + FVegInfo[j].RunOptions.OutputEORonly := False; +// FVegInfo[j].RunOptions.OutputEORonly := Aline[19]; +// FVegInfo[j].RunOptions.OutputAnnually := Aline[7]; +// FVegInfo[j].RunOptions.OutputAnnuallyDay := Aline[7]; + if (Aline[20][1] = 't') or (Aline[20][1] = 'T') then + FVegInfo[j].RunOptions.AppendOutputFile := True + else + FVegInfo[j].RunOptions.AppendOutputFile := False; +// FVegInfo[j].RunOptions.AppendOutputFile := Aline[20]; +// FVegInfo[j].RunOptions.StepCounter := Aline[7]; + // FVegInfo[j].RunOptions.OutCounter := Aline[7]; + FVegInfo[j].RunOptions.errormult := strtoint(Aline[21]); + end; + finally + RunOptionsFile.Free; + Aline.Free; + end; +end; + +procedure TFmGridMEL.LedCellOrderFileKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then ChooseCellOrderFile(Sender); +end; + +procedure TFmGridMEL.LedDEMFileKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then ChooseDEMFile(Sender); +end; + +procedure TFmGridMEL.LedDriver1FileKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then ChooseDriver1File(Sender); +end; + +procedure TFmGridMEL.LedDriver2FileKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then ChooseDriver2File(Sender); +end; + +procedure TFmGridMEL.LedRunOptionsFileKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then ChooseRunOptionsFile(Sender); +end; + +procedure TFmGridMEL.LedSoilClassFileKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then ChooseSoilClassFile(Sender); +end; + +procedure TFmGridMEL.LedSoilPropFileKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then ChooseSoilPropFile(Sender); +end; + +procedure TFmGridMEL.LedVeg1ParamFileKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then ChooseVeg1ParamFile(Sender); +end; + +procedure TFmGridMEL.LedVeg2ParamFileKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then ChooseVeg2ParamFile(Sender); +end; + +procedure TFmGridMEL.LedVegClassFileKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then ChooseVegClassFile(Sender); +end; + +procedure TFmGridMEL.ChooseDEMFile(Sender: TObject); +var + ThisEdit:TLabeledEdit; + ThisLabel: TBoundLabel; +begin +// If the user typed directly in the edit box + if Sender is TLabeledEdit then + begin + ThisEdit := Sender as TLabeledEdit; + FDEMFilename := ThisEdit.EditLabel.Caption; + if not FileExists(FDEMFilename) then + begin + MessageDlg('Missing Data File: ' + FDEMFilename + '. Please reenter.', + mtError, [mbOK], 0); + FDEMFilename := ''; // Set the filename to no value + ThisEdit.EditLabel.Caption := FDEMFilename; + end; + end + else // User clicked on the label + begin // Show the open file dialog + ThisLabel := Sender as TBoundLabel; + ThisEdit := ThisLabel.Owner as TLabeledEdit; + OpenDialog.Title := 'Select the DEM file'; + OpenDialog.DefaultExt := '.dat'; + OpenDialog.InitialDir := CurrentDirectory; + OpenDialog.Options := [ofFileMustExist]; + // First set the default filename to the current file + OpenDialog.filename := FDEMFilename; + // Show the dialog and if the user clicks OK, set the new filename + if OpenDialog.execute then + begin + FDEMFilename := OpenDialog.filename; + ThisEdit.Text := FDEMFilename; + end; + end; + UpdateForm(Sender); +end; + +procedure TFmGridMEL.ChooseVegClassFile(Sender: TObject); +var + ThisEdit:TLabeledEdit; + ThisLabel: TBoundLabel; +begin +// If the user typed directly in the edit box + if Sender is TLabeledEdit then + begin + ThisEdit := Sender as TLabeledEdit; + FVegClassFilename := ThisEdit.EditLabel.Caption; + if not FileExists(FVegClassFilename) then + begin + MessageDlg('Missing Data File: ' + FVegClassFilename + '. Please reenter.', + mtError, [mbOK], 0); + FVegClassFilename := ''; // Set the filename to no value + ThisEdit.EditLabel.Caption := FVegClassFilename; + end; + end + else // User clicked on the label + begin // Show the open file dialog + ThisLabel := Sender as TBoundLabel; + ThisEdit := ThisLabel.Owner as TLabeledEdit; + OpenDialog.Title := 'Select the vegetation classification file'; + OpenDialog.DefaultExt := '.dat'; + OpenDialog.InitialDir := CurrentDirectory; + OpenDialog.Options := [ofFileMustExist]; + // First set the default filename to the current file + OpenDialog.filename := FVegClassFilename; + // Show the dialog and if the user clicks OK, set the new filename + if OpenDialog.execute then + begin + FVegClassFilename := OpenDialog.filename; + ThisEdit.Text := FVegClassFilename; + end; + end; + UpdateForm(Sender); +end; + +procedure TFmGridMEL.ChooseVeg1ParamFile(Sender: TObject); +var + ThisEdit:TLabeledEdit; + ThisLabel: TBoundLabel; +begin +// If the user typed directly in the edit box + if Sender is TLabeledEdit then + begin + ThisEdit := Sender as TLabeledEdit; + FVeg1ParamFilename := ThisEdit.EditLabel.Caption; + if not FileExists(FVeg1ParamFilename) then + begin + MessageDlg('Missing Data File: ' + FVeg1ParamFilename + '. Please reenter.', + mtError, [mbOK], 0); + FVeg1ParamFilename := ''; // Set the filename to no value + ThisEdit.EditLabel.Caption := FVeg1ParamFilename; + end; + end + else // User clicked on the label + begin // Show the open file dialog + ThisLabel := Sender as TBoundLabel; + ThisEdit := ThisLabel.Owner as TLabeledEdit; + OpenDialog.Title := 'Select the parameter file for vegetation class 1'; + OpenDialog.DefaultExt := '.dat'; + OpenDialog.InitialDir := CurrentDirectory; + OpenDialog.Options := [ofFileMustExist]; + // First set the default filename to the current file + OpenDialog.filename := FVeg1ParamFilename; + // Show the dialog and if the user clicks OK, set the new filename + if OpenDialog.execute then + begin + FVeg1ParamFilename := OpenDialog.filename; + ThisEdit.Text := FVeg1ParamFilename; + end; + end; + UpdateForm(Sender); +end; + +procedure TFmGridMEL.ChooseVeg2ParamFile(Sender: TObject); +var + ThisEdit:TLabeledEdit; + ThisLabel: TBoundLabel; +begin +// If the user typed directly in the edit box + if Sender is TLabeledEdit then + begin + ThisEdit := Sender as TLabeledEdit; + FVeg2ParamFilename := ThisEdit.EditLabel.Caption; + if not FileExists(FVeg2ParamFilename) then + begin + MessageDlg('Missing Data File: ' + FVeg2ParamFilename + '. Please reenter.', + mtError, [mbOK], 0); + FVeg2ParamFilename := ''; // Set the filename to no value + ThisEdit.EditLabel.Caption := FVeg2ParamFilename; + end; + end + else // User clicked on the label + begin // Show the open file dialog + ThisLabel := Sender as TBoundLabel; + ThisEdit := ThisLabel.Owner as TLabeledEdit; + OpenDialog.Title := 'Select the parameter file for vegetation class 2'; + OpenDialog.DefaultExt := '.dat'; + OpenDialog.InitialDir := CurrentDirectory; + OpenDialog.Options := [ofFileMustExist]; + // First set the default filename to the current file + OpenDialog.filename := FVeg2ParamFilename; + // Show the dialog and if the user clicks OK, set the new filename + if OpenDialog.execute then + begin + FVeg2ParamFilename := OpenDialog.filename; + ThisEdit.Text := FVeg2ParamFilename; + end; + end; + UpdateForm(Sender); +end; + +procedure TFmGridMEL.ChooseSoilClassFile(Sender: TObject); +var + ThisEdit:TLabeledEdit; + ThisLabel: TBoundLabel; +begin +// If the user typed directly in the edit box + if Sender is TLabeledEdit then + begin + ThisEdit := Sender as TLabeledEdit; + FSoilClassFilename := ThisEdit.EditLabel.Caption; + if not FileExists(FSoilClassFilename) then + begin + MessageDlg('Missing Data File: ' + FSoilClassFilename + '. Please reenter.', + mtError, [mbOK], 0); + FSoilClassFilename := ''; // Set the filename to no value + ThisEdit.EditLabel.Caption := FSoilClassFilename; + end; + end + else // User clicked on the label + begin // Show the open file dialog + ThisLabel := Sender as TBoundLabel; + ThisEdit := ThisLabel.Owner as TLabeledEdit; + OpenDialog.Title := 'Select the soil classification file'; + OpenDialog.DefaultExt := '.dat'; + OpenDialog.InitialDir := CurrentDirectory; + OpenDialog.Options := [ofFileMustExist]; + // First set the default filename to the current file + OpenDialog.filename := FSoilClassFilename; + // Show the dialog and if the user clicks OK, set the new filename + if OpenDialog.execute then + begin + FSoilClassFilename := OpenDialog.filename; + ThisEdit.Text := FSoilClassFilename; + end; + end; + UpdateForm(Sender); +end; + +procedure TFmGridMEL.ChooseSoilPropFile(Sender: TObject); +var + ThisEdit:TLabeledEdit; + ThisLabel: TBoundLabel; +begin +// If the user typed directly in the edit box + if Sender is TLabeledEdit then + begin + ThisEdit := Sender as TLabeledEdit; + FSoilPropFilename := ThisEdit.EditLabel.Caption; + if not FileExists(FSoilPropFilename) then + begin + MessageDlg('Missing Data File: ' + FSoilPropFilename + '. Please reenter.', + mtError, [mbOK], 0); + FSoilPropFilename := ''; // Set the filename to no value + ThisEdit.EditLabel.Caption := FSoilPropFilename; + end; + end + else // User clicked on the label + begin // Show the open file dialog + ThisLabel := Sender as TBoundLabel; + ThisEdit := ThisLabel.Owner as TLabeledEdit; + OpenDialog.Title := 'Select the soil properties file'; + OpenDialog.DefaultExt := '.dat'; + OpenDialog.InitialDir := CurrentDirectory; + OpenDialog.Options := [ofFileMustExist]; + // First set the default filename to the current file + OpenDialog.filename := FSoilPropFilename; + // Show the dialog and if the user clicks OK, set the new filename + if OpenDialog.execute then + begin + FSoilPropFilename := OpenDialog.filename; + ThisEdit.Text := FSoilPropFilename; + end; + end; + UpdateForm(Sender); +end; + +procedure TFmGridMEL.Button2Click(Sender: TObject); +begin + FmGridMEL.Close; +end; + +procedure TFmGridMEL.ChooseCellOrderFile(Sender: TObject); +var + ThisEdit:TLabeledEdit; + ThisLabel: TBoundLabel; +begin +// If the user typed directly in the edit box + if Sender is TLabeledEdit then + begin + ThisEdit := Sender as TLabeledEdit; + FCellOrderFilename := ThisEdit.EditLabel.Caption; + if not FileExists(FCellOrderFilename) then + begin + MessageDlg('Missing Data File: ' + FCellOrderFilename + '. Please reenter.', + mtError, [mbOK], 0); + FCellOrderFilename := ''; // Set the filename to no value + ThisEdit.EditLabel.Caption := FCellOrderFilename; + end; + end + else // User clicked on the label + begin // Show the open file dialog + ThisLabel := Sender as TBoundLabel; + ThisEdit := ThisLabel.Owner as TLabeledEdit; + OpenDialog.Title := 'Select the cell order file'; + OpenDialog.DefaultExt := '.dat'; + OpenDialog.InitialDir := CurrentDirectory; + OpenDialog.Options := [ofFileMustExist]; + // First set the default filename to the current file + OpenDialog.filename := FCellOrderFilename; + // Show the dialog and if the user clicks OK, set the new filename + if OpenDialog.execute then + begin + FCellOrderFilename := OpenDialog.filename; + ThisEdit.Text := FCellOrderFilename; + end; + end; + UpdateForm(Sender); +end; + +procedure TFmGridMEL.ChooseDriver1File(Sender: TObject); +var + ThisEdit:TLabeledEdit; + ThisLabel: TBoundLabel; +begin +// If the user typed directly in the edit box + if Sender is TLabeledEdit then + begin + ThisEdit := Sender as TLabeledEdit; + FDriver1Filename := ThisEdit.EditLabel.Caption; + if not FileExists(FDriver1Filename) then + begin + MessageDlg('Missing Data File: ' + FDriver1Filename + '. Please reenter.', + mtError, [mbOK], 0); + FDriver1Filename := ''; // Set the filename to no value + ThisEdit.EditLabel.Caption := FDriver1Filename; + end; + end + else // User clicked on the label + begin // Show the open file dialog + ThisLabel := Sender as TBoundLabel; + ThisEdit := ThisLabel.Owner as TLabeledEdit; + OpenDialog.Title := 'Select the driver file for vegetation class 1'; + OpenDialog.DefaultExt := '.drr'; + OpenDialog.InitialDir := CurrentDirectory; + OpenDialog.Options := [ofFileMustExist]; + // First set the default filename to the current file + OpenDialog.filename := FDriver1Filename; + // Show the dialog and if the user clicks OK, set the new filename + if OpenDialog.execute then + begin + FDriver1Filename := OpenDialog.filename; + ThisEdit.Text := FDriver1Filename; + end; + end; + UpdateForm(Sender); +end; + +procedure TFmGridMEL.ChooseDriver2File(Sender: TObject); +var + ThisEdit:TLabeledEdit; + ThisLabel: TBoundLabel; +begin +// If the user typed directly in the edit box + if Sender is TLabeledEdit then + begin + ThisEdit := Sender as TLabeledEdit; + FDriver2Filename := ThisEdit.EditLabel.Caption; + if not FileExists(FDriver2Filename) then + begin + MessageDlg('Missing Data File: ' + FDriver2Filename + '. Please reenter.', + mtError, [mbOK], 0); + FDriver2Filename := ''; // Set the filename to no value + ThisEdit.EditLabel.Caption := FDriver2Filename; + end; + end + else // User clicked on the label + begin // Show the open file dialog + ThisLabel := Sender as TBoundLabel; + ThisEdit := ThisLabel.Owner as TLabeledEdit; + OpenDialog.Title := 'Select the driver file for vegetation class 2'; + OpenDialog.DefaultExt := '.drr'; + OpenDialog.InitialDir := CurrentDirectory; + OpenDialog.Options := [ofFileMustExist]; + // First set the default filename to the current file + OpenDialog.filename := FDriver2Filename; + // Show the dialog and if the user clicks OK, set the new filename + if OpenDialog.execute then + begin + FDriver2Filename := OpenDialog.filename; + ThisEdit.Text := FDriver2Filename; + end; + end; + UpdateForm(Sender); +end; + +procedure TFmGridMEL.ChooseRunOptionsFile(Sender: TObject); +var + ThisEdit:TLabeledEdit; + ThisLabel: TBoundLabel; +begin +// If the user typed directly in the edit box + if Sender is TLabeledEdit then + begin + ThisEdit := Sender as TLabeledEdit; + FRunOptionsFilename := ThisEdit.EditLabel.Caption; + if not FileExists(FRunOptionsFilename) then + begin + MessageDlg('Missing Data File: ' + FRunOptionsFilename + '. Please reenter.', + mtError, [mbOK], 0); + FRunOptionsFilename := ''; // Set the filename to no value + ThisEdit.EditLabel.Caption := FRunOptionsFilename; + end; + end + else // User clicked on the label + begin // Show the open file dialog + ThisLabel := Sender as TBoundLabel; + ThisEdit := ThisLabel.Owner as TLabeledEdit; + OpenDialog.Title := 'Select the Run Options File file'; + OpenDialog.DefaultExt := '.bch'; + OpenDialog.InitialDir := CurrentDirectory; + OpenDialog.Options := [ofFileMustExist]; + // First set the default filename to the current file + OpenDialog.filename := FRunOptionsFilename; + // Show the dialog and if the user clicks OK, set the new filename + if OpenDialog.execute then + begin + FRunOptionsFilename := OpenDialog.filename; + ThisEdit.Text := FRunOptionsFilename; + end; + end; + UpdateForm(Sender); +end; + +procedure TFmGridMEL.FileExit1Execute(Sender: TObject); +begin + Close; +end; + +procedure TFmGridMEL.HelpAbout1Execute(Sender: TObject); +begin + AboutBox.ShowModal; +end; + +end. diff --git a/modelshell/Options.lfm b/modelshell/Options.lfm new file mode 100644 index 0000000..926f364 --- /dev/null +++ b/modelshell/Options.lfm @@ -0,0 +1,469 @@ +object FmOptions: TFmOptions + Left = 939 + Height = 330 + Top = 392 + Width = 740 + BorderStyle = bsSingle + Caption = 'Run and Output Options' + ClientHeight = 330 + ClientWidth = 740 + Color = clBtnFace + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + OnCreate = FormCreate + OnShow = FormShow + Position = poMainFormCenter + LCLVersion = '1.4.2.0' + object BtnCancel: TButton + Left = 500 + Height = 25 + Top = 272 + Width = 75 + Cancel = True + Caption = '&Cancel' + ModalResult = 2 + OnClick = BtnCancelClick + TabOrder = 2 + end + object BtnOK: TButton + Left = 408 + Height = 25 + Top = 272 + Width = 74 + Caption = 'O&K' + ModalResult = 1 + OnClick = BtnOKClick + TabOrder = 1 + end + object BtnDefaults: TButton + Left = 17 + Height = 24 + Top = 272 + Width = 88 + Caption = 'De&faults' + OnClick = BtnDefaultsClick + TabOrder = 3 + end + object PcOptions: TPageControl + Left = 0 + Height = 257 + Top = 0 + Width = 740 + ActivePage = TsRunOptions + Align = alTop + TabIndex = 0 + TabOrder = 0 + object TsRunOptions: TTabSheet + Caption = 'Run Options' + ClientHeight = 230 + ClientWidth = 732 + object LblTimeUnit2: TLabel + Left = 254 + Height = 14 + Top = 64 + Width = 49 + AutoSize = False + Caption = 'da&ys' + FocusControl = EdRepeatDriveTime + ParentColor = False + end + object LblTimeUnit1: TLabel + Left = 333 + Height = 14 + Top = 97 + Width = 44 + AutoSize = False + Caption = 'd&ays' + FocusControl = EdResetStateTime + ParentColor = False + end + object LblSSCriteria: TLabel + Left = 32 + Height = 14 + Top = 192 + Width = 174 + Alignment = taRightJustify + AutoSize = False + Caption = '&Percent error at steady state' + FocusControl = EdSSCriteria + ParentColor = False + Visible = False + end + object LblSSTime: TLabel + Left = 319 + Height = 14 + Top = 192 + Width = 171 + Alignment = taRightJustify + AutoSize = False + Caption = 'T&ime to check steady state' + FocusControl = EdSSTime + ParentColor = False + Visible = False + end + object RbNormalRun: TRadioButton + Left = 8 + Height = 19 + Top = 10 + Width = 75 + Caption = '&Normal Run' + Checked = True + OnClick = RbNormalRunClick + TabOrder = 0 + TabStop = True + end + object RbSpecialRun: TRadioButton + Left = 8 + Height = 19 + Top = 40 + Width = 189 + Caption = '&Special Run (Select options below)' + OnClick = RbNormalRunClick + TabOrder = 1 + end + object CbRepeatDrivers: TCheckBox + Left = 32 + Height = 19 + Top = 64 + Width = 125 + Caption = 'Repeat &drivers every ' + Enabled = False + OnClick = CbRepeatDriversClick + TabOrder = 2 + end + object EdRepeatDriveTime: TEdit + Left = 184 + Height = 22 + Top = 60 + Width = 65 + Enabled = False + OnExit = EdRepeatDriveTimeExit + OnKeyPress = EdRepeatDriveTimeKeyPress + TabOrder = 3 + end + object CbResetStates: TCheckBox + Left = 32 + Height = 19 + Top = 96 + Width = 200 + Caption = '&Reset selected state variables every ' + Enabled = False + OnClick = CbResetStatesClick + TabOrder = 4 + end + object EdResetStateTime: TEdit + Left = 264 + Height = 22 + Top = 93 + Width = 65 + Enabled = False + OnExit = EdResetStateTimeExit + OnKeyPress = EdResetStateTimeKeyPress + TabOrder = 5 + end + object BtnOpenStates: TButton + Left = 424 + Height = 41 + Top = 104 + Width = 297 + Caption = 'Ch&oose state variables to reset or hold constant...' + OnClick = BtnOpenStatesClick + TabOrder = 7 + end + object CbRuntoSS: TCheckBox + Left = 32 + Height = 19 + Top = 161 + Width = 119 + Caption = 'Run to S&teady State.' + OnClick = CbRuntoSSClick + OnKeyPress = CbRuntoSSKeyPress + TabOrder = 8 + Visible = False + end + object EdSSCriteria: TEdit + Left = 212 + Height = 22 + Top = 189 + Width = 65 + OnExit = EdSSCriteriaExit + OnKeyPress = EdSSCriteriaKeyPress + TabOrder = 9 + Visible = False + end + object EdSSTime: TEdit + Left = 496 + Height = 22 + Top = 189 + Width = 65 + OnExit = EdSSTimeExit + OnKeyPress = EdSSTimeKeyPress + TabOrder = 10 + Visible = False + end + object CbHoldStatesConstant: TCheckBox + Left = 32 + Height = 19 + Top = 128 + Width = 204 + Caption = '&Hold selected state variables constant' + Enabled = False + OnClick = CbHoldStatesConstantClick + TabOrder = 6 + end + end + object TsOutputOptions: TTabSheet + Caption = 'Output Options' + ClientHeight = 230 + ClientWidth = 732 + ImageIndex = 1 + object Panel1: TPanel + Left = 0 + Height = 114 + Top = 0 + Width = 732 + Align = alTop + BevelOuter = bvNone + BorderStyle = bsSingle + ClientHeight = 110 + ClientWidth = 728 + TabOrder = 0 + object LblTimeUnit3: TLabel + Left = 196 + Height = 15 + Top = 14 + Width = 135 + Alignment = taCenter + Caption = 'months, &beginning at month ' + FocusControl = EdOutputOffset + ParentColor = False + end + object LblYearlyCaution: TLabel + Left = 224 + Height = 15 + Top = 77 + Width = 496 + Caption = 'Only valid with daily models. Code must calculate the day of the year and store it in variable dayofyear.' + ParentColor = False + Visible = False + WordWrap = True + end + object RbOutputIntervals: TRadioButton + Left = 8 + Height = 19 + Top = 14 + Width = 86 + Caption = 'O&utput every ' + Checked = True + OnClick = RbOutputIntervalsClick + TabOrder = 0 + TabStop = True + end + object EdOutputTimeStep: TEdit + Left = 133 + Height = 22 + Top = 11 + Width = 57 + OnExit = EdOutputTimeStepExit + OnKeyPress = EdOutputTimeStepKeyPress + TabOrder = 1 + end + object EdOutputOffset: TEdit + Left = 400 + Height = 22 + Top = 11 + Width = 58 + OnExit = EdOutputOffsetExit + OnKeyPress = EdOutputOffsetKeyPress + TabOrder = 2 + end + object RbOutEndofRunOnly: TRadioButton + Left = 8 + Height = 19 + Top = 46 + Width = 128 + Caption = 'Output &end of run only' + OnClick = RbOutputIntervalsClick + TabOrder = 3 + end + object RbOutputIntervalsAnnual: TRadioButton + Left = 8 + Height = 19 + Top = 78 + Width = 124 + Caption = 'Output &yearly on day ' + OnClick = RbOutputIntervalsClick + TabOrder = 4 + Visible = False + end + object EdOutputDayofYear: TEdit + Left = 144 + Height = 22 + Top = 75 + Width = 68 + OnExit = EdOutputDayofYearExit + OnKeyPress = EdOutputDayofYearKeyPress + TabOrder = 5 + Visible = False + end + end + object CbAppendOutput: TCheckBox + Left = 12 + Height = 19 + Top = 193 + Width = 205 + Caption = '&Append subsequent runs to output file' + OnClick = CbAppendOutputClick + ParentBidiMode = False + TabOrder = 1 + Visible = False + end + object CbNoOutputFile: TCheckBox + Left = 13 + Height = 19 + Top = 161 + Width = 228 + Caption = '&No output file, output stored in memory only' + OnClick = CbNoOutputFileClick + TabOrder = 2 + end + object CbxWriteEvery: TCheckBox + Left = 13 + Height = 19 + Top = 127 + Width = 138 + Caption = '&Write output to file every' + OnClick = CbxWriteEveryClick + TabOrder = 3 + end + object EdWriteEvery: TEdit + Left = 156 + Height = 22 + Top = 125 + Width = 57 + OnExit = EdWriteEveryExit + OnKeyPress = EdWriteEveryKeyPress + TabOrder = 4 + Text = '0' + end + object LblTimeUnit6: TLabel + Left = 220 + Height = 15 + Top = 129 + Width = 39 + Alignment = taCenter + Caption = 'months.' + FocusControl = EdOutputOffset + ParentColor = False + end + end + object TsTimeSteps: TTabSheet + Caption = 'Time Steps' + ClientHeight = 230 + ClientWidth = 732 + ImageIndex = 2 + object LblTimeStep: TLabel + Left = 11 + Height = 14 + Top = 40 + Width = 134 + Alignment = taRightJustify + AutoSize = False + Caption = '&Integrator Time Step' + FocusControl = METimeStep + ParentColor = False + end + object LblDiscreteStep: TLabel + Left = 11 + Height = 14 + Top = 88 + Width = 134 + Alignment = taRightJustify + AutoSize = False + Caption = 'Discrete Time Step' + FocusControl = MEDiscreteStep + ParentColor = False + end + object LblTimeUnit4: TLabel + Left = 256 + Height = 14 + Top = 41 + Width = 121 + AutoSize = False + Caption = 'LblTimeUnit4' + ParentColor = False + end + object LblErrorMult: TLabel + Left = 11 + Height = 14 + Top = 168 + Width = 134 + Alignment = taRightJustify + AutoSize = False + Caption = 'Error Multiplier' + FocusControl = MeErrorMult + ParentColor = False + end + object LblErrorMult2: TLabel + Left = 256 + Height = 14 + Top = 169 + Width = 289 + AutoSize = False + Caption = 'integer, larger values allow larger errors' + ParentColor = False + end + object METimeStep: TMaskEdit + Left = 151 + Height = 22 + Top = 37 + Width = 99 + CharCase = ecNormal + MaxLength = 5 + TabOrder = 0 + OnExit = METimeStepExit + OnKeyPress = METimeStepKeyPress + EditMask = 'ccccc;0; ' + Text = '1' + SpaceChar = ' ' + end + object MEDiscreteStep: TMaskEdit + Left = 151 + Height = 22 + Top = 85 + Width = 99 + CharCase = ecNormal + MaxLength = 5 + TabOrder = 1 + OnExit = MEDiscreteStepExit + OnKeyPress = MEDiscreteStepKeyPress + EditMask = 'ccccc;0; ' + Text = '1' + SpaceChar = ' ' + end + object MeErrorMult: TMaskEdit + Left = 151 + Height = 22 + Top = 165 + Width = 99 + CharCase = ecNormal + MaxLength = 0 + TabOrder = 2 + OnExit = MeErrorMultExit + OnKeyPress = MeErrorMultKeyPress + Text = '1' + SpaceChar = '_' + end + end + end + object LblTimeUnit5: TLabel + Left = 264 + Height = 14 + Top = 112 + Width = 121 + AutoSize = False + Caption = 'LblTimeUnit5' + ParentColor = False + end +end diff --git a/modelshell/Options.pas b/modelshell/Options.pas new file mode 100644 index 0000000..eb25a4f --- /dev/null +++ b/modelshell/Options.pas @@ -0,0 +1,737 @@ +unit Options; + +{$MODE Delphi} + +interface + +uses + SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ExtCtrls, ComCtrls, Menus, MaskEdit, stypes; + +type + + { TFmOptions } + + TFmOptions = class(TForm) + BtnCancel: TButton; + BtnOK: TButton; + BtnDefaults: TButton; + CbxWriteEvery: TCheckBox; + EdWriteEvery: TEdit; + LblTimeUnit5: TLabel; + LblTimeUnit6: TLabel; + PcOptions: TPageControl; + TsRunOptions: TTabSheet; + TsOutputOptions: TTabSheet; + RbNormalRun: TRadioButton; + RbSpecialRun: TRadioButton; + CbRepeatDrivers: TCheckBox; + EdRepeatDriveTime: TEdit; + LblTimeUnit2: TLabel; + CbResetStates: TCheckBox; + EdResetStateTime: TEdit; + LblTimeUnit1: TLabel; + BtnOpenStates: TButton; + CbRuntoSS: TCheckBox; + LblSSCriteria: TLabel; + EdSSCriteria: TEdit; + LblSSTime: TLabel; + EdSSTime: TEdit; + TsTimeSteps: TTabSheet; + LblTimeStep: TLabel; + METimeStep: TMaskEdit; + LblDiscreteStep: TLabel; + MEDiscreteStep: TMaskEdit; + LblTimeUnit4: TLabel; + Panel1: TPanel; + CbHoldStatesConstant: TCheckBox; + CbAppendOutput: TCheckBox; + RbOutputIntervals: TRadioButton; + EdOutputTimeStep: TEdit; + LblTimeUnit3: TLabel; + EdOutputOffset: TEdit; + RbOutEndofRunOnly: TRadioButton; + LblErrorMult: TLabel; + MeErrorMult: TMaskEdit; + LblErrorMult2: TLabel; + RbOutputIntervalsAnnual: TRadioButton; + EdOutputDayofYear: TEdit; + LblYearlyCaution: TLabel; + CbNoOutputFile: TCheckBox; + procedure CbxWriteEveryClick(Sender: TObject); + procedure EdWriteEveryExit(Sender: TObject); + procedure EdWriteEveryKeyPress(Sender: TObject; var Key: char); + procedure FormCreate(Sender: TObject); + procedure CbRepeatDriversClick(Sender: TObject); + procedure CbResetStatesClick(Sender: TObject); + procedure EdRepeatDriveTimeExit(Sender: TObject); + procedure EdResetStateTimeExit(Sender: TObject); + procedure BtnCancelClick(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure UpdateFmRunOptions(Sender: TObject); + procedure RbNormalRunClick(Sender: TObject); + procedure BtnOKClick(Sender: TObject); + procedure RbOutputIntervalsClick(Sender: TObject); + procedure CbAppendOutputClick(Sender: TObject); + procedure CheckOutputStep(var newvalue:double); + procedure CheckDiscreteStep(var newvalue:double); + procedure CbRuntoSSClick(Sender: TObject); + procedure EdOutputTimeStepExit(Sender: TObject); + procedure CheckOutputOffset(newvalue:double); + procedure EdOutputOffsetExit(Sender: TObject); + procedure BtnDefaultsClick(Sender: TObject); + procedure EdRepeatDriveTimeKeyPress(Sender: TObject; var Key: Char); + procedure EdResetStateTimeKeyPress(Sender: TObject; var Key: Char); + procedure EdOutputTimeStepKeyPress(Sender: TObject; var Key: Char); + procedure EdOutputOffsetKeyPress(Sender: TObject; var Key: Char); + procedure CbRuntoSSKeyPress(Sender: TObject; var Key: Char); + procedure EdSSCriteriaExit(Sender: TObject); + procedure EdSSCriteriaKeyPress(Sender: TObject; var Key: Char); + procedure BtnOpenStatesClick(Sender: TObject); + procedure EdSSTimeExit(Sender: TObject); + procedure EdSSTimeKeyPress(Sender: TObject; var Key: Char); + procedure METimeStepExit(Sender: TObject); + procedure METimeStepKeyPress(Sender: TObject; var Key: Char); + procedure MEDiscreteStepKeyPress(Sender: TObject; var Key: Char); + procedure MEDiscreteStepExit(Sender: TObject); + procedure CbHoldStatesConstantClick(Sender: TObject); + procedure MeErrorMultExit(Sender: TObject); + procedure MeErrorMultKeyPress(Sender: TObject; var Key: Char); + procedure EdOutputDayofYearExit(Sender: TObject); + procedure EdOutputDayofYearKeyPress(Sender: TObject; var Key: Char); + procedure CbNoOutputFileClick(Sender: TObject); + private + { Private declarations } + fIntialRunOptions: TRunOptions; + public + { Public declarations } + DefaultRunOptions: TRunOptions; + RunOptions: TRunOptions; + end; + +var + FmOptions: TFmOptions; + +implementation + +{$R *.lfm} + +uses frontend, data; + +procedure TFmOptions.FormCreate(Sender: TObject); +begin + LblTimeUnit1.Caption := ModelDef.timeunit + '.'; + LblTimeUnit2.Caption := ModelDef.timeunit + '.'; + LblTimeUnit3.Caption := ModelDef.timeunit + '(s), beginning at ' + ModelDef.timeunit; + LblTimeUnit4.Caption := ModelDef.timeunit + '.'; + LblTimeUnit5.Caption := ModelDef.timeunit + '. Use with extreme caution.'; + LblTimeUnit6.Caption := ModelDef.timeunit + '.'; + with RunOptions do + begin + NormalRun := True; + Time_step := strtofloat(FmOptions.METimeStep.text); + DiscreteStep := Time_step; + RepeatDrivers := False; + RepeatDriveTime := 0; + ResetStates := False; + ResetStateTime := 0; + RuntoSS := False; + SSCriteria := 0; + SSTime := 0; + HoldStatesConstant := False; + Outputstep := time_step; + Outputoffset := 0; + OutputEORonly := False; + OutputAnnually := False; + OutputAnnuallyDay := 0; + AppendOutputFile := False; + OutputFile := True; + stepcounter := 1; + outcounter := 0; + WriteEvery := 0; + ErrorMult := 1; + end; + DefaultRunOptions := RunOptions; +end; + +procedure TFmOptions.CbxWriteEveryClick(Sender: TObject); +begin + if CbxWriteEvery.Checked then EdWriteEvery.SetFocus; +end; + +procedure TFmOptions.EdWriteEveryExit(Sender: TObject); +var + newwritestep:double; + begin + try + // try + if (EdWriteEvery.Text <> '') or (EdWriteEvery.Text <> '0')then + begin + RunOptions.NormalRun:=False; + newwritestep := strtofloat(EdWriteEvery.Text); + // Add code here to make the write step makes sense + RunOptions.WriteEvery := newwritestep; + end; +{ except on E: Exception do + begin + RunOptions.Outputstep := newoutstep; + EdOutputTimeStep.Text := floattostr(newoutstep); + MessageDlg('Invalid output time step. ' + E.message, + mtwarning, [mbOK], 0); + end; } + // end; + finally + UpdateFmRunOptions(sender); + end; + end; + +procedure TFmOptions.EdWriteEveryKeyPress(Sender: TObject; var Key: char); +begin + if (Key = Chr(13)) then EdWriteEveryExit(Sender); +end; + +procedure TFmOptions.CbRepeatDriversClick(Sender: TObject); +begin + RunOptions.RepeatDrivers := CbRepeatDrivers.Checked; + UpdateFmRunOptions(Sender); + if RunOptions.RepeatDrivers then EdRepeatDriveTime.SetFocus; +end; + +procedure TFmOptions.CbResetStatesClick(Sender: TObject); +var + i: integer; +begin + RunOptions.ResetStates := CbResetStates.Checked; + if not RunOptions.ResetStates then + for i := 1 to ModelDef.numstate do stat[i].Reset := false; + UpdateFmRunOptions(Sender); + if RunOptions.ResetStates then EdResetStateTime.SetFocus; +end; + +procedure TFmOptions.EdRepeatDriveTimeExit(Sender: TObject); +begin + try + if EdRepeatDriveTime.Text <> '0' then + begin + RunOptions.RepeatDriveTime := strtoint(EdRepeatDriveTime.Text); + CbRepeatDrivers.Checked := True; + end; + except + MessageDlg('Invalid driver repeat time. Run set to Normal run.', mtwarning, + [mbOK], 0); + RunOptions.NormalRun := True; + end; + UpdateFmRunOptions(Sender); +end; + +procedure TFmOptions.EdResetStateTimeExit(Sender: TObject); +begin + try + if EdResetStateTime.Text <> '0' then + begin + RunOptions.ResetStateTime := strtofloat(EdResetStateTime.Text); + CbResetStates.Checked := True; + end; + except + MessageDlg('Invalid state variable reset time. Run set to Normal run.', + mtwarning, [mbOK], 0); + RunOptions.NormalRun := True; + end; + UpdateFmRunOptions(Sender); +end; + +procedure TFmOptions.BtnCancelClick(Sender: TObject); +begin + RunOptions := fIntialRunOptions; + FmOptions.UpdateFmRunOptions(Sender); + FmOptions.Close; + FmShellMain.UpdateFmShellMain; +end; + +procedure TFmOptions.FormShow(Sender: TObject); +begin + if FmShellMain.lastitem.name = 'MITimeSteps' then + PcOptions.ActivePage := TsTimeSteps + else if FmShellMain.lastitem.name = 'MISpecialRun' then + PcOptions.ActivePage := TsRunOptions + else + PcOptions.ActivePage := TsOutputOptions; + UpdateFmRunOptions(Sender); + fIntialRunOptions := RunOptions; +end; + +procedure TFmOptions.UpdateFmRunOptions(Sender: TObject); +begin + if RunOptions.NormalRun then + begin + RbNormalRun.Checked := True; + CbRepeatDrivers.Checked := False; + CbRepeatDrivers.Enabled := False; + EdRepeatDriveTime.Text := floattostr(RunOptions.RepeatDriveTime); + EdRepeatDriveTime.Enabled := False; + CbResetStates.Checked := False; + CbResetStates.Enabled := False; + CbHoldStatesConstant.Checked := False; + CbHoldStatesConstant.Enabled := False; + BtnOpenStates.Enabled := False; + EdResetStateTime.Enabled := False; + EdResetStateTime.Text := floattostr(RunOptions.ResetStateTime); + CbRuntoSS.Checked := False; + CbRuntoSS.Enabled := False; + LblSSCriteria.Enabled := False; + EdSSCriteria.Enabled := False; + EdSSCriteria.Text := floattostr(RunOptions.SSCriteria); + LblSSTime.Enabled := False; + EdSSTime.Enabled := False; + EdSSTime.Text := floattostr(RunOptions.SSTime); + end + else // Special Run + begin + RbSpecialRun.Checked := True; + CbRepeatDrivers.Enabled := True; + EdRepeatDriveTime.Enabled := True; + CbResetStates.Enabled := True; + EdResetStateTime.Enabled := True; + CbHoldStatesConstant.Enabled := True; + BtnOpenStates.Enabled := True; + CbRuntoSS.Enabled := True; + LblSSCriteria.Enabled := True; + EdSSCriteria.Enabled := True; + EdSSTime.Enabled := True; + LblSSTime.Enabled := True; + + // Simulation options + CbRepeatDrivers.Checked := RunOptions.RepeatDrivers; + if RunOptions.RepeatDrivers then + EdRepeatDriveTime.Text := floattostr(RunOptions.RepeatDriveTime) + else + EdRepeatDriveTime.Text := floattostr(DefaultRunOptions.RepeatDriveTime); + + CbResetStates.Checked := RunOptions.ResetStates; + if RunOptions.ResetStates then + EdResetStateTime.Text := floattostr(RunOptions.ResetStateTime) + else + EdResetStateTime.Text := floattostr(DefaultRunOptions.ResetStateTime); + + CbHoldStatesConstant.Checked := RunOptions.HoldStatesConstant; + + CbRuntoSS.Checked := RunOptions.RuntoSS; + if RunOptions.RuntoSS then + begin + EdSSCriteria.Text := floattostr(100*RunOptions.SSCriteria); + EdSSTime.Text := floattostr(RunOptions.SSTime); + end + else + begin + EdSSCriteria.Text := floattostr(100*DefaultRunOptions.SSCriteria); + EdSSTime.Text := floattostr(DefaultRunOptions.SSTime); + end; + end; + + EdOutputOffset.Text := floattostr(RunOptions.Outputoffset); + EdOutputTimeStep.Text := floattostr(RunOptions.Outputstep); + EdOutputDayofYear.Text := floattostr(RunOptions.OutputAnnuallyDay); + if RunOptions.OutputEORonly then + begin + RbOutEndofRunOnly.Checked := True; + EdOutputTimeStep.Enabled := False; + EdOutputOffset.Enabled := False; + EdOutputDayofYear.Enabled := False; + FmShellMain.MIOutOptions.Checked := True; + end + else if (not RunOptions.OutputAnnually) then // Output intervals + begin + RbOutputIntervals.Checked := True; + EdOutputTimeStep.Enabled := True; + EdOutputOffset.Enabled := True; + EdOutputDayofYear.Enabled := False; + if (RunOptions.Outputstep = DefaultRunOptions.Outputstep) and + (RunOptions.Outputoffset = DefaultRunOptions.Outputoffset) then + FmShellMain.MIOutOptions.Checked := False + else + FmShellMain.MIOutOptions.Checked := True; + end + else // Output on specific calendar day + begin + RbOutputIntervalsAnnual.Checked := True; + EdOutputDayofYear.Text := floattostr(RunOptions.OutputAnnuallyDay); + EdOutputDayofYear.Enabled := True; + EdOutputTimeStep.Enabled := False; + EdOutputOffset.Enabled := False; + FmShellMain.MIOutOptions.Checked := True; + end; + + if RunOptions.AppendOutputFile then + begin + CbAppendOutput.Checked := True; + FmShellMain.MIOutOptions.Checked := True; + end + else + begin + CbAppendOutput.Checked := False; + end; + + if RunOptions.outputfile then + begin + CbNooutputfile.Checked := False; + FmShellMain.MIOutOptions.Checked := True; + end + else + begin + CbNooutputfile.Checked := True; + end; + + if RunOptions.WriteEvery <> 0 then + begin + CbxWriteEvery.Checked:=True; + FmShellMain.MIOutOptions.Checked := True; + EdWriteEvery.Text:= floattostr(RunOptions.WriteEvery); + end + else + begin + CbxWriteEvery.Checked:=False; + EdWriteEvery.Text:='0'; + end; +// FIX Add code here to set Output options mI to unchecked if all the options have been turned off. + + METimeStep.text := floattostr(RunOptions.time_step); + MEDiscreteStep.Text := floattostr(RunOptions.DiscreteStep); + if (RunOptions.time_step = DefaultRunOptions.Time_step) and + (RunOptions.DiscreteStep = DefaultRunOptions.DiscreteStep) then + FmShellMain.MITimeSteps.Checked := False + else + FmShellMain.MITimeSteps.Checked := True; + + MeErrorMult.text := inttostr(RunOptions.ErrorMult); +end; + +procedure TFmOptions.RbNormalRunClick(Sender: TObject); +begin + RunOptions.NormalRun := RbNormalRun.Checked; + UpdateFmRunOptions(Sender); +end; + +procedure TFmOptions.BtnOKClick(Sender: TObject); +begin + FmShellMain.UpdateFmShellMain; +end; + +procedure TFmOptions.RbOutputIntervalsClick(Sender: TObject); +begin + RunOptions.OutputEORonly := RbOutEndofRunOnly.Checked; + RunOptions.OutputAnnually := RbOutputIntervalsAnnual.Checked; + UpdateFmRunOptions(Sender); + if RunOptions.OutputAnnually then EdOutputDayofYear.SetFocus + else if (not RunOptions.OutputEORonly) then EdOutputTimeStep.SetFocus; +end; + +procedure TFmOptions.CbNoOutputFileClick(Sender: TObject); +begin + RunOptions.outputfile := not CbNoOutputFile.Checked; + UpdateFmRunOptions(Sender); +end; + +procedure TFmOptions.CbAppendOutputClick(Sender: TObject); +begin + RunOptions.AppendOutputFile := CbAppendOutput.Checked; + UpdateFmRunOptions(Sender); +end; + +procedure TFmOptions.CbRuntoSSClick(Sender: TObject); +begin + RunOptions.RuntoSS := CbRuntoSS.Checked; + UpdateFmRunOptions(Sender); +end; + +procedure TFmOptions.EdOutputTimeStepExit(Sender: TObject); +var + newoutstep:double; +begin + try + try + if (EdOutputTimeStep.Text <> ''){and (EdOutputTimeStep.Modified)}then + begin + newoutstep := strtofloat(EdOutputTimeStep.Text); + CheckOutputStep(newoutstep); + RunOptions.Outputstep := newoutstep; + end; + except on E: Exception do + begin + RunOptions.Outputstep := newoutstep; + EdOutputTimeStep.Text := floattostr(newoutstep); + MessageDlg('Invalid output time step. ' + E.message, + mtwarning, [mbOK], 0); + end; + end; + finally + UpdateFmRunOptions(sender); + end; +end; + +procedure TFmOptions.CheckOutputStep(var newvalue:double); +begin + if newvalue < Runoptions.time_step then + begin + newvalue := Runoptions.time_step; + raise EStepTooSmall.Create('Output time step is less than integrator ' + + 'time step. Output time step increased to time step. '); + end; + + if newvalue > time_stop - time_start then + begin + newvalue := time_stop - time_start; + raise EStepTooLarge.Create('Output time step is greater than run ' + + 'length. Output time step decreased to run length. '); + end; + + if abs(newvalue/RunOptions.Time_step - round(newvalue/RunOptions.Time_step)) > epsilon then + begin + newvalue := RunOptions.time_step; + raise EStepNotMultiple.Create('Output time step must be a multiple ' + + 'of integrator time step. Output time step changed to current ' + + 'integrator time_step. '); + end; +end; + +procedure TFmOptions.CheckOutputOffset(newvalue:double); +begin +{ if newvalue < RunOptions.time_step then + raise Exception.Create('Output offset is less than simulation time step. '); } + if newvalue > time_stop then + raise Exception.Create('Output offset is greater than simulation length. '); +end; + +procedure TFmOptions.EdOutputOffsetExit(Sender: TObject); +var + newoutoffset: double; +begin + try + try + if (EdOutputOffset.Text <> ''){and (EdOutputOffset.Modified)}then + begin + newoutoffset := strtoint(EdOutputOffset.Text); + CheckOutputOffset(newoutoffset); + RunOptions.Outputoffset := newoutoffset; + end; + except on E: Exception do + begin + RunOptions.Outputoffset := RunOptions.Time_step; + MessageDlg('Invalid output offset. ' + E.message + + 'Output offset reset to simulation time step. ', mtwarning, [mbOK], 0); + end; + end; + finally + UpdateFmRunOptions(sender); + end; +end; + +procedure TFmOptions.BtnDefaultsClick(Sender: TObject); +begin + if MessageDlg('Reset ALL options (Run, Output and Time step options) to the ' + + 'default values?', mtwarning, + [mbyes,mbno],0) = mryes then RunOptions := DefaultRunOptions; + UpdateFmRunOptions(BtnDefaults); +end; + +procedure TFmOptions.EdRepeatDriveTimeKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then EdRepeatDriveTimeExit(Sender); +end; + +procedure TFmOptions.EdResetStateTimeKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then EdResetStateTimeExit(Sender); +end; + +procedure TFmOptions.EdOutputTimeStepKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then EdOutputTimeStepExit(Sender); +end; + +procedure TFmOptions.EdOutputOffsetKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then EdOutputOffsetExit(Sender); +end; + +procedure TFmOptions.CbRuntoSSKeyPress(Sender: TObject; var Key: Char); +begin + CbRuntoSSClick(Sender); +end; + +procedure TFmOptions.EdSSCriteriaExit(Sender: TObject); +begin + try + if EdSSCriteria.Text <> '0' then + begin + RunOptions.SSCriteria := strtofloat(EdSSCriteria.Text)/100; + CbRuntoSS.Checked := True; + end; + except + MessageDlg('Invalid steady state criteria. Run set to Normal run.', + mtwarning, [mbOK], 0); + RunOptions.NormalRun := True; + end; + UpdateFmRunOptions(Sender); + if RunOptions.RuntoSS then EdSSTime.SetFocus; +end; + +procedure TFmOptions.EdSSCriteriaKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then EdSSCriteriaExit(Sender); +end; + +procedure TFmOptions.BtnOpenStatesClick(Sender: TObject); +begin + DataForm.ShowStates; // Show the data form containing state variables +end; + +procedure TFmOptions.EdSSTimeExit(Sender: TObject); +begin + try + if EdSSTime.Text <> '0' then + begin + RunOptions.SSTime := strtoint(EdSSTime.Text); + CbRuntoSS.Checked := True; + end; + except + MessageDlg('Invalid steady state time. Run set to Normal run.', + mtwarning, [mbOK], 0); + RunOptions.NormalRun := True; + end; + UpdateFmRunOptions(Sender); +end; + +procedure TFmOptions.EdSSTimeKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then EdSSTimeExit(Sender); +end; + +procedure TFmOptions.METimeStepExit(Sender: TObject); +var + newtimestep: double; // fix +begin // remove newtimestep once fix MEtimestep.modified + if (METimeStep.text <> '') then + begin + newtimestep := strtofloat(METimeStep.text); + if newtimestep <> RunOptions.Time_step then + try + try + RunOptions.Time_Step := newtimestep; + ReadytoRun := False; + RunComplete := False; // Previous runs are invalid. + FmShellMain.UpdateFmShellMain; // Update the form. + CheckOutputStep(RunOptions.Outputstep); + except + on E: EStepError do + begin + RunOptions.Outputstep := RunOptions.time_step; + FmOptions.EdOutputTimeStep.Text := floattostr(RunOptions.time_step); + MessageDlg(E.message, mtwarning, [mbOK], 0); + end; + end; + finally + UpdateFmRunOptions(sender); + end; + end; +end; + +procedure TFmOptions.METimeStepKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then MeTimeStepExit(Sender); +end; + +procedure TFmOptions.MEDiscreteStepKeyPress(Sender: TObject; + var Key: Char); +begin + if (Key = Chr(13)) then MeTimeStepExit(Sender); +end; + +procedure TFmOptions.MEDiscreteStepExit(Sender: TObject); +var + newtimestep: double; +begin // fix + if (MEDiscreteStep.text <> '') then + begin + newtimestep := strtofloat(MEDiscreteStep.text); + if newtimestep <> RunOptions.DiscreteStep then + try + try + RunOptions.DiscreteStep := newtimestep; + ReadytoRun := False; + RunComplete := False; // Previous runs are invalid. + FmShellMain.UpdateFmShellMain; // Update the form. + CheckDiscreteStep(RunOptions.DiscreteStep); + except + on E: EStepError do + begin + RunOptions.DiscreteStep := RunOptions.time_step; + FmOptions.MEDiscreteStep.Text := floattostr(RunOptions.time_step); + MessageDlg(E.message, mtwarning, [mbOK], 0); + end; + end; + finally + UpdateFmRunOptions(sender); + end; + end; +end; + +procedure TFmOptions.CheckDiscreteStep(var newvalue:double); +begin + if newvalue < Runoptions.time_step then + begin + newvalue := Runoptions.time_step; + raise EStepTooSmall.Create('Discrete time step is less than integrator ' + + 'time step. Discrete time step increased to time step. '); + end; + + if newvalue > time_stop - time_start then + begin + newvalue := time_stop - time_start; + raise EStepTooLarge.Create('Discrete time step is greater than run ' + + 'length. Discrete time step decreased to run length. '); + end; + + if abs(newvalue/RunOptions.Time_step - round(newvalue/RunOptions.Time_step)) > + epsilon then + begin + newvalue := RunOptions.time_step; + raise EStepNotMultiple.Create('Discrete time step must be a multiple ' + + 'of integrator time step. Discrete time step changed to current ' + + 'integrator time step. '); + end; +end; + +procedure TFmOptions.CbHoldStatesConstantClick(Sender: TObject); +begin + RunOptions.HoldStatesConstant := CbHoldStatesConstant.Checked; + UpdateFmRunOptions(Sender); +end; + +procedure TFmOptions.MeErrorMultExit(Sender: TObject); +begin // fix - add error checking here + RunOptions.ErrorMult := strtoint(MeErrorMult.Text); +end; + +procedure TFmOptions.MeErrorMultKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then MeErrorMultExit(Sender); +end; + +procedure TFmOptions.EdOutputDayofYearExit(Sender: TObject); +begin + if EdOutputDayofYear.Text <> '' then + begin + RunOptions.OutputAnnuallyDay := strtofloat(EdOutputDayofYear.text); + end; + UpdateFmRunOptions(sender); +end; + +procedure TFmOptions.EdOutputDayofYearKeyPress(Sender: TObject; + var Key: Char); +begin + if (Key = Chr(13)) then EdOutputDayofYearExit(Sender); +end; + +end. + + diff --git a/modelshell/ParamList.lfm b/modelshell/ParamList.lfm new file mode 100644 index 0000000..b21b4ec --- /dev/null +++ b/modelshell/ParamList.lfm @@ -0,0 +1,80 @@ +object FmParamList: TFmParamList + Left = 855 + Height = 642 + Top = 234 + Width = 758 + ActiveControl = btnSelect + BorderIcons = [] + BorderStyle = bsSingle + Caption = 'Choose a parameter to display' + ClientHeight = 642 + ClientWidth = 758 + Color = clBtnFace + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + OnCreate = FormCreate + Position = poMainFormCenter + LCLVersion = '0.9.30' + object lbParamSymbols: TListBox + Left = 5 + Height = 529 + Top = 5 + Width = 758 + Columns = 3 + ItemHeight = 0 + OnClick = lbParamSymbolsClick + OnDblClick = btnSelectClick + TabOrder = 0 + end + object btnSelect: TButton + Left = 8 + Height = 25 + Top = 552 + Width = 100 + Caption = '&Select' + OnClick = btnSelectClick + TabOrder = 1 + end + object btnCancel: TButton + Left = 125 + Height = 25 + Top = 552 + Width = 100 + Caption = '&Cancel' + ModalResult = 2 + TabOrder = 2 + end + object lbParamNames: TListBox + Left = 0 + Height = 529 + Top = 0 + Width = 758 + Align = alTop + Columns = 3 + ItemHeight = 0 + OnClick = lbParamNamesClick + OnDblClick = btnSelectClick + TabOrder = 3 + end + object rbParameterSymbol: TRadioButton + Left = 552 + Height = 18 + Top = 551 + Width = 142 + Caption = 'Show parameter s&ymbols' + Checked = True + OnClick = rbParameterSymbolClick + TabOrder = 4 + TabStop = True + end + object rbParameterName: TRadioButton + Left = 552 + Height = 18 + Top = 574 + Width = 134 + Caption = 'Show parameter &names' + OnClick = rbParameterNameClick + TabOrder = 5 + end +end diff --git a/modelshell/ParamList.pas b/modelshell/ParamList.pas new file mode 100644 index 0000000..40b5fd7 --- /dev/null +++ b/modelshell/ParamList.pas @@ -0,0 +1,142 @@ +unit ParamList; + +{$MODE Delphi} + +interface + +uses + SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; + +type + TFmParamList = class(TForm) + lbParamSymbols: TListBox; + btnSelect: TButton; + btnCancel: TButton; + lbParamNames: TListBox; + rbParameterSymbol: TRadioButton; + rbParameterName: TRadioButton; + procedure btnSelectClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure rbParameterSymbolClick(Sender: TObject); + procedure rbParameterNameClick(Sender: TObject); + procedure lbParamSymbolsClick(Sender: TObject); + procedure lbParamNamesClick(Sender: TObject); + private + { Private declarations } + public + whichEdparselected: integer; + { Public declarations } + end; + +var + FmParamList: TFmParamList; + +implementation +uses frontend, Display, calculate, stypes; +{$R *.lfm} + +procedure TFmParamList.FormCreate(Sender: TObject); +var + i : integer; +begin + // fill the boxes with names and symbols + for i := 1 to modelDef.numparam do begin + lbParamSymbols.Items.Add(par[i].symbol); + lbParamNames.Items.Add(par[i].name); + end; + // select the first in the list + lbParamSymbols.ItemIndex := 0; + lbParamNames.ItemIndex := 0; + + // make sure the symbols box is on top + lbParamSymbols.visible := true; + lbParamNames.visible := false; + LbparamSymbols.Align:=alTop; + LbParamNames.Align:=alNone; +end; + +procedure TFmParamList.btnSelectClick(Sender: TObject); +var + tempString : string; + tempIndex : integer; + ParAlreadySelected:Boolean; +begin + +ParAlreadySelected:=False; +tempString := lbParamSymbols.items[lbParamSymbols.itemIndex]; +tempIndex := fmCalculate.getArrayIndex(vtParameter,tempString); + +// Check if the selected parameter is already displayed. +if (FmDisplayOutput.lblEdPar1.EditLabel.caption = tempString) or + (FmDisplayOutput.lblEdPar2.EditLabel.caption = tempString) or + (FmDisplayOutput.lblEdPar3.EditLabel.caption = tempString) or + (FmDisplayOutput.lblEdPar4.EditLabel.caption = tempString) then + begin + messageDlg('That parameter is already displayed', mtWarning, [mbOK], 0); + ParAlreadySelected:=True; + end +else + begin + // which of the four labels in the display form was selected + case whichEdparselected of + 1: begin + FmDisplayOutput.lblEdPar1.EditLabel.caption := tempString; + FmDisplayOutput.LblEdPar1.text := floatToStr(par[tempIndex].value); + FmDisplayOutput.LblEdPar1.Enabled := true; + end; + 2: begin + FmDisplayOutput.lblEdPar2.EditLabel.caption := tempString; + FmDisplayOutput.lblEdPar2.text := floatToStr(par[tempIndex].value); + FmDisplayOutput.lblEdPar2.Enabled := true; // fix necessary? + end; + 3: begin + FmDisplayOutput.lblEdPar3.EditLabel.caption := tempString; + FmDisplayOutput.lblEdPar3.text := floatToStr(par[tempIndex].value); + FmDisplayOutput.lblEdPar3.Enabled := true; + end; + 4: begin + FmDisplayOutput.lblEdPar4.EditLabel.caption := tempString; + FmDisplayOutput.lblEdPar4.text := floatToStr(par[tempIndex].value); + FmDisplayOutput.lblEdPar4.Enabled := true; + end; + else + begin + messageDlg('There`s a problem with the selection of a parameter', + mtInformation, [mbOK], 0); + end; + end; + end; +if not ParAlreadySelected then FmParamList.Close; +end; + +procedure TFmParamList.rbParameterSymbolClick(Sender: TObject); +begin + // make sure the symbols box is on top + lbParamSymbols.visible := true; + LbParamSymbols.Align:=alTop; + lbParamNames.visible := false; + LbParamNames.Align:=alNone; +end; + +procedure TFmParamList.rbParameterNameClick(Sender: TObject); +begin + // make sure the names box is on top + fmParamList.lbParamSymbols.visible := false; + LbParamSymbols.Align:=alNone; + fmParamList.lbParamNames.visible := true; + LbParamNames.Align:=alTop; +end; + +procedure TFmParamList.lbParamSymbolsClick(Sender: TObject); +begin + // to always have the same name and symbol selected + lbParamNames.itemIndex := lbParamSymbols.itemIndex; +end; + +procedure TFmParamList.lbParamNamesClick(Sender: TObject); +begin + // to always have the same name and symbol selected + lbParamSymbols.itemIndex := lbParamNames.itemIndex; +end; + +end. diff --git a/modelshell/ProgressBar.lfm b/modelshell/ProgressBar.lfm new file mode 100644 index 0000000..6b190a6 --- /dev/null +++ b/modelshell/ProgressBar.lfm @@ -0,0 +1,58 @@ +object FmProgress: TFmProgress + Left = 373 + Height = 74 + Top = 204 + Width = 494 + BorderIcons = [] + BorderStyle = bsDialog + Caption = 'FmProgress' + ClientHeight = 74 + ClientWidth = 494 + Color = clBtnFace + DefaultMonitor = dmMainForm + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + FormStyle = fsStayOnTop + OnCreate = FormCreate + OnShow = FormShow + Position = poOwnerFormCenter + LCLVersion = '1.8.4.0' + object LblBegin: TLabel + Left = 7 + Height = 14 + Top = 20 + Width = 63 + AutoSize = False + Caption = 'LblBegin' + ParentColor = False + end + object LblEnd: TLabel + Left = 401 + Height = 14 + Top = 20 + Width = 80 + Alignment = taRightJustify + AutoSize = False + Caption = 'LblEnd' + ParentColor = False + end + object PbRunStatus: TProgressBar + Left = 76 + Height = 13 + Top = 20 + Width = 319 + Smooth = True + TabOrder = 0 + BarShowText = True + end + object BtnCancel: TButton + Left = 221 + Height = 20 + Top = 46 + Width = 76 + Caption = '&Cancel' + OnClick = BtnCancelClick + TabOrder = 1 + end +end diff --git a/modelshell/ProgressBar.pas b/modelshell/ProgressBar.pas new file mode 100644 index 0000000..798c43b --- /dev/null +++ b/modelshell/ProgressBar.pas @@ -0,0 +1,62 @@ +unit ProgressBar; + +{$MODE Delphi} + +interface + +uses + SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; +//type Tapp = (mainmodel, fuzzycal); +type Tcprocedure = procedure of object; +type + TFmProgress = class(TForm) + PbRunStatus: TProgressBar; + LblBegin: TLabel; + LblEnd: TLabel; + BtnCancel: TButton; + procedure BtnCancelClick(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure FormCreate(Sender: TObject); + private + { Private declarations } + public + { Public declarations } +// apprunning: Tapp; + CancelProcedure: Tcprocedure; + end; + +var + FmProgress: TFmProgress; + +implementation + +uses frontend; + +{$R *.lfm} + +procedure TFmProgress.BtnCancelClick(Sender: TObject); +begin + if messageDlg('Do you want to abort this run?', mtConfirmation, + [mbYes, mbNo], 0) = mrYes + then + begin +// raise EUserCancel.Create('User canceled run. '); +{ if apprunning = mainmodel then + FmShellMain.CancelRun + else if apprunning = fuzzycal then + FmCalMain.CancelRun; } + CancelProcedure; + end; +end; + +procedure TFmProgress.FormShow(Sender: TObject); +begin + PbRunStatus.Position := 0; +end; + +procedure TFmProgress.FormCreate(Sender: TObject); +begin + CancelProcedure := FmShellMain.CancelRun; +end; + +end. diff --git a/modelshell/ReloadDlg.lfm b/modelshell/ReloadDlg.lfm new file mode 100644 index 0000000..d8e33cc --- /dev/null +++ b/modelshell/ReloadDlg.lfm @@ -0,0 +1,82 @@ +object DlgReload: TDlgReload + Left = 565 + Height = 191 + Top = 197 + Width = 313 + BorderStyle = bsDialog + Caption = 'Dialog' + ClientHeight = 191 + ClientWidth = 313 + Color = clBtnFace + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Position = poMainFormCenter + LCLVersion = '0.9.30' + object Bevel1: TBevel + Left = 8 + Height = 129 + Top = 8 + Width = 297 + Shape = bsFrame + end + object OKBtn: TButton + Left = 79 + Height = 25 + Top = 148 + Width = 75 + Caption = 'OK' + Default = True + ModalResult = 1 + OnClick = OKBtnClick + TabOrder = 0 + end + object CancelBtn: TButton + Left = 159 + Height = 25 + Top = 148 + Width = 75 + Cancel = True + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 1 + end + object MoDirections: TMemo + Left = 16 + Height = 82 + Top = 16 + Width = 281 + BorderStyle = bsNone + Color = clScrollBar + Font.Color = clBlack + Font.Height = -12 + Font.Name = 'Arial' + Lines.Strings = ( + 'Choose which items to reload from the parameter ' + 'file. Changes to parameters or state variables ' + 'which haven''t been saved will be lost when you ' + 'reload.' + ) + ParentFont = False + ReadOnly = True + TabOrder = 2 + end + object CbParams: TCheckBox + Left = 40 + Height = 18 + Top = 108 + Width = 73 + Caption = 'Parameters' + TabOrder = 3 + end + object CbState: TCheckBox + Left = 168 + Height = 18 + Top = 108 + Width = 92 + Caption = 'State Variables' + Checked = True + State = cbChecked + TabOrder = 4 + end +end diff --git a/modelshell/ReloadDlg.pas b/modelshell/ReloadDlg.pas new file mode 100644 index 0000000..4d478fc --- /dev/null +++ b/modelshell/ReloadDlg.pas @@ -0,0 +1,57 @@ +{ A modal dialog box to select what to read from the parameter file; state + variables, parameters or both. } +unit ReloadDlg; + +interface + +uses SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, + Buttons, ExtCtrls, Dialogs; + +type + TDlgReload = class(TForm) + OKBtn: TButton; + CancelBtn: TButton; + Bevel1: TBevel; + MoDirections: TMemo; + CbParams: TCheckBox; + CbState: TCheckBox; + procedure OKBtnClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + DlgReload: TDlgReload; + +implementation + +uses stypes, fileio, frontend; + +{$R *.lfm} + +// Reload the selected items from the parameter file +procedure TDlgReload.OKBtnClick(Sender: TObject); +var + temppar: paramarray; + tempstat: statearray; +begin + tempstat := stat; // to get names and units into the temporary array + temppar := par; // to get names and units into the temporary array + // Read data from the parameter file and store in the temporary arrays + ReadParamFile(paramfilename, modeldef.numparam, temppar, modeldef.numstate, + tempstat, FmShellMain.currentresid); + // Copy values read from the file into the global variables only if checkbox checked + if CbParams.Checked and CbState.Checked then + begin + stat := tempstat; + par := temppar; + end + else if CbParams.Checked then + par := temppar + else if CbState.Checked then + stat := tempstat; +end; + +end. diff --git a/modelshell/ScaleDlg.lfm b/modelshell/ScaleDlg.lfm new file mode 100644 index 0000000..3e21f9a --- /dev/null +++ b/modelshell/ScaleDlg.lfm @@ -0,0 +1,150 @@ +object DlgScale: TDlgScale + Left = 366 + Height = 223 + Top = 184 + Width = 313 + BorderStyle = bsDialog + Caption = 'Axis Parameters' + ClientHeight = 223 + ClientWidth = 313 + Color = clBtnFace + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + OnShow = FormShow + Position = poOwnerFormCenter + LCLVersion = '0.9.30.2' + object Bevel1: TBevel + Left = 8 + Height = 176 + Top = 8 + Width = 297 + Shape = bsFrame + end + object LblMin: TLabel + Left = 24 + Height = 15 + Top = 106 + Width = 41 + Caption = '&Minimum' + FocusControl = EdMinValue + ParentColor = False + end + object LblMax: TLabel + Left = 24 + Height = 15 + Top = 138 + Width = 45 + Caption = 'Ma&ximum' + FocusControl = EdMaxValue + ParentColor = False + end + object LblScale: TLabel + Left = 120 + Height = 14 + Top = 78 + Width = 65 + Alignment = taCenter + AutoSize = False + Caption = 'Scale' + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + ParentColor = False + ParentFont = False + end + object LblIncrem: TLabel + Left = 159 + Height = 15 + Top = 106 + Width = 48 + Caption = '&Increment' + FocusControl = EdIncrem + ParentColor = False + Visible = False + end + object OKBtn: TButton + Left = 79 + Height = 25 + Top = 190 + Width = 75 + Caption = '&OK' + Default = True + ModalResult = 1 + OnClick = OKBtnClick + TabOrder = 0 + end + object CancelBtn: TButton + Left = 159 + Height = 25 + Top = 190 + Width = 75 + Cancel = True + Caption = '&Cancel' + ModalResult = 2 + TabOrder = 1 + end + object EdMinValue: TEdit + Left = 80 + Height = 22 + Top = 104 + Width = 57 + OnExit = EditExit + TabOrder = 2 + end + object EdMaxValue: TEdit + Left = 80 + Height = 22 + Top = 136 + Width = 57 + OnExit = EditExit + TabOrder = 3 + end + object RGAxisType: TRadioGroup + Left = 24 + Height = 40 + Top = 16 + Width = 265 + AutoFill = True + Caption = 'Axis Type' + ChildSizing.LeftRightSpacing = 6 + ChildSizing.TopBottomSpacing = 6 + ChildSizing.EnlargeHorizontal = crsHomogenousChildResize + ChildSizing.EnlargeVertical = crsHomogenousChildResize + ChildSizing.ShrinkHorizontal = crsScaleChilds + ChildSizing.ShrinkVertical = crsScaleChilds + ChildSizing.Layout = cclLeftToRightThenTopToBottom + ChildSizing.ControlsPerLine = 2 + ClientHeight = 22 + ClientWidth = 261 + Columns = 2 + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + ItemIndex = 0 + Items.Strings = ( + 'Li&near' + 'Lo&garithmic' + ) + ParentFont = False + TabOrder = 4 + Visible = False + end + object EdIncrem: TEdit + Left = 224 + Height = 22 + Top = 104 + Width = 65 + OnExit = EditExit + TabOrder = 5 + Visible = False + end + object CBAuto: TCheckBox + Left = 159 + Height = 18 + Top = 132 + Width = 71 + Caption = '&Auto Scale' + TabOrder = 6 + end +end diff --git a/modelshell/ScaleDlg.pas b/modelshell/ScaleDlg.pas new file mode 100644 index 0000000..7c60ce4 --- /dev/null +++ b/modelshell/ScaleDlg.pas @@ -0,0 +1,132 @@ +{ A modal dialog box to modify the axis scales on the chart in the display.pas + file. The dialog box contains edit boxes for the axis minimum, maximum, and + increment; a radio group box to choose linear or logarithmic axis; and a + checkbox to enable/disable autoscaling. Any changes made to the edit boxes + automatically disable autoscaling. } +unit ScaleDlg; + +interface + +uses SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, + Buttons, ExtCtrls, stypes; + +type + TDlgScale = class(TForm) + OKBtn: TButton; + CancelBtn: TButton; + Bevel1: TBevel; + LblMin: TLabel; + LblMax: TLabel; + EdMinValue: TEdit; + EdMaxValue: TEdit; + LblScale: TLabel; + RGAxisType: TRadioGroup; + LblIncrem: TLabel; + EdIncrem: TEdit; + CBAuto: TCheckBox; + procedure OKBtnClick(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure EditExit(Sender:TObject); + private + { Private declarations } + public + { Public declarations } + BottomMinValue, BottomMaxValue, BottomIncrem:double; + LeftMinValue, LeftMaxValue, LeftIncrem:double; + end; + +var + DlgScale: TDlgScale; + +implementation + +uses display, dialogs; { TODO 2 -obk : remove dialogs from uses clause once chart is working } + +{$R *.lfm} + +{ Before showing the form set the Dialog box title and default values for all + objects. These values are dependent on which axis is the current axis in the + chart. } +procedure TDlgScale.FormShow(Sender: TObject); +begin + if FmDisplayOutput.CurrentAxis = axBottom then // Independent Axis + begin + DlgScale.Caption := 'Independent Axis'; + if FmDisplayOutput.ChBAxisLogarithm.Enabled then + RGAxisType.ItemIndex := 1 // Check logarithmic radio button + else + RGAxisType.ItemIndex := 0; // Check linear radio button + CBAuto.Checked := not FmDisplayOutput.ChOutput.Extent.UseXMin; + EdMinValue.text := floattostr(FmDisplayOutput.ChOutput.Extent.XMin); + EdMaxValue.text := floattostr(FmDisplayOutput.ChOutput.Extent.XMax); + end + else // CurrentAxis = axLeft Dependent Axis + begin + DlgScale.Caption := 'Dependent Axis' ; + if FmDisplayOutput.ChLAxisLogarithm.Enabled then + RGAxisType.ItemIndex := 1 // Check logarithmic radio button + else + RGAxisType.ItemIndex := 0; // Check linear radio button + CBAuto.Checked := not FmDisplayOutput.ChOutput.Extent.UseYMin; + EdMinValue.text := floattostr(FmDisplayOutput.ChOutput.Extent.YMin); + EdMaxValue.text := floattostr(FmDisplayOutput.ChOutput.Extent.YMax); + end; +end; + +// Implement any changes made in this dialog +procedure TDlgScale.OKBtnClick(Sender: TObject); +begin + { Changing the axis type won't work until the bug in TaChart that causes an access + violation when setting the axis for the lineseries is fixed. Sept 22, 2011 BK} +// Set the axis type + if RgAxisType.itemindex = 0 then // Linear axis + if FmDisplayOutput.CurrentAxis = axBottom then + FmDisplayOutput.ChBAxisLogarithm.Enabled:=false + else + FmDisplayOutput.ChLAxisLogarithm.Enabled:=false + else // Logarithmic axis + if FmDisplayOutput.CurrentAxis = axBottom then + FmDisplayOutput.ChBAxisLogarithm.Enabled:=true + else + FmDisplayOutput.ChLAxisLogarithm.Enabled:=true; + +//Set the minimum and maximum axis values + if CbAuto.checked then // Autoscale + begin + if FmDisplayOutput.CurrentAxis=axBottom then + begin + FmDisplayOutput.ChOutput.Extent.UseXMin := False; + FmDisplayOutput.ChOutput.Extent.UseXMax := False; + end + else // Left Axis + begin + FmDisplayOutput.ChOutput.Extent.UseYMin := False; + FmDisplayOutput.ChOutput.Extent.UseYMax := False; + end; + end + else // Manual axis scale + begin + if FmDisplayOutput.CurrentAxis=axBottom then + begin + FmDisplayOutput.ChOutput.Extent.UseXMin := True; + FmDisplayOutput.ChOutput.Extent.XMin := strtofloat(EdMinValue.Text); + FmDisplayOutput.ChOutput.Extent.UseXMax := True; + FmDisplayOutput.ChOutput.Extent.XMax := strtofloat(EdMaxValue.Text); + end + else // Left Axis + begin + FmDisplayOutput.ChOutput.Extent.UseYMin := True; + FmDisplayOutput.ChOutput.Extent.YMin := strtofloat(EdMinValue.Text); + FmDisplayOutput.ChOutput.Extent.UseYMax := True; + FmDisplayOutput.ChOutput.Extent.YMax := strtofloat(EdMaxValue.Text); + end; + end +end; + +procedure TDlgScale.EditExit(Sender:TObject); +begin + if (Sender as TEdit).modified = true then + CBAuto.Checked := false; +end; + +end. diff --git a/modelshell/SeriesForm.lfm b/modelshell/SeriesForm.lfm new file mode 100644 index 0000000..a52b279 --- /dev/null +++ b/modelshell/SeriesForm.lfm @@ -0,0 +1,82 @@ +object FmSeries: TFmSeries + Left = 361 + Top = 286 + Caption = 'Dialog' + ClientHeight = 263 + ClientWidth = 385 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [] + Position = poOwnerFormCenter + OnResize = FormResize + OnShow = FormShow + PixelsPerInch = 96 + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 385 + Height = 226 + Align = alClient + TabOrder = 0 + object LbxChooseSeries: TListBox + Left = 0 + Top = 0 + Width = 383 + Height = 224 + Align = alClient + Columns = 3 + ExtendedSelect = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Arial' + Font.Style = [] + ItemHeight = 16 + MultiSelect = True + ParentFont = False + Sorted = True + TabOrder = 0 + end + end + object Panel2: TPanel + Left = 0 + Top = 226 + Width = 385 + Height = 37 + Align = alBottom + TabOrder = 1 + object OKBtn: TButton + Left = 191 + Top = 2 + Width = 75 + Height = 24 + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 0 + OnClick = OKBtnClick + end + object CancelBtn: TButton + Left = 276 + Top = 2 + Width = 75 + Height = 24 + Cancel = True + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 1 + end + object BtnClearSelection: TButton + Left = 20 + Top = 2 + Width = 104 + Height = 24 + Caption = 'Clear &Selection' + TabOrder = 2 + OnClick = BtnClearSelectionClick + end + end +end diff --git a/modelshell/SeriesForm.pas b/modelshell/SeriesForm.pas new file mode 100644 index 0000000..91e3b8c --- /dev/null +++ b/modelshell/SeriesForm.pas @@ -0,0 +1,104 @@ +{ This form is a dialog which contains a listbox. The listbox is used to hold + the list of all variables in the model. The user chooses items from the + to be shown in the chart on the Display form. } +unit SeriesForm; + +interface + +uses SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, + Buttons, ExtCtrls, Dialogs, stypes; + +type + TFmSeries = class(TForm) + Panel1: TPanel; + LbxChooseSeries: TListBox; + Panel2: TPanel; + OKBtn: TButton; + CancelBtn: TButton; + BtnClearSelection: TButton; + procedure FormShow(Sender: TObject); + procedure OKBtnClick(Sender: TObject); + procedure BtnClearSelectionClick(Sender: TObject); + procedure FormResize(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + FmSeries: TFmSeries; + +implementation + +{$R *.lfm} + +uses display; + +{ Depending on whether the user is choosing items for the x or y axis disable or + enable multiple selections accordingly. } +procedure TFmSeries.FormShow(Sender: TObject); +var + i, seriesindex:integer; + seriesname:string; +begin + FmDisplayOutput.FillListBox(FmSeries.LbxChooseSeries); + if FmDisplayOutput.CurrentAxis = axBottom then // Choosing Independent Axis + begin + // Set the form caption including instructions + FmSeries.Caption := 'Independent Axis - Choose one series.'; + // Can only choose one series for independent axis, disable multiselect + LbxChooseSeries.MultiSelect := False; + BtnClearSelection.Enabled := False; + BtnClearSelection.Visible := False; + seriesname := FmDisplayOutput.xAxis; + seriesindex := LbxChooseSeries.Items.Indexof(seriesname); + LbxChooseSeries.ItemIndex := seriesindex; + end + else // Dependent Axis + begin + // Set the form caption including instructions + FmSeries.Caption := 'Dependent Axis - Choose a maximum of 10 series.'; + // Can choose up to 10 series for the dependent axis, enable multiselect + LbxChooseSeries.MultiSelect := True; + BtnClearSelection.Enabled := True; + BtnClearSelection.Visible := True; + for i := 0 to LbxChooseSeries.Items.Count - 1 do + LbxChooseSeries.Selected[i] := FmDisplayOutput.LbxSeriesSelect.Selected[i]; + end; +end; + +{} +procedure TFmSeries.OKBtnClick(Sender: TObject); +var + i:integer; +begin + if FmDisplayOutput.CurrentAxis = axBottom then // Set the Independent Axis + begin + // Loop over the items in the list + for i := 0 to LbxChooseSeries.Items.Count - 1 do + if LbxChooseSeries.Selected[i] then + FmDisplayOutput.xAxis := LbxChooseSeries.Items[i]; + end + else // Set the Dependent Axes. CurrentAxis = axLeft + begin + for i := 0 to LbxChooseSeries.Items.Count - 1 do + FmDisplayOutput.LbxSeriesSelect.Selected[i]:=LbxChooseSeries.Selected[i]; + end; +end; + +procedure TFmSeries.BtnClearSelectionClick(Sender: TObject); +begin + FmDisplayOutput.ClearSeriestoPlot(FmSeries.LbxChooseSeries);; +end; + +procedure TFmSeries.FormResize(Sender: TObject); +var + numcol:integer; +begin + numcol := round(LbxChooseSeries.ClientWidth/(8*stringlength)); // assumes 8 units per character + if numcol < 1 then numcol := 1; + LbxChooseSeries.Columns:=round(numcol); +end; + +end. diff --git a/modelshell/aboutbox.lfm b/modelshell/aboutbox.lfm new file mode 100644 index 0000000..ed11425 --- /dev/null +++ b/modelshell/aboutbox.lfm @@ -0,0 +1,228 @@ +object FmAbout: TFmAbout + Left = 369 + Height = 472 + Top = 134 + Width = 756 + ActiveControl = BtnOK + BorderStyle = bsDialog + ClientHeight = 472 + ClientWidth = 756 + Color = clBtnFace + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Position = poMainFormCenter + LCLVersion = '0.9.30.2' + object BtnOK: TButton + Left = 345 + Height = 20 + Top = 402 + Width = 60 + Cancel = True + Caption = '&OK' + Default = True + ModalResult = 1 + TabOrder = 0 + end + object Panel3: TPanel + Left = 0 + Height = 385 + Top = 0 + Width = 756 + Align = alTop + ClientHeight = 385 + ClientWidth = 756 + TabOrder = 1 + object Panel1: TPanel + Left = 380 + Height = 383 + Top = 0 + Width = 373 + Align = alRight + ClientHeight = 383 + ClientWidth = 373 + TabOrder = 0 + object LblVersion: TLabel + Left = 61 + Height = 19 + Top = 87 + Width = 89 + Alignment = taCenter + Caption = 'Version 1.0.0' + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'Arial' + ParentColor = False + ParentFont = False + end + object LblModel: TLabel + Left = 61 + Height = 19 + Top = 67 + Width = 55 + Alignment = taCenter + Caption = 'A Model' + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'Arial' + ParentColor = False + ParentFont = False + end + object Label5: TLabel + Left = 106 + Height = 23 + Top = 12 + Width = 121 + Caption = 'Current Model' + Font.Color = clWindowText + Font.Height = -19 + Font.Name = 'Arial' + ParentColor = False + ParentFont = False + end + object MoContact: TMemo + Left = 62 + Height = 70 + Top = 119 + Width = 182 + BorderStyle = bsNone + Color = clBtnFace + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Arial' + Lines.Strings = ( + 'For more information contact:' + ) + ParentFont = False + ReadOnly = True + TabOrder = 0 + end + object Memo1: TMemo + Left = 0 + Height = 158 + Top = 222 + Width = 371 + Align = alBottom + BorderStyle = bsNone + Color = clBtnFace + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Arial' + Lines.Strings = ( + 'Enter any additional information about your model here.' + ) + ParentFont = False + ReadOnly = True + TabOrder = 1 + Visible = False + end + end + object Panel2: TPanel + Left = 0 + Height = 383 + Top = 0 + Width = 373 + Align = alLeft + ClientHeight = 383 + ClientWidth = 373 + TabOrder = 1 + object Label1: TLabel + Left = 61 + Height = 19 + Top = 87 + Width = 89 + Alignment = taCenter + Caption = 'Version 6.5.4' + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'Arial' + ParentColor = False + ParentFont = False + end + object Label2: TLabel + Left = 61 + Height = 19 + Top = 48 + Width = 191 + Alignment = taCenter + Caption = 'Marine Biological Laboratory' + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'Arial' + ParentColor = False + ParentFont = False + end + object Label3: TLabel + Left = 61 + Height = 19 + Top = 67 + Width = 149 + Alignment = taCenter + Caption = 'Modelshell Application' + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'Arial' + ParentColor = False + ParentFont = False + end + object Label4: TLabel + Left = 101 + Height = 23 + Top = 12 + Width = 100 + Caption = 'Model Shell' + Font.Color = clWindowText + Font.Height = -19 + Font.Name = 'Arial' + ParentColor = False + ParentFont = False + end + object Memo2: TMemo + Left = 62 + Height = 94 + Top = 119 + Width = 239 + BorderStyle = bsNone + Color = clBtnFace + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Arial' + Lines.Strings = ( + 'For more information contact:' + 'Ed Rastetter or Bonnie Kwiatkowski' + 'Ecosystems Center - MBL' + '7 MBL St.' + 'Woods Hole, MA 02543' + ) + ParentFont = False + ReadOnly = True + TabOrder = 0 + end + object Memo3: TMemo + Left = 0 + Height = 158 + Top = 222 + Width = 371 + Align = alBottom + BorderStyle = bsNone + Color = clBtnFace + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Arial' + Lines.Strings = ( + 'This material is based upon work supported by the National ' + 'Science Foundation under grants #OPP-9318529 and ' + 'OPP-9732281, and the Environmental Protection Agency ' + 'under grants RFQ-RT-00-00107 and QT-RT-00-001667. Any ' + 'opinions, findings, conclusions, or recommendations expressed ' + 'in the material are those of the author(s) and do not necessarily ' + 'reflect the views of the National Science Foundation or the ' + 'Environmental Protection Agency.' + ) + ParentFont = False + ReadOnly = True + TabOrder = 1 + end + end + end +end diff --git a/modelshell/aboutbox.pas b/modelshell/aboutbox.pas new file mode 100644 index 0000000..6ddca5f --- /dev/null +++ b/modelshell/aboutbox.pas @@ -0,0 +1,46 @@ +{ This form displays a typical About Box. It contains the model name, version + number and contact information. } +unit aboutbox; + +interface + +uses + SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; + +type + + { TFmAbout } + + TFmAbout = class(TForm) + BtnOK: TButton; + Panel3: TPanel; + Panel1: TPanel; + LblVersion: TLabel; + LblModel: TLabel; + MoContact: TMemo; + Memo1: TMemo; + Panel2: TPanel; + Label1: TLabel; + Label2: TLabel; + Label3: TLabel; + Memo2: TMemo; + Memo3: TMemo; + Label4: TLabel; + Label5: TLabel; + private + { Private declarations } + public + { Public declarations } + end; + +var + FmAbout: TFmAbout; + +implementation + +{$R *.lfm} + +{ TFmAbout } + + +end. diff --git a/modelshell/batchmain.lfm b/modelshell/batchmain.lfm new file mode 100644 index 0000000..f925c9d --- /dev/null +++ b/modelshell/batchmain.lfm @@ -0,0 +1,106 @@ +object FmBatchMain: TFmBatchMain + Left = 262 + Height = 294 + Top = 174 + Width = 558 + Caption = 'Modelshell Batch Mode Utility' + ClientHeight = 294 + ClientWidth = 558 + Color = clBtnFace + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + OnCreate = FormCreate + OnShow = FormShow + LCLVersion = '2.0.6.0' + object LblBatchFile: TLabel + Left = 48 + Height = 13 + Top = 168 + Width = 73 + Caption = '&Batch file name' + FocusControl = EdBatchFile + ParentColor = False + OnClick = LblBatchFileClick + end + object LblNumSpecies: TLabel + Left = 48 + Height = 13 + Top = 232 + Width = 90 + Caption = '&Number of Species' + FocusControl = EdNumSpecies + ParentColor = False + Visible = False + OnClick = LblBatchFileClick + end + object EdBatchFile: TEdit + Left = 48 + Height = 21 + Top = 192 + Width = 361 + OnExit = ChooseBatchFile + TabOrder = 0 + end + object MmDescription: TMemo + Left = 8 + Height = 145 + Top = 8 + Width = 545 + Color = clScrollBar + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'MS Sans Serif' + Lines.Strings = ( + 'This Utility runs modelshell in batch mode. Batch mode allows the user to run multiple simulations without user ' + 'intervention.' + '' + 'Enter the batch file name below, specifing the full path to the file. The batch file is a comma delimited ASCII file. ' + 'The first row of the batch file is used for variable headings and is ignored. The parameter and driver files must be ' + 'located in the same directory as the batch file. The output files will be created in the same directory as the batch ' + 'file. Do not specify the full path names in the batch file. ' + '' + 'CAUTION: Any existing output files in the output directory will be overwritten without warning!' + ) + ParentFont = False + ReadOnly = True + TabOrder = 1 + end + object BtnRunBatch: TButton + Left = 224 + Height = 25 + Top = 248 + Width = 97 + Caption = '&Run Batch Job' + Enabled = False + OnClick = BtnRunBatchClick + TabOrder = 2 + end + object BtnCancelBatch: TButton + Left = 336 + Height = 25 + Top = 248 + Width = 75 + Cancel = True + Caption = '&Close' + OnClick = BtnCancelBatchClick + TabOrder = 3 + end + object EdNumSpecies: TEdit + Left = 48 + Height = 21 + Top = 248 + Width = 41 + OnChange = EdNumSpeciesChange + TabOrder = 4 + Visible = False + end + object DlgOpenBatch: TOpenDialog + Title = 'Choose Batch File' + DefaultExt = '.bch' + Filter = 'Comma Delimited Files|*.csv|Batch File (*.bch)|*.bch|All Files|*.*' + Options = [ofHideReadOnly, ofPathMustExist, ofFileMustExist] + left = 496 + top = 176 + end +end diff --git a/modelshell/batchmain.pas b/modelshell/batchmain.pas new file mode 100644 index 0000000..c6646a3 --- /dev/null +++ b/modelshell/batchmain.pas @@ -0,0 +1,698 @@ +unit batchmain; + +interface + +uses + LCLIntf, LCLType, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, fileutil, Lazfileutils, strutils,stypes; + +const + numlayers = 4; + DefaultUnixDirectory = '/user/share/CrEquations'; + BundleResourceDirectory = '/Contents/Resources/'; + +type + + { TFmBatchMain } + + TFmBatchMain = class(TForm) + LblBatchFile: TLabel; + EdBatchFile: TEdit; + MmDescription: TMemo; + BtnRunBatch: TButton; + BtnCancelBatch: TButton; + DlgOpenBatch: TOpenDialog; + EdNumSpecies: TEdit; + LblNumSpecies: TLabel; + procedure LblBatchFileClick(Sender: TObject); + procedure ChooseBatchFile(Sender: TObject); + procedure BtnRunBatchClick(Sender: TObject); + procedure BtnCancelBatchClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure EdNumSpeciesChange(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure CreateNextDriver(ofilename, dfilename: string); + procedure CreateNextDriver4L(ofilename, dfilename: string); + function GetResourcePath(): string; + procedure RunSpinup(pfile, dfile, ofile:string); + private + { Private declarations } + fregrowopt:TRunOptions; + public + { Public declarations } + BatchFilename: string; + Defpath: string; + + end; + +var + FmBatchMain: TFmBatchMain; + +implementation + +{$R *.lfm} + +uses frontend, fileio, Options, calculate, Display; + +procedure TFmBatchMain.LblBatchFileClick(Sender: TObject); +begin + ChooseBatchFile(Sender); + if not (batchfilename = '') then + FmBatchMain.ActiveControl := BtnRunBatch; +end; + +procedure TFmBatchMain.ChooseBatchFile(Sender: TObject); +var + ThisEdit: TEdit; +begin + DlgOpenBatch.InitialDir:=DefPath; +// If the user typed directly in the edit box + if Sender is TEdit then + begin + ThisEdit := Sender as TEdit; + BatchFilename:=ThisEdit.text // Set the batch file + end + else // User clicked on the label + begin // Show the open file dialog + ThisEdit := ((Sender as TLabel).Focuscontrol as TEdit); + // First set the default filename to the current file + DlgOpenBatch.filename := BatchFilename; + // Show the dialog and if the user clicks OK, set the new filename + if DlgOpenBatch.execute then + begin + BatchFilename := DlgOpenBatch.filename; + ThisEdit.text := Batchfilename; + end; + end; + + if (BatchFilename <> '') then + if ((sender as Tcomponent).name <> 'LblBatchFilec') or + ((sender as Tcomponent).name <> 'EdBatchFilec') then + BtnRunBatch.Enabled := True; + DefPath := ExtractFilePath(batchfilename); + LazFileUtils.SetCurrentDirUTF8(ExtractFilePath(batchfilename)); +end; + +procedure TFmBatchMain.BtnRunBatchClick(Sender: TObject); +var + LogFilename, parname, lastsec:string; + temp: double; + RunCrashed:Boolean; + dotpos,Caidx, Tidx, T35Idx, Pptidx: integer; +begin + FmShellMain.RunningInteractive := False; + BtnRunBatch.Enabled := False; + BtnCancelBatch.Enabled := False; + RunCrashed := False; + LogFilename := ChangeFileExt(BatchFilename,'.log'); +// ChangeExtension(LogFilename,'log'); + OpenLogFile(LogFilename, BatchFilename); + OpenBatchFile(BatchFilename); + try + ReadBatchFile(paramfilename,driverfilename,outfilename,time_start,time_stop, + stat,FmOptions.RunOptions); + if (Application.Title = 'sensitivity') and (paramfilename <> 'senstest.par') + then raise Exception.Create('Invalid parameter file for sensitivity test.'); + repeat + try + ReadParamFile(paramfilename, ModelDef.numparam,par, ModelDef.numstate,stat,temp); + + // MEL Multisite Code, create subsequent parameter files and spin up efforts for regrow simulations + parname:=ExtractFileNameOnly(paramfilename); + dotpos:=rpos('.',parname); + lastsec:=copy(parname,dotpos+1,5); + if lastsec='SS' then + begin + // Create climate driver files + //CO2 + Caidx:=FmCalculate.GetArrayIndex(vtParameter, 'FlagCa'); + Tidx:=FmCalculate.GetArrayIndex(vtParameter, 'FlagT'); + T35idx:=FmCalculate.GetArrayIndex(vtParameter,'FlagT35'); + Pptidx:=FmCalculate.GetArrayIndex(vtParameter, 'FlagPpt'); + + par[Tidx].value:=0; + par[T35idx].value:=0; + par[Pptidx].value:=0; + par[Caidx].value:=1; + WriteParamFile(parname+'.Ca.par',ModelDef.numparam,par,ModelDef.numstate,stat,FmShellMain.Currentresid); + + //T + par[Tidx].value:=1; + par[T35idx].value:=1; + par[Pptidx].value:=0; + par[Caidx].value:=0; + WriteParamFile(parname+'.T.par',ModelDef.numparam,par,ModelDef.numstate,stat,FmShellMain.Currentresid); + + //Ppti + par[Pptidx].value:=1; + par[Tidx].value:=0; + par[T35idx].value:=0; + par[Caidx].value:=0; + WriteParamFile(parname+'.Ppti.par',ModelDef.numparam,par,ModelDef.numstate,stat,FmShellMain.Currentresid); + + //Pptd + par[Pptidx].value:=-1; + par[Tidx].value:=0; + par[T35idx].value:=0; + par[Caidx].value:=0; + WriteParamFile(parname+'.Pptd.par',ModelDef.numparam,par,ModelDef.numstate,stat,FmShellMain.Currentresid); + + //PptiT + par[Caidx].value:=0; + par[Tidx].value:=1; + par[T35idx].value:=1; + par[Pptidx].value:=1; + WriteParamFile(parname+'.PptiT.par',ModelDef.numparam,par,ModelDef.numstate,stat,FmShellMain.Currentresid); + + //PptdT + par[Caidx].value:=0; + par[Tidx].value:=1; + par[T35idx].value:=1; + par[Pptidx].value:=-1; + WriteParamFile(parname+'.PptdT.par',ModelDef.numparam,par,ModelDef.numstate,stat,FmShellMain.Currentresid); + + //CaT + par[Caidx].value:=1; + par[Tidx].value:=1; + par[T35idx].value:=1; + par[Pptidx].value:=0; + WriteParamFile(parname+'.CaT.par',ModelDef.numparam,par,ModelDef.numstate,stat,FmShellMain.Currentresid); + + //CaPpti + par[Caidx].value:=1; + par[Tidx].value:=0; + par[T35idx].value:=0; + par[Pptidx].value:=1; + WriteParamFile(parname+'.CaPpti.par',ModelDef.numparam,par,ModelDef.numstate,stat,FmShellMain.Currentresid); + + //CaPptd + par[Caidx].value:=1; + par[Tidx].value:=0; + par[T35idx].value:=0; + par[Pptidx].value:=-1; + WriteParamFile(parname+'.CaPptd.par',ModelDef.numparam,par,ModelDef.numstate,stat,FmShellMain.Currentresid); + + //Calli + par[Caidx].value:=1; + par[Tidx].value:=1; + par[T35idx].value:=1; + par[Pptidx].value:=1; + WriteParamFile(parname+'.Calli.par',ModelDef.numparam,par,ModelDef.numstate,stat,FmShellMain.Currentresid); + + //Calld + par[Caidx].value:=1; + par[Tidx].value:=1; + par[T35idx].value:=1; + par[Pptidx].value:=-1; + WriteParamFile(parname+'.Calld.par',ModelDef.numparam,par,ModelDef.numstate,stat,FmShellMain.Currentresid); +end; + + // Spin up efforts for regrow simulations and save par file for actual regrow run + if AnsiContainsStr(lowercase(parname),'spinup regrow') and stat[1].Reset then + begin + RunSpinup(paramfilename,driverfilename,outfilename); + end + else + begin + FmShellMain.BtnRunClick(Sender); + end; + + WriteLogFile(LogFilename,outfilename,'Run Complete - '+ DateTimeToStr(Now)); + // single layer version + /// CreateNextDriver(outfilename, driverfilename); + // 4 layer version + // CreateNextDriver4L(outfilename, driverfilename); + except + on E: Exception do + begin + WriteLogFile(LogFilename, outfilename, E.Message + ' - ' + + DateTimeToStr(Now)); + if not (Application.Title = 'modelbatch') then RunCrashed := True; + end; + end; + until (ReadBatchFile(paramfilename,driverfilename,outfilename, + time_start,time_stop,stat,FmOptions.RunOptions) = False) or + (RunCrashed); + WriteLogFile(LogFilename,batchfilename,'Batch Job Complete.'); + finally + CloseBatchFile; + CloseLogFile; + BtnRunBatch.Enabled := True; + BtnCancelBatch.Enabled := True; + FmBatchMain.ActiveControl := BtnRunBatch; + if RunCrashed then Abort{raise Exception.Create('Error in batch program')}; + end; +end; + +procedure TFmBatchMain.BtnCancelBatchClick(Sender: TObject); +begin + FmBatchMain.Close; +end; + +procedure TFmBatchMain.FormCreate(Sender: TObject); +begin + SetCurrentDirUTF8(GetResourcePath()); + DefPath:=GetResourcePath(); + FmBatchMain.ActiveControl := EdBatchFile; + with fregrowOpt do + begin + NormalRun:=false; + Time_step:=1; + DiscreteStep:=1; + RepeatDrivers:=true; + RepeatDriveTime:=365; + ResetStates:=true; + ResetStateTime:=365; + RuntoSS:=false; + SSCriteria:=0; + SSTime:=0; + HoldStatesConstant:=false; // Used in fuzzy calibrator + Outputstep:=365; // The timestep specified by the user for output + Outputoffset:=0; // No output for time less than outputoffset + OutputEORonly:=false; // output only if time = stop_time + Time_step + OutputAnnually:=false; + OutputAnnuallyDay:=0; + AppendOutputFile:=false; + stepcounter := 1; + outcounter := 0; + WriteEvery := 0; + ErrorMult := 1; + OutputFile:=false; + end; +end; + +procedure TFmBatchMain.EdNumSpeciesChange(Sender: TObject); +begin + FmShellMain.SetNumSpecies(FmBatchMain.EdNumSpecies); +end; + +procedure TFmBatchMain.FormShow(Sender: TObject); +begin + if not (pos('MEL',ModelDef.modelname) > 0) then + begin + LblNumSpecies.Visible := False; + LblNumSpecies.Enabled := False; + EdNumSpecies.Visible := False; + EdNumSpecies.Enabled := False; + end; +end; + +procedure TFmBatchMain.CreateNextDriver(ofilename, dfilename: string); +var + catchnum, sgrownum, colLnh4d, colLno3d, colLdocd, colLdond, numRnh4u, numRno3u: integer; + numRdonu, numRdocu, numWr, numDrd, numDrc, num, j:integer; + tempstring, tempstring2, filename, basedrivename: string; + Wrfile, Drdfile, Drcfile, Drlfile, oldDrive, newDrive: textfile; + tempdrive: drivearray; + temptime: double; + +function GetColumnNumber(name:string):integer; +var + i,colnum:integer; + tempstring:string; +begin + i := 1; + colnum := 0; + repeat + tempstring := FmDisplayOutput.SgModelOutput.Cells[i,1]; + tempstring := trim(tempstring); + if tempstring = name then colnum := i; + i := i + 1; + until (colnum <> 0) or (i > FmDisplayOutput.SgModelOutput.Colcount - 1); + result := colnum; +end; + +begin + // Set up names and units of drive array + tempdrive := drive; + + // Get catchment number + tempstring := trim(ofilename); + num := pos('cell',tempstring); + delete(tempstring,1,num+3); + catchnum := strtoint(tempstring[1]) + 1; // Add 1 because calculating drivers for NEXT catchment + + // Get base driver filename + basedrivename := dfilename; + num := pos('cell',basedrivename); + delete(basedrivename,num+4,length(basedrivename)); + + // Read in outputfile for this catchment, get column numbers for N fluxes to downslope catchment + // Note that I've assumed that the output file has output at the same time points as the driver!! + // FIX + sgrownum := 3; // 1 row for column numbers, 1 for names and 1 for units, 0 based + colLnh4d := GetColumnNumber('N NH4 loss downslope'); + colLno3d := GetColumnNumber('N NO3 loss downslope'); + colLdocd := GetColumnNumber('C DOC loss downslope'); + colLdond := GetColumnNumber('N DON loss downslope'); + + // Get array index of drivers that will be changed + numWr := FmCalculate.GetArrayIndex(vtdriver, 'Wr'); + numDrd := FmCalculate.GetArrayIndex(vtdriver, 'Drd'); + numDrc := FmCalculate.GetArrayIndex(vtdriver, 'Drc'); + numRnh4u := FmCalculate.GetArrayIndex(vtdriver, 'Rnh4u'); + numRno3u := FmCalculate.GetArrayIndex(vtdriver, 'Rno3u'); + numRdocu := FmCalculate.GetArrayIndex(vtdriver, 'Rdocu'); + numRdonu := FmCalculate.GetArrayIndex(vtdriver, 'Rdonu'); + + if (catchnum > 2) and (catchnum < 7) then + try + // Open Wr file + filename := 'soil mois.xs' + inttostr(catchnum) + '1.dat'; + assignfile(Wrfile, filename); + reset(Wrfile); + + // Open Drd file + if catchnum < 5 then + begin + filename := 'lateral.xq' + inttostr(catchnum) + '1.dat'; + assignfile(Drdfile, filename); + reset(Drdfile); + end; + + // Open Drc file + filename := 'lateral.xqc' + inttostr(catchnum) + '1.dat'; + assignfile(Drcfile, filename); + reset(Drcfile); + + // Open Drl file, in this version the drainage is added to the lateral flow + filename := 'drainage.xg' + inttostr(catchnum) + '1.dat'; + assignfile(Drlfile, filename); + reset(Drlfile); + + // Open original driver file to get Temp, CO2, etc + filename := dfilename; + assignfile(OldDrive, filename); + reset(OldDrive); + + // Create new driver file + filename := basedrivename + inttostr(catchnum) + '.drr'; + assignfile(newDrive, filename); + rewrite(newDrive); + + // Copy names and units from olddriver to the new driver + readln(oldDrive, tempstring); + writeln(NewDrive, tempstring); + readln(oldDrive, tempstring); + writeln(NewDrive, tempstring); + + // Advance all hydrology files to 1 Jan 1999 + for j := 1 to 1029 do + begin + if catchnum < 5 then readln(Drdfile, tempstring); + readln(Drcfile, tempstring); + readln(Drlfile, tempstring); + readln(Wrfile, tempstring); + end; + + while not eof(OldDrive) do + begin + read(oldDrive, temptime); // Read drive time + for j:=1 to ModelDef.numdrive do + read(oldDrive, tempdrive[j].value); // Read drivers + readln(oldDrive); // Advance to next line + + // Replace Wr, Drd and Drc with values for this catchment from hydrology model + readln(Wrfile, tempstring); + tempdrive[numWr].value := strtofloat(tempstring); + if catchnum < 5 then readln(Drdfile, tempstring) else tempstring := '0'; + readln(Drlfile, tempstring2); + tempdrive[numDrd].value := strtofloat(tempstring) + strtofloat(tempstring2); + readln(Drcfile, tempstring); + tempdrive[numDrc].value := strtofloat(tempstring); + + // Replace Rnh4u, Rno3u, Rdocu and Rdonu with values calculated for upslope catchment by MEL + tempdrive[numRnh4u].value := + strtofloat(FmDisplayOutput.SgModelOutput.Cells[colLnh4d, sgrownum]); + tempdrive[numRno3u].value := + strtofloat(FmDisplayOutput.SgModelOutput.Cells[colLno3d, sgrownum]); + tempdrive[numRdocu].value := + strtofloat(FmDisplayOutput.SgModelOutput.Cells[colLdocd, sgrownum]); + tempdrive[numRdonu].value := + strtofloat(FmDisplayOutput.SgModelOutput.Cells[colLdond, sgrownum]); + sgrownum := sgrownum + 1; // Increment row for next round + + // Write the drivers to the new driver file + write(NewDrive,format('%-25.13e',[temptime]),' '); // Write drive time + for j := 1 to ModelDef.numdrive do + write(NewDrive,format('%-25.13e',[tempdrive[j].value]),' '); // Write drivers + writeln(NewDrive); // Write return + end; + finally + CloseFile(oldDrive); + CloseFile(newDrive); + if catchnum < 5 then CloseFile(DrdFile); + CloseFile(DrcFile); + CloseFile(DrlFile); + CloseFile(WrFile); + end; +end; + +procedure TFmBatchMain.CreateNextDriver4L(ofilename, dfilename: string); +var + catchnum, sgrownum, num, j, k:integer; + colLnh4d, colLno3d, colLdocd, colLdond, numRnh4u, numRno3u, numRdonu, numRdocu, + numWr, numDrd, numDrc, numDrl: array[1..numlayers] of integer; + tempstring, filename, basedrivename: string; + oldDrive, newDrive: textfile; + Wrfile, Drdfile, Drcfile, Drlfile: array[1..numlayers] of textfile; + tempdrive: drivearray; + temptime: double; + +function GetColumnNumber(name:string):integer; +var + i,colnum:integer; + tempstring:string; +begin + i := 1; + colnum := 0; + repeat + tempstring := FmDisplayOutput.SgModelOutput.Cells[i,1]; + tempstring := trim(tempstring); + if tempstring = name then colnum := i; + i := i + 1; + until (colnum <> 0) or (i > FmDisplayOutput.SgModelOutput.Colcount - 1); + result := colnum; +end; + +begin + // Set up names and units of drive array + tempdrive := drive; + + // Get catchment number + tempstring := trim(ofilename); + num := pos('cell', tempstring); + delete(tempstring, 1, num+3); + catchnum := strtoint(tempstring[1]) + 2; // Add 2 because calculating drivers for every other catchment + // i.e. 1 flows to 3, 2 to 4, etc. + // Get base driver filename + basedrivename := dfilename; + num := pos('cell', basedrivename); + delete(basedrivename, num+4, length(basedrivename)); + + // Read in outputfile for this catchment, get column numbers for N fluxes to downslope catchment + // Note that I've assumed that the output file has output at the same time points as the driver!! + // FIX + sgrownum := 3; // 1 row for column numbers, 1 for names and 1 for units, 0 based + for j := 1 to numlayers do + begin + colLnh4d[j] := GetColumnNumber('*N NH4 loss downslope' + inttostr(j)); + colLno3d[j] := GetColumnNumber('*N NO3 loss downslope' + inttostr(j)); + colLdocd[j] := GetColumnNumber('*C DOC loss downslope' + inttostr(j)); + colLdond[j] := GetColumnNumber('*N DON loss downslope' + inttostr(j)); + + // Get array index of drivers that will be changed + numWr[j] := FmCalculate.GetArrayIndex(vtdriver, 'Wr' + '[' + inttostr(j) + ']'); + numDrd[j] := FmCalculate.GetArrayIndex(vtdriver, 'Drd' + '[' + inttostr(j) + ']'); + numDrc[j] := FmCalculate.GetArrayIndex(vtdriver, 'Drc' + '[' + inttostr(j) + ']'); + numDrl[j] := FmCalculate.GetArrayIndex(vtdriver, 'Drl' + '[' + inttostr(j) + ']'); + numRnh4u[j] := FmCalculate.GetArrayIndex(vtdriver, 'Rnh4u' + '[' + inttostr(j) + ']'); + numRno3u[j] := FmCalculate.GetArrayIndex(vtdriver, 'Rno3u' + '[' + inttostr(j) + ']'); + numRdocu[j] := FmCalculate.GetArrayIndex(vtdriver, 'Rdocu' + '[' + inttostr(j) + ']'); + numRdonu[j] := FmCalculate.GetArrayIndex(vtdriver, 'Rdonu' + '[' + inttostr(j) + ']'); + end; + + if (catchnum > 2) and (catchnum < 7) then + try + for j := 1 to numlayers do + begin + // Open Wr file + filename := 'soil mois.xs' + inttostr(catchnum) + inttostr(j) + '.dat'; + assignfile(Wrfile[j], filename); + reset(Wrfile[j]); + + // Open Drd file + if catchnum < 5 then + begin + filename := 'lateral.xq' + inttostr(catchnum) + inttostr(j) + '.dat'; + assignfile(Drdfile[j], filename); + reset(Drdfile[j]); + end; + + // Open Drc file + filename := 'lateral.xqc' + inttostr(catchnum) + inttostr(j) + '.dat'; + assignfile(Drcfile[j], filename); + reset(Drcfile[j]); + + // Open Drl file + if j <> numlayers then + begin + filename := 'drainage.xg' + inttostr(catchnum) + inttostr(j) + '.dat'; + assignfile(Drlfile[j], filename); + reset(Drlfile[j]); + end; + end; + + // Open original driver file to get Temp, CO2, etc + filename := dfilename; + assignfile(OldDrive, filename); + reset(OldDrive); + + // Create new driver file + filename := basedrivename + inttostr(catchnum) + '.drr'; + assignfile(newDrive, filename); + rewrite(newDrive); + + // Copy names and units from olddriver to the new driver + readln(oldDrive, tempstring); + writeln(NewDrive, tempstring); + readln(oldDrive, tempstring); + writeln(NewDrive, tempstring); + + // Advance all hydrology files to 1 Jan 1999 + for j := 1 to 1029 do + for k := 1 to numlayers do + begin + readln(Wrfile[k], tempstring); + if catchnum < 5 then readln(Drdfile[k], tempstring); + readln(Drcfile[k], tempstring); + if k <> numlayers then readln(Drlfile[k], tempstring); + end; + + while not eof(OldDrive) do + begin + read(oldDrive, temptime); // Read drive time + for j:=1 to ModelDef.numdrive do + read(oldDrive, tempdrive[j].value); // Read drivers + readln(oldDrive); // Advance to next line + + // Replace Wr, Drd, Drc and Drl with values for this catchment from hydrology model + for j := 1 to numlayers do + begin + readln(Wrfile[j], tempstring); + tempdrive[numWr[j]].value := strtofloat(tempstring); + if catchnum < 5 then readln(Drdfile[j], tempstring) else tempstring := '0'; + tempdrive[numDrd[j]].value := strtofloat(tempstring); + if j <> numlayers then readln(Drlfile[j], tempstring) else tempstring := '0'; + tempdrive[numDrl[j]].value := strtofloat(tempstring); + readln(Drcfile[j], tempstring); + tempdrive[numDrc[j]].value := strtofloat(tempstring); + + // Replace Rnh4u, Rno3u, Rdocu and Rdonu with values calculated for upslope catchment by MEL + tempdrive[numRnh4u[j]].value := + strtofloat(FmDisplayOutput.SgModelOutput.Cells[colLnh4d[j], sgrownum]); + tempdrive[numRno3u[j]].value := + strtofloat(FmDisplayOutput.SgModelOutput.Cells[colLno3d[j], sgrownum]); + tempdrive[numRdocu[j]].value := + strtofloat(FmDisplayOutput.SgModelOutput.Cells[colLdocd[j], sgrownum]); + tempdrive[numRdonu[j]].value := + strtofloat(FmDisplayOutput.SgModelOutput.Cells[colLdond[j], sgrownum]); + end; + sgrownum := sgrownum + 1; // Increment row for next round + + // Write the drivers to the new driver file + write(NewDrive,format('%-25.13e',[temptime]),' '); // Write drive time + for j := 1 to ModelDef.numdrive do + write(NewDrive,format('%-25.13e',[tempdrive[j].value]),' '); // Write drivers + writeln(NewDrive); // Write return + end; + finally + CloseFile(oldDrive); + CloseFile(newDrive); + for j := 1 to numlayers do + begin + CloseFile(WrFile[j]); + if catchnum < 5 then CloseFile(DrdFile[j]); + CloseFile(DrcFile[j]); + if j <> numlayers then CloseFile(DrlFile[j]); + end; + end; +end; + +function TFmBatchMain.GetResourcePath(): string; +{$ifdef Darwin} +var + pathRef:CFURLRef; + pathCFStr: CFStringRef; + pathStr: shortstring; +{$endif} +begin +{$ifdef Unix} +{$ifdef Darwin} + pathRef := CFBundleCopyBundleURL(CFBundleGetMainBundle()); + pathCFStr := CFURLCopyFileSystemPath(pathRef, kCFURLPOSIXPathStyle); + CFStringGetPascalString(pathCFStr, @pathStr, 255, CFStringGetSystemEncoding()); + CFRelease(pathRef); + CFRelease(pathCFStr); + + Result := pathStr + BundleResourceDirectory; +{$else} + Result := DefaultUnixDirectory; +{$endif} +{$else} // Windows + Result := ExtractFilePath(Application.exeName); +{$endif} +end; + +procedure TFmBatchMain.RunSpinup(pfile, dfile, ofile:string); +var + holdstart, holdstop:double; + holdopt:TRunOptions; +begin + holdstart:=time_start; + holdstop:=time_stop; + holdopt:=FmOptions.RunOptions; + time_start:=1; + time_stop:=7300; + FmOptions.RunOptions:=fregrowOpt; + + FmShellMain.BtnRunClick(FmBatchMain); + + // Turn off resets + stat[FmCalculate.GetArrayIndex(vtState, 'BC')].reset:=false; + stat[FmCalculate.GetArrayIndex(vtState, 'BN')].reset:=false; + stat[FmCalculate.GetArrayIndex(vtState, 'BP')].reset:=false; + + + stat[FmCalculate.GetArrayIndex(vtState, 'DC')].reset:=false; + stat[FmCalculate.GetArrayIndex(vtState, 'DN')].reset:=false; + stat[FmCalculate.GetArrayIndex(vtState, 'DP')].reset:=false; + stat[FmCalculate.GetArrayIndex(vtState, 'WC')].reset:=false; + stat[FmCalculate.GetArrayIndex(vtState, 'WN')].reset:=false; + stat[FmCalculate.GetArrayIndex(vtState, 'WP')].reset:=false; + stat[FmCalculate.GetArrayIndex(vtState, 'SC')].reset:=false; + stat[FmCalculate.GetArrayIndex(vtState, 'SN')].reset:=false; + stat[FmCalculate.GetArrayIndex(vtState, 'SP')].reset:=false; + + stat[FmCalculate.GetArrayIndex(vtState, 'ENH4')].reset:=false; + stat[FmCalculate.GetArrayIndex(vtState, 'ENO3')].reset:=false; + stat[FmCalculate.GetArrayIndex(vtState, 'EPO4')].reset:=false; + stat[FmCalculate.GetArrayIndex(vtState, 'Pa')].reset:=false; + stat[FmCalculate.GetArrayIndex(vtState, 'Pno')].reset:=false; + stat[FmCalculate.GetArrayIndex(vtState, 'Poccl')].reset:=false; + stat[FmCalculate.GetArrayIndex(vtState, 'W')].reset:=false; + stat[FmCalculate.GetArrayIndex(vtState, 'WSnow')].reset:=false; + stat[FmCalculate.GetArrayIndex(vtState, 'fc')].reset:=false; + stat[FmCalculate.GetArrayIndex(vtState, 'SQ')].reset:=false; + + paramfilename:=stringreplace(paramfilename,'spinup regrow','regrow',[rfIgnoreCase,rfReplaceAll]); + + WriteParamFile(paramfilename, ModelDef.numparam,par, ModelDef.numstate,stat,FmShellMain.Currentresid); + + // Set run options back to what was specified in the batch file + time_start:=holdstart; + time_stop:=holdstop; + FmOptions.RunOptions:=holdOpt; +end; + +end. diff --git a/modelshell/calculate.lfm b/modelshell/calculate.lfm new file mode 100644 index 0000000..51a146a --- /dev/null +++ b/modelshell/calculate.lfm @@ -0,0 +1,98 @@ +object FmCalculate: TFmCalculate + Left = 243 + Top = 16 + Caption = 'Calculate Steady State - Enter values for all underlined items' + ClientHeight = 631 + ClientWidth = 732 + Color = clInactiveCaption + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [] + Position = poMainFormCenter + OnCreate = FormSetup + OnShow = FormShow + PixelsPerInch = 96 + object PnTop: TPanel + Left = 0 + Top = 0 + Width = 732 + Height = 63 + Align = alTop + TabOrder = 0 + object BtnShowallProc: TButton + Left = 198 + Top = 16 + Width = 104 + Height = 22 + Caption = 'Show all &processes' + TabOrder = 1 + end + object BtnCancel: TButton + Left = 627 + Top = 16 + Width = 60 + Height = 22 + Cancel = True + Caption = '&Cancel' + ModalResult = 2 + TabOrder = 2 + end + object RgLabelType: TRadioGroup + Left = 0 + Top = 0 + Width = 186 + Height = 50 + Caption = 'Show labels as' + Columns = 2 + ItemIndex = 0 + Items.Strings = ( + '&Names' + '&Symbols' + ) + TabOrder = 0 + end + object BtnOK: TButton + Left = 556 + Top = 16 + Width = 59 + Height = 22 + Caption = '&OK' + ModalResult = 1 + TabOrder = 3 + end + object GbStatus: TGroupBox + Left = 465 + Top = 6 + Width = 45 + Height = 39 + Caption = 'Status' + TabOrder = 4 + object ShStatus: TShape + Left = 9 + Top = 0 + Width = 18 + Height = 18 + Brush.Color = clRed + Shape = stCircle + end + end + object BtnSaveParamFile: TButton + Left = 316 + Top = 16 + Width = 105 + Height = 22 + Caption = 'Save parameter &file' + TabOrder = 5 + end + end + object ScrollBox1: TScrollBox + Left = 0 + Top = 63 + Width = 732 + Height = 568 + Align = alClient + TabOrder = 1 + end +end diff --git a/modelshell/calculate.pas b/modelshell/calculate.pas new file mode 100644 index 0000000..dfe7b5f --- /dev/null +++ b/modelshell/calculate.pas @@ -0,0 +1,108 @@ +unit calculate; + +interface + +uses + Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, MaskEdit, ExtCtrls, stypes; + +type + TFmCalculate = class(TForm) + PnTop: TPanel; + ScrollBox1: TScrollBox; + BtnShowallProc: TButton; + BtnCancel: TButton; + RgLabelType: TRadioGroup; + BtnOK: TButton; + GbStatus: TGroupBox; + ShStatus: TShape; + BtnSaveParamFile: TButton; + procedure FormSetup(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure UpdateForm(Sender: TObject; CalSteadyState:Boolean); + function GetArrayIndex(VarType:TVarType; symbol: string):Integer; + private + { Private declarations } + public + { Public declarations } + end; + +var + FmCalculate: TFmCalculate; + +implementation + +uses frontend, equations, fileio, data; + +{$R *.lfm} + +{ This procedure changes the original generic names of objects on the form to + names that match the real life names of the variables. To do this the + procedure loops over all components in the form looking for labels and + maskedits. For each label or maskedit it determines whether it refers to + a state variable, driver variable, process variable, or parameter. Then it + searches the appropriate array (stat, drive, proc, or par respectively) to + find the array index, the appropriate name and units, and, if a parameter + file and driver file were chosen, the current values. } +procedure TFmCalculate.FormSetup(Sender: TObject); +begin +end; // end FormSetup procedure + +{ This procedure updates all the values on the form before showing it. } +procedure TFmCalculate.FormShow(Sender: TObject); +begin // FormShow procedure + +end; // FormShow procedure + +{ Update the values and the Status button on the form. } +procedure TFmCalculate.UpdateForm(Sender: TObject; CalSteadyState: Boolean); +begin +end; + +{ Function to search the global arrays for a particular variable. Returns the + array index of the specified variable. Returns a zero if the variable was not + found. } +function TFmCalculate.GetArrayIndex(VarType:TVarType; symbol: string):Integer; +var + i, number:integer; +begin + number := 0; + case VarType of + vtParameter: + begin + for i := 1 to ModelDef.numparam do + begin + if symbol = par[i].symbol then number := i; + end; + end; + vtDriver: + begin + for i := 1 to ModelDef.numdrive do + begin + if symbol = drive[i].symbol then number := i; + end; + end; + vtState: + begin + for i := 1 to ModelDef.numstate do + begin + if symbol = stat[i].symbol then number := i; + end; + end; + vtProcess: + begin + for i := ModelDef.numstate to ModelDef.numprocess do + begin + if symbol = proc[i].symbol then number := i; + end; + end; + end; + + if number <> 0 then + GetArrayIndex := number + else + raise Exception.Create('Could not find symbol, ' + symbol + ' in array.'); +end; + +end. + diff --git a/modelshell/create_equations/CrEquations.ico b/modelshell/create_equations/CrEquations.ico new file mode 100644 index 0000000000000000000000000000000000000000..0341321b5d952e1662a3d9444a73cf9f42a7db37 GIT binary patch literal 137040 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 G`+orYGy**U literal 0 HcmV?d00001 diff --git a/modelshell/create_equations/CrEquations.lpi b/modelshell/create_equations/CrEquations.lpi new file mode 100644 index 0000000..c5b7157 --- /dev/null +++ b/modelshell/create_equations/CrEquations.lpi @@ -0,0 +1,345 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modelshell/create_equations/CrEquations.lpr b/modelshell/create_equations/CrEquations.lpr new file mode 100644 index 0000000..40b3e2f --- /dev/null +++ b/modelshell/create_equations/CrEquations.lpr @@ -0,0 +1,19 @@ +program CrEquations; + +{$mode objfpc}{$H+} + +uses + {$IFDEF UNIX}{$IFDEF UseCThreads} + cthreads, + {$ENDIF}{$ENDIF} + Interfaces, // this includes the LCL widgetset + Forms, Crmain, stypes; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TFmMain, FmMain); + Application.Run; +end. + diff --git a/modelshell/create_equations/CrEquations.res b/modelshell/create_equations/CrEquations.res new file mode 100644 index 0000000000000000000000000000000000000000..f6e8499568f21121986c715951291349244aeef3 GIT binary patch literal 139052 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 + end + object HeaderControl1: THeaderControl + Left = 563 + Height = 30 + Top = 291 + Width = 170 + DragReorder = False + Sections = <> + end + object DlgOpenModelDef: TOpenDialog + Title = 'Open model description file' + DefaultExt = '.txt' + Filter = 'Text Files (*.txt)|*.txt|All Files (*.*)|*.*' + Options = [ofPathMustExist, ofFileMustExist, ofEnableSizing, ofViewDetail] + left = 528 + top = 136 + end + object DlgOpenEqPas: TOpenDialog + FileName = 'equationsblank.pas' + Options = [ofPathMustExist, ofFileMustExist, ofEnableSizing, ofViewDetail] + left = 47 + top = 146 + end +end diff --git a/modelshell/create_equations/crmain.pas b/modelshell/create_equations/crmain.pas new file mode 100644 index 0000000..d630b36 --- /dev/null +++ b/modelshell/create_equations/crmain.pas @@ -0,0 +1,2010 @@ +unit Crmain; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, + {$ifdef Darwin} + MacOSAll, + {$endif} + ExtCtrls, ComCtrls, stypes; + +const + maxArrays = 150; + DefaultUnixDirectory = '/user/share/CrEquations'; + BundleResourceDirectory = '/Contents/Resources/'; + maxParperArray = 20; + +type + TPart = (stBeginning, stEnd); + TVarInfo = record + vType: TVarType; + IsArray: Boolean; + Name: string; + Units: string; + Symbol: string; + numParam: integer; + numRow: integer; + numCol: integer; + end; + + TMatrixInfo = record + VarName: string; + numRow: integer; + Numcol: integer; + NumUniqueParam: integer; + end; + TArrayList = array[1..MaxArrays] of Tmatrixinfo; + + { TFmMain } + + TFmMain = class(TForm) + BtnCreateCode: TButton; + BtnClose: TButton; + HeaderControl1: THeaderControl; + LblEdFilename: TLabeledEdit; + MmInstruct: TMemo; + DlgOpenModelDef: TOpenDialog; + DlgOpenEqPas: TOpenDialog; + StatusBar1: TStatusBar; + procedure ChooseDefFile(Sender: TObject); + procedure BtnCreatecodeClick(Sender: TObject); + procedure BtnCloseClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + function IsDigit(astring:string; index:integer): Boolean; + private + { private declarations } + fModelPath:string; + fResourcePath:string; + FequationsFileName:string; + ftempmodeldef:Tmodeldef; + ftempstate:statearray; + ftempprocess:processarray; + ftempdrive:drivearray; + ftemppar:paramarray; + fnumOtherDouble, numOtherInt, numBoolean:integer; + ftempotherDouble, tempotherInt:paramarray; + ftempBoolean: paramarray; + fModelDefFilename:String; + farrays: TArrayList; + fTotalNumArrays: integer; + fvarlist:Tstringlist; + fModelDef:Tstringlist; + fEquations:Tstringlist; + procedure DefModel; + procedure DefStates; + procedure DefProcess; + procedure DefDrive; + procedure DefOtherVar; + procedure DefBooleanVar; + procedure GetFunctions; + procedure CreateProcessesProc; + function LineSearch(AstringList: Tstringlist; Sstring:string):integer; + function DivideString(fromString, divider:string; WhichPart:TPart):string; + function ParseString(acsvstring: string; vtype: TVarType): TVarInfo; + // procedure ParseString(var tstring, tname, tunits, tsymbol: string; +// var tnpar:integer; var tptype:processtype; var tnrow, tncol: integer); + function ParCount(processnum:integer):integer; + function GetArrayNum(varname:string): integer; + function CheckDerivatives(fline: integer): integer; + function RemoveTrailingComma(lnum: integer): integer; + procedure RemoveFinalDouble; + function RemoveArrayIndex(tstring: string): string; + function GetResourcePath(): string; + public + { public declarations } + end; + +var + FmMain: TFmMain; + +implementation + +{$R *.lfm} + +{ TFmMain } + +{ Select the model description file } +procedure TFmMain.ChooseDefFile(Sender: TObject); +begin + // If the user typed directly in the box + if Sender is TEdit then fModelDefFilename := LblEdFilename.Caption // Set filename + else // The user clicked either the menu or the label + begin // Show the open file dialog + // First set the dialog box default filename to the current file + DlgOpenModelDef.filename := fModelDefFilename; + // If the user chooses OK in the dialog then set the new paramfilename + if DlgOpenModelDef.execute then fModelDefFilename := DlgOpenModelDef.filename; + end; + LblEdFilename.Caption := fModelDefFilename; + fModelPath := ExtractFilePath(fModelDefFilename); + if fModelDefFilename <> '' then BtnCreateCode.Enabled := True; +end; + +procedure TFmMain.BtnCreatecodeClick(Sender: TObject); +var + fs: TFileStream; +begin + fvarlist.Clear; + fModelDef:=Tstringlist.Create; + fEquations:=Tstringlist.Create; + try + if fModelDefFilename <> '' then + begin + try + fs := nil; + BtnCreateCode.Enabled := False; + BtnCreateCode.Caption := 'Running'; { TODO 3 -oBK -icicing : Why does the button caption not change on the Mac? } + if not FileExists(fEquationsFilename) then + repeat + MessageDlg('A required file, equationsblank.pas, is not in the expected ' + + 'location. Please locate the file using the dialog box.', mtError, [mbOK],0); + if DlgOpenEqPas.Execute then fEquationsFilename := DlgOpenEqPas.FileName; + until FileExists(fEquationsFilename); + +// Load the equations.pas file using the TStringList.LoadfromFile procedure because it's a plain text file +// and using the LoadRichText procedure of RichMemo only reads the comments at the beginning of the file. +// MmEquations.Clear; +// MmEquations.Lines.LoadFromFile(fEquationsFilename); + fEquations.LoadFromFile(fEquationsFilename); + +// MmModelDef.Clear; +// fModelDef.LoadFromFile(fModelDefFilename); + fModelDef.LoadFromFile(fModelDefFilename); + + fTotalNumArrays := 1; + DefModel; + DefStates; + DefProcess; + DefDrive; + DefOtherVar; + CreateProcessesProc; +// MmEquations.Lines.SavetoFile(fModelPath + 'equations.pas'); + fEquations.SaveToFile(fModelPath + 'equations.pas'); + BtnCreateCode.Enabled := True; + BtnCreateCode.Caption := '&Create code'; + MessageDlg('Your model is ready to compile. Using Windows Explorer, find ' + + 'and double click on the file modelshell6543.lpi, your model will open ' + + 'inside Lazarus. Click on the green triangle in the menu bar to run ' + + 'your model.', mtInformation, [mbOK], 0) + except + raise; +{ on EStringListError do + if E.Message = 'String list does not allow duplicates' then + MessageDlg('Duplicate variable names. Translation failed. Ensure that state, process and driver ' + + 'variable names differ in the first 25 characters and try again. ', mtError, [mbOK], 0); + if E.Message = 'Index out of bounds' then + Messag } + end; + end + else + MessageDlg('Invalid Model Definition File. Please reenter', + mtWarning, [mbOK], 0); + finally + if assigned(fModelDef) then FreeandNil(fModelDef); + if assigned(fEquations) then FreeandNil(fEquations); + end; +end; + +{ Determines the model name, version, and time unit based on the file read into + the ReModelDef memo component. The Model name, version and time unit are + copied to the RMmEquations memo and to the tempModelDef record. } +procedure TFmMain.DefModel; +var + tempstring:string; + fromLineNum, toLineNum:integer; +begin + fromLineNum := LineSearch(fModelDef,'Model Name'); + ftempmodeldef.modelname :=DivideString(fModelDef[fromLineNum],'=',stEnd); + if length(ftempmodeldef.modelname) > stringlength then + raise Exception.Create('Model name is too long. Decrease model name to 25 characters or less and rerun Create Equations.'); + + tempstring := 'ModelDef.modelname := ''' + ftempmodeldef.modelname + ''';'; + toLineNum := LineSearch(fEquations,'ModelDef.modelname :='); + fEquations[toLineNum] := tempstring; + + fromLineNum := LineSearch(fModelDef,'Model Version'); + ftempmodeldef.versionnumber := + DivideString(fModelDef[fromLineNum],'=',stEnd); + tempstring := 'ModelDef.versionnumber := ''' + ftempmodeldef.versionnumber + + ''';'; + toLineNum := LineSearch(fEquations,'ModelDef.versionnumber :='); + fEquations[toLineNum] := tempstring; + + fromLineNum := LineSearch(fModelDef,'Model Time Unit'); + ftempmodeldef.timeunit := DivideString(fModelDef[fromLineNum],'=',stEnd); + tempstring := 'ModelDef.timeunit := ''' + ftempmodeldef.timeunit + ''';'; + toLineNum := LineSearch(fEquations,'ModelDef.timeunit :='); + fEquations[toLineNum] := tempstring; + + fromLineNum := LineSearch(fModelDef,'Model Contact'); + ftempmodeldef.contactperson :=DivideString(fModelDef[fromLineNum],'=',stEnd); + tempstring := 'ModelDef.contactperson := ''' + ftempmodeldef.contactperson + ''';'; + toLineNum := LineSearch(fEquations,'ModelDef.contactperson :='); + fEquations[toLineNum] := tempstring; + + fromLineNum := LineSearch(fModelDef,'Model Contact Address Line 1'); + ftempmodeldef.contactaddress1 :=DivideString(fModelDef[fromLineNum],'=',stEnd); + tempstring := 'ModelDef.contactaddress1 := ''' + ftempmodeldef.contactaddress1 + ''';'; + toLineNum := LineSearch(fEquations,'ModelDef.contactaddress1 :='); + fEquations[toLineNum] := tempstring; + + fromLineNum := LineSearch(fModelDef,'Model Contact Address Line 2'); + ftempmodeldef.contactaddress2 :=DivideString(fModelDef[fromLineNum],'=',stEnd); + tempstring := 'ModelDef.contactaddress2 := ''' + ftempmodeldef.contactaddress2 + ''';'; + toLineNum := LineSearch(fEquations,'ModelDef.contactaddress2 :='); + fEquations[toLineNum] := tempstring; + + fromLineNum := LineSearch(fModelDef,'Model Contact Address Line 3'); + ftempmodeldef.contactaddress3 :=DivideString(fModelDef[fromLineNum],'=',stEnd); + tempstring := 'ModelDef.contactaddress3 := ''' + ftempmodeldef.contactaddress3 + ''';'; + toLineNum := LineSearch(fEquations,'ModelDef.contactaddress3 :='); + fEquations[toLineNum] := tempstring; +end; + +{ Defines the state variables of the model based on the file read into the + fModelDef memo. } +procedure TFmMain.DefStates; +var + i, j, m, fromline, toline:integer; + tempstring: string; + avar: tvarinfo; +// tname, tunits, tsymbol: Tshortstring; +begin +// Define the state variables + fromline := LineSearch(fModelDef, 'States'); + // Advance 1 lines in the memo to get to the line above the state variable listing + fromline := fromline + 2; + tempstring := fModelDef[fromline]; + repeat + tempstring := fModelDef[fromline]; + tempstring := trim(tempstring); + fromline := fromline + 1; + until tempstring <> ''; + i := 1; + while tempstring <> 'End' do + begin + if i > maxstate then + raise Exception.Create('Too many state variables. Increase maxstate in stypes.'); + avar:=ParseString(tempstring,vtstate); + // ParseString(tempstring, tsname, tsunits, tssymbol, tnpar, tptype, tnrow, tncol); + fvarlist.Add(avar.name); + if avar.name[1] <> '*' then // Not an array variable + begin + ftempstate[i].name := avar.Name; + ftempstate[i].units := avar.Units; + ftempstate[i].symbol := avar.Symbol; + i := i + 1; + end + else // An array or matrix variable + begin + if fTotalNumArrays > MaxArrays then + raise Exception.Create('Too many arrays. Increase MaxArrays.'); + if avar.numCol = 0 then // An array + begin + for j := 1 to avar.numRow do + begin + ftempstate[i + j - 1].name := avar.Name + inttostr(j); + ftempstate[i + j - 1].units := avar.Units; + ftempstate[i + j - 1].symbol := avar.Symbol + '[' + inttostr(j) + ']'; + end; + i := i + avar.numRow; + end + else // A matrix + begin + for j := 1 to avar.numRow do + for m := 1 to avar.numCol do + begin + ftempstate[i + (j-1)*avar.numCol + m - 1].name := avar.Name + inttostr(j) + '-' + inttostr(m); + ftempstate[i + (j-1)*avar.numCol + m - 1].units := avar.Units; + ftempstate[i + (j-1)*avar.numCol + m - 1].symbol := avar.Symbol + '[' + inttostr(j) + '-' + inttostr(m) + ']'; + end; + i := i + avar.numRow*avar.numCol; + end; + farrays[fTotalNumArrays].VarName := avar.Name; // Used in createprocessesproc procedure + farrays[fTotalNumArrays].numRow := avar.numRow; + farrays[fTotalNumArrays].Numcol := avar.numCol; + fTotalNumArrays := fTotalNumArrays + 1; + end; + repeat + tempstring := fModelDef[fromline]; + tempstring := trim(tempstring); + fromline := fromline + 1; + until tempstring <> ''; + end; + ftempmodeldef.numstate := i - 1; // Need ftempmodeldef for the equations + +// Update the fEquations memo + toline := LineSearch(fEquations,'ModelDef.numstate :='); + tempstring := 'ModelDef.numstate := ' + inttostr(ftempmodeldef.numstate) + ';'; + fEquations[toline] := tempstring; + + toline := LineSearch(fEquations,'with stat[1] do'); + for i := 1 to 4 do fEquations.Delete(toline); // Delete the example code + + i := 1; + repeat + fEquations.Insert(toline, ' '); + fEquations.Insert(toline + 1,'with stat[' + inttostr(i) + '] do'); + fEquations.Insert(toline + 2, ' begin'); + tempstring := ' name:=''' + ftempstate[i].name + '''; ' + + 'units:=''' + ftempstate[i].units + '''; ' + + 'symbol:=''' + ftempstate[i].symbol + ''';'; + fEquations.Insert(toline + 3, tempstring); + fEquations.Insert(toline + 4, ' end;'); + toline := toline + 5; + i := i + 1; + until i = ftempmodeldef.numstate + 1; +end; + +{ Defines the processes and parameters of the model based on the file read into + the fModelDef memo. } +procedure TFmMain.DefProcess; +var + iproc, j, k, m, mm, num, fromline, toline, numprevpar, arraynum, + ipcol, iprow, ipar:integer; + tempstring, tempstring2, statename: string; + avar, apar: Tvarinfo; + holdprocess: Tprocessvariable; + holdparam: array[1..maxParperArray] of Tparamvariable; +begin + { The first numstate processes are the derivatives of the state variables. + These processes aren't used in this procedure but are used in the + CreateProcessesProc. } + iproc := 1; + while iproc <= ftempmodeldef.numstate do + //for iproc:= 1 to ftempmodeldef.numstate do + begin + if ftempstate[iproc].name[1] <> '*' then + begin + ftempprocess[iproc].name := 'd' + ftempstate[iproc].name + 'dt'; + ftempprocess[iproc].symbol := 'd' + ftempstate[iproc].symbol + 'dt'; + ftempprocess[iproc].units := ftempstate[iproc].units + ' t-1'; + iproc:=iproc+1; + end + else // An array or matrix + begin + arraynum := GetArrayNum(ftempstate[iproc].name); + statename := farrays[arraynum].VarName; + delete(statename,1,1); // Remove * + if farrays[arraynum].numcol = 0 then // An array + begin + for j := 1 to farrays[arraynum].numrow do + begin + ftempprocess[iproc + j - 1].name := '*d' + statename + 'dt' + inttostr(j); + tempstring := ftempstate[iproc + j -1].symbol; + num := pos('[', tempstring); + tempstring2 := copy(tempstring, num, length(tempstring) - num + 1); + delete(tempstring, num, length(tempstring) - num + 1); + ftempprocess[iproc + j - 1].symbol := 'd' + tempstring + 'dt' + tempstring2; + ftempprocess[iproc + j -1].units := ftempstate[iproc].units + ' t-1'; + end; + iproc := iproc + farrays[arraynum].numrow; + end + else // A matrix + begin + for j := 1 to farrays[arraynum].numrow do + for k := 1 to farrays[arraynum].numcol do + begin + ftempprocess[iproc+(j-1)*farrays[arraynum].Numcol+k-1].name := '*d' + statename + 'dt' + inttostr(j) + '-' + inttostr(k); + tempstring := ftempstate[iproc+(j-1)*farrays[arraynum].Numcol+k-1].symbol; + num := pos('[', tempstring); + tempstring2 := copy(tempstring, num, length(tempstring) - num + 1); + delete(tempstring, num, length(tempstring) - num + 1); + ftempprocess[iproc+(j-1)*farrays[arraynum].Numcol+k-1].symbol := 'd' + tempstring + 'dt' + tempstring2; + ftempprocess[iproc+(j-1)*farrays[arraynum].Numcol+k-1].units := ftempstate[iproc].units + ' t-1'; + end; + iproc := iproc + farrays[arraynum].numrow*farrays[arraynum].numcol; + end; + end; + end; + + // Define the processes + fromline := LineSearch(fModelDef, 'Process'); + // Advance 3 lines in the memo to get from numprocess to the line above the variable listing. + fromline := fromline + 3; + repeat + tempstring := fModelDef[fromline]; + tempstring := trim(tempstring); + fromline := fromline + 1; + until tempstring <> ''; + iproc := ftempmodeldef.numstate + 1; // first process + while tempstring <> 'End' do + begin + if iproc > maxprocess then + raise Exception.Create('Too many processes. Increase maxprocess in stypes.'); + avar:=ParseString(tempstring,vtprocess); + //ParseString(tempstring, tprocname, tprocunits, tprocsymbol, tnpar, tptype, tnrow, tncol); + fvarlist.Add(avar.Name); + if avar.numRow = 0 then // Not an array or matrix variable + begin + ftempprocess[iproc].name := avar.Name; + ftempprocess[iproc].units := avar.Units; + ftempprocess[iproc].symbol := avar.Symbol; + ftempprocess[iproc].parameters := avar.numParam; + numprevpar := ParCount(iproc); + if numprevpar + avar.numParam > maxparam then + raise Exception.Create('Too many parameters. Increase maxparam in stypes.'); + for j := 1 to avar.numParam do + begin + repeat + tempstring := fModelDef[fromline]; + tempstring := trim(tempstring); + fromline := fromline + 1; + until tempstring <> ''; + apar:=ParseString(tempstring,vtParameter); + // ParseString(tempstring, tparname, tparunits, tparsymbol, num, tptype, num, num); + ftemppar[numprevpar + j].name := apar.Name; + ftemppar[numprevpar + j].units := apar.Units; + ftemppar[numprevpar + j].symbol := apar.Symbol; + end; + iproc := iproc + 1; + end + else // An array or matrix variable + begin + if avar.numCol = 0 then // An array + begin + for k := 1 to avar.numRow do + begin + if k = 1 then + begin + ftempprocess[iproc + k - 1].name := avar.Name; + ftempprocess[iproc + k - 1].units := avar.Units; + ftempprocess[iproc + k - 1].symbol := avar.Symbol; + ftempprocess[iproc + k - 1].parameters := 0; // Actual number of parameters will be calculated in param loop + holdprocess := ftempprocess[iproc + k - 1]; + ftempprocess[iproc + k - 1].name := avar.Name + inttostr(k); + ftempprocess[iproc + k - 1].symbol := avar.Symbol + '[' + inttostr(k) + ']'; + numprevpar := ParCount(iproc + k - 1); + farrays[fTotalNumArrays].VarName := avar.Name; // Used in createprocessesproc procedure + farrays[fTotalNumArrays].numRow := avar.numRow; + farrays[fTotalNumArrays].numCol := avar.numCol; // To make sure it isn't undefined. + farrays[fTotalNumArrays].NumUniqueParam := avar.numParam; + fTotalNumArrays := fTotalNumArrays + 1; + if avar.numParam > maxParperArray then // To change this value, change the variable declaration for holdparam + raise exception.Create('Process, ' + + ftempprocess[iproc + k - 1].name + ', has too many parameters.'); + if numprevpar + avar.numParam*avar.numRow > maxparam then // Fix to account for matrices + raise Exception.Create('Too many parameters. Increase maxparam in stypes.'); + for ipar := 1 to avar.numParam do + begin + repeat + tempstring := fModelDef[fromline]; + tempstring := trim(tempstring); + fromline := fromline + 1; + until tempstring <> ''; + apar:=ParseString(tempstring,vtParameter); +// ParseString(tempstring, tparname, tparunits, tparsymbol, num, tptype, num, num); + holdparam[ipar].name:=apar.Name; + holdparam[ipar].units:=apar.Units; + holdparam[ipar].symbol:=apar.Symbol; + for iprow:=1 to avar.numRow do + begin + ftemppar[numprevpar+(ipar-1)*avar.numRow+iprow].name := + holdparam[ipar].name + inttostr(iprow); + ftemppar[numprevpar+(ipar-1)*avar.numRow+iprow].units := + holdparam[ipar].units; + ftemppar[numprevpar+(ipar-1)*avar.numRow+iprow].symbol := + holdparam[ipar].symbol + '[' + inttostr(iprow) + ']'; + end; + ftempprocess[iproc].parameters := ftempprocess[iproc].parameters + avar.numRow; + end; + end + else // Not the first process of an array so use saved info instead of reading from file + begin + ftempprocess[iproc + k - 1] := holdprocess; + ftempprocess[iproc + k - 1].name := holdprocess.name + inttostr(k); + ftempprocess[iproc + k - 1].symbol := holdprocess.symbol + '[' + inttostr(k) + ']'; + ftempprocess[iproc + k - 1].parameters := 0; + end; + end; + iproc := iproc + avar.numRow; + if fTotalNumArrays > MaxArrays then + raise Exception.Create('Too many arrays. Increase MaxArrays.'); + end + else // A matrix + begin + for mm := 1 to avar.numCol do + for k := 1 to avar.numRow do + begin + if (k = 1) and (mm = 1) then // First element of process matrix + begin + ftempprocess[iproc+(k-1)*avar.numCol+mm-1].name := avar.Name; + ftempprocess[iproc+(k-1)*avar.numCol+mm-1].units := avar.Units; + ftempprocess[iproc+(k-1)*avar.numCol+mm-1].symbol := avar.Symbol; + ftempprocess[iproc+(k-1)*avar.numCol+mm-1].parameters := avar.numRow; // Necessary for holdprocess and so that numprevpar gets calculated correctly + holdprocess := ftempprocess[iproc+(k-1)*avar.numCol+mm-1]; + ftempprocess[iproc+(k-1)*avar.numCol+mm-1].name := avar.Name + inttostr(k) + '-' + inttostr(mm); + ftempprocess[iproc+(k-1)*avar.numCol+mm-1].symbol := avar.Symbol + '[' + inttostr(k) + '-' + inttostr(mm) + ']'; + numprevpar := ParCount(iproc+(k-1)*avar.numCol+mm-1); + farrays[fTotalNumArrays].VarName := avar.Name; // Used in createprocessesproc procedure + farrays[fTotalNumArrays].numRow := avar.numRow; + farrays[fTotalNumArrays].NumCol := avar.numCol; + farrays[fTotalNumArrays].NumUniqueParam := avar.numParam; + fTotalNumArrays := fTotalNumArrays + 1; // Fix, why mm and not 1??? Changed to 1 because that makes more sense + if avar.numParam > maxParperArray then // To change this value, change the variable declaration for holdparam + raise exception.Create('Process, ' + + ftempprocess[iproc+(k-1)*avar.numCol+mm-1].name + ', has too many parameters.'); + if numprevpar + avar.numParam*avar.numRow*avar.numCol > maxparam then + raise Exception.Create('Too many parameters. Increase maxparam in stypes.'); + ftempprocess[iproc].parameters := 0; + for ipar := 1 to avar.numParam do + begin + repeat + tempstring := fModelDef[fromline]; + tempstring := trim(tempstring); + fromline := fromline + 1; + until tempstring <> ''; + apar:=ParseString(tempstring,vtParameter); + // ParseString(tempstring, tparname, tparunits, tparsymbol, num, tptype, num, num); + holdparam[ipar].name:=apar.Name; + holdparam[ipar].units:=apar.Units; + holdparam[ipar].symbol:=apar.Symbol; + for iprow:=1 to avar.numRow do + for ipcol:=1 to avar.numCol do + begin + ftemppar[numprevpar+(ipar-1)*avar.numCol*avar.numRow+(iprow-1)*avar.numCol+ipcol].name := + holdparam[ipar].name + inttostr(iprow) + '-' + inttostr(ipcol); + ftemppar[numprevpar+(ipar-1)*avar.numCol*avar.numRow+(iprow-1)*avar.numCol+ipcol].units := + holdparam[ipar].units; + ftemppar[numprevpar+(ipar-1)*avar.numCol*avar.numRow+(iprow-1)*avar.numCol+ipcol].symbol := + holdparam[ipar].symbol + '[' + inttostr(iprow) + '-' + inttostr(ipcol) + ']'; + end; + ftempprocess[iproc].parameters := ftempprocess[iproc].parameters + avar.numRow*avar.numCol; + end; + end + else // Not the first element of a matrix so use saved info instead of reading from file + begin + ftempprocess[iproc+(k-1)*avar.numCol+mm-1] := holdprocess; + ftempprocess[iproc+(k-1)*avar.numCol+mm-1].name := holdprocess.name + inttostr(k) + '-' + inttostr(mm); + ftempprocess[iproc+(k-1)*avar.numCol+mm-1].symbol := holdprocess.symbol + '[' + inttostr(k) + '-' +inttostr(mm)+ ']'; + ftempprocess[iproc+(k-1)*avar.numCol+mm-1].parameters := 0; + end; + end; + iproc := iproc + avar.numRow*avar.numCol; + if fTotalNumArrays > MaxArrays then + raise Exception.Create('Too many arrays. Increase MaxArrays.'); + end; + end; + repeat + tempstring := fModelDef[fromline]; + tempstring := trim(tempstring); + fromline := fromline + 1; + until tempstring <> ''; + end; + ftempmodeldef.numprocess := iproc - 1; + ftempmodeldef.numparam := ParCount(ftempmodeldef.numprocess); + +// Update the fEquations memo + toline := LineSearch(fEquations,'ModelDef.numprocess :='); + tempstring := 'ModelDef.numprocess := ModelDef.numstate + ' + + inttostr(ftempmodeldef.numprocess-ftempmodeldef.numstate) + ';'; + fEquations[toline] := tempstring; + + toline := LineSearch(fEquations,'CurrentProc := ModelDef.numstate'); + for j := 1 to 15 do fEquations.Delete(toline); // Delete example code. + iproc := 1; + repeat + fEquations.Insert(toline, ' '); + fEquations.Insert(toline + 1, 'CurrentProc := ModelDef.numstate + ' + + inttostr(iproc) + ';'); + fEquations.Insert(toline + 2, 'With proc[CurrentProc] do'); + fEquations.Insert(toline + 3, ' begin'); + fEquations.Insert(toline + 4, ' name := ''' + + ftempprocess[ftempmodeldef.numstate + iproc].name + ''';'); + fEquations.Insert(toline + 5, ' units := ''' + + ftempprocess[ftempmodeldef.numstate + iproc].units + ''';'); + fEquations.Insert(toline + 6, ' symbol := ''' + + ftempprocess[ftempmodeldef.numstate + iproc].symbol + ''';'); + fEquations.Insert(toline + 7, ' parameters := ' + + inttostr(ftempprocess[ftempmodeldef.numstate + iproc].parameters) + ';'); + case ftempprocess[ftempmodeldef.numstate + iproc].ptype of + ptGroup1: tempstring := 'ptGroup1'; + ptGroup2: tempstring := 'ptGroup2'; + ptGroup3: tempstring := 'ptGroup3'; + ptGroup4: tempstring := 'ptGroup4'; + ptGroup5: tempstring := 'ptGroup5'; + else + tempstring := 'ptGroup1'; + end; + fEquations.Insert(toline + 8, ' ptype := ' + tempstring + + ';'); + fEquations.Insert(toline + 9, ' end;'); + numprevpar := ParCount(ftempmodeldef.numstate + iproc); + toline := toline + 10; + if ftempprocess[ftempmodeldef.numstate + iproc].parameters > 0 then + begin + fEquations.Insert(toline, 'npar:=ParCount(CurrentProc);'); + for m := 1 to ftempprocess[ftempmodeldef.numstate + iproc].parameters do + begin + fEquations.Insert(toline + 1, 'with par[npar + ' + + inttostr(m) + '] do'); + fEquations.Insert(toline + 2, ' begin'); + tempstring := ' name:=''' + ftemppar[numprevpar + m].name + '''; ' + + 'units:=''' + ftemppar[numprevpar + m].units + '''; ' + + 'symbol:=''' + ftemppar[numprevpar + m].symbol + ''';'; + fEquations.Insert(toline + 3, tempstring); + fEquations.Insert(toline + 4, ' end;'); + toline := toline + 4; + end; + toline := toline + 1; + end; + iproc := iproc + 1; + until iproc = ftempmodeldef.numprocess - ftempmodeldef.numstate + 1; +end; + +{ Defines the driver variables of the model based on the file read into + the fModelDef memo. } +procedure TFmMain.DefDrive; +var + i, j, m, fromline, toline:integer; + tempstring: string; + avar: TvarInfo; +begin +// Define the driver variables + fromline := LineSearch(fModelDef, 'Drive'); + // Advance 2 lines in the memo to get to the line above the driver listing + fromline := fromline + 2; + repeat + tempstring := fModelDef[fromline]; + tempstring := trim(tempstring); + fromline := fromline + 1; + until tempstring <> ''; + i := 1; + while tempstring <> 'End' do + begin + if i > maxdrive then + raise Exception.Create('Too many drivers. Increase maxdrive in stypes.'); + avar:=ParseString(tempstring,vtDriver); + // ParseString(tempstring, tname, tunits, tsymbol, tnpar, tptype, tnrow, tncol); + fvarlist.Add(avar.Name); + if avar.Name[1] <> '*' then // Not an array variable + begin + ftempdrive[i].name := avar.Name; + ftempdrive[i].units := avar.Units; + ftempdrive[i].symbol := avar.Symbol; + i := i + 1; + end + else // An array or matrix variable + begin + if avar.numCol=0 then // Array + begin + for j := 1 to avar.numRow do + begin + ftempdrive[i + j - 1].name := avar.Name + inttostr(j); + ftempdrive[i + j - 1].units := avar.Units; + ftempdrive[i + j - 1].symbol := avar.Symbol + '[' + inttostr(j) + ']'; + end; + farrays[fTotalNumArrays].VarName := avar.Name; // Used in createprocessesproc procedure + farrays[fTotalNumArrays].numRow := avar.numRow; + fTotalNumArrays := fTotalNumArrays + 1; + if fTotalNumArrays > MaxArrays then + raise Exception.Create('Too many arrays. Increase MaxArrays.'); + i := i + avar.numRow; + end + else // Matrix + begin + for j := 1 to avar.numRow do + for m := 1 to avar.numCol do + begin + ftempdrive[i + (j-1)*avar.numCol + m - 1].name := avar.Name + inttostr(j) + '-' + inttostr(m); + ftempdrive[i + (j-1)*avar.numCol + m - 1].units := avar.Units; + ftempdrive[i + (j-1)*avar.numCol + m - 1].symbol := avar.Symbol + '[' + inttostr(j) + '-' + inttostr(m) + ']'; + end; + farrays[fTotalNumArrays].VarName := avar.Name; // Used in createprocessesproc procedure + farrays[fTotalNumArrays].numRow := avar.numRow; + farrays[fTotalNumArrays].Numcol:= avar.numCol; + fTotalNumArrays := fTotalNumArrays + 1; + if fTotalNumArrays > MaxArrays then + raise Exception.Create('Too many arrays. Increase MaxArrays.'); + i := i + avar.numRow*avar.numCol; + end; + end; + repeat + tempstring := fModelDef[fromline]; + tempstring := trim(tempstring); + fromline := fromline + 1; + until tempstring <> ''; + end; + ftempmodeldef.numdrive := i - 1; // Need ftempmodeldef for the equations + +// Update the fEquations memo + toline := LineSearch(fEquations,'ModelDef.numdrive :='); + tempstring := 'ModelDef.numdrive := ' + inttostr(ftempmodeldef.numdrive) + ';'; + fEquations[toline] := tempstring; + + toline := LineSearch(fEquations,'with drive[1] do'); + for i := 1 to 4 do fEquations.Delete(toline); // Delete the example code + + for i := 1 to ftempmodeldef.numdrive do + begin + fEquations.Insert(toline, ' '); + fEquations.Insert(toline + 1, 'with drive[' + inttostr(i) + '] do'); + fEquations.Insert(toline + 2, ' begin'); + tempstring := ' name:=''' + ftempdrive[i].name + '''; ' + + 'units:=''' + ftempdrive[i].units + '''; ' + + 'symbol:=''' + ftempdrive[i].symbol + ''';'; + fEquations.Insert(toline + 3, tempstring); + fEquations.Insert(toline + 4, ' end;'); + toline := toline + 5; + end; +end; + +{ Defines the other variables (non output variables) of the model based on the file read into + the fModelDef memo. } +procedure TFmMain.DefOtherVar; +var + i, j, fromline:integer; + tempstring: string; + avar: TvarInfo; +begin + fromline := LineSearch(fModelDef, 'Other Double Variables'); + // Advance 2 lines in the memo to get to the variable list + fromline := fromline + 2; + tempstring := fModelDef[fromline]; + repeat + tempstring := fModelDef[fromline]; + tempstring := trim(tempstring); + fromline := fromline + 1; + until (tempstring <> '') or (fromline > fModelDef.Count); + if fromline > fModelDef.Count then + raise Exception.Create('Error - String "Other Double Variables" not found.'); + i := 1; + while tempstring <> 'End' do + begin + avar:=ParseString(tempstring,vtOther); + // ParseString(tempstring, tname, tunits, tsymbol, tnpar, tptype, tnrow, tncol); + if avar.Name[1] <> '*' then // Not an array variable + begin + ftempotherDouble[i].name := avar.Name; + ftempotherDouble[i].units := avar.Units; + ftempotherDouble[i].symbol := avar.Symbol; + i := i + 1; + end + else // An array variable + begin + for j := 1 to avar.numRow do + begin + ftempotherDouble[i + j - 1].name := avar.Name + inttostr(j); + ftempotherDouble[i + j - 1].units := avar.Units; + ftempotherDouble[i + j - 1].symbol := avar.Symbol; + end; + farrays[fTotalNumArrays].VarName := avar.Name; // Used in createprocessesproc procedure + farrays[fTotalNumArrays].numRow := avar.numRow; + fTotalNumArrays := fTotalNumArrays + 1; + if fTotalNumArrays > MaxArrays then + raise Exception.Create('Too many arrays. Increase MaxArrays.'); + i := i + avar.numRow; + end; + repeat + tempstring := fModelDef[fromline]; + tempstring := trim(tempstring); + fromline := fromline + 1; + until tempstring <> ''; + end; + fnumOtherDouble := i - 1; + + fromline := LineSearch(fModelDef, 'Other Integer Variables'); + // Advance 2 lines in the memo to get to the variable list + fromline := fromline + 2; + tempstring := fModelDef[fromline]; + repeat + tempstring := fModelDef[fromline]; + tempstring := trim(tempstring); + fromline := fromline + 1; + until (tempstring <> '') or (fromline > fModelDef.Count); + if fromline > fModelDef.Count then + raise Exception.Create('Error - String "Other Integer Variables" not found.'); + i := 1; + while tempstring <> 'End' do + begin + avar:=ParseString(tempstring,vtOther); +// ParseString(tempstring, tname, tunits, tsymbol, tnpar, tptype, tnrow, tncol); + if avar.Name[1] <> '*' then // Not an array variable + begin + tempotherInt[i].name := avar.Name; + tempotherInt[i].units := avar.Units; + tempotherInt[i].symbol := avar.Symbol; + i := i + 1; + end + else // An array variable + begin + for j := 1 to avar.numRow do + begin + tempotherInt[i + j - 1].name := avar.Name + inttostr(j); + tempotherInt[i + j - 1].units := avar.Units; + tempotherInt[i + j - 1].symbol := avar.Symbol; + end; + farrays[fTotalNumArrays].VarName := avar.Name; // Used in createprocessesproc procedure + farrays[fTotalNumArrays].numRow := avar.numRow; + fTotalNumArrays := fTotalNumArrays + 1; + if fTotalNumArrays > MaxArrays then + raise Exception.Create('Too many arrays. Increase MaxArrays.'); + i := i + avar.numRow; + end; + repeat + tempstring := fModelDef[fromline]; + tempstring := trim(tempstring); + fromline := fromline + 1; + until tempstring <> ''; + end; + numotherInt := i - 1; +end; + +{ This procedure creates the processes procedure in equations.pas. First it + defines the local variable names using the symbol stored in the arrays. Then + the value in the global arrays is copied into the local variables. And then + the model equations are copied from the fModelDef memo. Finally the values + of the processes are copied from the local variables to the global variables. + } +procedure TFmMain.CreateProcessesProc; +var + toline, fromline1, fromline2, i, j, numprevpar, numemptylines, arraynum, + linecount, lastline, num, posrandom, numtotpar, ipar:integer; + tempstring, tempstring2, astring:string; + WithinCalcDiscrete: Boolean; +begin +// Define the local variable names + + // State variables and their derivatives. + toline := LineSearch(fEquations,'{States}'); + // fEquations.ma + fEquations.Delete(toline + 1); // Delete the example. + i := 1; + linecount := 1; + lastline := toline + linecount; + repeat + if ftempstate[i].name[1] <> '*' then // Not an array variable + begin + fEquations.Insert(toline + linecount, ftempstate[i].symbol + ', ' + + ftempprocess[i].symbol + ', '); + i := i + 1; + lastline := toline + linecount; + end + else // An array variable + begin // Remove comma and set var type to double before adding array. + if (i <> 1) and (ftempstate[i-1].name[1] <> '*') then + begin + RemoveTrailingComma(lastline); + fEquations[lastline] := fEquations[lastline] + ' :double;'; + end; + // Add declaration for array or matrix variable + arraynum := GetArrayNum(ftempstate[i].name); + tempstring := RemovearrayIndex(ftempstate[i].symbol); + tempstring2 := RemoveArrayIndex(ftempprocess[i].symbol); + if farrays[arraynum].numcol = 0 then // Array + begin + fEquations.Insert(toline + linecount, tempstring + ', ' + + tempstring2 + ': array[1..' + + inttostr(farrays[arraynum].numRow) + '] of double;'); + i := i + farrays[arraynum].numRow; + lastline := toline + linecount; + end + else // Matrix + begin + fEquations.Insert(toline + linecount, tempstring + ', ' + + tempstring2 + ': array[1..' + inttostr(farrays[arraynum].numRow) + + ',1..' + inttostr(farrays[arraynum].numcol) + '] of double;'); + i := i + farrays[arraynum].numRow*farrays[arraynum].numcol; + lastline := toline + linecount; + end; + end; + linecount := linecount + 1; + until i = ftempmodeldef.numstate + 1; + + // Processes and parameters. + toline := LineSearch(fEquations,'{processes and associated parameters}'); + fEquations.Delete(toline + 1); // Delete the example. + linecount := 1; + i := 1; + repeat + if ftempprocess[ftempmodeldef.numstate + i].name[1] <> '*' then // Not an array variable + begin + tempstring := ftempprocess[ftempmodeldef.numstate + i].symbol + ', '; + numprevpar := ParCount(ftempmodeldef.numstate + i); + for j := 1 to ftempprocess[ftempmodeldef.numstate + i].parameters do + begin + tempstring := tempstring + ftemppar[numprevpar + j].symbol + ', '; + end; + fEquations.Insert(toline + linecount, tempstring); + i := i + 1; + lastline := toline + linecount; + end + else // An array variable or matrix + begin + // Remove comma and set var type to double before adding array if previous variable was not an array. + if (i = 1) then + begin + RemoveTrailingComma(lastline); + if (ftempstate[ftempmodeldef.numstate].name[1] <> '*') then + fEquations[lastline] := fEquations[lastline] + ' :double;'; + end + else if (ftempprocess[ftempmodeldef.numstate + i - 1].name[1] <> '*') then + begin + RemoveTrailingComma(lastline); + fEquations[lastline] := fEquations[lastline] + ' :double;'; + end; + // Add declaration for array variable + arraynum := GetArrayNum(ftempprocess[ftempmodeldef.numstate + i].name); + tempstring := RemoveArrayIndex(ftempprocess[ftempmodeldef.numstate + i].symbol) + ', '; + numprevpar := ParCount(ftempmodeldef.numstate + i); + j := 1; + if farrays[arraynum].Numcol = 0 then + numtotpar := farrays[arraynum].NumUniqueParam*farrays[arraynum].numRow + else + numtotpar := farrays[arraynum].NumUniqueParam*farrays[arraynum].numRow*farrays[arraynum].Numcol; + while j <= numtotpar do + begin + tempstring := tempstring + RemoveArrayIndex(ftemppar[numprevpar+j].symbol) + ', '; + if farrays[arraynum].numcol = 0 then + j := j + farrays[arraynum].numrow + else + j := j + farrays[arraynum].numrow*farrays[arraynum].numcol; + end; + tempstring := trim(tempstring); + j := length(tempstring); // fix, use removetrailingcomma? won't work + if tempstring[j] = ',' then delete(tempstring,j,1); + if farrays[arraynum].numcol = 0 then // An array + begin + tempstring := tempstring + ': array[1..' + + inttostr(farrays[arraynum].numRow) + '] of double;'; + i := i + farrays[arraynum].numRow; + end + else // A matrix + begin + tempstring := tempstring + ': array[1..' + + inttostr(farrays[arraynum].numrow) + ',1..' + + inttostr(farrays[arraynum].numcol) + '] of double;'; + i := i + farrays[arraynum].numrow*farrays[arraynum].numcol; + end; + fEquations.Insert(toline + linecount, tempstring); + lastline := toline + linecount; + end; + linecount := linecount + 1; + until i = ftempmodeldef.numprocess - ftempmodeldef.numstate + 1; + + // Remove the comma after the last variable if there are no other variables. + if (ftempmodeldef.numdrive = 0) and (fnumOtherDouble = 0) then + RemoveTrailingComma(lastline); + + // Driver variables. + toline := LineSearch(fEquations,'{drivers}'); + fEquations.Delete(toline + 1); // Delete the example. + linecount := 1; + i := 1; + while i < ftempmodeldef.numdrive + 1 do + begin + if ftempdrive[i].name[1] <> '*' then // Not an array variable + begin + fEquations.Insert(toline + linecount, ftempdrive[i].symbol + ', '); + i := i + 1; + lastline := toline + linecount; + end + else // An array or matrix variable + begin + // Remove comma and set var type to double before adding array if previous variable was not an array. + if (i = 1) and (ftempprocess[ftempmodeldef.numprocess].name[1] <> '*') then + begin + RemoveTrailingComma(lastline); + fEquations[lastline] := fEquations[lastline] + ' :double;'; + end + else if (i > 1) and (ftempdrive[i-1].name[1] <> '*') then + begin + RemoveTrailingComma(lastline); + fEquations[lastline] := fEquations[lastline] + ' :double;'; + end; + // Add declaration for array or matrix variable + arraynum := GetArrayNum(ftempdrive[i].name); + tempstring := ftempdrive[i].symbol; + num := pos('[', tempstring); + delete(tempstring, num, length(tempstring) - num + 1); + if farrays[arraynum].Numcol=0 then + begin // Array + fEquations.Insert(toline + linecount, + tempstring + ': array[1..' + + inttostr(farrays[arraynum].numRow) + '] of double;'); + i := i + farrays[arraynum].numRow; + end + else + begin // Marix + fEquations.Insert(toline + linecount, + tempstring + ': array[1..' + inttostr(farrays[arraynum].numRow) + + ',1..' + inttostr(farrays[arraynum].numcol) + '] of double;'); + i := i + farrays[arraynum].numRow*farrays[arraynum].numcol; + end; + lastline := toline + linecount; + end; + linecount := linecount + 1; + end; + +// Other variables Doubles + toline := LineSearch(fEquations,'{Other double}'); + fEquations.Delete(toline + 1); // Delete the example. + linecount := 1; + i := 1; + if fnumOtherDouble = 0 then // Clean up because there are no other variables + begin + if ftempdrive[ftempmodeldef.numdrive].name[1] <> '*' then + RemoveTrailingComma(lastline) + else + RemoveFinalDouble; + end + else // There are other variables + begin + repeat + if ftempotherDouble[i].name[1] <> '*' then // Not an array variable + begin + fEquations.Insert(toline + linecount, ftempotherDouble[i].symbol + ', '); + i := i + 1; + lastline := toline + linecount; + if i = fnumOtherDouble + 1 then RemoveTrailingComma(lastline); + end + else // An array variable + begin // Remove comma and set var type to double before adding array if necessary + if i = 1 then + begin + if (ftempmodeldef.numdrive > 0) and (ftempdrive[ftempmodeldef.numdrive].name[1] <> '*') then + begin + RemoveTrailingComma(lastline); + fEquations[lastline] := fEquations[lastline] + ' :double;'; + end; + if (ftempmodeldef.numdrive = 0) and (ftempprocess[ftempmodeldef.numprocess].name[1] <> '*') then + begin + RemoveTrailingComma(lastline); + fEquations[lastline] := fEquations[lastline] + ' :double;'; + end; + end + else + begin + if ftempotherDouble[i-1].name[1] <> '*' then + begin + RemoveTrailingComma(lastline); + fEquations[lastline] := fEquations[lastline] + ' :double;'; + end; + end; + // Add declaration for array variable + arraynum := GetArrayNum(ftempotherDouble[i].name); + fEquations.Insert(toline + linecount, + ftempotherDouble[i].symbol + ': array[1..' + + inttostr(farrays[arraynum].numRow) + '] of double;'); + i := i + farrays[arraynum].numRow; + lastline := toline + linecount; + if (i = fnumOtherDouble + 1) then RemoveFinalDouble; + end; + linecount := linecount + 1; + until i = fnumOtherDouble + 1; + end; + +// Other variables integer + toline := LineSearch(fEquations,'{Other integers}'); + linecount := 1; + i := 1; + if numOtherInt <> 0 then // There are other variables + begin + repeat + if tempotherInt[i].name[1] <> '*' then // Not an array variable + begin + fEquations.Insert(toline + linecount, tempotherInt[i].symbol + ', '); + i := i + 1; + lastline := toline + linecount; + if i = numOtherInt + 1 then + begin + RemoveTrailingComma(lastline); + fEquations[lastline] := fEquations[lastline] + ': integer;'; + end; + end + else // An array variable + begin + if i>1 then // Clean up comma and add :integer if previous other int existed + if tempOtherInt[i-1].name[1] <> '*' then + begin + RemoveTrailingComma(lastline); + fEquations[lastline] := fEquations[lastline] + ': integer;'; + end; + // Add declaration for array variable + arraynum := GetArrayNum(tempotherInt[i].name); + fEquations.Insert(toline + linecount, + tempotherInt[i].symbol + ': array[1..' + + inttostr(farrays[arraynum].numRow) + '] of integer;'); + i := i + farrays[arraynum].numRow; + lastline := toline + linecount; + end; + linecount := linecount + 1; + until i = numOtherInt + 1; + end; + +// Boolean variables + if numBoolean <> 0 then + begin + toline := LineSearch(fEquations,'{ Boolean Variables }'); + linecount := 1; + i := 1; + repeat + if ftempBoolean[i].name[1] <> '*' then // Not an array variable + begin + fEquations.Insert(toline + linecount, ftempBoolean[i].symbol + ', '); + i := i + 1; + lastline := toline + linecount; + if i = numBoolean + 1 then + begin + RemoveTrailingComma(lastline); + fEquations[lastline] := fEquations[lastline] + ': Boolean;'; + end; + end + else // An array variable + begin + if (i>1) and (ftempBoolean[i-1].name[1] <> '*') then + begin + RemoveTrailingComma(lastline); + fEquations[lastline] := fEquations[lastline] + ' :Boolean;'; + end; + // Add declaration for array variable + arraynum := GetArrayNum(ftempBoolean[i].name); + fEquations.Insert(toline + linecount, + ftempBoolean[i].symbol + ': array[1..' + + inttostr(farrays[arraynum].numRow) + '] of Boolean;'); + i := i + farrays[arraynum].numRow; + lastline := toline + linecount; + if (i = numBoolean + 1) then RemoveFinalDouble; + end; + linecount := linecount + 1; + until i = numBoolean + 1; + end; + + // Copy any user defined functions into the processes procedure + GetFunctions; + +// Copy values from the global farrays to the local variables. + // Drivers + toline := LineSearch(fEquations,'{ Copy the drivers from the global array,'); + fEquations.Delete(toline + 1); // Delete the example. + linecount := 1; + i := 1; + while i < ftempmodeldef.numdrive + 1 do + begin + if ftempdrive[i].name[1] <> '*' then // Not an array + begin + fEquations.Insert(toline + linecount, ftempdrive[i].symbol + + ' := ' + 'tdrive[' + inttostr(i) + '].value;'); + i := i + 1; + end + else // An array or matrix variable + begin + arraynum := GetArrayNum(ftempdrive[i].name); + tempstring2 := ftempdrive[i].symbol; + num := pos('[', tempstring2); + delete(tempstring2, num, length(tempstring2) - num + 1); + if farrays[arraynum].numcol = 0 then + begin // Array + tempstring := 'for jj := 1 to ' + inttostr(farrays[arraynum].numRow) + + ' do ' + tempstring2 + '[jj] := tdrive[' + inttostr(i) + + ' + jj - 1].value;'; + fEquations.Insert(toline + linecount, tempstring); + i := i + farrays[arraynum].numRow; + end + else // Matrix + begin + tempstring := 'for jj := 1 to ' + inttostr(farrays[arraynum].numRow) + + ' do for kk := 1 to ' + inttostr(farrays[arraynum].numcol) + ' do ' + + tempstring2 + '[jj,kk] := tdrive[' + inttostr(i) + + ' + (jj-1)*' + inttostr(farrays[arraynum].numcol) + ' + kk - 1].value;'; + fEquations.Insert(toline + linecount, tempstring); + i := i + farrays[arraynum].numRow*farrays[arraynum].numcol; + end; + end; + linecount := linecount + 1; + end; + + // State Variables + toline := LineSearch(fEquations, '{ Copy the state variables from the global array'); + fEquations.Delete(toline + 1); // Delete the example. + linecount := 1; + i := 1; + repeat + if ftempstate[i].name[1] <> '*' then // Not an array + begin + fEquations.Insert(toline + linecount, ftempstate[i].symbol + + ' := ' + 'tstat[' + inttostr(i) + '].value;'); + i := i + 1; + end + else // An array or matrix variable + begin + arraynum := GetArrayNum(ftempstate[i].name); + if farrays[arraynum].Numcol = 0 then // Array + begin + tempstring := 'for jj := 1 to ' + inttostr(farrays[arraynum].numRow) + + ' do ' + RemoveArrayIndex(ftempstate[i].symbol) + + '[jj] := tstat[' + inttostr(i-1) + + ' + jj].value;'; + fEquations.Insert(toline + linecount, tempstring); + i := i + farrays[arraynum].numRow; + end + else + begin // Matrix + tempstring := 'for jj := 1 to ' + inttostr(farrays[arraynum].numRow) + + ' do for kk := 1 to ' + inttostr(farrays[arraynum].numcol) + + ' do ' + RemoveArrayIndex(ftempstate[i].symbol) + + '[jj,kk] := tstat[' + inttostr(i) + + ' + (jj-1)*' + inttostr(farrays[arraynum].numcol) + '+kk-1].value;'; + fEquations.Insert(toline + linecount, tempstring); + i := i + farrays[arraynum].numRow*farrays[arraynum].numcol; + end; + end; + linecount := linecount + 1; + until i = ftempmodeldef.numstate + 1; + + // Parameters + toline := LineSearch(fEquations, ' copy the value of the first parameter'); + toline := toline + 2; + for i := 1 to 2 do fEquations.Delete(toline); // Delete the example. + i := ftempmodeldef.numstate + 1; + repeat + if ftempprocess[i].parameters > 0 then + begin + fEquations.Insert(toline, + 'npar:=ParCount(ModelDef.numstate + ' + + inttostr(i-ftempmodeldef.numstate) + ');'); + toline := toline + 1; + if ftempprocess[i].name[1] <> '*' then // Not an array variable + begin + numprevpar := ParCount(i); + for j := 1 to ftempprocess[i].parameters do + begin + begin + fEquations.Insert(toline, + ftemppar[numprevpar + j].symbol + ' := par[npar + ' + + inttostr(j) + '].value;'); + toline := toline + 1; + end; + end; + fEquations.Insert(toline + 1, ' '); + toline := toline + 1; + i := i + 1; + end + else // An array or matrix variable + begin + numprevpar := ParCount(i); + arraynum := GetArrayNum(ftempprocess[i].name); + if farrays[arraynum].numcol = 0 then // An array + begin + ipar := 0; + repeat + ipar:=ipar+1; + tempstring := 'for jj := 1 to ' + + inttostr(farrays[arraynum].numRow) + ' do ' + + RemoveArrayIndex(ftemppar[numprevpar + farrays[arraynum].numRow*(ipar-1) + 1].symbol) + + '[jj] := par[npar + ' + + inttostr(farrays[arraynum].numRow) + '*' + inttostr(ipar-1) + ' + jj].value;'; + fEquations.Insert(toline, tempstring); + toline := toline + 1; + until ipar >= farrays[arraynum].NumUniqueParam; + fEquations.Insert(toline + 1, ' '); + toline := toline + 1; + i := i + farrays[arraynum].numRow; + end + else // A matrix + begin + ipar := 0; + repeat + ipar:=ipar+1; + tempstring := 'for jj := 1 to ' + inttostr(farrays[arraynum].numRow) + + ' do for kk := 1 to ' + inttostr(farrays[arraynum].numCol) + ' do ' + + RemoveArrayIndex(ftemppar[numprevpar + farrays[arraynum].numcol*farrays[arraynum].numRow*(ipar-1) + 1].symbol) + + '[jj, kk] := par[npar + ' + inttostr(farrays[arraynum].Numcol) + '*' + + inttostr(farrays[arraynum].numRow) + '*' + inttostr(ipar-1) + ' + (jj-1)*' + + inttostr(farrays[arraynum].numcol) + ' + kk].value;'; + fEquations.Insert(toline, tempstring); + toline := toline + 1; + until ipar >= farrays[arraynum].NumUniqueParam; + fEquations.Insert(toline + 1, ' '); + toline := toline + 1; + i := i + farrays[arraynum].numRow*farrays[arraynum].Numcol; + end; + end; + end + else + i := i + 1; + until i = ftempmodeldef.numprocess + 1; + +// Set all processes to -999 to catch undefined processes + for i:=1 to ftempmodeldef.numprocess do + begin + tempstring := ftempprocess[i].symbol; + tempstring := StringReplace(tempstring, '-', ',',[]); // Converts dashes in matrix notation to comma. + tempstring := tempstring + ' := -999;'; // This needs to be done after the replace so that the minus doesn't get replaced with a comma. + fEquations.Insert(toline, tempstring); + toline := toline+1; + end; + + // Enter the equations. + toline := LineSearch(fEquations, + '{ Enter the equations to calculate the processes here,'); + toline := toline + 2; + fEquations.Delete(toline); // Delete the example equation. + fromline1 := LineSearch(fModelDef, 'Equations'); + fromline2 := LineSearch(fModelDef, 'End Equations'); + +// Check for use of random function + i := fromline1+1; + WithinCalcDiscrete := False; + repeat + astring := fModelDef[i]; + if WithinCalcDiscrete = False then + if pos('CalculateDiscrete', astring) <> 0 then WithinCalcDiscrete := True; + posrandom := pos('random', astring); + if (posrandom <> 0) and (not WithinCalcDiscrete) then + raise Exception.Create('Random function can only be used within the CalculateDiscrete section.'); + i := i + 1; + until i = fromline2; + + numemptylines := 0; + i := 1; + repeat + tempstring := fModelDef[fromline1 + numemptylines + i]; + if tempstring <> 'End Equations' then + fEquations.Insert(toline + i, + fModelDef[fromline1 + numemptylines + i]); + i := i + 1; + until i + numemptylines >= fromline2 - fromline1; + +// Equations to calculate the derivatives + toline := LineSearch(fEquations, 'if tstat[1].HoldConstant'); + fromline1 := LineSearch(fModelDef, 'Derivatives'); + + CheckDerivatives(fromline1); + // Delete the example code + for i := 0 to 3 do fEquations.Delete(toline); + + // Write the derivatives + numemptylines := 0; + linecount := 1; + i := 1; + repeat + repeat + tempstring := fModelDef[fromline1 + numemptylines + linecount]; + tempstring := trim(tempstring); + linecount := linecount + 1; + until tempstring <> ''; + if ftempstate[i].name[1] <> '*' then // Not an array variable + begin + fEquations.Insert(toline, 'if (tstat[' + inttostr(i) + + '].HoldConstant) and (FmOptions.RunOptions.HoldStatesConstant) then'); + fEquations.Insert(toline + 1, ' ' + ftempprocess[i].symbol + + ' := 0'); + fEquations.Insert(toline + 2, 'else'); + fEquations.Insert(toline + 3, ' ' + + fModelDef[fromline1 + numemptylines + linecount - 1]); + fEquations.Insert(toline + 4, ' '); + toline := toline + 5; + i := i + 1; + end + else // An array or matrix variable + begin + arraynum := GetArrayNum(ftempstate[i].name); + tempstring2 := ftempprocess[i].symbol; + num := pos('[', tempstring2); + delete(tempstring2, num, length(tempstring2) - num + 1); + if farrays[arraynum].numcol = 0 then // Array + begin + fEquations.Insert(toline, 'for jj := 1 to ' + + inttostr(farrays[arraynum].numRow) + ' do'); + fEquations.Insert(toline + 1, 'begin'); + fEquations.Insert(toline + 2, ' if (tstat[' + inttostr(i - 1) + + ' + jj].HoldConstant) and (FmOptions.RunOptions.HoldStatesConstant) then'); + fEquations.Insert(toline + 3, ' ' + tempstring2 + + '[jj] := 0'); + fEquations.Insert(toline + 4, ' else'); + fEquations.Insert(toline + 5, ' ' + + fModelDef[fromline1 + numemptylines + linecount - 1]); + fEquations.Insert(toline + 6, 'end;'); + fEquations.Insert(toline + 7, ' '); + toline := toline + 8; + i := i + farrays[arraynum].numRow; + end + else // Matrix + begin + fEquations.Insert(toline, 'for jj := 1 to ' + + inttostr(farrays[arraynum].numRow) + ' do for kk:=1 to ' + + inttostr(farrays[arraynum].numcol) + ' do'); + fEquations.Insert(toline + 1, 'begin'); + fEquations.Insert(toline + 2, ' if (tstat[' + inttostr(i) + + ' + (jj-1)*' + inttostr(farrays[arraynum].Numcol) + + '+kk-1].HoldConstant) and (FmOptions.RunOptions.HoldStatesConstant) then'); + fEquations.Insert(toline + 3, ' ' + tempstring2 + + '[jj,kk] := 0'); + fEquations.Insert(toline + 4, ' else'); + fEquations.Insert(toline + 5, ' ' + + fModelDef[fromline1 + numemptylines + linecount - 1]); + fEquations.Insert(toline + 6, 'end;'); + fEquations.Insert(toline + 7, ' '); + toline := toline + 8; + i := i + farrays[arraynum].numRow*farrays[arraynum].numcol; + + end; + end; + until i = ftempmodeldef.numstate + 1; + +// Copy the new values from the local variables back into the global farrays. + // State variables + toline := LineSearch(fEquations, 'tstat[1].value := '); + fEquations.Delete(toline); // Delete the example. + + i := 1; + linecount := 1; + repeat + if ftempstate[i].name[1] <> '*' then // Not an array variable + begin + fEquations.Insert(toline + linecount - 1, 'tstat[' + inttostr(i) + + '].value := ' + ftempstate[i].symbol + ';'); + i := i + 1; + end + else // An array or matrix variable + begin + arraynum := GetArrayNum(ftempstate[i].name); + tempstring2 := ftempstate[i].symbol; + num := pos('[', tempstring2); + delete(tempstring2, num, length(tempstring2) - num + 1); + if farrays[arraynum].numcol=0 then // Array + begin + fEquations.Insert(toline + linecount - 1, 'for jj := 1 to ' + + inttostr(farrays[arraynum].numRow) + ' do tstat[' + inttostr(i-1) + + ' + jj].value := ' + tempstring2 + '[jj];'); + i := i + farrays[arraynum].numRow; + end + else // Matrix + begin + fEquations.Insert(toline + linecount - 1, 'for jj := 1 to ' + + inttostr(farrays[arraynum].numRow) + ' do for kk := 1 to ' + + inttostr(farrays[arraynum].numcol) + ' do tstat[' + inttostr(i) + + ' + (jj-1)*' + inttostr(farrays[arraynum].Numcol) + '+kk-1].value := ' + tempstring2 + '[jj,kk];'); + i := i + farrays[arraynum].numRow*farrays[arraynum].Numcol; + end; + end; + linecount := linecount + 1; + until i = ftempmodeldef.numstate + 1; + + // State variable derivatives + toline := LineSearch(fEquations, 'tproc[1].value := '); + fEquations.Delete(toline); // Delete the example. + + i := 1; + linecount := 1; + repeat + if ftempstate[i].name[1] <> '*' then // Not an array variable + begin + fEquations.Insert(toline + linecount - 1, 'tproc[' + inttostr(i) + + '].value := ' + ftempprocess[i].symbol + ';'); + i := i + 1; + end + else // An array or matrix variable + begin + arraynum := GetArrayNum(ftempstate[i].name); + tempstring2 := ftempprocess[i].symbol; + num := pos('[', tempstring2); + delete(tempstring2, num, length(tempstring2) - num + 1); + if farrays[arraynum].numcol=0 then // Array + begin + fEquations.Insert(toline + linecount - 1, 'for jj := 1 to ' + + inttostr(farrays[arraynum].numRow) + ' do tproc[' + inttostr(i-1) + + ' + jj].value := ' + tempstring2 + '[jj];'); + i := i + farrays[arraynum].numRow; + end + else // Matrix + begin + fEquations.Insert(toline + linecount - 1, 'for jj := 1 to ' + + inttostr(farrays[arraynum].numRow) + ' do for kk := 1 to ' + + inttostr(farrays[arraynum].numcol) + ' do tproc[' + inttostr(i) + + ' + (jj-1)*' + inttostr(farrays[arraynum].Numcol) + '+kk-1].value := ' + tempstring2 + '[jj,kk];'); + i := i + farrays[arraynum].numRow*farrays[arraynum].Numcol; + end; + end; + linecount := linecount + 1; + until i = ftempmodeldef.numstate + 1; + + // Processes + toline := LineSearch(fEquations, 'tproc[ModelDef.numstate + 1].value :='); + fEquations.Delete(toline); // Delete the example. + + i := 1; + linecount := 1; + repeat + if ftempprocess[ftempmodeldef.numstate + i].name[1] <> '*' then // Not an array variable + begin + fEquations.Insert(toline + linecount - 1, 'tproc[ModelDef.numstate + ' + + inttostr(i) + '].value := ' + + ftempprocess[ftempmodeldef.numstate + i].symbol + ';'); + i := i + 1; + end + else + begin + arraynum := GetArrayNum(ftempprocess[ftempmodeldef.numstate + i].name); + if farrays[arraynum].numcol = 0 then // An array + begin + fEquations.Insert(toline + linecount - 1, 'for jj := 1 to ' + + inttostr(farrays[arraynum].numRow) + ' do tproc[ModelDef.numstate + ' + + inttostr(i - 1) + ' + jj].value := ' + + RemoveArrayIndex(ftempprocess[ftempmodeldef.numstate + i].symbol) + '[jj];'); + i := i + farrays[arraynum].numRow; + end + else // A matrix not an array + begin + fEquations.Insert(toline + linecount - 1, 'for jj := 1 to ' + + inttostr(farrays[arraynum].numrow{numcol}) + ' do for kk := 1 to ' + + inttostr(farrays[arraynum].numcol{numrow}) + ' do tproc[ModelDef.numstate + ' + + inttostr(i - 1) + ' + (jj{kk}-1)*' + inttostr(farrays[arraynum].numcol) + ' + kk{jj}].value := ' + + RemoveArrayIndex(ftempprocess[ftempmodeldef.numstate + i].symbol) + '[jj,kk];'); + i := i + farrays[arraynum].numRow*farrays[arraynum].numcol; + end; + end; + linecount := linecount + 1; + until i = ftempmodeldef.numprocess - ftempmodeldef.numstate + 1; +end; + + +{ Searches tempmemo for the string Sstring and returns the line number + containing Sstring. } +function TFmMain.Linesearch(AstringList: Tstringlist; Sstring:string):integer; +var + i,temp:integer; +begin + i := 0; + temp := 0; + while (i < AstringList.count - 1) and (temp = 0) do + begin + temp := pos(Sstring,AstringList[i]); + i := i + 1; + end; + linesearch := i - 1; +end; + +{ Divides the string, fromString, into two parts at the string, divider. Returns + either the beginning or the end of the string based on the value of WhichPart. + The string divider is not included in either part. } +function TFmMain.DivideString(fromString, divider:string; + WhichPart:TPart):string; +var + whereDivide, slength: integer; +begin + whereDivide := pos(divider, fromString); + slength := length(fromString); + if WhichPart = stBeginning then + begin + delete(fromString,whereDivide,slength-whereDivide+1); + fromString := trim(fromString); + end + else + begin + delete(fromString,1,whereDivide); + fromString := trim(fromString); + end; + DivideString := fromString; +end; + +{ Separates tstring into the name, units, symbol, and npar using a comma as delimiter. } +function TFmMain.ParseString(acsvstring: string; vtype: TVarType): TVarInfo; +var + tempstring: Tstringlist; + newmVar: TVarInfo; +begin +newmVar.vType:=vtype; +tempstring:=Tstringlist.create; +try + tempstring.Delimiter:=','; + tempstring.StrictDelimiter:=true; + tempstring.DelimitedText:=acsvstring; + + newmVar.Name:=trim(tempstring[0]); + newmVar.Units:=trim(tempstring[1]); + newmVar.Symbol:=trim(tempstring[2]); + +// Check for unflagged array/matrix variables + if (vtype<>vtprocess) and (tempstring.Count>3) and (newmVar.Name[1]<>'*') then + raise Exception.Create('Inconsistent variable description. Variable, '+ newmVar.Name + + ', is listed as an array or matrix but does not begin with *') + else if (tempstring.count>4) and (newmVar.Name[1]<>'*') then + raise Exception.Create('Inconsistent variable description. Variable, '+ newmVar.Name + + ', is listed as an array or matrix but does not begin with *'); + +// Array variable? + if newmVar.Name[1]='*' then + newmVar.IsArray:=true + else + newmVar.IsArray:=false; + + if vtype<>vtprocess then // Not a process variable + begin + if not newmVar.IsArray then + begin + newmVar.numParam:=0; + newmVar.numRow:=0; + newmVar.numCol:=0; + end + else // An array + begin + newmVar.numParam:=0; + if tempstring.Count<4 then // Missing array specification + raise Exception.Create('Missing number of array elements for variable '+ newmVar.Name + '.') + else + begin + newmVar.numRow:=strtoint(tempstring[3]); + if tempstring.Count=5 then + newmVar.numCol:=strtoint(tempstring[4]) + else + newmVar.numCol:=0; + end; + end; + end + else // A process + begin + newmVar.numParam:=strtoint(tempstring[3]); + if tempstring.Count>4 then // An array or matrix + begin + newmVar.numRow:=strtoint(tempstring[4]); + if tempstring.Count=6 then + newmVar.numCol:=strtoint(tempstring[5]) + else + newmVar.numCol:=0; + end + else + begin + newmVar.numRow:=0; + newmVar.numCol:=0; + end; + end; + + ParseString:=newmVar; +finally + if assigned(tempstring) then FreeandNil(tempstring); +end; +end; + +{procedure TFmMain.ParseString(var acsvstring, vname, vunits, vsymbol: string; + var npar:integer; var nrow, ncol: integer); +var + num, num2:integer; + tstring2:string; +begin + // Initialize variables that don't always get assigned so that that they are always defined on return + tnpar := 0; + tptype := ptGroup1; + tnrow := 0; + tncol := 0; + + num := pos(',',tstring); // Name + tname := DivideString(tstring, ',', stBeginning); + delete(tstring, 1, num); + + num := pos(',',tstring); // Units + tunits := DivideString(tstring, ',', stBeginning); + delete(tstring, 1, num); + + num := pos(',', tstring); // Symbol + tsymbol := DivideString(tstring, ',', stBeginning); + + if num <> 0 then // An array or matrix variable, a process, or both. + begin + delete(tstring, 1, num); + + // Check for the word 'group' to determine if this is a process or not + num2 := pos('group',lowercase(tstring)); + if num2 = 0 then // Not a process but an array or matrix variable + begin + num := pos(',',tstring); + if num = 0 then + begin + tnrow := strtoint(DivideString(tstring, ',', stBeginning)); + end + else + begin + tnrow := strtoint(DivideString(tstring, ',', stBeginning)); + delete(tstring, 1, num); + tncol := strtoint(DivideString(tstring, ',', stBeginning)); + end; + end + else + begin + num := pos(',',tstring); + tnpar := strtoint(DivideString(tstring, ',', stBeginning)); + delete(tstring, 1, num); + + tstring2 := DivideString(tstring, ',', stBeginning); + num2 := length('Group'); + delete(tstring2, 1, num2); + try + num2 := strtoint(tstring2); + case num2 of + 1: tptype := ptGroup1; + 2: tptype := ptGroup2; + 3: tptype := ptGroup3; + 4: tptype := ptGroup4; + 5: tptype := ptGroup5; + else + tptype := ptGroup1; + end; + except on E: Exception do + tptype := ptGroup1; + end; + num := pos(',',tstring); + if num = 0 then delete(tstring,pos('group',lowercase(tstring)),8) + else delete(tstring,1,num); + + num := pos(',', tstring); + if (num <> 0) then // A process array or matrix + begin + tnrow := strtoint(DivideString(tstring, ',', stBeginning)); + delete(tstring, 1, num); + + num := length(trim(tstring)); + if num <> 0 then tncol := strtoint(tstring); + end + else if (length(trim(tstring)) <> 0) then + begin + tnrow := strtoint(tstring); + end; + end; + end; +end; } + +{This function counts the parameters in all processes less than processnum.} +function TFmMain.ParCount(processnum:integer):integer; +var + NumberofParams, counter : integer; +begin + NumberofParams := 0; + for counter := ftempmodeldef.numstate + 1 to processnum - 1 do + begin + NumberofParams := NumberofParams + ftempprocess[counter].parameters; + end; + ParCount := NumberofParams; +end; // end of parcount function + +procedure TFmMain.BtnCloseClick(Sender: TObject); +begin + FmMain.Close; +end; + +procedure TFmMain.FormCreate(Sender: TObject); +begin + fResourcePath := GetResourcePath(); + fvarlist := Tstringlist.Create; + fvarlist.Sorted:=True; + fvarlist.Duplicates:=dupError; + // Set the default model path to the folder CrEquations is in. + {$ifdef Darwin} + fModelPath:=fResourcePath; + delete(fModelPath,pos(BundleResourceDirectory,fResourcePath),length(BundleResourceDirectory)); + {$else} // Windows, Unix + fModelPath:=fResourcePath; + {$endif} + DlgOpenModelDef.InitialDir := fModelPath; + fEquationsFilename := fResourcePath + 'equationsblank.pas'; + DlgOpenEqPas.InitialDir:= fResourcePath; +end; + +procedure TFmMain.FormDestroy(Sender: TObject); +begin + fvarlist.Free; +end; + +function TFmMain.GetArrayNum(varname:string): integer; +var + i, number:integer; +begin + number := pos('-',varname); + if number <> 0 then + begin + if isdigit(varname,number-2) then delete(varname,number-2,length(varname)) + else delete(varname,number-1,length(varname)); + end + else + begin + number := length(varname); + delete(varname,number,1); + end; + + number := 0; + for i := 1 to fTotalNumArrays do + begin + if varname = farrays[i].VarName then number := i; + end; + if number = 0 then + begin + delete(varname,length(varname),1); + for i := 1 to fTotalNumArrays do + if varname = farrays[i].varname then number := i; + end; + + if number <> 0 then + GetArrayNum := number + else + raise Exception.Create('Could not find variable, "' + varname + '" in arrays array.'); +end; + +procedure TFmMain.GetFunctions; +var + fromline, toline, numsourcelines, i: integer; +begin + fromline := LineSearch(fModelDef, 'Functions'); + toline := LineSearch(fModelDef, 'End Functions'); + numsourcelines := toline - fromline; + + toline := LineSearch(fEquations,'{ Functions or procedures }'); + if numsourcelines > 3 then + begin + i := 1; + repeat + fEquations.Insert(toline + i, fModelDef[fromline + i]); + i := i + 1; + until i = numsourcelines; + end; +end; + +function TFmMain.CheckDerivatives(fline: integer): integer; +var + i, j, arraynum: integer; + tempstring, tempstring2: string; +begin + i := 1; + fline := fline + 1; + repeat + repeat + tempstring := fModelDef[fline]; + fline := fline + 1; + until tempstring <> ''; + j := pos(':',tempstring); + delete(tempstring, j, length(tempstring)-j+1); + tempstring := trim(tempstring); + if ftempprocess[i].name[1] = '*' then // An array or matrix + begin + arraynum := GetArrayNum(ftempstate[i].name); + j := pos('[',tempstring); + delete(tempstring, j, length(tempstring)-j+1); + + tempstring2 := ftempprocess[i].symbol; + j := pos('[',tempstring2); + delete(tempstring2, j, length(tempstring2)-j+1); + + if lowercase(tempstring2) <> lowercase(tempstring) then + raise Exception.Create('Derivatives out of order. Model translation failed.'); + if farrays[arraynum].Numcol = 0 then // Array + begin + i := i + farrays[arraynum].numRow; + end + else // Matrix + begin + i := i + farrays[arraynum].numRow*farrays[arraynum].Numcol; + end; + end + else + begin + if lowercase(ftempprocess[i].symbol) <> + lowercase(tempstring) then + raise Exception.Create('Derivatives out of order. Model translation failed.'); + i := i + 1; + end; + until i = ftempmodeldef.numstate + 1; + CheckDerivatives := 1; +end; + +function TFmMain.RemoveTrailingComma(lnum: integer): integer; +var + tempstring: string; + ll: integer; +begin + RemoveTrailingComma := 0; + tempstring := fEquations[lnum]; + tempstring := trim(tempstring); + ll := length(tempstring); + if tempstring[ll] = ',' then delete(tempstring, ll, 1); + fEquations[lnum] := tempstring; + RemoveTrailingComma := 1; +end; + +procedure TFmMain.RemoveFinalDouble; +var + ll: integer; +begin + ll := LineSearch(fEquations,':double; {Final double}'); + fEquations[ll] := ''; +end; + +function TFmMain.RemoveArrayIndex(tstring: string): string; +var + i: integer; +begin + i := pos('[', tstring); + delete(tstring, i, length(tstring) - 1); + RemoveArrayIndex := tstring; +end; + +function TFmMain.GetResourcePath(): string; +{$ifdef Darwin} +var + pathRef:CFURLRef; + pathCFStr: CFStringRef; + pathStr: shortstring; +{$endif} +begin +{$ifdef Unix} +{$ifdef Darwin} + pathRef := CFBundleCopyBundleURL(CFBundleGetMainBundle()); + pathCFStr := CFURLCopyFileSystemPath(pathRef, kCFURLPOSIXPathStyle); + CFStringGetPascalString(pathCFStr, @pathStr, 255, CFStringGetSystemEncoding()); + CFRelease(pathRef); + CFRelease(pathCFStr); + + Result := pathStr + BundleResourceDirectory; +{$else} + Result := DefaultUnixDirectory; +{$endif} +{$else} // Windows + Result := ExtractFilePath(Application.exeName); +{$endif} +end; + +function TFmMain.IsDigit(astring:string; index:integer): Boolean; +begin + result := False; + case astring[index] of + '0'..'9': result := True; + end; + +end; + + +procedure TFmMain.DefBooleanVar; +var + i, j, fromline:integer; + avar: TvarInfo; + tempstring: string; +begin + fromline := LineSearch(fModelDef, 'Boolean Variables'); + // Advance 2 lines in the memo to get to the variable list + fromline := fromline + 2; + tempstring := fModelDef[fromline]; + repeat + tempstring := fModelDef[fromline]; + tempstring := trim(tempstring); + fromline := fromline + 1; + until (tempstring <> '') or (fromline > fModelDef.Count); + i := 1; + while tempstring <> 'End' do + begin + avar:=ParseString(tempstring,vtBoolean); + // ParseString(tempstring, tname, tunits, tsymbol, tnpar, tptype, tnrow, tncol); + if avar.Name[1] <> '*' then // Not an array variable + begin + ftempBoolean[i].name := avar.Name; + ftempBoolean[i].units := avar.Units; + ftempBoolean[i].symbol := avar.Symbol; + i := i + 1; + end + else // An array variable + begin + for j := 1 to avar.numRow do + begin + ftempBoolean[i + j - 1].name := avar.Name + inttostr(j); + ftempBoolean[i + j - 1].units := avar.Units; + ftempBoolean[i + j - 1].symbol := avar.Symbol; + end; + farrays[fTotalNumArrays].VarName := avar.Name; // Used in createprocessesproc procedure + farrays[fTotalNumArrays].numRow := avar.numRow; + fTotalNumArrays := fTotalNumArrays + 1; + if fTotalNumArrays > MaxArrays then + raise Exception.Create('Too many arrays. Increase MaxArrays.'); + i := i + avar.numRow; + end; + repeat + tempstring := fModelDef[fromline]; + tempstring := trim(tempstring); + fromline := fromline + 1; + until tempstring <> ''; + end; + numBoolean := i - 1; +end; + +end. + diff --git a/modelshell/create_equations/equationsblank.pas b/modelshell/create_equations/equationsblank.pas new file mode 100644 index 0000000..314b93a --- /dev/null +++ b/modelshell/create_equations/equationsblank.pas @@ -0,0 +1,302 @@ +{ This unit defines the structure of the model. There are four functions. The + first function, called counts, defines the number, names, and units of the + model, the state variables, the process variables, the driver variables and + the parameters. The second function, called processes, is the actual equations + which make up the model. The third function, derivs, calculates the + derivatives of state variables. And the fourth function, parcount, is used to + automatically number the parameters consecutively. + The state variables, driver variables, process variables and parameters are + all stored in global arrays, called stat, drive, proc, and par, respectively. + The function counts accesses the global arrays directly but the other functions + operate on copies of the global arrays. } +unit equations; + +interface + +uses stypes, math, sysutils; + +PROCEDURE counts; +PROCEDURE processes(time:double; dtime:double; var tdrive:drivearray; + var tpar:paramarray; var tstat:statearray; + var tproc:processarray; CalculateDiscrete:Boolean); +PROCEDURE derivs(t, drt:double; var tdrive:drivearray; var tpar:paramarray; + var statevalue:yValueArray; VAR dydt:yValueArray); +function ParCount(processnum:integer) : integer; + +var + tproc:processarray; + tstat:statearray; + sensflag:boolean; + newyear:Boolean = false; + DayofYear: double = 0; + h: array[1..4,1..4] of double; + +implementation + +uses frontend, calculate, options; + + { Do not make modifcations above this line. } +{*****************************************************************************} + +{ This procedure defines the model. The number of parameters, state, driver and + process variables are all set in this procedure. The model name, version + number and time unit are also set here. This procedure accesses the global + arrays containing the the parameters, state, driver and process variables and + the global structure ModelDef directly, to save memory space. } +PROCEDURE counts; +var + i,npar,CurrentProc:integer; +begin +{ Set the modelname, version and time unit. } +ModelDef.modelname := 'Blank'; +ModelDef.versionnumber := '1.0.0'; +ModelDef.timeunit := 'days'; +ModelDef.contactperson := 'Your Name'; +ModelDef.contactaddress1 := 'Address line 1'; +ModelDef.contactaddress2 := 'Address line 2'; +ModelDef.contactaddress3 := 'Address line 3'; + +{ Set the number of state variables in the model. The maximum number of state + variables is maxstate, in unit stypes. } +ModelDef.numstate := 1; + +{ Enter the name, units and symbol for each state variable. The maximum length + of the state variable name is 17 characters and the maximum length for units + and symbol is stringlength (specified in unit stypes) characters. } + +with stat[1] do + begin + name:='X'; units:='g'; symbol := 'X'; + end; + +{ Set the total number of processes in the model. The first numstate processes + are the derivatives of the state variables. The maximum number of processes is + maxparam, in unit stypes. } +ModelDef.numprocess := ModelDef.numstate + 105; + +{ For each process, set proc[i].parameters equal to the number of parameters + associated with that process, and set IsDiscrete to true or false. After each + process, set the name, units, and symbol for all parameters associated with + that process. Note that Parcount returns the total number of parameters in + all previous processes. } +CurrentProc := ModelDef.numstate + 1; +With proc[CurrentProc] do + begin + name := 'Process'; + units := 'g day-1'; + symbol := 'P'; + parameters := 1; + ptype := ptMisc; + IsDiscrete := False; + end; +npar:=ParCount(CurrentProc); +with par[npar+1] do + begin + name:='a'; units := 'day-1'; symbol := 'a'; + end; + +{ Set the total number of drivers in the model. The maximum number of drivers is + maxdrive, in unit stypes. } +ModelDef.numdrive := 1; + +{ Set the names, units, and symbols of the drivers. The maximum length for the + name, units and symbol is 20 characters. } +with drive[1] do + begin + name := 'Forcing variable'; units := 'g day-1'; symbol := 'F'; + end; + +{ The first numstate processes are the derivatives of the state variables. The + code sets the names, units and symbols accordingly.} +for i:= 1 to ModelDef.numstate do proc[i].name:='d'+stat[i].name+'dt'; +for i:= 1 to ModelDef.numstate do proc[i].units := stat[i].units + 't-1'; +for i:= 1 to ModelDef.numstate do proc[i].symbol := 'd' + stat[i].symbol + 'dt'; + +{ Code to sum up the total number of parameters in the model. Do not change the + next few lines. } +ModelDef.numparam := 0; +for i := 1 to ModelDef.NumProcess do + ModelDef.numparam := ModelDef.numparam + proc[i].parameters; + +end; // counts procedure + + +{ A procedure to calculate the value of all states and processes at the current + time. This function accesses time, state variables and process variables by + reference, ie it uses the same array as the calling routine. It does not use + the global variables time, stat and proc because values calculated during + integration might later be discarded. It does access the global variables par, + drive and ModelDef directly because those values are not modified. + + The model equations are written using variable names which correspond to the + actual name instead of using the global arrays (i.e. SoilWater instead of + stat[7].value). This makes it necessary to switch all values into local + variables, do all the calculations and then put everything back into the + global variables. Lengthy but worth it in terms of readability of the code. } + +// Choose either GlobalPs, ArcticPs, or none here so the appropriate Ps model is compiled below. +{$DEFINE none} + +PROCEDURE processes(time:double; dtime:double; var tdrive:drivearray; + var tpar:paramarray; var tstat:statearray; + var tproc:processarray; CalculateDiscrete:Boolean); +{$IFDEF GlobalPs} +const +// Global Ps parameters + x1 = 11.04; x2 = 0.03; + x5 = 0.216; x6 = 0.6; + x7 = 3.332; x8 = 0.004; + x9 = 1.549; x10 = 1.156; + gammastar = 0; kCO2 = 995.4; } +{$ENDIF} + +// Modify constant above (line above "procedure processes..." line )to specify +// which Ps model and it's constants should be compiled. Choosing a Ps model +// automatically includes the Et and Misc constants (i.e. Gem is assumed). + +{$IFDEF ArcticPs} +const +// Arctic Ps parameters +x1 = 0.192; x2 = 0.125; +x5 = 2.196; x6 = 50.41; +x7 = 0.161; x8 = 14.78; +x9 = 1.146; +gammastar = 0.468; kCO2 = 500.3; +{$ENDIF} + +{$IFDEF ArcticPs OR GlobalPs} +//const +// General Et parameters +aE1 = 0.0004; aE2 = 150; aE3 = 1.21; aE4 = 6.11262E5; + +// Other constants +cp = 1.012E-9; //specific heat air MJ kg-1 oC-1 +sigmaSB = 4.9e-9; //stefan-Boltzmann MJ m-2 day-1 K-4 +S0 = 117.5; //solar constant MJ m-2 day-1 +bHI1 =0.23; +bHI2 =0.48; +mw = 2.99; //kg h2o MJ-1 +alphaMS = 2; //mm oC-1 day-1 } +{$ENDIF} + +var +{ List the variable names you are going to use here. Generally, this list + includes all the symbols you defined in the procedure counts above. The order + in which you list them does not matter. } +{States} +X,dXdt, + +{processes and associated parameters} +P, a, + +{drivers} +F, + +{Other double} +O + +:double; {Final double} + +{Other integers} +npar, j, jj, kk, tnum:integer; + +{ Boolean Variables } + + +{ Functions or procedures } + +begin +{ Copy the drivers from the global array, drive, into the local variables. } +F := tdrive[1].value; + +{ Copy the state variables from the global array into the local variables. } +X := tstat[1].value; + +{ And now copy the parameters into the local variables. No need to copy the + processes from the global array into local variables. Process values will be + calculated by this procedure. + + Copy the parameters for each process separately using the function ParCount + to keep track of the number of parameters in the preceeding processes. + npar now contains the number of parameters in the preceding processes. + copy the value of the first parameter of this process into it's local + variable } +npar:=ParCount(ModelDef.numstate+1); +a := par[npar+1].value; + +{ Enter the equations to calculate the processes here, using the local variable + names defined above. } +P:=a*X; + +if CalculateDiscrete then +begin +// Add any discrete processes here +end; //discrete processes + + +{ Now calculate the derivatives of the state variables. If the holdConstant + portion of the state variable is set to true then set the derivative equal to + zero. } +if tstat[1].HoldConstant = False then + dXdt := dXdt:=F-P // Enter the equation for the derivative here. +else + dXdt := 0; // Set derivative equal to zero. + +{ Now that the calculations are complete, assign everything back into the arrays + so the rest of the code can access the values calculated here. (Local variables + are destroyed at the end of the procedure). + + Put the state variables back into the global arrays in case the state variable + was manually changed in this procedure (e.g. discrete state variables or steady state + calculations). } +tstat[1].value := X; + +{ Put all process values into process variable array. The first numstate + processes are the derivatives of the state variables (Calculated above).} +tproc[1].value := dXdt; + +{ Now the remaining processes. Be sure to number the processes the same here as + you did in the procedure counts above. } +tproc[ModelDef.numstate + 1].value := P; + +end; // End of processes procedure + + + { Do not make any modifications to code below this line. } +{****************************************************************************} + + +{This function counts the parameters in all processes less than processnum.} +function ParCount(processnum:integer) : integer; +var + NumberofParams, counter : integer; +begin + NumberofParams := 0; + for counter := ModelDef.numstate + 1 to processnum - 1 do + NumberofParams := NumberofParams + proc[counter].parameters; + ParCount := NumberofParams; +end; // end of parcount function + +{ This procedure supplies the derivatives of the state variables to the + integrator. Since the integrator deals only with the values of the variables + and not there names, units or the state field HoldConstant, this procedure + copies the state values into a temporary state array and copies the value of + HoldConstant into the temporary state array and passes this temporary state + array to the procedure processes. } +PROCEDURE derivs(t, drt:double; var tdrive:drivearray; var tpar:paramarray; + var statevalue:yValueArray; VAR dydt:yValueArray); +var + i:integer; + tempproc:processarray; + tempstate:statearray; +begin + tempstate := stat; // Copy names, units and HoldConstant to tempstate + // Copy current values of state variables into tempstate + for i := 1 to ModelDef.numstate do tempstate[i].value := statevalue[i]; + // Calculate the process values + processes(t, drt, tdrive, tpar, tempstate, tempproc, false); + // Put process values into dydt array to get passed back to the integrator. + for i:= 1 to ModelDef.numstate do dydt[i]:=tempproc[i].value; +end; // end of derivs procedure + +end. diff --git a/modelshell/create_equations/stypes.pas b/modelshell/create_equations/stypes.pas new file mode 100644 index 0000000..116f976 --- /dev/null +++ b/modelshell/create_equations/stypes.pas @@ -0,0 +1,257 @@ +{ This file defines new variable types and sets the limits on the various arrays + used in the model code. All units should include this file. } +unit stypes; + +interface + +uses sysutils, classes; + +const + maxstate = 150; // The maximum number of state variables. The state variable + // array contains maxstate elements. + maxdrive = 75; // The maximum number of driver variables. + maxprocess = maxstate + 350; // The maximum number of process variables. + maxparam = 500; // The maximum number of parameters. + maxresults = 102; + maxtreatments = 8; + stringlength = 25; + maxVarObserved = 100; + maxTimeMeasure = 100; + maxmatrix = 10000; + +type + Tshortstring = string[stringlength]; + processtype = (ptGroup1, ptGroup2, ptGroup3, ptGroup4, ptGroup5); +// processcolor = (clGreen, clTeal, clAqua, clBlue, clGray); + TModelDef = record // A structure used to hold the basic information + modelname:string; // about the model. Modelname is the name of + // model and appears on the title bar in the FmShellMain. + versionnumber:string; // Used to keep track of the version number of the model. + contactperson:string; // Used for the aboutbox + contactaddress1:string; // Used for the aboutbox + contactaddress2:string; // Used for the aboutbox + contactaddress3:string; // Used for the aboutbox + timeunit:string; // Timeunit is the time step of the model, ie day, year. + numdrive:integer; // Numparam, numdrive, numstate and numprocess are the + numstate:integer; // total number of parameters, drivers, state variables, + numprocess:integer; // and processes, respectively. + numparam:integer; + end; + + Tparamvariable = record // A structure to hold a parameter; it's name, value, + name:string; // and units. The name and units are for information + value:double; // only. They do not affect the running of the model. + units:string; // This structure type is also used for the + symbol:string; // driver variables. + end; + + Tstatevariable = record // A structure to hold a state variable; the name, + name:string; // value and units. As with Tparamvariable the name + value:double; // and units are for information only. HoldConstant + units:string; // determines if the state variable is held constant + symbol:string; // during the model run, i.e. dstatedt = 0. + HoldConstant:Boolean; + Reset:Boolean; + end; + + Tprocessvariable = record // A structure to hold a process variable; the + name:string; // name, value, and units. As above, the name and + value:double; // units are for information only. Parameters is + units:string; // number of parameters associated with this + symbol:string; // particular process. Every parameter must be + parameters:integer; // associated with a process. Ptype determines the + ptype:processtype; // color of the tab in the edit parameters page. + end; + + Tallstates = record + Cf:Tstatevariable; + Cw:Tstatevariable; + Cr:Tstatevariable; + Nf:Tstatevariable; + Nw:Tstatevariable; + Nr:Tstatevariable; + end; + + TCalSet = record + HaveRunInfo: Boolean; + ValidSet: Boolean; + rownum: integer; + Treatment: integer; + State: string; + StateIndex: integer; + Parameter: string; + ParamIndex: integer; + Alpha: double; + Beta: double; + DeltaPar: double; + end; + +// State variable array types. yValueArray, glindx and glpbynp are used during +// integration. They hold temporary values of the state variables and therefore +// don't need to be of type Tstatevariable. This saves memory. However they +// must be the same size as statearray. + yValueArray=array[1..maxstate] of double; + glindx = ARRAY [1..maxstate] OF integer; + glnpbynp = ARRAY [1..maxstate,1..maxstate] OF double; + statearray=array[1..maxstate] of Tstatevariable; +// Driver variable array type. Note that the type is Tparamvariable. + drivearray=array[1..maxdrive] of Tparamvariable; +// Parameter array type. + paramarray=array[1..maxparam] of Tparamvariable; +// Process variable array type. + processarray=array[1..maxprocess] of Tprocessvariable; + calsetarray = array[1..maxstate] of Tcalset; + stringarray = array[1..maxstate + 1] of string; + +// The types of data which can be displayed in the dataform + TDataType = (dtState, dtProcess, dtParameter); +// The possible axis' in the chart on the display form + TAxis = (axLeft, axBottom); +// The display options for the output data in the display form + TDisplayStyle = (dsChart, dsTable); +// The axis type for the chart on the display form + TAxisType = (tyLinear, tyLog); +// The type of variable being looked for in the arrays + TVarType = (vtDriver, vtState, vtParameter, vtProcess, vtBoolean, vtOther); + + TRunOptions = record + NormalRun: Boolean; + Time_step: double; + DiscreteStep: double; + RepeatDrivers: Boolean; + RepeatDriveTime: double; + ResetStates: Boolean; + ResetStateTime: double; + RuntoSS: Boolean; + SSCriteria: double; + SSTime: double; + HoldStatesConstant: Boolean; // Used in fuzzy calibrator + Outputstep: double; // The timestep specified by the user for output + Outputoffset: double; // No output for time less than outputoffset + OutputEORonly: Boolean; // output only if time = stop_time + Time_step + OutputAnnually: Boolean; + OutputAnnuallyDay: double; + AppendOutputFile: Boolean; + stepcounter: integer; + outcounter: integer; // The current number of timesteps since last output, output occurs when outcounter=outputfreq + OutputFile: Boolean; + errormult: integer; + end; + + TCalOptions = record + UseSecondOutFile: Boolean; + FinalOutFilename: string; + OrigOutputStep: double; + OrigOutputOffset: double; + OutputEORonly: Boolean; + caloutcounter: integer; + caloutputfreq: integer; + AppendFinalOutputFile: Boolean; + end; + + TTreatResults = record + Time: integer; + IndexList: array[1..Maxstate] of integer; + States: statearray; + end; + + TDerivSet = record + Time1: double; + States1: statearray; + Time2: double; + States2: statearray; + end; + + resultarray = array[1..maxresults] of TTreatResults; + + TTreatSet = record + drivefilename: string; + outputfilename: string; + timestart: double; + timestop: double; + Options: TRunOptions; + CalOptions: TCalOptions; + TotalMeasurements: integer; + measdata: resultarray; + currmeasurement: integer; + simdata: resultarray; + currdrive: drivearray; + currstate: statearray; + derivstates: TDerivSet; + NumCalSet: integer; + CalSetIndexList: array[1..maxstate] of integer; + FirstWrite: Boolean; + end; + + TreatSetarray = array[1..maxtreatments] of TTreatSet; + +// Ensemble Kalman Filter + EnKF2Dmat = array of array of double; + EnKFvec = array of double; + glindxEKF = array of integer; + mat = array[1..MaxMatrix] of double; + + TVariableIncluded = array of Boolean; + + TNameArray = array of string; + TTimeArray = array of double; + TDataArray = array of double; + T2dData = array of array of double; + // Rows are time points, columns are variables + + TPertData = array of double; + TPert = record + NumPert: integer; + Names: TNameArray; + Data: EnKF2Dmat; + end; + + TKstate = record + NumTotKalman: integer; + NumObservations: integer; + Names: TNameArray; + Units: TNameArray; + Symbol: TNameArray; + Time: TTimeArray; + Z: EnKF2dmat; + R: EnKF2dmat; + Xmean: T2dData; + Xmax: T2dData; + Xmin: T2dData; + Q: EnKF2Dmat; + Ymean: T2dData; + UnCorXmean: T2dData; + UncorXmax: T2dData; + UncorXmin: T2dData; + end; + +// Grid Shell Variables + TGridCellInfo = record + Row: integer; + Column: integer; + RunPosition: integer; + VegClass: integer; + SoilClass: integer; + ParamFilname: string; + Driverfilename: string; + OutputFilename: string; + end; + +// Errors + ERunTimeError = class(Exception); + EIntegratorError = class(ERunTimeError); + ETooManySteps = class(EIntegratorError); + EIntStepTooSmall = class(EIntegratorError); + EUserCancel = class(ERunTimeError); + ECalculateError = class(EMathError); + ECalcInitialProc = class(ECalculateError); + ECalcNewValue = class(ECalculateError); + ECalcNewProcess = class(ECalculateError); + EStepError = class(Exception); + EStepTooSmall = class(EStepError); + EStepTooLarge = class(EStepError); + EStepNotMultiple = class(EStepError); +implementation + +end. + diff --git a/modelshell/data.lfm b/modelshell/data.lfm new file mode 100644 index 0000000..5c4f246 --- /dev/null +++ b/modelshell/data.lfm @@ -0,0 +1,121 @@ +object DataForm: TDataForm + Left = 190 + Height = 292 + Top = 145 + Width = 733 + HorzScrollBar.Page = 560 + HorzScrollBar.Range = 560 + VertScrollBar.Page = 99 + VertScrollBar.Range = 99 + VertScrollBar.Visible = False + ActiveControl = StringGrid1 + ClientHeight = 292 + ClientWidth = 733 + Color = clBtnFace + DefaultMonitor = dmMainForm + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + OnCreate = FormCreate + Position = poOwnerFormCenter + LCLVersion = '1.6.4.0' + object PnlTop: TPanel + Left = 0 + Height = 49 + Top = 0 + Width = 733 + Align = alTop + ClientHeight = 49 + ClientWidth = 733 + TabOrder = 0 + object BtnOK: TButton + Left = 390 + Height = 20 + Top = 13 + Width = 71 + Caption = '&OK' + Default = True + ModalResult = 1 + OnClick = BtnOKClick + TabOrder = 0 + end + object BtnCancel: TButton + Left = 478 + Height = 20 + Top = 13 + Width = 81 + Cancel = True + Caption = '&Cancel' + ModalResult = 2 + OnClick = BtnCancelClick + TabOrder = 1 + end + object BtPrint: TButton + Left = 190 + Height = 19 + Top = 13 + Width = 61 + Caption = '&Print' + Enabled = False + OnClick = BtPrintClick + TabOrder = 2 + Visible = False + end + end + object StringGrid1: TStringGrid + Left = 0 + Height = 243 + Top = 49 + Width = 733 + Align = alClient + AutoAdvance = aaDown + ColCount = 6 + Columns = < + item + ButtonStyle = cbsCheckboxColumn + Title.Caption = 'Title' + ValueChecked = 'True' + ValueUnchecked = 'False' + end + item + ButtonStyle = cbsCheckboxColumn + Title.Caption = 'Title' + ValueChecked = 'True' + ValueUnchecked = 'False' + end + item + Title.Caption = 'Title' + end + item + Title.Caption = 'Title' + end + item + Title.Caption = 'Title' + end + item + Title.Caption = 'Title' + end> + DefaultColWidth = 150 + DefaultRowHeight = 25 + ExtendedSelect = False + FixedCols = 0 + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goDrawFocusSelected, goEditing] + ParentFont = False + TabOrder = 1 + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'Arial' + TitleStyle = tsStandard + OnCheckboxToggled = StringGrid1CheckboxToggled + OnDrawCell = StringGrid1DrawCell + OnSelectCell = StringGrid1SelectCell + end + object DlgPrint: TPrintDialog + Options = [poPageNums] + left = 160 + top = 8 + end +end diff --git a/modelshell/data.pas b/modelshell/data.pas new file mode 100644 index 0000000..ffe1b49 --- /dev/null +++ b/modelshell/data.pas @@ -0,0 +1,245 @@ +{ A form to view and edit data. Currently there are two types of data that can + be shown in this form, state variables and process variables. + The state variables form allows the user to view and edit the state variables. + The process variable form is used for viewing only. The user can not edit the + process variables directly. To change a process value it is necessary to + modify the parameters in the parameter form. The process values shown in this + form are automatically updated when the process values in the parameter form + are updated. + } +unit data; + +interface + +uses + SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Grids,stypes, StdCtrls, ExtCtrls, PrintersDlgs, math; + +type + + { TDataForm } + + TDataForm = class(TForm) + PnlTop: TPanel; + BtnOK: TButton; + BtnCancel: TButton; + DlgPrint: TPrintDialog; + BtPrint: TButton; + StringGrid1: TStringGrid; + procedure BtnOKClick(Sender: TObject); dynamic; + procedure BtPrintClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure ShowStates; + procedure SaveStates; + procedure ShowProcess; + procedure StringGrid1CheckboxToggled(sender: TObject; aCol, aRow: Integer; + aState: TCheckboxState); + procedure UpdateProcess; + procedure ClearGrid; + procedure BtnCancelClick(Sender: TObject); dynamic; + procedure StringGrid1SelectCell(Sender: TObject; Col, Row: Integer; + var CanSelect: Boolean); dynamic; + procedure StringGrid1DrawCell(Sender: TObject; Col, Row: Integer; + Rect: TRect; State: TGridDrawState); dynamic; + private + { Private declarations } + ftempState:Statearray; + public + { Public declarations } + end; + +var + DataForm : TDataForm; + DataShowing : TDataType; + +implementation + +uses fileio, frontend; + +{$R *.lfm} + + +// Set up the form +procedure TDataForm.FormCreate(Sender: TObject); +begin + StringGrid1.RowCount := ModelDef.numstate; + StringGrid1.FocusColor := clRed; + StringGrid1.cells[0,0]:='HoldConstant?'; + StringGrid1.cells[1,0]:='Reset?'; + StringGrid1.cells[2,0]:='Variable Symbol'; + StringGrid1.cells[3,0]:='Variable Name'; + StringGrid1.cells[4,0]:='Variable Value'; + StringGrid1.cells[5,0]:='Variable Units'; +end; + +procedure TDataForm.ShowStates; +var + i:integer; +begin + Ftempstate := Stat; + Caption := 'State Variables'; // Form Caption + DataShowing := dtstate; + StringGrid1.rowcount := ModelDef.numstate+1; + StringGrid1.Col := 1; + StringGrid1.Row := 1; + StringGrid1.Options := [goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine, + goColSizing,goThumbTracking,goEditing]; + StringGrid1.ColWidths[0] := 150; + StringGrid1.ColWidths[1] := 150; + for i:= 1 to ModelDef.numstate do // Write state variables, names, values and + begin // units to grid + StringGrid1.cells[2,i] := stat[i].symbol; + StringGrid1.cells[3,i] := stat[i].name; + StringGrid1.Cells[5,i] := stat[i].units; + StringGrid1.cells[4,i] := floattostr(stat[i].value); + if stat[i].holdconstant then StringGrid1.Cells[0,i] := 'True' + else StringGrid1.Cells[0,i] := 'False'; + if stat[i].Reset then StringGrid1.Cells[1,i] := 'True' + else StringGrid1.Cells[1,i] := 'False'; + end; + DataForm.Width := min(round(0.9*Screen.Width), Stringgrid1.colcount*Stringgrid1.defaultcolwidth+10); + DataForm.Height := min(round(0.8*Screen.Height), StringGrid1.rowcount*Stringgrid1.defaultrowheight+ PnlTop.Height +10); + BtnOK.Visible := True; + BtnOK.Enabled := True; + BtnCancel.Caption := '&Cancel'; + BtnCancel.Left := 480; + DataForm.ActiveControl := StringGrid1; + ShowModal; // Show the form +end; + + +// Set up the form to show process variables then show the data +procedure tDataForm.ShowProcess; +begin + ftempState := stat; // Necessary so that initial state variable values are saved. + Caption := 'Process Variables'; // Form Caption + DataShowing := dtProcess; + StringGrid1.rowcount:=ModelDef.numprocess+1; + StringGrid1.Col := 1; + StringGrid1.Row := 1; + StringGrid1.ColWidths[0] := 0; + StringGrid1.ColWidths[1] := 0; + StringGrid1.Options := [goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine, + goColSizing,goThumbTracking]; + UpdateProcess; + DataForm.Width := min(round(0.9*Screen.Width), (Stringgrid1.colcount-2)*Stringgrid1.defaultcolwidth+10); + DataForm.Height := min(round(0.8*Screen.Height), StringGrid1.rowcount*Stringgrid1.defaultrowheight+ PnlTop.Height +10); + BtnOK.Visible := False; + BtnOK.Enabled := False; + BtnCancel.Caption := '&Close'; + BtnCancel.Left:=20; + Show; +end; + +procedure TDataForm.StringGrid1CheckboxToggled(sender: TObject; aCol, + aRow: Integer; aState: TCheckboxState); +begin + if aCol = 0 then + if astate = cbchecked then stat[aRow].holdconstant := true + else stat[aRow].holdconstant := false; + if acol = 1 then + if astate = cbchecked then stat[aRow].reset := true + else stat[aRow].reset := false; +end; + +// Form has been modified, user wants to keep the changes +procedure TDataForm.BtnOKClick(Sender: TObject); // FIX what if processes are showing +begin +if DataShowing = dtState{ and StringGrid1Modified }then + begin + SaveStates; + NeedToSavePar := True; // State variables have been changed, parameter file + // needs to be saved + RunComplete := False; + end; + ClearGrid; +end; + +// Clear the grid when the form closes. When the form is showing process +// variables also close the form manually since it doesn't do it automatically. +procedure TDataForm.BtnCancelClick(Sender: TObject); +begin + if datashowing = dtstate then stat := ftempState; // Set states back to original values + ClearGrid; + if DataForm.Visible then DataForm.Close; +end; + +// Update global array of state variables with the changes made to the string grid +procedure tDataForm.SaveStates; +var + i:integer; +begin + for i:=1 to ModelDef.numstate do + begin // Copy value in grid to the global state array + stat[i].value := strtofloat(StringGrid1.Cells[4,i]); + // Holdconstant and reset values are saved as soon as they are changed so don't need to do them here + end; +end; + +{ The procedure updates the process variable values shown in the Dataform.} +procedure tDataForm.UpdateProcess; +var + i:integer; +begin + for i:= 1 to ModelDef.numprocess do // Write process variables, names, values and + begin // units to grid + StringGrid1.cells[3,i] := proc[i].name; + StringGrid1.Cells[5,i] := proc[i].units; + StringGrid1.Cells[2,i] := proc[i].symbol; + StringGrid1.cells[4,i] := floattostr(proc[i].value); + end; +end; + +// Clear the StringGrid so that new data can be written to it +procedure tDataForm.ClearGrid; +var + i,j : integer; +begin // Set grid cells to empty strings + for i := 0 to StringGrid1.RowCount - 1 do + for j := 2 to StringGrid1.ColCount - 1 do // Don't do columns 0 and 1 because their the check boxes + StringGrid1.Cells[j,i] := ''; + StringGrid1.RowCount := 3; // Reset row count +end; + +// Print out the state variables. +{ This procedure is currently not enabled because it will only print the visible + state variables. Needs to be fixed to print them all. } +procedure TDataForm.BtPrintClick(Sender: TObject); +begin +with DlgPrint do + if execute then + // Print StringGrid1.PaintTo(); + ; +end; + +procedure TDataForm.StringGrid1SelectCell(Sender: TObject; Col, + Row: Integer; var CanSelect: Boolean); +begin + if DataShowing = dtstate then + if (Col = 4) or (Col = 0) or (Col = 1) then + StringGrid1.Editor := StringGrid1.EditorbyStyle(cbsAuto) + else + StringGrid1.Editor := StringGrid1.EditorbyStyle(cbsNone) + else + StringGrid1.Editor := StringGrid1.EditorbyStyle(cbsNone); +end; + +procedure TDataForm.StringGrid1DrawCell(Sender: TObject; Col, + Row: Integer; Rect: TRect; State: TGridDrawState); +var + s:string; +begin + if DataShowing = dtstate then + begin + if Col <> 4 then + StringGrid1.Canvas.Brush.Color:= clScrollBar; + end + else + StringGrid1.Canvas.Brush.Color:= clScrollBar; + + StringGrid1.Canvas.FillRect(Rect); + S := StringGrid1.Cells[Col, Row]; + StringGrid1.Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, S); +end; + +end. diff --git a/modelshell/display.lfm b/modelshell/display.lfm new file mode 100644 index 0000000..1e89718 --- /dev/null +++ b/modelshell/display.lfm @@ -0,0 +1,614 @@ +object FmDisplayOutput: TFmDisplayOutput + Left = -1 + Height = 686 + Top = 50 + Width = 1070 + HorzScrollBar.Smooth = True + VertScrollBar.Smooth = True + ActiveControl = LblEdPar1 + Caption = 'FmDisplayOutput' + ClientHeight = 666 + ClientWidth = 1070 + DefaultMonitor = dmMainForm + Menu = MmDisplay + OnClose = FormClose + OnCreate = FormCreate + OnResize = FormResize + OnShow = FormShow + Position = poMainFormCenter + LCLVersion = '1.6.4.0' + object SgModelOutput: TStringGrid + Left = 0 + Height = 359 + Top = 0 + Width = 1070 + Align = alClient + FixedCols = 0 + TabOrder = 0 + Visible = False + end + object PnlTop: TPanel + Left = 0 + Height = 359 + Top = 0 + Width = 1070 + Align = alClient + ClientHeight = 359 + ClientWidth = 1070 + TabOrder = 1 + object PnlTopRight: TPanel + Left = 894 + Height = 357 + Top = 1 + Width = 175 + Align = alRight + Anchors = [] + ChildSizing.EnlargeHorizontal = crsHomogenousChildResize + ChildSizing.EnlargeVertical = crsHomogenousChildResize + ChildSizing.ShrinkHorizontal = crsHomogenousChildResize + ChildSizing.ShrinkVertical = crsHomogenousChildResize + ClientHeight = 357 + ClientWidth = 175 + Constraints.MinWidth = 100 + TabOrder = 0 + OnClick = PnlTopRightClick + object PnlRerun: TPanel + Left = 1 + Height = 94 + Top = 262 + Width = 173 + Align = alBottom + BorderSpacing.InnerBorder = 4 + ChildSizing.EnlargeHorizontal = crsHomogenousChildResize + ChildSizing.EnlargeVertical = crsHomogenousChildResize + ChildSizing.ShrinkHorizontal = crsHomogenousChildResize + ChildSizing.ShrinkVertical = crsHomogenousChildResize + ClientHeight = 94 + ClientWidth = 173 + ParentColor = False + TabOrder = 0 + object BtnRun: TButton + Left = 53 + Height = 20 + Top = 60 + Width = 70 + Anchors = [] + BorderSpacing.Around = 2 + Caption = '&Run' + OnClick = BtnRunClick + TabOrder = 2 + end + object CbxStates: TCheckBox + Left = 10 + Height = 19 + Top = 8 + Width = 51 + BorderSpacing.Around = 2 + Caption = '&States' + Checked = True + OnClick = cbxStatesClick + State = cbChecked + TabOrder = 0 + end + object CbxParameters: TCheckBox + Left = 10 + Height = 19 + Top = 32 + Width = 79 + BorderSpacing.Around = 2 + Caption = '&Parameters' + OnClick = cbxParamsClick + TabOrder = 1 + end + end + object PnlParameters: TPanel + Left = 1 + Height = 261 + Top = 1 + Width = 173 + Align = alClient + ClientHeight = 261 + ClientWidth = 173 + ParentColor = False + TabOrder = 1 + object LblEdPar1: TLabeledEdit + Left = 10 + Height = 23 + Top = 31 + Width = 150 + Alignment = taCenter + Anchors = [] + EditLabel.AnchorSideLeft.Control = LblEdPar1 + EditLabel.AnchorSideRight.Control = LblEdPar1 + EditLabel.AnchorSideRight.Side = asrBottom + EditLabel.AnchorSideBottom.Control = LblEdPar1 + EditLabel.Left = 10 + EditLabel.Height = 15 + EditLabel.Top = 13 + EditLabel.Width = 150 + EditLabel.Caption = 'Parameter &1' + EditLabel.ParentColor = False + TabOrder = 0 + OnDblClick = lblParClick + OnExit = LblEdParExit + OnKeyPress = LblEdParKeyPress + end + object LblEdPar2: TLabeledEdit + Left = 10 + Height = 23 + Top = 85 + Width = 150 + Alignment = taCenter + Anchors = [] + EditLabel.AnchorSideLeft.Control = LblEdPar2 + EditLabel.AnchorSideRight.Control = LblEdPar2 + EditLabel.AnchorSideRight.Side = asrBottom + EditLabel.AnchorSideBottom.Control = LblEdPar2 + EditLabel.Left = 10 + EditLabel.Height = 15 + EditLabel.Top = 67 + EditLabel.Width = 150 + EditLabel.Caption = 'Parameter &2' + EditLabel.ParentColor = False + TabOrder = 1 + OnDblClick = lblParClick + OnExit = LblEdParExit + OnKeyPress = LblEdParKeyPress + end + object LblEdPar3: TLabeledEdit + Left = 10 + Height = 23 + Top = 139 + Width = 150 + Alignment = taCenter + Anchors = [] + EditLabel.AnchorSideLeft.Control = LblEdPar3 + EditLabel.AnchorSideRight.Control = LblEdPar3 + EditLabel.AnchorSideRight.Side = asrBottom + EditLabel.AnchorSideBottom.Control = LblEdPar3 + EditLabel.Left = 10 + EditLabel.Height = 15 + EditLabel.Top = 121 + EditLabel.Width = 150 + EditLabel.Caption = 'Parameter &3' + EditLabel.ParentColor = False + TabOrder = 2 + OnDblClick = lblParClick + OnExit = LblEdParExit + OnKeyPress = LblEdParKeyPress + end + object LblEdPar4: TLabeledEdit + Left = 10 + Height = 23 + Top = 185 + Width = 150 + Alignment = taCenter + Anchors = [] + EditLabel.AnchorSideLeft.Control = LblEdPar4 + EditLabel.AnchorSideRight.Control = LblEdPar4 + EditLabel.AnchorSideRight.Side = asrBottom + EditLabel.AnchorSideBottom.Control = LblEdPar4 + EditLabel.Left = 10 + EditLabel.Height = 15 + EditLabel.Top = 167 + EditLabel.Width = 150 + EditLabel.Caption = 'Parameter &4' + EditLabel.ParentColor = False + TabOrder = 3 + OnDblClick = lblParClick + OnExit = LblEdParExit + OnKeyPress = LblEdParKeyPress + end + end + end + object ChOutput: TChart + Left = 1 + Height = 357 + Top = 1 + Width = 893 + AxisList = < + item + Minors = <> + Title.LabelFont.Orientation = 900 + Title.Visible = True + end + item + Alignment = calBottom + Minors = <> + Title.Visible = True + end> + Foot.Brush.Color = clBtnFace + Foot.Font.Color = clBlue + Legend.Visible = True + Title.Brush.Color = clBtnFace + Title.Font.Color = clBlue + Title.Text.Strings = ( + 'TAChart' + ) + Align = alClient + Anchors = [] + object ChOutputLineSeries1: TLineSeries + LineType = ltNone + Pointer.Brush.Style = bsClear + Pointer.Style = psCircle + ShowPoints = True + Source = ListChartSource1 + end + object ChOutputLineSeries2: TLineSeries + Marks.LinkPen.Color = clRed + LinePen.Color = clRed + LineType = ltNone + Pointer.Brush.Color = clRed + Pointer.Pen.Color = clRed + ShowPoints = True + Source = ListChartSource2 + end + object ChOutputLineSeries3: TLineSeries + LinePen.Color = clBlue + LineType = ltNone + Pointer.Brush.Color = clBlue + Pointer.Pen.Color = clBlue + Pointer.Style = psCross + ShowPoints = True + Source = ListChartSource3 + end + object ChOutputLineSeries4: TLineSeries + LinePen.Color = clGreen + LineType = ltNone + Pointer.Brush.Color = clGreen + Pointer.Pen.Color = clGreen + Pointer.Style = psDiagCross + ShowPoints = True + Source = ListChartSource4 + end + object ChOutputLineSeries5: TLineSeries + LinePen.Color = clYellow + LineType = ltNone + Pointer.Brush.Color = clYellow + Pointer.Style = psTriangle + ShowPoints = True + Source = ListChartSource5 + end + object ChOutputLineSeries6: TLineSeries + LinePen.Color = clMaroon + LineType = ltNone + Pointer.Brush.Color = clMaroon + Pointer.Pen.Color = clMaroon + ShowPoints = True + Source = ListChartSource6 + end + object ChOutputLineSeries7: TLineSeries + LinePen.Color = clSilver + LineType = ltNone + Pointer.Brush.Color = clSilver + Pointer.Pen.Color = clSilver + Pointer.Style = psDiamond + ShowPoints = True + Source = ListChartSource7 + end + object ChOutputLineSeries8: TLineSeries + LinePen.Color = clAqua + LineType = ltNone + Pointer.Brush.Color = clAqua + Pointer.Style = psLeftBracket + ShowPoints = True + Source = ListChartSource8 + end + object ChOutputLineSeries9: TLineSeries + LinePen.Color = clPurple + LineType = ltNone + Pointer.Brush.Color = clPurple + Pointer.Pen.Color = clPurple + Pointer.Style = psStar + ShowPoints = True + Source = ListChartSource9 + end + object ChOutputLineSeries10: TLineSeries + LinePen.Color = clLime + LineType = ltNone + Pointer.Brush.Color = clLime + Pointer.Pen.Color = clLime + Pointer.Style = psCircle + ShowPoints = True + Source = ListChartSource10 + end + end + end + object SplTopBottom: TSplitter + Cursor = crVSplit + Left = 0 + Height = 7 + Top = 359 + Width = 1070 + Align = alBottom + ResizeAnchor = akBottom + end + object PnlBottom: TPanel + Left = 0 + Height = 300 + Top = 366 + Width = 1070 + Align = alBottom + ClientHeight = 300 + ClientWidth = 1070 + TabOrder = 3 + object PnlBottomLeft: TPanel + Left = 1 + Height = 298 + Top = 1 + Width = 892 + Align = alClient + ClientHeight = 298 + ClientWidth = 892 + TabOrder = 0 + object LblDirections: TLabel + Left = 4 + Height = 15 + Top = 4 + Width = 884 + Align = alTop + BorderSpacing.Around = 3 + Caption = 'Select a maximum of 10 series to plot.' + ParentColor = False + end + object LbxSeriesSelect: TListBox + Left = 3 + Height = 273 + Top = 22 + Width = 886 + Align = alClient + BorderSpacing.Around = 2 + Columns = 3 + ExtendedSelect = False + ItemHeight = 0 + MultiSelect = True + Sorted = True + Style = lbOwnerDrawFixed + TabOrder = 0 + end + end + object PnlBottomRight: TPanel + Left = 893 + Height = 298 + Top = 1 + Width = 176 + Align = alRight + Anchors = [] + AutoSize = True + ChildSizing.EnlargeHorizontal = crsHomogenousChildResize + ChildSizing.EnlargeVertical = crsHomogenousChildResize + ChildSizing.ShrinkHorizontal = crsHomogenousChildResize + ChildSizing.ShrinkVertical = crsHomogenousChildResize + ClientHeight = 298 + ClientWidth = 176 + TabOrder = 1 + object RgChartValues: TRadioGroup + Left = 1 + Height = 110 + Top = 1 + Width = 174 + Align = alTop + AutoFill = True + Caption = 'Plot values as' + ChildSizing.LeftRightSpacing = 4 + ChildSizing.TopBottomSpacing = 4 + ChildSizing.EnlargeHorizontal = crsHomogenousChildResize + ChildSizing.EnlargeVertical = crsHomogenousChildResize + ChildSizing.ShrinkHorizontal = crsHomogenousChildResize + ChildSizing.ShrinkVertical = crsHomogenousChildResize + ChildSizing.Layout = cclTopToBottomThenLeftToRight + ChildSizing.ControlsPerLine = 3 + ClientHeight = 90 + ClientWidth = 170 + ColumnLayout = clVerticalThenHorizontal + ItemIndex = 0 + Items.Strings = ( + '&Actual Values (y)' + '&Relative Change (y/y0)' + 'Cu&mulative Change (y-y0) ' + ) + OnClick = RgChartValuesClick + TabOrder = 0 + end + object PnlChartButtons: TPanel + Left = 1 + Height = 186 + Top = 111 + Width = 174 + Align = alClient + BorderStyle = bsSingle + ClientHeight = 182 + ClientWidth = 170 + TabOrder = 1 + object BtnClearSeries: TButton + Left = 18 + Height = 25 + Top = 67 + Width = 137 + Anchors = [] + AutoSize = True + Caption = 'C&lear Series Selection' + OnClick = BtnClearSeriesClick + TabOrder = 1 + end + object BtnUpdateChart: TButton + Left = 38 + Height = 25 + Top = 19 + Width = 96 + Anchors = [] + AutoSize = True + Caption = '&Update Chart' + OnClick = BtnUpdateChartClick + TabOrder = 0 + end + object BtnCloseDisplay: TButton + Left = 38 + Height = 25 + Top = 115 + Width = 96 + Anchors = [] + AutoSize = True + Caption = '&Close Display' + OnClick = BtnCloseDisplayClick + TabOrder = 2 + end + end + end + object SplBottomLR: TSplitter + Left = 893 + Height = 298 + Top = 1 + Width = 0 + Align = alRight + ResizeAnchor = akRight + end + end + object MmDisplay: TMainMenu + left = 336 + top = 56 + object MIWindow: TMenuItem + Caption = '&Window' + object MIShow: TMenuItem + Caption = 'S&how' + object MIShowChart: TMenuItem + Caption = '&Chart' + OnClick = MIShowChange + end + object MIShowTable: TMenuItem + Caption = '&Table' + OnClick = MIShowChange + end + end + object MISaveOutput: TMenuItem + Caption = '&Save output to file' + OnClick = MISaveOutputClick + end + object MILoadFile: TMenuItem + Caption = '&Load from File' + OnClick = MILoadFileClick + end + object MIClose: TMenuItem + Caption = '&Close' + OnClick = BtnCloseDisplayClick + end + end + object MIChart: TMenuItem + Caption = 'C&hart' + object MIXaxis: TMenuItem + Caption = '&X-axis' + object MIXSelect: TMenuItem + Caption = '&Select' + OnClick = MISelectAxisClick + end + object MIXScale: TMenuItem + Caption = 'S&cale' + OnClick = MIScaleClick + end + end + object MIYaxis: TMenuItem + Caption = '&Y-axis' + object MIYSelect: TMenuItem + Caption = '&Select' + OnClick = MISelectAxisClick + end + object MIYScale: TMenuItem + Caption = 'S&cale' + OnClick = MIScaleClick + end + end + object MIUpdate: TMenuItem + Caption = '&Update' + end + object MIPrintChart: TMenuItem + Caption = '&Print Chart' + Enabled = False + Visible = False + end + end + end + object ListChartSource2: TListChartSource + Sorted = True + left = 48 + top = 80 + end + object ListChartSource1: TListChartSource + Sorted = True + left = 84 + top = 44 + end + object ListChartSource6: TListChartSource + Sorted = True + left = 172 + top = 50 + end + object ListChartSource7: TListChartSource + Sorted = True + left = 180 + top = 110 + end + object ListChartSource3: TListChartSource + Sorted = True + left = 81 + top = 169 + end + object ListChartSource8: TListChartSource + Sorted = True + left = 171 + top = 170 + end + object ListChartSource4: TListChartSource + Sorted = True + left = 71 + top = 242 + end + object ListChartSource9: TListChartSource + Sorted = True + left = 173 + top = 241 + end + object ListChartSource10: TListChartSource + Sorted = True + left = 175 + top = 303 + end + object ListChartSource5: TListChartSource + Sorted = True + left = 79 + top = 311 + end + object ChartToolset1: TChartToolset + left = 556 + top = 84 + object ChartToolset1ZoomClickTool1: TZoomClickTool + ZoomFactor = 2 + ZoomRatio = 2 + end + object ChartToolset1PanClickTool1: TPanClickTool + end + object ChartToolset1PanDragTool1: TPanDragTool + end + object ChartToolset1ZoomDragTool1: TZoomDragTool + end + end + object ChLAxisTransforms: TChartAxisTransformations + left = 518 + top = 207 + object ChLAxisLogarithm: TLogarithmAxisTransform + Enabled = False + Base = 10 + end + object ChLAxisAutoScale: TAutoScaleAxisTransform + end + end + object ChBAxisTransforms: TChartAxisTransformations + left = 511 + top = 283 + object ChBAxisLogarithm: TLogarithmAxisTransform + Enabled = False + Base = 10 + end + object ChBAxisAutoScale: TAutoScaleAxisTransform + end + end +end diff --git a/modelshell/display.pas b/modelshell/display.pas new file mode 100644 index 0000000..946d0b5 --- /dev/null +++ b/modelshell/display.pas @@ -0,0 +1,1528 @@ +unit Display; + +interface + +uses + Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Menus, + ExtCtrls, StdCtrls, Grids, TAGraph, TASeries, + TASources, TATools, TACustomSource, TALegendPanel, TATransformations, stypes; + +const + Maxseries = 10; + FirstRow = 3; + +type + plotarray=array[1..MaxSeries] of string; + +type + + { TFmDisplayOutput } + + TFmDisplayOutput = class(TForm) + BtnClearSeries: TButton; + BtnCloseDisplay: TButton; + BtnUpdateChart: TButton; + BtnRun: TButton; + ChartToolset1: TChartToolset; + ChartToolset1PanClickTool1: TPanClickTool; + ChartToolset1PanDragTool1: TPanDragTool; + ChartToolset1ZoomClickTool1: TZoomClickTool; + ChartToolset1ZoomDragTool1: TZoomDragTool; + ChBAxisAutoScale: TAutoScaleAxisTransform; + ChBAxisLogarithm: TLogarithmAxisTransform; + ChBAxisTransforms: TChartAxisTransformations; + CbxParameters: TCheckBox; + CbxStates: TCheckBox; + ChLAxisAutoScale: TAutoScaleAxisTransform; + ChLAxisLogarithm: TLogarithmAxisTransform; + ChLAxisTransforms: TChartAxisTransformations; + ChOutput: TChart; + ChOutputLineSeries1: TLineSeries; + ChOutputLineSeries10: TLineSeries; + ChOutputLineSeries2: TLineSeries; + ChOutputLineSeries3: TLineSeries; + ChOutputLineSeries4: TLineSeries; + ChOutputLineSeries5: TLineSeries; + ChOutputLineSeries6: TLineSeries; + ChOutputLineSeries7: TLineSeries; + ChOutputLineSeries8: TLineSeries; + ChOutputLineSeries9: TLineSeries; + LblEdPar1: TLabeledEdit; + LblEdPar2: TLabeledEdit; + LblEdPar3: TLabeledEdit; + LblEdPar4: TLabeledEdit; + LblDirections: TLabel; + LbxSeriesSelect: TListBox; + ListChartSource1: TListChartSource; + ListChartSource10: TListChartSource; + ListChartSource2: TListChartSource; + ListChartSource3: TListChartSource; + ListChartSource4: TListChartSource; + ListChartSource5: TListChartSource; + ListChartSource6: TListChartSource; + ListChartSource7: TListChartSource; + ListChartSource8: TListChartSource; + ListChartSource9: TListChartSource; + MIYScale: TMenuItem; + MIYSelect: TMenuItem; + MIXScale: TMenuItem; + MIXSelect: TMenuItem; + MIShowTable: TMenuItem; + MIShowChart: TMenuItem; + MIShow: TMenuItem; + MIYaxis: TMenuItem; + MIUpdate: TMenuItem; + MIPrintChart: TMenuItem; + MIXaxis: TMenuItem; + MILoadFile: TMenuItem; + MIClose: TMenuItem; + MISaveOutput: TMenuItem; + MIChart: TMenuItem; + MmDisplay: TMainMenu; + MIWindow: TMenuItem; + PnlParameters: TPanel; + PnlRerun: TPanel; + PnlChartButtons: TPanel; + PnlTop: TPanel; + PnlTopRight: TPanel; + PnlBottom: TPanel; + PnlBottomLeft: TPanel; + PnlBottomRight: TPanel; + RgChartValues: TRadioGroup; + SgModelOutput: TStringGrid; + sLblPar1: TBoundLabel; + sLblPar2: TBoundLabel; + SLblPar3: TBoundLabel; + SplBottomLR: TSplitter; + SplTopBottom: TSplitter; + procedure BtnClearSeriesClick(Sender: TObject); + procedure BtnCloseDisplayClick(Sender: TObject); + procedure BtnRunClick(Sender: TObject); + procedure BtnUpdateChartClick(Sender: TObject); + procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); + procedure FormCreate(Sender: TObject); + procedure FormResize(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure LblEdParKeyPress(Sender: TObject; var Key: char); + procedure MILoadFileClick(Sender: TObject); + procedure MISaveOutputClick(Sender: TObject); + procedure MIScaleClick(Sender: TObject); + procedure PnlTopRightClick(Sender: TObject); + procedure RgChartValuesClick(Sender: TObject); + procedure UpdateChart; + procedure lblParClick(sender: Tobject); + procedure LblEdParExit(sender: Tobject); + procedure refreshLblEdPar; + procedure cbxParamsClick(Sender: TObject); + procedure cbxStatesClick(Sender: TObject); + procedure MIShowChange(Sender: TObject); + procedure MISelectAxisClick(Sender: TObject); + private + { private declarations } + FFilename:String; + FCurrentAxis:TAxis; + FxAxis:string; + FDisplayStep:double; + FDisplayStyle:TDisplayStyle; + FInitialView:Boolean; + FNumberofSeries:integer; // Current number of series selected + FSeriestoPlot:plotarray; // The list of series to be plotted + procedure AddSeriestoPlot(ListBox: Tlistbox); + procedure RemoveSeriestoPlot(seriesname:string); + function GetColumnNumber(seriesname:string):integer; + public + { public declarations } + FirstWrite:Boolean; + CurrentRow: integer; + DisplayFilename:string; + AutoShowChart:Boolean; + DisplayStyle:TDisplayStyle; + property Filename:String read FFilename write FFilename; + property CurrentAxis:TAxis read FCurrentAxis write FCurrentAxis; + property displaystep:double read FDisplayStep write FDisplayStep; + property xAxis:string read FxAxis write FxAxis; + property NumberofSeries:integer read FNumberofSeries write FNumberofSeries; + procedure FillListBox(ListBox:TListBox); + procedure ClearSeriestoPlot(Listbox:TListBox); + procedure WriteOutputfromMem; + procedure WritePurgeOutputfromMem; + procedure ClearGrid; + procedure StoreResults(ctime:double; var darray:drivearray; var sarray:statearray; + var parray:processarray); + + end; + +var + FmDisplayOutput: TFmDisplayOutput; + +implementation + +uses frontend, ParamList, calculate, ReloadDlg, trouble, fileio, SeriesForm, ScaleDlg, options; +{$R *.lfm} + +{ TFmDisplayOutput } + +procedure TFmDisplayOutput.FormCreate(Sender: TObject); +var + i: integer; +begin + FInitialView := True; + FirstWrite := True; + chOutput.Title.Text.text := modeldef.modelname; // Chart title + + SgModelOutput.RowCount := FirstRow; + SgModelOutput.colcount := modeldef.numdrive + modeldef.numprocess + 1 +ModelDef.numstate; //***********HERE + // don't need numstate in the above count because the derivatives are no + // longer in the table so the count of the derivatives in numprocess takes + // care of numstate. + for i := 0 to SgModelOutput.colcount - 1 do SgModelOutput.cells[i,0] := inttostr(i); + SgModelOutput.cells[0,1] := 'Time'; // Column name + SgModelOutput.cells[0,2] := ModelDef.timeunit; // Column units + for i := 1 to modeldef.numdrive do // Add drivers to stringgrid + begin + SgModelOutput.cells[i,1] := drive[i].name; // Column name + SgModelOutput.cells[i,2] := drive[i].units; // Column units + end; + for i := 1 to modeldef.numstate do // Add state variables to grid + begin + SgModelOutput.cells[modeldef.numdrive + i,1] := stat[i].name; // Column name + SgModelOutput.cells[modeldef.numdrive + i,2] := stat[i].units; // Column units + end; + for i := ModelDef.numstate + 1 to modeldef.numprocess do // Add process variables to grid + begin + SgModelOutput.cells[modeldef.numdrive + i,1] := proc[i].name; // Column name + SgModelOutput.cells[modeldef.numdrive + i,2] := proc[i].units; // Column units + end; + for i := 1 to ModelDef.numstate do // Add derivatives to grid //************HERE + begin + SgModelOutput.cells[modeldef.numdrive+ modeldef.numprocess + i,1] := proc[i].name; // Column name + SgModelOutput.cells[modeldef.numdrive+ modeldef.numprocess + i,2] := proc[i].units; // Column units + end; + + FillListBox(LbxSeriesSelect); + FxAxis := 'Time'; +// FDisplayStep := FmOptions.RunOptions.Time_step; +{ autoshowchart := false; } + CurrentRow := FirstRow; + DisplayFilename := 'Memory'; + DisplayStyle:=dsChart; + FmDisplayOutput.ActiveControl:=Lbxseriesselect; + + {$ifdef Darwin} + LblEdPar1.EditLabel.ShowAccelChar:=False; + LblEdPar1.EditLabel.Caption:= 'Parameter 1'; + LblEdPar2.EditLabel.ShowAccelChar:=False; + LblEdPar2.EditLabel.Caption := 'Parameter 2'; + LblEdPar3.EditLabel.ShowAccelChar:=False; + LblEdPar3.EditLabel.Caption := 'Parameter 3'; + LblEdPar4.EditLabel.ShowAccelChar:=False; + LblEdPar4.EditLabel.Caption := 'Parameter 4'; + {$endif} +end; + +procedure TFmDisplayOutput.FormResize(Sender: TObject); +var + numcol:double; +begin + if fInitialView then + begin + FmDisplayOutput.Height:=round(0.8*screen.Height); + FmDisplayOutput.Width := round(0.8*screen.width); + FmDisplayOutput.Top := 0; + fInitialView := False; + end; + if DisplayStyle = dsChart then + begin + PnlBottom.Constraints.MinHeight:=250; + PnlBottom.Height:=2*(FmDisplayOutput.Height div 5); + numcol := LbxSeriesSelect.ClientWidth/(8*stringlength); // assumes 8 units per character + if numcol < 1 then numcol := 1; + LbxSeriesSelect.Columns:=round(numcol); + end + else // Showing the table and not the chart + begin + // Shrink bottom panel and move the close buttom so it's visible + PnlBottom.Constraints.MinHeight:=0; + PnlBottom.Height:=BtnCloseDisplay.Height*3; + BtnCloseDisplay.Top := (PnlBottom.Height - BtnCloseDisplay.Height) div 2 - 1; + end; +end; + +procedure TFmDisplayOutput.FormShow(Sender: TObject); +begin + FmDisplayOutput.Caption := 'Model Output - File: ' + DisplayFilename; +// MessageDlg('number selected = ' + inttostr(LbxSeriesSelect.SelCount), mtInformation, [mbOK], 0); + if DisplayStyle = dsChart then + begin + SgModelOutput.Visible:=False; + PnlTop.Show; + PnlBottomLeft.Show; + BtnUpdateChart.Enabled := True; + BtnUpdateChart.Visible:=True; + BtnClearSeries.Enabled:=True; + BtnClearSeries.Visible:=True; + RgChartValues.Visible := True; + RgChartValues.Enabled := True; + end + else // Showing Data table not chart + begin + SgModelOutput.Visible:=True; + PnlTop.Hide; + PnlBottomLeft.Hide; + BtnUpdateChart.Enabled := False; + BtnUpdateChart.Visible:=False; + BtnClearSeries.Enabled:=False; + BtnClearSeries.Visible:=False; + RgChartValues.Visible := False; + RgChartValues.Enabled := False; + end; + FmDisplayOutput.FormResize(FmShellMain); + cbxParameters.Checked := DlgReload.cbParams.Checked; + cbxStates.Checked := DlgReload.cbState.Checked; +end; + + +procedure TFmDisplayOutput.LblEdParKeyPress(Sender: TObject; var Key: char); +begin + if (Key = Chr(13)) then LblEdParExit(Sender); +end; + +procedure TFmDisplayOutput.MILoadFileClick(Sender: TObject); +var + ttime:double; + tempdrive:drivearray; + tempstate:statearray; + tempprocess:processarray; +begin + tempdrive := drive; + tempstate := stat; + tempprocess := proc; + ClearGrid; + if FmShellMain.DlgOpenOutput.execute then + if FmShellMain.DlgOpenOutput.filename <> '' then + begin + DisplayFilename := FmShellMain.DlgOpenOutput.filename; + try + OpenOutputFile(FmShellMain.DlgOpenOutput.FileName, ModelDef.numdrive, drive, ModelDef.numstate, + stat, ModelDef.numprocess, proc, flread); + while not eof(outfile) do + begin + ReadOutputFile(ttime, ModelDef.numdrive, tempdrive, ModelDef.numstate, tempstate, + ModelDef.numprocess, tempprocess); + StoreResults(ttime, tempdrive, tempstate, tempprocess); + end; + finally + CloseOutputFile; + end; + end; +end; + +procedure TFmDisplayOutput.MISaveOutputClick(Sender: TObject); +begin + if DisplayFilename = 'Memory' then + begin + FmShellMain.ChooseParamFile(FmDisplayOutput); + WriteOutputfromMem; + end + else + MessageDlg('Data already saved in file ' + DisplayFilename, mtInformation, [mbOK], 0 ); +end; + +procedure TFmDisplayOutput.MIScaleClick(Sender: TObject); +begin + if (Sender as TMenuItem).Name = 'MIXScale' then + begin + CurrentAxis := axBottom; + end + else + begin + CurrentAxis := axLeft; + end; + DlgScale.ShowModal; +end; + +procedure TFmDisplayOutput.PnlTopRightClick(Sender: TObject); +begin + +end; + +procedure TFmDisplayOutput.RgChartValuesClick(Sender: TObject); +begin + +end; + +procedure TFmDisplayOutput.MISelectAxisClick(Sender: TObject); +begin + if (Sender as TMenuItem).Name = 'MIXSelect' then + CurrentAxis := axBottom + else + CurrentAxis := axLeft; + FmSeries.ShowModal; +end; + +procedure TFmDisplayOutput.MIShowChange(Sender: TObject); +begin + if (Sender as TMenuItem).Name = 'MIShowTable' then + DisplayStyle := dsTable + else + DisplayStyle := dsChart; + FmDisplayOutput.FormShow(Sender); +end; + +procedure TFmDisplayOutput.BtnCloseDisplayClick(Sender: TObject); +begin + FmDisplayOutput.Close; + DlgReload.cbParams.Checked := cbxParameters.Checked; + DlgReload.cbState.Checked := cbxStates.Checked; +end; + +procedure TFmDisplayOutput.BtnRunClick(Sender: TObject); +begin + if MessageDlg('Rerun model using current run options?', mtConfirmation, [mbYes,mbNo], 0) = mrYes then + begin + SgModelOutput.BeginUpdate; + dlgReload.okBtn.click; + FmShellMain.btnRun.click; + if FmTrouble.visible then FmTrouble.BringToFront; + SgModelOutput.EndUpdate(True); + end; +end; + +procedure TFmDisplayOutput.BtnClearSeriesClick(Sender: TObject); +begin + ClearSeriestoPlot(LbxSeriesSelect); +end; + +procedure TFmDisplayOutput.BtnUpdateChartClick(Sender: TObject); +begin + UpdateChart; + refreshLblEdPar; +end; + +procedure TFmDisplayOutput.FormClose(Sender: TObject; + var CloseAction: TCloseAction); +begin + BtnCloseDisplayClick(sender); +end; + +procedure TFmDisplayOutput.UpdateChart; +var + i,j,xcolumn,ycolumn:integer; + CurrentChartSource:^TListChartSource; +begin +try + New(CurrentChartSource); + // Inactivate previous series + for i := 0 to MaxSeries - 1 do Choutput.series[i].active := false; + + // Put title on Bottom Axis + xcolumn := GetColumnNumber(xAxis); + ChOutput.BottomAxis.Title.Caption := SgModelOutput.cells[xcolumn,1]; + + // Clear the chart of previous plots +// for i:=0 to ChOutput.SeriesCount-1 do ChOutput.Series[i].Clear; +// If ChOutput.SeriesCount > 0 then ChOutput.ClearSeries; + ChOutputLineSeries1.Clear; + ChOutputLineSeries2.Clear; + ChOutputLineSeries3.Clear; + ChOutputLineSeries4.Clear; + ChOutputLineSeries5.Clear; + ChOutputLineSeries6.Clear; + ChOutputLineSeries7.Clear; + ChOutputLineSeries8.Clear; + ChOutputLineSeries9.Clear; + ChOutputLineSeries10.Clear; + + // Store series to plot in plotarray + AddSeriestoPlot(LbxSeriesSelect); + + // Activate the number of series to plot. + for i := 0 to FNumberofSeries - 1 do Choutput.series[i].active := true; + + // Check for divide by zero if relative change is selected + if (RgChartValues.ItemIndex=1) then + for j := 0 to FNumberofSeries - 1 do + begin + ycolumn := GetColumnNumber(FSeriestoPlot[j+1]); + if (RgChartValues.ItemIndex=1) and (strtofloat(SgModelOutput.Cells[ycolumn,FirstRow]) = 0) then // The if itemindex=1 needs to be here so that the code doesn't give the error for every series on the chart. It only needs to be corrected once. + begin + MessageDlg('Unable to display relative values because y0 is zero. Displaying actual values instead.', mtInformation, [mbOK], 0 ); + RgChartValues.ItemIndex:=0; + end; + end; + + // Add each series to the datasource. + for j := 0 to FNumberofSeries - 1 do + begin + ycolumn := GetColumnNumber(FSeriestoPlot[j+1]); + case j of + 0: begin + CurrentChartSource^:=ListChartSource1; + ChOutputLineSeries1.Title := SgModelOutput.Cells[ycolumn,1]; + end; + 1: begin + CurrentChartSource^:=ListChartSource2; + ChOutputLineSeries2.Title := SgModelOutput.Cells[ycolumn,1]; + end; + 2: begin + CurrentChartSource^:=ListChartSource3; + ChOutputLineSeries3.Title := SgModelOutput.Cells[ycolumn,1]; + end; + 3: begin + CurrentChartSource^:=ListChartSource4; + ChOutputLineSeries4.Title := SgModelOutput.Cells[ycolumn,1]; + end; + 4: begin + CurrentChartSource^:=ListChartSource5; + ChOutputLineSeries5.Title := SgModelOutput.Cells[ycolumn,1]; + end; + 5: begin + CurrentChartSource^:=ListChartSource6; + ChOutputLineSeries6.Title := SgModelOutput.Cells[ycolumn,1]; + end; + 6: begin + CurrentChartSource^:=ListChartSource7; + ChOutputLineSeries7.Title := SgModelOutput.Cells[ycolumn,1]; + end; + 7: begin + CurrentChartSource^:=ListChartSource8; + ChOutputLineSeries8.Title := SgModelOutput.Cells[ycolumn,1]; + end; + 8: begin + CurrentChartSource^:=ListChartSource9; + ChOutputLineSeries9.Title := SgModelOutput.Cells[ycolumn,1]; + end; + 9: begin + CurrentChartSource^:=ListChartSource10; + ChOutputLineSeries10.Title := SgModelOutput.Cells[ycolumn,1]; + end; + end; + for i := FirstRow to SgModelOutput.RowCount - 1 do + begin + case RgChartValues.ItemIndex of + 0: CurrentChartSource.add(strtofloat(SgModelOutput.Cells[xcolumn,i]), + strtofloat(SgModelOutput.Cells[ycolumn,i])); + 1: CurrentChartSource.add(strtofloat(SgModelOutput.Cells[xcolumn,i]), + strtofloat(SgModelOutput.Cells[ycolumn,i])/strtofloat(SgModelOutput.Cells[ycolumn,FirstRow])); + 2: CurrentChartSource.add(strtofloat(SgModelOutput.Cells[xcolumn,i]), + strtofloat(SgModelOutput.Cells[ycolumn,i])-strtofloat(SgModelOutput.cells[ycolumn,FirstRow])); + end; + end; + end; + refreshLblEdPar; +finally + Dispose(CurrentChartSource); +end; +end; + +procedure TFmDisplayOutput.FillListBox(ListBox:TListBox); +var + i:integer; +begin + ListBox.Items.Clear; + ListBox.Items.Add('Time'); + for i := 1 to ModelDef.numdrive do // Add driver names to listbox + ListBox.Items.Add(drive[i].name); + for i := 1 to ModelDef.numstate do // Add state variable names to listbox + ListBox.Items.Add(stat[i].name); + for i := ModelDef.numstate + 1 to ModelDef.numprocess do // Add process variable names to listbox + ListBox.Items.Add(proc[i].name); +end; + +// Adds a series to the FSeriestoPlot array +procedure TFmDisplayOutput.AddSeriestoPlot(ListBox: Tlistbox); +var + index:integer; +begin + FNumberofSeries := 0; + for index := 0 to Listbox.Items.Count - 1 do + begin + if Listbox.Selected[index] then + begin + if FNumberofSeries = MaxSeries then + MessageDlg('Cannot display series. Maximum is 10 series.', mtError, [mbOK], 0) + else + begin + FNumberofSeries := FNumberofSeries + 1; + FSeriestoPlot[FNumberofSeries] := ListBox.Items[index]; + end; + end; + end; +end; + +// Removes a series from the FSeriestoPlot array +procedure TFmDisplayOutput.RemoveSeriestoPlot(seriesname:string); +var + temparray:plotarray; + i,index:integer; +begin + index := 1; + temparray := FSeriestoPlot; + for i := 1 to FNumberofSeries do + begin + if temparray[i] = seriesname then + index := i; + end; + for i := index to FNumberofSeries - 1 do + begin + FSeriestoPlot[i] := temparray[i + 1]; + end; + FNumberofSeries := FNumberofSeries - 1; +end; + +// Clears the selections in a TListbox +procedure TFmDisplayOutput.ClearSeriestoPlot(Listbox:TListBox); +var + i:integer; +begin + for i := 0 to Listbox.Items.Count - 1 do + begin + if Listbox.Selected[i] then + begin + RemoveSeriestoPlot(Listbox.Items[i]); + Listbox.Selected[i] := False; + end; + end; +end; + +// Clear old data from the StringGrid to prevent data overlap when new data is added. +procedure TFmDisplayOutput.ClearGrid; +var + i,j:integer; +begin + for i := FirstRow to SgModelOutput.RowCount - 1 do + for j := 0 to SgModelOutput.ColCount - 1 do + SgModelOutput.Cells[j,i] := ''; // Set all cells to empty strings + SgModelOutput.RowCount := FirstRow; // Decrease size of grid + CurrentRow := FirstRow; +end; + +// Get the stringgrid column number for the variable in seriesname +function TFmDisplayOutput.GetColumnNumber(seriesname:string):integer; +var + j,num:integer; +begin + num := -1; + for j := 0 to SgModelOutput.Colcount - 1 do + begin + if SgModelOutput.Cells[j,1] = seriesname then num := j; + end; + GetColumnNumber := num; +end; + +procedure TFmDisplayOutput.lblParClick(sender: Tobject); +var + tempName : string; +begin +// Getting the number of the label, i.e. 1, 2, 3, or 4 so fmParamList knows which label/edit to modify + tempName := (sender as tcontrol).name; + delete(tempName, 1, 8); + fmParamList.whichEdparselected := strToInt(tempName); + fmParamList.showmodal; +end; + +{ Updates the parameter value shown in the maskedit. } +procedure TFmDisplayOutput.refreshLblEdPar; +var + thisLblEdit : tLabeledEdit; + i : integer; + parIndex : integer; + temp: string; +begin + with PnlParameters do + begin + for i := 0 to controlCount-1 do //look at all the LabeledEdits + begin + if controls[i] is TLabeledEdit then + begin + thisLblEdit := controls[i] as TLabeledEdit; + temp := thisLblEdit.EditLabel.Caption; + if pos('Parameter', temp) = 0 then + begin + parIndex := fmCalculate.getArrayIndex(vtParameter, thisLblEdit.EditLabel.Caption); + thisLblEdit.Text := floatToStr(par[parIndex].value); + end; + end; + end; + end; +end; + +{ Stores the new values of the parameters in the global array, par. } +procedure TFmDisplayOutput.LblEdParExit(Sender: TObject); +var + thisLblEd : TlabeledEdit; + parIndex : integer; +begin + thisLblEd := sender as TlabeledEdit; + if thisLblEd.modified then + begin + parIndex := fmCalculate.getArrayIndex(vtParameter, thisLblEd.editlabel.Caption); + try + par[parIndex].value := strToFloat(thisLblEd.text); + except + messageDlg('Please choose a number', mtWarning, [mbOK], 0); + FmDisplayOutput.ActiveControl := thisLblEd; + end; + refreshLblEdPar; + end; +end; + +procedure TFmDisplayOutput.cbxParamsClick(Sender: TObject); +begin + DlgReload.CbParams.Checked:=cbxParameters.Checked; +end; + +procedure TFmDisplayOutput.cbxStatesClick(Sender: TObject); +begin + DlgReload.cbState.Checked:=cbxStates.Checked; +end; + +procedure TFmDisplayOutput.WriteOutputfromMem; +var + i, j:integer; + tempstring: string; + outfile: textfile; +begin + assignfile(outfile, outfilename); + if (FmOptions.RunOptions.AppendOutputFile) and (not FirstWrite) then + append(outfile) + else + rewrite(outfile); // Create a new file + try + for j := 1 to SgModelOutput.RowCount - 1 do // Start at 1 to skip column numbers + begin + tempstring := SgModelOutput.Cells[0, j]; + for i := 1 to SgModelOutput.ColCount - 1 do tempstring := tempstring + ', ' + SgModelOutput.Cells[i, j]; + writeln(outfile, tempstring); + end; + finally + closefile(outfile); + end; +end; + +procedure TFmDisplayOutput.WritePurgeOutputfromMem; +var + i, j:integer; + tempstring: string; + outfile: textfile; +begin + assignfile(outfile, outfilename); + try + if FirstWrite then + begin + rewrite(outfile); // Create a new file + for j := 1 to SgModelOutput.RowCount - 1 do // Start at 1 to skip column numbers + begin + tempstring := SgModelOutput.Cells[0, j]; + for i := 1 to SgModelOutput.ColCount - 1 do tempstring := tempstring + ', ' + SgModelOutput.Cells[i, j]; + writeln(outfile, tempstring); + end; + FirstWrite := False; + end + else + begin + append(outfile); // Open existing file for writing + for j := 3 to SgModelOutput.RowCount - 1 do // Start at 3 to skip column numbers and variable names and units + begin + tempstring := SgModelOutput.Cells[0, j]; + for i := 1 to SgModelOutput.ColCount - 1 do tempstring := tempstring + ', ' + SgModelOutput.Cells[i, j]; + writeln(outfile, tempstring); + end; + end; + ClearGrid; + finally + closefile(outfile); + end; +end; + +procedure TFmDisplayOutput.StoreResults(ctime:double; var darray:drivearray; var sarray:statearray; + var parray:processarray); +var + j: integer; +begin + SgModelOutput.rowcount := SgModelOutput.rowcount + 1; + SgModelOutput.Cells[0,currentrow] := format('%g',[ctime]); // Write time + for j:= 1 to ModelDef.numdrive // Write drivers + do SgModelOutput.Cells[j,currentrow] := format('%.20g',[darray[j].value]); + + for j:= 1 to ModelDef.numstate // Write state variables + do SgModelOutput.Cells[ModelDef.numdrive + j,currentrow] + := format('%.20g',[sarray[j].value]); + for j:= ModelDef.numstate + 1 to ModelDef.numprocess // Write process variables + do SgModelOutput.Cells[ModelDef.numdrive + j, currentrow] + := format('%.20g',[parray[j].value]); + for j:= 1 to ModelDef.numstate do // Derivatives //****************HERE + SgModelOutput.Cells[ModelDef.numdrive + ModelDef.numprocess + j, currentrow] + := format('%.20g',[parray[j].value]); + currentrow := currentrow + 1; + if SgModelOutput.RowCount>=100000 then + begin + WritePurgeOutputFromMem; + FmShellMain.LargeOutput := True; + end; +end; + +end. + + +interface + +uses + Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Menus, + ExtCtrls, StdCtrls, Grids, TAGraph, TASeries, + TASources, TATools, TACustomSource, TALegendPanel, TATransformations, stypes; + +const + Maxseries = 10; + FirstRow = 3; + +type + plotarray=array[1..MaxSeries] of string; + +type + + { TFmDisplayOutput } + + TFmDisplayOutput = class(TForm) + BtnClearSeries: TButton; + BtnCloseDisplay: TButton; + BtnUpdateChart: TButton; + BtnRun: TButton; + ChartToolset1: TChartToolset; + ChartToolset1PanClickTool1: TPanClickTool; + ChartToolset1PanDragTool1: TPanDragTool; + ChartToolset1ZoomClickTool1: TZoomClickTool; + ChartToolset1ZoomDragTool1: TZoomDragTool; + ChBAxisAutoScale: TAutoScaleAxisTransform; + ChBAxisLogarithm: TLogarithmAxisTransform; + ChBAxisTransforms: TChartAxisTransformations; + CbxParameters: TCheckBox; + CbxStates: TCheckBox; + ChLAxisAutoScale: TAutoScaleAxisTransform; + ChLAxisLogarithm: TLogarithmAxisTransform; + ChLAxisTransforms: TChartAxisTransformations; + ChOutput: TChart; + ChOutputLineSeries1: TLineSeries; + ChOutputLineSeries10: TLineSeries; + ChOutputLineSeries2: TLineSeries; + ChOutputLineSeries3: TLineSeries; + ChOutputLineSeries4: TLineSeries; + ChOutputLineSeries5: TLineSeries; + ChOutputLineSeries6: TLineSeries; + ChOutputLineSeries7: TLineSeries; + ChOutputLineSeries8: TLineSeries; + ChOutputLineSeries9: TLineSeries; + LblEdPar1: TLabeledEdit; + LblEdPar2: TLabeledEdit; + LblEdPar3: TLabeledEdit; + LblEdPar4: TLabeledEdit; + LblDirections: TLabel; + LbxSeriesSelect: TListBox; + ListChartSource1: TListChartSource; + ListChartSource10: TListChartSource; + ListChartSource2: TListChartSource; + ListChartSource3: TListChartSource; + ListChartSource4: TListChartSource; + ListChartSource5: TListChartSource; + ListChartSource6: TListChartSource; + ListChartSource7: TListChartSource; + ListChartSource8: TListChartSource; + ListChartSource9: TListChartSource; + MIYScale: TMenuItem; + MIYSelect: TMenuItem; + MIXScale: TMenuItem; + MIXSelect: TMenuItem; + MIShowTable: TMenuItem; + MIShowChart: TMenuItem; + MIShow: TMenuItem; + MIYaxis: TMenuItem; + MIUpdate: TMenuItem; + MIPrintChart: TMenuItem; + MIXaxis: TMenuItem; + MILoadFile: TMenuItem; + MIClose: TMenuItem; + MISaveOutput: TMenuItem; + MIChart: TMenuItem; + MmDisplay: TMainMenu; + MIWindow: TMenuItem; + PnlParameters: TPanel; + PnlRerun: TPanel; + PnlChartButtons: TPanel; + PnlTop: TPanel; + PnlTopRight: TPanel; + PnlBottom: TPanel; + PnlBottomLeft: TPanel; + PnlBottomRight: TPanel; + RgChartValues: TRadioGroup; + SgModelOutput: TStringGrid; + sLblPar1: TBoundLabel; + sLblPar2: TBoundLabel; + SLblPar3: TBoundLabel; + SplBottomLR: TSplitter; + SplTopBottom: TSplitter; + procedure BtnClearSeriesClick(Sender: TObject); + procedure BtnCloseDisplayClick(Sender: TObject); + procedure BtnRunClick(Sender: TObject); + procedure BtnUpdateChartClick(Sender: TObject); + procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); + procedure FormCreate(Sender: TObject); + procedure FormResize(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure LblEdParKeyPress(Sender: TObject; var Key: char); + procedure MILoadFileClick(Sender: TObject); + procedure MISaveOutputClick(Sender: TObject); + procedure MIScaleClick(Sender: TObject); + procedure PnlTopRightClick(Sender: TObject); + procedure RgChartValuesClick(Sender: TObject); + procedure UpdateChart; + procedure lblParClick(sender: Tobject); + procedure LblEdParExit(sender: Tobject); + procedure refreshLblEdPar; + procedure cbxParamsClick(Sender: TObject); + procedure cbxStatesClick(Sender: TObject); + procedure MIShowChange(Sender: TObject); + procedure MISelectAxisClick(Sender: TObject); + private + { private declarations } + FFilename:String; + FCurrentAxis:TAxis; + FxAxis:string; + FDisplayStep:double; + FDisplayStyle:TDisplayStyle; + FInitialView:Boolean; + FNumberofSeries:integer; // Current number of series selected + FSeriestoPlot:plotarray; // The list of series to be plotted + procedure AddSeriestoPlot(ListBox: Tlistbox); + procedure RemoveSeriestoPlot(seriesname:string); + function GetColumnNumber(seriesname:string):integer; + public + { public declarations } + FirstWrite:Boolean; + CurrentRow: integer; + DisplayFilename:string; + AutoShowChart:Boolean; + property Filename:String read FFilename write FFilename; + property CurrentAxis:TAxis read FCurrentAxis write FCurrentAxis; + property displaystep:double read FDisplayStep write FDisplayStep; + property xAxis:string read FxAxis write FxAxis; + property DisplayStyle:TDisplayStyle read FDisplayStyle write FDisplayStyle; + property NumberofSeries:integer read FNumberofSeries write FNumberofSeries; + procedure FillListBox(ListBox:TListBox); + procedure ClearSeriestoPlot(Listbox:TListBox); + procedure WriteOutputfromMem; + procedure WritePurgeOutputfromMem; + procedure ClearGrid; + procedure StoreResults(ctime:double; var darray:drivearray; var sarray:statearray; + var parray:processarray); + + end; + +var + FmDisplayOutput: TFmDisplayOutput; + +implementation + +uses frontend, ParamList, calculate, ReloadDlg, trouble, fileio, SeriesForm, ScaleDlg, options; +{$R *.lfm} + +{ TFmDisplayOutput } + +procedure TFmDisplayOutput.FormCreate(Sender: TObject); +var + i: integer; +begin + FInitialView := True; + FirstWrite := True; + chOutput.Title.Text.text := modeldef.modelname; // Chart title + + SgModelOutput.RowCount := FirstRow; + SgModelOutput.colcount := modeldef.numdrive + modeldef.numprocess + 1 + modeldef.numstate; // ***********HERE************ + // don't need numstate in the above count because the derivatives are no + // longer in the table so the count of the derivatives in numprocess takes + // care of numstate. + for i := 0 to SgModelOutput.colcount - 1 do SgModelOutput.cells[i,0] := inttostr(i); + SgModelOutput.cells[0,1] := 'Time'; // Column name + SgModelOutput.cells[0,2] := ModelDef.timeunit; // Column units + for i := 1 to modeldef.numdrive do // Add drivers to stringgrid + begin + SgModelOutput.cells[i,1] := drive[i].name; // Column name + SgModelOutput.cells[i,2] := drive[i].units; // Column units + end; + for i := 1 to modeldef.numstate do // Add state variables to grid + begin + SgModelOutput.cells[modeldef.numdrive + i,1] := stat[i].name; // Column name + SgModelOutput.cells[modeldef.numdrive + i,2] := stat[i].units; // Column units + end; + for i := ModelDef.numstate + 1 to modeldef.numprocess do // Add process variables to grid + begin + SgModelOutput.cells[modeldef.numdrive + i,1] := proc[i].name; // Column name + SgModelOutput.cells[modeldef.numdrive + i,2] := proc[i].units; // Column units + end; + for i := 1 to ModelDef.numstate do // Add derivatives to grid + begin + SgModelOutput.cells[modeldef.numdrive + modeldef.numprocess+ i,1] := proc[i].name; // Column name + SgModelOutput.cells[modeldef.numdrive + modeldef.numprocess+i,2] := proc[i].units; // Column units + end; + + FillListBox(LbxSeriesSelect); + FxAxis := 'Time'; +// FDisplayStep := FmOptions.RunOptions.Time_step; +{ autoshowchart := false; } + CurrentRow := FirstRow; + DisplayFilename := 'Memory'; + DisplayStyle:=dsChart; + FmDisplayOutput.ActiveControl:=Lbxseriesselect; + + {$ifdef Darwin} + LblEdPar1.EditLabel.ShowAccelChar:=False; + LblEdPar1.EditLabel.Caption:= 'Parameter 1'; + LblEdPar2.EditLabel.ShowAccelChar:=False; + LblEdPar2.EditLabel.Caption := 'Parameter 2'; + LblEdPar3.EditLabel.ShowAccelChar:=False; + LblEdPar3.EditLabel.Caption := 'Parameter 3'; + LblEdPar4.EditLabel.ShowAccelChar:=False; + LblEdPar4.EditLabel.Caption := 'Parameter 4'; + {$endif} +end; + +procedure TFmDisplayOutput.FormResize(Sender: TObject); +var + numcol:double; +begin + if fInitialView then + begin + FmDisplayOutput.Height:=round(0.8*screen.Height); + FmDisplayOutput.Width := round(0.8*screen.width); + FmDisplayOutput.Top := 0; + fInitialView := False; + end; + if DisplayStyle = dsChart then + begin + PnlBottom.Constraints.MinHeight:=250; + PnlBottom.Height:=2*(FmDisplayOutput.Height div 5); + numcol := LbxSeriesSelect.ClientWidth/(8*stringlength); // assumes 8 units per character + if numcol < 1 then numcol := 1; + LbxSeriesSelect.Columns:=round(numcol); + end + else // Showing the table and not the chart + begin + // Shrink bottom panel and move the close buttom so it's visible + PnlBottom.Constraints.MinHeight:=0; + PnlBottom.Height:=BtnCloseDisplay.Height*3; + BtnCloseDisplay.Top := (PnlBottom.Height - BtnCloseDisplay.Height) div 2 - 1; + end; +end; + +procedure TFmDisplayOutput.FormShow(Sender: TObject); +begin + FmDisplayOutput.Caption := 'Model Output - File: ' + DisplayFilename; +// MessageDlg('number selected = ' + inttostr(LbxSeriesSelect.SelCount), mtInformation, [mbOK], 0); + if DisplayStyle = dsChart then + begin + SgModelOutput.Visible:=False; + PnlTop.Show; + PnlBottomLeft.Show; + BtnUpdateChart.Enabled := True; + BtnUpdateChart.Visible:=True; + BtnClearSeries.Enabled:=True; + BtnClearSeries.Visible:=True; + RgChartValues.Visible := True; + RgChartValues.Enabled := True; + end + else // Showing Data table not chart + begin + SgModelOutput.Visible:=True; + PnlTop.Hide; + PnlBottomLeft.Hide; + BtnUpdateChart.Enabled := False; + BtnUpdateChart.Visible:=False; + BtnClearSeries.Enabled:=False; + BtnClearSeries.Visible:=False; + RgChartValues.Visible := False; + RgChartValues.Enabled := False; + end; + FmDisplayOutput.FormResize(FmShellMain); + cbxParameters.Checked := DlgReload.cbParams.Checked; + cbxStates.Checked := DlgReload.cbState.Checked; +end; + + +procedure TFmDisplayOutput.LblEdParKeyPress(Sender: TObject; var Key: char); +begin + if (Key = Chr(13)) then LblEdParExit(Sender); +end; + +procedure TFmDisplayOutput.MILoadFileClick(Sender: TObject); +var + ttime:double; + tempdrive:drivearray; + tempstate:statearray; + tempprocess:processarray; +begin + tempdrive := drive; + tempstate := stat; + tempprocess := proc; + ClearGrid; + if FmShellMain.DlgOpenOutput.execute then + if FmShellMain.DlgOpenOutput.filename <> '' then + begin + DisplayFilename := FmShellMain.DlgOpenOutput.filename; + try + OpenOutputFile(FmShellMain.DlgOpenOutput.FileName, ModelDef.numdrive, drive, ModelDef.numstate, + stat, ModelDef.numprocess, proc, flread); + while not eof(outfile) do + begin + ReadOutputFile(ttime, ModelDef.numdrive, tempdrive, ModelDef.numstate, tempstate, + ModelDef.numprocess, tempprocess); + StoreResults(ttime, tempdrive, tempstate, tempprocess); + end; + finally + CloseOutputFile; + end; + end; +end; + +procedure TFmDisplayOutput.MISaveOutputClick(Sender: TObject); +begin + if DisplayFilename = 'Memory' then + begin + FmShellMain.ChooseParamFile(FmDisplayOutput); + WriteOutputfromMem; + end + else + MessageDlg('Data already saved in file ' + DisplayFilename, mtInformation, [mbOK], 0 ); +end; + +procedure TFmDisplayOutput.MIScaleClick(Sender: TObject); +begin + if (Sender as TMenuItem).Name = 'MIXScale' then + begin + CurrentAxis := axBottom; + end + else + begin + CurrentAxis := axLeft; + end; + DlgScale.ShowModal; +end; + +procedure TFmDisplayOutput.PnlTopRightClick(Sender: TObject); +begin + +end; + +procedure TFmDisplayOutput.RgChartValuesClick(Sender: TObject); +begin + +end; + +procedure TFmDisplayOutput.MISelectAxisClick(Sender: TObject); +begin + if (Sender as TMenuItem).Name = 'MIXSelect' then + CurrentAxis := axBottom + else + CurrentAxis := axLeft; + FmSeries.ShowModal; +end; + +procedure TFmDisplayOutput.MIShowChange(Sender: TObject); +begin + if (Sender as TMenuItem).Name = 'MIShowTable' then + DisplayStyle := dsTable + else + DisplayStyle := dsChart; + FmDisplayOutput.FormShow(Sender); +end; + +procedure TFmDisplayOutput.BtnCloseDisplayClick(Sender: TObject); +begin + FmDisplayOutput.Close; + DlgReload.cbParams.Checked := cbxParameters.Checked; + DlgReload.cbState.Checked := cbxStates.Checked; +end; + +procedure TFmDisplayOutput.BtnRunClick(Sender: TObject); +begin + if MessageDlg('Rerun model using current run options?', mtConfirmation, [mbYes,mbNo], 0) = mrYes then + begin + SgModelOutput.BeginUpdate; + dlgReload.okBtn.click; + FmShellMain.btnRun.click; + if FmTrouble.visible then FmTrouble.BringToFront; + SgModelOutput.EndUpdate(True); + end; +end; + +procedure TFmDisplayOutput.BtnClearSeriesClick(Sender: TObject); +begin + ClearSeriestoPlot(LbxSeriesSelect); +end; + +procedure TFmDisplayOutput.BtnUpdateChartClick(Sender: TObject); +begin + UpdateChart; + refreshLblEdPar; +end; + +procedure TFmDisplayOutput.FormClose(Sender: TObject; + var CloseAction: TCloseAction); +begin + BtnCloseDisplayClick(sender); +end; + +procedure TFmDisplayOutput.UpdateChart; +var + i,j,xcolumn,ycolumn:integer; + CurrentChartSource:^TListChartSource; +begin +try + New(CurrentChartSource); + // Inactivate previous series + for i := 0 to MaxSeries - 1 do Choutput.series[i].active := false; + + // Put title on Bottom Axis + xcolumn := GetColumnNumber(xAxis); + ChOutput.BottomAxis.Title.Caption := SgModelOutput.cells[xcolumn,1]; + + // Clear the chart of previous plots +// for i:=0 to ChOutput.SeriesCount-1 do ChOutput.Series[i].Clear; +// If ChOutput.SeriesCount > 0 then ChOutput.ClearSeries; + ChOutputLineSeries1.Clear; + ChOutputLineSeries2.Clear; + ChOutputLineSeries3.Clear; + ChOutputLineSeries4.Clear; + ChOutputLineSeries5.Clear; + ChOutputLineSeries6.Clear; + ChOutputLineSeries7.Clear; + ChOutputLineSeries8.Clear; + ChOutputLineSeries9.Clear; + ChOutputLineSeries10.Clear; + + // Store series to plot in plotarray + AddSeriestoPlot(LbxSeriesSelect); + + // Activate the number of series to plot. + for i := 0 to FNumberofSeries - 1 do Choutput.series[i].active := true; + + // Check for divide by zero if relative change is selected + if (RgChartValues.ItemIndex=1) then + for j := 0 to FNumberofSeries - 1 do + begin + ycolumn := GetColumnNumber(FSeriestoPlot[j+1]); + if (RgChartValues.ItemIndex=1) and (strtofloat(SgModelOutput.Cells[ycolumn,FirstRow]) = 0) then // The if itemindex=1 needs to be here so that the code doesn't give the error for every series on the chart. It only needs to be corrected once. + begin + MessageDlg('Unable to display relative values because y0 is zero. Displaying actual values instead.', mtInformation, [mbOK], 0 ); + RgChartValues.ItemIndex:=0; + end; + end; + + // Add each series to the datasource. + for j := 0 to FNumberofSeries - 1 do + begin + ycolumn := GetColumnNumber(FSeriestoPlot[j+1]); + case j of + 0: begin + CurrentChartSource^:=ListChartSource1; + ChOutputLineSeries1.Title := SgModelOutput.Cells[ycolumn,1]; + end; + 1: begin + CurrentChartSource^:=ListChartSource2; + ChOutputLineSeries2.Title := SgModelOutput.Cells[ycolumn,1]; + end; + 2: begin + CurrentChartSource^:=ListChartSource3; + ChOutputLineSeries3.Title := SgModelOutput.Cells[ycolumn,1]; + end; + 3: begin + CurrentChartSource^:=ListChartSource4; + ChOutputLineSeries4.Title := SgModelOutput.Cells[ycolumn,1]; + end; + 4: begin + CurrentChartSource^:=ListChartSource5; + ChOutputLineSeries5.Title := SgModelOutput.Cells[ycolumn,1]; + end; + 5: begin + CurrentChartSource^:=ListChartSource6; + ChOutputLineSeries6.Title := SgModelOutput.Cells[ycolumn,1]; + end; + 6: begin + CurrentChartSource^:=ListChartSource7; + ChOutputLineSeries7.Title := SgModelOutput.Cells[ycolumn,1]; + end; + 7: begin + CurrentChartSource^:=ListChartSource8; + ChOutputLineSeries8.Title := SgModelOutput.Cells[ycolumn,1]; + end; + 8: begin + CurrentChartSource^:=ListChartSource9; + ChOutputLineSeries9.Title := SgModelOutput.Cells[ycolumn,1]; + end; + 9: begin + CurrentChartSource^:=ListChartSource10; + ChOutputLineSeries10.Title := SgModelOutput.Cells[ycolumn,1]; + end; + end; + for i := FirstRow to SgModelOutput.RowCount - 1 do + begin + case RgChartValues.ItemIndex of + 0: CurrentChartSource.add(strtofloat(SgModelOutput.Cells[xcolumn,i]), + strtofloat(SgModelOutput.Cells[ycolumn,i])); + 1: CurrentChartSource.add(strtofloat(SgModelOutput.Cells[xcolumn,i]), + strtofloat(SgModelOutput.Cells[ycolumn,i])/strtofloat(SgModelOutput.Cells[ycolumn,FirstRow])); + 2: CurrentChartSource.add(strtofloat(SgModelOutput.Cells[xcolumn,i]), + strtofloat(SgModelOutput.Cells[ycolumn,i])-strtofloat(SgModelOutput.cells[ycolumn,FirstRow])); + end; + end; + end; + refreshLblEdPar; +finally + Dispose(CurrentChartSource); +end; +end; + +procedure TFmDisplayOutput.FillListBox(ListBox:TListBox); +var + i:integer; +begin + ListBox.Items.Clear; + ListBox.Items.Add('Time'); + for i := 1 to ModelDef.numdrive do // Add driver names to listbox + ListBox.Items.Add(drive[i].name); + for i := 1 to ModelDef.numstate do // Add state variable names to listbox + ListBox.Items.Add(stat[i].name); + for i := ModelDef.numstate + 1 to ModelDef.numprocess do // Add process variable names to listbox + ListBox.Items.Add(proc[i].name); +end; + +// Adds a series to the FSeriestoPlot array +procedure TFmDisplayOutput.AddSeriestoPlot(ListBox: Tlistbox); +var + index:integer; +begin + FNumberofSeries := 0; + for index := 0 to Listbox.Items.Count - 1 do + begin + if Listbox.Selected[index] then + begin + if FNumberofSeries = MaxSeries then + MessageDlg('Cannot display series. Maximum is 10 series.', mtError, [mbOK], 0) + else + begin + FNumberofSeries := FNumberofSeries + 1; + FSeriestoPlot[FNumberofSeries] := ListBox.Items[index]; + end; + end; + end; +end; + +// Removes a series from the FSeriestoPlot array +procedure TFmDisplayOutput.RemoveSeriestoPlot(seriesname:string); +var + temparray:plotarray; + i,index:integer; +begin + index := 1; + temparray := FSeriestoPlot; + for i := 1 to FNumberofSeries do + begin + if temparray[i] = seriesname then + index := i; + end; + for i := index to FNumberofSeries - 1 do + begin + FSeriestoPlot[i] := temparray[i + 1]; + end; + FNumberofSeries := FNumberofSeries - 1; +end; + +// Clears the selections in a TListbox +procedure TFmDisplayOutput.ClearSeriestoPlot(Listbox:TListBox); +var + i:integer; +begin + for i := 0 to Listbox.Items.Count - 1 do + begin + if Listbox.Selected[i] then + begin + RemoveSeriestoPlot(Listbox.Items[i]); + Listbox.Selected[i] := False; + end; + end; +end; + +// Clear old data from the StringGrid to prevent data overlap when new data is added. +procedure TFmDisplayOutput.ClearGrid; +var + i,j:integer; +begin + for i := FirstRow to SgModelOutput.RowCount - 1 do + for j := 0 to SgModelOutput.ColCount - 1 do + SgModelOutput.Cells[j,i] := ''; // Set all cells to empty strings + SgModelOutput.RowCount := FirstRow; // Decrease size of grid + CurrentRow := FirstRow; +end; + +// Get the stringgrid column number for the variable in seriesname +function TFmDisplayOutput.GetColumnNumber(seriesname:string):integer; +var + j,num:integer; +begin + num := -1; + for j := 0 to SgModelOutput.Colcount - 1 do + begin + if SgModelOutput.Cells[j,1] = seriesname then num := j; + end; + GetColumnNumber := num; +end; + +procedure TFmDisplayOutput.lblParClick(sender: Tobject); +var + tempName : string; +begin +// Getting the number of the label, i.e. 1, 2, 3, or 4 so fmParamList knows which label/edit to modify + tempName := (sender as tcontrol).name; + delete(tempName, 1, 8); + fmParamList.whichEdparselected := strToInt(tempName); + fmParamList.showmodal; +end; + +{ Updates the parameter value shown in the maskedit. } +procedure TFmDisplayOutput.refreshLblEdPar; +var + thisLblEdit : tLabeledEdit; + i : integer; + parIndex : integer; + temp: string; +begin + with PnlParameters do + begin + for i := 0 to controlCount-1 do //look at all the LabeledEdits + begin + if controls[i] is TLabeledEdit then + begin + thisLblEdit := controls[i] as TLabeledEdit; + temp := thisLblEdit.EditLabel.Caption; + if pos('Parameter', temp) = 0 then + begin + parIndex := fmCalculate.getArrayIndex(vtParameter, thisLblEdit.EditLabel.Caption); + thisLblEdit.Text := floatToStr(par[parIndex].value); + end; + end; + end; + end; +end; + +{ Stores the new values of the parameters in the global array, par. } +procedure TFmDisplayOutput.LblEdParExit(Sender: TObject); +var + thisLblEd : TlabeledEdit; + parIndex : integer; +begin + thisLblEd := sender as TlabeledEdit; + if thisLblEd.modified then + begin + parIndex := fmCalculate.getArrayIndex(vtParameter, thisLblEd.editlabel.Caption); + try + par[parIndex].value := strToFloat(thisLblEd.text); + except + messageDlg('Please choose a number', mtWarning, [mbOK], 0); + FmDisplayOutput.ActiveControl := thisLblEd; + end; + refreshLblEdPar; + end; +end; + +procedure TFmDisplayOutput.cbxParamsClick(Sender: TObject); +begin + DlgReload.CbParams.Checked:=cbxParameters.Checked; +end; + +procedure TFmDisplayOutput.cbxStatesClick(Sender: TObject); +begin + DlgReload.cbState.Checked:=cbxStates.Checked; +end; + +procedure TFmDisplayOutput.WriteOutputfromMem; +var + i, j:integer; + tempstring: string; + outfile: textfile; +begin + assignfile(outfile, outfilename); + if (FmOptions.RunOptions.AppendOutputFile) and (not FirstWrite) then + append(outfile) + else + rewrite(outfile); // Create a new file + try + for j := 1 to SgModelOutput.RowCount - 1 do // Start at 1 to skip column numbers + begin + tempstring := SgModelOutput.Cells[0, j]; + for i := 1 to SgModelOutput.ColCount - 1 do tempstring := tempstring + ', ' + SgModelOutput.Cells[i, j]; + writeln(outfile, tempstring); + end; + finally + closefile(outfile); + end; +end; + +procedure TFmDisplayOutput.WritePurgeOutputfromMem; +var + i, j:integer; + tempstring: string; + outfile: textfile; +begin + assignfile(outfile, outfilename); + try + if FirstWrite then + begin + rewrite(outfile); // Create a new file + for j := 1 to SgModelOutput.RowCount - 1 do // Start at 1 to skip column numbers + begin + tempstring := SgModelOutput.Cells[0, j]; + for i := 1 to SgModelOutput.ColCount - 1 do tempstring := tempstring + ', ' + SgModelOutput.Cells[i, j]; + writeln(outfile, tempstring); + end; + FirstWrite := False; + end + else + begin + append(outfile); // Open existing file for writing + for j := 3 to SgModelOutput.RowCount - 1 do // Start at 3 to skip column numbers and variable names and units + begin + tempstring := SgModelOutput.Cells[0, j]; + for i := 1 to SgModelOutput.ColCount - 1 do tempstring := tempstring + ', ' + SgModelOutput.Cells[i, j]; + writeln(outfile, tempstring); + end; + end; + ClearGrid; + finally + closefile(outfile); + end; +end; + +procedure TFmDisplayOutput.StoreResults(ctime:double; var darray:drivearray; var sarray:statearray; + var parray:processarray); +var + j: integer; +begin + SgModelOutput.rowcount := SgModelOutput.rowcount + 1; + SgModelOutput.Cells[0,currentrow] := format('%g',[ctime]); // Write time + for j:= 1 to ModelDef.numdrive // Write drivers + do SgModelOutput.Cells[j,currentrow] := format('%.8g',[darray[j].value]); + + for j:= 1 to ModelDef.numstate // Write state variables + do SgModelOutput.Cells[ModelDef.numdrive + j,currentrow] + := format('%.8g',[sarray[j].value]); + for j:= ModelDef.numstate + 1 to ModelDef.numprocess // Write process variables + do SgModelOutput.Cells[ModelDef.numdrive + j, currentrow] + := format('%.8g',[parray[j].value]); + currentrow := currentrow + 1; + if SgModelOutput.RowCount>=100000 then + begin + WritePurgeOutputFromMem; + FmShellMain.LargeOutput := True; + end; +end; + +end. + diff --git a/modelshell/equations.pas b/modelshell/equations.pas new file mode 100644 index 0000000..da8e302 --- /dev/null +++ b/modelshell/equations.pas @@ -0,0 +1,1166 @@ +{ This unit defines the structure of the model. There are four functions. The + first function, called counts, defines the number, names, and units of the + model, the state variables, the process variables, the driver variables and + the parameters. The second function, called processes, is the actual equations + which make up the model. The third function, derivs, calculates the + derivatives of state variables. And the fourth function, parcount, is used to + automatically number the parameters consecutively. + The state variables, driver variables, process variables and parameters are + all stored in global arrays, called stat, drive, proc, and par, respectively. + The function counts accesses the global arrays directly but the other functions + operate on copies of the global arrays. } +unit equations; + +interface + +uses stypes, math, sysutils; + +PROCEDURE counts; +PROCEDURE processes(time:double; dtime:double; var tdrive:drivearray; + var tpar:paramarray; var tstat:statearray; + var tproc:processarray; CalculateDiscrete:Boolean); +PROCEDURE derivs(t, drt:double; var tdrive:drivearray; var tpar:paramarray; + var statevalue:yValueArray; VAR dydt:yValueArray); +function ParCount(processnum:integer) : integer; + +var + tproc:processarray; + tstat:statearray; + sensflag:boolean; + newyear:Boolean = false; + DayofYear: double = 0; + h: array[1..4,1..4] of double; + +implementation + +uses frontend, calculate, options; + + { Do not make modifcations above this line. } +{*****************************************************************************} + +{ This procedure defines the model. The number of parameters, state, driver and + process variables are all set in this procedure. The model name, version + number and time unit are also set here. This procedure accesses the global + arrays containing the the parameters, state, driver and process variables and + the global structure ModelDef directly, to save memory space. } +PROCEDURE counts; +var + i,npar,CurrentProc:integer; +begin +{ Set the modelname, version and time unit. } +ModelDef.modelname := 'substitutable resource'; +ModelDef.versionnumber := '1.0.0'; +ModelDef.timeunit := 'day'; +ModelDef.contactperson := 'Ed'; +ModelDef.contactaddress1 := 'Ecosystems'; +ModelDef.contactaddress2 := 'MBL'; +ModelDef.contactaddress3 := 'Woods Hole'; + +{ Set the number of state variables in the model. The maximum number of state + variables is maxstate, in unit stypes. } +ModelDef.numstate := 16; + +{ Enter the name, units and symbol for each state variable. The maximum length + of the state variable name is 17 characters and the maximum length for units + and symbol is stringlength (specified in unit stypes) characters. } + + +with stat[1] do + begin + name:='Plant C'; units:='g C m-2'; symbol:='BC'; + end; + +with stat[2] do + begin + name:='Plant N'; units:='g N m-2'; symbol:='BN'; + end; + +with stat[3] do + begin + name:='Avail N 1'; units:='g N m-2'; symbol:='N1'; + end; + +with stat[4] do + begin + name:='Avail N 2'; units:='g N m-2'; symbol:='N2'; + end; + +with stat[5] do + begin + name:='Avail N 3'; units:='g N m-2'; symbol:='N3'; + end; + +with stat[6] do + begin + name:='Avail N 4'; units:='g N m-2'; symbol:='N4'; + end; + +with stat[7] do + begin + name:='Effort C'; units:='effort'; symbol:='VC'; + end; + +with stat[8] do + begin + name:='Effort N'; units:='effort'; symbol:='VN'; + end; + +with stat[9] do + begin + name:='sub effort 1'; units:='effort'; symbol:='v1'; + end; + +with stat[10] do + begin + name:='sub effort 2'; units:='effort'; symbol:='v2'; + end; + +with stat[11] do + begin + name:='sub effort 3'; units:='effort'; symbol:='v3'; + end; + +with stat[12] do + begin + name:='sub effort 4'; units:='effort'; symbol:='v4'; + end; + +with stat[13] do + begin + name:='Int up C'; units:='g C m-2 day-1'; symbol:='UCbar'; + end; + +with stat[14] do + begin + name:='Int up N'; units:='g N m-2 day-1'; symbol:='UNbar'; + end; + +with stat[15] do + begin + name:='Int rec C'; units:='g C m-2 day-1'; symbol:='RCbar'; + end; + +with stat[16] do + begin + name:='Int rec N'; units:='g N m-2 day-1'; symbol:='RNbar'; + end; + +{ Set the total number of processes in the model. The first numstate processes + are the derivatives of the state variables. The maximum number of processes is + maxparam, in unit stypes. } +ModelDef.numprocess := ModelDef.numstate + 29; + +{ For each process, set proc[i].parameters equal to the number of parameters + associated with that process, and set IsDiscrete to true or false. After each + process, set the name, units, and symbol for all parameters associated with + that process. Note that Parcount returns the total number of parameters in + all previous processes. } + +CurrentProc := ModelDef.numstate + 1; +With proc[CurrentProc] do + begin + name := 'Photosynthesis'; + units := 'g C m-2 day-1'; + symbol := 'UC'; + parameters := 4; + ptype := ptGroup1; + end; +npar:=ParCount(CurrentProc); +with par[npar + 1] do + begin + name:='max Ps'; units:='g C m-2 day-1'; symbol:='Pmax'; + end; +with par[npar + 2] do + begin + name:='half sat'; units:='MJ m-2 day-1'; symbol:='eta'; + end; +with par[npar + 3] do + begin + name:='beers coef'; units:='m2 m-2'; symbol:='kI'; + end; +with par[npar + 4] do + begin + name:='spec leaf area'; units:='m-2 g-1 C'; symbol:='lambda'; + end; + +CurrentProc := ModelDef.numstate + 2; +With proc[CurrentProc] do + begin + name := 'Total N up'; + units := 'g N m-2 day-1'; + symbol := 'UN'; + parameters := 0; + ptype := ptGroup1; + end; + +CurrentProc := ModelDef.numstate + 3; +With proc[CurrentProc] do + begin + name := 'N up 1'; + units := 'g N m-2 day-1'; + symbol := 'UN1'; + parameters := 2; + ptype := ptGroup1; + end; +npar:=ParCount(CurrentProc); +with par[npar + 1] do + begin + name:='N up rate 1'; units:='g N g-1 C day-1'; symbol:='gN1'; + end; +with par[npar + 2] do + begin + name:='half sat 1'; units:='g N m-2'; symbol:='kN1'; + end; + +CurrentProc := ModelDef.numstate + 4; +With proc[CurrentProc] do + begin + name := 'N up 2'; + units := 'g N m-2 day-1'; + symbol := 'UN2'; + parameters := 2; + ptype := ptGroup1; + end; +npar:=ParCount(CurrentProc); +with par[npar + 1] do + begin + name:='N up rate 2'; units:='g N g-1 C day-1'; symbol:='gN2'; + end; +with par[npar + 2] do + begin + name:='half sat 2'; units:='g N m-2'; symbol:='kN2'; + end; + +CurrentProc := ModelDef.numstate + 5; +With proc[CurrentProc] do + begin + name := 'N up 3'; + units := 'g N m-2 day-1'; + symbol := 'UN3'; + parameters := 2; + ptype := ptGroup1; + end; +npar:=ParCount(CurrentProc); +with par[npar + 1] do + begin + name:='N up rate 3'; units:='g N g-1 C day-1'; symbol:='gN3'; + end; +with par[npar + 2] do + begin + name:='half sat 3'; units:='g N m-2'; symbol:='kN3'; + end; + +CurrentProc := ModelDef.numstate + 6; +With proc[CurrentProc] do + begin + name := 'N up 4'; + units := 'g N m-2 day-1'; + symbol := 'UN4'; + parameters := 2; + ptype := ptGroup1; + end; +npar:=ParCount(CurrentProc); +with par[npar + 1] do + begin + name:='N up rate 4'; units:='g N g-1 C day-1'; symbol:='gN4'; + end; +with par[npar + 2] do + begin + name:='half sat 4'; units:='g N m-2'; symbol:='kN4'; + end; + +CurrentProc := ModelDef.numstate + 7; +With proc[CurrentProc] do + begin + name := 'Respiration'; + units := 'g C m-2 day-1'; + symbol := 'RC'; + parameters := 1; + ptype := ptGroup1; + end; +npar:=ParCount(CurrentProc); +with par[npar + 1] do + begin + name:='resp rate const'; units:='day-1'; symbol:='rmC'; + end; + +CurrentProc := ModelDef.numstate + 8; +With proc[CurrentProc] do + begin + name := 'C turnover'; + units := 'g C m-2 day-1'; + symbol := 'TC'; + parameters := 1; + ptype := ptGroup1; + end; +npar:=ParCount(CurrentProc); +with par[npar + 1] do + begin + name:='C turnover rate const'; units:='day-1'; symbol:='mC'; + end; + +CurrentProc := ModelDef.numstate + 9; +With proc[CurrentProc] do + begin + name := 'N turnover'; + units := 'g N m-2 day-1'; + symbol := 'TN'; + parameters := 1; + ptype := ptGroup1; + end; +npar:=ParCount(CurrentProc); +with par[npar + 1] do + begin + name:='N turnover rate const'; units:='day-1'; symbol:='mN'; + end; + +CurrentProc := ModelDef.numstate + 10; +With proc[CurrentProc] do + begin + name := 'PHI'; + units := 'none'; + symbol := 'PHI'; + parameters := 4; + ptype := ptGroup1; + end; +npar:=ParCount(CurrentProc); +with par[npar + 1] do + begin + name:='acclim rate'; units:='day-1'; symbol:='a'; + end; +with par[npar + 2] do + begin + name:='sub acclim rate'; units:='day-1'; symbol:='omega'; + end; +with par[npar + 3] do + begin + name:='eps0'; units:='none'; symbol:='eps0'; + end; +with par[npar + 4] do + begin + name:='int const'; units:='day-1'; symbol:='rho'; + end; + +CurrentProc := ModelDef.numstate + 11; +With proc[CurrentProc] do + begin + name := 'psiC'; + units := 'g C m-2 day-1'; + symbol := 'psiC'; + parameters := 0; + ptype := ptGroup1; + end; + +CurrentProc := ModelDef.numstate + 12; +With proc[CurrentProc] do + begin + name := 'psiN'; + units := 'g N m-2 day-1'; + symbol := 'psiN'; + parameters := 0; + ptype := ptGroup1; + end; + +CurrentProc := ModelDef.numstate + 13; +With proc[CurrentProc] do + begin + name := 'allometry'; + units := 'g C m-2'; + symbol := 'S'; + parameters := 2; + ptype := ptGroup1; + end; +npar:=ParCount(CurrentProc); +with par[npar + 1] do + begin + name:='alpha'; units:='m2 g-1 C'; symbol:='alpha'; + end; +with par[npar + 2] do + begin + name:='gamma'; units:='m2 g-1 C'; symbol:='gamma'; + end; + +CurrentProc := ModelDef.numstate + 14; +With proc[CurrentProc] do + begin + name := 'stoichiometry'; + units := 'none'; + symbol := 'THETA'; + parameters := 1; + ptype := ptGroup1; + end; +npar:=ParCount(CurrentProc); +with par[npar + 1] do + begin + name:='opt C:N'; units:='g C g-1 N'; symbol:='qB'; + end; + +CurrentProc := ModelDef.numstate + 15; +With proc[CurrentProc] do + begin + name := 'max yield'; + units := 'g N m-2 effort-1 day-1'; + symbol := 'ymax'; + parameters := 0; + ptype := ptGroup1; + end; + +CurrentProc := ModelDef.numstate + 16; +With proc[CurrentProc] do + begin + name := 'beta'; + units := 'none'; + symbol := 'beta'; + parameters := 0; + ptype := ptGroup1; + end; + +CurrentProc := ModelDef.numstate + 17; +With proc[CurrentProc] do + begin + name := 'eps1'; + units := 'effort'; + symbol := 'eps1'; + parameters := 0; + ptype := ptGroup1; + end; + +CurrentProc := ModelDef.numstate + 18; +With proc[CurrentProc] do + begin + name := 'eps2'; + units := 'effort'; + symbol := 'eps2'; + parameters := 0; + ptype := ptGroup1; + end; + +CurrentProc := ModelDef.numstate + 19; +With proc[CurrentProc] do + begin + name := 'eps3'; + units := 'effort'; + symbol := 'eps3'; + parameters := 0; + ptype := ptGroup1; + end; + +CurrentProc := ModelDef.numstate + 20; +With proc[CurrentProc] do + begin + name := 'eps4'; + units := 'effort'; + symbol := 'eps4'; + parameters := 0; + ptype := ptGroup1; + end; + +CurrentProc := ModelDef.numstate + 21; +With proc[CurrentProc] do + begin + name := 'N leach 1'; + units := 'g N m-2 day-1'; + symbol := 'LN1'; + parameters := 1; + ptype := ptGroup1; + end; +npar:=ParCount(CurrentProc); +with par[npar + 1] do + begin + name:='loss rate cosnt1'; units:='day-1'; symbol:='tau1'; + end; + +CurrentProc := ModelDef.numstate + 22; +With proc[CurrentProc] do + begin + name := 'N leach 2'; + units := 'g N m-2 day-1'; + symbol := 'LN2'; + parameters := 1; + ptype := ptGroup1; + end; +npar:=ParCount(CurrentProc); +with par[npar + 1] do + begin + name:='loss rate cosnt2'; units:='day-1'; symbol:='tau2'; + end; + +CurrentProc := ModelDef.numstate + 23; +With proc[CurrentProc] do + begin + name := 'N leach 3'; + units := 'g N m-2 day-1'; + symbol := 'LN3'; + parameters := 1; + ptype := ptGroup1; + end; +npar:=ParCount(CurrentProc); +with par[npar + 1] do + begin + name:='loss rate cosnt3'; units:='day-1'; symbol:='tau3'; + end; + +CurrentProc := ModelDef.numstate + 24; +With proc[CurrentProc] do + begin + name := 'N leach 4'; + units := 'g N m-2 day-1'; + symbol := 'LN4'; + parameters := 1; + ptype := ptGroup1; + end; +npar:=ParCount(CurrentProc); +with par[npar + 1] do + begin + name:='loss rate cosnt4'; units:='day-1'; symbol:='tau4'; + end; + +CurrentProc := ModelDef.numstate + 25; +With proc[CurrentProc] do + begin + name := 'yeild 1'; + units := 'g N m-2 effort-1 day-1'; + symbol := 'y1'; + parameters := 1; + ptype := ptGroup1; + end; +npar:=ParCount(CurrentProc); +with par[npar + 1] do + begin + name:='cost 1'; units:='g c g-1 N'; symbol:='phi1'; + end; + +CurrentProc := ModelDef.numstate + 26; +With proc[CurrentProc] do + begin + name := 'yeild 2'; + units := 'g N m-2 effort-1 day-1'; + symbol := 'y2'; + parameters := 1; + ptype := ptGroup1; + end; +npar:=ParCount(CurrentProc); +with par[npar + 1] do + begin + name:='cost 2'; units:='g c g-1 N'; symbol:='phi2'; + end; + +CurrentProc := ModelDef.numstate + 27; +With proc[CurrentProc] do + begin + name := 'yeild 3'; + units := 'g N m-2 effort-1 day-1'; + symbol := 'y3'; + parameters := 1; + ptype := ptGroup1; + end; +npar:=ParCount(CurrentProc); +with par[npar + 1] do + begin + name:='cost 3'; units:='g c g-1 N'; symbol:='phi3'; + end; + +CurrentProc := ModelDef.numstate + 28; +With proc[CurrentProc] do + begin + name := 'yeild 4'; + units := 'g N m-2 effort-1 day-1'; + symbol := 'y4'; + parameters := 1; + ptype := ptGroup1; + end; +npar:=ParCount(CurrentProc); +with par[npar + 1] do + begin + name:='cost 4'; units:='g c g-1 N'; symbol:='phi4'; + end; + +CurrentProc := ModelDef.numstate + 29; +With proc[CurrentProc] do + begin + name := 'dUCdVC'; + units := 'g C m-2 day-1 effort-1'; + symbol := 'dUCdVC'; + parameters := 0; + ptype := ptGroup1; + end; + +{ Set the total number of drivers in the model. The maximum number of drivers is + maxdrive, in unit stypes. } +ModelDef.numdrive := 5; + +{ Set the names, units, and symbols of the drivers. The maximum length for the + name, units and symbol is 20 characters. } + +with drive[1] do + begin + name:='irradiance'; units:='MJ m-2 day-1'; symbol:='I'; + end; + +with drive[2] do + begin + name:='N input 1'; units:='g N m-2 day-1'; symbol:='IN1'; + end; + +with drive[3] do + begin + name:='N input 2'; units:='g N m-2 day-1'; symbol:='IN2'; + end; + +with drive[4] do + begin + name:='N input 3'; units:='g N m-2 day-1'; symbol:='IN3'; + end; + +with drive[5] do + begin + name:='N input 4'; units:='g N m-2 day-1'; symbol:='IN4'; + end; + +{ The first numstate processes are the derivatives of the state variables. The + code sets the names, units and symbols accordingly.} +for i:= 1 to ModelDef.numstate do proc[i].name:='d'+stat[i].name+'dt'; +for i:= 1 to ModelDef.numstate do proc[i].units := stat[i].units + 't-1'; +for i:= 1 to ModelDef.numstate do proc[i].symbol := 'd' + stat[i].symbol + 'dt'; + +{ Code to sum up the total number of parameters in the model. Do not change the + next few lines. } +ModelDef.numparam := 0; +for i := 1 to ModelDef.NumProcess do + ModelDef.numparam := ModelDef.numparam + proc[i].parameters; + +end; // counts procedure + + +{ A procedure to calculate the value of all states and processes at the current + time. This function accesses time, state variables and process variables by + reference, ie it uses the same array as the calling routine. It does not use + the global variables time, stat and proc because values calculated during + integration might later be discarded. It does access the global variables par, + drive and ModelDef directly because those values are not modified. + + The model equations are written using variable names which correspond to the + actual name instead of using the global arrays (i.e. SoilWater instead of + stat[7].value). This makes it necessary to switch all values into local + variables, do all the calculations and then put everything back into the + global variables. Lengthy but worth it in terms of readability of the code. } + +// Choose either GlobalPs, ArcticPs, or none here so the appropriate Ps model is compiled below. +{$DEFINE none} + +PROCEDURE processes(time:double; dtime:double; var tdrive:drivearray; + var tpar:paramarray; var tstat:statearray; + var tproc:processarray; CalculateDiscrete:Boolean); +{$IFDEF GlobalPs} +const +// Global Ps parameters + x1 = 11.04; x2 = 0.03; + x5 = 0.216; x6 = 0.6; + x7 = 3.332; x8 = 0.004; + x9 = 1.549; x10 = 1.156; + gammastar = 0; kCO2 = 995.4; } +{$ENDIF} + +// Modify constant above (line above "procedure processes..." line )to specify +// which Ps model and it's constants should be compiled. Choosing a Ps model +// automatically includes the Et and Misc constants (i.e. Gem is assumed). + +{$IFDEF ArcticPs} +const +// Arctic Ps parameters +x1 = 0.192; x2 = 0.125; +x5 = 2.196; x6 = 50.41; +x7 = 0.161; x8 = 14.78; +x9 = 1.146; +gammastar = 0.468; kCO2 = 500.3; +{$ENDIF} + +{$IFDEF ArcticPs OR GlobalPs} +//const +// General Et parameters +aE1 = 0.0004; aE2 = 150; aE3 = 1.21; aE4 = 6.11262E5; + +// Other constants +cp = 1.012E-9; //specific heat air MJ kg-1 oC-1 +sigmaSB = 4.9e-9; //stefan-Boltzmann MJ m-2 day-1 K-4 +S0 = 117.5; //solar constant MJ m-2 day-1 +bHI1 =0.23; +bHI2 =0.48; +mw = 2.99; //kg h2o MJ-1 +alphaMS = 2; //mm oC-1 day-1 } +{$ENDIF} + +var +{ List the variable names you are going to use here. Generally, this list + includes all the symbols you defined in the procedure counts above. The order + in which you list them does not matter. } +{States} +BC, dBCdt, +BN, dBNdt, +N1, dN1dt, +N2, dN2dt, +N3, dN3dt, +N4, dN4dt, +VC, dVCdt, +VN, dVNdt, +v1, dv1dt, +v2, dv2dt, +v3, dv3dt, +v4, dv4dt, +UCbar, dUCbardt, +UNbar, dUNbardt, +RCbar, dRCbardt, +RNbar, dRNbardt, + +{processes and associated parameters} +UC, Pmax, eta, kI, lambda, +UN, +UN1, gN1, kN1, +UN2, gN2, kN2, +UN3, gN3, kN3, +UN4, gN4, kN4, +RC, rmC, +TC, mC, +TN, mN, +PHI, a, omega, eps0, rho, +psiC, +psiN, +S, alpha, gamma, +THETA, qB, +ymax, +beta, +eps1, +eps2, +eps3, +eps4, +LN1, tau1, +LN2, tau2, +LN3, tau3, +LN4, tau4, +y1, phi1, +y2, phi2, +y3, phi3, +y4, phi4, +dUCdVC, + +{drivers} +I, +IN1, +IN2, +IN3, +IN4 + +{Other double} + +:double; {Final double} + +{Other integers} +npar, j, jj, kk, ll, tnum:integer; + +{ Boolean Variables } + + +{ Functions or procedures } + +begin +{ Copy the drivers from the global array, drive, into the local variables. } +I := tdrive[1].value; +IN1 := tdrive[2].value; +IN2 := tdrive[3].value; +IN3 := tdrive[4].value; +IN4 := tdrive[5].value; + +{ Copy the state variables from the global array into the local variables. } +BC := tstat[1].value; +BN := tstat[2].value; +N1 := tstat[3].value; +N2 := tstat[4].value; +N3 := tstat[5].value; +N4 := tstat[6].value; +VC := tstat[7].value; +VN := tstat[8].value; +v1 := tstat[9].value; +v2 := tstat[10].value; +v3 := tstat[11].value; +v4 := tstat[12].value; +UCbar := tstat[13].value; +UNbar := tstat[14].value; +RCbar := tstat[15].value; +RNbar := tstat[16].value; + +{ And now copy the parameters into the local variables. No need to copy the + processes from the global array into local variables. Process values will be + calculated by this procedure. + + Copy the parameters for each process separately using the function ParCount + to keep track of the number of parameters in the preceeding processes. + npar now contains the number of parameters in the preceding processes. + copy the value of the first parameter of this process into it's local + variable } +npar:=ParCount(ModelDef.numstate + 1); +Pmax := par[npar + 1].value; +eta := par[npar + 2].value; +kI := par[npar + 3].value; +lambda := par[npar + 4].value; + +npar:=ParCount(ModelDef.numstate + 3); +gN1 := par[npar + 1].value; +kN1 := par[npar + 2].value; + +npar:=ParCount(ModelDef.numstate + 4); +gN2 := par[npar + 1].value; +kN2 := par[npar + 2].value; + +npar:=ParCount(ModelDef.numstate + 5); +gN3 := par[npar + 1].value; +kN3 := par[npar + 2].value; + +npar:=ParCount(ModelDef.numstate + 6); +gN4 := par[npar + 1].value; +kN4 := par[npar + 2].value; + +npar:=ParCount(ModelDef.numstate + 7); +rmC := par[npar + 1].value; + +npar:=ParCount(ModelDef.numstate + 8); +mC := par[npar + 1].value; + +npar:=ParCount(ModelDef.numstate + 9); +mN := par[npar + 1].value; + +npar:=ParCount(ModelDef.numstate + 10); +a := par[npar + 1].value; +omega := par[npar + 2].value; +eps0 := par[npar + 3].value; +rho := par[npar + 4].value; + +npar:=ParCount(ModelDef.numstate + 13); +alpha := par[npar + 1].value; +gamma := par[npar + 2].value; + +npar:=ParCount(ModelDef.numstate + 14); +qB := par[npar + 1].value; + +npar:=ParCount(ModelDef.numstate + 21); +tau1 := par[npar + 1].value; + +npar:=ParCount(ModelDef.numstate + 22); +tau2 := par[npar + 1].value; + +npar:=ParCount(ModelDef.numstate + 23); +tau3 := par[npar + 1].value; + +npar:=ParCount(ModelDef.numstate + 24); +tau4 := par[npar + 1].value; + +npar:=ParCount(ModelDef.numstate + 25); +phi1 := par[npar + 1].value; + +npar:=ParCount(ModelDef.numstate + 26); +phi2 := par[npar + 1].value; + +npar:=ParCount(ModelDef.numstate + 27); +phi3 := par[npar + 1].value; + +npar:=ParCount(ModelDef.numstate + 28); +phi4 := par[npar + 1].value; + +dBCdt := -999; +dBNdt := -999; +dN1dt := -999; +dN2dt := -999; +dN3dt := -999; +dN4dt := -999; +dVCdt := -999; +dVNdt := -999; +dv1dt := -999; +dv2dt := -999; +dv3dt := -999; +dv4dt := -999; +dUCbardt := -999; +dUNbardt := -999; +dRCbardt := -999; +dRNbardt := -999; +UC := -999; +UN := -999; +UN1 := -999; +UN2 := -999; +UN3 := -999; +UN4 := -999; +RC := -999; +TC := -999; +TN := -999; +PHI := -999; +psiC := -999; +psiN := -999; +S := -999; +THETA := -999; +ymax := -999; +beta := -999; +eps1 := -999; +eps2 := -999; +eps3 := -999; +eps4 := -999; +LN1 := -999; +LN2 := -999; +LN3 := -999; +LN4 := -999; +y1 := -999; +y2 := -999; +y3 := -999; +y4 := -999; +dUCdVC := -999; + +{ Enter the equations to calculate the processes here, using the local variable + names defined above. } + + +S:=VC+VN; +VC:=VC/S; +VN:=1-VC; +S:=v1+v2+v3+v4; +v1:=v1/S; +v2:=v2/S; +v3:=v3/S; +V4:=1-v1-v2-v3; + +S:=BC*((alpha*BC+1)/(gamma*BC+1)); +THETA:=BC/qB/BN; +UC:=(Pmax/kI)*ln((eta+I)/(eta+I*exp(-kI*lambda*S*VC))); +UN1:=S*gN1*N1*VN*v1/(kN1+N1); +UN2:=S*gN2*N2*VN*v2/(kN2+N2); +UN3:=S*gN3*N3*VN*v3/(kN3+N3); +UN4:=S*gN4*N4*VN*v4/(kN4+N4); +UN:=UN1+UN2+UN3+UN4; +RC:=rmC*THETA*BC+phi1*UN1+phi2*UN2+phi3*UN3+phi4*UN4; +TC:=mC*BC; +TN:=mN*BN/THETA; +PHI:=power(UCbar/RCbar,VC)*power(UNbar/RNbar,VN); +psiC:=((rmC+mC)*BC+phi1*UN1+phi2*UN2+phi3*UN3+phi4*UN4)/THETA; +psiN:=mN*THETA*BN; +LN1:=tau1*N1; +LN2:=tau2*N2; +LN3:=tau3*N3; +LN4:=tau4*N4; +dUCdVC:=lambda*S*Pmax*I*exp(-kI*lambda*S*VC)/(eta+I*exp(-kI*lambda*S*VC)); +y1:=S*gN1*N1*VN/(kN1+N1); +y1:=y1/(VN+y1*phi1/dUCdVC); +y2:=S*gN2*N2*VN/(kN2+N2); +y2:=y2/(VN+y2*phi2/dUCdVC); +y3:=S*gN3*N3*VN/(kN3+N3); +y3:=y3/(VN+y3*phi3/dUCdVC); +y4:=S*gN4*N4*VN/(kN4+N4); +y4:=y4/(VN+y4*phi4/dUCdVC); +ymax:=max(y1,max(y2,max(y3,y4))); +if y1=ymax then eps1:=eps0 else eps1:=0; +if y2=ymax then eps2:=eps0 else eps2:=0; +if y3=ymax then eps3:=eps0 else eps3:=0; +if y4=ymax then eps4:=eps0 else eps4:=0; +beta:=ymax*(max(v1,eps1)+max(v2,eps2)+max(v3,eps3)+max(v4,eps4)); +beta:=(y1*max(v1,eps1)+y2*max(v2,eps2)+y3*max(v3,eps3)+y4*max(v4,eps4))/beta; +if CalculateDiscrete then +begin +// Add any discrete processes here +end; //discrete processes + + +{ Now calculate the derivatives of the state variables. If the holdConstant + portion of the state variable is set to true then set the derivative equal to + zero. } +if (tstat[1].HoldConstant) and (FmOptions.RunOptions.HoldStatesConstant) then + dBCdt := 0 +else + dBCdt := UC-TC-RC; + +if (tstat[2].HoldConstant) and (FmOptions.RunOptions.HoldStatesConstant) then + dBNdt := 0 +else + dBNdt := UN-TN; + +if (tstat[3].HoldConstant) and (FmOptions.RunOptions.HoldStatesConstant) then + dN1dt := 0 +else + dN1dt := IN1-UN1-LN1; + +if (tstat[4].HoldConstant) and (FmOptions.RunOptions.HoldStatesConstant) then + dN2dt := 0 +else + dN2dt := IN2-UN2-LN2; + +if (tstat[5].HoldConstant) and (FmOptions.RunOptions.HoldStatesConstant) then + dN3dt := 0 +else + dN3dt := IN3-UN3-LN3; + +if (tstat[6].HoldConstant) and (FmOptions.RunOptions.HoldStatesConstant) then + dN4dt := 0 +else + dN4dt := IN4-UN4-LN4; + +if (tstat[7].HoldConstant) and (FmOptions.RunOptions.HoldStatesConstant) then + dVCdt := 0 +else + dVCdt := a*ln(PHI*RCbar/UCbar)*VC; + +if (tstat[8].HoldConstant) and (FmOptions.RunOptions.HoldStatesConstant) then + dVNdt := 0 +else + dVNdt := a*ln(PHI*RNbar/UNbar)*VN; + +if (tstat[9].HoldConstant) and (FmOptions.RunOptions.HoldStatesConstant) then + dv1dt := 0 +else + dv1dt := omega*(y1/ymax-beta)*max(v1,eps1); + +if (tstat[10].HoldConstant) and (FmOptions.RunOptions.HoldStatesConstant) then + dv2dt := 0 +else + dv2dt := omega*(y2/ymax-beta)*max(v2,eps2); + +if (tstat[11].HoldConstant) and (FmOptions.RunOptions.HoldStatesConstant) then + dv3dt := 0 +else + dv3dt := omega*(y3/ymax-beta)*max(v3,eps3); + +if (tstat[12].HoldConstant) and (FmOptions.RunOptions.HoldStatesConstant) then + dv4dt := 0 +else + dv4dt := omega*(y4/ymax-beta)*max(v4,eps4); + +if (tstat[13].HoldConstant) and (FmOptions.RunOptions.HoldStatesConstant) then + dUCbardt := 0 +else + dUCbardt := rho*(UC-UCbar); + +if (tstat[14].HoldConstant) and (FmOptions.RunOptions.HoldStatesConstant) then + dUNbardt := 0 +else + dUNbardt := rho*(UN-UNbar); + +if (tstat[15].HoldConstant) and (FmOptions.RunOptions.HoldStatesConstant) then + dRCbardt := 0 +else + dRCbardt := rho*(psiC-RCbar); + +if (tstat[16].HoldConstant) and (FmOptions.RunOptions.HoldStatesConstant) then + dRNbardt := 0 +else + dRNbardt := rho*(psiN-RNbar); + + +{ Now that the calculations are complete, assign everything back into the arrays + so the rest of the code can access the values calculated here. (Local variables + are destroyed at the end of the procedure). + + Put the state variables back into the global arrays in case the state variable + was manually changed in this procedure (e.g. discrete state variables or steady state + calculations). } +tstat[1].value := BC; +tstat[2].value := BN; +tstat[3].value := N1; +tstat[4].value := N2; +tstat[5].value := N3; +tstat[6].value := N4; +tstat[7].value := VC; +tstat[8].value := VN; +tstat[9].value := v1; +tstat[10].value := v2; +tstat[11].value := v3; +tstat[12].value := v4; +tstat[13].value := UCbar; +tstat[14].value := UNbar; +tstat[15].value := RCbar; +tstat[16].value := RNbar; + +{ Put all process values into process variable array. The first numstate + processes are the derivatives of the state variables (Calculated above).} +tproc[1].value := dBCdt; +tproc[2].value := dBNdt; +tproc[3].value := dN1dt; +tproc[4].value := dN2dt; +tproc[5].value := dN3dt; +tproc[6].value := dN4dt; +tproc[7].value := dVCdt; +tproc[8].value := dVNdt; +tproc[9].value := dv1dt; +tproc[10].value := dv2dt; +tproc[11].value := dv3dt; +tproc[12].value := dv4dt; +tproc[13].value := dUCbardt; +tproc[14].value := dUNbardt; +tproc[15].value := dRCbardt; +tproc[16].value := dRNbardt; + +{ Now the remaining processes. Be sure to number the processes the same here as + you did in the procedure counts above. } +tproc[ModelDef.numstate + 1].value := UC; +tproc[ModelDef.numstate + 2].value := UN; +tproc[ModelDef.numstate + 3].value := UN1; +tproc[ModelDef.numstate + 4].value := UN2; +tproc[ModelDef.numstate + 5].value := UN3; +tproc[ModelDef.numstate + 6].value := UN4; +tproc[ModelDef.numstate + 7].value := RC; +tproc[ModelDef.numstate + 8].value := TC; +tproc[ModelDef.numstate + 9].value := TN; +tproc[ModelDef.numstate + 10].value := PHI; +tproc[ModelDef.numstate + 11].value := psiC; +tproc[ModelDef.numstate + 12].value := psiN; +tproc[ModelDef.numstate + 13].value := S; +tproc[ModelDef.numstate + 14].value := THETA; +tproc[ModelDef.numstate + 15].value := ymax; +tproc[ModelDef.numstate + 16].value := beta; +tproc[ModelDef.numstate + 17].value := eps1; +tproc[ModelDef.numstate + 18].value := eps2; +tproc[ModelDef.numstate + 19].value := eps3; +tproc[ModelDef.numstate + 20].value := eps4; +tproc[ModelDef.numstate + 21].value := LN1; +tproc[ModelDef.numstate + 22].value := LN2; +tproc[ModelDef.numstate + 23].value := LN3; +tproc[ModelDef.numstate + 24].value := LN4; +tproc[ModelDef.numstate + 25].value := y1; +tproc[ModelDef.numstate + 26].value := y2; +tproc[ModelDef.numstate + 27].value := y3; +tproc[ModelDef.numstate + 28].value := y4; +tproc[ModelDef.numstate + 29].value := dUCdVC; + +end; // End of processes procedure + + + { Do not make any modifications to code below this line. } +{****************************************************************************} + + +{This function counts the parameters in all processes less than processnum.} +function ParCount(processnum:integer) : integer; +var + NumberofParams, counter : integer; +begin + NumberofParams := 0; + for counter := ModelDef.numstate + 1 to processnum - 1 do + NumberofParams := NumberofParams + proc[counter].parameters; + ParCount := NumberofParams; +end; // end of parcount function + +{ This procedure supplies the derivatives of the state variables to the + integrator. Since the integrator deals only with the values of the variables + and not there names, units or the state field HoldConstant, this procedure + copies the state values into a temporary state array and copies the value of + HoldConstant into the temporary state array and passes this temporary state + array to the procedure processes. } +PROCEDURE derivs(t, drt:double; var tdrive:drivearray; var tpar:paramarray; + var statevalue:yValueArray; VAR dydt:yValueArray); +var + i:integer; + tempproc:processarray; + tempstate:statearray; +begin + tempstate := stat; // Copy names, units and HoldConstant to tempstate + // Copy current values of state variables into tempstate + for i := 1 to ModelDef.numstate do tempstate[i].value := statevalue[i]; + // Calculate the process values + processes(t, drt, tdrive, tpar, tempstate, tempproc, false); + // Put process values into dydt array to get passed back to the integrator. + for i:= 1 to ModelDef.numstate do dydt[i]:=tempproc[i].value; +end; // end of derivs procedure + +end. diff --git a/modelshell/fileio.pas b/modelshell/fileio.pas new file mode 100644 index 0000000..8c5daf1 --- /dev/null +++ b/modelshell/fileio.pas @@ -0,0 +1,1310 @@ +{ Contains the code for all file input and output. All I/O should be done using + these procedures. There is one exception. In the note.pas file the drivers are + written to the driver file directly from the memo component. It is done that + way because the memo component has a function to write to a file and using + that function is easier then converting the text in the memo to the correct + form for the writedriverfile function. } +unit fileio; + +interface + +uses sysutils, classes, Dialogs, stypes, frontend, Options, Lazfileutils; + +type TAction = (flRead, flWrite); + EFileError = Class(Exception); + +// Model I/O +function ReadParamFile(var filename:string; const npar:integer; + var parray:paramarray; const nstat:integer; + var sarray:statearray; var Tresid:double):Boolean; +procedure WriteParamFile(filename:string; const npar:integer; + var parray:paramarray; const nstat:integer; var sarray:statearray; + var Tresid:double); +procedure GetCurrentDrivers(CurrTime:double; var CurrDrivers:DriveArray); +function openDriverFile(filename:string; dlist:Tstringlist):Boolean; +function WriteDriverFile(filename:string; dlist:Tstringlist):Boolean; +procedure OpenOutputFile(filename:string; const ndrive:integer; const darray:drivearray; + const numstat:integer; var sarray:statearray; const numproc:integer; + var parray:processarray; Action:TAction); +function ReadOutputFile(var time:double; const numdrive:integer; var darray: + drivearray; const numstat:integer; var sarray:statearray; const + numproc:integer; var parray:processarray):Boolean; +function WriteOutputFile(time:double; const numstat:integer; + var sarray:statearray; const numproc:integer; + var parray:processarray):Boolean; +procedure CloseOutputFile; + +// Batch I/O +procedure OpenBatchFile(filename:string); +function ReadBatchFile(var paramname, drivername, outputname:string; var begintime, + endtime:double; var tstat:statearray; var opt:TRunOptions):Boolean; +procedure CloseBatchFile; +procedure OpenLogFile(filename, batchfile:string); +function WriteLogFile(filename:string; outputname:string; + StatusMessage:string):Boolean; +procedure CloseLogFile; + +// Sensitivity I/O +procedure OpenListFile(filename:string); +function ReadListFile(var paramfilename, driverfilename, paramname:string; + var newparamvalue:double):Boolean; +procedure CloseListFile; +procedure OpenMeasFile(filename:string); +function ReadMeasFile(var thisline:string): Boolean; +procedure CloseMeasFile; +procedure OpenSensOutFile(filename:string); +function WriteSensOutFile(var paramfilename, paramname:string; + var newparamvalue:double; TestStatus:string; ResidCL, ResidCW, + ResidCR, ResidNL, ResidNW, ResidNR, ResidCT, ResidNT: + double):Boolean; +procedure CloseSensOutFile; + +// Modelshell I/O +procedure ReadModelDef(filename:string; var tempmodeldef:Tmodeldef; + var tstat:statearray; var tpar:paramarray; var tproc:processarray; + var tdrive:drivearray); + +// Ensemble Kalman Filter I/O +procedure OpenTextFile(filename:string; var filehandle:textfile); +function ReadTextFile(var filehandle: textfile; var aline:string):Boolean; +function CheckforOpenFiles(filename: string): Boolean; +function WriteKalmanOutFile(filename:string; var outdata:TKstate; saveuncorrupted:Boolean):Boolean; + + +// General procedures +procedure ChangeExtension(var filename:string; NewExt:string); +procedure RemoveSpaces(var somestring:string); +function ParCount(processnum:integer) : integer; + +var + last_time,next_time:double; + last_drive,next_drive: drivearray; + driverfile:textfile; + driverlist:Tstringlist; + currdline:integer; + timeFound:boolean; + outfile, outfile2:textfile; + batchfile:textfile; + logfile:textfile; + listfile:textfile; + sensOutfile:textfile; + calOutfile:textfile; + measfile:textfile; + ParamFileVersion:string; + +implementation + +// Parameter File I/O + +{ The parameter file is a space delimited ASCII file containing the parameter + values and the initial values of the state variables. Each line of the file + contains one parameter or state variable. The first item on the line is the + variable name (a string up to stringlength characters), the second item is the numerical + value of the item and the final item on the line is the units of the parameter + or state variable (also a string up to stringlength characters long). } + +{ This function reads the entire parameter file if it exists or creates a new + empty file. } +function ReadParamFile(var filename:string; const npar:integer; + var parray:paramarray; const nstat:integer; + var sarray:statearray; var Tresid:double):Boolean; +var + i,charnum:integer; + dum, dum2, dum3, dum4, tempvalue:string[stringlength+1]; + tempstring1, tempstring2 :string; + paramfile:textfile; + StatesRead, ParamsRead: Boolean; +begin + ReadParamFile := False; + assignfile(paramfile,filename); + NeedToSavePar := False; + reset(paramfile); + readln(paramfile, ParamFileVersion); + SetLength(tempstring1, stringlength + 2); + strlcopy(PChar(tempstring1), PChar(ParamFileVersion), stringlength + 1); + { Delete any spaces in the model name read from the parameter file and any + spaces in a copy of the modelname field of modeldef. This is to prevent + the invalid parameter file version error due to differences in spacing. } + tempstring1 := trim(tempstring1); + charnum := pos(' ',tempstring1); + while charnum <> 0 do + begin + delete(tempstring1,charnum,1); + charnum := pos(' ',tempstring1); + end; + // And now delete the spaces from the modelname. + tempstring2 := ModelDef.modelname; + charnum := pos(' ',tempstring2); + while charnum <> 0 do + begin + delete(tempstring2,charnum,1); + charnum := pos(' ',tempstring2); + end; + + // Compare the 2 strings containing the modelname. + if StrIComp(PChar(tempstring1),PChar(tempstring2)) <> 0 then + begin + reset(paramfile); + ParamFileVersion := 'Unknown'; // Model names don't match + end + else // Model names do match, now extract the version number and compare + begin + delete(ParamFileVersion,1,stringlength + 1); + ParamFileVersion := trim(ParamFileVersion); + charnum := pos(' ',ParamFileVersion); + if charnum <> 0 then + delete(ParamFileVersion,charnum,Length(ParamFileVersion)-charnum+1); + end; + + try + if ParamFileVersion <> ModelDef.versionnumber then + begin + raise EFileError.create('The parameter file selected is not compatible with this model. ' + + 'No parameters read.'); + end + else +{ Model name and version match the parameter file so read in the state variables + and parameters. } + begin + i := 0; + StatesRead:=false; + ParamsRead:=False; + repeat + i := i + 1; + readln(paramfile,dum3,tempvalue,dum4,dum,dum2); + if (i <= ModelDef.numstate) and (not StatesRead) then + begin + sarray[i].value := strtofloat(tempvalue); + dum := trim(dum); + dum2 := trim(dum2); + if (dum[1] = 'T') or (dum[1] = 't') then + sarray[i].holdconstant := True + else + sarray[i].holdconstant := False; + if (dum2[1] = 'T') or (dum2[1] = 't') then + sarray[i].reset := True + else + sarray[i].reset := False; + if i = ModelDef.numstate then + begin + StatesRead := True; + i := 0; + end; + end; + if StatesRead and (i>0) then + begin + parray[i].value := strtofloat(tempvalue); + if i = ModelDef.numparam then ParamsRead := True; + end; + if StatesRead and ParamsRead then + begin + readln(paramfile,dum,Tresid); + if Tresid = 0 then Tresid := 999; + end; + until eof(paramfile); + ReadParamFile := true; + if i <> ModelDef.numparam then + raise Exception.Create('Model and parameter file have a different number of parameters.'); + end; + finally + closefile(paramfile); + end; +end; // End readparamfile + +{ Writes the entire parameter file, overwriting any existing file. Frontend + does the checking to be sure you want to overwrite an existing file. See + DlgSaveParam. } +procedure WriteParamFile(filename:string; const npar:integer; + var parray:paramarray; const nstat:integer; + var sarray:statearray; var Tresid:double); +var + i:integer; + paramfile:textfile; + tstring1, tstring2: string; +begin + assignfile(paramfile,filename); + rewrite(paramfile); + // Write out the model name and version. + writeln(paramfile, format('%-25.25s',[ModelDef.modelname]), ' ', + format('%-25.25s',[ModelDef.VersionNumber]), ' ', + format('%-77s',['Units Holdconstant Reset'])); + // Write state variable name, value, units, holdconstant and reset + for i:= 1 to nstat do + begin + if sarray[i].holdconstant then + tstring1 := 'True' + else + tstring1 := 'False'; + if sarray[i].reset then + tstring2 := 'True' + else + tstring2 := 'False'; + writeln(paramfile,format('%-25.25s',[sarray[i].name]),' ', + format('%-25.25e',[sarray[i].value]),' ', + format('%-25.25s',[sarray[i].units]), ' ', + // sarray[i].holdconstant:-25, ' ', sarray[i].reset:-25); + format('%-25.25s',[tstring1{sarray[i].holdconstant}]), ' ', + format('%-25.25s',[tstring2{sarray[i].reset}])); + end; + // Write parameter name, value and units + for i:= 1 to npar do + writeln(paramfile,format('%-25.25s',[parray[i].name]),' ', + format('%-25e',[parray[i].value]),' ', + format('%-25.25s',[parray[i].units])); + writeln(paramfile,format('%-25.25s',['Total Residual ']),' ',format('%-25g',[Tresid])); + closefile(paramfile); + NeedToSavePar := false; +end; // end of writeparamfile + + +// Driver File I/O + +{ The driver file is a comma delimited ASCII file containing the driving + variables. The first line of the file contains the names of the drivers, + the second line contains the units, and subsequent lines contain the driver data. + Each line of the driver file contains simulation time as the first value, + followed by a value for each driver variable. A driver file must contain at + least one line of driver data. Lines after the first data line are optional. + If there are multiple driver data lines, the driver variables are held constant + at the last value read until the next the simulation time equals the time value + in the next driver data line. Negative time values are a flag that creates a + linear ramp from drivers specified on the line before the negative time to the + drivers specified on the line with the negative time. The function + GetCurrentDrivers calculates any ramping if necessary. + + All access to the drivers is done using GetCurrentDrivers. +} + +{ This procedure gets the values for the drivers at the time specified in + CurrTime. If the next_time read in from the driver file is negative, this + procedure calculates a linear ramp between the values in last_drive and + next_drive. } +procedure GetCurrentDrivers(CurrTime:double; var CurrDrivers:DriveArray); +var + tfrac: double; + ll:integer; + tempstring:tstringlist; + anint: integer; +begin + tempstring:=Tstringlist.create; + try + tempstring.Delimiter:=','; + tempstring.StrictDelimiter:=true; + +// No previous values have been read. Read two lines from drivers. + if (last_time = 0) and (next_time = 0) then + begin + currdline := 2; + tempstring.DelimitedText:=driverlist[currdline]; + last_time:=strtoint(tempstring[0]); + for ll:=1 to ModelDef.numdrive do last_drive[ll].value:=strtofloat(tempstring[ll]); + CurrDrivers:=last_drive; + next_time:=last_time; + next_drive:=last_drive; + end; + +// Advance to next line of drivers + while (CurrTime>=abs(next_time)) and (currdline<=driverlist.count-1) do + begin + last_time := next_time; + last_drive := next_drive; + CurrDrivers:=next_drive; + + currdline:=currdline+1; + tempstring.Clear; + if currdlineabs(last_time)) then + begin + tfrac := (CurrTime-abs(last_time))/(abs(next_time)-abs(last_time)); + for ll := 1 to ModelDef.numdrive do + CurrDrivers[ll].value := last_drive[ll].value + tfrac*(next_drive[ll].value - + last_drive[ll].value); + end; +end; // getcurrentdrivers + +// Opens and read entire driver file into stringlist +function openDriverFile(filename:string; dlist:Tstringlist):Boolean; +var + idx:integer; +begin + if not LazFileUtils.FileExistsUTF8(filename) then + begin + MessageDlg('Cannot read driver file. File does not exist.', mtError,[mbOK],0); + openDriverFile:=false; + end + else + begin + try + dlist.LoadFromFile(driverfilename); + // Remove any empty lines + for idx := dlist.count - 1 downto 0 do + begin + if Trim(dlist[idx]) = '' then + dlist.Delete(idx); + end; + openDriverFile:=true; + except + raise Exception.Create('Unable to read driver file.'); + end; + end; +end; // openDriverFile + +// Writes entire driver file. +function WriteDriverFile(filename:string; dlist:Tstringlist):Boolean; +begin + try + dlist.SaveToFile(filename); + WriteDriverFile:=true; + except + WriteDriverFile:=false; + raise; + end; +end; // writedriverfile + +// Output File I/O + +{ The output file is a space delimited ASCII file containing values for the + state variables and processes at each time step of the model run. The first + item on a line is the time followed by the state variables and then the + process variables. The first two lines of the file are header lines. The first + line contains the names of the variables and the second line contains the + units. + + The output file must be opened and closed using OpenOutputFile and + CloseOutputFile. Be sure to call CloseOutputFile when you are done.} + +// Opens the output file for reading or writing depending on the value of Action +procedure OpenOutputFile(filename:string; const ndrive:integer; const darray:drivearray; + const numstat:integer; var sarray:statearray; const numproc:integer; + var parray:processarray; Action:TAction); +var + j:integer; + temp:string; +begin + assignfile(outfile,filename); + if Action = flread then // Open output file for reading + begin + reset(outfile); + readln(outfile,temp); // Read variable names and throw them away + readln(outfile,temp); // Read variable units and throw them away + end + else // Open output file to write + begin + if FmOptions.RunOptions.AppendOutputFile then + begin + append(outfile); + end + else + begin + rewrite(outfile); // Create a new output file + temp := 'Time'; + for j := 1 to ModelDef.numdrive do temp := temp + ', ' + drive[j].name; + for j := 1 to numstat do temp := temp + ', ' + sarray[j].name; + for j := ModelDef.numstate + 1 to numproc do temp := temp + ', ' + parray[j].name; + writeln(outfile, temp); + temp := ModelDef.timeunit; + for j := 1 to ModelDef.numdrive do temp := temp + ', ' + drive[j].units; // Units + for j := 1 to numstat do temp := temp + ', ' + sarray[j].units; + for j := ModelDef.numstate + 1 to numproc do temp := temp + ', ' + parray[j].units; + writeln(outfile, temp); + end; + end; +end; // openoutputfile + +// Reads one line of the output file +function ReadOutputFile(var time:double; const numdrive:integer; var darray: + drivearray; const numstat:integer; var sarray:statearray; const + numproc:integer;var parray:processarray):Boolean; +var + j, num:integer; + tempstring: string; +begin + ReadOutputFile := False; + if (not eof(outfile)) then + begin + readln(outfile, tempstring); + num := pos(',', tempstring); + time := strtofloat(copy(tempstring, 1, num-1)); + for j:= 1 to ModelDef.numdrive do + begin + delete(tempstring, 1, num); + num := pos(',', tempstring); + darray[j].value := strtofloat(copy(tempstring, 1, num-1)); + end; + for j := 1 to numstat do + begin + delete(tempstring, 1, num); + num := pos(',', tempstring); + sarray[j].value := strtofloat(copy(tempstring, 1, num-1)); + end; + for j := ModelDef.numstate + 1 to numproc do + begin + delete(tempstring, 1, num); + num := pos(',', tempstring); + if num <> 0 then + parray[j].value := strtofloat(copy(tempstring, 1, num-1)) + else + parray[j].value := strtofloat(tempstring); + end; + ReadOutputFile := True; + end; +end; // readoutputfile + +// Writes one line to the output file +function WriteOutputFile(time:double; const numstat:integer; + var sarray:statearray; const numproc:integer; + var parray:processarray):Boolean; +var + j:integer; +begin + write(outfile, floattostr(time)); // Write time + for j := 1 to ModelDef.numdrive + do write(outfile, ', ' + floattostr(drive[j].value)); + for j := 1 to numstat // State variables + do write(outfile, ', ' + floattostr(sarray[j].value)); + for j := ModelDef.numstate + 1 to numproc // Process variables + do write(outfile, ', ' + floattostr(parray[j].value)); + writeln(outfile); // Write return + WriteOutputFile := True; +end; // writeoutputfile + +// Closes the output file +procedure CloseOutputFile; +begin + closefile(outfile); +end; + +// Batch File I/O + +{ The batch file is a comma delimited ASCII file containing all the information + necessary to do a model run. Each line represents one run of the model and + contains the parameter file, driver file, and output file names, the start + time, the stop time and the time step. The first is an example. + + The batch file must be opened and closed using OpenBatchFile and + CloseBatchFile. Be sure to call CloseBatchFile when you are done.} + +{ Opens the batch file, reads in the first line and discards it. } +procedure OpenBatchFile(filename:string); +var +tempstring:string; +begin + assignfile(batchfile,filename); + reset(batchfile); + readln(batchfile,tempstring); // Read names and throw away +end; + +{ Reads a line from the batch file. Returns true if the read was successful and + returns false otherwise. } +function ReadBatchFile(var paramname, drivername, outputname:string; var begintime, + endtime:double; var tstat:statearray; var opt:TRunOptions):Boolean; +var + tempstring1, tempstring2: string; + numbegin, numend:integer; +begin + if not eof(batchfile) then // Check for end of file + begin + readln(batchfile,tempstring1); // Read line + numbegin := 1; + numend := pos(',',tempstring1); // param filename + paramname := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + delete(paramname,pos(',',paramname),1); + paramname := trim(paramname); + + numend := pos(',',tempstring1); // driver filename + drivername := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + delete(drivername,pos(',',drivername),1); + drivername := trim(drivername); + + numend := pos(',',tempstring1); // output filename + outputname := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + delete(outputname,pos(',',outputname),1); + outputname := trim(outputname); + + numend := pos(',',tempstring1); // Start time + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + delete(tempstring2,pos(',',tempstring2),1); + begintime := strtofloat(tempstring2); + + numend := pos(',',tempstring1); // Stop time + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + delete(tempstring2,pos(',',tempstring2),1); + endtime := strtofloat(tempstring2); + + numend := pos(',',tempstring1); // Time step + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + delete(tempstring2,pos(',',tempstring2),1); + opt.Time_step := strtofloat(tempstring2); + + numend := pos(',',tempstring1); // Discrete step + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + delete(tempstring2,pos(',',tempstring2),1); + opt.Discretestep := strtofloat(tempstring2); + + numend := pos(',',tempstring1); // Normal Run? + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + tempstring2 := trim(tempstring2); + if (tempstring2[1] = 't') or (tempstring2[1] = 'T') then + Opt.NormalRun := True + else + Opt.NormalRun := False; + + numend := pos(',',tempstring1); // Repeat Drivers? + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + tempstring2 := trim(tempstring2); + if (tempstring2[1] = 't') or (tempstring2[1] = 'T') then + Opt.RepeatDrivers := True + else + Opt.RepeatDrivers := False; + + numend := pos(',',tempstring1); // Repeat drive time + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + delete(tempstring2,pos(',',tempstring2),1); + Opt.RepeatDriveTime := strtofloat(tempstring2); + + numend := pos(',',tempstring1); // Reset States? + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + tempstring2 := trim(tempstring2); + if (tempstring2[1] = 't') or (tempstring2[1] = 'T') then + Opt.ResetStates := True + else + Opt.ResetStates := False; + + numend := pos(',',tempstring1); // Reset State Time + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + delete(tempstring2,pos(',',tempstring2),1); + Opt.ResetStateTime := strtofloat(tempstring2); + + numend := pos(',',tempstring1); // Run to SS + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + tempstring2 := trim(tempstring2); + if (tempstring2[1] = 't') or (tempstring2[1] = 'T') then + Opt.RuntoSS := True + else + Opt.RuntoSS := False; + + numend := pos(',',tempstring1); // SS Criteria + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + delete(tempstring2,pos(',',tempstring2),1); + Opt.SSCriteria := strtofloat(tempstring2)/100; + + numend := pos(',',tempstring1); // SS Time + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + delete(tempstring2,pos(',',tempstring2),1); + Opt.SSTime := strtofloat(tempstring2); + + numend := pos(',',tempstring1); // Hold States Constant + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + tempstring2 := trim(tempstring2); + if (tempstring2[1] = 't') or (tempstring2[1] = 'T') then + Opt.HoldStatesConstant := True + else + Opt.HoldStatesConstant := False; + + numend := pos(',',tempstring1); // Output Step + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + delete(tempstring2,pos(',',tempstring2),1); + Opt.OutputStep := strtofloat(tempstring2); + + numend := pos(',',tempstring1); // Output Offset + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + delete(tempstring2,pos(',',tempstring2),1); + Opt.OutputOffset := strtofloat(tempstring2); + + numend := pos(',',tempstring1); //Output EOR only + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + tempstring2 := trim(tempstring2); + if (tempstring2[1] = 't') or (tempstring2[1] = 'T') then + Opt.OutputEORonly := True + else + Opt.OutputEORonly := False; + + numend := pos(',',tempstring1); // Output Annually + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + tempstring2 := trim(tempstring2); + if (tempstring2[1] = 't') or (tempstring2[1] = 'T') then + Opt.OutputAnnually := True + else + Opt.OutputAnnually := False; + + numend := pos(',',tempstring1); // Day of Year for annual output + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + delete(tempstring2,pos(',',tempstring2),1); + Opt.OutputAnnuallyDay := strtofloat(tempstring2); + + numend := pos(',',tempstring1); // Append Output File + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + tempstring2 := trim(tempstring2); + if (tempstring2[1] = 't') or (tempstring2[1] = 'T') then + Opt.AppendOutputFile := True + else + Opt.AppendOutputFile := False; + + numend := pos(',',tempstring1); // No Output File + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + tempstring2 := trim(tempstring2); + if (tempstring2[1] = 't') or (tempstring2[1] = 'T') then + Opt.OutputFile := True + else + Opt.OutputFile := False; + + Opt.ErrorMult := strtoint(tempstring1); // Error Mult + + ReadBatchFile := True; + end + else + ReadBatchFile := False; +end; + +{ Closes the batch file. } +procedure CloseBatchFile; +begin + closefile(batchfile); +end; + +// Log File I/O + +{ The log file is an ASCII file summarizing the batch job defined in the + batch file. It contains the date and time, the batch file + name, and for each run: the output file name and a message with the status + of the run. } + +{ Opens the Batch log file and writes out initial information. } +procedure OpenLogFile(filename, batchfile:string); +begin + assignfile(logfile,filename); + rewrite(logfile); + writeln(logfile, 'Output log for Modelshell Batch Utility Version ' + ModelDef.versionnumber); + writeln(logfile, 'Generated: ' + DateTimeToStr(Now)); + writeln(logfile, 'Output from batch file: ' + batchfile); +end; + +{ Write a line to the log file containing the output file name and a status + message. } +function WriteLogFile(filename:string; outputname:string; + StatusMessage:string):Boolean; +begin + writeln(logfile, outputname + ': ' + StatusMessage); + WriteLogFile := True; +end; + +procedure CloseLogFile; +begin + closefile(logfile); +end; + +// List File I/O + +{ The list file is a comma delimited ASCII file containing information + necessary for running a sensitivity analysis. Each line represents one + sensitivity test and contains the parameter file name, the driver file name + the parameter to vary, the new value for the parameter. The first line is + an example. + + The list file must be opened and closed using OpenListFile and + CloseListFile. Be sure to call CloseListFile when you are done.} + +{ Opens the list file, reads in the first line and discards it. } +procedure OpenListFile(filename:string); +var +tempstring:string; +begin + assignfile(listfile,filename); + reset(listfile); + readln(listfile,tempstring); // Read names and throw away +end; + +{ Reads a line from the list file. Returns true if the read was successful and + returns false otherwise. } +function ReadListFile(var paramfilename, driverfilename, paramname:string; + var newparamvalue:double):Boolean; +var + tempstring1,tempstring2: string; + numbegin,numend: integer; +begin + if not eof(listfile) then // Check for end of file + begin + readln(listfile, tempstring1); // Read line + removespaces(tempstring1); + numbegin := 1; + numend := pos(',',tempstring1); + paramfilename := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + delete(paramfilename,pos(',',paramfilename),1); + + numend := pos(',',tempstring1); + driverfilename := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + delete(driverfilename,pos(',',driverfilename),1); + + numend := pos(',',tempstring1); + paramname := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + delete(paramname,pos(',',paramname),1); + + numend := length(tempstring1); + tempstring2 := copy(tempstring1,numbegin,numend-numbegin+1); + delete(tempstring1,numbegin,numend); + delete(tempstring2,pos(',',tempstring2),1); + newparamvalue := strtofloat(tempstring2); + + ReadListFile := True; + end + else + ReadListFile := False; +end; + +{ Closes the list file. } +procedure CloseListFile; +begin + closefile(listfile); +end; + +// Measured data file I/O + +{ The measured data file is a comma delimited ASCII file containing the + measured data to be compared with the model. Each line represents one + comparison and contains the treatment code, the simulation year, + the measured leaf C, wood C, root C, leaf N, wood N, and root N. Note that + the treatment code is used to identify the output file to read the data from. + Therefore, the treatment code must appear in the output filename and it must + appear in only one output filename. The year is the simulation year that + corresponds to the measured data on this line. + + The measured data file must be opened and closed using OpenMeasFile + and CloseMeasFile. Be sure to call CloseMeasFile when you are done.} + +{ This procedure opens the Measured data file for reading, reads in the first + line containing the headings and discards it.} +procedure OpenMeasFile(filename:string); +var + tempstring: string; +begin + assignfile(measfile,filename); + reset(measfile); + readln(measfile,tempstring); // Read names and throw away +end; + +{ Reads one line of the measured data file. Parsing of the line read in is done + in a different procedure to allow easy changing of the measured data. } +function ReadMeasFile(var thisline:string): Boolean; +begin + if not eof(measfile) then + begin + readln(measfile,thisline); + ReadMeasFile := true; + end + else + ReadMeasFile := false; +end; + +{ Closes the measured data file. } +procedure CloseMeasFile; +begin + CloseFile(measfile); +end; + + +// Comma File I/O + +{ Procedure to open and read one line of a comma delimited ASCII file. The first + line of the file is assumed to contain column headings and is read into the + variables headings. + + The comma data file must be opened and closed using OpenCommaFile + and CloseFile. Be sure to call CloseFile when you are done.} + +{ This procedure opens a comma delimited data file for reading, reads in the first + line containing the headings and discards it.} +procedure OpenTextFile(filename:string; var filehandle:textfile); +begin + assignfile(filehandle,filename); + reset(filehandle); +end; + +{ Reads one line of a comma delimited data file. Parsing of the line read in is + done by the calling routine. } +function ReadTextFile(var filehandle: textfile; var aline:string):Boolean; +begin + if not eof(filehandle) then + begin + readln(filehandle,aline); + ReadTextFile := true; + end + else + ReadTextFile := false; +end; + +function CheckforOpenFiles(filename: string): Boolean; +var + outhandle, outhandlex, outhandlen, outhandleq, outhandley: textfile; + answer: Word; + outfile, outfilex, outfilen, outfileq, outfiley: boolean; +begin + outfile := False; + outfilex := False; + outfilen := False; + outfileq := False; + outfiley := False; + try + try + if LazFileUtils.FileExistsUTF8(filename) then + begin + outfile := True; + assignfile(outhandle,filename); + rewrite(outhandle); + end; + if LazFileUtils.FileExistsUTF8(filename+'max') then + begin + outfilex := True; + assignfile(outhandlex,filename+'max'); + rewrite(outhandlex); + end; + if LazFileUtils.FileExistsUTF8(filename+'min') then + begin + outfilen := True; + assignfile(outhandlen,filename+'min'); + rewrite(outhandlen); + end; + if LazFileUtils.FileExistsUTF8(filename+'q') then + begin + outfileq := True; + assignfile(outhandleq,filename+'q'); + rewrite(outhandleq); + end; + if LazFileUtils.FileExistsUTF8(filename+'ymean') then + begin + outfiley := True; + assignfile(outhandley,filename+'ymean'); + rewrite(outhandley); + end; + CheckforOpenFiles := True; + finally + if outfile then CloseFile(outhandle); + if outfilex then CloseFile(outhandlex); + if outfilen then CloseFile(outhandlen); + if outfileq then CloseFile(outhandleq); + if outfiley then CloseFile(outhandley); + end; + except + answer := MessageDlg('Output files are in use. Close all output files and THEN click OK.' + + ' Click Cancel to abort the run.', mtWarning, [mbOK,mbCancel], 0); + CheckforOpenFiles := False; + if answer = 2 then raise; + end; +end; + +function WriteKalmanOutFile(filename:string; var outdata:TKstate; saveuncorrupted:Boolean):Boolean; +var + outhandle, outhandlex, outhandlen, outhandleq, outhandley, + outhandleunmean, outhandleuncorx, outhandleuncorn: textfile; + i, j: integer; +begin + WriteKalmanOutFile := false; + assignfile(outhandle,filename); + assignfile(outhandlex,filename+'max'); + assignfile(outhandlen,filename+'min'); + assignfile(outhandleq,filename+'q'); + assignfile(outhandley,filename+'Ymean'); + rewrite(outhandle); + rewrite(outhandlex); + rewrite(outhandlen); + rewrite(outhandleq); + rewrite(outhandley); + if saveuncorrupted then + begin + assignfile(outhandleunmean,filename+'uncor'); + assignfile(outhandleuncorx,filename+'uncormax'); + assignfile(outhandleuncorn,filename+'uncormin'); + rewrite(outhandleunmean); + rewrite(outhandleuncorx); + rewrite(outhandleuncorn); + end; + + try +// write time + write(outhandle, 'Time'); + write(outhandlex, 'Time'); + write(outhandlen, 'Time'); + write(outhandleq, 'Time'); + write(outhandley, 'Time'); +// Write Variable Names + for i := 0 to outdata.NumTotKalman - 1 do + begin + write(outhandle, ', ', outdata.names[i]); + write(outhandlex, ', ', outdata.names[i]); + write(outhandlen, ', ', outdata.names[i]); + write(outhandleq, ', ', outdata.names[i]); + write(outhandley, ', ', outdata.names[i]); + end; + writeln(outhandle); + writeln(outhandlex); + writeln(outhandlen); + writeln(outhandleq); + writeln(outhandley); + +//write time units + write(outhandle, ModelDef.timeunit); + write(outhandlex, ModelDef.timeunit); + write(outhandlen, ModelDef.timeunit); + write(outhandleq, ModelDef.timeunit); + write(outhandley, ModelDef.timeunit); +// Write Variable Units + for i := 0 to outdata.NumTotKalman - 1 do + begin + write(outhandle, ', ', outdata.units[i]); + write(outhandlex, ', ', outdata.units[i]); + write(outhandlen, ', ', outdata.units[i]); + write(outhandleq, ', ', outdata.units[i]); + write(outhandley, ', ', outdata.units[i]); + end; + writeln(outhandle); + writeln(outhandlex); + writeln(outhandlen); + writeln(outhandleq); + writeln(outhandley); + +// Write Data + for j := 0 to outdata.NumObservations - 1 do + begin + write(outhandle, outdata.time[j]); + write(outhandlex, outdata.time[j]); + write(outhandlen, outdata.time[j]); + write(outhandleq, outdata.time[j]); + write(outhandley, outdata.time[j]); + for i := 0 to outdata.NumTotKalman - 1 do + begin + write(outhandle, ', ', outdata.xmean[j,i]); + write(outhandlex, ', ', outdata.xmax[j,i]); + write(outhandlen, ', ', outdata.xmin[j,i]); + write(outhandleq, ', ', outdata.Q[j,i]); + write(outhandley, ', ', outdata.Ymean[j,i]); + end; + writeln(outhandle); + writeln(outhandlex); + writeln(outhandlen); + writeln(outhandleq); + writeln(outhandley); + end; + + if saveuncorrupted then + begin + // column titles + write(outhandleunmean, 'Time'); + write(outhandleuncorx, 'Time'); + write(outhandleuncorn, 'Time'); + for I := 0 to outdata.numtotkalman - 1 do + begin + write(outhandleunmean, ', ', outdata.names[i]); + write(outhandleuncorx, ', ', outdata.names[i]); + write(outhandleuncorn, ', ', outdata.names[i]); + end; + writeln(outhandleunmean); + writeln(outhandleuncorx); + writeln(outhandleuncorn); + + // column units + write(outhandleunmean, ModelDef.timeunit); + write(outhandleuncorx, ModelDef.timeunit); + write(outhandleuncorn, ModelDef.timeunit); + for i := 0 to outdata.NumTotKalman - 1 do + begin + write(outhandleunmean, ', ', outdata.units[i]); + write(outhandleuncorx, ', ', outdata.units[i]); + write(outhandleuncorn, ', ', outdata.units[i]); + end; + writeln(outhandleunmean); + writeln(outhandleuncorx); + writeln(outhandleuncorn); + + // output data + for j := 0 to outdata.NumObservations - 1 do + begin + write(outhandleunmean, outdata.time[j]); + write(outhandleuncorx, outdata.time[j]); + write(outhandleuncorn, outdata.time[j]); + for i := 0 to outdata.NumTotKalman - 1 do + begin + write(outhandleunmean, ', ', outdata.UnCorXmean[j,i]); + write(outhandleuncorx, ', ', outdata.UncorXmax[j,i]); + write(outhandleuncorn, ', ', outdata.UncorXmin[j,i]); + end; + writeln(outhandleunmean); + writeln(outhandleuncorx); + writeln(outhandleuncorn); + end; + end; + + WriteKalmanOutFile := true; + finally + CloseFile(outhandle); + CloseFile(outhandlex); + CloseFile(outhandlen); + CloseFile(outhandleq); + CloseFile(outhandley); + if saveuncorrupted then + begin + CloseFile(outhandleunmean); + CloseFile(outhandleuncorx); + CloseFile(outhandleuncorn); + end; + end; + +end; + +// Sensitivity Output File I/O + +{ The sensitivity output file is a comma delimited ASCII file containing the + results of the sensitivity analysis. Each line represents one sensitivity + test and contains the parameter file name, the parameter to vary, the new + value for the parameter and residuals for leaf, wood and root carbon and + nitrogen. + + The sensitivity output file must be opened and closed using OpenSensOutFile + and CloseSensOutFile. Be sure to call CloseSensOutFile when you are done.} + +{ Opens the sensitivity output file and writes out column headings. } +procedure OpenSensOutFile(filename:string); +var +tempstring:string; +begin + tempstring := 'Parameter File, Parameter, New Value, Test Status, ResidCL,' + + ' ResidCW, ResidCR, ResidNL, ResidNW, ResidNR, ResidCT, ResidNT'; + assignfile(sensoutfile,filename); + rewrite(sensoutfile); + writeln(sensoutfile,tempstring); +end; + +{ Write a line to the sens output file. } +function WriteSensOutFile(var paramfilename, paramname:string; + var newparamvalue:double; TestStatus:string; ResidCL, ResidCW, + ResidCR, ResidNL, ResidNW, ResidNR, ResidCT, ResidNT: + double):Boolean; +var + tempstring: string; +begin + tempstring := paramfilename + ',' + paramname + ',' + floattostr(newparamvalue) + + ',' + TestStatus + ',' + floattostr(ResidCL) + ',' + floattostr(ResidCW) + + ',' + floattostr(ResidCR) + ',' + floattostr(ResidNL) + ',' + + floattostr(ResidNW) + ',' + floattostr(ResidNR) + ',' + floattostr(ResidCT) + + ',' + floattostr(ResidNT); + writeln(sensoutfile,tempstring); + WriteSensOutFile := True; +end; + +{ Closes the Sensitivity output file. } +procedure CloseSensOutFile; +begin + closefile(SensOutFile); +end; + +procedure ChangeExtension(var filename:string; NewExt:string); +var + num:integer; +begin + num := pos('.',filename); + delete(filename,num,length(filename)-num+1); + filename := filename + '.' + NewExt; +end; + +procedure RemoveSpaces(var somestring:string); +var + num: integer; +begin + num := Pos(' ', somestring); + while num > 0 do + begin + delete(somestring,num,1); + num := Pos(' ', somestring); + end; +end; + +{ Reads in the model definition file to create a new model. } +procedure ReadModelDef(filename:string; var tempmodeldef:Tmodeldef; + var tstat:statearray; var tpar:paramarray; var tproc:processarray; + var tdrive:drivearray); +var + modelfile:textfile; + i,j,npar:integer; + tempstring, tname, tunits, tsymbol, tnpar:string; + +procedure SetString(var tfile:textfile; var tstring:string); +var + num:integer; +begin + readln(tfile,tstring); + num := pos('=',tstring); + delete(tstring,1,num); +end; + +procedure SetNUS(var tfile:textfile; var tstring, tname, tunits, + tsymbol:string); +var + num:integer; +begin + readln(tfile,tstring); + num := pos(',',tstring); + tname := copy(tstring,1,num-1); + delete(tstring,1,num); + num := pos(',',tstring); + tunits := copy(tstring,1,num-1); + delete(tstring,1,num); + num := pos(',',tstring); + if num = 0 then + begin + num := length(tstring); + tsymbol := copy(tstring,1,num); + end + else + begin + tsymbol := copy(tstring,1,num-1); + delete(tstring,1,num); + end; +end; + +procedure SetPD(var tstring, tnpar:string); +var + num:integer; +begin + num := pos(',',tstring); + tnpar := copy(tstring,1,num-1); + delete(tstring,1,num); +// num := length(tstring); +end; + +begin +try try + assignfile(modelfile,filename); + reset(modelfile); + readln(modelfile,tempstring); // Throw away the first line of the file +// ModelDef + SetString(modelfile,tempstring); + tempmodeldef.modelname := tempstring; + SetString(modelfile,tempstring); + tempmodeldef.versionnumber := tempstring; + SetString(modelfile,tempstring); + tempmodeldef.timeunit := tempstring; + readln(modelfile, tempstring); // Throw away blank line + +// States + SetString(modelfile,tempstring); + tempmodeldef.numstate := strtoint(tempstring); + readln(modelfile,tempstring); // Throw away comment line + for i := 1 to tempmodeldef.numstate do + begin + SetNUS(modelfile, tempstring, tname, tunits, tsymbol); + tstat[i].name := tname; + tstat[i].units := tunits; + tstat[i].symbol := tsymbol; + end; + readln(modelfile, tempstring); // Throw away blank line + +// Processes + SetString(modelfile,tempstring); + tempmodeldef.numprocess := tempModelDef.numstate + strtoint(tempstring); + readln(modelfile,tempstring); // Throw away comment line + for i := tempmodeldef.numstate + 1 to tempmodeldef.numprocess do + begin + SetNUS(modelfile, tempstring, tname, tunits, tsymbol); + tproc[i].name := tname; + tproc[i].units := tunits; + tproc[i].symbol := tsymbol; + SetPD(tempstring, tnpar); + tproc[i].parameters := strtoint(tnpar); + if tproc[i].parameters <> 0 then + begin + npar := ParCount(i); + for j := 1 to tproc[i].parameters do + begin + SetNUS(modelfile, tempstring, tname, tunits, tsymbol); + tpar[npar + j].name := tname; + tpar[npar + j].units := tunits; + tpar[npar + j].symbol := tsymbol; + end; + end; + end; + readln(modelfile, tempstring); // Throw away blank line + +// Drivers + SetString(modelfile,tempstring); + tempmodeldef.numdrive := strtoint(tempstring); + readln(modelfile,tempstring); // Throw away comment line + for i := 1 to tempmodeldef.numstate do + begin + SetNUS(modelfile, tempstring, tname, tunits, tsymbol); + tdrive[i].name := tname; + tdrive[i].units := tunits; + tdrive[i].symbol := tsymbol; + end; + + { Set the names, units, and symbols of the processes and the parameters. The + maximum length for the name, units and symbol is stringlength (currently 25) + characters. + + The first numstate processes are the derivatives of the state variables. Set + the names and units accordingly.} + for i:= 1 to tempmodeldef.numstate do tproc[i].name:='d'+tstat[i].name+'dt'; + for i:= 1 to tempmodeldef.numstate do tproc[i].units := tstat[i].units + 't-1'; + for i:= 1 to tempmodeldef.numstate do tproc[i].symbol := 'd' + tstat[i].symbol + 'dt'; + +{ Sum up the total number of parameters in the model and store it in the + tempmodeldef structure. } + tempmodeldef.numparam := 0; + for i := 1 to tempmodeldef.NumProcess do + tempmodeldef.numparam := tempmodeldef.numparam + tproc[i].parameters; + +finally + CloseFile(modelfile); +end; +except + raise EFileError.Create('Error reading Model Definition file. Application Terminated'); +end; +end; + +{This function counts the parameters in all processes less than processnum.} +function ParCount(processnum:integer) : integer; +var + NumberofParams, counter : integer; +begin + NumberofParams := 0; + for counter := ModelDef.numstate + 1 to processnum - 1 do + NumberofParams := NumberofParams + proc[counter].parameters; + ParCount := NumberofParams; +end; // end of parcount function + +end. diff --git a/modelshell/frontend.lfm b/modelshell/frontend.lfm new file mode 100644 index 0000000..8a5c404 --- /dev/null +++ b/modelshell/frontend.lfm @@ -0,0 +1,476 @@ +object FmShellMain: TFmShellMain + Left = 1215 + Height = 493 + Top = 357 + Width = 958 + BorderIcons = [biSystemMenu, biMinimize] + BorderStyle = bsSingle + Caption = 'MBL Modelshell v6.5.4' + ClientHeight = 463 + ClientWidth = 958 + Color = 1416450 + DesignTimePPI = 144 + Font.Color = clBlack + Font.Height = -17 + Font.Name = 'Arial' + Font.Style = [fsBold] + Menu = MainMenu1 + OnCreate = FormCreate + OnDestroy = FormDestroy + Position = poScreenCenter + LCLVersion = '2.0.10.0' + object ParamLabel: TLabel + Left = 24 + Height = 21 + Top = 26 + Width = 117 + Alignment = taRightJustify + Caption = '&Parameter File' + FocusControl = ParamBox + Font.Color = clBlack + Font.Height = -18 + Font.Name = 'Arial' + ParentColor = False + ParentFont = False + OnClick = ChooseParamFile + end + object DriverLabel: TLabel + Left = 24 + Height = 21 + Top = 81 + Width = 82 + Alignment = taRightJustify + Caption = '&Driver File' + FocusControl = DriverBox + Font.Color = clBlack + Font.Height = -18 + Font.Name = 'Arial' + ParentColor = False + ParentFont = False + OnClick = ChooseDriver + end + object OutputLabel: TLabel + Left = 24 + Height = 21 + Top = 136 + Width = 88 + Alignment = taRightJustify + Caption = 'O&utput File' + FocusControl = OutputBox + Font.Color = clBlack + Font.Height = -18 + Font.Name = 'Arial' + ParentColor = False + ParentFont = False + OnClick = ChooseOutputFile + end + object StartLabel: TLabel + Left = 39 + Height = 21 + Top = 206 + Width = 82 + Alignment = taCenter + Caption = '&Start Time' + Font.Color = clBlack + Font.Height = -18 + Font.Name = 'Arial' + ParentColor = False + ParentFont = False + end + object StopLabel: TLabel + Left = 324 + Height = 21 + Top = 206 + Width = 81 + Alignment = taCenter + Caption = 'S&top Time' + FocusControl = MEStopTime + Font.Color = clBlack + Font.Height = -18 + Font.Name = 'Arial' + ParentColor = False + ParentFont = False + end + object PresentLabel: TLabel + Left = 648 + Height = 21 + Top = 206 + Width = 106 + Alignment = taCenter + Caption = 'Present Time' + Font.Color = clBlack + Font.Height = -18 + Font.Name = 'Arial' + ParentColor = False + ParentFont = False + end + object LblWelcome: TLabel + Left = 316 + Height = 21 + Top = 81 + Width = 147 + Caption = 'Welcome to MEL' + Font.Color = clBlack + Font.Height = -18 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + Visible = False + end + object LblDirections: TLabel + Left = 396 + Height = 29 + Top = 388 + Width = 402 + Caption = 'Please enter the number of species' + Font.Color = clBlack + Font.Height = -24 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + Visible = False + end + object OutputBox: TEdit + Left = 226 + Height = 29 + Top = 135 + Width = 651 + Font.Color = clBlack + Font.Height = -18 + Font.Name = 'Arial' + OnExit = ChooseOutputFile + OnKeyPress = OutputBoxKeyPress + ParentFont = False + TabOrder = 1 + end + object DriverBox: TEdit + Left = 226 + Height = 29 + Top = 76 + Width = 651 + Font.Color = clBlack + Font.Height = -18 + Font.Name = 'Arial' + OnExit = ChooseDriver + OnKeyPress = DriverBoxKeyPress + ParentFont = False + TabOrder = 0 + end + object MEStopTime: TMaskEdit + Left = 300 + Height = 29 + Top = 232 + Width = 148 + CharCase = ecNormal + Font.Color = clBlack + Font.Height = -18 + Font.Name = 'Arial' + MaxLength = 7 + ParentFont = False + TabOrder = 2 + OnExit = MeStopTimeExit + OnKeyPress = MEStopTimeKeyPress + EditMask = '9999999;0; ' + Text = '2' + SpaceChar = ' ' + end + object ParamBox: TEdit + Left = 226 + Height = 29 + Top = 21 + Width = 651 + Font.Color = clBlack + Font.Height = -18 + Font.Name = 'Arial' + OnExit = ChooseParamFile + OnKeyPress = ParamBoxKeyPress + ParentFont = False + TabOrder = 6 + end + object BtnRun: TButton + Left = 120 + Height = 38 + Top = 312 + Width = 165 + Caption = '&Run' + Enabled = False + Font.Color = clBlack + Font.Height = -18 + Font.Name = 'Arial' + OnClick = BtnRunClick + ParentFont = False + ParentShowHint = False + TabOrder = 3 + end + object PresentBox: TEdit + Left = 636 + Height = 29 + Top = 232 + Width = 148 + AutoSelect = False + Color = clInactiveBorder + Enabled = False + Font.Color = clBlack + Font.Height = -18 + Font.Name = 'Arial' + ParentFont = False + TabStop = False + TabOrder = 5 + Text = '0' + end + object BtnReload: TButton + Left = 624 + Height = 38 + Top = 310 + Width = 182 + Caption = 'Re&load' + Font.Color = clBlack + Font.Height = -18 + Font.Name = 'Arial' + OnClick = BtnReloadClick + ParentFont = False + TabOrder = 4 + end + object EdNumSpecies: TEdit + Left = 816 + Height = 29 + Top = 384 + Width = 36 + Font.Color = clBlack + Font.Height = -18 + Font.Name = 'Arial' + OnChange = EdNumSpecieschange + OnExit = EdNumSpeciesExit + OnKeyPress = EdNumSpeciesKeyPress + ParentFont = False + TabOrder = 7 + Visible = False + end + object MEStartTime: TMaskEdit + Left = 24 + Height = 27 + Top = 234 + Width = 148 + CharCase = ecNormal + Font.Color = clBlack + Font.Height = -17 + Font.Name = 'Arial' + MaxLength = 7 + ParentFont = False + TabOrder = 8 + OnExit = MeStartTimeExit + OnKeyPress = MEStartTimeKeyPress + EditMask = '9999999;0; ' + Text = '1' + SpaceChar = ' ' + end + object BtnCloseShell: TButton + Left = 372 + Height = 38 + Top = 310 + Width = 112 + Caption = '&Close' + Font.Color = clBlack + Font.Height = -18 + Font.Name = 'Arial' + OnClick = BtnCloseShellClick + ParentFont = False + TabOrder = 9 + end + object MainMenu1: TMainMenu + Top = 480 + object MIFiles: TMenuItem + Caption = '&Files' + object MIParamFile: TMenuItem + Caption = '&Parameter File' + object MIChooseParam: TMenuItem + Caption = '&Open...' + OnClick = ChooseParamFile + end + object MISaveParam: TMenuItem + Caption = '&Save...' + Enabled = False + ShortCut = 16467 + OnClick = MISaveParamClick + end + object MISaveAsParam: TMenuItem + Caption = 'Save &As' + OnClick = MISaveAsParamClick + end + end + object MIDriverFile: TMenuItem + Caption = '&Driver File' + object MIChooseDrv: TMenuItem + Caption = '&Open...' + OnClick = ChooseDriver + end + object MIEditDrv: TMenuItem + Caption = '&Edit...' + OnClick = MIEditDrvClick + end + end + object MIOutput: TMenuItem + Caption = '&Output' + object MIChooseOutput: TMenuItem + Caption = '&Enter output filename' + OnClick = ChooseOutputFile + end + object MISaveMemOutput: TMenuItem + Caption = 'Save output in &memory to file' + OnClick = MISaveMemOutputClick + end + end + object MIBar: TMenuItem + Caption = '-' + end + object MIExit: TMenuItem + Caption = 'E&xit' + OnClick = MIExitClick + end + end + object MIEdit: TMenuItem + Caption = '&Edit' + object MIEditParam: TMenuItem + Caption = '&Parameters...' + OnClick = MIEditParamClick + end + object MIEditStates: TMenuItem + Caption = '&State Variables...' + OnClick = MIEditStatesClick + end + object MIEditDrv2: TMenuItem + Caption = '&Drivers...' + OnClick = MIEditDrvClick + end + end + object MICalculate: TMenuItem + Caption = 'C&alculate' + Enabled = False + Visible = False + object MICalTime: TMenuItem + Caption = '&At Time...' + OnClick = MICalTimeClick + end + object MICalcSS: TMenuItem + Caption = '&Steady State...' + OnClick = MICalcSSClick + end + end + object Run1: TMenuItem + Caption = 'O&ptions' + object MITimeSteps: TMenuItem + Caption = '&Time Steps' + GroupIndex = 1 + RadioItem = True + OnClick = MIOpenOptionsClick + end + object N3: TMenuItem + Caption = '-' + GroupIndex = 1 + RadioItem = True + end + object MINormalRun: TMenuItem + Caption = '&Normal Run' + Checked = True + GroupIndex = 1 + RadioItem = True + OnClick = MINormalRunClick + end + object MISpecialRun: TMenuItem + Caption = '&Special Run ...' + GroupIndex = 1 + RadioItem = True + OnClick = MIOpenOptionsClick + end + object N1: TMenuItem + Caption = '-' + GroupIndex = 1 + end + object MIOutOptions: TMenuItem + Caption = '&Output Options ...' + GroupIndex = 1 + OnClick = MIOpenOptionsClick + end + end + object MIView: TMenuItem + Caption = '&Output' + object MIShowChart: TMenuItem + Caption = 'C&hart' + OnClick = DisplayOutput + end + object MIShowTable: TMenuItem + Caption = 'Ta&ble' + OnClick = DisplayOutput + end + object MIViewOutFile: TMenuItem + Caption = 'From &File...' + OnClick = MIViewOutFileClick + end + object N2: TMenuItem + Caption = '-' + end + object MIAutoChart: TMenuItem + Caption = '&AutoChart' + Hint = 'Check this to automatically show the chart after a run' + OnClick = MIAutoChartClick + end + end + object Help1: TMenuItem + Caption = '&Help' + object MIAbout: TMenuItem + Caption = '&About' + OnClick = MIAboutClick + end + end + end + object DlgOpenParam: TOpenDialog + Title = 'Choose Parameter File' + DefaultExt = '.par' + Filter = 'Parameter FIles (*.par)|*.par|All Files|*.*' + Options = [ofHideReadOnly, ofPathMustExist, ofNoReadOnlyReturn, ofEnableSizing] + Left = 48 + Top = 480 + end + object DlgSaveParam: TSaveDialog + Title = 'Save Parameter File' + DefaultExt = '.par' + Filter = 'Parameter Files (*.par)|*.par|All Files|*.*' + Options = [ofOverwritePrompt, ofHideReadOnly, ofCreatePrompt, ofNoReadOnlyReturn] + Left = 96 + Top = 480 + end + object DlgOpenDriver: TOpenDialog + Title = 'Open Driver File' + DefaultExt = '.drr' + Filter = 'Driver files (*.drr)|*.drr|All files|*.*' + Options = [ofHideReadOnly, ofPathMustExist, ofCreatePrompt, ofNoReadOnlyReturn] + Left = 144 + Top = 480 + end + object DlgSaveDriver: TSaveDialog + Title = 'Save Driver File as' + DefaultExt = '.drr' + Filter = 'Driver Files (*.drr)|*.drr|All Files (*.*)|*.*' + Options = [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofCreatePrompt, ofNoReadOnlyReturn] + Left = 192 + Top = 480 + end + object DlgSaveOutput: TSaveDialog + Title = 'Save Output File as' + DefaultExt = '.out' + Filter = 'Output Files (*.out)|*.out|All Files (*.*)|*.*' + Options = [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofNoReadOnlyReturn] + Left = 288 + Top = 480 + end + object DlgOpenOutput: TOpenDialog + Title = 'Open Output File' + DefaultExt = '.out' + Filter = 'Output Files (*.out)|*.out|All Files (*.*)|*.*' + Options = [ofHideReadOnly, ofPathMustExist, ofFileMustExist, ofNoReadOnlyReturn, ofEnableSizing] + Left = 240 + Top = 480 + end +end diff --git a/modelshell/frontend.pas b/modelshell/frontend.pas new file mode 100644 index 0000000..3fb533d --- /dev/null +++ b/modelshell/frontend.pas @@ -0,0 +1,1029 @@ +{ This file creates and controls the main window of the modeling application. + This window is called FmShellMain in the code. Describe the use of ReadytoRun and + RunComplete here.} +unit frontend; + +{$MODE Delphi} + +interface + +uses + SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + {$ifdef Darwin} + MacOSAll, + {$endif} + StdCtrls, Menus, stypes, ExtCtrls, MaskEdit, Printers, TAGraph, Lazfileutils; + +const + epsilon = 1e-8; + fullstep = 1; + DefaultUnixDirectory = '/user/share/CrEquations'; + BundleResourceDirectory = '/Contents/Resources/'; + +type + + { TFmShellMain } + + TFmShellMain = class(TForm) + BtnCloseShell: TButton; + MainMenu1: TMainMenu; + MEStartTime: TMaskEdit; + MIFiles: TMenuItem; + MISaveParam: TMenuItem; + DlgOpenParam: TOpenDialog; + DlgSaveParam: TSaveDialog; + MIEdit: TMenuItem; + MIEditParam: TMenuItem; + MIEditStates: TMenuItem; + MIChooseDrv: TMenuItem; + MIOutput: TMenuItem; + DlgOpenDriver: TOpenDialog; + MIChooseParam: TMenuItem; + MICalculate: TMenuItem; + MIView: TMenuItem; + MIShowChart: TMenuItem; + MIParamFile: TMenuItem; + MIDriverFile: TMenuItem; + MIEditDrv: TMenuItem; + DlgSaveDriver: TSaveDialog; + DlgSaveOutput: TSaveDialog; + MISaveAsParam: TMenuItem; + MIExit: TMenuItem; + MIBar: TMenuItem; + MIShowTable: TMenuItem; + ParamLabel: TLabel; + DriverLabel: TLabel; + OutputLabel: TLabel; + StartLabel: TLabel; + StopLabel: TLabel; + PresentLabel: TLabel; + MICalcSS: TMenuItem; + MIEditDrv2: TMenuItem; + MEStopTime: TMaskEdit; + ParamBox: TEdit; + DriverBox: TEdit; + OutputBox: TEdit; + BtnRun: TButton; + PresentBox: TEdit; + BtnReload: TButton; + MICalTime: TMenuItem; + MIViewOutFile: TMenuItem; + DlgOpenOutput: TOpenDialog; + EdNumSpecies: TEdit; // MEL specific + LblWelcome: TLabel; // MEL specific + LblDirections: TLabel; + Run1: TMenuItem; + MISpecialRun: TMenuItem; + Help1: TMenuItem; + MIAbout: TMenuItem; + MINormalRun: TMenuItem; + N1: TMenuItem; + MIAutoChart: TMenuItem; + N2: TMenuItem; + MIOutOptions: TMenuItem; + N3: TMenuItem; + MITimeSteps: TMenuItem; + MISaveMemOutput: TMenuItem; + MIChooseOutput: TMenuItem; // MEL specific + procedure BtnCloseShellClick(Sender: TObject); + procedure ChooseParamFile(Sender: TObject); + procedure ChooseDriver(Sender: TObject); + procedure ChooseOutputFile(Sender: TObject); + procedure BtnRunClick(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure MIExitClick(Sender: TObject); + procedure MISaveParamClick(Sender: TObject); + procedure MISaveAsParamClick(Sender: TObject); + procedure MIEditParamClick(Sender: TObject); + procedure MIEditStatesClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure MeStartTimeExit(Sender: TObject); + procedure MeStopTimeExit(Sender: TObject); + procedure BtnReloadClick(Sender: TObject); + procedure UpdateFmShellMain; + procedure MIEditDrvClick(Sender: TObject); + procedure MIAboutClick(Sender: TObject); + procedure MICalcSSClick(Sender: TObject); + procedure DisplayOutput(Sender: TObject); + procedure SetNumSpecies(anEditBox: TEdit); // MEL specific + procedure EdNumSpecieschange(Sender: TObject); // MEL specific + procedure EdNumSpeciesExit(Sender: TObject); // MEL specific + procedure MICalTimeClick(Sender: TObject); + procedure MIViewOutFileClick(Sender: TObject); + procedure MEStopTimeKeyPress(Sender: TObject; var Key: Char); + procedure MEStartTimeKeyPress(Sender: TObject; var Key: Char); + procedure MIOpenOptionsClick(Sender: TObject); + procedure MINormalRunClick(Sender: TObject); + procedure MIAutoChartClick(Sender: TObject); + procedure ParamBoxKeyPress(Sender: TObject; var Key: Char); + procedure DriverBoxKeyPress(Sender: TObject; var Key: Char); + procedure OutputBoxKeyPress(Sender: TObject; var Key: Char); + procedure EdNumSpeciesKeyPress(Sender: TObject; var Key: Char); + procedure MISaveMemOutputClick(Sender: TObject); + function GetResourcePath(): string; + private + { Private declarations } + procedure ResetStatesNow(Sender: TObject); + public + { Public declarations } + CurrentPath:string; + RunningInteractive: Boolean; + lastitem: TComponent; + CurrentResid: Double; + BeginningofRun: Boolean; + LargeOutput: Boolean; + initialstates:statearray; + procedure ShowProgressBar; + procedure CancelRun; + end; + +var + FmShellMain: TFmShellMain; + time,time_start,Time_stop,CalTime: double; + ModelDef: TModelDef; + stat: statearray; + drive: drivearray; + par: paramarray; + proc: processarray; + paramfilename,driverfilename,outfilename: string; + NeedToSavePar: Boolean = False; + ReadyToRun: Boolean = False; + RunComplete: Boolean = False; + counttt:integer; +// NewParamFile: Boolean; +// NewDriverFile: Boolean; + stopRun: boolean = false; +// NumSpProc,NumSpPar:integer; // MEL specific +// numspp:integer; // MEL specific +implementation + +uses fileio, calculate, display, ReloadDlg, data, parameter, + equations, integrator, note, aboutbox, trouble, ProgressBar, Options; + +{$R *.lfm} + +{ This procedure sets up the modeling application. } +procedure TFmShellMain.FormCreate(Sender: TObject); +var + tempstring, tempstring2: string; + ll:integer; +begin +// Determine current path for dialog box initial directories + CurrentPath := GetResourcePath(); + + {CurrentPath := ExtractFilePath(Application.EXEName); } + LazFileUtils.SetCurrentDirUTF8(CurrentPath); + +// Set initial values for model timing + Time_start := strtofloat(MEStartTime.text); + Time_stop := strtofloat(MEStopTime.text); + CalTime := time_start; +// Set initial value for the number of species +// numspp := 1; // MEL specific + +{ Call the counts procedure which defines the model structure. This procedure + sets the names and units of the state variables, driver variables, process + variables, and parameters. It also sets the values of the ModelDef structure + which defines the number of state variables, driver variables, process + variables and parameters. +} + counts; + Application.Title := ModelDef.modelname; + next_drive := drive; // Initialize names and units of next_drive & last_drive + last_drive := drive; + FmShellMain.Caption := ModelDef.modelname; // Set the FmShellMain caption + tempstring := Application.Title; + tempstring := lowercase(tempstring); + RunningInteractive := True; + BeginningofRun := True; + fileio.driverlist:=tstringlist.create; + fileio.driverlist.StrictDelimiter:=true; + fileio.driverlist.Delimiter:=','; + // Initialize driver names and units + tempstring := 'Time, '; + tempstring2 := ModelDef.timeunit; + for ll:=1 to ModelDef.numdrive do + begin + tempstring := tempstring + drive[ll].name; + tempstring2 := tempstring2 + drive[ll].units; + end; + fileio.driverlist.Add(tempstring); + fileio.driverlist.Add(tempstring2); +end; + +{ This procedure enables the user to choose a parameter file using several + different methods. The user can click Choose Parameter file from the menu, + click on the label Parameter File, or type a filename directly in the box. + If the user chooses using either the menu or the label, an open file dialog + is displayed. } +procedure TFmShellMain.ChooseParamFile(Sender: TObject); +var + oldparamfilename : string; + replace: Word; +begin + oldparamfilename := paramfilename; + DlgOpenParam.InitialDir:=CurrentPath; + + // If the user typed directly in the box + if Sender is TEdit then paramfilename := parambox.text // Set paramfilename + else if RunningInteractive then // The user used either the menu or clicked on the label + begin // Show the open file dialog + // First set the dialog box default filename to the current paramfile + DlgOpenParam.filename := paramfilename; + // If the user chooses OK in the dialog then set the new paramfilename + if DlgOpenParam.execute then paramfilename := DlgOpenParam.filename; + end; + + if (paramfilename <> oldparamfilename) or not RunningInteractive then + begin + if paramfilename <> '' then // Be sure something was entered for the filename + try + if not LazFileUtils.FileExistsUTF8(paramfilename) then // If the paramter file doesn't exist + // Create a new parameter file using values in memory + begin + WriteParamFile(paramfilename, ModelDef.numparam, par, ModelDef.numstate, + stat, currentresid); +// NewParamFile := True; + end + else // Parameter file does exist, so read the values into the global arrays. + begin + if (oldparamfilename <> '') and RunningInteractive then + replace := MessageDlg('Replace current values with those in file, ' + + paramfilename + ' ?', mtConfirmation, [mbYes,mbNo], 0) + else + replace := mryes; + if replace = mryes then + begin + ReadParamFile(paramfilename,ModelDef.numparam,par,ModelDef.numstate, + stat, currentresid); +// NewParamFile := False; + end + else + begin + paramfilename := oldparamfilename; +// NewParamFile := False; // fix necessary here and if so what should the value be??? + end; + end; + except + paramfilename := oldparamfilename; + raise; + end; + RunComplete := False; + Readytorun := false; // Can't run the model. + end; + + CurrentPath := ExtractFilePath(paramfilename); + LazFileUtils.SetCurrentDirUTF8(CurrentPath); + UpdateFmShellMain; // Update the form +end; + +procedure TFmShellMain.BtnCloseShellClick(Sender: TObject); +begin + MIExitClick(Sender); +end; + +{ This procedure enables the user to choose a Driver file using several + different methods. The user can click Choose Driver file from the menu, + click on the label Driver File, or type a filename directly in the box. + If the user chooses using either the menu or the label, an open file dialog + is displayed. } +procedure TFmShellMain.ChooseDriver(Sender: TObject); +var + olddriverfilename : string; + i:integer; +begin + DlgOpenDriver.InitialDir:=CurrentPath; + + olddriverfilename := driverfilename; +// If the user typed directly in the edit box + if Sender is TEdit then driverfilename:=DriverBox.text // Set the driverfile + else // User used the menu or clicked on the Driver label + begin // Show the open file dialog + // First set the default filename to the current driverfile + DlgOpenDriver.filename := driverfilename; + // Show the dialog and if the user clicks OK, set the new driver filename + if DlgOpenDriver.execute then driverfilename := DlgOpenDriver.filename; + end; + + if driverfilename <> olddriverfilename then + begin + if driverfilename <> '' then // Create a new empty file { TODO : When a new file is created the edit driver window should automatically pop up } + if not LazFileUtils.FileExistsUTF8(driverfilename) then + fileio.WriteDriverFile(driverfilename, fileio.driverlist); + ReadytoRun := False; // This forces the edit boxes on the FmShellMain to be update with the new filename + RunComplete := False; + end; + + CurrentPath := ExtractFilePath(paramfilename); + LazFileUtils.SetCurrentDirUTF8(CurrentPath); + UpdateFmShellMain; +end; + +{ This procedure enables the user to choose an Output file using several + different methods. The user can click Choose Output file from the menu, + click on the label Output File, or type a filename directly in the box. + If the user chooses using either the menu or the label, an open file dialog + is displayed. } +procedure TFmShellMain.ChooseOutputFile(Sender: TObject); +var + oldoutfilename : string; +begin // If the user typed directly in the edit box + DlgSaveOutput.InitialDir:=CurrentPath; + + oldoutfilename := outfilename; + + if Sender is TEdit then Outfilename := OutputBox.text // Set the output file + else // User used the menu or clicked on the Output label + begin // Show the Save file dialog + // First set the default filename to the current output file. + DlgSaveOutput.filename := outfilename; + // Show the dialog and if the user chooses OK, set the outfilename to the new file. + if DlgSaveOutput.execute then outfilename := DlgSaveOutput.filename; + end; + +{ if outfilename <> oldoutfilename then + begin + if outfilename <> '' then // Make sure a value was entered for the filename + begin + if LazFileUtils.FileExistsUTF8(outfilename) then // If the file already exists + // Confirm that the user wants to overwrite the existing file. + if MessageDlg('Overwrite existing output file, ' + outfilename + '?', + mtConfirmation, [mbYes,mbNo], 0) = mrNo then + begin + outfilename := ''; // Set the outfile to no value + end; + end; + end; } + FmDisplayOutput.DisplayFilename:=outfilename; + CurrentPath := ExtractFilePath(paramfilename); + LazFileUtils.SetCurrentDirUTF8(CurrentPath); + RunComplete := False; + ReadytoRun := False; // Can't run without an output file. + UpdateFmShellMain; // Update the form. +end; + +{ This procedure saves the current values of the state variables and the + parameters to the current parameter file. } +procedure TFmShellMain.MISaveParamClick(Sender: TObject); +begin + WriteParamFile(paramfilename, ModelDef.numparam, par, ModelDef.numstate, stat, + currentresid); + RunComplete := False; +// NewParamFile := False; + UpdateFmShellMain; + Beep; +end; + +{ Procedure to save the state variables and parameters to a new parameter file. } +procedure TFmShellMain.MISaveAsParamClick(Sender: TObject); +begin // Show the Save dialog +DlgSaveParam.InitialDir:=CurrentPath; + +with DlgSaveParam do + begin + // Set the default filename in save dialog to the current parameter file. + filename := paramfilename; + if execute then // If the user chooses OK in the save dialog. + begin + paramfilename:=filename; // Set the paramfilename to the new filename. + // Save the state variables and parameters to the current file. + WriteParamFile(paramfilename, ModelDef.numparam, par, ModelDef.numstate, + stat, currentresid); + // Set Ready to Run to false so the the edit boxes on the form will be + // updated when UpdateFmShellMain is called. +// NewParamFile := False; + ReadytoRun := False; + RunComplete := False; + UpdateFmShellMain; + end; + end; +end; + +procedure TFmShellMain.MISaveMemOutputClick(Sender: TObject); +begin + FmDisplayOutput.WriteOutputfromMem; +end; + +{ Procedure to allow the user to edit the parameter values. This procedure calls + the Parameters Form defined in the parameters.pas unit. While the user is editing + the parameters the FmShellMain is disabled. } +procedure TFmShellMain.MIEditParamClick(Sender: TObject); +begin +{ Show the parameter form. If the user clicked OK on the parameter form, + meaning they changed the parameter values, update this form. } + CalTime := Time_start; + FmParameter.ShowParameters; + if FmParameter.showmodal = mrOK then + begin +// Parameters have been changed so any previous model runs are invalid. + RunComplete := False; + UpdateFmShellMain; // Update the form. + currentresid := 999; + end; +end; + +{ Procedure to allow the user to edit the state variables. This procedure calls + the Data Form defined in the data.pas unit. While the user is editing + the state variables the FmShellMain is disabled. } +procedure TFmShellMain.MIEditStatesClick(Sender: TObject); +begin + DataForm.ShowStates; // Show the data form containing state variables + UpdateFmShellMain; +end; + +{ Procedure to allow the user to edit the driver variables. This procedure calls + the Note Form defined in the note.pas unit. While the user is editing + the drivers the FmShellMain is disabled. } +procedure TFmShellMain.MIEditDrvClick(Sender: TObject); +begin +{ Show the note form. If the user clicked OK on the note form, + meaning they changed the driver values, update this form. } + FmNote.Show; +// Drivers have been changed so any previous model runs are invalid. + RunComplete := False; +// User may have changed driver files, so force the edit boxes and menu to be updated. + ReadytoRun := False; + UpdateFmShellMain; +end; + +{ Procedure to process changes made to the start time mask edit box. The mask + edit box only allows numeric input with up to 5 digits. Values entered must be + integers. To change the allowed values modify the mask using the object + inspector. } +procedure TFmShellMain.MeStartTimeExit(Sender: TObject); +begin + if MEStartTime.Text <> '' then + if (MEStartTime.Text <> floattostr(time_Start)) then +// if (MEStartTime.Text <> '') and (MEStartTime.Modified) then + begin + Time_Start := strtofloat(MEStartTime.text); // Set the start time of the model. + ReadytoRun := False; // Force checking of start and stop times in UpdateFmShellMain. + RunComplete := False; // Previous runs are invalid. + UpdateFmShellMain; + end; +end; + +{ Procedure to process changes made to the start time mask edit box. The mask + edit box only allows numeric input with up to 5 digits. Values entered must be + integers. To change the allowed values modify the mask using the object + inspector. } +procedure TFmShellMain.MeStopTimeExit(Sender: TObject); +begin + if MeStopTime.Text <> '' then + if (MeStopTime.Text <> floattostr(time_Stop)) then +// if (MEStopTime.text <> '') and (MeStopTime.Modified) then + begin + Time_Stop := strtofloat(MEStopTime.text); // Set the stop time of the model. + ReadytoRun := False; // Force checking of start and stop times in UpdateFmShellMain. + RunComplete := False; // Previous runs are invalid. + UpdateFmShellMain; + end; +end; + +{ This procedure shows the output from the model run in table or chart format. + It uses the form defined in display.pas. } +procedure TFmShellMain.DisplayOutput(Sender: TObject); +begin + if (Sender as TMenuItem).Name = 'MIShowTable' then + FmDisplayOutput.DisplayStyle := dsTable // Set the type of display. + else + FmDisplayOutput.DisplayStyle := dsChart; + FmDisplayOutput.Enabled := True; + if not FmDisplayOutput.Visible then + FmDisplayOutput.ShowModal + else + FmDisplayOutput.WindowState:=wsNormal; + // or is this what I want +// FmDisplayOutput.BringToFront; +end; + +{ Show an about box containing general information about the model. } +procedure TFmShellMain.MIAboutClick(Sender: TObject); +begin + FmAbout.Caption := 'About ' + ModelDef.modelname; + FmAbout.LblModel.Caption := ModelDef.modelname; + FmAbout.LblVersion.Caption := ModelDef.versionnumber; + FmAbout.MoContact.Lines.Add(ModelDef.contactperson); + FmAbout.MoContact.Lines.Add(ModelDef.contactaddress1); + FmAbout.MoContact.Lines.Add(ModelDef.contactaddress2); + FmAbout.MoContact.Lines.Add(ModelDef.contactaddress3); + FmAbout.ShowModal; +end; + +{ This procedure presents a dialog which allows the user to reread the state + variables and/or parameters from the parameter form. It uses the Reload + dialog defined in the ReloadDlg.pas unit.} +procedure TFmShellMain.BtnReloadClick(Sender: TObject); +begin // Show the Reload Dialog +if paramfilename <> '' then + begin + if DlgReload.ShowModal = mrOK then // If the user clicked OK, values were reloaded + begin + RunComplete := False; // so previous runs are invalid. + UpdateFmShellMain; + end; + end +else + MessageDlg('Invalid parameter file. No values reloaded.',mtWarning,[mbOK],0); +end; + +// This procedure is used to update the controls on the Main Form, i.e. enabling +// and disabling them when appropriate. +procedure TFmShellMain.UpdateFmShellMain; +begin + if not ReadytoRun then + begin + ParamBox.text := paramfilename; // save it's name in the paramfilename variable + if paramfilename <> '' then // if a parameter file has been chosen + begin + MISaveParam.Enabled := true; // enable the save parameter file menu item + end; + // if a driver variable has been chosen, save it's name to driverfilename + if driverfilename <> '' then DriverBox.text := driverfilename; + // if an output file name has been chosen, save it's name to outfilename + if outfilename <> '' then OutputBox.text := outfilename; +// If all files have been chosen then enable the run button and calculate menu. + if (DriverBox.text <> '') and (ParamBox.text <> '') then + begin +// MICalculate.enabled := true; // Enable the calculate menu + if (OutputBox.text <> '') and (Time_stop > Time_start) then + begin + ReadytoRun := true; + BtnRun.enabled := true; + FmOptions.RunOptions.stepcounter := FmOptions.DefaultRunOptions.stepcounter; + end; + end; + end; + if RunComplete then // If a run is complete + begin + MISaveMemOutput.Enabled := true; + last_time := 0; + next_time := 0; + end + else + begin // Run is not complete or previous run is now invalid + MISaveMemOutput.Enabled := false; + PresentBox.Text := floattostr(0); // Set the present time to 0 + end; + if FmShellMain.ActiveControl is TEdit then + if FmShellMain.ActiveControl.Name = 'ParamBox' then + FmShellMain.ActiveControl := BtnCloseShell; + if FmOptions.RunOptions.NormalRun then + MINormalRun.Checked := True + else + MISpecialRun.Checked := True; +end; + +// This procedure controls the actual running of a model scenario. +procedure TFmShellMain.BtnRunClick(Sender: TObject); +var + j, outputfreq, stepsperfullstep, nok, nbad, idx, endstate:integer; + tempstat:yValueArray; + drivetime, nextstep, remainder, errorest, SStest, SSstep, temp:double; + steadystate, ResetDriverFile: Boolean; + previousstat, tempstate: statearray; + basename,anewname,theext:string; +begin + BeginningofRun := True; + ResetDriverFile := False; + LargeOutput := False; + openDriverFile(driverfilename,fileio.driverlist); + if RunningInteractive then + begin + ShowProgressBar; + FmShellMain.Enabled := False; + end; + try try + stepsperfullstep := round(fullstep/FmOptions.RunOptions.Time_step); + initialstates := stat; + last_time := 0; + next_time := 0; + nextstep := FmOptions.RunOptions.Time_step; + time := time_start; + drivetime := time_start; + steadystate := false; +// Variables used to keep track of when to write to output file + outputfreq := round(FmOptions.RunOptions.Outputstep/FmOptions.RunOptions.Time_step); +// Calculate and write out the initial state of system. + GetCurrentDrivers(drivetime,drive); + processes(time,drivetime,drive,par,stat,proc,false); + FmDisplayOutput.FirstWrite := True; + FmDisplayOutput.ClearGrid; + if (not FmOptions.RunOptions.AppendOutputFile) and + (not FmOptions.RunOptions.OutputEORonly) and + (FmOptions.RunOptions.Outputoffset = FmOptions.DefaultRunOptions.Outputoffset) then + FmDisplayOutput.StoreResults(time_start-fullstep, drive, stat, proc); + randomize; // MEL specific + previousstat := stat; + while (time < time_stop + fullstep) and (not steadystate) do + begin +// if time-10 < epsilon then nextstep := FmOptions.RunOptions.Time_step; + for j:=1 to ModelDef.numstate do tempstat[j] := stat[j].value; + RK4_5_Integrator(tempstat, modeldef.numstate, time, time+FmOptions.RunOptions.Time_step, drivetime, + nextstep,drive, par); + for j:=1 to ModelDef.numstate do stat[j].value := tempstat[j]; + temp := abs((time+FmOptions.RunOptions.Time_step)/FmOptions.RunOptions.DiscreteStep - // time + round((time+FmOptions.RunOptions.Time_step)/FmOptions.RunOptions.DiscreteStep)); // time + BeginningofRun := False; + if temp > epsilon then + processes(time, drivetime, drive, par, stat, proc, false) + else + processes(time, drivetime, drive, par, stat, proc, true); +// Write output + FmOptions.RunOptions.outcounter := FmOptions.RunOptions.outcounter + 1; + if FmOptions.RunOptions.OutputEORonly then + begin + if time >= time_stop then FmDisplayOutput.StoreResults(time, drive, stat, proc); + end + else if FmOptions.RunOptions.OutputAnnually then + begin + if DayofYear = FmOptions.RunOptions.OutputAnnuallyDay then + FmDisplayOutput.StoreResults(time, drive, stat, proc); + end + else + begin // All output options except OutputEOR and OutputAnnually + if (time >= FmOptions.RunOptions.Outputoffset) then + begin + if (time = FmOptions.RunOptions.Outputoffset) or + (FmOptions.RunOptions.outcounter = outputfreq) then + begin + if (stepsperfullstep <> fullstep) and + (FmOptions.RunOptions.time_step <> FmOptions.RunOptions.Outputstep) then + FmDisplayOutput.StoreResults(time, drive, stat, proc) + else + FmDisplayOutput.StoreResults(time, drive, stat, proc); + FmOptions.RunOptions.outcounter := FmOptions.DefaultRunOptions.outcounter; + end; + end + else // Haven't reached the outputoffset yet + begin + FmOptions.RunOptions.outcounter := FmOptions.DefaultRunOptions.outcounter; + end; + end; +// Save output to file mid run + if FmOptions.RunOptions.WriteEvery <> 0 then + if frac(time/FmOptions.RunOptions.WriteEvery) < epsilon then + FmDisplayOutput.WritePurgeOutputfromMem; +// Reset State variables option + if FmOptions.RunOptions.ResetStates then + begin + remainder := time - int(time/FmOptions.RunOptions.ResetStateTime)*FmOptions.RunOptions.ResetStateTime; + if remainder = 0 then FmShellMain.ResetStatesNow(BtnRun); + end; +// Run to steady state option + if FmOptions.RunOptions.RuntoSS then + begin + SSstep := (FmOptions.RunOptions.Time_step - FmOptions.RunOptions.SSTime* + (round(FmOptions.RunOptions.Time_step/FmOptions.RunOptions.SSTime))); + SStest := (time - FmOptions.RunOptions.SSTime* + (round(time/FmOptions.RunOptions.SSTime))); + if (SStest >= 0) and (SStest < SSstep) then + begin + steadystate := true; + for j := 1 to ModelDef.numstate do + begin + errorest := abs(previousstat[j].value - + stat[j].value)/stat[j].value; + if errorest <= FmOptions.RunOptions.SSCriteria then + steadystate := steadystate and true + else + steadystate := steadystate and false; + end; + previousstat := stat; + // If outputEORonly then modify time_stop and steadystate so that + // loop executes one more time and then outputs results. + if steadystate and FmOptions.RunOptions.OutputEORonly then + begin + steadystate := false; + time_stop := time + FmOptions.RunOptions.Time_step; + end; + end; + end; +// Next time step + time := time_start + FmOptions.RunOptions.stepcounter*FmOptions.RunOptions.Time_step; + if (not FmOptions.RunOptions.RepeatDrivers) or (time <= FmOptions.RunOptions.RepeatDriveTime) then drivetime := time; + FmOptions.RunOptions.stepcounter := FmOptions.RunOptions.stepcounter + 1; +// Repeat drivers option + if ResetDriverFile then + begin + drivetime := time_start; + last_time := 0; next_time := 0; + ResetDriverFile := False; + end; + if (FmOptions.RunOptions.RepeatDrivers) and (time >= FmOptions.RunOptions.RepeatDriveTime) then + drivetime := time - int(time/FmOptions.RunOptions.RepeatDriveTime)*FmOptions.RunOptions.RepeatDriveTime; // mod function for doubles + if drivetime = 0 then + begin + drivetime := FmOptions.RunOptions.RepeatDriveTime; + ResetDriverFile := True; + end; +// Update progress bar + if RunningInteractive then + FmProgress.PbRunStatus.Position := (round(time - time_start)*100) + div round(time_stop - time_start); +// check for pending messages (for example, the cancel button) + application.ProcessMessages; + if stopRun then break; + end; + finally + if FmOptions.RunOptions.OutputFile then + if FmOptions.RunOptions.WriteEvery = 0 then FmDisplayOutput.WriteOutputfromMem; + stopRun := false; + RunComplete := True; + FmOptions.RunOptions.stepcounter := FmOptions.DefaultRunOptions.stepcounter; + FmOptions.RunOptions.outcounter := FmOptions.DefaultRunOptions.outcounter; + ResetStatesNow(BtnRun); + if RunningInteractive then + begin + UpdateFmShellMain; + FmShellMain.Enabled := True; + FmDisplayOutput.Enabled := True; + PresentBox.Text := floattostrf(Time,ffgeneral,5,1); + FmProgress.Hide; + if (FmDisplayOutput.autoShowChart) and (not FmDisplayOutput.Visible) then + DisplayOutput(MIShowChart); + if LargeOutput then + MessageDlg('Output was very large. To prevent a system crash, output was ' + + 'written to the output file and removed from memory during the run. ' + + 'Only the final portion of the run is in memory. You will need to ' + + 'use a different program to view the results.' ,mtWarning,[mbOK],0); + end + else + begin + // Save parameter file if running a calibration in batch mode + if par[FmCalculate.GetArrayIndex(vtparameter,'calibrate')].value<>-999 then + begin + basename:=ExtractFileName(paramfilename); + theext:=ExtractFileExt(paramfilename); + delete(basename,pos(theext,basename),length(basename)); + anewname:=basename+'.cal'+theext; + // Save the end of the calibration + WriteParamFile(anewname, ModelDef.numparam, par, ModelDef.numstate, + stat, currentresid); + // Create a new parameter file for steady state run. + tempstate:=stat; + endstate:=FmCalculate.GetArrayIndex(vtstate,'RCa'); + for idx := 1 to endstate do + tempstate[idx].Reset:=false; + anewname:=basename+'.final'+theext; + par[FmCalculate.GetArrayIndex(vtparameter,'calibrate')].value:=-999; + WriteParamFile(anewname, ModelDef.numparam, par, ModelDef.numstate, + tempstate, currentresid); + // Create climate parameter files + //CO2 + anewname:=basename+'.CO2'+theext; + par[FmCalculate.GetArrayIndex(vtparameter,'FlagCa')].value:=1; + WriteParamFile(anewname, ModelDef.numparam, par, ModelDef.numstate, + tempstate, currentresid); + //T + anewname:=basename+'.T'+theext; + par[FmCalculate.GetArrayIndex(vtparameter,'FlagCa')].value:=0; + par[FmCalculate.GetArrayIndex(vtparameter,'FlagT')].value:=1; + WriteParamFile(anewname, ModelDef.numparam, par, ModelDef.numstate, + tempstate, currentresid); + //Ppt + anewname:=basename+'.Ppt'+theext; + par[FmCalculate.GetArrayIndex(vtparameter,'FlagT')].value:=0; + par[FmCalculate.GetArrayIndex(vtparameter,'FlagPpt')].value:=1; + WriteParamFile(anewname, ModelDef.numparam, par, ModelDef.numstate, + tempstate, currentresid); + //Call + anewname:=basename+'.Call'+theext; + par[FmCalculate.GetArrayIndex(vtparameter,'FlagCa')].value:=1; + par[FmCalculate.GetArrayIndex(vtparameter,'FlagT')].value:=1; + par[FmCalculate.GetArrayIndex(vtparameter,'FlagPpt')].value:=1; + WriteParamFile(anewname, ModelDef.numparam, par, ModelDef.numstate, + tempstate, currentresid); + + end; + end; + end; + except + on EFileError do raise; + on E: Exception do + begin + if RunningInteractive then + begin + FmTrouble.MmError.Lines.Clear; + FmTrouble.MmError.Lines.Add(E.Message); + FmTrouble.ShowModal; + end + else + raise; + end; + end; +end; + +procedure TFmShellMain.FormDestroy(Sender: TObject); +begin + if Assigned(fileio.driverlist) then + FreeAndNil(fileio.driverlist); +end; + +procedure TFmShellMain.MIExitClick(Sender: TObject); +var + answer:word; +begin + if NeedToSavePar = True then + begin + answer := MessageDlg('Save parameter file before exiting?', + mtConfirmation, mbYesNoCancel, 0); + if answer <> mrCancel then + if answer = mrYes then + begin + DlgSaveParam.Filename := paramfilename; + if DlgSaveParam.execute then + WriteParamFile(paramfilename, ModelDef.numparam, par, + ModelDef.numstate, stat, currentresid); + end + else + close; + end + else close; +end; + +procedure TFmShellMain.MICalTimeClick(Sender: TObject); +begin +// Ask the user for the time to calculate a steady state at. + CalTime := strtofloat(InputBox('Steady State Time', + 'Enter the time from the driver file at which to calculate a steady state.', + floattostr(CalTime))); + RunComplete := False; +end; + +procedure TFmShellMain.MICalcSSClick(Sender: TObject); +begin + FmCalculate.showmodal; +end; + +procedure TFmShellMain.SetNumSpecies(anEditBox: TEdit); // MEL specific +begin +{ if anEditBox.text <> '' then // If a value has been entered. + begin + numspp:= strtoint(anEditBox.text); // Set the number of species + if numspp<1 then numspp:=1; + if numspp>Maxspecies then numspp:=Maxspecies; + anEditBox.text := inttostr(numspp); + counts; + LblWelcome.Visible:=false; + LblWelcome.Enabled:=false; + LblDirections.Visible:=false; + LblDirections.Enabled:=false; + EdNumSpecies.Enabled:=false; + + MIFiles.Enabled:=true; + MIEdit.Enabled:=true; + MIView.Enabled:=true; + ParamLabel.Visible:=true; + Parambox.Visible:=true; + DriverLabel.Visible:=true; + DriverBox.Visible:=true; + OutputLabel.Visible:=true; + OutputBox.Visible:=true; + StartLabel.Visible:=true; + MeStartTime.Visible:=true; + StopLabel.Visible:=true; + MeStopTime.Visible:=true; + StepLabel.Visible:=true; + MeTimeStep.Visible:=true; + BtnRun.Visible:=true; + PresentLabel.Visible:=true; + PresentBox.Visible:=true; + BtnReload.Visible:=true; + if RunningInteractive then + begin + Fmparameter.FormDestroy(EdNumSpecies); + Fmparameter.FormCreate(EdNumSpecies); + Fmdisplaydata.FormCreate(EdNumSpecies); + DataForm.FormCreate(EdNumSpecies); + end; + end; } +end; + +procedure TFmShellMain.EdNumSpeciesChange(Sender: TObject); +begin +{ FmShellMain.SetNumSpecies(FmShellMain.EdNumSpecies); } +end; + +procedure TFmShellMain.EdNumSpeciesExit(Sender: TObject); +begin +{ if EdNumSpecies.text = '' then FmShellMain.ActiveControl := EdNumSpecies; } +end; // MEL specific + +procedure TFmShellMain.MIViewOutFileClick(Sender: TObject); +begin + FmDisplayOutput.MILoadFileClick(Sender) +end; + +procedure TFmShellMain.MEStopTimeKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then MeStopTimeExit(Sender); +end; + +procedure TFmShellMain.MEStartTimeKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then MeStartTimeExit(Sender); +end; + +procedure TFmShellMain.MIOpenOptionsClick(Sender: TObject); +begin + if (Sender as TComponent).name = 'MITimeSteps' then + lastitem := MITimeSteps + else if (Sender as TComponent).name = 'MISpecialRun' then + lastitem := MISpecialRun + else + lastitem := MIOutOptions; + UpdateFmShellMain; + FmOptions.ShowModal; +end; + +procedure TFmShellMain.MINormalRunClick(Sender: TObject); +begin + FmOptions.RunOptions.NormalRun := True; + FmOptions.UpdateFmRunOptions(MINormalRun); + MINormalRun.Checked := True; + RunComplete := False; + Readytorun := False; +end; + +procedure TFmShellMain.ResetStatesNow(Sender: TObject); +var + i: integer; +begin + for i := 1 to ModelDef.numstate do + begin + if stat[i].reset then stat[i].value := initialstates[i].value; + end; +end; + +procedure TFmShellMain.MIAutoChartClick(Sender: TObject); +begin + if MIAutoChart.Checked then + MIAutoChart.Checked := False + else + MIAutoChart.Checked := True; + FmDisplayOutput.AutoShowChart:=MIAutoChart.Checked; +end; + +procedure TFmShellMain.ParamBoxKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then ChooseParamFile(Sender); +end; + +procedure TFmShellMain.DriverBoxKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then ChooseDriver(Sender); +end; + +procedure TFmShellMain.OutputBoxKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then ChooseOutputFile(Sender); +end; + +procedure TFmShellMain.EdNumSpeciesKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = Chr(13)) then EdNumSpeciesExit(Sender); +end; + +procedure TFmShellMain.ShowProgressBar; +begin + FmProgress.Caption := modeldef.modelname + ' run progress'; + FmProgress.LblBegin.Caption := floattostr(time_start); + FmProgress.LblEnd.Caption := floattostr(time_stop); + FmProgress.CancelProcedure := CancelRun; +// if FmDisplayOutput.Visible then FmProgress.Parent:= FmDisplayOutput; + FmProgress.Show; +end; + +procedure TFmShellMain.CancelRun; +begin + stopRun := True; + FmDisplayOutput.autoShowChart := false; +end; + +function TFmShellMain.GetResourcePath(): string; +{$ifdef Darwin} +var + pathRef:CFURLRef; + pathCFStr: CFStringRef; + pathStr: shortstring; +{$endif} +begin +{$ifdef Unix} +{$ifdef Darwin} + pathRef := CFBundleCopyBundleURL(CFBundleGetMainBundle()); + pathCFStr := CFURLCopyFileSystemPath(pathRef, kCFURLPOSIXPathStyle); + CFStringGetPascalString(pathCFStr, @pathStr, 255, CFStringGetSystemEncoding()); + CFRelease(pathRef); + CFRelease(pathCFStr); + + Result := pathStr + BundleResourceDirectory; +{$else} + Result := DefaultUnixDirectory; +{$endif} +{$else} // Windows + Result := ExtractFilePath(Application.exeName); +{$endif} +end; + +end. diff --git a/modelshell/integrator.pas b/modelshell/integrator.pas new file mode 100644 index 0000000..97db007 --- /dev/null +++ b/modelshell/integrator.pas @@ -0,0 +1,143 @@ +{ Code to implement a 4th order Runge-Kutta integrator with adaptive step size + control. This integrator is used to integrate the differential equations in + the equations.pas file. } +unit integrator; + +interface + +uses sysutils, Dialogs, stypes, equations, fileio; + +PROCEDURE RK4_5_Integrator(VAR ystart: yValueArray; nvar: integer; + t1,t2,dr: double; var stepguess:double; + var tdrive:drivearray; var tpar:paramarray); + +implementation + +uses frontend, math, Options; + +PROCEDURE RungeKutta(y: yValueArray; n: integer; t,tstep,dr: double; flag:boolean; + VAR yout, dydt: yValueArray; var tpar:paramarray; var tdrive:drivearray); + +VAR + i: integer; + + ytemp,k,S:yValueArray; +BEGIN + try + if flag then + begin + derivs(t,dr,tdrive,tpar,y,k); // calk dirivs + dydt:=k; // save 1st k for next call + end + else k:=dydt; // use k input to routine + for i:=1 to n do S[i]:=k[i]/6; // 1st k + + FOR i := 1 to n DO ytemp[i] := y[i] + tstep*k[i]/2; // half step 1 + derivs(t+tstep/2,dr+tstep/2,tdrive,tpar,ytemp,k); // calk dirivs + for i:=1 to n do S[i]:=S[i]+k[i]/3; // 2nd k + + FOR i := 1 to n DO ytemp[i] := y[i] + tstep*k[i]/2; // half step 2 + derivs(t+tstep/2,dr+tstep/2,tdrive,tpar,ytemp,k); // calk dirivs + for i:=1 to n do S[i]:=S[i]+k[i]/3; // 3rd k + + FOR i := 1 to n DO ytemp[i] := y[i] + tstep*k[i]; // full step + derivs(t+tstep,dr+tstep,tdrive,tpar,ytemp,k); // calk dirivs + for i:=1 to n do S[i]:=S[i]+k[i]/6; // 4th k + + for i:=1 to n do yout[i]:=y[i]+S[i]*tstep; // estimate new y + except + raise; + end; +END; + + +PROCEDURE TimestepControl(VAR y:yValueArray; n: integer; VAR t, dr: double; + steptry: double; VAR stepdid,stepnext: double; + var tdrive:drivearray; var tpar:paramarray; var index: integer); +Const + eps= 0.0001; +VAR + tstep, emax,scale: double; + ytemp,yout,epsilon,dydt:yValueArray; + i:integer; + flag,flag2:boolean; + tdrivehalftime:drivearray; +Begin + emax:=2*eps; + flag:=true; + flag2:=true; + while flag2 do + begin + counttt:=counttt+1; + tstep:=steptry/2; + if (t = t+tstep) THEN + raise EIntStepTooSmall.Create('Step size too small in TimestepControl ' + + 'Error caused by state variable, ' + stat[index].name + '.'); { TODO -cVisual : Remove word state from error message so that the actual variable name shows up in the box. On some computers it gets cut off. } + RungeKutta(y, n, t,tstep,dr, Flag, ytemp, dydt, tpar, tdrive); + flag:=false; + tdrivehalftime:=tdrive; + GetCurrentDrivers(dr+tstep,tdrivehalftime); + RungeKutta(ytemp, n, t+tstep, tstep, dr+tstep, TRUE, yout, epsilon, tpar, tdrivehalftime); + RungeKutta(y, n, t, steptry, dr, FALSE, ytemp, dydt, tpar, tdrive); + emax:=0; + index:=0; + For i:=1 to n do + begin + epsilon[i]:=yout[i]-ytemp[i]; + scale := FmOptions.RunOptions.Errormult*max(abs(y[i]), eps)+1e-30; + if emax < abs(epsilon[i])/scale then + begin + emax:=abs(epsilon[i])/scale; + index:=i; + end; + end; + stepdid:=steptry; + if emax>eps then stepnext:=0.9*steptry*power(eps/emax,1/4) + else + begin + if emax>0 then stepnext:=1.1*steptry*power(eps/emax,1/5) + else stepnext:=2*steptry; + flag2:=false; + end; + steptry:=stepnext; + end; {while} + For i:=1 to n do y[i]:=yout[i]+epsilon[i]/15; +End; + + +PROCEDURE RK4_5_Integrator(VAR ystart: yValueArray; nvar: integer; + t1,t2,dr: double; var stepguess:double; + var tdrive:drivearray; var tpar:paramarray); + +VAR + numstep,i, index: integer; + t,stepnext,stepdid,step, stepmin:double; + y: yValueArray; +BEGIN + stepmin:=0.000001*FmOptions.RunOptions.Time_step; + t := t1; + step := stepguess; + y := ystart; + Numstep:=0; + While tt2 then step:=t2-t; // avoid overstep + TimestepControl(y,nvar,t,dr,step,stepdid,stepnext,tdrive,tpar,index); + t:=t+stepdid; + dr:=dr+stepdid; + step:=stepnext; + ystart := y; + stepguess := stepnext; + Numstep:=numstep+1; + IF (abs(stepnext) < stepmin) THEN + raise EIntStepTooSmall.Create('Step size too small in Integrator. ' + + 'Error caused by state variable, ' + stat[index].name + '.'); + IF numstep>10000 THEN + raise EIntStepTooSmall.Create('Too many steps in Integrator. ' + + 'Error caused by state variable, ' + stat[index].name + '.'); + end; + END; + + +end. diff --git a/modelshell/modelbatch.lpi b/modelshell/modelbatch.lpi new file mode 100644 index 0000000..c522b7c --- /dev/null +++ b/modelshell/modelbatch.lpi @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + <UseAppBundle Value="False"/> + <ResourceType Value="res"/> + </General> + <i18n> + <EnableI18N LFM="False"/> + </i18n> + <BuildModes Count="1"> + <Item1 Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + <Modes Count="1"> + <Mode0 Name="default"/> + </Modes> + </RunParams> + <RequiredPackages Count="3"> + <Item1> + <PackageName Value="TAChartLazarusPkg"/> + </Item1> + <Item2> + <PackageName Value="Printer4Lazarus"/> + </Item2> + <Item3> + <PackageName Value="LCL"/> + </Item3> + </RequiredPackages> + <Units Count="20"> + <Unit0> + <Filename Value="modelbatch.lpr"/> + <IsPartOfProject Value="True"/> + </Unit0> + <Unit1> + <Filename Value="batchmain.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FmBatchMain"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + </Unit1> + <Unit2> + <Filename Value="aboutbox.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + </Unit2> + <Unit3> + <Filename Value="calculate.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + </Unit3> + <Unit4> + <Filename Value="data.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + </Unit4> + <Unit5> + <Filename Value="display.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + <UnitName Value="Display"/> + </Unit5> + <Unit6> + <Filename Value="equations.pas"/> + <IsPartOfProject Value="True"/> + </Unit6> + <Unit7> + <Filename Value="fileio.pas"/> + <IsPartOfProject Value="True"/> + </Unit7> + <Unit8> + <Filename Value="frontend.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FmShellMain"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + </Unit8> + <Unit9> + <Filename Value="integrator.pas"/> + <IsPartOfProject Value="True"/> + </Unit9> + <Unit10> + <Filename Value="note.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + </Unit10> + <Unit11> + <Filename Value="ProgressBar.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + </Unit11> + <Unit12> + <Filename Value="ReloadDlg.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + </Unit12> + <Unit13> + <Filename Value="ScaleDlg.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + </Unit13> + <Unit14> + <Filename Value="SeriesForm.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + </Unit14> + <Unit15> + <Filename Value="stypes.pas"/> + <IsPartOfProject Value="True"/> + </Unit15> + <Unit16> + <Filename Value="trouble.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + <UnitName Value="TROUBLE"/> + </Unit16> + <Unit17> + <Filename Value="ParamList.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + </Unit17> + <Unit18> + <Filename Value="Options.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + </Unit18> + <Unit19> + <Filename Value="parameter.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FmParameter"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + </Unit19> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <SearchPaths> + <IncludeFiles Value="..\ses2011\Modeling\code versions\modelshellv653 Weds morn crashing"/> + </SearchPaths> + <Parsing> + <SyntaxOptions> + <SyntaxMode Value="delphi"/> + </SyntaxOptions> + </Parsing> + <Linking> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + </CompilerOptions> + <Debugging> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/modelshell/modelbatch.lpr b/modelshell/modelbatch.lpr new file mode 100644 index 0000000..9c29420 --- /dev/null +++ b/modelshell/modelbatch.lpr @@ -0,0 +1,37 @@ +program modelbatch; + +uses + Forms, Interfaces, + batchmain in 'batchmain.pas' {FmBatchMain}, + aboutbox in 'aboutbox.pas' {FmAbout}, + calculate in 'calculate.pas' {FmCalculate}, + data in 'data.pas' {DataForm}, + Display in 'Display.pas' {FmDisplayData}, + equations in 'equations.pas', + fileio in 'fileio.pas', + frontend in 'frontend.pas' {MainForm}, + integrator in 'integrator.pas', + note in 'note.pas' {FmNote}, + ProgressBar in 'ProgressBar.pas' {FmProgress}, + ReloadDlg in 'ReloadDlg.pas' {DlgReload}, + ScaleDlg in 'Scaledlg.pas' {DlgScale}, + SeriesForm in 'SeriesForm.pas' {FmSeries}, + stypes in 'stypes.pas', + trouble in 'Trouble.pas' {FmTrouble}, + ParamList in 'ParamList.pas' {FmParamList}, + Options in 'Options.pas' {FmOptions}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TFmBatchMain, FmBatchMain); + Application.CreateForm(TFmAbout, FmAbout); + Application.CreateForm(TFmShellMain, FmShellMain); + Application.CreateForm(TFmParamList, FmParamList); + Application.CreateForm(TFmDisplayOutput, FmDisplayOutput); + Application.CreateForm(TFmOptions, FmOptions); + FmShellMain.Visible := False; + FmShellMain.Enabled := False; + Application.Run; +end. diff --git a/modelshell/modelbatch.lps b/modelshell/modelbatch.lps new file mode 100644 index 0000000..15fc53b --- /dev/null +++ b/modelshell/modelbatch.lps @@ -0,0 +1,358 @@ +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectSession> + <PathDelim Value="\"/> + <Version Value="11"/> + <BuildModes Active="Default"/> + <Units Count="22"> + <Unit0> + <Filename Value="modelbatch.lpr"/> + <IsPartOfProject Value="True"/> + <CursorPos X="91" Y="19"/> + <UsageCount Value="81"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit0> + <Unit1> + <Filename Value="batchmain.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FmBatchMain"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <EditorIndex Value="2"/> + <TopLine Value="195"/> + <CursorPos Y="217"/> + <UsageCount Value="81"/> + <Loaded Value="True"/> + <LoadedDesigner Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit1> + <Unit2> + <Filename Value="aboutbox.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + <EditorIndex Value="3"/> + <UsageCount Value="81"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit2> + <Unit3> + <Filename Value="calculate.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + <EditorIndex Value="4"/> + <UsageCount Value="81"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit3> + <Unit4> + <Filename Value="data.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + <EditorIndex Value="5"/> + <UsageCount Value="81"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit4> + <Unit5> + <Filename Value="display.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + <UnitName Value="Display"/> + <EditorIndex Value="6"/> + <TopLine Value="649"/> + <CursorPos Y="686"/> + <UsageCount Value="81"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit5> + <Unit6> + <Filename Value="equations.pas"/> + <IsPartOfProject Value="True"/> + <IsVisibleTab Value="True"/> + <EditorIndex Value="1"/> + <TopLine Value="7715"/> + <CursorPos X="17" Y="7742"/> + <UsageCount Value="81"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit6> + <Unit7> + <Filename Value="fileio.pas"/> + <IsPartOfProject Value="True"/> + <EditorIndex Value="7"/> + <TopLine Value="91"/> + <CursorPos Y="117"/> + <UsageCount Value="81"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit7> + <Unit8> + <Filename Value="frontend.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FmShellMain"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <EditorIndex Value="9"/> + <TopLine Value="562"/> + <CursorPos X="118" Y="576"/> + <UsageCount Value="81"/> + <Loaded Value="True"/> + <LoadedDesigner Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit8> + <Unit9> + <Filename Value="integrator.pas"/> + <IsPartOfProject Value="True"/> + <EditorIndex Value="8"/> + <UsageCount Value="81"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit9> + <Unit10> + <Filename Value="note.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + <UsageCount Value="81"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit10> + <Unit11> + <Filename Value="ProgressBar.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + <UsageCount Value="81"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit11> + <Unit12> + <Filename Value="ReloadDlg.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + <EditorIndex Value="10"/> + <UsageCount Value="81"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit12> + <Unit13> + <Filename Value="ScaleDlg.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + <EditorIndex Value="11"/> + <UsageCount Value="81"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit13> + <Unit14> + <Filename Value="SeriesForm.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + <EditorIndex Value="12"/> + <UsageCount Value="81"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit14> + <Unit15> + <Filename Value="stypes.pas"/> + <IsPartOfProject Value="True"/> + <UsageCount Value="81"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit15> + <Unit16> + <Filename Value="trouble.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + <UnitName Value="TROUBLE"/> + <EditorIndex Value="13"/> + <UsageCount Value="81"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit16> + <Unit17> + <Filename Value="ParamList.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + <UsageCount Value="81"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit17> + <Unit18> + <Filename Value="Options.pas"/> + <IsPartOfProject Value="True"/> + <HasResources Value="True"/> + <UsageCount Value="81"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit18> + <Unit19> + <Filename Value="parameter.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FmParameter"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UsageCount Value="81"/> + </Unit19> + <Unit20> + <Filename Value="params.pas"/> + <HasResources Value="True"/> + <EditorIndex Value="-1"/> + <CursorPos X="46" Y="20"/> + <UsageCount Value="15"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit20> + <Unit21> + <Filename Value="..\ses2011\Modeling\code versions\modelshellv653 Weds morn crashing\bkPageControl.pas"/> + <CursorPos X="91" Y="18"/> + <UsageCount Value="15"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit21> + </Units> + <JumpHistory Count="30" HistoryIndex="29"> + <Position1> + <Filename Value="batchmain.pas"/> + <Caret Line="135" Column="25" TopLine="92"/> + </Position1> + <Position2> + <Filename Value="batchmain.pas"/> + <Caret Line="118" TopLine="92"/> + </Position2> + <Position3> + <Filename Value="batchmain.pas"/> + <Caret Line="217" TopLine="103"/> + </Position3> + <Position4> + <Filename Value="batchmain.pas"/> + <Caret Line="135" Column="25" TopLine="115"/> + </Position4> + <Position5> + <Filename Value="frontend.pas"/> + <Caret Line="592" Column="82" TopLine="574"/> + </Position5> + <Position6> + <Filename Value="frontend.pas"/> + <Caret Line="364" Column="91" TopLine="328"/> + </Position6> + <Position7> + <Filename Value="frontend.pas"/> + <Caret Line="543" Column="77" TopLine="500"/> + </Position7> + <Position8> + <Filename Value="frontend.pas"/> + <Caret Line="544" Column="59" TopLine="501"/> + </Position8> + <Position9> + <Filename Value="frontend.pas"/> + <Caret Line="148" Column="43" TopLine="123"/> + </Position9> + <Position10> + <Filename Value="frontend.pas"/> + <Caret Line="333" Column="31" TopLine="290"/> + </Position10> + <Position11> + <Filename Value="frontend.pas"/> + <Caret Line="335" Column="38" TopLine="292"/> + </Position11> + <Position12> + <Filename Value="frontend.pas"/> + <Caret Line="339" Column="41" TopLine="296"/> + </Position12> + <Position13> + <Filename Value="frontend.pas"/> + <Caret Line="340" Column="70" TopLine="297"/> + </Position13> + <Position14> + <Filename Value="frontend.pas"/> + <Caret Line="341" Column="45" TopLine="298"/> + </Position14> + <Position15> + <Filename Value="frontend.pas"/> + <Caret Line="344" Column="18" TopLine="301"/> + </Position15> + <Position16> + <Filename Value="frontend.pas"/> + <Caret Line="346" Column="17" TopLine="303"/> + </Position16> + <Position17> + <Filename Value="frontend.pas"/> + <Caret Line="348" Column="48" TopLine="305"/> + </Position17> + <Position18> + <Filename Value="frontend.pas"/> + <Caret Line="350" Column="70" TopLine="307"/> + </Position18> + <Position19> + <Filename Value="frontend.pas"/> + <Caret Line="353" Column="22" TopLine="310"/> + </Position19> + <Position20> + <Filename Value="frontend.pas"/> + <Caret Line="357" Column="46" TopLine="314"/> + </Position20> + <Position21> + <Filename Value="frontend.pas"/> + <Caret Line="543" Column="77" TopLine="500"/> + </Position21> + <Position22> + <Filename Value="frontend.pas"/> + <Caret Line="544" Column="59" TopLine="480"/> + </Position22> + <Position23> + <Filename Value="display.pas"/> + <Caret Line="147" Column="33" TopLine="113"/> + </Position23> + <Position24> + <Filename Value="display.pas"/> + <Caret Line="325" Column="23" TopLine="282"/> + </Position24> + <Position25> + <Filename Value="display.pas"/> + <Caret Line="686" TopLine="649"/> + </Position25> + <Position26> + <Filename Value="batchmain.pas"/> + <Caret Line="121" TopLine="95"/> + </Position26> + <Position27> + <Filename Value="batchmain.pas"/> + <Caret Line="122" TopLine="95"/> + </Position27> + <Position28> + <Filename Value="batchmain.pas"/> + <Caret Line="123" TopLine="95"/> + </Position28> + <Position29> + <Filename Value="batchmain.pas"/> + <Caret Line="217" TopLine="195"/> + </Position29> + <Position30> + <Filename Value="equations.pas"/> + <Caret Line="4593" Column="118" TopLine="4555"/> + </Position30> + </JumpHistory> + <RunParams> + <FormatVersion Value="2"/> + <Modes Count="0" ActiveMode="default"/> + </RunParams> + </ProjectSession> + <Debugging> + <BreakPoints Count="3"> + <Item1> + <Kind Value="bpkSource"/> + <WatchScope Value="wpsLocal"/> + <WatchKind Value="wpkWrite"/> + <Source Value="batchmain.pas"/> + <Line Value="217"/> + </Item1> + <Item2> + <Kind Value="bpkSource"/> + <WatchScope Value="wpsLocal"/> + <WatchKind Value="wpkWrite"/> + <Source Value="batchmain.pas"/> + <Line Value="121"/> + </Item2> + <Item3> + <Kind Value="bpkSource"/> + <WatchScope Value="wpsLocal"/> + <WatchKind Value="wpkWrite"/> + <Source Value="display.pas"/> + <Line Value="686"/> + </Item3> + </BreakPoints> + </Debugging> +</CONFIG> diff --git a/modelshell/modelbatch.res b/modelshell/modelbatch.res new file mode 100644 index 0000000000000000000000000000000000000000..b68437508c9faa2e5e7e922d9618cb0bdbc94e5d GIT binary patch literal 2348 zcmeH}K~BRk5JhL~q;|YOU2uRbS#ksrD;B^NdXyfeOODZ_aFg)=IFqJr0&7r5n#S_` z^T)QV$|52?au{l2cov`8d4xudZMR+Hq6Z9m<P%Z_;*}WCV7K!=N9p@2-0wvW2a&HY zk>imZ6SugX!0iP7^$FB}lGQD$hE)cjh#v&;7f!5U)xa?Lioo1iAL8N~8`V~|*@Tdm zcxtq1TkuUt3j$!U%JYIC5m&xskS3nc;L5--2>kJTEdXywM!vZ)@bVKs6C^J;&IUA? zHi=<IU(VCNatQnwM{M)J_MI899E+>dt@BCX?k7GPj7#wHOFkM9XLh~jW{^_Xb==Vy zRC)slBo=UsD(Er-cf`VW=mK&IPrM!gIny}=D2~i}k0N*}<Sa+z5F@yspG5NF6awI! zCoEWGDe$vmGvgxXmo!FlQ_!kh;JNf~jqkDCN8~Wv$(uaOtGpv$<O5%i`MZX%8O1AQ KuvZOVK`P&j;Vs<& literal 0 HcmV?d00001 diff --git a/modelshell/modelshellv654.ico b/modelshell/modelshellv654.ico new file mode 100644 index 0000000000000000000000000000000000000000..0341321b5d952e1662a3d9444a73cf9f42a7db37 GIT binary patch literal 137040 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 G`+orYGy**U literal 0 HcmV?d00001 diff --git a/modelshell/modelshellv654.lpi b/modelshell/modelshellv654.lpi new file mode 100644 index 0000000..ee44fec --- /dev/null +++ b/modelshell/modelshellv654.lpi @@ -0,0 +1,562 @@ +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <General> + <Flags> + <MainUnitHasUsesSectionForAllUnits Value="False"/> + <MainUnitHasCreateFormStatements Value="False"/> + <MainUnitHasTitleStatement Value="False"/> + </Flags> + <MainUnit Value="0"/> + <Title Value="modelshellv654"/> + <ResourceType Value="res"/> + <UseXPManifest Value="True"/> + <Icon Value="0"/> + </General> + <LazDoc Paths="."/> + <i18n> + <EnableI18N LFM="False"/> + </i18n> + <BuildModes Count="3" Active="Release"> + <Item1 Name="Default" Default="True"/> + <Item2 Name="Debug"> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + </SearchPaths> + <Parsing> + <SyntaxOptions> + <SyntaxMode Value="Delphi"/> + <IncludeAssertionCode Value="True"/> + </SyntaxOptions> + </Parsing> + <CodeGeneration> + <Checks> + <IOChecks Value="True"/> + <RangeChecks Value="True"/> + <OverflowChecks Value="True"/> + <StackChecks Value="True"/> + </Checks> + <VerifyObjMethodCallValidity Value="True"/> + </CodeGeneration> + <Linking> + <Debugging> + <DebugInfoType Value="dsDwarf2Set"/> + <UseHeaptrc Value="True"/> + <TrashVariables Value="True"/> + <UseExternalDbgSyms Value="True"/> + </Debugging> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + <Other> + <Verbosity> + <ShoLineNum Value="True"/> + </Verbosity> + </Other> + </CompilerOptions> + </Item2> + <Item3 Name="Release"> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + </SearchPaths> + <Parsing> + <SyntaxOptions> + <SyntaxMode Value="Delphi"/> + </SyntaxOptions> + </Parsing> + <CodeGeneration> + <SmartLinkUnit Value="True"/> + <Optimizations> + <OptimizationLevel Value="3"/> + </Optimizations> + </CodeGeneration> + <Linking> + <Debugging> + <GenerateDebugInfo Value="False"/> + </Debugging> + <LinkSmart Value="True"/> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + <Other> + <Verbosity> + <ShoLineNum Value="True"/> + </Verbosity> + </Other> + </CompilerOptions> + </Item3> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + <Modes Count="1"> + <Mode0 Name="default"/> + </Modes> + </RunParams> + <RequiredPackages Count="3"> + <Item1> + <PackageName Value="Printer4Lazarus"/> + <MinVersion Minor="5" Valid="True"/> + </Item1> + <Item2> + <PackageName Value="TAChartLazarusPkg"/> + <MinVersion Major="1" Valid="True"/> + </Item2> + <Item3> + <PackageName Value="LCL"/> + </Item3> + </RequiredPackages> + <Units Count="22"> + <Unit0> + <Filename Value="modelshellv654.lpr"/> + <IsPartOfProject Value="True"/> + <EditorIndex Value="3"/> + <CursorPos Y="47"/> + <UsageCount Value="248"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit0> + <Unit1> + <Filename Value="frontend.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FmShellMain"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <TopLine Value="44"/> + <CursorPos X="76" Y="61"/> + <UsageCount Value="248"/> + <Loaded Value="True"/> + <LoadedDesigner Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit1> + <Unit2> + <Filename Value="aboutbox.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FmAbout"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <EditorIndex Value="-1"/> + <UsageCount Value="248"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit2> + <Unit3> + <Filename Value="trouble.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FmTrouble"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="TROUBLE"/> + <EditorIndex Value="-1"/> + <UsageCount Value="248"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit3> + <Unit4> + <Filename Value="data.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="DataForm"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <EditorIndex Value="6"/> + <TopLine Value="62"/> + <CursorPos Y="107"/> + <UsageCount Value="248"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit4> + <Unit5> + <Filename Value="equations.pas"/> + <IsPartOfProject Value="True"/> + <IsVisibleTab Value="True"/> + <EditorIndex Value="10"/> + <TopLine Value="1130"/> + <CursorPos X="17" Y="1166"/> + <UsageCount Value="248"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit5> + <Unit6> + <Filename Value="fileio.pas"/> + <IsPartOfProject Value="True"/> + <EditorIndex Value="4"/> + <TopLine Value="135"/> + <CursorPos Y="162"/> + <UsageCount Value="248"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit6> + <Unit7> + <Filename Value="integrator.pas"/> + <IsPartOfProject Value="True"/> + <EditorIndex Value="7"/> + <TopLine Value="88"/> + <CursorPos X="61" Y="127"/> + <UsageCount Value="248"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit7> + <Unit8> + <Filename Value="note.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FmNote"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <EditorIndex Value="5"/> + <TopLine Value="46"/> + <CursorPos Y="7"/> + <UsageCount Value="248"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit8> + <Unit9> + <Filename Value="Options.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FmOptions"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <EditorIndex Value="-1"/> + <UsageCount Value="248"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit9> + <Unit10> + <Filename Value="ParamList.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FmParamList"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <TopLine Value="21"/> + <CursorPos X="40" Y="38"/> + <UsageCount Value="248"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit10> + <Unit11> + <Filename Value="ProgressBar.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FmProgress"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <EditorIndex Value="2"/> + <CursorPos Y="55"/> + <UsageCount Value="248"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit11> + <Unit12> + <Filename Value="ReloadDlg.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="DlgReload"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <EditorIndex Value="-1"/> + <CursorPos Y="5"/> + <UsageCount Value="248"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit12> + <Unit13> + <Filename Value="ScaleDlg.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="DlgScale"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <EditorIndex Value="-1"/> + <CursorPos Y="8"/> + <UsageCount Value="248"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit13> + <Unit14> + <Filename Value="SeriesForm.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FmSeries"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <EditorIndex Value="-1"/> + <CursorPos X="56" Y="10"/> + <UsageCount Value="248"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit14> + <Unit15> + <Filename Value="stypes.pas"/> + <IsPartOfProject Value="True"/> + <EditorIndex Value="-1"/> + <CursorPos X="38" Y="20"/> + <UsageCount Value="248"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit15> + <Unit16> + <Filename Value="calculate.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FmCalculate"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <EditorIndex Value="9"/> + <TopLine Value="44"/> + <CursorPos X="50" Y="71"/> + <UsageCount Value="248"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit16> + <Unit17> + <Filename Value="display.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FmDisplayOutput"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="Display"/> + <EditorIndex Value="1"/> + <CursorPos X="34" Y="27"/> + <UsageCount Value="270"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit17> + <Unit18> + <Filename Value="parameter.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FmParameter"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <EditorIndex Value="8"/> + <TopLine Value="96"/> + <CursorPos X="29" Y="136"/> + <UsageCount Value="230"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit18> + <Unit19> + <Filename Value="C:\lazarusv164\lcl\grids.pas"/> + <UnitName Value="Grids"/> + <EditorIndex Value="-1"/> + <TopLine Value="10307"/> + <CursorPos Y="10334"/> + <UsageCount Value="81"/> + </Unit19> + <Unit20> + <Filename Value="C:\lazarusv206\lcl\grids.pas"/> + <UnitName Value="Grids"/> + <EditorIndex Value="-1"/> + <TopLine Value="9884"/> + <CursorPos Y="9902"/> + <UsageCount Value="6"/> + </Unit20> + <Unit21> + <Filename Value="C:\Users\bkwia\AppData\Local\Temp\equations.pas"/> + <EditorIndex Value="-1"/> + <UsageCount Value="7"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit21> + </Units> + <JumpHistory Count="30" HistoryIndex="29"> + <Position1> + <Filename Value="equations.pas"/> + <Caret Line="4533" Column="20" TopLine="4507"/> + </Position1> + <Position2> + <Filename Value="equations.pas"/> + <Caret Line="7723" Column="17" TopLine="7696"/> + </Position2> + <Position3> + <Filename Value="equations.pas"/> + <Caret Line="7668" Column="94" TopLine="7647"/> + </Position3> + <Position4> + <Filename Value="equations.pas"/> + <Caret Line="7679" Column="17" TopLine="7652"/> + </Position4> + <Position5> + <Filename Value="equations.pas"/> + <Caret Line="7681" Column="17" TopLine="7654"/> + </Position5> + <Position6> + <Filename Value="equations.pas"/> + <Caret Line="7672" Column="100" TopLine="7663"/> + </Position6> + <Position7> + <Filename Value="equations.pas"/> + <Caret Line="7696" Column="17" TopLine="7669"/> + </Position7> + <Position8> + <Filename Value="equations.pas"/> + <Caret Line="7834" Column="9" TopLine="7787"/> + </Position8> + <Position9> + <Filename Value="equations.pas"/> + <Caret Line="7836" Column="9" TopLine="7789"/> + </Position9> + <Position10> + <Filename Value="equations.pas"/> + <Caret Line="7977" Column="27" TopLine="7930"/> + </Position10> + <Position11> + <Filename Value="equations.pas"/> + <Caret Line="8112" Column="28" TopLine="8065"/> + </Position11> + <Position12> + <Filename Value="equations.pas"/> + <Caret Line="725" Column="64" TopLine="698"/> + </Position12> + <Position13> + <Filename Value="equations.pas"/> + <Caret Line="3297" Column="71" TopLine="3250"/> + </Position13> + <Position14> + <Filename Value="equations.pas"/> + <Caret Line="4349" Column="16" TopLine="4302"/> + </Position14> + <Position15> + <Filename Value="equations.pas"/> + <Caret Line="4531" Column="39" TopLine="4484"/> + </Position15> + <Position16> + <Filename Value="equations.pas"/> + <Caret Line="4975" Column="7" TopLine="4928"/> + </Position16> + <Position17> + <Filename Value="equations.pas"/> + <Caret Line="5232" Column="7" TopLine="5205"/> + </Position17> + <Position18> + <Filename Value="equations.pas"/> + <Caret Line="5497" Column="8" TopLine="5450"/> + </Position18> + <Position19> + <Filename Value="equations.pas"/> + <Caret Line="6481" Column="33" TopLine="6434"/> + </Position19> + <Position20> + <Filename Value="equations.pas"/> + <Caret Line="6665" Column="53" TopLine="6618"/> + </Position20> + <Position21> + <Filename Value="equations.pas"/> + <Caret Line="4619" Column="18" TopLine="4591"/> + </Position21> + <Position22> + <Filename Value="equations.pas"/> + <Caret Line="7759" Column="17" TopLine="7730"/> + </Position22> + <Position23> + <Filename Value="modelshellv654.lpr"/> + <Caret Line="47"/> + </Position23> + <Position24> + <Filename Value="equations.pas"/> + <Caret Line="4619" Column="7" TopLine="4591"/> + </Position24> + <Position25> + <Filename Value="modelshellv654.lpr"/> + <Caret Line="47"/> + </Position25> + <Position26> + <Filename Value="equations.pas"/> + <Caret Line="4619" Column="18" TopLine="4590"/> + </Position26> + <Position27> + <Filename Value="equations.pas"/> + <Caret Line="7766" TopLine="7736"/> + </Position27> + <Position28> + <Filename Value="equations.pas"/> + <Caret Line="4619" Column="18" TopLine="4591"/> + </Position28> + <Position29> + <Filename Value="equations.pas"/> + <Caret Line="7722" Column="17" TopLine="7693"/> + </Position29> + <Position30> + <Filename Value="equations.pas"/> + <Caret Line="4619" Column="18" TopLine="4591"/> + </Position30> + </JumpHistory> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + </SearchPaths> + <Parsing> + <SyntaxOptions> + <SyntaxMode Value="Delphi"/> + </SyntaxOptions> + </Parsing> + <CodeGeneration> + <Checks> + <IOChecks Value="True"/> + <RangeChecks Value="True"/> + </Checks> + </CodeGeneration> + <Linking> + <Debugging> + <DebugInfoType Value="dsDwarf2Set"/> + </Debugging> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + <Other> + <Verbosity> + <ShoLineNum Value="True"/> + </Verbosity> + </Other> + </CompilerOptions> + <Debugging> + <BreakPoints Count="1"> + <Item1> + <Kind Value="bpkSource"/> + <WatchScope Value="wpsLocal"/> + <WatchKind Value="wpkWrite"/> + <Source Value="display.pas"/> + <Line Value="1508"/> + </Item1> + </BreakPoints> + <Watches Count="6"> + <Item1> + <Expression Value="time"/> + </Item1> + <Item2> + <Expression Value="time"/> + </Item2> + <Item3> + <Expression Value="doy"/> + </Item3> + <Item4> + <Expression Value="Cumfbc"/> + </Item4> + <Item5> + <Expression Value="tstat[117].name"/> + </Item5> + <Item6> + <Expression Value="fbc"/> + </Item6> + </Watches> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/modelshell/modelshellv654.lpr b/modelshell/modelshellv654.lpr new file mode 100644 index 0000000..a871d0d --- /dev/null +++ b/modelshell/modelshellv654.lpr @@ -0,0 +1,47 @@ +program modelshellv654; + +{$MODE Delphi} + +uses + Forms, Interfaces, + frontend in 'frontend.pas' {FmShellMain}, + aboutbox in 'aboutbox.pas' {FmAbout}, +// bkPageControl in 'bkPageControl.pas', { TODO 2 -obk : add pagecontrol back in } + trouble in 'trouble.pas' {FmTrouble}, + data in 'data.pas' {DataForm}, + display in 'display.pas' {FmDisplayOutput}, + equations in 'equations.pas', + fileio in 'fileio.pas', + integrator in 'integrator.pas', + note in 'note.pas' {FmNote}, + Options in 'Options.pas' {FmOptions}, + ParamList in 'ParamList.pas' {FmParamList}, + parameter in 'parameter.pas' {FmParameter}, + ProgressBar in 'ProgressBar.pas' {FmProgress}, + ReloadDlg in 'ReloadDlg.pas' {DlgReload}, + ScaleDlg in 'ScaleDlg.pas' {DlgScale}, + SeriesForm in 'SeriesForm.pas' {FmSeries}, + stypes in 'stypes.pas', + calculate in 'calculate.pas' {FmCalculate}; + +{$R *.res} + +begin + Application.Initialize; + Application.Title := 'Modelshell'; + Application.CreateForm(TFmShellMain, FmShellMain); + Application.CreateForm(TFmOptions, FmOptions); + Application.CreateForm(TFmDisplayOutput, FmDisplayOutput); + Application.CreateForm(TDataForm, DataForm); + Application.CreateForm(TFmAbout, FmAbout); + Application.CreateForm(TFmTrouble, FmTrouble); + Application.CreateForm(TFmNote, FmNote); + Application.CreateForm(TFmParamList, FmParamList); + Application.CreateForm(TFmParameter, FmParameter); + Application.CreateForm(TFmProgress, FmProgress); + Application.CreateForm(TDlgReload, DlgReload); + Application.CreateForm(TDlgScale, DlgScale); + Application.CreateForm(TFmSeries, FmSeries); + Application.CreateForm(TFmCalculate, FmCalculate); + Application.Run; +end. diff --git a/modelshell/modelshellv654.res b/modelshell/modelshellv654.res new file mode 100644 index 0000000000000000000000000000000000000000..f6e8499568f21121986c715951291349244aeef3 GIT binary patch literal 139052 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 literal 0 HcmV?d00001 diff --git a/modelshell/note.lfm b/modelshell/note.lfm new file mode 100644 index 0000000..a58de3e --- /dev/null +++ b/modelshell/note.lfm @@ -0,0 +1,74 @@ +object FmNote: TFmNote + Left = 247 + Height = 488 + Top = 117 + Width = 688 + ClientHeight = 488 + ClientWidth = 688 + Color = clBtnFace + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + OnShow = FormShow + Position = poDefault + LCLVersion = '1.6.0.4' + object MoDrivers: TMemo + Left = 0 + Height = 440 + Top = 0 + Width = 688 + Align = alClient + BorderStyle = bsNone + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Courier New' + Lines.Strings = ( + '' + '' + ) + ParentFont = False + ScrollBars = ssBoth + TabOrder = 0 + WordWrap = False + end + object Panel1: TPanel + Left = 0 + Height = 48 + Top = 440 + Width = 688 + Align = alBottom + ClientHeight = 48 + ClientWidth = 688 + TabOrder = 1 + object BtnSaveFile: TButton + Left = 408 + Height = 20 + Top = 8 + Width = 116 + Caption = '&Save File' + ModalResult = 1 + OnClick = BtnSaveFileClick + TabOrder = 0 + end + object BtnClose: TButton + Left = 568 + Height = 20 + Top = 8 + Width = 90 + Cancel = True + Caption = '&Close' + ModalResult = 2 + OnClick = BtnCloseClick + TabOrder = 1 + end + object BtnChooseFile: TButton + Left = 3 + Height = 20 + Top = 11 + Width = 160 + Caption = 'C&hoose Driver File' + OnClick = BtnChooseFileClick + TabOrder = 2 + end + end +end diff --git a/modelshell/note.pas b/modelshell/note.pas new file mode 100644 index 0000000..06e824f --- /dev/null +++ b/modelshell/note.pas @@ -0,0 +1,145 @@ +{ A notepad like editor which is used to view and edit the driver file. The + form consists of a memo component which displays the driver file and buttons + to save changes made to the drivers, choose a different driver file and close + the window. } +unit note; + +{$MODE Delphi} + +interface + +uses + SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ExtCtrls; + +type + + { TFmNote } + + TFmNote = class(TForm) + MoDrivers: TMemo; + Panel1: TPanel; + BtnSaveFile: TButton; + BtnClose: TButton; + BtnChooseFile: TButton; + procedure FormShow(Sender: TObject); + procedure BtnSaveFileClick(Sender: TObject); + procedure BtnChooseFileClick(Sender: TObject); + procedure BtnCloseClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + FmNote: TFmNote; + +implementation + +{$R *.lfm} + +uses frontend, fileio; + +{ Set the form title and read the driver variables from the driver file into the + memo component. } +procedure TFmNote.FormShow(Sender: TObject); +var + tempstring1,tempstring2: string; + ttstring:Tstringlist; + ll: integer; +begin +// Clear the memo component of old data + MoDrivers.Lines.Clear; + +// No driver file selected + if driverfilename = '' then + begin + FmNote.Caption := 'Driver Variables - No driver file selected'; + { Add driver names and units to the memo field even if no driver file was + specified. This allows the creation of new driver files. } + // Time column + tempstring1 := 'Time'; + tempstring2 := ModelDef.timeunit; + // Driver variable columns + for ll := 1 to ModelDef.numdrive do + begin + tempstring1 := tempstring1 + ', ' + drive[ll].name; + tempstring2 := tempstring2 + ', ' + drive[ll].units; + end; + // Copy temporary strings to memo component. + MoDrivers.Lines.Strings[0] := tempstring1; + MoDrivers.Lines.Add(tempstring2); + end + else + begin + Caption := 'Driver Variables - ' + driverfilename; + // If a driverfile was selected, read in the file + ttstring:=Tstringlist.Create; + try try + MoDrivers.Lines.LoadFromFile(driverfilename); + // Check to make sure the drivers read are consistent with the model + ttstring.Delimiter:=','; + ttstring.StrictDelimiter:=true; + ttstring.DelimitedText:=MoDrivers.Lines[0]; + for ll:=1 to ModelDef.numdrive do + begin + tempstring1:=lowercase(trim(ttstring[ll])); + if tempstring1 <> lowercase(drive[ll].name) then + raise Exception.Create('Drivers in the driver file do not match model drivers.'); + end; + finally + if Assigned(ttstring) then FreeAndNil(ttstring); + end; + except + raise; + end; + end; + MoDrivers.Modified := False; +end; + +{ Save changes made to the drivers in the memo component. } +procedure TFmNote.BtnSaveFileClick(Sender: TObject); +begin + FmShellMain.DlgSaveDriver.InitialDir := FmShellMain.CurrentPath; + // Set the default filename in the save dialog box to the current driverfile + if driverfilename <> '' then + FmShellMain.DlgSaveDriver.FileName := driverfilename; +// If the user chooses OK in the save dialog box + if FmShellMain.DlgSaveDriver.execute then + begin + // Save the driver filename from the save dialog + Driverfilename := FmShellMain.DlgSaveDriver.filename; + { Save the file. Note that this function does not use the WriteDriverFile + procedure provided in fileio.pas. This is because it is easier to save the + file from the memo component directly then to parse the lines in the memo + component into individual lines and then save them. } + MoDrivers.Lines.SavetoFile(DriverFileName); + MoDrivers.Modified:=False; +// NewDriverFile := False; + end; + FmNote.Close; +end; + +{ This procedure allows the user to choose a different driverfile without having + to exit the current form. } +procedure TFmNote.BtnChooseFileClick(Sender: TObject); +begin + FmShellMain.ChooseDriver(FmNote); + // Update the notepad form with the new driver variables + formshow(BtnChooseFile); +end; + +procedure TFmNote.BtnCloseClick(Sender: TObject); +begin + if MoDrivers.Modified then + begin + if MessageDlg('The changes you made to the drivers are about to be lost. ' + + 'Do you want to save the driver file before proceeding?' , + mtWarning,[mbyes,mbno],0) = mryes then BtnSaveFileClick(BtnClose); + end; +// FmNote.ModalResult := mrOK; + FmNote.Close; +end; + +end. diff --git a/modelshell/parameter.lfm b/modelshell/parameter.lfm new file mode 100644 index 0000000..2735f38 --- /dev/null +++ b/modelshell/parameter.lfm @@ -0,0 +1,80 @@ +object FmParameter: TFmParameter + Left = 628 + Height = 371 + Top = 211 + Width = 626 + HorzScrollBar.Visible = False + VertScrollBar.Visible = False + ActiveControl = BtnCancel + Caption = 'Model Parameters' + ClientHeight = 371 + ClientWidth = 626 + Constraints.MinHeight = 50 + Constraints.MinWidth = 500 + OnCreate = FormCreate + Position = poMainFormCenter + LCLVersion = '1.0.12.0' + object PnTop: TPanel + Left = 0 + Height = 56 + Top = 0 + Width = 626 + Align = alTop + ClientHeight = 56 + ClientWidth = 626 + TabOrder = 0 + object BtnOK: TButton + Left = 176 + Height = 25 + Top = 16 + Width = 75 + Caption = '&OK' + ModalResult = 1 + OnClick = BtnOKClick + TabOrder = 0 + end + object BtnCancel: TButton + Left = 264 + Height = 25 + Top = 16 + Width = 75 + Caption = '&Cancel' + ModalResult = 2 + OnClick = BtnCancelClick + TabOrder = 1 + end + object BtnProcessVar: TButton + Left = 8 + Height = 25 + Top = 16 + Width = 120 + Caption = '&Show Processes' + Enabled = False + OnClick = BtnProcessVarClick + TabOrder = 2 + end + end + object SgParameter: TStringGrid + Left = 0 + Height = 315 + Top = 56 + Width = 626 + Align = alClient + AutoAdvance = aaDown + AutoFillColumns = True + ColCount = 4 + DefaultColWidth = 150 + DefaultRowHeight = 25 + FixedCols = 0 + Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goDrawFocusSelected] + TabOrder = 1 + OnDrawCell = SgParameterDrawCell + OnSelectCell = SgParameterSelectCell + ColWidths = ( + 155 + 155 + 155 + 157 + ) + end +end diff --git a/modelshell/parameter.pas b/modelshell/parameter.pas new file mode 100644 index 0000000..30c3dce --- /dev/null +++ b/modelshell/parameter.pas @@ -0,0 +1,179 @@ +unit parameter; + +{$mode delphi} + +interface + +uses + Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, + Grids, StdCtrls, stypes; + +type + + { TFmParameter } + + TFmParameter = class(TForm) + BtnOK: TButton; + BtnCancel: TButton; + BtnProcessVar: TButton; + PnTop: TPanel; + SgParameter: TStringGrid; + procedure BtnCancelClick(Sender: TObject); + procedure BtnOKClick(Sender: TObject); + procedure BtnProcessVarClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure SgParameterDrawCell(Sender: TObject; aCol, aRow: Integer; + aRect: TRect; aState: TGridDrawState); + procedure SgParameterSelectCell(Sender: TObject; aCol, aRow: Integer; + var CanSelect: Boolean); + private + { private declarations } + fOrigPar: paramarray; + public + { public declarations } + procedure ShowParameters; + procedure UpdateProcessWindow; + end; + +var + FmParameter: TFmParameter; + +implementation + +uses frontend, data, fileio, equations; +{$R *.lfm} + +{ TFmParameter } + +procedure TFmParameter.FormCreate(Sender: TObject); +var + i:integer; +begin + // Make sure form is visible and fits on the screen + with FmParameter do + begin + if Width>Screen.WorkAreaWidth then Width:=Screen.WorkAreaWidth; + if Height>Screen.WorkAreaHeight then Height:=Screen.WorkAreaHeight; + if Left<Screen.WorkAreaLeft then Left:=Screen.WorkAreaLeft; + if Top<Screen.WorkAreaTop then Top:=Screen.WorkAreaTop; + end; + + //Switch OK and cancel buttons on a Mac +{$ifdef Darwin} + BtnCancel.AnchorSideRight.Control:=PnTop; + BtnCancel.AnchorSideRight.Side:=asrRight; + BtnOK.AnchorSideRight.Control:=BtnCancel; + BtnOK.AnchorSideRight.Side:=asrLeft; +{$endif} + + SgParameter.RowCount:= ModelDef.numparam + 1; + SgParameter.AutoSizeColumns; + SgParameter.cells[0,0]:='Parameter Symbol'; + SgParameter.cells[1,0]:='Parameter Name'; + SgParameter.cells[2,0]:='Parameter Value'; + SgParameter.cells[3,0]:='Parameter Units'; + for i := 1 to ModelDef.numparam do + begin + SgParameter.cells[0,i] := par[i].symbol; + SgParameter.cells[1,i] := par[i].name; + SgParameter.cells[3,i] := par[i].units; + end; + SgParameter.row := 1; + SgParameter.col := 2; +end; + +procedure TFmParameter.SgParameterDrawCell(Sender: TObject; aCol, + aRow: Integer; aRect: TRect; aState: TGridDrawState); +var + S:string; +begin + if aCol <> 2 then SgParameter.Canvas.Brush.Color:= clScrollBar; + SgParameter.Canvas.FillRect(aRect); + S := SgParameter.Cells[aCol, aRow]; + SgParameter.Canvas.TextOut(aRect.Left + 2, aRect.Top + 2, S); +end; + +procedure TFmParameter.SgParameterSelectCell(Sender: TObject; aCol, + aRow: Integer; var CanSelect: Boolean); +begin + if aCol = 2 then + begin + CanSelect := True; + SgParameter.Editor := SgParameter.EditorbyStyle(cbsAuto) + end + else + SgParameter.Editor := SgParameter.EditorbyStyle(cbsNone) +end; + +procedure TFmParameter.BtnOKClick(Sender: TObject); +var + i:integer; +begin + for i:=1 to ModelDef.numparam do par[i].value := strtofloat(SgParameter.Cells[2,i]); + BtnProcessVar.Caption := '&Show Processes'; + if DataForm.visible then DataForm.BtnCancelClick(FmParameter); +end; + +procedure TFmParameter.BtnProcessVarClick(Sender: TObject); +begin + if not DataForm.Visible then + begin + DataForm.ShowProcess; + BtnProcessVar.Caption := '&Update Processes'; + end; + UpdateProcessWindow; +end; + +procedure TFmParameter.BtnCancelClick(Sender: TObject); +begin + par := fOrigPar; + BtnProcessVar.Caption := '&Show Processes'; + if DataForm.visible then DataForm.BtnCancelClick(FmParameter); +end; + +procedure TFmParameter.ShowParameters; +var + i:integer; +begin + if paramfilename = '' then + FmParameter.Caption := 'Edit Parameters - File: None Specified' + else + FmParameter.Caption := 'Edit Parameters - File: ' + paramfilename; + if (paramfilename = '') or (driverfilename = '') then + begin + BtnProcessVar.Enabled:=False; + end + else + begin + BtnProcessVar.Enabled:=True; + end; + fOrigPar := par; + SgParameter.AutoSizeColumns; + SgParameter.Options := [goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine, + goColSizing,goThumbTracking,goEditing]; + for i := 1 to ModelDef.numparam do SgParameter.cells[2,i] := floattostr(par[i].value); +end; + +procedure TFmParameter.UpdateProcessWindow; +var + i:integer; +begin + for i:=1 to ModelDef.numparam do par[i].value := strtofloat(SgParameter.Cells[2,i]); + try + // Open driverfile, read first row of drivers, and then close the driver file. + openDriverFile(driverfilename,fileio.driverlist); + last_time := 0; + next_time := 0; + GetCurrentDrivers(Caltime,drive); + processes(Caltime,caltime,drive,par,stat,proc,false); // Calculate processes + except + on EfileError do + MessageDlg('Error reading driver file. Process values were not calculated.', mtWarning, [mbOK], 0); + on E: Exception do + MessageDlg('Invalid Parameter. Process values were not calculated.', mtWarning, [mbOK], 0); + end; + DataForm.UpdateProcess; +end; + +end. + diff --git a/modelshell/stypes.pas b/modelshell/stypes.pas new file mode 100644 index 0000000..4224fcd --- /dev/null +++ b/modelshell/stypes.pas @@ -0,0 +1,259 @@ +{ This file defines new variable types and sets the limits on the various arrays + used in the model code. All units should include this file. } +unit stypes; + +{$MODE Delphi} + +interface + +uses sysutils, classes; + +const + maxstate = 150; // The maximum number of state variables. The state variable + // array contains maxstate elements. + maxdrive = 75; // The maximum number of driver variables. + maxprocess = maxstate + 350; // The maximum number of process variables. + maxparam = 500; // The maximum number of parameters. + maxresults = 102; + maxtreatments = 8; + stringlength = 25; + maxVarObserved = 100; + maxTimeMeasure = 100; + maxmatrix = 10000; + +type + processtype = (ptGroup1, ptGroup2, ptGroup3, ptGroup4, ptGroup5); +// processcolor = (clGreen, clTeal, clAqua, clBlue, clGray); + TModelDef = record // A structure used to hold the basic information + modelname:string; // about the model. Modelname is the name of + // model and appears on the title bar in the FmShellMain. + versionnumber:string; // Used to keep track of the version number of the model. + contactperson:string; // Used for the aboutbox + contactaddress1:string; // Used for the aboutbox + contactaddress2:string; // Used for the aboutbox + contactaddress3:string; // Used for the aboutbox + timeunit:string; // Timeunit is the time step of the model, ie day, year. + numdrive:integer; // Numparam, numdrive, numstate and numprocess are the + numstate:integer; // total number of parameters, drivers, state variables, + numprocess:integer; // and processes, respectively. + numparam:integer; + end; + + Tparamvariable = record // A structure to hold a parameter; it's name, value, + name:string; // and units. The name and units are for information + value:double; // only. They do not affect the running of the model. + units:string; // This structure type is also used for the + symbol:string; // driver variables. + end; + + Tstatevariable = record // A structure to hold a state variable; the name, + name:string; // value and units. As with Tparamvariable the name + value:double; // and units are for information only. HoldConstant + units:string; // determines if the state variable is held constant + symbol:string; // during the model run, i.e. dstatedt = 0. + HoldConstant:Boolean; + Reset:Boolean; + end; + + Tprocessvariable = record // A structure to hold a process variable; the + name:string; // name, value, and units. As above, the name and + value:double; // units are for information only. Parameters is + units:string; // number of parameters associated with this + symbol:string; // particular process. Every parameter must be + parameters:integer; // associated with a process. Ptype determines the + ptype:processtype; // color of the tab in the edit parameters page. + end; + + Tallstates = record + Cf:Tstatevariable; + Cw:Tstatevariable; + Cr:Tstatevariable; + Nf:Tstatevariable; + Nw:Tstatevariable; + Nr:Tstatevariable; + end; + + TCalSet = record + HaveRunInfo: Boolean; + ValidSet: Boolean; + rownum: integer; + Treatment: integer; + State: string; + StateIndex: integer; + Parameter: string; + ParamIndex: integer; + Alpha: double; + Beta: double; + DeltaPar: double; + end; + +// State variable array types. yValueArray, glindx and glpbynp are used during +// integration. They hold temporary values of the state variables and therefore +// don't need to be of type Tstatevariable. This saves memory. However they +// must be the same size as statearray. + yValueArray=array[1..maxstate] of double; + glindx = ARRAY [1..maxstate] OF integer; + glnpbynp = ARRAY [1..maxstate,1..maxstate] OF double; + statearray=array[1..maxstate] of Tstatevariable; +// Driver variable array type. Note that the type is Tparamvariable. + drivearray=array[1..maxdrive] of Tparamvariable; +// Parameter array type. + paramarray=array[1..maxparam] of Tparamvariable; +// Process variable array type. + processarray=array[1..maxprocess] of Tprocessvariable; + calsetarray = array[1..maxstate] of Tcalset; + stringarray = array[1..maxstate + 1] of string; + +// The types of data which can be displayed in the dataform + TDataType = (dtState, dtProcess, dtParameter); +// The possible axis' in the chart on the display form + TAxis = (axLeft, axBottom); +// The display options for the output data in the display form + TDisplayStyle = (dsChart, dsTable); +// The axis type for the chart on the display form + TAxisType = (tyLinear, tyLog); +// The type of variable being looked for in the arrays + TVarType = (vtDriver, vtState, vtParameter, vtProcess); + + TRunOptions = record + NormalRun: Boolean; + Time_step: double; + DiscreteStep: double; + RepeatDrivers: Boolean; + RepeatDriveTime: double; + ResetStates: Boolean; + ResetStateTime: double; + RuntoSS: Boolean; + SSCriteria: double; + SSTime: double; + HoldStatesConstant: Boolean; // Used in fuzzy calibrator + Outputstep: double; // The timestep specified by the user for output + Outputoffset: double; // No output for time less than outputoffset + OutputEORonly: Boolean; // output only if time = stop_time + Time_step + OutputAnnually: Boolean; + OutputAnnuallyDay: double; + AppendOutputFile: Boolean; + stepcounter: integer; + outcounter: integer; // The current number of timesteps since last output, output occurs when outcounter=outputfreq + OutputFile: Boolean; + WriteEvery: double; + errormult: integer; + end; + + TCalOptions = record + UseSecondOutFile: Boolean; + FinalOutFilename: string; + OrigOutputStep: double; + OrigOutputOffset: double; + OutputEORonly: Boolean; + caloutcounter: integer; + caloutputfreq: integer; + AppendFinalOutputFile: Boolean; + end; + + TTreatResults = record + Time: integer; + IndexList: array[1..Maxstate] of integer; + States: statearray; + end; + + TDerivSet = record + Time1: double; + States1: statearray; + Time2: double; + States2: statearray; + end; + + resultarray = array[1..maxresults] of TTreatResults; + + TTreatSet = record + drivefilename: string; + outputfilename: string; + timestart: double; + timestop: double; + Options: TRunOptions; + CalOptions: TCalOptions; + TotalMeasurements: integer; + measdata: resultarray; + currmeasurement: integer; + simdata: resultarray; + currdrive: drivearray; + currstate: statearray; + derivstates: TDerivSet; + NumCalSet: integer; + CalSetIndexList: array[1..maxstate] of integer; + FirstWrite: Boolean; + end; + + TreatSetarray = array[1..maxtreatments] of TTreatSet; + +// Ensemble Kalman Filter + EnKF2Dmat = array of array of double; + EnKFvec = array of double; + glindxEKF = array of integer; + mat = array[1..MaxMatrix] of double; + + TVariableIncluded = array of Boolean; + + TNameArray = array of string; + TTimeArray = array of double; + TDataArray = array of double; + T2dData = array of array of double; + // Rows are time points, columns are variables + + TPertData = array of double; + TPert = record + NumPert: integer; + Names: TNameArray; + Data: EnKF2Dmat; + end; + + TKstate = record + NumTotKalman: integer; + NumObservations: integer; + Names: TNameArray; + Units: TNameArray; + Symbol: TNameArray; + Time: TTimeArray; + Z: EnKF2dmat; + R: EnKF2dmat; + Xmean: T2dData; + Xmax: T2dData; + Xmin: T2dData; + Q: EnKF2Dmat; + Ymean: T2dData; + UnCorXmean: T2dData; + UncorXmax: T2dData; + UncorXmin: T2dData; + end; + +// Grid Shell Variables + TGridCellInfo = record + Row: integer; + Column: integer; + RunPosition: integer; + VegClass: integer; + SoilClass: integer; + ParamFilname: string; + Driverfilename: string; + OutputFilename: string; + end; + +// Errors + ERunTimeError = class(Exception); + EIntegratorError = class(ERunTimeError); + ETooManySteps = class(EIntegratorError); + EIntStepTooSmall = class(EIntegratorError); + EUserCancel = class(ERunTimeError); + ECalculateError = class(EMathError); + ECalcInitialProc = class(ECalculateError); + ECalcNewValue = class(ECalculateError); + ECalcNewProcess = class(ECalculateError); + EStepError = class(Exception); + EStepTooSmall = class(EStepError); + EStepTooLarge = class(EStepError); + EStepNotMultiple = class(EStepError); +implementation + +end. + diff --git a/modelshell/trouble.lfm b/modelshell/trouble.lfm new file mode 100644 index 0000000..d46080a --- /dev/null +++ b/modelshell/trouble.lfm @@ -0,0 +1,1896 @@ +object FmTrouble: TFmTrouble + Left = 473 + Height = 220 + Top = 125 + Width = 453 + Caption = 'Error' + ClientHeight = 220 + ClientWidth = 453 + Color = clBtnFace + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + FormStyle = fsStayOnTop + OnShow = FormShow + Position = poOwnerFormCenter + LCLVersion = '0.9.30.2' + object Image1: TImage + Left = 5 + Height = 201 + Top = 16 + Width = 212 + OnClick = Image1Click + Picture.Data = { + 07544269746D617036E40000424D36E400000000000036000000280000009700 + 000080000000010018000000000000E400000000000000000000000000000000 + 0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFF00000039295239184A31294A31214A31294A39295229214A31 + 214A31214A31214A31294A31214A39295231294A31214A31294A39295231214A + 31214A29214239315A31294A31294A39295231214A31294A31214A31214A4239 + 5A39315239295239315A4242634A395A42426342315A39315A39315A39315A39 + 315A42426B42426339315A39315A39315A39315A39315A39315A39315A39315A + 39315A39315A1000299C9CBDEFEFFFEFE7FFEFEFFFEFEFFFEFE7FFF7EFFFEFE7 + FFF7EFFFE7DEFF4A4A84635A84847BA5847BA58C84AD8C84ADADA5D6BDB5DEBD + BDE7CEC6EFCEC6EFD6CEF7D6CEF7DED6F7DED6F7D6D6F7DED6F7E7DEFFCEC6EF + BDB5D6ADA5D6A59CC6ADA5D6BDBDDECECEEFC6BDE77B739C7B739C7373A56B6B + 8C7B739439293118100829182929182921101821101821101821101818102110 + 0000080008000000000000000000000000000000211018000000211010080008 + 1000080000000000000800083118210000002110182918291000081000000800 + 0808000821101018102110000808000800000000000021101839293129182929 + 1829291829291829291829211018291829392929291829211018291829291829 + 291829291829291829291829FFFFFF00000031214A31294A39184A3929523121 + 4A39315A31214A31214A31214A31214A29214231214A31294A39315A31214A31 + 294A31214A31294A31294A31214A39315239295239295231214A31315A31214A + 31214A39295242395A39315A39315A39315A42315A29215A39315A4242634231 + 5A39315A39317339315A39315A39315A39315A4A316B39315A4242634A316B39 + 397339295239315A39315A31315A181031BDBDDEF7EFFFEFEFFFEFE7FFEFEFFF + F7EFFFEFEFFFEFEFFFEFEFFFF7EFFF948CB542317B736B8C847BA5847BA58C84 + ADA59CCEB5ADD6BDB5DEBDBDE7C6BDE7CEC6EFCEC6EFD6CEF7DED6F7D6CEF7D6 + D6F7E7DEFFBDBDE7C6BDE7B5ADD6A5A5CEA5A5CEB5ADD6CECEEFA5A5CE6B6B8C + 8C849C7B739C6B637B736B8C4A425A1000002918292918292110182918292110 + 1821101821101021101021101821101821101821101821101821101821101829 + 1829211018211010211008291829291829291829392929291829311821311821 + 3118213929293118213929292118212918292110182918292918292918292118 + 2139293129182929182929182929182929182929182939292929182929182929 + 1829291829291829291829291829291829211018FFFFFF00000031214A31214A + 31294A31214A31214A42395A39295231214A31214A39295231214A31214A3129 + 4A39315A31214A31294A31214A31294A31214A31214A39315239315A31214A31 + 294A39315A39295229294A31294A39315239295231315A39315A31294A31315A + 39315A42315A39315A39315A39315A39315A42315A42426B39315A42315A3931 + 5A39315A39315A42315A31315A39315A42426331294A211031D6D6F7F7EFFFEF + EFFFEFE7FFEFEFFFEFE7FFEFE7FFEFE7FFEFE7FFF7EFFFDED6F739217B5A5284 + 7B739C847BA5847BA5A594C6ADA5D6B5ADD6B5B5DEBDBDE7C6BDE7CEC6EFD6CE + F7D6CEF7CEC6EFD6CEF7E7DEFFBDBDE7C6BDE7BDBDDEADA5CE9C94C6ADA5D6BD + BDE7847B9C7B739C8C84AD7B739C6B6B8C6B6B8C5A4A63180808211018181021 + 2110182110182110182110102110182110182110182110182110102110182110 + 1021101829182921101821101821101029182929182929182939292929182929 + 1829311821291829291829311821311821292939291829291829291829291829 + 2918292110102918293929292110182918292110182918292110102918293118 + 21211821291829291829211018211821291829291829211010211018FFFFFF00 + 000031214231214A31214A31214A31214A39295231294A31294A31214A31294A + 31214A31214A31294A39315A39295239184A31214A31294A31214A31214A3129 + 4A39315231214A39295231294A31214A39295231214A31315A42395A39295231 + 294A39315A42315A39315A42315A3931734A316B42315A39315A39315A39315A + 39315A42315A39315A31315A39315A39315A39315A31294A39315A1808396B63 + 8CF7EFFFEFEFFFE7DEFFEFEFFFEFE7FFF7EFFFEFEFFFEFEFFFF7EFFFEFE7FFFF + FFFF8C8CBD42317B736B8C847BA57B739C948CB5ADA5CEADA5CEB5ADD6BDBDE7 + BDBDE7BDBDE7CEC6EFD6CEF7CEC6EFD6CEF7DED6F7BDB5DEBDBDE7BDBDDEA5A5 + CE9C94C6ADA5D6B5ADD6736B8C847BA58C84AD8C849C736B8C6B637B63527318 + 0810211018392929211821211821211821211018211018211010211018211018 + 2110182110182110182110182110182110182110182110102110182110102918 + 2939292929182929182929182929182929182929182929182939292921101029 + 1829211018291829291829291829291829291829291829291829291829291829 + 2918292918292918292918292110182918292918292110182110182110182918 + 29392929FFFFFF00000031214A31214231214A31214A31214A31214A39315A31 + 214A31214A31294A31214A31214A31214A31294A39315A39315A31294A392952 + 31294A31214A31214A39315A31294A31214A39315A39295229215A31294A3929 + 5239315A39315A39315A39315A39315A42315A39315A39315A39315A39315A31 + 315A39315A31214A39315A39315A4A316B42315A39315A42315A4A425A424263 + 39315A181031CECEEFF7EFFFE7DEFFEFE7FFF7EFFFEFEFFFEFEFFFF7EFFFEFE7 + FFEFEFFFF7EFFFEFEFFFE7DEFF42317B5A528C736B8C736BA5847BA59C94BDA5 + 9CC6A59CCEBDB5DEBDB5DEB5ADD6BDBDE7CEC6EFCEC6EFCEC6EFD6D6F7ADA5D6 + BDB5DEC6BDE7A5A5CE8C8CBDB5B5DE948CB5736B8C8C84AD8C849C847BA56B6B + 8C635A7B6B637B29182918081021182121101821101821101821101821101821 + 1018211018211018211018211018211018211821211821211018211821211018 + 2110102918292110183929292110102918292918293118213118212918293118 + 2129182929182929182929182921101029182921101839292921101029182921 + 1010291829211010291829211018291829291829291829211821211010291829 + 2918294231314A31394A3139FFFFFF00000039295231214231214A3121423121 + 4A29214A31294A31214A31294A39295231294A31214A29214A39295239315231 + 214A39295231294A39295231214A31214A39315239315231214A31294A31294A + 31294A31315A31214A39315A31294A31294A39315A39315A42315A39315A3931 + 5A42315A4A316B42315A39315A424263424A73424A73524A6B4242634A395A42 + 426B524A6B39315A2110315A5273EFEFFFE7DEFFE7DEFFF7EFFFEFEFFFEFEFFF + F7EFFFEFE7FFF7EFFFEFEFFFEFE7FFEFE7FFFFFFFF7B73B531296B736B8C7B73 + 9C847BA58C8CB58C8CB5948CB5ADA5CEBDB5DEB5ADD6BDB5DEBDBDE7C6BDE7CE + C6EFCECEEFADA5D6BDB5DEBDBDDE9C94C67384BDBDBDDE7B73947B739C8C849C + 8C84AD847B9C635A84635A7B736B8C3929311810082118212110182110182110 + 1818081021101018081021101818102121101018102121101021101021101021 + 1018211010211010211018291829291829311821291829291829291829211010 + 2918292110183929292118212918292110102918292918292918292918292918 + 2929182929182929182929182929182929182929182929182918102121101829 + 18293929314231394A31394A31394231394A3139FFFFFF00000031214231294A + 31214231214A31214A31214A29214A31214A31214A31214A31214A31294A3129 + 4A31214A39315A39295231294A31294A31214A31214A31214A31214A42395A31 + 214A39295239295231294A31214A31214A39315A39295239315A39315A39315A + 39315A42426342426342426B42426B424A734A395A39317342426342315A3931 + 5A39315A31315A39315A42426339315A000000ADA5D6EFEFFFE7DEFFEFEFFFEF + E7FFF7EFFFEFE7FFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFF7EFFFF7EFFFDED6F7 + 31296B5A528C5A528C6B639C8C84AD847BA58C84AD8C8CB5949CCEA59CC6ADA5 + CEADA5D6B5ADD6B5ADDEC6BDE7ADA5D6ADA5D6B5ADD68C8CB5A5A5CEA59CC673 + 6B8C847B9C847BA58C849C847BA5635A7B635A7B635A7B42314A180808211018 + 1808102110181808102110181810212110102110101808102110182110102110 + 1821101021101021101821101821101821101829182931182131182129182921 + 1010291829291829291829291829311821211010291829291829211010211821 + 2918292918292918292110182918292918292118212110182110182110182918 + 293929294231394A31394A31394A31394A31394A31394A31394A3139FFFFFF00 + 000031183131214231294A31214229214231214A31214A292142312142292142 + 31214A31214A31214A31294A39315A39295231214A31294A31214A3929523129 + 4A29214A42315A31294A39295231294A39295239315A31214A42426339315242 + 315A4242634A395A4242634A395A42315A42426B39315A39315A39397339315A + 39315A42426B39315A39315A39315A39315A39315A31294A180829D6D6F7E7DE + FFE7DEFFEFE7FFEFEFFFEFEFFFEFEFFFEFE7FFEFEFFFEFE7FFF7EFFFEFEFFFEF + EFFFEFE7FFFFFFFF7B73B531296B4A4A846B639C8C84AD948CB58C8CB59C94BD + 948CB5948CB58C8CBD9C94BD9C94C69C94C6949CCE948CB59C94BD9C94C68C8C + BDB5B5DE7B739C7B7394847B9C847BA5847BA5847B9C6B6B8C5A52736352734A + 425A181008211018211018180810211010180810211010181021211018211010 + 1808102110102110102110182110182110102110102110182110182918293118 + 2121101029182929182921101021101821101031182129182929182921101029 + 1829291829211018291829291829291829291829291829211018211018291829 + 3929314231394A39424A39424A31394A31394A31394A31394231394231394A31 + 394A3139FFFFFF00000021101031182131183131294231294229214A31294A31 + 214A31214231214A29214231214A31294A39295239295242426331294A39184A + 29215A31294A31214A31214A39315A39295231214A31294A31214A39315A3121 + 4A31294A42315A31315A42315A39315A29215A39315A39315A39315A42315A39 + 315A42315A39315A39315A39315A39315A31315A39315A4A316B39315A18104A + 635A7BE7DEFFE7DEFFEFEFFFEFEFFFEFE7FFEFE7FFF7EFFFEFEFFFEFE7FFF7EF + FFEFEFFFEFE7FFF7EFFFEFE7FFFFFFFFD6CEF739217B4A4A847373A5948CB594 + 8CB5948CB58C8CB59C9CBDA59CC69C94BD9C94BD9C94BD9C94BD9C94C6948CB5 + 7384BD6B6BA5949CCEAD9CC6736B8C7B739C847B9C847BA5847BA5847BA56B6B + 8C635A7B6352734A425A18081021101021101018102121101018081021101818 + 0810211010181021211018211018211018211010211018211010211018211018 + 2110102918292918292918292110102918292918292110102918292918292110 + 1029182921101821101829182929182921182121182121101821101821182139 + 29294231394A31394A39424A39424A31394A39424A31394231394231394A3139 + 4A31394A31394A31394A3139FFFFFF0000003118213118212110083118213118 + 2139293129214231214A29214A31214231214A31294A31294A31294A31294A39 + 315A39295229214A31294A31294A31294A31294A31294A39315A31214A39315A + 31214A31315A31214A39315A42395A31214A39315A39315A39315A39315A3931 + 5A39315A42315A39315A39315A42315A4A316B39317339315A39315A39315A39 + 315A42426B1000298C84ADE7DEFFE7DEFFEFEFFFEFE7FFEFEFFFEFEFFFEFE7FF + EFEFFFF7EFFFEFEFFFEFEFFFF7EFFFEFEFFFF7EFFFEFEFFFFFFFFF948CB52929 + 7B734AA58C84AD8C84AD7B73A5847BA58C84AD9C94C6ADA5CEA5A5CE9C94C69C + 94C68C8CBD7384BD847BA56B73BDADA5D6847BA57B73947B739C7B739C847BA5 + 847B9C847B9C7B7394736B8C635A7B4A425A2110101808101808102110101808 + 1021101018081021101818081021101018081018081021101821101821101018 + 0810211018211018211018311821211018211018291829211010211018291829 + 2918292110102110102918292110102918292110182110182110182110183118 + 214231394A39424A39424A31394A31394A31394A31394A39424A31394A31394A + 31394A31394A31394231394A31394A3139423139FFFFFF000000311821311821 + 31182131182121101031182131182139292939293131294231294231294A3121 + 4A31214231214A31294A31294A31214A31294A39295231214A31214A31214A39 + 315A31214A39295231294A31214A31294A31315A42315A39315A31294A39315A + 39315A39315A39315A39315A42426B39317339315A39315A42426339315A3931 + 5A39315A39315A42426342315A1000299C94BDE7DEFFEFEFFFE7DEFFEFEFFFEF + E7FFEFE7FFEFEFFFEFE7FFEFEFFFEFE7FFEFEFFFF7EFFFEFE7FFEFEFFFF7EFFF + F7EFFFEFE7FF394284525A948C84AD7373A5847BA5847BA58C84AD8C84AD948C + B59C94C69C94C69C94C68C8CBD847BA5636BAD9C94C6A59CC67B739C7B739C7B + 739C847B9C847B9C847BA57B739C7B73947B7394736B8C4A425A180810180810 + 2110101810211808102110182110101808102110182110182110102110182110 + 1821101821101821101821101021101821101829182921101021101821101821 + 1018291829211010291829291829291829211018291829211010211018291829 + 3929294A31394A39424A39424A31394A31394A31394A31394A31394A31394A31 + 394A39424A31394A31394A39424A31394A31394A31394A31394A3139FFFFFF00 + 0000211010311821311821311821311821311821311821311821392929311821 + 29182939292931294231214229214231214A29214231214A31214A31294A3129 + 4A31214A31214A39315A39315A31294A31214A39295231294A31214A31315A4A + 395A29215A31315A42315A42315A39315A39315A39315A42315A39315A42315A + 39315A31315A4A316B42315A42395A39317339315A180839A59CC6E7DEFFEFE7 + FFEFEFFFEFE7FFEFEFFFEFE7FFF7EFFFEFEFFFF7EFFFEFEFFFEFE7FFEFEFFFEF + EFFFF7EFFFEFEFFFEFEFFFFFFFFFCEC6EF21297B8C84AD7373A5636BAD7B73A5 + 7B73A58C84AD7B7BAD948CB5948CB58C8CBD847BA55A639C8C8CBDADA5CE8C84 + AD8C849C847B9C7B739C847B9C847B9C7B739C7B73947B73947B73947B73945A + 4A63180808291829211018211010211010211010211018211018211010180810 + 2110182110182110182110182110182110102110182110102918292918292110 + 1029182921101829182921101029182921101821101821101821101818102131 + 18294231314A39424A39424A31394A31394A31394A31394A31394A31394A3139 + 4A31394A31394A31394A31394A31394A31394A31394A31394A31394A31394A31 + 394A3139FFFFFF00000031182131182131182131182131182131182131182131 + 182131182139292931182131182131182139292939292931294231294229214A + 31214A31214A39295231294A31214A31294A39315A31214A31315A29214A3121 + 4A31214A31315A39315A31294A39315A39315A39315A39315A39315A42315A39 + 315A39315A42315A42426342315A42426342426342315A42315A42315A21214A + A5A5CEE7DEFFEFE7FFE7DEFFEFE7FFEFE7FFEFEFFFEFE7FFEFEFFFEFEFFFF7EF + FFEFE7FFF7EFFFEFEFFFEFEFFFF7EFFFEFE7FFF7EFFFFFFFFF949CCE635AA59C + 94BD6B6BA55A6BAD7384BD7B7BAD6B638C7373A58C84AD736BA5525A947B73B5 + ADA5D6948CB58C84AD8C84AD847BA5847B9C847B9C847B9C847B9C7B73947B73 + 947B7394847B9C6B637B21101818081018102118102118081021101818081021 + 1010181021180810211010211010211018211010211018211010211821211018 + 2110182110102918292110102110102918292118212110182918292110182110 + 183118214A31314A39424A39424A31394A31394A39424A31394231394231394A + 31394A31394A31394A31394A31394A31394A39424A31394231394A31394A3139 + 4231394231394A31394A3139FFFFFF0000002918293118213118213118213118 + 2131182131182131182131182131182131182131182131182129182931182131 + 182131182139292929213931294A31294A31214A31214A31214A39315A39315A + 39295239315231294A31294A39295239315A39315A31214A42315A4242634242 + 6B42426B42426B424A734A316B42426339315A42426B4A316B42426B42426B42 + 426B39315A21184AB5ADDEE7DEFFEFEFFFEFE7FFEFEFFFF7EFFFEFEFFFEFEFFF + F7EFFFEFEFFFEFE7FFEFEFFFEFEFFFEFEFFFF7EFFFEFE7FFEFEFFFEFEFFFF7EF + FFF7EFFF9C94C6525A94948CB5847BA56B6BA56B6BA57373A5736B8C6B639C73 + 6BA59C94C6ADA5CE948CB58C849C8C849C8C84AD847BA5847B9C847B9C7B739C + 7B739C7B73947B73947B73947B7394736B8C3929311000002110182110102110 + 1018081018081021101018081021101018081018102118081021101821101021 + 1018211010211018211018291829211010291829291829211010211010211010 + 2110183118214A31394A394252424A4A31394A39424A39424A31394A31394A39 + 424231394A39424A31394A39424A31394A31394A39424A39424A39424A31394A + 39424A31394A31394231394A31394A31394A3139FFFFFF000000311821311821 + 3118213118213118212918293118213118213118213118213118213118213118 + 2139292931182139292931182131182131182131182129294A31294A31294A31 + 294A31294A39315A31294A29215A39295231214A29214A39295242395A31294A + 39315A42426B39315A42315A39315A42315A39315A31315A39315A42315A3931 + 5A39315A42315A39315A31315A211031BDBDE7EFE7FFEFEFFFF7EFFFEFEFFFEF + EFFFF7EFFFF7EFFFEFEFFFEFE7FFEFE7FFEFEFFFEFE7FFEFEFFFEFE7FFEFEFFF + EFEFFFEFEFFFE7DEFFE7DEFFE7DEFF948CB529297B7B73A58C8CB5847BA57B73 + A5635AA57373A5A59CCE9C94BD847B9C7B739C7B739C7B73A5847B9C847BA584 + 7B9C7B7394847B9C7B73947B73947B73947B73947B73947B73944A425A100000 + 2110101808101808102110182110101808102110101808102110102110182110 + 1021101021101821101021101821101821101829182929182929182921100818 + 08102918293929294A313152424A4A39424A31394A39424A39424A31394A3139 + 4A39424A39424A31394A39424A31394A39424A31394A31394A31394A31394A31 + 394A31394A39424A31394A31394A31394A31394A31394A31394A3139FFFFFF00 + 0000311821311821311821291829311821311821311821291829311821311821 + 3118213118213118213118213118213929293118213118213929293929293929 + 2931183931214A39295231214A39315A39315A31214A39315A39315A31214A31 + 294A39315A39295231214A39315A39315A39315A42315A39315A39315A39315A + 39315A42315A39315A42426339315A39315A31214A29214AD6D6F7EFE7FFEFEF + FFEFEFFFF7EFFFEFEFFFEFEFFFEFE7FFF7EFFFEFEFFFEFEFFFEFE7FFEFEFFFEF + E7FFEFE7FFEFEFFFE7DEFFE7DEFFE7DEFFE7DEFFDED6F7CECEEF7373A518215A + 4A4A846B6B9C7373A5847BA5948CB5736B8C635A846B638C6B6B8C7B73947B73 + 947B739C7B73947B739C7B739C7B73947B73947B73947B73947B73947B73947B + 7394635273211821181008211010211010180810180810211010181021211010 + 1808102110102110102110102110102110182110182110182110182110182110 + 102110102918294231314A313952424A4A39424A39424A31394A39424A31394A + 31394A39424A39424A31394A39424A31394A31394A39424A31394A39424A3942 + 4A313952424A4A39424A39424A31394A39424A31394A31394A31394A31394A31 + 394A3139FFFFFF00000021101031182131182131182131182131182131182131 + 1821311821311821311821311821311821311821311821392929392929311821 + 39292931182139292939292939292931294231214A31294A39315A31294A2921 + 4A31315A39295231214A31214A42426331214A39315A39315A39315A39315A39 + 315A39315A39317342315A39315A39317339315A39315A393973180839635A84 + E7DEFFEFE7FFEFEFFFF7EFFFEFEFFFF7EFFFEFEFFFEFEFFFEFE7FFEFEFFFF7EF + FFEFEFFFEFE7FFEFEFFFE7DEFFE7DEFFE7DEFFE7DEFFCECEEFCEC6EFBDBDE78C + 8CB55A527339315221102918082929293942395A4A425A424263424A73524A6B + 5A427B5A52846B638C6B6B8C7B73947B73947B73947B73947B73947B7394736B + 8C7B73947B7394736B8C6B637B39293110000018102118081018081021101018 + 0810211010180810211010180810181021211010211018211010211018211010 + 2110102110103118214A313152424A52424A52424A4A39424A39424A31394A31 + 394A313952424A4A31394A31394A39424A39424A31394A39424A39424A39424A + 39424A31394A31394A31394A39424A31394A39424A31394A39424A39424A3942 + 4A31394A31394A31394A3139FFFFFF0000003118213118213118213118213118 + 2129182931182131182131182131182131182139292929182931182131182131 + 1821392929392929311821392929392929311829392929392929392929311839 + 39184A31294A31294A31294A31294A31315A39295239315A39295231214A3931 + 5A39315A39315A39315A39315A39315A39315A39315A42426342315A39315A39 + 315A1000299C94C6F7EFFFEFEFFFF7EFFFEFE7FFEFEFFFEFE7FFEFEFFFEFE7FF + EFEFFFF7EFFFEFEFFFEFEFFFEFE7FFEFEFFFEFE7FFEFE7FFE7DEFFCEC6EFA5A5 + CE7B7BAD4A4A8429294A29213929213929293939292921103121101818081029 + 182939315A42315A42426B524A6B5A5273635A846B638C736B8C736B8C7B7394 + 7B73947B73947B7394736B8C7B7394736B8C736B8C3931521000002110102110 + 1821101818081021101018081021101021101821101821101021101821101821 + 10101808102110103118214A394252424A52424A52424A52424A4A313952424A + 4A31394A313952424A52424A4A31394A394252424A4A31394A39424A39424A31 + 394A39424A31394A39424A31394A31394A31394A31394A39424A31314A31394A + 39424A31394A39424A31394A31394A31394A3139FFFFFF000000311821311821 + 3118213118213118213118213118213118213118213118213118213118213118 + 2139292931182131182131182131182139292939292931182139292939292939 + 292931182139292939292939293131294231294A29214A31214A31214A31294A + 42315A31294A39315A4A316B31315A31315A39315A42426B39315A39315A3939 + 7342315A39315A39315A29214ACEC6EFEFEFFFEFE7FFEFEFFFEFEFFFEFEFFFEF + EFFFEFE7FFEFE7FFEFEFFFEFEFFFF7EFFFF7EFFFEFE7FFEFEFFFEFEFFFCECEEF + 8C8CBD4A4A8421214A2110312110312918292918292918292110292918292118 + 2129182921102921182129182929213939315A42426B524A6B5A52736B637B6B + 637B736B8C736B8C736B8C736B8C736B8C7B73947B7394736B8C736B8C4A394A + 1000001808101808101808102110182110181810212110101808102110102110 + 1821101818081029182939292952424A52424A52424A52424A52424A4A313952 + 424A4A394252424A4A394252424A4A31394A39424A39424A313952424A4A3139 + 4A31394A31394A39424A39424A39424A39424A31394A39424A31394A39424A31 + 3952424A52424A4A313952424A4A39424A31394A39424A31394A3139FFFFFF00 + 0000311821311821311821311821311821311821311821311821311821311821 + 3118213118213118213118213118213929293118213929293929293118213929 + 2931182939292939292939292939292931182939292939292931182939293139 + 295231294A31294A31294A31294A31294A42426B42315A42426342426B42426B + 4242634242634A316B42426B39315A39315A393973E7DEFFF7EFFFEFE7FFEFEF + FFEFE7FFEFE7FFEFE7FFEFE7FFEFEFFFF7EFFFEFEFFFEFE7FFEFEFFFEFEFFFE7 + DEFF9C94C639397321214A292939291829211010211018291829211010211018 + 1808101810212110102110101808102110102110101810082110103118394239 + 5A42426B5A5273635A7B6B6B8C736B8C736B8C736B8C7B7394736B8C736B8C73 + 6B8C736B8C524A52100000211010211018211010180810180810211010180810 + 21101018080818100829182942313152424A4A394A4A313952424A52424A5242 + 4A4A313952424A4A39424A313952424A4A39424A313952424A4A31394A313952 + 424A4A39424A313952424A52424A4A31394A39424A39424A39424A31394A3139 + 4A31394A313952424A4A394252424A52424A4A39424A31394A39424A31394A31 + 394A3139FFFFFF00000031182131182131182131182139292931182131182131 + 1821311821311821311821392929311821311821311821392929392929311829 + 3118213929293929293929293929293118293929293929293929293118293929 + 2939292939292939292939293139295231315A39295231214A31294A4A316B39 + 315A39315A39315A42426B4A316B42426B39315A42426331294A5A5A8CEFE7FF + EFEFFFEFE7FFEFEFFFEFEFFFEFEFFFEFE7FFEFEFFFEFE7FFEFE7FFEFEFFFEFEF + FFEFEFFFC6BDE74A4A8418215A31294239293121101021101821101821101021 + 1018181021211010211010180810211010211018180810211010180810180810 + 1810081808082118213931524A425A635273635A7B6B637B6B6B8C736B8C736B + 8C7B737B736B8C736B8C736B8C5A4A6310000018081018081021101021101018 + 081018100818100818100829182942313152424A52424A4A39424A39424A3942 + 4A39424A313952424A52424A4A313952424A4A31394A313952424A4A31395242 + 4A52424A4A31394A313952424A4A31394A31394A313952424A4A31394A39424A + 39424A39424A39424A31394A313952424A4A31394A39424A39424A31394A3942 + 4A39424A39424A39424A3942FFFFFF0000003118213118213118213929293118 + 2131182131182131182131182131182131182131182131182139292931182131 + 1821311821392929392929311821392929311829392929392929392929311829 + 3929293929293929313929313929293929314229313929294229313931523931 + 5231294A39315A42426B39315A39315A39315A39315A39315A39315A39315A18 + 104A847BA5F7EFFFEFE7FFEFEFFFEFE7FFE7DEFFEFE7FFEFE7FFEFE7FFEFEFFF + EFEFFFF7EFFFE7DEFF8C8CBD18215A29294A3129422918292918292918292918 + 2918100829182921101818081018081018102121101018081021101021101018 + 081018081021182121182121101818100818102142395A524A6B5A52736B637B + 736B8C736B8C736B8C736B8C736B8C6B637B7B737B6352731808081808102110 + 181808101810081808081808103929294A394252424A4A39424A39424A39424A + 39424A39424A39424A313952424A52424A4A313952424A52424A4A313952424A + 4A313952424A4A313952424A52424A52424A52424A4A394252424A4A31394A39 + 424A39424A39424A39424A39424A31394A39424A39424A394252424A4A31394A + 39424231394A39424A31394A31394A39424A3139FFFFFF000000311821311821 + 3118213118213118213118213118213118213118213118213118213118213118 + 2131182139292931182131182939292931182139292939292931182939292939 + 2929392929311829392929392931392929392929392929392929392929422931 + 39292942293142313139315239295239315A39317342315A39315A39315A3931 + 5A39315A31315A18104AA59CC6FFFFFFEFEFFFEFE7FFE7DEFFEFEFFFE7DEFFEF + EFFFEFE7FFEFEFFFF7EFFFD6D6F75A528C18295A31315A311831211018211821 + 2918292918292918292118212118212110182118212918292110101808102110 + 1021101021101818102121101821101018081018081021101818100821101042 + 314A524A6B6352736B637B6B6B8C736B8C736B8C736B8C736B8C736B8C5A5273 + 1000002110081808101808101808082918294A39424A39424A39424A31394A39 + 424A39424A39424A39424A39424A394252424A52424A52424A52424A52424A4A + 313952424A4A313952424A4A313152424A52424A4A313952424A4A31394A3139 + 52424A4A31394A31394A39424A39424A39424A31394A31394A39424A31394A39 + 424A39424A39424A39424A31394A39424A313952424A4A31394A3139FFFFFF00 + 0000311821311821311821311821311821311821311821311821311821311821 + 2918293118213929293929293118293929293929293118213929293118213929 + 2939292939292939292939292939292939292939292939292939292942293142 + 293142293139293142293142313139293142313142313139293139315239315A + 39315A39315A39315A39315A39295218104AB5B5DEF7EFFFE7DEFFEFEFFFE7DE + FFE7DEFFEFEFFFEFEFFFEFEFFFF7EFFFC6BDE731316B31315A31315A39292921 + 1821392931392929211018291829211018392929291829211821211018180810 + 2110182110101808102918292118212110182110182110182110101808102110 + 10180810181008100000393152635A7B635A7B6B637B6B637B736B8C736B8C73 + 6B8C736B8C635A631000002110081808101808082918294A39424A39424A3942 + 4A39424A39424A39424A39424A39424A39424A39424A39424A394252424A5242 + 4A4A313952424A4A313952424A52424A52424A52424A52424A4A313952424A4A + 394252424A52424A4A39424A394252424A4A39424A31394A39424A39424A3942 + 4A31394A31394A31394A31394A31394A39424A31394A39424A31394A39424A31 + 394A3139FFFFFF00000021100831182131182131182131182131182131182131 + 1821311821311821311821311821311821311821311821392929392929392929 + 3929293929293118213929293118213929293929293118293929293929293929 + 3139293139292939292942293139293142293142293142293142293142293142 + 313142293142313939397342426B39315A39315A39315A21184AC6BDE7F7EFFF + E7DEFFEFEFFFE7DEFFE7DEFFE7DEFFEFE7FFFFFFFFB5B5DE08105231315A3931 + 5221101029182929182929182921182139292931294221101829293939292929 + 1829211018180810291829211018211821211018180810180810211010180810 + 21101018081018102121101018081021101010000042314A635A7B6B637B6B6B + 8C6B637B6B637B736B8C736B8C63527318080818081010000829182952424A4A + 39424A39424A31394A39424A39424A39424A39424A39424A39424A39424A3139 + 4A313952424A52424A52424A52424A52424A52424A4A313952424A52424A5242 + 4A52424A4A39424A39424A394252424A4A31394A39424A394252424A4A39424A + 39424A31394A39424A31394A39424A39424A39424A31394A39424A31394A3942 + 4A39424A313952424A4A3139FFFFFF0000003118213118213118213118213118 + 2131182131182131182131182131182139292931182131182139292939292931 + 1821392929392929392929392929392929392929392929392929392929392929 + 3929293929293929293929293929313929314229314231314229314229314231 + 3142313942313942293142313139292942313939315A39315A39315A31294A21 + 184ACEC6EFEFEFFFE7DEFFE7DEFFE7DEFFE7DEFFEFEFFFFFFFFFB5B5DE21185A + 3939734242632929392918293129423929292118212918292918294231394231 + 3929213929182929182929182929182921101829213929182921101821101821 + 1018180810211018180810211010180810180810211018180810181008180808 + 4A425A635A7B635A7B6B637B736B8C6B637B736B8C5A52731000001000003929 + 3152424A4A39424A39424A31394A39424A39424A31394A31394A39424A39424A + 39424A39424A394252424A52424A52424A5A4A4A4A31394A313952424A52424A + 52424A52424A4A313952424A4A31394A31394A31394A39424A394252424A4A31 + 394A39424A394252424A4A39424A31394A31394A31394A31394A39424A39424A + 39424A39424A31394A31394A39424A31394A3942FFFFFF000000291829311821 + 3118213118213118213118213118213118213118213118213118213929293118 + 2139292931182139292939292939292931182939292939292939292939292939 + 2929392929422931392929392929392929392931422931392929423131392929 + 4229314231314231394231394231314231393929314231314231314231393929 + 5231315A31294A21184ACEC6EFEFEFFFE7DEFFE7DEFFE7DEFFE7DEFFFFFFFFA5 + A5CE08105A39397B424A73292139291829311821211010211821211010211018 + 3929313931523129422918293931522918292921394231392918292929392110 + 1821101821101818102121101821101821101018102118081018081018081021 + 1010181021180808180810524A6B635A7B6B637B6B637B736B8C736B8C5A525A + 0000002918295A4A4A4A39424A31394A39424A394252424A4A313952424A5242 + 4A52424A4A31394A39424A394252424A52424A4A313952424A4A31395A424A52 + 424A52424A52424A52424A52424A52424A52424A4A313952424A52424A52424A + 4A313952424A4A394252424A4A313952424A4A39424A31394A39424A39425242 + 4A4A31394A39424A31394A31394A39424A39424A39424A31394A3942FFFFFF00 + 0000311821311821311821311821311821311821311821311821392929392929 + 3118213118213929293118213929293118213929293929293929293929293929 + 2939292942293139292931182939292939293139292939292939293139292942 + 2931422931422931392931422931392931423131422931423139423139392931 + 4231394231314A313139295231294A21184ACEC6EFEFEFFFE7DEFFE7DEFFE7DE + FFFFFFFFC6BDE718215A42317B424A8442426329182921101029182921182139 + 292929182929182929293942395A31294231315A31294A392931292939312942 + 2118214231392918292110182118213929292110181810212110182110101808 + 10181008211018180810181008181008100000211821635273635A7B635A7B6B + 637B736B8C4A425A18100852424A4A39424A39424A39424A39424A39424A3942 + 52424A4A39424A39424A39424A394252424A4A39424A313952424A52424A5242 + 4A52424A52424A52424A4A39424A313952424A52424A52424A4A313952424A4A + 39424A39424A313952424A4A394252424A4A394252424A4A31394A394252424A + 4A31394A39424A313952424A4A394252424A4A39424A39424A31394A31394A39 + 424A3139FFFFFF00000031182131182131182131182131182139292931182131 + 1821311821392929311821311821392929392929392929392929311829392929 + 3929293929293118293929293118293929293929293929313929293929293929 + 2939293139292939293139293142293142313142313142293142313942313142 + 29314231394231394231313929314231394231314A3139181031BDBDE7EFE7FF + E7DEFFE7DEFFFFFFFFDED6F721296B39397B424A8442426B3929312110081808 + 1021101821101821101829182921102939293131294239315242426331294221 + 1821211018211018181021211018211010181021211018211018211018181021 + 1810212110101810211808102110101808102110101810212110100800084231 + 4A6B637B635A7B6B636B736B8C4A425A4A313152424A4A39424A39424A39424A + 39424A39424A39424A31394A39424A39424A39424A39424A39424A394252424A + 4A39424A313952424A5A424A52424A52424A52424A52424A4A39424A31395242 + 4A4A394252424A52424A4A313952424A4A313952424A4A313952424A52424A52 + 424A4A313952424A52424A4A31394A39424A31394A39424A39424A31394A3942 + 4A39424A39424A31394A3942FFFFFF0000003118213118213118213118213118 + 2131182131182139292939292931182139292939292931182131182131182139 + 2929392929311821392929311829392929392929392929392929392929392929 + 3929293929313929293929314229314229314229313929314229313929314231 + 314231394231394231394229314231394231394231394231314231394A313121 + 1018BDB5DEEFE7FFE7DEFFEFEFFFEFE7FF39397B31396B4A4A84424A7331316B + 3118292918292918292110182110181808082110292918292110182918293931 + 5239315229182921101818081021101021101018080818081018081021100818 + 0810211018211010211018180810211010211018180810180810180810181008 + 2110181810081808105A52736B637B6352736B637B5A525A4A31394A394A4A39 + 424A39424A39424A39424A39424A39424A394252424A4A39424A39424A39424A + 39424A39424A394252424A52424A52424A52424A52424A4A313952424A52424A + 52424A52424A52424A4A313952424A4A31394A39424A394252424A4A39425242 + 4A52424A4A394252424A52424A4A39424A394252424A4A313952424A4A31394A + 39424A39424A31394A39424A31394A39424A3139FFFFFF000000311821311821 + 3929293118213118213118213929293929293118213118213929293118213929 + 2939292939292939292931182139292939292939292939292939292939292939 + 2929392929392931422931392929392931422931392929392931392931422931 + 4231314231314229314231394229314231314231394231394229314231394231 + 39423139423139211008B5ADCEEFE7FFE7DEFFF7EFFF5A5A8C31316B4A4A8439 + 397B39317339315A312942211010211821211018211821211018211018392931 + 29213931214231315A2110292118211808101808081808081808082110102110 + 1018080818080818081021101018081018081018081021101018081018100821 + 10181810081808101808102110101000003929316B637B5A5273635273524A52 + 4A31394A39424A31394A39424A39424A39424A39424A394252424A4A39425242 + 4A4A31394A39424A39424A394252424A4A313952424A52424A4A394252424A52 + 424A52424A4A313952424A4A313952424A4A313952424A52424A4A313952424A + 52424A4A313952424A4A313952424A4A313952424A4A313952424A4A31394A39 + 424A39424A39424A39424A31394A39424A31394A39424A31394A3139FFFFFF00 + 0000311821392929392929311821392929311821311821311821392929392929 + 3118213929293118213929293118293929293929293118213929293929293929 + 2931182939292939292939292939292942293139292942293139293139292942 + 2931422931392929392931423131423139423131423139423139392931422931 + 4231394231394229314231394A31312108089C9CBDEFE7FFF7EFFF7373A51829 + 5A4A4A8439397339315A31396B39315A29182921101821101821101821101821 + 101029182931294A39295239315A31294A211018210808211010181021180810 + 2110102118211808081808081808081810081808101808101810211808101808 + 101810081808102110101808102110182110101808102110100800084A425A6B + 637B5A52734A394A4A313952424A4A39424A39424A39424A39424A39424A3942 + 4A39424A39424A394252424A4A39424A39424A39424A394252424A52424A5242 + 4A52424A4A313952424A4A313952424A52424A52424A52424A52424A52424A4A + 394252424A4A394252424A4A394252424A52424A4A394252424A52424A4A3942 + 4A313952424A4A39424A39424A39424A39424A39424A39424A39424A31395242 + 4A4A3942FFFFFF00000031182139292939292931182131182131182139292931 + 1821311821392929392929311821392929311821392929392929392929392929 + 3118293929293929293929293929293929293929294229313929293929294229 + 3139293139293139292942313142313142293142313942293142313942293142 + 31394231394231314231314231314231394231314A3139211008847BA5F7EFFF + BDBDDE0810524A4A8439397331315A39397339397331396B3929312118212110 + 1821101829182929182929213929214A31315A31315A29214A29295A31317B29 + 297B31398C39217B31317B39217B29215A29215A292139211021181008181008 + 2110102110101808101808102110101810212110101808102110101808102110 + 10181008180810635A7B6352734A394A4A39424A39424A39424A39424A39424A + 39424A31394A39424A39424A394252424A4A39424A39424A39424A39424A3942 + 4A313952424A4A394252424A52424A52424A52424A5A424A52424A52424A4A31 + 3952424A4A313952424A4A313952424A4A313952424A4A313952424A4A39424A + 313952424A52424A4A31394A39424A39424A39424A39424A394252424A4A3942 + 4A39424A39424A31394A3139FFFFFF0000003118213118213118213118213118 + 2131182139292931182139292931182139292939292931182939292931182939 + 2929311829392929392929392929392929392929392929392929422931392929 + 4229314229313929314229313929294229313929314229314231314231314231 + 3942293142313942313142313942293139293142313142313942313942313131 + 18216B636BEFEFFF4A4A8431396B4A4A8439397339397331396B39397B42426B + 39315A31294229182921101029182931294231294231294A31315A31316B4A5A + 9C5A5AB55A5AB55A5AB55A5AB54A5AA55263AD4A5A9C42529C39217B39217B29 + 294A211031211018180810180810211018181021211010180810180810180810 + 18081021101018081018081010000042314A6B637B4A394A4A39424A39424A39 + 424A39424A39424A39424A394252424A4A31394A39424A39424A394252424A4A + 39424A394252424A52424A52424A52424A4A39425A424A4A313952424A52424A + 52424A52424A52424A52424A52424A4A394252424A4A313952424A4A31395242 + 4A4A394252424A52424A4A31394A39424A394252424A4A39424A39424A39424A + 39424A31394A31394A39424A31394A313952424AFFFFFF000000311821311821 + 3929293118213929293118213929293929293118213929293929293118213929 + 2931182139292931182939292939292939292939292939292939292939293142 + 2931392929422931392929422931392929392929392931422931422931423131 + 4231394229314231314231394229314231394231314231394231394231314231 + 394231314231393929295A5273C6BDE721296B42427B39397331396B39428C39 + 397B39397B39397331315A31294221101821101829182939292929214231315A + 4A4A846373B57373C67373C68494D6949CCE848CCE848CCE7373C66B63B57373 + C65A63A539398C39217B31214A29213921101821101021101018081021101818 + 08102110102110102110101810212110101808101808102110185A52734A3942 + 4A39424A39424A39424A39424A39424A39424A39424A394252424A4A39424A39 + 424A39424A39424A394252424A4A313952424A52424A52424A52424A52424A52 + 424A52424A52424A52424A4A313952424A52424A52424A4A313952424A52424A + 4A313952424A4A313952424A4A39424A39424A313952424A4A31394A31394A39 + 424A31394A31394A39424A394252424A52424A4A313952424A4A3139FFFFFF00 + 0000392929311821311821311821392929311821392929311821392929392929 + 3929293929293929293929293929293929293929293929293929293929313929 + 3139292939292942293142293142293142293139293142293142293142293139 + 2929423131423131423131422931423131423139423139392931423139423131 + 4229314231394231394231394231393929314A39425A639C31396B42426B3139 + 6B39428C424A8C424A84424A84424A8442427B39315218081018081021101821 + 101831294A424A8C6B6BA5848CCE94A5DE9C94C69CADE78C9CDE7373C65A5AB5 + 5A639C39398C5A639C6B63B55263A539398C31296B29214A2921392118211810 + 2118081018081021101018102118081018081021101018102121101818081018 + 100842314A52424A4A39424A39424A39424A39424A394252424A4A394252424A + 4A39424A313952424A52424A52424A4A39424A394252424A4A313952424A5A42 + 4A4A313952424A52424A4A313952424A52424A52424A4A313952424A4A313952 + 424A4A39424A394252424A4A394252424A4A39424A313952424A52424A4A3139 + 52424A52424A4A313952424A52424A4A39424A31394A39424A313952424A4A31 + 394A3139FFFFFF00000031182131182139292931182131182139292939292939 + 2929392929392929311821392929311829392929392929311829392929392929 + 3929293929293929293929294229313929293929293929314229313929293929 + 3139293142293142293139293139293142313142313139293142313142313942 + 31394229314231394231394229314231394231314231314A313942313931396B + 39397331396B39397B39428C424A84424A8439397B5263A5424A8C2929392108 + 0818081021101029182910002131214A42426B635AA5635AA54A5AA539217B21 + 186B4A4A844A316B18083921103129213918083929215A31315A29215A292142 + 2110212118212118212110101808101808102110101808102110102110182110 + 1021101021101010000839293152424A4A313952424A4A394252424A4A39424A + 313952424A4A394252424A4A39424A39424A39424A39424A39424A313952424A + 52424A52424A52424A52424A52424A4A394252424A52424A4A313952424A5242 + 4A4A313952424A52424A52424A4A394252424A4A313952424A52424A52424A4A + 31394A394252424A4A313952424A52424A4A39424A31394A394252424A4A3942 + 4A394252424A4A39424A3942FFFFFF0000003118213929293118213929293929 + 2939292939292939292942293142293139292939292939292939292939292939 + 2929392929392929392929392929392929392929392929392929422931392929 + 3929294231314229313929293929293929314231314229314231314229314231 + 314231394231394231314231394231314231394231394A313142313942313942 + 313142314A42427B393973393973424A8C42529C424A843942844A52944A5294 + 3939733929311810211810211808081810216352736B636B312142524A6B524A + 6B5A5273635A7B6B637B9C9CA58C849C42426B311839635A63524A5221102129 + 1829180810000000180810181021100008100000180810211010180810180810 + 18102121101818081018102121101018100829182952424A52424A4A39424A39 + 424A394252424A52424A52424A4A313952424A52424A4A39424A39424A394252 + 424A4A39424A39424A39424A394252424A52424A52424A52424A4A39425A424A + 52424A4A394252424A52424A4A313952424A4A39424A313952424A52424A4A39 + 4252424A4A313952424A52424A4A31394A313952424A4A394252424A52424A4A + 39424A39424A394252424A4A31394A31394A3139FFFFFF000000311821311821 + 3118213929293929293118213929293929293929293929293929293929293929 + 2931182139292939292931182939292939292939293139292939292939292942 + 2931392929422931422931392929422931392931422931423131422931423131 + 4231314231314231394231394231314231394231394231314231394231314231 + 3942313942313942313142314A424A7331396B424A8442529C424A8C39428C39 + 42844A52944A5294424A733931522918294231394A39426B637B949494C6CED6 + 948CAD524A6B8C849CA594AD948CAD948CADADADB57B739C5A528442315A5A4A + 637B73732108213929318C848C736B7310000821101842313929182918080818 + 10211810081808102110182118212110182110102118211808102110184A3942 + 52424A4A394252424A4A39424A39424A39424A39424A39424A39424A39424A39 + 4252424A4A39424A39424A394252424A52424A52424A52424A52424A52424A4A + 394252424A4A39424A39424A394252424A4A313952424A4A39424A394252424A + 52424A4A313952424A4A394252424A52424A4A39424A394252424A52424A4A39 + 4252424A4A39424A39424A39424A39424A31394A394252424A52424AFFFFFF00 + 0000392929392929392929311821392929392929311821311821392929311821 + 3929293118293929293929293929293929293929293929293929293929293929 + 2942293139292939292942293139292942293139292939292942313142313139 + 29314231314231314231394A31394231314231394A3139423139422931423139 + 42313942313942313142313942313942313139315239397B39397B424A8C4A52 + 9439428439397B424A8442529C4A5294424A8439315A3129423129427B737B7B + 7394736B8CBDADC6A594ADA594AD8C849C524A6B6B637B8C84ADA594ADA594AD + CECED6736B8C5A4A63AD9CC65A525A100008635273A594AD6B636B4A3942635A + 6339292918080818100821101021101021101821182121101821101818081018 + 08101808084231394A394252424A4A39424A39424A39424A39424A39424A3942 + 52424A4A39424A394252424A4A394252424A4A31394A394252424A52424A5242 + 4A52424A52424A52424A5A424A52424A5A424A52424A52424A52424A4A313952 + 424A52424A52424A4A394252424A4A39424A394252424A4A39424A313952424A + 4A31394A31394A39424A39424A31394A31394A394252424A52424A52424A4A39 + 424A3942FFFFFF00000031182131182139292939292931182139292939292939 + 2929392929392929392929392929392929392929392929392929392929392929 + 3929293929293929293929294229314229313929294229314229314229313929 + 313929294231314229314231314231394231394A313942313942313142313942 + 313942313942293142313942313942313942313142313942313939315A39397B + 424A84424A8C4A5294424A84394284424A8C4A52944A529439428442426B3931 + 5A292142524A52847B846B637B847B9CA594ADBDADC67B7394A594AD8C848C8C + 849C9C9CA5BDADC6BDB5DEBDB5BD8C848C8C849CADADAD5A4A52635A6352424A + 635A635A4A523929291810212110182110182110182110182110182118212110 + 1821101821101821101810000839292952424A4A39424A39424A39424A39424A + 39424A39424A394252424A4A39424A39424A39424A394252424A52424A4A3942 + 52424A5A424A52424A52424A52424A5A424A4A39424A394252424A4A31395242 + 4A52424A52424A4A394252424A4A394252424A4A394252424A4A313952424A52 + 424A52424A52424A52424A4A394252424A4A394252424A4A394252424A4A3139 + 52424A52424A4A313952424AFFFFFF0000003118213929293118213118213929 + 2931182139292931182139292931182139292931182139292939292942293139 + 2929392929392929392931392929392929392931392929392931422931392929 + 3929314231314229314231313929314231314231314231394A31394231394231 + 3142313942313142313942313142313942313942313142313942313942313942 + 313939397339397B424A844A5294424A8C424A8C424A84424A8C4A52944A5294 + 4A5A9C4A4A84424A7331315A5A52737B73949494948C848CA594AD9C9CA5C6C6 + CEC6CED6B5ADCE9C9C9C6B636B7B737B9C9CA5BDB5BD6B636B847B848C848C63 + 5A63524A526B636B5A525A6B636B311829211008211018211018211010211018 + 21101821182121182118102121101818102118081029182952424A52424A4A39 + 424A394252424A4A394252424A52424A4A31394A394252424A4A313952424A4A + 39424A394252424A4A39425A424A52424A5A424A52424A4A394252424A52424A + 52424A52424A4A394252424A4A394252424A4A394252424A52424A4A31394A39 + 4252424A4A31394A39424A39424A39424A31394A39424A313952424A4A31394A + 39424A313952424A52424A4A313952424A52424AFFFFFF000000311821392929 + 3118213929293118213929293929293118213929293929293929294229313929 + 2939292939292939292939292939292939292939293142293139292939293142 + 2931392929422931422931422931392931392929423131423131422931423131 + 4231394229314231394231394231394231394231394231394231314231394231 + 314231394A313142313939397B39397B424A8C4A5294424A8C424A843942844A + 5294424A8C42529C4A5A9C5A6BAD5263A539397B635A7B847B9C8C849C948CAD + 948CAD736B8C8484847B7394949494736B8C4231394A394A6B637B736B732918 + 293118293929315A4A523929293929313929314A394A39293118102121101821 + 1018211018211821211821211821211018211018181021211018211018180810 + 4A394252424A4A394252424A4A39424A394252424A4A313952424A52424A4A39 + 4252424A4A39424A39424A394252424A52424A52424A52424A5A424A52424A52 + 424A52424A52424A52424A4A394252424A4A31395A424A52424A52424A4A3942 + 4A39424A394252424A4A313952424A52424A52424A4A31394A394252424A5242 + 4A4A39424A394252424A52424A52424A4A394252424A52424A4A3139FFFFFF00 + 0000392929311821392929311821392929311821392929392929392929392929 + 3929293929293929294229313929293929294229313929293929293929294229 + 3139292942293139292942293139293142293139292942313142313139293142 + 3131423131422931423139423139423131423139423139423139423131423139 + 42313942313942313942313942313139315239397B424A84424A8C4A52944A52 + 94424A8C424A8C4A52944A52944A4A844A52945A6BAD6B7BBD6B6BA57384BD8C + 8CB57B7BAD7B7BAD7373A54A4A8442426B39397342529C29295A100008211031 + 31315A1810212118212921392110182110182918291810211808102110292921 + 3921182121182129213929213929182921182129182921182121101821182121 + 101821101818081042313952424A4A394252424A52424A52424A4A394252424A + 4A394252424A4A394252424A4A394252424A52424A4A394252424A52424A5242 + 4A52424A5A424A52424A52424A52424A5A424A52424A52424A52424A52424A52 + 424A4A394252424A52424A52424A4A313952424A52424A4A313952424A52424A + 4A31394A394252424A4A313952424A4A394252424A4A394252424A4A31395242 + 4A4A3139FFFFFF00000039292931182139292939292931182139292939292931 + 1821392929422931422931392929392929392929392929392929392929392929 + 3929294229313929293929313929294229313929313929293929313929313929 + 293929314229314229314229314231314231314A313942313942313142313942 + 313942313942313942313942313942313942313142313142395A394284424A8C + 4A4A844A52944A5294424A8C4A52945A639C4A5A9C4A52944A5A9C525A945A6B + AD7B8CCE7B8CCE8494D68494CE8494CE7B8CCE5A63A54A52944A4A8442427B39 + 3973393973424A844A529429214239315229293929182931182929213929214A + 29214A31294A29294A29214A29294A29294A29214A2921392110292110292118 + 212110182110182110182110181808083929295A4A4A4A39424A39424A394252 + 424A4A39424A394252424A4A394252424A4A39424A39424A394252424A4A3942 + 4A394252424A5A424A5A424A52424A52424A52424A52424A4A394252424A4A39 + 4252424A4A39424A394252424A52424A52424A52424A52424A4A394252424A52 + 424A4A313952424A52424A4A313952424A52424A4A394252424A52424A4A3139 + 52424A52424A4A39424A3942FFFFFF0000003118213929293118213118213118 + 2139292931182139292939292939292939292939292939292939292939293139 + 2929392931392929392929392931392929392929422931392929392929422931 + 3929293929314231314231313929294231314231394229314231314231314231 + 394A31394A31394231394231314A31394231394A31394231394231394A313139 + 397342427B424A844A4A844A52944A52944A5294525A945263A5525A945263A5 + 525A944A5A9C5263A55A6BB57384BD7B8CCE8494D67B94D68C9CDE848CCE6B7B + BD6B73BD5A639C4A4A844A5A9C42529C4A5A9C39397339315239292929214231 + 294231294A29294A31315A29295A31296B31315A39317329295A31214A292142 + 29182921102921102921182121101821101821101818081029182952424A5242 + 4A4A39424A394252424A52424A52424A4A394252424A4A394252424A4A39424A + 394252424A52424A52424A52424A52424A52424A52424A52424A52424A52424A + 52424A4A39425A424A52424A5A424A52424A52424A52424A52424A52424A4A39 + 4252424A52424A52424A52424A52424A4A313952424A52424A4A313952424A52 + 424A4A313952424A4A313952424A4A31394A3942FFFFFF000000392929392929 + 3929293929293929293929293929293929293118213929293929293929293929 + 2931182139292939292939292939292939292939292939292942293142293139 + 2929422931392931422931423131422931392931423131422931423131423131 + 4229314231394231394A31394A31394231394231394231394231394A31314A31 + 314A313142313942427B3942844A4A844A52944A52944A5A9C5263A55263A563 + 6BAD5A63A55263A55263A55A63A55A6BAD5263AD6B73BD7B8CCE7B8CCE8494D6 + 7B8CCE6B73BD5A6BB56B73BD738CCE6B73BD42529C29295A29214A31214A2929 + 3929214239315231294A21103129294A31296B31296B31315A31296B31316B31 + 315A31315A29214A292139211031291829211821211018211018181021180810 + 29182952424A4A394252424A4A39424A39424A394252424A4A394252424A4A39 + 4252424A4A394252424A4A39424A313952424A52424A52424A52424A52424A52 + 424A52424A52424A52424A52424A52424A4A39424A39424A394252424A4A3942 + 52424A4A394252424A4A39424A394252424A4A313952424A52424A4A39424A39 + 4252424A52424A4A394252424A52424A52424A52424A52424A52424AFFFFFF00 + 0000311821392929311821392929311821392929311821392929392929392929 + 3929293929293929293929293929293118293929293929293929293929293929 + 3139292939293142293139293142313142313942313139292942293142313942 + 31314231394229314231394231394A3139423139423139423139423139423131 + 42313139295229215A3929314A313939397B42427B4A52944A52944A52945263 + A55263A55A6BB56373B55263A55263AD5A6BAD5A6BAD5263AD5263AD5A6BB573 + 84C67B8CCE848CCE5263A531398C4A5AA56B84C65A73BD42529C31296B211029 + 21080810000021102129182929182929214229182921102129214229295A3131 + 5A31315A31296B31396B31296B31294A29214229182929293921102921101818 + 10212110182110181808104A394A52424A4A394A4A394252424A4A394252424A + 4A394252424A4A394252424A52424A4A394252424A52424A52424A5A4A4A5A42 + 4A52424A5A424A52424A52424A52424A5A424A5A424A52424A52424A52424A52 + 424A4A394252424A4A39424A394252424A52424A52424A52424A52424A4A3942 + 4A313952424A52424A4A39424A39425A424A4A394252424A52424A4A31395242 + 4A4A3139FFFFFF00000039292931182139292939292939292931182139292939 + 2929311821392929392929392929392929392929392929392929392929392929 + 3929293929293929294229313929293929294231314231313929294231314231 + 314231313929314231314231314231314231314A31394231394A31394A313942 + 31394231314229314A4A845273BD4A63A531398C39397339397B424A84424A8C + 4A52945263A55A6BAD5A6BAD6373B56B7BBD6373B56373B56373BD5A6BB55A6B + AD5263AD526BB56B84C67B8CCE6373B531317B424A84424A8431315A31315A39 + 428C424A8431296B31296B29214A18080818080821182129214231315A211031 + 29182929214A31296B31396B39428431316B29295A31294A31294A2921422110 + 292110292118212118212110181810211808104A394252424A4A394252424A4A + 394252424A4A394252424A52424A4A394252424A4A394252424A4A394252424A + 4A39425A424A52424A52424A52424A52424A52424A52424A52424A52424A5242 + 4A5A424A4A394252424A52424A4A394252424A4A39424A39424A394252424A5A + 424A4A313952424A4A39424A394252424A52424A52424A52424A52424A52424A + 4A313952424A52424A4A3942FFFFFF0000003929293929293929293118213929 + 2939292939292931182139292939292931182139292942293139292939293139 + 2929392929392929392929392931392931392931422931422931422931423131 + 4229313929313929313929314231314229314231394231394229314A31394231 + 394A31394231394231393929314231395A73BD637BBD6B84C65273BD39398C39 + 39733942844A52944A52945A63A5636BAD7384BD6B7BBD7384BD6B7BBD6B7BBD + 6B7BBD7384BD6B73BD5A6BB5526BB56373B57384C65263AD21186B1000000800 + 0829214239428C4A5AA542529C394294424A8C39428431296B21102118080821 + 100829213929214A29182929214A31316B31396B39397B31315A31315A31296B + 29295A2921422921392110292118212110182110181810212110182110182118 + 2139293142314A4A394A52424A52424A4A394252424A4A394252424A4A394A52 + 424A52424A52424A52424A52424A52424A5A424A5A424A52424A52424A52424A + 52424A52424A5A424A52424A52424A52424A4A39424A394252424A52424A5242 + 4A52424A52424A4A313952424A52424A4A313952424A5A424A52424A52424A4A + 394252424A4A313952424A52424A4A31394A3139FFFFFF000000311821311821 + 3929293929293929293929293118213929293929293118213929293929294229 + 3139292939292939292939292939292939292939292939292939292942293139 + 2929423131423131422931392929422931423131422931423131423131423139 + 4231314231394A31394231394231394231394229314A425A6B84C67384C6637B + BD637BBD424A8C31396B4A52945263A55A63A55A63A56B7BBD7384BD7B8CCE7B + 8CCE7384C68494CE848CCE7384BD6B73BD6373B55A6BB55A6BB56B7BBD7384C6 + 4A5AA542427B7384BD8CA5E77B8CD66B84C64252A5394294424A8C3942943942 + 8C31315A29214A18081018080821103129213929295A39397339397B39397339 + 397331316B31315A31315A29214A292139211029211029211018181021211018 + 2110181810212110212110183129424A394252424A52424A52424A4A39425242 + 4A4A394252424A4A394252424A4A394252424A5A424A52424A52424A52424A52 + 424A52424A52424A52424A52424A4A394252424A4A39424A394252424A4A3942 + 52424A4A39424A394252424A4A394252424A4A394252424A4A394252424A5242 + 4A52424A52424A52424A52424A52424A52424A4A313952424A52424AFFFFFF00 + 0000311821392929311821392929311821392929392929311821392929392929 + 3929293929293118293929293929293929293929293929293929293929294229 + 3139293139292942313139293142293139293142313142313139293142313142 + 31314231314231394231394231394A31394A31394A3139423139422931524A6B + 7384C66B7BBD637BBD6B7BBD5A528C3939734A52945A63A5636BAD7384BD7384 + BD7B8CCE7B8CCE8494CE8C9CDE8C9CDE8494CE7B8CCE7384BD7384BD6B73BD5A + 6BB55A6BB58C9CDE9CADE79CADEF9CADEF9CADE79CADE794A5DE6B73BD4A5AA5 + 4A5AA55263A542529C31296B31296B39397329214A29214A2921423939733942 + 8439428439397B31396B39397331296B31315A31315A29214A29213921182121 + 182121101821101821101821182121102921102121102952424A52424A4A3942 + 52424A4A394252424A52424A4A394252424A4A394252424A52424A52424A5A42 + 4A52424A52424A52424A52424A52424A52424A52424A5A424A4A394252424A52 + 424A4A394252424A4A394252424A52424A4A394252424A52424A52424A4A3942 + 52424A4A394252424A52424A4A313952424A52424A4A313952424A52424A5242 + 4A4A3942FFFFFF00000039292939292939292939292939292931182139292939 + 2929392929311821392929392929392929392929392931392929392929392931 + 3929293929313929293929293929314229314229313929314231313929314231 + 314231313929314231394231394231314231314231314A31394231394A313942 + 31393929296B6B9C848CCE848CCE7384C67384BD42427B424A845263A55A63A5 + 636BAD6B7BBD7B8CCE7B8CCE8494CE8494CE8494CE8494D6949CCE8C9CDE7B8C + CE6B7BBD5A6BB55263AD4A5AA56373BD9CADE794A5DE849CDE7B8CCE8C9CDEAD + B5E794A5DE7384C67384BD7384BD4A5AA531296B3931735263A54A5AA531316B + 31296B394284424A8439397B39397339397331316B31296B29215A31315A2929 + 4A2921392110292110182110212110182110182110182110182118211810214A + 394252424A4A394252424A52424A4A394252424A4A39424A313952424A4A3942 + 52424A52424A52424A52424A52424A52424A4A394252424A5A424A52424A4A39 + 425A424A4A394252424A4A39424A394252424A4A394252424A4A394252424A4A + 394252424A52424A4A394252424A4A394252424A52424A4A39424A394252424A + 4A313952424A4A313952424AFFFFFF0000003118213929293929293118213929 + 2939292939292939292939292939292939292931182939292939292939292939 + 2929311829392929392929392929392931422931392929392929392929423131 + 4231314229313929313929314231314231314231394229314231394A31394231 + 394231394A31394231394231315A6BB56B7BBD8494CE6B84C65A6BAD39397B4A + 52945A6BAD636BAD7384BD7B8CCE8494CE8494D67B94D68C9CDE8CADE794A5DE + 849CDE7B8CCE6B7BBD6B7BBD637BBD5A6BB54A63A542529C5263AD7B8CD66B84 + C66B84C67B8CD6849CDE94A5DE848CCE7B8CCE6B73BD39428C29214A39428C5A + 6BB55263AD39397B31396B31316B31397B39397B39428C394284394284424A84 + 31316B31316B31294A2921422918292110292118212110182110182110182118 + 2121182121101842313952424A52424A4A39424A394252424A4A394252424A52 + 424A52424A52424A52424A5A424A52424A52424A52424A52424A52424A52424A + 5A424A52424A5A424A4A394252424A4A394252424A52424A4A394252424A4A39 + 4252424A4A394252424A4A394252424A4A313952424A52424A4A394252424A5A + 4A4A4A39424A394252424A52424A52424A4A3942FFFFFF000000392929392929 + 3118213929293929293929293929293929293929293118213929293929293929 + 2939292939293139292939292939292939293139293142293139292942293139 + 2931422931423131392929423131423131423131422931423131423139423131 + 4231314231394A31394A31394231394231314A394A6373B56373B56B7BBD4252 + A55263A5424A845263A55A6BB56373B57B8CCE7B8CCE7B8CCE8494D68CADE77B + 94D6636BAD5263A55A639C6B6BA56B7BBD6B7BBD6B6B9C6B6B8C525A9442529C + 3142945A6BAD8CA5E7849CDE738CCE849CDE8C9CDE7B8CCE6B84C65263AD3131 + 6B29214231317B39428C31315A29214A39317329295A31396B31315A39315A39 + 315A31315A31315A31396B21296B29295A29294A292139211031211821211021 + 211018211018211018211029211029291829524A524A394A52424A52424A5242 + 4A4A39424A394A52424A4A39424A394252424A5A424A5A424A52424A52424A52 + 424A52424A52424A4A39425A424A4A39425A424A4A394252424A4A39424A3942 + 4A394252424A4A394252424A4A394252424A52424A4A394252424A4A39425242 + 4A52424A4A313952424A52424A4A394252424A4A31394A39424A3942FFFFFF00 + 0000311821392929392929392929311821392929392929392929392929392929 + 3929293929293929293929293929293929293929293929293929293929294231 + 3139293139292939293142293139293142293139293139293142313142313942 + 31394231314A31394231394A31394231394A31394A31394231314A425A6B84C6 + 5A5AB531398C5A6BAD636BAD424A845263AD637BBD6B7BBD7B8CCE8494CE8494 + CE9CADEF5A639C524A6B6B7BBD8494D694A5DE8CADE78C9CDE8494D68C9CDE84 + 94CE949CCE948CAD4A4A8418217B637BBD8CA5E77B8CD6849CDE94A5DE8494D6 + 5A73BD39429429215A29214A31315A29215A29214A29294A21214A42395A524A + 6B4A4A845A52734A5294635A7B525A945A5273635A6339315218104A21214A29 + 18292118212118212110181810212110182110292110292110214A39425A424A + 4A39424A394252424A4A39424A394252424A52424A52424A52424A52424A5242 + 4A5A424A5A424A52424A52424A52424A52424A52424A52424A52424A52424A52 + 424A52424A52424A52424A4A394252424A52424A52424A52424A4A394252424A + 52424A4A39424A39424A394252424A4A394252424A4A31394A394252424A5A42 + 4A4A3942FFFFFF00000039292931182139292939292939292931182139292942 + 2931311821392929392929392929392929392929392929392929392929392929 + 3929293929313929294229314229313929294229313929294231314231314229 + 314229314231314231394231394231314231314231394A31394231394A313942 + 31314A425A6B84C639429421186B5A6BB55263A542529C636BAD6B7BBD738CCE + 8494CE8CADE78CADE7525A94424A738CADE7849CDE637BBD5A6BB55A6BB56B7B + BD6B84C67B94D67B94D67B8CCE8494D6BDBDDE5A527318217B849CDE849CDE8C + A5E794A5DE849CDE5A73BD39398C31296B31214A31296B31214A211031311831 + 524A6B42529C424A8C39428C39428C424A8439428C424A8C39428442427B6B6B + 8C736B7318103121214A21182129182921182121101818102121101821182118 + 102139293152424A52424A52424A4A394252424A52424A4A39424A39425A424A + 5A424A52424A5A424A52424A52424A5A4A4A52424A52424A52424A5A424A5A42 + 4A52424A52424A52424A4A39424A394252424A52424A4A39424A39424A394252 + 424A52424A4A394252424A52424A52424A52424A4A313952424A52424A52424A + 4A31394A39424A39424A3942FFFFFF0000003118213929293929293118213929 + 2939292939292931182139292939292939292939292939292939292939292939 + 2929392931392929392931392929392931392931392929423131423131422931 + 4229313929294231314231313929314231314A31394231314231314A31394A31 + 394231394A3139423131524A6B6B84C631398C29297B4A52944A52944A52945A + 6BB5637BBD7384C68494D68CADE7636BAD39315A7B94D66B84C64A63A54A63A5 + 4A5A9C39429431398C39398C5263A5738CCE7B94D67384C68494D6BDBDDE3131 + 5A5263AD8CA5E78CA5E78CA5E77B8CD65273BD39428429215A29215A31315A31 + 315A31315A424A7339428431397B39428439428439397B39317331396B31316B + 31315A21296B21185A6B638C847B841000212921392110292118212110182110 + 1818102121182121102131183152424A4A39424A39424A394252424A4A394252 + 424A52424A4A39424A39425A424A5A424A52424A52424A5A424A52424A52424A + 52424A52424A52424A52424A5A424A52424A52424A52424A4A394252424A5242 + 4A52424A52424A52424A52424A5A424A52424A4A394252424A52424A52424A52 + 424A4A313952424A4A394252424A4A31394A3942FFFFFF000000392929392929 + 3118213929293929293929293118213929293929293929293118213929293929 + 2939292939292939293139292939293139292942293139292939292942313142 + 31313929294231313929314231313929314231314231314231394231314A3139 + 4231394231394231394A31394A39424231314A425A6373BD39429421186B2929 + 7B424A8C5263A56B7BBD6B7BBD7384C68494D67B94D639315A7384C66B84C65A + 6BB55263A5424A8C39397B39397B39397B39397B21296B424A8C6B84C68494D6 + 738CCE849CDE9C9CBD18217B849CDE8CA5E794A5DE7B94D65A73BD3942942921 + 5A31315A29295A31214A39397B39397B39397B39397B31396B31296B29295A31 + 315A31294A29294A31294A29294A29294A081052635A846B636B100021211031 + 2118212110182118212118212118212110292118214A394252424A52424A5242 + 4A52424A4A394252424A4A394252424A52424A52424A52424A5A424A5A424A52 + 424A52424A5A424A5A4A5252424A5A424A52424A52424A5A424A52424A52424A + 4A394252424A4A394252424A52424A52424A52424A52424A52424A52424A5242 + 4A4A394252424A4A313952424A4A39424A394252424A52424A4A3942FFFFFF00 + 0000311821392929392929392929311821392929392929392929392929392929 + 3929293929293929293929313929293929293929313929293929293929294229 + 3142293139292942293139293142293142313942313142313139293142293142 + 31394231394231314A31394231394231394A31394A313942313142426B5A73BD + 39429429297B31296B42529C5263A57384BD7384C67B8CCE7B8CCE637BBD4A4A + 84738CCE5A6BB54A5294424A8C31397B31317B31316B31296B39317339317329 + 215A31317B6373BD738CCE6B84C6949CCE31315A5A73BD9CADEF9CADEF7B94D6 + 5273BD39429429214A31296B29214A29293939397339397B39397B31315A3129 + 6B31315A29214A29213921102929213921103129293929213929293921103173 + 73A52921392110292118212118212110182110182110292921391808294A3942 + 5A424A4A39424A39424A394252424A4A394252424A4A39425A424A5A424A5242 + 4A5A424A5A424A5A424A52424A5A424A5A4A525A4A5252424A52424A52424A52 + 424A52424A52424A4A394252424A52424A52424A5A4A4A5A424A52424A52424A + 4A39425A424A4A394252424A4A394252424A52424A4A313952424A4A31394A31 + 394A3942FFFFFF00000039292931182139292939292939292931182139292942 + 2931392929392929392929392929392929392929422931392929392929392929 + 4229313929313929293929314229313929314229314231314231314229314231 + 394231314231314231314231394231394231394A31394A31394A39424231394A + 313142427B5273BD526BB531429429297B4A52945A6BAD637BBD738CCE6B7BBD + 8CADE75A5A8C525A947384C64A529431317B31316B31296B31316B31296B2929 + 5A29215A39315A31315A29215A31296B5A63A56B84C68494CE39315A21297B9C + ADEF9CADEF849CDE5A73BD39398C31294A29294A21102931294231396B39397B + 39397331316B31315A29215A29214A2921422921392918292110182110182118 + 21291829180829524A6B39315221103121102921101821101821101821102929 + 18291810213929315A424A52424A52424A4A394252424A52424A4A394252424A + 52424A52424A5A424A52424A524A525A424A52424A52424A5A424A5A424A5A42 + 4A52424A52424A52424A4A394252424A52424A4A39424A394252424A5A424A4A + 394252424A4A39425A424A4A394252424A4A394252424A4A394252424A4A3942 + 52424A52424A52424A4A3139FFFFFF0000003929293929293929293118214229 + 3139292939292931182139292939292939292939292939292942293139293139 + 2929392929392929392929422931422931392929392931422931392929423131 + 3929314231314231314231313929314231394231394231314231394231394A39 + 424A39424A3139423131424A734A5AA56B84C66B84C64A5AA54A52945263A56B + 84C66B84C642427B7384BD5A639C4A4A845A6BB531396B39397B5263A57384BD + 7B7BAD5A639C525A9439317329215A29215A31315A29295A39397B6373B57384 + C6424A8431315A5263A58CADE77B94D65273BD31317B21103121102129182929 + 214239397342427B39397331296B31315A29295A31315A292142211031292139 + 291829211821211821211821211031393152524A6B3129422110102118212110 + 1821101821102921182121102129182952424A52424A4A394252424A4A394A52 + 424A52424A52424A4A39425A424A5A424A52424A5A424A524A525A424A52424A + 52424A52424A52424A52424A52424A5A424A52424A52424A52424A52424A5242 + 4A52424A4A39425A424A52424A4A394252424A52424A52424A52424A52424A4A + 394252424A4A39424A313952424A4A313952424AFFFFFF000000311821392929 + 3929293929293929293929293929293929293929294229313929293929294229 + 3142293139292942293142293139292939293139292939293139292942293139 + 2929422931423131422931423131392929423131422931423139423131423139 + 4A31394A31394A31394A39424A3942423131424A733142946B84C66B84C64A52 + 944A52945A6BAD5A73BD39315A31316B4A5AA5526BB5424A73424A8439397B63 + 73B5949CCE8C84AD31294221102942395A5A639C42427B29295A31315A31316B + 31316B5263AD6B6B9C4A5A9C7B94D629294A7B73B56B7BBD31396B1808102110 + 0829214A31315A21103142427B42427B42427B39397B31296B21185A31315A39 + 397339315A29214A29182921182121182121182121182139315242426B292142 + 21101821101821101821182121102921101821101821102952424A4A39425242 + 4A52424A4A394252424A4A394252424A52424A52424A52424A52424A5A424A52 + 424A52424A5A424A52424A52424A5A424A52424A5A424A52424A52424A4A3942 + 4A394252424A52424A4A39425A424A52424A4A39425A424A52424A4A39424A39 + 4252424A4A313952424A4A39424A394252424A52424A52424A4A3942FFFFFF00 + 0000392929392929392929392929392929392929392929392929392929392929 + 3929293929293929293929294229313929293929313929293929293929313929 + 2942313139293142313139293142313142313142313942293142313142313942 + 31314231394231394A31394231394A39424A31394231394A313939315A21185A + 21296B42529C4A4A845A639C5263AD39315A21296B42529C5263AD5A73BD4A4A + 8439315229294A5A639C8C8CBD423139000000180810100000393152525A9431 + 315A21103139295229214A6B7BBD31294A6B7BBD7B94D68494D6A5B5EF9CADE7 + 5A639C29214A31214A31315A29295A4231394A4A84525A945A5A8C5A528C424A + 846B6BA56B6B8C39315239315239315A31294A21102921101021101821101842 + 4A73292139291829211821211018211018211821211018181021211021211029 + 52424A52424A4A394252424A52424A52424A52424A4A394252424A52424A5A42 + 4A52424A52424A52424A52424A52424A52424A52424A5A424A52424A52424A52 + 424A52424A52424A52424A4A394252424A52424A4A394252424A4A394252424A + 4A394252424A52424A52424A52424A4A394252424A52424A4A313952424A4A31 + 394A3942FFFFFF00000031182139292939292939292939292931182139292939 + 2929392929392929392929392929311829392929392929422931392931392929 + 3929313929294229313929313929294229314231313929294229314231314231 + 314231314231394231394231314231314231394A31394A31394A31394A31394A + 39424A5294424A8439397B39315A42426B5263A521184A42426B526BB55273BD + 526BB54A63A542529C4A425A31294218081042314A3118213929311808081000 + 0018081021103121101821102129214A39397B3931525A52848C9CDE738CCE8C + 9CDE8CADE77B94D65A73BD31316B29214A31294A31316B42426B42314A31296B + 4A4A847B7BAD8494CE8C84AD29182910000818080831183142395A3129421808 + 1018080831294A31397B21102929182921182131183118081021102121101821 + 102118102129182952424A52424A4A39424A39424A39424A394252424A52424A + 52424A5A424A5A424A5A424A52424A5A424A5A424A52424A52424A52424A5242 + 4A52424A5A424A52424A52424A52424A52424A52424A4A394252424A52424A4A + 394252424A4A394252424A4A394252424A4A394252424A4A39424A394252424A + 52424A4A313952424A52424AFFFFFF0000003929293929293929293929293929 + 2939292939292939292939292939292939292939292939292939292939293139 + 2929422931392931422931392929422931392929423131423131423131422931 + 4231314231314229314231394231314231314231394A31394231314A31394231 + 394A31394A31394A39424A5A9C5263AD42426B211010291829292142424A8463 + 7BBD5A6BB5526BB54A63A54252A54A5AA54A63A56B638C42395A181021211031 + 31183118102129182929214231294A31315A31315A31315A29182929295A5A6B + B56B7BBD6B84C6738CCE94A5DE738CCE4A5AA521184A29182929214A39397342 + 427B5A52844A425A2918292921396B6B8C5A525A100000211010181008180810 + 2929392118211810212118212929392110292918292110312118212110182110 + 182110182118212110181808104A31395A424A4A394252424A52424A52424A52 + 424A52424A4A394252424A52424A52424A52424A5A424A52424A52424A52424A + 5A424A52424A52424A52424A4A394252424A52424A52424A52424A4A39425242 + 4A52424A4A39425A424A52424A52424A4A394252424A4A394252424A4A39424A + 394252424A4A39424A394252424A52424A4A3139FFFFFF000000311821392929 + 3929293929293929293929293929293118213929293929293929293118294229 + 3139292939292939292942293139292939292942293139293142313142313142 + 2931392929423131422931392931423131423131423131422931423139423131 + 4A31394231394231394231394A31394A31314A394A39315A2110212110101000 + 003939735263AD5263AD5263AD5263AD4A63A53142943942845A6BB56B7BBD73 + 73A55A5284424A7331294239317331183931294A292139211031211029211031 + 31296B39398C3942945263AD5273BD7B94D67B94D66B84C642529C2110312918 + 2929293931294A393173424A735A528C5A5A8C31315A21214A39315231294221 + 1821180810211021180810181008211018211018211010211821292139211821 + 21182118102121101821101818081021101818081052424A52424A4A39425242 + 4A52424A52424A4A39424A394252424A5A424A5A424A5A424A52424A52424A52 + 424A52424A52424A52424A52424A52424A52424A52424A52424A4A394A52424A + 52424A52424A4A39424A39425A424A4A39424A39425A424A4A394252424A4A39 + 4252424A52424A4A31394A39424A394252424A52424A4A313952424AFFFFFF00 + 0000392929392929392929422931311821392929392929392929392929392929 + 3929293929294229313929313929294229313929293929313929294229313929 + 2942313139293142313142293142313142313142293142313142293142313142 + 31314231394231394231314231394A31394A31394231394A3942392929211010 + 2110101810212110214A5294525A945263AD526BB5526BB54252A542529C3139 + 8C4A5A9C7384BD7384BD7384BD6B7BBD6B6BA55A639C42427B31315A31296B39 + 397B39428439428431317B394284424A8C394294526BB57B94D67B8CCE6373B5 + 42529C29214A21182121102921103129214A31296B424A734A4A84525A944A5A + A54A63A54A63A54A63A539428431315A21182121102921182121182121182121 + 182121182121182121182121101818081021101021101018081018102152424A + 52424A52424A5A424A4A394252424A52424A5A424A4A394252424A5A424A5A42 + 4A5A424A52424A52424A5A424A52424A52424A52424A52424A52424A52424A52 + 424A52424A52424A52424A52424A52424A52424A52424A52424A52424A4A3942 + 52424A52424A52424A5A424A4A394252424A4A39424A39424A313952424A5242 + 4A4A3139FFFFFF00000031182139292931182139292939292939292931182139 + 2929392929392929392929392929392929392929392929422931392929392929 + 3929313929293929314229313929294229314231314229314231314231314231 + 314231394231314231394231314A31394A31394231394231394A31394231394A + 3942392929180810211018210808312942424A8C4A52945A6BAD526BB55273BD + 526BB5526BB54252A531429439428C7384BD8494CE7B8CCE7384BD6B7BBD5A6B + B54A5AA54A5AA54A5A9C42529C39428439428439428C31397B314294526BB56B + 84C65A73BD5263A542529C31296B21102921182129182929213929295A393173 + 42427B4A4A844A4A844A4A845A528442427B39315A31315A29294A3129422118 + 2121182121101829213921102921102921101821102121101018100818081010 + 00083929315A424A52424A52424A52424A52424A52424A4A394252424A52424A + 52424A52424A52424A5A424A52424A52424A52424A5A4A5252424A52424A5242 + 4A52424A52424A52424A4A394A52424A52424A5A424A4A394252424A4A394252 + 424A52424A52424A4A313952424A4A394252424A4A394252424A52424A4A3942 + 52424A4A31395A424A4A3942FFFFFF0000003929293929293929293929293929 + 2939292939292939292939292939292942293139292939292939292942293139 + 2929422931392931392929422931392929392929422931423131422931423131 + 4231313929314231314231314231394231394231394231314231394A31394A31 + 394A31394A39424A3139291829180810211018211008312942424A8C42529C4A + 5AA54A63A5526BB55273BD5273BD526BB54A63A539429429297B424A8C6B6BA5 + 6B84C6637BBD6373B55A6BAD4A5AA542529C31317B39398C39428C3942843942 + 8442529C526BB5526BB54A63A542529C39428C31396B29214A21102921102921 + 102929214229295A393173393973424A844A52944A52944A4A8442427B31316B + 31294A2110312921392110182110292918292918292118212118212110182110 + 101808101808082918295A424A52424A52424A52424A52424A52424A52424A52 + 424A52424A52424A5A424A5A424A52424A5A424A52424A5A424A52424A52424A + 52424A5A424A52424A52424A52424A52424A5A424A52424A52424A4A394A5242 + 4A52424A52424A52424A5A424A52424A52424A52424A52424A4A394252424A4A + 394252424A4A394252424A4A31394A31394A3942FFFFFF000000392929392929 + 3929293118213929293118213929293929293929294229314229313929293929 + 2942293142293139292939293139292942313139293142313142293142313142 + 3131423131422931423131422931392931423139423139392931423131423139 + 4A31394A31394A31394A39424A39423118291808082110182110181808083129 + 4A424A844A52945263A55263A54A5A9C4A63A55A73BD637BBD5A73BD526BB54A + 63A531397B21186B31317B424A8C4A5AA54252A542529C39428439397B31397B + 31398C39428C42529C4A5A9C4A63A54A5AA542529C42529C39429431398C3131 + 5A29213921082121102929293929213929294A31316B39397B424A8C4A4A8442 + 4A8C42427B39397331315A292142211029211029291829211029291829211821 + 2110182110182110102110102110081808104A39425A424A52424A52424A5242 + 4A52424A52424A52424A52424A52424A52424A52424A5A424A5A424A5A424A52 + 424A52424A52424A5A424A52424A52424A5A424A5A424A52424A52424A52424A + 52424A52424A52424A52424A52424A52424A52424A5A424A52424A52424A5242 + 4A4A39424A394252424A4A394252424A4A31395A424A52424A52424AFFFFFF00 + 0000392929392929392929392929392929392929422931392929392929422931 + 3929293929293929293929293929294229314229313929313929294231313929 + 3139292942313139293139293142313142313142313142313142313942313142 + 31394231394231314231394A31394A31394A3139423131180810211018211018 + 21101018080831294A42427B424A8C525A945263AD4A5A9C4A63A5637BBD6B84 + C66B84C66B84C65A73BD5263AD39429431296B31296B31317B31397B31397B31 + 317B31397B39428439428C42529C39428C42529C4A5AA542529C4252A5424A8C + 39428C39428C31397B31296B29213921102921102921102929213929214A2929 + 5A31316B39397339397339317329295A29214221103129213929213929213929 + 213929182921101821102121101818081018080818081018080831182952424A + 52424A52424A52424A52424A52424A52424A52424A52424A52424A5A4A525242 + 4A5A424A52424A52424A52424A5A424A52424A52424A5A424A5A424A4A394252 + 424A52424A4A394252424A5A424A4A394252424A52424A5A424A52424A52424A + 5A424A4A313952424A52424A52424A52424A4A394252424A52424A4A39424A39 + 424A3942FFFFFF00000039292939292939292942293139292939292939292939 + 2929392929392929392929392929392929392931392931392931392929422931 + 3929313929294229313929313929294231314231313929314229314231314231 + 314231394231394231314231394231394A313142313952424A4A394231182921 + 101021101018081021101821080831315A39397B424A844A4A84525A945263A5 + 4A63A55A6BB55A6BB5637BBD738CCE738CCE6B84C65A6BB542529C3942843139 + 7B31317B39397B31397B39428439428C39428C394284424A8C39429442529C4A + 63A54A5AA5424A8C42529C424A8C39428C31397B31315A29214A211031211031 + 21182121102929213929213921184A29214A29214A29214229214A29214A3121 + 4A29213929213929182929182921182121101821101018102121100818081018 + 08101810084A313952424A52424A4A394A52424A52424A52424A4A394A52424A + 52424A5A424A52424A5A424A5A424A5A424A52424A5A424A52424A5A424A5242 + 4A52424A52424A52424A52424A52424A5A424A4A394252424A4A394252424A52 + 424A52424A4A394252424A52424A4A313952424A4A394252424A52424A4A3139 + 52424A52424A4A39424A3942FFFFFF0000003118213929293118213929293118 + 2139292939292939292939292939292939292939292939293139292939292939 + 2929392931422931392929392931422931392929423131422931392931423131 + 4231313929314231313929314A31394A31394A31394A31394A31394A31394A31 + 3942313121101821101018081021101821101021101031315A39397B42317B42 + 529C4A5A9C5263A55263A5424A8C4A52945263A5637BBD738CCE6B84C6637BBD + 5A6BB54A63A542529C39428C39428C39428431397B31316B39397339397B3942 + 8C4A5A9C5263A55263AD5263AD4252A54A63A54A5A9C39428C424A8C31316B31 + 214A29214A29213921103121102921102921103129214229294A31294A31315A + 29215A29215A29294A31214A2929392918292110182110182110181810211808 + 1018081021101018080818080839293152424A52424A52424A52424A52424A52 + 424A52424A52424A5A424A5A424A5A424A52424A5A424A5A4A4A5A424A52424A + 5A424A5A424A5A424A52424A52424A52424A52424A52424A4A394A52424A5242 + 4A52424A52424A52424A5A424A52424A4A394252424A52424A52424A52424A52 + 424A4A313952424A52424A4A313952424A52424AFFFFFF000000392929392929 + 3929293929293929293929293929293929293929293929293929293929293929 + 2939292939293139293142293139292939293142293139292942313139293142 + 31314229313929314231314229314A31314A3139423139392931311829311821 + 2110182110101808101808102110181808101808101808101808101810082921 + 4239397B39397B424A844A5A9C4A5AA55263A5424A734A4A844A52945263A54A + 5AA54A63A55A6BB54A63A54A5294424A8439428431396B31315A29214A393173 + 31316B39397B4A5A9C4A5A9C5263AD5263AD5A6BAD5263A55263AD5263A54252 + 9C4A5294424A8429294A29213929213921103129293929213929213929214A29 + 214A31296B29295A31296B31315A29294A292139211821211018211018211821 + 21101821101021101018081018081021101010000029182952424A52424A5242 + 4A52424A52424A52424A52424A52424A52424A5A424A5A424A5A4A525A424A5A + 424A5A424A52424A5A424A52424A52424A5A424A52424A4A394A52424A52424A + 52424A52424A4A394A52424A4A39425A424A4A394252424A52424A5A424A5242 + 4A52424A4A39425A424A52424A52424A4A313952424A4A39424A3942FFFFFF00 + 0000392929392929392929392929392929392929392929392929392929422931 + 3929293929294229313929293929313929293929294231313929314231313929 + 2942313142313139292942293142313142313142313139292929182918081018 + 0808180808180808180810180810211010211010211010211010211018211018 + 21101018080829213931315A31316B394284424A844A52945A6BAD5263A5424A + 734A4A8431294A29214231294A29214221102121182131315A39315A31294231 + 183931294A42426B393973424A845263A55263AD5A6BB55A6BB55A6BB55263AD + 5A6BAD5A6BAD525A94636BAD4A4A843939732110312118212918292918292918 + 2921102929213929294A31315A31315A31294A29294A29213921101818102121 + 1018211018211018211018181021211010180810180810181008180810100008 + 4A31394A39425A424A52424A52424A5A424A4A394252424A5A424A5A424A5242 + 4A5A424A5A424A5A4A5252424A52424A5A424A52424A52424A52424A5A424A5A + 424A52424A4A394252424A52424A52424A52424A52424A52424A52424A5A424A + 4A394252424A52424A52424A52424A52424A52424A52424A52424A52424A4A39 + 424A3942FFFFFF00000039292931182142293131182139292939292939292939 + 2929392929392929392929392929422931392929392929392931392929392929 + 4231313929314229313929294231314231314231314231313929312918291808 + 1018080821101018080821101018081021100821101021100821101018081021 + 101821101821101021101818081021182129214231296B393173394284424A8C + 5A6BAD5A6BAD5A639C3931523929313929313118213118293931523118392110 + 18312942291829292139424A73424A734A52945A63A55A6BAD5A6BB56373B563 + 73B56373B55A6BAD5263A55A6BAD5263A55A63A5525A9442426B393152292139 + 29182921182121101829182918081021101829213929214A2918292118212110 + 1821101018081021101821101821101821101818081018081018100818081018 + 08101808102108084A39425A4A525A424A5A424A52424A52424A52424A52424A + 52424A52424A52424A5A424A5A424A52424A5A424A52424A52424A5A424A5242 + 4A52424A52424A52424A52424A5A424A52424A5A424A4A394252424A52424A4A + 39425A424A4A394252424A4A39424A394252424A52424A5A4A4A4A39424A3942 + 52424A4A394252424A4A3942FFFFFF0000003929293929293929293929293929 + 2939292939292939292939292939292939292939292939292942293142293139 + 2929392929422931392929423131392929423131392931423131392931311831 + 1810212110181808102110101808102110101810212110081808101808101808 + 1018081021100821101821101821101821182121101818081021182131214A31 + 315A31316B424A8C525A946373B56B7BBD6B6B9C424A735A52735A5273424A73 + 5A52734A425A4A425A39315242395A424A735A5284525A946B6BA56B7BBD6B7B + BD7384BD6B73BD6373B55A639C5263A55263A55A63A55263A55263A55263A54A + 529431315A311839291829291829211018211018181021180808180808181008 + 2110101808101810081808102110101810212110181808102110102110102110 + 101808102110082110102110082110102918294231394A39424A39425A4A525A + 4A4A5A4A4A52424A5A424A52424A5A424A5A4A525A424A52424A5A424A5A424A + 52424A5A424A52424A52424A52424A52424A52424A4A39425A424A4A39425242 + 4A52424A52424A52424A4A394252424A52424A52424A5A424A4A31395A424A4A + 394252424A52424A52424A4A31395A424A52424AFFFFFF000000392929392929 + 3929293929293929293118213929293929293929293929294229314229314229 + 3139292939293139292942293139293142293139293142313142313139292942 + 313931294A211821211821211018211821211018211018211018211010180810 + 2110102110102110102110102110102110102110182110102110182110101808 + 0818080818081029182931294A393973424A84525A94636BAD6373B56B7BBD73 + 84BD6B7BBD636BAD636BAD6373B56B7BBD7384BD6B7BBD7384BD7B8CCE7384BD + 6B7BBD7384BD7384C67384BD6B7BBD6B7BBD636BAD5A63A55263A55263A5525A + 943942944A5AA5525A944A4A8431315A31294A31183921182121101818080818 + 0810181021180810180808180810180810211018211821211018211010211018 + 1808101808101808101810081808101808101808101810081808081000001000 + 0021101021101831182942313952424A5A4A4A5A4A525A424A5A424A52424A52 + 424A52424A52424A52424A5A424A52424A52424A5A424A52424A4A394252424A + 4A39425A424A52424A52424A4A394A52424A4A394252424A4A313952424A4A39 + 4252424A4A394252424A52424A5A424A52424A52424A4A39424A3942FFFFFF00 + 0000311821392929311821392929311821392929392929392929392929392929 + 3929293929293929294229314231314231313929293929294231313929314231 + 3139293142313142313931315A18102121101821102921182121182121182121 + 1018211018211018180810211018211018211010211018180810211010211010 + 18081018081021101018081018080818100818081021102129214231315A424A + 84525A94525A945A6BAD5A6BB55A73BD5A6BB5526BB5526BB55273BD637BBD6B + 84C66B7BBD6373B56373B56B7BBD6B84C67384BD6B7BBD635AA57384BD5A63A5 + 5263A54A529442529C394294424A8C424A8C4A5AA5525A94424A8439397B3931 + 5A31315A29213921182121101821102121101021101021101821102921101818 + 1021180810180810180810180810211008180810180810211008180808180810 + 1808101810081808101808081808081808081000001808082918294A39425A4A + 4A524A525A424A52424A52424A52424A52424A4A394A5A424A52424A52424A4A + 39425A424A52424A52424A52424A52424A52424A52424A4A394252424A4A3942 + 52424A4A394252424A5A424A4A394252424A52424A52424A4A31394A39425242 + 4A4A3942FFFFFF00000039292939292939292939292939292939292939292939 + 2929392929392929392929392929422931392929392929392931423131423131 + 39293142313139292942313139292942313142314A31396B2110292110182118 + 2121182129182921182121182121101821101821101821101829182921101821 + 1018181021211010181021211010180810180810211010180810180810180808 + 21080810000018081021102929213929214A29214A31296B39397B31317B3942 + 8439428C39429442529C4A52944A5A9C5263A55263AD5263A55263AD5263A552 + 63A55263A54A5A9C4A529439428C39428439397B31316B39397B394284394284 + 39428431316B31316B31316B31315A2921422921392110292118212118212110 + 2121101018081021101018081018080821101018100818081018080818081018 + 0810181008211008180810211010180810211010211008211018211010180810 + 1808081808082918294A39425A4A525A424A52424A52424A52424A52424A5242 + 4A52424A52424A52424A4A39424A39425A424A52424A5A424A52424A5A424A52 + 424A52424A52424A5A424A4A39425A424A4A394252424A52424A4A313952424A + 52424A52424A4A313952424AFFFFFF0000003118213929293929293929293118 + 2139292939292939292939292939292939292942293139292942293142293139 + 29293929293929313929294229313929314229313929293929314229314A3942 + 31315A2921422118212110182110292118212118212918292118212118212110 + 1821101821101821101821101821101821101821101818102121101821101818 + 0810180810211010180810180810211010180808180808100000100000100000 + 18080821101018081021102921103121103121184A29214229214A29214A3131 + 5A31296B31315A31315A29215A31315A29215A31294A29214A29214A29214229 + 214A29214229214A29214A292139211031211029211029211029211821211018 + 1808101808101810081808101808101810081808101810081808101808101810 + 0821101018081018100818081018081018080818081021101018081021101021 + 101018081021101021101021101018080818080831182152424A5A424A52424A + 5A424A52424A4A394252424A4A39425A424A52424A52424A4A39425A424A4A39 + 425A424A4A39424A394252424A4A31394A394252424A4A394252424A52424A4A + 31394A394252424A4A394252424A52424A4A3942FFFFFF000000392929392929 + 3929293929293929293929293929293929293929293929293929294229313929 + 2939292939292939293142293139292939293139293142293139292942293142 + 313142313142313142313142395A29294A211031211018211018211029211821 + 2118212118212110292118212918292110182110182110182110182110182110 + 1821182121101818102121101818102118102121101018081018081018102118 + 0810181021211010180810180810211010181008181008180808180808180808 + 1808081000001808081808081808081808081808081808081808081808081808 + 0818100818080818100818100818100821101018080818100818080818080818 + 1008181008181008180810180810180810211010181008180810211010180810 + 1808102110081808101808102110081808101808101810082110101808101808 + 0818081018102121080818081021101021101821101021101021101008000842 + 31315A424A5A424A52424A52424A52424A52424A52424A4A394252424A4A3139 + 5A424A52424A52424A4A394252424A52424A52424A52424A52424A52424A5242 + 4A52424A4A313952424A52424A4A313952424A4A313952424A4A3942FFFFFF00 + 0000392929392929392929392929392929422931422931392929392929392929 + 3929293929294229314229313929294229314229313929294229314229313929 + 294231314231313929313929314231314231314229314A394239315231315A29 + 2139211018211018211821211029291829211821211821211821211821211018 + 1810212110182118212110182110182110181810212110182110182110181810 + 2121102118081021101818102121101818081021101018102121101821101821 + 1018211018181021211018181021211021180810211018181021211010180810 + 1810211808101808102110101810212110181808101808101808102110181808 + 1018081021101018081018081018081021100818081018081018081018081018 + 0810181008180810181008180810180810180808180810180810180808180810 + 1808101808082110102110101808082110101808102110101808102108082110 + 101000003118295A424A52424A5A424A4A39425A424A4A39425A424A4A394252 + 424A5A424A4A394252424A4A394252424A52424A52424A4A313952424A4A3139 + 52424A52424A4A313952424A52424A4A394252424A52424A52424A52424A4A39 + 4252424AFFFFFF00000031182139292942293131182139292931182139292939 + 2929392929422931392929422931392929392929392931422931392931392929 + 3929313929314231313929314231314229314231314229314231314231314231 + 3142313142314A39315A29294A21214A21102121182121182129182929182921 + 1821291829291829291829291829211821211821211821211018211018181021 + 2110182110182110181808102110181808102110101808101810212110182110 + 1818102121101821102121101821101818102121101818081021101018102121 + 1021180810211018211010211010180810211010180810180810180810211018 + 1808101808101808101810081808101808101810081808101808101808102110 + 1021101018100818081018081021100818081018100818081021101018080818 + 0810211010181008211010180810180810211008180810180810211010211010 + 2110101808081810084229315A424A5A424A52424A5A424A52424A52424A5242 + 4A4A39425A424A4A394252424A4A394252424A5A424A4A313952424A52424A52 + 424A52424A52424A4A313952424A52424A4A313952424A52424A4A313952424A + 4A313952424A4A39424A3942FFFFFF0000003929293929293929293929293929 + 2939292939292939292939292939292939292939292939292939293142293139 + 2929422931423131392929392931423131423131392931423131423139423131 + 4231314229314231394231394231314A31314A394239315242426321214A2110 + 3121101821182121182121182129182929182921182129182929182921182121 + 1821211821211821211018211018181021211018181021211018211018211010 + 2110101808102110182110182110181808102110182110182110181810212110 + 1818102121101018081021102118081018081018102121101018102118081021 + 1010180810180810180810180810211010180810181008181021180810180810 + 1808101808101808101808101808101810081808101808101810081808101808 + 1018100818081018100818081018081018080818081018080818081021100821 + 10101808081808081000003118294A39425A4A5252424A52424A5A424A52424A + 52424A52424A52424A52424A4A394252424A4A39424A394252424A4A39425242 + 4A4A394252424A4A313952424A4A394252424A4A394252424A52424A5A424A4A + 31394A394252424A52424A4A394252424A52424AFFFFFF000000392929311821 + 3929293929293929293929293929293929293929293929293929293929293929 + 2942293139292939293139292939292942293139292942313139292942313142 + 2931423131392931423139423139423139423131423139423131423131423131 + 4A31394A425A42426331396B29294A2918292110212110182110292918292918 + 2929182921182129182929182921182121182121182121101821101821101821 + 1018181021181021181021211018180810181021211018211018181021211018 + 2110182110181808102110181810212110101808102110181810211808101808 + 1018081018081018102118081018081021101018102118081018081018081018 + 0810211010180810211010180810180810211008180810211010180810181008 + 1808102110101810081808102110101808101810081808102110101808082110 + 102110101808081000001808083118294A39425A4A525A424A5A424A52424A52 + 424A5A424A52424A52424A52424A4A394252424A4A394252424A52424A52424A + 4A394252424A52424A52424A52424A52424A4A394252424A52424A4A39425242 + 4A52424A5A424A52424A52424A52424A4A31395A424A5A424A4A3942FFFFFF00 + 0000392929392929392929422931392929392929392929392929392929392929 + 3929293929293929293929314229313929294229314231313929314231313929 + 3142313942293142313942313142313142293142313142313142313942313142 + 31394231394A31394A31314A31314A313952424A4A425A42426331315A31294A + 2110312110212118212918292918292918292110293929292918292118212118 + 2118102118102121101821182121101821101821101821101821101818102118 + 1021211018211018211018181021211018211018211018181021211018180810 + 2110101808101810212110182110181808101808102110101808102110181808 + 1018081021101818081018100821101818081018100818081018081018080818 + 0810181008180810180810180808180810181008180810211008180810181008 + 1808101810081000001000002110183929314A39425A4A525A424A52424A5242 + 4A52424A52424A52424A52424A5A424A52424A52424A52424A52424A52424A4A + 394252424A4A313952424A52424A4A313952424A4A313952424A4A394252424A + 52424A52424A5A424A5A424A4A394252424A4A31395A424A4A39424A39424A39 + 4252424AFFFFFF00000039292939292931182139292939292939292939292939 + 2929392929392929392929422931392929392929392929423131392929392931 + 4231314231314231394229314231314231314229314231314231314229314229 + 314231394231394A31314231394231314231394231314231394A31394A313939 + 292921102931294A42426B42426329294A211031211018211821291829211821 + 2918292918292918292118212110211810212110212110211810211810212118 + 2121182121101821101821101821182121101818102121101818102121101821 + 1018180810211010181021211018180810180810180810181021211010180810 + 1808102110102110102110101808101808101808101810081808101808102110 + 1018100821101018081018081018100818081021101018081018081018081018 + 08081810081808081000082110183118294A313952424A5A424A5A424A4A3942 + 52424A5A424A52424A52424A52424A52424A52424A52424A52424A52424A4A39 + 4252424A4A39425A424A52424A52424A4A394252424A52424A52424A52424A52 + 424A4A394252424A52424A52424A4A394252424A4A394252424A52424A4A3942 + 52424A5A424A4A394252424AFFFFFF0000003929293929293929293929293929 + 2939292939292939292939292939292939292939292939293142293142293139 + 2931422931423131392929392931423131423131423131423131423131423131 + 4231314231394231394229314231314231394231314231394231394A31394A31 + 394A31394A394239293110000010000021080829213931294A42426B31396B31 + 294A292939292939291829211018211018211821211821211821211821181021 + 2110182110182110182110182118212118212918292118212110182110181810 + 2121101821101818102121101818102118081021101018081021101018102121 + 1010211018181021211010180810181021211010180810180810211010180810 + 1808102110101810081808101810081808081808081808101810081808081808 + 1021101018081021101829182918102142313952424A52424A52424A4A39424A + 39424A39424A39425A424A4A39425A424A52424A52424A52424A5A424A52424A + 52424A5A424A5A424A4A394252424A4A39425A424A4A31395A424A52424A4A31 + 395A424A52424A4A313952424A52424A52424A4A313952424A52424A4A39424A + 31394A394252424A4A31394A39424A394252424AFFFFFF000000392929311821 + 3929294229314229313929293929293929293929293929294229314229313929 + 2939293142293139292942293139293142313142313142313139293142313142 + 29314231314229314231314229314231314231394231314231314231394A3131 + 4231314A31394A31394A31394A39423929311810082110182110102110082110 + 0829182939292931294239315A39315A31396B31315A29214229213921102921 + 1021211018211018181021211018211018181021211018211821291829211018 + 2118212110182110182110181810212110182110181808102110181810212110 + 1018102118081018081018081018081021101018081021101018081018081018 + 0810181008180810181008181008180810180810211010181021211018211018 + 2110182118212118212110212918292110181808101808084A394252424A4A39 + 424A394252424A52424A52424A5A424A52424A52424A52424A5A424A52424A52 + 424A5A424A52424A52424A4A39424A39424A39425A424A4A39424A394252424A + 4A39425A424A4A394252424A4A313952424A4A394252424A4A394252424A4A39 + 4252424A4A313952424A52424A4A313952424A4A394252424A52424AFFFFFF00 + 0000392929422931311821392929392929392929422931392929392929422931 + 3929294229313929294229313929314231313929294231313929294229314231 + 3142313142313142313142313142313142313142313142313142313942313942 + 31394231314231394231394231394A31394231394A31394A3139180810181008 + 2110182110182110102110103118213118212110102918293929294A39424239 + 5A31315A39315A31294A31315A29294A29293921103121102929182921182121 + 1821291829211018211018180810211010211010180810180810181008180810 + 1808081808101808101808102110182110182110182110182110182118212110 + 1821101821182121101821182121102921102929213921102921103121102921 + 1821211821181021211021180810211010181008181008180808180810100000 + 4A39424A394252424A52424A4A394252424A4A31395A424A4A39425A424A5242 + 4A5A424A52424A52424A52424A52424A5A424A5A424A52424A4A394252424A4A + 394252424A4A394252424A4A394252424A52424A52424A4A39424A394252424A + 4A39424A39424A39424A394252424A4A313152424A4A313952424A4A31394A39 + 424A3942FFFFFF00000039292939292939292939292942293139292942293139 + 2929392929392929392929392929422931392931392929392931423131392931 + 4231314231313929314229314231314229314231314231314231314A31394231 + 314231314231394231314231394231314231394A31394A31394A31394A31394A + 3139180810181008211010211010291829211010311821311821311821311821 + 29182931182939292939292939292931294242313939315242395A42395A4239 + 5A39315239315231294A39315239315231294A31315A29294A31294A31294229 + 2142292142392931292139292939292139292939292142292139312942312942 + 2918292921392918292110292110292118212110212110181808211808102110 + 1018081018080818080821100818080818100818100818081018081018080821 + 10101000002918295A424A52424A4A313952424A52424A4A313952424A52424A + 52424A5A424A5A424A52424A52424A5A424A5A424A5A424A4A39424A39424A39 + 425A424A4A39424A394252424A4A39424A31394A39424A31394A313952424A4A + 394252424A4A313952424A4A394252424A4A313952424A52424A52424A4A3139 + 52424A52424A4A39424A3942FFFFFF0000003929293929293929293929294229 + 3139292939292939292939292942293139292939292942293139292942293142 + 2931392929423131392929423131423131423131423131423139423131423139 + 4231394231314231394231394231394231394231394231394A31394A31394A31 + 394A31394A31394A313921101018080818102121101021101829182931182129 + 1829291829311821392929392931392931392931392931392929311821392931 + 3929314231394231313118293929313929293929313929313929313929313118 + 2129182931182131182131182129182929182921101021101821101821101818 + 0810180808180810181008181008180808210808211008181008181008181008 + 1808081810081808101810082110101808101808101810081808101808101808 + 081808101808101808081808084A394252424A4A39425A424A4A394252424A52 + 424A5A424A4A31395A424A5A424A4A39425A424A5A424A52424A52424A5A424A + 5A424A5A424A5A424A52424A4A39424A394252424A4A394252424A52424A5242 + 4A52424A52424A52424A4A39424A394252424A4A39424A31394A313952424A4A + 313952424A4A313952424A4A313952424A4A3942FFFFFF000000392929392929 + 4229313929293929294229313929294229314229313929293929294229313929 + 2942293142293139292942313142293142293139293142313142293139293142 + 31314231394231314231314231394231314231394A3131423131423139423131 + 4A31394231394A31394A31394A31394A31392110102110082110102110102110 + 1829182929182931182139292929182939292931182142313939293131182939 + 29313929293929294231394A3942392931392931392929311829392931392931 + 3929313929293118213118213118213118213118212110102918292110102110 + 1021101021101821101021101018081021101818081021101818100818102118 + 0810180810180810211010181008180810180810181008180810180808180810 + 21101018080821101018081018080818080829182952424A4A394252424A4A39 + 424A39424A39424A39424A394252424A5A424A4A394252424A5A424A52424A4A + 39425A424A52424A4A39424A39424A39424A39424A39424A39424A39424A3942 + 52424A4A313952424A4A313952424A4A313952424A4A39424A39424A39425242 + 4A52424A52424A52424A4A313952424A5A424A52424A4A39424A3942FFFFFF00 + 0000392929422931392929422931392929422931392929422931392929392929 + 4229314229313929293929293929294229313929293929314231313929314231 + 314231314231314231314231394231394231314231394231314231394231394A + 31394231394231314A31394A31394A31394A31394A313152424A291829180808 + 2110102110182110102918293118213118213118213929292918293929293929 + 313929313929313929313929313929313929314A394239293131183139293139 + 2929311821392931392931392929311821311821291829311821291829211010 + 2918292918292110102110182110182110102110181808102110101808102110 + 1821101018100821101018081018081018100818081018081021100818081018 + 08102110101810081808101808101810081808102110101000004229315A4A52 + 4A39425A424A4A394252424A52424A52424A52424A52424A4A39425A424A5A42 + 4A4A39425A424A4A39425A424A4A39425A424A5A424A52424A4A39424A394252 + 424A52424A4A31394A394252424A4A313952424A52424A52424A4A39424A3942 + 5A424A4A313952424A4A31395A424A4A313952424A4A313952424A4A31395242 + 4A4A3942FFFFFF00000042293139292939292942293142293139292942293139 + 2929422931423131423131392931422931422931392929423131423131392929 + 4231314231313929314231314A31314231394231314231314231314231314231 + 394A31314231394231394A31394231394231314A31394A31394A31394A31394A + 3139291829211010211010211010211010311821311821291829392929311821 + 3118213118293929293929313929293929293929314231393929293929313929 + 3139293139292939292931182939293142313931182139292931182129182931 + 1821291829211010211018211018211010211018211018211010211010180810 + 2110181808101808101808101808101808101810082110101808101810081808 + 1018081018100818081018100818081021101018080818081018080818081010 + 00084A39425A424A4A39424A39424A39424A39424A31394A39424A313952424A + 4A39424A39425A424A5A424A4A394252424A4A39425A424A4A394252424A4A39 + 425A424A4A39424A313952424A5A424A4A39424A394252424A4A31395A424A4A + 313952424A4A39424A39424A39424A394252424A52424A52424A4A39424A3942 + 4A39425A424A4A39424A3942FFFFFF0000003929293929293929293929293929 + 2939292942293139292942293139292942293139292942313139293142313142 + 2931392929423131392931423131423131423131423139423139423131423139 + 4A31314231314A31394A31394231394231314A31394A31394A31394A31394A31 + 394A31394A394252424A31182121101021101829182929182929182931182131 + 1821392929291829311821392929311829392931392931392929392931392929 + 3118213929293929313929313118293118213929293929313929313929292918 + 2929182921101031182129182929182929182921101021101821101021101021 + 1018180810211010180810211010211010181008211010180810180810180810 + 1810081808102110082110101808102110081808101808101810081808102110 + 101808101808082110105A424A52424A52424A4A39424A39424A394252424A52 + 424A4A394252424A4A31395A424A4A394252424A52424A4A394252424A52424A + 4A39425A424A4A39425A424A4A39425A424A4A39424A39424A394252424A4A39 + 424A394252424A52424A4A39425A424A4A31394A39424A39424A39424A39424A + 31395A424A4A39424A39425A424A4A39424A3942FFFFFF000000392929392929 + 4229313929293929293929293929294229313929294229313929294229314229 + 313929294231313929314231314231313929294231314231314A313142313942 + 31314A31394A31314231394231394A31394231394A31394A31394231394A3139 + 4A31394A31394A31394A31394A313952424A3118211000002110102110102110 + 1021101029182931182139292929182931182139292929182939293139293129 + 1829311821392929392929311821392929392931392929311829392929392929 + 3929313118212918293929292918293118212918292110102110102110102110 + 1021101821101021101021101018081021101018081018081018102118081018 + 0810180810211008180810180810211010180810181008180810180810181008 + 18081021101018100818100810000031182952424A52424A4A394252424A4A39 + 424A394252424A4A39424A394252424A5A424A5A424A4A39425A424A52424A52 + 424A52424A5A424A5A424A52424A5A424A4A39424A39425A424A4A39424A3942 + 4A394252424A4A31395A424A52424A4A313952424A4A39424A39424A39425A42 + 4A4A39425A424A4A39424A39424A39424A39424A39424A31394A3942FFFFFF00 + 0000392929422931392929392929422931392929392929422931422931392929 + 4229313929294229314231313929294229313929294231314231314231314231 + 394231394A31314231394231394231394A31394A31314A31394231394A313142 + 31394A31394A31394A31314A31394A31394A31394A31394A313942395A211031 + 1808081810082918292918292918292918293929293929292918293929293929 + 2939292939293139292929213939292939292939292931183139293131182939 + 2929392929392931291829311821392929311821291829311821311821211010 + 2918292110182110102110102110182110102110182110101808102110082110 + 0821100821101021101018081021101021101018081018081021101018081018 + 081021100818081018100818081018081010000839293152424A52424A4A3942 + 52424A52424A4A39424A39424A394252424A52424A4A39424A39425A424A5A42 + 4A52424A52424A52424A5A424A4A39424A39425A424A4A394252424A4A394252 + 424A4A313952424A52424A4A394252424A4A313952424A52424A4A39424A3942 + 4A39424A39424A39424A39424A39424A394252424A4A313952424A4A39425A42 + 4A4A3942FFFFFF00000042293139292939292939292939292942293142293139 + 2929422931392929392929422931392929423131423131392929423131392931 + 4229314231314231314231394231394A31314231394A31314231394A31394231 + 314231394231394231394A31394A31394A31394231394A31394A31394A31394A + 3131524A5239428431315A211018211008211008291829311821392929392929 + 2918293929293929293929293929313929313929313929313118293929293929 + 3139292939292931182939292939292929182929182939292931182131182131 + 1821211010291829211018211018211010211018180810180810180810211010 + 1808101810211808101808101808102110102110181808102110102110182110 + 101808102110101810081808101808102110182110101000083118295A424A52 + 424A4A394252424A4A394252424A52424A52424A4A39424A394252424A5A424A + 4A39424A39425A424A5A424A5A424A4A39425A424A5A424A4A394252424A5A42 + 4A4A31395A424A4A31394A39424A39424A39424A39424A394252424A4A31395A + 424A4A394252424A4A31394A39424A39424A394252424A4A31394A39424A3942 + 4A31394A39424A39424A3942FFFFFF0000003929293929294229314229313929 + 293929294229314229313929294229314229313929294231314229313929294A + 31314229314229314231314231314231314231314231314231394A31314A3139 + 4231314231394A31394A31394A31394231394A31394231314A31394A31394A31 + 394A31394A31394A313142314A31397B39397B424A7331315A29293921101821 + 1010311821311821311821311821311821311821392931392929392931392929 + 3929293118213929314229313118213929293929292918293929293929292918 + 2929182931182131182129182921100821101021101821101021101021101021 + 1018211010180810211010211008211010180810211010180810211010211010 + 2110182110102110182110182110101810212110101808102110101808101808 + 0842313952424A52424A4A394252424A4A394252424A52424A4A394252424A52 + 424A4A394252424A52424A52424A4A39424A39425A424A5A424A4A39424A3942 + 5A424A4A39424A394252424A52424A52424A5A424A4A39424A394252424A5242 + 4A4A394252424A52424A4A394252424A52424A4A39424A39424A39424A39424A + 39424A394252424A4A39425A424A4A39424A3942FFFFFF000000392929392929 + 4229313929293929294229313929293929294229314229313929294231314229 + 314231314229313929294231314231314231313929314231313929314A313142 + 31314231394231394231314A31394231314231394231394A3131423139423131 + 4A31394231394231394A31394A39424A313942314A31396B31396B31396B3139 + 6B39397B39397331396B31294A31294231182129182931182131182131182139 + 2929392931392929311821392929311829423131392929392929392929392929 + 3929293118213929293929292918293118212918292110102918292110102110 + 1018102121101021101021101818081018081018102118100821101021101018 + 1021211010211010180810180810211018211010180810180810180810211010 + 1810081810212110104A394A52424A4A394252424A4A394252424A4A39425242 + 4A52424A52424A4A394252424A4A39425A424A5A424A5A424A52424A5A424A4A + 39425A424A52424A52424A4A39425A424A5A424A4A39424A39424A39424A3942 + 52424A52424A4A31394A313952424A4A313952424A4A39424A31394A31395242 + 4A4A39424A39424A39424A39424A39424A31394A39424A39424A3942FFFFFF00 + 0000392929422931392929392929422931392929392929422931422931392929 + 4229313929314231313929294231314231314231313929294231314231314231 + 3142313139293142313142313942313142313142313942313942313142313942 + 31394231394231394A31394231314A31394A31394A31394A31394A394231396B + 31396B424A7339397339397331396B31396B31396B31397B42426B31396B3131 + 5A31294A39315231294239292939292931182139292939292939292931182139 + 2929311821311821311821311821311821392929211010291829211010211010 + 2110102110102110102110101808101810081808101808102110081808101810 + 0818081018081021101018081021101018081021101021101821101821101821 + 101018102121101818081018100829182952424A52424A4A394252424A4A3942 + 52424A4A394252424A52424A4A394252424A52424A52424A4A394252424A5A4A + 525A4A525A424A524A5252424A52424A52424A5A424A4A39424A39425A424A4A + 39424A394252424A4A313952424A52424A52424A52424A4A39424A39424A3942 + 4A394252424A4A313952424A4A31394A39424A39424A39424A39424A39424A39 + 424A3942FFFFFF00000039292942293139292939292942293142293139292939 + 2929392929392929422931392929422931423131392931422931392929422931 + 4231313929314231314231314231314229314231314231394231314231314231 + 394A31394A31394231394A31314231394A31314A31394A31394A31394A31394A + 3139423139424A7339397331396B31396B31396B31396B42426B31396B31396B + 424A7339397B39397331396B31396B31396B42426B31396B39315A39315A3931 + 5239315239315231294231294231183129213939293131294239292929182929 + 1829291829211021211018291829211018181021211018211018211018211018 + 2110182110182110182110181808102110182118212110182110182118212110 + 182110182110182110182110182110181810211808103929315A424A52424A52 + 424A4A39424A39424A39424A394252424A4A394252424A4A394252424A52424A + 5A424A52424A52424A5A424A5A424A5A424A52424A52424A52424A52424A5A42 + 4A4A39425A424A5A424A4A394252424A4A39425A424A4A313952424A4A394252 + 424A5A424A52424A4A313952424A4A39424A394252424A4A394252424A4A3942 + 4A39424A31394A39424A3942FFFFFF0000003929293929293929294229313929 + 2939292939292942293142293139292942293139293139292942313142293139 + 2929423131423131392931423131423131422931423131423131423139423131 + 4A31394231394231314231394231394231314231394A31394A31394A31394A31 + 394A31394A31394A31394A313931396B31396B424A7331396B42426B31396B31 + 396B31396B31396B31396B31396B31396B31396B31396B31396B31396B31396B + 39397331396B31396B31396B31315A31315A29295A31315A31315A29294A3131 + 5A31315A31315A31294A29294A31294229214229214229214229213929182929 + 2139292139211029211029211029211029211821211821211821211821211821 + 2110182110182110182110182110181810212110182110182110181808104231 + 3952424A4A39424A394252424A52424A4A394252424A4A394252424A4A394252 + 424A4A394252424A52424A5A424A5A424A52424A52424A52424A52424A52424A + 52424A52424A52424A4A39424A39424A39425A424A4A394252424A4A39425242 + 4A52424A4A313952424A4A313952424A4A39424A313952424A4A31394A394252 + 424A4A31394A394252424A4A394252424A4A3942FFFFFF000000422931392929 + 4229313929294229313929293929294229313929293929294229313929294231 + 3142293142313139293142293139292942313142313142293142313142313142 + 31314229314231394A31394231314A31394A31394231314231394A31394A3139 + 4231394A31394A31394A39424A31394A31394A3139424263424A7331396B3139 + 6B31396B31396B31396B39397342426B31396B42426B424A7331396B42426B31 + 396B31396B31396B31396B31396B31315A31315A31396B31315A31315A31315A + 29294A31315A31294A31315A31294A3129422921392921392921392921392921 + 3929213929213929182921102929182929182929182921182121182121182121 + 1821211018211821211018211821211018211018211018211018211018181021 + 18081021101852424A4A394A4A394252424A52424A4A39424A394252424A4A39 + 4252424A4A394252424A52424A52424A52424A52424A52424A52424A52424A52 + 424A5A424A52424A52424A52424A5A424A4A39425A424A4A39424A39424A3942 + 52424A4A394252424A4A394252424A5A424A52424A4A39424A31394A39425242 + 4A4A394252424A4A394252424A4A39424A313952424A4A31394A3942FFFFFF00 + 0000392929392929392929392929392929422931392929392929422931422931 + 3929294229313929294231314231314231313929314229314231314231314231 + 3142313142313142293142313142313942313142313942313142313942313942 + 31314231394231394A31394A39424231394A313952424A4A39424A313142395A + 31397B31396B424A7331396B42426B31396B31396B31396B31396B3939733139 + 6B39397331396B42426B31396B42426B31396B39397331396B31315A39315A31 + 396B29295A31315A31315A31315A39315A39315231294A312942292142312942 + 2921422921392921392110312929392921392929392918292110292918292918 + 2921182121182121182121101821182121182121101821182121101821101821 + 101821101821101818081029182952424A52424A52424A4A39424A39424A3942 + 52424A4A39424A394252424A4A394252424A52424A52424A5A424A5A424A5242 + 4A5A424A5A424A52424A52424A52424A5A424A5A424A4A39425A424A4A39425A + 424A52424A4A39424A394252424A4A313952424A52424A4A313952424A4A3139 + 52424A4A39424A394252424A4A313952424A4A313952424A4A39424A39425242 + 4A4A3942FFFFFF00000039292942293139292942293142293139292939292939 + 2929422931392929422931423131422931392931423131423131423131423131 + 3929293929314229314231314231314231314231314231314231314A31394231 + 394231314231394231394A31314231394A31394231394A31394A31394A39424A + 31394A313142395A31397B39397B39397B39397331396B42426B31396B31396B + 42426B31396B424A7331396B31396B31396B31396B31396B39315A31396B4242 + 6B31396B31396B42426B42426B31315A29295A31315A31396B39315231315A31 + 294A312942292142292939292139292139292939211031292139291829292139 + 2918292118212118212118212110182110182118212118212110182110182110 + 1821101821101818102118102121101818081039293152424A52424A52424A4A + 394252424A4A394252424A4A394252424A4A394252424A5A424A4A394252424A + 5A424A5A424A5A424A5A424A52424A5A424A5A424A4A394252424A4A39425242 + 4A52424A4A39424A39424A313952424A4A394252424A52424A4A313952424A4A + 394252424A4A394252424A4A39424A394252424A4A394252424A4A39424A3139 + 52424A4A39424A31394A3942FFFFFF0000003929294229313929293929294229 + 3139292942293142293139292942313142293139292942313142313142313139 + 2931392929423131423131422931423131423131423131423131423139423131 + 4231394231394231314231394231314231394231394231394A31394A31394A31 + 394A39424A31394A39424A31394A3942424A7331396B31396B31396B31396B31 + 396B39397342426B31396B31396B393973424A7339397342426B31396B424263 + 31396B39397331396B39315A42426B31396B29295A39315A31315A39315A3931 + 5239315A31315A31294229213931214229214229214229293929213929182929 + 2939291829211821291829211821291829211821211821211821211821211018 + 2110182110182110182110182110182110182110182110181808104A31395242 + 4A52424A4A394252424A4A39424A394252424A4A394252424A4A394252424A4A + 394252424A5A424A4A39425A424A5A424A5A424A52424A52424A52424A52424A + 52424A52424A52424A52424A52424A52424A52424A4A394252424A4A39425242 + 4A52424A52424A52424A4A39424A39424A394252424A4A313952424A4A39424A + 394252424A52424A4A31394A394252424A4A3942FFFFFF000000392929422931 + 3929294229313929294229314229313929294231314229314231314229313929 + 2939292939293139292942313139293139293142313142313142313142313142 + 31394231314231394231394231314231394A31394231394231314231394A3139 + 4A31394A31394A39424A39424A39424A31394A31394A3139424A7331396B3939 + 73424A7331396B42426B31396B39397331396B42426B31396B31396B424A7331 + 396B31396B31396B39315A31396B39315A39315A31396B31294A31315A31315A + 31315A31294A31315A31294A31315A31315A29214229294A29294A2921422921 + 4229293921102929182921102929293929182929182921102921182121182121 + 1821211821211821291829211018291829211018211018211821211018211010 + 18102152424A52424A52424A4A39425A424A4A394252424A4A394252424A4A39 + 4252424A4A394252424A4A394252424A52424A52424A52424A52424A52424A52 + 424A52424A5A424A52424A4A39424A39425A424A5A424A4A39424A39424A3942 + 52424A5A424A52424A4A313952424A4A313952424A52424A4A313952424A5242 + 4A52424A4A394252424A4A39424A313952424A52424A4A31394A3942FFFFFF00 + 0000422931392929422931422931392929392929392929422931392929423131 + 3929314231314231314231314231314231314231314231314231313929314231 + 314229314231314231314231394231314231394231394231314231314231394A + 31394A31394231394A31394A31394A31394A31394A31394A39424A31394A3139 + 42426B31396B31396B424A7331396B39397331396B31396B39315A3939733139 + 6B42426B31396B424A7342426B31396B31396B39315A31396B31315A31315A31 + 294A31315A31315A31315A31315A31315A31315A31294A31294A31294231294A + 31294A3129422921422921422929392918292918292918292918292118212118 + 2129182921182121101821182121182121101821101821101821101821101821 + 101821101821101831182152424A52424A4A394252424A4A394252424A4A3942 + 52424A4A394252424A4A394252424A4A394252424A52424A5A424A5A424A5242 + 4A52424A52424A52424A52424A52424A52424A5A424A5A424A4A39424A394252 + 424A4A313952424A4A39424A313952424A52424A52424A52424A52424A52424A + 4A313952424A4A313952424A4A39424A313952424A52424A4A313952424A5242 + 4A4A3942FFFFFF00000042293139292939292942293142313142293142313142 + 3131422931423131423131423131392929392931392931423131392931422931 + 4231394231314231314231394231314231394231314231394231314A31394231 + 394231394231314231394A31394A31394A31394A31394A313952424A4A31394A + 39424A31394A313142395A424A7331396B31396B424A7331396B42426B31396B + 31396B31315A31396B39397339397331396B31396B42426B31396B31396B4242 + 6B31315A31294A31315A29294A31294A31315A29294A31315A29294A31294A29 + 294A31294A292142312942292142312142292939292139292139292139291829 + 2110292110292118212918292918292918292918292118212110182110182918 + 2921101821101821101821101818102142313952424A4A394A52424A52424A52 + 424A52424A4A394252424A4A394252424A52424A4A394252424A4A39424A3942 + 52424A5A424A52424A5A424A52424A52424A5A424A52424A52424A4A39425242 + 4A52424A52424A52424A52424A5A424A4A394252424A4A313952424A4A313952 + 424A4A313952424A52424A4A313952424A52424A52424A52424A4A313952424A + 52424A4A31394A39424A3942FFFFFF0000003929293929294229313929294231 + 3142293139292942313142313142313142313139292942293142313142293139 + 29314231314231314229314231314229314231314231394231314A3139423131 + 4231394A31394231314231394231394A31394231394A31394A31394A31394A31 + 394A39424A31394A39424A31394A31394A394239397B42426B424A7331396B39 + 397331396B39315A42426B31396B42426B31396B39397339315A42426B31396B + 42426B31396B31315A31396B39315231315A31315A31315A31396B31315A3129 + 4A31294A29294A31294A31294231294229214231183929293929182929293929 + 2139292939292939291829291829291829291829291829291829291829211018 + 2918292110182118212110182118212110182118212110184A394A52424A5242 + 4A4A39424A394A4A394252424A4A394252424A4A394252424A4A394252424A4A + 394252424A52424A52424A52424A5A424A5A424A52424A52424A5A424A52424A + 5A424A5A424A52424A4A39425A424A4A313952424A4A313952424A52424A5242 + 4A52424A52424A52424A52424A4A39424A313952424A52424A4A31394A39424A + 31394A39424A313952424A52424A52424A4A3942FFFFFF000000422931422931 + 3929294231314229314231314A31314231313929294231314229314231314231 + 314231314231314231314A313139293142313142313142313142313942313942 + 31394231314231394A31314231394231394A31394A31394231394231314A3139 + 4A31394A31394A39424A31394A39424A31394A39424A31394A3139424A733139 + 7B39397331396B31396B31396B39397331396B31396B31396B31396B31396B31 + 396B31396B31396B31396B31396B39315A31315A31315A31315A31315A39315A + 39315A31315A31315A31294A31294A31315A31294A2929393121422929392921 + 3929213929213929293929182921102929182921102929182921182129182921 + 1821211821211821211821211821211018211018211018211821211018392929 + 52424A4A394252424A52424A52424A52424A52424A52424A4A394252424A4A39 + 4252424A5A424A4A394252424A52424A52424A5A424A52424A5A424A5A424A52 + 424A52424A52424A5A424A52424A52424A4A394252424A52424A4A394252424A + 52424A52424A4A31394A394252424A4A313952424A4A313952424A4A39424A39 + 4252424A52424A52424A4A313952424A52424A4A39424A39424A3942FFFFFF00 + 0000392929392929422931422931423131423131423131423131423131422931 + 4231313929314229314231314229314231313929314231314231314231314231 + 394231394231314231314A31394231314231394231394A31314231394231394A + 31394A31394231394A31394A39424A31394A31394A31394A39424A31394A3942 + 4A313142395A31396B42426B31396B42426B39397331396B42426B3939734242 + 6B31396B42426B31396B42426B39397342426B42426B39315A31396B31315A31 + 315A31315A31396B31315A31396B31315A31315A31315A31294A292142292142 + 2921392921392921392921392921392918292929392918292918292918292918 + 2929182921182121101821182121182121182121101829182921182121182121 + 10181810214A313952424A52424A4A39424A39425A424A4A39424A394252424A + 4A394252424A52424A4A394252424A4A39425A424A52424A52424A5A424A5A42 + 4A52424A52424A52424A52424A5A424A5A424A4A39425A424A52424A52424A4A + 394252424A52424A4A313952424A52424A5A424A52424A52424A4A394252424A + 4A313952424A4A313952424A4A313952424A52424A4A31394A39425A424A5242 + 4A4A3942FFFFFF00000042293142293139292942313142293142313139292942 + 2931422931423131392929422931423131392929423131423139423131392931 + 4229314231313929314229314231394231314231394231394231314A31394A31 + 394231314231394231394231314A31394A31394A39424A313952424A4A31394A + 39424A31394A39424A31394A3942424A7331396B31396B31396B39315A31396B + 42426B31396B31396B42426B31315A31396B31396B42426B31396B31396B3931 + 5A39315A31396B31315A39315A31315A31315A31294A31315A29294A31294A31 + 294A312942292939292139292939292939292139292939291829291829291829 + 2118212918292118212918292918292118212118212118212118212118212110 + 1821101821182121101829182952424A4A394252424A52424A4A394252424A52 + 424A52424A4A394252424A4A313952424A52424A52424A4A394252424A52424A + 52424A52424A5A424A5A4A4A5A424A52424A52424A52424A52424A52424A5A42 + 4A4A394252424A52424A4A313952424A52424A4A313952424A4A313952424A4A + 313952424A4A313952424A4A313952424A4A394252424A4A394252424A52424A + 4A39424A31394A39424A3942FFFFFF0000003929294229313929294231314231 + 3142293142313139292942293139292942313142313139292942313142293142 + 3131422931423131423131423131422931423131423131423139423131423131 + 4231394231394A31314231394231394A31394231394A31394A31394A31394A39 + 424A31394A31394A39424A31394A39424A31394A313142395A424A7331396B42 + 426B31396B31396B39397339315A42426B31396B31396B42426342426B31396B + 39397342426B31396B39315A39315A31396B31396B39315A31396B29294A3129 + 4A31294A31294229214229213929213929213929213921102929182929182929 + 2939291829291829291829291829291829211821211821211821291829211821 + 2918292918292918292110182118211808104A313952424A52424A4A39425A42 + 4A52424A4A394252424A4A39424A394252424A4A394252424A4A313952424A52 + 424A4A394252424A52424A52424A52424A52424A52424A5A424A52424A5A424A + 5A424A52424A5A424A52424A4A39425A424A4A394252424A52424A52424A5242 + 4A52424A52424A52424A52424A52424A4A313952424A52424A52424A52424A4A + 31394A39424A313952424A52424A52424A4A3942FFFFFF000000422931392929 + 4229314231314229313929294229314229314229313929294231313929294231 + 3142293142313142313142313142313142313142293142313142313142313142 + 31314231314231314A31394231314231394A31394A31394231394A31394A3139 + 4A31394A31394A31394A313952424A4A31394A31394A31394A39424A31394A39 + 4231396B31396B31396B39397342426B31396B31396B42426331396B31396B31 + 396B31396B31396B39315A31396B31396B31315A31315A31315A31315A31315A + 31315A31294A31294A31294A2921423129423129422921392921392921392918 + 2929293929213921102929182921102921102921182121102929182921101821 + 182121182121182129182921101829182921182121101829182952424A52424A + 4A394252424A4A39424A394252424A4A394252424A4A394252424A4A39425242 + 4A4A394252424A4A394252424A52424A52424A5A424A5A424A52424A52424A52 + 424A52424A52424A52424A52424A52424A4A39425A424A4A39425A424A52424A + 4A313952424A52424A4A313952424A4A313952424A4A313952424A52424A4A39 + 4252424A4A313952424A52424A52424A4A39424A39424A39424A3942FFFFFF00 + 0000392929422931422931422931422931422931392929422931392929423131 + 3929294231313929294231314231314229314231313929314231314231314231 + 394231314231394231314231394231394A31394231394A31314231394231394A + 31394A31394A31394A31394A31394A313952424A4A31394A31394A39424A3139 + 4A31394A3942423131524A5231396B42426B31396B31396B39397331396B3139 + 6B42426B31396B424A7342426B39397331396B42426331396B31315A31315A31 + 315A31294A29214231315A31315A31294A31315A31294A292142292139292139 + 2929392918292921392110292918292918292918292918292918292918292918 + 292918292918292118212118212918292918292918292118212110182110184A + 313952424A52424A4A394252424A52424A52424A4A394252424A52424A4A3942 + 4A394252424A4A394252424A4A394252424A4A394252424A52424A52424A5242 + 4A5A424A52424A52424A52424A5A424A5A424A52424A5A424A52424A5A424A4A + 39424A394252424A5A424A4A313952424A52424A52424A52424A52424A52424A + 4A39424A394252424A4A394252424A4A313952424A4A39424A313952424A4A39 + 424A3942FFFFFF00000042293139292942293139292939292939292942293139 + 2929423131422931423131423131422931392929423131423131423139423131 + 4229314231314231314231314231314231394231314A31314A31314231394A31 + 394A31394A31394A31394A31394A31394A31394A31394A39424A31394A39424A + 31394A31394A31394A39424A31394A394242313939315A31396B42426B31396B + 31396B42426B31396B31396B42426B39397331396B31396B31396B31396B3931 + 5A31315A31315A31294A31315A31315A31315A31294A31294231294A31294A31 + 2942312942292139291829292139291829292939211029292139211821291829 + 2918292918292918292918292918292918292918292118212118212118212918 + 2918102139293152424A4A39424A39424A39424A313952424A52424A4A394252 + 424A4A394252424A4A39424A394252424A4A394252424A52424A52424A52424A + 52424A5A424A52424A5A424A52424A52424A52424A52424A52424A52424A5A42 + 4A4A394252424A52424A4A39424A394252424A52424A4A39424A313952424A4A + 31394A39424A31394A394252424A4A313952424A52424A52424A4A31395A424A + 4A39424A394252424A52424AFFFFFF0000003929294229313929294229314229 + 3142293142293142293142293139292939292942293142313142313142293139 + 2929423131422931423131423139423131423131423131423131423139423139 + 4A31394A31394231314A31394A31394A31394A31394231314A31394A31394A31 + 394A39424A31394A39424A39424231394231394231394A31394A31394A313942 + 426331396B31396B424A7331396B393973424A7339397342426B31396B42426B + 31315A42426B31396B31396B31315A31315A31315A31315A31315A29294A2921 + 4229294A29294A29293929213929214229213929182929182921103129182929 + 1829292939291829291829291829291829291829291829211029291829211821 + 29182929182921182129182952424A52424A4A39424A39424A394252424A5242 + 4A4A394252424A4A394252424A52424A52424A4A394252424A4A394252424A4A + 39424A394252424A5A424A5A424A52424A52424A52424A52424A52424A5A424A + 5A424A5A424A52424A52424A4A39424A39424A394252424A52424A52424A5242 + 4A52424A52424A52424A52424A52424A4A39424A313952424A52424A4A31394A + 394252424A4A39424A394252424A4A39424A3942FFFFFF000000422931392929 + 3929294229313929293929293929293929294229314229314229314231314231 + 3142293142313142293142313142313142313142293142313142313942313942 + 31314231394A31314231394231314231394231394231394231394A3139423139 + 4231394A31394A31394A31394A39424A39424A31394231394A39424A39424A39 + 424A39424A31394A313942395A39397331396B31396B31396B31396B31396B31 + 396B31396B31396B31396B31396B39315A42395A42314A4A394A4A394A4A394A + 4A394A4A394A4A425A42395A39315231294A2921422921392921392921392921 + 3929182929293929213929182929182929213929182921182121102921182121 + 18212110292110292918291808292918294A394A52424A4A39424A39424A3942 + 52424A52424A4A394252424A4A394252424A4A39424A39424A394252424A4A39 + 4252424A52424A4A39425A424A52424A52424A4A39425A424A52424A52424A52 + 424A5A424A52424A4A313952424A4A394252424A4A394252424A52424A52424A + 52424A52424A4A313952424A4A313952424A4A313952424A4A313952424A5242 + 4A4A313952424A52424A4A39424A39424A39425A424A4A39424A3139FFFFFF00 + 0000392929422931392929392929422931422931422931422931392929422931 + 4229314231314229314231314231314231314231314229314231394231314231 + 314231314231314231394231314231394231314231314231394A313942313142 + 31394231394A31394A31394A31394A31394A31394A31394A31394231394A3139 + 4A31394A31394231394A31394A39424A31394A313142314A424263424A733139 + 6B424A73424A7342426B424A7339315A524A524A394A4A39424A31394A31394A + 31394A31394A39424A31394A39424A31394A31394A394252424A42395A424263 + 31315A29294A21214A2921422921422921422921392929392918292918292918 + 292118212918292918292110292118212110293929314A313952424A4A39424A + 39424A394252424A4A39424A394252424A4A394252424A4A394252424A52424A + 4A39424A394252424A4A394252424A4A394252424A5A424A52424A52424A5242 + 4A52424A5A424A4A394252424A52424A52424A52424A52424A4A394252424A4A + 39424A39424A313952424A52424A52424A52424A52424A5A424A52424A52424A + 4A39424A313952424A52424A52424A4A313952424A52424A4A39424A39425242 + 4A4A3942FFFFFF00000042293139292942293142293139292939292942293142 + 2931422931422931392929422931423131392931423131422931423131423131 + 4229314231314231314229314231314231394231314231394231394231314231 + 314231394A31394231394231394231394A31394A31394A31394A39424A31394A + 31394A31394231394231394A31394A31394231394231394A39424A31394A3139 + 4A31394A39424A394A4A425A4A394A4A39424A31394A31394A31394A31394A39 + 424A39424A39424A39424A31394A39424A31394A39424A39424A31394A39424A + 31394A31394A3942524A5242395A42426331396B29294A29294A292142292142 + 2921392921392921392921392929392110312921392929393931524A39425242 + 4A52424A4A39424A394252424A4A394252424A4A394252424A4A394252424A4A + 39424A39424A394252424A4A39424A394252424A4A394252424A4A394252424A + 52424A5A424A52424A52424A52424A52424A52424A52424A52424A4A31395A42 + 4A52424A4A394252424A52424A52424A4A313952424A52424A4A313952424A4A + 394252424A4A313952424A4A39424A39424A313952424A4A394252424A4A3139 + 52424A4A394252424A4A3942FFFFFF0000004229313929294229313929294229 + 3142293139292942293142293142293142293142293142313142293142313142 + 3131392931423131423131423131392931423131423139422931423139423131 + 4229314231314229314231394231314231394231314231314231394A31394A31 + 394A31394A31394A31394A31394A31394231394A31394A31394A31394A31394A + 31394A39424A31394A39424A31394A31394A31314A31394A31394A3942423139 + 4A39424A39424A31394A39424A39424A31394A39424A39424A39424A39424A39 + 424A39424A39424A39424A39424A39424A31394A31394A3942524A5242395A42 + 426342426342426331315A29294A29294A31315A29294A31315A42314A4A394A + 52424A52424A52424A4A394252424A4A39424A39424A39424A394252424A5242 + 4A4A394252424A4A394252424A4A39424A394252424A4A39424A394252424A4A + 39424A39424A394252424A52424A52424A5A424A4A394252424A4A39425A424A + 4A394252424A4A394252424A4A39424A39424A313952424A52424A4A39425242 + 4A5A424A52424A52424A52424A52424A4A394252424A52424A4A394252424A4A + 394252424A52424A4A39424A39424A39424A3942FFFFFF000000392929422931 + 3929293929294229313929294229313929294229313929294229313929294231 + 3942293142313142293142313142293142313139293142313142293142313142 + 31314231314231314231314231394231314231314231394231314231394A3131 + 4A31394A31394A31394A31394A31394A31394231394231394A31394A31394A31 + 394A31394A31394A31394A31394A31394A31394A31394A31394A39424231394A + 39424A31394A39424A31394A39424A31394A39424A31394A39424A39424A3942 + 4A39424A39424A39424A31394A39424A39424A39424A39424A39424A31394A39 + 424A31394A313952424A4A39424A394A524A524A425A4A425A4A394A4A394A52 + 424A4A39424A394252424A4A394252424A4A394252424A4A39424A39424A3942 + 4A39424A394252424A4A39424A39424A39424A39424A39424A394252424A4A39 + 424A394252424A4A394252424A52424A52424A52424A52424A52424A5A424A52 + 424A52424A52424A4A394252424A4A394252424A4A394252424A4A39424A3942 + 52424A4A394252424A4A39424A39425A424A4A39424A39424A39424A31394A39 + 4252424A4A394252424A4A39424A39424A394252424A4A39424A3942FFFFFF00 + 0000 + } + Stretch = True + end + object MoContact: TMemo + Left = 250 + Height = 72 + Top = 21 + Width = 182 + BorderStyle = bsNone + Color = clBtnFace + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial' + Lines.Strings = ( + 'Having trouble ' + 'parameterizing?' + 'Click the icon on the left.' + ) + ParentFont = False + ReadOnly = True + TabOrder = 0 + end + object BtnOK: TButton + Left = 317 + Height = 20 + Top = 107 + Width = 60 + Cancel = True + Caption = '&OK' + Default = True + ModalResult = 1 + TabOrder = 1 + end + object MmError: TMemo + Left = 242 + Height = 72 + Top = 140 + Width = 190 + Color = clScrollBar + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'MS Sans Serif' + ParentFont = False + TabOrder = 2 + end +end diff --git a/modelshell/trouble.pas b/modelshell/trouble.pas new file mode 100644 index 0000000..d20694e --- /dev/null +++ b/modelshell/trouble.pas @@ -0,0 +1,79 @@ +unit TROUBLE; + +interface + +uses + SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; + +type + TFmTrouble = class(TForm) + Image1: TImage; + MoContact: TMemo; + BtnOK: TButton; + MmError: TMemo; + procedure Image1Click(Sender: TObject); + procedure FormShow(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + FmTrouble: TFmTrouble; + +implementation + +{$R *.lfm} + +procedure TFmTrouble.FormShow(Sender: TObject); +begin + // SetWindowPos(FmTrouble.Handle, HWND_TOPMOST, + // 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); +end; + +procedure TFmTrouble.Image1Click(Sender: TObject); +begin + MessageDlg('Take a break, go get a snack.', mtConfirmation, [mbOK],0); +end; + +end. + +interface + +uses + SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; + +type + TFmTrouble = class(TForm) + Image1: TImage; + MoContact: TMemo; + BtnOK: TButton; + MmError: TMemo; + procedure Image1Click(Sender: TObject); + procedure FormShow(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + FmTrouble: TFmTrouble; + +implementation + +{$R *.lfm} + +procedure TFmTrouble.FormShow(Sender: TObject); +begin + // SetWindowPos(FmTrouble.Handle, HWND_TOPMOST, + // 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); +end; + +procedure TFmTrouble.Image1Click(Sender: TObject); +begin + MessageDlg('Take a break, go get a snack.', mtConfirmation, [mbOK],0); +end; + +end.