commit f2663e1123ac994ca9f60a747addf5559786f887
parent 5419eee7ed46ffaae98e60ea4391d713d1731668
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date:   Tue, 17 Sep 2019 10:28:51 +0200
Add option to change fluid-pressure pulse waveform shape
Diffstat:
4 files changed, 36 insertions(+), 9 deletions(-)
diff --git a/fluid.c b/fluid.c
@@ -60,10 +60,10 @@ sine_wave(const double time,
 }
 
 static double
-pulse(const double time,
-      const double peak_amplitude,
-      const double frequency,
-      const double peak_time)
+triangular_pulse(const double time,
+                 const double peak_amplitude,
+                 const double frequency,
+                 const double peak_time)
 {
 	if (peak_time - 1.0/(2.0*frequency) < time && time <= peak_time)
 		return peak_amplitude*2.0*frequency*(time - peak_time) + peak_amplitude;
@@ -73,6 +73,19 @@ pulse(const double time,
 		return 0.0;
 }
 
+static double
+square_pulse(const double time,
+             const double peak_amplitude,
+             const double frequency,
+             const double peak_time)
+{
+	if (peak_time - 1.0/(2.0*frequency) < time &&
+	    time < peak_time + 1.0/(2.0*frequency))
+		return peak_amplitude;
+	else
+		return 0.0;
+}
+
 static void
 set_fluid_bcs(struct simulation* sim, const double p_f_top)
 {
@@ -186,10 +199,16 @@ darcy_solver_1d(struct simulation* sim,
 		                                   sim->p_f_mod_freq,
 		                                   sim->p_f_mod_phase);
 	else
-		p_f_top = sim->p_f_top + pulse(sim->t,
-		                               sim->p_f_mod_ampl,
-		                               sim->p_f_mod_freq,
-		                               sim->p_f_mod_pulse_time);
+		if (sim->p_f_mod_pulse_shape == 1)
+			p_f_top = sim->p_f_top + square_pulse(sim->t,
+			                                      sim->p_f_mod_ampl,
+			                                      sim->p_f_mod_freq,
+			                                      sim->p_f_mod_pulse_time);
+		else
+			p_f_top = sim->p_f_top + triangular_pulse(sim->t,
+			                                          sim->p_f_mod_ampl,
+			                                          sim->p_f_mod_freq,
+			                                          sim->p_f_mod_pulse_time);
 
 	/* set fluid BCs (1 of 2) */
 	set_fluid_bcs(sim, p_f_top);
diff --git a/main.c b/main.c
@@ -68,6 +68,8 @@ usage(void)
 	        " -H, --fluid-pressure-phase VAL  fluid pressure at +z edge [Pa] (default %g)\n"
 	        " -u, --fluid-pressure-pulse-time VAL fluid pressure pulse peak time [s]\n"
 	        "                                 (default %g)\n"
+	        " -S, --fluid-pressure-pulse-shape VAL\n"
+	        "                                 0: triangular (default), 1: square\n"
 	        " -t, --time VAL                  simulation start time [s] (default %g)\n"
 	        " -T, --time-end VAL              simulation end time [s] (default %g)\n"
 	        " -I, --file-interval VAL         interval between output files [s] (default %g)\n"
@@ -143,7 +145,7 @@ main(int argc, char* argv[])
 
 	norm = 0;
 
-	optstring = "hvNn:G:P:m:s:l:V:A:b:f:C:Fp:d:r:o:L:c:i:R:k:O:a:q:H:T:t:T:D:I:";
+	optstring = "hvNn:G:P:m:s:l:V:A:b:f:C:Fp:d:r:o:L:c:i:R:k:O:a:q:H:T:S:t:T:D:I:";
 	const struct option longopts[] = {
 		{"help",                      no_argument,       NULL, 'h'},
 		{"version",                   no_argument,       NULL, 'v'},
@@ -174,6 +176,7 @@ main(int argc, char* argv[])
 		{"fluid-pressure-freq",       required_argument, NULL, 'q'},
 		{"fluid-pressure-phase",      required_argument, NULL, 'H'},
 		{"fluid-pressure-pulse-time", required_argument, NULL, 'u'},
+		{"fluid-pressure-pulse-shape",required_argument, NULL, 'S'},
 		{"time",                      required_argument, NULL, 't'},
 		{"time-end",                  required_argument, NULL, 'T'},
 		{"file-interval",             required_argument, NULL, 'I'},
@@ -279,6 +282,9 @@ main(int argc, char* argv[])
 			case 'u':
 				sim.p_f_mod_pulse_time = atof(optarg);
 				break;
+			case 'S':
+				sim.p_f_mod_pulse_shape = atoi(optarg);
+				break;
 			case 't':
 				sim.t = atof(optarg);
 				break;
diff --git a/parameter_defaults.h b/parameter_defaults.h
@@ -106,6 +106,7 @@ struct simulation init_sim(void)
 	sim.p_f_mod_freq = 1.0;
 	sim.p_f_mod_phase = 0.0;
 	sim.p_f_mod_pulse_time = NAN;
+	sim.p_f_mod_pulse_shape = 0;
 
 	return sim;
 }
diff --git a/simulation.h b/simulation.h
@@ -85,6 +85,7 @@ struct simulation {
 	double p_f_mod_freq;  /* frequency of fluid pressure variations [s^-1] */
 	double p_f_mod_phase; /* phase of fluid pressure variations [s^-1] */
 	double p_f_mod_pulse_time; /* single pressure pulse at this time [s] */
+	int p_f_mod_pulse_shape; /* waveform for fluid-pressure pulse */
 	double beta_f;        /* adiabatic fluid compressibility [Pa^-1] */
 	double mu_f;          /* fluid dynamic viscosity [Pa*s] */
 	double rho_f;         /* fluid density [kg/m^3] */