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); }
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); }