getDivGrad.jl 949 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. using LinearOperators
  2. using MatrixDepot
  3. function getDivGrad(n1,n2,n3)
  4. # D = getDivGrad(n1,n2,n3)
  5. # builds 3D divergence operator
  6. D1 = kron(speye(n3),kron(speye(n2),ddx(n1)))
  7. D2 = kron(speye(n3),kron(ddx(n2),speye(n1)))
  8. D3 = kron(ddx(n3),kron(speye(n2),speye(n1)))
  9. Div = [D1 D2 D3]
  10. return Div*Div'
  11. end
  12. function ddx(n)
  13. # generate 1D finite difference on staggered grid
  14. return d = spdiags(ones(n)*[-1 1],[0,1],n,n+1)
  15. end
  16. function spdiags(B,d,m,n)
  17. # A = spdiags(B,d,m,n)
  18. # creates a sparse matrix from its diagonals
  19. d = d[:]
  20. p = length(d)
  21. len = zeros(p+1,1)
  22. for k = 1:p
  23. len[k+1] = round.(Int,len[k]+length(max(1,1-d[k]):min(m,n-d[k])))
  24. end
  25. a = zeros(round.(Int,len[p+1]),3)
  26. for k = 1:p
  27. # Append new d[k]-th diagonal to compact form
  28. i = max(1,1-d[k]):min(m,n-d[k])
  29. a[(round.(Int,len[k])+1):round.(Int,len[k+1]),:] = [i i+d[k] B[i+(m>=n)*d[k],k]]
  30. end
  31. A = sparse(round.(Int,a[:,1]),round.(Int,a[:,2]),a[:,3],m,n)
  32. return A
  33. end