| 177 | } |
| 178 | |
| 179 | void Laplacian::updateSolver() |
| 180 | { |
| 181 | if ( solver_ ) |
| 182 | return; |
| 183 | |
| 184 | MR_TIMER; |
| 185 | |
| 186 | const auto sz = freeVerts_.count(); |
| 187 | if ( sz <= 0 ) |
| 188 | return; |
| 189 | |
| 190 | fillVectorWithSeqNums( freeVerts_, freeVert2id_ ); |
| 191 | |
| 192 | assert( !fixedSharpVertices_.intersects( freeVerts_ ) ); |
| 193 | firstLayerFixedVerts_ = freeVerts_; |
| 194 | expand( topology_, firstLayerFixedVerts_ ); |
| 195 | firstLayerFixedVerts_ -= fixedSharpVertices_; |
| 196 | [[maybe_unused]] const auto numSmoothVerts = firstLayerFixedVerts_.count(); |
| 197 | firstLayerFixedVerts_ -= freeVerts_; |
| 198 | |
| 199 | std::vector< Eigen::Triplet<double> > mTriplets; |
| 200 | // equations for free vertices |
| 201 | int n = 0; |
| 202 | for ( auto v : freeVerts_ ) |
| 203 | { |
| 204 | assert( n == freeVert2id_[v] ); |
| 205 | int eqN = regionVert2id_[v]; |
| 206 | const auto eq = equations_[eqN]; |
| 207 | mTriplets.emplace_back( n, n, eq.centerCoeff ); |
| 208 | const auto lastElem = equations_[eqN+1].firstElem; |
| 209 | for ( int ei = eq.firstElem; ei < lastElem; ++ ei ) |
| 210 | { |
| 211 | const auto el = nonZeroElements_[ei]; |
| 212 | if ( freeVerts_.test( el.neiVert ) ) |
| 213 | mTriplets.emplace_back( n, freeVert2id_[el.neiVert], el.coeff ); |
| 214 | } |
| 215 | ++n; |
| 216 | } |
| 217 | |
| 218 | // equations for free neighbors of smooth fixed vertices |
| 219 | for ( auto v : firstLayerFixedVerts_ ) |
| 220 | { |
| 221 | int eqN = regionVert2id_[v]; |
| 222 | const auto eq = equations_[eqN]; |
| 223 | const auto lastElem = equations_[eqN+1].firstElem; |
| 224 | for ( int ei = eq.firstElem; ei < lastElem; ++ ei ) |
| 225 | { |
| 226 | const auto el = nonZeroElements_[ei]; |
| 227 | if ( freeVerts_.test( el.neiVert ) ) |
| 228 | mTriplets.emplace_back( n, freeVert2id_[el.neiVert], el.coeff ); |
| 229 | } |
| 230 | ++n; |
| 231 | } |
| 232 | |
| 233 | // equations for attractors |
| 234 | for ( const auto & a : attractors_ ) |
| 235 | { |
| 236 | const auto vs = a.p.getWeightedVerts( topology_ ); |
nothing calls this directly
no test coverage detected