// Create arrays nodeType2 and nodeNum2
        // return number of nodes in 3D mesh
        private int nodeTypesNumbers2D()
        {
            // nodeType2 - node types for 2D mesh,
            //  =0 - midside, =1 - corner/degenerate
            nodeType2 = new int[m2.nNod];
            for (int iel = 0; iel < m2.nEl; iel++)
            {
                for (int i = 0; i < m2.elems[iel].ind.Length; i++)
                {
                    int inj = m2.elems[iel].ind[i] - 1;
                    if (inj != -1)
                    {
                        nodeType2[inj] = (i + 1) % 2;
                    }
                }
            }

            // nodeNum2[i] is a number of i-th 2D node in 3D mesh
            nodeNum2 = new int[m2.nNod];
            int node = 1;

            for (int i = 0; i < m2.nNod; i++)
            {
                nodeNum2[i] = node;
                int dn = (nodeType2[i] == 0) ?
                         nlayers + 1 : 2 * nlayers + 1;
                // If node is located on rotation axis Y
                if (rotate && m2.getNodeCoord(i, 0) == 0.0)
                {
                    dn = 1;
                }
                node = node + dn;
            }
            return(node - 1);
        }
Esempio n. 2
0
        private void doTranslate()
        {
            if (m.nDim == 2 && axis == 'z')
            {
                return;
            }
            int iax = getIntAxis(axis);

            for (int i = 0; i < m.nNod; i++)
            {
                m.setNodeCoord(i, iax, m.getNodeCoord(i, iax) + value);
            }
        }
        // Add scaled displacements to nodal coordinates and
        //  center finite element mesh
        void modifyNodeCoordinates()
        {
            // Deformed shape: add scaled displacements
            // to nodal coordinates
            if (VisData.showDeformShape)
            {
                setBoundingBox();
                double displMax = 0;
                for (int i = 0; i < fem.nNod; i++)
                {
                    double d = 0;
                    for (int j = 0; j < fem.nDim; j++)
                    {
                        double s = VisData.displ[i * fem.nDim + j];
                        d += s * s;
                    }
                    displMax = Math.Max(d, displMax);
                }
                displMax = Math.Sqrt(displMax);
                // Scale for visualization of deformed shape
                double scaleD =
                    sizeMax * VisData.deformScale / displMax;
                for (int i = 0; i < fem.nNod; i++)
                {
                    for (int j = 0; j < fem.nDim; j++)
                    {
                        fem.setNodeCoord(i, j,
                                         fem.getNodeCoord(i, j) +
                                         scaleD * VisData.displ[i * fem.nDim + j]);
                    }
                }
            }

            setBoundingBox();
            // Translate JFEM model to have the bounding
            //  box center at (0,0,0).
            double[] xyzC = new double[3];
            for (int j = 0; j < 3; j++)
            {
                xyzC[j] = 0.5 * (xyzmin[j] + xyzmax[j]);
            }
            for (int i = 0; i < fem.nNod; i++)
            {
                for (int j = 0; j < fem.nDim; j++)
                {
                    fem.setNodeCoord(i, j,
                                     fem.getNodeCoord(i, j) - xyzC[j]);
                }
            }
        }
