Beispiel #1
0
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;
}
Beispiel #2
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;
}
Beispiel #3
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;
}
Beispiel #4
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;
}
Beispiel #5
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;
	}
}
Beispiel #6
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;
}