SimuliaODB::SimuliaODB(std::string _fileName, HMesh& myHMesh, int _partId) : myHMesh(&myHMesh) { #ifdef SIMULIA_ODB_API myFileName = _fileName; myPartId = _partId; std::cout << ">> ODB Reader initialized for file " << myFileName << std::endl; odb_initializeAPI(); openFile(); myHMesh.hasParts = true; #endif #ifndef SIMULIA_ODB_API std::cout << ">> ODB Reader NOT initialized for file " << myFileName << std::endl; #endif }
bool FindStressFromODB(map<string, StructuralResults>& results) { cout << gPath << endl; if (gPath.find(".odb") == std::string::npos) { cout << "Invalid ODB file name!" << endl; return 0; } odb_initializeAPI(); odb_Odb& odb = openOdb(gPath.c_str(), true); bool isClosed = odb.isClosed(); // odb_String eType = "ALL ELEMENT"; odb_Assembly& assembly = odb.rootAssembly(); odb_Instance& instance = assembly.instances()["PART-1-1"]; map <string, string>::const_iterator ci = gElementSets.begin(); for (; ci != gElementSets.end(); ci++) { gFile << "[" << ci->first << ":" << ci->second << "]\n"; StructuralResults result; odb_Set& cadComponentElementSet = instance.elementSets()[ci->second.c_str()]; odb_StepRepository& sRep1 = odb.steps(); odb_StepRepositoryIT sIter1 (sRep1); float mises = 0, tresca = 0, press = 0, maxPrinciple = 0, minPrinciple = 0, midPrinciple = 0, maxInPlane = 0, minInPlane = 0, outPlane = 0, maxDisplacement = 0; for (sIter1.first(); !sIter1.isDone(); sIter1.next()) { odb_Step& step = sRep1[sIter1.currentKey()]; cout<<"Processing Step: "<<step.name().CStr()<<endl; //file<<"\nProcessing Step: "<<step.name().CStr()<<"\n"; odb_SequenceFrame& frameSequence = step.frames(); int numFrames = frameSequence.size(); odb_Frame& frame = frameSequence[numFrames-1]; // last frame //file << "Frame - " << " Description[" << frame.description().CStr() << "] LoadCase[" << frame.loadCase().name().CStr() << "]\n"; // GETTING STRESS VALUES odb_FieldOutput& fieldOutput = frame.fieldOutputs()[STRESS_COMP]; //cout<< " Total StressField:" << fieldOutput.values().size() << endl; odb_FieldOutput stressOutput = fieldOutput.getSubset(cadComponentElementSet); odb_SequenceInvariant invariants = stressOutput.validInvariants(); int invariantSize = invariants.size(); //file<< "ValidInvariants Size:" << invariantSize << "\n"; bool bmises = invariants.isMember(odb_Enum::MISES), btresca = invariants.isMember(odb_Enum::TRESCA), bpress = invariants.isMember(odb_Enum::PRESS), bmaxPrinciple = invariants.isMember(odb_Enum::MAX_PRINCIPAL), bminPrinciple = invariants.isMember(odb_Enum::MIN_PRINCIPAL), bmidPrinciple = invariants.isMember(odb_Enum::MID_PRINCIPAL), bmaxInPlane = invariants.isMember(odb_Enum::MAX_INPLANE_PRINCIPAL), bminInPlane = invariants.isMember(odb_Enum::MIN_INPLANE_PRINCIPAL), boutPlane = invariants.isMember(odb_Enum::OUTOFPLANE_PRINCIPAL); #if 0 file<<bmises << " " << btresca << " " << bpress << " " << bmaxPrinciple << " " << bminPrinciple << " " << bmidPrinciple << " " << bmaxInPlane << " " << bminInPlane << " " << boutPlane << "\n"; #endif const odb_SequenceFieldValue& seqVal = stressOutput.values(); int numValues = seqVal.size(); int totalValues = fieldOutput.values().size(); cout << "Stress Fields for ELSET[" << ci->second << "]: " << numValues << " TOTAL Stress Fields Size: " << totalValues << endl; result.hasMises = bmises; result.hasTresca = btresca; result.hasPress = bpress; for (int i = 0; i < numValues; i++) { float tmp = 0; const odb_FieldValue val = seqVal[i]; if (bmises) { tmp = val.mises(); //file<< "Mises: " << tmp; if (tmp > mises) mises = tmp; } tmp = 0; //file << " "; if (bpress) { tmp = val.press(); //file<< "Pressure: " << tmp; if (tmp > press) press = tmp; } tmp = 0; //file << " "; if (btresca) { tmp = val.tresca(); //file<< "Tresca: " << tmp; if (tmp > tresca) tresca = tmp; } tmp = 0; #if 0 //file << " "; if (bmaxPrinciple) { tmp = val.maxPrincipal(); //file<< "MaxPrinciple: " << tmp; if (tmp > maxPrinciple) maxPrinciple = tmp; } tmp = 0; //file << " "; if (bminPrinciple) { tmp = val.minPrincipal(); // file << "MinPrinciple: " << tmp; if (tmp < minPrinciple) minPrinciple = tmp; } tmp = 0; //file << " "; if (bmidPrinciple) { tmp = val.midPrincipal(); //file << "MidPrinciple: " << tmp; } tmp = 0; //file << " "; if (bmaxInPlane) { tmp = val.maxInPlanePrincipal(); //file << "MaxInPlane: " << tmp; file << tmp << "\n"; if (tmp > maxInPlane) maxInPlane = tmp; } tmp = 0; //file << " "; if (bminInPlane) { tmp = val.minInPlanePrincipal(); //file << "MinInPlane: " << tmp; if (tmp < minInPlane) minInPlane = tmp; } tmp = 0; //file << " "; if (boutPlane) { tmp = val.outOfPlanePrincipal(); // file << "OutOfPlane: " << tmp; } #endif //file<<"\n"; } // GETTING MAX DISPLACEMENT VALUE odb_FieldOutput& displacement_fieldOutput = frame.fieldOutputs()[DISP_COMP]; odb_FieldOutput displacementOutput = displacement_fieldOutput.getSubset(cadComponentElementSet); odb_SequenceInvariant displacementInvariants = displacementOutput.validInvariants(); invariantSize = displacementInvariants.size(); bool bMag = displacementInvariants.isMember(odb_Enum::MAGNITUDE); const odb_SequenceFieldValue& displacementVal= displacementOutput.values(); numValues = displacementVal.size(); result.hasDisplacement = bMag; for (int i = 0; i < numValues; i++) { float tmp = 0; const odb_FieldValue val = displacementVal[i]; if (bMag) { tmp = val.magnitude(); //file<< "MaxDisplacement: " << tmp; if (tmp > maxDisplacement) maxDisplacement = tmp; } } } //end step result.mises = mises; result.press = press; result.tresca = tresca; result.maxDisplacement = maxDisplacement; results[ci->first] = result; gFile<< "Mises Max: " << mises << " Tresca Max: " << tresca << " Press Max: " << press << "\n"; } // end elementSet return 1; }