示例#1
0
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;
}
示例#4
0
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;
}