|
88 | 88 | function pointblock(A::SparseMatrixCSC,blocksize) |
89 | 89 | SparseMatrixCSC(pointblock(ExtendableSparseMatrix(A),blocksize)) |
90 | 90 | end |
| 91 | + |
| 92 | +""" |
| 93 | + mark_dirichlet(A; penalty=1.0e20) |
| 94 | +
|
| 95 | +Return boolean vector marking Dirichlet nodes, known by `A[i,i]>=penalty` |
| 96 | +""" |
| 97 | +function mark_dirichlet(A::SparseMatrixCSC; penalty=1.0e20) |
| 98 | + (;colptr,rowval,nzval,n)=A |
| 99 | + dirichlet=zeros(Bool,n) |
| 100 | + for i=1:n |
| 101 | + for j=colptr[i]:colptr[i+1]-1 |
| 102 | + if rowval[j]==i && nzval[j]>=penalty |
| 103 | + dirichlet[i]=true |
| 104 | + end |
| 105 | + end |
| 106 | + end |
| 107 | + dirichlet |
| 108 | +end |
| 109 | + |
| 110 | +""" |
| 111 | + eliminate_dirichlet!(A,dirichlet_marker) |
| 112 | +
|
| 113 | +Eliminate dirichlet nodes in matrix by setting |
| 114 | +```julia |
| 115 | + A[:,i]=0; A[i,:]=0; A[i,i]=1 |
| 116 | +``` |
| 117 | +for a node `i` marked as Dirichlet. |
| 118 | +
|
| 119 | +Returns A. |
| 120 | +""" |
| 121 | +function eliminate_dirichlet!(A::SparseMatrixCSC,dirichlet) |
| 122 | + (;colptr,rowval,nzval,n)=A |
| 123 | + for i=1:n |
| 124 | + # set off-diagonal column indiced to zero |
| 125 | + if !iszero(dirichlet[i]) |
| 126 | + for j=colptr[i]:colptr[i+1]-1 |
| 127 | + if rowval[j]==i |
| 128 | + nzval[j]=1 |
| 129 | + else |
| 130 | + nzval[j]=0 |
| 131 | + end |
| 132 | + end |
| 133 | + end |
| 134 | + # set off-diagonal row indices to zero |
| 135 | + for j=colptr[i]:colptr[i+1]-1 |
| 136 | + if rowval[j]!=i && !iszero(dirichlet[rowval[j]]) |
| 137 | + nzval[j]=0 |
| 138 | + end |
| 139 | + end |
| 140 | + end |
| 141 | + A |
| 142 | +end |
| 143 | + |
| 144 | +""" |
| 145 | + eliminate_dirichlet(A,dirichlet_marker) |
| 146 | +
|
| 147 | +Create a copy B of A sharing the sparsity pattern. |
| 148 | +Eliminate dirichlet nodes in B by setting |
| 149 | +```julia |
| 150 | + B[:,i]=0; B[i,:]=0; B[i,i]=1 |
| 151 | +``` |
| 152 | +for a node `i` marked as Dirichlet. |
| 153 | +
|
| 154 | +Returns B. |
| 155 | +""" |
| 156 | +function eliminate_dirichlet(A::SparseMatrixCSC,dirichlet) |
| 157 | + (;m,n,colptr,rowval,nzval)=A |
| 158 | + B=SparseMatrixCSC(m,n,colptr,rowval,copy(nzval)) |
| 159 | + eliminate_dirichlet!(B,dirichlet) |
| 160 | +end |
0 commit comments