Refugios artificiales y barreras para la supervivencia de serpientes en un parque urbano

Refugios artificiales y barreras para la supervivencia de serpientes en un parque urbano preview image

1 collaborator

Tags

urban ecology 

Tagged by Julián Felipe Rengifo Martínez about 8 hours ago

Visible to everyone | Changeable by everyone
Model was written in NetLogo 6.4.0 • Viewed 22 times • Downloaded 0 times • Run 0 times
Download the 'Refugios artificiales y barreras para la supervivencia de serpientes en un parque urbano' modelDownload this modelEmbed this model

Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)


Descripción del modelo

Este modelo simula cómo una población de serpiente sabanera (Atractus crassicaudatus) se mueve, sobrevive y muere en un parque urbano bogotano, cuando:

  1. El pasto kikuyo (Cenchrus clandestinus) pierde la capacidad de funcionar como refugio para la especie debido a eventos de lluvia intensa o sequía.

  2. Se incorporan refugios artificiales mediante elementos estructurales no vivos (coberturas rocosas y restos leñosos) como estrategia para la protección de la especie

  3. Se incorporan barreras de exclusión alrededor de parches de pasto kikuyo acolchonado como otra estrategia para la protección de la especie.

Nota: El mundo representa un parque que posee un área de 3.150 m² (0,315 ha), equivalente a un parque urbano de tipo vecinal o de barrio según el Plan de Ordenamiento Territorial de Bogotá (Alcaldía Mayor de Bogotá, 2021):

¿Cómo funciona?

El modelo integra:

  1. Heterogeneidad del paisaje a pequeña escala
  2. Variación microclimática (temperatura horaria por cobertura)
  3. Calidad de habitat en terminos de la calidad de refugio (IR)
  4. Respuestas comportamentales de la espcie
  5. Riesgos fisiológicas (deshidratación, sobrecalentamiento, ahogamiento)
  6. Riesgos ambientales (exposición)

¿Cómo usarlo?

En la parte izquierda de la interfaz y de arriba abajo el usuario podra encontrar las instrucciones de uso de los controles deslizante y menus desplegables para configurar los parámetros del modelo, haciendolo en el siguiente orden:

  1. Primero, el usuario ajustará la población de serpientes con la que desee hacer la simulación mediante el numero de serpientes, luego ajustará el escenario estocástico (lluvia intensa o sequía) y las condiciones ambientales (soleado, seminublado y nublado).

  2. Segundo, si el usuario desea simular el escenario estocastico "lluvia intensa", con el control deslizantes "porcentaje de inundación" podra ajustar ese parametro

  3. Tercero, el usuario ajustará si desea incorporar refugios artificiales en la simulación y de hacerlo podra seleccionar el tamaño y la distancia entre ellos

  4. Cuarto, el usuario ajustará si desea incorporar barreras de exclusión alrededor de las coberturas de pasto acolchonado

Una vez definidos estos parámetros, se debe presionar el botón “setup” para inicializar la simulación y posteriormente “go” para ejecutarla y en el mundo podra visualizar la dinamica. Las convenciones ubicadas en la parte inferior explica el significado de los colores y elementos representados en el mundo.

Por ultimo, a la derecha, las gráficas e indicadores, presentaran los resultados de la simulación en tiempo real, incluyendo métricas como tasa de supervivencia, tasa de mortalidad y eventos de riesgo acumulado con su evolución en el tiempo.

Aspectos a tener el cuenta

El usuario notará el cambio de las coberturas de pasto (Acolchonado o Compacto) en respuesta a los eventos climáticos extremos simulados.

El usuario podrá ver como la configuración espacial de los refugios junto a la presencia de barreras influye en la supervivencia de las serpientes del parque.

Cosas para probar

El usuario podrá experimentar con diferentes configuraciones, observar el comportamiento del sistema y analizar los resultados generados por el modelo.

Extenciones del modelo

1.) Por el momento, este modelo debe considerarse una herramienta exploratoria. Los parámetros implementados se basan en el conocimiento disponible sobre Atractus crassicaudatus, incluyendo aspectos de su ecología, comportamiento y fisiología. Sin embargo, debido a vacíos de información sobre ciertas respuestas de la especie, algunos parámetros (ej, la respuesta a la deshidratción, etc.) fueron establecidas a partir de información disponible para especies con características ecológicas similares. Por esta razón, varios de los procesos representados en el modelo operan actualmente bajo supuestos y simplificaciones que deberán ser refinadas a medida que se disponga de nueva información empírica fisiológica de la especie.

2.) Esta primera versión fue diseñada como un sistema idealizado que busca evaluar la respuesta de la especie frente a configuraciones regulares de refugios artificiales y barreras de exclusión en un pastizal urbano hipotético, en el que se asume que las condiciones pueden ser controladas y se puede hacer uso de todo el espacio. Aunque este enfoque facilita la exploración de patrones generales, los paisajes urbanos reales presentan limitaciones socioambientales que podrian dificultar el uso regular del espacio para la creación de refugios. Por ello, el modelo podría evolucionar hacia una herramienta de apoyo para la toma de decisiones que permita evaluar la implementación de refugios y barreras en escenarios reales y bajo configuraciones que sean espacial y socialmente viables.

2.1.) Para lograrlo, futuras versiones podrían permitir la incorporación de rasters georeferenciados de parques y otras áreas verdes urbanas de la ciudad que integre la creación de arreglos irregulares de refugios, lo que permitiria experimentar como diferentes arreglos pueden beneficiar la supervivencia de una poblacion para un determinado caso

2.2.) Ademas dichos rasters podrian incluir mapeos topográficos, de tipo de suelo, u otros datos considerados relevantes, para permitir, por ejemplo simulaciones de inundación sobre zonas que en la realidad son potencialmente susceptibles a inundarse.

3.) En la presente versión, el sistema se encuentra simplificado a dos variables principales del ambiente: el Índice de Refugio (IR) (variable compuesta) y la variacion circadiana de la temperatura operativa de cada cobertura. En consecuencia, la supervivencia de los individuos está determinada principalmente por la interacción entre estas variables, que condicionan la capacidad de las serpientes para encontrar refugios adecuados y mantener condiciones fisiológicas favorables. Los eventos de mortalidad modelados corresponden principalmente a respuestas fisiológicas derivadas de condiciones ambientales adversas, tales como el sobrecalentamiento, la deshidratación o el ahogamiento durante eventos de inundación.

3.1.) No obstante, el modelo simplifica la mortalidad por causas bioticas al incorporar una probabilidad de mortalidad asociada a la exposición dentro de coberturas que no favorcen ocultamiento. Una probabilidad de mortalidad que aumenta con el tiempo de exposición, que a su vez es una probabilidad de que la serpiente muera por cuaquier causa ecológica biotica, sea natural como depredación por fauna nativa o antropica como la depredación por fauna feral, atropellamiento vehicular, pisoteo accidental o matanza indiscriminada.

3.1.1.) Una extensión relevante del modelo consistiría en incorporar las amenazas bioticas de manera explícita en el modelo, permitiendo que los riesgos asociados a la exposición emerjan de la interacción entre las serpientes y otros agentes del sistema (fauna feral, depredadores naturales, humanos transeuntes, humanos que realizan actividades de mantenimiento del cesped, vehiculos, etc.). Esto haría posible evaluar cómo la presencia de otras entidades explicitas con reglas de desicion propias modifican la efectividad de los refugios artificiales y las barreras de exclusión. Asimismo, permitiría diferenciar con mayor claridad las causas de mortalidad asociadas a limitaciones fisiológicas de aquellas derivadas de interacciones ecológicas bioticas, sean naturales o antropicas.

3.1.2:) La incorporación de estos procesos también facilitaría la comparación entre escenarios simplificados (como el actual del modelo) con escenarios más complejos donde múltiples factores influyen simultáneamente sobre la supervivencia. Este tipo de comparaciones permitiría evaluar en qué medida las conclusiones del modelo son robustas frente a la incorporación de nuevos procesos ecológicos y contribuiría a una comprensión más integral de la dinámica de la especie en paisajes urbanos sometidos a eventos climáticos extremos.

4.) Futuras versiones del modelo podrian implementar extenciones de amenazas ambientales abioticas, como lluvia acida etc, modelando tanto la respuesta del pasto a estos fenomenos y de los agentes (serpientes y otros que se agreguen a futuro).

5.) Futuras versiones del modelo deberían incorporar datos de ecología del movimiento y ecología sensorial para definir mecanismos de orientación y navegación mas realistas. Esto solo posible a medida que se realicen investigaciones dentro de este campo (por el momento inexistentes). Pero resultaria interesante involucrar cuestiones de percepción, ejempo hacia estimulos vibracionales del entorno.

6.) Las temperaturas operativas utilizadas para algunas coberturas fueron obtenidas a partir de la literatura disponible, mientras que otras debieron ser estimadas mediante supuestos fundamentados en información ecológica. Por tanto, se recomienda obtener mediciones empíricas de temperatura operativa para cada uno de los entornos que puede experimentar la especie dentro del parque. La incorporación de estos datos permitirá reducir la incertidumbre asociada a las simulaciones y mejorar progresivamente la capacidad del modelo para representar de manera realista la supervivencia de poblaciones urbanas de Atractus crassicaudatus frente a eventos climáticos extremos.

7.) La humedad ambiental fue representada de manera simplificada como una subvariable binaria dentro del indice de refugio debido a la limitada disponibilidad de información sobre su variación temporal para cada uno de los entornos que puede experimentar la especie dentro del parque. En particular, no se dispone actualmente de datos detallados sobre los cambios circadianos de humedad. Por esta razón, una línea de mejora importante consiste en incorporar la humedad como una variable dinámica que fluctúe temporal y espacialmente dentro del paisaje, una vez se disponga de esta información.

8.) Otra posible extensión del modelo consiste en ampliar el conjunto de estrategias de manejo evaluadas. La presente versión se centra exclusivamente en la implementación de refugios artificiales y barreras de exclusión; sin embargo, futuras versiones podrían incorporar otras medidas de conservación diseñadas para mejorar la conectividad y reducir la mortalidad de la especie en paisajes urbanos. Entre estas estrategias se encuentran los pasos de fauna subterráneos, estructuras de conectividad adaptadas a especies fosoriales y combinaciones de múltiples intervenciones aplicadas simultáneamente. Esto permitiría evaluar posibles efectos sinérgicos entre diferentes herramientas de manejo y determinar cuáles configuraciones ofrecen los mayores beneficios para la supervivencia y el movimiento de los individuos.

