CMAQ

De Wikicima
(Diferencias entre revisiones)
Saltar a: navegación, buscar
(Instalación y corrección de errores de Hermes)
(Hermes)
 
(No se muestran 17 ediciones intermedias realizadas por un usuario)
Línea 780: Línea 780:
   
 
Todos los pasos se explican con más detalle [[CMAQ/pruebaAMBA]]
 
Todos los pasos se explican con más detalle [[CMAQ/pruebaAMBA]]
 
= Hermes =
 
 
Si uno no tiene un inventario para el dominio de interés (Por ejemplo, en caso de querer usar condiciones de borde dinámicas y necesitar correr un dominio más grande), una opción es usar Hermes [[https://earth.bsc.es/gitlab/es/hermesv3_gr/-/wikis/home]]. Todo lo que sigue es para Hermesv3 2.1.3.
 
 
 
== Instalación ==
 
 
=== Paquetes de Python ===
 
 
Hermes necesita muchos paquetes de python para correr por lo que conviene instalarlo de forma local en vez de en el servidor. Mas aún, conviene crear un environment para no tener problema con las distintas versiones de las librerías. Una forma práctica de hacerlo es tener un txt con todos los paquetes necesarios así se instalan todos juntos. El txt está en el git [[https://git.cima.fcen.uba.ar/solange.luque/hermes/-/tree/main/Instalacion]].
 
 
<pre style="shell">
 
 
virtualenv hermes
 
 
source hermes/bin/activate
 
 
pip install -r paquetes.txt
 
</pre>
 
 
NOTA: Cuidado con instalar un pandas con versión igual a mayor a 2.0 porque el "append" para un dataframe no se usa más a partir de esa versión y sí se usa en los scripts. Si se instalara una versión superior habría que cambiar los scripts. La recomendación sería instalar una versión inferior y listo.
 
 
Si se instala un esmpy posterior a 8.4.0 hay que renombrar algunas funciones y como se importa el paquete. Abajo se describe. Si se puede, conviene instalar 7.1.0 que es lo mínimo que pide Hermes (Para instalar esmpy sin anaconda conviene instalar ESMF primero y después instalarlo desde ahí como explican acá [[https://earthsystemmodeling.org/esmpy_doc/release/latest/html/install.html]] en "Installing ESMPy from Source". Si es difícil porque la versión de ESMF que se instala directo no es la correcta, no importa, se renombra lo que se necesite y listo.
 
 
=== Otros programas ===
 
 
Además de los paquetes de python, hay otros programas que son necesarios para la utilización de hermes. Están descriptos acá [[https://earth.bsc.es/gitlab/es/hermesv3_gr/-/wikis/user_guide_how_to_install]]
 
 
====ESMF====
 
 
Este hay que buildearlo. De este programa depende esmpy. Es decir antes de instalar esmpy hay que instalar esto. Es muy importante que se buildee con NETCDF y PIO sino algunas funciones de esmpy que necesitamos no van a funcionar.
 
 
Hay que descargarlo de acá [[https://github.com/esmf-org/esmf]].
 
 
Lo vamos a guardar en <code>/home/sol/hermesv3_gr/Libraries/esmf </code>.
 
 
<pre style = "shell">
 
cd /home/sol/hermesv3_gr/Libraries/esmf/
 
cd esmf-8.5.0
 
</pre>
 
 
Hay que declarar varios paths que están descriptos acá [[http://earthsystemmodeling.org/docs/nightly/develop/ESMF_usrdoc/node10.html]].
 
 
<pre style = "shell">
 
export ESMF_DIR=/home/sol/hermesv3_gr/Libraries/esmf/esmf-8.5.0
 
export ESMF_NETCDF=nc-config
 
export ESMF_COMM=mpich
 
make all
 
make install
 
make installcheck
 
</pre>
 
 
 
NOTA: Si la versión que uno tiene de cmake es inferior a 3.20 hay una función que llama esto que es <code>TestBigEndian.csh</code>. Esta función a mi no me funcionaba y me tiraba error con cualquier compilador (Solo corría con mpiuni que no permite usar PIO). Si eso sucede, no encontré otra solución más que upgradear cmake.
 
 
NOTA2: Antes de instalar esmpy no está mal chequear que todo este bien.
 
 
<pre style = "shell">
 
make run_examples
 
</pre>
 
 
y
 
 
<pre style = "shell">
 
make run_unit_tests
 
</pre>
 
 
Si esto está bien, ahora hay que instalar esmpy.
 
 
<pre style = "shell">
 
cd src
 
cd addon
 
cd esmpy
 
python3 -m pip install .
 
</pre>
 
 
Listo.
 
 
=== Instalación y corrección de errores de Hermes ===
 
 
<pre style="shell">
 
git clone https://earth.bsc.es/gitlab/es/hermesv3_gr.git
 
cd hermesv3_gr
 
python3 setup.py install
 
</pre>
 
 
Si alguna dependencia está mal con las librerías anteriores, en este proceso se va a quejar.
 
 
A partir de la versión 8.4.0 de esmpy se deja de importar como "import ESMF" y se pasa a importar como "import esmpy". Hay que cambiar esto en los códigos. Además hay que cambiar el nombre de las funciones.
 
 
<pre style="shell">
 
/home/sol/hermes/lib/python3.8/site-packages/hermesv3_gr-2.1.3-py3.8.egg/hermesv3_gr/modules/regrid/regrid_conservative.py
 
/home/sol/hermes/lib/python3.8/site-packages/hermesv3_gr-2.1.3-py3.8.egg/hermesv3_gr/modules/grids/grid.py
 
</pre>
 
 
Cada vez que aparezca algo como <code>ESMF.Field</code> o <code>ESMF.Regrid</code> o <code>ESMF.StaggerLoc</code> hay que cambiar el <code>ESMF</code> por <code>esmpy</code>.
 
 
 
También hay que definir bien el path al make file de ESMF. Modificamos el fichero:
 
 
<pre style="shell">
 
/home/sol/hermes/lib/python3.8/site-packages/esmpy/interface/loadESMF.py
 
</pre>
 
 
Hay que cambiar
 
 
<pre style="shell">
 
esmfmk = os.environ["ESMFMKFILE"]
 
</pre>
 
 
Por el path del makefile. En mi caso:
 
 
<pre style="shell">
 
esmfmk = "/home/sol/hermesv3_gr/Libraries/esmf/esmf-8.5.0/lib/libO/Linux.gfortran.64.mpich.default/esmf.mk"
 
</pre>
 
 
== Preparación de inventarios ==
 
 
Lo siguiente que hay que hacer es copiar las entradas de muestra:
 
 
<pre style="shell">
 
hermesv3_gr_copy_config_files '/home/sol/HERMES/HERMES_IN'
 
</pre>
 
 
Acá van a estar todos los ficheros para hacer las especiaciones y para pasar los inventarios anuales a mensuales, diarios y horarios.
 
 
Los inventarios (por ejemplo, el de EDGAR) tienen que ser adaptados para funcionar con Hermes. Para eso se necesitan unos scripts que se consiguen con:
 
 
<pre style="shell">
 
hermesv3_gr_copy_preproc_files '/home/sol/HERMES/preproc'
 
</pre>
 
 
 
Hay varias opciones de inventarios con sus scripts correspondientes para ser adaptados. Los inventarios disponibles están acá [[https://earth.bsc.es/gitlab/es/hermesv3_gr/-/wikis/user_guide_emission_inventories]].
 
 
=== EDGARv432_AP y EDGARv432_VOC ===
 
 
Estos inventarios los podemos usar y acá abajo se describe como descargarlos y prepararlos. El problema es que en los ficheros de muestra de Hermes no están sus especiaciones con los sectores de estos inventarios. Si uno quisiera, se podría hacer la especiación pero requiere saber como es para cada sector y especie.
 
 
==== VOCs ====
 
 
Vamos a empezar con el de EDGAR. Lo primero que tenemos que hacer es descargar los inventarios. Esto se hace con el script <code>download_voc_edgar.py</code> que está en GIT [[https://git.cima.fcen.uba.ar/solange.luque/hermes/-/tree/main/Edgar]]. Este script guarda todo en el disco externo en una carpeta <code>edgardv432_voc/original_files</code> porque es pesado. El script está hecho para descargar los datos anuales para el 2012, pero se puede cambiar el año.
 
 
<pre style = "shell">
 
python3 download_voc_edgar.py
 
</pre>
 
 
Una vez los inventarios descargados, usamos <code>/home/sol/HERMES/preproc/edgarv432_voc_preproc.py</code> para procesar los inventarios y tengan el formato necesario para Hermes. Tenemos que cambiar los paths:
 
 
<pre style="shell">
 
INPUT_PATH = '/media/sol/External/edgarv432_voc/original_files/'
 
OUTPUT_PATH = '/media/sol/External/Inventarios_Edgar/edgarv432_voc/'
 
LIST_POLLUTANTS = ['voc1', 'voc2', 'voc3', 'voc4', 'voc5', 'voc6', 'voc7', 'voc8', 'voc9', 'voc10', 'voc11', 'voc12',
 
'voc13', 'voc14', 'voc15', 'voc16', 'voc17', 'voc18', 'voc19', 'voc20', 'voc21', 'voc22', 'voc23',
 
'voc24', 'voc25']
 
# list_years = [1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986,
 
# 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
 
# 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012]
 
LIST_YEARS = [2012]
 
 
# To do yearly emissions
 
PROCESS_YEARLY = True
 
YEARLY_INPUT_NAME = 'yearly/v432_VOC_spec_<pollutant>_<year>_<ipcc>.0.1x0.1.nc'
 
 
# To process monthly emissions, 2010 directly from monthly_input_name and other years calculated using monthly gridded factors derived from the 2010 monthly data
 
PROCESS_MONTHLY = False
 
MONTHLY_INPUT_NAME = 'monthly/v432_VOC_spec_<pollutant>_2010_<month>_<ipcc>.0.1x0.1.nc'
 
MONTHLY_PATTERN_FILE = 'temporal_profiles/v432_FM_<sector>.0.1x0.1.nc'
 
</pre>
 
 
Además, hay un error de tipeo en la línea 189. Hay que cambiar
 
 
<pre style="shell">
 
nc_var.coordinates = data_atts['coordiantes']
 
</pre>
 
 
por
 
 
<pre style="shell">
 
nc_var.coordinates = data_atts['coordinates']
 
</pre>
 
 
Ahora sí. Se corre
 
 
<pre style="shell">
 
python3 edgarv432_voc_preproc.py
 
</pre>
 
 
Esto tarda en correr, pero genera en el disco externo la carpeta <code>edgarv432_voc/yearly_mean</code> con todos los ficheros en el formato adecuado para Hermes.
 
 
==== Gases y Aerosoles ====
 
 
Ahora vamos a hacer los mismo, pero para descargar y preparar el inventario de gases y aerosoles que tienen ["BC","CO","NH3","NMVOC","NOx","OC","PM10","PM2.5","SO2"]. Para eso, vamos a usar el script <code>download_ap_edgar.py</code> que está en GIT [[https://git.cima.fcen.uba.ar/solange.luque/hermes/-/tree/main/Edgar]]. Nuevamente, esto descarga todo en el disco externo en la carpeta <code>edgardv61_ap/original_files</code>. Está hecho para el año 2012, pero se puede cambiar.
 
 
<pre style="shell">
 
python3 download_ap_edgar.py
 
</pre>
 
 
Ahora vamos a tener que procesar los inventarios. Como el inventario de Edgar que está ahora en la página es v6.1 en vez de v432 vamos a tener que hacer otro script, en particular porque son otros los sectores que hay en estas versión. Nos copiamos el de la versión anterior y lo modificamos.
 
 
<pre style="shell">
 
cp edgarv432_ap_preproc.py edgarv61_ap_preproc.py
 
</pre>
 
 
Aparte de cambiarle los paths hay que cambiar algunas cosas más. En la versión 432 de Edgar el nombre de los ficheros tenía el código del sector en vez del nombre como ahora, así que hay que cambiar eso para que los pueda leer bien. Esto funciona ahora para los inventarios anuales (Para 2012 no hay mensuales). Si quisiéramos hacer mensuales, habría que arreglar la función <code>do_monthly_transformation</code> también (La parte donde pone in_pollutant = None si no es alguno de los PM2.5)
 
 
<pre style = "shell">
 
diff edgarv61_ap_preproc.py edgarv432_ap_preproc.py
 
37,39c37
 
< LIST_POLLUTANTS = ['BC', 'CO', 'NH3', 'NOx', 'OC', 'PM10', 'PM2.5', 'SO2', 'NMVOC']
 
<
 
< #LIST_POLLUTANTS = ['PM2.5_bio', 'PM2.5_fossil']
 
---
 
> LIST_POLLUTANTS = ['PM2.5_bio', 'PM2.5_fossil']
 
43c41
 
< LIST_YEARS = [2012]
 
---
 
> LIST_YEARS = [2010]
 
46,47c44,45
 
< PROCESS_YEARLY = True
 
< YEARLY_INPUT_NAME = 'yearly/EDGARv6.1_<pollutant>_<year>_<ipcc>.0.1x0.1.nc'
 
---
 
> PROCESS_YEARLY = False
 
> YEARLY_INPUT_NAME = 'yearly/v432_<pollutant>_<year>_<ipcc>.0.1x0.1.nc'
 
50c48
 
< PROCESS_MONTHLY = False
 
---
 
> PROCESS_MONTHLY = True
 
73,75c71
 
< "IPCC_1A3a_SPS": "TNR_Aviation_SPS",
 
< "IPCC_1A3b_noRES": "TRO_noRES",
 
< "IPCC_1A3b_RES": "TRO_RES",
 
---
 
> "IPCC_1A3b": "TRO",
 
83a80
 
> "IPCC_2D": "FOO_PAP",
 
86d82
 
< "IPCC_2D": "FOO_PAP",
 
87a84
 
> "IPCC_4C_4D1_4D2_4D4": "AGS",
 
89d85
 
< "IPCC_4C_4D": "AGS",
 
91d86
 
< "IPCC_6C": "SWD_INC",
 
92a88
 
> "IPCC_6C": "SWD_INC",
 
94d89
 
<
 
219c214
 
< nc_output.setncattr('title', 'EDGARv6.1_AP inventory for the sector {0} and pollutant {1}'.format(
 
---
 
> nc_output.setncattr('title', 'EDGARv4.3.2_AP inventory for the sector {0} and pollutant {1}'.format(
 
223c218
 
< nc_output.setncattr('source', 'EDGARv6.1_AP', )
 
---
 
> nc_output.setncattr('source', 'EDGARv4.3.2_AP', )
 
241c236
 
< for ipcc in zip(list(ipcc_to_sector_dict().keys()),list(ipcc_to_sector_dict().values())):
 
---
 
> for ipcc in list(ipcc_to_sector_dict().keys()):
 
245c240
 
< ipcc[1]))
 
---
 
> ipcc))
 
252,256c247,251
 
< #if pollutant in ['PM2.5_bio', 'PM2.5_fossil']:
 
< #in_pollutant = pollutant
 
< #pollutant = 'PM2.5'
 
< #else:
 
< #in_pollutant = None
 
---
 
> if pollutant in ['PM2.5_bio', 'PM2.5_fossil']:
 
> in_pollutant = pollutant
 
> pollutant = 'PM2.5'
 
> else:
 
> in_pollutant = None
 
267c262
 
< sector = ipcc_to_sector_dict()[ipcc[0]]
 
---
 
> sector = ipcc_to_sector_dict()[ipcc]
 
269c264
 
< pollutant = pollutant.replace('.', '')
 
---
 
> pollutant = in_pollutant.replace('.', '')
 
286c281
 
< pollutant, ipcc[1], file_path))
 
---
 
> pollutant, ipcc, file_path))
 
</pre>
 
 
 
Esto tarda en correr, pero genera en el disco externo la carpeta edgarv61_ap/yearly_mean con todos los ficheros en el formato adecuado para Hermes.
 
 
NOTA: Está para descargar ficheros anuales porque para el 2012 no hay mensuales. Para el 2010 sí hay.
 
 
=== HTAPv2 ===
 
 
La ventaja de este inventario es que su especiación está en el fichero de muestra que viene con Hermes. En la v2 hay datos 2008-2010. En la v3 hay 2000-2018 por lo que quizás convendría usar ese para el 2012, pero el problema es que tiene otros sectores para los cuáles no tenemos la especiación. Conviene seguir con la v2.
 
 
La desventaja es que se necesita un fichero con los ratios para especiar los VOCS que estaba en una WIKI que ya no existe más. Se necesitan dos tipos de archivos que amablemente me proporcionaron y están acá [[https://git.cima.fcen.uba.ar/solange.luque/hermes/-/tree/main/Edgar/HTAPv2_NMVOC_INDUSTRY]] y acá [[https://git.cima.fcen.uba.ar/solange.luque/hermes/-/tree/main/Edgar/ratio_VOC_HTAP]].
 
 
Además de estos archivos, me compartieron un link con todos los archivos relacionados que estaban en en la WIKI acá [[https://fz-juelich.sciebo.de/s/3QdlJybGOY46qQI]]. Está en el GIT también por las dudas de que el link desaparezca [[https://git.cima.fcen.uba.ar/solange.luque/hermes/-/tree/main/Edgar/WP1.1.zip]]
 
 
 
Para descargar el inventario hay un script en git [[https://git.cima.fcen.uba.ar/solange.luque/hermes/-/tree/main/Edgar]].
 
 
<pre style = "shell">
 
python3 download_HTAP_edgar.py
 
</pre>
 
 
Esto descarga todo en el disco externo porque es pesado. Está todo en la carpeta <code>Inventarios_Edgar/HTAPv2/original_files</code>.
 
 
Una vez descargado, los descomprimo:
 
 
<pre style = "shell">
 
cd /media/sol/External/Inventarios_Edgar/HTAPv2/original_files
 
unzip '*.zip'
 
</pre>
 
 
Ahora vamos a usar el script <code>/home/sol/HERMES/preproc/htapv2_preproc.py</code> para procesarlo.
 
 
<pre style = "shell">
 
/home/sol/HERMES/preproc/
 
</pre>
 
 
 
Hay que cambiar la parte de los paths.
 
 
<pre style = "shell">
 
# ============== CONFIGURATION PARAMETERS ======================
 
INPUT_PATH = '/media/sol/External/Inventarios_Edgar/HTAPv2/original_files'
 
OUTPUT_PATH = '/media/sol/External/Inventarios_Edgar/HTAPv2/htapv2'
 
 
INPUT_NAME = 'edgar_HTAP_<pollutant>_emi_<sector>_<year>_<month>.0.1x0.1.nc'
 
INPUT_NAME_AIR = 'edgar_HTAP_emi_<pollutant>_<sector>_<year>.0.1x0.1.nc'
 
INPUT_NAME_SHIPS = 'edgar_HTAP_<pollutant>_emi_SHIPS_<year>.0.1x0.1.nc'
 
# HTAP auxiliary NMVOC emission data for the industry sub-sectors
 
# (http://iek8wikis.iek.fz-juelich.de/HTAPWiki/WP1.1?highlight=%28%28WP1.1%29%29)
 
INPUT_NAME_NMVOC_INDUSTRY = '/media/sol/External/Inventarios_Edgar/HTAPv2/original_files/HTAPv2_NMVOC_INDUSTRY/HTAPv2_NMVOC_<sector>_<year>_<month>.0.1x0.1.nc'
 
 
# list_years = [2008, 2010]
 
LIST_YEARS = [2010]
 
 
# RETRO ratios applied to HTAPv2 NMVOC emissions
 
# (http://iek8wikis.iek.fz-juelich.de/HTAPWiki/WP1.1?highlight=%28%28WP1.1%29%29)
 
VOC_RATIO_PATH = '/media/sol/External/Inventarios_Edgar/HTAPv2/original_files/retro_nmvoc_ratio_2000_01x01'
 
VOC_RATIO_NAME = 'retro_nmvoc_ratio_<voc>_2000_0.1deg.nc'
 
 
 
VOC_RATIO_AIR_NAME = 'VOC_split_AIR.csv'
 
VOC_RATIO_SHIPS_NAME = 'VOC_split_SHIP.csv'
 
</pre>
 
 
Notar que VOC_RATIO_PATH y INPUT_NAME_NMVOC_INDUSTRY son los paths de los ficheros que hay que tener aparte. También hay que correr los ficheros "VOC_SPLIT_AIR.csv" y "VOC_SPLIT_SHIP.csv" a la carpeta de los ratios.
 
 
Y ahora lo corremos.
 
 
NOTA: Si hay poco espacio en el disco, va a haber que liberar algo. Por más que guarde la salida en el disco externo, mientras procesa va ocupando tamaño del disco y si no le alcanza se va a parar. Necesita por lo menos 20 gb.
 
 
<pre style = "shell">
 
python3 htapv2_preproc.py
 
</pre>
 
 
Esto tarda en correr, pero finalmente genera los archivos <code>htapv2/monthly_mean</code> y <code>htapv2/yearly_mean</code> con todos los ficheros procesados.
 
 
== Configuración ==
 
 
==== Fichero configuración de WRF ====
 
 
Primero tenemos que modificar el fichero con los datos del dominio y la configuración de WRF: <code>HERMES/HERMES_IN/data/global_attributes.csv</code>
 
 
<pre style="shell">
 
cp global_attributes.csv global_attributes.csv.old
 
</pre>
 
 
Los datos que piden los sacamos de algún fichero de salida de WRF del dominio correspondiente. Por ejemplo, para el dominio intermedio de mi simulación (de 3km) de la configuración p8u1 quedaría:
 
 
<pre style ="shell">
 
attribute,value
 
BOTTOM-TOP_GRID_DIMENSION,80
 
GRIDTYPE,C
 
DIFF_OPT,1
 
KM_OPT,4
 
DAMP_OPT,3
 
DAMPCOEF,0.2
 
KHDIF,0
 
KVDIF,0
 
MP_PHYSICS,8
 
RA_LW_PHYSICS,4
 
RA_SW_PHYSICS,4
 
SF_SFCLAY_PHYSICS,1
 
SF_SURFACE_PHYSICS,2
 
BL_PBL_PHYSICS,8
 
CU_PHYSICS,0
 
SF_LAKE_PHYSICS,0
 
SURFACE_INPUT_SOURCE,3
 
SST_UPDATE,0
 
GRID_FDDA,0
 
GFDDA_INTERVAL_M,0
 
GFDDA_END_H,0
 
GRID_SFDDA,0
 
SGFDDA_INTERVAL_M,0
 
SGFDDA_END_H,0
 
BOTTOM-TOP_PATCH_START_UNSTAG,1
 
BOTTOM-TOP_PATCH_END_UNSTAG,79
 
BOTTOM-TOP_PATCH_START_STAG,1
 
BOTTOM-TOP_PATCH_END_STAG,80
 
GRID_ID,2
 
PARENT_ID,1
 
I_PARENT_START,43
 
J_PARENT_START,42
 
PARENT_GRID_RATIO,5
 
DT,12
 
MMINLU,MODIFIED_IGBP_MODIS_NOAH
 
NUM_LAND_CAT,20
 
ISWATER,17
 
ISLAKE,-1
 
ISICE,15
 
ISURBAN,13
 
ISOILWATER,14
 
CEN_LAT,-34.46497
 
CEN_LON,-58.56366
 
</pre>
 
 
 
==== Fichero de niveles verticales ====
 
 
Tenemos que darle un fichero que diga hasta que altura va cada nivel vertical. Para eso vamos a usar el script <code>vertical_layers_conf.py</code> que está en GIT [[https://git.cima.fcen.uba.ar/solange.luque/hermes/-/tree/main/Edgar]]. Para correr este script necesitamos algún fichero de salida de WRF o el output <code>METCRO3D.nc</code> que es salida de MCIP. OJO, NO DAN EXACTAMENTE IGUAL. OJO, EN LA SALIDA DE REAL EN LOS RSL.OUT ESTÁ LA ALTURA DE CADA NIVEL, CAPAZ CONVIENE USAR ESO DIRECTAMENTE.
 
 
<pre style = "shell">
 
python3 vertical_layers_conf.py wrf_out_file WRF
 
</pre>
 
 
o
 
 
<pre style = "shell">
 
python3 vertical_layers_conf.py METCROD3D_file CMAQ
 
</pre>
 
 
 
Esto va a generar un csv de la pinta <code>CMAQ_*numero de layers*layers_vertical_description.csv</code>
 
 
Lo copiamos en la carpeta que corresponde.
 
 
<pre style = "shell">
 
cp CMAQ_79layers_vertical_description.csv /home/sol/HERMES/HERMES_IN/data/profiles/vertical/CMAQ_79layers_vertical_description.csv
 
</pre>
 
 
==== Ficheros de perfiles mensuales, semanales, diarios y horarios ====
 
 
Para esto vamos a usar los que ya están por default. Ojo que quizás hay que cambiar el ID de las emisiones.
 
 
Están en
 
 
<pre style = "shell">
 
/home/sol/HERMES/HERMES_IN/data/profiles/temporal/TemporalProfile_Daily.csv
 
/home/sol/HERMES/HERMES_IN/data/profiles/temporal/TemporalProfile_Hourly.csv
 
/home/sol/HERMES/HERMES_IN/data/profiles/temporal/TemporalProfile_Monthly.csv
 
/home/sol/HERMES/HERMES_IN/data/profiles/temporal/TemporalProfile_Weekly.csv
 
/home/sol/HERMES/HERMES_IN/data/profiles/temporal/tz_world_country_iso3166.csv
 
</pre>
 
 
El último es un fichero con todos los husos horarios del mundo.
 
 
==== Fichero de configuración de inventarios ====
 
 
Nos copiamos el original
 
 
<pre style = "shell">
 
cd /home/sol/HERMES/HERMES_IN/conf/
 
cp /home/sol/HERMES/HERMES_IN/conf/EI_configuration.csv EI_configuration.csv.old
 
</pre>
 
 
La idea de este fichero es decirle que inventarios vamos a usar y para cada especie que perfil de especiación (Para hacer la especiación mensual, la semanal, la diaria, la horaria y la de especies en sí). Cada perfil está asociado a un código que debe coincidir con los códigos de los ficheros de especiaciones. Las columnas están separadas por ";".
 
 
Borré los inventarios que no me importan para no meter ruido y me quedé solo con el de HTAPv2.
 
 
En la columna "ref_year" va el año del cuál son los inventarios. En la columna "active" va a un 1 si se está usando ese inventario con ese sector y 0 sino. Si la frecuencia es anual, si o si hay que tener perfiles para p_month, p_week y p_hour.
 
 
Como el inventario HTAPv2 ya tiene los perfiles asignados no toco nada. Pero si no lo tuviera, hay que elegirlos.
 
 
También hay que cambiar los paths donde están los inventarios.
 
 
El fichero modificado está en el git [[https://git.cima.fcen.uba.ar/solange.luque/hermes/-/tree/main/Configuration]].
 
 
=== Fichero de especiación ===
 
 
Acá tenemos que crear el fichero de especiación para cb6 aero7 que es el mecanismo que vamos a usar. El fichero que viene por default para Hermes son los de cb5 aero5 y cb5 aero6.
 
 
Acá está la tabla con todas las especies [[https://github.com/USEPA/CMAQ/blob/main/CCTM/src/MECHS/mechanism_information/cb6r3_ae7_aq/cb6r3_ae7_aq_species_table.md]]
 
 
Nos copiamos alguno de los que ya están y lo vamos a modificar.
 
 
<pre style = "shell">
 
cd /home/sol/HERMES/HERMES_IN/data/profiles/speciation
 
cp Speciation_profile_cb05_aero6_CMAQ.csv Speciation_profile_cb06_aero7_CMAQ.csv
 
</pre>
 
 
Los códigos de especiación para HAPTV2 son E002-E009. Esa especiación ya está hecha. Solo queda cambiar los nombres de las especies de CMAQ del mecanismo viejo al nuevo.
 
 
El fichero modificado está acá [[https://git.cima.fcen.uba.ar/solange.luque/hermes/-/tree/main/Configuration]]
 
 
=== Shapefile con bordes de países ===
 
 
Se necesita descargar de [[https://gadm.org/old_versions.html]] el shapefile de la Version 3.6 (Las nuevas no lo tienen en shapefile y no sé si Hermes va a entender otro formato).
 
 
<pre style = "shell">
 
cd /home/sol/HERMES/HERMES_IN/data/
 
mkdir gadm_country_mask
 
cd gadm_country_mask
 
cp /home/sol/Downloads/gadm36_shp/gadm36.shp .
 
</pre>
 
 
=== Fichero pesos moleculares ===
 
 
Usamos el que ya está. Si hay que usar una especie que no esté en la lista hay que agregarla. Está acá:
 
 
<pre style = "shell">
 
/home/sol/HERMES/HERMES_IN/data/profiles/speciation/MolecularWeights.csv
 
</pre>
 
 
== Ejecución ==
 
Para correr Hermes, hay que modificar el fichero de configuración <code>HERMES/HERMES_IN/conf/hermes.conf</code>
 
 
<pre style="shell">
 
cp hermes.conf hermes.conf.old
 
</pre>
 
 
Modificamos todos los paths.
 
 
<pre style = "shell">
 
 
input_dir = /home/sol/HERMES/HERMES_IN
 
data_path = /media/sol/External/Inventarios_Edgar
 
output_dir = /home/sol/HERMES/HERMES_OUT
 
 
vertical_description = <input_dir>/data/profiles/vertical/CMAQ_79layers_vertical_description.csv
 
 
cross_table = <input_dir>/conf/EI_configuration.csv
 
 
p_vertical = <input_dir>/data/profiles/vertical/Vertical_profile.csv
 
p_month = <input_dir>/data/profiles/temporal/TemporalProfile_Monthly.csv
 
p_week = <input_dir>/data/profiles/temporal/TemporalProfile_Weekly.csv
 
p_day = <input_dir>/data/profiles/temporal/TemporalProfile_Daily.csv
 
p_hour = <input_dir>/data/profiles/temporal/TemporalProfile_Hourly.csv
 
p_speciation = <input_dir>/data/profiles/speciation/Speciation_profile_cb06_aero7_Benchmark.csv
 
 
molecular_weights = <input_dir>/data/profiles/speciation/MolecularWeights.csv
 
world_info = <input_dir>/data/profiles/temporal/tz_world_country_iso3166.csv
 
countries_shapefile = <input_dir>/data/gadm_country_mask/gadm36.shp
 
</pre>
 
 
Tener en cuenta que <code>data_path</code> es el path donde están todos los inventarios descargados y preparados. El path por sector se le da recién en el archivo de configuración de emisiones.
 
 
Hay que poner datos sobre el dominio que corresponden a los datos del GRIDDESC generado por MCIP. Conviene entonces correr primero MCIP para el dominio de interés y después leer los datos desde ese fichero.
 
 
Para una proyección lcc, los datos que piden son estos:
 
 
<pre style = "shell">
 
if domain_type == lcc:
 
lat_1 =
 
lat_2 =
 
lon_0 =
 
lat_0 =
 
nx =
 
ny =
 
inc_x =
 
inc_y =
 
x_0 =
 
y_0 =
 
</pre>
 
 
La correspondencia con los datos de GRIDDESC es:
 
 
<pre style = "shell">
 
if domain_type == lcc:
 
lat_1 = P_ALP
 
lat_2 = P_BET
 
lon_0 = P_GAM
 
lat_0 = Y_CENT
 
nx = NCOLS
 
ny = NROWS
 
inc_x = XCELL
 
inc_y = YCELL
 
x_0 = XORIG
 
y_0 = YORIG
 
</pre>
 
 
Que en el griddesc están ordenados así:
 
 
<pre style = "shell">
 
GRIDDESC
 
' '
 
COORDNAME
 
COORDTYPE P_ALP P_BET P_GAM XCENT YCENT
 
 
' '
 
GRIDNAME
 
COORDNAME XORIG YORIG XCELL YCELL NCOLS NROWS NTHICK
 
' '
 
 
</pre>
 
 
Antes de correr tenemos que modificar unas cositas en el script <code>"/home/sol/hermes/lib/python3.8/site-packages/hermesv3_gr-2.1.3-py3.8.egg/hermesv3_gr/modules/emision_inventories/emission_inventory.py"</code>. En la línea 92 tenemos que poner que reference_year es un int.
 
 
<pre style = "shell">
 
self.reference_year = int(reference_year)
 
</pre>
 
 
 
Y ahora sí. Finalmente ejecutamos.
 
 
<pre style = "shell">
 
mpirun -np 8 hermesv3_gr --my-config '/home/sol/HERMES/HERMES_IN/conf/hermes.conf'
 
</pre>
 

Última revisión de 13:30 18 oct 2023

Instalando y usando CMAQ en hydra

Para inventarios y condiciones de borde e iniciales CMAQInvCbCi

Contenido

[editar] Instalando librerías

Instalación en /home/solange.luque/MODELOS/CMAQ/[comp].

Existe un foro: https://forum.cmascenter.org/t/ioapi-installtion-unable/805

[editar] ioapi

Agarrar librerías ioapi

Instalándolas en /home/solange.luque/libraries/

Instalación y uso de ioapi desde python con PseudoNetCDF /pyIOAPI

[editar] intel

mkdir -p ioapi/v3.2-20200828/intel
cd ioapi/v3.2-20200828/intel
tar xvfz ~/ioapi-3.2-20200828.tar.gz
mv ioapi-3.2-20200828/* ./
rmdir ioapi-3.2-20200828
export BIN=Linux2_x86_64ifort
mkdir Linux2_x86_64ifort
ln -s /opt/netcdf/netcdf-4/intel/2021.4.0/lib/*.so Linux2_x86_64ifort/
ln -s /opt/netcdf/netcdf-4/intel/2021.4.0/lib/libnetcdf.a Linux2_x86_64ifort/
ln -s /opt/netcdf/netcdf-4/intel/2021.4.0/lib/libnetcdff.a Linux2_x86_64ifort/
ln -s /opt/hdf5/hdf5-1.10.5/intel/2021.4.0/lib/libhdf5*a Linux2_x86_64ifort/
ln -s /opt/hdf5/hdf5-1.10.5/intel/2021.4.0/lib/libhdf5*so Linux2_x86_64ifort/
ln -s /opt/curl/curl-4.1.2/intel/2021.4.0/lib/libcurl.* ./
cp ioapi/Makefile.nocpl ioapi/Makefile
cp m3tools/Makefile.nocpl m3tools/Makefile
cp Makefile.template Makefile

Seguimos (https://forum.cmascenter.org/t/ioapi-error-in-m3too/2341)[CMAS forum `Ioapi error in m3too;`]

Editamos los Makefiles (Makefile y ioapi/Makeinclude.Linux2_x86_64ifort)

 diff Makefile Makefile.template 
138,145c138,145
<  BIN        = Linux2_x86_64ifort
<  BASEDIR    = ${PWD}
<  INSTALL    = /home/solange.luque/MODELOS/CMAQ/intel/LIBRARIES/ioapi
<  LIBINST    = $(INSTALL)/$(BIN)
<  BININST    = $(INSTALL)/$(BIN)
<  CPLMODE    = nocpl
<  IOAPIDEFS  = 
<  PVMINCL    =
---
> # BIN        = Linux2_x86_64
> # BASEDIR    = ${PWD}
> # INSTALL    = ${HOME}
> # LIBINST    = $(INSTALL)/$(BIN)
> # BININST    = $(INSTALL)/$(BIN)
> # CPLMODE    = nocpl
> # IOAPIDEFS  = 
> # PVMINCL    =

Instalamos librerías

/opt/load-libs.sh 1 
make configure >& run_configure.log
make all >& run_make.log

Si todo fue bien:

ls -l Linux2_x86_64ifort/ | grep rwx | grep -v lrwxrwxrwx | awk '{print $9}' | tr '\n' ' '
airs2m3 bcwndw camxtom3 datshift dayagg factor findwndw greg2jul gregdate gridprobe insertgrid 
jul2greg juldate juldiff julshift kfxtract latlon m3agmask m3agmax m3combo m3cple m3diff m3edhdr 
m3fake m3hdr m3interp m3mask m3merge m3pair m3probe m3stat m3totxt m3tproc m3tshift m3wndw 
m3xtract mpasdiff mpasstat mpastom3 mtxblend mtxbuild mtxcalc mtxcple presterp presz projtool 
randomstat selmrg2d timediff timeshift vertimeproc vertintegral vertot wndwdesc wrfgriddesc wrftom3

Instalando:

mkdir -p ~/MODELOS/CMAQ/intel/LIBRARIES/ioapi
make install >& run_install.log
ls ~/MODELOS/CMAQ/intel/LIBRARIES/ioapi/Linux2_x86_64ifort/
airs2m3   greg2jul    julshift    m3cple    m3merge   m3utilio.mod    modpdata.mod  mtxcalc     timediff      wrftom3
bcwndw    gregdate    kfxtract    m3diff    m3pair    m3wndw          modwrfio.mod  mtxcple     timeshift
camxtom3  gridprobe   latlon      m3edhdr   m3probe   m3xtract        mpasdiff      presterp    vertimeproc
datshift  insertgrid  libioapi.a  m3fake    m3stat    modatts3.mod    mpasstat      presz       vertintegral
dayagg    jul2greg    m3agmask    m3hdr     m3totxt   modgctp.mod     mpastom3      projtool    vertot
factor    juldate     m3agmax     m3interp  m3tproc   modmpasfio.mod  mtxblend      randomstat  wndwdesc
findwndw  juldiff     m3combo     m3mask    m3tshift  modncfio.mod    mtxbuild      selmrg2d    wrfgriddesc
cp ioapi/fixed_src/* Linux2_x86_64ifort/
cp ioapi/fixed_src/* ~/MODELOS/CMAQ/intel/LIBRARIES/ioapi/Linux2_x86_64ifort/

[editar] gnu

NOTA: Antes de empezar, quitar del .bashrc la carga por defecto del entorno intel

##Para compiladores INTEL
#source /opt/intel/oneapi/setvars.sh > /dev/null
#export PATH=/opt/mpich/mpich-3.4.2/intel/2021.4.0/bin:$PATH
#export LD_LIBRARY_PATH=/opt/jasper/jasper-version-2.0.33/intel/2021.4.0/lib:
  /opt/netcdf/netcdf-4/intel/2021.4.0/lib:$LD_LIBRARY_PATH
/opt/load-libs.sh 3
source /opt/env_scripts/load_gnu-10.2.1_mpich-3.4.2.sh
mkdir -p ioapi/v3.2-20200828/gnu
cd ioapi/v3.2-20200828/gnu
tar xvfz ~/ioapi-3.2-20200828.tar.gz
mv ioapi-3.2-20200828/* ./
rmdir ioapi-3.2-20200828
export BIN=Linux2_x86_64
mkdir Linux2_x86_64
ln -s /opt/netcdf/netcdf-4/gnu/10.2.1/lib/*.so Linux2_x86_64/
ln -s /opt/netcdf/netcdf-4/gnu/10.2.1/lib/libnetcdf.a Linux2_x86_64/
ln -s /opt/netcdf/netcdf-4/gnu/10.2.1/lib/libnetcdff.a Linux2_x86_64/
ln -s /opt/hdf5/hdf5-1.10.5/gnu/10.2.1/lib/libhdf5*a Linux2_x86_64/
ln -s /opt/hdf5/hdf5-1.10.5/gnu/10.2.1/lib/libhdf5*so Linux2_x86_64/
ln -s /usr/lib/x86_64-linux-gnu/*curl*a Linux2_x86_64/
ln -s /usr/lib/x86_64-linux-gnu/*curl*so Linux2_x86_64/
cp ioapi/Makefile.nocpl ioapi/Makefile
cp m3tools/Makefile.nocpl m3tools/Makefile
cp Makefile.template Makefile

Editamos los Makefiles (Makefile y ioapi/Makeinclude.Linux2_x86_64)

 diff Makefile Makefile.template 
138,145c138,145
<  BIN        = Linux2_x86_64
<  BASEDIR    = ${PWD}
<  INSTALL    = /home/solange.luque/MODELOS/CMAQ/gnu/LIBRARIES/ioapi
<  LIBINST    = $(INSTALL)/$(BIN)
<  BININST    = $(INSTALL)/$(BIN)
<  CPLMODE    = nocpl
<  IOAPIDEFS  = 
<  PVMINCL    =
---
> # BIN        = Linux2_x86_64
> # BASEDIR    = ${PWD}
> # INSTALL    = ${HOME}
> # LIBINST    = $(INSTALL)/$(BIN)
> # BININST    = $(INSTALL)/$(BIN)
> # CPLMODE    = nocpl
> # IOAPIDEFS  = 
> # PVMINCL    =

Instalamos librerías

make configure >& run_configure.log
make all >& run_make.log

Si no hay problemas

$ ls -l Linux2_x86_64/ | grep rwx | grep -v lrwxrwxrwx | awk '{print $9}' | tr '\n' ' ' 
airs2m3 bcwndw camxtom3 datshift dayagg factor findwndw greg2jul gregdate gridprobe insertgrid jul2greg juldate juldiff julshift kfxtract 
  latlon m3agmask m3agmax m3combo m3cple m3diff m3edhdr m3fake m3hdr m3interp m3mask m3merge m3pair m3probe m3stat m3totxt m3tproc m3tshift 
  m3wndw m3xtract mpasdiff mpasstat mpastom3 mtxblend mtxbuild mtxcalc mtxcple presterp presz projtool randomstat selmrg2d timediff timeshift 
  vertimeproc vertintegral vertot wndwdesc wrfgriddesc wrftom3

Instalando:

mkdir ~/MODELOS/CMAQ/gnu/LIBRARIES/ioapi
make install >& run_install.log
ls ~/MODELOS/CMAQ/gnu/LIBRARIES/ioapi/Linux2_x86_64/
airs2m3   greg2jul    julshift    m3cple    m3merge   m3utilio.mod    modpdata.mod  mtxcalc     timediff      wrftom3
bcwndw    gregdate    kfxtract    m3diff    m3pair    m3wndw          modwrfio.mod  mtxcple     timeshift
camxtom3  gridprobe   latlon      m3edhdr   m3probe   m3xtract        mpasdiff      presterp    vertimeproc
datshift  insertgrid  libioapi.a  m3fake    m3stat    modatts3.mod    mpasstat      presz       vertintegral
dayagg    jul2greg    m3agmask    m3hdr     m3totxt   modgctp.mod     mpastom3      projtool    vertot
factor    juldate     m3agmax     m3interp  m3tproc   modmpasfio.mod  mtxblend      randomstat  wndwdesc
findwndw  juldiff     m3combo     m3mask    m3tshift  modncfio.mod    mtxbuild      selmrg2d    wrfgriddesc
cp ioapi/fixed_src/* Linux2_x86_64/
cp ioapi/fixed_src/* /home/solange.luque/MODELOS/CMAQ/gnu/LIBRARIES/ioapi/Linux2_x86_64/

[editar] gnu - debug

NOTA: Antes de empezar, quitar del .bashrc la carga por defecto del entorno intel

##Para compiladores INTEL
#source /opt/intel/oneapi/setvars.sh > /dev/null
#export PATH=/opt/mpich/mpich-3.4.2/intel/2021.4.0/bin:$PATH
#export LD_LIBRARY_PATH=/opt/jasper/jasper-version-2.0.33/intel/2021.4.0/lib:
  /opt/netcdf/netcdf-4/intel/2021.4.0/lib:$LD_LIBRARY_PATH
mkdir -p ioapi/v3.2-20200828/gnu-dbg
cd ioapi/v3.2-20200828/gnu-dbg
tar xvfz /home/solange.luque/libraries/ioapi-3.2-20200828.tar.gz
mv ioapi-3.2-20200828/* ./
rmdir ioapi-3.2-20200828
export BIN=Linux2_x86_64dbg
mkdir Linux2_x86_64dbg
ln -s /opt/netcdf/netcdf-4/gnu/10.2.1/lib/*.so Linux2_x86_64dbg/
ln -s /opt/netcdf/netcdf-4/gnu/10.2.1/lib/libnetcdf.a Linux2_x86_64dbg/
ln -s /opt/netcdf/netcdf-4/gnu/10.2.1/lib/libnetcdff.a Linux2_x86_64dbg/
ln -s /opt/hdf5/hdf5-1.10.5/gnu/10.2.1/lib/libhdf5*a Linux2_x86_64dbg/
ln -s /opt/hdf5/hdf5-1.10.5/gnu/10.2.1/lib/libhdf5*so Linux2_x86_64dbg/
ln -s /usr/lib/x86_64-linux-gnu/*curl*a Linux2_x86_64dbg/
ln -s /usr/lib/x86_64-linux-gnu/*curl*so Linux2_x86_64dbg/
cp ioapi/Makefile.nocpl ioapi/Makefile
cp m3tools/Makefile.nocpl m3tools/Makefile
cp Makefile.template Makefile
cp ioapi/Makeinclude.Linux2_x86_64dbg ioapi/Makeinclude.Linux2_x86_64dbg.old 

Editamos los Makefiles (Makefile y ioapi/Makeinclude.Linux2_x86_64)

 diff Makefile Makefile.template 
138,145c138,145
<  BIN        = Linux2_x86_64dbg
<  BASEDIR    = ${PWD}
<  INSTALL    = /home/solange.luque/libs/ioapi/v3.2-20200828/gnu-dbg
<  LIBINST    = $(INSTALL)/$(BIN)
<  BININST    = $(INSTALL)/$(BIN)
<  CPLMODE    = nocpl
<  IOAPIDEFS  = 
<  PVMINCL    =
---
> # BIN        = Linux2_x86_64
> # BASEDIR    = ${PWD}
> # INSTALL    = ${HOME}
> # LIBINST    = $(INSTALL)/$(BIN)
> # BININST    = $(INSTALL)/$(BIN)
> # CPLMODE    = nocpl
> # IOAPIDEFS  = 
> # PVMINCL    =

diff ioapi/Makeinclude.Linux2_x86_64dbg ioapi/Makeinclude.Linux2_x86_64dbg.old 
26,28c26
< DBGFLAGS  = -g -Wall -Wextra -Warray-temporaries -Wconversion -fimplicit-none -fbacktrace -ffree-line-length-none -fcheck=all -ffpe-trap=zero,overflow,underflow -finit-real=nan
< DBGFLAGS  = 
< MFLAGS    = -Wsurprising -fbounds-check -finit-real=snan -m64 ${DBGFLAGS} -Wno-tabs
---
> MFLAGS    = -Wsurprising -fbounds-check -finit-real=snan -m64

Instalamos librerías

make configure >& run_configure.log
make all >& run_make.log

Si no hay problemas

$ ls -l Linux2_x86_64/ | grep rwx | grep -v lrwxrwxrwx | awk '{print $9}' | tr '\n' ' ' 
airs2m3 bcwndw camxtom3 datshift dayagg factor findwndw greg2jul gregdate gridprobe insertgrid jul2greg juldate juldiff julshift kfxtract 
  latlon m3agmask m3agmax m3combo m3cple m3diff m3edhdr m3fake m3hdr m3interp m3mask m3merge m3pair m3probe m3stat m3totxt m3tproc m3tshift 
  m3wndw m3xtract mpasdiff mpasstat mpastom3 mtxblend mtxbuild mtxcalc mtxcple presterp presz projtool randomstat selmrg2d timediff timeshift 
  vertimeproc vertintegral vertot wndwdesc wrfgriddesc wrftom3

Instalando:

mkdir ~/MODELOS/CMAQ/gnu/LIBRARIES/ioapi
make install >& run_install.log
ls ~/MODELOS/CMAQ/gnu/LIBRARIES/ioapi/Linux2_x86_64/
airs2m3   greg2jul    julshift    m3cple    m3merge   m3utilio.mod    modpdata.mod  mtxcalc     timediff      wrftom3
bcwndw    gregdate    kfxtract    m3diff    m3pair    m3wndw          modwrfio.mod  mtxcple     timeshift
camxtom3  gridprobe   latlon      m3edhdr   m3probe   m3xtract        mpasdiff      presterp    vertimeproc
datshift  insertgrid  libioapi.a  m3fake    m3stat    modatts3.mod    mpasstat      presz       vertintegral
dayagg    jul2greg    m3agmask    m3hdr     m3totxt   modgctp.mod     mpastom3      projtool    vertot
factor    juldate     m3agmax     m3interp  m3tproc   modmpasfio.mod  mtxblend      randomstat  wndwdesc
findwndw  juldiff     m3combo     m3mask    m3tshift  modncfio.mod    mtxbuild      selmrg2d    wrfgriddesc
cp ioapi/fixed_src/* Linux2_x86_64/
cp ioapi/fixed_src/* /home/solange.luque/MODELOS/CMAQ/gnu/LIBRARIES/ioapi/Linux2_x86_64/

[editar] CMAQ

NOTA: Asegurarse que no hay ningún entorno de compiladores activado automáticamente en el .bashrc

[editar] intel

Yendo al directorio de trabajo

cd /home/solange.luque/MODELOS/CMAQ/intel
mkdir src
cd src
git clone https://github.com/USEPA/CMAQ.git CMAQ-master
head -n 1 CMAQ-master/README.md
CMAQv5.4
cd CMAQ-master/
ls 
bldit_project.csh  CCTM  config_cmaq.csh  DOCS  license.md  POST  PREP  PYTOOLS  README.md  UTIL

Preparando configuración de la compilación

cp bldit_project.csh bldit_project.csh.old
diff bldit_project.csh bldit_project.csh.old 
19,20c19
<  #set CMAQ_HOME = ${PWD}/CMAQ_Project
<  set CMAQ_HOME = /home/solange.luque/MODELOS/CMAQ/intel/src/CMAQ-master/CMAQ_Project
---
>  set CMAQ_HOME = /home/username/path

Compilamos!

./bldit_project.csh >& run_bldit.log
tail run_bldit.log 
mkdir: created directory '/home/solange.luque/MODELOS/CMAQ/intel/src/CMAQ-master/CMAQ_Project/POST/hr2day'
mkdir: created directory '/home/solange.luque/MODELOS/CMAQ/intel/src/CMAQ-master/CMAQ_Project/POST/hr2day/scripts'
mkdir: created directory '/home/solange.luque/MODELOS/CMAQ/intel/src/CMAQ-master/CMAQ_Project/POST/sitecmp'
mkdir: created directory '/home/solange.luque/MODELOS/CMAQ/intel/src/CMAQ-master/CMAQ_Project/POST/sitecmp/scripts'
mkdir: created directory '/home/solange.luque/MODELOS/CMAQ/intel/src/CMAQ-master/CMAQ_Project/POST/sitecmp_dailyo3'
mkdir: created directory '/home/solange.luque/MODELOS/CMAQ/intel/src/CMAQ-master/CMAQ_Project/POST/sitecmp_dailyo3/scripts'
mkdir: created directory '/home/solange.luque/MODELOS/CMAQ/intel/src/CMAQ-master/CMAQ_Project/POST/writesite'
mkdir: created directory '/home/solange.luque/MODELOS/CMAQ/intel/src/CMAQ-master/CMAQ_Project/POST/writesite/scripts'
Configuration and Run Scripts have been Extracted and placed in: /home/solange.luque/MODELOS/CMAQ/intel/src/CMAQ-master/CMAQ_Project
You may now edit these scripts to conform to your system and run options.

Vamos al directorio

cd CMAQ_Project/
cp config_cmaq.csh config_cmaq.csh.old
diff config_cmaq.csh config_cmaq.csh.old 
88,95c88,95
<         setenv IOAPI_INCL_DIR   /home/solange.luque/libraries/ioapi/v3.2-20200828/intel/Linux2_x86_64ifort           #> I/O API include header files
<         setenv IOAPI_LIB_DIR    /home/solange.luque/libraries/ioapi/v3.2-20200828/intel/Linux2_x86_64ifort             #> I/O API libraries
<         setenv NETCDF_LIB_DIR   /opt/netcdf/netcdf-4/intel/2021.4.0/lib            #> netCDF C directory path
<         setenv NETCDF_INCL_DIR  /opt/netcdf/netcdf-4/intel/2021.4.0/include        #> netCDF C directory path
<         setenv NETCDFF_LIB_DIR  /opt/netcdf/netcdf-4/intel/2021.4.0/lib            #> netCDF Fortran directory path
<         setenv NETCDFF_INCL_DIR /opt/netcdf/netcdf-4/intel/2021.4.0/include        #> netCDF Fortran directory path
<         setenv MPI_INCL_DIR     /opt/intel/oneapi/mpi/2021.4.0/include             #> MPI Include directory path
<         setenv MPI_LIB_DIR      /opt/intel/oneapi/mpi/2021.4.0/lib                 #> MPI Lib directory path
---
>         setenv IOAPI_INCL_DIR   ioapi_inc_intel             #> I/O API include header files
>         setenv IOAPI_LIB_DIR    ioapi_lib_intel             #> I/O API libraries
>         setenv NETCDF_LIB_DIR   netcdf_lib_intel            #> netCDF C directory path
>         setenv NETCDF_INCL_DIR  netcdf_inc_intel            #> netCDF C directory path
>         setenv NETCDFF_LIB_DIR  netcdff_lib_intel           #> netCDF Fortran directory path
>         setenv NETCDFF_INCL_DIR netcdff_inc_intel           #> netCDF Fortran directory path
>         setenv MPI_INCL_DIR     mpi_incl_intel              #> MPI Include directory path
>         setenv MPI_LIB_DIR      mpi_lib_intel               #> MPI Lib directory path
99c99
<         setenv myFC /opt/intel/oneapi/mpi/2021.4.0/bin/mpiifort
---
>         setenv myFC mpiifort
103c103
<         setenv myLINK_FLAG "-qopenmp"
---
>         setenv myLINK_FLAG #"-qopenmp-simd" openMP not supported w/ CMAQ
./config_cmaq.csh intel >& run_config-cmaq.log
cat run_config-cmaq.log
Compiler is set to intel

Compilamos!

cd CCTM/scripts/
mkdir BLD_CCTM_v54_intel
cp -R /opt/intel/oneapi/mpi/2021.4.0/include/* BLD_CCTM_v54_intel/
./bldit_cctm.csh intel >& run_bldit_cctm.log
ls BLD_CCTM_v54_intel/*exe
BLD_CCTM_v54_intel/CCTM_v54.exe

NOTA: Si se está intentando una recompilación, antes vaciar el directorio

rm -rf BLD_CCTM_v54_intel/*

[editar] gnu

Yendo al directorio de trabajo

/home/solange.luque/MODELOS/CMAQ/gnu/
mkdir src
cd src
git clone https://github.com/USEPA/CMAQ.git CMAQ-master
head -n 1 ../../../README.md 
CMAQv5.4
cd CMAQ-master/
ls 
bldit_project.csh  CCTM  config_cmaq.csh  DOCS  license.md  POST  PREP  PYTOOLS  README.md  UTIL

Preparando configuración de la compilación

cp bldit_project.csh bldit_project.csh.old

diff bldit_project.csh bldit_project.csh.old 
19,20c19
<  #set CMAQ_HOME = ${PWD}/CMAQ_Project
<  set CMAQ_HOME = /home/solange.luque/MODELOS/CMAQ/gnu/src/CMAQ-master/CMAQ_Project
---
>  set CMAQ_HOME = /home/username/path

Compilamos!

./bldit_project.csh >& run_bldit.log
tail run_bldit.log 
mkdir: created directory '/home/solange.luque/MODELOS/CMAQ/gnu/src/CMAQ-master/CMAQ_Project/POST/hr2day'
mkdir: created directory '/home/solange.luque/MODELOS/CMAQ/gnu/src/CMAQ-master/CMAQ_Project/POST/hr2day/scripts'
mkdir: created directory '/home/solange.luque/MODELOS/CMAQ/gnu/src/CMAQ-master/CMAQ_Project/POST/sitecmp'
mkdir: created directory '/home/solange.luque/MODELOS/CMAQ/gnu/src/CMAQ-master/CMAQ_Project/POST/sitecmp/scripts'
mkdir: created directory '/home/solange.luque/MODELOS/CMAQ/gnu/src/CMAQ-master/CMAQ_Project/POST/sitecmp_dailyo3'
mkdir: created directory '/home/solange.luque/MODELOS/CMAQ/gnu/src/CMAQ-master/CMAQ_Project/POST/sitecmp_dailyo3/scripts'
mkdir: created directory '/home/solange.luque/MODELOS/CMAQ/gnu/src/CMAQ-master/CMAQ_Project/POST/writesite'
mkdir: created directory '/home/solange.luque/MODELOS/CMAQ/gnu/src/CMAQ-master/CMAQ_Project/POST/writesite/scripts'
Configuration and Run Scripts have been Extracted and placed in: /home/solange.luque/MODELOS/CMAQ/gnu/src/CMAQ-master/CMAQ_Project
You may now edit these scripts to conform to your system and run options.

Vamos al directorio

cd CMAQ_Project/
cp config_cmaq.csh config_cmaq.csh.old
diff config_cmaq.csh config_cmaq.csh.old 
151,158c151,158
<         setenv IOAPI_INCL_DIR   /home/solange.luque/libraries/ioapi/v3.2-20200828/gnu/Linux2_x86_64              #> I/O API include header files
<         setenv IOAPI_LIB_DIR    /home/solange.luque/libraries/ioapi/v3.2-20200828/gnu/Linux2_x86_64              #> I/O API libraries
<         setenv NETCDF_LIB_DIR   /opt/netcdf/netcdf-4/gnu/10.2.1/lib             #> netCDF C directory path
<         setenv NETCDF_INCL_DIR  /opt/netcdf/netcdf-4/gnu/10.2.1/include              #> netCDF C directory path
<         setenv NETCDFF_LIB_DIR  /opt/netcdf/netcdf_c-4.8.1_fortran-4.5.3/gnu/10.2.1/lib           #> netCDF Fortran directory path
<         setenv NETCDFF_INCL_DIR /opt/netcdf/netcdf_c-4.8.1_fortran-4.5.3/gnu/10.2.1/include           #> netCDF Fortran directory path
<         setenv MPI_INCL_DIR     /opt/openmpi/openmpi-4.1.2/gnu/10.2.1/include               #> MPI Include directory path
<         setenv MPI_LIB_DIR      /opt/openmpi/openmpi-4.1.2/gnu/10.2.1/lib               #> MPI Lib directory path
---
>         setenv IOAPI_INCL_DIR   iopai_inc_gcc             #> I/O API include header files
>         setenv IOAPI_LIB_DIR    ioapi_lib_gcc             #> I/O API libraries
>         setenv NETCDF_LIB_DIR   netcdf_lib_gcc            #> netCDF C directory path
>         setenv NETCDF_INCL_DIR  netcdf_inc_gcc            #> netCDF C directory path
>         setenv NETCDFF_LIB_DIR  netcdff_lib_gcc           #> netCDF Fortran directory path
>         setenv NETCDFF_INCL_DIR netcdff_inc_gcc           #> netCDF Fortran directory path
>         setenv MPI_INCL_DIR     mpi_incl_gcc              #> MPI Include directory path
>         setenv MPI_LIB_DIR      mpi_lib_gcc               #> MPI Lib directory path
162c162
<         setenv myFC /opt/openmpi/openmpi-4.1.2/gnu/10.2.1/bin/mpifort
---
>         setenv myFC mpifort
166,167c166,167
<         setenv myFFLAGS "-ffixed-form -ffixed-line-length-132 -funroll-loops -finit-character=32 -fallow-argument-mismatch"
<         setenv myFRFLAGS "-ffree-form -ffree-line-length-none -funroll-loops -finit-character=32 -frecursive -fallow-argument-mismatch"
---
>         setenv myFFLAGS "-ffixed-form -ffixed-line-length-132 -funroll-loops -finit-character=32"
>         setenv myFRFLAGS "-ffree-form -ffree-line-length-none -funroll-loops -finit-character=32"
169c169
<         setenv myLINK_FLAG  "-fopenmp" # openMP not supported w/ CMAQ
---
>         setenv myLINK_FLAG # "-fopenmp" openMP not supported w/ CMAQ
./config_cmaq.csh gcc >& run_config-cmaq.log
cat run_config-cmaq.log
Compiler is set to gcc

NOTA: en caso que aparezca en el run_config-cmaq.log 0: Event not found., editar el config_cmaq.csh e imprimir por pantalla la variable $CMAQ_LIB. Ahí se creean unos directorios que si ha habido algún problema, no se llenan bien. Es recomendable borrarlos y volver a lanzar.

rm -rf /home/solange.luque/MODELOS/CMAQ/gnu/src/CMAQ-master/lib/x86_64/gcc/ioapi

Compilar el Chemistry Transport Model (CCTM)

cd CCTM/scripts/
mkdir BLD_CCTM_v54_gcc
cp -R /opt/openmpi/openmpi-4.1.2/gnu/10.2.1/include/* BLD_CCTM_v54_gcc/
./bldit_cctm.csh gcc >& run_bldit_cctm.log
ls BLD_CCTM_v54_gcc/*exe
BLD_CCTM_v54_gcc/CCTM_v54.exe

NOTA: Si se está intentando una recompilación, antes vaciar el directorio

rm  BLD_CCTM_v54_gcc/*

[editar] Usando

Ejemplos de uso de CMAQ (útiles ya compilados e instalados en hydra)

* Editor emisiones: SMOKE
* Editor condiciones atmosféricas iniciales / entorno: MCIP
* Editor condiciones iniciales químicas: icon
* Editor condiciones borde químicas: bcon

[editar] Compilación MCIP

Preparado de las condiciones con MCIP usando la script: /home/solange.luque/MODELOS/CMAQ/intel/src/CMAQ-master/CMAQ_Project/PREP/mcip/scripts/run_mcip.csh

export CMAQ_HOME=/home/solange.luque/MODELOS/CMAQ/intel/src/CMAQ-master/CMAQ_Project/
cd /home/solange.luque/MODELOS/CMAQ/intel/src/CMAQ-master/CMAQ_Project/PREP/mcip/scripts
cp run_mcip.csh run_mcip.csh.old
diff run_mcip.csh run_mcip.csh.old 
125,129c125
< # config_cmaq.csh modifies $CMAQ_HOME
< set val = $CMAQ_HOME
< source $CMAQ_HOME/config_cmaq.csh intel
< set CMAQ_HOME = $val
< echo $0": Solange 2 CMAQ_HOME: "$CMAQ_HOME
---
> source $CMAQ_HOME/config_cmaq.csh
133c129
< set GridName   = AMBA              # 16-character maximum
---
> set GridName   = 2016_12SE1        # 16-character maximum
135,136c131,132
< set DataPath   = /home/solange.luque/estudios/CMAQ-ideal/DATA
< set InMetDir   = $DataPath/wrf 
---
> set DataPath   = $CMAQ_DATA
> set InMetDir   = $DataPath/wrf
142,143d137
< 
< echo $0": Solange: "$ProgDir
163,164c157,159
< set InMetFiles = ( $InMetDir/wrfout_d03_2012-11-15_00:00:00 \
<                    $InMetDir/wrfout_d03_2012-11-15_12:00:00 )
---
> set InMetFiles = ( $InMetDir/subset_wrfout_d01_2016-07-01_00:00:00 \
>                    $InMetDir/subset_wrfout_d01_2016-07-02_00:00:00 \
>                    $InMetDir/subset_wrfout_d01_2016-07-03_00:00:00 )
166,167c161,162
< set IfGeo      = "T"
< set InGeoFile  = $InGeoDir/geo_em.d03.nc
---
> set IfGeo      = "F"
> set InGeoFile  = $InGeoDir/geo_em_d01.nc
194,195c189,190
< set MCIP_START = 2012-11-15-00:10:00.0000  # [UTC]
< set MCIP_END   = 2012-11-15-50:00:00.0000  # [UTC]
---
> set MCIP_START = 2016-07-02-00:00:00.0000  # [UTC]
> set MCIP_END   = 2016-07-03-00:00:00.0000  # [UTC]
197c192
< set INTVL      = 10 # [min]
---
> set INTVL      = 60 # [min]
221c216
< set BTRIM = 5
---
> set BTRIM = 0

Compilando mcip

cd /home/solange.luque/MODELOS/CMAQ/intel/src/CMAQ-master/CMAQ_Project/PREP/mcip/src
vim /opt/load-libs.sh
source /opt/env_scripts/load_intel-2021.4.0_mpich-3.4.2.sh
diff Makefile Makefile.old 
50,52c50,52
< FC      = /opt/intel/oneapi/compiler/2021.4.0/linux/bin/intel64/ifort
< NETCDF = /opt/netcdf/netcdf-4/intel/2021.4.0
< IOAPI_ROOT = /home/solange.luque/MODELOS/CMAQ/intel/LIBRARIES/ioapi
---
> FC      = ifort
> NETCDF = /usr/local/apps/netcdf-4.7.3/intel-19.0
> IOAPI_ROOT = /usr/local/apps/ioapi-3.2_20181011/intel-19.0
56,59c56,57
< #LIBS    = -L$(IOAPI_ROOT)/lib -lioapi \
< #          -L$(NETCDF)/lib -lnetcdff -lnetcdf
< LIBS    = -L$(IOAPI_ROOT)/Linux2_x86_64ifort -lioapi \
<           -L$(NETCDF)/lib -lnetcdff -lnetcdf -qopenmp
---
> LIBS    = -L$(IOAPI_ROOT)/lib -lioapi \
>           -L$(NETCDF)/lib -lnetcdff -lnetcdf
make all >& run_make.log
ls *exe
mcip.exe

Se copia la script en donde se generaron los datos para asegurar su reproducibilidad

cp run_mcip.csh /home/solange.luque/estudios/CMAQ-ideal/DATA

[editar] Compilación icon

Empezando en

/home/solange.luque/MODELOS/CMAQ/intel/src/CMAQ-master/CMAQ_Project/PREP/icon/scripts
./bldit_icon.csh intel >& run_bldit_icon.log
ls BLD_ICON_v54_intel/
avprofile_cb6r3m_ae7_kmtbr_hemi2016_v53beta2_m3dry_col051_row068.csv
avprofile_racm_ae6_aq_derived_from_cb6r3m_ae7_kmtbr_hemi2016_v53beta2_m3dry_col051_row068.csv
avprofile_saprc07tc_ae6_aq_derived_from_cb6r3m_ae7_kmtbr_hemi2016_v53beta2_m3dry_col051_row068.csv
avprofile_saprc07tic_ae7i_aq_derived_from_cb6r3m_ae7_kmtbr_hemi2016_v53beta2_m3dry_col051_row068.csv
findex.F
HGRD_DEFN.F
icon.F
ICON_v54.cfg
IC_PARMS.F
lat_lon.F
legacy_PM_toxics_profile.csv
lr_interp.F
m3_ck_ctmmet.F
m3_ck_ctms.F
m3_ck_icmet.F
m3_driver.F
m3_icout.F
m3_vinterp.F
Makefile
Makefile.intel
opn_ic_file.F
prof_driver.F
prof_icout.F
prof_vinterp.F
VGRD_DEFN.F

Compilando:

cd BLD_ICON_v54_intel
/opt/load-libs.sh 1
source /opt/env_scripts/load_intel-2021.4.0_mpich-3.4.2.sh
make >& run_make.log
ls *exe
ICON_v54.exe

[editar] Compilación bcon

Empezando desde /home/solange.luque/MODELOS/CMAQ/intel/src/CMAQ-master/CMAQ_Project/PREP/bcon/scripts

./bldit_bcon.csh intel >& run_bldit_bcon.log
cd BLD_BCON_v54_intel/
ls BLD_BCON_v54_intel/*exe
BLD_BCON_v54_intel/BCON_v54.exe

[editar] Benchmark

Descargando los datos del test-case de acá

Datos en hydra $CMAQ_DATA=/home/solange.luque/MODELOS/CMAQ/DATA/benchmark

tar xvfz CMAQv5.4_2018_12NE3_Benchmark_2Day_Input.tar.gz
du -hsc ./CMAQv5.4_2018_12NE3_Benchmark_2Day_Input
56G     ./CMAQv5.4_2018_12NE3_Benchmark_2Day_Input

Home CMAQ en hydra $CMAQ_HOME=/home/solange.luque/MODELOS/CMAQ/intel/src/CMAQ-master/CMAQ_Project

Enlazando los datos

cd /home/solange.luque/MODELOS/CMAQ/intel/src/CMAQ-master/CMAQ_Project
mkdir -p data
cd data
ln -s /home/solange.luque/MODELOS/CMAQ/DATA/benchmark/CMAQv5.4_2018_12NE3_Benchmark_2Day_Input/2018_12NE3 ./

Corriendo benchmark

source /opt/env_scripts/load_intel-2021.4.0_mpich-3.4.2.sh
cd $CMAQ_HOME/CCTM/scripts
cp run_cctm_Bench_2018_12NE3.csh run_cctm_Bench_2018_12NE3.csh.old
diff run_cctm_Bench_2018_12NE3.csh run_cctm_Bench_2018_12NE3.csh.old
716,717c716
<   #( time -p mpirun -np $NPROCS $BLD/$EXEC ) |& tee buff_${EXECUTION_ID}.txt
<   (mpirun -np $NPROCS $BLD/$EXEC ) |& tee buff_${EXECUTION_ID}.txt
---
>   ( /usr/bin/time -p mpirun -np $NPROCS $BLD/$EXEC ) |& tee buff_${EXECUTION_ID}.txt
721c720
<   #rm -rf buff_${EXECUTION_ID}.txt
---
>   rm -rf buff_${EXECUTION_ID}.txt
732d730
<     echo "Have a look into buff_${EXECUTION_ID}.txt"
735d732
<   rm -rf buff_${EXECUTION_ID}.txt
qsub launch_cctm_intel.pb
#./run_cctm_Bench_2018_12NE3.csh >& run_Bench_2018-12NE3.log
tail -n 30 run_Bench_2018-12NE3.log 
 
     ==============================================
     |>---   PROGRAM COMPLETED SUCCESSFULLY   ---<|
     ==============================================
     Date and time 0:00:00   July 2, 2018   (2018183:000000)
 
     The elapsed time for this simulation was    2206.0 seconds.
 

CMAQ Processing of Day 20180701 Finished at Wed 16 Nov 2022 04:11:26 PM -03

\\\\\=====\\\\\=====\\\\\=====\\\\\=====/////=====/////=====/////=====/////


==================================
  ***** CMAQ TIMING REPORT *****
==================================
Start Day: 2018-07-01
End Day:   2018-07-01
Number of Simulation Days: 1
Domain Name:               2018_12NE3
Number of Grid Cells:      367500  (ROW x COL x LAY)
Number of Layers:          35
Number of Processes:       32
   All times are in seconds.

Num  Day        Wall Time
01   2018-07-01   2206.0
     Total Time = 2206.00
      Avg. Time = 2206.00

[editar] caso ideal

Partimos de una simulación de WRF y creamos los forzantes atmosféricos

Directorio de trabajo: /home/solange.luque/estudios/CMAQ-ideal

[editar] Meteorología

Para generar las condiciones meteorológicas ideales vamos a usar de base condiciones reales de una corridade WRF (wrfout_d03: dominio sobre AMBA a 1 km resolución, wrfour_d01: dominio centro SA a 50 km):

ls /home/solange.luque/estudios/CMAQ-ideal/DATA/wrf
geo_em.d03.nc wrfout_d01_2012-08-03_00:00:00  wrfout_d03_2012-11-15_00:00:00  
wrfout_d03_2012-11-15_12:00:00


A partir de estos ficheros creamos los ficheros meteorológicos ideales con velocidad constante usando el script getpoint_everywhere. Por ejemplo, para una simulación con solo velocidad de viento en la dirección horizontal y velocidad de 3m/s

python3 getpoint_everywhere.py -i 60 -j 60 -x west_east -y south_north -f 'wrfout_d03_2012-11-15_00:00:00' -v 'U@alloverct@3.:V@alloverct@0.' -s 'Time@0@-9@6'
python3 getpoint_everywhere.py -i 60 -j 60 -x west_east -y south_north -f 'wrfout_d03_2012-11-15_12:00:00' -v 'U@alloverct@3.:V@alloverct@0.' -s 'Time@0@-9@6'

Esto genera dos ficheros que renombramos:

wrfout_d03_2012-11-15_00:00:00_3
wrfout_d03_2012-11-15_12:00:00_3

Ahora vamos a correr mcip con estas condiciones. Partiendo del run_mcip.csh</pre> que creamos para el AMBA (caso prueba):

export CMAQ_HOME=/home/solange.luque/MODELOS/CMAQ/intel/src/CMAQ-master/CMAQ_Project/
cd /home/solange.luque/MODELOS/CMAQ/intel/src/CMAQ-master/CMAQ_Project/PREP/mcip/scripts/
cp run_mcip.csh run_mcip_ideal.csh

diff run_mcip.csh run_mcip_ideal.csh
131c131
< set APPL       = AMBA
---
> set APPL       = AMBAidealArea
135c135
< set DataPath   = /home/solange.luque/estudios/CMAQ-AMBA/prueba/DATA
---
> set DataPath   = /home/solange.luque/estudios/CMAQ-ideal/DATA
163,165c163,164
< set InMetFiles = ( $InMetDir/wrfout_d03_2012-11-14_12:00:00 \
< 		   $InMetDir/wrfout_d03_2012-11-15_00:00:00 \
<                    $InMetDir/wrfout_d03_2012-11-15_12:00:00 )
---
> set InMetFiles = ( $InMetDir/wrfout_d03_2012-11-15_00:00:00_3 \
> 		   $InMetDir/wrfout_d03_2012-11-15_12:00:00_3)

Ahora sí, corremos mcip:

./run_mcip_ideal.csh >& run_mcip_ideal.log


[editar] caso prueba AMBA

WORKDIR = /home/solange.luque/estudios/CMAQ-AMBA/prueba

Qué se necesita:

  1. Tener una salida de WRF y perararla para CMAQ
  2. Inventarios de emisiones y prepararlos para CMAQ
  3. Condiciones de contorno e iniciales para la química atmosférica
  4. Configurar CMAQ
  5. Simular CMAQ

Todos los pasos se explican con más detalle CMAQ/pruebaAMBA

Herramientas personales