tBegin implementing solver - cngf-pf - continuum model for granular flows with pore-pressure dynamics (renamed from 1d_fd_simple_shear)
 (HTM) git clone git://src.adamsgaard.dk/cngf-pf
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 53e7a92719f78be98796bb7a7427803051da8776
 (DIR) parent 676dd6649e534885d2f7266b8aca2a6135a6e140
 (HTM) Author: Anders Damsgaard <anders@adamsgaard.dk>
       Date:   Wed, 11 Dec 2019 14:38:28 +0100
       
       Begin implementing solver
       
       Diffstat:
         M max_depth_simple_shear.c            |      57 ++++++++++++++++++++++---------
       
       1 file changed, 41 insertions(+), 16 deletions(-)
       ---
 (DIR) diff --git a/max_depth_simple_shear.c b/max_depth_simple_shear.c
       t@@ -14,7 +14,7 @@
        #include "parameter_defaults.h"
        
        /* relative tolerance criteria for solver */
       -#define RTOL 1e-5
       +#define TOL 1e-3
        #define MAX_ITER 10000
        
        /* uncomment to print time spent per time step to stdout */
       t@@ -44,7 +44,8 @@ usage(void)
                        " -q, --fluid-pressure-freq VAL   frequency of sinusoidal pressure variations [s^-1]\n"
                        "                                 (default %g)\n"
                        "\n"
       -                "The output value is the max. deformation depth from the top in meters.\n"
       +                "The first column of the output is the max. deformation depth from the top in meters.\n"
       +                "The second column is the skin depth in meters.\n"
                        ,
                        __func__, PROGNAME,
                        sim.G,
       t@@ -72,7 +73,6 @@ version(void)
                , PROGNAME, VERSION);
        }
        
       -
        double
        skin_depth(const struct simulation* sim)
        {
       t@@ -80,6 +80,20 @@ skin_depth(const struct simulation* sim)
                                    (sim->phi[0]*sim->mu_f*sim->beta_f*M_PI*sim->p_f_mod_freq));
        }
        
       +/* using alternate form: sin(x) + cos(x) = sqrt(2)*sin(x + pi/4) */
       +double
       +analytical_solution_lhs(double d_s, double z_)
       +{
       +        return sqrt(2.0) * sin((3.0*M_PI/2.0 - z_/d_s) + M_PI/4.0);
       +}
       +
       +double
       +analytical_solution_rhs(const struct simulation* sim, double d_s, double z_)
       +{
       +        return -(sim->rho_s - sim->rho_f)*sim->G*d_s / sim->p_f_mod_ampl
       +                   - exp(z_/d_s);
       +}
       +
        int
        main(int argc, char* argv[])
        {
       t@@ -88,6 +102,7 @@ main(int argc, char* argv[])
                const char* optstring;
                unsigned long iter;
                double new_phi, new_k;
       +        double diff, d_s, depth;
        #ifdef BENCHMARK_PERFORMANCE
                clock_t t_begin, t_end;
                double t_elapsed;
       t@@ -207,30 +222,40 @@ main(int argc, char* argv[])
                check_simulation_parameters(&sim);
        
                iter = 0;
       -        double diff = INFINITY;
       -        while (diff > RTOL) {
       +        depth = 0.0;
       +        d_s = skin_depth(&sim);
        
        #ifdef BENCHMARK_PERFORMANCE
       -                t_begin = clock();
       +        t_begin = clock();
        #endif
        
       -                diff = 0.0;
       +        if (fabs(sim.p_f_mod_ampl) > 1e-6) {
       +                do {
       +                        diff = analytical_solution_rhs(&sim, d_s, depth)
       +                                 - analytical_solution_lhs(d_s, depth);
        
       +                        printf("rhs = %g\n", analytical_solution_rhs(&sim, d_s, depth));
       +                        printf("lhs = %g\n", analytical_solution_lhs(d_s, depth));
        
       +                        printf("%ld\t%g\t%g\n", iter, depth, diff);
        
       +                        if (diff > 0.0)
       +                                depth += 1e-3*d_s/depth;
       +                        else
       +                                depth -= 1e-3*d_s/depth;
        
       -#ifdef BENCHMARK_PERFORMANCE
       -                t_end = clock();
       -                t_elapsed = (double)(t_end - t_begin)/CLOCKS_PER_SEC;
       -                printf("time spent per time step = %g s\n", t_elapsed);
       -#endif
       -
       -                /* printf("%s\n", max_depth); */
       -                iter++;
       +                        iter++;
       +                } while (diff > TOL);
                }
        
       -        printf("skin depth: %g m\n", skin_depth(&sim));
       +#ifdef BENCHMARK_PERFORMANCE
       +        t_end = clock();
       +        t_elapsed = (double)(t_end - t_begin)/CLOCKS_PER_SEC;
       +        printf("time spent = %g s\n", t_elapsed);
       +#endif
        
       +        printf("\nresult:\n");
       +        printf("%g\t%g\n", depth, d_s);
        
                free_arrays(&sim);
                return 0;