[ncl-talk] Loop Over Latitude and Level Arrays

ANDIKA FAUZIAH HAPSARI, A.P andika.hapsari at bmkg.go.id
Tue Dec 31 04:26:59 MST 2019


Oh I'm so sorry, I clicked the reply button instead of repy all. Thank you 
for remind me.



I think it's becasue kf_filter.ncl script only works on two dimension, but 
when I tried to modify kf_filter, it couldn't work (but i think i did it 
wrong too)



I have tried 3d array, and the error message I got was

fatal:Number of subscripts do not match number of dimensions of variable,(3) 
Subscripts used, (4) Subscripts expected
fatal:["Execute.c":8637]:Execute: Error occurred at or near line 229 in file 
filter_vertical_waves_wrf2.ncl



So I don't understand which part I got it wrong.



From: "Barry Lynn (barry.h.lynn at gmail.com)" <barry.h.lynn at gmail.com>
To: "ANDIKA FAUZIAH HAPSARI, A.P" <andika.hapsari at bmkg.go.id>, ncl-talk 
<ncl-talk at ucar.edu>
Date: Tue, 31 Dec 2019 09:10:02 +0200
Subject: Re: [ncl-talk] Loop Over Latitude and Level Arrays


Hi:


Please also respond to the list.  Someone on the list might be able to help 
you faster than I can. Also, members of the list can learn useful 
information from this exchange.



It would be helpful if you would verify where the script fails, whether it 
is the one you are using or a called routine.


Lastly, the script is telling you that your variable is missing information 
about what it is.  You need to name it, as shown in the NCL help pages.


But, before you do that, try reading your 4d array into a 2d array and see 
if you get the same error using the 2d array.


 Barry


On Tue, Dec 31, 2019 at 8:59 AM ANDIKA FAUZIAH HAPSARI, A.P 
<andika.hapsari at bmkg.go.id> wrote:


Thanks for your answer. But I'm not sure if I can pass the 4D variable 
directly. Because when I used this script below,  I got this error message :


warning:Argument 0 of the current function or procedure was coerced to the 
appropriate type and thus will not change if the function or procedure 
modifies its value
fatal:["NclAtt.c":262]:Attribute assignment type mismatch.
fatal:(lon) is not a named dimension in variable (inData).
fatal:["Execute.c":8637]:Execute: Error occurred at or near line 36 in file 
$NCARG_ROOT/lib/ncarg/nclscripts/contrib/kf_filter.ncl
fatal:["Execute.c":8637]:Execute: Error occurred at or near line 234 in file 
filter_vertical_waves_wrf.ncl




Or maybe, is there something wrong with my script?
Thanks in advance


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; filter_waves.ncl
; Carl Schreck (carl at cicsnc.org)
; February 2011
; Updated for style October 2011
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Description: Filter data for each equatorial wave type
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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 "$NCARG_ROOT/lib/ncarg/nclscripts/csm/shea_util.ncl"
;load "$NCARG_ROOT/lib/ncarg/nclscripts/wrf/WRFUserARW.ncl"
;load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/diagnostics_cam.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/contrib/time_axis_labels.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/contrib/kf_filter.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/contrib/cd_string.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/print_clock.ncl"
;load "~/lib/print_clock.ncl"

begin
   
  print_clock( "Here we go! " )
; These are some parameters that could be useful to have up top
  mis = -999
  mis at _FillValue = -999
  obsPerDay = 4
  if( .not.isvar("varIn") ) then
    varIn = "u"
  end if
  if( .not.isvar("latitudeBand") ) then
    latitudeBand = "15N-15N"
  end if
  print( varIn + "." + latitudeBand )
  basePath = "/home/sarihmmm/datareanly/reanalysis/"
  pathIn   = basePath + "anginU.nc"
  pathOut  = basePath + "anginU" + varIn + "." + latitudeBand + 
".vertkelvin.nc"
  wk99 = False ; True uses the original Wheeler-Kiladis filters,
               ; False uses slight modifications from recent papers
  calcHigh = False
  calcLow = False
  calcMrg = False
  calcMjo = False
  calcKelvin = True
  calcEr = False
  calcMtd = False
  calcTd = False
  makeNewFile = True