9.) Asimismo, debido a que el modelo fue diseñado para explorar la respuesta de la especie frente a eventos climáticos extremos en escalas temporales relativamente cortas, una línea de desarrollo futura consiste en extender las simulaciones hacia horizontes temporales más amplios. Esto permitiría incorporar procesos poblacionales y evolutivos que operan a largo plazo, tales como la conectividad funcional entre áreas verdes urbanas, el aislamiento de subpoblaciones y las posibles consecuencias sobre el flujo génico y la variabilidad genética. De esta manera, el modelo podría convertirse en una herramienta útil para evaluar no solo la supervivencia inmediata de los individuos, sino también la viabilidad de las poblaciones urbanas a través del tiempo.

10.) Futuras versiones podrían explorar escenarios ambientales estables que no estén necesariamente asociados a eventos climáticos extremos. Esto permitiría analizar cómo los individuos seleccionan refugios y utilizan el paisaje bajo condiciones ordinarias. Estos escenarios complementarían los análisis actuales al permitir estudiar procesos relacionados con la selección de hábitat, el movimiento cotidiano y la funcionalidad de las estrategias de conservación bajo condiciones ambientales más representativas de la dinámica normal de los ecosistemas urbanos.

11.) Finalmente, una extensión interesante del modelo consistiría en incorporar una representación tridimensional del paisaje. En su versión actual, el modelo opera en dos dimensiones. Si bien parte de la complejidad vertical del hábitat se encuentra representada de manera implícita mediante el Índice de Refugio (IR), el cual integra atributos estructurales relacionados con la capacidad de ocultamiento subterraneo y superficial que definen respuestas para el movimiento del agente en la presente versión. Incorporar la tridimencionalidad resultaría particularmente relevante debido a que la especie modelada es de naturaleza semifosorial (alterna entre ambientes subterráneos y superficiales según las condiciones ambientales y la disponibilidad de refugios). Por ello, futuras versiones podrían incorporar una dimensión vertical que permita representar de manera explícita el uso de diferentes profundidades del suelo, los movimientos entre estratos y las variaciones microclimáticas asociadas a estos. Esto permitiría evaluar con mayor realismo procesos relacionados con la termorregulación, la selección de refugios, la exposición a eventos climáticos extremos y la utilización del espacio. No obstante, el desarrollo de esta aproximación requerirá información empírica adicional sobre la ecología del movimiento, de la cual no se dispone hasta el momento.

Funcionalidades de Netlogo

El modelo hace uso de las funcionalidades estándar de NetLogo para la simulación basada en agentes. Se emplean turtles para representar a los individuos y patches para modelar el entorno, permitiendo la interacción entre agentes y su espacio.

Creditos y referencias

Trabajo de grado de Ecología del estudiante Julián Felipe Rengifo Martínez de la Pontificia Univesidad Javeriana, Bogotá, bajo la dirección de Liliana Patricia Saboya y coodirección de Mauricio Alexander Gonzales Mendez

Datos relevantes extraidos de:

Paternina, R. F. (2016). Estrategia de termorregulación y riesgo de extinción de Atractus crassicaudatus (Squamata: Dipsadidae) asociado al calentamiento global. Recuperado de: https://repositorio.unal.edu.co/handle/unal/58313

Paternina-Cruz, Ricardo y Capera, Victor. (2017). Atractus crassicaudatus (Duméril, Bibron y Duméril, 1854). Catálogo de Anfibios y Reptiles de Colombia, 3, 7–13.

Paternina-Cruz, R. F., y Calderón-Espinosa, M. L. (2022). Withstanding cold nights at high elevation: Thermal strategy of Atractus crassicaudatus, a nocturnal tropical snake endemic to the eastern Andes of Colombia. Revista Mexicana de Biodiversidad, 93, e933705. https://doi.org/10.22201/ib.20078706e.2022.93.3705

Comments and Questions

Please start the discussion about this model! (You'll first need to log in.)

Click to Run Model

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 1) EXTENSIONES Y VARIABLES
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

extensions [csv table]

patches-own [
  tipo
  temperatura
  IR
  pasto-acolchonado-vecino?
  ID-refugio
  expuesto-lluvia?
]

turtles-own [
  temp-anterior
  IR-anterior

  estrategia_termica

  peso-serpiente
  tasa-perdida-agua
  perdida-acumulada

  desplazamiento
  velocidad
  hazard-ambiental

  tiempo-en-inundacion
  tiempo-en-exposicion

  causa-muerte

  vivo?
]

globals [
  temp-temseca-soleado
  temp-temseca-seminublado
  temp-temseca-nublado
  temp-temhumeda-soleado
  temp-temhumeda-seminublado
  temp-temhumeda-nublado
  temp-por-cobertura
  IR-por-cobertura
  ticks-por-hora
  duracion
  delta-tiempo

  total_original_pa
  total_original_pc
  total_original_td

  num_refugios_rocoso
  num_refugios_leñoso
  num_refugios_totales

  to-ev-riesgo-choquetermico-ac
  to-ev-riesgo-deshidratacion-ac
  to-ev-riesgo-ahogamiento-ac

  to-ev-riesgo-fisiologico-ac

  to-ev-riesgo-ambiental-ac

  to-eventos-riesgo-ac

  muertes-choquetermico
  muertes-deshidratacion
  muertes-ahogamiento

  muertes-causas-fisiologicas

  muertes-causas-ambientales

  total_muertes
  total_vivos
  tasa_mortalidad
  tasa_supervivencia
]

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 2) SETUP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to setup
  clear-all

  ;; (2.1) TAMAÑO DEL MUNDO
  resize-world -250 250 -140 140

  ;; (2.2) IMPORTAR PNG CON COBERTURAS BASE
  import-pcolors "C:/Users/julia/Downloads/NetLogo_Trabajo de grado/Mundo view.png"

ask patches [
    if pcolor = 0  [ set tipo "limite_urbano" ]
    if pcolor = 63 [ set tipo "pasto_acolchonado" ]
    if pcolor = 65 [ set tipo "pasto_compacto" ]
    if pcolor = 9  [ set tipo "suelo_duro" ]
    if pcolor = 32 [ set tipo "tierra_desnuda" ]
  ]

  ;; GUARDAR ESTADO ORIGINAL (ANTES DE QUE SE PONGAN LOS REFUGIOS)
