Example #1
0
void *rk4_kernel( void *args ) {
    kernel_args arguments = *( (kernel_args *) args );
    vector k1, k2, k3, k4, initial, direction;
    vector *points_aux = NULL;
    size_t n_points_aux = 0, j = 0;

    set( &initial, arguments.v0[arguments.id] );
    set( &direction, arguments.field[DataSet::offset( arguments.n_x, arguments.n_y, 
         initial.x, initial.y, initial.z )] );
    points_aux = (vector *) malloc( arguments.max_points * sizeof(vector) );
    while ( module( direction ) > 0 && n_points_aux < arguments.max_points ) {
        n_points_aux++;
        set( &(points_aux[n_points_aux - 1]), initial);
        set( &k1, mult_scalar( direction, arguments.h ) );
        set( &k2, mult_scalar( trilinear_interpolation( sum( initial, mult_scalar( k1, 0.5 ) ),
             arguments.n_x, arguments.n_y, arguments.n_z, arguments.field ), arguments.h ) );
        set( &k3, mult_scalar( trilinear_interpolation( sum( initial, mult_scalar( k2, 0.5 ) ),
             arguments.n_x, arguments.n_y, arguments.n_z, arguments.field ), arguments.h ) );
        set( &k4, mult_scalar( trilinear_interpolation( sum( initial, k3 ),
             arguments.n_x, arguments.n_y, arguments.n_z, arguments.field ), arguments.h ) );
        set( &initial, sum( initial, sum( mult_scalar( k1 , 0.166666667 ), 
             sum( mult_scalar( k2, 0.333333333 ), sum( mult_scalar( k3, 0.333333333 ), 
             mult_scalar( k4, 0.166666667 ) ) ) ) ) );
        set( &direction, trilinear_interpolation( initial, arguments.n_x, arguments.n_y, arguments.n_z, 
             arguments.field ) );
    }
    (arguments.fibers)[arguments.id] = Fiber( n_points_aux );
    for ( j = 0; j < n_points_aux; j++ ) {
        (arguments.fibers)[arguments.id].setPoint( j, points_aux[j] );
    }
    free( points_aux );
    return NULL;
}
Example #2
0
void go_spheres(spheres *s, int i, int j,  int k, double t, vector_field field){
  vector v, v0;
  double mod;

  v0.x = (*s).all[i][j][k].x;
  v0.y = (*s).all[i][j][k].y;
  v0.z = (*s).all[i][j][k].z;

  v = trilinear_interpolation(v0, field);
  mod = module(v);
	
  if( v.x != 0.0 ) 
    (*s).all[i][j][k].x += t*mod*cos(angle_x(v)*PI/180);
  if( (*s).all[i][j][k].x > field.n_x/2 )
   (*s).all[i][j][k].x = field.n_x/2;
  else if( (*s).all[i][j][k].x < -(field.n_x)/2 )
   (*s).all[i][j][k].x = -(field.n_x)/2;

  if( v.y != 0.0 )
    (*s).all[i][j][k].y += t*mod*cos(angle_y(v)*PI/180);
  if( (*s).all[i][j][k].y > field.n_y/2 )
   (*s).all[i][j][k].y = field.n_y/2;
  else if( (*s).all[i][j][k].y < -field.n_y/2 )
   (*s).all[i][j][k].y = -(field.n_y)/2;

  if( v.z != 0.0 )
    (*s).all[i][j][k].z += t*mod*cos(angle_z(v)*PI/180);
  if( (*s).all[i][j][k].z > field.n_z/2 )
   (*s).all[i][j][k].z = field.n_z/2;
  else if( (*s).all[i][j][k].z < -(field.n_z)/2 )
   (*s).all[i][j][k].z = -(field.n_z)/2;
}