diff --git a/Etabs_Adapter/CRUD/Read/Results/MeshResults.cs b/Etabs_Adapter/CRUD/Read/Results/MeshResults.cs index d04aca74..e94e105c 100644 --- a/Etabs_Adapter/CRUD/Read/Results/MeshResults.cs +++ b/Etabs_Adapter/CRUD/Read/Results/MeshResults.cs @@ -63,7 +63,6 @@ public IEnumerable ReadResults(MeshResultRequest request, ActionConfig CheckAndSetUpCases(request); List panelIds = CheckGetPanelIds(request); - switch (request.ResultType) { case MeshResultType.Forces: @@ -73,6 +72,7 @@ public IEnumerable 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(); @@ -87,7 +87,6 @@ public IEnumerable ReadResults(MeshResultRequest request, ActionConfig private List ReadMeshForce(List panelIds, MeshResultSmoothingType smoothing) { - switch (smoothing) { case MeshResultSmoothingType.BySelection: @@ -130,7 +129,6 @@ private List ReadMeshForce(List panelIds, MeshResultSmoothin for (int i = 0; i < panelIds.Count; i++) { - List forces = new List(); int ret = m_model.Results.AreaForceShell(panelIds[i], itemTypeElm, ref resultCount, ref obj, ref elm, @@ -142,7 +140,6 @@ private List ReadMeshForce(List panelIds, MeshResultSmoothin int mode; double timeStep; - if (stepType[j] == "Single Value" || stepNum.Length < j) { mode = 0; @@ -218,9 +215,8 @@ private List ReadMeshStress(List panelIds, List case List results = new List(); - 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) { @@ -230,14 +226,12 @@ private List ReadMeshStress(List panelIds, List case for (int i = 0; i < panelIds.Count; i++) { - List stressTop = new List(); List stressBot = new List(); 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; @@ -250,7 +244,6 @@ private List ReadMeshStress(List panelIds, List case stressTop.Add(mStressTop); } - if (smoothing == MeshResultSmoothingType.ByPanel) { stressTop = SmoothenStresses(stressTop); @@ -267,8 +260,109 @@ private List ReadMeshStress(List panelIds, List case } } } + return results; + } + + /***************************************************/ + + private List ReadMeshVonMises(List panelIds, List 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(); + } + + 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(); + } + + 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 results = new List(); + + 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 stressVMTop = new List(); + List stressVMBot = new List(); + 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; + } /***************************************************/ @@ -291,10 +385,8 @@ private List ReadMeshStressLayered(List 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; @@ -306,7 +398,6 @@ private List ReadMeshStressLayered(List panelIds, MeshResult double[] sMin = null; double[] sAng = null; double[] svm = null; - double[] s13 = null; double[] s23 = null; double[] sMaxAvg = null; @@ -314,11 +405,9 @@ private List ReadMeshStressLayered(List panelIds, MeshResult List results = new List(); - 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(); @@ -327,28 +416,20 @@ private List ReadMeshStressLayered(List panelIds, MeshResult for (int i = 0; i < panelIds.Count; i++) { - List stresses = new List(); 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)); } @@ -374,7 +455,6 @@ private List ReadMeshDisplacement(List panelIds, MeshResultS string[] loadCase = null; string[] stepType = null; double[] stepNum = null; - double[] ux = null; double[] uy = null; double[] uz = null; @@ -386,11 +466,8 @@ private List ReadMeshDisplacement(List panelIds, MeshResultS for (int i = 0; i < panelIds.Count; i++) { - List displacements = new List(); - HashSet ptNbs = new HashSet(); - int nbELem = 0; string[] elemNames = new string[0]; m_model.AreaObj.GetElm(panelIds[i], ref nbELem, ref elemNames); @@ -516,6 +593,26 @@ private List SmoothenStresses(List forces) /***************************************************/ + private List SmoothenVonMisesStresses(List forces) + { + List smoothenedVMStresses = new List(); + + foreach (IEnumerable 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; + } + + /***************************************************/ + } }