set total_original_pa count patches with [tipo = "pasto_acolchonado"]
set total_original_pc count patches with [tipo = "pasto_compacto"]
set total_original_td count patches with [tipo = "tierra_desnuda"]

  ;; (2.3) CREAR TABLAS DE TEMPERATURA POR COBERTURA SEGÚN TEMPORADA + CONDICICIÓN CLIMÁTICA (ESCENARIO ESTOCASTICO LIGADO A TEMPORADA)

  ;; --------- Tablas de temperatura por temporada + condición climática ------------------

  ;; --------- El ESCENARIO ESTOCASTICO= LLUVIA INTENSA está ligado a temporada húmeda entonces usará los valores de estas tablas más adelante ------------
  set temp-temhumeda-soleado table:make   ;;;;;;;;;; ver 2.3.1
  set temp-temhumeda-seminublado table:make ;;;;;;;; ver 2.3.2
  set temp-temhumeda-nublado table:make ;;;;;;;;;;;; ver 2.3.3

  ;; --------- El ESCENARIO ESTOCASTICO= SEQUIA está ligado a temporada seca entonces usará los valores de estas tablas más adelante, VER 2.5 ----------------------
  set temp-temseca-soleado table:make ;;;;;;;;;;;;;; ver 2.3.4
  set temp-temseca-seminublado table:make ;;;;;;;;;; ver 2.3.5
  set temp-temseca-nublado table:make ;;;;;;;;;;;;;; ver 2.3.6

    ;; ---------- (2.3.1) Temperaturas por hora de coberturas en Temporada humeda - Condición climática= soleado,  VER 2.5  ----------------------------------------

 table:put temp-temhumeda-soleado "pasto_acolchonado"
    [13.4	13.2	13.0	12.8	12.6	12.4	12.6	13.2	14.2	15.4	16.4	18.2	20.6	20.2	19.8	20.0	18.8	17.0	15.8	15.2	14.8	14.0	13.4	13.2]

  table:put temp-temhumeda-soleado "pasto_compacto"
    [12.0	10.5	9.0	7.5	5.5	3.1	4.5	7.5	12.5	17.5	23.0	30.0	38.4	36.5	34.0	32.0	29.0	25.5	22.0	19.0	16.5	14.5	13.0	12.0]

  table:put temp-temhumeda-soleado "suelo_duro"
    [12.0	10.5	9.0	7.5	5.5	3.1	4.5	7.5	12.5	17.5	23.0	30.0	38.4	36.5	34.0	32.0	29.0	25.5	22.0	19.0	16.5	14.5	13.0	12.0]

  table:put temp-temhumeda-soleado "tierra_desnuda"
    [12.0	10.5	9.0	7.5	5.5	3.1	4.5	7.5	12.5	17.5	23.0	30.0	38.4	36.5	34.0	32.0	29.0	25.5	22.0	19.0	16.5	14.5	13.0	12.0]

  table:put temp-temhumeda-soleado "limite_urbano_pastovecino"
    [14.4	14.2	14.0	13.8	13.6	13.4	13.6	14.2	15.2	16.4	17.4	19.2	21.6	21.2	20.8	21.0	19.8	18.0	16.8	16.2	15.8	15.0	14.4	14.2]

  table:put temp-temhumeda-soleado "limite_urbano_sinpastovecino"
    [12.0	10.5	9.0	7.5	5.5	3.1	4.5	7.5	12.5	17.5	23.0	30.0	38.4	36.5	34.0	32.0	29.0	25.5	22.0	19.0	16.5	14.5	13.0	12.0]

   table:put temp-temhumeda-soleado "roca_a_ras_suelo_pastovecino"
    [14.4	14.2	14.0	13.8	13.6	13.4	13.6	14.2	15.2	16.4	17.4	19.2	21.6	21.2	20.8	21.0	19.8	18.0	16.8	16.2	15.8	15.0	14.4	14.2]

  table:put temp-temhumeda-soleado "roca_a_ras_suelo_sinpastovecino"
    [12.0	10.5	9.0	7.5	5.5	3.1	4.5	7.5	12.5	17.5	23.0	30.0	38.4	36.5	34.0	32.0	29.0	25.5	22.0	19.0	16.5	14.5	13.0	12.0]

  table:put temp-temhumeda-soleado "leñoso_a_ras_suelo_pastovecino"
    [13.9	13.7	13.5	13.3	13.1	12.9	13.1	13.7	14.7	15.9	16.9	18.7	21.1	20.7	20.3	20.5	19.3	17.5	16.3	15.7	15.3	14.5	13.9	13.7]

  table:put temp-temhumeda-soleado "leñoso_a_ras_suelo_sinpastovecino"
    [12.0	10.5	9.0	7.5	5.5	3.1	4.5	7.5	12.5	17.5	23.0	30.0	38.4	36.5	34.0	32.0	29.0	25.5	22.0	19.0	16.5	14.5	13.0	12.0]

  table:put temp-temhumeda-soleado "cobertura_rocosa"
    [14.4	14.2	14.0	13.8	13.6	13.4	13.6	14.2	15.2	16.4	17.4	19.2	21.6	21.2	20.8	21.0	19.8	18.0	16.8	16.2	15.8	15.0	14.4	14.2]

  table:put temp-temhumeda-soleado "restos_leñosos_gruesos"
    [13.9	13.7	13.5	13.3	13.1	12.9	13.1	13.7	14.7	15.9	16.9	18.7	21.1	20.7	20.3	20.5	19.3	17.5	16.3	15.7	15.3	14.5	13.9	13.7]


  ;; ---------- Temperaturas por hora de coberturas que solo existen en escenario estocástico= LLUVIA_INTENSA (Temporada= humeda - Condición climática= soleado) ----------

  table:put temp-temhumeda-soleado "pasto_acolchonado_inundado"
    [13.4	13.2	13.0	12.8	12.6	12.4	12.6	13.2	14.2	15.4	16.4	18.2	20.6	20.2	19.8	20.0	18.8	17.0	15.8	15.2	14.8	14.0	13.4	13.2]

  table:put temp-temhumeda-soleado "pasto_compacto_inundado"
    [12.0	10.5	9.0	7.5	5.5	3.1	4.5	7.5	12.5	17.5	23.0	30.0	38.4	36.5	34.0	32.0	29.0	25.5	22.0	19.0	16.5	14.5	13.0	12.0]

  table:put temp-temhumeda-soleado "tierra_desnuda_inundada"
    [12.0	10.5	9.0	7.5	5.5	3.1	4.5	7.5	12.5	17.5	23.0	30.0	38.4	36.5	34.0	32.0	29.0	25.5	22.0	19.0	16.5	14.5	13.0	12.0]




    ;; ---------- (2.3.2) Temperaturas por hora de coberturas en Temporada humeda - Condición climática= seminublado --------------------------------------

  table:put temp-temhumeda-seminublado "pasto_acolchonado"
    [13.6	13.4	13.2	13.0	12.8	12.8	12.8	13.0	13.6	13.8	17.0	16.4	16.6	17.0	17.2	17.6	17.0	16.0	15.4	15.2	15.0	14.8	14.2	13.8]

  table:put temp-temhumeda-seminublado "pasto_compacto"
    [15.2	14.8	14.4	14.0	13.6	13.4	13.2	13.5	14.5	16.5	19.8	19.0	19.2	19.8	20.0	20.5	19.8	18.8	17.8	17.0	16.5	16.2	15.8	15.5]

  table:put temp-temhumeda-seminublado "suelo_duro"
    [15.2	14.8	14.4	14.0	13.6	13.4	13.2	13.5	14.5	16.5	19.8	19.0	19.2	19.8	20.0	20.5	19.8	18.8	17.8	17.0	16.5	16.2	15.8	15.5]

  table:put temp-temhumeda-seminublado "tierra_desnuda"
    [15.2	14.8	14.4	14.0	13.6	13.4	13.2	13.5	14.5	16.5	19.8	19.0	19.2	19.8	20.0	20.5	19.8	18.8	17.8	17.0	16.5	16.2	15.8	15.5]

  table:put temp-temhumeda-seminublado "limite_urbano_pastovecino"
    [14.6	14.4	14.2	14.0	13.8	13.8	13.8	14.0	14.6	14.8	18.0	17.4	17.6	18.0	18.2	18.6	18.0	17.0	16.4	16.2	16.0	15.8	15.2	14.8]

  table:put temp-temhumeda-seminublado "limite_urbano_sinpastovecino"
    [15.2	14.8	14.4	14.0	13.6	13.4	13.2	13.5	14.5	16.5	19.8	19.0	19.2	19.8	20.0	20.5	19.8	18.8	17.8	17.0	16.5	16.2	15.8	15.5]

   table:put temp-temhumeda-seminublado "roca_a_ras_suelo_pastovecino"
    [14.6	14.4	14.2	14.0	13.8	13.8	13.8	14.0	14.6	14.8	18.0	17.4	17.6	18.0	18.2	18.6	18.0	17.0	16.4	16.2	16.0	15.8	15.2	14.8]

  table:put temp-temhumeda-seminublado "roca_a_ras_suelo_sinpastovecino"
    [15.2	14.8	14.4	14.0	13.6	13.4	13.2	13.5	14.5	16.5	19.8	19.0	19.2	19.8	20.0	20.5	19.8	18.8	17.8	17.0	16.5	16.2	15.8	15.5]

  table:put temp-temhumeda-seminublado "leñoso_a_ras_suelo_pastovecino"
    [14.1	13.9	13.7	13.5	13.3	13.3	13.3	13.5	14.1	14.3	17.5	16.9	17.1	17.5	17.7	18.1	17.5	16.5	15.9	15.7	15.5	15.3	14.7	14.3]

  table:put temp-temhumeda-seminublado "leñoso_a_ras_suelo_sinpastovecino"
    [15.2	14.8	14.4	14.0	13.6	13.4	13.2	13.5	14.5	16.5	19.8	19.0	19.2	19.8	20.0	20.5	19.8	18.8	17.8	17.0	16.5	16.2	15.8	15.5]

  table:put temp-temhumeda-seminublado "cobertura_rocosa"
    [14.6	14.4	14.2	14.0	13.8	13.8	13.8	14.0	14.6	14.8	18.0	17.4	17.6	18.0	18.2	18.6	18.0	17.0	16.4	16.2	16.0	15.8	15.2	14.8]

  table:put temp-temhumeda-seminublado "restos_leñosos_gruesos"
    [14.1	13.9	13.7	13.5	13.3	13.3	13.3	13.5	14.1	14.3	17.5	16.9	17.1	17.5	17.7	18.1	17.5	16.5	15.9	15.7	15.5	15.3	14.7	14.3]


  ;; ---------- Temperaturas por hora de coberturas que solo existen en escenario estocástico= LLUVIA_INTENSA (Temporada= humeda - Condición climática= seminublado) ----------

  table:put temp-temhumeda-seminublado "pasto_acolchonado_inundado"
    [13.6	13.4	13.2	13.0	12.8	12.8	12.8	13.0	13.6	13.8	17.0	16.4	16.6	17.0	17.2	17.6	17.0	16.0	15.4	15.2	15.0	14.8	14.2	13.8]

  table:put temp-temhumeda-seminublado "pasto_compacto_inundado"
    [15.2	14.8	14.4	14.0	13.6	13.4	13.2	13.5	14.5	16.5	19.8	19.0	19.2	19.8	20.0	20.5	19.8	18.8	17.8	17.0	16.5	16.2	15.8	15.5]

  table:put temp-temhumeda-seminublado "tierra_desnuda_inundada"
    [15.2	14.8	14.4	14.0	13.6	13.4	13.2	13.5	14.5	16.5	19.8	19.0	19.2	19.8	20.0	20.5	19.8	18.8	17.8	17.0	16.5	16.2	15.8	15.5]




      ;; ---------- (2.3.1) Temperaturas por hora de coberturas en Temporada humeda - Condición climática= nublado ------------------------------------------

 table:put temp-temhumeda-nublado "pasto_acolchonado"
    [12.8	12.7	12.6	12.5	12.4	12.2	12.3	12.8	13.2	13.8	15.0	15.2	15.6	16.2	15.8	15.6	15.4	14.2	13.6	13.4	13.2	13.0	12.8	12.6]

  table:put temp-temhumeda-nublado "pasto_compacto"
    [14.5	14.2	14.0	13.8	13.6	13.4	13.2	13.5	14.0	15.0	16.5	17.0	17.5	18.2	18.0	17.8	17.5	16.8	16.0	15.5	15.0	14.8	14.6	14.4]

  table:put temp-temhumeda-nublado "suelo_duro"
    [14.5	14.2	14.0	13.8	13.6	13.4	13.2	13.5	14.0	15.0	16.5	17.0	17.5	18.2	18.0	17.8	17.5	16.8	16.0	15.5	15.0	14.8	14.6	14.4]

  table:put temp-temhumeda-nublado "tierra_desnuda"
    [14.5	14.2	14.0	13.8	13.6	13.4	13.2	13.5	14.0	15.0	16.5	17.0	17.5	18.2	18.0	17.8	17.5	16.8	16.0	15.5	15.0	14.8	14.6	14.4]

  table:put temp-temhumeda-nublado "limite_urbano_pastovecino"
    [13.8	13.7	13.6	13.5	13.4	13.2	13.3	13.8	14.2	14.8	16.0	16.2	16.6	17.2	16.8	16.6	16.4	15.2	14.6	14.4	14.2	14.0	13.8	13.6]

  table:put temp-temhumeda-nublado "limite_urbano_sinpastovecino"
    [14.5	14.2	14.0	13.8	13.6	13.4	13.2	13.5	14.0	15.0	16.5	17.0	17.5	18.2	18.0	17.8	17.5	16.8	16.0	15.5	15.0	14.8	14.6	14.4]

   table:put temp-temhumeda-nublado "roca_a_ras_suelo_pastovecino"
    [13.8	13.7	13.6	13.5	13.4	13.2	13.3	13.8	14.2	14.8	16.0	16.2	16.6	17.2	16.8	16.6	16.4	15.2	14.6	14.4	14.2	14.0	13.8	13.6]

  table:put temp-temhumeda-nublado "roca_a_ras_suelo_sinpastovecino"
    [14.5	14.2	14.0	13.8	13.6	13.4	13.2	13.5	14.0	15.0	16.5	17.0	17.5	18.2	18.0	17.8	17.5	16.8	16.0	15.5	15.0	14.8	14.6	14.4]

  table:put temp-temhumeda-nublado "leñoso_a_ras_suelo_pastovecino"
    [13.3	13.2	13.1	13.0	12.9	12.7	12.8	13.3	13.7	14.3	15.5	15.7	16.1	16.7	16.3	16.1	15.9	14.7	14.1	13.9	13.7	13.5	13.3	13.1]

  table:put temp-temhumeda-nublado "leñoso_a_ras_suelo_sinpastovecino"
    [14.5	14.2	14.0	13.8	13.6	13.4	13.2	13.5	14.0	15.0	16.5	17.0	17.5	18.2	18.0	17.8	17.5	16.8	16.0	15.5	15.0	14.8	14.6	14.4]

  table:put temp-temhumeda-nublado "cobertura_rocosa"
    [13.8	13.7	13.6	13.5	13.4	13.2	13.3	13.8	14.2	14.8	16.0	16.2	16.6	17.2	16.8	16.6	16.4	15.2	14.6	14.4	14.2	14.0	13.8	13.6]

  table:put temp-temhumeda-nublado "restos_leñosos_gruesos"
    [13.3	13.2	13.1	13.0	12.9	12.7	12.8	13.3	13.7	14.3	15.5	15.7	16.1	16.7	16.3	16.1	15.9	14.7	14.1	13.9	13.7	13.5	13.3	13.1]


  ;; ---------- Temperaturas por hora de coberturas que solo existen en escenario estocástico= LLUVIA_INTENSA (Temporada= humeda - Condición climática= nublado) ----------

  table:put temp-temhumeda-nublado "pasto_acolchonado_inundado"
    [12.8	12.7	12.6	12.5	12.4	12.2	12.3	12.8	13.2	13.8	15.0	15.2	15.6	16.2	15.8	15.6	15.4	14.2	13.6	13.4	13.2	13.0	12.8	12.6]

  table:put temp-temhumeda-nublado "pasto_compacto_inundado"
    [14.5	14.2	14.0	13.8	13.6	13.4	13.2	13.5	14.0	15.0	16.5	17.0	17.5	18.2	18.0	17.8	17.5	16.8	16.0	15.5	15.0	14.8	14.6	14.4]

  table:put temp-temhumeda-nublado "tierra_desnuda_inundada"
    [14.5	14.2	14.0	13.8	13.6	13.4	13.2	13.5	14.0	15.0	16.5	17.0	17.5	18.2	18.0	17.8	17.5	16.8	16.0	15.5	15.0	14.8	14.6	14.4]




  ;; ---------- (2.3.4) Temperaturas por hora de coberturas en Temporada seca - Condición climática= soleado ---------------------------------------------

  table:put temp-temseca-soleado "pasto_acolchonado"
    [14.6	14.2	13.8	13.6	13.4	13.2	13.0	12.9	13.5	14.0	15.2	15.8	16.8	17.5	18.2	18.6	19.0	18.8	18.5	17.4	16.6	16.0	15.4	15.0]

  table:put temp-temseca-soleado "pasto_compacto"
    [17.5	16.5	15.0	14.0	13.0	12.0	11.2	10.7	15.5	20.5	26.0	30.5	34.0	36.8	39.5	40.8	41.4	38.5	35.0	31.0	27.0	23.5	20.5	18.5]

  table:put temp-temseca-soleado "suelo_duro"
    [17.5	16.5	15.0	14.0	13.0	12.0	11.2	10.7	15.5	20.5	26.0	30.5	34.0	36.8	39.5	40.8	41.4	38.5	35.0	31.0	27.0	23.5	20.5	18.5]

  table:put temp-temseca-soleado "tierra_desnuda"
    [17.5	16.5	15.0	14.0	13.0	12.0	11.2	10.7	15.5	20.5	26.0	30.5	34.0	36.8	39.5	40.8	41.4	38.5	35.0	31.0	27.0	23.5	20.5	18.5]

  table:put temp-temseca-soleado "limite_urbano_pastovecino"
    [15.6	15.2	14.8	14.6	14.4	14.2	14.0	13.9	14.5	15.0	16.2	16.8	17.8	18.5	19.2	19.6	20.0	19.8	19.5	18.4	17.6	17.0	16.4	16.0]

  table:put temp-temseca-soleado "limite_urbano_sinpastovecino"
    [17.5	16.5	15.0	14.0	13.0	12.0	11.2	10.7	15.5	20.5	26.0	30.5	34.0	36.8	39.5	40.8	41.4	38.5	35.0	31.0	27.0	23.5	20.5	18.5]

  table:put temp-temseca-soleado "roca_a_ras_suelo_pastovecino"
    [15.6	15.2	14.8	14.6	14.4	14.2	14.0	13.9	14.5	15.0	16.2	16.8	17.8	18.5	19.2	19.6	20.0	19.8	19.5	18.4	17.6	17.0	16.4	16.0]

  table:put temp-temseca-soleado "roca_a_ras_suelo_sinpastovecino"
    [17.5	16.5	15.0	14.0	13.0	12.0	11.2	10.7	15.5	20.5	26.0	30.5	34.0	36.8	39.5	40.8	41.4	38.5	35.0	31.0	27.0	23.5	20.5	18.5]

  table:put temp-temseca-soleado "leñoso_a_ras_suelo_pastovecino"
    [15.1	14.7	14.3	14.1	13.9	13.7	13.5	13.4	14.0	14.5	15.7	16.3	17.3	18.0	18.7	19.1	19.5	19.3	19.0	17.9	17.1	16.5	15.9	15.5]

  table:put temp-temseca-soleado "leñoso_a_ras_suelo_sinpastovecino"
    [17.5	16.5	15.0	14.0	13.0	12.0	11.2	10.7	15.5	20.5	26.0	30.5	34.0	36.8	39.5	40.8	41.4	38.5	35.0	31.0	27.0	23.5	20.5	18.5]

  table:put temp-temseca-soleado "cobertura_rocosa"
    [15.6	15.2	14.8	14.6	14.4	14.2	14.0	13.9	14.5	15.0	16.2	16.8	17.8	18.5	19.2	19.6	20.0	19.8	19.5	18.4	17.6	17.0	16.4	16.0]

  table:put temp-temseca-soleado "restos_leñosos_gruesos"
    [15.1	14.7	14.3	14.1	13.9	13.7	13.5	13.4	14.0	14.5	15.7	16.3	17.3	18.0	18.7	19.1	19.5	19.3	19.0	17.9	17.1	16.5	15.9	15.5]


  ;; ----------  Temperaturas por hora de coberturas que solo existen en escenario estocástico= SEQUÍA (Temporada= seca - Condición climática= soleado) ----------

  table:put temp-temseca-soleado "pasto_acolchonado_deteriorofoliar"
    [16.6	15.9	14.9	14.3	13.7	13.1	12.6	12.3	15.0	17.8	21.1	23.7	25.9	27.7	29.4	30.2	30.7	29.2	27.3	24.7	22.3	20.3	18.5	17.3]

  table:put temp-temseca-soleado "pasto_compacto_deteriorofoliar"
    [17.5	16.5	15.0	14.0	13.0	12.0	11.2	10.7	15.5	20.5	26.0	30.5	34.0	36.8	39.5	40.8	41.4	38.5	35.0	31.0	27.0	23.5	20.5	18.5]

  table:put temp-temseca-soleado "pasto_deteriorofoliar_estolonifero"
    [17.5	16.5	15.0	14.0	13.0	12.0	11.2	10.7	15.5	20.5	26.0	30.5	34.0	36.8	39.5	40.8	41.4	38.5	35.0	31.0	27.0	23.5	20.5	18.5]




   ;; ---------- (2.3.5) Temperaturas por hora de coberturas en Temporada seca - Condición climática= seminublado ---------------------------------------------

  table:put temp-temseca-seminublado "pasto_acolchonado"
    [13.1	12.8	12.7	12.6	12.5	12.4	12.5	13.2	15.2	16.6	18.2	18.2	17.6	17.4	17.4	17.2	16.8	16.2	15.2	14.6	14.2	13.9	13.7	13.5]

  table:put temp-temseca-seminublado "pasto_compacto"
    [17.0	16.2	15.4	14.8	14.2	13.8	13.6	14.0	17.2	20.5	23.8	25.0	24.0	23.5	23.5	23.0	22.0	21.0	20.0	19.0	18.0	17.2	16.8	16.5]

  table:put temp-temseca-seminublado "suelo_duro"
    [17.0	16.2	15.4	14.8	14.2	13.8	13.6	14.0	17.2	20.5	23.8	25.0	24.0	23.5	23.5	23.0	22.0	21.0	20.0	19.0	18.0	17.2	16.8	16.5]

  table:put temp-temseca-seminublado "tierra_desnuda"
    [17.0	16.2	15.4	14.8	14.2	13.8	13.6	14.0	17.2	20.5	23.8	25.0	24.0	23.5	23.5	23.0	22.0	21.0	20.0	19.0	18.0	17.2	16.8	16.5]

  table:put temp-temseca-seminublado "limite_urbano_pastovecino"
    [14.1	13.8	13.7	13.6	13.5	13.4	13.5	14.2	16.2	17.6	19.2	19.2	18.6	18.4	18.4	18.2	17.8	17.2	16.2	15.6	15.2	14.9	14.7	14.5]

  table:put temp-temseca-seminublado "limite_urbano_sinpastovecino"
    [17.0	16.2	15.4	14.8	14.2	13.8	13.6	14.0	17.2	20.5	23.8	25.0	24.0	23.5	23.5	23.0	22.0	21.0	20.0	19.0	18.0	17.2	16.8	16.5]

  table:put temp-temseca-seminublado "roca_a_ras_suelo_pastovecino"
    [14.1	13.8	13.7	13.6	13.5	13.4	13.5	14.2	16.2	17.6	19.2	19.2	18.6	18.4	18.4	18.2	17.8	17.2	16.2	15.6	15.2	14.9	14.7	14.5]

  table:put temp-temseca-seminublado "roca_a_ras_suelo_sinpastovecino"
    [17.0	16.2	15.4	14.8	14.2	13.8	13.6	14.0	17.2	20.5	23.8	25.0	24.0	23.5	23.5	23.0	22.0	21.0	20.0	19.0	18.0	17.2	16.8	16.5]

  table:put temp-temseca-seminublado "leñoso_a_ras_suelo_pastovecino"
    [13.6	13.3	13.2	13.1	13.0	12.9	13.0	13.7	15.7	17.1	18.7	18.7	18.1	17.9	17.9	17.7	17.3	16.7	15.7	15.1	14.7	14.4	14.2	14.0]

  table:put temp-temseca-seminublado "leñoso_a_ras_suelo_sinpastovecino"
    [17.0	16.2	15.4	14.8	14.2	13.8	13.6	14.0	17.2	20.5	23.8	25.0	24.0	23.5	23.5	23.0	22.0	21.0	20.0	19.0	18.0	17.2	16.8	16.5]

  table:put temp-temseca-seminublado "cobertura_rocosa"
    [14.1	13.8	13.7	13.6	13.5	13.4	13.5	14.2	16.2	17.6	19.2	19.2	18.6	18.4	18.4	18.2	17.8	17.2	16.2	15.6	15.2	14.9	14.7	14.5]

  table:put temp-temseca-seminublado "restos_leñosos_gruesos"
    [13.6	13.3	13.2	13.1	13.0	12.9	13.0	13.7	15.7	17.1	18.7	18.7	18.1	17.9	17.9	17.7	17.3	16.7	15.7	15.1	14.7	14.4	14.2	14.0]


  ;; ----------  Temperaturas por hora de coberturas que solo existen en escenario estocástico= SEQUÍA (Temporada= seca - Condición climática= seminublado) ----------

  table:put temp-temseca-seminublado "pasto_acolchonado_deteriorofoliar"
    [15.6	15.0	14.6	14.2	13.9	13.6	13.6	14.1	16.7	19.1	21.5	22.1	21.3	21.0	21.0	20.6	19.9	19.1	18.1	17.3	16.6	16.1	15.8	15.5]

  table:put temp-temseca-seminublado "pasto_compacto_deteriorofoliar"
    [17.0	16.2	15.4	14.8	14.2	13.8	13.6	14.0	17.2	20.5	23.8	25.0	24.0	23.5	23.5	23.0	22.0	21.0	20.0	19.0	18.0	17.2	16.8	16.5]

  table:put temp-temseca-seminublado "pasto_deteriorofoliar_estolonifero"
    [17.0	16.2	15.4	14.8	14.2	13.8	13.6	14.0	17.2	20.5	23.8	25.0	24.0	23.5	23.5	23.0	22.0	21.0	20.0	19.0	18.0	17.2	16.8	16.5]




   ;; ---------- (2.3.6) Temperaturas por hora de coberturas en Temporada seca - Condición climática= nublado ---------------------------------------------

  table:put temp-temseca-nublado "pasto_acolchonado"
    [13.1	12.8	12.7	12.6	12.5	12.4	12.5	12.7	13.0	14.0	14.8	15.4	15.8	16.8	16.3	16.3	15.8	15.4	14.8	14.2	13.9	13.6	13.4	13.2]

  table:put temp-temseca-nublado "pasto_compacto"
    [16.5	16.0	15.5	15.0	14.6	14.3	14.1	14.2	15.5	17.0	18.5	19.2	19.8	20.5	20.0	19.8	19.2	18.5	17.8	17.0	16.5	16.0	15.5	15.0]

  table:put temp-temseca-nublado "suelo_duro"
    [16.5	16.0	15.5	15.0	14.6	14.3	14.1	14.2	15.5	17.0	18.5	19.2	19.8	20.5	20.0	19.8	19.2	18.5	17.8	17.0	16.5	16.0	15.5	15.0]

  table:put temp-temseca-nublado "tierra_desnuda"
    [16.5	16.0	15.5	15.0	14.6	14.3	14.1	14.2	15.5	17.0	18.5	19.2	19.8	20.5	20.0	19.8	19.2	18.5	17.8	17.0	16.5	16.0	15.5	15.0]

  table:put temp-temseca-nublado "limite_urbano_pastovecino"
    [14.1	13.8	13.7	13.6	13.5	13.4	13.5	13.7	14.0	15.0	15.8	16.4	16.8	17.8	17.3	17.3	16.8	16.4	15.8	15.2	14.9	14.6	14.4	14.2]

  table:put temp-temseca-nublado "limite_urbano_sinpastovecino"
    [16.5	16.0	15.5	15.0	14.6	14.3	14.1	14.2	15.5	17.0	18.5	19.2	19.8	20.5	20.0	19.8	19.2	18.5	17.8	17.0	16.5	16.0	15.5	15.0]

  table:put temp-temseca-nublado "roca_a_ras_suelo_pastovecino"
    [14.1	13.8	13.7	13.6	13.5	13.4	13.5	13.7	14.0	15.0	15.8	16.4	16.8	17.8	17.3	17.3	16.8	16.4	15.8	15.2	14.9	14.6	14.4	14.2]

  table:put temp-temseca-nublado "roca_a_ras_suelo_sinpastovecino"
    [16.5	16.0	15.5	15.0	14.6	14.3	14.1	14.2	15.5	17.0	18.5	19.2	19.8	20.5	20.0	19.8	19.2	18.5	17.8	17.0	16.5	16.0	15.5	15.0]

  table:put temp-temseca-nublado "leñoso_a_ras_suelo_pastovecino"
    [13.6	13.3	13.2	13.1	13.0	12.9	13.0	13.2	13.5	14.5	15.3	15.9	16.3	17.3	16.8	16.8	16.3	15.9	15.3	14.7	14.4	14.1	13.9	13.7]

  table:put temp-temseca-nublado "leñoso_a_ras_suelo_sinpastovecino"
    [16.5	16.0	15.5	15.0	14.6	14.3	14.1	14.2	15.5	17.0	18.5	19.2	19.8	20.5	20.0	19.8	19.2	18.5	17.8	17.0	16.5	16.0	15.5	15.0]

  table:put temp-temseca-nublado "cobertura_rocosa"
    [14.1	13.8	13.7	13.6	13.5	13.4	13.5	13.7	14.0	15.0	15.8	16.4	16.8	17.8	17.3	17.3	16.8	16.4	15.8	15.2	14.9	14.6	14.4	14.2]

  table:put temp-temseca-nublado "restos_leñosos_gruesos"
    [13.6	13.3	13.2	13.1	13.0	12.9	13.0	13.2	13.5	14.5	15.3	15.9	16.3	17.3	16.8	16.8	16.3	15.9	15.3	14.7	14.4	14.1	13.9	13.7]


  ;; ----------  Temperaturas por hora de coberturas que solo existen en escenario estocástico= SEQUÍA (Temporada= seca - Condición climática= nublado) ----------

  table:put temp-temseca-nublado "pasto_acolchonado_deteriorofoliar"
    [15.3	14.9	14.6	14.3	14.1	13.9	13.8	14.0	14.8	16.0	17.2	17.8	18.3	19.2	18.7	18.6	18.0	17.5	16.8	16.1	15.7	15.3	15.0	14.6]

  table:put temp-temseca-nublado "pasto_compacto_deteriorofoliar"
    [16.5	16.0	15.5	15.0	14.6	14.3	14.1	14.2	15.5	17.0	18.5	19.2	19.8	20.5	20.0	19.8	19.2	18.5	17.8	17.0	16.5	16.0	15.5	15.0]

  table:put temp-temseca-nublado "pasto_deteriorofoliar_estolonifero"
    [16.5	16.0	15.5	15.0	14.6	14.3	14.1	14.2	15.5	17.0	18.5	19.2	19.8	20.5	20.0	19.8	19.2	18.5	17.8	17.0	16.5	16.0	15.5	15.0]


