Raw File
build_geometry.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[geom] = build_geometry(PARAMETERS)

	% INPUT
	% PARAMETERS	List of simulation parameters
	%
	% OUTPUT
	% geom			Domain geometry descriptor for Matlab PDE Toolbox

	switch PARAMETERS.DOMAIN.GEOMETRY
		case {'RECTANGLE'}
			% Define the vertices of the rectangle
			v1 = [PARAMETERS.DOMAIN.XMIN; PARAMETERS.DOMAIN.YMIN];
			v2 = [PARAMETERS.DOMAIN.XMAX; PARAMETERS.DOMAIN.YMIN];
			v3 = [PARAMETERS.DOMAIN.XMAX; PARAMETERS.DOMAIN.YMAX];
			v4 = [PARAMETERS.DOMAIN.XMIN; PARAMETERS.DOMAIN.YMAX];
			% Domain index at the left of each segment, i.e. the domain index (fixed to 1)
			domain_id_left = 1;
			% Domain index at the right of each segment, i.e. the exterior (so it is 0)
			domain_id_right = 0;
			% Define the lines
			line1 = [2; v1(1); v2(1); v1(2); v2(2); domain_id_left; domain_id_right];
			line2 = [2; v2(1); v3(1); v2(2); v3(2); domain_id_left; domain_id_right];
			line3 = [2; v3(1); v4(1); v3(2); v4(2); domain_id_left; domain_id_right];
			line4 = [2; v4(1); v1(1); v4(2); v1(2); domain_id_left; domain_id_right];
			% Define the geometry
			geom = [line1, line2, line3, line4];

		case {'CIRCLE'}
			% Define the center
			c = [PARAMETERS.DOMAIN.XCENTER; PARAMETERS.DOMAIN.YCENTER];
			% Consider shift points for defining the perimeter
			v1 = c + [PARAMETERS.DOMAIN.RADIUS; 0];
			v2 = c + [0; PARAMETERS.DOMAIN.RADIUS];
			v3 = c - [PARAMETERS.DOMAIN.RADIUS; 0];
			v4 = c - [0; PARAMETERS.DOMAIN.RADIUS];
			% Domain index at the left of the perimeter segment, i.e. the domain index (fixed to 1)
			domain_id_left = 1;
			% Domain index at the right of the perimeter segment, i.e. the exterior (so it is 0)
			domain_id_right = 0;
			% Define the arcs
			arc1 = [1; v1(1); v2(1); v1(2); v2(2); domain_id_left; domain_id_right; c; PARAMETERS.DOMAIN.RADIUS];
			arc2 = [1; v2(1); v3(1); v2(2); v3(2); domain_id_left; domain_id_right; c; PARAMETERS.DOMAIN.RADIUS];
			arc3 = [1; v3(1); v4(1); v3(2); v4(2); domain_id_left; domain_id_right; c; PARAMETERS.DOMAIN.RADIUS];
			arc4 = [1; v4(1); v1(1); v4(2); v1(2); domain_id_left; domain_id_right; c; PARAMETERS.DOMAIN.RADIUS];
			% Define the geometry
			geom = [arc1, arc2, arc3, arc4];

        case {'DIHEDRON'}
            v1 = [PARAMETERS.DOMAIN.XMIN        ; PARAMETERS.DOMAIN.YAXIS_ANGLE1];
            v2 = [PARAMETERS.DOMAIN.XAXIS_ANGLE1; PARAMETERS.DOMAIN.YAXIS_ANGLE1];
            v3 = [PARAMETERS.DOMAIN.XAXIS_ANGLE2; PARAMETERS.DOMAIN.YMIN];
            v4 = [PARAMETERS.DOMAIN.XMAX        ; PARAMETERS.DOMAIN.YMIN];
            v5 = [PARAMETERS.DOMAIN.XMAX        ; PARAMETERS.DOMAIN.YMAX];
            v6 = [PARAMETERS.DOMAIN.XMIN        ; PARAMETERS.DOMAIN.YMAX];

			if isfield(PARAMETERS.PHYSICAL, 'INJECTION_XLIM')
				if (numel(PARAMETERS.PHYSICAL.INJECTION_XLIM) == 2)
					a = (PARAMETERS.DOMAIN.YMIN-PARAMETERS.DOMAIN.YAXIS_ANGLE1) / ...
							(PARAMETERS.DOMAIN.XAXIS_ANGLE2-PARAMETERS.DOMAIN.XAXIS_ANGLE1);
					v7 = [PARAMETERS.PHYSICAL.INJECTION_XLIM{1}, ...
								a*(PARAMETERS.PHYSICAL.INJECTION_XLIM{1}-PARAMETERS.DOMAIN.XAXIS_ANGLE1) ...
										+ PARAMETERS.DOMAIN.YAXIS_ANGLE1];
					v8 = [PARAMETERS.PHYSICAL.INJECTION_XLIM{2}, ...
								a*(PARAMETERS.PHYSICAL.INJECTION_XLIM{2}-PARAMETERS.DOMAIN.XAXIS_ANGLE1) ...
										+ PARAMETERS.DOMAIN.YAXIS_ANGLE1];
				end
			end
            % Domain index at the left of each segment, i.e. the domain index (fixed to 1)
			domain_id_left = 1;
			% Domain index at the right of each segment, i.e. the exterior (so it is 0)
			domain_id_right = 0;
			if isfield(PARAMETERS.PHYSICAL, 'INJECTION_XLIM')
				if (numel(PARAMETERS.PHYSICAL.INJECTION_XLIM) == 2)
					% Define the lines
					line1 = [2; v1(1); v2(1); v1(2); v2(2); domain_id_left; domain_id_right];
					line2 = [2; v2(1); v7(1); v2(2); v7(2); domain_id_left; domain_id_right];
					line3 = [2; v7(1); v8(1); v7(2); v8(2); domain_id_left; domain_id_right];
					line4 = [2; v8(1); v3(1); v8(2); v3(2); domain_id_left; domain_id_right];
					line5 = [2; v3(1); v4(1); v3(2); v4(2); domain_id_left; domain_id_right];
					line6 = [2; v4(1); v5(1); v4(2); v5(2); domain_id_left; domain_id_right];
            		line7 = [2; v5(1); v6(1); v5(2); v6(2); domain_id_left; domain_id_right];
            		line8 = [2; v6(1); v1(1); v6(2); v1(2); domain_id_left; domain_id_right];
					% Define the geometry
					geom = [line1, line2, line3, line4, line5, line6, line7, line8];
				else
					% Define the lines
					line1 = [2; v1(1); v2(1); v1(2); v2(2); domain_id_left; domain_id_right];
        		    line2 = [2; v2(1); v3(1); v2(2); v3(2); domain_id_left; domain_id_right];
					line3 = [2; v3(1); v4(1); v3(2); v4(2); domain_id_left; domain_id_right];
					line4 = [2; v4(1); v5(1); v4(2); v5(2); domain_id_left; domain_id_right];
        		    line5 = [2; v5(1); v6(1); v5(2); v6(2); domain_id_left; domain_id_right];
        		    line6 = [2; v6(1); v1(1); v6(2); v1(2); domain_id_left; domain_id_right];
					% Define the geometry
					geom = [line1, line2, line3, line4, line5, line6];
				end
			else
				% Define the lines
				line1 = [2; v1(1); v2(1); v1(2); v2(2); domain_id_left; domain_id_right];
				line2 = [2; v2(1); v3(1); v2(2); v3(2); domain_id_left; domain_id_right];
				line3 = [2; v3(1); v4(1); v3(2); v4(2); domain_id_left; domain_id_right];
				line4 = [2; v4(1); v5(1); v4(2); v5(2); domain_id_left; domain_id_right];
				line5 = [2; v5(1); v6(1); v5(2); v6(2); domain_id_left; domain_id_right];
				line6 = [2; v6(1); v1(1); v6(2); v1(2); domain_id_left; domain_id_right];
				% Define the geometry
				geom = [line1, line2, line3, line4, line5, line6];
			end

		case {'STEP'}
			switch PARAMETERS.DOMAIN.STEP_POSITION
				case {'LEFT'}
					v1 = [PARAMETERS.DOMAIN.XMIN; PARAMETERS.DOMAIN.YSTEP];
					v2 = [PARAMETERS.DOMAIN.XSTEP; PARAMETERS.DOMAIN.YSTEP];
					v3 = [PARAMETERS.DOMAIN.XSTEP; PARAMETERS.DOMAIN.YMIN];
					v4 = [PARAMETERS.DOMAIN.XMAX; PARAMETERS.DOMAIN.YMIN];
					v5 = [PARAMETERS.DOMAIN.XMAX; PARAMETERS.DOMAIN.YMAX];
					v6 = [PARAMETERS.DOMAIN.XMIN; PARAMETERS.DOMAIN.YMAX];
				case {'RIGHT'}
					v1 = [PARAMETERS.DOMAIN.XMIN; PARAMETERS.DOMAIN.YMIN];
					v2 = [PARAMETERS.DOMAIN.XSTEP; PARAMETERS.DOMAIN.YMIN];
					v3 = [PARAMETERS.DOMAIN.XSTEP; PARAMETERS.DOMAIN.YSTEP];
					v4 = [PARAMETERS.DOMAIN.XMAX; PARAMETERS.DOMAIN.YSTEP];
					v5 = [PARAMETERS.DOMAIN.XMAX; PARAMETERS.DOMAIN.YMAX];
					v6 = [PARAMETERS.DOMAIN.XMIN; PARAMETERS.DOMAIN.YMAX];
				otherwise
					error('Unknown position of step in STEP domain geometry');
			end
			% Domain index at the left of each segment, i.e. the domain index (fixed to 1)
			domain_id_left = 1;
			% Domain index at the right of each segment, i.e. the exterior (so it is 0)
			domain_id_right = 0;
			% Define the lines
			line1 = [2; v1(1); v2(1); v1(2); v2(2); domain_id_left; domain_id_right];
            line2 = [2; v2(1); v3(1); v2(2); v3(2); domain_id_left; domain_id_right];
			line3 = [2; v3(1); v4(1); v3(2); v4(2); domain_id_left; domain_id_right];
			line4 = [2; v4(1); v5(1); v4(2); v5(2); domain_id_left; domain_id_right];
            line5 = [2; v5(1); v6(1); v5(2); v6(2); domain_id_left; domain_id_right];
            line6 = [2; v6(1); v1(1); v6(2); v1(2); domain_id_left; domain_id_right];     
			% Define the geometry
			geom = [line1, line2, line3, line4, line5, line6];
		otherwise
			error('Unknown geometry: only RECTANGLE, CIRCLE, DIHEDRON or STEP geometries are handled.\n');
	end
end
back to top