Primeros pasos con OGGM Edu: glaciares idealizados

OGGM Edu proporciona una forma sencilla de experimentar con los glaciares en su computadora. Esto se logra mediante una interfaz de alto nivel para las diferentes partes del complejo modelo glaciar que es OGGM. Usted, como usuario, interactuará con algunos objetos que le proporcionarán métodos y atributos adecuados para un glaciar y las partes que lo componen. El objetivo de este cuaderno es presentarle OGGM Edu y cómo se puede utilizar para simular dos glaciares idealizados. Empezamos importando las clases que necesitamos

from oggm_edu import MassBalance, GlacierBed, Glacier, GlacierCollection

Las tres clases principales que vamos a utilizar son las

  • Glaciar Lecho

  • Balance de masa

  • Glaciar El GlacierBed proporciona una manera fácil de definir el lecho del glaciar, mientras que el MassBalance se usa para definir el balance de masa del glaciar. El ‘Glaciar’ luego nos proporciona métodos para progresar y visualizar el glaciar y los atributos informativos. Para crear un glaciar necesitamos darle un lecho y un balance de masa.

Primeros pasos

En nuestro primer experimento queremos crear un glaciar que sea lo más simple posible. Esto significa un lecho glaciar con una pendiente y un ancho constantes y un balance de masa simple. Comenzamos con la creación del lecho de nuestro glaciar.

El lecho del glaciar

En su forma más simple, el lecho del glaciar requiere una altura superior e inferior y una anchura.

# All arguments are specified in meters.
bed = GlacierBed(top=3400, bottom=1500, width=300)
# This gives us some statistics about the bed.
bed
GlacierBed
Bed type Linear bed with a constant width
Top [m] 3400
Bottom [m] 1500
Width(s) [m] [300]
Length [km] 20.0

Tracemos la cama para asegurarnos de que se vea como esperamos. El objeto bed tiene un método incorporado para esto que nos proporciona una vista lateral y de arriba hacia abajo del dominio del glaciar.

bed.plot()
../_images/edu_intro_es_10_0.png

Para un control más preciso sobre la pendiente del lecho, puede pasar un solo valor a pendientes durante la creación

# This will give us a steeper bed compared to the default.
bed_with_slope = GlacierBed(top=3400, bottom=1500, width=300, slopes=25)
bed_with_slope.plot()
../_images/edu_intro_es_12_0.png

También puede pasar una secuencia de ángulos de pendiente en slopes; para esto, también necesita especificar los tramos de altitud de las secciones con el argumento slope_sections. Debe haber una entrada más en slope_sections en comparación con las entradas en pendientes. El primer y último valor en slope_sections deben coincidir con la parte superior e inferior del glaciar.

# A bed with multiple slopes
bed_with_multiple_slopes = GlacierBed(top=3400, bottom=1500, width=300,
                                      slopes=[25, 10],
                                      # Slope sections are defined by altitude
                                      # pairs. Here we have two parirs.
                                      slope_sections=[3400, 2200, 1500])
bed_with_multiple_slopes.plot()
../_images/edu_intro_es_14_0.png

Balance de masa

Para que el glaciar crezca necesita un modelo de balance de masa. El balance de masa es responsable de agregar nieve y eliminar hielo a través del deshielo en el glaciar. En nuestro caso será un balance de masa lineal simple, lo que significa que decrece linealmente con la altitud. El balance de masa se define por la altitud de la línea de equilibrio (ELA) y el gradiente de altitud (en mm yr\(^{-1}\) m\(^{-1}\)). El ELA define a qué altitud el balance de masa es cero y el gradiente de altitud cuánto cambia el balance de masa con la altitud. ¡Más sobre esto en los próximos cuadernos! Establecimos el ELA de nuestro glaciar en 3000 metros y el gradiente de altitud en 4 mm yr\(^{-1}\) m\(^{-1}\).