; Open the input files
  fin  = addfile( pathIn, "r" )
  time = fin->time
  level = fin->level
  longitude  = fin->longitude
  latitude  = fin->latitude
; Open the output files
  setfileoption( "nc", "Format", "LargeFile" )
  if( makeNewFile ) then
    system( "rm " + pathOut )
    fout  = addfile( pathOut, "c" )
    fout->time = time
    fout->level = level
    fout->longitude  = longitude
    fout->latitude  = latitude
  else
    fout  = addfile( pathOut, "w" )
  end if
  print_clock( "Reading the input data... " )
  data = fin->$varIn$
  data&time at beginning_date = cd_string( data&time(0), "" )
  data&time at ending_date    = cd_string( data&time(dimsizes(data&time)-1), "" 
)
  if( any( ismissing(data) ) ) then
    print_clock( "WARNING: Setting missing data to zero" )
    data = where( ismissing(data), 0, data )
  end if
  printVarSummary(data)
  if( calcHigh ) then
    print_clock( "Filtering High..." )
    high = data
    high at longitudeg_name      = "High frequency"
    high at filter         = "Highpass time filter"
    high at wavenumber     = (/ -9999,  9999 /)
    high at period         = (/ 0.01, 120 /)
    high at depth          = (/ mis, mis /)
    do z = 0, ( dimsizes(level) - 1 )
  ;    print_clock( z + " " + ( dimsizes(level) - 1 ) + " " )
      high(time|:,{level|level(z)},longitude|:) = (/ kf_filter(  \\
         data(time|:,{level|level(z)},longitude|:), obsPerDay,  \\
         high at period(0),     high at period(1),     \\
         high at wavenumber(0), high at wavenumber(1), \\
         high at depth(0),      high at depth(1),      \\
         "none" ) /)
    end do
    print_clock( "Writing high... " )
    fout->high = high
    delete(high)
  end if

  if( calcLow ) then
    print_clock( "Filtering Low..." )
    low = data
    low at longitudeg_name      = "Low frequency"
    low at filter         = "Lowpass time filter"
    low at wavenumber     = (/ -9999,  9999 /)
    low at period         = (/ 120, 9999 /)
    low at depth          = (/ mis, mis /)
    do z = 0, ( dimsizes(level) - 1 )
  ;    print_clock( z + " " + ( dimsizes(level) - 1 ) + " " )
      low(time|:,{level|level(z)},longitude|:,latitude|:) = (/ kf_filter(  
\\
         data(time|:,{level|level(z)},longitude|:,latitude|:), obsPerDay,  
\\
         low at period(0),     low at period(1),     \\
         low at wavenumber(0), low at wavenumber(1), \\
         low at depth(0),      low at depth(1),      \\
         "none" ) /)
    end do
    print_clock( "Writing Low... " )
    fout->low = low
    delete(low)
  end if

  if( calcMrg ) then
    print_clock( "Filtering MRG..." )
    mrg = data
    mrg at longitudeg_name     = "Mixed Rossby-Gravity Waves in " + 
str_upper(varIn)
    mrg at filter        = "Wheeler & Kiladis (1999)"
    mrg at wavenumber    = (/  -10,  -1 /)
    mrg at period        = (/    3,  96 /)
    mrg at depth         = (/    8,  90 /)
    do z = 0, ( dimsizes(level) - 1 )
;    print_clock( z + " " + ( dimsizes(level) - 1 ) + " " )
      mrg(time|:,{level|level(z)},longitude|:) = (/ kf_filter(  \\
         data(time|:,{level|level(z)},longitude|:), obsPerDay,  \\
         mrg at period(0),     mrg at period(1),     \\
         mrg at wavenumber(0), mrg at wavenumber(1), \\
         mrg at depth(0),      mrg at depth(1),      \\
         "mrg" ) /)
    end do
    print_clock( "Writing MRG... " )
    fout->mrg = mrg
    delete(mrg)
  end if

  if( calcMjo ) then
    print_clock( "Filtering MJO..." )
    mjo = data
    mjo at longitudeg_name     = "Madden-Julian Oscillatitudeion in " + 
str_upper(varIn)
    if( wk99 ) then
      mjo at filter        = "Wheeler & Kiladis (1999)"
      mjo at wavenumber    = (/   1,   5 /)
