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

commit d856e07363afbd999ce4a98ccd109a86a13e45f7
parent eff39df93aa04c4858b33363827bd7b27fa607aa
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date:   Sat,  6 Jul 2019 10:11:07 +0200

Use general functions for producing output to stdout and files

Diffstat:
Marrays.c | 24++++++++++++++++++++++++
Marrays.h | 2++
Mmain.c | 25+++++++------------------
Msimulation.c | 65+++++++++++++++++++++++++++++++++++++++++++++--------------------
Msimulation.h | 2++
5 files changed, 80 insertions(+), 38 deletions(-)

diff --git a/arrays.c b/arrays.c @@ -217,3 +217,27 @@ copy_values(const double* in, double* out, const int n) for (i=0; i<n; ++i) out[i] = in[i]; } + +double* +copy(const double* in, const int n) +{ + double *out; + out = empty(n); + copy_values(in, out, n); + return out; +} + +double* +normalize(const double* in, const int n) +{ + int i; + double max_val; + double *out; + + out = malloc(n*sizeof(double)); + copy_values(in, out, n); + max_val = max(out, n); + for (i=0; i<n; ++i) + out[i] /= max_val; + return out; +} diff --git a/arrays.h b/arrays.h @@ -48,5 +48,7 @@ void fprint_three_arrays( const int n); void copy_values(const double* in, double* out, const int n); +double* copy(const double* in, const int n); +double* normalize(const double* in, const int n); #endif diff --git a/main.c b/main.c @@ -91,16 +91,16 @@ version(void) int main(int argc, char* argv[]) { - int normalize, opt, i; + int norm, opt, i; struct simulation sim; const char* optstring; unsigned long iter; - double new_phi, new_k, filetimeclock, max_v_x; + double new_phi, new_k, filetimeclock; /* load with default values */ sim = init_sim(); - normalize = 0; + norm = 0; optstring = "hvNn:G:P:m:V:A:b:f:Fp:d:r:o:L:c:i:R:k:O:a:q:H:t:T:D:I:"; const struct option longopts[] = { @@ -157,7 +157,7 @@ main(int argc, char* argv[]) sim.nz = atoi(optarg); break; case 'N': - normalize = 1; + norm = 1; break; case 'G': sim.G = atof(optarg); @@ -289,26 +289,15 @@ main(int argc, char* argv[]) iter++; if (filetimeclock >= sim.file_dt || iter == 0) { - write_output_file(&sim, normalize); + write_output_file(&sim, norm); filetimeclock = 0.0; } } - if (normalize) { - max_v_x = max(sim.v_x, sim.nz); - for (i=0; i<sim.nz; ++i) - sim.v_x[i] /= max_v_x; - } - if (sim.fluid) - for (i=0; i<sim.nz; ++i) - printf("%.17g\t%.17g\t%.17g\t%.17g\n", - sim.z[i], - sim.v_x[i], - sim.sigma_n_eff[i], - sim.p_f_ghost[idx1g(i)]); + print_wet_output(stdout, &sim, norm); else - print_three_arrays(sim.z, sim.v_x, sim.sigma_n_eff, sim.nz); + print_dry_output(stdout, &sim, norm); free_arrays(&sim); return 0; diff --git a/simulation.c b/simulation.c @@ -437,34 +437,59 @@ implicit_1d_jacobian_poisson_solver(struct simulation* sim, void write_output_file(struct simulation* sim, const int normalize) { - int i; char outfile[200]; FILE *fp; - double *v_x_out; - double max_v_x; sprintf(outfile, "%s.output%05d.txt", sim->name, sim->n_file++); - v_x_out = malloc(sim->nz*sizeof(double)); - copy_values(sim->v_x, v_x_out, sim->nz); - if (normalize) { - max_v_x = max(v_x_out, sim->nz); - for (i=0; i<sim->nz; ++i) - v_x_out[i] /= max_v_x; - } - fp = fopen(outfile, "w"); if (sim->fluid) - for (i=0; i<sim->nz; ++i) - fprintf(fp, "%.17g\t%.17g\t%.17g\t%.17g\t%.17g\n", - sim->z[i], - v_x_out[i], - sim->sigma_n_eff[i], - sim->p_f_ghost[idx1g(i)], - sim->mu[i]); + print_wet_output(fp, sim, normalize); else - fprint_three_arrays(fp, sim->z, v_x_out, sim->sigma_n_eff, sim->nz); + print_dry_output(fp, sim, normalize); - free(v_x_out); fclose(fp); } + +void +print_dry_output(FILE* fp, struct simulation* sim, const int norm) +{ + int i; + double *v_x_out; + + if (norm) + v_x_out = normalize(sim->v_x, sim->nz); + else + v_x_out = copy(sim->v_x, sim->nz); + + for (i=0; i<sim->nz; ++i) + fprintf(fp, "%.17g\t%.17g\t%.17g\n", + sim->z[i], + v_x_out[i], + sim->sigma_n_eff[i]); + + free(v_x_out); +} + +void +print_wet_output(FILE* fp, struct simulation* sim, const int norm) +{ + int i; + double *v_x_out; + + if (norm) + v_x_out = normalize(sim->v_x, sim->nz); + else + v_x_out = copy(sim->v_x, sim->nz); + + for (i=0; i<sim->nz; ++i) + fprintf(fp, "%.17g\t%.17g\t%.17g\t%.17g\t%.17g\t%.17g\n", + sim->z[i], + v_x_out[i], + sim->sigma_n_eff[i], + sim->p_f_ghost[idx1g(i)], + sim->mu[i], + sim->gamma_dot_p[i]); + + free(v_x_out); +} diff --git a/simulation.h b/simulation.h @@ -124,5 +124,7 @@ int implicit_1d_jacobian_poisson_solver( const double rel_tol); void write_output_file(struct simulation* sim, const int normalize); +void print_dry_output(FILE* fp, struct simulation* sim, const int normalize); +void print_wet_output(FILE* fp, struct simulation* sim, const int normalize); #endif