| 166 | } |
| 167 | |
| 168 | ZSparseMatrix Assembler3D::getStiffnessMatrix() { |
| 169 | // Elastic modulii |
| 170 | Eigen::MatrixXd& D = m_D; |
| 171 | Eigen::MatrixXd& C = m_C; |
| 172 | |
| 173 | typedef Eigen::Triplet<double> T; |
| 174 | std::vector<T> triplets; |
| 175 | |
| 176 | for (size_t i=0; i<m_mesh->getNbrElements(); ++i) |
| 177 | { |
| 178 | VectorI idx = m_mesh->getElement(i); |
| 179 | assert(idx.size() == 4); |
| 180 | |
| 181 | Eigen::MatrixXd &dN = m_DN[i]; |
| 182 | |
| 183 | // Small strain-displacement matrix |
| 184 | // |
| 185 | Eigen::MatrixXd B(6,12); |
| 186 | B << dN(0,0),0.0,0.0,dN(1,0),0.0,0.0,dN(2,0),0.0,0.0,dN(3,0),0.0,0.0, |
| 187 | 0.0,dN(0,1),0.0,0.0,dN(1,1),0.0,0.0,dN(2,1),0.0,0.0,dN(3,1),0.0, |
| 188 | 0.0,0.0,dN(0,2),0.0,0.0,dN(1,2),0.0,0.0,dN(2,2),0.0,0.0,dN(3,2), |
| 189 | |
| 190 | 0.5*dN(0,1),0.5*dN(0,0),0.0, |
| 191 | 0.5*dN(1,1),0.5*dN(1,0),0.0, |
| 192 | 0.5*dN(2,1),0.5*dN(2,0),0.0, |
| 193 | 0.5*dN(3,1),0.5*dN(3,0),0.0, |
| 194 | |
| 195 | 0.5*dN(0,2),0.0,0.5*dN(0,0), |
| 196 | 0.5*dN(1,2),0.0,0.5*dN(1,0), |
| 197 | 0.5*dN(2,2),0.0,0.5*dN(2,0), |
| 198 | 0.5*dN(3,2),0.0,0.5*dN(3,0), |
| 199 | |
| 200 | 0.0,0.5*dN(0,2),0.5*dN(0,1), |
| 201 | 0.0,0.5*dN(1,2),0.5*dN(1,1), |
| 202 | 0.0,0.5*dN(2,2),0.5*dN(2,1), |
| 203 | 0.0,0.5*dN(3,2),0.5*dN(3,1); |
| 204 | |
| 205 | |
| 206 | Eigen::MatrixXd k_el = B.transpose() * D * C * B * m_mesh->getElementVolume(i); |
| 207 | |
| 208 | for (size_t j=0; j<4; ++j) |
| 209 | for (size_t k=0; k<4; ++k) |
| 210 | for (size_t l=0; l<3; ++l) |
| 211 | for (size_t m=0; m<3; ++m) |
| 212 | triplets.push_back(T(3*idx[j]+l, 3*idx[k]+m, k_el(3*j+l, 3*k+m))); |
| 213 | } |
| 214 | |
| 215 | Eigen::SparseMatrix<double> K = Eigen::SparseMatrix<double>(3*m_mesh->getNbrNodes(),3*m_mesh->getNbrNodes()); |
| 216 | K.setFromTriplets(triplets.begin(), triplets.end()); |
| 217 | return ZSparseMatrix(K); |
| 218 | } |
| 219 | |
| 220 | ZSparseMatrix Assembler3D::getLaplacianMatrix() { |
| 221 | typedef Eigen::Triplet<double> T; |
nothing calls this directly
no test coverage detected