Esempio n. 1
0
        public void precompute(dl tup)
        {
            //Assume M[0] and M[1] are precomputed,

            //double[][,] M=new double[2][,];
            //M[0]=fM(uNum,_uDim,_uDim-1,uKnot);
            //M[1]=fM(vNum,_vDim,_vDim-1,vKnot);
            tup.internalIndex = this.index;
            tup.nNode         = nDV / 3;
            tup.elemDim       = elemDim;
            tup.shape         = new double[__DIM, nDV];                   //Global coordinate *coefficient*
            tup.C             = new double[elemDim, __DIM, nDV];          //Base vectors *coefficient*
            tup.B             = new double[elemDim, elemDim, nDV, nDV];   //Metric *coefficient*
            tup.D             = new double[elemDim, elemDim, __DIM, nDV]; //Hessian coefficient
            tup.d0            = new double[nDV / 3];
            tup.d1            = new double[elemDim][];
            tup.d2            = new double[elemDim, elemDim][];
            for (int i = 0; i < elemDim; i++)
            {
                tup.d1[i] = new double[nDV / 3];
            }
            for (int i = 0; i < elemDim; i++)
            {
                for (int j = 0; j < elemDim; j++)
                {
                    tup.d2[i, j] = new double[nDV / 3];
                }
            }

            //Shape functions  [N] (for global coordinate)
            double t = tup.lo;

            for (int k = 0; k < dim; k++)
            {
                hh[k] = Math.Pow(t, (dim - k - 1));
            }
            for (int k = 0; k < dim; k++)
            {
                double val = 0;
                for (int l = 0; l < dim; l++)
                {
                    val += hh[l] * M[l, k];
                }
                tt[k] = val;
            }
            for (int j = 0; j < __DIM; j++)
            {
                for (int k = 0; k < nDV; k++)
                {
                    tup.shape[j, k] = 0;
                }
            }
            for (int k = 0; k < nNode; k++)
            {
                //Shape functinos
                double shape = 1.0;
                shape *= tt[dd[k]];
                for (int j = 0; j < __DIM; j++)
                {
                    tup.shape[j, k *__DIM + j] = shape;
                }
            }
            //Create [C]  (for base vectors)
            t = tup.lo;
            {
                for (int k = 0; k < dim - 1; k++)
                {
                    hh[k] = (dim - k - 1) * Math.Pow(t, (dim - k - 2));
                }
                hh[dim - 1] = 0;
            }
            for (int k = 0; k < dim; k++)
            {
                double val = 0;
                for (int l = 0; l < dim; l++)
                {
                    val += hh[l] * M[l, k];
                }
                tt[k] = val;
            }
            for (int jj = 0; jj < __DIM; jj++)
            {
                for (int j = 0; j < nDV; j++)
                {
                    tup.C[0, jj, j] = 0;
                }
            }
            for (int k = 0; k < nNode; k++)
            {
                //[C]
                double C = 1.0;
                for (int j = 0; j < elemDim; j++)
                {
                    C *= tt[dd[k]];
                }
                for (int j = 0; j < __DIM; j++)
                {
                    tup.C[0, j, k *__DIM + j] = C;
                }
            }
            //Create [B]  (for metric)
            tup.CtoB(elemDim, nDV);
            //Create [D] (for second derivative)
            t = tup.lo;
            for (int k = 0; k < dim - 1; k++)
            {
                hh[k] = (dim - k - 1) * (dim - k - 2) * Math.Pow(t, (dim - k - 3));
            }
            hh[dim - 1] = 0;
            hh[dim - 2] = 0;

            for (int k = 0; k < dim; k++)
            {
                double val = 0;
                for (int l = 0; l < dim; l++)
                {
                    val += hh[l] * M[l, k];
                }
                tt[k] = val;
            }
            for (int jj = 0; jj < __DIM; jj++)
            {
                for (int j = 0; j < nDV; j++)
                {
                    tup.D[0, 0, jj, j] = 0;
                }
            }
            for (int k = 0; k < nNode; k++)
            {
                //[D]
                double D = 1.0;
                D *= tt[dd[k]];
                for (int j = 0; j < __DIM; j++)
                {
                    tup.D[0, 0, j, k *__DIM + j] = D;
                }
            }
            compute(tup);
        }
