primer informe 2015

Download Primer Informe 2015

If you can't read please download the document

Upload: luis-roca-galindo

Post on 18-Dec-2015

8 views

Category:

Documents


0 download

DESCRIPTION

Primer Informe 2015

TRANSCRIPT

SERVICIO NACIONAL METEOROLOGA EHIDROLOGA - SENAMHI

DIRECCIN DE METEREOLOGA APLICADA

Elaboracin del post procesamiento de informacin de la simulacin de modelizacin climtica.

Primer entregable: Informe sobre Cdigo, Manual de Uso de Scripts y Programas Para Sistematizacin de la Informacin Climtica

PRIMER PRODUCTO

Luis Rodolfo Roca Galindo

Lima, marzo de 2015

INFORME SOBRE CODIGO, MANUAL DE USO DE SCRIPTS Y PROGRAMAS PARA SISTEMATIZACION DE LA INFORMACION CLIMATICAObjetivoEl presente estudio tiene como objetivo el diseo e implementaron de programas informticos para la extraccin y el cambio de escala temporal de las variables temperatura, humedad relativa, precipitacin y viento, producidos en la simulacin de escenarios climticos mediante el modelo regional WRF.IntroduccinEl modelo regional WRF almacena las variables de salida en archivos con formato netcdf que deben ser post-procesados, en este caso se uso la herramienta UPP, (NCEP Unified Post Processor) que interpola la informacin desde las grillas nativas del modelo a grillas rectangulares y a niveles de presin previamente especificados, dando como resultado archivos en formato GRIB1. UPP esta compuesto por dos partes: unipost que genera los campos requeridos y la interpolacin vertical, y copygb que realiza la interpolacin horizontal y el almacenamiento en GRIB1

Cuadro 1. Lista de todos los campos posibles ledos por unipost en el WRF-ARW:TMUBSFROFF

UP_TOPUDROFF

VPHBSFCEVP

QVAPORPHSFCEXC

QCLOUDSMOISVEGFRA

QICETSLBACSNOW

QRAINCLDFRAACSNOM

QSNOWU10CANWAT

QGRAUPV10SST

WTH2THZ0

PBQ2QZ0

PSMSTAVUZ0

MUSMSTOTVZ0

QSFCHGTISLTYP

Z0ALBEDOISLOPE

USTGSWXLAND

AKHSGLWXLAT

AKMSTMNXLONG

TSKHFXMAPFAC_M

RAINCLHSTEPBL

RAINNCGRDFLXHTOP

RAINCVSNOWHBOT

RAINNCVSNOWC

Las variables requeridas para el estudio deben de ser calculadas a nivel diario, mensual y estacional y estn indicadas en el cuadro 2.

Cuadro 2. Variables de estudio.NombreDescripcin

ppPrecipitacin

tempTemperatura

temp2mTemperatura a 2m

rhHumedad relativa

rh2mHumedad relativa a 2m

uComponente zonal del viento

u10mComponente zonal del viento a 10m

vComponente meridional del viento

v10mComponente meridional del viento a 10m

Marco TericoClculo de la precipitacin. El modelo regional WRF permite el uso de la opcin bucket_mm, que separa el clculo de la precipitacin acumulada (mm) en dos variables, segn la siguiente relacin:

Rain = I_RAIN(N)C*bucket_mm + RAIN(N)C

El cdigo que maneja la acumulacin de la precipitacin es el siguiente

IF(rainnc(i,j) .gt. bucket_mm)THENrainnc(i,j) = rainnc(i,j) - bucket_mmi_rainnc(i,j) = i_rainnc(i,j) + 1ENDIFIF(rainc(i,j) .gt. bucket_mm)THENrainc(i,j) = rainc(i,j) - bucket_mmi_rainc(i,j) = i_rainc(i,j) + 1ENDIFEs decir si la precipitacin acumulada sobrepasa el umbral bucket_mm, entonces la variable ndice i_rain(n)n se incrementa en un unidad y la variable rain(n)c disminuye en bucket_mm.

La precipitacin total acumulada es

Total Rain = RAINC + RAINNC

La precipitacin acumulada diaria (PP), en el dia I, se calcula como:

PPI = (I_RAINCI+1(00) - I_RAINCI(00) + I_RAINNCI+1(00) - I_RAINNCI(00) )*bucket_mm + RAINCI+1(00) - RAINCI(00) + RAINNCI+1(00) RAINNCI(00)

La precipitacin acumulada mensual, en el mes M se calcula como:

PPM=

La precipitacin acumulada estacional, en el trimestre EST, se calcula como

PPEST=PPM1+PPM2+PPM3donde M1, M2, M3 son los meses del trimestre DEF, MAM, JJA, SON, respectivamente.

Clculo de la temperatura. La temperatura promedio diaria en el da I, se calcula como

TEMPI = A es el conjunto de temperaturas:

frmula

donde es la temperatura del da I y hora HH=00, 06, 12, 18

La temperatura promedio mensual en el mes M, se calcula como

TEMPM=

La temperatura promedio mensual en el trimestre EST, se calcula como

TEMPEST=frmula(TEMPM1+TEMPM2+TEMPM3)donde M1, M2, M3 son los meses del trimestre DEF, MAM, JJA, SON, respectivamente.

Metodologa4.1 Datos

Se trabajar con:Datos en formato GRIB1 generados por el post-procesamiento de las salidas del modelo WRF con el modulo UPP, conteniendo 6 horas de simulacin.

Las salidas del modelo WRF en formato netcdf., conteniendo 6 horas de simulacin.4.2 Herramientas informticas:

Compilador de Fortran: ifort version 15.0.2

Software para manejar archivos netcdf: NCO netCDF Operators version 4.3.6

Software para manejar archivos GRIB1: wgrib v1.8.1.2b4.3 Scripts y programas para la extraccin y cambio de escala temporal4.3.1 Compilacin.Crear un directorio de trabajo y copiar los archivos: cambiar_escala_temporal.f90, extraer_var, escribe_ctl , extraer_pp_wrfout , extraer_var_WRFPRS, luego ejecutar las siguientes ordenes desde un sesin de linea de comandos:

