private List <double> readUnknownTuplesizeNameSpecificCellDataArray(vtkUnstructuredGrid unstructuredGrid, string arrayName) { var dataArray = new List <double>(); var cellData = unstructuredGrid.GetCellData(); for (int i = 0; i < cellData.GetNumberOfArrays(); i++) { if (cellData.GetArrayName(i) != arrayName) { continue; } var numbComp = cellData.GetArray(i).GetNumberOfComponents(); for (int j = 0; j < cellData.GetArray(i).GetNumberOfTuples(); j++) { var tempTuple = cellData.GetArray(i).GetTuple(j); double[] managedArray = new double[numbComp]; Marshal.Copy(tempTuple, managedArray, 0, numbComp); dataArray.AddRange(managedArray); if (arrayName == "AllForcesBeam") //Modelo 6 iterates from 0-5 in all cell_vertexes to find the max and min forces (X,Y,Z,Mx,My,Mz) { calculateExtremeForces(managedArray, 6, CalculateMinForcesBeam, CalculateMaxForcesBeam); } if (arrayName == "AllForcesShell") //Modelo 8 iterates from 0-7 in all cell_vertexes to find the max and min value (Nx,Ny,Nz,Mx,My,Mz,Vzx,Vzy) { calculateExtremeForces(managedArray, 8, CalculateMinForcesShell, CalculateMaxForcesShell); } } } return(dataArray); }
public vtkDataArray getNameSpecificDataArrayCellData(vtkUnstructuredGrid unstructuredGrid, string arrayName) { vtkDataArray dataArray = null; var cellData = unstructuredGrid.GetCellData(); for (int i = 0; i < cellData.GetNumberOfArrays(); i++) { if (cellData.GetArrayName(i) != arrayName) { continue; } dataArray = cellData.GetArray(i); } return(dataArray); }
/// <summary> /// 左键释放时获取选择的对象 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void m_interactor_LeftButtonReleaseEvt(vtkObject sender, vtkObjectEventArgs e) { if (m_pickTarget == ePickTarget.None) { return; } //if (m_iren.GetControlKey() != 0) // m_pickBoolean = ePickBollean.Add; //else if (m_iren.GetShiftKey() != 0) // m_pickBoolean = ePickBollean.Sub; m_iren.GetEventPosition(ref endx, ref endy); #region 点选对象 if (m_pickMode == ePickMode.DotPickMode) //如果是点选模式 { vtkCellPicker cellPicker = new vtkCellPicker(); cellPicker.SetTolerance(0.005); if (0 == cellPicker.Pick(endx, endy, 0, m_renderer)) { return; //什么都没有选到就返回 } FEMActor actor = cellPicker.GetActor() as FEMActor; if (actor == null) { return; } if (m_pickTarget == ePickTarget.Actor) { //如果选择对象为 actor.IsSelected = true; m_RWCtrl.Invalidate(); //貌似必须要用这个函数,update 不行 OnObjectsSelected(sender, e); } else if (m_pickTarget == ePickTarget.Cell) { int cellId = cellPicker.GetCellId(); actor.AddCellId(cellId, m_pickBoolean); OnObjectsSelected(sender, e); //if (cellId > 0) // Console.WriteLine("dotselect cellid:{0}", cellId); } else if (m_pickTarget == ePickTarget.Point) { int pointId = cellPicker.GetPointId(); if (pointId != -1) { actor.AddPointId(pointId, m_pickBoolean); OnObjectsSelected(sender, e); // Console.WriteLine("dotselect pointid:{0}", pointId); } } } #endregion else if (m_pickMode == ePickMode.RectPickMode) //如果是框选 { vtkAreaPicker areaPicker = new vtkAreaPicker(); if (0 == areaPicker.AreaPick(startx, starty, endx, endy, m_renderer)) { //如果什么也没选到就返回 //this.impactViewForm.ClearAllSelectCells(); return; } vtkProp3DCollection selectedActors = areaPicker.GetProp3Ds(); selectedActors.InitTraversal(); FEMActor selectedActor; while ((selectedActor = selectedActors.GetNextProp3D() as FEMActor) != null) { vtkSelection selection = new vtkSelection(); vtkSelectionNode selectionNode = new vtkSelectionNode(); selection.AddNode(selectionNode); vtkIdFilter idFilter = new vtkIdFilter(); idFilter.FieldDataOn(); idFilter.SetInput(selectedActor.GetMapper().GetInput()); idFilter.Update(); vtkExtractSelection frustum = new vtkExtractSelection(); frustum.SetInput(0, idFilter.GetOutput()); frustum.SetInput(1, selection); selectionNode.Initialize(); selectionNode.SetContentType((int)vtkSelectionNode.SelectionContent.FRUSTUM); if (m_pickTarget == ePickTarget.Cell)//如果选择的目标是cell { selectionNode.SetFieldType((int)vtkSelectionNode.SelectionField.CELL); } else if (m_pickTarget == ePickTarget.Point) //如果选择的目标是point { selectionNode.SetFieldType((int)vtkSelectionNode.SelectionField.POINT); } vtkPoints points = areaPicker.GetClipPoints(); vtkDoubleArray frustumcorners = new vtkDoubleArray(); frustumcorners.SetNumberOfComponents(4); frustumcorners.SetNumberOfTuples(8); for (int i = 0; i < 8; ++i) { double[] point = points.GetPoint(i); frustumcorners.SetTuple4(i, point[0], point[1], point[2], 0.0); } selectionNode.SetSelectionList(frustumcorners); frustum.Update(); vtkUnstructuredGrid grid = new vtkUnstructuredGrid(); grid = vtkUnstructuredGrid.SafeDownCast(frustum.GetOutput()); vtkIdTypeArray ids = null; if (m_pickTarget == ePickTarget.Cell) { ids = vtkIdTypeArray.SafeDownCast(grid.GetCellData().GetArray("vtkOriginalCellIds")); if (ids == null) { continue; } selectedActor.AddCellId(ids, m_pickBoolean); OnObjectsSelected(sender, e); } else if (m_pickTarget == ePickTarget.Point) { ids = vtkIdTypeArray.SafeDownCast(grid.GetPointData().GetArray("vtkOriginalPointIds")); if (ids == null) { continue; } selectedActor.AddPointId(ids, m_pickBoolean); OnObjectsSelected(sender, e); } } } }
static public void Simulate(CMshBasicMesherDouble aMesher, vtkUnstructuredGrid anUnstructuredGrid, vtkRenderer aRenderer, RenderWindowControl aRenderControl) { aMesher.mesh().generateFaces(1E-12); aMesher.mesh().calculateFaceCentroid(); aMesher.mesh().calculateElementCentroid(); var aFvmMesh = new CFvmMeshDouble(aMesher.mesh()); double U = 1.0; // Lid velocity double mu = 0.001; // dynamic viscosity double rho = 1.0; // density double nu = mu / rho; // kinematic viscosity var aPisoSolver = new CFvmPisoSolverDouble(aFvmMesh); aPisoSolver.setGravity(0.0, 0.0, 0.0); aPisoSolver.setMaterialProperties(rho, mu); var sFaceIds = new StdVectorInt(); sFaceIds.Clear(); for (int i = 0; i < aFvmMesh.nbFaces(); ++i) { int aFaceId = aFvmMesh.faceId(i); var aFace = aFvmMesh.face(aFaceId); aFace.calculateCentroid(); if (aFace.centroid().y() == 0.0 || aFace.centroid().y() == 0.1) { sFaceIds.Add(aFaceId); } } aPisoSolver.setBoundaryVelocity(sFaceIds, EBoundaryType.BT_WALL_NO_SLIP, 0.0, 0.0, 0.0); aPisoSolver.setBoundaryPressure(sFaceIds, EBoundaryType.BT_WALL_NO_SLIP, 0.0); sFaceIds.Clear(); for (int i = 0; i < aFvmMesh.nbFaces(); ++i) { int aFaceId = aFvmMesh.faceId(i); var aFace = aFvmMesh.face(aFaceId); aFace.calculateCentroid(); if (aFace.centroid().x() == 0.0) { sFaceIds.Add(aFaceId); } } aPisoSolver.setBoundaryVelocity(sFaceIds, EBoundaryType.BT_INLET_FLOW, U, 0.0, 0.0); sFaceIds.Clear(); for (int i = 0; i < aFvmMesh.nbFaces(); ++i) { int aFaceId = aFvmMesh.faceId(i); var aFace = aFvmMesh.face(aFaceId); aFace.calculateCentroid(); if (aFace.centroid().x() == 1.0) { sFaceIds.Add(aFaceId); } } aPisoSolver.setBoundaryVelocity(sFaceIds, EBoundaryType.BT_OUTLET, 0.0, 0.0, 0.0); double dt = U / 100; // Courant < 1 var sScalars = vtkFloatArray.New(); sScalars.SetNumberOfTuples(aFvmMesh.nbControlVolumes()); var aGeometryFilter = vtkGeometryFilter.New(); var aCellDataToPointDataFilter1 = vtkCellDataToPointData.New(); var aBoundedFilter = vtkBandedPolyDataContourFilter.New(); var aLookupTable = vtkLookupTable.New(); aLookupTable.SetNumberOfColors(256); aLookupTable.SetHueRange(0.667, 0.0); aLookupTable.Build(); var aBandedMapper = vtkPolyDataMapper.New(); // add actor to the renderer var aMeshActor = vtkActor.New(); aRenderer.AddActor(aMeshActor); var aScalarBarActor = vtkScalarBarActor.New(); aRenderer.AddActor(aScalarBarActor); int nIter = 40; // Flow in a rectangle for (int ii = 0; ii < nIter; ++ii) { aPisoSolver.iterate(dt); for (int i = 0; i < aFvmMesh.nbControlVolumes(); ++i) { var aControlVolumeId = aFvmMesh.controlVolumeId(i); double u = aPisoSolver.u(aControlVolumeId); double v = aPisoSolver.v(aControlVolumeId); double vel = Math.Sqrt(u * u + v * v); sScalars.SetTuple1(aControlVolumeId, vel); } sScalars.Modified(); anUnstructuredGrid.GetCellData().SetScalars(sScalars); aGeometryFilter.SetInput(anUnstructuredGrid); aGeometryFilter.Update(); aCellDataToPointDataFilter1.SetInputConnection(aGeometryFilter.GetOutputPort()); aCellDataToPointDataFilter1.Update(); aBoundedFilter.SetInput(aCellDataToPointDataFilter1.GetOutput()); aBoundedFilter.GenerateValues(24, sScalars.GetRange()[0], sScalars.GetRange()[1]); aBandedMapper.SetInputConnection(aBoundedFilter.GetOutputPort()); aBandedMapper.SetScalarModeToUsePointData(); aBandedMapper.SetScalarRange(sScalars.GetRange()[0], sScalars.GetRange()[1]); aBandedMapper.SetLookupTable(aLookupTable); aMeshActor.SetMapper(aBandedMapper); aScalarBarActor.SetLookupTable(aLookupTable); aScalarBarActor.SetTitle("Velocity"); aScalarBarActor.SetNumberOfLabels(6); aRenderer.Render(); if (ii == 0) { aRenderer.ResetCamera(); } aRenderControl.Refresh(); } }
static public void Simulate(CMshBasicMesherDouble aMesher, vtkUnstructuredGrid anUnstructuredGrid, vtkRenderer aRenderer) { var T = new CPdeFieldDouble(); aMesher.mesh().generateFaces(1E-12); aMesher.mesh().calculateFaceCentroid(); aMesher.mesh().calculateElementCentroid(); T.setMesh(aMesher.mesh()); T.setDiscretMethod(EDiscretMethod.DM_FVM); T.setDiscretOrder(EDiscretOrder.DO_LINEAR); T.setDiscretLocation(EDiscretLocation.DL_ELEMENT_CENTER); T.setSimulationType(ESimulationType.ST_THERMAL); T.setNbDofs(1); // Set BC and initial conditions T.setSize(T.mesh().nbElements()); for (int i = 0; i < T.mesh().nbFaces(); ++i) { int aFaceId = T.mesh().faceId(i); if (Math.Abs(T.mesh().faceCentroid(aFaceId).x() - 0.0) < 1E-6) { var aFixedTemperature = new CPdeBoundaryConditionDouble(EBoundaryConditionType.BT_GENERIC_FIXED_VALUE); aFixedTemperature.addCondition(EConditionType.CT_GENERIC_FIXED_VALUE, 0.0); T.addBCFace(aFaceId, aFixedTemperature); } if (Math.Abs(T.mesh().faceCentroid(aFaceId).x() - 1.0) < 1E-6) { var aFixedTemperature = new CPdeBoundaryConditionDouble(EBoundaryConditionType.BT_GENERIC_FIXED_VALUE); aFixedTemperature.addCondition(EConditionType.CT_GENERIC_FIXED_VALUE, 0.0); T.addBCFace(aFaceId, aFixedTemperature); } if (Math.Abs(T.mesh().faceCentroid(aFaceId).y() - 0.0) < 1E-6) { var aFixedTemperature = new CPdeBoundaryConditionDouble(EBoundaryConditionType.BT_GENERIC_FIXED_VALUE); aFixedTemperature.addCondition(EConditionType.CT_GENERIC_FIXED_VALUE, 0.0); T.addBCFace(aFaceId, aFixedTemperature); } if (Math.Abs(T.mesh().faceCentroid(aFaceId).y() - 1.0) < 1E-6) { var aFixedTemperature = new CPdeBoundaryConditionDouble(EBoundaryConditionType.BT_GENERIC_FIXED_VALUE); aFixedTemperature.addCondition(EConditionType.CT_GENERIC_FIXED_VALUE, 1.0); T.addBCFace(aFaceId, aFixedTemperature); } } // Steady conduction in a rectangle var aPdeEquation = new CPdeEquationDouble(ENigMA.laplacian(T)); aPdeEquation.solve(T); var sScalars = vtkFloatArray.New(); sScalars.SetNumberOfTuples(T.mesh().nbElements()); for (int i = 0; i < T.mesh().nbElements(); ++i) { int anElementId = T.mesh().elementId(i); sScalars.SetTuple1(anElementId, T.value(i)); } anUnstructuredGrid.GetCellData().SetScalars(sScalars); var aGeometryFilter = vtkGeometryFilter.New(); aGeometryFilter.SetInput(anUnstructuredGrid); aGeometryFilter.Update(); var aCellDataToPointDataFilter1 = vtkCellDataToPointData.New(); aCellDataToPointDataFilter1.SetInputConnection(aGeometryFilter.GetOutputPort()); aCellDataToPointDataFilter1.Update(); var aBoundedFilter = vtkBandedPolyDataContourFilter.New(); aBoundedFilter.SetInput(aCellDataToPointDataFilter1.GetOutput()); aBoundedFilter.GenerateValues(24, sScalars.GetRange()[0], sScalars.GetRange()[1]); var aLookupTable = vtkLookupTable.New(); aLookupTable.SetNumberOfColors(256); aLookupTable.SetHueRange(0.667, 0.0); aLookupTable.Build(); var aBandedMapper = vtkPolyDataMapper.New(); aBandedMapper.SetInputConnection(aBoundedFilter.GetOutputPort()); aBandedMapper.SetScalarModeToUsePointData(); aBandedMapper.SetScalarRange(sScalars.GetRange()[0], sScalars.GetRange()[1]); aBandedMapper.SetLookupTable(aLookupTable); // add actor to the renderer var aMeshActor = vtkActor.New(); aRenderer.AddActor(aMeshActor); aMeshActor.SetMapper(aBandedMapper); var aScalarBarActor = vtkScalarBarActor.New(); aRenderer.AddActor(aScalarBarActor); aScalarBarActor.SetLookupTable(aLookupTable); aScalarBarActor.SetTitle("Temperature"); aScalarBarActor.SetNumberOfLabels(6); aScalarBarActor.Modified(); }
/// <summary> /// Load scalar results to Grid Point and Cell Data /// </summary> public void Load_Scalar(Database DB) { int NumbScalar = 24; // Total number of scalar results avaliable int NumbInc = DB.AnalysisLib.GetResultStepNo() + 1; // Total number of Analysis increments (including 0) // Initialize Scalar data CellScalar = new vtkFloatArray[NumbInc, NumbScalar, 3]; PointScalar = new vtkFloatArray[NumbInc, NumbScalar]; // Loop through all Analysis increments for (int inc = 0; inc < NumbInc; inc++) { // Create Scalar Arrays for new increment for (int s = 0; s < NumbScalar; s++) { vtkFloatArray CellMax = vtkFloatArray.New(); vtkFloatArray CellAverage = vtkFloatArray.New(); vtkFloatArray CellMin = vtkFloatArray.New(); vtkFloatArray PointArray = vtkFloatArray.New(); CellMax.SetNumberOfComponents(1); CellAverage.SetNumberOfComponents(1); CellMin.SetNumberOfComponents(1); PointArray.SetNumberOfComponents(1); CellScalar[inc, s, 0] = CellMax; CellScalar[inc, s, 1] = CellAverage; CellScalar[inc, s, 2] = CellMin; PointScalar[inc, s] = PointArray; } // ---------- CELL (ELEMENT) SCALARS ------------------------------------------------ // Set Array Name for (int i = 0; i < 3; i++) { string prefix = ""; if (i == 0) { prefix = "Max"; } if (i == 1) { prefix = "Average"; } if (i == 2) { prefix = "Min"; } CellScalar[inc, 0, i].SetName(prefix + " Displacement X INC " + inc.ToString()); CellScalar[inc, 1, i].SetName(prefix + " Displacement Y INC " + inc.ToString()); CellScalar[inc, 2, i].SetName(prefix + " Displacement Z INC " + inc.ToString()); CellScalar[inc, 3, i].SetName(prefix + " Total Displacement INC " + inc.ToString()); CellScalar[inc, 4, i].SetName(prefix + " Stress XX INC " + inc.ToString()); CellScalar[inc, 5, i].SetName(prefix + " Stress YY INC " + inc.ToString()); CellScalar[inc, 6, i].SetName(prefix + " Stress ZZ INC " + inc.ToString()); CellScalar[inc, 7, i].SetName(prefix + " Stress XY INC " + inc.ToString()); CellScalar[inc, 8, i].SetName(prefix + " Stress YZ INC " + inc.ToString()); CellScalar[inc, 9, i].SetName(prefix + " Stress XZ INC " + inc.ToString()); CellScalar[inc, 10, i].SetName(prefix + " Stress P1 INC " + inc.ToString()); CellScalar[inc, 11, i].SetName(prefix + " Stress P2 INC " + inc.ToString()); CellScalar[inc, 12, i].SetName(prefix + " Stress P3 INC " + inc.ToString()); CellScalar[inc, 13, i].SetName(prefix + " von Mises Stress INC " + inc.ToString()); CellScalar[inc, 14, i].SetName(prefix + " Strain XX INC " + inc.ToString()); CellScalar[inc, 15, i].SetName(prefix + " Strain YY INC " + inc.ToString()); CellScalar[inc, 16, i].SetName(prefix + " Strain ZZ INC " + inc.ToString()); CellScalar[inc, 17, i].SetName(prefix + " Strain XY INC " + inc.ToString()); CellScalar[inc, 18, i].SetName(prefix + " Strain YZ INC " + inc.ToString()); CellScalar[inc, 19, i].SetName(prefix + " Strain XZ INC " + inc.ToString()); CellScalar[inc, 20, i].SetName(prefix + " Strain P1 INC " + inc.ToString()); CellScalar[inc, 21, i].SetName(prefix + " Strain P2 INC " + inc.ToString()); CellScalar[inc, 22, i].SetName(prefix + " Strain P3 INC " + inc.ToString()); CellScalar[inc, 23, i].SetName(prefix + " Effective Strain INC " + inc.ToString()); } // For each Element collect Nodal values, take Min/Average/Max and insert to array Parallel.ForEach(Elements, ID => { // Take element from database int index = Elements.IndexOf(ID); Element E = DB.ElemLib[Elements[index]]; // List of results in Nodes List <double[]> Nval = new List <double[]>(); for (int i = 0; i < NumbScalar; i++) { Nval.Add(new double[E.NList.Count]); } // Assign Nodal values for (int i = 0; i < E.NList.Count; i++) { // Displacement Nval[0][i] = DB.NodeLib[E.NList[i]].GetDisp(inc, 0); Nval[1][i] = DB.NodeLib[E.NList[i]].GetDisp(inc, 1); Nval[2][i] = DB.NodeLib[E.NList[i]].GetDisp(inc, 2); Nval[3][i] = Math.Sqrt(Math.Pow(Nval[0][i], 2) + Math.Pow(Nval[1][i], 2) + Math.Pow(Nval[2][i], 2)); // Stress Matrix <double> S = Matrix <double> .Build.Dense(3, 3); S[0, 0] = E.GetStress(inc, i, 0); S[1, 1] = E.GetStress(inc, i, 1); S[2, 2] = E.GetStress(inc, i, 2); S[0, 1] = E.GetStress(inc, i, 3); S[1, 0] = E.GetStress(inc, i, 3); S[1, 2] = E.GetStress(inc, i, 4); S[2, 1] = E.GetStress(inc, i, 4); S[0, 2] = E.GetStress(inc, i, 5); S[2, 0] = E.GetStress(inc, i, 5); Evd <double> eigen = S.Evd(); double P1 = eigen.EigenValues[2].Real; double P2 = eigen.EigenValues[1].Real; double P3 = eigen.EigenValues[0].Real; Nval[4][i] = S[0, 0]; Nval[5][i] = S[1, 1]; Nval[6][i] = S[2, 2]; Nval[7][i] = S[0, 1]; Nval[8][i] = S[1, 2]; Nval[9][i] = S[0, 2]; Nval[10][i] = P1; Nval[11][i] = P2; Nval[12][i] = P3; Nval[13][i] = Math.Sqrt((Math.Pow(P1 - P2, 2) + Math.Pow(P2 - P3, 2) + Math.Pow(P3 - P1, 2)) / 2); // Strain S = Matrix <double> .Build.Dense(3, 3); S[0, 0] = E.GetStrain(inc, i, 0); S[1, 1] = E.GetStrain(inc, i, 1); S[2, 2] = E.GetStrain(inc, i, 2); S[0, 1] = E.GetStrain(inc, i, 3); S[1, 0] = E.GetStrain(inc, i, 3); S[1, 2] = E.GetStrain(inc, i, 4); S[2, 1] = E.GetStrain(inc, i, 4); S[0, 2] = E.GetStrain(inc, i, 5); S[2, 0] = E.GetStrain(inc, i, 5); eigen = S.Evd(); P1 = eigen.EigenValues[2].Real; P2 = eigen.EigenValues[1].Real; P3 = eigen.EigenValues[0].Real; Nval[14][i] = S[0, 0]; Nval[15][i] = S[1, 1]; Nval[16][i] = S[2, 2]; Nval[17][i] = S[0, 1]; Nval[18][i] = S[1, 2]; Nval[19][i] = S[0, 2]; Nval[20][i] = P1; Nval[21][i] = P2; Nval[22][i] = P3; Nval[23][i] = (2.0 / 3.0) * Math.Sqrt((Math.Pow(P1 - P2, 2) + Math.Pow(P2 - P3, 2) + Math.Pow(P3 - P1, 2)) / 2); } lock (CellScalar) { for (int s = 0; s < NumbScalar; s++) { CellScalar[inc, s, 0].InsertTuple1(index, Nval[s].Max()); CellScalar[inc, s, 1].InsertTuple1(index, Nval[s].Average()); CellScalar[inc, s, 2].InsertTuple1(index, Nval[s].Min()); } } }); // Add arrays to Grid CellData foreach (vtkFloatArray array in CellScalar) { Grid.GetCellData().AddArray(array); } // ---------- POINT (NODE) SCALARS ------------------------------------------------ // Set Array Name PointScalar[inc, 0].SetName("Displacement X INC " + inc.ToString()); PointScalar[inc, 1].SetName("Displacement Y INC " + inc.ToString()); PointScalar[inc, 2].SetName("Displacement Z INC " + inc.ToString()); PointScalar[inc, 3].SetName("Total Displacement INC " + inc.ToString()); PointScalar[inc, 4].SetName("Stress XX INC " + inc.ToString()); PointScalar[inc, 5].SetName("Stress YY INC " + inc.ToString()); PointScalar[inc, 6].SetName("Stress ZZ INC " + inc.ToString()); PointScalar[inc, 7].SetName("Stress XY INC " + inc.ToString()); PointScalar[inc, 8].SetName("Stress YZ INC " + inc.ToString()); PointScalar[inc, 9].SetName("Stress XZ INC " + inc.ToString()); PointScalar[inc, 10].SetName("Stress P1 INC " + inc.ToString()); PointScalar[inc, 11].SetName("Stress P2 INC " + inc.ToString()); PointScalar[inc, 12].SetName("Stress P3 INC " + inc.ToString()); PointScalar[inc, 13].SetName("von Mises Stress INC " + inc.ToString()); PointScalar[inc, 14].SetName("Strain XX INC " + inc.ToString()); PointScalar[inc, 15].SetName("Strain YY INC " + inc.ToString()); PointScalar[inc, 16].SetName("Strain ZZ INC " + inc.ToString()); PointScalar[inc, 17].SetName("Strain XY INC " + inc.ToString()); PointScalar[inc, 18].SetName("Strain YZ INC " + inc.ToString()); PointScalar[inc, 19].SetName("Strain XZ INC " + inc.ToString()); PointScalar[inc, 20].SetName("Strain P1 INC " + inc.ToString()); PointScalar[inc, 21].SetName("Strain P2 INC " + inc.ToString()); PointScalar[inc, 22].SetName("Strain P3 INC " + inc.ToString()); PointScalar[inc, 23].SetName("Effective Strain INC " + inc.ToString()); // For each Node collect Nodal values, take Min/Average/Max and insert to array Parallel.ForEach(Nodes, n => { // Take element from database Node N = DB.NodeLib[n.Key]; // List of results in Nodes List <double[]> Nval = new List <double[]>(); for (int i = 0; i < NumbScalar; i++) { Nval.Add(new double[N.EList.Count()]); } // Assign Nodal values for (int i = 0; i < N.EList.Count; i++) { // Index of this node in i-th Element Node List int NodeIndex = DB.ElemLib[N.EList[i]].NList.IndexOf(N.ID); // Displacement Nval[0][i] = N.GetDisp(inc, 0); Nval[1][i] = N.GetDisp(inc, 1); Nval[2][i] = N.GetDisp(inc, 2); Nval[3][i] = Math.Sqrt(Math.Pow(Nval[0][i], 2) + Math.Pow(Nval[1][i], 2) + Math.Pow(Nval[2][i], 2)); // Stress Matrix <double> S = Matrix <double> .Build.Dense(3, 3); S[0, 0] = DB.ElemLib[N.EList[i]].GetStress(inc, NodeIndex, 0); S[1, 1] = DB.ElemLib[N.EList[i]].GetStress(inc, NodeIndex, 1); S[2, 2] = DB.ElemLib[N.EList[i]].GetStress(inc, NodeIndex, 2); S[0, 1] = DB.ElemLib[N.EList[i]].GetStress(inc, NodeIndex, 3); S[1, 0] = DB.ElemLib[N.EList[i]].GetStress(inc, NodeIndex, 3); S[1, 2] = DB.ElemLib[N.EList[i]].GetStress(inc, NodeIndex, 4); S[2, 1] = DB.ElemLib[N.EList[i]].GetStress(inc, NodeIndex, 4); S[0, 2] = DB.ElemLib[N.EList[i]].GetStress(inc, NodeIndex, 5); S[2, 0] = DB.ElemLib[N.EList[i]].GetStress(inc, NodeIndex, 5); Evd <double> eigen = S.Evd(); double P1 = eigen.EigenValues[2].Real; double P2 = eigen.EigenValues[1].Real; double P3 = eigen.EigenValues[0].Real; Nval[4][i] = S[0, 0]; Nval[5][i] = S[1, 1]; Nval[6][i] = S[2, 2]; Nval[7][i] = S[0, 1]; Nval[8][i] = S[1, 2]; Nval[9][i] = S[0, 2]; Nval[10][i] = P1; Nval[11][i] = P2; Nval[12][i] = P3; Nval[13][i] = Math.Sqrt((Math.Pow(P1 - P2, 2) + Math.Pow(P2 - P3, 2) + Math.Pow(P3 - P1, 2)) / 2); // Strain S = Matrix <double> .Build.Dense(3, 3); S[0, 0] = DB.ElemLib[N.EList[i]].GetStrain(inc, NodeIndex, 0); S[1, 1] = DB.ElemLib[N.EList[i]].GetStrain(inc, NodeIndex, 1); S[2, 2] = DB.ElemLib[N.EList[i]].GetStrain(inc, NodeIndex, 2); S[0, 1] = DB.ElemLib[N.EList[i]].GetStrain(inc, NodeIndex, 3); S[1, 0] = DB.ElemLib[N.EList[i]].GetStrain(inc, NodeIndex, 3); S[1, 2] = DB.ElemLib[N.EList[i]].GetStrain(inc, NodeIndex, 4); S[2, 1] = DB.ElemLib[N.EList[i]].GetStrain(inc, NodeIndex, 4); S[0, 2] = DB.ElemLib[N.EList[i]].GetStrain(inc, NodeIndex, 5); S[2, 0] = DB.ElemLib[N.EList[i]].GetStrain(inc, NodeIndex, 5); eigen = S.Evd(); P1 = eigen.EigenValues[2].Real; P2 = eigen.EigenValues[1].Real; P3 = eigen.EigenValues[0].Real; Nval[14][i] = S[0, 0]; Nval[15][i] = S[1, 1]; Nval[16][i] = S[2, 2]; Nval[17][i] = S[0, 1]; Nval[18][i] = S[1, 2]; Nval[19][i] = S[0, 2]; Nval[20][i] = P1; Nval[21][i] = P2; Nval[22][i] = P3; Nval[23][i] = (2.0 / 3.0) * Math.Sqrt((Math.Pow(P1 - P2, 2) + Math.Pow(P2 - P3, 2) + Math.Pow(P3 - P1, 2)) / 2); } lock (PointScalar) { for (int s = 0; s < NumbScalar; s++) { PointScalar[inc, s].InsertTuple1(n.Value, Nval[s].Average()); } } }); // Add arrays to Grid PointData foreach (vtkFloatArray array in PointScalar) { Grid.GetPointData().AddArray(array); } } }