mass_balance = MassBalance(ela=3000, gradient=4)
mass_balance
MassBalance
ELA [m] 3000
Original ELA [m] 3000
Temperature bias [C] 0
Gradient [mm/m/yr] [4]
Hemisphere nh
Ice density [kg/m3] 900.0

Inicialización del glaciar

Ahora podemos tomar nuestro lecho y el balance de masa y crear un glaciar en el que luego podemos realizar experimentos.

# Initialise the glacier
glacier = Glacier(bed=bed, mass_balance=mass_balance)

De manera similar a la cama, podemos obtener algunas estadísticas sobre el glaciar simplemente llamándolo. Sin embargo, dado que acabamos de crear el glaciar, todo será cero.

# Some statistics about the glacier
glacier
Attribute
Type Glacier
Age 0
Length [m] 0.0
Area [km2] 0.0
Volume [km3] 0.0
Max ice thickness [m] 0.0
Response time [yrs] NaN

Progresando el glaciar

Ahora el glaciar tiene todos los ingredientes necesarios para evolucionar.

Primero avancemos el glaciar al año 1.

# We want to progress the glacier to year 1.
glacier.progress_to_year(1)

Y echemos un vistazo al glaciar. Al igual que la cama, tiene un método interno para esto.

glacier.plot()
../_images/edu_intro_es_26_0.png

Aquí podemos ver que hay una fina capa de hielo desde la parte superior y 4 km hacia abajo del lecho del glaciar. Entonces, el glaciar casi llega al punto donde el lecho se cruza con el ELA (~4 km). También podemos volver a echar un vistazo a algunas de las estadísticas del glaciar para obtener más detalles:

glacier
Attribute
Type Glacier
Age 1
Length [m] 4300.0
Area [km2] 1.29
Volume [km3] 0.00115
Max ice thickness [m] 1.782245
Response time [yrs] NaN

De las estadísticas podemos leer que el glaciar tiene una longitud de 4 km y cubre un área de 1,2 km\(^2\). El glaciar crecerá considerablemente en los próximos años, y el espesor del hielo debería ser evidente incluso en el gráfico de altitud - distancia. Avancemos el glaciar hasta el año 150 y echemos un vistazo.

glacier.progress_to_year(150)
glacier.plot()
../_images/edu_intro_es_31_0.png

Ahora podemos ver claramente la diferencia entre la superficie del glaciar y el lecho rocoso. Imprimamos las mismas estadísticas sobre el glaciar que antes:

glacier
Attribute
Type Glacier
Age 150
Length [m] 5000.0
Area [km2] 1.5
Volume [km3] 0.244402
Max ice thickness [m] 185.406523
Response time [yrs] NaN

La longitud y el área del glaciar han aumentado en ~20 %, mientras que el volumen ha aumentado en más del 1000 %. Esto se debe a que el glaciar tiene que acumular suficiente masa (es decir, espesor de hielo) antes de que pueda comenzar a fluir cuesta abajo y aumentar su longitud. Tenga en cuenta que el glaciar tiene ahora 150 años. Si tratamos de hacer progresar el glaciar al mismo año nuevamente, no pasará nada. Incluso nos da una advertencia.