ifort -g -ocambiar_escala_temporal.exe cambiar_escala_temporal.f90 chmod +x extraer_var chmod +x escribe_ctl chmod +x extraer_pp_wrfout chmod +x extraer_var_WRFPRS4.3.2 EXTRAER_VAR, extrae y cambia la escala temporal de una variable.Modo de empleo ./extraer_var [ruta_datos] [variable] [ao1] [ao2] [dominio]DescripcinScript que extrae una variable a niveles de presin o superficie desde las salidas del modelo WRF y genera archivos a nivel, diario, mensual y estacional.Parmetrosruta_datos: ruta a los archivos contienen las salidas del modelo WRF, deben de estar organizados un ao por directorio.variable:alguna de las variables indicadas en el cuadro 2.ao1, ao2: indican el ao de inicio y fin del periodo de anlisis, sin embargo laextraccin se efecta incluyendo el mes de diciembre de ao-1 y las 00 horas del mes de enero de ao+1, dominio:indica el dominio empleado de la simulacin, especficamente d01, d02.Datos generados:Archivos binarios de nombre: [variable]_[escala]_[ao1]_[ao2].dat variable:alguna de las variables indicadas en el cuadro 2.escala:diario, mensual, estacionalao1, ao2: indican el ao de inicio y fin del periodo de anlisisEjemplos:./extraer_var "/media/Seagate Expansion Drive/output/nodo1" pp 2017 2018 d01./extraer_var "/media/Seagate Expansion Drive/POST/NODO1" temp 2017 2018 d01 ./extraer_var "/media/Seagate Expansion Drive/POST/NODO1" temp2m 2017 2018 d014.3.3 EXTRAER_PP_WRFOUT, extrae la variable precipitacin.Modo de empleo ./extraer_pp_wrfout [ruta_datos] [fecha1] [fecha2] [dominio]DescripcinScript que extrae la variable precipitacin desde las salidas del modelo WRF y genera archivos con una escala temporal de 6 horasl.Parmetrosruta_datos: ruta a los archivos wrfout* contienen las salidas del modelo WRF, deben de estar organizados un ao por directorio.fecha1, fecha2: indican el inicio y fin del periodo de extraccin, segn el formato YYYY-MM-DY_HH, por ejemplo: 2023-01-10_00.dominio:indica el dominio empleado de la simulacin, especficamente d01, d02.Datos generados:Archivos binarios de nombre: [variable]_[fecha1]_[fecha2].dat variable:RAIN(N)C, I_RAIN(N)Cfecha1, fecha2: indican el inicio y fin del periodo de extraccin, segn el formato YYYY-MM-DY_HH, por ejemplo: 2023-01-10_00.Ejemplo:./extraer_pp_wrfout "/media/Seagate Expansion Drive/output/nodo1" 2023-01-10_00 2023-01-19_18 d014.3.4 EXTRAER_VAR_WRFPRS, extrae una variable, excepto precipitacin.Modo de empleo ./extraer_var_WRFPRS [ruta_datos] [variable] [fecha1] [fecha2] [dominio]DescripcinScript que extrae una variable desde las salidas del modelo WRF y genera archivos con una escala temporal de 6 horasl.Parmetrosruta_datos: ruta a los archivos WRFPRS* contienen las salidas del modelo WRF, deben de estar organizados un ao por directorio.variable:alguna de las variables indicadas en el cuadro 2, excepto la precipitacin.fecha1, fecha2: indican el inicio y fin del periodo de extraccin, segn el formato YYYY-MM-DY_HH, por ejemplo: 2023-01-10_00.dominio:indica el dominio empleado de la simulacin, especficamente d01, d02.Datos generados:Archivos binarios de nombre: [variable]_[fecha1]_[fecha2].dat variable: alguna de las variables indicadas en el cuadro 2, excepto la precipitacin.fecha1, fecha2: indican el inicio y fin del periodo de extraccin, segn el formato YYYY-MM-DY_HH, por ejemplo: 2023-01-10_00.Ejemplo:./extraer_var_WRFPRS "/media/Seagate Expansion Drive/output/nodo1" temp2m 2023-01-10_00 2023-01-19_18 d014.3.5 ESCRIBE_CTL, genera un archivo de control de una variable.Modo de empleo ./extraer_ctl [variable] [ao1] [ao2] [escala] [dominio]DescripcinScript que genera un archivo de control para una variable especifica a nivel diario, mensual o estacional.Parmetrosvariable:alguna de las variables indicadas en el cuadro 2.ao1, ao2: indican el inicio y fin del periodo de almacenamiento de la variable.escala:diario, mensual, estacional.dominio:indica el dominio empleado de la simulacin, especficamente d01, d02.Datos generados:Archivos de control de nombre: [variable]_[escala]_[ao1]_[ao2].ctl variable:alguna de las variables indicadas en el cuadro 2.ao1, ao2: indican el inicio y fin del periodo de almacenamiento de la variable.escala:diario, mensual, estacional.Ejemplo:./escribe_ctl temp2m 2023 2014 diario d014.3.6 CAMBIAR_ESCALA_TEMPORAL, cambia la escala temporal de una variable.Modo de empleo ./cambiar_escala_temporal.exe [ruta_datos] [variable] [ao1] [ao2] [nx] [ny] [nz]DescripcinPrograma que cambia la escala temporal de una variable almacenada cada 6 horas y produce archivos binarios con informacin diaria, mensual y estacional..Parmetrosruta_datos: ruta a los archivo binarios con informacin cada 6 horas.variable:alguna de las variables indicadas en el cuadro 2.ao1, ao2: indican el ao de inicio y fin del periodo de anlisis, sin embargo la lectura de datos se efecta incluyendo el mes de diciembre de ao-1 y tambin las 00 horas del mes de enero de ao+1, dominio:indica el dominio empleado de la simulacin, especficamente d01, d02.nx, ny, nz: dimensiones de la grilla asociada a los archivos binarios.Datos generados:Archivos binarios de nombre: [variable]_[escala]_[ao1]_[ao2].dat variable:alguna de las variables indicadas en el cuadro 2.escala:diario, mensual, estacionalao1, ao2: indican el ao de inicio y fin del periodo de anlisisEjemplo:./cambiar_escala_temporal.exe "/data/analisis" temp2m 1985 1987 174 199 25ResultadosLos algoritmos diseados e implementados en los scripts : cambiar_escala_temporal.f90, extraer_var, escribe_ctl , extraer_pp_wrfout , extraer_var_WRFPRS, se encuentran operativos y ejecutndose con normalidad en la Direccin de Meteorologa Aplicada, un ejemplo se muestra en la figuras 1-3.

Figura 1. Temperatura diaria a 2m (C) para el mes de enero de 2017. Lat = -12, Lon = -72

Figura 2. Temperatura mensual a 2m (C) para el 2017. Lat = -12, Lon = -72

Figura 3. Temperatura estacional a 2m (C) para el 2017. Lat = -12, Lon = -72

ConclusionesLos scripts generados realizan la extraccin de las variables de manera satisfactoria y de manera ampliable a otras variables y dominios.

La extraccin de las variables puede realizarse en varios formatos, en este caso se hizo desde archivos GRIB1, com tambin desde archivos netcdf, por lo cual puede aprovecharse herramientas como NCO y WGRIB que manejan eficientemente estos tipos de formato.

El cambio de escala temporal puede ampliarse a escalas multianuales de manera sencilla y rpida.

ReferenciasWRF User Page. http://www2.mmm.ucar.edu/wrf/users/workshops/WS2010/presentations/Lectures/Microphysics10.pdf. Consultado el 31 de marzo 2015.

WRF User Page. http://www2.mmm.ucar.edu/wrf/users/docs/user_guide_V3/users_guide_chap9.htm#UPP. Consultado el 31 de marzo 2015.

