Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
  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;
      }
  }
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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?)

}
Ejemplo n.º 5
0
  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);
            }
        }
    }
  }
Ejemplo n.º 6
0
  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;
            }
        }
    }
  }