]> git.leopard-lacewing.eu Git - bacc.git/commitdiff
[src] refineQuad komplett auf Iterativ umgestellt
authortreecity <treecity@26120e32-c555-405d-b3e1-1f783fb42516>
Sat, 22 Oct 2011 21:12:47 +0000 (21:12 +0000)
committertreecity <treecity@26120e32-c555-405d-b3e1-1f783fb42516>
Sat, 22 Oct 2011 21:12:47 +0000 (21:12 +0000)
[src] A_ skripte Hinzugefügt die Eine Datei laden und mit bestimmten Parameter mehrfach ausführen
[src] A_ Daten werden automatisch zwischen gespeichert -> können geladen werden und fortgesetzt
[src] plotMark -> Ergänzung zu plotShape: Markiert einzelne Elemente im Gitter
[src] neville zum kalkulieren hinzugefügt.. (eigentlich sinnlos weils einfacher gehen könnte...)

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

src/A_AnIso.m [new file with mode: 0644]
src/A_Iso.m [new file with mode: 0644]
src/A_loadMesh.m
src/A_loadMeshF.m [new file with mode: 0644]
src/A_saveMesh.m [new file with mode: 0644]
src/A_stepAnIso.m
src/A_stepIso.m
src/neville2.m [new file with mode: 0644]
src/plotMark.m [new file with mode: 0644]
src/refineQuad.m

