示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        /// <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);
                    }
                }
            }
        }
示例#4
0
        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();
            }
        }
示例#5
0
        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();
        }
示例#6
0
文件: Part.cs 项目: ovevans/STAN
        /// <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);
                }
            }
        }