From: treecity Date: Wed, 25 Jan 2012 14:36:33 +0000 (+0000) Subject: [src] plotShape jetzt auch in Farbe X-Git-Url: https://git.leopard-lacewing.eu/?a=commitdiff_plain;h=99bb2da02aa0a3f7910c590817ffe7d21cf228d3;p=bacc.git [src] plotShape jetzt auch in Farbe [src] A_step mit Plot [src] mark Fehler behoben + Symmetriesierung [src] refineQuad Fehlerfrei? -> Verfeinert nur was wirklich muss (nicht mehr) [src] computeEstSlpMuTilde Variablen angepasst git-svn-id: https://drops.fb12.tu-berlin.de/svn/bacc/trunk@77 26120e32-c555-405d-b3e1-1f783fb42516 --- diff --git a/src/A_step.m b/src/A_step.m index 3d79709..78cee0e 100644 --- a/src/A_step.m +++ b/src/A_step.m @@ -41,7 +41,9 @@ time = zeros(1,3); xe_fine = x_fine'*A_fine*x_fine; - ind = computeEstSlpMuTilde(x_fine,G_C,G_E,f2s); + ind = computeEstSlpMuTilde(x_fine,G_C,G_E,f2s) + length(ind) + size(elements_fine,1) data = [data type(i) sqrt(sum(ind)) xe_fine]; end @@ -54,7 +56,11 @@ time = zeros(1,3); % Adaptiv Verfeinern marked = mark(x_fine(f2s)',ind,eta,eps); - plotShape(coordinates_fine,elements_fine); + figure(1) + plotShape(G_C,G_E,'s',ind); + title('Elemente mit Fehlerschaetzer') + colorbar + view(2) % plotMark(find(marked>1),G_C,G_E); % clear 'coordinates_fine' 'elements_fine' 'neigh_fine' 'f2s' diff --git a/src/computeEstSlpMuTilde.m b/src/computeEstSlpMuTilde.m index 13af47a..de2e61f 100644 --- a/src/computeEstSlpMuTilde.m +++ b/src/computeEstSlpMuTilde.m @@ -11,14 +11,20 @@ if(size(xF2S,1)==1) xF2S = xF2S'; end +tmp = abs([sum(coo(ele(:,2),:)-coo(ele(:,1),:),2)... + sum(coo(ele(:,4),:)-coo(ele(:,1),:),2)]); +hmin = min(tmp,[],2); +hmax = max(tmp,[],2); -len = min(abs([sum(coo(ele(:,2),:)-coo(ele(:,1),:),2)... - sum(coo(ele(:,4),:)-coo(ele(:,1),:),2)]),[],2); +% len = min(abs([sum(coo(ele(:,2),:)-coo(ele(:,1),:),2)... +% sum(coo(ele(:,4),:)-coo(ele(:,1),:),2)]),[],2); sizes = sqrt(sum(quadNorm(coo,ele,'w').^2,2)); +% max(sizes ~= hmin.*hmax) + x_var = sum((xF2S-repmat(sum(xF2S,1)/4,4,1)).^2)'; -ind = len.* sizes .* x_var; +ind = hmin.* sizes .* x_var; end \ No newline at end of file diff --git a/src/mark.m b/src/mark.m index 01d240e..61d9823 100644 --- a/src/mark.m +++ b/src/mark.m @@ -25,8 +25,11 @@ if(theta <1) sum_ind = cumsum(s_ind,1); ell = find(sum_ind >= sum_ind(end) * theta,1); + + %Symertrisieren + ell = ell + find(abs(( sum_ind(ell)-sum_ind(ell:end)))/sum_ind(ell)>10^-2,1); - t1(idx(ell:end)) = 1; % Nicht verfeinert + t1(idx(ell+1:end)) = 1; % Nicht verfeinert end diff --git a/src/plotShape.m b/src/plotShape.m index d50354d..a312b65 100644 --- a/src/plotShape.m +++ b/src/plotShape.m @@ -1,7 +1,7 @@ function plotShape(coordinates, elements, varargin) % % plotShape(coordinates,elements) -% plotShape(coordinates,elements,'FLAG') +% plotShape(coordinates,elements,'FLAG','VEC') % % Diese Funktion Zeichnet alle Vierecke mit ausgefuellten Flaechen. % FLAG: @@ -9,6 +9,7 @@ function plotShape(coordinates, elements, varargin) % b -> nur Kanten der Elemente einzeichnen % n -> Normen auf ein Element einzeichnen (mit Laenge 1) % a -> Normen auf ein Element einzeichnen (Laenge durch Flaecheninhalt) +% s -> Flaechen werden gefaerbt, wobei VEC die Farben der Elemente angibt % % P.Schaefer @@ -17,11 +18,23 @@ c = 0; e = 1; n = 0; optargin = size(varargin,2); -if(optargin>1) +if(optargin>2) error('Zu viele Argumente'); -elseif(optargin==1) +elseif(optargin>=1) if(ismember('b',varargin{1})) e = 0; + elseif(ismember('s',varargin{1})) + if(optargin==2 && length(varargin{2})==size(elements,1)) + e = 2; + color = reshape(varargin{2},length(varargin{2}),1); + maxc = max(color); + minc = min(color); + color = (color - minc)/maxc; +% col = [color ones(length(color),2) ] + + else + error('plotShape:COLOR','Optionale Parameter fuer Faerbung sind Falsch') + end end if(ismember('c',varargin{1})) c = 1; @@ -41,13 +54,23 @@ end %% Flächen eles = size(elements,1); -if(e) +if(e==1) for idx = 1:eles current = coordinates(elements(idx,[1:4,1])',:); % current(3,:) = current(3,:)-current(1,:)+current(2,:); fill3(current(:,1),current(:,2),current(:,3),'b'); % Zeichnet Oberflaeche hold on end +elseif(e==2) + for idx = 1:eles + current = coordinates(elements(idx,[1:4,1])',:); +% [current(:,1),current(:,2),current(:,3)] +% col(idx,:) +% current(3,:) = current(3,:)-current(1,:)+current(2,:); + fill3(current(:,1),current(:,2),current(:,3),color(idx)); % Zeichnet Oberflaeche +% view(2) + hold on + end else for idx = 1:eles current = coordinates(elements(idx,[1:4,1])',:); diff --git a/src/refineQuad.m b/src/refineQuad.m index 767155d..b716592 100644 --- a/src/refineQuad.m +++ b/src/refineQuad.m @@ -30,7 +30,6 @@ global G_ref_C; global G_ref_N; global G_ref_f2s; global G_ref_t; -global G_ref_s; %Elementanzahl speichern c_loop = size(elements,1); @@ -65,15 +64,16 @@ while(1==1) if(isempty(ref)) break; end - figure(6) - plotShape(G_ref_C,G_ref_E) - plotMark(ref,G_ref_C,G_ref_E,'xg') +% figure(6) +% plotShape(G_ref_C,G_ref_E) +% plotMark(ref,G_ref_C,G_ref_E,'xg') +% title('Zum Verfeinern Markierte Elemente') for ele = ref(randperm(length(ref))) %LOL Zufall bringts - figure(5) - plotShape(G_ref_C,G_ref_E) - plotMark(ele,G_ref_C,G_ref_E,'xg') +% figure(5) +% plotShape(G_ref_C,G_ref_E) +% plotMark(ele,G_ref_C,G_ref_E,'xg') +% title('Entscheidene Nachbarelemente') % # HangingNode Check -% ele; Nt = find(G_ref_N(ele,5:8)==0); N = G_ref_N(ele,Nt); N2t = find(N~=0); @@ -87,23 +87,19 @@ while(1==1) N2 = N2(mod(N2tt,2)==1); end - plotMark(N2,G_ref_C,G_ref_E,'or') +% plotMark(N2,G_ref_C,G_ref_E,'or') if(~isempty(N2)) N3t = mod(find((G_ref_N(N2',:)==ele)')-1,4)+1; %Nachbarseiten N4t = find(diag(G_ref_N(N2',(N3t + 4)'))~=0)'; %Nachbarn mit 2Nachbarn if(~isempty(N4t)) for i = N4t %Elemente die noch verfeinert werden muessen - if(N2(i)>length(G_ref_t)||G_ref_t(N2(i))<1); %eins der neuen Elemente + if( N2(i)>length(G_ref_t) || G_ref_t(N2(i))<1 ); %eins der neuen Elemente error('refineQuad:check','Fehlerhafter Typ 0') end %Wie muss das Element verfeinert werden. - N2 - N4t - N3t - N5t = G_ref_t(N2(i)) - mod(N3t(i),2)+3 + N5t = G_ref_t(N2(i)); if(N5t == 1) G_ref_t(N2(i))=mod(N3t(i),2)+3; elseif(N5t == mod(N3t(i)+1,2)+3) @@ -141,7 +137,6 @@ while(err==0) for ele = ref(randperm(length(ref))) %LOL Zufall bringts % # HangingNode Check - ele Nt = find(G_ref_N(ele,5:8)==0); N = G_ref_N(ele,Nt); N2t = find(N~=0); @@ -161,8 +156,8 @@ while(err==0) if(~isempty(N4t)) for i = N4t %Elemente die noch verfeinert werden muessen if(N2(i)>length(G_ref_t)||G_ref_t(N2(i))<1); %eins der neuen Elemente - figure(3) - G_ref_t(ele) + figure(7) + title('Fehlerhaftes Element mit Nachbar') plotShape(G_ref_C,G_ref_E) plotMark([N2(i) ele],G_ref_C,G_ref_E) error('refineQuad:refine','SKRIPTFEHLER: Dieses Element darf noch nicht verfeinert sein') @@ -181,25 +176,27 @@ while(err==0) end end - disp 'called' +% disp 'called' continue; end end % Wenn Alle Überprüfungen durchgelaufen sind - ref - G_ref_t(ref) - G_ref_t(ele) - figure(3) - plotShape(G_ref_C,G_ref_E) - plotMark(ele,G_ref_C,G_ref_E) +% ref +% G_ref_t(ref) +% G_ref_t(ele) +% figure(3) +% plotShape(G_ref_C,G_ref_E) +% plotMark(ele,G_ref_C,G_ref_E) +% title('Netz vorm Verfeinern') refineE(ele); updateN(ele); - figure(4) - plotShape(G_ref_C,G_ref_E) - plotMark(G_ref_f2s(ele,:),G_ref_C,G_ref_E) +% figure(4) +% plotShape(G_ref_C,G_ref_E) +% plotMark(G_ref_f2s(ele,:),G_ref_C,G_ref_E) +% title('Netz nach dem Verfeinern') end end @@ -347,28 +344,32 @@ global G_ref_f2s; % plotShape(G_ref_C,G_ref_E); -this = G_ref_N(ele,:) +this = G_ref_N(ele,:); % ele split = G_ref_f2s(ele,:); %An welchen Kanten habe ich Nachbarn -S = find(mod((this(1:4)~=0).*(this(5:8)==0),2))' %Einen Nachbar (Single) -D = find(this(5:8)~=0)' %Zwei Nachbarn (Double) -G_ref_N([this(S) this(D)],:) -MS = mod(find((G_ref_N(this(S),:)==ele)')-1,4)+1 %An welchen Kanten bin ich Nachbar +S = find(mod((this(1:4)~=0).*(this(5:8)==0),2))'; %Einen Nachbar (Single) +D = find(this(5:8)~=0)'; %Zwei Nachbarn (Double) +% G_ref_N([this(S) this(D)],:); + +%An welchen Kanten bin ich Nachbar +MSt = mod(find((G_ref_N(this(S),:)==ele)')-1,8)+1; +MS = mod(MSt-1,4)+1; % (Single) %OHNE MOD???? MD = mod(find((G_ref_N(this([D D+4]),:)==ele)')-1,4)+1; -MD = reshape(MD,length(MD)/2,2) +MD = reshape(MD,length(MD)/2,2); % (Double) G_ref_N(split,1:8) = 0; if(split(1)==split(2)) - G_ref_N(split([1 3])',1:4) = [ 0 0 split(3) 0;split(1) 0 0 0]; + G_ref_N(split([1 3])',1:4) = [ 0 0 split(3) 0;split(1) 0 0 0]; %Innere Beziehung + % Beziehungen fuer Kanten mit einem Nachbar for i = 1:length(S) - if(mod(S(i),2)==0) + if(mod(S(i),2)==0) %TODO was ist wenn ich selbst doppelNachbar an der Seite bin??? G_ref_N(this(S(i)),[MS(i) MS(i)+4]) = [split(S(i)) split(mod(S(i),4)+1)]; G_ref_N([split(S(i)) split(mod(S(i),4)+1)]',S(i))=this(S(i)); else - G_ref_N(this(S(i)),MS(i)) = split(S(i)); + G_ref_N(this(S(i)),MSt(i)) = split(S(i)); G_ref_N(split(S(i)),S(i)) = this(S(i)); end end @@ -402,7 +403,7 @@ elseif(split(1)==split(4)) G_ref_N(this(S(i)),[MS(i) MS(i)+4]) = [split(S(i)) split(mod(S(i),4)+1)]; G_ref_N([split(S(i)) split(mod(S(i),4)+1)]',S(i))=this(S(i)); else - G_ref_N(this(S(i)),MS(i)) = split(S(i)); + G_ref_N(this(S(i)),MSt(i)) = split(S(i)); G_ref_N(split(S(i)),S(i)) = this(S(i)); end end