コード例 #1
0
ファイル: matrix.cs プロジェクト: mikity-mikity/RicecookerV3
        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;*/
            }
        }
コード例 #2
0
        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();
            }
        }
コード例 #3
0
ファイル: matrix.cs プロジェクト: mikity-mikity/RicecookerV3
        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++;
                }
            }
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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++;
                }
            }
        }
コード例 #6
0
        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);
        }
コード例 #7
0
ファイル: matrix.cs プロジェクト: mikity-mikity/RicecookerV3
        public static matrix zeros(int nRow, int nCol)
        {
            matrix res = new matrix(nRow, nCol, 0);

            return(res);
        }
コード例 #8
0
ファイル: matrix.cs プロジェクト: mikity-mikity/RicecookerV3
 private void inv1(matrix m)
 {
     this[0, 0] = 1 / m[0, 0];
 }
コード例 #9
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();
        }
コード例 #10
0
        //一辺に並ぶ積分点の数
        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();
        }