void Absorption<EvalT, Traits>:: evaluateFields(typename Traits::EvalData workset) { if (is_constant) { for (std::size_t cell=0; cell < workset.numCells; ++cell) { for (std::size_t qp=0; qp < numQPs; ++qp) { absorption(cell,qp) = constant_value; } } } /*else { for (std::size_t cell=0; cell < workset.numCells; ++cell) { for (std::size_t qp=0; qp < numQPs; ++qp) { Teuchos::Array<MeshScalarT> point(numDims); for (std::size_t i=0; i<numDims; i++) point[i] = Sacado::ScalarValue<MeshScalarT>::eval(coordVec(cell,qp,i)); thermalCond(cell,qp) = exp_rf_kl->evaluate(point, rv); } } }*/ }
Spectrum VolumeRegion::extinction(const Point3D &p, const Length3D &w, double time) const { return absorption(p, w, time) + scattering(p, w, time); }
/*MONTE CARLO*/ void mc1m(int num_photons,double ma, double ms, double g, double *x0,double *x1, double *x2, double *u0, double *u1, double *u2, double *na_fiber, double r_max, double x2_max,double n_tissue, double *n_fiber, double *fiber_radii, int t_grid, double *th, double *ph,double tissue[],double fiber_tissue[], double r[],double depth[],double weight[],double path[], double z[],double num_scatt[]) { int i; double s = 0; /*Fiber NA*/ float na_clad = na_fiber[1]; float na_core = na_fiber[0]; /*Fiber refractive indices*/ float n_clad = n_fiber[1]; float n_core = n_fiber[0]; /*Maximum angle for detection*/ double theta_clad = asin(na_clad/n_tissue); double Ralphi; /*ran1 seed*/ srand ( time(NULL) ); long idum = -(rand() % 1000 +1); /*Image array*/ int t_grid0 = t_grid*r_max; int t_grid2 = t_grid*x2_max; double dim_arr = t_grid0*t_grid2; double *aux_tissue = malloc(dim_arr*sizeof(double)); double r_tissue; /*Fibre geometry*/ double r_dclad = fiber_radii[2]; double r_clad = fiber_radii[1]; double r_core = fiber_radii[0]; /*Tissue and fiber_tissue initialization for each monte carlo run*/ int it,jt, count=0; for (it = 0; it< t_grid2; it++){ for (jt = 0; jt< t_grid0; jt++){ *(tissue+count) = 0; *(fiber_tissue+count) = 0; count++;}} /*Auxiliar arrays initialization*/ int ji,count2=0; for (ji = 0; ji< num_photons; ji++){ *(r+count2) = 0; *(depth+count2) = 0; *(weight+count2) = 0; *(path+count2) = 0; *(z+count2) = 0; *(num_scatt+count2)=0; count2++;} /*LAUNCHING*/ for (i=0;i<num_photons;i++) { int status=1; /*Photon alive*/ double x[]={x0[i],x1[i],x2[i]}; /*Position*/ double u[]={u0[i],u1[i],u2[i]}; /*Direction*/ double path_pp=0; /*Pathlength*/ double weight_pp=1; /*Weigth*/ double num_pp = 0; double depth_pp=0; /*Maximum depth*/ double dw=0; /*Weigth lost*/ double fiber_boundary; double z_na, r_na, cone; /*Specular reflection*/ specular(n_core, n_tissue,&weight_pp); /*aux_ tissue initialization for each photon*/ int count1 = 0,j; for (it = 0; it< t_grid2; it++){ for (jt = 0; jt< t_grid0; jt++){ *(aux_tissue+count1)=0; count1++;}} while (status==1) { /*Propagation distance*/ if (s == 0){s=log(ran1(&idum))/(-(ma+ms));} int tz0=0; int tz2=0; /*HIT FIBER BOUNDARY*/ fiber_boundary = -x[2]*(ma+ms)/u[2]; /*Position before updating*/ z_na = x[2]; r_na = r_tissue; cone = theta_clad*z_na + r_clad; if (u[2] < 0 && fiber_boundary <= s && z_na >0) { move_s(x, u, fiber_boundary, &depth_pp, &path_pp, &s, &r_tissue,&num_pp); /*whether the photon is internally reflected*/ reflection(u, n_core, n_tissue, &Ralphi); if (ran1(&idum)<= Ralphi){u[2]=-u[2];} } else{ move_s(x, u, s, &depth_pp, &path_pp, &s, &r_tissue, &num_pp); absorption(ma, ms,&weight_pp,&dw); spin_thph(u, g, &idum,th,ph); /*Absortion array updating*/ tz0=floor(r_tissue*t_grid); tz2=floor(x[2]*t_grid); if(tz0>t_grid0-1){tz0=t_grid0-1;} if(tz0<0){tz0=0;} if(tz2>t_grid2-1){tz2=t_grid2-1;} if(tz2<0){tz2=0;} *(tissue+(tz0*t_grid2+tz2))+=dw; *(aux_tissue+(tz0*t_grid2+tz2))+=dw; } /*else (the photon didn't reach the boundary)*/ /*PHOTON TERMINATION*/ if(x[2] > x2_max ){status=0;} if(status==1 && weight_pp<0.00001 /*threshold*/ ){roulette(&weight_pp,&idum,&status);} /*The photon reach the sensing area?*/ if(x[2] < 0 && r_tissue <= r_clad && r_tissue >= r_core && z_na >0 && r_na <= cone){ for(j=0;j<dim_arr;j++){fiber_tissue[j]+=aux_tissue[j];} /*Final status of detected photons*/ r[i] = r_tissue; z[i] = x[2]; path[i] = path_pp; weight[i] = weight_pp; depth[i] = depth_pp; num_scatt[i] = num_pp;} } /*while status is alive*/ } /*for i num_photons launched*/ return; } /*mcml2m*/