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