;; (2.4) CREAR TABLA DE IR POR COBERTURA
  set IR-por-cobertura table:make

  ;; ---------- IR de coberturas base ---------------------------------------------------------------

  table:put IR-por-cobertura "pasto_acolchonado" 5
  table:put IR-por-cobertura "pasto_compacto" 3
  table:put IR-por-cobertura "suelo_duro" 3
  table:put IR-por-cobertura "tierra_desnuda" 3
  table:put IR-por-cobertura "limite_urbano" 0

   ;; ---------- IR de coberturas de barreras intencionales -----------------------------------------

  table:put IR-por-cobertura "roca_a_ras_suelo" 0
  table:put IR-por-cobertura "leñoso_a_ras_suelo" 0

  ;; ---------- IR de coberturas de refugios intencionales ------------------------------------------

  table:put IR-por-cobertura "cobertura_rocosa" 6
  table:put IR-por-cobertura "restos_leñosos_gruesos" 6

  ;; ---------- IR de coberturas que solo existen en escenario estocástico= SEQUÍA ------------------

  table:put IR-por-cobertura "pasto_acolchonado_deteriorofoliar" 4
  table:put IR-por-cobertura "pasto_compacto_deteriorofoliar" 3
  table:put IR-por-cobertura "pasto_deteriorofoliar_estolonifero" 3

  ;; ---------- IR de coberturas que solo existen en escenario estocástico= LLUVIA INTENSA ----------

  table:put IR-por-cobertura "pasto_acolchonado_inundado" 2
  table:put IR-por-cobertura "pasto_compacto_inundado" 1
  table:put IR-por-cobertura "tierra_desnuda_inundada" 1

  ask patches [
  update-IR
]

