Envolturas BF

Cada modelo BF requiere la presencia de una envoltura especial que maneja su interacción (simulación, intercambio de variables) con Tinamït.

Note

Todas las envolturas son subclases de ModeloBF. No obstante, Tinamït viene con clases especiales para simplificar tu vida con casos de modelos más compicados.

¿Cómo escoger la clase pariente? Si tu modelo da resultados con el mismo paso de tiempo con el cual puede avanzar (por ejemplo, da resultados mensuales y avanza con paso mensual), entonces es un modelo sencillo. Si da resultados con paso más pequeño que el paso con el cual puede avanzar (por ejemplo, un modelo hidrológico que simula 1 año a la vez pero después devuelve resultados diarios), entonces es un modelo determinado.

Si tu modelo tiene subdivisiones temporales adicionales (p. ej., SAHYSMOD simula por un año, pero después devuelve datos por estaciones de duración de entre 1 a 12 meses), entonces es un modelo bloques.

Y, por fin, si no sabes antes de simular cuánto tiempo va a simular (p. ej., modelos de cultivos que corren hacia la cosecha), entonces tienes un modelo indeterminado.

Modelos Sencillos

Siendo modelos sencillos, las envolturas basadas directamente en ModeloBF solamente deben implementar las funciones siguientes:

  1. unidad_tiempo(): Devuelve la unidad de tiempo del modelo.
  2. incrementar(): Avanza el modelo.
  3. __init__(): Inicializa el modelo. En la llamada a super().__init__ debes incluir un objeto VariablesMod con los variables del modelo.

Funciones y atributos opcionales:

  1. paralelizable(): Indica si el modelo se puede paralelizar para ahorar tiempo.
  2. iniciar_modelo(): Acciones llamadas justo antes de la simulación.
  3. cerrar(): Efectua acciones de limpieza al final de una simulación.
  4. _correr_hasta_final(): Permite el modelo de combinar pasos de simulación cuando posible para ser más rápido.
  5. instalado(): Verifica si el modelo correspondiendo a la envoltura está instalado en la computadora o no.
  6. Modelo.idioma_orig: Indica el idioma de los nombres de variables del modelo.

Avertissement

Tu implementación de incrementar() debe incluir una llamada a super().incrementar(rebanada) al final para que valores de parámetros externos y de clima se actualicen correctamente. Igualmente, cualquier reimplementación de iniciar_modelo() debe incluir una llamada a super().iniciar_modelo(corrida) al final.

En la función incrementar(), se puede acceder los variables del modelo con símismo.variables[« nombre del variable »], obtener su valor con obt_val(), y cambiar su valor con poner_val():

lago = símismo.variables['Lago']
val_lago = lago.obt_val()

nuevo_valor = 100
lago.poner_val(nuevo_valor)

Modelos Determinados

Modelos determinados (ModeloDeterminado) simulan por un periodo fijo, y después devuelven egresos de manera retroactiva. Muchos modelos biofísicos (SWAT, DSSAT, STICS) funcionan (o pueden funcionar) así.

El paso del modelo sigue siendo la unidad de tiempo de los egresos (p. ej., días), y se agrega el concepto de un ciclo, o el tiempo mínimo que se puede efectuar una simulación (p. ej., 1 año).

Funciones obligatorias:

  1. unidad_tiempo(): Devuelve la unidad de tiempo de los egresos del modelo.
  2. avanzar_modelo(): Avanza el modelo de un cierto número de ciclos.
  3. __init__(): Inicializa el modelo. En la llamada a super().__init__ debes incluir un objeto VariablesModDeter con los variables del modelo.

Note

No se implementa incrementar() en modelos determinados. Tinamït lo implementa automáticamente y llama avanzar_modelo() en los momentos oportunos de la simulación.

Modelos determinados pueden tener variables que cambian con el paso (VarPasoDeter) y otros que cambian con el ciclo (Variable). Ambos se pueden pasar al VariablesModDeter de la inicialización.

Para cambiar los valores de VarPasoDeter en la función avanzar_modelo(), se llama poner_vals_paso con una matriz de valores para todos los pasos en el ciclo presente. Para obtener su valor en el paso actual, se llama obt_val, o sino obt_vals_paso para obtener la matriz de sus valores para todos los pasos en el ciclo actual.

Note

Tinamït se encarga de actualizar los valores de los variables por paso según el paso actual del modelo.