;     mjo at wavenumber    = (/   0,   9 /)
      mjo at period        = (/  30,  96 /)
      mjo at depth         = (/ mis, mis /)
    else
      mjo at filter        = "Kiladis et al. (2005 JAS)"
      mjo at wavenumber    = (/   0,   9 /)
      mjo at period        = (/  20, 100 /)
      mjo at depth         = (/ mis, mis /)
    end if
    do z = 0, ( dimsizes(level) - 1 )
  ;    print_clock( z + " " + ( dimsizes(level) - 1 ) + " " )
    mjo(time|:,{level|level(z)},longitude|:) = (/ kf_filter(  \\
       data(time|:,{level|level(z)},longitude|:), obsPerDay,  \\
       mjo at period(0),     mjo at period(1),     \\
       mjo at wavenumber(0), mjo at wavenumber(1), \\
       mjo at depth(0),      mjo at depth(1),      \\
       "none" ) /)
    end do
    print_clock( "Writing MJO... " )
    fout->mjo = mjo
    delete(mjo)
  end if

  if( calcKelvin ) then
    print_clock( "Filtering KELVIN..." )
    kelvin = data
    kelvin at longitudeg_name  = "Kelvin Waves in " + str_upper(varIn)
    if( wk99 ) then
      kelvin at filter     = "Wheeler & Kiladis (1999)"
      kelvin at wavenumber = (/   1,  14 /)
      kelvin at period     = (/ 2.5,  30 /)
      kelvin at depth      = (/   8,  90 /)
    else
      kelvin at filter     = "Straub & Kiladis (2002)"
      kelvin at wavenumber = (/   1,  14 /)
      kelvin at period     = (/ 2.5,  17 /)
      kelvin at depth      = (/   5,  90 /)
    end if
    do z = 0, ( dimsizes(level) - 1 )
 do y = 0, ( dimsizes(level) - 1 )
  ;    print_clock( z + " " + ( dimsizes(level) - 1 ) + " " )
      kelvin(time|:,{level|level(z)},{latitude|latitude(y)},longitude|:) = 
(/ kf_filter(  \\
         data(time|:,{level|level(z)},{latitude|latitude(y)},longitude|:), 
obsPerDay,  \\
         kelvin at period(0),     kelvin at period(1),     \\
         kelvin at wavenumber(0), kelvin at wavenumber(1), \\
         kelvin at depth(0),      kelvin at depth(1),      \\
         "kelvin" ) /)
    end do
    end do
    print_clock( "Writing KELVIN... " )
    fout->kelvin = kelvin
    delete(kelvin)
  end if

  if( calcEr ) then
    print_clock( "Filtering ER..." )
    er = data
    er at longitudeg_name      = "Equatorial Rossby Waves in " + 
str_upper(varIn)
    if( wk99 ) then
      er at filter         = "Wheeler & Kiladis (1999)"
      er at wavenumber     = (/ -10,  -1 /)
      er at period         = (/ 9.7,  48 /)
      er at depth          = (/   8,  90 /)
    else
      er at filter         = "Kiladis et al. (2009 Rev. Geophys.)"
      er at wavenumber     = (/ -10,  -1 /)
      er at period         = (/ 9.7,  48 /)
      er at depth          = (/   5,  90 /)
    end if
    do z = 0, ( dimsizes(level) - 1 )
  ;    print_clock( z + " " + ( dimsizes(level) - 1 ) + " " )
      er(time|:,{level|level(z)},longitude|:) = (/ kf_filter(  \\
         data(time|:,{level|level(z)},longitude|:), obsPerDay,  \\
         er at period(0),     er at period(1),     \\
         er at wavenumber(0), er at wavenumber(1), \\
         er at depth(0),      er at depth(1),      \\
         "er" ) /)
    end do
    print_clock( "Writing ER... " )
    fout->er = er
    delete(er)
  end if
  if( calcMtd ) then
    print_clock( "Filtering MRG/TD..." )
    td = data
    td at longitudeg_name      = "MRG/TD in " + str_upper(varIn)
    td at filter         = "Frank and Roundy (2006), extended to wavenumber 
