]> git.leopard-lacewing.eu Git - bacc.git/commitdiff
[src] plotMark jetzt mit Egenschaft für farbe
authortreecity <treecity@26120e32-c555-405d-b3e1-1f783fb42516>
Tue, 24 Jan 2012 22:33:34 +0000 (22:33 +0000)
committertreecity <treecity@26120e32-c555-405d-b3e1-1f783fb42516>
Tue, 24 Jan 2012 22:33:34 +0000 (22:33 +0000)
[src] Automatisches plotten in A_step -> Fehlersuche
[src] refineQuad: nachverfeinern jetzt nur mit richtigem Typ -> noch Fehler in den Nachbarschaftsrelationen

git-svn-id: https://drops.fb12.tu-berlin.de/svn/bacc/trunk@76 26120e32-c555-405d-b3e1-1f783fb42516

src/A_step.m
src/plotMark.m
src/refineQuad.m
src/test_refine.m

index a76b4c3dc08a6c28a9b9c792bfb4dc19123f9f46..3d7970944c8137a9053fdd5c009479238ba85fc0 100644 (file)
@@ -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'
index a19cae810c9ac89c38e1f7e8e09c709ad77a5394..7049cb8252ce42e5436e9f519bc156c005108218 100644 (file)
@@ -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];
index 447051448a500d394e8fd923ed836a7c1d182323..767155df0f71a4becd68815941f599d3646b7a8d 100644 (file)
@@ -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;
 
index d9cf857351939850a29e38c46a9ed3db26c53acc..16c466f11be0e7f20b92ceb4e35baf9f66b24d4f 100644 (file)
@@ -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);