Exemplo n.º 1
0
        public Tuple <double[][], double[][]> Start()
        {
            KeyValuePair <double[, , ][], int> mainVert = VertexFill.fillMatrixWithMainVertexes(matrix, nqp, k, n, m, SCALE_X, SCALE_Y, SCALE_Z);

            matrix = mainVert.Key;
            nqp    = mainVert.Value;
            KeyValuePair <double[, , ][], int> interVert = VertexFill.fillMatrixWithIntermidiateVertexes(matrix, nqp, k, n, m, SCALE_X, SCALE_Y, SCALE_Z);

            matrix = interVert.Key;
            nqp    = interVert.Value;

            MG = new double[3 * nqp, 3 * nqp];
            F  = new double[3 * nqp];

            AKT = CreateAKT.createAKT(nqp, k, n, m, matrix, local_to_global);
            ZU  = CreateAKT.createZU(AKT);
            ZP  = CreateAKT.createZP(m, n, nel);
            createNT();
            MG    = createMG.getMG(nel, NT, AKT, DFIABG, lam, v, mu, c, nqp);
            MG    = createMG.improveMG(ZU, MG);
            PSIET = Presure.createPSI();
            F     = Presure.createF(nqp, nel, m, n, AKT, NT, PSIET, c);

            U = Gauss.Solve(MG, F);

            double[][] AKTres = new double[nqp][];
            for (int i = 0; i < nqp; i++)
            {
                double[] prev  = AKT[i];
                double[] point = U.Skip(i * 3).Take(3).ToArray();
                AKTres[i] = new double[3] {
                    Math.Round(prev[0] + point[0], 4), Math.Round(prev[1] + point[1], 4), Math.Round(prev[2] + point[2], 4)
                };
            }

            using (StreamWriter sw = new StreamWriter("C:\\FEM\\frontend\\FEMpoints.txt", false, System.Text.Encoding.Default))
            {
                sw.WriteLine(JsonConvert.SerializeObject((from a in AKTres select new { x = a[0], y = a[1], z = a[2], })));
            }

            using (StreamWriter sw = new StreamWriter("C:\\FEM\\frontend\\start.txt", false, System.Text.Encoding.Default))
            {
                sw.WriteLine(JsonConvert.SerializeObject((from a in AKT select new { x = a[0], y = a[1], z = a[2], })));
            }

            return(new Tuple <double[][], double[][]>(AKT, AKTres));
        }
Exemplo n.º 2
0
        public static double[,] getMG(int nel, int[][] NT, double[][] AKT, double[,,] DFIABG, double lam, double v, double mu, double[] c, int nqp)
        {
            double[,,] dxyzabg = new double[3, 3, 27];
            double[] dj = new double[27];
            double[,,] dfixyz = new double[27, 20, 3];
            double[,] MG      = new double[3 * nqp, 3 * nqp];

            for (int number = 0; number < nel; number++)
            {
                int[] coordinates = NT[number];

                double globalCoordinate = 0;
                double diFi             = 0;
                double sum = 0;

                for (int i = 0; i < 3; i++)
                {
                    for (int j = 0; j < 3; j++)
                    {
                        for (int k = 0; k < 27; k++)
                        {
                            sum = 0;
                            for (int l = 0; l < 20; l++)
                            {
                                globalCoordinate = AKT[coordinates[l]][i];
                                diFi             = DFIABG[k, j, l];
                                sum += globalCoordinate * diFi;
                            }
                            dxyzabg[i, j, k] = sum;
                        }
                    }
                }

                double[,] jak;
                for (int i = 0; i < 27; i++)
                {
                    jak = new double[3, 3] {
                        { dxyzabg[0, 0, i], dxyzabg[1, 0, i], dxyzabg[2, 0, i] },
                        { dxyzabg[0, 1, i], dxyzabg[1, 1, i], dxyzabg[2, 1, i] },
                        { dxyzabg[0, 2, i], dxyzabg[1, 2, i], dxyzabg[2, 2, i] }
                    };
                    dj[i] = (
                        jak[0, 0] * jak[1, 1] * jak[2, 2] +
                        jak[0, 1] * jak[1, 2] * jak[2, 0] +
                        jak[0, 2] * jak[1, 0] * jak[2, 1]
                        ) -
                            (
                        jak[0, 2] * jak[1, 1] * jak[2, 0] +
                        jak[0, 1] * jak[1, 0] * jak[2, 2] +
                        jak[0, 0] * jak[1, 2] * jak[2, 1]
                            );
                }


                double[] col = new double[3];

                for (int i = 0; i < 27; i++)
                {
                    for (int phi = 0; phi < 20; phi++)
                    {
                        for (int k = 0; k < 3; k++)
                        {
                            col[k] = DFIABG[i, k, phi];
                        }
                        double[,] matrix = new double[3, 3] {
                            { dxyzabg[0, 0, i], dxyzabg[1, 0, i], dxyzabg[2, 0, i] },
                            { dxyzabg[0, 1, i], dxyzabg[1, 1, i], dxyzabg[2, 1, i] },
                            { dxyzabg[0, 2, i], dxyzabg[1, 2, i], dxyzabg[2, 2, i] }
                        };
                        double[] gaussianSolve = Gauss.Solve(matrix, col);

                        for (int k = 0; k < 3; k++)
                        {
                            dfixyz[i, phi, k] = gaussianSolve[k];
                        }
                    }
                }

                double[, ][,] mge = new double[3, 3][, ];

                mge[0, 0] = one_one(dfixyz, dj, lam, v, mu, c);
                mge[1, 1] = two_two(dfixyz, dj, lam, v, mu, c);
                mge[2, 2] = three_three(dfixyz, dj, lam, v, mu, c);

                mge[0, 1] = one_two(dfixyz, dj, lam, v, mu, c);
                mge[0, 2] = one_three(dfixyz, dj, lam, v, mu, c);
                mge[1, 2] = two_three(dfixyz, dj, lam, v, mu, c);

                mge[1, 0] = rotate(mge[0, 1]);
                mge[2, 0] = rotate(mge[0, 2]);
                mge[2, 1] = rotate(mge[1, 2]);

                int x, y, localX, localY, globalX, globalY;

                for (int i = 0; i < 60; i++)
                {
                    for (int j = 0; j < 60; j++)
                    {
                        x = i / 20;
                        y = j / 20;

                        localX = i % 20;
                        localY = j % 20;

                        globalX = (NT[number][localX]) * 3 + x;
                        globalY = (NT[number][localY]) * 3 + y;

                        MG[globalX, globalY] += mge[x, y][localX, localY];
                    }
                }
            }
            return(MG);
        }