diff --git a/practical_work/forces/Makefile b/practical_work/forces/Makefile index 111de518709e4351da54727b8782a42081be05b0..b850094fd31d0fa7ac7ee3491e191ef8b2d59100 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 b29a965d267d0eb310a9c00211b7c8d06f0476ca..762024fdd08e93ca635464c0f95d94d790d3b51b 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 e7a5c5e789d24142dbe96ac3725d53a1af9868f7..8f5fbad78907f61087c9283126734fe385deffc5 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 3e4b66b42f1df3dc85649b1778669492d0c979b9..5d1eb250ee6b3f6e466c2b533ec1f4f7fbe1c385 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 79d77da1249e7b98599e942690cc6c06a0834b77..08e9c73043dfbf49903cb06e829e9a04152f9018 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 abae499ad116027aa0d0006b6a15c49da0970c59..a221bb81c9da2c4fa93cba5775e14f4734642b06 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 3d4dc150686d06f701a09467af5216057b8e0661..80704b1d6efc610eb7e70bd40634c10a32344a96 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);