Anexo. Cdigo fuentes de los programas y scriptsScript: extraer_var#!/bin/bash # Extraccion de variables de las salida del modelo wrf # a nivel diario y mensual

if (($# != 5)); then echo "Uso: ./extraer_var ruta_datos variable ao1 ao2 dominio" echo "Ejemplo: ./extraer_var /home/luis/data/Suramerica temp2m 1980 1981 d02" echo "" echo "Variables disponibles:" echo "" echo "A. Cerca a la superficie:" echo " 1. pp: precipitacion" echo " 2. temp2m: temperatura a 2m" echo " 3. rh2m: humedad relativa a 2m" echo " 4. u10m: componente zonal de viento a 10m" echo " 5. v10m: componente meridional del viento a 10m" echo "" echo "B. A niveles de presion:" echo " 1. temp: temperatura" echo " 2. rh: humedad relativa" echo " 3. u: componente zonal de viento" echo " 4. v: componente meridional del viento" exit fi

RUTA_DATA=$1 VAR=$2 YR1=$3 YR2=$4 DOM=$5

RUTA_VAR="." case "$DOM" in "d01") NX=174 NY=199 ;; "d02") NX=240 NY=327 ;; *) echo "Dominio no reconocido" exit ;; esac

case "$VAR" in "pp") echo "Procesando la precipitacion:" NZ=1 DATE1="$(( ${YR1} - 1 ))-12-01_00" DATE2="$(( ${YR2} + 1 ))-01-01_00" echo "./extraer_pp_wrfout '${RUTA_DATA}' $DATE1 $DATE2 ${DOM}" ./extraer_pp_wrfout "${RUTA_DATA}" $DATE1 $DATE2 ${DOM} # verificamos que la extraccion fue exitosa FILE_RAINC=${RUTA_VAR}/RAINC_${DATE1}_${DATE2}".dat" FILE_RAINNC=${RUTA_VAR}/RAINC_${DATE1}_${DATE2}".dat" FILE_I_RAINC=${RUTA_VAR}/RAINC_${DATE1}_${DATE2}".dat" FILE_I_RAINNC=${RUTA_VAR}/RAINC_${DATE1}_${DATE2}".dat" if [ ! -f ${FILE_RAINC} ]; then echo ${FILE_RAINC} "no encontrado"; salir=true; fi if [ ! -f ${FILE_RAINNC} ]; then echo ${FILE_RAINNC} "no encontrado"; salir=true; fi if [ ! -f ${FILE_I_RAINC} ]; then echo ${FILE_I_RAINC} "no encontrado"; salir=true; fi if [ ! -f ${FILE_I_RAINNC} ]; then echo ${FILE_I_RAINNC} "no encontrado"; salir=true; fi ;; "temp" | "temp2m") echo "Procesando la temperatura:" DATE1="$(( ${YR1} - 1 ))-12-01_00" DATE2="${YR2}-12-31_18" if [ "${VAR}" == "temp2m" ]; then NZ=1; else NZ=25; fi echo "./extraer_var_WRFPRS '${RUTA_DATA}' $VAR $DATE1 $DATE2 ${DOM}" ./extraer_var_WRFPRS "${RUTA_DATA}" $VAR $DATE1 $DATE2 ${DOM} # verificamos que la extraccion fue exitosa FILE_OUT=${RUTA_VAR}/${VAR}_${DATE1}_${DATE2}".dat" if [ ! -f ${FILE_OUT} ]; then echo ${FILE_OUT} "no encontrado"; salir=true; fi ;; "rh"*) echo "Procesando la humedad relativa:" DATE1="$(( ${YR1} - 1 ))-12-01_00" DATE2="${YR2}-12-31_18" if [ "${VAR:2:2}" == "2m" ]; then nz=1; else nz=25; fi echo "./extraer_var_WRFPRS ${RUTA_DATA} $VAR $DATE1 $DATE2 ${DOM}" # verificamos que la extraccion fue exitosa FILE_OUT=${RUTA_VAR}/${VAR}_${DATE1}_${DATE2}".dat" if [ ! -f ${FILE_OUT} ]; then echo ${FILE_OUT} "no encontrado"; salir=true; fi ;; "u"*) echo "Procesando la componente zonal del viento:" DATE1="$(( ${YR1} - 1 ))-12-01_00" DATE2="${YR2}-12-31_18" if [ "${VAR:4:2}" == "10m" ]; then nz=1; else nz=25; fi echo "./extraer_var_WRFPRS ${RUTA_DATA} $VAR $DATE1 $DATE2 ${DOM}" # verificamos que la extraccion fue exitosa FILE_OUT=${RUTA_VAR}/${VAR}_${DATE1}_${DATE2}".dat" if [ ! -f ${FILE_OUT} ]; then echo ${FILE_OUT} "no encontrado"; salir=true; fi ;; "v"*) echo "Procesando la componente meridional del viento:" DATE1="$(( ${YR1} - 1 ))-12-01_00" DATE2="${YR2}-12-31_18" if [ "${VAR:4:2}" == "10m" ]; then nz=1; else nz=25; fi echo "./extraer_var_WRFPRS ${RUTA_DATA} $VAR $DATE1 $DATE2 ${DOM}" # verificamos que la extraccion fue exitosa FILE_OUT=${RUTA_VAR}/${VAR}_${DATE1}_${DATE2}".dat" if [ ! -f ${FILE_OUT} ]; then echo ${FILE_OUT} "no encontrado"; salir=true; fi ;; *) echo "Variable no reconocida" exit ;; esac if [ ${salir} ]; then exit; fi

echo "./cambiar_escala_temporal.exe ${RUTA_VAR} $VAR ${YR1} ${YR2} $NX $NY $NZ"

./cambiar_escala_temporal.exe ${RUTA_VAR} $VAR ${YR1} ${YR2} $NX $NY $NZ

# verificamos que la consolidacion diaria, mensual y estacional fue exitosa FILE_DIARIO="${RUTA_VAR}/${VAR}_diario_${YR1}_${YR2}.dat" FILE_MENSUAL="${RUTA_VAR}/${VAR}_mensual_${YR1}_${YR2}.dat" FILE_EST="${RUTA_VAR}/${VAR}_estacional_${YR1}_${YR2}.dat" if [ ! -f ${FILE_DIARIO} ]; then echo ${FILE_DIARIO} "no encontrado"; salir=true; fi if [ ! -f ${FILE_MENSUAL} ]; then echo ${FILE_MENSUAL} "no encontrado"; salir=true; fi if [ ! -f ${FILE_EST} ]; then echo ${FILE_EST} "no encontrado"; salir=true; fi if [ ! ${salir} ] then echo "Archivos creados:" echo ${FILE_DIARIO} echo ${FILE_MENSUAL} echo ${FILE_EST} fi # creamos los archivos de control

./escribe_ctl $VAR $YR1 $YR2 diario $DOM ./escribe_ctl $VAR $YR1 $YR2 mensual $DOM ./escribe_ctl $VAR $YR1 $YR2 estacional $DOM

