Mercurial > repos > public > sbplib
diff spdiagsVariablePeriodic.m @ 756:f891758ad7a4 feature/d1_staggered
Merge with feature/utux2d.
author | Martin Almquist <malmquist@stanford.edu> |
---|---|
date | Sat, 16 Jun 2018 14:30:45 -0700 |
parents | 50e77b15d841 |
children | 8c65ef13df89 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/spdiagsVariablePeriodic.m Sat Jun 16 14:30:45 2018 -0700 @@ -0,0 +1,42 @@ +function A = spdiagsVariablePeriodic(vals,diags) + % Creates an m x m periodic discretization matrix. + % vals - m x ndiags matrix of values + % diags - 1 x ndiags vector of the 'center diagonals' that vals end up on + % vals that are not on main diagonal are going to spill over to + % off-diagonal corners. + + default_arg('diags',0); + + [m, ~] = size(vals); + + A = sparse(m,m); + + for i = 1:length(diags) + + d = diags(i); + a = vals(:,i); + + % Sub-diagonals + if d < 0 + a_bulk = a(1+abs(d):end); + a_corner = a(1:1+abs(d)-1); + corner_diag = m-abs(d); + A = A + spdiagVariable(a_bulk, d); + A = A + spdiagVariable(a_corner, corner_diag); + + % Super-diagonals + elseif d > 0 + a_bulk = a(1:end-d); + a_corner = a(end-d+1:end); + corner_diag = -m + d; + A = A + spdiagVariable(a_bulk, d); + A = A + spdiagVariable(a_corner, corner_diag); + + % Main diagonal + else + A = A + spdiagVariable(a, 0); + end + + end + +end \ No newline at end of file