Beispiel #1
0
def calc_J(rays, n_mu_pts, n_depth_pts, mu_grid):
    I_mu = np.zeros(n_mu_pts)
    J_lam = np.zeros(n_depth_pts)
    for i in range(n_depth_pts):
        for j, each_ray in enumerate(rays):
            I_mu[j] = each_ray.I_lam[get_ray_index_for_grid_point(each_ray, i, n_depth_pts)]
        J_lam[i] = 0.5 * simps(I_mu, mu_grid)
    return (J_lam)
Beispiel #2
0
def calc_J(rays, n_mu_pts, n_depth_pts, mu_grid):
    I_mu = np.zeros(n_mu_pts)
    J_lam = np.zeros(n_depth_pts)
    for i in range(n_depth_pts):
        for j, each_ray in enumerate(rays):
            I_mu[j] = each_ray.I_lam[get_ray_index_for_grid_point(
                each_ray, i, n_depth_pts)]
        J_lam[i] = 0.5 * simps(I_mu, mu_grid)
    return (J_lam)
Beispiel #3
0
def calc_Lambda_star(Lambda_star, n_depth_pts, n_mu_pts, rays, mu_grid):
    inorm_tmp = np.zeros([n_depth_pts, n_mu_pts])
    for l in range(1, n_depth_pts-1):
        inorm_tmp[:, :] = 0
        for j, each_ray in enumerate(rays):
            # get ray index corresponding to physical grid index l
            ray_idx_l   = get_ray_index_for_grid_point(each_ray, l, n_depth_pts)

            # get physical grid indices corresponding to i+1 and i-1 along the ray
            grid_idx_lim1 = get_grid_index_for_ray_point(each_ray, ray_idx_l-1, n_depth_pts)
            grid_idx_lip1 = get_grid_index_for_ray_point(each_ray, ray_idx_l+1, n_depth_pts)

            inorm_tmp[grid_idx_lim1, j] =  each_ray.gamma(ray_idx_l-1)
            inorm_tmp[l,             j] =  each_ray.gamma(ray_idx_l-1) * exp(-each_ray.Delta_tau(ray_idx_l-1)) + each_ray.beta(ray_idx_l)
            inorm_tmp[grid_idx_lip1, j] = (each_ray.gamma(ray_idx_l-1) * exp(-each_ray.Delta_tau(ray_idx_l-1)) + each_ray.beta(ray_idx_l)) * exp(-each_ray.Delta_tau(ray_idx_l)) + each_ray.alpha(ray_idx_l+1)

        # TODO: these +1/-1 offsets are hard-coded, works in 1-D plane parallel,
        # but won't work in more complex geometries
        Lambda_star[l-1, l] = 0.5 * simps(inorm_tmp[l-1, :], x=mu_grid)
        Lambda_star[l  , l] = 0.5 * simps(inorm_tmp[l ,  :], x=mu_grid)
        Lambda_star[l+1, l] = 0.5 * simps(inorm_tmp[l+1, :], x=mu_grid)

    # boundary cases.

    # surface
    l = 0
    inorm_tmp[:, :] = 0
    for j, each_ray in enumerate(rays):
        # at the surface, outgoing rays (those with mu > 0) only have i-1 and i components, no i+1
        if each_ray.mu > 0:
            ray_idx_l = get_ray_index_for_grid_point(each_ray, l, n_depth_pts)

            grid_idx_lim1 = get_grid_index_for_ray_point(each_ray, ray_idx_l-1, n_depth_pts)

            inorm_tmp[grid_idx_lim1, j] = each_ray.gamma(ray_idx_l-1)
            inorm_tmp[l,             j] = each_ray.gamma(ray_idx_l-1) * exp(-each_ray.Delta_tau(ray_idx_l-1)) + each_ray.beta(ray_idx_l)
        else:
            # at the surface we don't have an "i-1" term on incoming rays (those with mu < 0)
            # no illumination from the surface, so incoming rays at the surface have I(surface) = 0
            ray_idx_l = get_ray_index_for_grid_point(each_ray, l, n_depth_pts)

            grid_idx_lip1 = get_grid_index_for_ray_point(each_ray, ray_idx_l+1, n_depth_pts)

            inorm_tmp[l,             j] = 0
            inorm_tmp[grid_idx_lip1, j] = each_ray.alpha(ray_idx_l+1)

    Lambda_star[l,   l] = 0.5 * simps(inorm_tmp[l ,  :], x=mu_grid)
    Lambda_star[l+1, l] = 0.5 * simps(inorm_tmp[l+1, :], x=mu_grid)

    inorm_tmp[:, :] = 0

    # depth
    l = n_depth_pts-1
    for j, each_ray in enumerate(rays):
        # at depth, we don't have an "i-1" term on rays with mu > 0 because they start at depth
        if (each_ray.mu < 0):
            ray_idx_l    = get_ray_index_for_grid_point(each_ray, l, n_depth_pts)

            grid_idx_lim1 = get_grid_index_for_ray_point(each_ray, ray_idx_l-1, n_depth_pts)

            inorm_tmp[grid_idx_lim1, j] = each_ray.gamma(ray_idx_l-1)
            inorm_tmp[l,             j] = each_ray.gamma(ray_idx_l-1) * exp(-each_ray.Delta_tau(ray_idx_l-1)) + each_ray.beta(ray_idx_l)
        else:
            ray_idx_l    = get_ray_index_for_grid_point(each_ray, l, n_depth_pts)

            grid_idx_lip1 = get_grid_index_for_ray_point(each_ray, ray_idx_l+1, n_depth_pts)

            inorm_tmp[l,             j] = 0.0
            inorm_tmp[grid_idx_lip1, j] = each_ray.alpha(ray_idx_l+1)

    Lambda_star[l-1, l] = 0.5 * simps(inorm_tmp[l-1, :], x=mu_grid)
    Lambda_star[l  , l] = 0.5 * simps(inorm_tmp[l  , :], x=mu_grid)

    return(Lambda_star)
