Changeset 337 in lmdz_wrf for trunk/tools/validation_sim.py
- Timestamp:
- Feb 28, 2015, 4:22:10 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/validation_sim.py
r333 r337 1 1 2 2 # L. Fita, LMD-Jussieu. February 2015 3 ## e.g. # validation_sim.py -d X@west_east@None,Y@south_north@None,T@Time@time -D X@XLONG@longitude,Y@XLAT@latitude,T@time@time -k single-station -l 4.878773,43.915876,12. -o /home/lluis/DATA/obs/HyMeX/IOP15/sfcEnergyBalance_Avignon/OBSnetcdf.nc -s /home/lluis/PY/wrfout_d01_2012-10-18_00:00:00.tests -v HFX@H,LH@LE,GRDFLX@G 3 ## e.g. sfcEneAvigon # validation_sim.py -d X@west_east@None,Y@south_north@None,T@Time@time -D X@XLONG@longitude,Y@XLAT@latitude,T@time@time -k single-station -l 4.878773,43.915876,12. -o /home/lluis/DATA/obs/HyMeX/IOP15/sfcEnergyBalance_Avignon/OBSnetcdf.nc -s /home/lluis/PY/wrfout_d01_2012-10-18_00:00:00.tests -v HFX@H,LH@LE,GRDFLX@G 4 ## e.g. AIREP # validation_sim.py -d X@west_east@lon2D,Y@south_north@lat2D,Z@bottom_top@z2D,T@Time@time -D X@XLONG@longitude,Y@XLAT@latitude,Z@WRFz@alti,T@time@time -k trajectory -o /home/lluis/DATA/obs/HyMeX/IOP15/AIREP/2012/10/AIREP_121018.nc -s /home/lluis/PY/wrfout_d01_2012-10-18_00:00:00.tests -v WRFT@t 5 ## e.g. ATRCore # validation_sim.py -d X@west_east@lon2D,Y@south_north@lat2D,Z@bottom_top@z2D,T@Time@CFtime -D X@XLONG@longitude,Y@XLAT@latitude,Z@WRFz@altitude,T@time@time -k trajectory -o /home/lluis/DATA/obs/HyMeX/IOP15/ATRCore/V3/ATR_1Hz-HYMEXBDD-SOP1-v3_20121018_as120051.nc -s /home/lluis/PY/wrfout_d01_2012-10-18_00:00:00.tests -v WRFT@air_temperature@subc@273.15 6 ## e.g. BAMED # validation_sim.py -d X@west_east@lon2D,Y@south_north@lat2D,Z@bottom_top@z2D,T@Time@CFtime -D X@XLONG@longitude,Y@XLAT@latitude,Z@WRFz@altitude,T@time@time -k trajectory -o /home/lluis/DATA/obs/HyMeX/IOP15/BAMED/BAMED_SOP1_B12_TOT5.nc -s /home/lluis/PY/wrfout_d01_2012-10-18_00:00:00.tests -v WRFT@tas_north 7 4 8 import numpy as np 5 9 import os … … 21 25 22 26 StringLength = 50 27 28 # Number of grid points to take as 'environment' around the observed point 29 Ngrid = 1 23 30 24 31 def searchInlist(listname, nameFind): … … 162 169 matB= matrix with the pother set of values 163 170 val= couple of values to search 164 >>> index_ mat(np.arange(27).reshape(3,3,3),np.arange(100,127).reshape(3,3,3),[22,111])171 >>> index_2mat(np.arange(27).reshape(3,3,3),np.arange(100,127).reshape(3,3,3),[22,111]) 165 172 [2 1 1] 166 173 """ … … 182 189 maxB = np.max(matB) 183 190 191 Ndims = len(matAshape) 192 # valpos = np.ones((Ndims), dtype=int)*-1. 193 valpos = np.zeros((Ndims), dtype=int) 194 184 195 if val[0] < minA or val[0] > maxA: 185 196 print warnmsg 186 197 print ' ' + fname + ': first value:',val[0],'outside matA range',minA,',', \ 187 198 maxA,'!!' 199 return valpos 188 200 if val[1] < minB or val[1] > maxB: 189 201 print warnmsg 190 202 print ' ' + fname + ': second value:',val[1],'outside matB range',minB,',', \ 191 203 maxB,'!!' 204 return valpos 192 205 193 206 dist = np.zeros(tuple(matAshape), dtype=np.float) … … 196 209 mindist = np.min(dist) 197 210 198 matlist = list(dist.flatten()) 199 ifound = matlist.index(mindist) 200 201 Ndims = len(matAshape) 202 valpos = np.zeros((Ndims), dtype=int) 211 if mindist != mindist: 212 print ' ' + fname + ': wrong minimal distance',mindist,'!!' 213 return valpos 214 else: 215 matlist = list(dist.flatten()) 216 ifound = matlist.index(mindist) 217 203 218 baseprevdims = np.zeros((Ndims), dtype=int) 204 205 219 for dimid in range(Ndims): 206 220 baseprevdims[dimid] = np.product(matAshape[dimid+1:Ndims]) … … 213 227 return valpos 214 228 215 def index_mat(mat ,val):229 def index_mat(matA,val): 216 230 """ Function to provide the coordinates of a given value inside a matrix 231 index_mat(matA,val) 232 matA= matrix with one set of values 233 val= couple of values to search 234 >>> index_mat(np.arange(27),22.3) 235 22 236 """ 237 fname = 'index_mat' 238 239 matAshape = matA.shape 240 241 minA = np.min(matA) 242 maxA = np.max(matA) 243 244 Ndims = len(matAshape) 245 # valpos = np.ones((Ndims), dtype=int)*-1. 246 valpos = np.zeros((Ndims), dtype=int) 247 248 if val < minA or val > maxA: 249 print warnmsg 250 print ' ' + fname + ': first value:',val,'outside matA range',minA,',', \ 251 maxA,'!!' 252 return valpos 253 254 dist = np.zeros(tuple(matAshape), dtype=np.float) 255 dist = (matA - np.float(val))**2 256 257 mindist = np.min(dist) 258 if mindist != mindist: 259 print ' ' + fname + ': wrong minimal distance',mindist,'!!' 260 return valpos 261 262 matlist = list(dist.flatten()) 263 valpos = matlist.index(mindist) 264 265 return valpos 266 267 def index_mat_exact(mat,val): 268 """ Function to provide the coordinates of a given exact value inside a matrix 217 269 index_mat(mat,val) 218 270 mat= matrix with values … … 433 485 return varvalues, dimnslice 434 486 487 def func_compute_varNOcheck(ncobj, varn): 488 """ Function to compute variables which are not originary in the file 489 ncobj= netCDF object file 490 varn = variable to compute: 491 'WRFdens': air density from WRF variables 492 'WRFght': geopotential height from WRF variables 493 'WRFp': pressure from WRF variables 494 'WRFrh': relative humidty fom WRF variables 495 'WRFt': temperature from WRF variables 496 'WRFz': height from WRF variables 497 """ 498 fname = 'compute_varNOcheck' 499 500 if varn == 'WRFdens': 501 # print ' ' + main + ': computing air density from WRF as ((MU + MUB) * ' + \ 502 # 'DNW)/g ...' 503 grav = 9.81 504 505 # Just we need in in absolute values: Size of the central grid cell 506 ## dxval = ncobj.getncattr('DX') 507 ## dyval = ncobj.getncattr('DY') 508 ## mapfac = ncobj.variables['MAPFAC_M'][:] 509 ## area = dxval*dyval*mapfac 510 dimensions = ncobj.variables['MU'].dimensions 511 512 mu = (ncobj.variables['MU'][:] + ncobj.variables['MUB'][:]) 513 dnw = ncobj.variables['DNW'][:] 514 515 varNOcheckv = np.zeros((mu.shape[0], dnw.shape[1], mu.shape[1], mu.shape[2]), \ 516 dtype=np.float) 517 levval = np.zeros((mu.shape[1], mu.shape[2]), dtype=np.float) 518 519 for it in range(mu.shape[0]): 520 for iz in range(dnw.shape[1]): 521 levval.fill(np.abs(dnw[it,iz])) 522 varNOcheck[it,iz,:,:] = levval 523 varNOcheck[it,iz,:,:] = mu[it,:,:]*varNOcheck[it,iz,:,:]/grav 524 525 elif varn == 'WRFght': 526 # print ' ' + main + ': computing geopotential height from WRF as PH + PHB ...' 527 varNOcheckv = ncobj.variables['PH'][:] + ncobj.variables['PHB'][:] 528 dimensions = ncobj.variables['PH'].dimensions 529 530 elif varn == 'WRFp': 531 # print ' ' + fname + ': Retrieving pressure value from WRF as P + PB' 532 varNOcheckv = ncobj.variables['P'][:] + ncobj.variables['PB'][:] 533 dimensions = ncobj.variables['P'].dimensions 534 535 elif varn == 'WRFrh': 536 # print ' ' + main + ": computing relative humidity from WRF as 'Tetens'" +\ 537 # ' equation (T,P) ...' 538 p0=100000. 539 p=ncobj.variables['P'][:] + ncobj.variables['PB'][:] 540 tk = (ncobj.variables['T'][:] + 300.)*(p/p0)**(2./7.) 541 qv = ncobj.variables['QVAPOR'][:] 542 543 data1 = 10.*0.6112*np.exp(17.67*(tk-273.16)/(tk-29.65)) 544 data2 = 0.622*data1/(0.01*p-(1.-0.622)*data1) 545 546 varNOcheckv = qv/data2 547 dimensions = ncobj.variables['P'].dimensions 548 549 elif varn == 'WRFt': 550 # print ' ' + main + ': computing temperature from WRF as inv_potT(T + 300) ...' 551 p0=100000. 552 p=ncobj.variables['P'][:] + ncobj.variables['PB'][:] 553 554 varNOcheckv = (ncobj.variables['T'][:] + 300.)*(p/p0)**(2./7.) 555 dimensions = ncobj.variables['T'].dimensions 556 557 elif varn == 'WRFz': 558 grav = 9.81 559 # print ' ' + main + ': computing geopotential height from WRF as PH + PHB ...' 560 varNOcheckv = (ncobj.variables['PH'][:] + ncobj.variables['PHB'][:])/grav 561 dimensions = ncobj.variables['PH'].dimensions 562 563 else: 564 print erromsg 565 print ' ' + fname + ": variable '" + varn + "' nor ready !!" 566 quit(-1) 567 568 return varNOcheck 569 570 class compute_varNOcheck(object): 571 """ Class to compute variables which are not originary in the file 572 ncobj= netCDF object file 573 varn = variable to compute: 574 'WRFdens': air density from WRF variables 575 'WRFght': geopotential height from WRF variables 576 'WRFp': pressure from WRF variables 577 'WRFrh': relative humidty fom WRF variables 578 'WRFt': temperature from WRF variables 579 'WRFz': height from WRF variables 580 """ 581 fname = 'compute_varNOcheck' 582 583 def __init__(self, ncobj, varn): 584 585 if ncobj is None: 586 self = None 587 self.dimensions = None 588 self.shape = None 589 self.__values = None 590 else: 591 if varn == 'WRFdens': 592 # print ' ' + main + ': computing air density from WRF as ((MU + MUB) * ' + \ 593 # 'DNW)/g ...' 594 grav = 9.81 595 596 # Just we need in in absolute values: Size of the central grid cell 597 ## dxval = ncobj.getncattr('DX') 598 ## dyval = ncobj.getncattr('DY') 599 ## mapfac = ncobj.variables['MAPFAC_M'][:] 600 ## area = dxval*dyval*mapfac 601 dimensions = ncobj.variables['MU'].dimensions 602 shape = ncobj.variables['MU'].shape 603 604 mu = (ncobj.variables['MU'][:] + ncobj.variables['MUB'][:]) 605 dnw = ncobj.variables['DNW'][:] 606 607 varNOcheckv = np.zeros((mu.shape[0], dnw.shape[1], mu.shape[1], mu.shape[2]), \ 608 dtype=np.float) 609 levval = np.zeros((mu.shape[1], mu.shape[2]), dtype=np.float) 610 611 for it in range(mu.shape[0]): 612 for iz in range(dnw.shape[1]): 613 levval.fill(np.abs(dnw[it,iz])) 614 varNOcheck[it,iz,:,:] = levval 615 varNOcheck[it,iz,:,:] = mu[it,:,:]*varNOcheck[it,iz,:,:]/grav 616 617 elif varn == 'WRFght': 618 # print ' ' + main + ': computing geopotential height from WRF as PH + PHB ...' 619 varNOcheckv = ncobj.variables['PH'][:] + ncobj.variables['PHB'][:] 620 dimensions = ncobj.variables['PH'].dimensions 621 shape = ncobj.variables['PH'].shape 622 623 elif varn == 'WRFp': 624 # print ' ' + fname + ': Retrieving pressure value from WRF as P + PB' 625 varNOcheckv = ncobj.variables['P'][:] + ncobj.variables['PB'][:] 626 dimensions = ncobj.variables['P'].dimensions 627 shape = ncobj.variables['P'].shape 628 629 elif varn == 'WRFrh': 630 # print ' ' + main + ": computing relative humidity from WRF as 'Tetens'" +\ 631 # ' equation (T,P) ...' 632 p0=100000. 633 p=ncobj.variables['P'][:] + ncobj.variables['PB'][:] 634 tk = (ncobj.variables['T'][:] + 300.)*(p/p0)**(2./7.) 635 qv = ncobj.variables['QVAPOR'][:] 636 637 data1 = 10.*0.6112*np.exp(17.67*(tk-273.16)/(tk-29.65)) 638 data2 = 0.622*data1/(0.01*p-(1.-0.622)*data1) 639 640 varNOcheckv = qv/data2 641 dimensions = ncobj.variables['P'].dimensions 642 shape = ncobj.variables['P'].shape 643 644 645 elif varn == 'WRFt': 646 # print ' ' + main + ': computing temperature from WRF as inv_potT(T + 300) ...' 647 p0=100000. 648 p=ncobj.variables['P'][:] + ncobj.variables['PB'][:] 649 650 varNOcheckv = (ncobj.variables['T'][:] + 300.)*(p/p0)**(2./7.) 651 dimensions = ncobj.variables['T'].dimensions 652 shape = ncobj.variables['P'].shape 653 654 elif varn == 'WRFz': 655 grav = 9.81 656 # print ' ' + main + ': computing geopotential height from WRF as PH + PHB ...' 657 varNOcheckv = (ncobj.variables['PH'][:] + ncobj.variables['PHB'][:])/grav 658 dimensions = ncobj.variables['PH'].dimensions 659 shape = ncobj.variables['PH'].shape 660 661 else: 662 print erromsg 663 print ' ' + fname + ": variable '" + varn + "' nor ready !!" 664 quit(-1) 665 666 print type(ncobj.variables) 667 668 self.dimensions = dimensions 669 self.shape = shape 670 self.__values = varNOcheckv 671 672 def __getitem__(self,elem): 673 return self.__values[elem] 674 435 675 436 676 ####### ###### ##### #### ### ## # … … 443 683 "(e.g., lightning strikes), 'single-station': single station on a fixed position,"+\ 444 684 "'trajectory': following a trajectory" 445 simopers =['sumc','subc','mulc','divc'] 446 #sumc,[constant]: add [constant] to variables values 447 #subc,[constant]: substract [constant] to variables values 448 #mulc,[constant]: multipy by [constant] to variables values 449 #divc,[constant]: divide by [constant] to variables values 685 simopers = ['sumc','subc','mulc','divc'] 686 opersinf = 'sumc,[constant]: add [constant] to variables values; subc,[constant]: '+ \ 687 'substract [constant] to variables values; mulc,[constant]: multipy by ' + \ 688 '[constant] to variables values; divc,[constant]: divide by [constant] to ' + \ 689 'variables values' 690 varNOcheck = ['WRFdens', 'WRFght', 'WRFp', 'WRFrh', 'WRFt', 'WRFz'] 691 varNOcheckinf = "'WRFdens': air density from WRF variables; 'WRFght': geopotential"+ \ 692 " height from WRF variables; 'WRFp': pressure from WRF variables; 'WRFrh': " + \ 693 "relative humidty fom WRF variables; 'WRFt': temperature from WRF variables; " + \ 694 "'WRFz': height from WRF variables" 695 696 dimshelp = "[DIM]@[simdim]@[obsdim] ',' list of couples of dimensions names from " + \ 697 "each source ([DIM]='X','Y','Z','T'; None, no value)" 698 vardimshelp = "[DIM]@[simvardim]@[obsvardim] ',' list of couples of variables " + \ 699 "names with dimensions values from each source ([DIM]='X','Y','Z','T'; None, " + \ 700 "no value, WRFdiagnosted variables also available: " + varNOcheckinf + ")" 701 varshelp="[simvar]@[obsvar]@[[oper]@[val]] ',' list of couples of variables to " + \ 702 "validate and if necessary operation and value operations: " + opersinf + \ 703 "(WRFdiagnosted variables also available: " + varNOcheckinf + ")" 704 statsn = ['minimum', 'maximum', 'mean', 'mean2', 'standard deviation'] 450 705 451 706 parser = OptionParser() 452 parser.add_option("-d", "--dimensions", dest="dims", 453 help="[DIM]@[simdim]@[obsdim] ',' list of couples of dimensions names from each source ([DIM]='X','Y','Z','T'; None, no value)", 454 metavar="VALUES") 707 parser.add_option("-d", "--dimensions", dest="dims", help=dimshelp, metavar="VALUES") 455 708 parser.add_option("-D", "--vardimensions", dest="vardims", 456 help= "[DIM]@[simvardim]@[obsvardim] ',' list of couples of variables names with dimensions values from each source ([DIM]='X','Y','Z','T'; None, no value)", metavar="VALUES")709 help=vardimshelp, metavar="VALUES") 457 710 parser.add_option("-k", "--kindObs", dest="obskind", type='choice', choices=kindobs, 458 711 help=strkObs, metavar="FILE") … … 464 717 parser.add_option("-s", "--simulation", dest="fsim", 465 718 help="simulation file to validate", metavar="FILE") 719 parser.add_option("-t", "--trajectoryfile", dest="trajf", 720 help="file with grid points of the trajectory in the simulation grid ('simtrj')", 721 metavar="FILE") 466 722 parser.add_option("-v", "--variables", dest="vars", 467 help= "[simvar]@[obsvar]@[[oper]@[val]] ',' list of couples of variables to validate and if necessary operation and value", metavar="VALUES")723 help=varshelp, metavar="VALUES") 468 724 469 725 (opts, args) = parser.parse_args() … … 612 868 dims[dn][0] + "' !!" 613 869 quit(-1) 614 if not osim.variables.has_key(vardims[dn][0]): 870 if not osim.variables.has_key(vardims[dn][0]) and not \ 871 searchInlist(varNOcheck,vardims[dn][0]): 615 872 print errormsg 616 873 print ' ' + main + ": simulation file does not have varibale dimension '" + \ 617 874 vardims[dn][0] + "' !!" 618 875 quit(-1) 619 valdimsim[dn] = osim.variables[vardims[dn][0]][:] 876 if searchInlist(varNOcheck,vardims[dn][0]): 877 valdimsim[dn] = compute_varNOcheck(osim, vardims[dn][0]) 878 else: 879 valdimsim[dn] = osim.variables[vardims[dn][0]][:] 620 880 621 881 # General characteristics … … 625 885 print main +': observational time-steps:',dimtobs,'simulation:',dimtsim 626 886 887 notfound = np.zeros((dimtobs), dtype=int) 888 627 889 if obskind == 'multi-points': 628 890 trajpos = np.zeros((2,dimt),dtype=int) 629 for it in dimtobs:891 for it in range(dimtobs): 630 892 trajpos[:,it] = index_2mat(valdimsim['X'],valdimsim['Y'], \ 631 893 [valdimobs['X'][it],valdimobss['Y'][it]]) … … 648 910 649 911 elif obskind == 'trajectory': 650 if dims.has_key('Z'): 651 trajpos = np.zeros((3,dimt),dtype=int) 652 for it in dimtobs: 653 trajpos[0:1,it] = index_2mat(valdimsim['Y'],valdimsim['X'], \ 654 [valdimobs['Y'][it],valdimobss['X'][it]]) 655 trajpos[2,it] = index_mat(valdimsim['Z'],valdimobs['Z'][it]) 912 if opts.trajf is not None: 913 if not os.path.isfile(opts.fsim): 914 print errormsg 915 print ' ' + main + ": simulation file '" + opts.fsim + "' does not exist !!" 916 quit(-1) 917 else: 918 otrjf = NetCDFFile(opts.fsim, 'r') 919 trajpos[0,:] = otrjf.variables['obssimtrj'][0] 920 trajpos[1,:] = otrjf.variables['obssimtrj'][1] 921 otrjf.close() 656 922 else: 657 trajpos = np.zeros((2,dimt),dtype=int) 658 for it in dimtobs: 659 trajpos[:,it] = index_2mat(valdimsim['Y'],valdimsim['X'], \ 660 [valdimobs['Y'][it],valdimobss['X'][it]]) 923 if dims.has_key('Z'): 924 trajpos = np.zeros((3,dimtobs),dtype=int) 925 for it in range(dimtobs): 926 if np.mod(it*100./dimtobs,10.) == 0.: 927 print ' trajectory done: ',it*100./dimtobs,'%' 928 stsimpos = index_2mat(valdimsim['Y'],valdimsim['X'], \ 929 [valdimobs['Y'][it],valdimobs['X'][it]]) 930 stationpos = np.zeros((2), dtype=int) 931 iid = 0 932 for idn in osim.variables[vardims['X'][0]].dimensions: 933 if idn == dims['X'][0]: 934 stationpos[1] = stsimpos[iid] 935 elif idn == dims['Y'][0]: 936 stationpos[0] = stsimpos[iid] 937 iid = iid + 1 938 if stationpos[0] == 0 and stationpos[1] == 0: notfound[it] = 1 939 940 trajpos[0,it] = stationpos[0] 941 trajpos[1,it] = stationpos[1] 942 # In the simulation 'Z' varies with time ... non-hydrostatic model! ;) 943 # trajpos[2,it] = index_mat(valdimsim['Z'][it,:,stationpos[0], \ 944 # stationpos[1]], valdimobs['Z'][it]) 945 else: 946 trajpos = np.zeros((2,dimtobs),dtype=int) 947 for it in range(dimtobs): 948 stsimpos = index_2mat(valdimsim['Y'],valdimsim['X'], \ 949 [valdimobs['Y'][it],valdimobss['X'][it]]) 950 stationpos = np.zeros((2), dtype=int) 951 iid = 0 952 for idn in osim.variables[vardims['X'][0]].dimensions: 953 if idn == dims['X'][0]: 954 stationpos[1] = stsimpos[iid] 955 elif idn == dims['Y'][0]: 956 stationpos[0] = stsimpos[iid] 957 iid = iid + 1 958 if stationpos[0] == 0 and stationpos[1] == 0: notfound[it] = 1 959 960 trajpos[0,it] = stationspos[0] 961 trajpos[1,it] = stationspos[1] 962 963 print main + ': not found',np.sum(notfound),'points of the trajectory' 661 964 662 965 # Getting times … … 670 973 # Concident times 671 974 ## 672 coindtvalues = []975 coindtvalues0 = [] 673 976 for it in range(dimtsim): 674 977 ot = 0 … … 678 981 ot = ito 679 982 tdist = simobstimes[it] - valdimobs['T'][ito] 680 coindtvalues.append([it,ito,simobstimes[it],valdimobs['T'][ito],tdist]) 681 682 Ncoindt = len(coindtvalues) 983 coindtvalues0.append([it, ito, simobstimes[it], valdimobs['T'][ito], \ 984 tdist]) 985 986 coindtvalues = np.array(coindtvalues0, dtype=np.float) 987 988 Ncoindt = len(coindtvalues[:,0]) 683 989 print main + ': found',Ncoindt,'coincident times between simulation and observations' 990 991 if Ncoindt == 0: 992 print warnmsg 993 print main + ': no coincident times found !!' 994 print ' stopping it' 995 quit(-1) 684 996 685 997 # Validating … … 690 1002 # Dimensions 691 1003 newdim = onewnc.createDimension('time',None) 1004 newdim = onewnc.createDimension('obstime',None) 692 1005 newdim = onewnc.createDimension('couple',2) 693 1006 newdim = onewnc.createDimension('StrLength',StringLength) 1007 newdim = onewnc.createDimension('xaround',Ngrid*2+1) 1008 newdim = onewnc.createDimension('yaround',Ngrid*2+1) 1009 newdim = onewnc.createDimension('stats',5) 694 1010 695 1011 # Variable dimensions 696 1012 ## 697 newvar = onewnc.createVariable('simtime','f8',('time'))698 basicvardef(newvar, 'simtime', 'time simulation', obstunits )699 set_attribute(newvar, 'calendar', 'standard')700 newvar[:] = coindtvalues[:][2]701 702 1013 newvar = onewnc.createVariable('obstime','f8',('time')) 703 1014 basicvardef(newvar, 'obstime', 'time observations', obstunits ) 704 1015 set_attribute(newvar, 'calendar', 'standard') 705 newvar[:] = coindtvalues[: ][3]1016 newvar[:] = coindtvalues[:,3] 706 1017 707 1018 newvar = onewnc.createVariable('couple', 'c', ('couple','StrLength')) … … 709 1020 writing_str_nc(newvar, ['sim','obs'], StringLength) 710 1021 1022 newvar = onewnc.createVariable('statistics', 'c', ('stats','StrLength')) 1023 basicvardef(newvar, 'statistics', 'statitics from values', '-') 1024 writing_str_nc(newvar, statsn, StringLength) 1025 1026 if obskind == 'trajectory': 1027 if dims.has_key('Z'): 1028 newdim = onewnc.createDimension('trj',3) 1029 else: 1030 newdim = onewnc.createDimension('trj',2) 1031 1032 newvar = onewnc.createVariable('obssimtrj','i',('obstime','trj')) 1033 basicvardef(newvar, 'obssimtrj', 'trajectory on the simulation grid', '-') 1034 newvar[:] = trajpos.transpose() 1035 1036 if dims.has_key('Z'): 1037 newdim = onewnc.createDimension('simtrj',4) 1038 trjsim = np.zeros((4,Ncoindt), dtype=int) 1039 trjsimval = np.zeros((4,Ncoindt), dtype=np.float) 1040 else: 1041 newdim = onewnc.createDimension('simtrj',3) 1042 trjsim = np.zeros((3,Ncoindt), dtype=int) 1043 trjsimval = np.zeros((3,Ncoindt), dtype=np.float) 1044 711 1045 Nvars = len(valvars) 712 1046 for ivar in range(Nvars): 713 1047 simobsvalues = [] 1048 # Values spatially around the point (+/- [Ngrid] points) 1049 simobsSvalues = [] 714 1050 715 1051 varsimobs = valvars[ivar][0] + '_' + valvars[ivar][1] … … 720 1056 "' !!" 721 1057 quit(-1) 1058 722 1059 if not osim.variables.has_key(valvars[ivar][0]): 723 print errormsg 724 print ' ' + main + ": simulation file has not '" + valvars[ivar][0] + "' !!" 725 quit(-1) 1060 if not searchInlist(varNOcheck, valvars[ivar][0]): 1061 print errormsg 1062 print ' ' + main + ": simulation file has not '" + valvars[ivar][0] + \ 1063 "' !!" 1064 quit(-1) 1065 else: 1066 ovsim = compute_varNOcheck(osim, valvars[ivar][0]) 1067 else: 1068 ovsim = osim.variables[valvars[ivar][0]] 726 1069 727 1070 ovobs = oobs.variables[valvars[ivar][1]] 728 ovsim = osim.variables[valvars[ivar][0]] 1071 if dims.has_key('Z'): 1072 simobsSvalues = np.zeros((Ncoindt, Ngrid*2+1, Ngrid*2+1, Ngrid*2+1), \ 1073 dtype = np.float) 1074 else: 1075 simobsSvalues = np.zeros((Ncoindt, Ngrid*2+1, Ngrid*2+1), dtype = np.float) 729 1076 730 1077 if obskind == 'multi-points': 731 1078 for it in range(Ncoindt): 732 slicev = dims['X'][0]+':'+str(trajpos[2,it]) + '|' + \ 733 dims['Y'][0]+':'+str(trajpos[1,it]) + '|' + \ 1079 slicev = dims['X'][0] + ':' + str(trajpos[2,it]) + '|' + \ 1080 dims['Y'][0]+ ':' + str(trajpos[1,it]) + '|' + \ 1081 dims['T'][0]+ ':' + str(coindtvalues[it][0]) 1082 slicevar, dimslice = slice_variable(ovsim, slicev) 1083 simobsvalues.append([ slicevar, ovobs[coindtvalues[it][1]]]) 1084 slicev = dims['X'][0] + ':' + str(trajpos[2,it]-Ngrid) + '@' + \ 1085 str(trajpos[2,it]+Ngrid) + '|' + dims['Y'][0] + ':' + \ 1086 str(trajpos[1,it]-Ngrid) + '@' + str(trajpos[1,it]+Ngrid) + '|' + \ 734 1087 dims['T'][0]+':'+str(coindtvalues[it][0]) 735 1088 slicevar, dimslice = slice_variable(ovsim, slicev) 736 simobsvalues.append([ ovsim[slicevar], ovobs[coindtvalues[it][1]]]) 1089 simobsSvalues[it,:,:] = slicevar 1090 737 1091 elif obskind == 'single-station': 738 1092 for it in range(Ncoindt): 739 slicev = dims['X'][0]+':'+str(stationpos[1]) + '|' + 740 dims['Y'][0]+':'+str(stationpos[0]) + '|' + 1093 slicev = dims['X'][0]+':'+str(stationpos[1]) + '|' + \ 1094 dims['Y'][0]+':'+str(stationpos[0]) + '|' + \ 741 1095 dims['T'][0]+':'+str(coindtvalues[it][0]) 742 1096 slicevar, dimslice = slice_variable(ovsim, slicev) 743 simobsvalues.append([ slicevar, ovobs[coindtvalues[it][1]]]) 1097 simobsvalues.append([ slicevar, ovobs[coindtvalues[it,1]]]) 1098 slicev = dims['X'][0] + ':' + str(trajpos[2,it]-Ngrid) + '@' + \ 1099 str(trajpos[2,it]+Ngrid) + '|' + dims['Y'][0] + ':' + \ 1100 str(trajpos[1,it]-Ngrid) + '@' + str(trajpos[1,it]+Ngrid) + '|' + \ 1101 dims['T'][0] + ':' + str(coindtvalues[it,0]) 1102 slicevar, dimslice = slice_variable(ovsim, slicev) 1103 simobsSvalues[it,:,:] = slicevar 744 1104 elif obskind == 'trajectory': 745 1105 if dims.has_key('Z'): 746 1106 for it in range(Ncoindt): 747 slicev = dims['X'][0]+':'+str(trajpos[2,it]) + '|' + \ 748 dims['Y'][0]+':'+str(trajpos[1,it]) + '|' + \ 749 dims['Z'][0]+':'+str(trajpos[0,it]) + '|' + \ 750 dims['T'][0]+':'+str(coindtvalues[it][0]) 751 slicevar, dimslice = slice_variable(ovsim, slicev) 752 simobsvalues.append([ ovsim[slicevar], ovobs[coindtvalues[it][1]]]) 753 print simobsvalues[varsimobs][:][it] 1107 if notfound[it] == 0: 1108 ito = int(coindtvalues[it,1]) 1109 trajpos[2,ito] = index_mat(valdimsim['Z'][it,:,trajpos[1,ito], \ 1110 trajpos[0,ito]], valdimobs['Z'][ito]) 1111 slicev = dims['X'][0]+':'+str(trajpos[0,ito]) + '|' + \ 1112 dims['Y'][0]+':'+str(trajpos[1,ito]) + '|' + \ 1113 dims['Z'][0]+':'+str(trajpos[2,ito]) + '|' + \ 1114 dims['T'][0]+':'+str(int(coindtvalues[it,0])) 1115 slicevar, dimslice = slice_variable(ovsim, slicev) 1116 simobsvalues.append([ slicevar, ovobs[int(ito)]]) 1117 slicev = dims['X'][0] + ':' + str(trajpos[0,ito]-Ngrid) + '@' + \ 1118 str(trajpos[0,ito]+Ngrid+1) + '|' + dims['Y'][0] + ':' + \ 1119 str(trajpos[1,ito]-Ngrid) + '@' + str(trajpos[1,ito]+Ngrid+1)+ \ 1120 '|' + dims['Z'][0] + ':' + str(trajpos[2,ito]-Ngrid) + '@' + \ 1121 str(trajpos[2,ito]+Ngrid+1) + '|' + dims['T'][0] + ':' + \ 1122 str(int(coindtvalues[it,0])) 1123 slicevar, dimslice = slice_variable(ovsim, slicev) 1124 simobsSvalues[it,:,:,:] = slicevar 1125 if ivar == 0: 1126 trjsim[0,it] = trajpos[0,ito] 1127 trjsim[1,it] = trajpos[1,ito] 1128 trjsim[2,it] = trajpos[2,ito] 1129 trjsim[3,it] = coindtvalues[it,0] 1130 else: 1131 simobsvalues.append([fillValueF, fillValueF]) 1132 simobsSvalues[it,:,:,:]= np.ones((Ngrid*2+1,Ngrid*2+1,Ngrid*2+1),\ 1133 dtype = np.float)*fillValueF 754 1134 else: 755 1135 for it in range(Ncoindt): 756 slicev = dims['X'][0]+':'+str(trajpos[2,it]) + '|' + \ 757 dims['Y'][0]+':'+str(trajpos[1,it]) + '|' + \ 758 dims['T'][0]+':'+str(coindtvalues[it][0]) 759 slicevar, dimslice = slice_variable(ovsim, slicev) 760 simobsvalues.append([ ovsim[slicevar], ovobs[coindtvalues[it][1]]]) 1136 if notfound[it] == 0: 1137 ito = coindtvalues[it,1] 1138 slicev = dims['X'][0]+':'+str(trajpos[2,ito]) + '|' + \ 1139 dims['Y'][0]+':'+str(trajpos[1,ito]) + '|' + \ 1140 dims['T'][0]+':'+str(coindtvalues[ito,0]) 1141 slicevar, dimslice = slice_variable(ovsim, slicev) 1142 simobsvalues.append([ slicevar, ovobs[coindtvalues[it,1]]]) 1143 slicev = dims['X'][0] + ':' + str(trajpos[0,it]-Ngrid) + '@' + \ 1144 str(trajpos[0,it]+Ngrid) + '|' + dims['Y'][0] + ':' + \ 1145 str(trajpos[1,it]-Ngrid) + '@' + str(trajpos[1,it]+Ngrid) + \ 1146 '|' + dims['T'][0] + ':' + str(coindtvalues[it,0]) 1147 slicevar, dimslice = slice_variable(ovsim, slicev) 1148 simobsSvalues[it,:,:] = slicevar 1149 else: 1150 simobsvalues.append([fillValue, fillValue]) 1151 simobsSvalues[it,:,:] = np.ones((Ngrid*2+1,Ngrid*2+1), \ 1152 dtype = np.float)*fillValueF 761 1153 print simobsvalues[varsimobs][:][it] 762 1154 763 newvar = onewnc.createVariable(varsimobs, 'f', ('time','couple')) 764 descvar = 'couples of simulated: ' + valvars[ivar][0] + ' and observed ' + \ 1155 # Statistics around values 1156 aroundstats = np.zeros((5,Ncoindt), dtype=np.float) 1157 for it in range(Ncoindt): 1158 aroundstats[0,it] = np.min(simobsSvalues[it,]) 1159 aroundstats[1,it] = np.max(simobsSvalues[it,]) 1160 aroundstats[2,it] = np.mean(simobsSvalues[it,]) 1161 aroundstats[3,it] = np.mean(simobsSvalues[it,]*simobsSvalues[it,]) 1162 aroundstats[4,it] = np.sqrt(aroundstats[3,it] - aroundstats[2,it]* \ 1163 aroundstats[2,it]) 1164 1165 # Values to netCDF 1166 newvar = onewnc.createVariable(varsimobs, 'f', ('time','couple'), \ 1167 fill_value=fillValueF) 1168 descvar = 'couples of simulated: ' + valvars[ivar][0] + ' and observed ' + \ 765 1169 valvars[ivar][1] 766 1170 basicvardef(newvar, varsimobs, descvar, ovobs.getncattr('units')) 767 768 1171 newvar[:] = np.array(simobsvalues) 769 1172 1173 # Around values 1174 if dims.has_key('Z'): 1175 newdim = onewnc.createDimension('zaround',Ngrid*2+1) 1176 newvar = onewnc.createVariable( valvars[ivar][0] + 'around', 'f', \ 1177 ('time','zaround','yaround','xaround'), fill_value=fillValueF) 1178 else: 1179 newvar = onewnc.createVariable( valvars[ivar][0] + 'around', 'f', \ 1180 ('time','yaround','xaround'), fill_value=fillValueF) 1181 1182 descvar = 'around simulated values +/- grid values: ' + valvars[ivar][0] 1183 basicvardef(newvar, varsimobs + 'around', descvar, ovobs.getncattr('units')) 1184 newvar[:] = simobsSvalues 1185 1186 # Statistics 1187 newvar = onewnc.createVariable(varsimobs + 'staround', 'f', ('time','stats'), \ 1188 fill_value=fillValueF) 1189 descvar = 'around simulated statisitcs: ' + valvars[ivar][0] 1190 basicvardef(newvar, varsimobs + 'staround', descvar, ovobs.getncattr('units')) 1191 newvar[:] = aroundstats.transpose() 1192 770 1193 onewnc.sync() 1194 1195 newvar = onewnc.createVariable('simtrj','i',('time','simtrj')) 1196 basicvardef(newvar, 'simtrj', 'coordinates [X,Y,Z,T] of the coincident trajectory ' +\ 1197 'in sim', obstunits) 1198 newvar[:] = trjsim.transpose() 771 1199 772 1200 # Global attributes
Note: See TracChangeset
for help on using the changeset viewer.