gphys 1.5.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. checksums.yaml +7 -0
  2. data/ChangeLog +7414 -0
  3. data/LICENSE.txt +1 -1
  4. data/Rakefile +0 -2
  5. data/doc/derivative/math-doc/document/images.log +385 -0
  6. data/doc/ep_flux/math-doc/document/images.log +1375 -0
  7. data/doc/ganalysis/doc/NumRu.html +203 -0
  8. data/doc/ganalysis/doc/NumRu/GAnalysis.html +931 -0
  9. data/doc/ganalysis/doc/NumRu/GAnalysis/BetaPlane.html +574 -0
  10. data/doc/ganalysis/doc/NumRu/GAnalysis/Fitting.html +576 -0
  11. data/doc/ganalysis/doc/NumRu/GAnalysis/LogP.html +425 -0
  12. data/doc/ganalysis/doc/NumRu/GAnalysis/Met.html +2021 -0
  13. data/doc/ganalysis/doc/NumRu/GAnalysis/MetZ.html +524 -0
  14. data/doc/ganalysis/doc/NumRu/GAnalysis/Planet.html +1047 -0
  15. data/doc/ganalysis/doc/NumRu/GAnalysis/QG.html +794 -0
  16. data/doc/ganalysis/doc/NumRu/GAnalysis/QG/Uninitialized.html +215 -0
  17. data/doc/ganalysis/doc/NumRu/GAnalysis/QG_common.html +603 -0
  18. data/doc/ganalysis/doc/NumRu/GAnalysis/QG_sphere.html +760 -0
  19. data/doc/ganalysis/doc/NumRu/GAnalysis/QG_sphere_common.html +251 -0
  20. data/doc/ganalysis/doc/NumRu/GAnalysis/QG_sphere_div.html +424 -0
  21. data/doc/ganalysis/doc/NumRu/GAnalysis/SigmaCoord.html +321 -0
  22. data/doc/ganalysis/doc/NumRu/GGraph.html +334 -0
  23. data/doc/ganalysis/doc/NumRu/GPhys.html +579 -0
  24. data/doc/ganalysis/doc/Object.html +210 -0
  25. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/beta_plane_rb.html +60 -0
  26. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/covariance_rb.html +56 -0
  27. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/eof_rb.html +64 -0
  28. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/fitting_rb.html +54 -0
  29. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/histogram_rb.html +58 -0
  30. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/log_p_rb.html +60 -0
  31. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/met_rb.html +60 -0
  32. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/met_z_rb.html +58 -0
  33. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/planet_rb.html +58 -0
  34. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/qg_rb.html +64 -0
  35. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/sigma_coord_rb.html +56 -0
  36. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis_rb.html +98 -0
  37. data/doc/ganalysis/doc/created.rid +13 -0
  38. data/doc/ganalysis/doc/images/brick.png +0 -0
  39. data/doc/ganalysis/doc/images/brick_link.png +0 -0
  40. data/doc/ganalysis/doc/images/bug.png +0 -0
  41. data/doc/ganalysis/doc/images/bullet_black.png +0 -0
  42. data/doc/ganalysis/doc/images/bullet_toggle_minus.png +0 -0
  43. data/doc/ganalysis/doc/images/bullet_toggle_plus.png +0 -0
  44. data/doc/ganalysis/doc/images/date.png +0 -0
  45. data/doc/ganalysis/doc/images/find.png +0 -0
  46. data/doc/ganalysis/doc/images/loadingAnimation.gif +0 -0
  47. data/doc/ganalysis/doc/images/macFFBgHack.png +0 -0
  48. data/doc/ganalysis/doc/images/package.png +0 -0
  49. data/doc/ganalysis/doc/images/page_green.png +0 -0
  50. data/doc/ganalysis/doc/images/page_white_text.png +0 -0
  51. data/doc/ganalysis/doc/images/page_white_width.png +0 -0
  52. data/doc/ganalysis/doc/images/plugin.png +0 -0
  53. data/doc/ganalysis/doc/images/ruby.png +0 -0
  54. data/doc/ganalysis/doc/images/tag_green.png +0 -0
  55. data/doc/ganalysis/doc/images/wrench.png +0 -0
  56. data/doc/ganalysis/doc/images/wrench_orange.png +0 -0
  57. data/doc/ganalysis/doc/images/zoom.png +0 -0
  58. data/doc/ganalysis/doc/index.html +383 -0
  59. data/doc/ganalysis/doc/js/darkfish.js +118 -0
  60. data/doc/ganalysis/doc/js/jquery.js +32 -0
  61. data/doc/ganalysis/doc/js/quicksearch.js +114 -0
  62. data/doc/ganalysis/doc/js/thickbox-compressed.js +10 -0
  63. data/doc/ganalysis/doc/rdoc.css +763 -0
  64. data/ext/numru/gphys/ext_init.c +1 -0
  65. data/ext/numru/gphys/quad_mesh_sample.c +478 -0
  66. data/gphys.gemspec +2 -2
  67. data/lib/numru/dclext.rb +394 -14
  68. data/lib/numru/derivative.rb +6 -0
  69. data/lib/numru/ganalysis/qg.rb +6 -4
  70. data/lib/numru/ggraph.rb +41 -8
  71. data/lib/numru/gphys/gphys.rb +62 -14
  72. data/lib/numru/gphys/gphys_io.rb +4 -4
  73. data/lib/numru/gphys/version.rb +2 -2
  74. metadata +84 -79
  75. data/.gitignore +0 -14
  76. data/TODO_ep_flux +0 -6
  77. data/gphys-bigmem.gemspec +0 -44
  78. data/install.rb +0 -130
  79. data/sample/cira86_to_nc.rb +0 -122
  80. data/sample/druby_cli1.rb +0 -23
  81. data/sample/druby_cli2.rb +0 -28
  82. data/sample/druby_serv1.rb +0 -30
  83. data/sample/druby_serv2.rb +0 -51
  84. data/sample/ep_flux/demo_NCEP_1.rb +0 -48
  85. data/sample/ep_flux/demo_NCEP_2.rb +0 -57
  86. data/sample/ep_flux/demo_NCEP_3.rb +0 -81
  87. data/sample/ggraph_latlon_labelling_dr002690.rb +0 -159
  88. data/sample/ggraph_mapfit-axes_dr002687.rb +0 -131
  89. data/sample/map_projection.rb +0 -121
  90. data/sample/ncep_theta_coord.rb +0 -79
  91. data/test_old/eof_slp.rb +0 -28
  92. data/test_old/mltbit.dat +0 -0
  93. data/test_old/test_ep_flux.rb +0 -533
  94. data/test_old/test_multibitIO.rb +0 -19
