Ok, I think I've found the problem: dx2 and dy2 are distance in meters, not degrees.<br>Since u and v are given in latitude/longitude, there must be an implicit conversion inside the uv2vr_cfd function.<br><br>Anyone knows how this conversion is performed?<br><br>
Giorgio<br><br><br>
----Messaggio originale----<br>
Da: giorgio.graffino@alice.it<br>
Data: 29-set-2015 11.31<br>
A: &lt;ncl-talk@ucar.edu&gt;<br>
Ogg: [ncl-talk] NCL uv2vr_cfd function on Python<br>
<br>
Dear NCL Users,<br>I'm trying to adapt an NCL script I wrote to compute water vertical speed on Python.<br><br>In particular, I'm finding some difficulties on "translating" the NCL built-in function uv2vr_cfd into Python; I used that function to compute the vertical component of wind stress. On the web page (https://www.ncl.ucar.edu/Document/Functions/Built-in/uv2vr_cfd.shtml) it's stated that<br><br><i>According to H.B. Bluestein [Synoptic-Dynamic Meteorology in Midlatitudes, 1992,
Oxford Univ. Press p113-114], let D represent the partial derivative, a the radius of 
the earth, phi the latitude and dx2/dy2 the appropriate longitudinal and latitudinal 
spacing, respectively. Then, letting j be the latitude y-subscript, and i be the 
longitude x-subscript:
</i><pre><i>    <font color="000000">rv = Dv/Dx - Du/Dy + (u/a)*</font><font color="000000"><a href="https://www.ncl.ucar.edu/Document/Functions/Built-in/tan.shtml">tan</a></font><font color="000000">(phi)</font></i><p><font color="000000"><i>

    rv(j,i) = (v(j,i+1)-v(j,i-1))/dx2(j)
              - (u(j+1,i)-u(j-1,i))/dy2(j)
              + (u(j,i)/a)*<a href="https://www.ncl.ucar.edu/Document/Functions/Built-in/tan.shtml">tan</a>(phi(j))</i></font><br></p></pre>Now, I tried to write that function on Python in this way<br><br>
<!--
p, li { white-space: pre-wrap; }
-->
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><i>def Curl(u,v,nlat,nlon):</i></p><i>

</i><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><i>    rv = np.empty(shape=(nlat,nlon))</i></p><i>
</i><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><i>    rv.fill(np.nan)</i></p><i>
</i><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><i>    M0 = np.arange(1,nlat-1)                      # M0 = [1,...,nlat-1]</i></p><i>
</i><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><i>    N0 = np.arange(1,nlon-1)                     # N0 = [1,...,nlon-1]</i></p><i>
</i><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><i>    for m in M0:</i></p><i></i><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><i>            for n in N0:</i></p><i></i><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><i>                    rv[m,n] = (v[m,n+1]-v[m,n-1])/(lons[n+1]-lons[n-1]) - \</i></p><i>
</i><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><i>                                    (u[m+1,n]-u[m-1,n])/(lats[m+1]-lats[m-1]) + \</i></p><i>
</i><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><i>                                    (u[m,n]/radius)*tans[m]</i></p><i>
</i><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><i>    return rv</i></p><br>but, even if the pattern is similar, there are four orders of magnitude between the values. I attach results using NCL (MedDailyINDEX.png file) and Python (WindStressCurl.png) for the same day.<br><br>Could it be possible to know how exactly rv is computed inside uv2vr_cfd function? Because I think there is something missing in my implementation...<br><br>Thanks for your attention.<br><br>Regards,<br>Giorgio<br><br>
<br>
<br>
<br>