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
File: quad.c Project: lastro/perso
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);
	}
}
Example #3
0
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;
    }
}
Example #4
0
/******************************************************************************
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 = &prod;
   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);
}
Example #5
0
/******************************************************************************
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 = &prod;

   /* 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;
   }
}
Example #6
0
Vector*
Util::normal(Vector *v){
	double mag = Util::mag(v);
    double n = mag == 0 ? HUGE_VAL : 1 / mag;
    return mult_scalar(v, n);
}
Example #7
0
double distance( vector x, vector y ) {
    return module( sum( x, mult_scalar( y, -1.0 ) ) );
}