diff options
Diffstat (limited to 'Plasmapropagation.lpr')
-rw-r--r-- | Plasmapropagation.lpr | 166 |
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 |