real get_theta_el(real ekin,int *seed,FILE *fp,char *fn) { static t_p2Ddata *p2Ddata = NULL; real r,theta; int eindex,tindex; if (p2Ddata == NULL) p2Ddata = read_p2Ddata(fn); /* Get energy index by binary search */ if ((eindex = my_bsearch(ekin,p2Ddata->nener,p2Ddata->ener,TRUE)) >= 0) { /* Start with random number */ r = rando(seed); /* Do binary search in the energy table */ if ((tindex = my_bsearch(r,p2Ddata->n2Ddata,p2Ddata->prob[eindex],FALSE)) >= 0) { theta = p2Ddata->data[eindex][tindex]; if (fp) fprintf(fp,"%8.3f %8.3f\n",theta,r); return theta; } } return 0; }
real band_ener(int *seed,FILE *fp,char *fn) { static real *ener = NULL; static real *prob = NULL; static int nener; int eindex; real r; /* Read data at first call, misuse read_cross function */ if (prob == NULL) nener = read_cross(fn,&ener,&prob,1.0); r = rando(seed); if ((eindex = my_bsearch(r,nener,prob,FALSE)) >= 0) { #ifdef DEBUG if (eindex >= nener) gmx_fatal(FARGS,"r = %f, prob[0] = %f, prob[%d] = %f",r, prob[0],prob[nener-1]); #endif if (fp) fprintf(fp,"%8.3f %8.3f\n",ener[eindex],r); return ener[eindex]; } return 0; }
real get_q_inel(real ekin,real omega,int *seed,FILE *fp,char *fn) { static t_pq_inel *pq = NULL; int eindex,oindex,tindex; real r,theta; if (pq == NULL) pq = read_pq(fn); /* Get energy index by binary search */ if ((eindex = my_bsearch(ekin,pq->nener,pq->ener,TRUE)) >= 0) { #ifdef DEBUG if (eindex >= pq->nener) gmx_fatal(FARGS,"eindex out of range (%d >= %d)",eindex,pq->nener); #endif /* Do binary search in the energy table */ if ((oindex = my_bsearch(omega,pq->nomega,pq->omega[eindex],FALSE)) >= 0) { #ifdef DEBUG if (oindex >= pq->nomega) gmx_fatal(FARGS,"oindex out of range (%d >= %d)",oindex,pq->nomega); #endif /* Start with random number */ r = rando(seed); if ((tindex = my_bsearch(r,pq->nq,pq->prob[eindex][oindex],FALSE)) >= 0) { #ifdef DEBUG if (tindex >= pq->nq) gmx_fatal(FARGS,"tindex out of range (%d >= %d)",tindex,pq->nq); #endif theta = pq->q[eindex][oindex][tindex]; if (fp) fprintf(fp,"get_q_inel: %8.3f %8.3f\n",theta,r); return theta; } } } return 0; }
real get_omega(real ekin,int *seed,FILE *fp,char *fn) { static t_p2Ddata *p2Ddata = NULL; real r,ome,fx,fy; int eindex,oindex; if (p2Ddata == NULL) p2Ddata = read_p2Ddata(fn); /* Get energy index by binary search */ if ((eindex = my_bsearch(ekin,p2Ddata->nener,p2Ddata->ener,TRUE)) >= 0) { #ifdef DEBUG if (eindex >= p2Ddata->nener) gmx_fatal(FARGS,"eindex (%d) out of range (max %d) in get_omega", eindex,p2Ddata->nener); #endif /* Start with random number */ r = rando(seed); /* Do binary search in the energy table */ if ((oindex = my_bsearch(r,p2Ddata->n2Ddata,p2Ddata->prob[eindex],TRUE)) >= 0) { #ifdef DEBUG if (oindex >= p2Ddata->n2Ddata) gmx_fatal(FARGS,"oindex (%d) out of range (max %d) in get_omega", oindex,p2Ddata->n2Ddata); #endif fy = ((r-p2Ddata->prob[eindex][oindex])/ (p2Ddata->prob[eindex][oindex+1]-p2Ddata->prob[eindex][oindex])); ome = interpolate2D(p2Ddata->nener,p2Ddata->n2Ddata,p2Ddata->ener, p2Ddata->data,ekin,fy, eindex,oindex); /* ome = p2Ddata->data[eindex][oindex];*/ if (fp) fprintf(fp,"%8.3f %8.3f\n",ome,r); return ome; } } return 0; }
int test_search(int *arr, int size, int value) { int a, b; a = my_lsearch(arr, size, value); b = my_bsearch(arr, size, value); if (a == b) { printf("ok\n"); return 1; } else { printf("missmatch\n"); return 0; } }
real cross_el(real ekin,real rho,char *fn) { static real *ener = NULL; static real *cross = NULL; static int nel; int eindex; /* Read data at first call, convert A^2 to nm^2 */ if (cross == NULL) nel = read_cross(fn,&ener,&cross,rho*0.01); /* Compute index with binary search */ if ((eindex = my_bsearch(ekin,nel,ener,FALSE)) >= 0) { #ifdef DEBUG if (eindex >= nel) gmx_fatal(FARGS,"ekin = %f, ener[0] = %f, ener[%d] = %f",ekin, ener[0],ener[nel-1]); #endif return cross[eindex]; } return 0; }