Skip to content
Snippets Groups Projects
Commit 97a04f8c authored by Michael Leuschel's avatar Michael Leuschel
Browse files

add comments

parent 1eaf5036
No related branches found
No related tags found
No related merge requests found
MACHINE MovingParticles MACHINE MovingParticles
// Encoding of an n-body problem in B using the REAL datatype
INCLUDES Vectors INCLUDES Vectors
DEFINITIONS DEFINITIONS
"LibraryReals.def"; "SORT.def"; "LibraryReals.def"; "SORT.def";
MASS == FLOAT; MASS == FLOAT;
POS == FLOAT;
SPEED == FLOAT;
OBJ == 1..nobjs; OBJ == 1..nobjs;
G == 6.67e-11; G == 6.67e-11;
SCALE == 1.25e11; // 100 % in visualisation SCALE == 1.25e11; // 100 % in visualisation
SCALE100 == (SCALE/100.0); SCALE100 == (SCALE/100.0);
...@@ -20,30 +21,36 @@ DEFINITIONS ...@@ -20,30 +21,36 @@ DEFINITIONS
unit_vec(delta_vec(pos(j),pos(i))))) unit_vec(delta_vec(pos(j),pos(i)))))
) ) ) // acceleration ) ) ) // acceleration
ABSTRACT_CONSTANTS ABSTRACT_CONSTANTS
force_between force_between /*@desc "gravitational force between two objects" */
CONSTANTS mass, nobjs CONSTANTS
mass /*@desc "mass of each object OBJ --> MASS" */,
nobjs
PROPERTIES PROPERTIES
nobjs : 1..10 & nobjs : 1..10 &
mass : OBJ --> MASS & mass : OBJ --> MASS &
force_between = %(a,b,pa,pb).(a:OBJ & b:OBJ & a/=b | (G * mass(a) * mass(b)) / (distance(pa,pb)**2)) force_between = %(a,b,pa,pb).(a:OBJ & b:OBJ & a/=b | (G * mass(a) * mass(b)) / (distance(pa,pb)**2))
& & // specific configuration:
n = 2 & // two dimensional space n = 2 & // two dimensional space
nobjs = 3 & mass = [5.97e24, 1.989e30, 1.989e30] nobjs = 3 &
mass = [5.97e24, 1.989e30, 1.989e30]
VARIABLES pos, speed VARIABLES pos, speed
INVARIANT INVARIANT
pos : OBJ --> VEC & pos : OBJ --> VEC &
speed : OBJ --> VEC speed : OBJ --> VEC
INITIALISATION pos := [ [0.0,0.0] , [0.0,4.5e10] , [0.0,-4.5e10 ] ] || INITIALISATION
pos := [ [0.0,0.0] , [0.0,4.5e10], [0.0,-4.5e10] ] ||
speed := [ [0.05e04,0.0], [3.0e04,0.0], [-3.0e04,0.0] ] speed := [ [0.05e04,0.0], [3.0e04,0.0], [-3.0e04,0.0] ]
OPERATIONS OPERATIONS
r <-- ForceBetween(a,b) = PRE a:OBJ & b:OBJ & a/= b THEN r <-- ForceBetween(a,b) =
PRE a:OBJ & b:OBJ & a/= b & bfalse THEN
r := force_between(a,b,pos(a),pos(b)) r := force_between(a,b,pos(a),pos(b))
END; END;
Move(delta) = PRE delta:REAL & delta = 10000.0 THEN Move(deltaT) = // move time by deltaT time units
speed := %i.(i:OBJ | add_vec(speed(i),times_vec(delta,gravitation(i)) )) || PRE deltaT:REAL & deltaT = 10000.0 THEN
pos := %i.(i:OBJ | add_vec(pos(i),times_vec(delta,speed(i))) ) speed := %i.(i:OBJ | add_vec(speed(i),times_vec(deltaT,gravitation(i)) )) ||
pos := %i.(i:OBJ | add_vec(pos(i), times_vec(deltaT,speed(i))) ) // we could use new speed
END END
END END
...@@ -4,41 +4,45 @@ DEFINITIONS ...@@ -4,41 +4,45 @@ DEFINITIONS
ABSTRACT_CONSTANTS ABSTRACT_CONSTANTS
n, n,
VEC, DIM, VEC, DIM,
add_vec, add_vec /*@desc "sum of two vectors" */,
delta_vec, delta_vec /*@desc "difference of two vectors" */,
dot_product, dot_product /*@desc "dot product of two vectors" */,
magnitude, magnitude /*@desc "Magnitude of a vector" */,
unit_vec, unit_vec /*@desc "unit vector of a vector" */,
times_vec, times_vec /*@desc "multiply scalar by a vector" */,
distance, distance /*@desc "Eucledian distance between two vectors" */,
add_first, add_first,
sigma_reals, sigma_reals /*@desc "sum of a numbers of a vector" */,
add_firstv, add_firstv,
sigma_vecs sigma_vecs /*@desc "sum of a sequence of vectors" */
PROPERTIES PROPERTIES
n:NATURAL1 & n:NATURAL1 &
DIM = (1..n) & DIM = (1..n) &
VEC = DIM --> REAL & VEC = DIM --> REAL &
add_first = %v.(v:seq1(REAL) | (v(1)+v(2)) -> tail(tail(v))) & add_first = %v.(v:seq1(REAL) | (v(1)+v(2)) -> tail(tail(v))) & // auxiliary function
sigma_reals = %v.(v:VEC | (iterate(add_first,n-1)(v))(1)) & sigma_reals = %v.(v:VEC | (iterate(add_first,n-1)(v))(1)) & // sum the values in a vector
add_firstv = %v.(v:seq1(VEC) | add_vec(v(1),v(2)) -> tail(tail(v))) & add_firstv = %v.(v:seq1(VEC) | add_vec(v(1),v(2)) -> tail(tail(v))) & // auxiliary function
sigma_vecs = %v.(v:seq1(VEC) | (iterate(add_firstv,size(v)-1)(v))(1)) & sigma_vecs = %v.(v:seq1(VEC) | (iterate(add_firstv,size(v)-1)(v))(1)) & // sum a sequence of vectors
add_vec = %(v1,v2).(v1:VEC & v2:VEC | %i.(i:DIM| v1(i)+v2(i))) & add_vec = %(v1,v2).(v1:VEC & v2:VEC | %i.(i:DIM| v1(i)+v2(i)))
delta_vec = %(v1,v2).(v1:VEC & v2:VEC | %i.(i:DIM| v1(i)-v2(i))) & /*@desc "sum of two vectors" */ &
delta_vec = %(v1,v2).(v1:VEC & v2:VEC | %i.(i:DIM| v1(i)-v2(i)))
/*@desc "difference of two vectors" */ &
// dot_product = %(v1,v2).(v1:VEC & v2:VEC | SIGMA(i).(i:DIM| v1(i)*v2(i))) & // dot_product = %(v1,v2).(v1:VEC & v2:VEC | SIGMA(i).(i:DIM| v1(i)*v2(i))) &
dot_product = %(v1,v2).(v1:VEC & v2:VEC | sigma_reals(%i.(i:DIM| v1(i)*v2(i)))) & dot_product = %(v1,v2).(v1:VEC & v2:VEC | sigma_reals(%i.(i:DIM| v1(i)*v2(i))))
/*@desc "dot product of two vectors" */ &
magnitude = %v1.(v1:VEC | RSQRT(dot_product(v1,v1))) & magnitude = %v1.(v1:VEC | RSQRT(dot_product(v1,v1))) /*@desc "Magnitude of a vector" */ &
unit_vec = %v1.(v1:VEC | LET m BE m=magnitude(v1) IN unit_vec = %v1.(v1:VEC | LET m BE m=magnitude(v1) IN
%i.(i:DIM| v1(i)/m) END ) & %i.(i:DIM| v1(i)/m) END ) /*@desc "unit vector of a vector" */ &
times_vec = %(k,v1).(k:REAL & v1:VEC | %i.(i:DIM| k*v1(i))) & times_vec = %(k,v1).(k:REAL & v1:VEC | %i.(i:DIM| k*v1(i))) /*@desc "multiply scalar by a vector" */ &
distance = %(v1,v2).(v1:VEC & v2:VEC | magnitude(delta_vec(v1,v2))) distance = %(v1,v2).(v1:VEC & v2:VEC | magnitude(delta_vec(v1,v2)))
/*@desc "Eucledian distance between two vectors" */
END END
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment