summaryrefslogtreecommitdiff
path: root/CSXCAD/matlab/AutoSmoothMeshLines.m
diff options
context:
space:
mode:
Diffstat (limited to 'CSXCAD/matlab/AutoSmoothMeshLines.m')
-rw-r--r--CSXCAD/matlab/AutoSmoothMeshLines.m159
1 files changed, 159 insertions, 0 deletions
diff --git a/CSXCAD/matlab/AutoSmoothMeshLines.m b/CSXCAD/matlab/AutoSmoothMeshLines.m
new file mode 100644
index 0000000..e41e261
--- /dev/null
+++ b/CSXCAD/matlab/AutoSmoothMeshLines.m
@@ -0,0 +1,159 @@
+function [lines quality] = AutoSmoothMeshLines( lines, max_res, ratio, varargin)
+% function [lines quality] = AutoSmoothMeshLines( lines, max_res, ratio, varargin)
+%
+% Generate smooth mesh lines by choosing an appropriate algorithm.
+%
+% Currently supported algorithm:
+% SmoothMeshLines, SmoothMeshLines2 and RecursiveSmoothMesh
+%
+% arguments:
+% lines: given fixed lines to create a smooth mesh in between
+% max_res: desired max. resolution
+% ratio: grading ratio: desired neighboring line-delta ratio
+% - default is 1.5
+% - see also 'allowed_max_ratio' argument
+%
+% variable arguments ('keyword',value):
+% algorithm: define subset of tried algorihm, e.g. [1 3]
+% symmetric: 0/1 force symmetric mesh (default is input symmetry)
+% homogeneous: 0/1 force homogeneous mesh
+% allowed_min_res: allow a given min resolution only
+% allowed_max_ratio: allow only a given max. grading ratio
+% (default --> ratio*1.25)
+% debug: 0/1 off/on
+%
+% example:
+% lines = AutoSmoothMeshLines([-100 -10 10 100], 20, 1.5, 'algorihm', ...
+% 1:3);
+%
+% See also InitCSX, DefineRectGrid
+%
+% CSXCAD matlab interface
+% -----------------------
+% author: Thorsten Liebig (C) 2012
+
+if (nargin<2)
+ error('CSXCAD:AutoSmoothMeshLines','lines and max_res are a required parameter');
+end
+
+if (nargin<3)
+ ratio = 1.5;
+end
+
+lines = sort(unique(lines));
+
+range = lines(end)-lines(1);
+if (~isempty(find(diff(lines)<range*1e-6)))
+ warning('CSXCAD:AutoSmoothMeshLines','some lines found with very small distance which may cause smoothing failure!');
+end
+
+methods = {};
+methods{end+1} = @SmoothMeshLines;
+methods{end+1} = @SmoothMeshLines2;
+methods{end+1} = @RecursiveSmoothMesh;
+
+requires_homogen = 0;
+requires_symmetric = CheckSymmtricLines(lines);
+allowed_min_res = 0;
+debug = 0;
+max_ratio = ratio*1.25;
+
+algorithm = 1:numel(methods);
+
+for vn=1:2:numel(varargin)
+ if (strcmpi(varargin{vn},'algorithm'))
+ algorithm = intersect(varargin{vn+1},algorithm);
+ end
+ if (strcmpi(varargin{vn},'symmetric'))
+ requires_symmetric = varargin{vn+1};
+ end
+ if (strcmpi(varargin{vn},'homogeneous'))
+ requires_homogen = varargin{vn+1};
+ end
+ if (strcmpi(varargin{vn},'force_min_res'))
+ requires_homogen = varargin{vn+1};
+ end
+ if (strcmpi(varargin{vn},'allowed_min_res'))
+ allowed_min_res = varargin{vn+1};
+ end
+ if (strcmpi(varargin{vn},'allowed_max_ratio'))
+ max_ratio = varargin{vn+1};
+ end
+ if (strcmpi(varargin{vn},'debug'))
+ debug = varargin{vn+1};
+ end
+end
+
+for m=algorithm
+ if (debug>0)
+ disp(['AutoSmoothMeshLines: trying method: ' func2str(methods{m})]);
+ tic
+ end
+ out_lines{m} = methods{m}(lines, max_res, ratio, 'CheckMesh', false);
+ if (debug>0)
+ toc
+ end
+ quality(m) = eval_mesh(out_lines{m}, max_res, max_ratio, requires_homogen, requires_symmetric, allowed_min_res, 1);
+ if (quality(m)==100) % uncomment to release!
+ lines = out_lines{m};
+ if (debug>0)
+ disp(['AutoSmoothMeshLines: The winner with 100% is ' func2str(methods{m})]); % remove to release
+ end
+ return
+ end
+end
+winner = find(quality==max(quality),1);
+lines = out_lines{winner};
+if (debug>0)
+ disp(['New_SmoothMeshLines: The winner with ' num2str(quality(winner)) '% is ' func2str(methods{winner})]); % remove to release
+end
+
+% show mesh problems
+eval_mesh(lines, max_res, ratio, requires_homogen, requires_symmetric, allowed_min_res, 0);
+return
+
+error('CSXCAD:AutoSmoothMeshLines',['unknown algorithm requested: ' algorithm ]);
+
+end
+
+function quality = eval_mesh(lines, max_res, ratio, requires_homogen, requires_symmetric, allowed_min_res, silent)
+
+quality = 100;
+
+results = AnalyseMesh(lines);
+if ((requires_homogen==1) && (results.homogeneous~=1))
+ if (silent==0)
+ warning('CSXCAD:AutoSmoothMeshLines','method failed to create homogenous mesh');
+ end
+ quality = -1;
+ return
+end
+if ((requires_symmetric==1) && (results.symmetric~=1))
+ if (silent==0)
+ warning('CSXCAD:AutoSmoothMeshLines','method failed to create symmetric mesh');
+ end
+ quality = -1;
+ return
+end
+
+if ((allowed_min_res>0) && (results.min_res<allowed_min_res))
+ if (silent==0)
+ warning('CSXCAD:AutoSmoothMeshLines','method failed to obey allowed min res!');
+ end
+ quality = -1;
+ return
+end
+
+if (results.max_res>max_res*1.01)
+ if (silent==0)
+ warning('CSXCAD:AutoSmoothMeshLines',['method failed to fulfill max. res: ' num2str(results.max_res) ' > ' num2str(max_res)]);
+ end
+ quality = quality*(max_res/results.max_res);
+end
+if (results.max_ratio>ratio*1.01)
+ if (silent==0)
+ warning('CSXCAD:AutoSmoothMeshLines',['method failed to fulfill the max. ratio: ' num2str(results.max_ratio) ' > ' num2str(ratio)]');
+ end
+ quality = quality*(ratio/results.max_ratio);
+end
+end \ No newline at end of file