Diseño y Programación Orientados a Objetos
1er. Sem 2014
Tarea 1: Bolas, Resortes y Puntos de Apoyo como Objetos de Software


Lea detenidamente la tarea. Si algo no lo entiende, consulte en clases. Si es preciso, se incorporarán aclaraciones al final.
Objetivos
* Ejercitar el uso de un ambiente de trabajo para desarrollo de aplicaciones en lenguaje Java (se ha sugerido trabajar con Jgrasp o Eclipse)
* Reconocer objetos de software como modelos de objetos reales.
* Reconocer clases y relaciones entre ellas en códigos fuente Java.
* Ejercitar la extensión de clases dadas para satisfacer nuevos requerimientos.
* Ejercitar la entrada y salida de datos.
* Conocer el formato .csv y su importación en planillas electrónicas.
* Ejercitar la preparación y entrega de resultados de software (creación de makefiles, readme, documentación, manejo de repositorio -GIT).
* Aprender una estrategia para programar simulaciones de fenómenos continuos.

Descripción General
  En esta tarea se modela la interacción objetos reales bolas y resortes sujetos a las leyes de la "naturaleza". A partir de estos modelos se construyen clases de software para crear objetos de software que representarán los objetos reales. En física usted estudió la interacción de masas y resortes. En esta tarea las bolas serán modeladas como masas esféricas sin momento angular. Decimos que este es un modelo y no la realidad porque existe roce y éste hace rodar las bolas; sin embargo, esta suposición simplifica el planteamiento y permite obtener resultados con precisión satisfactoria. Los resortes serán modelados sin masa y cumplirán la ley de Hooke sin límite de elasticidad, es decir, Hooke vale en todas las extensiones del resorte. Como se espera en la realidad, las bolas pueden chocar una con otras. Las colisiones entre bolas deben ser incluidas y se deben suponer elásticas, es decir, se conserva la energía y el momento lineal. El sistema lo supondremos ausente de toda otra fuerza (roce, gravitacional, etc).
  Una vez que las clases básicas estén definidas, usted creará instancias de bolas (balls), resortes (springs) y algunos "ganchos" fijos (fixed hooks) donde es posible fijar el extremo de un resorte. Luego objetos de software se pueden vincular de la manera que se desee para representar a los sistemas que deseamos simular. Notar que aquí aparece otro actor: un simulador.
  Un simulador no es más que el modelo del paso del tiempo, el simulador informará el paso del tiempo a cada objeto del sistema físico. El tiempo avanzará en pasos discretos en lugar de un continuo y así iremos avanzando en nuestra simulación de a pasos "pequeños" (deltas de tiempo). Para calcular la dinámica de bolas sujetas a fuerzas externas, revise este material y éste para los choques.
  En esta tarea se pide construir configuraciones de ganchos, resortes y bolas (nunca dos masas o resortes unidos) en R (una dimensión). Un ejemplo de tales configuraciones se muestra en la Figura 1.   Para ello usted contará con código parcial de la solución  al problema en R. Una vez que la configuración esté armada se inicia la simulación por un tiempo definido por consola. Los resultados, es decir las posiciones de los cuerpos en el tiempo, serán mostradas por pantalla (terminal). Luego en una planilla electrónica usted debe importar sus datos para generar gráficos del movimiento de los objetos como el de la Figura 2.

Figura 1: Una Configuración Posible

Figura 2: Posición bolas en el tiempo para la configuración de Figura 1.

Para llegar al resultado final usted aplicará una metodología "Iterativa e Incremental" para el desarrollo de software. Su grupo irá desarrollando etapas que irán abordando los requerimientos de la tarea de a poco. En cada etapa usted obtendrá una solución que funciona para un subconjunto de lo que se desea al final. Para cada etapa cree un subdirectorio con la solución hasta ese nivel.

Primera Etapa
Como primer paso, su grupo debe completar el código adjunto y cree un PhysicsLab.java para generar la gráfica correspondiente a el choque simple de la Figura A.

Figura A: 2 Bolas de igual masa, una en movimiento no acelerado y otra en reposo. Se muestra estado inicial.

Nota: Si lo desea, resuelva primero una bola moviéndose sin aceleración. Una vez que comprueba que funciona el simulador, la entrada de datos, salida de datos, cómo hacer gráfica, etc.., agrega el choque. Para la entrega de esta etapa se pide la configuración final de la tarea.

Segunda Etapa
Como segundo paso, complete el código agregando la clase resorte (Spring) y cree un PhysicsLab.java que genere los resultados para la configuración de la Figura B.

Figura B: 2 bolas en configuración simétrica. Se muestra estado inicial.

Tercera Etapa
Complete el código agregando la clase resorte (FixedHook) y cree un PhysicsLab.java que genere los resultados para la configuración de la Figura C.

Figura C: un gancho fijo y una bola. Se muestra estado inicial.

