From 8ea445b956d22d923f7538c5b98587b4ba9c50ae Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Fri, 7 Aug 2015 17:07:56 +0200 Subject: nun nur noch 2D im Impulsraum, mal schauen ... --- Physikunit.pas | 203 +++++++++++++++++++------------------------------- Plasmapropagation.lps | 80 ++++++++++---------- 2 files changed, 118 insertions(+), 165 deletions(-) diff --git a/Physikunit.pas b/Physikunit.pas index 491c186..727f0dc 100644 --- a/Physikunit.pas +++ b/Physikunit.pas @@ -19,18 +19,18 @@ type tZeitverfahren = (zfEulerVorwaerts,zfRungeKuttaDreiAchtel,zfRungeKuttaVier,zfRungeKuttaZehn,zfRungeKuttaZwoelf,zfRungeKuttaVierzehn); tVerteilungsfunktion = function(x: extended): extended; tEMFeldGroesze = ( - efAX,efAY,efAZ, - efDAXDT,efDAYDT,efDAZDT, + efAX,efAY, + efDAXDT,efDAYDT, efEX,efBY,efBZ ); tEMQuellGroesze = ( - eqRho,eqJX,eqJY,eqJZ + eqRho,eqJX,eqJY ); tEMQuellen = array[tEMQuellGroesze] of extended; const erstesEMFMitAbleitung = efAX; - letztesEMFMitAbleitung = efDAZDT; + letztesEMFMitAbleitung = efDAYDT; type @@ -85,19 +85,19 @@ type tImpulsPunkt = class(tObject) // Besetzungsdichten verschiedener Teilchenspezies für ein Paar (r;p) private raumpunkt: tRaumPunkt; - nachbarn: array[0..3,boolean] of tImpulsPunkt; // x-, px-, py-, pz-Nachbarn (jeweil in Richtung - und +) + nachbarn: array[0..2,boolean] of tImpulsPunkt; // x-, px-, py-Nachbarn (jeweil in Richtung - und +) public 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); + constructor create(rp: tRaumPunkt; linksRaum,linksImpuls,untenImpuls: 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); + procedure akkumuliereEMQuellen(var emQuellen: tEMQuellen; vx,vy,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); + procedure berechneAbleitungen(pX,pY,iDX,iDPX,iDPY: extended); end; { tRaumPunkt } @@ -115,12 +115,12 @@ type // Quellen für die EM-Felder lN,rN: tRaumPunkt; // Nachbarpunkte - dPX,dPY,dPZ: extended; + dPX,dPY: extended; // Impulsdiskretisierung - aPX,aPY,aPZ: longint; + aPX,aPY: longint; // Anzahl der Impulsbins - constructor create(linkerNachbar: tRaumPunkt; derBesitzer: tFelder; teilchen,_aPX,_aPY,_aPZ: longint; _dPX,_dPY,_dPZ: extended); + constructor create(linkerNachbar: tRaumPunkt; derBesitzer: tFelder; teilchen,_aPX,_aPY: longint; _dPX,_dPY: extended); destructor destroy; override; procedure berechneEMFelder(dX: extended; rechts: boolean); overload; procedure berechneEMFelder(dX,iDX: extended); overload; @@ -149,7 +149,7 @@ type inhalt: array of tRaumPunkt; gitter: tGitter; - constructor create(groesse: longint; teilchen: array of tTeilchenSpezies; lichter: tMyStringList; parent: tGitter; aPX,aPY,aPZ: longint; dPX,dPY,dPZ: extended); + constructor create(groesse: longint; teilchen: array of tTeilchenSpezies; lichter: tMyStringList; parent: tGitter; aPX,aPY: longint; dPX,dPY: extended); destructor destroy; override; procedure berechneAbleitungen(dX,iDX: extended); {$DEFINE LiKotFelderHeader} @@ -174,7 +174,7 @@ type 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; deltaX: extended; bekannteWerte: tKnownValues; teilchen: array of tTeilchenSpezies; lichter: tMyStringlist; zv: tZeitverfahren; protokollant: tProtokollant; name: string; aPX,aPY,aPZ: longint; dPX,dPY,dPZ: extended); + constructor create(derBesitzer: tSimulation; size: longint; deltaX: extended; bekannteWerte: tKnownValues; teilchen: array of tTeilchenSpezies; lichter: tMyStringlist; zv: tZeitverfahren; protokollant: tProtokollant; name: string; aPX,aPY: longint; dPX,dPY: extended); destructor destroy; override; procedure iteriereSchritt(dT: extended); end; @@ -201,10 +201,10 @@ implementation const emFeldNamen: array[tEMFeldGroesze] of string = ( - 'AX','AY','AZ','DAXDT','DAYDT','DAZDT','EX','BY','BZ' + 'AX','AY','DAXDT','DAYDT','EX','BY','BZ' ); emQuellNamen: array[tEMQuellGroesze] of string = ( - 'RHO','JX','JY','JZ' + 'RHO','JX','JY' ); minAusgabeBuffer = 1024*1024; @@ -520,7 +520,7 @@ end; // tImpulsPunkt **************************************************************** -constructor tImpulsPunkt.create(rp: tRaumPunkt; linksRaum,linksImpuls,untenImpuls,vorneImpuls: tImpulsPunkt; anzTeilchen: longint); +constructor tImpulsPunkt.create(rp: tRaumPunkt; linksRaum,linksImpuls,untenImpuls: tImpulsPunkt; anzTeilchen: longint); var i: longint; b: boolean; @@ -538,9 +538,7 @@ begin 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 + for i:=0 to 2 do if assigned(nachbarn[i,false]) then nachbarn[i,false].nachbarn[i,true]:=self; end; @@ -588,7 +586,7 @@ begin end; end; -procedure tImpulsPunkt.akkumuliereEMQuellen(var emQuellen: tEMQuellen; vx,vy,vz,dVP: extended); +procedure tImpulsPunkt.akkumuliereEMQuellen(var emQuellen: tEMQuellen; vx,vy,dVP: extended); var i: longint; tmp: extended; @@ -598,7 +596,6 @@ begin 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; @@ -638,39 +635,36 @@ begin werte[i,abl]:=0; end; -procedure tImpulsPunkt.berechneAbleitungen(pX,pY,pZ,iDX,iDPX,iDPY,iDPZ: extended); +procedure tImpulsPunkt.berechneAbleitungen(pX,pY,iDX,iDPX,iDPY: extended); var igam: extended; i: longint; begin - igam:=1/sqrt(1+sqr(pX)+sqr(pY)+sqr(pZ)); + igam:=1/sqrt(1+sqr(pX)+sqr(pY)); 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]) + (raumpunkt.emFelder[efEX,false] + pY*raumpunkt.emFelder[efBZ,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); +constructor tRaumPunkt.create(linkerNachbar: tRaumPunkt; derBesitzer: tFelder; teilchen,_aPX,_aPY: longint; _dPX,_dPY: extended); var - emF: tEMFeldGroesze; - emQ: tEMQuellGroesze; - abl: boolean; - i,j,k: longint; - xN,pxN,pyN,pzN: tImpulsPunkt; + emF: tEMFeldGroesze; + emQ: tEMQuellGroesze; + abl: boolean; + i,j: longint; + xN,pxN,pyN: tImpulsPunkt; begin inherited create; felder:=derBesitzer; @@ -685,33 +679,26 @@ begin 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); + setlength(phasenraum,aPX*aPY); 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; + for j:=0 to aPY-1 do begin + if assigned(linkerNachbar) then + xN:=linkerNachbar.phasenraum[i+aPX*j] + else + xN:=nil; + if i>0 then + pxN:=phasenraum[i-1+aPX*j] + else + pxN:=nil; + if j>0 then + pyN:=phasenraum[i+aPX*(j-1)] + else + pyN:=nil; + phasenraum[i+aPX*j]:=tImpulsPunkt.create(self,xN,pxN,pyN,teilchen); + end; end; destructor tRaumPunkt.destroy; @@ -756,23 +743,20 @@ begin (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 tRaumPunkt.berechneEMAbleitungen(iDX: extended); // Zeitableitungen der EM-Potentiale berechnen var - i,j,k: longint; - emQ: tEMQuellGroesze; + i,j: longint; + emQ: tEMQuellGroesze; begin 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); + phasenraum[i+aPX*j].akkumuliereEMQuellen(emQuellen,(i-aPX/2)*dPX,(j-aPY/2)*dPY,dPX*dPY); // d2A/dt2 = Laplace(A) - j ( - dE/dt wird auf dA/dt direkt aufgeschlagen !!! ) emFelder[efDAXDT,true]:= @@ -781,25 +765,20 @@ begin 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 tRaumPunkt.berechnePhasenraumAbleitungen(iDX: extended); var - i,j,k: longint; + i,j: longint; begin // 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); + phasenraum[i+aPX*j].berechneAbleitungen((i-(aPX div 2))*dPX,(j-(aPY div 2))*dPY,iDX,1/dPX,1/dPY); end; procedure tRaumPunkt.nichtnegativieren; // Dichten nicht negativ machen @@ -812,7 +791,7 @@ end; function tRaumPunkt.impulsIntegral(teilchen: longint; emQ: tEMQuellGroesze): extended; var - i,j,k: longint; + i,j: longint; begin if teilchen<0 then begin result:=emQuellen[emQ]; // das ist leicht :-) @@ -825,32 +804,22 @@ begin 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; + result:= + result + + phasenraum[i+aPX*j].werte[teilchen,false]*dPX*dPY; 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; + result:= + result + + phasenraum[i+aPX*j].werte[teilchen,false]*dPX*dPY * (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; + result:= + result + + phasenraum[i+aPX*j].werte[teilchen,false]*dPX*dPY * (j-aPY/2)*dPY; + end{of case}; end; procedure tRaumPunkt.initialisiereDichte(teilchen: longint; n: extended); @@ -858,7 +827,7 @@ var i: longint; begin for i:=0 to length(phasenraum)-1 do - if (aPX div 2) + aPX*((aPY div 2) + aPY*(aPZ div 2)) = i then + if (aPX div 2) + aPX*(aPY div 2) = i then phasenraum[i].werte[teilchen,false]:=n else phasenraum[i].werte[teilchen,false]:=0; @@ -869,7 +838,7 @@ var i,j,k: longint; begin 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 j:=0 to aPY-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]; @@ -901,7 +870,7 @@ end; // tFelder ********************************************************************* -constructor tFelder.create(groesse: longint; teilchen: array of tTeilchenSpezies; lichter: tMyStringList; parent: tGitter; aPX,aPY,aPZ: longint; dPX,dPY,dPZ: extended); +constructor tFelder.create(groesse: longint; teilchen: array of tTeilchenSpezies; lichter: tMyStringList; parent: tGitter; aPX,aPY: longint; dPX,dPY: extended); var i,j: longint; rechts: boolean; @@ -916,9 +885,9 @@ 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]:=tRaumPunkt.create(nil,self,length(teilchen),aPX,aPY,aPZ,dPX,dPY,dPZ); + inhalt[0]:=tRaumPunkt.create(nil,self,length(teilchen),aPX,aPY,dPX,dPY); for i:=1 to length(inhalt)-1 do - inhalt[i]:=tRaumPunkt.create(inhalt[i-1],self,length(teilchen),aPX,aPY,aPZ,dPX,dPY,dPZ); + inhalt[i]:=tRaumPunkt.create(inhalt[i-1],self,length(teilchen),aPX,aPY,dPX,dPY); fillchar(massen,sizeof(massen),#0); setlength(massen,length(teilchen)); for i:=0 to length(massen)-1 do @@ -958,7 +927,7 @@ var rechts: boolean; i: longint; begin - for emF:=efAX to efAZ do begin // Vakuumrandbedingungen für das A-Feld + for emF:=efAX to efAY do begin // Vakuumrandbedingungen für das A-Feld inhalt[0].emFelder[emF,true]:= (inhalt[1].emFelder[emF,false] - inhalt[0].emFelder[emF,false])*iDX; @@ -1005,7 +974,7 @@ end; // tGitter ********************************************************************* -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); +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: longint; dPX,dPY: extended); var i: longint; begin @@ -1032,7 +1001,7 @@ begin xl:=dX/2; for i:=0 to length(felders)-1 do - felders[i]:=tFelder.create(size,teilchen,lichter,self,aPX,aPY,aPZ,dPX,dPY,dPZ); + felders[i]:=tFelder.create(size,teilchen,lichter,self,aPX,aPY,dPX,dPY); aktuelleFelder:=0; t:=0; @@ -1146,16 +1115,16 @@ end; constructor tSimulation.create(inName: string; protokollant: tProtokollant; name: string); var - 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; + ifile: tMyStringlist; + zeitverfahren: tZeitverfahren; + s,t,aSuffix,aPrefix: string; + deltaX,breite,dPX,dPY,pXMax,pYMax: extended; + i: longint; + kvs: tKnownValues; + teilchen: array of tTeilchenSpezies; + lichter: tMyStringlist; + pro: tProtokollant; + na: pSigActionRec; begin inherited create; prot:=tProtokollant.create(protokollant,name); @@ -1187,10 +1156,8 @@ begin gotSighup:=false; dPX:=-1; dPY:=-1; - dPZ:=-1; pXMax:=3; pYMax:=3; - pZMax:=3; // Standardeinstellungen Bereich 'ausgaben' aPrefix:=extractfilepath(paramstr(0)); @@ -1264,13 +1231,8 @@ 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('maximalimpuls ',s) then begin @@ -1282,13 +1244,8 @@ 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 @@ -1436,8 +1393,6 @@ begin dPX:=deltaX; if dPY<0 then dPY:=sqrt(deltaX); - if dPZ<0 then - dPZ:=sqrt(deltaX); pro:=tProtokollant.create(prot,'create'); case zeitverfahren of @@ -1463,8 +1418,6 @@ begin 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 @@ -1503,7 +1456,7 @@ begin setlength(sighupSimulationen,length(sighupSimulationen)+1); sighupSimulationen[length(sighupSimulationen)-1]:=self; - 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); + 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,dPX,dPY); for i:=0 to length(teilchen)-1 do teilchen[i].free; setlength(teilchen,0); diff --git a/Plasmapropagation.lps b/Plasmapropagation.lps index b7f8821..adb0f8b 100644 --- a/Plasmapropagation.lps +++ b/Plasmapropagation.lps @@ -17,12 +17,12 @@ - - - - + + + + - + @@ -31,14 +31,14 @@ - + - + @@ -48,7 +48,7 @@ - + @@ -56,7 +56,7 @@ - + @@ -147,130 +147,130 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + -- cgit v1.2.3-70-g09d2