Update of /cvsroot/pure-data/externals/nusmuk/msd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30071/msd
Modified Files: help-msd.pd main.cpp Log Message: MSD Version 0.02
Index: main.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/nusmuk/msd/main.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** main.cpp 15 Apr 2005 18:13:39 -0000 1.2 --- main.cpp 20 Apr 2005 15:33:14 -0000 1.3 *************** *** 102,106 ****
// --------------------------------------------------------------- RESET ! void m_reset() { --- 102,106 ----
// --------------------------------------------------------------- RESET ! // ---------------------------------------------------------------------- void m_reset() { *************** *** 122,125 **** --- 122,126 ----
// -------------------------------------------------------------- COMPUTE + // -----------------------------------------------------------------------
void m_bang() *************** *** 131,145 **** for (i=0; i<nb_link; i++) { // compute link forces ! distance = link[i]->mass1->posX-link[i]->mass2->posX; ! F = link[i]->K1 * (distance - link[i]->longueur) ; // F = k1(x1-x2) ! F += link[i]->D1 * (distance - link[i]->distance_old) ; // F = F + D1(v1-v2) if (distance != 0) { ! Fx = F * (link[i]->mass1->posX - link[i]->mass2->posX)/distance; } ! link[i]->mass1->forceX -= Fx; ! link[i]->mass1->forceX -= link[i]->D2*link[i]->mass1->speedX; ! link[i]->mass2->forceX += Fx; ! link[i]->mass2->forceX -= link[i]->D2*link[i]->mass2->speedX; ! link[i]->distance_old = distance; }
--- 132,146 ---- for (i=0; i<nb_link; i++) { // compute link forces ! distance = link[i]->mass1->posX-link[i]->mass2->posX; // L[n] = x1 - x2 ! F = link[i]->K1 * (distance - link[i]->longueur) ; // F[n] = k1 (L[n] - L[0]) ! F += link[i]->D1 * (distance - link[i]->distance_old) ; // F[n] = F[n] + D1 (L[n] - L[n-1]) if (distance != 0) { ! Fx = F * (link[i]->mass1->posX - link[i]->mass2->posX)/distance; // Fx = F * Lx[n]/L[n] } ! link[i]->mass1->forceX -= Fx; // Fx1[n] = -Fx ! link[i]->mass1->forceX -= link[i]->D2*link[i]->mass1->speedX; // Fx1[n] = Fx1[n] - D2 * vx1[n-1] ! link[i]->mass2->forceX += Fx; // Fx2[n] = Fx ! link[i]->mass2->forceX -= link[i]->D2*link[i]->mass2->speedX; // Fx2[n] = Fx2[n] - D2 * vx2[n-1] ! link[i]->distance_old = distance; // L[n-1] = L[n] }
*************** *** 147,154 **** // compute new masses position only if mobile = 1 if (mass[i]->mobile == 1) { ! X_new = mass[i]->forceX * mass[i]->invM + 2*mass[i]->posX - mass[i]->posX2; ! mass[i]->posX2 = mass[i]->posX; ! mass[i]->posX = max(min(X_new,Xmax),Xmin); // x = x + v ! mass[i]->speedX = mass[i]->posX - mass[i]->posX2; // v = v + F/M }
--- 148,155 ---- // compute new masses position only if mobile = 1 if (mass[i]->mobile == 1) { ! X_new = mass[i]->forceX * mass[i]->invM + 2*mass[i]->posX - mass[i]->posX2; // x[n] =Fx[n]/M+2x[n]-x[n-1] ! mass[i]->posX2 = mass[i]->posX; // x[n-2] = x[n-1] ! mass[i]->posX = max(min(X_new,Xmax),Xmin); // x[n-1] = x[n] ! mass[i]->speedX = mass[i]->posX - mass[i]->posX2; // vx[n] = x[n] - x[n-1] }
*************** *** 156,165 **** // clear forces mass[i]->out_forceX = mass[i]->forceX; ! mass[i]->forceX = 0; } }
// -------------------------------------------------------------- MASSES ! void m_mass(int argc,t_atom *argv) // add a mass --- 157,166 ---- // clear forces mass[i]->out_forceX = mass[i]->forceX; ! mass[i]->forceX = 0; // Fx[n] = 0 } }
// -------------------------------------------------------------- MASSES ! // ---------------------------------------------------------------------- void m_mass(int argc,t_atom *argv) // add a mass *************** *** 169,184 **** t_float M;
! mass[nb_mass] = new t_mass; // new pointer ! mass[nb_mass]->Id = GetSymbol(argv[0]); // ID mass[nb_mass]->mobile = GetInt(argv[1]); // mobile if (GetFloat(argv[2])==0) M=1; else M = GetFloat(argv[2]); ! mass[nb_mass]->invM = 1/(M); // invM ! mass[nb_mass]->speedX = 0; // vx ! mass[nb_mass]->posX = GetFloat(argv[3]); // x ! mass[nb_mass]->posX2 = GetFloat(argv[3]); // x ! mass[nb_mass]->forceX = 0; // Fx ! mass[nb_mass]->nbr = id_mass; // id_nbr nb_mass++ ; id_mass++; --- 170,185 ---- t_float M;
! mass[nb_mass] = new t_mass; // new mass ! mass[nb_mass]->Id = GetSymbol(argv[0]); // ID mass[nb_mass]->mobile = GetInt(argv[1]); // mobile if (GetFloat(argv[2])==0) M=1; else M = GetFloat(argv[2]); ! mass[nb_mass]->invM = 1/(M); // 1/M ! mass[nb_mass]->speedX = 0; // vx[n] ! mass[nb_mass]->posX = GetFloat(argv[3]); // x[n] ! mass[nb_mass]->posX2 = GetFloat(argv[3]); // x[n-1] ! mass[nb_mass]->forceX = 0; // Fx[n] ! mass[nb_mass]->nbr = id_mass; // id number nb_mass++ ; id_mass++; *************** *** 253,256 **** --- 254,259 ---- t_atom sortie[5], aux[nb_link]; + + // Delete all associated links for (i=0; i<nb_link;i++) { if (link[i]->mass1->nbr == GetAInt(argv[0]) || link[i]->mass2->nbr == GetAInt(argv[0])) { *************** *** 262,266 **** for (i=0; i<nb_link_delete;i++) m_delete_link(1,&aux[i]); ! for (i=0; i<nb_mass;i++) if (mass[i]->nbr == GetAInt(argv[0])) { --- 265,270 ---- for (i=0; i<nb_link_delete;i++) m_delete_link(1,&aux[i]); ! ! // Delete mass for (i=0; i<nb_mass;i++) if (mass[i]->nbr == GetAInt(argv[0])) { *************** *** 271,275 **** SetFloat((sortie[4]),mass[i]->posX); delete mass[i]; ! mass[i] = mass[nb_mass-1]; nb_mass--; ToOutAnything(1,S_Mass_deleted,5,sortie); --- 275,279 ---- SetFloat((sortie[4]),mass[i]->posX); delete mass[i]; ! mass[i] = mass[nb_mass-1]; // copy last mass instead nb_mass--; ToOutAnything(1,S_Mass_deleted,5,sortie); *************** *** 282,286 **** void m_Xmax(int argc,t_atom *argv) { ! // set damping of link(s) named Id Xmax = GetFloat(argv[0]); } --- 286,290 ---- void m_Xmax(int argc,t_atom *argv) { ! // set X max Xmax = GetFloat(argv[0]); } *************** *** 288,296 **** void m_Xmin(int argc,t_atom *argv) { ! // set damping of link(s) named Id Xmin = GetFloat(argv[0]); }
// -------------------------------------------------------------- LINKS
void m_link(int argc,t_atom *argv) --- 292,301 ---- void m_Xmin(int argc,t_atom *argv) { ! // set X min Xmin = GetFloat(argv[0]); }
// -------------------------------------------------------------- LINKS + // ---------------------------------------------------------------------
void m_link(int argc,t_atom *argv) *************** *** 301,318 **** t_int i;
! link[nb_link] = new t_link; ! link[nb_link]->Id = GetSymbol(argv[0]); for (i=0; i<nb_mass;i++) ! if (mass[i]->nbr==GetAInt(argv[1])) link[nb_link]->mass1 = mass[i]; ! else if(mass[i]->nbr==GetAInt(argv[2])) link[nb_link]->mass2 = mass[i]; ! link[nb_link]->K1 = GetFloat(argv[3]); ! link[nb_link]->D1 = GetFloat(argv[4]); ! link[nb_link]->D2 = GetFloat(argv[5]); ! link[nb_link]->longx = link[nb_link]->mass1->posX - link[nb_link]->mass2->posX; ! link[nb_link]->longueur = link[nb_link]->longx ; ! link[nb_link]->nbr = id_link; ! link[nb_link]->distance_old = link[nb_link]->longueur; nb_link++; id_link++; --- 306,323 ---- t_int i;
! link[nb_link] = new t_link; // New pointer ! link[nb_link]->Id = GetSymbol(argv[0]); // ID for (i=0; i<nb_mass;i++) ! if (mass[i]->nbr==GetAInt(argv[1])) // pointer to mass1 link[nb_link]->mass1 = mass[i]; ! else if(mass[i]->nbr==GetAInt(argv[2])) // pointer to mass2 link[nb_link]->mass2 = mass[i]; ! link[nb_link]->K1 = GetFloat(argv[3]); // K1 ! link[nb_link]->D1 = GetFloat(argv[4]); // D1 ! link[nb_link]->D2 = GetFloat(argv[5]); // D2 ! link[nb_link]->longx = link[nb_link]->mass1->posX - link[nb_link]->mass2->posX; // Lx[0] ! link[nb_link]->longueur = link[nb_link]->longx ;// L[0] ! link[nb_link]->nbr = id_link; // id number ! link[nb_link]->distance_old = link[nb_link]->longueur; // L[n-1] nb_link++; id_link++; *************** *** 357,361 **** SetFloat((arglist[1]),mass[imass1[i]]->nbr); SetFloat((arglist[2]),mass[imass2[j]]->nbr); ! SetFloat((arglist[3]),GetInt(argv[3])); SetFloat((arglist[4]),GetFloat(argv[4])); SetFloat((arglist[5]),GetFloat(argv[5])); --- 362,366 ---- SetFloat((arglist[1]),mass[imass1[i]]->nbr); SetFloat((arglist[2]),mass[imass2[j]]->nbr); ! SetFloat((arglist[3]),GetFloat(argv[3])); SetFloat((arglist[4]),GetFloat(argv[4])); SetFloat((arglist[5]),GetFloat(argv[5])); *************** *** 419,423 **** SetFloat((sortie[6]),link[i]->D2); delete link[i]; ! link[i]=link[nb_link-1]; nb_link--; ToOutAnything(1,S_Link_deleted,7,sortie); --- 424,428 ---- SetFloat((sortie[6]),link[i]->D2); delete link[i]; ! link[i]=link[nb_link-1]; // copy last link instead nb_link--; ToOutAnything(1,S_Link_deleted,7,sortie); *************** *** 428,431 **** --- 433,437 ----
// -------------------------------------------------------------- GET + // -------------------------------------------------------------------
void m_get(int argc,t_atom *argv) *************** *** 596,600 ****
void m_force_dumpl() ! // List of masses positions on first outlet { t_atom sortie[nb_mass]; --- 602,606 ----
void m_force_dumpl() ! // List of masses forces on first outlet { t_atom sortie[nb_mass]; *************** *** 608,612 ****
void m_info_dumpl() ! // List of masses positions on first outlet { t_atom sortie[7]; --- 614,618 ----
void m_info_dumpl() ! // List of masses and links infos on first outlet { t_atom sortie[7]; *************** *** 637,650 ****
// -------------------------------------------------------------- PROTECTED VARIABLES
! t_link * link[nb_max_link]; ! t_mass * mass[nb_max_mass]; ! t_float Xmin, Xmax, Ymin, Ymax; int nb_link, nb_mass, id_mass, id_link;
// -------------------------------------------------------------- SETUP
private:
const static t_symbol *S_Reset; const static t_symbol *S_Mass; --- 643,659 ----
// -------------------------------------------------------------- PROTECTED VARIABLES + // -----------------------------------------------------------------------------------
! t_link * link[nb_max_link]; // Pointer table on links ! t_mass * mass[nb_max_mass]; // Pointer table on masses ! t_float Xmin, Xmax; // Limit values int nb_link, nb_mass, id_mass, id_link;
// -------------------------------------------------------------- SETUP + // ---------------------------------------------------------------------
private:
+ // Static symbols const static t_symbol *S_Reset; const static t_symbol *S_Mass; *************** *** 722,726 **** FLEXT_CALLBACK_V(m_delete_mass) }; !
const t_symbol *msd::S_Reset = MakeSymbol("Reset"); --- 731,736 ---- FLEXT_CALLBACK_V(m_delete_mass) }; ! // -------------------------------------------------------------- STATIC VARIABLES ! // -------------------------------------------------------------------------------
const t_symbol *msd::S_Reset = MakeSymbol("Reset");
Index: help-msd.pd =================================================================== RCS file: /cvsroot/pure-data/externals/nusmuk/msd/help-msd.pd,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** help-msd.pd 12 Apr 2005 18:09:20 -0000 1.1 --- help-msd.pd 20 Apr 2005 15:33:14 -0000 1.2 *************** *** 1,76 **** ! #N canvas 0 0 794 877 10; #X obj 33 821 msd; ! #X obj 62 14 cnv 15 610 305 empty empty CREATION 20 12 0 14 -262131 -66577 0; ! #X msg 79 43 reset; ! #X text 249 74 Add a mass; ! #X text 335 75 $1 : Id (symbol); ! #X text 334 95 $2 : fixed or mobile (0/1); ! #X text 334 113 $3 : mass; ! #X text 334 151 $1 : Id (symbol); ! #X text 246 151 Add a link; ! #X text 333 171 $2 : creation No of mass1; ! #X text 333 189 $3 : creation No of mass2; ! #X text 332 207 $4 : rigidity; ! #X text 251 44 Delete all masses and links; ! #X text 332 225 $5 : viscosity; ! #X text 332 242 $6 : damping; ! #X obj 62 324 cnv 15 610 60 empty empty COMPUTATION 20 12 0 14 -261689 -66577 0; ! #X msg 82 353 bang; ! #X text 235 353 Compute new masses positions; ! #X obj 61 388 cnv 15 610 220 empty empty DYNAMIC_SETTING 20 12 0 14 -262131 -66577 0; ! #X msg 169 410 setD $1 $2; ! #X text 354 428 $1 : Id (symbol); ! #X text 354 446 $2 : New value; ! #X msg 87 410 setK $1 $2; ! #X text 350 482 $1 : Id (symbol); ! #X text 350 500 $2 : New value; ! #X text 348 539 $1 : Id (symbol); ! #X text 348 557 $2 : New value; ! #X msg 87 462 posX $1 $2; ! #X text 350 464 Set position of mass(es); ! #X text 347 522 Add force on mass(es); ! #X msg 85 521 forceX $1 $2; ! #X msg 255 410 setD2 $1 $2; ! #X text 354 410 Set rigidity , viscosity or damping of link(s); ! #X obj 60 617 cnv 15 610 198 empty empty GET_ATTRIBUTES 20 12 0 14 -261689 -66577 0; ! #X msg 146 644 massePosL; ! #X msg 146 672 masseForcesL; ! #X text 247 644 output all masses positions in a list on outlet No 1; ! #X text 246 673 output all masses forces in a list on outlet No 1; ! #X msg 145 710 get $1 $2; ! #X text 248 711 Get specific attribute; ! #X text 248 736 $1 : Attribute type ( massesPos / massesSpeeds / massesForces / linksPos ); ! #X text 248 773 $2 : Id (symbol or creations numbers); ! #X text 334 131 $4 : position; ! #X msg 79 74 mass $1 $2 $3 $4; ! #X msg 76 151 link $1 $2 $3 $4 $5 $6; ! #X msg 75 258 deleteMass $1; ! #X text 240 260 Delete a mass and associated links; ! #X text 330 277 $1 : Creation No of mass; ! #X msg 74 294 deleteLink $1; ! #X text 239 296 Delete a link; ! #X text 340 296 $1 : Creation No of link; ! #X msg 143 793 infosL; ! #X text 246 793 Get infos on all masses and links on outlet No 2; ! #X msg 84 573 Xmin $1 , Xmax $1; ! #X text 347 576 Set minimimum and maximum X of masses; ! #X text 347 593 $1 : Value; #X connect 2 0 0 0; #X connect 16 0 0 0; #X connect 22 0 0 0; ! #X connect 27 0 0 0; #X connect 30 0 0 0; ! #X connect 34 0 0 0; #X connect 35 0 0 0; - #X connect 38 0 0 0; - #X connect 43 0 0 0; #X connect 44 0 0 0; ! #X connect 45 0 0 0; ! #X connect 48 0 0 0; ! #X connect 51 0 0 0; --- 1,170 ---- ! #N canvas 367 274 570 449 10; ! #N canvas 271 52 742 843 masses 1; #X obj 33 821 msd; ! #X obj 62 154 cnv 15 610 180 empty empty CREATION 20 12 0 14 -262131 -66577 0; ! #X msg 79 183 reset; ! #X text 249 214 Add a mass; ! #X text 335 215 $1 : Id (symbol); ! #X text 334 235 $2 : fixed or mobile (0/1); ! #X text 334 253 $3 : mass; ! #X text 251 184 Delete all masses and links; ! #X obj 62 338 cnv 15 610 60 empty empty COMPUTATION 20 12 0 14 -261689 -66577 0; ! #X msg 82 367 bang; ! #X text 235 367 Compute new masses positions; ! #X obj 61 403 cnv 15 610 210 empty empty DYNAMIC_SETTING 20 12 0 14 -262131 -66577 0; ! #X text 350 449 $1 : Id (symbol); ! #X text 350 467 $2 : New value; ! #X text 348 503 $1 : Id (symbol); ! #X text 348 521 $2 : New value; ! #X msg 87 429 posX $1 $2; ! #X text 350 431 Set position of mass(es); ! #X text 347 486 Add force on mass(es); ! #X msg 85 485 forceX $1 $2; ! #X obj 61 617 cnv 15 610 198 empty empty GET_ATTRIBUTES 20 12 0 14 -261689 -66577 0; ! #X msg 147 644 massePosL; ! #X msg 147 672 masseForcesL; ! #X text 248 644 output all masses positions in a list on outlet No 1; ! #X text 247 673 output all masses forces in a list on outlet No 1; ! #X msg 146 710 get $1 $2; ! #X text 249 711 Get specific attribute; ! #X text 249 736 $1 : Attribute type ( massesPos / massesSpeeds / massesForces / linksPos ); ! #X text 249 773 $2 : Id (symbol or creations numbers); ! #X msg 79 214 mass $1 $2 $3 $4; ! #X msg 79 290 deleteMass $1; ! #X text 248 292 Delete a mass and associated links; ! #X text 338 309 $1 : Creation No of mass; ! #X msg 144 793 infosL; ! #X text 247 793 Get infos on all masses and links on outlet No 2; ! #X msg 84 535 Xmin $1 , Xmax $1; ! #X text 347 538 Set minimimum and maximum X of masses; ! #X text 347 555 $1 : Value; ! #X text 73 22 MASSES :; ! #X text 66 69 They got only one physical parameter , the value of ! their; ! #X text 67 83 mass. They can be mobile or fixed , in this case forces ! ; ! #X text 67 54 The msd masses are the principals objects of the model. ! ; ! #X text 66 97 applied on them automatically , by links , or manually ! , by; ! #X text 67 112 messages , don't do anything.; ! #X msg 81 574 setMobile $1 , setFixed $1; ! #X text 345 578 Change mobile parameter; ! #X text 345 594 $1 : Creation No of mass; ! #X text 334 271 $4 : initial position; #X connect 2 0 0 0; + #X connect 9 0 0 0; #X connect 16 0 0 0; + #X connect 19 0 0 0; + #X connect 21 0 0 0; #X connect 22 0 0 0; ! #X connect 25 0 0 0; ! #X connect 29 0 0 0; #X connect 30 0 0 0; ! #X connect 33 0 0 0; #X connect 35 0 0 0; #X connect 44 0 0 0; ! #X restore 281 323 pd masses; ! #N canvas 222 83 808 841 links 0; ! #X obj 33 821 msd; ! #X obj 62 250 cnv 15 610 305 empty empty CREATION 20 12 0 14 -262131 ! -66577 0; ! #X msg 79 279 reset; ! #X text 338 308 $1 : Id (symbol); ! #X text 250 308 Add a link; ! #X text 337 328 $2 : creation No of mass1; ! #X text 337 346 $3 : creation No of mass2; ! #X text 336 364 $4 : rigidity; ! #X text 251 280 Delete all masses and links; ! #X text 336 382 $5 : viscosity; ! #X text 336 399 $6 : damping; ! #X obj 61 561 cnv 15 610 82 empty empty DYNAMIC_SETTING 20 12 0 14 ! -262131 -66577 0; ! #X msg 172 583 setD $1 $2; ! #X text 354 601 $1 : Id (symbol); ! #X text 354 619 $2 : New value; ! #X msg 87 583 setK $1 $2; ! #X msg 255 583 setD2 $1 $2; ! #X text 354 583 Set rigidity , viscosity or damping of link(s); ! #X obj 60 650 cnv 15 610 140 empty empty GET_ATTRIBUTES 20 12 0 14 ! -261689 -66577 0; ! #X msg 75 679 get $1 $2; ! #X text 237 680 Get specific attribute; ! #X text 237 705 $1 : Attribute type ( massesPos / massesSpeeds / massesForces ! / linksPos ); ! #X text 237 742 $2 : Id (symbol or creations numbers); ! #X msg 78 308 link $1 $2 $3 $4 $5 $6; ! #X msg 74 532 deleteLink $1; ! #X text 239 534 Delete a link; ! #X text 340 534 $1 : Creation No of link; ! #X msg 73 762 infosL; ! #X text 236 762 Get infos on all masses and links on outlet No 2; ! #X msg 73 423 iLink $1 $2 $3 $4 $5 $6; ! #X text 338 308 $1 : Id (symbol); ! #X text 250 308 Add a link; ! #X text 337 328 $2 : creation No of mass1; ! #X text 337 346 $3 : creation No of mass2; ! #X text 336 364 $4 : rigidity; ! #X text 336 382 $5 : viscosity; ! #X text 336 399 $6 : damping; ! #X text 410 422 $1 : Id (symbol); ! #X text 409 478 $4 : rigidity; ! #X text 409 496 $5 : viscosity; ! #X text 409 513 $6 : damping; ! #X text 410 422 $1 : Id (symbol); ! #X text 409 478 $4 : rigidity; ! #X text 409 496 $5 : viscosity; ! #X text 409 513 $6 : damping; ! #X text 248 423 Add an interactor link; ! #X text 94 52 LINKS :; ! #X text 71 91 parameters : length , rigidity , viscosity and damping. ! ; ! #X text 72 78 Links connect masses two by two. They got 4 physicals ! ; ! #X text 70 134 the two masses at the creation.; ! #X text 71 120 message. The lenght is initialised to the distance between ! ; ! #X text 71 106 Rigidity , viscosity and damping are defined by the ! creation; ! #X text 409 442 $2 : Id (symbol) of masses type 1; ! #X text 409 460 $3 : Id (symbol) of masses type 2; ! #X text 70 148 Interactor links are links between mutiples masses , ! instead; ! #X text 70 161 of creation number , the masses linked are defined ! with; ! #X text 69 175 their Id.; ! #X connect 2 0 0 0; ! #X connect 15 0 0 0; ! #X connect 19 0 0 0; ! #X connect 23 0 0 0; ! #X connect 24 0 0 0; ! #X connect 27 0 0 0; ! #X connect 29 0 0 0; ! #X restore 283 353 pd links; ! #X text 135 323 HELP on masses --->; ! #X text 134 354 HELP on links --->; ! #X text 154 34 MSD : mass - spring - damper model; ! #X text 75 79 MSD is the 1D object of the msd objects collection.; ! #X text 73 128 There are 4 types of messages for msd :; ! #X text 74 92 It is designed to implement particules physical model ! in PD.The model is based on two elements type : mass and link.; ! #X obj 73 143 cnv 15 420 30 empty empty empty 20 12 0 14 -262131 -66577 ! 0; ! #X obj 73 176 cnv 15 420 30 empty empty empty 20 12 0 14 -261689 -66577 ! 0; ! #X obj 73 209 cnv 15 420 30 empty empty empty 20 12 0 14 -262131 -66577 ! 0; ! #X obj 73 242 cnv 15 420 30 empty empty empty 20 12 0 14 -261689 -66577 ! 0; ! #X text 76 150 CREATION : To create the model masses and links.; ! #X text 76 215 DYNAMIC SETTING : To set the model parameters dynamically. ! ; ! #X text 76 248 ATTRIBUTES : To get the model parameters.; ! #X text 76 177 COMPUTATION : To compute the new model state based on ! previous instant.;