diff --git a/practical_work/forces/Makefile b/practical_work/forces/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..6ef1cce54f914858ed0409dbeebde34136475830 --- /dev/null +++ b/practical_work/forces/Makefile @@ -0,0 +1,15 @@ +CC=gcc +OPTS=-g -O3 -Wall -Wextra +LINK=-lm + +main: main.o particle.o ../vec2/vec2.o + $(CC) $(OPTS) -o $@ $^ $(LINK) + +main.o: main.c + $(CC) $(OPTS) -c $^ + +particle.o: particle.c particle.h + $(CC) $(OPTS) -c $^ + +clean: + rm -f *.o main diff --git a/practical_work/forces/main.c b/practical_work/forces/main.c new file mode 100644 index 0000000000000000000000000000000000000000..61a4717bd4935a156f9df0b93039ac94e0516ba4 --- /dev/null +++ b/practical_work/forces/main.c @@ -0,0 +1,15 @@ +#include "../vec2/vec2.h" +#include "particle.h" + +int main() { + particle p = particle_create(vec2_create(0.0,0.0), 1.0); + 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_print_list(parts, number); + + vec2 force = particle_compute_grav_force(parts[0], p); + vec2_print(force); + +} \ No newline at end of file diff --git a/practical_work/forces/particle.c b/practical_work/forces/particle.c new file mode 100644 index 0000000000000000000000000000000000000000..ed3d1a5be3a9749a3be92646fe6f5f3c662b15e7 --- /dev/null +++ b/practical_work/forces/particle.c @@ -0,0 +1,63 @@ +#include <stdlib.h> +#include <stdio.h> +#include <time.h> +#include <assert.h> +#include "particle.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) { + 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); + + 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 *p = malloc(number * sizeof(particle_create)); + + srand(time(NULL)); + + for (int ip = 0; ip < number; ++ip) { + p[ip] = particle_random_create(min_r, max_r, min_m, max_m); + } + + return p; +} + +vec2 particle_compute_grav_force(particle lhs, particle rhs) { + vec2 rij = vec2_sub(lhs.r, rhs.r); + double distance = vec2_norm(rij); + assert(distance > 1e-10); + double factor = G * lhs.m * rhs.m / (distance * distance * distance); + printf("factor = %g %g %g %g %g\n", factor, lhs.m, rhs.m, distance, G); + return vec2_mul(factor, rij); +} + +void particle_print(particle p) { + printf("m = %g\n", p.m); + vec2_print(p.r); +} + +void particle_print_list(particle *p, int number) { + for (int ip = 0; ip < number; ++ip) { + printf("particle %d: \n", ip); + particle_print(p[ip]); + } +} diff --git a/practical_work/forces/particle.h b/practical_work/forces/particle.h new file mode 100644 index 0000000000000000000000000000000000000000..bee52616efb487d0bc2cc417efbe736bbf8d4331 --- /dev/null +++ b/practical_work/forces/particle.h @@ -0,0 +1,24 @@ +#ifndef _PARTICLE_H_ +#define _PARTICLE_H_ + +#include "../vec2/vec2.h" + +typedef struct _particle { + vec2 r; + double m; +} 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_random_create_list(vec2 min_r, vec2 max_r, double min_m, double max_m, int number); + +vec2 particle_compute_grav_force(particle lhs, particle rhs); + +void particle_print(particle p); + +void particle_print_list(particle *p, int number); + + +#endif \ No newline at end of file diff --git a/practical_work/vec2/vec2.c b/practical_work/vec2/vec2.c index 62272c359ced528332771a10b5477eee627464bc..834ae1340682c06d2d32c006e22a3efc71e45de1 100644 --- a/practical_work/vec2/vec2.c +++ b/practical_work/vec2/vec2.c @@ -51,5 +51,5 @@ bool vec2_is_approx_equal(vec2 lhs, vec2 rhs, double eps) { } void vec2_print(vec2 v) { - printf("x = %f, y = %f\n", v.x, v.y); + printf("x = %g, y = %g\n", v.x, v.y); } \ No newline at end of file