unsafe private void inv2(matrix m) { double __det = m.det2(); fixed(double *_ptr1 = &this.rawData[0, 0], _ptr2 = &m.rawData[0, 0]) { double *ptr1 = _ptr1; double *ptr2 = _ptr2; *(ptr1 + 0) = *(ptr2 + 3) / __det; *(ptr1 + 3) = *(ptr2 + 0) / __det; *(ptr1 + 1) = -*(ptr2 + 1) / __det; *(ptr1 + 2) = -*(ptr2 + 2) / __det; /*this[0, 0] = m[1, 1] / __det; * this[1, 1] = m[0, 0] / __det; * this[0, 1] = -m[0, 1] / __det; * this[1, 0] = -m[1, 0] / __det;*/ } }
unsafe public void CopyFrom(matrix m) { if (isCompatible(this, m)) { fixed(double *_ptr1 = &this.rawData[0, 0], _ptr2 = &m.rawData[0, 0]) { double *ptr1 = _ptr1; double *ptr2 = _ptr2; for (int i = 0; i < m.nRow * m.nCol; i++) { *ptr1 = *ptr2; ptr1++; ptr2++; } } } else { throw new mikity.Exceptions.SizeOfMatricesNotCompatibleException(); } }
unsafe public static void zeros(matrix m) { // for (int i = 0; i < m.nCol; i++) // { // for (int j = 0; j < m.nRow; j++) // { // m[i, j] = 0; // } // } int S = m.nCol * m.nRow; fixed(double *_ptr = &m.rawData[0, 0]) { double *ptr = _ptr; for (int i = 0; i < S; i++) { *ptr = 0; ptr++; } } }
unsafe public matrix Products(matrix m1, matrix m2) { double v = 0; int S = m1.nCol * m2.nRow; int K = m1.nCol; int n = m1.nRow; int m = m2.nCol; int r = m2.nCol; fixed(double *_ptr1 = &m1.rawData[0, 0], _ptr2 = &m2.rawData[0, 0], _ptr3 = &this.rawData[0, 0]) { double *ptr3 = _ptr3; //this double *ptr1 = _ptr1; //m1 double *ptr2 = _ptr2; //m2 double *ptr4 = _ptr1; //m1 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { v = 0; ptr1 = ptr4; ptr2 = _ptr2 + j; for (int k = 0; k < K; k++) { v += *ptr1 * *ptr2; ptr1++; ptr2 += r; } *ptr3 = v; ptr3++; } ptr4 += K; } } return(this); }
unsafe public static void y_equals_Ax(matrix A, vector x, vector y) { fixed(double *_ptr1 = &x.rawData[0], _ptr2 = &A.rawData[0, 0], _ptr3 = &y.rawData[0]) { double *ptr1 = _ptr1; double *ptr2 = _ptr2; double *ptr3 = _ptr3; for (int j = 0; j < A.nRow; j++) { ptr1 = _ptr1; double v = 0; for (int i = 0; i < A.nCol; i++) { v += *ptr2 * *ptr1; ptr1++; ptr2++; } *ptr3 = v; ptr3++; } } }
public static matrix Mult(matrix m1, matrix m2) { matrix res = new matrix(m1.nRow, m2.nCol, 0); /*if (!isCompatible(m1, m2,res)) * { * throw new mikity.Exceptions.SizeOfMatricesNotCompatibleException("v8idkd"); * }*/ if (m1.nCol != m2.nRow) { throw new mikity.Exceptions.SizeOfMatricesNotCompatibleException("v8idkd"); } for (int i = 0; i < res.nRow; i++) { for (int j = 0; j < res.nCol; j++) { for (int k = 0; k < m1.nCol; k++) { res[i, j] = res[i, j] + m1[i, k] * m2[k, j]; } } } return(res); }
public static matrix zeros(int nRow, int nCol) { matrix res = new matrix(nRow, nCol, 0); return(res); }
private void inv1(matrix m) { this[0, 0] = 1 / m[0, 0]; }
public isoparametricElement(params int[] _el) : base(_el) { if (this.nNodes == 2) { __N = 1; } else if (this.nNodes == 4) { __N = 2; } else if (this.nNodes == 8) { __N = 3; } else { throw new mikity.Exceptions.NumberOfNodesIncompatibleException("Isoparametric element only accept 2,4,8 nodes."); } nNodes = this.nNodes; nIntPoints = mikity.MathUtil.__pow_INT_INT(nIntMed, __N); nVisPoints = mikity.MathUtil.__pow_INT_INT(nVisMed, __N); intPoints = new integralPoint[nIntPoints]; this.nodes = new matrix(this.nNodes, this.__dim); for (int i = 0; i < intPoints.Length; i++) { intPoints[i] = new integralPoint(__N, this.nodes, this.__dim); } //形状関数生成用数列 psi = mikity.MathUtil.generate(__N, 2); phi = -2 * psi + 1; psi2 = mikity.MathUtil.generate(__N, nIntMed); psi3 = mikity.MathUtil.generate(__N, nVisMed); //積分点要素内座標生成 for (int i = 0; i < nIntPoints; i++) { double[] t = new double[__N]; for (int j = 0; j < __N; j++) { t[j] = __u[psi2[i, j]]; } intPoints[i].setLocalCoordinates(t); } //積分点積分用重み生成 for (int i = 0; i < nIntPoints; i++) { double w = 1.0d; for (int j = 0; j < __N; j++) { w *= __w[psi2[i, j]]; } intPoints[i].setIntegralWeights(w); } //重み算出用補助数列生成 for (int i = 0; i < nIntPoints; i++) { mikity.LinearAlgebra.matrix T = new mikity.LinearAlgebra.matrix(nNodes, __N); for (int j = 0; j < nNodes; j++) { for (int k = 0; k < __N; k++) { T[j, k] = intPoints[i].localCoordinates(k) * phi[j, k] + psi[j, k]; } } intPoints[i].setHelperNumber(T); } //積分点位置ベクトル算出用重み生成 for (int i = 0; i < nIntPoints; i++) { mikity.LinearAlgebra.vector tt = new mikity.LinearAlgebra.vector(nNodes); for (int j = 0; j < nNodes; j++) { tt[j] = 1.0d; for (int k = 0; k < __N; k++) { tt[j] *= (intPoints[i].Tij[j, k]); } } intPoints[i].setNodeWeights(tt); } //積分点基底ベクトル算出用重み生成 for (int i = 0; i < nIntPoints; i++) { mikity.LinearAlgebra.matrix ttt = new mikity.LinearAlgebra.matrix(nNodes, __N); for (int j = 0; j < nNodes; j++) { for (int k = 0; k < __N; k++) { ttt[j, k] = intPoints[i].wp[j] / (intPoints[i].Tij[j, k]) * phi[j, k]; } } intPoints[i].setBaseWeights(ttt); } this.makeBoundary(); }
//一辺に並ぶ積分点の数 public simplexElement(int[] _el) : base(_el) { __N = _el.Length - 1; if (__N < 1) { throw new mikity.Exceptions.NumberOfNodesIncompatibleException("Simplex element only accept 2,3,4 nodes."); } if (__N > 3) { throw new mikity.Exceptions.NumberOfNodesIncompatibleException("Simplex element only accept 2,3,4 nodes."); } nIntPoints = 1; nVisPoints = 1; intPoints = new integralPoint[nIntPoints]; this.nodes = new matrix(this.nNodes, this.__dim); for (int i = 0; i < intPoints.Length; i++) { intPoints[i] = new integralPoint(__N, this.nodes, this.__dim); } //積分点要素内座標生成 for (int i = 0; i < nIntPoints; i++) { double[] t = new double[__N]; double F = __N + 1; for (int j = 0; j < __N; j++) { t[j] = (double)j / F; } intPoints[i].setLocalCoordinates(t); } //積分点積分用重み生成 for (int i = 0; i < nIntPoints; i++) { double w = 1.0d; for (int j = 1; j <= __N; j++) { w /= (double)j; } intPoints[i].setIntegralWeights(w); } //積分点位置ベクトル算出用重み生成 for (int i = 0; i < nIntPoints; i++) { mikity.LinearAlgebra.vector tt = new mikity.LinearAlgebra.vector(nNodes); if (__N == 1) { tt[0] = intPoints[i].localCoordinates(0); tt[1] = -intPoints[i].localCoordinates(0) + 1; } if (__N == 2) { tt[0] = intPoints[i].localCoordinates(0); tt[1] = -intPoints[i].localCoordinates(0) + intPoints[i].localCoordinates(1); tt[2] = -intPoints[i].localCoordinates(1) + 1; } if (__N == 3) { tt[0] = intPoints[i].localCoordinates(0); tt[1] = -intPoints[i].localCoordinates(0) + intPoints[i].localCoordinates(1); tt[1] = -intPoints[i].localCoordinates(1) + intPoints[i].localCoordinates(2); tt[2] = -intPoints[i].localCoordinates(2) + 1; } intPoints[i].setNodeWeights(tt); } //積分点基底ベクトル算出用重み生成 for (int i = 0; i < nIntPoints; i++) { mikity.LinearAlgebra.matrix ttt = new mikity.LinearAlgebra.matrix(nNodes, __N); if (__N == 1) { ttt[0, 0] = 1; ttt[1, 0] = -1; } if (__N == 2) { ttt[0, 0] = 1; ttt[1, 0] = -1; ttt[1, 1] = 1; ttt[2, 1] = -1; } if (__N == 3) { ttt[0, 0] = 1; ttt[1, 0] = -1; ttt[1, 1] = 1; ttt[2, 1] = -1; ttt[2, 2] = 1; ttt[3, 2] = -1; } intPoints[i].setBaseWeights(ttt); } this.makeBoundary(); }