Script: extraer_var_WRFPRS

#!/bin/bash # extraccion de variables desde los archivos grib # Uso: ./extraer_var_grib /ruta/a/los/grib var fecha1 fecha2 dominio

if (($# != 5)); then echo "Argumentos incorrectos" echo "Uso: ./extraer_var_WRFPRS /ruta/a/los/grib variable YYYY-MM-DY_HH YYYY-MM-DY_HH dominio" echo "Ejemplo: ./extraer_var_WRFPRS /home/luis/data/Suramerica temp2m 1979-12-01_00 1980-12-31_18 d02" exit else RUTA_DATA=$1 VAR=$2 DATE1=$3 DATE2=$4 DOMINIO=$5 fi

YR1=${DATE1:0:4} MO1=$(( 10#${DATE1:5:2} )) DY1=$(( 10#${DATE1:8:2} )) HR1=$(( 10#${DATE1:11:2} ))

YR2=${DATE2:0:4} MO2=$(( 10#${DATE2:5:2} )) DY2=$(( 10#${DATE2:8:2} )) HR2=$(( 10#${DATE2:11:2} ))

YR=${YR1} MO=${MO1} DY=${DY1} HR=${HR1}

RUTA_VAR="." case "${VAR}" in "rh") VARIABLE_GRIB=":RH:[0-9]+ mb" ;; "rh2m") VARIABLE_GRIB=":RH:2 m" ;; "temp") VARIABLE_GRIB=":TMP:[0-9]+ mb" ;; "temp2m") VARIABLE_GRIB=":TMP:2 m" ;; "u") VARIABLE_GRIB=":UGRD:[0-9]+ mb" ;; "v") VARIABLE_GRIB=":UGRD:[0-9]+ mb" ;; "u10m") VARIABLE_GRIB=":UGRD:10 m" ;; "v10m") VARIABLE_GRIB=":UGRD:10 m" ;; *) echo "Variable no reconocida" exit ;; esac

FILEOUT="${RUTA_VAR}/${VAR}_${DATE1}_${DATE2}.dat" if [ -f "${FILEOUT}" ]; then rm -f "${FILEOUT}" fi

salir=false DIAS_MES=( 0 31 28 31 30 31 30 31 31 30 31 30 31) ABRV_MES=( "" "JAN" "FEB" "MAR" "APR" "MAY" "JUN" "JUL" "AUG" "SEP" "OCT" "NOV" "DEC") if (( ( ( $YR % 4 == 0 ) && ( $YR % 100 != 0 ) ) || ( $YR % 400 == 0 ) )) then DIAS_MES[2]=29 else DIAS_MES[2]=28 fi

while ! ${salir}; do CADHR="$(printf "%.2d" "$HR")" CADDY="$(printf "%.2d" "$DY")" CADMO="$(printf "%.2d" "$MO")" FILEIN="${RUTA_DATA}/"${YR}"/WRFPRS_"${DOMINIO}"_"${YR}${CADMO}${CADDY}${CADHR} if [ -f "${FILEIN}" ]; then ### extraccion de las variables # echo Procesando ${FILEIN}

wgrib -s "${FILEIN}" | egrep "${VARIABLE_GRIB}" | wgrib -i -nh "${FILEIN}" -append -o "${FILEOUT}" > /dev/null else echo ${FILEIN} "no encontrado" salir=true break fi if (( ( $YR == ${YR2} ) && ( $MO == ${MO2} ) && ( $DY == ${DY2} ) && ( $HR == ${HR2} ) )) then salir=true echo Archivo ${FILEOUT} completo else let HR=$HR+6 if (( $HR > 18 )); then HR=00 let DY=$DY+1 if (( $DY > ${DIAS_MES[$MO]} )); then DY=01 let MO=$MO+1 if (( $MO > 12 )); then MO=01 let YR=$YR+1 if (( ( ( $YR % 4 == 0 ) && ( $YR % 100 != 0 ) ) || ( $YR % 400 == 0 ) )) then DIAS_MES[2]=29 else DIAS_MES[2]=28 fi fi fi fi fi done

Script: extraer_pp_wrfout

#!/bin/bash # Este script usa NetCDF operators (NCOs) # extrae las variables RAIN(N)C, I_RAIN(N)C desde # los archivos de salida wrfout* entre las fechas fecha1 y fecha2 # para un dominio dado, para el calculo posterior de la precipitacion. # # Uso: ./extraer_prec_wrf /ruta/a/los/wrfout fecha1 fecha2 dominio # if (($# != 4)); then echo "Argumentos incorrectos" echo "Uso: ./extraer_pp_wrfout /ruta/a/los/wrfout YYYY-MM-DY_HH YYYY-MM-DY_HH dominio " echo "Ejemplo: ./extraer_pp_wrfout /home/luis/data/PRUEBA 2023-01-10_00 2023-01-19_18 d01 " exit fi

RUTA_DATA=$1 DATE1=$2 DATE2=$3 DOMINIO=$4

