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); }
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); }
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); }
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)); }
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); }
public DisplayMatrix(MinimalAngleAlgorithm.TriangulationStructure triangulation) { InitializeComponent(); comboBox1.SelectedIndex = 0; this.triangulation = triangulation; }