+ improve abaqus exporter

This commit is contained in:
wmayer 2015-03-15 14:53:22 +01:00
parent 5d159f5cf3
commit b007bd19e4

View File

@ -49,6 +49,7 @@
#include "FemMesh.h"
#include <boost/assign/list_of.hpp>
#include <SMESH_Gen.hxx>
#include <SMESH_Mesh.hxx>
#include <SMDS_PolyhedralVolumeOfNodes.hxx>
@ -654,6 +655,69 @@ void FemMesh::read(const char *FileName)
void FemMesh::writeABAQUS(const std::string &Filename) const
{
static std::map<std::string, std::vector<int> > elemOrderMap;
static std::map<int, std::string> edgeTypeMap;
static std::map<int, std::string> faceTypeMap;
static std::map<int, std::string> volTypeMap;
if (elemOrderMap.empty()) {
// dimension 1
//
// FIXME: get the right order
std::vector<int> b31 = boost::assign::list_of(0)(1);
std::vector<int> 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<int> s3;
std::vector<int> s6;
std::vector<int> s4r;
std::vector<int> 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<int> c3d4 = boost::assign::list_of(0)(3)(1)(2);
//std::vector<int> c3d10 = boost::assign::list_of(0)(2)(1)(3)(6)(5)(4)(7)(9)(8);
std::vector<int> c3d4 = boost::assign::list_of(1)(0)(2)(3);
std::vector<int> c3d10 = boost::assign::list_of(1)(0)(2)(3)(4)(6)(5)(8)(7)(9);
// FIXME: get the right order
std::vector<int> c3d6;
std::vector<int> c3d8;
std::vector<int> c3d15;
std::vector<int> 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<int, std::vector<int> > NodesMap;
typedef std::map<std::string, NodesMap> 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<int> 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<int, std::string>::iterator it = volTypeMap.find(numNodes);
if (it != volTypeMap.end()) {
const std::vector<int>& order = elemOrderMap[it->second];
for (std::vector<int>::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<int>::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<int, std::vector<int> > apair;
apair.first = aFace->GetID();
int numNodes = aFace->NbNodes();
std::map<int, std::string>::iterator it = faceTypeMap.find(numNodes);
if (it != faceTypeMap.end()) {
const std::vector<int>& order = elemOrderMap[it->second];
for (std::vector<int>::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<int>::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<int, std::vector<int> > apair;
apair.first = aEdge->GetID();
int numNodes = aEdge->NbNodes();
std::map<int, std::string>::iterator it = edgeTypeMap.find(numNodes);
if (it != edgeTypeMap.end()) {
const std::vector<int>& order = elemOrderMap[it->second];
for (std::vector<int>::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<int>::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");
}