glacier.progress_to_year(150)
/usr/local/pyenv/versions/3.10.4/lib/python3.10/site-packages/oggm_edu/glacier.py:384: UserWarning: Year has to be above the current age of the glacier. It is not possible to de-age the glacier. Geometry will remain.
  warnings.warn(

Podemos progresar fácilmente en el glaciar aún más:

glacier.progress_to_year(500)
glacier.plot()
../_images/edu_intro_es_38_0.png
glacier
Attribute
Type Glacier
Age 500
Length [m] 12300.0
Area [km2] 3.69
Volume [km3] 0.696737
Max ice thickness [m] 211.056804
Response time [yrs] NaN

Los glaciares ahora han crecido considerablemente más abajo de nuestra montaña inventada, muy por debajo del ELA. Es importante señalar que el modelo no puede retroceder en el tiempo. Una vez en el año 500, no podemos eliminar la edad del glaciar.

glacier.progress_to_year(450)
/usr/local/pyenv/versions/3.10.4/lib/python3.10/site-packages/oggm_edu/glacier.py:384: UserWarning: Year has to be above the current age of the glacier. It is not possible to de-age the glacier. Geometry will remain.
  warnings.warn(

¡Hagamos lo mismo con uno de los glaciares con perfil de lecho no lineal!

# We create a new mass balance for this glacier.
mass_balance_2 = MassBalance(ela=2500, gradient=4)
# Initialise the glacier
glacier_multiple_slopes = Glacier(bed=bed_with_multiple_slopes,
                                  mass_balance=mass_balance_2)
# Progress the glacier
glacier_multiple_slopes.progress_to_year(400)
# And plot the glacier
glacier_multiple_slopes.plot()
../_images/edu_intro_es_44_0.png

Historia de los glaciares

Esto nos lleva a la historia de los glaciares. Esto es exactamente lo que parece, una historia de la longitud, el volumen y el área del glaciar. Podemos acceder a los datos a través del atributo .history

glacier.history
<xarray.Dataset>
Dimensions:           (time: 501)
Coordinates:
  * time              (time) float64 0.0 1.0 2.0 3.0 ... 497.0 498.0 499.0 500.0
    hydro_year        (time) int64 0 1 2 3 4 5 6 ... 494 495 496 497 498 499 500
    hydro_month       (time) int64 1 1 1 1 1 1 1 1 1 1 1 ... 1 1 1 1 1 1 1 1 1 1
    calendar_year     (time) int64 -1 0 1 2 3 4 5 ... 494 495 496 497 498 499
    calendar_month    (time) int64 10 10 10 10 10 10 10 ... 10 10 10 10 10 10 10
Data variables:
    volume_m3         (time) float64 0.0 1.15e+06 ... 6.966e+08 6.967e+08
    volume_bsl_m3     (time) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0
    volume_bwl_m3     (time) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0
    area_m2           (time) float64 0.0 1.29e+06 1.29e+06 ... 3.69e+06 3.69e+06
    length_m          (time) float64 0.0 4.3e+03 4.3e+03 ... 1.23e+04 1.23e+04
    calving_m3        (time) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0
    calving_rate_myr  (time) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0
Attributes: (12/13)
    description:          OGGM model output
    oggm_version:         1.5.4.dev10+g1fca0cb
    calendar:             365-day no leap
    creation_date:        2022-05-31 14:23:28
    water_level:          0
    glen_a:               2.4e-24
    ...                   ...
    mb_model_class:       MassBalance
    mb_model_hemisphere:  nh
    mb_model_rho:         900.0
    mb_model_orig_ela_h:  3000
    mb_model_ela_h:       3000
    mb_model_grad:        4

Y podemos visualizar rápidamente la historia del glaciar con el método .plot_history()

glacier.plot_history()
../_images/edu_intro_es_48_0.png

La longitud y el área del glaciar tiene un paso en el primer año. Esto tiene que ver con la forma en que OGGM trata internamente con la nieve y el hielo, no diferencia entre ellos. Y dado que el balance de masa siempre es positivo por encima del ELA, cualquier nevada en el primer año por encima del ELA permanecerá y se clasificará como parte del glaciar y contribuirá a la longitud y el área. Por eso, después del primer año, la longitud y el área del glaciar se mantienen constantes durante algunos años. En esta etapa inicial, el hielo es tan delgado que cualquier flujo que lleve hielo por debajo del ELA no será lo suficientemente grande para compensar la alta tasa de ablación, y el hielo se derrite. Cuando el espesor del hielo ha aumentado lo suficiente como para que el flujo de hielo supere la tasa de ablación por debajo de la ELA, la longitud del glaciar puede comenzar a aumentar.

Estado de equilibrio

Después de varios siglos, el glaciar alcanza un equilibrio con su clima. Esto significa que su longitud y volumen no cambiarán más, siempre y cuando todos los parámetros físicos y el clima se mantengan constantes. El Glaciar tiene un método que hace progresar el glaciar al equilibrio .progress_to_equilibrium(), más sobre esto en cuadernos posteriores.

Un primer experimento

Ahora hemos visto cómo configurar un glaciar simple y progresarlo a cualquier año. Ahora nos acercaremos un poco más a la realidad y definiremos un glaciar con anchos cambiantes. Como muchos glaciares reales, el nuevo glaciar será más ancho en la parte superior (en el área de acumulación) y tendrá un ancho constante por debajo del ELA. Podemos lograr esto creando una nueva Bed y en lugar de especificar las altitudes superior e inferior junto con el ancho, especificamos las altitudes y los anchos en pares:

wide_narrow_bed = GlacierBed(altitudes=[3400, 2800, 1500],
                             widths=[600, 300, 300])
wide_narrow_bed
GlacierBed
Bed type Linear bed with a variable width
Top [m] 3400
Bottom [m] 1500
Width(s) [m] [[600, 300, 300]]
Length [km] 20.0

Aquí el primer y último valor en altitudes y widths corresponden a la altura/ancho superior/inferior. Cualquier valor intermedio cambiará aún más la forma de la cama.

wide_narrow_bed.plot()
../_images/edu_intro_es_56_0.png

Usamos el nuevo lecho para crear un nuevo glaciar.

wide_narrow_glacier = Glacier(bed=wide_narrow_bed,
                              mass_balance=mass_balance)
wide_narrow_glacier
Attribute
Type Glacier
Age 0
Length [m] 0.0
Area [km2] 0.0
Volume [km3] 0.0
Max ice thickness [m] 0.0
Response time [yrs] NaN

Ahora podemos presentar la GlacierCollection. Esta es una utilidad que puede almacenar múltiples glaciares y usarse para comparar y ejecutar experimentos fácilmente en múltiples glaciares. La GlacierCollection se usará ampliamente en estos cuadernos y su funcionalidad se explicará con más detalle a medida que avancemos.

# We initialise a collection
collection = GlacierCollection()
# And then add the two glaciers available in this notebook.
collection.add([glacier, wide_narrow_glacier])

Podemos echar un vistazo rápido a la colección simplemente llamándola

collection
Type Age Length [m] Area [km2] Volume [km3] Max ice thickness [m] Response time [yrs] Bed type Top [m] Bottom [m] Width(s) [m] Length [km] ELA [m] Original ELA [m] Temperature bias [C] Gradient [mm/m/yr] Hemisphere Ice density [kg/m3]
Glacier
0 Glacier 500 12300.0 3.69 0.696737 211.056804 NaN Linear bed with a constant width 3400 1500 300 20.0 3000 3000 0 4 nh 900.0
1 Glacier 0 0.0 0.00 0.000000 0.000000 NaN Linear bed with a variable width 3400 1500 [600, 300, 300] 20.0 3000 3000 0 4 nh 900.0

Antes de trazar los glaciares en la colección, podemos avanzarlos al mismo año con el método .progress_to_year().

collection.progress_to_year(600)

Entonces podemos graficar la colección.

collection.plot()
../_images/edu_intro_es_67_0.png
El glaciar con un área de acumulación más amplia es más largo en comparación con el área del glaciar simple en el año 600. Con lo que has aprendido hasta ahora en este cuaderno, ¿puedes encontrar una explicación de por qué? Haga clic para obtener una pista Con un área de acumulación más amplia, la masa del glaciar por encima del ELA aumentará más rápidamente y el flujo de hielo por debajo del ELA será mayor en comparación con el glaciar con un área de acumulación más pequeña.
De manera similar al glaciar, la colección tiene un método para trazar fácilmente las historias de los glaciares retenidos.
collection.plot_history()
../_images/edu_intro_es_69_0.png

¿Que sigue?

xx_markdown_enlace_xx