diff --git a/RK-coeff-opt/nonlinear_constraints.m b/RK-coeff-opt/nonlinear_constraints.m index 7e64272..ce50440 100644 --- a/RK-coeff-opt/nonlinear_constraints.m +++ b/RK-coeff-opt/nonlinear_constraints.m @@ -6,7 +6,7 @@ % The input arguments are: % * :math:`x`: vector of the decision variables. See unpack_rk.m for details about % the order in which they are stored. -% * *class*: class of method to search ('erk' = explicit RK; 'irk' = implicit RK; 'dirk' = diagonally implicit RK; 'sdirk' = singly diagonally implicit RK; '2S', '3S', '2S*', '3S*' = low-storage formulations). +% * *class*: class of method to search ('erk' = explicit RK; 'irk' = implicit RK; 'dirk' = diagonally implicit RK; 'sdirk' = singly diagonally implicit RK; '2S', '3S', '2S*', '3S*', '2N' = low-storage formulations). % * :math:`s`:number of stages. % * :math:`p`: order of the RK scheme. % * *objective*: objective function ('ssp' = maximize SSP coefficient; 'acc' = minimize leading truncation error coefficient). diff --git a/RK-coeff-opt/rk_obj.m b/RK-coeff-opt/rk_obj.m index fdc5208..f77d2b1 100644 --- a/RK-coeff-opt/rk_obj.m +++ b/RK-coeff-opt/rk_obj.m @@ -5,7 +5,7 @@ % % Inputs: % * :math:`x`: vector of the unknowns. -% * class: class of method to search ('erk' = explicit RK; 'irk' = implicit RK; 'dirk' = diagonally implicit RK; 'sdirk' = singly diagonally implicit RK; '2S', '3S', '2S*', '3S*' = low-storage formulations). +% * *class*: class of method to search ('erk' = explicit RK; 'irk' = implicit RK; 'dirk' = diagonally implicit RK; 'sdirk' = singly diagonally implicit RK; '2S', '3S', '2S*', '3S*', '2N' = low-storage formulations). % * :math:`s`:number of stages. % * :math:`p`: order of the RK scheme. % * objective: objective function ('ssp' = maximize SSP coefficient; 'acc' = minimize leading truncation error coefficient). diff --git a/RK-coeff-opt/set_n.m b/RK-coeff-opt/set_n.m index 9c413a8..7cee535 100644 --- a/RK-coeff-opt/set_n.m +++ b/RK-coeff-opt/set_n.m @@ -34,6 +34,8 @@ n = 4*s - 3; case '3SstarembFSAL' %Low-storage 3S* embedded pairs of Ketcheson n = 4*s - 2; + case '2N' % Williamson + n = 2*s -1; %===================== % Multistep RK classes diff --git a/RK-coeff-opt/unpack_lsrk.m b/RK-coeff-opt/unpack_lsrk.m index ac0f70d..d6507cb 100644 --- a/RK-coeff-opt/unpack_lsrk.m +++ b/RK-coeff-opt/unpack_lsrk.m @@ -50,6 +50,27 @@ % gamma_{53} ... gamma_{s+1,3} delta_s delta_{s+1} delta_{s+2} ] delta =[1 X(s:2*s-3) X(end-3:end-1)]; betahat = X(end); + case '2N' + % n = 2s - 1 free parameters + s = (length(X)+1)/2; % # of stages + % for 2N methods: + % X = [A_2, A_3, ..., A_s, B_1, ..., B_s] + A_2N = [0 X(1:s-1)]; + B_2N = X(s:end); + K = zeros(s+1,s); + for i=1:s-1 + K(i,i+1) = B_2N(i); + for j = 2:s-i+1 + for k=0:j-1 + K(i+j,i) = K(i+j,i) + B_2N(i+k)*prod(A_2N(i+1:i+k)); + end + end + end + A = K(1:s,:); + b = K(s+1,:); b=b'; + c=sum(A,2); + alpha=zeros(s+1,s); beta=zeros(s+1,s); % Not yet implemented + end if strcmp(class(1:2),'2S') diff --git a/RK-coeff-opt/unpack_rk.m b/RK-coeff-opt/unpack_rk.m index d8f9238..308e2bf 100644 --- a/RK-coeff-opt/unpack_rk.m +++ b/RK-coeff-opt/unpack_rk.m @@ -88,6 +88,26 @@ % gamma_{53} ... gamma_{s+1,3} delta_s delta_{s+1} delta_{s+2} ] delta =[1 X(s:2*s-3) X(end-3:end-1)]; betahat = X(end); + case '2N' + % n = 2s - 1 free parameters + s = (length(X)+1)/2; % # of stages + % for 2N methods: + % X = [A_2, A_3, ..., A_s, B_1, ..., B_s] + A_2N = [0 X(1:s-1)]; + B_2N = X(s:end); + K = zeros(s+1,s); + for i=1:s-1 + K(i+1,i) = B_2N(i); + for j = 2:s-i+1 + for k=0:j-1 + K(i+j,i) = K(i+j,i) + B_2N(i+k)*prod(A_2N(i+1:i+k)); + end + end + end + A = K(1:s,:); + b = K(s+1,:); b=b'; + c=sum(A,2); + end