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