Dennis Shea National Center for Atmospheric Research

Slides:



Advertisements
Similar presentations
Overview of programming in C C is a fast, efficient, flexible programming language Paradigm: C is procedural (like Fortran, Pascal), not object oriented.
Advertisements

A MATLAB function is a special type of M-file that runs in its own independent workspace. It receives input data through an input argument list, and returns.
M AT L AB Programming: scripts & functions. Scripts It is possible to achieve a lot simply by executing one command at a time on the command line (even.
Chapter 7 Introduction to Procedures. So far, all programs written in such way that all subtasks are integrated in one single large program. There is.
Combining NCL and Fortran in C-shell
The NCAR Command Language (NCL) and the NetCDF Data Format Research Tools Presentation Matthew Janiga 10/30/2012.
Computational Methods of Scientific Programming Lecturers Thomas A Herring, Room A, Chris Hill, Room ,
External Fortran-C Codes external codes, Fortran, C, or local commerical libraries may be executed from within NCL generic process – develop a wrapper.
VBA Modules, Functions, Variables, and Constants
CS Lecture 03 Outline Sed and awk from previous lecture Writing simple bash script Assignment 1 discussion 1CS 311 Operating SystemsLecture 03.
CSCE 121, Sec 200, 507, 508 Fall 2010 Prof. Jennifer L. Welch.
Review of Matrix Algebra
Guide To UNIX Using Linux Third Edition
C++ for Engineers and Scientists Third Edition
Guide To UNIX Using Linux Third Edition
JavaScript, Third Edition
Introduction to Array The fundamental unit of data in any MATLAB program is the array. 1. An array is a collection of data values organized into rows and.
Functions. Program complexity the more complicated our programs get, the more difficult they are to develop and debug. It is easier to write short algorithms.
Review of C++ Programming Part II Sheng-Fang Huang.
Fortran- Subprograms Chapters 6, 7 in your Fortran book.
Shell Scripting Awk (part1) Awk Programming Language standard unix language that is geared for text processing and creating formatted reports but it.
Chapter Seven Advanced Shell Programming. 2 Lesson A Developing a Fully Featured Program.
The NCAR Command Language (NCL) Ethan Alpert Visualization and Enabling Technologies Section, SCD, NCAR.
Mathcad Variable Names A string of characters (including numbers and some “special” characters (e.g. #, %, _, and a few more) Cannot start with a number.
 2003 Prentice Hall, Inc. All rights reserved. 1 Introduction to C++ Programming Outline Introduction to C++ Programming A Simple Program: Printing a.
Introduction to FORTRAN
Chapter 7: Arrays. In this chapter, you will learn about: One-dimensional arrays Array initialization Declaring and processing two-dimensional arrays.
Fortran 1- Basics Chapters 1-2 in your Fortran book.
Introduction to Matlab 1. Outline: What is Matlab? Matlab Screen Variables, array, matrix, indexing Operators Plotting Flow Control Using of M-File Writing.
Multi-Dimensional Arrays
Copyright © 2012 Pearson Education, Inc. Publishing as Pearson Addison-Wesley C H A P T E R 2 Input, Processing, and Output.
NCL Introduction Dennis Shea National Center for Atmospheric Research.
Language Elements 1. Data Types 2 Floating Point (real) Single Precision Double Precision Decimal Fixed Point (integer) Byte Short Integer Long Numerical.
Arrays 1 Multiple values per variable. Why arrays? Can you collect one value from the user? How about two? Twenty? Two hundred? How about… I need to collect.
Chapter 3 Processing and Interactive Input. 2 Assignment  The general syntax for an assignment statement is variable = operand; The operand to the right.
Computational Methods of Scientific Programming Lecturers Thomas A Herring, Room A, Chris Hill, Room ,
Input, Output, and Processing
Scientific Computing Division A tutorial Introduction to Fortran Siddhartha Ghosh Consulting Services Group.
Project 1 Due Date: September 25 th Quiz 4 is due September 28 th Quiz 5 is due October2th 1.
Slides based on lectures from the NCL workshop Also see the NCL homepage.
Shell Script Programming. 2 Using UNIX Shell Scripts Unlike high-level language programs, shell scripts do not have to be converted into machine language.
Object-Oriented Program Development Using Java: A Class-Centered Approach, Enhanced Edition.
Vectors and Matrices In MATLAB a vector can be defined as row vector or as a column vector. A vector of length n can be visualized as matrix of size 1xn.
Module and Data Sharing. Programming in the Large Software, in general, is large having multiple units Multiple units designed and developed independently.
Copyright © 2010 Certification Partners, LLC -- All Rights Reserved Perl Specialist.
Copyright © 2012 Pearson Education, Inc. Publishing as Pearson Addison-Wesley C H A P T E R 2 Input, Processing, and Output.
3 1 Sending Data Using an Online Form CGI/Perl Programming By Diane Zak.
Chapter 10: BASH Shell Scripting Fun with fi. In this chapter … Control structures File descriptors Variables.
©Colin Jamison 2004 Shell scripting in Linux Colin Jamison.
Eurasia Institute of Earth Sciences Istanbul Technical University NCL Introduction Deniz Bozkurt web.itu.edu.tr/bozkurtd ITU Eurasia Institute of Earth.
NCL Sample Scripts Dennis Shea Climate and Global Dynamics Division Climate Analysis Section.
Artificial Intelligence Lecture No. 26 Dr. Asad Ali Safi ​ Assistant Professor, Department of Computer Science, COMSATS Institute of Information Technology.
Copyright © 2003 ProsoftTraining. All rights reserved. Perl Fundamentals.
Empirical Orthogonal Functions (EOFs) successive eigenvalues should be distinct – if not, the eigenvalues and associated patterns are noise – 1 from 2,
Digital Image Processing Lecture 6: Introduction to M- function Programming.
Department of Electrical and Computer Engineering Introduction to Perl By Hector M Lugo-Cordero August 26, 2008.
 2008 Pearson Education, Inc. All rights reserved JavaScript: Introduction to Scripting.
Introduction to Python Dr. José M. Reyes Álamo. 2 Three Rules of Programming Rule 1: Think before you program Rule 2: A program is a human-readable set.
XP New Perspectives on XML, 2 nd Edition Tutorial 7 1 TUTORIAL 7 CREATING A COMPUTATIONAL STYLESHEET.
CIVIL AND GEOMATIC ENGINEERING FT Okyere. CIV 257- COMPUTER PROGRAMMING Lecture 3.
INTRODUCTION TO MATLAB DAVID COOPER SUMMER Course Layout SundayMondayTuesdayWednesdayThursdayFridaySaturday 67 Intro 89 Scripts 1011 Work
How to execute Program structure Variables name, keywords, binding, scope, lifetime Data types – type system – primitives, strings, arrays, hashes – pointers/references.
Data Processing Dennis Shea National Center for Atmospheric Research NCAR is sponsored by the National Science Foundation.
File Input / Output Dennis Shea Input Output
User-Written Functions
Other Kinds of Arrays Chapter 11
National Scientific Library at Tbilisi State University
Midterm Review Programming in Fortran
NCL variable based on a netCDF variable model
SPL – PS1 Introduction to C++.
Presentation transcript:

Dennis Shea National Center for Atmospheric Research Data Processing Dennis Shea National Center for Atmospheric Research NCAR is sponsored by the National Science Foundation

DP Example: multi-formatted data ISCCP: HDF, binary: 20+yrs, 3hrly: 80GB [type byte] calculations, regrid, monthly statistics => netCDF, plot NCEP: GRIB: (same) 20+yrs, 6hrly: 25+GB calculations, regrid, monthly statistics => netCDF, plot CAM: netCDF: (same) 20yrs: ensemble of model runs calculations, monthly statistics => netCDF, plot Science: datasets, calculations, graphics => paper

Data Processing Outline Algebraic/logical expression operators Manual and automatic array creation if statements , do loops Built-in and Contributed functions User developed NCL functions/procedures User developed external procedures Sample processing Command Line Arguments [CLAs] Fortran external subroutines NCL as a scripting tool [time permitting] Global Variables [time permitting]

Algebraic Operators Algebraic expression operators - Negation ^ Exponentiation * Multiply / Divide % Modulus [integers only] # Matrix Multiply + Plus - Minus > Greater than selection < Less than selection Use (…) to circumvent precedence rules All support scalar and array operations [like f90] + is overloaded operator algebraic operator: 5.3 + 7.95  13.25 concatenate string "alpha" + (5.3 + 7)  "alpha12.3”

Logical Expressions Similar to f77 Logical expressions formed by relational operators .le. (less-than-or-equal) .lt. (less-than) .ge. (greater-than-or-equal) .gt. (greater-than) .ne. (not-equal) .eq. (equal) .and. (and) .xor. (exclusive-or) .or. (or) .not. (not)

Manual Array Creation array constructor characters (/…/) a_integer = (/1,2,3/) a_float = (/1.0, 2.0, 3.0/) , a_double = (/1., 2, 3.2d /) a_string = (/"abc",”12345",”hello, world"/) a_logical = (/True, False,True/) a_2darray = (/ (/1,2,3/), (/4,5,6/), (/7,8,9/) /) new function [Fortran dimension, allocate ; C malloc] x = new (array_size/shape, type, _FillValue) _FillValue is optional [assigned default if not user specified] “No_FillValue” means no missing value assigned a = new(3, float) b = new(10, double, 1d+20) c = new( (/5, 6, 7/), integer) d = new(dimsizes(U), string) e = new(dimsizes(ndtooned(U)), logical) aFlt = (/ 1., 2., 3./) also (/1,2.3./) (/1,2,3/)*1.0 new and (/…/) can appear anywhere in script new is not used that often

Automatic Array Creation data importation via supported format u = f->U same for subset of data: u = f->U(:, 3:9:2, :, 10:20) meta data (coordinate array will reflect subset) variable to variable assignment y = x y => same size, type as x plus meta data no need to pre-allocate space for y functions return array: no need to pre-allocate space T42 = f2gsh ( gridi, (/ 64,128/), 42) gridi(10,30,73,144)  T42(10,30,64,128) T42 = f2gsh_Wrap ( gridi, (/ 64,128/), 42) ; contributed.ncl

Array Dimension Rank Reduction subtle point let T(12,64,128) Tjan = T(0, :, :)  Tjan(64,128) Tjan automatically becomes 2D: Tjan(64,128) array rank reduced; considered ‘degenerate’ dimension all applicable meta data copied can override dimension rank reduction Tjan = T(0:0,:,:)  Tjan(1,64,128) TJAN = new( (/1,64,128/), typeof(T), T@_FillValue) TJAN(0,:,:) = T(0,:,:) Dimension Reduction is a "feature" [really ]

Array Syntax/Operators similar to f90/f95 arrays must be same size and shape: conform let A and B be (10,30,64,128) C = A+B D = A-B E = A*B C, D, E automatically created if they did not previously exist let T and P be (10,30,64,128) theta = T*(1000/P)^0.286  theta(10,30,64,128) let SST be (100,72,144) and SICE = -1.8 (scalar) SST = SST > SICE [f90: where (sst.lt.sice) sst = sice] the operation performed by < and > is (sometimes) called clipping use built-in functions whenever possible let T be (10,30,64,128) and P be (30) then theta = T*(1000/conform(T,P,1))^0.286 all array operations automatically ignore _FillValue

if statements if-then-else-end if no else if if-then-end if (note: end if has space) if ( all(a.gt.0.) ) then …statements end if if-then-else-end if if ( any(ismissing(a)) ) then …statements else end if no else if lazy expression evaluation [left-to-right] if ( any(b.lt.0.) .and. all(a.gt.0.) ) then …statements end if

loops break: loop to abort [f90: exit] do loop (traditional structure; end do has space) do i=scalar_start_exp, scalar_end_exp [, scalar_skip_exp] do n = nStrt, nLast [,stride] … statements end do ; 'end do' has a space if start > end identifier 'n' is decremented by a positive stride stride must always be present when start>end do while loop do while (x .gt. 100) … statements end do break: loop to abort [f90: exit] continue: proceed to next iteration [f90: cycle] minimize loop usage in any interpreted language use array syntax, built-in functions, procedures use Fortran/C codes when efficient looping is required

Built-in Functions and Procedures(1 of 2) use whenever possible learn and use utility functions all, any, conform, ind, ind_resolve, dimsizes fspan, ispan, ndtooned, onedtond, mask, ismissing, where system, systemfunc [use local system] functions may require dimension reordering *must* use named dimensions to reorder ; compute zonal and time average of variable ; T(time,lev,lat,lon) = T(0,1,2,3) ; (zonal average requires rectilinear grid) ; no meta data transfered ; Tavg = dim_avg_n( T, 0) ; Tavg(lev,lat,lon)

Built-in Functions and Procedures(2 of 2) functions: NO need to preallocate memory y = wgt_runave (x, wgt, 0) if returning to pre-existing array: must conform procedures: MUST preallocate memory with new psi = new ( dimsizes(u) , typeof(u) ) chi = new ( dimsizes(u) , typeof(u) ) uv2sfvpg(u,v,psi,chi) functions may be imbedded, procedures can not keep code simple: avoid 'deep' imbedding ; example of a deep imbed x = f2gsh( fo2fsh( fbinrecread(f,6,(/9,18,72,144/), “float”)),(/nlat,mlon/),42) ; without deep imbedding G = fbinrecread(f, 6, (/1,18,72,144/), "float") g42 = f2gsh( fo2fsh(G), (/nlat,mlon/),42) delete (G)

dimsizes(x) returns the dimension sizes of a variable will return 1D array of integers if the array queried is multi-dimensional. Variable: dimt Type: integer Total Size: 16 bytes 4 values Number of dimensions: 1 Dimensions and sizes:(4) (0) 12 (1) 25 (2) 116 (3) 100 (0) rank=4 fin = addfile(“./in.nc”,”r”) t = fin->T dimt = dimsizes(t) print(dimt) rank = dimsizes(dimt) print ("rank="+rank)

ispan( start:integer, finish:integer, stride:integer ) returns a 1D array of integers beginning with start and ending with finish. time = ispan(1990,2001,2) print(time) Variable: time Type: integer Number of Dimensions: 1 Dimensions and sizes:(6) (0) 1990 (1) 1992 (2) 1994 (3) 1996 (4) 1998 (5) 2000

fspan( start, finish, npts ) Variable b: Type: float Number of Dimensions: 1 Dimensions and sizes:(10) (0) 1.0 (1) 1.444 (2) 1.888 (3) 2.333 (4) 2.777 (5) 3.222 (6) 3.666 (7) 4.111 (8) 4.555 (9) 5.0 returns a 1D array of evenly spaced float/double values npts is the integer number of points including start and finish values b = fspan(1,5,10) print(b)

ismissing must be used to check for _FillValue attribute if (x.eq.x@_FillValue) will not work x = (/ 1,2, -99, 4, -99, -99, 7/) ; x@_FillValue = -99 xmsg = ismissing(x) ; print(xmsg) (/False, False, True, False, True, True, False /) often used in combination with array functions if (any( ismissing(x) )) then … [else …] end if nFill = num( ismissing(x) ) nVal = num( .not. ismissing(x) ) if (any(ismissing(xOrig) )) then xNew = linint2_Wrap(xin,yin,xOrig,True,xout,yout,0) else xNew = f2gsh_Wrap (x, (/128,256/), 85) end if

mask sets values to _FillValue that DO NOT equal mask array load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl" load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl" begin in = addfile(“atmos.nc","r") ts = in->TS(0,:,:) oro = in->ORO(0,:,:) ; mask ocean ; [ocean=0, land=1, sea_ice=2] land_only = ts land_only = mask(ts,oro,1) end NCL has 1 degree land-sea mask available [landsea_mask] load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/shea_util.ncl” flags for ocean, land, lake, small island, ice shelf

where function where(conditional_expression \ , true_value(s) \ performs array assignments based upon a conditional array function where(conditional_expression \ , true_value(s) \ , false_value(s) ) similar to f90 “where” statement components evaluated separately via array operations ; q is an array; q<0 => q=q+256 ; f90: where(q.lt.0) q=q+256 q = where (q.lt.0, q+256, q) x = where (T.ge.0 .and. ismissing(Z) , a+25 , 1.8*b) salinity = where (sst.lt.5 .and. ice.gt.icemax \ , salinity*0.9, salinity) can not do: y = where(y.eq.0, y@_FillValue, 1./y) instead use: y = where(y.eq.0, y@_FillValue, y) y = 1. / y

dim_*_n [dim_*] perform common operations on an array dimension avg, var, sum, sort, median, rmsd, ….. dim_*_n functions are newer (added to v5.1.1) operate on a user specified dimension use less memory dim_* functions are original interfaces operate on rightmost dimension might require dimension reordering consider: x(time,lat,lon) => x(0,1,2) function dim_avg_n( x, n ) xZon = dim_avg_n( x, 2 ) => xZon(ntim,nlat) xTim = dim_avg_n( x, 0 ) => xTim(nlat,mlon) function dim_avg ( x ) xZon = dim_avg( x ) => xZon(ntim,nlat) xTim = dim_avg( x(lat|:,lon|:,time|:) ) => xTim(nlat,mlon)

conform, conform_dims T(ntim,nlat,mlon,klev), dp(klev) Array operations require that arrays conform function conform( x, r, ndim ) function conform_dims( dims, r, ndim ) expand array (r) to match (x) or dimensions sizes (dims) ndim: scalar or array indicating which dimension(s) of x or dims match the dimensions of r array r is ‘broadcast’ to another array size x(ntim,klev,nlat,mlon), w(nlat) wx = conform (x, w, 2) ; wx(ntim,klev,nlat,mlon) q = x*wx ; q = x* conform (x, w, 2) wx = conform_dims ( (/ntim,klev,nlat,mlon/) , w, 2) wx = conform_dims ( dimsizes(x), w, 2) T(ntim,nlat,mlon,klev), dp(klev) dpT = conform (T, dp, 3) ; dpT(ntim,nlat,mlon,klev) T_wgtAve = dim_sum_n (T*dpT, 3)/dim_sum(dpT, 3)

ind ind operates on 1D array only returns indices of elements that evaluate to True generically similar to IDL “where” and Matlab “find” [returns indices] ; let x[*], y[*], z[*] [z@_FillValue] ; create triplet with only ‘good’ values iGood = ind (.not. ismissing(z) ) xGood = x(iGood) yGood = y(iGood) zGood = z(iGood) ; let a[*], return subscripts can be on lhs ii = ind (a.gt.500 ) a(ii) = 3*a(ii) +2 Should check the returned subscript to see if it is missing if (any(ismissing(ii))) then …. end if

ind, ndtooned, onedtond ind operates on 1D array only returns indices of elements that evaluate to True if nD … use with ndtooned; reconstruct with onedtond, dimsizes generically similar to IDL “where” and Matlab “find” [returns indices] ; let q and x be nD arrays q1D = ndtooned (q) x1D = ndtooned (x) ii = ind(q1D.gt.0. .and. q1D.lt.5) jj = ind(q1D.gt.25) kk = ind(q1D.lt. -50) x1D(ii) = sqrt( q1D(ii) ) x1D(jj) = 72 x1D(kk) = -x1D(kk)*3.14159 x = onedtond(x1D, dimsizes(x))

ind_resolve ind_resolve will return the nD indices corresponding to ind ; print indices p > 50 [let p(time,lat,lon)] if ( any(p.gt.50.) ) then p1D = ndtooned (p) i50 = ind(p1D.gt.50.) ir = ind_resolve( i50, dimsizes(p)) ; 2D [npts,3] print (“ind where p> 50: “+ir(:,0)+” “+ ir(:,1)+” “+ ir(:,2)) ; print time,lat,lon p > 50 print (time(ir(:,0))+” “+ lat(ir(:,1))+” “+ lon(ir(:,2)) ) end if CAVEAT: should not be use for vector subscripting u(ir(:,0),ir(:,1),ir(:,2)) = 5 ; won’t get what you might expect

str_* [string functions] many new str_* functions http://www.ncl.ucar.edu/Document/Functions/string.shtml greatly enhance ability to handle strings can be used to unpack ‘complicated’ string arrays x = (/ “u_052134_C”, “q_1234_C”, “temp_72.55_C”/) var_x = str_get_field( x, 1, “_”) result var_x = (/”u”, “q”, “temp”/) ; -------- col_x = str_get_cols( x, 2, 4) result col_x = (/”052”, “123”, “mp_” /)

date: ut_calendar, ut_inv_calendar Date/time functions: http://www.ncl.ucar.edu/Document/Functions/date.shtml ut_calendar, ut_inv_calendar: Unidata no longer support cd_calendar, cd_inv_calendar will be in 6.0.0 time = (/ 17522904, 17522928, 17522952/) time@units = “hours since 1-1-1 00:00:0.0” date = ut_calendar(time,0) print(date) Variable: date Type: float Total Size: 72 bytes 18 values Number of Dimensions: 2 Dimensions and sizes: [3] x [6] (0,0:5) 2000 1 1 0 0 0 (1,0:5) 2000 1 2 0 0 0 (2,0:5) 2000 1 3 0 0 0 date = ut_calendar(time,-2) print(date) Variable: date Type: integer Total Size: 12 bytes 3 values Number of Dimensions: 1 Dimensions and sizes: [3] (0) 20000101 (1) 20000102 (2) 20000103 TIME = ut_inv_calendar (iyr, imo, iday, ihr, imin, sec \ ,“hours since 1-1-1 00:00:0.0” ,0)

system, systemfunc (1 of 2) system passes to the shell a command to perform an action NCL executes the Bourne shell (can be changed) create a directory if it does not exist (Bourne shell syntax) DIR = “/ptmp/shea/SAMPLE” system (“if ! test –d “+DIR+” ; then mkdir “+DIR+” ; fi”) same but force the C-shell (csh) to be used the single quotes (‘) prevent the Bourne shell from interpreting csh syntax system ( “csh –c ‘ if (! –d “+DIR+”) then ; mkdir “+DIR+” ; endif ’ ” ) execute some local command system (“msrcp –n ‘mss:/SHEA/REANALYSIS/*’ /ptmp/shea”) system (“convert foo.eps foo.png ; /bin/rm foo.eps ”) system (“ncrcat -v T,Q foo*.nc FOO.nc ”) system (“/bin/rm –f “ + file_name)

system, systemfunc (1 of 2) systemfunc returns to NCL information from the system NCL executes the Bourne shell (can be changed) UTC = systemfunc(“date”) Date = systemfunc(“date ‘+%a %m%d%y %H%M’ ”) ; single quote fils = systemfunc (“cd /some/directory ; ls foo*nc”) ; multiple cmds city = systemfunc ("cut -c100-108 " + fname)

User-built Functions and Procedures(1 of 4) two ways to load existing files w functions/proc load "/path/my_script.ncl" use environment variable: NCL_DEFAULT_SCRIPTS_DIR must be loaded prior to use unlike in compiled language avoid function conflict (undef) undef ("mult") function mult(x1,x2,x3,x4) begin return ( x1*x2*x3*x4) end undef ("mult") function mult(x1,x2,x3,x4) begin return ( x1*x2*x3*x4) end x = mult(4.7, 34, 567, 2) load “/some/path/mult.ncl“ begin x = mult(4.7, 34, 567, 2) end

User-Built Functions and Procedures(2 of 4) Development process similar to Fortran/C/IDL General Structure: undef ("function_name") ; optional function function_name (declaration_list) local local_identifier_list ; optional begin statements return (return_value) end undef ("procedure_name") ; optional procedure procedure_name (declaration_list) local local_identifier_list ; optional begin statements end

User-Built Functions and Procedures (3 of 4) arguments are passed by reference [fortran] constrained argument specification: require specific type, dimensions, and size procedure ex(data[*][*]:float,res:logical,text:string) generic specification: type only function xy_interp(x1:numeric, x2:numeric) no type, no dimension specification: procedure whatever (a, b, c) combination function ex (d[*]:float, x:numeric, wks:graphic, y[2], a) function prototyping built-in functions are prototyped

User-Built Functions and Procedures (4 of 4) additional (‘optional’) arguments possible attributes associated with one or more arguments often implemented as a separate argument (not required) procedure ex(data[*][*]:float, text:string,optArg:logical) procedure ex(data, text, opt:logical) begin : if (opt .and. isatt(opt,”scale”)) then d = data*opt@scale end if if (opt .and. isatt(opt,”wgts”)) then if (opt .and. isatt(opt,”array”)) then xloc3D = opt@array_3D ; nD arrays end if ; must be local before use end optArg = True optArg@scale = 0.01 optArg@add = 1000 optArg@wgts = (/1,2,1/) optArg@name = “sample” optArg@array = array_3D ex(x2D, “Example”, optArg)

Computations and Meta Data computations can cause loss of meta data y = x ; variable to variable transfer; all meta copied T = T+273 ; T retains all meta data T@units = "K" ; user responsibility to update meta z = 5*x ; z will have no meta data built-in functions cause loss of meta data Tavg = dim_avg_n(T, 0) s = sqrt(u^2 + v^2) vinth2p is the exception retains coordinate variables http://www.cgd.ucar.edu/csm/support/Data_P/vert_interp.shtml hybrid to pressure (sigma to pressure) + other examples

Ways to Retain Meta Data(1 of 3) use copy functions in contributed.ncl copy_VarMeta (coords + attributes) copy_VarCoords copy_VarAtts load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl" begin f = addfile("dummy.nc", "r") x = f->X ; (ntim,nlat,mlon) ; ---------------- calculations---------------------------- xZon = dim_avg _n(x, 2) ; xZon(ntim,nlat) ; ----------------copy meta data-------------------------- copy_VarMeta(x, xZon) ; xZon(time,lat) end

Ways to Retain Meta Data(2 of 3) f2fosh_Wrap g2gshv_Wrap g2fshv_Wrap f2gshv_Wrap f2fshv_Wrap f2foshv_Wrap linint1_Wrap linint2_Wrap linint2_points_Wrap eof_cov_Wrap eof_cov_ts_Wrap zonal_mpsi_Wrap etc use wrapper functions (eg:) dim_avg_n_Wrap dim_variance_n_Wrap dim_stddev_n_Wrap dim_sum_n_Wrap dim_rmsd_n_Wrap smth9_Wrap g2gsh_Wrap g2fsh_Wrap f2gsh_Wrap f2fsh_Wrap natgrid_Wrap load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl" begin f = addfile("dummy.nc", "r") x = f->X ; time,lev,lat,lon (0,1,2,3) xZon = dim_avg_n_Wrap(x, 3) ; xZon will have meta data end

Ways to Retain Meta Data(3 of 3) use variable to variable transfer + dimension reduction to prefine array before calculation requires that user know a priori the array structure load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl" begin f = addfile("dummy.nc", "r") x = f->X ; x(time,lev,lat,lon) ; -------- var-to-var transfer + dim reduction-------- xZon = x(:,:,:,0) ; xZon(time,lev,lat) ; ---------------------calculations------------------------- xZon = dim_avg (x) xZon@op = "Zonal Avg: "+x@long_name end xZon will have all appropriate meta data of x NCL will add an attribute [here: xZon@lon = lon(0) ]

Example: read fortran binary, compute psi/chi, output binary begin u = fbinrecread ("UV.bin",0, (/120,18,64,128/),"float") v = fbinrecread ("UV.bin",1, (/120,18,64,128/),"float") ;--------------------------------------------------------- ; calculate psi and chi as inverse lapacian of divergence psi = ilapsG (uv2vrG(u,v), 0) chi = ilapsG (uv2dvG(u,v), 0) ; output binary data ;---------------------------------------------------------- fbinrecwrite ("psichi.bin", -1, psi ) ; -1 means append fbinrecwrite ("psichi.bin", -1, chi ) end

Ex: compute PSI/CHI add meta data load “$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl“ begin f = addfile (“UV300.nc”, “r”) u = f->U v = f->V ; calculate psi and chi psi = ilapsG (uv2vrG(u,v), 0) chi = ilapsG (uv2dvG(u,v), 0) ; copy coordinate variables using function in contributed.ncl copy_VarCoords(u, psi) copy_VarCoords(u, chi) ; create unique attributes psi@long_name = "PSI" chi@long_name = "CHI" psi@units = "m2/s" chi@units = “m2/s“ ; scale values for plotting scale = 1.e06 ; incorporate this into units label psi = psi/scale chi = chi/scale ….. plot ….. end

regrid: Spherical Harmonics some regrid functions use spherical harmonics must have global grid to use these functions regular functions strip meta data wrapper versions preserve attributes and create coordinate variables no missing data allowed load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl" begin f = addfile ("/fs/cgd/data0/shea/CLASS/T2m.nc", "r") T63 = f->T T42 = g2gsh_Wrap(T63, (/64,128/), 42) T25 = g2fgsh_Wrap(T63, (/73,144/) ) end

regrid: bilinear interpolation linint2 Cartesian, global or limited area grids Must be grids that can be representd by one-dim coords wrapper versions preserve attributes and create coordinate variables missing data allowed load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl" f = addfile ("/fs/cgd/data0/shea/CLASS/T2m.nc", "r") T = f->T TLI = linint2_Wrap(T&lon, T&lat, T, True, LON, LAT, 0 )

regrid: areal conservative interpolation area_conserve_remap, area_conserve_remap_Wrap global rectilinear grids only _Wrap preserves attributes; creates coordinate variables missing data (_FillValue) *NOT* allowed In particular, use for (say) flux or precipitation interpolation load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl" f = addfile (“GPCP.nc", "r") p = f->PRC P = area_conserve_remap_Wrap (p&lon, p&lat, p \ ,newlon, newlat, False)

regrid: areal average interpolation area_hi2lores, area_hi2lores_Wrap rectilinear grids; can be limited area _Wrap preserves attributes; creates coordinate variables missing data allowed designed for TRMM data NOT strictly ‘conservative’ … but close 50S to 50N Use area_hi2lores for highly structured fields => lower res Use linint2 for low resolution=> high resolution load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl" f = addfile (trmm.nc", "r") p = f->PRC P = area_hi2lores_Wrap (p&lon, p&lat, p, True, LON, LAT, 0 )

poisson_grid_fill replaces all _FillValue grid ponts Poisson’s equation solved via relaxation values at non-missing locations are used as boundary cond. works on any grid with spatial dimensions [*][*] in = addfile (Ocean.nc","r") sst = in->SST poisson_grid_fill (sst, True, 1, 1500, 0.02, 0.6, 0)

Example: Arbitrary Transect load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl" begin ; open file and read in data diri = “/fs/scd/home1/shea/ncldata_input/” fili = “01-50.nc” f = addfile(diri+fili , "r") T = f->T ; T(time,lev,lat,lon) ; create arrays of lat and lon points lonx = (/ 295, 291.05, 287.4 , 284, 281, 274.5, 268, 265 /) laty = (/ -30, -25.2, -20.3, -15, -10.3, 0.0, 9.9, 15 /) ; must have a “regular” grid ; interpolate data to given lat/lon points transect = linint2_points_Wrap (T&lon, T&lat, T, True,lonx,laty, 0) ; transect(time,lev, 8) end ncl < PR_ex04.ncl

Example: Compositing load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl” begin t1 = (/ 15, 37, 95, 88,90 /) ; indices of desired dates t2 = (/ 1, 22, 31, 97, 100, 120/) f = addfile(“01-50.nc”, "r") T1 = f->T(t1,:,:,:) ; T(time,lev,lat,lon) T2 = f->T(t2,:,:,:) ; composite averages T1avg = dim_avg_n_Wrap(T1, 0) ; (lev,lat,lon) T2avg = dim_avg_n_Wrap(T2, 0) Tdiff = T2avg ; trick to transfer meta data Tdiff = T2avg - T1avg ; difference Tdiff@long_name = T2@long_name + “: composite difference” end Also use coordinate subscripting: let “time” have units yyyymm t1 = (/ 190401, 191301, 192001, ……, 200301/) T1 = f->T({t1},:,:,:))

Ex: Climatology, Seasonal Average, EOFs load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl" begin f = addfile (“data_in.nc", "r") P = f->prc ntime = dimsizes(P&time) ; calculate monthly climatology and monthly standard deviation Pclm = clmMonTLL(P) Pstd = stdMonTLL (P) ; reorder array to calculate running average Psea = runave (P(lat|:,lon|:,time|:), 3, 1 ) Psea@time_op = "3-month running mean: seasonal ave“ ; area weight wlat = sqrt(cos(0.01745329*Psea&lat) ) wPsea= Psea ; transfer meta data wPsea= wPsea*conform(wPsea, wlat, 0) ; wgt at all grid pts ; calculate EOFs eof = eofunc (wPsea(:,:,0:ntime-1:12), 3, opt_eof) eofTs = eofunc_ts (Psea(:,:,0:ntime-1:12) , eof, opt_ts) end eofunc_varimax [eofunc_varimax_reorder]

Empirical Orthogonal Functions (EOFs) principal components, eigenvector analysis provide efficient representation of variance May/may not have dynamical information successive eigenvalues should be distinct if not, the eigenvalues and associated patterns are noise 1 from 2, 2 from 1 and 3, 3 from 2 and 4, etc North et. al (MWR, July 1982: eq 24-26) provide formula geophysical variables: spatial/temporal correlated no need sample every grid point no extra information gained oversampling increases size of covar matrix + compute time patterns are domain dependent

Calculating EOFS, writing a NetCDF file (next page) load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl" load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl" load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl" f = addfile("erai_1989-2009.mon.msl_psl.nc","r") ; open file p = f->SLP(::12,{0:90},:) ; (20,61,240) w = sqrt(cos(0.01745329*p&latitude) ) ; weights(61) wp = p*conform(p, w, 1) ; wp(20,61,240) copy_VarCoords(p, wp) x = wp(latitude|:,longitude|:,time|:) ; reorder data neof = 3 eof = eofunc_Wrap(x, neof, False) eof_ts = eofunc_ts_Wrap (x, eof, False) printVarSummary( eof ) ; examine EOF variables printVarSummary( eof_ts )

“printVarSummary” output Variable: eof Type: float Total Size: 175680 bytes 43920 values Number of Dimensions: 3 Dimensions and sizes: [evn | 3] x [latitude | 61] x [longitude | 240] Coordinates: evn: [1..3] latitude: [ 0..90] longitude: [ 0..358.5] Number Of Attributes: 6 eval_transpose : ( 47.2223, 32.42917, 21.44406 ) eval : ( 34519.5, 23705.72, 15675.61 ) pcvar : ( 26.83549, 18.42885, 12.18624 ) matrix : covariance method : transpose _FillValue : 1e+20 Variable: eof_ts Total Size: 252 bytes 63 values Number of Dimensions: 2 Dimensions and sizes: [evn | 3] x [time | 21] time: [780168..955488] Number Of Attributes: 3 ts_mean : ( 3548.64, 18262.12, 20889.75 ) “printVarSummary” output

writing a NetCDF file ; Create netCDF: no define mode [simple approach] system("/bin/rm -f EOF.nc") ; rm any pre-existing file fout = addfile("EOF.nc", "c") ; new netCDF file fout@title = "EOFs of SLP 1989-2009" fout->EOF = eof fout->EOF_TS = eof_ts Graphics: http://www.ncl.ucar.edu/Applications/Scripts/eof_2.ncl

EOFs via NCL CDO: cdo eof,4 anom_file eval_file eof_file eofunc when variances are important eofunc (opt=True, opt@jopt=1) when patterns important eofunc_ts creates time series of amplitudes eofunc_varimax - rotate EOFs using Kaiser varimax criterion Use _Wrap versions in contributed.ncl Example: http://www.ncl.ucar.edu/Applications/eof.shtml let x(time,lat,lon) and X = x(lat |: , lon |:, time |:) wgt grid points => X = X*conform(X, wgt_lat, 0) eof = eofunc_Wrap (X, neof, opteof) eofJan = eofunc_Wrap (X(:, :, 0:ntim-1:12), neofeof,opt) ; 12th eofJul = eofunc_Wrap (X(:, :, 6:ntim-1:12), neof, opt) e_ts = eofunc_ts_Wrap(x(lat |: , lon |:, time |:) , eof, optts) CDO: cdo eof,4 anom_file eval_file eof_file

SVDs via NCL svd_lapack – general rectangular matrix svdcov (svdstd) – Bretherton-Smith-Wallace svdcov_sv (svdstd_sv) – return left/right sing vectors

Post-processing Tools: NCL (WRF-ARW Only) WRF: Weather Research and Forecast Model Post-processing Tools: NCL (WRF-ARW Only) Cindy Bruyère: wrfhelp@ucar.edu

WRF Functions [ wrf_ ] Special WRF NCL Built-in Functions Mainly functions to calculate diagnostics Seldom need to use these directly slp = wrf_slp( z, tk, P, QVAPOR ) Special WRF functions Developed to make it easier to generate plots $NCARG_ROOT/lib/ncarg/nclscripts/wrf/WRFUserARW.ncl slp = wrf_user_getvar(nc_file,”slp”,time)

WRF Generate Plots: A good start - OnLine Tutorial http://www.mmm.ucar.edu/wrf/ OnLineTutorial/ Graphics/ NCL/index.html

Command Line Arguments [CLAs] CLAs are NCL statements on the command line http://www.ncl.ucar.edu/Document/Manuals/Ref_Manual/NclCLO.shtml ncl tStrt=1930 ‘lev=(/250, 750/)’ ‘var=“T”’ ‘fNam=“foo.nc”’ sample.ncl if (.not. isvar(“fNam") .and. (.not. isvar(“var") ) then print(“fNam and/or variable not specified: exit“) exit end if f = addfile (fNam, “r”) ; read file x =f->$var$ ; read variable if (.not. isvar("tStrt")) then ; CLA? tStrt = 1900 ; default if (.not. isvar("lev")) then ; CLA? lev = 500 ; default

External Fortran-C Codes external codes, Fortran, C, or local commerical libraries may be executed from within NCL generic process develop a wrapper (interface) to transmit arguments compile the external code (eg, f77, f90, cc) link the external code to create a shared object process simplified by operator called WRAPIT specifying where shared objects are located external statement external “/dir/code.so” system environment variable: LD_LIBRARY_PATH NCL environment variable: NCL_DEF_LIB_DIR external functions need not have :: before use

Create/Use a Fortran Shared Object (1 of 2) Step 1 bracket f77 subroutine + argument declarations with interface deliminators only codes actually called from NCL need special interface deliminators no Fortran argument can be named data (bug) C NCLFORTSTART subroutine foo ( xin,xout, mlon, nlat, text) integer mlon, nlat real xin(mlon,nlat), xout(mlon,nlat) character*(*) text C NCLEND rest of fortran code; may include many subroutines or other declarations

Create/Use a Fortran Shared Object (2 of 2) Step 2: create shared object using WRAPIT utility WRAPIT foo.f WRAPIT –specified_f90_compiler foo.stub foo.f90 WRAPIT –pg foo.stub foo.f90 Step 3: add external statement to NCL script external SO_NAME "path_name" SO_NAME is arbitrary (capital by convention) external DEMO "./foo.so" (".so" by convention) Step 4: invoking the shared object in the script SO_NAME::fortran_name(arguments) DEMO::foo(x,y,mlon,nlat,label)

what WRAPIT does creates dynamic shared object [.so ] using ld automatically creates NCL-fortran interface(s) uses wrapit77 to create C interface [f77 syntax] wrapit77 < foo.f >! foo_W.c only uses code enclosed between delimeters input can be code fragment(s) or full subroutine(s) compiles and creates object modules nhlcc -c foo_W.c  foo_W.o nhlf90 -c foo.f  foo.o creates dynamic shared object [.so ] using ld SGI: ld -64 -o foo.so -shared foo_W.o foo.o -fortran SUN: /usr/ccs/bin/ld -o foo.so foo_W.o foo.o -G -lf90 -L /opt/SUNWspro/lib -l sunperf removes extraneous intermediate files WRAPIT –h <return> will show options and examples

NCL/Fortran Argument Passing arrays: NO reordering required x(time,lev,lat,lon) <=map=> x(lon,lat,lev,time) ncl: x(N,M) => value <= x(M,N) :fortran [M=3, N=2] x(0,0) => 7.23 <= x(1,1) x(0,1) => -12.5 <= x(2,1) x(0,2) => 0.3 <= x(3,1) x(1,0) => 323.1 <= x(1,2) x(1,1) => -234.6 <= x(2,2) x(1,2) => 200.1 <= x(3,2) numeric types must match integer <==> integer double <==> double float <==> real Character-Strings: a nuisance [C,Fortran]

Example: Linking to Fortran 77 STEP 1: quad.f C NCLFORTSTART subroutine cquad(a,b,c,nq,x,quad) dimension x(nq), quad(nq) C NCLEND do i=1,nq quad(i) = a*x(i)**2 + b*x(i) + c end do return end subroutine prntq (x, q, nq) integer nq real x(nq), q(nq) write (*,"(i5, 2f10.3)") i, x(i), q(i) STEP 2: quad.so WRAPIT quad.f STEPS 3-4 external QUPR "./quad.so" begin a = 2.5 b = -.5 c = 100. nx = 10 x = fspan(1., 10., 10) q = new (nx, float) QUPR::cquad(a,b,c, nx, x,q) QUPR::prntq (x, q, nx) end

Example: Linking F90 routines quad.f90 subroutine cquad(a, b, c, nq, x, quad) implicit none integer , intent(in) :: nq real , intent(in) :: a, b, c, x(nq) real , intent(out) :: quad(nq) integer :: i ! local quad = a*x**2 + b*x + c ! array return end subroutine cquad subroutine prntq(x, q, nq) real , intent(in) :: x(nq), q(nq) integer :: i ! local do i = 1, nq write (*, '(I5, 2F10.3)') i, x(i), q(i) end do end STEP 1: quad90.stub C NCLFORTSTART subroutine cquad (a,b,c,nq,x,quad) dimension x(nq), quad(nq) ! ftn default C NCLEND subroutine prntq (x, q, nq) integer nq real x(nq), q(nq) prntq_I.f90 module prntq_I interface subroutine prntq (x,q,nq) real, dimension(nq) :: x, q integer, intent(in) :: nq end subroutine end interface end module cquad_I.f90 module cquad_I subroutine cquad (a,b,c,nq,x,quad) real, intent(in) :: a,b,c integer, intent(in) :: nq real,dimension(nq), intent(in) :: x real,dimension(nq),intent(out) :: quad end subroutine end interface STEP 2: quad90.so WRAPIT –pg quad90.stub printq_I.f90 \ cquad_I.f90 quad.f90 STEP 3-4: same as previous ncl < PR_quad90.ncl

Fortran vs. NCL: string - character NCL (C)  Fortran: string/character interchange problematical C NCLFORTSTART subroutine csdemo (string_in, string_out) character*(*) string_in ! passed FROM ncl character*8 string_out ! passed TO ncl C NCLEND print *, string_in string_out = "F-to-NCL" return end external DEMO "./csdemo.so" begin cstring = new (8, character) DEMO::csdemo("NCL-F" , cstring) stringc = chartostring( cstring ) print ( stringc ) end Can NOT pass arrays of strings or characters

Linking Commercial IMSL (NAG,…) routines STEP 1: rcurvWrap.f C NCLFORTSTART subroutine rcurvwrap (n, x, y, nd, b, s, st, n1) integer n, nd, n1 real x(n), y(n), st(10), b(n1), s(n1) C NCLEND call rcurv(n,x,y,nd,b,s,st) ! IMSL return end STEP 2: rcurvWrap.so WRAPIT –l mp –L /usr/local/lib64/r4i4 –l imsl_mp rcurvWrap.f external IMSL “./rcurvWrap.so” begin x = (/ 0,0,1,1,2,2,4,4,5,5,6,6,7,7 /) y = (/508.1, 498.4, 568.2, 577.3, 651.7, 657.0, 755.3 \ 758.9, 787.6, 792.1. 841.4, 831.8, 854.7, 871.4 /) nobs = dimsizes(y) nd = 2 n1 = nd+1 b = new ( n1, typeof(y)) s = new ( n1, typeof(y)) st = new (10, typeof(y)) IMSL::rcurvwrap(nobs, x, y, nd, b, s, st, n1) end

Accessing LAPACK (1 of 2) double precision LAPACK (BLAS) => distributed with NCL explicitly link LAPACK lib via fortran interface: WRAPIT eg: subroutine dgels solves [over/under]determined real linear systems C NCLFORTSTART SUBROUTINE DGELSI( M, N, NRHS, A, B, LWORK, WORK ) IMPLICIT NONE INTEGER M, N, NRHS, LWORK DOUBLE PRECISION A( M, N ), B( M, NRHS), WORK(LWORK) C NCLEND C declare local variables INTEGER INFO CHARACTER*1 TRANS TRANS = "N” CALL DGELS(TRANS, M,N,NRHS,A,LDA,B,LDB,WORK,LWORK,INFO) RETURN END WRAPIT –L $NCARG_ROOT/lib -l lapack_ncl dgels_interface.f

Accessing LAPACK (2 of 2) external DGELS "./dgels_interface.so” ; NAG example: http://www.nag.com/lapack-ex/node45.html ; These are transposed from the fortran example A = (/ (/ -0.57, -1.93, 2.30, -1.93, 0.15, -0.02 /), \ ; (4,6) (/ -1.28, 1.08, 0.24, 0.64, 0.30, 1.03 /), \ (/ -0.39, -0.31, 0.40, -0.66, 0.15, -1.43 /), \ (/ 0.25, -2.14,-0.35, 0.08,-2.13, 0.50 /) /)*1d0 ; must be double dimA = dimsizes(A) N = dimA(0) ; 4 M = dimA(1) ; 6 B = (/-2.67 ,-0.55 ,3.34, -0.77, 0.48, 4.10/)*1d0 ; must be double ; LAPACK wants 2D nrhs = 1 B2 = conform_dims ( (/nrhs,M/), B, 1 ) ; (1,6) B2(0,:) = B lwork = 500 ; allocate space work = new ( lwork, "double", "No_FillValue") ; must be double DGELS::dgelsiw(M, N, nrhs, A , B2, lwork, work ) print(B2(0,0:N-1))

Combining NCL and Fortran in C-shell #!/usr/bin/csh # =========== NCL ============ cat >! main.ncl << "END_NCL" load ”$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl" load ”$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl“ load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl“ external SUB "./sub.so" begin ... end "END_NCL" # ===========FORTRAN ======== cat >! sub.f << "END_SUBF" C NCLFORTSTART C NCLEND "END_SUBF" # =========== WRAPIT========== WRAPIT sub.f # =========== EXECUTE ======== ncl main.ncl >&! main.out

Global Variables and Scope [1 of 2] by definition: can be accessed from any function or procedure different from local variables NCL does not have explicit “global variables” requires understanding of NCL’s variable scope [identical to Pascal] http://www.ncl.ucar.edu/Document/Manuals/Ref_Manual/NclStatements.shtml#Scoping load “dummy_1.ncl” ; not aware of constants below GRAVITY_ = 9.8 RGAS_ = 204 load “dummy_2.ncl” ; can use GRAVITY and RGAS REARTH_ = 6371.009 ; km load “dummy_3.ncl” ; can use GRAVITY, RGAS, REARTH begin ; can use GRAVITY, RGAS, REARTH : end

Global Variables and Scope [2 of 2] knowledgeable user can simulate … one approach create a file GLOBAL.ncl populate with desired constants best to follow some user defined conventions [e.g. capital letters] ; contents of GLOBAL.ncl GRAVITY = 9.8 ; GRAVITY@units = “m/s” RDRY = 286.9 ; J/(kg-K) REARTH = 63.71.009 ; km GRAVITY_d = 9.81d ; m/s (double) load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl" load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl" load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl" load "/my/path/GLOBAL.ncl“ load "foo_1.ncl“ begin end

list variable [1 of 2] ‘container’ for variables of any type can be mixed type (numeric, string, file, …) three ways to create a variable of list f = addfiles(…) x = [/…/] list constructor a = NewList(…) q = addfiles (fil_names, "r") ; q is of type “list” x = q[:]->X ; [:] mean all elements of list s = q[2:8:2]->X ; extract x from files 2,4,6,8 f = addfile(…., “r”) ; type file i = ispan(1,10,2) ; integer z = (/ “example”, “wkshop”/) ; array constructor variable (/.../) delete( [/ f, i, z /] ) ; delete multiple variables

list variable [2 of 2] r = random_normal(mean, stdev, N) s = (/ “sample” , “string” /) lst = NewList (“fifo”) ; create a list variable ListPush (lst, r ) ; add ‘r’ ListPush (lst, r^2 ) ; add r^2 ListPush (lst, s ) ; add s nlst = ListCount( lst ) ; number of items in ‘lst’ do n=0,nlst-1 print( lst[n] ) ; print contents of list item ‘n’ end do

NCL as a scripting tool begin mssi = getenv (“MSSOCNHIST”) ; get environment variable diri = “/ptmp/user/” ; dir containing input files fili = “b20.007.pop.h.0” ; prefix of input files diro = “/ptmp/user/out/” ; dir containing output files filo = “b20.TEMP.” ; prefix of output files nyrStrt = 300 ; 1st year nyrLast= 999 ; last year do nyear=nyrStrt,nyrLast print (“---- “+nyear+” ----”) ; read 12 months for nyear msscmd = “msrcp –n ‘mss:” +mssi+ fili+nyear+ “-[0-1][0-9].nc’ “+diri+”.” print (“msscmd=“+msscmd) system (msscmd) ; strip off the TEMP variable ncocmd = “ncrcat –v TEMP “ +diri+fili+”*.nc “+ diro+filo+nyear+”.nc” print (“ncocmd=“+ncocmd) system (ncocmd) ; remove the 12 monthly files rmcmd = “’/bin/rm’ “+diri+fili+nyear+ ”.nc” print (“rmcmd=“+rmcmd) system (rmcmd) end do end http://www.ncl.ucar.edu/Applications/system.shtml