Miguel Ángel Ballesteros bio photo

Miguel Ángel Ballesteros

Maker, using software to bring great ideas to life. Manager, empowering and developing people to achieve meaningful goals. Father, devoted to family. Lifelong learner, with a passion for generative AI.

Email LinkedIn Github
RSS Feed

GSF - Generador de Sistemas Físicos (Physical Systems Generator)

Back to 1994, I was studying physics in University of Valencia. After reading a Richard Feynman book where he proposed a numerical method to calculate a particle’s path given its initial location, velocity, and forces upon it, I decided to build a C program to make a particles simulation system… that was GSF.

I’ve rescued the code and share it for the records in a GitHub repo.

Looking to that old code, it surprise me how much comments I did, and how much effort in handling input/output files… now I’d use just JSON for everything (input definition, output calculations), so I could focus just in the numeric algorithm that Feyman was describing.

May be someday I’ll do an upgrade to HTML5…

Original program documentation (ES)

El metodo mas sencillo de ver que hace todo esto es probar las DEMOs que acompañan a los programas. Así que, si no lo has hecho todavía, haz funcionar alguna primero (por ejemplo, escribe demo001).

El entorno GSF esta formado por dos programas: GSFMS y GSFVM. El programa GSFMS es el motor de sistemas fisicos. Es el programa que se encarga de generar todos los movimientos que realiza un sistema fisico, que se le proporciona como entrada, cuando se hace avanzar el tiempo. Para poder ver los resultados se usa el visualizador GSFVM. Este programa es un procesador de comandos directos y puede realizar diversas funciones de presentacion por pantalla de movimientos, tanto en 2D como en 3D.

Los programas han sido desarrollados en C usando el QuickC, y vienen incluidos junto con los ejecutables. Puede que GSFMS pueda portarse a otros compiladores como Turbo C, pero no creo que sea posible (sin muchas modificaciones) hacer lo mismo con GSFVM.

Las demos que se incluyen, llaman a GSFVM y le pasan las datos previamente calculados por GSFMS, ademas de los comandos que debe ir realizando.

La idea de realizar este programa surgio tras la lectura de un libro de Feynman donde proponia un metodo numerico para calcular la trayectoria de una particula sometida a fuerzas. Con los conocimientos fundamentales de un primer curso de fisicas en la Universidad de Valencia y un buen metodo numerico, comence a escribir el programa. Esto es lo que salio. Agradeceria enormemente, a todo aquel que lo desee, consejos, mejoras, etc.

GSFMS - Motor de sistemas

GSFMS acepta como entrada un fichero donde se describe el sistema a mover. En la descripcion se dan el numero de particulas o cuerpos que intervienen, el tiempo que dura la animacion, la dimension del espacio en el que se mueven, etc., asi como las condiciones iniciales del movimiento y los campos que intervienen. Llamaremos al fichero de entrada ‘fichero de sistema fisico’, o fsf.

Un fichero fsf consta de dos bloques. El primero es el bloque de definicion de entorno y es de la forma:

DefEntorno={var=cte;var=cte;car=cte;....}

Las asignaciones permiten establecer los valores de las principales variables de entorno. Las variables son:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  NumBodys       - Numero de cuerpos que intervienen.
  Tiempo         - Tiempo que dura la animacion del movimiento.
  IncTemporal    - Incremento en el tiempo en cada paso. No podemos
       olvidar que trabajamos con metodos numericos para
       resolver ecuaciones diferenciales. Un incremento
       temporal peque§o, nos asegura mayor precision. En
       cada caso debemos llegar a un comprosiso entre
       precision y tiempo de calculo (cuanto mas peque§o es
       el incremento, tantos mas calculos se realizan).
  SpaceDimension - Esta variable contiene la dimension del espacio en
       el que se mueven las particulas.
  NumCampos      - Numero de campos de fuerzas que intervienen.
  SinInteraccion - Esta variable permite la posibilidad de insensibilizar
       particulas entre si, aunque generen campos similares.
       Es una variable biestado, se iguala a Si o No.

Un ejemplo de definicion de entorno seria:

1
2
3
4
5
6
7
  DefEntorno = {
     NumBodys       = 22;
     Tiempo         = 60;
     IncTemporal    = 0.2;
     SpaceDimension = 2;
     NumCampos      = 2;
   }

El segundo bloque en un fichero fsf es la definicion del sistema. Este bloque es de la forma:

DefSistema={ {defpart},{defpart},...}

donde defpart es la definicion de una particula. La definicion de una particula conste de 4 partes y es de la forma:

{pos.inicial}, {vel.inicial}, {campo1,campo2,...}, {mgs1,mgs2,...}

Un ejempo: {-5,0,0}, {0, 0.2,0} , {Null,UnitA}, {15, 5}

Este ejemplo define una particula que se halla en la posicion (-5,0,0) del espacio en el instante inicial, y que parte con una velocidad de (0,0.2,0). Ademas tiene un campo null (luego veremos que es eso) y genera un campo Unitario Atractivo. Las magnitudes de campo son 15 para el Null y 5 para UnitA.

Todas las particulas se definen del mismo modo y quedan numeradas por su posicion comenzando desde el cero: la primera particula es la particula 0, la segunda particula definida es la 1, etc.

La posicion inicial es de la forma {x,y} si estamos en dimension 2 y de la forma {x,y,z} si estamos en 3D. La velocidad sigue el mismo criterio.

La parte reservada a campos permite poner cuantos campos deseemos, pero deben ser tantos como indique NumCampos. Ademas es fundamental que el primer campo sea el gravitatorio o el nulo. Esto se debe a que, en cualquier caso, mgs1 SIEMPRE es la masa de la particula. El resto de los campos se deben definir igual para todas las particulas. Asi, si definimos que el segundo campo es el electrico, todas las particulas deben tener como segundo campo el electrico o el null (si no se hace asi, los efectos pueden ser muy raros). Esto se debe a que mientras que el ‘campo’ solo dice que la particula genera dicho campo, la mgs correspondiente indica el valor con la que lo genera y el valor con el que es sensible al mismo. Luego veremos esto con mayor detalle.

Se pueden escoger entre los siguientes campos:

  • Gravit - Campo gravitatorio
  • Elect - Campo electrico
  • UnitA - Campo newtoniano atractivo de constante 1
  • UnitR - Campo newtoniano repulsivo de constante 1
  • Elast - Campo elastico
  • Null - No genera ese campo

El campo gravitatorio y electrico es el usual. Los campos unitarios son los que requieren mas atencion. El campo UnitA es igual que el gravitatorio pero con G=1. El campo UnitR es como UnitA pero repulsivo.

El campo Null se utiliza para que la particula no genere ese campo. En el ejemplo de antes

{-5,0,0}, {0, 0.2,0}   , {Null,UnitA},        {15, 5}

la particula, de masa 15, no genera campo gravitatorio.

En este otro ejemplo,

1
2
   { { 8,7,0},   {0,0,0.3}, {null,null},  {1,5} },
   { { 9,7,0},   {0,0,0.7}, {null,unita}, {5,5} }

la primera particula no genera el campo el campo UnitA, pero como tiene asociado a ese campo una mgs de 5, SI experimenta la fuerza debida a la otra particula que SI genera el campo. La otra particula,por el contrario, no experimentara fuerza alguna ya que la primera no genera campo UnitA.

Si quisieramos descolgar completemente a la primera, tan solo tendriamos que hacer:

1
2
   { { 8,7,0},   {0,0,0},   {null,null},  {1,0} },
   { { 9,7,0},   {0,0,0.7}, {null,unita}, {5,5} }

Veamos el siguiente ejemplo:

1
2
3
{ {-5,0},  {0, 0.2},  {Null,Null}, {15, 5} },
{ { 0,0},  {0, 0.3},  {Null,UnitA}, {1, 0.7} },
{ { 5,0},  {0, 0.2},  {Null,Null}, {15, 5} }

Tenemos 3 perticulas que se mueven en la direccion positiva del eje y. La del centro, mas rapida, genera un campo UnitA. Las otras no generan nada, pero son sensibles al campo unitario atractivo. Es por esto que se aproximan a la central, sin que esta ultima sufra ninguna perturbacion en su movimiento. De haber hecho,