Beispiel #4
0
def calc_Lambda_star(Lambda_star, n_depth_pts, n_mu_pts, rays, mu_grid):
    inorm_tmp = np.zeros([n_depth_pts, n_mu_pts])
    for l in range(1, n_depth_pts - 1):
        inorm_tmp[:, :] = 0
        for j, each_ray in enumerate(rays):
            # get ray index corresponding to physical grid index l
            ray_idx_l = get_ray_index_for_grid_point(each_ray, l, n_depth_pts)

            # get physical grid indices corresponding to i+1 and i-1 along the ray
            grid_idx_lim1 = get_grid_index_for_ray_point(
                each_ray, ray_idx_l - 1, n_depth_pts)
            grid_idx_lip1 = get_grid_index_for_ray_point(
                each_ray, ray_idx_l + 1, n_depth_pts)

            inorm_tmp[grid_idx_lim1, j] = each_ray.gamma(ray_idx_l - 1)
            inorm_tmp[l, j] = each_ray.gamma(ray_idx_l - 1) * exp(
                -each_ray.Delta_tau(ray_idx_l - 1)) + each_ray.beta(ray_idx_l)
            inorm_tmp[
                grid_idx_lip1,
                j] = (each_ray.gamma(ray_idx_l - 1) *
                      exp(-each_ray.Delta_tau(ray_idx_l - 1)) +
                      each_ray.beta(ray_idx_l)) * exp(-each_ray.Delta_tau(
                          ray_idx_l)) + each_ray.alpha(ray_idx_l + 1)

        # TODO: these +1/-1 offsets are hard-coded, works in 1-D plane parallel,
        # but won't work in more complex geometries
        Lambda_star[l - 1, l] = 0.5 * simps(inorm_tmp[l - 1, :], x=mu_grid)
        Lambda_star[l, l] = 0.5 * simps(inorm_tmp[l, :], x=mu_grid)
        Lambda_star[l + 1, l] = 0.5 * simps(inorm_tmp[l + 1, :], x=mu_grid)

    # boundary cases.

    # surface
    l = 0
    inorm_tmp[:, :] = 0
    for j, each_ray in enumerate(rays):
        # at the surface, outgoing rays (those with mu > 0) only have i-1 and i components, no i+1
        if each_ray.mu > 0:
            ray_idx_l = get_ray_index_for_grid_point(each_ray, l, n_depth_pts)

            grid_idx_lim1 = get_grid_index_for_ray_point(
                each_ray, ray_idx_l - 1, n_depth_pts)

            inorm_tmp[grid_idx_lim1, j] = each_ray.gamma(ray_idx_l - 1)
            inorm_tmp[l, j] = each_ray.gamma(ray_idx_l - 1) * exp(
                -each_ray.Delta_tau(ray_idx_l - 1)) + each_ray.beta(ray_idx_l)
        else:
            # at the surface we don't have an "i-1" term on incoming rays (those with mu < 0)
            # no illumination from the surface, so incoming rays at the surface have I(surface) = 0
            ray_idx_l = get_ray_index_for_grid_point(each_ray, l, n_depth_pts)

            grid_idx_lip1 = get_grid_index_for_ray_point(
                each_ray, ray_idx_l + 1, n_depth_pts)

            inorm_tmp[l, j] = 0
            inorm_tmp[grid_idx_lip1, j] = each_ray.alpha(ray_idx_l + 1)

    Lambda_star[l, l] = 0.5 * simps(inorm_tmp[l, :], x=mu_grid)
    Lambda_star[l + 1, l] = 0.5 * simps(inorm_tmp[l + 1, :], x=mu_grid)

    inorm_tmp[:, :] = 0

    # depth
    l = n_depth_pts - 1
    for j, each_ray in enumerate(rays):
        # at depth, we don't have an "i-1" term on rays with mu > 0 because they start at depth
        if (each_ray.mu < 0):
            ray_idx_l = get_ray_index_for_grid_point(each_ray, l, n_depth_pts)

            grid_idx_lim1 = get_grid_index_for_ray_point(
                each_ray, ray_idx_l - 1, n_depth_pts)

            inorm_tmp[grid_idx_lim1, j] = each_ray.gamma(ray_idx_l - 1)
            inorm_tmp[l, j] = each_ray.gamma(ray_idx_l - 1) * exp(
                -each_ray.Delta_tau(ray_idx_l - 1)) + each_ray.beta(ray_idx_l)
        else:
            ray_idx_l = get_ray_index_for_grid_point(each_ray, l, n_depth_pts)

            grid_idx_lip1 = get_grid_index_for_ray_point(
                each_ray, ray_idx_l + 1, n_depth_pts)

            inorm_tmp[l, j] = 0.0
            inorm_tmp[grid_idx_lip1, j] = each_ray.alpha(ray_idx_l + 1)

    Lambda_star[l - 1, l] = 0.5 * simps(inorm_tmp[l - 1, :], x=mu_grid)
    Lambda_star[l, l] = 0.5 * simps(inorm_tmp[l, :], x=mu_grid)

    return (Lambda_star)