From 0b79dd32a4ada026a404de18004675fc3765408f Mon Sep 17 00:00:00 2001
From: Orestis <orestis.malaspinas@hesge.ch>
Date: Wed, 26 Aug 2020 22:11:59 +0200
Subject: [PATCH] updated for friction

---
 practical_work/forces/Makefile   | 10 ++++++++--
 practical_work/forces/main.c     | 16 +++++++++++++++-
 practical_work/forces/particle.c | 28 +++++++++++++---------------
 practical_work/forces/particle.h |  6 ++++--
 practical_work/vec2/Makefile     |  5 ++++-
 practical_work/vec2/vec2.c       | 10 ++++++++++
 practical_work/vec2/vec2.h       |  2 ++
 7 files changed, 56 insertions(+), 21 deletions(-)

diff --git a/practical_work/forces/Makefile b/practical_work/forces/Makefile
index 111de51..b850094 100644
--- a/practical_work/forces/Makefile
+++ b/practical_work/forces/Makefile
@@ -1,8 +1,9 @@
 CC=gcc
-OPTS=-g -O3 -Wall -Wextra -fsanitize=address -fsanitize=leak 
+OPTS=-g -O3 -Wall -Wextra -fsanitize=address -fsanitize=leak -std=c11
 LINK=-lm -lasan
 
-main: main.o particle.o ../vec2/vec2.o
+main: main.o particle.o ../vec2/util.o ../vec2/vec2.o
+	make -C ../vec2
 	$(CC) $(OPTS) -o $@ $^ $(LINK)
 
 main.o: main.c
@@ -11,5 +12,10 @@ main.o: main.c
 particle.o: particle.c particle.h
 	$(CC) $(OPTS) -c $^
 
+util.o: util.c util.h
+	$(CC) $(OPTS) -c $^
+
 clean:
 	rm -f *.o main
+	make -C ../vec2 clean
+
diff --git a/practical_work/forces/main.c b/practical_work/forces/main.c
index b29a965..762024f 100644
--- a/practical_work/forces/main.c
+++ b/practical_work/forces/main.c
@@ -8,7 +8,7 @@ int main() {
     particle_print(p);
 
     int number = 10;
-    particle *parts = particle_random_create_list(vec2_create(0.0,0.0), vec2_create(1.0, 1.0), 0.0, 10.0, number);
+    particle *parts = particle_create_random_list(vec2_create(0.0,0.0), vec2_create(1.0, 1.0), 0.0, 10.0, number);
     particle_print_list(parts, number);
 
     vec2 force = particle_compute_grav_force(parts[0], p);
@@ -20,5 +20,19 @@ int main() {
         vec2_print(forces[ip]);
     }
 
+    double k = 10.0;
+    vec2 vel[number];
+    for (int ip = 0; ip < number; ++ip) {
+        vel[ip] = vec2_create_random(vec2_create(0.0,0.0), vec2_create(1.0, 1.0));
+    }
+    vec2 *forces_friction = particle_compute_grav_friction_resultant_forces(parts, vel, k, number);
+
+    for (int ip = 0; ip < number; ++ip) {
+        printf("force %d: \n", ip);
+        vec2_print(forces_friction[ip]);
+    }
+
     free(parts);
+    free(forces);
+    free(forces_friction);
 }
\ No newline at end of file
diff --git a/practical_work/forces/particle.c b/practical_work/forces/particle.c
index e7a5c5e..8f5fbad 100644
--- a/practical_work/forces/particle.c
+++ b/practical_work/forces/particle.c
@@ -3,39 +3,29 @@
 #include <time.h>
 #include <assert.h>
 #include "particle.h"
+#include "../vec2/util.h"
 
 static double G = 6.27e-11;
 
-static double rand_to_range(double x0, double x1) {
-    double delta = x1 - x0;
-    double rescaled = (double)rand() / RAND_MAX * delta + x0;
-
-    return rescaled;
-}
-
 particle particle_create(vec2 r_, double m_) {
     particle p = {.r = r_, .m = m_};
     return p;
 }
 
