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)); }
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)); }
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; }
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); }
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); }
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); }
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; }
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; }
Tuple* val_to_tuple(Value v_tuple) { obj_verify(v_tuple, klass_Tuple); return obj_c_data(v_tuple); }
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); }
static Value ripe_complex_get_imag(Value v_self) { Complex* self = obj_c_data(v_self); return double_to_val(self->imag); }
Complex* val_to_complex(Value v) { obj_verify(v, klass_Complex); return obj_c_data(v); }
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; }