diff options
author | Erich Eckner <git@eckner.net> | 2015-07-24 15:49:04 +0200 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2015-07-24 15:49:04 +0200 |
commit | 9e540f01e511e9928460c165dc4a420dd24ba7cb (patch) | |
tree | 3cb542d29b189a122ce0cee523072b2616c441cc | |
parent | 719059ace06e8813b1bea23fe9dce20d8f5fa969 (diff) | |
download | Plasmapropagation-9e540f01e511e9928460c165dc4a420dd24ba7cb.tar.xz |
Tagesendstand, Umstrukturierung angefangen, bei weitem nicht lauffaehig
-rw-r--r-- | Physikunit.pas | 327 | ||||
-rwxr-xr-x | Plasmapropagation | bin | 1305003 -> 3344888 bytes | |||
-rw-r--r-- | Plasmapropagation.lpi | 20 | ||||
-rw-r--r-- | Plasmapropagation.lpr | 166 | ||||
-rw-r--r-- | Plasmapropagation.lps | 183 | ||||
-rw-r--r-- | input.plap | 49 |
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 Binary files differindex c461c9f..013329a 100755 --- a/Plasmapropagation +++ b/Plasmapropagation 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 + |