generate_setup_file.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[] = generate_setup_file(namefile)
% INPUT
% namefile Name of the setup file used for the simulation
load_paths();
% Test if the required toolboxes are available
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
A = ver();
res.PCT = 0;
res.PDET = 0;
for i=1:numel(A)
if strcmp(A(i).Name, 'Parallel Computing Toolbox')
res.PCT = 1;
end
if strcmp(A(i).Name, 'Partial Differential Equation Toolbox')
res.PDET = 1;
end
end
res.AMD = ~(exist('amd') == 0);
res.CMK = ~(exist('symrcm') == 0);
% Choice of cluster profile
%%%%%%%%%%%%%%%%%%%%%%%%%%%
disp(sprintf('\nChoose a pre-defined cluster profile (if you do not know, select ''LOCAL'''));
addlocal = sprintf('''LOCAL'' Default cluster profile (works on most configurations)');
addzeus = sprintf('''ZEUS'' Lille 1 HPC center cluster profile');
addmathcalc = sprintf('''MATHCALC'' Lab. Paul Painlevé cluster profile');
disp(addlocal)
disp(addzeus)
disp(addmathcalc)
res.ALL_CLUSTER = {'LOCAL', 'ZEUS', 'MATHCALC'};
while 1
res.CLUSTER = input(sprintf('Your choice : '));
if (max(strcmp(res.CLUSTER, res.ALL_CLUSTER)) == 1)
break;
end
end
if strcmp(res.CLUSTER, {'ZEUS', 'MATHCALC'})
res.PDET = 1;
res.PCT = 1;
end
% Choice of the model
%%%%%%%%%%%%%%%%%%%%%
disp(sprintf('\nSelect a model :'));
disp('''NSDV'' 2D incompressible Navier-Stokes system with variable density');
disp('''NS'' 2D incompressible Navier-Stokes system');
while 1
res.MODEL = input(sprintf('Your choice : '));
if (max(strcmp(res.MODEL, {'NSDV', 'NS'})) == 1)
break;
end
end
% Choice of the test case
%%%%%%%%%%%%%%%%%%%%%%%%%
message = sprintf('\nSelect a test case :');
% Common test cases
addcaen = sprintf('''CAEN'' Lid-driven cavity');
addexac = sprintf('''EXAC'' Analytic solution with divergence-free velocity');
addrtin = sprintf('''RTIN'' Rayleigh-Taylor instability');
adddrop = sprintf('''DROP'' Falling droplet');
addnona = sprintf('''NONA'' Non-analytic solution');
addpois = sprintf('''POIS'' Poiseuille flow');
addexacneu = sprintf('''EXACNEU'' Analytic solution with divergence-free velocity and mixed boundary conditions');
addgtpsi = sprintf('''GTPSI'' Translate a localized gaussian vorticity');
switch res.MODEL
case {'NSDV'}
message = sprintf('%s\n%s\n%s\n%s\n%s\n%s', message, addcaen, addexac, addrtin, adddrop, addexacneu);
res.ALL_TESTCASES = {'RTIN', 'DROP', 'CAEN', 'EXAC', 'EXACNEU'};
res.ANALYTIC_TESTCASES = {'EXAC', 'EXACNEU'};
case {'NS'}
message = sprintf('%s\n%s\n%s\n%s\n%s\n%s\n%s', message, addcaen, addexac, addnona, addpois, ...
addexacneu, addgtpsi);
res.ALL_TESTCASES = {'NONA', 'CAEN', 'EXAC', 'POIS', 'EXACNEU', 'GTPSI'};
res.ANALYTIC_TESTCASES = {'EXAC', 'EXACNEU'};
otherwise
error(sprintf('Problem in generate_manual_setup.m: a model is missing\n'));
end
if (numel(res.ALL_TESTCASES) > 1)
disp(message)
while 1
res.TESTCASE = input(sprintf('Your choice : '));
if (max(strcmp(res.TESTCASE, res.ALL_TESTCASES)) == 1)
break;
end
end
elseif (numel(res.ALL_TESTCASES) == 1)
res.TESTCASE = res.ALL_TESTCASES{1};
fprintf('\nDefault test case: %s\n', res.TESTCASE);
else
error(sprintf('No test case provided for the model %s. Please correct the file generate_setup_file.m', res.MODEL));
end
% According to the chosen test case, allow the access to the convergence parameters
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
addspace = sprintf('''IN_SPACE'' Convergence analysis according to the space step only');
addtime = sprintf('''IN_TIME'' Convergence analysis according to the time step only');
addspacetime = sprintf('''IN_SPACETIME'' Convergence analysis according to both space and time steps');
addReynolds = sprintf('''IN_REYNOLDS'' Stability analysis according to the Reynolds number');
addnone = sprintf('''NONE'' No stability/convergence analysis, run a simple simulation');
if (max(strcmp(res.TESTCASE, res.ANALYTIC_TESTCASES)) == 1)
message = sprintf('\nDo you want to run a convergence or stability analysis ?');
message = sprintf('%s\n%s\n%s\n%s\n%s\n%s', message, addspace, addtime, addspacetime, addReynolds, addnone);
res.ALL_CV_STUDY = {'IN_SPACE', 'IN_TIME', 'IN_SPACETIME', 'IN_REYNOLDS', 'NONE'};
else
message = sprintf('\nDo you want to run a stability analysis ?');
message = sprintf('%s\n%s\n%s', message, addnone);
res.ALL_CV_STUDY = {'NONE'};
end
if (numel(res.ALL_CV_STUDY) > 1)
disp(message)
while 1
res.CV_STUDY = input(sprintf('Your choice : '));
if (max(strcmp(res.CV_STUDY, res.ALL_CV_STUDY)) == 1)
break;
end
end
elseif (numel(res.ALL_CV_STUDY) == 1)
res.CV_STUDY = res.ALL_CV_STUDY{1};
fprintf('\nDefault convergence/stability analysis: %s\n', res.CV_STUDY);
else
error(sprintf('No convergence/stability analysis provided for the test case %s. Please correct the file generate_setup_file.m', res.TESTCASE));
end
% Choice of a domain geometry
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
message = sprintf('\nChoose a domain geometry :');
addcircle = sprintf('''CIRCLE'' Use a pre-built circular geometry description');
addrectangle = sprintf('''RECTANGLE'' Use a pre-built rectangular geometry description');
addfromfile = sprintf('''FROM_FILE'' Load data from a Matlab geometry description (.m format)');
adddihedron = sprintf('''DIHEDRON'' Use a pre-built diedral geometry description');
addstep = sprintf('''STEP'' Use a pre-built step geometry description');
switch res.MODEL
case {'NSDV'}
switch res.TESTCASE
case {'RTIN'}
message = sprintf('%s\n%s', message, addrectangle);
res.ALL_GEOM = {'RECTANGLE'};
case {'DROP'}
message = sprintf('%s\n%s', message, addrectangle);
res.ALL_GEOM = {'RECTANGLE'};
case {'CAEN'}
message = sprintf('%s\n%s', message, addrectangle);
res.ALL_GEOM = {'RECTANGLE'};
case {'EXAC'}
message = sprintf('%s\n%s', message, addrectangle);
res.ALL_GEOM = {'RECTANGLE'};
case {'EXACNEU'}
message = sprintf('%s\n%s', message, addrectangle);
res.ALL_GEOM = {'RECTANGLE'};
otherwise
error(sprintf('Problem in generate_manual_setup.m: a test case is missing\n'));
end
case {'NS'}
switch res.TESTCASE
case {'NONA'}
message = sprintf('%s\n%s\n%s\n%s', message, addrectangle, adddihedron, addstep);
res.ALL_GEOM = {'RECTANGLE', 'DIHEDRON', 'STEP'};
case {'CAEN'}
message = sprintf('%s\n%s', message, addrectangle);
res.ALL_GEOM = {'RECTANGLE'};
case {'EXAC'}
message = sprintf('%s\n%s', message, addrectangle);
res.ALL_GEOM = {'RECTANGLE'};
case {'POIS'}
message = sprintf('%s\n%s\n%s', message, addrectangle, addstep);
res.ALL_GEOM = {'RECTANGLE', 'STEP'};
case {'EXACNEU'}
message = sprintf('%s\n%s', message, addrectangle);
res.ALL_GEOM = {'RECTANGLE'};
case {'GTPSI'}
message = sprintf('%s\n%s', message, addrectangle);
res.ALL_GEOM = {'RECTANGLE'};
otherwise
error(sprintf('Problem in generate_setup_file.m: the test case %s is missing\n', res.TESTCASE));
end
otherwise
error(sprintf('Problem in generate_setup_file.m: the model %s is missing\n', res.MODEL));
end
if (numel(res.ALL_GEOM) > 1)
disp(message)
while 1
res.GEOM = input(sprintf('Your choice : '));
if (max(strcmp(res.GEOM, res.ALL_GEOM)) == 1)
break;
end
end
elseif (numel(res.ALL_GEOM) == 1)
res.GEOM = res.ALL_GEOM{1};
fprintf('\nDefault geometry : %s\n', res.GEOM);
else
error(sprintf('No geometry provided from the model %s and test case %s. Please correct the file generate_setup_file.m', res.MODEL, res.TESTCASE));
end
% Finite Volume Method parameters
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
switch res.MODEL
case {'NSDV'}
message = sprintf('\nChoose a Finite Volume method for discretizing the mass conservation equation :');
addmuscl = sprintf('''MUSCL'' MUSCL scheme');
addrdn = sprintf('''RDN'' Residual distribution scheme, N-scheme variant (not implemented)');
addrdlda = sprintf('''RDLDA'' Residual distribution scheme, LDA-scheme variant (not implemented)');
addrdpsi = sprintf('''RDPSI'' Residual distribution scheme, PSI-scheme variant (not implemented)');
message = sprintf('%s\n%s', message, addmuscl);
res.ALL_FV = {'MUSCL'};
if (numel(res.ALL_FV) > 1)
disp(message)
while 1
res.FV = input(sprintf('Your choice : '));
if (max(strcmp(res.FV, res.ALL_FV)) == 1)
break;
end
end
elseif (numel(res.ALL_FV) == 1)
res.FV = res.ALL_FV{1};
fprintf('\nDefault Finite Volume method: %s\n', res.FV);
else
error(sprintf('No Finite Volume method provided from the model %s. Please correct the file generate_setup_file.m', res.MODEL));
end
case {'NS'}
otherwise
error(sprintf('Problem in generate_manual_setup.m: a model is missing\n'));
end
% Parallelization parameters
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
message = sprintf('\nChoose a parallelization toolbox :');
addserial = sprintf('''SERIAL'' No parallelization');
addpct = sprintf('''PCT'' Matlab Parallel Computing Toolbox');
if res.PCT
message = sprintf('%s\n%s\n%s', message, addpct, addserial);
res.ALL_PARALLEL = {'SERIAL', 'PCT'};
else
message = sprintf('%s\n%s', message, addserial);
res.ALL_PARALLEL = {'SERIAL'};
end
if (numel(res.ALL_PARALLEL) > 1)
disp(message)
while 1
res.PARALLEL = input(sprintf('Your choice : '));
if (max(strcmp(res.PARALLEL, res.ALL_PARALLEL)) == 1)
break;
end
end
elseif (numel(res.ALL_PARALLEL) == 1)
res.PARALLEL = res.ALL_PARALLEL{1};
fprintf('\nDefault parallelization toolbox: %s\n', res.PARALLEL);
else
error(sprintf('No parallelization toolbox. Please correct the file generate_setup_file.m'));
end
fixbuf = build_fixbuf(res);
usrbuf = {};
tempbuf = build_domainbuf(res);
usrbuf = {usrbuf{:}, tempbuf{:}};
tempbuf = build_physicalbuf(res);
usrbuf = {usrbuf{:}, tempbuf{:}};
tempbuf = build_initbuf(res);
usrbuf = {usrbuf{:}, tempbuf{:}};
tempbuf = build_meshbuf(res);
usrbuf = {usrbuf{:}, tempbuf{:}};
tempbuf = build_FEBCbuf(res);
usrbuf = {usrbuf{:}, tempbuf{:}};
tempbuf = build_FEbuf(res);
usrbuf = {usrbuf{:}, tempbuf{:}};
tempbuf = build_dtFEbuf(res);
usrbuf = {usrbuf{:}, tempbuf{:}};
tempbuf = build_FVbuf(res);
usrbuf = {usrbuf{:}, tempbuf{:}};
tempbuf = build_parallelbuf(res);
usrbuf = {usrbuf{:}, tempbuf{:}};
tempbuf = build_outputbuf(res);
usrbuf = {usrbuf{:}, tempbuf{:}};
if strcmp(namefile(numel(namefile)-1:numel(namefile)), '.m')
newnamefile = namefile;
else
newnamefile = strcat(namefile, '.m');
end
fid = fopen(newnamefile, 'w');
for i=1:numel(fixbuf)
fprintf(fid, '%s\n', fixbuf{i});
end
for i=1:numel(usrbuf)
fprintf(fid, '%s\n', usrbuf{i});
end
fclose(fid);
end