Esempio n. 4
0
        public writemesh()
        {
            String modelName = CSMGEN.RD.next();
            String fileName  = CSMGEN.RD.next();

            CSMGEN.PR.Write("WriteMesh: {0}    {1}\n", modelName, fileName);

            StreamWriter WR = new FePrintWriter().getPrinter(fileName);

            if (CSMGEN.blocks.ContainsKey(modelName))
            {
                m = (FeModel)CSMGEN.blocks[modelName];
            }
            else
            {
                UTIL.errorMsg("No such mesh block: " + modelName);
            }

            WR.Write("# Model name: {0}\n", modelName);
            WR.Write("nNod = {0,5}\n", m.nNod);
            WR.Write("nEl = {0,5}\n", m.nEl);
            WR.Write("nDim = {0,5}\n", m.nDim);

            WR.Write("nodCoord\n");
            for (int i = 0; i < m.nNod; i++)
            {
                for (int j = 0; j < m.nDim; j++)
                {
                    WR.Write("{0,20:0.000000000}", m.getNodeCoord(i, j));
                }
                WR.WriteLine("");
            }

            WR.Write("\nelCon");
            for (int iel = 0; iel < m.nEl; iel++)
            {
                WR.Write("\n{0} {1,6}", m.elems[iel].name, m.elems[iel].matName);
                if (m.elems[iel].name.Equals("quad4") || m.elems[iel].name.Equals("quad8r")) //|| m.elems[iel].name.Equals("genquad4") || m.elems[iel].name.Equals("genquad8"))
                {
                    WR.Write("{0,6}", m.elems[iel].t);
                }
                if (m.elems[iel].name.Equals("truss22") || m.elems[iel].name.Equals("truss32"))//|| m.elems[iel].name.Equals("genquad4") || m.elems[iel].name.Equals("genquad8"))
                {
                    WR.Write("{0,12}", m.elems[iel].A);
                }
                int nind = m.elems[iel].ind.Length;
                for (int i = 0; i < nind; i++)
                {
                    WR.Write("{0,12}", m.elems[iel].ind[i]);
                }
            }
            WR.Write("\n\nend\n");
            WR.Close();
            CSMGEN.PR.Write("Mesh " + modelName + ": nEl = {0}  nNod = {1}\n", m.nEl, m.nNod);
        }
