extending the functionality of NCL

From: Todd Ringler (todd AT XXXXXX)
Date: Mon Sep 17 2001 - 14:30:28 MDT

  • Next message: Mary Haley: "new version of NCL available"

    I have been able to generate my own library composed of FORTRAN
    subroutines and functions that I incorporate as shared objects into NCL.
    This works nicely and really extends the functionality of the software.

    I would like to be able to generate NCL "subroutines" and "functions" as
    well, and I can't seem to figure out an easy way to do this. I am hoping
    that I am missing something here. As an example, let's take the
    pop_remap sample given on the NCL web site. This sample is appended.

    Nearly all of this code will be exactly same for every remapping. In
    fact, the only input required in this example is XIN and
    "Src_to_Dst.nc", the only output is XOUT. It would seem logical to
    create a new function that is composed of NCL commands with the
    following interface:

    XOUT = remap(XIN, "Src_to_Dst.nc"),

    where the NCL function "remap" does everything in the example.

    Can this be done in a straightforward manner. I could write the entire
    function in FORTRAN (as a subroutine), but then I lose the nice data
    file manipulation tools available in NCL.

    This is just an example of a larger issue. Is there an easy way to
    package lines of NCL into reusable functions? Examples?

    Thanks for the help,
    todd.

    ********

    fP = addfile("Src_to_Dst.nc","r") ; SCRIP netCDF file

    dim_x = dimsizes( XIN ) ; XIN is the variable to be
    remapped
    nDx = dimsizes( dim_x ) ; rank [# dimensions]
    dim_src = fP->src_grid_dims ; size source grid
                                          ; error check
    if (dim_x(nDx-2).ne.dim_src(1) .or. dim_x(nDx-1).ne.dim_src(0)) then
        print (" Input grid and Remap sizes do not match")
        exit
    end if

    dst_add = fP->dst_address ; destination grid [linear]
    src_add = fP->src_address ; source grid [linear]
    map_wts = fP->remap_matrix ; wts
    dim_dst = fP->dst_grid_dims ; size destination grid

    mx = dim_dst(0) ; output # elements in "x"
    ny = dim_dst(1) ; output # elements in "y"

    xout_1D = new (ny*mx, typeof(XIN)) ; (temporary) return grid [1D]
    xin_1D = ndtooned ( XIN ) ; convert to 1D
     
    pop_remap(xout_1D, map_wts, dst_add, src_add, xin_1D)

    XOUT = onedtond(xout_1D, (/ny,mx/) ) ; new grid

    delete(xout_1D) ; clean up
    delete(xin_1D)
    delete(dst_add)
    delete(src_add)
    delete(map_wts)

    **********

    -- 
    

    -- Todd Ringler Department of Atmospheric Science Colorado State University Fort Collins, Colorado 80523-1371

    tel 970-491-8432 fax 970-491-8428

    email todd@placer.atmos.colostate.edu http://kiwi.atmos.colostate.edu/group/todd/



    This archive was generated by hypermail 2b29 : Tue Sep 18 2001 - 09:39:28 MDT