summaryrefslogtreecommitdiff
path: root/epostunit.pas
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2016-02-02 16:15:23 +0100
committerErich Eckner <git@eckner.net>2016-02-03 11:39:30 +0100
commitd96e7abd7bffe5d87eb29ff9cb79ade3fdb2f948 (patch)
treea30b863577d2632bccd4d3d1c01895c7ecd89f5e /epostunit.pas
parent0f78cc7a7d4385657dab0fd1980bd02f63589a9c (diff)
downloadepost-d96e7abd7bffe5d87eb29ff9cb79ade3fdb2f948.tar.xz
TAgglomeration neu
Diffstat (limited to 'epostunit.pas')
-rw-r--r--epostunit.pas193
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;