1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
PACKETmodellbasisDEFINESinfotextauswahl,auskunftsdienst,modellmitdatenfuellen,listemodellbanken,anzahlmodellbanken,listedermodelle,anzahldglmodelle,anzahlwdmodelle,anzahlausfuehrbarerwdmodelle,fuegeein,loesche,modelldatenraum,neuebank,modellbankvolldgl,modellbankvollwd,modellbankvoll,copy,modellaktuell,MODELLDGL,compilierbaregleichungen,modellname,modellbezeichnung,informationstext,vorgabekurve,vorgabevergleichskurve,:=,modellerfassung,nilmodell,kopplean,wdmodelle,wddsnamen,wdeinfuegen,wdumbenennen,komprimiere,KRITERIUM,allemodelle,alleaenderbaren,allelauffaehigen,schickeanmanagertask,putgetformular1:
LETesc=""27"",return=""13"",rechts=""2"",links=""8"",hoch=""3"",runter=""10"",tab=""9"",dsname="Modell Infodatei",auskunftseite1=""28"",allgemeineauskunftseite2=""29""30""31"",auskeingabebeispiel=""42"",auskdatenkorrekt=""43"",auskfehlerfestgestellt=""44"",auskgleichungunvollstaendig=""45"",ausklabelzulang=""46"",ausklabeldoppelt=""47""48"",auskcompilunbekkomm=""49"" ,auskcompilparameter=""50"" ,auskcompilsymbole=""51""52"" ,auskkeinegleichungen=""53"",auskunftzummodellerfassenseite2=""54""56"",auskvariablen=59,auskmodell=62,auskgleichungen=63,auskparameter=64,auskcompilungueltzw=""65""66"" ,auskcompilmehrfdekl=""67"" ,auskcompilsonstiges=""68"" ;
LETmaxmodelle=40,maxdglmodelle=20,maxwdmodelle=20,maxdialogpkt=20,maxinterpretlaenge=2000,terminaltaskname="ARBEITSPLATZ",geraetekanal=1,simulationneustarten=10,typnrmodellbank=1199,typnrwdausfuehrbar=1207,dglsuffix="(DGL)",wdsuffix=" (WD)",maxdimension=20,maxparameter=20,typnrmodell=1077,maxvarlaenge=30,maxinfo=50,maxgleichungen=50,maxdarstellungszeilen=500,uebersetzbar=0,notuebersetzbar=1,endezeichen="zZz",sp=" ",praefix="d ",modellcode=" code info ds",originalkurve=" originalkurve ds",vergleichskurve=" vergleichskurve ds",darstellungskopf=" PROC darstellung 4 (LOESUNG VAR lsg, BOOL VAR in demo, TEXT VAR taste):",darstellungsende=" END PROC darstellung 4 ;";LETbtsimulationunmoeglich=63,btwartenallgemein=44,btwartenwaehrendspeichern=87,btwartenwaehrenddrucken=88;INT CONSTexistiertnicht:=-1,nichtempfangsbereit:=-2;LETabbruchtaste="a",abbruchtastemenu="m",auskunftstaste="i",auskunftsloeschtaste1="z",auskunftsloeschtaste2="l",weitertaste="w",blaettertaste="b",speichertaste="s",zuruecktaste="z",simulationstaste="w",prueftaste="p",drucktaste="d",dupliziertaste="k",loeschtaste="-",wiedergabetaste="+",spalte3=3,infozeilenanfang=19,ersteseingabefeld=2,beginnseite1=1,endeseite1=10,beginnseite2=11,endeseite2=20,bildschirmzeilen=10,maxzeileneingabe=20,maxvarparaanzahl=61,maxvariablenlaenge=7,maxparlaenge=30,maxmodellnamelang=30,maxmodellnamelangaufgeblaeht=40,maxmodellnamekurz=15,stmenuoderweiter=33,auskihrfehler=7,auskpruefung=13,auskgespeichert=14,auskinfogedruckt=15;LETunbekkommdo="unbekanntes Kommando",undefdyadischop="undefinierter dyadischer",undefmonadop="undefinierter monadischer",paramsindfalsch="Typen der Parameter sind falsch",nurletzteanweisg="nur die letzte Anweisung",anstelledessymb="anstelle des letzten Symbols",unzulselektsymb="unzulaessiges Selektor-Symbol",konstdarfnicht="die Konstante darf nicht veraendert",klammerauffehlt="'(' fehlt",klammerzufehlt="')' fehlt",operatorfehlt="';' oder Operator ('+',",ungueltigzwischen="ungueltig zwischen Anweisungen",istmehrfachdekl="ist mehrfach deklariert";LETfehlertaste=4,fehlerparameterzulang=28,fehlerkopierposition=29,fehlerlangname=80,fehlerkurzname=81,fehlerlangnamefehlt=82,fehlerkurznamefehlt=83,fehlergleichungsart=85,fehlergleichungsartfehlt=86,fehlergleichungfehlt=87,fehlervariable=88,fehlervariablefehlt=89,fehlervariablezulang=90,fehlerdoppeldeklaration=91,fehlermodellnamedoppelt=92,fragenochmalspeichern=93,fehlervundgdoppelt=94,fehlerzeitvariabledoppelt=95,fragehierabspeichern=96,mldcursorbenutzung=97,mldnichtablauffaehig=98;TEXT CONSTgleichungsunterstriche:=60*"_"+140*" ",variablenunterstriche:=maxvariablenlaenge*"_",parameterunterstriche:=8*"_"+22*" ",leeresfeld:=77*" ",unterstrichfeld:=77*"-";TYPE KRITERIUM=INT;KRITERIUM CONSTallemodelle:=0,alleaenderbaren:=1,allelauffaehigen:=2;OP:=(KRITERIUM VARt,INT CONSTi):CONCR(t):=iENDOP:=;BOOL OP=(KRITERIUM CONSTlinks,rechts):CONCR(links)=CONCR(rechts)END OP=;LET ZEILE=STRUCT(TEXTgleichungsart,gleichung,variable,INTnummer);TYPE MODELLBANK=STRUCT(INTanzahldglmodelle,ROWmaxdglmodelleMODELLDGLmodelle,THESAURUSwdmodelle,wddsnamen);TYPE DEMOLAUF=STRUCT(VORGABEoriginal,vergleich,INTxindex,yindex,BOOLautomatisch,TEXTvariablenwahl);TYPE VORGABE=STRUCT(TEXTstartwert,parameter,REALanfangszeitpunkt,beobachtungsdauer,TEXTkurve);TYPE LOESUNG=STRUCT(ZUSTANDstartwert,PARAMETERparameter,REALanfangszeitpunkt,beobachtungsdauer,KURVEkurve);TYPE NAMEN=STRUCT(TEXTelan,lang,kurz);TYPE ZUSTANDSDATEN=STRUCT(INTanzahl,TEXToberbegriff,oberbegriffkurzform,ROWmaxdimensionTEXTnamelang,namekurz,TEXTunteregrenze,oberegrenze,randoben,randunten);TYPE COVARIABLENDATEN=STRUCT(INTanzahl,ROWmaxdimensionTEXTnamelang,namekurz);TYPE KOMBINATION=STRUCT(TEXTname,INTxindex,yindex,BOOLautomatisch);TYPE KOMBINATIONSANGEBOT=STRUCT(BOOLmitkombinationen,INTanzahl,ROWmaxdimensionKOMBINATIONpaar);TYPE PARAMETERDATEN=STRUCT(INTanzahl,ROWmaxparameterTEXTnamelang,nameelan,TEXTunteregrenze,oberegrenze);TYPE DARSTELLUNGSDATEN=STRUCT(BOOLimmodell,TEXTname);TYPE BESCHRAENKUNG=STRUCT(
REALminbeobachtungsdauer,maxbeobachtungsdauer,minanfangszeitpunkt,maxanfangszeitpunkt,INTanzahlbeobachtungspunkte);LET TEXTDATEN=BOUND STRUCT(ROWmaxinfoTEXTinfo,ROWmaxgleichungenTEXTgleichungen,cogleichungen,ROWmaxdarstellungszeilenTEXTdarstellungscode);TYPE MODELLDGL=STRUCT(NAMENname,ZUSTANDSDATENvariablen,COVARIABLENDATENcovariablen,PARAMETERDATENparameter,DARSTELLUNGSDATENdarstellung,BOOLmitphasendiagramm,BOOLganzzahlig,KOMBINATIONSANGEBOTkombinationen,TEXTcodeundinfo,BESCHRAENKUNGbeschraenkung,DEMOLAUFdemolauf,INTmodellzustand,BOOLgeschuetzt);BOUND MODELLBANK VARmb;MODELLDGL VARmodell;TEXTDATEN VARtextdaten;TEXT PROCmodellbezeichnung:modell.name.lang.END PROCmodellbezeichnung;TEXT PROCmodellkurzbezeichnung:modell.name.kurz.END PROCmodellkurzbezeichnung;TEXT PROCmodellname:modell.name.elan.END PROCmodellname;TEXT PROCmodelldatenraum:modell.codeundinfo.END PROCmodelldatenraum;BOOL PROCcompilierbaregleichungen:modell.modellzustand=uebersetzbarEND PROCcompilierbaregleichungen;INT PROCdimension:modell.variablen.anzahl.END PROCdimension;INT PROCcodimension:modell.covariablen.anzahl.END PROCcodimension;INT PROCparameteranzahl:modell.parameter.anzahl.END PROCparameteranzahl;BOOL PROCmitzusatzdarstellung:modell.darstellung.immodell.END PROCmitzusatzdarstellung;BOOL PROCmitphasendiagramm:modell.mitphasendiagramm.END PROCmitphasendiagramm;BOOL PROCergebnisganzzahlig:modell.ganzzahlig.END PROCergebnisganzzahlig;DATASPACE VARtextds;PROCinformationstext(FILE VARtexte):forget(textds);textds:=nilspace;texte:=sequentialfile(output,textds);holeinformationstext.holeinformationstext:TEXT VARsatz:="";INT VARi;IFmodell.geschuetztTHENputline(texte," "+modellbezeichnung);putline(texte," "+(areaxsize(grossesrahmenfenster)-2)*waagerecht);FI;FORiFROM1UPTOmaxinfoWHILEtextdaten.info(i)<>endezeichenREPsatz:=textdaten.info(i);putline(texte,satz);PER;.END PROCinformationstext;TEXT PROCvariablenname(INT CONSTi):TEXT CONSTt:=(modell.variablen.namelang(i));t+(maxvarlaenge-LENGTH(t))*" ".END PROCvariablenname;TEXT PROCvariablenkurzform(INT CONSTi):modell.variablen.namekurz(i).END PROCvariablenkurzform;TEXT PROCcovariablenname(INT CONSTi):TEXT CONSTt:=modell.covariablen.namelang(i);t+(maxvarlaenge-LENGTH(t))*" ".END PROCcovariablenname;TEXT PROCcovariablenkurzform(INT CONSTi):modell.covariablen.namekurz(i).END PROCcovariablenkurzform;TEXT PROCparametername(INT CONSTi):modell.parameter.namelang(i).END PROCparametername;TEXT PROCparameterkurzform(INT CONSTi):modell.parameter.nameelan(i).END PROCparameterkurzform;TEXT PROCdarstellungsname:modell.darstellung.name.END PROCdarstellungsname;PARAMETER PROCvorgabeparameter:parameter(modell.demolauf.original.parameter).END PROCvorgabeparameter;REAL PROCvorgabeanfangszeitpunkt:modell.demolauf.original.anfangszeitpunkt.END PROCvorgabeanfangszeitpunkt;ZUSTAND PROCvorgabevergleichssystemzustand:zustand(modell.demolauf.vergleich.startwert).END PROCvorgabevergleichssystemzustand;PARAMETER PROCvorgabevergleichsparameter:parameter(modell.demolauf.vergleich.parameter).END PROCvorgabevergleichsparameter;ZUSTAND PROCzustandunteregrenze:zustand(modell.variablen.unteregrenze).END PROCzustandunteregrenze;ZUSTAND PROCzustandoberegrenze:zustand(modell.variablen.oberegrenze).END PROCzustandoberegrenze;PARAMETER PROCparameteroberegrenze:parameter(modell.parameter.oberegrenze).END PROCparameteroberegrenze;PARAMETER PROCparameterunteregrenze:parameter(modell.parameter.unteregrenze).END PROCparameterunteregrenze;ZUSTAND PROCrandoben:zustand(modell.variablen.randoben).END PROCrandoben;ZUSTAND PROCrandunten:zustand(modell.variablen.randunten).END PROCrandunten;REAL PROCminbeobachtungsdauer:modell.beschraenkung.minbeobachtungsdauer.END PROCminbeobachtungsdauer;REAL PROCmaxbeobachtungsdauer:modell.beschraenkung.maxbeobachtungsdauer.END PROCmaxbeobachtungsdauer;REAL PROCminanfangszeitpunkt:modell.beschraenkung.minanfangszeitpunkt.END PROCminanfangszeitpunkt;REAL PROCmaxanfangszeitpunkt:modell.beschraenkung.maxanfangszeitpunkt.END PROC
maxanfangszeitpunkt;INT PROCanzahlbeobachtungspunkte:modell.beschraenkung.anzahlbeobachtungspunkte.END PROCanzahlbeobachtungspunkte;BOOL PROCmitkombinationen:modell.kombinationen.mitkombinationen.END PROCmitkombinationen;PROClistekombinationen(ROWmaxdimensionTEXT VARnamen,INT VARanzahl):INT VARi;anzahl:=modell.kombinationen.anzahl;FORiFROM1UPTOanzahlREPnamen(i):=modell.kombinationen.paar(i).name;PER;END PROClistekombinationen;PROCindiceskombinationen(INT CONSTkombnr,INT VARxachse,yachse,BOOL VARvertauschbar):xachse:=modell.kombinationen.paar(kombnr).xindex;yachse:=modell.kombinationen.paar(kombnr).yindex;vertauschbar:=modell.kombinationen.paar(kombnr).automatisch;END PROCindiceskombinationen;ZUSTAND PROCvorgabesystemzustand:zustand(modell.demolauf.original.startwert).END PROCvorgabesystemzustand;REAL PROCvorgabebeobachtungsdauer:modell.demolauf.original.beobachtungsdauer.END PROCvorgabebeobachtungsdauer;TEXT PROCvorgabekurve:modell.demolauf.original.kurve.END PROCvorgabekurve;REAL PROCvorgabevergleichsanfangszeitpunkt:modell.demolauf.vergleich.anfangszeitpunkt.END PROCvorgabevergleichsanfangszeitpunkt;REAL PROCvorgabevergleichsbeobachtungsdauer:modell.demolauf.vergleich.beobachtungsdauer.END PROCvorgabevergleichsbeobachtungsdauer;TEXT PROCvorgabevergleichskurve:modell.demolauf.vergleich.kurve.END PROCvorgabevergleichskurve;ZUSTAND PROCdemomuster:zustand(modell.demolauf.variablenwahl).END PROCdemomuster;BOOL PROCdemoautomatik:modell.demolauf.automatisch.END PROCdemoautomatik;INT PROCdemoxindex:modell.demolauf.xindexEND PROCdemoxindex;INT PROCdemoyindex:modell.demolauf.yindexEND PROCdemoyindex;TEXT PROCgleichung(INT CONSTi):textdaten.gleichungen(i)END PROCgleichung;TEXT PROCcogleichung(INT CONSTi):textdaten.cogleichungen(i)END PROCcogleichung;TEXT PROCdarstellungszeile(INT CONSTi):textdaten.darstellungscode(i)END PROCdarstellungszeile;PROCkopplean(MODELLDGL VARaktuellesmodell):modell:=aktuellesmodell;IFexists(modell.codeundinfo)THENtextdaten:=old(modell.codeundinfo);FI END PROCkopplean;PROCkopplean(INT CONSTaktuellesmodell):IFdglmodellTHENmodell:=mb.modelle(aktuellesmodell);IFexists(modell.codeundinfo)THENtextdaten:=old(modell.codeundinfo)FI FI.dglmodell:aktuellesmodell<=maxdglmodelle.END PROCkopplean;MODELLDGL PROCmodellaktuell(INT CONSTaktuellesmodell):mb.modelle(aktuellesmodell).END PROCmodellaktuell;PROCnilmodell(MODELLDGL VARmod):initialisieremodell.initialisieremodell:INT VARi;mod.name.elan:="";mod.name.lang:="";mod.name.kurz:="";mod.variablen.anzahl:=0;mod.variablen.oberbegriff:="";mod.variablen.oberbegriffkurzform:="";FORiFROM1UPTOmaxdimensionREPmod.variablen.namelang(i):="";mod.variablen.namekurz(i):="";PER;mod.variablen.unteregrenze:="";mod.variablen.oberegrenze:="";mod.variablen.randoben:="";mod.variablen.randunten:="";mod.covariablen.anzahl:=0;FORiFROM1UPTOmaxdimensionREPmod.covariablen.namelang(i):="";mod.covariablen.namekurz(i):="";PER;mod.parameter.anzahl:=0;FORiFROM1UPTOmaxparameterREPmod.parameter.namelang(i):="";mod.parameter.nameelan(i):="";PER;mod.parameter.unteregrenze:="";mod.parameter.oberegrenze:="";mod.darstellung.immodell:=FALSE;mod.darstellung.name:="";mod.mitphasendiagramm:=FALSE;mod.ganzzahlig:=FALSE;mod.demolauf.vergleich.startwert:="";mod.demolauf.vergleich.parameter:="";mod.demolauf.vergleich.beobachtungsdauer:=0.0;mod.demolauf.vergleich.anfangszeitpunkt:=0.0;mod.demolauf.vergleich.kurve:="";mod.demolauf.original.startwert:="";mod.demolauf.original.parameter:="";mod.demolauf.original.anfangszeitpunkt:=0.0;mod.demolauf.original.beobachtungsdauer:=0.0;mod.demolauf.original.kurve:="";mod.demolauf.xindex:=0;mod.demolauf.yindex:=0;mod.demolauf.automatisch:=FALSE;mod.demolauf.variablenwahl:="";mod.kombinationen.mitkombinationen:=FALSE;mod.kombinationen.anzahl:=0;FORiFROM1UPTOmaxdimensionREPmod.kombinationen.paar(i).xindex:=0;mod.kombinationen.paar(i).yindex:=0;mod.kombinationen.paar(i).automatisch:=FALSE;mod.kombinationen.paar(i).name:="";PER;mod.beschraenkung.minbeobachtungsdauer:=0.0;mod.beschraenkung
.maxbeobachtungsdauer:=0.0;mod.beschraenkung.minanfangszeitpunkt:=0.0;mod.beschraenkung.maxanfangszeitpunkt:=0.0;mod.beschraenkung.anzahlbeobachtungspunkte:=0;mod.modellzustand:=notuebersetzbar;mod.geschuetzt:=FALSE;END PROCnilmodell;PROCbildedsnamenneu(MODELLDGL VARmod,TEXT CONSTmodellbank,INT CONSTmodellnr):mod.codeundinfo:=modellbank+sp+text(modellnr)+modellcode;mod.demolauf.original.kurve:=modellbank+sp+text(modellnr)+originalkurve;mod.demolauf.vergleich.kurve:=modellbank+sp+text(modellnr)+vergleichskurve;END PROCbildedsnamenneu;PROCgleichungsprozeduren(TEXT CONSTdateiname):forget(dateiname,quiet);FILE VARprog:=sequentialfile(output,dateiname);schreibegleichungsproz;schreibecogleichungsproz;schreibedarstellung4;.schreibegleichungsproz:putline(prog,"ZUSTAND PROC f (REAL CONST zeit, "+" ZUSTAND CONST alter zustand, "+" PARAMETER CONST alle parameter):");deklarationen;gleichungen;ergebnis;putline(prog,"END PROC f;");.schreibecogleichungsproz:putline(prog,"ZUSTAND PROC co f (REAL CONST zeit, "+" ZUSTAND CONST alter zustand, "+" PARAMETER CONST alle parameter):");deklarationenvoncof;cogleichungen;cofergebnis;putline(prog,"END PROC co f;").gleichungen:FORiFROM1UPTOmaxgleichungenWHILEgleichung(i)<>endezeichenREPputline(prog,gleichung(i));PER.cogleichungen:INT VARi;FORiFROM1UPTOmaxgleichungenWHILEcogleichung(i)<>endezeichenREPputline(prog,cogleichung(i));PER;.deklarationen:putline(prog,"ZUSTAND VAR dvektorxyx"+" := neuer zustand (DSUB alter zustand);");IFdimension>0THENputline(prog,"REAL CONST ");FORiFROM1UPTOdimensionREPput(prog,elan(variablenkurzform(i))+" :: ");IFi=dimensionTHENputline(prog,"alter zustand SUB "+text(i)+" ;");ELSEputline(prog,"alter zustand SUB "+text(i)+" ,");FI PER FI;IFparameteranzahl>0THENputline(prog,"REAL CONST ");FORiFROM1UPTOparameteranzahlREPput(prog,elan(parameterkurzform(i))+" :: ");IFi=parameteranzahlTHENputline(prog,"alle parameter SUB "+text(i)+" ;");ELSEputline(prog,"alle parameter SUB "+text(i)+" ,");FI;PER;FI;IFdimension>0THENput(prog,"REAL VAR ");FORiFROM1UPTOdimensionREPput(prog,praefix+elan(variablenkurzform(i)));IFi=dimensionTHENputline(prog,";")ELSEputline(prog,",")FI;PER;FI;.ergebnis:putline(prog,"ergebnisxyx .");putline(prog,"ergebnisxyx : ");FORiFROM1UPTOdimensionREPputline(prog,"replace (dvektorxyx ,"+text(i)+","+praefix+elan(variablenkurzform(i))+" );");PER;putline(prog,"dvektorxyx.");.deklarationenvoncof:putline(prog,"ZUSTAND VAR dvektorxyx"+" := neuer zustand ( co dimension);");IFdimension>0THENputline(prog,"REAL CONST ");FORiFROM1UPTOdimensionREPput(prog,elan(variablenkurzform(i))+" :: ");IFi=dimensionTHENputline(prog,"alter zustand SUB "+text(i)+" ;");ELSEputline(prog,"alter zustand SUB "+text(i)+" ,");FI;PER;FI;IFparameteranzahl>0THENputline(prog,"REAL CONST ");FORiFROM1UPTOparameteranzahlREPput(prog,elan(parameterkurzform(i))+" :: ");IFi=parameteranzahlTHENputline(prog,"alle parameter SUB "+text(i)+" ;");ELSEputline(prog,"alle parameter SUB "+text(i)+" ,");FI;PER;FI;IFcodimension>0THENput(prog,"REAL VAR ");FORiFROM1UPTOcodimensionREPput(prog,elan(covariablenkurzform(i)));IFi=codimensionTHENputline(prog,";")ELSEputline(prog,",")FI;PER;FI;.cofergebnis:putline(prog,"ergebnisxyx .");putline(prog,"ergebnisxyx : ");FORiFROM1UPTOcodimensionREPputline(prog,"replace (dvektorxyx ,"+text(i)+","+elan(covariablenkurzform(i))+" );");PER;putline(prog,"dvektorxyx.");.schreibedarstellung4:IFmitzusatzdarstellungTHENschreibedarstellungscodeELSEschreibeleerenprozedurkopfFI.schreibeleerenprozedurkopf:putline(prog,darstellungskopf);putline(prog,darstellungsende);.schreibedarstellungscode:FORiFROM1UPTOmaxdarstellungszeilenWHILEdarstellungszeile(i)<>endezeichenREPputline(prog,darstellungszeile(i));PER.END PROCgleichungsprozeduren;TEXT PROCelan(TEXT CONSTalt):INT VARi:=1;TEXT VARt:="";FORiFROM1UPTO(LENGTHalt)REP IF(tanderstellei>=97CANDtanderstellei<=122)COR(tanderstellei>216CANDtanderstellei<=219)COR(tanderstellei>=48CANDtanderstellei<=57)THENtCATsubtext(alt,i,i)ELIF(tanderstellei>=65CANDtanderstellei<=
90)THENtCATcode(tanderstellei+32)ELIF(tanderstellei>=214CANDtanderstellei<=216)THENtCATcode(tanderstellei+3)ELSEtCAT" "FI PER;t.tanderstellei:code(subtext(alt,i,i))END PROCelan;OP:=(MODELLDGL VARmod,MODELLDGL CONSTm):CONCR(mod.name):=CONCR(m.name);CONCR(mod.variablen):=CONCR(m.variablen);CONCR(mod.covariablen):=CONCR(m.covariablen);CONCR(mod.parameter):=CONCR(m.parameter);CONCR(mod.darstellung):=CONCR(m.darstellung);mod.mitphasendiagramm:=m.mitphasendiagramm;mod.ganzzahlig:=m.ganzzahlig;mod.kombinationen.mitkombinationen:=m.kombinationen.mitkombinationen;mod.kombinationen.anzahl:=m.kombinationen.anzahl;INT VARi;FORiFROM1UPTOmaxdimensionREP CONCR(mod.kombinationen.paar(i)):=CONCR(m.kombinationen.paar(i))PER;mod.codeundinfo:=m.codeundinfo;CONCR(mod.beschraenkung):=CONCR(m.beschraenkung);CONCR(mod.demolauf.original):=CONCR(m.demolauf.original);CONCR(mod.demolauf.vergleich):=CONCR(m.demolauf.vergleich);mod.demolauf.xindex:=m.demolauf.xindex;mod.demolauf.yindex:=m.demolauf.yindex;mod.demolauf.automatisch:=m.demolauf.automatisch;mod.demolauf.variablenwahl:=m.demolauf.variablenwahl;mod.modellzustand:=m.modellzustand;mod.geschuetzt:=m.geschuetztEND OP:=;PROCloesche(INT CONSTmodellnr,TEXT CONSTmodellbankname):INT VARi;disablestop;IFdglmodellTHENforget(mb.modelle(modellnr).demolauf.original.kurve,quiet);forget(mb.modelle(modellnr).demolauf.vergleich.kurve,quiet);forget(mb.modelle(modellnr).codeundinfo,quiet);rueckedieanderenmodelleaufELSEforget(name(wddsnamen,modellindex),quiet);delete(mb.wddsnamen,modellindex);delete(mb.wdmodelle,modellindex);FI;enablestop.dglmodell:modellnr<=maxdglmodelle.modellindex:modellnr-maxdglmodelle.rueckedieanderenmodelleauf:FORiFROMmodellnr+1UPTOmb.anzahldglmodelleREPmb.modelle(i-1):=mb.modelle(i);bildedsnamenneu(mb.modelle(i-1),modellbankname,i-1);IFexists(mb.modelle(i).codeundinfo)THENrename(mb.modelle(i).codeundinfo,mb.modelle(i-1).codeundinfo);FI;KURVE VARkurvezurumbenennung,altekurve;IFexists(mb.modelle(i).demolauf.original.kurve)THENaltekurve:=old(mb.modelle(i).demolauf.original.kurve);copy(kurvezurumbenennung,mb.modelle(i-1).demolauf.original.kurve,altekurve);forget(mb.modelle(i).demolauf.original.kurve,quiet);FI;IFexists(mb.modelle(i).demolauf.vergleich.kurve)THENaltekurve:=old(mb.modelle(i).demolauf.vergleich.kurve);copy(kurvezurumbenennung,mb.modelle(i-1).demolauf.vergleich.kurve,altekurve);forget(mb.modelle(i).demolauf.vergleich.kurve,quiet);FI;PER;mb.anzahldglmodelleDECR1;.END PROCloesche;PROCneuebank(TEXT CONSTmodellbankname):INT VARi;IF NOTexists(modellbankname)CAND NOT(modellbankname="")THENmb:=new(modellbankname);type(old(modellbankname),typnrmodellbank);initialisierebank;FI.initialisierebank:mb.anzahldglmodelle:=0;FORiFROM1UPTOmaxdglmodelleREPnilmodell(mb.modelle(i));PER;mb.wdmodelle:=emptythesaurus;mb.wddsnamen:=emptythesaurus.END PROCneuebank;PROCkopplean(TEXT CONSTmodellbankname):IFexists(modellbankname)THENmb:=old(modellbankname)FI END PROCkopplean;PROClistemodellbanken(ROWmaxdialogpktTEXT VARnamensliste,INT VARanzahlbanken):suchedateienmitrichtigemtyp;.suchedateienmitrichtigemtyp:anzahlbanken:=0;TEXT VARname,d;beginlist;getlistentry(name,d);WHILEname<>""REP IFtype(old(name))=typnrmodellbankTHENanzahlbankenINCR1;namensliste(anzahlbanken):=name;FI;getlistentry(name,d);PER.END PROClistemodellbanken;INT PROCanzahlmodellbanken:INT VARanzahlbanken;suchedateienmitrichtigemtyp;anzahlbanken.suchedateienmitrichtigemtyp:anzahlbanken:=0;TEXT VARname,d;beginlist;getlistentry(name,d);WHILEname<>""REP IFtype(old(name))=typnrmodellbankTHENanzahlbankenINCR1;FI;getlistentry(name,d);PER;.END PROCanzahlmodellbanken;PROCloesche(TEXT CONSTmbname):kopplean(mbname);INT VARi;FORiFROM1UPTOmb.anzahldglmodelleREPforget(mb.modelle(i).demolauf.original.kurve,quiet);forget(mb.modelle(i).demolauf.vergleich.kurve,quiet);forget(mb.modelle(i).codeundinfo,quiet)PER;doquiet(PROC(TEXT CONST,QUIET CONST)forget,mb.wddsnamen);forget(mbname,quiet);END PROCloesche;PROCdoquiet(PROC(TEXT CONST,QUIET CONST)f,THESAURUS CONSTt):INT
VARi:=0;TEXT VARname;WHILEi<highestentry(t)REPget(t,name,i);IFname<>""THENf(name,quiet)FI PER;END PROCdoquiet;PROClistedermodelle(ROWmaxmodelleTEXT VARnamensliste,ROWmaxmodelleINT VARmodelliste,KRITERIUM CONSTkriterium,INT VARmodellzaehler):INT VARmodnr;holemodellnamen.holemodellnamen:modellzaehler:=0;FORmodnrFROM1UPTOmb.anzahldglmodelleREPholedglnamen;PER;modnr:=0;WHILEmodnr<highestentry(mb.wdmodelle)REPholewdnamenPER.holewdnamen:TEXT VARmodellname;get(mb.wdmodelle,modellname,modnr);IFwdmodellerfuelltdaskriteriumTHENmodellzaehlerINCR1;namensliste(modellzaehler):=text(modellname,maxmodellnamelangaufgeblaeht)+sp+wdsuffix;modelliste(modellzaehler):=modnr+maxdglmodelle;FI.holedglnamen:IFdglmodellerfuelltdaskriteriumTHENmodellzaehlerINCR1;namensliste(modellzaehler):=text(mb.modelle(modnr).name.lang,maxmodellnamelangaufgeblaeht)+sp+dglsuffix;modelliste(modellzaehler):=modnrFI.wdmodellerfuelltdaskriterium:kriterium=allemodelleCORkriterium=alleaenderbarenCOR(kriterium=allelauffaehigenCANDwdmodelllauffaehig).wdmodelllauffaehig:type(old(name(mb.wddsnamen,modnr)))=typnrwdausfuehrbar.dglmodellerfuelltdaskriterium:kriterium=allemodelleCOR(kriterium=alleaenderbarenCANDdglmodellaenderbar)COR(kriterium=allelauffaehigenCANDdglmodelllauffaehig).dglmodellaenderbar:NOTmb.modelle(modnr).geschuetzt.dglmodelllauffaehig:mb.modelle(modnr).modellzustand=uebersetzbar.END PROClistedermodelle;PROClistedermodelle(INT VARanzahlveraenderbar,anzahlausfuehrbar):INT VARmodnr;anzahlveraenderbar:=0;anzahlausfuehrbar:=0;FORmodnrFROM1UPTOmb.anzahldglmodelleREPzaehlehochPER;anzahlveraenderbarINCRanzahlwdmodelle;anzahlausfuehrbarINCRanzahlausfuehrbarerwdmodelle.zaehlehoch:IF NOT(mb.modelle(modnr).geschuetzt)THENanzahlveraenderbarINCR1FI;IFmb.modelle(modnr).modellzustand=uebersetzbarTHENanzahlausfuehrbarINCR1FI.END PROClistedermodelle;INT PROCanzahldglmodelle:mb.anzahldglmodelleEND PROCanzahldglmodelle;BOOL PROCmodellbankvoll:(mb.anzahldglmodelle+anzahlwdmodelle)>=maxmodelleEND PROCmodellbankvoll;BOOL PROCmodellbankvolldgl:mb.anzahldglmodelle>=maxdglmodelleEND PROCmodellbankvolldgl;BOOL PROCmodellbankvollwd:anzahlwdmodelle>=maxwdmodelleEND PROCmodellbankvollwd;PROCfuegeein(TEXT CONSTmodellbank):INT VARreturncode;fuegeein(modellbank,returncode)END PROCfuegeein;PROCwdeinfuegen(TEXT CONSTmodellbank,TEXT CONSTlangname,kurzname):INT VARneuerindex:=0;THESAURUS VARt1:=mb.wdmodelle,t2:=mb.wddsnamen;disablestop;insert(mb.wdmodelle,langname,neuerindex);insert(mb.wddsnamen,modellbank+sp+text(neuerindex+maxdglmodelle)+sp+wdsuffix);diagrammnameneintragen(langname,kurzname);forget(name(mb.wddsnamen,neuerindex),quiet);aenderungenspeichern(name(mb.wddsnamen,neuerindex));IFiserrorTHENkonsistenzherstellenFI;.konsistenzherstellen:forget(name(mb.wddsnamen,neuerindex),quiet);mb.wdmodelle:=t1;mb.wddsnamen:=t2.END PROCwdeinfuegen;PROCwdumbenennen(TEXT CONSTlangname,kurzname,INT CONSTmodellnr):THESAURUS VARt:=mb.wdmodelle;disablestop;diagrammnameneintragen(langname,kurzname);rename(mb.wdmodelle,modellnr,langname);IFiserrorTHENclearerror;konsistenzherstellenFI;enablestop;.konsistenzherstellen:mb.wdmodelle:=t.END PROCwdumbenennen;PROCfuegeein(TEXT CONSTmodellbank,INT VARreturncode):INT VARneuesmodell;returncode:=1;BOOL VARmodellabgelegt:=FALSE;IF NOTmodellbankvolldglTHENmb.anzahldglmodelleINCR1;neuesmodell:=mb.anzahldglmodelle;nilmodell(mb.modelle(neuesmodell));bildedsnamenneu(mb.modelle(neuesmodell),modellbank,neuesmodell);loescheleereds;initgleichungsds;disablestop;modellerfassung(neuesmodell,modellbank,modellabgelegt);IFiserrorTHENclearerror;enablestop;loesche(neuesmodell,modellbank);errorstop(errormessage);ELIFlength(compress(mb.modelle(neuesmodell).name.lang))=0THENloesche(neuesmodell,modellbank);ELSE IFmodellabgelegtTHENreturncode:=0;FI;enablestop;FI FI.loescheleereds:forget(mb.modelle(neuesmodell).codeundinfo,quiet);forget(mb.modelle(neuesmodell).demolauf.original.kurve,quiet);forget(mb.modelle(neuesmodell).demolauf.vergleich.kurve,quiet);.initgleichungsds:textdaten:=new(mb.modelle(
neuesmodell).codeundinfo);type(old(mb.modelle(neuesmodell).codeundinfo),typnrmodell);textdaten.info(1):=endezeichen;textdaten.gleichungen(1):=endezeichen;textdaten.cogleichungen(1):=endezeichen;textdaten.darstellungscode(1):=endezeichen;.END PROCfuegeein;PROCcopy(INT CONSTaltesmodell,TEXT CONSTmodellbank):INT VARreturncode;copy(altesmodell,modellbank,returncode);END PROCcopy;PROCcopy(INT CONSTaltesmodell,TEXT CONSTmodellbank,INT VARreturncode):INT VARneuesmodell;returncode:=1;IF NOTmodellbankvolldglTHENmb.anzahldglmodelleINCR1;neuesmodell:=mb.anzahldglmodelle;mb.modelle(neuesmodell):=mb.modelle(altesmodell);bildedsnamenneu(mb.modelle(neuesmodell),modellbank,neuesmodell);IF(mb.modelle(altesmodell).codeundinfo)<>(mb.modelle(neuesmodell).codeundinfo)THENforget(mb.modelle(neuesmodell).codeundinfo,quiet);IFexists(mb.modelle(altesmodell).codeundinfo)THENcopy(mb.modelle(altesmodell).codeundinfo,mb.modelle(neuesmodell).codeundinfo);FI;disablestop;modellerfassung(neuesmodell,modellbank);IFiserrorTHENclearerror;enablestop;loesche(neuesmodell,modellbank);errorstop(errormessage);ELIFlength(compress(mb.modelle(neuesmodell).name.lang))=0CORmb.modelle(neuesmodell).name.lang=mb.modelle(altesmodell).name.langTHENloesche(neuesmodell,modellbank);ELSEreturncode:=0;FI;enablestop;FI;FI;END PROCcopy;THESAURUS PROCwdmodelle:mb.wdmodelleEND PROCwdmodelle;THESAURUS PROCwddsnamen:mb.wddsnamenEND PROCwddsnamen;INT PROCanzahlwdmodelle:INT VARi:=0,anzahl:=0;TEXT VARwdname:="";WHILEi<highestentry(mb.wdmodelle)REPget(mb.wdmodelle,wdname,i);IFwdname<>""THENanzahlINCR1FI PER;anzahlEND PROCanzahlwdmodelle;INT PROCanzahlausfuehrbarerwdmodelle:INT VARi:=0,anzahl:=0;TEXT VARwdname:="";WHILEi<highestentry(mb.wddsnamen)REPget(mb.wddsnamen,wdname,i);IFwdname<>""CANDausfuehrbarTHENanzahlINCR1FI PER;anzahl.ausfuehrbar:type(old(wdname))=typnrwdausfuehrbar.END PROCanzahlausfuehrbarerwdmodelle;DATASPACE VARfeldds,glzeileds,eingabeparameternameds;BOUND ROW100TEXT VARfeld;BOUND ROWmaxzeileneingabeZEILE VARglzeile;BOUND ROWmaxzeileneingabeTEXT VAReingabeparametername;TEXTDATEN VARgleichungsraum;TAG VARzweiteseite;INT VARzeilenzaehler,cursorfeld,pmerker,zmerker,anzahlparameter,gleichungsanzahl,egleichungsanzahl,dgleichungsanzahl;TEXT VARfehlertext,fehlermeldung,taste;INT CONSTseite1:=18,seite2:=2,infowahllang:=3,steuerzseite2:=4,steuerzseite3:=5,infoseite:=6,teilfeld:=7,infowahlkurz:=8;PROCmodellerfassung(INT VARmodellnr,TEXT CONSTmodellbank):enablestop;BOOL VARmodellabgelegt:=FALSE;modellerfassung(modellnr,modellbank,modellabgelegt);END PROCmodellerfassung;PROCmodellerfassung(INT VARmodellnr,TEXT CONSTmodellbank,BOOL VARmodellabgelegt):enablestop;MODELLDGL VARvorabmodell:=mb.modelle(modellnr);ZEILE VARzeilenmerker;INT VARfeldart,altefeldart;TEXT VARfeldmerker,modellcodeinfo,infotext,infos,lang:="",kurz:="",meldungsmerker;BOOL VARfalscheeingaben:=FALSE,tastenfehleralsletztes:=FALSE,explizitgespeichertaufseitezwei:=FALSE,explizitgespeichert:=FALSE;modellabgelegt:=FALSE;forget(feldds);feldds:=nilspace;feld:=feldds;fehlertext:="";initialisierungenfuermodelldatenerfassung;allefelderfreigeben;REPkernvonmodellerfassungPER.kernvonmodellerfassung:maskezurmodellinitialisierungausgeben(vorabmodell.name.lang,vorabmodell.name.kurz);REPexplizitgespeichert:=FALSE;putgetformular1(feld,cursorfeld,taste);IFtaste=abbruchtastemenuTHEN IFabspeicherngewuenschtTHENeingabendeserstenformularspruefen(lang,kurz,modellnr,falscheeingaben);IF NOTfalscheeingabenTHENvorabmodell.name.lang:=lang;vorabmodell.name.kurz:=kurz;vorabmodell.name.elan:=elan(kurz);speichereaufseiteeins;leavemodellerfassungFI;ELSEleavemodellerfassungFI ELIFtaste=auskunftstasteTHENinfotext:=auskunftseite1;fehlermeldung:="";auskunftsdienst(infotext,fehlermeldung,auskunftsloeschtaste1);show(formular(seite1));cursorfeld:=2;feld(1):=leeresfeld;footnote(steuerleiste(stmenuoderweiter));ELIFtaste=weitertasteTHENeingabendeserstenformularspruefen(lang,kurz,modellnr,falscheeingaben);IF NOTfalscheeingabenTHENvorabmodell.name.lang:=lang;
vorabmodell.name.kurz:=kurz;vorabmodell.name.elan:=elan(kurz);modelldatenerfassungFI ELSEfeld(1):=meldungstext(fehlertaste)FI;PER.speichereaufseiteeins:mb.modelle(modellnr):=vorabmodell;modellabgelegt:=TRUE;.leavemodellerfassung:forget(feldds);forget(glzeileds);forget(eingabeparameternameds);LEAVEmodellerfassung.modelldatenerfassung:REPkernvonmodelldatenerfassungPER.initialisierungenfuermodelldatenerfassung:forget(glzeileds);forget(eingabeparameternameds);glzeileds:=nilspace;eingabeparameternameds:=nilspace;glzeile:=glzeileds;eingabeparametername:=eingabeparameternameds;zweiteseite:=formular(seite2);bildedsnamenneu(vorabmodell,modellbank,modellnr);modellcodeinfo:=vorabmodell.codeundinfo;zwischenspeichermitmodelldatenfuellen(vorabmodell);.kernvonmodelldatenerfassung:maskezurmodelldatenerfassungausgeben(infos);meldungsmerker:=meldungstext(mldcursorbenutzung);tastenfehleralsletztes:=FALSE;explizitgespeichertaufseitezwei:=FALSE;REPexplizitgespeichert:=FALSE;vorabmodell.modellzustand:=notuebersetzbar;put(formular(teilfeld),infos,2);IFtastenfehleralsletztesTHENtastenfehleralsletztes:=FALSE;ELSEfeld(1):=meldungsmerker;FI;putget(zweiteseite,feld,cursorfeld,taste);feld(1):=meldungstext(mldcursorbenutzung);IFtaste=abbruchtasteTHEN IFabspeicherngewuenschtTHENspeichereaufseitezweiFI;leavemodellerfassungELIFtaste=blaettertasteTHENnaechsteseitezeigen;ELIFtaste=dupliziertasteTHENzeilebzwfeldkopierenELIFtaste=loeschtasteTHENzeilebzwfeldmerkenundloeschenELIFtaste=wiedergabetasteTHENspeicherinhaltaufaktuellepositionuebertragenELIFtaste=auskunftstasteTHENinfotextauswahl(fehlertext,fehlermeldung);show(zweiteseite);show(formular(teilfeld));show(formular(steuerzseite2));cursorfeld:=2;infos:=auskunftstext(code(auskeingabebeispiel))ELIFtaste=speichertasteTHENfeld(1):=anwendungstext(btwartenwaehrendspeichern);put(zweiteseite,feld(1),1);speichereaufseitezwei;explizitgespeichertaufseitezwei:=TRUE;ELIFtaste=drucktasteTHENfeld(1):=anwendungstext(btwartenwaehrenddrucken);put(zweiteseite,feld(1),1);druckeinfotextaufseitezwei;ELIFtaste=prueftasteTHENfeld(1):=auskunftstext(auskpruefung);put(zweiteseite,feld(1),1);eingabenzwischenspeichern;eingabendeszweitenformularsordnen;eingabendeszweitenformularspruefen(falscheeingaben);IF NOTfalscheeingabenTHENinfos:=auskunftstext(code(auskdatenkorrekt));weiterebearbeitungdesmodellsELIFfehlertext=""THENinfos:=auskunftstext(code(auskkeinegleichungen));ELSEinfos:=auskunftstext(code(auskfehlerfestgestellt))FI;meldungsmerker:=feld(1);ELSEfeld(1):=meldungstext(fehlertaste);tastenfehleralsletztes:=TRUE;FI PER.speichereaufseitezwei:eingabenzwischenspeichern;eingabendeszweitenformularsordnen;gleichungenundparameterzaehlen(falscheeingaben);forget(vorabmodell.codeundinfo,quiet);bildedsnamenneu(vorabmodell,modellbank,modellnr);modellmitdatenfuellen(vorabmodell);infotextablegen(vorabmodell);mb.modelle(modellnr):=vorabmodell;modellabgelegt:=TRUE.druckeinfotextaufseitezwei:eingabenzwischenspeichern;eingabendeszweitenformularsordnen;gleichungenundparameterzaehlen(falscheeingaben);forget(vorabmodell.codeundinfo,quiet);bildedsnamenneu(vorabmodell,modellbank,modellnr);modellmitdatenfuellen(vorabmodell);infodateiausdrucken(vorabmodell,modellbank);.naechsteseitezeigen:cursorfeld:=2;IFzeilenzaehler=endeseite1THENzwischenspeichern(beginnseite1,endeseite1);formularfuellen(beginnseite2,endeseite2);ELSEzwischenspeichern(beginnseite2,endeseite2);formularfuellen(beginnseite1,endeseite1)FI.zeilebzwfeldkopieren:altefeldart:=cursorfeldMOD4;IFaltefeldart=2THENzeilenmerkerfuellenELSEfeldmerker:=feld(cursorfeld)FI.zeilenmerkerfuellen:zeilenmerker.gleichungsart:=feld(cursorfeld);zeilenmerker.gleichung:=feld(cursorfeld+1);zeilenmerker.variable:=feld(cursorfeld+2).zeilebzwfeldmerkenundloeschen:altefeldart:=cursorfeldMOD4;IFaltefeldart=2THENzeilenmerkerfuellen;feld(cursorfeld):="_";feld(cursorfeld+1):=gleichungsunterstriche;feld(cursorfeld+2):=variablenunterstriche;ELSEfeldmerker:=feld(cursorfeld);IFaltefeldart=3THENfeld(cursorfeld):=gleichungsunterstriche
ELIFaltefeldart=0THENfeld(cursorfeld):=variablenunterstricheELSEfeld(cursorfeld):=parameterunterstricheFI FI.speicherinhaltaufaktuellepositionuebertragen:feldart:=cursorfeldMOD4;IFaltefeldart=feldartTHEN IFfeldart=2THENfeld(cursorfeld):=zeilenmerker.gleichungsart;feld(cursorfeld+1):=zeilenmerker.gleichung;feld(cursorfeld+2):=zeilenmerker.variableELSEfeld(cursorfeld):=feldmerkerFI ELSEfeld(1):=meldungstext(fehlerkopierposition);tastenfehleralsletztes:=TRUE;FI.eingabenzwischenspeichern:IFzeilenzaehler=endeseite1THENzwischenspeichern(beginnseite1,endeseite1)ELSEzwischenspeichern(beginnseite2,endeseite2)FI.weiterebearbeitungdesmodells:REPkernvonweiterebearbeitungdesmodellsPER.kernvonweiterebearbeitungdesmodells:put(zweiteseite,feld);vorabmodell.modellzustand:=uebersetzbar;put(formular(teilfeld),infos,2);show(formular(steuerzseite3));REPfeld(1):=leeresfeld;cursor(77,23);warteaufesc;tasteeinlesen(taste);IFtaste=zuruecktasteTHENallefelderfreigeben;cursorfeld:=2;show(formular(steuerzseite2));infos:=auskunftstext(code(auskeingabebeispiel));feld(1):=meldungstext(mldcursorbenutzung);leaveweiterebearbeitungdesmodellsELIFtaste=speichertasteTHENspeichereaufseitedrei;feld(1):=auskunftstext(auskgespeichert);put(zweiteseite,feld(1),1);explizitgespeichert:=TRUE;ELIFtaste=abbruchtasteTHEN IF NOTexplizitgespeichertCANDabspeicherngewuenschtTHENspeichereaufseitedreiFI;leavemodellerfassungELIFtaste=simulationstasteTHENfuehreggfdiesimulationaus;ELIFtaste=drucktasteTHENinfodateiausdrucken(vorabmodell,modellbank);put(zweiteseite,feld(1),1)ELSEfeld(1):=meldungstext(fehlertaste);put(zweiteseite,feld(1),1)FI PER.speichereaufseitedrei:vorabmodell.codeundinfo:=modellcodeinfo;forget(vorabmodell.codeundinfo,quiet);modellmitdatenfuellen(vorabmodell);infotextablegen(vorabmodell);mb.modelle(modellnr):=vorabmodell;modellabgelegt:=TRUE;.leaveweiterebearbeitungdesmodells:LEAVEweiterebearbeitungdesmodells.reenterweiterebearbeitungdesmodells:show(zweiteseite);LEAVEkernvonweiterebearbeitungdesmodells.fuehreggfdiesimulationaus:feld(1):=anwendungstext(btwartenallgemein);put(zweiteseite,feld(1),1);simulieremitdglmodell;IFokTHENfeld(1):="";put(zweiteseite,feld(1),1);reenterweiterebearbeitungdesmodellsELSEfeld(1):=anwendungstext(btsimulationunmoeglich);put(zweiteseite,feld(1),1)FI.ok:retcode=0.simulieremitdglmodell:DATASPACE VARdsp;BOUND INT VARkanalnummer;BOUND MODELLDGL VARaktmodell;INT VARretcode:=0;vorabmodell.codeundinfo:=modellbank+sp+"X"+sp+"hilfscode";forget(vorabmodell.codeundinfo,quiet);modellmitdatenfuellen(vorabmodell);vorabmodell.modellzustand:=uebersetzbar;infotextablegen(vorabmodell);kopplean(vorabmodell);REPmodellbearbeiten;UNTILordnungsgemaessbeendetodertasknichtempfangsbereitPER;forget(vorabmodell.codeundinfo,quiet);enablestop;.ordnungsgemaessbeendetodertasknichtempfangsbereit:retcode<>simulationneustarten.modellbearbeiten:IFretcode=simulationneustartenTHENshow(zweiteseite);feld(1):=anwendungstext(btwartenallgemein);put(zweiteseite,feld(1),1);FI;retcode:=0;schickemodelldaten;IFokTHENschickegleichungen;IFokTHENstartesimulationFI FI;continue(geraetekanal);.schickemodelldaten:dsp:=nilspace;aktmodell:=dsp;aktmodell:=vorabmodell;schickeanmanagertask(dsp,2,retcode);.schickegleichungen:IFexists(modelldatenraum)THENdsp:=old(modelldatenraum);schickeanmanagertask(dsp,5,retcode);ELSEretcode:=99;FI.startesimulation:break(quiet);dsp:=nilspace;schickeanmanagertask(dsp,6,retcode);.abspeicherngewuenscht:IFvorabmodell.modellzustand=notuebersetzbarTHEN IFexplizitgespeichertaufseitezweiTHENput(formular(seite2),meldungstext(fragenochmalspeichern),1);cursor(51,21);ELSEput(formular(seite2),meldungstext(mldnichtablauffaehig),1);cursor(63,21);FI;yes(" ")ELSEput(formular(seite2),"",1);cursor(spalte3,20);yes(compress(meldungstext(fragehierabspeichern)))FI.ENDPROCmodellerfassung;PROCschickeanmanagertask(DATASPACE VARdatenraum,INT CONSTverarbeitung,INT VARmesscode):INT CONSTeingabevomkanal:=-4;TASK VARmanagertask:=/terminaltaskname,kontrolltask:=/terminaltaskname;REPmanagertask:=
kontrolltask;send(managertask,verarbeitung,datenraum,messcode);forget(datenraum);IFmesscode<>existiertnichtCANDmesscode<>nichtempfangsbereitTHENwarteaufquittungELSE LEAVEschickeanmanagertaskFI PER.warteaufquittung:managertask:=/terminaltaskname;wait(datenraum,messcode,managertask);forget(datenraum);IFquerschlaegersendungTHEN IFcontinueversuchTHEN LEAVEschickeanmanagertask;ELSE IFmesscode=eingabevomkanalTHEN REP UNTILincharety=""PER;forget(datenraum);FI;FI ELSE LEAVEschickeanmanagertask;FI.querschlaegersendung:NOT(managertask=kontrolltask).continueversuch:managertask=supervisorAND((task(messcodeMOD100)=niltask)OR(task(messcodeMOD100)=myself))END PROCschickeanmanagertask;PROCzwischenspeichermitmodelldatenfuellen(MODELLDGL VARzwmodell):INT VARi;IFexists(zwmodell.codeundinfo)THENgleichungsraum:=old(zwmodell.codeundinfo);FORiFROM1UPTOzwmodell.variablen.anzahlREPglzeile(i).gleichungsart:="d";glzeile(i).variable:=zwmodell.variablen.namelang(i);glzeile(i).gleichung:=gleichungsraum.gleichungen(i)PER;FORiFROMzwmodell.variablen.anzahl+1UPTOzwmodell.variablen.anzahl+zwmodell.covariablen.anzahlREPglzeile(i).gleichungsart:="e";glzeile(i).variable:=zwmodell.covariablen.namelang(i-zwmodell.variablen.anzahl);glzeile(i).gleichung:=gleichungsraum.cogleichungen(i-zwmodell.variablen.anzahl)PER;FORiFROMzwmodell.variablen.anzahl+zwmodell.covariablen.anzahl+1UPTOmaxzeileneingabeREPglzeile(i).gleichungsart:="_";glzeile(i).gleichung:="";glzeile(i).variable:=""PER;FORiFROM1UPTOzwmodell.parameter.anzahlREPeingabeparametername(i):=zwmodell.parameter.namelang(i)PER;FORiFROMzwmodell.parameter.anzahl+1UPTOmaxzeileneingabeREPeingabeparametername(i):=""PER ELSE FORiFROM1UPTOmaxzeileneingabeREPglzeile(i).gleichungsart:="_";glzeile(i).variable:="";glzeile(i).gleichung:="";eingabeparametername(i):=""PER FI.END PROCzwischenspeichermitmodelldatenfuellen;PROCallefelderfreigeben:INT VARfeldzaehler;FORfeldzaehlerFROM2UPTO4*bildschirmzeilenREPprotect(zweiteseite,feldzaehler,FALSE)PER.END PROCallefelderfreigeben;PROCmaskezurmodellinitialisierungausgeben(TEXT CONSTlang,kurz):show(formular(seite1));footnote(steuerleiste(stmenuoderweiter));cursorfeld:=2;feld(1):=leeresfeld;feld(2):=lang+(maxmodellnamelang-length(lang))*"_";feld(3):=kurz+(maxmodellnamekurz-length(kurz))*"_";feld(4):="";feld(5):="";.END PROCmaskezurmodellinitialisierungausgeben;PROCeingabendeserstenformularspruefen(TEXT VARlang,kurz,INT CONSTmodellinbearbeitung,BOOL VARfalscheeingaben):INT VARi;ROW5TEXT VARhilfsfeld;feld(1):=leeresfeld;put(formular(seite1),feld(1),1);langnamenpruefen;aufnamensgleichheitpruefen;kurznamenpruefen;eingabenablegen;falscheeingaben:=FALSE.verlasseeingabendeserstenformularspruefen:falscheeingaben:=TRUE;LEAVEeingabendeserstenformularspruefen.langnamenpruefen:hilfsfeld(2):=feld(2);hilfsfeld(2):=komprimiere(hilfsfeld(2));IFlength(hilfsfeld(2))=0THENfeld(1):=meldungstext(fehlerlangnamefehlt);cursorfeld:=2;verlasseeingabendeserstenformularspruefenELIFlength(hilfsfeld(2))>maxmodellnamelangTHENfeld(1):=meldungstext(fehlerlangname);cursorfeld:=2;verlasseeingabendeserstenformularspruefenFI.kurznamenpruefen:hilfsfeld(3):=feld(3);hilfsfeld(3):=komprimiere(hilfsfeld(3));IFlength(hilfsfeld(3))=0THENfeld(1):=meldungstext(fehlerkurznamefehlt);cursorfeld:=3;verlasseeingabendeserstenformularspruefenELIFlength(hilfsfeld(3))>maxmodellnamekurzTHENfeld(1):=meldungstext(fehlerkurzname);cursorfeld:=3;verlasseeingabendeserstenformularspruefenFI.aufnamensgleichheitpruefen:FORiFROM1UPTOmb.anzahldglmodelleREP IFi<>modellinbearbeitungCANDhilfsfeld(2)=mb.modelle(i).name.langTHENfeld(1):=meldungstext(fehlermodellnamedoppelt);cursorfeld:=2;verlasseeingabendeserstenformularspruefenFI;PER;.eingabenablegen:lang:=hilfsfeld(2);kurz:=hilfsfeld(3).END PROCeingabendeserstenformularspruefen;PROCmaskezurmodelldatenerfassungausgeben(TEXT VARinformation):show(zweiteseite);show(formular(steuerzseite2));cursorfeld:=2;formularfuellen(beginnseite1,endeseite1);information:=auskunftstext(code(auskeingabebeispiel)).END PROC
maskezurmodelldatenerfassungausgeben;PROCformularfuellen(INT CONSTseitenbeginn,seitenende):INT VARfeldzaehler;feldzaehlerauferstesfeldsetzen;FORzeilenzaehlerFROMseitenbeginnUPTOseitenendeREPformularzeilefuellenPER;zeilenzaehler:=seitenende.feldzaehlerauferstesfeldsetzen:feldzaehler:=ersteseingabefeld.formularzeilefuellen:feld(feldzaehler):="_";replace(feld(feldzaehler),1,glzeile(zeilenzaehler).gleichungsart);feldzaehlerINCR1;feld(feldzaehler):=gleichungsunterstriche;IFlength(glzeile(zeilenzaehler).gleichung)>length(gleichungsunterstriche)THENfeld(feldzaehler):=glzeile(zeilenzaehler).gleichungELSEreplace(feld(feldzaehler),1,glzeile(zeilenzaehler).gleichung);FI;feldzaehlerINCR1;feld(feldzaehler):=variablenunterstriche;replace(feld(feldzaehler),1,glzeile(zeilenzaehler).variable);feldzaehlerINCR1;feld(feldzaehler):=parameterunterstriche;replace(feld(feldzaehler),1,eingabeparametername(zeilenzaehler));feldzaehlerINCR1.END PROCformularfuellen;PROCzwischenspeichern(INT CONSTseitenbeginn,seitenende):INT VARfeldzaehler;feldzaehlerauferstesfeldsetzen;FORzeilenzaehlerFROMseitenbeginnUPTOseitenendeREPzwischenspeicherfuellenPER;zeilenzaehler:=seitenende.feldzaehlerauferstesfeldsetzen:feldzaehler:=ersteseingabefeld.zwischenspeicherfuellen:glzeile(zeilenzaehler).gleichungsart:=subtext(feld(feldzaehler),1,1);feldzaehlerINCR1;glzeile(zeilenzaehler).gleichung:=feld(feldzaehler);glzeile(zeilenzaehler).gleichung:=komprimiere(glzeile(zeilenzaehler).gleichung);ohneumlauteundeszet(glzeile(zeilenzaehler).gleichung);IFlength(glzeile(zeilenzaehler).gleichung)>0CANDsubtext(glzeile(zeilenzaehler).gleichung,length(glzeile(zeilenzaehler).gleichung))<>";"THENglzeile(zeilenzaehler).gleichungCAT";"FI;feldzaehlerINCR1;glzeile(zeilenzaehler).variable:=feld(feldzaehler);glzeile(zeilenzaehler).variable:=komprimiere(glzeile(zeilenzaehler).variable);ohneumlauteundeszet(glzeile(zeilenzaehler).variable);feldzaehlerINCR1;eingabeparametername(zeilenzaehler):=feld(feldzaehler);eingabeparametername(zeilenzaehler):=komprimiere(eingabeparametername(zeilenzaehler));ohneumlauteundeszet(eingabeparametername(zeilenzaehler));feldzaehlerINCR1;END PROCzwischenspeichern;PROCeingabendeszweitenformularsordnen:INT VARi,zzaehler;FORzzaehlerFROM1UPTOmaxzeileneingabeREPohneumlauteundeszet(glzeile(zzaehler).variable);glzeile(zzaehler).nummer:=zzaehlerPER;zmerkerundpmerkerbestimmen;glzeilenordnen(1,zmerker);parameterordnen;formularfuellen(beginnseite1,endeseite1).zmerkerundpmerkerbestimmen:i:=maxzeileneingabe+1;REPiDECR1;zmerker:=iUNTILi=0CORzeilenichtleerPER;i:=maxzeileneingabe+1;REPiDECR1;pmerker:=iUNTILi=0CORlength(eingabeparametername(i))>0PER.zeilenichtleer:NOT(length(glzeile(i).gleichungsart)=0CANDlength(glzeile(i).gleichung)=0CANDlength(glzeile(i).variable)=0).END PROCeingabendeszweitenformularsordnen;PROCglzeilenordnen(INT CONSTanfang,ende):INT VARpivotadresse,zeigeroben,zeigerunten,adrgroesserpivot,adrkleinerpivot;ZEILE VARpivotzeile;IFanfang<endeTHENermittlepivotelement;initialisiereoberenundunterenvergleichszeiger;ordnedieelementemithilfevonpivot;sortiereteillistenwennsiemehralseinelemententhaltenFI.ermittlepivotelement:pivotadresse:=(ende+anfang)DIV2;pivotzeile:=glzeile(pivotadresse).initialisiereoberenundunterenvergleichszeiger:zeigeroben:=anfang;zeigerunten:=ende.ordnedieelementemithilfevonpivot:glzeile(pivotadresse):=glzeile(anfang);WHILEzeigeroben<zeigeruntenREPsuchevonobenechtgroesserpivot;suchevonuntenkleinergleichpivotwennnoetigPER.suchevonobenechtgroesserpivot:adrgroesserpivot:=zeigeroben+1;WHILEadrgroesserpivot<=zeigeruntenCANDprioritaet(pivotzeile)>=prioritaet(glzeile(adrgroesserpivot))REPadrgroesserpivotINCR1PER.suchevonuntenkleinergleichpivotwennnoetig:IFadrgroesserpivot>zeigeruntenTHENmacheletztenplatzfreiundsetzepivotdahin;zeigeroben:=zeigeruntenELSEsuchevonuntenelementkleinergleichpivotundvertauscheesmitdemgroesserenFI.macheletztenplatzfreiundsetzepivotdahin:glzeile(zeigeroben):=glzeile(zeigerunten);glzeile(zeigerunten):=pivotzeile.
suchevonuntenelementkleinergleichpivotundvertauscheesmitdemgroesseren:adrkleinerpivot:=zeigerunten;WHILEadrkleinerpivot>=adrgroesserpivotCANDprioritaet(glzeile(adrkleinerpivot))>prioritaet(pivotzeile)REPadrkleinerpivotDECR1PER;IFadrkleinerpivot<adrgroesserpivotTHENbringepivotoberhalbvonadrgroesserpivotunterELSEglzeile(zeigeroben):=glzeile(adrkleinerpivot);glzeile(adrkleinerpivot):=glzeile(adrgroesserpivot);glzeile(adrgroesserpivot):=pivotzeile;zeigeroben:=adrgroesserpivot;zeigerunten:=adrkleinerpivot-1FI.bringepivotoberhalbvonadrgroesserpivotunter:glzeile(zeigeroben):=glzeile(adrgroesserpivot-1);glzeile(adrgroesserpivot-1):=pivotzeile;zeigeroben:=adrgroesserpivot-1;zeigerunten:=zeigeroben.sortiereteillistenwennsiemehralseinelemententhalten:IFende-anfang>1THENpruefeobsortierbereichveraendert;glzeilenordnen(anfang,zeigeroben);glzeilenordnen(zeigeroben+1,ende)FI.pruefeobsortierbereichveraendert:IFzeigeroben=endeTHENzeigeroben:=zeigeroben-1FI.END PROCglzeilenordnen;INT PROCprioritaet(ZEILE CONSTgleichungszeile):INT VARnummer:=gleichungszeile.nummer;TEXT VARart:=gleichungszeile.gleichungsart;IFart=" "THENchange(art," ","_")FI;IFart="d"THENnummerELIFart="e"THENnummer+maxzeileneingabeELIFart<>"_"THENnummer+(2*maxzeileneingabe)ELIFleeresgleichungsfeldCANDleeresvariablenfeldTHENnummer+(4*maxzeileneingabe)ELSEnummer+(3*maxzeileneingabe)FI.leeresgleichungsfeld:length(gleichungszeile.gleichung)=0.leeresvariablenfeld:length(gleichungszeile.variable)=0.END PROCprioritaet;PROCparameterordnen:ROWmaxzeileneingabeTEXT VARsortierhilfe;INT VARzzaehler,leerzeilenmerker:=0;FORzzaehlerFROM1UPTOpmerkerREPohneumlauteundeszet(eingabeparametername(zzaehler));parametersortierenPER;FORzzaehlerFROM(pmerker-leerzeilenmerker)+1UPTOpmerkerREPsortierhilfe(zzaehler):="";PER;FORzzaehlerFROM1UPTOpmerkerREPeingabeparametername(zzaehler):=sortierhilfe(zzaehler)PER.parametersortieren:IFlength(eingabeparametername(zzaehler))>0THENsortierhilfe(zzaehler-leerzeilenmerker):=eingabeparametername(zzaehler)ELSEleerzeilenmerkerINCR1FI.END PROCparameterordnen;PROCgleichungenundparameterzaehlen(BOOL VARfalscheeingaben):INT VARi:=1;WHILEi<=maxzeileneingabeCANDglzeile(i).gleichungsart="d"REPiINCR1PER;dgleichungsanzahl:=i-1;WHILEi<=maxzeileneingabeCANDglzeile(i).gleichungsart="e"REPiINCR1PER;egleichungsanzahl:=i-dgleichungsanzahl-1;gleichungsanzahl:=i-1;i:=1;WHILEi<=maxzeileneingabeCANDlength(eingabeparametername(i))>0REPiINCR1PER;anzahlparameter:=i-1;IFgleichungsanzahl=0THENfeld(1):=meldungstext(mldcursorbenutzung);fehlertext:="";falscheeingaben:=TRUE FI.END PROCgleichungenundparameterzaehlen;PROCeingabendeszweitenformularspruefen(BOOL VARfalscheeingaben):INT VARzzaehler,i,pruefling,fehlerfeldvariable,feldzaehler;TEXT VARprozeduranfangd,deklarationend,prozedurended,prozeduranfange,deklarationene,prozedurendee,procd,proce,prozedurd,prozedure;BOOL VARdoppeltdeklariert:=FALSE,vorherigefelderleer:=FALSE;falscheeingaben:=FALSE;FORzzaehlerFROM1UPTOmaxzeileneingabeREPgleichungsartpruefen;gleichungpruefen;variablepruefen;parameterpruefenPER;gleichungenundparameterzaehlen(falscheeingaben);IFfalscheeingabenTHENfehlermeldung:=auskunftstext(auskihrfehler)+" "+feld(1);verlasseeingabendeszweitenformularspruefenFI;variableundparametereinzelnaufuebersetzbarkeitpruefen;doppeltdeklariert:=FALSE;aufdoppeldeklarationenpruefen(doppeltdeklariert);IFdoppeltdeklariertTHEN IFcursorfeld>41THENcursorfeldDECR40;formularfuellen(beginnseite2,endeseite2)FI;fehlertext:=ausklabeldoppelt;fehlermeldung:=auskunftstext(auskihrfehler)+" "+feld(1);verlasseeingabendeszweitenformularspruefenFI;gleichungenpruefen;fehlertext:="";fehlermeldung:=auskunftstext(auskihrfehler)+" "+feld(1);feld(1):=leeresfeld;put(zweiteseite,feld(1),1);allefeldersperren.cursorpositionierenundggfformularfuellen:IFzzaehler>endeseite1THENcursorfeld:=(zzaehler-endeseite1)*4+fehlerfeldvariable;formularfuellen(beginnseite2,endeseite2)ELSEcursorfeld:=(zzaehler*4)+fehlerfeldvariable;FI;verlasseeingabendeszweitenformularspruefen.
verlasseeingabendeszweitenformularspruefen:falscheeingaben:=TRUE;LEAVEeingabendeszweitenformularspruefen.gleichungsartpruefen:IFglzeile(zzaehler).gleichungsart=""THENglzeile(zzaehler).gleichungsart:="_"FI;IFpos("de_",glzeile(zzaehler).gleichungsart)=0THENfehlerfeldvariable:=-2;fehlertext:=auskgleichungunvollstaendig;feld(1):=meldungstext(fehlergleichungsart);fehlermeldung:=auskunftstext(auskihrfehler)+" "+feld(1);cursorpositionierenundggfformularfuellenELSEvorherigefelderleer:=(glzeile(zzaehler).gleichungsart="_")FI.gleichungpruefen:IFlength(glzeile(zzaehler).gleichung)=0CAND NOTvorherigefelderleerTHENfehlerfeldvariable:=-1;fehlertext:=auskgleichungunvollstaendig;feld(1):=meldungstext(fehlergleichungfehlt);fehlermeldung:=auskunftstext(auskihrfehler)+" "+feld(1);cursorpositionierenundggfformularfuellenELIFlength(glzeile(zzaehler).gleichung)>0CANDvorherigefelderleerTHENfehlerfeldvariable:=-2;fehlertext:=auskgleichungunvollstaendig;feld(1):=meldungstext(fehlergleichungsartfehlt);fehlermeldung:=auskunftstext(auskihrfehler)+" "+feld(1);cursorpositionierenundggfformularfuellenFI.variablepruefen:IFvorherigefelderleerTHEN IFlength(glzeile(zzaehler).variable)>0THENfehlerfeldvariable:=0;fehlertext:=auskgleichungunvollstaendig;feld(1):=meldungstext(fehlervariable);fehlermeldung:=auskunftstext(auskihrfehler)+" "+feld(1);cursorpositionierenundggfformularfuellenFI ELIFlength(glzeile(zzaehler).variable)=0THENfehlerfeldvariable:=0;fehlertext:=auskgleichungunvollstaendig;feld(1):=meldungstext(fehlervariablefehlt);fehlermeldung:=auskunftstext(auskihrfehler)+" "+feld(1);cursorpositionierenundggfformularfuellenELIFlength(glzeile(zzaehler).variable)>maxvariablenlaengeTHENfehlerfeldvariable:=0;fehlertext:=ausklabelzulang;feld(1):=meldungstext(fehlervariablezulang);fehlermeldung:=auskunftstext(auskihrfehler)+" "+feld(1);cursorpositionierenundggfformularfuellenFI.parameterpruefen:IFlength(eingabeparametername(zzaehler))>maxparlaengeTHENfehlerfeldvariable:=1;fehlertext:=ausklabelzulang;feld(1):=meldungstext(fehlerparameterzulang);fehlermeldung:=auskunftstext(auskihrfehler)+" "+feld(1);cursorpositionierenundggfformularfuellenFI.variableundparametereinzelnaufuebersetzbarkeitpruefen:allevariableneinzelnaufuebersetzbarkeitpruefen;alleparametereinzelnaufuebersetzbarkeitpruefen.allevariableneinzelnaufuebersetzbarkeitpruefen:FORiFROM1UPTOgleichungsanzahlREP IFnichtuebersetzbar("REAL VAR"+elan(glzeile(i).variable)+";")THENzzaehler:=i;fehlerfeldvariable:=0;fehlertext:=ausklabelzulang;feld(1):=errormessage;fehlermeldung:=auskunftstext(auskihrfehler)+" "+feld(1);cursorpositionierenundggfformularfuellenFI PER.alleparametereinzelnaufuebersetzbarkeitpruefen:FORiFROM1UPTOanzahlparameterREP IFnichtuebersetzbar("REAL VAR"+elan(eingabeparametername(i))+";")THENzzaehler:=i;fehlerfeldvariable:=1;fehlertext:=ausklabelzulang;feld(1):=errormessage;fehlermeldung:=auskunftstext(auskihrfehler)+" "+feld(1);cursorpositionierenundggfformularfuellenFI PER.gleichungenpruefen:IFdgleichungsanzahl>0THENprozeduranfangderzeugen;prozedurendederzeugen;alledgleichungeneinzelnpruefen;alledgleichungenzusammenpruefenFI;IFegleichungsanzahl>0THENprozeduranfangeerzeugen;prozedurendeeerzeugen;alleegleichungeneinzelnpruefen;alleegleichungenzusammenpruefenFI.prozeduranfangderzeugen:prozedurkopfderzeugen;deklarationenderzeugen.prozedurkopfderzeugen:prozeduranfangd:="PROC diff gleichungen:".prozedurendederzeugen:prozedurended:="END PROC diff gleichungen;".deklarationenderzeugen:deklarationend:="REAL CONST";FORiFROM1UPTOdgleichungsanzahlREPdeklarationendCAT(elan(glzeile(i).variable)+":= 0.0,")PER;FORiFROM1UPTOanzahlparameterREPdeklarationendCAT(elan(eingabeparametername(i))+":= 0.0,")PER;deklarationendCAT"zeit:= 0.0;";prozeduranfangdCATdeklarationend.alledgleichungeneinzelnpruefen:FORiFROM1UPTOdgleichungsanzahlREPprocd:="";procdCATprozeduranfangd;procdCAT("REAL VAR d"+elan(glzeile(i).variable)+";");procdCATglzeile(i).gleichung;procdCATprozedurended;IFnichtuebersetzbar(procd)THENzzaehler:=i;
fehlerfeldvariable:=-1;fehlertext:=errorauswertung(errormessage);feld(1):=errormessage;fehlermeldung:=auskunftstext(auskihrfehler)+" "+feld(1);cursorpositionierenundggfformularfuellenFI PER.alledgleichungenzusammenpruefen:prozedurd:="";prozedurdCATprozeduranfangd;prozedurdCAT("REAL VAR d"+elan(glzeile(1).variable));FORiFROM2UPTOdgleichungsanzahlREPprozedurdCAT(", d"+elan(glzeile(i).variable))PER;prozedurdCAT";";FORiFROM1UPTOdgleichungsanzahlREPprozedurdCATglzeile(i).gleichungPER;prozedurdCATprozedurended;IFlength(compress(prozedurd))<=maxinterpretlaengeCANDnichtuebersetzbar(prozedurd)THENfeld(1):=errormessage;fehlertext:=errorauswertung(errormessage);fehlermeldung:=auskunftstext(auskihrfehler)+" "+feld(1);cursorfeld:=ersteseingabefeld;verlasseeingabendeszweitenformularspruefenFI.prozeduranfangeerzeugen:prozedurkopfeerzeugen;deklarationeneerzeugen.prozedurkopfeerzeugen:prozeduranfange:="PROC ergaenzungsgleichungen:".prozedurendeeerzeugen:prozedurendee:="END PROC ergaenzungsgleichungen;".deklarationeneerzeugen:deklarationene:="REAL CONST";FORiFROM1UPTOdgleichungsanzahlREPdeklarationeneCAT(elan(glzeile(i).variable)+":= 0.0,")PER;FORiFROM1UPTOanzahlparameterREPdeklarationeneCAT(elan(eingabeparametername(i))+":= 0.0,")PER;deklarationeneCAT("zeit:= 0.0;");prozeduranfangeCATdeklarationene.alleegleichungeneinzelnpruefen:FORprueflingFROMdgleichungsanzahl+1UPTOgleichungsanzahlREPproce:="";proceCATprozeduranfange;objektealskonstanten;proceCATglzeile(pruefling).gleichung;proceCATprozedurendee;IFnichtuebersetzbar(proce)THENzzaehler:=pruefling;fehlerfeldvariable:=-1;fehlertext:=errorauswertung(errormessage);feld(1):=errormessage;fehlermeldung:=auskunftstext(auskihrfehler)+" "+feld(1);cursorpositionierenundggfformularfuellenFI PER.objektealskonstanten:proceCAT"REAL VAR"+elan(glzeile(pruefling).variable)+";";IFegleichungsanzahl>1THENproceCAT"REAL CONST";IFpruefling=dgleichungsanzahl+1THENi:=dgleichungsanzahl+2;ELSEi:=dgleichungsanzahl+1;FI;proceCAT(elan(glzeile(i).variable))+":= 0.0";iINCR1;WHILEi<=gleichungsanzahlREP IFi<>prueflingTHENproceCAT(","+elan(glzeile(i).variable))+":= 0.0"FI;iINCR1;PER;proceCAT";";FI;.alleegleichungenzusammenpruefen:prozedure:="";prozedureCATprozeduranfange;objektealsvariablen;FORiFROMdgleichungsanzahl+1UPTOgleichungsanzahlREPprozedureCATglzeile(i).gleichungPER;prozedureCATprozedurendee;IFlength(compress(prozedure))<=maxinterpretlaengeCANDnichtuebersetzbar(prozedure)THENfeld(1):=errormessage;fehlertext:=errorauswertung(errormessage);fehlermeldung:=auskunftstext(auskihrfehler)+" "+feld(1);cursorfeld:=ersteseingabefeld;verlasseeingabendeszweitenformularspruefenFI.objektealsvariablen:prozedureCAT"REAL VAR";prozedureCAT(elan(glzeile(dgleichungsanzahl+1).variable));FORiFROMdgleichungsanzahl+2UPTOgleichungsanzahlREPprozedureCAT(","+elan(glzeile(i).variable))PER;prozedureCAT";";.allefeldersperren:FORfeldzaehlerFROM2UPTO4*bildschirmzeilenREPprotect(zweiteseite,feldzaehler,TRUE)PER.END PROCeingabendeszweitenformularspruefen;PROCaufdoppeldeklarationenpruefen(BOOL VARdoppeltdeklariert):ROWmaxvarparaanzahlTEXT VARpruefung;INT VARzaehler,counter:=1,sortierende:=gleichungsanzahl+dgleichungsanzahl+anzahlparameter+1;zupruefenderowmitwertenfuellen;pruefung(sortierende):="00"+"z"+"zeit";quicksort(pruefung,1,sortierende);zaehler:=1;WHILEzaehler<sortierendeREP IFnameohneblanks(pruefung(zaehler))=nameohneblanks(pruefung(zaehler+1))THENcursoraufdiefalscheeingabepositionierenundfehlermelden;FI;zaehlerINCR1PER.zupruefenderowmitwertenfuellen:FORzaehlerFROM1UPTOgleichungsanzahlREPpruefung(zaehler):=zweistelligezahl(counter)+"v"+elan(glzeile(counter).variable);counterINCR1PER;counter:=1;FORzaehlerFROMgleichungsanzahl+1UPTOgleichungsanzahl+anzahlparameterREPpruefung(zaehler):=zweistelligezahl(counter)+"p"+elan(eingabeparametername(counter));counterINCR1PER;counter:=1;FORzaehlerFROMgleichungsanzahl+anzahlparameter+1UPTOsortierende-1REPpruefung(zaehler):=zweistelligezahl(counter)+"g"+"d"+elan(glzeile(counter).variable);counterINCR1PER.
cursoraufdiefalscheeingabepositionierenundfehlermelden:IFaufeinanderfolgendekennzeichengundvodergundpTHENcursoraufvariablebzwparameterpositionieren;feld(1):=meldungstext(fehlervundgdoppelt);doppeltdeklariert:=TRUE;LEAVEaufdoppeldeklarationenpruefenFI;IFaufeinanderfolgendekennzeichenzundvoderzundpTHENcursoraufvariablebzwparameterpositionieren;feld(1):=meldungstext(fehlerzeitvariabledoppelt);doppeltdeklariert:=TRUE;LEAVEaufdoppeldeklarationenpruefenFI;IFsubtext(pruefung(zaehler),3,3)="v"THENcursorfeld:=lfdnummer(pruefung(zaehler))*4;feld(1):=meldungstext(fehlerdoppeldeklaration);doppeltdeklariert:=TRUE;LEAVEaufdoppeldeklarationenpruefenELIFsubtext(pruefung(zaehler),3,3)="p"THENcursorfeld:=lfdnummer(pruefung(zaehler))*4+1;feld(1):=meldungstext(fehlerdoppeldeklaration);doppeltdeklariert:=TRUE;LEAVEaufdoppeldeklarationenpruefenFI.aufeinanderfolgendekennzeichengundvodergundp:(subtext(pruefung(zaehler),3,3)="g"CANDsubtext(pruefung(zaehler+1),3,3)="v")COR(subtext(pruefung(zaehler),3,3)="v"CANDsubtext(pruefung(zaehler+1),3,3)="g")COR(subtext(pruefung(zaehler),3,3)="g"CANDsubtext(pruefung(zaehler+1),3,3)="p")COR(subtext(pruefung(zaehler),3,3)="p"CANDsubtext(pruefung(zaehler+1),3,3)="g").aufeinanderfolgendekennzeichenzundvoderzundp:(subtext(pruefung(zaehler),3,3)="z"CANDsubtext(pruefung(zaehler+1),3,3)="v")COR(subtext(pruefung(zaehler),3,3)="v"CANDsubtext(pruefung(zaehler+1),3,3)="z")COR(subtext(pruefung(zaehler),3,3)="z"CANDsubtext(pruefung(zaehler+1),3,3)="p")COR(subtext(pruefung(zaehler),3,3)="p"CANDsubtext(pruefung(zaehler+1),3,3)="z").cursoraufvariablebzwparameterpositionieren:IFsubtext(pruefung(zaehler),3,3)="v"THENcursorfeld:=lfdnummer(pruefung(zaehler))*4ELIFsubtext(pruefung(zaehler+1),3,3)="v"THENcursorfeld:=lfdnummer(pruefung(zaehler+1))*4ELIFsubtext(pruefung(zaehler),3,3)="p"THENcursorfeld:=lfdnummer(pruefung(zaehler))*4+1ELIFsubtext(pruefung(zaehler+1),3,3)="p"THENcursorfeld:=lfdnummer(pruefung(zaehler+1))*4+1FI.END PROCaufdoppeldeklarationenpruefen;TEXT PROCerrorauswertung(TEXT CONSTmessage):IFpos(message,unbekkommdo)<>0THENauskcompilunbekkommELIFpos(message,undefdyadischop)<>0CORpos(message,undefmonadop)<>0CORpos(message,paramsindfalsch)<>0THENauskcompilparameterELIFpos(message,nurletzteanweisg)<>0CORpos(message,anstelledessymb)<>0CORpos(message,unzulselektsymb)<>0CORpos(message,konstdarfnicht)<>0THENauskcompilsymboleELIFpos(message,klammerauffehlt)<>0CORpos(message,klammerzufehlt)<>0CORpos(message,operatorfehlt)<>0CORpos(message,ungueltigzwischen)<>0THENauskcompilungueltzwELIFpos(message,istmehrfachdekl)<>0THENauskcompilmehrfdeklELSEauskcompilsonstigesFI.END PROCerrorauswertung;PROCquicksort(ROWmaxvarparaanzahlTEXT VARpruefung,INT CONSTanfang,ende):INT VARpivotadresse,zeigeroben,zeigerunten,adrgroesserpivot,adrkleinerpivot;TEXT VARpivot;IFanfang<endeTHENermittlepivotelement;initialisiereoberenundunterenvergleichszeiger;ordnedieelementemithilfevonpivot;sortiereteillistenwennsiemehralseinelemententhaltenFI.ermittlepivotelement:pivotadresse:=(ende+anfang)DIV2;pivot:=pruefung(pivotadresse).initialisiereoberenundunterenvergleichszeiger:zeigeroben:=anfang;zeigerunten:=ende.ordnedieelementemithilfevonpivot:pruefung(pivotadresse):=pruefung(anfang);WHILEzeigeroben<zeigeruntenREPsuchevonobenechtgroesserpivot;suchevonuntenkleinergleichpivotwennnoetigPER.suchevonobenechtgroesserpivot:adrgroesserpivot:=zeigeroben+1;WHILEadrgroesserpivot<=zeigeruntenCANDname(pivot)>=name(pruefung(adrgroesserpivot))REPadrgroesserpivotINCR1PER.suchevonuntenkleinergleichpivotwennnoetig:IFadrgroesserpivot>zeigeruntenTHENmacheletztenplatzfreiundsetzepivotdahin;zeigeroben:=zeigeruntenELSEsuchevonuntenelementkleinergleichpivotundvertauscheesmitdemgroesserenFI.macheletztenplatzfreiundsetzepivotdahin:pruefung(zeigeroben):=pruefung(zeigerunten);pruefung(zeigerunten):=pivot.suchevonuntenelementkleinergleichpivotundvertauscheesmitdemgroesseren:adrkleinerpivot:=zeigerunten;WHILEadrkleinerpivot>=adrgroesserpivotCANDname(pruefung(adrkleinerpivot))>name(pivot)REP
adrkleinerpivotDECR1PER;IFadrkleinerpivot<adrgroesserpivotTHENbringepivotoberhalbvonadrgroesserpivotunterELSEpruefung(zeigeroben):=pruefung(adrkleinerpivot);pruefung(adrkleinerpivot):=pruefung(adrgroesserpivot);pruefung(adrgroesserpivot):=pivot;zeigeroben:=adrgroesserpivot;zeigerunten:=adrkleinerpivot-1FI.bringepivotoberhalbvonadrgroesserpivotunter:pruefung(zeigeroben):=pruefung(adrgroesserpivot-1);pruefung(adrgroesserpivot-1):=pivot;zeigeroben:=adrgroesserpivot-1;zeigerunten:=zeigeroben.sortiereteillistenwennsiemehralseinelemententhalten:IFende-anfang>1THENpruefeobsortierbereichveraendert;quicksort(pruefung,anfang,zeigeroben);quicksort(pruefung,zeigeroben+1,ende)FI.pruefeobsortierbereichveraendert:IFzeigeroben=endeTHENzeigeroben:=zeigeroben-1FI.END PROCquicksort;PROCmodellmitdatenfuellen(MODELLDGL VARzwmodell):INT VARvz,i;ZUSTAND VARz1:=neuerzustand(dgleichungsanzahl),z2:=z1;PARAMETER VARp1:=neuerparameter(anzahlparameter),p2:=p1;FORvzFROM1UPTOdgleichungsanzahlREPreplace(z1,vz,0.0)PER;zwmodell.demolauf.original.startwert:=text(z1);zwmodell.demolauf.vergleich.startwert:=text(z1);FORvzFROM1UPTOdgleichungsanzahlREPreplace(z1,vz,-1.0e+126);replace(z2,vz,1.0e+126)PER;zwmodell.variablen.unteregrenze:=text(z1);zwmodell.variablen.oberegrenze:=text(z2);z1:=neuerzustand(gleichungsanzahl);z2:=z1;FORvzFROM1UPTOgleichungsanzahlREPreplace(z1,vz,-1.0e+126);replace(z2,vz,1.0e+126)PER;zwmodell.variablen.randoben:=text(z2);zwmodell.variablen.randunten:=text(z1);FORvzFROM1UPTOanzahlparameterREPreplace(p1,vz,0.0)PER;zwmodell.demolauf.original.parameter:=text(p1);zwmodell.demolauf.vergleich.parameter:=text(p1);FORvzFROM1UPTOanzahlparameterREPreplace(p1,vz,-1.0e+126);replace(p2,vz,1.0e+126)PER;zwmodell.parameter.unteregrenze:=text(p1);zwmodell.parameter.oberegrenze:=text(p2);zwmodell.demolauf.original.anfangszeitpunkt:=0.0;zwmodell.demolauf.original.beobachtungsdauer:=0.0;zwmodell.demolauf.vergleich.anfangszeitpunkt:=0.0;zwmodell.demolauf.vergleich.beobachtungsdauer:=0.0;zwmodell.beschraenkung.minbeobachtungsdauer:=0.0;zwmodell.beschraenkung.maxbeobachtungsdauer:=1.0e+126;zwmodell.beschraenkung.minanfangszeitpunkt:=-1.0e+126;zwmodell.beschraenkung.maxanfangszeitpunkt:=1.0e+126;zwmodell.beschraenkung.anzahlbeobachtungspunkte:=21;forget(zwmodell.codeundinfo,quiet);gleichungsraum:=new(zwmodell.codeundinfo);FORiFROM1UPTOdgleichungsanzahlREPzwmodell.variablen.namelang(i):=glzeile(i).variable;zwmodell.variablen.namekurz(i):=glzeile(i).variable;gleichungsraum.gleichungen(i):=glzeile(i).gleichungPER;gleichungsraum.gleichungen(dgleichungsanzahl+1):=endezeichen;FORiFROMdgleichungsanzahl+1UPTOgleichungsanzahlREPzwmodell.covariablen.namelang(i-dgleichungsanzahl):=glzeile(i).variable;zwmodell.covariablen.namekurz(i-dgleichungsanzahl):=glzeile(i).variable;gleichungsraum.cogleichungen(i-dgleichungsanzahl):=glzeile(i).gleichungPER;gleichungsraum.cogleichungen(egleichungsanzahl+1):=endezeichen;FORiFROM1UPTOanzahlparameterREPzwmodell.parameter.namelang(i):=eingabeparametername(i);zwmodell.parameter.nameelan(i):=elan(eingabeparametername(i))PER;zwmodell.variablen.anzahl:=dgleichungsanzahl;zwmodell.covariablen.anzahl:=egleichungsanzahl;zwmodell.parameter.anzahl:=anzahlparameter;zwmodell.mitphasendiagramm:=TRUE;zwmodell.geschuetzt:=FALSE;.END PROCmodellmitdatenfuellen;PROCmodellmitdatenfuellen(MODELLDGL VARzwmodell,THESAURUS CONSTvnamenlang,vnamenkurz,enamenlang,enamenkurz,pnamen):INT VARvz,i;ZUSTAND VARz1:=neuerzustand(dgleichungsanzahl),z2:=z1;PARAMETER VARp1:=neuerparameter(anzahlparameter),p2:=p1;zwmodell.name.lang:=aktuellermodellname;zwmodell.name.kurz:=aktuellermodellkurzname;zwmodell.name.elan:=elan(aktuellermodellkurzname);FORvzFROM1UPTOdgleichungsanzahlREPreplace(z1,vz,0.0)PER;zwmodell.demolauf.original.startwert:=text(z1);zwmodell.demolauf.vergleich.startwert:=text(z1);FORvzFROM1UPTOdgleichungsanzahlREPreplace(z1,vz,-1.0e+126);replace(z2,vz,1.0e+126)PER;zwmodell.variablen.unteregrenze:=text(z1);zwmodell.variablen.oberegrenze:=text(z2);z1:=neuerzustand(
gleichungsanzahl);z2:=z1;FORvzFROM1UPTOgleichungsanzahlREPreplace(z1,vz,-1.0e+126);replace(z2,vz,1.0e+126)PER;zwmodell.variablen.randoben:=text(z2);zwmodell.variablen.randunten:=text(z1);FORvzFROM1UPTOanzahlparameterREPreplace(p1,vz,0.0)PER;zwmodell.demolauf.original.parameter:=text(p1);zwmodell.demolauf.vergleich.parameter:=text(p1);FORvzFROM1UPTOanzahlparameterREPreplace(p1,vz,-1.0e+126);replace(p2,vz,1.0e+126)PER;zwmodell.parameter.unteregrenze:=text(p1);zwmodell.parameter.oberegrenze:=text(p2);zwmodell.demolauf.original.anfangszeitpunkt:=0.0;zwmodell.demolauf.original.beobachtungsdauer:=0.0;zwmodell.demolauf.vergleich.anfangszeitpunkt:=0.0;zwmodell.demolauf.vergleich.beobachtungsdauer:=0.0;zwmodell.beschraenkung.minbeobachtungsdauer:=0.0;zwmodell.beschraenkung.maxbeobachtungsdauer:=1.0e+126;zwmodell.beschraenkung.minanfangszeitpunkt:=-1.0e+126;zwmodell.beschraenkung.maxanfangszeitpunkt:=1.0e+126;zwmodell.beschraenkung.anzahlbeobachtungspunkte:=21;zwmodell.variablen.namelang:=vnamenlang;zwmodell.variablen.namekurz:=vnamenkurz;zwmodell.covariablen.namelang:=enamenlang;zwmodell.covariablen.namekurz:=enamenkurz;zwmodell.parameter.namelang:=pnamen;FORiFROM1UPTOanzahlparameterREPzwmodell.parameter.nameelan(i):=""PER;zwmodell.variablen.anzahl:=dgleichungsanzahl;zwmodell.covariablen.anzahl:=egleichungsanzahl;zwmodell.parameter.anzahl:=anzahlparameter;zwmodell.mitphasendiagramm:=TRUE;zwmodell.geschuetzt:=FALSE;zwmodell.modellzustand:=uebersetzbar;zwmodell.codeundinfo:="";.dgleichungsanzahl:highestentry(vnamenlang).egleichungsanzahl:highestentry(enamenlang).anzahlparameter:highestentry(pnamen).gleichungsanzahl:egleichungsanzahl+dgleichungsanzahl.END PROCmodellmitdatenfuellen;OP:=(ROWmaxdimensionTEXT VARrow,THESAURUS CONSTthes):TEXT VARname;INT VARi:=0;WHILEi<highestentry(thes)ANDi<=maxdimensionREPget(thes,name,i);row(i):=namePER END OP:=;PROCauskunftsdienst(TEXT CONSTinfotext,fehler,loeschtaste):TEXT VARerstesfeld,zweitesfeld,drittesfeld;INT VARseitenzahl;maskezumauskunftsdienstausgeben;REPkernvonauskunftsdienstPER.kernvonauskunftsdienst:infotextundsteuerzeileausgeben;REPwarteaufesc;tasteeinlesen(taste);IFtaste=blaettertasteTHENseitenzahlINCR1;IFseitenzahl>length(infotext)THENseitenzahl:=1FI;reenterauskunftsdienst;ELIFtaste=loeschtasteTHENleaveauskunftsdienstELSEput(formular(infoseite),meldungstext(fehlertaste),1);FI PER.maskezumauskunftsdienstausgeben:show(formular(infoseite));seitenzahl:=1;erstesfeld:=fehler.reenterauskunftsdienst:LEAVEkernvonauskunftsdienst.leaveauskunftsdienst:LEAVEauskunftsdienst.infotextundsteuerzeileausgeben:IFlength(infotext)>seitenzahlTHENdrittesfeld:=steuerleiste(17)ELIFlength(infotext)>1THENdrittesfeld:=steuerleiste(16)ELIFloeschtaste=auskunftsloeschtaste2THENdrittesfeld:=steuerleiste(18)ELSEdrittesfeld:=steuerleiste(15)FI;IFinfotext=""THENzweitesfeld:=""ELSEzweitesfeld:=auskunftstext(code(infotextSUBseitenzahl))FI;put(formular(infoseite),zweitesfeld,2);put(formular(infoseite),erstesfeld,1);put(formular(infoseite),drittesfeld,3);erstesfeld:=fehler;.END PROCauskunftsdienst;PROCinfotextauswahl(TEXT CONSTfehlertext,fehler):infotextauswahl(fehlertext,fehler,allgemeineauskunftseite2,auskunftzummodellerfassenseite2)END PROCinfotextauswahl;PROCinfotextauswahl(TEXT CONSTfehlertext,fehler,top1,top2):INT VARformularnr,eingabezeile;TEXT VARerstesfeld,auskunftzufehler,auskunft;BOOL VARfalscheeingaben;IFfehlertext=""THENformularnr:=infowahlkurz;eingabezeile:=15;ELSEformularnr:=infowahllang;eingabezeile:=17;FI;REPkernvoninfotextauswahlPER.kernvoninfotextauswahl:maskezurinfotextauswahlausgeben;REPput(formular(formularnr),erstesfeld,1);falscheeingaben:=FALSE;cursor(60,eingabezeile);tasteeinlesen(taste);IFtaste="1"THENauskunft:=top1;fehlermeldung:=""ELIFtaste="2"THENauskunft:=top2;fehlermeldung:=""ELIFtaste="3"CANDfehlertext<>""THEN TEXT VARtt:=compress(fehlermeldung);changeall(tt," ","");auskunft:=fehlertext;fehlermeldung:=tt;ELIFtaste=auskunftsloeschtaste1THENleaveinfotextauswahlELSEerstesfeld:=meldungstext(fehlertaste
);falscheeingaben:=TRUE FI;IF NOTfalscheeingabenTHEN IFauskunft=""THENerstesfeld:="Hierzu existiert noch keine Auskunft!"ELSEauskunftsdienst(auskunft,fehlermeldung,auskunftsloeschtaste2);reenterinfotextauswahlFI FI PER.maskezurinfotextauswahlausgeben:show(formular(formularnr));erstesfeld:=leeresfeld.reenterinfotextauswahl:LEAVEkernvoninfotextauswahl.leaveinfotextauswahl:LEAVEinfotextauswahl.END PROCinfotextauswahl;PROCwarteaufesc:TEXT VAReingabe;REPeingabe:=incharetyUNTILeingabe=escPER.END PROCwarteaufesc;PROCinfotextablegen(MODELLDGL VARzwmodell):FILE VARinformation;INT VARz;TEXT VARzeile;IF NOTexists(zwmodell.codeundinfo)THENgleichungsraum:=new(zwmodell.codeundinfo);FI;information:=modellinfo(zwmodell,dsname);infotextimdatenraumablegen;forget(dsname,quiet).infotextimdatenraumablegen:input(information);z:=1;WHILE NOTeof(information)REPgetline(information,zeile);IFz>maxinfo-1THENgleichungsraum.info(z):=endezeichen;LEAVEinfotextimdatenraumablegenFI;gleichungsraum.info(z):=zeile;zINCR1PER;gleichungsraum.info(z):=endezeichen.END PROCinfotextablegen;PROCtasteeinlesen(TEXT VAReinlesetaste):REPeinlesetaste:=incharetyUNTILeinlesetaste<>""PER END PROCtasteeinlesen;INT PROClfdnummer(TEXT CONSTtext):int(subtext(text,1,2))END PROClfdnummer;TEXT PROCzweistelligezahl(INT CONSTzahl):IFlength(text(zahl))=1THEN"0"+text(zahl)ELSEtext(zahl)FI END PROCzweistelligezahl;TEXT PROCnameohneblanks(TEXT VARtext):changeall(text," ","");subtext(text,4)END PROCnameohneblanks;TEXT PROCname(TEXT CONSTtext):subtext(text,4)END PROCname;TEXT PROCkomprimiere(TEXT CONSTt):TEXT VARergebnis,z;INT VARi,l;suchevonvorne;suchevonhinten;ersetzekern;ergebnis.suchevonvorne:l:=LENGTHt;FORiFROM1UPTOlREPz:=(tSUBi)UNTIL NOT(z=" "CORz="_")PER;IFi>lTHENergebnis:=""ELSEergebnis:=subtext(t,i,l);FI.suchevonhinten:l:=LENGTHergebnis;FORiFROMlDOWNTO1REPz:=(ergebnisSUBi)UNTIL NOT(z=" "CORz="_")PER;IFi<1THENergebnis:=""ELSEergebnis:=subtext(ergebnis,1,i);FI.ersetzekern:changeall(ergebnis,"_"," ").END PROCkomprimiere;PROCohneumlauteundeszet(TEXT VARtext):changeall(text,"ß","ss");END PROCohneumlauteundeszet;BOOL PROCnichtuebersetzbar(TEXT CONSTtext):BOOL VARergebnis;disablestop;do(text);ergebnis:=iserror;IFiserrorTHENclearerrorFI;enablestop;ergebnisEND PROCnichtuebersetzbar;PROCprotect(TAG VARt,INT CONSTfeld,BOOL CONSTprneu):INT VARdummy;BOOL VARcl,se,sp,le,pr;fieldinfos(t,feld,dummy,cl,pr,se,sp,le);setfieldinfos(t,feld,cl,prneu,se)END PROCprotect;PROCvertauschezeilen(ZEILE VARzeile1,zeile2):ZEILE VARhilfe;hilfe:=zeile1;zeile1:=zeile2;zeile2:=hilfeEND PROCvertauschezeilen;LETtrennzeichen=6,klammerauf="(",semikolon=";",thenwort="THEN",elsewort="ELSE",repwort="REP";FILE PROCmodellinfo(MODELLDGL VARzwmodell,TEXT CONSTdatenraum):forget(datenraum,quiet);FILE VARinfo:=sequentialfile(output,datenraum);INT VARz,typ1,typ2,zeilenanfang,filler;TEXT VARersteszeichen,zweiteszeichen;TEXT VARggfluecke:="";modellnameangeben;putline(info,auskunftstext(auskgleichungen));putline(info,unterstrichfeld);IFdgleichungsanzahl>0THEN FORzFROM1UPTOdgleichungsanzahlREPdgleichungausgeben;PER FI;IFegleichungsanzahl>0THEN FORzFROM1UPTOegleichungsanzahlREPegleichungausgeben;PER FI;line(info);IFanzahlparameter>0THENputline(info,compress(auskunftstext(auskvariablen))+10*" "+compress(auskunftstext(auskparameter)));putline(info,unterstrichfeld);FORzFROM1UPTOmax(anzahlparameter,gleichungsanzahl)REPvariableundparameterausgeben;line(info)PER;ELSEputline(info,compress(auskunftstext(auskvariablen)));putline(info,unterstrichfeld);FORzFROM1UPTOdgleichungsanzahlREPputline(info,zwmodell.variablen.namekurz(z))PER;FORzFROM1UPTOegleichungsanzahlREPputline(info,zwmodell.covariablen.namekurz(z))PER FI;info.modellnameangeben:putline(info,compress(auskunftstext(auskmodell))+" "+zwmodell.name.lang);putline(info,length(unterstrichfeld)*"=");line(info,2).dgleichungausgeben:zeilenanfang:=1;scan(gleichungsraum.gleichungen(z));nextsymbol(ersteszeichen,typ1);dasnaechstezeichenschreibenmitruecksichtaufdaszeilenende;WHILEtyp1<7REP
dasnaechstezeichenschreibenmitruecksichtaufdaszeilenendePER.egleichungausgeben:zeilenanfang:=1;scan(gleichungsraum.cogleichungen(z));nextsymbol(ersteszeichen,typ1);dasnaechstezeichenschreibenmitruecksichtaufdaszeilenende;WHILEtyp1<7REPdasnaechstezeichenschreibenmitruecksichtaufdaszeilenendePER.dasnaechstezeichenschreibenmitruecksichtaufdaszeilenende:IF(zeilenanfang+length(ersteszeichen)+1)>=77THENzeilenanfang:=1;FI;zeilenanfangINCRlength(ersteszeichen);nextsymbol(zweiteszeichen,typ2);SELECTtyp2OF CASEtrennzeichen:IFzweiteszeichen=klammeraufCANDtyp1<>trennzeichenTHENggfluecke:=" "ELSEggfluecke:=""FI;OTHERWISEggfluecke:=" "END SELECT;SELECTtyp1OF CASE1:write(info,ersteszeichen+ggfluecke);CASE2:IFersteszeichen=thenwortCORersteszeichen=elsewortTHENline(info);put(info,ersteszeichen);ELIFersteszeichen=repwortTHENput(info,ersteszeichen);line(info)ELSEput(info,ersteszeichen);FI;CASE3:write(info,ersteszeichen+ggfluecke);CASE4:write(info,ersteszeichen+ggfluecke);CASE5:put(info,ersteszeichen);CASE6:write(info,ersteszeichen);IFersteszeichen=semikolonTHENline(info);ggfluecke:=""ELIFersteszeichen=klammeraufTHENggfluecke:=""FI;write(info,ggfluecke);ENDSELECT;IFggfluecke=" "THENzeilenanfangINCR1;FI;ersteszeichen:=zweiteszeichen;typ1:=typ2.variableundparameterausgeben:IFz<=dgleichungsanzahlTHENgebevariableausELIFz<=gleichungsanzahlTHENgebecovariableausFI;IFz<=anzahlparameterTHENgebeparameterausFI;.gebevariableaus:put(info,zwmodell.variablen.namekurz(z));IFz<=anzahlparameterTHENfiller:=infozeilenanfang-length(compress(zwmodell.variablen.namekurz(z)));IFfiller=infozeilenanfangTHENfillerINCR1FI;FI.gebecovariableaus:put(info,zwmodell.covariablen.namekurz(z-dgleichungsanzahl));IFz<=anzahlparameterTHENfiller:=infozeilenanfang-length(compress(zwmodell.covariablen.namekurz(z-dgleichungsanzahl)));IFfiller=infozeilenanfangTHENfillerINCR1FI;FI.gebeparameteraus:IFz>gleichungsanzahlTHENfiller:=infozeilenanfang+1;FI;write(info,filler*" ");put(info,zwmodell.parameter.namelang(z));.END PROCmodellinfo;PROCinfodateiausdrucken(MODELLDGL VARzwmodell,TEXT CONSTmodellbank):INT VARi;TEXT CONSTdsnameaktuell:=dsname+"."+timeofday;gleichungsraummitdatenfuellen;infodateifuellen;print(dsnameaktuell);feld(1):=auskunftstext(auskinfogedruckt);forget(dsnameaktuell,quiet);forget(zwmodell.codeundinfo,quiet).gleichungsraummitdatenfuellen:zwmodell.codeundinfo:=modellbank+sp+"X"+sp+"hilfscode";forget(zwmodell.codeundinfo,quiet);gleichungsraum:=new(zwmodell.codeundinfo);FORiFROM1UPTOdgleichungsanzahlREPgleichungsraum.gleichungen(i):=glzeile(i).gleichungPER;gleichungsraum.gleichungen(dgleichungsanzahl+1):=endezeichen;FORiFROMdgleichungsanzahl+1UPTOgleichungsanzahlREPgleichungsraum.cogleichungen(i-dgleichungsanzahl):=glzeile(i).gleichungPER;gleichungsraum.cogleichungen(egleichungsanzahl+1):=endezeichen.infodateifuellen:forget(dsnameaktuell,quiet);FILE VARinfo:=sequentialfile(output,dsnameaktuell);INT VARz,typ1,typ2,zeilenanfang,filler;TEXT VARersteszeichen,zweiteszeichen;TEXT VARggfluecke:="";modellnameangeben;putline(info,auskunftstext(auskgleichungen));putline(info,unterstrichfeld);FORzFROM1UPTOdgleichungsanzahlREPdgleichungausgeben;PER;FORzFROM1UPTOegleichungsanzahlREPegleichungausgeben;PER;line(info);IFanzahlparameter>0THENueberschriftschreiben;FORzFROM1UPTOmax(anzahlparameter,gleichungsanzahl)REPvariableundparameterausgeben;line(info)PER;ELSEputline(info,compress(auskunftstext(auskvariablen)));putline(info,unterstrichfeld);FORzFROM1UPTOgleichungsanzahlREPgebevariableaus;line(info)PER;FI;.modellnameangeben:putline(info,compress(auskunftstext(auskmodell))+" "+zwmodell.name.lang);putline(info,length(unterstrichfeld)*"=");line(info,2).ueberschriftschreiben:putline(info,compress(auskunftstext(auskvariablen))+10*" "+compress(auskunftstext(auskparameter)));putline(info,unterstrichfeld);.dgleichungausgeben:zeilenanfang:=1;scan(gleichungsraum.gleichungen(z));nextsymbol(ersteszeichen,typ1);dasnaechstezeichenschreibenmitruecksichtaufdaszeilenende;WHILEtyp1<7REP
dasnaechstezeichenschreibenmitruecksichtaufdaszeilenendePER.egleichungausgeben:zeilenanfang:=1;scan(gleichungsraum.cogleichungen(z));nextsymbol(ersteszeichen,typ1);dasnaechstezeichenschreibenmitruecksichtaufdaszeilenende;WHILEtyp1<7REPdasnaechstezeichenschreibenmitruecksichtaufdaszeilenendePER.dasnaechstezeichenschreibenmitruecksichtaufdaszeilenende:IF(zeilenanfang+length(ersteszeichen)+1)>=77THENzeilenanfang:=1;FI;zeilenanfangINCRlength(ersteszeichen);nextsymbol(zweiteszeichen,typ2);SELECTtyp2OF CASEtrennzeichen:IFzweiteszeichen=klammeraufCANDtyp1<>trennzeichenTHENggfluecke:=" "ELSEggfluecke:=""FI;OTHERWISEggfluecke:=" "END SELECT;SELECTtyp1OF CASE1:write(info,ersteszeichen+ggfluecke);CASE2:IFersteszeichen=thenwortCORersteszeichen=elsewortTHENline(info);put(info,ersteszeichen);ELIFersteszeichen=repwortTHENput(info,ersteszeichen);line(info)ELSEput(info,ersteszeichen);FI;CASE3:write(info,ersteszeichen+ggfluecke);CASE4:write(info,ersteszeichen+ggfluecke);CASE5:put(info,ersteszeichen);CASE6:write(info,ersteszeichen);IFersteszeichen=semikolonTHENline(info);ggfluecke:=""ELIFersteszeichen=klammeraufTHENggfluecke:=""FI;write(info,ggfluecke);ENDSELECT;IFggfluecke=" "THENzeilenanfangINCR1;FI;ersteszeichen:=zweiteszeichen;typ1:=typ2;.variableundparameterausgeben:IFz<=gleichungsanzahlTHENgebevariableaus;FI;IFz<=anzahlparameterTHENgebeparameterausFI;.gebevariableaus:put(info,glzeile(z).variable);IFz<=anzahlparameterTHENfiller:=infozeilenanfang-length(compress(glzeile(z).variable));IFfiller=infozeilenanfangTHENfillerINCR1FI;FI;.gebeparameteraus:IFz>gleichungsanzahlTHENfiller:=infozeilenanfang+1;FI;write(info,filler*" ");put(info,eingabeparametername(z)).END PROCinfodateiausdrucken;PROCputgetformular1(ROW100TEXT VARfeld,INT VARcursorfeld,TEXT VARtaste):TEXT CONSTinternetasten:=return+hoch+runter+tab;put(formular(seite1),feld);REPput(formular(seite1),feld(cursorfeld),cursorfeld);get(formular(seite1),feld(cursorfeld),cursorfeld,taste);IFtaste=runterTHENcursorfeld:=3FI;IFtaste=hochTHENcursorfeld:=2FI;IFtaste=returnTHEN IFcursorfeld=2THENcursorfeld:=3ELSEcursorfeld:=2FI FI UNTILpos(internetasten,taste)=0PER END PROCputgetformular1;END PACKETmodellbasis;
|