Added calculation of Total Stress (ST)

Seems to work ok, but the nubers are not yet verified.
This commit is contained in:
Jacob Støren 2015-06-15 12:15:00 +02:00
parent e10bc01532
commit 33614b30bc
4 changed files with 87 additions and 42 deletions

View File

@ -56,7 +56,9 @@ public:
int elmId(size_t elementIdx) const { return m_elementId[elementIdx]; }
RigElementType elementType(size_t elementIdx) const { return m_elementTypes[elementIdx]; }
const int* connectivities(size_t elementIdx) const { return &m_allAlementConnectivities[m_elementConnectivityStartIndices[elementIdx]];}
size_t elementNodeResultIdx(int elementIdx, int elmLocalNodeIdx) const { return m_elementConnectivityStartIndices[elementIdx] + elmLocalNodeIdx;}
int nodeIdxFromElementNodeResultIdx(size_t elmNodeResultIdx) const { return m_allAlementConnectivities[elmNodeResultIdx]; }
RigFemPartNodes& nodes() {return m_nodes;}
const RigFemPartNodes& nodes() const {return m_nodes;}

View File

@ -27,6 +27,7 @@
#include "RigFemScalarResultFrames.h"
#include "RigStatisticsDataCache.h"
#include "RigFemPartResults.h"
#include "RigFemPartCollection.h"
#include "cafProgressInfo.h"
#include "cvfBoundingBox.h"
@ -40,11 +41,13 @@
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RigFemPartResultsCollection::RigFemPartResultsCollection(RifGeoMechReaderInterface* readerInterface, int partCount)
RigFemPartResultsCollection::RigFemPartResultsCollection(RifGeoMechReaderInterface* readerInterface, const RigFemPartCollection * femPartCollection)
{
CVF_ASSERT(readerInterface);
m_readerInterface = readerInterface;
m_femPartResults.resize(partCount);
m_femParts = femPartCollection;
m_femPartResults.resize(m_femParts->partCount());
std::vector<std::string> stepNames = m_readerInterface->stepNames();
for (int pIdx = 0; pIdx < static_cast<int>(m_femPartResults.size()); ++pIdx)
{
@ -62,44 +65,6 @@ RigFemPartResultsCollection::~RigFemPartResultsCollection()
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::map<std::string, std::vector<std::string> > RigFemPartResultsCollection::scalarFieldAndComponentNames(RigFemResultPosEnum resPos)
{
std::map<std::string, std::vector<std::string> > fieldCompNames;
if (m_readerInterface.notNull())
{
if (resPos == RIG_NODAL)
{
fieldCompNames = m_readerInterface->scalarNodeFieldAndComponentNames();
}
else if (resPos == RIG_ELEMENT_NODAL)
{
fieldCompNames = m_readerInterface->scalarElementNodeFieldAndComponentNames();
fieldCompNames["NS"].push_back("S11");
fieldCompNames["NS"].push_back("S22");
fieldCompNames["NS"].push_back("S33");
fieldCompNames["NS"].push_back("S12");
fieldCompNames["NS"].push_back("S13");
fieldCompNames["NS"].push_back("S23");
}
else if (resPos == RIG_INTEGRATION_POINT)
{
fieldCompNames = m_readerInterface->scalarIntegrationPointFieldAndComponentNames();
fieldCompNames["NS"].push_back("S11");
fieldCompNames["NS"].push_back("S22");
fieldCompNames["NS"].push_back("S33");
fieldCompNames["NS"].push_back("S12");
fieldCompNames["NS"].push_back("S13");
fieldCompNames["NS"].push_back("S23");
}
}
return fieldCompNames;
}
//--------------------------------------------------------------------------------------------------
/// Will always return a valid object, but it can be empty
//--------------------------------------------------------------------------------------------------
@ -170,6 +135,52 @@ RigFemScalarResultFrames* RigFemPartResultsCollection::findOrLoadScalarResult(in
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::map<std::string, std::vector<std::string> > RigFemPartResultsCollection::scalarFieldAndComponentNames(RigFemResultPosEnum resPos)
{
std::map<std::string, std::vector<std::string> > fieldCompNames;
if (m_readerInterface.notNull())
{
if (resPos == RIG_NODAL)
{
fieldCompNames = m_readerInterface->scalarNodeFieldAndComponentNames();
}
else if (resPos == RIG_ELEMENT_NODAL)
{
fieldCompNames = m_readerInterface->scalarElementNodeFieldAndComponentNames();
fieldCompNames["NS"].push_back("S11");
fieldCompNames["NS"].push_back("S22");
fieldCompNames["NS"].push_back("S33");
fieldCompNames["NS"].push_back("S12");
fieldCompNames["NS"].push_back("S13");
fieldCompNames["NS"].push_back("S23");
fieldCompNames["ST"].push_back("S11");
fieldCompNames["ST"].push_back("S22");
fieldCompNames["ST"].push_back("S33");
}
else if (resPos == RIG_INTEGRATION_POINT)
{
fieldCompNames = m_readerInterface->scalarIntegrationPointFieldAndComponentNames();
fieldCompNames["NS"].push_back("S11");
fieldCompNames["NS"].push_back("S22");
fieldCompNames["NS"].push_back("S33");
fieldCompNames["NS"].push_back("S12");
fieldCompNames["NS"].push_back("S13");
fieldCompNames["NS"].push_back("S23");
fieldCompNames["ST"].push_back("S11");
fieldCompNames["ST"].push_back("S22");
fieldCompNames["ST"].push_back("S33");
}
}
return fieldCompNames;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -196,6 +207,36 @@ RigFemScalarResultFrames* RigFemPartResultsCollection::calculateDerivedResult(in
return dstDataFrames;
}
if ( resVarAddr.fieldName == "ST"
&& (resVarAddr.componentName == "S11"
|| resVarAddr.componentName == "S22"
|| resVarAddr.componentName == "S33" ))
{
RigFemScalarResultFrames * srcNSDataFrames = this->findOrLoadScalarResult(partIndex, RigFemResultAddress(resVarAddr.resultPosType, "NS", resVarAddr.componentName));
RigFemScalarResultFrames * srcPORDataFrames = this->findOrLoadScalarResult(partIndex, RigFemResultAddress(RIG_NODAL, "POR", ""));
RigFemScalarResultFrames * dstDataFrames = m_femPartResults[partIndex]->createScalarResult(resVarAddr);
const RigFemPart * femPart = m_femParts->part(partIndex);
int frameCount = srcNSDataFrames->frameCount();
for (int fIdx = 0; fIdx < frameCount; ++fIdx)
{
const std::vector<float>& srcNSFrameData = srcNSDataFrames->frameData(fIdx);
const std::vector<float>& srcPORFrameData = srcPORDataFrames->frameData(fIdx);
std::vector<float>& dstFrameData = dstDataFrames->frameData(fIdx);
size_t valCount = srcNSFrameData.size();
dstFrameData.resize(valCount);
int nodeIdx = 0;
for (size_t vIdx = 0; vIdx < valCount; ++vIdx)
{
nodeIdx = femPart->nodeIdxFromElementNodeResultIdx(vIdx);
dstFrameData[vIdx] = srcNSFrameData[vIdx] + srcPORFrameData[nodeIdx];
}
}
return dstDataFrames;
}
return NULL;
}

View File

@ -31,11 +31,12 @@ class RigFemScalarResultFrames;
class RigFemPartResultsCollection;
class RigFemPartResults;
class RigStatisticsDataCache;
class RigFemPartCollection;
class RigFemPartResultsCollection: public cvf::Object
{
public:
RigFemPartResultsCollection(RifGeoMechReaderInterface* readerInterface, int partCount);
RigFemPartResultsCollection(RifGeoMechReaderInterface* readerInterface, const RigFemPartCollection * femPartCollection);
~RigFemPartResultsCollection();
std::map<std::string, std::vector<std::string> > scalarFieldAndComponentNames(RigFemResultPosEnum resPos);
@ -63,6 +64,7 @@ private:
friend class RigFemNativeStatCalc;
cvf::Collection<RigFemPartResults> m_femPartResults;
cvf::ref<RifGeoMechReaderInterface> m_readerInterface;
cvf::cref<RigFemPartCollection> m_femParts;
RigStatisticsDataCache* statistics(const RigFemResultAddress& resVarAddr);
std::vector< RigFemResultAddress> getResAddrToComponentsToRead(const RigFemResultAddress& resVarAddr);

View File

@ -104,7 +104,7 @@ bool RigGeoMechCaseData::openAndReadFemParts(std::string* errorMessage)
progress.setProgressDescription("Calculating element neighbors");
// Initialize results containers
m_femPartResultsColl = new RigFemPartResultsCollection(m_readerInterface.p(), m_femParts->partCount());
m_femPartResultsColl = new RigFemPartResultsCollection(m_readerInterface.p(), m_femParts.p());
// Calculate derived Fem data
for (int pIdx = 0; pIdx < m_femParts->partCount(); ++pIdx)