YR1=${DATE1:0:4} MO1=$(( 10#${DATE1:5:2} )) DY1=$(( 10#${DATE1:8:2} )) HR1=$(( 10#${DATE1:11:2} ))

YR2=${DATE2:0:4} MO2=$(( 10#${DATE2:5:2} )) DY2=$(( 10#${DATE2:8:2} )) HR2=$(( 10#${DATE2:11:2} ))

LISTA_VARIABLES=( "RAINC" "I_RAINC" "RAINNC" "I_RAINNC") RUTA_VAR="."

DIAS_MES=( 0 31 28 31 30 31 30 31 31 30 31 30 31) ABRV_MES=( "" "JAN" "FEB" "MAR" "APR" "MAY" "JUN" "JUL" "AUG" "SEP" "OCT" "NOV" "DEC")

FILETMP="${RUTA_VAR}/temp.dat" for VARIABLE in "${LISTA_VARIABLES[@]}" do YR=${YR1} MO=${MO1} DY=${DY1} HR=${HR1} FILEOUT="${RUTA_VAR}/${VARIABLE}_${DATE1}_${DATE2}.dat" if [ -f "${FILEOUT}" ]; then rm -f "${FILEOUT}"; fi salir=false if (( ( ( $YR % 4 == 0 ) && ( $YR % 100 != 0 ) ) || ( $YR % 400 == 0 ) )) then DIAS_MES[2]=29 else DIAS_MES[2]=28 fi while ! ${salir}; do CADDY="$(printf "%.2d" "$DY")" CADMO="$(printf "%.2d" "$MO")" CADHR="$(printf "%.2d" "$HR")" FILEIN="${RUTA_DATA}/${YR}/wrfout_${DOMINIO}_${YR}-${CADMO}-${CADDY}_${CADHR}"":00:00" if [ -f "${FILEIN}" ]; then ### extraccion de las variables if [ -f "./foo.nc" ]; then rm -f "./foo.nc"; fi if [ -f "${FILETMP}" ]; then rm -f "${FILETMP}"; fi ncks -C -o "foo.nc" -v ${VARIABLE} -b "${FILETMP}" "${FILEIN}"

if [ -f "${FILEOUT}" ]; then cat "${FILETMP}" >> "${FILEOUT}" else cp "${FILETMP}" "${FILEOUT}" fi

else echo ${FILEIN} "no encontrado" salir=true break fi if (( ( $YR == ${YR2} ) && ( $MO == ${MO2} ) && ( $DY == ${DY2} ) && ( $HR == ${HR2} ) )) then salir=true echo Archivo ${FILEOUT} completo else let HR=$HR+6 if (( $HR > 18 )); then HR=00 let DY=$DY+1 if (( $DY > ${DIAS_MES[$MO]} )); then DY=01 let MO=$MO+1 if (( $MO > 12 )); then MO=01 let YR=$YR+1 if (( ( ( $YR % 4 == 0 ) && ( $YR % 100 != 0 ) ) || ( $YR % 400 == 0 ) )) then DIAS_MES[2]=29 else DIAS_MES[2]=28 fi fi fi fi fi done done if [ -f "${FILETMP}" ]; then rm -f "${FILETMP}"; fi if [ -f "./foo.nc" ]; then rm -f "./foo.nc"; fi

Script: escribe_ctl

#!/bin/bash # Escribe el archivo de control para binario # con data diaria, mensual o estacional # Uso: # ./escribe_ctl VAR AO1 AO2 RESOL_TEMPORAL DOMINIO VAR=$1 YR1=$2 YR2=$3 RESOL_TEMP=$4 DOM=$5

nombre_data="${VAR}_${RESOL_TEMP}_${YR1}_${YR2}" echo "dset ^${nombre_data}.dat" > ${nombre_data}.ctl echo "undef 9.999E+20" >> ${nombre_data}.ctl echo "title ${nombre_data}" >> ${nombre_data}.ctl case "$DOM" in "d01") echo "xdef 174 linear -106.026 0.472601156069364 " >> ${nombre_data}.ctl echo "ydef 199 levels " >> ${nombre_data}.ctl echo " -59.8040 -59.5655 -59.3252 -59.0832 -58.8396 -58.5942 -58.347 " >> ${nombre_data}.ctl echo " -58.0982 -57.8475 -57.5951 -57.3410 -57.0851 -56.8274 -56.5679 " >> ${nombre_data}.ctl echo " -56.3066 -56.0436 -55.7787 -55.5120 -55.2435 -54.9731 -54.7010 " >> ${nombre_data}.ctl echo " -54.4270 -54.1511 -53.8734 -53.5939 -53.3124 -53.0291 -52.7440 " >> ${nombre_data}.ctl echo " -52.4569 -52.1680 -51.8772 -51.5845 -51.2899 -50.9934 -50.6950 " >> ${nombre_data}.ctl echo " -50.3947 -50.0924 -49.7883 -49.4822 -49.1742 -48.8643 -48.5524 " >> ${nombre_data}.ctl echo " -48.2386 -47.9229 -47.6052 -47.2856 -46.9640 -46.6405 -46.3151 " >> ${nombre_data}.ctl echo " -45.9877 -45.6584 -45.3271 -44.9938 -44.6587 -44.3215 -43.9824 " >> ${nombre_data}.ctl echo " -43.6414 -43.2984 -42.9535 -42.6066 -42.2578 -41.9071 -41.5544 " >> ${nombre_data}.ctl echo " -41.1998 -40.8432 -40.4847 -40.1243 -39.7620 -39.3977 -39.0316 " >> ${nombre_data}.ctl echo " -38.6635 -38.2936 -37.9217 -37.5479 -37.1723 -36.7948 -36.4154 " >> ${nombre_data}.ctl echo " -36.0342 -35.6511 -35.2661 -34.8793 -34.4907 -34.1003 -33.7081 " >> ${nombre_data}.ctl echo " -33.3140 -32.9182 -32.5206 -32.1212 -31.7201 -31.3172 -30.9126 " >> ${nombre_data}.ctl echo " -30.5063 -30.0983 -29.6885 -29.2771 -28.8641 -28.4494 -28.0330 " >> ${nombre_data}.ctl echo " -27.6151 -27.1955 -26.7744 -26.3517 -25.9274 -25.5016 -25.0743 " >> ${nombre_data}.ctl echo " -24.6455 -24.2152 -23.7835 -23.3503 -22.9157 -22.4797 -22.0424 " >> ${nombre_data}.ctl echo " -21.6036 -21.1636 -20.7222 -20.2795 -19.8356 -19.3904 -18.9440 " >> ${nombre_data}.ctl echo " -18.4964 -18.0477 -17.5978 -17.1467 -16.6946 -16.2414 -15.7871 " >> ${nombre_data}.ctl echo " -15.3318 -14.8756 -14.4183 -13.9602 -13.5011 -13.0411 -12.5803 " >> ${nombre_data}.ctl echo " -12.1186 -11.6562 -11.1929 -10.7289 -10.2643 -9.7989 -9.3329 " >> ${nombre_data}.ctl echo " -8.8662 -8.3990 -7.9312 -7.4628 -6.9940 -6.5247 -6.0549 " >> ${nombre_data}.ctl echo " -5.5848 -5.1142 -4.6434 -4.1722 -3.7007 -3.2290 -2.7570 " >> ${nombre_data}.ctl echo " -2.2849 -1.8126 -1.3402 -0.8677 -0.3951 0.0775 0.5501 " >> ${nombre_data}.ctl echo " 1.0226 1.4951 1.9675 2.4398 2.9118 3.3837 3.8554 " >> ${nombre_data}.ctl echo " 4.3268 4.7979 5.2686 5.7390 6.2091 6.6787 7.1478 " >> ${nombre_data}.ctl echo " 7.6165 8.0847 8.5523 9.0194 9.4858 9.9516 10.4168 " >> ${nombre_data}.ctl echo " 10.8812 11.3449 11.8079 12.2701 12.7315 13.1921 13.6518 " >> ${nombre_data}.ctl echo " 14.1106 14.5684 15.0253 15.4813 15.9362 16.3902 16.8430 " >> ${nombre_data}.ctl echo " 17.2948 17.7455 18.1950 " >> ${nombre_data}.ctl ;; "d02") echo "ydef 327 levels" >> ${nombre_data}.ctl echo " -38.4180 -38.2945 -38.1707 -38.0468 -37.9226 -37.7982 -37.6736 " >> ${nombre_data}.ctl echo " -37.5488 -37.4238 -37.2986 -37.1732 -37.0476 -36.9217 -36.7957 " >> ${nombre_data}.ctl echo " -36.6694 -36.5430 -36.4163 -36.2894 -36.1623 -36.0351 -35.9076 " >> ${nombre_data}.ctl echo " -35.7799 -35.6520 -35.5238 -35.3955 -35.2670 -35.1383 -35.0094 " >> ${nombre_data}.ctl echo " -34.8802 -34.7509 -34.6214 -34.4916 -34.3617 -34.2315 -34.1012 " >> ${nombre_data}.ctl echo " -33.9706 -33.8399 -33.7089 -33.5778 -33.4464 -33.3149 -33.1831 " >> ${nombre_data}.ctl echo " -33.0512 -32.9191 -32.7867 -32.6542 -32.5214 -32.3885 -32.2554 " >> ${nombre_data}.ctl echo " -32.1221 -31.9886 -31.8548 -31.7209 -31.5868 -31.4525 -31.3181 " >> ${nombre_data}.ctl echo " -31.1834 -31.0485 -30.9134 -30.7782 -30.6428 -30.5071 -30.3713 " >> ${nombre_data}.ctl echo " -30.2353 -30.0991 -29.9627 -29.8261 -29.6894 -29.5524 -29.4153 " >> ${nombre_data}.ctl echo " -29.2780 -29.1405 -29.0028 -28.8649 -28.7269 -28.5886 -28.4502 " >> ${nombre_data}.ctl echo " -28.3116 -28.1728 -28.0339 -27.8947 -27.7554 -27.6159 -27.4762 " >> ${nombre_data}.ctl echo " -27.3364 -27.1963 -27.0561 -26.9157 -26.7752 -26.6345 -26.4935 " >> ${nombre_data}.ctl echo " -26.3525 -26.2112 -26.0698 -25.9282 -25.7864 -25.6445 -25.5024 " >> ${nombre_data}.ctl echo " -25.3601 -25.2177 -25.0751 -24.9323 -24.7894 -24.6463 -24.5030 " >> ${nombre_data}.ctl echo " -24.3596 -24.2160 -24.0722 -23.9283 -23.7843 -23.6400 -23.4956 " >> ${nombre_data}.ctl echo " -23.3511 -23.2064 -23.0615 -22.9165 -22.7713 -22.6260 -22.4805 " >> ${nombre_data}.ctl echo " -22.3348 -22.1890 -22.0431 -21.8970 -21.7507 -21.6044 -21.4578 " >> ${nombre_data}.ctl echo "-21.3111 -21.1643 -21.0173 -20.8702 -20.7229 -20.5755 -20.4279 " >> ${nombre_data}.ctl echo " -20.2802 -20.1324 -19.9844 -19.8363 -19.6880 -19.5396 -19.3911 " >> ${nombre_data}.ctl echo " -19.2424 -19.0936 -18.9447 -18.7956 -18.6464 -18.4971 -18.3477 " >> ${nombre_data}.ctl echo " -18.1981 -18.0483 -17.8985 -17.7485 -17.5984 -17.4482 -17.2978 " >> ${nombre_data}.ctl echo " -17.1474 -16.9968 -16.8461 -16.6952 -16.5443 -16.3932 -16.2420 " >> ${nombre_data}.ctl echo " -16.0907 -15.9393 -15.7878 -15.6361 -15.4843 -15.3325 -15.1805 " >> ${nombre_data}.ctl echo " -15.0284 -14.8762 -14.7239 -14.5715 -14.4189 -14.2663 -14.1136 " >> ${nombre_data}.ctl echo " -13.9608 -13.8078 -13.6548 -13.5017 -13.3484 -13.1951 -13.0417 " >> ${nombre_data}.ctl echo " -12.8882 -12.7346 -12.5808 -12.4270 -12.2732 -12.1192 -11.9651 " >> ${nombre_data}.ctl echo " -11.8110 -11.6567 -11.5024 -11.3480 -11.1935 -11.0389 -10.8842 " >> ${nombre_data}.ctl echo " -10.7295 -10.5747 -10.4198 -10.2648 -10.1097 -9.9546 -9.7994 " >> ${nombre_data}.ctl echo " -9.6441 -9.4888 -9.3334 -9.1779 -9.0223 -8.8667 -8.7110 " >> ${nombre_data}.ctl echo " -8.5553 -8.3995 -8.2436 -8.0877 -7.9317 -7.7756 -7.6195 " >> ${nombre_data}.ctl echo " -7.4633 -7.3071 -7.1508 -6.9945 -6.8381 -6.6816 -6.5252 " >> ${nombre_data}.ctl echo " -6.3686 -6.2120 -6.0554 -5.8987 -5.7420 -5.5852 -5.4284 " >> ${nombre_data}.ctl echo " -5.2716 -5.1147 -4.9578 -4.8008 -4.6438 -4.4868 -4.3297 " >> ${nombre_data}.ctl echo " -4.1726 -4.0155 -3.8583 -3.7011 -3.5439 -3.3866 -3.2294 " >> ${nombre_data}.ctl echo " -3.0721 -2.9147 -2.7574 -2.6000 -2.4426 -2.2852 -2.1278 " >> ${nombre_data}.ctl echo " -1.9704 -1.8129 -1.6555 -1.4980 -1.3405 -1.1830 -1.0255 " >> ${nombre_data}.ctl echo " -0.8680 -0.7105 -0.5530 -0.3954 -0.2379 -0.0804 0.0772 " >> ${nombre_data}.ctl echo " 0.2347 0.3922 0.5498 0.7073 0.8648 1.0223 1.1798 " >> ${nombre_data}.ctl echo " 1.3373 1.4948 1.6523 1.8098 1.9672 2.1246 2.2821 " >> ${nombre_data}.ctl echo " 2.4395 2.5968 2.7542 2.9116 3.0689 3.2262 3.3834 " >> ${nombre_data}.ctl echo " 3.5407 3.6979 3.8551 4.0123 4.1694 4.3265 4.4836 " >> ${nombre_data}.ctl echo " 4.6406 4.7976 4.9546 5.1115 5.2684 5.4252 5.5821 " >> ${nombre_data}.ctl echo " 5.7388 5.8955 6.0522 6.2089 6.3654 6.5220 6.6785 " >> ${nombre_data}.ctl echo " 6.8349 6.9913 7.1476 7.3039 7.4602 7.6163 7.7724 " >> ${nombre_data}.ctl echo " 7.9285 8.0845 8.2404 8.3963 8.5521 8.7079 8.8636 " >> ${nombre_data}.ctl echo " 9.0192 9.1748 9.3302 9.4857 9.6410 " >> ${nombre_data}.ctl echo " xdef 240 linear -90.588000 0.157535564853556" >> ${nombre_data}.ctl ;; esac num_yr=$(( ${YR2}+1 )) num_yr=`expr ${num_yr} - ${YR1}` num_est=$(( ${num_yr} * 4 )) num_meses=$(( ${num_yr} * 12 )) num_dias=0 for (( YR=${YR1}; YR> ${nombre_data}.ctl if [ "${VAR}" == "pp" ] || [ "${VAR}" == "temp2m" ] || [ "${VAR}" == "u10m" ] || [ "${VAR}" == "v10m" ] then

LINEA_LEVELS="1000" LINEA_ZDEF="zdef 1 levels "${LINEA_LEVELS} else LINEA_LEVELS="1000 975 950 925 900 875 850 825 800 775 750 700 650 600 550 500 450 400 350 300 250 200 150 100 50" LINEA_ZDEF="zdef 25 levels "${LINEA_LEVELS} fi echo "${LINEA_ZDEF}" >> ${nombre_data}.ctl echo "vars 1" >> ${nombre_data}.ctl case "${VAR}" in "pp") LINEA_VAR="pp 0 61,1,0 ** precipitation [kg/m^2]" ;; "rh") LINEA_VAR="rh 25 52,100,0 ** (profile) Relative humidity [%]" ;; "rh2m") LINEA_VAR="rh2m 0 52,105,2 ** 2 m above ground Relative humidity [%]" ;; "temp") LINEA_VAR="temp 25 11,100,0 ** (profile) Temp. [K]" ;; "temp2m") LINEA_VAR="temp2m 0 11,105,2 ** 2 m above ground Temp. [K]" ;; "u") LINEA_VAR="u 25 33,100,0 ** (profile) u wind [m/s]" ;; "v") LINEA_VAR="u 25 34,100,0 ** (profile) v wind [m/s]" ;; "u10m") LINEA_VAR="u10m 0 33,105,10 ** 10 m above ground u wind [m/s]" ;; "v10m") LINEA_VAR="v10m 0 34,105,10 ** 10 m above ground v wind [m/s]" ;; esac echo "${LINEA_VAR}" >> ${nombre_data}.ctl echo "endvars" >> ${nombre_data}.ctl

