Re: smooth boundaries of a masked area

From: Karin Meier-Fleischer <meier-fleischer_at_nyahnyahspammersnyahnyah>
Date: Mon May 19 2014 - 04:55:46 MDT

Hi Sebastian,

to mask data along a coastline you could you shapefiles. See shapefile
example mask_12.ncl:

http://ncl.ucar.edu/Applications/Scripts/mask_12.ncl
http://ncl.ucar.edu/Applications/Images/mask_12_lg.png

To get the data within a choosen sub-region and masking everything else
with _FillValue
you can use the ind(..) function. The following user defined function
data_mask(..)
generates such a mask data array:

;--------------------------------------------------------------------
undef("mask_data")
;--------------------------------------------------------------------
function mask_data(data,minlat,maxlat,minlon,maxlon)
;--------------------------------------------------------------------
local dims,lat,lon,nlat,nlon,lat1d,lon1d,nlatlon,ind_latlon,dims
begin
   dims = dimsizes(data) ;--
dimension of data
   lat = data&lat ;--
retrieve latitudes
   lon = data&lon ;--
retrieve longitudes
   nlat = dims(0) ;--
dimension of lat
   nlon = dims(1) ;--
dimension of lon

;-- to use the ind function we need to convert the dimesnions lat and lon
;-- and the data into a 1D array
   lat1d = ndtooned(conform_dims((/nlat,nlon/),data&lat,0)) ;--
convert to 1D array
   lon1d = ndtooned(conform_dims((/nlat,nlon/),data&lon,1)) ;--
convert to 1D array
   nlatlon = dimsizes(lat1d) ;--
dimension of 1D array
   data_mask_1d = new(nlatlon,integer) ;--
assign new integer array

;-- retrieve the indices of the lat/lon's inside the sub-region
   ind_latlon =
ind(lat1d.ge.minlat.and.lat1d.le.maxlat.and.lon1d.ge.minlon.and.lon1d.le.maxlon)

   if(.not.isatt(data,"_FillValue")) then
     data@_FillValue = default_fillvalue(typeof(data)) ;-- make
sure "data" has a missing value
   end if

   data_1d = ndtooned(data) ;--
convert data to 1D array
   data_mask = new(dimsizes(data_1d),typeof(data),data@_FillValue)
;-- create 1D masked data array

   data_mask_1d = 0 ;--
initialize array to 0

   do n=0,dimsizes(ind_latlon)-1
      nn = ind_latlon(n) ;-- get
index of point we're checking
if(lat1d(nn).lt.minlat.or.lat1d(nn).gt.maxlat.or.lon1d(nn).lt.minlon.or.lon1d(nn).gt.maxlon)

         continue
      else
         data_mask_1d(nn) = 1 ;-- its
inside the sub-region
      end if
   end do

   if(num(data_mask_1d.eq.1).gt.0) then
      data_mask = where(data_mask_1d.eq.1,data_1d,data_1d@_FillValue)
;-- get data or _FillValue
   else
      print("WARNING: no points inside sub-region (Lat:
"+minlat+","+maxlat+" Lon: "+minlon+","+maxlon+")")
      exit
   end if

;-- for plotting purposes convert the masked data back to a 2D data array
   data_mask_2d = onedtond(data_mask,(/nlat,nlon/)) ;--
convert back to a 2d data array
   data_mask_2d!0 = "lat" ;-- set
named dimension lat
   data_mask_2d!1 = "lon" ;-- set
named dimension lon
   data_mask_2d&lat = lat ;-- use lat
   data_mask_2d&lon = lon ;-- use lon
   data_mask_2d&lat@units = "degrees_north" ;-- set
lat units
   data_mask_2d&lon@units = "degrees_east" ;-- set
lon units

   return(data_mask_2d) ;-- return 2D data mask array
end

Hope this helps,
Karin

Am 19.05.14 10:08, schrieb Sebastian Milinski:
> Dear all,
>
> I would like to mask a region in a tripolar grid. Outside this region the values should be 0. In the transition zone (e.g. 3°) I want the values to decay (linearly or exponentially) to 0.
> My current approach is to create a weight file with values from 0 to 1 on a regular grid. I will then interpolate it to the tripolar grid and multiply it with the data.
>
> Ho can I create this transition zone in NCL? For straight boundaries in N/S or E/W direction I could introduce some latitude/longitude dependence.
> But what about more complex shapes? E.g. a masked region along a coastline?
>
> I thought this should be a common problem when applying a regionally confined forcing in a model. I would very much appreciate any hints.
>
> Regards
> Sebastian
> _______________________________________________
> ncl-talk mailing list
> List instructions, subscriber options, unsubscribe:
> http://mailman.ucar.edu/mailman/listinfo/ncl-talk
>

-- 
Dipl. Geophys. Karin Meier-Fleischer
Application Support, Visualization
Deutsches Klimarechenzentrum GmbH      E-Mail:   meier-fleischer@dkrz.de
Bundesstrasse 45a                      Internet: http://www.dkrz.de/
20146 Hamburg                          Phone:    +49 (0)40 460094 126
Germany                                Fax:      +49 (0)40 460094 270
Geschäftsführer: Prof. Dr. Thomas Ludwig
Sitz der Gesellschaft: Hamburg
Amtsgericht Hamburg HRB 39784

_______________________________________________
ncl-talk mailing list
List instructions, subscriber options, unsubscribe:
http://mailman.ucar.edu/mailman/listinfo/ncl-talk
Received on Mon May 19 04:56:04 2014

This archive was generated by hypermail 2.1.8 : Tue Jun 03 2014 - 11:40:09 MDT