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 int_quad(t_inter *pt, void *e, t_ray ray, t_light *light) { t_quad quad; double t; t_vec inter; quad = *((t_quad *)e); t = get_dist(ray, quad); if (t < 0) return ; if (pt->dist == NULL || *(pt->dist) > t) { if (pt->dist == NULL) pt->dist = malloc(sizeof(double)); free_info(pt); *(pt->dist) = t; inter = get_inter(ray, t); pt->normal = get_normal_quad(inter, quad); if (scalar_prod(pt->normal, ray.dir) > 0) pt->normal = mult_scalar(pt->normal, -1); pt->refl = get_refl(ray, pt->normal); pt->color = quad.color; pt->inter = inter; get_info(pt, light, inter); } }
vector trilinear_interpolation( vector v0, int n_x, int n_y, int n_z, vector_field field ) { int x1, y1, z1, x0, y0, z0; double xd, yd, zd; vector P1, P2, P3, P4, P5, P6, P7, P8, X1, X2, X3, X4, Y1, Y2, final; x1 = ceil( v0.x ); y1 = ceil( v0.y ); z1 = ceil( v0.z ); x0 = floor( v0.x ); y0 = floor( v0.y ); z0 = floor( v0.z ); xd = v0.x - x0; yd = v0.y - y0; zd = v0.z - z0; if ( x1 >= n_x || y1 >= n_y || z1 >= n_z || x0 < 0 || y0 < 0 || z0 < 0 ) { return nearest_neighbour( v0, n_x, n_y, n_z, field ); } else { set( &P1, field[DataSet::offset( n_x, n_y, x0, y0, z0 )] ); set( &P2, field[DataSet::offset( n_x, n_y, x1, y0, z0 )] ); set( &P3, field[DataSet::offset( n_x, n_y, x0, y0, z1 )] ); set( &P4, field[DataSet::offset( n_x, n_y, x1, y0, z1 )] ); set( &P5, field[DataSet::offset( n_x, n_y, x0, y1, z0 )] ); set( &P6, field[DataSet::offset( n_x, n_y, x1, y1, z0 )] ); set( &P7, field[DataSet::offset( n_x, n_y, x0, y1, z1 )] ); set( &P8, field[DataSet::offset( n_x, n_y, x1, y1, z1 )] ); set( &X1, sum( P1, mult_scalar( subtract( P2, P1 ), xd ) ) ); set( &X2, sum( P3, mult_scalar( subtract( P4, P3 ), xd ) ) ); set( &X3, sum( P5, mult_scalar( subtract( P6, P5 ), xd ) ) ); set( &X4, sum( P7, mult_scalar( subtract( P8, P7 ), xd ) ) ); set( &Y1, sum( X1, mult_scalar( subtract( X3, X1 ), yd ) ) ); set( &Y2, sum( X2, mult_scalar( subtract( X4, X2 ), yd ) ) ); set( &final, sum( Y1, mult_scalar( subtract( Y2, Y1 ), zd ) ) ); return final; } }
/****************************************************************************** FUNCTION: transform ******************************************************************************/ void transform(const int dir, const int xn[4], const Real center[4], su2_matrix *ptau[4], su2_matrix *psu2_link) { Real x[4]; /* position component */ Real norm_current; /* normalization factor at current site */ Real norm_next; /* normalization factor at next site */ complex scalar; /* scalar factor */ su2_matrix prod; /* matrix product */ su2_matrix *pprod; /* pointer to matrix product */ su2_matrix gauge; /* guage transformation matrix */ su2_matrix *pgauge; /* pointer to gauge transformation matrix*/ su2_matrix inv; /* inverse gauge transformation */ su2_matrix *pinv; /* pointer to inverse gauge transformation */ su2_matrix temp; /* holding matrix */ su2_matrix *ptemp; /* pointer to holding matrix */ int k; /* index over forward directions */ int p; /* index over matrix row */ int q; /* index over matrix column */ /* set position components of current site relative to instanton center */ for (k = 0; k < 4; k++) { x[k] = (Real)xn[k] - center[k]; } /* set normalization factor of current site */ norm_current = sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2] + x[3] * x[3]); /* initialize pointers to matrices */ pprod = ∏ pgauge = &gauge; pinv = &inv; ptemp = &temp; /* set instanton link value */ switch (dir) { case 0: norm_next = sqrt((x[0] + 1.0) * (x[0] + 1.0) + x[1] * x[1] + x[2] * x[2] + x[3] * x[3]); scalar.real = 0.0; scalar.imag = (x[0] + 1.0) / norm_next; mult_scalar(pgauge, scalar, ptau[0]); scalar.real = 0.0; scalar.imag = x[1] / norm_next; mult_scalar(pprod, scalar, ptau[1]); sum_su2(pgauge, pprod); scalar.real = 0.0; scalar.imag = x[2] / norm_next; mult_scalar(pprod, scalar, ptau[2]); sum_su2(pgauge, pprod); scalar.real = x[3] / norm_next; scalar.imag = 0.0; mult_scalar(pprod, scalar, ptau[3]); sum_su2(pgauge, pprod); scalar.real = 0.0; scalar.imag = -x[0] / norm_current; mult_scalar(pinv, scalar, ptau[0]); scalar.real = 0.0; scalar.imag = -x[1] / norm_current; mult_scalar(pprod, scalar, ptau[1]); sum_su2(pinv, pprod); scalar.real = 0.0; scalar.imag = -x[2] / norm_current; mult_scalar(pprod, scalar, ptau[2]); sum_su2(pinv, pprod); scalar.real = x[3] / norm_current; scalar.imag = 0.0; mult_scalar(pprod, scalar, ptau[3]); sum_su2(pinv, pprod); break; case 1: norm_next = sqrt(x[0] * x[0] + (x[1] + 1.0) * (x[1] + 1.0) + x[2] * x[2] + x[3] * x[3]); scalar.real = 0.0; scalar.imag = x[0] / norm_next; mult_scalar(pgauge, scalar, ptau[0]); scalar.real = 0.0; scalar.imag = (x[1] + 1.0) / norm_next; mult_scalar(pprod, scalar, ptau[1]); sum_su2(pgauge, pprod); scalar.real = 0.0; scalar.imag = x[2] / norm_next; mult_scalar(pprod, scalar, ptau[2]); sum_su2(pgauge, pprod); scalar.real = x[3] / norm_next; scalar.imag = 0.0; mult_scalar(pprod, scalar, ptau[3]); sum_su2(pgauge, pprod); scalar.real = 0.0; scalar.imag = -x[0] / norm_current; mult_scalar(pinv, scalar, ptau[0]); scalar.real = 0.0; scalar.imag = -x[1] / norm_current; mult_scalar(pprod, scalar, ptau[1]); sum_su2(pinv, pprod); scalar.real = 0.0; scalar.imag = -x[2] / norm_current; mult_scalar(pprod, scalar, ptau[2]); sum_su2(pinv, pprod); scalar.real = x[3] / norm_current; scalar.imag = 0.0; mult_scalar(pprod, scalar, ptau[3]); sum_su2(pinv, pprod); break; case 2: norm_next = sqrt(x[0] * x[0] + x[1] * x[1] + (x[2] + 1.0) * (x[2] + 1.0) + x[3] * x[3]); scalar.real = 0.0; scalar.imag = x[0] / norm_next; mult_scalar(pgauge, scalar, ptau[0]); scalar.real = 0.0; scalar.imag = x[1] / norm_next; mult_scalar(pprod, scalar, ptau[1]); sum_su2(pgauge, pprod); scalar.real = 0.0; scalar.imag = (x[2] + 1.0) / norm_next; mult_scalar(pprod, scalar, ptau[2]); sum_su2(pgauge, pprod); scalar.real = x[3] / norm_next; scalar.imag = 0.0; mult_scalar(pprod, scalar, ptau[3]); sum_su2(pgauge, pprod); scalar.real = 0.0; scalar.imag = -x[0] / norm_current; mult_scalar(pinv, scalar, ptau[0]); scalar.real = 0.0; scalar.imag = -x[1] / norm_current; mult_scalar(pprod, scalar, ptau[1]); sum_su2(pinv, pprod); scalar.real = 0.0; scalar.imag = -x[2] / norm_current; mult_scalar(pprod, scalar, ptau[2]); sum_su2(pinv, pprod); scalar.real = x[3] / norm_current; scalar.imag = 0.0; mult_scalar(pprod, scalar, ptau[3]); sum_su2(pinv, pprod); break; case 3: norm_next = sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2] + (x[3] + 1.0) * (x[3] + 1.0)); scalar.real = 0.0; scalar.imag = x[0] / norm_next; mult_scalar(pgauge, scalar, ptau[0]); scalar.real = 0.0; scalar.imag = x[1] / norm_next; mult_scalar(pprod, scalar, ptau[1]); sum_su2(pgauge, pprod); scalar.real = 0.0; scalar.imag = x[2] / norm_next; mult_scalar(pprod, scalar, ptau[2]); sum_su2(pgauge, pprod); scalar.real = (x[3] + 1.0) / norm_next; scalar.imag = 0.0; mult_scalar(pprod, scalar, ptau[3]); sum_su2(pgauge, pprod); scalar.real = 0.0; scalar.imag = -x[0] / norm_current; mult_scalar(pinv, scalar, ptau[0]); scalar.real = 0.0; scalar.imag = -x[1] / norm_current; mult_scalar(pprod, scalar, ptau[1]); sum_su2(pinv, pprod); scalar.real = 0.0; scalar.imag = -x[2] / norm_current; mult_scalar(pprod, scalar, ptau[2]); sum_su2(pinv, pprod); scalar.real = x[3] / norm_current; scalar.imag = 0.0; mult_scalar(pprod, scalar, ptau[3]); sum_su2(pinv, pprod); break; } for (p = 0; p < 2; p++) { for (q = 0; q < 2; q++) { ptemp->e[p][q].real = psu2_link->e[p][q].real; ptemp->e[p][q].imag = psu2_link->e[p][q].imag; } } mult_su2(psu2_link, ptemp, pgauge); for (p = 0; p < 2; p++) { for (q = 0; q < 2; q++) { ptemp->e[p][q].real = psu2_link->e[p][q].real; ptemp->e[p][q].imag = psu2_link->e[p][q].imag; } } mult_su2(psu2_link, pinv, ptemp); }
/****************************************************************************** FUNCTION: calc_su2_instanton_link ******************************************************************************/ void calc_su2_instanton_link(const int dir, const int xn[4], const Real center[4], const Real rho, su2_matrix *ptau[4], su2_matrix *psu2_link) { Real x[4]; /* position component */ Real normalization; /* normalization for unit 3-vector */ Real shape; /* shape factor, averaged over link */ Real theta; /* parameter in SU(2) exponential */ complex scalar; /* scalar factor */ su2_matrix prod; /* matrix product */ su2_matrix *pprod; /* pointer to matrix product */ int k; /* index over forward directions */ int p; /* index over matrix row */ int q; /* index over matrix column */ int m; /* index over link increments */ /* initialize link to zero */ for (p = 0; p < 2; p++) { for (q = 0; q < 2; q++) { psu2_link->e[p][q].real = 0.0; psu2_link->e[p][q].imag = 0.0; } } /* set position components of current site relative to instanton center */ for (k = 0; k < 4; k++) { x[k] = (Real)xn[k] - center[k]; } /* initialize shape factor */ shape = 0.0; /* initialize pointer to matrix product */ pprod = ∏ /* set instanton link value */ switch (dir) { case 0: normalization = 1.0 / sqrt(x[1] * x[1] + x[2] * x[2] + x[3] * x[3]); for (m = 0; m < SUBLINK; m++) { shape += 1.0 / ((x[0] + m / (SUBLINK - 1.0)) * (x[0] + m / (SUBLINK - 1.0)) + x[1] * x[1] + x[2] * x[2] + x[3] * x[3] + rho * rho); } shape /= (Real)SUBLINK; theta = - shape / normalization; scalar.real = 0.0; scalar.imag = x[3] * sin(theta) * normalization; mult_scalar(pprod, scalar, ptau[0]); sum_su2(psu2_link, pprod); scalar.real = 0.0; scalar.imag = -x[2] * sin(theta) * normalization; mult_scalar(pprod, scalar, ptau[1]); sum_su2(psu2_link, pprod); scalar.real = 0.0; scalar.imag = x[1] * sin(theta) * normalization; mult_scalar(pprod, scalar, ptau[2]); sum_su2(psu2_link, pprod); scalar.real = cos(theta); scalar.imag = 0.0; mult_scalar(pprod, scalar, ptau[3]); sum_su2(psu2_link, pprod); break; case 1: normalization = 1.0 / sqrt(x[0] * x[0] + x[2] * x[2] + x[3] * x[3]); for (m = 0; m < SUBLINK; m++) { shape += 1.0 / (x[0] * x[0] + (x[1] + m / (SUBLINK - 1.0)) * (x[1] + m / (SUBLINK - 1.0)) + x[2] * x[2] + x[3] * x[3] + rho * rho); } shape /= (Real)SUBLINK; theta = - shape / normalization; scalar.real = 0.0; scalar.imag = x[2] * sin(theta) * normalization; mult_scalar(pprod, scalar, ptau[0]); sum_su2(psu2_link, pprod); scalar.real = 0.0; scalar.imag = x[3] * sin(theta) * normalization; mult_scalar(pprod, scalar, ptau[1]); sum_su2(psu2_link, pprod); scalar.real = 0.0; scalar.imag = -x[0] * sin(theta) * normalization; mult_scalar(pprod, scalar, ptau[2]); sum_su2(psu2_link, pprod); scalar.real = cos(theta); scalar.imag = 0.0; mult_scalar(pprod, scalar, ptau[3]); sum_su2(psu2_link, pprod); break; case 2: normalization = 1.0 / sqrt(x[0] * x[0] + x[1] * x[1] + x[3] * x[3]); for (m = 0; m < SUBLINK; m++) { shape += 1.0 / (x[0] * x[0] + x[1] * x[1] + (x[2] + m / (SUBLINK - 1.0)) * (x[2] + m / (SUBLINK - 1.0)) + x[3] * x[3] + rho * rho); } shape /= (Real)SUBLINK; theta = - shape / normalization; scalar.real = 0.0; scalar.imag = -x[1] * sin(theta) * normalization; mult_scalar(pprod, scalar, ptau[0]); sum_su2(psu2_link, pprod); scalar.real = 0.0; scalar.imag = x[0] * sin(theta) * normalization; mult_scalar(pprod, scalar, ptau[1]); sum_su2(psu2_link, pprod); scalar.real = 0.0; scalar.imag = x[3] * sin(theta) * normalization; mult_scalar(pprod, scalar, ptau[2]); sum_su2(psu2_link, pprod); scalar.real = cos(theta); scalar.imag = 0.0; mult_scalar(pprod, scalar, ptau[3]); sum_su2(psu2_link, pprod); break; case 3: normalization = 1.0 / sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2]); for (m = 0; m < SUBLINK; m++) { shape += 1.0 / (x[0] * x[0] + x[1] * x[1] + x[2] * x[2] + (x[3] + m / (SUBLINK - 1.0)) * (x[3] + m / (SUBLINK - 1.0)) + rho * rho); } shape /= (Real)SUBLINK; theta = + shape / normalization; scalar.real = 0.0; scalar.imag = x[0] * sin(theta) * normalization; mult_scalar(pprod, scalar, ptau[0]); sum_su2(psu2_link, pprod); scalar.real = 0.0; scalar.imag = x[1] * sin(theta) * normalization; mult_scalar(pprod, scalar, ptau[1]); sum_su2(psu2_link, pprod); scalar.real = 0.0; scalar.imag = x[2] * sin(theta) * normalization; mult_scalar(pprod, scalar, ptau[2]); sum_su2(psu2_link, pprod); scalar.real = cos(theta); scalar.imag = 0.0; mult_scalar(pprod, scalar, ptau[3]); sum_su2(psu2_link, pprod); break; } }
Vector* Util::normal(Vector *v){ double mag = Util::mag(v); double n = mag == 0 ? HUGE_VAL : 1 / mag; return mult_scalar(v, n); }
double distance( vector x, vector y ) { return module( sum( x, mult_scalar( y, -1.0 ) ) ); }