diff options
Diffstat (limited to 'Physikunit.pas')
-rw-r--r-- | Physikunit.pas | 339 |
1 files changed, 286 insertions, 53 deletions
diff --git a/Physikunit.pas b/Physikunit.pas index 1d50c5a..8c216c9 100644 --- a/Physikunit.pas +++ b/Physikunit.pas @@ -47,6 +47,22 @@ type procedure speichereWerte(gitter: tGitter; sDX: extended); end; + { tTeilchenSpezies } + + tTeilchenSpezies = class + private + ortsGrenzen: array of extended; + dichteStuecke: array of string; + public + nMax, // maximale Massendichte in nc + spezifischeLadung: extended; // q/m in e/me + constructor create; + destructor destroy; override; + procedure dump(prot: tProtokollant; prefix: string); + function gibDichte(x: extended; kvs: tKnownValues): extended; // Massendichte + procedure liesDichteFunktion(rest: string; ifile: tMyStringList; kvs: tKnownValues; teilchen: array of tTeilchenSpezies; prot: tProtokollant); + end; + { tWertePunkt } tWertePunkt = class(tObject) // repräsentiert alle Werte eines Punktes im Gitter und deren Zeitableitungen @@ -64,6 +80,7 @@ type procedure berechneAbleitungen(dX,iDX: extended); procedure liKo(in1,in2: tWertePunkt; fak2: extended); overload; // Werte werden auf (in1 + fak2*in2') gesetzt procedure liKo(in1,in2,in3,in4,in5: tWertePunkt; fak2,fak3,fak4,fak5: extended); overload; // Werte werden auf (in1 + \sum_i faki * ini') gesetzt + function maxDT: extended; end; { TFelder } @@ -77,11 +94,12 @@ type inhalt: array of tWertePunkt; par: tGitter; - constructor create(groesse: longint; dichten,lichter: tMyStringList; parent: tGitter); + constructor create(groesse: longint; teilchen: array of tTeilchenSpezies; lichter: tMyStringList; parent: tGitter); destructor destroy; override; procedure berechneAbleitungen(dT,dX,iDT,iDX,pDNMax: extended); procedure liKo(in1,in2: tFelder; fak2: extended); overload; // Werte werden auf (in1 + fak2*in2') gesetzt procedure liKo(in1,in2,in3,in4,in5: tFelder; fak2,fak3,fak4,fak5: extended); overload; // Werte werden auf (in1 + \sum_i faki * ini') gesetzt + function maxDT: extended; end; { tGitter } @@ -99,10 +117,10 @@ type aktuelleFelder: longint; felders: array of tFelder; // mehrere komplette Simulationsboxen von Feldern, benötigt um Zwischenschritte für die Zeitentwicklung zu speichern - constructor create(size: longint; deltaT,deltaX,pDNMa: extended; bekannteWerte: tKnownValues; dichten, lichter: tMyStringlist; zv: tZeitverfahren; protokollant: tProtokollant; name: string); + constructor create(size: longint; deltaT,deltaX,pDNMa: extended; bekannteWerte: tKnownValues; teilchen: array of tTeilchenSpezies; lichter: tMyStringlist; zv: tZeitverfahren; protokollant: tProtokollant; name: string); destructor destroy; override; - procedure iteriereSchritt(dT,iDT: extended); - function gibErhaltungsgroessen: string; + procedure iteriereSchritt(var dT: extended); + function dumpErhaltungsgroessen: boolean; procedure berechne(was: char; teilchen: longint); end; @@ -147,7 +165,7 @@ begin dec(num); inc(num); if num<=length(feldName) then begin - teilchen:=strtoint(copy(feldName,num,length(feldName))); + teilchen:=strtoint(copy(feldName,num,length(feldName)))-1; delete(feldName,num,length(feldName)); end else @@ -186,7 +204,7 @@ begin end; if teilchen>=0 then - pre:=matFeldNamen[maF]+inttostr(teilchen) + pre:=matFeldNamen[maF]+inttostr(teilchen+1) else pre:=emFeldNamen[emF]; @@ -201,6 +219,7 @@ destructor tAusgabeDatei.destroy; begin if (tCnt<>zeitAnz) and ((nNum<>0) or (tCnt<>-1)) then begin pro.schreibe('Falsche Anzahl an Zeitschritten in '+pre+'-'+inttostr(nNum-1)+suf+' geschrieben ('+inttostr(tCnt)+' statt '+inttostr(zeitAnz)+')!',true); + pro.destroyall; halt(1); end; inherited destroy; @@ -221,6 +240,7 @@ procedure tAusgabeDatei.schreibeKopf; begin if (tCnt<>zeitAnz) and ((nNum<>0) or (tCnt<>-1)) then begin pro.schreibe('Falsche Anzahl an Zeitschritten in '+pre+'-'+inttostr(nNum-1)+suf+' geschrieben ('+inttostr(tCnt)+' statt '+inttostr(zeitAnz)+')!',true); + pro.destroyall; halt(1); end; tCnt:=0; @@ -236,6 +256,11 @@ procedure tAusgabeDatei.speichereWerte(gitter: tGitter; sDX: extended); var i,cnt: longint; sX,cX: extended; begin + if (teilchen>=gitter.felders[gitter.aktuelleFelder].matAnz) then begin + pro.schreibe('Teilchen '+inttostr(teilchen+1)+' gibt es nicht, da kann ich auch nichts speichern!',true); + pro.destroyall; + halt(1); + end; if (teilchen<0) and (emInhalt=efA) then gitter.berechne('A',teilchen); if (teilchen>=0) and (matInhalt=mfP) then @@ -278,10 +303,107 @@ begin closeFile(datei); if cnt<>0 then begin pro.schreibe('Falsche Anzahl an Ortsschritten geschrieben ('+inttostr(cnt)+')!',true); + pro.destroyall; halt(1); end; end; +{ tTeilchenSpezies } + +constructor tTeilchenSpezies.create; +begin + inherited create; + fillchar(ortsGrenzen,sizeof(ortsGrenzen),#0); + setlength(ortsGrenzen,0); + fillchar(dichteStuecke,sizeof(dichteStuecke),#0); + setlength(dichteStuecke,0); + nMax:=0; + spezifischeLadung:=0; +end; + +destructor tTeilchenSpezies.destroy; +begin + setlength(ortsGrenzen,0); + setlength(dichteStuecke,0); + inherited destroy; +end; + +procedure tTeilchenSpezies.dump(prot: tProtokollant; prefix: string); +var + i: longint; +begin + prot.schreibe(prefix+'nMax = '+floattostr(nMax)+' * nc'); + prot.schreibe(prefix+'q/m = '+floattostr(spezifischeLadung)+' e/me'); + prot.schreibe(prefix+'n(x):'); + for i:=0 to length(dichteStuecke)-1 do begin + prot.schreibe(prefix+' '+dichteStuecke[i]); + if i<length(ortsGrenzen) then + prot.schreibe(prefix+' '+floattostr(ortsGrenzen[i])); + end; +end; + +function tTeilchenSpezies.gibDichte(x: extended; kvs: tKnownValues): extended; +var + i: longint; +begin + i:=0; + while (i<length(ortsGrenzen)) and (ortsGrenzen[i]<x) do + inc(i); + kvs.add('x',x); + result:=nMax*exprToFloat(false,dichteStuecke[i],kvs,nil); + kvs.rem('x'); +end; + +procedure tTeilchenSpezies.liesDichteFunktion(rest: string; ifile: tMyStringList; kvs: tKnownValues; teilchen: array of tTeilchenSpezies; prot: tProtokollant); +var + s: string; + ori,i: longint; +begin + if rest='stückweise' then begin + setlength(ortsGrenzen,0); + setlength(dichteStuecke,0); + repeat + if not ifile.readln(s) then begin + prot.schreibe('Unerwartetes Dateiende in Parameterdatei im Bereich teilchen -> verteilung stückweise!',true); + prot.destroyall; + halt(1); + end; + + if length(dichteStuecke)=length(ortsGrenzen) then begin // neues Funktionsstück wird definiert + setlength(dichteStuecke,length(dichteStuecke)+1); + dichteStuecke[length(dichteStuecke)-1]:=s; + continue; + end; + + // kein neues Funktionsstück => + if s='stückweiseEnde' then break; // Ende oder + // neue Ortsgrenze + + setlength(ortsGrenzen,length(ortsGrenzen)+1); + ortsGrenzen[length(ortsGrenzen)-1]:=exprToFloat(false,s,kvs,nil); + until false; + end + else if startetMit('wie teilchen',rest) then begin + ori:=strtoint(rest)-1; + if (ori<0) or (ori>=length(teilchen)-1) then begin + prot.schreibe('Kann mich nicht auf die Dichte von Teilchen '+inttostr(ori+1)+' beziehen, weil es noch nicht definiert wurde!',true); + prot.destroyall; + halt(1); + end; + setlength(ortsGrenzen,length(teilchen[ori].ortsGrenzen)); + for i:=0 to length(ortsGrenzen)-1 do + ortsGrenzen[i]:=teilchen[ori].ortsGrenzen[i]; + setlength(dichteStuecke,length(teilchen[ori].dichteStuecke)); + for i:=0 to length(dichteStuecke)-1 do + dichteStuecke[i]:=teilchen[ori].dichteStuecke[i]; + end + else begin + setlength(ortsGrenzen,0); + setlength(dichteStuecke,1); + dichteStuecke[0]:=rest; + end; +end; + { tWertePunkt } constructor tWertePunkt.create(linkerNachbar: tWertePunkt; materien: longint); @@ -470,27 +592,37 @@ begin + fak5 * in5.matWerte[i,maF,true]; end; +function tWertePunkt.maxDT: extended; +var + i: longint; +begin + result:=1; + for i:=0 to length(matWerte)-1 do + if (matWerte[i,mfN,true]<0) and + (matWerte[i,mfN,false]>0) then + result:=min(result,matWerte[i,mfN,false]/matWerte[i,mfN,true]); +end; + { tFelder } -constructor tFelder.create(groesse: longint; dichten,lichter: tMyStringList; parent: tGitter); +constructor tFelder.create(groesse: longint; teilchen: array of tTeilchenSpezies; lichter: tMyStringList; parent: tGitter); var i,j: longint; rechts: boolean; begin inherited create; par:=parent; - matAnz:=dichten.count; + matAnz:=length(teilchen); fillchar(inhalt,sizeof(inhalt),#0); setlength(inhalt,groesse+4); // zwei Felder links und rechts extra für Randbedingungen inhalt[0]:=tWertePunkt.create(nil,matAnz); for i:=1 to length(inhalt)-1 do inhalt[i]:=tWertePunkt.create(inhalt[i-1],matAnz); - for i:=0 to length(inhalt)-1 do begin - parent.kvs.add('x',par.xl+(i-2)/groesse*par.dX); - for j:=0 to dichten.count-1 do - inhalt[i].matWerte[j,mfN,false]:=exprToFloat(false,dichten[j],parent.kvs,nil); - end; - parent.kvs.rem('x'); + for i:=0 to length(inhalt)-1 do + for j:=0 to length(teilchen)-1 do begin + inhalt[i].matWerte[j,mfN,false]:=teilchen[j].gibDichte(par.xl+(i-2)*par.dX,parent.kvs); + inhalt[i].matWerte[j,mfDPsiDX,false]:=0; + end; for rechts:=false to true do begin lichters[rechts]:=tMyStringlist.create(nil,''); lichters[rechts].text:=lichter.text; @@ -572,9 +704,18 @@ begin inhalt[i].liKo(in1.inhalt[i],in2.inhalt[i],in3.inhalt[i],in4.inhalt[i],in5.inhalt[i],fak2,fak3,fak4,fak5); end; +function tFelder.maxDT: extended; +var + i: longint; +begin + result:=inhalt[0].maxDT; + for i:=1 to length(inhalt)-1 do + result:=min(result,inhalt[i].maxDT); +end; + { tGitter } -constructor tGitter.create(size: longint; deltaT,deltaX,pDNMa: extended; bekannteWerte: tKnownValues; dichten, lichter: tMyStringlist; zv: tZeitverfahren; protokollant: tProtokollant; name: string); +constructor tGitter.create(size: longint; deltaT,deltaX,pDNMa: extended; bekannteWerte: tKnownValues; teilchen: array of tTeilchenSpezies; lichter: tMyStringlist; zv: tZeitverfahren; protokollant: tProtokollant; name: string); var i: longint; begin @@ -597,7 +738,7 @@ begin xl:=dX/2; for i:=0 to length(felders)-1 do - felders[i]:=tFelder.create(size,dichten,lichter,self); + felders[i]:=tFelder.create(size,teilchen,lichter,self); aktuelleFelder:=0; t:=0; @@ -614,16 +755,45 @@ begin inherited destroy; end; -procedure tGitter.iteriereSchritt(dT,iDT: extended); -var i: longint; +procedure tGitter.iteriereSchritt(var dT: extended); +var i: longint; {$IFDEF Zeitschrittueberwachung} - pro: tProtokollant; - j: longint; + pro: tProtokollant; + j: longint; {$ENDIF} + iDT,mDT: extended; begin - t:=t+dT; - kvs.add('t',t); - felders[aktuelleFelder].berechneAbleitungen(dT,dX,iDT,iDX,pDNMax); // y' = y'(t,y(t)) + kvs.add('t',t+dT); + diffusionsTermAnpassen(prot); + + repeat + iDT:=1/dT; + felders[aktuelleFelder].berechneAbleitungen(dT,dX,iDT,iDX,pDNMax); // y' = y'(t,y(t)) + + mDT:=felders[aktuelleFelder].maxDT; + // das maximale dT, welches bei den Momentanen Ableitungen nicht zu + // unphysikalischen Effekten (z.B. negativen Dichten) führt + + if mDT<dT*2 then begin // beabsichtigter Zeitschritt ist zu groß + dT:=mDT/4; // machen wir ihn kleiner! + {$IFDEF Zeitschrittueberwachung} + pro:=tProtokollant.create(prot,'iteriereSchritt'); + pro.schreibe('dT -> '+floattostr(dT)); + if dT<1E-30 then begin + pro.schreibe('Zeitschritt geht gegen Null (ist bereits '+floattostr(dT)+' < 10^-30) - irgendwas scheint grundsätzlich kaputt zu sein!',true); + pro.destroyall; + halt(1); + end; + pro.free; + {$ENDIF} + continue; + end; + + break; + until false; + + if dT<mDT/1000 then + dT:=min(1,mDT)/1000; case zeitverfahren of zfEulerVorwaerts: // y(t+dt) = y(t) + y' dt @@ -680,31 +850,38 @@ begin halt(1); end; {$ENDIF} + t:=t+dT; end; -function tGitter.gibErhaltungsgroessen: string; +function tGitter.dumpErhaltungsgroessen: boolean; var i,j: integer; ns: tExtendedArray; pro: tProtokollant; + s: string; begin - pro:=tProtokollant.create(prot,'gibErhaltungsgroessen'); + pro:=tProtokollant.create(prot,'dumpErhaltungsgroessen'); setlength(ns,felders[aktuelleFelder].matAnz); - result:=''; + + result:=true; + + s:=''; for i:=0 to length(ns)-1 do ns[i]:=0; for i:=0 to length(felders[aktuelleFelder].inhalt)-1 do for j:=0 to length(ns)-1 do ns[j]:=ns[j] + felders[aktuelleFelder].inhalt[i].matWerte[j,mfN,false]; for i:=0 to length(ns)-1 do begin - result:=result + ' n['+inttostr(i)+']='+floattostr(ns[i]); + ns[i]:=ns[i]*dX; + s:=s+ ' n['+inttostr(i)+']='+floattostr(ns[i]); {$IFDEF Dichteueberwachung} if ns[i]>1000 then begin - errorCode:=2; - pro.schreibe(' n > 1000, es scheinen sehr viele neue Teilchen entstanden zu sein. Die Simulation wird abgebrochen. (t='+floattostr(t)+')'); + result:=false; + pro.schreibe(' n['+inttostr(i)+'] > 1000, es scheinen sehr viele neue Teilchen entstanden zu sein. Die Simulation wird abgebrochen. (t='+floattostr(t)+')',true); end; {$ENDIF} end; - delete(result,1,1); + delete(s,1,1); + prot.schreibe(s); pro.free; end; @@ -763,6 +940,7 @@ begin exit; end; prot.schreibe('Kann '''+was+''' nicht berechnen, weil ich es nicht verstehe!',true); + prot.destroyall; halt; end; @@ -776,7 +954,8 @@ var deltaX,breite,pDNMax: extended; i: longint; kvs: tKnownValues; - dichten,lichter: tMyStringlist; + teilchen: array of tTeilchenSpezies; + lichter: tMyStringlist; pro: tProtokollant; begin inherited create; @@ -787,6 +966,7 @@ begin ifile.loadfromfile(inName); if not ifile.unfoldMacros then begin prot.schreibe('Fehlerhafte Macros in Parameterdatei '''+inName+'''!',true); + prot.destroyall; halt(1); end; @@ -797,6 +977,8 @@ begin kvs.add('T',1); kvs.add('ω',2*pi); kvs.add('dX',deltaX); + kvs.add('q',1); + kvs.add('me',1); dT:=-1; sDT:=-1; sDX:=-1; @@ -814,11 +996,12 @@ begin lichter:=tMyStringlist.create(prot,'lichter'); // Standardeinstellungen Breich 'teilchen...' - dichten:=tMyStringlist.create(prot,'teilchen'); + setlength(teilchen,0); repeat if not ifile.readln(s) then begin prot.schreibe('Unerwartetes Dateiende in '''+inName+'''!',true); + prot.destroyall; halt(1); end; @@ -829,6 +1012,7 @@ begin repeat if not ifile.readln(s) then begin prot.schreibe('Unerwartetes Dateiende in Parameterdatei '''+inName+''' im Bereich allgemein!',true); + prot.destroyall; halt(1); end; if s='allgemeinEnde' then break; @@ -840,25 +1024,25 @@ begin Zeitverfahren:=zfEulerVorwaerts; continue; end; - if startetMit('ortsschritt',s) then begin + if startetMit('ortsschritt ',s) then begin deltaX:=exprtofloat(false,s,kvs,nil); kvs.add('dX',deltaX); continue; end; - if startetMit('zeitschritt',s) then begin + if startetMit('zeitschritt ',s) then begin dT:=exprtofloat(false,s,kvs,nil); kvs.add('dT',dT); continue; end; - if startetMit('diffusionsterm',s) then begin + if startetMit('diffusionsterm ',s) then begin pDNMax:=exprtofloat(false,s,kvs,nil); continue; end; - if startetMit('zeit',s) then begin + if startetMit('zeit ',s) then begin tEnde:=exprtofloat(false,s,kvs,nil); continue; end; - if startetMit('breite',s) then begin + if startetMit('breite ',s) then begin breite:=exprtofloat(false,s,kvs,nil); continue; end; @@ -871,6 +1055,7 @@ begin continue; end; prot.schreibe('Unbekannter Befehl '''+s+''' in Parameterdatei '''+inName+''' im Bereich allgemein!',true); + prot.destroyall; halt(1); until false; continue; @@ -880,26 +1065,27 @@ begin repeat if not ifile.readln(s) then begin prot.schreibe('Unerwartetes Dateiende in Parameterdatei '''+inName+''' im Bereich ausgaben!',true); + prot.destroyall; halt(1); end; if s='ausgabenEnde' then break; - if startetMit('suffix',s) then begin + if startetMit('suffix ',s) then begin aSuffix:=s; continue; end; - if startetMit('prefix',s) then begin + if startetMit('prefix ',s) then begin aPrefix:=s; continue; end; - if startetMit('zeitschritt',s) then begin + if startetMit('zeitschritt ',s) then begin sDT:=exprtofloat(false,s,kvs,nil); continue; end; - if startetMit('ortsschritt',s) then begin + if startetMit('ortsschritt ',s) then begin sDX:=exprtofloat(false,s,kvs,nil); continue; end; - if startetMit('felder',s) then begin + if startetMit('felder ',s) then begin s:=s+','; while s<>'' do begin t:=erstesArgument(s,','); @@ -909,6 +1095,7 @@ begin continue; end; prot.schreibe('Unbekannter Befehl '''+s+''' in Parameterdatei '''+inName+''' im Bereich ausgaben!',true); + prot.destroyall; halt(1); until false; continue; @@ -924,10 +1111,49 @@ begin continue; end; prot.schreibe('Licht kann nicht von '''+erstesArgument(s)+''' kommen!',true); + prot.destroyall; halt(1); end; + if startetMit('teilchen',s) then begin + if (s<>'') and (strtoint(s)<>length(teilchen)+1) then begin + prot.schreibe('Ich erwarte die Teilchen beginnend bei 1 der Reihe nach in Parameterdatei '''+inName+'''!',true); + prot.destroyall; + halt(1); + end; + setlength(teilchen,length(teilchen)+1); + teilchen[length(teilchen)-1]:=tTeilchenSpezies.create; + repeat + if not ifile.readln(s) then begin + prot.schreibe('Unerwartetes Dateiende in Parameterdatei '''+inName+''' im Bereich teilchen!',true); + prot.destroyall; + halt(1); + end; + if s='teilchen'+inttostr(length(teilchen))+'Ende' then break; + if startetMit('spezifische Ladung ',s) then begin + teilchen[length(teilchen)-1].spezifischeLadung:=exprToFloat(false,s,kvs,nil); + kvs.add('qm'+inttostr(length(teilchen)),teilchen[length(teilchen)-1].spezifischeLadung); + continue; + end; + if startetMit('maximaldichte ',s) then begin + teilchen[length(teilchen)-1].nMax:=exprToFloat(false,s,kvs,nil); + kvs.add('nmax'+inttostr(length(teilchen)),teilchen[length(teilchen)-1].nMax); + continue; + end; + if startetMit('verteilung ',s) then begin + teilchen[length(teilchen)-1].liesDichteFunktion(s,ifile,kvs,teilchen,prot); + continue; + end; + + prot.schreibe('Unbekannter Befehl '''+s+''' in Parameterdatei '''+inName+''' im Bereich teilchen!',true); + prot.destroyall; + halt(1); + until false; + continue; + end; + prot.schreibe('Unbekannter Befehl '''+s+''' in Parameterdatei '''+inName+'''!',true); + prot.destroyall; halt(1); until false; @@ -935,6 +1161,7 @@ begin if length(ausgabedateien)=0 then begin prot.schreibe('Du solltest irgendetwas abspeichern lassen!',true); + prot.destroyall; halt(1); end; @@ -962,9 +1189,10 @@ begin pro.schreibe('pDNMax = '+floattostr(pDNMax)); pro.schreibe('bekannte Werte:'); kvs.dump(pro,' '); - if dichten.count>0 then begin - pro.schreibe('dichten:'); - dichten.dump(pro,' '); + if length(teilchen)>0 then begin + pro.schreibe('teilchen:'); + for i:=0 to length(teilchen)-1 do + teilchen[i].dump(pro,' '); end; if lichter.count>0 then begin pro.schreibe('lichter:'); @@ -980,8 +1208,10 @@ begin end; pro.free; - gitter:=tGitter.create(round(breite/deltaX)+1,dT,deltaX,pDNMax,kvs,dichten,lichter,zeitverfahren,prot,'gitter'); - dichten.free; + gitter:=tGitter.create(round(breite/deltaX)+1,dT,deltaX,pDNMax,kvs,teilchen,lichter,zeitverfahren,prot,'gitter'); + for i:=0 to length(teilchen)-1 do + teilchen[i].free; + setlength(teilchen,0); lichter.free; end; @@ -1000,7 +1230,7 @@ begin zeitPhysik:=zeitPhysik-now; if errorCode<2 then - gitter.iteriereSchritt(dT,1/dT); + gitter.iteriereSchritt(dT); zeitPhysik:=zeitPhysik+now; zeitDatei:=zeitDatei-now; while (gitter.t>=sT) and (sT<tEnde) do begin @@ -1012,12 +1242,15 @@ begin if fortschrittsAnzeige then begin if (floor(100*Gitter.t/tEnde) < floor(100*(Gitter.t+dT)/tEnde)) then begin - Prot.schreibe(inttostr(round(100*Gitter.t/tEnde))+'% (t='+floattostr(Gitter.t)+'T)',true); - Prot.schreibe(timetostr(now-start)+' ('+floattostr(zeitPhysik/max(1e-11,zeitPhysik+zeitDatei))+')',true); - Prot.schreibe('ETA: '+timetostr((now-start)*(tEnde-Gitter.t)/max(Gitter.t,dT)),true); - Prot.schreibe('aktueller Zeitschritt: '+floattostr(dT)+'T',true); + prot.schreibe(inttostr(round(100*Gitter.t/tEnde))+'% (t='+floattostr(Gitter.t)+'T)',true); + prot.schreibe(timetostr(now-start)+' ('+floattostr(zeitPhysik/max(1e-11,zeitPhysik+zeitDatei))+')',true); + prot.schreibe('ETA: '+timetostr((now-start)*(tEnde-Gitter.t)/max(Gitter.t,dT)),true); + prot.schreibe('aktueller Zeitschritt: '+floattostr(dT)+'T',true); if errorCode<2 then - Prot.schreibe(gitter.gibErhaltungsgroessen); + if not gitter.dumpErhaltungsgroessen then begin + errorCode:=2; + exit; + end; end; end; |