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