Skip to content

Extract Mesh VonMises Stresses #471

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
155 changes: 126 additions & 29 deletions Etabs_Adapter/CRUD/Read/Results/MeshResults.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ public IEnumerable<IResult> ReadResults(MeshResultRequest request, ActionConfig
CheckAndSetUpCases(request);
List<string> panelIds = CheckGetPanelIds(request);


switch (request.ResultType)
{
case MeshResultType.Forces:
Expand All @@ -73,6 +72,7 @@ public IEnumerable<IResult> ReadResults(MeshResultRequest request, ActionConfig
case MeshResultType.Stresses:
return ReadMeshStress(panelIds, cases, request.Smoothing, request.Layer);
case MeshResultType.VonMises:
return ReadMeshVonMises(panelIds, cases, request.Smoothing, request.Layer);
default:
Engine.Base.Compute.RecordError("Result extraction of type " + request.ResultType + " is not yet supported");
return new List<IResult>();
Expand All @@ -87,7 +87,6 @@ public IEnumerable<IResult> ReadResults(MeshResultRequest request, ActionConfig

private List<MeshResult> ReadMeshForce(List<string> panelIds, MeshResultSmoothingType smoothing)
{

switch (smoothing)
{
case MeshResultSmoothingType.BySelection:
Expand Down Expand Up @@ -130,7 +129,6 @@ private List<MeshResult> ReadMeshForce(List<string> panelIds, MeshResultSmoothin

for (int i = 0; i < panelIds.Count; i++)
{

List<MeshForce> forces = new List<MeshForce>();

int ret = m_model.Results.AreaForceShell(panelIds[i], itemTypeElm, ref resultCount, ref obj, ref elm,
Expand All @@ -142,7 +140,6 @@ private List<MeshResult> ReadMeshForce(List<string> panelIds, MeshResultSmoothin
int mode;
double timeStep;


if (stepType[j] == "Single Value" || stepNum.Length < j)
{
mode = 0;
Expand Down Expand Up @@ -218,9 +215,8 @@ private List<MeshResult> ReadMeshStress(List<string> panelIds, List<string> case

List<MeshResult> results = new List<MeshResult>();


if (smoothing == MeshResultSmoothingType.ByPanel)
Engine.Base.Compute.RecordWarning("Stress values have been smoothed outside the API by averaging all force values in each node");
Engine.Base.Compute.RecordWarning("Stress values have been smoothed outside the API by averaging all force values in each node.");

foreach (string caseName in cases)
{
Expand All @@ -230,14 +226,12 @@ private List<MeshResult> ReadMeshStress(List<string> panelIds, List<string> case

for (int i = 0; i < panelIds.Count; i++)
{

List<MeshStress> stressTop = new List<MeshStress>();
List<MeshStress> stressBot = new List<MeshStress>();
int ret = m_model.Results.AreaStressShell(panelIds[i], itemTypeElm, ref resultCount, ref obj, ref elm, ref pointElm, ref loadCase, ref stepType, ref stepNum, ref s11Top, ref s22Top, ref s12Top, ref sMaxTop, ref sMinTop, ref sAngTop, ref svmTop, ref s11Bot, ref s22Bot, ref s12Bot, ref sMaxBot, ref sMinBot, ref sAngBot, ref svmBot, ref s13Avg, ref s23Avg, ref sMaxAvg, ref sAngAvg);

if (ret == 0)
{

for (int j = 0; j < resultCount; j++)
{
int mode;
Expand All @@ -250,7 +244,6 @@ private List<MeshResult> ReadMeshStress(List<string> panelIds, List<string> case
stressTop.Add(mStressTop);
}


if (smoothing == MeshResultSmoothingType.ByPanel)
{
stressTop = SmoothenStresses(stressTop);
Expand All @@ -267,8 +260,109 @@ private List<MeshResult> ReadMeshStress(List<string> panelIds, List<string> case
}
}
}
return results;
}

/***************************************************/

private List<MeshResult> ReadMeshVonMises(List<string> panelIds, List<string> cases, MeshResultSmoothingType smoothing, MeshResultLayer layer)
{
switch (smoothing)
{
case MeshResultSmoothingType.BySelection:
case MeshResultSmoothingType.Global:
case MeshResultSmoothingType.ByFiniteElementCentres:
Engine.Base.Compute.RecordWarning("Smoothing type not supported for MeshStress. No results extracted");
return new List<MeshResult>();
}

if (layer == MeshResultLayer.Upper || layer == MeshResultLayer.Lower)
{
Engine.Base.Compute.RecordWarning("Results for both bot and top layers will be extracted at the same time");
}
else
{
Engine.Base.Compute.RecordWarning("Stress extraction is currently only possible at bot and top layers. Please update the MeshResultLayer parameter.");
return new List<MeshResult>();
}

eItemTypeElm itemTypeElm = eItemTypeElm.ObjectElm;
int resultCount = 0;
string[] obj = null, elm = null;
string[] pointElm = null, loadCase = null, stepType = null;
double[] stepNum = null;
double[] s11Top = null, s22Top = null, s12Top = null, sMaxTop = null, sMinTop = null, sAngTop = null, svmTop = null;
double[] s11Bot = null, s22Bot = null, s12Bot = null, sMaxBot = null, sMinBot = null, sAngBot = null, svmBot = null;
double[] s13Avg = null, s23Avg = null, sMaxAvg = null, sAngAvg = null;
double[] f11 = null, f22 = null, f12 = null, fMax = null, fMin = null, fAngle = null, fvm = null;
double[] m11 = null, m22 = null, m12 = null, mMax = null, mMin = null, mAngle = null;
double[] v13 = null, v23 = null, vMax = null, vAngle=null;

List<MeshResult> results = new List<MeshResult>();

if (smoothing == MeshResultSmoothingType.ByPanel)
Engine.Base.Compute.RecordWarning("Stress values have been smoothed outside the API by averaging all force values in each node.");

foreach (string caseName in cases)
{
m_model.Results.Setup.DeselectAllCasesAndCombosForOutput();

if (!SetUpCaseOrCombo(caseName))
continue;

for (int i = 0; i < panelIds.Count; i++)
{
List<MeshVonMises> stressVMTop = new List<MeshVonMises>();
List<MeshVonMises> stressVMBot = new List<MeshVonMises>();
int ret1, ret2, ret3;

// Extract Von Mises Stresses
ret1= m_model.Results.AreaStressShell(panelIds[i], itemTypeElm, ref resultCount, ref obj, ref elm, ref pointElm,
ref loadCase, ref stepType, ref stepNum, ref s11Top, ref s22Top, ref s12Top, ref sMaxTop, ref sMinTop, ref sAngTop, ref svmTop,
ref s11Bot, ref s22Bot, ref s12Bot, ref sMaxBot, ref sMinBot, ref sAngBot, ref svmBot, ref s13Avg, ref s23Avg, ref sMaxAvg, ref sAngAvg);

// Extract Von Mises Resultant Axial Forces
ret2 = m_model.Results.AreaForceShell(panelIds[i], itemTypeElm, ref resultCount,
ref obj, ref elm, ref pointElm, ref loadCase, ref stepType, ref stepNum,
ref f11, ref f22, ref f12, ref fMax, ref fMin, ref fAngle, ref fvm,
ref m11, ref m22, ref m12, ref mMax, ref mMin, ref mAngle,
ref v13, ref v23, ref vMax, ref vAngle);

if ((ret1 == 0) && (ret2 == 0))
{
for (int j = 0; j < resultCount; j++)
{
int mode;
double timeStep;

GetStepAndMode(stepType[j], stepNum[j], out timeStep, out mode);
MeshVonMises mStressVMTop = new MeshVonMises(panelIds[i], pointElm[j], elm[j], loadCase[j], mode, timeStep,
MeshResultLayer.Upper, 1, MeshResultSmoothingType.None, oM.Geometry.Basis.XY, svmTop[j], fvm[j], double.NaN);
MeshVonMises mStressVMBot = new MeshVonMises(panelIds[i], pointElm[j], elm[j], loadCase[j], mode, timeStep,
MeshResultLayer.Lower, 0, MeshResultSmoothingType.None, oM.Geometry.Basis.XY, svmBot[j], fvm[j], double.NaN);

stressVMBot.Add(mStressVMBot);
stressVMTop.Add(mStressVMTop);
}

if (smoothing == MeshResultSmoothingType.ByPanel)
{
stressVMTop = SmoothenVonMisesStresses(stressVMTop);
stressVMBot = SmoothenVonMisesStresses(stressVMBot);
}

results.AddRange(GroupMeshResults(stressVMTop));
results.AddRange(GroupMeshResults(stressVMBot));

}
else
{
Engine.Base.Compute.RecordWarning("Failed to extract results for element " + panelIds[i] + " for case " + caseName);
}
}
}
return results;

}

/***************************************************/
Expand All @@ -291,10 +385,8 @@ private List<MeshResult> ReadMeshStressLayered(List<string> panelIds, MeshResult
string[] obj = null;
string[] elm = null;
string[] layer = null;

int[] intPtNb = null;
double[] layerPos = null;

string[] pointElm = null;
string[] loadCase = null;
string[] stepType = null;
Expand All @@ -306,19 +398,16 @@ private List<MeshResult> ReadMeshStressLayered(List<string> panelIds, MeshResult
double[] sMin = null;
double[] sAng = null;
double[] svm = null;

double[] s13 = null;
double[] s23 = null;
double[] sMaxAvg = null;
double[] sAngAvg = null;

List<MeshResult> results = new List<MeshResult>();


if (smoothing == MeshResultSmoothingType.ByPanel)
Engine.Base.Compute.RecordWarning("Stress values have been smoothened outside the API by averaging all force values in each node");


foreach (string caseName in cases)
{
m_model.Results.Setup.DeselectAllCasesAndCombosForOutput();
Expand All @@ -327,28 +416,20 @@ private List<MeshResult> ReadMeshStressLayered(List<string> panelIds, MeshResult

for (int i = 0; i < panelIds.Count; i++)
{

List<MeshStress> stresses = new List<MeshStress>();
int ret = m_model.Results.AreaStressShellLayered(panelIds[i], itemTypeElm, ref resultCount, ref obj, ref elm, ref layer, ref intPtNb, ref layerPos, ref pointElm, ref loadCase, ref stepType, ref stepNum, ref s11, ref s22, ref s12, ref sMax, ref sMin, ref sAng, ref svm, ref s13, ref s23, ref sMaxAvg, ref sAngAvg);

if (ret == 0)
{

for (int j = 0; j < resultCount - 1; j++)
{
int mode;
double timeStep;
GetStepAndMode(stepType[j], stepNum[j], out timeStep, out mode);
MeshStress mStress = new MeshStress(panelIds[i], pointElm[j], elm[j], loadCase[j], mode, timeStep, MeshResultLayer.Arbitrary, layerPos[j], MeshResultSmoothingType.None, oM.Geometry.Basis.XY, s11[j], s22[j], s12[j], s13[j], s23[j], sMax[j], sMin[j], sMaxAvg[j]);

stresses.Add(mStress);
}


if (smoothing == MeshResultSmoothingType.ByPanel)
{
stresses = SmoothenStresses(stresses);
}
stresses.Add(mStress);}

if (smoothing == MeshResultSmoothingType.ByPanel) stresses = SmoothenStresses(stresses);

results.AddRange(GroupMeshResults(stresses));
}
Expand All @@ -374,7 +455,6 @@ private List<MeshResult> ReadMeshDisplacement(List<string> panelIds, MeshResultS
string[] loadCase = null;
string[] stepType = null;
double[] stepNum = null;

double[] ux = null;
double[] uy = null;
double[] uz = null;
Expand All @@ -386,11 +466,8 @@ private List<MeshResult> ReadMeshDisplacement(List<string> panelIds, MeshResultS

for (int i = 0; i < panelIds.Count; i++)
{

List<MeshDisplacement> displacements = new List<MeshDisplacement>();

HashSet<string> ptNbs = new HashSet<string>();

int nbELem = 0;
string[] elemNames = new string[0];
m_model.AreaObj.GetElm(panelIds[i], ref nbELem, ref elemNames);
Expand Down Expand Up @@ -516,6 +593,26 @@ private List<MeshStress> SmoothenStresses(List<MeshStress> forces)

/***************************************************/

private List<MeshVonMises> SmoothenVonMisesStresses(List<MeshVonMises> forces)
{
List<MeshVonMises> smoothenedVMStresses = new List<MeshVonMises>();

foreach (IEnumerable<MeshVonMises> group in forces.GroupBy(x => new { x.ResultCase, x.TimeStep, x.NodeId }))
{
MeshVonMises first = group.First();

double s = group.Average(x => x.S);
double n = group.Average(x => x.N);

smoothenedVMStresses.Add(new MeshVonMises(first.ObjectId, first.NodeId, "", first.ResultCase, first.ModeNumber, first.TimeStep,
first.MeshResultLayer, first.LayerPosition, MeshResultSmoothingType.ByPanel, first.Orientation,s,n,double.NaN));
}

return smoothenedVMStresses;
}

/***************************************************/

}
}

Expand Down