static PyObject * PyGSL_monte_init(PyGSL_solver *self, PyObject *args) { int flag = GSL_EFAILED; monte_csys * csys; FUNC_MESS_BEGIN(); assert(PyGSL_solver_check(self)); csys = (monte_csys *)self->c_sys; assert(csys); switch(csys->type){ case PyGSL_MONTE_plain: flag = gsl_monte_plain_init(self->solver); break; case PyGSL_MONTE_miser: flag = gsl_monte_miser_init(self->solver); break; case PyGSL_MONTE_vegas: flag = gsl_monte_vegas_init(self->solver); break; default: DEBUG_MESS(2, "Monte type %d unknown",flag); PyGSL_ERROR_NULL("Unknown monte type!", GSL_ESANITY); } if(PyGSL_ERROR_FLAG(flag) != GSL_SUCCESS){ PyGSL_add_traceback(module, filename, __FUNCTION__, __LINE__); return NULL; } Py_INCREF(Py_None); FUNC_MESS_END(); return Py_None; }
MCCalculatorSkewTriple::MCCalculatorSkewTriple(const MCSampleHex * sample, double Psi, gsl_rng * rng, size_t nbCallsTotal) { m_sample = sample; m_rng = rng; m_nbCallsTotal = nbCallsTotal; m_function.f = mc_skew_triple_integrand; m_function.params = this; m_function.dim = m_integral_dimension; m_mc_vegas_state = gsl_monte_vegas_alloc(m_integral_dimension); gsl_monte_vegas_init(m_mc_vegas_state); m_qx = 0.0; m_qz = 0.0; m_resol2_x = 0.0; m_resol2_z = 0.0; m_rl[0] = -sample->m_size / 2; m_ru[0] = sample->m_size / 2; m_rl[1] = 0.0; m_ru[1] = sample->m_thickness; m_rl[2] = 0.0; m_ru[2] = sample->m_thickness; m_sinPsi = sin(Psi); m_cotanPsi = cos(Psi) / sin(Psi); //std::cout << "sinPsi:\t" << m_sinPsi << std::endl; //std::cout << "cotanPsi:\t" << m_cotanPsi << std::endl; }
double MCCalculatorSkewTriple::I(const double qx, const double qz, double & err) { static double result, abserr; m_qx = qx; m_qz = qz / m_sinPsi; result = 0.0; gsl_monte_vegas_init(m_mc_vegas_state); /*int gsl_monte_vegas_integrate (gsl_monte_function * f, const double xl[], const double xu[], size_t dim, size_t calls, gsl_rng * r, gsl_monte_vegas_state * s, double * result, double * abserr)*/ gsl_monte_vegas_integrate(&m_function, m_rl, m_ru, m_integral_dimension, m_nbCallsTotal, m_rng, m_mc_vegas_state, &result, &abserr); err = abserr; return result; }
gsl_monte_vegas_state * gsl_monte_vegas_alloc (size_t dim) { gsl_monte_vegas_state *s = (gsl_monte_vegas_state *) malloc (sizeof (gsl_monte_vegas_state)); if (s == 0) { GSL_ERROR_VAL ("failed to allocate space for vegas state struct", GSL_ENOMEM, 0); } s->delx = (double *) malloc (dim * sizeof (double)); if (s->delx == 0) { free (s); GSL_ERROR_VAL ("failed to allocate space for delx", GSL_ENOMEM, 0); } s->d = (double *) malloc (BINS_MAX * dim * sizeof (double)); if (s->d == 0) { free (s->delx); free (s); GSL_ERROR_VAL ("failed to allocate space for d", GSL_ENOMEM, 0); } s->xi = (double *) malloc ((BINS_MAX + 1) * dim * sizeof (double)); if (s->xi == 0) { free (s->d); free (s->delx); free (s); GSL_ERROR_VAL ("failed to allocate space for xi", GSL_ENOMEM, 0); } s->xin = (double *) malloc ((BINS_MAX + 1) * sizeof (double)); if (s->xin == 0) { free (s->xi); free (s->d); free (s->delx); free (s); GSL_ERROR_VAL ("failed to allocate space for xin", GSL_ENOMEM, 0); } s->weight = (double *) malloc (BINS_MAX * sizeof (double)); if (s->weight == 0) { free (s->xin); free (s->xi); free (s->d); free (s->delx); free (s); GSL_ERROR_VAL ("failed to allocate space for xin", GSL_ENOMEM, 0); } s->box = (coord *) malloc (dim * sizeof (coord)); if (s->box == 0) { free (s->weight); free (s->xin); free (s->xi); free (s->d); free (s->delx); free (s); GSL_ERROR_VAL ("failed to allocate space for box", GSL_ENOMEM, 0); } s->bin = (coord *) malloc (dim * sizeof (coord)); if (s->bin == 0) { free (s->box); free (s->weight); free (s->xin); free (s->xi); free (s->d); free (s->delx); free (s); GSL_ERROR_VAL ("failed to allocate space for bin", GSL_ENOMEM, 0); } s->x = (double *) malloc (dim * sizeof (double)); if (s->x == 0) { free (s->bin); free (s->box); free (s->weight); free (s->xin); free (s->xi); free (s->d); free (s->delx); free (s); GSL_ERROR_VAL ("failed to allocate space for x", GSL_ENOMEM, 0); } s->dim = dim; s->bins_max = BINS_MAX; gsl_monte_vegas_init (s); return s; }