Ejemplo n.º 1
0
int metrop(double de, double t)
{
	double bolzman,rnd;
	//static long gljdum=1;
	//float frnd;

	bolzman=exp(-de/t);
	rnd=get_rand_double();
	if (de<0.0)
		return(1);
	if ((-(de/t))<-10000.0)
		return(0);
	else
		return(rnd<bolzman);

//	return de < 0.0 || rnd < bolzman;
}
Ejemplo n.º 2
0
int getScatterSampleResultTreeAtLevels(ResultTreeNode* prtree, int value_type, int num_scatter,
        double integral, float* fdata, int npoints, int* pfdata_index,
        double oct_node_value_ref, double *poct_tree_scatter_volume, int level_min, int level_max) {

    OctNode* pnode;
    double xnpoints = 0.0;
    double xval, yval, zval;
    double dx, dy, dz;
    int isample_taken;

    if (prtree->right != NULL)
        npoints = getScatterSampleResultTreeAtLevels(prtree->right, value_type, num_scatter, integral,
            fdata, npoints, pfdata_index, oct_node_value_ref, poct_tree_scatter_volume, level_min, level_max);

    pnode = prtree->pnode;
    if (npoints < num_scatter && pnode->isLeaf && pnode->level >= level_min && pnode->level <= level_max) {

        // AJL 20061023 bug fix - prtree value may not be same as pnode value * volume
        //xnpoints = (double) num_scatter * exp(prtree->value - oct_node_value_ref) / integral;
        if (value_type == VALUE_IS_LOG_PROB_DENSITY_IN_NODE)
            xnpoints = (double) num_scatter * (exp(pnode->value - oct_node_value_ref) * prtree->volume) / integral;
        else if (value_type == VALUE_IS_PROBABILITY_IN_NODE)
            xnpoints = (double) num_scatter * (pnode->value - oct_node_value_ref) / integral;
        //printf("xnpoints %g  num_scatter %d  value %lf  integral %g\n", xnpoints, num_scatter, pnode->value, integral);

        xval = pnode->center.x;
        yval = pnode->center.y;
        zval = pnode->center.z;
        dx = pnode->ds.x / 2.0;
        dy = pnode->ds.y / 2.0;
        dz = pnode->ds.z / 2.0;

        isample_taken = 0;

        //while (xnpoints > 0.0 /*&& npoints < num_scatter*/) {
        while (xnpoints > 0.0 && npoints < num_scatter) {   // 20110118 AJL

            if (xnpoints > 1.0 || xnpoints - (double) ((int) xnpoints) > get_rand_double(0.0, 1.0)) {
                fdata[*pfdata_index + 0] = xval + get_rand_double(-dx, dx);
                //printf("npoints %d  *pfdata_index %d  %lf  dx %lf  exp(prtree->value) %le  integral %le\n", npoints, *pfdata_index, fdata[*pfdata_index + 0], dx, exp(prtree->value), integral);
                fdata[*pfdata_index + 1] = yval + get_rand_double(-dy, dy);
                fdata[*pfdata_index + 2] = zval + get_rand_double(-dz, dz);
                fdata[*pfdata_index + 3] = pnode->value;
                //printf("npoints %d  *pfdata_index %d  value %lf  dx %g dy %g dz %g   x %g y %g z %g\n", npoints, *pfdata_index, pnode->value, dx, dy, dz, xval, yval, zval);
                npoints++;
                isample_taken = 1;
                *pfdata_index += 4;
            }

            xnpoints -= 1.0;

        }

        // update weighted scatter volume
        // pnode->value is probability density
        // oct_node_value_ref is maximum probability density
        if (value_type == VALUE_IS_LOG_PROB_DENSITY_IN_NODE)
            *poct_tree_scatter_volume += prtree->volume * exp(pnode->value - oct_node_value_ref);
        else if (value_type == VALUE_IS_PROBABILITY_IN_NODE)
            *poct_tree_scatter_volume += (pnode->value - oct_node_value_ref) > 0.0 ? (pnode->value - oct_node_value_ref) : 0.0;
    }

    if (prtree->left != NULL)
        npoints = getScatterSampleResultTreeAtLevels(prtree->left, value_type, num_scatter, integral,
            fdata, npoints, pfdata_index, oct_node_value_ref, poct_tree_scatter_volume, level_min, level_max);

    return (npoints);
}