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