| 218 | } |
| 219 | |
| 220 | ZSparseMatrix Assembler3D::getLaplacianMatrix() { |
| 221 | typedef Eigen::Triplet<double> T; |
| 222 | std::vector<T> triplets; |
| 223 | |
| 224 | for (size_t i=0; i<m_mesh->getNbrElements(); ++i) |
| 225 | { |
| 226 | VectorI idx = m_mesh->getElement(i); |
| 227 | assert(idx.size() == 4); |
| 228 | |
| 229 | Eigen::MatrixXd &dN = m_DN[i]; |
| 230 | |
| 231 | // Small strain-displacement matrix |
| 232 | // B = grad u for approximation. |
| 233 | Eigen::MatrixXd B(3,4); |
| 234 | B << dN(0,0),dN(1,0), dN(2,0),dN(3,0), |
| 235 | dN(0,1),dN(1,1), dN(2,1),dN(3,1), |
| 236 | dN(0,2),dN(1,2), dN(2,2),dN(3,2); |
| 237 | |
| 238 | Eigen::MatrixXd k_el = B.transpose() * B * m_mesh->getElementVolume(i); |
| 239 | |
| 240 | for (size_t j=0; j<4; ++j) |
| 241 | for (size_t k=0; k<4; ++k) |
| 242 | triplets.push_back(T(idx[j],idx[k], k_el(j,k))); |
| 243 | } |
| 244 | |
| 245 | Eigen::SparseMatrix<double> L = Eigen::SparseMatrix<double>(m_mesh->getNbrNodes(),m_mesh->getNbrNodes()); |
| 246 | L.setFromTriplets(triplets.begin(), triplets.end()); |
| 247 | return ZSparseMatrix(L); |
| 248 | } |
| 249 | |
| 250 | ZSparseMatrix Assembler3D::getDisplacementStrainMatrix() { |
| 251 | typedef Eigen::Triplet<double> T; |
nothing calls this directly
no test coverage detected