diff options
author | Erich Eckner <git@eckner.net> | 2015-12-08 14:33:49 +0100 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2015-12-08 14:34:51 +0100 |
commit | 0c191855fe0dd55ff1d4e6a767e9d2879063619e (patch) | |
tree | bc135ecf8c2937dafee8b9b3658bff5d9c340caf | |
parent | 141b43362dcdfe8a456e9dc7d7c2fb2564a64c5a (diff) | |
download | Plasmapropagation-0c191855fe0dd55ff1d4e6a767e9d2879063619e.tar.xz |
nichtnegativieren in Physikunit.pas beschleunigt
-rw-r--r-- | Physikunit.pas | 68 |
1 files changed, 28 insertions, 40 deletions
diff --git a/Physikunit.pas b/Physikunit.pas index 935dcad..4dbc2da 100644 --- a/Physikunit.pas +++ b/Physikunit.pas @@ -171,6 +171,7 @@ type abbruch: boolean; dX,iDX,xl,t: double; kvs: tKnownValues; + impulsRaumPermutation: tLongintArray; procedure abbrechen; public @@ -1348,52 +1349,37 @@ end; procedure tFelder.nichtnegativieren; // Dichten nicht negativ machen var - i,j,k,l,m,koo: longint; - defizit: double; - schr,zSchr: array[0..3] of longint; + i,j: longint; + defizit: double; begin - schr[0]:=-aP; - schr[1]:=-1; - schr[2]:=aP; - schr[3]:=1; - for i:=0 to 3 do - zSchr[i]:=schr[(i+1) mod 4] + schr[(i+2) mod 4]; - for i:=0 to length(impulsraum)-1 do - for j:=0 to aX*aP-1 do + for i:=0 to length(teilchen)-1 do begin + defizit:=0; + for j:=0 to aP*aX-1 do if (impulsraum[i,false]+j)^ < 0 then begin - defizit:=-(impulsraum[i,false]+j)^; - gesamtDefizit:=gesamtDefizit + defizit; + defizit:=defizit-(impulsraum[i,false]+j)^; (impulsraum[i,false]+j)^:=0; + end; + + gesamtDefizit:=gesamtDefizit+defizit; - for k:=1 to aX+aP do - if defizit>0 then - for l:=0 to 3 do - if defizit>0 then - for m:=0 to k-1 do begin - koo:=j + schr[l]*k + zSchr[l]*m; - if (koo<0) or (koo>=aX*aP) then continue; - - if (impulsraum[i,false]+koo)^>defizit then begin - (impulsraum[i,false]+koo)^:=(impulsraum[i,false]+koo)^-defizit; - defizit:=0; - break; - end - else if (impulsraum[i,false]+koo)^>=0 then begin - defizit:=defizit-(impulsraum[i,false]+koo)^; - (impulsraum[i,false]+koo)^:=0; - end - else begin - defizit:=defizit-(impulsraum[i,false]+koo)^; - gesamtDefizit:=gesamtDefizit-(impulsraum[i,false]+koo)^; - (impulsraum[i,false]+koo)^:=0; - end; - end; - - if defizit>0 then begin - gitter.prot.schreibe('Kann Defizit der Teilchensorte '+inttostr(i+1)+' nicht ausgleichen, '+floattostr(defizit)+' bleibt übrig!',true); - gitter.abbrechen; + if defizit>0 then + for j:=0 to aP*aX-1 do begin + if (impulsraum[i,false]+gitter.impulsRaumPermutation[j])^>=defizit then begin + (impulsraum[i,false]+gitter.impulsRaumPermutation[j])^:= + (impulsraum[i,false]+gitter.impulsRaumPermutation[j])^-defizit; + defizit:=0; + break; + end + else if (impulsraum[i,false]+gitter.impulsRaumPermutation[j])^>0 then begin + defizit:=defizit-(impulsraum[i,false]+gitter.impulsRaumPermutation[j])^; + (impulsraum[i,false]+gitter.impulsRaumPermutation[j])^:=0; end; end; + if defizit>0 then begin + gitter.prot.schreibe('Kann Defizit der Teilchensorte '+inttostr(i+1)+' nicht ausgleichen, '+floattostr(defizit)+' bleibt übrig!',true); + gitter.abbrechen; + end; + end; end; procedure tFelder.berechnePhasenraumAbleitungen; @@ -1544,6 +1530,8 @@ begin end{of Case}; xl:=dX/2; + impulsRaumPermutation:=permutation(aX*aP); + for i:=0 to length(felders)-1 do felders[i]:=tFelder.create(aX,aP,deltaX,deltaP,teilchen,lichter,self); |