;; (2.5) CONFIGURACIÓN DEL ESCENARIO ESTOCÁSTICO
;; Este bloque selecciona:
;; - la tabla de temperatura a usar
;; - la resolución temporal del modelo (ticks por hora)
;; - la duración total de la simulación
;;
;; AJUSTE IMPORTANTE:
;; Se usan ifelse anidados para garantizar que SOLO una tabla de temperatura sea seleccionada según la combinación: (escenario_estocastico + condicion_climatica)

if escenario_estocastico = "sequia" [

  ;; Selección de tabla según condición climática (TEMPORADA SECA)
  ifelse condicion_climatica = "soleado" [
    ;; Temporada seca - condición climática = soleado
    set temp-por-cobertura temp-temseca-soleado
  ]
  [
    ifelse condicion_climatica = "seminublado" [
      ;; Temporada seca - condición climática = seminublado
      set temp-por-cobertura temp-temseca-seminublado
    ]
    [
      if condicion_climatica = "nublado" [
        ;; Temporada seca - condición climática = nublado
        set temp-por-cobertura temp-temseca-nublado
      ]
    ]
  ]

  ;; 1 tick = 1 hora (baja resolución temporal)
  set ticks-por-hora 1

  ;; Duración total: 120 días (en horas)
  set duracion 120 * 24

  ;; para que la velocidad del agente en cm/min se ajuste a la resolucion temporal
  set delta-tiempo 60  ;; 1 tick es igual a 60 minutos
]

if escenario_estocastico = "lluvia_intensa" [

  ;; Selección de tabla según condición climática (TEMPORADA HÚMEDA)
  ifelse condicion_climatica = "soleado" [
    ;; Temporada húmeda - condición climática = soleado
    set temp-por-cobertura temp-temhumeda-soleado
  ]
  [
    ifelse condicion_climatica = "seminublado" [
      ;; Temporada húmeda - condición climática = seminublado
      set temp-por-cobertura temp-temhumeda-seminublado
    ]
    [
      if condicion_climatica = "nublado" [
        ;; Temporada húmeda - condición climática = nublado
        set temp-por-cobertura temp-temhumeda-nublado
      ]
    ]
  ]

  ;; 60 ticks = 1 hora (alta resolución temporal)
  set ticks-por-hora 60 ;; los ticks actuaran como minutos"

  ;; Duración total: 24 horas (evento corto e intensivo)
  set duracion 24 * 60

  ;; para que la velocidad del agente en cm/min se ajuste a la resolucion temporal
  set delta-tiempo 1  ;; 1 tick es igual a 1 minuto
]

 ask patches [
  actualizar-exposicion-lluvia
]

  ;; crear barreras intencionales
  crear-barreras-exclusion

  ;; crear refugios
    crear-refugios-artificiales

   ;; crear agentes
  create-turtles numero-serpientes [

    set shape "arrow"
    set color black
    set size 1.2
    set peso-serpiente 29  ;; g  ;; 29.000 mg
    set tasa-perdida-agua 0.53 ;; mg H2O / g / h
    set perdida-acumulada 0
    set tiempo-en-inundacion 0
    set tiempo-en-exposicion 0
    set hazard-ambiental 0
    set causa-muerte ""
    set vivo? true
    ;; estrategia térmica)
    if escenario_estocastico = "lluvia_intensa" [
    set estrategia_termica "termoconformista"
    ]
    if escenario_estocastico = "sequia" [
    set estrategia_termica "termorregulador_activo"
    ]
    move-to one-of patches with [tipo = "pasto_acolchonado"]
    set IR-anterior [IR] of patch-here
    set temp-anterior [temperatura] of patch-here
  ]

   ;; inicializar contadores globales
  set to-ev-riesgo-choquetermico-ac 0
  set to-ev-riesgo-deshidratacion-ac 0
  set to-ev-riesgo-ahogamiento-ac 0
  set to-ev-riesgo-fisiologico-ac 0
  set to-ev-riesgo-ambiental-ac 0
  set to-eventos-riesgo-ac 0

  reset-ticks
