Raw File
build_meshbuf.m
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% This file is part of NS2DDV.                                                      %
%                                                                                   %
% Copyright(C) 2011-2018    C. Calgaro  (caterina.calgaro@math.univ-lille1.fr)      %
%                           E. Creusé   (emmanuel.creuse@math.univ-lille1.fr)       %
%                           T. Goudon   (thierry.goudon@inria.fr)                   %
%                           A. Mouton   (alexandre.mouton@math.univ-lille1.fr)      %
%                                                                                   %
% NS2DDV is free software: you can redistribute it and/or modify it under the terms %
% of the GNU General Public License as published by the Free Software Foundation,   %
% either version 3 of the License, or (at your option) any later version.           %
%                                                                                   %
% NS2DDV is distributed in the hope that it will be useful, but WITHOUT ANY         %
% WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A   %
% PARTICULAR PURPOSE. See the GNU General Public License for more details.          %
%                                                                                   %
% You should have received a copy of the GNU General Public License along with      %
% NS2DDV. If not, see <http://www.gnu.org/licenses/>.                               %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[usrbuf] = build_meshbuf(answers)

	usrbuf = {};
	l = 1;

	usrbuf{l} = '';
	l = l+1;
	usrbuf{l} = '% Mesh parameters';
	l = l+1;
	usrbuf{l} = '%%%%%%%%%%%%%%%%%';
	l = l+1;
	usrbuf{l} = '% Method for generating the space mesh';
	l = l+1;
	if answers.PDET
		usrbuf{l} = '% ''PDET''       Use the Matlab PDE toolbox';
		l = l+1;
		MESHGEN = 'PDET';
	else
		MESHGEN = 'FROM_FILE';
	end
	if (max(strcmp(answers.GEOM, {'RECTANGLE', 'CIRCLE', 'DIHEDRON'})) == 1)
		usrbuf{l} = '% ''NS2DDV''     Use the routines embedded in NS2DDV code';
		l = l+1;
	end
	usrbuf{l} = '% ''FROM_FILE''  Load data from a mesh file (.msh or _p1/_t1 format allowed)';
	l = l+1;
	usrbuf{l} = strcat('PARAMETERS.MESH.GENERATION = ''', MESHGEN, ''';');
	l = l+1;

	usrbuf{l} = '% Node renumbering method';
	l = l+1;
	usrbuf{l} = '% ''NONE''  No renumbering';
	l = l+1;
	if answers.AMD
		usrbuf{l} = '% ''AMD''   Renumbering with Minimum Degree Algorithm Matlab built-in routines';
		l = l+1;
	end
	if answers.CMK
		usrbuf{l} = '% ''CMK''   Renumbering with Cuthill-McKee Matlab built-in routines';
		l = l+1;
	end
	usrbuf{l} = 'PARAMETERS.MESH.RENUMBERING = ''NONE'';';
	l = l+1;

	% Add NS2DDV parameters
	switch answers.GEOM
		case {'RECTANGLE'}
			switch answers.TESTCASE
				case {'RTIN'}
					nx = 10;
					ny = 40;
				case {'CAEN'}
					nx = 20;
					ny = 20;
				case {'DROP'}
					nx = 20;
					ny = 40;
				case {'EXAC'}
					nx = 20;
					ny = 20;
				case {'EXACNEU'}
					nx = 20;
					ny = 20;
				case {'POIS'}
					nx = 40;
					ny = 10;
				case {'NONA'}
					nx = 60;
					ny = 20;
				case {'GTPSI'}
					nx = 20;
					ny = 20;
				otherwise
					error('Unknown test case');
			end
			usrbuf{l} = '% Parameters for a NS2DDV mesh';
			l = l+1;
			usrbuf{l} = '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%';
			l = l+1;
			usrbuf{l} = '% Design of structured mesh (''DIAGONAL'' or ''CROSS'')';
			l = l+1;
			usrbuf{l} = 'PARAMETERS.MESH.TRIANGLES_ORIENTATION = ''DIAGONAL'';';
			l = l+1;

			switch answers.CV_STUDY
				case {'IN_SPACE', 'IN_SPACETIME'}
					% The use provides a list of values for nx and ny
					usrbuf{l} = '% Number of edges on North and South bounds';
					l = l+1;
					usrbuf{l} = '% WARNING: it must be a multiple of 2';
					l = l+1;
					usrbuf{l} = '% {value 1, value 2, ...} set of values for NBSEG_X for running the convergence analysis';
					l = l+1;
					usrbuf{l} = sprintf('PARAMETERS.MESH.NBSEG_X = {%d, %d, %d};', nx, 2*nx, 4*nx);
					l = l+1;
					usrbuf{l} = '% Number of edges on West and East bounds';
					l = l+1;
					if (max(strcmp(answers.TESTCASE, {'RTIN', 'DROP'})) == 1)
						usrbuf{l} = '% WARNING: it must be a multiple of 4 if PARAMETERS.MESH.TRIANGLE_ORIENTATION = ''DIAGONAL'', and a multiple of 2 else';
						l = l+1;
					else
						usrbuf{l} = '% WARNING: it must be a multiple of 2';
						l = l+1;
					end
					usrbuf{l} = '% {value 1, value 2, ...} set of values for NBSEG_Y for running the convergence analysis';
					l = l+1;
					usrbuf{l} = sprintf('PARAMETERS.MESH.NBSEG_Y = {%d, %d, %d};', ny, 2*ny, 4*ny);
					l = l+1;
					usrbuf{l} = sprintf('% Warning: NBSEG_X and NBSEG_Y must have the same size');
					l = l+1;

				case {'IN_TIME', 'IN_REYNOLDS', 'NONE'}
					% The use provides a single value for nx and ny
					usrbuf{l} = '% Number of edges on North and South bounds';
					l = l+1;
					usrbuf{l} = '% WARNING: it must be a multiple of 2';
					l = l+1;
					usrbuf{l} = sprintf('PARAMETERS.MESH.NBSEG_X = %d;', nx);
					l = l+1;
					usrbuf{l} = '% Number of edges on West and East bounds';
					l = l+1;
					if (max(strcmp(answers.TESTCASE, {'RTIN', 'DROP'})) == 1)
						usrbuf{l} = '% WARNING: it must be a multiple of 4 if PARAMETERS.MESH.TRIANGLE_ORIENTATION = ''DIAGONAL'', and a multiple of 2 else';
						l = l+1;
					else
						usrbuf{l} = '% WARNING: it must be a multiple of 2';
						l = l+1;
					end
					usrbuf{l} = sprintf('PARAMETERS.MESH.NBSEG_Y = %d;', ny);
					l = l+1;
				otherwise
					error('Problem in build_meshbuf');
			end

		case {'CIRCLE'}
			switch answers.TESTCASE
				case {'RTIN'}
					error('RTIN is not compatible with CIRCLE geometry');
				case {'CAEN'}
					error('CAEN is not compatible with CIRCLE geometry');
				case {'DROP'}
					error('DROP is not compatible with CIRCLE geometry');
				case {'EXAC'}
					nc = 10;
				case {'EXACNEU'}
					nc = 10;
				case {'POIS'}
					error('POIS is not compatible with CIRCLE geometry');
				case {'NONA'}
					error('NONA is not compatible with CIRCLE geometry');
				otherwise
					error('Unknown test case');
			end

			usrbuf{l} = '% Parameters for a NS2DDV mesh';
			l = l+1;
			usrbuf{l} = '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%';
			l = l+1;

			switch answers.CV_STUDY
				case {'IN_SPACE', 'IN_SPACETIME'}
					% The use provides a list of values for nc
					usrbuf{l} = '% Number of edges along the radius';
					l = l+1;
					usrbuf{l} = sprintf('PARAMETERS.MESH.NBSEG_C = {%d, %d, %d};', nc, 2*nc, 4*nc);
					l = l+1;

				case {'IN_TIME', 'IN_REYNOLDS', 'NONE'}
					% The use provides a single value for nc
					usrbuf{l} = '% Number of edges along the radius';
					l = l+1;
					usrbuf{l} = sprintf('PARAMETERS.MESH.NBSEG_C = %d;', nc);
					l = l+1;
				otherwise
					error('Problem in build_meshbuf');
			end

		case {'DIHEDRON'}
			switch answers.TESTCASE
				case {'RTIN'}
					error('RTIN is not compatible with DIHEDRON geometry');
				case {'CAEN'}
					error('CAEN is not compatible with DIHEDRON geometry');
				case {'DROP'}
					error('DROP is not compatible with DIHEDRON geometry');
				case {'EXAC'}
					error('EXAC is not compatible with DIHEDRON geometry');
				case {'EXACNEU'}
					error('EXACNEU is not compatible with DIHEDRON geometry');
				case {'POIS'}
					error('POIS is not compatible with DIHEDRON geometry');
				case {'GTPSI'}
					error('GTPSI is not compatible with DIHEDRON geometry');
				case {'NONA'}
					height_bl = 0.2;
					nbnodes_inbl_y = 8;
					nbseg_perunit_x = 40;
					nbseg_outbl_y = 36;
					prog_geom_bl_y = 1.1;
				otherwise
					error('Unknown test case');
			end
			usrbuf{l} = '% Parameters for a NS2DDV mesh';
			l = l+1;
			usrbuf{l} = '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%';
			l = l+1;
			usrbuf{l} = '% Height of the boundary layer';
			l = l+1;
			usrbuf{l} = sprintf('PARAMETERS.MESH.HEIGHT_BL = %g;', height_bl);
			l = l+1;

			switch answers.CV_STUDY
				case {'IN_SPACE', 'IN_SPACETIME'}
					% The use provides a list of values for nbseg_perunit_x, nbnodes_inbl_y
					usrbuf{l} = '% Number of edges by segment of length 1 in x-direction (even values recommended)';
					l = l+1;
					usrbuf{l} = sprintf('PARAMETERS.MESH.NBSEG_PERUNIT_X = {%d, %d, %d};', ...
									nbseg_perunit_x, 2*nbseg_perunit_x, 4*nbseg_perunit_x);
					l = l+1;
					usrbuf{l} = '% Number of nodes in the boundary layer in y-direction';
					l = l+1;
					usrbuf{l} = sprintf('PARAMETERS.MESH.NBNODES_INBL_Y = {%d, %d, %d};', ...
									nbnodes_inbl_y, 2*nbnodes_inbl_y, 4*nbnodes_inbl_y);
					l = l+1;
				case {'IN_TIME', 'IN_REYNOLDS', 'NONE'}
					% The use provides a single value for nbseg_perunit_x, nbnodes_inbl_y
					usrbuf{l} = '% Number of edges by segment of length 1 in x-direction (even value recommended)';
					l = l+1;
					usrbuf{l} = sprintf('PARAMETERS.MESH.NBSEG_PERUNIT_X = %d;', nbseg_perunit_x);
					l = l+1;
					usrbuf{l} = '% Number of nodes in the boundary layer in y-direction';
					l = l+1;
					usrbuf{l} = sprintf('PARAMETERS.MESH.NBNODES_INBL_Y = %d;', nbnodes_inbl_y);
					l = l+1;
				otherwise
					error('Problem in build_meshbuf');
			end

			usrbuf{l} = '% Geometric reason of nodes repartition in the boundary layer in y-direction';
			l = l+1;
			usrbuf{l} = sprintf('PARAMETERS.MESH.PROG_GEOM_BL_Y = %g;', prog_geom_bl_y);
			l = l+1;

			switch answers.CV_STUDY
				case {'IN_SPACE', 'IN_SPACETIME'}
					% The use provides a list of values for nbseg_outbl_y
					usrbuf{l} = '% Number of edges out of the boundary layer in y-direction';
					l = l+1;
					usrbuf{l} = sprintf('PARAMETERS.MESH.NBSEG_OUTBL_Y = {%d, %d, %d};', ...
								nbseg_outbl_y, 2*nbseg_outbl_y, 4*nbseg_outbl_y);
					l = l+1;

				case {'IN_TIME', 'IN_REYNOLDS', 'NONE'}
					% The use provides a single value for nbseg_outbl_y
					usrbuf{l} = '% Number of edges out of the boundary layer in y-direction';
					l = l+1;
					usrbuf{l} = sprintf('PARAMETERS.MESH.NBSEG_OUTBL_Y = %d;', nbseg_outbl_y);
					l = l+1;
				otherwise
					error('Problem in build_meshbuf');
			end

			usrbuf{l} = '% Design of structured mesh (''DIAGONAL'' or ''CROSS'')';
			l = l+1;
			usrbuf{l} = 'PARAMETERS.MESH.TRIANGLES_ORIENTATION = ''CROSS'';';
			l = l+1;

		case {'STEP'}

		case {'FROM_FILE'}

		otherwise
			error('Problem in build_meshbuf');
	end

	% Add PDET parameters
	if answers.PDET
		switch answers.TESTCASE
			case {'RTIN'}
				h0 = 0.1;
			case {'CAEN'}
				h0 = 0.1;
			case {'DROP'}
				h0 = 0.1;
			case {'EXAC'}
				h0 = 0.1;
			case {'EXACNEU'}
				h0 = 0.1;
			case {'POIS'}
				switch answers.GEOM
					case {'RECTANGLE'}
						h0 = 0.001;
					case {'STEP'}
						h0 = 0.1;
					otherwise
						error('POIS test case is compatible only with RECTANGLE or STEP geometries');
				end
			case {'NONA'}
				h0 = 0.2;
			case {'GTPSI'}
				h0 = 0.1;
			otherwise
				error('Unknown test case');
		end

		usrbuf{l} = '% Parameters for a PDET mesh';
		l = l+1;
		usrbuf{l} = '%%%%%%%%%%%%%%%%%%%%%%%%%%%%';
		l = l+1;

		switch answers.CV_STUDY
			case {'IN_SPACE', 'IN_SPACETIME'}
				% The use provides a list of values for h0
				usrbuf{l} = '% Characteristic edge length in the mesh';
				l = l+1;
				usrbuf{l} = '% {value 1, value 2, ...} set of values for H0 for running the convergence analysis';
				l = l+1;
				usrbuf{l} = sprintf('PARAMETERS.MESH.H0 = {%g, %g, %g};', h0, 0.5*h0, 0.25*h0);
				l = l+1;

			case {'IN_TIME', 'IN_REYNOLDS', 'NONE'}
				% The use provides a single value for h0
				usrbuf{l} = '% Characteristic edge length in the mesh';
				l = l+1;
				usrbuf{l} = sprintf('PARAMETERS.MESH.H0 = %g;', h0);
				l = l+1;
			otherwise
				error('Problem in build_meshbuf');
		end
	end

	% Add parameters for external mesh
	usrbuf{l} = '% Parameters for a FROM_FILE mesh';
	l = l+1;
	usrbuf{l} = '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%';
	l = l+1;
	usrbuf{l} = '% Mesh source file(s) : .msh or _p1/_t1 format allowed';
	l = l+1;
	usrbuf{l} = '% {''xxxx.msh''}             cell array of size 1 for .msh format';
	l = l+1;
	usrbuf{l} = '% {''xxxx_p1'', ''xxxx_t1''} cell array of size 2 for _p1/_t1 format';
	l = l+1;
	usrbuf{l} = 'PARAMETERS.MESH.SRC_FILES = {};';
	l = l+1;
	usrbuf{l} = '% Rescale the mesh to fit with the domain geometry above (''YES'' or ''NO'')';
	l = l+1;
	usrbuf{l} = 'PARAMETERS.MESH.RESCALE = ''NO'';';
	l = l+1;


end
back to top