diff options
author | Erich Eckner <git@eckner.net> | 2015-08-07 16:52:05 +0200 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2015-08-07 16:52:05 +0200 |
commit | 6e9ff86a556e5afc555d1580a70ecbf5f301c987 (patch) | |
tree | e37e2048e9df2303ae7bdfced320e3e359f0a991 | |
parent | 313dc9c91ed794336898054a8e0d328e09875359 (diff) | |
download | Plasmapropagation-6e9ff86a556e5afc555d1580a70ecbf5f301c987.tar.xz |
auf Vlasov-Gleichungen umgeschrieben,
braucht viel zu viel Speicher, da 3D im Impuls
-rw-r--r-- | Physikunit.pas | 1135 | ||||
-rw-r--r-- | Plasmapropagation.lpi | 6 | ||||
-rw-r--r-- | Plasmapropagation.lps | 144 | ||||
-rw-r--r-- | input.plap | 10 | ||||
-rw-r--r-- | linearkombination.inc | 247 | ||||
-rw-r--r-- | linearkombinationen.inc | 129 | ||||
-rw-r--r-- | rk108.inc | 64 | ||||
-rw-r--r-- | rk1210.inc | 96 | ||||
-rw-r--r-- | rk1412.inc | 136 | ||||
-rw-r--r-- | rk3_8.inc | 12 | ||||
-rw-r--r-- | rk4.inc | 12 | ||||
-rwxr-xr-x | rktopas | 6 |
12 files changed, 1030 insertions, 967 deletions
diff --git a/Physikunit.pas b/Physikunit.pas index 85b6508..491c186 100644 --- a/Physikunit.pas +++ b/Physikunit.pas @@ -18,27 +18,25 @@ uses type tZeitverfahren = (zfEulerVorwaerts,zfRungeKuttaDreiAchtel,zfRungeKuttaVier,zfRungeKuttaZehn,zfRungeKuttaZwoelf,zfRungeKuttaVierzehn); tVerteilungsfunktion = function(x: extended): extended; - tEMFeldInhalt = ( - efA,efAX,efAY,efAZ, + tEMFeldGroesze = ( + efAX,efAY,efAZ, efDAXDT,efDAYDT,efDAZDT, - efDPhiDX + efEX,efBY,efBZ ); - tMaterieFeldInhalt = ( - mfN,mfDPsiDX, // Teilchendichte, Geschwindigkeitsdichte - mfP,mfPX,mfPY,mfPZ, // Impuls - mfGamma,mfIGamma // rel. Gamma-Faktor + tEMQuellGroesze = ( + eqRho,eqJX,eqJY,eqJZ ); + tEMQuellen = array[tEMQuellGroesze] of extended; const erstesEMFMitAbleitung = efAX; letztesEMFMitAbleitung = efDAZDT; - erstesMatFMitAbleitung = mfN; - letztesMatFMitAbleitung = mfDPsiDX; type - tGitter = class; + tRaumPunkt = class; tFelder = class; + tGitter = class; tSimulation = class; { tAusgabeDatei } @@ -46,9 +44,10 @@ type tAusgabeDatei = class private ableitung: boolean; - emInhalt: tEMFeldInhalt; - matInhalt: tMaterieFeldInhalt; - teilchen,nNum,tCnt: longint; // wenn teilchen < 0, dann EM-Feld + emFelder: tEMFeldGroesze; + emQuellen: tEMQuellGroesze; + teilchen, // -2: EM-Feld; -1: Gesamt-EM-Quelle; sonst: EM-Quelle der entsprechenden Teilchen + nNum,tCnt: longint; pre,suf: string; datei: file; pro: tProtokollant; @@ -81,50 +80,60 @@ type procedure liesDichteFunktion(rest: string; ifile: tMyStringList; kvs: tKnownValues; teilchen: array of tTeilchenSpezies; prot: tProtokollant); end; - { tWertePunkt } + { tImpulsPunkt } - tWertePunkt = class(tObject) // repräsentiert alle Werte eines Punktes im Gitter und deren Zeitableitungen + tImpulsPunkt = class(tObject) // Besetzungsdichten verschiedener Teilchenspezies für ein Paar (r;p) private - besitzer: tFelder; + raumpunkt: tRaumPunkt; + nachbarn: array[0..3,boolean] of tImpulsPunkt; // x-, px-, py-, pz-Nachbarn (jeweil in Richtung - und +) public - matWerte: array of array[tMaterieFeldInhalt,boolean] of extended; - // Materiefelder (getrennt für verschiedene Teilchenspezies) und deren Zeitableitungen - emWerte: array[tEMFeldInhalt,boolean] of extended; - // EM-Felder und deren Zeitableitungen - // A, dPhiDX, p[xyz]? und i?Gamma haben keine sinnvolle Ableitung hier! - lN,rN: tWertePunkt; + werte: array of array[boolean] of extended; // Besetzungsdichten und deren Ableitungen für verschiedene Teilchenspezies + constructor create(rp: tRaumPunkt; linksRaum,linksImpuls,untenImpuls,vorneImpuls: tImpulsPunkt; anzTeilchen: longint); + destructor destroy; override; + {$DEFINE LiKotImpulsPunktHeader} + {$INCLUDE linearkombinationen.inc} + {$UNDEF LiKotImpulsPunktHeader} + procedure nichtnegativieren; + procedure akkumuliereEMQuellen(var emQuellen: tEMQuellen; vx,vy,vz,dVP: extended); + function gibMirWas(var defizit: extended; entfernung, teilchen,richtung: longint; positiv: boolean): boolean; // ich habe jemanden erreicht + procedure setzeNull; + procedure berechneAbleitungen(pX,pY,pZ,iDX,iDPX,iDPY,iDPZ: extended); + end; + + { tRaumPunkt } - constructor create(linkerNachbar: tWertePunkt; derBesitzer: tFelder); + tRaumPunkt = class(tObject) // repräsentiert alle Werte eines Punktes im Raumgitter und deren Zeitableitungen + private + felder: tFelder; + public + phasenraum: array of tImpulsPunkt; + // Phasenraumbesetzungsdichten + emFelder: array[tEMFeldGroesze,boolean] of extended; + // EM-Felder und deren Zeitableitungen + // dPhiDX und B[xyz] haben keine sinnvolle Ableitung hier! + emQuellen: array[tEMQuellGroesze] of extended; + // Quellen für die EM-Felder + lN,rN: tRaumPunkt; + // Nachbarpunkte + dPX,dPY,dPZ: extended; + // Impulsdiskretisierung + aPX,aPY,aPZ: longint; + // Anzahl der Impulsbins + + constructor create(linkerNachbar: tRaumPunkt; derBesitzer: tFelder; teilchen,_aPX,_aPY,_aPZ: longint; _dPX,_dPY,_dPZ: extended); destructor destroy; override; - procedure berechneGammaUndP; - procedure berechneDPhiDX(dX: extended); - procedure berechneNAbleitung(iDX,pDNMax: extended); overload; - procedure berechneNAbleitung(iDX,pDNMax: extended; rechts: boolean); overload; - procedure berechneAbleitungen(iDX: extended); - procedure liKo(in1,in2: tWertePunkt; fak2: extended); overload; // Werte werden auf (in1 + \sum_i faki * ini') gesetzt - procedure liKo(in1,in2,in3: tWertePunkt; fak2,fak3: extended); overload; - procedure liKo(in1,in2,in3,in4: tWertePunkt; fak2,fak3,fak4: extended); overload; - procedure liKo(in1,in2,in3,in4,in5: tWertePunkt; fak2,fak3,fak4,fak5: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6: tWertePunkt; fak2,fak3,fak4,fak5,fak6: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7: tWertePunkt; fak2,fak3,fak4,fak5,fak6,fak7: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8: tWertePunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9: tWertePunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10: tWertePunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11: tWertePunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12: tWertePunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14: tWertePunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15: tWertePunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16: tWertePunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17: tWertePunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18: tWertePunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19: tWertePunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19,in20,in21,in22: tWertePunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19,fak20,fak21,fak22: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19,in20,in21,in22,in23: tWertePunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19,fak20,fak21,fak22,fak23: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19,in20,in21,in22,in23,in24,in25,in26,in27,in28,in29,in30,in31: tWertePunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19,fak20,fak21,fak22,fak23,fak24,fak25,fak26,fak27,fak28,fak29,fak30,fak31: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19,in20,in21,in22,in23,in24,in25,in26,in27,in28,in29,in30,in31,in32: tWertePunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19,fak20,fak21,fak22,fak23,fak24,fak25,fak26,fak27,fak28,fak29,fak30,fak31,fak32: extended); overload; - function maxDT: extended; - function dump(mitNachbarn: boolean): string; + procedure berechneEMFelder(dX: extended; rechts: boolean); overload; + procedure berechneEMFelder(dX,iDX: extended); overload; + procedure berechneEMAbleitungen(iDX: extended); + procedure berechnePhasenraumAbleitungen(iDX: extended); + {$DEFINE LiKotRaumPunktHeader} + {$INCLUDE linearkombinationen.inc} + {$UNDEF LiKotRaumPunktHeader} procedure nichtnegativieren; + function impulsIntegral(teilchen: longint; emQ: tEMQuellGroesze): extended; + procedure initialisiereDichte(teilchen: longint; n: extended); + procedure reflektiereTeilchen(rechts: boolean); + procedure setzeNull; end; { TFelder } @@ -137,34 +146,16 @@ type lichters: array[boolean] of tMyStringlist; procedure setzeRaender(iDX: extended); public - inhalt: array of tWertePunkt; - par: tGitter; + inhalt: array of tRaumPunkt; + gitter: tGitter; - constructor create(groesse: longint; teilchen: array of tTeilchenSpezies; lichter: tMyStringList; parent: tGitter); + constructor create(groesse: longint; teilchen: array of tTeilchenSpezies; lichter: tMyStringList; parent: tGitter; aPX,aPY,aPZ: longint; dPX,dPY,dPZ: extended); destructor destroy; override; - 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; - procedure liKo(in1,in2,in3,in4,in5: tFelder; fak2,fak3,fak4,fak5: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6: tFelder; fak2,fak3,fak4,fak5,fak6: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7: tFelder; fak2,fak3,fak4,fak5,fak6,fak7: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19,in20,in21,in22: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19,fak20,fak21,fak22: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19,in20,in21,in22,in23: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19,fak20,fak21,fak22,fak23: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19,in20,in21,in22,in23,in24,in25,in26,in27,in28,in29,in30,in31: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19,fak20,fak21,fak22,fak23,fak24,fak25,fak26,fak27,fak28,fak29,fak30,fak31: extended); overload; - procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19,in20,in21,in22,in23,in24,in25,in26,in27,in28,in29,in30,in31,in32: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19,fak20,fak21,fak22,fak23,fak24,fak25,fak26,fak27,fak28,fak29,fak30,fak31,fak32: extended); overload; - function maxDT: extended; + procedure berechneAbleitungen(dX,iDX: extended); + {$DEFINE LiKotFelderHeader} + {$INCLUDE linearkombinationen.inc} + {$UNDEF LiKotFelderHeader} + procedure setzeNull; end; { tGitter } @@ -174,22 +165,18 @@ type besitzer: tSimulation; prot: tProtokollant; zeitverfahren: tZeitverfahren; - pDNMaxDynamisch,abbruch: boolean; - dX,iDX,pDNMax,dTMaximum,xl,t: extended; + abbruch: boolean; + dX,iDX,xl,t: extended; kvs: tKnownValues; - procedure diffusionsTermAnpassen(pro: tProtokollant); - function pruefeMaxDT(aF: longint; var dTMax,dT: extended; dTMin: extended): boolean; // wurde verkleinert? procedure abbrechen; public aktuelleFelder: longint; felders: array of tFelder; // mehrere komplette Simulationsboxen von Feldern, benötigt um Zwischenschritte für die Zeitentwicklung zu speichern - constructor create(derBesitzer: tSimulation; size: longint; deltaT,deltaX,pDNMa: extended; bekannteWerte: tKnownValues; teilchen: array of tTeilchenSpezies; lichter: tMyStringlist; zv: tZeitverfahren; protokollant: tProtokollant; name: string); + constructor create(derBesitzer: tSimulation; size: longint; deltaX: extended; bekannteWerte: tKnownValues; teilchen: array of tTeilchenSpezies; lichter: tMyStringlist; zv: tZeitverfahren; protokollant: tProtokollant; name: string; aPX,aPY,aPZ: longint; dPX,dPY,dPZ: extended); destructor destroy; override; - procedure iteriereSchritt(var dT: extended; dTMin: extended); - function dumpErhaltungsgroessen: boolean; - procedure berechne(was: char; teilchen: longint); + procedure iteriereSchritt(dT: extended); end; { tSimulation } @@ -198,7 +185,7 @@ type private prot: tProtokollant; gitter: tGitter; - dT,tEnde,sT,sDT,sDX,dTMin: extended; + dT,tEnde,sT,sDT,sDX: extended; fortschrittsAnzeige: boolean; ausgabeDateien: array of tAusgabeDatei; public @@ -213,23 +200,23 @@ procedure SignalCapture(signal : longint); cdecl; implementation const - emFeldNamen: array[tEMFeldInhalt] of string = ( - 'A','AX','AY','AZ','DAXDT','DAYDT','DAZDT','DPHIDX' + emFeldNamen: array[tEMFeldGroesze] of string = ( + 'AX','AY','AZ','DAXDT','DAYDT','DAZDT','EX','BY','BZ' ); - matFeldNamen: array[tMaterieFeldInhalt] of string = ( - 'N','DPSIDX','P','PX','PY','PZ','GAMMA','IGAMMA' + emQuellNamen: array[tEMQuellGroesze] of string = ( + 'RHO','JX','JY','JZ' ); minAusgabeBuffer = 1024*1024; var sighupSimulationen: array of tSimulation; -{ tAusgabeDatei } +// tAusgabeDatei *************************************************************** constructor tAusgabeDatei.create(feldName,prefix,suffix: string; prot: tProtokollant; nam: string); var - emF: tEMFeldInhalt; - maF: tMaterieFeldInhalt; + emF: tEMFeldGroesze; + emQ: tEMQuellGroesze; num: longint; abl,gef: boolean; begin @@ -244,10 +231,10 @@ begin delete(feldName,num,length(feldName)); end else - teilchen:=0; + teilchen:=-1; - emInhalt:=efA; - matInhalt:=mfN; + emFelder:=efAX; + emQuellen:=eqRho; feldName:=ansiUpperCase(feldName); nNum:=0; // Header 0 wurde also noch nicht geschrieben zeitAnz:=-1; @@ -256,32 +243,37 @@ begin gef:=false; for abl:=false to true do begin if not gef then - for emF:=low(tEMFeldInhalt) to high(tEMFeldInhalt) do + for emF:=low(tEMFeldGroesze) to high(tEMFeldGroesze) do if copy('D',1,byte(abl))+emFeldNamen[emF] = feldName then begin - emInhalt:=emF; - teilchen:=-1; - gef:=true; - break; - end; - if not gef then - for maF:=low(tMaterieFeldInhalt) to high(tMaterieFeldInhalt) do - if copy('D',1,byte(abl))+matFeldNamen[maF] = feldName then begin - matInhalt:=maF; + emFelder:=emF; + ableitung:=abl; + teilchen:=-2; gef:=true; break; end; end; + if not gef then + for emQ:=low(tEMQuellGroesze) to high(tEMQuellGroesze) do + if emQuellNamen[emQ] = feldName then begin + ableitung:=false; + emQuellen:=emQ; + gef:=true; + break; + end; if not gef then begin - pro.schreibe('tAusgabeDatei.create kennt Feld '''+feldName+''' nicht!',true); + pro.schreibe('tAusgabeDatei.create kennt Größe '''+feldName+''' nicht!',true); pro.destroyAll; halt(1); end; - if teilchen>=0 then - pre:=matFeldNamen[maF]+inttostr(teilchen+1) - else - pre:=emFeldNamen[emF]; + if teilchen=-2 then + pre:=emFeldNamen[emF] + else begin + pre:=emQuellNamen[emQ]; + if teilchen>=0 then + pre:=pre+inttostr(teilchen+1); + end; if ableitung then pre:='d'+pre; @@ -323,10 +315,13 @@ end; function tAusgabeDatei.dump: string; begin - if teilchen<0 then - result:=emFeldNamen[emInhalt] - else - result:=matFeldNamen[matInhalt]+inttostr(teilchen); + if teilchen=-2 then + result:=emFeldNamen[emFelder] + else begin + result:=emQuellNamen[emQuellen]; + if teilchen>=0 then + result:=result+inttostr(teilchen); + end; if ableitung then result:=result+''''; result:=result+' -> '+pre+'-$i'+suf; @@ -351,18 +346,14 @@ begin end; procedure tAusgabeDatei.speichereWerte(gitter: tGitter; sT, sDX: extended); -var i,cnt: longint; - sX,cX: extended; +var i,cnt: longint; + sX,cX,val: extended; begin if (teilchen>=gitter.felders[gitter.aktuelleFelder].matAnz) then begin pro.schreibe('Teilchen '+inttostr(teilchen+1)+' gibt es nicht, da kann ich auch nichts speichern!',true); pro.destroyall; halt(1); end; - if (teilchen<0) and (emInhalt=efA) then - gitter.berechne('A',teilchen); - if (teilchen>=0) and (matInhalt=mfP) then - gitter.berechne('P',teilchen); if sT>=nNum+sDT/2 then schreibeKopf; @@ -389,11 +380,22 @@ begin inc(bufPos,sizeof(integer)); sX:=cX-Min(gitter.dX,sDX)/2; - if teilchen<0 then begin + if teilchen=-2 then begin for i:=0 to length(gitter.felders[gitter.aktuelleFelder].inhalt)-1 do begin while cX>=sX do begin dec(cnt); - move(gitter.felders[gitter.aktuelleFelder].inhalt[i].emWerte[emInhalt,ableitung],(buf+bufPos)^,sizeof(extended)); + move(gitter.felders[gitter.aktuelleFelder].inhalt[i].emFelder[emFelder,ableitung],(buf+bufPos)^,sizeof(extended)); + inc(bufPos,sizeof(extended)); + sX:=sX+sDX; + end; + cX:=cX+gitter.dX; + end; + end + else if teilchen=-1 then begin + for i:=0 to length(gitter.felders[gitter.aktuelleFelder].inhalt)-1 do begin + while cX>=sX do begin + dec(cnt); + move(gitter.felders[gitter.aktuelleFelder].inhalt[i].emQuellen[emQuellen],(buf+bufPos)^,sizeof(extended)); inc(bufPos,sizeof(extended)); sX:=sX+sDX; end; @@ -404,7 +406,8 @@ begin for i:=0 to length(gitter.felders[gitter.aktuelleFelder].inhalt)-1 do begin while cX>=sX do begin dec(cnt); - move(gitter.felders[gitter.aktuelleFelder].inhalt[i].matWerte[teilchen,matInhalt,ableitung],(buf+bufPos)^,sizeof(extended)); + val:=gitter.felders[gitter.aktuelleFelder].inhalt[i].impulsIntegral(teilchen,emQuellen); + move(val,(buf+bufPos)^,sizeof(extended)); inc(bufPos,sizeof(extended)); sX:=sX+sDX; end; @@ -418,7 +421,7 @@ begin end; end; -{ tTeilchenSpezies } +// tTeilchenSpezies ************************************************************ constructor tTeilchenSpezies.create; begin @@ -515,35 +518,209 @@ begin end; end; -{ tWertePunkt } +// tImpulsPunkt **************************************************************** -constructor tWertePunkt.create(linkerNachbar: tWertePunkt; derBesitzer: tFelder); +constructor tImpulsPunkt.create(rp: tRaumPunkt; linksRaum,linksImpuls,untenImpuls,vorneImpuls: tImpulsPunkt; anzTeilchen: longint); +var + i: longint; + b: boolean; +begin + inherited create; + raumPunkt:=rp; + fillchar(werte,sizeof(werte),#0); + setlength(werte,anzTeilchen); + for i:=0 to length(werte)-1 do + for b:=false to true do + werte[i,b]:=0; + nachbarn[0,false]:=linksRaum; + nachbarn[0,true]:=nil; + nachbarn[1,false]:=linksImpuls; + nachbarn[1,true]:=nil; + nachbarn[2,false]:=untenImpuls; + nachbarn[2,true]:=nil; + nachbarn[3,false]:=vorneImpuls; + nachbarn[3,true]:=nil; + for i:=0 to 3 do + if assigned(nachbarn[i,false]) then + nachbarn[i,false].nachbarn[i,true]:=self; +end; + +destructor tImpulsPunkt.destroy; +var + i: longint; + b: boolean; +begin + for i:=0 to 3 do + for b:=false to true do + if assigned(nachbarn[i,b]) then + nachbarn[i,b].nachbarn[i,not b]:=nil; + setlength(werte,0); + inherited destroy; +end; + +procedure tImpulsPunkt.nichtnegativieren; // Dichten nicht negativ machen +var + i,j,entfernung: longint; + defizit: extended; + pro: tProtokollant; + jemandErreicht,b: boolean; +begin + for i:=0 to length(werte)-1 do + if werte[i,false]<0 then begin + defizit:=-werte[i,false]; + werte[i,false]:=0; + entfernung:=1; + jemandErreicht:=true; + while (defizit>0) and jemandErreicht do begin + jemandErreicht:=false; + for j:=0 to 3 do + for b:=false to true do + if assigned(nachbarn[j,b]) then + jemandErreicht:=nachbarn[j,b].gibMirWas(defizit,i,entfernung,j,b) or jemandErreicht; + + inc(entfernung); + end; + if defizit>0 then begin + pro:=tProtokollant.create(raumpunkt.felder.gitter.prot,'WertePunkt.nichtnegativieren'); + pro.schreibe('Ich konnte ein Teilchendefizit der Sorte '+inttostr(i+1)+' nicht auffüllen!',true); + raumpunkt.felder.gitter.abbrechen; + end; + end; +end; + +procedure tImpulsPunkt.akkumuliereEMQuellen(var emQuellen: tEMQuellen; vx,vy,vz,dVP: extended); +var + i: longint; + tmp: extended; +begin + for i:=0 to length(werte)-1 do begin + tmp:=werte[i,false] * raumpunkt.felder.spezLadungen[i] * dVP; + emQuellen[eqRho]:=emQuellen[eqRho] + tmp; + emQuellen[eqJX]:= emQuellen[eqJX] + tmp * vx; + emQuellen[eqJY]:= emQuellen[eqJY] + tmp * vy; + emQuellen[eqJZ]:= emQuellen[eqJZ] + tmp * vz; + end; +end; + +function tImpulsPunkt.gibMirWas(var defizit: extended; entfernung, teilchen,richtung: longint; positiv: boolean): boolean; // ich habe jemanden erreicht +var + i: longint; +begin + result:=entfernung<=0; + if result then begin + if (defizit>0) and (werte[teilchen,false]>0) then begin + if defizit>werte[teilchen,false] then begin + defizit:=defizit-werte[teilchen,false]; + werte[teilchen,false]:=0; + end + else begin + werte[teilchen,false]:=werte[teilchen,false]-defizit; + defizit:=0;; + end; + end; + end + else + if defizit>0 then begin + result:=false; + for i:=richtung to 4 do + if assigned(nachbarn[i,positiv]) then + result:=nachbarn[i,positiv].gibMirWas(defizit,entfernung-1,teilchen,i,positiv) or result; + end; +end; + +procedure tImpulsPunkt.setzeNull; var - emF: tEMFeldInhalt; - maF: tMaterieFeldInhalt; - abl: boolean; i: longint; + abl: boolean; +begin + for i:=0 to length(werte)-1 do + for abl:=false to true do + werte[i,abl]:=0; +end; + +procedure tImpulsPunkt.berechneAbleitungen(pX,pY,pZ,iDX,iDPX,iDPY,iDPZ: extended); +var + igam: extended; + i: longint; +begin + igam:=1/sqrt(1+sqr(pX)+sqr(pY)+sqr(pZ)); + pX:=pX*igam; + pY:=pY*igam; + pZ:=pZ*igam; + + // df/dt = - v Nabla f - q(E + v/c x B) Nabla_p f + for i:=0 to length(werte)-1 do + werte[i,true]:= + - pX * (nachbarn[0,true].werte[i,false] - nachbarn[0,false].werte[i,false]) * iDX/2 + - raumpunkt.felder.spezLadungen[i] * ( + (raumpunkt.emFelder[efEX,false] + pY*raumpunkt.emFelder[efBZ,false] - pZ*raumpunkt.emFelder[efBY,false]) + * (nachbarn[1,true].werte[i,false] - nachbarn[1,false].werte[i,false]) * iDPX/2 + -pX*raumpunkt.emFelder[efBZ,false] + * (nachbarn[2,true].werte[i,false] - nachbarn[2,false].werte[i,false]) * iDPY/2 + +pX*raumpunkt.emFelder[efBY,false] + * (nachbarn[3,true].werte[i,false] - nachbarn[3,false].werte[i,false]) * iDPZ/2 + ); +end; + +// tRaumPunkt ****************************************************************** + +constructor tRaumPunkt.create(linkerNachbar: tRaumPunkt; derBesitzer: tFelder; teilchen,_aPX,_aPY,_aPZ: longint; _dPX,_dPY,_dPZ: extended); +var + emF: tEMFeldGroesze; + emQ: tEMQuellGroesze; + abl: boolean; + i,j,k: longint; + xN,pxN,pyN,pzN: tImpulsPunkt; begin inherited create; - besitzer:=derBesitzer; - fillchar(matWerte,sizeof(matWerte),#0); - setlength(matWerte,length(besitzer.spezLadungen)); - for i:=0 to length(matWerte)-1 do - for maF:=low(tMaterieFeldInhalt) to high(tMaterieFeldInhalt) do - for abl:=false to true do - matWerte[i,maF,abl]:=0; - for emF:=low(tEMFeldInhalt) to high(tEMFeldInhalt) do + felder:=derBesitzer; + for emQ:=low(tEMQuellGroesze) to high(tEMQuellGroesze) do + emQuellen[emQ]:=0; + for emF:=low(tEMFeldGroesze) to high(tEMFeldGroesze) do for abl:=false to true do - emWerte[emF,abl]:=0; + emFelder[emF,abl]:=0; lN:=linkerNachbar; rN:=nil; if assigned(lN) then lN.rN:=self; + aPX:=_aPX+byte(not odd(_aPX)); + aPY:=_aPY+byte(not odd(_aPY)); + aPZ:=_aPZ+byte(not odd(_aPZ)); + dPX:=_dPX; + dPY:=_dPY; + dPZ:=_dPZ; + fillchar(phasenraum,sizeof(phasenraum),#0); + setlength(phasenraum,aPX*aPY*aPZ); + for i:=0 to aPX-1 do + for j:=0 to aPY-1 do + for k:=0 to aPZ-1 do begin + if assigned(linkerNachbar) then + xN:=linkerNachbar.phasenraum[i+aPX*(j+k*aPY)] + else + xN:=nil; + if i>0 then + pxN:=phasenraum[i-1+aPX*(j+k*aPY)] + else + pxN:=nil; + if j>0 then + pyN:=phasenraum[i+aPX*(j-1+k*aPY)] + else + pyN:=nil; + if k>0 then + pzN:=phasenraum[i+aPX*(j+(k-1)*aPY)] + else + pzN:=nil; + phasenraum[i+aPX*(j+k*aPY)]:=tImpulsPunkt.create(self,xN,pxN,pyN,pzN,teilchen); + end; end; -destructor tWertePunkt.destroy; +destructor tRaumPunkt.destroy; +var + i: longint; begin - setlength(matWerte,0); + for i:=0 to length(phasenraum)-1 do + phasenraum[i].free; + setlength(phasenraum,0); if assigned(lN) then lN.rN:=nil; if assigned(rN) then @@ -551,262 +728,187 @@ begin inherited destroy; end; -procedure tWertePunkt.berechneGammaUndP; // aus aktuellem dPsi/dX und A -var - i: longint; +procedure tRaumPunkt.berechneEMFelder(dX: extended; rechts: boolean); begin - for i:=0 to length(matWerte)-1 do begin - matWerte[i,mfPX,false]:= besitzer.spezLadungen[i] * emWerte[efAX,false] + matWerte[i,mfDPsiDX,false]; - matWerte[i,mfPY,false]:= besitzer.spezLadungen[i] * emWerte[efAY,false]; - matWerte[i,mfPZ,false]:= besitzer.spezLadungen[i] * emWerte[efAZ,false]; - - matWerte[i,mfGamma,false]:= - sqrt( - 1 + - sqr(matWerte[i,mfPX,false]) + - sqr(matWerte[i,mfPY,false]) + - sqr(matWerte[i,mfPZ,false]) - ); - matWerte[i,mfIGamma,false]:= - 1/matWerte[i,mfGamma,false]; - end; + // dEX/dx = rho ... hier muss integriert werden: + // EX = EX(x- deltax) + <rho> * deltax + + if rechts then + emFelder[efEX,false]:= + lN.emFelder[efEX,false] + + (lN.emQuellen[eqRho] + emQuellen[eqRho]) * dX/2 + else + emFelder[efEX,false]:= + emQuellen[eqRho] * dX; + + // B = rot A + emFelder[efBY,false]:=0; // kann man vllt auch hübscher machen, ich bin aber gerade zu faul dafür + emFelder[efBZ,false]:=0; +end; + +procedure tRaumPunkt.berechneEMFelder(dX,iDX: extended); +begin + // dEX/dx = rho ... hier muss integriert werden: + // EX = EX(x- deltax) + <rho> * deltax + + emFelder[efEX,false]:= + lN.emFelder[efEX,false] + + (lN.emQuellen[eqRho] + emQuellen[eqRho]) * dX/2; + + // B = rot A + emFelder[efBY,false]:= + (lN.emFelder[efAZ,false]-rN.emFelder[efAZ,false])*iDX/2; + emFelder[efBZ,false]:= + (rN.emFelder[efAY,false]-lN.emFelder[efAY,false])*iDX/2; end; -procedure tWertePunkt.berechneDPhiDX(dX: extended); +procedure tRaumPunkt.berechneEMAbleitungen(iDX: extended); // Zeitableitungen der EM-Potentiale berechnen var - i: longint; + i,j,k: longint; + emQ: tEMQuellGroesze; begin - // d2Phi/dx2 = rho ... hier muss integriert werden: - // dPhi/dx = dPhi/dx(x- deltax) + <rho> * deltax - - if assigned(lN) then begin - emWerte[efDPhiDX,false]:=lN.emWerte[efDPhiDX,false]; - for i:=0 to length(matWerte)-1 do - emWerte[efDPhiDX,false]:= - emWerte[efDPhiDX,false] - + besitzer.spezLadungen[i] * (lN.matWerte[i,mfN,false] + matWerte[i,mfN,false]) * dX/2; - end - else begin - emWerte[efDPhiDX,false]:=0; - for i:=0 to length(matWerte)-1 do - emWerte[efDPhiDX,false]:= - emWerte[efDPhiDX,false] - + besitzer.spezLadungen[i] * matWerte[i,mfN,false] * dX/2; - end; + for emQ:=low(tEMQuellGroesze) to high(tEMQuellGroesze) do + emQuellen[emQ]:=0; + for i:=0 to aPX-1 do + for j:=0 to aPY-1 do + for k:=0 to aPZ-1 do + phasenraum[i+aPX*(j+aPY*k)].akkumuliereEMQuellen(emQuellen,(i-aPX/2)*dPX,(j-aPY/2)*dPY,(k-aPZ/2)*dPZ,dPX*dPY*dPZ); + + // d2A/dt2 = Laplace(A) - j ( - dE/dt wird auf dA/dt direkt aufgeschlagen !!! ) + emFelder[efDAXDT,true]:= + ( rN.emFelder[efAX,false] - 2*emFelder[efAX,false] + lN.emFelder[efAX,false] )*sqr(iDX) + - emQuellen[eqJX]; + emFelder[efDAYDT,true]:= + ( rN.emFelder[efAY,false] - 2*emFelder[efAY,false] + lN.emFelder[efAY,false] )*sqr(iDX) + - emQuellen[eqJY]; + emFelder[efDAZDT,true]:= + ( rN.emFelder[efAZ,false] - 2*emFelder[efAZ,false] + lN.emFelder[efAZ,false] )*sqr(iDX) + - emQuellen[eqJZ]; + + // dA/dt = dA/dt - E + emFelder[efAX,true]:=emFelder[efDAXDT,false] - emFelder[efEX,false]; + emFelder[efAY,true]:=emFelder[efDAYDT,false]; + emFelder[efAZ,true]:=emFelder[efDAZDT,false]; end; -procedure tWertePunkt.berechneNAbleitung(iDX,pDNMax: extended); // Zeitableitung von n berechnen +procedure tRaumPunkt.berechnePhasenraumAbleitungen(iDX: extended); var - i: longint; + i,j,k: longint; begin -(* // dn/dt = -d(n/Gamma p_x)/dx - Groessen[true,fiN]:= - -( rN^.rN^.Groessen[false,fiN]*rN^.rN^.Groessen[false,fiiGamma]*rN^.rN^.Groessen[false,fiPX] - + rN^.Groessen[false,fiN]*rN^.Groessen[false,fiiGamma]*rN^.Groessen[false,fiPX] - - lN^.Groessen[false,fiN]*lN^.Groessen[false,fiiGamma]*lN^.Groessen[false,fiPX] - - lN^.lN^.Groessen[false,fiN]*lN^.lN^.Groessen[false,fiiGamma]*lN^.lN^.Groessen[false,fiPX] - )*iDX/6; - // es wird über die beiden nächsten linken bzw. rechten Nachbarn gemittelt *) - - for i:=0 to length(matWerte)-1 do - // dn/dt = -d(n/Gamma p_x)/dx + (p_max*dx) * Laplace n - matWerte[i,mfN,true]:= - ( rN.matWerte[i,mfN,false] * rN.matWerte[i,mfIGamma,false] * (pDNMax - rN.matWerte[i,mfPX,false] * iDX) - + lN.matWerte[i,mfN,false] * lN.matWerte[i,mfIGamma,false] * (pDNMax + lN.matWerte[i,mfPX,false] * iDX) - - matWerte[i,mfN,false] * matWerte[i,mfIGamma,false] * 2 * pDNMax) / 2; - // Der zweite Summand entspricht (in etwa) einer thermischen Verschmierung - // und soll die numerische Stabilität bis zu p * d(ln n)/dx von pDNMax gewährleisten. - // Es handelt sich um einen Diffusionsterm dn/dt = alpha * Laplace n mit - // alpha = pDNMax * dX^2 + // df/dt = - v Nabla f - q(E + v/c x B) Nabla_p f + for i:=1 to aPX-2 do + for j:=1 to aPY-2 do + for k:=1 to aPZ-2 do + phasenraum[i+aPX*(j+aPY*k)].berechneAbleitungen((i-(aPX div 2))*dPX,(j-(aPY div 2))*dPY,(k-(aPZ div 2))*dPZ,iDX,1/dPX,1/dPY,1/dPZ); end; -procedure tWertePunkt.berechneNAbleitung(iDX,pDNMax: extended; rechts: boolean); +procedure tRaumPunkt.nichtnegativieren; // Dichten nicht negativ machen var - i: longint; + i: longint; begin - if rechts then begin - for i:=0 to length(matWerte)-1 do - // rechter Randterm von dn/dt = -d(n/Gamma p_x)/dx + (p_max*dx) * Laplace n - matWerte[i,mfN,true]:= - ( lN.matWerte[i,mfN,false] * lN.matWerte[i,mfIGamma,false] * (pDNMax + lN.matWerte[i,mfPX,false] * iDX) - - matWerte[i,mfN,false] * matWerte[i,mfIGamma,false] * (pDNMax - matWerte[i,mfPX,false] * iDX)) / 2; - end - else begin - for i:=0 to length(matWerte)-1 do - // linker Randterm von dn/dt = -d(n/Gamma p_x)/dx + (p_max*dx) * Laplace n - matWerte[i,mfN,true]:= - ( rN.matWerte[i,mfN,false] * rN.matWerte[i,mfIGamma,false] * (pDNMax - rN.matWerte[i,mfPX,false] * iDX) - - matWerte[i,mfN,false] * matWerte[i,mfIGamma,false] * (pDNMax + matWerte[i,mfPX,false] * iDX)) / 2; - end + for i:=0 to length(phasenraum)-1 do + phasenraum[i].nichtnegativieren; end; -procedure tWertePunkt.berechneAbleitungen(iDX: extended); // Zeitableitungen berechnen +function tRaumPunkt.impulsIntegral(teilchen: longint; emQ: tEMQuellGroesze): extended; var - i: longint; + i,j,k: longint; begin - // d2Psi/dxdt = dPhi/dx - dGamma/dx - for i:=0 to length(matWerte)-1 do - matWerte[i,mfDPsiDX,true]:= - besitzer.spezLadungen[i] * emWerte[efDPhiDX,false] - - (rN.matWerte[i,mfGamma,false] - lN.matWerte[i,mfGamma,false]) * iDX/2; - - // d2A/dt2 = Laplace(A) ... ( - Nabla(dPhi/dt) wird auf dA/dt aufgeschlagen !!! ) - emWerte[efDAXDT,true]:= - ( rN.emWerte[efAX,false] - 2*emWerte[efAX,false] + lN.emWerte[efAX,false] )*sqr(iDX); - emWerte[efDAYDT,true]:= - ( rN.emWerte[efAY,false] - 2*emWerte[efAY,false] + lN.emWerte[efAY,false] )*sqr(iDX); - emWerte[efDAZDT,true]:= - ( rN.emWerte[efAZ,false] - 2*emWerte[efAZ,false] + lN.emWerte[efAZ,false] )*sqr(iDX); - // ... - Rho/gamma p - for i:=0 to length(matWerte)-1 do begin - emWerte[efDAXDT,true]:= - emWerte[efDAXDT,true] - - (besitzer.spezLadungen[i] * matWerte[i,mfN,false] * matWerte[i,mfIGamma,false] * matWerte[i,mfPX,false]); - emWerte[efDAYDT,true]:= - emWerte[efDAYDT,true] - - (besitzer.spezLadungen[i] * matWerte[i,mfN,false] * matWerte[i,mfIGamma,false] * matWerte[i,mfPY,false]); - emWerte[efDAZDT,true]:= - emWerte[efDAZDT,true] - - (besitzer.spezLadungen[i] * matWerte[i,mfN,false] * matWerte[i,mfIGamma,false] * matWerte[i,mfPZ,false]); + if teilchen<0 then begin + result:=emQuellen[emQ]; // das ist leicht :-) + exit; end; - // dA/dt = dA/dt - Nabla(Phi) - emWerte[efAX,true]:=emWerte[efDAXDT,false] - emWerte[efDPhiDX,false];// + emWerte[efDAXDT,true]*dT; - emWerte[efAY,true]:=emWerte[efDAYDT,false];// + emWerte[efDAYDT,true]*dT; - emWerte[efAZ,true]:=emWerte[efDAZDT,false];// + emWerte[efDAZDT,true]*dT; + result:=0; + + case emQ of + eqRho: + for i:=0 to aPX-1 do + for j:=0 to aPY-1 do + for k:=0 to aPZ-1 do + result:= + result + + phasenraum[i+aPX*(j+aPY*k)].werte[teilchen,false]*dPX*dPY*dPZ; + eqJX: + for i:=0 to aPX-1 do + for j:=0 to aPY-1 do + for k:=0 to aPZ-1 do + result:= + result + + phasenraum[i+aPX*(j+aPY*k)].werte[teilchen,false]*dPX*dPY*dPZ * (i-aPX/2)*dPX; + eqJY: + for i:=0 to aPX-1 do + for j:=0 to aPY-1 do + for k:=0 to aPZ-1 do + result:= + result + + phasenraum[i+aPX*(j+aPY*k)].werte[teilchen,false]*dPX*dPY*dPZ * (j-aPY/2)*dPY; + eqJZ: + for i:=0 to aPX-1 do + for j:=0 to aPY-1 do + for k:=0 to aPZ-1 do + result:= + result + + phasenraum[i+aPX*(j+aPY*k)].werte[teilchen,false]*dPX*dPY*dPZ * (k-aPZ/2)*dPZ; + end; end; -function tWertePunkt.maxDT: extended; +procedure tRaumPunkt.initialisiereDichte(teilchen: longint; n: extended); var i: longint; begin - result:=infinity; - for i:=0 to length(matWerte)-1 do - if (matWerte[i,mfN,true]<0) and - (matWerte[i,mfN,false]>0) then - result:=min(result,-matWerte[i,mfN,false]/matWerte[i,mfN,true]); + for i:=0 to length(phasenraum)-1 do + if (aPX div 2) + aPX*((aPY div 2) + aPY*(aPZ div 2)) = i then + phasenraum[i].werte[teilchen,false]:=n + else + phasenraum[i].werte[teilchen,false]:=0; end; -function tWertePunkt.dump(mitNachbarn: boolean): string; +procedure tRaumPunkt.reflektiereTeilchen(rechts: boolean); var - i: longint; + i,j,k: longint; begin - if mitNachbarn and assigned(lN) then result:=lN.dump(false)+' << ' - else result:=''; - - for i:=0 to length(matWerte)-1 do - result:= - result+ - 'N['+ inttostr(i)+'] = '+floattostr(matWerte[i,mfN,false])+' '+ - 'N''['+inttostr(i)+'] = '+floattostr(matWerte[i,mfN,true])+' '; - - result:=result+'maxDT: '+floattostr(maxDT); - - if mitNachbarn and assigned(rN) then result:=result+' >> '+rN.dump(false); + for i:=(aPX div 2 + 1)*byte(rechts) to (aPX div 2)-1 + (apx-(aPX div 2))*byte(rechts) do + for j:=0 to aPY*aPZ-1 do + for k:=0 to felder.matAnz-1 do + if phasenraum[i+aPX*j].werte[k,false]>0 then begin + phasenraum[aPX-1-i+aPX*j].werte[k,false]:=phasenraum[i+aPX*j].werte[k,false]; + phasenraum[i+aPX*j].werte[k,false]:=0; + end; end; -procedure tWertePunkt.nichtnegativieren; // Dichten nicht negativ machen +procedure tRaumPunkt.setzeNull; var - i: longint; - defizit: extended; - li,re: tWertePunkt; - pro: tProtokollant; + i: longint; + emF: tEMFeldGroesze; + emQ: tEMQuellGroesze; + abl: boolean; begin - for i:=0 to length(matWerte)-1 do - if matWerte[i,mfN,false]<0 then begin - defizit:=-matWerte[i,mfN,false]; - matWerte[i,mfN,false]:=0; - li:=self.lN; - re:=self.rN; - repeat - if assigned(li) then begin - if li.matWerte[i,mfN,false]>0 then begin - if defizit>=li.matWerte[i,mfN,false] then begin - defizit:=defizit-li.matWerte[i,mfN,false]; - li.matWerte[i,mfN,false]:=0; - end - else begin - li.matWerte[i,mfN,false]:=li.matWerte[i,mfN,false]-defizit; - defizit:=0;; - end; - end; - li:=li.lN; - end; - if assigned(re) then begin - if re.matWerte[i,mfN,false]>0 then begin - if defizit>=re.matWerte[i,mfN,false] then begin - defizit:=defizit-re.matWerte[i,mfN,false]; - re.matWerte[i,mfN,false]:=0; - end - else begin - re.matWerte[i,mfN,false]:=re.matWerte[i,mfN,false]-defizit; - defizit:=0;; - end; - end; - re:=re.rN; - end; - until (defizit<=0) or not (assigned(li) or assigned(re)); - if defizit>0 then begin - pro:=tProtokollant.create(besitzer.par.prot,'WertePunkt.nichtnegativieren'); - pro.schreibe('Ich konnte ein Teilchendefizit nicht auffüllen!',true); - besitzer.par.abbrechen; - end; - end; + for i:=0 to length(phasenraum)-1 do + phasenraum[i].setzeNull; + for emQ:=low(tEMQuellGroesze) to high(tEMQuellGroesze) do + emQuellen[emQ]:=0; + for emF:=low(tEMFeldGroesze) to high(tEMFeldGroesze) do + for abl:=false to true do + emFelder[emF,abl]:=0; end; -{ linearkombinationsspezifische Methoden von tWertePunkt und tFelder } - -{$INCLUDE linearkombination.inc} -{$DEFINE lkA3} -{$INCLUDE linearkombination.inc} -{$DEFINE lkA4} -{$INCLUDE linearkombination.inc} -{$DEFINE lkA5} -{$INCLUDE linearkombination.inc} -{$DEFINE lkA6} -{$INCLUDE linearkombination.inc} -{$DEFINE lkA7} -{$INCLUDE linearkombination.inc} -{$DEFINE lkA8} -{$INCLUDE linearkombination.inc} -{$DEFINE lkA9} -{$INCLUDE linearkombination.inc} -{$DEFINE lkA10} -{$INCLUDE linearkombination.inc} -{$DEFINE lkA11} -{$INCLUDE linearkombination.inc} -{$DEFINE lkA12} -{$INCLUDE linearkombination.inc} -{$DEFINE lkA14} -{$INCLUDE linearkombination.inc} -{$DEFINE lkA15} -{$INCLUDE linearkombination.inc} -{$DEFINE lkA16} -{$INCLUDE linearkombination.inc} -{$DEFINE lkA17} -{$INCLUDE linearkombination.inc} -{$DEFINE lkA18} -{$INCLUDE linearkombination.inc} -{$DEFINE lkA19} -{$INCLUDE linearkombination.inc} -{$DEFINE lkA22} -{$INCLUDE linearkombination.inc} -{$DEFINE lkA23} -{$INCLUDE linearkombination.inc} -{$DEFINE lkA31} -{$INCLUDE linearkombination.inc} -{$DEFINE lkA32} -{$INCLUDE linearkombination.inc} - -{ tFelder } - -constructor tFelder.create(groesse: longint; teilchen: array of tTeilchenSpezies; lichter: tMyStringList; parent: tGitter); +// linearkombinationsspezifische Methoden von tImpulsPunkt, tRaumPunkt und tFelder + +{$DEFINE LiKoimplementation} +{$INCLUDE linearkombinationen.inc} +{$UNDEF LiKoimplementation} + +// tFelder ********************************************************************* + +constructor tFelder.create(groesse: longint; teilchen: array of tTeilchenSpezies; lichter: tMyStringList; parent: tGitter; aPX,aPY,aPZ: longint; dPX,dPY,dPZ: extended); var i,j: longint; rechts: boolean; + dens: extended; begin inherited create; - par:=parent; + gitter:=parent; matAnz:=length(teilchen); fillchar(spezLadungen,sizeof(spezLadungen),#0); setlength(spezLadungen,matAnz); @@ -814,18 +916,18 @@ begin spezLadungen[i]:=teilchen[i].spezifischeLadung; fillchar(inhalt,sizeof(inhalt),#0); setlength(inhalt,groesse+4); // zwei Felder links und rechts extra für Randbedingungen - inhalt[0]:=tWertePunkt.create(nil,self); + inhalt[0]:=tRaumPunkt.create(nil,self,length(teilchen),aPX,aPY,aPZ,dPX,dPY,dPZ); for i:=1 to length(inhalt)-1 do - inhalt[i]:=tWertePunkt.create(inhalt[i-1],self); + inhalt[i]:=tRaumPunkt.create(inhalt[i-1],self,length(teilchen),aPX,aPY,aPZ,dPX,dPY,dPZ); fillchar(massen,sizeof(massen),#0); setlength(massen,length(teilchen)); for i:=0 to length(massen)-1 do massen[i]:=0; for i:=0 to length(inhalt)-1 do for j:=0 to length(teilchen)-1 do begin - inhalt[i].matWerte[j,mfN,false]:=teilchen[j].gibDichte(par.xl+(i-2)*par.dX,parent.kvs); - inhalt[i].matWerte[j,mfDPsiDX,false]:=0; - massen[j]:=massen[j]+inhalt[i].matWerte[j,mfN,false]*par.dX; + dens:=teilchen[j].gibDichte(gitter.xl+(i-2)*gitter.dX,parent.kvs); + inhalt[i].initialisiereDichte(j,dens); + massen[j]:=massen[j]+dens*gitter.dX; end; for rechts:=false to true do begin lichters[rechts]:=tMyStringlist.create(nil,''); @@ -852,65 +954,58 @@ end; procedure tFelder.setzeRaender(iDX: extended); var - emF: tEMFeldInhalt; + emF: tEMFeldGroesze; rechts: boolean; i: longint; begin for emF:=efAX to efAZ do begin // Vakuumrandbedingungen für das A-Feld - inhalt[0].emWerte[emF,true]:= - (inhalt[1].emWerte[emF,false] - - inhalt[0].emWerte[emF,false])*iDX; - inhalt[length(inhalt)-1].emWerte[emF,true]:= - (inhalt[length(inhalt)-2].emWerte[emF,false] - - inhalt[length(inhalt)-1].emWerte[emF,false])*iDX; + inhalt[0].emFelder[emF,true]:= + (inhalt[1].emFelder[emF,false] - + inhalt[0].emFelder[emF,false])*iDX; + inhalt[length(inhalt)-1].emFelder[emF,true]:= + (inhalt[length(inhalt)-2].emFelder[emF,false] - + inhalt[length(inhalt)-1].emFelder[emF,false])*iDX; 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 - inhalt[(length(inhalt)-1)*byte(rechts)].emWerte[efAY,true]:= - inhalt[(length(inhalt)-1)*byte(rechts)].emWerte[efAY,true] + - exprToFloat(false,lichters[rechts][i],par.kvs,nil); + inhalt[(length(inhalt)-1)*byte(rechts)].emFelder[efAY,true]:= + inhalt[(length(inhalt)-1)*byte(rechts)].emFelder[efAY,true] + + exprToFloat(false,lichters[rechts][i],gitter.kvs,nil); end; -procedure tFelder.berechneAbleitungen(dX,iDX,pDNMax: extended); +procedure tFelder.berechneAbleitungen(dX,iDX: extended); var i: longint; + b: boolean; begin - for i:=0 to length(inhalt)-1 do - inhalt[i].berechneGammaUndP; - for i:=0 to length(inhalt)-1 do - inhalt[i].berechneDPhiDX(dX); - for i:=0 to matAnz-1 do begin // Teilchen werden reflektiert - inhalt[1].matWerte[i,mfPX,false]:= - abs(inhalt[1].matWerte[i,mfPX,false]); - inhalt[length(inhalt)-2].matWerte[i,mfPX,false]:= - -abs(inhalt[length(inhalt)-2].matWerte[i,mfPX,false]); - end; - - for i:=2 to length(inhalt)-3 do - inhalt[i].berechneNAbleitung(iDX,pDNMax); + for b:=false to true do + inhalt[(length(inhalt)-1)*byte(b)].reflektiereTeilchen(b); - inhalt[1].berechneNAbleitung(iDX,pDNMax,false); - inhalt[length(inhalt)-2].berechneNAbleitung(iDX,pDNMax,true); + inhalt[0].berechneEMFelder(dX,false); + for i:=1 to length(inhalt)-2 do + inhalt[i].berechneEMFelder(dX,iDX); + inhalt[length(inhalt)-1].berechneEMFelder(dX,false); setzeRaender(iDX); for i:=1 to length(inhalt)-2 do - inhalt[i].berechneAbleitungen(iDX); + inhalt[i].berechneEMAbleitungen(iDX); + for i:=1 to length(inhalt)-2 do + inhalt[i].berechnePhasenraumAbleitungen(iDX); end; -function tFelder.maxDT: extended; +procedure tFelder.setzeNull; var i: longint; begin - result:=inhalt[0].maxDT; - for i:=1 to length(inhalt)-1 do - result:=min(result,inhalt[i].maxDT); + for i:=0 to length(inhalt)-1 do + inhalt[i].setzeNull; end; -{ tGitter } +// tGitter ********************************************************************* -constructor tGitter.create(derBesitzer: tSimulation; size: longint; deltaT,deltaX,pDNMa: extended; bekannteWerte: tKnownValues; teilchen: array of tTeilchenSpezies; lichter: tMyStringlist; zv: tZeitverfahren; protokollant: tProtokollant; name: string); +constructor tGitter.create(derBesitzer: tSimulation; size: longint; deltaX: extended; bekannteWerte: tKnownValues; teilchen: array of tTeilchenSpezies; lichter: tMyStringlist; zv: tZeitverfahren; protokollant: tProtokollant; name: string; aPX,aPY,aPZ: longint; dPX,dPY,dPZ: extended); var i: longint; begin @@ -920,14 +1015,8 @@ begin zeitverfahren:=zv; kvs:=bekannteWerte; prot:=tProtokollant.create(protokollant,name); - dTMaximum:=deltaT; dX:=deltaX; iDX:=1/dX; - if pDNMa < 0 then begin - pDNMax:=0; - pDNMaxDynamisch:=true; - end - else pDNMax:=pDNMa; case Zeitverfahren of zfEulerVorwaerts: Setlength(Felders,2); @@ -943,7 +1032,7 @@ begin xl:=dX/2; for i:=0 to length(felders)-1 do - felders[i]:=tFelder.create(size,teilchen,lichter,self); + felders[i]:=tFelder.create(size,teilchen,lichter,self,aPX,aPY,aPZ,dPX,dPY,dPZ); aktuelleFelder:=0; t:=0; @@ -960,99 +1049,29 @@ begin inherited destroy; end; -procedure tGitter.diffusionsTermAnpassen(pro: tProtokollant); -var - i,j,k: longint; - curMax,tmp: extended; -begin - curMax:=0; - k:=0; - for i:=1 to length(felders[aktuelleFelder].inhalt)-2 do - for j:=0 to felders[aktuelleFelder].matAnz-1 do begin - tmp:=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-100)); - if tmp>curMax then begin - curMax:=tmp; - k:=i; - end; - end; - 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, x='+floattostr(xL+k*dX)+'), die numerische Stabilität ist nicht mehr gewährleistet, Simulation wird abgebrochen!',true); - pro.schreibe(' Lösung: größeren Diffusionsterm wählen',true); - pro.schreibe(' außerdem empfohlen: Ortsauflösung in gleichem Maße verbessern',true); - abbrechen; - end; - end; -end; - -function tGitter.pruefeMaxDT(aF: longint; var dTMax,dT: extended; dTMin: extended): boolean; // wurde verkleinert? -begin - 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:=(dTMax<dT) and (dT>1.1*dTMin); - if result then begin // beabsichtigter Zeitschritt ist zu groß, - dT:=dTMax/4; // dann machen wir ihn doch kleiner! - if dT<dTMin then - dT:=dTMin - {$IFDEF Zeitschrittueberwachung} - else begin - prot.schreibe('pruefeMaxDT: dT -> '+floattostr(dT)+' (t = '+floattostr(t)+')'); - prot.spuelen; - end - {$ENDIF}; - end; -end; - procedure tGitter.abbrechen; var - i,j,k: longint; - maF: tMaterieFeldInhalt; - emF: tEMFeldInhalt; - abl: boolean; + i: longint; 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; + felders[i].setzeNull; end; -procedure tGitter.iteriereSchritt(var dT: extended; dTMin: extended); -var {$IFDEF negativeDichteueberwachung} - i,j: longint; +procedure tGitter.iteriereSchritt(dT: extended); + {$IFDEF negativeDichteueberwachung} +var i,j: longint; pro: tProtokollant; {$ENDIF} - dTMax: extended; begin if abbruch then begin t:=t+dT; exit; end; kvs.add('t',t); - diffusionsTermAnpassen(prot); - dTMax:=dX*100; repeat - felders[aktuelleFelder].berechneAbleitungen(dX,iDX,pDNMax); // y' = y'(t,y(t)) - - if pruefeMaxDT(aktuelleFelder,dTMax,dT,dTMin) then - continue; + felders[aktuelleFelder].berechneAbleitungen(dX,iDX); // y' = y'(t,y(t)) case zeitverfahren of zfEulerVorwaerts: // y(t+dt) = y(t) + y' dt @@ -1121,85 +1140,22 @@ begin end; {$ENDIF} t:=t+dT; - dT:=max(dT,dTMax/100); -end; - -function tGitter.dumpErhaltungsgroessen: boolean; -var i,j: integer; - ns: tExtendedArray; - pro: tProtokollant; - s: string; -begin - pro:=tProtokollant.create(prot,'dumpErhaltungsgroessen'); - setlength(ns,felders[aktuelleFelder].matAnz); - - result:=true; - - s:=''; - for i:=0 to length(ns)-1 do - ns[i]:=0; - for i:=0 to length(felders[aktuelleFelder].inhalt)-1 do - for j:=0 to length(ns)-1 do - ns[j]:= ns[j] + felders[aktuelleFelder].inhalt[i].matWerte[j,mfN,false]; - for i:=0 to length(ns)-1 do begin - ns[i]:=ns[i]*dX; - s:=s+ ' n['+inttostr(i)+']='+floattostr(ns[i]); - {$IFDEF Dichteueberwachung} - if (not abbruch) and (abs(ns[i]-felders[aktuelleFelder].massen[i])>0.5) then begin - result:=false; - pro.schreibe(' n['+inttostr(i)+'] ('+floattostr(ns[i])+') unterscheidet sich stark vom Anfangswert ('+floattostr(felders[aktuelleFelder].massen[i])+'), es scheinen sehr viele Teilchen entstanden oder verloren gegangen zu sein. Die Simulation wird abgebrochen. (t='+floattostr(t)+')',true); - end; - {$ENDIF} - end; - delete(s,1,1); - prot.schreibe(s); - pro.free; -end; - -procedure tGitter.berechne(was: char; teilchen: longint); -var - i: longint; - tmp: extended; - emF: tEMFeldInhalt; - maF: tMaterieFeldInhalt; -begin - if was='A' then begin - for i:=0 to length(felders[aktuelleFelder].inhalt)-1 do begin - tmp:=0; - for emF:=efAX to efAZ do - tmp:=tmp+sqr(felders[aktuelleFelder].inhalt[i].emWerte[emF,false]); - felders[aktuelleFelder].inhalt[i].emWerte[efA,false]:=sqrt(tmp); - end; - exit; - end; - if was='P' then begin - for i:=0 to length(felders[aktuelleFelder].inhalt)-1 do begin - tmp:=0; - for maF:=mfPX to mfPZ do - tmp:=tmp+sqr(felders[aktuelleFelder].inhalt[i].matWerte[teilchen,maF,false]); - felders[aktuelleFelder].inhalt[i].matWerte[teilchen,maF,false]:=sqrt(tmp); - end; - exit; - end; - prot.schreibe('Kann '''+was+''' nicht berechnen, weil ich es nicht verstehe!',true); - prot.destroyall; - halt; end; -{ tSimulation } +// tSimulation ***************************************************************** constructor tSimulation.create(inName: string; protokollant: tProtokollant; name: string); var - ifile: tMyStringlist; - zeitverfahren: tZeitverfahren; - s,t,aSuffix,aPrefix: string; - deltaX,breite,pDNMax: extended; - i: longint; - kvs: tKnownValues; - teilchen: array of tTeilchenSpezies; - lichter: tMyStringlist; - pro: tProtokollant; - na: pSigActionRec; + ifile: tMyStringlist; + zeitverfahren: tZeitverfahren; + s,t,aSuffix,aPrefix: string; + deltaX,breite,dPX,dPY,dPZ,pXMax,pYMax,pZMax: extended; + i: longint; + kvs: tKnownValues; + teilchen: array of tTeilchenSpezies; + lichter: tMyStringlist; + pro: tProtokollant; + na: pSigActionRec; begin inherited create; prot:=tProtokollant.create(protokollant,name); @@ -1227,20 +1183,24 @@ begin sDX:=-1; tEnde:=100; breite:=10.0; - pDNMax:=-1; fortschrittsAnzeige:=false; - dTMin:=-1; gotSighup:=false; + dPX:=-1; + dPY:=-1; + dPZ:=-1; + pXMax:=3; + pYMax:=3; + pZMax:=3; // Standardeinstellungen Bereich 'ausgaben' aPrefix:=extractfilepath(paramstr(0)); aSuffix:='.dat'; setlength(ausgabeDateien,0); - // Standardeinstellungen Breich 'lichtVon...' + // Standardeinstellungen Bereich 'lichtVon...' lichter:=tMyStringlist.create(prot,'lichter'); - // Standardeinstellungen Breich 'teilchen...' + // Standardeinstellungen Bereich 'teilchen...' setlength(teilchen,0); repeat @@ -1295,12 +1255,40 @@ begin kvs.add('dT',dT); continue; end; - if startetMit('minZeitschritt ',s) then begin - dTMin:=exprtofloat(false,s,kvs,nil); + if startetMit('impulsschritt ',s) then begin + if startetMit('x ',s) then begin + dPX:=exprtofloat(false,s,kvs,nil); + continue; + end; + if startetMit('y ',s) then begin + dPY:=exprtofloat(false,s,kvs,nil); + continue; + end; + if startetMit('z ',s) then begin + dPZ:=exprtofloat(false,s,kvs,nil); + continue; + end; + dPX:=exprtofloat(false,s,kvs,nil); + dPY:=dPX; + dPZ:=dPX; continue; end; - if startetMit('diffusionsterm ',s) then begin - pDNMax:=exprtofloat(false,s,kvs,nil); + if startetMit('maximalimpuls ',s) then begin + if startetMit('x ',s) then begin + pXMax:=exprtofloat(false,s,kvs,nil); + continue; + end; + if startetMit('y ',s) then begin + pYMax:=exprtofloat(false,s,kvs,nil); + continue; + end; + if startetMit('z ',s) then begin + pZMax:=exprtofloat(false,s,kvs,nil); + continue; + end; + pXMax:=exprtofloat(false,s,kvs,nil); + pYMax:=pXMax; + pZMax:=pXMax; continue; end; if startetMit('zeit ',s) then begin @@ -1443,8 +1431,13 @@ begin sT:=sDT/2; if sDX<0 then sDX:=deltaX; - if dTMin<0 then - dTMin:=min(1E-30,dT*1E-5); + + if dPX<0 then + dPX:=deltaX; + if dPY<0 then + dPY:=sqrt(deltaX); + if dPZ<0 then + dPZ:=sqrt(deltaX); pro:=tProtokollant.create(prot,'create'); case zeitverfahren of @@ -1466,7 +1459,12 @@ begin pro.schreibe('dX = '+floattostr(deltaX)); pro.schreibe('dT = '+floattostr(dT)); pro.schreibe('breite = '+floattostr(breite)+' (= '+inttostr(round(breite/deltaX)+1)+' Punkte)'); - pro.schreibe('pDNMax = '+floattostr(pDNMax)); + pro.schreibe('dPX = '+floattostr(dPX)); + pro.schreibe('pXMax = '+floattostr(pXMax)); + pro.schreibe('dPY = '+floattostr(dPY)); + pro.schreibe('pYMax = '+floattostr(pYMax)); + pro.schreibe('dPZ = '+floattostr(dPZ)); + pro.schreibe('pZMax = '+floattostr(pZMax)); pro.schreibe('bekannte Werte:'); kvs.dump(pro,' '); if length(teilchen)>0 then begin @@ -1505,7 +1503,7 @@ begin setlength(sighupSimulationen,length(sighupSimulationen)+1); sighupSimulationen[length(sighupSimulationen)-1]:=self; - gitter:=tGitter.create(self,round(breite/deltaX)+1,dT,deltaX,pDNMax,kvs,teilchen,lichter,zeitverfahren,prot,'gitter'); + gitter:=tGitter.create(self,round(breite/deltaX)+1,deltaX,kvs,teilchen,lichter,zeitverfahren,prot,'gitter',2*round(pXMax/dPX)+1,2*round(pYMax/dPY)+1,2*round(pZMax/dPZ)+1,dPX,dPY,dPZ); for i:=0 to length(teilchen)-1 do teilchen[i].free; setlength(teilchen,0); @@ -1541,7 +1539,7 @@ begin zeitPhysik:=zeitPhysik-now; if errorCode<2 then - gitter.iteriereSchritt(dT,dTMin); + gitter.iteriereSchritt(dT); zeitPhysik:=zeitPhysik+now; zeitDatei:=zeitDatei-now; while (gitter.t>=sT) and (sT<tEnde) do begin @@ -1558,11 +1556,6 @@ begin prot.schreibe(timetostr(now-start)+' ('+floattostr(zeitPhysik/max(1e-11,zeitPhysik+zeitDatei))+')',true); prot.schreibe('ETA: '+timetostr((now-start)*(tEnde-Gitter.t)/max(Gitter.t,dT)),true); prot.schreibe('aktueller Zeitschritt: '+floattostr(dT)+'T',true); - if errorCode<2 then - if not gitter.dumpErhaltungsgroessen then begin - errorCode:=2; - exit; - end; end; result:=gitter.t<tEnde; diff --git a/Plasmapropagation.lpi b/Plasmapropagation.lpi index c722825..fcb19b7 100644 --- a/Plasmapropagation.lpi +++ b/Plasmapropagation.lpi @@ -32,7 +32,7 @@ <LaunchingApplication PathPlusParams="/usr/bin/screen -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/> </local> </RunParams> - <Units Count="5"> + <Units Count="6"> <Unit0> <Filename Value="Plasmapropagation.lpr"/> <IsPartOfProject Value="True"/> @@ -53,6 +53,10 @@ <Filename Value="linearkombination.inc"/> <IsPartOfProject Value="True"/> </Unit4> + <Unit5> + <Filename Value="linearkombinationen.inc"/> + <IsPartOfProject Value="True"/> + </Unit5> </Units> </ProjectOptions> <CompilerOptions> diff --git a/Plasmapropagation.lps b/Plasmapropagation.lps index 6e683c8..b7f8821 100644 --- a/Plasmapropagation.lps +++ b/Plasmapropagation.lps @@ -3,7 +3,7 @@ <ProjectSession> <Version Value="9"/> <BuildModes Active="Default"/> - <Units Count="18"> + <Units Count="19"> <Unit0> <Filename Value="Plasmapropagation.lpr"/> <IsPartOfProject Value="True"/> @@ -15,13 +15,14 @@ <Unit1> <Filename Value="Physikunit.pas"/> <IsPartOfProject Value="True"/> + <IsVisibleTab Value="True"/> <EditorIndex Value="1"/> - <TopLine Value="620"/> - <CursorPos X="32" Y="673"/> - <FoldState Value=" T3mD0,5 pjSlM0A[94BjZ0803114 T0\8Q/0F171M"/> - <UsageCount Value="142"/> + <TopLine Value="1437"/> + <CursorPos X="40" Y="1467"/> + <FoldState Value=" T3m00/5 pjdlc0A[94Cja0B413 piXlT0E115]BckQ0a211122 p0v70G011 T0!QPc07121N"/> + <UsageCount Value="154"/> <Bookmarks Count="1"> - <Item0 Y="1077"/> + <Item0 Y="1096"/> </Bookmarks> <Loaded Value="True"/> </Unit1> @@ -30,34 +31,32 @@ <IsPartOfProject Value="True"/> <EditorIndex Value="-1"/> <CursorPos X="15" Y="46"/> - <UsageCount Value="104"/> + <UsageCount Value="116"/> </Unit2> <Unit3> <Filename Value="input.plap"/> <IsPartOfProject Value="True"/> - <EditorIndex Value="3"/> - <TopLine Value="9"/> - <CursorPos Y="29"/> - <UsageCount Value="103"/> + <EditorIndex Value="4"/> + <CursorPos X="44" Y="23"/> + <UsageCount Value="115"/> <Loaded Value="True"/> <DefaultSyntaxHighlighter Value="None"/> </Unit3> <Unit4> <Filename Value="linearkombination.inc"/> <IsPartOfProject Value="True"/> - <EditorIndex Value="2"/> - <TopLine Value="88"/> - <CursorPos X="50" Y="100"/> - <UsageCount Value="51"/> + <EditorIndex Value="3"/> + <TopLine Value="51"/> + <CursorPos X="62" Y="77"/> + <UsageCount Value="63"/> <Loaded Value="True"/> </Unit4> <Unit5> <Filename Value="input.epost"/> - <IsVisibleTab Value="True"/> - <EditorIndex Value="4"/> - <TopLine Value="13"/> - <CursorPos X="9" Y="27"/> - <UsageCount Value="85"/> + <EditorIndex Value="5"/> + <TopLine Value="22"/> + <CursorPos X="36" Y="29"/> + <UsageCount Value="91"/> <Loaded Value="True"/> <DefaultSyntaxHighlighter Value="None"/> </Unit5> @@ -67,14 +66,14 @@ <TopLine Value="366"/> <CursorPos X="27" Y="390"/> <FoldState Value=" T3i905B pj0jV034 piaj60U511+"/> - <UsageCount Value="16"/> + <UsageCount Value="15"/> </Unit6> <Unit7> <Filename Value="../units/lowlevelunit.pas"/> <EditorIndex Value="-1"/> <TopLine Value="46"/> <CursorPos X="3" Y="12"/> - <UsageCount Value="9"/> + <UsageCount Value="8"/> </Unit7> <Unit8> <Filename Value="../units/mystringlistunit.pas"/> @@ -82,187 +81,196 @@ <TopLine Value="367"/> <CursorPos X="17" Y="390"/> <FoldState Value=" T3i3075 piZjD0WQ"/> - <UsageCount Value="7"/> + <UsageCount Value="6"/> </Unit8> <Unit9> <Filename Value="../epost/werteunit.pas"/> <EditorIndex Value="-1"/> <TopLine Value="950"/> <CursorPos X="30" Y="1054"/> - <UsageCount Value="4"/> + <UsageCount Value="3"/> </Unit9> <Unit10> <Filename Value="../epost/typenunit.pas"/> <EditorIndex Value="-1"/> <TopLine Value="347"/> <CursorPos X="62" Y="358"/> - <UsageCount Value="4"/> + <UsageCount Value="3"/> </Unit10> <Unit11> <Filename Value="../units/systemunit.pas"/> <EditorIndex Value="-1"/> <CursorPos X="3" Y="79"/> - <UsageCount Value="4"/> + <UsageCount Value="3"/> </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="4"/> + <UsageCount Value="3"/> </Unit12> <Unit13> <Filename Value="rk14.inc"/> <EditorIndex Value="-1"/> - <UsageCount Value="7"/> + <UsageCount Value="6"/> </Unit13> <Unit14> <Filename Value="rk1210.inc"/> <EditorIndex Value="-1"/> <TopLine Value="492"/> <CursorPos X="28" Y="565"/> - <UsageCount Value="8"/> + <UsageCount Value="7"/> </Unit14> <Unit15> <Filename Value="rk1412.inc"/> <EditorIndex Value="-1"/> <TopLine Value="945"/> <CursorPos X="5" Y="985"/> - <UsageCount Value="8"/> + <UsageCount Value="7"/> </Unit15> <Unit16> <Filename Value="rk108.inc"/> <EditorIndex Value="-1"/> <CursorPos X="28" Y="8"/> - <UsageCount Value="8"/> + <UsageCount Value="7"/> </Unit16> <Unit17> <Filename Value="rk3_8.inc"/> <EditorIndex Value="-1"/> - <CursorPos X="75" Y="23"/> - <UsageCount Value="9"/> + <CursorPos X="41" Y="6"/> + <UsageCount Value="10"/> </Unit17> + <Unit18> + <Filename Value="linearkombinationen.inc"/> + <IsPartOfProject Value="True"/> + <EditorIndex Value="2"/> + <TopLine Value="89"/> + <CursorPos X="77" Y="102"/> + <UsageCount Value="26"/> + <Loaded Value="True"/> + </Unit18> </Units> <JumpHistory Count="30" HistoryIndex="29"> <Position1> <Filename Value="Physikunit.pas"/> - <Caret Line="126" Column="17" TopLine="93"/> + <Caret Line="954" Column="69" TopLine="934"/> </Position1> <Position2> <Filename Value="Physikunit.pas"/> - <Caret Line="521" Column="50" TopLine="433"/> + <Caret Line="1237" Column="13" TopLine="1202"/> </Position2> <Position3> <Filename Value="Physikunit.pas"/> - <Caret Line="550" Column="51" TopLine="509"/> + <Caret Line="1146" Column="30" TopLine="968"/> </Position3> <Position4> <Filename Value="Physikunit.pas"/> - <Caret Line="551" Column="51" TopLine="510"/> + <Caret Line="202" Column="46" TopLine="178"/> </Position4> <Position5> <Filename Value="Physikunit.pas"/> - <Caret Line="665" Column="28" TopLine="326"/> + <Caret Line="125" Column="25" TopLine="98"/> </Position5> <Position6> <Filename Value="Physikunit.pas"/> - <Caret Line="798" Column="44" TopLine="765"/> + <Caret Line="705" Column="38" TopLine="641"/> </Position6> <Position7> <Filename Value="Physikunit.pas"/> - <Caret Line="799" Column="25" TopLine="766"/> + <Caret Line="715" Column="17" TopLine="691"/> </Position7> <Position8> <Filename Value="Physikunit.pas"/> - <Caret Line="800" Column="34" TopLine="767"/> + <Caret Line="742" Column="23" TopLine="724"/> </Position8> <Position9> <Filename Value="Physikunit.pas"/> - <Caret Line="801" Column="51" TopLine="774"/> + <Caret Line="941" Column="26" TopLine="851"/> </Position9> <Position10> <Filename Value="Physikunit.pas"/> - <Caret Line="67" Column="22" TopLine="47"/> + <Caret Line="125" TopLine="114"/> </Position10> <Position11> <Filename Value="Physikunit.pas"/> - <Caret Line="425" Column="4" TopLine="210"/> + <Caret Line="725" Column="41" TopLine="692"/> </Position11> <Position12> <Filename Value="Physikunit.pas"/> - <Caret Line="438" Column="63" TopLine="216"/> + <Caret Line="24" Column="10" TopLine="24"/> </Position12> <Position13> <Filename Value="Physikunit.pas"/> - <Caret Line="801" Column="51" TopLine="768"/> + <Caret Line="203" Column="50" TopLine="183"/> </Position13> <Position14> <Filename Value="Physikunit.pas"/> - <Caret Line="1385" Column="60" TopLine="1232"/> + <Caret Line="721" TopLine="692"/> </Position14> <Position15> <Filename Value="Physikunit.pas"/> - <Caret Line="789" Column="63" TopLine="773"/> + <Caret Line="734" TopLine="714"/> </Position15> <Position16> <Filename Value="Physikunit.pas"/> - <Caret Line="10" Column="28"/> + <Caret Line="731" Column="53" TopLine="714"/> </Position16> <Position17> <Filename Value="Physikunit.pas"/> - <Caret Line="1024" Column="31" TopLine="784"/> + <Caret Line="724" Column="22" TopLine="692"/> </Position17> <Position18> <Filename Value="Physikunit.pas"/> - <Caret Line="1067" Column="29" TopLine="1056"/> + <Caret Line="124" Column="38" TopLine="89"/> </Position18> <Position19> <Filename Value="Physikunit.pas"/> - <Caret Line="1019" TopLine="861"/> + <Caret Line="125" Column="38" TopLine="125"/> </Position19> <Position20> <Filename Value="Physikunit.pas"/> - <Caret Line="11" Column="3"/> + <Caret Line="957" Column="38" TopLine="925"/> </Position20> <Position21> <Filename Value="Physikunit.pas"/> - <Caret Line="1023" Column="5" TopLine="1000"/> + <Caret Line="641" TopLine="560"/> </Position21> <Position22> <Filename Value="Physikunit.pas"/> - <Caret Line="9" Column="33"/> + <Caret Line="101" TopLine="77"/> </Position22> <Position23> <Filename Value="Physikunit.pas"/> - <Caret Line="991" Column="36" TopLine="787"/> + <Caret Line="100" Column="15" TopLine="80"/> </Position23> <Position24> - <Filename Value="input.epost"/> - <Caret Line="27" TopLine="5"/> + <Filename Value="Physikunit.pas"/> + <Caret Line="661" Column="87" TopLine="520"/> </Position24> <Position25> - <Filename Value="input.epost"/> - <Caret Line="44" Column="15" TopLine="5"/> + <Filename Value="Physikunit.pas"/> + <Caret Line="641" Column="52" TopLine="521"/> </Position25> <Position26> - <Filename Value="input.epost"/> - <Caret Line="56" Column="27" TopLine="19"/> + <Filename Value="Physikunit.pas"/> + <Caret Line="100" Column="62" TopLine="80"/> </Position26> <Position27> - <Filename Value="input.epost"/> - <Caret Line="47" TopLine="25"/> + <Filename Value="Physikunit.pas"/> + <Caret Line="802" Column="120" TopLine="765"/> </Position27> <Position28> - <Filename Value="input.epost"/> - <Caret Line="57" TopLine="25"/> + <Filename Value="Physikunit.pas"/> + <Caret Line="794" Column="66" TopLine="765"/> </Position28> <Position29> <Filename Value="Physikunit.pas"/> - <Caret Line="989" Column="35" TopLine="903"/> + <Caret Line="128" Column="59" TopLine="110"/> </Position29> <Position30> <Filename Value="Physikunit.pas"/> - <Caret Line="24" Column="13"/> + <Caret Line="995" Column="49" TopLine="1078"/> </Position30> </JumpHistory> </ProjectSession> @@ -7,11 +7,11 @@ allgemein runge-Kutta-3/8 # runge-Kutta-4 # euler-Vorwärts - ortsschritt 2*10^-3 * λ - zeitschritt 2*10^-3 * T - minZeitschritt 2*10^-3 * T + ortsschritt 10^-2 * λ + zeitschritt 10^-2 * T +# minZeitschritt 10^-2 * T zeit 40 * T - diffusionsterm 2 # max. p/Lp +# diffusionsterm 2 # max. p/Lp !setze $breite: (5 * λ) breite $breite mit Fortschrittsanzeige @@ -20,7 +20,7 @@ allgemeinEnde ausgaben prefix /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Daten/ suffix _test.dat - felder AX,AY,dAYDT,dPhiDX,N1,dPsiDX1,Gamma1,N2,dPsiDX2,Gamma2 + felder AX,AY,dAYDT,EX,BY,BZ,Rho1,Rho2 ausgabenEnde !setze $tFwhm: (2.5 * T) diff --git a/linearkombination.inc b/linearkombination.inc index 6250006..0f74497 100644 --- a/linearkombination.inc +++ b/linearkombination.inc @@ -1,7 +1,93 @@ +// Werte werden auf (in1 + \sum_i faki * ini') gesetzt + +procedure tImpulsPunkt.liKo(in1,in2 +{$IFDEF lkA3},in3 +{$IFDEF lkA4},in4 +{$IFDEF lkA5},in5 +{$IFDEF lkA6},in6 +{$IFDEF lkA7},in7 +{$IFDEF lkA8},in8 +{$IFDEF lkA9},in9 +{$IFDEF lkA10},in10 +{$IFDEF lkA11},in11 +{$IFDEF lkA12},in12 +{$IFDEF lkA14},in13,in14 +{$IFDEF lkA15},in15 +{$IFDEF lkA16},in16 +{$IFDEF lkA17},in17 +{$IFDEF lkA18},in18 +{$IFDEF lkA19},in19 +{$IFDEF lkA22},in20,in21,in22 +{$IFDEF lkA23},in23 +{$IFDEF lkA31},in24,in25,in26,in27,in28,in29,in30,in31 +{$IFDEF lkA32},in32 +{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}: tImpulsPunkt; +fak2 +{$IFDEF lkA3},fak3 +{$IFDEF lkA4},fak4 +{$IFDEF lkA5},fak5 +{$IFDEF lkA6},fak6 +{$IFDEF lkA7},fak7 +{$IFDEF lkA8},fak8 +{$IFDEF lkA9},fak9 +{$IFDEF lkA10},fak10 +{$IFDEF lkA11},fak11 +{$IFDEF lkA12},fak12 +{$IFDEF lkA14},fak13,fak14 +{$IFDEF lkA15},fak15 +{$IFDEF lkA16},fak16 +{$IFDEF lkA17},fak17 +{$IFDEF lkA18},fak18 +{$IFDEF lkA19},fak19 +{$IFDEF lkA22},fak20,fak21,fak22 +{$IFDEF lkA23},fak23 +{$IFDEF lkA31},fak24,fak25,fak26,fak27,fak28,fak29,fak30,fak31 +{$IFDEF lkA32},fak32 +{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}: extended); +var + i: longint; +begin + for i:=0 to length(werte)-1 do + werte[i,false]:= + in1.werte[i,false] + + fak2 * in2.werte[i,true] {$IFDEF lkA3} + + fak3 * in3.werte[i,true] {$IFDEF lkA4} + + fak4 * in4.werte[i,true] {$IFDEF lkA5} + + fak5 * in5.werte[i,true] {$IFDEF lkA6} + + fak6 * in6.werte[i,true] {$IFDEF lkA7} + + fak7 * in7.werte[i,true] {$IFDEF lkA8} + + fak8 * in8.werte[i,true] {$IFDEF lkA9} + + fak9 * in9.werte[i,true] {$IFDEF lkA10} + + fak10 * in10.werte[i,true] {$IFDEF lkA11} + + fak11 * in11.werte[i,true] {$IFDEF lkA12} + + fak12 * in12.werte[i,true] {$IFDEF lkA14} + + fak13 * in13.werte[i,true] + + fak14 * in14.werte[i,true] {$IFDEF lkA15} + + fak15 * in15.werte[i,true] {$IFDEF lkA16} + + fak16 * in16.werte[i,true] {$IFDEF lkA17} + + fak17 * in17.werte[i,true] {$IFDEF lkA18} + + fak18 * in18.werte[i,true] {$IFDEF lkA19} + + fak19 * in19.werte[i,true] {$IFDEF lkA22} + + fak20 * in20.werte[i,true] + + fak21 * in21.werte[i,true] + + fak22 * in22.werte[i,true] {$IFDEF lkA23} + + fak23 * in23.werte[i,true] {$IFDEF lkA31} + + fak24 * in24.werte[i,true] + + fak25 * in25.werte[i,true] + + fak26 * in26.werte[i,true] + + fak27 * in27.werte[i,true] + + fak28 * in28.werte[i,true] + + fak29 * in29.werte[i,true] + + fak30 * in30.werte[i,true] + + fak31 * in31.werte[i,true] {$IFDEF lkA32} + + fak32 * in32.werte[i,true] + {$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}; + +end; // Werte werden auf (in1 + \sum_i faki * ini') gesetzt -procedure tWertePunkt.liKo(in1,in2 +procedure tRaumPunkt.liKo(in1,in2 {$IFDEF lkA3},in3 {$IFDEF lkA4},in4 {$IFDEF lkA5},in5 @@ -22,7 +108,7 @@ procedure tWertePunkt.liKo(in1,in2 {$IFDEF lkA23},in23 {$IFDEF lkA31},in24,in25,in26,in27,in28,in29,in30,in31 {$IFDEF lkA32},in32 -{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}: tWertePunkt; +{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}: tRaumPunkt; fak2 {$IFDEF lkA3},fak3 {$IFDEF lkA4},fak4 @@ -46,8 +132,7 @@ fak2 {$IFDEF lkA32},fak32 {$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}: extended); var - emF: tEMFeldInhalt; - maF: tMaterieFeldInhalt; + emF: tEMFeldGroesze; i: longint; begin (* tEMFeldInhalt = ( @@ -56,82 +141,87 @@ begin efDPhiDX ); *) for emF:=erstesEMFMitAbleitung to letztesEMFMitAbleitung do - emWerte[emF,false]:= - in1.emWerte[emF,false] - + fak2 * in2.emWerte[emF,true] {$IFDEF lkA3} - + fak3 * in3.emWerte[emF,true] {$IFDEF lkA4} - + fak4 * in4.emWerte[emF,true] {$IFDEF lkA5} - + fak5 * in5.emWerte[emF,true] {$IFDEF lkA6} - + fak6 * in6.emWerte[emF,true] {$IFDEF lkA7} - + fak7 * in7.emWerte[emF,true] {$IFDEF lkA8} - + fak8 * in8.emWerte[emF,true] {$IFDEF lkA9} - + fak9 * in9.emWerte[emF,true] {$IFDEF lkA10} - + fak10 * in10.emWerte[emF,true] {$IFDEF lkA11} - + fak11 * in11.emWerte[emF,true] {$IFDEF lkA12} - + fak12 * in12.emWerte[emF,true] {$IFDEF lkA14} - + fak13 * in13.emWerte[emF,true] - + fak14 * in14.emWerte[emF,true] {$IFDEF lkA15} - + fak15 * in15.emWerte[emF,true] {$IFDEF lkA16} - + fak16 * in16.emWerte[emF,true] {$IFDEF lkA17} - + fak17 * in17.emWerte[emF,true] {$IFDEF lkA18} - + fak18 * in18.emWerte[emF,true] {$IFDEF lkA19} - + fak19 * in19.emWerte[emF,true] {$IFDEF lkA22} - + fak20 * in20.emWerte[emF,true] - + fak21 * in21.emWerte[emF,true] - + fak22 * in22.emWerte[emF,true] {$IFDEF lkA23} - + fak23 * in23.emWerte[emF,true] {$IFDEF lkA31} - + fak24 * in24.emWerte[emF,true] - + fak25 * in25.emWerte[emF,true] - + fak26 * in26.emWerte[emF,true] - + fak27 * in27.emWerte[emF,true] - + fak28 * in28.emWerte[emF,true] - + fak29 * in29.emWerte[emF,true] - + fak30 * in30.emWerte[emF,true] - + fak31 * in31.emWerte[emF,true] {$IFDEF lkA32} - + fak32 * in32.emWerte[emF,true] + emFelder[emF,false]:= + in1.emFelder[emF,false] + + fak2 * in2.emFelder[emF,true] {$IFDEF lkA3} + + fak3 * in3.emFelder[emF,true] {$IFDEF lkA4} + + fak4 * in4.emFelder[emF,true] {$IFDEF lkA5} + + fak5 * in5.emFelder[emF,true] {$IFDEF lkA6} + + fak6 * in6.emFelder[emF,true] {$IFDEF lkA7} + + fak7 * in7.emFelder[emF,true] {$IFDEF lkA8} + + fak8 * in8.emFelder[emF,true] {$IFDEF lkA9} + + fak9 * in9.emFelder[emF,true] {$IFDEF lkA10} + + fak10 * in10.emFelder[emF,true] {$IFDEF lkA11} + + fak11 * in11.emFelder[emF,true] {$IFDEF lkA12} + + fak12 * in12.emFelder[emF,true] {$IFDEF lkA14} + + fak13 * in13.emFelder[emF,true] + + fak14 * in14.emFelder[emF,true] {$IFDEF lkA15} + + fak15 * in15.emFelder[emF,true] {$IFDEF lkA16} + + fak16 * in16.emFelder[emF,true] {$IFDEF lkA17} + + fak17 * in17.emFelder[emF,true] {$IFDEF lkA18} + + fak18 * in18.emFelder[emF,true] {$IFDEF lkA19} + + fak19 * in19.emFelder[emF,true] {$IFDEF lkA22} + + fak20 * in20.emFelder[emF,true] + + fak21 * in21.emFelder[emF,true] + + fak22 * in22.emFelder[emF,true] {$IFDEF lkA23} + + fak23 * in23.emFelder[emF,true] {$IFDEF lkA31} + + fak24 * in24.emFelder[emF,true] + + fak25 * in25.emFelder[emF,true] + + fak26 * in26.emFelder[emF,true] + + fak27 * in27.emFelder[emF,true] + + fak28 * in28.emFelder[emF,true] + + fak29 * in29.emFelder[emF,true] + + fak30 * in30.emFelder[emF,true] + + fak31 * in31.emFelder[emF,true] {$IFDEF lkA32} + + fak32 * in32.emFelder[emF,true] {$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}; -(* tMaterieFeldInhalt = ( - mfN,mfDPsiDX, - mfP,mfPX,mfPY,mfPZ, - mfGamma,mfIGamma - ); *) - for i:=0 to length(matWerte)-1 do // siehe oben - for maF:=erstesMatFMitAbleitung to letztesMatFMitAbleitung do - matWerte[i,maF,false]:= - in1.matWerte[i,maF,false] - + fak2 * in2.matWerte[i,maF,true] {$IFDEF lkA3} - + fak3 * in3.matWerte[i,maF,true] {$IFDEF lkA4} - + fak4 * in4.matWerte[i,maF,true] {$IFDEF lkA5} - + fak5 * in5.matWerte[i,maF,true] {$IFDEF lkA6} - + fak6 * in6.matWerte[i,maF,true] {$IFDEF lkA7} - + fak7 * in7.matWerte[i,maF,true] {$IFDEF lkA8} - + fak8 * in8.matWerte[i,maF,true] {$IFDEF lkA9} - + fak9 * in9.matWerte[i,maF,true] {$IFDEF lkA10} - + fak10 * in10.matWerte[i,maF,true] {$IFDEF lkA11} - + fak11 * in11.matWerte[i,maF,true] {$IFDEF lkA12} - + fak12 * in12.matWerte[i,maF,true] {$IFDEF lkA14} - + fak13 * in13.matWerte[i,maF,true] - + fak14 * in14.matWerte[i,maF,true] {$IFDEF lkA15} - + fak15 * in15.matWerte[i,maF,true] {$IFDEF lkA16} - + fak16 * in16.matWerte[i,maF,true] {$IFDEF lkA17} - + fak17 * in17.matWerte[i,maF,true] {$IFDEF lkA18} - + fak18 * in18.matWerte[i,maF,true] {$IFDEF lkA19} - + fak19 * in19.matWerte[i,maF,true] {$IFDEF lkA22} - + fak20 * in20.matWerte[i,maF,true] - + fak21 * in21.matWerte[i,maF,true] - + fak22 * in22.matWerte[i,maF,true] {$IFDEF lkA23} - + fak23 * in23.matWerte[i,maF,true] {$IFDEF lkA31} - + fak24 * in24.matWerte[i,maF,true] - + fak25 * in25.matWerte[i,maF,true] - + fak26 * in26.matWerte[i,maF,true] - + fak27 * in27.matWerte[i,maF,true] - + fak28 * in28.matWerte[i,maF,true] - + fak29 * in29.matWerte[i,maF,true] - + fak30 * in30.matWerte[i,maF,true] - + fak31 * in31.matWerte[i,maF,true] {$IFDEF lkA32} - + fak32 * in32.matWerte[i,maF,true] - {$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}; + for i:=0 to length(phasenraum)-1 do + phasenraum[i].liKo( + in1.phasenraum[i],in2.phasenraum[i] + {$IFDEF lkA3},in3.phasenraum[i] + {$IFDEF lkA4},in4.phasenraum[i] + {$IFDEF lkA5},in5.phasenraum[i] + {$IFDEF lkA6},in6.phasenraum[i] + {$IFDEF lkA7},in7.phasenraum[i] + {$IFDEF lkA8},in8.phasenraum[i] + {$IFDEF lkA9},in9.phasenraum[i] + {$IFDEF lkA10},in10.phasenraum[i] + {$IFDEF lkA11},in11.phasenraum[i] + {$IFDEF lkA12},in12.phasenraum[i] + {$IFDEF lkA14},in13.phasenraum[i],in14.phasenraum[i] + {$IFDEF lkA15},in15.phasenraum[i] + {$IFDEF lkA16},in16.phasenraum[i] + {$IFDEF lkA17},in17.phasenraum[i] + {$IFDEF lkA18},in18.phasenraum[i] + {$IFDEF lkA19},in19.phasenraum[i] + {$IFDEF lkA22},in20.phasenraum[i],in21.phasenraum[i],in22.phasenraum[i] + {$IFDEF lkA23},in23.phasenraum[i] + {$IFDEF lkA31},in24.phasenraum[i],in25.phasenraum[i],in26.phasenraum[i],in27.phasenraum[i],in28.phasenraum[i],in29.phasenraum[i],in30.phasenraum[i],in31.phasenraum[i] + {$IFDEF lkA32},in32.phasenraum[i] + {$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}, + fak2 + {$IFDEF lkA3},fak3 + {$IFDEF lkA4},fak4 + {$IFDEF lkA5},fak5 + {$IFDEF lkA6},fak6 + {$IFDEF lkA7},fak7 + {$IFDEF lkA8},fak8 + {$IFDEF lkA9},fak9 + {$IFDEF lkA10},fak10 + {$IFDEF lkA11},fak11 + {$IFDEF lkA12},fak12 + {$IFDEF lkA14},fak13,fak14 + {$IFDEF lkA15},fak15 + {$IFDEF lkA16},fak16 + {$IFDEF lkA17},fak17 + {$IFDEF lkA18},fak18 + {$IFDEF lkA19},fak19 + {$IFDEF lkA22},fak20,fak21,fak22 + {$IFDEF lkA23},fak23 + {$IFDEF lkA31},fak24,fak25,fak26,fak27,fak28,fak29,fak30,fak31 + {$IFDEF lkA32},fak32 + {$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}); end; // Werte werden auf (in1 + \sum_i faki * ini') gesetzt @@ -233,4 +323,3 @@ begin inhalt[i].nichtnegativieren; end; - diff --git a/linearkombinationen.inc b/linearkombinationen.inc new file mode 100644 index 0000000..724c695 --- /dev/null +++ b/linearkombinationen.inc @@ -0,0 +1,129 @@ + +// interface ******************************************************************* + +{$IFDEF LiKotImpulsPunktHeader} +procedure liKo(in1,in2: tImpulsPunkt; fak2: extended); overload; // Werte werden auf (in1 + \sum_i faki * ini') gesetzt +procedure liKo(in1,in2,in3: tImpulsPunkt; fak2,fak3: extended); overload; +procedure liKo(in1,in2,in3,in4: tImpulsPunkt; fak2,fak3,fak4: extended); overload; +procedure liKo(in1,in2,in3,in4,in5: tImpulsPunkt; fak2,fak3,fak4,fak5: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6: tImpulsPunkt; fak2,fak3,fak4,fak5,fak6: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7: tImpulsPunkt; fak2,fak3,fak4,fak5,fak6,fak7: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8: tImpulsPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9: tImpulsPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10: tImpulsPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11: tImpulsPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12: tImpulsPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14: tImpulsPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15: tImpulsPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16: tImpulsPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17: tImpulsPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18: tImpulsPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19: tImpulsPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19,in20,in21,in22: tImpulsPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19,fak20,fak21,fak22: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19,in20,in21,in22,in23: tImpulsPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19,fak20,fak21,fak22,fak23: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19,in20,in21,in22,in23,in24,in25,in26,in27,in28,in29,in30,in31: tImpulsPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19,fak20,fak21,fak22,fak23,fak24,fak25,fak26,fak27,fak28,fak29,fak30,fak31: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19,in20,in21,in22,in23,in24,in25,in26,in27,in28,in29,in30,in31,in32: tImpulsPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19,fak20,fak21,fak22,fak23,fak24,fak25,fak26,fak27,fak28,fak29,fak30,fak31,fak32: extended); overload; +{$ENDIF} + +{$IFDEF LiKotRaumPunktHeader} +procedure liKo(in1,in2: tRaumPunkt; fak2: extended); overload; // Werte werden auf (in1 + \sum_i faki * ini') gesetzt +procedure liKo(in1,in2,in3: tRaumPunkt; fak2,fak3: extended); overload; +procedure liKo(in1,in2,in3,in4: tRaumPunkt; fak2,fak3,fak4: extended); overload; +procedure liKo(in1,in2,in3,in4,in5: tRaumPunkt; fak2,fak3,fak4,fak5: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6: tRaumPunkt; fak2,fak3,fak4,fak5,fak6: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7: tRaumPunkt; fak2,fak3,fak4,fak5,fak6,fak7: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8: tRaumPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9: tRaumPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10: tRaumPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11: tRaumPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12: tRaumPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14: tRaumPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15: tRaumPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16: tRaumPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17: tRaumPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18: tRaumPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19: tRaumPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19,in20,in21,in22: tRaumPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19,fak20,fak21,fak22: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19,in20,in21,in22,in23: tRaumPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19,fak20,fak21,fak22,fak23: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19,in20,in21,in22,in23,in24,in25,in26,in27,in28,in29,in30,in31: tRaumPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19,fak20,fak21,fak22,fak23,fak24,fak25,fak26,fak27,fak28,fak29,fak30,fak31: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19,in20,in21,in22,in23,in24,in25,in26,in27,in28,in29,in30,in31,in32: tRaumPunkt; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19,fak20,fak21,fak22,fak23,fak24,fak25,fak26,fak27,fak28,fak29,fak30,fak31,fak32: extended); overload; +{$ENDIF} + +{$IFDEF LiKotFelderHeader} +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; +procedure liKo(in1,in2,in3,in4,in5: tFelder; fak2,fak3,fak4,fak5: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6: tFelder; fak2,fak3,fak4,fak5,fak6: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7: tFelder; fak2,fak3,fak4,fak5,fak6,fak7: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19,in20,in21,in22: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19,fak20,fak21,fak22: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19,in20,in21,in22,in23: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19,fak20,fak21,fak22,fak23: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19,in20,in21,in22,in23,in24,in25,in26,in27,in28,in29,in30,in31: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19,fak20,fak21,fak22,fak23,fak24,fak25,fak26,fak27,fak28,fak29,fak30,fak31: extended); overload; +procedure liKo(in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15,in16,in17,in18,in19,in20,in21,in22,in23,in24,in25,in26,in27,in28,in29,in30,in31,in32: tFelder; fak2,fak3,fak4,fak5,fak6,fak7,fak8,fak9,fak10,fak11,fak12,fak13,fak14,fak15,fak16,fak17,fak18,fak19,fak20,fak21,fak22,fak23,fak24,fak25,fak26,fak27,fak28,fak29,fak30,fak31,fak32: extended); overload; +{$ENDIF} + + + + + + + + +// implementation ************************************************************** + +{$IFDEF LiKoimplementation} + +{$INCLUDE linearkombination.inc} +{$DEFINE lkA3} +{$INCLUDE linearkombination.inc} +{$DEFINE lkA4} +{$INCLUDE linearkombination.inc} +{$DEFINE lkA5} +{$INCLUDE linearkombination.inc} +{$DEFINE lkA6} +{$INCLUDE linearkombination.inc} +{$DEFINE lkA7} +{$INCLUDE linearkombination.inc} +{$DEFINE lkA8} +{$INCLUDE linearkombination.inc} +{$DEFINE lkA9} +{$INCLUDE linearkombination.inc} +{$DEFINE lkA10} +{$INCLUDE linearkombination.inc} +{$DEFINE lkA11} +{$INCLUDE linearkombination.inc} +{$DEFINE lkA12} +{$INCLUDE linearkombination.inc} +{$DEFINE lkA14} +{$INCLUDE linearkombination.inc} +{$DEFINE lkA15} +{$INCLUDE linearkombination.inc} +{$DEFINE lkA16} +{$INCLUDE linearkombination.inc} +{$DEFINE lkA17} +{$INCLUDE linearkombination.inc} +{$DEFINE lkA18} +{$INCLUDE linearkombination.inc} +{$DEFINE lkA19} +{$INCLUDE linearkombination.inc} +{$DEFINE lkA22} +{$INCLUDE linearkombination.inc} +{$DEFINE lkA23} +{$INCLUDE linearkombination.inc} +{$DEFINE lkA31} +{$INCLUDE linearkombination.inc} +{$DEFINE lkA32} +{$INCLUDE linearkombination.inc} + +{$ENDIF} @@ -3,10 +3,8 @@ felders[aktuelleFelder], 0.1 * dT ); - felders[2].berechneAbleitungen(dX,iDX,pDNMax); + felders[2].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(2,dTMax,dT,dTMin) then - continue; felders[3].liKo( felders[aktuelleFelder], @@ -15,10 +13,8 @@ -0.91517656137529144052001501927534215431895138766436972056466 * dT, 1.45453440217827322805250021715664459117622483736537873607016 * dT ); - felders[3].berechneAbleitungen(dX,iDX,pDNMax); + felders[3].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(3,dTMax,dT,dTMin) then - continue; felders[4].liKo( felders[aktuelleFelder], @@ -27,10 +23,8 @@ 0.202259190301118170324681949205488413821477543637878380814562 * dT, 0.606777570903354510974045847616465241464432630913635142443687 * dT ); - felders[4].berechneAbleitungen(dX,iDX,pDNMax); + felders[4].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(4,dTMax,dT,dTMin) then - continue; felders[5].liKo( felders[aktuelleFelder], @@ -41,10 +35,8 @@ 0.197966831227192369068141770510388793370637287463360401555746 * dT, -0.0729547847313632629185146671595558023015011608914382961421311 * dT ); - felders[5].berechneAbleitungen(dX,iDX,pDNMax); + felders[5].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(5,dTMax,dT,dTMin) then - continue; felders[6].liKo( felders[aktuelleFelder], @@ -55,10 +47,8 @@ 0.410459702520260645318174895920453426088035325902848695210406 * dT, 0.482713753678866489204726942976896106809132737721421333413261 * dT ); - felders[6].berechneAbleitungen(dX,iDX,pDNMax); + felders[6].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(6,dTMax,dT,dTMin) then - continue; felders[7].liKo( felders[aktuelleFelder], @@ -71,10 +61,8 @@ 0.48966295730945019284450701113589820117801547843379009721079 * dT, -0.0731856375070850736789057580558988816340355615025188195854775 * dT ); - felders[7].berechneAbleitungen(dX,iDX,pDNMax); + felders[7].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(7,dTMax,dT,dTMin) then - continue; felders[8].liKo( felders[aktuelleFelder], @@ -87,10 +75,8 @@ 0.0325402621549091330158899334391231259332716675992700000776101 * dT, -0.0595780211817361001560122202563305121444953672762930724538856 * dT ); - felders[8].berechneAbleitungen(dX,iDX,pDNMax); + felders[8].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(8,dTMax,dT,dTMin) then - continue; felders[9].liKo( felders[aktuelleFelder], @@ -103,10 +89,8 @@ 0.32176370560177839010089879904987890408140436860307712925111 * dT, 0.51048572560806303157775901228512341674467213703175235406759 * dT ); - felders[9].berechneAbleitungen(dX,iDX,pDNMax); + felders[9].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(9,dTMax,dT,dTMin) then - continue; felders[10].liKo( felders[aktuelleFelder], @@ -121,10 +105,8 @@ 0.499269229556880061353316843969978567860276816592673201240332 * dT, 0.50950460892968610423609869004538625398664323235298960218506 * dT ); - felders[10].berechneAbleitungen(dX,iDX,pDNMax); + felders[10].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(10,dTMax,dT,dTMin) then - continue; felders[11].liKo( felders[aktuelleFelder], @@ -141,10 +123,8 @@ 0.0107558956873607455550609147441477450257136782823280838547024 * dT, -0.327769124164018874147061087350233395378262992392394071906457 * dT ); - felders[11].berechneAbleitungen(dX,iDX,pDNMax); + felders[11].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(11,dTMax,dT,dTMin) then - continue; felders[12].liKo( felders[aktuelleFelder], @@ -163,10 +143,8 @@ -0.0782942710351670777553986729725692447252077047239160551335016 * dT, -0.114503299361098912184303164290554670970133218405658122674674 * dT ); - felders[12].berechneAbleitungen(dX,iDX,pDNMax); + felders[12].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(12,dTMax,dT,dTMin) then - continue; felders[13].liKo( felders[aktuelleFelder], @@ -191,10 +169,8 @@ -3.25479342483643918654589367587788726747711504674780680269911 * dT, -2.16343541686422982353954211300054820889678036420109999154887 * dT ); - felders[13].berechneAbleitungen(dX,iDX,pDNMax); + felders[13].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(13,dTMax,dT,dTMin) then - continue; felders[14].liKo( felders[aktuelleFelder], @@ -221,10 +197,8 @@ -1.71561608285936264922031819751349098912615880827551992973034 * dT, -0.0244036405750127452135415444412216875465593598370910566069132 * dT ); - felders[14].berechneAbleitungen(dX,iDX,pDNMax); + felders[14].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(14,dTMax,dT,dTMin) then - continue; felders[15].liKo( felders[aktuelleFelder], @@ -241,10 +215,8 @@ 0.0910895662155176069593203555807484200111889091770101799647985 * dT, 0.777333643644968233538931228575302137803351053629547286334469 * dT ); - felders[15].berechneAbleitungen(dX,iDX,pDNMax); + felders[15].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(15,dTMax,dT,dTMin) then - continue; felders[16].liKo( felders[aktuelleFelder], @@ -255,10 +227,8 @@ -0.157178665799771163367058998273128921867183754126709419409654 * dT, 0.157178665799771163367058998273128921867183754126709419409654 * dT ); - felders[16].berechneAbleitungen(dX,iDX,pDNMax); + felders[16].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(16,dTMax,dT,dTMin) then - continue; felders[17].liKo( felders[aktuelleFelder], @@ -293,10 +263,8 @@ -0.34275815984718983994222055341385087174233873470395891993726 * dT, -0.675 * dT ); - felders[17].berechneAbleitungen(dX,iDX,pDNMax); + felders[17].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(17,dTMax,dT,dTMin) then - continue; felders[1-aktuelleFelder].liKo( felders[aktuelleFelder], @@ -3,10 +3,8 @@ felders[aktuelleFelder], 0.2 * dT ); - felders[2].berechneAbleitungen(dX,iDX,pDNMax); + felders[2].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(2,dTMax,dT,dTMin) then - continue; felders[3].liKo( felders[aktuelleFelder], @@ -15,10 +13,8 @@ -0.216049382716049382716049382716049382716049382716049382716049 * dT, 0.771604938271604938271604938271604938271604938271604938271605 * dT ); - felders[3].berechneAbleitungen(dX,iDX,pDNMax); + felders[3].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(3,dTMax,dT,dTMin) then - continue; felders[4].liKo( felders[aktuelleFelder], @@ -27,10 +23,8 @@ 0.208333333333333333333333333333333333333333333333333333333333 * dT, 0.625 * dT ); - felders[4].berechneAbleitungen(dX,iDX,pDNMax); + felders[4].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(4,dTMax,dT,dTMin) then - continue; felders[5].liKo( felders[aktuelleFelder], @@ -41,10 +35,8 @@ 0.22 * dT, -0.08 * dT ); - felders[5].berechneAbleitungen(dX,iDX,pDNMax); + felders[5].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(5,dTMax,dT,dTMin) then - continue; felders[6].liKo( felders[aktuelleFelder], @@ -55,10 +47,8 @@ 0.4 * dT, 0.5 * dT ); - felders[6].berechneAbleitungen(dX,iDX,pDNMax); + felders[6].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(6,dTMax,dT,dTMin) then - continue; felders[7].liKo( felders[aktuelleFelder], @@ -71,10 +61,8 @@ 0.48317116756103289928883648045196250872410925751728917730238 * dT, -0.038753024569476325208568144376762058039573330234136803880429 * dT ); - felders[7].berechneAbleitungen(dX,iDX,pDNMax); + felders[7].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(7,dTMax,dT,dTMin) then - continue; felders[8].liKo( felders[aktuelleFelder], @@ -87,10 +75,8 @@ 0.0137455792075966759812907801835048190594443990939408530842918 * dT, -0.0661095317267682844455831341498149531672668252085016565917546 * dT ); - felders[8].berechneAbleitungen(dX,iDX,pDNMax); + felders[8].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(8,dTMax,dT,dTMin) then - continue; felders[9].liKo( felders[aktuelleFelder], @@ -103,10 +89,8 @@ 0.0680716801688453518578515120895103863112751730758794372203952 * dT, 0.408394315582641046727306852653894780093303185664924644551239 * dT ); - felders[9].berechneAbleitungen(dX,iDX,pDNMax); + felders[9].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(9,dTMax,dT,dTMin) then - continue; felders[10].liKo( felders[aktuelleFelder], @@ -121,10 +105,8 @@ 0.427930210752576611068192608300897981558240730580396406312359 * dT, -0.0865117637557827005740277475955029103267246394128995965941585 * dT ); - felders[10].berechneAbleitungen(dX,iDX,pDNMax); + felders[10].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(10,dTMax,dT,dTMin) then - continue; felders[11].liKo( felders[aktuelleFelder], @@ -141,10 +123,8 @@ -0.951294772321088980532340837388859453930924498799228648050949 * dT, -0.408276642965631951497484981519757463459627174520978426909934 * dT ); - felders[11].berechneAbleitungen(dX,iDX,pDNMax); + felders[11].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(11,dTMax,dT,dTMin) then - continue; felders[12].liKo( felders[aktuelleFelder], @@ -163,10 +143,8 @@ 0.00263265981064536974369934736325334761174975280887405725010964 * dT, 0.00315472768977025060103545855572111407955208306374459723959783 * dT ); - felders[12].berechneAbleitungen(dX,iDX,pDNMax); + felders[12].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(12,dTMax,dT,dTMin) then - continue; felders[13].liKo( felders[aktuelleFelder], @@ -181,10 +159,8 @@ 0.0000176358982260285155407485928953302139937553442829975734148981 * dT, 0.0653866627415027051009595231385181033549511358787382098351924 * dT ); - felders[13].berechneAbleitungen(dX,iDX,pDNMax); + felders[13].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(13,dTMax,dT,dTMin) then - continue; felders[14].liKo( felders[aktuelleFelder], @@ -201,10 +177,8 @@ -0.861264460105717678161432562258351242030270498966891201799225 * dT, 0.908651882074050281096239478469262145034957129939256789178785 * dT ); - felders[14].berechneAbleitungen(dX,iDX,pDNMax); + felders[14].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(14,dTMax,dT,dTMin) then - continue; felders[15].liKo( felders[aktuelleFelder], @@ -223,10 +197,8 @@ 0.00535364695524996055083260173615567408717110247274021056118319 * dT, 0.301167864010967916837091303817051676920059229784957479998077 * dT ); - felders[15].berechneAbleitungen(dX,iDX,pDNMax); + felders[15].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(15,dTMax,dT,dTMin) then - continue; felders[16].liKo( felders[aktuelleFelder], @@ -247,10 +219,8 @@ -0.214007467967990254219503540827349569639028092344812795499026 * dT, 0.958202417754430239892724139109781371059908874605153648768037 * dT ); - felders[16].berechneAbleitungen(dX,iDX,pDNMax); + felders[16].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(16,dTMax,dT,dTMin) then - continue; felders[17].liKo( felders[aktuelleFelder], @@ -273,10 +243,8 @@ -1.10683733362380649395704708016953056176195769617014899442903 * dT, -0.929529037579203999778397238291233214220788057511899747507074 * dT ); - felders[17].berechneAbleitungen(dX,iDX,pDNMax); + felders[17].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(17,dTMax,dT,dTMin) then - continue; felders[18].liKo( felders[aktuelleFelder], @@ -307,10 +275,8 @@ -1.94300935242819610883833776782364287728724899124166920477873 * dT, -0.128352601849404542018428714319344620742146491335612353559923 * dT ); - felders[18].berechneAbleitungen(dX,iDX,pDNMax); + felders[18].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(18,dTMax,dT,dTMin) then - continue; felders[19].liKo( felders[aktuelleFelder], @@ -343,10 +309,8 @@ -0.00115618834794939500490703608435907610059605754935305582045729 * dT, -0.00544057908677007389319819914241631024660726585015012485938593 * dT ); - felders[19].berechneAbleitungen(dX,iDX,pDNMax); + felders[19].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(19,dTMax,dT,dTMin) then - continue; felders[20].liKo( felders[aktuelleFelder], @@ -381,10 +345,8 @@ 0.0418603916412360287969841020776788461794119440689356178942252 * dT, 0.279084255090877355915660874555379649966282167560126269290222 * dT ); - felders[20].berechneAbleitungen(dX,iDX,pDNMax); + felders[20].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(20,dTMax,dT,dTMin) then - continue; felders[21].liKo( felders[aktuelleFelder], @@ -409,10 +371,8 @@ 0.218636633721676647685111485017151199362509373698288330593486 * dT, 0.438313820361122420391059788940960176420682836652600698580091 * dT ); - felders[21].berechneAbleitungen(dX,iDX,pDNMax); + felders[21].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(21,dTMax,dT,dTMin) then - continue; felders[22].liKo( felders[aktuelleFelder], @@ -439,10 +399,8 @@ 0.196410889223054653446526504390100417677539095340135532418849 * dT, -0.0984256130499315928152900286856048243348202521491288575952143 * dT ); - felders[22].berechneAbleitungen(dX,iDX,pDNMax); + felders[22].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(22,dTMax,dT,dTMin) then - continue; felders[23].liKo( felders[aktuelleFelder], @@ -459,10 +417,8 @@ 0.390696469295978451446999802258495981249099665294395945559163 * dT, 0.666666666666666666666666666666666666666666666666666666666667 * dT ); - felders[23].berechneAbleitungen(dX,iDX,pDNMax); + felders[23].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(23,dTMax,dT,dTMin) then - continue; felders[24].liKo( felders[aktuelleFelder], @@ -473,10 +429,8 @@ -0.164609053497942386831275720164609053497942386831275720164609 * dT, 0.164609053497942386831275720164609053497942386831275720164609 * dT ); - felders[24].berechneAbleitungen(dX,iDX,pDNMax); + felders[24].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(24,dTMax,dT,dTMin) then - continue; felders[25].liKo( felders[aktuelleFelder], @@ -525,10 +479,8 @@ -0.421296296296296296296296296296296296296296296296296296296296 * dT, -0.7875 * dT ); - felders[25].berechneAbleitungen(dX,iDX,pDNMax); + felders[25].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(25,dTMax,dT,dTMin) then - continue; felders[1-aktuelleFelder].liKo( felders[aktuelleFelder], @@ -3,10 +3,8 @@ felders[aktuelleFelder], 0.111111111111111111111111111111111111111111111111111111111111 * dT ); - felders[2].berechneAbleitungen(dX,iDX,pDNMax); + felders[2].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(2,dTMax,dT,dTMin) then - continue; felders[3].liKo( felders[aktuelleFelder], @@ -15,10 +13,8 @@ -0.833333333333333333333333333333333333333333333333333333333333 * dT, 1.38888888888888888888888888888888888888888888888888888888889 * dT ); - felders[3].berechneAbleitungen(dX,iDX,pDNMax); + felders[3].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(3,dTMax,dT,dTMin) then - continue; felders[4].liKo( felders[aktuelleFelder], @@ -27,10 +23,8 @@ 0.208333333333333333333333333333333333333333333333333333333333 * dT, 0.625 * dT ); - felders[4].berechneAbleitungen(dX,iDX,pDNMax); + felders[4].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(4,dTMax,dT,dTMin) then - continue; felders[5].liKo( felders[aktuelleFelder], @@ -41,10 +35,8 @@ 0.22 * dT, -0.08 * dT ); - felders[5].berechneAbleitungen(dX,iDX,pDNMax); + felders[5].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(5,dTMax,dT,dTMin) then - continue; felders[6].liKo( felders[aktuelleFelder], @@ -55,10 +47,8 @@ 0.4 * dT, 0.5 * dT ); - felders[6].berechneAbleitungen(dX,iDX,pDNMax); + felders[6].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(6,dTMax,dT,dTMin) then - continue; felders[7].liKo( felders[aktuelleFelder], @@ -71,10 +61,8 @@ 0.482574490331246622475134780125688112865919023850168049679402 * dT, -0.038140960001560699973088624000562020566411307247841147742197 * dT ); - felders[7].berechneAbleitungen(dX,iDX,pDNMax); + felders[7].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(7,dTMax,dT,dTMin) then - continue; felders[8].liKo( felders[aktuelleFelder], @@ -87,10 +75,8 @@ 0.0137885887618080880607695837016477814530969417491493385363543 * dT, -0.06722101339966844497493995074143058569500863415253821828562 * dT ); - felders[8].berechneAbleitungen(dX,iDX,pDNMax); + felders[8].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(8,dTMax,dT,dTMin) then - continue; felders[9].liKo( felders[aktuelleFelder], @@ -103,10 +89,8 @@ 0.216019825625503063708860097659866573490979433278117320188668 * dT, 0.423695063515761937337619073960976753205867469544123532683116 * dT ); - felders[9].berechneAbleitungen(dX,iDX,pDNMax); + felders[9].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(9,dTMax,dT,dTMin) then - continue; felders[10].liKo( felders[aktuelleFelder], @@ -121,10 +105,8 @@ 0.0978080858367729012259313014081291665503740655476733940756599 * dT, 0.217590689243420631360008651767860318344168120024782176879989 * dT ); - felders[10].berechneAbleitungen(dX,iDX,pDNMax); + felders[10].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(10,dTMax,dT,dTMin) then - continue; felders[11].liKo( felders[aktuelleFelder], @@ -141,10 +123,8 @@ -0.247656877593994914689992276329810825853958069263947095548189 * dT, 0.110895029771437682893999851839061714522445173600678718208625 * dT ); - felders[11].berechneAbleitungen(dX,iDX,pDNMax); + felders[11].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(11,dTMax,dT,dTMin) then - continue; felders[12].liKo( felders[aktuelleFelder], @@ -163,10 +143,8 @@ 0.204890423831599428189499202098105603312029235081420653574829 * dT, -1.56261579627468188307070943950527825211462892236424360892806 * dT ); - felders[12].berechneAbleitungen(dX,iDX,pDNMax); + felders[12].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(12,dTMax,dT,dTMin) then - continue; felders[13].liKo( felders[aktuelleFelder], @@ -181,10 +159,8 @@ -0.00805328367804983036823857162048902911923392887337029314844206 * dT, 0.0211517528067396521915711903523399601316877825157550573051221 * dT ); - felders[13].berechneAbleitungen(dX,iDX,pDNMax); + felders[13].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(13,dTMax,dT,dTMin) then - continue; felders[14].liKo( felders[aktuelleFelder], @@ -201,10 +177,8 @@ 0.00988442549447664668946335414487885256040819982786014648129297 * dT, -0.0213010771328887351384307642875927384886634565429572466632092 * dT ); - felders[14].berechneAbleitungen(dX,iDX,pDNMax); + felders[14].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(14,dTMax,dT,dTMin) then - continue; felders[15].liKo( felders[aktuelleFelder], @@ -223,10 +197,8 @@ -0.977235005036766810872264852372525633013107656892839677696022 * dT, -0.660026980479294694616225013856327693720573981219974874776419 * dT ); - felders[15].berechneAbleitungen(dX,iDX,pDNMax); + felders[15].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(15,dTMax,dT,dTMin) then - continue; felders[16].liKo( felders[aktuelleFelder], @@ -247,10 +219,8 @@ 0.124343093331358243286225595741786448038973408895106741855721 * dT, 0.00413829693239480694403512496204335960426192908674476033832967 * dT ); - felders[16].berechneAbleitungen(dX,iDX,pDNMax); + felders[16].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(16,dTMax,dT,dTMin) then - continue; felders[17].liKo( felders[aktuelleFelder], @@ -273,10 +243,8 @@ 0.251708904586819292210480529948970541404887852931447491219418 * dT, 0.779906470345586398810756795282334476023540593411550187024263 * dT ); - felders[17].berechneAbleitungen(dX,iDX,pDNMax); + felders[17].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(17,dTMax,dT,dTMin) then - continue; felders[18].liKo( felders[aktuelleFelder], @@ -293,10 +261,8 @@ 0.000591726029494171190528755742777717259844340971924321528178248 * dT, -4.01614722154557337064691684906375587732264247950093804676867E-7 * dT ); - felders[18].berechneAbleitungen(dX,iDX,pDNMax); + felders[18].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(18,dTMax,dT,dTMin) then - continue; felders[19].liKo( felders[aktuelleFelder], @@ -315,10 +281,8 @@ -2.04486480935804242706707569691004307904442837552677456232848E-6 * dT, 0.105328578824431893399799402979093997354240904235172843146582 * dT ); - felders[19].berechneAbleitungen(dX,iDX,pDNMax); + felders[19].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(19,dTMax,dT,dTMin) then - continue; felders[20].liKo( felders[aktuelleFelder], @@ -339,10 +303,8 @@ 7.64130548038698765563029310880237651185173367813936997648198 * dT, 3.50602043659751834989896082949744710968212949893375368243588 * dT ); - felders[20].berechneAbleitungen(dX,iDX,pDNMax); + felders[20].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(20,dTMax,dT,dTMin) then - continue; felders[21].liKo( felders[aktuelleFelder], @@ -365,10 +327,8 @@ -3.64411637921569236846406990361350645806721478409266709351203 * dT, -0.804503249910509910899030787958579499315694913210787878260459 * dT ); - felders[21].berechneAbleitungen(dX,iDX,pDNMax); + felders[21].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(21,dTMax,dT,dTMin) then - continue; felders[22].liKo( felders[aktuelleFelder], @@ -393,10 +353,8 @@ 13.1939710030282333443670964371153238435064159623744975073252 * dT, 1.25128781283980445450114974148056006317268830077396406361417 * dT ); - felders[22].berechneAbleitungen(dX,iDX,pDNMax); + felders[22].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(22,dTMax,dT,dTMin) then - continue; felders[23].liKo( felders[aktuelleFelder], @@ -423,10 +381,8 @@ 0.422422733996325326010225127471388772575086538809603346825334 * dT, 0.0859131249503067107308438031499859443441115056294154956487671 * dT ); - felders[23].berechneAbleitungen(dX,iDX,pDNMax); + felders[23].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(23,dTMax,dT,dTMin) then - continue; felders[24].liKo( felders[aktuelleFelder], @@ -463,10 +419,8 @@ 0.0210134706331264177317735424331396407424412188443757490871603 * dT, 0.00952196014417121794175101542454575907376360233658356240547761 * dT ); - felders[24].berechneAbleitungen(dX,iDX,pDNMax); + felders[24].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(24,dTMax,dT,dTMin) then - continue; felders[25].liKo( felders[aktuelleFelder], @@ -505,10 +459,8 @@ -0.0870718339841810522431884137957986245724252047388936572215438 * dT, -7.39351814158303067567016952195521063999185773249132944724553 * dT ); - felders[25].berechneAbleitungen(dX,iDX,pDNMax); + felders[25].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(25,dTMax,dT,dTMin) then - continue; felders[26].liKo( felders[aktuelleFelder], @@ -549,10 +501,8 @@ 4.79282506449930799649797749629840189457296934139359048988332 * dT, 0.153725464873068577844576387402512082757034273069877432944621 * dT ); - felders[26].berechneAbleitungen(dX,iDX,pDNMax); + felders[26].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(26,dTMax,dT,dTMin) then - continue; felders[27].liKo( felders[aktuelleFelder], @@ -599,10 +549,8 @@ -1.35548714715078654978732186705996404017554501614191325114947 * dT, -1.57196275801232751882901735171459249177687219114442583461866 * dT ); - felders[27].berechneAbleitungen(dX,iDX,pDNMax); + felders[27].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(27,dTMax,dT,dTMin) then - continue; felders[28].liKo( felders[aktuelleFelder], @@ -651,10 +599,8 @@ 1.6267482744706653746298936492962893398812502928418368027902 * dT, 0.491719043846229147070666628704194097678081907210673044988866 * dT ); - felders[28].berechneAbleitungen(dX,iDX,pDNMax); + felders[28].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(28,dTMax,dT,dTMin) then - continue; felders[29].liKo( felders[aktuelleFelder], @@ -689,10 +635,8 @@ -0.0439870229715046685058790092341545026046103890294261359042581 * dT, -0.13758560676332522486565963219678774664744722297508486597544 * dT ); - felders[29].berechneAbleitungen(dX,iDX,pDNMax); + felders[29].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(29,dTMax,dT,dTMin) then - continue; felders[30].liKo( felders[aktuelleFelder], @@ -729,10 +673,8 @@ 1.96337522866858908928262850028093813988180440518267404553576 * dT, 0.856238975085428354755349769879501772112121597411563802855067 * dT ); - felders[30].berechneAbleitungen(dX,iDX,pDNMax); + felders[30].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(30,dTMax,dT,dTMin) then - continue; felders[31].liKo( felders[aktuelleFelder], @@ -769,10 +711,8 @@ 0.711915811585189227887648262043794387578291882406745570495765 * dT, 0.550499525310802324138388507020508177411414311000037561712836 * dT ); - felders[31].berechneAbleitungen(dX,iDX,pDNMax); + felders[31].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(31,dTMax,dT,dTMin) then - continue; felders[32].liKo( felders[aktuelleFelder], @@ -811,10 +751,8 @@ 0.254297048076270161384068506997153122141835626976703920846242 * dT, -0.109993425580724703919462404865068340845119058295846426463652 * dT ); - felders[32].berechneAbleitungen(dX,iDX,pDNMax); + felders[32].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(32,dTMax,dT,dTMin) then - continue; felders[33].liKo( felders[aktuelleFelder], @@ -831,10 +769,8 @@ 0.492529543718026304422682049114021320200214681580657784719074 * dT, 0.75 * dT ); - felders[33].berechneAbleitungen(dX,iDX,pDNMax); + felders[33].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(33,dTMax,dT,dTMin) then - continue; felders[34].liKo( felders[aktuelleFelder], @@ -845,10 +781,8 @@ -0.222222222222222222222222222222222222222222222222222222222222 * dT, 0.222222222222222222222222222222222222222222222222222222222222 * dT ); - felders[34].berechneAbleitungen(dX,iDX,pDNMax); + felders[34].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(34,dTMax,dT,dTMin) then - continue; felders[35].liKo( felders[aktuelleFelder], @@ -915,10 +849,8 @@ -0.21875 * dT, -0.291666666666666666666666666666666666666666666666666666666667 * dT ); - felders[35].berechneAbleitungen(dX,iDX,pDNMax); + felders[35].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(35,dTMax,dT,dTMin) then - continue; felders[1-aktuelleFelder].liKo( felders[aktuelleFelder], @@ -3,10 +3,8 @@ felders[aktuelleFelder], 1/3 * dT ); - felders[2].berechneAbleitungen(dX,iDX,pDNMax); + felders[2].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(2,dTMax,dT,dTMin) then - continue; felders[3].liKo( felders[aktuelleFelder], @@ -15,10 +13,8 @@ -1/3 * dT, 1 * dT ); - felders[3].berechneAbleitungen(dX,iDX,pDNMax); + felders[3].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(3,dTMax,dT,dTMin) then - continue; felders[4].liKo( felders[aktuelleFelder], @@ -29,10 +25,8 @@ -1 * dT, 1 * dT ); - felders[4].berechneAbleitungen(dX,iDX,pDNMax); + felders[4].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(4,dTMax,dT,dTMin) then - continue; felders[1-aktuelleFelder].liKo( felders[aktuelleFelder], @@ -3,30 +3,24 @@ felders[aktuelleFelder], 0.5 * dT ); - felders[2].berechneAbleitungen(dX,iDX,pDNMax); + felders[2].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(2,dTMax,dT,dTMin) then - continue; felders[3].liKo( felders[aktuelleFelder], felders[2], 0.5 * dT ); - felders[3].berechneAbleitungen(dX,iDX,pDNMax); + felders[3].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(3,dTMax,dT,dTMin) then - continue; felders[4].liKo( felders[aktuelleFelder], felders[3], 1 * dT ); - felders[4].berechneAbleitungen(dX,iDX,pDNMax); + felders[4].berechneAbleitungen(dX,iDX); - if pruefeMaxDT(4,dTMax,dT,dTMin) then - continue; felders[1-aktuelleFelder].liKo( felders[aktuelleFelder], @@ -15,10 +15,10 @@ do 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(dX,iDX,pDNMax);" >> ${outputFile} + echo " felders[${i}].berechneAbleitungen(dX,iDX);" >> ${outputFile} echo >> ${outputFile} - echo " if pruefeMaxDT(${i},dTMax,dT,dTMin) then" >> ${outputFile} - echo " continue;" >> ${outputFile} +# echo " if pruefeMaxDT(${i},dTMax,dT,dTMin) then" >> ${outputFile} +# echo " continue;" >> ${outputFile} echo >> ${outputFile} done |