Exemple #1
0
        public static int[][] isoparametricElements(int[] nEdgeNodes)
        {
            int _dim = nEdgeNodes.Length;

            int[] nEdgeElements = new int[_dim];
            for (int i = 0; i < _dim; i++)
            {
                nEdgeElements[i] = nEdgeNodes[i] - 1;
            }
            //要素数
            int nElements = MathUtil.factorial(nEdgeElements);
            int _nNodes   = __pow_INT_INT(2, _dim);

            int[][] el = new int[nElements][];
            for (int i = 0; i < nElements; i++)
            {
                el[i] = new int[_nNodes];
            }
            //要素生成
            {
                //要素生成用数列(オフセット値)
                matrixINT psi3 = mikity.MathUtil.generate(_dim, nEdgeElements);
                //もととなる要素
                matrixINT psi4 = mikity.MathUtil.psi[_dim - 1];
                int[]     ss   = new int[_dim];
                ss[0] = 1;
                for (int k = 1; k < _dim; k++)
                {
                    ss[k] = ss[k - 1] * nEdgeNodes[k - 1];
                }
                for (int i = 0; i < nElements; i++)
                {
                    int s = 0;
                    for (int k = 0; k < _dim; k++)
                    {
                        s += psi3[i, k] * ss[k];
                    }
                    for (int j = 0; j < _nNodes; j++)
                    {
                        int tt = s;
                        for (int k = 0; k < _dim; k++)
                        {
                            tt += psi4[j, k] * ss[k];
                        }
                        el[i][j] = tt;
                    }
                }
            }
            return(el);
        }
