/// <summary> /// Run example /// </summary> public void Run() { // Format matrix output to console var formatProvider = (CultureInfo)CultureInfo.InvariantCulture.Clone(); formatProvider.TextInfo.ListSeparator = " "; // Create square matrix var matrix = new DenseMatrix(5); var k = 0; for (var i = 0; i < matrix.RowCount; i++) { for (var j = 0; j < matrix.ColumnCount; j++) { matrix[i, j] = k++; } } Console.WriteLine(@"Initial matrix"); Console.WriteLine(matrix.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // Create vector var vector = new DenseVector(new[] { 50.0, 51.0, 52.0, 53.0, 54.0 }); Console.WriteLine(@"Sample vector"); Console.WriteLine(vector.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 1. Insert new column var result = matrix.InsertColumn(3, vector); Console.WriteLine(@"1. Insert new column"); Console.WriteLine(result.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 2. Insert new row result = matrix.InsertRow(3, vector); Console.WriteLine(@"2. Insert new row"); Console.WriteLine(result.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 3. Set column values matrix.SetColumn(2, (Vector)vector); Console.WriteLine(@"3. Set column values"); Console.WriteLine(matrix.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 4. Set row values. matrix.SetRow(3, (double[])vector); Console.WriteLine(@"4. Set row values"); Console.WriteLine(matrix.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 5. Set diagonal values. SetRow/SetColumn/SetDiagonal accepts Vector and double[] as input parameter matrix.SetDiagonal(new[] { 5.0, 4.0, 3.0, 2.0, 1.0 }); Console.WriteLine(@"5. Set diagonal values"); Console.WriteLine(matrix.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 6. Set submatrix values matrix.SetSubMatrix(1, 3, 1, 3, DenseMatrix.Identity(3)); Console.WriteLine(@"6. Set submatrix values"); Console.WriteLine(matrix.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // Permutations. // Initialize a new instance of the Permutation class. An array represents where each integer is permuted too: // indices[i] represents that integer "i" is permuted to location indices[i] var permutations = new Permutation(new[] { 0, 1, 3, 2, 4 }); // 7. Permute rows 3 and 4 matrix.PermuteRows(permutations); Console.WriteLine(@"7. Permute rows 3 and 4"); Console.WriteLine(matrix.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 8. Permute columns 1 and 2, 3 and 5 permutations = new Permutation(new[] { 1, 0, 4, 3, 2 }); matrix.PermuteColumns(permutations); Console.WriteLine(@"8. Permute columns 1 and 2, 3 and 5"); Console.WriteLine(matrix.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 9. Concatenate the matrix with the given matrix var append = matrix.Append(matrix); // Concatenate into result matrix matrix.Append(matrix, append); Console.WriteLine(@"9. Append matrix to matrix"); Console.WriteLine(append.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 10. Stack the matrix on top of the given matrix matrix var stack = matrix.Stack(matrix); // Stack into result matrix matrix.Stack(matrix, stack); Console.WriteLine(@"10. Stack the matrix on top of the given matrix matrix"); Console.WriteLine(stack.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 11. Diagonally stack the matrix on top of the given matrix matrix var diagoinalStack = matrix.DiagonalStack(matrix); // Diagonally stack into result matrix matrix.DiagonalStack(matrix, diagoinalStack); Console.WriteLine(@"11. Diagonally stack the matrix on top of the given matrix matrix"); Console.WriteLine(diagoinalStack.ToString("#0.00\t", formatProvider)); Console.WriteLine(); }
public static ResultFEM Solve(Matrix<double> K, Matrix<double> f, int[] bc) { // Create dof array: int ndof = f.RowCount; // Initialize displacement vector Matrix u = new DenseMatrix(ndof, 1); int[] dof = new int[ndof]; for (int i = 0; i < ndof; i++) { dof[i] = i; } // Create the free dofs: int[] fdof = dof.Except(bc).ToArray(); int nfdof = fdof.Length; // Number of free dofs. int nbdof = ndof - nfdof; //Constrained dofs // Create the permutation array which puts the constrained dofs last: int[] permute = bc.Union(fdof).ToArray(); Permutation perm = new Permutation(permute); Permutation invPerm = perm.Inverse(); Matrix<double> KPermuted = DenseMatrix.OfMatrix(K); KPermuted.PermuteRows(invPerm); KPermuted.PermuteColumns(invPerm); // Split K::: Matrix<double> Kff = KPermuted.SubMatrix(nbdof, nfdof, nbdof, nfdof); System.Console.WriteLine(Kff); //Down right corner of matrix Matrix<double> Kfp = KPermuted.SubMatrix(nbdof, nfdof, 0, nbdof); //Down left corner of matrix // Split F::: Matrix<double> fPermuted = DenseMatrix.OfMatrix(f); fPermuted.PermuteRows(invPerm); Matrix<double> ff = fPermuted.SubMatrix(nbdof, nfdof, 0, 1); Matrix<double> up = u.SubMatrix(0, nbdof, 0, 1); // Must set up to constrained values in bc. // Solve for the unknown displacements::: Matrix<double> s = Kff.Solve(ff.Subtract(Kfp.Multiply(up))); u.SetSubMatrix(nbdof, 0, s); // Set displacements back. System.Console.WriteLine(u); // Permute back u u.PermuteRows(perm); System.Console.WriteLine("U after permut"); System.Console.WriteLine(K); System.Console.WriteLine(u); System.Console.WriteLine(f); // Get reaction forces: Matrix<double> Q = K.Multiply(u).Subtract(f); ResultFEM result = new ResultFEM(u, Q); return result; }