| 183 | } |
| 184 | |
| 185 | ZSparseMatrix Assembler2D::getDisplacementStrainMatrix() { |
| 186 | typedef Eigen::Triplet<double> T; |
| 187 | std::vector<T> triplets; |
| 188 | |
| 189 | for (size_t i=0; i<m_mesh->getNbrElements(); i++) { |
| 190 | Eigen::MatrixXd dN = m_DN[i]; |
| 191 | VectorI idx = m_mesh->getElement(i); |
| 192 | assert(idx.size() == 3); |
| 193 | double V = m_mesh->getElementVolume(i); |
| 194 | |
| 195 | // e_xx |
| 196 | size_t row = i * 3; |
| 197 | for (size_t k=0; k<3; k++) { |
| 198 | triplets.push_back(T(row, idx[k]*2, dN(k,0))); |
| 199 | } |
| 200 | |
| 201 | // e_yy |
| 202 | row++; |
| 203 | for (size_t k=0; k<3; k++) { |
| 204 | triplets.push_back(T(row, idx[k]*2+1, dN(k,1))); |
| 205 | } |
| 206 | |
| 207 | // e_xy |
| 208 | row++; |
| 209 | for (size_t k=0; k<3; k++) { |
| 210 | triplets.push_back(T(row, idx[k]*2 , dN(k,1) / 2.0)); |
| 211 | triplets.push_back(T(row, idx[k]*2+1, dN(k,0) / 2.0)); |
| 212 | } |
| 213 | } |
| 214 | |
| 215 | Eigen::SparseMatrix<double> B = Eigen::SparseMatrix<double>(3*m_mesh->getNbrElements(), 2*m_mesh->getNbrNodes()); |
| 216 | B.setFromTriplets(triplets.begin(), triplets.end()); |
| 217 | return ZSparseMatrix(B); |
| 218 | } |
| 219 | |
| 220 | ZSparseMatrix Assembler2D::getStrainStressMatrix() { |
| 221 | typedef Eigen::Triplet<double> T; |
nothing calls this directly
no test coverage detected