Exemple #2
0
        public static double[,] bicubic(int _dim, int[] nEdgeNodes)
        {
            int _nNodes = __pow_INT_INT(2, _dim);
            //点群生成用数列生成
            matrixINT psi2      = mikity.MathUtil.generate(_dim, nEdgeNodes);
            int       nNewNodes = psi2.nRow;

            //要素内座標生成元
            double[][] __u = new double[_dim][];
            for (int i = 0; i < _dim; i++)
            {
                __u[i] = new double[nEdgeNodes[i]];
            }
            //等分
            for (int j = 0; j < _dim; j++)
            {
                for (int i = 0; i < __u[j].Length; i++)
                {
                    __u[j][i] = i * (1.0d / (nEdgeNodes[j] - 1));
                }
            }
            //要素内座標
            double[,] co = new double[nNewNodes, _dim];
            for (int i = 0; i < nNewNodes; i++)
            {
                for (int j = 0; j < _dim; j++)
                {
                    co[i, j] = __u[j][psi2[i, j]];
                }
            }
            //位置ベクトルに付加する重み
            double[,] wt = matrix.zeros(nNewNodes, _nNodes);
            matrixINT phi = MathUtil.phi[_dim - 1];
            matrixINT psi = MathUtil.psi[_dim - 1];

            for (int i = 0; i < nNewNodes; i++)
            {
                for (int j = 0; j < _nNodes; j++)
                {
                    wt[i, j] = 1.0;
                    for (int k = 0; k < _dim; k++)
                    {
                        wt[i, j] = wt[i, j] * (co[i, k] * phi[j, k] + psi[j, k]);
                    }
                }
            }
            return(wt);
        }
 /// <summary>
 ///
 /// </summary>
 /// <param name="N">要素の次元</param>
 /// <param name="dim">1節点の自由度、3か6が普通</param>
 public integralPoint(int N, matrix _nodes, int dim) : base()
 {
     //親要素の節点
     this.nodes       = _nodes;
     __N              = N;
     this.dof         = __dim * _nodes.nRow;
     metric           = new matrix(N, N).eye();
     refMetric        = new matrix(N, N).zeros();
     invMetric        = new matrix(N, N).eye();
     refInvMetric     = new matrix(N, N).eye();
     stress           = new matrix(N, N).eye();
     stress2          = new matrix(N, N).eye();
     strain           = new matrix(N, N).zeros();
     difMetric        = new matrixVector(N, N, dof);
     covariantBases   = new matrix(N, __dim).zeros();
     number           = new matrixINT(N, N).zeros();
     gravity          = new vector(dim).zeros();
     gravity[dim - 1] = 1.0;
     energyDensity    = 0;
 }
 protected override void makeBoundary()
 {
     ///The number of the nodes is __N+1
     ///The number of the nodes of the boundary should be __N
     boundary = new matrixINT(this.__N + 1, __N);
     for (int i = 0; i < __N; i++)
     {
         for (int k = i; k < __N + i; k++)
         {
             if (k > __N)
             {
                 boundary[i, k - 1] = k - __N - 1;
             }
             else
             {
                 boundary[i, k - i] = k;
             }
         }
     }
 }
        protected override void makeBoundary()
        {
            boundary = new matrixINT(this.__N * 2, mikity.MathUtil.__pow_INT_INT(2, __N - 1));
            if (this.__N == 3)
            {
                boundary[0, 0] = this.el[0];
                boundary[0, 1] = this.el[1];
                boundary[0, 2] = this.el[3];
                boundary[0, 3] = this.el[2];

                boundary[1, 0] = this.el[4];
                boundary[1, 1] = this.el[5];
                boundary[1, 2] = this.el[7];
                boundary[1, 3] = this.el[6];

                boundary[2, 0] = this.el[0];
                boundary[2, 1] = this.el[1];
                boundary[2, 2] = this.el[5];
                boundary[2, 3] = this.el[4];

                boundary[3, 0] = this.el[2];
                boundary[3, 1] = this.el[3];
                boundary[3, 2] = this.el[7];
                boundary[3, 3] = this.el[6];

                boundary[4, 0] = this.el[0];
                boundary[4, 1] = this.el[2];
                boundary[4, 2] = this.el[6];
                boundary[4, 3] = this.el[4];

                boundary[5, 0] = this.el[1];
                boundary[5, 1] = this.el[3];
                boundary[5, 2] = this.el[7];
                boundary[5, 3] = this.el[5];
            }
        }
        public static void begin()
        {
            _initializing = true;
            //色々初期化
            nParticles  = __initialParticles.Count;
            DOF         = dimension * nParticles;
            __particles = new matrix(nParticles, FriedChiken.dimension).zeros();
            index       = new matrixINT(nParticles, dimension);
            for (int i = 0; i < nParticles; i++)
            {
                for (int k = 0; k < dimension; k++)
                {
                    __particles[i, k] = __initialParticles[i][k] /* +(r.NextDouble() - 0.5) * 0.0001*/;
                    index[i, k]       = __index[i][k];
                }
            }
            //initializing masking vector
            __mask  = new vector(DOF).zeros();
            numCond = 0;
            foreach (particleSystem p in particleSystems)
            {
                p.copy(FriedChiken.__particles);
                p.begin();
            }
            if (fixX)
            {
                for (int i = 0; i < nParticles; i++)
                {
                    __mask[index[i, 0]] = 1;
                }
            }
            if (fixY)
            {
                for (int i = 0; i < nParticles; i++)
                {
                    __mask[index[i, 1]] = 1;
                }
            }
            if (fixZ)
            {
                for (int i = 0; i < nParticles; i++)
                {
                    __mask[index[i, 2]] = 1;
                }
            }
            if (numCond > 0)
            {
                FriedChiken.residual = new vector(numCond).zeros();
                FriedChiken.jacobian = new matrix(numCond, DOF).zeros();
            }
            else
            {
                FriedChiken.residual = null;
                FriedChiken.jacobian = null;
            }
            FriedChiken.gradient = new vector(DOF).zeros();
            FriedChiken.load     = new vector(DOF).zeros();
            FriedChiken.omega    = new vector(DOF).zeros();
            FriedChiken.reaction = new vector(DOF).zeros();
            FriedChiken.x        = new vector(DOF).zeros();
            __particles.DecomposeTo(FriedChiken.x);
            FriedChiken.q   = new vector(DOF).zeros();
            FriedChiken.r   = new vector(DOF).zeros();
            FriedChiken._q  = new vector(DOF).zeros();
            FriedChiken._r  = new vector(DOF).zeros();
            FriedChiken.__q = new vector(DOF).zeros();
            FriedChiken.__r = new vector(DOF).zeros();
            _initializing   = false;
            _isInit         = true;

            Random r = new Random(0);

            for (int i = 0; i < nParticles; i++)
            {
                for (int k = 0; k < dimension; k++)
                {
                    __particles[i, k] = __particles[i, k] + (r.NextDouble() - 0.5) * 0.001;
                }
            }
            __particles.DecomposeTo(FriedChiken.x);
        }
 protected virtual void makeBoundary()
 {
     boundary = new matrixINT(1, 1).zeros();
 }