Cuarta Etapa
Entregue el código completo para simular la configuración de la Figura 1 y entregue la gráfica similar a la Figura 2. Con su avance hasta etapa 3, esta etapa sólo debería requerir un cambio en el método main.

Resultados Esperados de su Grupo Para cada etapa genere un directorio con la solución hasta esa etapa. 
Cada etapa puede ser ejecutada de dos formas:
Desde consola con: $ java PhysicsLab  <delta tiempo>  <tiempo total a simular> <periodo de muestreo>
o vía su makefile con: $ make run
En este último caso, es decir ejecución sin parámetros, su programa debe pedir los parámetros por terminal usando:
Ingrese delta: <Aquí el usuario ingresa delta tiempo>
Ingrese tiempo a simular: <ingresa tiempo total de simulación>
Ingrese tiempo entre escrituras en la salida del estado del sistema: <tiempo de muestreo>
La salida a pantalla debe tener formato que permita su manejo con una planilla electrónica. Para esto use TABs u otro separador adecuado. Una salida posible es:
Time    FixedHook_0:x    Spring_0:a_end    b_end    Ball_0:x    Ball_1:x   
0.0    0.5    0.5    1.0    1.0    2.56   
0.10000000000000184    0.5    0.5    1.0512090712568887    1.0512090712568887    2.56
/* aquí omito el resto de las líneas */

Para efectos de esta tarea, el estado de salida sólo incluye las posiciones de cada objeto.
Usted deberá entregar los siguientes archivos:
- makefile  (uno por etapa)
- readme  (solo uno por toda la tarea)
- Archivo de Documentación (uno por toda la tarea): En éste incluya la figura de la configuración de cada etapa y el gráfico (X,t) que muestre la posición X de cada bola participando en la configuración en función del tiempo para 0<t<20[s] (o un rango adecuado).
Además su grupo debe inventar una configuración nueva (etapa n+1) y presentar sus resultados.

Obviamente su programa no generará el dibujo ni el gráfico. Puede usar el dibujo aquí incluido y el gráfico lo puede generar con una planilla de cálculo a partir de los datos de salida de su programa.

Extra créditos (+10 puntos): Crear la clase Block (parecido a Balls). Un Block se puede enganchar a resortes e interactúa con otros bloques o bolas vía choques. Hasta aquí sería esencialmente igual a bolas, la diferencia es que los bloques experimentan roce con al superficie. Considere coeficiente de roce cinético igual al estático (como aproximación) y g=9.8 [m/s2]. Defina e implemente la clase Block además de Ball, Spring, FixedHook. Ponga un dibujo de una configuración con bloque(s) y el resultado gráfico de la simulación. Si lo hace bien, ganará 10 puntos extras. La nota de esta tarea se satura igual en 100.

Ayudas
* Para enviar los datos a un archivo de salida, redireccione la salida a pantalla usando:
$ java PhysicsLab 0.1 0.001 5  > miSalida.csv
* Dé una mirada al desarrollo parcial de la este sistema. Si encuentra errores o algo que pueda ser mejorado, avise al profesor.
* Dé una mirada a archivos make files usados en las  mejores soluciones de años previos.
* Algo parecido a lo que usted hará (mejor) está en myphysicslab. La forma de abordar la simulación en esta tarea es distinta y a mi juicio mucho más general.
* No dude en consultar al profesor o ayudante sobre dudas de esta tarea.

Nociones de simulación de fenómenos continuos
La idea básica usada en esta tarea es discretizar el tiempo; para cada instante discreto, congelamos  el tiempo y pedimos a cada objeto del experimento calcular cuál será su estado futuro (delta t más tarde) a partir del estado actual y las condiciones a que está sometido. Es importante imaginar que se congela el tiempo para hacer este cálculo en cada objeto. Luego se pide a todos actualizar su estado según lo calculado para delta_t más tarde y se avanza el tiempo en ese delta.
Esta simple idea trabaja bien aquí y en muchas situaciones, pero no en todas; por ejemplo si deseáramos  permitir que dos resortes estén juntos uno después del otro. En estos casos, como aproximación podemos usar una masa pequeña entre ambos. Si quisiéramos pegar dos bolas juntas, podemos poner un resorte muy pequeño entre ambos con constante elástica "infinita". Lo mismo si deseamos modelar barras rígidas. Para los casos de resortes de constante elástica muy grandes, la calidad de la simulación baja si no usamos un delta_t lo suficientemente pequeño (la simulación tomará tiempo de ejecución).
Una vez hecha la tarea, usted debería notar que es posible incorporar roce o gravedad.  Cuerdas pueden ser modeladas como resortes con constante elástica "infinita" cuando se extiende respecto al reposo y cero cuando se acorta respecto a su largo de reposo.
Se puede jugar bastante, pero en algunos casos es posible encontrar problemas de acondicionamiento numérico; por ejemplo si usa masas cero, aparecerá una división por cero. Por otro lado este ramo no es el único donde debes rendir bien este semestre.
Dejemos esto hasta aquí para que la tarea salga hoy.