1d_fd_simple_shear

continuum model for granular flows with pore-pressure dynamics
git clone git://src.adamsgaard.dk/1d_fd_simple_shear
Log | Files | Refs | README | LICENSE Back to index

commit dd8acb3ca5ee35f5d8d6c9080191b1c9d276b627
parent 5d4a2cef872d8b3cbb45892042bf5df43a0c7616
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date:   Tue, 24 Mar 2020 16:10:47 +0100

Rewrite shear_flux program in C

Diffstat:
MMakefile | 10++++++++--
Dshear_flux | 16----------------
Ashear_flux.c | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 86 insertions(+), 18 deletions(-)

diff --git a/Makefile b/Makefile @@ -6,6 +6,7 @@ MANPREFIX ?= ${PREFIX}/man DOCPREFIX ?= ${PREFIX}/share/doc/${NAME} HDR = \ + arg.h\ arrays.h\ fluid.h\ parameter_defaults.h\ @@ -22,8 +23,8 @@ DOC = \ README.md\ LICENSE -HERE_CFLAGS = ${CFLAGS} -std=c99 -pedantic -Wall -O2 -g -HERE_LDFLAGS = ${LDFLAGS} -lm +HERE_CFLAGS = ${CFLAGS} -std=c99 -pedantic -Wall -O0 -g +HERE_LDFLAGS = ${LDFLAGS} -lm -g GLOBALCONST = -DVERSION=\"${VERSION}\" all: ${BIN} @@ -44,6 +45,11 @@ max_depth_simple_shear: max_depth_simple_shear.o arrays.o fluid.o simulation.o $ max_depth_simple_shear.o arrays.o fluid.o simulation.o\ -o $@ +shear_flux: shear_flux.o ${HDR} + ${CC} ${HERE_LDFLAGS}\ + shear_flux.o\ + -o $@ + install: ${BIN} # installing executables mkdir -p ${DESTDIR}${PREFIX}/bin diff --git a/shear_flux b/shear_flux @@ -1,16 +0,0 @@ -#!/usr/bin/awk -f -BEGIN { - getline - integral = 0.0 -} -NF{ - if (NR > 1) - { - integral += ($2 + v_prev)/2.0*($1 - z_prev); - } - z_prev = $1; - v_prev = $2; -} -END{ - print integral -} diff --git a/shear_flux.c b/shear_flux.c @@ -0,0 +1,78 @@ +#include <err.h> +#include <unistd.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> + +#include "arg.h" + +char *argv0; + +static void +usage(void) +{ + dprintf(2, "usage: %s " + "[-v] " + "[-h] " + "[file ...] " + "\n", argv0); + exit(1); +} + +/* input format: positions<TAB>shear_velocities */ +double +find_flux(FILE *f) +{ + int i; + double pos, vel, pos_prev, vel_prev, flux; + + i = 0; + flux = 0.0; + while (fscanf(f, "%lf\t%lf%*[^\n]", &pos, &vel) == 2) { + if (i++ > 0) + flux += (vel + vel_prev)/2.0*(pos - pos_prev); + pos_prev = pos; + vel_prev = vel; + } + + return flux; +} + +int +main(int argc, char* argv[]) +{ + int i; + FILE *fp; + +#ifdef __OpenBSD__ + if (pledge("stdio rpath", NULL) == -1) { + fprintf(stderr, "error: pledge failed"); + exit(1); + } +#endif + + ARGBEGIN { + case 'h': + usage(); + break; + case 'v': + printf("%s-"VERSION"\n", argv0); + return 0; + break; + default: + usage(); + } ARGEND; + + if (argc > 0) { + for (i = 0; i < argc; i++) { + if (!(fp = fopen(argv[i], "r"))) + err(1, "fopen: %s", argv[i]); + + printf("%.17g\n", find_flux(fp)); + fclose(fp); + } + } else + printf("%.17g\n", find_flux(stdin)); + + return 0; +}