Esempio n. 5
0
        public static void CsfeaToVtk_Main(String[] args)
        {
            Console.Clear();
            Console.WriteLine();
            Console.WriteLine("***************************************************");
            Console.WriteLine("*   C# Finite Element Analysis - Post-Processor   *");
            Console.WriteLine("*   -------------------------------------------   *");
            Console.WriteLine("*   Copyright © Ravinder Singh, 2017.             *");
            Console.WriteLine("*   License: Apache v2.0 License.                 *");
            Console.WriteLine("*   For further information on this software      *");
            Console.WriteLine("*   email : [email protected].               *");
            Console.WriteLine("***************************************************");
            Console.WriteLine();

            string[] w;
            switch (args.Length)
            {
            case 1:
                w        = args[0].Split('.');
                meshFile = args[0];
                outFile  = w[0] + "_msh" + ".vtk";
                break;

            case 2:
                w          = args[1].Split('.');
                meshFile   = args[0];
                resultFile = args[1];
                outFile    = w[0] + "_" + w[1] + ".vtk";
                break;

            default:
                break;
            }


            fes         = new FeScanner(meshFile);
            fem         = new FeModel(fes, null);
            Element.fem = fem;
            fem.readData();

            WR = new FePrintWriter().getPrinter(outFile);
            WR.WriteLine("# vtk DataFile Version 3.1");
            WR.WriteLine(outFile);
            WR.WriteLine("ASCII\nDATASET UNSTRUCTURED_GRID");
            WR.WriteLine("POINTS {0} DOUBLE", fem.nNod);

            int ElemConnectNodeCount = 0;

            for (int iel = 0; iel < fem.nEl; iel++)
            {
                if (fem.elems[iel].name.Equals("hex20") || fem.elems[iel].name.Equals("hex20r"))
                {
                    ElemConnectNodeCount += 21;
                }
                if (fem.elems[iel].name.Equals("hex8") || fem.elems[iel].name.Equals("hex8r"))
                {
                    ElemConnectNodeCount += 9;
                }
                if (fem.elems[iel].name.Equals("quad8") || fem.elems[iel].name.Equals("quad8r"))
                {
                    ElemConnectNodeCount += 9;
                }
                if (fem.elems[iel].name.Equals("quad4") || fem.elems[iel].name.Equals("quad4r"))
                {
                    ElemConnectNodeCount += 5;
                }
                if (fem.elems[iel].name.Equals("truss22") || fem.elems[iel].name.Equals("truss32"))
                {
                    ElemConnectNodeCount += 3;
                }
            }

            for (int i = 0; i < fem.nNod; i++)
            {
                for (int j = 0; j < fem.nDim; j++)
                {
                    WR.Write("{0,20:0.000000000}", fem.getNodeCoord(i, j));
                }
                if (fem.nDim < 3)
                {
                    WR.Write("{0,20:0.000000000}", 0.0);
                }
                if (fem.nDim < 2)
                {
                    WR.Write("{0,20:0.000000000}", 0.0);
                }
                WR.WriteLine();
            }

            WR.WriteLine();

            WR.Write("\nCELLS {0} ", fem.nEl);
            WR.Write("{0} \n", ElemConnectNodeCount);



            for (int iel = 0; iel < fem.nEl; iel++)
            {
                if (fem.elems[iel].name.Equals("hex20") || fem.elems[iel].name.Equals("hex20r"))
                {
                    WR.Write("20 ");
                    int nind = fem.elems[iel].ind.Length;
                    for (int i = 0; i < vtkArrInd_hex20.Length; i++)
                    {
                        WR.Write("{0,6}", fem.elems[iel].ind[vtkArrInd_hex20[i]] - 1);
                    }
                }

                if (fem.elems[iel].name.Equals("hex8") || fem.elems[iel].name.Equals("hex8r"))
                {
                    WR.Write("8 ");
                    int nind = fem.elems[iel].ind.Length;
                    for (int i = 0; i < vtkArrInd_hex8.Length; i++)
                    {
                        WR.Write("{0,6}", fem.elems[iel].ind[vtkArrInd_hex8[i]] - 1);
                    }
                }

                if (fem.elems[iel].name.Equals("quad8") || fem.elems[iel].name.Equals("quad8r"))
                {
                    WR.Write("8 ");
                    int nind = fem.elems[iel].ind.Length;
                    for (int i = 0; i < vtkArrInd_quad8.Length; i++)
                    {
                        WR.Write("{0,6}", fem.elems[iel].ind[vtkArrInd_quad8[i]] - 1);
                    }
                }

                if (fem.elems[iel].name.Equals("quad4") || fem.elems[iel].name.Equals("quad4r"))
                {
                    WR.Write("4 ");
                    int nind = fem.elems[iel].ind.Length;
                    for (int i = 0; i < vtkArrInd_quad4.Length; i++)
                    {
                        WR.Write("{0,6}", fem.elems[iel].ind[vtkArrInd_quad4[i]] - 1);
                    }
                }

                if (fem.elems[iel].name.Equals("truss22") || fem.elems[iel].name.Equals("truss32"))
                {
                    WR.Write("2 ");
                    int nind = fem.elems[iel].ind.Length;
                    for (int i = 0; i < vtkArrInd_truss2.Length; i++)
                    {
                        WR.Write("{0,6}", fem.elems[iel].ind[vtkArrInd_truss2[i]] - 1);
                    }
                }

                WR.WriteLine();
            }
            WR.WriteLine("\nCELL_TYPES {0}", fem.nEl);
            for (int i = 0; i < fem.nEl; i++)
            {
                if (fem.elems[i].name.Equals("hex20") || fem.elems[i].name.Equals("hex20r"))
                {
                    WR.Write("{0,3}", 25);
                }

                if (fem.elems[i].name.Equals("hex8") || fem.elems[i].name.Equals("hex8r"))
                {
                    WR.Write("{0,3}", 12);
                }

                if (fem.elems[i].name.Equals("quad8") || fem.elems[i].name.Equals("quad8r"))
                {
                    WR.Write("{0,3}", 23);
                }

                if (fem.elems[i].name.Equals("quad4") || fem.elems[i].name.Equals("quad4r"))
                {
                    WR.Write("{0,3}", 9);
                }

                if (fem.elems[i].name.Equals("truss22") || fem.elems[i].name.Equals("truss32"))
                {
                    WR.Write("{0,3}", 3);
                }
            }


            WR.WriteLine("\n");

            if (resultFile != null)
            {
                displ  = new double[fem.nNod * fem.nDf];
                stress = new FeStress(fem);
                stress.readResults(resultFile, displ);
                resAtNod = new ResultAtNodes(fem);

                WR.Write("POINT_DATA {0}", fem.nNod);



                writeScalars("Si");
                writeScalars("Sx");

                writeScalars("Sy");
                writeScalars("Sz");
                writeScalars("Sxy");

                if (fem.nDim == 3)
                {
                    writeScalars("Syz");
                    writeScalars("Szx");
                }

                //writeScalars("S1");
                //writeScalars("S2");
                //if (fem.nDim == 3)
                //{
                //    writeScalars("S3");
                //    writeScalars("S13");
                //}

                writeScalars("Ux");
                writeScalars("Uy");

                if (fem.nDim == 3)
                {
                    writeScalars("Uz");
                }
            }

            WR.Flush();
            WR.Close();
        }