summaryrefslogtreecommitdiff
path: root/Plasmapropagation.lpr
diff options
context:
space:
mode:
Diffstat (limited to 'Plasmapropagation.lpr')
-rw-r--r--Plasmapropagation.lpr166
1 files changed, 14 insertions, 152 deletions
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