diff --git a/src/Mod/Fem/App/FemMesh.cpp b/src/Mod/Fem/App/FemMesh.cpp index 225bcfb886..a1faf8af73 100755 --- a/src/Mod/Fem/App/FemMesh.cpp +++ b/src/Mod/Fem/App/FemMesh.cpp @@ -49,6 +49,7 @@ #include "FemMesh.h" +#include #include #include #include @@ -654,6 +655,69 @@ void FemMesh::read(const char *FileName) void FemMesh::writeABAQUS(const std::string &Filename) const { + static std::map > elemOrderMap; + static std::map edgeTypeMap; + static std::map faceTypeMap; + static std::map volTypeMap; + if (elemOrderMap.empty()) { + // dimension 1 + // + // FIXME: get the right order + std::vector b31 = boost::assign::list_of(0)(1); + std::vector b32 = boost::assign::list_of(0)(1)(2); +#if 0 + elemOrderMap.insert(std::make_pair("B31", b31)); + edgeTypeMap.insert(std::make_pair(elemOrderMap["B31"].size(), "B31")); + elemOrderMap.insert(std::make_pair("B32", b32)); + edgeTypeMap.insert(std::make_pair(elemOrderMap["B32"].size(), "B32")); +#endif + + // dimension 2 + // + // FIXME: get the right order + std::vector s3; + std::vector s6; + std::vector s4r; + std::vector s8r; +#if 0 + elemOrderMap.insert(std::make_pair("S3", s3)); + faceTypeMap.insert(std::make_pair(elemOrderMap["S3"].size(), "S3")); + elemOrderMap.insert(std::make_pair("S6", s6)); + faceTypeMap.insert(std::make_pair(elemOrderMap["S6"].size(), "S6")); + elemOrderMap.insert(std::make_pair("S4R", s4r)); + faceTypeMap.insert(std::make_pair(elemOrderMap["S4R"].size(), "S4R")); + elemOrderMap.insert(std::make_pair("S8R", s8r)); + faceTypeMap.insert(std::make_pair(elemOrderMap["S8R"].size(), "S8R")); +#endif + + // dimension 3 + // + //std::vector c3d4 = boost::assign::list_of(0)(3)(1)(2); + //std::vector c3d10 = boost::assign::list_of(0)(2)(1)(3)(6)(5)(4)(7)(9)(8); + std::vector c3d4 = boost::assign::list_of(1)(0)(2)(3); + std::vector c3d10 = boost::assign::list_of(1)(0)(2)(3)(4)(6)(5)(8)(7)(9); + // FIXME: get the right order + std::vector c3d6; + std::vector c3d8; + std::vector c3d15; + std::vector c3d20; + + elemOrderMap.insert(std::make_pair("C3D4", c3d4)); + volTypeMap.insert(std::make_pair(elemOrderMap["C3D4"].size(), "C3D4")); + elemOrderMap.insert(std::make_pair("C3D10", c3d10)); + volTypeMap.insert(std::make_pair(elemOrderMap["C3D10"].size(), "C3D10")); +#if 0 + elemOrderMap.insert(std::make_pair("C3D6", c3d6)); + volTypeMap.insert(std::make_pair(elemOrderMap["C3D6"].size(), "C3D6")); + elemOrderMap.insert(std::make_pair("C3D8", c3d8)); + volTypeMap.insert(std::make_pair(elemOrderMap["C3D8"].size(), "C3D8")); + elemOrderMap.insert(std::make_pair("C3D15", c3d15)); + volTypeMap.insert(std::make_pair(elemOrderMap["C3D15"].size(), "C3D15")); + elemOrderMap.insert(std::make_pair("C3D20", c3d20)); + volTypeMap.insert(std::make_pair(elemOrderMap["C3D20"].size(), "C3D20")); +#endif + } + std::ofstream anABAQUS_Output; anABAQUS_Output.open(Filename.c_str()); anABAQUS_Output << "*Node, NSET=Nall" << std::endl; @@ -674,8 +738,10 @@ void FemMesh::writeABAQUS(const std::string &Filename) const typedef std::map > NodesMap; typedef std::map ElementsMap; - ElementsMap elementsMap; + + // add volumes + // SMDS_VolumeIteratorPtr aVolIter = myMesh->GetMeshDS()->volumesIterator(); while (aVolIter->more()) { const SMDS_MeshVolume* aVol = aVolIter->next(); @@ -683,34 +749,17 @@ void FemMesh::writeABAQUS(const std::string &Filename) const apair.first = aVol->GetID(); int numNodes = aVol->NbNodes(); - std::vector ids; - - // C3D4 - if (numNodes == 4) { - apair.second.push_back(aVol->GetNode(0)->GetID()); - apair.second.push_back(aVol->GetNode(3)->GetID()); - apair.second.push_back(aVol->GetNode(1)->GetID()); - apair.second.push_back(aVol->GetNode(2)->GetID()); - elementsMap["C3D4"].insert(apair); - } - // C3D10 - else if (numNodes == 10) { - apair.second.push_back(aVol->GetNode(0)->GetID()); - apair.second.push_back(aVol->GetNode(2)->GetID()); - apair.second.push_back(aVol->GetNode(1)->GetID()); - apair.second.push_back(aVol->GetNode(3)->GetID()); - apair.second.push_back(aVol->GetNode(6)->GetID()); - apair.second.push_back(aVol->GetNode(5)->GetID()); - apair.second.push_back(aVol->GetNode(4)->GetID()); - apair.second.push_back(aVol->GetNode(7)->GetID()); - apair.second.push_back(aVol->GetNode(9)->GetID()); - apair.second.push_back(aVol->GetNode(8)->GetID()); - elementsMap["C3D10"].insert(apair); + std::map::iterator it = volTypeMap.find(numNodes); + if (it != volTypeMap.end()) { + const std::vector& order = elemOrderMap[it->second]; + for (std::vector::const_iterator jt = order.begin(); jt != order.end(); ++jt) + apair.second.push_back(aVol->GetNode(*jt)->GetID()); + elementsMap[it->second].insert(apair); } } for (ElementsMap::iterator it = elementsMap.begin(); it != elementsMap.end(); ++it) { - anABAQUS_Output << "*Element, TYPE=" << it->first << ", ELSET=" << it->first << std::endl; + anABAQUS_Output << "*Element, TYPE=" << it->first << ", ELSET=Eall" << std::endl; for (NodesMap::iterator jt = it->second.begin(); jt != it->second.end(); ++jt) { anABAQUS_Output << jt->first << ", "; for (std::vector::iterator kt = jt->second.begin(); kt != jt->second.end(); ++kt) { @@ -719,6 +768,67 @@ void FemMesh::writeABAQUS(const std::string &Filename) const anABAQUS_Output << std::endl; } } + elementsMap.clear(); + + // add faces + // + SMDS_FaceIteratorPtr aFaceIter = myMesh->GetMeshDS()->facesIterator(); + while (aFaceIter->more()) { + const SMDS_MeshFace* aFace = aFaceIter->next(); + std::pair > apair; + apair.first = aFace->GetID(); + + int numNodes = aFace->NbNodes(); + std::map::iterator it = faceTypeMap.find(numNodes); + if (it != faceTypeMap.end()) { + const std::vector& order = elemOrderMap[it->second]; + for (std::vector::const_iterator jt = order.begin(); jt != order.end(); ++jt) + apair.second.push_back(aFace->GetNode(*jt)->GetID()); + elementsMap[it->second].insert(apair); + } + } + + for (ElementsMap::iterator it = elementsMap.begin(); it != elementsMap.end(); ++it) { + anABAQUS_Output << "*Element, TYPE=" << it->first << ", ELSET=Eall" << std::endl; + for (NodesMap::iterator jt = it->second.begin(); jt != it->second.end(); ++jt) { + anABAQUS_Output << jt->first << ", "; + for (std::vector::iterator kt = jt->second.begin(); kt != jt->second.end(); ++kt) { + anABAQUS_Output << *kt << ", "; + } + anABAQUS_Output << std::endl; + } + } + elementsMap.clear(); + + // add edges + // + SMDS_EdgeIteratorPtr aEdgeIter = myMesh->GetMeshDS()->edgesIterator(); + while (aEdgeIter->more()) { + const SMDS_MeshEdge* aEdge = aEdgeIter->next(); + std::pair > apair; + apair.first = aEdge->GetID(); + + int numNodes = aEdge->NbNodes(); + std::map::iterator it = edgeTypeMap.find(numNodes); + if (it != edgeTypeMap.end()) { + const std::vector& order = elemOrderMap[it->second]; + for (std::vector::const_iterator jt = order.begin(); jt != order.end(); ++jt) + apair.second.push_back(aEdge->GetNode(*jt)->GetID()); + elementsMap[it->second].insert(apair); + } + } + + for (ElementsMap::iterator it = elementsMap.begin(); it != elementsMap.end(); ++it) { + anABAQUS_Output << "*Element, TYPE=" << it->first << ", ELSET=Eall" << std::endl; + for (NodesMap::iterator jt = it->second.begin(); jt != it->second.end(); ++jt) { + anABAQUS_Output << jt->first << ", "; + for (std::vector::iterator kt = jt->second.begin(); kt != jt->second.end(); ++kt) { + anABAQUS_Output << *kt << ", "; + } + anABAQUS_Output << std::endl; + } + } + elementsMap.clear(); anABAQUS_Output.close(); } @@ -742,10 +852,10 @@ void FemMesh::write(const char *FileName) const // read brep-file myMesh->ExportDAT(File.filePath().c_str()); } - else if (File.hasExtension("inp") ) { - // write ABAQUS Output - writeABAQUS(File.filePath()); - } + else if (File.hasExtension("inp") ) { + // write ABAQUS Output + writeABAQUS(File.filePath()); + } else{ throw Base::Exception("Unknown extension"); }