diff options
author | Erich Eckner <git@eckner.net> | 2016-02-02 16:15:23 +0100 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2016-02-03 11:39:30 +0100 |
commit | d96e7abd7bffe5d87eb29ff9cb79ade3fdb2f948 (patch) | |
tree | a30b863577d2632bccd4d3d1c01895c7ecd89f5e /epostunit.pas | |
parent | 0f78cc7a7d4385657dab0fd1980bd02f63589a9c (diff) | |
download | epost-d96e7abd7bffe5d87eb29ff9cb79ade3fdb2f948.tar.xz |
TAgglomeration neu
Diffstat (limited to 'epostunit.pas')
-rw-r--r-- | epostunit.pas | 193 |
1 files changed, 182 insertions, 11 deletions
diff --git a/epostunit.pas b/epostunit.pas index a804c01..45cdb26 100644 --- a/epostunit.pas +++ b/epostunit.pas @@ -124,6 +124,7 @@ type function ladeDateien(st: boolean; var f: tMyStringlist; pl,sa: boolean): boolean; function ladeAscii(st: boolean; datei: string): boolean; function berechneLiKo(st: boolean; var f: tMyStringlist; threads: longint): boolean; + function berechneAgglomeration(st: boolean; var f: tMyStringlist): boolean; function berechneQuotient(st: boolean; var f: tMyStringlist; threads, dividend, divisor: longint): boolean; function berechneProdukt(st: boolean; var f: tMyStringlist; threads, faktor1, faktor2: longint): boolean; function berechneKorrelation(st: boolean; var f: tMyStringlist; threads: longint; const quelle: tWerte): boolean; @@ -1790,6 +1791,167 @@ begin result:=true; end; +function tWerte.berechneAgglomeration(st: boolean; var f: tMyStringlist): boolean; +var + i,xmin,xmax,tmin,tmax: longint; + quellen: tWerteArray; + s: string; + Zeit,schritt: extended; + horizontal: boolean; + pSi: pTLLWerteSingle; + pDo: pTLLWerteDouble; + pEx: pTLLWerteExtended; +begin + result:=false; + warteaufBeendigungDesLeseThreads; + setlength(quellen,0); + Genauigkeit:=gExtended; + _xsteps:=0; + _tsiz:=0; + Zeit:=now; + schritt:=1; + horizontal:=true; + repeat + if not f.metaReadln(s,true) then begin + gibAus('Unerwartetes Dateiende!',3); + exit; + end; + if s='Ende' then break; + if startetMit('xmin:',s) then begin + xmin:=kont2disk('x',exprtofloat(st,s)); + continue; + end; + if startetMit('xmax:',s) then begin + xmax:=kont2disk('x',exprtofloat(st,s)); + continue; + end; + if startetMit('tmin:',s) then begin + tmin:=kont2disk('t',exprtofloat(st,s)); + continue; + end; + if startetMit('tmax:',s) then begin + tmax:=kont2disk('t',exprtofloat(st,s)); + continue; + end; + if startetMit('Schritt:',s) then begin + schritt:=exprtofloat(st,s); + continue; + end; + if s='horizontal' then begin + horizontal:=true; + continue; + end; + if s='vertikal' then begin + horizontal:=true; + continue; + end; + setlength(quellen,length(quellen)+1); + i:=findeWerte(erstesArgument(s),nil,wertes,Konturen,false); + if i<0 then + exit; + quellen[length(quellen)-1]:=wertes^[i]; + if _xsteps=0 then begin + _xsteps:=quellen[length(quellen)-1]._xsteps; + Transformationen.kopiereVon(quellen[length(quellen)-1].Transformationen); + xmin:=0; + xmax:=_xsteps-1; + end; + if _tsiz=0 then begin + _tsiz:=quellen[length(quellen)-1]._tsiz; + Transformationen.kopiereVon(quellen[length(quellen)-1].Transformationen); + tmin:=0; + tmax:=_tsiz-1; + end; + if _xsteps<>quellen[length(quellen)-1]._xsteps then begin + gibAus('Unterschiedliche Anzahl an x-Schritten: '+inttostr(_xsteps)+' bisher vs. '+inttostr(quellen[length(quellen)-1]._xsteps)+' bei '+inttostr(i)+'!',3); + exit; + end; + if _tsiz<>quellen[length(quellen)-1]._tsiz then begin + gibAus('Unterschiedliche Anzahl an t-Schritten: '+inttostr(_tsiz)+' bisher vs. '+inttostr(quellen[length(quellen)-1]._tsiz)+' bei '+inttostr(i)+'!',3); + exit; + end; + if quellen[length(quellen)-1].Transformationen.xstart<>quellen[0].Transformationen.xstart then begin + gibAus('Anfangspostionen passen nicht zusammen ('+floattostr(quellen[0].Transformationen.xstart)+' bisher vs. '+floattostr(quellen[length(quellen)-1].Transformationen.xstart)+' bei '+inttostr(i)+')!',3); + exit; + end; + if quellen[length(quellen)-1].Transformationen.xstop<>quellen[0].Transformationen.xstop then begin + gibAus('Endpostionen passen nicht zusammen ('+floattostr(quellen[0].Transformationen.xstop)+' bisher vs. '+floattostr(quellen[length(quellen)-1].Transformationen.xstop)+' bei '+inttostr(i)+')!',3); + exit; + end; + if quellen[length(quellen)-1].Transformationen.tstart<>quellen[0].Transformationen.tstart then begin + gibAus('Anfangszeiten passen nicht zusammen ('+floattostr(quellen[0].Transformationen.tstart)+' bisher vs. '+floattostr(quellen[length(quellen)-1].Transformationen.tstart)+' bei '+inttostr(i)+')!',3); + exit; + end; + if quellen[length(quellen)-1].Transformationen.tstop<>quellen[0].Transformationen.tstop then begin + gibAus('Endzeiten passen nicht zusammen ('+floattostr(quellen[0].Transformationen.tstop)+' bisher vs. '+floattostr(quellen[length(quellen)-1].Transformationen.tstop)+' bei '+inttostr(i)+')!',3); + exit; + end; + until false; + + if length(quellen)=0 then begin + gibAus('Leere Agglomeration!',3); + exit; + end; + + Transformationen.addAusschnitt(xmin,xmax,tmin,tmax); + _xsteps:=xmax-xmin+1; + _tsiz:=tmax-tmin+1; + + if horizontal then + _xsteps:=_xsteps*length(quellen) + else + _tsiz:=_tsiz*length(quellen); + if not Transformationen.addAgglomeration(horizontal,Schritt,length(quellen)) + then exit; + + _np:=quellen[0]._np; + _beta:=quellen[0]._beta; + if st then begin + result:=true; + exit; + end; + eWerte.holeRam(3); + gibAus('Berechne ...',3); + Zeit:=now; + + for i:=0 to length(quellen)-1 do + case quellen[i].Genauigkeit of + gSingle: begin + pSi:=@(quellen[i].sWerte); + eWerte.kopiereVonNach( + pSi, + xmin,xmax, + tmin,tmax, + i*byte(horizontal), + i*byte(not horizontal) + ); + end; + gDouble: begin + pDo:=@(quellen[i].dWerte); + eWerte.kopiereVonNach( + pDo, + xmin,xmax, + tmin,tmax, + i*byte(horizontal), + i*byte(not horizontal) + ); + end; + gExtended: begin + pEx:=@(quellen[i].eWerte); + eWerte.kopiereVonNach( + pEx, + xmin,xmax, + tmin,tmax, + i*byte(horizontal), + i*byte(not horizontal) + ); + end; + end; + + gibAus('... fertig '+timetostr(now-Zeit),3); + result:=true; +end; + function tWerte.berechneQuotient(st: boolean; var f: tMyStringlist; threads, dividend, divisor: longint): boolean; var i,xmin,xmax,tmin,tmax: longint; s: string; @@ -5120,16 +5282,20 @@ begin nichtLeeresArgument:=true; end; begin - inherited create; + if not st then + inherited create; + erfolg:=cmd<>''; - bg:=endetMit('&',cmd); - if not st then begin + if st then begin + endetMit('&',cmd); + shellParseNextArg(cmd); + end + else begin + bg:=endetMit('&',cmd); p:=tProcess.create(nil); p.Options:=p.Options + [poWaitOnExit]; p.Executable:=shellParseNextArg(cmd); - end - else - shellParseNextArg(cmd); + end; nichtLeeresArgument:=cmd=''; if not erfolg then begin if not st then begin @@ -5139,8 +5305,10 @@ begin exit; end; while length(cmd)>0 do begin - if st then shellParseNextArg(cmd) - else p.Parameters.Add(shellParseNextArg(cmd)); + if st then + shellParseNextArg(cmd) + else + p.Parameters.Add(shellParseNextArg(cmd)); if not erfolg then begin if not st then begin p.free; @@ -5149,12 +5317,12 @@ begin exit; end; end; + if st then + exit; if not nichtLeeresArgument then begin p.free; p:=nil; end; - if st then - exit; if assigned(p) then begin cmd:=p.Parameters.Text; while (length(cmd)>0) and (cmd[length(cmd)] in [#10,#13]) do @@ -5844,7 +6012,10 @@ function externerBefehl(st: boolean; s: string): boolean; var bt: tBefehlThread; begin bt:=tBefehlThread.create(st,s,result); - if st then exit; + if st then begin +// bt.free; + exit; + end; if not result then begin try bt.free; |