Académique Documents
Professionnel Documents
Culture Documents
1.
El pasado
2.
El presente
2.1.
Reanalisis del NCEP/NCAR http://www.cdc.noaa.gov/cdc/reanalysis/reanalysis.shtml Reanalisis del ECMWF http://www.ecmwf.int http://data.ecmwf.int/data/d/era40_daily/ Otros repositorios: British Atmospheric Data Centre http://badc.nerc.ac.uk/home/ IPCC Data Distribution Centre http://ipcc-ddc.cru.uea.ac.uk/ Jet Propulsion Laboratory, en CalTech www.jpl.nasa.gov UCAR, University Consortium for Atmospheric Research dss.ucar.edu
USGS, US Geological Survey http://www.usgs.gov/pubprod/digitaldata.html Proyectos especificos GEWEX - Global Energy and Water Exchange www.gewex.org IGBP, International Geosphere-Biosphere Program http://www.igbp.kva.se/cgi-bin/php/frameset.php
GOOGLE/Yahoo/....
2.2.
Ventajas
El dato num rico permite sacar el mapa mediante un programa de visualizaci n (ej, Z850 e o hPa). Adem s, a partir del dato num rico se pueden sacar mapas adicionales de otras magnitudes a e derivadas, sencillas (p. ej. espesor Z500-Z850) o complejas (p. ej. vorticidad potencial).
2.3.
Problemas varios
1. Representaci n digital de n meros (Int, Float) o u 2. Bigendian y Littleendian Alpha-DECIntel-Linu MacOSX SiliconGra Alpha-DECIntel-Linu MacOSX SiliconGra Int16: Int16: Int16: Int16: Int32: Int32: Int32: Int32: 1 1 1 1 8 8 8 8 : : : : : : : : 10000000 10000000 00000000 00000000 00010000 00010000 00000000 00000000 00000000 00000000 10000000 10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
: : : :
25 3
37 17
33 33
9 25
25 37
3 9
37 3
17 17
C:
2.4.
1. Datos crudos, sin estructurar ASCII Binario XDR 2. Datos estructurados (Cabecera + datos) Formatos especicos (p. ej. METAR) Formatos de uso m s general: a netCDF HDF GRIB XML
2.5.
1. Espacio de almacenamiento 2. Facilidad de uso a) Disponibilidad en diversos S.O b) Disponibilidad en diversas plataformas de computaci n o c) Necesidad de elementos externos y/o licencias. 4
3.
3.1.
UNIX
Porqu UNIX? e
1. Porque es el m s usado en universidades, centros de investigaci n y predicci n. a o o 2. Porque hay mucho software especco para la climatologa 3. Porque hay mucho software gratis 4. Porque es muy potente (Ej. scripts de shell, awk, etc...)
3.2.
3.3.
Comandos seleccionados
man/apropos/info/whatis mkdir rm chmod cd ls mv lpr ps kill exit clear reset cat y more le startx Ctrl+Alt+Tab Informaci n (man man) o Crear un directorio (man mkdir) Eliminar un archivo Modicar los permisos Cambiar de directorio Listar el contenido de un directorio Renombrar un archivo/Moverlo a otra ubicaci n o Imprimir un archivo en una cola Ver los procesos activos Matar un proceso activo (enviarle una se al) n Abandonar la sesi n o Borrar pantalla Restaurar terminal ver contenido de cheros de texto (cat ficheron|more) Ver el tipo de un chero Arrancar el modo gr co a Acabar con el modo gr co a
3.4.
Otros detalles
1. Ficheros ocultos 2. Ficheros de inicializaci n o 3. Variables de entorno (HOME, PATH, DISPLAY,...) 4. wildcards 5. Control de procesos: a) at b) bg, fg c) nice
4.
Ficheros netCDF
Porqu escogemos cheros netCDF? netCDF (network Common Data Form) es un formato e muy com n con grandes ventajas: u 1. Representaci n binaria independiente de la m quina o a 2. Con convenciones, los cheros tienen una cabecera que dene los datos 3. Soportado por la mayora de software de representaci n y tratamiento de datos o 4. Soportado por una de las instituciones americanas de mayor importancia en el campo de la meteorologa
http://www.unidata.ucar.edu/packages/netcdf/index.html
Ejemplo de datos netCDF gratuitos (uso no comercial). 1. Variables atmosf ricas de los rean lisis del NCEP e a
http://www.cdc.noaa.gov/cdc/reanalysis/
4.1.
Otros sistemas
netCDF no es el unico sistema est ndar de archivo de datos meteorol gicos: a o a GRIB en los Rean lisis del ECMWF
http://www.ecmwf.int
GRIB en los Rean lisis del NCEP (CDROM) a HDF en mucha informaci n satelitaria de radiaci n. o o
http://www.archive.arm.gov/data/hdfnews.html
Otros formatos ASCII o binarios Por razones de tiempo, nosotros solamente vamos a ver el tratamiento de datos en formato netCDF, pero el alumno puede ver la manera de trabajar con datos GRIB o HDF en las fuentes originales: 1. HDF (Hierarchical Data Format)
http://hdf.ncsa.uiuc.edu/
4.2.
Un chero netCDF (fichero.nc o fichero.cdf) es binario. Por tanto, no es posible ver directamente su contenido. Pero se puede convertir su contenido a una representaci n ASCII o relativamente comprensible para un humano.
ncdump -h /home/jsaenz/meteoclimadata/olrdata.nc
Tambien se puede convertir por completo el chero en un chero ASCII (CDL) a costa de gastar mucho mas espacio de disco:
ncdump /home/jsaenz/meteoclimadata/olrdata.nc > olrdata.cdl ls -l /home/jsaenz/meteoclimadata/olrdata.nc olrdata.cdl |awk {printf("%d %s\n",$5,$9 rm -f olrdata.cdl
4.3.
netcdf olrdata { dimensions: lat = 73 ; lon = 144 ; time = UNLIMITED ; // (300 currently) variables: float lat(lat) ; lat:title = "Latitude" ; lat:units = "degrees_north" ; lat:scale_factor = 1.f ; lat:add_offset = 0.f ; float lon(lon) ; lon:title = "Longitude" ; lon:units = "degrees_east" ; lon:scale_factor = 1.f ; lon:add_offset = 0.f ; double time(time) ; time:title = "Time" ; time:units = "hours since 1974-01-15 0:0:0" ; time:scale_factor = 1.f ; time:add_offset = 0.f ; short data(time, lat, lon) ; data:long_name = "W m-2" ; data:add_offset = 200.f ; data:scale_factor = 0.01f ; data:missing_value = 32767s ; data:units = "W m-2" ; }
netcdf slp.mon.mean { dimensions: lon = 144 ; lat = 73 ; time = UNLIMITED ; // (643 currently) variables: float lat(lat) ; lat:units = "degrees_north" ; lat:actual_range = 90.f, -90.f ; lat:long_name = "Latitude" ; float lon(lon) ; lon:units = "degrees_east" ; lon:long_name = "Longitude" ; lon:actual_range = 0.f, 357.5f ; double time(time) ; time:units = "hours since 1-1-1 00:00:0.0" ; time:long_name = "Time" ; time:actual_range = 17067072., 17536032. ; time:delta_t = "0000-01-00 00:00:00" ; time:prev_avg_period = "0000-00-00 06:00:00" ; float slp(time, lat, lon) ; slp:long_name = "Sea Level Pressure" ; slp:valid_range = 870.f, 1150.f ; slp:actual_range = 962.8222f, 1082.558f ; slp:units = "millibars" ; slp:add_offset = 0.f ; slp:scale_factor = 1.f ; slp:missing_value = -9.96921e+36f ; slp:precision = 1s ; slp:least_significant_digit = 1s ; slp:var_desc = "Sea Level Pressure\n", "P" ; slp:dataset = "CDC Derived NCEP Reanalysis Products\n", "AC" ; slp:level_desc = "Sea Level\n", "I" ; slp:statistic = "Mean\n", "M" ; slp:parent_stat = "Other\n", "-" ;
// global attributes: :title = "monthly mean slp from the NCEP Reanalysis" ; :history = "Thu May 4 18:12:35 2000: ncrcat -d time,0,622 /Datasets/ncep.reanalys "Mon Jul 5 23:22:35 1999: ncrcat slp.mon.mean.nc /Datasets/ncep.reanalysis.derive "/home/hoop/crdc/cpreanjuke2farm/cpreanjuke2farm Thu Oct 26 23:42:16 1995 from pre "created 95/02/06 by Hoop (netCDF2.3)" ; :description = "Data is from NMC initialized reanalysis\n", "(4x/day). These are the 0.9950 sigma level values." ; :platform = "Model" ; :Conventions = "COARDS" ; }
4.4.
4.5.
Convenciones netCDF
Un chero netCDF puede tener estructuras arbitrarias y cada programa sabr como interpretarlo. a
netcdf IPtopo { dimensions: side = 2 ; xysize = 21901 ; variables: double x_range(side) ; x_range:units = "user_x_unit" ; double y_range(side) ; y_range:units = "user_y_unit" ; double z_range(side) ; z_range:units = "user_z_unit" ; double spacing(side) ; int dimension(side) ; float z(xysize) ; z:scale_factor = 1. ; z:add_offset = 0. ; z:node_offset = 0 ; // global attributes: :title = "surface" ; }
netcdf pl1+2pdf { dimensions: dimx = 161 ; dimy = 161 ; variables: double X(dimx) ; double Y(dimy) ; double PDF(dimx, dimy) ; // global attributes: :Bandwidth = "1.26336" ; }
En meteorologa, los programas de visualizaci n interpretan habitualmente las convenciones o COARDS: Variables coordenadas: Latitud, longitud, tiempo, nivel
10
4.6.
1. NcView http://meteora.ucsd.edu/pierce/ncview_home_page.html 2. GrADS http://grads.iges.org/grads/ 3. Python y Scientic Python http://www.python.org 4. CDAT http://www-pcmdi.llnl.gov/software/cdat/ 5. Ferret http://ferret.wrc.noaa.gov/Ferret/ 6. Freud http://www.atmos.washington.edu/jisao/freud 7. NCO http://nco.sourceforge.net 8. IBM DataExplorer http://www.research.ibm.com/dx/ 9. Vis5D http://www.ssec.wisc.edu/billh/vis5d.html Nosotros vamos a centrarnos en el uso del programa GrADS. Existe documentaci n sobre el o uso de este programa en la p gina WEB correspondiente: a
http://grads.iges.org/grads/
11
5.
Python (http://www.python.org) es un lenguaje de programaci n interpretado de ultio ma generaci n, orientado a objetos, con acceso a libreras de uso general (desde sistemas de mano tenimiento de servidores WWW hasta libreras de manejo de arm nicos esf ricos como SPHERE o e PACK. Es un lenguaje en la lnea de otros como matlab, pero frente a este, es de uso libre. Frente a otros lenguajes m s tradicionales (C, Fortran), es de uso mucho m s sencillo. a a Ejemplos de funciones en C para cargar datos de cheros netCDF:
#include #include #include #include #include <stdio.h> <string.h> <stdlib.h> <netcdf.h> <gsl/gsl_vector.h>
void __check_nc_error( int err , char *file , int lineno ) { if(err!=NC_NOERR){ fprintf(stderr,"Error %d writing netCDF file:\nLine:%d\nFile:%s\n",err, lineno,file); fprintf(stderr,"Error message:%s\n",nc_strerror(err)); exit(1); } } int save_date_string( int ncid , char *attrname , char *datestr ) { int status; status=nc_put_att_text(ncid,NC_GLOBAL,attrname,strlen(datestr), datestr); check_nc_error(status); return status == NC_NOERR; } long get_dim_value( int ncid , char *dimname ) { int dimid; int status; size_t thesize; status=nc_inq_dimid(ncid,dimname,&dimid); check_nc_error(status); status=nc_inq_dimlen(ncid,dimid,&thesize); check_nc_error(status); return (long)thesize; } int read_vector(int ncid, char *varname, gsl_vector *v ) { int status; int varid; size_t count[1]; size_t start[1]; double *dptr;
12
Ventajas: Es interpretado y es f cil buscar un error en forma interactiva. a El c digo se escribe muy f cil. o a Las extensiones num ricas hacen que la velocidad de ejecuci n sea aceptable, excepto pae o ra aquellos trabajos que no se adec en al esquema de funcionamiento puramente matriu cial/vectorial. Es f cilmente extensible mediante libreras din micas escritas en C o Fortran para los traa a bajos m s pesados. a Es muy potente para uso general adicional al c lculo. a
5.1.
13
# definamos una funcion para leer una tabla de datos # (matriz bidimensional) def tokens2list(toks): elist=[] for i in xrange(len(toks)): elist.append(eval(toks[i])) return elist def readdat(filename): ifile=open(filename) data=[] for l in ifile.readlines(): toks=l.split() if len(toks)>0: data.append(tokens2list(toks)) return data print readdat("ejemplo.dat")
Resultados:
[[1, 0.10000000000000001, 2], [2, 0.01, 4], [3, 0.001, 8], [4, 0.0001, 16], [5, 1.0000
Pero es interesante en este tipo de cheros ASCII a adir algunos comentarios que describan n lo que es cada columna y as.
# # # # 1 2 3 4 5 i 10{-i} 2i Comentario util (identificar fuente de datos, condiciones de la simulacion, unidades o contenido de cada columna, etc...) 0.1 2 .01 4 .001 8 .0001 16 .00001 32
14
Resultados:
[[1, 0.10000000000000001, 2], [2, 0.01, 4], [3, 0.001, 8], [4, 0.0001, 16], [5, 1.0000
Y es a n m s interesante devolver los resultados en forma de array num rico: Se puede leer u a e mediante el programa:
# definamos una funcion para leer una tabla de datos # (matriz bidimensional) # Agnade la vuelta como un array de datos de tipo Numeric import Numeric def tokens2list(toks): elist=[] for i in xrange(len(toks)): elist.append(eval(toks[i])) return elist def readdat(filename): ifile=open(filename) data=[] for l in ifile.readlines(): toks=l.split() if len(toks)>0: if toks[0][0]=="#": continue else: data.append(tokens2list(toks)) return Numeric.array(data) print readdat("ejemplo2.dat")
Resultados:
[[ [ [ [ [ 1.00000000e+00 2.00000000e+00 3.00000000e+00 4.00000000e+00 5.00000000e+00 1.00000000e-01 1.00000000e-02 1.00000000e-03 1.00000000e-04 1.00000000e-05 2.00000000e+00] 4.00000000e+00] 8.00000000e+00] 1.60000000e+01] 3.20000000e+01]]
5.2.
Salida de datos
Para comunicar datos al usuario se pueden sacar por salida est ndar o grabar en un chero: a
# print es facil de usar # Salvo que se cambien las cosas, saca # los valores por salida estandar # sin formatear print 5 i=10.4e-25
15
b=.098 print i,b print "Hola" c="Adios" print "hola"+c print "Hola "*4 # Pero tambien es posible formatear la salida ####################################### print "%12.3f %12.3e %6.6d %6d"%(b,b,10,10)
# write() se usa tras abrir un fichero # El formato de la salida se controla ###################################### ofile=open("ejemplo.write","w") ofile.write("%d\n"%(5,)) ofile.write("%s-%s-%s"%("Hola",c,c)) ofile.write("\n\n"*2) entero=12 real=12.5674123 s1="String" s2="*"*12 ofile.write("%d %f %12.3f|%10s|%-10s|%s\n"%(entero,real,real,s1,s1,s2)) ofile.close()
10
12 12.567412
12.567|
String|String
|************
5.3.
En esta script se demuestra c mo es posible crear cheros ASCII, binarios nativos de la platao forma donde se ejecuta el c digo y binarios netCDF: o
import struct ######## # Ficheros tipo ASCII # Cada caracter de una cadena, numero, lo que sea, se # representa tal cual se escribe. #
16
# Exigen mucho espacio y tiempo de CPU, pero se # interpretan y analizan bien, y son comunes en # "todas" las maquinas. ################## ofile=open("ejemplo.ascii","w") ofile.write("%f %f %d %f %f %f\n"%(3.51234,123673.6,3000,10009.0,10000.001,0.0001)) ofile.close()
######## # Ficheros binarios # Cada variable se representa por la sucesion de bits que # se emplea en la memoria y el procesador. # # Exigen mucho menos espacio y tiempo de CPU, pero NO se # interpretan y analizan bien, y NO son comunes en # "todas" las maquinas. ################## string_data=struct.pack("ddiddd",3.51234,123673.6,3000,10009.0,10000.001,0.0001) ofile=open("ejemplo.binario","w") ofile.write(string_data) ofile.close()
########################################## # Otros tipos de archivos mas complejos # Tienen las ventajas de ocupar el tamagno # de los ficheros binarios, pero son compatibles # entre maquinas incompatibles ############################################ from Scientific.IO.NetCDF import * from Numeric import * onc=NetCDFFile("ejemplo.cdf","w") onc.createDimension("iitems",1) onc.createVariable("entera",Int,("iitems",)) onc.variables["entera"][0]=3 onc.createDimension("fitems",5) onc.createVariable("real",Float64,("fitems",)) onc.variables["real"][0]=3.5 ovar=onc.variables["real"] ovar[1]=3.6 ovar[2]=9.0 ovar[3]=10000.001 ovar[4]=0.0001 onc.close()
5.4.
Control de ujo
18
# Salir de ciclos o permanecer en ellos: break y continue # % es el operador modulo print "12%24=",12%24,", 6%3=",6%3,", 4%3=",4%3 i=1 while 1: if i==10: break if i%2==0: print i,"es par" else: print i,"es impar" i+=1 print
Resultados:
A!=0 A es exactamente 1 A NO es 2 A pertenece a (0,3] He pasado 0 1 | 1 3 | 2 5 | 3 7 | 4 9 | 5 11 | 6 13 | 7 15 | 8 17 | 9 19 | E - s - t - o - e - s - u - n - a - s - t - r - i - n - g 1 - 3 - 5 - 7 - 9 - 11 0 : Cero - 1 : Uno - 2 : Tres 0.0 | 2.5 | 5.0 | 7.5 | 12%24= 12 , 6%3= 0 , 4%3= 1 1 es impar 2 es par 3 es impar 4 es par 5 es impar 6 es par 7 es impar 8 es par 9 es impar
5.5.
En este codigo se calcula una sinusoide por el m todo normal de control de ujo (ciclos) y e mediante el uso de funciones sobre arrays num ricos: e
# Dos alternativas para calcular cosas, CON y SIN Numeric import time import Numeric import math import profile
# Vamos a calcular una sinusoidal sin(w*t_i+phi) para 50000 puntos # Y devolvemos los valores def sinusoide_sin_N(): omega=0.234
19
phi=.98 dt=0.001 y=[] for i in xrange(500000): ti=i*dt y.append(math.sin(omega*ti+phi)) return y # Y ahora, haciendo uso de "vectores" (arange es otro interes...) ################################################################# def sinusoide_con_N(): omega=0.234 phi=.98 dt=0.001 ts=Numeric.arange(0.,500000*dt+dt/2.,dt) ############################################ # Numeric.sin() y math.sin() NO son lo mismo ############################################ y=Numeric.sin(omega*ts+phi) return y def main(): sinusoide_sin_N() sinusoide_con_N() profile.run(main())
20
# Empezamos a medir el tiempo # t0 = times()[-1] # # Calculo de la derivada 1 # # Usamos arrays de Numeric, pero no aprovechamos su potencial # dys_1 = zeros((nx,), Float32) for i in range(1,len(xs)-1): dys_1[i] = (ys[i+1] - ys[i-1]) / (xs[i+1] - xs[i-1]) # # Tiempo! # t1 = times()[-1] print "t1 =", t1 - t0 # # Calculo de la derivada 2 # # Usamos arrays de Numeric y aprovechamos su potencial # xsp1 = xs[2:] xsm1 = xs[:-2] xs = xs[1:-1] ysp1 = ys[2:] ysm1 = ys[:-2] ys = ys[1:-1] dys_2 = (ysp1 - ysm1) / (xsp1 - xsm1) # # Tiempo! # t2 = times()[-1] print "t2 =", t2 - t1 # # Comprobamos que el resultado es el mismo # print " x y dy1 dy2" print "---- " * 4 for i in range(20): print "%4.2f %4.2f %4.2f %4.2f" % (xs[i], ys[i], dys_1[i+1], dys_2[i])
21
0.70 0.80 0.90 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00
0.49 0.64 0.81 1.00 1.21 1.44 1.69 1.96 2.25 2.56 2.89 3.24 3.61 4.00
1.40 1.60 1.80 2.00 2.20 2.40 2.60 2.80 3.00 3.20 3.40 3.60 3.80 4.00
1.40 1.60 1.80 2.00 2.20 2.40 2.60 2.80 3.00 3.20 3.40 3.60 3.80 4.00
Por ello, en muchos casos, hay que pensar en nuevas maneras de calcular cantidades tpicas de, por ejemplo, la estadstica b sica. a
from Numeric import * from RandomArray import normal # # Distribucion normal aleatoria # 0.4 -> media # 0.7 -> desviacion estandar # 1000 -> numero de elementos (forma del array) # nor = normal(0.4, 0.7, (1000,)) nelems = float(len(nor)) print print "media" med = add.reduce(nor) / nelems print med print print "varianza" var = add.reduce((nor-med)**2) / nelems print var print print "desvacion estandar" std = sqrt(var) print std nor2 = normal(0.4, 0.7, (1000,)) med2 = add.reduce(nor2) / nelems std2 = sqrt(add.reduce((nor2-med2)**2) / nelems) print print "correlacion" print add.reduce((nor-med)*(nor2-med2)) / (nelems * std * std2)
22
Resultado:
media 0.407146954524 varianza 0.474909340305 desvacion estandar 0.689136663011 correlacion 0.0521791057784
5.6.
Algebra lineal
Hay libreras escritas en forma nativa en C o Fortran para las funciones matem ticas m s avan a a zadas, como algebra lineal (en el ejemplo presentado), FFT, n meros aleatorios para simulaciones u Monte Carlo, etc...
from Numeric import * from LinearAlgebra import inverse, eigenvalues, eigenvectors, singular_value_decomposi from pprint import pprint A = array( [[1, 0, 1], [0, -1, 1], [1, 0, -1]] ) b = array([1, 0, 0]) b.shape = (3,1) print print "A" print A print print "b" print b print print "I" print identity(3) print print "Ab" print dot(A,b) print print "Ax = b ==> x = Ab" print dot(inverse(A), b)
23
print print "Normalizar A" print A / sqrt(add.reduce(A*A)) print print "Valores y vectores propios de A" autoval, autovec = eigenvectors(A) print autoval print autovec print print "Comprobacion: Av1 = l1 v1 = -1 v1" print dot(A, autovec[0]) print print "SVD de A" pprint(singular_value_decomposition(A))
Resultados:
A [[ 1 0 1] [ 0 -1 1] [ 1 0 -1]] b [[1] [0] [0]] I [[1 0 0] [0 1 0] [0 0 1]] Ab [[1] [0] [1]] Ax [[ [ [ = b ==> 0.5] 0.5] 0.5]] x = Ab
24
[-0.15655801 -0.91248696
0.37796447]]
Comprobacion: Av1 = l1 v1 = -1 v1 [ 0. -1. 0.] SVD de A (array([[-0.5 , -0.70710678, -0.5 ], [-0.70710678, 0. , 0.70710678], [ 0.5 , -0.70710678, 0.5 ]]), array([ 1.84775907, 1.41421356, 0.76536686]), array([[ 0. , 0.38268343, -0.92387953], [-1. , -0. , -0. ], [ 0. , -0.92387953, -0.38268343]]))
5.7.
En este ejemplo trivial, hay una lista de objetos (crculos, cuadrados, tri ngulos) que comparten a una funci n com n (su area) pero cada instancia (elemento concreto de la lista) sabe c mo se o u o calcula en su caso:
# Clases, ejemplo trivial import math class Figura: def yo_soy(self): return self.nombre class Circulo(Figura): def __init__(self,radio): self.nombre="Circulo de radio:%g"%(radio,) self.radio=radio def area(self): return math.pi*self.radio*self.radio class Cuadrado(Figura): def __init__(self,lado): self.nombre="Cuadrado de lado:%g"%(lado,) self.lado=lado def area(self): return self.lado*self.lado class Triangulo(Figura): def __init__(self,base,altura): self.nombre="Triangulo de base y altura:%g %g"%(base,altura) self.base=base self.altura=altura def area(self): return self.base*self.altura*0.5
25
for fig in lista_figuras: area=fig.area() total+=area print fig.yo_soy(),"Area:",area,"m2" return total if __name__=="__main__": lista_figuras=[ Circulo(4.5), Cuadrado(3.9), Cuadrado(2.5), Triangulo(8.,9.) ] print "Area total: %g m2"%(area_total(lista_figuras),)
Resultado:
Circulo de radio:4.5 Area: 63.6172512352 m2 Cuadrado de lado:3.9 Area: 15.21 m2 Cuadrado de lado:2.5 Area: 6.25 m2 Triangulo de base y altura:8 9 Area: 36.0 m2 Area total: 121.077 m2
5.8.
from Scientific.IO.NetCDF import * from Numeric import * from pprint import pprint # Abrir un fichero para LECTURA ############################### inc=NetCDFFile("/home/jsaenz/meteoclimadata/pressure/hgt.mon.mean.nc") # Lista de variables con informacion extra (no sabemos como se llaman) ###################################################################### keys=inc.variables.keys() keys.sort() print "Lista de variables (nombre, dimensiones, tipo:" for k in keys: print k, print inc.variables[k].shape, print inc.variables[k].typecode() # Cargar las variables coordenadas en arrays de Numeric ############################# # Esta, en su precision original lats=array(inc.variables["lat"][:]) # Esta, en doble precision lons=array(inc.variables["lon"][:],Float64) # Numero de registros temporales records_A=inc.variables["hgt"].shape[0] records_B=inc.dimensions["time"] records=len(inc.variables["hgt"])
26
# El metodo B no funciona en dimensiones de tipo NONE!! print records, records_A, records_B # Calculo de la media temporal de la media zonal de # Z en los meses de enero (el fichero empieza en el registro 0) ################################################################# hgt=inc.variables["hgt"] avezonal=zeros((hgt.shape[1],hgt.shape[2]),Float64) count=0 for i in xrange(0,records,12): zonal=add.reduce(hgt[i,:,:,:],2)/hgt.shape[3] avezonal=zonal+avezonal count+=1 avezonal=avezonal/count print "Forma de la media zonal:", print avezonal.shape,"=(",inc.dimensions["level"],",",len(lats),")???" # Valor de la serie temporal en un punto, nivel 11 print "Nivel:",inc.variables["level"][10],"hPa" print "Latitud:",lats[20],"N" print "Longitud:",lons[79],"E" serie=hgt[:,10,20,79] Lista de variables (nombre, dimensiones, tipo: hgt (659, 17, 73, 144) f lat (73,) f level (17,) f lon (144,) f time (659,) d 659 659 None Forma de la media zonal: (17, 73) =( 17 , 73 )??? Nivel: 150.0 hPa Latitud: 40.0 N Longitud: 197.5 E
27
6.
6.1.
Gr cos a
Gr cos de datos 1-D a
Se recomienda por su sencillez y potencia el uso del programa gnuplot, disponible de forma p blica para muchas plataformas diferentes (www.gnuplot.info). Sus instrucciones se pueu den dar en forma de comandos interactivos o en forma de cheros de instrucciones secuenciales que generan un archivo gr co (es programable). a 6.1.1. Gr co de lneas a Dibujo de una funci n. El siguiente chero dibuja dos versiones de una funci n sinusoidal o o sencill. La primera vez el programa escoge los par metros b sicos del dibujo. La segunda a a vez, lo escogemos nosotros. Ejecutamos la script: gnuplot funcion.plt.
# lo minimo total # Definir como dispositivo de salida un archivo de tipo pdf set term pdf # Darle nombre ############ set output "funcion.pdf" # Funcion que vamos a dibujar ############### f(x)=10*sin(3*x+1.23) # El resto lo escoje el... ##################### plot f(x) # # Mayor control de la situacion por nuestra parte ################################## set output "funcion2.pdf" set xrange [-5:3] set yrange [-20:15] set xlabel "Abscisa" set ylabel "Ordenada" plot f(x) title "Mi funcion" w lines linewidth 9
Resultados:
10 f(x) 8 10 6 4 2 0 -2 -4 -6 -8 -20 -10 -10 -5 -5 0 5 10 -4 -3 -2 -1 Abscisa 0 1 2 3 -10 5 15 Mi funcion
Ordenada
-5
-15
Leemos los valores de un chero de entrada. Cambiamos el tipo de gr co a gr cos de tipo a a scatter-plot. Esta vez el propio archivo llama a gnuplot.
28
gnuplot << EOF set term postscript eps color set out "duffing.eps" set xlabel "X1" set ylabel "X2" plot "duffing.res" using 2:3 t "" w d lw 6 EOF
1 0.8 0.6 0.4 0.2 X2 0 -0.2 -0.4 -0.6 -0.8 -1 -1.5
-1
-0.5
0 X1
0.5
1.5
Concentraci n de di xido de carbono en Mauna Loa. En este caso dibujamos el contenido o o de un chero en el que se almacena la concentraci n de CO2 en Mauna Loa. El problema es o que los puntos donde el valor es -99.99 son puntos donde no hay ning n valor, se ha perdido u (missing).
set term pdf set out "co2.pdf" plot "co2.dat" using 1:($2 < 0?1/0:$2) t "CO2" w lp lw 3 ps .5
380 CO2
370
360
350
340
330
320
310 1955
1960
1965
1970
1975
1980
1985
1990
1995
2000
2005
6.2.
GrADS (Grid Analysis and Display System, http://grads.iges.org) es posiblemente uno de los sistemas gr cos m s sencillos y a la vez potentes para representar y hacer c lculos a a a 29
sencillos en datos meteorol gicos y oce nicos, especialmente si el conjunto de datos original ya o a est expresado en una malla regular. El tratamiento de datos en estaciones individuales es posible, a pero es m s complicado. Existe un buen tutorial en el servidor del sistema: a http://grads.iges.org/grads/gadoc/tutorial.html 6.2.1. Gr co trivial a
Partiendo de un chero de datos 3D (T,LAT,LON), (por ejemplo, presi n supercial a nivel o del mar) representar los contornos de la media de los eneros de ese campo (el primer registro del chero correspondiente es enero).
grads -pb <<EOF sdfopen /home/jsaenz/meteoclimadata/surface/slp.mon.mean.nc set clevs 988 992 996 1000 1004 1008 1012 1016 1020 1024 1028 set grads off d ave(slp,t=1,t=659,12) draw title SLP Enero enable print slp-enero.gm print disable print quit EOF gxeps slp-enero.gm rm slp-enero.gm epstopdf slp-enero.eps
6.2.2.
Dibujamos adem s del campo de SLP los campos de las componentes de la velocidad zonal y a meridional del viento, en una vista estereogr ca polar. Considerar que los campos U/V est s sacaa a 30
dos de cheros 4D (T,Z,, ). Para que el resultado no salga lleno de vectores, subsampleamos los vectores uno cada dos.
grads -pb << EOG sdfopen /home/jsaenz/meteoclimadata/surface/slp.mon.mean.nc sdfopen /home/jsaenz/meteoclimadata/pressure/uwnd.mon.mean.nc sdfopen /home/jsaenz/meteoclimadata/pressure/vwnd.mon.mean.nc set lat 0 90 set lon -180 180 set mproj nps set gxout shaded set grads off d ave(slp,t=4,t=659,12) set gxout vector set grads off d ave(uwnd.2(z=1),t=4,t=659,12);ave(vwnd.3(z=1),t=4,t=659,12) draw title SLP Abril enable print slp-abril.gm print disable print EOG gxeps -c slp-abril.gm rm slp-abril.gm epstopdf slp-abril.eps grads -pb << EOG sdfopen /home/jsaenz/meteoclimadata/surface/slp.mon.mean.nc sdfopen /home/jsaenz/meteoclimadata/pressure/uwnd.mon.mean.nc sdfopen /home/jsaenz/meteoclimadata/pressure/vwnd.mon.mean.nc set lat 0 90 set lon -180 180 set mproj nps set gxout shaded set grads off d ave(slp,t=4,t=659,12) set gxout vector set grads off d skip(ave(uwnd.2(z=1),t=4,t=659,12),2,2);ave(vwnd.3(z=1),t=4,t=659,12) draw title SLP Abril enable print slp-abril-2.gm print disable print EOG gxeps -c slp-abril-2.gm rm slp-abril-2.gm
31
epstopdf slp-abril-2.eps
6.2.3.
En este caso nos interesa hacer una media zonal. GrADS solamente dibuja datos 2-D, y por defecto ja un instante de tiempo y un nivel vertical en el caso de datos 4D, as que hay que seleccionar la manera de especicarle en qu dimensiones tiene que coger la media zonal. e
grads -pb << EOF sdfopen /home/jsaenz/meteoclimadata/pressure/air.mon.mean.nc sdfopen /home/jsaenz/meteoclimadata/pressure/uwnd.mon.mean.nc set lat -90 90 set z 1 11 set lon 1 set gxout shaded set grads off d ave(ave(air,lon=-100,lon=10),t=4,t=659,12) run cbar set gxout contour set grads off d ave(ave(uwnd.2,lon=-100,lon=10),t=4,t=659,12)
draw title Media zonal Abril enable print mediazonal.gm print disable print quit EOF gxeps -c mediazonal.gm epstopdf mediazonal.eps
32
rm *.gm
6.2.4.
Diagramas de H vmoller o
En este caso empleamos un diagrama llamado de H vmoller para identicar la evoluci n temo o poral de las anomalas de temperatura oce nica que aparecen durante los eventos El Ni o. a n
grads -pb <<EOF sdfopen /home/jsaenz/meteoclimadata/reynolds/sstanom_long.nc set lat 0 set lon 110 300 set time 1sep1980 31jul1985 set gxout shaded set grads off d ave(sstanom,lat=-10,lat=10) run cbarn
33
draw title ENSO 1983 enable print enso1983.gm print disable print quit EOF gxeps enso1983.gm rm *.gm epstopdf enso1983.eps
34
6.2.5.
En este caso vamos a comparar el espesor observado entre las medias de abril de la altura geopotencial correspondiente a las capas de 500 y 700 hPa con el que se obtendra de la aplicaci n o de la ecuaci n hipsom trica: o e Pb Rd T log . Z = g Pt
grads -pb << EOF sdfopen /home/jsaenz/meteoclimadata/pressure/hgt.mon.mean.nc z500 = ave(hgt(z=6),t=4,t=659,12) z700 = ave(hgt(z=4),t=4,t=659,12) dzobs = z500-z700 set lat 0 90 set mproj nps set gxout shaded set grads off d z500 draw title Z500 (Abril) run cbar enable print z500abril.gm print disable print c set grads off d z700 draw title Z700 (Abril) run cbar enable print z700abril.gm print disable print c set gxout shaded set grads off d dzobs set gxout contour set grads off d dzobs draw title Espesor Observado Z500-Z700 (Abril) run cbarn enable print dzabril.gm print disable print c sdfopen /home/jsaenz/meteoclimadata/pressure/air.mon.mean.nc Tempave=ave(air.2(z=5),t=4,t=659,12) dzteor=(Tempave+273.15)*287/9.81*log(7./5.) set gxout shaded
35
set grads off d dzobs run cbarn set gxout contour set grads off d dzteor draw title Espesor Teorico Z500-Z700 enable print dzabril2.gm print disable print c EOF gxeps dzabril.gm gxeps dzabril2.gm epstopdf dzabril2.eps epstopdf dzabril2.eps rm *.gm
36