Esempio n. 2
0
        public void precompute(dl tup)
        {
            //Assume M[0] and M[1] are precomputed,

            //double[][,] M=new double[2][,];
            //M[0]=fM(uNum,_uDim,_uDim-1,uKnot);
            //M[1]=fM(vNum,_vDim,_vDim-1,vKnot);
            tup.internalIndex = this.index;
            tup.nNode = nDV / 3;
            tup.elemDim = elemDim;
            tup.shape = new double[__DIM, nDV];                        //Global coordinate *coefficient*
            tup.C = new double[elemDim, __DIM, nDV];                //Base vectors *coefficient*
            tup.B = new double[elemDim, elemDim, nDV, nDV];          //Metric *coefficient*
            tup.D = new double[elemDim, elemDim, __DIM, nDV];   //Hessian coefficient
            tup.d0 = new double[nDV / 3];
            tup.d1 = new double[elemDim][];
            tup.d2 = new double[elemDim, elemDim][];
            for (int i = 0; i < elemDim; i++)
            {
                tup.d1[i] = new double[nDV / 3];
            }
            for (int i = 0; i < elemDim; i++)
            {
                for (int j = 0; j < elemDim; j++)
                {
                    tup.d2[i, j] = new double[nDV / 3];
                }
            }

            //Shape functions  [N] (for global coordinate)
            double t = tup.lo;
            for (int k = 0; k < dim; k++)
            {
                hh[k] = Math.Pow(t, (dim - k - 1));
            }
            for (int k = 0; k < dim; k++)
            {
                double val = 0;
                for (int l = 0; l < dim; l++)
                {
                    val += hh[l] * M[l, k];
                }
                tt[k] = val;
            }
            for (int j = 0; j < __DIM; j++)
            {
                for (int k = 0; k < nDV; k++)
                {
                    tup.shape[j, k] = 0;
                }
            }
            for (int k = 0; k < nNode; k++)
            {
                //Shape functinos
                double shape = 1.0;
                shape *= tt[dd[k]];
                for (int j = 0; j < __DIM; j++)
                {
                    tup.shape[j, k * __DIM + j] = shape;
                }
            }
            //Create [C]  (for base vectors)
            t = tup.lo;
            {
                for (int k = 0; k < dim - 1; k++)
                {
                    hh[k] = (dim - k - 1) * Math.Pow(t, (dim - k - 2));
                }
                hh[dim - 1] = 0;
            }
            for (int k = 0; k < dim; k++)
            {
                double val = 0;
                for (int l = 0; l < dim; l++)
                {
                    val += hh[l] * M[l, k];
                }
                tt[k] = val;
            }
            for (int jj = 0; jj < __DIM; jj++)
            {
                for (int j = 0; j < nDV; j++)
                {
                    tup.C[0, jj, j] = 0;
                }
            }
            for (int k = 0; k < nNode; k++)
            {
                //[C]
                double C = 1.0;
                for (int j = 0; j < elemDim; j++)
                {
                    C *= tt[dd[k]];
                }
                for (int j = 0; j < __DIM; j++)
                {
                    tup.C[0, j, k * __DIM + j] = C;
                }
            }
            //Create [B]  (for metric)
            tup.CtoB(elemDim, nDV);
            //Create [D] (for second derivative)
            t = tup.lo;
            for (int k = 0; k < dim - 1; k++)
            {
                hh[k] = (dim - k - 1) * (dim - k - 2) * Math.Pow(t, (dim - k - 3));
            }
            hh[dim - 1] = 0;
            hh[dim - 2] = 0;

            for (int k = 0; k < dim; k++)
            {
                double val = 0;
                for (int l = 0; l < dim; l++)
                {
                    val += hh[l] * M[l, k];
                }
                tt[k] = val;
            }
            for (int jj = 0; jj < __DIM; jj++)
            {
                for (int j = 0; j < nDV; j++)
                {
                    tup.D[0, 0, jj, j] = 0;
                }
            }
            for (int k = 0; k < nNode; k++)
            {
                //[D]
                double D = 1.0;
                D *= tt[dd[k]];
                for (int j = 0; j < __DIM; j++)
                {
                    tup.D[0, 0, j, k * __DIM + j] = D;
                }
            }
            compute(tup);
        }