Programa: extraer_pp_wrfout.f90

program cambiar_escala_temporal implicit none INTEGER :: nx, ny, nz, yr1, yr2 character(len=80) :: ruta_datos, str_yr1, str_yr2, str_arg, var

!!! Uso del programa !!! cambiar_escala_temporal.exe /ruta/de/los/datos variable ao1 ao2 nx ny nz !!! Ejemplo: !!! cambiar_escala_temporal.exe /home/luis/data temp 1985 1987 174 199 25 !!! !!! La datos es leida desde un archivo binario con nombre variable_fechas.dat, !!! la informacion diaria, mensualizada y estacional es escrita en archivos binarios: !!! variable_diario_YYYY_YYYY.dat variable_mensual_YYYY_YYYY.dat variable_estacional_YYYYY_YYYY.dat integer, parameter :: nmaxarg = 7 integer :: narg !!! Validacion de argumentos narg = command_argument_count() if (narg/=nmaxarg) then write(*,*) "Uso del programa" write(*,*) " cambiar_escala_temporal.exe /ruta/de/la/datos variable ao1 ao2 nx ny nz" write(*,*) "Ejemplo:" write(*,*) " cambiar_escala_temporal.exe /home/luis/data temp 1985 1987 174 199 25" stop else CALL get_command_argument(1, RUTA_DATOS) CALL get_command_argument(2, VAR) CALL get_command_argument(3, STR_yr1) read(str_yr1,"(I4)") yr1 CALL get_command_argument(4, STR_yr2) read(str_yr2,"(I4)") yr2 CALL get_command_argument(5, STR_arg) read(str_arg,"(I4)") nx CALL get_command_argument(6, STR_arg) read(str_arg,"(I4)") ny CALL get_command_argument(7, STR_arg) read(str_arg,"(I4)") nz !!! Fin de validacion if (trim(var)=="pp") then call calcula_variable_pp(nx,ny,yr1,yr2,ruta_datos,var) else call promedia_variable(nx,ny,nz,yr1,yr2,ruta_datos,var) endif endif contains logical function es_bisiesto(yr) integer :: yr if (((mod(YR,4) == 0) .and. (mod(YR,100) /= 0)) .or. (mod(yr,400)==0)) then es_bisiesto =.true. else es_bisiesto=.false. endif endfunction

