Ejemplo n.º 1
0
Archivo: Fftw.c Proyecto: merolle/ripe
static Value ripe_fftw_plan2d_get_ky(Value v_self, Value v_y)
{
  FftwPlan2D* self = obj_c_data(v_self);
  int64 y = val_to_int64(v_y) - 1;
  if (y > self->y / 2) y = y - self->y;
  return double_to_val(((double) y) / ((double) self->y));
}
Ejemplo n.º 2
0
Archivo: Fftw.c Proyecto: merolle/ripe
static Value ripe_fftw_plan2d_get_kx(Value v_self, Value v_x)
{
  FftwPlan2D* self = obj_c_data(v_self);
  int64 x = val_to_int64(v_x) - 1;
  if (x > self->x / 2) x = x - self->x;
  return double_to_val(((double) x) / ((double) self->x));
}
Ejemplo n.º 3
0
Archivo: Fftw.c Proyecto: merolle/ripe
static Value ripe_fftw_plan2d_new(Value x, Value y, Value v_sign)
{
  Value v_self = obj_new(klass_FftwPlan2D);
  FftwPlan2D* self = obj_c_data(v_self);

  self->x = val_to_int64(x);
  self->y = val_to_int64(y);
  if (self->x < 1 or self->y < 1){
    exc_raise("invalid dimensions of Fftw.Plan2D (%" PRId64"x%" PRId64")",
              self->x, self->y);
  }
  self->in = (fftw_complex*) fftw_malloc(
                               sizeof(fftw_complex) * self->x * self->y
                             );
  self->out = (fftw_complex*) fftw_malloc(
                                sizeof(fftw_complex) * self->x * self->y
                              );
  
  int64 sign = val_to_int64(v_sign);
  if (sign != FFTW_FORWARD and sign != FFTW_BACKWARD){
    exc_raise("invalid flag for FFT (passed %" PRId64")", sign);
  }

  self->plan = fftw_plan_dft_2d(self->x, self->y, self->in, self->out,
                                sign, FFTW_ESTIMATE);
  return v_self;
}
Ejemplo n.º 4
0
static Value ripe_complex_minus2(Value v_self, Value v_o)
{
    Complex* self = obj_c_data(v_self);
    double o_re, o_im;
    val_to_complex_soft(v_o, &o_re, &o_im);
    return complex_to_val(o_re - self->real, o_im - self->imag);
}
Ejemplo n.º 5
0
static Value ripe_complex_to_string(Value v_self)
{
    Complex* self = obj_c_data(v_self);
    char buf[128];
    sprintf(buf, "%g+%gi", self->real, self->imag);
    return string_to_val(buf);
}
Ejemplo n.º 6
0
static Value ripe_complex_plus(Value v_self, Value v_o)
{
    Complex* self = obj_c_data(v_self);
    double o_re, o_im;
    val_to_complex_soft(v_o, &o_re, &o_im);
    return complex_to_val(self->real + o_re, self->imag + o_im);
}
Ejemplo n.º 7
0
void* func_get_ptr(Value v_func, int16 num_params)
{
  obj_verify(v_func, klass_func);
  Func* c_data = obj_c_data(v_func);
  if (c_data->num_params != num_params){
    exc_raise("func_get_ptr() mismatch (Function has %"PRIu16
              " but called with %"PRIu16")", c_data->num_params,
              num_params);
  }
  return (void*) c_data->func0;
}
Ejemplo n.º 8
0
Archivo: Fftw.c Proyecto: merolle/ripe
static Value ripe_fftw_plan2d_run(Value v_self, Value v_in, Value v_out)
{
  FftwPlan2D* self = obj_c_data(v_self);

  // Copy data from v_in
  for (int64 y = 0; y < self->y; y++){
    for (int64 x = 0; x < self->x; x++){
      Value v = array2_index(v_in, x+1, y+1);
      
      // 2 Possibilities, v is Double or Complex
      if (is_double(v)){
        self->in[x*self->y + y][0] = val_to_double(v);
        self->in[x*self->y + y][1] = 0.0;
      } else {
        Complex* complex = val_to_complex(v);
        self->in[x*self->y + y][0] = complex->real;
        self->in[x*self->y + y][1] = complex->imag;
      }
    }
  }
  
  fftw_execute(self->plan);
  
  // Copy data into v_out
  for (int64 y = 0; y < self->y; y++){
    for (int64 x = 0; x < self->x; x++){
      double real = self->out[x*self->y + y][0];
      double imag = self->out[x*self->y + y][1];

      Value v;
      if (imag == 0.0){
        v = double_to_val(real);
      } else {
        v = complex_to_val(real, imag);
      }
      array2_index_set(v_out, x+1, y+1, v);
    }
  }
  
  return VALUE_NIL;
}
Ejemplo n.º 9
0
Archivo: Tuple.c Proyecto: cabrilo/ripe
Tuple* val_to_tuple(Value v_tuple)
{
  obj_verify(v_tuple, klass_Tuple);
  return obj_c_data(v_tuple);
}
Ejemplo n.º 10
0
static Value ripe_complex_star(Value v_self, Value v_o)
{
    Complex* self = obj_c_data(v_self);
    double o = val_to_double_soft(v_o);
    return complex_to_val(self->real * o, self->imag * o);
}
Ejemplo n.º 11
0
static Value ripe_complex_get_imag(Value v_self)
{
    Complex* self = obj_c_data(v_self);
    return double_to_val(self->imag);
}
Ejemplo n.º 12
0
Complex* val_to_complex(Value v)
{
    obj_verify(v, klass_Complex);
    return obj_c_data(v);
}
Ejemplo n.º 13
0
void func_set_vararg(Value v_func)
{
  obj_verify(v_func, klass_func);
  Func* c_data = obj_c_data(v_func);
  c_data->var_params = 1;
}