end 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AMBIENTE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 3) TIEMPO → HORA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to-report hora-actual
  report floor (ticks / ticks-por-hora) mod 24
end 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 4) Actualización de TEMPERATURA e IR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to actualizar-vecindad
  set pasto-acolchonado-vecino? any? neighbors4 with [ tipo = "pasto_acolchonado" ]
end 

to update-temperature
  let hour hora-actual
  let clave tipo

  ;; con las barreras los valores de temperatura cambiaran si estan o no en contacto con pasto kikuyo acolchonado
    ;; barreras base
  if tipo = "limite_urbano" [
    if pasto-acolchonado-vecino? [
      set clave "limite_urbano_pastovecino"
    ]
    if not pasto-acolchonado-vecino? [
      set clave "limite_urbano_sinpastovecino"
    ]
  ]
 ;; con barreras intencionales
   ;; roca
  if tipo = "roca_a_ras_suelo" [
    if pasto-acolchonado-vecino? [
      set clave "roca_a_ras_suelo_pastovecino"
    ]
    if not pasto-acolchonado-vecino? [
      set clave "roca_a_ras_suelo_sinpastovecino"
    ]
  ]
   ;; tronco
  if tipo = "leñoso_a_ras_suelo" [
    if pasto-acolchonado-vecino? [
      set clave "leñoso_a_ras_suelo_pastovecino"
    ]
    if not pasto-acolchonado-vecino? [
      set clave "leñoso_a_ras_suelo_sinpastovecino"
    ]
  ]

  let lista table:get temp-por-cobertura clave
  set temperatura item hour lista
end 

to update-IR
  set IR table:get IR-por-cobertura tipo
end 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 5) CAMBIO DE COBERTURA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to cambiar-cobertura [nuevo-tipo nuevo-color]
  set tipo nuevo-tipo
  set pcolor nuevo-color
  update-IR
  actualizar-exposicion-lluvia
end 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 6) PROCESO: INUNDACIÓN (LLUVIA INTENSA)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to proceso-inundacion

  ;; Solo ocurre en lluvia intensa
  if escenario_estocastico != "lluvia_intensa" [ stop ]

  let minutos ticks

  ;; Convertir porcentaje (0–100) a proporción (0–1)
  let p porcentaje_inundacion / 100

  ;; Probabilidad inicial (no puede superar el objetivo total)
  let prob_inicial min list 0.03 p


  ;; ================================
  ;; (6.1) FASE 1: CHARCOS INICIALES
  ;; ================================
  if minutos >= 10 and minutos <= 15 [

    ask patches with [tipo = "pasto_acolchonado"] [
      if random-float 1 < prob_inicial [
        cambiar-cobertura "pasto_acolchonado_inundado" 83
      ]
    ]

    ask patches with [tipo = "pasto_compacto"] [
      if random-float 1 < prob_inicial [
        cambiar-cobertura "pasto_compacto_inundado" 85
      ]
    ]

    ask patches with [tipo = "tierra_desnuda"] [
      if random-float 1 < prob_inicial [
        cambiar-cobertura "tierra_desnuda_inundada" 31
      ]
    ]
  ]


  ;; ================================
  ;; (6.2) FASE 2: EXPANSIÓN DESDE CHARCOS
  ;; ================================
  if minutos > 15 and minutos <= 60 [

    ;; -------- PASTO ACOLCHONADO --------
    let inundados_pa count patches with [
      tipo = "pasto_acolchonado_inundado"
    ]

    if total_original_pa > 0 and (inundados_pa / total_original_pa) < p [

      ask patches with [tipo = "pasto_acolchonado"] [
        if any? neighbors with [tipo = "pasto_acolchonado_inundado"] [

          if random-float 1 < 0.2 [
            cambiar-cobertura "pasto_acolchonado_inundado" 83
          ]

        ]
      ]
    ]


    ;; -------- PASTO COMPACTO --------
    let inundados_pc count patches with [
      tipo = "pasto_compacto_inundado"
    ]

    if total_original_pc > 0 and (inundados_pc / total_original_pc) < p [

      ask patches with [tipo = "pasto_compacto"] [
        if any? neighbors with [tipo = "pasto_compacto_inundado"] [

          if random-float 1 < 0.2 [
            cambiar-cobertura "pasto_compacto_inundado" 85
          ]

        ]
      ]
    ]


    ;; -------- TIERRA DESNUDA --------
    let inundados_td count patches with [
      tipo = "tierra_desnuda_inundada"
    ]

    if total_original_td > 0 and (inundados_td / total_original_td) < p [

      ask patches with [tipo = "tierra_desnuda"] [
        if any? neighbors with [tipo = "tierra_desnuda_inundada"] [

          if random-float 1 < 0.2 [
            cambiar-cobertura "tierra_desnuda_inundada" 31
          ]

        ]
      ]
    ]

  ]
end 

;; valores de IR < 6 no aislan contra precipitación

to actualizar-exposicion-lluvia
  set expuesto-lluvia? (IR < 6)
end 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 7) PROCESO: SEQUÍA (DETERIORO)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to proceso-sequia

  if escenario_estocastico != "sequia" [ stop ]

  let horas ticks

  ;; 20–45 días → deterioro parcial
  if horas >= 480 and horas <= 1080 [

    ask patches with [tipo = "pasto_acolchonado"] [
      cambiar-cobertura "pasto_acolchonado_deteriorofoliar" 43
    ]

    ask patches with [tipo = "pasto_compacto"] [
      cambiar-cobertura "pasto_compacto_deteriorofoliar" 44
    ]
  ]

  ;; 100–120 días → deterioro total
  if horas >= 2400 and horas <= 2880 [

    ask patches with [tipo = "pasto_acolchonado_deteriorofoliar"] [
      cambiar-cobertura "pasto_deteriorofoliar_estolonifero" 45
    ]

    ask patches with [tipo = "pasto_compacto_deteriorofoliar"] [
      cambiar-cobertura "pasto_deteriorofoliar_estolonifero" 45
    ]
  ]
end 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 8) CREACIÓN DE BARRERAS DE EXCLUSIÓN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to crear-barreras-exclusion

  ;; Si el chooser está en "sin", no hacer nada
  if barreras_exclusion = "sin" [ stop ]

  ;; Parches de pasto_acolchonado en contacto con otras coberturas (excepto limite_urbano)
  let candidatos patches with [
    tipo = "pasto_acolchonado" and
    any? neighbors with [
      tipo != "pasto_acolchonado" and
      tipo != "limite_urbano"
    ]
  ]

  ask candidatos [

    ;; Intentar colocar tronco (3x1) con probabilidad 50%
    if random-float 1 < 0.5 [
      if colocar-tronco-barrera self [
        stop
      ]
    ]

    ;; Si no se pudo tronco → colocar roca (1x1)
    let _ colocar-roca-barrera self
  ]
end 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (8.1) ROCA (1x1)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to-report colocar-roca-barrera [p]

  if [tipo] of p != "pasto_acolchonado" [ report false ]

  ;; IMPORTANTE: NO bloqueamos vecinos aquí
  ;; Esto permite que las rocas formen una barrera continua sin huecos

  ask p [
    cambiar-cobertura "roca_a_ras_suelo" 3
  ]

  report true
end 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (8.2) TRONCO (3x1)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to-report colocar-tronco-barrera [p]

  ;; orientación aleatoria
  let paso-x one-of [1 0]
  let paso-y ifelse-value (paso-x = 1) [0] [1]

  let grupo (patch-set p
    patch ([pxcor] of p + paso-x)
          ([pycor] of p + paso-y)
    patch ([pxcor] of p + paso-x * 2)
          ([pycor] of p + paso-y * 2)
  )

  ;; validar tamaño
  if count grupo != 3 [ report false ]

  ;; todos deben ser pasto_acolchonado
  if any? grupo with [tipo != "pasto_acolchonado"] [
    report false
  ]

  ;; SOLO PARA TRONCOS: evitar que queden pegados entre sí
  let vecinos patch-set ([neighbors] of grupo)
  if any? vecinos with [
    tipo = "leñoso_a_ras_suelo"
  ] [
    report false
  ]

  ;; TODOS los parches del grupo deben estar en borde válido
  ;; (esto evita que los troncos se metan hacia el interior del pasto)
  if any? grupo with [

    ;; NO toca otra cobertura (borde externo)
    not any? neighbors4 with [
      tipo != "pasto_acolchonado" and
      tipo != "limite_urbano"
    ]

    or

    ;; NO toca pasto_acolchonado (borde interno)
    not any? neighbors4 with [
      tipo = "pasto_acolchonado"
    ]

  ] [
    report false
  ]

  ask grupo [
    cambiar-cobertura "leñoso_a_ras_suelo" 24
  ]

  report true
