oblique_mc

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

Commit: 319b7929f5b3893a6de3f79628149335728dd838
Parent: e1220f4880f5d3b5942f1a4d99514ee32408c2b0
Author: Randy Palamar
Date:   Sat, 30 Mar 2024 12:58:08 -0600

dump output in a more usable format

Diffstat:
Mmcml.c | 98++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------
1 file changed, 72 insertions(+), 26 deletions(-)

diff --git a/mcml.c b/mcml.c @@ -11,13 +11,16 @@ #include <math.h> #include <stdarg.h> +#include <stddef.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> #include <time.h> #define SGN(x) ((x) >= 0 ? 1 : -1) #define ABS(x) ((x) >= 0 ? x : -x) +#define LEN(a) (sizeof(a) / sizeof(*a)) #define ZERO 1.0e-6 #define BIGVAL 1.0e6 @@ -25,7 +28,12 @@ typedef uint64_t u64; typedef uint32_t u32; +typedef uint8_t u8; typedef double f64; +typedef ptrdiff_t size; + +typedef struct { u8 *data; size len; } s8; +#define s8(s) (s8){(u8 *)s, (LEN(s) - 1)} typedef struct { f64 x, y ,z; @@ -66,10 +74,71 @@ die(const char *fmt, ...) exit(1); } +/* concatenates nstrs together. 0 terminates output for use with bad APIs */ +static s8 +s8concat(s8 *strs, size nstrs) +{ + s8 out = {0}; + for (size i = 0; i < nstrs; i++) + out.len += strs[i].len; + out.data = malloc(out.len + 1); + if (out.data == NULL) + die("s8concat\n"); + for (size i = 0, off = 0; i < nstrs; i++) { + if (!memcpy(out.data + off, strs[i].data, strs[i].len)) + die("memcpy\n"); + off += strs[i].len; + } + out.data[out.len] = 0; + return out; +} + +static void +dump_output(s8 pre) +{ + s8 xy = s8("_xy.tsv"); + s8 rd = s8("_Rd_xy.csv"); + s8 cat[2] = { pre, xy }; + s8 out = s8concat(cat, 2); + + FILE *fd = fopen((char *)out.data, "w"); + if (fd == NULL) + die("rip can't open output file: %s\n", out.data); + fputs("x [cm]\ty [cm]\n", fd); + for (u32 i = 0; i < gctx.Nx; i++) { + f64 x = (i + 0.5) * gctx.dx - gctx.xoff; + f64 y = (i + 0.5) * gctx.dy - gctx.yoff; + fprintf(fd, "%e\t%e\n", x, y); + } + fclose(fd); + + free(out.data); + cat[1] = rd; + out = s8concat(cat, 2); + + fd = fopen((char *)out.data, "w"); + if (fd == NULL) + die("rip can't open output file: %s\n", out.data); + + f64 scale = gctx.N_photons * gctx.dx * gctx.dy; + f64 *b = Rd_xy.b; + for (u32 i = 0; i < Rd_xy.Nx; i++) { + for (u32 j = 0; j < Rd_xy.Ny; j++) + fprintf(fd, "%e,", b[j] / scale); + fseek(fd, -1, SEEK_CUR); + fputc('\n', fd); + b += Rd_xy.Ny; + } + fclose(fd); + free(out.data); +} + /* fill in extra global ctx values */ static void init(void) { + if (gctx.Nx != gctx.Ny) + die("Nx != Ny, output must be square!\n"); f64 w = gctx.extent.right - gctx.extent.left; f64 h = gctx.extent.top - gctx.extent.bot; gctx.dx = w / gctx.Nx; @@ -317,8 +386,8 @@ int main(int argc, char *argv[]) { if (argc != 2) - die("usage: %s output_file\n", argv[0]); - char *outfile = argv[1]; + die("usage: %s output_prefix\n", argv[0]); + s8 pre = (s8){.data = (u8 *)argv[1], .len = strlen(argv[1])}; init(); random_init(); @@ -337,30 +406,7 @@ main(int argc, char *argv[]) time(&tend); printf("Simulation took: %ld [s]\n", tend - tstart); - - FILE *fd = fopen(outfile, "w"); - if (fd == NULL) - die("rip can't open output file: %s\n", outfile); - - fputs("/////////////Grid coordinates///////////\nx (cm): ", fd); - for (u32 i = 0; i < gctx.Nx; i++) - fprintf(fd, "%e ", (i + 0.5) * gctx.dx - gctx.xoff); - fputs("\ny (cm): ", fd); - for (u32 i = 0; i < gctx.Nx; i++) - fprintf(fd, "%e ", (i + 0.5) * gctx.dy - gctx.yoff); - fputs("\n/////////////////////////////////////////\n", fd); - fputs("///////////////Rd_xy/////////////////////\n", fd); - - f64 scale = gctx.N_photons * gctx.dx * gctx.dy; - f64 *b = Rd_xy.b; - for (u32 i = 0; i < Rd_xy.Nx; i++) { - for (u32 j = 0; j < Rd_xy.Ny; j++) - fprintf(fd, "%e ", b[j] / scale); - fputc('\n', fd); - b += Rd_xy.Ny; - } - fputs("\n/////////////////////////////////////////\n", fd); - fclose(fd); + dump_output(pre); return 0; }