@@ -0,0 +1,524 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+ <head>
6
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
7
+
8
+ <title>Module: NumRu::GAnalysis::MetZ</title>
9
+
10
+ <link rel="stylesheet" href="../../rdoc.css" type="text/css" media="screen" />
11
+
12
+ <script src="../../js/jquery.js" type="text/javascript" charset="utf-8"></script>
13
+ <script src="../../js/thickbox-compressed.js" type="text/javascript" charset="utf-8"></script>
14
+ <script src="../../js/quicksearch.js" type="text/javascript" charset="utf-8"></script>
15
+ <script src="../../js/darkfish.js" type="text/javascript" charset="utf-8"></script>
16
+
17
+ </head>
18
+ <body id="top" class="module">
19
+
20
+ <div id="metadata">
21
+ <div id="home-metadata">
22
+ <div id="home-section" class="section">
23
+ <h3 class="section-header">
24
+ <a href="../../index.html">Home</a>
25
+ <a href="../../index.html#classes">Classes</a>
26
+ <a href="../../index.html#methods">Methods</a>
27
+ </h3>
28
+ </div>
29
+ </div>
30
+
31
+ <div id="file-metadata">
32
+ <div id="file-list-section" class="section">
33
+ <h3 class="section-header">In Files</h3>
34
+ <div class="section-body">
35
+ <ul>
36
+
37
+ <li><a href="../../__/__/lib/numru/ganalysis/met_z_rb.html?TB_iframe=true&amp;height=550&amp;width=785"
38
+ class="thickbox" title="../../lib/numru/ganalysis/met_z.rb">../../lib/numru/ganalysis/met_z.rb</a></li>
39
+
40
+ </ul>
41
+ </div>
42
+ </div>
43
+
44
+
45
+ </div>
46
+
47
+ <div id="class-metadata">
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+ <!-- Method Quickref -->
56
+ <div id="method-list-section" class="section">
57
+ <h3 class="section-header">Methods</h3>
58
+ <ul class="link-list">
59
+
60
+ <li><a href="#method-i-mass_strm_any">#mass_strm_any</a></li>
61
+
62
+ <li><a href="#method-i-mass_strm_p">#mass_strm_p</a></li>
63
+
64
+ </ul>
65
+ </div>
66
+
67
+
68
+
69
+ </div>
70
+
71
+ <div id="project-metadata">
72
+
73
+
74
+
75
+ <div id="classindex-section" class="section project-section">
76
+ <h3 class="section-header">Class/Module Index
77
+ <span class="search-toggle"><img src="../../images/find.png"
78
+ height="16" width="16" alt="[+]"
79
+ title="show/hide quicksearch" /></span></h3>
80
+ <form action="#" method="get" accept-charset="utf-8" class="initially-hidden">
81
+ <fieldset>
82
+ <legend>Quicksearch</legend>
83
+ <input type="text" name="quicksearch" value=""
84
+ class="quicksearch-field" />
85
+ </fieldset>
86
+ </form>
87
+
88
+ <ul class="link-list">
89
+
90
+ <li><a href="../../NumRu.html">NumRu</a></li>
91
+
92
+ <li><a href="../../NumRu/GAnalysis.html">NumRu::GAnalysis</a></li>
93
+
94
+ <li><a href="../../NumRu/GAnalysis/BetaPlane.html">NumRu::GAnalysis::BetaPlane</a></li>
95
+
96
+ <li><a href="../../NumRu/GAnalysis/Fitting.html">NumRu::GAnalysis::Fitting</a></li>
97
+
98
+ <li><a href="../../NumRu/GAnalysis/LogP.html">NumRu::GAnalysis::LogP</a></li>
99
+
100
+ <li><a href="../../NumRu/GAnalysis/Met.html">NumRu::GAnalysis::Met</a></li>
101
+
102
+ <li><a href="../../NumRu/GAnalysis/MetZ.html">NumRu::GAnalysis::MetZ</a></li>
103
+
104
+ <li><a href="../../NumRu/GAnalysis/Planet.html">NumRu::GAnalysis::Planet</a></li>
105
+
106
+ <li><a href="../../NumRu/GAnalysis/QG.html">NumRu::GAnalysis::QG</a></li>
107
+
108
+ <li><a href="../../NumRu/GAnalysis/QG/Uninitialized.html">NumRu::GAnalysis::QG::Uninitialized</a></li>
109
+
110
+ <li><a href="../../NumRu/GAnalysis/QG_common.html">NumRu::GAnalysis::QG_common</a></li>
111
+
112
+ <li><a href="../../NumRu/GAnalysis/QG_sphere.html">NumRu::GAnalysis::QG_sphere</a></li>
113
+
114
+ <li><a href="../../NumRu/GAnalysis/QG_sphere_common.html">NumRu::GAnalysis::QG_sphere_common</a></li>
115
+
116
+ <li><a href="../../NumRu/GAnalysis/QG_sphere_div.html">NumRu::GAnalysis::QG_sphere_div</a></li>
117
+
118
+ <li><a href="../../NumRu/GAnalysis/SigmaCoord.html">NumRu::GAnalysis::SigmaCoord</a></li>
119
+
120
+ <li><a href="../../NumRu/GGraph.html">NumRu::GGraph</a></li>
121
+
122
+ <li><a href="../../NumRu/GPhys.html">NumRu::GPhys</a></li>
123
+
124
+ <li><a href="../../Object.html">Object</a></li>
125
+
126
+ </ul>
127
+ <div id="no-class-search-results" style="display: none;">No matching classes.</div>
128
+ </div>
129
+
130
+
131
+ </div>
132
+ </div>
133
+
134
+ <div id="documentation">
135
+ <h1 class="module">NumRu::GAnalysis::MetZ</h1>
136
+
137
+ <div id="description" class="description">
138
+
139
+ <p>Meterological analysis regarding vertical section, integration, etc.</p>
140
+
141
+ </div><!-- description -->
142
+
143
+
144
+
145
+
146
+ <div id="5Buntitled-5D" class="documentation-section">
147
+
148
+
149
+
150
+
151
+
152
+
153
+
154
+
155
+ <!-- Methods -->
156
+
157
+ <div id="public-instance-method-details" class="method-section section">
158
+ <h3 class="section-header">Public Instance Methods</h3>
159
+
160
+
161
+ <div id="mass_strm_any-method" class="method-detail ">
162
+ <a name="method-i-mass_strm_any"></a>
163
+
164
+
165
+ <div class="method-heading">
166
+ <span class="method-name">mass_strm_any</span><span
167
+ class="method-args">(v, ps, w, wcoord, vs=nil, ws=nil)</span>
168
+ <span class="method-click-advice">click to toggle source</span>
169
+ </div>
170
+
171
+
172
+ <div class="method-description">
173
+
174
+ <p>mass stream function on any vertical coordinate</p>
175
+
176
+ <p>Similar to <a href="MetZ.html#method-i-mass_strm_p">mass_strm_p</a>, but it
177
+ supports representation to have an arbitrary physical quantity, such as
178
+ potential temperature, as the vertical coordinate (instead of pressure).</p>
179
+
180
+ <p>Applicable both to pressure- and sigma-coordinate input data</p>
181
+
182
+ <p>ARGUMENTS</p>
183
+ <ul><li>
184
+ <p>v [GPhys] : meridional wind with a vertical dimension (p or sigma) It must
185
+ have a latitudinal dimension too. Longitudinal and time dimensions are
186
+ optional. If it has a longitudinal dimension, zonal mean is taken. The
187
+ order of the dimensions is not restricted.</p>
188
+ </li><li>
189
+ <p>ps [GPhys] : surface pressure. Its must have the same grid as v but for the
190
+ vertical dimension (ps.rank must be v.rank-1)</p>
191
+ </li><li>
192
+ <p>w [GPhys] : Grid-point values (at the same points as v) of the quantity
193
+ used to represent the vertical coordinate. Its shape must be the same as
194
+ that of v, as a matter of course.</p>
195
+ </li><li>
196
+ <p>wcoord [1D VArray] : Output vertical coordinate. It must have the same
197
+ units as w.</p>
198
+ </li><li>
199
+ <p>vs [nil(default) or GPhys]: vs is not needed (neglected) when v has a sigma
200
+ coordinate. It is an optional parameter to specify the surface values of v,
201
+ when it is in the pressure coordinate. vs can be omitted (nil), even when v
202
+ has a pressure coordinate; in that case, vs is set by interpolating v if ps
203
+ is within the p range of v (e.g. when ps&lt;=1000hPa), or it is naively
204
+ extended (using the bottom values of v) if ps is out of the range (e.g.
205
+ when ps&gt;1000hPa). In other words, the current implementation assumes
206
+ that v is available below the surface, as is customary for reanalysis data.</p>
207
+ </li><li>
208
+ <p>ws [nil(default) or GPhys]: same as vs but for the surface value of w.</p>
209
+ </li></ul>
210
+
211
+
212
+
213
+ <div class="method-source-code" id="mass_strm_any-source">
214
+ <pre>
215
+ <span class="ruby-comment"># File ../../lib/numru/ganalysis/met_z.rb, line 182</span>
216
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">mass_strm_any</span>(<span class="ruby-identifier">v</span>, <span class="ruby-identifier">ps</span>, <span class="ruby-identifier">w</span>, <span class="ruby-identifier">wcoord</span>, <span class="ruby-identifier">vs</span>=<span class="ruby-keyword">nil</span>, <span class="ruby-identifier">ws</span>=<span class="ruby-keyword">nil</span>)
217
+
218
+ <span class="ruby-identifier">pascal</span> = <span class="ruby-constant">Units</span>[<span class="ruby-string">&quot;Pa&quot;</span>]
219
+ <span class="ruby-identifier">grav</span> = <span class="ruby-constant">Met</span>.<span class="ruby-identifier">g</span>.<span class="ruby-identifier">to_f</span>
220
+
221
+ <span class="ruby-comment">#&lt; check &gt;</span>
222
+
223
+ <span class="ruby-identifier">raise</span>(<span class="ruby-constant">ArgumentError</span>,<span class="ruby-string">&quot;v.shape != w.shape&quot;</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">v</span>.<span class="ruby-identifier">shape</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">w</span>.<span class="ruby-identifier">shape</span>
224
+ <span class="ruby-identifier">raise</span>(<span class="ruby-constant">ArgumentError</span>,<span class="ruby-string">&quot;ps.rank != v.rank-1&quot;</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">ps</span>.<span class="ruby-identifier">rank</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">v</span>.<span class="ruby-identifier">rank</span><span class="ruby-operator">-</span><span class="ruby-value">1</span>
225
+ <span class="ruby-identifier">raise</span>(<span class="ruby-constant">ArgumentError</span>,<span class="ruby-string">&quot;w.units !~wcoord.units&quot;</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">w</span>.<span class="ruby-identifier">units</span> <span class="ruby-operator">!~</span> <span class="ruby-identifier">wcoord</span>.<span class="ruby-identifier">units</span>
226
+
227
+ <span class="ruby-comment">#&lt; preprare data &gt;</span>
228
+
229
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">zdim</span> = <span class="ruby-constant">Met</span>.<span class="ruby-identifier">find_prs_d</span>(<span class="ruby-identifier">v</span>) <span class="ruby-comment"># substitution, not comparison</span>
230
+ <span class="ruby-comment"># has a pressure coordinate</span>
231
+ <span class="ruby-identifier">pcv</span> = <span class="ruby-identifier">v</span>.<span class="ruby-identifier">coord</span>(<span class="ruby-identifier">zdim</span>) <span class="ruby-comment"># v's p coord</span>
232
+ <span class="ruby-identifier">pcv_val</span> = <span class="ruby-identifier">pcv</span>.<span class="ruby-identifier">val</span>
233
+ <span class="ruby-identifier">v_val</span> = <span class="ruby-identifier">v</span>.<span class="ruby-identifier">val</span> <span class="ruby-comment"># should be NArray or NArrayMiss</span>
234
+ <span class="ruby-identifier">v_val</span> = <span class="ruby-identifier">v_val</span>.<span class="ruby-identifier">to_na</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">v_val</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">NArrayMiss</span>)
235
+ <span class="ruby-identifier">w_val</span> = <span class="ruby-identifier">w</span>.<span class="ruby-identifier">val</span> <span class="ruby-comment"># should be NArray or NArrayMiss</span>
236
+ <span class="ruby-identifier">w_val</span> = <span class="ruby-identifier">w_val</span>.<span class="ruby-identifier">to_na</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">w_val</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">NArrayMiss</span>)
237
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">pcv_val</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">pcv_val</span>[<span class="ruby-value">-1</span>]
238
+ <span class="ruby-comment"># reverse the p coordinate to the increasing order</span>
239
+ <span class="ruby-identifier">pcv_val</span> = <span class="ruby-identifier">pcv_val</span>[<span class="ruby-value">-1</span><span class="ruby-operator">..</span><span class="ruby-value">0</span>]
240
+ <span class="ruby-identifier">v_val</span> = <span class="ruby-identifier">v_val</span>[ *([<span class="ruby-keyword">true</span>]*<span class="ruby-identifier">zdim</span> <span class="ruby-operator">+</span> [<span class="ruby-value">-1</span><span class="ruby-operator">..</span><span class="ruby-value">0</span>,<span class="ruby-keyword">false</span>]) ]
241
+ <span class="ruby-identifier">w_val</span> = <span class="ruby-identifier">w_val</span>[ *([<span class="ruby-keyword">true</span>]*<span class="ruby-identifier">zdim</span> <span class="ruby-operator">+</span> [<span class="ruby-value">-1</span><span class="ruby-operator">..</span><span class="ruby-value">0</span>,<span class="ruby-keyword">false</span>]) ]
242
+ <span class="ruby-keyword">end</span>
243
+
244
+ <span class="ruby-identifier">pcv_val</span> = <span class="ruby-identifier">pcv</span>.<span class="ruby-identifier">units</span>.<span class="ruby-identifier">convert2</span>(<span class="ruby-identifier">pcv_val</span>, <span class="ruby-identifier">pascal</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">pcv</span>.<span class="ruby-identifier">units!</span>=<span class="ruby-identifier">pascal</span>
245
+ <span class="ruby-identifier">pcv_over_g</span> = <span class="ruby-identifier">pcv_val</span> <span class="ruby-operator">/</span> <span class="ruby-identifier">grav</span>
246
+
247
+ <span class="ruby-identifier">ps_val</span> = <span class="ruby-identifier">ps</span>.<span class="ruby-identifier">val</span>
248
+ <span class="ruby-identifier">ps_val</span> = <span class="ruby-identifier">ps_val</span>.<span class="ruby-identifier">to_na</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">ps_val</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">NArrayMiss</span>)
249
+ <span class="ruby-identifier">ps_val</span> = <span class="ruby-identifier">ps</span>.<span class="ruby-identifier">units</span>.<span class="ruby-identifier">convert2</span>(<span class="ruby-identifier">ps_val</span>, <span class="ruby-identifier">pascal</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">ps</span>.<span class="ruby-identifier">units!</span>=<span class="ruby-identifier">pascal</span>
250
+ <span class="ruby-identifier">ps_over_g</span> = <span class="ruby-identifier">ps_val</span> <span class="ruby-operator">/</span> <span class="ruby-identifier">grav</span>
251
+
252
+ <span class="ruby-identifier">vs_val</span> = <span class="ruby-identifier">vs</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">vs</span>.<span class="ruby-identifier">val</span> <span class="ruby-comment"># nil (default) or vs.val (if vs is given)</span>
253
+ <span class="ruby-identifier">vs_val</span> = <span class="ruby-identifier">vs_val</span>.<span class="ruby-identifier">to_na</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">vs_val</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">NArrayMiss</span>)
254
+
255
+ <span class="ruby-identifier">ws_val</span> = <span class="ruby-identifier">ws</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">ws</span>.<span class="ruby-identifier">val</span> <span class="ruby-comment"># nil (default) or ws.val (if ws is given)</span>
256
+ <span class="ruby-identifier">ws_val</span> = <span class="ruby-identifier">ws_val</span>.<span class="ruby-identifier">to_na</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">ws_val</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">NArrayMiss</span>)
257
+
258
+ <span class="ruby-identifier">v_val</span>, <span class="ruby-identifier">p_over_g</span>, <span class="ruby-identifier">nzbound</span> = <span class="ruby-constant">GPhys</span>.<span class="ruby-identifier">c_cap_by_boundary</span>(<span class="ruby-identifier">v_val</span>, <span class="ruby-identifier">zdim</span>,
259
+ <span class="ruby-identifier">pcv_over_g</span>, <span class="ruby-keyword">true</span>, <span class="ruby-identifier">ps_over_g</span>, <span class="ruby-identifier">vs_val</span>)
260
+
261
+ <span class="ruby-identifier">w_val</span>, <span class="ruby-identifier">p_over_g</span>, <span class="ruby-identifier">nzbound</span> = <span class="ruby-constant">GPhys</span>.<span class="ruby-identifier">c_cap_by_boundary</span>(<span class="ruby-identifier">w_val</span>, <span class="ruby-identifier">zdim</span>,
262
+ <span class="ruby-identifier">pcv_over_g</span>, <span class="ruby-keyword">true</span>, <span class="ruby-identifier">ps_over_g</span>, <span class="ruby-identifier">ws_val</span>)
263
+
264
+ <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">zdim</span> = <span class="ruby-constant">SigmaCoord</span>.<span class="ruby-identifier">find_sigma_d</span>(<span class="ruby-identifier">v</span>) <span class="ruby-comment"># substitution, not comparison</span>
265
+ <span class="ruby-comment"># has a sigma coordnate</span>
266
+ <span class="ruby-identifier">sig</span> = <span class="ruby-identifier">v</span>.<span class="ruby-identifier">coord</span>(<span class="ruby-identifier">zdim</span>)
267
+ <span class="ruby-identifier">nz</span> = <span class="ruby-identifier">sig</span>.<span class="ruby-identifier">length</span>
268
+ <span class="ruby-identifier">nzbound</span> = <span class="ruby-keyword">nil</span>
269
+ <span class="ruby-identifier">ps</span> = <span class="ruby-identifier">ps</span>.<span class="ruby-identifier">convert_units</span>(<span class="ruby-identifier">pascal</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">ps</span>.<span class="ruby-identifier">units</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">pascal</span>
270
+ <span class="ruby-identifier">sig_val</span> = <span class="ruby-identifier">sig</span>.<span class="ruby-identifier">val</span>
271
+ <span class="ruby-identifier">v_val</span> = <span class="ruby-identifier">v</span>.<span class="ruby-identifier">val</span> <span class="ruby-comment"># should be NArray, not NArrayMiss (coz sigma)</span>
272
+ <span class="ruby-identifier">w_val</span> = <span class="ruby-identifier">w</span>.<span class="ruby-identifier">val</span>
273
+ <span class="ruby-identifier">p_over_g</span> = <span class="ruby-constant">SigmaCoord</span>.<span class="ruby-identifier">sig_ps2p</span>(<span class="ruby-identifier">ps</span>.<span class="ruby-identifier">val</span><span class="ruby-operator">/</span><span class="ruby-identifier">grav</span>, <span class="ruby-identifier">sig_val</span>, <span class="ruby-identifier">zdim</span>)
274
+ <span class="ruby-keyword">else</span>
275
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-string">&quot;v does not have a p or sigma coordinate.&quot;</span>
276
+ <span class="ruby-keyword">end</span>
277
+
278
+ <span class="ruby-comment">#&lt; cumulative vertical integration &gt;</span>
279
+
280
+ <span class="ruby-identifier">wc_val</span> = <span class="ruby-identifier">wcoord</span>.<span class="ruby-identifier">val</span>
281
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">wc_val</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">wc_val</span>[<span class="ruby-value">-1</span>]
282
+ <span class="ruby-comment"># change it to the increasing order</span>
283
+ <span class="ruby-identifier">wc_val</span> = <span class="ruby-identifier">wc_val</span>[<span class="ruby-value">-1</span><span class="ruby-operator">..</span><span class="ruby-value">0</span>]
284
+ <span class="ruby-identifier">wcoord</span> = <span class="ruby-identifier">wcoord</span>.<span class="ruby-identifier">copy</span>.<span class="ruby-identifier">replace_val</span>(<span class="ruby-identifier">wc_val</span>)
285
+ <span class="ruby-keyword">end</span>
286
+
287
+ <span class="ruby-identifier">rho_v_cum</span> = <span class="ruby-constant">GPhys</span>.<span class="ruby-identifier">c_cum_integ_irreg</span>(<span class="ruby-identifier">v_val</span>, <span class="ruby-identifier">p_over_g</span>, <span class="ruby-identifier">zdim</span>, <span class="ruby-identifier">nzbound</span>,
288
+ <span class="ruby-identifier">wc_val</span>, <span class="ruby-identifier">w_val</span>)
289
+
290
+ <span class="ruby-comment">#&lt; zonal mean &amp; latitudinal factor &gt;</span>
291
+
292
+ <span class="ruby-identifier">lam</span>, <span class="ruby-identifier">phi</span>, <span class="ruby-identifier">lond</span>, <span class="ruby-identifier">latd</span> = <span class="ruby-constant">Planet</span>.<span class="ruby-identifier">get_lambda_phi</span>(<span class="ruby-identifier">v</span>, <span class="ruby-keyword">false</span>)
293
+
294
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">latd</span>.<span class="ruby-identifier">nil?</span>
295
+ <span class="ruby-identifier">raise</span>(<span class="ruby-constant">ArgumentError</span>, <span class="ruby-string">&quot;v appears not having a latitudinal dimension&quot;</span>)
296
+ <span class="ruby-keyword">end</span>
297
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">lond</span>
298
+ <span class="ruby-identifier">rho_v_cum</span> = <span class="ruby-identifier">rho_v_cum</span>.<span class="ruby-identifier">mean</span>(<span class="ruby-identifier">lond</span>)
299
+ <span class="ruby-identifier">latd</span> <span class="ruby-operator">-=</span> <span class="ruby-value">1</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">lond</span><span class="ruby-operator">&lt;</span><span class="ruby-identifier">latd</span>
300
+ <span class="ruby-keyword">end</span>
301
+
302
+ <span class="ruby-identifier">a_cos</span> = <span class="ruby-constant">NMath</span>.<span class="ruby-identifier">cos</span>(<span class="ruby-identifier">phi</span>.<span class="ruby-identifier">val</span>) * ( <span class="ruby-value">2</span> * <span class="ruby-constant">Math</span><span class="ruby-operator">::</span><span class="ruby-constant">PI</span> * <span class="ruby-constant">Planet</span>.<span class="ruby-identifier">radius</span>.<span class="ruby-identifier">to_f</span> )
303
+ <span class="ruby-identifier">latd</span>.<span class="ruby-identifier">times</span>{<span class="ruby-identifier">a_cos</span>.<span class="ruby-identifier">newdim!</span>(<span class="ruby-value">0</span>)}
304
+ (<span class="ruby-identifier">rho_v_cum</span>.<span class="ruby-identifier">rank</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">latd</span> <span class="ruby-value">-1</span>).<span class="ruby-identifier">times</span>{<span class="ruby-identifier">a_cos</span>.<span class="ruby-identifier">newdim!</span>(<span class="ruby-value">-1</span>)}
305
+
306
+ <span class="ruby-identifier">mstrm_val</span> = <span class="ruby-identifier">rho_v_cum</span> * <span class="ruby-identifier">a_cos</span>
307
+
308
+ <span class="ruby-comment">#&lt; make a GPhys &gt;</span>
309
+
310
+ <span class="ruby-identifier">axes</span> = <span class="ruby-constant">Array</span>.<span class="ruby-identifier">new</span>
311
+ <span class="ruby-keyword">for</span> <span class="ruby-identifier">d</span> <span class="ruby-keyword">in</span> <span class="ruby-value">0</span><span class="ruby-operator">...</span><span class="ruby-identifier">v</span>.<span class="ruby-identifier">rank</span>
312
+ <span class="ruby-keyword">case</span> <span class="ruby-identifier">d</span>
313
+ <span class="ruby-keyword">when</span> <span class="ruby-identifier">lond</span>
314
+ <span class="ruby-comment"># lost by zonal mean</span>
315
+ <span class="ruby-keyword">when</span> <span class="ruby-identifier">zdim</span>
316
+ <span class="ruby-identifier">wax</span> = <span class="ruby-constant">Axis</span>.<span class="ruby-identifier">new</span>().<span class="ruby-identifier">set_pos</span>(<span class="ruby-identifier">wcoord</span>)
317
+ <span class="ruby-identifier">axes</span>.<span class="ruby-identifier">push</span>(<span class="ruby-identifier">wax</span>)
318
+ <span class="ruby-keyword">else</span>
319
+ <span class="ruby-identifier">axes</span>.<span class="ruby-identifier">push</span>(<span class="ruby-identifier">v</span>.<span class="ruby-identifier">axis</span>(<span class="ruby-identifier">d</span>).<span class="ruby-identifier">copy</span>) <span class="ruby-comment"># kept</span>
320
+ <span class="ruby-keyword">end</span>
321
+ <span class="ruby-keyword">end</span>
322
+ <span class="ruby-identifier">grid</span> = <span class="ruby-constant">Grid</span>.<span class="ruby-identifier">new</span>( *<span class="ruby-identifier">axes</span> )
323
+
324
+ <span class="ruby-identifier">units</span> = <span class="ruby-constant">Units</span>[<span class="ruby-string">&quot;kg.m-1&quot;</span>] <span class="ruby-comment"># p/g*a : Pa / (m.s-2) * m = kg.m-1</span>
325
+ <span class="ruby-identifier">units</span> <span class="ruby-operator">*=</span> <span class="ruby-identifier">v</span>.<span class="ruby-identifier">units</span>
326
+ <span class="ruby-identifier">mstrm_va</span> = <span class="ruby-constant">VArray</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">mstrm_val</span>, {<span class="ruby-string">&quot;long_name&quot;</span>=<span class="ruby-operator">&gt;</span><span class="ruby-string">&quot;mass stream function&quot;</span>,
327
+ <span class="ruby-string">&quot;units&quot;</span>=<span class="ruby-operator">&gt;</span><span class="ruby-identifier">units</span>.<span class="ruby-identifier">to_s</span>}, <span class="ruby-string">&quot;mstrm&quot;</span>)
328
+ <span class="ruby-identifier">mstrm</span> = <span class="ruby-constant">GPhys</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">grid</span>, <span class="ruby-identifier">mstrm_va</span>)
329
+ <span class="ruby-identifier">mstrm</span>
330
+ <span class="ruby-keyword">end</span></pre>
331
+ </div><!-- mass_strm_any-source -->
332
+
333
+ </div>
334
+
335
+
336
+
337
+
338
+ </div><!-- mass_strm_any-method -->
339
+
340
+
341
+ <div id="mass_strm_p-method" class="method-detail ">
342
+ <a name="method-i-mass_strm_p"></a>
343
+
344
+
345
+ <div class="method-heading">
346
+ <span class="method-name">mass_strm_p</span><span
347
+ class="method-args">(v, ps, pcoord=nil, vs=nil)</span>
348
+ <span class="method-click-advice">click to toggle source</span>
349
+ </div>
350
+
351
+
352
+ <div class="method-description">
353
+
354
+ <p>Derive the mass stream function in the pressure coordinate</p>
355
+
356
+ <p>Applicable both to pressure- and sigma-coordinate input data (the output is
357
+ always on the pressure coordinate).</p>
358
+
359
+ <p>ARGUMENTS</p>
360
+ <ul><li>
361
+ <p>v [GPhys] : meridional wind with a vertical dimension (p or sigma) It must
362
+ have a latitudinal dimension too. Longitudinal and time dimensions are
363
+ optional. If it has a longitudinal dimension, zonal mean is taken. The
364
+ order of the dimensions is not restricted.</p>
365
+ </li><li>
366
+ <p>ps [GPhys] : surface pressure. Its must have the same grid as v but for the
367
+ vertical dimension (ps.rank must be v.rank-1)</p>
368
+ </li><li>
369
+ <p>pcoord [1D VArray](optional) : output vertical coordinate (set if nil)</p>
370
+ </li><li>
371
+ <p>vs [nil(default) or GPhys]: vs is not needed (neglected) when v has a sigma
372
+ coordinate. It is an optional parameter to specify the surface values of v,
373
+ when it is in the pressure coordinate. vs can be omitted (nil), even when v
374
+ has a pressure coordinate; in that case, vs is set by interpolating v if ps
375
+ is within the p range of v (e.g. when ps&lt;=1000hPa), or it is naively
376
+ extended (using the bottom values of v) if ps is out of the range (e.g.
377
+ when ps&gt;1000hPa). In other words, the current implementation assumes
378
+ that v is available below the surface, as is customary for reanalysis data.</p>
379
+ </li></ul>
380
+
381
+
382
+
383
+ <div class="method-source-code" id="mass_strm_p-source">
384
+ <pre>
385
+ <span class="ruby-comment"># File ../../lib/numru/ganalysis/met_z.rb, line 36</span>
386
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">mass_strm_p</span>(<span class="ruby-identifier">v</span>, <span class="ruby-identifier">ps</span>, <span class="ruby-identifier">pcoord</span>=<span class="ruby-keyword">nil</span>, <span class="ruby-identifier">vs</span>=<span class="ruby-keyword">nil</span>)
387
+
388
+ <span class="ruby-identifier">pascal</span> = <span class="ruby-constant">Units</span>[<span class="ruby-string">&quot;Pa&quot;</span>]
389
+ <span class="ruby-identifier">grav</span> = <span class="ruby-constant">Met</span>.<span class="ruby-identifier">g</span>.<span class="ruby-identifier">to_f</span>
390
+
391
+ <span class="ruby-comment">#&lt; consolidate the p or sigma coordinate input &gt;</span>
392
+
393
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">zdim</span> = <span class="ruby-constant">Met</span>.<span class="ruby-identifier">find_prs_d</span>(<span class="ruby-identifier">v</span>) <span class="ruby-comment"># substitution, not comparison</span>
394
+ <span class="ruby-comment"># has a pressure coordinate</span>
395
+ <span class="ruby-identifier">pcv</span> = <span class="ruby-identifier">v</span>.<span class="ruby-identifier">coord</span>(<span class="ruby-identifier">zdim</span>) <span class="ruby-comment"># pcv is v's p coord, not pcoord from outside.</span>
396
+ <span class="ruby-comment"># This is used only to feed c_cap_by_boundary.</span>
397
+ <span class="ruby-identifier">pcoord</span> = <span class="ruby-identifier">pcv</span>.<span class="ruby-identifier">copy</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">pcoord</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-comment"># if not given from outside, use pcv</span>
398
+
399
+ <span class="ruby-identifier">pcv_val</span> = <span class="ruby-identifier">pcv</span>.<span class="ruby-identifier">val</span>
400
+ <span class="ruby-identifier">v_val</span> = <span class="ruby-identifier">v</span>.<span class="ruby-identifier">val</span> <span class="ruby-comment"># should be NArray or NArrayMiss</span>
401
+ <span class="ruby-identifier">v_val</span> = <span class="ruby-identifier">v_val</span>.<span class="ruby-identifier">to_na</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">v_val</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">NArrayMiss</span>)
402
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">pcv_val</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">pcv_val</span>[<span class="ruby-value">-1</span>]
403
+ <span class="ruby-comment"># reverse the p coordinate to the increasing order</span>
404
+ <span class="ruby-identifier">pcv_val</span> = <span class="ruby-identifier">pcv_val</span>[<span class="ruby-value">-1</span><span class="ruby-operator">..</span><span class="ruby-value">0</span>]
405
+ <span class="ruby-identifier">v_val</span> = <span class="ruby-identifier">v_val</span>[ *([<span class="ruby-keyword">true</span>]*<span class="ruby-identifier">zdim</span> <span class="ruby-operator">+</span> [<span class="ruby-value">-1</span><span class="ruby-operator">..</span><span class="ruby-value">0</span>,<span class="ruby-keyword">false</span>]) ]
406
+ <span class="ruby-keyword">end</span>
407
+
408
+ <span class="ruby-identifier">pcv_val</span> = <span class="ruby-identifier">pcv</span>.<span class="ruby-identifier">units</span>.<span class="ruby-identifier">convert2</span>(<span class="ruby-identifier">pcv_val</span>, <span class="ruby-identifier">pascal</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">pcv</span>.<span class="ruby-identifier">units!</span>=<span class="ruby-identifier">pascal</span>
409
+ <span class="ruby-identifier">pcv_over_g</span> = <span class="ruby-identifier">pcv_val</span> <span class="ruby-operator">/</span> <span class="ruby-identifier">grav</span>
410
+
411
+ <span class="ruby-identifier">ps_val</span> = <span class="ruby-identifier">ps</span>.<span class="ruby-identifier">val</span>
412
+ <span class="ruby-identifier">ps_val</span> = <span class="ruby-identifier">ps_val</span>.<span class="ruby-identifier">to_na</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">ps_val</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">NArrayMiss</span>)
413
+ <span class="ruby-identifier">ps_val</span> = <span class="ruby-identifier">ps</span>.<span class="ruby-identifier">units</span>.<span class="ruby-identifier">convert2</span>(<span class="ruby-identifier">ps_val</span>, <span class="ruby-identifier">pascal</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">ps</span>.<span class="ruby-identifier">units!</span>=<span class="ruby-identifier">pascal</span>
414
+ <span class="ruby-identifier">ps_over_g</span> = <span class="ruby-identifier">ps_val</span> <span class="ruby-operator">/</span> <span class="ruby-identifier">grav</span>
415
+
416
+ <span class="ruby-identifier">vs_val</span> = <span class="ruby-identifier">vs</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">vs</span>.<span class="ruby-identifier">val</span> <span class="ruby-comment"># nil (default) or vs.val (if vs is given)</span>
417
+ <span class="ruby-identifier">vs_val</span> = <span class="ruby-identifier">vs_val</span>.<span class="ruby-identifier">to_na</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">vs_val</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">NArrayMiss</span>)
418
+
419
+ <span class="ruby-identifier">v_val</span>, <span class="ruby-identifier">p_over_g</span>, <span class="ruby-identifier">nzbound</span> = <span class="ruby-constant">GPhys</span>.<span class="ruby-identifier">c_cap_by_boundary</span>(<span class="ruby-identifier">v_val</span>, <span class="ruby-identifier">zdim</span>,
420
+ <span class="ruby-identifier">pcv_over_g</span>, <span class="ruby-keyword">true</span>, <span class="ruby-identifier">ps_over_g</span>, <span class="ruby-identifier">vs_val</span>)
421
+
422
+ <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">zdim</span> = <span class="ruby-constant">SigmaCoord</span>.<span class="ruby-identifier">find_sigma_d</span>(<span class="ruby-identifier">v</span>) <span class="ruby-comment"># substitution, not comparison</span>
423
+ <span class="ruby-comment"># has a sigma coordnate</span>
424
+ <span class="ruby-identifier">sig</span> = <span class="ruby-identifier">v</span>.<span class="ruby-identifier">coord</span>(<span class="ruby-identifier">zdim</span>)
425
+ <span class="ruby-keyword">unless</span> <span class="ruby-identifier">pcoord</span>
426
+ <span class="ruby-identifier">pcoord</span> = <span class="ruby-identifier">sig</span> * <span class="ruby-value">1000</span>
427
+ <span class="ruby-identifier">pcoord</span>.<span class="ruby-identifier">units</span> = <span class="ruby-string">&quot;hPa&quot;</span>
428
+ <span class="ruby-identifier">pcoord</span>.<span class="ruby-identifier">name</span> = <span class="ruby-string">&quot;p&quot;</span>
429
+ <span class="ruby-identifier">pcoord</span>.<span class="ruby-identifier">long_name</span> = <span class="ruby-string">&quot;pressure&quot;</span>
430
+ <span class="ruby-identifier">pcoord</span>.<span class="ruby-identifier">put_att</span>(<span class="ruby-string">&quot;standard_name&quot;</span>,<span class="ruby-string">&quot;air_pressure&quot;</span>)
431
+ <span class="ruby-identifier">pcoord</span>.<span class="ruby-identifier">put_att</span>(<span class="ruby-string">&quot;positive&quot;</span>,<span class="ruby-string">&quot;down&quot;</span>)
432
+ <span class="ruby-keyword">end</span>
433
+ <span class="ruby-identifier">nz</span> = <span class="ruby-identifier">sig</span>.<span class="ruby-identifier">length</span>
434
+ <span class="ruby-identifier">nzbound</span> = <span class="ruby-keyword">nil</span>
435
+ <span class="ruby-identifier">ps</span> = <span class="ruby-identifier">ps</span>.<span class="ruby-identifier">convert_units</span>(<span class="ruby-identifier">pascal</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">ps</span>.<span class="ruby-identifier">units</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">pascal</span>
436
+ <span class="ruby-identifier">sig_val</span> = <span class="ruby-identifier">sig</span>.<span class="ruby-identifier">val</span>
437
+ <span class="ruby-identifier">v_val</span> = <span class="ruby-identifier">v</span>.<span class="ruby-identifier">val</span> <span class="ruby-comment"># should be NArray, not NArrayMiss (coz sigma)</span>
438
+ <span class="ruby-identifier">p_over_g</span> = <span class="ruby-constant">SigmaCoord</span>.<span class="ruby-identifier">sig_ps2p</span>(<span class="ruby-identifier">ps</span>.<span class="ruby-identifier">val</span><span class="ruby-operator">/</span><span class="ruby-identifier">grav</span>, <span class="ruby-identifier">sig_val</span>, <span class="ruby-identifier">zdim</span>)
439
+ <span class="ruby-keyword">else</span>
440
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-string">&quot;v does not have a p or sigma coordinate.&quot;</span>
441
+ <span class="ruby-keyword">end</span>
442
+
443
+ <span class="ruby-comment">#&lt; cumulative vertical integration &gt;</span>
444
+
445
+ <span class="ruby-identifier">pc_val</span> = <span class="ruby-identifier">pcoord</span>.<span class="ruby-identifier">val</span>
446
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">pc_val</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">pc_val</span>[<span class="ruby-value">-1</span>]
447
+ <span class="ruby-comment"># change it to the increasing order</span>
448
+ <span class="ruby-identifier">pc_val</span> = <span class="ruby-identifier">pc_val</span>[<span class="ruby-value">-1</span><span class="ruby-operator">..</span><span class="ruby-value">0</span>]
449
+ <span class="ruby-identifier">pcoord</span> = <span class="ruby-identifier">pcoord</span>.<span class="ruby-identifier">copy</span>.<span class="ruby-identifier">replace_val</span>(<span class="ruby-identifier">pc_val</span>)
450
+ <span class="ruby-keyword">end</span>
451
+ <span class="ruby-identifier">pc_val</span> = <span class="ruby-identifier">pcoord</span>.<span class="ruby-identifier">units</span>.<span class="ruby-identifier">convert2</span>(<span class="ruby-identifier">pc_val</span>,<span class="ruby-identifier">pascal</span>)
452
+
453
+ <span class="ruby-identifier">pc_over_g</span> = <span class="ruby-identifier">pc_val</span> <span class="ruby-operator">/</span> <span class="ruby-identifier">grav</span>
454
+
455
+ <span class="ruby-identifier">rho_v_cum</span> = <span class="ruby-constant">GPhys</span>.<span class="ruby-identifier">c_cum_integ_irreg</span>(<span class="ruby-identifier">v_val</span>, <span class="ruby-identifier">p_over_g</span>, <span class="ruby-identifier">zdim</span>, <span class="ruby-identifier">nzbound</span>,
456
+ <span class="ruby-identifier">pc_over_g</span>, <span class="ruby-keyword">nil</span>)
457
+
458
+ <span class="ruby-comment">#&lt; zonal mean &amp; latitudinal factor &gt;</span>
459
+
460
+ <span class="ruby-identifier">lam</span>, <span class="ruby-identifier">phi</span>, <span class="ruby-identifier">lond</span>, <span class="ruby-identifier">latd</span> = <span class="ruby-constant">Planet</span>.<span class="ruby-identifier">get_lambda_phi</span>(<span class="ruby-identifier">v</span>, <span class="ruby-keyword">false</span>)
461
+
462
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">latd</span>.<span class="ruby-identifier">nil?</span>
463
+ <span class="ruby-identifier">raise</span>(<span class="ruby-constant">ArgumentError</span>, <span class="ruby-string">&quot;v appears not having a latitudinal dimension&quot;</span>)
464
+ <span class="ruby-keyword">end</span>
465
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">lond</span>
466
+ <span class="ruby-identifier">rho_v_cum</span> = <span class="ruby-identifier">rho_v_cum</span>.<span class="ruby-identifier">mean</span>(<span class="ruby-identifier">lond</span>)
467
+ <span class="ruby-identifier">latd</span> <span class="ruby-operator">-=</span> <span class="ruby-value">1</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">lond</span><span class="ruby-operator">&lt;</span><span class="ruby-identifier">latd</span>
468
+ <span class="ruby-keyword">end</span>
469
+
470
+ <span class="ruby-identifier">a_cos</span> = <span class="ruby-constant">NMath</span>.<span class="ruby-identifier">cos</span>(<span class="ruby-identifier">phi</span>.<span class="ruby-identifier">val</span>) * ( <span class="ruby-value">2</span> * <span class="ruby-constant">Math</span><span class="ruby-operator">::</span><span class="ruby-constant">PI</span> * <span class="ruby-constant">Planet</span>.<span class="ruby-identifier">radius</span>.<span class="ruby-identifier">to_f</span> )
471
+ <span class="ruby-identifier">latd</span>.<span class="ruby-identifier">times</span>{<span class="ruby-identifier">a_cos</span>.<span class="ruby-identifier">newdim!</span>(<span class="ruby-value">0</span>)}
472
+ (<span class="ruby-identifier">rho_v_cum</span>.<span class="ruby-identifier">rank</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">latd</span> <span class="ruby-value">-1</span>).<span class="ruby-identifier">times</span>{<span class="ruby-identifier">a_cos</span>.<span class="ruby-identifier">newdim!</span>(<span class="ruby-value">-1</span>)}
473
+
474
+ <span class="ruby-identifier">mstrm_val</span> = <span class="ruby-identifier">rho_v_cum</span> * <span class="ruby-identifier">a_cos</span>
475
+
476
+ <span class="ruby-comment">#&lt; make a GPhys &gt;</span>
477
+
478
+ <span class="ruby-identifier">axes</span> = <span class="ruby-constant">Array</span>.<span class="ruby-identifier">new</span>
479
+ <span class="ruby-keyword">for</span> <span class="ruby-identifier">d</span> <span class="ruby-keyword">in</span> <span class="ruby-value">0</span><span class="ruby-operator">...</span><span class="ruby-identifier">v</span>.<span class="ruby-identifier">rank</span>
480
+ <span class="ruby-keyword">case</span> <span class="ruby-identifier">d</span>
481
+ <span class="ruby-keyword">when</span> <span class="ruby-identifier">lond</span>
482
+ <span class="ruby-comment"># lost by zonal mean</span>
483
+ <span class="ruby-keyword">when</span> <span class="ruby-identifier">zdim</span>
484
+ <span class="ruby-identifier">pax</span> = <span class="ruby-constant">Axis</span>.<span class="ruby-identifier">new</span>().<span class="ruby-identifier">set_pos</span>(<span class="ruby-identifier">pcoord</span>)
485
+ <span class="ruby-identifier">axes</span>.<span class="ruby-identifier">push</span>(<span class="ruby-identifier">pax</span>)
486
+ <span class="ruby-keyword">else</span>
487
+ <span class="ruby-identifier">axes</span>.<span class="ruby-identifier">push</span>(<span class="ruby-identifier">v</span>.<span class="ruby-identifier">axis</span>(<span class="ruby-identifier">d</span>).<span class="ruby-identifier">copy</span>) <span class="ruby-comment"># kept</span>
488
+ <span class="ruby-keyword">end</span>
489
+ <span class="ruby-keyword">end</span>
490
+ <span class="ruby-identifier">grid</span> = <span class="ruby-constant">Grid</span>.<span class="ruby-identifier">new</span>( *<span class="ruby-identifier">axes</span> )
491
+
492
+ <span class="ruby-identifier">units</span> = <span class="ruby-constant">Units</span>[<span class="ruby-string">&quot;kg.m-1&quot;</span>] <span class="ruby-comment"># p/g*a : Pa / (m.s-2) * m = kg.m-1</span>
493
+ <span class="ruby-identifier">units</span> <span class="ruby-operator">*=</span> <span class="ruby-identifier">v</span>.<span class="ruby-identifier">units</span>
494
+ <span class="ruby-identifier">mstrm_va</span> = <span class="ruby-constant">VArray</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">mstrm_val</span>, {<span class="ruby-string">&quot;long_name&quot;</span>=<span class="ruby-operator">&gt;</span><span class="ruby-string">&quot;mass stream function&quot;</span>,
495
+ <span class="ruby-string">&quot;units&quot;</span>=<span class="ruby-operator">&gt;</span><span class="ruby-identifier">units</span>.<span class="ruby-identifier">to_s</span>}, <span class="ruby-string">&quot;mstrm&quot;</span>)
496
+ <span class="ruby-identifier">mstrm</span> = <span class="ruby-constant">GPhys</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">grid</span>, <span class="ruby-identifier">mstrm_va</span>)
497
+ <span class="ruby-identifier">mstrm</span>
498
+ <span class="ruby-keyword">end</span></pre>
499
+ </div><!-- mass_strm_p-source -->
500
+
501
+ </div>
502
+
503
+
504
+
505
+
506
+ </div><!-- mass_strm_p-method -->
507
+
508
+
509
+ </div><!-- public-instance-method-details -->
510
+
511
+ </div><!-- 5Buntitled-5D -->
512
+
513
+
514
+ </div><!-- documentation -->
515
+
516
+ <div id="validator-badges">
517
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
518
+ <p><small>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish
519
+ Rdoc Generator</a> 2</small>.</p>
520
+ </div>
521
+
522
+ </body>
523
+ </html>
524
+