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
ElGlacierBed
proporciona una manera fácil de definir el lecho del glaciar, mientras que elMassBalance
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()

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()

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()

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()

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()

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()

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()

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()

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()

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()

collection.plot_history()

¿Que sigue?¶
xx_markdown_enlace_xx