void CSimulation::RK(CSVector &pos_i, CSVector &vel_i, bool &delFlag, bool &succFlag, string name) { // http://doswa.com/2009/01/02/fourth-order-runge-kutta-numerical-integration.html float dt = m_par->dt; if (pos_i.magSquared() > this->m_SS.m_par->boundaryDistanceSquared) { cout << "OutofBounds for satellite "; delFlag = true; } else { CSVector pos[4], vel[4], acc[4]; pos[0] = pos_i; vel[0] = vel_i; acc[0] = CalcA(pos[0], name, delFlag, succFlag, dt / 2.0); pos[1] = pos_i + vel[0] * (dt * 0.5); vel[1] = vel_i + acc[0] * (dt * 0.5); acc[1] = CalcA(pos[1], name, delFlag, succFlag, dt / 2.0); pos[2] = pos_i + vel[1] * (dt * 0.5); vel[2] = vel_i + acc[1] * (dt * 0.5); acc[2] = CalcA(pos[2], name, delFlag, succFlag, dt / 2.0); pos[3] = pos_i + vel[2] * dt; vel[3] = vel_i + acc[2] * dt; acc[3] = CalcA(pos[3], name, delFlag, succFlag, dt); pos_i += (vel[0] + vel[1] * 2.0 + vel[2] * 2.0 + vel[3]) * (dt / 6.0); vel_i += (acc[0] + acc[1] * 2.0 + acc[2] * 2.0 + acc[3]) * (dt / 6.0); } return; }
void JacobiPolynomialAlpha :: Calc (int n, int alpha) { if (coefs.Size() < (n+1)*(alpha+1)) { coefs.SetSize ( /* 3* */ (n+1)*(alpha+1)); for (int a = 0; a <= alpha; a++) { for (int i = 1; i <= n; i++) { coefs[a*(n+1)+i][0] = CalcA (i, a, 0); coefs[a*(n+1)+i][1] = CalcB (i, a, 0); coefs[a*(n+1)+i][2] = CalcC (i, a, 0); } // ALWAYS_INLINE S P1(S x) const { return 0.5 * (2*(al+1)+(al+be+2)*(x-1)); } double al = a, be = 0; coefs[a*(n+1)+1][0] = 0.5 * (al+be+2); coefs[a*(n+1)+1][1] = 0.5 * (2*(al+1)-(al+be+2)); coefs[a*(n+1)+1][2] = 0.0; } maxnp = n+1; maxalpha = alpha; } }
void CSimulation::Euler(CSVector &pos_i, CSVector &vel_i, string name) { float dt = m_par->dt; CSVector new_pos = pos_i + vel_i * dt; bool temp = false; vel_i += CalcA(pos_i, name, temp, temp, dt) * dt; pos_i = new_pos; }
void CDM_FEA::CalcStiffness() //calculates the big stiffness matrix! { int NumEl = DOF/DOFperBlock*ELperDBlock + NumBonds*ELperOBlock; // - NumFixed; //approximate number of metablocks in our K matrix (overestimates slightly) if (a != NULL) {delete [] a; a = NULL;} a = new double[NumEl]; //values of sparse matrix if (ja != NULL) {delete [] ja; ja = NULL;} ja = new int[NumEl]; //columns each value is in if (ia != NULL) {delete [] ia; ia = NULL;} ia = new int[DOF+1]; //row index for (int i=0; i<NumEl; i++){ a[i] = 0; } //initialize A; CalciA(); CalcjA(); CalcA(); ConsolidateA(); //removes zeros, help, but only marginally. (maybe pardiso does this internally?) }
void IntLegNoBubble :: Calc (int n) { if (coefs.Size() > n) return; #pragma omp critical (calcintlegnobub) { if (coefs.Size() <= n) { coefs.SetSize (n+1); coefs[0][0] = coefs[0][1] = 1e10; // coefs[0][0] = -0.5; // coefs[1][1] = -0.5; for (int i = 1; i <= n; i++) { coefs[i][0] = CalcA(i); coefs[i][1] = CalcC(i); } } } }
void LegendrePolynomial :: Calc (int n) { if (coefs.Size() > n) return; #pragma omp critical (calclegendre) { if (coefs.Size() <= n) { coefs.SetSize (n+1); coefs[0][0] = 1; coefs[1][1] = 1; for (int i = 1; i <= n; i++) { coefs[i][0] = CalcA(i); // (2.0*i-1)/i; coefs[i][1] = CalcC(i); // (1.0-i)/i; } } } }