summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2015-07-29 14:15:32 +0200
committerErich Eckner <git@eckner.net>2015-07-29 14:15:32 +0200
commit373ed9802b6d05e6c020553a68e6529d604cd5ef (patch)
tree2c3f2072b946b7c565ce5387dbfe1b4c3a8d9b8f
parent956357390e27cf5add18f4e386adc7e25b38302c (diff)
downloadPlasmapropagation-373ed9802b6d05e6c020553a68e6529d604cd5ef.tar.xz
lauffaehig, bisher ohne Teilchen
-rw-r--r--Physikunit.pas431
-rwxr-xr-xPlasmapropagationbin3387904 -> 3295712 bytes
-rw-r--r--Plasmapropagation.lpi6
-rw-r--r--Plasmapropagation.lpr8
-rw-r--r--Plasmapropagation.lps171
-rw-r--r--input.epost2
-rw-r--r--input.plap14
7 files changed, 370 insertions, 262 deletions
diff --git a/Physikunit.pas b/Physikunit.pas
index 492866c..1d50c5a 100644
--- a/Physikunit.pas
+++ b/Physikunit.pas
@@ -8,7 +8,7 @@ unit Physikunit;
interface
uses
- Classes, SysUtils, Math, protokollunit, matheunit, mystringlistunit, lowlevelunit, crt;
+ Classes, SysUtils, Math, protokollunit, matheunit, mystringlistunit, lowlevelunit;
type
tZeitverfahren = (zfEulerVorwaerts,zfRungeKuttaVier);
@@ -24,27 +24,35 @@ type
mfGamma,mfIGamma
);
+ tGitter = class;
+
{ tAusgabeDatei }
tAusgabeDatei = class
- ableitung: boolean;
- emInhalt: tEMFeldInhalt;
- matInhalt: tMaterieFeldInhalt;
- teilchen: longint; // wenn < 0, dann EM-Feld
- name: string;
- datei: file;
- constructor create(feldName,prefix,suffix: string; prot: tProtokollant);
+ private
+ ableitung: boolean;
+ emInhalt: tEMFeldInhalt;
+ matInhalt: tMaterieFeldInhalt;
+ teilchen,nNum,tCnt: longint; // wenn teilchen < 0, dann EM-Feld
+ pre,suf: string;
+ datei: file;
+ pro: tProtokollant;
+ public
+ zeitAnz: longint;
+ sDT: extended;
+ constructor create(feldName,prefix,suffix: string; prot: tProtokollant; nam: string);
destructor destroy; override;
+ function dump: string;
+ procedure schreibeKopf;
+ procedure speichereWerte(gitter: tGitter; sDX: extended);
end;
- tGitter = class;
-
{ tWertePunkt }
tWertePunkt = class(tObject) // repräsentiert alle Werte eines Punktes im Gitter und deren Zeitableitungen
- matWerte: array of array[tMaterieFeldInhalt,boolean] of extended;
+ matWerte: array of array[tMaterieFeldInhalt,boolean] of double;
// Materiefelder (getrennt für verschiedene Teilchenspezies) und deren Zeitableitungen
- emWerte: array[tEMFeldInhalt,boolean] of extended;
+ emWerte: array[tEMFeldInhalt,boolean] of double;
// EM-Felder und deren Zeitableitungen
// A, p[xyz]? und i?Gamma haben keine sinnvolle Ableitung hier!
lN,rN: tWertePunkt;
@@ -53,7 +61,7 @@ type
destructor destroy; override;
procedure berechneGammaUndP;
procedure berechneNAbleitung(iDX,pDNMax: extended);
- procedure berechneAbleitungen(dT,dX,iDX: extended);
+ 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
end;
@@ -64,14 +72,14 @@ type
private
matAnz: longint;
lichters: array[boolean] of tMyStringlist;
- procedure setzeRaender(iDX: extended);
+ procedure setzeRaender(dT,iDX,iDT: extended);
public
inhalt: array of tWertePunkt;
par: tGitter;
constructor create(groesse: longint; dichten,lichter: tMyStringList; parent: tGitter);
destructor destroy; override;
- procedure berechneAbleitungen(dT,dX,iDX,pDNMax: extended);
+ 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
end;
@@ -91,11 +99,11 @@ 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);
+ constructor create(size: longint; deltaT,deltaX,pDNMa: extended; bekannteWerte: tKnownValues; dichten, lichter: tMyStringlist; zv: tZeitverfahren; protokollant: tProtokollant; name: string);
destructor destroy; override;
- procedure iteriereSchritt(dT: extended);
- procedure macheAusgabe(aD: tAusgabedatei; sDX: extended);
+ procedure iteriereSchritt(dT,iDT: extended);
function gibErhaltungsgroessen: string;
+ procedure berechne(was: char; teilchen: longint);
end;
{ tSimulation }
@@ -108,7 +116,7 @@ type
fortschrittsAnzeige: boolean;
ausgabeDateien: array of tAusgabeDatei;
public
- constructor create(inName: string; Protokollant: tProtokollant);
+ constructor create(inName: string; protokollant: tProtokollant; name: string);
destructor destroy; override;
function iteriereSchritt(start: extended; var zeitPhysik,zeitDatei: extended): boolean; // noch nicht zu Ende?
end;
@@ -125,7 +133,7 @@ const
{ tAusgabeDatei }
-constructor tAusgabeDatei.create(feldName,prefix,suffix: string; prot: tProtokollant);
+constructor tAusgabeDatei.create(feldName,prefix,suffix: string; prot: tProtokollant; nam: string);
var
emF: tEMFeldInhalt;
maF: tMaterieFeldInhalt;
@@ -133,6 +141,7 @@ var
abl,gef: boolean;
begin
inherited create;
+ pro:=tProtokollant.create(prot,nam);
num:=length(feldName);
while (num>0) and (feldName[num] in ['0'..'9']) do
dec(num);
@@ -147,6 +156,9 @@ begin
emInhalt:=efA;
matInhalt:=mfN;
feldName:=ansiUpperCase(feldName);
+ nNum:=0; // Header 0 wurde also noch nicht geschrieben
+ zeitAnz:=-1;
+ tCnt:=-1;
gef:=false;
for abl:=false to true do begin
@@ -168,29 +180,108 @@ begin
end;
if not gef then begin
- prot.schreibe('tAusgabeDatei.create kennt Feld '''+feldName+''' nicht!',true);
+ pro.schreibe('tAusgabeDatei.create kennt Feld '''+feldName+''' nicht!',true);
+ pro.destroyAll;
halt(1);
end;
if teilchen>=0 then
- name:=matFeldNamen[maF]+inttostr(teilchen)
+ pre:=matFeldNamen[maF]+inttostr(teilchen)
else
- name:=emFeldNamen[emF];
+ pre:=emFeldNamen[emF];
- if abl then
- name:='d'+name;
- name:=prefix+name+suffix;
+ if ableitung then
+ pre:='d'+pre;
- assignFile(datei,name);
- rewrite(datei);
+ pre:=prefix+pre;
+ suf:=suffix;
end;
destructor tAusgabeDatei.destroy;
begin
- closeFile(datei);
+ 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);
+ halt(1);
+ end;
inherited destroy;
end;
+function tAusgabeDatei.dump: string;
+begin
+ if teilchen<0 then
+ result:=emFeldNamen[emInhalt]
+ else
+ result:=matFeldNamen[matInhalt]+inttostr(teilchen);
+ if ableitung then
+ result:=result+'''';
+ result:=result+' -> '+pre+'-$i'+suf;
+end;
+
+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);
+ halt(1);
+ end;
+ tCnt:=0;
+ assignfile(datei,pre+'-'+inttostr(nNum)+suf);
+ inc(nNum);
+ rewrite(datei,1);
+ blockwrite(datei,nNum,sizeof(integer));
+ blockwrite(datei,zeitAnz,sizeof(integer));
+ closefile(datei);
+end;
+
+procedure tAusgabeDatei.speichereWerte(gitter: tGitter; sDX: extended);
+var i,cnt: longint;
+ sX,cX: extended;
+begin
+ if (teilchen<0) and (emInhalt=efA) then
+ gitter.berechne('A',teilchen);
+ if (teilchen>=0) and (matInhalt=mfP) then
+ gitter.berechne('P',teilchen);
+
+ if gitter.t>=nNum+sDT/2 then
+ schreibeKopf;
+
+ cnt:=floor((length(gitter.felders[gitter.aktuelleFelder].inhalt)-1)/sDX*gitter.dX+1);
+ cX:=gitter.xl;
+ sX:=cX+(cnt-1)*sDX;
+
+ inc(tCnt);
+ reset(datei,1);
+ seek(datei,fileSize(datei));
+ blockWrite(datei,cX,sizeof(extended));
+ blockWrite(datei,sX,sizeof(extended));
+ blockWrite(datei,cnt,sizeof(integer));
+ sX:=cX-Min(gitter.dX,sDX)/2;
+ if teilchen<0 then begin
+ for i:=0 to length(gitter.felders[gitter.aktuelleFelder].inhalt)-1 do begin
+ while cX>=sX do begin
+ dec(cnt);
+ blockWrite(datei,gitter.felders[gitter.aktuelleFelder].inhalt[i].emWerte[emInhalt,ableitung],sizeof(double));
+ sX:=sX+sDX;
+ end;
+ cX:=cX+gitter.dX;
+ end;
+ end
+ else begin
+ for i:=0 to length(gitter.felders[gitter.aktuelleFelder].inhalt)-1 do begin
+ while cX>=sX do begin
+ dec(cnt);
+ blockWrite(datei,gitter.felders[gitter.aktuelleFelder].inhalt[i].matWerte[teilchen,matInhalt,ableitung],sizeof(double));
+ sX:=sX+sDX;
+ end;
+ cX:=cX+gitter.dX;
+ end;
+ end;
+ closeFile(datei);
+ if cnt<>0 then begin
+ pro.schreibe('Falsche Anzahl an Ortsschritten geschrieben ('+inttostr(cnt)+')!',true);
+ halt(1);
+ end;
+end;
+
{ tWertePunkt }
constructor tWertePunkt.create(linkerNachbar: tWertePunkt; materien: longint);
@@ -275,7 +366,7 @@ begin
// alpha = pDNMax * dX
end;
-procedure tWertePunkt.berechneAbleitungen(dT,dX,iDX: extended); // Zeitableitungen berechnen
+procedure tWertePunkt.berechneAbleitungen(dX,iDX: extended); // Zeitableitungen berechnen
var
i: longint;
begin
@@ -316,7 +407,9 @@ begin
end;
// dA/dt = dA/dt
- emWerte[efAX,true]:=emWerte[efDAXDT,false] + emWerte[efDAXDT,true]*dT;
+ emWerte[efAX,true]:=emWerte[efDAXDT,false];// + emWerte[efDAXDT,true]*dT;
+ emWerte[efAY,true]:=emWerte[efDAYDT,false];// + emWerte[efDAYDT,true]*dT;
+ emWerte[efAZ,true]:=emWerte[efDAZDT,false];// + emWerte[efDAZDT,true]*dT;
end;
procedure tWertePunkt.liKo(in1,in2: tWertePunkt; fak2: extended); // Werte werden auf (in1 + fak2*in2') gesetzt
@@ -399,7 +492,7 @@ begin
end;
parent.kvs.rem('x');
for rechts:=false to true do begin
- lichters[rechts]:=tMyStringlist.create(nil);
+ lichters[rechts]:=tMyStringlist.create(nil,'');
lichters[rechts].text:=lichter.text;
end;
lichters[false].grep('^links .*');
@@ -415,9 +508,12 @@ begin
inherited destroy;
end;
-procedure tFelder.setzeRaender(iDX: extended);
+procedure tFelder.setzeRaender(dT,iDX,iDT: extended);
var
- emF: tEMFeldInhalt;
+ emF: tEMFeldInhalt;
+ rechts: boolean;
+ i: longint;
+ oVal: extended;
begin
for emF:=efAX to efAZ do begin // Vakuumrandbedingungen für das A-Feld
inhalt[0].emWerte[emF,true]:=
@@ -428,15 +524,18 @@ begin
inhalt[length(inhalt)-1].emWerte[emF,false])*iDX;
end; // (ein bisschen wird noch reflektiert, vmtl. durch numerische Fehler bzw. nicht beachtete numerische Dispersion)
- (* inhalt[0].emWerte[efAY,true]:=
- inhalt[0].emWerte[fiAY,true]
- + (Al(t+dTMaximum)-Al(t))/dTMaximum;
- Felders[Felder,groesse+3].Groessen[true,fiAy]:=
- Felders[Felder,groesse+3].Groessen[true,fiAy]
- + (Ar(t+dTMaximum)-Ar(t))/dTMaximum; *)
+ for rechts:=false to true do
+ for i:=0 to lichters[rechts].count-1 do begin
+ par.kvs.add('t',par.t-dT);
+ oVal:=exprToFloat(false,lichters[rechts][i],par.kvs,nil);
+ par.kvs.add('t',par.t);
+ inhalt[(length(inhalt)-1)*byte(rechts)].emWerte[efAY,true]:=
+ inhalt[(length(inhalt)-1)*byte(rechts)].emWerte[efAY,true] +
+ (exprToFloat(false,lichters[rechts][i],par.kvs,nil) - oVal)*iDT;
+ end;
end;
-procedure tFelder.berechneAbleitungen(dt,dx,iDX,pDNMax: extended);
+procedure tFelder.berechneAbleitungen(dT,dX,iDT,iDX,pDNMax: extended);
var
i: longint;
begin
@@ -449,12 +548,12 @@ begin
-abs(inhalt[length(inhalt)-2].matWerte[i,mfPX,false]);
end;
- setzeRaender(iDX);
+ setzeRaender(dT,iDX,iDT);
for i:=1 to length(inhalt)-2 do
inhalt[i].berechneNAbleitung(iDX,pDNMax);
for i:=1 to length(inhalt)-2 do
- inhalt[i].berechneAbleitungen(dT,dX,iDX);
+ inhalt[i].berechneAbleitungen(dX,iDX);
end;
procedure tFelder.liKo(in1,in2: tFelder; fak2: extended); // Werte werden auf (in1 + fak2*in2') gesetzt
@@ -475,14 +574,14 @@ end;
{ tGitter }
-constructor tGitter.create(size: longint; deltaT,deltaX,pDNMa: extended; bekannteWerte: tKnownValues; dichten, lichter: tMyStringlist; zv: tZeitverfahren; protokollant: tProtokollant);
+constructor tGitter.create(size: longint; deltaT,deltaX,pDNMa: extended; bekannteWerte: tKnownValues; dichten, lichter: tMyStringlist; zv: tZeitverfahren; protokollant: tProtokollant; name: string);
var
i: longint;
begin
inherited create;
zeitverfahren:=ZV;
kvs:=bekannteWerte;
- Prot:=TProtokollant.create(Protokollant,'tGitter');
+ prot:=tProtokollant.create(protokollant,name);
dTMaximum:=deltaT;
dX:=deltaX;
iDX:=1/dX;
@@ -502,6 +601,7 @@ begin
aktuelleFelder:=0;
t:=0;
+ kvs.add('t',t);
end;
destructor tGitter.destroy;
@@ -514,28 +614,30 @@ begin
inherited destroy;
end;
-procedure tGitter.iteriereSchritt(dT: extended);
+procedure tGitter.iteriereSchritt(dT,iDT: extended);
var i: longint;
{$IFDEF Zeitschrittueberwachung}
pro: tProtokollant;
j: longint;
{$ENDIF}
begin
- felders[aktuelleFelder].berechneAbleitungen(dT,dX,iDX,pDNMax); // y' = y'(t,y(t))
+ t:=t+dT;
+ kvs.add('t',t);
+ felders[aktuelleFelder].berechneAbleitungen(dT,dX,iDT,iDX,pDNMax); // y' = y'(t,y(t))
case zeitverfahren of
zfEulerVorwaerts: // y(t+dt) = y(t) + y' dt
felders[1-aktuelleFelder].liKo(felders[aktuelleFelder],felders[aktuelleFelder],dT);
zfRungeKuttaVier:
begin
- felders[2].liKo(felders[aktuelleFelder],felders[aktuelleFelder],dT/2); // ya = y(t) + y' dt/2
- felders[2].berechneAbleitungen(dT/2,dX,iDX,pDNMax); // ya' = y'(t+dt/2,ya)
+ felders[2].liKo(felders[aktuelleFelder],felders[aktuelleFelder],dT/2); // ya = y(t) + y' dt/2
+ felders[2].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); // ya' = y'(t+dt/2,ya)
- felders[3].liKo(felders[aktuelleFelder],felders[2],dT/2); // yb = y(t) + ya' dt/2
- felders[3].berechneAbleitungen(dT/2,dX,iDX,pDNMax); // yb' = y'(t+dt/2,yb)
+ felders[3].liKo(felders[aktuelleFelder],felders[2],dT/2); // yb = y(t) + ya' dt/2
+ felders[3].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); // yb' = y'(t+dt/2,yb)
- felders[4].liKo(felders[aktuelleFelder],felders[3],dT); // yc = y(t) + yb' dt
- felders[4].berechneAbleitungen(dT/2,dX,iDX,pDNMax); // yc' = y'(t+dt,yc)
+ felders[4].liKo(felders[aktuelleFelder],felders[3],dT); // yc = y(t) + yb' dt
+ felders[4].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); // yc' = y'(t+dt,yc)
felders[1-aktuelleFelder].liKo(
felders[aktuelleFelder],
@@ -551,7 +653,6 @@ begin
end;
end{of case};
- t:=t+dT;
aktuelleFelder:=1-aktuelleFelder;
{$IFDEF Dichteueberwachung}
with felders[aktuelleFelder] do
@@ -581,58 +682,10 @@ begin
{$ENDIF}
end;
-procedure tGitter.macheAusgabe(aD: tAusgabedatei; sDX: extended);
-var i: longint;
- sX,cX,tmp: extended;
- emF: tEMFeldInhalt;
- maF: tMaterieFeldInhalt;
-begin
- if (aD.teilchen<0) and (aD.emInhalt=efA) then
- for i:=0 to length(felders[aktuelleFelder].inhalt)-1 do begin
- tmp:=0;
- for emF:=efAX to efAZ do
- tmp:=tmp+sqr(felders[aktuelleFelder].inhalt[i].emWerte[emF,false]);
- felders[aktuelleFelder].inhalt[i].emWerte[efA,false]:=sqrt(tmp);
- end;
- if (aD.teilchen>=0) and (aD.matInhalt=mfP) then
- for i:=0 to length(felders[aktuelleFelder].inhalt)-1 do begin
- tmp:=0;
- for maF:=mfPX to mfPZ do
- tmp:=tmp+sqr(felders[aktuelleFelder].inhalt[i].matWerte[aD.teilchen,maF,false]);
- felders[aktuelleFelder].inhalt[i].matWerte[aD.teilchen,maF,false]:=sqrt(tmp);
- end;
-
- i:=floor((length(felders[aktuelleFelder].inhalt)-1)/sDX*dX+1);
- sX:=xl+(i-1)*sDX;
- blockWrite(aD.datei,xl,sizeof(extended));
- blockWrite(aD.datei,sX,sizeof(extended));
- blockWrite(aD.datei,i,sizeof(longint));
- sX:=xl-Min(dX,sDX)/2;
- cX:=xl;
- if aD.teilchen<0 then begin
- for i:=0 to length(felders[aktuelleFelder].inhalt)-1 do begin
- while cX>=sX do begin
- blockWrite(aD.datei,felders[aktuelleFelder].inhalt[i].emWerte[aD.emInhalt,aD.ableitung],sizeof(extended));
- sX:=sX+sDX;
- end;
- cX:=cX+dX;
- end;
- end
- else begin
- for i:=0 to length(felders[aktuelleFelder].inhalt)-1 do begin
- while cX>=sX do begin
- blockWrite(aD.datei,felders[aktuelleFelder].inhalt[i].matWerte[aD.teilchen,aD.matInhalt,aD.ableitung],sizeof(extended));
- sX:=sX+sDX;
- end;
- cX:=cX+dX;
- end;
- end;
-end;
-
function tGitter.gibErhaltungsgroessen: string;
var i,j: integer;
ns: tExtendedArray;
- Pro: TProtokollant;
+ pro: tProtokollant;
begin
pro:=tProtokollant.create(prot,'gibErhaltungsgroessen');
setlength(ns,felders[aktuelleFelder].matAnz);
@@ -684,23 +737,53 @@ begin
end;
end;
+procedure tGitter.berechne(was: char; teilchen: longint);
+var
+ i: longint;
+ tmp: extended;
+ emF: tEMFeldInhalt;
+ maF: tMaterieFeldInhalt;
+begin
+ if was='A' then begin
+ for i:=0 to length(felders[aktuelleFelder].inhalt)-1 do begin
+ tmp:=0;
+ for emF:=efAX to efAZ do
+ tmp:=tmp+sqr(felders[aktuelleFelder].inhalt[i].emWerte[emF,false]);
+ felders[aktuelleFelder].inhalt[i].emWerte[efA,false]:=sqrt(tmp);
+ end;
+ exit;
+ end;
+ if was='P' then begin
+ for i:=0 to length(felders[aktuelleFelder].inhalt)-1 do begin
+ tmp:=0;
+ for maF:=mfPX to mfPZ do
+ tmp:=tmp+sqr(felders[aktuelleFelder].inhalt[i].matWerte[teilchen,maF,false]);
+ felders[aktuelleFelder].inhalt[i].matWerte[teilchen,maF,false]:=sqrt(tmp);
+ end;
+ exit;
+ end;
+ prot.schreibe('Kann '''+was+''' nicht berechnen, weil ich es nicht verstehe!',true);
+ halt;
+end;
+
{ tSimulation }
-constructor tSimulation.create(inName: string; Protokollant: tProtokollant);
+constructor tSimulation.create(inName: string; protokollant: tProtokollant; name: string);
var
ifile: tMyStringlist;
zeitverfahren: tZeitverfahren;
s,t,aSuffix,aPrefix: string;
- deltaX,deltaT,breite,pDNMax: extended;
- i,j: longint;
+ deltaX,breite,pDNMax: extended;
+ i: longint;
kvs: tKnownValues;
dichten,lichter: tMyStringlist;
+ pro: tProtokollant;
begin
inherited create;
- prot:=tProtokollant.create(Protokollant,'tSimulation');
+ prot:=tProtokollant.create(protokollant,name);
kvs:=tKnownValues.create;
- ifile:=tMyStringlist.create(prot);
+ ifile:=tMyStringlist.create(prot,'ifile');
ifile.loadfromfile(inName);
if not ifile.unfoldMacros then begin
prot.schreibe('Fehlerhafte Macros in Parameterdatei '''+inName+'''!',true);
@@ -712,8 +795,9 @@ begin
deltaX:=1e-2;
kvs.add('λ',1);
kvs.add('T',1);
+ kvs.add('ω',2*pi);
kvs.add('dX',deltaX);
- deltaT:=-1;
+ dT:=-1;
sDT:=-1;
sDX:=-1;
tEnde:=100;
@@ -727,18 +811,26 @@ begin
setlength(ausgabeDateien,0);
// Standardeinstellungen Breich 'lichtVon...'
- lichter:=tMyStringlist.create(prot);
+ lichter:=tMyStringlist.create(prot,'lichter');
// Standardeinstellungen Breich 'teilchen...'
- dichten:=tMyStringlist.create(prot);
+ dichten:=tMyStringlist.create(prot,'teilchen');
+
+ repeat
+ if not ifile.readln(s) then begin
+ prot.schreibe('Unerwartetes Dateiende in '''+inName+'''!',true);
+ halt(1);
+ end;
+
+ if s='Dateiende' then
+ break;
- while ifile.readln(s) do begin writeln(s);
if s='allgemein' then begin
repeat
if not ifile.readln(s) then begin
prot.schreibe('Unerwartetes Dateiende in Parameterdatei '''+inName+''' im Bereich allgemein!',true);
halt(1);
- end; writeln(s);
+ end;
if s='allgemeinEnde' then break;
if s='runge-Kutta-4' then begin
Zeitverfahren:=zfRungeKuttaVier;
@@ -754,8 +846,8 @@ begin
continue;
end;
if startetMit('zeitschritt',s) then begin
- deltaT:=exprtofloat(false,s,kvs,nil);
- kvs.add('dT',deltaT);
+ dT:=exprtofloat(false,s,kvs,nil);
+ kvs.add('dT',dT);
continue;
end;
if startetMit('diffusionsterm',s) then begin
@@ -812,7 +904,7 @@ begin
while s<>'' do begin
t:=erstesArgument(s,',');
setlength(ausgabeDateien,length(ausgabeDateien)+1);
- ausgabeDateien[length(ausgabeDateien)-1]:=tAusgabeDatei.create(t,aPrefix,aSuffix,prot);
+ ausgabeDateien[length(ausgabeDateien)-1]:=tAusgabeDatei.create(t,aPrefix,aSuffix,prot,'ausgabeDateien['+inttostr(length(ausgabeDateien)-1)+']');
end;
continue;
end;
@@ -822,32 +914,73 @@ begin
continue;
end;
+ if startetMit('licht von ',s) then begin
+ if startetMit('links ',s) then begin
+ lichter.add('links '+s);
+ continue;
+ end;
+ if startetMit('rechts ',s) then begin
+ lichter.add('rechts '+s);
+ continue;
+ end;
+ prot.schreibe('Licht kann nicht von '''+erstesArgument(s)+''' kommen!',true);
+ halt(1);
+ end;
+
prot.schreibe('Unbekannter Befehl '''+s+''' in Parameterdatei '''+inName+'''!',true);
halt(1);
- end;
+ until false;
+
+ ifile.free;
if length(ausgabedateien)=0 then begin
prot.schreibe('Du solltest irgendetwas abspeichern lassen!',true);
halt(1);
end;
- if deltaT<0 then
- deltaT:=deltaX/10;
+ if dT<0 then
+ dT:=deltaX/10;
if sDT<0 then
- sDT:=deltaT;
+ sDT:=dT;
+ sDT:=1/round(1/sDT);
+ sT:=sDT/2;
if sDX<0 then
sDX:=deltaX;
- for i:=0 to length(ausgabedateien)-1 do begin
- rewrite(ausgabedateien[i].datei,1);
- j:=0;
- BlockWrite(Ausgabedateien[i].Datei,j,sizeof(longint));
- j:=floor(tEnde/sDT+1);
- BlockWrite(Ausgabedateien[i].Datei,j,sizeof(longint));
+ pro:=tProtokollant.create(prot,'create');
+ case zeitverfahren of
+ zfEulerVorwaerts:
+ pro.schreibe('Iteration mittels Euler-Vorwärts');
+ zfRungeKuttaVier:
+ pro.schreibe('Iteration mittels Runge-Kutta-4');
+ else
+ pro.schreibe('Iteration mittels unbekanntem Verfahren');
+ end{of case};
+ pro.schreibe('dX = '+floattostr(deltaX));
+ pro.schreibe('dT = '+floattostr(dT));
+ pro.schreibe('breite = '+floattostr(breite)+' (= '+inttostr(round(breite/deltaX)+1)+' Punkte)');
+ pro.schreibe('pDNMax = '+floattostr(pDNMax));
+ pro.schreibe('bekannte Werte:');
+ kvs.dump(pro,' ');
+ if dichten.count>0 then begin
+ pro.schreibe('dichten:');
+ dichten.dump(pro,' ');
end;
- ifile.free;
+ if lichter.count>0 then 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);
+ end;
+ end;
+ pro.free;
- gitter:=tGitter.create(round(breite/deltaX),deltaT,deltaX,pDNMax,kvs,dichten,lichter,zeitverfahren,prot);
+ gitter:=tGitter.create(round(breite/deltaX)+1,dT,deltaX,pDNMax,kvs,dichten,lichter,zeitverfahren,prot,'gitter');
dichten.free;
lichter.free;
end;
@@ -862,51 +995,33 @@ end;
function tSimulation.iteriereSchritt(start: extended; var zeitPhysik,zeitDatei: extended): boolean; // noch nicht zu Ende?
var
i: longint;
- c: char;
begin
result:=false;
zeitPhysik:=zeitPhysik-now;
if errorCode<2 then
- gitter.iteriereSchritt(dT);
+ gitter.iteriereSchritt(dT,1/dT);
zeitPhysik:=zeitPhysik+now;
zeitDatei:=zeitDatei-now;
- while gitter.t>=sT do begin
+ while (gitter.t>=sT) and (sT<tEnde) do begin
sT:=sT+sDT;
- for i:=0 to length(Ausgabedateien)-1 do
- gitter.macheAusgabe(ausgabeDateien[i],sDX);
+ for i:=0 to length(ausgabeDateien)-1 do
+ ausgabeDateien[i].speichereWerte(gitter,sDX);
end;
zeitDatei:=zeitDatei+now;
- gitter.iteriereSchritt(dT);
-
if fortschrittsAnzeige then begin
- if (floor(100*Gitter.t/tEnde) < floor(100*(Gitter.t+dT)/tEnde)) or keypressed then begin
- if keypressed then c:=readkey
- else c:=#0;
- case c of
- #27,'q': begin
- errorCode:=3;
- exit;
- end;
- ' ': begin
- writeln(' ... Pause (beliebige Taste drücken um fortzufahren) ...');
- readkey;
- writeln(' ... weiter geht''s ...');
- end;
- else 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);
- if errorCode<2 then
- Prot.schreibe(gitter.gibErhaltungsgroessen);
- end;
- end{of case};
+ 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);
+ if errorCode<2 then
+ Prot.schreibe(gitter.gibErhaltungsgroessen);
end;
end;
- result:=gitter.t>=tEnde;
+ result:=gitter.t<tEnde;
end;
end.
diff --git a/Plasmapropagation b/Plasmapropagation
index 98472f4..3501611 100755
--- a/Plasmapropagation
+++ b/Plasmapropagation
Binary files differ
diff --git a/Plasmapropagation.lpi b/Plasmapropagation.lpi
index f707ff5..28ad15a 100644
--- a/Plasmapropagation.lpi
+++ b/Plasmapropagation.lpi
@@ -68,7 +68,6 @@
<OverflowChecks Value="True"/>
<StackChecks Value="True"/>
</Checks>
- <VerifyObjMethodCallValidity Value="True"/>
</CodeGeneration>
<Linking>
<Options>
@@ -78,10 +77,7 @@
</Options>
</Linking>
<Other>
- <Verbosity>
- <ShoLineNum Value="True"/>
- <ShowDebugInfo Value="True"/>
- </Verbosity>
+ <WriteFPCLogo Value="False"/>
</Other>
</CompilerOptions>
<Debugging>
diff --git a/Plasmapropagation.lpr b/Plasmapropagation.lpr
index 5c914d5..5559f51 100644
--- a/Plasmapropagation.lpr
+++ b/Plasmapropagation.lpr
@@ -8,9 +8,7 @@ uses
{$ENDIF}{$ENDIF}
Classes, SysUtils, CustApp,
{ you can add units after this }
- math, Physikunit, crt, protokollunit;
-
-var ErrorCode: longint;
+ math, Physikunit, protokollunit;
type
@@ -45,7 +43,7 @@ begin
zeitDatei:=0;
zeitPhysik:=0;
- simulation:=tSimulation.create(paramstr(1),prot);
+ simulation:=tSimulation.create(paramstr(1),prot,'simulation');
while simulation.iteriereSchritt(start,zeitPhysik,zeitDatei) do ;
@@ -66,7 +64,7 @@ begin
prot.schreibe('Das hat '+s+' gedauert,',true);
prot.schreibe(' davon '+t+' für Dateizugriffe',true);
prot.schreibe('und nur '+u+' für die eigentliche Physik!',true);
- prot.Free;
+ prot.free;
// stop program loop
Terminate;
diff --git a/Plasmapropagation.lps b/Plasmapropagation.lps
index cd5e8e9..cbe3abd 100644
--- a/Plasmapropagation.lps
+++ b/Plasmapropagation.lps
@@ -7,74 +7,72 @@
<Unit0>
<Filename Value="Plasmapropagation.lpr"/>
<IsPartOfProject Value="True"/>
- <TopLine Value="28"/>
- <CursorPos X="39" Y="11"/>
- <UsageCount Value="140"/>
+ <CursorPos X="34" Y="11"/>
+ <UsageCount Value="149"/>
<Loaded Value="True"/>
</Unit0>
<Unit1>
<Filename Value="Physikunit.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="1"/>
- <TopLine Value="699"/>
- <CursorPos X="13" Y="714"/>
- <UsageCount Value="81"/>
+ <TopLine Value="438"/>
+ <CursorPos Y="538"/>
+ <FoldState Value=" T3k60-4 piYkM0O]9j8jg0M[943jb0J5]9SkI0O3 pnBo2051g"/>
+ <UsageCount Value="90"/>
<Bookmarks Count="1">
- <Item0 Y="525"/>
+ <Item0 Y="627"/>
</Bookmarks>
<Loaded Value="True"/>
</Unit1>
<Unit2>
<Filename Value="../units/protokollunit.pas"/>
<IsPartOfProject Value="True"/>
- <EditorIndex Value="-1"/>
- <TopLine Value="26"/>
- <CursorPos X="103" Y="47"/>
- <UsageCount Value="43"/>
+ <EditorIndex Value="2"/>
+ <TopLine Value="20"/>
+ <CursorPos X="22" Y="31"/>
+ <UsageCount Value="52"/>
+ <Loaded Value="True"/>
</Unit2>
<Unit3>
<Filename Value="input.plap"/>
<IsPartOfProject Value="True"/>
- <IsVisibleTab Value="True"/>
- <EditorIndex Value="5"/>
- <CursorPos X="7" Y="19"/>
- <UsageCount Value="42"/>
+ <EditorIndex Value="4"/>
+ <CursorPos Y="22"/>
+ <UsageCount Value="51"/>
<Loaded Value="True"/>
<DefaultSyntaxHighlighter Value="None"/>
</Unit3>
<Unit4>
<Filename Value="input.epost"/>
- <EditorIndex Value="-1"/>
- <TopLine Value="45"/>
- <CursorPos Y="69"/>
- <UsageCount Value="56"/>
+ <IsVisibleTab Value="True"/>
+ <EditorIndex Value="5"/>
+ <CursorPos X="27" Y="21"/>
+ <UsageCount Value="58"/>
+ <Loaded Value="True"/>
<DefaultSyntaxHighlighter Value="None"/>
</Unit4>
<Unit5>
<Filename Value="../units/matheunit.pas"/>
<EditorIndex Value="3"/>
- <TopLine Value="75"/>
- <CursorPos Y="347"/>
- <FoldState Value=" T3i804A pibjM034]9aj60U6 plFmG04^"/>
- <UsageCount Value="18"/>
+ <TopLine Value="316"/>
+ <CursorPos Y="356"/>
+ <UsageCount Value="19"/>
<Loaded Value="True"/>
</Unit5>
<Unit6>
<Filename Value="../units/lowlevelunit.pas"/>
- <EditorIndex Value="4"/>
- <TopLine Value="373"/>
- <CursorPos X="77" Y="399"/>
- <UsageCount Value="10"/>
- <Loaded Value="True"/>
+ <EditorIndex Value="-1"/>
+ <TopLine Value="540"/>
+ <CursorPos X="20" Y="573"/>
+ <UsageCount Value="11"/>
</Unit6>
<Unit7>
<Filename Value="../units/mystringlistunit.pas"/>
- <EditorIndex Value="2"/>
- <TopLine Value="37"/>
- <CursorPos Y="223"/>
- <FoldState Value=" T3i2076 pjFjc095 plcmG0H1b"/>
- <UsageCount Value="11"/>
- <Loaded Value="True"/>
+ <EditorIndex Value="-1"/>
+ <TopLine Value="367"/>
+ <CursorPos X="17" Y="390"/>
+ <FoldState Value=" T3i3075 piZjD0WQ"/>
+ <UsageCount Value="12"/>
</Unit7>
<Unit8>
<Filename Value="../epost/werteunit.pas"/>
@@ -107,121 +105,122 @@
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="Physikunit.pas"/>
+ <Caret Line="533" Column="45" TopLine="502"/>
</Position1>
<Position2>
<Filename Value="Physikunit.pas"/>
- <Caret Line="391" Column="52" TopLine="358"/>
+ <Caret Line="679" Column="54" TopLine="522"/>
</Position2>
<Position3>
- <Filename Value="Plasmapropagation.lpr"/>
- <Caret Line="38" TopLine="11"/>
+ <Filename Value="../units/protokollunit.pas"/>
+ <Caret Line="28" Column="23"/>
</Position3>
<Position4>
- <Filename Value="Plasmapropagation.lpr"/>
- <Caret Line="11" Column="39" TopLine="28"/>
+ <Filename Value="../units/protokollunit.pas"/>
+ <Caret Line="29" Column="23"/>
</Position4>
<Position5>
- <Filename Value="Physikunit.pas"/>
- <Caret Line="111" Column="17" TopLine="91"/>
+ <Filename Value="../units/protokollunit.pas"/>
+ <Caret Line="76" Column="15" TopLine="58"/>
</Position5>
<Position6>
- <Filename Value="Physikunit.pas"/>
- <Caret Line="36" Column="23" TopLine="16"/>
+ <Filename Value="../units/protokollunit.pas"/>
+ <Caret Line="114" TopLine="77"/>
</Position6>
<Position7>
- <Filename Value="Physikunit.pas"/>
- <Caret Line="671" TopLine="631"/>
+ <Filename Value="../units/protokollunit.pas"/>
+ <Caret Line="29" TopLine="29"/>
</Position7>
<Position8>
- <Filename Value="../units/mystringlistunit.pas"/>
- <Caret Line="421" Column="57" TopLine="386"/>
+ <Filename Value="../units/protokollunit.pas"/>
+ <Caret Line="72" Column="23" TopLine="52"/>
</Position8>
<Position9>
- <Filename Value="../units/mystringlistunit.pas"/>
+ <Filename Value="../units/protokollunit.pas"/>
+ <Caret Line="31" Column="24"/>
</Position9>
<Position10>
- <Filename Value="../units/mystringlistunit.pas"/>
- <Caret Line="17" Column="23"/>
+ <Filename Value="../units/protokollunit.pas"/>
+ <Caret Line="114" Column="25" TopLine="80"/>
</Position10>
<Position11>
- <Filename Value="../units/mystringlistunit.pas"/>
- <Caret Line="27" Column="23"/>
+ <Filename Value="Plasmapropagation.lpr"/>
+ <Caret Line="35" Column="63"/>
</Position11>
<Position12>
- <Filename Value="../units/mystringlistunit.pas"/>
- <Caret Line="28" Column="23"/>
+ <Filename Value="Plasmapropagation.lpr"/>
+ <Caret Line="26" Column="11" TopLine="15"/>
</Position12>
<Position13>
- <Filename Value="../units/mystringlistunit.pas"/>
- <Caret Line="83" Column="10" TopLine="44"/>
+ <Filename Value="Physikunit.pas"/>
+ <Caret Line="509" TopLine="369"/>
</Position13>
<Position14>
- <Filename Value="../units/mystringlistunit.pas"/>
- <Caret Line="81" TopLine="42"/>
+ <Filename Value="Physikunit.pas"/>
+ <Caret Line="11" Column="84"/>
</Position14>
<Position15>
- <Filename Value="../units/mystringlistunit.pas"/>
- <Caret Line="27" Column="54" TopLine="16"/>
+ <Filename Value="Physikunit.pas"/>
+ <Caret Line="1010" Column="69" TopLine="990"/>
</Position15>
<Position16>
<Filename Value="Physikunit.pas"/>
- <Caret Line="732" Column="56" TopLine="702"/>
+ <Caret Line="1017" TopLine="764"/>
</Position16>
<Position17>
<Filename Value="Physikunit.pas"/>
- <Caret Line="402" Column="52" TopLine="382"/>
+ <Caret Line="937" Column="40" TopLine="915"/>
</Position17>
<Position18>
- <Filename Value="../units/mystringlistunit.pas"/>
- <Caret Line="264" Column="39" TopLine="256"/>
+ <Filename Value="Physikunit.pas"/>
+ <Caret Line="262" Column="50" TopLine="242"/>
</Position18>
<Position19>
- <Filename Value="../units/mystringlistunit.pas"/>
- <Caret Line="25" Column="6" TopLine="8"/>
+ <Filename Value="Physikunit.pas"/>
+ <Caret Line="55" Column="53" TopLine="23"/>
</Position19>
<Position20>
- <Filename Value="../units/mystringlistunit.pas"/>
- <Caret Line="83" Column="3" TopLine="46"/>
+ <Filename Value="Physikunit.pas"/>
</Position20>
<Position21>
- <Filename Value="../units/mystringlistunit.pas"/>
- <Caret Line="276" Column="48" TopLine="256"/>
+ <Filename Value="Physikunit.pas"/>
+ <Caret Line="15" Column="57"/>
</Position21>
<Position22>
- <Filename Value="../units/mystringlistunit.pas"/>
- <Caret Line="340" Column="30" TopLine="320"/>
+ <Filename Value="Physikunit.pas"/>
+ <Caret Line="410" Column="48" TopLine="382"/>
</Position22>
<Position23>
- <Filename Value="../units/mystringlistunit.pas"/>
- <Caret Line="27" Column="54" TopLine="17"/>
+ <Filename Value="Physikunit.pas"/>
+ <Caret Line="528" Column="149" TopLine="415"/>
</Position23>
<Position24>
<Filename Value="Physikunit.pas"/>
- <Caret Line="402" Column="47" TopLine="382"/>
+ <Caret Line="511"/>
</Position24>
<Position25>
<Filename Value="Physikunit.pas"/>
- <Caret Line="728" Column="38" TopLine="709"/>
+ <Caret Line="529" Column="35" TopLine="473"/>
</Position25>
<Position26>
- <Filename Value="../units/matheunit.pas"/>
- <Caret Line="102" Column="33" TopLine="25"/>
+ <Filename Value="Physikunit.pas"/>
+ <Caret Line="511" Column="19" TopLine="475"/>
</Position26>
<Position27>
- <Filename Value="../units/matheunit.pas"/>
- <Caret Line="45" Column="21" TopLine="25"/>
+ <Filename Value="Physikunit.pas"/>
+ <Caret Line="75" Column="31" TopLine="61"/>
</Position27>
<Position28>
- <Filename Value="../units/matheunit.pas"/>
- <Caret Line="347" Column="21" TopLine="314"/>
+ <Filename Value="Physikunit.pas"/>
+ <Caret Line="534" Column="61" TopLine="472"/>
</Position28>
<Position29>
- <Filename Value="../units/matheunit.pas"/>
- <Caret Line="443" Column="34" TopLine="425"/>
+ <Filename Value="Physikunit.pas"/>
+ <Caret Line="64" Column="35" TopLine="47"/>
</Position29>
<Position30>
- <Filename Value="../units/lowlevelunit.pas"/>
- <Caret Line="54" Column="18" TopLine="46"/>
+ <Filename Value="Physikunit.pas"/>
+ <Caret Line="369" Column="43" TopLine="344"/>
</Position30>
</JumpHistory>
</ProjectSession>
diff --git a/input.epost b/input.epost
index 8f9dc9e..68a9f8f 100644
--- a/input.epost
+++ b/input.epost
@@ -18,7 +18,7 @@ Ende
Threadanzahl: 10
# !Schleife: $Feld: dDPHIDX dDAYDT dAY dAX
-!Schleife: $Feld: AX
+!Schleife: $Feld: AY DAYDT
Daten einlesen
Genauigkeit: extended
diff --git a/input.plap b/input.plap
index d2debd1..673a4e2 100644
--- a/input.plap
+++ b/input.plap
@@ -3,9 +3,9 @@
allgemein
runge-Kutta-4
ortsschritt 10^-2 * λ
- zeitschritt 10^-3 * T
- zeit 100 * T
- breite 10 * λ
+ zeitschritt 10^-2 * T
+ zeit 20 * T
+ breite 5 * λ
mit Fortschrittsanzeige
allgemeinEnde
@@ -15,12 +15,12 @@ ausgaben
# felder AX,AY,dAYDT,N,dPhiDX,dPsiDX,Gamma
ausgabenEnde
-!setze $tFwhm: 5 T
-!setze $tMitte: 20 T
+!setze $tFwhm: (2.5 * T)
+!setze $tMitte: (1 * T)
-lichtVonLinks 0.5 * 2^(-2*((t-$tMitte)/$tFwhm)^2) * Sin(ω*t)
+licht von links 0.5 * 2^(-2*((t-$tMitte)/$tFwhm)^2) * sin(ω*t)
-dateiEnde
+Dateiende
teilchen1
ladung -q