Home > tt2 > exp > Fd_mtx.m

Fd_mtx

PURPOSE ^

Finite difference approximation of scalar diffusion equation in QTT

SYNOPSIS ^

function [M]=Fd_mtx(d, a, bound)

DESCRIPTION ^

Finite difference approximation of scalar diffusion equation in QTT
   [M]=FD_MTX(D, A, BOUND)
   Generate finite difference matrix from diffusion coefficient A(n,n) or A(n,n,n)
   M - n^D-by-n^D sparse matrix
   D - dimensions, 
   BOUND:
       0 - Dirichlet,
       1 - Neuman

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 
0002 
0003 function [M]=Fd_mtx(d, a, bound)
0004 %Finite difference approximation of scalar diffusion equation in QTT
0005 %   [M]=FD_MTX(D, A, BOUND)
0006 %   Generate finite difference matrix from diffusion coefficient A(n,n) or A(n,n,n)
0007 %   M - n^D-by-n^D sparse matrix
0008 %   D - dimensions,
0009 %   BOUND:
0010 %       0 - Dirichlet,
0011 %       1 - Neuman
0012 
0013 %
0014 %
0015 % TT-Toolbox 2.2, 2009-2012
0016 %
0017 %This is TT Toolbox, written by Ivan Oseledets et al.
0018 %Institute of Numerical Mathematics, Moscow, Russia
0019 %webpage: http://spring.inm.ras.ru/osel
0020 %
0021 %For all questions, bugs and suggestions please mail
0022 %ivan.oseledets@gmail.com
0023 %---------------------------
0024 
0025 
0026 n = size(a, 1)-2;
0027 if (d==1) 
0028   bar_a = zeros(n,3);
0029   for i=1:n
0030      
0031      bar_a(i,2)=(a(i+2)+2*a(i+1)+a(i))*0.25;
0032      bar_a(i,1)=(a(i)+a(i+1))*0.5;
0033      bar_a(i,3)=(a(i+1)+a(i+2))*0.5;
0034   end
0035   D1=2*eye(n)-diag(ones(n-1,1),1)-diag(ones(n-1,1),-1);
0036   %M=D1*(n+1)^2;
0037   M=D1;
0038   bar_a_M=spdiags(bar_a,[-1,0,1],n,n);
0039   M = M.*bar_a_M;
0040   return;
0041 end
0042 
0043 if (d==2)
0044     if (bound==0)
0045         bar_a = zeros(n^2, 5);
0046         for i=1:n
0047             for j=1:n
0048                 bar_a((i-1)*n+j, 3) = (a(i+1,j+1)+a(i+2,j+1)+a(i+1,j+2)+a(i+2,j+2))*0.25;
0049                 if (j>1) bar_a((i-1)*n+j-1, 2) = (a(i+1,j+1)+a(i+2,j+1))*0.5; end;
0050                 if (j<n) bar_a((i-1)*n+j+1, 4) = (a(i+1,j+2)+a(i+2,j+2))*0.5; end;
0051                 if (i>1) bar_a((i-1-1)*n+j, 1) = (a(i+1,j+1)+a(i+1,j+2))*0.5; end;
0052                 if (i<n) bar_a((i+1-1)*n+j, 5) = (a(i+2,j+1)+a(i+2,j+2))*0.5; end;
0053             end;
0054         end;
0055         D1 = spdiags(-1*ones(n,1), [-1], n, n)+spdiags(2*ones(n,1), [0], n, n)+spdiags(-1*ones(n,1), [1], n, n);
0056         M = kron(D1*(n+1)^2, speye(n))+kron(speye(n), D1*(n+1)^2);
0057         bar_a_M = spdiags(bar_a, [-n, -1, 0, 1, n], n^2, n^2);
0058         M = M.*bar_a_M;
0059     else
0060         wa = zeros(n+3,n+3);
0061         wa(1:n+2,1:n+2)=a;
0062         wa(n+3,1:n+2)=a(n+2,:);
0063         wa(1:n+2,n+3)=a(:,n+2);
0064         wa(n+3,n+3)=a(n+2,n+2);
0065         n = n+2;
0066         bar_a = zeros(n^2, 5);
0067         for i=1:n
0068             for j=1:n
0069                 bar_a((i-1)*n+j, 3) = (wa(i,j)+wa(i+1,j)+wa(i,j+1)+wa(i+1,j+1))*0.25;
0070                 if (j>1) bar_a((i-1)*n+j-1, 2) = (wa(i,j)+wa(i+1,j))*0.5; end;
0071                 if (j<n) bar_a((i-1)*n+j+1, 4) = (wa(i,j+1)+wa(i+1,j+1))*0.5; end;
0072                 if (i>1) bar_a((i-1-1)*n+j, 1) = (wa(i,j)+wa(i,j+1))*0.5; end;
0073                 if (i<n) bar_a((i+1-1)*n+j, 5) = (wa(i+1,j)+wa(i+1,j+1))*0.5; end;
0074             end;
0075         end;        
0076         D1 = spdiags(-1*ones(n,1), [-1], n, n)+spdiags(2*ones(n,1), [0], n, n)+spdiags(-1*ones(n,1), [1], n, n);
0077         D1(1,1)=1;
0078         D1(n,n)=1;
0079         M = kron(D1*(n-1)^2, speye(n))+kron(speye(n), D1*(n-1)^2);
0080         bar_a_M = spdiags(bar_a, [-n, -1, 0, 1, n], n^2, n^2);
0081         M = M.*bar_a_M;
0082     end;
0083 end;
0084 
0085 if (d==3)
0086     if (bound==0)
0087         bar_a = zeros(n^3, 7);
0088         wa=a;
0089         for i=1:n
0090             for j=1:n
0091                 for k=1:n
0092                     bar_a((i-1)*n^2+(j-1)*n+k, 4) = (wa(i+1,j+1,k+1)+wa(i+2,j+1,k+1)+wa(i+1,j+2,k+1)+wa(i+2,j+2,k+1)+wa(i+1,j+1,k+2)+wa(i+2,j+1,k+2)+wa(i+1,j+2,k+2)+wa(i+2,j+2,k+2))*0.125;
0093                     if (k>1) bar_a((i-1)*n^2+(j-1)*n+k-1, 3) = (wa(i+1,j+1,k+1)+wa(i+2,j+1,k+1)+wa(i+1,j+2,k+1)+wa(i+2,j+2,k+1))*0.25; end;
0094                     if (k<n) bar_a((i-1)*n^2+(j-1)*n+k+1, 5) = (wa(i+1,j+1,k+2)+wa(i+2,j+1,k+2)+wa(i+1,j+2,k+2)+wa(i+2,j+2,k+2))*0.25; end;
0095                     
0096                     if (j>1) bar_a((i-1)*n^2+(j-1-1)*n+k, 2) = (wa(i+1,j+1,k+1)+wa(i+2,j+1,k+1)+wa(i+1,j+1,k+2)+wa(i+2,j+1,k+2))*0.25; end;
0097                     if (j<n) bar_a((i-1)*n^2+(j+1-1)*n+k, 6) = (wa(i+1,j+2,k+1)+wa(i+2,j+2,k+1)+wa(i+1,j+2,k+2)+wa(i+2,j+2,k+2))*0.25; end;
0098                     
0099                     if (i>1) bar_a((i-1-1)*n^2+(j-1)*n+k, 1) = (wa(i+1,j+1,k+1)+wa(i+1,j+2,k+1)+wa(i+1,j+1,k+2)+wa(i+1,j+2,k+2))*0.25; end;
0100                     if (i<n) bar_a((i+1-1)*n^2+(j-1)*n+k, 7) = (wa(i+2,j+1,k+1)+wa(i+2,j+2,k+1)+wa(i+2,j+1,k+2)+wa(i+2,j+2,k+2))*0.25; end;                    
0101                 end;
0102             end;
0103         end;        
0104         D1 = spdiags(-1*ones(n,1), [-1], n, n)+spdiags(2*ones(n,1), [0], n, n)+spdiags(-1*ones(n,1), [1], n, n);
0105         M = kron(kron(D1*(n+1)^2, speye(n)), speye(n))+kron(kron(speye(n), D1*(n+1)^2), speye(n)) + kron(kron(speye(n), speye(n)), D1*(n+1)^2);
0106         bar_a_M = spdiags(bar_a, [-n^2, -n, -1, 0, 1, n, n^2], n^3, n^3);
0107         M = M.*bar_a_M;
0108     else
0109         wa = zeros(n+3,n+3,n+3);
0110         wa(1:n+2, 1:n+2, 1:n+2) = a;
0111         wa(n+3, 1:n+2, 1:n+2) = a(n+2, :, :);
0112         wa(1:n+2, n+3, 1:n+2) = a(:, n+2, :);
0113         wa(1:n+2, 1:n+2, n+3) = a(:, :, n+2);
0114         wa(1:n+2, n+3, n+3) = a(:, n+2, n+2);
0115         wa(n+3, 1:n+2, n+3) = a(n+2, :, n+2);
0116         wa(n+3, n+3, 1:n+2) = a(n+2, n+2, :);
0117         wa(n+3,n+3,n+3)=a(n+2,n+2,n+2);
0118         n = n+2;
0119         bar_a = zeros(n^3, 7);
0120         for i=1:n
0121             for j=1:n
0122                 for k=1:n
0123                     bar_a((i-1)*n^2+(j-1)*n+k, 4) = (wa(i,j,k)+wa(i+1,j,k)+wa(i,j+1,k)+wa(i+1,j+1,k)+wa(i,j,k+1)+wa(i+1,j,k+1)+wa(i,j+1,k+1)+wa(i+1,j+1,k+1))*0.125;
0124                     if (k>1) bar_a((i-1)*n^2+(j-1)*n+k-1, 3) = (wa(i,j,k)+wa(i+1,j,k)+wa(i,j+1,k)+wa(i+1,j+1,k))*0.25; end;
0125                     if (k<n) bar_a((i-1)*n^2+(j-1)*n+k+1, 5) = (wa(i,j,k+1)+wa(i+1,j,k+1)+wa(i,j+1,k+1)+wa(i+1,j+1,k+1))*0.25; end;
0126                     
0127                     if (j>1) bar_a((i-1)*n^2+(j-1-1)*n+k, 2) = (wa(i,j,k)+wa(i+1,j,k)+wa(i,j,k+1)+wa(i+1,j,k+1))*0.25; end;
0128                     if (j<n) bar_a((i-1)*n^2+(j+1-1)*n+k, 6) = (wa(i,j+1,k)+wa(i+1,j+1,k)+wa(i,j+1,k+1)+wa(i+1,j+1,k+1))*0.25; end;
0129                     
0130                     if (i>1) bar_a((i-1-1)*n^2+(j-1)*n+k, 1) = (wa(i,j,k)+wa(i,j+1,k)+wa(i,j,k+1)+wa(i,j+1,k+1))*0.25; end;
0131                     if (i<n) bar_a((i+1-1)*n^2+(j-1)*n+k, 7) = (wa(i+1,j,k)+wa(i+1,j+1,k)+wa(i+1,j,k+1)+wa(i+1,j+1,k+1))*0.25; end;                    
0132                 end;
0133             end;
0134         end;        
0135         D1 = spdiags(-1*ones(n,1), [-1], n, n)+spdiags(2*ones(n,1), [0], n, n)+spdiags(-1*ones(n,1), [1], n, n);
0136         D1(1,1)=1;
0137         D1(n,n)=1;
0138         M = kron(kron(D1*(n-1)^2, speye(n)), speye(n))+kron(kron(speye(n), D1*(n-1)^2), speye(n)) + kron(kron(speye(n), speye(n)), D1*(n-1)^2);
0139         bar_a_M = spdiags(bar_a, [-n^2, -n, -1, 0, 1, n, n^2], n^3, n^3);
0140         M = M.*bar_a_M;
0141     end;    
0142 end;
0143 
0144 end

Generated on Wed 08-Feb-2012 18:20:24 by m2html © 2005