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; }
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); }