From 56fc646e63363dbbe5f4e5b6e3f0ac3e116fe729 Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Wed, 9 Dec 2015 11:11:31 +0100 Subject: zwei Optionen der Dichtenichtnegativierung: Skalieren und Einzelklau --- Physikunit.pas | 62 +++++++++++++++++--- Plasmapropagation.lps | 157 +++++++++++++++++++++++++++----------------------- genLikoInc | 2 +- input.epost | 143 ++++++++++++++++++++++++++++++++++++--------- input.plap | 33 ++++++----- linearkombination.inc | 2 +- 6 files changed, 274 insertions(+), 125 deletions(-) diff --git a/Physikunit.pas b/Physikunit.pas index 0ba1418..2a87c63 100644 --- a/Physikunit.pas +++ b/Physikunit.pas @@ -6,9 +6,15 @@ unit Physikunit; {$ERROR This program can be compiled only on/for Unix/Linux based systems.} {$ENDIF} -{$DEFINE Dichteueberwachung} -{$DEFINE negativeDichteueberwachung} -{ $DEFINE exzessiveArrayBereichsTests} +{$MACRO on} + +// nach einer LiKo negative Dichten entfernen: +{ $DEFINE DichteNichtnegativieren:=perSkalieren} // insgesamt runter skalieren um negative Dichten aufzufüllen +{$DEFINE DichteNichtnegativieren:=perEinzelklau} // negative Dichten aus zufälligen Phasenraumpunkten auffüllen + +{ $DEFINE negativeDichteueberwachung} // prüfen, ob die Dichten negativ werden + +{ $DEFINE exzessiveArrayBereichsTests} // zeitaufwändige(!) Array-Bereichstest für fftw interface @@ -132,7 +138,9 @@ type {$IFDEF exzessiveArrayBereichsTests} procedure pruefeArrayEnden(fehler: string); {$ENDIF} + {$IFDEF dichteNichtnegativieren} procedure nichtnegativieren; inline; + {$ENDIF} procedure berechnePhasenraumAbleitungen; inline; public emFelder: array[tEMFeldGroesze,boolean] of pDouble; // EM-Felder und deren Zeitableitungen @@ -171,7 +179,9 @@ type abbruch: boolean; dX,iDX,xl,t: double; kvs: tKnownValues; + {$IF dichteNichtnegativieren = perEinzelklau} impulsRaumPermutationen: array of tLongintArray; + {$ENDIF} procedure abbrechen; public @@ -182,7 +192,9 @@ type destructor destroy; override; procedure iteriereSchritt(dT: double); procedure dumpErhaltungsgroeszen; + {$IF dichteNichtnegativieren = perEinzelklau} function gibImpulsRaumPermutation: pTLongintArray; + {$ENDIF} end; { tSimulation } @@ -1349,22 +1361,35 @@ begin end; end; +{$IFDEF dichteNichtnegativieren} procedure tFelder.nichtnegativieren; // Dichten nicht negativ machen var - i,j: longint; - defizit: double; - perm: pTLongintArray; + i,j: longint; + defizit + {$IF dichteNichtnegativieren = perSkalieren} + ,enfizit + {$ENDIF}: double; + {$IF dichteNichtnegativieren = perEinzelklau} + perm: pTLongintArray; + {$ENDIF} begin for i:=0 to length(teilchen)-1 do begin defizit:=0; + {$IF dichteNichtnegativieren = perSkalieren} + enfizit:=0; + {$ENDIF} for j:=0 to aP*aX-1 do if (impulsraum[i,false]+j)^ < 0 then begin defizit:=defizit-(impulsraum[i,false]+j)^; (impulsraum[i,false]+j)^:=0; - end; + end + {$IF dichteNichtnegativieren = perSkalieren} + else enfizit:=enfizit+(impulsraum[i,false]+j)^ + {$ENDIF}; gesamtDefizit:=gesamtDefizit+defizit; + {$IF dichteNichtnegativieren = perEinzelklau} if defizit>0 then begin perm:=gitter.gibImpulsRaumPermutation; for j:=0 to aP*aX-1 do begin @@ -1376,16 +1401,31 @@ begin end else if (impulsraum[i,false]+perm^[j])^>0 then begin defizit:=defizit-(impulsraum[i,false]+perm^[j])^; - (impulsraum[i,false]+perm^[j])^:=0; + (impulsraum[i,false]+perm^[j])^:=0; end; end; end; if defizit>0 then begin + {$ENDIF} + {$IF dichteNichtnegativieren = perSkalieren} + if enfizit=0 then begin + {$ENDIF} gitter.prot.schreibe('Kann Defizit der Teilchensorte '+inttostr(i+1)+' nicht ausgleichen, '+floattostr(defizit)+' bleibt übrig!',true); + gitter.prot.schreibe('Kann Defizit der Teilchensorte '+inttostr(i+1)+' nicht ausgleichen, es ist nichts positives mehr übrig!',true); gitter.abbrechen; + continue; end; + + {$IF dichteNichtnegativieren = perSkalieren} + enfizit:=1-defizit/enfizit; + + if defizit>0 then + for j:=0 to aP*aX-1 do + (impulsraum[i,false]+j)^:=(impulsraum[i,false]+j)^ * enfizit; + {$ENDIF} end; end; +{$ENDIF} procedure tFelder.berechnePhasenraumAbleitungen; var @@ -1535,9 +1575,11 @@ begin end{of Case}; xl:=dX/2; - setlength(impulsRaumPermutationen,10); +{$IF dichteNichtnegativieren = perEinzelklau} + setlength(impulsRaumPermutationen,100); for i:=0 to length(impulsRaumPermutationen)-1 do impulsRaumPermutationen[i]:=permutation(aX*aP); +{$ENDIF} for i:=0 to length(felders)-1 do felders[i]:=tFelder.create(aX,aP,deltaX,deltaP,teilchen,lichter,self); @@ -1633,10 +1675,12 @@ begin felders[aktuelleFelder].dumpErhaltungsgroeszen; end; +{$IF dichteNichtnegativieren = perEinzelklau} function tGitter.gibImpulsRaumPermutation: pTLongintArray; begin result:=@(impulsRaumPermutationen[random(length(impulsRaumPermutationen))]); end; +{$ENDIF} // tSimulation ***************************************************************** diff --git a/Plasmapropagation.lps b/Plasmapropagation.lps index 2ae0fd8..997f683 100644 --- a/Plasmapropagation.lps +++ b/Plasmapropagation.lps @@ -3,12 +3,12 @@ - + - - + + @@ -17,9 +17,9 @@ - - - + + + @@ -28,14 +28,14 @@ - + - - + + @@ -43,39 +43,40 @@ - - + + - - + + + - - - + + + + - - - - - - + + + + - - - - + + + + + @@ -83,64 +84,65 @@ - + - + - + - + - + - + + - + - + - + - - + + @@ -148,133 +150,144 @@ - + - + + + + + + + + - + - - + + - - + + - - + + - - + + - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + - + - + - + - + + + + + diff --git a/genLikoInc b/genLikoInc index e4e49d6..2a16dcb 100755 --- a/genLikoInc +++ b/genLikoInc @@ -101,7 +101,7 @@ do done echo ";" >> ${file} echo >> ${file} -echo " {\$IFDEF Dichteueberwachung}" >> ${file} +echo " {\$IFDEF DichteNichtnegativieren}" >> ${file} echo " nichtnegativieren;" >> ${file} echo " {\$ENDIF}" >> ${file} echo >> ${file} diff --git a/input.epost b/input.epost index 40b67a6..4a14358 100644 --- a/input.epost +++ b/input.epost @@ -3,6 +3,9 @@ # Führende und folgende Leerzeichen werden ignoriert. # Leere oder mit # beginnende Zeilen werden ignoriert. +ohne Logdateien +#ohne Bildschirmausgaben + Palette Name: erweiterter Regenbogen ffffff @@ -22,13 +25,101 @@ Palette 0000ff Ende +Palette + Name: monoblau + 000000 + ff0000 +Ende + +Palette + Name: monogelb + 000000 + 00ffff +Ende + +!setze $iBereich: 0..4 +!setze $jBereich: 0..99 + +#!setze $iBereich: 0 +#!setze $jBereich: 00 + Threadanzahl: 11 +externer Befehl: rm /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Bilder/* +externer Befehl: rm /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Videos/* + +sequentiell lesen + +!Schleife: $spezies: 1 2 + +!Schleife: $i: $iBereich +!Schleife: $j: $jBereich + +Daten einlesen Phasenraum$spezies-$i-$j + Genauigkeit: double + PhaseSpace-Datei: /nfs/synologynfs/erich/Plasmapropagation/Daten/N$spezies-$i-$j_test.dat +Ende + +maximale und minimale Dichten bestimmen Phasenraum$spezies-$i-$j + +!Schleifenende +!Schleifenende + +maximale und minimale Dichten angleichen Phasenraum$spezies-0-00 + !Schleife: $i: $iBereich + !Schleife: $j: $jBereich + Phasenraum$spezies-$i-$j + !Schleifenende + !Schleifenende +Ende + +!Schleifenende + +!Schleife: $spezies: -beides 1 2 + +# !Schleife: $spezies: 1 2 + +!Schleife: $i: $iBereich +!Schleife: $j: $jBereich + +?$spezies = -beides: lineares Bild Phasenraum1-$i-$j +?$spezies = -beides: Palette: monoblau +?$spezies = -beides: Daten: 1 Phasenraum2-$i-$j +?$spezies = -beides: Palette: 1 monogelb +?$spezies = -beides: Nachbearbeitung: 1 Log: 10^-4 +?$spezies ≠ -beides: lineares Bild Phasenraum$spezies-$i-$j +?$spezies ≠ -beides: Palette: erweiterter Regenbogen + + Minimaldichte: 10^-4 + Nachbearbeitung: Log: 10^-4 + Datei: /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Bilder/Phasenraum$spezies-$i$j.test.bmp + Schriftgröße: 60 + Achse: oben 10+ + Achse: links 2+ + Achse: unten 10+ + Achse: rechts 2+ + Rahmen +Ende + +externer Befehl: convert /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Bilder/Phasenraum$spezies-$i$j.test.bmp /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Bilder/Phasenraum$spezies-$i$j.test.png& + +!Schleifenende +!Schleifenende + +warte auf externe Befehle + +externer Befehl: rm /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Bilder/*.bmp +externer Befehl: ffmpeg -r 25 -i /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Bilder/Phasenraum$spezies-%03d.test.png /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Videos/Phasenraum$spezies-test.mp4 & + +!Schleifenende + +Dateiende + parallel lesen -!setze $symFelder: VX1 # AY DAYDT # EX -!setze $asyFelder: N1 PXRIPPLE1 -!setze $reineInputFelder: PX1 PXSQR1 +!setze $symFelder: AY #VX1 # AY DAYDT # EX +!setze $asyFelder: N1 N2 #PXRIPPLE1 +!setze $reineInputFelder: #PX1 PXSQR1 !Schleife: $Feld: $reineInputFelder $asyFelder $symFelder @@ -37,34 +128,34 @@ Daten einlesen Genauigkeit: double xmax: 5 tmax: 2 - SpaceTime-Datei: /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Daten/$Feld-*_test.dat + SpaceTime-Datei: /nfs/synologynfs/erich/Plasmapropagation/Daten/$Feld-*_test.dat Ende !Schleifenende -!setze $asyBerFelder: PXBreite +!setze $asyBerFelder: #PXBreite -Teile VX1 durch N1 zu VX1 -Ende +#Teile VX1 durch N1 zu VX1 +#Ende -Teile PX1 durch N1 zu PX1 -Ende +#Teile PX1 durch N1 zu PX1 +#Ende -Teile PXRIPPLE1 durch N1 zu PXRIPPLE1 -Ende +#Teile PXRIPPLE1 durch N1 zu PXRIPPLE1 +#Ende -Teile PXSQR1 durch N1 zu PXSQR1 -Ende +#Teile PXSQR1 durch N1 zu PXSQR1 +#Ende -Multipliziere PX1 mal PX1 - Name: PX1SQR -Ende +#Multipliziere PX1 mal PX1 +# Name: PX1SQR +#Ende -Linearkombination - Name: PXBreite - PXSQR1 1 - PX1SQR -1 -Ende +#Linearkombination +# Name: PXBreite +# PXSQR1 1 +# PX1SQR -1 +#Ende !Schleife: $Feld: $symFelder $asyFelder $asyBerFelder @@ -75,7 +166,7 @@ lineares Bild $Feld ?$Feld in $asyFelder $asyBerFelder: maximale und minimale Dichten bestimmen ?$Feld = N1: Minimaldichte: 10^-4 ?$Feld = N1: Nachbearbeitung: Log: 10^-4 - Datei: /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Daten/$Feld_test.bmp + Datei: /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Bilder/$Feld_test.bmp Schriftgröße: 60 Achse: oben 10+ Achse: links 2+ @@ -83,7 +174,7 @@ lineares Bild $Feld Achse: rechts 2+ Rahmen ?$Feld ≠ N1: !überspringe: 11 - Legende: /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Daten/$Feld_Legende.bmp + Legende: /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Bilder/$Feld_Legende.bmp Schriftgröße: 30 Ausrichtung: senkrecht Breite: 50 @@ -96,12 +187,12 @@ lineares Bild $Feld Ende Ende -?$Feld = N1: externer Befehl: convert /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Daten/$Feld_Legende.bmp /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Daten/$Feld_Legende.png& +?$Feld = N1: externer Befehl: convert /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Bilder/$Feld_Legende.bmp /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Bilder/$Feld_Legende.png& -externer Befehl: convert /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Daten/$Feld_test.bmp /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Daten/$Feld_test.png& +externer Befehl: convert /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Bilder/$Feld_test.bmp /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Bilder/$Feld_test.png& !Schleifenende warte auf externe Befehle -externer Befehl: rm /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Daten/*.bmp +externer Befehl: rm /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Bilder/*.bmp diff --git a/input.plap b/input.plap index 4a699ad..67ba191 100644 --- a/input.plap +++ b/input.plap @@ -11,7 +11,7 @@ allgemein zeitschritt 10^-2 * T maximalimpuls 5 impulsschritt 2*10^-2 - zeit 2 * T + zeit 5 * T !setze $breite: (5 * λ) breite $breite mit Fortschrittsanzeige @@ -19,15 +19,16 @@ allgemein allgemeinEnde ausgaben - prefix /home_raid/erich/Dokumente/Prograemmchen/Plasmapropagation/Daten/ + prefix /nfs/synologynfs/erich/Plasmapropagation/Daten/ suffix _test.dat - felder AX,AY,dAYDT,EX,BZ,Rho1,Rho2,VX1,PX1,PXSqr1,N1,PXRipple1 + felder AX,AY,dAYDT,EX,BZ,VX1,PX1,PXSqr1,N1,N2,PXRipple1,Rho1,Rho2 + phasenraum N1,N2 ausgabenEnde !setze $tFwhm: (2.5 * T) !setze $tMitte: (1 * T) -# licht von links 2 * 2^(-2*((t-$tMitte)/$tFwhm)^2) * ω * cos(ω*t) # Zeitableitung des A-Feldes +licht von links 2 * 2^(-2*((t-$tMitte)/$tFwhm)^2) * ω * cos(ω*t) # Zeitableitung des A-Feldes !setze $IonenMassenFaktor: (1836.15267245 + 1838.68366158) @@ -62,18 +63,18 @@ teilchen2 maximales dLnN/dX 10 maximales dLnN/dP 2 impulsbreite 1/20 -# verteilung wie teilchen1 - verteilung stückweise - 0 - (0.1 + $breite-$profilbreite)/2 - $randbreite - sin((x - (0.1 + $breite-$profilbreite)/2 - $randbreite)*π/2/$randbreite)^2 - (0.1 + $breite-$profilbreite)/2 - 1 - (0.1 + $breite+$profilbreite)/2 - sin((x - (0.1 + $breite+$profilbreite)/2 + $randbreite)*π/2/$randbreite)^2 - (0.1 + $breite+$profilbreite)/2 + $randbreite - 0 - stückweiseEnde + verteilung wie teilchen1 +# verteilung stückweise +# 0 +# (0.1 + $breite-$profilbreite)/2 - $randbreite +# sin((x - (0.1 + $breite-$profilbreite)/2 - $randbreite)*π/2/$randbreite)^2 +# (0.1 + $breite-$profilbreite)/2 +# 1 +# (0.1 + $breite+$profilbreite)/2 +# sin((x - (0.1 + $breite+$profilbreite)/2 + $randbreite)*π/2/$randbreite)^2 +# (0.1 + $breite+$profilbreite)/2 + $randbreite +# 0 +# stückweiseEnde teilchen2Ende Dateiende diff --git a/linearkombination.inc b/linearkombination.inc index bca3601..ccfdd41 100644 --- a/linearkombination.inc +++ b/linearkombination.inc @@ -259,7 +259,7 @@ begin + fak32*(in32.impulsraum[i,true]+j)^ {$ENDIF}; - {$IFDEF Dichteueberwachung} + {$IFDEF DichteNichtnegativieren} nichtnegativieren; {$ENDIF} -- cgit v1.2.3-54-g00ecf