Пример #1
0
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 
}
Пример #2
0
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;
}