oblique_mc

Monte Carlo in Single Layer Biological Tissue
git clone anongit@rnpnr.xyz:oblique_mc.git
Log | Files | Refs | Feed | README | LICENSE

Commit: 6b9248dae6459f9b6f2da9489458025aca8b0ac2
Parent: 0797f2e431423813d37609e9c5b8c3101206a129
Author: Randy Palamar
Date:   Thu,  4 Apr 2024 09:50:14 -0600

cleanup some equations and fix numbering

Diffstat:
Mmc.c | 49+++++++++++++++++++++++++------------------------
1 file changed, 25 insertions(+), 24 deletions(-)

diff --git a/mc.c b/mc.c @@ -292,8 +292,8 @@ move_photon(Photon *p, f64 s) static void absorb_photon(Photon *p) { - f64 dw = p->w * gctx.mu_a / gctx.mu_t; /* eq 3.24 */ - p->w -= dw; + f64 delta_w = p->w * gctx.mu_a / gctx.mu_t; /* eq 3.24 */ + p->w -= delta_w; if (p->w < 0) p->dead = 1; } @@ -346,7 +346,7 @@ scatter_photon(Photon *p, u64 rand_state[2]) if (p->dead) return; - f64 cos_t, fei; + f64 cos_t, phi; f64 g = gctx.g; if (g != 0) { f64 r = random_uniform(rand_state); @@ -360,31 +360,32 @@ scatter_photon(Photon *p, u64 rand_state[2]) cos_t = 2 * random_uniform(rand_state) - 1; } /* eq. (3.28) */ - f64 sin_t, sin_fei, cos_fei; + f64 sin_t, sin_phi, cos_phi; sin_t = sqrt(1 - cos_t * cos_t); - fei = 2 * M_PI * random_uniform(rand_state); /* eq. (3.29) */ - cos_fei = cos(fei); - sin_fei = sin(fei); - - f64 uux, uuy, uuz; - if (ABS(p->dir.z) <= (1 - ZERO)) { - /* eq. (3.24) */ - Vec3 u = p->dir; - uux = sin_t * (u.x * u.z * cos_fei - u.y * sin_fei) - / sqrt(1 - u.z * u.z) + u.x * cos_t; - uuy = sin_t * (u.y * u.z * cos_fei + u.x * sin_fei) - / sqrt(1 - u.z * u.z) + u.y * cos_t; - uuz = -sin_t * cos_fei * sqrt(1 - u.z * u.z) + u.z * cos_t; + phi = 2 * M_PI * random_uniform(rand_state); /* eq. (3.29) */ + cos_phi = cos(phi); + sin_phi = sqrt(1 - cos_phi * cos_phi); + + Vec3 u_mu; + if (ABS(p->dir.z) < (1 - ZERO)) { + /* eq. (3.30) */ + Vec3 mu = p->dir; + f64 mu_zsq = sqrt(1 - mu.z * mu.z); + u_mu.x = sin_t * (mu.x * mu.z * cos_phi - mu.y * sin_phi) + / mu_zsq + mu.x * cos_t; + u_mu.y = sin_t * (mu.y * mu.z * cos_phi + mu.x * sin_phi) + / mu_zsq + mu.y * cos_t; + u_mu.z = -sin_t * cos_phi * mu_zsq + mu.z * cos_t; } else { /* close to normal propagation */ - /* eq. (3.30) */ - uux = sin_t * cos_fei; - uuy = sin_t * sin_fei; - uuz = SGN(p->dir.z) * cos_t; + /* eq. (3.31) */ + u_mu = (Vec3){ + .x = sin_t * cos_phi, + .y = sin_t * sin_phi, + .z = SGN(p->dir.z) * cos_t + }; } - p->dir.x = uux; - p->dir.y = uuy; - p->dir.z = uuz; + p->dir = u_mu; p->n_scatters++; }