subroutine promedia_variable(nx,ny,nz,yr1,yr2,ruta_datos,var) implicit none integer, intent(in) :: nx,ny,nz,yr1,yr2 character(len=80),intent(in) :: ruta_datos, var integer :: i,j,k,t,d,m,s, dia, mes, est, yr, nt, num_dias, num_meses, num_estaciones, ierr character(len=80) :: arch_diario, arch_mensual, arch_estacional, fechas real, allocatable, dimension(:,:,:,:) :: datos, diario, mensual, estacional integer , dimension(12) :: DIAS_MES = (/ 31, 28, 31,30,31,30,31,31,30, 31,30, 31 /) !!! archivos de salida nt=124 num_dias=31 num_meses=12*(yr2-yr1+1)+1 num_estaciones=4*(yr2-yr1+1) do yr=yr1,yr2 if (es_bisiesto(yr)) then nt=nt+1464 num_dias=num_dias+366 else nt=nt+1460 num_dias=num_dias+365 endif enddo arch_diario=trim(var)//"_diario_"//trim(STR_YR1)//"_"//trim(STR_YR2)//".dat" arch_mensual=trim(var)//"_mensual_"//trim(STR_YR1)//"_"//trim(STR_YR2)//".dat" arch_estacional=trim(var)//"_estacional_"//trim(STR_YR1)//"_"//trim(STR_YR2)//".dat"

allocate(datos(nx,ny,nz,4)) allocate(mensual(nx,ny,nz,num_meses)) allocate(estacional(nx,ny,nz,num_estaciones))

write(fechas,'(I4,A10,I4,A9)') (YR1-1),"-12-01_00_",YR2,"-12-31_18"

