Diseño y Programación Orientados a Objetos
1er. Sem 2015
Tarea 1: Bolas, Resortes, Osciladores y Amortiguadores 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, resortes, osciladores, y amortiguadores) 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 puntiales (sin momento angular). Decimos que este es un modelo y no la realidad porque supondremos que no hay roce y por ello las bolas norodarán. 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. Si bien las bolas chocan en la realidad, este modelo simplificado de bolas puntuales no las hará chocar, son transparentes. 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), osciladores (oscillators) y amortiguadores (dashpots). 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. Los osciladores se moveran horizontalmente con amplitud y frecuencia fijas.  Un amortiguador será modelado como una barra que se puede contraer y extender haciendo que en todo momento la fuerza ejercida en sus extremos es proporcional a la velocidad con que la barra se contrae o extiende. En todos los casos la dirección de la fuerza se opone a la deformación de la barra.
  En esta tarea se pide construir configuraciones de bolas, resortes, osciladores y amortiguadores (nunca dos resortes o amortiguadores unidos) en R (una dimensión). Un ejemplo de tales configuraciones se muestra en la Figura A.   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 B.

Figura A: Una Configuración Posible


Figura B: Posición bolas en el tiempo para la configuración de Figura A: La figura
superior no corresponde exactamente al escenario de la izquierda, la de abajo sí.

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. Usted deberá entregar soluciones para da una de las etapas aún cuando  la última integre las primeras.

Primera Etapa
Como primer paso, su grupo debe completar el código adjunto y completar lo que sea necesario para correr PhysicsLab.java proporcioando para esta etapa.
Estudie con detención la clase MyWorld, en particular el método simulate.

Figura 2:  Bola con movimiento rectilineo uniforme.
Para evidenciar que su programa funciona bien, en la documentación su grupo debe presentar una gráfica x v/s t para la posición de la bola en el tiempo para los primeros 5 segundo.
Segunda Etapa
Como segundo paso, complete el código completando la clase resorte (Spring) de manera que PhysicsLab.java proporcionado corra adecuadamente.

Figura 3: Dos bolas acopladas por un resorte. Se muestra estado inicial.

Tercera Etapa
Complete el código agregando la clase oscilador y prepare los archivos para que PhysicsLab.java compile.

Figura 4: Un oscilador y una bola unidos por un resorte. Se muestra estado inicial.

Cuarta Etapa
Complete el código dado para incluir amortiguadores (Dashpot) y haga los cambios para correr el archivo PhysicsLab.java.

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:

agustin@agustin:~/teaching/elo329/1s15/Assignments/Etapa4$ java PhysicsLab 0.001 5 0.2
Time      Oscillator_0:x     Spring_0:a_end    b_end     Ball_0:x     Dashpot_0:a_end    b_end     Ball_1:x
 0.0     0.0           0.0    2.0         0.5           0.5    2.0         2.0
 0.20000000000000015     0.06217247179121374           0.06217247179121374    1.980706406571544         0.49948531275229174           0.49948531275229174    1.980706406571544         1.980706406571544
 0.4000000000000003     0.1204384185254289           0.1204384185254289    1.9275927865688691         0.4961684832710317           0.4961684832710317    1.9275927865688691         1.9275927865688691
/* 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<15[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): Modifique la clase Ball para modelar choques elásticos entre bolas. Ponga un dibujo de una configuración con bola(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.