/*....................................................................*/ double gaussline(const double v, const double oneOnSigma){ double val; val = v*v*oneOnSigma*oneOnSigma; #ifdef FASTEXP return FastExp(val); #else return exp(-val); #endif }
int B_Metropolis(double deltaE,double temp,double WN,double WD,struct s_tables *t) { if (deltaE<=0) return 1; double p; p=FastExp(-deltaE/temp,t); p=p*(WN/WD); double random=frand(); if(random<p) { return 1; } return 0; }
void velocityspline2(double x[3], double dx[3], double ds, double binv, double deltav, double *vfac){ int i,steps=10; double v,d,val,vel[3]; *vfac=0.; for(i=0;i<steps;i++){ d=i*ds/steps; velocity(x[0]+(dx[0]*d),x[1]+(dx[1]*d),x[2]+(dx[2]*d),vel); v=deltav+veloproject(dx,vel); val=fabs(v)*binv; if(val <= 2500.){ #ifdef FASTEXP *vfac+= FastExp(val*val); #else *vfac+= exp(-(val*val)); #endif } } *vfac=*vfac/steps; return; }
void traceray(rayData ray, int tmptrans, int im, inputPars *par, struct grid *g, molData *m, image *img, int nlinetot, int *counta, int *countb, double cutoff){ int ichan,posn,nposn,i,iline; double vfac=0.,x[3],dx[3],vThisChan; double deltav,ds,dist2,ndist2,xp,yp,zp,col,shift,jnu,alpha,remnantSnu,dtau,expDTau,snu_pol[3]; for(ichan=0;ichan<img[im].nchan;ichan++){ ray.tau[ichan]=0.0; ray.intensity[ichan]=0.0; } xp=ray.x; yp=ray.y; if((xp*xp+yp*yp)/par->radiusSqu <= 1 ) { zp=sqrt(par->radiusSqu-(xp*xp+yp*yp)); for(i=0;i<3;i++){ x[i]=xp*img[im].rotMat[i][0] + yp*img[im].rotMat[i][1] + zp*img[im].rotMat[i][2]; dx[i]= -img[im].rotMat[i][2]; } i=0; dist2=(x[0]-g[i].x[0])*(x[0]-g[i].x[0]) + (x[1]-g[i].x[1])*(x[1]-g[i].x[1]) + (x[2]-g[i].x[2])*(x[2]-g[i].x[2]); posn=i; for(i=1;i<par->ncell;i++){ ndist2=(x[0]-g[i].x[0])*(x[0]-g[i].x[0]) + (x[1]-g[i].x[1])*(x[1]-g[i].x[1]) + (x[2]-g[i].x[2])*(x[2]-g[i].x[2]); if(ndist2<dist2){ posn=i; dist2=ndist2; } } col=0; do{ ds=2.*zp-col; nposn=-1; line_plane_intersect(g,&ds,posn,&nposn,dx,x,cutoff); if(par->polarization){ for(ichan=0;ichan<img[im].nchan;ichan++){ sourceFunc_pol(snu_pol,&dtau,ds,m,vfac,g,posn,0,0,img[im].theta); #ifdef FASTEXP ray.intensity[ichan]+=FastExp(ray.tau[ichan])*(1.-exp(-dtau))*snu_pol[ichan]; #else ray.intensity[ichan]+= exp(-ray.tau[ichan])*(1.-exp(-dtau))*snu_pol[ichan]; #endif ray.tau[ichan]+=dtau; } } else { for(ichan=0;ichan<img[im].nchan;ichan++){ jnu=.0; alpha=0.; for(iline=0;iline<nlinetot;iline++){ if(img[im].doline && m[counta[iline]].freq[countb[iline]] > img[im].freq-img[im].bandwidth/2. && m[counta[iline]].freq[countb[iline]] < img[im].freq+img[im].bandwidth/2.){ if(img[im].trans > -1){ shift=(m[counta[iline]].freq[countb[iline]]-m[counta[iline]].freq[img[im].trans])/m[counta[iline]].freq[img[im].trans]*CLIGHT; } else { shift=(m[counta[iline]].freq[countb[iline]]-img[im].freq)/img[im].freq*CLIGHT; } vThisChan=(ichan-(img[im].nchan-1)/2.)*img[im].velres; // Consistent with the WCS definition in writefits(). deltav = vThisChan - img[im].source_vel + shift; if(!par->pregrid) velocityspline2(x,dx,ds,g[posn].mol[counta[iline]].binv,deltav,&vfac); else vfac=gaussline(deltav+veloproject(dx,g[posn].vel),g[posn].mol[counta[iline]].binv); sourceFunc_line(&jnu,&alpha,m,vfac,g,posn,counta[iline],countb[iline]); } } if(img[im].doline && img[im].trans > -1) sourceFunc_cont(&jnu,&alpha,g,posn,0,img[im].trans); else if(img[im].doline && img[im].trans == -1) sourceFunc_cont(&jnu,&alpha,g,posn,0,tmptrans); else sourceFunc_cont(&jnu,&alpha,g,posn,0,0); dtau=alpha*ds; //??? if(dtau < -30) dtau = -30; // as in photon()? calcSourceFn(dtau, par, &remnantSnu, &expDTau); remnantSnu *= jnu*m[0].norminv*ds; #ifdef FASTEXP ray.intensity[ichan]+=FastExp(ray.tau[ichan])*remnantSnu; #else ray.intensity[ichan]+= exp(-ray.tau[ichan])*remnantSnu; #endif ray.tau[ichan]+=dtau; } } /* new coordinates */ for(i=0;i<3;i++) x[i]+=ds*dx[i]; col+=ds; posn=nposn; } while(col < 2*zp); /* add or subtract cmb */ #ifdef FASTEXP for(ichan=0;ichan<img[im].nchan;ichan++){ ray.intensity[ichan]+=(FastExp(ray.tau[ichan])-1.)*m[0].local_cmb[tmptrans]; } #else for(ichan=0;ichan<img[im].nchan;ichan++){ ray.intensity[ichan]+=(exp(-ray.tau[ichan])-1.)*m[0].local_cmb[tmptrans]; } #endif } }