!!! Calculo de la media mensual como el promedio de las medias diarias open(10,file=trim(ruta_datos)//"/"//trim(var)//"_"//trim(fechas)//".dat",FORM='UNFORMATTED',ACCESS='DIRECT',RECL=nx*ny*nz) open(20,file=trim(arch_diario),FORM='UNFORMATTED', ACCESS='DIRECT',RECL=nx*ny*nz) open(30,FILE=trim(arch_mensual),FORM='UNFORMATTED', ACCESS='DIRECT',RECL=nx*ny*nz) !!! el procesamiento se sigcia el mes de diciembre anterior al primer ao del periodo mes=12 yr=yr1-1 !! indices de las matrices t=1 d=1 do m=1,num_meses allocate(diario(nx,ny,nz,dias_mes(mes))) do dia=1,dias_mes(mes) do s=1,4 read (10,rec=t, iostat=ierr) (((datos(i,j,nz-k+1,s),i=1,nx),j=1,ny),k=1,nz) if (ierr/=0) then write(*,*) "Codigo de Error ",ierr write(*,*) "t=",t," s=",s, "dia=", dia, "mes=", mes, "m=", m stop endif t=t+1 enddo !!! Calculo de la media diaria como el promedio de la variable en 00,06,12,y 18 horas diario(:,:,:,dia)=0.25*sum(datos(:,:,:,:),4) !!! Almacenamos las media diarias if (d>31) write(20,rec=d-31) (((diario(i,j,k,dia),i=1,nx),j=1,ny),k=1,nz) !! write(*,*) d-31 d=d+1 enddo mensual(:,:,:,m)=sum(diario(:,:,:,:),4)/dias_mes(mes) if (m>1) write(30,rec=m-1) (((mensual(i,j,k,m),i=1,nx),j=1,ny),k=1,nz) deallocate(diario) mes=mes + 1 if (mes>12) then mes=1 yr=yr+1 if (es_bisiesto(yr)) then DIAS_MES(2)=29 else DIAS_MES(2)=28 endif endif enddo close(30) close(20) close(10) !!! Calculo de la media estacional como el promedio de la media en los trimestres DEF, MAM, JJA, SON est=1 do mes=1,num_meses-1,3 estacional(:,:,:,est)=0.333333*sum(mensual(:,:,:,mes:mes+2),4) est=est+1 enddo deallocate(mensual) open(40,file=trim(arch_estacional),FORM='UNFORMATTED', ACCESS='DIRECT',RECL=nx*ny*nz) do est=1,num_estaciones write(40,rec=est) (((estacional(i,j,k,est),i=1,nx),j=1,ny),k=1,nz) enddo close(40) deallocate(estacional)

end subroutine

subroutine calcula_variable_pp(nx,ny,yr1,yr2,ruta_datos,var) implicit none integer, intent(in) :: nx,ny,yr1,yr2 character(len=80),intent(in) :: ruta_datos, var integer :: i,j,k,t,d,m,s, ant,sig, dia, mes, est, yr, nt, num_dias, num_meses, num_estaciones character(len=80) :: arch_diario, arch_mensual, arch_estacional, fechas real, allocatable, dimension(:,:,:) :: rainc, rainnc, diario, mensual, estacional integer, allocatable, dimension(:,:,:) :: i_rainc, i_rainnc integer , dimension(12) :: DIAS_MES = (/ 31, 28, 31,30,31,30,31,31,30, 31,30, 31 /) REAL, parameter :: BUCKET_MM=100.0 !!! archivos de salida nt=125 num_dias=31 num_meses=12*(yr2-yr1+1)+1 num_estaciones=4*(yr2-yr1+1) do yr=yr1,yr2 if (es_bisiesto(yr)) then nt=nt+1464 num_dias=num_dias+366 else nt=nt+1460 num_dias=num_dias+365 endif enddo arch_diario=trim(var)//"_diario_"//trim(STR_YR1)//"_"//trim(STR_YR2)//".dat" arch_mensual=trim(var)//"_mensual_"//trim(STR_YR1)//"_"//trim(STR_YR2)//".dat" arch_estacional=trim(var)//"_estacional_"//trim(STR_YR1)//"_"//trim(STR_YR2)//".dat"

allocate(rainc(nx,ny,2)) allocate(rainnc(nx,ny,2)) allocate(i_rainc(nx,ny,2)) allocate(i_rainnc(nx,ny,2)) allocate(mensual(nx,ny,num_meses)) allocate(estacional(nx,ny,num_estaciones))

write(fechas,'(I4,A10,I4,A9)') (YR1-1),"-12-01_00_",(YR2+1),"-01-01_00"

!!! Calculo de la media mensual como el promedio de las medias diarias open(10,file=trim(ruta_datos)//"/RAINC_"//trim(fechas)//".dat",FORM='UNFORMATTED',ACCESS='DIRECT',RECL=nx*ny) open(11,file=trim(ruta_datos)//"/RAINNC_"//trim(fechas)//".dat",FORM='UNFORMATTED',ACCESS='DIRECT',RECL=nx*ny) open(12,file=trim(ruta_datos)//"/I_RAINC_"//trim(fechas)//".dat",FORM='UNFORMATTED',ACCESS='DIRECT',RECL=nx*ny) open(13,file=trim(ruta_datos)//"/I_RAINNC_"//trim(fechas)//".dat",FORM='UNFORMATTED',ACCESS='DIRECT',RECL=nx*ny)

open(20,file=trim(arch_diario),FORM='UNFORMATTED', ACCESS='DIRECT',RECL=nx*ny) open(30,FILE=trim(arch_mensual),FORM='UNFORMATTED', ACCESS='DIRECT',RECL=nx*ny) !!! el procesamiento se inicia el mes de diciembre anterior al primer ao del periodo mes=12 yr=yr1-1 !! indices de las matrices t=1 d=1 sig=1 s=0 read (10,rec=t) ((rainc(i,j, sig),i=1,nx),j=1,ny) read (11,rec=t) ((rainnc(i,j, sig),i=1,nx),j=1,ny) read (12,rec=t) ((i_rainc(i,j, sig),i=1,nx),j=1,ny) read (13,rec=t) ((i_rainnc(i,j, sig),i=1,nx),j=1,ny) t=t+4 ant=sig sig=sig+1 do m=1,num_meses allocate(diario(nx,ny,dias_mes(mes))) diario(:,:,:)=0 do dia=1,dias_mes(mes) if (sig>2) sig=1 read (10,rec=t) ((rainc(i,j, sig),i=1,nx),j=1,ny) read (11,rec=t) ((rainnc(i,j, sig),i=1,nx),j=1,ny) read (12,rec=t) ((i_rainc(i,j, sig),i=1,nx),j=1,ny) read (13,rec=t) ((i_rainnc(i,j, sig),i=1,nx),j=1,ny) !! Calculo de la precipitacion diaria

diario(:,:,dia)=diario(:,:,dia) + (I_RAINNC(:,:,sig)-I_RAINNC(:,:,ant))*bucket_mm + & RAINNC(:,:,sig) - RAINNC(:,:,ant) + (I_RAINC(:,:,sig)-I_RAINC(:,:,ant))*bucket_mm + & RAINC(:,:,sig) - RAINC(:,:,ant) t=t+4 ant=sig sig=sig+1 !!! Almacenamos las media diarias if (d>31) write(20,rec=d-31) ((diario(i,j,dia),i=1,nx),j=1,ny) d=d+1 enddo mensual(:,:,m)=sum(diario(:,:,:),3) if (m>1) write(30,rec=m-1) ((mensual(i,j,m),i=1,nx),j=1,ny) deallocate(diario) mes=mes + 1 if (mes>12) then mes=1 yr=yr+1 if (es_bisiesto(yr)) then DIAS_MES(2)=29 else DIAS_MES(2)=28 endif endif enddo close(30) close(20) close(10) !!! Calculo de la media estacional como el promedio de la media en los trimestres DEF, MAM, JJA, SON est=1 do mes=1,num_meses-1,3 estacional(:,:,est)=sum(mensual(:,:,mes:mes+2),3) est=est+1 enddo deallocate(mensual) open(40,file=trim(arch_estacional),FORM='UNFORMATTED', ACCESS='DIRECT',RECL=nx*ny*nz) do est=1,num_estaciones write(40,rec=est) ((estacional(i,j,est),i=1,nx),j=1,ny) enddo close(40) deallocate(estacional)

end subroutine

end