summaryrefslogtreecommitdiff
path: root/Physikunit.pas
diff options
context:
space:
mode:
Diffstat (limited to 'Physikunit.pas')
-rw-r--r--Physikunit.pas239
1 files changed, 204 insertions, 35 deletions
diff --git a/Physikunit.pas b/Physikunit.pas
index bf76b6f..b5000e2 100644
--- a/Physikunit.pas
+++ b/Physikunit.pas
@@ -42,9 +42,9 @@ type
tGitter = class;
tSimulation = class;
- { tAusgabeDatei }
+ { tFeldAusgabeDatei }
- tAusgabeDatei = class
+ tFeldAusgabeDatei = class
private
ableitung: boolean;
emFeld: tEMFeldGroesze;
@@ -70,6 +70,24 @@ type
procedure verzeichnisAufraeumen;
end;
+ { tImpulsRaumAusgabeDatei }
+
+ tImpulsRaumAusgabeDatei = class
+ private
+ teilchen,nNum,tCnt: longint;
+ pre,suf: string;
+ pro: tProtokollant;
+ public
+ zeitAnz: longint;
+ sDT: double;
+ constructor create(feldName,prefix,suffix: string; prot: tProtokollant; nam: string);
+ destructor destroy; override;
+ function dump: string;
+ procedure naechsterZykel;
+ procedure speichereWerte(gitter: tGitter; sT: double);
+ procedure verzeichnisAufraeumen;
+ end;
+
{ tTeilchenSpezies }
tTeilchenSpezies = class
@@ -171,7 +189,8 @@ type
gitter: tGitter;
dT,tEnde,sT,sDT,sDX: double;
fortschrittsAnzeige: boolean;
- ausgabeDateien: array of tAusgabeDatei;
+ feldAusgabeDateien: array of tFeldAusgabeDatei;
+ impulsRaumAusgabeDateien: array of tImpulsRaumAusgabeDatei;
public
gotSigusr1,gotSigterm,
gotSigint: boolean;
@@ -199,9 +218,9 @@ const
var
simulationen: array of tSimulation;
-// tAusgabeDatei ***************************************************************
+// tFeldAusgabeDatei ***********************************************************
-constructor tAusgabeDatei.create(feldName,prefix,suffix: string; prot: tProtokollant; nam: string);
+constructor tFeldAusgabeDatei.create(feldName,prefix,suffix: string; prot: tProtokollant; nam: string);
var
emF: tEMFeldGroesze;
emQ: tEMQuellGroesze;
@@ -264,7 +283,7 @@ begin
end;
if not gef then begin
- pro.schreibe('tAusgabeDatei.create kennt Größe '''+feldName+''' nicht!',true);
+ pro.schreibe('tFeldAusgabeDatei.create kennt Größe '''+feldName+''' nicht!',true);
nam:='';
for abl:=false to true do
for emF:=low(tEMFeldGroesze) to high(tEMFeldGroesze) do
@@ -275,7 +294,7 @@ begin
nam:=nam+', '+matSpeicherNamen[maF];
delete(nam,1,2);
pro.schreibe('Ich kenne nur: '+nam,true);
- raise exception.create('Fehler in tAusgabeDatei.create!');
+ raise exception.create('Fehler in tFeldAusgabeDatei.create!');
end;
case wasSpeichern of
@@ -297,19 +316,19 @@ begin
suf:=suffix;
end;
-destructor tAusgabeDatei.destroy;
+destructor tFeldAusgabeDatei.destroy;
begin
if bufPos<>0 then
schreibeBuffer(0);
freeMem(buf,bufLen);
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);
- raise exception.create('Fehler in tAusgabeDatei.destroy!');
+ raise exception.create('Fehler in tFeldAusgabeDatei.destroy!');
end;
inherited destroy;
end;
-procedure tAusgabeDatei.schreibeBuffer(minBufLen: longint);
+procedure tFeldAusgabeDatei.schreibeBuffer(minBufLen: longint);
begin
if buf=nil then begin
bufLen:=max(minAusgabeBuffer,minBufLen);
@@ -323,7 +342,7 @@ begin
bufPos:=0;
end;
-function tAusgabeDatei.dump: string;
+function tFeldAusgabeDatei.dump: string;
begin
case wasSpeichern of
0: result:=emFeldNamen[emFeld];
@@ -337,11 +356,11 @@ begin
result:=result+' -> '+pre+'-$i'+suf;
end;
-procedure tAusgabeDatei.schreibeKopf;
+procedure tFeldAusgabeDatei.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);
- raise exception.create('Fehler in tAusgabeDatei.schreibeKopf!');
+ raise exception.create('Fehler in tFeldAusgabeDatei.schreibeKopf!');
end;
if bufPos<>0 then
schreibeBuffer(0);
@@ -354,13 +373,13 @@ begin
closefile(datei);
end;
-procedure tAusgabeDatei.speichereWerte(gitter: tGitter; sT, sDX: double);
+procedure tFeldAusgabeDatei.speichereWerte(gitter: tGitter; sT, sDX: double);
var i,cnt: longint;
sX,cX,val: double;
begin
if (teilchen>=length(gitter.felders[gitter.aktuelleFelder].teilchen)) then begin
pro.schreibe('Teilchen '+inttostr(teilchen+1)+' gibt es nicht, da kann ich auch nichts speichern!',true);
- raise exception.create('Fehler in tAusgabeDatei.speichereWerte!');
+ raise exception.create('Fehler in tFeldAusgabeDatei.speichereWerte!');
end;
if sT>=nNum then
@@ -376,7 +395,7 @@ begin
if bufLen-bufPos < sizeof(longint) + (2+cnt)*sizeof(double) then begin
pro.schreibe('Schreibbuffer ist zu klein ('+inttostr(bufLen)+' statt mindestens '+inttostr(sizeof(longint) + (2+cnt)*sizeof(double))+' Bytes)!');
- raise exception.create('Fehler in tAusgabeDatei.speichereWerte!');
+ raise exception.create('Fehler in tFeldAusgabeDatei.speichereWerte!');
end;
move(cX,(buf+bufPos)^,sizeof(double));
@@ -423,11 +442,141 @@ begin
end{of case};
if cnt<>0 then begin
pro.schreibe('Falsche Anzahl an Ortsschritten geschrieben ('+inttostr(cnt)+')!',true);
- raise exception.create('Fehler in tAusgabeDatei.speichereWerte!');
+ raise exception.create('Fehler in tFeldAusgabeDatei.speichereWerte!');
end;
end;
-procedure tAusgabeDatei.verzeichnisAufraeumen;
+procedure tFeldAusgabeDatei.verzeichnisAufraeumen;
+var
+ sr: tSearchRec;
+ err: longint;
+ dats: tStringList;
+ pfad: string;
+ i: longint;
+begin
+ dats:=tStringList.create;
+ pfad:=extractfilepath(pre+'00'+suf);
+ err:=findFirst(pfad+'*',$00,sr);
+ while err=0 do begin
+ if (sr.name<>'.') and (sr.name<>'..') then
+ dats.add(pfad+sr.name);
+ err:=findNext(sr);
+ end;
+ findClose(sr);
+ for i:=0 to dats.count-1 do
+ if (rightStr(dats[i],4)<>'.dat') and
+ (rightStr(dats[i],4)<>'.png') and
+ (rightStr(dats[i],4)<>'.bmp') then begin
+ pro.schreibe('Zu löschende Datei ist keine .dat, .bmp oder .png!',true);
+ raise exception.create('Zu löschende Datei ist keine .dat, .bmp oder .png!');
+ end;
+ for i:=0 to dats.count-1 do
+ deleteFile(dats[i]);
+ dats.free;
+end;
+
+// tImpulsRaumAusgabeDatei *****************************************************
+
+constructor tImpulsRaumAusgabeDatei.create(feldName,prefix,suffix: string; prot: tProtokollant; nam: string);
+var
+ num: longint;
+begin
+ inherited create;
+ pro:=tProtokollant.create(prot,nam);
+ num:=length(feldName);
+ while (num>0) and (feldName[num] in ['0'..'9']) do
+ dec(num);
+ inc(num);
+ if num<=length(feldName) then begin
+ teilchen:=strtoint(copy(feldName,num,length(feldName)))-1;
+ delete(feldName,num,length(feldName));
+ end
+ else begin
+ pro.schreibe('tImpulsRaumAusgabeDatei.create kann keine über Teilchen integrierten Größen abspeichern!',true);
+ raise exception.create('Fehler in tImpulsRaumAusgabeDatei.create!');
+ end;
+ if feldName<>'N' then begin
+ pro.schreibe('tImpulsRaumAusgabeDatei.create kennt Größe '''+feldName+''' nicht!',true);
+ pro.schreibe('Ich kenne nur N!',true);
+ raise exception.create('Fehler in tImpulsRaumAusgabeDatei.create!');
+ end;
+
+ nNum:=0; // Header 0 wurde also noch nicht geschrieben
+ zeitAnz:=-1;
+ tCnt:=-1;
+
+ pre:='N';
+ if teilchen>=0 then
+ pre:=pre+inttostr(teilchen+1);
+
+ pre:=prefix+pre;
+ suf:=suffix;
+end;
+
+destructor tImpulsRaumAusgabeDatei.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);
+ raise exception.create('Fehler in tImpulsRaumAusgabeDatei.destroy!');
+ end;
+ inherited destroy;
+end;
+
+function tImpulsRaumAusgabeDatei.dump: string;
+begin
+ result:='N';
+ if teilchen>=0 then
+ result:=result+'['+inttostr(teilchen+1)+']';
+ result:=result+' -> '+pre+'-$i_$j'+suf;
+end;
+
+procedure tImpulsRaumAusgabeDatei.naechsterZykel;
+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);
+ raise exception.create('Fehler in tImpulsRaumAusgabeDatei.schreibeKopf!');
+ end;
+ tCnt:=0;
+ inc(nNum);
+end;
+
+procedure tImpulsRaumAusgabeDatei.speichereWerte(gitter: tGitter; sT: double);
+var
+ tmpI: longint;
+ tmpD: double;
+ sF: tFelder;
+ datei: file;
+begin
+ if (teilchen>=length(gitter.felders[gitter.aktuelleFelder].teilchen)) then begin
+ pro.schreibe('Teilchen '+inttostr(teilchen+1)+' gibt es nicht, da kann ich auch nichts speichern!',true);
+ raise exception.create('Fehler in tImpulsRaumAusgabeDatei.speichereWerte!');
+ end;
+
+ if sT>=nNum then
+ naechsterZykel;
+
+ assignFile(datei,pre+'-'+inttostr(nNum-1)+'-'+inttostr(tCnt)+suf);
+ rewrite(datei,1);
+
+ sF:=gitter.felders[gitter.aktuelleFelder];
+
+ blockWrite(datei,gitter.xl,sizeof(double));
+ tmpD:=gitter.xl + (sF.aX-1)*sF.dX;
+ blockWrite(datei,tmpD,sizeof(double));
+ tmpI:=sF.aX;
+ blockWrite(datei,tmpI,sizeof(longint));
+ tmpD:=-(sF.aP-1)*sF.dP/2;
+ blockWrite(datei,tmpD,sizeof(double));
+ tmpD:=-tmpD;
+ blockWrite(datei,tmpD,sizeof(double));
+ tmpI:=sF.aP;
+ blockWrite(datei,tmpI,sizeof(longint));
+ blockWrite(datei,sF.impulsraum[teilchen,false]^,sizeof(double)*sF.aX*sF.aP);
+
+ closeFile(datei);
+end;
+
+procedure tImpulsRaumAusgabeDatei.verzeichnisAufraeumen;
var
sr: tSearchRec;
err: longint;
@@ -1456,7 +1605,8 @@ begin
// Standardeinstellungen Bereich 'ausgaben'
aPrefix:=extractfilepath(paramstr(0));
aSuffix:='.dat';
- setlength(ausgabeDateien,0);
+ setlength(feldAusgabeDateien,0);
+ setlength(impulsRaumAusgabeDateien,0);
// Standardeinstellungen Bereich 'lichtVon...'
lichter:=tMyStringlist.create(prot,'lichter');
@@ -1575,8 +1725,17 @@ begin
s:=s+',';
while s<>'' do begin
t:=erstesArgument(s,',');
- setlength(ausgabeDateien,length(ausgabeDateien)+1);
- ausgabeDateien[length(ausgabeDateien)-1]:=tAusgabeDatei.create(t,aPrefix,aSuffix,prot,'ausgabeDateien['+inttostr(length(ausgabeDateien)-1)+']');
+ setlength(feldAusgabeDateien,length(feldAusgabeDateien)+1);
+ feldAusgabeDateien[length(feldAusgabeDateien)-1]:=tFeldAusgabeDatei.create(t,aPrefix,aSuffix,prot,'feldAusgabeDateien['+inttostr(length(feldAusgabeDateien)-1)+']');
+ end;
+ continue;
+ end;
+ if startetMit('phasenraum ',s) then begin
+ s:=s+',';
+ while s<>'' do begin
+ t:=erstesArgument(s,',');
+ setlength(impulsRaumAusgabeDateien,length(impulsRaumAusgabeDateien)+1);
+ impulsRaumAusgabeDateien[length(impulsRaumAusgabeDateien)-1]:=tImpulsRaumAusgabeDatei.create(t,aPrefix,aSuffix,prot,'impulsRaumAusgabeDateien['+inttostr(length(impulsRaumAusgabeDateien)-1)+']');
end;
continue;
end;
@@ -1662,14 +1821,14 @@ begin
ifile.free;
- if length(ausgabedateien)=0 then begin
+ if (length(feldAusgabeDateien)=0) and (length(impulsRaumAusgabeDateien)=0) then begin
prot.schreibe('Du solltest irgendetwas abspeichern lassen!',true);
raise exception.create('Fehler in tSimulation.create!');
end;
if ausgabeverzeichnisAufraeumen then
- for i:=0 to length(ausgabedateien)-1 do
- ausgabeDateien[i].verzeichnisAufraeumen;
+ for i:=0 to length(feldAusgabedateien)-1 do
+ feldAusgabeDateien[i].verzeichnisAufraeumen;
if dT<0 then
dT:=dX/10;
@@ -1722,12 +1881,20 @@ begin
pro.schreibe('lichter:');
lichter.dump(pro,' ');
end;
- if length(ausgabeDateien)>0 then begin
- pro.schreibe('ausgaben:');
- for i:=0 to length(ausgabeDateien)-1 do begin
- ausgabeDateien[i].zeitAnz:=round(1/sDT);
- ausgabeDateien[i].sDT:=sDT;
- pro.schreibe(' '+ausgabeDateien[i].dump);
+ if length(feldAusgabeDateien)>0 then begin
+ pro.schreibe('feldAusgaben:');
+ for i:=0 to length(feldAusgabeDateien)-1 do begin
+ feldAusgabeDateien[i].zeitAnz:=round(1/sDT);
+ feldAusgabeDateien[i].sDT:=sDT;
+ pro.schreibe(' '+feldAusgabeDateien[i].dump);
+ end;
+ end;
+ if length(impulsRaumAusgabeDateien)>0 then begin
+ pro.schreibe('impulsRaumAusgaben:');
+ for i:=0 to length(impulsRaumAusgabeDateien)-1 do begin
+ impulsRaumAusgabeDateien[i].zeitAnz:=round(1/sDT);
+ impulsRaumAusgabeDateien[i].sDT:=sDT;
+ pro.schreibe(' '+impulsRaumAusgabeDateien[i].dump);
end;
end;
pro.free;
@@ -1763,9 +1930,9 @@ destructor tSimulation.destroy;
var
i,j: longint;
begin
- for i:=0 to length(ausgabeDateien)-1 do
- ausgabeDateien[i].free;
- setlength(ausgabeDateien,0);
+ for i:=0 to length(feldAusgabeDateien)-1 do
+ feldAusgabeDateien[i].free;
+ setlength(feldAusgabeDateien,0);
gitter.free;
prot.free;
for i:=length(simulationen)-1 downto 0 do
@@ -1796,8 +1963,10 @@ begin
zeitPhysik:=zeitPhysik+now;
zeitDatei:=zeitDatei-now;
while (gitter.t>=sT) and (sT<tEnde) do begin
- for i:=0 to length(ausgabeDateien)-1 do
- ausgabeDateien[i].speichereWerte(gitter,sT,sDX);
+ for i:=0 to length(feldAusgabeDateien)-1 do
+ feldAusgabeDateien[i].speichereWerte(gitter,sT,sDX);
+ for i:=0 to length(impulsRaumAusgabeDateien)-1 do
+ impulsRaumAusgabeDateien[i].speichereWerte(gitter,sT);
sT:=sT+sDT;
end;
zeitDatei:=zeitDatei+now;