-particle particle_random_create(vec2 min_r, vec2 max_r, double min_m, double max_m) {
+particle particle_create_random(vec2 min_r, vec2 max_r, double min_m, double max_m) {
     double m = rand_to_range(min_m, max_m);
-
-    double x = rand_to_range(min_r.x, max_r.x);
-    double y = rand_to_range(min_r.y, max_r.y);
-
-    vec2 r = vec2_create(x, y);
+    vec2 r = vec2_create_random(min_r, max_r);
 
     return particle_create(r, m);
 }
 
-particle *particle_random_create_list(vec2 min_r, vec2 max_r, double min_m, double max_m, int number) {
+particle *particle_create_random_list(vec2 min_r, vec2 max_r, double min_m, double max_m, int number) {
     particle *p = malloc(number * sizeof(particle));
 
     srand(time(NULL));
 
     for (int ip = 0; ip < number; ++ip) {
-        p[ip] = particle_random_create(min_r, max_r, min_m, max_m);
+        p[ip] = particle_create_random(min_r, max_r, min_m, max_m);
     }
 
     return p;
@@ -64,6 +54,14 @@ vec2 *particle_compute_grav_resultant_forces(particle *parts, int number) {
     return forces;
 }
 
+vec2 *particle_compute_grav_friction_resultant_forces(particle *parts, vec2 *vel, double k, int number) {
+    vec2 *forces = particle_compute_grav_resultant_forces(parts, number);
+    for (int ip = 0; ip < number; ++ip) {
+        forces[ip] = vec2_sub(forces[ip], vec2_mul(k, vel[ip]));
+    }
+    return forces;
+}
+
 void particle_print(particle p) {
     printf("m = %g\n", p.m);
     vec2_print(p.r);
diff --git a/practical_work/forces/particle.h b/practical_work/forces/particle.h
index 3e4b66b..5d1eb25 100644
--- a/practical_work/forces/particle.h
+++ b/practical_work/forces/particle.h
@@ -10,14 +10,16 @@ typedef struct _particle {
 
 particle particle_create(vec2 r_, double m_);
 
-particle particle_random_create(vec2 min_r, vec2 max_r, double min_m, double max_m);
+particle particle_create_random(vec2 min_r, vec2 max_r, double min_m, double max_m);
 
-particle *particle_random_create_list(vec2 min_r, vec2 max_r, double min_m, double max_m, int number);
+particle *particle_create_random_list(vec2 min_r, vec2 max_r, double min_m, double max_m, int number);
 
 vec2 particle_compute_grav_force(particle lhs, particle rhs);
 
 vec2 *particle_compute_grav_resultant_forces(particle *parts, int number);
 
+vec2 *particle_compute_grav_friction_resultant_forces(particle *parts, vec2 *vel, double k, int number);
+
 void particle_print(particle p);
 
 void particle_print_list(particle *p, int number);
diff --git a/practical_work/vec2/Makefile b/practical_work/vec2/Makefile
index 79d77da..08e9c73 100644
--- a/practical_work/vec2/Makefile
+++ b/practical_work/vec2/Makefile
@@ -2,7 +2,7 @@ CC=gcc
 OPTS=-g -O3 -Wall -Wextra
 LINK=-lm
 
-main: main.o vec2.o
+main: main.o vec2.o util.o
 	$(CC) $(OPTS) -o $@ $^ $(LINK)
 
 main.o: main.c
@@ -11,6 +11,9 @@ main.o: main.c
 vec2.o: vec2.c vec2.h
 	$(CC) $(OPTS) -c $^
 
+util.o: util.c util.h
+	$(CC) $(OPTS) -c $^
+
 test:
 	make -C tests test
 
diff --git a/practical_work/vec2/vec2.c b/practical_work/vec2/vec2.c
index abae499..a221bb8 100644
--- a/practical_work/vec2/vec2.c
+++ b/practical_work/vec2/vec2.c
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include <math.h>
+#include "util.h"
 #include "vec2.h"
 
 vec2 vec2_create(double x_, double y_) {
@@ -11,6 +12,15 @@ vec2 vec2_create_zero() {
     return vec2_create(0.0, 0.0);
 }
 
+vec2 vec2_create_random(vec2 min_r, vec2 max_r) {
+    double x = rand_to_range(min_r.x, max_r.x);
+    double y = rand_to_range(min_r.y, max_r.y);
+
+    vec2 r = vec2_create(x, y);
+
+    return r;
+}
+
 vec2 vec2_add(vec2 lhs, vec2 rhs) {
     return vec2_create(
         lhs.x + rhs.x,
diff --git a/practical_work/vec2/vec2.h b/practical_work/vec2/vec2.h
index 3d4dc15..80704b1 100644
--- a/practical_work/vec2/vec2.h
+++ b/practical_work/vec2/vec2.h
@@ -9,6 +9,8 @@ typedef struct _vec2 {
 
 vec2 vec2_create(double x_, double y_);
 
+vec2 vec2_create_random(vec2 min_v, vec2 max_v);
+
 vec2 vec2_create_zero();
 
 vec2 vec2_add(vec2 lhs, vec2 rhs);
-- 
GitLab