diff --git a/matlab/parallel/AnalyseComputationalEnvironment.m b/matlab/parallel/AnalyseComputationalEnvironment.m
index 9ac207e5cc003076b913f716aef0f5a1ceeaca8f..e5d2a87f530e2b3ef276bcbb6a52cc80bb06ff96 100644
--- a/matlab/parallel/AnalyseComputationalEnvironment.m
+++ b/matlab/parallel/AnalyseComputationalEnvironment.m
@@ -1,636 +1,657 @@
-function [ErrorCode] = AnalyseComputationalEnvironment(DataInput, DataInputAdd)
-% PARALLEL CONTEXT
-% In a parallel context, this function is used to check the cluster defined by the user.
-% If no error happen the function returns 0. The function complies with
-% Windows/Linux operating systems and Matlab/Octave software.
-%
-%
-% INPUT/OUTPUT description:
-%
-%
-% DataInput
-%   is the strcture option_.parallel, with the follow fields:
-%
-%             Local         1 is on local machine, 0 remote
-%      ComputerName         the computer name.
-%            CPUnbr         the CPU's
-%          UserName         the user name for the ComputerName.
-%          Password         the password for the user name in ComputerName.
-%       RemoteDrive         Drive used for Remote computation (data exchange, etc): must be contain 'RemoteFolder'.
-%   RemoteDirectory         Folder in RemoteDrive used for Remote computation.
-%  MatlabOctavePath         Path to MATLAB or Octave executable.
-%        DynarePath         Path to matlab directory within the Dynare installation directory.
-%
-%   This information is typed by the user in the DYNARE configuration file and is parsed by the preprocessor,
-%   the goal of this function is to check if configuration is correct and if dynare
-%   can be executed successfully in parallel mode.
-%
-%
-% DataInputAdd
-%   it is the structure options_.parallel_info. Currently , only the string in the
-%   field RemoteTmpFolder (the temporary directory created/destroyed on remote
-%   computer) is used.
-
-if ispc, 
-    [tempo, MasterName]=system('hostname');
-    MasterName=deblank(MasterName);
-end
-
-RemoteTmpFolder=DataInputAdd.RemoteTmpFolder;
-dynareParallelMkDir(RemoteTmpFolder,DataInput);
-
-
-% The variable ErrorCode is initialized at 0. If there are non problems with
-% Local, ComputerName connections,... in general with parallel software execution,
-% the ErrorCode is unchanged, in the others cases 1, 2 , ... The values
-% table is below.
-%
-%
-%   Table for ErrorCode Values.
-%
-%   ErrorCode -> 0      Initial Value -> No Error Detected!!!
-%   ErrorCode -> 1 ...  When an error is detected, the values 1, 2, 3... are
-%   used to specify the type of error or warning.
-%
-%   Value 1:    The variable 'Local' has a bad value!
-%
-%   Value 2:    The variable 'CPUnbr' has a bad value. For more information
-%               see http://www.dynare.org/DynareWiki/ParallelDynare.
-%         2.1   [warning] The user asks to use more CPU's than those available.
-%         2.2   [warning] There are unused CPU's!
-%         2.3   [error] NumberOfThreadsPerJob is not a divisor of CPUnbr
-%
-%
-%   Value 3:    The remote computer is unreachable!!!
-%
-%   Value 4:    The fields user name and/or password are/is empty!
-%
-%   Value 5:    Remote Drive and/or Remote Folder do not exist!
-%
-%   Value 6:    It is impossible write/read files on the remote computer.
-%
-%   Value 7:    The values user and/or passwd are incorrect or the user has
-%               no permissions to execute a Matlab session. Or simply
-%               Matlab path (MatlabOctavePath) is incorrect!
-%
-%   Value 8:    Dynare path (DynarePath) is incorrect!
-%
-%   Value 9:    It is impossible delete remote computational temporary files!
-%
-%
-%
-%
-% Currently when errors are detected execution simply stops and users can
-% fix configuration errors according to the error type.
-
-% Copyright (C) 2009-2013 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 <http://www.gnu.org/licenses/>.
-
-
-ErrorCode=0;
-
-
-for Node=1:length(DataInput) % To obtain a recoursive function remove the 'for'
-    % and use AnalyseComputationalEnvironment with differents input!
-    
-    
-    % Determine the operating system or software version when necessary
-    % for different command types.
-   
-    OScallerUnix=~ispc;
-    OScallerWindows=ispc;
-    OStargetUnix=strcmpi('unix',DataInput(Node).OperatingSystem);
-    if isempty(DataInput(Node).OperatingSystem),
-        OStargetUnix=OScallerUnix;
-    end
-    OStargetWindows=strcmpi('windows',DataInput(Node).OperatingSystem);
-    if isempty(DataInput(Node).OperatingSystem),
-        OStargetWindows=OScallerWindows;
-    end
-    
-    Environment= (OScallerUnix || OStargetUnix);
-    
-    skipline(2)
-    disp(['Testing computer -> ',DataInput(Node).ComputerName,' <- ...']);
-    skipline(2)
-    
-    % The function is composed by two main blocks, determined by the 'Local'
-    % variable.
-    
-    % This check can be removed ... according to the dynare parser
-    % strategy.
-    
-    if ((DataInput(Node).Local == 0) |(DataInput(Node).Local == 1))
-        % Continue it is Ok!
-        disp('Check on Local Variable ..... Ok!');
-        skipline()    
-    else
-        disp('The variable "Local" has a bad value!');
-        skipline()
-        disp('ErrorCode 1.');
-        skipline()
-        ErrorCode=1;
-        return
-    end
-    
-    %         %%%%%%%%%%  Local (No Network) Computing   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-    %         Here only the multi-core, or multi-processor avaiable on local
-    %         machine are involved in parallel computing. No network
-    %         comunications are required!
-    
-    
-    % In this case we need to check only the variable 'CPUnbr'.
-    
-    % We run the parallel code on local computer, so the others fields are automatically
-    % fixed by Dynare parser. Then the user can also fill them with wrong values.
-    
-    
-    %         %%%%%%%%%%  Cluster Computing   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-    %         Here we can have many computer with multi-core, or multi-processor avaiable on the
-    %         network and involved in parallel computing.
-    %         So in this case we need more sophisticated check.
-    
-    
-    if (DataInput(Node).Local == 0)
-        
-        % Now we verify if it is possibile to be connected with the
-        % remote computer.
-        
-        si1=[];
-        de1=[];
-        
-        if Environment
-            if OScallerWindows
-                [si1 de1]=system(['ping ', DataInput(Node).ComputerName]);
-            else
-                [si1 de1]=system(['ping ', DataInput(Node).ComputerName, ' -c 4']);
-            end
-        else
-            [si1 de1]=system(['ping ', DataInput(Node).ComputerName]);
-        end
-        
-        if (si1)
-            disp(['It is impossibile to ping to the computer with name "',DataInput(Node).ComputerName,'" using the network!'])
-            skipline()
-            disp('ErrorCode 3.')
-            ErrorCode=3;
-            skipline(2)
-        else
-            disp('Check on ComputerName Variable ..... Ok!')
-            skipline(2)
-        end
-        
-        
-        % Now we verify if user name and password are correct and if remote
-        % drive and remote folder exist on the remote computer and it is
-        % possible to exchange data with them.
-        
-        if Environment
-            % This check can be removed ... according to the dynare parser
-            % strategy.
-            
-            if (isempty(DataInput(Node).UserName))
-                disp('The fields UserName is empty!')
-                skipline()
-                disp('ErrorCode 4.')
-                skipline(2)
-                ErrorCode=4;
-                return
-            end
-            disp('Check on UserName Variable ..... Ok!')
-            skipline(2)
-            
-            % This check can be removed ... according to the dynare parser
-            % strategy.           
-                if (~isempty(DataInput(Node).Password))
-                    disp('[WARNING] The field Password should be empty under unix or mac!');
-                    skipline()
-                    disp(['Remove the string ',DataInput(Node).Password,' from this field!'])
-                    skipline()
-                    disp('ErrorCode 4.')
-                    skipline(2)
-                    ErrorCode=4;
-                else
-                    disp('Check on Password Variable ..... Ok!')
-                    skipline(2)
-                end
-        else
-            
-            % This check can be removed ... according to the dynare parser
-            % strategy.
-            
-            if (isempty(DataInput(Node).UserName)) || (isempty(DataInput(Node).Password))
-                disp('The fields UserName and/or Password are/is empty!');
-                skipline()
-                disp('ErrorCode 4.')
-                skipline(2)
-                ErrorCode=4;
-                return
-            end
-            disp('Check on UserName Variable ..... Ok!');
-            skipline()
-            disp('Check on Password Variable ..... Ok!');
-            skipline()
-        end
-        
-        % Now we very if RemoteDrive and/or RemoteDirectory exist on remote
-        % computer!
-        
-        if Environment
-            
-            % This check can be removed ... according to the dynare parser
-            % strategy.
-            
-            if  isempty(DataInput(Node).RemoteDirectory)
-                disp('The field RemoteDirectory is empty!')
-                skipline()
-                disp('ErrorCode 5.')
-                skipline()
-                ErrorCode=5;
-                return
-            end
-            
-            % This check can be removed ... according to the dynare parser
-            % strategy.
-            
-                if (~isempty(DataInput(Node).RemoteDrive))
-                    disp('[WARNING] The fields RemoteDrive should be empty under unix or mac!')
-                    skipline()
-                    disp(['remove the string ',DataInput(Node).RemoteDrive,' from this field!'])
-                    skipline()
-                    disp('ErrorCode 5.')
-                    skipline(2)
-                    ErrorCode=5;
-                end
-            
-            si2=[];
-            de2=[];
-            if ~isempty(DataInput(Node).Port),
-                ssh_token = ['-p ',DataInput(Node).Port];
-            else
-                ssh_token = '';
-            end
-            
-            [si2 de2]=system(['ssh ',ssh_token,' ',DataInput(Node).UserName,'@',DataInput(Node).ComputerName,' ls ',DataInput(Node).RemoteDirectory,'/',RemoteTmpFolder,'/']);
-            
-            if (si2)
-                disp ('Remote Directory does not exist or is not reachable!')
-                skipline()
-                disp('ErrorCode 5.')
-                skipline(2)
-                ErrorCode=5;
-                return
-            end
-            
-            disp('Check on RemoteDirectory Variable ..... Ok!')
-            skipline(2)
-            disp('Check on RemoteDrive Variable ..... Ok!')
-            skipline(2)
-            
-        else
-            % This check can be removed ... according to the dynare parser
-            % strategy.
-            
-            if (isempty(DataInput(Node).RemoteDrive)||isempty(DataInput(Node).RemoteDirectory))
-                disp('Remote RemoteDrive and/or RemoteDirectory is/are empty!')
-                skipline()
-                disp('ErrorCode 5.')
-                skipline(2)
-                ErrorCode=5;
-                return
-            end
-            
-            
-            si2=[];
-            de2=[];
-            [si2 de2]=system(['dir \\',DataInput(Node).ComputerName,'\',DataInput(Node).RemoteDrive,'$\',DataInput(Node).RemoteDirectory,'\',RemoteTmpFolder]);
-            
-            if (si2)
-                disp ('Remote Directory does not exist or it is not reachable!')
-                skipline()
-                disp('ErrorCode 5.')
-                skipline(2)
-                ErrorCode=5;
-                return
-            end
-            
-            disp('Check on RemoteDirectory Variable ..... Ok!')
-            skipline(2)
-            disp('Check on RemoteDrive Variable ..... Ok!')
-            skipline(2)
-            
-        end
-        
-        
-        % Now we verify if it possible to exchange data with the remote
-        % computer:
-        
-        
-        % Build a command file to test the matlab execution and dynare path ...
-        
-        fid = fopen('Tracing.m', 'w+');
-        s1=(['fT = fopen(''MatlabOctaveIsOk.txt'',''w+'');\n']);
-        s2='fclose(fT);\n';
-        SBS=strfind(DataInput(Node).DynarePath,'\');
-        DPStr=DataInput(Node).DynarePath;
-        if isempty(SBS),
-            DPStrNew=DPStr;
-        else
-            DPStrNew=[DPStr(1:SBS(1)),'\'];
-            for j=2:length(SBS),
-                DPStrNew=[DPStrNew,DPStr(SBS(j-1)+1:SBS(j)),'\'];
-            end
-            DPStrNew=[DPStrNew,DPStr(SBS(end)+1:end)];
-        end
-        s3=['addpath(''',DPStrNew,'''),\n'];
-        s4=['try,\n  dynareroot = dynare_config();\n'];
-        s41=(['  fT = fopen(''DynareIsOk.txt'',''w+'');\n']);
-        s42='  fclose(fT);\n';
-        s5=['catch,end,\n'];
-        s51=(['  fT = fopen(''DynareFailed.txt'',''w+'');\n']);
-        s52='  fclose(fT);\n';
-        send='exit';
-        StrCommand=([s1,s2,s3,s4,s41,s42,s5,s51,s52,send]);
-        
-        % Mettere controllo su NbW ...
-        % if isoctave
-        %     NbW = fprintf(fid,StrCommand, '%s');
-        % else
-        NbW = fprintf(fid,StrCommand, '%s');
-        % end
-        fclose(fid);
-        
-        dynareParallelSendFiles('Tracing.m', RemoteTmpFolder,DataInput(Node));
-        FindTracing = dynareParallelDir('Tracing.m', RemoteTmpFolder,DataInput(Node));
-        
-        delete ('Tracing.m');
-        
-        if (isempty(FindTracing))
-            disp('It is impossible to exchange data with Remote Drive and/or Remote Directory! ErrorCode 6.')
-            skipline()
-            disp('ErrorCode 6.')
-            skipline(2)
-            ErrorCode=6;
-            return
-        else
-            disp('Check on Exchange File with Remote Computer ..... Ok!')
-            skipline(2)
-        end
-        
-        
-        % Now we verify if it is possible execute a matlab/octave section on remote
-        % machine when the user is .UserName with password .Password and
-        % the path is MatlabOctavePath.
-        
-        if Environment,
-            if ~isempty(DataInput(Node).Port),
-                ssh_token = ['-p ',DataInput(Node).Port];
-            else
-                ssh_token = '';
-            end
-            if strfind([DataInput(Node).MatlabOctavePath], 'octave') % Hybrid computing Matlab(Master)->Octave(Slaves) and Vice Versa!
-                system(['ssh ',ssh_token,' ',DataInput(Node).UserName,'@',DataInput(Node).ComputerName,' "cd ',DataInput(Node).RemoteDirectory,'/',RemoteTmpFolder,  '; ', DataInput(Node).MatlabOctavePath, ' Tracing.m;" &']);
-            else
-                system(['ssh ',ssh_token,' ',DataInput(Node).UserName,'@',DataInput(Node).ComputerName,' "cd ',DataInput(Node).RemoteDirectory,'/',RemoteTmpFolder,  '; ', DataInput(Node).MatlabOctavePath, ' -nosplash -nodesktop -minimize -r Tracing;" &']);
-            end
-        else
-            if ~strcmp(DataInput(Node).ComputerName,MasterName), % run on remote machine
-                if  strfind([DataInput(Node).MatlabOctavePath], 'octave') % Hybrid computing Matlab(Master)->Octave(Slaves) and Vice Versa!
-                    [NonServeS NenServeD]=system(['start /B psexec \\',DataInput(Node).ComputerName,' -e -u ',DataInput(Node).UserName,' -p ',DataInput(Node).Password,' -W ',DataInput(Node).RemoteDrive,':\',DataInput(Node).RemoteDirectory,'\',RemoteTmpFolder ' -low   ',DataInput(Node).MatlabOctavePath,' Tracing.m']);
-                else
-                    [NonServeS NenServeD]=system(['start /B psexec \\',DataInput(Node).ComputerName,' -e -u ',DataInput(Node).UserName,' -p ',DataInput(Node).Password,' -W ',DataInput(Node).RemoteDrive,':\',DataInput(Node).RemoteDirectory,'\',RemoteTmpFolder ' -low   ',DataInput(Node).MatlabOctavePath,' -nosplash -nodesktop -minimize -r Tracing']);
-                end
-            else % run on local machine via the network: user and passwd cannot be used!
-                if  strfind([DataInput(Node).MatlabOctavePath], 'octave') % Hybrid computing Matlab(Master)->Octave(Slaves) and Vice Versa!
-                    [NonServeS NenServeD]=system(['start /B psexec \\',DataInput(Node).ComputerName,' -e ',' -W ',DataInput(Node).RemoteDrive,':\',DataInput(Node).RemoteDirectory,'\',RemoteTmpFolder ' -low   ',DataInput(Node).MatlabOctavePath,' Tracing.m']);
-                else
-                    [NonServeS NenServeD]=system(['start /B psexec \\',DataInput(Node).ComputerName,' -e ',' -W ',DataInput(Node).RemoteDrive,':\',DataInput(Node).RemoteDirectory,'\',RemoteTmpFolder ' -low   ',DataInput(Node).MatlabOctavePath,' -nosplash -nodesktop -minimize -r Tracing']);
-                end
-            end
-                
-        end
-        
-        % Timer da fissare, nei valori di attesa!
-        
-        t1=fix(clock);
-        
-        if t1(5)+1>60;
-            t2=2;
-        else t2=t1(5)+1;
-        end
-        
-        Flag=0;
-        
-        while (1);
-            if Flag==0
-                disp('Try to run matlab/octave on remote machine ... ')
-                skipline()
-                disp('please wait ... ')
-                skipline()
-                Flag=1;
-            end
-            nt=fix(clock);
-            nt(5)-t2;
-            
-            if (~isempty (dynareParallelDir('MatlabOctaveIsOk.txt',RemoteTmpFolder,DataInput(Node)))) || ((nt(5)-t2)>0)
-                if ((nt(5)-t2)>0)
-                    ErrorCode=7;
-                end
-                break
-            end
-            
-        end
-        
-        if  (ErrorCode==7)
-            
-            disp ('It is not possible execute a matlab session on remote machine!')
-            skipline()
-            disp('ErrorCode 7.')
-            skipline(2)
-            ErrorCode=7;
-            dynareParallelRmDir(RemoteTmpFolder,DataInput(Node));
-            return
-        else
-            disp('Check on MatlabOctave Path and MatlabOctave Program Execution on remote machine ..... Ok!')
-            skipline(2)
-            
-            % Now we verify if the DynarePath is correct ...
-            disp('Check the Dynare path on remote machine ... ')
-            skipline()
-            disp('please wait ... ')
-            skipline(2)
-            pause(2)
-            
-            if isempty(dynareParallelDir('DynareIsOk.txt',RemoteTmpFolder,DataInput(Node)))
-                ErrorCode=8;
-            end
-            
-            if  (ErrorCode==8)
-                disp ('The DynarePath is incorrect!')
-                skipline()
-                disp('ErrorCode 8.')
-                skipline(2)
-                ErrorCode=8;
-                dynareParallelRmDir(RemoteTmpFolder,DataInput(Node));
-                return
-            else
-                disp('Check on Dynare Path remote machine ..... Ok!')
-                skipline(2)
-            end
-        end
-        
-        
-        % Now we verify if it is possible delete remote computational traces!
-        
-        dynareParallelRmDir(RemoteTmpFolder,DataInput(Node));
-        
-        si3=[];
-        
-        si3=dynareParallelDir('Tracing.m', RemoteTmpFolder,DataInput(Node));
-        
-        if (isempty(si3))
-            disp ('Check on Delete Remote Computational Traces ..... Ok!')
-            skipline(2)
-        else
-            disp ('It is impossible to delete temporary files on remote machine!')
-            skipline()
-            disp('ErrorCode 9.')
-            skipline(2)
-            ErrorCode=9;
-            return
-        end
-        
-        
-    end
-    % Now we check the variable 'CPUnbr'.
-    
-    % This check can be removed ... according to the dynare parser
-    % strategy.
-    
-    yn=isempty(DataInput(Node).CPUnbr);
-    
-    if yn==1
-        % The field is empty!
-        disp('The field "CPUnbr" is empty!')
-        skipline()
-        disp('ErrorCode 2.')
-        skipline(2)
-        ErrorCode=2;
-        return
-    end
-    
-    % This check can be removed ... according to the dynare parser
-    % strategy.
-    
-    
-    
-    % We look for the information on local computer hardware.
-    
-    si0=[];
-    de0=[];
-    
-    disp('Checking Hardware please wait ...');
-    if (DataInput(Node).Local == 1)
-        if Environment,
-            [si0 de0]=system('grep processor /proc/cpuinfo');
-        else
-            [si0 de0]=system(['psinfo \\']);
-        end
-    else
-        if Environment,
-            if ~isempty(DataInput(Node).Port),
-                ssh_token = ['-p ',DataInput(Node).Port];
-            else
-                ssh_token = '';
-            end
-            if OStargetUnix,
-                [si0 de0]=system(['ssh ',ssh_token,' ',DataInput(Node).UserName,'@',DataInput(Node).ComputerName,' grep processor /proc/cpuinfo']);
-            else
-                [si0 de0]=system(['ssh ',ssh_token,' ',DataInput(Node).UserName,'@',DataInput(Node).ComputerName,' psinfo']);
-            end
-        else
-            [si0 de0]=system(['psinfo \\',DataInput(Node).ComputerName,' -u ',DataInput(Node).UserName,' -p ',DataInput(Node).Password]);
-        end
-    end
-    
-    
-    RealCPUnbr='';
-%    keyboard;
-    RealCPUnbr=GiveCPUnumber(de0,Environment);
-    
-    % Questo controllo penso che si possa MIGLIORARE!!!!!
-    if  isempty (RealCPUnbr) && Environment==0,
-        [si0 de0]=system(['psinfo \\',DataInput(Node).ComputerName]);
-    end        
-    RealCPUnbr=GiveCPUnumber(de0,Environment);
-
-    if  isempty (RealCPUnbr)
-        % An error occurred when we try to know the Cpu/Cores
-        % numbers.
-        disp('It is impossible determine the number of Cpu/Processor avaiable on this machine!')
-        skipline()
-        disp('ErrorCode 2.')
-        skipline()
-        if Environment
-            disp('Check the command "$less /proc/cpuinfo" ... !')
-        else
-            disp('Check if the pstools are installed and are in machine path! And check the command "psinfo \\"')
-        end
-        skipline()
-        ErrorCode=2;
-        return
-    end
-    
-    
-    % Trasforming the input data provided in a form [n1:n2] in a single numerical
-    % value.
-    
-    
-    CPUnbrUser=length(DataInput(Node).CPUnbr);
-    maxCPUnbrUser=max(DataInput(Node).CPUnbr)+1;
-    
-    disp(['Hardware has ', num2str(RealCPUnbr),' Cpu/Cores!'])
-    disp(['User requires ',num2str(CPUnbrUser),' Cpu/Cores!'])
-    if  CPUnbrUser==RealCPUnbr,
-        % It is Ok!
-        disp('Check on CPUnbr Variable ..... Ok!')
-        skipline(3)
-    end
-    
-    if CPUnbrUser > RealCPUnbr
-        disp('Warning! The user asks to use more CPU''s than those available.')
-        skipline(2)
-        ErrorCode=2.1;
-    end
-    if CPUnbrUser < RealCPUnbr
-        disp('Warning! There are unused CPU''s!')
-        skipline(2)
-        ErrorCode=2.2;
-    end
-    
-    if mod(length(DataInput(Node).CPUnbr),DataInput(Node).NumberOfThreadsPerJob)
-        skipline()
-        disp(['NumberOfThreadsPerJob = ',int2str(DataInput(Node).NumberOfThreadsPerJob),' is not an exact divisor of number of CPUs = ',int2str(DataInput(Node).CPUnbr)),'!'])
-        disp(['    You must re-set properly NumberOfThreadsPerJob of node ' int2str(Node) ' ' DataInput(Node).ComputerName])
-        disp(['    in your configuration file'])
-        skipline()
-        ErrorCode=2.3;
-    end
-    
-    disp(['Test for Cluster computation, computer ',DataInput(Node).ComputerName, ' ..... Passed!'])
-    skipline(2)    
+function [ErrorCode] = AnalyseComputationalEnvironment(DataInput, DataInputAdd)
+% PARALLEL CONTEXT
+% In a parallel context, this function is used to check the cluster defined by the user.
+% If no error happen the function returns 0. The function complies with
+% Windows/Linux operating systems and Matlab/Octave software.
+%
+%
+% INPUT/OUTPUT description:
+%
+%
+% DataInput
+%   is the strcture option_.parallel, with the follow fields:
+%
+%             Local         1 is on local machine, 0 remote
+%      ComputerName         the computer name.
+%            CPUnbr         the CPU's
+%          UserName         the user name for the ComputerName.
+%          Password         the password for the user name in ComputerName.
+%       RemoteDrive         Drive used for Remote computation (data exchange, etc): must be contain 'RemoteFolder'.
+%   RemoteDirectory         Folder in RemoteDrive used for Remote computation.
+%  MatlabOctavePath         Path to MATLAB or Octave executable.
+%        DynarePath         Path to matlab directory within the Dynare installation directory.
+%
+%   This information is typed by the user in the DYNARE configuration file and is parsed by the preprocessor,
+%   the goal of this function is to check if configuration is correct and if dynare
+%   can be executed successfully in parallel mode.
+%
+%
+% DataInputAdd
+%   it is the structure options_.parallel_info. Currently , only the string in the
+%   field RemoteTmpFolder (the temporary directory created/destroyed on remote
+%   computer) is used.
+
+if ispc, 
+    [tempo, MasterName]=system('hostname');
+    MasterName=deblank(MasterName);
+end
+
+RemoteTmpFolder=DataInputAdd.RemoteTmpFolder;
+dynareParallelMkDir(RemoteTmpFolder,DataInput);
+
+
+% The variable ErrorCode is initialized at 0. If there are non problems with
+% Local, ComputerName connections,... in general with parallel software execution,
+% the ErrorCode is unchanged, in the others cases 1, 2 , ... The values
+% table is below.
+%
+%
+%   Table for ErrorCode Values.
+%
+%   ErrorCode -> 0      Initial Value -> No Error Detected!!!
+%   ErrorCode -> 1 ...  When an error is detected, the values 1, 2, 3... are
+%   used to specify the type of error or warning.
+%
+%   Value 1:    The variable 'Local' has a bad value!
+%
+%   Value 2:    The variable 'CPUnbr' has a bad value. For more information
+%               see http://www.dynare.org/DynareWiki/ParallelDynare.
+%         2.1   [warning] The user asks to use more CPU's than those available.
+%         2.2   [warning] There are unused CPU's!
+%         2.3   [error] NumberOfThreadsPerJob is not a divisor of CPUnbr
+%
+%
+%   Value 3:    The remote computer is unreachable!!!
+%
+%   Value 4:    The fields user name and/or password are/is empty!
+%
+%   Value 5:    Remote Drive and/or Remote Folder do not exist!
+%
+%   Value 6:    It is impossible write/read files on the remote computer.
+%
+%   Value 7:    The values user and/or passwd are incorrect or the user has
+%               no permissions to execute a Matlab session. Or simply
+%               Matlab path (MatlabOctavePath) is incorrect!
+%
+%   Value 8:    Dynare path (DynarePath) is incorrect!
+%
+%   Value 9:    It is impossible delete remote computational temporary files!
+%
+%
+%
+%
+% Currently when errors are detected execution simply stops and users can
+% fix configuration errors according to the error type.
+
+% Copyright (C) 2009-2013 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 <http://www.gnu.org/licenses/>.
+
+
+ErrorCode=0;
+
+
+for Node=1:length(DataInput) % To obtain a recoursive function remove the 'for'
+    % and use AnalyseComputationalEnvironment with differents input!
+    
+    
+    % Determine the operating system or software version when necessary
+    % for different command types.
+   
+    OScallerUnix=~ispc;
+    OScallerWindows=ispc;
+    OStargetUnix=strcmpi('unix',DataInput(Node).OperatingSystem);
+    if isempty(DataInput(Node).OperatingSystem),
+        OStargetUnix=OScallerUnix;
+    end
+    OStargetWindows=strcmpi('windows',DataInput(Node).OperatingSystem);
+    if isempty(DataInput(Node).OperatingSystem),
+        OStargetWindows=OScallerWindows;
+    end
+    
+    Environment= (OScallerUnix || OStargetUnix);
+    
+    skipline(2)
+    disp(['Testing computer -> ',DataInput(Node).ComputerName,' <- ...']);
+    skipline(2)
+    
+    % The function is composed by two main blocks, determined by the 'Local'
+    % variable.
+    
+    % This check can be removed ... according to the dynare parser
+    % strategy.
+    
+    if ((DataInput(Node).Local == 0) |(DataInput(Node).Local == 1))
+        % Continue it is Ok!
+        disp('Check on Local Variable ..... Ok!');
+        skipline()    
+    else
+        disp('The variable "Local" has a bad value!');
+        skipline()
+        disp('ErrorCode 1.');
+        skipline()
+        ErrorCode=1;
+        return
+    end
+    
+    %         %%%%%%%%%%  Local (No Network) Computing   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    %         Here only the multi-core, or multi-processor avaiable on local
+    %         machine are involved in parallel computing. No network
+    %         comunications are required!
+    
+    
+    % In this case we need to check only the variable 'CPUnbr'.
+    
+    % We run the parallel code on local computer, so the others fields are automatically
+    % fixed by Dynare parser. Then the user can also fill them with wrong values.
+    
+    
+    %         %%%%%%%%%%  Cluster Computing   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    %         Here we can have many computer with multi-core, or multi-processor avaiable on the
+    %         network and involved in parallel computing.
+    %         So in this case we need more sophisticated check.
+    
+    
+    if (DataInput(Node).Local == 0)
+        
+        % Now we verify if it is possibile to be connected with the
+        % remote computer.
+        
+        si1=[];
+        de1=[];
+        
+        if Environment
+            if OScallerWindows
+                [si1 de1]=system(['ping ', DataInput(Node).ComputerName]);
+            else
+                [si1 de1]=system(['ping ', DataInput(Node).ComputerName, ' -c 4']);
+            end
+        else
+            [si1 de1]=system(['ping ', DataInput(Node).ComputerName]);
+        end
+        
+        if (si1)
+            disp(['It is impossibile to ping to the computer with name "',DataInput(Node).ComputerName,'" using the network!'])
+            skipline()
+            disp('ErrorCode 3.')
+            ErrorCode=3;
+            skipline(2)
+        else
+            disp('Check on ComputerName Variable ..... Ok!')
+            skipline(2)
+        end
+        
+        
+        % Now we verify if user name and password are correct and if remote
+        % drive and remote folder exist on the remote computer and it is
+        % possible to exchange data with them.
+        
+        if Environment
+            % This check can be removed ... according to the dynare parser
+            % strategy.
+            
+            if (isempty(DataInput(Node).UserName))
+                disp('The fields UserName is empty!')
+                skipline()
+                disp('ErrorCode 4.')
+                skipline(2)
+                ErrorCode=4;
+                return
+            end
+            disp('Check on UserName Variable ..... Ok!')
+            skipline(2)
+            
+            % This check can be removed ... according to the dynare parser
+            % strategy.           
+                if (~isempty(DataInput(Node).Password))
+                    disp('[WARNING] The field Password should be empty under unix or mac!');
+                    skipline()
+                    disp(['Remove the string ',DataInput(Node).Password,' from this field!'])
+                    skipline()
+                    disp('ErrorCode 4.')
+                    skipline(2)
+                    ErrorCode=4;
+                else
+                    disp('Check on Password Variable ..... Ok!')
+                    skipline(2)
+                end
+        else
+            
+            % This check can be removed ... according to the dynare parser
+            % strategy.
+            
+            if (isempty(DataInput(Node).UserName)) || (isempty(DataInput(Node).Password))
+                disp('The fields UserName and/or Password are/is empty!');
+                skipline()
+                disp('ErrorCode 4.')
+                skipline(2)
+                ErrorCode=4;
+                return
+            end
+            disp('Check on UserName Variable ..... Ok!');
+            skipline()
+            disp('Check on Password Variable ..... Ok!');
+            skipline()
+        end
+        
+        % Now we very if RemoteDrive and/or RemoteDirectory exist on remote
+        % computer!
+        
+        if Environment
+            
+            % This check can be removed ... according to the dynare parser
+            % strategy.
+            
+            if  isempty(DataInput(Node).RemoteDirectory)
+                disp('The field RemoteDirectory is empty!')
+                skipline()
+                disp('ErrorCode 5.')
+                skipline()
+                ErrorCode=5;
+                return
+            end
+            
+            % This check can be removed ... according to the dynare parser
+            % strategy.
+            
+                if (~isempty(DataInput(Node).RemoteDrive))
+                    disp('[WARNING] The fields RemoteDrive should be empty under unix or mac!')
+                    skipline()
+                    disp(['remove the string ',DataInput(Node).RemoteDrive,' from this field!'])
+                    skipline()
+                    disp('ErrorCode 5.')
+                    skipline(2)
+                    ErrorCode=5;
+                end
+            
+            si2=[];
+            de2=[];
+            if ~isempty(DataInput(Node).Port),
+                ssh_token = ['-p ',DataInput(Node).Port];
+            else
+                ssh_token = '';
+            end
+            
+            [si2 de2]=system(['ssh ',ssh_token,' ',DataInput(Node).UserName,'@',DataInput(Node).ComputerName,' ls ',DataInput(Node).RemoteDirectory,'/',RemoteTmpFolder,'/']);
+            
+            if (si2)
+                disp ('Remote Directory does not exist or is not reachable!')
+                skipline()
+                disp('ErrorCode 5.')
+                skipline(2)
+                ErrorCode=5;
+                return
+            end
+            
+            disp('Check on RemoteDirectory Variable ..... Ok!')
+            skipline(2)
+            disp('Check on RemoteDrive Variable ..... Ok!')
+            skipline(2)
+            
+        else
+            % This check can be removed ... according to the dynare parser
+            % strategy.
+            
+            if (isempty(DataInput(Node).RemoteDrive)||isempty(DataInput(Node).RemoteDirectory))
+                disp('Remote RemoteDrive and/or RemoteDirectory is/are empty!')
+                skipline()
+                disp('ErrorCode 5.')
+                skipline(2)
+                ErrorCode=5;
+                return
+            end
+            
+            
+            si2=[];
+            de2=[];
+            [si2 de2]=system(['dir \\',DataInput(Node).ComputerName,'\',DataInput(Node).RemoteDrive,'$\',DataInput(Node).RemoteDirectory,'\',RemoteTmpFolder]);
+            
+            if (si2)
+                disp ('Remote Directory does not exist or it is not reachable!')
+                skipline()
+                disp('ErrorCode 5.')
+                skipline(2)
+                ErrorCode=5;
+                return
+            end
+            
+            disp('Check on RemoteDirectory Variable ..... Ok!')
+            skipline(2)
+            disp('Check on RemoteDrive Variable ..... Ok!')
+            skipline(2)
+            
+        end
+        
+        
+        % Now we verify if it possible to exchange data with the remote
+        % computer:
+        
+        
+        % Build a command file to test the matlab execution and dynare path ...
+        
+        fid = fopen('Tracing.m', 'w+');
+        s1=(['fT = fopen(''MatlabOctaveIsOk.txt'',''w+'');\n']);
+        s2='fclose(fT);\n';
+        SBS=strfind(DataInput(Node).DynarePath,'\');
+        DPStr=DataInput(Node).DynarePath;
+        if isempty(SBS),
+            DPStrNew=DPStr;
+        else
+            DPStrNew=[DPStr(1:SBS(1)),'\'];
+            for j=2:length(SBS),
+                DPStrNew=[DPStrNew,DPStr(SBS(j-1)+1:SBS(j)),'\'];
+            end
+            DPStrNew=[DPStrNew,DPStr(SBS(end)+1:end)];
+        end
+        s3=['addpath(''',DPStrNew,'''),\n'];
+        s4=['try,\n  dynareroot = dynare_config();\n'];
+        s41=(['  fT = fopen(''DynareIsOk.txt'',''w+'');\n']);
+        s42='  fclose(fT);\n';
+        s5=['catch,\n'];
+        s51=(['  fT = fopen(''DynareFailed.txt'',''w+'');\n']);
+        s52='  fclose(fT);\n';
+        s6=['end,\n'];
+        s7=['if ismac,\n'];
+        s71=(['  fT = fopen(''IsMac.txt'',''w+'');\n']);
+        s72='  fclose(fT);\n';
+        s8=['end,\n'];
+        send='exit';
+        StrCommand=([s1,s2,s3,s4,s41,s42,s5,s51,s52,s6,s7,s71,s72,s8,send]);
+        
+        % Mettere controllo su NbW ...
+        % if isoctave
+        %     NbW = fprintf(fid,StrCommand, '%s');
+        % else
+        NbW = fprintf(fid,StrCommand, '%s');
+        % end
+        fclose(fid);
+        
+        dynareParallelSendFiles('Tracing.m', RemoteTmpFolder,DataInput(Node));
+        FindTracing = dynareParallelDir('Tracing.m', RemoteTmpFolder,DataInput(Node));
+        
+        delete ('Tracing.m');
+        
+        if (isempty(FindTracing))
+            disp('It is impossible to exchange data with Remote Drive and/or Remote Directory! ErrorCode 6.')
+            skipline()
+            disp('ErrorCode 6.')
+            skipline(2)
+            ErrorCode=6;
+            return
+        else
+            disp('Check on Exchange File with Remote Computer ..... Ok!')
+            skipline(2)
+        end
+        
+        
+        % Now we verify if it is possible execute a matlab/octave section on remote
+        % machine when the user is .UserName with password .Password and
+        % the path is MatlabOctavePath.
+        
+        if Environment,
+            if ~isempty(DataInput(Node).Port),
+                ssh_token = ['-p ',DataInput(Node).Port];
+            else
+                ssh_token = '';
+            end
+            if strfind([DataInput(Node).MatlabOctavePath], 'octave') % Hybrid computing Matlab(Master)->Octave(Slaves) and Vice Versa!
+                system(['ssh ',ssh_token,' ',DataInput(Node).UserName,'@',DataInput(Node).ComputerName,' "cd ',DataInput(Node).RemoteDirectory,'/',RemoteTmpFolder,  '; ', DataInput(Node).MatlabOctavePath, ' Tracing.m;" &']);
+            else
+                system(['ssh ',ssh_token,' ',DataInput(Node).UserName,'@',DataInput(Node).ComputerName,' "cd ',DataInput(Node).RemoteDirectory,'/',RemoteTmpFolder,  '; ', DataInput(Node).MatlabOctavePath, ' -nosplash -nodesktop -minimize -r Tracing;" &']);
+            end
+        else
+            if ~strcmp(DataInput(Node).ComputerName,MasterName), % run on remote machine
+                if  strfind([DataInput(Node).MatlabOctavePath], 'octave') % Hybrid computing Matlab(Master)->Octave(Slaves) and Vice Versa!
+                    [NonServeS NenServeD]=system(['start /B psexec \\',DataInput(Node).ComputerName,' -e -u ',DataInput(Node).UserName,' -p ',DataInput(Node).Password,' -W ',DataInput(Node).RemoteDrive,':\',DataInput(Node).RemoteDirectory,'\',RemoteTmpFolder ' -low   ',DataInput(Node).MatlabOctavePath,' Tracing.m']);
+                else
+                    [NonServeS NenServeD]=system(['start /B psexec \\',DataInput(Node).ComputerName,' -e -u ',DataInput(Node).UserName,' -p ',DataInput(Node).Password,' -W ',DataInput(Node).RemoteDrive,':\',DataInput(Node).RemoteDirectory,'\',RemoteTmpFolder ' -low   ',DataInput(Node).MatlabOctavePath,' -nosplash -nodesktop -minimize -r Tracing']);
+                end
+            else % run on local machine via the network: user and passwd cannot be used!
+                if  strfind([DataInput(Node).MatlabOctavePath], 'octave') % Hybrid computing Matlab(Master)->Octave(Slaves) and Vice Versa!
+                    [NonServeS NenServeD]=system(['start /B psexec \\',DataInput(Node).ComputerName,' -e ',' -W ',DataInput(Node).RemoteDrive,':\',DataInput(Node).RemoteDirectory,'\',RemoteTmpFolder ' -low   ',DataInput(Node).MatlabOctavePath,' Tracing.m']);
+                else
+                    [NonServeS NenServeD]=system(['start /B psexec \\',DataInput(Node).ComputerName,' -e ',' -W ',DataInput(Node).RemoteDrive,':\',DataInput(Node).RemoteDirectory,'\',RemoteTmpFolder ' -low   ',DataInput(Node).MatlabOctavePath,' -nosplash -nodesktop -minimize -r Tracing']);
+                end
+            end
+                
+        end
+        
+        % Timer da fissare, nei valori di attesa!
+        
+        t1=fix(clock);
+        
+        if t1(5)+1>60;
+            t2=2;
+        else t2=t1(5)+1;
+        end
+        
+        Flag=0;
+        
+        while (1);
+            if Flag==0
+                disp('Try to run matlab/octave on remote machine ... ')
+                skipline()
+                disp('please wait ... ')
+                skipline()
+                Flag=1;
+            end
+            nt=fix(clock);
+            nt(5)-t2;
+            
+            if (~isempty (dynareParallelDir('MatlabOctaveIsOk.txt',RemoteTmpFolder,DataInput(Node)))) || ((nt(5)-t2)>0)
+                if ((nt(5)-t2)>0)
+                    ErrorCode=7;
+                end
+                break
+            end
+            
+        end
+        
+        if  (ErrorCode==7)
+            
+            disp ('It is not possible execute a matlab session on remote machine!')
+            skipline()
+            disp('ErrorCode 7.')
+            skipline(2)
+            ErrorCode=7;
+            dynareParallelRmDir(RemoteTmpFolder,DataInput(Node));
+            return
+        else
+            disp('Check on MatlabOctave Path and MatlabOctave Program Execution on remote machine ..... Ok!')
+            skipline(2)
+            
+            % Now we verify if the DynarePath is correct ...
+            disp('Check the Dynare path on remote machine ... ')
+            skipline()
+            disp('please wait ... ')
+            skipline(2)
+            pause(2)
+            
+            if isempty(dynareParallelDir('DynareIsOk.txt',RemoteTmpFolder,DataInput(Node)))
+                ErrorCode=8;
+            end
+            
+            if  (ErrorCode==8)
+                disp ('The DynarePath is incorrect!')
+                skipline()
+                disp('ErrorCode 8.')
+                skipline(2)
+                ErrorCode=8;
+                dynareParallelRmDir(RemoteTmpFolder,DataInput(Node));
+                return
+            else
+                disp('Check on Dynare Path remote machine ..... Ok!')
+            if isempty(dynareParallelDir('IsMac.txt',RemoteTmpFolder,DataInput(Node)))
+                RemoteEnvironment=Environment;
+            else
+                RemoteEnvironment=2;                
+            end
+                skipline(2)
+            end
+        end
+        
+        
+        % Now we verify if it is possible delete remote computational traces!
+        
+        dynareParallelRmDir(RemoteTmpFolder,DataInput(Node));
+        
+        si3=[];
+        
+        si3=dynareParallelDir('Tracing.m', RemoteTmpFolder,DataInput(Node));
+        
+        if (isempty(si3))
+            disp ('Check on Delete Remote Computational Traces ..... Ok!')
+            skipline(2)
+        else
+            disp ('It is impossible to delete temporary files on remote machine!')
+            skipline()
+            disp('ErrorCode 9.')
+            skipline(2)
+            ErrorCode=9;
+            return
+        end
+        
+        
+    end
+    % Now we check the variable 'CPUnbr'.
+    
+    % This check can be removed ... according to the dynare parser
+    % strategy.
+    
+    yn=isempty(DataInput(Node).CPUnbr);
+    
+    if yn==1
+        % The field is empty!
+        disp('The field "CPUnbr" is empty!')
+        skipline()
+        disp('ErrorCode 2.')
+        skipline(2)
+        ErrorCode=2;
+        return
+    end
+    
+    % This check can be removed ... according to the dynare parser
+    % strategy.
+    
+    
+    
+    % We look for the information on local computer hardware.
+    
+    si0=[];
+    de0=[];
+    
+    Environment1=Environment;
+    disp('Checking Hardware please wait ...');
+    if (DataInput(Node).Local == 1)
+        if Environment,
+            if ~ismac
+                [si0 de0]=system('grep processor /proc/cpuinfo');
+            else
+                [si0 de0]=system('sysctl -n hw.ncpu');
+                Environment1=2;
+            end
+        else
+            [si0 de0]=system(['psinfo \\']);
+        end
+    else
+        if Environment,
+            if ~isempty(DataInput(Node).Port),
+                ssh_token = ['-p ',DataInput(Node).Port];
+            else
+                ssh_token = '';
+            end
+            if OStargetUnix,
+                if RemoteEnvironment ==1 , 
+                    [si0 de0]=system(['ssh ',ssh_token,' ',DataInput(Node).UserName,'@',DataInput(Node).ComputerName,' grep processor /proc/cpuinfo']);
+                else % it is MAC
+                    [si0 de0]=system(['ssh ',ssh_token,' ',DataInput(Node).UserName,'@',DataInput(Node).ComputerName,' sysctl -n hw.ncpu']);
+                    Environment1=2;
+                end
+            else
+                [si0 de0]=system(['ssh ',ssh_token,' ',DataInput(Node).UserName,'@',DataInput(Node).ComputerName,' psinfo']);
+            end
+        else
+            [si0 de0]=system(['psinfo \\',DataInput(Node).ComputerName,' -u ',DataInput(Node).UserName,' -p ',DataInput(Node).Password]);
+        end
+    end
+    
+    
+    RealCPUnbr='';
+%    keyboard;
+    RealCPUnbr=GiveCPUnumber(de0,Environment1);
+    
+    % Questo controllo penso che si possa MIGLIORARE!!!!!
+    if  isempty (RealCPUnbr) && Environment1==0,
+        [si0 de0]=system(['psinfo \\',DataInput(Node).ComputerName]);
+    end        
+    RealCPUnbr=GiveCPUnumber(de0,Environment1);
+
+    if  isempty (RealCPUnbr)
+        % An error occurred when we try to know the Cpu/Cores
+        % numbers.
+        disp('It is impossible determine the number of Cpu/Processor avaiable on this machine!')
+        skipline()
+        disp('ErrorCode 2.')
+        skipline()
+        if Environment
+            disp('Check the command "$less /proc/cpuinfo" ... !')
+        else
+            disp('Check if the pstools are installed and are in machine path! And check the command "psinfo \\"')
+        end
+        skipline()
+        ErrorCode=2;
+        return
+    end
+    
+    
+    % Trasforming the input data provided in a form [n1:n2] in a single numerical
+    % value.
+    
+    
+    CPUnbrUser=length(DataInput(Node).CPUnbr);
+    maxCPUnbrUser=max(DataInput(Node).CPUnbr)+1;
+    
+    disp(['Hardware has ', num2str(RealCPUnbr),' Cpu/Cores!'])
+    disp(['User requires ',num2str(CPUnbrUser),' Cpu/Cores!'])
+    if  CPUnbrUser==RealCPUnbr,
+        % It is Ok!
+        disp('Check on CPUnbr Variable ..... Ok!')
+        skipline(3)
+    end
+    
+    if CPUnbrUser > RealCPUnbr
+        disp('Warning! The user asks to use more CPU''s than those available.')
+        skipline(2)
+        ErrorCode=2.1;
+    end
+    if CPUnbrUser < RealCPUnbr
+        disp('Warning! There are unused CPU''s!')
+        skipline(2)
+        ErrorCode=2.2;
+    end
+    
+    if mod(length(DataInput(Node).CPUnbr),DataInput(Node).NumberOfThreadsPerJob)
+        skipline()
+        disp(['NumberOfThreadsPerJob = ',int2str(DataInput(Node).NumberOfThreadsPerJob),' is not an exact divisor of number of CPUs = ',int2str(DataInput(Node).CPUnbr),'!'])
+        disp(['    You must re-set properly NumberOfThreadsPerJob of node ' int2str(Node) ' ' DataInput(Node).ComputerName])
+        disp('    in your configuration file')
+        skipline()
+        ErrorCode=2.3;
+    end
+    
+    disp(['Test for Cluster computation, computer ',DataInput(Node).ComputerName, ' ..... Passed!'])
+    skipline(2)    
 end
\ No newline at end of file
diff --git a/matlab/parallel/GiveCPUnumber.m b/matlab/parallel/GiveCPUnumber.m
index 2666d97634c4eef4ed6eef738ae24a3d0a1dac71..00b7fc451b5dc9327865ae2df934c18289dcf027 100644
--- a/matlab/parallel/GiveCPUnumber.m
+++ b/matlab/parallel/GiveCPUnumber.m
@@ -1,72 +1,76 @@
-function [nCPU]= GiveCPUnumber (ComputerInformations, Environment)
-% PARALLEL CONTEXT
-% In a parallel context this function return the CPUs or cores numer avaiable
-% on the computer used for run parallel code.
-%
-% INPUTS
-% an array contained several fields that describe the hardaware
-% software enviroments of a generic computer.
-%
-% OUTPUTS
-% The CPUs or Cores numbers of computer.
-%
-% SPECIAL REQUIREMENTS
-% none
-
-% Copyright (C) 2010-2013 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 <http://www.gnu.org/licenses/>.
-
-
-nCPU='';
-
-if nargin < 2,
-% Determine a specific operating system or software version when necessary
-% for different command (sintax, name, ...).
-Environment=~ispc;
-end
-
-switch Environment
-  case 0          %WINDOWS OPERATING SYSTEM
-    
-    OffSet=27;
-
-    SringPosition=strfind(ComputerInformations, 'Processors:');
-    nCPU=ComputerInformations(SringPosition+OffSet);
-
-    % We check if there are Processors/Cores more than 9.
-
-
-    t0=ComputerInformations(SringPosition+OffSet+1);
-    t1=str2num(t0);
-    t1=isempty(t1);
-
-    % if t1 is 0 the machine have more than 9 CPU.
-
-    if t1==0
-        nCPU=strcat(nCPU,t0);
-    end
-
-    nCPU=str2num(nCPU);
-
-    return
-  case 1            %LIKE UNIX OPERATING SYSTEM
-    
-    % Da generalizzare a un numero di CPu maggiore di 9!!!
-
-    nCPU=str2num(ComputerInformations(length(ComputerInformations)-1))+1;
-
-end
+function [nCPU]= GiveCPUnumber (ComputerInformations, Environment)
+% PARALLEL CONTEXT
+% In a parallel context this function return the CPUs or cores numer avaiable
+% on the computer used for run parallel code.
+%
+% INPUTS
+% an array contained several fields that describe the hardaware
+% software enviroments of a generic computer.
+%
+% OUTPUTS
+% The CPUs or Cores numbers of computer.
+%
+% SPECIAL REQUIREMENTS
+% none
+
+% Copyright (C) 2010-2013 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 <http://www.gnu.org/licenses/>.
+
+
+nCPU='';
+
+if nargin < 2,
+% Determine a specific operating system or software version when necessary
+% for different command (sintax, name, ...).
+Environment=~ispc;
+end
+
+switch Environment
+  case 0          %WINDOWS OPERATING SYSTEM
+    
+    OffSet=27;
+
+    SringPosition=strfind(ComputerInformations, 'Processors:');
+    nCPU=ComputerInformations(SringPosition+OffSet);
+
+    % We check if there are Processors/Cores more than 9.
+
+
+    t0=ComputerInformations(SringPosition+OffSet+1);
+    t1=str2num(t0);
+    t1=isempty(t1);
+
+    % if t1 is 0 the machine have more than 9 CPU.
+
+    if t1==0
+        nCPU=strcat(nCPU,t0);
+    end
+
+    nCPU=str2num(nCPU);
+
+    return
+  case 1            %LIKE UNIX OPERATING SYSTEM
+    
+    % Da generalizzare a un numero di CPu maggiore di 9!!!
+
+    nCPU=str2num(ComputerInformations(length(ComputerInformations)-1))+1;
+
+  case 2            %MAC-OS OPERATING SYSTEM
+
+    nCPU=str2num(ComputerInformations);
+
+end