Igualmente pueden implementar todas las funciones opcionales de ModeloBF.

Modelos Bloques

Modelos bloques (ModeloBloques) son una subclase de (ModeloDeterminado). Además de pasos y ciclos, tienen el concepto de bloques. En su simulación, un ciclo contiene varios bloques hechos de cantidades variables de pasos.

Funciones obligatorias:

  1. unidad_tiempo(): Devuelve la unidad de tiempo de base de los egresos del modelo. Por ejemplo, si el modelo simula por año y devuelve datos por tres estaciones de 4, 5 y 3 meses, entonces la unidad de tiempo sería mes.
  2. avanzar_modelo(): Avanza el modelo de un cierto número de ciclos.
  3. __init__(): Inicializa el modelo. En la llamada a super().__init__ debes incluir un objeto VariablesModBloques con los variables del modelo.

Modelos bloques pueden tener variables bloques (VariablesModBloques), igual que variables que cambian con el paso (VarPasoDeter) y otros que cambian con el ciclo (Variable).

Note

Tinamït actualiza automáticamente el paso, el bloque y el ciclo de sus variables (con los valores, por supuesto).

Igualmente pueden implementar todas las funciones opcionales de ModeloBF.

Modelos Indeterminados

Modelos indeterminados (ModeloIndeterminado) avanzan por periodos de tiempo indeterminados cada vez que se simulan. Tienen el concepto de ciclos, pero el tamaño del ciclo varia entre simulaciones.

Funciones obligatorias:

  1. unidad_tiempo(): Devuelve la unidad de tiempo de los egresos del modelo.
  2. mandar_modelo(): Avanza el modelo.
  3. __init__(): Inicializa el modelo. En la llamada a super().__init__ debes incluir un objeto VariablesModIndeterminado con los variables del modelo.

En VariablesModIndeterminado, se pueden incluir variables cuyos valores cambian con el paso (VarPasoIndeter), tanto como variables cuyos valores quedan constantes adentro del mismo ciclo (Variable).

En mandar_modelo(), se puede utilizar las mismas funciones que con modelos determinados para establecer y acceder los valores de los variables.

Igualmente pueden implementar todas las funciones opcionales de ModeloBF.

Variables clima

Si tu modelo incluye variables climáticos, puedes especificarlos con la función conectar_var_clima() en el __init__() de la clase. Tinamït se encargará de la actualización del valor del variables cuando se efectua una simulación con clima activado.

Note

Si tu modelo requiere datos de manera más sofisticada (por ejemplo, DSSAT debe guardar en un archivo externo todos los datos climáticos antes de empezar la simulación), puedes acceder el objeto de Clima de la corrida actual (si hay) con símismo.corrida.clima y llamar sus funciones obt_datos() o obt_todos_vals().

Configuración

Puedes incluir variables de configuración en tu envoltura (p. ej., la ubicación de un archivo ejecutable). Se obtiene el valor con obt_conf(), y usuarias pueden establecer su valor con MiEnvoltura.estab_conf(« llave », « valor »). Por ejemplo:

from tinamit.envolt.sahysmod.bf import ModeloSAHYSMOD
ModeloSAHYSMOD.estab_conf("exe", "C:\\Camino\\hacia\\mi\\SAHYSMODConsole.exe")

Pruebas

Siempre es buena idea tener pruebas para saber si tu envoltura funciona bien o no. Tinamït te permite integrar pruebas de lectura de datos, de lectura de egresos y de simulación con tus envolturas.

Puedes implementar las funciones prb_ingreso(), prb_egreso(), o prb_simul() para tu modelo.

Después, puedes integrar las funciones verificar_leer_ingr(), verificar_leer_egr(), y verificar_simul() con tus pruebas automáticas para comprobar que todo están bien con tu envoltura. La primera vez que corren las pruebas, Tinamït guardará en el disco los resultados de la lectura de datos y de la simulación. Asegúrate que estén correctos los variables. Si, en el futuro, tu envoltura ya no da los mismos resultados, Tinamït te avisará de un error.

Note

Estas funciones se aplican automáticamente a todas las envolturas incluidas con la distribución de Tinamït.

Distribución

Puedes compartir tu nueva envoltura como paquete Python independiente. Igualmente puedes contribuirlo al código fuente de Tinamït, después de cual todas las usuarias de Tinamït podrán acceder tu envoltura.