-20"
    td at wavenumber     = (/ -20,  -0 /)
    td at period         = (/ 2.5,  10 /)
    td at depth          = (/  mis, mis /)
    do z = 0, ( dimsizes(level) - 1 )
  ;    print_clock( z + " " + ( dimsizes(level) - 1 ) + " " )
      td(time|:,{level|level(z)},longitude|:) = (/ kf_filter(  \\
         data(time|:,{level|level(z)},longitude|:), obsPerDay,  \\
         td at period(0),     td at period(1),     \\
         td at wavenumber(0), td at wavenumber(1), \\
         td at depth(0),      td at depth(1),      \\
         "none" ) /)
    end do
    print_clock( "Writing TD... " )
    fout->td = td
    delete(td)
  end if

  if( calcTd ) then
    print_clock( "Filtering TD..." )
    td = data
    td at longitudeg_name      = "TD-type Disturbances in " + str_upper(varIn)
    td at filter         = "Roundy and Frank (2004), extended to wavenumber 
-20"
    td at wavenumber     = (/ -20,  -6 /)
    td at period         = (/ 2.5,   5 /)
    td at depth          = (/  90, mis /)
    do z = 0, ( dimsizes(level) - 1 )
  ;    print_clock( z + " " + ( dimsizes(level) - 1 ) + " " )
      td(time|:,{level|level(z)},longitude|:) = (/ kf_filter(  \\
         data(time|:,{level|level(z)},longitude|:), obsPerDay,  \\
         td at period(0),     td at period(1),     \\
         td at wavenumber(0), td at wavenumber(1), \\
         td at depth(0),      td at depth(1),      \\
         "none" ) /)
    end do
    print_clock( "Writing TD... " )
    fout->td = td
    delete(td)
  end if

  print_clock( "Closing file..." )
  delete(fout)
  print_clock( "Thank you, come again. " )
end ; filter_waves


From: "Barry Lynn (barry.h.lynn at gmail.com)" <barry.h.lynn at gmail.com>
To: "ANDIKA FAUZIAH HAPSARI, A.P" <andika.hapsari at bmkg.go.id>
Cc: "ncl-talk at ucar.edu" <ncl-talk at ucar.edu>
Date: Tue, 31 Dec 2019 07:48:15 +0200
Subject: Re: [ncl-talk] Loop Over Latitude and Level Arrays


Hi:


When you pass the variable to the kf_filter, you can loop over both over 
latitude and level, as you pass the 4D variable directly into the routine.


I am not sure if there is a faster way,


Barry
 
On Mon, Dec 30, 2019 at 8:17 PM ANDIKA FAUZIAH HAPSARI, A.P via ncl-talk 
<ncl-talk at ucar.edu> wrote:
Hello..


I have 4 Dimension data (latitude, longitude, level, time) and I want to 
filter kelvin waves vertically which use kf_filter function that only has 
time and longitude. And I need to loop over both latitude and level so that 
the array can pass kf_filter.


Is there any instruction and script to do loop over latitude and level 
arrays? 


Thanks in advance.
_______________________________________________
ncl-talk mailing list
ncl-talk at ucar.edu
List instructions, subscriber options, unsubscribe:
http://mailman.ucar.edu/mailman/listinfo/ncl-talk
 


--
Barry H. Lynn, Ph.D
Senior Associate Scientist, Lecturer,
The Institute of the Earth Science, 
The Hebrew University of Jerusalem, 
Givat Ram, Jerusalem 91904, Israel 
Tel: 972 547 231 170
Fax: (972)-25662581


C.E.O, Weather It Is, LTD
Weather and Climate Focus
http://weather-it-is.com
Jerusalem, Israel
Local: 02 930 9525
Cell: 054 7 231 170
Int-IS: x972 2 930 9525






--
Barry H. Lynn, Ph.D
Senior Associate Scientist, Lecturer,
The Institute of the Earth Science, 
The Hebrew University of Jerusalem, 
Givat Ram, Jerusalem 91904, Israel 
Tel: 972 547 231 170
Fax: (972)-25662581


C.E.O, Weather It Is, LTD
Weather and Climate Focus
http://weather-it-is.com
Jerusalem, Israel
Local: 02 930 9525
Cell: 054 7 231 170
Int-IS: x972 2 930 9525
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20191231/9946a082/attachment.html>


More information about the ncl-talk mailing list