void NuTo::Structure::ElementCreate(int rElementNumber, int rInterpolationTypeId, const Eigen::VectorXi& rNodeNumbers, const Eigen::MatrixXd& rKnots, const Eigen::VectorXi& rKnotIDs) { // convert node numbers to pointer std::vector<NodeBase*> nodeVector; for (int iNode = 0; iNode < rNodeNumbers.rows(); iNode++) nodeVector.push_back(NodeGetNodePtr(rNodeNumbers(iNode))); boost::ptr_map<int, InterpolationType>::iterator itIterator = mInterpolationTypeMap.find(rInterpolationTypeId); if (itIterator == mInterpolationTypeMap.end()) throw NuTo::Exception(__PRETTY_FUNCTION__, "Interpolation type does not exist."); InterpolationType& interpolationType = *itIterator->second; if (not interpolationType.IsDof(Node::eDof::COORDINATES)) throw NuTo::Exception(__PRETTY_FUNCTION__, "COORDINATE interpolation required."); unsigned int numNodesCoordinates = interpolationType.Get(Node::eDof::COORDINATES).GetNumNodes(); if (numNodesCoordinates != nodeVector.size()) throw NuTo::Exception(__PRETTY_FUNCTION__, "COORDINATE interpolation requires " + std::to_string(numNodesCoordinates) + " nodes. " + std::to_string(nodeVector.size()) + " are provided."); interpolationType.ClearCache(); const auto& integrationType = *GetPtrIntegrationType(interpolationType.GetStandardIntegrationType()); ElementBase* ptrElement = nullptr; switch (interpolationType.GetShapeType()) { case NuTo::Interpolation::eShapeType::SPRING: throw NuTo::Exception(__PRETTY_FUNCTION__, "Element1DSpring currently not implemented."); break; case NuTo::Interpolation::eShapeType::TRUSS1D: case NuTo::Interpolation::eShapeType::TRUSSXD: case NuTo::Interpolation::eShapeType::TRIANGLE2D: case NuTo::Interpolation::eShapeType::QUAD2D: case NuTo::Interpolation::eShapeType::TETRAHEDRON3D: case NuTo::Interpolation::eShapeType::BRICK3D: case NuTo::Interpolation::eShapeType::INTERFACE: throw NuTo::Exception(__PRETTY_FUNCTION__, "Please use approriate functions for element creation, this is IGA implementation."); break; case NuTo::Interpolation::eShapeType::IGA1D: ptrElement = new ContinuumElementIGA<1>(nodeVector, rKnots, rKnotIDs, interpolationType, integrationType, GetDofStatus()); ptrElement->CheckElement(); break; case NuTo::Interpolation::eShapeType::IGA2D: ptrElement = new ContinuumElementIGA<2>(nodeVector, rKnots, rKnotIDs, interpolationType, integrationType, GetDofStatus()); ptrElement->CheckElement(); break; default: throw Exception(__PRETTY_FUNCTION__, "invalid dimension."); } mElementMap.insert(rElementNumber, ptrElement); }
void NuTo::Structure::ElementCreate(int rElementNumber, int rInterpolationTypeId, std::vector<NodeBase*> rNodes) { boost::ptr_map<int, InterpolationType>::iterator itIterator = mInterpolationTypeMap.find(rInterpolationTypeId); if (itIterator == mInterpolationTypeMap.end()) throw NuTo::Exception(__PRETTY_FUNCTION__, "Interpolation type does not exist."); InterpolationType& interpolationType = *itIterator->second; if (not interpolationType.IsDof(Node::eDof::COORDINATES)) throw NuTo::Exception(__PRETTY_FUNCTION__, "COORDINATE interpolation required."); unsigned int numNodesCoordinates = interpolationType.Get(Node::eDof::COORDINATES).GetNumNodes(); if (numNodesCoordinates != rNodes.size()) throw NuTo::Exception(__PRETTY_FUNCTION__, "COORDINATE interpolation requires " + std::to_string(numNodesCoordinates) + " nodes. " + std::to_string(rNodes.size()) + " are provided."); interpolationType.ClearCache(); const auto& integrationType = *GetPtrIntegrationType(interpolationType.GetStandardIntegrationType()); ElementBase* ptrElement = nullptr; switch (interpolationType.GetShapeType()) { case NuTo::Interpolation::eShapeType::SPRING: throw NuTo::Exception(__PRETTY_FUNCTION__, "Element1DSpring currently not implemented."); break; case NuTo::Interpolation::eShapeType::TRUSS1D: ptrElement = new ContinuumElement<1>(rNodes, interpolationType, integrationType, GetDofStatus()); ptrElement->CheckElement(); break; case NuTo::Interpolation::eShapeType::TRUSSXD: ptrElement = new Element1DInXD(rNodes, interpolationType, integrationType, GetDofStatus(), mDimension); ptrElement->CheckElement(); break; case NuTo::Interpolation::eShapeType::TRIANGLE2D: case NuTo::Interpolation::eShapeType::QUAD2D: ptrElement = new ContinuumElement<2>(rNodes, interpolationType, integrationType, GetDofStatus()); ptrElement->CheckElement(); break; case NuTo::Interpolation::eShapeType::TETRAHEDRON3D: case NuTo::Interpolation::eShapeType::BRICK3D: case NuTo::Interpolation::eShapeType::PRISM3D: ptrElement = new ContinuumElement<3>(rNodes, interpolationType, integrationType, GetDofStatus()); ptrElement->CheckElement(); break; case NuTo::Interpolation::eShapeType::INTERFACE: ptrElement = new Element2DInterface(rNodes, interpolationType, integrationType, mDimension); ptrElement->CheckElement(); break; case NuTo::Interpolation::eShapeType::IGA1D: throw NuTo::Exception( __PRETTY_FUNCTION__, "Please use the ElementCreate function for IGA elements, where the knot parameters are provided."); break; default: throw Exception(__PRETTY_FUNCTION__, "invalid dimension."); } mElementMap.insert(rElementNumber, ptrElement); }