% %1 % Start des Programms. % # BEGIN Comment VERSION 1.0 ---------------------------------------- Started : SEP 1999 ------ S ------------- ********************************** - K - m - O - * Kompost miete eindimensional * I ------------- ********************************** M * * * --- Model of a grid-based Compost plant --- U * K * * * * --- with one-dimensinal reaction --- L --- cells and their occasional merging --- A Version - 1.0 - LINUX ---------------------------------------------- State: March 2000 ---; % %2 % Deklaration der globalen Parameter. % # REAL Y_HEIGHT; Comment Höhe der Miete; REAL SIM_TIME, Comment Dauer der Simulation; TIMESTEP, Comment Zeitschritt der Berechnungen; UPD_INTERVAL; Comment Zeitintervall, mit dem der Wassergehalt nach dem Wenden angepasst wird; REAL WAT_CHANGE; Comment Rate der Anpassung des Wassergehaltes an den Standardwert; INTEGER RST, RST_0; Comment random start; REAL LIST_INTERV, Comment Intervall der Listen Ausgabe; DRAW_INTERV; Comment Intervall der graphischen Ausgabe; REAL OXY_DIFF_RATE, Comment Diffusionskoeffizient von Sauerstoff in Luft in [m^2/s]; THON, Comment Theoretischer Sauerstoffbedarf für die Mineralisierung von 1g Diesleöl in g; PORO_TOTAL, Comment Geasmtporosität; DENS_GRA, Comment Dichte der festen Phase; DENS_WAT, Comment Dichte von Wasser; WATER_CONT_MAX, Comment Maximaler Wassergehalt in [kg/kgTS]; WATER_CONT_MIN, Comment Minimaler Wassergehalt; RATE_BIOD_MAX, Comment Maximale Abbaurate [kg/m^3/Tag]; K_C, Comment Halbsättigungskonstante für die Dieselöl- Konzentration in der Substratkinetik; K_SO; Comment Halbsättigungskonstante für die Sauerstoff- Konzentration in der Substratkinetik; REAL CELL_HEIGHT; Comment Zellhöhe; REAL PI; Comment Pi; INTEGER Y_CELLS; Comment Anzahl der Zellen; INTEGER Y_HALF; Comment Y_Cells / 2; REAL SUM_VOL; Comment Hilfsvariable zur Berechnug von Volumen- anteilen der Miete; REAL WATER_DIFF; Comment Maximaler Wassergradient in der Miete; INTEGER L,M; Comment Hilfsvariablen für Schleifen; BOOLEAN MERGE; Comment Boolsche Variable, die angibt ob gewendet wurde; REAL UPD_COUNT; Comment Hilfsvariable, mit der ermittelt wird, ob der Wassergehalt an den Standardwert angepasst werden muss; REF (Infile) INF; Comment Referenzen auf die Input und Output-Files; REF (OutFile) hin, hmi, hou, oth, ave; REF (outfile) hyd, oxy, ore, hre, wre; % %3 % Darstellung eines Titelbildschirms. % # OutImage; OutImage; OutImage; Outtext (" UFT_KmO_KmO_KmO_KmO_KmO_KmO_KmO_KmO_KmO_KmO_UFT"); OutImage; Outtext (" U T"); OutImage; Outtext (" U T"); OutImage; Outtext (" U ------------ T"); OutImage; Outtext (" U / - K m O - \ T"); OutImage; Outtext (" U / Vers. \ T"); OutImage; Outtext (" U / K O M P O S T \ T"); OutImage; Outtext (" U / MIETE \ T"); OutImage; Outtext (" U _________/ ONEDIMENSIONAL \________ T"); OutImage; Outtext (" U T"); OutImage; Outtext (" U T"); OutImage; Outtext (" U Programm to Simulate a Compost T"); OutImage; Outtext (" U Plant, which Degrades Hydrocarbons T"); OutImage; Outtext (" U through Microbial Activity. T"); OutImage; Outtext (" U T"); OutImage; Outtext (" UFT (Oliver Loenker, Broder Breckling) UFT"); OutImage; OutText (" March. 2000 "); OutImage; OutImage; Outtext (" The Programm Reads the Infile -> KmO1.INF <- "); OutImage; Outtext (" "); OutImage; % %4 % Einlesen der Parameterwerte, mit denen die Simulation initialisiert % wird, aus einer externen Datei. % # INF :- NEW Infile("kmo1.inf"); INF.Open (Blanks (120) ); Inf.InImage; Y_HEIGHT := Inf.InReal; Inf.InImage; SIM_TIME := Inf.InReal; Inf.InImage; TIMESTEP := Inf.InReal; Inf.InImage; UPD_INTERVAL:= inf.InReal; inf.InImage; WAT_CHANGE := inf.InReal; inf.InImage; Rst := Inf.InInt; Inf.InImage; Rst_0 := Rst; Comment RST-Wert wird konserviert.; LIST_INTERV := Inf.Inreal; Inf.InImage; DRAW_INTERV := Inf.InReal; Inf.InImage; OXY_DIFF_RATE := Inf.InReal; Inf.InImage; THON := Inf.InReal; Inf.InImage; PORO_TOTAL := Inf.InReal; Inf.InImage; DENS_GRA := Inf.InReal; Inf.InImage; DENS_WAT := Inf.InReal; Inf.InImage; WATER_CONT_MAX := Inf.InReal; Inf.InImage; WATER_CONT_MIN := Inf.InReal; INf.InImage; RATE_BIOD_MAX := Inf.InReal; Inf.InImage; K_C := Inf.InReal; Inf.InImage; K_SO := Inf.InReal; inf.InImage; CELL_HEIGHT := Inf.InReal; Inf.InImage; PI := Inf.InReal; Inf.InImage; INF.Close; SUM_VOL := 0; MERGE := FALSE; Y_CELLS := Y_HEIGHT/CELL_HEIGHT; WATER_DIFF := WATER_CONT_MAX - WATER_CONT_MIN; % %5 % Start der Programmklasse Simulation % # SIMULATION BEGIN REF (Pore) POR; REF (Pore) ARRAY PPP ( 0 : Y_CELLS + 1 ); REF (Head) POREN_1; % %6 % Instantiierung der Porenzellen und einer Peripherie um die % Simulationsmiete. % Die Sauerstoffkonzentration in der Außenluft wird auf 999.9 gesetzt. % An diesem unrealistischen Wert können die Peripheriezellen an der % Oberfläche erkannt werden. % # PROCEDURE Generate_Pores; BEGIN INTEGER L; For L := 0 step 1 until Y_CELLS + 1 do BEGIN PPP (L):- NEW PORE (L); Comment integer -> real; PPP(L).P_OXY := 999.9; END of for; % %7 % Die Parameterwerte der Porenzellen werden gesetzt. % Die Sauerstoffkonzentration in der Aussenluft wird auf den Wert bei % 20°C gesetzt. % Die Höhe der Kontamination wird festgelegt. % # For L := 1 step 1 until Y_CELLS do BEGIN PPP (L).Inside := true; PPP (L).UPDATE_NEIGHBOURS; PPP (L).Update_Volume; PPP (L).Update_Area; PPP (L).Update_Dry_Weight; PPP (L).P_OXY := 0.275; PPP (L).C_HYDRO := 10; PPP (L).S_OXY_OLD := 0; PPP (L).UPDATE_WATER_CONTENT; PPP (L).Water_Content := PPP(L).WAT_CONT_STANDARD; PPP (L).UPDATE_DIFF_COEFF; END of for; % /8 % Die Sauerstoffkonzentration an der Mietenunterseite wird auf % -999.9 gesetzt. An diesem Wert können die Peripherie_Zellen unter % der Miete erkannt werden % # For L := 0 do BEGIN PPP(L).P_OXY := -999.9; END of for; % /9 % Nach Initialisierung der Porenparameter wird der Titelbildschirm % vervollständigt. % # OutText(" Simulation is running ..."); OutImage;OutImage; OutText(" Number of Pore Cells in Plant : "); BreakOutImage; OutInt(Y_CELLS,0); OutImage; % /10 % Schließlich werden die Porenzellen initialisiert. % # For L := 1 step 1 until Y_CELLS do BEGIN ACTIVATE PPP (L); END of for; END of generate_pores; % %11 % Die Prozessklasse PORE wird instantiiert. % Die Variablen, die ein Poren-Objekt repräsentieren, werden % deklariert. % # PROCESS CLASS PORE (Y); INTEGER Y; BEGIN BOOLEAN Inside; Comment Boolsche Variable, die angibt, ob sich eine Zelle in der Miete befindet; REAL VOLUME, Comment Volumen der Zelle; AREA_UP, Comment Oberfläche zur nächst höheren Zelle; AREA_DOWN, Comment Oberfläche zur nächst unteren Zelle; TS_PORE, Comment Trockensubstanz in einer Zelle in kg; P_OXY, Comment Sauerstoffkonzentration in der Porenluft in [kg/m^3]; R_Oxy, Comment Rate, mit der sich der absolute Sauer- stoffgehalt in einem Zeitschritt ändert; S_OXY, Comment Sauerstoff in Lösung [g/l = g/kg]; S_OXY_OLD, Comment Sauerstoff in Lösung bei t-1; P_HYDRO, Comment Dieselölgehalt [g/Zelle]; C_HYDRO, Comment Dieselölkonzentration [g/kg TS]; R_HYDRO, Comment Hydrocarbon Rate; WATER_CONTENT, Comment Wassergehalt der Zelle; WAT_CONT_STANDARD, Comment Wassergehalt bei t=0; OXY_DIFF_EFF, comment Effektiver Diffusionskoeffizient; PORO_AIR, Comment Luftpotosität; PORO_WAT, Comment Wasserporosität; AIR_VOL, Comment Luftvolumen; WATER_VOL, Comment Wasservolumen; RANDOM_HOLD;Comment Zufallsvariable; % /12 % Referenz auf die Nachbarzellen. % # REF (Pore) NEI_UP, NEI_DOWN; % %13 % Prozedur zur Ermittlung der Nachbarzellen. % # PROCEDURE Update_Neighbours; BEGIN Nei_up :- PPP (Y+1 ); Nei_down :- PPP (Y-1 ); END of update_neighbours; % %14 % Prozedur, mit welcher der das Volumen der Zelle ermittelt wird. % # PROCEDURE Update_VOLUME; BEGIN VOLUME := 0.5 * pi * CELL_HEIGHT * ((Y*CELL_HEIGHT)**2 - ((y-1)*CELL_HEIGHT)* END of Update_VOLUME; % %15 % Prozedur, welche die Oberflächen zu den nachbarzellen berechnet. % # PROCEDURE Update_Area; BEGIN AREA_UP := pi * (y *CELL_HEIGHT) * CELL_HEIGHT; AREA_DOWN := pi * ((y-1) * CELL_HEIGHT) * CELL_HEIGHT; END of Area; % %16 % Berechnung des Trockengewichts einer Zelle. % # PROCEDURE Update_Dry_Weight; BEGIN TS_PORE := Dens_Gra * VOLUME * (1-PORO_TOTAL); END; % %17 % Prozedur zur Berechnung des Wassergehaltes zu verschieden Zeitpunkten % der Simulation. % # PROCEDURE Update_WATER_CONTENT; BEGIN REAL d,y_Max,vek_y; y_Max := Y_CELLS; d := WATER_DIFF / Y_MAX; Vek_Y := (y_max -y)* d; WAT_CONT_STANDARD := WATER_CONT_MIN + Vek_Y; if WAT_CONT_STANDARD < 0.1 then WAT_CONT_STANDARD := 0.1; END of Update_WATER_CONTENT; % %18 % Prozedur, mit welcher der effektive Diffusionskoeffizient für jede % Zelle zu verschieden Zeitpunkten der Simulation bestimmt wird. % Dabei wird die Luftporosität, die Wasserporosität, das Lustvolumen % und das Wasservolumen jedesmal neu berechnet. % # PROCEDURE Update_Diff_Coeff; BEGIN REAL v; PORO_WAT := WATER_CONTENT * ((1 - PORO_TOTAL) * DENS_GRA)/DENS_WAT; PORO_AIR := PORO_TOTAL - PORO_WAT; AIR_VOL := VOLUME * PORO_AIR; WATER_VOL := VOLUME * PORO_WAT; v := PORO_AIR**1.33; OXY_DIFF_EFF := Oxy_Diff_Rate * ((PORO_AIR/PORO_TOTAL)**2) * v; END of Update_Diff_Coeff; % %19 % Berechnung der Sauerstoffdiffusion mit einer Nachbarzelle. % # PROCEDURE Oxy_Diffusion (Neighbour,area); REF (Pore) NEIGHBOUR; REAL area; BEGIN REAL FROM_TO; Comment Flux; If Neighbour.P_OXY < 999.0 then BEGIN Comment Trifft zu, wenn Nachbarzelle nicht Luftoberfläche ist; If Neighbour.P_OXY > -999.0 then BEGIN Comment Trifft zu, wenn Nachbarzelle nicht Mietenuntergrund ist; % /20 % Aufruf der Prozedur rk (Runge-Kutta-Integration) % # From_To := rk4(Neighbour.P_OXY,P_OXY,Area); Neighbour.R_Oxy := Neighbour.R_OXY - From_To; R_Oxy := R_Oxy + From_To; END ELSE BEGIN Comment Trifft zu, wenn Nachbarzelle Mietenuntergrund ist, nichts passiert; END of if; END of if ELSE BEGIN Comment Trifft zu wenn Nachbarzelle Luftoberfläche ist From_To := rk4(0.275,P_OXY,Area); R_Oxy := R_Oxy + From_To; END of if; END of Oxy_Diffusion ; % %21 % Prozedur, die den Abbau des Dieselöls kalkuliert. % # PROCEDURE Biodegradation; BEGIN REAL RATE_BIOD; RATE_BIOD := (RATE_BIOD_MAX *TIMESTEP / ( 86400 ))* (S_OXY**10 / (K_SO**10 + S_OXY**10)); R_HYDRO := RATE_BIOD * (C_Hydro**2 / (C_Hydro**2 + K_C**2)) * TS_PORE END of Biodegradation; % %22 % Kalkulation des Sauerstoffverbrauchs in Abhängigkeit % von der Biodegradation. % # PROCEDURE Oxy_Usage; BEGIN REAL USED_OXY; Comment Verbrauchter Sauerstoff pro Zelle; USED_OXY := R_HYDRO * THON; S_OXY_OLD := (S_OXY * WATER_VOL*1000 - USED_OXY) / (WATER_VOL*1000); IF S_OXY_OLD < 0 THEN S_OXY_OLD := 0; END; % %23 % Runge-Kutta-Integrationsverfahren zweiter Ordnung. % # REAL PROCEDURE rk4(N_O,O, area); Real N_O, O, area; BEGIN REAL k1, k2, k3, k4, t_half, y, y_N; t_half := TIMESTEP/2; k1 := OXY_DIFF_EFF * AREA *((N_O - O) / CELL_HEIGHT) * t_half; y := O + k1; y_N := N_O - k1; rk4 := OXY_DIFF_EFF * AREA * ((y_N - y) / CELL_HEIGHT) * TIMESTEP ; END of rk4; % %24 % Passt den Wassergehalt nach Durchmischung in vorgegebenen % Intervallen wieder dem Standardwert an. % # PROCEDURE upd_wat_merge; BEGIN REAL change; change := (WATER_CONTENT - WAT_CONT_STANDARD)*WAT_CHANGE; WATER_CONTENT := WATER_CONTENT - change; END; % %25 % Porenzellen werden auf ihre Aktivität vorbereitet. % # Into (Poren_1); WHILE true do BEGIN % /26 % Aufruf der Prozedur Oxy_Diffusion mit zur % Berechnung des Sauerstofftransfers mit den % beiden Nachbarzellen. % # Oxy_Diffusion (Nei_up,AREA_UP); Oxy_Diffusion (Nei_down,AREA_DOWN); % /27 % Der Sauerstoffflux wird zum Pool addiert. % Falls die Konzentration unter Null sinkt, wird die % Simulation abgebrochen und eine Fehlermeldung % ausgegeben. % # P_OXY := (P_OXY * AIR_VOL + R_Oxy) / AIR_VOL; IF P_OXY < 0 THEN Error ("Kompartiment Overflow !"); % /28 % Berechnung des in Wasser gelösten Sauerstoffs mit dem % Henry'schen Gesetz. 1 mol Luft nimmt bei 20°C 24,5 l % Volumen ein, die Henry-Konstante hat den % Wert: 0.0013 mol/(kg * bar). % Anschließend wird der gelöste Sauerstoff aus der % Porenluft subtrahiert, wobei der noch gelöste % Sauerstoff aus dem vorigen Zeitschritt addiert % wird. % # S_OXY := 0.0013 * 24.5 * P_OXY; P_OXY := (P_OXY * AIR_VOL - WATER_VOL * (S_OXY - S_OXY_OLD)) / AIR_VOL; R_Oxy := 0.0; % /29 % Das Dieselölpool in der Zelle wird aus der % Konzentration ermittelt. % Danach wird die Prozedur Biodegradation aufgerufen. % # P_HYDRO := C_Hydro * TS_PORE; Biodegradation; % /30 % Update des Dieselölpools und der Konzentration. % # P_HYDRO := P_HYDRO - R_HYDRO; C_Hydro := P_HYDRO / TS_PORE; % /31 % Aufruf der Prozedur Oxy_Usage. % # OXY_USAGE; R_HYDRO := 0; R_OXY := 0; S_OXY := 0; % /32 % Abfrage, ob der Wassergehalt angepasst werden muss. % Wenn ja, wird die Prozedur Upd_wat_merge und % Update_Diff_Coeff aufgerufen. % # UPD_COUNT := Mod(Time,UPD_INTERVAL); IF MERGE AND UPD_COUNT = 0 THEN BEGIN Upd_Wat_Merge; Update_Diff_Coeff; END; % /33 % Ermittlung der Zufallszahl Random_Hold. % Durch wird bei jedem Zeitschritt eine % andere reihenfolge der Berechnung in den % einzelnen Poren ermöglicht, um numerische % Artefakte zu vermeiden. % # Random_Hold := UNIFORM (0.0, TIMESTEP , Rst); HOLD (Random_Hold); HOLD (TIMESTEP - Random_Hold); END of WHILE; END of pore; % %34 % Prozessklasse Merge_Kompost wird instantiiert. % Mit ihr werden zu bestimmten Zeitpunkten die % Zellen durchmischt. Aus dem Dieselölgehalt % wird ein Mittelwert gebildet, während die % Wassergehalte zufällig verteilt werden. % # Process CLASS Merge_Compost; BEGIN REAL add,add2, wadd, avec, avew; FOR L:= 1 STEP 1 UNTIL Y_CELLS DO BEGIN add := add + PPP(L).C_Hydro * PPP(L).TS_PORE; add2 := add2 + PPP(L).TS_PORE; wadd := wadd + PPP(L).TS_PORE * PPP(L).WATER_CONTENT; END of for; aveC := add / add2; aveW := wadd /add2; FOR L:= 1 STEP 1 UNTIL Y_CELLS DO BEGIN PPP(L).C_Hydro := aveC; PPP(L).WATER_CONTENT := aveW; PPP(L).P_OXY := 0.275; PPP(L).S_OXY_OLD := 0; PPP(L).Update_diff_Coeff; END of for; MERGE := TRUE; END of Merge_Compost; % %35 % Nach Aktivierung dieser Klasse werden in bestimmten % Intervallen die Sauerstoffgehalte der Zellen in % einen File geschrieben. % # process class List_Oxy; BEGIN OXY :- NEW Outfile ("oxy.dat"); If (Y_CELLS * 7) < 120 then BEGIN OXY.Open (Blanks (120)); END ELSE BEGIN OXY.Open (Blanks (Y_CELLS * 7)); END; WHILE true do BEGIN oxy.outtext("Time: "); oxy.breakoutimage; oxy.outint(time/86400,0);oxy.outimage; For L := 1 step 1 until (Y_CELLS) do BEGIN oxy.outint(L,0);oxy.breakoutimage; oxy.outtext(" ");oxy.breakoutimage; OXY.OutReal(PPP (L).P_OXY,4 , 15); oxy.outimage; END of for; oxy.outimage;oxy.outimage; HOLD (list_Interv); END of WHILE; END of List_Oxy; % %36 % Nach Aktivierung dieser Klasse werden in bestimmten % Intervallen die Dieselölgehalte der Zellen in % einen File geschrieben. % # process class List_Hydro; BEGIN HYD :- NEW Outfile ("hydro.dat"); If (Y_CELLS * 7) < 120 then BEGIN HYD.Open (Blanks (120)); END ELSE BEGIN HYD.Open (Blanks (Y_CELLS * 7)); END; WHILE true do BEGIN hyd.outtext("Time: "); hyd.breakoutimage; hyd.outint(time/86400,0);hyd.outimage; For L := 1 step 1 until (Y_CELLS) do BEGIN hyd.outint(L,0);hyd.breakoutimage; hyd.outtext(" ");hyd.breakoutimage; HYD.OutReal(PPP (L).C_Hydro,4 , 15); hyd.outimage; END of for; hyd.outimage;hyd.outimage; HOLD (list_Interv); END of WHILE; END of list_hydro; % %37 % Nach Aktivierung dieser Klasse wird in bestimmten % Intervallen der durchschnittliche Dieselöl- % gehalt in der Gesamtmiete in einen File % geschrieben. % # PROCESS CLASS List_Observer_average; BEGIN REAL add, add2; AVE :- NEW Outfile ("average.dat"); If (Y_CELLS * 7) < 120 then BEGIN AVE.Open (Blanks (120)); END ELSE BEGIN AVE.Open (Blanks (Y_CELLS * 7)); END; WHILE true do BEGIN add := 0; add2 := 0; For L := 1 STEP 1 UNTIL Y_CELLS do BEGIN add := add + PPP(L).C_Hydro * PPP(L).TS_PORE; add2 := add2 + PPP(L).TS_PORE; END of for; add := add / add2; AVE.OutFix(Time/86400,0,0); AVE.BreakOutImage; AVE.OutText(" "); AVE.BreakOutImage; AVE.OutReal(add,4,12); AVE.OutImage; HOLD (List_Interv); END of WHILE; END of list_observer_average; % %38 % Nach Aktivierung dieser Klasse wird in bestimmten % Intervallen der durchschnittliche Dieselöl- % gehalt im inneren Mietendrittel in einen File % geschrieben. % # PROCESS CLASS List_Observer_inner; BEGIN REAL add, add2; HIN :- NEW Outfile ("inner.dat"); If (Y_CELLS * 7) < 120 then BEGIN HIN.Open (Blanks (120)); END ELSE BEGIN HIN.Open (Blanks (Y_CELLS * 7)); END; WHILE true do BEGIN add := 0; add2 := 0; m:= Y_CELLS /3; For L := 1 STEP 1 UNTIL m do BEGIN add := add + PPP(L).C_Hydro * PPP(L).TS_PORE; add2 := add2 + PPP(L).TS_PORE; END of for; add := add / add2; HIN.OutFix(time/86400,0,0); HIN.BreakOutImage; HIN.OutText(" "); HIN.BreakOutImage; HIN.OutReal(add,4,12); HIN.OutImage; HOLD (List_Interv); END of WHILE; END of list_observer_inner; % %39 % Nach Aktivierung dieser Klasse wird in bestimmten % Intervallen der durchschnittliche Dieselöl- % gehalt im mittleren Mietendrittel in einen % File geschrieben. % # PROCESS CLASS List_Observer_mid; BEGIN INTEGER k; REAL add, add2; HMI :- NEW Outfile ("mid.dat"); If (Y_CELLS * 7) < 120 then BEGIN HMI.Open (Blanks (120)); END ELSE BEGIN HMI.Open (Blanks (Y_CELLS * 7)); END; WHILE true do BEGIN add := 0; add2 := 0; m:= Y_CELLS /3 +1 ; k:= 2*Y_CELLS /3; For L := m STEP 1 UNTIL k do BEGIN add := add + PPP(L).C_Hydro * PPP(L).TS_PORE; add2 := add2 + PPP(L).TS_PORE; END of for; add := add / add2; HMI.OutFix(time/86400,0,0); HMI.BreakOutImage; HMI.OutText(" "); HMI.BreakOutImage; HMI.OutReal(add,4,12); HMI.OutImage; HOLD (List_Interv); END of WHILE; END of list_observer_inner; % %40 % Nach Aktivierung dieser Klasse wird in bestimmten % Intervallen der durchschnittliche Dieselöl- % gehalt im äußeren Mietendrittel in einen % File geschrieben. % # PROCESS CLASS List_Observer_outer; BEGIN REAL add, add2; HOU :- NEW Outfile ("outer.dat"); If (Y_CELLS * 7) < 120 then BEGIN HOU.Open (Blanks (120)); END ELSE BEGIN HOU.Open (Blanks (Y_CELLS * 7)); END; WHILE true do BEGIN add := 0; add2 := 0; m:= 2 * Y_CELLS /3 +1; For L := m STEP 1 UNTIL Y_CELLS do BEGIN add := add + PPP(L).C_Hydro * PPP(L).TS_PORE; add2 := add2 + PPP(L).TS_PORE; END of for; add := add / add2; HOU.OutFix(time/86400,0,0); HOU.BreakOutImage; HOU.OutText(" "); HOU.BreakOutImage; HOU.OutReal(add,4,12); HOU.OutImage; HOLD (List_Interv); END of WHILE; END of list_observer_inner; % %41 % Nach Aktivierung dieser Klasse wird in bestimmten % Intervallen der Wassergehalt in den Zellen % in einen File geschrieben. % # Process CLASS List_Water_Content; BEGIN OTH :- NEW Outfile ("water.dat"); If (Y_CELLS * 7) < 120 then BEGIN OTH.Open (Blanks (120)); END ELSE BEGIN OTH.Open (Blanks (Y_CELLS * 7)); END; WHILE TRUE DO BEGIN OTH.OutInt(Time/86400,0);oth.OutImage; For L := 1 step 1 until Y_CELLS do BEGIN oth.outint(L,0);oth.breakoutimage; oth.outtext(" ");oth.breakoutimage; OTH.OutReal(PPP (L).WATER_CONTENT,4 , 0); oth.outimage; END of for; oth.OutImage; Hold(UPD_INTERVAL); END of WHILE; END of list_WATER_CONTENT; % %42 % Ende der Deklarationen. % Die Prozedur Generate_Pores wird aufgerufen und % die Simulation dadurch gestartet. % Die für den Output zuständigen Prozess- % klassen werden anschließend aktiviert. % # Poren_1 :- NEW Head; GENERATE_PORES; ACTIVATE NEW List_Oxy; ACTIVATE NEW List_Hydro; ACTIVATE NEW List_Water_Content; ACTIVATE NEW List_Observer_average; ACTIVATE NEW List_Observer_INNER; ACTIVATE NEW List_Observer_mid; ACTIVATE NEW List_Observer_outer; % /43 % Aktivierung der Prozessklasse Merge_Compost % zu bestimmten Zeitpunkten der Simulation. % # ACTIVATE NEW Merge_Compost at 4838400; Comment 8 Wochen; ACTIVATE NEW Merge_Compost at 9676800; Comment 16 Wochen; ACTIVATE NEW Merge_Compost at 14515200; Comment 24 Wochen; ACTIVATE NEW Merge_Compost at 19353600; Comment 32 Wochen; ACTIVATE NEW Merge_Compost at 24192000; Comment 40 Wochen; ACTIVATE NEW Merge_Compost at 29030400; Comment 48 Wochen; % /44 % Abschließend wird die Simulationsdauer festgelegt. % # HOLD (SIM_TIME); Comment setting duration of the simulation; END of simulation; END of program;