diff --git a/src/A_AnIso.m b/src/A_AnIso.m
new file mode 100644 (file)
index 0000000..4fc8049
--- /dev/null
@@ -0,0 +1,29 @@
+function A_AnIso(file,times,mu,type,eta,eps)
+%A_ANISO Summary of this function goes here
+%   Detailed explanation goes here
+
+A_loadMeshF(file)
+
+global G_Ta;
+global G_Da;
+
+for i = 1:times
+ if(size(G_Ta,1)>2)
+  nextF = G_Ta(end,1)*4;
+  nextS = neville2(1:size(G_Ta,1),G_Ta(:,1)',size(G_Ta,1)+1);
+  calc = size(G_Ta,1)+(-1:0);
+  nextTime = [nextS neville2(G_Ta(calc,1)',G_Ta(calc,2)',nextF) ...
+    neville2(G_Ta(calc,1)',G_Ta(calc,3)',nextF) ...
+    neville2(G_Ta(calc,1)',G_Ta(calc,4)',nextS)]
+  
+  %overFlowTime = neville2(G_Ta(size(G_Ta,1)+(-1:0),1)',sum(G_Ta(size(G_Ta,1)+(-1:0),2:4),2)',4500)
+ end
+
+ A_stepAnIso(mu,type,eta,eps);
+ usedTime = G_Ta(end,:)
+ data = G_Da(end,:)
+  
+  A_saveMesh(['anIso' int2str(type) '_' int2str(size(G_Ta,1))]);
+end
+
diff --git a/src/A_Iso.m b/src/A_Iso.m
new file mode 100644 (file)
index 0000000..2385163
--- /dev/null
@@ -0,0 +1,28 @@
+function A_Iso(file,times,mu,type)
+%A_ANISO Summary of this function goes here
+%   DeTiiled explanation goes here
+
+A_loadMeshF(file)
+
+global G_Ti;
+global G_Di;
+
+for i = 1:times
+ if(size(G_Ti,1)>2)
+  nextF = G_Ti(end,1)*4;
+  calc = size(G_Ti,1)+(-1:0);
+  nextTime = [nextS neville2(G_Ti(calc,1)',G_Ti(calc,2)',nextF) ...
+    neville2(G_Ti(calc,1)',G_Ti(calc,3)',nextF) ...
+    neville2(G_Ti(calc,1)',G_Ti(calc,4)',nextF)]
+  
+  %overFlowTime = neville2(G_Ti(size(G_Ti,1)+(-1:0),1)',sum(G_Ti(size(G_Ti,1)+(-1:0),2:4),2)',4500)
+ end
+
+ A_stepIso(mu,type);
+ usedTime = G_Ti(end,:)
+ DiTi = G_Di(end,:)
+  
+  A_saveMesh(['Iso' int2str(type) '_' int2str(size(G_Ti,1))]);
+end
+
index f1e48cf4048fdb8cfdb99c1f8291b3f2d9fe3dfb..95f6fd078dac75ca32257a949d64f4b287adf45f 100644 (file)
@@ -1,4 +1,4 @@
-function A_loadMesh(coordinates,elements, neigh)
+function A_loadMesh(coordinates,elements,neigh)
 % Laed ein Mesh
 %
 % A_loadMesh(coordinates,elements)
@@ -6,8 +6,16 @@ function A_loadMesh(coordinates,elements, neigh)
   global G_C;
   global G_E;
   global G_N;
+  global G_Ta;
+  global G_Da;
+  global G_Ti;
+  global G_Di;
+  
   G_C = coordinates;
   G_E = elements;
   G_N = neigh;
+  G_Ta = [];
+  G_Da = [];
+  G_Ti = [];
+  G_Di = [];
 end
-
diff --git a/src/A_loadMeshF.m b/src/A_loadMeshF.m
new file mode 100644 (file)
index 0000000..c85d24f
--- /dev/null
@@ -0,0 +1,39 @@
+function A_loadMeshF(file)
+% Laed ein Mesh
+%
+% A_loadMesh(coordinates,elements)
+
+
+  load(file)
+
+  global G_C;
+  global G_E;
+  global G_N;
+  global G_Ta;
+  global G_Da;
+  global G_Ti;
+  global G_Di;
+  G_C = coordinates;
+  G_E = elements;
+  G_N = neigh;
+  G_Ta = [];
+  G_Da = []; 
+  G_Ti = [];
+  G_Di = [];
+  
+  if(exist('timeA','var')~=0)
+    G_Ta = timeA;
+  end
+  if(exist('dataA','var')~=0)
+    G_Da = dataA;
+  end
+  if(exist('timeI','var')~=0)
+    G_Ti = timeI;
+  end
+  if(exist('dataI','var')~=0)
+    G_Di = dataI;
+  end
+end
+
+
+
diff --git a/src/A_saveMesh.m b/src/A_saveMesh.m
new file mode 100644 (file)
index 0000000..9652ced
--- /dev/null
@@ -0,0 +1,30 @@
+function A_saveMesh(name)
+
+global G_E;
+global G_C;
+global G_N;
+global G_Ta;
+global G_Da;
+global G_Ti;
+global G_Di;
+
+timeI =[];
+dataI =[];
+timeA =[];
+dataA =[];
+coordinates = G_C;
+elements = G_E;
+neigh = G_N;
+if(~isempty(G_Ta))
+  timeA = G_Ta;
+  dataA = G_Da;
+end
+if(~isempty(G_Ti))
+  timeI = G_Ti;
+  dataI = G_Di;
+end
+
+save (['meshSave/' name], 'coordinates', 'elements','neigh','timeA','dataA','timeI','dataI')
+
+end
+
index cbd818275c41b9dd2997f929ce5897c321f887c2..8286ec4833a2be6b41de0dcc8e9c3df4ce44f1b0 100644 (file)
@@ -1,17 +1,27 @@
-function dataAniso = A_stepAnIso(mu,type)
+function [dataAniso time er] = A_stepAnIso(mu,type,eta,eps)
+% dataAniso = A_stepAnIso(mu,type,eta,eps)
+%
 
 global G_E;
 global G_C;
 global G_N;
+global G_Ta;
+global G_Da;
 
 if (isempty(G_E) || isempty(G_C) || isempty(G_N))
   disp 'Error: Please use A_loadMesh first'
   return
 end
 
-  [coordinates_fine,elements_fine,neigh_fine,f2s]=refineQuad(G_C,G_E,G_N,2*ones(1,size(G_E,1)));
+time = zeros(1,3);
   
+  tic
+  [coordinates_fine,elements_fine,neigh_fine,f2s]=refineQuad(G_C,G_E,G_N,2);
+  time(1) = toc;
+  tic
   A_fine = mex_build_AU(coordinates_fine,elements_fine,mu,type);
+  time(2) = toc;
   
   b = sqrt(sum(quadNorm(coordinates_fine,elements_fine,'w').^2,2));
   
@@ -21,11 +31,31 @@ end
 
   ind = computeEstSlpMuTilde(x_fine,G_C,G_E,f2s);
   
-  marked = mark(x_fine(f2s)',ind,0.5,0.5);
+  marked = mark(x_fine(f2s)',ind,eta,eps);
+  
+%   clear 'coordinates_fine' 'elements_fine' 'neigh_fine' 'f2s'
   
   dataAniso = [size(G_E,1) sqrt(sum(ind)) xe_fine];
-  [G_C, G_E, G_N] = refineQuad(G_C,G_E,G_N,marked);
-
+  
+  if(size(G_E,1)~=length(marked))
+    disp 'Error: MarkierungsVektor ist fehlerhaft'
+    return
+  end
+  
+  tic
+  [G_C, G_E, G_N, f, er] = refineQuad(G_C,G_E,G_N,marked);
+  time(3) = toc;
+%   if(~isempty(er))
+%     plotShape(G_C,G_E,'');
+%     plotMark(er,G_C,G_E);
+%   end
+  G_Ta(size(G_Ta,1)+1,1:4) = [size(G_E,1) time];
+  G_Da(size(G_Da,1)+1,1:3) = dataAniso;
+  
+  
+%   plotShape(G_C,G_E,'');
 
 end
 
index dc0c917ea5c0c4c8fd04a16859bb230a223496f0..0eea0b897d389e297a381c5a8443ebe5587c1f94 100644 (file)
@@ -1,17 +1,25 @@
-function dataIso = A_stepIso(mu,type)
+function [dataIso timer] = A_stepIso(mu,type)
 
 global G_E;
 global G_C;
 global G_N;
+global G_Ti;
+global G_Di;
 
 if (isempty(G_E) || isempty(G_C))
   disp 'Error: Please use A_loadMesh first'
   return
 end
 
-  [coordinates_fine,elements_fine,neigh_fine,f2s]=refineQuad(G_C,G_E,G_N,2);
+time = zeros(1,2);
   
+  tic
+  [coordinates_fine,elements_fine,neigh_fine,f2s,er]=refineQuad(G_C,G_E,G_N,2);
+  time(1) = toc;
+  
+  tic
   A_fine = mex_build_AU(coordinates_fine,elements_fine,mu,type);
+  time(2) = toc;
   
   b = sqrt(sum(quadNorm(coordinates_fine,elements_fine,'w').^2,2));
   
@@ -22,7 +30,17 @@ end
   ind = computeEstSlpMuTilde(x_fine,G_C,G_E,f2s);
   
   dataIso = [size(G_E,1) sqrt(sum(ind)) xe_fine];
-  [G_C, G_E, G_N] = refineQuad(G_C,G_E,G_N,2);
+  
+  G_C = coordinates_fine; G_E = elements_fine; G_N = neigh_fine;
+
+%   if(~isempty(er))
+%     plotShape(G_C,G_E,'');
+%     plotMark(er,G_C,G_E);
+%   end
+  G_Ti(size(G_Ti,1)+1,1:3) = [size(G_E,1) time];
+  G_Di(size(G_Di,1)+1,1:3) = dataIso;
 
 
 end
diff --git a/src/neville2.m b/src/neville2.m
new file mode 100644 (file)
index 0000000..b15b0e6
--- /dev/null
@@ -0,0 +1,19 @@
+function [ y ] = neville2(x,y,t )\r
+%[ p ] = neville2(x,y,t )\r
+\r
+\r
+    n=length(y);\r
+    t(2:n) = t(1);\r
+    \r
+    for m = 2:n\r
+        \r
+        j=n-m+1;\r
+            %... = zeigt MATLAB das die Zeile noch weiter geht\r
+        y = ((t(1:j) - x(1:j)) .* y(2:j+1) ... \r
+                -(t(1:j) - x(m:n)) .* y(1:j)) ...\r
+                ./ (x(m:n)-x(1:j));\r
+            \r
+    end\r
+\r
+\r
+end
\ No newline at end of file
diff --git a/src/plotMark.m b/src/plotMark.m
new file mode 100644 (file)
index 0000000..26eb9db
--- /dev/null
@@ -0,0 +1,12 @@
+function  plotMark(ele,coordinates,elements)
+
+hold on;
+  disp 'Plot Updated'
+for idx = ele
+  current = sum(coordinates(elements(idx,[2,4])',:),1)/2;
+  scatter3(current(1),current(2),current(3),'xg');
+end
+hold off;
+
+end
+
index bf682f4458f19a81f530d3edba336ee56501d01b..9a2f7d9c11f358b1d1f02c1f23f111d966f24005 100644 (file)
@@ -1,4 +1,4 @@
-function [coo,ele,nei,f2s] = refineQuad(coordinates,elements,neigh,type)
+function [coo,ele,nei,f2s,err] = refineQuad(coordinates,elements,neigh,type)
 %
 %  [coordinates,elements,fa2so] = refineQuad(coordinates,elements,type)
 %
@@ -14,18 +14,26 @@ function [coo,ele,nei,f2s] = refineQuad(coordinates,elements,neigh,type)
 %
 % P. Schaefer
 
+err = [];
 
 %Type wenn nur ein Wert: aufblaehen
 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
+
 %Globale Variabelen aufbauen
 global G_ref_E;
 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);
@@ -34,20 +42,78 @@ c_loop = size(elements,1);
 G_ref_E = elements;
 G_ref_C = coordinates;
 G_ref_N = neigh;
+% G_ref_s = quadNorm(G_ref_C,G_ref_E,'w');
+% G_ref_s = sqrt(sum(G_ref_s.*G_ref_s,2))
+
+
 G_ref_t = type;
 G_ref_f2s = repmat([1:c_loop]',1,4);
 
 %Parameter Freigeben (Speicher...)
 clear elements coordinates neigh type
 
-%Jedes Element verfeinern
+% Flächeninhalt aufbauen
+updateS(1:c_loop);
 
-ea = 1:c_loop;
+ref_old = [];
 
-for i = ea(G_ref_t>1)
-  refine(i);
+%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
+  for ele = ref(randperm(length(ref)))  %LOL Zufall bringts
+ % # 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
+    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;
+            end
+            
+            if(G_ref_t(i)<1)
+              continue;
+            end
+            
+              G_ref_t(i) = 2;
+          end
+          continue;
+        end
+    end
+    
+  % # 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
+    
+    
+    % Wenn Alle Überprüfungen durchgelaufen sind
+    refineE(ele);
+    updateN(ele);    
+  end
 end
-
 %Rueckgabe zuweisen
 coo = G_ref_C;
 ele = G_ref_E;
@@ -56,13 +122,14 @@ f2s = G_ref_f2s;
 
 %Doppelte Koordinaten loeschen
  [coo l pos] = unique(coo,'rows');
  ele = pos(ele);
 
  %Globale Variablen freigeben
-clear G_ref_E G_ref_C G_ref_N G_ref_f2s G_ref_t
+clear G_ref_E G_ref_C G_ref_N G_ref_f2s G_ref_t G_ref_s
 end
 
-
+%% Rekursive Funktion
 function err = refine(ele)
 err = 0;
 % global G_ref_E;
@@ -93,8 +160,8 @@ if(~isempty(N2))
           return;
         end
 %       if(G_ref_t(N4(i))<=2)
-        G_ref_t(N4(i))=2; %WIRD GNADENLOS AUF 2 GESETZT
-        test = refine(N4(i));
+        G_ref_t(N4(i))=2; %WIRD GNADENLOS AUF 2 GESETZT
+        test = refine(N4(i));
         if(test==1)
           G_ref_t(N4(i))=0;
           err = 1;
@@ -114,12 +181,12 @@ end
 
 % verfeinere dieses element
 refineE(ele);
-
 % setze Nachbarschafts relationen
 updateN(ele);
 
 end
 
+%% Element Verfeinern ! sollte nur ausgeführt werden wenn wirklich möglich
 function refineE(ele)
 % Element wird gnadenlos Verfeinert
 global G_ref_E;
@@ -150,6 +217,7 @@ global G_ref_t;
     
         G_ref_f2s(ele,1:3)=c_ele+3:-1:c_ele+1;
 %         G_ref_f2s(ele,:)=[c_ele+3:-1:c_ele+1 ele];
+        updateS([ele,c_ele+1:c_ele+3]);
     elseif(G_ref_t(ele)==3)
         G_ref_C(c_coo+1,:) = (G_ref_C(el(1),:)+G_ref_C(el(4),:))/2;
         G_ref_C(c_coo+2,:) = (G_ref_C(el(2),:)+G_ref_C(el(3),:))/2;
@@ -160,6 +228,7 @@ global G_ref_t;
         G_ref_E(c_ele+1,:) = [el(1),el(2),c_coo+2,c_coo+1];
         G_ref_f2s(ele,[1 2])=c_ele+1;
 %         G_ref_f2s(ele,[3 4])=ele;
+        updateS([ele,c_ele+1]);
      elseif(G_ref_t(ele)==4)
         G_ref_C(c_coo+1,:) = (G_ref_C(el(1),:)+G_ref_C(el(2),:))/2;
         G_ref_C(c_coo+2,:) = (G_ref_C(el(4),:)+G_ref_C(el(3),:))/2;
@@ -170,16 +239,19 @@ global G_ref_t;
         G_ref_E(c_ele+1,:) = [c_coo+1,el(2),el(3),c_coo+2];
         G_ref_f2s(ele,[2 3])=c_ele+1;
 %         G_ref_f2s(ele,[1 4])=ele;
+        updateS([ele,c_ele+1]);
     end
     
     G_ref_t(ele) = 0;
     
 end
 
+
+%% Aktualisieren der Nachbarn ! sollte nur ausgeführt werden wenn wirklich möglich
 function updateN(ele)
 % Nachbarschaften werden neu gesetzt (nach N und f2s)
 global G_ref_E;
-global G_ref_C;
+%global G_ref_C;
 global G_ref_N;
 global G_ref_f2s;
 
@@ -296,8 +368,25 @@ else
 end
 
 
-
-
-
 end
 
+
+%% Berechnet die Flächeninhalte der Elemente
+function updateS(ele)
+%Globale Variabelen aufbauen
+global G_ref_E;
+global G_ref_C;
+% global G_ref_N;
+% global G_ref_f2s;
+% global G_ref_t;
+global G_ref_s;
+       for i = ele
+    % normalized Vector on every triangle
+    tri = G_ref_E(i,:);
+    a = (G_ref_C(tri(2),:)-G_ref_C(tri(1),:));
+    b = (G_ref_C(tri(4),:)-G_ref_C(tri(1),:));
+    N = cross(a',b');
+    N = N/norm(N);
+    G_ref_s(i) = sqrt(sum(N.*N));
+       end
+end
\ No newline at end of file