From e20ec8ad41cb878c9c4ab03579abb6535179aee7 Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Fri, 13 Nov 2015 09:36:40 +0100 Subject: Phasenraum nun abspeicherbar --- Physikunit.pas | 239 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 204 insertions(+), 35 deletions(-) diff --git a/Physikunit.pas b/Physikunit.pas index bf76b6f..b5000e2 100644 --- a/Physikunit.pas +++ b/Physikunit.pas @@ -42,9 +42,9 @@ type tGitter = class; tSimulation = class; - { tAusgabeDatei } + { tFeldAusgabeDatei } - tAusgabeDatei = class + tFeldAusgabeDatei = class private ableitung: boolean; emFeld: tEMFeldGroesze; @@ -70,6 +70,24 @@ type procedure verzeichnisAufraeumen; end; + { tImpulsRaumAusgabeDatei } + + tImpulsRaumAusgabeDatei = class + private + teilchen,nNum,tCnt: longint; + pre,suf: string; + pro: tProtokollant; + public + zeitAnz: longint; + sDT: double; + constructor create(feldName,prefix,suffix: string; prot: tProtokollant; nam: string); + destructor destroy; override; + function dump: string; + procedure naechsterZykel; + procedure speichereWerte(gitter: tGitter; sT: double); + procedure verzeichnisAufraeumen; + end; + { tTeilchenSpezies } tTeilchenSpezies = class @@ -171,7 +189,8 @@ type gitter: tGitter; dT,tEnde,sT,sDT,sDX: double; fortschrittsAnzeige: boolean; - ausgabeDateien: array of tAusgabeDatei; + feldAusgabeDateien: array of tFeldAusgabeDatei; + impulsRaumAusgabeDateien: array of tImpulsRaumAusgabeDatei; public gotSigusr1,gotSigterm, gotSigint: boolean; @@ -199,9 +218,9 @@ const var simulationen: array of tSimulation; -// tAusgabeDatei *************************************************************** +// tFeldAusgabeDatei *********************************************************** -constructor tAusgabeDatei.create(feldName,prefix,suffix: string; prot: tProtokollant; nam: string); +constructor tFeldAusgabeDatei.create(feldName,prefix,suffix: string; prot: tProtokollant; nam: string); var emF: tEMFeldGroesze; emQ: tEMQuellGroesze; @@ -264,7 +283,7 @@ begin end; if not gef then begin - pro.schreibe('tAusgabeDatei.create kennt Größe '''+feldName+''' nicht!',true); + pro.schreibe('tFeldAusgabeDatei.create kennt Größe '''+feldName+''' nicht!',true); nam:=''; for abl:=false to true do for emF:=low(tEMFeldGroesze) to high(tEMFeldGroesze) do @@ -275,7 +294,7 @@ begin nam:=nam+', '+matSpeicherNamen[maF]; delete(nam,1,2); pro.schreibe('Ich kenne nur: '+nam,true); - raise exception.create('Fehler in tAusgabeDatei.create!'); + raise exception.create('Fehler in tFeldAusgabeDatei.create!'); end; case wasSpeichern of @@ -297,19 +316,19 @@ begin suf:=suffix; end; -destructor tAusgabeDatei.destroy; +destructor tFeldAusgabeDatei.destroy; begin if bufPos<>0 then schreibeBuffer(0); freeMem(buf,bufLen); if (tCnt<>zeitAnz) and ((nNum<>0) or (tCnt<>-1)) then begin pro.schreibe('Falsche Anzahl an Zeitschritten in '+pre+'-'+inttostr(nNum-1)+suf+' geschrieben ('+inttostr(tCnt)+' statt '+inttostr(zeitAnz)+')!',true); - raise exception.create('Fehler in tAusgabeDatei.destroy!'); + raise exception.create('Fehler in tFeldAusgabeDatei.destroy!'); end; inherited destroy; end; -procedure tAusgabeDatei.schreibeBuffer(minBufLen: longint); +procedure tFeldAusgabeDatei.schreibeBuffer(minBufLen: longint); begin if buf=nil then begin bufLen:=max(minAusgabeBuffer,minBufLen); @@ -323,7 +342,7 @@ begin bufPos:=0; end; -function tAusgabeDatei.dump: string; +function tFeldAusgabeDatei.dump: string; begin case wasSpeichern of 0: result:=emFeldNamen[emFeld]; @@ -337,11 +356,11 @@ begin result:=result+' -> '+pre+'-$i'+suf; end; -procedure tAusgabeDatei.schreibeKopf; +procedure tFeldAusgabeDatei.schreibeKopf; begin if (tCnt<>zeitAnz) and ((nNum<>0) or (tCnt<>-1)) then begin pro.schreibe('Falsche Anzahl an Zeitschritten in '+pre+'-'+inttostr(nNum-1)+suf+' geschrieben ('+inttostr(tCnt)+' statt '+inttostr(zeitAnz)+')!',true); - raise exception.create('Fehler in tAusgabeDatei.schreibeKopf!'); + raise exception.create('Fehler in tFeldAusgabeDatei.schreibeKopf!'); end; if bufPos<>0 then schreibeBuffer(0); @@ -354,13 +373,13 @@ begin closefile(datei); end; -procedure tAusgabeDatei.speichereWerte(gitter: tGitter; sT, sDX: double); +procedure tFeldAusgabeDatei.speichereWerte(gitter: tGitter; sT, sDX: double); var i,cnt: longint; sX,cX,val: double; begin if (teilchen>=length(gitter.felders[gitter.aktuelleFelder].teilchen)) then begin pro.schreibe('Teilchen '+inttostr(teilchen+1)+' gibt es nicht, da kann ich auch nichts speichern!',true); - raise exception.create('Fehler in tAusgabeDatei.speichereWerte!'); + raise exception.create('Fehler in tFeldAusgabeDatei.speichereWerte!'); end; if sT>=nNum then @@ -376,7 +395,7 @@ begin if bufLen-bufPos < sizeof(longint) + (2+cnt)*sizeof(double) then begin pro.schreibe('Schreibbuffer ist zu klein ('+inttostr(bufLen)+' statt mindestens '+inttostr(sizeof(longint) + (2+cnt)*sizeof(double))+' Bytes)!'); - raise exception.create('Fehler in tAusgabeDatei.speichereWerte!'); + raise exception.create('Fehler in tFeldAusgabeDatei.speichereWerte!'); end; move(cX,(buf+bufPos)^,sizeof(double)); @@ -423,11 +442,141 @@ begin end{of case}; if cnt<>0 then begin pro.schreibe('Falsche Anzahl an Ortsschritten geschrieben ('+inttostr(cnt)+')!',true); - raise exception.create('Fehler in tAusgabeDatei.speichereWerte!'); + raise exception.create('Fehler in tFeldAusgabeDatei.speichereWerte!'); end; end; -procedure tAusgabeDatei.verzeichnisAufraeumen; +procedure tFeldAusgabeDatei.verzeichnisAufraeumen; +var + sr: tSearchRec; + err: longint; + dats: tStringList; + pfad: string; + i: longint; +begin + dats:=tStringList.create; + pfad:=extractfilepath(pre+'00'+suf); + err:=findFirst(pfad+'*',$00,sr); + while err=0 do begin + if (sr.name<>'.') and (sr.name<>'..') then + dats.add(pfad+sr.name); + err:=findNext(sr); + end; + findClose(sr); + for i:=0 to dats.count-1 do + if (rightStr(dats[i],4)<>'.dat') and + (rightStr(dats[i],4)<>'.png') and + (rightStr(dats[i],4)<>'.bmp') then begin + pro.schreibe('Zu löschende Datei ist keine .dat, .bmp oder .png!',true); + raise exception.create('Zu löschende Datei ist keine .dat, .bmp oder .png!'); + end; + for i:=0 to dats.count-1 do + deleteFile(dats[i]); + dats.free; +end; + +// tImpulsRaumAusgabeDatei ***************************************************** + +constructor tImpulsRaumAusgabeDatei.create(feldName,prefix,suffix: string; prot: tProtokollant; nam: string); +var + num: longint; +begin + inherited create; + pro:=tProtokollant.create(prot,nam); + num:=length(feldName); + while (num>0) and (feldName[num] in ['0'..'9']) do + dec(num); + inc(num); + if num<=length(feldName) then begin + teilchen:=strtoint(copy(feldName,num,length(feldName)))-1; + delete(feldName,num,length(feldName)); + end + else begin + pro.schreibe('tImpulsRaumAusgabeDatei.create kann keine über Teilchen integrierten Größen abspeichern!',true); + raise exception.create('Fehler in tImpulsRaumAusgabeDatei.create!'); + end; + if feldName<>'N' then begin + pro.schreibe('tImpulsRaumAusgabeDatei.create kennt Größe '''+feldName+''' nicht!',true); + pro.schreibe('Ich kenne nur N!',true); + raise exception.create('Fehler in tImpulsRaumAusgabeDatei.create!'); + end; + + nNum:=0; // Header 0 wurde also noch nicht geschrieben + zeitAnz:=-1; + tCnt:=-1; + + pre:='N'; + if teilchen>=0 then + pre:=pre+inttostr(teilchen+1); + + pre:=prefix+pre; + suf:=suffix; +end; + +destructor tImpulsRaumAusgabeDatei.destroy; +begin + if (tCnt<>zeitAnz) and ((nNum<>0) or (tCnt<>-1)) then begin + pro.schreibe('Falsche Anzahl an Zeitschritten in '+pre+'-'+inttostr(nNum-1)+suf+' geschrieben ('+inttostr(tCnt)+' statt '+inttostr(zeitAnz)+')!',true); + raise exception.create('Fehler in tImpulsRaumAusgabeDatei.destroy!'); + end; + inherited destroy; +end; + +function tImpulsRaumAusgabeDatei.dump: string; +begin + result:='N'; + if teilchen>=0 then + result:=result+'['+inttostr(teilchen+1)+']'; + result:=result+' -> '+pre+'-$i_$j'+suf; +end; + +procedure tImpulsRaumAusgabeDatei.naechsterZykel; +begin + if (tCnt<>zeitAnz) and ((nNum<>0) or (tCnt<>-1)) then begin + pro.schreibe('Falsche Anzahl an Zeitschritten in '+pre+'-'+inttostr(nNum-1)+suf+' geschrieben ('+inttostr(tCnt)+' statt '+inttostr(zeitAnz)+')!',true); + raise exception.create('Fehler in tImpulsRaumAusgabeDatei.schreibeKopf!'); + end; + tCnt:=0; + inc(nNum); +end; + +procedure tImpulsRaumAusgabeDatei.speichereWerte(gitter: tGitter; sT: double); +var + tmpI: longint; + tmpD: double; + sF: tFelder; + datei: file; +begin + if (teilchen>=length(gitter.felders[gitter.aktuelleFelder].teilchen)) then begin + pro.schreibe('Teilchen '+inttostr(teilchen+1)+' gibt es nicht, da kann ich auch nichts speichern!',true); + raise exception.create('Fehler in tImpulsRaumAusgabeDatei.speichereWerte!'); + end; + + if sT>=nNum then + naechsterZykel; + + assignFile(datei,pre+'-'+inttostr(nNum-1)+'-'+inttostr(tCnt)+suf); + rewrite(datei,1); + + sF:=gitter.felders[gitter.aktuelleFelder]; + + blockWrite(datei,gitter.xl,sizeof(double)); + tmpD:=gitter.xl + (sF.aX-1)*sF.dX; + blockWrite(datei,tmpD,sizeof(double)); + tmpI:=sF.aX; + blockWrite(datei,tmpI,sizeof(longint)); + tmpD:=-(sF.aP-1)*sF.dP/2; + blockWrite(datei,tmpD,sizeof(double)); + tmpD:=-tmpD; + blockWrite(datei,tmpD,sizeof(double)); + tmpI:=sF.aP; + blockWrite(datei,tmpI,sizeof(longint)); + blockWrite(datei,sF.impulsraum[teilchen,false]^,sizeof(double)*sF.aX*sF.aP); + + closeFile(datei); +end; + +procedure tImpulsRaumAusgabeDatei.verzeichnisAufraeumen; var sr: tSearchRec; err: longint; @@ -1456,7 +1605,8 @@ begin // Standardeinstellungen Bereich 'ausgaben' aPrefix:=extractfilepath(paramstr(0)); aSuffix:='.dat'; - setlength(ausgabeDateien,0); + setlength(feldAusgabeDateien,0); + setlength(impulsRaumAusgabeDateien,0); // Standardeinstellungen Bereich 'lichtVon...' lichter:=tMyStringlist.create(prot,'lichter'); @@ -1575,8 +1725,17 @@ begin s:=s+','; while s<>'' do begin t:=erstesArgument(s,','); - setlength(ausgabeDateien,length(ausgabeDateien)+1); - ausgabeDateien[length(ausgabeDateien)-1]:=tAusgabeDatei.create(t,aPrefix,aSuffix,prot,'ausgabeDateien['+inttostr(length(ausgabeDateien)-1)+']'); + setlength(feldAusgabeDateien,length(feldAusgabeDateien)+1); + feldAusgabeDateien[length(feldAusgabeDateien)-1]:=tFeldAusgabeDatei.create(t,aPrefix,aSuffix,prot,'feldAusgabeDateien['+inttostr(length(feldAusgabeDateien)-1)+']'); + end; + continue; + end; + if startetMit('phasenraum ',s) then begin + s:=s+','; + while s<>'' do begin + t:=erstesArgument(s,','); + setlength(impulsRaumAusgabeDateien,length(impulsRaumAusgabeDateien)+1); + impulsRaumAusgabeDateien[length(impulsRaumAusgabeDateien)-1]:=tImpulsRaumAusgabeDatei.create(t,aPrefix,aSuffix,prot,'impulsRaumAusgabeDateien['+inttostr(length(impulsRaumAusgabeDateien)-1)+']'); end; continue; end; @@ -1662,14 +1821,14 @@ begin ifile.free; - if length(ausgabedateien)=0 then begin + if (length(feldAusgabeDateien)=0) and (length(impulsRaumAusgabeDateien)=0) then begin prot.schreibe('Du solltest irgendetwas abspeichern lassen!',true); raise exception.create('Fehler in tSimulation.create!'); end; if ausgabeverzeichnisAufraeumen then - for i:=0 to length(ausgabedateien)-1 do - ausgabeDateien[i].verzeichnisAufraeumen; + for i:=0 to length(feldAusgabedateien)-1 do + feldAusgabeDateien[i].verzeichnisAufraeumen; if dT<0 then dT:=dX/10; @@ -1722,12 +1881,20 @@ begin pro.schreibe('lichter:'); lichter.dump(pro,' '); end; - if length(ausgabeDateien)>0 then begin - pro.schreibe('ausgaben:'); - for i:=0 to length(ausgabeDateien)-1 do begin - ausgabeDateien[i].zeitAnz:=round(1/sDT); - ausgabeDateien[i].sDT:=sDT; - pro.schreibe(' '+ausgabeDateien[i].dump); + if length(feldAusgabeDateien)>0 then begin + pro.schreibe('feldAusgaben:'); + for i:=0 to length(feldAusgabeDateien)-1 do begin + feldAusgabeDateien[i].zeitAnz:=round(1/sDT); + feldAusgabeDateien[i].sDT:=sDT; + pro.schreibe(' '+feldAusgabeDateien[i].dump); + end; + end; + if length(impulsRaumAusgabeDateien)>0 then begin + pro.schreibe('impulsRaumAusgaben:'); + for i:=0 to length(impulsRaumAusgabeDateien)-1 do begin + impulsRaumAusgabeDateien[i].zeitAnz:=round(1/sDT); + impulsRaumAusgabeDateien[i].sDT:=sDT; + pro.schreibe(' '+impulsRaumAusgabeDateien[i].dump); end; end; pro.free; @@ -1763,9 +1930,9 @@ destructor tSimulation.destroy; var i,j: longint; begin - for i:=0 to length(ausgabeDateien)-1 do - ausgabeDateien[i].free; - setlength(ausgabeDateien,0); + for i:=0 to length(feldAusgabeDateien)-1 do + feldAusgabeDateien[i].free; + setlength(feldAusgabeDateien,0); gitter.free; prot.free; for i:=length(simulationen)-1 downto 0 do @@ -1796,8 +1963,10 @@ begin zeitPhysik:=zeitPhysik+now; zeitDatei:=zeitDatei-now; while (gitter.t>=sT) and (sT