diff --git a/matlab/dynare_config.m b/matlab/dynare_config.m index 91accb65b..878160ab9 100644 --- a/matlab/dynare_config.m +++ b/matlab/dynare_config.m @@ -44,6 +44,7 @@ addpath([dynareroot '/kalman/smoother']) addpath([dynareroot '/AIM/']) addpath([dynareroot '/partial_information/']) addpath([dynareroot '/swz/']) +addpath([dynareroot '/parallel/']) % For functions that exist only under some Octave versions % or some MATLAB versions, and for which we provide some replacement functions diff --git a/matlab/parallel/CreateTimeString.m b/matlab/parallel/CreateTimeString.m new file mode 100644 index 000000000..e71db6900 --- /dev/null +++ b/matlab/parallel/CreateTimeString.m @@ -0,0 +1,41 @@ +function [TiSt] = CreateTimeString() +% PARALLEL CONTEXT +% In a parallel context, this is ... +% +% +% INPUT/OUTPUT description: +% +% +% +% Copyright (C) 2009-2010 Dynare Team +% +% This file is part of Dynare. +% +% Dynare 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. +% +% Dynare 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 Dynare. If not, see . + + + +TiSt=[]; +T=fix(clock); + + +S1=num2str(T(1)); +S2=num2str(T(2)); +S3=num2str(T(3)); +S4=num2str(T(4)); +S5=num2str(T(5)); +S6=num2str(T(6)); + + +TiSt=[S1 '-' S2 '-' S3 '-' S4 'h' S5 'm' S6 's']; diff --git a/matlab/parallel/InitializeComputationalEnviroment.m b/matlab/parallel/InitializeComputationalEnviroment.m new file mode 100644 index 000000000..7ddb22de4 --- /dev/null +++ b/matlab/parallel/InitializeComputationalEnviroment.m @@ -0,0 +1,51 @@ +function [ErrorCode] = InitializeComputationalEnviroment(DataInput) + +% PARALLEL CONTEXT +% In a parallel context, this function is used to Initialize the computational enviroment according with +% the user request. +% If no error happen the function return 0. +% +% INPUT/OUTPUT description: +% +% +% +% +% The variable ErrorCode is initialized at 0. If there are non problems +% the ErrorCode is unchanged, in the others cases is set equak to 1, 2 , ... The values +% table is below. +% +% +% Table for ErrorCode Values. +% +% +% Then at the point call of this function it is possible react in a best way, in accord +% with the ErrorCode. + +% Copyright (C) 2009-2010 Dynare Team +% +% This file is part of Dynare. +% +% Dynare 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. +% +% Dynare 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 Dynare. If not, see . + +ErrorCode=0; + +% Invoke masterParallel with 8 arguments and the last equal to 1. With this shape +% for input data, masterParallel only create a new directory for remote +% computation. The name of this directory is time depending. For local +% parallel computations with Strategy == 1 delete the traces (if exists) of +% previous computations. +delete(['P_slave_*End.txt']) +masterParallel(DataInput.parallel,[],[],[],[],[],[],DataInput.parallel_info,1); + +return \ No newline at end of file diff --git a/matlab/parallel/dynareParallelDelete.m b/matlab/parallel/dynareParallelDelete.m new file mode 100644 index 000000000..7f11d8f30 --- /dev/null +++ b/matlab/parallel/dynareParallelDelete.m @@ -0,0 +1,46 @@ +function dynareParallelDelete(fname,pname,Parallel) +% PARALLEL CONTEXT +% In a parallel context, this is a specialized version of delete() function. +% +% +% INPUT/OUTPUT description: +% +% +% +% +% Copyright (C) 2009-2010 Dynare Team +% +% This file is part of Dynare. +% +% Dynare 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. +% +% Dynare 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 Dynare. If not, see . + +if nargin ==0, + disp('dynareParallelDelete(fname)') + return +end + +if nargin ==1, + pname=''; +else + pname=[pname,filesep]; +end + +for indPC=1:length(Parallel), + if isunix + system(['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' rm -f ',Parallel(indPC).RemoteFolder,'/',pname,fname]); + else + delete(['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\',pname,fname]); + end + +end diff --git a/matlab/parallel/dynareParallelDir.m b/matlab/parallel/dynareParallelDir.m new file mode 100644 index 000000000..f63331cb6 --- /dev/null +++ b/matlab/parallel/dynareParallelDir.m @@ -0,0 +1,45 @@ +function dirlist = dynareParallelDir(filename,PRCDir,Parallel) +% PARALLEL CONTEXT +% In a parallel context, this is ... +% +% +% INPUT/OUTPUT description: +% +% +% +% Copyright (C) 2009-2010 Dynare Team +% +% This file is part of Dynare. +% +% Dynare 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. +% +% Dynare 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 Dynare. If not, see . + +dirlist=[]; +for indPC=1:length(Parallel), + if isunix || (~matlab_ver_less_than('7.4') && ismac), + if Parallel(indPC).Local==0, + [check, ax]=system(['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' ls ',Parallel(indPC).RemoteFolder,'/',PRCDir,'/',filename]); + else + ax=ls(filename); + + end + dirlist = [dirlist, ax]; + else + if Parallel(indPC).Local==0, + ax=ls(['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\',PRCDir,'\',filename]); + else + ax=ls(filename); + end + dirlist = [dirlist; ax]; + end +end diff --git a/matlab/parallel/dynareParallelGetFiles.m b/matlab/parallel/dynareParallelGetFiles.m new file mode 100644 index 000000000..ed7c77f1c --- /dev/null +++ b/matlab/parallel/dynareParallelGetFiles.m @@ -0,0 +1,47 @@ +function dynareParallelGetFiles(NamFileInput,PRCDir,Parallel) +% PARALLEL CONTEXT +% In a parallel context, this is ... +% +% +% INPUT/OUTPUT description: +% +% +% +% Copyright (C) 2009-2010 Dynare Team +% +% This file is part of Dynare. +% +% Dynare 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. +% +% Dynare 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 Dynare. If not, see . + + +if ischar(NamFileInput), + for j=1:size(NamFileInput,1), + NamFile(j,:)={['.',filesep],deblank(NamFileInput(j,:))}; + end + NamFileInput = NamFile; +end + +for indPC=1:length(Parallel), + if Parallel(indPC).Local==0, + if isunix || (~matlab_ver_less_than('7.4') && ismac), + for jfil=1:size(NamFileInput,1), + system(['scp ',Parallel(indPC).user,'@',Parallel(indPC).PcName,':',Parallel(indPC).RemoteFolder,'/',PRCDir,'/',NamFileInput{jfil,1},NamFileInput{jfil,2},' ',NamFileInput{jfil,1}]); + end + else + for jfil=1:size(NamFileInput,1) + copyfile(['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\',PRCDir,'\',NamFileInput{jfil,1},NamFileInput{jfil,2}],NamFileInput{jfil,1}) + end + end + end +end diff --git a/matlab/parallel/dynareParallelMkDir.m b/matlab/parallel/dynareParallelMkDir.m new file mode 100644 index 000000000..70065fe77 --- /dev/null +++ b/matlab/parallel/dynareParallelMkDir.m @@ -0,0 +1,49 @@ +function dynareParallelMkDir(PRCDir,Parallel) +% PARALLEL CONTEXT +% In a parallel context, this is a specialized version of rmdir() function. +% +% +% INPUT/OUTPUT description: +% +% +% +% +% +% Then at the point call of this function it is possible react in a best way, in accord +% with the ErrorCode. + +% Copyright (C) 2009-2010 Dynare Team +% +% This file is part of Dynare. +% +% Dynare 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. +% +% Dynare 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 Dynare. If not, see . + + + +if nargin ==0, + disp('dynareParallelMkDir(dirname,Parallel)') + return +end + +for indPC=1:length(Parallel) + if Parallel(indPC).Local==0, + if isunix || (~matlab_ver_less_than('7.4') && ismac), + system(['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' mkdir -p ',Parallel(indPC).RemoteFolder,'/',PRCDir]) + else + [NonServeS NonServeD]=mkdir(['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\',PRCDir]); + end + end +end + +return \ No newline at end of file diff --git a/matlab/parallel/dynareParallelRmDir.m b/matlab/parallel/dynareParallelRmDir.m new file mode 100644 index 000000000..e1c1703d0 --- /dev/null +++ b/matlab/parallel/dynareParallelRmDir.m @@ -0,0 +1,60 @@ +function dynareParallelRmDir(PRCDir,Parallel) +% PARALLEL CONTEXT +% In a parallel context, this is a specialized version of rmdir() function. +% +% +% INPUT/OUTPUT description: +% +% +% +% +% +% Then at the point call of this function it is possible react in a best way, in accord +% with the ErrorCode. + +% Copyright (C) 2009-2010 Dynare Team +% +% This file is part of Dynare. +% +% Dynare 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. +% +% Dynare 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 Dynare. If not, see . + + + +if nargin ==0, + disp('dynareParallelRmDir(fname)') + return +end + +for indPC=1:length(Parallel), + while (1) + % keyboard; + if isunix + stat = system(['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' rm -fr ',Parallel(indPC).RemoteFolder,'/',PRCDir]); + break; + else + [stat, mess, id] = rmdir(['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\',PRCDir],'s'); + if stat==1, + break, + else + if isempty(dynareParallelDir(PRCDir,'',Parallel)); + break, + else + pause(1); + end + end + end + end +end + +return \ No newline at end of file diff --git a/matlab/parallel/dynareParallelSendFiles.m b/matlab/parallel/dynareParallelSendFiles.m new file mode 100644 index 000000000..fbbabafe8 --- /dev/null +++ b/matlab/parallel/dynareParallelSendFiles.m @@ -0,0 +1,55 @@ +function dynareParallelSendFiles(NamFileInput,PRCDir,Parallel) +% PARALLEL CONTEXT +% In a parallel context, this is ... +% +% +% INPUT/OUTPUT description: +% +% +% +% Copyright (C) 2009-2010 Dynare Team +% +% This file is part of Dynare. +% +% Dynare 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. +% +% Dynare 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 Dynare. If not, see . + + +if ischar(NamFileInput), + for j=1:size(NamFileInput,1), + NamFile(j,:)={'',deblank(NamFileInput(j,:))}; + end + NamFileInput = NamFile; +end + +for indPC=1:length(Parallel), + if Parallel(indPC).Local==0, + if isunix || (~matlab_ver_less_than('7.4') && ismac), + for jfil=1:size(NamFileInput,1), + if ~isempty(NamFileInput{jfil,1}) + system(['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' mkdir -p ',Parallel(indPC).RemoteFolder,'/',PRCDir,'/',NamFileInput{jfil,1}]) + end + system(['scp ',NamFileInput{jfil,1},NamFileInput{jfil,2},' ',Parallel(indPC).user,'@',Parallel(indPC).PcName,':',Parallel(indPC).RemoteFolder,'/',PRCDir,'/',NamFileInput{jfil,1}]); + end + else + for jfil=1:size(NamFileInput,1) + if ~isempty(NamFileInput{jfil,1}) + if isempty(dynareParallelDir(NamFileInput{jfil,1},PRCDir,Parallel(indPC))) + mkdir(['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\',PRCDir,'\',NamFileInput{jfil,1}]); + end + end + copyfile([NamFileInput{jfil,1},NamFileInput{jfil,2}],['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\',PRCDir,'\',NamFileInput{jfil,1}]) + end + end + end +end