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
[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);
% 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'
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;
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;
% 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;