summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Physikunit.pas327
-rwxr-xr-xPlasmapropagationbin1305003 -> 3344888 bytes
-rw-r--r--Plasmapropagation.lpi20
-rw-r--r--Plasmapropagation.lpr166
-rw-r--r--Plasmapropagation.lps183
-rw-r--r--input.plap49
6 files changed, 380 insertions, 365 deletions
diff --git a/Physikunit.pas b/Physikunit.pas
index 0aee452..71e6a79 100644
--- a/Physikunit.pas
+++ b/Physikunit.pas
@@ -8,7 +8,7 @@ unit Physikunit;
interface
uses
- Classes, SysUtils, Math;
+ Classes, SysUtils, Math, protokollunit, matheunit, mystringlistunit, lowlevelunit;
type
TZeitverfahren = (zfEulerVorwaerts,zfRungeKuttaVier);
@@ -21,73 +21,70 @@ type
fiGamma,fiiGamma);
TAusgabeDatei = record
- Ableitung: Boolean;
- Inhalt: TFeldInhalt;
- Datei: File;
+ ableitung: boolean;
+ inhalt: tFeldInhalt;
+ name: string;
+ datei: file;
end;
- TProtokolldatei = record
- datei: textfile;
- einrueckung: longint;
- end;
+ tFelder = class;
- { TProtokollant }
+ { tWerteGitter }
- TProtokollant = class(TObject)
- private
- sDat: ^TProtokolldatei;
- Bes: String;
- Kinder: array of TProtokollant;
- Elter: TProtokollant;
- public
- constructor create(Dateiname: string); overload;
- constructor create(Elter_: TProtokollant; Besitzer: string); overload;
- destructor destroy; override;
- procedure schreibe(s: string);
- procedure schreibe(s: string; tee: boolean);
- procedure destroyall;
+ tWerteGitter = class(tObject) // repräsentiert ein Gitter von Werten und deren Zeitableitungen
+ werte: array[boolean] of array of extended;
+ par: tFelder;
end;
- { TFeld }
+ { TFelder }
- pTFeld = ^TFeld;
- TFeld = class(TObject)
+ tFelder = class(tObject) // repräsentiert eine Simulationsbox von Feldern inklusive deren Ableitungen
public
- Groessen: array[Boolean,TFeldInhalt] of extended;
+ materieFelder: array of tWerteGitter; // Materiefelder (getrennt für verschiedene Teilchenspezies) und deren Zeitableitungen
+ elektroMagnetischeFelder: tWerteGitter; // EM-Felder und deren Zeitableitungen
// A, p[xyz]? und i?Gamma haben keine sinnvolle Ableitung hier!
dX,iDX,x,pDNMax: extended;
- lN,rN: pTFeld;
+
constructor create(deltaX,pDNMa: extended);
procedure berechneGammaUndP;
procedure berechneNAbleitung;
procedure berechneAbleitungen(dT: extended);
end;
- { TGitter }
+ { tGitter }
- TGitter = class(TObject)
+ tGitter = class(tObject)
private
groesse: longint;
- Prot: TProtokollant;
+ prot: tProtokollant;
procedure berechneAbleitungen(Felder: longint; dt: extended); overload;
procedure berechneAbleitungen(Felder: longint; dt: extended; out dTMax: extended); overload;
procedure setzeRaender(Felder: longint);
public
aktuelleFelder: longint;
- Felders: array of array of TFeld;
+ felders: array of tFelder; // mehrere komplette Simulationsboxen von Feldern, benötigt um Zwischenschritte für die Zeitentwicklung zu speichern
dTMaximum,dX,iDX,xl,xr,t,pDNMax: extended;
pDNMaxDynamisch: boolean;
Zeitverfahren: TZeitverfahren;
Al,Ar: TVerteilungsfunktion;
- constructor create(size: longint; deltaT,deltaX,pDNMa: extended; n0: TVerteilungsfunktion; ZV: TZeitverfahren; Protokollant: TProtokollant);
+ constructor create(size: longint; deltaT,deltaX,pDNMa: extended; dichten, lichter: tMyStringlist; zv: tZeitverfahren; protokollant: tProtokollant);
destructor destroy; override;
procedure iteriereSchritt(var dT: extended);
procedure macheAusgabe(AD: TAusgabedatei; sDX: extended);
function gibErhaltungsgroessen: string;
end;
-function Nullfunktion(x: extended): extended;
-function timetostr(t: extended): string;
+ { tSimulation }
+
+ tSimulation = class(tObject)
+ private
+ prot: tProtokollant;
+ gitter: tGitter;
+ kvs: tKnownValues;
+ public
+ constructor create(inName: string; Protokollant: tProtokollant);
+ destructor destroy; override;
+ end;
const
OptionNamen: array[TFeldInhalt] of string = (
@@ -98,81 +95,6 @@ const
implementation
-{ TProtokollant }
-
-constructor TProtokollant.create(Dateiname: string);
-begin
- inherited create;
- getmem(sDat,sizeof(TProtokolldatei));
- sDat^.einrueckung:=10;
- assignfile(sDat^.datei,Dateiname);
- rewrite(sDat^.datei);
- Bes:='';
- setlength(Kinder,0);
- Elter:=nil;
-end;
-
-constructor TProtokollant.create(Elter_: TProtokollant; Besitzer: string);
-begin
- inherited create;
- sDat:=Elter_.sDat;
- setlength(Elter_.Kinder,length(Elter_.Kinder)+1);
- Elter_.Kinder[length(Elter_.Kinder)-1]:=self;
- Elter:=Elter_;
- setlength(Kinder,0);
- Bes:=Elter.Bes+'.'+Besitzer;
- if pos('.',Bes)=1 then delete(Bes,1,1);
- if length(Bes)+4 > sDat^.einrueckung then
- sDat^.einrueckung:=length(Bes)+4;
-end;
-
-destructor TProtokollant.destroy;
-var i: longint;
-begin
- while length(Kinder)>0 do
- Kinder[length(Kinder)-1].free;
- if assigned(Elter) then begin
- flush(sDat^.datei);
- i:=0;
- while (i<length(Elter.Kinder)) and (Elter.Kinder[i]<>self) do
- inc(i);
- if i>=length(Elter.Kinder) then
- schreibe('destroy fehlgeschlagen, ich kann mich nicht sehen.');
- inc(i);
- while i<length(Elter.Kinder) do begin
- Elter.Kinder[i-1]:=Elter.Kinder[i];
- inc(i);
- end;
- setlength(Elter.Kinder,length(Elter.Kinder)-1);
- end
- else begin
- closefile(sDat^.datei);
- freemem(sDat,sizeof(TProtokolldatei));
- end;
- inherited destroy;
-end;
-
-procedure TProtokollant.destroyall;
-begin
- if Assigned(Elter) then Elter.destroyall
- else destroy;
-end;
-
-procedure TProtokollant.schreibe(s: string);
-begin
- schreibe(s,false);
-end;
-
-procedure TProtokollant.schreibe(s: string; tee: boolean);
-var i: longint;
-begin
- for i:=length(Bes)+1 to sDat^.einrueckung do
- s:=' '+s;
- writeln(sDat^.datei,Bes+s);
- if tee then
- writeln(Bes+s);
-end;
-
{ TFeld }
constructor TFeld.create(deltaX,pDNMa: extended);
@@ -308,12 +230,12 @@ begin
+ (Ar(t+dTMaximum)-Ar(t))/dTMaximum;
end;
-constructor TGitter.create(size: longint; deltaT,deltaX,pDNMa: extended; n0: TVerteilungsfunktion; ZV: TZeitverfahren; Protokollant: TProtokollant);
+constructor TGitter.create(size: longint; deltaT,deltaX,pDNMa: extended; dichten, lichter: tMyStringlist; zv: tZeitverfahren; protokollant: tProtokollant);
var i,j: longint;
begin
inherited create;
- Ar:=@Nullfunktion;
- Al:=@Nullfunktion;
+ Ar:=@nullfunktion;
+ Al:=@nullfunktion;
Zeitverfahren:=ZV;
groesse:=size;
Prot:=TProtokollant.create(Protokollant,'TGitter');
@@ -335,6 +257,7 @@ begin
for j:=0 to length(felders[i])-1 do begin
felders[i,j]:=TFeld.create(dX,pDNMax);
felders[i,j].x:=xl+j*dX;
+ knownValues.add('x',felders[i,j].x);
felders[i,j].Groessen[false,fiN]:=n0(felders[i,j].x);
felders[i,j].Groessen[false,fidPsiDX]:=0.0001*Cos(j/(length(felders[i])-1)*pi*15);
end;
@@ -353,9 +276,12 @@ end;
destructor TGitter.destroy;
var i,j: longint;
begin
- for i:=0 to 1 do
+ for i:=0 to length(Felders)-1 do begin
for j:=0 to length(Felders[i])-1 do
Felders[i,j].free;
+ setlength(Felders[i],0);
+ end;
+ setlength(Felders,0);
inherited destroy;
end;
@@ -574,34 +500,163 @@ begin
Pro.free;
end;
-function Nullfunktion(x: extended): extended;
+{ tSimulation }
+
+constructor tSimulation.create(inName: string; Protokollant: tProtokollant);
+var
+ ifile: tMyStringlist;
+ zeitverfahren: tZeitverfahren;
+ s,t,aSuffix,aPrefix: string;
+ deltaX,deltaT,endzeit,breite,sDT,pDNMax: extended;
+ ausgabeDateien: array of tAusgabeDatei;
+ abl: boolean;
+ fi: tFeldinhalt;
+ i,j: longint;
begin
- result:=0*x;
-end;
+ inherited create;
+ prot:=tProtokollant.create(Protokollant,'tSimulation');
+ kvs:=tKnownValues.create;
-function timetostr(t: extended): string;
-var b: boolean;
-begin
- result:='';
- b:=t>=1;
- if b then begin
- result:=result+inttostr(floor(t))+' Tage ';
- t:=t-floor(t);
+ ifile:=tMyStringlist.create(prot);
+ ifile.loadfromfile(inName);
+ if not ifile.unfoldMacros then begin
+ prot.schreibe('Fehlerhafte Macros in Parameterdatei '''+inName+'''!',true);
+ halt(1);
+ end;
+
+ // Standardeinstellungen Bereich 'allgemein'
+ zeitverfahren:=zfRungeKuttaVier;
+ deltaX:=1e-2;
+ kvs.add('λ',1/deltaX);
+ deltaT:=-1;
+ sDT:=-1;
+ endzeit:=100;
+ breite:=10.0;
+ pDNMax:=-1;
+
+ // Standardeinstellungen Bereich 'ausgaben'
+ aPrefix:=extractfilepath(paramstr(0));
+ aSuffix:='.dat';
+ setlength(ausgabeDateien,0);
+
+ while ifile.readln(s) do begin
+ 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;
+ if s='allgemeinEnde' then break;
+ if s='runge-Kutta-4' then begin
+ Zeitverfahren:=zfRungeKuttaVier;
+ continue;
+ end;
+ if s='euler-Vorwärts' then begin
+ Zeitverfahren:=zfEulerVorwaerts;
+ continue;
+ end;
+ if startetMit('ortsschritt',s) then begin
+ deltaX:=exprtofloat(false,s,kvs,nil);
+ kvs.add('λ',1/deltaX);
+ continue;
+ end;
+ if startetMit('zeitschritt',s) then begin
+ deltaT:=exprtofloat(false,s,kvs,nil);
+ kvs.add('dT',deltaT);
+ continue;
+ end;
+ if startetMit('diffusionsterm',s) then begin
+ pDNMax:=exprtofloat(false,s,kvs,nil);
+ continue;
+ end;
+ if startetMit('zeit',s) then begin
+ endzeit:=exprtofloat(false,s,kvs,nil);
+ continue;
+ end;
+ if startetMit('breite',s) then begin
+ breite:=exprtofloat(false,s,kvs,nil);
+ continue;
+ end;
+ prot.schreibe('Unbekannter Befehl '''+s+''' in Parameterdatei '''+inName+''' im Bereich allgemein!',true);
+ halt(1);
+ until false;
+ continue;
+ end;
+
+ if s='ausgaben' then begin
+ repeat
+ if not ifile.readln(s) then begin
+ prot.schreibe('Unerwartetes Dateiende in Parameterdatei '''+inName+''' im Bereich ausgaben!',true);
+ halt(1);
+ end;
+ if s='ausgabenEnde' then break;
+ if startetMit('suffix',s) then begin
+ aSuffix:=s;
+ continue;
+ end;
+ if startetMit('prefix',s) then begin
+ aPrefix:=s;
+ continue;
+ end;
+ if startetMit('zeitschritt',s) then begin
+ sDT:=exprtofloat(false,s,kvs,nil);
+ continue;
+ end;
+ if startetMit('felder',s) then begin
+ s:=s+',';
+ while s<>'' do begin
+ t:=erstesArgument(s,',');
+ for abl:=false to true do
+ for fI:=low(tFeldInhalt) to high(tFeldInhalt) do
+ if not (abl and (fI in [fiGamma,fiP])) then
+ if t=copy('d',1,byte(abl))+optionNamen[fI] then begin
+ setlength(ausgabedateien,length(ausgabedateien)+1);
+ ausgabedateien[length(ausgabedateien)-1].inhalt:=fI;
+ ausgabedateien[length(ausgabedateien)-1].ableitung:=abl;
+ ausgabedateien[length(ausgabedateien)-1].name:=aPrefix+t+aSuffix;
+ assignFile(ausgabedateien[length(ausgabedateien)-1].datei,ausgabedateien[length(ausgabedateien)-1].name);
+ end;
+ end;
+ continue;
+ end;
+ prot.schreibe('Unbekannter Befehl '''+s+''' in Parameterdatei '''+inName+''' im Bereich ausgaben!',true);
+ halt(1);
+ until false;
+ continue;
+ end;
+
+ prot.schreibe('Unbekannter Befehl '''+s+''' in Parameterdatei '''+inName+'''!',true);
+ halt(1);
end;
- t:=t*24;
- b:=b or (t>=1);
- if b then begin
- result:=result+inttostr(floor(t))+'h ';
- t:=t-floor(t);
+
+ if length(ausgabedateien)=0 then begin
+ prot.schreibe('Du solltest irgendetwas abspeichern lassen!',true);
+ halt(1);
end;
- t:=t*60;
- b:=b or (t>=1);
- if b then begin
- result:=result+inttostr(floor(t))+'min ';
- t:=t-floor(t);
+
+ if deltaT<0 then
+ deltaT:=deltaX/10;
+ if sDT<0 then
+ sDT:=deltaT;
+
+ 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(Endzeit/sDT+1);
+ BlockWrite(Ausgabedateien[i].Datei,j,sizeof(longint));
end;
- t:=t*60;
- result:=result+inttostr(round(t))+'s';
+ ifile.free;
+
+ gitter:=tGitter.create(Breite,deltaT,deltaX,pDNMax,@Anfangsdichte,Zeitverfahren,Prot);
+end;
+
+destructor tSimulation.destroy;
+begin
+ gitter.free;
+ kvs.free;
+ prot.free;
+ inherited destroy;
end;
end.
diff --git a/Plasmapropagation b/Plasmapropagation
index c461c9f..013329a 100755
--- a/Plasmapropagation
+++ b/Plasmapropagation
Binary files differ
diff --git a/Plasmapropagation.lpi b/Plasmapropagation.lpi
index 40504f6..f707ff5 100644
--- a/Plasmapropagation.lpi
+++ b/Plasmapropagation.lpi
@@ -1,4 +1,4 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="9"/>
@@ -32,17 +32,23 @@
<LaunchingApplication PathPlusParams="/usr/bin/screen -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
</local>
</RunParams>
- <Units Count="2">
+ <Units Count="4">
<Unit0>
<Filename Value="Plasmapropagation.lpr"/>
<IsPartOfProject Value="True"/>
- <UnitName Value="Plasmapropagation"/>
</Unit0>
<Unit1>
<Filename Value="Physikunit.pas"/>
<IsPartOfProject Value="True"/>
- <UnitName Value="Physikunit"/>
</Unit1>
+ <Unit2>
+ <Filename Value="../units/protokollunit.pas"/>
+ <IsPartOfProject Value="True"/>
+ </Unit2>
+ <Unit3>
+ <Filename Value="input.plap"/>
+ <IsPartOfProject Value="True"/>
+ </Unit3>
</Units>
</ProjectOptions>
<CompilerOptions>
@@ -52,6 +58,7 @@
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
+ <OtherUnitFiles Value="../units;/usr/lib/lazarus/components/aggpas/src/"/>
<UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<CodeGeneration>
@@ -73,13 +80,8 @@
<Other>
<Verbosity>
<ShoLineNum Value="True"/>
- <ShowAllProcsOnError Value="True"/>
<ShowDebugInfo Value="True"/>
</Verbosity>
- <CompilerMessages>
- <MsgFileName Value=""/>
- </CompilerMessages>
- <CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>
<Debugging>
diff --git a/Plasmapropagation.lpr b/Plasmapropagation.lpr
index 52e1926..b861d2e 100644
--- a/Plasmapropagation.lpr
+++ b/Plasmapropagation.lpr
@@ -8,7 +8,7 @@ uses
{$ENDIF}{$ENDIF}
Classes, SysUtils, CustApp,
{ you can add units after this }
- math, Physikunit, crt;
+ math, Physikunit, crt, protokollunit;
var ErrorCode: longint;
@@ -22,145 +22,34 @@ type
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
- procedure WriteHelp; virtual;
end;
-function InputFeld(t: extended): extended;
-const a0 = 1;
- omega = 2*pi*100;
- tfwhm = 10 * 2*pi/omega;
- tMitte = 3*tfwhm;
-begin
-(* result:=
- a0 * Exp(-2*Ln(2)*sqr((t-tMitte)/tfwhm)) *
- (omega*Cos(t*omega) + 4*Ln(2)*(tMitte - t)*Sin(t*omega)/sqr(tfwhm)); *)
-
- result:=
- a0 * Exp(-2*Ln(2)*sqr((t-tMitte)/tfwhm)) *
- Sin(t*omega)
-end;
-
-function Anfangsdichte(x: extended): extended;
-const Profilbreite = 0.5;
- Randbreite = 0.1;
- offset = 0.0001;
- Mitte = 0.75;
-begin
- x:=abs(x-Mitte);
- result:=1+offset;
- if x<=Profilbreite then exit;
- result:=0+offset;
- if x>=Profilbreite+Randbreite then exit;
- result:=sqr(sin((Profilbreite+Randbreite-x)*0.5*pi/Randbreite))+offset;
-end;
-
{ TPlasmapropagation }
procedure TPlasmapropagation.DoRun;
var
- ErrorMsg,s,t,u: String;
- Breite,i,j: longint;
- Gitter: TGitter;
- deltaT,deltaX,start,
- sT,sDT,sDX,Endzeit,
- zeitDatei,zeitPhysik,
- pDNMax: extended;
- AusgabeDateien: array of TAusgabeDatei;
- FI: TFeldInhalt;
- Zeitverfahren: TZeitverfahren;
- Abl: Boolean;
- Prot: TProtokollant;
- c: char;
+ Breite,i,j: longint;
+ simulation: tSimulation;
+ start,zeitDatei,zeitPhysik: extended;
+ FI: TFeldInhalt;
+ Abl: Boolean;
+ Prot: TProtokollant;
+ c: char;
begin
- // quick check parameters
- start:=now;
- s:='';
- for Abl:=False to True do
- for FI:=low(TFeldInhalt) to high(TFeldInhalt) do
- if not (Abl and (FI in [fiP,fiPX,fiPY,fiPZ,fiGamma,fiiGamma])) then
- s:=s+' '+Copy('d',1,Byte(Abl))+OptionNamen[FI]+':';
- ErrorMsg:=CheckOptions('HB:Z:x:t:FEX:T:D:','Hilfe Breite: Zeit: Ortsschritt: Zeitschritt: Fortschrittsanzeige Euler Ortsspeicherschritt: Zeitspeicherschritt: Diffusionsterm:'+s);
- if (ErrorMsg='') then begin
- setlength(Ausgabedateien,0);
- for Abl:=False to True do
- for FI:=low(TFeldInhalt) to high(TFeldInhalt) do
- if not (Abl and (FI in [fiGamma,fiP])) then
- if HasOption(Copy('d',1,Byte(Abl))+OptionNamen[FI]) then begin
- setlength(Ausgabedateien,length(Ausgabedateien)+1);
- Ausgabedateien[length(Ausgabedateien)-1].Inhalt:=FI;
- Ausgabedateien[length(Ausgabedateien)-1].Ableitung:=Abl;
- AssignFile(Ausgabedateien[length(Ausgabedateien)-1].Datei,GetOptionValue(Copy('d',1,Byte(Abl))+OptionNamen[FI]));
- end;
- if length(Ausgabedateien)=0 then
- ErrorMsg:='Du solltest irgendetwas abspeichern lassen! ('+AusgabeHilfe+')';
- end;
- if ErrorMsg<>'' then begin
- ShowException(Exception.Create(ErrorMsg));
- Terminate;
- Exit;
- end;
+ prot:=tProtokollant.create('error');
- // parse parameters
- if HasOption('H','Hilfe') then begin
- WriteHelp;
- Terminate;
- Exit;
+ if paramcount<>1 then begin
+ prot.schreibe('Bitte genau einen Parameter übergeben, nämlich die Parameterdatei!',true);
+ halt(1);
end;
- if HasOption('Z','Zeit') then Endzeit:=strtofloat(GetOptionValue('Z','Zeit'))
- else Endzeit:=100;
- if HasOption('x','Ortsschritt') then deltaX:=strtofloat(GetOptionValue('x','Ortsschritt'))
- else deltaX:=1e-2;
- if HasOption('B','Breite') then Breite:=round(strtofloat(GetOptionValue('B','Breite'))/deltaX)
- else Breite:=1000;
- if HasOption('t','Zeitschritt') then deltaT:=strtofloat(GetOptionValue('t','Zeitschritt'))
- else deltaT:=deltaX/10;
- if HasOption('X','Ortsspeicherschritt') then begin
- s:=GetOptionValue('X','Ortsspeicherschritt');
- if pos('#',s)=0 then sDX:=strtofloat(s)
- else sDX:=Breite*deltaX/strtofloat(rightstr(s,length(s)-1));
- end
- else sDX:=deltaX;
- if HasOption('T','Zeitspeicherschritt') then begin
- s:=GetOptionValue('T','Zeitspeicherschritt');
- if pos('#',s)=0 then sDT:=strtofloat(s)
- else sDT:=Endzeit/strtofloat(rightstr(s,length(s)-1));
- end
- else sDT:=sDX;
- if HasOption('D','Diffusionsterm') then pDNMax:=strtofloat(GetOptionValue('D','Diffusionsterm'))
- else pDNMax:=-1;
- if HasOption('E','Euler') then Zeitverfahren:=zfEulerVorwaerts
- else Zeitverfahren:=zfRungeKuttaVier;
- { add your program here }
+ start:=now;
- Prot:=TProtokollant.create('error');
-
- Prot.schreibe('Simulationsbox');
- Prot.schreibe(' '+inttostr(breite)+' Felder breit ('+floattostr(breite*deltaX)+' lambda)');
- Prot.schreibe(' '+floattostr(Endzeit)+' T lang (etwa '+inttostr(round(Endzeit/deltaT))+' Schritte)');
- Prot.schreibe(' '+floattostr(deltaT)+' Zeitschritt und '+floattostr(deltaX)+' Ortsschritt');
- for i:=0 to length(Ausgabedateien)-1 do begin
- Prot.schreibe('Mache Ausgabe '+Copy('d',1,Byte(Ausgabedateien[i].Ableitung))+Ausgabenamen[Ausgabedateien[i].Inhalt]+'.');
- Rewrite(Ausgabedateien[i].Datei,1);
- j:=0;
- BlockWrite(Ausgabedateien[i].Datei,j,sizeof(longint));
- j:=floor(Endzeit/sDT+1);
- BlockWrite(Ausgabedateien[i].Datei,j,sizeof(longint));
- end;
- if pDNMax<0 then Prot.schreibe('Maximales px * dn/dx / n wird automatisch ermittelt.')
- else Prot.schreibe('Maximales px * dn/dx / n: '+floattostr(pDNMax/deltaX)+'mc/dx');
- s:='Iterationsverfahren: ';
- case Zeitverfahren of
- zfEulerVorwaerts: s:=s+'Euler-Vorwärts';
- zfRungeKuttaVier: s:=s+'Runge-Kutta';
- else s:=s+'unbekannt!?';
- end{of case};
- Prot.schreibe(s);
zeitDatei:=0;
zeitPhysik:=0;
sT:=-Min(deltaT,sDT)/2;
- Gitter:=TGitter.create(Breite,deltaT,deltaX,pDNMax,@Anfangsdichte,Zeitverfahren,Prot);
+ simulation:=tSimulation.create(paramstr(1));
// Gitter.Al:=@InputFeld;
while Gitter.t<Endzeit do begin
if HasOption('F','Fortschrittsanzeige') then begin
@@ -241,33 +130,6 @@ begin
inherited Destroy;
end;
-procedure TPlasmapropagation.WriteHelp;
-begin
- { add your help code here }
- writeln('Verwendung:');
- writeln(ExeName,' -HBZxtFEP '+AusgabeHilfe);
- writeln(' -H/--Hilfe Hilfe anzeigen');
- writeln(' -B/--Breite=x');
- writeln(' Breite der Simulationsbox in Plasmawellenlängen');
- writeln(' -Z/Zeit=x');
- writeln(' Länge der Simulationsbox in Plasmaoszillationsperioden');
- writeln(' -x/Ortsschritt=x');
- writeln(' Ortsdiskretisierung in Plasmaoszillationsvakuumwellenlängen');
- writeln(' -t/Zeitschritt=x');
- writeln(' Zeitdiskretisierung in Plasmaoszillationsperioden');
- writeln(' -X/Ortsspeicherschritt=x');
- writeln(' Ortsdiskretisierung der gespeicherten Werte in Plasmaoszillationsvakuumwellenlängen');
- writeln(' -T/Zeitspeicherschritt=x');
- writeln(' Zeitdiskretisierung der gespeicherten Werte in Plasmaoszillationsperioden');
- writeln(' -F/Fortschrittsanzeige');
- writeln(' -E/Euler');
- writeln(' verwende Eulerverfahren statt Runge-Kutta Stufe 4');
- writeln(' -D/Diffusionsterm=x');
- writeln(' p_x * dn/dx / n, bis zu dem numerische Stabilität gewähleistet ist.');
- writeln(' Ein hoher Wert bringt in Verbindung mit einer schlechten Ortsauflösung unphysikalische Ergebnisse!');
- writeln(' Ein negativer Wert sowie keine Angabe aktivieren die automatische Bestimmung. Das garantiert numerische Stabilität, führt jedoch möglicherweise unbemerkt zu unphysikalischen Ergebnissen.');
-end;
-
var
Application: TPlasmapropagation;
begin
diff --git a/Plasmapropagation.lps b/Plasmapropagation.lps
index 6dd806f..f9ed3f9 100644
--- a/Plasmapropagation.lps
+++ b/Plasmapropagation.lps
@@ -1,178 +1,225 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectSession>
<Version Value="9"/>
<BuildModes Active="Default"/>
- <Units Count="4">
+ <Units Count="12">
<Unit0>
<Filename Value="Plasmapropagation.lpr"/>
<IsPartOfProject Value="True"/>
- <UnitName Value="Plasmapropagation"/>
- <EditorIndex Value="0"/>
- <WindowIndex Value="0"/>
- <TopLine Value="76"/>
- <CursorPos X="29" Y="82"/>
- <UsageCount Value="117"/>
+ <TopLine Value="101"/>
+ <CursorPos Y="133"/>
+ <UsageCount Value="129"/>
<Loaded Value="True"/>
</Unit0>
<Unit1>
<Filename Value="Physikunit.pas"/>
<IsPartOfProject Value="True"/>
- <UnitName Value="Physikunit"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="1"/>
- <WindowIndex Value="0"/>
- <TopLine Value="67"/>
- <CursorPos X="26" Y="86"/>
- <UsageCount Value="58"/>
+ <TopLine Value="136"/>
+ <CursorPos X="41" Y="252"/>
+ <UsageCount Value="70"/>
<Bookmarks Count="1">
- <Item0 X="1" Y="384" ID="0"/>
+ <Item0 Y="301"/>
</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="32"/>
+ </Unit2>
+ <Unit3>
+ <Filename Value="input.plap"/>
+ <IsPartOfProject Value="True"/>
+ <EditorIndex Value="3"/>
+ <CursorPos Y="19"/>
+ <UsageCount Value="31"/>
+ <Loaded Value="True"/>
+ <DefaultSyntaxHighlighter Value="None"/>
+ </Unit3>
+ <Unit4>
<Filename Value="../epost/epostunit.pas"/>
- <UnitName Value="epostunit"/>
- <WindowIndex Value="0"/>
<TopLine Value="575"/>
- <CursorPos X="1" Y="1"/>
<FoldState Value=" T3jg0C2 pk4kM0{A1O"/>
<UsageCount Value="1"/>
- </Unit2>
- <Unit3>
+ </Unit4>
+ <Unit5>
<Filename Value="input.epost"/>
- <EditorIndex Value="2"/>
- <WindowIndex Value="0"/>
+ <EditorIndex Value="-1"/>
<TopLine Value="45"/>
- <CursorPos X="1" Y="69"/>
+ <CursorPos Y="69"/>
<UsageCount Value="57"/>
- <Loaded Value="True"/>
<DefaultSyntaxHighlighter Value="None"/>
- </Unit3>
+ </Unit5>
+ <Unit6>
+ <Filename Value="../units/matheunit.pas"/>
+ <EditorIndex Value="2"/>
+ <TopLine Value="82"/>
+ <CursorPos X="33" Y="102"/>
+ <UsageCount Value="13"/>
+ <Loaded Value="True"/>
+ </Unit6>
+ <Unit7>
+ <Filename Value="../units/lowlevelunit.pas"/>
+ <EditorIndex Value="-1"/>
+ <TopLine Value="28"/>
+ <CursorPos Y="37"/>
+ <UsageCount Value="11"/>
+ </Unit7>
+ <Unit8>
+ <Filename Value="../units/mystringlistunit.pas"/>
+ <EditorIndex Value="-1"/>
+ <TopLine Value="371"/>
+ <CursorPos Y="399"/>
+ <FoldState Value=" T3i2077 pjIk009411j"/>
+ <UsageCount Value="11"/>
+ </Unit8>
+ <Unit9>
+ <Filename Value="../epost/werteunit.pas"/>
+ <EditorIndex Value="-1"/>
+ <TopLine Value="950"/>
+ <CursorPos X="30" Y="1054"/>
+ <UsageCount Value="10"/>
+ </Unit9>
+ <Unit10>
+ <Filename Value="../epost/typenunit.pas"/>
+ <EditorIndex Value="-1"/>
+ <TopLine Value="347"/>
+ <CursorPos X="62" Y="358"/>
+ <UsageCount Value="10"/>
+ </Unit10>
+ <Unit11>
+ <Filename Value="../units/systemunit.pas"/>
+ <EditorIndex Value="-1"/>
+ <CursorPos X="3" Y="79"/>
+ <UsageCount Value="10"/>
+ </Unit11>
</Units>
- <General>
- <ActiveWindowIndexAtStart Value="0"/>
- </General>
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="Physikunit.pas"/>
- <Caret Line="426" Column="66" TopLine="392"/>
+ <Caret Line="498" Column="37" TopLine="482"/>
</Position1>
<Position2>
- <Filename Value="Physikunit.pas"/>
- <Caret Line="440" Column="91" TopLine="406"/>
+ <Filename Value="Plasmapropagation.lpr"/>
+ <Caret Line="92" TopLine="80"/>
</Position2>
<Position3>
- <Filename Value="Physikunit.pas"/>
- <Caret Line="454" Column="91" TopLine="420"/>
+ <Filename Value="Plasmapropagation.lpr"/>
+ <Caret Line="82" TopLine="62"/>
</Position3>
<Position4>
- <Filename Value="Physikunit.pas"/>
- <Caret Line="476" Column="19" TopLine="451"/>
+ <Filename Value="Plasmapropagation.lpr"/>
+ <Caret Line="113" Column="22" TopLine="53"/>
</Position4>
<Position5>
<Filename Value="Physikunit.pas"/>
- <Caret Line="546" Column="100" TopLine="511"/>
+ <Caret Line="626" Column="60" TopLine="598"/>
</Position5>
<Position6>
<Filename Value="Physikunit.pas"/>
- <Caret Line="550" Column="21" TopLine="515"/>
+ <Caret Line="601" Column="124" TopLine="582"/>
</Position6>
<Position7>
<Filename Value="Physikunit.pas"/>
- <Caret Line="552" Column="21" TopLine="517"/>
+ <Caret Line="600" Column="62" TopLine="508"/>
</Position7>
<Position8>
<Filename Value="Physikunit.pas"/>
- <Caret Line="553" Column="21" TopLine="518"/>
+ <Caret Line="27" Column="6"/>
</Position8>
<Position9>
- <Filename Value="Plasmapropagation.lpr"/>
- <Caret Line="169" Column="24" TopLine="147"/>
+ <Filename Value="Physikunit.pas"/>
+ <Caret Line="504" Column="45" TopLine="486"/>
</Position9>
<Position10>
<Filename Value="Plasmapropagation.lpr"/>
- <Caret Line="165" Column="93" TopLine="144"/>
+ <Caret Line="113" TopLine="93"/>
</Position10>
<Position11>
- <Filename Value="Plasmapropagation.lpr"/>
- <Caret Line="11" Column="24" TopLine="1"/>
+ <Filename Value="Physikunit.pas"/>
+ <Caret Line="628" Column="4" TopLine="609"/>
</Position11>
<Position12>
- <Filename Value="Plasmapropagation.lpr"/>
- <Caret Line="167" Column="12" TopLine="146"/>
+ <Filename Value="Physikunit.pas"/>
+ <Caret Line="626" Column="76" TopLine="609"/>
</Position12>
<Position13>
- <Filename Value="Physikunit.pas"/>
- <Caret Line="308" Column="34" TopLine="285"/>
+ <Filename Value="Plasmapropagation.lpr"/>
+ <Caret Line="109" TopLine="96"/>
</Position13>
<Position14>
- <Filename Value="Physikunit.pas"/>
- <Caret Line="305" Column="19" TopLine="284"/>
+ <Filename Value="Plasmapropagation.lpr"/>
+ <Caret Line="64" TopLine="53"/>
</Position14>
<Position15>
<Filename Value="Physikunit.pas"/>
- <Caret Line="43" Column="1" TopLine="43"/>
+ <Caret Line="637" Column="11" TopLine="608"/>
</Position15>
<Position16>
<Filename Value="Physikunit.pas"/>
- <Caret Line="305" Column="47" TopLine="284"/>
+ <Caret Line="504" Column="44" TopLine="483"/>
</Position16>
<Position17>
<Filename Value="Physikunit.pas"/>
- <Caret Line="308" Column="26" TopLine="287"/>
+ <Caret Line="637" Column="55" TopLine="610"/>
</Position17>
<Position18>
<Filename Value="Physikunit.pas"/>
- <Caret Line="305" Column="14" TopLine="278"/>
+ <Caret Line="561" Column="20" TopLine="511"/>
</Position18>
<Position19>
- <Filename Value="Physikunit.pas"/>
- <Caret Line="81" Column="10" TopLine="63"/>
+ <Filename Value="input.plap"/>
+ <Caret Line="19" Column="19" TopLine="10"/>
</Position19>
<Position20>
<Filename Value="Physikunit.pas"/>
- <Caret Line="305" Column="27" TopLine="284"/>
+ <Caret Line="642" Column="55" TopLine="522"/>
</Position20>
<Position21>
<Filename Value="Physikunit.pas"/>
- <Caret Line="308" Column="27" TopLine="287"/>
+ <Caret Line="523" Column="30"/>
</Position21>
<Position22>
- <Filename Value="Plasmapropagation.lpr"/>
- <Caret Line="40" Column="11" TopLine="16"/>
+ <Filename Value="Physikunit.pas"/>
+ <Caret Line="642" Column="55" TopLine="615"/>
</Position22>
<Position23>
<Filename Value="Physikunit.pas"/>
- <Caret Line="373" Column="1" TopLine="357"/>
+ <Caret Line="530" TopLine="502"/>
</Position23>
<Position24>
<Filename Value="Physikunit.pas"/>
- <Caret Line="472" Column="60" TopLine="449"/>
+ <Caret Line="641" Column="55" TopLine="548"/>
</Position24>
<Position25>
<Filename Value="Physikunit.pas"/>
- <Caret Line="78" Column="9" TopLine="52"/>
+ <Caret Line="61" Column="24" TopLine="40"/>
</Position25>
<Position26>
<Filename Value="Physikunit.pas"/>
- <Caret Line="266" Column="19" TopLine="231"/>
+ <Caret Line="224" Column="21" TopLine="204"/>
</Position26>
<Position27>
<Filename Value="Physikunit.pas"/>
- <Caret Line="305" Column="41" TopLine="270"/>
+ <Caret Line="50" Column="15" TopLine="21"/>
</Position27>
<Position28>
<Filename Value="Physikunit.pas"/>
- <Caret Line="308" Column="41" TopLine="273"/>
+ <Caret Line="224" Column="154" TopLine="204"/>
</Position28>
<Position29>
- <Filename Value="Plasmapropagation.lpr"/>
- <Caret Line="183" Column="26" TopLine="153"/>
+ <Filename Value="../units/matheunit.pas"/>
+ <Caret Line="106" Column="34" TopLine="81"/>
</Position29>
<Position30>
<Filename Value="Physikunit.pas"/>
- <Caret Line="393" Column="86" TopLine="378"/>
+ <Caret Line="228" Column="22" TopLine="219"/>
</Position30>
</JumpHistory>
</ProjectSession>
diff --git a/input.plap b/input.plap
new file mode 100644
index 0000000..2e5ecc4
--- /dev/null
+++ b/input.plap
@@ -0,0 +1,49 @@
+# Parameterdatei für Plasmapropagation
+
+allgemein
+ runge-Kutta-4
+ ortsschritt 10^-2 λ
+ zeitschritt 10^-3 T
+ zeit 100 T
+ breite 10 λ
+allgemeinEnde
+
+ausgaben
+ suffix _test.dat
+ felder AX,AY,dAYDT,N,dPhiDX,dPsiDX,Gamma
+ausgabenEnde
+
+!set $tFwhm: 5 T
+!set $tMitte: 20 T
+
+lichtVonLinks 0.5 * 2^(-2*((t-$tMitte)/$tFwhm)^2) * Sin(ω*t)
+
+dateiEnde
+
+teilchen1
+ ladung -q
+ masse me
+ maximaldichte 0
+ beweglich
+ !setze $profilbreite: 5 λ
+ !setze $randbreite: .1 λ
+ verteilung stückweise
+ 0
+ (breite-$profilbreite)/2 - $randbreite
+ sin((x - (breite-$profilbreite)/2 - $randbreite)*π/2/$randbreite)^2
+ (breite-$profilbreite)/2
+ 1
+ (breite+$profilbreite)/2
+ sin((x - (breite+$profilbreite)/2 + $randbreite)*π/2/$randbreite)^2
+ (breite+$profilbreite)/2 + $randbreite
+ 0
+ stückweiseEnde
+teilchen1Ende
+
+teilchen2
+ ladung q
+ maximaldichte nmax1
+ unbeweglich
+ verteilung wie teilchen1
+teilchen2Ende
+