1
2
3
{ {-5,0},  {0, 0.2},  {Null,Null}, {15, 0} },
{ { 0,0},  {0, 0.3},  {Null,UnitA}, {1, 0.7} },
{ { 5,0},  {0, 0.2},  {Null,Null}, {15, 5} }

la particula de la izquierda no experimentaria ninguna fuerza, ya que hemos puesto su magnitud sensible/generadora a cero. Como no generaba nada, lo que hemos hecho es insensibilizarla a ese campo.

Otro campo muy interesante es el elastico: Elast. Este campo define su mgs de forma diferente:

  {part1,k1,d1,part2,k2,d2,...}

Es una sucesion de: particula con la que se enlaza, constante elastica, distancia de reposo. Asi, la definicion:

1
  { {-10,0},  {0,0},  {null,elast}, {10,{1,3,1}} } (particula n)

nos dice que esta particula, de masa 10, experimenta fuerzas elasticas con una cte elastica de 3, cuando la particula numero 1 se aleja de la distancia (1 unidad de longitud) de equilibrio. Es importante notar que esto no implica que la particula 1 vaya a experimentar la fuerza de reaccion. Si queremos que esto ocurra tendremos que ‘atarla’ a la particula anterior del mismo modo ( {n,3,1} ).

Esto es todo lo que es necesario conocer. Para mayores detalles (o cosas mas tecnicas), basta sencillamente -je,je,…- con mirar el codigo fuente. De todos modos, creo que las posibilidades son infinitas con lo que hay. Divertios.

GSFVM - Visualizador de movimientos

GSFVM es un procesador de comandos orientados a la visualizacion de movimientos generados por GSFMS.

Cuando se le llama desde DOS, acepta el fichero de movimientos y el modo de video en el que se quiere trabajar. Una vez cargados en memoria los movimientos, aparece un prompt esperando a que introduzcas ordenes.

Las ordenes son una palabra, seguida de uno o dos parametros separados por comas.

Vamos a ver cuales son (1P=un parametro,2P=dos parametros):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
   Quit        - Para salir de GSFVM
   MovSis      - Mueve el sistema
   Escala  1P  - Factor de escala. Inicialmente es de 10
   Centrox 1P  - Coordenada x en pixels del centro
   Centroy 1P  - Coordenada y en pixels del centro
   Retardo 1P  - Tiempo en milisegundos de retardo por ciclo
     de animacion. Si quieres ver con mayor lentitud
     la animacion usa este comando.
   Steep       - Incremento por ciclo en el nß de movimiento. Este
     comando es muy importante si tu ordenador es
     lento, ya que acelera (a costa de suavidad en el
     movimiento) la animacion.
   Cls         - Borrar pantalla (alguien lo dudaba)
   Marca   1P  - Tiene dos efectos:
     - Sobre MovSis, indica cada cuanto se deja una
       huella. Esto permite ver las trayectorias.
     - Sobre Ejes, determina la densidad de puntos
       que se dibujan de los ejes.
   Print   1P  - El parametro es el texto (de menos de 1 linea)
     que visualiza en la ultima posicion dada por
     locate.
   Locate  2P  - Posiciona el cursor para Print
   Wait    1P  - Pausa: tiempo en milisegundos.
   Color   1P  - Color para: Print, Ejes.
   OjoX    1P  - Posicion x del punto de vista
   OjoY    1P  - Posicion y del punto de vista
   OjoZ    1P  - Posicion z del punto de vista
   Ejes    1P  - Dibuja unos ejes en 3D, con una longitud dada por
     su parametro.

Cuando estas en 3D puedes cambiar el punto de vista. Sobre esto hay algo que decir. Las cordenadas del ‘ojo’ no situan nada mas que la direccion desde la que miras al centro. La distancia queda determinada por el factor de escala. El comando Print no tiene limitaciones dentro de la ventana de visualizacion: si el texto es muy grande, se saldra de ella. Como no son demasiados comandos, basta con que cojas un sistema de una de las demos y los pruebes todos.