diff --git a/matlab/perfect-foresight-models/private/simulation_core.m b/matlab/perfect-foresight-models/private/simulation_core.m index 79f91604864097cd58002a4bea6ebdc2986af643..d09b51b585093c75e8e17489153772b08bdff50c 100644 --- a/matlab/perfect-foresight-models/private/simulation_core.m +++ b/matlab/perfect-foresight-models/private/simulation_core.m @@ -110,10 +110,14 @@ if nargout>1 [i_cols_J1,~,i_cols_1] = find(illi(:)); i_cols_T = nonzeros(M_.lead_lag_incidence(1:2,:)'); end - residuals = perfect_foresight_problem(yy(:),str2func([M_.fname '_dynamic']), y0, yT, ... - oo_.exo_simul,M_.params,oo_.steady_state, ... - options_.periods,M_.endo_nbr,i_cols, ... - i_cols_J1, i_cols_1, i_cols_T, i_cols_j, ... - M_.NNZDerivatives(1)); - maxerror = max(max(abs(residuals))); + if options_.block && ~options_.bytecode + maxerror = oo_.deterministic_simulation.error; + else + residuals = perfect_foresight_problem(yy(:),str2func([M_.fname '_dynamic']), y0, yT, ... + oo_.exo_simul,M_.params,oo_.steady_state, ... + options_.periods,M_.endo_nbr,i_cols, ... + i_cols_J1, i_cols_1, i_cols_T, i_cols_j, ... + M_.NNZDerivatives(1)); + maxerror = max(max(abs(residuals))); + end end diff --git a/matlab/solve_one_boundary.m b/matlab/solve_one_boundary.m index 304b81892851dbbbcbbd1fc3d0733b2e076762ce..8c3d8cca4947d5162be39308c85b7f18bbfd07f9 100644 --- a/matlab/solve_one_boundary.m +++ b/matlab/solve_one_boundary.m @@ -80,7 +80,7 @@ correcting_factor=0.01; ilu_setup.droptol=1e-10; max_resa=1e100; reduced = 0; -if(forward_backward) +if forward_backward incr = 1; start = y_kmin+1; finish = periods+y_kmin; @@ -89,140 +89,113 @@ else start = periods+y_kmin; finish = y_kmin+1; end -%lambda=1; + for it_=start:incr:finish cvg=0; iter=0; g1=spalloc( Blck_size, Blck_size, nze); - while ~(cvg==1 || iter>maxit_), - if(is_dynamic) - [r, y, g1, g2, g3] = feval(fname, y, x, params, steady_state, ... - it_, 0); + while ~(cvg==1 || iter>maxit_) + if is_dynamic + [r, y, g1, g2, g3] = feval(fname, y, x, params, steady_state, it_, 0); else [r, y, g1] = feval(fname, y, x, params); - end; - if(~isreal(r)) + end + if ~isreal(r) max_res=(-(max(max(abs(r))))^2)^0.5; else max_res=max(max(abs(r))); - end; - %['max_res=' num2str(max_res) ' Block_Num=' int2str(Block_Num) ' it_=' int2str(it_)] - %disp(['iteration : ' int2str(iter+1) ' => ' num2str(max_res) ' time = ' int2str(it_)]); - - % fjac = zeros(Blck_size, Blck_size); - % disp(['Blck_size=' int2str(Blck_size) ' it_=' int2str(it_)]); - % dh = max(abs(y(it_, y_index_eq)),options_.gstep*ones(1, Blck_size))*eps^(1/3); - % fvec = r; - % for j = 1:Blck_size - % ydh = y ; - % ydh(it_, y_index_eq(j)) = ydh(it_, y_index_eq(j)) + dh(j) ; - % [t, y1, g11, g21, g31]=feval(fname, ydh, x, params, it_, 0); - % fjac(:,j) = (t - fvec)./dh(j) ; - % end; - % diff = g1 -fjac; - % diff - % disp('g1'); - % disp([num2str(g1,'%4.5f')]); - % disp('fjac'); - % disp([num2str(fjac,'%4.5f')]); - % [c_max, i_c_max] = max(abs(diff)); - % [l_c_max, i_r_max] = max(c_max); - % disp(['maximum element row=' int2str(i_c_max(i_r_max)) ' and column=' int2str(i_r_max) ' value = ' num2str(l_c_max)]); - % equation = i_c_max(i_r_max); - % variable = i_r_max; - % variable - % mod(variable, Blck_size) - % disp(['equation ' int2str(equation) ' and variable ' int2str(y_index_eq(variable)) ' ' M_.endo_names(y_index_eq(variable), :)]); - % disp(['g1(' int2str(equation) ', ' int2str(variable) ')=' num2str(g1(equation, variable),'%3.10f') ' fjac(' int2str(equation) ', ' int2str(variable) ')=' num2str(fjac(equation, variable), '%3.10f') ' y(' int2str(it_) ', ' int2str(variable) ')=' num2str(y(it_, variable))]); - % %return; - % %g1 = fjac; - - - - - - if(verbose==1) - disp(['iteration : ' int2str(iter+1) ' => ' num2str(max_res) ' time = ' int2str(it_)]); - if(is_dynamic) - disp([M.endo_names(y_index_eq,:) num2str([y(it_,y_index_eq)' r g1])]); + end + if verbose==1 + disp(['iteration : ' int2str(iter+1) ' => ' num2str(max_res) ' time = ' int2str(it_)]) + if is_dynamic + disp([M.endo_names(y_index_eq,:) num2str([y(it_,y_index_eq)' r g1])]) else - disp([M.endo_names(y_index_eq,:) num2str([y(y_index_eq) r g1])]); - end; - end; - if(~isreal(max_res) || isnan(max_res)) + disp([M.endo_names(y_index_eq,:) num2str([y(y_index_eq) r g1])]) + end + end + if ~isreal(max_res) || isnan(max_res) cvg = 0; - elseif(is_linear && iter>0) + elseif is_linear && iter>0 cvg = 1; else cvg=(max_res<solve_tolf); - end; - if(~cvg) - if(iter>0) - if(~isreal(max_res) || isnan(max_res) || (max_resa<max_res && iter>1)) - if(isnan(max_res) || (max_resa<max_res && iter>0)) + end + if ~cvg + if iter>0 + if ~isreal(max_res) || isnan(max_res) || (max_resa<max_res && iter>1) + if isnan(max_res) || (max_resa<max_res && iter>0) detJ=det(g1a); if(abs(detJ)<1e-7) max_factor=max(max(abs(g1a))); ze_elem=sum(diag(g1a)<cutoff); - disp([num2str(full(ze_elem),'%d') ' elements on the Jacobian diagonal are below the cutoff (' num2str(cutoff,'%f') ')']); - if(correcting_factor<max_factor) + if verbose + disp([num2str(full(ze_elem),'%d') ' elements on the Jacobian diagonal are below the cutoff (' num2str(cutoff,'%f') ')']) + end + if correcting_factor<max_factor correcting_factor=correcting_factor*4; - disp(['The Jacobain matrix is singular, det(Jacobian)=' num2str(detJ,'%f') '.']); - disp([' trying to correct the Jacobian matrix:']); - disp([' correcting_factor=' num2str(correcting_factor,'%f') ' max(Jacobian)=' num2str(full(max_factor),'%f')]); + if verbose + disp(['The Jacobain matrix is singular, det(Jacobian)=' num2str(detJ,'%f') '.']) + disp([' trying to correct the Jacobian matrix:']) + disp([' correcting_factor=' num2str(correcting_factor,'%f') ' max(Jacobian)=' num2str(full(max_factor),'%f')]) + end dx = - r/(g1+correcting_factor*speye(Blck_size)); - %dx = -b'/(g1+correcting_factor*speye(Blck_size))-ya_save; y(it_,y_index_eq)=ya_save+lambda*dx; - continue; + continue else - disp('The singularity of the jacobian matrix could not be corrected'); + if verbose + disp('The singularity of the jacobian matrix could not be corrected') + end info = -Block_Num*10; - return; - end; - end; - elseif(lambda>1e-8) + return + end + end + elseif lambda>1e-8 lambda=lambda/2; reduced = 1; - disp(['reducing the path length: lambda=' num2str(lambda,'%f')]); - if(is_dynamic) + if verbose + disp(['reducing the path length: lambda=' num2str(lambda,'%f')]) + end + if is_dynamic y(it_,y_index_eq)=ya_save-lambda*dx; else y(y_index_eq)=ya_save-lambda*dx; - end; - continue; + end + continue else - if(cutoff == 0) - fprintf('Error in simul: Convergence not achieved in block %d, at time %d, after %d iterations.\n Increase "options_.simul.maxit".\n',Block_Num, it_, iter); - else - fprintf('Error in simul: Convergence not achieved in block %d, at time %d, after %d iterations.\n Increase "options_.simul.maxit" or set "cutoff=0" in model options.\n',Block_Num, it_, iter); - end; - if(is_dynamic) + if verbose + if cutoff==0 + fprintf('Error in simul: Convergence not achieved in block %d, at time %d, after %d iterations.\n Increase "options_.simul.maxit".\n',Block_Num, it_, iter); + else + fprintf('Error in simul: Convergence not achieved in block %d, at time %d, after %d iterations.\n Increase "options_.simul.maxit" or set "cutoff=0" in model options.\n',Block_Num, it_, iter); + end + end + if is_dynamic oo_.deterministic_simulation.status = 0; oo_.deterministic_simulation.error = max_res; oo_.deterministic_simulation.iterations = iter; oo_.deterministic_simulation.block(Block_Num).status = 0;% Convergency failed. oo_.deterministic_simulation.block(Block_Num).error = max_res; oo_.deterministic_simulation.block(Block_Num).iterations = iter; - end; + end info = -Block_Num*10; - return; - end; + return + end else - if(lambda<1) + if lambda<1 lambda=max(lambda*2, 1); - end; - end; - end; - if(is_dynamic) + end + end + end + if is_dynamic ya = y(it_,y_index_eq)'; else ya = y(y_index_eq); - end; + end ya_save=ya; g1a=g1; - if(~is_dynamic && options.solve_algo == 0) - if (verbose == 1) - disp('steady: fsolve'); + if ~is_dynamic && options.solve_algo==0 + if verbose + disp('steady: fsolve') end if ~isoctave if ~user_has_matlab_license('optimization_toolbox') @@ -248,31 +221,30 @@ for it_=start:incr:finish else yn = y(y_index_eq); exitval = 3; - end; + end end - y(y_index_eq) = yn; if exitval > 0 info = 0; else info = -Block_Num*10; end - elseif((~is_dynamic && options.solve_algo==2) || (is_dynamic && stack_solve_algo==4)) - if (verbose == 1 && ~is_dynamic) - disp('steady: LU + lnsrch1'); + elseif (~is_dynamic && options.solve_algo==2) || (is_dynamic && stack_solve_algo==4) + if verbose==1 && ~is_dynamic + disp('steady: LU + lnsrch1') end lambda=1; stpmx = 100 ; - if (is_dynamic) + if is_dynamic stpmax = stpmx*max([sqrt(ya'*ya);size(y_index_eq,2)]); else stpmax = stpmx*max([sqrt(ya'*ya);size(y_index_eq,2)]); - end; + end nn=1:size(y_index_eq,2); g = (r'*g1)'; f = 0.5*r'*r; p = -g1\r ; - if (is_dynamic) + if is_dynamic [ya,f,r,check]=lnsrch1(y(it_,:)',f,g,p,stpmax, ... 'lnsrch1_wrapper_one_boundary',nn, ... y_index_eq, y_index_eq, fname, y, x, params, steady_state, it_); @@ -281,126 +253,133 @@ for it_=start:incr:finish [ya,f,r,check]=lnsrch1(y,f,g,p,stpmax,fname,nn,y_index_eq,x, ... params, steady_state,0); dx = ya - y(y_index_eq); - end; - - if(is_dynamic) + end + if is_dynamic y(it_,:) = ya'; else y = ya'; - end; - elseif(~is_dynamic && options.solve_algo==3) - if (verbose == 1) - disp('steady: csolve'); + end + elseif ~is_dynamic && options.solve_algo==3 + if verbose==1 + disp('steady: csolve') end [yn,info] = csolve(@local_fname, y(y_index_eq),@ ... local_fname,1e-6,500, x, params, steady_state, y, y_index_eq, fname, 1); dx = ya - yn; y(y_index_eq) = yn; - elseif((stack_solve_algo==1 && is_dynamic) || (stack_solve_algo==0 && is_dynamic) || (~is_dynamic && (options.solve_algo==1 || options.solve_algo==6))), - if (verbose == 1 && ~is_dynamic) - disp('steady: Sparse LU '); + elseif (stack_solve_algo==1 && is_dynamic) || (stack_solve_algo==0 && is_dynamic) || (~is_dynamic && (options.solve_algo==1 || options.solve_algo==6)) + if verbose==1 && ~is_dynamic + disp('steady: Sparse LU ') end dx = g1\r; ya = ya - lambda*dx; - if(is_dynamic) + if is_dynamic y(it_,y_index_eq) = ya'; else y(y_index_eq) = ya; - end; - elseif((stack_solve_algo==2 && is_dynamic) || (options.solve_algo==7 && ~is_dynamic)), + end + elseif (stack_solve_algo==2 && is_dynamic) || (options.solve_algo==7 && ~is_dynamic) flag1=1; if isoctave error('SOLVE_ONE_BOUNDARY: you can''t use solve_algo=7 since GMRES is not implemented in Octave') end - if (verbose == 1 && ~is_dynamic) - disp('steady: GMRES '); + if verbose == 1 && ~is_dynamic + disp('steady: GMRES ') end - while(flag1>0) + while flag1>0 [L1, U1]=ilu(g1,ilu_setup); [dx,flag1] = gmres(g1,-r,Blck_size,1e-6,Blck_size,L1,U1); - if (flag1>0 || reduced) - if(flag1==1) - disp(['Error in simul: No convergence inside GMRES after ' num2str(iter,'%6d') ' iterations, in block' num2str(Block_Num,'%3d')]); - elseif(flag1==2) - disp(['Error in simul: Preconditioner is ill-conditioned, in block' num2str(Block_Num,'%3d')]); - elseif(flag1==3) - disp(['Error in simul: GMRES stagnated (Two consecutive iterates were the same.), in block' num2str(Block_Num,'%3d')]); - end; + if flag1>0 || reduced + if verbose + if flag1==1 + disp(['Error in simul: No convergence inside GMRES after ' num2str(iter,'%6d') ' iterations, in block' num2str(Block_Num,'%3d')]) + elseif(flag1==2) + disp(['Error in simul: Preconditioner is ill-conditioned, in block' num2str(Block_Num,'%3d')]) + elseif(flag1==3) + disp(['Error in simul: GMRES stagnated (Two consecutive iterates were the same.), in block' num2str(Block_Num,'%3d')]) + end + end ilu_setup.droptol = ilu_setup.droptol/10; reduced = 0; else ya = ya + lambda*dx; - if(is_dynamic) + if is_dynamic y(it_,y_index_eq) = ya'; else y(y_index_eq) = ya'; - end; - end; - end; - elseif((stack_solve_algo==3 && is_dynamic) || (options.solve_algo==8 && ~is_dynamic)), + end + end + end + elseif (stack_solve_algo==3 && is_dynamic) || (options.solve_algo==8 && ~is_dynamic) flag1=1; - if (verbose == 1 && ~is_dynamic) - disp('steady: BiCGStab'); + if verbose == 1 && ~is_dynamic + disp('steady: BiCGStab') end - while(flag1>0) + while flag1>0 [L1, U1]=ilu(g1,ilu_setup); phat = ya - U1 \ (L1 \ r); - if(is_dynamic) + if is_dynamic y(it_,y_index_eq) = phat; else y(y_index_eq) = phat; - end; - if(is_dynamic) + end + if is_dynamic [r, y, g1, g2, g3] = feval(fname, y, x, params, ... steady_state, it_, 0); else [r, y, g1] = feval(fname, y, x, params); - end; - if max(abs(r)) >= options.solve_tolf + end + if max(abs(r))>=options.solve_tolf [dx,flag1] = bicgstab(g1,-r,1e-7,Blck_size,L1,U1); else flag1 = 0; dx = phat - ya; - end; - if (flag1>0 || reduced) - if(flag1==1) - disp(['Error in simul: No convergence inside BICGSTAB after ' num2str(iter,'%6d') ' iterations, in block' num2str(Block_Num,'%3d')]); - elseif(flag1==2) - disp(['Error in simul: Preconditioner is ill-conditioned, in block' num2str(Block_Num,'%3d')]); - elseif(flag1==3) - disp(['Error in simul: GMRES stagnated (Two consecutive iterates were the same.), in block' num2str(Block_Num,'%3d')]); - end; + end + if flag1>0 || reduced + if verbose + if(flag1==1) + disp(['Error in simul: No convergence inside BICGSTAB after ' num2str(iter,'%6d') ' iterations, in block' num2str(Block_Num,'%3d')]) + elseif(flag1==2) + disp(['Error in simul: Preconditioner is ill-conditioned, in block' num2str(Block_Num,'%3d')]) + elseif(flag1==3) + disp(['Error in simul: GMRES stagnated (Two consecutive iterates were the same.), in block' num2str(Block_Num,'%3d')]) + end + end ilu_setup.droptol = ilu_setup.droptol/10; reduced = 0; else ya = ya + lambda*dx; - if(is_dynamic) + if is_dynamic y(it_,y_index_eq) = ya'; else y(y_index_eq) = ya'; - end; - end; - end; + end + end + end else - disp('unknown option : '); - if(is_dynamic) - disp(['options_.stack_solve_algo = ' num2str(stack_solve_algo) ' not implemented']); - else - disp(['options_.solve_algo = ' num2str(options.solve_algo) ' not implemented']); - end; + if verbose + disp('unknown option : ') + if is_dynamic + disp(['options_.stack_solve_algo = ' num2str(stack_solve_algo) ' not implemented']) + else + disp(['options_.solve_algo = ' num2str(options.solve_algo) ' not implemented']) + end + end info = -Block_Num*10; - return; - end; + return + end iter=iter+1; max_resa = max_res; end end if cvg==0 - if(cutoff == 0) - fprintf('Error in simul: Convergence not achieved in block %d, at time %d, after %d iterations.\n Increase "options_.simul.maxit\".\n',Block_Num, it_,iter); - else - fprintf('Error in simul: Convergence not achieved in block %d, at time %d, after %d iterations.\n Increase "options_.simul.maxit" or set "cutoff=0" in model options.\n',Block_Num, it_,iter); - end; + if verbose + if cutoff == 0 + fprintf('Error in simul: Convergence not achieved in block %d, at time %d, after %d iterations.\n Increase "options_.simul.maxit\".\n',Block_Num, it_,iter); + else + fprintf('Error in simul: Convergence not achieved in block %d, at time %d, after %d iterations.\n Increase "options_.simul.maxit" or set "cutoff=0" in model options.\n',Block_Num, it_,iter); + end + end if(is_dynamic) oo_.deterministic_simulation.status = 0; oo_.deterministic_simulation.error = max_res; @@ -410,10 +389,11 @@ for it_=start:incr:finish oo_.deterministic_simulation.block(Block_Num).iterations = iter; end; info = -Block_Num*10; - return; + return end end -if(is_dynamic) + +if is_dynamic info = 1; oo_.deterministic_simulation.status = 1; oo_.deterministic_simulation.error = max_res; @@ -423,12 +403,11 @@ if(is_dynamic) oo_.deterministic_simulation.block(Block_Num).iterations = iter; else info = 0; -end; -return; +end function [err, G]=local_fname(yl, x, params, steady_state, y, y_index_eq, fname, is_csolve) y(y_index_eq) = yl; [err, y, G] = feval(fname, y, x, params, steady_state, 0); if(is_csolve) G = full(G); -end; +end \ No newline at end of file diff --git a/matlab/solve_two_boundaries.m b/matlab/solve_two_boundaries.m index cddc8f2da14f76021559165b1143c65e3b00925a..cf00fdacb359b74d33a02e08b0edd27249e249bf 100644 --- a/matlab/solve_two_boundaries.m +++ b/matlab/solve_two_boundaries.m @@ -63,6 +63,8 @@ function [y, oo]= solve_two_boundaries(fname, y, x, params, steady_state, y_inde % You should have received a copy of the GNU General Public License % along with Dynare. If not, see <http://www.gnu.org/licenses/>. +verbose = options.verbosity; + cvg=0; iter=0; Per_u_=0; @@ -80,7 +82,7 @@ max_resa=1e100; Jacobian_Size=Blck_size*(y_kmin+y_kmax_l +periods); g1=spalloc( Blck_size*periods, Jacobian_Size, nze*periods); reduced = 0; -while ~(cvg==1 || iter>maxit_), +while ~(cvg==1 || iter>maxit_) [r, y, g1, g2, g3, b]=feval(fname, y, x, params, steady_state, periods, 0, y_kmin, Blck_size,options.periods); preconditioner = 2; g1a=g1(:, y_kmin*Blck_size+1:(periods+y_kmin)*Blck_size); @@ -88,83 +90,86 @@ while ~(cvg==1 || iter>maxit_), term2 = g1(:, (periods+y_kmin_l)*Blck_size+1:(periods+y_kmin_l+y_kmax_l)*Blck_size)*reshape(y(periods+y_kmin+1:periods+y_kmin+y_kmax_l,y_index)',1,y_kmax_l*Blck_size)'; b = b - term1 - term2; [max_res, max_indx]=max(max(abs(r'))); - if(~isreal(r)) + if ~isreal(r) max_res = (-max_res^2)^0.5; end; - % if(~isreal(r)) - % max_res=(-(max(max(abs(r))))^2)^0.5; - % else - % max_res=max(max(abs(r))); - % end; - if(~isreal(max_res) || isnan(max_res)) + if ~isreal(max_res) || isnan(max_res) cvg = 0; elseif(is_linear && iter>0) cvg = 1; else cvg=(max_res<solve_tolf); - end; - if(~cvg) - if(iter>0) - if(~isreal(max_res) || isnan(max_res) || (max_resa<max_res && iter>1)) - if(~isreal(max_res)) + end + if ~cvg + if iter>0 + if ~isreal(max_res) || isnan(max_res) || (max_resa<max_res && iter>1) + if verbose && ~isreal(max_res) disp(['Variable ' M.endo_names(max_indx,:) ' (' int2str(max_indx) ') returns an undefined value']); - end; - if(isnan(max_res)) + end + if isnan(max_res) detJ=det(g1aa); - if(abs(detJ)<1e-7) + if abs(detJ)<1e-7 max_factor=max(max(abs(g1aa))); ze_elem=sum(diag(g1aa)<cutoff); - disp([num2str(full(ze_elem),'%d') ' elements on the Jacobian diagonal are below the cutoff (' num2str(cutoff,'%f') ')']); - if(correcting_factor<max_factor) + if verbose + disp([num2str(full(ze_elem),'%d') ' elements on the Jacobian diagonal are below the cutoff (' num2str(cutoff,'%f') ')']); + end + if correcting_factor<max_factor correcting_factor=correcting_factor*4; - disp(['The Jacobain matrix is singular, det(Jacobian)=' num2str(detJ,'%f') '.']); - disp([' trying to correct the Jacobian matrix:']); - disp([' correcting_factor=' num2str(correcting_factor,'%f') ' max(Jacobian)=' num2str(full(max_factor),'%f')]); + if verbose + disp(['The Jacobain matrix is singular, det(Jacobian)=' num2str(detJ,'%f') '.']); + disp([' trying to correct the Jacobian matrix:']); + disp([' correcting_factor=' num2str(correcting_factor,'%f') ' max(Jacobian)=' num2str(full(max_factor),'%f')]); + end dx = (g1aa+correcting_factor*speye(periods*Blck_size))\ba- ya; y(1+y_kmin:periods+y_kmin,y_index)=reshape((ya_save+lambda*dx)',length(y_index),periods)'; continue; else disp('The singularity of the jacobian matrix could not be corrected'); - return; - end; - end; - elseif(lambda>1e-8) + return + end + end + elseif lambda>1e-8 lambda=lambda/2; reduced = 1; - disp(['reducing the path length: lambda=' num2str(lambda,'%f')]); + if verbose + disp(['reducing the path length: lambda=' num2str(lambda,'%f')]); + end y(1+y_kmin:periods+y_kmin,y_index)=reshape((ya_save+lambda*dx)',length(y_index),periods)'; - continue; + continue else - if(cutoff == 0) - fprintf('Error in simul: Convergence not achieved in block %d, after %d iterations.\n Increase "options_.simul.maxit".\n',Block_Num, iter); - else - fprintf('Error in simul: Convergence not achieved in block %d, after %d iterations.\n Increase "options_.simul.maxit" or set "cutoff=0" in model options.\n',Block_Num, iter); - end; + if verbose + if cutoff==0 + fprintf('Error in simul: Convergence not achieved in block %d, after %d iterations.\n Increase "options_.simul.maxit".\n',Block_Num, iter); + else + fprintf('Error in simul: Convergence not achieved in block %d, after %d iterations.\n Increase "options_.simul.maxit" or set "cutoff=0" in model options.\n',Block_Num, iter); + end + end oo.deterministic_simulation.status = 0; oo.deterministic_simulation.error = max_res; oo.deterministic_simulation.iterations = iter; oo.deterministic_simulation.block(Block_Num).status = 0;% Convergency failed. oo.deterministic_simulation.block(Block_Num).error = max_res; oo.deterministic_simulation.block(Block_Num).iterations = iter; - return; - end; + return + end else - if(lambda<1) + if lambda<1 lambda=max(lambda*2, 1); - end; - end; - end; + end + end + end ya = reshape(y(y_kmin+1:y_kmin+periods,y_index)',1,periods*Blck_size)'; ya_save=ya; g1aa=g1a; ba=b; max_resa=max_res; - if(stack_solve_algo==0), + if stack_solve_algo==0 dx = g1a\b- ya; ya = ya + lambda*dx; y(1+y_kmin:periods+y_kmin,y_index)=reshape(ya',length(y_index),periods)'; - elseif(stack_solve_algo==1), - for t=1:periods; + elseif stack_solve_algo==1 + for t=1:periods first_elem = (t-1)*Blck_size+1; last_elem = t*Blck_size; next_elem = (t+1)*Blck_size; @@ -177,19 +182,19 @@ while ~(cvg==1 || iter>maxit_), g1a(Elem, Elem_1) = S1; b(Elem) = B1_inv * b(Elem); g1a(Elem, Elem) = ones(Blck_size, Blck_size); - if (t < periods) + if t<periods g1a(Elem_1, Elem_1) = g1a(Elem_1, Elem_1) - g1a(Elem_1, Elem) * S1; b(Elem_1) = b(Elem_1) - g1a(Elem_1, Elem) * b(Elem); g1a(Elem_1, Elem) = zeros(Blck_size, Blck_size); - end; - end; + end + end za = b(Elem); zaa = za; y_Elem = (periods - 1) * Blck_size + 1:(periods) * Blck_size; dx = ya; dx(y_Elem) = za - ya(y_Elem); ya(y_Elem) = ya(y_Elem) + lambda*dx(y_Elem); - for t=periods-1:-1:1; + for t=periods-1:-1:1 first_elem = (t-1)*Blck_size+1; last_elem = t*Blck_size; next_elem = (t+1)*Blck_size; @@ -201,29 +206,29 @@ while ~(cvg==1 || iter>maxit_), dx(y_Elem) = za - ya(y_Elem); ya(y_Elem) = ya(y_Elem) + lambda*dx(y_Elem); y(y_kmin + t, y_index) = ya(y_Elem); - end; - elseif(stack_solve_algo==2), + end + elseif stack_solve_algo==2 flag1=1; - while(flag1>0) - if preconditioner == 2 + while flag1>0 + if preconditioner==2 [L1, U1]=ilu(g1a,ilu_setup); - elseif preconditioner == 3 + elseif preconditioner==3 Size = Blck_size; - gss1 = g1a(Size + 1: 2*Size,Size + 1: 2*Size) + g1a(Size + 1: 2*Size,2*Size+1: 3*Size); - [L1, U1]=lu(gss1); - L(1:Size,1:Size) = L1; - U(1:Size,1:Size) = U1; - gss2 = g1a(Size + 1: 2*Size,1: Size) + g1a(Size + 1: 2*Size,Size+1: 2*Size) + g1a(Size + 1: 2*Size,2*Size+1: 3*Size); - [L2, U2]=lu(gss2); - L(Size+1:(periods-1)*Size,Size+1:(periods-1)*Size) = kron(eye(periods-2), L2); - U(Size+1:(periods-1)*Size,Size+1:(periods-1)*Size) = kron(eye(periods-2), U2); - gss2 = g1a(Size + 1: 2*Size,1: Size) + g1a(Size + 1: 2*Size,Size+1: 2*Size); - [L3, U3]=lu(gss2); - L((periods-1)*Size+1:periods*Size,(periods-1)*Size+1:periods*Size) = L3; - U((periods-1)*Size+1:periods*Size,(periods-1)*Size+1:periods*Size) = U3; - L1 = L; - U1 = U; - elseif preconditioner == 4 + gss1 = g1a(Size + 1: 2*Size,Size + 1: 2*Size) + g1a(Size + 1: 2*Size,2*Size+1: 3*Size); + [L1, U1]=lu(gss1); + L(1:Size,1:Size) = L1; + U(1:Size,1:Size) = U1; + gss2 = g1a(Size + 1: 2*Size,1: Size) + g1a(Size + 1: 2*Size,Size+1: 2*Size) + g1a(Size + 1: 2*Size,2*Size+1: 3*Size); + [L2, U2]=lu(gss2); + L(Size+1:(periods-1)*Size,Size+1:(periods-1)*Size) = kron(eye(periods-2), L2); + U(Size+1:(periods-1)*Size,Size+1:(periods-1)*Size) = kron(eye(periods-2), U2); + gss2 = g1a(Size + 1: 2*Size,1: Size) + g1a(Size + 1: 2*Size,Size+1: 2*Size); + [L3, U3]=lu(gss2); + L((periods-1)*Size+1:periods*Size,(periods-1)*Size+1:periods*Size) = L3; + U((periods-1)*Size+1:periods*Size,(periods-1)*Size+1:periods*Size) = U3; + L1 = L; + U1 = U; + elseif preconditioner==4 Size = Blck_size; gss1 = g1a(1: 3*Size, 1: 3*Size); [L, U] = lu(gss1); @@ -231,31 +236,33 @@ while ~(cvg==1 || iter>maxit_), U1 = kron(eye(ceil(periods/3)),U); L1 = L1(1:periods * Size, 1:periods * Size); U1 = U1(1:periods * Size, 1:periods * Size); - end; + end [za,flag1] = gmres(g1a,b,Blck_size,1e-6,Blck_size*periods,L1,U1); if (flag1>0 || reduced) - if(flag1==1) - disp(['Error in simul: No convergence inside GMRES after ' num2str(periods*10,'%6d') ' iterations, in block ' num2str(Blck_size,'%3d')]); - elseif(flag1==2) - disp(['Error in simul: Preconditioner is ill-conditioned, in block ' num2str(Blck_size,'%3d')]); - elseif(flag1==3) - disp(['Error in simul: GMRES stagnated (Two consecutive iterates were the same.), in block ' num2str(Blck_size,'%3d')]); - end; + if verbose + if flag1==1 + disp(['Error in simul: No convergence inside GMRES after ' num2str(periods*10,'%6d') ' iterations, in block ' num2str(Blck_size,'%3d')]); + elseif flag1==2 + disp(['Error in simul: Preconditioner is ill-conditioned, in block ' num2str(Blck_size,'%3d')]); + elseif flag1==3 + disp(['Error in simul: GMRES stagnated (Two consecutive iterates were the same.), in block ' num2str(Blck_size,'%3d')]); + end + end ilu_setup.droptol = ilu_setup.droptol/10; reduced = 0; else dx = za - ya; ya = ya + lambda*dx; y(1+y_kmin:periods+y_kmin,y_index)=reshape(ya',length(y_index),periods)'; - end; - end; - elseif(stack_solve_algo==3), + end + end + elseif stack_solve_algo==3 flag1=1; - while(flag1>0) - if preconditioner == 2 + while flag1>0 + if preconditioner==2 [L1, U1]=ilu(g1a,ilu_setup); [za,flag1] = bicgstab(g1a,b,1e-7,Blck_size*periods,L1,U1); - elseif (preconditioner == 3) + elseif preconditioner==3 Size = Blck_size; gss0 = g1a(Size + 1: 2*Size,1: Size) + g1a(Size + 1: 2*Size,Size+1: 2*Size) + g1a(Size + 1: 2*Size,2*Size+1: 3*Size); [L1, U1]=lu(gss0); @@ -273,24 +280,26 @@ while ~(cvg==1 || iter>maxit_), L1 = kron(eye(periods),L1); U1 = kron(eye(periods),U1); [za,flag1] = bicgstab(g1a,b,1e-7,Blck_size*periods,L1,U1); - end; - if (flag1>0 || reduced) - if(flag1==1) - disp(['Error in simul: No convergence inside BICGSTAB after ' num2str(periods*10,'%6d') ' iterations, in block ' num2str(Blck_size,'%3d')]); - elseif(flag1==2) - disp(['Error in simul: Preconditioner is ill-conditioned, in block ' num2str(Blck_size,'%3d')]); - elseif(flag1==3) - disp(['Error in simul: GMRES stagnated (Two consecutive iterates were the same.), in block ' num2str(Blck_size,'%3d')]); - end; + end + if flag1>0 || reduced + if verbose + if flag1==1 + disp(['Error in simul: No convergence inside BICGSTAB after ' num2str(periods*10,'%6d') ' iterations, in block ' num2str(Blck_size,'%3d')]); + elseif flag1==2 + disp(['Error in simul: Preconditioner is ill-conditioned, in block ' num2str(Blck_size,'%3d')]); + elseif flag1==3 + disp(['Error in simul: GMRES stagnated (Two consecutive iterates were the same.), in block ' num2str(Blck_size,'%3d')]); + end + end ilu_setup.droptol = ilu_setup.droptol/10; reduced = 0; else dx = za - ya; ya = ya + lambda*dx; y(1+y_kmin:periods+y_kmin,y_index)=reshape(ya',length(y_index),periods)'; - end; - end; - elseif(stack_solve_algo==4), + end + end + elseif stack_solve_algo==4 ra = reshape(r(:, y_kmin+1:periods+y_kmin),periods*Blck_size, 1); stpmx = 100 ; stpmax = stpmx*max([sqrt(ya'*ya);size(y_index,2)]); @@ -304,22 +313,28 @@ while ~(cvg==1 || iter>maxit_), end end iter=iter+1; - disp(['iteration: ' num2str(iter,'%d') ' error: ' num2str(max_res,'%e')]); -end; + if verbose + disp(['iteration: ' num2str(iter,'%d') ' error: ' num2str(max_res,'%e')]); + end +end + if (iter>maxit_) - disp(['No convergence after ' num2str(iter,'%4d') ' iterations in Block ' num2str(Block_Num,'%d')]); + if verbose + printline(41) + %disp(['No convergence after ' num2str(iter,'%4d') ' iterations in Block ' num2str(Block_Num,'%d')]) + end oo.deterministic_simulation.status = 0; oo.deterministic_simulation.error = max_res; oo.deterministic_simulation.iterations = iter; oo.deterministic_simulation.block(Block_Num).status = 0;% Convergency failed. oo.deterministic_simulation.block(Block_Num).error = max_res; oo.deterministic_simulation.block(Block_Num).iterations = iter; - return; + return end + oo.deterministic_simulation.status = 1; oo.deterministic_simulation.error = max_res; oo.deterministic_simulation.iterations = iter; oo.deterministic_simulation.block(Block_Num).status = 1;% Convergency obtained. oo.deterministic_simulation.block(Block_Num).error = max_res; -oo.deterministic_simulation.block(Block_Num).iterations = iter; -return; +oo.deterministic_simulation.block(Block_Num).iterations = iter; \ No newline at end of file diff --git a/preprocessor/DynamicModel.cc b/preprocessor/DynamicModel.cc index f4efef49b893894bb0db0dd287a4d5029a293a62..645fa6469322bf1d413d898da7bc49100408999f 100644 --- a/preprocessor/DynamicModel.cc +++ b/preprocessor/DynamicModel.cc @@ -1912,9 +1912,11 @@ DynamicModel::writeSparseDynamicMFile(const string &dynamic_basename, const stri << " else" << endl << " mthd='UNKNOWN';" << endl << " end;" << endl - << " disp (['-----------------------------------------------------']) ;" << endl - << " disp (['MODEL SIMULATION: (method=' mthd ')']) ;" << endl - << " fprintf('\\n') ;" << endl + << " if options_.verbosity" << endl + << " printline(41)" << endl + << " disp(sprintf('MODEL SIMULATION (method=%s):',mthd))" << endl + << " skipline()" << endl + << " end" << endl << " periods=options_.periods;" << endl << " maxit_=options_.simul.maxit;" << endl << " solve_tolf=options_.solve_tolf;" << endl @@ -1951,7 +1953,7 @@ DynamicModel::writeSparseDynamicMFile(const string &dynamic_basename, const stri mDynamicModelFile << " g1=[];g2=[];g3=[];\n"; mDynamicModelFile << " y=" << dynamic_basename << "_" << block + 1 << "(y, x, params, steady_state, 0, y_kmin, periods);\n"; mDynamicModelFile << " tmp = y(:,M_.block_structure.block(" << block + 1 << ").variable);\n"; - mDynamicModelFile << " if any(isnan(tmp) | isinf(tmp))\n"; + mDynamicModelFile << " if any(isnan(tmp) | isinf(tmp))\n"; mDynamicModelFile << " disp(['Inf or Nan value during the evaluation of block " << block <<"']);\n"; mDynamicModelFile << " return;\n"; mDynamicModelFile << " end;\n";