Ejemplo n.º 1
0
void KoulesSimulator::step(const ob::State *start, const oc::Control* control,
    const double t, ob::State *result)
{
    unsigned int ii;

    memcpy(&qcur_[0], start->as<KoulesStateSpace::StateType>()->values, numDimensions_ * sizeof(double));
    time_ = 0.;
    endTime_ = t;
    std::fill(dead_.begin(), dead_.end(), false);
    updateShip(control, t);
    for (unsigned int i = 0; i <= numKoules_; ++i)
    {
        ii = ind(i);
        dead_[i] = qcur_[ii] == -2. * kouleRadius;
        if (!dead_[i])
        {
            if (i)
                rungeKutta4(&qcur_[ii], t, &qnext_[ii]);
            qcur_[ii + 2] = (qnext_[ii    ] - qcur_[ii    ]) / t;
            qcur_[ii + 3] = (qnext_[ii + 1] - qcur_[ii + 1]) / t;
        }
    }
    initCollisionEvents();
    while (!collisionEvents_.empty())
    {
        CollisionEvent event = collisionEvents_.top();
        double ct = std::get<0>(event);
        unsigned int i = std::get<1>(event), j = std::get<2>(event);

        collisionEvents_.pop();
        advance(ct);
        if (j <= numKoules_)
            elasticCollision(i, j);
        else
        {
            markAsDead(i);
            if (i == 0)
            {
                memcpy(result->as<KoulesStateSpace::StateType>()->values, &qcur_[0], numDimensions_ * sizeof(double));
                return;
            }
        }

        for (unsigned int k = 0; k <= numKoules_ + 2; ++k)
        {
            if (k < i)
                computeCollisionEvent(k, i);
            else if (k > i && k != j)
                computeCollisionEvent(i, k);
            if (k < j && k != i)
                computeCollisionEvent(k, j);
            else if (k > j)
                computeCollisionEvent(j, k);
        }
    }
    advance(t);
    memcpy(result->as<KoulesStateSpace::StateType>()->values, &qcur_[0], numDimensions_ * sizeof(double));
}
Ejemplo n.º 2
0
int main( int argc, char **argv){

  /*
   * Define las variables
   */
  // El puntero que contiene los punteros de posicion para cada masa pequeña en cada instante de tiempo
  FLOAT **rm;
  // El puntero que contiene los punteros de velocidad para cada masa pequeña en cada instante de tiempo
  FLOAT **vm;
  // El puntero que contiene los punteros de posicion para cada masa Grande en cada instante de tiempo
  FLOAT **rM;
  // El puntero que contiene los punteros de velocidad para cada masa Grande en cada instante de tiempo
  FLOAT **vM;
  // EL archivo donde se guardaron las condiciones iniciales
  FILE *data;
  // Los archivos donde se guardara la evolucion
  FILE *data_evolve;
  FILE *data_vel;
  // El archivo donde se guardaran los ids
  FILE *data_id;
  // El numero de masas pequeñas
  int n_masses = 0;
  // El numero de masas grandes
  int n_Masses = 0;
  // El vector de masas grandes
  FLOAT *M;
  // El tiempo total de integracion (en años)
  FLOAT T;
  // El numero de iteraciones que se quiere sobre ese tiempo
  int N;
  // El nombre del archivo
  char *name;
  // Variable de iteracion
  int i;
  /*
   * Inicializa las variables que pueden ser inicializadas
   */
  N = atoi( argv[1] );
  T = atof( argv[2] );
  // El intervalo de tiempo sobre integracion
  FLOAT dt = T/N;
  name =  argv[3];
  
  // El archivo de texto de condiciones iniciales y de evolucion en el tiempo
  data = fopen( name, "r" );
  data_evolve = fopen( "evolve_c.dat", "w" );
  data_id = fopen( "id.dat", "w" );
  data_vel = fopen( "evolve_vel.dat", "w" );

  //-------------------------------------------------------------------------------------------------------------------
  //*******************************************************************************************************************
  
  /*
   * Lee el archivo y determina el numero de masas pequeñas y el numero de masas grandes (para poder apartar memoria)
   */
  FLOAT tmp1;
  int id;
  int test = fscanf(data, "%d %le %le %le %le %le\n", &id, &tmp1, &tmp1, &tmp1, &tmp1, &tmp1);
  if( id < 0 ){

    n_Masses++;
       
  }else{

    n_masses++;

  }
  
  do{
    
    test = fscanf(data, "%d %le %le %le %le %le\n", &id, &tmp1, &tmp1, &tmp1, &tmp1, &tmp1);
    if( id < 0 ){

      n_Masses++;
  
    }else{

      n_masses++;
   
    }

  }while( test!=EOF );
   
  
  // Cierra el archivo y lo vuelve a abrir
  fclose(data);
  fopen(name,"r");
  //*******************************************************************************************************************
  //-------------------------------------------------------------------------------------------------------------------
  
  /*
   * Aparta el espacio en memoria de los punteros
   */

  M = malloc( n_Masses*sizeof(FLOAT) );
  rm = allocate2d( n_masses, n_dim );
  rM = allocate2d( n_Masses, n_dim );
  vm = allocate2d( n_masses, n_dim );
  vM = allocate2d( n_Masses, n_dim );

  
  //-------------------------------------------------------------------------------------------------------------------
  //*******************************************************************************************************************

  /*
   * Lee el archivo de nuevo y asigna los valores iniciales de posicion y velocidad, ademas del vector de masas
   */

  FLOAT *Temp = malloc( 5*sizeof(FLOAT));
  int index = 0;
  int Index = 0;
  test = fscanf(data, "%d %le %le %le %le %le\n", &id, &Temp[0], &Temp[1], &Temp[2], &Temp[3], &Temp[4]);
  if( id < 0 ){
    
    fprintf( data_id, "%d\n", id );
    rM[0][Index] = Temp[0];
    rM[1][Index] = Temp[1];
    vM[0][Index] = Temp[2];
    vM[1][Index] = Temp[3];
    M[Index] = Temp[4];
    Index++;
  
  }else{
    
    fprintf( data_id, "%d\n", id );
    rm[0][index] = Temp[0];
    rm[1][index] = Temp[1];
    vm[0][index] = Temp[2];
    vm[1][index] = Temp[3];
    index++;
    
  }
  
  do{
  
    test = fscanf(data, "%d %le %le %le %le %le\n", &id, &Temp[0], &Temp[1], &Temp[2], &Temp[3], &Temp[4]);
    if( id < 0 ){
      
      fprintf( data_id, "%d\n", id );
      rM[0][Index] = Temp[0];
      rM[1][Index] = Temp[1];
      vM[0][Index] = Temp[2];
      vM[1][Index] = Temp[3];
      M[Index] = Temp[4];
      Index++;
      
    }else{
      
      fprintf( data_id, "%d\n", id );
      rm[0][index] = Temp[0];
      rm[1][index] = Temp[1];
      vm[0][index] = Temp[2];
      vm[1][index] = Temp[3];
      index++;

    }
  }while( test!=EOF );
      
  // Cierra el archivo
  free(Temp);
  fclose(data);

  //*******************************************************************************************************************
  //-------------------------------------------------------------------------------------------------------------------
  
  /*
   * Imprime la evolucion de los parametros en los archivos
   * Formato: x y z vx vy vz
   */
  //printf("M: %d\nm: %d\nM: %le\n", n_Masses, n_masses, M[0]); 
  
  for( i = 0; i < n_Masses; i++ ){
      
    // Escribe las posiciones y velocidades de n_masses
    fprintf( data_evolve, "%le %le ", rM[0][i], rM[1][i] ); 
    fprintf( data_vel, "%le %le ", vM[0][i], vM[1][i] ); 
  }
    
  for( i = 0; i < n_masses - 1; i++ ){
    
    // Escribe las posiciones y velocidades de n_Mmasses
    fprintf( data_evolve, "%le %le ", rm[0][i], rm[1][i] );
    fprintf( data_vel, "%le %le ", vm[0][i], vm[1][i] ); 

  }
  i = n_masses-1;
  fprintf( data_evolve, "%le %le\n", rm[0][i], rm[1][i] ); 
  fprintf( data_vel, "%le %le\n", vm[0][i], vm[1][i] );
      
  /*
   *  Método Runge-Kutta 4to orden sobre el equiespaciado temporal
   */
  int j;
  for( j = 0; j < N; j++ ){
    rungeKutta4( rm, vm, rM, vM, M, dt, n_masses, n_Masses );
      
    /*
     * Imprime la evolucion de los parametros en los archivos
     * Formato: x y z vx vy vz
     */
    
    for( i = 0; i < n_Masses; i++ ){
      
      // Escribe las posiciones y velocidades de n_masses
      fprintf( data_evolve, "%le %le ", rM[0][i], rM[1][i] ); 
      fprintf( data_vel, "%le %le ", vM[0][i], vM[1][i] ); 
    }
    
    for( i = 0; i < n_masses - 1; i++ ){
    
      // Escribe las posiciones y velocidades de n_Mmasses
      fprintf( data_evolve, "%le %le ", rm[0][i], rm[1][i] );
      fprintf( data_vel, "%le %le ", vm[0][i], vm[1][i] ); 

    }
    
    i = n_masses-1;
    fprintf( data_evolve, "%le %le\n", rm[0][i], rm[1][i] ); 
    fprintf( data_vel, "%le %le\n", vm[0][i], vm[1][i] );

  }
  
  fclose(data_evolve);
  fclose(data_vel);
  fclose(data_id);
  free(M);
  free(rm);
  free(rM);
  free(vm);
  free(vM);
  return 0;

}