diff --git a/practical_work/forces/Makefile b/practical_work/forces/Makefile index 6ef1cce54f914858ed0409dbeebde34136475830..111de518709e4351da54727b8782a42081be05b0 100644 --- a/practical_work/forces/Makefile +++ b/practical_work/forces/Makefile @@ -1,6 +1,6 @@ CC=gcc -OPTS=-g -O3 -Wall -Wextra -LINK=-lm +OPTS=-g -O3 -Wall -Wextra -fsanitize=address -fsanitize=leak +LINK=-lm -lasan main: main.o particle.o ../vec2/vec2.o $(CC) $(OPTS) -o $@ $^ $(LINK) diff --git a/practical_work/forces/main.c b/practical_work/forces/main.c index 61a4717bd4935a156f9df0b93039ac94e0516ba4..b29a965d267d0eb310a9c00211b7c8d06f0476ca 100644 --- a/practical_work/forces/main.c +++ b/practical_work/forces/main.c @@ -1,3 +1,5 @@ +#include <stdlib.h> +#include <stdio.h> #include "../vec2/vec2.h" #include "particle.h" @@ -12,4 +14,11 @@ int main() { vec2 force = particle_compute_grav_force(parts[0], p); vec2_print(force); + vec2 *forces = particle_compute_grav_resultant_forces(parts, number); + for (int ip = 0; ip < number; ++ip) { + printf("force %d: \n", ip); + vec2_print(forces[ip]); + } + + free(parts); } \ No newline at end of file diff --git a/practical_work/forces/particle.c b/practical_work/forces/particle.c index ed3d1a5be3a9749a3be92646fe6f5f3c662b15e7..e7a5c5e789d24142dbe96ac3725d53a1af9868f7 100644 --- a/practical_work/forces/particle.c +++ b/practical_work/forces/particle.c @@ -30,7 +30,7 @@ particle particle_random_create(vec2 min_r, vec2 max_r, double min_m, double max } particle *particle_random_create_list(vec2 min_r, vec2 max_r, double min_m, double max_m, int number) { - particle *p = malloc(number * sizeof(particle_create)); + particle *p = malloc(number * sizeof(particle)); srand(time(NULL)); @@ -50,6 +50,20 @@ vec2 particle_compute_grav_force(particle lhs, particle rhs) { return vec2_mul(factor, rij); } +vec2 *particle_compute_grav_resultant_forces(particle *parts, int number) { + vec2 *forces = malloc(number * sizeof(vec2)); + for (int ip = 0; ip < number; ++ip) { + forces[ip] = vec2_create_zero(); + } + for (int ip = 0; ip < number; ++ip) { + for (int iq = ip + 1; iq < number; ++iq) { + forces[ip] = vec2_add(forces[ip], particle_compute_grav_force(parts[ip], parts[iq])); + forces[iq] = vec2_add(forces[iq], particle_compute_grav_force(parts[iq], parts[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 bee52616efb487d0bc2cc417efbe736bbf8d4331..3e4b66b42f1df3dc85649b1778669492d0c979b9 100644 --- a/practical_work/forces/particle.h +++ b/practical_work/forces/particle.h @@ -16,6 +16,8 @@ particle *particle_random_create_list(vec2 min_r, vec2 max_r, double min_m, doub vec2 particle_compute_grav_force(particle lhs, particle rhs); +vec2 *particle_compute_grav_resultant_forces(particle *parts, int number); + void particle_print(particle p); void particle_print_list(particle *p, int number); diff --git a/practical_work/vec2/vec2.c b/practical_work/vec2/vec2.c index 834ae1340682c06d2d32c006e22a3efc71e45de1..abae499ad116027aa0d0006b6a15c49da0970c59 100644 --- a/practical_work/vec2/vec2.c +++ b/practical_work/vec2/vec2.c @@ -7,6 +7,10 @@ vec2 vec2_create(double x_, double y_) { return v; } +vec2 vec2_create_zero() { + return vec2_create(0.0, 0.0); +} + 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 402824d12890dd2e0946fb591680c72eeb717e55..3d4dc150686d06f701a09467af5216057b8e0661 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_zero(); + vec2 vec2_add(vec2 lhs, vec2 rhs); vec2 vec2_sub(vec2 lhs, vec2 rhs);