189 lines
5.5 KiB
Plaintext
189 lines
5.5 KiB
Plaintext
;
|
|
; mkscripgrid.ncl
|
|
;
|
|
; Create SCRIP grid and mapping file for a land-only point or region.
|
|
; Requires NCL 6.1.0 or later for the ESMF regridding functions
|
|
;
|
|
; Erik Kluzek
|
|
; Dec/07/2011
|
|
;
|
|
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"
|
|
load "$NCARG_ROOT/lib/ncarg/nclscripts/esmf/ESMF_regridding.ncl"
|
|
begin
|
|
; ===========================================================================================================
|
|
; Set a few constants needed later
|
|
cdate = systemfunc( "date +%y%m%d" );
|
|
ldate = systemfunc( "date" );
|
|
;
|
|
; IMPORTANT NOTE: EDIT THE FOLLOWING TO CUSTOMIZE or use ENV VARIABLE SETTINGS
|
|
; Edit the following as needed to interpolate to a new resolution.
|
|
;
|
|
; Input resolution and position
|
|
;
|
|
name = getenv("PTNAME"); ; Get name of this point
|
|
|
|
latS = stringtodouble( getenv("S_LAT") ); ; Get south latitude from env variable
|
|
latN = stringtodouble( getenv("N_LAT") ); ; Get north latitude from env variable
|
|
lonE = stringtodouble( getenv("E_LON") ); ; Get east longitude from env variable
|
|
lonW = stringtodouble( getenv("W_LON") ); ; Get west longitude from env variable
|
|
|
|
nx = stringtointeger( getenv("NX" ) ); ; Get number of grids along longitude lines
|
|
ny = stringtointeger( getenv("NY" ) ); ; Get number of grids along latitude lines
|
|
|
|
imask = stringtointeger( getenv("IMASK") ); ; Get imask to use from env variable
|
|
|
|
print_str = getenv("PRINT"); ; Do Extra printing for debugging
|
|
|
|
outfilename = getenv("GRIDFILE"); ; Get filename from env variable
|
|
|
|
gitdescribe = getenv("GITDES"); ; Git describe from the source clone
|
|
|
|
if ( ismissing(nx) )then
|
|
nx = 1;
|
|
end if
|
|
if ( ismissing(ny) )then
|
|
ny = 1;
|
|
end if
|
|
if ( ismissing(imask) )then
|
|
imask = 1;
|
|
end if
|
|
if ( ismissing(name) )then
|
|
name = nx+"x"+ny+"pt_US-UMB";
|
|
end if
|
|
if ( ismissing(latS) )then
|
|
latS = 45.5098;
|
|
end if
|
|
if ( ismissing(latN) )then
|
|
latN = 45.6098;
|
|
end if
|
|
if ( ismissing(lonW) )then
|
|
lonW = 275.2362;
|
|
end if
|
|
if ( ismissing(lonE) )then
|
|
lonE = 275.3362;
|
|
end if
|
|
if ( ismissing(print_str) )then
|
|
printn = False;
|
|
else
|
|
if ( print_str .eq. "TRUE" )then
|
|
printn = True;
|
|
else
|
|
printn = False;
|
|
end if
|
|
end if
|
|
|
|
if ( ismissing(outfilename) )then
|
|
if ( imask .eq. 1 )then
|
|
outfilename = "SCRIPgrid_"+name+"_nomask_c"+cdate+".nc";
|
|
else
|
|
if ( imask .eq. 0 )then
|
|
outfilename = "SCRIPgrid_"+name+"_noocean_c"+cdate+".nc";
|
|
else
|
|
outfilename = "SCRIPgrid_"+name+"_mask_c"+cdate+".nc";
|
|
end if
|
|
end if
|
|
end if
|
|
|
|
if ( ismissing(gitdescribe) )then
|
|
gitdescribe = systemfunc( "git describe" )
|
|
end if
|
|
|
|
system( "/bin/rm -f "+outfilename );
|
|
if ( printn )then
|
|
print( "output file: "+outfilename );
|
|
end if
|
|
|
|
function fspan1up( fbegin [*]:double, fend [*]:double, number:integer )
|
|
;
|
|
; An "fspan" that can handle size of 1 and up.
|
|
; Do fspan for arrays of two or more, or average of end points for array of one.
|
|
;
|
|
local farray;
|
|
begin
|
|
if ( number .eq. 1) then
|
|
farray = (/ (fbegin + fend) / 2.0d00 /);
|
|
else
|
|
farray = fspan( fbegin, fend, number );
|
|
end if
|
|
return( farray );
|
|
end
|
|
|
|
;
|
|
; Compute derived quantities
|
|
;
|
|
|
|
delX = (lonE - lonW) / int2dble(nx);
|
|
delY = (latN - latS) / int2dble(ny);
|
|
|
|
lonCenters = fspan1up( (lonW + delX/2.d0), (lonE - delX/2.d0), nx)
|
|
latCenters = fspan1up( (latS + delY/2.d0), (latN - delY/2.d0), ny)
|
|
lon = new( (/ny, nx/), "double" );
|
|
lat = new( (/ny, nx/), "double" );
|
|
if ( (nx .eq. 1) .or. (ny .eq. 1) )then
|
|
if ( printn )then
|
|
print( "Calculate corners" )
|
|
end if
|
|
lonCorners = new( (/ny, nx, 4/), "double" );
|
|
latCorners = new( (/ny, nx, 4/), "double" );
|
|
else
|
|
if ( printn )then
|
|
print( "Have NCL calculate corners" )
|
|
end if
|
|
end if
|
|
do i = 0, nx-1
|
|
lat(:,i) = latCenters;
|
|
if ( (nx .eq. 1) .or. (ny .eq. 1) )then
|
|
latCorners(:,i,0) = latCenters - delY/2.d0;
|
|
latCorners(:,i,1) = latCenters - delY/2.d0;
|
|
latCorners(:,i,2) = latCenters + delY/2.d0;
|
|
latCorners(:,i,3) = latCenters + delY/2.d0;
|
|
end if
|
|
end do
|
|
do j = 0, ny-1
|
|
lon(j,:) = lonCenters;
|
|
if ( (nx .eq. 1) .or. (ny .eq. 1) )then
|
|
lonCorners(j,:,0) = lonCenters - delX/2.d0;
|
|
lonCorners(j,:,1) = lonCenters + delX/2.d0;
|
|
lonCorners(j,:,2) = lonCenters + delX/2.d0;
|
|
lonCorners(j,:,3) = lonCenters - delX/2.d0;
|
|
end if
|
|
end do
|
|
|
|
; for some reason, "No_FillValue" isn't working in the case where imask=1
|
|
Mask2D = new( (/ny,nx/), "integer", "No_FillValue" )
|
|
Mask2D(:,:) = imask
|
|
gridSize = delX+"x"+delY
|
|
|
|
;
|
|
; Create SCRIP grid file
|
|
;
|
|
|
|
Opt = True
|
|
Opt@Mask2D = Mask2D
|
|
if ( (nx .eq. 1) .or. (ny .eq. 1) )then
|
|
Opt@GridCornerLat = latCorners
|
|
Opt@GridCornerLon = lonCorners
|
|
end if
|
|
Opt@Title = "SCRIP grid file for "+name
|
|
if (printn) then
|
|
Opt@Debug = True
|
|
end if
|
|
curvilinear_to_SCRIP(outfilename, lat, lon, Opt)
|
|
|
|
;
|
|
; Add global attributes to file
|
|
;
|
|
|
|
nc = addfile( outfilename, "w" );
|
|
nc@history = ldate+": create using mkscripgrid.ncl";
|
|
nc@comment = "Ocean is assumed to be non-existant in this region";
|
|
nc@Version = gitdescribe;
|
|
if ( printn )then
|
|
print( "================================================================================================" );
|
|
print( "Successfully created SCRIP grid file: "+outfilename);
|
|
end if
|
|
|
|
; ===========================================================================================================
|
|
|
|
end
|