From 6336b7922ffb405b531926f3d628e125b2c279b8 Mon Sep 17 00:00:00 2001 From: Orestis <orestis.malaspinas@hesge.ch> Date: Thu, 10 Sep 2020 23:20:25 +0200 Subject: [PATCH] added stuff --- practical_work/rc_circuit/.gitignore | 3 +++ practical_work/rc_circuit/Makefile | 25 +++++++++++++++++++++++++ practical_work/rc_circuit/ode_o1.c | 10 ++++++++++ practical_work/rc_circuit/ode_o1.h | 9 +++++++++ practical_work/rc_circuit/rc.h | 21 +++++++++++++++++++++ 5 files changed, 68 insertions(+) create mode 100644 practical_work/rc_circuit/.gitignore create mode 100644 practical_work/rc_circuit/Makefile create mode 100644 practical_work/rc_circuit/ode_o1.c create mode 100644 practical_work/rc_circuit/ode_o1.h create mode 100644 practical_work/rc_circuit/rc.h diff --git a/practical_work/rc_circuit/.gitignore b/practical_work/rc_circuit/.gitignore new file mode 100644 index 0000000..79be7b0 --- /dev/null +++ b/practical_work/rc_circuit/.gitignore @@ -0,0 +1,3 @@ +*.o +main +*.gch diff --git a/practical_work/rc_circuit/Makefile b/practical_work/rc_circuit/Makefile new file mode 100644 index 0000000..4879775 --- /dev/null +++ b/practical_work/rc_circuit/Makefile @@ -0,0 +1,25 @@ +CC=clang +OPTS=-g -O3 -Wall -Wextra -fsanitize=address -fsanitize=leak -std=c11 +LINK=-lm -fsanitize=address -fsanitize=leak + +# OPTS=-g -O3 -Wall -Wextra -std=c11 +# LINK=-lm + +main: main.o rc.o ode_o1.o + $(CC) $(OPTS) -o $@ $^ $(LINK) + +main.o: main.c + $(CC) $(OPTS) -c $^ + +ode_o1.o: ode_o1.c ode_o1.h + $(CC) $(OPTS) -c $^ + +rc.o: rc.c rc.h + $(CC) $(OPTS) -c $^ + +test: + make -C tests test + +clean: + rm -f *.o main + make -C tests clean diff --git a/practical_work/rc_circuit/ode_o1.c b/practical_work/rc_circuit/ode_o1.c new file mode 100644 index 0000000..55cf113 --- /dev/null +++ b/practical_work/rc_circuit/ode_o1.c @@ -0,0 +1,10 @@ +#include "ode_o1.h" + +// a * df/dt + b * f = c + +// (f(t + dt) - f(t)) / dt = g(f(t)) => f(t + dt) = f(t) + dt * g(f(t)). + +double advance(double (*g)(double, void *), double f0, double dt, void *state) { + return f0 + dt * g(f0, state); +} + diff --git a/practical_work/rc_circuit/ode_o1.h b/practical_work/rc_circuit/ode_o1.h new file mode 100644 index 0000000..bfb3d31 --- /dev/null +++ b/practical_work/rc_circuit/ode_o1.h @@ -0,0 +1,9 @@ +#ifndef _ODE_O1_H_ +#define _ODE_O1_H_ + +// a * df/dt + b * f = c +// (f(t + dt) - f(t)) / dt = g(f(t)) => f(t + dt) = f(t) + dt * g(f(t)). + +double advance(double (*g)(double, void *), double f0, double dt, void *state); + +#endif diff --git a/practical_work/rc_circuit/rc.h b/practical_work/rc_circuit/rc.h new file mode 100644 index 0000000..4861087 --- /dev/null +++ b/practical_work/rc_circuit/rc.h @@ -0,0 +1,21 @@ +#ifndef _RC_H_ +#define _RC_H_ + +// rc ode: +// R * C * dV_c/dt + V_c = epsilon +// dV_c / dt = (epsilon - V_c) / R * C // g is the R.h.s of this equation +// V_c(t + dt) = V_c(t) + dt / (R * C) * (epsilon - V_c) + +typedef struct _rc_state { + double r, c, eps; +} rc_state; + +rc_state rc_state_create(double r, double c, double eps); + +double rc_g(double v, void *rc); + +double rc_advance(double v0, double dt, rc_state *state); + +double exact_solution(double t, double v_ini, rc_state *state); + +#endif \ No newline at end of file -- GitLab