Beispiel #1
0
        static List <BoundMatrix> FindBoundSidesOfTriangle(int triangle, MinimalAngleAlgorithm.TriangulationStructure trianglulation)
        {
            List <BoundMatrix> res = new List <BoundMatrix>();

            for (int i = 0; i < trianglulation.boundaryPoints.Count; i++)
            {
                for (int j = 0; j < trianglulation.boundaryPoints[i].Count; j++)
                {
                    if (trianglulation.boundaryPoints[i][j].Contains(trianglulation.triangles[triangle].A) && trianglulation.boundaryPoints[i][j].Contains(trianglulation.triangles[triangle].B))
                    {
                        res.Add(new BoundMatrix()
                        {
                            FirstPoint = trianglulation.boundaryPoints[i][j][0], SecondPoint = trianglulation.boundaryPoints[i][j][1], NumberOfBound = i, Triangle = triangle
                        });
                    }
                    else
                    if (trianglulation.boundaryPoints[i][j].Contains(trianglulation.triangles[triangle].A) && trianglulation.boundaryPoints[i][j].Contains(trianglulation.triangles[triangle].C))
                    {
                        res.Add(new BoundMatrix()
                        {
                            FirstPoint = trianglulation.boundaryPoints[i][j][0], SecondPoint = trianglulation.boundaryPoints[i][j][1], NumberOfBound = i, Triangle = triangle
                        });
                    }
                    else
                    if (trianglulation.boundaryPoints[i][j].Contains(trianglulation.triangles[triangle].B) && trianglulation.boundaryPoints[i][j].Contains(trianglulation.triangles[triangle].C))
                    {
                        res.Add(new BoundMatrix()
                        {
                            FirstPoint = trianglulation.boundaryPoints[i][j][0], SecondPoint = trianglulation.boundaryPoints[i][j][1], NumberOfBound = i, Triangle = triangle
                        });
                    }
                }
            }
            return(res);
        }
Beispiel #2
0
        static Matrix GetBoundIntegralMatrix(MinimalAngleAlgorithm.TriangulationStructure triangulation, BoundMatrix boundMatr, double sigma, double beta)
        {
            Matrix res = new Matrix();

            res = new Matrix(new double[, ] {
                { 2, 1 }, { 1, 2 }
            });
            double l = Point.GetDistance(triangulation.points[boundMatr.FirstPoint], triangulation.points[boundMatr.SecondPoint]);

            res = (sigma / beta) * (l / 6d) * res;
            return(res);
        }
Beispiel #3
0
        public static List <MatrixesOfFEM> GetMatrixes(MinimalAngleAlgorithm.TriangulationStructure triangulation, Matrix Amatrix, List <double> beta, List <double> sigma, List <double> uEnvironment, double d, double f)
        {
            List <MatrixesOfFEM> res = new List <MatrixesOfFEM>();

            for (int i = 0; i < triangulation.triangles.Count; i++)
            {
                MatrixesOfFEM current = new MatrixesOfFEM();
                current.GrammMatrix               = FormatGrammMatrix(triangulation.triangles[i], triangulation.points, Amatrix);
                current.CountoursStructs          = GetBoundMatrixAndVector(i, triangulation, beta, sigma, uEnvironment);
                current.ProperScalarProductMatrix = d * GetIntegratedBasisMatrix(triangulation.triangles[i], triangulation.points);
                current.RightPart = GetRightPartVector(triangulation.triangles[i], triangulation.points, f);
                res.Add(current);
            }
            return(res);
        }
Beispiel #4
0
 public static Pair <double[, ], double[]> GetMatrixAndRightPart(MinimalAngleAlgorithm.TriangulationStructure triangulation, List <FEMmatrix.MatrixesOfFEM> femMatrixes)
 {
     double[,] generalMatrix = new double[triangulation.points.Count, triangulation.points.Count];
     double[] rightPart = new double[triangulation.points.Count];
     for (int i = 0; i < femMatrixes.Count; i++)
     {
         Triangle tr   = triangulation.triangles[i];
         Matrix   matr = femMatrixes[i].GrammMatrix;
         for (int j = 0; j < 3; j++)
         {
             for (int k = 0; k < 3; k++)
             {
                 generalMatrix[tr[j], tr[k]] += matr[j, k];
             }
         }
         matr = femMatrixes[i].ProperScalarProductMatrix;
         for (int j = 0; j < 3; j++)
         {
             for (int k = 0; k < 3; k++)
             {
                 generalMatrix[tr[j], tr[k]] += matr[j, k];
             }
         }
         var boundsMatr = femMatrixes[i].CountoursStructs;
         for (int j = 0; j < boundsMatr.Count; j++)
         {
             int[] indexes = new int[] { boundsMatr[j].First.FirstPoint, boundsMatr[j].First.SecondPoint };
             for (int k = 0; k < 2; k++)
             {
                 for (int l = 0; l < 2; l++)
                 {
                     generalMatrix[indexes[k], indexes[l]] += boundsMatr[j].First.Matrix[k, l];
                 }
                 rightPart[indexes[k]] += -boundsMatr[j].Second[k];
             }
         }
         for (int j = 0; j < 3; j++)
         {
             rightPart[tr[j]] += femMatrixes[i].RightPart[j];
         }
     }
     return(new Pair <double[, ], double[]>(generalMatrix, rightPart));
 }
Beispiel #5
0
        static List <Pair <BoundMatrix, double[]> > GetBoundMatrixAndVector(int triangle, MinimalAngleAlgorithm.TriangulationStructure triangulation, List <double> beta, List <double> sigma, List <double> uEnvironment)
        {
            var currentBoundaryMatrix = FindBoundSidesOfTriangle(triangle, triangulation);
            List <Pair <BoundMatrix, double[]> > res = new List <Pair <BoundMatrix, double[]> >();

            for (int i = 0; i < currentBoundaryMatrix.Count; i++)
            {
                BoundMatrix bmtr = currentBoundaryMatrix[i];
                if (beta[bmtr.NumberOfBound] == 0)
                {
                    beta[bmtr.NumberOfBound] = 1e-16;
                }
                //bmtr.Matrix = new Matrix(new double[,] { { 0, 0 }, { 0, 0 } });
                //res.Add(new Pair<BoundMatrix, double[]>(bmtr, new double[] { 0, 0 }));

                Matrix   matr  = GetBoundIntegralMatrix(triangulation, bmtr, sigma[bmtr.NumberOfBound], beta[bmtr.NumberOfBound]);
                double[] array = (-1 * matr) * (new double[] { uEnvironment[bmtr.NumberOfBound], uEnvironment[bmtr.NumberOfBound] });
                bmtr.Matrix = matr;
                res.Add(new Pair <BoundMatrix, double[]>(bmtr, array));
            }
            return(res);
        }
Beispiel #6
0
 public DisplayMatrix(MinimalAngleAlgorithm.TriangulationStructure triangulation)
 {
     InitializeComponent();
     comboBox1.SelectedIndex = 0;
     this.triangulation      = triangulation;
 }