From ba6dd47f5dc37918412f05ed2a24d15bcc9077b6 Mon Sep 17 00:00:00 2001 From: treecity Date: Tue, 24 Jan 2012 22:33:34 +0000 Subject: [PATCH] =?utf8?q?[src]=20plotMark=20jetzt=20mit=20Egenschaft=20f?= =?utf8?q?=C3=BCr=20farbe=20[src]=20Automatisches=20plotten=20in=20A=5Fste?= =?utf8?q?p=20->=20Fehlersuche=20[src]=20refineQuad:=20nachverfeinern=20je?= =?utf8?q?tzt=20nur=20mit=20richtigem=20Typ=20->=20noch=20Fehler=20in=20de?= =?utf8?q?n=20Nachbarschaftsrelationen?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit git-svn-id: https://drops.fb12.tu-berlin.de/svn/bacc/trunk@76 26120e32-c555-405d-b3e1-1f783fb42516 --- src/A_step.m | 19 +++-- src/plotMark.m | 14 +++- src/refineQuad.m | 173 +++++++++++++++++++++++++++++++++++----------- src/test_refine.m | 28 ++------ 4 files changed, 157 insertions(+), 77 deletions(-) diff --git a/src/A_step.m b/src/A_step.m index a76b4c3..3d79709 100644 --- a/src/A_step.m +++ b/src/A_step.m @@ -7,15 +7,12 @@ global G_N; global G_T; global G_D; -if (isempty(G_E) || isempty(G_C) || isempty(G_N)) - disp 'Error: Please use A_loadMesh first' - return -end +assert(~isempty(G_E) && ~isempty(G_C) && ~isempty(G_N),... + 'Please use A_loadMesh first') + +assert(length(mu)==max(type)-1||length(mu)==1,... + 'Pleas set right type and mu parameters') -if(length(mu)~=max(type)-1&&length(mu)~=1) - disp 'Error: Pleas set right type and mu parameters' - return -end if(length(mu)==1) mu = repmat(mu,max(type)-1,1); end @@ -25,7 +22,7 @@ time = zeros(1,3); [coordinates_fine,elements_fine,neigh_fine,f2s]=refineQuad(G_C,G_E,G_N,2); time(1) = toc; - b = sqrt(sum(quadNorm(coordinates_fine,elements_fine,'w').^2,2)) + b = sqrt(sum(quadNorm(coordinates_fine,elements_fine,'w').^2,2)); tic data = size(G_E,1); @@ -56,8 +53,8 @@ time = zeros(1,3); % Adaptiv Verfeinern - marked = mark(x_fine(f2s)',ind,eta,eps) -% plotShape(coordinates_fine,elements_fine,x_fine); + marked = mark(x_fine(f2s)',ind,eta,eps); + plotShape(coordinates_fine,elements_fine); % plotMark(find(marked>1),G_C,G_E); % clear 'coordinates_fine' 'elements_fine' 'neigh_fine' 'f2s' diff --git a/src/plotMark.m b/src/plotMark.m index a19cae8..7049cb8 100644 --- a/src/plotMark.m +++ b/src/plotMark.m @@ -1,11 +1,19 @@ -function plotMark(ele,coordinates,elements) +function plotMark(ele,coordinates,elements,varargin) +% plotMark(ele,coordinates,elements) + + +type = 'xg'; + +if(size(varargin,2)==1) + type = varargin{1}; +end hold on; - disp 'Plot Updated' +% disp 'Plot Updated' for idx = ele if(length(idx)==1) current = sum(coordinates(elements(idx,[2,4])',:),1)/2; - scatter3(current(1),current(2),current(3),'xg'); + scatter3(current(1),current(2),current(3),type); else current= [sum(coordinates(elements(idx(1),[2,4])',:),1)/2; ... sum(coordinates(elements(idx(2),[2,4])',:),1)/2]; diff --git a/src/refineQuad.m b/src/refineQuad.m index 4470514..767155d 100644 --- a/src/refineQuad.m +++ b/src/refineQuad.m @@ -21,11 +21,8 @@ if([1 1] == size(type)) type = repmat(type, size(elements,1),1); end -if(size(elements,1)~=size(neigh,1)||size(elements,1)~=length(type)) - disp 'Dimensionen passen nicht!' - coo = coordinates; ele = elements; nei = neigh; f2s = []; - return; -end +assert(size(elements,1)==size(neigh,1)&&size(elements,1)==length(type),... + 'Dimensionen passen nicht'); %Globale Variabelen aufbauen global G_ref_E; @@ -56,65 +53,157 @@ clear elements coordinates neigh type updateS(1:c_loop); ref_old = []; - +%% Erster Durchlauf %Jedes Element verfeinern while(1==1) ref = find(G_ref_t>1); ref = reshape(ref,1,length(ref)); if(isequal(ref,ref_old)) - disp([' Warning: ' int2str(length(ref)) ' Elements couldn t be refined']) - err = ref; break; end ref_old = ref; if(isempty(ref)) break; end + figure(6) + plotShape(G_ref_C,G_ref_E) + plotMark(ref,G_ref_C,G_ref_E,'xg') 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') % # HangingNode Check - N = G_ref_N(ele,G_ref_N(ele,5:8)==0); - N2 = N(N~=0); %Nachbarn der Kanten mit nur einem Nachbar +% ele; + Nt = find(G_ref_N(ele,5:8)==0); + N = G_ref_N(ele,Nt); + N2t = find(N~=0); + N2 = N(N2t); %Nachbarn der Kanten mit nur einem Nachbar + N2tt = Nt(N2t); %Kante mit Nachbar ^ + + % Nur Nachbarn verfeinern an Kanten die geteilt werden + if(G_ref_t(ele)==3) + N2 = N2(mod(N2tt,2)==0); + elseif(G_ref_t(ele)==4) + N2 = N2(mod(N2tt,2)==1); + end + + plotMark(N2,G_ref_C,G_ref_E,'or') + if(~isempty(N2)) - N3=mod(find((G_ref_N(N2',:)==ele)')-1,4)+5; % ACHTUNG noch mal überprüfen - N4=N2(diag(G_ref_N(N2',N3'))~=0) - if(~isempty(N4)) - for i = N4 - if(i>length(G_ref_t)) - continue; + 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 + error('refineQuad:check','Fehlerhafter Typ 0') end - if(G_ref_t(i)<1) - continue; + %Wie muss das Element verfeinert werden. + N2 + N4t + N3t + N5t = G_ref_t(N2(i)) + mod(N3t(i),2)+3 + if(N5t == 1) + G_ref_t(N2(i))=mod(N3t(i),2)+3; + elseif(N5t == mod(N3t(i)+1,2)+3) + G_ref_t(N2(i)) = 2; end - G_ref_t(i) = 2; end continue; end end + + % Wenn Alle Überprüfungen durchgelaufen sind +% refineE(ele); +% updateN(ele); +% plotShape(G_ref_C,G_ref_E) + end +end + +%% Zweiter Durchlauf +ref_old=[]; +err = 0; +%Jedes Element verfeinern +while(err==0) + ref = find(G_ref_t>1); + ref = reshape(ref,1,length(ref)); + if(isequal(ref,ref_old)) + error('refineQuad:refine',[int2str(length(ref)) ' Elements couldn t be refined']) + err = ref; + break; + end + ref_old = ref; + if(isempty(ref)) + break; + end + 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); + N2 = N(N2t); %Nachbarn der Kanten mit nur einem Nachbar + N2tt = Nt(N2t); %Kante mit Nachbar ^ - % # Size Check -% N5=N2(G_ref_s(N2')>G_ref_s(ele)) -% if(~isempty(N5)) -% %Setze N5 zum Verfeinern -% for i = N5' -% if(G_ref_t(i)<1) -% continue; -% else -% G_ref_t(i) = 2; -% end -% end -% -% continue; -% end - + % Nur Nachbarn verfeinern an Kanten die geteilt werden + if(G_ref_t(ele)==3) + N2 = N2(mod(N2tt,2)==0); + elseif(G_ref_t(ele)==4) + N2 = N2(mod(N2tt,2)==1); + end + 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 + figure(3) + G_ref_t(ele) + 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') + err = ref; + break; + end + + %Wie muss das Element verfeinert werden. + N5t = G_ref_t(N2(i)); + if(N5t == 1) +% error('refineQuad:refine','SKRIPTFEHLER: Element war nicht markiert') +% G_ref_t(N2(i))=mod(i+1,2)+3; + elseif(N5t == mod(i,2)+3) +% error('refineQuad:refine','SKRIPTFEHLER: Element war falsch markiert') +% G_ref_t(N2(i)) = 2; + end + + end + 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) + refineE(ele); - updateN(ele); + updateN(ele); + + figure(4) + plotShape(G_ref_C,G_ref_E) + plotMark(G_ref_f2s(ele,:),G_ref_C,G_ref_E) + end end + %Rueckgabe zuweisen coo = G_ref_C; ele = G_ref_E; @@ -258,14 +347,16 @@ 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,:); -S = find(mod((this(1:4)~=0).*(this(5:8)==0),2))'; %An welchen Kanten habe ich Nachbarn -D = find(this(5:8)~=0)'; -MS = mod(find((G_ref_N(this(S),:)==ele)')-1,4)+1; %An welchen Kanten bin ich Nachbar + %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 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) G_ref_N(split,1:8) = 0; diff --git a/src/test_refine.m b/src/test_refine.m index d9cf857..16c466f 100644 --- a/src/test_refine.m +++ b/src/test_refine.m @@ -1,24 +1,8 @@ +figure(1) +plotShape(coordinates,elements); +plotMark(1,coordinates,elements); - eles = size(elements,1); +[coordinates elements neigh]= refineQuad(coordinates,elements,neigh,[3 ones(1,size(elements,1)-1)]); - if not(exist('r_times')) - r_times = 1; - end - - if not(exist('r_type')) - r_type = 4; - end - - if(r_type > 3) - marked = round(3*rand(1,eles)); - elseif(r_type <= 0) - return; - else - marked = ones(1,eles)*r_type; - end - - for i = 1:r_times - [coordinates,elements, f2s]=refineQuad(coordinates,elements,marked); - end - - clear i eles \ No newline at end of file +figure(2) +plotShape(coordinates,elements); -- 2.47.3