Boolean HitUnderside(PhotonStruct * Photon_Ptr,
InputStruct * In_Ptr)
{
double dl_b; /* length to boundary. */
short layer = Photon_Ptr->layer;
double uz = Photon_Ptr->uz;
double ux = Photon_Ptr->ux;
double uy = Photon_Ptr->uy;
double x0 = Photon_Ptr->x;
double y0 = Photon_Ptr->y;
double z0 = Photon_Ptr->z;
double x1 = 0;
double y1 = 0;
double s = Photon_Ptr->s;
double rt = In_Ptr->rtum;
double lb, xx, yy;
double t1, t2;
double zb1 = In_Ptr->layerspecs[In_Ptr->ntum].z0;
double zb2 = In_Ptr->tz;
double mut;
double rr;
Boolean hit;
rr = sqrt(x0*x0+y0*y0);
t1=(zb1-z0)/uz;
t2=(zb2-z0)/uz;
/* Distance to the boundary. */
if(t2>=0 && layer==In_Ptr->ntum && uz<0){
dl_b = t2;
xx = x0+dl_b*ux;
yy = y0+dl_b*uy;
lb = sqrt(xx*xx+yy*yy);
if(uz!=0 && lb<rt && s>dl_b){
mut = In_Ptr->layerspecs[In_Ptr->ntum].mua
+ In_Ptr->layerspecs[In_Ptr->ntum].mus;
Photon_Ptr->sleft = (Photon_Ptr->s - dl_b)*mut;
Photon_Ptr->s = dl_b;
hit = 1;
}
else
hit = 0;
}
else if(t1>=0 && layer==In_Ptr->num_layers+1 && uz<0){
dl_b = t1;
xx = x0+dl_b*ux;
yy = y0+dl_b*uy;
lb = sqrt(xx*xx+yy*yy);
if(uz!=0 && lb<rt && s>dl_b){
mut = In_Ptr->tmua
+ In_Ptr->tmus;
Photon_Ptr->sleft = (Photon_Ptr->s - dl_b)*mut;
Photon_Ptr->s = dl_b;
hit = 1;
}
else
hit = 0;
}
else if(t2>=0 && layer==In_Ptr->num_layers+1 && uz>0){
dl_b = t2;
xx = x0+dl_b*ux;
yy = y0+dl_b*uy;
lb = sqrt(xx*xx+yy*yy);
if(uz!=0 && lb<rt && s>dl_b){
mut = In_Ptr->tmua
+ In_Ptr->tmus;
Photon_Ptr->sleft = (Photon_Ptr->s - dl_b)*mut;
Photon_Ptr->s = dl_b;
hit = 1;
}
else
hit = 0;
}
else
hit = 0;
return(hit);
}