diff options
-rw-r--r-- | Physikunit.pas | 202 | ||||
-rw-r--r-- | Plasmapropagation.lps | 114 | ||||
-rw-r--r-- | input.plap | 10 | ||||
-rw-r--r-- | rk108.inc | 64 | ||||
-rw-r--r-- | rk1210.inc | 96 | ||||
-rw-r--r-- | rk1412.inc | 136 | ||||
-rw-r--r-- | rk3_8.inc | 47 | ||||
-rw-r--r-- | rk3_8.txt | 30 | ||||
-rw-r--r-- | rk4.inc | 41 | ||||
-rw-r--r-- | rk4.txt | 30 | ||||
-rwxr-xr-x | rktopas | 18 |
11 files changed, 448 insertions, 340 deletions
diff --git a/Physikunit.pas b/Physikunit.pas index 0a2ca5e..142ee4b 100644 --- a/Physikunit.pas +++ b/Physikunit.pas @@ -52,7 +52,7 @@ type destructor destroy; override; function dump: string; procedure schreibeKopf; - procedure speichereWerte(gitter: tGitter; sDX: extended); + procedure speichereWerte(gitter: tGitter; sT, sDX: extended); end; { tTeilchenSpezies } @@ -121,14 +121,14 @@ type matAnz: longint; spezLadungen: tExtendedArray; lichters: array[boolean] of tMyStringlist; - procedure setzeRaender(dT,iDX,iDT: extended); + procedure setzeRaender(iDX: extended); public inhalt: array of tWertePunkt; par: tGitter; constructor create(groesse: longint; teilchen: array of tTeilchenSpezies; lichter: tMyStringList; parent: tGitter); destructor destroy; override; - procedure berechneAbleitungen(dT,dX,iDT,iDX,pDNMax: extended); + procedure berechneAbleitungen(dX,iDX,pDNMax: extended); procedure liKo(in1,in2: tFelder; fak2: extended); overload; // Werte werden auf (in1 + \sum_i faki * ini') gesetzt procedure liKo(in1,in2,in3: tFelder; fak2,fak3: extended); overload; procedure liKo(in1,in2,in3,in4: tFelder; fak2,fak3,fak4: extended); overload; @@ -163,7 +163,8 @@ type dX,iDX,pDNMax,dTMaximum,xl,t: extended; kvs: tKnownValues; procedure diffusionsTermAnpassen(pro: tProtokollant); - function pruefeMaxDT(aF: longint; var mDT,dT: extended; dTMin: extended): boolean; // wurde verkleinert? + function pruefeMaxDT(aF: longint; var dTMax,dT: extended; dTMin: extended): boolean; // wurde verkleinert? + procedure abbrechen; public aktuelleFelder: longint; @@ -334,7 +335,7 @@ begin closefile(datei); end; -procedure tAusgabeDatei.speichereWerte(gitter: tGitter; sDX: extended); +procedure tAusgabeDatei.speichereWerte(gitter: tGitter; sT, sDX: extended); var i,cnt: longint; sX,cX: extended; begin @@ -348,7 +349,7 @@ begin if (teilchen>=0) and (matInhalt=mfP) then gitter.berechne('P',teilchen); - if gitter.t>=nNum+sDT/2 then + if sT>=nNum+sDT/2 then schreibeKopf; cnt:=floor((length(gitter.felders[gitter.aktuelleFelder].inhalt)-1)/sDX*gitter.dX+1); @@ -749,12 +750,11 @@ begin inherited destroy; end; -procedure tFelder.setzeRaender(dT,iDX,iDT: extended); +procedure tFelder.setzeRaender(iDX: extended); var emF: tEMFeldInhalt; rechts: boolean; i: longint; - nVal: extended; begin for emF:=efAX to efAZ do begin // Vakuumrandbedingungen für das A-Feld inhalt[0].emWerte[emF,true]:= @@ -766,17 +766,13 @@ begin end; // (ein bisschen wird noch reflektiert, vmtl. durch numerische Fehler bzw. nicht beachtete numerische Dispersion) for rechts:=false to true do - for i:=0 to lichters[rechts].count-1 do begin - par.kvs.add('t',par.t+dT); - nVal:=exprToFloat(false,lichters[rechts][i],par.kvs,nil); - par.kvs.add('t',par.t); + for i:=0 to lichters[rechts].count-1 do inhalt[(length(inhalt)-1)*byte(rechts)].emWerte[efAY,true]:= inhalt[(length(inhalt)-1)*byte(rechts)].emWerte[efAY,true] + - (nVal - exprToFloat(false,lichters[rechts][i],par.kvs,nil))*iDT; - end; + exprToFloat(false,lichters[rechts][i],par.kvs,nil); end; -procedure tFelder.berechneAbleitungen(dT,dX,iDT,iDX,pDNMax: extended); +procedure tFelder.berechneAbleitungen(dX,iDX,pDNMax: extended); var i: longint; begin @@ -795,7 +791,7 @@ begin inhalt[1].berechneNAbleitung(iDX,pDNMax,false); inhalt[length(inhalt)-2].berechneNAbleitung(iDX,pDNMax,true); - setzeRaender(dT,iDX,iDT); + setzeRaender(iDX); for i:=1 to length(inhalt)-2 do inhalt[i].berechneAbleitungen(dX,iDX); @@ -863,49 +859,47 @@ end; procedure tGitter.diffusionsTermAnpassen(pro: tProtokollant); var - i,j: longint; + i,j: longint; + curMax: extended; begin + curMax:=0; for i:=1 to length(felders[aktuelleFelder].inhalt)-2 do for j:=0 to felders[aktuelleFelder].matAnz-1 do - if abs(felders[aktuelleFelder].inhalt[i].matWerte[j,mfPx,false]* - (felders[aktuelleFelder].inhalt[i+1].matWerte[j,mfN,false] - felders[aktuelleFelder].inhalt[i-1].matWerte[j,mfN,false])/ - max(felders[aktuelleFelder].inhalt[i+1].matWerte[j,mfN,false] + felders[aktuelleFelder].inhalt[i-1].matWerte[j,mfN,false],1e-10)) - > pDNMax then begin - if pDNMaxDynamisch then begin - pDNMax:= - 2* - abs(felders[aktuelleFelder].inhalt[i].matWerte[j,mfPX,false]* + curMax:= + max(curMax, + abs(felders[aktuelleFelder].inhalt[i].matWerte[j,mfPx,false]* (felders[aktuelleFelder].inhalt[i+1].matWerte[j,mfN,false] - felders[aktuelleFelder].inhalt[i-1].matWerte[j,mfN,false])/ - Max(felders[aktuelleFelder].inhalt[i+1].matWerte[j,mfN,false] + felders[aktuelleFelder].inhalt[i-1].matWerte[j,mfN,false],1e-10)); - pro.schreibe('Neues maximales px * dn/dx / n: '+floattostr(pDNMax)+' (t='+floattostr(t)+')'); - end - else - if pDNMax>0 then begin - pro.schreibe('Warnung: maximaler Impuls * dn/dx / n von '+floattostr(pDNMax)+' wurde überschritten (t='+floattostr(t)+ - 'T), die numerische Stabilität ist nicht mehr gewährleistet!',true); - pro.schreibe(' Lösung: größeren Diffusionsterm wählen (-D)',true); - pro.schreibe(' außerdem empfohlen: Ortsauflösung in gleichem Maße verbessern (-x)',true); - pDNMax:=-1; - end; - end; + max(felders[aktuelleFelder].inhalt[i+1].matWerte[j,mfN,false] + felders[aktuelleFelder].inhalt[i-1].matWerte[j,mfN,false],1e-100))); + if curMax > pDNMax then begin + if pDNMaxDynamisch then begin + pDNMax:=2*curMax; + pro.schreibe('Neues maximales px * dn/dx / n: '+floattostr(pDNMax)+' (t='+floattostr(t)+')'); + end + else + if pDNMax>0 then begin + pro.schreibe('Warnung: maximaler Impuls * dn/dx / n von '+floattostr(pDNMax)+' wurde überschritten (t='+floattostr(t)+ + 'T), die numerische Stabilität ist nicht mehr gewährleistet!',true); + pro.schreibe(' Lösung: größeren Diffusionsterm wählen',true); + pro.schreibe(' außerdem empfohlen: Ortsauflösung in gleichem Maße verbessern',true); + pDNMax:=0; // Term komplett abschalten + end; + end; end; -function tGitter.pruefeMaxDT(aF: longint; var mDT,dT: extended; dTMin: extended): boolean; // wurde verkleinert? +function tGitter.pruefeMaxDT(aF: longint; var dTMax,dT: extended; dTMin: extended): boolean; // wurde verkleinert? begin - mDT:=min(mDT,felders[aF].maxDT); - // das maximale dT, welches bei den Momentanen Ableitungen nicht zu + dTMax:=min(dTMax,felders[aF].maxDT); + // das maximale dT, welches bei den momentanen Ableitungen nicht zu // unphysikalischen Effekten (z.B. negativen Dichten) führt - result:=mDT<dT*2; + result:=dTMax<dT*2; if result then begin // beabsichtigter Zeitschritt ist zu groß, - dT:=mDT/4; // dann machen wir ihn doch kleiner! + dT:=dTMax/4; // dann machen wir ihn doch kleiner! {$IFDEF Zeitschrittueberwachung} - prot.schreibe('pruefeMaxDT: dT -> '+floattostr(dT)); + prot.schreibe('pruefeMaxDT: dT -> '+floattostr(dT)+' (t = '+floattostr(t)+')'); if dT<dTMin then begin prot.schreibe('pruefeMaxDT: Zeitschritt geht gegen Null (ist bereits '+floattostr(dT)+' < '+floattostr(dTMin)+') - irgendwas scheint grundsätzlich kaputt zu sein!',true); - abbruch:=true; -// prot.destroyall; -// halt(1); + abbrechen; end; prot.spuelen; {$ENDIF} @@ -913,6 +907,26 @@ begin end; end; +procedure tGitter.abbrechen; +var + i,j,k: longint; + maF: tMaterieFeldInhalt; + emF: tEMFeldInhalt; + abl: boolean; +begin + abbruch:=true; + for i:=0 to length(felders)-1 do + for j:=0 to length(felders[i].inhalt)-1 do begin + for emF:=low(tEMFeldInhalt) to high(tEMFeldInhalt) do + for abl:=false to true do + felders[i].inhalt[j].emWerte[emF,false]:=0; + for k:=0 to felders[i].matAnz-1 do + for maF:=low(tMaterieFeldInhalt) to high(tMaterieFeldInhalt) do + for abl:=false to true do + felders[i].inhalt[j].matWerte[k,maF,false]:=0; + end; +end; + procedure tGitter.iteriereSchritt(var dT: extended; dTMin: extended); var i: longint; {$IFDEF Zeitschrittueberwachung} @@ -921,7 +935,7 @@ var i: longint; {$IFDEF Dichteueberwachung} pro: tProtokollant; {$ENDIF} - iDT,mDT: extended; + dTMax: extended; begin if abbruch then begin t:=t+dT; @@ -929,97 +943,37 @@ begin end; kvs.add('t',t); diffusionsTermAnpassen(prot); - - mDT:=infinity; + dTMax:=dX*100; repeat - iDT:=1/dT; - felders[aktuelleFelder].berechneAbleitungen(dT,dX,iDT,iDX,pDNMax); // y' = y'(t,y(t)) + felders[aktuelleFelder].berechneAbleitungen(dX,iDX,pDNMax); // y' = y'(t,y(t)) - if pruefeMaxDT(aktuelleFelder,mDT,dT,dTMin) then + if pruefeMaxDT(aktuelleFelder,dTMax,dT,dTMin) then continue; case zeitverfahren of zfEulerVorwaerts: // y(t+dt) = y(t) + y' dt felders[1-aktuelleFelder].liKo(felders[aktuelleFelder],felders[aktuelleFelder],dT); - zfRungeKuttaDreiAchtel: - begin - felders[2].liKo(felders[aktuelleFelder],felders[aktuelleFelder],dT/3); // ya = y(t) + y' dt/3 - felders[2].berechneAbleitungen(dT/3,dX,iDT,iDX,pDNMax); // ya' = y'(t+dt/3,ya) - - if pruefeMaxDT(2,mDT,dT,dTMin) then - continue; - - felders[3].liKo(felders[aktuelleFelder],felders[aktuelleFelder],felders[2],-dT/3,dT); // yb = y(t) - y' dt/3 + ya' dt - felders[3].berechneAbleitungen(dT/3,dX,iDT,iDX,pDNMax); // yb' = y'(t+2dt/3,yb) - - if pruefeMaxDT(3,mDT,dT,dTMin) then - continue; - - felders[4].liKo(felders[aktuelleFelder],felders[aktuelleFelder],felders[2],felders[3],dT,-dT,dT); // yc = y(t) + a' dt - ya' dt + yb' dt - felders[4].berechneAbleitungen(dT/3,dX,iDT,iDX,pDNMax); // yc' = y'(t+dt,yc) - - if pruefeMaxDT(4,mDT,dT,dTMin) then - continue; - - felders[1-aktuelleFelder].liKo( - felders[aktuelleFelder], - felders[aktuelleFelder], - felders[2], - felders[3], - felders[4], - dT/8, - dT*3/8, - dT*3/8, - dT/8 - ); // y(t+dt) = y(t) + (y' + 3(ya' + yb') + yc') dt/8 - end; - zfRungeKuttaVier: - begin - 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) - - if pruefeMaxDT(2,mDT,dT,dTMin) then - continue; - - 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) - - if pruefeMaxDT(3,mDT,dT,dTMin) then - continue; - - 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) - - if pruefeMaxDT(4,mDT,dT,dTMin) then - continue; - - felders[1-aktuelleFelder].liKo( - felders[aktuelleFelder], - felders[aktuelleFelder], - felders[2], - felders[3], - felders[4], - dT/6, - dT/3, - dT/3, - dT/6 - ); // y(t+dt) = y(t) + (y' + 2(ya' + yb') + yc') dt/6 - end; - zfRungeKuttaZehn: begin // Quelle: http://sce.uhcl.edu/rungekutta/rk108.txt + zfRungeKuttaDreiAchtel: begin + {$INCLUDE rk3_8.inc} + end; + zfRungeKuttaVier: begin + {$INCLUDE rk4.inc} + end; + zfRungeKuttaZehn: begin // Quelle: http://sce.uhcl.edu/rungekutta/rk108.txt {$INCLUDE rk108.inc} end; - zfRungeKuttaZwoelf: begin // Quelle: http://sce.uhcl.edu/rungekutta/rk1210.txt + zfRungeKuttaZwoelf: begin // Quelle: http://sce.uhcl.edu/rungekutta/rk1210.txt {$INCLUDE rk1210.inc} end; - zfRungeKuttaVierzehn: begin // Quelle: http://sce.uhcl.edu/rungekutta/rk1412.txt + zfRungeKuttaVierzehn: begin // Quelle: http://sce.uhcl.edu/rungekutta/rk1412.txt {$INCLUDE rk1412.inc} end; end{of case}; break; until abbruch; - + prot.schreibe('dT = '+floattostr(dT)); aktuelleFelder:=1-aktuelleFelder; {$IFDEF Dichteueberwachung} for i:=0 to length(felders[aktuelleFelder].inhalt)-1 do @@ -1047,7 +1001,7 @@ begin end; {$ENDIF} t:=t+dT; - dT:=max(dT,min(1,mDT)/100); + dT:=max(dT,dTMax/100); end; function tGitter.dumpErhaltungsgroessen: boolean; @@ -1462,7 +1416,7 @@ var begin result:=false; - if gitter.abbruch then + if gitter.abbruch or (dT>sDT) then dT:=sDT; zeitPhysik:=zeitPhysik-now; @@ -1471,9 +1425,9 @@ begin zeitPhysik:=zeitPhysik+now; zeitDatei:=zeitDatei-now; while (gitter.t>=sT) and (sT<tEnde) do begin - sT:=sT+sDT; for i:=0 to length(ausgabeDateien)-1 do - ausgabeDateien[i].speichereWerte(gitter,sDX); + ausgabeDateien[i].speichereWerte(gitter,sT,sDX); + sT:=sT+sDT; end; zeitDatei:=zeitDatei+now; diff --git a/Plasmapropagation.lps b/Plasmapropagation.lps index e959ac2..de2ba33 100644 --- a/Plasmapropagation.lps +++ b/Plasmapropagation.lps @@ -3,26 +3,25 @@ <ProjectSession> <Version Value="9"/> <BuildModes Active="Default"/> - <Units Count="17"> + <Units Count="18"> <Unit0> <Filename Value="Plasmapropagation.lpr"/> <IsPartOfProject Value="True"/> <TopLine Value="54"/> <CursorPos X="37" Y="34"/> - <UsageCount Value="184"/> + <UsageCount Value="188"/> <Loaded Value="True"/> </Unit0> <Unit1> <Filename Value="Physikunit.pas"/> <IsPartOfProject Value="True"/> - <IsVisibleTab Value="True"/> <EditorIndex Value="1"/> - <TopLine Value="205"/> - <CursorPos X="23" Y="327"/> - <FoldState Value=" T3le0,312 piXlY054 pj6jN08123]Keld0B[K6T08]IlBlR0U]lp6q10G2 T0*KQ/0N1211"/> - <UsageCount Value="125"/> + <TopLine Value="943"/> + <CursorPos Y="1413"/> + <FoldState Value=" T3lf0,5 pjSlM0A[94BjZ084]9Ija09]9ifkK07[I45jO0I013 ppasC0G2 T0=HQ/0F17121b"/> + <UsageCount Value="129"/> <Bookmarks Count="1"> - <Item0 Y="1020"/> + <Item0 Y="974"/> </Bookmarks> <Loaded Value="True"/> </Unit1> @@ -31,14 +30,16 @@ <IsPartOfProject Value="True"/> <EditorIndex Value="-1"/> <CursorPos X="15" Y="46"/> - <UsageCount Value="87"/> + <UsageCount Value="91"/> </Unit2> <Unit3> <Filename Value="input.plap"/> <IsPartOfProject Value="True"/> + <IsVisibleTab Value="True"/> <EditorIndex Value="3"/> - <CursorPos X="42" Y="7"/> - <UsageCount Value="86"/> + <TopLine Value="6"/> + <CursorPos X="19" Y="14"/> + <UsageCount Value="90"/> <Loaded Value="True"/> <DefaultSyntaxHighlighter Value="None"/> </Unit3> @@ -47,14 +48,14 @@ <IsPartOfProject Value="True"/> <EditorIndex Value="2"/> <CursorPos X="48" Y="220"/> - <UsageCount Value="34"/> + <UsageCount Value="38"/> <Loaded Value="True"/> </Unit4> <Unit5> <Filename Value="input.epost"/> <EditorIndex Value="4"/> - <CursorPos X="33" Y="21"/> - <UsageCount Value="76"/> + <CursorPos X="37" Y="22"/> + <UsageCount Value="78"/> <Loaded Value="True"/> <DefaultSyntaxHighlighter Value="None"/> </Unit5> @@ -64,14 +65,14 @@ <TopLine Value="53"/> <CursorPos Y="53"/> <FoldState Value=" T3i905B pj0jV034 piaj60U2-"/> - <UsageCount Value="18"/> + <UsageCount Value="17"/> </Unit6> <Unit7> <Filename Value="../units/lowlevelunit.pas"/> <EditorIndex Value="-1"/> <TopLine Value="4"/> <CursorPos X="86" Y="23"/> - <UsageCount Value="8"/> + <UsageCount Value="7"/> </Unit7> <Unit8> <Filename Value="../units/mystringlistunit.pas"/> @@ -79,39 +80,39 @@ <TopLine Value="367"/> <CursorPos X="17" Y="390"/> <FoldState Value=" T3i3075 piZjD0WQ"/> - <UsageCount Value="9"/> + <UsageCount Value="8"/> </Unit8> <Unit9> <Filename Value="../epost/werteunit.pas"/> <EditorIndex Value="-1"/> <TopLine Value="950"/> <CursorPos X="30" Y="1054"/> - <UsageCount Value="6"/> + <UsageCount Value="5"/> </Unit9> <Unit10> <Filename Value="../epost/typenunit.pas"/> <EditorIndex Value="-1"/> <TopLine Value="347"/> <CursorPos X="62" Y="358"/> - <UsageCount Value="6"/> + <UsageCount Value="5"/> </Unit10> <Unit11> <Filename Value="../units/systemunit.pas"/> <EditorIndex Value="-1"/> <CursorPos X="3" Y="79"/> - <UsageCount Value="6"/> + <UsageCount Value="5"/> </Unit11> <Unit12> <Filename Value="/usr/lib/fpc/src/rtl/inc/objpash.inc"/> <EditorIndex Value="-1"/> <TopLine Value="232"/> <CursorPos X="23" Y="192"/> - <UsageCount Value="6"/> + <UsageCount Value="5"/> </Unit12> <Unit13> <Filename Value="rk14.inc"/> <EditorIndex Value="-1"/> - <UsageCount Value="9"/> + <UsageCount Value="8"/> </Unit13> <Unit14> <Filename Value="rk1210.inc"/> @@ -125,7 +126,7 @@ <EditorIndex Value="-1"/> <TopLine Value="945"/> <CursorPos X="5" Y="985"/> - <UsageCount Value="10"/> + <UsageCount Value="9"/> </Unit15> <Unit16> <Filename Value="rk108.inc"/> @@ -133,127 +134,132 @@ <CursorPos X="28" Y="8"/> <UsageCount Value="9"/> </Unit16> + <Unit17> + <Filename Value="rk3_8.inc"/> + <EditorIndex Value="-1"/> + <CursorPos X="75" Y="23"/> + <UsageCount Value="10"/> + </Unit17> </Units> <JumpHistory Count="30" HistoryIndex="29"> <Position1> <Filename Value="Physikunit.pas"/> - <Caret Line="89" Column="44" TopLine="68"/> + <Caret Line="341" Column="8" TopLine="320"/> </Position1> <Position2> <Filename Value="Physikunit.pas"/> - <Caret Line="130" Column="55" TopLine="97"/> + <Caret Line="1430" Column="42" TopLine="1419"/> </Position2> <Position3> <Filename Value="Physikunit.pas"/> - <Caret Line="162" Column="18" TopLine="129"/> + <Caret Line="648" Column="104" TopLine="619"/> </Position3> <Position4> - <Filename Value="Plasmapropagation.lpr"/> - <Caret Line="34" Column="37"/> + <Filename Value="Physikunit.pas"/> + <Caret Line="608" Column="52" TopLine="213"/> </Position4> <Position5> <Filename Value="Physikunit.pas"/> - <Caret Line="27" TopLine="8"/> + <Caret Line="977" Column="63" TopLine="953"/> </Position5> <Position6> <Filename Value="Physikunit.pas"/> - <Caret Line="565" TopLine="545"/> + <Caret Line="92" Column="38" TopLine="72"/> </Position6> <Position7> <Filename Value="Physikunit.pas"/> - <Caret Line="582" Column="36" TopLine="545"/> + <Caret Line="947" Column="12" TopLine="910"/> </Position7> <Position8> <Filename Value="Physikunit.pas"/> - <Caret Line="596" Column="51" TopLine="577"/> + <Caret Line="930" Column="64" TopLine="707"/> </Position8> <Position9> <Filename Value="Physikunit.pas"/> - <Caret Line="668" TopLine="668"/> + <Caret Line="166" Column="72" TopLine="145"/> </Position9> <Position10> <Filename Value="Physikunit.pas"/> - <Caret Line="740" TopLine="712"/> + <Caret Line="175" Column="60" TopLine="165"/> </Position10> <Position11> <Filename Value="Physikunit.pas"/> - <Caret Line="1026" Column="14" TopLine="1013"/> + <Caret Line="946" Column="84" TopLine="929"/> </Position11> <Position12> <Filename Value="Physikunit.pas"/> - <Caret Line="1475" TopLine="1029"/> + <Caret Line="945" Column="20" TopLine="909"/> </Position12> <Position13> <Filename Value="Physikunit.pas"/> - <Caret Line="1025" Column="31" TopLine="876"/> + <Caret Line="1423" Column="40" TopLine="1394"/> </Position13> <Position14> <Filename Value="Physikunit.pas"/> - <Caret Line="284" Column="24" TopLine="201"/> + <Caret Line="92" Column="38" TopLine="72"/> </Position14> <Position15> <Filename Value="Physikunit.pas"/> - <Caret Line="354" Column="32" TopLine="331"/> + <Caret Line="605" Column="46" TopLine="585"/> </Position15> <Position16> <Filename Value="Physikunit.pas"/> - <Caret Line="212" Column="81" TopLine="191"/> + <Caret Line="775" Column="39" TopLine="704"/> </Position16> <Position17> <Filename Value="Physikunit.pas"/> - <Caret Line="51" Column="71" TopLine="27"/> + <Caret Line="797" Column="38" TopLine="778"/> </Position17> <Position18> <Filename Value="Physikunit.pas"/> - <Caret Line="272" Column="51" TopLine="242"/> + <Caret Line="131" Column="35" TopLine="111"/> </Position18> <Position19> <Filename Value="Physikunit.pas"/> - <Caret Line="1276" Column="156" TopLine="1262"/> + <Caret Line="775" Column="39" TopLine="753"/> </Position19> <Position20> <Filename Value="Physikunit.pas"/> - <Caret Line="212" Column="66" TopLine="192"/> + <Caret Line="946" Column="38" TopLine="910"/> </Position20> <Position21> <Filename Value="Physikunit.pas"/> - <Caret Line="51" Column="60" TopLine="47"/> + <Caret Line="166" Column="25" TopLine="158"/> </Position21> <Position22> <Filename Value="Physikunit.pas"/> - <Caret Line="351" Column="20" TopLine="301"/> + <Caret Line="901" Column="17" TopLine="708"/> </Position22> <Position23> <Filename Value="Physikunit.pas"/> - <Caret Line="2"/> + <Caret Line="889" Column="18" TopLine="860"/> </Position23> <Position24> <Filename Value="Physikunit.pas"/> - <Caret Line="351" Column="73" TopLine="331"/> </Position24> <Position25> <Filename Value="Physikunit.pas"/> - <Caret Line="47" Column="29" TopLine="31"/> + <Caret Line="1423" Column="37" TopLine="1394"/> </Position25> <Position26> <Filename Value="Physikunit.pas"/> - <Caret Line="283" Column="21" TopLine="212"/> + <Caret TopLine="145"/> </Position26> <Position27> <Filename Value="Physikunit.pas"/> - <Caret Line="334" TopLine="212"/> + <Caret Line="1412" TopLine="774"/> </Position27> <Position28> <Filename Value="Physikunit.pas"/> - <Caret Line="1452" Column="31" TopLine="1420"/> + <Caret Line="175" Column="54" TopLine="161"/> </Position28> <Position29> <Filename Value="Physikunit.pas"/> - <Caret TopLine="178"/> + <Caret Line="946" Column="12" TopLine="774"/> </Position29> <Position30> <Filename Value="Physikunit.pas"/> - <Caret Line="1049" Column="41" TopLine="748"/> + <Caret Line="1424" Column="36" TopLine="988"/> </Position30> </JumpHistory> </ProjectSession> @@ -3,15 +3,15 @@ allgemein # runge-Kutta-14 # runge-Kutta-12 - runge-Kutta-10 -# runge-Kutta-3/8 +# runge-Kutta-10 + runge-Kutta-3/8 # runge-Kutta-4 # euler-Vorwärts ortsschritt 10^-3 * λ zeitschritt 10^-3 * T - minZeitschritt 10^-6 * T + minZeitschritt 10^-10 * T zeit 20 * T - diffusionsterm 1 # max. p/Lp + diffusionsterm 2 # max. p/Lp !setze $breite: (5 * λ) breite $breite mit Fortschrittsanzeige @@ -26,7 +26,7 @@ ausgabenEnde !setze $tFwhm: (2.5 * T) !setze $tMitte: (1 * T) -licht von links 0.1 * 2^(-2*((t-$tMitte)/$tFwhm)^2) * sin(ω*t) +licht von links 0.1 * ω * 2^(-2*((t-$tMitte)/$tFwhm)^2) * cos(ω*t) # Zeitableitung des A-Feldes teilchen1 spezifische Ladung -q/me @@ -3,9 +3,9 @@ felders[aktuelleFelder], 0.1 * dT ); - felders[2].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[2].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(2,mDT,dT,dTMin) then + if pruefeMaxDT(2,dTMax,dT,dTMin) then continue; felders[3].liKo( @@ -15,9 +15,9 @@ -0.91517656137529144052001501927534215431895138766436972056466 * dT, 1.45453440217827322805250021715664459117622483736537873607016 * dT ); - felders[3].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[3].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(3,mDT,dT,dTMin) then + if pruefeMaxDT(3,dTMax,dT,dTMin) then continue; felders[4].liKo( @@ -27,9 +27,9 @@ 0.202259190301118170324681949205488413821477543637878380814562 * dT, 0.606777570903354510974045847616465241464432630913635142443687 * dT ); - felders[4].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[4].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(4,mDT,dT,dTMin) then + if pruefeMaxDT(4,dTMax,dT,dTMin) then continue; felders[5].liKo( @@ -41,9 +41,9 @@ 0.197966831227192369068141770510388793370637287463360401555746 * dT, -0.0729547847313632629185146671595558023015011608914382961421311 * dT ); - felders[5].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[5].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(5,mDT,dT,dTMin) then + if pruefeMaxDT(5,dTMax,dT,dTMin) then continue; felders[6].liKo( @@ -55,9 +55,9 @@ 0.410459702520260645318174895920453426088035325902848695210406 * dT, 0.482713753678866489204726942976896106809132737721421333413261 * dT ); - felders[6].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[6].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(6,mDT,dT,dTMin) then + if pruefeMaxDT(6,dTMax,dT,dTMin) then continue; felders[7].liKo( @@ -71,9 +71,9 @@ 0.48966295730945019284450701113589820117801547843379009721079 * dT, -0.0731856375070850736789057580558988816340355615025188195854775 * dT ); - felders[7].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[7].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(7,mDT,dT,dTMin) then + if pruefeMaxDT(7,dTMax,dT,dTMin) then continue; felders[8].liKo( @@ -87,9 +87,9 @@ 0.0325402621549091330158899334391231259332716675992700000776101 * dT, -0.0595780211817361001560122202563305121444953672762930724538856 * dT ); - felders[8].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[8].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(8,mDT,dT,dTMin) then + if pruefeMaxDT(8,dTMax,dT,dTMin) then continue; felders[9].liKo( @@ -103,9 +103,9 @@ 0.32176370560177839010089879904987890408140436860307712925111 * dT, 0.51048572560806303157775901228512341674467213703175235406759 * dT ); - felders[9].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[9].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(9,mDT,dT,dTMin) then + if pruefeMaxDT(9,dTMax,dT,dTMin) then continue; felders[10].liKo( @@ -121,9 +121,9 @@ 0.499269229556880061353316843969978567860276816592673201240332 * dT, 0.50950460892968610423609869004538625398664323235298960218506 * dT ); - felders[10].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[10].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(10,mDT,dT,dTMin) then + if pruefeMaxDT(10,dTMax,dT,dTMin) then continue; felders[11].liKo( @@ -141,9 +141,9 @@ 0.0107558956873607455550609147441477450257136782823280838547024 * dT, -0.327769124164018874147061087350233395378262992392394071906457 * dT ); - felders[11].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[11].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(11,mDT,dT,dTMin) then + if pruefeMaxDT(11,dTMax,dT,dTMin) then continue; felders[12].liKo( @@ -163,9 +163,9 @@ -0.0782942710351670777553986729725692447252077047239160551335016 * dT, -0.114503299361098912184303164290554670970133218405658122674674 * dT ); - felders[12].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[12].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(12,mDT,dT,dTMin) then + if pruefeMaxDT(12,dTMax,dT,dTMin) then continue; felders[13].liKo( @@ -191,9 +191,9 @@ -3.25479342483643918654589367587788726747711504674780680269911 * dT, -2.16343541686422982353954211300054820889678036420109999154887 * dT ); - felders[13].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[13].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(13,mDT,dT,dTMin) then + if pruefeMaxDT(13,dTMax,dT,dTMin) then continue; felders[14].liKo( @@ -221,9 +221,9 @@ -1.71561608285936264922031819751349098912615880827551992973034 * dT, -0.0244036405750127452135415444412216875465593598370910566069132 * dT ); - felders[14].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[14].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(14,mDT,dT,dTMin) then + if pruefeMaxDT(14,dTMax,dT,dTMin) then continue; felders[15].liKo( @@ -241,9 +241,9 @@ 0.0910895662155176069593203555807484200111889091770101799647985 * dT, 0.777333643644968233538931228575302137803351053629547286334469 * dT ); - felders[15].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[15].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(15,mDT,dT,dTMin) then + if pruefeMaxDT(15,dTMax,dT,dTMin) then continue; felders[16].liKo( @@ -255,9 +255,9 @@ -0.157178665799771163367058998273128921867183754126709419409654 * dT, 0.157178665799771163367058998273128921867183754126709419409654 * dT ); - felders[16].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[16].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(16,mDT,dT,dTMin) then + if pruefeMaxDT(16,dTMax,dT,dTMin) then continue; felders[17].liKo( @@ -293,9 +293,9 @@ -0.34275815984718983994222055341385087174233873470395891993726 * dT, -0.675 * dT ); - felders[17].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[17].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(17,mDT,dT,dTMin) then + if pruefeMaxDT(17,dTMax,dT,dTMin) then continue; felders[1-aktuelleFelder].liKo( @@ -3,9 +3,9 @@ felders[aktuelleFelder], 0.2 * dT ); - felders[2].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[2].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(2,mDT,dT,dTMin) then + if pruefeMaxDT(2,dTMax,dT,dTMin) then continue; felders[3].liKo( @@ -15,9 +15,9 @@ -0.216049382716049382716049382716049382716049382716049382716049 * dT, 0.771604938271604938271604938271604938271604938271604938271605 * dT ); - felders[3].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[3].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(3,mDT,dT,dTMin) then + if pruefeMaxDT(3,dTMax,dT,dTMin) then continue; felders[4].liKo( @@ -27,9 +27,9 @@ 0.208333333333333333333333333333333333333333333333333333333333 * dT, 0.625 * dT ); - felders[4].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[4].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(4,mDT,dT,dTMin) then + if pruefeMaxDT(4,dTMax,dT,dTMin) then continue; felders[5].liKo( @@ -41,9 +41,9 @@ 0.22 * dT, -0.08 * dT ); - felders[5].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[5].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(5,mDT,dT,dTMin) then + if pruefeMaxDT(5,dTMax,dT,dTMin) then continue; felders[6].liKo( @@ -55,9 +55,9 @@ 0.4 * dT, 0.5 * dT ); - felders[6].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[6].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(6,mDT,dT,dTMin) then + if pruefeMaxDT(6,dTMax,dT,dTMin) then continue; felders[7].liKo( @@ -71,9 +71,9 @@ 0.48317116756103289928883648045196250872410925751728917730238 * dT, -0.038753024569476325208568144376762058039573330234136803880429 * dT ); - felders[7].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[7].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(7,mDT,dT,dTMin) then + if pruefeMaxDT(7,dTMax,dT,dTMin) then continue; felders[8].liKo( @@ -87,9 +87,9 @@ 0.0137455792075966759812907801835048190594443990939408530842918 * dT, -0.0661095317267682844455831341498149531672668252085016565917546 * dT ); - felders[8].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[8].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(8,mDT,dT,dTMin) then + if pruefeMaxDT(8,dTMax,dT,dTMin) then continue; felders[9].liKo( @@ -103,9 +103,9 @@ 0.0680716801688453518578515120895103863112751730758794372203952 * dT, 0.408394315582641046727306852653894780093303185664924644551239 * dT ); - felders[9].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[9].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(9,mDT,dT,dTMin) then + if pruefeMaxDT(9,dTMax,dT,dTMin) then continue; felders[10].liKo( @@ -121,9 +121,9 @@ 0.427930210752576611068192608300897981558240730580396406312359 * dT, -0.0865117637557827005740277475955029103267246394128995965941585 * dT ); - felders[10].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[10].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(10,mDT,dT,dTMin) then + if pruefeMaxDT(10,dTMax,dT,dTMin) then continue; felders[11].liKo( @@ -141,9 +141,9 @@ -0.951294772321088980532340837388859453930924498799228648050949 * dT, -0.408276642965631951497484981519757463459627174520978426909934 * dT ); - felders[11].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[11].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(11,mDT,dT,dTMin) then + if pruefeMaxDT(11,dTMax,dT,dTMin) then continue; felders[12].liKo( @@ -163,9 +163,9 @@ 0.00263265981064536974369934736325334761174975280887405725010964 * dT, 0.00315472768977025060103545855572111407955208306374459723959783 * dT ); - felders[12].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[12].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(12,mDT,dT,dTMin) then + if pruefeMaxDT(12,dTMax,dT,dTMin) then continue; felders[13].liKo( @@ -181,9 +181,9 @@ 0.0000176358982260285155407485928953302139937553442829975734148981 * dT, 0.0653866627415027051009595231385181033549511358787382098351924 * dT ); - felders[13].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[13].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(13,mDT,dT,dTMin) then + if pruefeMaxDT(13,dTMax,dT,dTMin) then continue; felders[14].liKo( @@ -201,9 +201,9 @@ -0.861264460105717678161432562258351242030270498966891201799225 * dT, 0.908651882074050281096239478469262145034957129939256789178785 * dT ); - felders[14].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[14].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(14,mDT,dT,dTMin) then + if pruefeMaxDT(14,dTMax,dT,dTMin) then continue; felders[15].liKo( @@ -223,9 +223,9 @@ 0.00535364695524996055083260173615567408717110247274021056118319 * dT, 0.301167864010967916837091303817051676920059229784957479998077 * dT ); - felders[15].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[15].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(15,mDT,dT,dTMin) then + if pruefeMaxDT(15,dTMax,dT,dTMin) then continue; felders[16].liKo( @@ -247,9 +247,9 @@ -0.214007467967990254219503540827349569639028092344812795499026 * dT, 0.958202417754430239892724139109781371059908874605153648768037 * dT ); - felders[16].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[16].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(16,mDT,dT,dTMin) then + if pruefeMaxDT(16,dTMax,dT,dTMin) then continue; felders[17].liKo( @@ -273,9 +273,9 @@ -1.10683733362380649395704708016953056176195769617014899442903 * dT, -0.929529037579203999778397238291233214220788057511899747507074 * dT ); - felders[17].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[17].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(17,mDT,dT,dTMin) then + if pruefeMaxDT(17,dTMax,dT,dTMin) then continue; felders[18].liKo( @@ -307,9 +307,9 @@ -1.94300935242819610883833776782364287728724899124166920477873 * dT, -0.128352601849404542018428714319344620742146491335612353559923 * dT ); - felders[18].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[18].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(18,mDT,dT,dTMin) then + if pruefeMaxDT(18,dTMax,dT,dTMin) then continue; felders[19].liKo( @@ -343,9 +343,9 @@ -0.00115618834794939500490703608435907610059605754935305582045729 * dT, -0.00544057908677007389319819914241631024660726585015012485938593 * dT ); - felders[19].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[19].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(19,mDT,dT,dTMin) then + if pruefeMaxDT(19,dTMax,dT,dTMin) then continue; felders[20].liKo( @@ -381,9 +381,9 @@ 0.0418603916412360287969841020776788461794119440689356178942252 * dT, 0.279084255090877355915660874555379649966282167560126269290222 * dT ); - felders[20].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[20].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(20,mDT,dT,dTMin) then + if pruefeMaxDT(20,dTMax,dT,dTMin) then continue; felders[21].liKo( @@ -409,9 +409,9 @@ 0.218636633721676647685111485017151199362509373698288330593486 * dT, 0.438313820361122420391059788940960176420682836652600698580091 * dT ); - felders[21].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[21].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(21,mDT,dT,dTMin) then + if pruefeMaxDT(21,dTMax,dT,dTMin) then continue; felders[22].liKo( @@ -439,9 +439,9 @@ 0.196410889223054653446526504390100417677539095340135532418849 * dT, -0.0984256130499315928152900286856048243348202521491288575952143 * dT ); - felders[22].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[22].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(22,mDT,dT,dTMin) then + if pruefeMaxDT(22,dTMax,dT,dTMin) then continue; felders[23].liKo( @@ -459,9 +459,9 @@ 0.390696469295978451446999802258495981249099665294395945559163 * dT, 0.666666666666666666666666666666666666666666666666666666666667 * dT ); - felders[23].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[23].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(23,mDT,dT,dTMin) then + if pruefeMaxDT(23,dTMax,dT,dTMin) then continue; felders[24].liKo( @@ -473,9 +473,9 @@ -0.164609053497942386831275720164609053497942386831275720164609 * dT, 0.164609053497942386831275720164609053497942386831275720164609 * dT ); - felders[24].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[24].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(24,mDT,dT,dTMin) then + if pruefeMaxDT(24,dTMax,dT,dTMin) then continue; felders[25].liKo( @@ -525,9 +525,9 @@ -0.421296296296296296296296296296296296296296296296296296296296 * dT, -0.7875 * dT ); - felders[25].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[25].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(25,mDT,dT,dTMin) then + if pruefeMaxDT(25,dTMax,dT,dTMin) then continue; felders[1-aktuelleFelder].liKo( @@ -3,9 +3,9 @@ felders[aktuelleFelder], 0.111111111111111111111111111111111111111111111111111111111111 * dT ); - felders[2].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[2].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(2,mDT,dT,dTMin) then + if pruefeMaxDT(2,dTMax,dT,dTMin) then continue; felders[3].liKo( @@ -15,9 +15,9 @@ -0.833333333333333333333333333333333333333333333333333333333333 * dT, 1.38888888888888888888888888888888888888888888888888888888889 * dT ); - felders[3].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[3].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(3,mDT,dT,dTMin) then + if pruefeMaxDT(3,dTMax,dT,dTMin) then continue; felders[4].liKo( @@ -27,9 +27,9 @@ 0.208333333333333333333333333333333333333333333333333333333333 * dT, 0.625 * dT ); - felders[4].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[4].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(4,mDT,dT,dTMin) then + if pruefeMaxDT(4,dTMax,dT,dTMin) then continue; felders[5].liKo( @@ -41,9 +41,9 @@ 0.22 * dT, -0.08 * dT ); - felders[5].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[5].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(5,mDT,dT,dTMin) then + if pruefeMaxDT(5,dTMax,dT,dTMin) then continue; felders[6].liKo( @@ -55,9 +55,9 @@ 0.4 * dT, 0.5 * dT ); - felders[6].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[6].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(6,mDT,dT,dTMin) then + if pruefeMaxDT(6,dTMax,dT,dTMin) then continue; felders[7].liKo( @@ -71,9 +71,9 @@ 0.482574490331246622475134780125688112865919023850168049679402 * dT, -0.038140960001560699973088624000562020566411307247841147742197 * dT ); - felders[7].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[7].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(7,mDT,dT,dTMin) then + if pruefeMaxDT(7,dTMax,dT,dTMin) then continue; felders[8].liKo( @@ -87,9 +87,9 @@ 0.0137885887618080880607695837016477814530969417491493385363543 * dT, -0.06722101339966844497493995074143058569500863415253821828562 * dT ); - felders[8].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[8].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(8,mDT,dT,dTMin) then + if pruefeMaxDT(8,dTMax,dT,dTMin) then continue; felders[9].liKo( @@ -103,9 +103,9 @@ 0.216019825625503063708860097659866573490979433278117320188668 * dT, 0.423695063515761937337619073960976753205867469544123532683116 * dT ); - felders[9].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[9].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(9,mDT,dT,dTMin) then + if pruefeMaxDT(9,dTMax,dT,dTMin) then continue; felders[10].liKo( @@ -121,9 +121,9 @@ 0.0978080858367729012259313014081291665503740655476733940756599 * dT, 0.217590689243420631360008651767860318344168120024782176879989 * dT ); - felders[10].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[10].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(10,mDT,dT,dTMin) then + if pruefeMaxDT(10,dTMax,dT,dTMin) then continue; felders[11].liKo( @@ -141,9 +141,9 @@ -0.247656877593994914689992276329810825853958069263947095548189 * dT, 0.110895029771437682893999851839061714522445173600678718208625 * dT ); - felders[11].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[11].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(11,mDT,dT,dTMin) then + if pruefeMaxDT(11,dTMax,dT,dTMin) then continue; felders[12].liKo( @@ -163,9 +163,9 @@ 0.204890423831599428189499202098105603312029235081420653574829 * dT, -1.56261579627468188307070943950527825211462892236424360892806 * dT ); - felders[12].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[12].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(12,mDT,dT,dTMin) then + if pruefeMaxDT(12,dTMax,dT,dTMin) then continue; felders[13].liKo( @@ -181,9 +181,9 @@ -0.00805328367804983036823857162048902911923392887337029314844206 * dT, 0.0211517528067396521915711903523399601316877825157550573051221 * dT ); - felders[13].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[13].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(13,mDT,dT,dTMin) then + if pruefeMaxDT(13,dTMax,dT,dTMin) then continue; felders[14].liKo( @@ -201,9 +201,9 @@ 0.00988442549447664668946335414487885256040819982786014648129297 * dT, -0.0213010771328887351384307642875927384886634565429572466632092 * dT ); - felders[14].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[14].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(14,mDT,dT,dTMin) then + if pruefeMaxDT(14,dTMax,dT,dTMin) then continue; felders[15].liKo( @@ -223,9 +223,9 @@ -0.977235005036766810872264852372525633013107656892839677696022 * dT, -0.660026980479294694616225013856327693720573981219974874776419 * dT ); - felders[15].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[15].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(15,mDT,dT,dTMin) then + if pruefeMaxDT(15,dTMax,dT,dTMin) then continue; felders[16].liKo( @@ -247,9 +247,9 @@ 0.124343093331358243286225595741786448038973408895106741855721 * dT, 0.00413829693239480694403512496204335960426192908674476033832967 * dT ); - felders[16].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[16].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(16,mDT,dT,dTMin) then + if pruefeMaxDT(16,dTMax,dT,dTMin) then continue; felders[17].liKo( @@ -273,9 +273,9 @@ 0.251708904586819292210480529948970541404887852931447491219418 * dT, 0.779906470345586398810756795282334476023540593411550187024263 * dT ); - felders[17].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[17].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(17,mDT,dT,dTMin) then + if pruefeMaxDT(17,dTMax,dT,dTMin) then continue; felders[18].liKo( @@ -293,9 +293,9 @@ 0.000591726029494171190528755742777717259844340971924321528178248 * dT, -4.01614722154557337064691684906375587732264247950093804676867E-7 * dT ); - felders[18].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[18].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(18,mDT,dT,dTMin) then + if pruefeMaxDT(18,dTMax,dT,dTMin) then continue; felders[19].liKo( @@ -315,9 +315,9 @@ -2.04486480935804242706707569691004307904442837552677456232848E-6 * dT, 0.105328578824431893399799402979093997354240904235172843146582 * dT ); - felders[19].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[19].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(19,mDT,dT,dTMin) then + if pruefeMaxDT(19,dTMax,dT,dTMin) then continue; felders[20].liKo( @@ -339,9 +339,9 @@ 7.64130548038698765563029310880237651185173367813936997648198 * dT, 3.50602043659751834989896082949744710968212949893375368243588 * dT ); - felders[20].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[20].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(20,mDT,dT,dTMin) then + if pruefeMaxDT(20,dTMax,dT,dTMin) then continue; felders[21].liKo( @@ -365,9 +365,9 @@ -3.64411637921569236846406990361350645806721478409266709351203 * dT, -0.804503249910509910899030787958579499315694913210787878260459 * dT ); - felders[21].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[21].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(21,mDT,dT,dTMin) then + if pruefeMaxDT(21,dTMax,dT,dTMin) then continue; felders[22].liKo( @@ -393,9 +393,9 @@ 13.1939710030282333443670964371153238435064159623744975073252 * dT, 1.25128781283980445450114974148056006317268830077396406361417 * dT ); - felders[22].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[22].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(22,mDT,dT,dTMin) then + if pruefeMaxDT(22,dTMax,dT,dTMin) then continue; felders[23].liKo( @@ -423,9 +423,9 @@ 0.422422733996325326010225127471388772575086538809603346825334 * dT, 0.0859131249503067107308438031499859443441115056294154956487671 * dT ); - felders[23].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[23].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(23,mDT,dT,dTMin) then + if pruefeMaxDT(23,dTMax,dT,dTMin) then continue; felders[24].liKo( @@ -463,9 +463,9 @@ 0.0210134706331264177317735424331396407424412188443757490871603 * dT, 0.00952196014417121794175101542454575907376360233658356240547761 * dT ); - felders[24].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[24].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(24,mDT,dT,dTMin) then + if pruefeMaxDT(24,dTMax,dT,dTMin) then continue; felders[25].liKo( @@ -505,9 +505,9 @@ -0.0870718339841810522431884137957986245724252047388936572215438 * dT, -7.39351814158303067567016952195521063999185773249132944724553 * dT ); - felders[25].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[25].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(25,mDT,dT,dTMin) then + if pruefeMaxDT(25,dTMax,dT,dTMin) then continue; felders[26].liKo( @@ -549,9 +549,9 @@ 4.79282506449930799649797749629840189457296934139359048988332 * dT, 0.153725464873068577844576387402512082757034273069877432944621 * dT ); - felders[26].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[26].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(26,mDT,dT,dTMin) then + if pruefeMaxDT(26,dTMax,dT,dTMin) then continue; felders[27].liKo( @@ -599,9 +599,9 @@ -1.35548714715078654978732186705996404017554501614191325114947 * dT, -1.57196275801232751882901735171459249177687219114442583461866 * dT ); - felders[27].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[27].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(27,mDT,dT,dTMin) then + if pruefeMaxDT(27,dTMax,dT,dTMin) then continue; felders[28].liKo( @@ -651,9 +651,9 @@ 1.6267482744706653746298936492962893398812502928418368027902 * dT, 0.491719043846229147070666628704194097678081907210673044988866 * dT ); - felders[28].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[28].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(28,mDT,dT,dTMin) then + if pruefeMaxDT(28,dTMax,dT,dTMin) then continue; felders[29].liKo( @@ -689,9 +689,9 @@ -0.0439870229715046685058790092341545026046103890294261359042581 * dT, -0.13758560676332522486565963219678774664744722297508486597544 * dT ); - felders[29].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[29].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(29,mDT,dT,dTMin) then + if pruefeMaxDT(29,dTMax,dT,dTMin) then continue; felders[30].liKo( @@ -729,9 +729,9 @@ 1.96337522866858908928262850028093813988180440518267404553576 * dT, 0.856238975085428354755349769879501772112121597411563802855067 * dT ); - felders[30].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[30].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(30,mDT,dT,dTMin) then + if pruefeMaxDT(30,dTMax,dT,dTMin) then continue; felders[31].liKo( @@ -769,9 +769,9 @@ 0.711915811585189227887648262043794387578291882406745570495765 * dT, 0.550499525310802324138388507020508177411414311000037561712836 * dT ); - felders[31].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[31].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(31,mDT,dT,dTMin) then + if pruefeMaxDT(31,dTMax,dT,dTMin) then continue; felders[32].liKo( @@ -811,9 +811,9 @@ 0.254297048076270161384068506997153122141835626976703920846242 * dT, -0.109993425580724703919462404865068340845119058295846426463652 * dT ); - felders[32].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[32].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(32,mDT,dT,dTMin) then + if pruefeMaxDT(32,dTMax,dT,dTMin) then continue; felders[33].liKo( @@ -831,9 +831,9 @@ 0.492529543718026304422682049114021320200214681580657784719074 * dT, 0.75 * dT ); - felders[33].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[33].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(33,mDT,dT,dTMin) then + if pruefeMaxDT(33,dTMax,dT,dTMin) then continue; felders[34].liKo( @@ -845,9 +845,9 @@ -0.222222222222222222222222222222222222222222222222222222222222 * dT, 0.222222222222222222222222222222222222222222222222222222222222 * dT ); - felders[34].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[34].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(34,mDT,dT,dTMin) then + if pruefeMaxDT(34,dTMax,dT,dTMin) then continue; felders[35].liKo( @@ -915,9 +915,9 @@ -0.21875 * dT, -0.291666666666666666666666666666666666666666666666666666666667 * dT ); - felders[35].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax); + felders[35].berechneAbleitungen(dX,iDX,pDNMax); - if pruefeMaxDT(35,mDT,dT,dTMin) then + if pruefeMaxDT(35,dTMax,dT,dTMin) then continue; felders[1-aktuelleFelder].liKo( diff --git a/rk3_8.inc b/rk3_8.inc new file mode 100644 index 0000000..3419dab --- /dev/null +++ b/rk3_8.inc @@ -0,0 +1,47 @@ + felders[2].liKo( + felders[aktuelleFelder], + felders[aktuelleFelder], + 1/3 * dT + ); + felders[2].berechneAbleitungen(dX,iDX,pDNMax); + + if pruefeMaxDT(2,dTMax,dT,dTMin) then + continue; + + felders[3].liKo( + felders[aktuelleFelder], + felders[aktuelleFelder], + felders[2], + -1/3 * dT, + 1 * dT + ); + felders[3].berechneAbleitungen(dX,iDX,pDNMax); + + if pruefeMaxDT(3,dTMax,dT,dTMin) then + continue; + + felders[4].liKo( + felders[aktuelleFelder], + felders[aktuelleFelder], + felders[2], + felders[3], + 1 * dT, + -1 * dT, + 1 * dT + ); + felders[4].berechneAbleitungen(dX,iDX,pDNMax); + + if pruefeMaxDT(4,dTMax,dT,dTMin) then + continue; + + felders[1-aktuelleFelder].liKo( + felders[aktuelleFelder], + felders[aktuelleFelder], + felders[2], + felders[3], + felders[4], + 1/8 * dT, + 3/8 * dT, + 3/8 * dT, + 1/8 * dT + ); diff --git a/rk3_8.txt b/rk3_8.txt new file mode 100644 index 0000000..cc1ec70 --- /dev/null +++ b/rk3_8.txt @@ -0,0 +1,30 @@ + THE COEFFICIENTS OF RK4 + using the notation of Fehlberg, Bettis, Horn, et alia + + + k a[k] + + 0 0 + 1 1/3 + 2 2/3 + 3 1 + + + k c[k] + + 0 1/8 + 1 3/8 + 2 3/8 + 3 1/8 + + + k j ß[k,j] + + 1 0 1/3 + 2 0 -1/3 + 2 1 1 + 3 0 1 + 3 1 -1 + 3 2 1 + + @@ -0,0 +1,41 @@ + felders[2].liKo( + felders[aktuelleFelder], + felders[aktuelleFelder], + 0.5 * dT + ); + felders[2].berechneAbleitungen(dX,iDX,pDNMax); + + if pruefeMaxDT(2,dTMax,dT,dTMin) then + continue; + + felders[3].liKo( + felders[aktuelleFelder], + felders[2], + 0.5 * dT + ); + felders[3].berechneAbleitungen(dX,iDX,pDNMax); + + if pruefeMaxDT(3,dTMax,dT,dTMin) then + continue; + + felders[4].liKo( + felders[aktuelleFelder], + felders[3], + 1 * dT + ); + felders[4].berechneAbleitungen(dX,iDX,pDNMax); + + if pruefeMaxDT(4,dTMax,dT,dTMin) then + continue; + + felders[1-aktuelleFelder].liKo( + felders[aktuelleFelder], + felders[aktuelleFelder], + felders[2], + felders[3], + felders[4], + 1/6 * dT, + 1/3 * dT, + 1/3 * dT, + 1/6 * dT + ); @@ -0,0 +1,30 @@ + THE COEFFICIENTS OF RK4 + using the notation of Fehlberg, Bettis, Horn, et alia + + + k a[k] + + 0 0 + 1 0.5 + 2 0.5 + 3 1 + + + k c[k] + + 0 1/6 + 1 1/3 + 2 1/3 + 3 1/6 + + + k j ß[k,j] + + 1 0 0.5 + 2 0 0 + 2 1 0.5 + 3 0 0 + 3 1 0 + 3 2 1 + + @@ -4,7 +4,7 @@ for inputFile in $* do outputFile="$(echo ${inputFile} | sed "s/\.txt$/.inc/")" - lines=$(grep --text "^ *[0-9]\+ \+[0-9]\+ \+[-0-9.^*]\+.$" ${inputFile} | sed "s/^ \+//" | sed "s/[^0-9]$//" | grep -v "^[0-9]\+ \+[0-9]\+ \+0\(\.0\+\)\?$" | sed "s/0\+$//" | awk '{print $1+1" "$2+1" "$3}') + lines=$(grep --text "^ *[0-9]\+ \+[0-9]\+ \+[-0-9.^*/]\+.\?$" ${inputFile} | sed "s/^ \+//" | sed "s/[^0-9]$//" | grep -v "^[0-9]\+ \+[0-9]\+ \+0\(\.0\+\)\?$" | sed "s/0\+$//" | awk '{print $1+1" "$2+1" "$3}') [ -e ${outputFile} ] && rm ${outputFile} touch ${outputFile} @@ -12,22 +12,22 @@ do for i in $(echo -ne "${lines}" | cut -d " " -f 1 | sort -nu) do echo -ne " felders[${i}].liKo(\n felders[aktuelleFelder]" >> ${outputFile} - echo -ne "${lines}" | grep "^${i} \+" | sed "s/^[0-9]\+ \+\([0-9]\+\) \+[-0-9.*^]\+$/,\n felders[\1]/" | tr "\n" ";" | sed "s/;,/,/g" | sed "s/;$//" | tr ";" "\n" | sed "s/felders\[1\]/felders[aktuelleFelder]/g" >> ${outputFile} - echo -ne "${lines}" | grep "^${i} \+" | sed "s/^[0-9]\+ \+[0-9]\+ \+\([-0-9.*^]\+\)$/,\n \1 * dT/" | tr "\n" ";" | sed "s/,;/,\n/g" | sed "s/;,/,/g" | tr ";" " " | sed "s/ $//" | sed "s/\*10^/E/g" >> ${outputFile} + echo -ne "${lines}" | grep "^${i} \+" | sed "s/^[0-9]\+ \+\([0-9]\+\) \+[-0-9.*^/]\+$/,\n felders[\1]/" | tr "\n" ";" | sed "s/;,/,/g" | sed "s/;$//" | tr ";" "\n" | sed "s/felders\[1\]/felders[aktuelleFelder]/g" >> ${outputFile} + echo -ne "${lines}" | grep "^${i} \+" | sed "s/^[0-9]\+ \+[0-9]\+ \+\([-0-9.*^/]\+\)$/,\n \1 * dT/" | tr "\n" ";" | sed "s/,;/,\n/g" | sed "s/;,/,/g" | tr ";" " " | sed "s/ $//" | sed "s/\*10^/E/g" >> ${outputFile} echo -e "\n );" >> ${outputFile} - echo " felders[${i}].berechneAbleitungen(dT/2,dX,iDT,iDX,pDNMax);" >> ${outputFile} + echo " felders[${i}].berechneAbleitungen(dX,iDX,pDNMax);" >> ${outputFile} echo >> ${outputFile} - echo " if pruefeMaxDT(${i},mDT,dT,dTMin) then" >> ${outputFile} + echo " if pruefeMaxDT(${i},dTMax,dT,dTMin) then" >> ${outputFile} echo " continue;" >> ${outputFile} echo >> ${outputFile} done - rest=$[$(wc -l ${inputFile} | cut -d " " -f 1)-$(grep --text -n "^ *k\s\+c\[k].$" ${inputFile} | cut -d ":" -f 1)] - lines=$(tail -n${rest} ${inputFile} | sed "s/^ \+//" | sed "s/[^0-9]$//" | grep --text "^[0-9]\+ \+[-0-9.^*]\+$" | grep -v "^[0-9]\+ \+0\(\.0\+\)\?$" | sed "s/0\+$//" | awk '{print $1+1" "$2}') + rest=$[$(wc -l ${inputFile} | cut -d " " -f 1)-$(grep --text -n "^ *k\s\+c\[k].\?$" ${inputFile} | cut -d ":" -f 1)] + lines=$(tail -n${rest} ${inputFile} | sed "s/^ \+//" | sed "s/[^0-9]$//" | grep --text "^[0-9]\+ \+[-0-9.^*/]\+$" | grep -v "^[0-9]\+ \+0\(\.0\+\)\?$" | sed "s/0\+$//" | awk '{print $1+1" "$2}') echo -e " felders[1-aktuelleFelder].liKo(\n felders[aktuelleFelder]," >> ${outputFile} - echo -e "${lines}" | sed "s/^\([0-9]\+\) \+[-0-9.*^]\+$/ felders[\1],/" | sed "s/felders\[1\]/felders[aktuelleFelder]/g" >> ${outputFile} - echo -ne "${lines}" | sed "s/^[0-9]\+ \+\([-0-9.*^]\+\)$/ \1 * dT,/" | tr "\n" "," | sed "s/\([^,]\),$/\1\n );\n/" | sed "s/,,/,\n/g" | sed "s/\*10^/E/g" >> ${outputFile} + echo -e "${lines}" | sed "s/^\([0-9]\+\) \+[-0-9.*^/]\+$/ felders[\1],/" | sed "s/felders\[1\]/felders[aktuelleFelder]/g" >> ${outputFile} + echo -ne "${lines}" | sed "s/^[0-9]\+ \+\([-0-9.*^/]\+\)$/ \1 * dT,/" | tr "\n" "," | sed "s/\([^,]\),$/\1\n );\n/" | sed "s/,,/,\n/g" | sed "s/\*10^/E/g" >> ${outputFile} done |