end 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 9) Creación de refugios artificiales
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to crear-refugios-artificiales

  ask patches [ set ID-refugio -1 ]

  ;; métricas
  set num_refugios_totales 0
  set num_refugios_rocoso 0
  set num_refugios_leñoso 0

  if tamaño_refugios_seleccion = "ninguno" [
    show "✔ No se generaron refugios"
    stop
  ]

  ;; -------------------------
  ;; (9.1). Definir la secuencia en la que se pondran los refugios
  ;; -------------------------
  let secuencia []

  if tamaño_refugios_seleccion = "30x30cm" [
    set secuencia ["rocoso" "tronco"]
  ]
  if tamaño_refugios_seleccion = "30x90cm" [
    set secuencia ["rocoso" "tronco"]
  ]
  if tamaño_refugios_seleccion = "90x180cm" [
    set secuencia ["rocoso" "tronco"]
  ]
  if tamaño_refugios_seleccion = "180x360cm" [
    set secuencia ["rocoso" "tronco"]
  ]
  if tamaño_refugios_seleccion = "360x720cm" [
    set secuencia ["rocoso" "tronco"]
  ]

  ;; -------------------------
  ;; (9.2) se define el tamaño de los refugios
  ;; -------------------------
  let gap distancia_entre_refugios

  let ancho 0
  let alto 0

  if tamaño_refugios_seleccion = "30x30cm" [
    set ancho 1
    set alto 1
  ]
  if tamaño_refugios_seleccion = "30x90cm" [
    set ancho 3
    set alto 1
  ]
  if tamaño_refugios_seleccion = "90x180cm" [
    set ancho 6
    set alto 3
  ]
  if tamaño_refugios_seleccion = "180x360cm" [
    set ancho 12
    set alto 6
  ]
  if tamaño_refugios_seleccion = "360x720cm" [
    set ancho 24
    set alto 12
  ]

  let celda_x (ancho + gap)
  let celda_y (alto + gap)

  ;; -------------------------
  ;;  (9.3) se define donde se originaran
  ;; -------------------------
 let origen-y max [pycor] of patches with [tipo = "pasto_acolchonado"]
  let origen-x min [pxcor] of patches with [tipo = "pasto_acolchonado"]

;; -------------------------
;;  (9.4) se define su aparición global (a manera de mosaico para que se aparezcan lo mas rapido posible)
;; -------------------------

ask patches [

  if tipo = "pasto_acolchonado" [

    ;; ajuste de origen
    let cx floor ((pxcor - origen-x) / celda_x)
    let cy floor ((origen-y - pycor) / celda_y)

    let local_x ((pxcor - origen-x) mod celda_x)
    let local_y ((origen-y - pycor) mod celda_y)

    if (local_x < ancho) and (local_y < alto) [

      let indice (cx + cy)
      let tipo_actual item (indice mod length secuencia) secuencia

      ;;;; se le da identidad a cada refugio y un ID

      if tipo_actual = "rocoso" [
        cambiar-cobertura "cobertura_rocosa" 6
      ]

      if tipo_actual = "tronco" [
        cambiar-cobertura "restos_leñosos_gruesos" 35
      ]

      set ID-refugio (cx * 100000 + cy)
    ]
  ]

]
  ;; -------------------------
  ;; (9.5) se eliminan los refugios que no cumplan con el tamaño tamaño definido
  ;; -------------------------

  if (ancho * alto) > 1 [

    let tamaño_refugio (ancho * alto)

    let ids remove-duplicates [ID-refugio] of patches with [ID-refugio != -1]

    foreach ids [ id ->

      let bloque patches with [ID-refugio = id]

      if count bloque != tamaño_refugio [

        ask bloque [
          set ID-refugio -1
          cambiar-cobertura "pasto_acolchonado" 63
        ]

      ]

    ]

  ]

  ;; -------------------------
  ;; (9.6) Metricas para mostrar
  ;; -------------------------

  let patches_refugio patches with [ID-refugio != -1]

  set num_refugios_totales length remove-duplicates [ID-refugio] of patches_refugio

  set num_refugios_rocoso length remove-duplicates
    [ID-refugio] of patches with [ID-refugio != -1 and pcolor = 6]

  set num_refugios_leñoso length remove-duplicates
    [ID-refugio] of patches with [ID-refugio != -1 and pcolor = 35]

  ;; -------------------------
  ;; RESULTADOS
  ;; -------------------------

  show (word "✔ Refugios rocosos: " num_refugios_rocoso)
  show (word "✔ Refugios tronco: " num_refugios_leñoso)
  show (word "✔ Total refugios: " num_refugios_totales)
end 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AGENTE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (11) Magnitud del desplazamiento, Beneficios, Consecuencias y Muerte
;; → magnitud del desplazamiento (NO pasos)
;; → acoplado a ritmo circadiano (en estado optimo) o ariesgo
;; → escala temporal explícita con delta-tiempo
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to velocidad-movimiento

  let temp-local [temperatura] of patch-here
  let IR-local [IR] of patch-here

  ;; -------------------------
  ;; VELOCIDADES (EN PARCHES)
  ;; -------------------------
  let velocidad-base 1   ;; 1 parche/min = 30 cm/min
  let velocidad-riesgo 4 ;; 4 parches/min = 120 cm/min

  ;; -------------------------
  ;; RESET
  ;; -------------------------
  set velocidad 0

  ;; -------------------------
  ;; Ajuste de la escala para la acumulación de la perdida de agua por hora
  ;; -------------------------
  let cambio-tick tasa-perdida-agua * peso-serpiente * (delta-tiempo / 60)


  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DESPLAZAMIENTO SOBRE OPTIMO y BENEFICIOS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  if IR-local >= 5 [

  let actividad-circadiana item hora-actual [
    1 1 1 1 1 1
    0.8 0.6 0.3 0.1 0 0
    0 0 0.1 0.3 0.6 0.8
    1 1 1 1 1 1
  ]

  set velocidad velocidad-base * delta-tiempo * actividad-circadiana

  ;; -------------------------
  ;; BENEFICIO 1 - REHIDRATACION
  ;; -------------------------

  set perdida-acumulada perdida-acumulada - cambio-tick
]
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DESPLAZAMIENTO SOBRE ZONAS DE RIESGO - CONSECUENCIAS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; VELOCIDAD EN RIESGO (solo si está en zona peligrosa)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

if IR-local < 5 [
  set velocidad velocidad-riesgo * delta-tiempo
]

  ;; -------------------------
  ;; CONSECUENCIA 1: choquetermico
  ;; -------------------------
      if temp-local > 31 or temp-local < 3.991 [  ;; si supera el umbral muere
      set causa-muerte "choquetermico"
      set muertes-choquetermico muertes-choquetermico + 1
      morir
     ]


;; -------------------------
;; CONSECUENCIA 2: PERDIDA DE AGUA - DESHIDRATACIÓN (IR 4)
;; -------------------------

;; acumulación SOLO cuando está en zona de riesgo hídrico
if IR-local = 4 [
  set perdida-acumulada perdida-acumulada + cambio-tick
]

;; -------------------------
;; EVITAR VALORES NEGATIVOS
;; -------------------------
if perdida-acumulada < 0 [
  set perdida-acumulada 0
]

;; -------------------------
;; PORCENTAJE DE PÉRDIDA
;; (estado fisiológico acumulado)
;; -------------------------
let porcentaje-perdida perdida-acumulada / (peso-serpiente * 1000)

;; -------------------------
;; MUERTE POR DESHIDRATACIÓN
;; -------------------------
if porcentaje-perdida >= 0.15 [  ;; umbral letal: 15% pérdida de masa
  set causa-muerte "deshidratacion"
  set muertes-deshidratacion muertes-deshidratacion + 1
  morir
]

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; CONSECUENCIA 3 - AHOGAMIENTO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ifelse (IR-local = 1 or IR-local = 2) [

  ;; acumulación de tiempo en agua
  set tiempo-en-inundacion tiempo-en-inundacion + delta-tiempo

] [

  ;; fuera del agua → reinicia exposición
  set tiempo-en-inundacion 0
]

;; -------------------------
;; PROBABILIDAD DE MUERTE POR AHOGAMIENTO
;; -------------------------

if tiempo-en-inundacion > 17 [

  let prob-muerte 1 - exp(-0.12 * (tiempo-en-inundacion - 17))

  if random-float 1 < prob-muerte [
    set causa-muerte "ahogamiento"
    set muertes-ahogamiento muertes-ahogamiento + 1
    die   ;; o "morir" si tienes procedimiento propio
  ]
]

  ;; -------------------------
  ;; Desplazamiento
  ;; -------------------------
   set desplazamiento max list 0 velocidad

  if desplazamiento > 0 [
    tomar-decision-desplazamiento
  ]
end 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (12) TOMA DE DECISIONES PARA CADA DESPLAZAMIENTO
;; → define dirección del movimiento (NO magnitud)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to tomar-decision-desplazamiento


  ;; =========================
  ;; 1. DIRECCIÓN DEL DESPLAZAMIENTO
  ;; =========================
  ;; Crea una lista con los 8 parches vecinos alrededor del agente.

  let opciones neighbors ;; Esto es el “mapa inmediato” de posibles desplazamientos.

  ;; Se filtran los vecinos para que el agente solo pueda moverse sobre celdas que no sean barreras
  ;; Barreras (IR = 0)
  let opciones-validas opciones with [IR > 0]

  ;; si no hay vecinos transitables → no se mueve
  if not any? opciones-validas [ stop ]

  ;; para que el agente pueda leer el estado del parche actual:
  let temp-local [temperatura] of patch-here ;; lee la temperatura actual
  let IR-local [IR] of patch-here ;; lee el IR actual
  ;; Esto le permite al agente definr si está en un parche óptimo o en riesgo.

  ;; sin embargo, durante la lluvia hay caos

;; =========================
;; MODO CAOTICO (ESTADO: BAJO PRECIPITACIÓN)
;; Solo durante la franja de tiempo en que la precipitacion esta activa (10min - 60min; Condición climática: LLuvia intensa)
;; y dentro de coberturas donde la lluvia NO es aislada completamente = IR < 6)
;; =========================

