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.
Nota
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:
unidad_tiempo()
: Devuelve la unidad de tiempo del modelo.incrementar()
: Avanza el modelo.__init__()
: Inicializa el modelo. En la llamada asuper().__init__
debes incluir un objetoVariablesMod
con los variables del modelo.
Funciones y atributos opcionales:
paralelizable()
: Indica si el modelo se puede paralelizar para ahorar tiempo.iniciar_modelo()
: Acciones llamadas justo antes de la simulación.cerrar()
: Efectua acciones de limpieza al final de una simulación._correr_hasta_final()
: Permite el modelo de combinar pasos de simulación cuando posible para ser más rápido.instalado()
: Verifica si el modelo correspondiendo a la envoltura está instalado en la computadora o no.Modelo.idioma_orig
: Indica el idioma de los nombres de variables del modelo.
Advertencia
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:
unidad_tiempo()
: Devuelve la unidad de tiempo de los egresos del modelo.avanzar_modelo()
: Avanza el modelo de un cierto número de ciclos.__init__()
: Inicializa el modelo. En la llamada a super().__init__ debes incluir un objetoVariablesModDeter
con los variables del modelo.
Nota
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.
Nota
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:
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.avanzar_modelo()
: Avanza el modelo de un cierto número de ciclos.__init__()
: Inicializa el modelo. En la llamada a super().__init__ debes incluir un objetoVariablesModBloques
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
).
Nota
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:
unidad_tiempo()
: Devuelve la unidad de tiempo de los egresos del modelo.mandar_modelo()
: Avanza el modelo.__init__()
: Inicializa el modelo. En la llamada a super().__init__ debes incluir un objetoVariablesModIndeterminado
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.
Nota
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.
Nota
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.