summaryrefslogtreecommitdiff
path: root/CSXCAD/matlab/SmoothMeshLines.m
diff options
context:
space:
mode:
Diffstat (limited to 'CSXCAD/matlab/SmoothMeshLines.m')
-rw-r--r--CSXCAD/matlab/SmoothMeshLines.m122
1 files changed, 122 insertions, 0 deletions
diff --git a/CSXCAD/matlab/SmoothMeshLines.m b/CSXCAD/matlab/SmoothMeshLines.m
new file mode 100644
index 0000000..bc1160f
--- /dev/null
+++ b/CSXCAD/matlab/SmoothMeshLines.m
@@ -0,0 +1,122 @@
+function lines = SmoothMeshLines( lines, max_res, ratio, varargin)
+%function lines = SmoothMeshLines( lines, max_res, ratio, varargin)
+%
+% create smooth mesh lines
+%
+% Warning: This function may not always produce a desired output.
+%
+% lines: given fixed lines to create a smooth mesh in between
+% max_res: desired max. resolution
+% ratio: max. neighboring line-delta ratio, (optional, default is 1.3)
+%
+% optional variable arguments ('key', value)
+% recursive: SmoothMeshLines a couple of times recursivly (default is 0)
+% CheckMesh: Do a final mesh check (default is true)
+% allowed_max_ratio: allow only a given max. grading ratio
+% (default --> ratio*1.25)
+%
+% example:
+% % create a x-mesh with lines at 0, 50 and 200 an a desired mesh
+% resolution of 5
+% mesh.x = SmoothMeshLines([0 50 200],5,1.3);
+%
+% See also InitCSX, DefineRectGrid
+%
+% CSXCAD matlab interface
+% -----------------------
+% author: Thorsten Liebig
+
+if (numel(lines)<2)
+ return
+end
+
+if (nargin<3)
+ ratio = 1.3;
+end
+
+recursive = 0;
+check_mesh = true;
+max_ratio = ratio*1.25;
+
+for vn=1:2:numel(varargin)
+ if (strcmpi(varargin{vn},'recursive'))
+ recursive = varargin{vn+1};
+ end
+ if (strcmpi(varargin{vn},'CheckMesh'))
+ check_mesh = varargin{vn+1};
+ end
+ if (strcmpi(varargin{vn},'allowed_max_ratio'))
+ max_ratio = varargin{vn+1};
+ end
+end
+
+lines = unique(sort(lines));
+
+diff_Lines = diff(lines);
+
+index = find(diff_Lines>(1.001*max_res));
+
+% for n=1:numel(diff_Lines)-1
+% if ( (diff_Lines(n+1)/diff_Lines(n) > ratio) )
+% index = [index n+1];
+% end
+% end
+
+index = unique(index);
+
+addLines = [];
+
+for n=1:numel(index)
+ if (index(n)==1)
+ start_res = max_res;
+ else
+ start_res = lines(index(n)) - lines(index(n)-1);
+ end
+
+ if ((index(n)+1)==numel(lines))
+ stop_res = max_res;
+ else
+ stop_res = lines(index(n)+2) - lines(index(n)+1);
+ end
+
+ addLines = [addLines SmoothRange(lines(index(n)),lines(index(n)+1),start_res,stop_res,max_res,ratio)];
+end
+
+
+lines = unique(sort([lines addLines]));
+
+addLines = [];
+% relax ratio for test
+ratio_relax = ratio + (ratio-1) * 1;
+
+[EC pos E_type] = CheckMesh(lines,0,max_res,ratio_relax,1);
+diff_Lines = diff(lines);
+
+for n=1:EC
+ if pos(n)>1
+ start_res = diff_Lines(pos(n)-1);
+ else
+ start_res = diff_Lines(pos(n));
+ end
+ if pos(n) >= numel(diff_Lines)
+ stop_res = diff_Lines(end);
+ else
+ stop_res = diff_Lines(pos(n)+1);
+ end
+ max_res_R = max([start_res stop_res])/2/ratio;
+ addLines = [addLines SmoothRange(lines(pos(n)),lines(pos(n)+1),start_res,stop_res,max_res_R,ratio)];
+end
+
+lines = unique(sort([lines addLines]));
+
+for n=1:recursive
+ old_numL = numel(lines);
+ lines = SmoothMeshLines( lines, max_res, ratio, 0);
+ if numel(lines) == old_numL
+ return
+ end
+end
+
+if (check_mesh)
+ CheckMesh(lines,0,max_res,max_ratio,0);
+end