if escenario_estocastico = "lluvia_intensa"
   and ticks >= 10 and ticks <= 60
   and [expuesto-lluvia?] of patch-here [

  ;; comportamiento desorganizado bajo perturbación
  ;; solo se desplaza como respuesta al disturbio (lluvia)

  let r-lluvia random-float 1

  ;; 🔄 50% desplazamiento aleatorio
  ;; el agente se mueve en cualquier dirección sin preferencia
  if r-lluvia < 0.5 [
    move-to one-of opciones-validas
    stop
  ]

  ;; ➡️ 50% desplazamiento direccional (inercia de desplazamiento)
  ;; el agente mantiene su rumbo sin evaluar condiciones del entorno
  let adelante opciones-validas with [
    abs (subtract-headings ([heading] of myself) towards myself) < 45
  ]

  ;; si hay opciones en la dirección actual, las usa
  if any? adelante [
    move-to one-of adelante
    stop
  ]

  ;; fallback: si no hay dirección clara, se mueve aleatoriamente
  move-to one-of opciones-validas
  stop
]

  ;; =========================
  ;; (12.1) EVALUACIÓN DENTRO DEL ÓPTIMO (ESTADO: PROTEGIDO)
  ;; ========================

  ;; Detectar si el agente está en condición óptima ecológica
  if (temp-local >= 3.991 and temp-local <= 31) and (IR-local = 5 or IR-local = 6) [ ;; si esta en condiciones óptima:

    ;; se activa el comportamiento termico de acuerdo a la temporada

    ;; =========================
    ;; Temporada humeda → termoconformista
    ;; =========================

    if estrategia_termica = "termoconformista" [

      ;; filtrar vecinos que sigan siendo optimos y buscar moverse en ellos sin salir del óptimo
      let candidatos opciones with [
        temperatura >= 3.991 and temperatura <= 31 and (IR = 5 or IR = 6)
      ]

      ;; =========================
      ;; TOMA DE DECISIÓN EN TERMOCONFORMISMO
      ;; =========================

      ;; Si existe al menos un vecino optimo → muévete a ese
      if any? candidatos [
        move-to one-of candidatos
      ]
      ;; Si NO hay vecinos buenos → muévete a cualquier vecino disponible (exploración)
      if not any? candidatos [
        move-to one-of opciones
      ]

      stop
    ]

    ;; =========================
    ;; Temporada seca → termorregulador activo
    ;; =========================

    if estrategia_termica = "termorregulador_activo" [

      ;; Si existe vecinos con temperaturas mas cercanas a Tsel del agente - → muévete a uno de esos
      let candidatos-optimos opciones with [
        temperatura >= 19.53 and temperatura <= 21.30 and (IR = 5 or IR = 6)
      ]

      ;; si no, filtrar vecinos que sigan siendo optimos y buscar moverse en ellos sin salir del óptimo
      let candidatos-secundarios opciones with [
        temperatura >= 3.991 and temperatura <= 31 and (IR = 5 or IR = 6)
      ]

      ;; =========================
      ;; TOMA DE DECISIÓN EN TERMORREGULACIÓN ACTIVA
      ;; =========================


      ;; si hay zonas que se acerquen al Tsel del agente, elige la que mas se acerque a la media de Tsel= 20.36
      if any? candidatos-optimos [
        move-to min-one-of candidatos-optimos [
          abs(temperatura - 20.36)
        ]
        stop
      ]

      ;; si no hay optimo con tsel perfecto, de todas formas, busca la mejor aproximación
      if any? candidatos-secundarios [
        move-to min-one-of candidatos-secundarios [
          abs(temperatura - 20.36)
        ]
        stop
      ]

      ;; si no encuntras nada, exploración
      move-to one-of opciones
      stop
    ]

    stop
]

;; =========================
;; (12.2) EVALUACION FUERA DEL ÓPTIMO SIN CAOS (ESTADO: EN RIESGO)
;; =========================
;; 1. Si existen vecinos en óptimo de temperatura e IR
;; busca moverte hacia ellos
let buscar-optimo opciones-validas with [
  temperatura >= 3.991 and temperatura <= 31 and (IR = 5 or IR = 6)
]

;; 2. si no, busca uno que mejoren al menos en un atributo
;; (ya sea por temperatura o por IR)
let mejorar-IR opciones-validas with [
  IR > IR-local
]

let mejorar-temperatura opciones-validas with [
  temperatura >= 3.991 and temperatura <= 31
]

;; =========================
;;  TOMA DE DECISIÓN FUERA DE OPTIMO
;; =========================

if any? opciones-validas [

  let r random-float 1

  ;; 1. volver al óptimo (máxima prioridad)
  if any? buscar-optimo and r < 0.35 [
    move-to one-of buscar-optimo
    stop
  ]

  ;; 2. mejorar condición térmica
  if any? mejorar-temperatura and r >= 0.35 and r < 0.6 [
    move-to one-of mejorar-temperatura
    stop
  ]

  ;; 3. mejorar calidad (IR)
  if any? mejorar-IR and r >= 0.6 and r < 0.85 [
    move-to one-of mejorar-IR
    stop
  ]

;; 🔍 4. EXPLORACIÓN (con direccionalidad)

;; 1. seleccionar candidatos de exploración (igual o peor IR)
let candidatos-exploracion opciones-validas with [
  IR <= IR-local
]

;; 2. si existen candidatos de exploración
if any? candidatos-exploracion [

  ;; generar decisión probabilística
  let r2 random-float 1

  ;; 50%: moverse hacia adelante (mantener dirección)
  if r2 < 0.5 [

    ;; vecinos que están aproximadamente en la dirección actual
    let adelante candidatos-exploracion with [
      abs (subtract-headings ([heading] of myself) towards myself) < 45
    ]

    ;; si hay opciones hacia adelante, usarlas
    if any? adelante [
      move-to one-of adelante
      stop
    ]
  ]

  ;; 50% (o fallback): desplazamiento aleatorio dentro de exploración
  move-to one-of candidatos-exploracion
  stop

]

  ;; si no hay candidatos de exploración, usar cualquier opción válida
  move-to one-of opciones-validas
  stop
]
end 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (13) DINÁMICA AMBIENTAL
;; → registra cambios en el entorno
;; → acumula eventos ecológicos
;; → calcula riesgo de exposición (NO fisiológico)
;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to dinamica-ambiental

  let IR-local [IR] of patch-here
  let temp-local [temperatura] of patch-here

;; =========================
;; RIESGO AMBIENTAL (HAZARD PROGRESIVO)
;; =========================

;; acumulación SOLO en zona de exposición (IR 1 o IR 3)
if IR-local = 3 or IR-local = 1 [
  set tiempo-en-exposicion tiempo-en-exposicion + delta-tiempo
]

;; reset TOTAL si sale de esas zonas
if IR-local != 3 and IR-local != 1 [
  set tiempo-en-exposicion 0
]

;; conversión a hazard progresivo
let k 1
let base-hazard 0.005

set hazard-ambiental base-hazard *
  (tiempo-en-exposicion / (tiempo-en-exposicion + k))

;; =========================
;; MUERTE POR CAUSAS AMBIENTALES (IR 1 o IR 3)
;; =========================

let p hazard-ambiental * delta-tiempo

;; límite de seguridad (evita probabilidades > 1)
set p min (list p 0.9)

if (IR-local = 1 or IR-local = 3) and random-float 1 < p [

  set muertes-causas-ambientales muertes-causas-ambientales + 1
  morir
]
end 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Mortalidad
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to conteo-eventos


  let IR-local [IR] of patch-here
  let temp-local [temperatura] of patch-here

  ;; =========================
  ;; Conteo de eventos de riesgo
  ;; =========================

  if (temp-anterior > 3.991 and temp-anterior < 31) and
     (temp-local <= 3.991 or temp-local >= 31) [

    set to-ev-riesgo-choquetermico-ac to-ev-riesgo-choquetermico-ac + 1
  ]

  if (IR-anterior = 6 or IR-anterior = 5 or IR-anterior = 3 or IR-anterior = 2 or IR-anterior = 1)
     and (IR-local = 4) [

    set to-ev-riesgo-deshidratacion-ac to-ev-riesgo-deshidratacion-ac + 1
  ]

  if (IR-anterior = 6 or IR-anterior = 5 or IR-anterior = 4 or IR-anterior =  2 or IR-anterior = 1)
     and (IR-local = 3) [

    set to-ev-riesgo-ambiental-ac to-ev-riesgo-ambiental-ac + 1
  ]

  if (IR-anterior = 6 or IR-anterior = 5 or IR-anterior = 4 or IR-anterior =  3)
     and (IR-local = 2) [
     set to-ev-riesgo-ahogamiento-ac to-ev-riesgo-ahogamiento-ac + 1
  ]

  if (IR-anterior = 6 or IR-anterior = 5 or IR-anterior = 4 or IR-anterior =  3)
     and (IR-local = 1) [

    set to-ev-riesgo-ahogamiento-ac to-ev-riesgo-ahogamiento-ac + 1
    set to-ev-riesgo-ambiental-ac to-ev-riesgo-ambiental-ac + 1
  ]

  ;; =========================
  ;; TOTALES
  ;; =========================

  set to-ev-riesgo-fisiologico-ac
      to-ev-riesgo-choquetermico-ac +
      to-ev-riesgo-deshidratacion-ac +
      to-ev-riesgo-ahogamiento-ac

  set to-eventos-riesgo-ac
      to-ev-riesgo-fisiologico-ac +
      to-ev-riesgo-ambiental-ac
end 

to morir
  set vivo? false
  set color red
  set total_muertes total_muertes + 1
  die
end 

to sobrevivir
  set vivo? true
  set color green
  set total_vivos total_vivos + 1
  ;; NO die
end 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (10) GO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to go

  if ticks >= duracion [ stop ]

  proceso-inundacion
  proceso-sequia

  ask patches [
    actualizar-vecindad
    update-temperature
  ]

 ask turtles with [vivo?] [

  velocidad-movimiento
  dinamica-ambiental
  conteo-eventos

  ;; actualizar memoria aquí
  set temp-anterior [temperatura] of patch-here
  set IR-anterior [IR] of patch-here
]
  ;; =========================
  ;; Mortalidad
  ;; =========================
  set total_muertes (numero-serpientes - count turtles with [vivo?])

  if numero-serpientes > 0 and ticks > 0 [
    set tasa_mortalidad total_muertes / numero-serpientes
]

  ;; =========================
  ;; Supervivencia
  ;; =========================
  set total_vivos count turtles with [vivo?]

  if numero-serpientes > 0 [
   set tasa_supervivencia total_vivos / numero-serpientes
]
  ;; =========================
  ;; PLOTS
  ;; =========================
  set-current-plot "Mortalidad"
  set-current-plot-pen "muertes"
  plot total_muertes

  set-current-plot "Eventos de riesgo acumulado"
  set-current-plot-pen "Total"
  plot to-eventos-riesgo-ac

  set-current-plot-pen "ambiental"
  plot to-ev-riesgo-ambiental-ac

  set-current-plot-pen "fisiologico"
  plot to-ev-riesgo-fisiologico-ac

  set-current-plot-pen "choquetermico"
  plot to-ev-riesgo-choquetermico-ac

  set-current-plot-pen "deshidratacion"
  plot to-ev-riesgo-deshidratacion-ac

  set-current-plot-pen "ahogamiento"
  plot to-ev-riesgo-ahogamiento-ac

  set-current-plot "Supervivencia"
  set-current-plot-pen "Sobrevivientes"
  plot total_vivos


  tick
end 

There is only one version of this model, created about 8 hours ago by Julián Felipe Rengifo Martínez.

Attached files

File Type Description Last updated
Mundo view.png png Debe importar el archivo PNG para cargar las coberturas base sobre las que se desarrollará el modelo about 8 hours ago, by Julián Felipe Rengifo Martínez Download
Refugios artificiales y barreras para la supervivencia de serpientes en un parque urbano.png preview Preview for 'Refugios artificiales y barreras para la supervivencia de serpientes en un parque urbano' about 8 hours ago, by Julián Felipe Rengifo Martínez Download

This model does not have any ancestors.

This model does not have any descendants.