clm5.0/bld/namelist_files/checkmapfiles.ncl
2025-01-12 20:48:10 +08:00

237 lines
8.3 KiB
Plaintext

;
; Check that the *_b values are the same between the mapping files
; at the same output resolution.
;
; Erik Kluzek
; Nov/18/2011
; $Id$
; $HeadURL;
;
print( "Check that datm mapping files are consistent" );
resolutions = (/ "128x256", "64x128", "48x96", "32x64", "8x16", "94x192", "0.23x0.31", "0.47x0.63", "0.9x1.25", "1.9x2.5", "2.5x3.33", "4x5", "10x15", "5x5_amazon", "1x1_camdenNJ", "1x1_vancouverCAN", "1x1_mexicocityMEX", "1x1_asphaltjungleNJ", "1x1_brazil", "1x1_urbanc_alpha", "1x1_numaIA", "1x1_smallvilleIA", "ne4np4", "ne16np4", "ne30np4", "ne60np4", "ne120np4", "ne240np4" /);
space = " ";
badres = 0
badresolutions = new( (/ 1000 /), string )
chkres = 0
chkresolutions = new( (/ 1000 /), string )
procedure checkit( desc:string, maxdiff:numeric, res:string, lmask:string, eps:numeric )
;
; check that difference is within reasonable tolerance...
;
begin
reso = res+"_"+lmask;
if ( maxdiff .gt. eps )then
print( space+space+space+desc+" are off by more than tolerance for "+reso+" resolution" );
print( space+space+space+"maximum difference = "+maxdiff );
if ( .not. any(badresolutions .eq. reso ) )then
badresolutions(badres) = reso;
badres = badres + 1
end if
else
print( space+space+space+"File OK for "+desc+"!" );
end if
if ( .not. any(chkresolutions .eq. reso ) )then
chkresolutions(chkres) = reso;
chkres = chkres + 1
end if
end
function checkdims( desc:string, dsizefile1 [*]:integer, dsizefile2 [*]:integer, res:string, lmask:string )
;
; check that dimensions are the same between the file variables
;
begin
reso = res+"_"+lmask;
if ( any( dsizefile1 .ne. dsizefile2) )then
print( space+space+space+desc+" dimensions are different for "+reso+" resolution" );
print( space+space+space+"dim first file "+dsizefile1 );
print( space+space+space+"dim second file "+dsizefile2 );
if ( .not. any(badresolutions .eq. reso ) )then
badresolutions(badres) = reso;
badres = badres + 1
end if
return( False );
else
print( space+space+space+"File dims OK for "+desc+"!" );
return( True );
end if
if ( .not. any(chkresolutions .eq. reso ) )then
chkresolutions(chkres) = reso;
chkres = chkres + 1
end if
end
begin
csmdata = getenv("CSMDATA");
clmroot = getenv("CLM_ROOT");
querynml = "bld/queryDefaultNamelist.pl -silent -justvalue -namelist clmexp";
if ( .not. ismissing(csmdata) )then
querynml = querynml+" -csmdata "+csmdata;
end if
if ( ismissing(clmroot) )then
querynml = "../../"+querynml;
else
querynml = clmroot+"/components/clm/"+querynml;
end if
print( "query string="+querynml )
mapgrids = (/"0.5x0.5_MODIS", "0.5x0.5_AVHRR", "0.5x0.5_MODIS", "5x5min_nomask", "5x5min_IGBP-GSDP", "5x5min_ISRIC-WISE", "10x10min_nomask", "3x3min_MODIS", "3x3min_LandScan2004", "3x3min_GLOBE-Gardner", "3x3min_GLOBE-Gardner-mergeGIS", "0.9x1.25_GRDC", "360x720cru_cruncep", "1km-merge-10min_HYDRO1K-merge-nomask"/);
do i = 0, dimsizes(resolutions)-1
res = resolutions(i);
print( "Go through maps for Resolution: "+res );
do j = 0, dimsizes(mapgrids)-1
grid = str_get_field( mapgrids(j), 1, "_" );
lmask = str_get_field( mapgrids(j), 2, "_" );
print( space+"Look for maps from Grid: "+grid+"_"+lmask);
querynmlres = querynml+" -options frm_lmask="+lmask+",frm_hgrid="+grid+",to_hgrid="+res+",to_lmask=nomask";
;
; Get map filename and open it
;
mapfile = systemfunc( querynmlres+" -var map" );
if ( systemfunc("test -f "+mapfile+"; echo $?" ) .ne. 0 )then
delete( mapfile );
continue;
end if
print( space+"Use mapfile: "+mapfile );
ncm = addfile( mapfile, "r" );
if ( .not. isvar("ncm0") )then
ncm0 = ncm;
else
vars = (/"yc_b", "xc_b", "area_b", "xv_b", "yv_b" /);
k = 0;
if ( checkdims( vars(k), dimsizes(ncm->$vars(k)$), dimsizes(ncm0->$vars(k)$), res, "nomask" ) )then
do k = 0, dimsizes(vars)-1
maxdiff = max( abs(ncm->$vars(k)$ - ncm0->$vars(k)$) );
checkit( vars(k), maxdiff, res, "nomask", 1.e-12 );
delete( maxdiff );
end do
var = "mask_b"
imaxdiff = max( abs(ncm->$var$ - ncm0->$var$) );
checkit( var, imaxdiff, res, "nomask", 1.e-12 );
delete( imaxdiff );
end if
delete( ncm );
end if
delete( mapfile );
end do
delete( grid );
delete( lmask );
delete( res );
if ( isvar("ncm0") )then
delete( ncm0 );
end if
end do
;
; go the other direction now check the _a variables
;
mksrf_files = (/"mksrf_fvegtyp", "mksrf_fglacier", "mksrf_furbtopo", "mksrf_flai", "mksrf_fsoitex", "mksrf_fsoicol", "mksrf_ffrac", "mksrf_fmax", "mksrf_ftopo", "mksrf_firrig", "mksrf_forganic", "mksrf_flakwat", "mksrf_fwetlnd", "mksrf_furban", "mksrf_fvocef"/)
do i = 0, dimsizes(mapgrids)-1
grid = str_get_field( mapgrids(i), 1, "_" );
lmask = str_get_field( mapgrids(i), 2, "_" );
print( "Grid: "+grid);
print( "Mask: "+lmask);
do j = 0, dimsizes(resolutions)-1
res = resolutions(j);
print( "res: "+res );
querynmlres = querynml+" -options frm_lmask="+lmask+",frm_hgrid="+grid+",to_hgrid="+res+",to_lmask=nomask";
;
; Get map filename and open it
;
mapfile = systemfunc( querynmlres+" -var map" );
if ( systemfunc("test -f "+mapfile+"; echo $?" ) .ne. 0 )then
delete( mapfile );
continue;
end if
print( space+"Use mapfile: "+mapfile );
ncm = addfile( mapfile, "r" );
if ( .not. isvar("ncm0") )then
ncm0 = ncm;
else
vars = (/"yc_a", "xc_a", "area_a", "xv_a", "yv_a" /);
vars2 = (/"LATIXY", "LONGXY", "AREA" /);
k = 0;
if ( checkdims( vars(k), dimsizes(ncm->$vars(k)$), dimsizes(ncm0->$vars(k)$), res, "nomask" ) )then
do k = 0, dimsizes(vars)-1
maxdiff = max( abs(ncm->$vars(k)$ - ncm0->$vars(k)$) );
checkit( vars(k), maxdiff, res, "nomask", 1.e-12 );
delete( maxdiff );
end do
end if
var = "mask_a"
imaxdiff = max( abs(ncm->$var$ - ncm0->$var$) );
checkit( var, imaxdiff, res, "nomask", 1.e-12 );
delete( imaxdiff );
;
; Get mksurfdata input datasets
;
do k = 0, dimsizes(mksrf_files)-1
srffile = systemfunc( querynmlres+" -var "+mksrf_files(k) );
if ( systemfunc("test -f "+srffile+"; echo $?" ) .ne. 0 )then
delete( srffile );
continue;
end if
print( space+"Use srffile: "+srffile );
ncs = addfile( srffile, "r" );
n = 0;
if ( checkdims( vars(n), dimsizes(ncm->$vars(n)$), ndtooned(dimsizes(ncs->$vars2(n)$)), res, "nomask" ) )then
do n = 0, dimsizes(vars2)-1
maxdiff = max( abs(ncm->$vars(n)$ - ndtooned(ncs->$vars2(n)$)) );
checkit( vars(n), maxdiff, res, "nomask", 1.e-12 );
delete( maxdiff );
end do
var = "mask_a"
var2 = "LANDMASK"
imaxdiff = max( abs(ncm->$var$ - ndtooned(ncs->$var2$)) );
checkit( var, imaxdiff, res, "nomask", 1.e-12 );
end if
delete( ncs );
end do
delete( ncm );
end if
delete( mapfile );
end do
if ( isvar("vars") )then
delete( vars )
end if
if ( isvar("vars2") )then
delete( vars2 )
end if
delete( grid );
delete( lmask );
delete( res );
if ( isvar("ncm0") )then
delete( ncm0 );
end if
end do
if ( chkres .gt. 0 )then
print( "resolutions checked = " );
print( chkresolutions(0:chkres-1) );
end if
if ( badres .gt. 0 )then
print( "badresolutions = " );
print( badresolutions(0:badres-1) );
end if
print( "===============================" );
print( "Successfully went through files" );
end