From d892d1ef5721f18d9e041db3914f7d8c00ecad25 Mon Sep 17 00:00:00 2001 From: Alex Richert Date: Mon, 6 Jan 2025 12:31:17 -0800 Subject: [PATCH] 5.2.0 --- annotated.html | 134 +- bc_sd.png | Bin 0 -> 635 bytes bicubic__interp__mod_8F90.html | 62 +- bicubic__interp__mod_8F90.js | 4 +- bicubic__interp__mod_8F90_source.html | 987 +++--- bilinear__interp__mod_8F90.html | 64 +- bilinear__interp__mod_8F90.js | 6 +- bilinear__interp__mod_8F90_source.html | 925 +++--- budget__interp__mod_8F90.html | 64 +- budget__interp__mod_8F90.js | 6 +- budget__interp__mod_8F90_source.html | 1229 +++---- classes.html | 54 +- dir_49e56c817e5e54854c35e136979f97ca.html | 44 +- dir_68267d1309a1af8e8297ef4c3efbcdba.html | 232 +- dir_68267d1309a1af8e8297ef4c3efbcdba.js | 93 + doc.svg | 12 + docd.svg | 12 + docs(7).zip | Bin 0 -> 1488721 bytes doxygen.css | 1082 +++--- doxygen.svg | 4 +- dynsections.js | 73 +- earth__radius__mod_8F90.html | 56 +- earth__radius__mod_8F90.js | 2 +- earth__radius__mod_8F90_source.html | 189 +- fftpack_8F.html | 442 +-- fftpack_8F.js | 32 +- fftpack_8F_source.html | 2891 +++++++++-------- files.html | 227 +- files_dup.js | 91 +- folderclosed.svg | 11 + folderclosedd.svg | 11 + folderopen.svg | 17 + folderopend.svg | 12 + functions.html | 482 +-- functions_func.html | 253 +- functions_vars.html | 278 +- gdswzd__c_8F90.html | 66 +- gdswzd__c_8F90.js | 4 +- gdswzd__c_8F90_source.html | 233 +- gdswzd__mod_8F90.html | 88 +- gdswzd__mod_8F90.js | 14 +- gdswzd__mod_8F90_source.html | 765 ++--- globals.html | 389 +-- globals_func.html | 391 +-- hierarchy.html | 74 +- index.html | 171 +- index.js | 22 + ...__interp__mod_1_1interpolate__bicubic.html | 112 +- ...ic__interp__mod_1_1interpolate__bicubic.js | 2 +- ..._interp__mod_1_1interpolate__bilinear.html | 148 +- ...r__interp__mod_1_1interpolate__bilinear.js | 4 +- ...t__interp__mod_1_1interpolate__budget.html | 150 +- ...get__interp__mod_1_1interpolate__budget.js | 4 +- interfacegdswzd__mod_1_1gdswzd.html | 364 +-- interfacegdswzd__mod_1_1gdswzd.js | 12 +- ...__descriptor__mod_1_1init__descriptor.html | 88 +- ...scriptor__mod_1_1operator_07_0a_0a_08.html | 72 +- ...eip__grid__factory__mod_1_1init__grid.html | 66 +- ...aceip__grid__mod_1_1gdswzd__interface.html | 64 +- ...__grid__mod_1_1init__grib1__interface.html | 64 +- ...__grid__mod_1_1init__grib2__interface.html | 64 +- ...ip__grid__mod_1_1operator_07_0a_0a_08.html | 72 +- interfaceipolates__mod_1_1ipolates.html | 202 +- interfaceipolates__mod_1_1ipolates.js | 4 +- interfaceipolatev__mod_1_1ipolatev.html | 114 +- ..._mod_1_1interpolate__neighbor__budget.html | 150 +- ...p__mod_1_1interpolate__neighbor__budget.js | 4 +- ..._interp__mod_1_1interpolate__neighbor.html | 150 +- ...r__interp__mod_1_1interpolate__neighbor.js | 4 +- ..._interp__mod_1_1interpolate__spectral.html | 146 +- ...l__interp__mod_1_1interpolate__spectral.js | 4 +- ...facespectral__interp__mod_1_1polates4.html | 154 +- interfacespectral__interp__mod_1_1polates4.js | 4 +- ...facespectral__interp__mod_1_1polatev4.html | 170 +- interfacespectral__interp__mod_1_1polatev4.js | 4 +- ip__constants__mod_8F90.html | 74 +- ip__constants__mod_8F90_source.html | 95 +- ip__equid__cylind__grid__mod_8F90.html | 98 +- ip__equid__cylind__grid__mod_8F90.js | 10 +- ip__equid__cylind__grid__mod_8F90_source.html | 661 ++-- ip__gaussian__grid__mod_8F90.html | 110 +- ip__gaussian__grid__mod_8F90.js | 10 +- ip__gaussian__grid__mod_8F90_source.html | 775 ++--- ip__grid__descriptor__mod_8F90.html | 72 +- ip__grid__descriptor__mod_8F90.js | 10 +- ip__grid__descriptor__mod_8F90_source.html | 1025 +++--- ip__grid__factory__mod_8F90.html | 64 +- ip__grid__factory__mod_8F90.js | 2 +- ip__grid__factory__mod_8F90_source.html | 307 +- ip__grid__mod_8F90.html | 134 +- ip__grid__mod_8F90.js | 10 +- ip__grid__mod_8F90_source.html | 451 +-- ip__grids__mod_8F90.html | 48 +- ip__grids__mod_8F90_source.html | 103 +- ip__interpolators__mod_8F90.html | 62 +- ip__interpolators__mod_8F90_source.html | 121 +- ip__lambert__conf__grid__mod_8F90.html | 110 +- ip__lambert__conf__grid__mod_8F90.js | 10 +- ip__lambert__conf__grid__mod_8F90_source.html | 785 ++--- ip__mercator__grid__mod_8F90.html | 98 +- ip__mercator__grid__mod_8F90.js | 10 +- ip__mercator__grid__mod_8F90_source.html | 633 ++-- ip__mod_8F90.html | 48 +- ip__mod_8F90_source.html | 105 +- ip__polar__stereo__grid__mod_8F90.html | 118 +- ip__polar__stereo__grid__mod_8F90.js | 10 +- ip__polar__stereo__grid__mod_8F90_source.html | 977 +++--- ip__rot__equid__cylind__egrid__mod_8F90.html | 144 +- ip__rot__equid__cylind__egrid__mod_8F90.js | 12 +- ...equid__cylind__egrid__mod_8F90_source.html | 1041 +++--- ip__rot__equid__cylind__grid__mod_8F90.html | 132 +- ip__rot__equid__cylind__grid__mod_8F90.js | 12 +- ..._equid__cylind__grid__mod_8F90_source.html | 1171 +++---- ip__station__points__grid__mod_8F90.html | 66 +- ip__station__points__grid__mod_8F90.js | 4 +- ...tation__points__grid__mod_8F90_source.html | 177 +- iplib__4_8h.html | 64 +- iplib__4_8h_source.html | 81 +- iplib__8_8h.html | 64 +- iplib__8_8h_source.html | 79 +- iplib__d_8h.html | 64 +- iplib__d_8h_source.html | 79 +- ipolates_8F90.html | 76 +- ipolates_8F90.js | 6 +- ipolates_8F90_source.html | 659 ++-- ipolatev_8F90.html | 74 +- ipolatev_8F90.js | 4 +- ipolatev_8F90_source.html | 765 ++--- ipxetas_8F90.html | 86 +- ipxetas_8F90.js | 2 +- ipxetas_8F90_source.html | 297 +- ipxwafs2_8F90.html | 92 +- ipxwafs2_8F90.js | 2 +- ipxwafs2_8F90_source.html | 387 +-- ipxwafs3_8F90.html | 92 +- ipxwafs3_8F90.js | 2 +- ipxwafs3_8F90_source.html | 431 +-- ipxwafs_8F90.html | 80 +- ipxwafs_8F90.js | 2 +- ipxwafs_8F90_source.html | 349 +- jquery.js | 11 +- menu.js | 97 +- menudata.js | 2 +- minus.svg | 8 + minusd.svg | 8 + movect_8F90.html | 68 +- movect_8F90.js | 2 +- movect_8F90_source.html | 145 +- namespacebicubic__interp__mod.html | 94 +- namespacebicubic__interp__mod.js | 2 +- namespacebilinear__interp__mod.html | 130 +- namespacebilinear__interp__mod.js | 4 +- namespacebudget__interp__mod.html | 132 +- namespacebudget__interp__mod.js | 4 +- namespaceearth__radius__mod.html | 64 +- namespacegdswzd__c__mod.html | 138 +- namespacegdswzd__mod.html | 314 +- namespacegdswzd__mod.js | 12 +- namespaceip__constants__mod.html | 100 +- namespaceip__equid__cylind__grid__mod.html | 220 +- namespaceip__equid__cylind__grid__mod.js | 8 +- namespaceip__gaussian__grid__mod.html | 258 +- namespaceip__gaussian__grid__mod.js | 8 +- namespaceip__grid__descriptor__mod.html | 100 +- namespaceip__grid__factory__mod.html | 72 +- namespaceip__grid__mod.html | 230 +- namespaceip__grids__mod.html | 44 +- namespaceip__interpolators__mod.html | 82 +- namespaceip__lambert__conf__grid__mod.html | 272 +- namespaceip__lambert__conf__grid__mod.js | 8 +- namespaceip__mercator__grid__mod.html | 222 +- namespaceip__mercator__grid__mod.js | 8 +- namespaceip__mod.html | 44 +- namespaceip__polar__stereo__grid__mod.html | 292 +- namespaceip__polar__stereo__grid__mod.js | 8 +- ...aceip__rot__equid__cylind__egrid__mod.html | 372 ++- ...spaceip__rot__equid__cylind__egrid__mod.js | 10 +- ...paceip__rot__equid__cylind__grid__mod.html | 358 +- namespaceip__rot__equid__cylind__grid__mod.js | 10 +- namespaceip__station__points__grid__mod.html | 118 +- namespaceip__station__points__grid__mod.js | 2 +- namespaceipolates__mod.html | 176 +- namespaceipolates__mod.js | 4 +- namespaceipolatev__mod.html | 128 +- namespaceipolatev__mod.js | 2 +- namespacemembers.html | 668 ++-- namespacemembers_func.html | 408 +-- namespacemembers_vars.html | 319 +- namespaceneighbor__budget__interp__mod.html | 132 +- namespaceneighbor__budget__interp__mod.js | 4 +- namespaceneighbor__interp__mod.html | 132 +- namespaceneighbor__interp__mod.js | 4 +- namespacepolfix__mod.html | 98 +- namespaces.html | 132 +- namespaces_dup.js | 10 +- namespacespectral__interp__mod.html | 320 +- namespacespectral__interp__mod.js | 12 +- nav_fd.png | Bin 0 -> 169 bytes nav_hd.png | Bin 0 -> 114 bytes navtree.css | 23 +- navtree.js | 37 +- navtreedata.js | 32 +- navtreeindex0.js | 382 +-- navtreeindex1.js | 348 +- navtreeindex2.js | 444 +-- navtreeindex3.js | 433 +-- navtreeindex4.js | 253 ++ navtreeindex5.js | 15 + ncpus_8F.html | 66 +- ncpus_8F_source.html | 133 +- neighbor__budget__interp__mod_8F90.html | 64 +- neighbor__budget__interp__mod_8F90.js | 6 +- ...hbor__budget__interp__mod_8F90_source.html | 819 ++--- neighbor__interp__mod_8F90.html | 64 +- neighbor__interp__mod_8F90.js | 6 +- neighbor__interp__mod_8F90_source.html | 887 ++--- plus.svg | 9 + plusd.svg | 9 + polfix__mod_8F90.html | 62 +- polfix__mod_8F90.js | 4 +- polfix__mod_8F90_source.html | 431 +-- resize.js | 97 +- search/all_0.js | 3 +- search/all_1.js | 17 +- search/all_10.js | 80 +- search/all_11.js | 233 +- search/all_12.js | 4 +- search/all_13.js | 3 +- search/all_14.js | 2 +- search/all_15.js | 4 + search/all_16.js | 4 + search/all_2.js | 12 +- search/all_3.js | 24 +- search/all_4.js | 29 +- search/all_5.js | 4 +- search/all_6.js | 69 +- search/all_7.js | 6 +- search/all_8.js | 218 +- search/all_9.js | 14 +- search/all_a.js | 4 +- search/all_b.js | 14 +- search/all_c.js | 17 +- search/all_d.js | 26 +- search/all_e.js | 4 +- search/all_f.js | 43 +- search/classes_0.js | 8 +- search/classes_1.js | 44 +- search/classes_2.js | 2 +- search/classes_3.js | 4 +- search/close.svg | 19 +- search/files_0.js | 6 +- search/files_1.js | 2 +- search/files_2.js | 2 +- search/files_3.js | 4 +- search/files_4.js | 48 +- search/files_5.js | 2 +- search/files_6.js | 6 +- search/files_7.js | 2 +- search/files_8.js | 106 +- search/functions_0.js | 2 +- search/functions_1.js | 4 +- search/functions_2.js | 8 +- search/functions_3.js | 2 +- search/functions_4.js | 42 +- search/functions_5.js | 82 +- search/functions_6.js | 6 +- search/functions_7.js | 8 +- search/functions_8.js | 2 +- search/functions_9.js | 18 +- search/functions_a.js | 48 +- search/functions_b.js | 110 +- search/functions_c.js | 4 +- search/mag.svg | 24 + search/mag_d.svg | 24 + search/mag_sel.svg | 53 +- search/mag_seld.svg | 31 + search/namespaces_0.js | 6 +- search/namespaces_1.js | 2 +- search/namespaces_2.js | 4 +- search/namespaces_3.js | 34 +- search/namespaces_4.js | 4 +- search/namespaces_5.js | 2 +- search/namespaces_6.js | 2 +- search/pages_0.js | 2 +- search/search.css | 122 +- search/search.js | 188 +- search/searchdata.js | 2 +- search/variables_0.js | 2 +- search/variables_1.js | 8 +- search/variables_10.js | 10 +- search/variables_11.js | 2 +- search/variables_12.js | 2 +- search/variables_2.js | 8 +- search/variables_3.js | 20 +- search/variables_4.js | 12 +- search/variables_5.js | 14 +- search/variables_6.js | 4 +- search/variables_7.js | 6 +- search/variables_8.js | 14 +- search/variables_9.js | 4 +- search/variables_a.js | 4 +- search/variables_b.js | 4 +- search/variables_c.js | 12 +- search/variables_d.js | 2 +- search/variables_e.js | 10 +- search/variables_f.js | 30 +- sp__mod_8F_source.html | 175 +- spanaly_8f.html | 86 +- spanaly_8f.js | 2 +- spanaly_8f_source.html | 205 +- spdz2uv_8f.html | 82 +- spdz2uv_8f.js | 2 +- spdz2uv_8f_source.html | 217 +- spectral__interp__mod_8F90.html | 88 +- spectral__interp__mod_8F90.js | 18 +- spectral__interp__mod_8F90_source.html | 2197 +++++++------ speps_8f.html | 72 +- speps_8f.js | 2 +- speps_8f_source.html | 159 +- spfft1_8f.html | 72 +- spfft1_8f.js | 2 +- spfft1_8f_source.html | 181 +- spfft_8f.html | 70 +- spfft_8f.js | 2 +- spfft_8f_source.html | 213 +- spffte_8f.html | 74 +- spffte_8f.js | 2 +- spffte_8f_source.html | 333 +- spfftpt_8f.html | 72 +- spfftpt_8f.js | 2 +- spfftpt_8f_source.html | 149 +- spgradq_8f.html | 78 +- spgradq_8f.js | 2 +- spgradq_8f_source.html | 185 +- spgradx_8f.html | 70 +- spgradx_8f.js | 2 +- spgradx_8f_source.html | 197 +- spgrady_8f.html | 72 +- spgrady_8f.js | 2 +- spgrady_8f_source.html | 171 +- splaplac_8f.html | 70 +- splaplac_8f.js | 2 +- splaplac_8f_source.html | 151 +- splat_8F.html | 66 +- splat_8F.js | 2 +- splat_8F_source.html | 461 +-- splegend_8f.html | 72 +- splegend_8f.js | 2 +- splegend_8f_source.html | 329 +- splitbard.png | Bin 0 -> 282 bytes sppad_8f.html | 68 +- sppad_8f.js | 2 +- sppad_8f_source.html | 125 +- spsynth_8f.html | 84 +- spsynth_8f.js | 2 +- spsynth_8f_source.html | 371 ++- sptez_8f.html | 76 +- sptez_8f.js | 2 +- sptez_8f_source.html | 199 +- sptezd_8f.html | 80 +- sptezd_8f.js | 2 +- sptezd_8f_source.html | 177 +- sptezm_8f.html | 78 +- sptezm_8f.js | 2 +- sptezm_8f_source.html | 197 +- sptezmd_8f.html | 82 +- sptezmd_8f.js | 2 +- sptezmd_8f_source.html | 183 +- sptezmv_8f.html | 82 +- sptezmv_8f.js | 2 +- sptezmv_8f_source.html | 213 +- sptezv_8f.html | 78 +- sptezv_8f.js | 2 +- sptezv_8f_source.html | 209 +- sptgpm_8f.html | 86 +- sptgpm_8f.js | 2 +- sptgpm_8f_source.html | 305 +- sptgpmd_8f.html | 88 +- sptgpmd_8f.js | 2 +- sptgpmd_8f_source.html | 221 +- sptgpmv_8f.html | 90 +- sptgpmv_8f.js | 2 +- sptgpmv_8f_source.html | 345 +- sptgps_8f.html | 84 +- sptgps_8f.js | 2 +- sptgps_8f_source.html | 1153 +++---- sptgpsd_8f.html | 88 +- sptgpsd_8f.js | 2 +- sptgpsd_8f_source.html | 259 +- sptgpsv_8f.html | 90 +- sptgpsv_8f.js | 2 +- sptgpsv_8f_source.html | 1929 +++++------ sptgpt_8f.html | 82 +- sptgpt_8f.js | 2 +- sptgpt_8f_source.html | 269 +- sptgptd_8f.html | 82 +- sptgptd_8f.js | 2 +- sptgptd_8f_source.html | 213 +- sptgptsd_8f.html | 84 +- sptgptsd_8f.js | 2 +- sptgptsd_8f_source.html | 325 +- sptgptv_8f.html | 86 +- sptgptv_8f.js | 2 +- sptgptv_8f_source.html | 307 +- sptgptvd_8f.html | 96 +- sptgptvd_8f.js | 2 +- sptgptvd_8f_source.html | 385 +-- sptran_8f.html | 96 +- sptran_8f.js | 2 +- sptran_8f_source.html | 301 +- sptrand_8f.html | 100 +- sptrand_8f.js | 2 +- sptrand_8f_source.html | 359 +- sptranf0_8f.html | 98 +- sptranf0_8f.js | 2 +- sptranf0_8f_source.html | 193 +- sptranf1_8f.html | 108 +- sptranf1_8f.js | 2 +- sptranf1_8f_source.html | 211 +- sptranf_8f.html | 94 +- sptranf_8f.js | 2 +- sptranf_8f_source.html | 379 +-- sptranfv_8f.html | 100 +- sptranfv_8f.js | 2 +- sptranfv_8f_source.html | 453 +-- sptranv_8f.html | 102 +- sptranv_8f.js | 2 +- sptranv_8f_source.html | 309 +- sptrun_8f.html | 96 +- sptrun_8f.js | 2 +- sptrun_8f_source.html | 227 +- sptrund_8f.html | 100 +- sptrund_8f.js | 2 +- sptrund_8f_source.html | 269 +- sptrung_8f.html | 100 +- sptrung_8f.js | 2 +- sptrung_8f_source.html | 239 +- sptrungv_8f.html | 114 +- sptrungv_8f.js | 2 +- sptrungv_8f_source.html | 347 +- sptrunl_8f.html | 98 +- sptrunl_8f.js | 2 +- sptrunl_8f_source.html | 291 +- sptrunm_8f.html | 106 +- sptrunm_8f.js | 2 +- sptrunm_8f_source.html | 261 +- sptrunmv_8f.html | 120 +- sptrunmv_8f.js | 2 +- sptrunmv_8f_source.html | 369 ++- sptruns_8f.html | 104 +- sptruns_8f.js | 2 +- sptruns_8f_source.html | 251 +- sptrunsv_8f.html | 128 +- sptrunsv_8f.js | 2 +- sptrunsv_8f_source.html | 363 ++- sptrunv_8f.html | 114 +- sptrunv_8f.js | 2 +- sptrunv_8f_source.html | 387 +-- spuv2dz_8f.html | 82 +- spuv2dz_8f.js | 2 +- spuv2dz_8f_source.html | 235 +- spvar_8f.html | 64 +- spvar_8f.js | 2 +- spvar_8f_source.html | 123 +- spwget_8f.html | 72 +- spwget_8f.js | 2 +- spwget_8f_source.html | 107 +- ..._grid__mod_1_1ip__equid__cylind__grid.html | 614 ++-- ...d__grid__mod_1_1ip__equid__cylind__grid.js | 11 +- ...__grid__mod_1_1ip__equid__cylind__grid.png | Bin 804 -> 830 bytes ...sian__grid__mod_1_1ip__gaussian__grid.html | 630 ++-- ...ussian__grid__mod_1_1ip__gaussian__grid.js | 11 +- ...ssian__grid__mod_1_1ip__gaussian__grid.png | Bin 684 -> 702 bytes ..._descriptor__mod_1_1grib1__descriptor.html | 176 +- ...d__descriptor__mod_1_1grib1__descriptor.js | 4 +- ...__descriptor__mod_1_1grib1__descriptor.png | Bin 774 -> 794 bytes ..._descriptor__mod_1_1grib2__descriptor.html | 212 +- ...d__descriptor__mod_1_1grib2__descriptor.js | 4 +- ...__descriptor__mod_1_1grib2__descriptor.png | Bin 780 -> 800 bytes ...scriptor__mod_1_1ip__grid__descriptor.html | 120 +- ...descriptor__mod_1_1ip__grid__descriptor.js | 2 +- ...escriptor__mod_1_1ip__grid__descriptor.png | Bin 1069 -> 1091 bytes structip__grid__mod_1_1ip__grid.html | 412 +-- structip__grid__mod_1_1ip__grid.js | 8 +- structip__grid__mod_1_1ip__grid.png | Bin 5524 -> 5605 bytes ..._grid__mod_1_1ip__lambert__conf__grid.html | 675 ++-- ...f__grid__mod_1_1ip__lambert__conf__grid.js | 11 +- ...__grid__mod_1_1ip__lambert__conf__grid.png | Bin 825 -> 850 bytes ...ator__grid__mod_1_1ip__mercator__grid.html | 639 ++-- ...rcator__grid__mod_1_1ip__mercator__grid.js | 11 +- ...cator__grid__mod_1_1ip__mercator__grid.png | Bin 689 -> 709 bytes ..._grid__mod_1_1ip__polar__stereo__grid.html | 670 ++-- ...o__grid__mod_1_1ip__polar__stereo__grid.js | 11 +- ...__grid__mod_1_1ip__polar__stereo__grid.png | Bin 819 -> 843 bytes ..._mod_1_1ip__rot__equid__cylind__egrid.html | 647 ++-- ...d__mod_1_1ip__rot__equid__cylind__egrid.js | 11 +- ...__mod_1_1ip__rot__equid__cylind__egrid.png | Bin 863 -> 893 bytes ...__mod_1_1ip__rot__equid__cylind__grid.html | 648 ++-- ...id__mod_1_1ip__rot__equid__cylind__grid.js | 11 +- ...d__mod_1_1ip__rot__equid__cylind__grid.png | Bin 854 -> 885 bytes ...rid__mod_1_1ip__station__points__grid.html | 495 ++- ..._grid__mod_1_1ip__station__points__grid.js | 11 +- ...grid__mod_1_1ip__station__points__grid.png | Bin 825 -> 855 bytes tab_ad.png | Bin 0 -> 135 bytes tab_bd.png | Bin 0 -> 173 bytes tab_hd.png | Bin 0 -> 180 bytes tab_sd.png | Bin 0 -> 188 bytes tabs.css | 2 +- ver-5.1.0/annotated.html | 152 + ver-5.1.0/annotated_dup.js | 73 + ver-5.1.0/bc_s.png | Bin 0 -> 676 bytes bdwn.png => ver-5.1.0/bdwn.png | Bin ver-5.1.0/bicubic__interp__mod_8F90.html | 134 + ver-5.1.0/bicubic__interp__mod_8F90.js | 6 + .../bicubic__interp__mod_8F90_source.html | 565 ++++ ver-5.1.0/bilinear__interp__mod_8F90.html | 134 + ver-5.1.0/bilinear__interp__mod_8F90.js | 6 + .../bilinear__interp__mod_8F90_source.html | 534 +++ ver-5.1.0/budget__interp__mod_8F90.html | 135 + ver-5.1.0/budget__interp__mod_8F90.js | 6 + .../budget__interp__mod_8F90_source.html | 686 ++++ ver-5.1.0/classes.html | 113 + ver-5.1.0/closed.png | Bin 0 -> 132 bytes .../dir_49e56c817e5e54854c35e136979f97ca.html | 99 + .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 370 +++ doc.png => ver-5.1.0/doc.png | Bin ver-5.1.0/doxygen.css | 1793 ++++++++++ ver-5.1.0/doxygen.svg | 26 + ver-5.1.0/dynsections.js | 128 + ver-5.1.0/earth__radius__mod_8F90.html | 126 + ver-5.1.0/earth__radius__mod_8F90.js | 4 + ver-5.1.0/earth__radius__mod_8F90_source.html | 168 + ver-5.1.0/fftpack_8F.html | 2006 ++++++++++++ ver-5.1.0/fftpack_8F.js | 25 + ver-5.1.0/fftpack_8F_source.html | 1498 +++++++++ ver-5.1.0/files.html | 192 ++ ver-5.1.0/files_dup.js | 93 + .../folderclosed.png | Bin folderopen.png => ver-5.1.0/folderopen.png | Bin ver-5.1.0/functions.html | 476 +++ ver-5.1.0/functions_func.html | 268 ++ ver-5.1.0/functions_vars.html | 310 ++ ver-5.1.0/gdswzd__c_8F90.html | 129 + ver-5.1.0/gdswzd__c_8F90.js | 5 + ver-5.1.0/gdswzd__c_8F90_source.html | 189 ++ ver-5.1.0/gdswzd__mod_8F90.html | 147 + ver-5.1.0/gdswzd__mod_8F90.js | 10 + ver-5.1.0/gdswzd__mod_8F90_source.html | 450 +++ ver-5.1.0/globals.html | 376 +++ ver-5.1.0/globals_func.html | 376 +++ ver-5.1.0/hierarchy.html | 132 + ver-5.1.0/hierarchy.js | 35 + ver-5.1.0/index.html | 1076 ++++++ ...__interp__mod_1_1interpolate__bicubic.html | 473 +++ ...ic__interp__mod_1_1interpolate__bicubic.js | 5 + ..._interp__mod_1_1interpolate__bilinear.html | 463 +++ ...r__interp__mod_1_1interpolate__bilinear.js | 5 + ...t__interp__mod_1_1interpolate__budget.html | 473 +++ ...get__interp__mod_1_1interpolate__budget.js | 5 + ver-5.1.0/interfacegdswzd__mod_1_1gdswzd.html | 1310 ++++++++ ver-5.1.0/interfacegdswzd__mod_1_1gdswzd.js | 9 + ...__descriptor__mod_1_1init__descriptor.html | 214 ++ ...id__descriptor__mod_1_1init__descriptor.js | 5 + ...scriptor__mod_1_1operator_07_0a_0a_08.html | 167 + ...descriptor__mod_1_1operator_07_0a_0a_08.js | 4 + ...eip__grid__factory__mod_1_1init__grid.html | 166 + ...aceip__grid__factory__mod_1_1init__grid.js | 4 + ...aceip__grid__mod_1_1gdswzd__interface.html | 266 ++ ...rfaceip__grid__mod_1_1gdswzd__interface.js | 4 + ...__grid__mod_1_1init__grib1__interface.html | 164 + ...ip__grid__mod_1_1init__grib1__interface.js | 4 + ...__grid__mod_1_1init__grib2__interface.html | 164 + ...ip__grid__mod_1_1init__grib2__interface.js | 4 + ...ip__grid__mod_1_1operator_07_0a_0a_08.html | 173 + ...ceip__grid__mod_1_1operator_07_0a_0a_08.js | 4 + .../interfaceipolates__mod_1_1ipolates.html | 1221 +++++++ .../interfaceipolates__mod_1_1ipolates.js | 7 + .../interfaceipolatev__mod_1_1ipolatev.html | 1277 ++++++++ .../interfaceipolatev__mod_1_1ipolatev.js | 7 + ..._mod_1_1interpolate__neighbor__budget.html | 529 +++ ...p__mod_1_1interpolate__neighbor__budget.js | 5 + ..._interp__mod_1_1interpolate__neighbor.html | 486 +++ ...r__interp__mod_1_1interpolate__neighbor.js | 5 + ..._interp__mod_1_1interpolate__spectral.html | 428 +++ ...l__interp__mod_1_1interpolate__spectral.js | 5 + ...facespectral__interp__mod_1_1polates4.html | 504 +++ ...erfacespectral__interp__mod_1_1polates4.js | 5 + ...facespectral__interp__mod_1_1polatev4.html | 562 ++++ ...erfacespectral__interp__mod_1_1polatev4.js | 5 + ver-5.1.0/ip__constants__mod_8F90.html | 141 + ver-5.1.0/ip__constants__mod_8F90.js | 9 + ver-5.1.0/ip__constants__mod_8F90_source.html | 122 + .../ip__equid__cylind__grid__mod_8F90.html | 160 + .../ip__equid__cylind__grid__mod_8F90.js | 13 + ..._equid__cylind__grid__mod_8F90_source.html | 399 +++ ver-5.1.0/ip__gaussian__grid__mod_8F90.html | 169 + ver-5.1.0/ip__gaussian__grid__mod_8F90.js | 16 + .../ip__gaussian__grid__mod_8F90_source.html | 456 +++ ver-5.1.0/ip__grid__descriptor__mod_8F90.html | 154 + ver-5.1.0/ip__grid__descriptor__mod_8F90.js | 13 + ...ip__grid__descriptor__mod_8F90_source.html | 577 ++++ ver-5.1.0/ip__grid__factory__mod_8F90.html | 138 + ver-5.1.0/ip__grid__factory__mod_8F90.js | 7 + .../ip__grid__factory__mod_8F90_source.html | 224 ++ ver-5.1.0/ip__grid__mod_8F90.html | 203 ++ ver-5.1.0/ip__grid__mod_8F90.js | 28 + ver-5.1.0/ip__grid__mod_8F90_source.html | 292 ++ ver-5.1.0/ip__grids__mod_8F90.html | 119 + ver-5.1.0/ip__grids__mod_8F90_source.html | 126 + ver-5.1.0/ip__interpolators__mod_8F90.html | 134 + ver-5.1.0/ip__interpolators__mod_8F90.js | 9 + .../ip__interpolators__mod_8F90_source.html | 135 + .../ip__lambert__conf__grid__mod_8F90.html | 169 + .../ip__lambert__conf__grid__mod_8F90.js | 16 + ..._lambert__conf__grid__mod_8F90_source.html | 461 +++ ver-5.1.0/ip__mercator__grid__mod_8F90.html | 160 + ver-5.1.0/ip__mercator__grid__mod_8F90.js | 13 + .../ip__mercator__grid__mod_8F90_source.html | 385 +++ ver-5.1.0/ip__mod_8F90.html | 118 + ver-5.1.0/ip__mod_8F90_source.html | 127 + .../ip__polar__stereo__grid__mod_8F90.html | 175 + .../ip__polar__stereo__grid__mod_8F90.js | 18 + ..._polar__stereo__grid__mod_8F90_source.html | 557 ++++ ...__rot__equid__cylind__egrid__mod_8F90.html | 193 ++ ...ip__rot__equid__cylind__egrid__mod_8F90.js | 24 + ...equid__cylind__egrid__mod_8F90_source.html | 588 ++++ ...p__rot__equid__cylind__grid__mod_8F90.html | 184 ++ .../ip__rot__equid__cylind__grid__mod_8F90.js | 21 + ..._equid__cylind__grid__mod_8F90_source.html | 651 ++++ .../ip__station__points__grid__mod_8F90.html | 138 + .../ip__station__points__grid__mod_8F90.js | 7 + ...tation__points__grid__mod_8F90_source.html | 160 + ver-5.1.0/iplib__4_8h.html | 516 +++ ver-5.1.0/iplib__4_8h.js | 5 + ver-5.1.0/iplib__4_8h_source.html | 117 + ver-5.1.0/iplib__8_8h.html | 516 +++ ver-5.1.0/iplib__8_8h.js | 5 + ver-5.1.0/iplib__8_8h_source.html | 116 + ver-5.1.0/iplib__d_8h.html | 516 +++ ver-5.1.0/iplib__d_8h.js | 5 + ver-5.1.0/iplib__d_8h_source.html | 116 + ver-5.1.0/ipolates_8F90.html | 143 + ver-5.1.0/ipolates_8F90.js | 9 + ver-5.1.0/ipolates_8F90_source.html | 398 +++ ver-5.1.0/ipolatev_8F90.html | 144 + ver-5.1.0/ipolatev_8F90.js | 9 + ver-5.1.0/ipolatev_8F90_source.html | 451 +++ ver-5.1.0/ipxetas_8F90.html | 290 ++ ver-5.1.0/ipxetas_8F90.js | 4 + ver-5.1.0/ipxetas_8F90_source.html | 222 ++ ver-5.1.0/ipxwafs2_8F90.html | 308 ++ ver-5.1.0/ipxwafs2_8F90.js | 4 + ver-5.1.0/ipxwafs2_8F90_source.html | 267 ++ ver-5.1.0/ipxwafs3_8F90.html | 306 ++ ver-5.1.0/ipxwafs3_8F90.js | 4 + ver-5.1.0/ipxwafs3_8F90_source.html | 289 ++ ver-5.1.0/ipxwafs_8F90.html | 278 ++ ver-5.1.0/ipxwafs_8F90.js | 4 + ver-5.1.0/ipxwafs_8F90_source.html | 248 ++ ver-5.1.0/jquery.js | 35 + ver-5.1.0/menu.js | 51 + ver-5.1.0/menudata.js | 139 + ver-5.1.0/movect_8F90.html | 202 ++ ver-5.1.0/movect_8F90.js | 4 + ver-5.1.0/movect_8F90_source.html | 146 + ver-5.1.0/namespacebicubic__interp__mod.html | 475 +++ ver-5.1.0/namespacebicubic__interp__mod.js | 6 + ver-5.1.0/namespacebilinear__interp__mod.html | 465 +++ ver-5.1.0/namespacebilinear__interp__mod.js | 6 + ver-5.1.0/namespacebudget__interp__mod.html | 476 +++ ver-5.1.0/namespacebudget__interp__mod.js | 6 + ver-5.1.0/namespaceearth__radius__mod.html | 183 ++ ver-5.1.0/namespacegdswzd__c__mod.html | 556 ++++ ver-5.1.0/namespacegdswzd__mod.html | 1309 ++++++++ ver-5.1.0/namespacegdswzd__mod.js | 10 + ver-5.1.0/namespaceip__constants__mod.html | 244 ++ ...namespaceip__equid__cylind__grid__mod.html | 668 ++++ .../namespaceip__equid__cylind__grid__mod.js | 13 + .../namespaceip__gaussian__grid__mod.html | 767 +++++ ver-5.1.0/namespaceip__gaussian__grid__mod.js | 16 + .../namespaceip__grid__descriptor__mod.html | 378 +++ .../namespaceip__grid__descriptor__mod.js | 13 + .../namespaceip__grid__factory__mod.html | 285 ++ ver-5.1.0/namespaceip__grid__factory__mod.js | 7 + ver-5.1.0/namespaceip__grid__mod.html | 667 ++++ ver-5.1.0/namespaceip__grid__mod.js | 28 + ver-5.1.0/namespaceip__grids__mod.html | 106 + .../namespaceip__interpolators__mod.html | 268 ++ ...namespaceip__lambert__conf__grid__mod.html | 880 +++++ .../namespaceip__lambert__conf__grid__mod.js | 16 + .../namespaceip__mercator__grid__mod.html | 728 +++++ ver-5.1.0/namespaceip__mercator__grid__mod.js | 13 + ver-5.1.0/namespaceip__mod.html | 104 + ...namespaceip__polar__stereo__grid__mod.html | 918 ++++++ .../namespaceip__polar__stereo__grid__mod.js | 18 + ...aceip__rot__equid__cylind__egrid__mod.html | 1105 +++++++ ...spaceip__rot__equid__cylind__egrid__mod.js | 24 + ...paceip__rot__equid__cylind__grid__mod.html | 1176 +++++++ ...espaceip__rot__equid__cylind__grid__mod.js | 21 + ...mespaceip__station__points__grid__mod.html | 375 +++ ...namespaceip__station__points__grid__mod.js | 7 + ver-5.1.0/namespaceipolates__mod.html | 1358 ++++++++ ver-5.1.0/namespaceipolates__mod.js | 9 + ver-5.1.0/namespaceipolatev__mod.html | 1443 ++++++++ ver-5.1.0/namespaceipolatev__mod.js | 9 + ver-5.1.0/namespacemembers.html | 623 ++++ ver-5.1.0/namespacemembers_func.html | 394 +++ ver-5.1.0/namespacemembers_vars.html | 351 ++ ...amespaceneighbor__budget__interp__mod.html | 532 +++ .../namespaceneighbor__budget__interp__mod.js | 6 + ver-5.1.0/namespaceneighbor__interp__mod.html | 511 +++ ver-5.1.0/namespaceneighbor__interp__mod.js | 6 + ver-5.1.0/namespacepolfix__mod.html | 290 ++ ver-5.1.0/namespaces.html | 159 + ver-5.1.0/namespaces_dup.js | 52 + ver-5.1.0/namespacespectral__interp__mod.html | 1273 ++++++++ ver-5.1.0/namespacespectral__interp__mod.js | 12 + ver-5.1.0/nav_f.png | Bin 0 -> 153 bytes ver-5.1.0/nav_g.png | Bin 0 -> 95 bytes ver-5.1.0/nav_h.png | Bin 0 -> 98 bytes ver-5.1.0/navtree.css | 146 + ver-5.1.0/navtree.js | 546 ++++ ver-5.1.0/navtreedata.js | 85 + ver-5.1.0/navtreeindex0.js | 253 ++ ver-5.1.0/navtreeindex1.js | 253 ++ ver-5.1.0/navtreeindex2.js | 253 ++ ver-5.1.0/navtreeindex3.js | 212 ++ ver-5.1.0/ncpus_8F.html | 165 + ver-5.1.0/ncpus_8F.js | 4 + ver-5.1.0/ncpus_8F_source.html | 141 + .../neighbor__budget__interp__mod_8F90.html | 135 + .../neighbor__budget__interp__mod_8F90.js | 6 + ...hbor__budget__interp__mod_8F90_source.html | 481 +++ ver-5.1.0/neighbor__interp__mod_8F90.html | 135 + ver-5.1.0/neighbor__interp__mod_8F90.js | 6 + .../neighbor__interp__mod_8F90_source.html | 515 +++ ver-5.1.0/open.png | Bin 0 -> 123 bytes ver-5.1.0/polfix__mod_8F90.html | 129 + ver-5.1.0/polfix__mod_8F90.js | 5 + ver-5.1.0/polfix__mod_8F90_source.html | 288 ++ ver-5.1.0/resize.js | 140 + {search => ver-5.1.0/search}/all_0.html | 0 ver-5.1.0/search/all_0.js | 4 + {search => ver-5.1.0/search}/all_1.html | 0 ver-5.1.0/search/all_1.js | 13 + {search => ver-5.1.0/search}/all_10.html | 0 ver-5.1.0/search/all_10.js | 42 + {search => ver-5.1.0/search}/all_11.html | 0 ver-5.1.0/search/all_11.js | 117 + {search => ver-5.1.0/search}/all_12.html | 0 ver-5.1.0/search/all_12.js | 5 + {search => ver-5.1.0/search}/all_13.html | 0 ver-5.1.0/search/all_13.js | 4 + {search => ver-5.1.0/search}/all_14.html | 0 ver-5.1.0/search/all_14.js | 4 + {search => ver-5.1.0/search}/all_2.html | 0 ver-5.1.0/search/all_2.js | 8 + {search => ver-5.1.0/search}/all_3.html | 0 ver-5.1.0/search/all_3.js | 15 + {search => ver-5.1.0/search}/all_4.html | 0 ver-5.1.0/search/all_4.js | 15 + {search => ver-5.1.0/search}/all_5.html | 0 ver-5.1.0/search/all_5.js | 5 + {search => ver-5.1.0/search}/all_6.html | 0 ver-5.1.0/search/all_6.js | 37 + {search => ver-5.1.0/search}/all_7.html | 0 ver-5.1.0/search/all_7.js | 5 + {search => ver-5.1.0/search}/all_8.html | 0 ver-5.1.0/search/all_8.js | 109 + {search => ver-5.1.0/search}/all_9.html | 0 ver-5.1.0/search/all_9.js | 10 + {search => ver-5.1.0/search}/all_a.html | 0 ver-5.1.0/search/all_a.js | 5 + {search => ver-5.1.0/search}/all_b.html | 0 ver-5.1.0/search/all_b.js | 8 + {search => ver-5.1.0/search}/all_c.html | 0 ver-5.1.0/search/all_c.js | 10 + {search => ver-5.1.0/search}/all_d.html | 0 ver-5.1.0/search/all_d.js | 15 + {search => ver-5.1.0/search}/all_e.html | 0 ver-5.1.0/search/all_e.js | 5 + {search => ver-5.1.0/search}/all_f.html | 0 ver-5.1.0/search/all_f.js | 21 + {search => ver-5.1.0/search}/classes_0.html | 0 ver-5.1.0/search/classes_0.js | 7 + {search => ver-5.1.0/search}/classes_1.html | 0 ver-5.1.0/search/classes_1.js | 25 + {search => ver-5.1.0/search}/classes_2.html | 0 ver-5.1.0/search/classes_2.js | 4 + {search => ver-5.1.0/search}/classes_3.html | 0 ver-5.1.0/search/classes_3.js | 5 + ver-5.1.0/search/close.svg | 31 + {search => ver-5.1.0/search}/files_0.html | 0 ver-5.1.0/search/files_0.js | 6 + {search => ver-5.1.0/search}/files_1.html | 0 ver-5.1.0/search/files_1.js | 4 + {search => ver-5.1.0/search}/files_2.html | 0 ver-5.1.0/search/files_2.js | 4 + {search => ver-5.1.0/search}/files_3.html | 0 ver-5.1.0/search/files_3.js | 5 + {search => ver-5.1.0/search}/files_4.html | 0 ver-5.1.0/search/files_4.js | 27 + {search => ver-5.1.0/search}/files_5.html | 0 ver-5.1.0/search/files_5.js | 4 + {search => ver-5.1.0/search}/files_6.html | 0 ver-5.1.0/search/files_6.js | 6 + {search => ver-5.1.0/search}/files_7.html | 0 ver-5.1.0/search/files_7.js | 4 + {search => ver-5.1.0/search}/files_8.html | 0 ver-5.1.0/search/files_8.js | 56 + {search => ver-5.1.0/search}/functions_0.html | 0 ver-5.1.0/search/functions_0.js | 4 + {search => ver-5.1.0/search}/functions_1.html | 0 ver-5.1.0/search/functions_1.js | 5 + {search => ver-5.1.0/search}/functions_2.html | 0 ver-5.1.0/search/functions_2.js | 7 + {search => ver-5.1.0/search}/functions_3.html | 0 ver-5.1.0/search/functions_3.js | 4 + {search => ver-5.1.0/search}/functions_4.html | 0 ver-5.1.0/search/functions_4.js | 24 + {search => ver-5.1.0/search}/functions_5.html | 0 ver-5.1.0/search/functions_5.js | 44 + {search => ver-5.1.0/search}/functions_6.html | 0 ver-5.1.0/search/functions_6.js | 6 + {search => ver-5.1.0/search}/functions_7.html | 0 ver-5.1.0/search/functions_7.js | 7 + {search => ver-5.1.0/search}/functions_8.html | 0 ver-5.1.0/search/functions_8.js | 4 + {search => ver-5.1.0/search}/functions_9.html | 0 ver-5.1.0/search/functions_9.js | 12 + {search => ver-5.1.0/search}/functions_a.html | 0 ver-5.1.0/search/functions_a.js | 27 + {search => ver-5.1.0/search}/functions_b.html | 0 ver-5.1.0/search/functions_b.js | 58 + {search => ver-5.1.0/search}/functions_c.html | 0 ver-5.1.0/search/functions_c.js | 5 + ver-5.1.0/search/mag_sel.svg | 74 + .../search}/namespaces_0.html | 0 ver-5.1.0/search/namespaces_0.js | 6 + .../search}/namespaces_1.html | 0 ver-5.1.0/search/namespaces_1.js | 4 + .../search}/namespaces_2.html | 0 ver-5.1.0/search/namespaces_2.js | 5 + .../search}/namespaces_3.html | 0 ver-5.1.0/search/namespaces_3.js | 20 + .../search}/namespaces_4.html | 0 ver-5.1.0/search/namespaces_4.js | 5 + .../search}/namespaces_5.html | 0 ver-5.1.0/search/namespaces_5.js | 4 + .../search}/namespaces_6.html | 0 ver-5.1.0/search/namespaces_6.js | 4 + {search => ver-5.1.0/search}/nomatches.html | 0 {search => ver-5.1.0/search}/pages_0.html | 0 ver-5.1.0/search/pages_0.js | 4 + ver-5.1.0/search/search.css | 257 ++ ver-5.1.0/search/search.js | 816 +++++ {search => ver-5.1.0/search}/search_l.png | Bin {search => ver-5.1.0/search}/search_m.png | Bin {search => ver-5.1.0/search}/search_r.png | Bin ver-5.1.0/search/searchdata.js | 33 + {search => ver-5.1.0/search}/variables_0.html | 0 ver-5.1.0/search/variables_0.js | 4 + {search => ver-5.1.0/search}/variables_1.html | 0 ver-5.1.0/search/variables_1.js | 7 + .../search}/variables_10.html | 0 ver-5.1.0/search/variables_10.js | 8 + .../search}/variables_11.html | 0 ver-5.1.0/search/variables_11.js | 4 + .../search}/variables_12.html | 0 ver-5.1.0/search/variables_12.js | 4 + {search => ver-5.1.0/search}/variables_2.html | 0 ver-5.1.0/search/variables_2.js | 7 + {search => ver-5.1.0/search}/variables_3.html | 0 ver-5.1.0/search/variables_3.js | 13 + {search => ver-5.1.0/search}/variables_4.html | 0 ver-5.1.0/search/variables_4.js | 9 + {search => ver-5.1.0/search}/variables_5.html | 0 ver-5.1.0/search/variables_5.js | 10 + {search => ver-5.1.0/search}/variables_6.html | 0 ver-5.1.0/search/variables_6.js | 5 + {search => ver-5.1.0/search}/variables_7.html | 0 ver-5.1.0/search/variables_7.js | 6 + {search => ver-5.1.0/search}/variables_8.html | 0 ver-5.1.0/search/variables_8.js | 10 + {search => ver-5.1.0/search}/variables_9.html | 0 ver-5.1.0/search/variables_9.js | 5 + {search => ver-5.1.0/search}/variables_a.html | 0 ver-5.1.0/search/variables_a.js | 5 + {search => ver-5.1.0/search}/variables_b.html | 0 ver-5.1.0/search/variables_b.js | 5 + {search => ver-5.1.0/search}/variables_c.html | 0 ver-5.1.0/search/variables_c.js | 9 + {search => ver-5.1.0/search}/variables_d.html | 0 ver-5.1.0/search/variables_d.js | 4 + {search => ver-5.1.0/search}/variables_e.html | 0 ver-5.1.0/search/variables_e.js | 8 + {search => ver-5.1.0/search}/variables_f.html | 0 ver-5.1.0/search/variables_f.js | 18 + ver-5.1.0/sp__mod_8F_source.html | 162 + ver-5.1.0/spanaly_8f.html | 267 ++ ver-5.1.0/spanaly_8f.js | 4 + ver-5.1.0/spanaly_8f_source.html | 176 + ver-5.1.0/spdz2uv_8f.html | 247 ++ ver-5.1.0/spdz2uv_8f.js | 4 + ver-5.1.0/spdz2uv_8f_source.html | 182 ++ ver-5.1.0/spectral__interp__mod_8F90.html | 151 + ver-5.1.0/spectral__interp__mod_8F90.js | 12 + .../spectral__interp__mod_8F90_source.html | 1164 +++++++ ver-5.1.0/speps_8f.html | 211 ++ ver-5.1.0/speps_8f.js | 4 + ver-5.1.0/speps_8f_source.html | 153 + ver-5.1.0/spfft1_8f.html | 206 ++ ver-5.1.0/spfft1_8f.js | 4 + ver-5.1.0/spfft1_8f_source.html | 164 + ver-5.1.0/spfft_8f.html | 207 ++ ver-5.1.0/spfft_8f.js | 4 + ver-5.1.0/spfft_8f_source.html | 180 + ver-5.1.0/spffte_8f.html | 227 ++ ver-5.1.0/spffte_8f.js | 4 + ver-5.1.0/spffte_8f_source.html | 240 ++ ver-5.1.0/spfftpt_8f.html | 206 ++ ver-5.1.0/spfftpt_8f.js | 4 + ver-5.1.0/spfftpt_8f_source.html | 148 + ver-5.1.0/spgradq_8f.html | 221 ++ ver-5.1.0/spgradq_8f.js | 4 + ver-5.1.0/spgradq_8f_source.html | 166 + ver-5.1.0/spgradx_8f.html | 202 ++ ver-5.1.0/spgradx_8f.js | 4 + ver-5.1.0/spgradx_8f_source.html | 172 + ver-5.1.0/spgrady_8f.html | 209 ++ ver-5.1.0/spgrady_8f.js | 4 + ver-5.1.0/spgrady_8f_source.html | 159 + ver-5.1.0/splaplac_8f.html | 197 ++ ver-5.1.0/splaplac_8f.js | 4 + ver-5.1.0/splaplac_8f_source.html | 149 + ver-5.1.0/splat_8F.html | 212 ++ ver-5.1.0/splat_8F.js | 4 + ver-5.1.0/splat_8F_source.html | 304 ++ ver-5.1.0/splegend_8f.html | 217 ++ ver-5.1.0/splegend_8f.js | 4 + ver-5.1.0/splegend_8f_source.html | 238 ++ ver-5.1.0/splitbar.png | Bin 0 -> 314 bytes ver-5.1.0/sppad_8f.html | 189 ++ ver-5.1.0/sppad_8f.js | 4 + ver-5.1.0/sppad_8f_source.html | 136 + ver-5.1.0/spsynth_8f.html | 258 ++ ver-5.1.0/spsynth_8f.js | 4 + ver-5.1.0/spsynth_8f_source.html | 259 ++ ver-5.1.0/sptez_8f.html | 234 ++ ver-5.1.0/sptez_8f.js | 4 + ver-5.1.0/sptez_8f_source.html | 173 + ver-5.1.0/sptezd_8f.html | 248 ++ ver-5.1.0/sptezd_8f.js | 4 + ver-5.1.0/sptezd_8f_source.html | 162 + ver-5.1.0/sptezm_8f.html | 241 ++ ver-5.1.0/sptezm_8f.js | 4 + ver-5.1.0/sptezm_8f_source.html | 172 + ver-5.1.0/sptezmd_8f.html | 255 ++ ver-5.1.0/sptezmd_8f.js | 4 + ver-5.1.0/sptezmd_8f_source.html | 165 + ver-5.1.0/sptezmv_8f.html | 255 ++ ver-5.1.0/sptezmv_8f.js | 4 + ver-5.1.0/sptezmv_8f_source.html | 180 + ver-5.1.0/sptezv_8f.html | 248 ++ ver-5.1.0/sptezv_8f.js | 4 + ver-5.1.0/sptezv_8f_source.html | 178 + ver-5.1.0/sptgpm_8f.html | 267 ++ ver-5.1.0/sptgpm_8f.js | 4 + ver-5.1.0/sptgpm_8f_source.html | 226 ++ ver-5.1.0/sptgpmd_8f.html | 265 ++ ver-5.1.0/sptgpmd_8f.js | 4 + ver-5.1.0/sptgpmd_8f_source.html | 184 ++ ver-5.1.0/sptgpmv_8f.html | 285 ++ ver-5.1.0/sptgpmv_8f.js | 4 + ver-5.1.0/sptgpmv_8f_source.html | 246 ++ ver-5.1.0/sptgps_8f.html | 281 ++ ver-5.1.0/sptgps_8f.js | 4 + ver-5.1.0/sptgps_8f_source.html | 650 ++++ ver-5.1.0/sptgpsd_8f.html | 282 ++ ver-5.1.0/sptgpsd_8f.js | 4 + ver-5.1.0/sptgpsd_8f_source.html | 203 ++ ver-5.1.0/sptgpsv_8f.html | 299 ++ ver-5.1.0/sptgpsv_8f.js | 4 + ver-5.1.0/sptgpsv_8f_source.html | 1038 ++++++ ver-5.1.0/sptgpt_8f.html | 252 ++ ver-5.1.0/sptgpt_8f.js | 4 + ver-5.1.0/sptgpt_8f_source.html | 208 ++ ver-5.1.0/sptgptd_8f.html | 255 ++ ver-5.1.0/sptgptd_8f.js | 4 + ver-5.1.0/sptgptd_8f_source.html | 180 + ver-5.1.0/sptgptsd_8f.html | 266 ++ ver-5.1.0/sptgptsd_8f.js | 4 + ver-5.1.0/sptgptsd_8f_source.html | 236 ++ ver-5.1.0/sptgptv_8f.html | 268 ++ ver-5.1.0/sptgptv_8f.js | 4 + ver-5.1.0/sptgptv_8f_source.html | 227 ++ ver-5.1.0/sptgptvd_8f.html | 313 ++ ver-5.1.0/sptgptvd_8f.js | 4 + ver-5.1.0/sptgptvd_8f_source.html | 266 ++ ver-5.1.0/sptran_8f.html | 323 ++ ver-5.1.0/sptran_8f.js | 4 + ver-5.1.0/sptran_8f_source.html | 224 ++ ver-5.1.0/sptrand_8f.html | 346 ++ ver-5.1.0/sptrand_8f.js | 4 + ver-5.1.0/sptrand_8f_source.html | 253 ++ ver-5.1.0/sptranf0_8f.html | 290 ++ ver-5.1.0/sptranf0_8f.js | 4 + ver-5.1.0/sptranf0_8f_source.html | 170 + ver-5.1.0/sptranf1_8f.html | 325 ++ ver-5.1.0/sptranf1_8f.js | 4 + ver-5.1.0/sptranf1_8f_source.html | 179 + ver-5.1.0/sptranf_8f.html | 324 ++ ver-5.1.0/sptranf_8f.js | 4 + ver-5.1.0/sptranf_8f_source.html | 263 ++ ver-5.1.0/sptranfv_8f.html | 347 ++ ver-5.1.0/sptranfv_8f.js | 4 + ver-5.1.0/sptranfv_8f_source.html | 300 ++ ver-5.1.0/sptranv_8f.html | 349 ++ ver-5.1.0/sptranv_8f.js | 4 + ver-5.1.0/sptranv_8f_source.html | 228 ++ ver-5.1.0/sptrun_8f.html | 317 ++ ver-5.1.0/sptrun_8f.js | 4 + ver-5.1.0/sptrun_8f_source.html | 187 ++ ver-5.1.0/sptrund_8f.html | 318 ++ ver-5.1.0/sptrund_8f.js | 4 + ver-5.1.0/sptrund_8f_source.html | 208 ++ ver-5.1.0/sptrung_8f.html | 306 ++ ver-5.1.0/sptrung_8f.js | 4 + ver-5.1.0/sptrung_8f_source.html | 193 ++ ver-5.1.0/sptrungv_8f.html | 376 +++ ver-5.1.0/sptrungv_8f.js | 4 + ver-5.1.0/sptrungv_8f_source.html | 247 ++ ver-5.1.0/sptrunl_8f.html | 316 ++ ver-5.1.0/sptrunl_8f.js | 4 + ver-5.1.0/sptrunl_8f_source.html | 219 ++ ver-5.1.0/sptrunm_8f.html | 327 ++ ver-5.1.0/sptrunm_8f.js | 4 + ver-5.1.0/sptrunm_8f_source.html | 204 ++ ver-5.1.0/sptrunmv_8f.html | 394 +++ ver-5.1.0/sptrunmv_8f.js | 4 + ver-5.1.0/sptrunmv_8f_source.html | 258 ++ ver-5.1.0/sptruns_8f.html | 321 ++ ver-5.1.0/sptruns_8f.js | 4 + ver-5.1.0/sptruns_8f_source.html | 199 ++ ver-5.1.0/sptrunsv_8f.html | 426 +++ ver-5.1.0/sptrunsv_8f.js | 4 + ver-5.1.0/sptrunsv_8f_source.html | 255 ++ ver-5.1.0/sptrunv_8f.html | 375 +++ ver-5.1.0/sptrunv_8f.js | 4 + ver-5.1.0/sptrunv_8f_source.html | 267 ++ ver-5.1.0/spuv2dz_8f.html | 244 ++ ver-5.1.0/spuv2dz_8f.js | 4 + ver-5.1.0/spuv2dz_8f_source.html | 191 ++ ver-5.1.0/spvar_8f.html | 175 + ver-5.1.0/spvar_8f.js | 4 + ver-5.1.0/spvar_8f_source.html | 135 + ver-5.1.0/spwget_8f.html | 208 ++ ver-5.1.0/spwget_8f.js | 4 + ver-5.1.0/spwget_8f_source.html | 127 + ..._grid__mod_1_1ip__equid__cylind__grid.html | 843 +++++ ...d__grid__mod_1_1ip__equid__cylind__grid.js | 27 + ...__grid__mod_1_1ip__equid__cylind__grid.png | Bin 0 -> 804 bytes ...sian__grid__mod_1_1ip__gaussian__grid.html | 873 +++++ ...ussian__grid__mod_1_1ip__gaussian__grid.js | 28 + ...ssian__grid__mod_1_1ip__gaussian__grid.png | Bin 0 -> 684 bytes ..._descriptor__mod_1_1grib1__descriptor.html | 249 ++ ...d__descriptor__mod_1_1grib1__descriptor.js | 7 + ...__descriptor__mod_1_1grib1__descriptor.png | Bin 0 -> 774 bytes ..._descriptor__mod_1_1grib2__descriptor.html | 307 ++ ...d__descriptor__mod_1_1grib2__descriptor.js | 9 + ...__descriptor__mod_1_1grib2__descriptor.png | Bin 0 -> 780 bytes ...scriptor__mod_1_1ip__grid__descriptor.html | 191 ++ ...descriptor__mod_1_1ip__grid__descriptor.js | 5 + ...escriptor__mod_1_1ip__grid__descriptor.png | Bin 0 -> 1069 bytes .../structip__grid__mod_1_1ip__grid.html | 655 ++++ ver-5.1.0/structip__grid__mod_1_1ip__grid.js | 20 + ver-5.1.0/structip__grid__mod_1_1ip__grid.png | Bin 0 -> 5524 bytes ..._grid__mod_1_1ip__lambert__conf__grid.html | 903 +++++ ...f__grid__mod_1_1ip__lambert__conf__grid.js | 29 + ...__grid__mod_1_1ip__lambert__conf__grid.png | Bin 0 -> 825 bytes ...ator__grid__mod_1_1ip__mercator__grid.html | 845 +++++ ...rcator__grid__mod_1_1ip__mercator__grid.js | 27 + ...cator__grid__mod_1_1ip__mercator__grid.png | Bin 0 -> 689 bytes ..._grid__mod_1_1ip__polar__stereo__grid.html | 896 +++++ ...o__grid__mod_1_1ip__polar__stereo__grid.js | 29 + ...__grid__mod_1_1ip__polar__stereo__grid.png | Bin 0 -> 819 bytes ..._mod_1_1ip__rot__equid__cylind__egrid.html | 895 +++++ ...d__mod_1_1ip__rot__equid__cylind__egrid.js | 29 + ...__mod_1_1ip__rot__equid__cylind__egrid.png | Bin 0 -> 863 bytes ...__mod_1_1ip__rot__equid__cylind__grid.html | 866 +++++ ...id__mod_1_1ip__rot__equid__cylind__grid.js | 28 + ...d__mod_1_1ip__rot__equid__cylind__grid.png | Bin 0 -> 854 bytes ...rid__mod_1_1ip__station__points__grid.html | 633 ++++ ..._grid__mod_1_1ip__station__points__grid.js | 20 + ...grid__mod_1_1ip__station__points__grid.png | Bin 0 -> 825 bytes ver-5.1.0/sync_off.png | Bin 0 -> 853 bytes ver-5.1.0/sync_on.png | Bin 0 -> 845 bytes ver-5.1.0/tab_a.png | Bin 0 -> 142 bytes ver-5.1.0/tab_b.png | Bin 0 -> 169 bytes ver-5.1.0/tab_h.png | Bin 0 -> 177 bytes ver-5.1.0/tab_s.png | Bin 0 -> 184 bytes ver-5.1.0/tabs.css | 1 + 1102 files changed, 134399 insertions(+), 34041 deletions(-) create mode 100644 bc_sd.png create mode 100644 dir_68267d1309a1af8e8297ef4c3efbcdba.js create mode 100644 doc.svg create mode 100644 docd.svg create mode 100644 docs(7).zip create mode 100644 folderclosed.svg create mode 100644 folderclosedd.svg create mode 100644 folderopen.svg create mode 100644 folderopend.svg create mode 100644 index.js create mode 100644 minus.svg create mode 100644 minusd.svg create mode 100644 nav_fd.png create mode 100644 nav_hd.png create mode 100644 navtreeindex4.js create mode 100644 navtreeindex5.js create mode 100644 plus.svg create mode 100644 plusd.svg create mode 100644 search/all_15.js create mode 100644 search/all_16.js create mode 100644 search/mag.svg create mode 100644 search/mag_d.svg create mode 100644 search/mag_seld.svg create mode 100644 splitbard.png create mode 100644 tab_ad.png create mode 100644 tab_bd.png create mode 100644 tab_hd.png create mode 100644 tab_sd.png create mode 100644 ver-5.1.0/annotated.html create mode 100644 ver-5.1.0/annotated_dup.js create mode 100644 ver-5.1.0/bc_s.png rename bdwn.png => ver-5.1.0/bdwn.png (100%) create mode 100644 ver-5.1.0/bicubic__interp__mod_8F90.html create mode 100644 ver-5.1.0/bicubic__interp__mod_8F90.js create mode 100644 ver-5.1.0/bicubic__interp__mod_8F90_source.html create mode 100644 ver-5.1.0/bilinear__interp__mod_8F90.html create mode 100644 ver-5.1.0/bilinear__interp__mod_8F90.js create mode 100644 ver-5.1.0/bilinear__interp__mod_8F90_source.html create mode 100644 ver-5.1.0/budget__interp__mod_8F90.html create mode 100644 ver-5.1.0/budget__interp__mod_8F90.js create mode 100644 ver-5.1.0/budget__interp__mod_8F90_source.html create mode 100644 ver-5.1.0/classes.html create mode 100644 ver-5.1.0/closed.png create mode 100644 ver-5.1.0/dir_49e56c817e5e54854c35e136979f97ca.html create mode 100644 ver-5.1.0/dir_68267d1309a1af8e8297ef4c3efbcdba.html rename doc.png => ver-5.1.0/doc.png (100%) create mode 100644 ver-5.1.0/doxygen.css create mode 100644 ver-5.1.0/doxygen.svg create mode 100644 ver-5.1.0/dynsections.js create mode 100644 ver-5.1.0/earth__radius__mod_8F90.html create mode 100644 ver-5.1.0/earth__radius__mod_8F90.js create mode 100644 ver-5.1.0/earth__radius__mod_8F90_source.html create mode 100644 ver-5.1.0/fftpack_8F.html create mode 100644 ver-5.1.0/fftpack_8F.js create mode 100644 ver-5.1.0/fftpack_8F_source.html create mode 100644 ver-5.1.0/files.html create mode 100644 ver-5.1.0/files_dup.js rename folderclosed.png => ver-5.1.0/folderclosed.png (100%) rename folderopen.png => ver-5.1.0/folderopen.png (100%) create mode 100644 ver-5.1.0/functions.html create mode 100644 ver-5.1.0/functions_func.html create mode 100644 ver-5.1.0/functions_vars.html create mode 100644 ver-5.1.0/gdswzd__c_8F90.html create mode 100644 ver-5.1.0/gdswzd__c_8F90.js create mode 100644 ver-5.1.0/gdswzd__c_8F90_source.html create mode 100644 ver-5.1.0/gdswzd__mod_8F90.html create mode 100644 ver-5.1.0/gdswzd__mod_8F90.js create mode 100644 ver-5.1.0/gdswzd__mod_8F90_source.html create mode 100644 ver-5.1.0/globals.html create mode 100644 ver-5.1.0/globals_func.html create mode 100644 ver-5.1.0/hierarchy.html create mode 100644 ver-5.1.0/hierarchy.js create mode 100644 ver-5.1.0/index.html create mode 100644 ver-5.1.0/interfacebicubic__interp__mod_1_1interpolate__bicubic.html create mode 100644 ver-5.1.0/interfacebicubic__interp__mod_1_1interpolate__bicubic.js create mode 100644 ver-5.1.0/interfacebilinear__interp__mod_1_1interpolate__bilinear.html create mode 100644 ver-5.1.0/interfacebilinear__interp__mod_1_1interpolate__bilinear.js create mode 100644 ver-5.1.0/interfacebudget__interp__mod_1_1interpolate__budget.html create mode 100644 ver-5.1.0/interfacebudget__interp__mod_1_1interpolate__budget.js create mode 100644 ver-5.1.0/interfacegdswzd__mod_1_1gdswzd.html create mode 100644 ver-5.1.0/interfacegdswzd__mod_1_1gdswzd.js create mode 100644 ver-5.1.0/interfaceip__grid__descriptor__mod_1_1init__descriptor.html create mode 100644 ver-5.1.0/interfaceip__grid__descriptor__mod_1_1init__descriptor.js create mode 100644 ver-5.1.0/interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08.html create mode 100644 ver-5.1.0/interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08.js create mode 100644 ver-5.1.0/interfaceip__grid__factory__mod_1_1init__grid.html create mode 100644 ver-5.1.0/interfaceip__grid__factory__mod_1_1init__grid.js create mode 100644 ver-5.1.0/interfaceip__grid__mod_1_1gdswzd__interface.html create mode 100644 ver-5.1.0/interfaceip__grid__mod_1_1gdswzd__interface.js create mode 100644 ver-5.1.0/interfaceip__grid__mod_1_1init__grib1__interface.html create mode 100644 ver-5.1.0/interfaceip__grid__mod_1_1init__grib1__interface.js create mode 100644 ver-5.1.0/interfaceip__grid__mod_1_1init__grib2__interface.html create mode 100644 ver-5.1.0/interfaceip__grid__mod_1_1init__grib2__interface.js create mode 100644 ver-5.1.0/interfaceip__grid__mod_1_1operator_07_0a_0a_08.html create mode 100644 ver-5.1.0/interfaceip__grid__mod_1_1operator_07_0a_0a_08.js create mode 100644 ver-5.1.0/interfaceipolates__mod_1_1ipolates.html create mode 100644 ver-5.1.0/interfaceipolates__mod_1_1ipolates.js create mode 100644 ver-5.1.0/interfaceipolatev__mod_1_1ipolatev.html create mode 100644 ver-5.1.0/interfaceipolatev__mod_1_1ipolatev.js create mode 100644 ver-5.1.0/interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget.html create mode 100644 ver-5.1.0/interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget.js create mode 100644 ver-5.1.0/interfaceneighbor__interp__mod_1_1interpolate__neighbor.html create mode 100644 ver-5.1.0/interfaceneighbor__interp__mod_1_1interpolate__neighbor.js create mode 100644 ver-5.1.0/interfacespectral__interp__mod_1_1interpolate__spectral.html create mode 100644 ver-5.1.0/interfacespectral__interp__mod_1_1interpolate__spectral.js create mode 100644 ver-5.1.0/interfacespectral__interp__mod_1_1polates4.html create mode 100644 ver-5.1.0/interfacespectral__interp__mod_1_1polates4.js create mode 100644 ver-5.1.0/interfacespectral__interp__mod_1_1polatev4.html create mode 100644 ver-5.1.0/interfacespectral__interp__mod_1_1polatev4.js create mode 100644 ver-5.1.0/ip__constants__mod_8F90.html create mode 100644 ver-5.1.0/ip__constants__mod_8F90.js create mode 100644 ver-5.1.0/ip__constants__mod_8F90_source.html create mode 100644 ver-5.1.0/ip__equid__cylind__grid__mod_8F90.html create mode 100644 ver-5.1.0/ip__equid__cylind__grid__mod_8F90.js create mode 100644 ver-5.1.0/ip__equid__cylind__grid__mod_8F90_source.html create mode 100644 ver-5.1.0/ip__gaussian__grid__mod_8F90.html create mode 100644 ver-5.1.0/ip__gaussian__grid__mod_8F90.js create mode 100644 ver-5.1.0/ip__gaussian__grid__mod_8F90_source.html create mode 100644 ver-5.1.0/ip__grid__descriptor__mod_8F90.html create mode 100644 ver-5.1.0/ip__grid__descriptor__mod_8F90.js create mode 100644 ver-5.1.0/ip__grid__descriptor__mod_8F90_source.html create mode 100644 ver-5.1.0/ip__grid__factory__mod_8F90.html create mode 100644 ver-5.1.0/ip__grid__factory__mod_8F90.js create mode 100644 ver-5.1.0/ip__grid__factory__mod_8F90_source.html create mode 100644 ver-5.1.0/ip__grid__mod_8F90.html create mode 100644 ver-5.1.0/ip__grid__mod_8F90.js create mode 100644 ver-5.1.0/ip__grid__mod_8F90_source.html create mode 100644 ver-5.1.0/ip__grids__mod_8F90.html create mode 100644 ver-5.1.0/ip__grids__mod_8F90_source.html create mode 100644 ver-5.1.0/ip__interpolators__mod_8F90.html create mode 100644 ver-5.1.0/ip__interpolators__mod_8F90.js create mode 100644 ver-5.1.0/ip__interpolators__mod_8F90_source.html create mode 100644 ver-5.1.0/ip__lambert__conf__grid__mod_8F90.html create mode 100644 ver-5.1.0/ip__lambert__conf__grid__mod_8F90.js create mode 100644 ver-5.1.0/ip__lambert__conf__grid__mod_8F90_source.html create mode 100644 ver-5.1.0/ip__mercator__grid__mod_8F90.html create mode 100644 ver-5.1.0/ip__mercator__grid__mod_8F90.js create mode 100644 ver-5.1.0/ip__mercator__grid__mod_8F90_source.html create mode 100644 ver-5.1.0/ip__mod_8F90.html create mode 100644 ver-5.1.0/ip__mod_8F90_source.html create mode 100644 ver-5.1.0/ip__polar__stereo__grid__mod_8F90.html create mode 100644 ver-5.1.0/ip__polar__stereo__grid__mod_8F90.js create mode 100644 ver-5.1.0/ip__polar__stereo__grid__mod_8F90_source.html create mode 100644 ver-5.1.0/ip__rot__equid__cylind__egrid__mod_8F90.html create mode 100644 ver-5.1.0/ip__rot__equid__cylind__egrid__mod_8F90.js create mode 100644 ver-5.1.0/ip__rot__equid__cylind__egrid__mod_8F90_source.html create mode 100644 ver-5.1.0/ip__rot__equid__cylind__grid__mod_8F90.html create mode 100644 ver-5.1.0/ip__rot__equid__cylind__grid__mod_8F90.js create mode 100644 ver-5.1.0/ip__rot__equid__cylind__grid__mod_8F90_source.html create mode 100644 ver-5.1.0/ip__station__points__grid__mod_8F90.html create mode 100644 ver-5.1.0/ip__station__points__grid__mod_8F90.js create mode 100644 ver-5.1.0/ip__station__points__grid__mod_8F90_source.html create mode 100644 ver-5.1.0/iplib__4_8h.html create mode 100644 ver-5.1.0/iplib__4_8h.js create mode 100644 ver-5.1.0/iplib__4_8h_source.html create mode 100644 ver-5.1.0/iplib__8_8h.html create mode 100644 ver-5.1.0/iplib__8_8h.js create mode 100644 ver-5.1.0/iplib__8_8h_source.html create mode 100644 ver-5.1.0/iplib__d_8h.html create mode 100644 ver-5.1.0/iplib__d_8h.js create mode 100644 ver-5.1.0/iplib__d_8h_source.html create mode 100644 ver-5.1.0/ipolates_8F90.html create mode 100644 ver-5.1.0/ipolates_8F90.js create mode 100644 ver-5.1.0/ipolates_8F90_source.html create mode 100644 ver-5.1.0/ipolatev_8F90.html create mode 100644 ver-5.1.0/ipolatev_8F90.js create mode 100644 ver-5.1.0/ipolatev_8F90_source.html create mode 100644 ver-5.1.0/ipxetas_8F90.html create mode 100644 ver-5.1.0/ipxetas_8F90.js create mode 100644 ver-5.1.0/ipxetas_8F90_source.html create mode 100644 ver-5.1.0/ipxwafs2_8F90.html create mode 100644 ver-5.1.0/ipxwafs2_8F90.js create mode 100644 ver-5.1.0/ipxwafs2_8F90_source.html create mode 100644 ver-5.1.0/ipxwafs3_8F90.html create mode 100644 ver-5.1.0/ipxwafs3_8F90.js create mode 100644 ver-5.1.0/ipxwafs3_8F90_source.html create mode 100644 ver-5.1.0/ipxwafs_8F90.html create mode 100644 ver-5.1.0/ipxwafs_8F90.js create mode 100644 ver-5.1.0/ipxwafs_8F90_source.html create mode 100644 ver-5.1.0/jquery.js create mode 100644 ver-5.1.0/menu.js create mode 100644 ver-5.1.0/menudata.js create mode 100644 ver-5.1.0/movect_8F90.html create mode 100644 ver-5.1.0/movect_8F90.js create mode 100644 ver-5.1.0/movect_8F90_source.html create mode 100644 ver-5.1.0/namespacebicubic__interp__mod.html create mode 100644 ver-5.1.0/namespacebicubic__interp__mod.js create mode 100644 ver-5.1.0/namespacebilinear__interp__mod.html create mode 100644 ver-5.1.0/namespacebilinear__interp__mod.js create mode 100644 ver-5.1.0/namespacebudget__interp__mod.html create mode 100644 ver-5.1.0/namespacebudget__interp__mod.js create mode 100644 ver-5.1.0/namespaceearth__radius__mod.html create mode 100644 ver-5.1.0/namespacegdswzd__c__mod.html create mode 100644 ver-5.1.0/namespacegdswzd__mod.html create mode 100644 ver-5.1.0/namespacegdswzd__mod.js create mode 100644 ver-5.1.0/namespaceip__constants__mod.html create mode 100644 ver-5.1.0/namespaceip__equid__cylind__grid__mod.html create mode 100644 ver-5.1.0/namespaceip__equid__cylind__grid__mod.js create mode 100644 ver-5.1.0/namespaceip__gaussian__grid__mod.html create mode 100644 ver-5.1.0/namespaceip__gaussian__grid__mod.js create mode 100644 ver-5.1.0/namespaceip__grid__descriptor__mod.html create mode 100644 ver-5.1.0/namespaceip__grid__descriptor__mod.js create mode 100644 ver-5.1.0/namespaceip__grid__factory__mod.html create mode 100644 ver-5.1.0/namespaceip__grid__factory__mod.js create mode 100644 ver-5.1.0/namespaceip__grid__mod.html create mode 100644 ver-5.1.0/namespaceip__grid__mod.js create mode 100644 ver-5.1.0/namespaceip__grids__mod.html create mode 100644 ver-5.1.0/namespaceip__interpolators__mod.html create mode 100644 ver-5.1.0/namespaceip__lambert__conf__grid__mod.html create mode 100644 ver-5.1.0/namespaceip__lambert__conf__grid__mod.js create mode 100644 ver-5.1.0/namespaceip__mercator__grid__mod.html create mode 100644 ver-5.1.0/namespaceip__mercator__grid__mod.js create mode 100644 ver-5.1.0/namespaceip__mod.html create mode 100644 ver-5.1.0/namespaceip__polar__stereo__grid__mod.html create mode 100644 ver-5.1.0/namespaceip__polar__stereo__grid__mod.js create mode 100644 ver-5.1.0/namespaceip__rot__equid__cylind__egrid__mod.html create mode 100644 ver-5.1.0/namespaceip__rot__equid__cylind__egrid__mod.js create mode 100644 ver-5.1.0/namespaceip__rot__equid__cylind__grid__mod.html create mode 100644 ver-5.1.0/namespaceip__rot__equid__cylind__grid__mod.js create mode 100644 ver-5.1.0/namespaceip__station__points__grid__mod.html create mode 100644 ver-5.1.0/namespaceip__station__points__grid__mod.js create mode 100644 ver-5.1.0/namespaceipolates__mod.html create mode 100644 ver-5.1.0/namespaceipolates__mod.js create mode 100644 ver-5.1.0/namespaceipolatev__mod.html create mode 100644 ver-5.1.0/namespaceipolatev__mod.js create mode 100644 ver-5.1.0/namespacemembers.html create mode 100644 ver-5.1.0/namespacemembers_func.html create mode 100644 ver-5.1.0/namespacemembers_vars.html create mode 100644 ver-5.1.0/namespaceneighbor__budget__interp__mod.html create mode 100644 ver-5.1.0/namespaceneighbor__budget__interp__mod.js create mode 100644 ver-5.1.0/namespaceneighbor__interp__mod.html create mode 100644 ver-5.1.0/namespaceneighbor__interp__mod.js create mode 100644 ver-5.1.0/namespacepolfix__mod.html create mode 100644 ver-5.1.0/namespaces.html create mode 100644 ver-5.1.0/namespaces_dup.js create mode 100644 ver-5.1.0/namespacespectral__interp__mod.html create mode 100644 ver-5.1.0/namespacespectral__interp__mod.js create mode 100644 ver-5.1.0/nav_f.png create mode 100644 ver-5.1.0/nav_g.png create mode 100644 ver-5.1.0/nav_h.png create mode 100644 ver-5.1.0/navtree.css create mode 100644 ver-5.1.0/navtree.js create mode 100644 ver-5.1.0/navtreedata.js create mode 100644 ver-5.1.0/navtreeindex0.js create mode 100644 ver-5.1.0/navtreeindex1.js create mode 100644 ver-5.1.0/navtreeindex2.js create mode 100644 ver-5.1.0/navtreeindex3.js create mode 100644 ver-5.1.0/ncpus_8F.html create mode 100644 ver-5.1.0/ncpus_8F.js create mode 100644 ver-5.1.0/ncpus_8F_source.html create mode 100644 ver-5.1.0/neighbor__budget__interp__mod_8F90.html create mode 100644 ver-5.1.0/neighbor__budget__interp__mod_8F90.js create mode 100644 ver-5.1.0/neighbor__budget__interp__mod_8F90_source.html create mode 100644 ver-5.1.0/neighbor__interp__mod_8F90.html create mode 100644 ver-5.1.0/neighbor__interp__mod_8F90.js create mode 100644 ver-5.1.0/neighbor__interp__mod_8F90_source.html create mode 100644 ver-5.1.0/open.png create mode 100644 ver-5.1.0/polfix__mod_8F90.html create mode 100644 ver-5.1.0/polfix__mod_8F90.js create mode 100644 ver-5.1.0/polfix__mod_8F90_source.html create mode 100644 ver-5.1.0/resize.js rename {search => ver-5.1.0/search}/all_0.html (100%) create mode 100644 ver-5.1.0/search/all_0.js rename {search => ver-5.1.0/search}/all_1.html (100%) create mode 100644 ver-5.1.0/search/all_1.js rename {search => ver-5.1.0/search}/all_10.html (100%) create mode 100644 ver-5.1.0/search/all_10.js rename {search => ver-5.1.0/search}/all_11.html (100%) create mode 100644 ver-5.1.0/search/all_11.js rename {search => ver-5.1.0/search}/all_12.html (100%) create mode 100644 ver-5.1.0/search/all_12.js rename {search => ver-5.1.0/search}/all_13.html (100%) create mode 100644 ver-5.1.0/search/all_13.js rename {search => ver-5.1.0/search}/all_14.html (100%) create mode 100644 ver-5.1.0/search/all_14.js rename {search => ver-5.1.0/search}/all_2.html (100%) create mode 100644 ver-5.1.0/search/all_2.js rename {search => ver-5.1.0/search}/all_3.html (100%) create mode 100644 ver-5.1.0/search/all_3.js rename {search => ver-5.1.0/search}/all_4.html (100%) create mode 100644 ver-5.1.0/search/all_4.js rename {search => ver-5.1.0/search}/all_5.html (100%) create mode 100644 ver-5.1.0/search/all_5.js rename {search => ver-5.1.0/search}/all_6.html (100%) create mode 100644 ver-5.1.0/search/all_6.js rename {search => ver-5.1.0/search}/all_7.html (100%) create mode 100644 ver-5.1.0/search/all_7.js rename {search => ver-5.1.0/search}/all_8.html (100%) create mode 100644 ver-5.1.0/search/all_8.js rename {search => ver-5.1.0/search}/all_9.html (100%) create mode 100644 ver-5.1.0/search/all_9.js rename {search => ver-5.1.0/search}/all_a.html (100%) create mode 100644 ver-5.1.0/search/all_a.js rename {search => ver-5.1.0/search}/all_b.html (100%) create mode 100644 ver-5.1.0/search/all_b.js rename {search => ver-5.1.0/search}/all_c.html (100%) create mode 100644 ver-5.1.0/search/all_c.js rename {search => ver-5.1.0/search}/all_d.html (100%) create mode 100644 ver-5.1.0/search/all_d.js rename {search => ver-5.1.0/search}/all_e.html (100%) create mode 100644 ver-5.1.0/search/all_e.js rename {search => ver-5.1.0/search}/all_f.html (100%) create mode 100644 ver-5.1.0/search/all_f.js rename {search => ver-5.1.0/search}/classes_0.html (100%) create mode 100644 ver-5.1.0/search/classes_0.js rename {search => ver-5.1.0/search}/classes_1.html (100%) create mode 100644 ver-5.1.0/search/classes_1.js rename {search => ver-5.1.0/search}/classes_2.html (100%) create mode 100644 ver-5.1.0/search/classes_2.js rename {search => ver-5.1.0/search}/classes_3.html (100%) create mode 100644 ver-5.1.0/search/classes_3.js create mode 100644 ver-5.1.0/search/close.svg rename {search => ver-5.1.0/search}/files_0.html (100%) create mode 100644 ver-5.1.0/search/files_0.js rename {search => ver-5.1.0/search}/files_1.html (100%) create mode 100644 ver-5.1.0/search/files_1.js rename {search => ver-5.1.0/search}/files_2.html (100%) create mode 100644 ver-5.1.0/search/files_2.js rename {search => ver-5.1.0/search}/files_3.html (100%) create mode 100644 ver-5.1.0/search/files_3.js rename {search => ver-5.1.0/search}/files_4.html (100%) create mode 100644 ver-5.1.0/search/files_4.js rename {search => ver-5.1.0/search}/files_5.html (100%) create mode 100644 ver-5.1.0/search/files_5.js rename {search => ver-5.1.0/search}/files_6.html (100%) create mode 100644 ver-5.1.0/search/files_6.js rename {search => ver-5.1.0/search}/files_7.html (100%) create mode 100644 ver-5.1.0/search/files_7.js rename {search => ver-5.1.0/search}/files_8.html (100%) create mode 100644 ver-5.1.0/search/files_8.js rename {search => ver-5.1.0/search}/functions_0.html (100%) create mode 100644 ver-5.1.0/search/functions_0.js rename {search => ver-5.1.0/search}/functions_1.html (100%) create mode 100644 ver-5.1.0/search/functions_1.js rename {search => ver-5.1.0/search}/functions_2.html (100%) create mode 100644 ver-5.1.0/search/functions_2.js rename {search => ver-5.1.0/search}/functions_3.html (100%) create mode 100644 ver-5.1.0/search/functions_3.js rename {search => ver-5.1.0/search}/functions_4.html (100%) create mode 100644 ver-5.1.0/search/functions_4.js rename {search => ver-5.1.0/search}/functions_5.html (100%) create mode 100644 ver-5.1.0/search/functions_5.js rename {search => ver-5.1.0/search}/functions_6.html (100%) create mode 100644 ver-5.1.0/search/functions_6.js rename {search => ver-5.1.0/search}/functions_7.html (100%) create mode 100644 ver-5.1.0/search/functions_7.js rename {search => ver-5.1.0/search}/functions_8.html (100%) create mode 100644 ver-5.1.0/search/functions_8.js rename {search => ver-5.1.0/search}/functions_9.html (100%) create mode 100644 ver-5.1.0/search/functions_9.js rename {search => ver-5.1.0/search}/functions_a.html (100%) create mode 100644 ver-5.1.0/search/functions_a.js rename {search => ver-5.1.0/search}/functions_b.html (100%) create mode 100644 ver-5.1.0/search/functions_b.js rename {search => ver-5.1.0/search}/functions_c.html (100%) create mode 100644 ver-5.1.0/search/functions_c.js create mode 100644 ver-5.1.0/search/mag_sel.svg rename {search => ver-5.1.0/search}/namespaces_0.html (100%) create mode 100644 ver-5.1.0/search/namespaces_0.js rename {search => ver-5.1.0/search}/namespaces_1.html (100%) create mode 100644 ver-5.1.0/search/namespaces_1.js rename {search => ver-5.1.0/search}/namespaces_2.html (100%) create mode 100644 ver-5.1.0/search/namespaces_2.js rename {search => ver-5.1.0/search}/namespaces_3.html (100%) create mode 100644 ver-5.1.0/search/namespaces_3.js rename {search => ver-5.1.0/search}/namespaces_4.html (100%) create mode 100644 ver-5.1.0/search/namespaces_4.js rename {search => ver-5.1.0/search}/namespaces_5.html (100%) create mode 100644 ver-5.1.0/search/namespaces_5.js rename {search => ver-5.1.0/search}/namespaces_6.html (100%) create mode 100644 ver-5.1.0/search/namespaces_6.js rename {search => ver-5.1.0/search}/nomatches.html (100%) rename {search => ver-5.1.0/search}/pages_0.html (100%) create mode 100644 ver-5.1.0/search/pages_0.js create mode 100644 ver-5.1.0/search/search.css create mode 100644 ver-5.1.0/search/search.js rename {search => ver-5.1.0/search}/search_l.png (100%) rename {search => ver-5.1.0/search}/search_m.png (100%) rename {search => ver-5.1.0/search}/search_r.png (100%) create mode 100644 ver-5.1.0/search/searchdata.js rename {search => ver-5.1.0/search}/variables_0.html (100%) create mode 100644 ver-5.1.0/search/variables_0.js rename {search => ver-5.1.0/search}/variables_1.html (100%) create mode 100644 ver-5.1.0/search/variables_1.js rename {search => ver-5.1.0/search}/variables_10.html (100%) create mode 100644 ver-5.1.0/search/variables_10.js rename {search => ver-5.1.0/search}/variables_11.html (100%) create mode 100644 ver-5.1.0/search/variables_11.js rename {search => ver-5.1.0/search}/variables_12.html (100%) create mode 100644 ver-5.1.0/search/variables_12.js rename {search => ver-5.1.0/search}/variables_2.html (100%) create mode 100644 ver-5.1.0/search/variables_2.js rename {search => ver-5.1.0/search}/variables_3.html (100%) create mode 100644 ver-5.1.0/search/variables_3.js rename {search => ver-5.1.0/search}/variables_4.html (100%) create mode 100644 ver-5.1.0/search/variables_4.js rename {search => ver-5.1.0/search}/variables_5.html (100%) create mode 100644 ver-5.1.0/search/variables_5.js rename {search => ver-5.1.0/search}/variables_6.html (100%) create mode 100644 ver-5.1.0/search/variables_6.js rename {search => ver-5.1.0/search}/variables_7.html (100%) create mode 100644 ver-5.1.0/search/variables_7.js rename {search => ver-5.1.0/search}/variables_8.html (100%) create mode 100644 ver-5.1.0/search/variables_8.js rename {search => ver-5.1.0/search}/variables_9.html (100%) create mode 100644 ver-5.1.0/search/variables_9.js rename {search => ver-5.1.0/search}/variables_a.html (100%) create mode 100644 ver-5.1.0/search/variables_a.js rename {search => ver-5.1.0/search}/variables_b.html (100%) create mode 100644 ver-5.1.0/search/variables_b.js rename {search => ver-5.1.0/search}/variables_c.html (100%) create mode 100644 ver-5.1.0/search/variables_c.js rename {search => ver-5.1.0/search}/variables_d.html (100%) create mode 100644 ver-5.1.0/search/variables_d.js rename {search => ver-5.1.0/search}/variables_e.html (100%) create mode 100644 ver-5.1.0/search/variables_e.js rename {search => ver-5.1.0/search}/variables_f.html (100%) create mode 100644 ver-5.1.0/search/variables_f.js create mode 100644 ver-5.1.0/sp__mod_8F_source.html create mode 100644 ver-5.1.0/spanaly_8f.html create mode 100644 ver-5.1.0/spanaly_8f.js create mode 100644 ver-5.1.0/spanaly_8f_source.html create mode 100644 ver-5.1.0/spdz2uv_8f.html create mode 100644 ver-5.1.0/spdz2uv_8f.js create mode 100644 ver-5.1.0/spdz2uv_8f_source.html create mode 100644 ver-5.1.0/spectral__interp__mod_8F90.html create mode 100644 ver-5.1.0/spectral__interp__mod_8F90.js create mode 100644 ver-5.1.0/spectral__interp__mod_8F90_source.html create mode 100644 ver-5.1.0/speps_8f.html create mode 100644 ver-5.1.0/speps_8f.js create mode 100644 ver-5.1.0/speps_8f_source.html create mode 100644 ver-5.1.0/spfft1_8f.html create mode 100644 ver-5.1.0/spfft1_8f.js create mode 100644 ver-5.1.0/spfft1_8f_source.html create mode 100644 ver-5.1.0/spfft_8f.html create mode 100644 ver-5.1.0/spfft_8f.js create mode 100644 ver-5.1.0/spfft_8f_source.html create mode 100644 ver-5.1.0/spffte_8f.html create mode 100644 ver-5.1.0/spffte_8f.js create mode 100644 ver-5.1.0/spffte_8f_source.html create mode 100644 ver-5.1.0/spfftpt_8f.html create mode 100644 ver-5.1.0/spfftpt_8f.js create mode 100644 ver-5.1.0/spfftpt_8f_source.html create mode 100644 ver-5.1.0/spgradq_8f.html create mode 100644 ver-5.1.0/spgradq_8f.js create mode 100644 ver-5.1.0/spgradq_8f_source.html create mode 100644 ver-5.1.0/spgradx_8f.html create mode 100644 ver-5.1.0/spgradx_8f.js create mode 100644 ver-5.1.0/spgradx_8f_source.html create mode 100644 ver-5.1.0/spgrady_8f.html create mode 100644 ver-5.1.0/spgrady_8f.js create mode 100644 ver-5.1.0/spgrady_8f_source.html create mode 100644 ver-5.1.0/splaplac_8f.html create mode 100644 ver-5.1.0/splaplac_8f.js create mode 100644 ver-5.1.0/splaplac_8f_source.html create mode 100644 ver-5.1.0/splat_8F.html create mode 100644 ver-5.1.0/splat_8F.js create mode 100644 ver-5.1.0/splat_8F_source.html create mode 100644 ver-5.1.0/splegend_8f.html create mode 100644 ver-5.1.0/splegend_8f.js create mode 100644 ver-5.1.0/splegend_8f_source.html create mode 100644 ver-5.1.0/splitbar.png create mode 100644 ver-5.1.0/sppad_8f.html create mode 100644 ver-5.1.0/sppad_8f.js create mode 100644 ver-5.1.0/sppad_8f_source.html create mode 100644 ver-5.1.0/spsynth_8f.html create mode 100644 ver-5.1.0/spsynth_8f.js create mode 100644 ver-5.1.0/spsynth_8f_source.html create mode 100644 ver-5.1.0/sptez_8f.html create mode 100644 ver-5.1.0/sptez_8f.js create mode 100644 ver-5.1.0/sptez_8f_source.html create mode 100644 ver-5.1.0/sptezd_8f.html create mode 100644 ver-5.1.0/sptezd_8f.js create mode 100644 ver-5.1.0/sptezd_8f_source.html create mode 100644 ver-5.1.0/sptezm_8f.html create mode 100644 ver-5.1.0/sptezm_8f.js create mode 100644 ver-5.1.0/sptezm_8f_source.html create mode 100644 ver-5.1.0/sptezmd_8f.html create mode 100644 ver-5.1.0/sptezmd_8f.js create mode 100644 ver-5.1.0/sptezmd_8f_source.html create mode 100644 ver-5.1.0/sptezmv_8f.html create mode 100644 ver-5.1.0/sptezmv_8f.js create mode 100644 ver-5.1.0/sptezmv_8f_source.html create mode 100644 ver-5.1.0/sptezv_8f.html create mode 100644 ver-5.1.0/sptezv_8f.js create mode 100644 ver-5.1.0/sptezv_8f_source.html create mode 100644 ver-5.1.0/sptgpm_8f.html create mode 100644 ver-5.1.0/sptgpm_8f.js create mode 100644 ver-5.1.0/sptgpm_8f_source.html create mode 100644 ver-5.1.0/sptgpmd_8f.html create mode 100644 ver-5.1.0/sptgpmd_8f.js create mode 100644 ver-5.1.0/sptgpmd_8f_source.html create mode 100644 ver-5.1.0/sptgpmv_8f.html create mode 100644 ver-5.1.0/sptgpmv_8f.js create mode 100644 ver-5.1.0/sptgpmv_8f_source.html create mode 100644 ver-5.1.0/sptgps_8f.html create mode 100644 ver-5.1.0/sptgps_8f.js create mode 100644 ver-5.1.0/sptgps_8f_source.html create mode 100644 ver-5.1.0/sptgpsd_8f.html create mode 100644 ver-5.1.0/sptgpsd_8f.js create mode 100644 ver-5.1.0/sptgpsd_8f_source.html create mode 100644 ver-5.1.0/sptgpsv_8f.html create mode 100644 ver-5.1.0/sptgpsv_8f.js create mode 100644 ver-5.1.0/sptgpsv_8f_source.html create mode 100644 ver-5.1.0/sptgpt_8f.html create mode 100644 ver-5.1.0/sptgpt_8f.js create mode 100644 ver-5.1.0/sptgpt_8f_source.html create mode 100644 ver-5.1.0/sptgptd_8f.html create mode 100644 ver-5.1.0/sptgptd_8f.js create mode 100644 ver-5.1.0/sptgptd_8f_source.html create mode 100644 ver-5.1.0/sptgptsd_8f.html create mode 100644 ver-5.1.0/sptgptsd_8f.js create mode 100644 ver-5.1.0/sptgptsd_8f_source.html create mode 100644 ver-5.1.0/sptgptv_8f.html create mode 100644 ver-5.1.0/sptgptv_8f.js create mode 100644 ver-5.1.0/sptgptv_8f_source.html create mode 100644 ver-5.1.0/sptgptvd_8f.html create mode 100644 ver-5.1.0/sptgptvd_8f.js create mode 100644 ver-5.1.0/sptgptvd_8f_source.html create mode 100644 ver-5.1.0/sptran_8f.html create mode 100644 ver-5.1.0/sptran_8f.js create mode 100644 ver-5.1.0/sptran_8f_source.html create mode 100644 ver-5.1.0/sptrand_8f.html create mode 100644 ver-5.1.0/sptrand_8f.js create mode 100644 ver-5.1.0/sptrand_8f_source.html create mode 100644 ver-5.1.0/sptranf0_8f.html create mode 100644 ver-5.1.0/sptranf0_8f.js create mode 100644 ver-5.1.0/sptranf0_8f_source.html create mode 100644 ver-5.1.0/sptranf1_8f.html create mode 100644 ver-5.1.0/sptranf1_8f.js create mode 100644 ver-5.1.0/sptranf1_8f_source.html create mode 100644 ver-5.1.0/sptranf_8f.html create mode 100644 ver-5.1.0/sptranf_8f.js create mode 100644 ver-5.1.0/sptranf_8f_source.html create mode 100644 ver-5.1.0/sptranfv_8f.html create mode 100644 ver-5.1.0/sptranfv_8f.js create mode 100644 ver-5.1.0/sptranfv_8f_source.html create mode 100644 ver-5.1.0/sptranv_8f.html create mode 100644 ver-5.1.0/sptranv_8f.js create mode 100644 ver-5.1.0/sptranv_8f_source.html create mode 100644 ver-5.1.0/sptrun_8f.html create mode 100644 ver-5.1.0/sptrun_8f.js create mode 100644 ver-5.1.0/sptrun_8f_source.html create mode 100644 ver-5.1.0/sptrund_8f.html create mode 100644 ver-5.1.0/sptrund_8f.js create mode 100644 ver-5.1.0/sptrund_8f_source.html create mode 100644 ver-5.1.0/sptrung_8f.html create mode 100644 ver-5.1.0/sptrung_8f.js create mode 100644 ver-5.1.0/sptrung_8f_source.html create mode 100644 ver-5.1.0/sptrungv_8f.html create mode 100644 ver-5.1.0/sptrungv_8f.js create mode 100644 ver-5.1.0/sptrungv_8f_source.html create mode 100644 ver-5.1.0/sptrunl_8f.html create mode 100644 ver-5.1.0/sptrunl_8f.js create mode 100644 ver-5.1.0/sptrunl_8f_source.html create mode 100644 ver-5.1.0/sptrunm_8f.html create mode 100644 ver-5.1.0/sptrunm_8f.js create mode 100644 ver-5.1.0/sptrunm_8f_source.html create mode 100644 ver-5.1.0/sptrunmv_8f.html create mode 100644 ver-5.1.0/sptrunmv_8f.js create mode 100644 ver-5.1.0/sptrunmv_8f_source.html create mode 100644 ver-5.1.0/sptruns_8f.html create mode 100644 ver-5.1.0/sptruns_8f.js create mode 100644 ver-5.1.0/sptruns_8f_source.html create mode 100644 ver-5.1.0/sptrunsv_8f.html create mode 100644 ver-5.1.0/sptrunsv_8f.js create mode 100644 ver-5.1.0/sptrunsv_8f_source.html create mode 100644 ver-5.1.0/sptrunv_8f.html create mode 100644 ver-5.1.0/sptrunv_8f.js create mode 100644 ver-5.1.0/sptrunv_8f_source.html create mode 100644 ver-5.1.0/spuv2dz_8f.html create mode 100644 ver-5.1.0/spuv2dz_8f.js create mode 100644 ver-5.1.0/spuv2dz_8f_source.html create mode 100644 ver-5.1.0/spvar_8f.html create mode 100644 ver-5.1.0/spvar_8f.js create mode 100644 ver-5.1.0/spvar_8f_source.html create mode 100644 ver-5.1.0/spwget_8f.html create mode 100644 ver-5.1.0/spwget_8f.js create mode 100644 ver-5.1.0/spwget_8f_source.html create mode 100644 ver-5.1.0/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html create mode 100644 ver-5.1.0/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.js create mode 100644 ver-5.1.0/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.png create mode 100644 ver-5.1.0/structip__gaussian__grid__mod_1_1ip__gaussian__grid.html create mode 100644 ver-5.1.0/structip__gaussian__grid__mod_1_1ip__gaussian__grid.js create mode 100644 ver-5.1.0/structip__gaussian__grid__mod_1_1ip__gaussian__grid.png create mode 100644 ver-5.1.0/structip__grid__descriptor__mod_1_1grib1__descriptor.html create mode 100644 ver-5.1.0/structip__grid__descriptor__mod_1_1grib1__descriptor.js create mode 100644 ver-5.1.0/structip__grid__descriptor__mod_1_1grib1__descriptor.png create mode 100644 ver-5.1.0/structip__grid__descriptor__mod_1_1grib2__descriptor.html create mode 100644 ver-5.1.0/structip__grid__descriptor__mod_1_1grib2__descriptor.js create mode 100644 ver-5.1.0/structip__grid__descriptor__mod_1_1grib2__descriptor.png create mode 100644 ver-5.1.0/structip__grid__descriptor__mod_1_1ip__grid__descriptor.html create mode 100644 ver-5.1.0/structip__grid__descriptor__mod_1_1ip__grid__descriptor.js create mode 100644 ver-5.1.0/structip__grid__descriptor__mod_1_1ip__grid__descriptor.png create mode 100644 ver-5.1.0/structip__grid__mod_1_1ip__grid.html create mode 100644 ver-5.1.0/structip__grid__mod_1_1ip__grid.js create mode 100644 ver-5.1.0/structip__grid__mod_1_1ip__grid.png create mode 100644 ver-5.1.0/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html create mode 100644 ver-5.1.0/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.js create mode 100644 ver-5.1.0/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.png create mode 100644 ver-5.1.0/structip__mercator__grid__mod_1_1ip__mercator__grid.html create mode 100644 ver-5.1.0/structip__mercator__grid__mod_1_1ip__mercator__grid.js create mode 100644 ver-5.1.0/structip__mercator__grid__mod_1_1ip__mercator__grid.png create mode 100644 ver-5.1.0/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html create mode 100644 ver-5.1.0/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.js create mode 100644 ver-5.1.0/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.png create mode 100644 ver-5.1.0/structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html create mode 100644 ver-5.1.0/structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.js create mode 100644 ver-5.1.0/structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.png create mode 100644 ver-5.1.0/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html create mode 100644 ver-5.1.0/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.js create mode 100644 ver-5.1.0/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.png create mode 100644 ver-5.1.0/structip__station__points__grid__mod_1_1ip__station__points__grid.html create mode 100644 ver-5.1.0/structip__station__points__grid__mod_1_1ip__station__points__grid.js create mode 100644 ver-5.1.0/structip__station__points__grid__mod_1_1ip__station__points__grid.png create mode 100644 ver-5.1.0/sync_off.png create mode 100644 ver-5.1.0/sync_on.png create mode 100644 ver-5.1.0/tab_a.png create mode 100644 ver-5.1.0/tab_b.png create mode 100644 ver-5.1.0/tab_h.png create mode 100644 ver-5.1.0/tab_s.png create mode 100644 ver-5.1.0/tabs.css diff --git a/annotated.html b/annotated.html index 7bfc9a79..1dc211a6 100644 --- a/annotated.html +++ b/annotated.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: Data Types List @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,68 +76,74 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
Data Types List
+
Data Types List
Here are the data types with brief descriptions:
[detail level 12]
- - - - - - - - - - - - - - + + + + + + + + + + + + + + - + - - - - - + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - +
 Nbicubic_interp_modBicubic interpolation routines for scalars and vectors
 Cinterpolate_bicubic
 Nbilinear_interp_modBilinear interpolation routines for scalars and vectors
 Cinterpolate_bilinear
 Nbudget_interp_modBudget interpolation routines for scalars and vectors
 Cinterpolate_budget
 Ngdswzd_modDriver module for gdswzd routines
 Cgdswzd
 Nip_equid_cylind_grid_modEquidistant cylindrical grib decoder and grid coordinate transformations
 Cip_equid_cylind_grid
 Nip_gaussian_grid_modGaussian grid coordinate transformations
 Cip_gaussian_grid
 Nip_grid_descriptor_modUsers derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions
 Cgrib1_descriptorDescriptor representing a grib1 grib descriptor section (GDS) with an integer array
 Mbicubic_interp_modBicubic interpolation routines for scalars and vectors
 Cinterpolate_bicubic
 Mbilinear_interp_modBilinear interpolation routines for scalars and vectors
 Cinterpolate_bilinear
 Mbudget_interp_modBudget interpolation routines for scalars and vectors
 Cinterpolate_budget
 Mgdswzd_modDriver module for gdswzd routines
 Cgdswzd
 Mip_equid_cylind_grid_modEquidistant cylindrical grib decoder and grid coordinate transformations
 Cip_equid_cylind_grid
 Mip_gaussian_grid_modGaussian grid coordinate transformations
 Cip_gaussian_grid
 Mip_grid_descriptor_modUsers derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions
 Cgrib1_descriptorDescriptor representing a grib1 grib descriptor section (GDS) with an integer array
 Cgrib2_descriptorGrib-2 descriptor containing a grib2 GDT represented by an integer array
 Cinit_descriptor
 Cinit_descriptor
 Cip_grid_descriptorAbstract descriptor object which represents a grib1 or grib2 descriptor
 Coperator(==)
 Nip_grid_factory_modRoutines for creating an ip_grid given a Grib descriptor
 Cinit_grid
 Nip_grid_modAbstract ip_grid type
 Cgdswzd_interface
 Coperator(==)
 Mip_grid_factory_modRoutines for creating an ip_grid given a Grib descriptor
 Cinit_grid
 Mip_grid_modAbstract ip_grid type
 Cgdswzd_interface
 Cinit_grib1_interface
 Cinit_grib2_interface
 Cinit_grib2_interface
 Cip_gridAbstract grid that holds fields and methods common to all grids
 Coperator(==)Check equality
 Nip_lambert_conf_grid_modLambert conformal grib decoder and grid coordinate transformations
 Cip_lambert_conf_grid
 Nip_mercator_grid_modGDS wizard for mercator cylindrical
 Cip_mercator_grid
 Nip_polar_stereo_grid_modGDS wizard for polar stereographic azimuthal
 Cip_polar_stereo_grid
 Nip_rot_equid_cylind_egrid_modRotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grid E
 Cip_rot_equid_cylind_egrid
 Nip_rot_equid_cylind_grid_modRotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grids A through D
 Cip_rot_equid_cylind_grid
 Nip_station_points_grid_modInterpolate gridded data to a series of station points
 Cip_station_points_grid
 Nipolates_modTop-level driver for scalar interpolation interpolation routine ipolates()
 Cipolates
 Nipolatev_modTop-level driver for vector interpolation interpolation routine ipolatev()
 Cipolatev
 Nneighbor_budget_interp_modInterpolate scalar fields (neighbor)
 Cinterpolate_neighbor_budget
 Nneighbor_interp_modInterpolate scalar fields (neighbor)
 Cinterpolate_neighbor
 Nspectral_interp_modInterpolate spectral
 Cinterpolate_spectral
 Coperator(==)Check equality
 Mip_lambert_conf_grid_modLambert conformal grib decoder and grid coordinate transformations
 Cip_lambert_conf_grid
 Mip_mercator_grid_modGDS wizard for mercator cylindrical
 Cip_mercator_grid
 Mip_polar_stereo_grid_modGDS wizard for polar stereographic azimuthal
 Cip_polar_stereo_grid
 Mip_rot_equid_cylind_egrid_modRotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grid E
 Cip_rot_equid_cylind_egrid
 Mip_rot_equid_cylind_grid_modRotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grids A through D
 Cip_rot_equid_cylind_grid
 Mip_station_points_grid_modInterpolate gridded data to a series of station points
 Cip_station_points_grid
 Mipolates_modTop-level driver for scalar interpolation interpolation routine ipolates()
 Cipolates
 Mipolatev_modTop-level driver for vector interpolation interpolation routine ipolatev()
 Cipolatev
 Mneighbor_budget_interp_modInterpolate scalar fields (neighbor)
 Cinterpolate_neighbor_budget
 Mneighbor_interp_modInterpolate scalar fields (neighbor)
 Cinterpolate_neighbor
 Mspectral_interp_modInterpolate spectral
 Cinterpolate_spectral
 Cpolates4
 Cpolatev4
 Cpolatev4
@@ -145,7 +151,7 @@ diff --git a/bc_sd.png b/bc_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..31ca888dc71049713b35c351933a8d0f36180bf1 GIT binary patch literal 635 zcmV->0)+jEP)Jwi0r1~gdSq#w{Bu1q z`craw(p2!hu$4C_$Oc3X(sI6e=9QSTwPt{G) z=htT&^~&c~L2~e{r5_5SYe7#Is-$ln>~Kd%$F#tC65?{LvQ}8O`A~RBB0N~`2M+waajO;5>3B&-viHGJeEK2TQOiPRa zfDKyqwMc4wfaEh4jt>H`nW_Zidwk@Bowp`}(VUaj-pSI(-1L>FJVsX}Yl9~JsqgsZ zUD9(rMwf23Gez6KPa|wwInZodP-2}9@fK0Ga_9{8SOjU&4l`pH4@qlQp83>>HT$xW zER^U>)MyV%t(Lu=`d=Y?{k1@}&r7ZGkFQ%z%N+sE9BtYjovzxyxCPxN6&@wLK{soQ zSmkj$aLI}miuE^p@~4}mg9OjDfGEkgY4~^XzLRUBB*O{+&vq<3v(E%+k_i%=`~j%{ Vj14gnt9}3g002ovPDHLkV1n!oC4m3{ literal 0 HcmV?d00001 diff --git a/bicubic__interp__mod_8F90.html b/bicubic__interp__mod_8F90.html index 1ae3ce7b..0ea5b350 100644 --- a/bicubic__interp__mod_8F90.html +++ b/bicubic__interp__mod_8F90.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: bicubic_interp_mod.F90 File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,9 +76,16 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
@@ -86,8 +93,7 @@ Data Types | Modules | Functions/Subroutines
-
-
bicubic_interp_mod.F90 File Reference
+
bicubic_interp_mod.F90 File Reference
@@ -96,24 +102,24 @@

Go to the source code of this file.

-

+

Data Types

interface  bicubic_interp_mod::interpolate_bicubic
 
- - +

+

Modules

module  bicubic_interp_mod
module  bicubic_interp_mod
 Bicubic interpolation routines for scalars and vectors.
 
- - - - - - + + + + +

+

Functions/Subroutines

subroutine bicubic_interp_mod::interpolate_bicubic_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
 This subprogram performs bicubic interpolation from any grid to any grid for scalar fields. More...
 
subroutine bicubic_interp_mod::interpolate_bicubic_vector (ipopt, grid_in, grid_out, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
 This subprogram performs bicubic interpolation from any grid to any grid for vector fields. More...
subroutine bicubic_interp_mod::interpolate_bicubic_scalar (ipopt, grid_in, grid_out, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
 This subprogram performs bicubic interpolation from any grid to any grid for scalar fields.
 
subroutine bicubic_interp_mod::interpolate_bicubic_vector (ipopt, grid_in, grid_out, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
 This subprogram performs bicubic interpolation from any grid to any grid for vector fields.
 

Detailed Description

@@ -127,7 +133,7 @@ diff --git a/bicubic__interp__mod_8F90.js b/bicubic__interp__mod_8F90.js index 6b9a6998..01a17b24 100644 --- a/bicubic__interp__mod_8F90.js +++ b/bicubic__interp__mod_8F90.js @@ -1,6 +1,6 @@ var bicubic__interp__mod_8F90 = [ - [ "interpolate_bicubic", "interfacebicubic__interp__mod_1_1interpolate__bicubic.html", "interfacebicubic__interp__mod_1_1interpolate__bicubic" ], - [ "interpolate_bicubic_scalar", "bicubic__interp__mod_8F90.html#a54a442e47f1be9511c1684a337d7e2d1", null ], + [ "bicubic_interp_mod::interpolate_bicubic", "interfacebicubic__interp__mod_1_1interpolate__bicubic.html", "interfacebicubic__interp__mod_1_1interpolate__bicubic" ], + [ "interpolate_bicubic_scalar", "bicubic__interp__mod_8F90.html#ae1f0be5780050bc527b1628d8c79fef5", null ], [ "interpolate_bicubic_vector", "bicubic__interp__mod_8F90.html#a9d27db7d350fc2699aaf5057c3b53d16", null ] ]; \ No newline at end of file diff --git a/bicubic__interp__mod_8F90_source.html b/bicubic__interp__mod_8F90_source.html index b31c8184..ecd72a2f 100644 --- a/bicubic__interp__mod_8F90_source.html +++ b/bicubic__interp__mod_8F90_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: bicubic_interp_mod.F90 Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,489 +81,501 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
bicubic_interp_mod.F90
+
bicubic_interp_mod.F90
-Go to the documentation of this file.
1 
-
4 
- -
9  use gdswzd_mod
-
10  use polfix_mod
-
11  use ip_grids_mod
-
12  implicit none
-
13 
-
14  private
-
15  public :: interpolate_bicubic
-
16 
- -
18  module procedure interpolate_bicubic_scalar
-
19  module procedure interpolate_bicubic_vector
-
20  end interface interpolate_bicubic
-
21 
-
22  ! Smallest positive real value (use for equality comparisons)
-
23  REAL :: TINYREAL=tiny(1.0)
-
24 
-
25 contains
-
26 
-
80  SUBROUTINE interpolate_bicubic_scalar(IPOPT,grid_in,grid_out, &
-
81  MI,MO,KM,IBI,LI,GI, &
-
82  NO,RLAT,RLON,IBO,LO,GO,IRET)
-
83  class(ip_grid), intent(in) :: grid_in, grid_out
-
84  INTEGER, INTENT(IN ) :: IPOPT(20)
-
85  INTEGER, INTENT(IN ) :: MI,MO,KM
-
86  INTEGER, INTENT(IN ) :: IBI(KM)
-
87  INTEGER, INTENT(INOUT) :: NO
-
88  INTEGER, INTENT( OUT) :: IRET, IBO(KM)
-
89  !
-
90  LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
-
91  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
-
92  !
-
93  REAL, INTENT(IN ) :: GI(MI,KM)
-
94  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO)
-
95  REAL, INTENT( OUT) :: GO(MO,KM)
-
96  !
-
97  REAL, PARAMETER :: FILL=-9999.
-
98  !
-
99  INTEGER :: IJX(4),IJY(4)
-
100  INTEGER :: MCON,MP,N,I,J,K
-
101  INTEGER :: NK,NV
-
102  LOGICAL :: SAME_GRIDI, SAME_GRIDO
-
103  !
-
104  REAL :: PMP,XIJ,YIJ,XF,YF
-
105  REAL :: G,W,GMIN,GMAX
-
106  REAL :: WX(4),WY(4)
-
107  REAL :: XPTS(MO),YPTS(MO)
-
108  logical :: to_station_points
-
109 
-
110  ! Save coeffecients between calls and only compute if grids have changed
-
111  REAL, ALLOCATABLE,SAVE :: RLATX(:),RLONX(:)
-
112  REAL, ALLOCATABLE,SAVE :: WXY(:,:,:)
-
113  INTEGER, SAVE :: NOX=-1,iretx=-1
-
114  INTEGER, ALLOCATABLE,SAVE :: NXY(:,:,:),NC(:)
-
115  class(ip_grid), allocatable,save :: prev_grid_in, prev_grid_out
-
116 
-
117  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
118  ! SET PARAMETERS
-
119  iret=0
-
120  mcon=ipopt(1)
-
121  mp=ipopt(2)
-
122  IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
-
123  IF(mp.LT.0.OR.mp.GT.100) iret=32
-
124  pmp=mp*0.01
-
125 
-
126  if (.not. allocated(prev_grid_in) .or. .not. allocated(prev_grid_out)) then
-
127  allocate(prev_grid_in, source = grid_in)
-
128  allocate(prev_grid_out, source = grid_out)
-
129 
-
130  same_gridi = .false.
-
131  same_grido = .false.
-
132  else
-
133  same_gridi = grid_in == prev_grid_in
-
134  same_grido = grid_out == prev_grid_out
-
135 
-
136  if (.not. same_gridi .or. .not. same_grido) then
-
137  deallocate(prev_grid_in)
-
138  deallocate(prev_grid_out)
-
139 
-
140  allocate(prev_grid_in, source = grid_in)
-
141  allocate(prev_grid_out, source = grid_out)
-
142  end if
-
143  end if
-
144 
-
145  select type(grid_out)
-
146  type is(ip_station_points_grid)
-
147  to_station_points = .true.
-
148  class default
-
149  to_station_points = .false.
-
150  end select
-
151 
-
152  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
153  ! SAVE OR SKIP WEIGHT COMPUTATION
-
154  IF(iret.EQ.0.AND.(to_station_points.OR..NOT.same_gridi.OR..NOT.same_grido))THEN
-
155  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
156  ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
-
157  CALL gdswzd(grid_out,0,mo,fill,xpts,ypts,rlon,rlat,no)
-
158  IF(no.EQ.0) iret=3
-
159  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
160  ! LOCATE INPUT POINTS
-
161  CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv)
-
162  IF(iret.EQ.0.AND.nv.EQ.0) iret=2
-
163  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
164  ! ALLOCATE AND SAVE GRID DATA
-
165  IF(nox.NE.no) THEN
-
166  IF(nox.GE.0) DEALLOCATE(rlatx,rlonx,nc,nxy,wxy)
-
167  ALLOCATE(rlatx(no),rlonx(no),nc(no),nxy(4,4,no),wxy(4,4,no))
-
168  nox=no
-
169  ENDIF
-
170  iretx=iret
-
171  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
172  ! COMPUTE WEIGHTS
-
173  IF(iret.EQ.0) THEN
-
174  !$OMP PARALLEL DO PRIVATE(N,XIJ,YIJ,IJX,IJY,XF,YF,J,I,WX,WY) SCHEDULE(STATIC)
-
175  DO n=1,no
-
176  rlonx(n)=rlon(n)
-
177  rlatx(n)=rlat(n)
-
178  xij=xpts(n)
-
179  yij=ypts(n)
-
180  IF(abs(xij-fill).GT.tinyreal.AND.abs(yij-fill).GT.tinyreal) THEN
-
181  ijx(1:4)=floor(xij-1)+(/0,1,2,3/)
-
182  ijy(1:4)=floor(yij-1)+(/0,1,2,3/)
-
183  xf=xij-ijx(2)
-
184  yf=yij-ijy(2)
-
185  DO j=1,4
-
186  DO i=1,4
-
187  nxy(i,j,n) = grid_in%field_pos(ijx(i), ijy(j))
-
188  ENDDO
-
189  ENDDO
-
190  IF(minval(nxy(1:4,1:4,n)).GT.0) THEN
-
191  ! BICUBIC WHERE 16-POINT STENCIL IS AVAILABLE
-
192  nc(n)=1
-
193  wx(1)=xf*(1-xf)*(2-xf)/(-6.)
-
194  wx(2)=(xf+1)*(1-xf)*(2-xf)/2.
-
195  wx(3)=(xf+1)*xf*(2-xf)/2.
-
196  wx(4)=(xf+1)*xf*(1-xf)/(-6.)
-
197  wy(1)=yf*(1-yf)*(2-yf)/(-6.)
-
198  wy(2)=(yf+1)*(1-yf)*(2-yf)/2.
-
199  wy(3)=(yf+1)*yf*(2-yf)/2.
-
200  wy(4)=(yf+1)*yf*(1-yf)/(-6.)
-
201  ELSE
-
202  ! BILINEAR ELSEWHERE NEAR THE EDGE OF THE GRID
-
203  nc(n)=2
-
204  wx(1)=0
-
205  wx(2)=(1-xf)
-
206  wx(3)=xf
-
207  wx(4)=0
-
208  wy(1)=0
-
209  wy(2)=(1-yf)
-
210  wy(3)=yf
-
211  wy(4)=0
-
212  ENDIF
-
213  DO j=1,4
-
214  DO i=1,4
-
215  wxy(i,j,n)=wx(i)*wy(j)
-
216  ENDDO
-
217  ENDDO
-
218  ELSE
-
219  nc(n)=0
-
220  ENDIF
-
221  ENDDO
-
222  ENDIF
-
223  ENDIF
-
224  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
225  ! INTERPOLATE OVER ALL FIELDS
-
226  IF(iret.EQ.0.AND.iretx.EQ.0) THEN
-
227  IF(.not. to_station_points) THEN
-
228  no=nox
-
229  DO n=1,no
-
230  rlon(n)=rlonx(n)
-
231  rlat(n)=rlatx(n)
-
232  ENDDO
-
233  ENDIF
-
234  !$OMP PARALLEL DO PRIVATE(NK,K,N,G,W,GMIN,GMAX,J,I) SCHEDULE(STATIC)
-
235  DO nk=1,no*km
-
236  k=(nk-1)/no+1
-
237  n=nk-no*(k-1)
-
238  IF(nc(n).GT.0) THEN
-
239  g=0
-
240  w=0
-
241  IF(mcon.GT.0) gmin=huge(gmin)
-
242  IF(mcon.GT.0) gmax=-huge(gmax)
-
243  DO j=nc(n),5-nc(n)
-
244  DO i=nc(n),5-nc(n)
-
245  IF(nxy(i,j,n).GT.0)THEN
-
246  IF(ibi(k).EQ.0.OR.li(nxy(i,j,n),k))THEN
-
247  g=g+wxy(i,j,n)*gi(nxy(i,j,n),k)
-
248  w=w+wxy(i,j,n)
-
249  IF(mcon.GT.0) gmin=min(gmin,gi(nxy(i,j,n),k))
-
250  IF(mcon.GT.0) gmax=max(gmax,gi(nxy(i,j,n),k))
-
251  ENDIF
-
252  ENDIF
-
253  ENDDO
-
254  ENDDO
-
255  lo(n,k)=w.GE.pmp
-
256  IF(lo(n,k)) THEN
-
257  go(n,k)=g/w
-
258  IF(mcon.GT.0) go(n,k)=min(max(go(n,k),gmin),gmax)
-
259  ELSE
-
260  go(n,k)=0.
-
261  ENDIF
-
262  ELSE
-
263  lo(n,k)=.false.
-
264  go(n,k)=0.
-
265  ENDIF
-
266  ENDDO
-
267  DO k=1,km
-
268  ibo(k)=ibi(k)
-
269  IF(.NOT.all(lo(1:no,k))) ibo(k)=1
-
270  ENDDO
-
271  select type(grid_out)
-
272  type is(ip_equid_cylind_grid)
-
273  CALL polfixs(no,mo,km,rlat,ibo,lo,go)
-
274  end select
-
275  ELSE
-
276  IF(iret.EQ.0) iret=iretx
-
277  IF(.not. to_station_points) no=0
-
278  ENDIF
-
279  end subroutine interpolate_bicubic_scalar
-
280 
-
338  subroutine interpolate_bicubic_vector(ipopt, grid_in, grid_out, &
-
339  mi, mo, km, ibi, li, ui, vi, &
-
340  no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
-
341  class(ip_grid), intent(in) :: grid_in, grid_out
-
342  INTEGER, INTENT(IN ) :: IPOPT(20)
-
343  INTEGER, INTENT(IN ) :: IBI(KM),MI,MO,KM
-
344  INTEGER, INTENT(INOUT) :: NO
-
345  INTEGER, INTENT( OUT) :: IRET, IBO(KM)
-
346  !
-
347  LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
-
348  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
-
349  !
-
350  REAL, INTENT(IN ) :: UI(MI,KM),VI(MI,KM)
-
351  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO),CROT(MO),SROT(MO)
-
352  REAL, INTENT( OUT) :: UO(MO,KM),VO(MO,KM)
-
353  !
-
354  REAL, PARAMETER :: FILL=-9999.
-
355  !
-
356  INTEGER :: IJX(4),IJY(4)
-
357  INTEGER :: MCON,MP,N,I,J,K,NK,NV
-
358  !
-
359  LOGICAL :: SAME_GRIDI,SAME_GRIDO
-
360  !
-
361  REAL :: CM,SM,UROT,VROT
-
362  REAL :: PMP,XIJ,YIJ,XF,YF
-
363  REAL :: U,V,W,UMIN,UMAX,VMIN,VMAX
-
364  REAL :: XPTS(MO),YPTS(MO)
-
365  REAL :: WX(4),WY(4)
-
366  REAL :: XPTI(MI),YPTI(MI),RLOI(MI),RLAI(MI)
-
367  REAL :: CROI(MI),SROI(MI)
-
368 
-
369  logical :: to_station_points
-
370 
-
371  ! Save coeffecients between calls and only compute if grids have changed
-
372  REAL, ALLOCATABLE, SAVE :: RLATX(:),RLONX(:),CROTX(:),SROTX(:)
-
373  REAL, ALLOCATABLE, SAVE :: WXY(:,:,:),CXY(:,:,:),SXY(:,:,:)
-
374  INTEGER, SAVE :: NOX=-1,iretx=-1
-
375  INTEGER, ALLOCATABLE, SAVE :: NXY(:,:,:),NC(:)
-
376  class(ip_grid), allocatable, save :: prev_grid_in, prev_grid_out
-
377  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
378  ! SET PARAMETERS
-
379  iret=0
-
380  mcon=ipopt(1)
-
381  mp=ipopt(2)
-
382  IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
-
383  IF(mp.LT.0.OR.mp.GT.100) iret=32
-
384  pmp=mp*0.01
-
385 
-
386 
-
387  if (.not. allocated(prev_grid_in) .or. .not. allocated(prev_grid_out)) then
-
388  allocate(prev_grid_in, source = grid_in)
-
389  allocate(prev_grid_out, source = grid_out)
-
390 
-
391  same_gridi = .false.
-
392  same_grido = .false.
-
393  else
-
394  same_gridi = grid_in == prev_grid_in
-
395  same_grido = grid_out == prev_grid_out
-
396 
-
397  if (.not. same_gridi .or. .not. same_grido) then
-
398  deallocate(prev_grid_in)
-
399  deallocate(prev_grid_out)
-
400 
-
401  allocate(prev_grid_in, source = grid_in)
-
402  allocate(prev_grid_out, source = grid_out)
-
403  end if
-
404  end if
-
405 
-
406  select type(grid_out)
-
407  type is(ip_station_points_grid)
-
408  to_station_points = .true.
-
409  class default
-
410  to_station_points = .false.
-
411  end select
-
412 
-
413  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
414  ! SAVE OR SKIP WEIGHT COMPUTATION
-
415  IF(iret.EQ.0.AND.(to_station_points.OR..NOT.same_gridi.OR..NOT.same_grido))THEN
-
416  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
417  ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
-
418  CALL gdswzd(grid_out, 0,mo,fill,xpts,ypts,rlon,rlat,no,crot,srot)
-
419  IF(no.EQ.0) iret=3
-
420  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
421  ! LOCATE INPUT POINTS
-
422  CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv)
-
423  IF(iret.EQ.0.AND.nv.EQ.0) iret=2
-
424  CALL gdswzd(grid_in, 0,mi,fill,xpti,ypti,rloi,rlai,nv,croi,sroi)
-
425  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
426  ! ALLOCATE AND SAVE GRID DATA
-
427  IF(nox.NE.no) THEN
-
428  IF(nox.GE.0) DEALLOCATE(rlatx,rlonx,crotx,srotx,nc,nxy,wxy,cxy,sxy)
-
429  ALLOCATE(rlatx(no),rlonx(no),crotx(no),srotx(no),nc(no), &
-
430  nxy(4,4,no),wxy(4,4,no),cxy(4,4,no),sxy(4,4,no))
-
431  nox=no
-
432  ENDIF
-
433  iretx=iret
-
434  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
435  ! COMPUTE WEIGHTS
-
436  IF(iret.EQ.0) THEN
-
437  !$OMP PARALLEL DO PRIVATE(N,XIJ,YIJ,IJX,IJY,XF,YF,J,I,WX,WY,CM,SM) SCHEDULE(STATIC)
-
438  DO n=1,no
-
439  rlonx(n)=rlon(n)
-
440  rlatx(n)=rlat(n)
-
441  crotx(n)=crot(n)
-
442  srotx(n)=srot(n)
-
443  xij=xpts(n)
-
444  yij=ypts(n)
-
445  IF(abs(xij-fill).GT.tinyreal.AND.abs(yij-fill).GT.tinyreal) THEN
-
446  ijx(1:4)=floor(xij-1)+(/0,1,2,3/)
-
447  ijy(1:4)=floor(yij-1)+(/0,1,2,3/)
-
448  xf=xij-ijx(2)
-
449  yf=yij-ijy(2)
-
450  DO j=1,4
-
451  DO i=1,4
-
452  nxy(i,j,n) = grid_in%field_pos(ijx(i), ijy(j))
-
453  ENDDO
-
454  ENDDO
-
455  IF(minval(nxy(1:4,1:4,n)).GT.0) THEN
-
456  ! BICUBIC WHERE 16-POINT STENCIL IS AVAILABLE
-
457  nc(n)=1
-
458  wx(1)=xf*(1-xf)*(2-xf)/(-6.)
-
459  wx(2)=(xf+1)*(1-xf)*(2-xf)/2.
-
460  wx(3)=(xf+1)*xf*(2-xf)/2.
-
461  wx(4)=(xf+1)*xf*(1-xf)/(-6.)
-
462  wy(1)=yf*(1-yf)*(2-yf)/(-6.)
-
463  wy(2)=(yf+1)*(1-yf)*(2-yf)/2.
-
464  wy(3)=(yf+1)*yf*(2-yf)/2.
-
465  wy(4)=(yf+1)*yf*(1-yf)/(-6.)
-
466  ELSE
-
467  ! BILINEAR ELSEWHERE NEAR THE EDGE OF THE GRID
-
468  nc(n)=2
-
469  wx(1)=0
-
470  wx(2)=(1-xf)
-
471  wx(3)=xf
-
472  wx(4)=0
-
473  wy(1)=0
-
474  wy(2)=(1-yf)
-
475  wy(3)=yf
-
476  wy(4)=0
-
477  ENDIF
-
478  DO j=1,4
-
479  DO i=1,4
-
480  wxy(i,j,n)=wx(i)*wy(j)
-
481  IF(nxy(i,j,n).GT.0) THEN
-
482  CALL movect(rlai(nxy(i,j,n)),rloi(nxy(i,j,n)), &
-
483  rlat(n),rlon(n),cm,sm)
-
484  cxy(i,j,n)=cm*croi(nxy(i,j,n))+sm*sroi(nxy(i,j,n))
-
485  sxy(i,j,n)=sm*croi(nxy(i,j,n))-cm*sroi(nxy(i,j,n))
-
486  ENDIF
-
487  ENDDO
-
488  ENDDO
-
489  ELSE
-
490  nc(n)=0
-
491  ENDIF
-
492  ENDDO
-
493  ENDIF
-
494  ENDIF
-
495  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
496  ! INTERPOLATE OVER ALL FIELDS
-
497  IF(iret.EQ.0.AND.iretx.EQ.0) THEN
-
498  IF(.not. to_station_points) THEN
-
499  no=nox
-
500  DO n=1,no
-
501  rlon(n)=rlonx(n)
-
502  rlat(n)=rlatx(n)
-
503  crot(n)=crotx(n)
-
504  srot(n)=srotx(n)
-
505  ENDDO
-
506  ENDIF
-
507  !$OMP PARALLEL DO PRIVATE(NK,K,N,U,V,W,UMIN,UMAX,VMIN,VMAX,UROT,VROT,J,I) SCHEDULE(STATIC)
-
508  DO nk=1,no*km
-
509  k=(nk-1)/no+1
-
510  n=nk-no*(k-1)
-
511  IF(nc(n).GT.0) THEN
-
512  u=0
-
513  v=0
-
514  w=0
-
515  IF(mcon.GT.0) umin=huge(umin)
-
516  IF(mcon.GT.0) umax=-huge(umax)
-
517  IF(mcon.GT.0) vmin=huge(vmin)
-
518  IF(mcon.GT.0) vmax=-huge(vmax)
-
519  DO j=nc(n),5-nc(n)
-
520  DO i=nc(n),5-nc(n)
-
521  IF(nxy(i,j,n).GT.0) THEN
-
522  IF(ibi(k).EQ.0.OR.li(nxy(i,j,n),k)) THEN
-
523  urot=cxy(i,j,n)*ui(nxy(i,j,n),k)-sxy(i,j,n)*vi(nxy(i,j,n),k)
-
524  vrot=sxy(i,j,n)*ui(nxy(i,j,n),k)+cxy(i,j,n)*vi(nxy(i,j,n),k)
-
525  u=u+wxy(i,j,n)*urot
-
526  v=v+wxy(i,j,n)*vrot
-
527  w=w+wxy(i,j,n)
-
528  IF(mcon.GT.0) umin=min(umin,urot)
-
529  IF(mcon.GT.0) umax=max(umax,urot)
-
530  IF(mcon.GT.0) vmin=min(vmin,vrot)
-
531  IF(mcon.GT.0) vmax=max(vmax,vrot)
-
532  ENDIF
-
533  ENDIF
-
534  ENDDO
-
535  ENDDO
-
536  lo(n,k)=w.GE.pmp
-
537  IF(lo(n,k)) THEN
-
538  urot=crot(n)*u-srot(n)*v
-
539  vrot=srot(n)*u+crot(n)*v
-
540  uo(n,k)=urot/w
-
541  vo(n,k)=vrot/w
-
542  IF(mcon.GT.0) uo(n,k)=min(max(uo(n,k),umin),umax)
-
543  IF(mcon.GT.0) vo(n,k)=min(max(vo(n,k),vmin),vmax)
-
544  ELSE
-
545  uo(n,k)=0.
-
546  vo(n,k)=0.
-
547  ENDIF
-
548  ELSE
-
549  lo(n,k)=.false.
-
550  uo(n,k)=0.
-
551  vo(n,k)=0.
-
552  ENDIF
-
553  ENDDO
-
554  DO k=1,km
-
555  ibo(k)=ibi(k)
-
556  IF(.NOT.all(lo(1:no,k))) ibo(k)=1
-
557  ENDDO
-
558  select type(grid_out)
-
559  type is(ip_equid_cylind_grid)
-
560  CALL polfixv(no,mo,km,rlat,rlon,ibo,lo,uo,vo)
-
561  end select
-
562  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
563  ELSE
-
564  IF(iret.EQ.0) iret=iretx
-
565  IF(.not. to_station_points) no=0
-
566  ENDIF
-
567  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
568  end subroutine interpolate_bicubic_vector
-
569 
-
570 end module bicubic_interp_mod
- - -
subroutine movect(FLAT, FLON, TLAT, TLON, CROT, SROT)
This subprogram provides the rotation parameters to move a vector along a great circle from one posit...
Definition: movect.F90:26
-
Bicubic interpolation routines for scalars and vectors.
-
subroutine interpolate_bicubic_scalar(IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
This subprogram performs bicubic interpolation from any grid to any grid for scalar fields.
-
subroutine interpolate_bicubic_vector(ipopt, grid_in, grid_out, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
This subprogram performs bicubic interpolation from any grid to any grid for vector fields.
-
Driver module for gdswzd routines.
Definition: gdswzd_mod.F90:25
-
Re-export the individual grids.
Definition: ip_grids_mod.F90:7
-
Make multiple pole scalar values consistent.
Definition: polfix_mod.F90:7
-
subroutine, public polfixs(NM, NX, KM, RLAT, IB, LO, GO)
Make multiple pole scalar values consistent.
Definition: polfix_mod.F90:30
-
subroutine, public polfixv(NM, NX, KM, RLAT, RLON, IB, LO, UO, VO)
Make multiple pole vector values consistent,.
Definition: polfix_mod.F90:125
+Go to the documentation of this file.
1
+
4
+ +
9 use gdswzd_mod
+
10 use polfix_mod
+
11 use ip_grids_mod
+
12 implicit none
+
13
+
14 private
+
15 public :: interpolate_bicubic
+
16
+
+ +
18 module procedure interpolate_bicubic_scalar
+
19 module procedure interpolate_bicubic_vector
+
+
20 end interface interpolate_bicubic
+
21
+
22 ! Smallest positive real value (use for equality comparisons)
+
23 REAL :: TINYREAL=tiny(1.0)
+
24
+
25contains
+
26
+
+
80 SUBROUTINE interpolate_bicubic_scalar(IPOPT,grid_in,grid_out, &
+
81 MI,MO,KM,IBI,LI,GI, &
+
82 NO,RLAT,RLON,IBO,LO,GO,IRET)
+
83 class(ip_grid), intent(in) :: grid_in, grid_out
+
84 INTEGER, INTENT(IN ) :: IPOPT(20)
+
85 INTEGER, INTENT(IN ) :: MI,MO,KM
+
86 INTEGER, INTENT(IN ) :: IBI(KM)
+
87 INTEGER, INTENT(INOUT) :: NO
+
88 INTEGER, INTENT( OUT) :: IRET, IBO(KM)
+
89 !
+
90 LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
+
91 LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
+
92 !
+
93 REAL, INTENT(IN ) :: GI(MI,KM)
+
94 REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO)
+
95 REAL, INTENT( OUT) :: GO(MO,KM)
+
96 !
+
97 REAL, PARAMETER :: FILL=-9999.
+
98 !
+
99 INTEGER :: IJX(4),IJY(4)
+
100 INTEGER :: MCON,MP,N,I,J,K
+
101 INTEGER :: NK,NV
+
102 LOGICAL :: SAME_GRIDI, SAME_GRIDO
+
103 !
+
104 REAL :: PMP,XIJ,YIJ,XF,YF
+
105 REAL :: G,W,GMIN,GMAX
+
106 REAL :: WX(4),WY(4)
+
107 REAL :: XPTS(MO),YPTS(MO)
+
108 logical :: to_station_points
+
109
+
110 ! Save coeffecients between calls and only compute if grids have changed
+
111 REAL, ALLOCATABLE,SAVE :: RLATX(:),RLONX(:)
+
112 REAL, ALLOCATABLE,SAVE :: WXY(:,:,:)
+
113 INTEGER, SAVE :: NOX=-1,iretx=-1
+
114 INTEGER, ALLOCATABLE,SAVE :: NXY(:,:,:),NC(:)
+
115 class(ip_grid), allocatable,save :: prev_grid_in, prev_grid_out
+
116
+
117 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
118 ! SET PARAMETERS
+
119 iret=0
+
120 mcon=ipopt(1)
+
121 mp=ipopt(2)
+
122 IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
+
123 IF(mp.LT.0.OR.mp.GT.100) iret=32
+
124 pmp=mp*0.01
+
125
+
126 if (.not. allocated(prev_grid_in) .or. .not. allocated(prev_grid_out)) then
+
127 allocate(prev_grid_in, source = grid_in)
+
128 allocate(prev_grid_out, source = grid_out)
+
129
+
130 same_gridi = .false.
+
131 same_grido = .false.
+
132 else
+
133 same_gridi = grid_in == prev_grid_in
+
134 same_grido = grid_out == prev_grid_out
+
135
+
136 if (.not. same_gridi .or. .not. same_grido) then
+
137 deallocate(prev_grid_in)
+
138 deallocate(prev_grid_out)
+
139
+
140 allocate(prev_grid_in, source = grid_in)
+
141 allocate(prev_grid_out, source = grid_out)
+
142 end if
+
143 end if
+
144
+
145 select type(grid_out)
+
146 type is(ip_station_points_grid)
+
147 to_station_points = .true.
+
148 class default
+
149 to_station_points = .false.
+
150 end select
+
151
+
152 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
153 ! SAVE OR SKIP WEIGHT COMPUTATION
+
154 IF(iret.EQ.0.AND.(to_station_points.OR..NOT.same_gridi.OR..NOT.same_grido))THEN
+
155 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
156 ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
+
157 CALL gdswzd(grid_out,0,mo,fill,xpts,ypts,rlon,rlat,no)
+
158 IF(no.EQ.0) iret=3
+
159 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
160 ! LOCATE INPUT POINTS
+
161 CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv)
+
162 IF(iret.EQ.0.AND.nv.EQ.0) iret=2
+
163 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
164 ! ALLOCATE AND SAVE GRID DATA
+
165 IF(nox.NE.no) THEN
+
166 IF(nox.GE.0) DEALLOCATE(rlatx,rlonx,nc,nxy,wxy)
+
167 ALLOCATE(rlatx(no),rlonx(no),nc(no),nxy(4,4,no),wxy(4,4,no))
+
168 nox=no
+
169 ENDIF
+
170 iretx=iret
+
171 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
172 ! COMPUTE WEIGHTS
+
173 IF(iret.EQ.0) THEN
+
174 !$OMP PARALLEL DO PRIVATE(N,XIJ,YIJ,IJX,IJY,XF,YF,J,I,WX,WY) SCHEDULE(STATIC)
+
175 DO n=1,no
+
176 rlonx(n)=rlon(n)
+
177 rlatx(n)=rlat(n)
+
178 xij=xpts(n)
+
179 yij=ypts(n)
+
180 IF(abs(xij-fill).GT.tinyreal.AND.abs(yij-fill).GT.tinyreal) THEN
+
181 ijx(1:4)=floor(xij-1)+(/0,1,2,3/)
+
182 ijy(1:4)=floor(yij-1)+(/0,1,2,3/)
+
183 xf=xij-ijx(2)
+
184 yf=yij-ijy(2)
+
185 DO j=1,4
+
186 DO i=1,4
+
187 nxy(i,j,n) = grid_in%field_pos(ijx(i), ijy(j))
+
188 ENDDO
+
189 ENDDO
+
190 IF(minval(nxy(1:4,1:4,n)).GT.0) THEN
+
191 ! BICUBIC WHERE 16-POINT STENCIL IS AVAILABLE
+
192 nc(n)=1
+
193 wx(1)=xf*(1-xf)*(2-xf)/(-6.)
+
194 wx(2)=(xf+1)*(1-xf)*(2-xf)/2.
+
195 wx(3)=(xf+1)*xf*(2-xf)/2.
+
196 wx(4)=(xf+1)*xf*(1-xf)/(-6.)
+
197 wy(1)=yf*(1-yf)*(2-yf)/(-6.)
+
198 wy(2)=(yf+1)*(1-yf)*(2-yf)/2.
+
199 wy(3)=(yf+1)*yf*(2-yf)/2.
+
200 wy(4)=(yf+1)*yf*(1-yf)/(-6.)
+
201 ELSE
+
202 ! BILINEAR ELSEWHERE NEAR THE EDGE OF THE GRID
+
203 nc(n)=2
+
204 wx(1)=0
+
205 wx(2)=(1-xf)
+
206 wx(3)=xf
+
207 wx(4)=0
+
208 wy(1)=0
+
209 wy(2)=(1-yf)
+
210 wy(3)=yf
+
211 wy(4)=0
+
212 ENDIF
+
213 DO j=1,4
+
214 DO i=1,4
+
215 wxy(i,j,n)=wx(i)*wy(j)
+
216 ENDDO
+
217 ENDDO
+
218 ELSE
+
219 nc(n)=0
+
220 ENDIF
+
221 ENDDO
+
222 ENDIF
+
223 ENDIF
+
224 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
225 ! INTERPOLATE OVER ALL FIELDS
+
226 IF(iret.EQ.0.AND.iretx.EQ.0) THEN
+
227 IF(.not. to_station_points) THEN
+
228 no=nox
+
229 DO n=1,no
+
230 rlon(n)=rlonx(n)
+
231 rlat(n)=rlatx(n)
+
232 ENDDO
+
233 ENDIF
+
234 !$OMP PARALLEL DO PRIVATE(NK,K,N,G,W,GMIN,GMAX,J,I) SCHEDULE(STATIC)
+
235 DO nk=1,no*km
+
236 k=(nk-1)/no+1
+
237 n=nk-no*(k-1)
+
238 IF(nc(n).GT.0) THEN
+
239 g=0
+
240 w=0
+
241 IF(mcon.GT.0) gmin=huge(gmin)
+
242 IF(mcon.GT.0) gmax=-huge(gmax)
+
243 DO j=nc(n),5-nc(n)
+
244 DO i=nc(n),5-nc(n)
+
245 IF(nxy(i,j,n).GT.0)THEN
+
246 IF(ibi(k).EQ.0.OR.li(nxy(i,j,n),k))THEN
+
247 g=g+wxy(i,j,n)*gi(nxy(i,j,n),k)
+
248 w=w+wxy(i,j,n)
+
249 IF(mcon.GT.0) gmin=min(gmin,gi(nxy(i,j,n),k))
+
250 IF(mcon.GT.0) gmax=max(gmax,gi(nxy(i,j,n),k))
+
251 ENDIF
+
252 ENDIF
+
253 ENDDO
+
254 ENDDO
+
255 lo(n,k)=w.GE.pmp
+
256 IF(lo(n,k)) THEN
+
257 go(n,k)=g/w
+
258 IF(mcon.GT.0) go(n,k)=min(max(go(n,k),gmin),gmax)
+
259 ELSE
+
260 go(n,k)=0.
+
261 ENDIF
+
262 ELSE
+
263 lo(n,k)=.false.
+
264 go(n,k)=0.
+
265 ENDIF
+
266 ENDDO
+
267 DO k=1,km
+
268 ibo(k)=ibi(k)
+
269 IF(.NOT.all(lo(1:no,k))) ibo(k)=1
+
270 ENDDO
+
271 select type(grid_out)
+
272 type is(ip_equid_cylind_grid)
+
273 CALL polfixs(no,mo,km,rlat,ibo,lo,go)
+
274 end select
+
275 ELSE
+
276 IF(iret.EQ.0) iret=iretx
+
277 IF(.not. to_station_points) no=0
+
278 ENDIF
+
+
279 end subroutine interpolate_bicubic_scalar
+
280
+
+
338 subroutine interpolate_bicubic_vector(ipopt, grid_in, grid_out, &
+
339 mi, mo, km, ibi, li, ui, vi, &
+
340 no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
+
341 class(ip_grid), intent(in) :: grid_in, grid_out
+
342 INTEGER, INTENT(IN ) :: IPOPT(20)
+
343 INTEGER, INTENT(IN ) :: IBI(KM),MI,MO,KM
+
344 INTEGER, INTENT(INOUT) :: NO
+
345 INTEGER, INTENT( OUT) :: IRET, IBO(KM)
+
346 !
+
347 LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
+
348 LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
+
349 !
+
350 REAL, INTENT(IN ) :: UI(MI,KM),VI(MI,KM)
+
351 REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO),CROT(MO),SROT(MO)
+
352 REAL, INTENT( OUT) :: UO(MO,KM),VO(MO,KM)
+
353 !
+
354 REAL, PARAMETER :: FILL=-9999.
+
355 !
+
356 INTEGER :: IJX(4),IJY(4)
+
357 INTEGER :: MCON,MP,N,I,J,K,NK,NV
+
358 !
+
359 LOGICAL :: SAME_GRIDI,SAME_GRIDO
+
360 !
+
361 REAL :: CM,SM,UROT,VROT
+
362 REAL :: PMP,XIJ,YIJ,XF,YF
+
363 REAL :: U,V,W,UMIN,UMAX,VMIN,VMAX
+
364 REAL :: XPTS(MO),YPTS(MO)
+
365 REAL :: WX(4),WY(4)
+
366 REAL :: XPTI(MI),YPTI(MI),RLOI(MI),RLAI(MI)
+
367 REAL :: CROI(MI),SROI(MI)
+
368
+
369 logical :: to_station_points
+
370
+
371 ! Save coeffecients between calls and only compute if grids have changed
+
372 REAL, ALLOCATABLE, SAVE :: RLATX(:),RLONX(:),CROTX(:),SROTX(:)
+
373 REAL, ALLOCATABLE, SAVE :: WXY(:,:,:),CXY(:,:,:),SXY(:,:,:)
+
374 INTEGER, SAVE :: NOX=-1,iretx=-1
+
375 INTEGER, ALLOCATABLE, SAVE :: NXY(:,:,:),NC(:)
+
376 class(ip_grid), allocatable, save :: prev_grid_in, prev_grid_out
+
377 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
378 ! SET PARAMETERS
+
379 iret=0
+
380 mcon=ipopt(1)
+
381 mp=ipopt(2)
+
382 IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
+
383 IF(mp.LT.0.OR.mp.GT.100) iret=32
+
384 pmp=mp*0.01
+
385
+
386
+
387 if (.not. allocated(prev_grid_in) .or. .not. allocated(prev_grid_out)) then
+
388 allocate(prev_grid_in, source = grid_in)
+
389 allocate(prev_grid_out, source = grid_out)
+
390
+
391 same_gridi = .false.
+
392 same_grido = .false.
+
393 else
+
394 same_gridi = grid_in == prev_grid_in
+
395 same_grido = grid_out == prev_grid_out
+
396
+
397 if (.not. same_gridi .or. .not. same_grido) then
+
398 deallocate(prev_grid_in)
+
399 deallocate(prev_grid_out)
+
400
+
401 allocate(prev_grid_in, source = grid_in)
+
402 allocate(prev_grid_out, source = grid_out)
+
403 end if
+
404 end if
+
405
+
406 select type(grid_out)
+
407 type is(ip_station_points_grid)
+
408 to_station_points = .true.
+
409 class default
+
410 to_station_points = .false.
+
411 end select
+
412
+
413 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
414 ! SAVE OR SKIP WEIGHT COMPUTATION
+
415 IF(iret.EQ.0.AND.(to_station_points.OR..NOT.same_gridi.OR..NOT.same_grido))THEN
+
416 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
417 ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
+
418 CALL gdswzd(grid_out, 0,mo,fill,xpts,ypts,rlon,rlat,no,crot,srot)
+
419 IF(no.EQ.0) iret=3
+
420 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
421 ! LOCATE INPUT POINTS
+
422 CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv)
+
423 IF(iret.EQ.0.AND.nv.EQ.0) iret=2
+
424 CALL gdswzd(grid_in, 0,mi,fill,xpti,ypti,rloi,rlai,nv,croi,sroi)
+
425 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
426 ! ALLOCATE AND SAVE GRID DATA
+
427 IF(nox.NE.no) THEN
+
428 IF(nox.GE.0) DEALLOCATE(rlatx,rlonx,crotx,srotx,nc,nxy,wxy,cxy,sxy)
+
429 ALLOCATE(rlatx(no),rlonx(no),crotx(no),srotx(no),nc(no), &
+
430 nxy(4,4,no),wxy(4,4,no),cxy(4,4,no),sxy(4,4,no))
+
431 nox=no
+
432 ENDIF
+
433 iretx=iret
+
434 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
435 ! COMPUTE WEIGHTS
+
436 IF(iret.EQ.0) THEN
+
437 !$OMP PARALLEL DO PRIVATE(N,XIJ,YIJ,IJX,IJY,XF,YF,J,I,WX,WY,CM,SM) SCHEDULE(STATIC)
+
438 DO n=1,no
+
439 rlonx(n)=rlon(n)
+
440 rlatx(n)=rlat(n)
+
441 crotx(n)=crot(n)
+
442 srotx(n)=srot(n)
+
443 xij=xpts(n)
+
444 yij=ypts(n)
+
445 IF(abs(xij-fill).GT.tinyreal.AND.abs(yij-fill).GT.tinyreal) THEN
+
446 ijx(1:4)=floor(xij-1)+(/0,1,2,3/)
+
447 ijy(1:4)=floor(yij-1)+(/0,1,2,3/)
+
448 xf=xij-ijx(2)
+
449 yf=yij-ijy(2)
+
450 DO j=1,4
+
451 DO i=1,4
+
452 nxy(i,j,n) = grid_in%field_pos(ijx(i), ijy(j))
+
453 ENDDO
+
454 ENDDO
+
455 IF(minval(nxy(1:4,1:4,n)).GT.0) THEN
+
456 ! BICUBIC WHERE 16-POINT STENCIL IS AVAILABLE
+
457 nc(n)=1
+
458 wx(1)=xf*(1-xf)*(2-xf)/(-6.)
+
459 wx(2)=(xf+1)*(1-xf)*(2-xf)/2.
+
460 wx(3)=(xf+1)*xf*(2-xf)/2.
+
461 wx(4)=(xf+1)*xf*(1-xf)/(-6.)
+
462 wy(1)=yf*(1-yf)*(2-yf)/(-6.)
+
463 wy(2)=(yf+1)*(1-yf)*(2-yf)/2.
+
464 wy(3)=(yf+1)*yf*(2-yf)/2.
+
465 wy(4)=(yf+1)*yf*(1-yf)/(-6.)
+
466 ELSE
+
467 ! BILINEAR ELSEWHERE NEAR THE EDGE OF THE GRID
+
468 nc(n)=2
+
469 wx(1)=0
+
470 wx(2)=(1-xf)
+
471 wx(3)=xf
+
472 wx(4)=0
+
473 wy(1)=0
+
474 wy(2)=(1-yf)
+
475 wy(3)=yf
+
476 wy(4)=0
+
477 ENDIF
+
478 DO j=1,4
+
479 DO i=1,4
+
480 wxy(i,j,n)=wx(i)*wy(j)
+
481 IF(nxy(i,j,n).GT.0) THEN
+
482 CALL movect(rlai(nxy(i,j,n)),rloi(nxy(i,j,n)), &
+
483 rlat(n),rlon(n),cm,sm)
+
484 cxy(i,j,n)=cm*croi(nxy(i,j,n))+sm*sroi(nxy(i,j,n))
+
485 sxy(i,j,n)=sm*croi(nxy(i,j,n))-cm*sroi(nxy(i,j,n))
+
486 ENDIF
+
487 ENDDO
+
488 ENDDO
+
489 ELSE
+
490 nc(n)=0
+
491 ENDIF
+
492 ENDDO
+
493 ENDIF
+
494 ENDIF
+
495 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
496 ! INTERPOLATE OVER ALL FIELDS
+
497 IF(iret.EQ.0.AND.iretx.EQ.0) THEN
+
498 IF(.not. to_station_points) THEN
+
499 no=nox
+
500 DO n=1,no
+
501 rlon(n)=rlonx(n)
+
502 rlat(n)=rlatx(n)
+
503 crot(n)=crotx(n)
+
504 srot(n)=srotx(n)
+
505 ENDDO
+
506 ENDIF
+
507 !$OMP PARALLEL DO PRIVATE(NK,K,N,U,V,W,UMIN,UMAX,VMIN,VMAX,UROT,VROT,J,I) SCHEDULE(STATIC)
+
508 DO nk=1,no*km
+
509 k=(nk-1)/no+1
+
510 n=nk-no*(k-1)
+
511 IF(nc(n).GT.0) THEN
+
512 u=0
+
513 v=0
+
514 w=0
+
515 IF(mcon.GT.0) umin=huge(umin)
+
516 IF(mcon.GT.0) umax=-huge(umax)
+
517 IF(mcon.GT.0) vmin=huge(vmin)
+
518 IF(mcon.GT.0) vmax=-huge(vmax)
+
519 DO j=nc(n),5-nc(n)
+
520 DO i=nc(n),5-nc(n)
+
521 IF(nxy(i,j,n).GT.0) THEN
+
522 IF(ibi(k).EQ.0.OR.li(nxy(i,j,n),k)) THEN
+
523 urot=cxy(i,j,n)*ui(nxy(i,j,n),k)-sxy(i,j,n)*vi(nxy(i,j,n),k)
+
524 vrot=sxy(i,j,n)*ui(nxy(i,j,n),k)+cxy(i,j,n)*vi(nxy(i,j,n),k)
+
525 u=u+wxy(i,j,n)*urot
+
526 v=v+wxy(i,j,n)*vrot
+
527 w=w+wxy(i,j,n)
+
528 IF(mcon.GT.0) umin=min(umin,urot)
+
529 IF(mcon.GT.0) umax=max(umax,urot)
+
530 IF(mcon.GT.0) vmin=min(vmin,vrot)
+
531 IF(mcon.GT.0) vmax=max(vmax,vrot)
+
532 ENDIF
+
533 ENDIF
+
534 ENDDO
+
535 ENDDO
+
536 lo(n,k)=w.GE.pmp
+
537 IF(lo(n,k)) THEN
+
538 urot=crot(n)*u-srot(n)*v
+
539 vrot=srot(n)*u+crot(n)*v
+
540 uo(n,k)=urot/w
+
541 vo(n,k)=vrot/w
+
542 IF(mcon.GT.0) uo(n,k)=min(max(uo(n,k),umin),umax)
+
543 IF(mcon.GT.0) vo(n,k)=min(max(vo(n,k),vmin),vmax)
+
544 ELSE
+
545 uo(n,k)=0.
+
546 vo(n,k)=0.
+
547 ENDIF
+
548 ELSE
+
549 lo(n,k)=.false.
+
550 uo(n,k)=0.
+
551 vo(n,k)=0.
+
552 ENDIF
+
553 ENDDO
+
554 DO k=1,km
+
555 ibo(k)=ibi(k)
+
556 IF(.NOT.all(lo(1:no,k))) ibo(k)=1
+
557 ENDDO
+
558 select type(grid_out)
+
559 type is(ip_equid_cylind_grid)
+
560 CALL polfixv(no,mo,km,rlat,rlon,ibo,lo,uo,vo)
+
561 end select
+
562 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
563 ELSE
+
564 IF(iret.EQ.0) iret=iretx
+
565 IF(.not. to_station_points) no=0
+
566 ENDIF
+
567 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+
568 end subroutine interpolate_bicubic_vector
+
569
+
570end module bicubic_interp_mod
+ + +
subroutine movect(flat, flon, tlat, tlon, crot, srot)
This subprogram provides the rotation parameters to move a vector along a great circle from one posit...
Definition movect.F90:26
+
Bicubic interpolation routines for scalars and vectors.
+
subroutine interpolate_bicubic_vector(ipopt, grid_in, grid_out, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
This subprogram performs bicubic interpolation from any grid to any grid for vector fields.
+
subroutine interpolate_bicubic_scalar(ipopt, grid_in, grid_out, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
This subprogram performs bicubic interpolation from any grid to any grid for scalar fields.
+
Driver module for gdswzd routines.
+
Re-export the individual grids.
+
Make multiple pole scalar values consistent.
Definition polfix_mod.F90:7
+
subroutine, public polfixs(nm, nx, km, rlat, ib, lo, go)
Make multiple pole scalar values consistent.
+
subroutine, public polfixv(nm, nx, km, rlat, rlon, ib, lo, uo, vo)
Make multiple pole vector values consistent,.
diff --git a/bilinear__interp__mod_8F90.html b/bilinear__interp__mod_8F90.html index f289e4f4..84a98309 100644 --- a/bilinear__interp__mod_8F90.html +++ b/bilinear__interp__mod_8F90.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: bilinear_interp_mod.F90 File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,9 +76,16 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
@@ -86,8 +93,7 @@ Data Types | Modules | Functions/Subroutines
-
-
bilinear_interp_mod.F90 File Reference
+
bilinear_interp_mod.F90 File Reference
@@ -96,25 +102,25 @@

Go to the source code of this file.

-

+

Data Types

interface  bilinear_interp_mod::interpolate_bilinear
 
- - +

+

Modules

module  bilinear_interp_mod
module  bilinear_interp_mod
 Bilinear interpolation routines for scalars and vectors.
 
- - - - - - - + + + + + +

+

Functions/Subroutines

subroutine bilinear_interp_mod::interpolate_bilinear_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
 This subprogram performs bilinear interpolation from any grid to any grid for scalar fields. More...
 
subroutine bilinear_interp_mod::interpolate_bilinear_vector (ipopt, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
 This subprogram performs bilinear interpolation from any grid to any grid for vector fields. More...
 
subroutine bilinear_interp_mod::interpolate_bilinear_scalar (ipopt, grid_in, grid_out, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
 This subprogram performs bilinear interpolation from any grid to any grid for scalar fields.
 
subroutine bilinear_interp_mod::interpolate_bilinear_vector (ipopt, grid_in, grid_out, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
 This subprogram performs bilinear interpolation from any grid to any grid for vector fields.
 

Detailed Description

Bilinear interpolation routines for scalars and vectors.

@@ -127,7 +133,7 @@ diff --git a/bilinear__interp__mod_8F90.js b/bilinear__interp__mod_8F90.js index 27b7b9c0..915178cc 100644 --- a/bilinear__interp__mod_8F90.js +++ b/bilinear__interp__mod_8F90.js @@ -1,6 +1,6 @@ var bilinear__interp__mod_8F90 = [ - [ "interpolate_bilinear", "interfacebilinear__interp__mod_1_1interpolate__bilinear.html", "interfacebilinear__interp__mod_1_1interpolate__bilinear" ], - [ "interpolate_bilinear_scalar", "bilinear__interp__mod_8F90.html#a34d2eea4682104097dccf3e7ab6a9398", null ], - [ "interpolate_bilinear_vector", "bilinear__interp__mod_8F90.html#abc218f8774d2af09299eb299d6f38e04", null ] + [ "bilinear_interp_mod::interpolate_bilinear", "interfacebilinear__interp__mod_1_1interpolate__bilinear.html", "interfacebilinear__interp__mod_1_1interpolate__bilinear" ], + [ "interpolate_bilinear_scalar", "bilinear__interp__mod_8F90.html#a3aac4f2311edefcd9d3a54f7fe64bcf6", null ], + [ "interpolate_bilinear_vector", "bilinear__interp__mod_8F90.html#ae3caf32c6b95b5c00f26da3601ceef93", null ] ]; \ No newline at end of file diff --git a/bilinear__interp__mod_8F90_source.html b/bilinear__interp__mod_8F90_source.html index 810f6f11..44468298 100644 --- a/bilinear__interp__mod_8F90_source.html +++ b/bilinear__interp__mod_8F90_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: bilinear_interp_mod.F90 Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,458 +81,470 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
bilinear_interp_mod.F90
+
bilinear_interp_mod.F90
-Go to the documentation of this file.
1 
-
4 
- -
9  use gdswzd_mod
-
10  use ip_grids_mod
- - -
13  use polfix_mod
-
14  implicit none
-
15 
-
16  private
-
17  public :: interpolate_bilinear
-
18 
- -
20  module procedure interpolate_bilinear_scalar
-
21  module procedure interpolate_bilinear_vector
-
22  end interface interpolate_bilinear
-
23 
-
24  ! Smallest positive real value (use for equality comparisons)
-
25  REAL :: TINYREAL=tiny(1.0)
-
26 
-
27 contains
-
28 
-
72  subroutine interpolate_bilinear_scalar(IPOPT,grid_in,grid_out,MI,MO,KM,IBI,LI,GI,NO,RLAT,RLON,IBO,LO,GO,IRET)
-
73  class(ip_grid), intent(in) :: grid_in, grid_out
-
74  INTEGER, INTENT(IN ) :: IPOPT(20)
-
75  INTEGER, INTENT(IN ) :: MI,MO,KM
-
76  INTEGER, INTENT(IN ) :: IBI(KM)
-
77  INTEGER, INTENT(INOUT) :: NO
-
78  INTEGER, INTENT( OUT) :: IRET, IBO(KM)
-
79  !
-
80  LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
-
81  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
-
82  !
-
83  REAL, INTENT(IN ) :: GI(MI,KM)
-
84  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO)
-
85  REAL, INTENT( OUT) :: GO(MO,KM)
-
86  !
-
87  REAL, PARAMETER :: FILL=-9999.
-
88  !
-
89  INTEGER :: IJX(2),IJY(2)
-
90  INTEGER :: MP,N,I,J,K
-
91  INTEGER :: NK,NV
-
92  INTEGER :: MSPIRAL,I1,J1,IXS,JXS
-
93  INTEGER :: MX,KXS,KXT,IX,JX,NX
-
94  !
-
95  LOGICAL :: SAME_GRIDI, SAME_GRIDO
-
96  !
-
97  REAL :: WX(2),WY(2)
-
98  REAL :: XPTS(MO),YPTS(MO)
-
99  REAL :: PMP,XIJ,YIJ,XF,YF,G,W
-
100 
-
101  logical :: to_station_points
-
102 
-
103  ! Save coeffecients between calls and only compute if grids have changed
-
104  INTEGER, SAVE :: NOX=-1,iretx=-1
-
105  INTEGER, ALLOCATABLE,SAVE :: NXY(:,:,:)
-
106  REAL, ALLOCATABLE,SAVE :: RLATX(:),RLONX(:)
-
107  REAL, ALLOCATABLE,SAVE :: WXY(:,:,:)
-
108  class(ip_grid), allocatable,save :: prev_grid_in, prev_grid_out
-
109 
-
110  iret=0
-
111  mp=ipopt(1)
-
112  IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
-
113  IF(mp.LT.0.OR.mp.GT.100) iret=32
-
114  pmp=mp*0.01
-
115  mspiral=max(ipopt(2),0)
-
116 
-
117  if (.not. allocated(prev_grid_in) .or. .not. allocated(prev_grid_out)) then
-
118  allocate(prev_grid_in, source = grid_in)
-
119  allocate(prev_grid_out, source = grid_out)
-
120 
-
121  same_gridi = .false.
-
122  same_grido = .false.
-
123  else
-
124  same_gridi = grid_in == prev_grid_in
-
125  same_grido = grid_out == prev_grid_out
-
126 
-
127  if (.not. same_gridi .or. .not. same_grido) then
-
128  deallocate(prev_grid_in)
-
129  deallocate(prev_grid_out)
-
130 
-
131  allocate(prev_grid_in, source = grid_in)
-
132  allocate(prev_grid_out, source = grid_out)
-
133  end if
-
134  end if
-
135 
-
136  select type(grid_out)
-
137  type is(ip_station_points_grid)
-
138  to_station_points = .true.
-
139  class default
-
140  to_station_points = .false.
-
141  end select
-
142 
-
143  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
144  ! SAVE OR SKIP WEIGHT COMPUTATION
-
145  IF(iret==0.AND.(to_station_points.OR..NOT.same_gridi.OR..NOT.same_grido))THEN
-
146  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
147  ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
-
148  CALL gdswzd(grid_out, 0,mo,fill,xpts,ypts,rlon,rlat,no)
-
149  IF(no.EQ.0) iret=3
-
150  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
151  ! LOCATE INPUT POINTS
-
152  CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv)
-
153  IF(iret.EQ.0.AND.nv.EQ.0) iret=2
-
154  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
155  ! ALLOCATE AND SAVE GRID DATA
-
156  IF(nox.NE.no) THEN
-
157  IF(nox.GE.0) DEALLOCATE(rlatx,rlonx,nxy,wxy)
-
158  ALLOCATE(rlatx(no),rlonx(no),nxy(2,2,no),wxy(2,2,no))
-
159  nox=no
-
160  ENDIF
-
161  iretx=iret
-
162  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
163  ! COMPUTE WEIGHTS
-
164  IF(iret.EQ.0) THEN
-
165  !$OMP PARALLEL DO PRIVATE(N,XIJ,YIJ,IJX,IJY,XF,YF,J,I,WX,WY) SCHEDULE(STATIC)
-
166  DO n=1,no
-
167  rlonx(n)=rlon(n)
-
168  rlatx(n)=rlat(n)
-
169  xij=xpts(n)
-
170  yij=ypts(n)
-
171  IF(abs(xij-fill).GT.tinyreal.AND.abs(yij-fill).GT.tinyreal) THEN
-
172  ijx(1:2)=floor(xij)+(/0,1/)
-
173  ijy(1:2)=floor(yij)+(/0,1/)
-
174  xf=xij-ijx(1)
-
175  yf=yij-ijy(1)
-
176  wx(1)=(1-xf)
-
177  wx(2)=xf
-
178  wy(1)=(1-yf)
-
179  wy(2)=yf
-
180  DO j=1,2
-
181  DO i=1,2
-
182  nxy(i,j,n)=grid_in%field_pos(ijx(i), ijy(j))
-
183  wxy(i,j,n)=wx(i)*wy(j)
-
184  ENDDO
-
185  ENDDO
-
186  ELSE
-
187  nxy(:,:,n)=0
-
188  ENDIF
-
189  ENDDO
-
190  ENDIF
-
191  ENDIF
-
192  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
193  ! INTERPOLATE OVER ALL FIELDS
-
194  IF(iret.EQ.0.AND.iretx.EQ.0) THEN
-
195  IF(.not. to_station_points) THEN
-
196  no=nox
-
197  DO n=1,no
-
198  rlon(n)=rlonx(n)
-
199  rlat(n)=rlatx(n)
-
200  ENDDO
-
201  ENDIF
-
202  !$OMP PARALLEL DO &
-
203  !$OMP PRIVATE(NK,K,N,G,W,J,I) &
-
204  !$OMP PRIVATE(I1,J1,IXS,JXS,MX,KXS,KXT,IX,JX,NX) SCHEDULE(STATIC)
-
205  DO nk=1,no*km
-
206  k=(nk-1)/no+1
-
207  n=nk-no*(k-1)
-
208  g=0
-
209  w=0
-
210  DO j=1,2
-
211  DO i=1,2
-
212  IF(nxy(i,j,n).GT.0)THEN
-
213  IF(ibi(k).EQ.0.OR.li(nxy(i,j,n),k)) THEN
-
214  g=g+wxy(i,j,n)*gi(nxy(i,j,n),k)
-
215  w=w+wxy(i,j,n)
-
216  ENDIF
-
217  ENDIF
-
218  ENDDO
-
219  ENDDO
-
220  lo(n,k)=w.GE.pmp
-
221  IF(lo(n,k)) THEN
-
222  go(n,k)=g/w
-
223  ELSEIF(mspiral.GT.0.AND.abs(xpts(n)-fill).GT.tinyreal.AND.abs(ypts(n)-fill).GT.tinyreal) THEN
-
224  i1=nint(xpts(n))
-
225  j1=nint(ypts(n))
-
226  ixs=int(sign(1.,xpts(n)-i1))
-
227  jxs=int(sign(1.,ypts(n)-j1))
-
228  spiral : DO mx=1,mspiral**2
-
229  kxs=int(sqrt(4*mx-2.5))
-
230  kxt=mx-(kxs**2/4+1)
-
231  SELECT CASE(mod(kxs,4))
-
232  CASE(1)
-
233  ix=i1-ixs*(kxs/4-kxt)
-
234  jx=j1-jxs*kxs/4
-
235  CASE(2)
-
236  ix=i1+ixs*(1+kxs/4)
-
237  jx=j1-jxs*(kxs/4-kxt)
-
238  CASE(3)
-
239  ix=i1+ixs*(1+kxs/4-kxt)
-
240  jx=j1+jxs*(1+kxs/4)
-
241  CASE DEFAULT
-
242  ix=i1-ixs*kxs/4
-
243  jx=j1+jxs*(kxs/4-kxt)
-
244  END SELECT
-
245  nx=grid_in%field_pos(ix, jx)
-
246  IF(nx.GT.0.)THEN
-
247  IF(li(nx,k).OR.ibi(k).EQ.0)THEN
-
248  go(n,k)=gi(nx,k)
-
249  lo(n,k)=.true.
-
250  EXIT spiral
-
251  ENDIF
-
252  ENDIF
-
253  ENDDO spiral
-
254  IF(.NOT.lo(n,k))THEN
-
255  ibo(k)=1
-
256  go(n,k)=0.
-
257  ENDIF
-
258  ELSE
-
259  go(n,k)=0.
-
260  ENDIF
-
261  ENDDO
-
262  DO k=1,km
-
263  ibo(k)=ibi(k)
-
264  IF(.NOT.all(lo(1:no,k))) ibo(k)=1
-
265  ENDDO
-
266  select type(grid_out)
-
267  type is(ip_equid_cylind_grid)
-
268  CALL polfixs(no,mo,km,rlat,ibo,lo,go)
-
269  end select
-
270  ELSE
-
271  IF(iret.EQ.0) iret=iretx
-
272  IF(.not. to_station_points) no=0
-
273  ENDIF
-
274 
-
275  end subroutine interpolate_bilinear_scalar
-
276 
-
329  SUBROUTINE interpolate_bilinear_vector(ipopt,grid_in,grid_out, &
-
330  MI,MO,KM,IBI,LI,UI,VI, &
-
331  NO,RLAT,RLON,CROT,SROT,IBO,LO,UO,VO,IRET)
-
332  class(ip_grid), intent(in) :: grid_in, grid_out
-
333  INTEGER, INTENT(IN ) :: IPOPT(20),IBI(KM),MI,MO,KM
-
334  INTEGER, INTENT(INOUT) :: NO
-
335  INTEGER, INTENT( OUT) :: IRET, IBO(KM)
-
336  !
-
337  LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
-
338  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
-
339  !
-
340  REAL, INTENT(IN ) :: UI(MI,KM),VI(MI,KM)
-
341  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO),CROT(MO),SROT(MO)
-
342  REAL, INTENT( OUT) :: UO(MO,KM),VO(MO,KM)
-
343  !
-
344  REAL, PARAMETER :: FILL=-9999.
-
345  !
-
346  INTEGER :: IJX(2),IJY(2)
-
347  INTEGER :: MP,N,I,J,K,NK,NV
-
348  !
-
349  LOGICAL :: SAME_GRIDI, SAME_GRIDO
-
350  !
-
351  REAL :: CM,SM,UROT,VROT
-
352  REAL :: PMP,XIJ,YIJ,XF,YF,U,V,W
-
353  REAL :: XPTS(MO),YPTS(MO)
-
354  REAL :: WX(2),WY(2)
-
355  REAL :: XPTI(MI),YPTI(MI)
-
356  REAL :: RLOI(MI),RLAI(MI)
-
357  REAL :: CROI(MI),SROI(MI)
-
358 
-
359  logical :: to_station_points
-
360 
-
361  ! Save coeffecients between calls and only compute if grids have changed
-
362  INTEGER, SAVE :: NOX=-1,iretx=-1
-
363  INTEGER, ALLOCATABLE,SAVE :: NXY(:,:,:)
-
364  REAL, ALLOCATABLE,SAVE :: RLATX(:),RLONX(:)
-
365  REAL, ALLOCATABLE,SAVE :: CROTX(:),SROTX(:)
-
366  REAL, ALLOCATABLE,SAVE :: WXY(:,:,:),CXY(:,:,:),SXY(:,:,:)
-
367  class(ip_grid), allocatable,save :: prev_grid_in, prev_grid_out
-
368 
-
369  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
370  ! SET PARAMETERS
-
371  iret=0
-
372  mp=ipopt(1)
-
373  IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
-
374  IF(mp.LT.0.OR.mp.GT.100) iret=32
-
375  pmp=mp*0.01
-
376 
-
377  if (.not. allocated(prev_grid_in) .or. .not. allocated(prev_grid_out)) then
-
378  allocate(prev_grid_in, source = grid_in)
-
379  allocate(prev_grid_out, source = grid_out)
-
380 
-
381  same_gridi = .false.
-
382  same_grido = .false.
-
383  else
-
384  same_gridi = grid_in == prev_grid_in
-
385  same_grido = grid_out == prev_grid_out
-
386 
-
387  if (.not. same_gridi .or. .not. same_grido) then
-
388  deallocate(prev_grid_in)
-
389  deallocate(prev_grid_out)
-
390 
-
391  allocate(prev_grid_in, source = grid_in)
-
392  allocate(prev_grid_out, source = grid_out)
-
393  end if
-
394  end if
-
395 
-
396  select type(grid_out)
-
397  type is(ip_station_points_grid)
-
398  to_station_points = .true.
-
399  class default
-
400  to_station_points = .false.
-
401  end select
-
402 
-
403  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
404  ! SAVE OR SKIP WEIGHT COMPUTATION
-
405  IF(iret.EQ.0.AND.(to_station_points.OR..NOT.same_gridi.OR..NOT.same_grido))THEN
-
406  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
407  ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
-
408  CALL gdswzd(grid_out, 0,mo,fill,xpts,ypts,rlon,rlat,no,crot,srot)
-
409  IF(no.EQ.0) iret=3
-
410  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
411  ! LOCATE INPUT POINTS
-
412  CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv)
-
413  IF(iret.EQ.0.AND.nv.EQ.0) iret=2
-
414  CALL gdswzd(grid_in, 0,mi,fill,xpti,ypti,rloi,rlai,nv,croi,sroi)
-
415  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
416  ! ALLOCATE AND SAVE GRID DATA
-
417  IF(nox.NE.no) THEN
-
418  IF(nox.GE.0) DEALLOCATE(rlatx,rlonx,crotx,srotx,nxy,wxy,cxy,sxy)
-
419  ALLOCATE(rlatx(no),rlonx(no),crotx(no),srotx(no), &
-
420  nxy(2,2,no),wxy(2,2,no),cxy(2,2,no),sxy(2,2,no))
-
421  nox=no
-
422  ENDIF
-
423  iretx=iret
-
424  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
425  ! COMPUTE WEIGHTS
-
426  IF(iret.EQ.0) THEN
-
427  !$OMP PARALLEL DO PRIVATE(N,XIJ,YIJ,IJX,IJY,XF,YF,J,I,WX,WY,CM,SM) SCHEDULE(STATIC)
-
428  DO n=1,no
-
429  rlonx(n)=rlon(n)
-
430  rlatx(n)=rlat(n)
-
431  crotx(n)=crot(n)
-
432  srotx(n)=srot(n)
-
433  xij=xpts(n)
-
434  yij=ypts(n)
-
435  IF(abs(xij-fill).GT.tinyreal.AND.abs(yij-fill).GT.tinyreal) THEN
-
436  ijx(1:2)=floor(xij)+(/0,1/)
-
437  ijy(1:2)=floor(yij)+(/0,1/)
-
438  xf=xij-ijx(1)
-
439  yf=yij-ijy(1)
-
440  wx(1)=(1-xf)
-
441  wx(2)=xf
-
442  wy(1)=(1-yf)
-
443  wy(2)=yf
-
444  DO j=1,2
-
445  DO i=1,2
-
446  nxy(i, j, n) = grid_in%field_pos(ijx(i), ijy(j))
-
447  wxy(i,j,n)=wx(i)*wy(j)
-
448  IF(nxy(i,j,n).GT.0) THEN
-
449  CALL movect(rlai(nxy(i,j,n)),rloi(nxy(i,j,n)), &
-
450  rlat(n),rlon(n),cm,sm)
-
451  cxy(i,j,n)=cm*croi(nxy(i,j,n))+sm*sroi(nxy(i,j,n))
-
452  sxy(i,j,n)=sm*croi(nxy(i,j,n))-cm*sroi(nxy(i,j,n))
-
453  ENDIF
-
454  ENDDO
-
455  ENDDO
-
456  ELSE
-
457  nxy(:,:,n)=0
-
458  ENDIF
-
459  ENDDO
-
460  ENDIF ! IS IRET 0?
-
461  ENDIF
-
462  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
463  ! INTERPOLATE OVER ALL FIELDS
-
464  IF(iret.EQ.0.AND.iretx.EQ.0) THEN
-
465  IF(.not. to_station_points) THEN
-
466  no=nox
-
467  DO n=1,no
-
468  rlon(n)=rlonx(n)
-
469  rlat(n)=rlatx(n)
-
470  crot(n)=crotx(n)
-
471  srot(n)=srotx(n)
-
472  ENDDO
-
473  ENDIF
-
474  !$OMP PARALLEL DO PRIVATE(NK,K,N,U,V,W,UROT,VROT,J,I) SCHEDULE(STATIC)
-
475  DO nk=1,no*km
-
476  k=(nk-1)/no+1
-
477  n=nk-no*(k-1)
-
478  u=0
-
479  v=0
-
480  w=0
-
481  DO j=1,2
-
482  DO i=1,2
-
483  IF(nxy(i,j,n).GT.0) THEN
-
484  IF(ibi(k).EQ.0.OR.li(nxy(i,j,n),k)) THEN
-
485  urot=cxy(i,j,n)*ui(nxy(i,j,n),k)-sxy(i,j,n)*vi(nxy(i,j,n),k)
-
486  vrot=sxy(i,j,n)*ui(nxy(i,j,n),k)+cxy(i,j,n)*vi(nxy(i,j,n),k)
-
487  u=u+wxy(i,j,n)*urot
-
488  v=v+wxy(i,j,n)*vrot
-
489  w=w+wxy(i,j,n)
-
490  ENDIF
-
491  ENDIF
-
492  ENDDO
-
493  ENDDO
-
494  lo(n,k)=w.GE.pmp
-
495  IF(lo(n,k)) THEN
-
496  urot=crot(n)*u-srot(n)*v
-
497  vrot=srot(n)*u+crot(n)*v
-
498  uo(n,k)=urot/w
-
499  vo(n,k)=vrot/w
-
500  ELSE
-
501  uo(n,k)=0.
-
502  vo(n,k)=0.
-
503  ENDIF
-
504  ENDDO ! NK LOOP
-
505  DO k=1,km
-
506  ibo(k)=ibi(k)
-
507  IF(.NOT.all(lo(1:no,k))) ibo(k)=1
-
508  ENDDO
-
509 
-
510  select type(grid_out)
-
511  type is(ip_equid_cylind_grid)
-
512  CALL polfixv(no,mo,km,rlat,rlon,ibo,lo,uo,vo)
-
513  end select
-
514 
-
515  ELSE
-
516  IF(iret.EQ.0) iret=iretx
-
517  IF(.not. to_station_points) no=0
-
518  ENDIF
-
519  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
520  END SUBROUTINE interpolate_bilinear_vector
-
521 
-
522 end module bilinear_interp_mod
- - -
subroutine movect(FLAT, FLON, TLAT, TLON, CROT, SROT)
This subprogram provides the rotation parameters to move a vector along a great circle from one posit...
Definition: movect.F90:26
-
Bilinear interpolation routines for scalars and vectors.
-
subroutine interpolate_bilinear_scalar(IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
This subprogram performs bilinear interpolation from any grid to any grid for scalar fields.
-
subroutine interpolate_bilinear_vector(ipopt, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
This subprogram performs bilinear interpolation from any grid to any grid for vector fields.
-
Driver module for gdswzd routines.
Definition: gdswzd_mod.F90:25
-
Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
-
Routines for creating an ip_grid given a Grib descriptor.
-
Re-export the individual grids.
Definition: ip_grids_mod.F90:7
-
Make multiple pole scalar values consistent.
Definition: polfix_mod.F90:7
-
subroutine, public polfixs(NM, NX, KM, RLAT, IB, LO, GO)
Make multiple pole scalar values consistent.
Definition: polfix_mod.F90:30
-
subroutine, public polfixv(NM, NX, KM, RLAT, RLON, IB, LO, UO, VO)
Make multiple pole vector values consistent,.
Definition: polfix_mod.F90:125
+Go to the documentation of this file.
1
+
4
+ +
9 use gdswzd_mod
+
10 use ip_grids_mod
+ + +
13 use polfix_mod
+
14 implicit none
+
15
+
16 private
+
17 public :: interpolate_bilinear
+
18
+
+ +
20 module procedure interpolate_bilinear_scalar
+
21 module procedure interpolate_bilinear_vector
+
+
22 end interface interpolate_bilinear
+
23
+
24 ! Smallest positive real value (use for equality comparisons)
+
25 REAL :: TINYREAL=tiny(1.0)
+
26
+
27contains
+
28
+
+
72 subroutine interpolate_bilinear_scalar(IPOPT,grid_in,grid_out,MI,MO,KM,IBI,LI,GI,NO,RLAT,RLON,IBO,LO,GO,IRET)
+
73 class(ip_grid), intent(in) :: grid_in, grid_out
+
74 INTEGER, INTENT(IN ) :: IPOPT(20)
+
75 INTEGER, INTENT(IN ) :: MI,MO,KM
+
76 INTEGER, INTENT(IN ) :: IBI(KM)
+
77 INTEGER, INTENT(INOUT) :: NO
+
78 INTEGER, INTENT( OUT) :: IRET, IBO(KM)
+
79 !
+
80 LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
+
81 LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
+
82 !
+
83 REAL, INTENT(IN ) :: GI(MI,KM)
+
84 REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO)
+
85 REAL, INTENT( OUT) :: GO(MO,KM)
+
86 !
+
87 REAL, PARAMETER :: FILL=-9999.
+
88 !
+
89 INTEGER :: IJX(2),IJY(2)
+
90 INTEGER :: MP,N,I,J,K
+
91 INTEGER :: NK,NV
+
92 INTEGER :: MSPIRAL,I1,J1,IXS,JXS
+
93 INTEGER :: MX,KXS,KXT,IX,JX,NX
+
94 !
+
95 LOGICAL :: SAME_GRIDI, SAME_GRIDO
+
96 !
+
97 REAL :: WX(2),WY(2)
+
98 REAL :: XPTS(MO),YPTS(MO)
+
99 REAL :: PMP,XIJ,YIJ,XF,YF,G,W
+
100
+
101 logical :: to_station_points
+
102
+
103 ! Save coeffecients between calls and only compute if grids have changed
+
104 INTEGER, SAVE :: NOX=-1,iretx=-1
+
105 INTEGER, ALLOCATABLE,SAVE :: NXY(:,:,:)
+
106 REAL, ALLOCATABLE,SAVE :: RLATX(:),RLONX(:)
+
107 REAL, ALLOCATABLE,SAVE :: WXY(:,:,:)
+
108 class(ip_grid), allocatable,save :: prev_grid_in, prev_grid_out
+
109
+
110 iret=0
+
111 mp=ipopt(1)
+
112 IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
+
113 IF(mp.LT.0.OR.mp.GT.100) iret=32
+
114 pmp=mp*0.01
+
115 mspiral=max(ipopt(2),0)
+
116
+
117 if (.not. allocated(prev_grid_in) .or. .not. allocated(prev_grid_out)) then
+
118 allocate(prev_grid_in, source = grid_in)
+
119 allocate(prev_grid_out, source = grid_out)
+
120
+
121 same_gridi = .false.
+
122 same_grido = .false.
+
123 else
+
124 same_gridi = grid_in == prev_grid_in
+
125 same_grido = grid_out == prev_grid_out
+
126
+
127 if (.not. same_gridi .or. .not. same_grido) then
+
128 deallocate(prev_grid_in)
+
129 deallocate(prev_grid_out)
+
130
+
131 allocate(prev_grid_in, source = grid_in)
+
132 allocate(prev_grid_out, source = grid_out)
+
133 end if
+
134 end if
+
135
+
136 select type(grid_out)
+
137 type is(ip_station_points_grid)
+
138 to_station_points = .true.
+
139 class default
+
140 to_station_points = .false.
+
141 end select
+
142
+
143 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
144 ! SAVE OR SKIP WEIGHT COMPUTATION
+
145 IF(iret==0.AND.(to_station_points.OR..NOT.same_gridi.OR..NOT.same_grido))THEN
+
146 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
147 ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
+
148 CALL gdswzd(grid_out, 0,mo,fill,xpts,ypts,rlon,rlat,no)
+
149 IF(no.EQ.0) iret=3
+
150 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
151 ! LOCATE INPUT POINTS
+
152 CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv)
+
153 IF(iret.EQ.0.AND.nv.EQ.0) iret=2
+
154 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
155 ! ALLOCATE AND SAVE GRID DATA
+
156 IF(nox.NE.no) THEN
+
157 IF(nox.GE.0) DEALLOCATE(rlatx,rlonx,nxy,wxy)
+
158 ALLOCATE(rlatx(no),rlonx(no),nxy(2,2,no),wxy(2,2,no))
+
159 nox=no
+
160 ENDIF
+
161 iretx=iret
+
162 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
163 ! COMPUTE WEIGHTS
+
164 IF(iret.EQ.0) THEN
+
165 !$OMP PARALLEL DO PRIVATE(N,XIJ,YIJ,IJX,IJY,XF,YF,J,I,WX,WY) SCHEDULE(STATIC)
+
166 DO n=1,no
+
167 rlonx(n)=rlon(n)
+
168 rlatx(n)=rlat(n)
+
169 xij=xpts(n)
+
170 yij=ypts(n)
+
171 IF(abs(xij-fill).GT.tinyreal.AND.abs(yij-fill).GT.tinyreal) THEN
+
172 ijx(1:2)=floor(xij)+(/0,1/)
+
173 ijy(1:2)=floor(yij)+(/0,1/)
+
174 xf=xij-ijx(1)
+
175 yf=yij-ijy(1)
+
176 wx(1)=(1-xf)
+
177 wx(2)=xf
+
178 wy(1)=(1-yf)
+
179 wy(2)=yf
+
180 DO j=1,2
+
181 DO i=1,2
+
182 nxy(i,j,n)=grid_in%field_pos(ijx(i), ijy(j))
+
183 wxy(i,j,n)=wx(i)*wy(j)
+
184 ENDDO
+
185 ENDDO
+
186 ELSE
+
187 nxy(:,:,n)=0
+
188 ENDIF
+
189 ENDDO
+
190 ENDIF
+
191 ENDIF
+
192 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
193 ! INTERPOLATE OVER ALL FIELDS
+
194 IF(iret.EQ.0.AND.iretx.EQ.0) THEN
+
195 IF(.not. to_station_points) THEN
+
196 no=nox
+
197 DO n=1,no
+
198 rlon(n)=rlonx(n)
+
199 rlat(n)=rlatx(n)
+
200 ENDDO
+
201 ENDIF
+
202 !$OMP PARALLEL DO &
+
203 !$OMP PRIVATE(NK,K,N,G,W,J,I) &
+
204 !$OMP PRIVATE(I1,J1,IXS,JXS,MX,KXS,KXT,IX,JX,NX) SCHEDULE(STATIC)
+
205 DO nk=1,no*km
+
206 k=(nk-1)/no+1
+
207 n=nk-no*(k-1)
+
208 g=0
+
209 w=0
+
210 DO j=1,2
+
211 DO i=1,2
+
212 IF(nxy(i,j,n).GT.0)THEN
+
213 IF(ibi(k).EQ.0.OR.li(nxy(i,j,n),k)) THEN
+
214 g=g+wxy(i,j,n)*gi(nxy(i,j,n),k)
+
215 w=w+wxy(i,j,n)
+
216 ENDIF
+
217 ENDIF
+
218 ENDDO
+
219 ENDDO
+
220 lo(n,k)=w.GE.pmp
+
221 IF(lo(n,k)) THEN
+
222 go(n,k)=g/w
+
223 ELSEIF(mspiral.GT.0.AND.abs(xpts(n)-fill).GT.tinyreal.AND.abs(ypts(n)-fill).GT.tinyreal) THEN
+
224 i1=nint(xpts(n))
+
225 j1=nint(ypts(n))
+
226 ixs=int(sign(1.,xpts(n)-i1))
+
227 jxs=int(sign(1.,ypts(n)-j1))
+
228 spiral : DO mx=1,mspiral**2
+
229 kxs=int(sqrt(4*mx-2.5))
+
230 kxt=mx-(kxs**2/4+1)
+
231 SELECT CASE(mod(kxs,4))
+
232 CASE(1)
+
233 ix=i1-ixs*(kxs/4-kxt)
+
234 jx=j1-jxs*kxs/4
+
235 CASE(2)
+
236 ix=i1+ixs*(1+kxs/4)
+
237 jx=j1-jxs*(kxs/4-kxt)
+
238 CASE(3)
+
239 ix=i1+ixs*(1+kxs/4-kxt)
+
240 jx=j1+jxs*(1+kxs/4)
+
241 CASE DEFAULT
+
242 ix=i1-ixs*kxs/4
+
243 jx=j1+jxs*(kxs/4-kxt)
+
244 END SELECT
+
245 nx=grid_in%field_pos(ix, jx)
+
246 IF(nx.GT.0.)THEN
+
247 IF(li(nx,k).OR.ibi(k).EQ.0)THEN
+
248 go(n,k)=gi(nx,k)
+
249 lo(n,k)=.true.
+
250 EXIT spiral
+
251 ENDIF
+
252 ENDIF
+
253 ENDDO spiral
+
254 IF(.NOT.lo(n,k))THEN
+
255 ibo(k)=1
+
256 go(n,k)=0.
+
257 ENDIF
+
258 ELSE
+
259 go(n,k)=0.
+
260 ENDIF
+
261 ENDDO
+
262 DO k=1,km
+
263 ibo(k)=ibi(k)
+
264 IF(.NOT.all(lo(1:no,k))) ibo(k)=1
+
265 ENDDO
+
266 select type(grid_out)
+
267 type is(ip_equid_cylind_grid)
+
268 CALL polfixs(no,mo,km,rlat,ibo,lo,go)
+
269 end select
+
270 ELSE
+
271 IF(iret.EQ.0) iret=iretx
+
272 IF(.not. to_station_points) no=0
+
273 ENDIF
+
274
+
+
275 end subroutine interpolate_bilinear_scalar
+
276
+
+
329 SUBROUTINE interpolate_bilinear_vector(ipopt,grid_in,grid_out, &
+
330 MI,MO,KM,IBI,LI,UI,VI, &
+
331 NO,RLAT,RLON,CROT,SROT,IBO,LO,UO,VO,IRET)
+
332 class(ip_grid), intent(in) :: grid_in, grid_out
+
333 INTEGER, INTENT(IN ) :: IPOPT(20),IBI(KM),MI,MO,KM
+
334 INTEGER, INTENT(INOUT) :: NO
+
335 INTEGER, INTENT( OUT) :: IRET, IBO(KM)
+
336 !
+
337 LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
+
338 LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
+
339 !
+
340 REAL, INTENT(IN ) :: UI(MI,KM),VI(MI,KM)
+
341 REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO),CROT(MO),SROT(MO)
+
342 REAL, INTENT( OUT) :: UO(MO,KM),VO(MO,KM)
+
343 !
+
344 REAL, PARAMETER :: FILL=-9999.
+
345 !
+
346 INTEGER :: IJX(2),IJY(2)
+
347 INTEGER :: MP,N,I,J,K,NK,NV
+
348 !
+
349 LOGICAL :: SAME_GRIDI, SAME_GRIDO
+
350 !
+
351 REAL :: CM,SM,UROT,VROT
+
352 REAL :: PMP,XIJ,YIJ,XF,YF,U,V,W
+
353 REAL :: XPTS(MO),YPTS(MO)
+
354 REAL :: WX(2),WY(2)
+
355 REAL :: XPTI(MI),YPTI(MI)
+
356 REAL :: RLOI(MI),RLAI(MI)
+
357 REAL :: CROI(MI),SROI(MI)
+
358
+
359 logical :: to_station_points
+
360
+
361 ! Save coeffecients between calls and only compute if grids have changed
+
362 INTEGER, SAVE :: NOX=-1,iretx=-1
+
363 INTEGER, ALLOCATABLE,SAVE :: NXY(:,:,:)
+
364 REAL, ALLOCATABLE,SAVE :: RLATX(:),RLONX(:)
+
365 REAL, ALLOCATABLE,SAVE :: CROTX(:),SROTX(:)
+
366 REAL, ALLOCATABLE,SAVE :: WXY(:,:,:),CXY(:,:,:),SXY(:,:,:)
+
367 class(ip_grid), allocatable,save :: prev_grid_in, prev_grid_out
+
368
+
369 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
370 ! SET PARAMETERS
+
371 iret=0
+
372 mp=ipopt(1)
+
373 IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
+
374 IF(mp.LT.0.OR.mp.GT.100) iret=32
+
375 pmp=mp*0.01
+
376
+
377 if (.not. allocated(prev_grid_in) .or. .not. allocated(prev_grid_out)) then
+
378 allocate(prev_grid_in, source = grid_in)
+
379 allocate(prev_grid_out, source = grid_out)
+
380
+
381 same_gridi = .false.
+
382 same_grido = .false.
+
383 else
+
384 same_gridi = grid_in == prev_grid_in
+
385 same_grido = grid_out == prev_grid_out
+
386
+
387 if (.not. same_gridi .or. .not. same_grido) then
+
388 deallocate(prev_grid_in)
+
389 deallocate(prev_grid_out)
+
390
+
391 allocate(prev_grid_in, source = grid_in)
+
392 allocate(prev_grid_out, source = grid_out)
+
393 end if
+
394 end if
+
395
+
396 select type(grid_out)
+
397 type is(ip_station_points_grid)
+
398 to_station_points = .true.
+
399 class default
+
400 to_station_points = .false.
+
401 end select
+
402
+
403 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
404 ! SAVE OR SKIP WEIGHT COMPUTATION
+
405 IF(iret.EQ.0.AND.(to_station_points.OR..NOT.same_gridi.OR..NOT.same_grido))THEN
+
406 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
407 ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
+
408 CALL gdswzd(grid_out, 0,mo,fill,xpts,ypts,rlon,rlat,no,crot,srot)
+
409 IF(no.EQ.0) iret=3
+
410 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
411 ! LOCATE INPUT POINTS
+
412 CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv)
+
413 IF(iret.EQ.0.AND.nv.EQ.0) iret=2
+
414 CALL gdswzd(grid_in, 0,mi,fill,xpti,ypti,rloi,rlai,nv,croi,sroi)
+
415 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
416 ! ALLOCATE AND SAVE GRID DATA
+
417 IF(nox.NE.no) THEN
+
418 IF(nox.GE.0) DEALLOCATE(rlatx,rlonx,crotx,srotx,nxy,wxy,cxy,sxy)
+
419 ALLOCATE(rlatx(no),rlonx(no),crotx(no),srotx(no), &
+
420 nxy(2,2,no),wxy(2,2,no),cxy(2,2,no),sxy(2,2,no))
+
421 nox=no
+
422 ENDIF
+
423 iretx=iret
+
424 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
425 ! COMPUTE WEIGHTS
+
426 IF(iret.EQ.0) THEN
+
427 !$OMP PARALLEL DO PRIVATE(N,XIJ,YIJ,IJX,IJY,XF,YF,J,I,WX,WY,CM,SM) SCHEDULE(STATIC)
+
428 DO n=1,no
+
429 rlonx(n)=rlon(n)
+
430 rlatx(n)=rlat(n)
+
431 crotx(n)=crot(n)
+
432 srotx(n)=srot(n)
+
433 xij=xpts(n)
+
434 yij=ypts(n)
+
435 IF(abs(xij-fill).GT.tinyreal.AND.abs(yij-fill).GT.tinyreal) THEN
+
436 ijx(1:2)=floor(xij)+(/0,1/)
+
437 ijy(1:2)=floor(yij)+(/0,1/)
+
438 xf=xij-ijx(1)
+
439 yf=yij-ijy(1)
+
440 wx(1)=(1-xf)
+
441 wx(2)=xf
+
442 wy(1)=(1-yf)
+
443 wy(2)=yf
+
444 DO j=1,2
+
445 DO i=1,2
+
446 nxy(i, j, n) = grid_in%field_pos(ijx(i), ijy(j))
+
447 wxy(i,j,n)=wx(i)*wy(j)
+
448 IF(nxy(i,j,n).GT.0) THEN
+
449 CALL movect(rlai(nxy(i,j,n)),rloi(nxy(i,j,n)), &
+
450 rlat(n),rlon(n),cm,sm)
+
451 cxy(i,j,n)=cm*croi(nxy(i,j,n))+sm*sroi(nxy(i,j,n))
+
452 sxy(i,j,n)=sm*croi(nxy(i,j,n))-cm*sroi(nxy(i,j,n))
+
453 ENDIF
+
454 ENDDO
+
455 ENDDO
+
456 ELSE
+
457 nxy(:,:,n)=0
+
458 ENDIF
+
459 ENDDO
+
460 ENDIF ! IS IRET 0?
+
461 ENDIF
+
462 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
463 ! INTERPOLATE OVER ALL FIELDS
+
464 IF(iret.EQ.0.AND.iretx.EQ.0) THEN
+
465 IF(.not. to_station_points) THEN
+
466 no=nox
+
467 DO n=1,no
+
468 rlon(n)=rlonx(n)
+
469 rlat(n)=rlatx(n)
+
470 crot(n)=crotx(n)
+
471 srot(n)=srotx(n)
+
472 ENDDO
+
473 ENDIF
+
474 !$OMP PARALLEL DO PRIVATE(NK,K,N,U,V,W,UROT,VROT,J,I) SCHEDULE(STATIC)
+
475 DO nk=1,no*km
+
476 k=(nk-1)/no+1
+
477 n=nk-no*(k-1)
+
478 u=0
+
479 v=0
+
480 w=0
+
481 DO j=1,2
+
482 DO i=1,2
+
483 IF(nxy(i,j,n).GT.0) THEN
+
484 IF(ibi(k).EQ.0.OR.li(nxy(i,j,n),k)) THEN
+
485 urot=cxy(i,j,n)*ui(nxy(i,j,n),k)-sxy(i,j,n)*vi(nxy(i,j,n),k)
+
486 vrot=sxy(i,j,n)*ui(nxy(i,j,n),k)+cxy(i,j,n)*vi(nxy(i,j,n),k)
+
487 u=u+wxy(i,j,n)*urot
+
488 v=v+wxy(i,j,n)*vrot
+
489 w=w+wxy(i,j,n)
+
490 ENDIF
+
491 ENDIF
+
492 ENDDO
+
493 ENDDO
+
494 lo(n,k)=w.GE.pmp
+
495 IF(lo(n,k)) THEN
+
496 urot=crot(n)*u-srot(n)*v
+
497 vrot=srot(n)*u+crot(n)*v
+
498 uo(n,k)=urot/w
+
499 vo(n,k)=vrot/w
+
500 ELSE
+
501 uo(n,k)=0.
+
502 vo(n,k)=0.
+
503 ENDIF
+
504 ENDDO ! NK LOOP
+
505 DO k=1,km
+
506 ibo(k)=ibi(k)
+
507 IF(.NOT.all(lo(1:no,k))) ibo(k)=1
+
508 ENDDO
+
509
+
510 select type(grid_out)
+
511 type is(ip_equid_cylind_grid)
+
512 CALL polfixv(no,mo,km,rlat,rlon,ibo,lo,uo,vo)
+
513 end select
+
514
+
515 ELSE
+
516 IF(iret.EQ.0) iret=iretx
+
517 IF(.not. to_station_points) no=0
+
518 ENDIF
+
519 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+
520 END SUBROUTINE interpolate_bilinear_vector
+
521
+
522end module bilinear_interp_mod
+ + +
subroutine movect(flat, flon, tlat, tlon, crot, srot)
This subprogram provides the rotation parameters to move a vector along a great circle from one posit...
Definition movect.F90:26
+
Bilinear interpolation routines for scalars and vectors.
+
subroutine interpolate_bilinear_scalar(ipopt, grid_in, grid_out, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
This subprogram performs bilinear interpolation from any grid to any grid for scalar fields.
+
subroutine interpolate_bilinear_vector(ipopt, grid_in, grid_out, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
This subprogram performs bilinear interpolation from any grid to any grid for vector fields.
+
Driver module for gdswzd routines.
+
Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
+
Routines for creating an ip_grid given a Grib descriptor.
+
Re-export the individual grids.
+
Make multiple pole scalar values consistent.
Definition polfix_mod.F90:7
+
subroutine, public polfixs(nm, nx, km, rlat, ib, lo, go)
Make multiple pole scalar values consistent.
+
subroutine, public polfixv(nm, nx, km, rlat, rlon, ib, lo, uo, vo)
Make multiple pole vector values consistent,.
diff --git a/budget__interp__mod_8F90.html b/budget__interp__mod_8F90.html index 932a1ffd..91d3c923 100644 --- a/budget__interp__mod_8F90.html +++ b/budget__interp__mod_8F90.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: budget_interp_mod.F90 File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,9 +76,16 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
@@ -86,8 +93,7 @@ Data Types | Modules | Functions/Subroutines
-
-
budget_interp_mod.F90 File Reference
+
budget_interp_mod.F90 File Reference
@@ -96,25 +102,25 @@

Go to the source code of this file.

-

+

Data Types

interface  budget_interp_mod::interpolate_budget
 
- - +

+

Modules

module  budget_interp_mod
module  budget_interp_mod
 Budget interpolation routines for scalars and vectors.
 
- - - - - - - + + + + + +

+

Functions/Subroutines

subroutine budget_interp_mod::interpolate_budget_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
 Performs budget interpolation from any grid to any grid (or to random station points) for scalar fields. More...
 
subroutine budget_interp_mod::interpolate_budget_vector (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
 This subprogram performs budget interpolation from any grid to any grid (or to random station points) for vector fields. More...
 
subroutine budget_interp_mod::interpolate_budget_scalar (ipopt, grid_in, grid_out, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
 Performs budget interpolation from any grid to any grid (or to random station points) for scalar fields.
 
subroutine budget_interp_mod::interpolate_budget_vector (ipopt, grid_in, grid_out, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
 This subprogram performs budget interpolation from any grid to any grid (or to random station points) for vector fields.
 

Detailed Description

Budget interpolation routines for scalars and vectors.

@@ -128,7 +134,7 @@ diff --git a/budget__interp__mod_8F90.js b/budget__interp__mod_8F90.js index 44bc00ff..f149d12d 100644 --- a/budget__interp__mod_8F90.js +++ b/budget__interp__mod_8F90.js @@ -1,6 +1,6 @@ var budget__interp__mod_8F90 = [ - [ "interpolate_budget", "interfacebudget__interp__mod_1_1interpolate__budget.html", "interfacebudget__interp__mod_1_1interpolate__budget" ], - [ "interpolate_budget_scalar", "budget__interp__mod_8F90.html#a09bd6535b0c2e1022cfde39c39d14466", null ], - [ "interpolate_budget_vector", "budget__interp__mod_8F90.html#abc99486ee9c0091c1514af6114d4e803", null ] + [ "budget_interp_mod::interpolate_budget", "interfacebudget__interp__mod_1_1interpolate__budget.html", "interfacebudget__interp__mod_1_1interpolate__budget" ], + [ "interpolate_budget_scalar", "budget__interp__mod_8F90.html#a2a478f58c561eefcbb50497ed7855508", null ], + [ "interpolate_budget_vector", "budget__interp__mod_8F90.html#ae66f4257d43d6500cbd43b6dbf2b914a", null ] ]; \ No newline at end of file diff --git a/budget__interp__mod_8F90_source.html b/budget__interp__mod_8F90_source.html index b4cc3add..0244781b 100644 --- a/budget__interp__mod_8F90_source.html +++ b/budget__interp__mod_8F90_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: budget_interp_mod.F90 Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,610 +81,622 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
budget_interp_mod.F90
+
budget_interp_mod.F90
-Go to the documentation of this file.
1 
-
5 
- -
11  use gdswzd_mod
-
12  use polfix_mod
-
13  use ip_grids_mod
- - -
16  implicit none
-
17 
-
18  private
-
19  public :: interpolate_budget
-
20 
- -
22  module procedure interpolate_budget_scalar
-
23  module procedure interpolate_budget_vector
-
24  end interface interpolate_budget
-
25 
-
26  ! Smallest positive real value (use for equality comparisons)
-
27  REAL :: TINYREAL=tiny(1.0)
-
28 
-
29 contains
-
30 
-
94  SUBROUTINE interpolate_budget_scalar(IPOPT,grid_in,grid_out, &
-
95  MI,MO,KM,IBI,LI,GI, &
-
96  NO,RLAT,RLON,IBO,LO,GO,IRET)
-
97  class(ip_grid), intent(in) :: grid_in, grid_out
-
98  INTEGER, INTENT(IN ) :: IBI(KM), IPOPT(20)
-
99  INTEGER, INTENT(IN ) :: KM, MI, MO
-
100  INTEGER, INTENT( OUT) :: IBO(KM), IRET, NO
-
101  !
-
102  LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
-
103  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
-
104  !
-
105  REAL, INTENT(IN ) :: GI(MI,KM)
-
106  REAL, INTENT(INOUT) :: RLAT(MO), RLON(MO)
-
107  REAL, INTENT( OUT) :: GO(MO,KM)
-
108  !
-
109  REAL, PARAMETER :: FILL=-9999.
-
110  !
-
111  INTEGER :: I1, J1, I2, J2, IB, JB
-
112  INTEGER :: IX, JX, IXS, JXS
-
113  INTEGER :: K, KXS, KXT
-
114  INTEGER :: LB, LSW, MP, MSPIRAL, MX
-
115  INTEGER :: N, NB, NB1, NB2, NB3, NB4, NV, NX
-
116  INTEGER :: N11(MO),N21(MO),N12(MO),N22(MO)
-
117  !
-
118  REAL :: GB, LAT(1), LON(1)
-
119  REAL :: PMP, RB2, RLOB(MO), RLAB(MO), WB
-
120  REAL :: W11(MO), W21(MO), W12(MO), W22(MO)
-
121  REAL :: WO(MO,KM), XF, YF, XI, YI, XX, YY
-
122  REAL :: XPTS(MO),YPTS(MO),XPTB(MO),YPTB(MO)
-
123  REAL :: XXX(1), YYY(1)
-
124 
-
125  logical :: to_station_points
-
126 
-
127  class(ip_grid), allocatable :: grid_out2
-
128 
-
129  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
130  ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
-
131  ! DO SUBSECTION OF GRID IF KGDSO(1) IS SUBTRACTED FROM 255.
-
132  iret=0
-
133 
-
134  select type(grid_out)
-
135  type is(ip_station_points_grid)
-
136  to_station_points = .true.
-
137  allocate(grid_out2, source = grid_out)
-
138  CALL gdswzd(grid_out2, 0,mo,fill,xpts,ypts,rlon,rlat,no)
-
139  IF(no.EQ.0) iret=3
-
140  CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv)
-
141  IF(nv.EQ.0) iret=2
-
142  class default
-
143  to_station_points = .false.
-
144  allocate(grid_out2, source = grid_out)
-
145  CALL gdswzd(grid_out2, 0,mo,fill,xpts,ypts,rlon,rlat,no)
-
146  IF(no.EQ.0) iret=3
-
147  end select
-
148 
-
149  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
150  ! SET PARAMETERS
-
151  IF(ipopt(1).GT.16) iret=32
-
152  mspiral=max(ipopt(20),1)
-
153  nb1=ipopt(1)
-
154  IF(nb1.EQ.-1) nb1=2
-
155  IF(iret.EQ.0.AND.nb1.LT.0) iret=32
-
156  lsw=1
-
157  IF(ipopt(2).EQ.-2) lsw=2
-
158  IF(ipopt(1).EQ.-1.OR.ipopt(2).EQ.-1) lsw=0
-
159  IF(iret.EQ.0.AND.lsw.EQ.1.AND.nb1.GT.15) iret=32
-
160  mp=ipopt(3+ipopt(1))
-
161  IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
-
162  IF(mp.LT.0.OR.mp.GT.100) iret=32
-
163  pmp=mp*0.01
-
164  IF(iret.EQ.0) THEN
-
165  nb2=2*nb1+1
-
166  rb2=1./nb2
-
167  nb3=nb2*nb2
-
168  nb4=nb3
-
169  IF(lsw.EQ.2) THEN
-
170  rb2=1./(nb1+1)
-
171  nb4=(nb1+1)**4
-
172  ELSEIF(lsw.EQ.1) THEN
-
173  nb4=ipopt(2)
-
174  DO ib=1,nb1
-
175  nb4=nb4+8*ib*ipopt(2+ib)
-
176  ENDDO
-
177  ENDIF
-
178  ELSE
-
179  nb3=0
-
180  nb4=1
-
181  ENDIF
-
182  DO k=1,km
-
183  DO n=1,no
-
184  go(n,k)=0.
-
185  wo(n,k)=0.
-
186  ENDDO
-
187  ENDDO
-
188  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
189  ! LOOP OVER SAMPLE POINTS IN OUTPUT GRID BOX
-
190  DO nb=1,nb3
-
191  ! LOCATE INPUT POINTS AND COMPUTE THEIR WEIGHTS
-
192  jb=(nb-1)/nb2-nb1
-
193  ib=nb-(jb+nb1)*nb2-nb1-1
-
194  lb=max(abs(ib),abs(jb))
-
195  wb=1
-
196  IF(lsw.EQ.2) THEN
-
197  wb=(nb1+1-abs(ib))*(nb1+1-abs(jb))
-
198  ELSEIF(lsw.EQ.1) THEN
-
199  wb=ipopt(2+lb)
-
200  ENDIF
-
201  IF(abs(wb).GT.tinyreal) THEN
-
202  !$OMP PARALLEL DO PRIVATE(N) SCHEDULE(STATIC)
-
203  DO n=1,no
-
204  xptb(n)=xpts(n)+ib*rb2
-
205  yptb(n)=ypts(n)+jb*rb2
-
206  ENDDO
-
207  !$OMP END PARALLEL DO
-
208  if(to_station_points)then
-
209  CALL gdswzd(grid_in, 1,no,fill,xptb,yptb,rlob,rlab,nv)
-
210  CALL gdswzd(grid_in,-1,no,fill,xptb,yptb,rlob,rlab,nv)
-
211  else
-
212  CALL gdswzd(grid_out2, 1,no,fill,xptb,yptb,rlob,rlab,nv)
-
213  CALL gdswzd(grid_in,-1,no,fill,xptb,yptb,rlob,rlab,nv)
-
214  endif
-
215  IF(iret.EQ.0.AND.nv.EQ.0.AND.lb.EQ.0) iret=2
-
216  !$OMP PARALLEL DO PRIVATE(N,XI,YI,I1,I2,J1,J2,XF,YF) SCHEDULE(STATIC)
-
217  DO n=1,no
-
218  xi=xptb(n)
-
219  yi=yptb(n)
-
220  IF(abs(xi-fill).GT.tinyreal.AND.abs(yi-fill).GT.tinyreal) THEN
-
221  i1=int(xi)
-
222  i2=i1+1
-
223  j1=int(yi)
-
224  j2=j1+1
-
225  xf=xi-i1
-
226  yf=yi-j1
-
227  n11(n)=grid_in%field_pos(i1, j1)
-
228  n21(n)=grid_in%field_pos(i2, j1)
-
229  n12(n)=grid_in%field_pos(i1, j2)
-
230  n22(n)=grid_in%field_pos(i2, j2)
-
231  IF(min(n11(n),n21(n),n12(n),n22(n)).GT.0) THEN
-
232  w11(n)=(1-xf)*(1-yf)
-
233  w21(n)=xf*(1-yf)
-
234  w12(n)=(1-xf)*yf
-
235  w22(n)=xf*yf
-
236  ELSE
-
237  n11(n)=0
-
238  n21(n)=0
-
239  n12(n)=0
-
240  n22(n)=0
-
241  ENDIF
-
242  ELSE
-
243  n11(n)=0
-
244  n21(n)=0
-
245  n12(n)=0
-
246  n22(n)=0
-
247  ENDIF
-
248  ENDDO
-
249  !$OMP END PARALLEL DO
-
250  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
251  ! INTERPOLATE WITH OR WITHOUT BITMAPS
-
252  !$OMP PARALLEL DO PRIVATE(K,N,GB) SCHEDULE(STATIC)
-
253  DO k=1,km
-
254  DO n=1,no
-
255  IF(n11(n).GT.0) THEN
-
256  IF(ibi(k).EQ.0) THEN
-
257  gb=w11(n)*gi(n11(n),k)+w21(n)*gi(n21(n),k) &
-
258  +w12(n)*gi(n12(n),k)+w22(n)*gi(n22(n),k)
-
259  go(n,k)=go(n,k)+wb*gb
-
260  wo(n,k)=wo(n,k)+wb
-
261  ELSE
-
262  IF(li(n11(n),k)) THEN
-
263  go(n,k)=go(n,k)+wb*w11(n)*gi(n11(n),k)
-
264  wo(n,k)=wo(n,k)+wb*w11(n)
-
265  ENDIF
-
266  IF(li(n21(n),k)) THEN
-
267  go(n,k)=go(n,k)+wb*w21(n)*gi(n21(n),k)
-
268  wo(n,k)=wo(n,k)+wb*w21(n)
-
269  ENDIF
-
270  IF(li(n12(n),k)) THEN
-
271  go(n,k)=go(n,k)+wb*w12(n)*gi(n12(n),k)
-
272  wo(n,k)=wo(n,k)+wb*w12(n)
-
273  ENDIF
-
274  IF(li(n22(n),k)) THEN
-
275  go(n,k)=go(n,k)+wb*w22(n)*gi(n22(n),k)
-
276  wo(n,k)=wo(n,k)+wb*w22(n)
-
277  ENDIF
-
278  ENDIF
-
279  ENDIF
-
280  ENDDO
-
281  ENDDO
-
282  !$OMP END PARALLEL DO
-
283  ENDIF
-
284  ENDDO ! sub-grid points
-
285  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
286  ! COMPUTE OUTPUT BITMAPS AND FIELDS
-
287  ! KM is often 1 .. do not do OMP PARALLEL DO here
-
288  km_loop : DO k=1,km
-
289  ibo(k)=ibi(k)
-
290  !$OMP PARALLEL DO PRIVATE(N,LAT,LON,XXX,YYY,NV,XX,YY,IXS,JXS,MX,KXS,KXT,IX,JX,NX) SCHEDULE(STATIC)
-
291  n_loop : DO n=1,no
-
292  lo(n,k)=wo(n,k).GE.pmp*nb4
-
293  IF(lo(n,k)) THEN
-
294  go(n,k)=go(n,k)/wo(n,k)
-
295  ELSEIF (mspiral.GT.1) THEN
-
296  lat(1)=rlat(n)
-
297  lon(1)=rlon(n)
-
298  CALL gdswzd(grid_in,-1,1,fill,xxx,yyy,lon,lat,nv)
-
299  xx=xxx(1)
-
300  yy=yyy(1)
-
301  IF(nv.EQ.1)THEN
-
302  i1=nint(xx)
-
303  j1=nint(yy)
-
304  ixs=int(sign(1.,xx-i1))
-
305  jxs=int(sign(1.,yy-j1))
-
306  spiral_loop : DO mx=2,mspiral**2
-
307  kxs=int(sqrt(4*mx-2.5))
-
308  kxt=mx-(kxs**2/4+1)
-
309  SELECT CASE(mod(kxs,4))
-
310  CASE(1)
-
311  ix=i1-ixs*(kxs/4-kxt)
-
312  jx=j1-jxs*kxs/4
-
313  CASE(2)
-
314  ix=i1+ixs*(1+kxs/4)
-
315  jx=j1-jxs*(kxs/4-kxt)
-
316  CASE(3)
-
317  ix=i1+ixs*(1+kxs/4-kxt)
-
318  jx=j1+jxs*(1+kxs/4)
-
319  CASE DEFAULT
-
320  ix=i1-ixs*kxs/4
-
321  jx=j1+jxs*(kxs/4-kxt)
-
322  END SELECT
-
323  nx=grid_in%field_pos(ix, jx)
-
324  IF(nx.GT.0.)THEN
-
325  IF(li(nx,k).OR.ibi(k).EQ.0) THEN
-
326  go(n,k)=gi(nx,k)
-
327  lo(n,k)=.true.
-
328  cycle n_loop
-
329  ENDIF
-
330  ENDIF
-
331  ENDDO spiral_loop
-
332  ibo(k)=1
-
333  go(n,k)=0.
-
334  ELSE
-
335  ibo(k)=1
-
336  go(n,k)=0.
-
337  ENDIF
-
338  ELSE ! no spiral search option
-
339  ibo(k)=1
-
340  go(n,k)=0.
-
341  ENDIF
-
342  ENDDO n_loop
-
343  !$OMP END PARALLEL DO
-
344  ENDDO km_loop
-
345 
-
346  select type(grid_out2)
-
347  type is(ip_equid_cylind_grid)
-
348  CALL polfixs(no,mo,km,rlat,ibo,lo,go)
-
349  end select
-
350  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
351  END SUBROUTINE interpolate_budget_scalar
-
352 
-
423  SUBROUTINE interpolate_budget_vector(IPOPT,grid_in,grid_out, &
-
424  MI,MO,KM,IBI,LI,UI,VI, &
-
425  NO,RLAT,RLON,CROT,SROT,IBO,LO,UO,VO,IRET)
-
426  class(ip_grid), intent(in) :: grid_in, grid_out
-
427  INTEGER, INTENT(IN ) :: IPOPT(20), IBI(KM)
-
428  INTEGER, INTENT(IN ) :: KM, MI, MO
-
429  INTEGER, INTENT( OUT) :: IRET, NO, IBO(KM)
-
430  !
-
431  LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
-
432  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
-
433  !
-
434  REAL, INTENT(IN ) :: UI(MI,KM),VI(MI,KM)
-
435  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO)
-
436  REAL, INTENT( OUT) :: UO(MO,KM),VO(MO,KM)
-
437  REAL, INTENT( OUT) :: CROT(MO),SROT(MO)
-
438  !
-
439  REAL, PARAMETER :: FILL=-9999.
-
440  !
-
441  INTEGER :: I1,I2,J1,J2,IB,JB,LSW,MP
-
442  INTEGER :: K,LB,N,NB,NB1,NB2,NB3,NB4,NV
-
443  INTEGER :: N11(MO),N21(MO),N12(MO),N22(MO)
-
444  !
-
445  LOGICAL :: SAME_GRID
-
446  !
-
447  REAL :: CM11,SM11,CM12,SM12
-
448  REAL :: CM21,SM21,CM22,SM22
-
449  REAL :: PMP,RB2
-
450  REAL :: C11(MO),C21(MO),C12(MO),C22(MO)
-
451  REAL :: S11(MO),S21(MO),S12(MO),S22(MO)
-
452  REAL :: W11(MO),W21(MO),W12(MO),W22(MO)
-
453  REAL :: UB,VB,WB,UROT,VROT
-
454  REAL :: U11,V11,U21,V21,U12,V12,U22,V22
-
455  REAL :: WI1,WJ1,WI2,WJ2
-
456  REAL :: WO(MO,KM),XI,YI
-
457  REAL :: XPTS(MO),YPTS(MO)
-
458  REAL :: XPTB(MO),YPTB(MO),RLOB(MO),RLAB(MO)
-
459 
-
460  logical :: to_station_points
-
461 
-
462  class(ip_grid), allocatable :: grid_out2
-
463 
-
464  ! Save coeffecients between calls and only compute if grids have changed
-
465  INTEGER, SAVE :: MIX=-1
-
466  REAL, ALLOCATABLE, SAVE :: CROI(:),SROI(:)
-
467  REAL, ALLOCATABLE, SAVE :: XPTI(:),YPTI(:),RLOI(:),RLAI(:)
-
468 
-
469  class(ip_grid), allocatable, save :: prev_grid_in
-
470 
-
471  iret=0
-
472 
-
473  ! Negative grid number means interpolate to subgrid
-
474  ! The type of the subgrid is calculated by 255 +
-
475  select type(grid_out)
-
476  type is(ip_station_points_grid)
-
477  to_station_points = .true.
-
478  allocate(grid_out2, source = grid_out)
-
479  CALL gdswzd(grid_out2, 0,mo,fill,xpts,ypts,rlon,rlat,no,crot,srot)
-
480  IF(no.EQ.0) iret=3
-
481  CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv,crot,srot)
-
482  IF(nv.EQ.0) iret=2
-
483  class default
-
484  to_station_points = .false.
-
485  allocate(grid_out2, source = grid_out)
-
486  CALL gdswzd(grid_out2, 0,mo,fill,xpts,ypts,rlon,rlat,no,crot,srot)
-
487  end select
-
488 
-
489  if (.not. allocated(prev_grid_in)) then
-
490  allocate(prev_grid_in, source = grid_in)
-
491 
-
492  same_grid = .false.
-
493  else
-
494  same_grid = grid_in == prev_grid_in
-
495 
-
496  if (.not. same_grid) then
-
497  deallocate(prev_grid_in)
-
498  allocate(prev_grid_in, source = grid_in)
-
499  end if
-
500  end if
-
501 
-
502  IF(.NOT.same_grid) THEN
-
503  IF(mix.NE.mi) THEN
-
504  IF(mix.GE.0) DEALLOCATE(xpti,ypti,rloi,rlai,croi,sroi)
-
505  ALLOCATE(xpti(mi),ypti(mi),rloi(mi),rlai(mi),croi(mi),sroi(mi))
-
506  mix=mi
-
507  ENDIF
-
508  CALL gdswzd(grid_in, 0,mi,fill,xpti,ypti,rloi,rlai,nv,croi,sroi)
-
509  ENDIF
-
510 
-
511  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
512  ! SET PARAMETERS
-
513  nb1=ipopt(1)
-
514  IF(nb1.EQ.-1) nb1=2
-
515  IF(iret.EQ.0.AND.nb1.LT.0) iret=32
-
516  lsw=1
-
517  IF(ipopt(2).EQ.-2) lsw=2
-
518  IF(ipopt(1).EQ.-1.OR.ipopt(2).EQ.-1) lsw=0
-
519  IF(iret.EQ.0.AND.lsw.EQ.1.AND.nb1.GT.15) iret=32
-
520  mp=ipopt(3+ipopt(1))
-
521  IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
-
522  IF(mp.LT.0.OR.mp.GT.100) iret=32
-
523  pmp=mp*0.01
-
524  IF(iret.EQ.0) THEN
-
525  nb2=2*nb1+1
-
526  rb2=1./nb2
-
527  nb3=nb2*nb2
-
528  nb4=nb3
-
529  IF(lsw.EQ.2) THEN
-
530  rb2=1./(nb1+1)
-
531  nb4=(nb1+1)**4
-
532  ELSEIF(lsw.EQ.1) THEN
-
533  nb4=ipopt(2)
-
534  DO ib=1,nb1
-
535  nb4=nb4+8*ib*ipopt(2+ib)
-
536  ENDDO
-
537  ENDIF
-
538  ELSE
-
539  nb3=0
-
540  nb4=1
-
541  ENDIF
-
542  DO k=1,km
-
543  DO n=1,no
-
544  uo(n,k)=0
-
545  vo(n,k)=0
-
546  wo(n,k)=0.
-
547  ENDDO
-
548  ENDDO
-
549  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
550  ! LOOP OVER SAMPLE POINTS IN OUTPUT GRID BOX
-
551  DO nb=1,nb3
-
552  ! LOCATE INPUT POINTS AND COMPUTE THEIR WEIGHTS AND ROTATIONS
-
553  jb=(nb-1)/nb2-nb1
-
554  ib=nb-(jb+nb1)*nb2-nb1-1
-
555  lb=max(abs(ib),abs(jb))
-
556  wb=1
-
557  IF(ipopt(2).EQ.-2) THEN
-
558  wb=(nb1+1-abs(ib))*(nb1+1-abs(jb))
-
559  ELSEIF(ipopt(2).NE.-1) THEN
-
560  wb=ipopt(2+lb)
-
561  ENDIF
-
562  IF(abs(wb).GT.tinyreal) THEN
-
563  !$OMP PARALLEL DO PRIVATE(N) SCHEDULE(STATIC)
-
564  DO n=1,no
-
565  xptb(n)=xpts(n)+ib*rb2
-
566  yptb(n)=ypts(n)+jb*rb2
-
567  ENDDO
-
568  !$OMP END PARALLEL DO
-
569  if(to_station_points)then
-
570  CALL gdswzd(grid_in, 1,no,fill,xptb,yptb,rlob,rlab,nv)
-
571  CALL gdswzd(grid_in,-1,no,fill,xptb,yptb,rlob,rlab,nv)
-
572  else
-
573  CALL gdswzd(grid_out2, 1,no,fill,xptb,yptb,rlob,rlab,nv)
-
574  CALL gdswzd(grid_in,-1,no,fill,xptb,yptb,rlob,rlab,nv)
-
575  endif
-
576  IF(iret.EQ.0.AND.nv.EQ.0.AND.lb.EQ.0) iret=2
-
577  !$OMP PARALLEL DO PRIVATE(N,XI,YI,I1,I2,WI1,WI2,J1,J2,WJ1,WJ2,CM11,CM21,CM12,CM22,SM11,SM21,SM12,SM22) &
-
578  !$OMP SCHEDULE(STATIC)
-
579  DO n=1,no
-
580  xi=xptb(n)
-
581  yi=yptb(n)
-
582  IF(abs(xi-fill).GT.tinyreal.AND.abs(yi-fill).GT.tinyreal) THEN
-
583  i1=int(xi)
-
584  i2=i1+1
-
585  wi2=xi-i1
-
586  wi1=1-wi2
-
587  j1=int(yi)
-
588  j2=j1+1
-
589  wj2=yi-j1
-
590  wj1=1-wj2
-
591  n11(n) = grid_in%field_pos(i1,j1)
-
592  n21(n) = grid_in%field_pos(i2, j1)
-
593  n12(n) = grid_in%field_pos(i1, j2)
-
594  n22(n) = grid_in%field_pos(i2, j2)
-
595  IF(min(n11(n),n21(n),n12(n),n22(n)).GT.0) THEN
-
596  w11(n)=wi1*wj1
-
597  w21(n)=wi2*wj1
-
598  w12(n)=wi1*wj2
-
599  w22(n)=wi2*wj2
-
600  CALL movect(rlai(n11(n)),rloi(n11(n)),rlat(n),rlon(n),cm11,sm11)
-
601  CALL movect(rlai(n21(n)),rloi(n21(n)),rlat(n),rlon(n),cm21,sm21)
-
602  CALL movect(rlai(n12(n)),rloi(n12(n)),rlat(n),rlon(n),cm12,sm12)
-
603  CALL movect(rlai(n22(n)),rloi(n22(n)),rlat(n),rlon(n),cm22,sm22)
-
604  c11(n)=cm11*croi(n11(n))+sm11*sroi(n11(n))
-
605  s11(n)=sm11*croi(n11(n))-cm11*sroi(n11(n))
-
606  c21(n)=cm21*croi(n21(n))+sm21*sroi(n21(n))
-
607  s21(n)=sm21*croi(n21(n))-cm21*sroi(n21(n))
-
608  c12(n)=cm12*croi(n12(n))+sm12*sroi(n12(n))
-
609  s12(n)=sm12*croi(n12(n))-cm12*sroi(n12(n))
-
610  c22(n)=cm22*croi(n22(n))+sm22*sroi(n22(n))
-
611  s22(n)=sm22*croi(n22(n))-cm22*sroi(n22(n))
-
612  ELSE
-
613  n11(n)=0
-
614  n21(n)=0
-
615  n12(n)=0
-
616  n22(n)=0
-
617  ENDIF
-
618  ELSE
-
619  n11(n)=0
-
620  n21(n)=0
-
621  n12(n)=0
-
622  n22(n)=0
-
623  ENDIF
-
624  ENDDO
-
625  !$OMP END PARALLEL DO
-
626  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
627  ! INTERPOLATE WITH OR WITHOUT BITMAPS
-
628  ! KM IS OFTEN 1 .. DO NO PUT OMP PARALLEL DO HERE
-
629  DO k=1,km
-
630  !$OMP PARALLEL DO PRIVATE(N,U11,U12,U21,U22,UB,V11,V12,V21,V22,VB) SCHEDULE(STATIC)
-
631  DO n=1,no
-
632  IF(n11(n).GT.0) THEN
-
633  IF(ibi(k).EQ.0) THEN
-
634  u11=c11(n)*ui(n11(n),k)-s11(n)*vi(n11(n),k)
-
635  v11=s11(n)*ui(n11(n),k)+c11(n)*vi(n11(n),k)
-
636  u21=c21(n)*ui(n21(n),k)-s21(n)*vi(n21(n),k)
-
637  v21=s21(n)*ui(n21(n),k)+c21(n)*vi(n21(n),k)
-
638  u12=c12(n)*ui(n12(n),k)-s12(n)*vi(n12(n),k)
-
639  v12=s12(n)*ui(n12(n),k)+c12(n)*vi(n12(n),k)
-
640  u22=c22(n)*ui(n22(n),k)-s22(n)*vi(n22(n),k)
-
641  v22=s22(n)*ui(n22(n),k)+c22(n)*vi(n22(n),k)
-
642  ub=w11(n)*u11+w21(n)*u21+w12(n)*u12+w22(n)*u22
-
643  vb=w11(n)*v11+w21(n)*v21+w12(n)*v12+w22(n)*v22
-
644  uo(n,k)=uo(n,k)+wb*ub
-
645  vo(n,k)=vo(n,k)+wb*vb
-
646  wo(n,k)=wo(n,k)+wb
-
647  ELSE
-
648  IF(li(n11(n),k)) THEN
-
649  u11=c11(n)*ui(n11(n),k)-s11(n)*vi(n11(n),k)
-
650  v11=s11(n)*ui(n11(n),k)+c11(n)*vi(n11(n),k)
-
651  uo(n,k)=uo(n,k)+wb*w11(n)*u11
-
652  vo(n,k)=vo(n,k)+wb*w11(n)*v11
-
653  wo(n,k)=wo(n,k)+wb*w11(n)
-
654  ENDIF
-
655  IF(li(n21(n),k)) THEN
-
656  u21=c21(n)*ui(n21(n),k)-s21(n)*vi(n21(n),k)
-
657  v21=s21(n)*ui(n21(n),k)+c21(n)*vi(n21(n),k)
-
658  uo(n,k)=uo(n,k)+wb*w21(n)*u21
-
659  vo(n,k)=vo(n,k)+wb*w21(n)*v21
-
660  wo(n,k)=wo(n,k)+wb*w21(n)
-
661  ENDIF
-
662  IF(li(n12(n),k)) THEN
-
663  u12=c12(n)*ui(n12(n),k)-s12(n)*vi(n12(n),k)
-
664  v12=s12(n)*ui(n12(n),k)+c12(n)*vi(n12(n),k)
-
665  uo(n,k)=uo(n,k)+wb*w12(n)*u12
-
666  vo(n,k)=vo(n,k)+wb*w12(n)*v12
-
667  wo(n,k)=wo(n,k)+wb*w12(n)
-
668  ENDIF
-
669  IF(li(n22(n),k)) THEN
-
670  u22=c22(n)*ui(n22(n),k)-s22(n)*vi(n22(n),k)
-
671  v22=s22(n)*ui(n22(n),k)+c22(n)*vi(n22(n),k)
-
672  uo(n,k)=uo(n,k)+wb*w22(n)*u22
-
673  vo(n,k)=vo(n,k)+wb*w22(n)*v22
-
674  wo(n,k)=wo(n,k)+wb*w22(n)
-
675  ENDIF
-
676  ENDIF
-
677  ENDIF
-
678  ENDDO
-
679  !$OMP END PARALLEL DO
-
680  ENDDO
-
681  ENDIF
-
682  ENDDO
-
683  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
684  ! COMPUTE OUTPUT BITMAPS AND FIELDS
-
685  ! KM is often 1, do not put OMP PARALLEL here
-
686  DO k=1,km
-
687  ibo(k)=ibi(k)
-
688  !$OMP PARALLEL DO PRIVATE(N,UROT,VROT) SCHEDULE(STATIC)
-
689  DO n=1,no
-
690  lo(n,k)=wo(n,k).GE.pmp*nb4
-
691  IF(lo(n,k)) THEN
-
692  uo(n,k)=uo(n,k)/wo(n,k)
-
693  vo(n,k)=vo(n,k)/wo(n,k)
-
694  urot=crot(n)*uo(n,k)-srot(n)*vo(n,k)
-
695  vrot=srot(n)*uo(n,k)+crot(n)*vo(n,k)
-
696  uo(n,k)=urot
-
697  vo(n,k)=vrot
-
698  ELSE
-
699  ibo(k)=1
-
700  uo(n,k)=0.
-
701  vo(n,k)=0.
-
702  ENDIF
-
703  ENDDO
-
704  !$OMP END PARALLEL DO
-
705  ENDDO
-
706 
-
707  select type(grid_out2)
-
708  type is(ip_equid_cylind_grid)
-
709  CALL polfixv(no,mo,km,rlat,rlon,ibo,lo,uo,vo)
-
710  end select
-
711  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
712  END SUBROUTINE interpolate_budget_vector
-
713 
-
714 end module budget_interp_mod
- - -
subroutine movect(FLAT, FLON, TLAT, TLON, CROT, SROT)
This subprogram provides the rotation parameters to move a vector along a great circle from one posit...
Definition: movect.F90:26
-
Budget interpolation routines for scalars and vectors.
-
subroutine interpolate_budget_scalar(IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
Performs budget interpolation from any grid to any grid (or to random station points) for scalar fiel...
-
subroutine interpolate_budget_vector(IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
This subprogram performs budget interpolation from any grid to any grid (or to random station points)...
-
Driver module for gdswzd routines.
Definition: gdswzd_mod.F90:25
-
Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
-
Routines for creating an ip_grid given a Grib descriptor.
-
Re-export the individual grids.
Definition: ip_grids_mod.F90:7
-
Make multiple pole scalar values consistent.
Definition: polfix_mod.F90:7
-
subroutine, public polfixs(NM, NX, KM, RLAT, IB, LO, GO)
Make multiple pole scalar values consistent.
Definition: polfix_mod.F90:30
-
subroutine, public polfixv(NM, NX, KM, RLAT, RLON, IB, LO, UO, VO)
Make multiple pole vector values consistent,.
Definition: polfix_mod.F90:125
+Go to the documentation of this file.
1
+
5
+ +
11 use gdswzd_mod
+
12 use polfix_mod
+
13 use ip_grids_mod
+ + +
16 implicit none
+
17
+
18 private
+
19 public :: interpolate_budget
+
20
+
+ +
22 module procedure interpolate_budget_scalar
+
23 module procedure interpolate_budget_vector
+
+
24 end interface interpolate_budget
+
25
+
26 ! Smallest positive real value (use for equality comparisons)
+
27 REAL :: TINYREAL=tiny(1.0)
+
28
+
29contains
+
30
+
+
94 SUBROUTINE interpolate_budget_scalar(IPOPT,grid_in,grid_out, &
+
95 MI,MO,KM,IBI,LI,GI, &
+
96 NO,RLAT,RLON,IBO,LO,GO,IRET)
+
97 class(ip_grid), intent(in) :: grid_in, grid_out
+
98 INTEGER, INTENT(IN ) :: IBI(KM), IPOPT(20)
+
99 INTEGER, INTENT(IN ) :: KM, MI, MO
+
100 INTEGER, INTENT( OUT) :: IBO(KM), IRET, NO
+
101 !
+
102 LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
+
103 LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
+
104 !
+
105 REAL, INTENT(IN ) :: GI(MI,KM)
+
106 REAL, INTENT(INOUT) :: RLAT(MO), RLON(MO)
+
107 REAL, INTENT( OUT) :: GO(MO,KM)
+
108 !
+
109 REAL, PARAMETER :: FILL=-9999.
+
110 !
+
111 INTEGER :: I1, J1, I2, J2, IB, JB
+
112 INTEGER :: IX, JX, IXS, JXS
+
113 INTEGER :: K, KXS, KXT
+
114 INTEGER :: LB, LSW, MP, MSPIRAL, MX
+
115 INTEGER :: N, NB, NB1, NB2, NB3, NB4, NV, NX
+
116 INTEGER :: N11(MO),N21(MO),N12(MO),N22(MO)
+
117 !
+
118 REAL :: GB, LAT(1), LON(1)
+
119 REAL :: PMP, RB2, RLOB(MO), RLAB(MO), WB
+
120 REAL :: W11(MO), W21(MO), W12(MO), W22(MO)
+
121 REAL :: WO(MO,KM), XF, YF, XI, YI, XX, YY
+
122 REAL :: XPTS(MO),YPTS(MO),XPTB(MO),YPTB(MO)
+
123 REAL :: XXX(1), YYY(1)
+
124
+
125 logical :: to_station_points
+
126
+
127 class(ip_grid), allocatable :: grid_out2
+
128
+
129 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
130 ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
+
131 ! DO SUBSECTION OF GRID IF KGDSO(1) IS SUBTRACTED FROM 255.
+
132 iret=0
+
133
+
134 select type(grid_out)
+
135 type is(ip_station_points_grid)
+
136 to_station_points = .true.
+
137 allocate(grid_out2, source = grid_out)
+
138 CALL gdswzd(grid_out2, 0,mo,fill,xpts,ypts,rlon,rlat,no)
+
139 IF(no.EQ.0) iret=3
+
140 CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv)
+
141 IF(nv.EQ.0) iret=2
+
142 class default
+
143 to_station_points = .false.
+
144 allocate(grid_out2, source = grid_out)
+
145 CALL gdswzd(grid_out2, 0,mo,fill,xpts,ypts,rlon,rlat,no)
+
146 IF(no.EQ.0) iret=3
+
147 end select
+
148
+
149 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
150 ! SET PARAMETERS
+
151 IF(ipopt(1).GT.16) iret=32
+
152 mspiral=max(ipopt(20),1)
+
153 nb1=ipopt(1)
+
154 IF(nb1.EQ.-1) nb1=2
+
155 IF(iret.EQ.0.AND.nb1.LT.0) iret=32
+
156 lsw=1
+
157 IF(ipopt(2).EQ.-2) lsw=2
+
158 IF(ipopt(1).EQ.-1.OR.ipopt(2).EQ.-1) lsw=0
+
159 IF(iret.EQ.0.AND.lsw.EQ.1.AND.nb1.GT.15) iret=32
+
160 mp=ipopt(3+ipopt(1))
+
161 IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
+
162 IF(mp.LT.0.OR.mp.GT.100) iret=32
+
163 pmp=mp*0.01
+
164 IF(iret.EQ.0) THEN
+
165 nb2=2*nb1+1
+
166 rb2=1./nb2
+
167 nb3=nb2*nb2
+
168 nb4=nb3
+
169 IF(lsw.EQ.2) THEN
+
170 rb2=1./(nb1+1)
+
171 nb4=(nb1+1)**4
+
172 ELSEIF(lsw.EQ.1) THEN
+
173 nb4=ipopt(2)
+
174 DO ib=1,nb1
+
175 nb4=nb4+8*ib*ipopt(2+ib)
+
176 ENDDO
+
177 ENDIF
+
178 ELSE
+
179 nb3=0
+
180 nb4=1
+
181 ENDIF
+
182 DO k=1,km
+
183 DO n=1,no
+
184 go(n,k)=0.
+
185 wo(n,k)=0.
+
186 ENDDO
+
187 ENDDO
+
188 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
189 ! LOOP OVER SAMPLE POINTS IN OUTPUT GRID BOX
+
190 DO nb=1,nb3
+
191 ! LOCATE INPUT POINTS AND COMPUTE THEIR WEIGHTS
+
192 jb=(nb-1)/nb2-nb1
+
193 ib=nb-(jb+nb1)*nb2-nb1-1
+
194 lb=max(abs(ib),abs(jb))
+
195 wb=1
+
196 IF(lsw.EQ.2) THEN
+
197 wb=(nb1+1-abs(ib))*(nb1+1-abs(jb))
+
198 ELSEIF(lsw.EQ.1) THEN
+
199 wb=ipopt(2+lb)
+
200 ENDIF
+
201 IF(abs(wb).GT.tinyreal) THEN
+
202 !$OMP PARALLEL DO PRIVATE(N) SCHEDULE(STATIC)
+
203 DO n=1,no
+
204 xptb(n)=xpts(n)+ib*rb2
+
205 yptb(n)=ypts(n)+jb*rb2
+
206 ENDDO
+
207 !$OMP END PARALLEL DO
+
208 if(to_station_points)then
+
209 CALL gdswzd(grid_in, 1,no,fill,xptb,yptb,rlob,rlab,nv)
+
210 CALL gdswzd(grid_in,-1,no,fill,xptb,yptb,rlob,rlab,nv)
+
211 else
+
212 CALL gdswzd(grid_out2, 1,no,fill,xptb,yptb,rlob,rlab,nv)
+
213 CALL gdswzd(grid_in,-1,no,fill,xptb,yptb,rlob,rlab,nv)
+
214 endif
+
215 IF(iret.EQ.0.AND.nv.EQ.0.AND.lb.EQ.0) iret=2
+
216 !$OMP PARALLEL DO PRIVATE(N,XI,YI,I1,I2,J1,J2,XF,YF) SCHEDULE(STATIC)
+
217 DO n=1,no
+
218 xi=xptb(n)
+
219 yi=yptb(n)
+
220 IF(abs(xi-fill).GT.tinyreal.AND.abs(yi-fill).GT.tinyreal) THEN
+
221 i1=int(xi)
+
222 i2=i1+1
+
223 j1=int(yi)
+
224 j2=j1+1
+
225 xf=xi-i1
+
226 yf=yi-j1
+
227 n11(n)=grid_in%field_pos(i1, j1)
+
228 n21(n)=grid_in%field_pos(i2, j1)
+
229 n12(n)=grid_in%field_pos(i1, j2)
+
230 n22(n)=grid_in%field_pos(i2, j2)
+
231 IF(min(n11(n),n21(n),n12(n),n22(n)).GT.0) THEN
+
232 w11(n)=(1-xf)*(1-yf)
+
233 w21(n)=xf*(1-yf)
+
234 w12(n)=(1-xf)*yf
+
235 w22(n)=xf*yf
+
236 ELSE
+
237 n11(n)=0
+
238 n21(n)=0
+
239 n12(n)=0
+
240 n22(n)=0
+
241 ENDIF
+
242 ELSE
+
243 n11(n)=0
+
244 n21(n)=0
+
245 n12(n)=0
+
246 n22(n)=0
+
247 ENDIF
+
248 ENDDO
+
249 !$OMP END PARALLEL DO
+
250 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
251 ! INTERPOLATE WITH OR WITHOUT BITMAPS
+
252 !$OMP PARALLEL DO PRIVATE(K,N,GB) SCHEDULE(STATIC)
+
253 DO k=1,km
+
254 DO n=1,no
+
255 IF(n11(n).GT.0) THEN
+
256 IF(ibi(k).EQ.0) THEN
+
257 gb=w11(n)*gi(n11(n),k)+w21(n)*gi(n21(n),k) &
+
258 +w12(n)*gi(n12(n),k)+w22(n)*gi(n22(n),k)
+
259 go(n,k)=go(n,k)+wb*gb
+
260 wo(n,k)=wo(n,k)+wb
+
261 ELSE
+
262 IF(li(n11(n),k)) THEN
+
263 go(n,k)=go(n,k)+wb*w11(n)*gi(n11(n),k)
+
264 wo(n,k)=wo(n,k)+wb*w11(n)
+
265 ENDIF
+
266 IF(li(n21(n),k)) THEN
+
267 go(n,k)=go(n,k)+wb*w21(n)*gi(n21(n),k)
+
268 wo(n,k)=wo(n,k)+wb*w21(n)
+
269 ENDIF
+
270 IF(li(n12(n),k)) THEN
+
271 go(n,k)=go(n,k)+wb*w12(n)*gi(n12(n),k)
+
272 wo(n,k)=wo(n,k)+wb*w12(n)
+
273 ENDIF
+
274 IF(li(n22(n),k)) THEN
+
275 go(n,k)=go(n,k)+wb*w22(n)*gi(n22(n),k)
+
276 wo(n,k)=wo(n,k)+wb*w22(n)
+
277 ENDIF
+
278 ENDIF
+
279 ENDIF
+
280 ENDDO
+
281 ENDDO
+
282 !$OMP END PARALLEL DO
+
283 ENDIF
+
284 ENDDO ! sub-grid points
+
285 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
286 ! COMPUTE OUTPUT BITMAPS AND FIELDS
+
287 ! KM is often 1 .. do not do OMP PARALLEL DO here
+
288 km_loop : DO k=1,km
+
289 ibo(k)=ibi(k)
+
290 !$OMP PARALLEL DO PRIVATE(N,LAT,LON,XXX,YYY,NV,XX,YY,IXS,JXS,MX,KXS,KXT,IX,JX,NX) SCHEDULE(STATIC)
+
291 n_loop : DO n=1,no
+
292 lo(n,k)=wo(n,k).GE.pmp*nb4
+
293 IF(lo(n,k)) THEN
+
294 go(n,k)=go(n,k)/wo(n,k)
+
295 ELSEIF (mspiral.GT.1) THEN
+
296 lat(1)=rlat(n)
+
297 lon(1)=rlon(n)
+
298 CALL gdswzd(grid_in,-1,1,fill,xxx,yyy,lon,lat,nv)
+
299 xx=xxx(1)
+
300 yy=yyy(1)
+
301 IF(nv.EQ.1)THEN
+
302 i1=nint(xx)
+
303 j1=nint(yy)
+
304 ixs=int(sign(1.,xx-i1))
+
305 jxs=int(sign(1.,yy-j1))
+
306 spiral_loop : DO mx=2,mspiral**2
+
307 kxs=int(sqrt(4*mx-2.5))
+
308 kxt=mx-(kxs**2/4+1)
+
309 SELECT CASE(mod(kxs,4))
+
310 CASE(1)
+
311 ix=i1-ixs*(kxs/4-kxt)
+
312 jx=j1-jxs*kxs/4
+
313 CASE(2)
+
314 ix=i1+ixs*(1+kxs/4)
+
315 jx=j1-jxs*(kxs/4-kxt)
+
316 CASE(3)
+
317 ix=i1+ixs*(1+kxs/4-kxt)
+
318 jx=j1+jxs*(1+kxs/4)
+
319 CASE DEFAULT
+
320 ix=i1-ixs*kxs/4
+
321 jx=j1+jxs*(kxs/4-kxt)
+
322 END SELECT
+
323 nx=grid_in%field_pos(ix, jx)
+
324 IF(nx.GT.0.)THEN
+
325 IF(li(nx,k).OR.ibi(k).EQ.0) THEN
+
326 go(n,k)=gi(nx,k)
+
327 lo(n,k)=.true.
+
328 cycle n_loop
+
329 ENDIF
+
330 ENDIF
+
331 ENDDO spiral_loop
+
332 ibo(k)=1
+
333 go(n,k)=0.
+
334 ELSE
+
335 ibo(k)=1
+
336 go(n,k)=0.
+
337 ENDIF
+
338 ELSE ! no spiral search option
+
339 ibo(k)=1
+
340 go(n,k)=0.
+
341 ENDIF
+
342 ENDDO n_loop
+
343 !$OMP END PARALLEL DO
+
344 ENDDO km_loop
+
345
+
346 select type(grid_out2)
+
347 type is(ip_equid_cylind_grid)
+
348 CALL polfixs(no,mo,km,rlat,ibo,lo,go)
+
349 end select
+
350 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+
351 END SUBROUTINE interpolate_budget_scalar
+
352
+
+
423 SUBROUTINE interpolate_budget_vector(IPOPT,grid_in,grid_out, &
+
424 MI,MO,KM,IBI,LI,UI,VI, &
+
425 NO,RLAT,RLON,CROT,SROT,IBO,LO,UO,VO,IRET)
+
426 class(ip_grid), intent(in) :: grid_in, grid_out
+
427 INTEGER, INTENT(IN ) :: IPOPT(20), IBI(KM)
+
428 INTEGER, INTENT(IN ) :: KM, MI, MO
+
429 INTEGER, INTENT( OUT) :: IRET, NO, IBO(KM)
+
430 !
+
431 LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
+
432 LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
+
433 !
+
434 REAL, INTENT(IN ) :: UI(MI,KM),VI(MI,KM)
+
435 REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO)
+
436 REAL, INTENT( OUT) :: UO(MO,KM),VO(MO,KM)
+
437 REAL, INTENT( OUT) :: CROT(MO),SROT(MO)
+
438 !
+
439 REAL, PARAMETER :: FILL=-9999.
+
440 !
+
441 INTEGER :: I1,I2,J1,J2,IB,JB,LSW,MP
+
442 INTEGER :: K,LB,N,NB,NB1,NB2,NB3,NB4,NV
+
443 INTEGER :: N11(MO),N21(MO),N12(MO),N22(MO)
+
444 !
+
445 LOGICAL :: SAME_GRID
+
446 !
+
447 REAL :: CM11,SM11,CM12,SM12
+
448 REAL :: CM21,SM21,CM22,SM22
+
449 REAL :: PMP,RB2
+
450 REAL :: C11(MO),C21(MO),C12(MO),C22(MO)
+
451 REAL :: S11(MO),S21(MO),S12(MO),S22(MO)
+
452 REAL :: W11(MO),W21(MO),W12(MO),W22(MO)
+
453 REAL :: UB,VB,WB,UROT,VROT
+
454 REAL :: U11,V11,U21,V21,U12,V12,U22,V22
+
455 REAL :: WI1,WJ1,WI2,WJ2
+
456 REAL :: WO(MO,KM),XI,YI
+
457 REAL :: XPTS(MO),YPTS(MO)
+
458 REAL :: XPTB(MO),YPTB(MO),RLOB(MO),RLAB(MO)
+
459
+
460 logical :: to_station_points
+
461
+
462 class(ip_grid), allocatable :: grid_out2
+
463
+
464 ! Save coeffecients between calls and only compute if grids have changed
+
465 INTEGER, SAVE :: MIX=-1
+
466 REAL, ALLOCATABLE, SAVE :: CROI(:),SROI(:)
+
467 REAL, ALLOCATABLE, SAVE :: XPTI(:),YPTI(:),RLOI(:),RLAI(:)
+
468
+
469 class(ip_grid), allocatable, save :: prev_grid_in
+
470
+
471 iret=0
+
472
+
473 ! Negative grid number means interpolate to subgrid
+
474 ! The type of the subgrid is calculated by 255 +
+
475 select type(grid_out)
+
476 type is(ip_station_points_grid)
+
477 to_station_points = .true.
+
478 allocate(grid_out2, source = grid_out)
+
479 CALL gdswzd(grid_out2, 0,mo,fill,xpts,ypts,rlon,rlat,no,crot,srot)
+
480 IF(no.EQ.0) iret=3
+
481 CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv,crot,srot)
+
482 IF(nv.EQ.0) iret=2
+
483 class default
+
484 to_station_points = .false.
+
485 allocate(grid_out2, source = grid_out)
+
486 CALL gdswzd(grid_out2, 0,mo,fill,xpts,ypts,rlon,rlat,no,crot,srot)
+
487 end select
+
488
+
489 if (.not. allocated(prev_grid_in)) then
+
490 allocate(prev_grid_in, source = grid_in)
+
491
+
492 same_grid = .false.
+
493 else
+
494 same_grid = grid_in == prev_grid_in
+
495
+
496 if (.not. same_grid) then
+
497 deallocate(prev_grid_in)
+
498 allocate(prev_grid_in, source = grid_in)
+
499 end if
+
500 end if
+
501
+
502 IF(.NOT.same_grid) THEN
+
503 IF(mix.NE.mi) THEN
+
504 IF(mix.GE.0) DEALLOCATE(xpti,ypti,rloi,rlai,croi,sroi)
+
505 ALLOCATE(xpti(mi),ypti(mi),rloi(mi),rlai(mi),croi(mi),sroi(mi))
+
506 mix=mi
+
507 ENDIF
+
508 CALL gdswzd(grid_in, 0,mi,fill,xpti,ypti,rloi,rlai,nv,croi,sroi)
+
509 ENDIF
+
510
+
511 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
512 ! SET PARAMETERS
+
513 nb1=ipopt(1)
+
514 IF(nb1.EQ.-1) nb1=2
+
515 IF(iret.EQ.0.AND.nb1.LT.0) iret=32
+
516 lsw=1
+
517 IF(ipopt(2).EQ.-2) lsw=2
+
518 IF(ipopt(1).EQ.-1.OR.ipopt(2).EQ.-1) lsw=0
+
519 IF(iret.EQ.0.AND.lsw.EQ.1.AND.nb1.GT.15) iret=32
+
520 mp=ipopt(3+ipopt(1))
+
521 IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
+
522 IF(mp.LT.0.OR.mp.GT.100) iret=32
+
523 pmp=mp*0.01
+
524 IF(iret.EQ.0) THEN
+
525 nb2=2*nb1+1
+
526 rb2=1./nb2
+
527 nb3=nb2*nb2
+
528 nb4=nb3
+
529 IF(lsw.EQ.2) THEN
+
530 rb2=1./(nb1+1)
+
531 nb4=(nb1+1)**4
+
532 ELSEIF(lsw.EQ.1) THEN
+
533 nb4=ipopt(2)
+
534 DO ib=1,nb1
+
535 nb4=nb4+8*ib*ipopt(2+ib)
+
536 ENDDO
+
537 ENDIF
+
538 ELSE
+
539 nb3=0
+
540 nb4=1
+
541 ENDIF
+
542 DO k=1,km
+
543 DO n=1,no
+
544 uo(n,k)=0
+
545 vo(n,k)=0
+
546 wo(n,k)=0.
+
547 ENDDO
+
548 ENDDO
+
549 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
550 ! LOOP OVER SAMPLE POINTS IN OUTPUT GRID BOX
+
551 DO nb=1,nb3
+
552 ! LOCATE INPUT POINTS AND COMPUTE THEIR WEIGHTS AND ROTATIONS
+
553 jb=(nb-1)/nb2-nb1
+
554 ib=nb-(jb+nb1)*nb2-nb1-1
+
555 lb=max(abs(ib),abs(jb))
+
556 wb=1
+
557 IF(ipopt(2).EQ.-2) THEN
+
558 wb=(nb1+1-abs(ib))*(nb1+1-abs(jb))
+
559 ELSEIF(ipopt(2).NE.-1) THEN
+
560 wb=ipopt(2+lb)
+
561 ENDIF
+
562 IF(abs(wb).GT.tinyreal) THEN
+
563 !$OMP PARALLEL DO PRIVATE(N) SCHEDULE(STATIC)
+
564 DO n=1,no
+
565 xptb(n)=xpts(n)+ib*rb2
+
566 yptb(n)=ypts(n)+jb*rb2
+
567 ENDDO
+
568 !$OMP END PARALLEL DO
+
569 if(to_station_points)then
+
570 CALL gdswzd(grid_in, 1,no,fill,xptb,yptb,rlob,rlab,nv)
+
571 CALL gdswzd(grid_in,-1,no,fill,xptb,yptb,rlob,rlab,nv)
+
572 else
+
573 CALL gdswzd(grid_out2, 1,no,fill,xptb,yptb,rlob,rlab,nv)
+
574 CALL gdswzd(grid_in,-1,no,fill,xptb,yptb,rlob,rlab,nv)
+
575 endif
+
576 IF(iret.EQ.0.AND.nv.EQ.0.AND.lb.EQ.0) iret=2
+
577 !$OMP PARALLEL DO PRIVATE(N,XI,YI,I1,I2,WI1,WI2,J1,J2,WJ1,WJ2,CM11,CM21,CM12,CM22,SM11,SM21,SM12,SM22) &
+
578 !$OMP SCHEDULE(STATIC)
+
579 DO n=1,no
+
580 xi=xptb(n)
+
581 yi=yptb(n)
+
582 IF(abs(xi-fill).GT.tinyreal.AND.abs(yi-fill).GT.tinyreal) THEN
+
583 i1=int(xi)
+
584 i2=i1+1
+
585 wi2=xi-i1
+
586 wi1=1-wi2
+
587 j1=int(yi)
+
588 j2=j1+1
+
589 wj2=yi-j1
+
590 wj1=1-wj2
+
591 n11(n) = grid_in%field_pos(i1,j1)
+
592 n21(n) = grid_in%field_pos(i2, j1)
+
593 n12(n) = grid_in%field_pos(i1, j2)
+
594 n22(n) = grid_in%field_pos(i2, j2)
+
595 IF(min(n11(n),n21(n),n12(n),n22(n)).GT.0) THEN
+
596 w11(n)=wi1*wj1
+
597 w21(n)=wi2*wj1
+
598 w12(n)=wi1*wj2
+
599 w22(n)=wi2*wj2
+
600 CALL movect(rlai(n11(n)),rloi(n11(n)),rlat(n),rlon(n),cm11,sm11)
+
601 CALL movect(rlai(n21(n)),rloi(n21(n)),rlat(n),rlon(n),cm21,sm21)
+
602 CALL movect(rlai(n12(n)),rloi(n12(n)),rlat(n),rlon(n),cm12,sm12)
+
603 CALL movect(rlai(n22(n)),rloi(n22(n)),rlat(n),rlon(n),cm22,sm22)
+
604 c11(n)=cm11*croi(n11(n))+sm11*sroi(n11(n))
+
605 s11(n)=sm11*croi(n11(n))-cm11*sroi(n11(n))
+
606 c21(n)=cm21*croi(n21(n))+sm21*sroi(n21(n))
+
607 s21(n)=sm21*croi(n21(n))-cm21*sroi(n21(n))
+
608 c12(n)=cm12*croi(n12(n))+sm12*sroi(n12(n))
+
609 s12(n)=sm12*croi(n12(n))-cm12*sroi(n12(n))
+
610 c22(n)=cm22*croi(n22(n))+sm22*sroi(n22(n))
+
611 s22(n)=sm22*croi(n22(n))-cm22*sroi(n22(n))
+
612 ELSE
+
613 n11(n)=0
+
614 n21(n)=0
+
615 n12(n)=0
+
616 n22(n)=0
+
617 ENDIF
+
618 ELSE
+
619 n11(n)=0
+
620 n21(n)=0
+
621 n12(n)=0
+
622 n22(n)=0
+
623 ENDIF
+
624 ENDDO
+
625 !$OMP END PARALLEL DO
+
626 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
627 ! INTERPOLATE WITH OR WITHOUT BITMAPS
+
628 ! KM IS OFTEN 1 .. DO NO PUT OMP PARALLEL DO HERE
+
629 DO k=1,km
+
630 !$OMP PARALLEL DO PRIVATE(N,U11,U12,U21,U22,UB,V11,V12,V21,V22,VB) SCHEDULE(STATIC)
+
631 DO n=1,no
+
632 IF(n11(n).GT.0) THEN
+
633 IF(ibi(k).EQ.0) THEN
+
634 u11=c11(n)*ui(n11(n),k)-s11(n)*vi(n11(n),k)
+
635 v11=s11(n)*ui(n11(n),k)+c11(n)*vi(n11(n),k)
+
636 u21=c21(n)*ui(n21(n),k)-s21(n)*vi(n21(n),k)
+
637 v21=s21(n)*ui(n21(n),k)+c21(n)*vi(n21(n),k)
+
638 u12=c12(n)*ui(n12(n),k)-s12(n)*vi(n12(n),k)
+
639 v12=s12(n)*ui(n12(n),k)+c12(n)*vi(n12(n),k)
+
640 u22=c22(n)*ui(n22(n),k)-s22(n)*vi(n22(n),k)
+
641 v22=s22(n)*ui(n22(n),k)+c22(n)*vi(n22(n),k)
+
642 ub=w11(n)*u11+w21(n)*u21+w12(n)*u12+w22(n)*u22
+
643 vb=w11(n)*v11+w21(n)*v21+w12(n)*v12+w22(n)*v22
+
644 uo(n,k)=uo(n,k)+wb*ub
+
645 vo(n,k)=vo(n,k)+wb*vb
+
646 wo(n,k)=wo(n,k)+wb
+
647 ELSE
+
648 IF(li(n11(n),k)) THEN
+
649 u11=c11(n)*ui(n11(n),k)-s11(n)*vi(n11(n),k)
+
650 v11=s11(n)*ui(n11(n),k)+c11(n)*vi(n11(n),k)
+
651 uo(n,k)=uo(n,k)+wb*w11(n)*u11
+
652 vo(n,k)=vo(n,k)+wb*w11(n)*v11
+
653 wo(n,k)=wo(n,k)+wb*w11(n)
+
654 ENDIF
+
655 IF(li(n21(n),k)) THEN
+
656 u21=c21(n)*ui(n21(n),k)-s21(n)*vi(n21(n),k)
+
657 v21=s21(n)*ui(n21(n),k)+c21(n)*vi(n21(n),k)
+
658 uo(n,k)=uo(n,k)+wb*w21(n)*u21
+
659 vo(n,k)=vo(n,k)+wb*w21(n)*v21
+
660 wo(n,k)=wo(n,k)+wb*w21(n)
+
661 ENDIF
+
662 IF(li(n12(n),k)) THEN
+
663 u12=c12(n)*ui(n12(n),k)-s12(n)*vi(n12(n),k)
+
664 v12=s12(n)*ui(n12(n),k)+c12(n)*vi(n12(n),k)
+
665 uo(n,k)=uo(n,k)+wb*w12(n)*u12
+
666 vo(n,k)=vo(n,k)+wb*w12(n)*v12
+
667 wo(n,k)=wo(n,k)+wb*w12(n)
+
668 ENDIF
+
669 IF(li(n22(n),k)) THEN
+
670 u22=c22(n)*ui(n22(n),k)-s22(n)*vi(n22(n),k)
+
671 v22=s22(n)*ui(n22(n),k)+c22(n)*vi(n22(n),k)
+
672 uo(n,k)=uo(n,k)+wb*w22(n)*u22
+
673 vo(n,k)=vo(n,k)+wb*w22(n)*v22
+
674 wo(n,k)=wo(n,k)+wb*w22(n)
+
675 ENDIF
+
676 ENDIF
+
677 ENDIF
+
678 ENDDO
+
679 !$OMP END PARALLEL DO
+
680 ENDDO
+
681 ENDIF
+
682 ENDDO
+
683 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
684 ! COMPUTE OUTPUT BITMAPS AND FIELDS
+
685 ! KM is often 1, do not put OMP PARALLEL here
+
686 DO k=1,km
+
687 ibo(k)=ibi(k)
+
688 !$OMP PARALLEL DO PRIVATE(N,UROT,VROT) SCHEDULE(STATIC)
+
689 DO n=1,no
+
690 lo(n,k)=wo(n,k).GE.pmp*nb4
+
691 IF(lo(n,k)) THEN
+
692 uo(n,k)=uo(n,k)/wo(n,k)
+
693 vo(n,k)=vo(n,k)/wo(n,k)
+
694 urot=crot(n)*uo(n,k)-srot(n)*vo(n,k)
+
695 vrot=srot(n)*uo(n,k)+crot(n)*vo(n,k)
+
696 uo(n,k)=urot
+
697 vo(n,k)=vrot
+
698 ELSE
+
699 ibo(k)=1
+
700 uo(n,k)=0.
+
701 vo(n,k)=0.
+
702 ENDIF
+
703 ENDDO
+
704 !$OMP END PARALLEL DO
+
705 ENDDO
+
706
+
707 select type(grid_out2)
+
708 type is(ip_equid_cylind_grid)
+
709 CALL polfixv(no,mo,km,rlat,rlon,ibo,lo,uo,vo)
+
710 end select
+
711 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+
712 END SUBROUTINE interpolate_budget_vector
+
713
+
714end module budget_interp_mod
+ + +
subroutine movect(flat, flon, tlat, tlon, crot, srot)
This subprogram provides the rotation parameters to move a vector along a great circle from one posit...
Definition movect.F90:26
+
Budget interpolation routines for scalars and vectors.
+
subroutine interpolate_budget_scalar(ipopt, grid_in, grid_out, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
Performs budget interpolation from any grid to any grid (or to random station points) for scalar fiel...
+
subroutine interpolate_budget_vector(ipopt, grid_in, grid_out, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
This subprogram performs budget interpolation from any grid to any grid (or to random station points)...
+
Driver module for gdswzd routines.
+
Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
+
Routines for creating an ip_grid given a Grib descriptor.
+
Re-export the individual grids.
+
Make multiple pole scalar values consistent.
Definition polfix_mod.F90:7
+
subroutine, public polfixs(nm, nx, km, rlat, ib, lo, go)
Make multiple pole scalar values consistent.
+
subroutine, public polfixv(nm, nx, km, rlat, rlon, ib, lo, uo, vo)
Make multiple pole vector values consistent,.
diff --git a/classes.html b/classes.html index b64bf5d2..36cd1a8e 100644 --- a/classes.html +++ b/classes.html @@ -1,11 +1,11 @@ - + - - + + -NCEPLIBS-ip: Data Types +NCEPLIBS-ip: Data Type Index @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,29 +76,35 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
Data Types
+
Data Type Index
@@ -106,7 +112,7 @@ diff --git a/dir_49e56c817e5e54854c35e136979f97ca.html b/dir_49e56c817e5e54854c35e136979f97ca.html index ad5da577..87b7ee88 100644 --- a/dir_49e56c817e5e54854c35e136979f97ca.html +++ b/dir_49e56c817e5e54854c35e136979f97ca.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: docs Directory Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,14 +76,20 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
docs Directory Reference
+
docs Directory Reference
@@ -92,7 +98,7 @@ diff --git a/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/dir_68267d1309a1af8e8297ef4c3efbcdba.html index b4bd3e34..2c915805 100644 --- a/dir_68267d1309a1af8e8297ef4c3efbcdba.html +++ b/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: src Directory Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,284 +76,292 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
src Directory Reference
+
src Directory Reference
- - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

+

Files

file  bicubic_interp_mod.F90 [code]
 bicubic_interp_mod.F90
 Bicubic interpolation routines for scalars and vectors.
 
file  bilinear_interp_mod.F90 [code]
 bilinear_interp_mod.F90
 Bilinear interpolation routines for scalars and vectors.
 
file  budget_interp_mod.F90 [code]
 budget_interp_mod.F90
 Budget interpolation routines for scalars and vectors.
 
file  earth_radius_mod.F90 [code]
 earth_radius_mod.F90
 Determine earth radius and shape.
 
file  fftpack.F [code]
 fftpack.F
 A concatination of the (FFTPACK)[https://netlib.org/fftpack/] library code.
 
file  gdswzd_c.F90 [code]
 gdswzd_c.F90
 C wrapper for routine gdswzd().
 
file  gdswzd_mod.F90 [code]
 gdswzd_mod.F90
 Driver module for gdswzd routines.
 
file  ip_constants_mod.F90 [code]
 ip_constants_mod.F90
 Constants for use in NCEPLIBS-ip.
 
file  ip_equid_cylind_grid_mod.F90 [code]
 ip_equid_cylind_grid_mod.F90
 Equidistant cylindrical grib decoder and grid coordinate transformations.
 
file  ip_gaussian_grid_mod.F90 [code]
 ip_gaussian_grid_mod.F90
 Gaussian grid coordinate transformations.
 
file  ip_grid_descriptor_mod.F90 [code]
 ip_grid_descriptor_mod.F90
 Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
 
file  ip_grid_factory_mod.F90 [code]
 ip_grid_factory_mod.F90
 Routines for creating an ip_grid given a Grib descriptor.
 
file  ip_grid_mod.F90 [code]
 ip_grid_mod.F90
 Abstract ip_grid type.
 
file  ip_grids_mod.F90 [code]
 ip_grids_mod.F90
 Re-export the individual grids.
 
file  ip_interpolators_mod.F90 [code]
 ip_interpolators_mod.F90
 Top-level module to export interpolation routines and constants.
 
file  ip_lambert_conf_grid_mod.F90 [code]
 ip_lambert_conf_grid_mod.F90
 GDS wizard for lambert conformal conical.
 
file  ip_mercator_grid_mod.F90 [code]
 ip_mercator_grid_mod.F90
 GDS wizard for mercator cylindrical.
 
file  ip_mod.F90 [code]
 ip_mod.F90
 Top-level module for the ip library.
 
file  ip_polar_stereo_grid_mod.F90 [code]
 ip_polar_stereo_grid_mod.F90
 GDS wizard for polar stereographic azimuthal.
 
file  ip_rot_equid_cylind_egrid_mod.F90 [code]
 ip_rot_equid_cylind_egrid_mod.F90
 Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grid E.
 
file  ip_rot_equid_cylind_grid_mod.F90 [code]
 ip_rot_equid_cylind_grid_mod.F90
 Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grids A through D.
 
file  ip_station_points_grid_mod.F90 [code]
 ip_station_points_grid_mod.F90
 Interpolate gridded data to a series of station points.
 
file  iplib_4.h [code]
 C interface to gdswzd() and gdswzd_grib1() functions for '4' library build.
 iplib_4.h
 C interface to gdswzd() and gdswzd_grib1() functions for '4' library build.
 
file  iplib_8.h [code]
 C interface to gdswzd() and gdswzd_grib1() functions for '8' library build.
 iplib_8.h
 C interface to gdswzd() and gdswzd_grib1() functions for '8' library build.
 
file  iplib_d.h [code]
 C interface to gdswzd() and gdswzd_grib1() functions for 'd' library build.
 iplib_d.h
 C interface to gdswzd() and gdswzd_grib1() functions for 'd' library build.
 
file  ipolates.F90 [code]
 ipolates.F90
 Top-level driver for scalar interpolation routine ipolates().
 
file  ipolatev.F90 [code]
 ipolatev.F90
 Top-level driver for vector interpolation routine ipolates.
 
file  ipxetas.F90 [code]
 ipxetas.F90
 Expand or contract eta grids using linear interpolation.
 
file  ipxwafs.F90 [code]
 ipxwafs.F90
 Expand or contract wafs grids.
 
file  ipxwafs2.F90 [code]
 ipxwafs2.F90
 Expand or contract wafs grids using linear interpolation and account for bitmapped data.
 
file  ipxwafs3.F90 [code]
 ipxwafs3.F90
 Expand or contract wafs grids using neighbor interpolation and accout for bitmapped data.
 
file  movect.F90 [code]
 movect.F90
 Move a vector along a great circle.
 
file  ncpus.F [code]
 ncpus.F
 Set number of cpus.
 
file  neighbor_budget_interp_mod.F90 [code]
 neighbor_budget_interp_mod.F90
 Interpolate scalar and vector fields with neighbor budget interpolation.
 
file  neighbor_interp_mod.F90 [code]
 neighbor_interp_mod.F90
 Interpolate scalar and vector fields with neighbor interpolation.
 
file  polfix_mod.F90 [code]
 polfix_mod.F90
 Make multiple pole scalar values consistent.
 
file  spanaly.f [code]
 sp_mod.F
 
 spanaly.f
 Analyze spectral from Fourier.
 
file  spdz2uv.f [code]
 spdz2uv.f
 Compute winds from divergence and vorticity.
 
file  spectral_interp_mod.F90 [code]
 spectral_interp_mod.F90
 Interpolate spectral.
 
file  speps.f [code]
 speps.f
 Compute utility spectral fields.
 
file  spfft.f [code]
 spfft.f
 Perform multiple fast fourier transforms.
 
file  spfft1.f [code]
 spfft1.f
 Perform multiple fast Fourier transforms.
 
file  spffte.f [code]
 spffte.f
 Perform multiple fast Fourier transforms.
 
file  spfftpt.f [code]
 spfftpt.f
 Compute fourier transform to gridpoints.
 
file  spgradq.f [code]
 spgradq.f
 Compute gradient in spectral space.
 
file  spgradx.f [code]
 spgradx.f
 Compute x-gradient in Fourier space.
 
file  spgrady.f [code]
 spgrady.f
 Compute y-gradient in spectral space.
 
file  splaplac.f [code]
 splaplac.f
 Compute laplacian in spectral space.
 
file  splat.F [code]
 splat.F
 Computes cosines of colatitude and Gaussian weights for sets of latitudes.
 
file  splegend.f [code]
 splegend.f
 Compute Legendre polynomials.
 
file  sppad.f [code]
 sppad.f
 Pad or truncate a spectral field.
 
file  spsynth.f [code]
 spsynth.f
 Synthesize Fourier coefficients from spectral coefficients.
 
file  sptez.f [code]
 sptez.f
 Perform a simple scalar spherical transform.
 
file  sptezd.f [code]
 sptezd.f
 Perform a simple gradient spherical transform.
 
file  sptezm.f [code]
 sptezm.f
 Perform simple scalar spherical transforms.
 
file  sptezmd.f [code]
 sptezmd.f
 Perform simple gradient spherical transforms.
 
file  sptezmv.f [code]
 sptezmv.f
 Perform simple vector spherical transforms.
 
file  sptezv.f [code]
 sptezv.f
 Perform a simple vector spherical transform.
 
file  sptgpm.f [code]
 sptgpm.f
 Transform spectral scalar to Mercator.
 
file  sptgpmd.f [code]
 sptgpmd.f
 Transform spectral to Mercator gradients.
 
file  sptgpmv.f [code]
 sptgpmv.f
 Transform spectral vector to Mercator.
 
file  sptgps.f [code]
 sptgps.f
 Transform spectral scalar to polar stereo.
 
file  sptgpsd.f [code]
 sptgpsd.f
 Transform spectral to polar stereographic gradients.
 
file  sptgpsv.f [code]
 sptgpsv.f
 Transform spectral vector to polar stereo.
 
file  sptgpt.f [code]
 sptgpt.f
 Transform spectral scalar to station points.
 
file  sptgptd.f [code]
 sptgptd.f
 Transform spectral to station point gradients.
 
file  sptgptsd.f [code]
 sptgptsd.f
 Transform spectral scalar to station points.
 
file  sptgptv.f [code]
 sptgptv.f
 Transform spectral vector to station points.
 
file  sptgptvd.f [code]
 sptgptvd.f
 Transform spectral vector to station points.
 
file  sptran.f [code]
 sptran.f
 Perform a scalar spherical transform.
 
file  sptrand.f [code]
 sptrand.f
 Perform a gradient spherical transform.
 
file  sptranf.f [code]
 sptranf.f
 Perform a scalar spherical transform.
 
file  sptranf0.f [code]
 sptranf0.f
 Sptranf spectral initialization.
 
file  sptranf1.f [code]
 sptranf1.f
 Sptranf spectral transform.
 
file  sptranfv.f [code]
 sptranfv.f
 Perform a vector spherical transform.
 
file  sptranv.f [code]
 sptranv.f
 Perform a vector spherical transform.
 
file  sptrun.f [code]
 sptrun.f
 Truncate gridded scalar fields.
 
file  sptrund.f [code]
 sptrund.f
 Spectrally truncate to gradients.
 
file  sptrung.f [code]
 sptrung.f
 Spectrally interpolate scalars to stations.
 
file  sptrungv.f [code]
 sptrungv.f
 Spectrally interpolate vectors to stations.
 
file  sptrunl.f [code]
 sptrunl.f
 Spectrally truncate to laplacian.
 
file  sptrunm.f [code]
 sptrunm.f
 Spectrally interpolate scalars to Mercator.
 
file  sptrunmv.f [code]
 sptrunmv.f
 Spectrally interpolate vectors to Mercator.
 
file  sptruns.f [code]
 sptruns.f
 Spectrally interpolate scalars to polar stereo.
 
file  sptrunsv.f [code]
 sptrunsv.f
 Spectrally interpolate vectors to polar stereo.
 
file  sptrunv.f [code]
 sptrunv.f
 Spectrally truncate gridded vector fields.
 
file  spuv2dz.f [code]
 spuv2dz.f
 Compute divergence and vorticity from winds.
 
file  spvar.f [code]
 spvar.f
 Compute variance by total wavenumber.
 
file  spwget.f [code]
 spwget.f
 Get wave-space constants.
 
@@ -363,7 +371,7 @@ diff --git a/dir_68267d1309a1af8e8297ef4c3efbcdba.js b/dir_68267d1309a1af8e8297ef4c3efbcdba.js new file mode 100644 index 00000000..9353b538 --- /dev/null +++ b/dir_68267d1309a1af8e8297ef4c3efbcdba.js @@ -0,0 +1,93 @@ +var dir_68267d1309a1af8e8297ef4c3efbcdba = +[ + [ "bicubic_interp_mod.F90", "bicubic__interp__mod_8F90.html", "bicubic__interp__mod_8F90" ], + [ "bilinear_interp_mod.F90", "bilinear__interp__mod_8F90.html", "bilinear__interp__mod_8F90" ], + [ "budget_interp_mod.F90", "budget__interp__mod_8F90.html", "budget__interp__mod_8F90" ], + [ "earth_radius_mod.F90", "earth__radius__mod_8F90.html", "earth__radius__mod_8F90" ], + [ "fftpack.F", "fftpack_8F.html", "fftpack_8F" ], + [ "gdswzd_c.F90", "gdswzd__c_8F90.html", "gdswzd__c_8F90" ], + [ "gdswzd_mod.F90", "gdswzd__mod_8F90.html", "gdswzd__mod_8F90" ], + [ "ip_constants_mod.F90", "ip__constants__mod_8F90.html", "ip__constants__mod_8F90" ], + [ "ip_equid_cylind_grid_mod.F90", "ip__equid__cylind__grid__mod_8F90.html", "ip__equid__cylind__grid__mod_8F90" ], + [ "ip_gaussian_grid_mod.F90", "ip__gaussian__grid__mod_8F90.html", "ip__gaussian__grid__mod_8F90" ], + [ "ip_grid_descriptor_mod.F90", "ip__grid__descriptor__mod_8F90.html", "ip__grid__descriptor__mod_8F90" ], + [ "ip_grid_factory_mod.F90", "ip__grid__factory__mod_8F90.html", "ip__grid__factory__mod_8F90" ], + [ "ip_grid_mod.F90", "ip__grid__mod_8F90.html", "ip__grid__mod_8F90" ], + [ "ip_grids_mod.F90", "ip__grids__mod_8F90.html", null ], + [ "ip_interpolators_mod.F90", "ip__interpolators__mod_8F90.html", "ip__interpolators__mod_8F90" ], + [ "ip_lambert_conf_grid_mod.F90", "ip__lambert__conf__grid__mod_8F90.html", "ip__lambert__conf__grid__mod_8F90" ], + [ "ip_mercator_grid_mod.F90", "ip__mercator__grid__mod_8F90.html", "ip__mercator__grid__mod_8F90" ], + [ "ip_mod.F90", "ip__mod_8F90.html", null ], + [ "ip_polar_stereo_grid_mod.F90", "ip__polar__stereo__grid__mod_8F90.html", "ip__polar__stereo__grid__mod_8F90" ], + [ "ip_rot_equid_cylind_egrid_mod.F90", "ip__rot__equid__cylind__egrid__mod_8F90.html", "ip__rot__equid__cylind__egrid__mod_8F90" ], + [ "ip_rot_equid_cylind_grid_mod.F90", "ip__rot__equid__cylind__grid__mod_8F90.html", "ip__rot__equid__cylind__grid__mod_8F90" ], + [ "ip_station_points_grid_mod.F90", "ip__station__points__grid__mod_8F90.html", "ip__station__points__grid__mod_8F90" ], + [ "iplib_4.h", "iplib__4_8h.html", "iplib__4_8h" ], + [ "iplib_8.h", "iplib__8_8h.html", "iplib__8_8h" ], + [ "iplib_d.h", "iplib__d_8h.html", "iplib__d_8h" ], + [ "ipolates.F90", "ipolates_8F90.html", "ipolates_8F90" ], + [ "ipolatev.F90", "ipolatev_8F90.html", "ipolatev_8F90" ], + [ "ipxetas.F90", "ipxetas_8F90.html", "ipxetas_8F90" ], + [ "ipxwafs.F90", "ipxwafs_8F90.html", "ipxwafs_8F90" ], + [ "ipxwafs2.F90", "ipxwafs2_8F90.html", "ipxwafs2_8F90" ], + [ "ipxwafs3.F90", "ipxwafs3_8F90.html", "ipxwafs3_8F90" ], + [ "movect.F90", "movect_8F90.html", "movect_8F90" ], + [ "ncpus.F", "ncpus_8F.html", "ncpus_8F" ], + [ "neighbor_budget_interp_mod.F90", "neighbor__budget__interp__mod_8F90.html", "neighbor__budget__interp__mod_8F90" ], + [ "neighbor_interp_mod.F90", "neighbor__interp__mod_8F90.html", "neighbor__interp__mod_8F90" ], + [ "polfix_mod.F90", "polfix__mod_8F90.html", "polfix__mod_8F90" ], + [ "sp_mod.F", "sp__mod_8F_source.html", null ], + [ "spanaly.f", "spanaly_8f.html", "spanaly_8f" ], + [ "spdz2uv.f", "spdz2uv_8f.html", "spdz2uv_8f" ], + [ "spectral_interp_mod.F90", "spectral__interp__mod_8F90.html", "spectral__interp__mod_8F90" ], + [ "speps.f", "speps_8f.html", "speps_8f" ], + [ "spfft.f", "spfft_8f.html", "spfft_8f" ], + [ "spfft1.f", "spfft1_8f.html", "spfft1_8f" ], + [ "spffte.f", "spffte_8f.html", "spffte_8f" ], + [ "spfftpt.f", "spfftpt_8f.html", "spfftpt_8f" ], + [ "spgradq.f", "spgradq_8f.html", "spgradq_8f" ], + [ "spgradx.f", "spgradx_8f.html", "spgradx_8f" ], + [ "spgrady.f", "spgrady_8f.html", "spgrady_8f" ], + [ "splaplac.f", "splaplac_8f.html", "splaplac_8f" ], + [ "splat.F", "splat_8F.html", "splat_8F" ], + [ "splegend.f", "splegend_8f.html", "splegend_8f" ], + [ "sppad.f", "sppad_8f.html", "sppad_8f" ], + [ "spsynth.f", "spsynth_8f.html", "spsynth_8f" ], + [ "sptez.f", "sptez_8f.html", "sptez_8f" ], + [ "sptezd.f", "sptezd_8f.html", "sptezd_8f" ], + [ "sptezm.f", "sptezm_8f.html", "sptezm_8f" ], + [ "sptezmd.f", "sptezmd_8f.html", "sptezmd_8f" ], + [ "sptezmv.f", "sptezmv_8f.html", "sptezmv_8f" ], + [ "sptezv.f", "sptezv_8f.html", "sptezv_8f" ], + [ "sptgpm.f", "sptgpm_8f.html", "sptgpm_8f" ], + [ "sptgpmd.f", "sptgpmd_8f.html", "sptgpmd_8f" ], + [ "sptgpmv.f", "sptgpmv_8f.html", "sptgpmv_8f" ], + [ "sptgps.f", "sptgps_8f.html", "sptgps_8f" ], + [ "sptgpsd.f", "sptgpsd_8f.html", "sptgpsd_8f" ], + [ "sptgpsv.f", "sptgpsv_8f.html", "sptgpsv_8f" ], + [ "sptgpt.f", "sptgpt_8f.html", "sptgpt_8f" ], + [ "sptgptd.f", "sptgptd_8f.html", "sptgptd_8f" ], + [ "sptgptsd.f", "sptgptsd_8f.html", "sptgptsd_8f" ], + [ "sptgptv.f", "sptgptv_8f.html", "sptgptv_8f" ], + [ "sptgptvd.f", "sptgptvd_8f.html", "sptgptvd_8f" ], + [ "sptran.f", "sptran_8f.html", "sptran_8f" ], + [ "sptrand.f", "sptrand_8f.html", "sptrand_8f" ], + [ "sptranf.f", "sptranf_8f.html", "sptranf_8f" ], + [ "sptranf0.f", "sptranf0_8f.html", "sptranf0_8f" ], + [ "sptranf1.f", "sptranf1_8f.html", "sptranf1_8f" ], + [ "sptranfv.f", "sptranfv_8f.html", "sptranfv_8f" ], + [ "sptranv.f", "sptranv_8f.html", "sptranv_8f" ], + [ "sptrun.f", "sptrun_8f.html", "sptrun_8f" ], + [ "sptrund.f", "sptrund_8f.html", "sptrund_8f" ], + [ "sptrung.f", "sptrung_8f.html", "sptrung_8f" ], + [ "sptrungv.f", "sptrungv_8f.html", "sptrungv_8f" ], + [ "sptrunl.f", "sptrunl_8f.html", "sptrunl_8f" ], + [ "sptrunm.f", "sptrunm_8f.html", "sptrunm_8f" ], + [ "sptrunmv.f", "sptrunmv_8f.html", "sptrunmv_8f" ], + [ "sptruns.f", "sptruns_8f.html", "sptruns_8f" ], + [ "sptrunsv.f", "sptrunsv_8f.html", "sptrunsv_8f" ], + [ "sptrunv.f", "sptrunv_8f.html", "sptrunv_8f" ], + [ "spuv2dz.f", "spuv2dz_8f.html", "spuv2dz_8f" ], + [ "spvar.f", "spvar_8f.html", "spvar_8f" ], + [ "spwget.f", "spwget_8f.html", "spwget_8f" ] +]; \ No newline at end of file diff --git a/doc.svg b/doc.svg new file mode 100644 index 00000000..0b928a53 --- /dev/null +++ b/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/docd.svg b/docd.svg new file mode 100644 index 00000000..ac18b275 --- /dev/null +++ b/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/docs(7).zip b/docs(7).zip new file mode 100644 index 0000000000000000000000000000000000000000..5b3c011389c5865c3f0f1ced74253f1aed344c43 GIT binary patch literal 1488721 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

Tq6hyc9QEF~_CGBY@ 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%0DlZLhPL%n;<8b_kXq4{R4vk-%kI3 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

vDupeeY&I<1Nxu+F#FL5cN^Y*LPa7HV|B`p2k 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᙭Je{Y#*ayZ@}WA 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

fYZOtqd$o4TFJp>@-Xcu`o|t)tCoh`yz7OUCAO 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�aO$pFnxIEg~};Gp?*Lu+6J;j*AQ=dMFBS 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Ƶ!MJcYy+u*6m<+=R^wA`A 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ʤVqN95jGn$pw@hs)j510Lu6R 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

iOu*aL%~d?3Q4$>L`s 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

!Nwiy#77h?HFA0F*<`SnGFl3pGYbgZS+Y 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

#Ag74R2j5crA^Pa_$ibDaByhzeS-G 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

ITkjl#g&ej#{21s=#pk6F=bYZ~( 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�=_n^$X}f4!n!GeALvB^Dg~=hJF9b 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 z07%0A+APjU|KexBD+ru7RzJRt#uuk9m`}>Ar{&t0j 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%0An;n8C&R_R9$Bd+ioOx{2M8e!oa40SFX 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�<0#`Yn-WY(a`Z(@ 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�R_YS(2Po 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�neP6H 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 F?|*)SeeeJP literal 0 HcmV?d00001 diff --git a/doxygen.css b/doxygen.css index ffbff022..009a9b55 100644 --- a/doxygen.css +++ b/doxygen.css @@ -1,29 +1,378 @@ -/* The standard CSS for doxygen 1.9.1 */ - -body, table, div, p, dl { - font: 400 14px/22px Roboto,sans-serif; +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); } -p.reference, p.definition { - font: 400 14px/22px Roboto,sans-serif; +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; } /* @group Heading Levels */ -h1.groupheader { - font-size: 150%; -} - .title { - font: 400 14px/28px Roboto,sans-serif; + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; font-size: 150%; font-weight: bold; margin: 10px 2px; } +h1.groupheader { + font-size: 150%; +} + h2.groupheader { - border-bottom: 1px solid #879ECB; - color: #354C7B; + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); font-size: 150%; font-weight: normal; margin-top: 1.75em; @@ -46,22 +395,13 @@ h1, h2, h3, h4, h5, h6 { } h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { - text-shadow: 0 0 15px cyan; + text-shadow: 0 0 15px var(--glow-color); } dt { font-weight: bold; } -ul.multicol { - -moz-column-gap: 1em; - -webkit-column-gap: 1em; - column-gap: 1em; - -moz-column-count: 3; - -webkit-column-count: 3; - column-count: 3; -} - p.startli, p.startdd { margin-top: 2px; } @@ -113,7 +453,6 @@ h3.version { } div.navtab { - border-right: 1px solid #A3B4D7; padding-right: 15px; text-align: right; line-height: 110%; @@ -127,16 +466,17 @@ td.navtab { padding-right: 6px; padding-left: 6px; } + td.navtabHL { - background-image: url('tab_a.png'); + background-image: var(--nav-gradient-active-image); background-repeat:repeat-x; padding-right: 6px; padding-left: 6px; } td.navtabHL a, td.navtabHL a:visited { - color: #fff; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); } a.navtab { @@ -148,7 +488,13 @@ div.qindex{ width: 100%; line-height: 140%; font-size: 130%; - color: #A0A0A0; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; } dt.alphachar{ @@ -157,7 +503,7 @@ dt.alphachar{ } .alphachar a{ - color: black; + color: var(--index-header-color); } .alphachar a:hover, .alphachar a:visited{ @@ -176,8 +522,12 @@ dt.alphachar{ line-height: 1.15em; } +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + .classindex dl.odd { - background-color: #F8F9FC; + background-color: var(--index-odd-item-bg-color); } @media(min-width: 1120px) { @@ -196,23 +546,19 @@ dt.alphachar{ /* @group Link Styling */ a { - color: #3D578C; + color: var(--page-link-color); font-weight: normal; text-decoration: none; } .contents a:visited { - color: #4665A2; + color: var(--page-visited-link-color); } a:hover { text-decoration: underline; } -.contents a.qindexHL:visited { - color: #FFFFFF; -} - a.el { font-weight: bold; } @@ -221,12 +567,39 @@ a.elRef { } a.code, a.code:visited, a.line, a.line:visited { - color: #4665A2; + color: var(--code-link-color); } a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { - color: #4665A2; -} + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } /* @end */ @@ -235,7 +608,17 @@ dl.el { } ul { - overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; } #side-nav ul { @@ -254,30 +637,32 @@ ul { } pre.fragment { - border: 1px solid #C4CFE5; - background-color: #FBFCFD; + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); padding: 4px 6px; margin: 4px 8px 4px 2px; overflow: auto; word-wrap: break-word; font-size: 9pt; line-height: 125%; - font-family: monospace, fixed; + font-family: var(--font-family-monospace); font-size: 105%; } div.fragment { - padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ - margin: 4px 8px 4px 2px; - background-color: #FBFCFD; - border: 1px solid #C4CFE5; + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); } div.line { - font-family: monospace, fixed; + font-family: var(--font-family-monospace); font-size: 13px; min-height: 13px; - line-height: 1.0; + line-height: 1.2; text-wrap: unrestricted; white-space: -moz-pre-wrap; /* Moz */ white-space: -pre-wrap; /* Opera 4-6 */ @@ -306,24 +691,40 @@ div.line:after { } div.line.glow { - background-color: cyan; - box-shadow: 0 0 10px cyan; + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); } +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} span.lineno { padding-right: 4px; + margin-right: 9px; text-align: right; - border-right: 2px solid #0F0; - background-color: #E8E8E8; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); white-space: pre; } -span.lineno a { - background-color: #D8D8D8; +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); } span.lineno a:hover { - background-color: #C8C8C8; + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); } .lineno { @@ -335,24 +736,6 @@ span.lineno a:hover { user-select: none; } -div.ah, span.ah { - background-color: black; - font-weight: bold; - color: #FFFFFF; - margin-bottom: 3px; - margin-top: 3px; - padding: 0.2em; - border: solid thin #333; - border-radius: 0.5em; - -webkit-border-radius: .5em; - -moz-border-radius: .5em; - box-shadow: 2px 2px 3px #999; - -webkit-box-shadow: 2px 2px 3px #999; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; - background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); - background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); -} - div.classindex ul { list-style: none; padding-left: 0; @@ -374,8 +757,7 @@ div.groupText { } body { - background-color: white; - color: black; + color: var(--page-foreground-color); margin: 0; } @@ -385,29 +767,15 @@ div.contents { margin-right: 8px; } -td.indexkey { - background-color: #EBEFF6; - font-weight: bold; - border: 1px solid #C4CFE5; - margin: 2px 0px 2px 0; - padding: 2px 10px; - white-space: nowrap; - vertical-align: top; -} - -td.indexvalue { - background-color: #EBEFF6; - border: 1px solid #C4CFE5; - padding: 2px 10px; - margin: 2px 0px; +p.formulaDsp { + text-align: center; } -tr.memlist { - background-color: #EEF1F7; +img.dark-mode-visible { + display: none; } - -p.formulaDsp { - text-align: center; +img.light-mode-visible { + display: none; } img.formulaDsp { @@ -437,89 +805,74 @@ address.footer { img.footer { border: 0px; vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; } /* @group Code Colorization */ span.keyword { - color: #008000 + color: var(--code-keyword-color); } span.keywordtype { - color: #604020 + color: var(--code-type-keyword-color); } span.keywordflow { - color: #e08000 + color: var(--code-flow-keyword-color); } span.comment { - color: #800000 + color: var(--code-comment-color); } span.preprocessor { - color: #806020 + color: var(--code-preprocessor-color); } span.stringliteral { - color: #002080 + color: var(--code-string-literal-color); } span.charliteral { - color: #008080 + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); } span.vhdldigit { - color: #ff00ff + color: var(--code-vhdl-digit-color); } span.vhdlchar { - color: #000000 + color: var(--code-vhdl-char-color); } span.vhdlkeyword { - color: #700070 + color: var(--code-vhdl-keyword-color); } span.vhdllogic { - color: #ff0000 + color: var(--code-vhdl-logic-color); } blockquote { - background-color: #F7F8FB; - border-left: 2px solid #9CAFD4; + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); margin: 0 24px 0 4px; padding: 0 12px 0 16px; } -blockquote.DocNodeRTL { - border-left: 0; - border-right: 2px solid #9CAFD4; - margin: 0 4px 0 24px; - padding: 0 16px 0 12px; -} - /* @end */ -/* -.search { - color: #003399; - font-weight: bold; -} - -form.search { - margin-bottom: 0px; - margin-top: 0px; -} - -input.search { - font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #e8eef2; -} -*/ - td.tiny { font-size: 75%; } @@ -527,18 +880,19 @@ td.tiny { .dirtab { padding: 4px; border-collapse: collapse; - border: 1px solid #A3B4D7; + border: 1px solid var(--table-cell-border-color); } th.dirtab { - background: #EBEFF6; + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); font-weight: bold; } hr { height: 0px; border: none; - border-top: 1px solid #4A6AAA; + border-top: 1px solid var(--separator-color); } hr.footer { @@ -566,14 +920,14 @@ table.memberdecls { } .memberdecls td.glow, .fieldtable tr.glow { - background-color: cyan; - box-shadow: 0 0 15px cyan; + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); } .mdescLeft, .mdescRight, .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight, .memTemplParams { - background-color: #F9FAFC; + background-color: var(--memdecl-background-color); border: none; margin: 4px; padding: 1px 0 0 8px; @@ -581,11 +935,11 @@ table.memberdecls { .mdescLeft, .mdescRight { padding: 0px 8px 4px 8px; - color: #555; + color: var(--memdecl-foreground-color); } .memSeparator { - border-bottom: 1px solid #DEE4F0; + border-bottom: 1px solid var(--memdecl-separator-color); line-height: 1px; margin: 0px; padding: 0px; @@ -600,7 +954,7 @@ table.memberdecls { } .memTemplParams { - color: #4665A2; + color: var(--memdecl-template-color); white-space: nowrap; font-size: 80%; } @@ -613,15 +967,15 @@ table.memberdecls { .memtitle { padding: 8px; - border-top: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); border-top-right-radius: 4px; border-top-left-radius: 4px; margin-bottom: -1px; - background-image: url('nav_f.png'); + background-image: var(--memdef-title-gradient-image); background-repeat: repeat-x; - background-color: #E2E8F2; + background-color: var(--memdef-title-background-color); line-height: 1.25; font-weight: 300; float:left; @@ -636,20 +990,11 @@ table.memberdecls { .memtemplate { font-size: 80%; - color: #4665A2; + color: var(--memdef-template-color); font-weight: normal; margin-left: 9px; } -.memnav { - background-color: #EBEFF6; - border: 1px solid #A3B4D7; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; -} - .mempage { width: 100%; } @@ -668,7 +1013,7 @@ table.memberdecls { } .memitem.glow { - box-shadow: 0 0 15px cyan; + box-shadow: 0 0 15px var(--glow-color); } .memname { @@ -681,41 +1026,32 @@ table.memberdecls { } .memproto, dl.reflist dt { - border-top: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); padding: 6px 0px 6px 0px; - color: #253555; + color: var(--memdef-proto-text-color); font-weight: bold; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - background-color: #DFE5F1; - /* opera specific markup */ + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); border-top-right-radius: 4px; - /* firefox specific markup */ - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - -moz-border-radius-topright: 4px; - /* webkit specific markup */ - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - -webkit-border-top-right-radius: 4px; - } .overload { - font-family: "courier new",courier,monospace; + font-family: var(--font-family-monospace); font-size: 65%; } .memdoc, dl.reflist dd { - border-bottom: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); padding: 6px 10px 2px 10px; - background-color: #FBFCFD; border-top-width: 0; background-image:url('nav_g.png'); background-repeat:repeat-x; - background-color: #FFFFFF; + background-color: var(--memdef-doc-background-color); /* opera specific markup */ border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; @@ -748,7 +1084,7 @@ dl.reflist dd { } .paramname { - color: #602020; + color: var(--memdef-param-name-color); white-space: nowrap; } .paramname em { @@ -761,20 +1097,20 @@ dl.reflist dd { .params, .retval, .exception, .tparams { margin-left: 0px; padding-left: 0px; -} +} .params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { font-weight: bold; vertical-align: top; } - + .params .paramtype, .tparams .paramtype { font-style: italic; vertical-align: top; -} - +} + .params .paramdir, .tparams .paramdir { - font-family: "courier new",courier,monospace; + font-family: var(--font-family-monospace); vertical-align: top; } @@ -798,13 +1134,13 @@ span.mlabels { } span.mlabel { - background-color: #728DC1; - border-top:1px solid #5373B4; - border-left:1px solid #5373B4; - border-right:1px solid #C4CFE5; - border-bottom:1px solid #C4CFE5; + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); text-shadow: none; - color: white; + color: var(--label-foreground-color); margin-right: 4px; padding: 2px 3px; border-radius: 3px; @@ -821,8 +1157,8 @@ span.mlabel { div.directory { margin: 10px 0px; - border-top: 1px solid #9CAFD4; - border-bottom: 1px solid #9CAFD4; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); width: 100%; } @@ -858,9 +1194,14 @@ div.directory { border-left: 1px solid rgba(0,0,0,0.05); } +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + .directory tr.even { padding-left: 6px; - background-color: #F7F8FB; + background-color: var(--index-even-item-bg-color); } .directory img { @@ -878,11 +1219,11 @@ div.directory { cursor: pointer; padding-left: 2px; padding-right: 2px; - color: #3D578C; + color: var(--page-link-color); } .arrow { - color: #9CAFD4; + color: var(--nav-arrow-color); -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; @@ -896,14 +1237,15 @@ div.directory { } .icon { - font-family: Arial, Helvetica; + font-family: var(--font-family-icon); + line-height: normal; font-weight: bold; font-size: 12px; height: 14px; width: 16px; display: inline-block; - background-color: #728DC1; - color: white; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); text-align: center; border-radius: 4px; margin-left: 2px; @@ -920,8 +1262,7 @@ div.directory { width: 24px; height: 18px; margin-bottom: 4px; - background-image:url('folderopen.png'); - background-position: 0px -4px; + background-image:var(--icon-folder-open-image); background-repeat: repeat-y; vertical-align:top; display: inline-block; @@ -931,8 +1272,7 @@ div.directory { width: 24px; height: 18px; margin-bottom: 4px; - background-image:url('folderclosed.png'); - background-position: 0px -4px; + background-image:var(--icon-folder-closed-image); background-repeat: repeat-y; vertical-align:top; display: inline-block; @@ -942,17 +1282,13 @@ div.directory { width: 24px; height: 18px; margin-bottom: 4px; - background-image:url('doc.png'); + background-image:var(--icon-doc-image); background-position: 0px -4px; background-repeat: repeat-y; vertical-align:top; display: inline-block; } -table.directory { - font: 400 14px Roboto,sans-serif; -} - /* @end */ div.dynheader { @@ -967,7 +1303,7 @@ div.dynheader { address { font-style: normal; - color: #2A3D61; + color: var(--footer-foreground-color); } table.doxtable caption { @@ -981,28 +1317,23 @@ table.doxtable { } table.doxtable td, table.doxtable th { - border: 1px solid #2D4068; + border: 1px solid var(--table-cell-border-color); padding: 3px 7px 2px; } table.doxtable th { - background-color: #374F7F; - color: #FFFFFF; + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); font-size: 110%; padding-bottom: 4px; padding-top: 5px; } table.fieldtable { - /*width: 100%;*/ margin-bottom: 10px; - border: 1px solid #A8B8D9; + border: 1px solid var(--memdef-border-color); border-spacing: 0px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; border-radius: 4px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; - -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); } @@ -1012,8 +1343,8 @@ table.fieldtable { .fieldtable td.fieldtype, .fieldtable td.fieldname { white-space: nowrap; - border-right: 1px solid #A8B8D9; - border-bottom: 1px solid #A8B8D9; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); vertical-align: top; } @@ -1022,14 +1353,13 @@ table.fieldtable { } .fieldtable td.fielddoc { - border-bottom: 1px solid #A8B8D9; - /*width: 100%;*/ + border-bottom: 1px solid var(--memdef-border-color); } .fieldtable td.fielddoc p:first-child { margin-top: 0px; -} - +} + .fieldtable td.fielddoc p:last-child { margin-bottom: 2px; } @@ -1039,22 +1369,18 @@ table.fieldtable { } .fieldtable th { - background-image:url('nav_f.png'); + background-image: var(--memdef-title-gradient-image); background-repeat:repeat-x; - background-color: #E2E8F2; + background-color: var(--memdef-title-background-color); font-size: 90%; - color: #253555; + color: var(--memdef-proto-text-color); padding-bottom: 4px; padding-top: 5px; text-align:left; font-weight: 400; - -moz-border-radius-topleft: 4px; - -moz-border-radius-topright: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; border-top-left-radius: 4px; border-top-right-radius: 4px; - border-bottom: 1px solid #A8B8D9; + border-bottom: 1px solid var(--memdef-border-color); } @@ -1062,7 +1388,7 @@ table.fieldtable { top: 0px; left: 10px; height: 36px; - background-image: url('tab_b.png'); + background-image: var(--nav-gradient-image); z-index: 101; overflow: hidden; font-size: 13px; @@ -1071,13 +1397,13 @@ table.fieldtable { .navpath ul { font-size: 11px; - background-image:url('tab_b.png'); + background-image: var(--nav-gradient-image); background-repeat:repeat-x; background-position: 0 -5px; height:30px; line-height:30px; - color:#8AA0CC; - border:solid 1px #C2CDE4; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); overflow:hidden; margin:0px; padding:0px; @@ -1089,10 +1415,10 @@ table.fieldtable { float:left; padding-left:10px; padding-right:15px; - background-image:url('bc_s.png'); + background-image:var(--nav-breadcrumb-image); background-repeat:no-repeat; background-position:right; - color:#364D7C; + color: var(--nav-foreground-color); } .navpath li.navelem a @@ -1101,15 +1427,16 @@ table.fieldtable { display:block; text-decoration: none; outline: none; - color: #283A5D; - font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - text-decoration: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; } .navpath li.navelem a:hover { - color:#6884BD; + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); } .navpath li.footer @@ -1121,7 +1448,7 @@ table.fieldtable { background-image:none; background-repeat:no-repeat; background-position:right; - color:#364D7C; + color: var(--footer-foreground-color); font-size: 8pt; } @@ -1133,7 +1460,7 @@ div.summary padding-right: 5px; width: 50%; text-align: right; -} +} div.summary a { @@ -1148,7 +1475,7 @@ table.classindex margin-right: 3%; width: 94%; border: 0; - border-spacing: 0; + border-spacing: 0; padding: 0; } @@ -1166,11 +1493,11 @@ div.ingroups a div.header { - background-image:url('nav_h.png'); + background-image: var(--header-gradient-image); background-repeat:repeat-x; - background-color: #F9FAFC; + background-color: var(--header-background-color); margin: 0px; - border-bottom: 1px solid #C4CFE5; + border-bottom: 1px solid var(--header-separator-color); } div.headertitle @@ -1193,11 +1520,6 @@ dl.section { padding-left: 0px; } -dl.section.DocNodeRTL { - margin-right: 0px; - padding-right: 0px; -} - dl.note { margin-left: -7px; padding-left: 3px; @@ -1205,16 +1527,6 @@ dl.note { border-color: #D0C000; } -dl.note.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #D0C000; -} - dl.warning, dl.attention { margin-left: -7px; padding-left: 3px; @@ -1222,16 +1534,6 @@ dl.warning, dl.attention { border-color: #FF0000; } -dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #FF0000; -} - dl.pre, dl.post, dl.invariant { margin-left: -7px; padding-left: 3px; @@ -1239,16 +1541,6 @@ dl.pre, dl.post, dl.invariant { border-color: #00D000; } -dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #00D000; -} - dl.deprecated { margin-left: -7px; padding-left: 3px; @@ -1256,16 +1548,6 @@ dl.deprecated { border-color: #505050; } -dl.deprecated.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #505050; -} - dl.todo { margin-left: -7px; padding-left: 3px; @@ -1273,16 +1555,6 @@ dl.todo { border-color: #00C0E0; } -dl.todo.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #00C0E0; -} - dl.test { margin-left: -7px; padding-left: 3px; @@ -1290,16 +1562,6 @@ dl.test { border-color: #3030E0; } -dl.test.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #3030E0; -} - dl.bug { margin-left: -7px; padding-left: 3px; @@ -1307,21 +1569,16 @@ dl.bug { border-color: #C08050; } -dl.bug.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #C08050; -} - dl.section dd { margin-bottom: 6px; } +#projectrow +{ + height: 56px; +} + #projectlogo { text-align: center; @@ -1337,25 +1594,29 @@ dl.section dd { #projectalign { vertical-align: middle; + padding-left: 0.5em; } #projectname { - font: 300% Tahoma, Arial,sans-serif; + font-size: 200%; + font-family: var(--font-family-title); margin: 0px; padding: 2px 0px; } - + #projectbrief { - font: 120% Tahoma, Arial,sans-serif; + font-size: 90%; + font-family: var(--font-family-title); margin: 0px; padding: 0px; } #projectnumber { - font: 50% Tahoma, Arial,sans-serif; + font-size: 50%; + font-family: 50% var(--font-family-title); margin: 0px; padding: 0px; } @@ -1365,7 +1626,8 @@ dl.section dd { padding: 0px; margin: 0px; width: 100%; - border-bottom: 1px solid #5373B4; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); } .image @@ -1398,17 +1660,12 @@ dl.section dd { font-weight: bold; } -div.zoom -{ - border: 1px solid #90A5CE; -} - dl.citelist { margin-bottom:50px; } dl.citelist dt { - color:#334975; + color:var(--citation-label-color); float:left; font-weight:bold; margin-right:10px; @@ -1424,8 +1681,8 @@ dl.citelist dd { div.toc { padding: 14px 25px; - background-color: #F4F6FA; - border: 1px solid #D8DFEE; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); border-radius: 7px 7px 7px 7px; float: right; height: auto; @@ -1433,28 +1690,17 @@ div.toc { width: 200px; } -.PageDocRTL-title div.toc { - float: left !important; - text-align: right; -} - div.toc li { - background: url("bdwn.png") no-repeat scroll 0 5px transparent; - font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); margin-top: 5px; padding-left: 10px; padding-top: 2px; } -.PageDocRTL-title div.toc li { - background-position-x: right !important; - padding-left: 0 !important; - padding-right: 10px; -} - div.toc h3 { - font: bold 12px/1.2 Arial,FreeSans,sans-serif; - color: #4665A2; + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); border-bottom: 0 none; margin: 0; } @@ -1463,7 +1709,7 @@ div.toc ul { list-style: none outside none; border: medium none; padding: 0px; -} +} div.toc li.level1 { margin-left: 0px; @@ -1474,11 +1720,11 @@ div.toc li.level2 { } div.toc li.level3 { - margin-left: 30px; + margin-left: 15px; } div.toc li.level4 { - margin-left: 45px; + margin-left: 15px; } span.emoji { @@ -1487,29 +1733,13 @@ span.emoji { */ } -.PageDocRTL-title div.toc li.level1 { - margin-left: 0 !important; - margin-right: 0; -} - -.PageDocRTL-title div.toc li.level2 { - margin-left: 0 !important; - margin-right: 15px; -} - -.PageDocRTL-title div.toc li.level3 { - margin-left: 0 !important; - margin-right: 30px; -} - -.PageDocRTL-title div.toc li.level4 { - margin-left: 0 !important; - margin-right: 45px; +span.obfuscator { + display: none; } .inherit_header { font-weight: bold; - color: gray; + color: var(--inherit-header-color); cursor: pointer; -webkit-touch-callout: none; -webkit-user-select: none; @@ -1541,11 +1771,12 @@ tr.heading h2 { #powerTip { cursor: default; - white-space: nowrap; - background-color: white; - border: 1px solid gray; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); border-radius: 4px 4px 4px 4px; - box-shadow: 1px 1px 7px gray; + box-shadow: var(--tooltip-shadow); display: none; font-size: smaller; max-width: 80%; @@ -1556,7 +1787,7 @@ tr.heading h2 { } #powerTip div.ttdoc { - color: grey; + color: var(--tooltip-doc-color); font-style: italic; } @@ -1564,18 +1795,24 @@ tr.heading h2 { font-weight: bold; } +#powerTip a { + color: var(--tooltip-link-color); +} + #powerTip div.ttname { font-weight: bold; } #powerTip div.ttdeci { - color: #006318; + color: var(--tooltip-declaration-color); } #powerTip div { margin: 0px; padding: 0px; - font: 12px/16px Roboto,sans-serif; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; } #powerTip:before, #powerTip:after { @@ -1620,12 +1857,12 @@ tr.heading h2 { } #powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { - border-top-color: #FFFFFF; + border-top-color: var(--tooltip-background-color); border-width: 10px; margin: 0px -10px; } -#powerTip.n:before { - border-top-color: #808080; +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); border-width: 11px; margin: 0px -11px; } @@ -1648,13 +1885,13 @@ tr.heading h2 { } #powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { - border-bottom-color: #FFFFFF; + border-bottom-color: var(--tooltip-background-color); border-width: 10px; margin: 0px -10px; } #powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { - border-bottom-color: #808080; + border-bottom-color: var(--tooltip-border-color); border-width: 11px; margin: 0px -11px; } @@ -1675,13 +1912,13 @@ tr.heading h2 { left: 100%; } #powerTip.e:after { - border-left-color: #FFFFFF; + border-left-color: var(--tooltip-border-color); border-width: 10px; top: 50%; margin-top: -10px; } #powerTip.e:before { - border-left-color: #808080; + border-left-color: var(--tooltip-border-color); border-width: 11px; top: 50%; margin-top: -11px; @@ -1691,13 +1928,13 @@ tr.heading h2 { right: 100%; } #powerTip.w:after { - border-right-color: #FFFFFF; + border-right-color: var(--tooltip-border-color); border-width: 10px; top: 50%; margin-top: -10px; } #powerTip.w:before { - border-right-color: #808080; + border-right-color: var(--tooltip-border-color); border-width: 11px; top: 50%; margin-top: -11px; @@ -1731,7 +1968,7 @@ table.markdownTable { } table.markdownTable td, table.markdownTable th { - border: 1px solid #2D4068; + border: 1px solid var(--table-cell-border-color); padding: 3px 7px 2px; } @@ -1739,8 +1976,8 @@ table.markdownTable tr { } th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { - background-color: #374F7F; - color: #FFFFFF; + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); font-size: 110%; padding-bottom: 4px; padding-top: 5px; @@ -1758,36 +1995,51 @@ th.markdownTableHeadCenter, td.markdownTableBodyCenter { text-align: center } -.DocNodeRTL { - text-align: right; - direction: rtl; +tt, code, kbd, samp +{ + display: inline-block; } +/* @end */ -.DocNodeLTR { - text-align: left; - direction: ltr; +u { + text-decoration: underline; } -table.DocNodeRTL { - width: auto; - margin-right: 0; - margin-left: auto; +details>summary { + list-style-type: none; } -table.DocNodeLTR { - width: auto; - margin-right: auto; - margin-left: 0; +details > summary::-webkit-details-marker { + display: none; } -tt, code, kbd, samp -{ - display: inline-block; - direction:ltr; +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; } -/* @end */ -u { - text-decoration: underline; +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); } diff --git a/doxygen.svg b/doxygen.svg index d42dad52..79a76354 100644 --- a/doxygen.svg +++ b/doxygen.svg @@ -1,4 +1,6 @@ + @@ -17,7 +19,7 @@ - + diff --git a/dynsections.js b/dynsections.js index 88f2c27e..9b281563 100644 --- a/dynsections.js +++ b/dynsections.js @@ -47,6 +47,8 @@ function updateStripes() { $('table.directory tr'). removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); } function toggleLevel(level) @@ -118,11 +120,80 @@ function toggleInherit(id) $(img).attr('src',src.substring(0,src.length-10)+'open.png'); } } -/* @license-end */ +var opened=true; +// in case HTML_COLORSTYLE is LIGHT or DARK the vars will be replaced, so we write them out explicitly and use double quotes +var plusImg = [ "var(--fold-plus-image)", "var(--fold-plus-image-relpath)" ]; +var minusImg = [ "var(--fold-minus-image)", "var(--fold-minus-image-relpath)" ]; + +// toggle all folding blocks +function codefold_toggle_all(relPath) { + if (opened) { + $('#fold_all').css('background-image',plusImg[relPath]); + $('div[id^=foldopen]').hide(); + $('div[id^=foldclosed]').show(); + } else { + $('#fold_all').css('background-image',minusImg[relPath]); + $('div[id^=foldopen]').show(); + $('div[id^=foldclosed]').hide(); + } + opened=!opened; +} + +// toggle single folding block +function codefold_toggle(id) { + $('#foldopen'+id).toggle(); + $('#foldclosed'+id).toggle(); +} +function init_codefold(relPath) { + $('span[class=lineno]').css( + {'padding-right':'4px', + 'margin-right':'2px', + 'display':'inline-block', + 'width':'54px', + 'background':'linear-gradient(var(--fold-line-color),var(--fold-line-color)) no-repeat 46px/2px 100%' + }); + // add global toggle to first line + $('span[class=lineno]:first').append(''); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after('

'); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ $(document).ready(function() { $('.code,.codeRef').each(function() { $(this).data('powertip',$('#a'+$(this).attr('href').replace(/.*\//,'').replace(/[^a-z_A-Z0-9]/g,'_')).html()); + $.fn.powerTip.smartPlacementLists.s = [ 's', 'n', 'ne', 'se' ]; $(this).powerTip({ placement: 's', smartPlacement: true, mouseOnToPopup: true }); }); }); diff --git a/earth__radius__mod_8F90.html b/earth__radius__mod_8F90.html index 455d429f..7761c908 100644 --- a/earth__radius__mod_8F90.html +++ b/earth__radius__mod_8F90.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: earth_radius_mod.F90 File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +

@@ -62,7 +62,7 @@
@@ -76,17 +76,23 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
earth_radius_mod.F90 File Reference
+
earth_radius_mod.F90 File Reference
@@ -95,17 +101,17 @@

Go to the source code of this file.

- - +

+

Modules

module  earth_radius_mod
module  earth_radius_mod
 Determine earth radius and shape.
 
- - - - + + +

+

Functions/Subroutines

subroutine, public earth_radius_mod::earth_radius (IGDTMPL, IGDTLEN, RADIUS, ECCEN_SQUARED)
 Determine earth radius and shape. More...
 
subroutine, public earth_radius_mod::earth_radius (igdtmpl, igdtlen, radius, eccen_squared)
 Determine earth radius and shape.
 

Detailed Description

Determine earth radius and shape.

@@ -119,7 +125,7 @@ diff --git a/earth__radius__mod_8F90.js b/earth__radius__mod_8F90.js index bc2c8f77..fc1f7242 100644 --- a/earth__radius__mod_8F90.js +++ b/earth__radius__mod_8F90.js @@ -1,4 +1,4 @@ var earth__radius__mod_8F90 = [ - [ "earth_radius", "earth__radius__mod_8F90.html#a810f60db1a1faff0d6f59937a8207a54", null ] + [ "earth_radius", "earth__radius__mod_8F90.html#aa15e37724d67d8072f3960d910909129", null ] ]; \ No newline at end of file diff --git a/earth__radius__mod_8F90_source.html b/earth__radius__mod_8F90_source.html index 209f1e37..b3064fba 100644 --- a/earth__radius__mod_8F90_source.html +++ b/earth__radius__mod_8F90_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: earth_radius_mod.F90 Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,92 +81,100 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
earth_radius_mod.F90
+
earth_radius_mod.F90
-Go to the documentation of this file.
1 
-
4 
- -
8  implicit none
-
9 
-
10  private
-
11  public :: earth_radius
-
12 
-
13 contains
-
14 
-
40  SUBROUTINE earth_radius(IGDTMPL, IGDTLEN, RADIUS, ECCEN_SQUARED)
-
41  IMPLICIT NONE
-
42 
-
43  INTEGER, INTENT(IN ) :: igdtlen
-
44  INTEGER, INTENT(IN ) :: igdtmpl(igdtlen)
-
45 
-
46  REAL, INTENT( OUT) :: eccen_squared
-
47  REAL, INTENT( OUT) :: radius
-
48 
-
49  REAL :: flat
-
50  REAL :: major_axis, minor_axis
-
51 
-
52  SELECT CASE (igdtmpl(1))
-
53  CASE (0)
-
54  radius = 6367470.0
-
55  eccen_squared = 0.0
-
56  CASE (1) ! USER SPECIFIED SPHERICAL
-
57  radius = float(igdtmpl(3))/float(10**igdtmpl(2))
-
58  eccen_squared = 0.0
-
59  CASE (2) ! IAU 1965
-
60  radius = 6378160.0 ! SEMI MAJOR AXIS
-
61  flat = 1.0/297.0 ! FLATTENING
-
62  eccen_squared = (2.0*flat) - (flat**2)
-
63  CASE (3) ! USER SPECIFIED ELLIPTICAL (KM)
-
64  major_axis = float(igdtmpl(5))/float(10**igdtmpl(4))
-
65  major_axis = major_axis * 1000.0
-
66  minor_axis = float(igdtmpl(7))/float(10**igdtmpl(6))
-
67  minor_axis = minor_axis * 1000.0
-
68  eccen_squared = 1.0 - (minor_axis**2 / major_axis**2)
-
69  radius = major_axis
-
70  CASE (4) ! IAG-GRS80 MODEL
-
71  radius = 6378137.0 ! SEMI MAJOR AXIS
-
72  flat = 1.0/298.2572 ! FLATTENING
-
73  eccen_squared = (2.0*flat) - (flat**2)
-
74  CASE (5) ! WGS84 DATUM
-
75  radius = 6378137.0 ! SEMI MAJOR AXIS
-
76  eccen_squared = 0.00669437999013
-
77  CASE (6)
-
78  radius = 6371229.0
-
79  eccen_squared = 0.0
-
80  CASE (7) ! USER SPECIFIED ELLIPTICAL (M)
-
81  major_axis = float(igdtmpl(5))/float(10**igdtmpl(4))
-
82  minor_axis = float(igdtmpl(7))/float(10**igdtmpl(6))
-
83  eccen_squared = 1.0 - (minor_axis**2 / major_axis**2)
-
84  radius = major_axis
-
85  CASE (8)
-
86  radius = 6371200.0
-
87  eccen_squared = 0.0
-
88  CASE DEFAULT
-
89  radius = -9999.
-
90  eccen_squared = -9999.
-
91  END SELECT
-
92  !
-
93  RETURN
-
94  !
-
95  END SUBROUTINE earth_radius
-
96 end module earth_radius_mod
-
Determine earth radius and shape.
-
subroutine, public earth_radius(IGDTMPL, IGDTLEN, RADIUS, ECCEN_SQUARED)
Determine earth radius and shape.
+Go to the documentation of this file.
1
+
4
+ +
8 implicit none
+
9
+
10 private
+
11 public :: earth_radius
+
12
+
13contains
+
14
+
+
40 SUBROUTINE earth_radius(IGDTMPL, IGDTLEN, RADIUS, ECCEN_SQUARED)
+
41 IMPLICIT NONE
+
42
+
43 INTEGER, INTENT(IN ) :: igdtlen
+
44 INTEGER, INTENT(IN ) :: igdtmpl(igdtlen)
+
45
+
46 REAL, INTENT( OUT) :: eccen_squared
+
47 REAL, INTENT( OUT) :: radius
+
48
+
49 REAL :: flat
+
50 REAL :: major_axis, minor_axis
+
51
+
52 SELECT CASE (igdtmpl(1))
+
53 CASE (0)
+
54 radius = 6367470.0
+
55 eccen_squared = 0.0
+
56 CASE (1) ! USER SPECIFIED SPHERICAL
+
57 radius = float(igdtmpl(3))/float(10**igdtmpl(2))
+
58 eccen_squared = 0.0
+
59 CASE (2) ! IAU 1965
+
60 radius = 6378160.0 ! SEMI MAJOR AXIS
+
61 flat = 1.0/297.0 ! FLATTENING
+
62 eccen_squared = (2.0*flat) - (flat**2)
+
63 CASE (3) ! USER SPECIFIED ELLIPTICAL (KM)
+
64 major_axis = float(igdtmpl(5))/float(10**igdtmpl(4))
+
65 major_axis = major_axis * 1000.0
+
66 minor_axis = float(igdtmpl(7))/float(10**igdtmpl(6))
+
67 minor_axis = minor_axis * 1000.0
+
68 eccen_squared = 1.0 - (minor_axis**2 / major_axis**2)
+
69 radius = major_axis
+
70 CASE (4) ! IAG-GRS80 MODEL
+
71 radius = 6378137.0 ! SEMI MAJOR AXIS
+
72 flat = 1.0/298.2572 ! FLATTENING
+
73 eccen_squared = (2.0*flat) - (flat**2)
+
74 CASE (5) ! WGS84 DATUM
+
75 radius = 6378137.0 ! SEMI MAJOR AXIS
+
76 eccen_squared = 0.00669437999013
+
77 CASE (6)
+
78 radius = 6371229.0
+
79 eccen_squared = 0.0
+
80 CASE (7) ! USER SPECIFIED ELLIPTICAL (M)
+
81 major_axis = float(igdtmpl(5))/float(10**igdtmpl(4))
+
82 minor_axis = float(igdtmpl(7))/float(10**igdtmpl(6))
+
83 eccen_squared = 1.0 - (minor_axis**2 / major_axis**2)
+
84 radius = major_axis
+
85 CASE (8)
+
86 radius = 6371200.0
+
87 eccen_squared = 0.0
+
88 CASE DEFAULT
+
89 radius = -9999.
+
90 eccen_squared = -9999.
+
91 END SELECT
+
92 !
+
93 RETURN
+
94 !
+
+
95 END SUBROUTINE earth_radius
+
96end module earth_radius_mod
+
Determine earth radius and shape.
+
subroutine, public earth_radius(igdtmpl, igdtlen, radius, eccen_squared)
Determine earth radius and shape.
diff --git a/fftpack_8F.html b/fftpack_8F.html index 2627441e..6eeac11c 100644 --- a/fftpack_8F.html +++ b/fftpack_8F.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: fftpack.F File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
fftpack.F File Reference
+
fftpack.F File Reference
@@ -94,74 +100,74 @@

Go to the source code of this file.

- - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + +

+

Functions/Subroutines

subroutine csfft (isign, n, scale, x, y, table, work, isys)
 csfft More...
subroutine csfft (isign, n, scale, x, y, table, work, isys)
 csfft
 
subroutine dcrft (init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
 dcrft More...
subroutine dcrft (init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
 dcrft
 
subroutine drcft (init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
 drcft More...
subroutine drcft (init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
 drcft
 
subroutine radb2 (IDO, L1, CC, CH, WA1)
 RADB2. More...
 
subroutine radb3 (IDO, L1, CC, CH, WA1, WA2)
 RADB3
- More...
 
subroutine radb4 (IDO, L1, CC, CH, WA1, WA2, WA3)
 RADB4. More...
 
subroutine radb5 (IDO, L1, CC, CH, WA1, WA2, WA3, WA4)
 RADB5. More...
 
subroutine radbg (IDO, IP, L1, IDL1, CC, C1, C2, CH, CH2, WA)
 RADBG. More...
 
subroutine radf2 (IDO, L1, CC, CH, WA1)
 RADBG. More...
 
subroutine radf3 (IDO, L1, CC, CH, WA1, WA2)
 RADF3. More...
 
subroutine radf4 (IDO, L1, CC, CH, WA1, WA2, WA3)
 RADF4. More...
 
subroutine radf5 (IDO, L1, CC, CH, WA1, WA2, WA3, WA4)
 RADF5. More...
 
subroutine radfg (IDO, IP, L1, IDL1, CC, C1, C2, CH, CH2, WA)
 RADFG. More...
 
subroutine rfftb (N, R, WSAVE)
 RFFTB. More...
 
subroutine rfftb1 (N, C, CH, WA, IFAC)
 RFFTB1. More...
 
subroutine rfftf (N, R, WSAVE)
 RFFTF. More...
 
subroutine rfftf1 (N, C, CH, WA, IFAC)
 RFFTF1. More...
 
subroutine rffti (N, WSAVE)
 RFFTI. More...
 
subroutine rffti1 (N, WA, IFAC)
 RFFTI1. More...
 
subroutine scfft (isign, n, scale, x, y, table, work, isys)
 scfft More...
subroutine radb2 (ido, l1, cc, ch, wa1)
 RADB2.
 
subroutine radb3 (ido, l1, cc, ch, wa1, wa2)
 RADB3
+
 
subroutine radb4 (ido, l1, cc, ch, wa1, wa2, wa3)
 RADB4.
 
subroutine radb5 (ido, l1, cc, ch, wa1, wa2, wa3, wa4)
 RADB5.
 
subroutine radbg (ido, ip, l1, idl1, cc, c1, c2, ch, ch2, wa)
 RADBG.
 
subroutine radf2 (ido, l1, cc, ch, wa1)
 RADBG.
 
subroutine radf3 (ido, l1, cc, ch, wa1, wa2)
 RADF3.
 
subroutine radf4 (ido, l1, cc, ch, wa1, wa2, wa3)
 RADF4.
 
subroutine radf5 (ido, l1, cc, ch, wa1, wa2, wa3, wa4)
 RADF5.
 
subroutine radfg (ido, ip, l1, idl1, cc, c1, c2, ch, ch2, wa)
 RADFG.
 
subroutine rfftb (n, r, wsave)
 RFFTB.
 
subroutine rfftb1 (n, c, ch, wa, ifac)
 RFFTB1.
 
subroutine rfftf (n, r, wsave)
 RFFTF.
 
subroutine rfftf1 (n, c, ch, wa, ifac)
 RFFTF1.
 
subroutine rffti (n, wsave)
 RFFTI.
 
subroutine rffti1 (n, wa, ifac)
 RFFTI1.
 
subroutine scfft (isign, n, scale, x, y, table, work, isys)
 scfft
 
subroutine scrft (init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
 scrft More...
subroutine scrft (init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
 scrft
 
subroutine srcft (init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
 srcft More...
subroutine srcft (init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
 srcft
 

Detailed Description

@@ -175,8 +181,8 @@

Definition in file fftpack.F.

Function/Subroutine Documentation

- -

◆ csfft()

+ +

◆ csfft()

@@ -259,8 +265,8 @@

-

◆ dcrft()

+ +

◆ dcrft()

@@ -394,8 +400,8 @@

-

◆ drcft()

+ +

◆ drcft()

@@ -529,8 +535,8 @@

-

◆ radb2()

+ +

◆ radb2()

@@ -539,31 +545,31 @@

subroutine radb2 (   - IDO, + ido,   - L1, + l1, dimension(ido,2,l1)  - CC, + cc, dimension(ido,l1,2)  - CH, + ch, dimension(*)  - WA1  + wa1  @@ -592,8 +598,8 @@

-

◆ radb3()

+ +

◆ radb3()

@@ -602,37 +608,37 @@

subroutine radb3 (   - IDO, + ido,   - L1, + l1, dimension(ido,3,l1)  - CC, + cc, dimension(ido,l1,3)  - CH, + ch, dimension(*)  - WA1, + wa1, dimension(*)  - WA2  + wa2  @@ -663,8 +669,8 @@

-

◆ radb4()

+ +

◆ radb4()

@@ -673,43 +679,43 @@

subroutine radb4 (   - IDO, + ido,   - L1, + l1, dimension(ido,4,l1)  - CC, + cc, dimension(ido,l1,4)  - CH, + ch, dimension(*)  - WA1, + wa1, dimension(*)  - WA2, + wa2, dimension(*)  - WA3  + wa3  @@ -740,8 +746,8 @@

-

◆ radb5()

+ +

◆ radb5()

@@ -750,49 +756,49 @@

subroutine radb5 (   - IDO, + ido,   - L1, + l1, dimension(ido,5,l1)  - CC, + cc, dimension(ido,l1,5)  - CH, + ch, dimension(*)  - WA1, + wa1, dimension(*)  - WA2, + wa2, dimension(*)  - WA3, + wa3, dimension(*)  - WA4  + wa4  @@ -824,8 +830,8 @@

-

◆ radbg()

+ +

◆ radbg()

@@ -834,61 +840,61 @@

subroutine radbg (   - IDO, + ido,   - IP, + ip,   - L1, + l1,   - IDL1, + idl1, dimension(ido,ip,l1)  - CC, + cc, dimension(ido,l1,ip)  - C1, + c1, dimension(idl1,ip)  - C2, + c2, dimension(ido,l1,ip)  - CH, + ch, dimension(idl1,ip)  - CH2, + ch2, dimension(*)  - WA  + wa  @@ -922,8 +928,8 @@

-

◆ radf2()

+ +

◆ radf2()

@@ -932,31 +938,31 @@

subroutine radf2 (   - IDO, + ido,   - L1, + l1, dimension(ido,l1,2)  - CC, + cc, dimension(ido,2,l1)  - CH, + ch, dimension(*)  - WA1  + wa1  @@ -985,8 +991,8 @@

-

◆ radf3()

+ +

◆ radf3()

@@ -995,37 +1001,37 @@

subroutine radf3 (   - IDO, + ido,   - L1, + l1, dimension(ido,l1,3)  - CC, + cc, dimension(ido,3,l1)  - CH, + ch, dimension(*)  - WA1, + wa1, dimension(*)  - WA2  + wa2  @@ -1055,8 +1061,8 @@

-

◆ radf4()

+ +

◆ radf4()

@@ -1065,43 +1071,43 @@

subroutine radf4 (   - IDO, + ido,   - L1, + l1, dimension(ido,l1,4)  - CC, + cc, dimension(ido,4,l1)  - CH, + ch, dimension(*)  - WA1, + wa1, dimension(*)  - WA2, + wa2, dimension(*)  - WA3  + wa3  @@ -1132,8 +1138,8 @@

-

◆ radf5()

+ +

◆ radf5()

@@ -1142,49 +1148,49 @@

subroutine radf5 (   - IDO, + ido,   - L1, + l1, dimension(ido,l1,5)  - CC, + cc, dimension(ido,5,l1)  - CH, + ch, dimension(*)  - WA1, + wa1, dimension(*)  - WA2, + wa2, dimension(*)  - WA3, + wa3, dimension(*)  - WA4  + wa4  @@ -1216,8 +1222,8 @@

-

◆ radfg()

+ +

◆ radfg()

@@ -1226,61 +1232,61 @@

subroutine radfg (   - IDO, + ido,   - IP, + ip,   - L1, + l1,   - IDL1, + idl1, dimension(ido,ip,l1)  - CC, + cc, dimension(ido,l1,ip)  - C1, + c1, dimension(idl1,ip)  - C2, + c2, dimension(ido,l1,ip)  - CH, + ch, dimension(idl1,ip)  - CH2, + ch2, dimension(*)  - WA  + wa  @@ -1314,8 +1320,8 @@

-

◆ rfftb()

+ +

◆ rfftb()

@@ -1324,19 +1330,19 @@

subroutine rfftb (   - N, + n, dimension(*)  - R, + r, dimension(*)  - WSAVE  + wsave  @@ -1365,8 +1371,8 @@

-

◆ rfftb1()

+ +

◆ rfftb1()

@@ -1375,31 +1381,31 @@

subroutine rfftb1 (   - N, + n, real, dimension(*)  - C, + c, real, dimension(*)  - CH, + ch, real, dimension(*)  - WA, + wa, real, dimension(*)  - IFAC  + ifac  @@ -1430,8 +1436,8 @@

-

◆ rfftf()

+ +

◆ rfftf()

@@ -1440,19 +1446,19 @@

subroutine rfftf (   - N, + n, dimension(*)  - R, + r, dimension(*)  - WSAVE  + wsave  @@ -1481,8 +1487,8 @@

-

◆ rfftf1()

+ +

◆ rfftf1()

@@ -1491,31 +1497,31 @@

subroutine rfftf1 (   - N, + n, real, dimension(*)  - C, + c, real, dimension(*)  - CH, + ch, real, dimension(*)  - WA, + wa, real, dimension(*)  - IFAC  + ifac  @@ -1546,8 +1552,8 @@

-

◆ rffti()

+ +

◆ rffti()

@@ -1556,13 +1562,13 @@

subroutine rffti (   - N, + n, dimension(*)  - WSAVE  + wsave  @@ -1590,8 +1596,8 @@

-

◆ rffti1()

+ +

◆ rffti1()

@@ -1600,19 +1606,19 @@

subroutine rffti1 (   - N, + n, real, dimension(*)  - WA, + wa, real, dimension(*)  - IFAC  + ifac  @@ -1639,8 +1645,8 @@

-

◆ scfft()

+ +

◆ scfft()

@@ -1723,8 +1729,8 @@

-

◆ scrft()

+ +

◆ scrft()

@@ -1858,8 +1864,8 @@

-

◆ srcft()

+ +

◆ srcft()

@@ -1999,7 +2005,7 @@

diff --git a/fftpack_8F.js b/fftpack_8F.js index 98c5a031..221ffcb9 100644 --- a/fftpack_8F.js +++ b/fftpack_8F.js @@ -3,22 +3,22 @@ var fftpack_8F = [ "csfft", "fftpack_8F.html#ad261879c88a7f040e43f1549e65f36e5", null ], [ "dcrft", "fftpack_8F.html#a713ef445886ad8dc8b16692c6075d225", null ], [ "drcft", "fftpack_8F.html#a55b05419c0d3bb0595b34c8cacf93be8", null ], - [ "radb2", "fftpack_8F.html#ae63abe3a02989ed4fbd60b50bc0c6dda", null ], - [ "radb3", "fftpack_8F.html#a6129001ac4cdf5d5a345edc2822d8014", null ], - [ "radb4", "fftpack_8F.html#a3b5aab129020968eaf92f2e6ca0785ef", null ], - [ "radb5", "fftpack_8F.html#a2b6492f922cbee03af5b89d52356abf1", null ], - [ "radbg", "fftpack_8F.html#af5a2521b66fece6cc768206c1df0d20b", null ], - [ "radf2", "fftpack_8F.html#a70e2420dd5bee9e41eb6c15bbad5eef6", null ], - [ "radf3", "fftpack_8F.html#a51374398f8edd5701987ce483c739592", null ], - [ "radf4", "fftpack_8F.html#ae9910ca606fd0cdb03b5b3b98533f486", null ], - [ "radf5", "fftpack_8F.html#a6d852c36924b038f77a24b8e22205add", null ], - [ "radfg", "fftpack_8F.html#ad5dbca6bb6ee7c0a86a1e140627de1b2", null ], - [ "rfftb", "fftpack_8F.html#a79ba25d1f342858b0faa3c3e3585ec88", null ], - [ "rfftb1", "fftpack_8F.html#afa735c298a72dd1c13ab1c45e737c066", null ], - [ "rfftf", "fftpack_8F.html#afbb5dc9c70ebe24759d5ffec1d3e42e2", null ], - [ "rfftf1", "fftpack_8F.html#acdf9efa42dc73f90af444ee0da649a09", null ], - [ "rffti", "fftpack_8F.html#a50f1237ff5990436609962c0eae406db", null ], - [ "rffti1", "fftpack_8F.html#ae3569ef7a371390f6bf38417865ef71b", null ], + [ "radb2", "fftpack_8F.html#ab6b183d050ed7a278e3d5d1b1df2a518", null ], + [ "radb3", "fftpack_8F.html#aa93bf6f642853a3350a9144cb1013f4c", null ], + [ "radb4", "fftpack_8F.html#af12eda15b4d802900d798b8be5cb0c11", null ], + [ "radb5", "fftpack_8F.html#a9d1d044f44ab9483c9d25fcaa9d9fa82", null ], + [ "radbg", "fftpack_8F.html#a068ff557b7f9a3ecca681d4946c0838c", null ], + [ "radf2", "fftpack_8F.html#a9dab9f8bdb8c20a1c0ab784960ad74cf", null ], + [ "radf3", "fftpack_8F.html#a8ace8115be26d3b5d69396a61c35bcba", null ], + [ "radf4", "fftpack_8F.html#a73c8f3eae90cf8e31e79e896190e6af6", null ], + [ "radf5", "fftpack_8F.html#a015879940c807ba1108d3f5c6273f357", null ], + [ "radfg", "fftpack_8F.html#a9b1a1683452238fd9720e8316b2064cc", null ], + [ "rfftb", "fftpack_8F.html#a36dbe2e8cdb99b5c43e8810f95c87c2a", null ], + [ "rfftb1", "fftpack_8F.html#a5176a5d29194d5bc9125da338ad86cec", null ], + [ "rfftf", "fftpack_8F.html#a88b14ae8b7022a3596e1a1fb5e109d8a", null ], + [ "rfftf1", "fftpack_8F.html#a695a5d7f2d8296ee0c1862da42d96879", null ], + [ "rffti", "fftpack_8F.html#add6f83f2c4ac91b29547511c4eed0836", null ], + [ "rffti1", "fftpack_8F.html#a12282309a28f39ee005339825ae90adb", null ], [ "scfft", "fftpack_8F.html#a369071ea2d380c9d91ba36d1bf375e33", null ], [ "scrft", "fftpack_8F.html#ac69cbd64be972c20a4424f5327fb4b36", null ], [ "srcft", "fftpack_8F.html#acf248c4f27a9fa81cffdfded50eee742", null ] diff --git a/fftpack_8F_source.html b/fftpack_8F_source.html index 4c82f5e5..9a441dc2 100644 --- a/fftpack_8F_source.html +++ b/fftpack_8F_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: fftpack.F Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,1422 +81,1472 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
fftpack.F
+
fftpack.F
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief A concatination of the (FFTPACK)[https://netlib.org/fftpack/] library code.
-
3 C>
-
4 C> FFTPACK is a package of Fortran subprograms for the fast Fourier
-
5 C> transform of periodic and other symmetric sequences. It includes
-
6 C> complex, real, sine, cosine, and quarter-wave transforms.
-
7 C>
-
8 C>Reference:
-
9 C>- P.N. Swarztrauber, Vectorizing the FFTs, in Parallel Computations
-
10 C>(G. Rodrigue, ed.), Academic Press, 1982, pp. 51--83.
-
11 C>
-
12 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
13 
-
14 C> dcrft
-
15 C>
-
16 C> @param init
-
17 C> @param x
-
18 C> @param ldx
-
19 C> @param y
-
20 C> @param ldy
-
21 C> @param n
-
22 C> @param m
-
23 C> @param isign
-
24 C> @param scale
-
25 C> @param table
-
26 C> @param n1
-
27 C> @param wrk
-
28 C> @param n2
-
29 C> @param z
-
30 C> @param nz
-
31 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
32  SUBROUTINE dcrft(init,x,ldx,y,ldy,n,m,isign,scale,
-
33  & table,n1,wrk,n2,z,nz)
-
34 
-
35  implicit none
-
36  integer init,ldx,ldy,n,m,isign,n1,n2,i,j
-
37  real x(2*ldx,*),y(ldy,*),scale,table(44002),wrk(*)
-
38  real, optional :: z
-
39  integer, optional :: nz
-
40 
-
41  IF (init.ne.0) THEN
-
42  CALL rffti(n,table)
-
43  ELSE
-
44 !OCL NOVREC
-
45  DO j=1,m
-
46  y(1,j)=x(1,j)
-
47  DO i=2,n
-
48  y(i,j)=x(i+1,j)
-
49  ENDDO
-
50  CALL rfftb(n,y(1,j),table)
-
51  DO i=1,n
-
52  y(i,j)=scale*y(i,j)
-
53  ENDDO
-
54  ENDDO
-
55  ENDIF
-
56 
-
57  RETURN
-
58  END
-
59 
-
60 C> scrft
-
61 C>
-
62 C> @param init
-
63 C> @param x
-
64 C> @param ldx
-
65 C> @param y
-
66 C> @param ldy
-
67 C> @param n
-
68 C> @param m
-
69 C> @param isign
-
70 C> @param scale
-
71 C> @param table
-
72 C> @param n1
-
73 C> @param wrk
-
74 C> @param n2
-
75 C> @param z
-
76 C> @param nz
-
77 C>
-
78 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
79 
-
80  SUBROUTINE scrft(init,x,ldx,y,ldy,n,m,isign,scale,
-
81  & table,n1,wrk,n2,z,nz)
-
82 
-
83  implicit none
-
84  integer init,ldx,ldy,n,m,isign,n1,n2,i,j
-
85  real x(2*ldx,*),y(ldy,*),scale,table(44002),wrk(*)
-
86  real, optional :: z
-
87  integer, optional :: nz
-
88 
-
89  IF (init.ne.0) THEN
-
90  CALL rffti(n,table)
-
91  ELSE
-
92 !OCL NOVREC
-
93  DO j=1,m
-
94  y(1,j)=x(1,j)
-
95  DO i=2,n
-
96  y(i,j)=x(i+1,j)
-
97  ENDDO
-
98  CALL rfftb(n,y(1,j),table)
-
99  DO i=1,n
-
100  y(i,j)=scale*y(i,j)
-
101  ENDDO
-
102  ENDDO
-
103  ENDIF
-
104 
-
105  RETURN
-
106  END
-
107 
-
108 C> csfft
-
109 C>
-
110 C> @param isign
-
111 C> @param n
-
112 C> @param scale
-
113 C> @param x
-
114 C> @param y
-
115 C> @param table
-
116 C> @param work
-
117 C> @param isys
-
118 C>
-
119 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
120  SUBROUTINE csfft(isign,n,scale,x,y,table,work,isys)
-
121 
-
122  implicit none
-
123  integer isign,n,isys,i
-
124  real scale,x(*),y(*),table(*),work(*)
-
125 
-
126  IF (isign.eq.0) THEN
-
127  CALL rffti(n,table)
-
128  ENDIF
-
129  IF (isign.eq.1) THEN
-
130  y(1)=x(1)
-
131  DO i=2,n
-
132  y(i)=x(i+1)
-
133  ENDDO
-
134  CALL rfftb(n,y,table)
-
135  DO i=1,n
-
136  y(i)=scale*y(i)
-
137  ENDDO
-
138  ENDIF
-
139 
-
140  RETURN
-
141  END
-
142 
-
143 C> drcft
-
144 C>
-
145 C> @param init
-
146 C> @param x
-
147 C> @param ldx
-
148 C> @param y
-
149 C> @param ldy
-
150 C> @param n
-
151 C> @param m
-
152 C> @param isign
-
153 C> @param scale
-
154 C> @param table
-
155 C> @param n1
-
156 C> @param wrk
-
157 C> @param n2
-
158 C> @param z
-
159 C> @param nz
-
160 C>
-
161 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
162  SUBROUTINE drcft(init,x,ldx,y,ldy,n,m,isign,scale,
-
163  & table,n1,wrk,n2,z,nz)
-
164 
-
165  implicit none
-
166  integer init,ldx,ldy,n,m,isign,n1,n2,i,j
-
167  real x(ldx,*),y(2*ldy,*),scale,table(44002),wrk(*)
-
168  real, optional :: z
-
169  integer, optional :: nz
-
170 
-
171  IF (init.ne.0) THEN
-
172  CALL rffti(n,table)
-
173  ELSE
-
174  DO j=1,m
-
175  DO i=1,n
-
176  y(i,j)=x(i,j)
-
177  ENDDO
-
178  CALL rfftf(n,y(1,j),table)
-
179  DO i=1,n
-
180  y(i,j)=scale*y(i,j)
-
181  ENDDO
-
182  DO i=n,2,-1
-
183  y(i+1,j)=y(i,j)
-
184  ENDDO
-
185  y(2,j)=0.
-
186 C 01/17/2013 vvvvvvvvvvvvv E.Mirvis added ver 2.0.1 by S.Moorthi request. No +|- demo.
-
187  y(n+2,j) = 0.
-
188  ENDDO
-
189  ENDIF
-
190 
-
191  RETURN
-
192  END
-
193 
-
194 C> srcft
-
195 C>
-
196 C> @param init
-
197 C> @param x
-
198 C> @param ldx
-
199 C> @param y
-
200 C> @param ldy
-
201 C> @param n
-
202 C> @param m
-
203 C> @param isign
-
204 C> @param scale
-
205 C> @param table
-
206 C> @param n1
-
207 C> @param wrk
-
208 C> @param n2
-
209 C> @param z
-
210 C> @param nz
-
211 C>
-
212 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
213  SUBROUTINE srcft(init,x,ldx,y,ldy,n,m,isign,scale,
-
214  & table,n1,wrk,n2,z,nz)
-
215 
-
216  implicit none
-
217  integer init,ldx,ldy,n,m,isign,n1,n2,i,j
-
218  real x(ldx,*),y(2*ldy,*),scale,table(44002),wrk(*)
-
219  real, optional :: z
-
220  integer, optional :: nz
-
221 
-
222  IF (init.ne.0) THEN
-
223  CALL rffti(n,table)
-
224  ELSE
-
225  DO j=1,m
-
226  DO i=1,n
-
227  y(i,j)=x(i,j)
-
228  ENDDO
-
229  CALL rfftf(n,y(1,j),table)
-
230  DO i=1,n
-
231  y(i,j)=scale*y(i,j)
-
232  ENDDO
-
233  DO i=n,2,-1
-
234  y(i+1,j)=y(i,j)
-
235  ENDDO
-
236  y(2,j)=0.
-
237  y(n+2,j) = 0.
-
238 C 01/17/2013 ^^^^^^^^^^E.Mirvis added ver 2.0.1 by S.Moorthi request. No +|- demo.
-
239  ENDDO
-
240  ENDIF
-
241 
-
242  RETURN
-
243  END
-
244 
-
245 C> scfft
-
246 C>
-
247 C> @param isign
-
248 C> @param n
-
249 C> @param scale
-
250 C> @param x
-
251 C> @param y
-
252 C> @param table
-
253 C> @param work
-
254 C> @param isys
-
255 C>
-
256 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
257  SUBROUTINE scfft(isign,n,scale,x,y,table,work,isys)
-
258 
-
259  implicit none
-
260  integer isign,n,isys,i
-
261  real scale,x(*),y(*),table(*),work(*)
-
262 
-
263  IF (isign.eq.0) THEN
-
264  CALL rffti(n,table)
-
265  ENDIF
-
266  IF (isign.eq.-1) THEN
-
267  DO i=1,n
-
268  y(i)=x(i)
-
269  ENDDO
-
270  CALL rfftf(n,y,table)
-
271  DO i=1,n
-
272  y(i)=scale*y(i)
-
273  ENDDO
-
274  DO i=n,2,-1
-
275  y(i+1)=y(i)
-
276  ENDDO
-
277  y(2)=0.
-
278  ENDIF
-
279 
-
280  RETURN
-
281  END
-
282 
-
283 C> RFFTF
-
284 C>
-
285 C> @param N
-
286 C> @param R
-
287 C> @param WSAVE
-
288 C>
-
289 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
290  SUBROUTINE rfftf (N,R,WSAVE)
-
291  dimension r(*) ,wsave(*)
-
292  IF (n .EQ. 1) RETURN
-
293  CALL rfftf1 (n,r,wsave,wsave(n+1),wsave(2*n+1))
-
294  RETURN
-
295  END
-
296 
-
297 C> RFFTB
-
298 C>
-
299 C> @param N
-
300 C> @param R
-
301 C> @param WSAVE
-
302 C>
-
303 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
304  SUBROUTINE rfftb (N,R,WSAVE)
-
305  dimension r(*) ,wsave(*)
-
306  IF (n .EQ. 1) RETURN
-
307  CALL rfftb1 (n,r,wsave,wsave(n+1),wsave(2*n+1))
-
308  RETURN
-
309  END
-
310 
-
311 C> RFFTI
-
312 C>
-
313 C> @param N
-
314 C> @param WSAVE
-
315 C>
-
316 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
317  SUBROUTINE rffti (N,WSAVE)
-
318  dimension wsave(*)
-
319  IF (n .EQ. 1) RETURN
-
320  CALL rffti1 (n,wsave(n+1),wsave(2*n+1))
-
321  RETURN
-
322  END
-
323 
-
324 C> RFFTB1
-
325 C>
-
326 C> @param N
-
327 C> @param C
-
328 C> @param CH
-
329 C> @param WA
-
330 C> @param IFAC
-
331 C>
-
332 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
333  SUBROUTINE rfftb1 (N,C,CH,WA,IFAC)
-
334  REAL CH(*) ,C(*) ,WA(*) ,IFAC(*)
-
335  NF = int(ifac(2))
-
336  na = 0
-
337  l1 = 1
-
338  iw = 1
-
339  DO 116 k1=1,nf
-
340  ip = int(ifac(k1+2))
-
341  l2 = ip*l1
-
342  ido = n/l2
-
343  idl1 = ido*l1
-
344  IF (ip .NE. 4) GO TO 103
-
345  ix2 = iw+ido
-
346  ix3 = ix2+ido
-
347  IF (na .NE. 0) GO TO 101
-
348  CALL radb4 (ido,l1,c,ch,wa(iw),wa(ix2),wa(ix3))
-
349  GO TO 102
-
350  101 CALL radb4 (ido,l1,ch,c,wa(iw),wa(ix2),wa(ix3))
-
351  102 na = 1-na
-
352  GO TO 115
-
353  103 IF (ip .NE. 2) GO TO 106
-
354  IF (na .NE. 0) GO TO 104
-
355  CALL radb2 (ido,l1,c,ch,wa(iw))
-
356  GO TO 105
-
357  104 CALL radb2 (ido,l1,ch,c,wa(iw))
-
358  105 na = 1-na
-
359  GO TO 115
-
360  106 IF (ip .NE. 3) GO TO 109
-
361  ix2 = iw+ido
-
362  IF (na .NE. 0) GO TO 107
-
363  CALL radb3 (ido,l1,c,ch,wa(iw),wa(ix2))
-
364  GO TO 108
-
365  107 CALL radb3 (ido,l1,ch,c,wa(iw),wa(ix2))
-
366  108 na = 1-na
-
367  GO TO 115
-
368  109 IF (ip .NE. 5) GO TO 112
-
369  ix2 = iw+ido
-
370  ix3 = ix2+ido
-
371  ix4 = ix3+ido
-
372  IF (na .NE. 0) GO TO 110
-
373  CALL radb5 (ido,l1,c,ch,wa(iw),wa(ix2),wa(ix3),wa(ix4))
-
374  GO TO 111
-
375  110 CALL radb5 (ido,l1,ch,c,wa(iw),wa(ix2),wa(ix3),wa(ix4))
-
376  111 na = 1-na
-
377  GO TO 115
-
378  112 IF (na .NE. 0) GO TO 113
-
379  CALL radbg (ido,ip,l1,idl1,c,c,c,ch,ch,wa(iw))
-
380  GO TO 114
-
381  113 CALL radbg (ido,ip,l1,idl1,ch,ch,ch,c,c,wa(iw))
-
382  114 IF (ido .EQ. 1) na = 1-na
-
383  115 l1 = l2
-
384  iw = iw+(ip-1)*ido
-
385  116 CONTINUE
-
386  IF (na .EQ. 0) RETURN
-
387  DO 117 i=1,n
-
388  c(i) = ch(i)
-
389  117 CONTINUE
-
390  RETURN
-
391  END
-
392 
-
393 C> RFFTF1
-
394 C>
-
395 C> @param N
-
396 C> @param C
-
397 C> @param CH
-
398 C> @param WA
-
399 C> @param IFAC
-
400 C>
-
401 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
402  SUBROUTINE rfftf1 (N,C,CH,WA,IFAC)
-
403  REAL CH(*) ,C(*) ,WA(*) ,IFAC(*)
-
404  NF = int(ifac(2))
-
405  na = 1
-
406  l2 = n
-
407  iw = n
-
408  DO 111 k1=1,nf
-
409  kh = nf-k1
-
410  ip = int(ifac(kh+3))
-
411  l1 = l2/ip
-
412  ido = n/l2
-
413  idl1 = ido*l1
-
414  iw = iw-(ip-1)*ido
-
415  na = 1-na
-
416  IF (ip .NE. 4) GO TO 102
-
417  ix2 = iw+ido
-
418  ix3 = ix2+ido
-
419  IF (na .NE. 0) GO TO 101
-
420  CALL radf4 (ido,l1,c,ch,wa(iw),wa(ix2),wa(ix3))
-
421  GO TO 110
-
422  101 CALL radf4 (ido,l1,ch,c,wa(iw),wa(ix2),wa(ix3))
-
423  GO TO 110
-
424  102 IF (ip .NE. 2) GO TO 104
-
425  IF (na .NE. 0) GO TO 103
-
426  CALL radf2 (ido,l1,c,ch,wa(iw))
-
427  GO TO 110
-
428  103 CALL radf2 (ido,l1,ch,c,wa(iw))
-
429  GO TO 110
-
430  104 IF (ip .NE. 3) GO TO 106
-
431  ix2 = iw+ido
-
432  IF (na .NE. 0) GO TO 105
-
433  CALL radf3 (ido,l1,c,ch,wa(iw),wa(ix2))
-
434  GO TO 110
-
435  105 CALL radf3 (ido,l1,ch,c,wa(iw),wa(ix2))
-
436  GO TO 110
-
437  106 IF (ip .NE. 5) GO TO 108
-
438  ix2 = iw+ido
-
439  ix3 = ix2+ido
-
440  ix4 = ix3+ido
-
441  IF (na .NE. 0) GO TO 107
-
442  CALL radf5 (ido,l1,c,ch,wa(iw),wa(ix2),wa(ix3),wa(ix4))
-
443  GO TO 110
-
444  107 CALL radf5 (ido,l1,ch,c,wa(iw),wa(ix2),wa(ix3),wa(ix4))
-
445  GO TO 110
-
446  108 IF (ido .EQ. 1) na = 1-na
-
447  IF (na .NE. 0) GO TO 109
-
448  CALL radfg (ido,ip,l1,idl1,c,c,c,ch,ch,wa(iw))
-
449  na = 1
-
450  GO TO 110
-
451  109 CALL radfg (ido,ip,l1,idl1,ch,ch,ch,c,c,wa(iw))
-
452  na = 0
-
453  110 l2 = l1
-
454  111 CONTINUE
-
455  IF (na .EQ. 1) RETURN
-
456  DO 112 i=1,n
-
457  c(i) = ch(i)
-
458  112 CONTINUE
-
459  RETURN
-
460  END
-
461 
-
462 C> RFFTI1
-
463 C>
-
464 C> @param N
-
465 C> @param WA
-
466 C> @param IFAC
-
467 C>
-
468 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
469  SUBROUTINE rffti1 (N,WA,IFAC)
-
470  REAL WA(*) ,IFAC(*) ,NTRYH(4)
-
471  DATA NTRYH(1),NTRYH(2),NTRYH(3),NTRYH(4)/4,2,3,5/
-
472  NL = n
-
473  nf = 0
-
474  j = 0
-
475  101 j = j+1
-
476  IF ((j-4).LE.0) THEN
-
477  GO TO 102
-
478  ELSE
-
479  GO TO 103
-
480  ENDIF
-
481  102 ntry = int(ntryh(j))
-
482  GO TO 104
-
483  103 ntry = ntry+2
-
484  104 nq = nl/ntry
-
485  nr = nl-ntry*nq
-
486  IF (nr.EQ.0) THEN
-
487  GO TO 105
-
488  ELSE
-
489  GO TO 101
-
490  ENDIF
-
491  105 nf = nf+1
-
492  ifac(nf+2) = ntry
-
493  nl = nq
-
494  IF (ntry .NE. 2) GO TO 107
-
495  IF (nf .EQ. 1) GO TO 107
-
496  DO 106 i=2,nf
-
497  ib = nf-i+2
-
498  ifac(ib+2) = ifac(ib+1)
-
499  106 CONTINUE
-
500  ifac(3) = 2
-
501  107 IF (nl .NE. 1) GO TO 104
-
502  ifac(1) = n
-
503  ifac(2) = nf
-
504  tpi = 6.28318530717959
-
505  argh = tpi/float(n)
-
506  is = 0
-
507  nfm1 = nf-1
-
508  l1 = 1
-
509  IF (nfm1 .EQ. 0) RETURN
-
510 !OCL NOVREC
-
511  DO 110 k1=1,nfm1
-
512  ip = int(ifac(k1+2))
-
513  ld = 0
-
514  l2 = l1*ip
-
515  ido = n/l2
-
516  ipm = ip-1
-
517  DO 109 j=1,ipm
-
518  ld = ld+l1
-
519  i = is
-
520  argld = float(ld)*argh
-
521  fi = 0
-
522 !OCL SCALAR
-
523  DO 108 ii=3,ido,2
-
524  i = i+2
-
525  fi = fi+1
-
526  arg = fi*argld
-
527  wa(i-1) = cos(arg)
-
528  wa(i) = sin(arg)
-
529  108 CONTINUE
-
530  is = is+ido
-
531  109 CONTINUE
-
532  l1 = l2
-
533  110 CONTINUE
-
534  RETURN
-
535  END
-
536 
-
537 C> RADB2
-
538 C>
-
539 C> @param IDO
-
540 C> @param L1
-
541 C> @param CC
-
542 C> @param CH
-
543 C> @param WA1
-
544 C>
-
545 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
546  SUBROUTINE radb2 (IDO,L1,CC,CH,WA1)
-
547  dimension cc(ido,2,l1) ,ch(ido,l1,2) ,
-
548  1 wa1(*)
-
549  DO 101 k=1,l1
-
550  ch(1,k,1) = cc(1,1,k)+cc(ido,2,k)
-
551  ch(1,k,2) = cc(1,1,k)-cc(ido,2,k)
-
552  101 CONTINUE
-
553  IF (ido.LT.2) THEN
-
554  GO TO 107
-
555  ELSEIF (ido.EQ.2) THEN
-
556  GO TO 105
-
557  ELSE
-
558  GO TO 102
-
559  ENDIF
-
560  102 idp2 = ido+2
-
561 !OCL NOVREC
-
562  DO 104 k=1,l1
-
563  DO 103 i=3,ido,2
-
564  ic = idp2-i
-
565  ch(i-1,k,1) = cc(i-1,1,k)+cc(ic-1,2,k)
-
566  tr2 = cc(i-1,1,k)-cc(ic-1,2,k)
-
567  ch(i,k,1) = cc(i,1,k)-cc(ic,2,k)
-
568  ti2 = cc(i,1,k)+cc(ic,2,k)
-
569  ch(i-1,k,2) = wa1(i-2)*tr2-wa1(i-1)*ti2
-
570  ch(i,k,2) = wa1(i-2)*ti2+wa1(i-1)*tr2
-
571  103 CONTINUE
-
572  104 CONTINUE
-
573  IF (mod(ido,2) .EQ. 1) RETURN
-
574  105 DO 106 k=1,l1
-
575  ch(ido,k,1) = cc(ido,1,k)+cc(ido,1,k)
-
576  ch(ido,k,2) = -(cc(1,2,k)+cc(1,2,k))
-
577  106 CONTINUE
-
578  107 RETURN
-
579  END
-
580 
-
581 C> RADB3
-
582 C>
-
583 C> @param IDO
-
584 C> @param L1
-
585 C> @param CC
-
586 C> @param CH
-
587 C> @param WA1
-
588 C> @param WA2
-
589 C>
-
590 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
591  SUBROUTINE radb3 (IDO,L1,CC,CH,WA1,WA2)
-
592  dimension cc(ido,3,l1) ,ch(ido,l1,3) ,
-
593  1 wa1(*) ,wa2(*)
-
594  DATA taur,taui /-.5,.866025403784439/
-
595  DO 101 k=1,l1
-
596  tr2 = cc(ido,2,k)+cc(ido,2,k)
-
597  cr2 = cc(1,1,k)+taur*tr2
-
598  ch(1,k,1) = cc(1,1,k)+tr2
-
599  ci3 = taui*(cc(1,3,k)+cc(1,3,k))
-
600  ch(1,k,2) = cr2-ci3
-
601  ch(1,k,3) = cr2+ci3
-
602  101 CONTINUE
-
603  IF (ido .EQ. 1) RETURN
-
604  idp2 = ido+2
-
605 !OCL NOVREC
-
606  DO 103 k=1,l1
-
607  DO 102 i=3,ido,2
-
608  ic = idp2-i
-
609  tr2 = cc(i-1,3,k)+cc(ic-1,2,k)
-
610  cr2 = cc(i-1,1,k)+taur*tr2
-
611  ch(i-1,k,1) = cc(i-1,1,k)+tr2
-
612  ti2 = cc(i,3,k)-cc(ic,2,k)
-
613  ci2 = cc(i,1,k)+taur*ti2
-
614  ch(i,k,1) = cc(i,1,k)+ti2
-
615  cr3 = taui*(cc(i-1,3,k)-cc(ic-1,2,k))
-
616  ci3 = taui*(cc(i,3,k)+cc(ic,2,k))
-
617  dr2 = cr2-ci3
-
618  dr3 = cr2+ci3
-
619  di2 = ci2+cr3
-
620  di3 = ci2-cr3
-
621  ch(i-1,k,2) = wa1(i-2)*dr2-wa1(i-1)*di2
-
622  ch(i,k,2) = wa1(i-2)*di2+wa1(i-1)*dr2
-
623  ch(i-1,k,3) = wa2(i-2)*dr3-wa2(i-1)*di3
-
624  ch(i,k,3) = wa2(i-2)*di3+wa2(i-1)*dr3
-
625  102 CONTINUE
-
626  103 CONTINUE
-
627  RETURN
-
628  END
-
629 
-
630 C> RADB4
-
631 C>
-
632 C> @param IDO
-
633 C> @param L1
-
634 C> @param CC
-
635 C> @param CH
-
636 C> @param WA1
-
637 C> @param WA2
-
638 C> @param WA3
-
639 C>
-
640 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
641  SUBROUTINE radb4 (IDO,L1,CC,CH,WA1,WA2,WA3)
-
642  dimension cc(ido,4,l1) ,ch(ido,l1,4) ,
-
643  1 wa1(*) ,wa2(*) ,wa3(*)
-
644  DATA sqrt2 /1.414213562373095/
-
645  DO 101 k=1,l1
-
646  tr1 = cc(1,1,k)-cc(ido,4,k)
-
647  tr2 = cc(1,1,k)+cc(ido,4,k)
-
648  tr3 = cc(ido,2,k)+cc(ido,2,k)
-
649  tr4 = cc(1,3,k)+cc(1,3,k)
-
650  ch(1,k,1) = tr2+tr3
-
651  ch(1,k,2) = tr1-tr4
-
652  ch(1,k,3) = tr2-tr3
-
653  ch(1,k,4) = tr1+tr4
-
654  101 CONTINUE
-
655  IF (ido.LT.2) THEN
-
656  GO TO 107
-
657  ELSEIF (ido.EQ.2) THEN
-
658  GO TO 105
-
659  ELSE
-
660  GO TO 102
-
661  ENDIF
-
662  102 idp2 = ido+2
-
663 !OCL NOVREC
-
664  DO 104 k=1,l1
-
665  DO 103 i=3,ido,2
-
666  ic = idp2-i
-
667  ti1 = cc(i,1,k)+cc(ic,4,k)
-
668  ti2 = cc(i,1,k)-cc(ic,4,k)
-
669  ti3 = cc(i,3,k)-cc(ic,2,k)
-
670  tr4 = cc(i,3,k)+cc(ic,2,k)
-
671  tr1 = cc(i-1,1,k)-cc(ic-1,4,k)
-
672  tr2 = cc(i-1,1,k)+cc(ic-1,4,k)
-
673  ti4 = cc(i-1,3,k)-cc(ic-1,2,k)
-
674  tr3 = cc(i-1,3,k)+cc(ic-1,2,k)
-
675  ch(i-1,k,1) = tr2+tr3
-
676  cr3 = tr2-tr3
-
677  ch(i,k,1) = ti2+ti3
-
678  ci3 = ti2-ti3
-
679  cr2 = tr1-tr4
-
680  cr4 = tr1+tr4
-
681  ci2 = ti1+ti4
-
682  ci4 = ti1-ti4
-
683  ch(i-1,k,2) = wa1(i-2)*cr2-wa1(i-1)*ci2
-
684  ch(i,k,2) = wa1(i-2)*ci2+wa1(i-1)*cr2
-
685  ch(i-1,k,3) = wa2(i-2)*cr3-wa2(i-1)*ci3
-
686  ch(i,k,3) = wa2(i-2)*ci3+wa2(i-1)*cr3
-
687  ch(i-1,k,4) = wa3(i-2)*cr4-wa3(i-1)*ci4
-
688  ch(i,k,4) = wa3(i-2)*ci4+wa3(i-1)*cr4
-
689  103 CONTINUE
-
690  104 CONTINUE
-
691  IF (mod(ido,2) .EQ. 1) RETURN
-
692  105 CONTINUE
-
693  DO 106 k=1,l1
-
694  ti1 = cc(1,2,k)+cc(1,4,k)
-
695  ti2 = cc(1,4,k)-cc(1,2,k)
-
696  tr1 = cc(ido,1,k)-cc(ido,3,k)
-
697  tr2 = cc(ido,1,k)+cc(ido,3,k)
-
698  ch(ido,k,1) = tr2+tr2
-
699  ch(ido,k,2) = sqrt2*(tr1-ti1)
-
700  ch(ido,k,3) = ti2+ti2
-
701  ch(ido,k,4) = -sqrt2*(tr1+ti1)
-
702  106 CONTINUE
-
703  107 RETURN
-
704  END
-
705 
-
706 C> RADB5
-
707 C>
-
708 C> @param IDO
-
709 C> @param L1
-
710 C> @param CC
-
711 C> @param CH
-
712 C> @param WA1
-
713 C> @param WA2
-
714 C> @param WA3
-
715 C> @param WA4
-
716 C>
-
717 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
718  SUBROUTINE radb5 (IDO,L1,CC,CH,WA1,WA2,WA3,WA4)
-
719  dimension cc(ido,5,l1) ,ch(ido,l1,5) ,
-
720  1 wa1(*) ,wa2(*) ,wa3(*) ,wa4(*)
-
721  DATA tr11,ti11,tr12,ti12 /.309016994374947,.951056516295154,
-
722  1-.809016994374947,.587785252292473/
-
723  DO 101 k=1,l1
-
724  ti5 = cc(1,3,k)+cc(1,3,k)
-
725  ti4 = cc(1,5,k)+cc(1,5,k)
-
726  tr2 = cc(ido,2,k)+cc(ido,2,k)
-
727  tr3 = cc(ido,4,k)+cc(ido,4,k)
-
728  ch(1,k,1) = cc(1,1,k)+tr2+tr3
-
729  cr2 = cc(1,1,k)+tr11*tr2+tr12*tr3
-
730  cr3 = cc(1,1,k)+tr12*tr2+tr11*tr3
-
731  ci5 = ti11*ti5+ti12*ti4
-
732  ci4 = ti12*ti5-ti11*ti4
-
733  ch(1,k,2) = cr2-ci5
-
734  ch(1,k,3) = cr3-ci4
-
735  ch(1,k,4) = cr3+ci4
-
736  ch(1,k,5) = cr2+ci5
-
737  101 CONTINUE
-
738  IF (ido .EQ. 1) RETURN
-
739  idp2 = ido+2
-
740  DO 103 k=1,l1
-
741  DO 102 i=3,ido,2
-
742  ic = idp2-i
-
743  ti5 = cc(i,3,k)+cc(ic,2,k)
-
744  ti2 = cc(i,3,k)-cc(ic,2,k)
-
745  ti4 = cc(i,5,k)+cc(ic,4,k)
-
746  ti3 = cc(i,5,k)-cc(ic,4,k)
-
747  tr5 = cc(i-1,3,k)-cc(ic-1,2,k)
-
748  tr2 = cc(i-1,3,k)+cc(ic-1,2,k)
-
749  tr4 = cc(i-1,5,k)-cc(ic-1,4,k)
-
750  tr3 = cc(i-1,5,k)+cc(ic-1,4,k)
-
751  ch(i-1,k,1) = cc(i-1,1,k)+tr2+tr3
-
752  ch(i,k,1) = cc(i,1,k)+ti2+ti3
-
753  cr2 = cc(i-1,1,k)+tr11*tr2+tr12*tr3
-
754  ci2 = cc(i,1,k)+tr11*ti2+tr12*ti3
-
755  cr3 = cc(i-1,1,k)+tr12*tr2+tr11*tr3
-
756  ci3 = cc(i,1,k)+tr12*ti2+tr11*ti3
-
757  cr5 = ti11*tr5+ti12*tr4
-
758  ci5 = ti11*ti5+ti12*ti4
-
759  cr4 = ti12*tr5-ti11*tr4
-
760  ci4 = ti12*ti5-ti11*ti4
-
761  dr3 = cr3-ci4
-
762  dr4 = cr3+ci4
-
763  di3 = ci3+cr4
-
764  di4 = ci3-cr4
-
765  dr5 = cr2+ci5
-
766  dr2 = cr2-ci5
-
767  di5 = ci2-cr5
-
768  di2 = ci2+cr5
-
769  ch(i-1,k,2) = wa1(i-2)*dr2-wa1(i-1)*di2
-
770  ch(i,k,2) = wa1(i-2)*di2+wa1(i-1)*dr2
-
771  ch(i-1,k,3) = wa2(i-2)*dr3-wa2(i-1)*di3
-
772  ch(i,k,3) = wa2(i-2)*di3+wa2(i-1)*dr3
-
773  ch(i-1,k,4) = wa3(i-2)*dr4-wa3(i-1)*di4
-
774  ch(i,k,4) = wa3(i-2)*di4+wa3(i-1)*dr4
-
775  ch(i-1,k,5) = wa4(i-2)*dr5-wa4(i-1)*di5
-
776  ch(i,k,5) = wa4(i-2)*di5+wa4(i-1)*dr5
-
777  102 CONTINUE
-
778  103 CONTINUE
-
779  RETURN
-
780  END
-
781 
-
782 C> RADBG
-
783 C>
-
784 C> @param IDO
-
785 C> @param IP
-
786 C> @param L1
-
787 C> @param IDL1
-
788 C> @param CC
-
789 C> @param C1
-
790 C> @param C2
-
791 C> @param CH
-
792 C> @param CH2
-
793 C> @param WA
-
794 C>
-
795 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
796  SUBROUTINE radbg (IDO,IP,L1,IDL1,CC,C1,C2,CH,CH2,WA)
-
797  dimension ch(ido,l1,ip) ,cc(ido,ip,l1) ,
-
798  1 c1(ido,l1,ip) ,c2(idl1,ip),
-
799  2 ch2(idl1,ip) ,wa(*)
-
800  DATA tpi/6.28318530717959/
-
801  arg = tpi/float(ip)
-
802  dcp = cos(arg)
-
803  dsp = sin(arg)
-
804  idp2 = ido+2
-
805  nbd = (ido-1)/2
-
806  ipp2 = ip+2
-
807  ipph = (ip+1)/2
-
808  IF (ido .LT. l1) GO TO 103
-
809  DO 102 k=1,l1
-
810  DO 101 i=1,ido
-
811  ch(i,k,1) = cc(i,1,k)
-
812  101 CONTINUE
-
813  102 CONTINUE
-
814  GO TO 106
-
815  103 DO 105 i=1,ido
-
816  DO 104 k=1,l1
-
817  ch(i,k,1) = cc(i,1,k)
-
818  104 CONTINUE
-
819  105 CONTINUE
-
820 !OCL NOVREC
-
821  106 DO 108 j=2,ipph
-
822  jc = ipp2-j
-
823  j2 = j+j
-
824  DO 107 k=1,l1
-
825  ch(1,k,j) = cc(ido,j2-2,k)+cc(ido,j2-2,k)
-
826  ch(1,k,jc) = cc(1,j2-1,k)+cc(1,j2-1,k)
-
827  107 CONTINUE
-
828  108 CONTINUE
-
829  IF (ido .EQ. 1) GO TO 116
-
830  IF (nbd .LT. l1) GO TO 112
-
831 !OCL NOVREC
-
832  DO 111 j=2,ipph
-
833  jc = ipp2-j
-
834  DO 110 k=1,l1
-
835  DO 109 i=3,ido,2
-
836  ic = idp2-i
-
837  ch(i-1,k,j) = cc(i-1,2*j-1,k)+cc(ic-1,2*j-2,k)
-
838  ch(i-1,k,jc) = cc(i-1,2*j-1,k)-cc(ic-1,2*j-2,k)
-
839  ch(i,k,j) = cc(i,2*j-1,k)-cc(ic,2*j-2,k)
-
840  ch(i,k,jc) = cc(i,2*j-1,k)+cc(ic,2*j-2,k)
-
841  109 CONTINUE
-
842  110 CONTINUE
-
843  111 CONTINUE
-
844  GO TO 116
-
845  112 DO 115 j=2,ipph
-
846  jc = ipp2-j
-
847  DO 114 i=3,ido,2
-
848  ic = idp2-i
-
849  DO 113 k=1,l1
-
850  ch(i-1,k,j) = cc(i-1,2*j-1,k)+cc(ic-1,2*j-2,k)
-
851  ch(i-1,k,jc) = cc(i-1,2*j-1,k)-cc(ic-1,2*j-2,k)
-
852  ch(i,k,j) = cc(i,2*j-1,k)-cc(ic,2*j-2,k)
-
853  ch(i,k,jc) = cc(i,2*j-1,k)+cc(ic,2*j-2,k)
-
854  113 CONTINUE
-
855  114 CONTINUE
-
856  115 CONTINUE
-
857  116 ar1 = 1.
-
858  ai1 = 0.
-
859 !OCL NOVREC
-
860  DO 120 l=2,ipph
-
861  lc = ipp2-l
-
862  ar1h = dcp*ar1-dsp*ai1
-
863  ai1 = dcp*ai1+dsp*ar1
-
864  ar1 = ar1h
-
865  DO 117 ik=1,idl1
-
866  c2(ik,l) = ch2(ik,1)+ar1*ch2(ik,2)
-
867  c2(ik,lc) = ai1*ch2(ik,ip)
-
868  117 CONTINUE
-
869  dc2 = ar1
-
870  ds2 = ai1
-
871  ar2 = ar1
-
872  ai2 = ai1
-
873 !OCL NOVREC
-
874  DO 119 j=3,ipph
-
875  jc = ipp2-j
-
876  ar2h = dc2*ar2-ds2*ai2
-
877  ai2 = dc2*ai2+ds2*ar2
-
878  ar2 = ar2h
-
879  DO 118 ik=1,idl1
-
880  c2(ik,l) = c2(ik,l)+ar2*ch2(ik,j)
-
881  c2(ik,lc) = c2(ik,lc)+ai2*ch2(ik,jc)
-
882  118 CONTINUE
-
883  119 CONTINUE
-
884  120 CONTINUE
-
885 !OCL NOVREC
-
886  DO 122 j=2,ipph
-
887  DO 121 ik=1,idl1
-
888  ch2(ik,1) = ch2(ik,1)+ch2(ik,j)
-
889  121 CONTINUE
-
890  122 CONTINUE
-
891 !OCL NOVREC
-
892  DO 124 j=2,ipph
-
893  jc = ipp2-j
-
894  DO 123 k=1,l1
-
895  ch(1,k,j) = c1(1,k,j)-c1(1,k,jc)
-
896  ch(1,k,jc) = c1(1,k,j)+c1(1,k,jc)
-
897  123 CONTINUE
-
898  124 CONTINUE
-
899  IF (ido .EQ. 1) GO TO 132
-
900  IF (nbd .LT. l1) GO TO 128
-
901 !OCL NOVREC
-
902  DO 127 j=2,ipph
-
903  jc = ipp2-j
-
904  DO 126 k=1,l1
-
905  DO 125 i=3,ido,2
-
906  ch(i-1,k,j) = c1(i-1,k,j)-c1(i,k,jc)
-
907  ch(i-1,k,jc) = c1(i-1,k,j)+c1(i,k,jc)
-
908  ch(i,k,j) = c1(i,k,j)+c1(i-1,k,jc)
-
909  ch(i,k,jc) = c1(i,k,j)-c1(i-1,k,jc)
-
910  125 CONTINUE
-
911  126 CONTINUE
-
912  127 CONTINUE
-
913  GO TO 132
-
914  128 DO 131 j=2,ipph
-
915  jc = ipp2-j
-
916  DO 130 i=3,ido,2
-
917  DO 129 k=1,l1
-
918  ch(i-1,k,j) = c1(i-1,k,j)-c1(i,k,jc)
-
919  ch(i-1,k,jc) = c1(i-1,k,j)+c1(i,k,jc)
-
920  ch(i,k,j) = c1(i,k,j)+c1(i-1,k,jc)
-
921  ch(i,k,jc) = c1(i,k,j)-c1(i-1,k,jc)
-
922  129 CONTINUE
-
923  130 CONTINUE
-
924  131 CONTINUE
-
925  132 CONTINUE
-
926  IF (ido .EQ. 1) RETURN
-
927  DO 133 ik=1,idl1
-
928  c2(ik,1) = ch2(ik,1)
-
929  133 CONTINUE
-
930  DO 135 j=2,ip
-
931  DO 134 k=1,l1
-
932  c1(1,k,j) = ch(1,k,j)
-
933  134 CONTINUE
-
934  135 CONTINUE
-
935  IF (nbd .GT. l1) GO TO 139
-
936  is = -ido
-
937  DO 138 j=2,ip
-
938  is = is+ido
-
939  idij = is
-
940  DO 137 i=3,ido,2
-
941  idij = idij+2
-
942  DO 136 k=1,l1
-
943  c1(i-1,k,j) = wa(idij-1)*ch(i-1,k,j)-wa(idij)*ch(i,k,j)
-
944  c1(i,k,j) = wa(idij-1)*ch(i,k,j)+wa(idij)*ch(i-1,k,j)
-
945  136 CONTINUE
-
946  137 CONTINUE
-
947  138 CONTINUE
-
948  GO TO 143
-
949  139 is = -ido
-
950 !OCL NOVREC
-
951  DO 142 j=2,ip
-
952  is = is+ido
-
953  DO 141 k=1,l1
-
954  idij = is
-
955  DO 140 i=3,ido,2
-
956  idij = idij+2
-
957  c1(i-1,k,j) = wa(idij-1)*ch(i-1,k,j)-wa(idij)*ch(i,k,j)
-
958  c1(i,k,j) = wa(idij-1)*ch(i,k,j)+wa(idij)*ch(i-1,k,j)
-
959  140 CONTINUE
-
960  141 CONTINUE
-
961  142 CONTINUE
-
962  143 RETURN
-
963  END
-
964 
-
965 C> RADBG
-
966 C>
-
967 C> @param IDO
-
968 C> @param L1
-
969 C> @param CC
-
970 C> @param CH
-
971 C> @param WA1
-
972 C>
-
973 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
974  SUBROUTINE radf2 (IDO,L1,CC,CH,WA1)
-
975  dimension ch(ido,2,l1) ,cc(ido,l1,2) ,
-
976  1 wa1(*)
-
977  DO 101 k=1,l1
-
978  ch(1,1,k) = cc(1,k,1)+cc(1,k,2)
-
979  ch(ido,2,k) = cc(1,k,1)-cc(1,k,2)
-
980  101 CONTINUE
-
981  IF (ido.LT.2) THEN
-
982  GO TO 107
-
983  ELSEIF (ido.EQ.2) THEN
-
984  GO TO 105
-
985  ELSE
-
986  GO TO 102
-
987  ENDIF
-
988  102 idp2 = ido+2
-
989  DO 104 k=1,l1
-
990  DO 103 i=3,ido,2
-
991  ic = idp2-i
-
992  tr2 = wa1(i-2)*cc(i-1,k,2)+wa1(i-1)*cc(i,k,2)
-
993  ti2 = wa1(i-2)*cc(i,k,2)-wa1(i-1)*cc(i-1,k,2)
-
994  ch(i,1,k) = cc(i,k,1)+ti2
-
995  ch(ic,2,k) = ti2-cc(i,k,1)
-
996  ch(i-1,1,k) = cc(i-1,k,1)+tr2
-
997  ch(ic-1,2,k) = cc(i-1,k,1)-tr2
-
998  103 CONTINUE
-
999  104 CONTINUE
-
1000  IF (mod(ido,2) .EQ. 1) RETURN
-
1001  105 DO 106 k=1,l1
-
1002  ch(1,2,k) = -cc(ido,k,2)
-
1003  ch(ido,1,k) = cc(ido,k,1)
-
1004  106 CONTINUE
-
1005  107 RETURN
-
1006  END
-
1007 
-
1008 C> RADF3
-
1009 C>
-
1010 C> @param IDO
-
1011 C> @param L1
-
1012 C> @param CC
-
1013 C> @param CH
-
1014 C> @param WA1
-
1015 C> @param WA2
-
1016 C>
-
1017 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
1018  SUBROUTINE radf3 (IDO,L1,CC,CH,WA1,WA2)
-
1019  dimension ch(ido,3,l1) ,cc(ido,l1,3) ,
-
1020  1 wa1(*) ,wa2(*)
-
1021  DATA taur,taui /-.5,.866025403784439/
-
1022  DO 101 k=1,l1
-
1023  cr2 = cc(1,k,2)+cc(1,k,3)
-
1024  ch(1,1,k) = cc(1,k,1)+cr2
-
1025  ch(1,3,k) = taui*(cc(1,k,3)-cc(1,k,2))
-
1026  ch(ido,2,k) = cc(1,k,1)+taur*cr2
-
1027  101 CONTINUE
-
1028  IF (ido .EQ. 1) RETURN
-
1029  idp2 = ido+2
-
1030  DO 103 k=1,l1
-
1031  DO 102 i=3,ido,2
-
1032  ic = idp2-i
-
1033  dr2 = wa1(i-2)*cc(i-1,k,2)+wa1(i-1)*cc(i,k,2)
-
1034  di2 = wa1(i-2)*cc(i,k,2)-wa1(i-1)*cc(i-1,k,2)
-
1035  dr3 = wa2(i-2)*cc(i-1,k,3)+wa2(i-1)*cc(i,k,3)
-
1036  di3 = wa2(i-2)*cc(i,k,3)-wa2(i-1)*cc(i-1,k,3)
-
1037  cr2 = dr2+dr3
-
1038  ci2 = di2+di3
-
1039  ch(i-1,1,k) = cc(i-1,k,1)+cr2
-
1040  ch(i,1,k) = cc(i,k,1)+ci2
-
1041  tr2 = cc(i-1,k,1)+taur*cr2
-
1042  ti2 = cc(i,k,1)+taur*ci2
-
1043  tr3 = taui*(di2-di3)
-
1044  ti3 = taui*(dr3-dr2)
-
1045  ch(i-1,3,k) = tr2+tr3
-
1046  ch(ic-1,2,k) = tr2-tr3
-
1047  ch(i,3,k) = ti2+ti3
-
1048  ch(ic,2,k) = ti3-ti2
-
1049  102 CONTINUE
-
1050  103 CONTINUE
-
1051  RETURN
-
1052  END
-
1053 
-
1054 C> RADF4
-
1055 C>
-
1056 C> @param IDO
-
1057 C> @param L1
-
1058 C> @param CC
-
1059 C> @param CH
-
1060 C> @param WA1
-
1061 C> @param WA2
-
1062 C> @param WA3
-
1063 C>
-
1064 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
1065  SUBROUTINE radf4 (IDO,L1,CC,CH,WA1,WA2,WA3)
-
1066  dimension cc(ido,l1,4) ,ch(ido,4,l1) ,
-
1067  1 wa1(*) ,wa2(*) ,wa3(*)
-
1068  DATA hsqt2 /.7071067811865475/
-
1069  DO 101 k=1,l1
-
1070  tr1 = cc(1,k,2)+cc(1,k,4)
-
1071  tr2 = cc(1,k,1)+cc(1,k,3)
-
1072  ch(1,1,k) = tr1+tr2
-
1073  ch(ido,4,k) = tr2-tr1
-
1074  ch(ido,2,k) = cc(1,k,1)-cc(1,k,3)
-
1075  ch(1,3,k) = cc(1,k,4)-cc(1,k,2)
-
1076  101 CONTINUE
-
1077  IF (ido.LT.2) THEN
-
1078  GO TO 107
-
1079  ELSEIF (ido.EQ.2) THEN
-
1080  GO TO 105
-
1081  ELSE
-
1082  GO TO 102
-
1083  ENDIF
-
1084  102 idp2 = ido+2
-
1085 !OCL NOVREC
-
1086  DO 104 k=1,l1
-
1087  DO 103 i=3,ido,2
-
1088  ic = idp2-i
-
1089  cr2 = wa1(i-2)*cc(i-1,k,2)+wa1(i-1)*cc(i,k,2)
-
1090  ci2 = wa1(i-2)*cc(i,k,2)-wa1(i-1)*cc(i-1,k,2)
-
1091  cr3 = wa2(i-2)*cc(i-1,k,3)+wa2(i-1)*cc(i,k,3)
-
1092  ci3 = wa2(i-2)*cc(i,k,3)-wa2(i-1)*cc(i-1,k,3)
-
1093  cr4 = wa3(i-2)*cc(i-1,k,4)+wa3(i-1)*cc(i,k,4)
-
1094  ci4 = wa3(i-2)*cc(i,k,4)-wa3(i-1)*cc(i-1,k,4)
-
1095  tr1 = cr2+cr4
-
1096  tr4 = cr4-cr2
-
1097  ti1 = ci2+ci4
-
1098  ti4 = ci2-ci4
-
1099  ti2 = cc(i,k,1)+ci3
-
1100  ti3 = cc(i,k,1)-ci3
-
1101  tr2 = cc(i-1,k,1)+cr3
-
1102  tr3 = cc(i-1,k,1)-cr3
-
1103  ch(i-1,1,k) = tr1+tr2
-
1104  ch(ic-1,4,k) = tr2-tr1
-
1105  ch(i,1,k) = ti1+ti2
-
1106  ch(ic,4,k) = ti1-ti2
-
1107  ch(i-1,3,k) = ti4+tr3
-
1108  ch(ic-1,2,k) = tr3-ti4
-
1109  ch(i,3,k) = tr4+ti3
-
1110  ch(ic,2,k) = tr4-ti3
-
1111  103 CONTINUE
-
1112  104 CONTINUE
-
1113  IF (mod(ido,2) .EQ. 1) RETURN
-
1114  105 CONTINUE
-
1115  DO 106 k=1,l1
-
1116  ti1 = -hsqt2*(cc(ido,k,2)+cc(ido,k,4))
-
1117  tr1 = hsqt2*(cc(ido,k,2)-cc(ido,k,4))
-
1118  ch(ido,1,k) = tr1+cc(ido,k,1)
-
1119  ch(ido,3,k) = cc(ido,k,1)-tr1
-
1120  ch(1,2,k) = ti1-cc(ido,k,3)
-
1121  ch(1,4,k) = ti1+cc(ido,k,3)
-
1122  106 CONTINUE
-
1123  107 RETURN
-
1124  END
-
1125 
-
1126 C> RADF5
-
1127 C>
-
1128 C> @param IDO
-
1129 C> @param L1
-
1130 C> @param CC
-
1131 C> @param CH
-
1132 C> @param WA1
-
1133 C> @param WA2
-
1134 C> @param WA3
-
1135 C> @param WA4
-
1136 C>
-
1137 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
1138  SUBROUTINE radf5 (IDO,L1,CC,CH,WA1,WA2,WA3,WA4)
-
1139  dimension cc(ido,l1,5) ,ch(ido,5,l1) ,
-
1140  1 wa1(*) ,wa2(*) ,wa3(*) ,wa4(*)
-
1141  DATA tr11,ti11,tr12,ti12 /.309016994374947,.951056516295154,
-
1142  1-.809016994374947,.587785252292473/
-
1143  DO 101 k=1,l1
-
1144  cr2 = cc(1,k,5)+cc(1,k,2)
-
1145  ci5 = cc(1,k,5)-cc(1,k,2)
-
1146  cr3 = cc(1,k,4)+cc(1,k,3)
-
1147  ci4 = cc(1,k,4)-cc(1,k,3)
-
1148  ch(1,1,k) = cc(1,k,1)+cr2+cr3
-
1149  ch(ido,2,k) = cc(1,k,1)+tr11*cr2+tr12*cr3
-
1150  ch(1,3,k) = ti11*ci5+ti12*ci4
-
1151  ch(ido,4,k) = cc(1,k,1)+tr12*cr2+tr11*cr3
-
1152  ch(1,5,k) = ti12*ci5-ti11*ci4
-
1153  101 CONTINUE
-
1154  IF (ido .EQ. 1) RETURN
-
1155  idp2 = ido+2
-
1156  DO 103 k=1,l1
-
1157  DO 102 i=3,ido,2
-
1158  ic = idp2-i
-
1159  dr2 = wa1(i-2)*cc(i-1,k,2)+wa1(i-1)*cc(i,k,2)
-
1160  di2 = wa1(i-2)*cc(i,k,2)-wa1(i-1)*cc(i-1,k,2)
-
1161  dr3 = wa2(i-2)*cc(i-1,k,3)+wa2(i-1)*cc(i,k,3)
-
1162  di3 = wa2(i-2)*cc(i,k,3)-wa2(i-1)*cc(i-1,k,3)
-
1163  dr4 = wa3(i-2)*cc(i-1,k,4)+wa3(i-1)*cc(i,k,4)
-
1164  di4 = wa3(i-2)*cc(i,k,4)-wa3(i-1)*cc(i-1,k,4)
-
1165  dr5 = wa4(i-2)*cc(i-1,k,5)+wa4(i-1)*cc(i,k,5)
-
1166  di5 = wa4(i-2)*cc(i,k,5)-wa4(i-1)*cc(i-1,k,5)
-
1167  cr2 = dr2+dr5
-
1168  ci5 = dr5-dr2
-
1169  cr5 = di2-di5
-
1170  ci2 = di2+di5
-
1171  cr3 = dr3+dr4
-
1172  ci4 = dr4-dr3
-
1173  cr4 = di3-di4
-
1174  ci3 = di3+di4
-
1175  ch(i-1,1,k) = cc(i-1,k,1)+cr2+cr3
-
1176  ch(i,1,k) = cc(i,k,1)+ci2+ci3
-
1177  tr2 = cc(i-1,k,1)+tr11*cr2+tr12*cr3
-
1178  ti2 = cc(i,k,1)+tr11*ci2+tr12*ci3
-
1179  tr3 = cc(i-1,k,1)+tr12*cr2+tr11*cr3
-
1180  ti3 = cc(i,k,1)+tr12*ci2+tr11*ci3
-
1181  tr5 = ti11*cr5+ti12*cr4
-
1182  ti5 = ti11*ci5+ti12*ci4
-
1183  tr4 = ti12*cr5-ti11*cr4
-
1184  ti4 = ti12*ci5-ti11*ci4
-
1185  ch(i-1,3,k) = tr2+tr5
-
1186  ch(ic-1,2,k) = tr2-tr5
-
1187  ch(i,3,k) = ti2+ti5
-
1188  ch(ic,2,k) = ti5-ti2
-
1189  ch(i-1,5,k) = tr3+tr4
-
1190  ch(ic-1,4,k) = tr3-tr4
-
1191  ch(i,5,k) = ti3+ti4
-
1192  ch(ic,4,k) = ti4-ti3
-
1193  102 CONTINUE
-
1194  103 CONTINUE
-
1195  RETURN
-
1196  END
-
1197 
-
1198 C> RADFG
-
1199 C>
-
1200 C> @param IDO
-
1201 C> @param IP
-
1202 C> @param L1
-
1203 C> @param IDL1
-
1204 C> @param CC
-
1205 C> @param C1
-
1206 C> @param C2
-
1207 C> @param CH
-
1208 C> @param CH2
-
1209 C> @param WA
-
1210 C>
-
1211 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
-
1212  SUBROUTINE radfg (IDO,IP,L1,IDL1,CC,C1,C2,CH,CH2,WA)
-
1213  dimension ch(ido,l1,ip) ,cc(ido,ip,l1) ,
-
1214  1 c1(ido,l1,ip) ,c2(idl1,ip),
-
1215  2 ch2(idl1,ip) ,wa(*)
-
1216  DATA tpi/6.28318530717959/
-
1217  arg = tpi/float(ip)
-
1218  dcp = cos(arg)
-
1219  dsp = sin(arg)
-
1220  ipph = (ip+1)/2
-
1221  ipp2 = ip+2
-
1222  idp2 = ido+2
-
1223  nbd = (ido-1)/2
-
1224  IF (ido .EQ. 1) GO TO 119
-
1225  DO 101 ik=1,idl1
-
1226  ch2(ik,1) = c2(ik,1)
-
1227  101 CONTINUE
-
1228  DO 103 j=2,ip
-
1229  DO 102 k=1,l1
-
1230  ch(1,k,j) = c1(1,k,j)
-
1231  102 CONTINUE
-
1232  103 CONTINUE
-
1233  IF (nbd .GT. l1) GO TO 107
-
1234  is = -ido
-
1235  DO 106 j=2,ip
-
1236  is = is+ido
-
1237  idij = is
-
1238  DO 105 i=3,ido,2
-
1239  idij = idij+2
-
1240  DO 104 k=1,l1
-
1241  ch(i-1,k,j) = wa(idij-1)*c1(i-1,k,j)+wa(idij)*c1(i,k,j)
-
1242  ch(i,k,j) = wa(idij-1)*c1(i,k,j)-wa(idij)*c1(i-1,k,j)
-
1243  104 CONTINUE
-
1244  105 CONTINUE
-
1245  106 CONTINUE
-
1246  GO TO 111
-
1247  107 is = -ido
-
1248  DO 110 j=2,ip
-
1249  is = is+ido
-
1250  DO 109 k=1,l1
-
1251  idij = is
-
1252  DO 108 i=3,ido,2
-
1253  idij = idij+2
-
1254  ch(i-1,k,j) = wa(idij-1)*c1(i-1,k,j)+wa(idij)*c1(i,k,j)
-
1255  ch(i,k,j) = wa(idij-1)*c1(i,k,j)-wa(idij)*c1(i-1,k,j)
-
1256  108 CONTINUE
-
1257  109 CONTINUE
-
1258  110 CONTINUE
-
1259  111 IF (nbd .LT. l1) GO TO 115
-
1260  DO 114 j=2,ipph
-
1261  jc = ipp2-j
-
1262  DO 113 k=1,l1
-
1263  DO 112 i=3,ido,2
-
1264  c1(i-1,k,j) = ch(i-1,k,j)+ch(i-1,k,jc)
-
1265  c1(i-1,k,jc) = ch(i,k,j)-ch(i,k,jc)
-
1266  c1(i,k,j) = ch(i,k,j)+ch(i,k,jc)
-
1267  c1(i,k,jc) = ch(i-1,k,jc)-ch(i-1,k,j)
-
1268  112 CONTINUE
-
1269  113 CONTINUE
-
1270  114 CONTINUE
-
1271  GO TO 121
-
1272  115 DO 118 j=2,ipph
-
1273  jc = ipp2-j
-
1274  DO 117 i=3,ido,2
-
1275  DO 116 k=1,l1
-
1276  c1(i-1,k,j) = ch(i-1,k,j)+ch(i-1,k,jc)
-
1277  c1(i-1,k,jc) = ch(i,k,j)-ch(i,k,jc)
-
1278  c1(i,k,j) = ch(i,k,j)+ch(i,k,jc)
-
1279  c1(i,k,jc) = ch(i-1,k,jc)-ch(i-1,k,j)
-
1280  116 CONTINUE
-
1281  117 CONTINUE
-
1282  118 CONTINUE
-
1283  GO TO 121
-
1284  119 DO 120 ik=1,idl1
-
1285  c2(ik,1) = ch2(ik,1)
-
1286  120 CONTINUE
-
1287  121 DO 123 j=2,ipph
-
1288  jc = ipp2-j
-
1289  DO 122 k=1,l1
-
1290  c1(1,k,j) = ch(1,k,j)+ch(1,k,jc)
-
1291  c1(1,k,jc) = ch(1,k,jc)-ch(1,k,j)
-
1292  122 CONTINUE
-
1293  123 CONTINUE
-
1294 C
-
1295  ar1 = 1.
-
1296  ai1 = 0.
-
1297  DO 127 l=2,ipph
-
1298  lc = ipp2-l
-
1299  ar1h = dcp*ar1-dsp*ai1
-
1300  ai1 = dcp*ai1+dsp*ar1
-
1301  ar1 = ar1h
-
1302  DO 124 ik=1,idl1
-
1303  ch2(ik,l) = c2(ik,1)+ar1*c2(ik,2)
-
1304  ch2(ik,lc) = ai1*c2(ik,ip)
-
1305  124 CONTINUE
-
1306  dc2 = ar1
-
1307  ds2 = ai1
-
1308  ar2 = ar1
-
1309  ai2 = ai1
-
1310  DO 126 j=3,ipph
-
1311  jc = ipp2-j
-
1312  ar2h = dc2*ar2-ds2*ai2
-
1313  ai2 = dc2*ai2+ds2*ar2
-
1314  ar2 = ar2h
-
1315  DO 125 ik=1,idl1
-
1316  ch2(ik,l) = ch2(ik,l)+ar2*c2(ik,j)
-
1317  ch2(ik,lc) = ch2(ik,lc)+ai2*c2(ik,jc)
-
1318  125 CONTINUE
-
1319  126 CONTINUE
-
1320  127 CONTINUE
-
1321  DO 129 j=2,ipph
-
1322  DO 128 ik=1,idl1
-
1323  ch2(ik,1) = ch2(ik,1)+c2(ik,j)
-
1324  128 CONTINUE
-
1325  129 CONTINUE
-
1326 C
-
1327  IF (ido .LT. l1) GO TO 132
-
1328  DO 131 k=1,l1
-
1329  DO 130 i=1,ido
-
1330  cc(i,1,k) = ch(i,k,1)
-
1331  130 CONTINUE
-
1332  131 CONTINUE
-
1333  GO TO 135
-
1334  132 DO 134 i=1,ido
-
1335  DO 133 k=1,l1
-
1336  cc(i,1,k) = ch(i,k,1)
-
1337  133 CONTINUE
-
1338  134 CONTINUE
-
1339  135 DO 137 j=2,ipph
-
1340  jc = ipp2-j
-
1341  j2 = j+j
-
1342  DO 136 k=1,l1
-
1343  cc(ido,j2-2,k) = ch(1,k,j)
-
1344  cc(1,j2-1,k) = ch(1,k,jc)
-
1345  136 CONTINUE
-
1346  137 CONTINUE
-
1347  IF (ido .EQ. 1) RETURN
-
1348  IF (nbd .LT. l1) GO TO 141
-
1349  DO 140 j=2,ipph
-
1350  jc = ipp2-j
-
1351  j2 = j+j
-
1352  DO 139 k=1,l1
-
1353  DO 138 i=3,ido,2
-
1354  ic = idp2-i
-
1355  cc(i-1,j2-1,k) = ch(i-1,k,j)+ch(i-1,k,jc)
-
1356  cc(ic-1,j2-2,k) = ch(i-1,k,j)-ch(i-1,k,jc)
-
1357  cc(i,j2-1,k) = ch(i,k,j)+ch(i,k,jc)
-
1358  cc(ic,j2-2,k) = ch(i,k,jc)-ch(i,k,j)
-
1359  138 CONTINUE
-
1360  139 CONTINUE
-
1361  140 CONTINUE
-
1362  RETURN
-
1363  141 DO 144 j=2,ipph
-
1364  jc = ipp2-j
-
1365  j2 = j+j
-
1366  DO 143 i=3,ido,2
-
1367  ic = idp2-i
-
1368  DO 142 k=1,l1
-
1369  cc(i-1,j2-1,k) = ch(i-1,k,j)+ch(i-1,k,jc)
-
1370  cc(ic-1,j2-2,k) = ch(i-1,k,j)-ch(i-1,k,jc)
-
1371  cc(i,j2-1,k) = ch(i,k,j)+ch(i,k,jc)
-
1372  cc(ic,j2-2,k) = ch(i,k,jc)-ch(i,k,j)
-
1373  142 CONTINUE
-
1374  143 CONTINUE
-
1375  144 CONTINUE
-
1376  RETURN
-
1377  END
-
subroutine radb5(IDO, L1, CC, CH, WA1, WA2, WA3, WA4)
RADB5.
Definition: fftpack.F:719
-
subroutine scfft(isign, n, scale, x, y, table, work, isys)
scfft
Definition: fftpack.F:258
-
subroutine radb4(IDO, L1, CC, CH, WA1, WA2, WA3)
RADB4.
Definition: fftpack.F:642
-
subroutine rffti(N, WSAVE)
RFFTI.
Definition: fftpack.F:318
-
subroutine radf3(IDO, L1, CC, CH, WA1, WA2)
RADF3.
Definition: fftpack.F:1019
-
subroutine drcft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
drcft
Definition: fftpack.F:164
-
subroutine radb3(IDO, L1, CC, CH, WA1, WA2)
RADB3
Definition: fftpack.F:592
-
subroutine radf5(IDO, L1, CC, CH, WA1, WA2, WA3, WA4)
RADF5.
Definition: fftpack.F:1139
-
subroutine radf2(IDO, L1, CC, CH, WA1)
RADBG.
Definition: fftpack.F:975
-
subroutine dcrft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
dcrft
Definition: fftpack.F:34
-
subroutine rfftb(N, R, WSAVE)
RFFTB.
Definition: fftpack.F:305
-
subroutine scrft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
scrft
Definition: fftpack.F:82
-
subroutine rfftf1(N, C, CH, WA, IFAC)
RFFTF1.
Definition: fftpack.F:403
-
subroutine srcft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
srcft
Definition: fftpack.F:215
-
subroutine csfft(isign, n, scale, x, y, table, work, isys)
csfft
Definition: fftpack.F:121
-
subroutine radfg(IDO, IP, L1, IDL1, CC, C1, C2, CH, CH2, WA)
RADFG.
Definition: fftpack.F:1213
-
subroutine rffti1(N, WA, IFAC)
RFFTI1.
Definition: fftpack.F:470
-
subroutine radb2(IDO, L1, CC, CH, WA1)
RADB2.
Definition: fftpack.F:547
-
subroutine radf4(IDO, L1, CC, CH, WA1, WA2, WA3)
RADF4.
Definition: fftpack.F:1066
-
subroutine radbg(IDO, IP, L1, IDL1, CC, C1, C2, CH, CH2, WA)
RADBG.
Definition: fftpack.F:797
-
subroutine rfftb1(N, C, CH, WA, IFAC)
RFFTB1.
Definition: fftpack.F:334
-
subroutine rfftf(N, R, WSAVE)
RFFTF.
Definition: fftpack.F:291
+Go to the documentation of this file.
1C> @file
+
2C> @brief A concatination of the (FFTPACK)[https://netlib.org/fftpack/] library code.
+
3C>
+
4C> FFTPACK is a package of Fortran subprograms for the fast Fourier
+
5C> transform of periodic and other symmetric sequences. It includes
+
6C> complex, real, sine, cosine, and quarter-wave transforms.
+
7C>
+
8C>Reference:
+
9C>- P.N. Swarztrauber, Vectorizing the FFTs, in Parallel Computations
+
10C>(G. Rodrigue, ed.), Academic Press, 1982, pp. 51--83.
+
11C>
+
12C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
13
+
14C> dcrft
+
15C>
+
16C> @param init
+
17C> @param x
+
18C> @param ldx
+
19C> @param y
+
20C> @param ldy
+
21C> @param n
+
22C> @param m
+
23C> @param isign
+
24C> @param scale
+
25C> @param table
+
26C> @param n1
+
27C> @param wrk
+
28C> @param n2
+
29C> @param z
+
30C> @param nz
+
31C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
32 SUBROUTINE dcrft(init,x,ldx,y,ldy,n,m,isign,scale,
+
33 & table,n1,wrk,n2,z,nz)
+
34
+
35 implicit none
+
36 integer init,ldx,ldy,n,m,isign,n1,n2,i,j
+
37 real x(2*ldx,*),y(ldy,*),scale,table(44002),wrk(*)
+
38 real, optional :: z
+
39 integer, optional :: nz
+
40
+
41 IF (init.ne.0) THEN
+
42 CALL rffti(n,table)
+
43 ELSE
+
44!OCL NOVREC
+
45 DO j=1,m
+
46 y(1,j)=x(1,j)
+
47 DO i=2,n
+
48 y(i,j)=x(i+1,j)
+
49 ENDDO
+
50 CALL rfftb(n,y(1,j),table)
+
51 DO i=1,n
+
52 y(i,j)=scale*y(i,j)
+
53 ENDDO
+
54 ENDDO
+
55 ENDIF
+
56
+
57 RETURN
+
+
58 END
+
59
+
60C> scrft
+
61C>
+
62C> @param init
+
63C> @param x
+
64C> @param ldx
+
65C> @param y
+
66C> @param ldy
+
67C> @param n
+
68C> @param m
+
69C> @param isign
+
70C> @param scale
+
71C> @param table
+
72C> @param n1
+
73C> @param wrk
+
74C> @param n2
+
75C> @param z
+
76C> @param nz
+
77C>
+
78C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
79
+
+
80 SUBROUTINE scrft(init,x,ldx,y,ldy,n,m,isign,scale,
+
81 & table,n1,wrk,n2,z,nz)
+
82
+
83 implicit none
+
84 integer init,ldx,ldy,n,m,isign,n1,n2,i,j
+
85 real x(2*ldx,*),y(ldy,*),scale,table(44002),wrk(*)
+
86 real, optional :: z
+
87 integer, optional :: nz
+
88
+
89 IF (init.ne.0) THEN
+
90 CALL rffti(n,table)
+
91 ELSE
+
92!OCL NOVREC
+
93 DO j=1,m
+
94 y(1,j)=x(1,j)
+
95 DO i=2,n
+
96 y(i,j)=x(i+1,j)
+
97 ENDDO
+
98 CALL rfftb(n,y(1,j),table)
+
99 DO i=1,n
+
100 y(i,j)=scale*y(i,j)
+
101 ENDDO
+
102 ENDDO
+
103 ENDIF
+
104
+
105 RETURN
+
+
106 END
+
107
+
108C> csfft
+
109C>
+
110C> @param isign
+
111C> @param n
+
112C> @param scale
+
113C> @param x
+
114C> @param y
+
115C> @param table
+
116C> @param work
+
117C> @param isys
+
118C>
+
119C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
120 SUBROUTINE csfft(isign,n,scale,x,y,table,work,isys)
+
121
+
122 implicit none
+
123 integer isign,n,isys,i
+
124 real scale,x(*),y(*),table(*),work(*)
+
125
+
126 IF (isign.eq.0) THEN
+
127 CALL rffti(n,table)
+
128 ENDIF
+
129 IF (isign.eq.1) THEN
+
130 y(1)=x(1)
+
131 DO i=2,n
+
132 y(i)=x(i+1)
+
133 ENDDO
+
134 CALL rfftb(n,y,table)
+
135 DO i=1,n
+
136 y(i)=scale*y(i)
+
137 ENDDO
+
138 ENDIF
+
139
+
140 RETURN
+
+
141 END
+
142
+
143C> drcft
+
144C>
+
145C> @param init
+
146C> @param x
+
147C> @param ldx
+
148C> @param y
+
149C> @param ldy
+
150C> @param n
+
151C> @param m
+
152C> @param isign
+
153C> @param scale
+
154C> @param table
+
155C> @param n1
+
156C> @param wrk
+
157C> @param n2
+
158C> @param z
+
159C> @param nz
+
160C>
+
161C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
162 SUBROUTINE drcft(init,x,ldx,y,ldy,n,m,isign,scale,
+
163 & table,n1,wrk,n2,z,nz)
+
164
+
165 implicit none
+
166 integer init,ldx,ldy,n,m,isign,n1,n2,i,j
+
167 real x(ldx,*),y(2*ldy,*),scale,table(44002),wrk(*)
+
168 real, optional :: z
+
169 integer, optional :: nz
+
170
+
171 IF (init.ne.0) THEN
+
172 CALL rffti(n,table)
+
173 ELSE
+
174 DO j=1,m
+
175 DO i=1,n
+
176 y(i,j)=x(i,j)
+
177 ENDDO
+
178 CALL rfftf(n,y(1,j),table)
+
179 DO i=1,n
+
180 y(i,j)=scale*y(i,j)
+
181 ENDDO
+
182 DO i=n,2,-1
+
183 y(i+1,j)=y(i,j)
+
184 ENDDO
+
185 y(2,j)=0.
+
186C 01/17/2013 vvvvvvvvvvvvv E.Mirvis added ver 2.0.1 by S.Moorthi request. No +|- demo.
+
187 y(n+2,j) = 0.
+
188 ENDDO
+
189 ENDIF
+
190
+
191 RETURN
+
+
192 END
+
193
+
194C> srcft
+
195C>
+
196C> @param init
+
197C> @param x
+
198C> @param ldx
+
199C> @param y
+
200C> @param ldy
+
201C> @param n
+
202C> @param m
+
203C> @param isign
+
204C> @param scale
+
205C> @param table
+
206C> @param n1
+
207C> @param wrk
+
208C> @param n2
+
209C> @param z
+
210C> @param nz
+
211C>
+
212C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
213 SUBROUTINE srcft(init,x,ldx,y,ldy,n,m,isign,scale,
+
214 & table,n1,wrk,n2,z,nz)
+
215
+
216 implicit none
+
217 integer init,ldx,ldy,n,m,isign,n1,n2,i,j
+
218 real x(ldx,*),y(2*ldy,*),scale,table(44002),wrk(*)
+
219 real, optional :: z
+
220 integer, optional :: nz
+
221
+
222 IF (init.ne.0) THEN
+
223 CALL rffti(n,table)
+
224 ELSE
+
225 DO j=1,m
+
226 DO i=1,n
+
227 y(i,j)=x(i,j)
+
228 ENDDO
+
229 CALL rfftf(n,y(1,j),table)
+
230 DO i=1,n
+
231 y(i,j)=scale*y(i,j)
+
232 ENDDO
+
233 DO i=n,2,-1
+
234 y(i+1,j)=y(i,j)
+
235 ENDDO
+
236 y(2,j)=0.
+
237 y(n+2,j) = 0.
+
238C 01/17/2013 ^^^^^^^^^^E.Mirvis added ver 2.0.1 by S.Moorthi request. No +|- demo.
+
239 ENDDO
+
240 ENDIF
+
241
+
242 RETURN
+
+
243 END
+
244
+
245C> scfft
+
246C>
+
247C> @param isign
+
248C> @param n
+
249C> @param scale
+
250C> @param x
+
251C> @param y
+
252C> @param table
+
253C> @param work
+
254C> @param isys
+
255C>
+
256C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
257 SUBROUTINE scfft(isign,n,scale,x,y,table,work,isys)
+
258
+
259 implicit none
+
260 integer isign,n,isys,i
+
261 real scale,x(*),y(*),table(*),work(*)
+
262
+
263 IF (isign.eq.0) THEN
+
264 CALL rffti(n,table)
+
265 ENDIF
+
266 IF (isign.eq.-1) THEN
+
267 DO i=1,n
+
268 y(i)=x(i)
+
269 ENDDO
+
270 CALL rfftf(n,y,table)
+
271 DO i=1,n
+
272 y(i)=scale*y(i)
+
273 ENDDO
+
274 DO i=n,2,-1
+
275 y(i+1)=y(i)
+
276 ENDDO
+
277 y(2)=0.
+
278 ENDIF
+
279
+
280 RETURN
+
+
281 END
+
282
+
283C> RFFTF
+
284C>
+
285C> @param N
+
286C> @param R
+
287C> @param WSAVE
+
288C>
+
289C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
290 SUBROUTINE rfftf (N,R,WSAVE)
+
291 dimension r(*) ,wsave(*)
+
292 IF (n .EQ. 1) RETURN
+
293 CALL rfftf1 (n,r,wsave,wsave(n+1),wsave(2*n+1))
+
294 RETURN
+
+
295 END
+
296
+
297C> RFFTB
+
298C>
+
299C> @param N
+
300C> @param R
+
301C> @param WSAVE
+
302C>
+
303C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
304 SUBROUTINE rfftb (N,R,WSAVE)
+
305 dimension r(*) ,wsave(*)
+
306 IF (n .EQ. 1) RETURN
+
307 CALL rfftb1 (n,r,wsave,wsave(n+1),wsave(2*n+1))
+
308 RETURN
+
+
309 END
+
310
+
311C> RFFTI
+
312C>
+
313C> @param N
+
314C> @param WSAVE
+
315C>
+
316C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
317 SUBROUTINE rffti (N,WSAVE)
+
318 dimension wsave(*)
+
319 IF (n .EQ. 1) RETURN
+
320 CALL rffti1 (n,wsave(n+1),wsave(2*n+1))
+
321 RETURN
+
+
322 END
+
323
+
324C> RFFTB1
+
325C>
+
326C> @param N
+
327C> @param C
+
328C> @param CH
+
329C> @param WA
+
330C> @param IFAC
+
331C>
+
332C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
333 SUBROUTINE rfftb1 (N,C,CH,WA,IFAC)
+
334 REAL CH(*) ,C(*) ,WA(*) ,IFAC(*)
+
335 NF = int(ifac(2))
+
336 na = 0
+
337 l1 = 1
+
338 iw = 1
+
339 DO 116 k1=1,nf
+
340 ip = int(ifac(k1+2))
+
341 l2 = ip*l1
+
342 ido = n/l2
+
343 idl1 = ido*l1
+
344 IF (ip .NE. 4) GO TO 103
+
345 ix2 = iw+ido
+
346 ix3 = ix2+ido
+
347 IF (na .NE. 0) GO TO 101
+
348 CALL radb4 (ido,l1,c,ch,wa(iw),wa(ix2),wa(ix3))
+
349 GO TO 102
+
350 101 CALL radb4 (ido,l1,ch,c,wa(iw),wa(ix2),wa(ix3))
+
351 102 na = 1-na
+
352 GO TO 115
+
353 103 IF (ip .NE. 2) GO TO 106
+
354 IF (na .NE. 0) GO TO 104
+
355 CALL radb2 (ido,l1,c,ch,wa(iw))
+
356 GO TO 105
+
357 104 CALL radb2 (ido,l1,ch,c,wa(iw))
+
358 105 na = 1-na
+
359 GO TO 115
+
360 106 IF (ip .NE. 3) GO TO 109
+
361 ix2 = iw+ido
+
362 IF (na .NE. 0) GO TO 107
+
363 CALL radb3 (ido,l1,c,ch,wa(iw),wa(ix2))
+
364 GO TO 108
+
365 107 CALL radb3 (ido,l1,ch,c,wa(iw),wa(ix2))
+
366 108 na = 1-na
+
367 GO TO 115
+
368 109 IF (ip .NE. 5) GO TO 112
+
369 ix2 = iw+ido
+
370 ix3 = ix2+ido
+
371 ix4 = ix3+ido
+
372 IF (na .NE. 0) GO TO 110
+
373 CALL radb5 (ido,l1,c,ch,wa(iw),wa(ix2),wa(ix3),wa(ix4))
+
374 GO TO 111
+
375 110 CALL radb5 (ido,l1,ch,c,wa(iw),wa(ix2),wa(ix3),wa(ix4))
+
376 111 na = 1-na
+
377 GO TO 115
+
378 112 IF (na .NE. 0) GO TO 113
+
379 CALL radbg (ido,ip,l1,idl1,c,c,c,ch,ch,wa(iw))
+
380 GO TO 114
+
381 113 CALL radbg (ido,ip,l1,idl1,ch,ch,ch,c,c,wa(iw))
+
382 114 IF (ido .EQ. 1) na = 1-na
+
383 115 l1 = l2
+
384 iw = iw+(ip-1)*ido
+
385 116 CONTINUE
+
386 IF (na .EQ. 0) RETURN
+
387 DO 117 i=1,n
+
388 c(i) = ch(i)
+
389 117 CONTINUE
+
390 RETURN
+
+
391 END
+
392
+
393C> RFFTF1
+
394C>
+
395C> @param N
+
396C> @param C
+
397C> @param CH
+
398C> @param WA
+
399C> @param IFAC
+
400C>
+
401C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
402 SUBROUTINE rfftf1 (N,C,CH,WA,IFAC)
+
403 REAL CH(*) ,C(*) ,WA(*) ,IFAC(*)
+
404 NF = int(ifac(2))
+
405 na = 1
+
406 l2 = n
+
407 iw = n
+
408 DO 111 k1=1,nf
+
409 kh = nf-k1
+
410 ip = int(ifac(kh+3))
+
411 l1 = l2/ip
+
412 ido = n/l2
+
413 idl1 = ido*l1
+
414 iw = iw-(ip-1)*ido
+
415 na = 1-na
+
416 IF (ip .NE. 4) GO TO 102
+
417 ix2 = iw+ido
+
418 ix3 = ix2+ido
+
419 IF (na .NE. 0) GO TO 101
+
420 CALL radf4 (ido,l1,c,ch,wa(iw),wa(ix2),wa(ix3))
+
421 GO TO 110
+
422 101 CALL radf4 (ido,l1,ch,c,wa(iw),wa(ix2),wa(ix3))
+
423 GO TO 110
+
424 102 IF (ip .NE. 2) GO TO 104
+
425 IF (na .NE. 0) GO TO 103
+
426 CALL radf2 (ido,l1,c,ch,wa(iw))
+
427 GO TO 110
+
428 103 CALL radf2 (ido,l1,ch,c,wa(iw))
+
429 GO TO 110
+
430 104 IF (ip .NE. 3) GO TO 106
+
431 ix2 = iw+ido
+
432 IF (na .NE. 0) GO TO 105
+
433 CALL radf3 (ido,l1,c,ch,wa(iw),wa(ix2))
+
434 GO TO 110
+
435 105 CALL radf3 (ido,l1,ch,c,wa(iw),wa(ix2))
+
436 GO TO 110
+
437 106 IF (ip .NE. 5) GO TO 108
+
438 ix2 = iw+ido
+
439 ix3 = ix2+ido
+
440 ix4 = ix3+ido
+
441 IF (na .NE. 0) GO TO 107
+
442 CALL radf5 (ido,l1,c,ch,wa(iw),wa(ix2),wa(ix3),wa(ix4))
+
443 GO TO 110
+
444 107 CALL radf5 (ido,l1,ch,c,wa(iw),wa(ix2),wa(ix3),wa(ix4))
+
445 GO TO 110
+
446 108 IF (ido .EQ. 1) na = 1-na
+
447 IF (na .NE. 0) GO TO 109
+
448 CALL radfg (ido,ip,l1,idl1,c,c,c,ch,ch,wa(iw))
+
449 na = 1
+
450 GO TO 110
+
451 109 CALL radfg (ido,ip,l1,idl1,ch,ch,ch,c,c,wa(iw))
+
452 na = 0
+
453 110 l2 = l1
+
454 111 CONTINUE
+
455 IF (na .EQ. 1) RETURN
+
456 DO 112 i=1,n
+
457 c(i) = ch(i)
+
458 112 CONTINUE
+
459 RETURN
+
+
460 END
+
461
+
462C> RFFTI1
+
463C>
+
464C> @param N
+
465C> @param WA
+
466C> @param IFAC
+
467C>
+
468C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
469 SUBROUTINE rffti1 (N,WA,IFAC)
+
470 REAL WA(*) ,IFAC(*) ,NTRYH(4)
+
471 DATA NTRYH(1),NTRYH(2),NTRYH(3),NTRYH(4)/4,2,3,5/
+
472 NL = n
+
473 nf = 0
+
474 j = 0
+
475 101 j = j+1
+
476 IF ((j-4).LE.0) THEN
+
477 GO TO 102
+
478 ELSE
+
479 GO TO 103
+
480 ENDIF
+
481 102 ntry = int(ntryh(j))
+
482 GO TO 104
+
483 103 ntry = ntry+2
+
484 104 nq = nl/ntry
+
485 nr = nl-ntry*nq
+
486 IF (nr.EQ.0) THEN
+
487 GO TO 105
+
488 ELSE
+
489 GO TO 101
+
490 ENDIF
+
491 105 nf = nf+1
+
492 ifac(nf+2) = ntry
+
493 nl = nq
+
494 IF (ntry .NE. 2) GO TO 107
+
495 IF (nf .EQ. 1) GO TO 107
+
496 DO 106 i=2,nf
+
497 ib = nf-i+2
+
498 ifac(ib+2) = ifac(ib+1)
+
499 106 CONTINUE
+
500 ifac(3) = 2
+
501 107 IF (nl .NE. 1) GO TO 104
+
502 ifac(1) = n
+
503 ifac(2) = nf
+
504 tpi = 6.28318530717959
+
505 argh = tpi/float(n)
+
506 is = 0
+
507 nfm1 = nf-1
+
508 l1 = 1
+
509 IF (nfm1 .EQ. 0) RETURN
+
510!OCL NOVREC
+
511 DO 110 k1=1,nfm1
+
512 ip = int(ifac(k1+2))
+
513 ld = 0
+
514 l2 = l1*ip
+
515 ido = n/l2
+
516 ipm = ip-1
+
517 DO 109 j=1,ipm
+
518 ld = ld+l1
+
519 i = is
+
520 argld = float(ld)*argh
+
521 fi = 0
+
522!OCL SCALAR
+
523 DO 108 ii=3,ido,2
+
524 i = i+2
+
525 fi = fi+1
+
526 arg = fi*argld
+
527 wa(i-1) = cos(arg)
+
528 wa(i) = sin(arg)
+
529 108 CONTINUE
+
530 is = is+ido
+
531 109 CONTINUE
+
532 l1 = l2
+
533 110 CONTINUE
+
534 RETURN
+
+
535 END
+
536
+
537C> RADB2
+
538C>
+
539C> @param IDO
+
540C> @param L1
+
541C> @param CC
+
542C> @param CH
+
543C> @param WA1
+
544C>
+
545C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
546 SUBROUTINE radb2 (IDO,L1,CC,CH,WA1)
+
547 dimension cc(ido,2,l1) ,ch(ido,l1,2) ,
+
548 1 wa1(*)
+
549 DO 101 k=1,l1
+
550 ch(1,k,1) = cc(1,1,k)+cc(ido,2,k)
+
551 ch(1,k,2) = cc(1,1,k)-cc(ido,2,k)
+
552 101 CONTINUE
+
553 IF (ido.LT.2) THEN
+
554 GO TO 107
+
555 ELSEIF (ido.EQ.2) THEN
+
556 GO TO 105
+
557 ELSE
+
558 GO TO 102
+
559 ENDIF
+
560 102 idp2 = ido+2
+
561!OCL NOVREC
+
562 DO 104 k=1,l1
+
563 DO 103 i=3,ido,2
+
564 ic = idp2-i
+
565 ch(i-1,k,1) = cc(i-1,1,k)+cc(ic-1,2,k)
+
566 tr2 = cc(i-1,1,k)-cc(ic-1,2,k)
+
567 ch(i,k,1) = cc(i,1,k)-cc(ic,2,k)
+
568 ti2 = cc(i,1,k)+cc(ic,2,k)
+
569 ch(i-1,k,2) = wa1(i-2)*tr2-wa1(i-1)*ti2
+
570 ch(i,k,2) = wa1(i-2)*ti2+wa1(i-1)*tr2
+
571 103 CONTINUE
+
572 104 CONTINUE
+
573 IF (mod(ido,2) .EQ. 1) RETURN
+
574 105 DO 106 k=1,l1
+
575 ch(ido,k,1) = cc(ido,1,k)+cc(ido,1,k)
+
576 ch(ido,k,2) = -(cc(1,2,k)+cc(1,2,k))
+
577 106 CONTINUE
+
578 107 RETURN
+
+
579 END
+
580
+
581C> RADB3
+
582C>
+
583C> @param IDO
+
584C> @param L1
+
585C> @param CC
+
586C> @param CH
+
587C> @param WA1
+
588C> @param WA2
+
589C>
+
590C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
591 SUBROUTINE radb3 (IDO,L1,CC,CH,WA1,WA2)
+
592 dimension cc(ido,3,l1) ,ch(ido,l1,3) ,
+
593 1 wa1(*) ,wa2(*)
+
594 DATA taur,taui /-.5,.866025403784439/
+
595 DO 101 k=1,l1
+
596 tr2 = cc(ido,2,k)+cc(ido,2,k)
+
597 cr2 = cc(1,1,k)+taur*tr2
+
598 ch(1,k,1) = cc(1,1,k)+tr2
+
599 ci3 = taui*(cc(1,3,k)+cc(1,3,k))
+
600 ch(1,k,2) = cr2-ci3
+
601 ch(1,k,3) = cr2+ci3
+
602 101 CONTINUE
+
603 IF (ido .EQ. 1) RETURN
+
604 idp2 = ido+2
+
605!OCL NOVREC
+
606 DO 103 k=1,l1
+
607 DO 102 i=3,ido,2
+
608 ic = idp2-i
+
609 tr2 = cc(i-1,3,k)+cc(ic-1,2,k)
+
610 cr2 = cc(i-1,1,k)+taur*tr2
+
611 ch(i-1,k,1) = cc(i-1,1,k)+tr2
+
612 ti2 = cc(i,3,k)-cc(ic,2,k)
+
613 ci2 = cc(i,1,k)+taur*ti2
+
614 ch(i,k,1) = cc(i,1,k)+ti2
+
615 cr3 = taui*(cc(i-1,3,k)-cc(ic-1,2,k))
+
616 ci3 = taui*(cc(i,3,k)+cc(ic,2,k))
+
617 dr2 = cr2-ci3
+
618 dr3 = cr2+ci3
+
619 di2 = ci2+cr3
+
620 di3 = ci2-cr3
+
621 ch(i-1,k,2) = wa1(i-2)*dr2-wa1(i-1)*di2
+
622 ch(i,k,2) = wa1(i-2)*di2+wa1(i-1)*dr2
+
623 ch(i-1,k,3) = wa2(i-2)*dr3-wa2(i-1)*di3
+
624 ch(i,k,3) = wa2(i-2)*di3+wa2(i-1)*dr3
+
625 102 CONTINUE
+
626 103 CONTINUE
+
627 RETURN
+
+
628 END
+
629
+
630C> RADB4
+
631C>
+
632C> @param IDO
+
633C> @param L1
+
634C> @param CC
+
635C> @param CH
+
636C> @param WA1
+
637C> @param WA2
+
638C> @param WA3
+
639C>
+
640C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
641 SUBROUTINE radb4 (IDO,L1,CC,CH,WA1,WA2,WA3)
+
642 dimension cc(ido,4,l1) ,ch(ido,l1,4) ,
+
643 1 wa1(*) ,wa2(*) ,wa3(*)
+
644 DATA sqrt2 /1.414213562373095/
+
645 DO 101 k=1,l1
+
646 tr1 = cc(1,1,k)-cc(ido,4,k)
+
647 tr2 = cc(1,1,k)+cc(ido,4,k)
+
648 tr3 = cc(ido,2,k)+cc(ido,2,k)
+
649 tr4 = cc(1,3,k)+cc(1,3,k)
+
650 ch(1,k,1) = tr2+tr3
+
651 ch(1,k,2) = tr1-tr4
+
652 ch(1,k,3) = tr2-tr3
+
653 ch(1,k,4) = tr1+tr4
+
654 101 CONTINUE
+
655 IF (ido.LT.2) THEN
+
656 GO TO 107
+
657 ELSEIF (ido.EQ.2) THEN
+
658 GO TO 105
+
659 ELSE
+
660 GO TO 102
+
661 ENDIF
+
662 102 idp2 = ido+2
+
663!OCL NOVREC
+
664 DO 104 k=1,l1
+
665 DO 103 i=3,ido,2
+
666 ic = idp2-i
+
667 ti1 = cc(i,1,k)+cc(ic,4,k)
+
668 ti2 = cc(i,1,k)-cc(ic,4,k)
+
669 ti3 = cc(i,3,k)-cc(ic,2,k)
+
670 tr4 = cc(i,3,k)+cc(ic,2,k)
+
671 tr1 = cc(i-1,1,k)-cc(ic-1,4,k)
+
672 tr2 = cc(i-1,1,k)+cc(ic-1,4,k)
+
673 ti4 = cc(i-1,3,k)-cc(ic-1,2,k)
+
674 tr3 = cc(i-1,3,k)+cc(ic-1,2,k)
+
675 ch(i-1,k,1) = tr2+tr3
+
676 cr3 = tr2-tr3
+
677 ch(i,k,1) = ti2+ti3
+
678 ci3 = ti2-ti3
+
679 cr2 = tr1-tr4
+
680 cr4 = tr1+tr4
+
681 ci2 = ti1+ti4
+
682 ci4 = ti1-ti4
+
683 ch(i-1,k,2) = wa1(i-2)*cr2-wa1(i-1)*ci2
+
684 ch(i,k,2) = wa1(i-2)*ci2+wa1(i-1)*cr2
+
685 ch(i-1,k,3) = wa2(i-2)*cr3-wa2(i-1)*ci3
+
686 ch(i,k,3) = wa2(i-2)*ci3+wa2(i-1)*cr3
+
687 ch(i-1,k,4) = wa3(i-2)*cr4-wa3(i-1)*ci4
+
688 ch(i,k,4) = wa3(i-2)*ci4+wa3(i-1)*cr4
+
689 103 CONTINUE
+
690 104 CONTINUE
+
691 IF (mod(ido,2) .EQ. 1) RETURN
+
692 105 CONTINUE
+
693 DO 106 k=1,l1
+
694 ti1 = cc(1,2,k)+cc(1,4,k)
+
695 ti2 = cc(1,4,k)-cc(1,2,k)
+
696 tr1 = cc(ido,1,k)-cc(ido,3,k)
+
697 tr2 = cc(ido,1,k)+cc(ido,3,k)
+
698 ch(ido,k,1) = tr2+tr2
+
699 ch(ido,k,2) = sqrt2*(tr1-ti1)
+
700 ch(ido,k,3) = ti2+ti2
+
701 ch(ido,k,4) = -sqrt2*(tr1+ti1)
+
702 106 CONTINUE
+
703 107 RETURN
+
+
704 END
+
705
+
706C> RADB5
+
707C>
+
708C> @param IDO
+
709C> @param L1
+
710C> @param CC
+
711C> @param CH
+
712C> @param WA1
+
713C> @param WA2
+
714C> @param WA3
+
715C> @param WA4
+
716C>
+
717C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
718 SUBROUTINE radb5 (IDO,L1,CC,CH,WA1,WA2,WA3,WA4)
+
719 dimension cc(ido,5,l1) ,ch(ido,l1,5) ,
+
720 1 wa1(*) ,wa2(*) ,wa3(*) ,wa4(*)
+
721 DATA tr11,ti11,tr12,ti12 /.309016994374947,.951056516295154,
+
722 1-.809016994374947,.587785252292473/
+
723 DO 101 k=1,l1
+
724 ti5 = cc(1,3,k)+cc(1,3,k)
+
725 ti4 = cc(1,5,k)+cc(1,5,k)
+
726 tr2 = cc(ido,2,k)+cc(ido,2,k)
+
727 tr3 = cc(ido,4,k)+cc(ido,4,k)
+
728 ch(1,k,1) = cc(1,1,k)+tr2+tr3
+
729 cr2 = cc(1,1,k)+tr11*tr2+tr12*tr3
+
730 cr3 = cc(1,1,k)+tr12*tr2+tr11*tr3
+
731 ci5 = ti11*ti5+ti12*ti4
+
732 ci4 = ti12*ti5-ti11*ti4
+
733 ch(1,k,2) = cr2-ci5
+
734 ch(1,k,3) = cr3-ci4
+
735 ch(1,k,4) = cr3+ci4
+
736 ch(1,k,5) = cr2+ci5
+
737 101 CONTINUE
+
738 IF (ido .EQ. 1) RETURN
+
739 idp2 = ido+2
+
740 DO 103 k=1,l1
+
741 DO 102 i=3,ido,2
+
742 ic = idp2-i
+
743 ti5 = cc(i,3,k)+cc(ic,2,k)
+
744 ti2 = cc(i,3,k)-cc(ic,2,k)
+
745 ti4 = cc(i,5,k)+cc(ic,4,k)
+
746 ti3 = cc(i,5,k)-cc(ic,4,k)
+
747 tr5 = cc(i-1,3,k)-cc(ic-1,2,k)
+
748 tr2 = cc(i-1,3,k)+cc(ic-1,2,k)
+
749 tr4 = cc(i-1,5,k)-cc(ic-1,4,k)
+
750 tr3 = cc(i-1,5,k)+cc(ic-1,4,k)
+
751 ch(i-1,k,1) = cc(i-1,1,k)+tr2+tr3
+
752 ch(i,k,1) = cc(i,1,k)+ti2+ti3
+
753 cr2 = cc(i-1,1,k)+tr11*tr2+tr12*tr3
+
754 ci2 = cc(i,1,k)+tr11*ti2+tr12*ti3
+
755 cr3 = cc(i-1,1,k)+tr12*tr2+tr11*tr3
+
756 ci3 = cc(i,1,k)+tr12*ti2+tr11*ti3
+
757 cr5 = ti11*tr5+ti12*tr4
+
758 ci5 = ti11*ti5+ti12*ti4
+
759 cr4 = ti12*tr5-ti11*tr4
+
760 ci4 = ti12*ti5-ti11*ti4
+
761 dr3 = cr3-ci4
+
762 dr4 = cr3+ci4
+
763 di3 = ci3+cr4
+
764 di4 = ci3-cr4
+
765 dr5 = cr2+ci5
+
766 dr2 = cr2-ci5
+
767 di5 = ci2-cr5
+
768 di2 = ci2+cr5
+
769 ch(i-1,k,2) = wa1(i-2)*dr2-wa1(i-1)*di2
+
770 ch(i,k,2) = wa1(i-2)*di2+wa1(i-1)*dr2
+
771 ch(i-1,k,3) = wa2(i-2)*dr3-wa2(i-1)*di3
+
772 ch(i,k,3) = wa2(i-2)*di3+wa2(i-1)*dr3
+
773 ch(i-1,k,4) = wa3(i-2)*dr4-wa3(i-1)*di4
+
774 ch(i,k,4) = wa3(i-2)*di4+wa3(i-1)*dr4
+
775 ch(i-1,k,5) = wa4(i-2)*dr5-wa4(i-1)*di5
+
776 ch(i,k,5) = wa4(i-2)*di5+wa4(i-1)*dr5
+
777 102 CONTINUE
+
778 103 CONTINUE
+
779 RETURN
+
+
780 END
+
781
+
782C> RADBG
+
783C>
+
784C> @param IDO
+
785C> @param IP
+
786C> @param L1
+
787C> @param IDL1
+
788C> @param CC
+
789C> @param C1
+
790C> @param C2
+
791C> @param CH
+
792C> @param CH2
+
793C> @param WA
+
794C>
+
795C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
796 SUBROUTINE radbg (IDO,IP,L1,IDL1,CC,C1,C2,CH,CH2,WA)
+
797 dimension ch(ido,l1,ip) ,cc(ido,ip,l1) ,
+
798 1 c1(ido,l1,ip) ,c2(idl1,ip),
+
799 2 ch2(idl1,ip) ,wa(*)
+
800 DATA tpi/6.28318530717959/
+
801 arg = tpi/float(ip)
+
802 dcp = cos(arg)
+
803 dsp = sin(arg)
+
804 idp2 = ido+2
+
805 nbd = (ido-1)/2
+
806 ipp2 = ip+2
+
807 ipph = (ip+1)/2
+
808 IF (ido .LT. l1) GO TO 103
+
809 DO 102 k=1,l1
+
810 DO 101 i=1,ido
+
811 ch(i,k,1) = cc(i,1,k)
+
812 101 CONTINUE
+
813 102 CONTINUE
+
814 GO TO 106
+
815 103 DO 105 i=1,ido
+
816 DO 104 k=1,l1
+
817 ch(i,k,1) = cc(i,1,k)
+
818 104 CONTINUE
+
819 105 CONTINUE
+
820!OCL NOVREC
+
821 106 DO 108 j=2,ipph
+
822 jc = ipp2-j
+
823 j2 = j+j
+
824 DO 107 k=1,l1
+
825 ch(1,k,j) = cc(ido,j2-2,k)+cc(ido,j2-2,k)
+
826 ch(1,k,jc) = cc(1,j2-1,k)+cc(1,j2-1,k)
+
827 107 CONTINUE
+
828 108 CONTINUE
+
829 IF (ido .EQ. 1) GO TO 116
+
830 IF (nbd .LT. l1) GO TO 112
+
831!OCL NOVREC
+
832 DO 111 j=2,ipph
+
833 jc = ipp2-j
+
834 DO 110 k=1,l1
+
835 DO 109 i=3,ido,2
+
836 ic = idp2-i
+
837 ch(i-1,k,j) = cc(i-1,2*j-1,k)+cc(ic-1,2*j-2,k)
+
838 ch(i-1,k,jc) = cc(i-1,2*j-1,k)-cc(ic-1,2*j-2,k)
+
839 ch(i,k,j) = cc(i,2*j-1,k)-cc(ic,2*j-2,k)
+
840 ch(i,k,jc) = cc(i,2*j-1,k)+cc(ic,2*j-2,k)
+
841 109 CONTINUE
+
842 110 CONTINUE
+
843 111 CONTINUE
+
844 GO TO 116
+
845 112 DO 115 j=2,ipph
+
846 jc = ipp2-j
+
847 DO 114 i=3,ido,2
+
848 ic = idp2-i
+
849 DO 113 k=1,l1
+
850 ch(i-1,k,j) = cc(i-1,2*j-1,k)+cc(ic-1,2*j-2,k)
+
851 ch(i-1,k,jc) = cc(i-1,2*j-1,k)-cc(ic-1,2*j-2,k)
+
852 ch(i,k,j) = cc(i,2*j-1,k)-cc(ic,2*j-2,k)
+
853 ch(i,k,jc) = cc(i,2*j-1,k)+cc(ic,2*j-2,k)
+
854 113 CONTINUE
+
855 114 CONTINUE
+
856 115 CONTINUE
+
857 116 ar1 = 1.
+
858 ai1 = 0.
+
859!OCL NOVREC
+
860 DO 120 l=2,ipph
+
861 lc = ipp2-l
+
862 ar1h = dcp*ar1-dsp*ai1
+
863 ai1 = dcp*ai1+dsp*ar1
+
864 ar1 = ar1h
+
865 DO 117 ik=1,idl1
+
866 c2(ik,l) = ch2(ik,1)+ar1*ch2(ik,2)
+
867 c2(ik,lc) = ai1*ch2(ik,ip)
+
868 117 CONTINUE
+
869 dc2 = ar1
+
870 ds2 = ai1
+
871 ar2 = ar1
+
872 ai2 = ai1
+
873!OCL NOVREC
+
874 DO 119 j=3,ipph
+
875 jc = ipp2-j
+
876 ar2h = dc2*ar2-ds2*ai2
+
877 ai2 = dc2*ai2+ds2*ar2
+
878 ar2 = ar2h
+
879 DO 118 ik=1,idl1
+
880 c2(ik,l) = c2(ik,l)+ar2*ch2(ik,j)
+
881 c2(ik,lc) = c2(ik,lc)+ai2*ch2(ik,jc)
+
882 118 CONTINUE
+
883 119 CONTINUE
+
884 120 CONTINUE
+
885!OCL NOVREC
+
886 DO 122 j=2,ipph
+
887 DO 121 ik=1,idl1
+
888 ch2(ik,1) = ch2(ik,1)+ch2(ik,j)
+
889 121 CONTINUE
+
890 122 CONTINUE
+
891!OCL NOVREC
+
892 DO 124 j=2,ipph
+
893 jc = ipp2-j
+
894 DO 123 k=1,l1
+
895 ch(1,k,j) = c1(1,k,j)-c1(1,k,jc)
+
896 ch(1,k,jc) = c1(1,k,j)+c1(1,k,jc)
+
897 123 CONTINUE
+
898 124 CONTINUE
+
899 IF (ido .EQ. 1) GO TO 132
+
900 IF (nbd .LT. l1) GO TO 128
+
901!OCL NOVREC
+
902 DO 127 j=2,ipph
+
903 jc = ipp2-j
+
904 DO 126 k=1,l1
+
905 DO 125 i=3,ido,2
+
906 ch(i-1,k,j) = c1(i-1,k,j)-c1(i,k,jc)
+
907 ch(i-1,k,jc) = c1(i-1,k,j)+c1(i,k,jc)
+
908 ch(i,k,j) = c1(i,k,j)+c1(i-1,k,jc)
+
909 ch(i,k,jc) = c1(i,k,j)-c1(i-1,k,jc)
+
910 125 CONTINUE
+
911 126 CONTINUE
+
912 127 CONTINUE
+
913 GO TO 132
+
914 128 DO 131 j=2,ipph
+
915 jc = ipp2-j
+
916 DO 130 i=3,ido,2
+
917 DO 129 k=1,l1
+
918 ch(i-1,k,j) = c1(i-1,k,j)-c1(i,k,jc)
+
919 ch(i-1,k,jc) = c1(i-1,k,j)+c1(i,k,jc)
+
920 ch(i,k,j) = c1(i,k,j)+c1(i-1,k,jc)
+
921 ch(i,k,jc) = c1(i,k,j)-c1(i-1,k,jc)
+
922 129 CONTINUE
+
923 130 CONTINUE
+
924 131 CONTINUE
+
925 132 CONTINUE
+
926 IF (ido .EQ. 1) RETURN
+
927 DO 133 ik=1,idl1
+
928 c2(ik,1) = ch2(ik,1)
+
929 133 CONTINUE
+
930 DO 135 j=2,ip
+
931 DO 134 k=1,l1
+
932 c1(1,k,j) = ch(1,k,j)
+
933 134 CONTINUE
+
934 135 CONTINUE
+
935 IF (nbd .GT. l1) GO TO 139
+
936 is = -ido
+
937 DO 138 j=2,ip
+
938 is = is+ido
+
939 idij = is
+
940 DO 137 i=3,ido,2
+
941 idij = idij+2
+
942 DO 136 k=1,l1
+
943 c1(i-1,k,j) = wa(idij-1)*ch(i-1,k,j)-wa(idij)*ch(i,k,j)
+
944 c1(i,k,j) = wa(idij-1)*ch(i,k,j)+wa(idij)*ch(i-1,k,j)
+
945 136 CONTINUE
+
946 137 CONTINUE
+
947 138 CONTINUE
+
948 GO TO 143
+
949 139 is = -ido
+
950!OCL NOVREC
+
951 DO 142 j=2,ip
+
952 is = is+ido
+
953 DO 141 k=1,l1
+
954 idij = is
+
955 DO 140 i=3,ido,2
+
956 idij = idij+2
+
957 c1(i-1,k,j) = wa(idij-1)*ch(i-1,k,j)-wa(idij)*ch(i,k,j)
+
958 c1(i,k,j) = wa(idij-1)*ch(i,k,j)+wa(idij)*ch(i-1,k,j)
+
959 140 CONTINUE
+
960 141 CONTINUE
+
961 142 CONTINUE
+
962 143 RETURN
+
+
963 END
+
964
+
965C> RADBG
+
966C>
+
967C> @param IDO
+
968C> @param L1
+
969C> @param CC
+
970C> @param CH
+
971C> @param WA1
+
972C>
+
973C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
974 SUBROUTINE radf2 (IDO,L1,CC,CH,WA1)
+
975 dimension ch(ido,2,l1) ,cc(ido,l1,2) ,
+
976 1 wa1(*)
+
977 DO 101 k=1,l1
+
978 ch(1,1,k) = cc(1,k,1)+cc(1,k,2)
+
979 ch(ido,2,k) = cc(1,k,1)-cc(1,k,2)
+
980 101 CONTINUE
+
981 IF (ido.LT.2) THEN
+
982 GO TO 107
+
983 ELSEIF (ido.EQ.2) THEN
+
984 GO TO 105
+
985 ELSE
+
986 GO TO 102
+
987 ENDIF
+
988 102 idp2 = ido+2
+
989 DO 104 k=1,l1
+
990 DO 103 i=3,ido,2
+
991 ic = idp2-i
+
992 tr2 = wa1(i-2)*cc(i-1,k,2)+wa1(i-1)*cc(i,k,2)
+
993 ti2 = wa1(i-2)*cc(i,k,2)-wa1(i-1)*cc(i-1,k,2)
+
994 ch(i,1,k) = cc(i,k,1)+ti2
+
995 ch(ic,2,k) = ti2-cc(i,k,1)
+
996 ch(i-1,1,k) = cc(i-1,k,1)+tr2
+
997 ch(ic-1,2,k) = cc(i-1,k,1)-tr2
+
998 103 CONTINUE
+
999 104 CONTINUE
+
1000 IF (mod(ido,2) .EQ. 1) RETURN
+
1001 105 DO 106 k=1,l1
+
1002 ch(1,2,k) = -cc(ido,k,2)
+
1003 ch(ido,1,k) = cc(ido,k,1)
+
1004 106 CONTINUE
+
1005 107 RETURN
+
+
1006 END
+
1007
+
1008C> RADF3
+
1009C>
+
1010C> @param IDO
+
1011C> @param L1
+
1012C> @param CC
+
1013C> @param CH
+
1014C> @param WA1
+
1015C> @param WA2
+
1016C>
+
1017C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
1018 SUBROUTINE radf3 (IDO,L1,CC,CH,WA1,WA2)
+
1019 dimension ch(ido,3,l1) ,cc(ido,l1,3) ,
+
1020 1 wa1(*) ,wa2(*)
+
1021 DATA taur,taui /-.5,.866025403784439/
+
1022 DO 101 k=1,l1
+
1023 cr2 = cc(1,k,2)+cc(1,k,3)
+
1024 ch(1,1,k) = cc(1,k,1)+cr2
+
1025 ch(1,3,k) = taui*(cc(1,k,3)-cc(1,k,2))
+
1026 ch(ido,2,k) = cc(1,k,1)+taur*cr2
+
1027 101 CONTINUE
+
1028 IF (ido .EQ. 1) RETURN
+
1029 idp2 = ido+2
+
1030 DO 103 k=1,l1
+
1031 DO 102 i=3,ido,2
+
1032 ic = idp2-i
+
1033 dr2 = wa1(i-2)*cc(i-1,k,2)+wa1(i-1)*cc(i,k,2)
+
1034 di2 = wa1(i-2)*cc(i,k,2)-wa1(i-1)*cc(i-1,k,2)
+
1035 dr3 = wa2(i-2)*cc(i-1,k,3)+wa2(i-1)*cc(i,k,3)
+
1036 di3 = wa2(i-2)*cc(i,k,3)-wa2(i-1)*cc(i-1,k,3)
+
1037 cr2 = dr2+dr3
+
1038 ci2 = di2+di3
+
1039 ch(i-1,1,k) = cc(i-1,k,1)+cr2
+
1040 ch(i,1,k) = cc(i,k,1)+ci2
+
1041 tr2 = cc(i-1,k,1)+taur*cr2
+
1042 ti2 = cc(i,k,1)+taur*ci2
+
1043 tr3 = taui*(di2-di3)
+
1044 ti3 = taui*(dr3-dr2)
+
1045 ch(i-1,3,k) = tr2+tr3
+
1046 ch(ic-1,2,k) = tr2-tr3
+
1047 ch(i,3,k) = ti2+ti3
+
1048 ch(ic,2,k) = ti3-ti2
+
1049 102 CONTINUE
+
1050 103 CONTINUE
+
1051 RETURN
+
+
1052 END
+
1053
+
1054C> RADF4
+
1055C>
+
1056C> @param IDO
+
1057C> @param L1
+
1058C> @param CC
+
1059C> @param CH
+
1060C> @param WA1
+
1061C> @param WA2
+
1062C> @param WA3
+
1063C>
+
1064C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
1065 SUBROUTINE radf4 (IDO,L1,CC,CH,WA1,WA2,WA3)
+
1066 dimension cc(ido,l1,4) ,ch(ido,4,l1) ,
+
1067 1 wa1(*) ,wa2(*) ,wa3(*)
+
1068 DATA hsqt2 /.7071067811865475/
+
1069 DO 101 k=1,l1
+
1070 tr1 = cc(1,k,2)+cc(1,k,4)
+
1071 tr2 = cc(1,k,1)+cc(1,k,3)
+
1072 ch(1,1,k) = tr1+tr2
+
1073 ch(ido,4,k) = tr2-tr1
+
1074 ch(ido,2,k) = cc(1,k,1)-cc(1,k,3)
+
1075 ch(1,3,k) = cc(1,k,4)-cc(1,k,2)
+
1076 101 CONTINUE
+
1077 IF (ido.LT.2) THEN
+
1078 GO TO 107
+
1079 ELSEIF (ido.EQ.2) THEN
+
1080 GO TO 105
+
1081 ELSE
+
1082 GO TO 102
+
1083 ENDIF
+
1084 102 idp2 = ido+2
+
1085!OCL NOVREC
+
1086 DO 104 k=1,l1
+
1087 DO 103 i=3,ido,2
+
1088 ic = idp2-i
+
1089 cr2 = wa1(i-2)*cc(i-1,k,2)+wa1(i-1)*cc(i,k,2)
+
1090 ci2 = wa1(i-2)*cc(i,k,2)-wa1(i-1)*cc(i-1,k,2)
+
1091 cr3 = wa2(i-2)*cc(i-1,k,3)+wa2(i-1)*cc(i,k,3)
+
1092 ci3 = wa2(i-2)*cc(i,k,3)-wa2(i-1)*cc(i-1,k,3)
+
1093 cr4 = wa3(i-2)*cc(i-1,k,4)+wa3(i-1)*cc(i,k,4)
+
1094 ci4 = wa3(i-2)*cc(i,k,4)-wa3(i-1)*cc(i-1,k,4)
+
1095 tr1 = cr2+cr4
+
1096 tr4 = cr4-cr2
+
1097 ti1 = ci2+ci4
+
1098 ti4 = ci2-ci4
+
1099 ti2 = cc(i,k,1)+ci3
+
1100 ti3 = cc(i,k,1)-ci3
+
1101 tr2 = cc(i-1,k,1)+cr3
+
1102 tr3 = cc(i-1,k,1)-cr3
+
1103 ch(i-1,1,k) = tr1+tr2
+
1104 ch(ic-1,4,k) = tr2-tr1
+
1105 ch(i,1,k) = ti1+ti2
+
1106 ch(ic,4,k) = ti1-ti2
+
1107 ch(i-1,3,k) = ti4+tr3
+
1108 ch(ic-1,2,k) = tr3-ti4
+
1109 ch(i,3,k) = tr4+ti3
+
1110 ch(ic,2,k) = tr4-ti3
+
1111 103 CONTINUE
+
1112 104 CONTINUE
+
1113 IF (mod(ido,2) .EQ. 1) RETURN
+
1114 105 CONTINUE
+
1115 DO 106 k=1,l1
+
1116 ti1 = -hsqt2*(cc(ido,k,2)+cc(ido,k,4))
+
1117 tr1 = hsqt2*(cc(ido,k,2)-cc(ido,k,4))
+
1118 ch(ido,1,k) = tr1+cc(ido,k,1)
+
1119 ch(ido,3,k) = cc(ido,k,1)-tr1
+
1120 ch(1,2,k) = ti1-cc(ido,k,3)
+
1121 ch(1,4,k) = ti1+cc(ido,k,3)
+
1122 106 CONTINUE
+
1123 107 RETURN
+
+
1124 END
+
1125
+
1126C> RADF5
+
1127C>
+
1128C> @param IDO
+
1129C> @param L1
+
1130C> @param CC
+
1131C> @param CH
+
1132C> @param WA1
+
1133C> @param WA2
+
1134C> @param WA3
+
1135C> @param WA4
+
1136C>
+
1137C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
1138 SUBROUTINE radf5 (IDO,L1,CC,CH,WA1,WA2,WA3,WA4)
+
1139 dimension cc(ido,l1,5) ,ch(ido,5,l1) ,
+
1140 1 wa1(*) ,wa2(*) ,wa3(*) ,wa4(*)
+
1141 DATA tr11,ti11,tr12,ti12 /.309016994374947,.951056516295154,
+
1142 1-.809016994374947,.587785252292473/
+
1143 DO 101 k=1,l1
+
1144 cr2 = cc(1,k,5)+cc(1,k,2)
+
1145 ci5 = cc(1,k,5)-cc(1,k,2)
+
1146 cr3 = cc(1,k,4)+cc(1,k,3)
+
1147 ci4 = cc(1,k,4)-cc(1,k,3)
+
1148 ch(1,1,k) = cc(1,k,1)+cr2+cr3
+
1149 ch(ido,2,k) = cc(1,k,1)+tr11*cr2+tr12*cr3
+
1150 ch(1,3,k) = ti11*ci5+ti12*ci4
+
1151 ch(ido,4,k) = cc(1,k,1)+tr12*cr2+tr11*cr3
+
1152 ch(1,5,k) = ti12*ci5-ti11*ci4
+
1153 101 CONTINUE
+
1154 IF (ido .EQ. 1) RETURN
+
1155 idp2 = ido+2
+
1156 DO 103 k=1,l1
+
1157 DO 102 i=3,ido,2
+
1158 ic = idp2-i
+
1159 dr2 = wa1(i-2)*cc(i-1,k,2)+wa1(i-1)*cc(i,k,2)
+
1160 di2 = wa1(i-2)*cc(i,k,2)-wa1(i-1)*cc(i-1,k,2)
+
1161 dr3 = wa2(i-2)*cc(i-1,k,3)+wa2(i-1)*cc(i,k,3)
+
1162 di3 = wa2(i-2)*cc(i,k,3)-wa2(i-1)*cc(i-1,k,3)
+
1163 dr4 = wa3(i-2)*cc(i-1,k,4)+wa3(i-1)*cc(i,k,4)
+
1164 di4 = wa3(i-2)*cc(i,k,4)-wa3(i-1)*cc(i-1,k,4)
+
1165 dr5 = wa4(i-2)*cc(i-1,k,5)+wa4(i-1)*cc(i,k,5)
+
1166 di5 = wa4(i-2)*cc(i,k,5)-wa4(i-1)*cc(i-1,k,5)
+
1167 cr2 = dr2+dr5
+
1168 ci5 = dr5-dr2
+
1169 cr5 = di2-di5
+
1170 ci2 = di2+di5
+
1171 cr3 = dr3+dr4
+
1172 ci4 = dr4-dr3
+
1173 cr4 = di3-di4
+
1174 ci3 = di3+di4
+
1175 ch(i-1,1,k) = cc(i-1,k,1)+cr2+cr3
+
1176 ch(i,1,k) = cc(i,k,1)+ci2+ci3
+
1177 tr2 = cc(i-1,k,1)+tr11*cr2+tr12*cr3
+
1178 ti2 = cc(i,k,1)+tr11*ci2+tr12*ci3
+
1179 tr3 = cc(i-1,k,1)+tr12*cr2+tr11*cr3
+
1180 ti3 = cc(i,k,1)+tr12*ci2+tr11*ci3
+
1181 tr5 = ti11*cr5+ti12*cr4
+
1182 ti5 = ti11*ci5+ti12*ci4
+
1183 tr4 = ti12*cr5-ti11*cr4
+
1184 ti4 = ti12*ci5-ti11*ci4
+
1185 ch(i-1,3,k) = tr2+tr5
+
1186 ch(ic-1,2,k) = tr2-tr5
+
1187 ch(i,3,k) = ti2+ti5
+
1188 ch(ic,2,k) = ti5-ti2
+
1189 ch(i-1,5,k) = tr3+tr4
+
1190 ch(ic-1,4,k) = tr3-tr4
+
1191 ch(i,5,k) = ti3+ti4
+
1192 ch(ic,4,k) = ti4-ti3
+
1193 102 CONTINUE
+
1194 103 CONTINUE
+
1195 RETURN
+
+
1196 END
+
1197
+
1198C> RADFG
+
1199C>
+
1200C> @param IDO
+
1201C> @param IP
+
1202C> @param L1
+
1203C> @param IDL1
+
1204C> @param CC
+
1205C> @param C1
+
1206C> @param C2
+
1207C> @param CH
+
1208C> @param CH2
+
1209C> @param WA
+
1210C>
+
1211C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
+
+
1212 SUBROUTINE radfg (IDO,IP,L1,IDL1,CC,C1,C2,CH,CH2,WA)
+
1213 dimension ch(ido,l1,ip) ,cc(ido,ip,l1) ,
+
1214 1 c1(ido,l1,ip) ,c2(idl1,ip),
+
1215 2 ch2(idl1,ip) ,wa(*)
+
1216 DATA tpi/6.28318530717959/
+
1217 arg = tpi/float(ip)
+
1218 dcp = cos(arg)
+
1219 dsp = sin(arg)
+
1220 ipph = (ip+1)/2
+
1221 ipp2 = ip+2
+
1222 idp2 = ido+2
+
1223 nbd = (ido-1)/2
+
1224 IF (ido .EQ. 1) GO TO 119
+
1225 DO 101 ik=1,idl1
+
1226 ch2(ik,1) = c2(ik,1)
+
1227 101 CONTINUE
+
1228 DO 103 j=2,ip
+
1229 DO 102 k=1,l1
+
1230 ch(1,k,j) = c1(1,k,j)
+
1231 102 CONTINUE
+
1232 103 CONTINUE
+
1233 IF (nbd .GT. l1) GO TO 107
+
1234 is = -ido
+
1235 DO 106 j=2,ip
+
1236 is = is+ido
+
1237 idij = is
+
1238 DO 105 i=3,ido,2
+
1239 idij = idij+2
+
1240 DO 104 k=1,l1
+
1241 ch(i-1,k,j) = wa(idij-1)*c1(i-1,k,j)+wa(idij)*c1(i,k,j)
+
1242 ch(i,k,j) = wa(idij-1)*c1(i,k,j)-wa(idij)*c1(i-1,k,j)
+
1243 104 CONTINUE
+
1244 105 CONTINUE
+
1245 106 CONTINUE
+
1246 GO TO 111
+
1247 107 is = -ido
+
1248 DO 110 j=2,ip
+
1249 is = is+ido
+
1250 DO 109 k=1,l1
+
1251 idij = is
+
1252 DO 108 i=3,ido,2
+
1253 idij = idij+2
+
1254 ch(i-1,k,j) = wa(idij-1)*c1(i-1,k,j)+wa(idij)*c1(i,k,j)
+
1255 ch(i,k,j) = wa(idij-1)*c1(i,k,j)-wa(idij)*c1(i-1,k,j)
+
1256 108 CONTINUE
+
1257 109 CONTINUE
+
1258 110 CONTINUE
+
1259 111 IF (nbd .LT. l1) GO TO 115
+
1260 DO 114 j=2,ipph
+
1261 jc = ipp2-j
+
1262 DO 113 k=1,l1
+
1263 DO 112 i=3,ido,2
+
1264 c1(i-1,k,j) = ch(i-1,k,j)+ch(i-1,k,jc)
+
1265 c1(i-1,k,jc) = ch(i,k,j)-ch(i,k,jc)
+
1266 c1(i,k,j) = ch(i,k,j)+ch(i,k,jc)
+
1267 c1(i,k,jc) = ch(i-1,k,jc)-ch(i-1,k,j)
+
1268 112 CONTINUE
+
1269 113 CONTINUE
+
1270 114 CONTINUE
+
1271 GO TO 121
+
1272 115 DO 118 j=2,ipph
+
1273 jc = ipp2-j
+
1274 DO 117 i=3,ido,2
+
1275 DO 116 k=1,l1
+
1276 c1(i-1,k,j) = ch(i-1,k,j)+ch(i-1,k,jc)
+
1277 c1(i-1,k,jc) = ch(i,k,j)-ch(i,k,jc)
+
1278 c1(i,k,j) = ch(i,k,j)+ch(i,k,jc)
+
1279 c1(i,k,jc) = ch(i-1,k,jc)-ch(i-1,k,j)
+
1280 116 CONTINUE
+
1281 117 CONTINUE
+
1282 118 CONTINUE
+
1283 GO TO 121
+
1284 119 DO 120 ik=1,idl1
+
1285 c2(ik,1) = ch2(ik,1)
+
1286 120 CONTINUE
+
1287 121 DO 123 j=2,ipph
+
1288 jc = ipp2-j
+
1289 DO 122 k=1,l1
+
1290 c1(1,k,j) = ch(1,k,j)+ch(1,k,jc)
+
1291 c1(1,k,jc) = ch(1,k,jc)-ch(1,k,j)
+
1292 122 CONTINUE
+
1293 123 CONTINUE
+
1294C
+
1295 ar1 = 1.
+
1296 ai1 = 0.
+
1297 DO 127 l=2,ipph
+
1298 lc = ipp2-l
+
1299 ar1h = dcp*ar1-dsp*ai1
+
1300 ai1 = dcp*ai1+dsp*ar1
+
1301 ar1 = ar1h
+
1302 DO 124 ik=1,idl1
+
1303 ch2(ik,l) = c2(ik,1)+ar1*c2(ik,2)
+
1304 ch2(ik,lc) = ai1*c2(ik,ip)
+
1305 124 CONTINUE
+
1306 dc2 = ar1
+
1307 ds2 = ai1
+
1308 ar2 = ar1
+
1309 ai2 = ai1
+
1310 DO 126 j=3,ipph
+
1311 jc = ipp2-j
+
1312 ar2h = dc2*ar2-ds2*ai2
+
1313 ai2 = dc2*ai2+ds2*ar2
+
1314 ar2 = ar2h
+
1315 DO 125 ik=1,idl1
+
1316 ch2(ik,l) = ch2(ik,l)+ar2*c2(ik,j)
+
1317 ch2(ik,lc) = ch2(ik,lc)+ai2*c2(ik,jc)
+
1318 125 CONTINUE
+
1319 126 CONTINUE
+
1320 127 CONTINUE
+
1321 DO 129 j=2,ipph
+
1322 DO 128 ik=1,idl1
+
1323 ch2(ik,1) = ch2(ik,1)+c2(ik,j)
+
1324 128 CONTINUE
+
1325 129 CONTINUE
+
1326C
+
1327 IF (ido .LT. l1) GO TO 132
+
1328 DO 131 k=1,l1
+
1329 DO 130 i=1,ido
+
1330 cc(i,1,k) = ch(i,k,1)
+
1331 130 CONTINUE
+
1332 131 CONTINUE
+
1333 GO TO 135
+
1334 132 DO 134 i=1,ido
+
1335 DO 133 k=1,l1
+
1336 cc(i,1,k) = ch(i,k,1)
+
1337 133 CONTINUE
+
1338 134 CONTINUE
+
1339 135 DO 137 j=2,ipph
+
1340 jc = ipp2-j
+
1341 j2 = j+j
+
1342 DO 136 k=1,l1
+
1343 cc(ido,j2-2,k) = ch(1,k,j)
+
1344 cc(1,j2-1,k) = ch(1,k,jc)
+
1345 136 CONTINUE
+
1346 137 CONTINUE
+
1347 IF (ido .EQ. 1) RETURN
+
1348 IF (nbd .LT. l1) GO TO 141
+
1349 DO 140 j=2,ipph
+
1350 jc = ipp2-j
+
1351 j2 = j+j
+
1352 DO 139 k=1,l1
+
1353 DO 138 i=3,ido,2
+
1354 ic = idp2-i
+
1355 cc(i-1,j2-1,k) = ch(i-1,k,j)+ch(i-1,k,jc)
+
1356 cc(ic-1,j2-2,k) = ch(i-1,k,j)-ch(i-1,k,jc)
+
1357 cc(i,j2-1,k) = ch(i,k,j)+ch(i,k,jc)
+
1358 cc(ic,j2-2,k) = ch(i,k,jc)-ch(i,k,j)
+
1359 138 CONTINUE
+
1360 139 CONTINUE
+
1361 140 CONTINUE
+
1362 RETURN
+
1363 141 DO 144 j=2,ipph
+
1364 jc = ipp2-j
+
1365 j2 = j+j
+
1366 DO 143 i=3,ido,2
+
1367 ic = idp2-i
+
1368 DO 142 k=1,l1
+
1369 cc(i-1,j2-1,k) = ch(i-1,k,j)+ch(i-1,k,jc)
+
1370 cc(ic-1,j2-2,k) = ch(i-1,k,j)-ch(i-1,k,jc)
+
1371 cc(i,j2-1,k) = ch(i,k,j)+ch(i,k,jc)
+
1372 cc(ic,j2-2,k) = ch(i,k,jc)-ch(i,k,j)
+
1373 142 CONTINUE
+
1374 143 CONTINUE
+
1375 144 CONTINUE
+
1376 RETURN
+
+
1377 END
+
subroutine radf5(ido, l1, cc, ch, wa1, wa2, wa3, wa4)
RADF5.
Definition fftpack.F:1139
+
subroutine radbg(ido, ip, l1, idl1, cc, c1, c2, ch, ch2, wa)
RADBG.
Definition fftpack.F:797
+
subroutine rffti1(n, wa, ifac)
RFFTI1.
Definition fftpack.F:470
+
subroutine scfft(isign, n, scale, x, y, table, work, isys)
scfft
Definition fftpack.F:258
+
subroutine rfftb(n, r, wsave)
RFFTB.
Definition fftpack.F:305
+
subroutine rfftb1(n, c, ch, wa, ifac)
RFFTB1.
Definition fftpack.F:334
+
subroutine drcft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
drcft
Definition fftpack.F:164
+
subroutine rfftf1(n, c, ch, wa, ifac)
RFFTF1.
Definition fftpack.F:403
+
subroutine dcrft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
dcrft
Definition fftpack.F:34
+
subroutine radf4(ido, l1, cc, ch, wa1, wa2, wa3)
RADF4.
Definition fftpack.F:1066
+
subroutine rfftf(n, r, wsave)
RFFTF.
Definition fftpack.F:291
+
subroutine radf3(ido, l1, cc, ch, wa1, wa2)
RADF3.
Definition fftpack.F:1019
+
subroutine radfg(ido, ip, l1, idl1, cc, c1, c2, ch, ch2, wa)
RADFG.
Definition fftpack.F:1213
+
subroutine radb5(ido, l1, cc, ch, wa1, wa2, wa3, wa4)
RADB5.
Definition fftpack.F:719
+
subroutine radf2(ido, l1, cc, ch, wa1)
RADBG.
Definition fftpack.F:975
+
subroutine radb3(ido, l1, cc, ch, wa1, wa2)
RADB3
Definition fftpack.F:592
+
subroutine radb2(ido, l1, cc, ch, wa1)
RADB2.
Definition fftpack.F:547
+
subroutine scrft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
scrft
Definition fftpack.F:82
+
subroutine srcft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
srcft
Definition fftpack.F:215
+
subroutine csfft(isign, n, scale, x, y, table, work, isys)
csfft
Definition fftpack.F:121
+
subroutine rffti(n, wsave)
RFFTI.
Definition fftpack.F:318
+
subroutine radb4(ido, l1, cc, ch, wa1, wa2, wa3)
RADB4.
Definition fftpack.F:642
diff --git a/files.html b/files.html index 7c55cf73..6aa750fd 100644 --- a/files.html +++ b/files.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: File List @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +

@@ -62,7 +62,7 @@
@@ -76,108 +76,115 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
File List
+
File List
Here is a list of all documented files with brief descriptions:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
[detail level 12]
 bicubic_interp_mod.F90Bicubic interpolation routines for scalars and vectors
 bilinear_interp_mod.F90Bilinear interpolation routines for scalars and vectors
 budget_interp_mod.F90Budget interpolation routines for scalars and vectors
 earth_radius_mod.F90Determine earth radius and shape
 fftpack.FA concatination of the (FFTPACK)[https://netlib.org/fftpack/] library code
 gdswzd_c.F90C wrapper for routine gdswzd()
 gdswzd_mod.F90Driver module for gdswzd routines
 ip_constants_mod.F90Constants for use in NCEPLIBS-ip
 ip_equid_cylind_grid_mod.F90Equidistant cylindrical grib decoder and grid coordinate transformations
 ip_gaussian_grid_mod.F90Gaussian grid coordinate transformations
 ip_grid_descriptor_mod.F90Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions
 ip_grid_factory_mod.F90Routines for creating an ip_grid given a Grib descriptor
 ip_grid_mod.F90Abstract ip_grid type
 ip_grids_mod.F90Re-export the individual grids
 ip_interpolators_mod.F90Top-level module to export interpolation routines and constants
 ip_lambert_conf_grid_mod.F90GDS wizard for lambert conformal conical
 ip_mercator_grid_mod.F90GDS wizard for mercator cylindrical
 ip_mod.F90Top-level module for the ip library
 ip_polar_stereo_grid_mod.F90GDS wizard for polar stereographic azimuthal
 ip_rot_equid_cylind_egrid_mod.F90Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grid E
 ip_rot_equid_cylind_grid_mod.F90Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grids A through D
 ip_station_points_grid_mod.F90Interpolate gridded data to a series of station points
 iplib_4.hC interface to gdswzd() and gdswzd_grib1() functions for '4' library build
 iplib_8.hC interface to gdswzd() and gdswzd_grib1() functions for '8' library build
 iplib_d.hC interface to gdswzd() and gdswzd_grib1() functions for 'd' library build
 ipolates.F90Top-level driver for scalar interpolation routine ipolates()
 ipolatev.F90Top-level driver for vector interpolation routine ipolates
 ipxetas.F90Expand or contract eta grids using linear interpolation
 ipxwafs.F90Expand or contract wafs grids
 ipxwafs2.F90Expand or contract wafs grids using linear interpolation and account for bitmapped data
 ipxwafs3.F90Expand or contract wafs grids using neighbor interpolation and accout for bitmapped data
 movect.F90Move a vector along a great circle
 ncpus.FSet number of cpus
 neighbor_budget_interp_mod.F90Interpolate scalar and vector fields with neighbor budget interpolation
 neighbor_interp_mod.F90Interpolate scalar and vector fields with neighbor interpolation
 polfix_mod.F90Make multiple pole scalar values consistent
 sp_mod.F
 spanaly.fAnalyze spectral from Fourier
 spdz2uv.fCompute winds from divergence and vorticity
 spectral_interp_mod.F90Interpolate spectral
 speps.fCompute utility spectral fields
 spfft.fPerform multiple fast fourier transforms
 spfft1.fPerform multiple fast Fourier transforms
 spffte.fPerform multiple fast Fourier transforms
 spfftpt.fCompute fourier transform to gridpoints
 spgradq.fCompute gradient in spectral space
 spgradx.fCompute x-gradient in Fourier space
 spgrady.fCompute y-gradient in spectral space
 splaplac.fCompute laplacian in spectral space
 splat.FComputes cosines of colatitude and Gaussian weights for sets of latitudes
 splegend.fCompute Legendre polynomials
 sppad.fPad or truncate a spectral field
 spsynth.fSynthesize Fourier coefficients from spectral coefficients
 sptez.fPerform a simple scalar spherical transform
 sptezd.fPerform a simple gradient spherical transform
 sptezm.fPerform simple scalar spherical transforms
 sptezmd.fPerform simple gradient spherical transforms
 sptezmv.fPerform simple vector spherical transforms
 sptezv.fPerform a simple vector spherical transform
 sptgpm.fTransform spectral scalar to Mercator
 sptgpmd.fTransform spectral to Mercator gradients
 sptgpmv.fTransform spectral vector to Mercator
 sptgps.fTransform spectral scalar to polar stereo
 sptgpsd.fTransform spectral to polar stereographic gradients
 sptgpsv.fTransform spectral vector to polar stereo
 sptgpt.fTransform spectral scalar to station points
 sptgptd.fTransform spectral to station point gradients
 sptgptsd.fTransform spectral scalar to station points
 sptgptv.fTransform spectral vector to station points
 sptgptvd.fTransform spectral vector to station points
 sptran.fPerform a scalar spherical transform
 sptrand.fPerform a gradient spherical transform
 sptranf.fPerform a scalar spherical transform
 sptranf0.fSptranf spectral initialization
 sptranf1.fSptranf spectral transform
 sptranfv.fPerform a vector spherical transform
 sptranv.fPerform a vector spherical transform
 sptrun.fTruncate gridded scalar fields
 sptrund.fSpectrally truncate to gradients
 sptrung.fSpectrally interpolate scalars to stations
 sptrungv.fSpectrally interpolate vectors to stations
 sptrunl.fSpectrally truncate to laplacian
 sptrunm.fSpectrally interpolate scalars to Mercator
 sptrunmv.fSpectrally interpolate vectors to Mercator
 sptruns.fSpectrally interpolate scalars to polar stereo
 sptrunsv.fSpectrally interpolate vectors to polar stereo
 sptrunv.fSpectrally truncate gridded vector fields
 spuv2dz.fCompute divergence and vorticity from winds
 spvar.fCompute variance by total wavenumber
 spwget.fGet wave-space constants
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  src
 bicubic_interp_mod.F90Bicubic interpolation routines for scalars and vectors
 bilinear_interp_mod.F90Bilinear interpolation routines for scalars and vectors
 budget_interp_mod.F90Budget interpolation routines for scalars and vectors
 earth_radius_mod.F90Determine earth radius and shape
 fftpack.FA concatination of the (FFTPACK)[https://netlib.org/fftpack/] library code
 gdswzd_c.F90C wrapper for routine gdswzd()
 gdswzd_mod.F90Driver module for gdswzd routines
 ip_constants_mod.F90Constants for use in NCEPLIBS-ip
 ip_equid_cylind_grid_mod.F90Equidistant cylindrical grib decoder and grid coordinate transformations
 ip_gaussian_grid_mod.F90Gaussian grid coordinate transformations
 ip_grid_descriptor_mod.F90Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions
 ip_grid_factory_mod.F90Routines for creating an ip_grid given a Grib descriptor
 ip_grid_mod.F90Abstract ip_grid type
 ip_grids_mod.F90Re-export the individual grids
 ip_interpolators_mod.F90Top-level module to export interpolation routines and constants
 ip_lambert_conf_grid_mod.F90GDS wizard for lambert conformal conical
 ip_mercator_grid_mod.F90GDS wizard for mercator cylindrical
 ip_mod.F90Top-level module for the ip library
 ip_polar_stereo_grid_mod.F90GDS wizard for polar stereographic azimuthal
 ip_rot_equid_cylind_egrid_mod.F90Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grid E
 ip_rot_equid_cylind_grid_mod.F90Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grids A through D
 ip_station_points_grid_mod.F90Interpolate gridded data to a series of station points
 iplib_4.hC interface to gdswzd() and gdswzd_grib1() functions for '4' library build
 iplib_8.hC interface to gdswzd() and gdswzd_grib1() functions for '8' library build
 iplib_d.hC interface to gdswzd() and gdswzd_grib1() functions for 'd' library build
 ipolates.F90Top-level driver for scalar interpolation routine ipolates()
 ipolatev.F90Top-level driver for vector interpolation routine ipolates
 ipxetas.F90Expand or contract eta grids using linear interpolation
 ipxwafs.F90Expand or contract wafs grids
 ipxwafs2.F90Expand or contract wafs grids using linear interpolation and account for bitmapped data
 ipxwafs3.F90Expand or contract wafs grids using neighbor interpolation and accout for bitmapped data
 movect.F90Move a vector along a great circle
 ncpus.FSet number of cpus
 neighbor_budget_interp_mod.F90Interpolate scalar and vector fields with neighbor budget interpolation
 neighbor_interp_mod.F90Interpolate scalar and vector fields with neighbor interpolation
 polfix_mod.F90Make multiple pole scalar values consistent
 sp_mod.F
 spanaly.fAnalyze spectral from Fourier
 spdz2uv.fCompute winds from divergence and vorticity
 spectral_interp_mod.F90Interpolate spectral
 speps.fCompute utility spectral fields
 spfft.fPerform multiple fast fourier transforms
 spfft1.fPerform multiple fast Fourier transforms
 spffte.fPerform multiple fast Fourier transforms
 spfftpt.fCompute fourier transform to gridpoints
 spgradq.fCompute gradient in spectral space
 spgradx.fCompute x-gradient in Fourier space
 spgrady.fCompute y-gradient in spectral space
 splaplac.fCompute laplacian in spectral space
 splat.FComputes cosines of colatitude and Gaussian weights for sets of latitudes
 splegend.fCompute Legendre polynomials
 sppad.fPad or truncate a spectral field
 spsynth.fSynthesize Fourier coefficients from spectral coefficients
 sptez.fPerform a simple scalar spherical transform
 sptezd.fPerform a simple gradient spherical transform
 sptezm.fPerform simple scalar spherical transforms
 sptezmd.fPerform simple gradient spherical transforms
 sptezmv.fPerform simple vector spherical transforms
 sptezv.fPerform a simple vector spherical transform
 sptgpm.fTransform spectral scalar to Mercator
 sptgpmd.fTransform spectral to Mercator gradients
 sptgpmv.fTransform spectral vector to Mercator
 sptgps.fTransform spectral scalar to polar stereo
 sptgpsd.fTransform spectral to polar stereographic gradients
 sptgpsv.fTransform spectral vector to polar stereo
 sptgpt.fTransform spectral scalar to station points
 sptgptd.fTransform spectral to station point gradients
 sptgptsd.fTransform spectral scalar to station points
 sptgptv.fTransform spectral vector to station points
 sptgptvd.fTransform spectral vector to station points
 sptran.fPerform a scalar spherical transform
 sptrand.fPerform a gradient spherical transform
 sptranf.fPerform a scalar spherical transform
 sptranf0.fSptranf spectral initialization
 sptranf1.fSptranf spectral transform
 sptranfv.fPerform a vector spherical transform
 sptranv.fPerform a vector spherical transform
 sptrun.fTruncate gridded scalar fields
 sptrund.fSpectrally truncate to gradients
 sptrung.fSpectrally interpolate scalars to stations
 sptrungv.fSpectrally interpolate vectors to stations
 sptrunl.fSpectrally truncate to laplacian
 sptrunm.fSpectrally interpolate scalars to Mercator
 sptrunmv.fSpectrally interpolate vectors to Mercator
 sptruns.fSpectrally interpolate scalars to polar stereo
 sptrunsv.fSpectrally interpolate vectors to polar stereo
 sptrunv.fSpectrally truncate gridded vector fields
 spuv2dz.fCompute divergence and vorticity from winds
 spvar.fCompute variance by total wavenumber
 spwget.fGet wave-space constants
@@ -185,7 +192,7 @@ diff --git a/files_dup.js b/files_dup.js index f385241f..c3b39c49 100644 --- a/files_dup.js +++ b/files_dup.js @@ -1,93 +1,4 @@ var files_dup = [ - [ "bicubic_interp_mod.F90", "bicubic__interp__mod_8F90.html", "bicubic__interp__mod_8F90" ], - [ "bilinear_interp_mod.F90", "bilinear__interp__mod_8F90.html", "bilinear__interp__mod_8F90" ], - [ "budget_interp_mod.F90", "budget__interp__mod_8F90.html", "budget__interp__mod_8F90" ], - [ "earth_radius_mod.F90", "earth__radius__mod_8F90.html", "earth__radius__mod_8F90" ], - [ "fftpack.F", "fftpack_8F.html", "fftpack_8F" ], - [ "gdswzd_c.F90", "gdswzd__c_8F90.html", "gdswzd__c_8F90" ], - [ "gdswzd_mod.F90", "gdswzd__mod_8F90.html", "gdswzd__mod_8F90" ], - [ "ip_constants_mod.F90", "ip__constants__mod_8F90.html", "ip__constants__mod_8F90" ], - [ "ip_equid_cylind_grid_mod.F90", "ip__equid__cylind__grid__mod_8F90.html", "ip__equid__cylind__grid__mod_8F90" ], - [ "ip_gaussian_grid_mod.F90", "ip__gaussian__grid__mod_8F90.html", "ip__gaussian__grid__mod_8F90" ], - [ "ip_grid_descriptor_mod.F90", "ip__grid__descriptor__mod_8F90.html", "ip__grid__descriptor__mod_8F90" ], - [ "ip_grid_factory_mod.F90", "ip__grid__factory__mod_8F90.html", "ip__grid__factory__mod_8F90" ], - [ "ip_grid_mod.F90", "ip__grid__mod_8F90.html", "ip__grid__mod_8F90" ], - [ "ip_grids_mod.F90", "ip__grids__mod_8F90.html", null ], - [ "ip_interpolators_mod.F90", "ip__interpolators__mod_8F90.html", "ip__interpolators__mod_8F90" ], - [ "ip_lambert_conf_grid_mod.F90", "ip__lambert__conf__grid__mod_8F90.html", "ip__lambert__conf__grid__mod_8F90" ], - [ "ip_mercator_grid_mod.F90", "ip__mercator__grid__mod_8F90.html", "ip__mercator__grid__mod_8F90" ], - [ "ip_mod.F90", "ip__mod_8F90.html", null ], - [ "ip_polar_stereo_grid_mod.F90", "ip__polar__stereo__grid__mod_8F90.html", "ip__polar__stereo__grid__mod_8F90" ], - [ "ip_rot_equid_cylind_egrid_mod.F90", "ip__rot__equid__cylind__egrid__mod_8F90.html", "ip__rot__equid__cylind__egrid__mod_8F90" ], - [ "ip_rot_equid_cylind_grid_mod.F90", "ip__rot__equid__cylind__grid__mod_8F90.html", "ip__rot__equid__cylind__grid__mod_8F90" ], - [ "ip_station_points_grid_mod.F90", "ip__station__points__grid__mod_8F90.html", "ip__station__points__grid__mod_8F90" ], - [ "iplib_4.h", "iplib__4_8h.html", "iplib__4_8h" ], - [ "iplib_8.h", "iplib__8_8h.html", "iplib__8_8h" ], - [ "iplib_d.h", "iplib__d_8h.html", "iplib__d_8h" ], - [ "ipolates.F90", "ipolates_8F90.html", "ipolates_8F90" ], - [ "ipolatev.F90", "ipolatev_8F90.html", "ipolatev_8F90" ], - [ "ipxetas.F90", "ipxetas_8F90.html", "ipxetas_8F90" ], - [ "ipxwafs.F90", "ipxwafs_8F90.html", "ipxwafs_8F90" ], - [ "ipxwafs2.F90", "ipxwafs2_8F90.html", "ipxwafs2_8F90" ], - [ "ipxwafs3.F90", "ipxwafs3_8F90.html", "ipxwafs3_8F90" ], - [ "movect.F90", "movect_8F90.html", "movect_8F90" ], - [ "ncpus.F", "ncpus_8F.html", "ncpus_8F" ], - [ "neighbor_budget_interp_mod.F90", "neighbor__budget__interp__mod_8F90.html", "neighbor__budget__interp__mod_8F90" ], - [ "neighbor_interp_mod.F90", "neighbor__interp__mod_8F90.html", "neighbor__interp__mod_8F90" ], - [ "polfix_mod.F90", "polfix__mod_8F90.html", "polfix__mod_8F90" ], - [ "sp_mod.F", "sp__mod_8F_source.html", null ], - [ "spanaly.f", "spanaly_8f.html", "spanaly_8f" ], - [ "spdz2uv.f", "spdz2uv_8f.html", "spdz2uv_8f" ], - [ "spectral_interp_mod.F90", "spectral__interp__mod_8F90.html", "spectral__interp__mod_8F90" ], - [ "speps.f", "speps_8f.html", "speps_8f" ], - [ "spfft.f", "spfft_8f.html", "spfft_8f" ], - [ "spfft1.f", "spfft1_8f.html", "spfft1_8f" ], - [ "spffte.f", "spffte_8f.html", "spffte_8f" ], - [ "spfftpt.f", "spfftpt_8f.html", "spfftpt_8f" ], - [ "spgradq.f", "spgradq_8f.html", "spgradq_8f" ], - [ "spgradx.f", "spgradx_8f.html", "spgradx_8f" ], - [ "spgrady.f", "spgrady_8f.html", "spgrady_8f" ], - [ "splaplac.f", "splaplac_8f.html", "splaplac_8f" ], - [ "splat.F", "splat_8F.html", "splat_8F" ], - [ "splegend.f", "splegend_8f.html", "splegend_8f" ], - [ "sppad.f", "sppad_8f.html", "sppad_8f" ], - [ "spsynth.f", "spsynth_8f.html", "spsynth_8f" ], - [ "sptez.f", "sptez_8f.html", "sptez_8f" ], - [ "sptezd.f", "sptezd_8f.html", "sptezd_8f" ], - [ "sptezm.f", "sptezm_8f.html", "sptezm_8f" ], - [ "sptezmd.f", "sptezmd_8f.html", "sptezmd_8f" ], - [ "sptezmv.f", "sptezmv_8f.html", "sptezmv_8f" ], - [ "sptezv.f", "sptezv_8f.html", "sptezv_8f" ], - [ "sptgpm.f", "sptgpm_8f.html", "sptgpm_8f" ], - [ "sptgpmd.f", "sptgpmd_8f.html", "sptgpmd_8f" ], - [ "sptgpmv.f", "sptgpmv_8f.html", "sptgpmv_8f" ], - [ "sptgps.f", "sptgps_8f.html", "sptgps_8f" ], - [ "sptgpsd.f", "sptgpsd_8f.html", "sptgpsd_8f" ], - [ "sptgpsv.f", "sptgpsv_8f.html", "sptgpsv_8f" ], - [ "sptgpt.f", "sptgpt_8f.html", "sptgpt_8f" ], - [ "sptgptd.f", "sptgptd_8f.html", "sptgptd_8f" ], - [ "sptgptsd.f", "sptgptsd_8f.html", "sptgptsd_8f" ], - [ "sptgptv.f", "sptgptv_8f.html", "sptgptv_8f" ], - [ "sptgptvd.f", "sptgptvd_8f.html", "sptgptvd_8f" ], - [ "sptran.f", "sptran_8f.html", "sptran_8f" ], - [ "sptrand.f", "sptrand_8f.html", "sptrand_8f" ], - [ "sptranf.f", "sptranf_8f.html", "sptranf_8f" ], - [ "sptranf0.f", "sptranf0_8f.html", "sptranf0_8f" ], - [ "sptranf1.f", "sptranf1_8f.html", "sptranf1_8f" ], - [ "sptranfv.f", "sptranfv_8f.html", "sptranfv_8f" ], - [ "sptranv.f", "sptranv_8f.html", "sptranv_8f" ], - [ "sptrun.f", "sptrun_8f.html", "sptrun_8f" ], - [ "sptrund.f", "sptrund_8f.html", "sptrund_8f" ], - [ "sptrung.f", "sptrung_8f.html", "sptrung_8f" ], - [ "sptrungv.f", "sptrungv_8f.html", "sptrungv_8f" ], - [ "sptrunl.f", "sptrunl_8f.html", "sptrunl_8f" ], - [ "sptrunm.f", "sptrunm_8f.html", "sptrunm_8f" ], - [ "sptrunmv.f", "sptrunmv_8f.html", "sptrunmv_8f" ], - [ "sptruns.f", "sptruns_8f.html", "sptruns_8f" ], - [ "sptrunsv.f", "sptrunsv_8f.html", "sptrunsv_8f" ], - [ "sptrunv.f", "sptrunv_8f.html", "sptrunv_8f" ], - [ "spuv2dz.f", "spuv2dz_8f.html", "spuv2dz_8f" ], - [ "spvar.f", "spvar_8f.html", "spvar_8f" ], - [ "spwget.f", "spwget_8f.html", "spwget_8f" ] + [ "src", "dir_68267d1309a1af8e8297ef4c3efbcdba.html", "dir_68267d1309a1af8e8297ef4c3efbcdba" ] ]; \ No newline at end of file diff --git a/folderclosed.svg b/folderclosed.svg new file mode 100644 index 00000000..b04bed2e --- /dev/null +++ b/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/folderclosedd.svg b/folderclosedd.svg new file mode 100644 index 00000000..52f0166a --- /dev/null +++ b/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/folderopen.svg b/folderopen.svg new file mode 100644 index 00000000..f6896dd2 --- /dev/null +++ b/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/folderopend.svg b/folderopend.svg new file mode 100644 index 00000000..2d1f06e7 --- /dev/null +++ b/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/functions.html b/functions.html index d095edd2..eb9090cb 100644 --- a/functions.html +++ b/functions.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: Data Fields @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +

@@ -62,7 +62,7 @@
@@ -76,400 +76,174 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
Here is a list of all documented data types members with links to the data structure documentation for each member
-

- c -

diff --git a/functions_func.html b/functions_func.html index 302f4b7e..cedd1200 100644 --- a/functions_func.html +++ b/functions_func.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: Data Fields - Functions/Subroutines @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@

@@ -76,192 +76,85 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-  +
Here is a list of all documented functions with links to the struct/union documentation for each field:
-

- f -

diff --git a/functions_vars.html b/functions_vars.html index f226994b..309f628b 100644 --- a/functions_vars.html +++ b/functions_vars.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: Data Fields - Variables @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +

@@ -62,7 +62,7 @@
@@ -76,234 +76,122 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-  +
Here is a list of all documented variables with links to the struct/union documentation for each field:
-

- c -

diff --git a/gdswzd__c_8F90.html b/gdswzd__c_8F90.html index 9a8d640e..7977b7cb 100644 --- a/gdswzd__c_8F90.html +++ b/gdswzd__c_8F90.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: gdswzd_c.F90 File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@

@@ -76,42 +76,48 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
gdswzd_c.F90 File Reference
+
gdswzd_c.F90 File Reference
-

C wrapper for routine gdswzd(). +

C wrapper for routine gdswzd(). More...

Go to the source code of this file.

- - +

+

Modules

module  gdswzd_c_mod
module  gdswzd_c_mod
 Module that contains C wrapper for routine gdswzd().
 
- - - - - - - + + + + + +

+

Functions/Subroutines

subroutine gdswzd_c_mod::gdswzd_c (IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
 C wrapper for routine gdswzd(). More...
 
subroutine gdswzd_c_mod::gdswzd_c_grib1 (KGDS, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
 C wrapper for routine gdswzd. More...
 
subroutine gdswzd_c_mod::gdswzd_c (igdtnum, igdtmpl, igdtlen, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
 C wrapper for routine gdswzd().
 
subroutine gdswzd_c_mod::gdswzd_c_grib1 (kgds, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
 C wrapper for routine gdswzd.
 

Detailed Description

-

C wrapper for routine gdswzd().

+

C wrapper for routine gdswzd().

Author
JOVIC
Date
2016-04-10
@@ -122,7 +128,7 @@ diff --git a/gdswzd__c_8F90.js b/gdswzd__c_8F90.js index db0f3b21..7a614b3e 100644 --- a/gdswzd__c_8F90.js +++ b/gdswzd__c_8F90.js @@ -1,5 +1,5 @@ var gdswzd__c_8F90 = [ - [ "gdswzd_c", "gdswzd__c_8F90.html#ae3026381f7f41561507c97c9125d24e4", null ], - [ "gdswzd_c_grib1", "gdswzd__c_8F90.html#a06861f1403edf106bb3b399c39981504", null ] + [ "gdswzd_c", "gdswzd__c_8F90.html#a645c3a3f96448d8d7be375a23e7e8cfb", null ], + [ "gdswzd_c_grib1", "gdswzd__c_8F90.html#a90ed2f0c731d3813658f798c044a593a", null ] ]; \ No newline at end of file diff --git a/gdswzd__c_8F90_source.html b/gdswzd__c_8F90_source.html index 7f02ddbf..287ed7e3 100644 --- a/gdswzd__c_8F90_source.html +++ b/gdswzd__c_8F90_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: gdswzd_c.F90 Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,113 +81,123 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
gdswzd_c.F90
+
gdswzd_c.F90
-Go to the documentation of this file.
1 
-
4 
- -
8  use gdswzd_mod
-
9  implicit none
-
10 
-
11 contains
-
12 
-
173  SUBROUTINE gdswzd_c(IGDTNUM,IGDTMPL,IGDTLEN,IOPT,NPTS,FILL, &
-
174  XPTS,YPTS,RLON,RLAT,NRET,CROT,SROT, &
-
175  XLON,XLAT,YLON,YLAT,AREA) bind(C, NAME='gdswzd')
-
176  use, INTRINSIC :: iso_c_binding
-
177 
-
178  USE gdswzd_mod
-
179 
-
180  IMPLICIT NONE
-
181 
-
182 #if (LSIZE==8)
-
183  INTEGER(KIND=C_LONG), INTENT(IN) :: IGDTMPL(IGDTLEN)
-
184  INTEGER(KIND=C_LONG), VALUE, INTENT(IN) :: IGDTNUM, IGDTLEN
-
185  INTEGER(KIND=C_LONG), VALUE, INTENT(IN) :: IOPT, NPTS
-
186  INTEGER(KIND=C_LONG), INTENT(OUT) :: NRET
-
187 #else
-
188  INTEGER(KIND=C_INT), INTENT(IN) :: IGDTMPL(IGDTLEN)
-
189  INTEGER(KIND=C_INT), VALUE, INTENT(IN) :: IGDTNUM, IGDTLEN
-
190  INTEGER(KIND=C_INT), VALUE, INTENT(IN) :: IOPT, NPTS
-
191  INTEGER(KIND=C_INT), INTENT(OUT) :: NRET
-
192 #endif
-
193 
-
194 #if (LSIZE==4)
-
195  REAL(KIND=c_float), VALUE, INTENT(IN) :: fill
-
196  REAL(KIND=c_float), INTENT(INOUT) :: xpts(npts),ypts(npts),rlon(npts),rlat(npts)
-
197  REAL(KIND=c_float), INTENT(OUT) :: crot(npts),srot(npts),xlon(npts),xlat(npts)
-
198  REAL(KIND=c_float), INTENT(OUT) :: ylon(npts),ylat(npts),area(npts)
-
199 #else
-
200  REAL(KIND=c_double), VALUE, INTENT(IN) :: fill
-
201  REAL(KIND=c_double), INTENT(INOUT) :: xpts(npts),ypts(npts),rlon(npts),rlat(npts)
-
202  REAL(KIND=c_double), INTENT(OUT) :: crot(npts),srot(npts),xlon(npts),xlat(npts)
-
203  REAL(KIND=c_double), INTENT(OUT) :: ylon(npts),ylat(npts),area(npts)
-
204 #endif
-
205 
-
206  CALL gdswzd(igdtnum,igdtmpl,igdtlen,iopt,npts,fill, &
-
207  xpts,ypts,rlon,rlat,nret, &
-
208  crot,srot,xlon,xlat,ylon,ylat,area)
-
209 
-
210  END SUBROUTINE gdswzd_c
-
211 
-
259  SUBROUTINE gdswzd_c_grib1(KGDS,IOPT,NPTS,FILL,XPTS,YPTS,RLON,RLAT,NRET, &
-
260  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA) bind(C, NAME='gdswzd_grib1')
-
261  use, INTRINSIC :: iso_c_binding
-
262 
-
263  USE gdswzd_mod
-
264 
-
265  IMPLICIT NONE
-
266 
-
267 #if (LSIZE==8)
-
268  INTEGER(KIND=C_LONG), INTENT(IN) :: KGDS(200)
-
269  INTEGER(KIND=C_LONG), VALUE, INTENT(IN) :: IOPT
-
270  INTEGER(KIND=C_LONG), VALUE, INTENT(IN) :: NPTS
-
271  INTEGER(KIND=C_LONG), INTENT(OUT) :: NRET
-
272 #else
-
273  INTEGER(KIND=C_INT), INTENT(IN) :: KGDS(200)
-
274  INTEGER(KIND=C_INT), VALUE, INTENT(IN) :: IOPT
-
275  INTEGER(KIND=C_INT), VALUE, INTENT(IN) :: NPTS
-
276  INTEGER(KIND=C_INT), INTENT(OUT) :: NRET
-
277 #endif
-
278 
-
279 #if (LSIZE==4)
-
280  REAL(KIND=c_float), VALUE, INTENT(IN) :: fill
-
281  REAL(KIND=c_float), INTENT(INOUT) :: xpts(npts),ypts(npts),rlon(npts),rlat(npts)
-
282  REAL(KIND=c_float), INTENT(OUT) :: crot(npts),srot(npts),xlon(npts),xlat(npts)
-
283  REAL(KIND=c_float), INTENT(OUT) :: ylon(npts),ylat(npts),area(npts)
-
284 #else
-
285  REAL(KIND=c_double), VALUE, INTENT(IN) :: fill
-
286  REAL(KIND=c_double), INTENT(INOUT) :: xpts(npts),ypts(npts),rlon(npts),rlat(npts)
-
287  REAL(KIND=c_double), INTENT(OUT) :: crot(npts),srot(npts),xlon(npts),xlat(npts)
-
288  REAL(KIND=c_double), INTENT(OUT) :: ylon(npts),ylat(npts),area(npts)
-
289 #endif
-
290 
-
291  CALL gdswzd(kgds,iopt,npts,fill,xpts,ypts,rlon,rlat,nret, &
-
292  crot,srot,xlon,xlat,ylon,ylat,area)
-
293 
-
294  END SUBROUTINE gdswzd_c_grib1
-
295 
-
296 end module gdswzd_c_mod
- -
Module that contains C wrapper for routine gdswzd().
Definition: gdswzd_c.F90:7
-
subroutine gdswzd_c_grib1(KGDS, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
C wrapper for routine gdswzd.
Definition: gdswzd_c.F90:261
-
subroutine gdswzd_c(IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
C wrapper for routine gdswzd().
Definition: gdswzd_c.F90:176
-
Driver module for gdswzd routines.
Definition: gdswzd_mod.F90:25
+Go to the documentation of this file.
1
+
4
+ +
8 use gdswzd_mod
+
9 implicit none
+
10
+
11contains
+
12
+
+
173 SUBROUTINE gdswzd_c(IGDTNUM,IGDTMPL,IGDTLEN,IOPT,NPTS,FILL, &
+
174 XPTS,YPTS,RLON,RLAT,NRET,CROT,SROT, &
+
175 XLON,XLAT,YLON,YLAT,AREA) bind(C, NAME='gdswzd')
+
176 use, INTRINSIC :: iso_c_binding
+
177
+
178 USE gdswzd_mod
+
179
+
180 IMPLICIT NONE
+
181
+
182#if (LSIZE==8)
+
183 INTEGER(KIND=C_LONG), INTENT(IN) :: IGDTMPL(IGDTLEN)
+
184 INTEGER(KIND=C_LONG), VALUE, INTENT(IN) :: IGDTNUM, IGDTLEN
+
185 INTEGER(KIND=C_LONG), VALUE, INTENT(IN) :: IOPT, NPTS
+
186 INTEGER(KIND=C_LONG), INTENT(OUT) :: NRET
+
187#else
+
188 INTEGER(KIND=C_INT), INTENT(IN) :: IGDTMPL(IGDTLEN)
+
189 INTEGER(KIND=C_INT), VALUE, INTENT(IN) :: IGDTNUM, IGDTLEN
+
190 INTEGER(KIND=C_INT), VALUE, INTENT(IN) :: IOPT, NPTS
+
191 INTEGER(KIND=C_INT), INTENT(OUT) :: NRET
+
192#endif
+
193
+
194#if (LSIZE==4)
+
195 REAL(KIND=c_float), VALUE, INTENT(IN) :: fill
+
196 REAL(KIND=c_float), INTENT(INOUT) :: xpts(npts),ypts(npts),rlon(npts),rlat(npts)
+
197 REAL(KIND=c_float), INTENT(OUT) :: crot(npts),srot(npts),xlon(npts),xlat(npts)
+
198 REAL(KIND=c_float), INTENT(OUT) :: ylon(npts),ylat(npts),area(npts)
+
199#else
+
200 REAL(KIND=c_double), VALUE, INTENT(IN) :: fill
+
201 REAL(KIND=c_double), INTENT(INOUT) :: xpts(npts),ypts(npts),rlon(npts),rlat(npts)
+
202 REAL(KIND=c_double), INTENT(OUT) :: crot(npts),srot(npts),xlon(npts),xlat(npts)
+
203 REAL(KIND=c_double), INTENT(OUT) :: ylon(npts),ylat(npts),area(npts)
+
204#endif
+
205
+
206 CALL gdswzd(igdtnum,igdtmpl,igdtlen,iopt,npts,fill, &
+
207 xpts,ypts,rlon,rlat,nret, &
+
208 crot,srot,xlon,xlat,ylon,ylat,area)
+
209
+
+
210 END SUBROUTINE gdswzd_c
+
211
+
+
259 SUBROUTINE gdswzd_c_grib1(KGDS,IOPT,NPTS,FILL,XPTS,YPTS,RLON,RLAT,NRET, &
+
260 CROT,SROT,XLON,XLAT,YLON,YLAT,AREA) bind(C, NAME='gdswzd_grib1')
+
261 use, INTRINSIC :: iso_c_binding
+
262
+
263 USE gdswzd_mod
+
264
+
265 IMPLICIT NONE
+
266
+
267#if (LSIZE==8)
+
268 INTEGER(KIND=C_LONG), INTENT(IN) :: KGDS(200)
+
269 INTEGER(KIND=C_LONG), VALUE, INTENT(IN) :: IOPT
+
270 INTEGER(KIND=C_LONG), VALUE, INTENT(IN) :: NPTS
+
271 INTEGER(KIND=C_LONG), INTENT(OUT) :: NRET
+
272#else
+
273 INTEGER(KIND=C_INT), INTENT(IN) :: KGDS(200)
+
274 INTEGER(KIND=C_INT), VALUE, INTENT(IN) :: IOPT
+
275 INTEGER(KIND=C_INT), VALUE, INTENT(IN) :: NPTS
+
276 INTEGER(KIND=C_INT), INTENT(OUT) :: NRET
+
277#endif
+
278
+
279#if (LSIZE==4)
+
280 REAL(KIND=c_float), VALUE, INTENT(IN) :: fill
+
281 REAL(KIND=c_float), INTENT(INOUT) :: xpts(npts),ypts(npts),rlon(npts),rlat(npts)
+
282 REAL(KIND=c_float), INTENT(OUT) :: crot(npts),srot(npts),xlon(npts),xlat(npts)
+
283 REAL(KIND=c_float), INTENT(OUT) :: ylon(npts),ylat(npts),area(npts)
+
284#else
+
285 REAL(KIND=c_double), VALUE, INTENT(IN) :: fill
+
286 REAL(KIND=c_double), INTENT(INOUT) :: xpts(npts),ypts(npts),rlon(npts),rlat(npts)
+
287 REAL(KIND=c_double), INTENT(OUT) :: crot(npts),srot(npts),xlon(npts),xlat(npts)
+
288 REAL(KIND=c_double), INTENT(OUT) :: ylon(npts),ylat(npts),area(npts)
+
289#endif
+
290
+
291 CALL gdswzd(kgds,iopt,npts,fill,xpts,ypts,rlon,rlat,nret, &
+
292 crot,srot,xlon,xlat,ylon,ylat,area)
+
293
+
+
294 END SUBROUTINE gdswzd_c_grib1
+
295
+
296end module gdswzd_c_mod
+ +
Module that contains C wrapper for routine gdswzd().
Definition gdswzd_c.F90:7
+
subroutine gdswzd_c(igdtnum, igdtmpl, igdtlen, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
C wrapper for routine gdswzd().
Definition gdswzd_c.F90:176
+
subroutine gdswzd_c_grib1(kgds, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
C wrapper for routine gdswzd.
Definition gdswzd_c.F90:261
+
Driver module for gdswzd routines.
diff --git a/gdswzd__mod_8F90.html b/gdswzd__mod_8F90.html index 881c2de3..dcd495a5 100644 --- a/gdswzd__mod_8F90.html +++ b/gdswzd__mod_8F90.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: gdswzd_mod.F90 File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,9 +76,16 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
@@ -86,8 +93,7 @@ Data Types | Modules | Functions/Subroutines
-
-
gdswzd_mod.F90 File Reference
+
gdswzd_mod.F90 File Reference
@@ -96,37 +102,37 @@

Go to the source code of this file.

-

+

Data Types

interface  gdswzd_mod::gdswzd
 
- - +

+

Modules

module  gdswzd_mod
module  gdswzd_mod
 Driver module for gdswzd routines.
 
- - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + +

+

Functions/Subroutines

subroutine gdswzd_mod::gdswzd_1d_array (IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
 Decodes the grib 2 grid definition template and returns one of the following: More...
 
subroutine gdswzd_mod::gdswzd_2d_array (IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
 Decodes the grib 2 grid definition template and returns one of the following (for 2d-arrays): More...
 
subroutine, public gdswzd_mod::gdswzd_2d_array_grib1 (KGDS, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
 Decodes the grib grid description section and returns one of the following (for 2-d arrays): More...
 
subroutine, public gdswzd_mod::gdswzd_grib1 (KGDS, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
 Decodes the grib grid description section and returns one of the following (for 1-d arrays): More...
 
subroutine gdswzd_mod::gdswzd_grid (grid, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
 Returns one of the following for a grid object: More...
 
subroutine gdswzd_mod::gdswzd_scalar (IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
 Decodes the grib 2 grid definition template and returns one of the following (for scalars): More...
 
subroutine gdswzd_mod::gdswzd_1d_array (igdtnum, igdtmpl, igdtlen, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
 Decodes the grib 2 grid definition template and returns one of the following:
 
subroutine gdswzd_mod::gdswzd_2d_array (igdtnum, igdtmpl, igdtlen, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
 Decodes the grib 2 grid definition template and returns one of the following (for 2d-arrays):
 
subroutine, public gdswzd_mod::gdswzd_2d_array_grib1 (kgds, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
 Decodes the grib grid description section and returns one of the following (for 2-d arrays):
 
subroutine, public gdswzd_mod::gdswzd_grib1 (kgds, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
 Decodes the grib grid description section and returns one of the following (for 1-d arrays):
 
subroutine gdswzd_mod::gdswzd_grid (grid, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
 Returns one of the following for a grid object:
 
subroutine gdswzd_mod::gdswzd_scalar (igdtnum, igdtmpl, igdtlen, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
 Decodes the grib 2 grid definition template and returns one of the following (for scalars):
 

Detailed Description

Driver module for gdswzd routines.

@@ -140,7 +146,7 @@ diff --git a/gdswzd__mod_8F90.js b/gdswzd__mod_8F90.js index 3b950779..7f8c7329 100644 --- a/gdswzd__mod_8F90.js +++ b/gdswzd__mod_8F90.js @@ -1,10 +1,10 @@ var gdswzd__mod_8F90 = [ - [ "gdswzd", "interfacegdswzd__mod_1_1gdswzd.html", "interfacegdswzd__mod_1_1gdswzd" ], - [ "gdswzd_1d_array", "gdswzd__mod_8F90.html#ac304e2b046eccc701e24827c81107e76", null ], - [ "gdswzd_2d_array", "gdswzd__mod_8F90.html#acdf970e498e9317522fbdfb690b86e25", null ], - [ "gdswzd_2d_array_grib1", "gdswzd__mod_8F90.html#aa032a55281b18e208630a730679958f4", null ], - [ "gdswzd_grib1", "gdswzd__mod_8F90.html#a133e040fac8dd56e607b8e3fb6a58c37", null ], - [ "gdswzd_grid", "gdswzd__mod_8F90.html#a584d2bddbc6d857b80cfac5e3b288d45", null ], - [ "gdswzd_scalar", "gdswzd__mod_8F90.html#aba3235c5bc5797e72b9a6a8a587b8861", null ] + [ "gdswzd_mod::gdswzd", "interfacegdswzd__mod_1_1gdswzd.html", "interfacegdswzd__mod_1_1gdswzd" ], + [ "gdswzd_1d_array", "gdswzd__mod_8F90.html#a22fcb977737aba24bd78e075daf47bc6", null ], + [ "gdswzd_2d_array", "gdswzd__mod_8F90.html#ad2fb9a9e7090ff95e5b0192a8b09f896", null ], + [ "gdswzd_2d_array_grib1", "gdswzd__mod_8F90.html#a71a5aecec6e7bc8b1a9b2e28f4645659", null ], + [ "gdswzd_grib1", "gdswzd__mod_8F90.html#a353c57be5f548ae3fb065ffc94d51c22", null ], + [ "gdswzd_grid", "gdswzd__mod_8F90.html#a04215e685ff7339d85fb43e927e74c28", null ], + [ "gdswzd_scalar", "gdswzd__mod_8F90.html#a43ce21002cc5f7b4bda2151410f29466", null ] ]; \ No newline at end of file diff --git a/gdswzd__mod_8F90_source.html b/gdswzd__mod_8F90_source.html index 2b3993b6..a1410c08 100644 --- a/gdswzd__mod_8F90_source.html +++ b/gdswzd__mod_8F90_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: gdswzd_mod.F90 Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,374 +81,394 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
gdswzd_mod.F90
+
gdswzd_mod.F90
-Go to the documentation of this file.
1 
-
6 
-
25 MODULE gdswzd_mod
- -
27  use ip_grids_mod
-
28  use ip_grid_mod
- -
30 
-
31  IMPLICIT NONE
-
32 
-
33  PRIVATE
-
34 
- -
36 
-
37  INTERFACE gdswzd
-
38  MODULE PROCEDURE gdswzd_1d_array
-
39  MODULE PROCEDURE gdswzd_2d_array
-
40  MODULE PROCEDURE gdswzd_scalar
-
41  module procedure gdswzd_grib1
-
42  module procedure gdswzd_2d_array_grib1
-
43  module procedure gdswzd_grid
-
44  END INTERFACE gdswzd
-
45 
-
46 CONTAINS
-
47 
-
105  subroutine gdswzd_grid(grid,IOPT,NPTS,FILL, &
-
106  XPTS,YPTS,RLON,RLAT,NRET, &
-
107  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
-
108 
-
109  class(ip_grid), intent(in) :: grid
-
110  INTEGER, INTENT(IN ) :: IOPT, NPTS
-
111  INTEGER, INTENT( OUT) :: NRET
-
112  !
-
113  REAL, INTENT(IN ) :: FILL
-
114  REAL, INTENT(INOUT) :: RLON(NPTS),RLAT(NPTS)
-
115  REAL, INTENT(INOUT) :: XPTS(NPTS),YPTS(NPTS)
-
116  REAL, OPTIONAL, INTENT( OUT) :: CROT(NPTS),SROT(NPTS)
-
117  REAL, OPTIONAL, INTENT( OUT) :: XLON(NPTS),XLAT(NPTS)
-
118  REAL, OPTIONAL, INTENT( OUT) :: YLON(NPTS),YLAT(NPTS),AREA(NPTS)
-
119 
-
120  INTEGER :: IS1, IM, JM, NM, KSCAN, NSCAN, N
-
121  INTEGER :: IOPF, NN, I, J
-
122 
-
123  ! COMPUTE GRID COORDINATES FOR ALL GRID POINTS
-
124  IF(iopt.EQ.0) THEN
-
125  iopf=1
-
126 
-
127  if(grid%descriptor%grid_num.eq.-1)then
-
128  nm = npts
-
129  else
-
130  im = grid%im
-
131  jm = grid%jm
-
132  nm = im * jm
-
133  endif
-
134  nscan = grid%nscan
-
135  kscan = grid%kscan
-
136 
-
137  if (nm > npts) then
-
138  rlat=fill
-
139  rlon=fill
-
140  xpts=fill
-
141  ypts=fill
-
142  return
-
143  end if
-
144 
-
145  select type(grid)
-
146  type is(ip_rot_equid_cylind_egrid)
-
147  if(kscan == 0) then
-
148  is1 = (jm + 1) / 2
-
149  else
-
150  is1 = jm / 2
-
151  end if
-
152 
-
153  DO n=1,nm
-
154  IF(nscan.EQ.0) THEN
-
155  j=(n-1)/im+1
-
156  i=(n-im*(j-1))*2-mod(j+kscan,2)
-
157  ELSE
-
158  nn=(n*2)-1+kscan
-
159  i = (nn-1)/jm + 1
-
160  j = mod(nn-1,jm) + 1
-
161  IF (mod(jm,2)==0.AND.mod(i,2)==0.AND.kscan==0) j = j + 1
-
162  IF (mod(jm,2)==0.AND.mod(i,2)==0.AND.kscan==1) j = j - 1
-
163  ENDIF
-
164  xpts(n)=is1+(i-(j-kscan))/2
-
165  ypts(n)=(i+(j-kscan))/2
-
166  ENDDO
-
167  type is(ip_station_points_grid)
-
168  DO n=1,nm
-
169  xpts(n)=fill
-
170  ypts(n)=fill
-
171  ENDDO
-
172  class default
-
173  DO n=1,nm
-
174  IF(nscan.EQ.0) THEN
-
175  j=(n-1)/im+1
-
176  i=n-im*(j-1)
-
177  ELSE
-
178  i=(n-1)/jm+1
-
179  j=n-jm*(i-1)
-
180  ENDIF
-
181  xpts(n)=i
-
182  ypts(n)=j
-
183  ENDDO
-
184  end select
-
185 
-
186  DO n=nm+1,npts
-
187  xpts(n)=fill
-
188  ypts(n)=fill
-
189  ENDDO
-
190 
-
191  ELSE ! IOPT /= 0
-
192  iopf=iopt
-
193  ENDIF ! IOPT CHECK
-
194 
-
195  call grid%gdswzd(iopf,npts,fill, &
-
196  xpts,ypts,rlon,rlat,nret, &
-
197  crot,srot,xlon,xlat,ylon,ylat,area)
-
198 
-
199  end subroutine gdswzd_grid
-
200 
-
201 
-
278  SUBROUTINE gdswzd_scalar(IGDTNUM,IGDTMPL,IGDTLEN,IOPT,NPTS,FILL, &
-
279  XPTS,YPTS,RLON,RLAT,NRET, &
-
280  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
-
281 
-
282  IMPLICIT NONE
-
283  !
-
284  INTEGER, INTENT(IN ) :: IGDTNUM, IGDTLEN
-
285  INTEGER, INTENT(IN ) :: IGDTMPL(IGDTLEN)
-
286  INTEGER, INTENT(IN ) :: IOPT, NPTS
-
287  INTEGER, INTENT( OUT) :: NRET
-
288  !
-
289  REAL, INTENT(IN ) :: FILL
-
290  REAL, INTENT(INOUT) :: RLON, RLAT
-
291  REAL, INTENT(INOUT) :: XPTS, YPTS
-
292  REAL, OPTIONAL, INTENT( OUT) :: CROT, SROT
-
293  REAL, OPTIONAL, INTENT( OUT) :: XLON, XLAT
-
294  REAL, OPTIONAL, INTENT( OUT) :: YLON, YLAT, AREA
-
295 
-
296  REAL :: RLONA(1),RLATA(1)
-
297  REAL :: XPTSA(1),YPTSA(1)
-
298  REAL :: CROTA(1),SROTA(1)
-
299  REAL :: XLONA(1),XLATA(1)
-
300  REAL :: YLONA(1),YLATA(1),AREAA(1)
-
301 
-
302  rlona(1) = rlon
-
303  rlata(1) = rlat
-
304  xptsa(1) = xpts
-
305  yptsa(1) = ypts
-
306 
-
307  nret = 0
-
308 
-
309  ! CALL WITHOUT EXTRA FIELDS.
-
310 
-
311  IF (.NOT. PRESENT(crot) .AND. &
-
312  .NOT. PRESENT(srot) .AND. &
-
313  .NOT. PRESENT(xlon) .AND. &
-
314  .NOT. PRESENT(xlat) .AND. &
-
315  .NOT. PRESENT(ylon) .AND. &
-
316  .NOT. PRESENT(ylat) .AND. &
-
317  .NOT. PRESENT(area) ) THEN
-
318 
-
319  CALL gdswzd_1d_array(igdtnum,igdtmpl,igdtlen,iopt,npts,fill, &
-
320  xptsa,yptsa,rlona,rlata,nret)
-
321 
-
322  rlon = rlona(1)
-
323  rlat = rlata(1)
-
324  xpts = xptsa(1)
-
325  ypts = yptsa(1)
-
326 
-
327  ENDIF
-
328 
-
329  ! MIMIC CALL TO OLD 'GDSWIZ' ROUTINES.
-
330 
-
331  IF (PRESENT(crot) .AND. &
-
332  PRESENT(srot) .AND. &
-
333  .NOT. PRESENT(xlon) .AND. &
-
334  .NOT. PRESENT(xlat) .AND. &
-
335  .NOT. PRESENT(ylon) .AND. &
-
336  .NOT. PRESENT(ylat) .AND. &
-
337  .NOT. PRESENT(area) ) THEN
-
338 
-
339  CALL gdswzd_1d_array(igdtnum,igdtmpl,igdtlen,iopt,npts,fill, &
-
340  xptsa,yptsa,rlona,rlata,nret,crota,srota)
-
341 
-
342  rlon = rlona(1)
-
343  rlat = rlata(1)
-
344  xpts = xptsa(1)
-
345  ypts = yptsa(1)
-
346  crot = crota(1)
-
347  srot = srota(1)
-
348 
-
349  ENDIF
-
350 
-
351  ! MIMIC CALL TO OLD 'GDSWZD' ROUTINES.
-
352 
-
353  IF (PRESENT(crot) .AND. &
-
354  PRESENT(srot) .AND. &
-
355  PRESENT(xlon) .AND. &
-
356  PRESENT(xlat) .AND. &
-
357  PRESENT(ylon) .AND. &
-
358  PRESENT(ylat) .AND. &
-
359  PRESENT(area) ) THEN
-
360 
-
361  CALL gdswzd_1d_array(igdtnum,igdtmpl,igdtlen,iopt,npts,fill, &
-
362  xptsa,yptsa,rlona,rlata,nret, &
-
363  crota,srota,xlona,xlata,ylona,ylata,areaa)
-
364 
-
365  rlon = rlona(1)
-
366  rlat = rlata(1)
-
367  xpts = xptsa(1)
-
368  ypts = yptsa(1)
-
369  crot = crota(1)
-
370  srot = srota(1)
-
371  xlon = xlona(1)
-
372  xlat = xlata(1)
-
373  ylon = ylona(1)
-
374  ylat = ylata(1)
-
375  area = areaa(1)
-
376 
-
377  ENDIF
-
378 
-
379  RETURN
-
380 
-
381  END SUBROUTINE gdswzd_scalar
-
382 
-
459  SUBROUTINE gdswzd_2d_array(IGDTNUM,IGDTMPL,IGDTLEN,IOPT,NPTS,FILL, &
-
460  XPTS,YPTS,RLON,RLAT,NRET, &
-
461  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
-
462 
-
463  IMPLICIT NONE
-
464  !
-
465  INTEGER, INTENT(IN ) :: IGDTNUM, IGDTLEN
-
466  INTEGER, INTENT(IN ) :: IGDTMPL(IGDTLEN)
-
467  INTEGER, INTENT(IN ) :: IOPT, NPTS
-
468  INTEGER, INTENT( OUT) :: NRET
-
469  !
-
470  REAL, INTENT(IN ) :: FILL
-
471  REAL, INTENT(INOUT) :: RLON(:,:),RLAT(:,:)
-
472  REAL, INTENT(INOUT) :: XPTS(:,:),YPTS(:,:)
-
473  REAL, OPTIONAL, INTENT( OUT) :: CROT(:,:),SROT(:,:)
-
474  REAL, OPTIONAL, INTENT( OUT) :: XLON(:,:),XLAT(:,:)
-
475  REAL, OPTIONAL, INTENT( OUT) :: YLON(:,:),YLAT(:,:),AREA(:,:)
-
476 
-
477  CALL gdswzd_1d_array(igdtnum,igdtmpl,igdtlen,iopt,npts,fill, &
-
478  xpts,ypts,rlon,rlat,nret, &
-
479  crot,srot,xlon,xlat,ylon,ylat,area)
-
480 
-
481  END SUBROUTINE gdswzd_2d_array
-
482 
-
665  SUBROUTINE gdswzd_1d_array(IGDTNUM,IGDTMPL,IGDTLEN,IOPT,NPTS,FILL, &
-
666  XPTS,YPTS,RLON,RLAT,NRET, &
-
667  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
-
668  INTEGER, INTENT(IN ) :: IGDTNUM, IGDTLEN
-
669  INTEGER, INTENT(IN ) :: IGDTMPL(IGDTLEN)
-
670  INTEGER, INTENT(IN ) :: IOPT, NPTS
-
671  INTEGER, INTENT( OUT) :: NRET
-
672  !
-
673  REAL, INTENT(IN ) :: FILL
-
674  REAL, INTENT(INOUT) :: RLON(NPTS),RLAT(NPTS)
-
675  REAL, INTENT(INOUT) :: XPTS(NPTS),YPTS(NPTS)
-
676  REAL, OPTIONAL, INTENT( OUT) :: CROT(NPTS),SROT(NPTS)
-
677  REAL, OPTIONAL, INTENT( OUT) :: XLON(NPTS),XLAT(NPTS)
-
678  REAL, OPTIONAL, INTENT( OUT) :: YLON(NPTS),YLAT(NPTS),AREA(NPTS)
-
679 
-
680  type(grib2_descriptor) :: desc
-
681  class(ip_grid), allocatable :: grid
-
682 
-
683  desc = init_descriptor(igdtnum, igdtlen, igdtmpl)
-
684  call init_grid(grid, desc)
-
685 
-
686  call gdswzd_grid(grid,iopt,npts,fill, &
-
687  xpts,ypts,rlon,rlat,nret, &
-
688  crot,srot,xlon,xlat,ylon,ylat,area)
-
689 
-
690  END SUBROUTINE gdswzd_1d_array
-
691 
-
758  SUBROUTINE gdswzd_grib1(KGDS,IOPT,NPTS,FILL,XPTS,YPTS,RLON,RLAT,NRET, &
-
759  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
-
760  INTEGER, INTENT(IN ) :: IOPT, KGDS(200), NPTS
-
761  INTEGER, INTENT( OUT) :: NRET
-
762  !
-
763  REAL, INTENT(IN ) :: FILL
-
764  REAL, INTENT(INOUT) :: RLON(NPTS),RLAT(NPTS)
-
765  REAL, INTENT(INOUT) :: XPTS(NPTS),YPTS(NPTS)
-
766  REAL, OPTIONAL, INTENT( OUT) :: CROT(NPTS),SROT(NPTS)
-
767  REAL, OPTIONAL, INTENT( OUT) :: XLON(NPTS),XLAT(NPTS)
-
768  REAL, OPTIONAL, INTENT( OUT) :: YLON(NPTS),YLAT(NPTS),AREA(NPTS)
-
769 
-
770 
-
771  type(grib1_descriptor) :: desc
-
772  class(ip_grid), allocatable :: grid
-
773 
-
774  desc = init_descriptor(kgds)
-
775  call init_grid(grid, desc)
-
776 
-
777  call gdswzd_grid(grid,iopt,npts,fill, &
-
778  xpts,ypts,rlon,rlat,nret, &
-
779  crot,srot,xlon,xlat,ylon,ylat,area)
-
780 
-
781  END SUBROUTINE gdswzd_grib1
-
782 
-
783 
-
850  SUBROUTINE gdswzd_2d_array_grib1(KGDS,IOPT,NPTS,FILL,XPTS,YPTS,RLON,RLAT,NRET, &
-
851  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
-
852 
-
853  !$$$
-
854  INTEGER, INTENT(IN ) :: IOPT, KGDS(200), NPTS
-
855  INTEGER, INTENT( OUT) :: NRET
-
856  !
-
857  REAL, INTENT(IN ) :: FILL
-
858  REAL, INTENT(INOUT) :: RLON(:,:),RLAT(:,:)
-
859  REAL, INTENT(INOUT) :: XPTS(:,:),YPTS(:,:)
-
860  REAL, OPTIONAL, INTENT( OUT) :: CROT(:,:),SROT(:,:)
-
861  REAL, OPTIONAL, INTENT( OUT) :: XLON(:,:),XLAT(:,:)
-
862  REAL, OPTIONAL, INTENT( OUT) :: YLON(:,:),YLAT(:,:),AREA(:,:)
-
863 
-
864 
-
865  type(grib1_descriptor) :: desc
-
866  class(ip_grid), allocatable :: grid
-
867 
-
868  desc = init_descriptor(kgds)
-
869  call init_grid(grid, desc)
-
870 
-
871  call gdswzd_grid(grid,iopt,npts,fill, &
-
872  xpts,ypts,rlon,rlat,nret, &
-
873  crot,srot,xlon,xlat,ylon,ylat,area)
-
874 
-
875  END SUBROUTINE gdswzd_2d_array_grib1
-
876 
-
877 
-
878 
-
879 END MODULE gdswzd_mod
- - - -
Driver module for gdswzd routines.
Definition: gdswzd_mod.F90:25
-
subroutine, public gdswzd_grib1(KGDS, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
Decodes the grib grid description section and returns one of the following (for 1-d arrays):
Definition: gdswzd_mod.F90:760
-
subroutine gdswzd_grid(grid, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
Returns one of the following for a grid object:
Definition: gdswzd_mod.F90:108
-
subroutine, public gdswzd_2d_array_grib1(KGDS, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
Decodes the grib grid description section and returns one of the following (for 2-d arrays):
Definition: gdswzd_mod.F90:852
-
subroutine gdswzd_scalar(IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
Decodes the grib 2 grid definition template and returns one of the following (for scalars):
Definition: gdswzd_mod.F90:281
-
subroutine gdswzd_1d_array(IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
Decodes the grib 2 grid definition template and returns one of the following:
Definition: gdswzd_mod.F90:668
-
subroutine gdswzd_2d_array(IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
Decodes the grib 2 grid definition template and returns one of the following (for 2d-arrays):
Definition: gdswzd_mod.F90:462
-
Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
-
Routines for creating an ip_grid given a Grib descriptor.
-
Abstract ip_grid type.
Definition: ip_grid_mod.F90:10
-
Re-export the individual grids.
Definition: ip_grids_mod.F90:7
-
Descriptor representing a grib1 grib descriptor section (GDS) with an integer array.
-
Grib-2 descriptor containing a grib2 GDT represented by an integer array.
-
Abstract grid that holds fields and methods common to all grids.
Definition: ip_grid_mod.F90:58
+Go to the documentation of this file.
1
+
6
+ + +
27 use ip_grids_mod
+
28 use ip_grid_mod
+ +
30
+
31 IMPLICIT NONE
+
32
+
33 PRIVATE
+
34
+ +
36
+
+
37 INTERFACE gdswzd
+
38 MODULE PROCEDURE gdswzd_1d_array
+
39 MODULE PROCEDURE gdswzd_2d_array
+
40 MODULE PROCEDURE gdswzd_scalar
+
41 module procedure gdswzd_grib1
+
42 module procedure gdswzd_2d_array_grib1
+
43 module procedure gdswzd_grid
+
+
44 END INTERFACE gdswzd
+
45
+
46CONTAINS
+
47
+
+
105 subroutine gdswzd_grid(grid,IOPT,NPTS,FILL, &
+
106 XPTS,YPTS,RLON,RLAT,NRET, &
+
107 CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
+
108
+
109 class(ip_grid), intent(in) :: grid
+
110 INTEGER, INTENT(IN ) :: IOPT, NPTS
+
111 INTEGER, INTENT( OUT) :: NRET
+
112 !
+
113 REAL, INTENT(IN ) :: FILL
+
114 REAL, INTENT(INOUT) :: RLON(NPTS),RLAT(NPTS)
+
115 REAL, INTENT(INOUT) :: XPTS(NPTS),YPTS(NPTS)
+
116 REAL, OPTIONAL, INTENT( OUT) :: CROT(NPTS),SROT(NPTS)
+
117 REAL, OPTIONAL, INTENT( OUT) :: XLON(NPTS),XLAT(NPTS)
+
118 REAL, OPTIONAL, INTENT( OUT) :: YLON(NPTS),YLAT(NPTS),AREA(NPTS)
+
119
+
120 INTEGER :: IS1, IM, JM, NM, KSCAN, NSCAN, N
+
121 INTEGER :: IOPF, NN, I, J
+
122
+
123 ! COMPUTE GRID COORDINATES FOR ALL GRID POINTS
+
124 IF(iopt.EQ.0) THEN
+
125 iopf=1
+
126
+
127 if(grid%descriptor%grid_num.eq.-1)then
+
128 nm = npts
+
129 else
+
130 im = grid%im
+
131 jm = grid%jm
+
132 nm = im * jm
+
133 endif
+
134 nscan = grid%nscan
+
135 kscan = grid%kscan
+
136
+
137 if (nm > npts) then
+
138 rlat=fill
+
139 rlon=fill
+
140 xpts=fill
+
141 ypts=fill
+
142 return
+
143 end if
+
144
+
145 select type(grid)
+
146 type is(ip_rot_equid_cylind_egrid)
+
147 if(kscan == 0) then
+
148 is1 = (jm + 1) / 2
+
149 else
+
150 is1 = jm / 2
+
151 end if
+
152
+
153 DO n=1,nm
+
154 IF(nscan.EQ.0) THEN
+
155 j=(n-1)/im+1
+
156 i=(n-im*(j-1))*2-mod(j+kscan,2)
+
157 ELSE
+
158 nn=(n*2)-1+kscan
+
159 i = (nn-1)/jm + 1
+
160 j = mod(nn-1,jm) + 1
+
161 IF (mod(jm,2)==0.AND.mod(i,2)==0.AND.kscan==0) j = j + 1
+
162 IF (mod(jm,2)==0.AND.mod(i,2)==0.AND.kscan==1) j = j - 1
+
163 ENDIF
+
164 xpts(n)=is1+(i-(j-kscan))/2
+
165 ypts(n)=(i+(j-kscan))/2
+
166 ENDDO
+
167 type is(ip_station_points_grid)
+
168 DO n=1,nm
+
169 xpts(n)=fill
+
170 ypts(n)=fill
+
171 ENDDO
+
172 class default
+
173 DO n=1,nm
+
174 IF(nscan.EQ.0) THEN
+
175 j=(n-1)/im+1
+
176 i=n-im*(j-1)
+
177 ELSE
+
178 i=(n-1)/jm+1
+
179 j=n-jm*(i-1)
+
180 ENDIF
+
181 xpts(n)=i
+
182 ypts(n)=j
+
183 ENDDO
+
184 end select
+
185
+
186 DO n=nm+1,npts
+
187 xpts(n)=fill
+
188 ypts(n)=fill
+
189 ENDDO
+
190
+
191 ELSE ! IOPT /= 0
+
192 iopf=iopt
+
193 ENDIF ! IOPT CHECK
+
194
+
195 call grid%gdswzd(iopf,npts,fill, &
+
196 xpts,ypts,rlon,rlat,nret, &
+
197 crot,srot,xlon,xlat,ylon,ylat,area)
+
198
+
+
199 end subroutine gdswzd_grid
+
200
+
201
+
+
278 SUBROUTINE gdswzd_scalar(IGDTNUM,IGDTMPL,IGDTLEN,IOPT,NPTS,FILL, &
+
279 XPTS,YPTS,RLON,RLAT,NRET, &
+
280 CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
+
281
+
282 IMPLICIT NONE
+
283 !
+
284 INTEGER, INTENT(IN ) :: IGDTNUM, IGDTLEN
+
285 INTEGER, INTENT(IN ) :: IGDTMPL(IGDTLEN)
+
286 INTEGER, INTENT(IN ) :: IOPT, NPTS
+
287 INTEGER, INTENT( OUT) :: NRET
+
288 !
+
289 REAL, INTENT(IN ) :: FILL
+
290 REAL, INTENT(INOUT) :: RLON, RLAT
+
291 REAL, INTENT(INOUT) :: XPTS, YPTS
+
292 REAL, OPTIONAL, INTENT( OUT) :: CROT, SROT
+
293 REAL, OPTIONAL, INTENT( OUT) :: XLON, XLAT
+
294 REAL, OPTIONAL, INTENT( OUT) :: YLON, YLAT, AREA
+
295
+
296 REAL :: RLONA(1),RLATA(1)
+
297 REAL :: XPTSA(1),YPTSA(1)
+
298 REAL :: CROTA(1),SROTA(1)
+
299 REAL :: XLONA(1),XLATA(1)
+
300 REAL :: YLONA(1),YLATA(1),AREAA(1)
+
301
+
302 rlona(1) = rlon
+
303 rlata(1) = rlat
+
304 xptsa(1) = xpts
+
305 yptsa(1) = ypts
+
306
+
307 nret = 0
+
308
+
309 ! CALL WITHOUT EXTRA FIELDS.
+
310
+
311 IF (.NOT. PRESENT(crot) .AND. &
+
312 .NOT. PRESENT(srot) .AND. &
+
313 .NOT. PRESENT(xlon) .AND. &
+
314 .NOT. PRESENT(xlat) .AND. &
+
315 .NOT. PRESENT(ylon) .AND. &
+
316 .NOT. PRESENT(ylat) .AND. &
+
317 .NOT. PRESENT(area) ) THEN
+
318
+
319 CALL gdswzd_1d_array(igdtnum,igdtmpl,igdtlen,iopt,npts,fill, &
+
320 xptsa,yptsa,rlona,rlata,nret)
+
321
+
322 rlon = rlona(1)
+
323 rlat = rlata(1)
+
324 xpts = xptsa(1)
+
325 ypts = yptsa(1)
+
326
+
327 ENDIF
+
328
+
329 ! MIMIC CALL TO OLD 'GDSWIZ' ROUTINES.
+
330
+
331 IF (PRESENT(crot) .AND. &
+
332 PRESENT(srot) .AND. &
+
333 .NOT. PRESENT(xlon) .AND. &
+
334 .NOT. PRESENT(xlat) .AND. &
+
335 .NOT. PRESENT(ylon) .AND. &
+
336 .NOT. PRESENT(ylat) .AND. &
+
337 .NOT. PRESENT(area) ) THEN
+
338
+
339 CALL gdswzd_1d_array(igdtnum,igdtmpl,igdtlen,iopt,npts,fill, &
+
340 xptsa,yptsa,rlona,rlata,nret,crota,srota)
+
341
+
342 rlon = rlona(1)
+
343 rlat = rlata(1)
+
344 xpts = xptsa(1)
+
345 ypts = yptsa(1)
+
346 crot = crota(1)
+
347 srot = srota(1)
+
348
+
349 ENDIF
+
350
+
351 ! MIMIC CALL TO OLD 'GDSWZD' ROUTINES.
+
352
+
353 IF (PRESENT(crot) .AND. &
+
354 PRESENT(srot) .AND. &
+
355 PRESENT(xlon) .AND. &
+
356 PRESENT(xlat) .AND. &
+
357 PRESENT(ylon) .AND. &
+
358 PRESENT(ylat) .AND. &
+
359 PRESENT(area) ) THEN
+
360
+
361 CALL gdswzd_1d_array(igdtnum,igdtmpl,igdtlen,iopt,npts,fill, &
+
362 xptsa,yptsa,rlona,rlata,nret, &
+
363 crota,srota,xlona,xlata,ylona,ylata,areaa)
+
364
+
365 rlon = rlona(1)
+
366 rlat = rlata(1)
+
367 xpts = xptsa(1)
+
368 ypts = yptsa(1)
+
369 crot = crota(1)
+
370 srot = srota(1)
+
371 xlon = xlona(1)
+
372 xlat = xlata(1)
+
373 ylon = ylona(1)
+
374 ylat = ylata(1)
+
375 area = areaa(1)
+
376
+
377 ENDIF
+
378
+
379 RETURN
+
380
+
+
381 END SUBROUTINE gdswzd_scalar
+
382
+
+
459 SUBROUTINE gdswzd_2d_array(IGDTNUM,IGDTMPL,IGDTLEN,IOPT,NPTS,FILL, &
+
460 XPTS,YPTS,RLON,RLAT,NRET, &
+
461 CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
+
462
+
463 IMPLICIT NONE
+
464 !
+
465 INTEGER, INTENT(IN ) :: IGDTNUM, IGDTLEN
+
466 INTEGER, INTENT(IN ) :: IGDTMPL(IGDTLEN)
+
467 INTEGER, INTENT(IN ) :: IOPT, NPTS
+
468 INTEGER, INTENT( OUT) :: NRET
+
469 !
+
470 REAL, INTENT(IN ) :: FILL
+
471 REAL, INTENT(INOUT) :: RLON(:,:),RLAT(:,:)
+
472 REAL, INTENT(INOUT) :: XPTS(:,:),YPTS(:,:)
+
473 REAL, OPTIONAL, INTENT( OUT) :: CROT(:,:),SROT(:,:)
+
474 REAL, OPTIONAL, INTENT( OUT) :: XLON(:,:),XLAT(:,:)
+
475 REAL, OPTIONAL, INTENT( OUT) :: YLON(:,:),YLAT(:,:),AREA(:,:)
+
476
+
477 CALL gdswzd_1d_array(igdtnum,igdtmpl,igdtlen,iopt,npts,fill, &
+
478 xpts,ypts,rlon,rlat,nret, &
+
479 crot,srot,xlon,xlat,ylon,ylat,area)
+
480
+
+
481 END SUBROUTINE gdswzd_2d_array
+
482
+
+
665 SUBROUTINE gdswzd_1d_array(IGDTNUM,IGDTMPL,IGDTLEN,IOPT,NPTS,FILL, &
+
666 XPTS,YPTS,RLON,RLAT,NRET, &
+
667 CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
+
668 INTEGER, INTENT(IN ) :: IGDTNUM, IGDTLEN
+
669 INTEGER, INTENT(IN ) :: IGDTMPL(IGDTLEN)
+
670 INTEGER, INTENT(IN ) :: IOPT, NPTS
+
671 INTEGER, INTENT( OUT) :: NRET
+
672 !
+
673 REAL, INTENT(IN ) :: FILL
+
674 REAL, INTENT(INOUT) :: RLON(NPTS),RLAT(NPTS)
+
675 REAL, INTENT(INOUT) :: XPTS(NPTS),YPTS(NPTS)
+
676 REAL, OPTIONAL, INTENT( OUT) :: CROT(NPTS),SROT(NPTS)
+
677 REAL, OPTIONAL, INTENT( OUT) :: XLON(NPTS),XLAT(NPTS)
+
678 REAL, OPTIONAL, INTENT( OUT) :: YLON(NPTS),YLAT(NPTS),AREA(NPTS)
+
679
+
680 type(grib2_descriptor) :: desc
+
681 class(ip_grid), allocatable :: grid
+
682
+
683 desc = init_descriptor(igdtnum, igdtlen, igdtmpl)
+
684 call init_grid(grid, desc)
+
685
+
686 call gdswzd_grid(grid,iopt,npts,fill, &
+
687 xpts,ypts,rlon,rlat,nret, &
+
688 crot,srot,xlon,xlat,ylon,ylat,area)
+
689
+
+
690 END SUBROUTINE gdswzd_1d_array
+
691
+
+
758 SUBROUTINE gdswzd_grib1(KGDS,IOPT,NPTS,FILL,XPTS,YPTS,RLON,RLAT,NRET, &
+
759 CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
+
760 INTEGER, INTENT(IN ) :: IOPT, KGDS(200), NPTS
+
761 INTEGER, INTENT( OUT) :: NRET
+
762 !
+
763 REAL, INTENT(IN ) :: FILL
+
764 REAL, INTENT(INOUT) :: RLON(NPTS),RLAT(NPTS)
+
765 REAL, INTENT(INOUT) :: XPTS(NPTS),YPTS(NPTS)
+
766 REAL, OPTIONAL, INTENT( OUT) :: CROT(NPTS),SROT(NPTS)
+
767 REAL, OPTIONAL, INTENT( OUT) :: XLON(NPTS),XLAT(NPTS)
+
768 REAL, OPTIONAL, INTENT( OUT) :: YLON(NPTS),YLAT(NPTS),AREA(NPTS)
+
769
+
770
+
771 type(grib1_descriptor) :: desc
+
772 class(ip_grid), allocatable :: grid
+
773
+
774 desc = init_descriptor(kgds)
+
775 call init_grid(grid, desc)
+
776
+
777 call gdswzd_grid(grid,iopt,npts,fill, &
+
778 xpts,ypts,rlon,rlat,nret, &
+
779 crot,srot,xlon,xlat,ylon,ylat,area)
+
780
+
+
781 END SUBROUTINE gdswzd_grib1
+
782
+
783
+
+
850 SUBROUTINE gdswzd_2d_array_grib1(KGDS,IOPT,NPTS,FILL,XPTS,YPTS,RLON,RLAT,NRET, &
+
851 CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
+
852
+
853 !$$$
+
854 INTEGER, INTENT(IN ) :: IOPT, KGDS(200), NPTS
+
855 INTEGER, INTENT( OUT) :: NRET
+
856 !
+
857 REAL, INTENT(IN ) :: FILL
+
858 REAL, INTENT(INOUT) :: RLON(:,:),RLAT(:,:)
+
859 REAL, INTENT(INOUT) :: XPTS(:,:),YPTS(:,:)
+
860 REAL, OPTIONAL, INTENT( OUT) :: CROT(:,:),SROT(:,:)
+
861 REAL, OPTIONAL, INTENT( OUT) :: XLON(:,:),XLAT(:,:)
+
862 REAL, OPTIONAL, INTENT( OUT) :: YLON(:,:),YLAT(:,:),AREA(:,:)
+
863
+
864
+
865 type(grib1_descriptor) :: desc
+
866 class(ip_grid), allocatable :: grid
+
867
+
868 desc = init_descriptor(kgds)
+
869 call init_grid(grid, desc)
+
870
+
871 call gdswzd_grid(grid,iopt,npts,fill, &
+
872 xpts,ypts,rlon,rlat,nret, &
+
873 crot,srot,xlon,xlat,ylon,ylat,area)
+
874
+
+
875 END SUBROUTINE gdswzd_2d_array_grib1
+
876
+
877
+
878
+
879END MODULE gdswzd_mod
+ + + +
Driver module for gdswzd routines.
+
subroutine gdswzd_grid(grid, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
Returns one of the following for a grid object:
+
subroutine gdswzd_1d_array(igdtnum, igdtmpl, igdtlen, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
Decodes the grib 2 grid definition template and returns one of the following:
+
subroutine, public gdswzd_grib1(kgds, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
Decodes the grib grid description section and returns one of the following (for 1-d arrays):
+
subroutine gdswzd_scalar(igdtnum, igdtmpl, igdtlen, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
Decodes the grib 2 grid definition template and returns one of the following (for scalars):
+
subroutine, public gdswzd_2d_array_grib1(kgds, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
Decodes the grib grid description section and returns one of the following (for 2-d arrays):
+
subroutine gdswzd_2d_array(igdtnum, igdtmpl, igdtlen, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
Decodes the grib 2 grid definition template and returns one of the following (for 2d-arrays):
+
Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
+
Routines for creating an ip_grid given a Grib descriptor.
+
Abstract ip_grid type.
+
Re-export the individual grids.
+
Descriptor representing a grib1 grib descriptor section (GDS) with an integer array.
+
Grib-2 descriptor containing a grib2 GDT represented by an integer array.
+
Abstract grid that holds fields and methods common to all grids.
diff --git a/globals.html b/globals.html index 462f477c..ddb0ca33 100644 --- a/globals.html +++ b/globals.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: Globals @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@

@@ -76,300 +76,139 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
-

- c -

diff --git a/globals_func.html b/globals_func.html index bc86712c..a1fbfb56 100644 --- a/globals_func.html +++ b/globals_func.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: Globals @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +

@@ -62,7 +62,7 @@
@@ -76,300 +76,139 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-  +
Here is a list of all documented functions with links to the documentation:
-

- c -

diff --git a/hierarchy.html b/hierarchy.html index 36d6a3fd..059f9332 100644 --- a/hierarchy.html +++ b/hierarchy.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: Class Hierarchy @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@

@@ -76,48 +76,54 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
Class Hierarchy
+
Class Hierarchy
This inheritance list is sorted roughly, but not completely, alphabetically:
[detail level 12]
- + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
 Cgdswzd_mod::gdswzd
 Cip_grid_mod::gdswzd_interface
 Cip_grid_mod::gdswzd_interface
 Cip_grid_descriptor_mod::init_descriptor
 Cip_grid_mod::init_grib1_interface
 Cip_grid_mod::init_grib1_interface
 Cip_grid_mod::init_grib2_interface
 Cip_grid_factory_mod::init_grid
 Cip_grid_factory_mod::init_grid
 Cbicubic_interp_mod::interpolate_bicubic
 Cbilinear_interp_mod::interpolate_bilinear
 Cbilinear_interp_mod::interpolate_bilinear
 Cbudget_interp_mod::interpolate_budget
 Cneighbor_interp_mod::interpolate_neighbor
 Cneighbor_interp_mod::interpolate_neighbor
 Cneighbor_budget_interp_mod::interpolate_neighbor_budget
 Cspectral_interp_mod::interpolate_spectral
 Cspectral_interp_mod::interpolate_spectral
 Cip_grid_mod::ip_gridAbstract grid that holds fields and methods common to all grids
 Cip_equid_cylind_grid_mod::ip_equid_cylind_grid
 Cip_equid_cylind_grid_mod::ip_equid_cylind_grid
 Cip_gaussian_grid_mod::ip_gaussian_grid
 Cip_lambert_conf_grid_mod::ip_lambert_conf_grid
 Cip_lambert_conf_grid_mod::ip_lambert_conf_grid
 Cip_mercator_grid_mod::ip_mercator_grid
 Cip_polar_stereo_grid_mod::ip_polar_stereo_grid
 Cip_polar_stereo_grid_mod::ip_polar_stereo_grid
 Cip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid
 Cip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid
 Cip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid
 Cip_station_points_grid_mod::ip_station_points_grid
 Cip_grid_descriptor_mod::ip_grid_descriptorAbstract descriptor object which represents a grib1 or grib2 descriptor
 Cip_grid_descriptor_mod::ip_grid_descriptorAbstract descriptor object which represents a grib1 or grib2 descriptor
 Cip_grid_descriptor_mod::grib1_descriptorDescriptor representing a grib1 grib descriptor section (GDS) with an integer array
 Cip_grid_descriptor_mod::grib2_descriptorGrib-2 descriptor containing a grib2 GDT represented by an integer array
 Cip_grid_descriptor_mod::grib2_descriptorGrib-2 descriptor containing a grib2 GDT represented by an integer array
 Cipolates_mod::ipolates
 Cipolatev_mod::ipolatev
 Cipolatev_mod::ipolatev
 Cip_grid_descriptor_mod::operator(==)
 Cip_grid_mod::operator(==)Check equality
 Cip_grid_mod::operator(==)Check equality
 Cspectral_interp_mod::polates4
 Cspectral_interp_mod::polatev4
 Cspectral_interp_mod::polatev4
@@ -125,7 +131,7 @@ diff --git a/index.html b/index.html index 6b7d9944..f057485f 100644 --- a/index.html +++ b/index.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: Introduction @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@

@@ -76,23 +76,30 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
-
Introduction
+
+
Introduction
-Previous versions:

5.0.0, 4.4.0, 4.3.0, 4.2.0, 4.1.0, 4.0.0 +Previous versions:

5.1.0, 5.0.0, 4.4.0, 4.3.0, 4.2.0, 4.1.0, 4.0.0 -

The NCEP general interpolation library (NCEPLIBS-ip) contains Fortran 90 subprograms to be used for interpolating between nearly all grids used at NCEP. The library is particularly efficient when interpolating many fields at one time. It also contains functionality for interpolating, transforming, and otherwise manipulating spectral data (these functions were formerly contained in the NCEPLIBS-sp library).

+

The NCEP general interpolation library (NCEPLIBS-ip) contains Fortran 90 subprograms to be used for interpolating between nearly all grids used at NCEP. The library is particularly efficient when interpolating many fields at one time. It also contains functionality for interpolating, transforming, and otherwise manipulating spectral data (these functions were formerly contained in the NCEPLIBS-sp library).

NCEPLIBS-ip supports compilation with the GNU Compiler Collection (gfortran), Intel Classic (ifort), and Intel OneAPI (ifx) compilers. In the case of Intel OneAPI (IntelLLVM), it is recommended to use at least version 2023.2.1 to avoid any number of compiler issues.

Note
Some routines may behave poorly or unpredictably when using 4-byte reals (libip_4). For instance, there is an ATAN2 function used for polar stereo grids where for certain regions of certain grids, floating point differences between 4-byte output values (~1e-7) can be amplified into sizable differences in output field values. Some applications may therefore benefit from the use of 8-byte reals (libip_d or libip_8).
-

NCEPLIBS-ip uses several BLAS/LAPACK routines in the splat() subroutine, and therefore requires an external BLAS/LAPACK provider. In practice, this should generally be OpenBLAS, which is the spack-stack BLAS/LAPACK provider.

+

NCEPLIBS-ip uses several BLAS/LAPACK routines in the splat() subroutine, and therefore requires an external BLAS/LAPACK provider. In practice, this should generally be OpenBLAS, which is the spack-stack BLAS/LAPACK provider.

Interpolation

@@ -192,7 +199,7 @@

If the output grid definition template number is negative, then the output data may be just a set of station points. In this case, the user must pass the number of points to be output along with their latitudes and longitudes.

For vector interpolation, the vector rotations parameters must also be passed. On the other hand, for non-negative output data representation types, the number of output grid points and their latitudes and longitudes (and the vector rotation parameters for vector interpolation) are all returned by the interpolation subprograms.

If an output equidistant cylindrical grid contains multiple pole points, then the pole points are forced to be self-consistent. That is, scalar fields are obliged to be constant at the pole and vector components are obliged to exhibit a wavenumber one variation at the pole.

-

Generally, only regular grids can be interpolated in this library. However, the thinned WAFS grids may be expanded to a regular grid (or vice versa) using subprograms ipxwafs(), ipxwafs2(), or ipxwafs3(). Eta data (with Arakawa "E" staggering) on the "H" or "V" grid may be expanded to a filled regular grid (or vice versa) using subprogram ipxetas().

+

Generally, only regular grids can be interpolated in this library. However, the thinned WAFS grids may be expanded to a regular grid (or vice versa) using subprograms ipxwafs(), ipxwafs2(), or ipxwafs3(). Eta data (with Arakawa "E" staggering) on the "H" or "V" grid may be expanded to a filled regular grid (or vice versa) using subprogram ipxetas().

Return Codes

The return code issued by an interpolation subprogram determines whether it ran successfully or how it failed. Check nonzero return codes against the docblock of the respective subprogram.

@@ -217,11 +224,11 @@

neighbor_budget_interp_mod neighbor-budget interpolation -polfixs() make multiple pole scalar values consistent +polfixs() make multiple pole scalar values consistent -movect() move a vector along a great circle +movect() move a vector along a great circle -polfixv() make multiple pole vector values consistent +polfixv() make multiple pole vector values consistent

Grid description section decoders:

@@ -230,34 +237,34 @@

- + - + - + - + - + - + - + - + - +
gdswzd() grid description section (GDS) wizard
gdswzd_c() C wrapper for calling gdswzd
gdswzd_c() C wrapper for calling gdswzd
gdswzd_equid_cylind() GDS wizard for equidistant cyclindrical
gdswzd_equid_cylind() GDS wizard for equidistant cyclindrical
gdswzd_mercator() GDS wizard for mercator cyclindrical
gdswzd_mercator() GDS wizard for mercator cyclindrical
gdswzd_lambert_conf() GDS wizard for lambert conformal conical
gdswzd_lambert_conf() GDS wizard for lambert conformal conical
gdswzd_gaussian() GDS wizard for gaussian cyclindrical
gdswzd_gaussian() GDS wizard for gaussian cyclindrical
gdswzd_polar_stereo() GDS wizard for polar stereographic
gdswzd_polar_stereo() GDS wizard for polar stereographic
gdswzd_rot_equid_cylind_egrid() GDS wizard for rotated equidistant cyclindrical "e" stagger.
gdswzd_rot_equid_cylind_egrid() GDS wizard for rotated equidistant cyclindrical "e" stagger.
gdswzd_rot_equid_cylind() GDS wizard for rotated equidistant cyclindrical non "e" stagger.
gdswzd_rot_equid_cylind() GDS wizard for rotated equidistant cyclindrical non "e" stagger.
field_pos() return field position for a given grid point
field_pos() return field position for a given grid point

Transform subprograms for special irregular grids:

- + - + - +
Name Function
ipxwafs() expand or contract wafs grids
ipxwafs() expand or contract wafs grids
ipxwafs2() expand or contract wafs grids
ipxwafs2() expand or contract wafs grids
ipxwafs3() expand or contract wafs grids
ipxwafs3() expand or contract wafs grids

Spectral Transformation & Processing

@@ -272,82 +279,82 @@

Name Function -sptrun() Spectrally truncate gridded scalar fields +sptrun() Spectrally truncate gridded scalar fields -sptrunv() Spectrally truncate gridded vector fields +sptrunv() Spectrally truncate gridded vector fields -sptrung() Spectrally interpolate scalars to stations +sptrung() Spectrally interpolate scalars to stations -sptrungv() Spectrally interpolate vectors to stations +sptrungv() Spectrally interpolate vectors to stations -sptruns() Spectrally interpolate scalars to polar stereo +sptruns() Spectrally interpolate scalars to polar stereo -sptrunsv() Spectrally interpolate vectors to polar stereo +sptrunsv() Spectrally interpolate vectors to polar stereo -sptrunm() Spectrally interpolate scalars to Mercator +sptrunm() Spectrally interpolate scalars to Mercator -sptrunmv() Spectrally interpolate vectors to Mercator +sptrunmv() Spectrally interpolate vectors to Mercator

Spectral transforms between wave and grid

- + - + - + - + - + - + - + - + - + - + - + - +
Name Function
sptran() Perform a scalar spherical transform
sptran() Perform a scalar spherical transform
sptranv() Perform a vector spherical transform
sptranv() Perform a vector spherical transform
sptrand() Perform a gradient spherical transform
sptrand() Perform a gradient spherical transform
sptgpt() Transform spectral scalar to station points
sptgpt() Transform spectral scalar to station points
sptgptv() Transform spectral vector to station points
sptgptv() Transform spectral vector to station points
sptgptd() Transform spectral to station point gradients
sptgptd() Transform spectral to station point gradients
sptgps() Transform spectral scalar to polar stereo
sptgps() Transform spectral scalar to polar stereo
sptgpsv() Transform spectral vector to polar stereo
sptgpsv() Transform spectral vector to polar stereo
sptgpsd() Transform spectral to polar stereo gradients
sptgpsd() Transform spectral to polar stereo gradients
sptgpm() Transform spectral scalar to Mercator
sptgpm() Transform spectral scalar to Mercator
sptgpmv() Transform spectral vector to Mercator
sptgpmv() Transform spectral vector to Mercator
sptgpmd() Transform spectral to Mercator gradients
sptgpmd() Transform spectral to Mercator gradients

Spectral transform utilities

- + - + - + - + - + - + - + - + - + - +
Name Function
spwget() Get wave-space constants
spwget() Get wave-space constants
splat() Compute latitude functions
splat() Compute latitude functions
speps() Compute utility spectral fields
speps() Compute utility spectral fields
splegend() Compute Legendre polynomials
splegend() Compute Legendre polynomials
spanaly() Analyze spectral from Fourier
spanaly() Analyze spectral from Fourier
spsynth() Synthesize Fourier from spectral
spsynth() Synthesize Fourier from spectral
spdz2uv() Compute winds from divergence and vorticity
spdz2uv() Compute winds from divergence and vorticity
spuv2dz() Compute divergence and vorticity from winds
spuv2dz() Compute divergence and vorticity from winds
spgradq() Compute gradient in spectral space
spgradq() Compute gradient in spectral space
splaplac() Compute Laplacian in spectral space
splaplac() Compute Laplacian in spectral space

Examples: Interpolation Routines

Example 1. Read a grib 2 file of scalar data on a global regular 1-deg lat/lon grid and call ipolates to interpolate it to NCEP standard grid 218, a lambert conformal grid. Uses the NCEP G2 library to degrib the data.

program example_1
-
use ip_mod
+
use ip_mod
use grib_mod ! ncep grib 2 library
implicit none
@@ -548,7 +555,7 @@

close(10)
end program example_1
-
Top-level module for the ip library which re-exports public routines such as ipolates,...
Definition: ip_mod.F90:6
+
Top-level module for the ip library which re-exports public routines such as ipolates,...
Definition ip_mod.F90:6

Example 2. Read a grib 2 file of u/v wind data on a global regular 1-deg lat/lon grid and call ipolatev to interpolate it to four random station points. Uses the NCEP G2 library to degrib the data.

program example_2
@@ -804,7 +811,7 @@

imax=kgds(2,1)
jmax=kgds(3,1)
c
-
call sptruns(iromb,maxwv,idrt,imax,jmax,km,nps,
+
call sptruns(iromb,maxwv,idrt,imax,jmax,km,nps,
& 0,0,0,jf,0,0,0,0,true,xmesh,orient,f,gn,gs)
c
do k=1,km
@@ -884,7 +891,7 @@

imax=kgds(2,1)
jmax=kgds(3,1)
c
-
call sptrunsv(iromb,maxwv,idrt,imax,jmax,km,nps,
+
call sptrunsv(iromb,maxwv,idrt,imax,jmax,km,nps,
& 0,0,0,jf,0,0,0,0,true,xmesh,orient,u,v,
& .true.,un,vn,us,vs,.false.,dum,dum,dum,dum,
& .false.,dum,dum,dum,dum)
@@ -955,8 +962,8 @@

enddo
c
end
-
subroutine sptruns(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NPS, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, TRUE, XMESH, ORIENT, GRIDI, GN, GS)
This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields...
Definition: sptruns.f:75
-
subroutine sptrunsv(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NPS, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, TRUE, XMESH, ORIENT, GRIDUI, GRIDVI, LUV, UN, VN, US, VS, LDZ, DN, ZN, DS, ZS, LPS, PN, SN, PS, SS)
This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields...
Definition: sptrunsv.f:94
+
subroutine sptruns(iromb, maxwv, idrti, imaxi, jmaxi, kmax, nps, iprime, iskipi, jskipi, kskipi, kgskip, niskip, njskip, jcpu, true, xmesh, orient, gridi, gn, gs)
This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields...
Definition sptruns.f:75
+
subroutine sptrunsv(iromb, maxwv, idrti, imaxi, jmaxi, kmax, nps, iprime, iskipi, jskipi, kskipi, kgskip, niskip, njskip, jcpu, true, xmesh, orient, gridui, gridvi, luv, un, vn, us, vs, ldz, dn, zn, ds, zs, lps, pn, sn, ps, ss)
This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields...
Definition sptrunsv.f:94

Example 2. Spectrally truncate winds in place on a latlon grid.

c unit number 11 is the input latlon grib file
c unit number 31 is the input latlon grib index file
@@ -1009,7 +1016,7 @@

imax=kgds(2,1)
jmax=kgds(3,1)
c
-
call sptrunv(iromb,maxwv,idrt,imax,jmax,idrt,imax,jmax,km,
+
call sptrunv(iromb,maxwv,idrt,imax,jmax,idrt,imax,jmax,km,
& 0,0,0,jf,0,0,jf,0,u,v,.true.,u,v,
& .false.,dum,dum,.false.,dum,dum)
c
@@ -1023,7 +1030,7 @@

enddo
c
end
-
subroutine sptrunv(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, IDRTO, IMAXO, JMAXO, KMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, ISKIPO, JSKIPO, KSKIPO, JCPU, GRIDUI, GRIDVI, LUV, GRIDUO, GRIDVO, LDZ, GRIDDO, GRIDZO, LPS, GRIDPO, GRIDSO)
This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields...
Definition: sptrunv.f:96
+
subroutine sptrunv(iromb, maxwv, idrti, imaxi, jmaxi, idrto, imaxo, jmaxo, kmax, iprime, iskipi, jskipi, kskipi, iskipo, jskipo, kskipo, jcpu, gridui, gridvi, luv, griduo, gridvo, ldz, griddo, gridzo, lps, gridpo, gridso)
This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields...
Definition sptrunv.f:96

Example 3. Compute latlon temperatures from spectral temperatures and compute latlon winds from spectral divergence and vorticity.

c unit number 11 is the input sigma file
c unit number 51 is the output latlon file
@@ -1043,9 +1050,9 @@

do k=1,levs
read(11) (t(m,k),m=1,mx)
enddo
-
call sptran(iromb,maxwv,idrt,im,jm,levs,0,0,0,0,0,0,0,0,1,
+
call sptran(iromb,maxwv,idrt,im,jm,levs,0,0,0,0,0,0,0,0,1,
& t,tg(1,1,1),tg(1,jm,1),1)
-
call sptran(
+
call sptran(
do k=1,levs
write(51) ((tg(i,j,k),i=1,im),j=1,jm)
enddo
@@ -1054,22 +1061,22 @@

read(11) (d(m,k),m=1,mx)
read(11) (z(m,k),m=1,mx)
enddo
-
call sptranv(iromb,maxwv,idrt,im,jm,levs,0,0,0,0,0,0,0,0,1,
+
call sptranv(iromb,maxwv,idrt,im,jm,levs,0,0,0,0,0,0,0,0,1,
& d,z,ug(1,1,1),ug(1,jm,1),vg(1,1,1),vg(1,jm,1),1)
do k=1,levs
write(51) ((ug(i,j,k),i=1,im),j=1,jm)
write(51) ((vg(i,j,k),i=1,im),j=1,jm)
enddo
end
-
subroutine sptran(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDN, GRIDS, IDIR)
This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
Definition: sptran.f:88
-
subroutine sptranv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
Definition: sptranv.f:91
+
subroutine sptran(iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, wave, gridn, grids, idir)
This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
Definition sptran.f:88
+
subroutine sptranv(iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, waved, wavez, gridun, gridus, gridvn, gridvs, idir)
This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
Definition sptranv.f:91

diff --git a/index.js b/index.js new file mode 100644 index 00000000..b46409a8 --- /dev/null +++ b/index.js @@ -0,0 +1,22 @@ +var index = +[ + [ "Interpolation", "index.html#autotoc_md1", [ + [ "Interpolation Methods", "index.html#autotoc_md2", [ + [ "Bilinear Interpolation Method", "index.html#autotoc_md3", null ], + [ "Bicubic Interpolation Method", "index.html#autotoc_md4", null ], + [ "Neighbor Interpolation Method", "index.html#autotoc_md5", null ], + [ "Budget Interpolation Method", "index.html#autotoc_md6", null ], + [ "Spectral Interpolation Method", "index.html#autotoc_md7", null ], + [ "Neighbor-Budget Interpolation Method", "index.html#autotoc_md8", null ] + ] ], + [ "Vectors and Scalars", "index.html#autotoc_md9", null ], + [ "Grids", "index.html#autotoc_md10", null ], + [ "Return Codes", "index.html#autotoc_md11", null ], + [ "Entry point list: interpolation", "index.html#autotoc_md12", null ] + ] ], + [ "Spectral Transformation & Processing", "index.html#autotoc_md13", [ + [ "Entry Point List: Spectral Interpolation & Transformation", "index.html#autotoc_md14", null ] + ] ], + [ "Examples: Interpolation Routines", "index.html#autotoc_md15", null ], + [ "Examples: Spectral Processing & Transformation", "index.html#autotoc_md16", null ] +]; \ No newline at end of file diff --git a/interfacebicubic__interp__mod_1_1interpolate__bicubic.html b/interfacebicubic__interp__mod_1_1interpolate__bicubic.html index c8d35bcd..e9b68a73 100644 --- a/interfacebicubic__interp__mod_1_1interpolate__bicubic.html +++ b/interfacebicubic__interp__mod_1_1interpolate__bicubic.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: bicubic_interp_mod::interpolate_bicubic Interface Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +

@@ -62,7 +62,7 @@
@@ -76,46 +76,49 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
bicubic_interp_mod::interpolate_bicubic Interface Reference
+Public Member Functions
+
bicubic_interp_mod::interpolate_bicubic Interface Reference

- - - - - - + + + + + +

-Private Member Functions

subroutine interpolate_bicubic_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
 This subprogram performs bicubic interpolation from any grid to any grid for scalar fields. More...
 
subroutine interpolate_bicubic_vector (ipopt, grid_in, grid_out, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
 This subprogram performs bicubic interpolation from any grid to any grid for vector fields. More...

+Public Member Functions

subroutine interpolate_bicubic_scalar (ipopt, grid_in, grid_out, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
 This subprogram performs bicubic interpolation from any grid to any grid for scalar fields.
 
subroutine interpolate_bicubic_vector (ipopt, grid_in, grid_out, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
 This subprogram performs bicubic interpolation from any grid to any grid for vector fields.
 

Detailed Description

Definition at line 17 of file bicubic_interp_mod.F90.

Member Function/Subroutine Documentation

- -

◆ interpolate_bicubic_scalar()

+ +

◆ interpolate_bicubic_scalar()

- - - - + - + - + - + - + - + @@ -158,7 +164,7 @@

Computes the laplacian or the inverse laplacian of a scalar field in spectral space.

-

Subprogram speps() should be called already.

+

Subprogram speps() should be called already.

The Laplacian of Q(L,N) is simply -N*(N+1)/A**2*Q(L,N)

Parameters

- + @@ -133,79 +136,79 @@

- + - + - + - + - + - + - + - + - + - + - + - + - + @@ -213,11 +216,6 @@

-private -

-
subroutine bicubic_interp_mod::interpolate_bicubic::interpolate_bicubic_scalar ( integer, dimension(20), intent(in) IPOPT, ipopt,
integer, intent(in) MI, mi,
integer, intent(in) MO, mo,
integer, intent(in) KM, km,
integer, dimension(km), intent(in) IBI, ibi,
logical*1, dimension(mi,km), intent(in) LI, li,
real, dimension(mi,km), intent(in) GI, gi,
integer, intent(inout) NO, no,
real, dimension(mo), intent(inout) RLAT, rlat,
real, dimension(mo), intent(inout) RLON, rlon,
integer, dimension(km), intent(out) IBO, ibo,
logical*1, dimension(mo,km), intent(out) LO, lo,
real, dimension(mo,km), intent(out) GO, go,
integer, intent(out) IRET iret 

This subprogram performs bicubic interpolation from any grid to any grid for scalar fields.

@@ -265,14 +263,11 @@

-

◆ interpolate_bicubic_vector()

+ +

◆ interpolate_bicubic_vector()

- - - - + - + - + - + - + - + - + - + @@ -202,7 +208,7 @@

diff --git a/spgrady_8f.js b/spgrady_8f.js index f8529204..78b11af5 100644 --- a/spgrady_8f.js +++ b/spgrady_8f.js @@ -1,4 +1,4 @@ var spgrady_8f = [ - [ "spgrady", "spgrady_8f.html#a1b3e38e56560de7d7dcf19ea3e931cf1", null ] + [ "spgrady", "spgrady_8f.html#aa5e7c64159f113cfa5ff59ab02fdceb2", null ] ]; \ No newline at end of file diff --git a/spgrady_8f_source.html b/spgrady_8f_source.html index 1d44b973..acede98e 100644 --- a/spgrady_8f_source.html +++ b/spgrady_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spgrady.f Source File @@ -23,10 +23,9 @@

@@ -400,11 +395,6 @@

-private -

-
subroutine bicubic_interp_mod::interpolate_bicubic::interpolate_bicubic_vector
diff --git a/interfacebicubic__interp__mod_1_1interpolate__bicubic.js b/interfacebicubic__interp__mod_1_1interpolate__bicubic.js index 22f72d65..cb13de0c 100644 --- a/interfacebicubic__interp__mod_1_1interpolate__bicubic.js +++ b/interfacebicubic__interp__mod_1_1interpolate__bicubic.js @@ -1,5 +1,5 @@ var interfacebicubic__interp__mod_1_1interpolate__bicubic = [ - [ "interpolate_bicubic_scalar", "interfacebicubic__interp__mod_1_1interpolate__bicubic.html#acbfecc99184cf9ae71b2c9f79c7d4077", null ], + [ "interpolate_bicubic_scalar", "interfacebicubic__interp__mod_1_1interpolate__bicubic.html#a8bf083dfa615324f36b3f9f9bb0e69f0", null ], [ "interpolate_bicubic_vector", "interfacebicubic__interp__mod_1_1interpolate__bicubic.html#aac45c15e1c9d76158d72e62ccaca915b", null ] ]; \ No newline at end of file diff --git a/interfacebilinear__interp__mod_1_1interpolate__bilinear.html b/interfacebilinear__interp__mod_1_1interpolate__bilinear.html index cea3853c..2b51fcad 100644 --- a/interfacebilinear__interp__mod_1_1interpolate__bilinear.html +++ b/interfacebilinear__interp__mod_1_1interpolate__bilinear.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: bilinear_interp_mod::interpolate_bilinear Interface Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,46 +76,49 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
bilinear_interp_mod::interpolate_bilinear Interface Reference
+Public Member Functions
+
bilinear_interp_mod::interpolate_bilinear Interface Reference
- - - - - - - + + + + + + +

-Private Member Functions

subroutine interpolate_bilinear_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
 This subprogram performs bilinear interpolation from any grid to any grid for scalar fields. More...
 
subroutine interpolate_bilinear_vector (ipopt, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
 This subprogram performs bilinear interpolation from any grid to any grid for vector fields. More...
 

+Public Member Functions

subroutine interpolate_bilinear_scalar (ipopt, grid_in, grid_out, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
 This subprogram performs bilinear interpolation from any grid to any grid for scalar fields.
 
subroutine interpolate_bilinear_vector (ipopt, grid_in, grid_out, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
 This subprogram performs bilinear interpolation from any grid to any grid for vector fields.
 

Detailed Description

Definition at line 19 of file bilinear_interp_mod.F90.

Member Function/Subroutine Documentation

- -

◆ interpolate_bilinear_scalar()

+ +

◆ interpolate_bilinear_scalar()

- - - - + - + - + - + - + - + - + @@ -195,7 +201,7 @@

diff --git a/spgradx_8f.js b/spgradx_8f.js index b419f805..c6a529e8 100644 --- a/spgradx_8f.js +++ b/spgradx_8f.js @@ -1,4 +1,4 @@ var spgradx_8f = [ - [ "spgradx", "spgradx_8f.html#a749bc07e763e9cd44490fff2284d00b4", null ] + [ "spgradx", "spgradx_8f.html#ab0028bbf9c3fd5bc674ee1309af4e5eb", null ] ]; \ No newline at end of file diff --git a/spgradx_8f_source.html b/spgradx_8f_source.html index 32de9c2d..df41f7ef 100644 --- a/spgradx_8f_source.html +++ b/spgradx_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spgradx.f Source File @@ -23,10 +23,9 @@

- + @@ -133,79 +136,79 @@

- + - + - + - + - + - + - + - + - + - + - + - + - + @@ -213,11 +216,6 @@

-private -

-
subroutine bilinear_interp_mod::interpolate_bilinear::interpolate_bilinear_scalar ( integer, dimension(20), intent(in) IPOPT, ipopt,
integer, intent(in) MI, mi,
integer, intent(in) MO, mo,
integer, intent(in) KM, km,
integer, dimension(km), intent(in) IBI, ibi,
logical*1, dimension(mi,km), intent(in) LI, li,
real, dimension(mi,km), intent(in) GI, gi,
integer, intent(inout) NO, no,
real, dimension(mo), intent(inout) RLAT, rlat,
real, dimension(mo), intent(inout) RLON, rlon,
integer, dimension(km), intent(out) IBO, ibo,
logical*1, dimension(mo,km), intent(out) LO, lo,
real, dimension(mo,km), intent(out) GO, go,
integer, intent(out) IRET iret 

This subprogram performs bilinear interpolation from any grid to any grid for scalar fields.

@@ -260,14 +258,11 @@

-

◆ interpolate_bilinear_vector()

+ +

◆ interpolate_bilinear_vector()

- - - - + - + - + - + - + - + - + - + - + - + @@ -182,7 +188,7 @@

Computes the horizontal vector gradient of a scalar field in spectral space.

-

Subprogram speps() should be called already.

+

Subprogram speps() should be called already.

If l is the zonal wavenumber, n is the total wavenumber, eps(l,n)=sqrt((n**2-l**2)/(4*n**2-1)) and a is earth radius, then the zonal gradient of q(l,n) is simply i*l/a*q(l,n) while the meridional gradient of q(l,n) is computed as eps(l,n+1)*(n+2)/a*q(l,n+1)-eps(l,n+1)*(n-1)/a*q(l,n-1).

Extra terms are computed over top of the spectral domain.

Advantage is taken of the fact that eps(l,l)=0 in order to vectorize over the entire spectral domain.

@@ -214,7 +220,7 @@

diff --git a/spgradq_8f.js b/spgradq_8f.js index f2dc8b8f..850628a2 100644 --- a/spgradq_8f.js +++ b/spgradq_8f.js @@ -1,4 +1,4 @@ var spgradq_8f = [ - [ "spgradq", "spgradq_8f.html#a0bb358cf2a405ce9f17c6e5dfde65849", null ] + [ "spgradq", "spgradq_8f.html#a467a372e742d413302011b932c54add5", null ] ]; \ No newline at end of file diff --git a/spgradq_8f_source.html b/spgradq_8f_source.html index b1b29ede..4f68b4d0 100644 --- a/spgradq_8f_source.html +++ b/spgradq_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spgradq.f Source File @@ -23,10 +23,9 @@

@@ -291,103 +286,103 @@

- + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -395,11 +390,6 @@

-private -

-
subroutine bilinear_interp_mod::interpolate_bilinear::interpolate_bilinear_vector integer, intent(in) MI, mi,
integer, intent(in) MO, mo,
integer, intent(in) KM, km,
integer, dimension(km), intent(in) IBI, ibi,
logical*1, dimension(mi,km), intent(in) LI, li,
real, dimension(mi,km), intent(in) UI, ui,
real, dimension(mi,km), intent(in) VI, vi,
integer, intent(inout) NO, no,
real, dimension(mo), intent(inout) RLAT, rlat,
real, dimension(mo), intent(inout) RLON, rlon,
real, dimension(mo), intent(inout) CROT, crot,
real, dimension(mo), intent(inout) SROT, srot,
integer, dimension(km), intent(out) IBO, ibo,
logical*1, dimension(mo,km), intent(out) LO, lo,
real, dimension(mo,km), intent(out) UO, uo,
real, dimension(mo,km), intent(out) VO, vo,
integer, intent(out) IRET iret 
diff --git a/interfacebilinear__interp__mod_1_1interpolate__bilinear.js b/interfacebilinear__interp__mod_1_1interpolate__bilinear.js index 0aa40a0e..ab24af28 100644 --- a/interfacebilinear__interp__mod_1_1interpolate__bilinear.js +++ b/interfacebilinear__interp__mod_1_1interpolate__bilinear.js @@ -1,5 +1,5 @@ var interfacebilinear__interp__mod_1_1interpolate__bilinear = [ - [ "interpolate_bilinear_scalar", "interfacebilinear__interp__mod_1_1interpolate__bilinear.html#a3493cf5bc04aa4551ffd4c314ef09a65", null ], - [ "interpolate_bilinear_vector", "interfacebilinear__interp__mod_1_1interpolate__bilinear.html#ab4692c5250b37325f764b38c570892dd", null ] + [ "interpolate_bilinear_scalar", "interfacebilinear__interp__mod_1_1interpolate__bilinear.html#a8a01c7ed66b653334323a04269804397", null ], + [ "interpolate_bilinear_vector", "interfacebilinear__interp__mod_1_1interpolate__bilinear.html#a64b1b712b28b055aa00853b8565a77af", null ] ]; \ No newline at end of file diff --git a/interfacebudget__interp__mod_1_1interpolate__budget.html b/interfacebudget__interp__mod_1_1interpolate__budget.html index 1df3948f..9a0bab45 100644 --- a/interfacebudget__interp__mod_1_1interpolate__budget.html +++ b/interfacebudget__interp__mod_1_1interpolate__budget.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: budget_interp_mod::interpolate_budget Interface Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,46 +76,49 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
budget_interp_mod::interpolate_budget Interface Reference
+Public Member Functions
+
budget_interp_mod::interpolate_budget Interface Reference
- - - - - - - + + + + + + +

-Private Member Functions

subroutine interpolate_budget_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
 Performs budget interpolation from any grid to any grid (or to random station points) for scalar fields. More...
 
subroutine interpolate_budget_vector (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
 This subprogram performs budget interpolation from any grid to any grid (or to random station points) for vector fields. More...
 

+Public Member Functions

subroutine interpolate_budget_scalar (ipopt, grid_in, grid_out, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
 Performs budget interpolation from any grid to any grid (or to random station points) for scalar fields.
 
subroutine interpolate_budget_vector (ipopt, grid_in, grid_out, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
 This subprogram performs budget interpolation from any grid to any grid (or to random station points) for vector fields.
 

Detailed Description

Definition at line 21 of file budget_interp_mod.F90.

Member Function/Subroutine Documentation

- -

◆ interpolate_budget_scalar()

+ +

◆ interpolate_budget_scalar()

- - - - + - + - + - + - + - + - + - + @@ -199,7 +205,7 @@

diff --git a/spfftpt_8f.js b/spfftpt_8f.js index a4e4b804..2ba64257 100644 --- a/spfftpt_8f.js +++ b/spfftpt_8f.js @@ -1,4 +1,4 @@ var spfftpt_8f = [ - [ "spfftpt", "spfftpt_8f.html#ad16e674ce87bd762a714853967f81356", null ] + [ "spfftpt", "spfftpt_8f.html#a82df3b5012df147c3800b974e5d7acb0", null ] ]; \ No newline at end of file diff --git a/spfftpt_8f_source.html b/spfftpt_8f_source.html index d5574160..1f6ff5c7 100644 --- a/spfftpt_8f_source.html +++ b/spfftpt_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spfftpt.f Source File @@ -23,10 +23,9 @@

- + @@ -133,79 +136,79 @@

- + - + - + - + - + - + - + - + - + - + - + - + - + @@ -213,11 +216,6 @@

-private -

-
subroutine budget_interp_mod::interpolate_budget::interpolate_budget_scalar ( integer, dimension(20), intent(in) IPOPT, ipopt,
integer, intent(in) MI, mi,
integer, intent(in) MO, mo,
integer, intent(in) KM, km,
integer, dimension(km), intent(in) IBI, ibi,
logical*1, dimension(mi,km), intent(in) LI, li,
real, dimension(mi,km), intent(in) GI, gi,
integer, intent(out) NO, no,
real, dimension(mo), intent(inout) RLAT, rlat,
real, dimension(mo), intent(inout) RLON, rlon,
integer, dimension(km), intent(out) IBO, ibo,
logical*1, dimension(mo,km), intent(out) LO, lo,
real, dimension(mo,km), intent(out) GO, go,
integer, intent(out) IRET iret 

Performs budget interpolation from any grid to any grid (or to random station points) for scalar fields.

@@ -268,20 +266,17 @@

-

◆ interpolate_budget_vector()

+ +

◆ interpolate_budget_vector()

- - - - + - + - + - + - + - + - + - + @@ -180,7 +186,7 @@

This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space and real values in cyclic physical space.

-

This subprogram must be invoked first with IDIR=0 to initialize trigonemetric data. Use subprogram spfft1() to perform an FFT without previous initialization.

+

This subprogram must be invoked first with IDIR=0 to initialize trigonemetric data. Use subprogram spfft1() to perform an FFT without previous initialization.

This version invokes the IBM ESSL FFT.

Note
The restrictions on IMAX are that it must be a multiple of 1 to 25 factors of two, up to 2 factors of three, and up to 1 factor of five, seven and eleven.

If IDIR=0, then W and G need not contain any valid data. The other parameters must be supplied and cannot change in succeeding calls until the next time it is called with IDIR=0.

@@ -220,7 +226,7 @@

diff --git a/spffte_8f.js b/spffte_8f.js index 34e90bee..cca5960e 100644 --- a/spffte_8f.js +++ b/spffte_8f.js @@ -1,4 +1,4 @@ var spffte_8f = [ - [ "spffte", "spffte_8f.html#af06489254bd3e99030b39744fce32233", null ] + [ "spffte", "spffte_8f.html#a43c20f83dc852608b07953dc93249e77", null ] ]; \ No newline at end of file diff --git a/spffte_8f_source.html b/spffte_8f_source.html index 69d39699..acdb3d05 100644 --- a/spffte_8f_source.html +++ b/spffte_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spffte.f Source File @@ -23,10 +23,9 @@

- + @@ -299,103 +294,103 @@

- + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -403,11 +398,6 @@

-private -

-
subroutine budget_interp_mod::interpolate_budget::interpolate_budget_vector ( integer, dimension(20), intent(in) IPOPT, ipopt,
integer, intent(in) MI, mi,
integer, intent(in) MO, mo,
integer, intent(in) KM, km,
integer, dimension(km), intent(in) IBI, ibi,
logical*1, dimension(mi,km), intent(in) LI, li,
real, dimension(mi,km), intent(in) UI, ui,
real, dimension(mi,km), intent(in) VI, vi,
integer, intent(out) NO, no,
real, dimension(mo), intent(inout) RLAT, rlat,
real, dimension(mo), intent(inout) RLON, rlon,
real, dimension(mo), intent(out) CROT, crot,
real, dimension(mo), intent(out) SROT, srot,
integer, dimension(km), intent(out) IBO, ibo,
logical*1, dimension(mo,km), intent(out) LO, lo,
real, dimension(mo,km), intent(out) UO, uo,
real, dimension(mo,km), intent(out) VO, vo,
integer, intent(out) IRET iret 
diff --git a/interfacebudget__interp__mod_1_1interpolate__budget.js b/interfacebudget__interp__mod_1_1interpolate__budget.js index 6c0949c3..48ac6db2 100644 --- a/interfacebudget__interp__mod_1_1interpolate__budget.js +++ b/interfacebudget__interp__mod_1_1interpolate__budget.js @@ -1,5 +1,5 @@ var interfacebudget__interp__mod_1_1interpolate__budget = [ - [ "interpolate_budget_scalar", "interfacebudget__interp__mod_1_1interpolate__budget.html#a4b96cbeedb86ef43b687f7ea55914ef0", null ], - [ "interpolate_budget_vector", "interfacebudget__interp__mod_1_1interpolate__budget.html#a573e89e56381d0f69e4022d791a087e6", null ] + [ "interpolate_budget_scalar", "interfacebudget__interp__mod_1_1interpolate__budget.html#a07565b436222bfac667edaa8cb7a2803", null ], + [ "interpolate_budget_vector", "interfacebudget__interp__mod_1_1interpolate__budget.html#af711182f60f606e74d2c147f5d41d3d4", null ] ]; \ No newline at end of file diff --git a/interfacegdswzd__mod_1_1gdswzd.html b/interfacegdswzd__mod_1_1gdswzd.html index 48da6fe0..547e9ef2 100644 --- a/interfacegdswzd__mod_1_1gdswzd.html +++ b/interfacegdswzd__mod_1_1gdswzd.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: gdswzd_mod::gdswzd Interface Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,160 +76,163 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
gdswzd_mod::gdswzd Interface Reference
+Public Member Functions
+
gdswzd_mod::gdswzd Interface Reference
- - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +

-Private Member Functions

subroutine gdswzd_1d_array (IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
 Decodes the grib 2 grid definition template and returns one of the following: More...
 
subroutine gdswzd_2d_array (IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
 Decodes the grib 2 grid definition template and returns one of the following (for 2d-arrays): More...
 
subroutine gdswzd_2d_array_grib1 (KGDS, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
 Decodes the grib grid description section and returns one of the following (for 2-d arrays): More...
 
subroutine gdswzd_grib1 (KGDS, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
 Decodes the grib grid description section and returns one of the following (for 1-d arrays): More...
 
subroutine gdswzd_grid (grid, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
 Returns one of the following for a grid object: More...
 
subroutine gdswzd_scalar (IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
 Decodes the grib 2 grid definition template and returns one of the following (for scalars): More...
 

+Public Member Functions

subroutine gdswzd_1d_array (igdtnum, igdtmpl, igdtlen, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
 Decodes the grib 2 grid definition template and returns one of the following:
 
subroutine gdswzd_2d_array (igdtnum, igdtmpl, igdtlen, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
 Decodes the grib 2 grid definition template and returns one of the following (for 2d-arrays):
 
subroutine gdswzd_2d_array_grib1 (kgds, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
 Decodes the grib grid description section and returns one of the following (for 2-d arrays):
 
subroutine gdswzd_grib1 (kgds, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
 Decodes the grib grid description section and returns one of the following (for 1-d arrays):
 
subroutine gdswzd_grid (grid, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
 Returns one of the following for a grid object:
 
subroutine gdswzd_scalar (igdtnum, igdtmpl, igdtlen, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
 Decodes the grib 2 grid definition template and returns one of the following (for scalars):
 

Detailed Description

Definition at line 37 of file gdswzd_mod.F90.

Member Function/Subroutine Documentation

- -

◆ gdswzd_1d_array()

+ +

◆ gdswzd_1d_array()

- - - - + - + - + - + - + - + - + @@ -200,7 +206,7 @@

diff --git a/spfft_8f.js b/spfft_8f.js index f458e16b..acd2a357 100644 --- a/spfft_8f.js +++ b/spfft_8f.js @@ -1,4 +1,4 @@ var spfft_8f = [ - [ "spfft", "spfft_8f.html#a1041af8ac4f6a2407b5b7a799a13fb5d", null ] + [ "spfft", "spfft_8f.html#a9fddc81853658762b6e4e30b7b07a2fd", null ] ]; \ No newline at end of file diff --git a/spfft_8f_source.html b/spfft_8f_source.html index 8fbb20e0..7aa45f8d 100644 --- a/spfft_8f_source.html +++ b/spfft_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spfft.f Source File @@ -23,10 +23,9 @@

- + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -237,11 +240,6 @@

-private -

-
subroutine gdswzd_mod::gdswzd::gdswzd_1d_array ( integer, intent(in) IGDTNUM, igdtnum,
integer, dimension(igdtlen), intent(in) IGDTMPL, igdtmpl,
integer, intent(in) IGDTLEN, igdtlen,
integer, intent(in) IOPT, iopt,
integer, intent(in) NPTS, npts,
real, intent(in) FILL, fill,
real, dimension(npts), intent(inout) XPTS, xpts,
real, dimension(npts), intent(inout) YPTS, ypts,
real, dimension(npts), intent(inout) RLON, rlon,
real, dimension(npts), intent(inout) RLAT, rlat,
integer, intent(out) NRET, nret,
real, dimension(npts), intent(out), optional CROT, crot,
real, dimension(npts), intent(out), optional SROT, srot,
real, dimension(npts), intent(out), optional XLON, xlon,
real, dimension(npts), intent(out), optional XLAT, xlat,
real, dimension(npts), intent(out), optional YLON, ylon,
real, dimension(npts), intent(out), optional YLAT, ylat,
real, dimension(npts), intent(out), optional AREA area 

Decodes the grib 2 grid definition template and returns one of the following:

@@ -412,122 +410,119 @@

-

◆ gdswzd_2d_array()

+ +

◆ gdswzd_2d_array()

- - - - + - + - + - + - + - + - + @@ -164,7 +170,7 @@

This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space and real values in cyclic physical space.

-

Subprogram spfft1() initializes trigonometric data each call. Use subprogram spfft() to save time and initialize once. This version invokes the IBM ESSL FFT.

+

Subprogram spfft1() initializes trigonometric data each call. Use subprogram spfft() to save time and initialize once. This version invokes the IBM ESSL FFT.

Note
The restrictions on IMAX are that it must be a multiple of 1 to 25 factors of two, up to 2 factors of three, and up to 1 factor of five, seven and eleven.
This subprogram is thread-safe.
@@ -199,7 +205,7 @@

diff --git a/spfft1_8f.js b/spfft1_8f.js index d459d959..bd7da445 100644 --- a/spfft1_8f.js +++ b/spfft1_8f.js @@ -1,4 +1,4 @@ var spfft1_8f = [ - [ "spfft1", "spfft1_8f.html#ac63643472eda83948c0b249b611346d6", null ] + [ "spfft1", "spfft1_8f.html#a9f909dc53dc57a0778c0ca5193d5de8b", null ] ]; \ No newline at end of file diff --git a/spfft1_8f_source.html b/spfft1_8f_source.html index 7e233e21..00b29486 100644 --- a/spfft1_8f_source.html +++ b/spfft1_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spfft1.f Source File @@ -23,10 +23,9 @@

- + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -535,11 +530,6 @@

-private -

-
subroutine gdswzd_mod::gdswzd::gdswzd_2d_array ( integer, intent(in) IGDTNUM, igdtnum,
integer, dimension(igdtlen), intent(in) IGDTMPL, igdtmpl,
integer, intent(in) IGDTLEN, igdtlen,
integer, intent(in) IOPT, iopt,
integer, intent(in) NPTS, npts,
real, intent(in) FILL, fill,
real, dimension(:,:), intent(inout) XPTS, xpts,
real, dimension(:,:), intent(inout) YPTS, ypts,
real, dimension(:,:), intent(inout) RLON, rlon,
real, dimension(:,:), intent(inout) RLAT, rlat,
integer, intent(out) NRET, nret,
real, dimension(:,:), intent(out), optional CROT, crot,
real, dimension(:,:), intent(out), optional SROT, srot,
real, dimension(:,:), intent(out), optional XLON, xlon,
real, dimension(:,:), intent(out), optional XLAT, xlat,
real, dimension(:,:), intent(out), optional YLON, ylon,
real, dimension(:,:), intent(out), optional YLAT, ylat,
real, dimension(:,:), intent(out), optional AREA area 

Decodes the grib 2 grid definition template and returns one of the following (for 2d-arrays):

@@ -564,7 +554,7 @@

Parameters
- + - + - + - + - + - + - + - + - + @@ -204,7 +210,7 @@

diff --git a/speps_8f.js b/speps_8f.js index 48596d4c..ef3fd63d 100644 --- a/speps_8f.js +++ b/speps_8f.js @@ -1,4 +1,4 @@ var speps_8f = [ - [ "speps", "speps_8f.html#a0ab523ec5e1393ffca970897e63a9131", null ] + [ "speps", "speps_8f.html#a0644425aa925c36d91d5b588278e03fa", null ] ]; \ No newline at end of file diff --git a/speps_8f_source.html b/speps_8f_source.html index 27153cbd..9796ab27 100644 --- a/speps_8f_source.html +++ b/speps_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: speps.f Source File @@ -23,10 +23,9 @@

[in]igdtnumGrid definition template number.
[in]igdtmplGrid definition template array. Corresponds to the gfldigdtmpl component of the NCEPLIBS-g2 gridmod data structure. See igdtmpl definition in gdswzd_1d_array() for full details.
[in]igdtmplGrid definition template array. Corresponds to the gfldigdtmpl component of the NCEPLIBS-g2 gridmod data structure. See igdtmpl definition in gdswzd_1d_array() for full details.
[in]igdtlenNumber of elements of the grid definition template array. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
[in]ioptOption flag. (  I, i,
 M, m,
real, dimension((m+1)*((i+1)*m+2)/2) EPS, eps,
real, dimension(m+1) EPSTOP, epstop,
real, dimension((m+1)*((i+1)*m+2)/2) ENN1, enn1,
real, dimension((m+1)*((i+1)*m+2)/2) ELONN1, elonn1,
real, dimension((m+1)*((i+1)*m+2)/2) EON, eon,
real, dimension(m+1) EONTOP eontop 
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0

- + +/* @license-end */ + +
@@ -76,77 +81,85 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
speps.f
+
speps.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Compute utility spectral fields.
-
3 C> @author Iredell @date 92-10-31
-
4 
-
5 C> Computes constant fields indexed in the spectral domain
-
6 C> in "IBM ORDER" (Zonal wavenumber is the slower index).
-
7 C>
-
8 C> If L is the zonal wavenumber and N is the total wavenumber
-
9 C> and A is the earth radius, then the fields returned are:
-
10 C> - (1) normalizing factor EPSILON=SQRT((N**2-L**2)/(4*N**2-1))
-
11 C> - (2) Laplacian factor N*(N+1)/A**2
-
12 C> - (3) zonal derivative/Laplacian factor L/(N*(N+1))*A
-
13 C> - (4) Meridional derivative/Laplacian factor EPSILON/N*A
-
14 C>
-
15 C> @param I spectral domain shape (0 for triangular, 1 for rhomboidal)
-
16 C> @param M spectral truncation
-
17 C> @param EPS ((M+1)*((I+1)*M+2)/2) SQRT((N**2-L**2)/(4*N**2-1))
-
18 C> @param EPSTOP (M+1) SQRT((N**2-L**2)/(4*N**2-1)) OVER TOP
-
19 C> @param ENN1 ((M+1)*((I+1)*M+2)/2) N*(N+1)/A**2
-
20 C> @param ELONN1 ((M+1)*((I+1)*M+2)/2) L/(N*(N+1))*A
-
21 C> @param EON ((M+1)*((I+1)*M+2)/2) EPSILON/N*A
-
22 C> @param EONTOP (M+1) EPSILON/N*A OVER TOP
-
23 C>
-
24 C> @author Iredell @date 92-10-31
-
25  SUBROUTINE speps(I,M,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP)
-
26  REAL EPS((M+1)*((I+1)*M+2)/2),EPSTOP(M+1)
-
27  REAL ENN1((M+1)*((I+1)*M+2)/2),ELONN1((M+1)*((I+1)*M+2)/2)
-
28  REAL EON((M+1)*((I+1)*M+2)/2),EONTOP(M+1)
-
29  parameter(rerth=6.3712e6,ra2=1./rerth**2)
-
30 
-
31  DO l=0,m
-
32  k=l*(2*m+(i-1)*(l-1))/2+l+1
-
33  eps(k)=0.
-
34  enn1(k)=ra2*l*(l+1)
-
35  elonn1(k)=rerth/(l+1)
-
36  eon(k)=0.
-
37  ENDDO
-
38  DO l=0,m
-
39  DO n=l+1,i*l+m
-
40  k=l*(2*m+(i-1)*(l-1))/2+n+1
-
41  eps(k)=sqrt(float(n**2-l**2)/float(4*n**2-1))
-
42  enn1(k)=ra2*n*(n+1)
-
43  elonn1(k)=rerth*l/(n*(n+1))
-
44  eon(k)=rerth/n*eps(k)
-
45  ENDDO
-
46  ENDDO
-
47  DO l=0,m
-
48  n=i*l+m+1
-
49  epstop(l+1)=sqrt(float(n**2-l**2)/float(4*n**2-1))
-
50  eontop(l+1)=rerth/n*epstop(l+1)
-
51  ENDDO
-
52  RETURN
-
53  END
-
subroutine speps(I, M, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
Computes constant fields indexed in the spectral domain in "IBM ORDER" (Zonal wavenumber is the slowe...
Definition: speps.f:26
+Go to the documentation of this file.
1C> @file
+
2C> @brief Compute utility spectral fields.
+
3C> @author Iredell @date 92-10-31
+
4
+
5C> Computes constant fields indexed in the spectral domain
+
6C> in "IBM ORDER" (Zonal wavenumber is the slower index).
+
7C>
+
8C> If L is the zonal wavenumber and N is the total wavenumber
+
9C> and A is the earth radius, then the fields returned are:
+
10C> - (1) normalizing factor EPSILON=SQRT((N**2-L**2)/(4*N**2-1))
+
11C> - (2) Laplacian factor N*(N+1)/A**2
+
12C> - (3) zonal derivative/Laplacian factor L/(N*(N+1))*A
+
13C> - (4) Meridional derivative/Laplacian factor EPSILON/N*A
+
14C>
+
15C> @param I spectral domain shape (0 for triangular, 1 for rhomboidal)
+
16C> @param M spectral truncation
+
17C> @param EPS ((M+1)*((I+1)*M+2)/2) SQRT((N**2-L**2)/(4*N**2-1))
+
18C> @param EPSTOP (M+1) SQRT((N**2-L**2)/(4*N**2-1)) OVER TOP
+
19C> @param ENN1 ((M+1)*((I+1)*M+2)/2) N*(N+1)/A**2
+
20C> @param ELONN1 ((M+1)*((I+1)*M+2)/2) L/(N*(N+1))*A
+
21C> @param EON ((M+1)*((I+1)*M+2)/2) EPSILON/N*A
+
22C> @param EONTOP (M+1) EPSILON/N*A OVER TOP
+
23C>
+
24C> @author Iredell @date 92-10-31
+
+
25 SUBROUTINE speps(I,M,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP)
+
26 REAL EPS((M+1)*((I+1)*M+2)/2),EPSTOP(M+1)
+
27 REAL ENN1((M+1)*((I+1)*M+2)/2),ELONN1((M+1)*((I+1)*M+2)/2)
+
28 REAL EON((M+1)*((I+1)*M+2)/2),EONTOP(M+1)
+
29 parameter(rerth=6.3712e6,ra2=1./rerth**2)
+
30
+
31 DO l=0,m
+
32 k=l*(2*m+(i-1)*(l-1))/2+l+1
+
33 eps(k)=0.
+
34 enn1(k)=ra2*l*(l+1)
+
35 elonn1(k)=rerth/(l+1)
+
36 eon(k)=0.
+
37 ENDDO
+
38 DO l=0,m
+
39 DO n=l+1,i*l+m
+
40 k=l*(2*m+(i-1)*(l-1))/2+n+1
+
41 eps(k)=sqrt(float(n**2-l**2)/float(4*n**2-1))
+
42 enn1(k)=ra2*n*(n+1)
+
43 elonn1(k)=rerth*l/(n*(n+1))
+
44 eon(k)=rerth/n*eps(k)
+
45 ENDDO
+
46 ENDDO
+
47 DO l=0,m
+
48 n=i*l+m+1
+
49 epstop(l+1)=sqrt(float(n**2-l**2)/float(4*n**2-1))
+
50 eontop(l+1)=rerth/n*epstop(l+1)
+
51 ENDDO
+
52 RETURN
+
+
53 END
+
subroutine speps(i, m, eps, epstop, enn1, elonn1, eon, eontop)
Computes constant fields indexed in the spectral domain in "IBM ORDER" (Zonal wavenumber is the slowe...
Definition speps.f:26
diff --git a/spfft1_8f.html b/spfft1_8f.html index 1aae07f9..8991f507 100644 --- a/spfft1_8f.html +++ b/spfft1_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spfft1.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
spfft1.f File Reference
+
spfft1.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine spfft1 (IMAX, INCW, INCG, KMAX, W, G, IDIR)
 This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space and real values in cyclic physical space. More...
 
subroutine spfft1 (imax, incw, incg, kmax, w, g, idir)
 This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space and real values in cyclic physical space.
 

Detailed Description

Perform multiple fast Fourier transforms.

@@ -107,8 +113,8 @@

Definition in file spfft1.f.

Function/Subroutine Documentation

- -

◆ spfft1()

+ +

◆ spfft1()

@@ -117,43 +123,43 @@

subroutine spfft1

( integer, intent(in) IMAX, imax,
integer, intent(in) INCW, incw,
integer, intent(in) INCG, incg,
integer, intent(in) KMAX, kmax,
complex, dimension(incw,kmax), intent(inout) W, w,
real, dimension(incg,kmax), intent(inout) G, g,
integer, intent(in) IDIR idir 
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,88 +81,96 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
spfft1.f
+
spfft1.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Perform multiple fast Fourier transforms.
-
3 C> @author Iredell @date 96-02-20
-
4 
-
5 C> This subprogram performs multiple fast Fourier transforms
-
6 C> between complex amplitudes in Fourier space and real values
-
7 C> in cyclic physical space.
-
8 C>
-
9 C> Subprogram spfft1() initializes trigonometric data each call.
-
10 C> Use subprogram spfft() to save time and initialize once.
-
11 C> This version invokes the IBM ESSL FFT.
-
12 C>
-
13 C> @note The restrictions on IMAX are that it must be a multiple of 1
-
14 C> to 25 factors of two, up to 2 factors of three, and up to 1 factor of
-
15 C> five, seven and eleven.
-
16 C>
-
17 C> @note This subprogram is thread-safe.
-
18 C>
-
19 C> @param IMAX number of values in the cyclic physical space
-
20 C> (see limitations on imax in remarks below.)
-
21 C> @param INCW first dimension of the complex amplitude array
-
22 C> (INCW >= IMAX/2+1)
-
23 C> @param INCG first dimension of the real value array (INCG >= IMAX)
-
24 C> @param KMAX number of transforms to perform
-
25 C> @param[out] W complex amplitudes if IDIR>0
-
26 C> @param[out] G values if IDIR<0
-
27 C> @param IDIR direction flag
-
28 C> - IDIR>0 to transform from Fourier to physical space
-
29 C> - IDIR<0 to transform from physical to Fourier space
-
30 C>
-
31 C> @author Iredell @date 96-02-20
-
32  SUBROUTINE spfft1(IMAX,INCW,INCG,KMAX,W,G,IDIR)
-
33  IMPLICIT NONE
-
34  INTEGER,INTENT(IN):: IMAX,INCW,INCG,KMAX,IDIR
-
35  COMPLEX,INTENT(INOUT):: W(INCW,KMAX)
-
36  REAL:: WREAL(INCW,KMAX)
-
37  REAL,INTENT(INOUT):: G(INCG,KMAX)
-
38  REAL:: AUX1(25000+INT(0.82*IMAX))
-
39  REAL:: AUX2(20000+INT(0.57*IMAX))
-
40  INTEGER:: NAUX1,NAUX2
-
41 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
42  naux1=25000+int(0.82*imax)
-
43  naux2=20000+int(0.57*imax)
-
44  wreal=real(w)
-
45 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
46 C FOURIER TO PHYSICAL TRANSFORM.
-
47  SELECT CASE(idir)
-
48  CASE(1:)
-
49  CALL scrft(1,real(w),incw,g,incg,imax,kmax,-1,1.,
-
50  & aux1,naux1,aux2,naux2,0.,0)
-
51  CALL scrft(0,real(w),incw,g,incg,imax,kmax,-1,1.,
-
52  & aux1,naux1,aux2,naux2,0.,0)
-
53 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
54 C PHYSICAL TO FOURIER TRANSFORM.
-
55  CASE(:-1)
-
56  CALL srcft(1,g,incg,wreal,incw,imax,kmax,+1,1./imax,
-
57  & aux1,naux1,aux2,naux2,0.,0)
-
58  CALL srcft(0,g,incg,wreal,incw,imax,kmax,+1,1./imax,
-
59  & aux1,naux1,aux2,naux2,0.,0)
-
60  END SELECT
-
61  w=cmplx(wreal,0.0)
-
62  END SUBROUTINE
-
subroutine scrft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
scrft
Definition: fftpack.F:82
-
subroutine srcft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
srcft
Definition: fftpack.F:215
-
subroutine spfft1(IMAX, INCW, INCG, KMAX, W, G, IDIR)
This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space...
Definition: spfft1.f:33
+Go to the documentation of this file.
1C> @file
+
2C> @brief Perform multiple fast Fourier transforms.
+
3C> @author Iredell @date 96-02-20
+
4
+
5C> This subprogram performs multiple fast Fourier transforms
+
6C> between complex amplitudes in Fourier space and real values
+
7C> in cyclic physical space.
+
8C>
+
9C> Subprogram spfft1() initializes trigonometric data each call.
+
10C> Use subprogram spfft() to save time and initialize once.
+
11C> This version invokes the IBM ESSL FFT.
+
12C>
+
13C> @note The restrictions on IMAX are that it must be a multiple of 1
+
14C> to 25 factors of two, up to 2 factors of three, and up to 1 factor of
+
15C> five, seven and eleven.
+
16C>
+
17C> @note This subprogram is thread-safe.
+
18C>
+
19C> @param IMAX number of values in the cyclic physical space
+
20C> (see limitations on imax in remarks below.)
+
21C> @param INCW first dimension of the complex amplitude array
+
22C> (INCW >= IMAX/2+1)
+
23C> @param INCG first dimension of the real value array (INCG >= IMAX)
+
24C> @param KMAX number of transforms to perform
+
25C> @param[out] W complex amplitudes if IDIR>0
+
26C> @param[out] G values if IDIR<0
+
27C> @param IDIR direction flag
+
28C> - IDIR>0 to transform from Fourier to physical space
+
29C> - IDIR<0 to transform from physical to Fourier space
+
30C>
+
31C> @author Iredell @date 96-02-20
+
+
32 SUBROUTINE spfft1(IMAX,INCW,INCG,KMAX,W,G,IDIR)
+
33 IMPLICIT NONE
+
34 INTEGER,INTENT(IN):: IMAX,INCW,INCG,KMAX,IDIR
+
35 COMPLEX,INTENT(INOUT):: W(INCW,KMAX)
+
36 REAL:: WREAL(INCW,KMAX)
+
37 REAL,INTENT(INOUT):: G(INCG,KMAX)
+
38 REAL:: AUX1(25000+INT(0.82*IMAX))
+
39 REAL:: AUX2(20000+INT(0.57*IMAX))
+
40 INTEGER:: NAUX1,NAUX2
+
41C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
42 naux1=25000+int(0.82*imax)
+
43 naux2=20000+int(0.57*imax)
+
44 wreal=real(w)
+
45C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
46C FOURIER TO PHYSICAL TRANSFORM.
+
47 SELECT CASE(idir)
+
48 CASE(1:)
+
49 CALL scrft(1,real(w),incw,g,incg,imax,kmax,-1,1.,
+
50 & aux1,naux1,aux2,naux2,0.,0)
+
51 CALL scrft(0,real(w),incw,g,incg,imax,kmax,-1,1.,
+
52 & aux1,naux1,aux2,naux2,0.,0)
+
53C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
54C PHYSICAL TO FOURIER TRANSFORM.
+
55 CASE(:-1)
+
56 CALL srcft(1,g,incg,wreal,incw,imax,kmax,+1,1./imax,
+
57 & aux1,naux1,aux2,naux2,0.,0)
+
58 CALL srcft(0,g,incg,wreal,incw,imax,kmax,+1,1./imax,
+
59 & aux1,naux1,aux2,naux2,0.,0)
+
60 END SELECT
+
61 w=cmplx(wreal,0.0)
+
+
62 END SUBROUTINE
+
subroutine scrft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
scrft
Definition fftpack.F:82
+
subroutine srcft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
srcft
Definition fftpack.F:215
+
subroutine spfft1(imax, incw, incg, kmax, w, g, idir)
This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space...
Definition spfft1.f:33
diff --git a/spfft_8f.html b/spfft_8f.html index 6bc0daab..7ef9b303 100644 --- a/spfft_8f.html +++ b/spfft_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spfft.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
spfft.f File Reference
+
spfft.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine spfft (IMAX, INCW, INCG, KMAX, W, G, IDIR)
 This subprogram performs multiple fast fourier transforms between complex amplitudes in fourier space and real values in cyclic physical space. More...
 
subroutine spfft (imax, incw, incg, kmax, w, g, idir)
 This subprogram performs multiple fast fourier transforms between complex amplitudes in fourier space and real values in cyclic physical space.
 

Detailed Description

Perform multiple fast fourier transforms.

@@ -107,8 +113,8 @@

Definition in file spfft.f.

Function/Subroutine Documentation

- -

◆ spfft()

+ +

◆ spfft()

@@ -117,43 +123,43 @@

subroutine spfft

( integer, intent(in) IMAX, imax,
integer, intent(in) INCW, incw,
integer, intent(in) INCG, incg,
integer, intent(in) KMAX, kmax,
complex, dimension(incw,kmax), intent(inout) W, w,
real, dimension(incg,kmax), intent(inout) G, g,
integer, intent(in) IDIR idir 
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,104 +81,112 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
spfft.f
+
spfft.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Perform multiple fast fourier transforms.
-
3 C> @author Iredell @date 96-02-20
-
4 
-
5 C> This subprogram performs multiple fast fourier transforms
-
6 C> between complex amplitudes in fourier space and real values
-
7 C> in cyclic physical space.
-
8 C>
-
9 C> Subprogram spfft must be invoked first with idir=0
-
10 C> to initialize trigonemetric data. Use subprogram spfft1
-
11 C> to perform an fft without previous initialization.
-
12 C> This version invokes the ibm essl fft.
-
13 C>
-
14 C> The restrictions on imax are that it must be a multiple
-
15 C> of 1 to 25 factors of two, up to 2 factors of three,
-
16 C> and up to 1 factor of five, seven and eleven.
-
17 C>
-
18 C> If IDIR=0, then W and G need not contain any valid data.
-
19 C> the other parameters must be supplied and cannot change
-
20 C> in succeeding calls until the next time it is called with IDIR=0.
-
21 C>
-
22 C> This subprogram is not thread-safe when IDIR=0. On the other hand,
-
23 C> when IDIR is not zero, it can be called from a threaded region.
-
24 C>
-
25 C> @param IMAX number of values in the cyclic physical space
-
26 C> (see limitations on imax in remarks below.)
-
27 C> @param INCW first dimension of the complex amplitude array
-
28 C> (INCW >= IMAX/2+1)
-
29 C> @param INCG first dimension of the real value array
-
30 C> (INCG >= IMAX)
-
31 C> @param KMAX number of transforms to perform
-
32 C> @param[out] W complex amplitudes if IDIR>0
-
33 C> @param[out] G real values if IDIR<0
-
34 C> @param IDIR direction flag
-
35 C> - IDIR=0 to initialize internal trigonometric data
-
36 C> - IDIR>0 TO transform from Fourier to physical space
-
37 C> - IDIR<0 TO transform from physical to fourier space
-
38 C>
-
39 C> @author Iredell @date 96-02-20
-
40  SUBROUTINE spfft(IMAX,INCW,INCG,KMAX,W,G,IDIR)
-
41 
-
42  IMPLICIT NONE
-
43  INTEGER,INTENT(IN):: IMAX,INCW,INCG,KMAX,IDIR
-
44  COMPLEX,INTENT(INOUT):: W(INCW,KMAX)
-
45  REAL:: WREAL(INCW,KMAX)
-
46  REAL,INTENT(INOUT):: G(INCG,KMAX)
-
47  INTEGER,SAVE:: NAUX1=0
-
48  REAL,SAVE,ALLOCATABLE:: AUX1CR(:),AUX1RC(:)
-
49  INTEGER:: NAUX2
-
50  REAL:: AUX2(20000+INT(0.57*IMAX))
-
51 
-
52  naux2=20000+int(0.57*imax)
-
53 
-
54  wreal=real(w)
-
55 C INITIALIZATION.
-
56 C ALLOCATE AND FILL AUXILIARY ARRAYS WITH TRIGONOMETRIC DATA
-
57  SELECT CASE(idir)
-
58  CASE(0)
-
59  IF(naux1.GT.0) DEALLOCATE(aux1cr,aux1rc)
-
60  naux1=25000+int(0.82*imax)
-
61  ALLOCATE(aux1cr(naux1),aux1rc(naux1))
-
62  CALL scrft(1,wreal,incw,g,incg,imax,kmax,-1,1.,
-
63  & aux1cr,naux1,aux2,naux2,0.,0)
-
64  CALL srcft(1,g,incg,wreal,incw,imax,kmax,+1,1./imax,
-
65  & aux1rc,naux1,aux2,naux2,0.,0)
-
66 
-
67 C FOURIER TO PHYSICAL TRANSFORM.
-
68  CASE(1:)
-
69  CALL scrft(0,wreal,incw,g,incg,imax,kmax,-1,1.,
-
70  & aux1cr,naux1,aux2,naux2,0.,0)
-
71 
-
72 C PHYSICAL TO FOURIER TRANSFORM.
-
73  CASE(:-1)
-
74  CALL srcft(0,g,incg,wreal,incw,imax,kmax,+1,1./imax,
-
75  & aux1rc,naux1,aux2,naux2,0.,0)
-
76  END SELECT
-
77  w=cmplx(wreal)
-
78  END SUBROUTINE
-
subroutine scrft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
scrft
Definition: fftpack.F:82
-
subroutine srcft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
srcft
Definition: fftpack.F:215
-
subroutine spfft(IMAX, INCW, INCG, KMAX, W, G, IDIR)
This subprogram performs multiple fast fourier transforms between complex amplitudes in fourier space...
Definition: spfft.f:41
+Go to the documentation of this file.
1C> @file
+
2C> @brief Perform multiple fast fourier transforms.
+
3C> @author Iredell @date 96-02-20
+
4
+
5C> This subprogram performs multiple fast fourier transforms
+
6C> between complex amplitudes in fourier space and real values
+
7C> in cyclic physical space.
+
8C>
+
9C> Subprogram spfft must be invoked first with idir=0
+
10C> to initialize trigonemetric data. Use subprogram spfft1
+
11C> to perform an fft without previous initialization.
+
12C> This version invokes the ibm essl fft.
+
13C>
+
14C> The restrictions on imax are that it must be a multiple
+
15C> of 1 to 25 factors of two, up to 2 factors of three,
+
16C> and up to 1 factor of five, seven and eleven.
+
17C>
+
18C> If IDIR=0, then W and G need not contain any valid data.
+
19C> the other parameters must be supplied and cannot change
+
20C> in succeeding calls until the next time it is called with IDIR=0.
+
21C>
+
22C> This subprogram is not thread-safe when IDIR=0. On the other hand,
+
23C> when IDIR is not zero, it can be called from a threaded region.
+
24C>
+
25C> @param IMAX number of values in the cyclic physical space
+
26C> (see limitations on imax in remarks below.)
+
27C> @param INCW first dimension of the complex amplitude array
+
28C> (INCW >= IMAX/2+1)
+
29C> @param INCG first dimension of the real value array
+
30C> (INCG >= IMAX)
+
31C> @param KMAX number of transforms to perform
+
32C> @param[out] W complex amplitudes if IDIR>0
+
33C> @param[out] G real values if IDIR<0
+
34C> @param IDIR direction flag
+
35C> - IDIR=0 to initialize internal trigonometric data
+
36C> - IDIR>0 TO transform from Fourier to physical space
+
37C> - IDIR<0 TO transform from physical to fourier space
+
38C>
+
39C> @author Iredell @date 96-02-20
+
+
40 SUBROUTINE spfft(IMAX,INCW,INCG,KMAX,W,G,IDIR)
+
41
+
42 IMPLICIT NONE
+
43 INTEGER,INTENT(IN):: IMAX,INCW,INCG,KMAX,IDIR
+
44 COMPLEX,INTENT(INOUT):: W(INCW,KMAX)
+
45 REAL:: WREAL(INCW,KMAX)
+
46 REAL,INTENT(INOUT):: G(INCG,KMAX)
+
47 INTEGER,SAVE:: NAUX1=0
+
48 REAL,SAVE,ALLOCATABLE:: AUX1CR(:),AUX1RC(:)
+
49 INTEGER:: NAUX2
+
50 REAL:: AUX2(20000+INT(0.57*IMAX))
+
51
+
52 naux2=20000+int(0.57*imax)
+
53
+
54 wreal=real(w)
+
55C INITIALIZATION.
+
56C ALLOCATE AND FILL AUXILIARY ARRAYS WITH TRIGONOMETRIC DATA
+
57 SELECT CASE(idir)
+
58 CASE(0)
+
59 IF(naux1.GT.0) DEALLOCATE(aux1cr,aux1rc)
+
60 naux1=25000+int(0.82*imax)
+
61 ALLOCATE(aux1cr(naux1),aux1rc(naux1))
+
62 CALL scrft(1,wreal,incw,g,incg,imax,kmax,-1,1.,
+
63 & aux1cr,naux1,aux2,naux2,0.,0)
+
64 CALL srcft(1,g,incg,wreal,incw,imax,kmax,+1,1./imax,
+
65 & aux1rc,naux1,aux2,naux2,0.,0)
+
66
+
67C FOURIER TO PHYSICAL TRANSFORM.
+
68 CASE(1:)
+
69 CALL scrft(0,wreal,incw,g,incg,imax,kmax,-1,1.,
+
70 & aux1cr,naux1,aux2,naux2,0.,0)
+
71
+
72C PHYSICAL TO FOURIER TRANSFORM.
+
73 CASE(:-1)
+
74 CALL srcft(0,g,incg,wreal,incw,imax,kmax,+1,1./imax,
+
75 & aux1rc,naux1,aux2,naux2,0.,0)
+
76 END SELECT
+
77 w=cmplx(wreal)
+
+
78 END SUBROUTINE
+
subroutine scrft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
scrft
Definition fftpack.F:82
+
subroutine srcft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
srcft
Definition fftpack.F:215
+
subroutine spfft(imax, incw, incg, kmax, w, g, idir)
This subprogram performs multiple fast fourier transforms between complex amplitudes in fourier space...
Definition spfft.f:41
diff --git a/spffte_8f.html b/spffte_8f.html index 4710a7b0..8fc5b9a1 100644 --- a/spffte_8f.html +++ b/spffte_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spffte.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
spffte.f File Reference
+
spffte.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine spffte (IMAX, INCW, INCG, KMAX, W, G, IDIR, AFFT)
 This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space and real values in cyclic physical space. More...
 
subroutine spffte (imax, incw, incg, kmax, w, g, idir, afft)
 This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space and real values in cyclic physical space.
 

Detailed Description

Perform multiple fast Fourier transforms.

@@ -117,8 +123,8 @@

Definition in file spffte.f.

Function/Subroutine Documentation

- -

◆ spffte()

+ +

◆ spffte()

@@ -127,49 +133,49 @@

subroutine spffte

( integer, intent(in) IMAX, imax,
integer, intent(in) INCW, incw,
integer, intent(in) INCG, incg,
integer, intent(in) KMAX, kmax,
real, dimension(2*incw,kmax), intent(inout) W, w,
real, dimension(incg,kmax), intent(inout) G, g,
integer, intent(in) IDIR, idir,
real(8), dimension(50000+4*imax), intent(inout) AFFT afft 
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,164 +81,172 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
spffte.f
+
spffte.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Perform multiple fast Fourier transforms.
-
3 C>
-
4 C> ### Program History Log
-
5 C> Date | Programmer | Comments
-
6 C> -----|------------|---------
-
7 C> 1998-12-18 | Iredell | Initial.
-
8 C> 2012-11-12 | Mirvis | fixing hard-wired types problem on Intel/Linux.
-
9 C>
-
10 C> @author Iredell @date 96-02-20
-
11 
-
12 C> This subprogram performs multiple fast Fourier transforms
-
13 C> between complex amplitudes in Fourier space and real values
-
14 C> in cyclic physical space.
-
15 C>
-
16 C> This subprogram must be invoked first with IDIR=0
-
17 C> to initialize trigonemetric data. Use subprogram spfft1()
-
18 C> to perform an FFT without previous initialization.
-
19 C>
-
20 C> This version invokes the IBM ESSL FFT.
-
21 C>
-
22 C> @note The restrictions on IMAX are that it must be a multiple
-
23 C> of 1 to 25 factors of two, up to 2 factors of three,
-
24 C> and up to 1 factor of five, seven and eleven.
-
25 C>
-
26 C> If IDIR=0, then W and G need not contain any valid data.
-
27 C> The other parameters must be supplied and cannot change
-
28 C> in succeeding calls until the next time it is called with IDIR=0.
-
29 C>
-
30 C> This subprogram is thread-safe.
-
31 C>
-
32 C> @param IMAX number of values in the cyclic physical space
-
33 C> (see limitations on imax in remarks below.)
-
34 C> @param INCW first dimension of the complex amplitude array
-
35 C> (INCW >= IMAX/2+1)
-
36 C> @param INCG first dimension of the real value array
-
37 C> (INCG >= IMAX)
-
38 C> @param KMAX number of transforms to perform
-
39 C> @param[out] W complex amplitudes if IDIR>0
-
40 C> @param[out] G real values if IDIR<0
-
41 C> @param IDIR direction flag
-
42 C> - IDIR=0 to initialize trigonometric data
-
43 C> - IDIR>0 to transform from Fourier to physical space
-
44 C> - IDIR<0 to transform from physical to Fourier space
-
45 C> @param[out] AFFT auxiliary array if IDIR<>0
-
46 C>
-
47 C> @author Iredell @date 96-02-20
-
48  SUBROUTINE spffte(IMAX,INCW,INCG,KMAX,W,G,IDIR,AFFT)
-
49  IMPLICIT NONE
-
50  INTEGER,INTENT(IN):: IMAX,INCW,INCG,KMAX,IDIR
-
51  REAL,INTENT(INOUT):: W(2*INCW,KMAX)
-
52  REAL,INTENT(INOUT):: G(INCG,KMAX)
-
53  REAL(8),INTENT(INOUT):: AFFT(50000+4*IMAX)
-
54  REAL:: AFFTR(50000+4*IMAX)
-
55  INTEGER:: INIT,INC2X,INC2Y,N,M,ISIGN,NAUX1,NAUX2,NAUX3
-
56 C ==EM== ^(4)
-
57  REAL:: SCALE
-
58  REAL :: AUX2(20000+2*IMAX),AUX3
-
59  INTEGER:: IACR,IARC
-
60 
-
61  naux1=25000+2*imax
-
62  naux2=20000+2*imax
-
63  naux3=1
-
64  iacr=1
-
65  iarc=1+naux1
-
66  afftr=real(afft)
-
67 
-
68 C INITIALIZATION.
-
69 C FILL AUXILIARY ARRAYS WITH TRIGONOMETRIC DATA
-
70  SELECT CASE(idir)
-
71  CASE(0)
-
72  init=1
-
73  inc2x=incw
-
74  inc2y=incg
-
75  n=imax
-
76  m=kmax
-
77  isign=-1
-
78  scale=1.
-
79  IF(digits(1.).LT.digits(1._8)) THEN
-
80  CALL scrft(init,w,inc2x,g,inc2y,n,m,isign,scale,
-
81  & afftr(iacr),naux1,aux2,naux2,aux3,naux3)
-
82  ELSE
-
83  CALL dcrft(init,w,inc2x,g,inc2y,n,m,isign,scale,
-
84  & afftr(iacr),naux1,aux2,naux2)
-
85  ENDIF
-
86  init=1
-
87  inc2x=incg
-
88  inc2y=incw
-
89  n=imax
-
90  m=kmax
-
91  isign=+1
-
92  scale=1./imax
-
93  IF(digits(1.).LT.digits(1._8)) THEN
-
94  CALL srcft(init,g,inc2x,w,inc2y,n,m,isign,scale,
-
95  & afftr(iarc),naux1,aux2,naux2,aux3,naux3)
-
96  ELSE
-
97  CALL drcft(init,g,inc2x,w,inc2y,n,m,isign,scale,
-
98  & afftr(iarc),naux1,aux2,naux2)
-
99  ENDIF
-
100 
-
101 C FOURIER TO PHYSICAL TRANSFORM.
-
102  CASE(1:)
-
103  init=0
-
104  inc2x=incw
-
105  inc2y=incg
-
106  n=imax
-
107  m=kmax
-
108  isign=-1
-
109  scale=1.
-
110  IF(digits(1.).LT.digits(1._8)) THEN
-
111  CALL scrft(init,w,inc2x,g,inc2y,n,m,isign,scale,
-
112  & afftr(iacr),naux1,aux2,naux2,aux3,naux3)
-
113  ELSE
-
114  CALL dcrft(init,w,inc2x,g,inc2y,n,m,isign,scale,
-
115  & afftr(iacr),naux1,aux2,naux2)
-
116  ENDIF
-
117 
-
118 C PHYSICAL TO FOURIER TRANSFORM.
-
119  CASE(:-1)
-
120  init=0
-
121  inc2x=incg
-
122  inc2y=incw
-
123  n=imax
-
124  m=kmax
-
125  isign=+1
-
126  scale=1./imax
-
127  IF(digits(1.).LT.digits(1._8)) THEN
-
128  CALL srcft(init,g,inc2x,w,inc2y,n,m,isign,scale,
-
129  & afftr(iarc),naux1,aux2,naux2,aux3,naux3)
-
130  ELSE
-
131  CALL drcft(init,g,inc2x,w,inc2y,n,m,isign,scale,
-
132  & afftr(iarc),naux1,aux2,naux2)
-
133  ENDIF
-
134  END SELECT
-
135  afft=real(afftr,kind=8)
-
136  END SUBROUTINE
-
subroutine drcft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
drcft
Definition: fftpack.F:164
-
subroutine dcrft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
dcrft
Definition: fftpack.F:34
-
subroutine scrft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
scrft
Definition: fftpack.F:82
-
subroutine srcft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
srcft
Definition: fftpack.F:215
-
subroutine spffte(IMAX, INCW, INCG, KMAX, W, G, IDIR, AFFT)
This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space...
Definition: spffte.f:49
+Go to the documentation of this file.
1C> @file
+
2C> @brief Perform multiple fast Fourier transforms.
+
3C>
+
4C> ### Program History Log
+
5C> Date | Programmer | Comments
+
6C> -----|------------|---------
+
7C> 1998-12-18 | Iredell | Initial.
+
8C> 2012-11-12 | Mirvis | fixing hard-wired types problem on Intel/Linux.
+
9C>
+
10C> @author Iredell @date 96-02-20
+
11
+
12C> This subprogram performs multiple fast Fourier transforms
+
13C> between complex amplitudes in Fourier space and real values
+
14C> in cyclic physical space.
+
15C>
+
16C> This subprogram must be invoked first with IDIR=0
+
17C> to initialize trigonemetric data. Use subprogram spfft1()
+
18C> to perform an FFT without previous initialization.
+
19C>
+
20C> This version invokes the IBM ESSL FFT.
+
21C>
+
22C> @note The restrictions on IMAX are that it must be a multiple
+
23C> of 1 to 25 factors of two, up to 2 factors of three,
+
24C> and up to 1 factor of five, seven and eleven.
+
25C>
+
26C> If IDIR=0, then W and G need not contain any valid data.
+
27C> The other parameters must be supplied and cannot change
+
28C> in succeeding calls until the next time it is called with IDIR=0.
+
29C>
+
30C> This subprogram is thread-safe.
+
31C>
+
32C> @param IMAX number of values in the cyclic physical space
+
33C> (see limitations on imax in remarks below.)
+
34C> @param INCW first dimension of the complex amplitude array
+
35C> (INCW >= IMAX/2+1)
+
36C> @param INCG first dimension of the real value array
+
37C> (INCG >= IMAX)
+
38C> @param KMAX number of transforms to perform
+
39C> @param[out] W complex amplitudes if IDIR>0
+
40C> @param[out] G real values if IDIR<0
+
41C> @param IDIR direction flag
+
42C> - IDIR=0 to initialize trigonometric data
+
43C> - IDIR>0 to transform from Fourier to physical space
+
44C> - IDIR<0 to transform from physical to Fourier space
+
45C> @param[out] AFFT auxiliary array if IDIR<>0
+
46C>
+
47C> @author Iredell @date 96-02-20
+
+
48 SUBROUTINE spffte(IMAX,INCW,INCG,KMAX,W,G,IDIR,AFFT)
+
49 IMPLICIT NONE
+
50 INTEGER,INTENT(IN):: IMAX,INCW,INCG,KMAX,IDIR
+
51 REAL,INTENT(INOUT):: W(2*INCW,KMAX)
+
52 REAL,INTENT(INOUT):: G(INCG,KMAX)
+
53 REAL(8),INTENT(INOUT):: AFFT(50000+4*IMAX)
+
54 REAL:: AFFTR(50000+4*IMAX)
+
55 INTEGER:: INIT,INC2X,INC2Y,N,M,ISIGN,NAUX1,NAUX2,NAUX3
+
56C ==EM== ^(4)
+
57 REAL:: SCALE
+
58 REAL :: AUX2(20000+2*IMAX),AUX3
+
59 INTEGER:: IACR,IARC
+
60
+
61 naux1=25000+2*imax
+
62 naux2=20000+2*imax
+
63 naux3=1
+
64 iacr=1
+
65 iarc=1+naux1
+
66 afftr=real(afft)
+
67
+
68C INITIALIZATION.
+
69C FILL AUXILIARY ARRAYS WITH TRIGONOMETRIC DATA
+
70 SELECT CASE(idir)
+
71 CASE(0)
+
72 init=1
+
73 inc2x=incw
+
74 inc2y=incg
+
75 n=imax
+
76 m=kmax
+
77 isign=-1
+
78 scale=1.
+
79 IF(digits(1.).LT.digits(1._8)) THEN
+
80 CALL scrft(init,w,inc2x,g,inc2y,n,m,isign,scale,
+
81 & afftr(iacr),naux1,aux2,naux2,aux3,naux3)
+
82 ELSE
+
83 CALL dcrft(init,w,inc2x,g,inc2y,n,m,isign,scale,
+
84 & afftr(iacr),naux1,aux2,naux2)
+
85 ENDIF
+
86 init=1
+
87 inc2x=incg
+
88 inc2y=incw
+
89 n=imax
+
90 m=kmax
+
91 isign=+1
+
92 scale=1./imax
+
93 IF(digits(1.).LT.digits(1._8)) THEN
+
94 CALL srcft(init,g,inc2x,w,inc2y,n,m,isign,scale,
+
95 & afftr(iarc),naux1,aux2,naux2,aux3,naux3)
+
96 ELSE
+
97 CALL drcft(init,g,inc2x,w,inc2y,n,m,isign,scale,
+
98 & afftr(iarc),naux1,aux2,naux2)
+
99 ENDIF
+
100
+
101C FOURIER TO PHYSICAL TRANSFORM.
+
102 CASE(1:)
+
103 init=0
+
104 inc2x=incw
+
105 inc2y=incg
+
106 n=imax
+
107 m=kmax
+
108 isign=-1
+
109 scale=1.
+
110 IF(digits(1.).LT.digits(1._8)) THEN
+
111 CALL scrft(init,w,inc2x,g,inc2y,n,m,isign,scale,
+
112 & afftr(iacr),naux1,aux2,naux2,aux3,naux3)
+
113 ELSE
+
114 CALL dcrft(init,w,inc2x,g,inc2y,n,m,isign,scale,
+
115 & afftr(iacr),naux1,aux2,naux2)
+
116 ENDIF
+
117
+
118C PHYSICAL TO FOURIER TRANSFORM.
+
119 CASE(:-1)
+
120 init=0
+
121 inc2x=incg
+
122 inc2y=incw
+
123 n=imax
+
124 m=kmax
+
125 isign=+1
+
126 scale=1./imax
+
127 IF(digits(1.).LT.digits(1._8)) THEN
+
128 CALL srcft(init,g,inc2x,w,inc2y,n,m,isign,scale,
+
129 & afftr(iarc),naux1,aux2,naux2,aux3,naux3)
+
130 ELSE
+
131 CALL drcft(init,g,inc2x,w,inc2y,n,m,isign,scale,
+
132 & afftr(iarc),naux1,aux2,naux2)
+
133 ENDIF
+
134 END SELECT
+
135 afft=real(afftr,kind=8)
+
+
136 END SUBROUTINE
+
subroutine drcft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
drcft
Definition fftpack.F:164
+
subroutine dcrft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
dcrft
Definition fftpack.F:34
+
subroutine scrft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
scrft
Definition fftpack.F:82
+
subroutine srcft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
srcft
Definition fftpack.F:215
+
subroutine spffte(imax, incw, incg, kmax, w, g, idir, afft)
This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space...
Definition spffte.f:49
diff --git a/spfftpt_8f.html b/spfftpt_8f.html index 795ad261..d4ce5733 100644 --- a/spfftpt_8f.html +++ b/spfftpt_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spfftpt.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
spfftpt.f File Reference
+
spfftpt.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine spfftpt (M, N, INCW, INCG, KMAX, RLON, W, G)
 This subprogram computes a slow Fourier transform from Fourier space to a set of gridpoints. More...
 
subroutine spfftpt (m, n, incw, incg, kmax, rlon, w, g)
 This subprogram computes a slow Fourier transform from Fourier space to a set of gridpoints.
 

Detailed Description

Compute fourier transform to gridpoints.

@@ -107,8 +113,8 @@

Definition in file spfftpt.f.

Function/Subroutine Documentation

- -

◆ spfftpt()

+ +

◆ spfftpt()

@@ -117,49 +123,49 @@

subroutine spfftpt

( integer, intent(in) M, m,
integer, intent(in) N, n,
integer, intent(in) INCW, incw,
integer, intent(in) INCG, incg,
integer, intent(in) KMAX, kmax,
real, dimension(n), intent(in) RLON, rlon,
real, dimension(2*incw,kmax), intent(in) W, w,
real, dimension(incg,kmax), intent(out) G g 
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,72 +81,80 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
spfftpt.f
+
spfftpt.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Compute fourier transform to gridpoints.
-
3 C> @author Iredell @date 96-02-20
-
4 
-
5 C> This subprogram computes a slow Fourier transform
-
6 C> from Fourier space to a set of gridpoints.
-
7 C>
-
8 C> @note This subprogram is thread-safe.
-
9 C>
-
10 C> @param M Fourier wavenumber truncation
-
11 C> @param N number of gridpoints
-
12 C> @param INCW first dimension of the complex amplitude array
-
13 C> (INCW >= M+1)
-
14 C> @param INCG first dimension of the gridpoint array
-
15 C> (INCG >= N)
-
16 C> @param KMAX number of Fourier fields
-
17 C> @param RLON grid longitudes in degrees
-
18 C> @param W Fourier amplitudes
-
19 C> @param G gridpoint values
-
20 C>
-
21 C> @author Iredell @date 96-02-20
-
22  SUBROUTINE spfftpt(M,N,INCW,INCG,KMAX,RLON,W,G)
-
23 
-
24  IMPLICIT NONE
-
25  INTEGER,INTENT(IN):: M,N,INCW,INCG,KMAX
-
26  REAL,INTENT(IN):: RLON(N)
-
27  REAL,INTENT(IN):: W(2*INCW,KMAX)
-
28  REAL,INTENT(OUT):: G(INCG,KMAX)
-
29  INTEGER I,K,L
-
30  REAL RADLON,SLON(M),CLON(M)
-
31  REAL,PARAMETER:: PI=3.14159265358979
-
32 
-
33  DO i=1,n
-
34  radlon=pi/180*rlon(i)
-
35  DO l=1,m
-
36  slon(l)=sin(l*radlon)
-
37  clon(l)=cos(l*radlon)
-
38  ENDDO
-
39  DO k=1,kmax
-
40  g(i,k)=w(1,k)
-
41  ENDDO
-
42  DO l=1,m
-
43  DO k=1,kmax
-
44  g(i,k)=g(i,k)+2.*(w(2*l+1,k)*clon(l)-w(2*l+2,k)*slon(l))
-
45  ENDDO
-
46  ENDDO
-
47  ENDDO
-
48  END SUBROUTINE
-
subroutine spfftpt(M, N, INCW, INCG, KMAX, RLON, W, G)
This subprogram computes a slow Fourier transform from Fourier space to a set of gridpoints.
Definition: spfftpt.f:23
+Go to the documentation of this file.
1C> @file
+
2C> @brief Compute fourier transform to gridpoints.
+
3C> @author Iredell @date 96-02-20
+
4
+
5C> This subprogram computes a slow Fourier transform
+
6C> from Fourier space to a set of gridpoints.
+
7C>
+
8C> @note This subprogram is thread-safe.
+
9C>
+
10C> @param M Fourier wavenumber truncation
+
11C> @param N number of gridpoints
+
12C> @param INCW first dimension of the complex amplitude array
+
13C> (INCW >= M+1)
+
14C> @param INCG first dimension of the gridpoint array
+
15C> (INCG >= N)
+
16C> @param KMAX number of Fourier fields
+
17C> @param RLON grid longitudes in degrees
+
18C> @param W Fourier amplitudes
+
19C> @param G gridpoint values
+
20C>
+
21C> @author Iredell @date 96-02-20
+
+
22 SUBROUTINE spfftpt(M,N,INCW,INCG,KMAX,RLON,W,G)
+
23
+
24 IMPLICIT NONE
+
25 INTEGER,INTENT(IN):: M,N,INCW,INCG,KMAX
+
26 REAL,INTENT(IN):: RLON(N)
+
27 REAL,INTENT(IN):: W(2*INCW,KMAX)
+
28 REAL,INTENT(OUT):: G(INCG,KMAX)
+
29 INTEGER I,K,L
+
30 REAL RADLON,SLON(M),CLON(M)
+
31 REAL,PARAMETER:: PI=3.14159265358979
+
32
+
33 DO i=1,n
+
34 radlon=pi/180*rlon(i)
+
35 DO l=1,m
+
36 slon(l)=sin(l*radlon)
+
37 clon(l)=cos(l*radlon)
+
38 ENDDO
+
39 DO k=1,kmax
+
40 g(i,k)=w(1,k)
+
41 ENDDO
+
42 DO l=1,m
+
43 DO k=1,kmax
+
44 g(i,k)=g(i,k)+2.*(w(2*l+1,k)*clon(l)-w(2*l+2,k)*slon(l))
+
45 ENDDO
+
46 ENDDO
+
47 ENDDO
+
+
48 END SUBROUTINE
+
subroutine spfftpt(m, n, incw, incg, kmax, rlon, w, g)
This subprogram computes a slow Fourier transform from Fourier space to a set of gridpoints.
Definition spfftpt.f:23
diff --git a/spgradq_8f.html b/spgradq_8f.html index b1495d40..a2f8f0b9 100644 --- a/spgradq_8f.html +++ b/spgradq_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spgradq.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
spgradq.f File Reference
+
spgradq.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine spgradq (I, M, ENN1, ELONN1, EON, EONTOP, Q, QDX, QDY, QDYTOP)
 Computes the horizontal vector gradient of a scalar field in spectral space. More...
 
subroutine spgradq (i, m, enn1, elonn1, eon, eontop, q, qdx, qdy, qdytop)
 Computes the horizontal vector gradient of a scalar field in spectral space.
 

Detailed Description

Compute gradient in spectral space.

@@ -107,8 +113,8 @@

Definition in file spgradq.f.

Function/Subroutine Documentation

- -

◆ spgradq()

+ +

◆ spgradq()

@@ -117,61 +123,61 @@

subroutine spgradq

(  I, i,
 M, m,
real, dimension((m+1)*((i+1)*m+2)/2) ENN1, enn1,
real, dimension((m+1)*((i+1)*m+2)/2) ELONN1, elonn1,
real, dimension((m+1)*((i+1)*m+2)/2) EON, eon,
real, dimension(m+1) EONTOP, eontop,
real, dimension((m+1)*((i+1)*m+2)) Q, q,
real, dimension((m+1)*((i+1)*m+2)) QDX, qdx,
real, dimension((m+1)*((i+1)*m+2)) QDY, qdy,
real, dimension(2*(m+1)) QDYTOP qdytop 
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,90 +81,98 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
spgradq.f
+
spgradq.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Compute gradient in spectral space.
-
3 C> @author Iredell @date 92-10-31
-
4 
-
5 C> Computes the horizontal vector gradient of a scalar field
-
6 C> in spectral space.
-
7 C>
-
8 C> Subprogram speps() should be called already.
-
9 C>
-
10 C> If l is the zonal wavenumber, n is the total wavenumber,
-
11 C> eps(l,n)=sqrt((n**2-l**2)/(4*n**2-1)) and a is earth radius,
-
12 C> then the zonal gradient of q(l,n) is simply i*l/a*q(l,n)
-
13 C> while the meridional gradient of q(l,n) is computed as
-
14 C> eps(l,n+1)*(n+2)/a*q(l,n+1)-eps(l,n+1)*(n-1)/a*q(l,n-1).
-
15 C>
-
16 C> Extra terms are computed over top of the spectral domain.
-
17 C>
-
18 C> Advantage is taken of the fact that eps(l,l)=0
-
19 C> in order to vectorize over the entire spectral domain.
-
20 C>
-
21 C> @param I spectral domain shape (0 for triangular, 1 for rhomboidal)
-
22 C> @param M spectral truncation
-
23 C> @param ENN1
-
24 C> @param ELONN1
-
25 C> @param EON EPSILON/N*A
-
26 C> @param EONTOP EPSILON/N*A over top
-
27 C> @param Q scalar field
-
28 C> @param QDX zonal gradient (times coslat)
-
29 C> @param QDY merid gradient (times coslat)
-
30 C> @param QDYTOP merid gradient (times coslat) over top
-
31 C>
-
32 C> @author IREDELL @date 92-10-31
-
33  SUBROUTINE spgradq(I,M,ENN1,ELONN1,EON,EONTOP,Q,QDX,QDY,QDYTOP)
-
34 
-
35  REAL ENN1((M+1)*((I+1)*M+2)/2),ELONN1((M+1)*((I+1)*M+2)/2)
-
36  REAL EON((M+1)*((I+1)*M+2)/2),EONTOP(M+1)
-
37  REAL Q((M+1)*((I+1)*M+2))
-
38  REAL QDX((M+1)*((I+1)*M+2)),QDY((M+1)*((I+1)*M+2))
-
39  REAL QDYTOP(2*(M+1))
-
40 
-
41 C TAKE ZONAL AND MERIDIONAL GRADIENTS
-
42  k=1
-
43  qdx(2*k-1)=0.
-
44  qdx(2*k)=0.
-
45  qdy(2*k-1)=eon(k+1)*enn1(k+1)*q(2*k+1)
-
46  qdy(2*k)=eon(k+1)*enn1(k+1)*q(2*k+2)
-
47  DO k=2,(m+1)*((i+1)*m+2)/2-1
-
48  qdx(2*k-1)=-elonn1(k)*enn1(k)*q(2*k)
-
49  qdx(2*k)=elonn1(k)*enn1(k)*q(2*k-1)
-
50  qdy(2*k-1)=eon(k+1)*enn1(k+1)*q(2*k+1)-eon(k)*enn1(k-1)*q(2*k-3)
-
51  qdy(2*k)=eon(k+1)*enn1(k+1)*q(2*k+2)-eon(k)*enn1(k-1)*q(2*k-2)
-
52  ENDDO
-
53  k=(m+1)*((i+1)*m+2)/2
-
54  qdx(2*k-1)=-elonn1(k)*enn1(k)*q(2*k)
-
55  qdx(2*k)=elonn1(k)*enn1(k)*q(2*k-1)
-
56  qdy(2*k-1)=-eon(k)*enn1(k-1)*q(2*k-3)
-
57  qdy(2*k)=-eon(k)*enn1(k-1)*q(2*k-2)
-
58 
-
59 C TAKE MERIDIONAL GRADIENT OVER TOP
-
60  DO l=0,m
-
61  k=l*(2*m+(i-1)*(l-1))/2+i*l+m+1
-
62  qdytop(2*l+1)=-eontop(l+1)*enn1(k)*q(2*k-1)
-
63  qdytop(2*l+2)=-eontop(l+1)*enn1(k)*q(2*k)
-
64  ENDDO
-
65  RETURN
-
66  END
-
subroutine spgradq(I, M, ENN1, ELONN1, EON, EONTOP, Q, QDX, QDY, QDYTOP)
Computes the horizontal vector gradient of a scalar field in spectral space.
Definition: spgradq.f:34
+Go to the documentation of this file.
1C> @file
+
2C> @brief Compute gradient in spectral space.
+
3C> @author Iredell @date 92-10-31
+
4
+
5C> Computes the horizontal vector gradient of a scalar field
+
6C> in spectral space.
+
7C>
+
8C> Subprogram speps() should be called already.
+
9C>
+
10C> If l is the zonal wavenumber, n is the total wavenumber,
+
11C> eps(l,n)=sqrt((n**2-l**2)/(4*n**2-1)) and a is earth radius,
+
12C> then the zonal gradient of q(l,n) is simply i*l/a*q(l,n)
+
13C> while the meridional gradient of q(l,n) is computed as
+
14C> eps(l,n+1)*(n+2)/a*q(l,n+1)-eps(l,n+1)*(n-1)/a*q(l,n-1).
+
15C>
+
16C> Extra terms are computed over top of the spectral domain.
+
17C>
+
18C> Advantage is taken of the fact that eps(l,l)=0
+
19C> in order to vectorize over the entire spectral domain.
+
20C>
+
21C> @param I spectral domain shape (0 for triangular, 1 for rhomboidal)
+
22C> @param M spectral truncation
+
23C> @param ENN1
+
24C> @param ELONN1
+
25C> @param EON EPSILON/N*A
+
26C> @param EONTOP EPSILON/N*A over top
+
27C> @param Q scalar field
+
28C> @param QDX zonal gradient (times coslat)
+
29C> @param QDY merid gradient (times coslat)
+
30C> @param QDYTOP merid gradient (times coslat) over top
+
31C>
+
32C> @author IREDELL @date 92-10-31
+
+
33 SUBROUTINE spgradq(I,M,ENN1,ELONN1,EON,EONTOP,Q,QDX,QDY,QDYTOP)
+
34
+
35 REAL ENN1((M+1)*((I+1)*M+2)/2),ELONN1((M+1)*((I+1)*M+2)/2)
+
36 REAL EON((M+1)*((I+1)*M+2)/2),EONTOP(M+1)
+
37 REAL Q((M+1)*((I+1)*M+2))
+
38 REAL QDX((M+1)*((I+1)*M+2)),QDY((M+1)*((I+1)*M+2))
+
39 REAL QDYTOP(2*(M+1))
+
40
+
41C TAKE ZONAL AND MERIDIONAL GRADIENTS
+
42 k=1
+
43 qdx(2*k-1)=0.
+
44 qdx(2*k)=0.
+
45 qdy(2*k-1)=eon(k+1)*enn1(k+1)*q(2*k+1)
+
46 qdy(2*k)=eon(k+1)*enn1(k+1)*q(2*k+2)
+
47 DO k=2,(m+1)*((i+1)*m+2)/2-1
+
48 qdx(2*k-1)=-elonn1(k)*enn1(k)*q(2*k)
+
49 qdx(2*k)=elonn1(k)*enn1(k)*q(2*k-1)
+
50 qdy(2*k-1)=eon(k+1)*enn1(k+1)*q(2*k+1)-eon(k)*enn1(k-1)*q(2*k-3)
+
51 qdy(2*k)=eon(k+1)*enn1(k+1)*q(2*k+2)-eon(k)*enn1(k-1)*q(2*k-2)
+
52 ENDDO
+
53 k=(m+1)*((i+1)*m+2)/2
+
54 qdx(2*k-1)=-elonn1(k)*enn1(k)*q(2*k)
+
55 qdx(2*k)=elonn1(k)*enn1(k)*q(2*k-1)
+
56 qdy(2*k-1)=-eon(k)*enn1(k-1)*q(2*k-3)
+
57 qdy(2*k)=-eon(k)*enn1(k-1)*q(2*k-2)
+
58
+
59C TAKE MERIDIONAL GRADIENT OVER TOP
+
60 DO l=0,m
+
61 k=l*(2*m+(i-1)*(l-1))/2+i*l+m+1
+
62 qdytop(2*l+1)=-eontop(l+1)*enn1(k)*q(2*k-1)
+
63 qdytop(2*l+2)=-eontop(l+1)*enn1(k)*q(2*k)
+
64 ENDDO
+
65 RETURN
+
+
66 END
+
subroutine spgradq(i, m, enn1, elonn1, eon, eontop, q, qdx, qdy, qdytop)
Computes the horizontal vector gradient of a scalar field in spectral space.
Definition spgradq.f:34
diff --git a/spgradx_8f.html b/spgradx_8f.html index f18a6604..73a728bc 100644 --- a/spgradx_8f.html +++ b/spgradx_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spgradx.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
spgradx.f File Reference
+
spgradx.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine spgradx (M, INCW, KMAX, MP, CLAT, W, WX)
 This subprogram computes the x-gradient of fields in complex Fourier space. More...
 
subroutine spgradx (m, incw, kmax, mp, clat, w, wx)
 This subprogram computes the x-gradient of fields in complex Fourier space.
 

Detailed Description

Compute x-gradient in Fourier space.

@@ -107,8 +113,8 @@

Definition in file spgradx.f.

Function/Subroutine Documentation

- -

◆ spgradx()

+ +

◆ spgradx()

@@ -117,43 +123,43 @@

subroutine spgradx

( integer, intent(in) M, m,
integer, intent(in) INCW, incw,
integer, intent(in) KMAX, kmax,
integer, dimension(kmax), intent(in) MP, mp,
real, intent(in) CLAT, clat,
real, dimension(2*incw,kmax), intent(inout) W, w,
real, dimension(2*incw,kmax), intent(out) WX wx 
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,96 +81,104 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
spgradx.f
+
spgradx.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Compute x-gradient in Fourier space
-
3 C> @author IREDELL @date 96-02-20
-
4 
-
5 C> This subprogram computes the x-gradient of fields
-
6 C> in complex Fourier space.
-
7 C>
-
8 C> The x-gradient of a vector field W is
-
9 C> WX=CONJG(W)*L/RERTH
-
10 C> where L is the wavenumber and RERTH is the Earth radius,
-
11 C> so that the result is the x-gradient of the pseudo-vector.
-
12 C>
-
13 C> The x-gradient of a scalar field W is
-
14 C> WX=CONJG(W)*L/(RERTH*CLAT)
-
15 C> where CLAT is the cosine of latitude.
-
16 C>
-
17 C> At the pole this is undefined, so the way to get
-
18 C> the x-gradient at the pole is by passing both
-
19 C> the weighted wavenumber 0 and the unweighted wavenumber 1
-
20 C> amplitudes at the pole and setting MP=10.
-
21 C> In this case, the wavenumber 1 amplitudes are used
-
22 C> to compute the x-gradient and then zeroed out.
-
23 C>
-
24 C> @note This subprogram is thread-safe.
-
25 C>
-
26 C> @param M Fourier wavenumber truncation
-
27 C> @param INCW first dimension of the complex amplitude array
-
28 C> (INCW >= M+1)
-
29 C> @param KMAX number of Fourier fields
-
30 C> @param MP identifiers
-
31 C> (0 or 10 for scalar, 1 for vector)
-
32 C> @param CLAT cosine of latitude
-
33 C> @param[out] W Fourier amplitudes corrected when MP=10 and CLAT=0
-
34 C> @param[out] WX complex amplitudes of x-gradients
-
35 C>
-
36 C> @author IREDELL @date 96-02-20
-
37  SUBROUTINE spgradx(M,INCW,KMAX,MP,CLAT,W,WX)
-
38 
-
39  IMPLICIT NONE
-
40  INTEGER,INTENT(IN):: M,INCW,KMAX,MP(KMAX)
-
41  REAL,INTENT(IN):: CLAT
-
42  REAL,INTENT(INOUT):: W(2*INCW,KMAX)
-
43  REAL,INTENT(OUT):: WX(2*INCW,KMAX)
-
44  INTEGER K,L
-
45  REAL,PARAMETER:: RERTH=6.3712e6
-
46 
-
47  DO k=1,kmax
-
48  IF(mp(k).EQ.1) THEN
-
49  DO l=0,m
-
50  wx(2*l+1,k)=-w(2*l+2,k)*(l/rerth)
-
51  wx(2*l+2,k)=+w(2*l+1,k)*(l/rerth)
-
52  ENDDO
-
53  ELSEIF(clat.EQ.0.) THEN
-
54  DO l=0,m
-
55  wx(2*l+1,k)=0
-
56  wx(2*l+2,k)=0
-
57  ENDDO
-
58  IF(mp(k).EQ.10.AND.m.GE.2) THEN
-
59  wx(3,k)=-w(4,k)/rerth
-
60  wx(4,k)=+w(3,k)/rerth
-
61  w(3,k)=0
-
62  w(4,k)=0
-
63  ENDIF
-
64  ELSE
-
65  DO l=0,m
-
66  wx(2*l+1,k)=-w(2*l+2,k)*(l/(rerth*clat))
-
67  wx(2*l+2,k)=+w(2*l+1,k)*(l/(rerth*clat))
-
68  ENDDO
-
69  ENDIF
-
70  ENDDO
-
71 
-
72  END SUBROUTINE
-
subroutine spgradx(M, INCW, KMAX, MP, CLAT, W, WX)
This subprogram computes the x-gradient of fields in complex Fourier space.
Definition: spgradx.f:38
+Go to the documentation of this file.
1C> @file
+
2C> @brief Compute x-gradient in Fourier space
+
3C> @author IREDELL @date 96-02-20
+
4
+
5C> This subprogram computes the x-gradient of fields
+
6C> in complex Fourier space.
+
7C>
+
8C> The x-gradient of a vector field W is
+
9C> WX=CONJG(W)*L/RERTH
+
10C> where L is the wavenumber and RERTH is the Earth radius,
+
11C> so that the result is the x-gradient of the pseudo-vector.
+
12C>
+
13C> The x-gradient of a scalar field W is
+
14C> WX=CONJG(W)*L/(RERTH*CLAT)
+
15C> where CLAT is the cosine of latitude.
+
16C>
+
17C> At the pole this is undefined, so the way to get
+
18C> the x-gradient at the pole is by passing both
+
19C> the weighted wavenumber 0 and the unweighted wavenumber 1
+
20C> amplitudes at the pole and setting MP=10.
+
21C> In this case, the wavenumber 1 amplitudes are used
+
22C> to compute the x-gradient and then zeroed out.
+
23C>
+
24C> @note This subprogram is thread-safe.
+
25C>
+
26C> @param M Fourier wavenumber truncation
+
27C> @param INCW first dimension of the complex amplitude array
+
28C> (INCW >= M+1)
+
29C> @param KMAX number of Fourier fields
+
30C> @param MP identifiers
+
31C> (0 or 10 for scalar, 1 for vector)
+
32C> @param CLAT cosine of latitude
+
33C> @param[out] W Fourier amplitudes corrected when MP=10 and CLAT=0
+
34C> @param[out] WX complex amplitudes of x-gradients
+
35C>
+
36C> @author IREDELL @date 96-02-20
+
+
37 SUBROUTINE spgradx(M,INCW,KMAX,MP,CLAT,W,WX)
+
38
+
39 IMPLICIT NONE
+
40 INTEGER,INTENT(IN):: M,INCW,KMAX,MP(KMAX)
+
41 REAL,INTENT(IN):: CLAT
+
42 REAL,INTENT(INOUT):: W(2*INCW,KMAX)
+
43 REAL,INTENT(OUT):: WX(2*INCW,KMAX)
+
44 INTEGER K,L
+
45 REAL,PARAMETER:: RERTH=6.3712e6
+
46
+
47 DO k=1,kmax
+
48 IF(mp(k).EQ.1) THEN
+
49 DO l=0,m
+
50 wx(2*l+1,k)=-w(2*l+2,k)*(l/rerth)
+
51 wx(2*l+2,k)=+w(2*l+1,k)*(l/rerth)
+
52 ENDDO
+
53 ELSEIF(clat.EQ.0.) THEN
+
54 DO l=0,m
+
55 wx(2*l+1,k)=0
+
56 wx(2*l+2,k)=0
+
57 ENDDO
+
58 IF(mp(k).EQ.10.AND.m.GE.2) THEN
+
59 wx(3,k)=-w(4,k)/rerth
+
60 wx(4,k)=+w(3,k)/rerth
+
61 w(3,k)=0
+
62 w(4,k)=0
+
63 ENDIF
+
64 ELSE
+
65 DO l=0,m
+
66 wx(2*l+1,k)=-w(2*l+2,k)*(l/(rerth*clat))
+
67 wx(2*l+2,k)=+w(2*l+1,k)*(l/(rerth*clat))
+
68 ENDDO
+
69 ENDIF
+
70 ENDDO
+
71
+
+
72 END SUBROUTINE
+
subroutine spgradx(m, incw, kmax, mp, clat, w, wx)
This subprogram computes the x-gradient of fields in complex Fourier space.
Definition spgradx.f:38
diff --git a/spgrady_8f.html b/spgrady_8f.html index fa75c33c..4f1680dd 100644 --- a/spgrady_8f.html +++ b/spgrady_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spgrady.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
spgrady.f File Reference
+
spgrady.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine spgrady (I, M, ENN1, EON, EONTOP, Q, QDY, QDYTOP)
 Computes the horizontal vector y-gradient of a scalar field in spectral space. More...
 
subroutine spgrady (i, m, enn1, eon, eontop, q, qdy, qdytop)
 Computes the horizontal vector y-gradient of a scalar field in spectral space.
 

Detailed Description

Compute y-gradient in spectral space.

@@ -107,8 +113,8 @@

Definition in file spgrady.f.

Function/Subroutine Documentation

- -

◆ spgrady()

+ +

◆ spgrady()

@@ -117,49 +123,49 @@

subroutine spgrady

(  I, i,
 M, m,
real, dimension((m+1)*((i+1)*m+2)/2) ENN1, enn1,
real, dimension((m+1)*((i+1)*m+2)/2) EON, eon,
real, dimension(m+1) EONTOP, eontop,
real, dimension((m+1)*((i+1)*m+2)) Q, q,
real, dimension((m+1)*((i+1)*m+2)) QDY, qdy,
real, dimension(2*(m+1)) QDYTOP qdytop 
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,83 +81,91 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
spgrady.f
+
spgrady.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Compute y-gradient in spectral space.
-
3 C> @author IREDELL @date 92-10-31
-
4 
-
5 C> Computes the horizontal vector y-gradient of a scalar field
-
6 c> in spectral space.
-
7 C>
-
8 C> Subprogram speps should be called already.
-
9 C>
-
10 C> If L is the zonal wavenumber, N is the total wavenumber,
-
11 C> EPS(L,N)=SQRT((N**2-L**2)/(4*N**2-1)) and A is Earth radius,
-
12 C> then the meridional gradient of Q(L,N) is computed as
-
13 C> EPS(L,N+1)*(N+2)/A*Q(L,N+1)-EPS(L,N+1)*(N-1)/A*Q(L,N-1).
-
14 C>
-
15 C> Extra terms are computed over top of the spectral domain.
-
16 C>
-
17 C> Advantage is taken of the fact that EPS(L,L)=0
-
18 C> in order to vectorize over the entire spectral domain.
-
19 C>
-
20 C> @param I spectral domain shape
-
21 c> (0 for triangular, 1 for rhomboidal)
-
22 C> @param M spectral truncation
-
23 C> @param ENN1 N*(N+1)/A**2
-
24 C> @param EON EPSILON/N*A
-
25 C> @param EONTOP EPSILON/N*A over top
-
26 C> @param Q scalar field
-
27 C> @param QDY merid gradient (times coslat)
-
28 C> @param QDYTOP merid gradient (times coslat) over top
-
29 C>
-
30 C> @author IREDELL @date 92-10-31
-
31  SUBROUTINE spgrady(I,M,ENN1,EON,EONTOP,Q,QDY,QDYTOP)
-
32 
-
33  REAL ENN1((M+1)*((I+1)*M+2)/2)
-
34  REAL EON((M+1)*((I+1)*M+2)/2),EONTOP(M+1)
-
35  REAL Q((M+1)*((I+1)*M+2))
-
36  REAL QDY((M+1)*((I+1)*M+2))
-
37  REAL QDYTOP(2*(M+1))
-
38 
-
39 C TAKE MERIDIONAL GRADIENT
-
40  k=1
-
41  qdy(2*k-1)=eon(k+1)*enn1(k+1)*q(2*k+1)
-
42  qdy(2*k)=eon(k+1)*enn1(k+1)*q(2*k+2)
-
43  DO k=2,(m+1)*((i+1)*m+2)/2-1
-
44  qdy(2*k-1)=eon(k+1)*enn1(k+1)*q(2*k+1)-eon(k)*enn1(k-1)*q(2*k-3)
-
45  qdy(2*k)=eon(k+1)*enn1(k+1)*q(2*k+2)-eon(k)*enn1(k-1)*q(2*k-2)
-
46  ENDDO
-
47  k=(m+1)*((i+1)*m+2)/2
-
48  qdy(2*k-1)=-eon(k)*enn1(k-1)*q(2*k-3)
-
49  qdy(2*k)=-eon(k)*enn1(k-1)*q(2*k-2)
-
50 
-
51 C TAKE MERIDIONAL GRADIENT OVER TOP
-
52  DO l=0,m
-
53  k=l*(2*m+(i-1)*(l-1))/2+i*l+m+1
-
54  qdytop(2*l+1)=-eontop(l+1)*enn1(k)*q(2*k-1)
-
55  qdytop(2*l+2)=-eontop(l+1)*enn1(k)*q(2*k)
-
56  ENDDO
-
57 
-
58  RETURN
-
59  END
-
subroutine spgrady(I, M, ENN1, EON, EONTOP, Q, QDY, QDYTOP)
Computes the horizontal vector y-gradient of a scalar field in spectral space.
Definition: spgrady.f:32
+Go to the documentation of this file.
1C> @file
+
2C> @brief Compute y-gradient in spectral space.
+
3C> @author IREDELL @date 92-10-31
+
4
+
5C> Computes the horizontal vector y-gradient of a scalar field
+
6c> in spectral space.
+
7C>
+
8C> Subprogram speps should be called already.
+
9C>
+
10C> If L is the zonal wavenumber, N is the total wavenumber,
+
11C> EPS(L,N)=SQRT((N**2-L**2)/(4*N**2-1)) and A is Earth radius,
+
12C> then the meridional gradient of Q(L,N) is computed as
+
13C> EPS(L,N+1)*(N+2)/A*Q(L,N+1)-EPS(L,N+1)*(N-1)/A*Q(L,N-1).
+
14C>
+
15C> Extra terms are computed over top of the spectral domain.
+
16C>
+
17C> Advantage is taken of the fact that EPS(L,L)=0
+
18C> in order to vectorize over the entire spectral domain.
+
19C>
+
20C> @param I spectral domain shape
+
21c> (0 for triangular, 1 for rhomboidal)
+
22C> @param M spectral truncation
+
23C> @param ENN1 N*(N+1)/A**2
+
24C> @param EON EPSILON/N*A
+
25C> @param EONTOP EPSILON/N*A over top
+
26C> @param Q scalar field
+
27C> @param QDY merid gradient (times coslat)
+
28C> @param QDYTOP merid gradient (times coslat) over top
+
29C>
+
30C> @author IREDELL @date 92-10-31
+
+
31 SUBROUTINE spgrady(I,M,ENN1,EON,EONTOP,Q,QDY,QDYTOP)
+
32
+
33 REAL ENN1((M+1)*((I+1)*M+2)/2)
+
34 REAL EON((M+1)*((I+1)*M+2)/2),EONTOP(M+1)
+
35 REAL Q((M+1)*((I+1)*M+2))
+
36 REAL QDY((M+1)*((I+1)*M+2))
+
37 REAL QDYTOP(2*(M+1))
+
38
+
39C TAKE MERIDIONAL GRADIENT
+
40 k=1
+
41 qdy(2*k-1)=eon(k+1)*enn1(k+1)*q(2*k+1)
+
42 qdy(2*k)=eon(k+1)*enn1(k+1)*q(2*k+2)
+
43 DO k=2,(m+1)*((i+1)*m+2)/2-1
+
44 qdy(2*k-1)=eon(k+1)*enn1(k+1)*q(2*k+1)-eon(k)*enn1(k-1)*q(2*k-3)
+
45 qdy(2*k)=eon(k+1)*enn1(k+1)*q(2*k+2)-eon(k)*enn1(k-1)*q(2*k-2)
+
46 ENDDO
+
47 k=(m+1)*((i+1)*m+2)/2
+
48 qdy(2*k-1)=-eon(k)*enn1(k-1)*q(2*k-3)
+
49 qdy(2*k)=-eon(k)*enn1(k-1)*q(2*k-2)
+
50
+
51C TAKE MERIDIONAL GRADIENT OVER TOP
+
52 DO l=0,m
+
53 k=l*(2*m+(i-1)*(l-1))/2+i*l+m+1
+
54 qdytop(2*l+1)=-eontop(l+1)*enn1(k)*q(2*k-1)
+
55 qdytop(2*l+2)=-eontop(l+1)*enn1(k)*q(2*k)
+
56 ENDDO
+
57
+
58 RETURN
+
+
59 END
+
subroutine spgrady(i, m, enn1, eon, eontop, q, qdy, qdytop)
Computes the horizontal vector y-gradient of a scalar field in spectral space.
Definition spgrady.f:32
diff --git a/splaplac_8f.html b/splaplac_8f.html index 3589a880..f2ef4ec4 100644 --- a/splaplac_8f.html +++ b/splaplac_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: splaplac.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
splaplac.f File Reference
+
splaplac.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine splaplac (I, M, ENN1, Q, QD2, IDIR)
 Computes the laplacian or the inverse laplacian of a scalar field in spectral space. More...
 
subroutine splaplac (i, m, enn1, q, qd2, idir)
 Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
 

Detailed Description

Compute laplacian in spectral space.

@@ -107,8 +113,8 @@

Definition in file splaplac.f.

Function/Subroutine Documentation

- -

◆ splaplac()

+ +

◆ splaplac()

@@ -117,37 +123,37 @@

subroutine splaplac

(  I, i,
 M, m,
real, dimension((m+1)*((i+1)*m+2)/2) ENN1, enn1,
real, dimension((m+1)*((i+1)*m+2)) Q, q,
real, dimension((m+1)*((i+1)*m+2)) QD2, qd2,
 IDIR idir 
@@ -190,7 +196,7 @@

diff --git a/splaplac_8f.js b/splaplac_8f.js index 45b0c9dc..d0c0f3a0 100644 --- a/splaplac_8f.js +++ b/splaplac_8f.js @@ -1,4 +1,4 @@ var splaplac_8f = [ - [ "splaplac", "splaplac_8f.html#a64338955857a3cf58283146940e7ae42", null ] + [ "splaplac", "splaplac_8f.html#a6a5d229a55ce80ab4feed514fb704158", null ] ]; \ No newline at end of file diff --git a/splaplac_8f_source.html b/splaplac_8f_source.html index d73b3247..80caf32b 100644 --- a/splaplac_8f_source.html +++ b/splaplac_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: splaplac.f Source File @@ -23,10 +23,9 @@

- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,73 +81,81 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
splaplac.f
+
splaplac.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Compute laplacian in spectral space.
-
3 C> @author Iredell @date 92-10-31
-
4 
-
5 C> Computes the laplacian or the inverse laplacian
-
6 C> of a scalar field in spectral space.
-
7 C>
-
8 C> Subprogram speps() should be called already.
-
9 C>
-
10 C> The Laplacian of Q(L,N) is simply -N*(N+1)/A**2*Q(L,N)
-
11 C>
-
12 C> @param I spectral domain shape
-
13 C> (0 for triangular, 1 for rhomboidal)
-
14 C> @param M spectral truncation
-
15 C> @param ENN1 N*(N+1)/A**2
-
16 C> @param[out] Q if IDIR > 0, scalar field
-
17 C> (Q(0,0) is not computed)
-
18 C> @param[out] QD2 if IDIR < 0, Laplacian
-
19 C> @param IDIR flag
-
20 C> - IDIR > 0 to take Laplacian
-
21 C> - IDIR < 0 to take inverse Laplacian
-
22 C>
-
23 C> @author Iredell @date 92-10-31
-
24  SUBROUTINE splaplac(I,M,ENN1,Q,QD2,IDIR)
-
25 
-
26  REAL ENN1((M+1)*((I+1)*M+2)/2)
-
27  REAL Q((M+1)*((I+1)*M+2))
-
28  REAL QD2((M+1)*((I+1)*M+2))
-
29 
-
30 C TAKE LAPLACIAN
-
31  IF(idir.GT.0) THEN
-
32  k=1
-
33  qd2(2*k-1)=0.
-
34  qd2(2*k)=0.
-
35  DO k=2,(m+1)*((i+1)*m+2)/2
-
36  qd2(2*k-1)=q(2*k-1)*(-enn1(k))
-
37  qd2(2*k)=q(2*k)*(-enn1(k))
-
38  ENDDO
-
39 
-
40 C TAKE INVERSE LAPLACIAN
-
41  ELSE
-
42  DO k=2,(m+1)*((i+1)*m+2)/2
-
43  q(2*k-1)=qd2(2*k-1)/(-enn1(k))
-
44  q(2*k)=qd2(2*k)/(-enn1(k))
-
45  ENDDO
-
46  ENDIF
-
47 
-
48  RETURN
-
49  END
-
subroutine splaplac(I, M, ENN1, Q, QD2, IDIR)
Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
Definition: splaplac.f:25
+Go to the documentation of this file.
1C> @file
+
2C> @brief Compute laplacian in spectral space.
+
3C> @author Iredell @date 92-10-31
+
4
+
5C> Computes the laplacian or the inverse laplacian
+
6C> of a scalar field in spectral space.
+
7C>
+
8C> Subprogram speps() should be called already.
+
9C>
+
10C> The Laplacian of Q(L,N) is simply -N*(N+1)/A**2*Q(L,N)
+
11C>
+
12C> @param I spectral domain shape
+
13C> (0 for triangular, 1 for rhomboidal)
+
14C> @param M spectral truncation
+
15C> @param ENN1 N*(N+1)/A**2
+
16C> @param[out] Q if IDIR > 0, scalar field
+
17C> (Q(0,0) is not computed)
+
18C> @param[out] QD2 if IDIR < 0, Laplacian
+
19C> @param IDIR flag
+
20C> - IDIR > 0 to take Laplacian
+
21C> - IDIR < 0 to take inverse Laplacian
+
22C>
+
23C> @author Iredell @date 92-10-31
+
+
24 SUBROUTINE splaplac(I,M,ENN1,Q,QD2,IDIR)
+
25
+
26 REAL ENN1((M+1)*((I+1)*M+2)/2)
+
27 REAL Q((M+1)*((I+1)*M+2))
+
28 REAL QD2((M+1)*((I+1)*M+2))
+
29
+
30C TAKE LAPLACIAN
+
31 IF(idir.GT.0) THEN
+
32 k=1
+
33 qd2(2*k-1)=0.
+
34 qd2(2*k)=0.
+
35 DO k=2,(m+1)*((i+1)*m+2)/2
+
36 qd2(2*k-1)=q(2*k-1)*(-enn1(k))
+
37 qd2(2*k)=q(2*k)*(-enn1(k))
+
38 ENDDO
+
39
+
40C TAKE INVERSE LAPLACIAN
+
41 ELSE
+
42 DO k=2,(m+1)*((i+1)*m+2)/2
+
43 q(2*k-1)=qd2(2*k-1)/(-enn1(k))
+
44 q(2*k)=qd2(2*k)/(-enn1(k))
+
45 ENDDO
+
46 ENDIF
+
47
+
48 RETURN
+
+
49 END
+
subroutine splaplac(i, m, enn1, q, qd2, idir)
Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
Definition splaplac.f:25
diff --git a/splat_8F.html b/splat_8F.html index dc01b1de..8e1d3a56 100644 --- a/splat_8F.html +++ b/splat_8F.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: splat.F File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
splat.F File Reference
+
splat.F File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine splat (IDRT, JMAX, SLAT, WLAT)
 Computes cosines of colatitude and Gaussian weights for one of the following specific global sets of latitudes. More...
 
subroutine splat (idrt, jmax, slat, wlat)
 Computes cosines of colatitude and Gaussian weights for one of the following specific global sets of latitudes.
 

Detailed Description

Computes cosines of colatitude and Gaussian weights for sets of latitudes.

@@ -131,8 +137,8 @@

Definition in file splat.F.

Function/Subroutine Documentation

- -

◆ splat()

+ +

◆ splat()

@@ -205,7 +211,7 @@

diff --git a/splat_8F.js b/splat_8F.js index 1bbff9ef..b0b6fdc0 100644 --- a/splat_8F.js +++ b/splat_8F.js @@ -1,4 +1,4 @@ var splat_8F = [ - [ "splat", "splat_8F.html#aa6db21451bb67635e7e4426546140e11", null ] + [ "splat", "splat_8F.html#a3eb4e28a6c2be40e659048e92ca0350e", null ] ]; \ No newline at end of file diff --git a/splat_8F_source.html b/splat_8F_source.html index f1408b6e..6f06ba34 100644 --- a/splat_8F_source.html +++ b/splat_8F_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: splat.F Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +

@@ -76,228 +81,236 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
splat.F
+
splat.F
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Computes cosines of colatitude and Gaussian weights
-
3 C> for sets of latitudes.
-
4 C>
-
5 C> ### Program History Log
-
6 C> Date | Programmer | Comments
-
7 C> -----|------------|---------
-
8 C> 96-02-20 | Iredell | Initial.
-
9 C> 97-10-20 | Iredell | Adjust precision.
-
10 C> 98-06-11 | Iredell | Generalize precision using FORTRAN 90 intrinsic.
-
11 C> 1998-12-03 | Iredell | Generalize precision further.
-
12 C> 1998-12-03 | Iredell | Uses AIX ESSL BLAS calls.
-
13 C> 2009-12-27 | D. Stark | Updated to switch between ESSL calls on an AIX platform, and Numerical Recipies calls elsewise.
-
14 C> 2010-12-30 | Slovacek | Update alignment so preprocessor does not cause compilation failure.
-
15 C> 2012-09-01 | E. Mirvis & M.Iredell | Merging & debugging linux errors of _d and _8 using generic LU factorization.
-
16 C> 2012-11-05 | E. Mirvis | Generic FFTPACK and LU lapack were removed.
-
17 C>
-
18 C> @author Iredell @date 96-02-20
-
19 
-
20 C> Computes cosines of colatitude and Gaussian weights
-
21 C> for one of the following specific global sets of latitudes.
-
22 C> - Gaussian latitudes (IDRT=4)
-
23 C> - Equally-spaced latitudes including poles (IDRT=0)
-
24 C> - Equally-spaced latitudes excluding poles (IDRT=256)
-
25 C>
-
26 C> The Gaussian latitudes are located at the zeroes of the
-
27 C> Legendre polynomial of the given order. These latitudes
-
28 C> are efficient for reversible transforms from spectral space.
-
29 C> (About twice as many equally-spaced latitudes are needed.)
-
30 C> The weights for the equally-spaced latitudes are based on
-
31 C> Ellsaesser (JAM,1966). (No weight is given the pole point.)
-
32 C> Note that when analyzing grid to spectral in latitude pairs,
-
33 C> if an equator point exists, its weight should be halved.
-
34 C> This version invokes the ibm essl matrix solver.
-
35 C>
-
36 C> @param[in] IDRT grid identifier
-
37 C> - 4 for Gaussian grid
-
38 C> - 0 for equally-spaced grid including poles
-
39 C> - 256 for equally-spaced grid excluding poles
-
40 C> @param[in] JMAX number of latitudes
-
41 C> @param[out] SLAT sines of latitude
-
42 C> @param[out] WLAT Gaussian weights
-
43 C>
-
44 C> @author Iredell @date 96-02-20
-
45  SUBROUTINE splat(IDRT,JMAX,SLAT,WLAT)
-
46  REAL SLAT(JMAX),WLAT(JMAX)
-
47  INTEGER,PARAMETER:: KD=selected_real_kind(15,45)
-
48  REAL(KIND=kd):: pk(jmax/2),pkm1(jmax/2),pkm2(jmax/2)
-
49  REAL(KIND=kd):: slatd(jmax/2),sp,spmax,eps=10.*epsilon(sp)
-
50  parameter(jz=50)
-
51  REAL BZ(JZ)
-
52  DATA bz / 2.4048255577, 5.5200781103,
-
53  $ 8.6537279129, 11.7915344391, 14.9309177086, 18.0710639679,
-
54  $ 21.2116366299, 24.3524715308, 27.4934791320, 30.6346064684,
-
55  $ 33.7758202136, 36.9170983537, 40.0584257646, 43.1997917132,
-
56  $ 46.3411883717, 49.4826098974, 52.6240518411, 55.7655107550,
-
57  $ 58.9069839261, 62.0484691902, 65.1899648002, 68.3314693299,
-
58  $ 71.4729816036, 74.6145006437, 77.7560256304, 80.8975558711,
-
59  $ 84.0390907769, 87.1806298436, 90.3221726372, 93.4637187819,
-
60  $ 96.6052679510, 99.7468198587, 102.888374254, 106.029930916,
-
61  $ 109.171489649, 112.313050280, 115.454612653, 118.596176630,
-
62  $ 121.737742088, 124.879308913, 128.020877005, 131.162446275,
-
63  $ 134.304016638, 137.445588020, 140.587160352, 143.728733573,
-
64  $ 146.870307625, 150.011882457, 153.153458019, 156.295034268 /
-
65  REAL:: DLT,D1=1.
-
66  REAL AWORK((JMAX+1)/2,((JMAX+1)/2)),BWORK(((JMAX+1)/2))
-
67  INTEGER:: JHE,JHO,INFO
-
68  INTEGER IPVT((JMAX+1)/2)
-
69  parameter(pi=3.14159265358979,c=(1.-(2./pi)**2)*0.25)
-
70 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
71 C GAUSSIAN LATITUDES
-
72  IF(idrt.EQ.4) THEN
-
73  jh=jmax/2
-
74  jhe=(jmax+1)/2
-
75  r=1./sqrt((jmax+0.5)**2+c)
-
76  DO j=1,min(jh,jz)
-
77  slatd(j)=cos(bz(j)*r)
-
78  ENDDO
-
79  DO j=jz+1,jh
-
80  slatd(j)=cos((bz(jz)+(j-jz)*pi)*r)
-
81  ENDDO
-
82  spmax=1.
-
83  DO WHILE(spmax.GT.eps)
-
84  spmax=0.
-
85  DO j=1,jh
-
86  pkm1(j)=1.
-
87  pk(j)=slatd(j)
-
88  ENDDO
-
89  DO n=2,jmax
-
90  DO j=1,jh
-
91  pkm2(j)=pkm1(j)
-
92  pkm1(j)=pk(j)
-
93  pk(j)=((2*n-1)*slatd(j)*pkm1(j)-(n-1)*pkm2(j))/n
-
94  ENDDO
-
95  ENDDO
-
96  DO j=1,jh
-
97  sp=pk(j)*(1.-slatd(j)**2)/(jmax*(pkm1(j)-slatd(j)*pk(j)))
-
98  slatd(j)=slatd(j)-sp
-
99  spmax=max(spmax,abs(sp))
-
100  ENDDO
-
101  ENDDO
-
102 CDIR$ IVDEP
-
103  DO j=1,jh
-
104  slat(j)=real(slatd(j))
-
105  wlat(j)=real((2.*(1.-slatd(j)**2))/(jmax*pkm1(j))**2)
-
106  slat(jmax+1-j)=-slat(j)
-
107  wlat(jmax+1-j)=wlat(j)
-
108  ENDDO
-
109  IF(jhe.GT.jh) THEN
-
110  slat(jhe)=0.
-
111  wlat(jhe)=2./jmax**2
-
112  DO n=2,jmax,2
-
113  wlat(jhe)=wlat(jhe)*n**2/(n-1)**2
-
114  ENDDO
-
115  ENDIF
-
116 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
117 C EQUALLY-SPACED LATITUDES INCLUDING POLES
-
118  ELSEIF(idrt.EQ.0) THEN
-
119  jh=jmax/2
-
120  jhe=(jmax+1)/2
-
121  jho=jhe-1
-
122  dlt=pi/(jmax-1)
-
123  slat(1)=1.
-
124  DO j=2,jh
-
125  slat(j)=cos((j-1)*dlt)
-
126  ENDDO
-
127  DO js=1,jho
-
128  DO j=1,jho
-
129  awork(js,j)=cos(2*(js-1)*j*dlt)
-
130  ENDDO
-
131  ENDDO
-
132  DO js=1,jho
-
133  bwork(js)=-d1/(4*(js-1)**2-1)
-
134  ENDDO
-
135 
-
136  ! Call LAPACK routines
-
137 #if (LSIZE==4)
-
138  CALL sgetrf(jho, jho, awork, jhe, ipvt, info)
-
139  CALL sgetrs('N', jho, 1, awork, jhe, ipvt, bwork, jho, info)
-
140 #else
-
141  CALL dgetrf(jho, jho, awork, jhe, ipvt, info)
-
142  CALL dgetrs('N', jho, 1, awork, jhe, ipvt, bwork, jho, info)
-
143 #endif
-
144 
-
145  wlat(1)=0.
-
146  DO j=1,jho
-
147  wlat(j+1)=bwork(j)
-
148  ENDDO
-
149 CDIR$ IVDEP
-
150  DO j=1,jh
-
151  print *, j, jmax, jmax+1-j
-
152  slat(jmax+1-j)=-slat(j)
-
153  wlat(jmax+1-j)=wlat(j)
-
154  ENDDO
-
155  IF(jhe.GT.jh) THEN
-
156  slat(jhe)=0.
-
157  wlat(jhe)=2.*wlat(jhe)
-
158  ENDIF
-
159 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
160 C EQUALLY-SPACED LATITUDES EXCLUDING POLES
-
161  ELSEIF(idrt.EQ.256) THEN
-
162  jh=jmax/2
-
163  jhe=(jmax+1)/2
-
164  jho=jhe
-
165  dlt=pi/jmax
-
166  slat(1)=1.
-
167  DO j=1,jh
-
168  slat(j)=cos((j-0.5)*dlt)
-
169  ENDDO
-
170  DO js=1,jho
-
171  DO j=1,jho
-
172  awork(js,j)=cos(2*(js-1)*(j-0.5)*dlt)
-
173  ENDDO
-
174  ENDDO
-
175  DO js=1,jho
-
176  bwork(js)=-d1/(4*(js-1)**2-1)
-
177  ENDDO
-
178 
-
179  ! Call LAPACK routines
-
180 #if (LSIZE==4)
-
181  CALL sgetrf(jho, jho, awork, jhe, ipvt, info)
-
182  CALL sgetrs('N', jho, 1, awork, jhe, ipvt, bwork, jho, info)
-
183 #else
-
184  CALL dgetrf(jho, jho, awork, jhe, ipvt, info)
-
185  CALL dgetrs('N', jho, 1, awork, jhe, ipvt, bwork, jho, info)
-
186 #endif
-
187 
-
188  wlat(1)=0.
-
189  DO j=1,jho
-
190  wlat(j)=bwork(j)
-
191  ENDDO
-
192 CDIR$ IVDEP
-
193  DO j=1,jh
-
194  slat(jmax+1-j)=-slat(j)
-
195  wlat(jmax+1-j)=wlat(j)
-
196  ENDDO
-
197  IF(jhe.GT.jh) THEN
-
198  slat(jhe)=0.
-
199  wlat(jhe)=2.*wlat(jhe)
-
200  ENDIF
-
201  ENDIF
-
202 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
203  RETURN
-
204  END
-
subroutine splat(IDRT, JMAX, SLAT, WLAT)
Computes cosines of colatitude and Gaussian weights for one of the following specific global sets of ...
Definition: splat.F:46
+Go to the documentation of this file.
1C> @file
+
2C> @brief Computes cosines of colatitude and Gaussian weights
+
3C> for sets of latitudes.
+
4C>
+
5C> ### Program History Log
+
6C> Date | Programmer | Comments
+
7C> -----|------------|---------
+
8C> 96-02-20 | Iredell | Initial.
+
9C> 97-10-20 | Iredell | Adjust precision.
+
10C> 98-06-11 | Iredell | Generalize precision using FORTRAN 90 intrinsic.
+
11C> 1998-12-03 | Iredell | Generalize precision further.
+
12C> 1998-12-03 | Iredell | Uses AIX ESSL BLAS calls.
+
13C> 2009-12-27 | D. Stark | Updated to switch between ESSL calls on an AIX platform, and Numerical Recipies calls elsewise.
+
14C> 2010-12-30 | Slovacek | Update alignment so preprocessor does not cause compilation failure.
+
15C> 2012-09-01 | E. Mirvis & M.Iredell | Merging & debugging linux errors of _d and _8 using generic LU factorization.
+
16C> 2012-11-05 | E. Mirvis | Generic FFTPACK and LU lapack were removed.
+
17C>
+
18C> @author Iredell @date 96-02-20
+
19
+
20C> Computes cosines of colatitude and Gaussian weights
+
21C> for one of the following specific global sets of latitudes.
+
22C> - Gaussian latitudes (IDRT=4)
+
23C> - Equally-spaced latitudes including poles (IDRT=0)
+
24C> - Equally-spaced latitudes excluding poles (IDRT=256)
+
25C>
+
26C> The Gaussian latitudes are located at the zeroes of the
+
27C> Legendre polynomial of the given order. These latitudes
+
28C> are efficient for reversible transforms from spectral space.
+
29C> (About twice as many equally-spaced latitudes are needed.)
+
30C> The weights for the equally-spaced latitudes are based on
+
31C> Ellsaesser (JAM,1966). (No weight is given the pole point.)
+
32C> Note that when analyzing grid to spectral in latitude pairs,
+
33C> if an equator point exists, its weight should be halved.
+
34C> This version invokes the ibm essl matrix solver.
+
35C>
+
36C> @param[in] IDRT grid identifier
+
37C> - 4 for Gaussian grid
+
38C> - 0 for equally-spaced grid including poles
+
39C> - 256 for equally-spaced grid excluding poles
+
40C> @param[in] JMAX number of latitudes
+
41C> @param[out] SLAT sines of latitude
+
42C> @param[out] WLAT Gaussian weights
+
43C>
+
44C> @author Iredell @date 96-02-20
+
+
45 SUBROUTINE splat(IDRT,JMAX,SLAT,WLAT)
+
46 REAL SLAT(JMAX),WLAT(JMAX)
+
47 INTEGER,PARAMETER:: KD=selected_real_kind(15,45)
+
48 REAL(KIND=kd):: pk(jmax/2),pkm1(jmax/2),pkm2(jmax/2)
+
49 REAL(KIND=kd):: slatd(jmax/2),sp,spmax,eps=10.*epsilon(sp)
+
50 parameter(jz=50)
+
51 REAL BZ(JZ)
+
52 DATA bz / 2.4048255577, 5.5200781103,
+
53 $ 8.6537279129, 11.7915344391, 14.9309177086, 18.0710639679,
+
54 $ 21.2116366299, 24.3524715308, 27.4934791320, 30.6346064684,
+
55 $ 33.7758202136, 36.9170983537, 40.0584257646, 43.1997917132,
+
56 $ 46.3411883717, 49.4826098974, 52.6240518411, 55.7655107550,
+
57 $ 58.9069839261, 62.0484691902, 65.1899648002, 68.3314693299,
+
58 $ 71.4729816036, 74.6145006437, 77.7560256304, 80.8975558711,
+
59 $ 84.0390907769, 87.1806298436, 90.3221726372, 93.4637187819,
+
60 $ 96.6052679510, 99.7468198587, 102.888374254, 106.029930916,
+
61 $ 109.171489649, 112.313050280, 115.454612653, 118.596176630,
+
62 $ 121.737742088, 124.879308913, 128.020877005, 131.162446275,
+
63 $ 134.304016638, 137.445588020, 140.587160352, 143.728733573,
+
64 $ 146.870307625, 150.011882457, 153.153458019, 156.295034268 /
+
65 REAL:: DLT,D1=1.
+
66 REAL AWORK((JMAX+1)/2,((JMAX+1)/2)),BWORK(((JMAX+1)/2))
+
67 INTEGER:: JHE,JHO,INFO
+
68 INTEGER IPVT((JMAX+1)/2)
+
69 parameter(pi=3.14159265358979,c=(1.-(2./pi)**2)*0.25)
+
70C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
71C GAUSSIAN LATITUDES
+
72 IF(idrt.EQ.4) THEN
+
73 jh=jmax/2
+
74 jhe=(jmax+1)/2
+
75 r=1./sqrt((jmax+0.5)**2+c)
+
76 DO j=1,min(jh,jz)
+
77 slatd(j)=cos(bz(j)*r)
+
78 ENDDO
+
79 DO j=jz+1,jh
+
80 slatd(j)=cos((bz(jz)+(j-jz)*pi)*r)
+
81 ENDDO
+
82 spmax=1.
+
83 DO WHILE(spmax.GT.eps)
+
84 spmax=0.
+
85 DO j=1,jh
+
86 pkm1(j)=1.
+
87 pk(j)=slatd(j)
+
88 ENDDO
+
89 DO n=2,jmax
+
90 DO j=1,jh
+
91 pkm2(j)=pkm1(j)
+
92 pkm1(j)=pk(j)
+
93 pk(j)=((2*n-1)*slatd(j)*pkm1(j)-(n-1)*pkm2(j))/n
+
94 ENDDO
+
95 ENDDO
+
96 DO j=1,jh
+
97 sp=pk(j)*(1.-slatd(j)**2)/(jmax*(pkm1(j)-slatd(j)*pk(j)))
+
98 slatd(j)=slatd(j)-sp
+
99 spmax=max(spmax,abs(sp))
+
100 ENDDO
+
101 ENDDO
+
102CDIR$ IVDEP
+
103 DO j=1,jh
+
104 slat(j)=real(slatd(j))
+
105 wlat(j)=real((2.*(1.-slatd(j)**2))/(jmax*pkm1(j))**2)
+
106 slat(jmax+1-j)=-slat(j)
+
107 wlat(jmax+1-j)=wlat(j)
+
108 ENDDO
+
109 IF(jhe.GT.jh) THEN
+
110 slat(jhe)=0.
+
111 wlat(jhe)=2./jmax**2
+
112 DO n=2,jmax,2
+
113 wlat(jhe)=wlat(jhe)*n**2/(n-1)**2
+
114 ENDDO
+
115 ENDIF
+
116C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
117C EQUALLY-SPACED LATITUDES INCLUDING POLES
+
118 ELSEIF(idrt.EQ.0) THEN
+
119 jh=jmax/2
+
120 jhe=(jmax+1)/2
+
121 jho=jhe-1
+
122 dlt=pi/(jmax-1)
+
123 slat(1)=1.
+
124 DO j=2,jh
+
125 slat(j)=cos((j-1)*dlt)
+
126 ENDDO
+
127 DO js=1,jho
+
128 DO j=1,jho
+
129 awork(js,j)=cos(2*(js-1)*j*dlt)
+
130 ENDDO
+
131 ENDDO
+
132 DO js=1,jho
+
133 bwork(js)=-d1/(4*(js-1)**2-1)
+
134 ENDDO
+
135
+
136 ! Call LAPACK routines
+
137#if (LSIZE==4)
+
138 CALL sgetrf(jho, jho, awork, jhe, ipvt, info)
+
139 CALL sgetrs('N', jho, 1, awork, jhe, ipvt, bwork, jho, info)
+
140#else
+
141 CALL dgetrf(jho, jho, awork, jhe, ipvt, info)
+
142 CALL dgetrs('N', jho, 1, awork, jhe, ipvt, bwork, jho, info)
+
143#endif
+
144
+
145 wlat(1)=0.
+
146 DO j=1,jho
+
147 wlat(j+1)=bwork(j)
+
148 ENDDO
+
149CDIR$ IVDEP
+
150 DO j=1,jh
+
151 print *, j, jmax, jmax+1-j
+
152 slat(jmax+1-j)=-slat(j)
+
153 wlat(jmax+1-j)=wlat(j)
+
154 ENDDO
+
155 IF(jhe.GT.jh) THEN
+
156 slat(jhe)=0.
+
157 wlat(jhe)=2.*wlat(jhe)
+
158 ENDIF
+
159C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
160C EQUALLY-SPACED LATITUDES EXCLUDING POLES
+
161 ELSEIF(idrt.EQ.256) THEN
+
162 jh=jmax/2
+
163 jhe=(jmax+1)/2
+
164 jho=jhe
+
165 dlt=pi/jmax
+
166 slat(1)=1.
+
167 DO j=1,jh
+
168 slat(j)=cos((j-0.5)*dlt)
+
169 ENDDO
+
170 DO js=1,jho
+
171 DO j=1,jho
+
172 awork(js,j)=cos(2*(js-1)*(j-0.5)*dlt)
+
173 ENDDO
+
174 ENDDO
+
175 DO js=1,jho
+
176 bwork(js)=-d1/(4*(js-1)**2-1)
+
177 ENDDO
+
178
+
179 ! Call LAPACK routines
+
180#if (LSIZE==4)
+
181 CALL sgetrf(jho, jho, awork, jhe, ipvt, info)
+
182 CALL sgetrs('N', jho, 1, awork, jhe, ipvt, bwork, jho, info)
+
183#else
+
184 CALL dgetrf(jho, jho, awork, jhe, ipvt, info)
+
185 CALL dgetrs('N', jho, 1, awork, jhe, ipvt, bwork, jho, info)
+
186#endif
+
187
+
188 wlat(1)=0.
+
189 DO j=1,jho
+
190 wlat(j)=bwork(j)
+
191 ENDDO
+
192CDIR$ IVDEP
+
193 DO j=1,jh
+
194 slat(jmax+1-j)=-slat(j)
+
195 wlat(jmax+1-j)=wlat(j)
+
196 ENDDO
+
197 IF(jhe.GT.jh) THEN
+
198 slat(jhe)=0.
+
199 wlat(jhe)=2.*wlat(jhe)
+
200 ENDIF
+
201 ENDIF
+
202C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
203 RETURN
+
+
204 END
+
subroutine splat(idrt, jmax, slat, wlat)
Computes cosines of colatitude and Gaussian weights for one of the following specific global sets of ...
Definition splat.F:46
diff --git a/splegend_8f.html b/splegend_8f.html index 60627878..1bf0aeaa 100644 --- a/splegend_8f.html +++ b/splegend_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: splegend.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@

@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
splegend.f File Reference
+
splegend.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine splegend (I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
 Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude. More...
 
subroutine splegend (i, m, slat, clat, eps, epstop, pln, plntop)
 Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
 

Detailed Description

Compute Legendre polynomials.

@@ -107,8 +113,8 @@

Definition in file splegend.f.

Function/Subroutine Documentation

- -

◆ splegend()

+ +

◆ splegend()

diff --git a/splegend_8f.js b/splegend_8f.js index 8ab7c002..b5671de9 100644 --- a/splegend_8f.js +++ b/splegend_8f.js @@ -1,4 +1,4 @@ var splegend_8f = [ - [ "splegend", "splegend_8f.html#a9c68adc80e97c43ac983b955dd6cabac", null ] + [ "splegend", "splegend_8f.html#a8ef58f630a5d57be9df425eb9476920a", null ] ]; \ No newline at end of file diff --git a/splegend_8f_source.html b/splegend_8f_source.html index 0259094a..18e43542 100644 --- a/splegend_8f_source.html +++ b/splegend_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: splegend.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,162 +81,170 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
splegend.f
+
splegend.f
-Go to the documentation of this file.
1 C> @file
-
2 C>
-
3 C> Compute Legendre polynomials
-
4 C> @author IREDELL @date 92-10-31
-
5 
-
6 C> Evaluates the orthonormal associated Legendre polynomials in the
-
7 C> spectral domain at a given latitude. Subprogram splegend should
-
8 C> be called already. If l is the zonal wavenumber, N is the total
-
9 C> wavenumber, and EPS(L,N)=SQRT((N**2-L**2)/(4*N**2-1)) then the
-
10 C> following bootstrapping formulas are used:
-
11 C>
-
12 C> <pre>
-
13 C> PLN(0,0)=SQRT(0.5)
-
14 C> PLN(L,L)=PLN(L-1,L-1)*CLAT*SQRT(FLOAT(2*L+1)/FLOAT(2*L))
-
15 C> PLN(L,N)=(SLAT*PLN(L,N-1)-EPS(L,N-1)*PLN(L,N-2))/EPS(L,N)
-
16 C> </pre>
-
17 C>
-
18 C> Synthesis at the pole needs only two zonal wavenumbers. Scalar
-
19 C> fields are synthesized with zonal wavenumber 0 while vector
-
20 C> fields are synthesized with zonal wavenumber 1. (Thus polar
-
21 C> vector fields are implicitly divided by clat.) The following
-
22 C> bootstrapping formulas are used at the pole:
-
23 C>
-
24 C> <pre>
-
25 C> PLN(0,0)=SQRT(0.5)
-
26 C> PLN(1,1)=SQRT(0.75)
-
27 C> PLN(L,N)=(PLN(L,N-1)-EPS(L,N-1)*PLN(L,N-2))/EPS(L,N)
-
28 C> </pre>
-
29 C>
-
30 C> PROGRAM HISTORY LOG:
-
31 C> - 91-10-31 MARK IREDELL
-
32 C> - 98-06-10 MARK IREDELL GENERALIZE PRECISION
-
33 C>
-
34 C> @param I - INTEGER SPECTRAL DOMAIN SHAPE
-
35 C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
-
36 C> @param M - INTEGER SPECTRAL TRUNCATION
-
37 C> @param SLAT - REAL SINE OF LATITUDE
-
38 C> @param CLAT - REAL COSINE OF LATITUDE
-
39 C> @param EPS - REAL ((M+1)*((I+1)*M+2)/2) SQRT((N**2-L**2)/(4*N**2-1))
-
40 C> @param EPSTOP - REAL (M+1) SQRT((N**2-L**2)/(4*N**2-1)) OVER TOP
-
41 C> @param[out] PLN - REAL ((M+1)*((I+1)*M+2)/2) LEGENDRE POLYNOMIAL
-
42 C> @param[out] PLNTOP - REAL (M+1) LEGENDRE POLYNOMIAL OVER TOP
-
43 C>
-
44  SUBROUTINE splegend(I,M,SLAT,CLAT,EPS,EPSTOP,PLN,PLNTOP)
-
45 
-
46 CFPP$ NOCONCUR R
-
47  REAL EPS((M+1)*((I+1)*M+2)/2),EPSTOP(M+1)
-
48  REAL PLN((M+1)*((I+1)*M+2)/2),PLNTOP(M+1)
-
49  REAL(KIND=selected_real_kind(15,45)):: dln((m+1)*((i+1)*m+2)/2)
-
50  REAL :: TINYREAL=tiny(1.0), rdln1, rdln2
-
51 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
52 C ITERATIVELY COMPUTE PLN WITHIN SPECTRAL DOMAIN AT POLE
-
53  m1=m+1
-
54  m2=2*m+i+1
-
55  mx=(m+1)*((i+1)*m+2)/2
-
56  IF(abs(clat).LT.tinyreal) THEN
-
57  dln(1)=sqrt(0.5)
-
58  IF(m.GT.0) THEN
-
59  dln(m1+1)=sqrt(0.75)
-
60  dln(2)=slat*dln(1)/eps(2)
-
61  ENDIF
-
62  IF(m.GT.1) THEN
-
63  dln(m1+2)=slat*dln(m1+1)/eps(m1+2)
-
64  dln(3)=(slat*dln(2)-eps(2)*dln(1))/eps(3)
-
65  DO n=3,m
-
66  k=1+n
-
67  dln(k)=(slat*dln(k-1)-eps(k-1)*dln(k-2))/eps(k)
-
68  k=m1+n
-
69  dln(k)=(slat*dln(k-1)-eps(k-1)*dln(k-2))/eps(k)
-
70  ENDDO
-
71  IF(i.EQ.1) THEN
-
72  k=m2
-
73  dln(k)=(slat*dln(k-1)-eps(k-1)*dln(k-2))/eps(k)
-
74  ENDIF
-
75  DO k=m2+1,mx
-
76  dln(k)=0.
-
77  ENDDO
-
78  ENDIF
-
79 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
80 C COMPUTE POLYNOMIALS OVER TOP OF SPECTRAL DOMAIN
-
81  k=m1+1
-
82  rdln1=real(dln(k-1))
-
83  rdln2=real(dln(k-2))
-
84  plntop(1)=(slat*rdln1-eps(k-1)*rdln2)/epstop(1)
-
85  IF(m.GT.0) THEN
-
86  k=m2+1
-
87  rdln1=real(dln(k-1))
-
88  rdln2=real(dln(k-2))
-
89  plntop(2)=(slat*rdln1-eps(k-1)*rdln2)/epstop(2)
-
90  DO l=2,m
-
91  plntop(l+1)=0.
-
92  ENDDO
-
93  ENDIF
-
94 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
95 C ITERATIVELY COMPUTE PLN(L,L) (BOTTOM HYPOTENUSE OF DOMAIN)
-
96  ELSE
-
97  nml=0
-
98  k=1
-
99  dln(k)=sqrt(0.5)
-
100  DO l=1,m+(i-1)*nml
-
101  kp=k
-
102  k=l*(2*m+(i-1)*(l-1))/2+l+nml+1
-
103  dln(k)=dln(kp)*clat*sqrt(float(2*l+1)/float(2*l))
-
104  ENDDO
-
105 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
106 C COMPUTE PLN(L,L+1) (DIAGONAL NEXT TO BOTTOM HYPOTENUSE OF DOMAIN)
-
107  nml=1
-
108 CDIR$ IVDEP
-
109  DO l=0,m+(i-1)*nml
-
110  k=l*(2*m+(i-1)*(l-1))/2+l+nml+1
-
111  dln(k)=slat*dln(k-1)/eps(k)
-
112  ENDDO
-
113 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
114 C COMPUTE REMAINING PLN IN SPECTRAL DOMAIN
-
115  DO nml=2,m
-
116 CDIR$ IVDEP
-
117  DO l=0,m+(i-1)*nml
-
118  k=l*(2*m+(i-1)*(l-1))/2+l+nml+1
-
119  dln(k)=(slat*dln(k-1)-eps(k-1)*dln(k-2))/eps(k)
-
120  ENDDO
-
121  ENDDO
-
122 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
123 C COMPUTE POLYNOMIALS OVER TOP OF SPECTRAL DOMAIN
-
124  DO l=0,m
-
125  nml=m+1+(i-1)*l
-
126  k=l*(2*m+(i-1)*(l-1))/2+l+nml+1
-
127  rdln1=real(dln(k-1))
-
128  rdln2=real(dln(k-2))
-
129  plntop(l+1)=(slat*rdln1-eps(k-1)*rdln2)/epstop(l+1)
-
130  ENDDO
-
131  ENDIF
-
132 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
133 C RETURN VALUES
-
134  DO k=1,mx
-
135  pln(k)=real(dln(k))
-
136  ENDDO
-
137  RETURN
-
138  END
-
subroutine splegend(I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
Definition: splegend.f:45
+Go to the documentation of this file.
1C> @file
+
2C>
+
3C> Compute Legendre polynomials
+
4C> @author IREDELL @date 92-10-31
+
5
+
6C> Evaluates the orthonormal associated Legendre polynomials in the
+
7C> spectral domain at a given latitude. Subprogram splegend should
+
8C> be called already. If l is the zonal wavenumber, N is the total
+
9C> wavenumber, and EPS(L,N)=SQRT((N**2-L**2)/(4*N**2-1)) then the
+
10C> following bootstrapping formulas are used:
+
11C>
+
12C> <pre>
+
13C> PLN(0,0)=SQRT(0.5)
+
14C> PLN(L,L)=PLN(L-1,L-1)*CLAT*SQRT(FLOAT(2*L+1)/FLOAT(2*L))
+
15C> PLN(L,N)=(SLAT*PLN(L,N-1)-EPS(L,N-1)*PLN(L,N-2))/EPS(L,N)
+
16C> </pre>
+
17C>
+
18C> Synthesis at the pole needs only two zonal wavenumbers. Scalar
+
19C> fields are synthesized with zonal wavenumber 0 while vector
+
20C> fields are synthesized with zonal wavenumber 1. (Thus polar
+
21C> vector fields are implicitly divided by clat.) The following
+
22C> bootstrapping formulas are used at the pole:
+
23C>
+
24C> <pre>
+
25C> PLN(0,0)=SQRT(0.5)
+
26C> PLN(1,1)=SQRT(0.75)
+
27C> PLN(L,N)=(PLN(L,N-1)-EPS(L,N-1)*PLN(L,N-2))/EPS(L,N)
+
28C> </pre>
+
29C>
+
30C> PROGRAM HISTORY LOG:
+
31C> - 91-10-31 MARK IREDELL
+
32C> - 98-06-10 MARK IREDELL GENERALIZE PRECISION
+
33C>
+
34C> @param I - INTEGER SPECTRAL DOMAIN SHAPE
+
35C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
+
36C> @param M - INTEGER SPECTRAL TRUNCATION
+
37C> @param SLAT - REAL SINE OF LATITUDE
+
38C> @param CLAT - REAL COSINE OF LATITUDE
+
39C> @param EPS - REAL ((M+1)*((I+1)*M+2)/2) SQRT((N**2-L**2)/(4*N**2-1))
+
40C> @param EPSTOP - REAL (M+1) SQRT((N**2-L**2)/(4*N**2-1)) OVER TOP
+
41C> @param[out] PLN - REAL ((M+1)*((I+1)*M+2)/2) LEGENDRE POLYNOMIAL
+
42C> @param[out] PLNTOP - REAL (M+1) LEGENDRE POLYNOMIAL OVER TOP
+
43C>
+
+
44 SUBROUTINE splegend(I,M,SLAT,CLAT,EPS,EPSTOP,PLN,PLNTOP)
+
45
+
46CFPP$ NOCONCUR R
+
47 REAL EPS((M+1)*((I+1)*M+2)/2),EPSTOP(M+1)
+
48 REAL PLN((M+1)*((I+1)*M+2)/2),PLNTOP(M+1)
+
49 REAL(KIND=selected_real_kind(15,45)):: dln((m+1)*((i+1)*m+2)/2)
+
50 REAL :: TINYREAL=tiny(1.0), rdln1, rdln2
+
51C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
52C ITERATIVELY COMPUTE PLN WITHIN SPECTRAL DOMAIN AT POLE
+
53 m1=m+1
+
54 m2=2*m+i+1
+
55 mx=(m+1)*((i+1)*m+2)/2
+
56 IF(abs(clat).LT.tinyreal) THEN
+
57 dln(1)=sqrt(0.5)
+
58 IF(m.GT.0) THEN
+
59 dln(m1+1)=sqrt(0.75)
+
60 dln(2)=slat*dln(1)/eps(2)
+
61 ENDIF
+
62 IF(m.GT.1) THEN
+
63 dln(m1+2)=slat*dln(m1+1)/eps(m1+2)
+
64 dln(3)=(slat*dln(2)-eps(2)*dln(1))/eps(3)
+
65 DO n=3,m
+
66 k=1+n
+
67 dln(k)=(slat*dln(k-1)-eps(k-1)*dln(k-2))/eps(k)
+
68 k=m1+n
+
69 dln(k)=(slat*dln(k-1)-eps(k-1)*dln(k-2))/eps(k)
+
70 ENDDO
+
71 IF(i.EQ.1) THEN
+
72 k=m2
+
73 dln(k)=(slat*dln(k-1)-eps(k-1)*dln(k-2))/eps(k)
+
74 ENDIF
+
75 DO k=m2+1,mx
+
76 dln(k)=0.
+
77 ENDDO
+
78 ENDIF
+
79C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
80C COMPUTE POLYNOMIALS OVER TOP OF SPECTRAL DOMAIN
+
81 k=m1+1
+
82 rdln1=real(dln(k-1))
+
83 rdln2=real(dln(k-2))
+
84 plntop(1)=(slat*rdln1-eps(k-1)*rdln2)/epstop(1)
+
85 IF(m.GT.0) THEN
+
86 k=m2+1
+
87 rdln1=real(dln(k-1))
+
88 rdln2=real(dln(k-2))
+
89 plntop(2)=(slat*rdln1-eps(k-1)*rdln2)/epstop(2)
+
90 DO l=2,m
+
91 plntop(l+1)=0.
+
92 ENDDO
+
93 ENDIF
+
94C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
95C ITERATIVELY COMPUTE PLN(L,L) (BOTTOM HYPOTENUSE OF DOMAIN)
+
96 ELSE
+
97 nml=0
+
98 k=1
+
99 dln(k)=sqrt(0.5)
+
100 DO l=1,m+(i-1)*nml
+
101 kp=k
+
102 k=l*(2*m+(i-1)*(l-1))/2+l+nml+1
+
103 dln(k)=dln(kp)*clat*sqrt(float(2*l+1)/float(2*l))
+
104 ENDDO
+
105C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
106C COMPUTE PLN(L,L+1) (DIAGONAL NEXT TO BOTTOM HYPOTENUSE OF DOMAIN)
+
107 nml=1
+
108CDIR$ IVDEP
+
109 DO l=0,m+(i-1)*nml
+
110 k=l*(2*m+(i-1)*(l-1))/2+l+nml+1
+
111 dln(k)=slat*dln(k-1)/eps(k)
+
112 ENDDO
+
113C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
114C COMPUTE REMAINING PLN IN SPECTRAL DOMAIN
+
115 DO nml=2,m
+
116CDIR$ IVDEP
+
117 DO l=0,m+(i-1)*nml
+
118 k=l*(2*m+(i-1)*(l-1))/2+l+nml+1
+
119 dln(k)=(slat*dln(k-1)-eps(k-1)*dln(k-2))/eps(k)
+
120 ENDDO
+
121 ENDDO
+
122C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
123C COMPUTE POLYNOMIALS OVER TOP OF SPECTRAL DOMAIN
+
124 DO l=0,m
+
125 nml=m+1+(i-1)*l
+
126 k=l*(2*m+(i-1)*(l-1))/2+l+nml+1
+
127 rdln1=real(dln(k-1))
+
128 rdln2=real(dln(k-2))
+
129 plntop(l+1)=(slat*rdln1-eps(k-1)*rdln2)/epstop(l+1)
+
130 ENDDO
+
131 ENDIF
+
132C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
133C RETURN VALUES
+
134 DO k=1,mx
+
135 pln(k)=real(dln(k))
+
136 ENDDO
+
137 RETURN
+
+
138 END
+
subroutine splegend(i, m, slat, clat, eps, epstop, pln, plntop)
Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
Definition splegend.f:45
diff --git a/splitbard.png b/splitbard.png new file mode 100644 index 0000000000000000000000000000000000000000..8367416d757fd7b6dc4272b6432dc75a75abd068 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf@VhhFKy35^fiT zT~&lUj3=cDh^%3HDY9k5CEku}PHXNoNC(_$U3XPb&Q*ME25pT;2(*BOgAf<+R$lzakPG`kF31()Fx{L5Wrac|GQzjeE= zueY1`Ze{#x<8=S|`~MgGetGce)#vN&|J{Cd^tS%;tBYTo?+^d68<#n_Y_xx`J||4O V@QB{^CqU0Kc)I$ztaD0e0svEzbJzd? literal 0 HcmV?d00001 diff --git a/sppad_8f.html b/sppad_8f.html index 89bd770b..cdd4ce36 100644 --- a/sppad_8f.html +++ b/sppad_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sppad.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sppad.f File Reference
+
sppad.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sppad (I1, M1, Q1, I2, M2, Q2)
 Pad or truncate a spectral field. More...
 
subroutine sppad (i1, m1, q1, i2, m2, q2)
 Pad or truncate a spectral field.
 

Detailed Description

Pad or truncate a spectral field.

@@ -107,8 +113,8 @@

Definition in file sppad.f.

Function/Subroutine Documentation

- -

◆ sppad()

+ +

◆ sppad()

diff --git a/sppad_8f.js b/sppad_8f.js index a47faa1f..24ab5abe 100644 --- a/sppad_8f.js +++ b/sppad_8f.js @@ -1,4 +1,4 @@ var sppad_8f = [ - [ "sppad", "sppad_8f.html#a4338b3ccd7844251bbdabf3da1d6476e", null ] + [ "sppad", "sppad_8f.html#a018fc6d223be3ea5ee2b498ff2eb3276", null ] ]; \ No newline at end of file diff --git a/sppad_8f_source.html b/sppad_8f_source.html index fae04c86..ad979902 100644 --- a/sppad_8f_source.html +++ b/sppad_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sppad.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,60 +81,68 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sppad.f
+
sppad.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Pad or truncate a spectral field.
-
3 C> @author Iredell @date 92-10-31
-
4 
-
5 C> Pad or truncate a spectral field.
-
6 C>
-
7 C> @param I1 input spectral domain shape
-
8 C> (0 for triangular, 1 for rhomboidal)
-
9 C> @param M1 input spectral truncation
-
10 C> @param Q1 ((M+1)*((I+1)*M+2)) input field
-
11 C> @param I2 output spectral domain shape
-
12 C> (0 for triangular, 1 for rhomboidal)
-
13 C> @param M2 output spectral truncation
-
14 C> @param Q2 ((M+1)*((I+1)*M+2)) output field
-
15 C>
-
16 C> @author Iredell @date 92-10-31
-
17  SUBROUTINE sppad(I1,M1,Q1,I2,M2,Q2)
-
18 
-
19  REAL Q1((M1+1)*((I1+1)*M1+2))
-
20  REAL Q2((M2+1)*((I2+1)*M2+2))
-
21 
-
22  DO l=0,m2
-
23  DO n=l,i2*l+m2
-
24  ks2=l*(2*m2+(i2-1)*(l-1))+2*n
-
25  IF(l.LE.m1.AND.n.LE.i1*l+m1) THEN
-
26  ks1=l*(2*m1+(i1-1)*(l-1))+2*n
-
27  q2(ks2+1)=q1(ks1+1)
-
28  q2(ks2+2)=q1(ks1+2)
-
29  ELSE
-
30  q2(ks2+1)=0
-
31  q2(ks2+2)=0
-
32  ENDIF
-
33  ENDDO
-
34  ENDDO
-
35  RETURN
-
36  END
-
subroutine sppad(I1, M1, Q1, I2, M2, Q2)
Pad or truncate a spectral field.
Definition: sppad.f:18
+Go to the documentation of this file.
1C> @file
+
2C> @brief Pad or truncate a spectral field.
+
3C> @author Iredell @date 92-10-31
+
4
+
5C> Pad or truncate a spectral field.
+
6C>
+
7C> @param I1 input spectral domain shape
+
8C> (0 for triangular, 1 for rhomboidal)
+
9C> @param M1 input spectral truncation
+
10C> @param Q1 ((M+1)*((I+1)*M+2)) input field
+
11C> @param I2 output spectral domain shape
+
12C> (0 for triangular, 1 for rhomboidal)
+
13C> @param M2 output spectral truncation
+
14C> @param Q2 ((M+1)*((I+1)*M+2)) output field
+
15C>
+
16C> @author Iredell @date 92-10-31
+
+
17 SUBROUTINE sppad(I1,M1,Q1,I2,M2,Q2)
+
18
+
19 REAL Q1((M1+1)*((I1+1)*M1+2))
+
20 REAL Q2((M2+1)*((I2+1)*M2+2))
+
21
+
22 DO l=0,m2
+
23 DO n=l,i2*l+m2
+
24 ks2=l*(2*m2+(i2-1)*(l-1))+2*n
+
25 IF(l.LE.m1.AND.n.LE.i1*l+m1) THEN
+
26 ks1=l*(2*m1+(i1-1)*(l-1))+2*n
+
27 q2(ks2+1)=q1(ks1+1)
+
28 q2(ks2+2)=q1(ks1+2)
+
29 ELSE
+
30 q2(ks2+1)=0
+
31 q2(ks2+2)=0
+
32 ENDIF
+
33 ENDDO
+
34 ENDDO
+
35 RETURN
+
+
36 END
+
subroutine sppad(i1, m1, q1, i2, m2, q2)
Pad or truncate a spectral field.
Definition sppad.f:18
diff --git a/spsynth_8f.html b/spsynth_8f.html index f9ff4462..cc565bb9 100644 --- a/spsynth_8f.html +++ b/spsynth_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spsynth.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@

@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
spsynth.f File Reference
+
spsynth.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine spsynth (I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
 Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Southern hemispheres). More...
 
subroutine spsynth (i, m, im, ix, nc, nctop, km, clat, pln, plntop, mp, spc, spctop, f)
 Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Southern hemispheres).
 

Detailed Description

Synthesize Fourier coefficients from spectral coefficients.

@@ -117,8 +123,8 @@

Definition in file spsynth.f.

Function/Subroutine Documentation

- -

◆ spsynth()

+ +

◆ spsynth()

diff --git a/spsynth_8f.js b/spsynth_8f.js index 6cb85dd1..ea1af476 100644 --- a/spsynth_8f.js +++ b/spsynth_8f.js @@ -1,4 +1,4 @@ var spsynth_8f = [ - [ "spsynth", "spsynth_8f.html#aa6a8113a459918728c876673520126bf", null ] + [ "spsynth", "spsynth_8f.html#a5f26553d2ecb2c6aef8693b2b7da0959", null ] ]; \ No newline at end of file diff --git a/spsynth_8f_source.html b/spsynth_8f_source.html index 7235ebde..972a3396 100644 --- a/spsynth_8f_source.html +++ b/spsynth_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spsynth.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,183 +81,191 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
spsynth.f
+
spsynth.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Synthesize Fourier coefficients from spectral coefficients.
-
3 C>
-
4 C> ### Program History Log
-
5 C> Date | Programmer | Comments
-
6 C> -----|------------|---------
-
7 C> 91-10-31 | Mark Iredell | Initial.
-
8 C> 1998-12-18 | Mark Iredell | Include scalar and gradient option.
-
9 C>
-
10 C> @author Iredell @date 92-10-31
-
11 
-
12 C> Synthesizes Fourier coefficients from spectral coefficients
-
13 C> for a latitude pair (Northern and Southern hemispheres).
-
14 C>
-
15 C> Vector components are divided by cosine of latitude.
-
16 C>
-
17 C> @param I spectral domain shape
-
18 C> (0 for triangular, 1 for rhomboidal)
-
19 C> @param M spectral truncation
-
20 C> @param IM even number of Fourier coefficients
-
21 C> @param IX dimension of Fourier coefficients (IX>=IM+2)
-
22 C> @param NC dimension of spectral coefficients
-
23 C> (NC>=(M+1)*((I+1)*M+2))
-
24 C> @param NCTOP dimension of spectral coefficients over top
-
25 C> (NCTOP>=2*(M+1))
-
26 C> @param KM number of fields
-
27 C> @param CLAT cosine of latitude
-
28 C> @param PLN ((M+1)*((I+1)*M+2)/2) Legendre polynomial
-
29 C> @param PLNTOP Legendre polynomial over top
-
30 C> @param SPC spectral coefficients
-
31 C> @param SPCTOP spectral coefficients over top
-
32 C> @param MP identifiers (0 for scalar, 1 for vector,
-
33 C> or 10 for scalar and gradient)
-
34 C> @param F Fourier coefficients for latitude pair
-
35 C>
-
36 C> @author Iredell @date 92-10-31
-
37  SUBROUTINE spsynth(I,M,IM,IX,NC,NCTOP,KM,CLAT,PLN,PLNTOP,MP,
-
38  & SPC,SPCTOP,F)
-
39 
-
40  REAL PLN((M+1)*((I+1)*M+2)/2),PLNTOP(M+1)
-
41  INTEGER MP(KM)
-
42  REAL SPC(NC,KM),SPCTOP(NCTOP,KM)
-
43  REAL F(IX,2,KM)
-
44  REAL :: TINYREAL=tiny(1.0)
-
45 
-
46 C ZERO OUT FOURIER COEFFICIENTS.
-
47  DO k=1,km
-
48  DO l=0,im/2
-
49  f(2*l+1,1,k)=0.
-
50  f(2*l+2,1,k)=0.
-
51  f(2*l+1,2,k)=0.
-
52  f(2*l+2,2,k)=0.
-
53  ENDDO
-
54  ENDDO
-
55 
-
56 C SYNTHESIS OVER POLE.
-
57 C INITIALIZE FOURIER COEFFICIENTS WITH TERMS OVER TOP OF THE SPECTRUM.
-
58 C INITIALIZE EVEN AND ODD POLYNOMIALS SEPARATELY.
-
59  IF(abs(clat).LT.tinyreal) THEN
-
60  ltope=mod(m+1+i,2)
-
61 !C$OMP PARALLEL DO PRIVATE(LB,LE,L,KS,KP,N,F1R,F1I)
-
62  DO k=1,km
-
63  lb=mp(k)
-
64  le=mp(k)
-
65  IF(mp(k).EQ.10) THEN
-
66  lb=0
-
67  le=1
-
68  ENDIF
-
69  l=lb
-
70  IF(l.EQ.1) THEN
-
71  IF(l.EQ.ltope) THEN
-
72  f(2*l+1,1,k)=plntop(l+1)*spctop(2*l+1,k)
-
73  f(2*l+2,1,k)=plntop(l+1)*spctop(2*l+2,k)
-
74  ELSE
-
75  f(2*l+1,2,k)=plntop(l+1)*spctop(2*l+1,k)
-
76  f(2*l+2,2,k)=plntop(l+1)*spctop(2*l+2,k)
-
77  ENDIF
-
78  ENDIF
-
79 C FOR EACH ZONAL WAVENUMBER, SYNTHESIZE TERMS OVER TOTAL WAVENUMBER.
-
80 C SYNTHESIZE EVEN AND ODD POLYNOMIALS SEPARATELY.
-
81  DO l=lb,le
-
82  ks=l*(2*m+(i-1)*(l-1))
-
83  kp=ks/2+1
-
84  DO n=l,i*l+m,2
-
85  f(2*l+1,1,k)=f(2*l+1,1,k)+pln(kp+n)*spc(ks+2*n+1,k)
-
86  f(2*l+2,1,k)=f(2*l+2,1,k)+pln(kp+n)*spc(ks+2*n+2,k)
-
87  ENDDO
-
88  DO n=l+1,i*l+m,2
-
89  f(2*l+1,2,k)=f(2*l+1,2,k)+pln(kp+n)*spc(ks+2*n+1,k)
-
90  f(2*l+2,2,k)=f(2*l+2,2,k)+pln(kp+n)*spc(ks+2*n+2,k)
-
91  ENDDO
-
92 C SEPARATE FOURIER COEFFICIENTS FROM EACH HEMISPHERE.
-
93 C ODD POLYNOMIALS CONTRIBUTE NEGATIVELY TO THE SOUTHERN HEMISPHERE.
-
94  f1r=f(2*l+1,1,k)
-
95  f1i=f(2*l+2,1,k)
-
96  f(2*l+1,1,k)=f1r+f(2*l+1,2,k)
-
97  f(2*l+2,1,k)=f1i+f(2*l+2,2,k)
-
98  f(2*l+1,2,k)=f1r-f(2*l+1,2,k)
-
99  f(2*l+2,2,k)=f1i-f(2*l+2,2,k)
-
100  ENDDO
-
101  ENDDO
-
102 
-
103 C SYNTHESIS OVER FINITE LATITUDE.
-
104 C INITIALIZE FOURIER COEFFICIENTS WITH TERMS OVER TOP OF THE SPECTRUM.
-
105 C INITIALIZE EVEN AND ODD POLYNOMIALS SEPARATELY.
-
106  ELSE
-
107  lx=min(m,im/2)
-
108  ltope=mod(m+1,2)
-
109  ltopo=1-ltope
-
110  le=1+i*ltope
-
111  lo=2-i*ltopo
-
112 !C$OMP PARALLEL DO PRIVATE(L,KS,KP,N,F1R,F1I)
-
113  DO k=1,km
-
114  IF(mp(k).EQ.1) THEN
-
115  DO l=ltope,lx,2
-
116  f(2*l+1,le,k)=plntop(l+1)*spctop(2*l+1,k)
-
117  f(2*l+2,le,k)=plntop(l+1)*spctop(2*l+2,k)
-
118  ENDDO
-
119  DO l=ltopo,lx,2
-
120  f(2*l+1,lo,k)=plntop(l+1)*spctop(2*l+1,k)
-
121  f(2*l+2,lo,k)=plntop(l+1)*spctop(2*l+2,k)
-
122  ENDDO
-
123  ENDIF
-
124 C FOR EACH ZONAL WAVENUMBER, SYNTHESIZE TERMS OVER TOTAL WAVENUMBER.
-
125 C SYNTHESIZE EVEN AND ODD POLYNOMIALS SEPARATELY.
-
126  DO l=0,lx
-
127  ks=l*(2*m+(i-1)*(l-1))
-
128  kp=ks/2+1
-
129  DO n=l,i*l+m,2
-
130  f(2*l+1,1,k)=f(2*l+1,1,k)+pln(kp+n)*spc(ks+2*n+1,k)
-
131  f(2*l+2,1,k)=f(2*l+2,1,k)+pln(kp+n)*spc(ks+2*n+2,k)
-
132  ENDDO
-
133  DO n=l+1,i*l+m,2
-
134  f(2*l+1,2,k)=f(2*l+1,2,k)+pln(kp+n)*spc(ks+2*n+1,k)
-
135  f(2*l+2,2,k)=f(2*l+2,2,k)+pln(kp+n)*spc(ks+2*n+2,k)
-
136  ENDDO
-
137  ENDDO
-
138 C SEPARATE FOURIER COEFFICIENTS FROM EACH HEMISPHERE.
-
139 C ODD POLYNOMIALS CONTRIBUTE NEGATIVELY TO THE SOUTHERN HEMISPHERE.
-
140 C DIVIDE VECTOR COMPONENTS BY COSINE LATITUDE.
-
141  DO l=0,lx
-
142  f1r=f(2*l+1,1,k)
-
143  f1i=f(2*l+2,1,k)
-
144  f(2*l+1,1,k)=f1r+f(2*l+1,2,k)
-
145  f(2*l+2,1,k)=f1i+f(2*l+2,2,k)
-
146  f(2*l+1,2,k)=f1r-f(2*l+1,2,k)
-
147  f(2*l+2,2,k)=f1i-f(2*l+2,2,k)
-
148  ENDDO
-
149  IF(mp(k).EQ.1) THEN
-
150  DO l=0,lx
-
151  f(2*l+1,1,k)=f(2*l+1,1,k)/clat
-
152  f(2*l+2,1,k)=f(2*l+2,1,k)/clat
-
153  f(2*l+1,2,k)=f(2*l+1,2,k)/clat
-
154  f(2*l+2,2,k)=f(2*l+2,2,k)/clat
-
155  ENDDO
-
156  ENDIF
-
157  ENDDO
-
158  ENDIF
-
159  END
-
subroutine spsynth(I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
Definition: spsynth.f:39
+Go to the documentation of this file.
1C> @file
+
2C> @brief Synthesize Fourier coefficients from spectral coefficients.
+
3C>
+
4C> ### Program History Log
+
5C> Date | Programmer | Comments
+
6C> -----|------------|---------
+
7C> 91-10-31 | Mark Iredell | Initial.
+
8C> 1998-12-18 | Mark Iredell | Include scalar and gradient option.
+
9C>
+
10C> @author Iredell @date 92-10-31
+
11
+
12C> Synthesizes Fourier coefficients from spectral coefficients
+
13C> for a latitude pair (Northern and Southern hemispheres).
+
14C>
+
15C> Vector components are divided by cosine of latitude.
+
16C>
+
17C> @param I spectral domain shape
+
18C> (0 for triangular, 1 for rhomboidal)
+
19C> @param M spectral truncation
+
20C> @param IM even number of Fourier coefficients
+
21C> @param IX dimension of Fourier coefficients (IX>=IM+2)
+
22C> @param NC dimension of spectral coefficients
+
23C> (NC>=(M+1)*((I+1)*M+2))
+
24C> @param NCTOP dimension of spectral coefficients over top
+
25C> (NCTOP>=2*(M+1))
+
26C> @param KM number of fields
+
27C> @param CLAT cosine of latitude
+
28C> @param PLN ((M+1)*((I+1)*M+2)/2) Legendre polynomial
+
29C> @param PLNTOP Legendre polynomial over top
+
30C> @param SPC spectral coefficients
+
31C> @param SPCTOP spectral coefficients over top
+
32C> @param MP identifiers (0 for scalar, 1 for vector,
+
33C> or 10 for scalar and gradient)
+
34C> @param F Fourier coefficients for latitude pair
+
35C>
+
36C> @author Iredell @date 92-10-31
+
+
37 SUBROUTINE spsynth(I,M,IM,IX,NC,NCTOP,KM,CLAT,PLN,PLNTOP,MP,
+
38 & SPC,SPCTOP,F)
+
39
+
40 REAL PLN((M+1)*((I+1)*M+2)/2),PLNTOP(M+1)
+
41 INTEGER MP(KM)
+
42 REAL SPC(NC,KM),SPCTOP(NCTOP,KM)
+
43 REAL F(IX,2,KM)
+
44 REAL :: TINYREAL=tiny(1.0)
+
45
+
46C ZERO OUT FOURIER COEFFICIENTS.
+
47 DO k=1,km
+
48 DO l=0,im/2
+
49 f(2*l+1,1,k)=0.
+
50 f(2*l+2,1,k)=0.
+
51 f(2*l+1,2,k)=0.
+
52 f(2*l+2,2,k)=0.
+
53 ENDDO
+
54 ENDDO
+
55
+
56C SYNTHESIS OVER POLE.
+
57C INITIALIZE FOURIER COEFFICIENTS WITH TERMS OVER TOP OF THE SPECTRUM.
+
58C INITIALIZE EVEN AND ODD POLYNOMIALS SEPARATELY.
+
59 IF(abs(clat).LT.tinyreal) THEN
+
60 ltope=mod(m+1+i,2)
+
61!C$OMP PARALLEL DO PRIVATE(LB,LE,L,KS,KP,N,F1R,F1I)
+
62 DO k=1,km
+
63 lb=mp(k)
+
64 le=mp(k)
+
65 IF(mp(k).EQ.10) THEN
+
66 lb=0
+
67 le=1
+
68 ENDIF
+
69 l=lb
+
70 IF(l.EQ.1) THEN
+
71 IF(l.EQ.ltope) THEN
+
72 f(2*l+1,1,k)=plntop(l+1)*spctop(2*l+1,k)
+
73 f(2*l+2,1,k)=plntop(l+1)*spctop(2*l+2,k)
+
74 ELSE
+
75 f(2*l+1,2,k)=plntop(l+1)*spctop(2*l+1,k)
+
76 f(2*l+2,2,k)=plntop(l+1)*spctop(2*l+2,k)
+
77 ENDIF
+
78 ENDIF
+
79C FOR EACH ZONAL WAVENUMBER, SYNTHESIZE TERMS OVER TOTAL WAVENUMBER.
+
80C SYNTHESIZE EVEN AND ODD POLYNOMIALS SEPARATELY.
+
81 DO l=lb,le
+
82 ks=l*(2*m+(i-1)*(l-1))
+
83 kp=ks/2+1
+
84 DO n=l,i*l+m,2
+
85 f(2*l+1,1,k)=f(2*l+1,1,k)+pln(kp+n)*spc(ks+2*n+1,k)
+
86 f(2*l+2,1,k)=f(2*l+2,1,k)+pln(kp+n)*spc(ks+2*n+2,k)
+
87 ENDDO
+
88 DO n=l+1,i*l+m,2
+
89 f(2*l+1,2,k)=f(2*l+1,2,k)+pln(kp+n)*spc(ks+2*n+1,k)
+
90 f(2*l+2,2,k)=f(2*l+2,2,k)+pln(kp+n)*spc(ks+2*n+2,k)
+
91 ENDDO
+
92C SEPARATE FOURIER COEFFICIENTS FROM EACH HEMISPHERE.
+
93C ODD POLYNOMIALS CONTRIBUTE NEGATIVELY TO THE SOUTHERN HEMISPHERE.
+
94 f1r=f(2*l+1,1,k)
+
95 f1i=f(2*l+2,1,k)
+
96 f(2*l+1,1,k)=f1r+f(2*l+1,2,k)
+
97 f(2*l+2,1,k)=f1i+f(2*l+2,2,k)
+
98 f(2*l+1,2,k)=f1r-f(2*l+1,2,k)
+
99 f(2*l+2,2,k)=f1i-f(2*l+2,2,k)
+
100 ENDDO
+
101 ENDDO
+
102
+
103C SYNTHESIS OVER FINITE LATITUDE.
+
104C INITIALIZE FOURIER COEFFICIENTS WITH TERMS OVER TOP OF THE SPECTRUM.
+
105C INITIALIZE EVEN AND ODD POLYNOMIALS SEPARATELY.
+
106 ELSE
+
107 lx=min(m,im/2)
+
108 ltope=mod(m+1,2)
+
109 ltopo=1-ltope
+
110 le=1+i*ltope
+
111 lo=2-i*ltopo
+
112!C$OMP PARALLEL DO PRIVATE(L,KS,KP,N,F1R,F1I)
+
113 DO k=1,km
+
114 IF(mp(k).EQ.1) THEN
+
115 DO l=ltope,lx,2
+
116 f(2*l+1,le,k)=plntop(l+1)*spctop(2*l+1,k)
+
117 f(2*l+2,le,k)=plntop(l+1)*spctop(2*l+2,k)
+
118 ENDDO
+
119 DO l=ltopo,lx,2
+
120 f(2*l+1,lo,k)=plntop(l+1)*spctop(2*l+1,k)
+
121 f(2*l+2,lo,k)=plntop(l+1)*spctop(2*l+2,k)
+
122 ENDDO
+
123 ENDIF
+
124C FOR EACH ZONAL WAVENUMBER, SYNTHESIZE TERMS OVER TOTAL WAVENUMBER.
+
125C SYNTHESIZE EVEN AND ODD POLYNOMIALS SEPARATELY.
+
126 DO l=0,lx
+
127 ks=l*(2*m+(i-1)*(l-1))
+
128 kp=ks/2+1
+
129 DO n=l,i*l+m,2
+
130 f(2*l+1,1,k)=f(2*l+1,1,k)+pln(kp+n)*spc(ks+2*n+1,k)
+
131 f(2*l+2,1,k)=f(2*l+2,1,k)+pln(kp+n)*spc(ks+2*n+2,k)
+
132 ENDDO
+
133 DO n=l+1,i*l+m,2
+
134 f(2*l+1,2,k)=f(2*l+1,2,k)+pln(kp+n)*spc(ks+2*n+1,k)
+
135 f(2*l+2,2,k)=f(2*l+2,2,k)+pln(kp+n)*spc(ks+2*n+2,k)
+
136 ENDDO
+
137 ENDDO
+
138C SEPARATE FOURIER COEFFICIENTS FROM EACH HEMISPHERE.
+
139C ODD POLYNOMIALS CONTRIBUTE NEGATIVELY TO THE SOUTHERN HEMISPHERE.
+
140C DIVIDE VECTOR COMPONENTS BY COSINE LATITUDE.
+
141 DO l=0,lx
+
142 f1r=f(2*l+1,1,k)
+
143 f1i=f(2*l+2,1,k)
+
144 f(2*l+1,1,k)=f1r+f(2*l+1,2,k)
+
145 f(2*l+2,1,k)=f1i+f(2*l+2,2,k)
+
146 f(2*l+1,2,k)=f1r-f(2*l+1,2,k)
+
147 f(2*l+2,2,k)=f1i-f(2*l+2,2,k)
+
148 ENDDO
+
149 IF(mp(k).EQ.1) THEN
+
150 DO l=0,lx
+
151 f(2*l+1,1,k)=f(2*l+1,1,k)/clat
+
152 f(2*l+2,1,k)=f(2*l+2,1,k)/clat
+
153 f(2*l+1,2,k)=f(2*l+1,2,k)/clat
+
154 f(2*l+2,2,k)=f(2*l+2,2,k)/clat
+
155 ENDDO
+
156 ENDIF
+
157 ENDDO
+
158 ENDIF
+
+
159 END
+
subroutine spsynth(i, m, im, ix, nc, nctop, km, clat, pln, plntop, mp, spc, spctop, f)
Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
Definition spsynth.f:39
diff --git a/sptez_8f.html b/sptez_8f.html index dabb0310..fcccf350 100644 --- a/sptez_8f.html +++ b/sptez_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptez.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptez.f File Reference
+
sptez.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptez (IROMB, MAXWV, IDRT, IMAX, JMAX, WAVE, GRID, IDIR)
 This subprogram performs a spherical transform between spectral coefficients of a scalar quantity and a field on a global cylindrical grid. More...
 
subroutine sptez (iromb, maxwv, idrt, imax, jmax, wave, grid, idir)
 This subprogram performs a spherical transform between spectral coefficients of a scalar quantity and a field on a global cylindrical grid.
 

Detailed Description

Perform a simple scalar spherical transform.

@@ -107,8 +113,8 @@

Definition in file sptez.f.

Function/Subroutine Documentation

- -

◆ sptez()

+ +

◆ sptez()

@@ -117,49 +123,49 @@

subroutine sptez (   - IROMB, + iromb,   - MAXWV, + maxwv,   - IDRT, + idrt,   - IMAX, + imax,   - JMAX, + jmax, real, dimension((maxwv+1)*((iromb+1)*maxwv+2))  - WAVE, + wave, real, dimension(imax,jmax)  - GRID, + grid,   - IDIR  + idir  @@ -174,7 +180,7 @@

sptran().

+

For more flexibility and efficiency, call sptran().

Subprogram can be called from a multiprocessing environment.

Minimum grid dimensions for unaliased transforms to spectral:

@@ -217,7 +223,7 @@

Definition at line 49 of file sptez.f.

-

References ncpus(), and sptranf().

+

References ncpus(), and sptranf().

@@ -227,7 +233,7 @@

diff --git a/sptez_8f.js b/sptez_8f.js index 03fe31e3..9801b4cc 100644 --- a/sptez_8f.js +++ b/sptez_8f.js @@ -1,4 +1,4 @@ var sptez_8f = [ - [ "sptez", "sptez_8f.html#a418a7d182834b2e2dafae2fe881ba9fc", null ] + [ "sptez", "sptez_8f.html#a2f946d9be4069109163ffad32eae2fe4", null ] ]; \ No newline at end of file diff --git a/sptez_8f_source.html b/sptez_8f_source.html index e907436c..96213aad 100644 --- a/sptez_8f_source.html +++ b/sptez_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptez.f Source File @@ -23,10 +23,9 @@

- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0

- + +/* @license-end */ + +
@@ -76,97 +81,105 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptez.f
+
sptez.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Perform a simple scalar spherical transform.
-
3 C> @author Iredell @date 96-02-29
-
4 
-
5 C> This subprogram performs a spherical transform
-
6 C> between spectral coefficients of a scalar quantity
-
7 C> and a field on a global cylindrical grid.
-
8 C>
-
9 C> The wave-space can be either triangular or rhomboidal.
-
10 C>
-
11 C> The grid-space can be either an equally-spaced grid
-
12 C> (with or without pole points) or a Gaussian grid.
-
13 C>
-
14 C> The wave field is in sequential 'IBM ORDER'.
-
15 C>
-
16 C> The grid field is indexed East to West, then North to South.
-
17 C>
-
18 C> For more flexibility and efficiency, call sptran().
-
19 C>
-
20 C> Subprogram can be called from a multiprocessing environment.
-
21 C>
-
22 C> Minimum grid dimensions for unaliased transforms to spectral:
-
23 C> DIMENSION |LINEAR |QUADRATIC
-
24 C> ----------------------- |--------- |-------------
-
25 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
-
26 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
-
27 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
-
28 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
-
29 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
-
30 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
-
31 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
-
32 C>
-
33 C> @param IROMB spectral domain shape
-
34 C> (0 for triangular, 1 for rhomboidal)
-
35 C> @param MAXWV spectral truncation
-
36 C> @param IDRT grid identifier
-
37 C> - IDRT=4 for Gaussian grid,
-
38 C> - IDRT=0 for equally-spaced grid including poles,
-
39 C> - IDRT=256 for equally-spaced grid excluding poles
-
40 C> @param IMAX even number of longitudes.
-
41 C> @param JMAX number of latitudes.
-
42 C> @param[out] WAVE wave field if IDIR>0
-
43 C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
-
44 C> @param[out] GRID grid field (E->W,N->S) if IDIR<0
-
45 C> @param IDIR transform flag
-
46 C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
-
47 C>
-
48 C> @author Iredell @date 96-02-29
-
49  SUBROUTINE sptez(IROMB,MAXWV,IDRT,IMAX,JMAX,WAVE,GRID,IDIR)
-
50 
-
51  REAL WAVE((MAXWV+1)*((IROMB+1)*MAXWV+2))
-
52  REAL GRID(IMAX,JMAX)
-
53 
-
54  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
55  ip=1
-
56  is=1
-
57  jn=imax
-
58  js=-jn
-
59  kw=2*mx
-
60  kg=imax*jmax
-
61  jb=1
-
62  je=(jmax+1)/2
-
63  jc=ncpus()
-
64 ! print *, " EM: SPTEZ:::JJJJJJJJJJJJJJJJJJJCCCCCCCCCCC=" ,JC
-
65  IF(idir.LT.0) wave=0
-
66 
-
67  CALL sptranf(iromb,maxwv,idrt,imax,jmax,1,
-
68  & ip,is,jn,js,kw,kg,jb,je,jc,
-
69  & wave,grid,grid(1,jmax),idir)
-
70 
-
71  END
-
function ncpus()
Set number of CPUs - the number of processors over which to parallelize.
Definition: ncpus.F:24
-
subroutine sptez(IROMB, MAXWV, IDRT, IMAX, JMAX, WAVE, GRID, IDIR)
This subprogram performs a spherical transform between spectral coefficients of a scalar quantity and...
Definition: sptez.f:50
-
subroutine sptranf(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IP, IS, JN, JS, KW, KG, JB, JE, JC, WAVE, GRIDN, GRIDS, IDIR)
This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
Definition: sptranf.f:77
+Go to the documentation of this file.
1C> @file
+
2C> @brief Perform a simple scalar spherical transform.
+
3C> @author Iredell @date 96-02-29
+
4
+
5C> This subprogram performs a spherical transform
+
6C> between spectral coefficients of a scalar quantity
+
7C> and a field on a global cylindrical grid.
+
8C>
+
9C> The wave-space can be either triangular or rhomboidal.
+
10C>
+
11C> The grid-space can be either an equally-spaced grid
+
12C> (with or without pole points) or a Gaussian grid.
+
13C>
+
14C> The wave field is in sequential 'IBM ORDER'.
+
15C>
+
16C> The grid field is indexed East to West, then North to South.
+
17C>
+
18C> For more flexibility and efficiency, call sptran().
+
19C>
+
20C> Subprogram can be called from a multiprocessing environment.
+
21C>
+
22C> Minimum grid dimensions for unaliased transforms to spectral:
+
23C> DIMENSION |LINEAR |QUADRATIC
+
24C> ----------------------- |--------- |-------------
+
25C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
+
26C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
+
27C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
+
28C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
+
29C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
+
30C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
+
31C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
+
32C>
+
33C> @param IROMB spectral domain shape
+
34C> (0 for triangular, 1 for rhomboidal)
+
35C> @param MAXWV spectral truncation
+
36C> @param IDRT grid identifier
+
37C> - IDRT=4 for Gaussian grid,
+
38C> - IDRT=0 for equally-spaced grid including poles,
+
39C> - IDRT=256 for equally-spaced grid excluding poles
+
40C> @param IMAX even number of longitudes.
+
41C> @param JMAX number of latitudes.
+
42C> @param[out] WAVE wave field if IDIR>0
+
43C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
+
44C> @param[out] GRID grid field (E->W,N->S) if IDIR<0
+
45C> @param IDIR transform flag
+
46C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
+
47C>
+
48C> @author Iredell @date 96-02-29
+
+
49 SUBROUTINE sptez(IROMB,MAXWV,IDRT,IMAX,JMAX,WAVE,GRID,IDIR)
+
50
+
51 REAL WAVE((MAXWV+1)*((IROMB+1)*MAXWV+2))
+
52 REAL GRID(IMAX,JMAX)
+
53
+
54 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
55 ip=1
+
56 is=1
+
57 jn=imax
+
58 js=-jn
+
59 kw=2*mx
+
60 kg=imax*jmax
+
61 jb=1
+
62 je=(jmax+1)/2
+
63 jc=ncpus()
+
64! print *, " EM: SPTEZ:::JJJJJJJJJJJJJJJJJJJCCCCCCCCCCC=" ,JC
+
65 IF(idir.LT.0) wave=0
+
66
+
67 CALL sptranf(iromb,maxwv,idrt,imax,jmax,1,
+
68 & ip,is,jn,js,kw,kg,jb,je,jc,
+
69 & wave,grid,grid(1,jmax),idir)
+
70
+
+
71 END
+
function ncpus()
Set number of CPUs - the number of processors over which to parallelize.
Definition ncpus.F:22
+
subroutine sptez(iromb, maxwv, idrt, imax, jmax, wave, grid, idir)
This subprogram performs a spherical transform between spectral coefficients of a scalar quantity and...
Definition sptez.f:50
+
subroutine sptranf(iromb, maxwv, idrt, imax, jmax, kmax, ip, is, jn, js, kw, kg, jb, je, jc, wave, gridn, grids, idir)
This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
Definition sptranf.f:77
diff --git a/sptezd_8f.html b/sptezd_8f.html index 0d2359c9..f210b77b 100644 --- a/sptezd_8f.html +++ b/sptezd_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptezd.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@

@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptezd.f File Reference
+
sptezd.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptezd (IROMB, MAXWV, IDRT, IMAX, JMAX, WAVE, GRIDMN, GRIDX, GRIDY, IDIR)
 This subprogram performs a spherical transform between spectral coefficients of a scalar field and its mean and gradient on a global cylindrical grid. More...
 
subroutine sptezd (iromb, maxwv, idrt, imax, jmax, wave, gridmn, gridx, gridy, idir)
 This subprogram performs a spherical transform between spectral coefficients of a scalar field and its mean and gradient on a global cylindrical grid.
 

Detailed Description

Perform a simple gradient spherical transform.

@@ -107,8 +113,8 @@

Definition in file sptezd.f.

Function/Subroutine Documentation

- -

◆ sptezd()

+ +

◆ sptezd()

@@ -117,61 +123,61 @@

subroutine sptezd (   - IROMB, + iromb,   - MAXWV, + maxwv,   - IDRT, + idrt,   - IMAX, + imax,   - JMAX, + jmax, real, dimension(*)  - WAVE, + wave, real, dimension(*)  - GRIDMN, + gridmn, real, dimension(imax,jmax)  - GRIDX, + gridx, real, dimension(imax,jmax)  - GRIDY, + gridy,   - IDIR  + idir  @@ -186,7 +192,7 @@

sptran().

+

For more flexibility and efficiency, call sptran().

Subprogram can be called from a multiprocessing environment.

Minimum grid dimensions for unaliased transforms to spectral:

@@ -231,7 +237,7 @@

Definition at line 50 of file sptezd.f.

-

References ncpus(), and sptrand().

+

References ncpus(), and sptrand().

@@ -241,7 +247,7 @@

diff --git a/sptezd_8f.js b/sptezd_8f.js index d5a75e40..831bad70 100644 --- a/sptezd_8f.js +++ b/sptezd_8f.js @@ -1,4 +1,4 @@ var sptezd_8f = [ - [ "sptezd", "sptezd_8f.html#a6c30b52dcb4da9e403eeeb307b9516d7", null ] + [ "sptezd", "sptezd_8f.html#aae14495bfd31b11b22b70e29a415ce86", null ] ]; \ No newline at end of file diff --git a/sptezd_8f_source.html b/sptezd_8f_source.html index d86821c3..d40d6f2d 100644 --- a/sptezd_8f_source.html +++ b/sptezd_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptezd.f Source File @@ -23,10 +23,9 @@

- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0

- + +/* @license-end */ + +
@@ -76,86 +81,94 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptezd.f
+
sptezd.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Perform a simple gradient spherical transform.
-
3 C> @author Iredell @date 96-02-29
-
4 
-
5 C> This subprogram performs a spherical transform
-
6 C> between spectral coefficients of a scalar field
-
7 C> and its mean and gradient on a global cylindrical grid.
-
8 C>
-
9 C> The wave-space can be either triangular or rhomboidal.
-
10 C>
-
11 C> The grid-space can be either an equally-spaced grid
-
12 C> (with or without pole points) or a Gaussian grid.
-
13 C>
-
14 C> The wave field is in sequential 'IBM ORDER'.
-
15 C>
-
16 C> The grid fiels is indexed East to West, then North to South.
-
17 C>
-
18 C> For more flexibility and efficiency, call sptran().
-
19 C>
-
20 C> Subprogram can be called from a multiprocessing environment.
-
21 C>
-
22 C> Minimum grid dimensions for unaliased transforms to spectral:
-
23 C> DIMENSION |LINEAR |QUADRATIC
-
24 C> ----------------------- |--------- |-------------
-
25 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
-
26 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
-
27 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
-
28 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
-
29 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
-
30 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
-
31 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
-
32 C>
-
33 C> @param IROMB spectral domain shape
-
34 C> (0 for triangular, 1 for rhomboidal)
-
35 C> @param MAXWV spectral truncation
-
36 C> @param IDRT grid identifier
-
37 C> - IDRT=4 for Gaussian grid
-
38 C> - IDRT=0 for equally-spaced grid including poles
-
39 C> - IDRT=256 for equally-spaced grid excluding poles
-
40 C> @param IMAX even number of longitudes.
-
41 C> @param JMAX number of latitudes.
-
42 C> @param[out] WAVE wave field if IDIR>0
-
43 C> @param[out] GRIDMN global mean if IDIR<0
-
44 C> @param[out] GRIDX grid x-gradients (E->W,N->S) if IDIR<0
-
45 C> @param[out] GRIDY grid y-gradients (E->W,N->S) if IDIR<0
-
46 C> @param IDIR transform flag
-
47 C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
-
48 C>
-
49 C> @author Iredell @date 96-02-29
-
50  SUBROUTINE sptezd(IROMB,MAXWV,IDRT,IMAX,JMAX,
-
51  & WAVE,GRIDMN,GRIDX,GRIDY,IDIR)
-
52 
-
53  REAL WAVE(*),GRIDX(IMAX,JMAX),GRIDY(IMAX,JMAX),GRIDMN(*)
-
54 
-
55  jc=ncpus()
-
56  CALL sptrand(iromb,maxwv,idrt,imax,jmax,1,
-
57  & 0,0,0,0,0,0,0,0,jc,
-
58  & wave,gridmn,
-
59  & gridx,gridx(1,jmax),gridy,gridy(1,jmax),1)
-
60  END
-
function ncpus()
Set number of CPUs - the number of processors over which to parallelize.
Definition: ncpus.F:24
-
subroutine sptezd(IROMB, MAXWV, IDRT, IMAX, JMAX, WAVE, GRIDMN, GRIDX, GRIDY, IDIR)
This subprogram performs a spherical transform between spectral coefficients of a scalar field and it...
Definition: sptezd.f:52
-
subroutine sptrand(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDMN, GRIDXN, GRIDXS, GRIDYN, GRIDYS, IDIR)
This subprogram performs a spherical transform between spectral coefficients of scalar fields and the...
Definition: sptrand.f:92
+Go to the documentation of this file.
1C> @file
+
2C> @brief Perform a simple gradient spherical transform.
+
3C> @author Iredell @date 96-02-29
+
4
+
5C> This subprogram performs a spherical transform
+
6C> between spectral coefficients of a scalar field
+
7C> and its mean and gradient on a global cylindrical grid.
+
8C>
+
9C> The wave-space can be either triangular or rhomboidal.
+
10C>
+
11C> The grid-space can be either an equally-spaced grid
+
12C> (with or without pole points) or a Gaussian grid.
+
13C>
+
14C> The wave field is in sequential 'IBM ORDER'.
+
15C>
+
16C> The grid fiels is indexed East to West, then North to South.
+
17C>
+
18C> For more flexibility and efficiency, call sptran().
+
19C>
+
20C> Subprogram can be called from a multiprocessing environment.
+
21C>
+
22C> Minimum grid dimensions for unaliased transforms to spectral:
+
23C> DIMENSION |LINEAR |QUADRATIC
+
24C> ----------------------- |--------- |-------------
+
25C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
+
26C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
+
27C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
+
28C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
+
29C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
+
30C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
+
31C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
+
32C>
+
33C> @param IROMB spectral domain shape
+
34C> (0 for triangular, 1 for rhomboidal)
+
35C> @param MAXWV spectral truncation
+
36C> @param IDRT grid identifier
+
37C> - IDRT=4 for Gaussian grid
+
38C> - IDRT=0 for equally-spaced grid including poles
+
39C> - IDRT=256 for equally-spaced grid excluding poles
+
40C> @param IMAX even number of longitudes.
+
41C> @param JMAX number of latitudes.
+
42C> @param[out] WAVE wave field if IDIR>0
+
43C> @param[out] GRIDMN global mean if IDIR<0
+
44C> @param[out] GRIDX grid x-gradients (E->W,N->S) if IDIR<0
+
45C> @param[out] GRIDY grid y-gradients (E->W,N->S) if IDIR<0
+
46C> @param IDIR transform flag
+
47C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
+
48C>
+
49C> @author Iredell @date 96-02-29
+
+
50 SUBROUTINE sptezd(IROMB,MAXWV,IDRT,IMAX,JMAX,
+
51 & WAVE,GRIDMN,GRIDX,GRIDY,IDIR)
+
52
+
53 REAL WAVE(*),GRIDX(IMAX,JMAX),GRIDY(IMAX,JMAX),GRIDMN(*)
+
54
+
55 jc=ncpus()
+
56 CALL sptrand(iromb,maxwv,idrt,imax,jmax,1,
+
57 & 0,0,0,0,0,0,0,0,jc,
+
58 & wave,gridmn,
+
59 & gridx,gridx(1,jmax),gridy,gridy(1,jmax),1)
+
+
60 END
+
function ncpus()
Set number of CPUs - the number of processors over which to parallelize.
Definition ncpus.F:22
+
subroutine sptezd(iromb, maxwv, idrt, imax, jmax, wave, gridmn, gridx, gridy, idir)
This subprogram performs a spherical transform between spectral coefficients of a scalar field and it...
Definition sptezd.f:52
+
subroutine sptrand(iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, wave, gridmn, gridxn, gridxs, gridyn, gridys, idir)
This subprogram performs a spherical transform between spectral coefficients of scalar fields and the...
Definition sptrand.f:92
diff --git a/sptezm_8f.html b/sptezm_8f.html index d3955611..8262b3d5 100644 --- a/sptezm_8f.html +++ b/sptezm_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptezm.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptezm.f File Reference
+
sptezm.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptezm (IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, WAVE, GRID, IDIR)
 This subprogram performs spherical transforms between spectral coefficients of scalar quantities and fields on a global cylindrical grid. More...
 
subroutine sptezm (iromb, maxwv, idrt, imax, jmax, kmax, wave, grid, idir)
 This subprogram performs spherical transforms between spectral coefficients of scalar quantities and fields on a global cylindrical grid.
 

Detailed Description

Perform simple scalar spherical transforms.

@@ -107,8 +113,8 @@

Definition in file sptezm.f.

Function/Subroutine Documentation

- -

◆ sptezm()

+ +

◆ sptezm()

@@ -117,55 +123,55 @@

subroutine sptezm (   - IROMB, + iromb,   - MAXWV, + maxwv,   - IDRT, + idrt,   - IMAX, + imax,   - JMAX, + jmax,   - KMAX, + kmax, real, dimension((maxwv+1)*((iromb+1)*maxwv+2),kmax)  - WAVE, + wave, real, dimension(imax,jmax,kmax)  - GRID, + grid,   - IDIR  + idir  @@ -180,7 +186,7 @@

sptran().

+

For more flexibility and efficiency, call sptran().

Subprogram can be called from a multiprocessing environment.

Minimum grid dimensions for unaliased transforms to spectral:

@@ -224,7 +230,7 @@

Definition at line 50 of file sptezm.f.

-

References ncpus(), and sptranf().

+

References ncpus(), and sptranf().

@@ -234,7 +240,7 @@

diff --git a/sptezm_8f.js b/sptezm_8f.js index d8cb8be0..a3d9053f 100644 --- a/sptezm_8f.js +++ b/sptezm_8f.js @@ -1,4 +1,4 @@ var sptezm_8f = [ - [ "sptezm", "sptezm_8f.html#a1430a0df2cba7eefaf67c939684be2d1", null ] + [ "sptezm", "sptezm_8f.html#a12675af34cd4ab1e337286dfee620df3", null ] ]; \ No newline at end of file diff --git a/sptezm_8f_source.html b/sptezm_8f_source.html index a68c0f93..c402f769 100644 --- a/sptezm_8f_source.html +++ b/sptezm_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptezm.f Source File @@ -23,10 +23,9 @@

- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0

- + +/* @license-end */ + +
@@ -76,96 +81,104 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptezm.f
+
sptezm.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Perform simple scalar spherical transforms.
-
3 C> @author Iredell @date 96-02-29
-
4 
-
5 C> This subprogram performs spherical transforms
-
6 C> between spectral coefficients of scalar quantities
-
7 C> and fields on a global cylindrical grid.
-
8 C>
-
9 C> The wave-space can be either triangular or rhomboidal.
-
10 C>
-
11 C> The grid-space can be either an equally-spaced grid
-
12 C> (with or without pole points) or a Gaussian grid.
-
13 C>
-
14 C> Wave fields are in sequential 'IBM ORDER'.
-
15 C>
-
16 C> Grid fields are indexed East to West, then North to South.
-
17 C>
-
18 C> For more flexibility and efficiency, call sptran().
-
19 C>
-
20 C> Subprogram can be called from a multiprocessing environment.
-
21 C>
-
22 C> Minimum grid dimensions for unaliased transforms to spectral:
-
23 C> DIMENSION |LINEAR |QUADRATIC
-
24 C> ----------------------- |--------- |-------------
-
25 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
-
26 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
-
27 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
-
28 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
-
29 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
-
30 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
-
31 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
-
32 C>
-
33 C> @param IROMB spectral domain shape
-
34 C> (0 for triangular, 1 for rhomboidal)
-
35 C> @param MAXWV spectral truncation
-
36 C> @param IDRT grid identifier
-
37 C> - IDRT=4 for Gaussian grid
-
38 C> - IDRT=0 for equally-spaced grid including poles
-
39 C> - IDRT=256 for equally-spaced grid excluding poles
-
40 C> @param IMAX even number of longitudes
-
41 C> @param JMAX number of latitudes
-
42 C> @param KMAX number of fields to transform
-
43 C> @param[out] WAVE wave field if IDIR>0
-
44 C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
-
45 C> @param[out] GRID grid field (E->W,N->S) if IDIR<0
-
46 C> @param IDIR transform flag
-
47 C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
-
48 C>
-
49 C> @author Iredell @date 96-02-29
-
50  SUBROUTINE sptezm(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,WAVE,GRID,IDIR)
-
51 
-
52  REAL WAVE((MAXWV+1)*((IROMB+1)*MAXWV+2),KMAX)
-
53  REAL GRID(IMAX,JMAX,KMAX)
-
54 
-
55  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
56  ip=1
-
57  is=1
-
58  jn=imax
-
59  js=-jn
-
60  kw=2*mx
-
61  kg=imax*jmax
-
62  jb=1
-
63  je=(jmax+1)/2
-
64  jc=ncpus()
-
65  IF(idir.LT.0) wave=0
-
66 
-
67  CALL sptranf(iromb,maxwv,idrt,imax,jmax,kmax,
-
68  & ip,is,jn,js,kw,kg,jb,je,jc,
-
69  & wave,grid,grid(1,jmax,1),idir)
-
70  END
-
function ncpus()
Set number of CPUs - the number of processors over which to parallelize.
Definition: ncpus.F:24
-
subroutine sptezm(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, WAVE, GRID, IDIR)
This subprogram performs spherical transforms between spectral coefficients of scalar quantities and ...
Definition: sptezm.f:51
-
subroutine sptranf(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IP, IS, JN, JS, KW, KG, JB, JE, JC, WAVE, GRIDN, GRIDS, IDIR)
This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
Definition: sptranf.f:77
+Go to the documentation of this file.
1C> @file
+
2C> @brief Perform simple scalar spherical transforms.
+
3C> @author Iredell @date 96-02-29
+
4
+
5C> This subprogram performs spherical transforms
+
6C> between spectral coefficients of scalar quantities
+
7C> and fields on a global cylindrical grid.
+
8C>
+
9C> The wave-space can be either triangular or rhomboidal.
+
10C>
+
11C> The grid-space can be either an equally-spaced grid
+
12C> (with or without pole points) or a Gaussian grid.
+
13C>
+
14C> Wave fields are in sequential 'IBM ORDER'.
+
15C>
+
16C> Grid fields are indexed East to West, then North to South.
+
17C>
+
18C> For more flexibility and efficiency, call sptran().
+
19C>
+
20C> Subprogram can be called from a multiprocessing environment.
+
21C>
+
22C> Minimum grid dimensions for unaliased transforms to spectral:
+
23C> DIMENSION |LINEAR |QUADRATIC
+
24C> ----------------------- |--------- |-------------
+
25C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
+
26C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
+
27C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
+
28C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
+
29C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
+
30C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
+
31C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
+
32C>
+
33C> @param IROMB spectral domain shape
+
34C> (0 for triangular, 1 for rhomboidal)
+
35C> @param MAXWV spectral truncation
+
36C> @param IDRT grid identifier
+
37C> - IDRT=4 for Gaussian grid
+
38C> - IDRT=0 for equally-spaced grid including poles
+
39C> - IDRT=256 for equally-spaced grid excluding poles
+
40C> @param IMAX even number of longitudes
+
41C> @param JMAX number of latitudes
+
42C> @param KMAX number of fields to transform
+
43C> @param[out] WAVE wave field if IDIR>0
+
44C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
+
45C> @param[out] GRID grid field (E->W,N->S) if IDIR<0
+
46C> @param IDIR transform flag
+
47C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
+
48C>
+
49C> @author Iredell @date 96-02-29
+
+
50 SUBROUTINE sptezm(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,WAVE,GRID,IDIR)
+
51
+
52 REAL WAVE((MAXWV+1)*((IROMB+1)*MAXWV+2),KMAX)
+
53 REAL GRID(IMAX,JMAX,KMAX)
+
54
+
55 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
56 ip=1
+
57 is=1
+
58 jn=imax
+
59 js=-jn
+
60 kw=2*mx
+
61 kg=imax*jmax
+
62 jb=1
+
63 je=(jmax+1)/2
+
64 jc=ncpus()
+
65 IF(idir.LT.0) wave=0
+
66
+
67 CALL sptranf(iromb,maxwv,idrt,imax,jmax,kmax,
+
68 & ip,is,jn,js,kw,kg,jb,je,jc,
+
69 & wave,grid,grid(1,jmax,1),idir)
+
+
70 END
+
function ncpus()
Set number of CPUs - the number of processors over which to parallelize.
Definition ncpus.F:22
+
subroutine sptezm(iromb, maxwv, idrt, imax, jmax, kmax, wave, grid, idir)
This subprogram performs spherical transforms between spectral coefficients of scalar quantities and ...
Definition sptezm.f:51
+
subroutine sptranf(iromb, maxwv, idrt, imax, jmax, kmax, ip, is, jn, js, kw, kg, jb, je, jc, wave, gridn, grids, idir)
This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
Definition sptranf.f:77
diff --git a/sptezmd_8f.html b/sptezmd_8f.html index 80753eaf..35b5e7eb 100644 --- a/sptezmd_8f.html +++ b/sptezmd_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptezmd.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@

@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptezmd.f File Reference
+
sptezmd.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptezmd (IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, WAVE, GRIDMN, GRIDX, GRIDY, IDIR)
 This subprogram performs spherical transforms between spectral coefficients of scalar fields and their means and gradients on a global cylindrical grid. More...
 
subroutine sptezmd (iromb, maxwv, idrt, imax, jmax, kmax, wave, gridmn, gridx, gridy, idir)
 This subprogram performs spherical transforms between spectral coefficients of scalar fields and their means and gradients on a global cylindrical grid.
 

Detailed Description

Perform simple gradient spherical transforms.

@@ -107,8 +113,8 @@

Definition in file sptezmd.f.

Function/Subroutine Documentation

- -

◆ sptezmd()

+ +

◆ sptezmd()

@@ -117,67 +123,67 @@

subroutine sptezmd (   - IROMB, + iromb,   - MAXWV, + maxwv,   - IDRT, + idrt,   - IMAX, + imax,   - JMAX, + jmax,   - KMAX, + kmax, real, dimension((maxwv+1)*((iromb+1)*maxwv+2),kmax)  - WAVE, + wave, real, dimension(kmax)  - GRIDMN, + gridmn, real, dimension(imax,jmax,kmax)  - GRIDX, + gridx, real, dimension(imax,jmax,kmax)  - GRIDY, + gridy,   - IDIR  + idir  @@ -192,7 +198,7 @@

sptran().

+

For more flexibility and efficiency, call sptran().

Subprogram can be called from a multiprocessing environment.

Minimum grid dimensions for unaliased transforms to spectral:

@@ -238,7 +244,7 @@

Definition at line 52 of file sptezmd.f.

-

References ncpus(), and sptrand().

+

References ncpus(), and sptrand().

@@ -248,7 +254,7 @@

diff --git a/sptezmd_8f.js b/sptezmd_8f.js index 31e96979..4073b02d 100644 --- a/sptezmd_8f.js +++ b/sptezmd_8f.js @@ -1,4 +1,4 @@ var sptezmd_8f = [ - [ "sptezmd", "sptezmd_8f.html#a2b9ead06893e51604bfb18928ddee996", null ] + [ "sptezmd", "sptezmd_8f.html#aaffab6d5ed04ecab9a52ee8918371278", null ] ]; \ No newline at end of file diff --git a/sptezmd_8f_source.html b/sptezmd_8f_source.html index 2e7916a5..d3553ad5 100644 --- a/sptezmd_8f_source.html +++ b/sptezmd_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptezmd.f Source File @@ -23,10 +23,9 @@

- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0

- + +/* @license-end */ + +
@@ -76,89 +81,97 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptezmd.f
+
sptezmd.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Perform simple gradient spherical transforms.
-
3 C> @author Iredell @date 96-02-29
-
4 
-
5 C> This subprogram performs spherical transforms
-
6 C> between spectral coefficients of scalar fields
-
7 C> and their means and gradients on a global cylindrical grid.
-
8 C>
-
9 C> The wave-space can be either triangular or rhomboidal.
-
10 C>
-
11 C> The grid-space can be either an equally-spaced grid
-
12 C> (with or without pole points) or a gaussian grid.
-
13 C>
-
14 C> The wave fields are in sequential 'IBM ORDER'.
-
15 C>
-
16 C> The grid fields are indexed East to West, then North to South.
-
17 C>
-
18 C> For more flexibility and efficiency, call sptran().
-
19 C>
-
20 C> Subprogram can be called from a multiprocessing environment.
-
21 C>
-
22 C> Minimum grid dimensions for unaliased transforms to spectral:
-
23 C> DIMENSION |LINEAR |QUADRATIC
-
24 C> ----------------------- |--------- |-------------
-
25 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
-
26 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
-
27 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
-
28 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
-
29 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
-
30 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
-
31 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
-
32 C>
-
33 C> @param IROMB spectral domain shape
-
34 C> (0 for triangular, 1 for rhomboidal)
-
35 C> @param MAXWV spectral truncation
-
36 C> @param IDRT grid identifier
-
37 C> - IDRT=4 for Gaussian grid
-
38 C> - IDRT=0 for equally-spaced grid including poles
-
39 C> - IDRT=256 for equally-spaced grid excluding poles
-
40 C> @param IMAX even number of longitudes.
-
41 C> @param JMAX number of latitudes.
-
42 C> @param KMAX number
-
43 C> @param[out] WAVE wave field if IDIR>0
-
44 C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)
-
45 C> @param[out] GRIDMN global mean if IDIR<0
-
46 C> @param[out] GRIDX grid x-gradients (E->W,N->S) if IDIR<0
-
47 C> @param[out] GRIDY grid y-gradients (E->W,N->S) if IDIR<0
-
48 C> @param IDIR transform flag
-
49 C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
-
50 C>
-
51 C> @author Iredell @date 96-02-29
-
52  SUBROUTINE sptezmd(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
-
53  & WAVE,GRIDMN,GRIDX,GRIDY,IDIR)
-
54 
-
55  REAL WAVE((MAXWV+1)*((IROMB+1)*MAXWV+2),KMAX)
-
56  REAL GRIDMN(KMAX),GRIDX(IMAX,JMAX,KMAX),GRIDY(IMAX,JMAX,KMAX)
-
57 
-
58  jc=ncpus()
-
59  CALL sptrand(iromb,maxwv,idrt,imax,jmax,kmax,
-
60  & 0,0,0,0,0,0,0,0,jc,
-
61  & wave,gridmn,
-
62  & gridx,gridx(1,jmax,1),gridy,gridy(1,jmax,1),idir)
-
63  END
-
function ncpus()
Set number of CPUs - the number of processors over which to parallelize.
Definition: ncpus.F:24
-
subroutine sptezmd(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, WAVE, GRIDMN, GRIDX, GRIDY, IDIR)
This subprogram performs spherical transforms between spectral coefficients of scalar fields and thei...
Definition: sptezmd.f:54
-
subroutine sptrand(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDMN, GRIDXN, GRIDXS, GRIDYN, GRIDYS, IDIR)
This subprogram performs a spherical transform between spectral coefficients of scalar fields and the...
Definition: sptrand.f:92
+Go to the documentation of this file.
1C> @file
+
2C> @brief Perform simple gradient spherical transforms.
+
3C> @author Iredell @date 96-02-29
+
4
+
5C> This subprogram performs spherical transforms
+
6C> between spectral coefficients of scalar fields
+
7C> and their means and gradients on a global cylindrical grid.
+
8C>
+
9C> The wave-space can be either triangular or rhomboidal.
+
10C>
+
11C> The grid-space can be either an equally-spaced grid
+
12C> (with or without pole points) or a gaussian grid.
+
13C>
+
14C> The wave fields are in sequential 'IBM ORDER'.
+
15C>
+
16C> The grid fields are indexed East to West, then North to South.
+
17C>
+
18C> For more flexibility and efficiency, call sptran().
+
19C>
+
20C> Subprogram can be called from a multiprocessing environment.
+
21C>
+
22C> Minimum grid dimensions for unaliased transforms to spectral:
+
23C> DIMENSION |LINEAR |QUADRATIC
+
24C> ----------------------- |--------- |-------------
+
25C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
+
26C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
+
27C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
+
28C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
+
29C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
+
30C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
+
31C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
+
32C>
+
33C> @param IROMB spectral domain shape
+
34C> (0 for triangular, 1 for rhomboidal)
+
35C> @param MAXWV spectral truncation
+
36C> @param IDRT grid identifier
+
37C> - IDRT=4 for Gaussian grid
+
38C> - IDRT=0 for equally-spaced grid including poles
+
39C> - IDRT=256 for equally-spaced grid excluding poles
+
40C> @param IMAX even number of longitudes.
+
41C> @param JMAX number of latitudes.
+
42C> @param KMAX number
+
43C> @param[out] WAVE wave field if IDIR>0
+
44C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)
+
45C> @param[out] GRIDMN global mean if IDIR<0
+
46C> @param[out] GRIDX grid x-gradients (E->W,N->S) if IDIR<0
+
47C> @param[out] GRIDY grid y-gradients (E->W,N->S) if IDIR<0
+
48C> @param IDIR transform flag
+
49C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
+
50C>
+
51C> @author Iredell @date 96-02-29
+
+
52 SUBROUTINE sptezmd(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
+
53 & WAVE,GRIDMN,GRIDX,GRIDY,IDIR)
+
54
+
55 REAL WAVE((MAXWV+1)*((IROMB+1)*MAXWV+2),KMAX)
+
56 REAL GRIDMN(KMAX),GRIDX(IMAX,JMAX,KMAX),GRIDY(IMAX,JMAX,KMAX)
+
57
+
58 jc=ncpus()
+
59 CALL sptrand(iromb,maxwv,idrt,imax,jmax,kmax,
+
60 & 0,0,0,0,0,0,0,0,jc,
+
61 & wave,gridmn,
+
62 & gridx,gridx(1,jmax,1),gridy,gridy(1,jmax,1),idir)
+
+
63 END
+
function ncpus()
Set number of CPUs - the number of processors over which to parallelize.
Definition ncpus.F:22
+
subroutine sptezmd(iromb, maxwv, idrt, imax, jmax, kmax, wave, gridmn, gridx, gridy, idir)
This subprogram performs spherical transforms between spectral coefficients of scalar fields and thei...
Definition sptezmd.f:54
+
subroutine sptrand(iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, wave, gridmn, gridxn, gridxs, gridyn, gridys, idir)
This subprogram performs a spherical transform between spectral coefficients of scalar fields and the...
Definition sptrand.f:92
diff --git a/sptezmv_8f.html b/sptezmv_8f.html index 8556ba90..68315e63 100644 --- a/sptezmv_8f.html +++ b/sptezmv_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptezmv.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptezmv.f File Reference
+
sptezmv.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptezmv (IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, WAVED, WAVEZ, GRIDU, GRIDV, IDIR)
 This subprogram performs spherical transforms between spectral coefficients of divergence and curl and vector fields on a global cylindrical grid. More...
 
subroutine sptezmv (iromb, maxwv, idrt, imax, jmax, kmax, waved, wavez, gridu, gridv, idir)
 This subprogram performs spherical transforms between spectral coefficients of divergence and curl and vector fields on a global cylindrical grid.
 

Detailed Description

Perform simple vector spherical transforms.

@@ -107,8 +113,8 @@

Definition in file sptezmv.f.

Function/Subroutine Documentation

- -

◆ sptezmv()

+ +

◆ sptezmv()

@@ -117,67 +123,67 @@

subroutine sptezmv (   - IROMB, + iromb,   - MAXWV, + maxwv,   - IDRT, + idrt,   - IMAX, + imax,   - JMAX, + jmax,   - KMAX, + kmax, real, dimension((maxwv+1)*((iromb+1)*maxwv+2),kmax)  - WAVED, + waved, real, dimension((maxwv+1)*((iromb+1)*maxwv+2),kmax)  - WAVEZ, + wavez, real, dimension(imax,jmax,kmax)  - GRIDU, + gridu, real, dimension(imax,jmax,kmax)  - GRIDV, + gridv,   - IDIR  + idir  @@ -192,7 +198,7 @@

sptran().

+

For more flexibility and efficiency, call sptran().

Subprogram can be called from a multiprocessing environment.

Minimum grid dimensions for unaliased transforms to spectral:

@@ -238,7 +244,7 @@

Definition at line 53 of file sptezmv.f.

-

References ncpus(), and sptranfv().

+

References ncpus(), and sptranfv().

@@ -248,7 +254,7 @@

diff --git a/sptezmv_8f.js b/sptezmv_8f.js index 2b2725eb..e4e56db7 100644 --- a/sptezmv_8f.js +++ b/sptezmv_8f.js @@ -1,4 +1,4 @@ var sptezmv_8f = [ - [ "sptezmv", "sptezmv_8f.html#a22dc4fc10c5225ec8d3c12ed3cb4786e", null ] + [ "sptezmv", "sptezmv_8f.html#a00b86e815f4aad69beb3c2f64c99af67", null ] ]; \ No newline at end of file diff --git a/sptezmv_8f_source.html b/sptezmv_8f_source.html index 20f789af..b9dc0562 100644 --- a/sptezmv_8f_source.html +++ b/sptezmv_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptezmv.f Source File @@ -23,10 +23,9 @@

- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0

- + +/* @license-end */ + +
@@ -76,104 +81,112 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptezmv.f
+
sptezmv.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Perform simple vector spherical transforms.
-
3 C> @author Iredell @date 96-02-29
-
4 
-
5 C> This subprogram performs spherical transforms
-
6 C> between spectral coefficients of divergence and curl
-
7 C> and vector fields on a global cylindrical grid.
-
8 C>
-
9 C> The wave-space can be either triangular or rhomboidal.
-
10 C>
-
11 C> The grid-space can be either an equally-spaced grid
-
12 C> (with or without pole points) or a Gaussian grid.
-
13 C>
-
14 C> Wave fields are in sequential 'IBM ORDER'.
-
15 C>
-
16 C> Grid fields are indexed east to west, then north to south.
-
17 C>
-
18 C> For more flexibility and efficiency, call sptran().
-
19 C>
-
20 C> Subprogram can be called from a multiprocessing environment.
-
21 C>
-
22 C> Minimum grid dimensions for unaliased transforms to spectral:
-
23 C> DIMENSION |LINEAR |QUADRATIC
-
24 C> ----------------------- |--------- |-------------
-
25 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
-
26 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
-
27 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
-
28 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
-
29 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
-
30 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
-
31 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
-
32 C>
-
33 C> @param IROMB spectral domain shape
-
34 C> (0 for triangular, 1 for rhomboidal)
-
35 C> @param MAXWV spectral truncation
-
36 C> @param IDRT grid identifier
-
37 C> - IDRT=4 for Gaussian grid
-
38 C> - IDRT=0 for equally-spaced grid including poles
-
39 C> - IDRT=256 for equally-spaced grid excluding poles
-
40 C> @param IMAX even number of longitudes
-
41 C> @param JMAX number of latitudes
-
42 C> @param KMAX number of fields to transform
-
43 C> @param[out] WAVED wave divergence field if IDIR<0
-
44 C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
-
45 C> @param[out] WAVEZ wave vorticity field if IDIR>0
-
46 C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
-
47 C> @param[out] GRIDU grid u-wind (E->W,N->S) if IDIR>0
-
48 C> @param[out] GRIDV grid v-wind (E->W,N->S) if IDIR>0
-
49 C> @param IDIR transform flag
-
50 C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
-
51 C>
-
52 C> @author Iredell @date 96-02-29
-
53  SUBROUTINE sptezmv(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
-
54  & WAVED,WAVEZ,GRIDU,GRIDV,IDIR)
-
55 
-
56  REAL WAVED((MAXWV+1)*((IROMB+1)*MAXWV+2),KMAX)
-
57  REAL WAVEZ((MAXWV+1)*((IROMB+1)*MAXWV+2),KMAX)
-
58  REAL GRIDU(IMAX,JMAX,KMAX)
-
59  REAL GRIDV(IMAX,JMAX,KMAX)
-
60 
-
61  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
62  ip=1
-
63  is=1
-
64  jn=imax
-
65  js=-jn
-
66  kw=2*mx
-
67  kg=imax*jmax
-
68  jb=1
-
69  je=(jmax+1)/2
-
70  jc=ncpus()
-
71  IF(idir.LT.0) waved=0
-
72  IF(idir.LT.0) wavez=0
-
73 
-
74  CALL sptranfv(iromb,maxwv,idrt,imax,jmax,kmax,
-
75  & ip,is,jn,js,kw,kg,jb,je,jc,
-
76  & waved,wavez,
-
77  & gridu,gridu(1,jmax,1),gridv,gridv(1,jmax,1),idir)
-
78  END
-
function ncpus()
Set number of CPUs - the number of processors over which to parallelize.
Definition: ncpus.F:24
-
subroutine sptezmv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, WAVED, WAVEZ, GRIDU, GRIDV, IDIR)
This subprogram performs spherical transforms between spectral coefficients of divergence and curl an...
Definition: sptezmv.f:55
-
subroutine sptranfv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IP, IS, JN, JS, KW, KG, JB, JE, JC, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
Definition: sptranfv.f:83
+Go to the documentation of this file.
1C> @file
+
2C> @brief Perform simple vector spherical transforms.
+
3C> @author Iredell @date 96-02-29
+
4
+
5C> This subprogram performs spherical transforms
+
6C> between spectral coefficients of divergence and curl
+
7C> and vector fields on a global cylindrical grid.
+
8C>
+
9C> The wave-space can be either triangular or rhomboidal.
+
10C>
+
11C> The grid-space can be either an equally-spaced grid
+
12C> (with or without pole points) or a Gaussian grid.
+
13C>
+
14C> Wave fields are in sequential 'IBM ORDER'.
+
15C>
+
16C> Grid fields are indexed east to west, then north to south.
+
17C>
+
18C> For more flexibility and efficiency, call sptran().
+
19C>
+
20C> Subprogram can be called from a multiprocessing environment.
+
21C>
+
22C> Minimum grid dimensions for unaliased transforms to spectral:
+
23C> DIMENSION |LINEAR |QUADRATIC
+
24C> ----------------------- |--------- |-------------
+
25C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
+
26C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
+
27C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
+
28C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
+
29C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
+
30C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
+
31C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
+
32C>
+
33C> @param IROMB spectral domain shape
+
34C> (0 for triangular, 1 for rhomboidal)
+
35C> @param MAXWV spectral truncation
+
36C> @param IDRT grid identifier
+
37C> - IDRT=4 for Gaussian grid
+
38C> - IDRT=0 for equally-spaced grid including poles
+
39C> - IDRT=256 for equally-spaced grid excluding poles
+
40C> @param IMAX even number of longitudes
+
41C> @param JMAX number of latitudes
+
42C> @param KMAX number of fields to transform
+
43C> @param[out] WAVED wave divergence field if IDIR<0
+
44C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
+
45C> @param[out] WAVEZ wave vorticity field if IDIR>0
+
46C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
+
47C> @param[out] GRIDU grid u-wind (E->W,N->S) if IDIR>0
+
48C> @param[out] GRIDV grid v-wind (E->W,N->S) if IDIR>0
+
49C> @param IDIR transform flag
+
50C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
+
51C>
+
52C> @author Iredell @date 96-02-29
+
+
53 SUBROUTINE sptezmv(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
+
54 & WAVED,WAVEZ,GRIDU,GRIDV,IDIR)
+
55
+
56 REAL WAVED((MAXWV+1)*((IROMB+1)*MAXWV+2),KMAX)
+
57 REAL WAVEZ((MAXWV+1)*((IROMB+1)*MAXWV+2),KMAX)
+
58 REAL GRIDU(IMAX,JMAX,KMAX)
+
59 REAL GRIDV(IMAX,JMAX,KMAX)
+
60
+
61 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
62 ip=1
+
63 is=1
+
64 jn=imax
+
65 js=-jn
+
66 kw=2*mx
+
67 kg=imax*jmax
+
68 jb=1
+
69 je=(jmax+1)/2
+
70 jc=ncpus()
+
71 IF(idir.LT.0) waved=0
+
72 IF(idir.LT.0) wavez=0
+
73
+
74 CALL sptranfv(iromb,maxwv,idrt,imax,jmax,kmax,
+
75 & ip,is,jn,js,kw,kg,jb,je,jc,
+
76 & waved,wavez,
+
77 & gridu,gridu(1,jmax,1),gridv,gridv(1,jmax,1),idir)
+
+
78 END
+
function ncpus()
Set number of CPUs - the number of processors over which to parallelize.
Definition ncpus.F:22
+
subroutine sptezmv(iromb, maxwv, idrt, imax, jmax, kmax, waved, wavez, gridu, gridv, idir)
This subprogram performs spherical transforms between spectral coefficients of divergence and curl an...
Definition sptezmv.f:55
+
subroutine sptranfv(iromb, maxwv, idrt, imax, jmax, kmax, ip, is, jn, js, kw, kg, jb, je, jc, waved, wavez, gridun, gridus, gridvn, gridvs, idir)
This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
Definition sptranfv.f:83
diff --git a/sptezv_8f.html b/sptezv_8f.html index be8521ff..ba3ebb0b 100644 --- a/sptezv_8f.html +++ b/sptezv_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptezv.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptezv.f File Reference
+
sptezv.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptezv (IROMB, MAXWV, IDRT, IMAX, JMAX, WAVED, WAVEZ, GRIDU, GRIDV, IDIR)
 This subprogram performs a spherical transform between spectral coefficients of divergence and curl and a vector field on a global cylindrical grid. More...
 
subroutine sptezv (iromb, maxwv, idrt, imax, jmax, waved, wavez, gridu, gridv, idir)
 This subprogram performs a spherical transform between spectral coefficients of divergence and curl and a vector field on a global cylindrical grid.
 

Detailed Description

Perform a simple vector spherical transform.

@@ -107,8 +113,8 @@

Definition in file sptezv.f.

Function/Subroutine Documentation

- -

◆ sptezv()

+ +

◆ sptezv()

@@ -241,7 +247,7 @@

diff --git a/sptezv_8f.js b/sptezv_8f.js index d9e51fb2..310a362c 100644 --- a/sptezv_8f.js +++ b/sptezv_8f.js @@ -1,4 +1,4 @@ var sptezv_8f = [ - [ "sptezv", "sptezv_8f.html#a83e49d961c40a2621c3f2afe70846226", null ] + [ "sptezv", "sptezv_8f.html#a5af4a3c7156baccafc3c670e127eab91", null ] ]; \ No newline at end of file diff --git a/sptezv_8f_source.html b/sptezv_8f_source.html index d467cea5..a864d933 100644 --- a/sptezv_8f_source.html +++ b/sptezv_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptezv.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,102 +81,110 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptezv.f
+
sptezv.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Perform a simple vector spherical transform
-
3 C> @author Iredell @date 96-02-29
-
4 
-
5 C> This subprogram performs a spherical transform
-
6 C> between spectral coefficients of divergence and curl
-
7 C> and a vector field on a global cylindrical grid.
-
8 C> The wave-space can be either triangular or rhomboidal.
-
9 C>
-
10 C> The grid-space can be either an equally-spaced grid
-
11 C> (with or without pole points) or a Gaussian grid.
-
12 C>
-
13 C> The wave field is in sequential 'IBM order'.
-
14 C>
-
15 C> The grid field is indexed east to west, then north to south.
-
16 C>
-
17 C> For more flexibility and efficiency, call SPTRAN().
-
18 C>
-
19 C> Subprogram can be called from a multiprocessing environment.
-
20 C>
-
21 C> Minimum grid dimensions for unaliased transforms to spectral:
-
22 C> Dimension |Linear |Quadratic
-
23 C> ----------------------- |--------- |-------------
-
24 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
-
25 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
-
26 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
-
27 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
-
28 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
-
29 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
-
30 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
-
31 C>
-
32 C> @param IROMB Spectral domain shape
-
33 C> (0 for triangular, 1 for rhomboidal)
-
34 C> @param MAXWV Spectral truncation
-
35 C> @param IDRT Grid identifier
-
36 C> - IDRT=4 for Gaussian grid
-
37 C> - IDRT=0 for equally-spaced grid including poles
-
38 C> - IDRT=256 for equally-spaced grid excluding poles
-
39 C> @param IMAX Even number of longitudes
-
40 C> @param JMAX Number of latitudes
-
41 C> @param[out] WAVED Wave divergence field if IDIR>0
-
42 C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
-
43 C> @param[out] WAVEZ Wave vorticity field if IDIR>0
-
44 C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
-
45 C> @param[out] GRIDU Grid u-wind (E->W,N->S) if IDIR<0
-
46 C> @param[out] GRIDV Grid v-wind (E->W,N->S) if IDIR<0
-
47 C> @param IDIR Transform flag
-
48 C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave)
-
49 C>
-
50 C> @author Iredell @date 96-02-29
-
51  SUBROUTINE sptezv(IROMB,MAXWV,IDRT,IMAX,JMAX,
-
52  & WAVED,WAVEZ,GRIDU,GRIDV,IDIR)
-
53 
-
54  REAL WAVED((MAXWV+1)*((IROMB+1)*MAXWV+2))
-
55  REAL WAVEZ((MAXWV+1)*((IROMB+1)*MAXWV+2))
-
56  REAL GRIDU(IMAX,JMAX)
-
57  REAL GRIDV(IMAX,JMAX)
-
58 
-
59  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
60  ip=1
-
61  is=1
-
62  jn=imax
-
63  js=-jn
-
64  kw=2*mx
-
65  kg=imax*jmax
-
66  jb=1
-
67  je=(jmax+1)/2
-
68  jc=ncpus()
-
69  IF(idir.LT.0) waved=0
-
70  IF(idir.LT.0) wavez=0
-
71 
-
72  CALL sptranfv(iromb,maxwv,idrt,imax,jmax,1,
-
73  & ip,is,jn,js,kw,kg,jb,je,jc,
-
74  & waved,wavez,
-
75  & gridu,gridu(1,jmax),gridv,gridv(1,jmax),idir)
-
76  END
-
function ncpus()
Set number of CPUs - the number of processors over which to parallelize.
Definition: ncpus.F:24
-
subroutine sptezv(IROMB, MAXWV, IDRT, IMAX, JMAX, WAVED, WAVEZ, GRIDU, GRIDV, IDIR)
This subprogram performs a spherical transform between spectral coefficients of divergence and curl a...
Definition: sptezv.f:53
-
subroutine sptranfv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IP, IS, JN, JS, KW, KG, JB, JE, JC, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
Definition: sptranfv.f:83
+Go to the documentation of this file.
1C> @file
+
2C> @brief Perform a simple vector spherical transform
+
3C> @author Iredell @date 96-02-29
+
4
+
5C> This subprogram performs a spherical transform
+
6C> between spectral coefficients of divergence and curl
+
7C> and a vector field on a global cylindrical grid.
+
8C> The wave-space can be either triangular or rhomboidal.
+
9C>
+
10C> The grid-space can be either an equally-spaced grid
+
11C> (with or without pole points) or a Gaussian grid.
+
12C>
+
13C> The wave field is in sequential 'IBM order'.
+
14C>
+
15C> The grid field is indexed east to west, then north to south.
+
16C>
+
17C> For more flexibility and efficiency, call SPTRAN().
+
18C>
+
19C> Subprogram can be called from a multiprocessing environment.
+
20C>
+
21C> Minimum grid dimensions for unaliased transforms to spectral:
+
22C> Dimension |Linear |Quadratic
+
23C> ----------------------- |--------- |-------------
+
24C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
+
25C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
+
26C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
+
27C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
+
28C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
+
29C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
+
30C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
+
31C>
+
32C> @param IROMB Spectral domain shape
+
33C> (0 for triangular, 1 for rhomboidal)
+
34C> @param MAXWV Spectral truncation
+
35C> @param IDRT Grid identifier
+
36C> - IDRT=4 for Gaussian grid
+
37C> - IDRT=0 for equally-spaced grid including poles
+
38C> - IDRT=256 for equally-spaced grid excluding poles
+
39C> @param IMAX Even number of longitudes
+
40C> @param JMAX Number of latitudes
+
41C> @param[out] WAVED Wave divergence field if IDIR>0
+
42C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
+
43C> @param[out] WAVEZ Wave vorticity field if IDIR>0
+
44C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
+
45C> @param[out] GRIDU Grid u-wind (E->W,N->S) if IDIR<0
+
46C> @param[out] GRIDV Grid v-wind (E->W,N->S) if IDIR<0
+
47C> @param IDIR Transform flag
+
48C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave)
+
49C>
+
50C> @author Iredell @date 96-02-29
+
+
51 SUBROUTINE sptezv(IROMB,MAXWV,IDRT,IMAX,JMAX,
+
52 & WAVED,WAVEZ,GRIDU,GRIDV,IDIR)
+
53
+
54 REAL WAVED((MAXWV+1)*((IROMB+1)*MAXWV+2))
+
55 REAL WAVEZ((MAXWV+1)*((IROMB+1)*MAXWV+2))
+
56 REAL GRIDU(IMAX,JMAX)
+
57 REAL GRIDV(IMAX,JMAX)
+
58
+
59 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
60 ip=1
+
61 is=1
+
62 jn=imax
+
63 js=-jn
+
64 kw=2*mx
+
65 kg=imax*jmax
+
66 jb=1
+
67 je=(jmax+1)/2
+
68 jc=ncpus()
+
69 IF(idir.LT.0) waved=0
+
70 IF(idir.LT.0) wavez=0
+
71
+
72 CALL sptranfv(iromb,maxwv,idrt,imax,jmax,1,
+
73 & ip,is,jn,js,kw,kg,jb,je,jc,
+
74 & waved,wavez,
+
75 & gridu,gridu(1,jmax),gridv,gridv(1,jmax),idir)
+
+
76 END
+
function ncpus()
Set number of CPUs - the number of processors over which to parallelize.
Definition ncpus.F:22
+
subroutine sptezv(iromb, maxwv, idrt, imax, jmax, waved, wavez, gridu, gridv, idir)
This subprogram performs a spherical transform between spectral coefficients of divergence and curl a...
Definition sptezv.f:53
+
subroutine sptranfv(iromb, maxwv, idrt, imax, jmax, kmax, ip, is, jn, js, kw, kg, jb, je, jc, waved, wavez, gridun, gridus, gridvn, gridvs, idir)
This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
Definition sptranfv.f:83
diff --git a/sptgpm_8f.html b/sptgpm_8f.html index aa4450a7..a5b84060 100644 --- a/sptgpm_8f.html +++ b/sptgpm_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgpm.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgpm.f File Reference
+
sptgpm.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptgpm (IROMB, MAXWV, KMAX, MI, MJ, KWSKIP, KGSKIP, NISKIP, NJSKIP, RLAT1, RLON1, DLAT, DLON, WAVE, GM)
 This subprogram performs a spherical transform from spectral coefficients of scalar quantities to scalar fields on a Mercator grid. More...
 
subroutine sptgpm (iromb, maxwv, kmax, mi, mj, kwskip, kgskip, niskip, njskip, rlat1, rlon1, dlat, dlon, wave, gm)
 This subprogram performs a spherical transform from spectral coefficients of scalar quantities to scalar fields on a Mercator grid.
 

Detailed Description

Transform spectral scalar to Mercator.

@@ -117,8 +123,8 @@

Definition in file sptgpm.f.

Function/Subroutine Documentation

- -

◆ sptgpm()

+ +

◆ sptgpm()

diff --git a/sptgpm_8f.js b/sptgpm_8f.js index d1806195..60e05241 100644 --- a/sptgpm_8f.js +++ b/sptgpm_8f.js @@ -1,4 +1,4 @@ var sptgpm_8f = [ - [ "sptgpm", "sptgpm_8f.html#a6cffaeaa602eaae5c03166f48065158d", null ] + [ "sptgpm", "sptgpm_8f.html#af394820048449f0f00fa3bad063da328", null ] ]; \ No newline at end of file diff --git a/sptgpm_8f_source.html b/sptgpm_8f_source.html index 65c529ce..c8651788 100644 --- a/sptgpm_8f_source.html +++ b/sptgpm_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgpm.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,150 +81,158 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgpm.f
+
sptgpm.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Transform spectral scalar to Mercator
-
3 C> ### Program history log:
-
4 C> Date | Programmer | Comments
-
5 C> -----------|------------|---------
-
6 C> 96-02-29 | IREDELL | Initial.
-
7 C> 1998-12-15 | IREDELL | OpenMP directives inserted.
-
8 C> @author IREDELL @date 96-02-29
-
9 
-
10 C> This subprogram performs a spherical transform
-
11 C> from spectral coefficients of scalar quantities
-
12 C> to scalar fields on a Mercator grid.
-
13 C> The wave-space can be either triangular or rhomboidal.
-
14 C> The wave and grid fields may have general indexing,
-
15 C> but each wave field is in sequential 'ibm order',
-
16 C> i.e. with zonal wavenumber as the slower index.
-
17 C> The Mercator grid is identified by the location
-
18 C> of its first point and by its respective increments.
-
19 C> The transforms are all multiprocessed over sector points.
-
20 C> Transform several fields at a time to improve vectorization.
-
21 C> Subprogram can be called from a multiprocessing environment.
-
22 C>
-
23 C> @param IROMB Spectral domain shape
-
24 C> (0 for triangular, 1 for rhomboidal)
-
25 C> @param MAXWV Spectral truncation
-
26 C> @param KMAX Number of fields to transform
-
27 C> @param MI Number of points in the faster zonal direction
-
28 C> @param MJ Number of points in the slower merid direction
-
29 C> @param KWSKIP Skip number between wave fields
-
30 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
-
31 C> @param KGSKIP Skip number between grid fields
-
32 C> (defaults to MI*MJ if KGSKIP=0)
-
33 C> @param NISKIP Skip number between grid i-points
-
34 C> (defaults to 1 if NISKIP=0)
-
35 C> @param NJSKIP Skip number between grid j-points
-
36 C> (defaults to MI if NJSKIP=0)
-
37 C> @param RLAT1 Latitude of the first grid point in degrees
-
38 C> @param RLON1 Longitude of the first grid point in degrees
-
39 C> @param DLAT Latitude increment in degrees such that
-
40 C> D(PHI)/D(J)=DLAT*COS(PHI) where J is meridional index.
-
41 C> DLAT is negative for grids indexed southward.
-
42 C> (in terms of grid increment DY valid at latitude RLATI,
-
43 C> the latitude increment DLAT is determined as
-
44 C> DLAT=DPR*DY/(RERTH*COS(RLATI/DPR))
-
45 C> where DPR=180/PI and RERTH is earth's radius)
-
46 C> @param DLON Longitude increment in degrees such that
-
47 C> D(LAMBDA)/D(I)=DLON where I is zonal index.
-
48 C> DLON is negative for grids indexed westward.
-
49 C> @param WAVE Wave fields
-
50 C> @param GM Mercator fields
-
51 C>
-
52 C> @author IREDELL @date 96-02-29
-
53  SUBROUTINE sptgpm(IROMB,MAXWV,KMAX,MI,MJ,
-
54  & KWSKIP,KGSKIP,NISKIP,NJSKIP,
-
55  & RLAT1,RLON1,DLAT,DLON,WAVE,GM)
-
56 
-
57  REAL WAVE(*),GM(*)
-
58  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
-
59  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
60  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
61  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
-
62  INTEGER MP(KMAX)
-
63  REAL WTOP(2*(MAXWV+1),KMAX)
-
64  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
-
65  REAL F(2*MAXWV+3,2,KMAX)
-
66  REAL CLAT(MJ),SLAT(MJ),CLON(MAXWV,MI),SLON(MAXWV,MI)
-
67  parameter(pi=3.14159265358979,dpr=180./pi)
-
68 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
69 C CALCULATE PRELIMINARY CONSTANTS
-
70  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
-
71  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
72  mxtop=maxwv+1
-
73  idim=2*maxwv+3
-
74  kw=kwskip
-
75  kg=kgskip
-
76  ni=niskip
-
77  nj=njskip
-
78  IF(kw.EQ.0) kw=2*mx
-
79  IF(kg.EQ.0) kg=mi*mj
-
80  IF(ni.EQ.0) ni=1
-
81  IF(nj.EQ.0) nj=mi
-
82  DO i=1,mi
-
83  rlon=mod(rlon1+dlon*(i-1)+3600,360.)
-
84  DO l=1,maxwv
-
85  clon(l,i)=cos(l*rlon/dpr)
-
86  slon(l,i)=sin(l*rlon/dpr)
-
87  ENDDO
-
88  ENDDO
-
89  ye=1-log(tan((rlat1+90)/2/dpr))*dpr/dlat
-
90  DO j=1,mj
-
91  rlat=atan(exp(dlat/dpr*(j-ye)))*2*dpr-90
-
92  clat(j)=cos(rlat/dpr)
-
93  slat(j)=sin(rlat/dpr)
-
94  ENDDO
-
95  mp=0
-
96 C$OMP PARALLEL DO
-
97  DO k=1,kmax
-
98  wtop(1:2*mxtop,k)=0
-
99  ENDDO
-
100 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
101 C TRANSFORM TO GRID
-
102 C$OMP PARALLEL DO PRIVATE(PLN,PLNTOP,F,IJK)
-
103  DO j=1,mj
-
104  CALL splegend(iromb,maxwv,slat(j),clat(j),eps,epstop,
-
105  & pln,plntop)
-
106  CALL spsynth(iromb,maxwv,2*maxwv,idim,kw,2*mxtop,kmax,
-
107  & clat(j),pln,plntop,mp,wave,wtop,f)
-
108  DO k=1,kmax
-
109  DO i=1,mi
-
110  ijk=(i-1)*ni+(j-1)*nj+(k-1)*kg+1
-
111  gm(ijk)=f(1,1,k)
-
112  ENDDO
-
113  DO l=1,maxwv
-
114  DO i=1,mi
-
115  ijk=(i-1)*ni+(j-1)*nj+(k-1)*kg+1
-
116  gm(ijk)=gm(ijk)+2.*(f(2*l+1,1,k)*clon(l,i)
-
117  & -f(2*l+2,1,k)*slon(l,i))
-
118  ENDDO
-
119  ENDDO
-
120  ENDDO
-
121  ENDDO
-
122 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
123  END
-
subroutine splegend(I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
Definition: splegend.f:45
-
subroutine spsynth(I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
Definition: spsynth.f:39
-
subroutine sptgpm(IROMB, MAXWV, KMAX, MI, MJ, KWSKIP, KGSKIP, NISKIP, NJSKIP, RLAT1, RLON1, DLAT, DLON, WAVE, GM)
This subprogram performs a spherical transform from spectral coefficients of scalar quantities to sca...
Definition: sptgpm.f:56
-
subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
This subprogram gets wave-space constants.
Definition: spwget.f:18
+Go to the documentation of this file.
1C> @file
+
2C> @brief Transform spectral scalar to Mercator
+
3C> ### Program history log:
+
4C> Date | Programmer | Comments
+
5C> -----------|------------|---------
+
6C> 96-02-29 | IREDELL | Initial.
+
7C> 1998-12-15 | IREDELL | OpenMP directives inserted.
+
8C> @author IREDELL @date 96-02-29
+
9
+
10C> This subprogram performs a spherical transform
+
11C> from spectral coefficients of scalar quantities
+
12C> to scalar fields on a Mercator grid.
+
13C> The wave-space can be either triangular or rhomboidal.
+
14C> The wave and grid fields may have general indexing,
+
15C> but each wave field is in sequential 'ibm order',
+
16C> i.e. with zonal wavenumber as the slower index.
+
17C> The Mercator grid is identified by the location
+
18C> of its first point and by its respective increments.
+
19C> The transforms are all multiprocessed over sector points.
+
20C> Transform several fields at a time to improve vectorization.
+
21C> Subprogram can be called from a multiprocessing environment.
+
22C>
+
23C> @param IROMB Spectral domain shape
+
24C> (0 for triangular, 1 for rhomboidal)
+
25C> @param MAXWV Spectral truncation
+
26C> @param KMAX Number of fields to transform
+
27C> @param MI Number of points in the faster zonal direction
+
28C> @param MJ Number of points in the slower merid direction
+
29C> @param KWSKIP Skip number between wave fields
+
30C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
+
31C> @param KGSKIP Skip number between grid fields
+
32C> (defaults to MI*MJ if KGSKIP=0)
+
33C> @param NISKIP Skip number between grid i-points
+
34C> (defaults to 1 if NISKIP=0)
+
35C> @param NJSKIP Skip number between grid j-points
+
36C> (defaults to MI if NJSKIP=0)
+
37C> @param RLAT1 Latitude of the first grid point in degrees
+
38C> @param RLON1 Longitude of the first grid point in degrees
+
39C> @param DLAT Latitude increment in degrees such that
+
40C> D(PHI)/D(J)=DLAT*COS(PHI) where J is meridional index.
+
41C> DLAT is negative for grids indexed southward.
+
42C> (in terms of grid increment DY valid at latitude RLATI,
+
43C> the latitude increment DLAT is determined as
+
44C> DLAT=DPR*DY/(RERTH*COS(RLATI/DPR))
+
45C> where DPR=180/PI and RERTH is earth's radius)
+
46C> @param DLON Longitude increment in degrees such that
+
47C> D(LAMBDA)/D(I)=DLON where I is zonal index.
+
48C> DLON is negative for grids indexed westward.
+
49C> @param WAVE Wave fields
+
50C> @param GM Mercator fields
+
51C>
+
52C> @author IREDELL @date 96-02-29
+
+
53 SUBROUTINE sptgpm(IROMB,MAXWV,KMAX,MI,MJ,
+
54 & KWSKIP,KGSKIP,NISKIP,NJSKIP,
+
55 & RLAT1,RLON1,DLAT,DLON,WAVE,GM)
+
56
+
57 REAL WAVE(*),GM(*)
+
58 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
+
59 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
60 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
61 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
+
62 INTEGER MP(KMAX)
+
63 REAL WTOP(2*(MAXWV+1),KMAX)
+
64 REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
+
65 REAL F(2*MAXWV+3,2,KMAX)
+
66 REAL CLAT(MJ),SLAT(MJ),CLON(MAXWV,MI),SLON(MAXWV,MI)
+
67 parameter(pi=3.14159265358979,dpr=180./pi)
+
68C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
69C CALCULATE PRELIMINARY CONSTANTS
+
70 CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
+
71 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
72 mxtop=maxwv+1
+
73 idim=2*maxwv+3
+
74 kw=kwskip
+
75 kg=kgskip
+
76 ni=niskip
+
77 nj=njskip
+
78 IF(kw.EQ.0) kw=2*mx
+
79 IF(kg.EQ.0) kg=mi*mj
+
80 IF(ni.EQ.0) ni=1
+
81 IF(nj.EQ.0) nj=mi
+
82 DO i=1,mi
+
83 rlon=mod(rlon1+dlon*(i-1)+3600,360.)
+
84 DO l=1,maxwv
+
85 clon(l,i)=cos(l*rlon/dpr)
+
86 slon(l,i)=sin(l*rlon/dpr)
+
87 ENDDO
+
88 ENDDO
+
89 ye=1-log(tan((rlat1+90)/2/dpr))*dpr/dlat
+
90 DO j=1,mj
+
91 rlat=atan(exp(dlat/dpr*(j-ye)))*2*dpr-90
+
92 clat(j)=cos(rlat/dpr)
+
93 slat(j)=sin(rlat/dpr)
+
94 ENDDO
+
95 mp=0
+
96C$OMP PARALLEL DO
+
97 DO k=1,kmax
+
98 wtop(1:2*mxtop,k)=0
+
99 ENDDO
+
100C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
101C TRANSFORM TO GRID
+
102C$OMP PARALLEL DO PRIVATE(PLN,PLNTOP,F,IJK)
+
103 DO j=1,mj
+
104 CALL splegend(iromb,maxwv,slat(j),clat(j),eps,epstop,
+
105 & pln,plntop)
+
106 CALL spsynth(iromb,maxwv,2*maxwv,idim,kw,2*mxtop,kmax,
+
107 & clat(j),pln,plntop,mp,wave,wtop,f)
+
108 DO k=1,kmax
+
109 DO i=1,mi
+
110 ijk=(i-1)*ni+(j-1)*nj+(k-1)*kg+1
+
111 gm(ijk)=f(1,1,k)
+
112 ENDDO
+
113 DO l=1,maxwv
+
114 DO i=1,mi
+
115 ijk=(i-1)*ni+(j-1)*nj+(k-1)*kg+1
+
116 gm(ijk)=gm(ijk)+2.*(f(2*l+1,1,k)*clon(l,i)
+
117 & -f(2*l+2,1,k)*slon(l,i))
+
118 ENDDO
+
119 ENDDO
+
120 ENDDO
+
121 ENDDO
+
122C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+
123 END
+
subroutine splegend(i, m, slat, clat, eps, epstop, pln, plntop)
Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
Definition splegend.f:45
+
subroutine spsynth(i, m, im, ix, nc, nctop, km, clat, pln, plntop, mp, spc, spctop, f)
Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
Definition spsynth.f:39
+
subroutine sptgpm(iromb, maxwv, kmax, mi, mj, kwskip, kgskip, niskip, njskip, rlat1, rlon1, dlat, dlon, wave, gm)
This subprogram performs a spherical transform from spectral coefficients of scalar quantities to sca...
Definition sptgpm.f:56
+
subroutine spwget(iromb, maxwv, eps, epstop, enn1, elonn1, eon, eontop)
This subprogram gets wave-space constants.
Definition spwget.f:18
diff --git a/sptgpmd_8f.html b/sptgpmd_8f.html index b5ce380c..85449acc 100644 --- a/sptgpmd_8f.html +++ b/sptgpmd_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgpmd.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgpmd.f File Reference
+
sptgpmd.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptgpmd (IROMB, MAXWV, KMAX, MI, MJ, KWSKIP, KGSKIP, NISKIP, NJSKIP, RLAT1, RLON1, DLAT, DLON, WAVE, XM, YM)
 This subprogram performs a spherical transform from spectral coefficients of scalar fields to gradient fields on a Mercator grid. More...
 
subroutine sptgpmd (iromb, maxwv, kmax, mi, mj, kwskip, kgskip, niskip, njskip, rlat1, rlon1, dlat, dlon, wave, xm, ym)
 This subprogram performs a spherical transform from spectral coefficients of scalar fields to gradient fields on a Mercator grid.
 

Detailed Description

Transform spectral to Mercator gradients.

@@ -107,8 +113,8 @@

Definition in file sptgpmd.f.

Function/Subroutine Documentation

- -

◆ sptgpmd()

+ +

◆ sptgpmd()

diff --git a/sptgpmd_8f.js b/sptgpmd_8f.js index 37a6a937..fe7f38e7 100644 --- a/sptgpmd_8f.js +++ b/sptgpmd_8f.js @@ -1,4 +1,4 @@ var sptgpmd_8f = [ - [ "sptgpmd", "sptgpmd_8f.html#af71718c75a2b24b74fa7e1e4318d0539", null ] + [ "sptgpmd", "sptgpmd_8f.html#acdf282fa111309371a14dc75896abc27", null ] ]; \ No newline at end of file diff --git a/sptgpmd_8f_source.html b/sptgpmd_8f_source.html index 2f78312e..46317864 100644 --- a/sptgpmd_8f_source.html +++ b/sptgpmd_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgpmd.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,108 +81,116 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgpmd.f
+
sptgpmd.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Transform spectral to Mercator gradients.
-
3 C> @author Iredell @date 96-02-29
-
4 
-
5 C> This subprogram performs a spherical transform
-
6 C> from spectral coefficients of scalar fields
-
7 C> to gradient fields on a Mercator grid.
-
8 C>
-
9 C> The wave-space can be either triangular or rhomboidal.
-
10 C> The wave and grid fields may have general indexing,
-
11 C> but each wave field is in sequential 'IBM order',
-
12 C> i.e. with zonal wavenumber as the slower index.
-
13 C>
-
14 C> The Mercator grid is identified by the location
-
15 C> of its first point and by its respective increments.
-
16 C>
-
17 C> The transforms are all multiprocessed over sector points.
-
18 C>
-
19 C> Transform several fields at a time to improve vectorization.
-
20 C> Subprogram can be called from a multiprocessing environment.
-
21 C>
-
22 C> @param IROMB Spectral domain shape
-
23 C> (0 for triangular, 1 for rhomboidal)
-
24 C> @param MAXWV Spectral truncation
-
25 C> @param KMAX Number of fields to transform
-
26 C> @param MI Number of points in the faster zonal direction
-
27 C> @param MJ Number of points in the slower merid direction
-
28 C> @param KWSKIP Skip number between wave fields
-
29 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
-
30 C> @param KGSKIP Skip number between grid fields
-
31 C> (defaults to MI*MJ if KGSKIP=0)
-
32 C> @param NISKIP Skip number between grid i-points
-
33 C> (defaults to 1 if NISKIP=0)
-
34 C> @param NJSKIP Skip number between grid j-points
-
35 C> (defaults to MI if NJSKIP=0)
-
36 C> @param RLAT1 Latitude of the first grid point in degrees
-
37 C> @param RLON1 Longitude of the first grid point in degrees
-
38 C> @param DLAT Latitude increment in degrees such that
-
39 C> D(PHI)/D(J)=DLAT*COS(PHI) where J is meridional index.
-
40 C> DLAT is negative for grids indexed southward.
-
41 C> (in terms of grid increment dy valid at latitude RLATI,
-
42 C> the latitude increment DLAT is determined as
-
43 C> DLAT=DPR*DY/(RERTH*COS(RLATI/DPR))
-
44 C> where DPR=180/PI and RERTH is Earth's radius)
-
45 C> @param DLON Longitude increment in degrees such that
-
46 C> D(LAMBDA)/D(I)=DLON where I is zonal index.
-
47 C> DLON is negative for grids indexed westward.
-
48 C> @param WAVE Wave fields
-
49 C> @param XM Mercator x-gradients
-
50 C> @param YM Mercator y-gradients
-
51 C>
-
52 C> @author Iredell @date 96-02-29
-
53  SUBROUTINE sptgpmd(IROMB,MAXWV,KMAX,MI,MJ,
-
54  & KWSKIP,KGSKIP,NISKIP,NJSKIP,
-
55  & RLAT1,RLON1,DLAT,DLON,WAVE,XM,YM)
-
56 
-
57  REAL WAVE(*),XM(*),YM(*)
-
58  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
-
59  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
60  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
61  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
-
62  REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
-
63  REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
-
64 
-
65 C CALCULATE PRELIMINARY CONSTANTS
-
66  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
-
67  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
68  mdim=2*mx+1
-
69  kw=kwskip
-
70  IF(kw.EQ.0) kw=2*mx
-
71 
-
72 C CALCULATE GRADIENTS
-
73 C$OMP PARALLEL DO PRIVATE(KWS)
-
74  DO k=1,kmax
-
75  kws=(k-1)*kw
-
76  CALL splaplac(iromb,maxwv,enn1,wave(kws+1),wd(1,k),1)
-
77  wz(1:2*mx,k)=0.
-
78  ENDDO
-
79  CALL sptgpmv(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
-
80  & rlat1,rlon1,dlat,dlon,wd,wz,xm,ym)
-
81  END
-
subroutine splaplac(I, M, ENN1, Q, QD2, IDIR)
Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
Definition: splaplac.f:25
-
subroutine sptgpmd(IROMB, MAXWV, KMAX, MI, MJ, KWSKIP, KGSKIP, NISKIP, NJSKIP, RLAT1, RLON1, DLAT, DLON, WAVE, XM, YM)
This subprogram performs a spherical transform from spectral coefficients of scalar fields to gradien...
Definition: sptgpmd.f:56
-
subroutine sptgpmv(IROMB, MAXWV, KMAX, MI, MJ, KWSKIP, KGSKIP, NISKIP, NJSKIP, RLAT1, RLON1, DLAT, DLON, WAVED, WAVEZ, UM, VM)
This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
Definition: sptgpmv.f:63
-
subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
This subprogram gets wave-space constants.
Definition: spwget.f:18
+Go to the documentation of this file.
1C> @file
+
2C> @brief Transform spectral to Mercator gradients.
+
3C> @author Iredell @date 96-02-29
+
4
+
5C> This subprogram performs a spherical transform
+
6C> from spectral coefficients of scalar fields
+
7C> to gradient fields on a Mercator grid.
+
8C>
+
9C> The wave-space can be either triangular or rhomboidal.
+
10C> The wave and grid fields may have general indexing,
+
11C> but each wave field is in sequential 'IBM order',
+
12C> i.e. with zonal wavenumber as the slower index.
+
13C>
+
14C> The Mercator grid is identified by the location
+
15C> of its first point and by its respective increments.
+
16C>
+
17C> The transforms are all multiprocessed over sector points.
+
18C>
+
19C> Transform several fields at a time to improve vectorization.
+
20C> Subprogram can be called from a multiprocessing environment.
+
21C>
+
22C> @param IROMB Spectral domain shape
+
23C> (0 for triangular, 1 for rhomboidal)
+
24C> @param MAXWV Spectral truncation
+
25C> @param KMAX Number of fields to transform
+
26C> @param MI Number of points in the faster zonal direction
+
27C> @param MJ Number of points in the slower merid direction
+
28C> @param KWSKIP Skip number between wave fields
+
29C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
+
30C> @param KGSKIP Skip number between grid fields
+
31C> (defaults to MI*MJ if KGSKIP=0)
+
32C> @param NISKIP Skip number between grid i-points
+
33C> (defaults to 1 if NISKIP=0)
+
34C> @param NJSKIP Skip number between grid j-points
+
35C> (defaults to MI if NJSKIP=0)
+
36C> @param RLAT1 Latitude of the first grid point in degrees
+
37C> @param RLON1 Longitude of the first grid point in degrees
+
38C> @param DLAT Latitude increment in degrees such that
+
39C> D(PHI)/D(J)=DLAT*COS(PHI) where J is meridional index.
+
40C> DLAT is negative for grids indexed southward.
+
41C> (in terms of grid increment dy valid at latitude RLATI,
+
42C> the latitude increment DLAT is determined as
+
43C> DLAT=DPR*DY/(RERTH*COS(RLATI/DPR))
+
44C> where DPR=180/PI and RERTH is Earth's radius)
+
45C> @param DLON Longitude increment in degrees such that
+
46C> D(LAMBDA)/D(I)=DLON where I is zonal index.
+
47C> DLON is negative for grids indexed westward.
+
48C> @param WAVE Wave fields
+
49C> @param XM Mercator x-gradients
+
50C> @param YM Mercator y-gradients
+
51C>
+
52C> @author Iredell @date 96-02-29
+
+
53 SUBROUTINE sptgpmd(IROMB,MAXWV,KMAX,MI,MJ,
+
54 & KWSKIP,KGSKIP,NISKIP,NJSKIP,
+
55 & RLAT1,RLON1,DLAT,DLON,WAVE,XM,YM)
+
56
+
57 REAL WAVE(*),XM(*),YM(*)
+
58 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
+
59 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
60 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
61 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
+
62 REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
+
63 REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
+
64
+
65C CALCULATE PRELIMINARY CONSTANTS
+
66 CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
+
67 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
68 mdim=2*mx+1
+
69 kw=kwskip
+
70 IF(kw.EQ.0) kw=2*mx
+
71
+
72C CALCULATE GRADIENTS
+
73C$OMP PARALLEL DO PRIVATE(KWS)
+
74 DO k=1,kmax
+
75 kws=(k-1)*kw
+
76 CALL splaplac(iromb,maxwv,enn1,wave(kws+1),wd(1,k),1)
+
77 wz(1:2*mx,k)=0.
+
78 ENDDO
+
79 CALL sptgpmv(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
+
80 & rlat1,rlon1,dlat,dlon,wd,wz,xm,ym)
+
+
81 END
+
subroutine splaplac(i, m, enn1, q, qd2, idir)
Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
Definition splaplac.f:25
+
subroutine sptgpmd(iromb, maxwv, kmax, mi, mj, kwskip, kgskip, niskip, njskip, rlat1, rlon1, dlat, dlon, wave, xm, ym)
This subprogram performs a spherical transform from spectral coefficients of scalar fields to gradien...
Definition sptgpmd.f:56
+
subroutine sptgpmv(iromb, maxwv, kmax, mi, mj, kwskip, kgskip, niskip, njskip, rlat1, rlon1, dlat, dlon, waved, wavez, um, vm)
This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
Definition sptgpmv.f:63
+
subroutine spwget(iromb, maxwv, eps, epstop, enn1, elonn1, eon, eontop)
This subprogram gets wave-space constants.
Definition spwget.f:18
diff --git a/sptgpmv_8f.html b/sptgpmv_8f.html index fdaeed43..b1297421 100644 --- a/sptgpmv_8f.html +++ b/sptgpmv_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgpmv.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgpmv.f File Reference
+
sptgpmv.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptgpmv (IROMB, MAXWV, KMAX, MI, MJ, KWSKIP, KGSKIP, NISKIP, NJSKIP, RLAT1, RLON1, DLAT, DLON, WAVED, WAVEZ, UM, VM)
 This subprogram performs a spherical transform from spectral coefficients of divergences and curls to vector fields on a Mercator grid. More...
 
subroutine sptgpmv (iromb, maxwv, kmax, mi, mj, kwskip, kgskip, niskip, njskip, rlat1, rlon1, dlat, dlon, waved, wavez, um, vm)
 This subprogram performs a spherical transform from spectral coefficients of divergences and curls to vector fields on a Mercator grid.
 

Detailed Description

Transform spectral vector to Mercator.

@@ -117,8 +123,8 @@

Definition in file sptgpmv.f.

Function/Subroutine Documentation

- -

◆ sptgpmv()

+ +

◆ sptgpmv()

diff --git a/sptgpmv_8f.js b/sptgpmv_8f.js index a46a2628..366991d2 100644 --- a/sptgpmv_8f.js +++ b/sptgpmv_8f.js @@ -1,4 +1,4 @@ var sptgpmv_8f = [ - [ "sptgpmv", "sptgpmv_8f.html#a15de3accfd448d116324872c8fb1bb17", null ] + [ "sptgpmv", "sptgpmv_8f.html#aea2ea8b5f0676be7fc5c15968b08d3c8", null ] ]; \ No newline at end of file diff --git a/sptgpmv_8f_source.html b/sptgpmv_8f_source.html index 71c666ac..fdcd06a5 100644 --- a/sptgpmv_8f_source.html +++ b/sptgpmv_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgpmv.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,170 +81,178 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgpmv.f
+
sptgpmv.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Transform spectral vector to Mercator
-
3 C> ### Program history log:
-
4 C> Date | Programmer | Comments
-
5 C> -----|------------|----------
-
6 C> 96-02-29 | IREDELL | Initial.
-
7 C> 1998-12-15 | IREDELL | OpenMP directives inserted.
-
8 C> @author IREDELL @date 96-02-29
-
9 
-
10 C> This subprogram performs a spherical transform
-
11 C> from spectral coefficients of divergences and curls
-
12 C> to vector fields on a Mercator grid.
-
13 C>
-
14 C> The wave-space can be either triangular or rhomboidal.
-
15 C>
-
16 C> The wave and grid fields may have general indexing,
-
17 C> but each wave field is in sequential 'ibm order',
-
18 C> i.e., with zonal wavenumber as the slower index.
-
19 C>
-
20 C> The Mercator grid is identified by the location
-
21 C> of its first point and by its respective increments.
-
22 C>
-
23 C> The transforms are all multiprocessed over sector points.
-
24 C> Transform several fields at a time to improve vectorization.
-
25 C>
-
26 C> Subprogram can be called from a multiprocessing environment.
-
27 C>
-
28 C> @param IROMB Spectral domain shape
-
29 C> (0 for triangular, 1 for rhomboidal)
-
30 C> @param MAXWV Spectral truncation
-
31 C> @param KMAX Number of fields to transform
-
32 C> @param MI Number of points in the faster zonal direction
-
33 C> @param MJ Number of points in the slower merid direction
-
34 C> @param KWSKIP Skip number between wave fields
-
35 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
-
36 C> @param KGSKIP Skip number between grid fields
-
37 C> (defaults to MI*MJ if KGSKIP=0)
-
38 C> @param NISKIP Skip number between grid i-points
-
39 C> (defaults to 1 if NISKIP=0)
-
40 C> @param NJSKIP Skip number between grid j-points
-
41 C> (defaults to MI if NJSKIP=0)
-
42 C> @param RLAT1 Latitude of the first grid point in degrees
-
43 C> @param RLON1 Longitude of the first grid point in degrees
-
44 C> @param DLAT Latitude increment in degrees such that
-
45 C> D(PHI)/D(J)=DLAT*COS(PHI) where J is meridional index.
-
46 C> DLAT is negative for grids indexed southward.
-
47 C> (in terms of grid increment dy valid at latitude RLATI,
-
48 C> The latitude increment DLAT is determined as
-
49 C> DLAT=DPR*DY/(RERTH*COS(RLATI/DPR))
-
50 C> where DPR=180/PI and RERTH is Earth's radius)
-
51 C> @param DLON longitude increment in degrees such that
-
52 C> D(LAMBDA)/D(I)=DLON where I is zonal index.
-
53 C> DLON is negative for grids indexed westward.
-
54 C> @param WAVED Wave divergence fields
-
55 C> @param WAVEZ Wave vorticity fields
-
56 C> @param UM Mercator u-winds
-
57 C> @param VM Mercator v-winds
-
58 C>
-
59 C> @author IREDELL @date 96-02-29
-
60  SUBROUTINE sptgpmv(IROMB,MAXWV,KMAX,MI,MJ,
-
61  & KWSKIP,KGSKIP,NISKIP,NJSKIP,
-
62  & RLAT1,RLON1,DLAT,DLON,WAVED,WAVEZ,UM,VM)
-
63 
-
64  REAL WAVED(*),WAVEZ(*),UM(*),VM(*)
-
65  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
-
66  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
67  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
68  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
-
69  INTEGER MP(2*KMAX)
-
70  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,2*KMAX)
-
71  REAL WTOP(2*(MAXWV+1),2*KMAX)
-
72  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
-
73  REAL F(2*MAXWV+3,2,2*KMAX)
-
74  REAL CLAT(MJ),SLAT(MJ),CLON(MAXWV,MI),SLON(MAXWV,MI)
-
75  parameter(pi=3.14159265358979,dpr=180./pi)
-
76 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
77 C CALCULATE PRELIMINARY CONSTANTS
-
78  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
-
79  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
80  mxtop=maxwv+1
-
81  mdim=2*mx+1
-
82  idim=2*maxwv+3
-
83  kw=kwskip
-
84  kg=kgskip
-
85  ni=niskip
-
86  nj=njskip
-
87  IF(kw.EQ.0) kw=2*mx
-
88  IF(kg.EQ.0) kg=mi*mj
-
89  IF(ni.EQ.0) ni=1
-
90  IF(nj.EQ.0) nj=mi
-
91  DO i=1,mi
-
92  rlon=mod(rlon1+dlon*(i-1)+3600,360.)
-
93  DO l=1,maxwv
-
94  clon(l,i)=cos(l*rlon/dpr)
-
95  slon(l,i)=sin(l*rlon/dpr)
-
96  ENDDO
-
97  ENDDO
-
98  ye=1-log(tan((rlat1+90)/2/dpr))*dpr/dlat
-
99  DO j=1,mj
-
100  rlat=atan(exp(dlat/dpr*(j-ye)))*2*dpr-90
-
101  clat(j)=cos(rlat/dpr)
-
102  slat(j)=sin(rlat/dpr)
-
103  ENDDO
-
104  mp=1
-
105 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
106 C CALCULATE SPECTRAL WINDS
-
107 C$OMP PARALLEL DO PRIVATE(KWS)
-
108  DO k=1,kmax
-
109  kws=(k-1)*kw
-
110  CALL spdz2uv(iromb,maxwv,enn1,elonn1,eon,eontop,
-
111  & waved(kws+1),wavez(kws+1),
-
112  & w(1,k),w(1,kmax+k),wtop(1,k),wtop(1,kmax+k))
-
113  ENDDO
-
114 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
115 C TRANSFORM TO GRID
-
116 C$OMP PARALLEL DO PRIVATE(PLN,PLNTOP,F,KU,KV,IJK)
-
117  DO j=1,mj
-
118  CALL splegend(iromb,maxwv,slat(j),clat(j),eps,epstop,
-
119  & pln,plntop)
-
120  CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
-
121  & clat(j),pln,plntop,mp,w,wtop,f)
-
122  DO k=1,kmax
-
123  ku=k
-
124  kv=k+kmax
-
125  DO i=1,mi
-
126  ijk=(i-1)*ni+(j-1)*nj+(k-1)*kg+1
-
127  um(ijk)=f(1,1,ku)
-
128  vm(ijk)=f(1,1,kv)
-
129  ENDDO
-
130  DO l=1,maxwv
-
131  DO i=1,mi
-
132  ijk=(i-1)*ni+(j-1)*nj+(k-1)*kg+1
-
133  um(ijk)=um(ijk)+2.*(f(2*l+1,1,ku)*clon(l,i)
-
134  & -f(2*l+2,1,ku)*slon(l,i))
-
135  vm(ijk)=vm(ijk)+2.*(f(2*l+1,1,kv)*clon(l,i)
-
136  & -f(2*l+2,1,kv)*slon(l,i))
-
137  ENDDO
-
138  ENDDO
-
139  ENDDO
-
140  ENDDO
-
141 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
142  END
-
subroutine spdz2uv(I, M, ENN1, ELONN1, EON, EONTOP, D, Z, U, V, UTOP, VTOP)
Computes the wind components from divergence and vorticity in spectral space.
Definition: spdz2uv.f:49
-
subroutine splegend(I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
Definition: splegend.f:45
-
subroutine spsynth(I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
Definition: spsynth.f:39
-
subroutine sptgpmv(IROMB, MAXWV, KMAX, MI, MJ, KWSKIP, KGSKIP, NISKIP, NJSKIP, RLAT1, RLON1, DLAT, DLON, WAVED, WAVEZ, UM, VM)
This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
Definition: sptgpmv.f:63
-
subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
This subprogram gets wave-space constants.
Definition: spwget.f:18
+Go to the documentation of this file.
1C> @file
+
2C> @brief Transform spectral vector to Mercator
+
3C> ### Program history log:
+
4C> Date | Programmer | Comments
+
5C> -----|------------|----------
+
6C> 96-02-29 | IREDELL | Initial.
+
7C> 1998-12-15 | IREDELL | OpenMP directives inserted.
+
8C> @author IREDELL @date 96-02-29
+
9
+
10C> This subprogram performs a spherical transform
+
11C> from spectral coefficients of divergences and curls
+
12C> to vector fields on a Mercator grid.
+
13C>
+
14C> The wave-space can be either triangular or rhomboidal.
+
15C>
+
16C> The wave and grid fields may have general indexing,
+
17C> but each wave field is in sequential 'ibm order',
+
18C> i.e., with zonal wavenumber as the slower index.
+
19C>
+
20C> The Mercator grid is identified by the location
+
21C> of its first point and by its respective increments.
+
22C>
+
23C> The transforms are all multiprocessed over sector points.
+
24C> Transform several fields at a time to improve vectorization.
+
25C>
+
26C> Subprogram can be called from a multiprocessing environment.
+
27C>
+
28C> @param IROMB Spectral domain shape
+
29C> (0 for triangular, 1 for rhomboidal)
+
30C> @param MAXWV Spectral truncation
+
31C> @param KMAX Number of fields to transform
+
32C> @param MI Number of points in the faster zonal direction
+
33C> @param MJ Number of points in the slower merid direction
+
34C> @param KWSKIP Skip number between wave fields
+
35C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
+
36C> @param KGSKIP Skip number between grid fields
+
37C> (defaults to MI*MJ if KGSKIP=0)
+
38C> @param NISKIP Skip number between grid i-points
+
39C> (defaults to 1 if NISKIP=0)
+
40C> @param NJSKIP Skip number between grid j-points
+
41C> (defaults to MI if NJSKIP=0)
+
42C> @param RLAT1 Latitude of the first grid point in degrees
+
43C> @param RLON1 Longitude of the first grid point in degrees
+
44C> @param DLAT Latitude increment in degrees such that
+
45C> D(PHI)/D(J)=DLAT*COS(PHI) where J is meridional index.
+
46C> DLAT is negative for grids indexed southward.
+
47C> (in terms of grid increment dy valid at latitude RLATI,
+
48C> The latitude increment DLAT is determined as
+
49C> DLAT=DPR*DY/(RERTH*COS(RLATI/DPR))
+
50C> where DPR=180/PI and RERTH is Earth's radius)
+
51C> @param DLON longitude increment in degrees such that
+
52C> D(LAMBDA)/D(I)=DLON where I is zonal index.
+
53C> DLON is negative for grids indexed westward.
+
54C> @param WAVED Wave divergence fields
+
55C> @param WAVEZ Wave vorticity fields
+
56C> @param UM Mercator u-winds
+
57C> @param VM Mercator v-winds
+
58C>
+
59C> @author IREDELL @date 96-02-29
+
+
60 SUBROUTINE sptgpmv(IROMB,MAXWV,KMAX,MI,MJ,
+
61 & KWSKIP,KGSKIP,NISKIP,NJSKIP,
+
62 & RLAT1,RLON1,DLAT,DLON,WAVED,WAVEZ,UM,VM)
+
63
+
64 REAL WAVED(*),WAVEZ(*),UM(*),VM(*)
+
65 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
+
66 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
67 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
68 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
+
69 INTEGER MP(2*KMAX)
+
70 REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,2*KMAX)
+
71 REAL WTOP(2*(MAXWV+1),2*KMAX)
+
72 REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
+
73 REAL F(2*MAXWV+3,2,2*KMAX)
+
74 REAL CLAT(MJ),SLAT(MJ),CLON(MAXWV,MI),SLON(MAXWV,MI)
+
75 parameter(pi=3.14159265358979,dpr=180./pi)
+
76C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
77C CALCULATE PRELIMINARY CONSTANTS
+
78 CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
+
79 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
80 mxtop=maxwv+1
+
81 mdim=2*mx+1
+
82 idim=2*maxwv+3
+
83 kw=kwskip
+
84 kg=kgskip
+
85 ni=niskip
+
86 nj=njskip
+
87 IF(kw.EQ.0) kw=2*mx
+
88 IF(kg.EQ.0) kg=mi*mj
+
89 IF(ni.EQ.0) ni=1
+
90 IF(nj.EQ.0) nj=mi
+
91 DO i=1,mi
+
92 rlon=mod(rlon1+dlon*(i-1)+3600,360.)
+
93 DO l=1,maxwv
+
94 clon(l,i)=cos(l*rlon/dpr)
+
95 slon(l,i)=sin(l*rlon/dpr)
+
96 ENDDO
+
97 ENDDO
+
98 ye=1-log(tan((rlat1+90)/2/dpr))*dpr/dlat
+
99 DO j=1,mj
+
100 rlat=atan(exp(dlat/dpr*(j-ye)))*2*dpr-90
+
101 clat(j)=cos(rlat/dpr)
+
102 slat(j)=sin(rlat/dpr)
+
103 ENDDO
+
104 mp=1
+
105C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
106C CALCULATE SPECTRAL WINDS
+
107C$OMP PARALLEL DO PRIVATE(KWS)
+
108 DO k=1,kmax
+
109 kws=(k-1)*kw
+
110 CALL spdz2uv(iromb,maxwv,enn1,elonn1,eon,eontop,
+
111 & waved(kws+1),wavez(kws+1),
+
112 & w(1,k),w(1,kmax+k),wtop(1,k),wtop(1,kmax+k))
+
113 ENDDO
+
114C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
115C TRANSFORM TO GRID
+
116C$OMP PARALLEL DO PRIVATE(PLN,PLNTOP,F,KU,KV,IJK)
+
117 DO j=1,mj
+
118 CALL splegend(iromb,maxwv,slat(j),clat(j),eps,epstop,
+
119 & pln,plntop)
+
120 CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
+
121 & clat(j),pln,plntop,mp,w,wtop,f)
+
122 DO k=1,kmax
+
123 ku=k
+
124 kv=k+kmax
+
125 DO i=1,mi
+
126 ijk=(i-1)*ni+(j-1)*nj+(k-1)*kg+1
+
127 um(ijk)=f(1,1,ku)
+
128 vm(ijk)=f(1,1,kv)
+
129 ENDDO
+
130 DO l=1,maxwv
+
131 DO i=1,mi
+
132 ijk=(i-1)*ni+(j-1)*nj+(k-1)*kg+1
+
133 um(ijk)=um(ijk)+2.*(f(2*l+1,1,ku)*clon(l,i)
+
134 & -f(2*l+2,1,ku)*slon(l,i))
+
135 vm(ijk)=vm(ijk)+2.*(f(2*l+1,1,kv)*clon(l,i)
+
136 & -f(2*l+2,1,kv)*slon(l,i))
+
137 ENDDO
+
138 ENDDO
+
139 ENDDO
+
140 ENDDO
+
141C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+
142 END
+
subroutine spdz2uv(i, m, enn1, elonn1, eon, eontop, d, z, u, v, utop, vtop)
Computes the wind components from divergence and vorticity in spectral space.
Definition spdz2uv.f:49
+
subroutine splegend(i, m, slat, clat, eps, epstop, pln, plntop)
Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
Definition splegend.f:45
+
subroutine spsynth(i, m, im, ix, nc, nctop, km, clat, pln, plntop, mp, spc, spctop, f)
Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
Definition spsynth.f:39
+
subroutine sptgpmv(iromb, maxwv, kmax, mi, mj, kwskip, kgskip, niskip, njskip, rlat1, rlon1, dlat, dlon, waved, wavez, um, vm)
This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
Definition sptgpmv.f:63
+
subroutine spwget(iromb, maxwv, eps, epstop, enn1, elonn1, eon, eontop)
This subprogram gets wave-space constants.
Definition spwget.f:18
diff --git a/sptgps_8f.html b/sptgps_8f.html index 8b17dee0..7c0442a5 100644 --- a/sptgps_8f.html +++ b/sptgps_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgps.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgps.f File Reference
+
sptgps.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptgps (IROMB, MAXWV, KMAX, NPS, KWSKIP, KGSKIP, NISKIP, NJSKIP, TRUE, XMESH, ORIENT, WAVE, GN, GS)
 This subprogram performs a spherical transform from spectral coefficients of scalar quantities to scalar fields on a pair of polar stereographic grids. More...
 
subroutine sptgps (iromb, maxwv, kmax, nps, kwskip, kgskip, niskip, njskip, true, xmesh, orient, wave, gn, gs)
 This subprogram performs a spherical transform from spectral coefficients of scalar quantities to scalar fields on a pair of polar stereographic grids.
 

Detailed Description

Transform spectral scalar to polar stereo.

@@ -117,8 +123,8 @@

Definition in file sptgps.f.

Function/Subroutine Documentation

- -

◆ sptgps()

+ +

◆ sptgps()

diff --git a/sptgps_8f.js b/sptgps_8f.js index 8cdfa429..b29310a2 100644 --- a/sptgps_8f.js +++ b/sptgps_8f.js @@ -1,4 +1,4 @@ var sptgps_8f = [ - [ "sptgps", "sptgps_8f.html#af06a2dccfa311014fc9f671b14f247b2", null ] + [ "sptgps", "sptgps_8f.html#a501a1f1d587c5372a80ae1a2d7ea467e", null ] ]; \ No newline at end of file diff --git a/sptgps_8f_source.html b/sptgps_8f_source.html index 3aac1362..d6f3d122 100644 --- a/sptgps_8f_source.html +++ b/sptgps_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgps.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,574 +81,582 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgps.f
+
sptgps.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Transform spectral scalar to polar stereo.
-
3 C>
-
4 C> ### Program History Log
-
5 C> Date | Programmer | Comments
-
6 C> -----|------------|---------
-
7 C> 96-02-29 | Iredell | Initial.
-
8 C> 1998-12-15 | Iredell | Openmp directives inserted.
-
9 C>
-
10 C> @author Iredell @date 96-02-29
-
11 
-
12 C> This subprogram performs a spherical transform
-
13 C> from spectral coefficients of scalar quantities
-
14 C> to scalar fields on a pair of polar stereographic grids.
-
15 C>
-
16 C> The wave-space can be either triangular or rhomboidal.
-
17 C>
-
18 C> The wave and grid fields may have general indexing,
-
19 C> but each wave field is in sequential 'IBM order',
-
20 C> i.e. with zonal wavenumber as the slower index.
-
21 C>
-
22 C> The two square polar stereographic grids are centered
-
23 C> on the respective poles, with the orientation longitude
-
24 C> of the southern hemisphere grid 180 degrees opposite
-
25 C> that of the northern hemisphere grid.
-
26 C>
-
27 C> The transform is made efficient
-
28 C> by combining points in eight sectors
-
29 C> of each polar stereographic grid,
-
30 C> numbered as in the diagram below.
-
31 C>
-
32 C> The pole and the sector boundaries
-
33 C> are treated specially in the code.
-
34 C>
-
35 C> Unfortunately, this approach induces
-
36 C> some hairy indexing and code loquacity.
-
37 C>
-
38 C> <pre>
-
39 C> \ 4 | 5 /
-
40 C> \ | /
-
41 C> 3 \ | / 6
-
42 C> \|/
-
43 C> ----+----
-
44 C> /|\
-
45 C> 2 / | \ 7
-
46 C> / | \
-
47 C> / 1 | 8 \
-
48 C> </pre>
-
49 C>
-
50 C> The transforms are all multiprocessed over sector points.
-
51 C>
-
52 C> Transform several fields at a time to improve vectorization.
-
53 C>
-
54 C> Subprogram can be called from a multiprocessing environment.
-
55 C>
-
56 C> @param IROMB spectral domain shape
-
57 C> (0 for triangular, 1 for rhomboidal)
-
58 C> @param MAXWV spectral truncation
-
59 C> @param KMAX number of fields to transform.
-
60 C> @param NPS odd order of the polar stereographic grids.
-
61 C> @param KWSKIP skip number between wave fields
-
62 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
-
63 C> @param KGSKIP skip number between grid fields
-
64 C> (defaults to NPS*NPS if KGSKIP=0)
-
65 C> @param NISKIP skip number between grid i-points
-
66 C> (defaults to 1 if NISKIP=0)
-
67 C> @param NJSKIP skip number between grid j-points
-
68 C> (defaults to NPS if NJSKIP=0)
-
69 C> @param TRUE latitude at which ps grid is true (usually 60.)
-
70 C> @param XMESH grid length at true latitude (m)
-
71 C> @param ORIENT longitude at bottom of northern ps grid
-
72 C> (southern ps grid will have opposite orientation.)
-
73 C> @param WAVE wave fields
-
74 C> @param GN northern polar stereographic fields
-
75 C> @param GS southern polar stereographic fields
-
76 C>
-
77 C> @author Iredell @date 96-02-29
-
78  SUBROUTINE sptgps(IROMB,MAXWV,KMAX,NPS,
-
79  & KWSKIP,KGSKIP,NISKIP,NJSKIP,
-
80  & TRUE,XMESH,ORIENT,WAVE,GN,GS)
-
81 
-
82  REAL WAVE(*),GN(*),GS(*)
-
83  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
-
84  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
85  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
86  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
-
87  INTEGER MP(KMAX)
-
88  REAL SLON(MAXWV,8),CLON(MAXWV,8),SROT(0:3),CROT(0:3)
-
89  REAL WTOP(2*(MAXWV+1),KMAX)
-
90  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
-
91  REAL F(2*MAXWV+3,2,KMAX)
-
92  DATA srot/0.,1.,0.,-1./,crot/1.,0.,-1.,0./
-
93  parameter(rerth=6.3712e6)
-
94  parameter(pi=3.14159265358979,dpr=180./pi)
-
95 
-
96 C CALCULATE PRELIMINARY CONSTANTS
-
97  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
-
98  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
99  mxtop=maxwv+1
-
100  idim=2*maxwv+3
-
101  kw=kwskip
-
102  kg=kgskip
-
103  ni=niskip
-
104  nj=njskip
-
105  IF(kw.EQ.0) kw=2*mx
-
106  IF(kg.EQ.0) kg=nps*nps
-
107  IF(ni.EQ.0) ni=1
-
108  IF(nj.EQ.0) nj=nps
-
109  mp=0
-
110  nph=(nps-1)/2
-
111  gq=((1.+sin(true/dpr))*rerth/xmesh)**2
-
112 C$OMP PARALLEL DO
-
113  DO k=1,kmax
-
114  wtop(1:2*mxtop,k)=0
-
115  ENDDO
-
116 
-
117 C CALCULATE POLE POINT
-
118  i1=nph+1
-
119  j1=nph+1
-
120  ij1=(i1-1)*ni+(j1-1)*nj+1
-
121  slat1=1.
-
122  clat1=0.
-
123  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
-
124  & pln,plntop)
-
125  CALL spsynth(iromb,maxwv,2*maxwv,idim,kw,2*mxtop,kmax,
-
126  & clat1,pln,plntop,mp,wave,wtop,f)
-
127 CDIR$ IVDEP
-
128  DO k=1,kmax
-
129  ijk1=ij1+(k-1)*kg
-
130  gn(ijk1)=f(1,1,k)
-
131  gs(ijk1)=f(1,2,k)
-
132  ENDDO
-
133 
-
134 C CALCULATE POINTS ALONG THE ROW AND COLUMN OF THE POLE,
-
135 C STARTING AT THE ORIENTATION LONGITUDE AND GOING CLOCKWISE.
-
136 C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8)
-
137 C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8)
-
138 C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8)
-
139 C$OMP& PRIVATE(DJ1,DI1,RQ,RADLON,RADLON1,RADLON2,SLAT1,CLAT1)
-
140 C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,LR,LI)
-
141  DO j1=1,nph
-
142  i1=nph+1
-
143  radlon=orient/dpr
-
144  j3=nps+1-i1
-
145  i3=j1
-
146  j5=nps+1-j1
-
147  i5=nps+1-i1
-
148  j7=i1
-
149  i7=nps+1-j1
-
150  ij1=(i1-1)*ni+(j1-1)*nj+1
-
151  ij3=(i3-1)*ni+(j3-1)*nj+1
-
152  ij5=(i5-1)*ni+(j5-1)*nj+1
-
153  ij7=(i7-1)*ni+(j7-1)*nj+1
-
154  di1=i1-nph-1
-
155  dj1=j1-nph-1
-
156  rq=di1**2+dj1**2
-
157  slat1=(gq-rq)/(gq+rq)
-
158  clat1=sqrt(1.-slat1**2)
-
159  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
-
160  & pln,plntop)
-
161  CALL spsynth(iromb,maxwv,2*maxwv,idim,kw,2*mxtop,kmax,
-
162  & clat1,pln,plntop,mp,wave,wtop,f)
-
163  DO l=1,maxwv
-
164  slon(l,1)=sin(l*radlon)
-
165  clon(l,1)=cos(l*radlon)
-
166  slon(l,3)=slon(l,1)*crot(mod(1*l,4))
-
167  & -clon(l,1)*srot(mod(1*l,4))
-
168  clon(l,3)=clon(l,1)*crot(mod(1*l,4))
-
169  & +slon(l,1)*srot(mod(1*l,4))
-
170  slon(l,5)=slon(l,1)*crot(mod(2*l,4))
-
171  & -clon(l,1)*srot(mod(2*l,4))
-
172  clon(l,5)=clon(l,1)*crot(mod(2*l,4))
-
173  & +slon(l,1)*srot(mod(2*l,4))
-
174  slon(l,7)=slon(l,1)*crot(mod(3*l,4))
-
175  & -clon(l,1)*srot(mod(3*l,4))
-
176  clon(l,7)=clon(l,1)*crot(mod(3*l,4))
-
177  & +slon(l,1)*srot(mod(3*l,4))
-
178  ENDDO
-
179 CDIR$ IVDEP
-
180  DO k=1,kmax
-
181  ijk1=ij1+(k-1)*kg
-
182  ijk3=ij3+(k-1)*kg
-
183  ijk5=ij5+(k-1)*kg
-
184  ijk7=ij7+(k-1)*kg
-
185  gn(ijk1)=f(1,1,k)
-
186  gn(ijk3)=f(1,1,k)
-
187  gn(ijk5)=f(1,1,k)
-
188  gn(ijk7)=f(1,1,k)
-
189  gs(ijk1)=f(1,2,k)
-
190  gs(ijk3)=f(1,2,k)
-
191  gs(ijk5)=f(1,2,k)
-
192  gs(ijk7)=f(1,2,k)
-
193  ENDDO
-
194  IF(kmax.EQ.1) THEN
-
195  DO l=1,maxwv
-
196  lr=2*l+1
-
197  li=2*l+2
-
198  gn(ij1)=gn(ij1)+2*(f(lr,1,1)*clon(l,1)
-
199  & -f(li,1,1)*slon(l,1))
-
200  gn(ij3)=gn(ij3)+2*(f(lr,1,1)*clon(l,3)
-
201  & -f(li,1,1)*slon(l,3))
-
202  gn(ij5)=gn(ij5)+2*(f(lr,1,1)*clon(l,5)
-
203  & -f(li,1,1)*slon(l,5))
-
204  gn(ij7)=gn(ij7)+2*(f(lr,1,1)*clon(l,7)
-
205  & -f(li,1,1)*slon(l,7))
-
206  gs(ij1)=gs(ij1)+2*(f(lr,2,1)*clon(l,5)
-
207  & -f(li,2,1)*slon(l,5))
-
208  gs(ij3)=gs(ij3)+2*(f(lr,2,1)*clon(l,3)
-
209  & -f(li,2,1)*slon(l,3))
-
210  gs(ij5)=gs(ij5)+2*(f(lr,2,1)*clon(l,1)
-
211  & -f(li,2,1)*slon(l,1))
-
212  gs(ij7)=gs(ij7)+2*(f(lr,2,1)*clon(l,7)
-
213  & -f(li,2,1)*slon(l,7))
-
214  ENDDO
-
215  ELSE
-
216  DO l=1,maxwv
-
217  lr=2*l+1
-
218  li=2*l+2
-
219 CDIR$ IVDEP
-
220  DO k=1,kmax
-
221  ijk1=ij1+(k-1)*kg
-
222  ijk3=ij3+(k-1)*kg
-
223  ijk5=ij5+(k-1)*kg
-
224  ijk7=ij7+(k-1)*kg
-
225  gn(ijk1)=gn(ijk1)+2*(f(lr,1,k)*clon(l,1)
-
226  & -f(li,1,k)*slon(l,1))
-
227  gn(ijk3)=gn(ijk3)+2*(f(lr,1,k)*clon(l,3)
-
228  & -f(li,1,k)*slon(l,3))
-
229  gn(ijk5)=gn(ijk5)+2*(f(lr,1,k)*clon(l,5)
-
230  & -f(li,1,k)*slon(l,5))
-
231  gn(ijk7)=gn(ijk7)+2*(f(lr,1,k)*clon(l,7)
-
232  & -f(li,1,k)*slon(l,7))
-
233  gs(ijk1)=gs(ijk1)+2*(f(lr,2,k)*clon(l,5)
-
234  & -f(li,2,k)*slon(l,5))
-
235  gs(ijk3)=gs(ijk3)+2*(f(lr,2,k)*clon(l,3)
-
236  & -f(li,2,k)*slon(l,3))
-
237  gs(ijk5)=gs(ijk5)+2*(f(lr,2,k)*clon(l,1)
-
238  & -f(li,2,k)*slon(l,1))
-
239  gs(ijk7)=gs(ijk7)+2*(f(lr,2,k)*clon(l,7)
-
240  & -f(li,2,k)*slon(l,7))
-
241  ENDDO
-
242  ENDDO
-
243  ENDIF
-
244  ENDDO
-
245 
-
246 C CALCULATE POINTS ON THE MAIN DIAGONALS THROUGH THE POLE,
-
247 C STARTING CLOCKWISE OF THE ORIENTATION LONGITUDE AND GOING CLOCKWISE.
-
248 C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8)
-
249 C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8)
-
250 C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8)
-
251 C$OMP& PRIVATE(DJ1,DI1,RQ,RADLON,RADLON1,RADLON2,SLAT1,CLAT1)
-
252 C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,LR,LI)
-
253  DO j1=1,nph
-
254  i1=j1
-
255  radlon=(orient-45)/dpr
-
256  j3=nps+1-i1
-
257  i3=j1
-
258  j5=nps+1-j1
-
259  i5=nps+1-i1
-
260  j7=i1
-
261  i7=nps+1-j1
-
262  ij1=(i1-1)*ni+(j1-1)*nj+1
-
263  ij3=(i3-1)*ni+(j3-1)*nj+1
-
264  ij5=(i5-1)*ni+(j5-1)*nj+1
-
265  ij7=(i7-1)*ni+(j7-1)*nj+1
-
266  di1=i1-nph-1
-
267  dj1=j1-nph-1
-
268  rq=di1**2+dj1**2
-
269  slat1=(gq-rq)/(gq+rq)
-
270  clat1=sqrt(1.-slat1**2)
-
271  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
-
272  & pln,plntop)
-
273  CALL spsynth(iromb,maxwv,2*maxwv,idim,kw,2*mxtop,kmax,
-
274  & clat1,pln,plntop,mp,wave,wtop,f)
-
275  DO l=1,maxwv
-
276  slon(l,1)=sin(l*radlon)
-
277  clon(l,1)=cos(l*radlon)
-
278  slon(l,3)=slon(l,1)*crot(mod(1*l,4))
-
279  & -clon(l,1)*srot(mod(1*l,4))
-
280  clon(l,3)=clon(l,1)*crot(mod(1*l,4))
-
281  & +slon(l,1)*srot(mod(1*l,4))
-
282  slon(l,5)=slon(l,1)*crot(mod(2*l,4))
-
283  & -clon(l,1)*srot(mod(2*l,4))
-
284  clon(l,5)=clon(l,1)*crot(mod(2*l,4))
-
285  & +slon(l,1)*srot(mod(2*l,4))
-
286  slon(l,7)=slon(l,1)*crot(mod(3*l,4))
-
287  & -clon(l,1)*srot(mod(3*l,4))
-
288  clon(l,7)=clon(l,1)*crot(mod(3*l,4))
-
289  & +slon(l,1)*srot(mod(3*l,4))
-
290  ENDDO
-
291 CDIR$ IVDEP
-
292  DO k=1,kmax
-
293  ijk1=ij1+(k-1)*kg
-
294  ijk3=ij3+(k-1)*kg
-
295  ijk5=ij5+(k-1)*kg
-
296  ijk7=ij7+(k-1)*kg
-
297  gn(ijk1)=f(1,1,k)
-
298  gn(ijk3)=f(1,1,k)
-
299  gn(ijk5)=f(1,1,k)
-
300  gn(ijk7)=f(1,1,k)
-
301  gs(ijk1)=f(1,2,k)
-
302  gs(ijk3)=f(1,2,k)
-
303  gs(ijk5)=f(1,2,k)
-
304  gs(ijk7)=f(1,2,k)
-
305  ENDDO
-
306  IF(kmax.EQ.1) THEN
-
307  DO l=1,maxwv
-
308  lr=2*l+1
-
309  li=2*l+2
-
310  gn(ij1)=gn(ij1)+2*(f(lr,1,1)*clon(l,1)
-
311  & -f(li,1,1)*slon(l,1))
-
312  gn(ij3)=gn(ij3)+2*(f(lr,1,1)*clon(l,3)
-
313  & -f(li,1,1)*slon(l,3))
-
314  gn(ij5)=gn(ij5)+2*(f(lr,1,1)*clon(l,5)
-
315  & -f(li,1,1)*slon(l,5))
-
316  gn(ij7)=gn(ij7)+2*(f(lr,1,1)*clon(l,7)
-
317  & -f(li,1,1)*slon(l,7))
-
318  gs(ij1)=gs(ij1)+2*(f(lr,2,1)*clon(l,3)
-
319  & -f(li,2,1)*slon(l,3))
-
320  gs(ij3)=gs(ij3)+2*(f(lr,2,1)*clon(l,1)
-
321  & -f(li,2,1)*slon(l,1))
-
322  gs(ij5)=gs(ij5)+2*(f(lr,2,1)*clon(l,7)
-
323  & -f(li,2,1)*slon(l,7))
-
324  gs(ij7)=gs(ij7)+2*(f(lr,2,1)*clon(l,5)
-
325  & -f(li,2,1)*slon(l,5))
-
326  ENDDO
-
327  ELSE
-
328  DO l=1,maxwv
-
329  lr=2*l+1
-
330  li=2*l+2
-
331 CDIR$ IVDEP
-
332  DO k=1,kmax
-
333  ijk1=ij1+(k-1)*kg
-
334  ijk3=ij3+(k-1)*kg
-
335  ijk5=ij5+(k-1)*kg
-
336  ijk7=ij7+(k-1)*kg
-
337  gn(ijk1)=gn(ijk1)+2*(f(lr,1,k)*clon(l,1)
-
338  & -f(li,1,k)*slon(l,1))
-
339  gn(ijk3)=gn(ijk3)+2*(f(lr,1,k)*clon(l,3)
-
340  & -f(li,1,k)*slon(l,3))
-
341  gn(ijk5)=gn(ijk5)+2*(f(lr,1,k)*clon(l,5)
-
342  & -f(li,1,k)*slon(l,5))
-
343  gn(ijk7)=gn(ijk7)+2*(f(lr,1,k)*clon(l,7)
-
344  & -f(li,1,k)*slon(l,7))
-
345  gs(ijk1)=gs(ijk1)+2*(f(lr,2,k)*clon(l,3)
-
346  & -f(li,2,k)*slon(l,3))
-
347  gs(ijk3)=gs(ijk3)+2*(f(lr,2,k)*clon(l,1)
-
348  & -f(li,2,k)*slon(l,1))
-
349  gs(ijk5)=gs(ijk5)+2*(f(lr,2,k)*clon(l,7)
-
350  & -f(li,2,k)*slon(l,7))
-
351  gs(ijk7)=gs(ijk7)+2*(f(lr,2,k)*clon(l,5)
-
352  & -f(li,2,k)*slon(l,5))
-
353  ENDDO
-
354  ENDDO
-
355  ENDIF
-
356  ENDDO
-
357 
-
358 C CALCULATE THE REMAINDER OF THE POLAR STEREOGRAPHIC DOMAIN,
-
359 C STARTING AT THE SECTOR JUST CLOCKWISE OF THE ORIENTATION LONGITUDE
-
360 C AND GOING CLOCKWISE UNTIL ALL EIGHT SECTORS ARE DONE.
-
361 C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8)
-
362 C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8)
-
363 C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8)
-
364 C$OMP& PRIVATE(DJ1,DI1,RQ,RADLON,RADLON1,RADLON2,SLAT1,CLAT1)
-
365 C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,LR,LI)
-
366  DO j1=1,nph-1
-
367  DO i1=j1+1,nph
-
368  j2=i1
-
369  i2=j1
-
370  j3=nps+1-i1
-
371  i3=j1
-
372  j4=nps+1-j1
-
373  i4=i1
-
374  j5=nps+1-j1
-
375  i5=nps+1-i1
-
376  j6=nps+1-i1
-
377  i6=nps+1-j1
-
378  j7=i1
-
379  i7=nps+1-j1
-
380  j8=j1
-
381  i8=nps+1-i1
-
382  ij1=(i1-1)*ni+(j1-1)*nj+1
-
383  ij2=(i2-1)*ni+(j2-1)*nj+1
-
384  ij3=(i3-1)*ni+(j3-1)*nj+1
-
385  ij4=(i4-1)*ni+(j4-1)*nj+1
-
386  ij5=(i5-1)*ni+(j5-1)*nj+1
-
387  ij6=(i6-1)*ni+(j6-1)*nj+1
-
388  ij7=(i7-1)*ni+(j7-1)*nj+1
-
389  ij8=(i8-1)*ni+(j8-1)*nj+1
-
390  di1=i1-nph-1
-
391  dj1=j1-nph-1
-
392  rq=di1**2+dj1**2
-
393  slat1=(gq-rq)/(gq+rq)
-
394  clat1=sqrt(1.-slat1**2)
-
395  radlon1=orient/dpr+atan(-di1/dj1)
-
396  radlon2=(orient-45)/dpr*2-radlon1
-
397  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
-
398  & pln,plntop)
-
399  CALL spsynth(iromb,maxwv,2*maxwv,idim,kw,2*mxtop,kmax,
-
400  & clat1,pln,plntop,mp,wave,wtop,f)
-
401  DO l=1,maxwv
-
402  slon(l,1)=sin(l*radlon1)
-
403  clon(l,1)=cos(l*radlon1)
-
404  slon(l,2)=sin(l*radlon2)
-
405  clon(l,2)=cos(l*radlon2)
-
406  slon(l,3)=slon(l,1)*crot(mod(1*l,4))
-
407  & -clon(l,1)*srot(mod(1*l,4))
-
408  clon(l,3)=clon(l,1)*crot(mod(1*l,4))
-
409  & +slon(l,1)*srot(mod(1*l,4))
-
410  slon(l,4)=slon(l,2)*crot(mod(1*l,4))
-
411  & -clon(l,2)*srot(mod(1*l,4))
-
412  clon(l,4)=clon(l,2)*crot(mod(1*l,4))
-
413  & +slon(l,2)*srot(mod(1*l,4))
-
414  slon(l,5)=slon(l,1)*crot(mod(2*l,4))
-
415  & -clon(l,1)*srot(mod(2*l,4))
-
416  clon(l,5)=clon(l,1)*crot(mod(2*l,4))
-
417  & +slon(l,1)*srot(mod(2*l,4))
-
418  slon(l,6)=slon(l,2)*crot(mod(2*l,4))
-
419  & -clon(l,2)*srot(mod(2*l,4))
-
420  clon(l,6)=clon(l,2)*crot(mod(2*l,4))
-
421  & +slon(l,2)*srot(mod(2*l,4))
-
422  slon(l,7)=slon(l,1)*crot(mod(3*l,4))
-
423  & -clon(l,1)*srot(mod(3*l,4))
-
424  clon(l,7)=clon(l,1)*crot(mod(3*l,4))
-
425  & +slon(l,1)*srot(mod(3*l,4))
-
426  slon(l,8)=slon(l,2)*crot(mod(3*l,4))
-
427  & -clon(l,2)*srot(mod(3*l,4))
-
428  clon(l,8)=clon(l,2)*crot(mod(3*l,4))
-
429  & +slon(l,2)*srot(mod(3*l,4))
-
430  ENDDO
-
431 CDIR$ IVDEP
-
432  DO k=1,kmax
-
433  ijk1=ij1+(k-1)*kg
-
434  ijk2=ij2+(k-1)*kg
-
435  ijk3=ij3+(k-1)*kg
-
436  ijk4=ij4+(k-1)*kg
-
437  ijk5=ij5+(k-1)*kg
-
438  ijk6=ij6+(k-1)*kg
-
439  ijk7=ij7+(k-1)*kg
-
440  ijk8=ij8+(k-1)*kg
-
441  gn(ijk1)=f(1,1,k)
-
442  gn(ijk2)=f(1,1,k)
-
443  gn(ijk3)=f(1,1,k)
-
444  gn(ijk4)=f(1,1,k)
-
445  gn(ijk5)=f(1,1,k)
-
446  gn(ijk6)=f(1,1,k)
-
447  gn(ijk7)=f(1,1,k)
-
448  gn(ijk8)=f(1,1,k)
-
449  gs(ijk1)=f(1,2,k)
-
450  gs(ijk2)=f(1,2,k)
-
451  gs(ijk3)=f(1,2,k)
-
452  gs(ijk4)=f(1,2,k)
-
453  gs(ijk5)=f(1,2,k)
-
454  gs(ijk6)=f(1,2,k)
-
455  gs(ijk7)=f(1,2,k)
-
456  gs(ijk8)=f(1,2,k)
-
457  ENDDO
-
458  IF(kmax.EQ.1) THEN
-
459  DO l=1,maxwv
-
460  lr=2*l+1
-
461  li=2*l+2
-
462  gn(ij1)=gn(ij1)+2*(f(lr,1,1)*clon(l,1)
-
463  & -f(li,1,1)*slon(l,1))
-
464  gn(ij2)=gn(ij2)+2*(f(lr,1,1)*clon(l,2)
-
465  & -f(li,1,1)*slon(l,2))
-
466  gn(ij3)=gn(ij3)+2*(f(lr,1,1)*clon(l,3)
-
467  & -f(li,1,1)*slon(l,3))
-
468  gn(ij4)=gn(ij4)+2*(f(lr,1,1)*clon(l,4)
-
469  & -f(li,1,1)*slon(l,4))
-
470  gn(ij5)=gn(ij5)+2*(f(lr,1,1)*clon(l,5)
-
471  & -f(li,1,1)*slon(l,5))
-
472  gn(ij6)=gn(ij6)+2*(f(lr,1,1)*clon(l,6)
-
473  & -f(li,1,1)*slon(l,6))
-
474  gn(ij7)=gn(ij7)+2*(f(lr,1,1)*clon(l,7)
-
475  & -f(li,1,1)*slon(l,7))
-
476  gn(ij8)=gn(ij8)+2*(f(lr,1,1)*clon(l,8)
-
477  & -f(li,1,1)*slon(l,8))
-
478  gs(ij1)=gs(ij1)+2*(f(lr,2,1)*clon(l,4)
-
479  & -f(li,2,1)*slon(l,4))
-
480  gs(ij2)=gs(ij2)+2*(f(lr,2,1)*clon(l,3)
-
481  & -f(li,2,1)*slon(l,3))
-
482  gs(ij3)=gs(ij3)+2*(f(lr,2,1)*clon(l,2)
-
483  & -f(li,2,1)*slon(l,2))
-
484  gs(ij4)=gs(ij4)+2*(f(lr,2,1)*clon(l,1)
-
485  & -f(li,2,1)*slon(l,1))
-
486  gs(ij5)=gs(ij5)+2*(f(lr,2,1)*clon(l,8)
-
487  & -f(li,2,1)*slon(l,8))
-
488  gs(ij6)=gs(ij6)+2*(f(lr,2,1)*clon(l,7)
-
489  & -f(li,2,1)*slon(l,7))
-
490  gs(ij7)=gs(ij7)+2*(f(lr,2,1)*clon(l,6)
-
491  & -f(li,2,1)*slon(l,6))
-
492  gs(ij8)=gs(ij8)+2*(f(lr,2,1)*clon(l,5)
-
493  & -f(li,2,1)*slon(l,5))
-
494  ENDDO
-
495  ELSE
-
496  DO l=1,maxwv
-
497  lr=2*l+1
-
498  li=2*l+2
-
499 CDIR$ IVDEP
-
500  DO k=1,kmax
-
501  ijk1=ij1+(k-1)*kg
-
502  ijk2=ij2+(k-1)*kg
-
503  ijk3=ij3+(k-1)*kg
-
504  ijk4=ij4+(k-1)*kg
-
505  ijk5=ij5+(k-1)*kg
-
506  ijk6=ij6+(k-1)*kg
-
507  ijk7=ij7+(k-1)*kg
-
508  ijk8=ij8+(k-1)*kg
-
509  gn(ijk1)=gn(ijk1)+2*(f(lr,1,k)*clon(l,1)
-
510  & -f(li,1,k)*slon(l,1))
-
511  gn(ijk2)=gn(ijk2)+2*(f(lr,1,k)*clon(l,2)
-
512  & -f(li,1,k)*slon(l,2))
-
513  gn(ijk3)=gn(ijk3)+2*(f(lr,1,k)*clon(l,3)
-
514  & -f(li,1,k)*slon(l,3))
-
515  gn(ijk4)=gn(ijk4)+2*(f(lr,1,k)*clon(l,4)
-
516  & -f(li,1,k)*slon(l,4))
-
517  gn(ijk5)=gn(ijk5)+2*(f(lr,1,k)*clon(l,5)
-
518  & -f(li,1,k)*slon(l,5))
-
519  gn(ijk6)=gn(ijk6)+2*(f(lr,1,k)*clon(l,6)
-
520  & -f(li,1,k)*slon(l,6))
-
521  gn(ijk7)=gn(ijk7)+2*(f(lr,1,k)*clon(l,7)
-
522  & -f(li,1,k)*slon(l,7))
-
523  gn(ijk8)=gn(ijk8)+2*(f(lr,1,k)*clon(l,8)
-
524  & -f(li,1,k)*slon(l,8))
-
525  gs(ijk1)=gs(ijk1)+2*(f(lr,2,k)*clon(l,4)
-
526  & -f(li,2,k)*slon(l,4))
-
527  gs(ijk2)=gs(ijk2)+2*(f(lr,2,k)*clon(l,3)
-
528  & -f(li,2,k)*slon(l,3))
-
529  gs(ijk3)=gs(ijk3)+2*(f(lr,2,k)*clon(l,2)
-
530  & -f(li,2,k)*slon(l,2))
-
531  gs(ijk4)=gs(ijk4)+2*(f(lr,2,k)*clon(l,1)
-
532  & -f(li,2,k)*slon(l,1))
-
533  gs(ijk5)=gs(ijk5)+2*(f(lr,2,k)*clon(l,8)
-
534  & -f(li,2,k)*slon(l,8))
-
535  gs(ijk6)=gs(ijk6)+2*(f(lr,2,k)*clon(l,7)
-
536  & -f(li,2,k)*slon(l,7))
-
537  gs(ijk7)=gs(ijk7)+2*(f(lr,2,k)*clon(l,6)
-
538  & -f(li,2,k)*slon(l,6))
-
539  gs(ijk8)=gs(ijk8)+2*(f(lr,2,k)*clon(l,5)
-
540  & -f(li,2,k)*slon(l,5))
-
541  ENDDO
-
542  ENDDO
-
543  ENDIF
-
544  ENDDO
-
545  ENDDO
-
546 
-
547  END
-
subroutine splegend(I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
Definition: splegend.f:45
-
subroutine spsynth(I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
Definition: spsynth.f:39
-
subroutine sptgps(IROMB, MAXWV, KMAX, NPS, KWSKIP, KGSKIP, NISKIP, NJSKIP, TRUE, XMESH, ORIENT, WAVE, GN, GS)
This subprogram performs a spherical transform from spectral coefficients of scalar quantities to sca...
Definition: sptgps.f:81
-
subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
This subprogram gets wave-space constants.
Definition: spwget.f:18
+Go to the documentation of this file.
1C> @file
+
2C> @brief Transform spectral scalar to polar stereo.
+
3C>
+
4C> ### Program History Log
+
5C> Date | Programmer | Comments
+
6C> -----|------------|---------
+
7C> 96-02-29 | Iredell | Initial.
+
8C> 1998-12-15 | Iredell | Openmp directives inserted.
+
9C>
+
10C> @author Iredell @date 96-02-29
+
11
+
12C> This subprogram performs a spherical transform
+
13C> from spectral coefficients of scalar quantities
+
14C> to scalar fields on a pair of polar stereographic grids.
+
15C>
+
16C> The wave-space can be either triangular or rhomboidal.
+
17C>
+
18C> The wave and grid fields may have general indexing,
+
19C> but each wave field is in sequential 'IBM order',
+
20C> i.e. with zonal wavenumber as the slower index.
+
21C>
+
22C> The two square polar stereographic grids are centered
+
23C> on the respective poles, with the orientation longitude
+
24C> of the southern hemisphere grid 180 degrees opposite
+
25C> that of the northern hemisphere grid.
+
26C>
+
27C> The transform is made efficient
+
28C> by combining points in eight sectors
+
29C> of each polar stereographic grid,
+
30C> numbered as in the diagram below.
+
31C>
+
32C> The pole and the sector boundaries
+
33C> are treated specially in the code.
+
34C>
+
35C> Unfortunately, this approach induces
+
36C> some hairy indexing and code loquacity.
+
37C>
+
38C> <pre>
+
39C> \ 4 | 5 /
+
40C> \ | /
+
41C> 3 \ | / 6
+
42C> \|/
+
43C> ----+----
+
44C> /|\
+
45C> 2 / | \ 7
+
46C> / | \
+
47C> / 1 | 8 \
+
48C> </pre>
+
49C>
+
50C> The transforms are all multiprocessed over sector points.
+
51C>
+
52C> Transform several fields at a time to improve vectorization.
+
53C>
+
54C> Subprogram can be called from a multiprocessing environment.
+
55C>
+
56C> @param IROMB spectral domain shape
+
57C> (0 for triangular, 1 for rhomboidal)
+
58C> @param MAXWV spectral truncation
+
59C> @param KMAX number of fields to transform.
+
60C> @param NPS odd order of the polar stereographic grids.
+
61C> @param KWSKIP skip number between wave fields
+
62C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
+
63C> @param KGSKIP skip number between grid fields
+
64C> (defaults to NPS*NPS if KGSKIP=0)
+
65C> @param NISKIP skip number between grid i-points
+
66C> (defaults to 1 if NISKIP=0)
+
67C> @param NJSKIP skip number between grid j-points
+
68C> (defaults to NPS if NJSKIP=0)
+
69C> @param TRUE latitude at which ps grid is true (usually 60.)
+
70C> @param XMESH grid length at true latitude (m)
+
71C> @param ORIENT longitude at bottom of northern ps grid
+
72C> (southern ps grid will have opposite orientation.)
+
73C> @param WAVE wave fields
+
74C> @param GN northern polar stereographic fields
+
75C> @param GS southern polar stereographic fields
+
76C>
+
77C> @author Iredell @date 96-02-29
+
+
78 SUBROUTINE sptgps(IROMB,MAXWV,KMAX,NPS,
+
79 & KWSKIP,KGSKIP,NISKIP,NJSKIP,
+
80 & TRUE,XMESH,ORIENT,WAVE,GN,GS)
+
81
+
82 REAL WAVE(*),GN(*),GS(*)
+
83 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
+
84 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
85 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
86 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
+
87 INTEGER MP(KMAX)
+
88 REAL SLON(MAXWV,8),CLON(MAXWV,8),SROT(0:3),CROT(0:3)
+
89 REAL WTOP(2*(MAXWV+1),KMAX)
+
90 REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
+
91 REAL F(2*MAXWV+3,2,KMAX)
+
92 DATA srot/0.,1.,0.,-1./,crot/1.,0.,-1.,0./
+
93 parameter(rerth=6.3712e6)
+
94 parameter(pi=3.14159265358979,dpr=180./pi)
+
95
+
96C CALCULATE PRELIMINARY CONSTANTS
+
97 CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
+
98 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
99 mxtop=maxwv+1
+
100 idim=2*maxwv+3
+
101 kw=kwskip
+
102 kg=kgskip
+
103 ni=niskip
+
104 nj=njskip
+
105 IF(kw.EQ.0) kw=2*mx
+
106 IF(kg.EQ.0) kg=nps*nps
+
107 IF(ni.EQ.0) ni=1
+
108 IF(nj.EQ.0) nj=nps
+
109 mp=0
+
110 nph=(nps-1)/2
+
111 gq=((1.+sin(true/dpr))*rerth/xmesh)**2
+
112C$OMP PARALLEL DO
+
113 DO k=1,kmax
+
114 wtop(1:2*mxtop,k)=0
+
115 ENDDO
+
116
+
117C CALCULATE POLE POINT
+
118 i1=nph+1
+
119 j1=nph+1
+
120 ij1=(i1-1)*ni+(j1-1)*nj+1
+
121 slat1=1.
+
122 clat1=0.
+
123 CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
+
124 & pln,plntop)
+
125 CALL spsynth(iromb,maxwv,2*maxwv,idim,kw,2*mxtop,kmax,
+
126 & clat1,pln,plntop,mp,wave,wtop,f)
+
127CDIR$ IVDEP
+
128 DO k=1,kmax
+
129 ijk1=ij1+(k-1)*kg
+
130 gn(ijk1)=f(1,1,k)
+
131 gs(ijk1)=f(1,2,k)
+
132 ENDDO
+
133
+
134C CALCULATE POINTS ALONG THE ROW AND COLUMN OF THE POLE,
+
135C STARTING AT THE ORIENTATION LONGITUDE AND GOING CLOCKWISE.
+
136C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8)
+
137C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8)
+
138C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8)
+
139C$OMP& PRIVATE(DJ1,DI1,RQ,RADLON,RADLON1,RADLON2,SLAT1,CLAT1)
+
140C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,LR,LI)
+
141 DO j1=1,nph
+
142 i1=nph+1
+
143 radlon=orient/dpr
+
144 j3=nps+1-i1
+
145 i3=j1
+
146 j5=nps+1-j1
+
147 i5=nps+1-i1
+
148 j7=i1
+
149 i7=nps+1-j1
+
150 ij1=(i1-1)*ni+(j1-1)*nj+1
+
151 ij3=(i3-1)*ni+(j3-1)*nj+1
+
152 ij5=(i5-1)*ni+(j5-1)*nj+1
+
153 ij7=(i7-1)*ni+(j7-1)*nj+1
+
154 di1=i1-nph-1
+
155 dj1=j1-nph-1
+
156 rq=di1**2+dj1**2
+
157 slat1=(gq-rq)/(gq+rq)
+
158 clat1=sqrt(1.-slat1**2)
+
159 CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
+
160 & pln,plntop)
+
161 CALL spsynth(iromb,maxwv,2*maxwv,idim,kw,2*mxtop,kmax,
+
162 & clat1,pln,plntop,mp,wave,wtop,f)
+
163 DO l=1,maxwv
+
164 slon(l,1)=sin(l*radlon)
+
165 clon(l,1)=cos(l*radlon)
+
166 slon(l,3)=slon(l,1)*crot(mod(1*l,4))
+
167 & -clon(l,1)*srot(mod(1*l,4))
+
168 clon(l,3)=clon(l,1)*crot(mod(1*l,4))
+
169 & +slon(l,1)*srot(mod(1*l,4))
+
170 slon(l,5)=slon(l,1)*crot(mod(2*l,4))
+
171 & -clon(l,1)*srot(mod(2*l,4))
+
172 clon(l,5)=clon(l,1)*crot(mod(2*l,4))
+
173 & +slon(l,1)*srot(mod(2*l,4))
+
174 slon(l,7)=slon(l,1)*crot(mod(3*l,4))
+
175 & -clon(l,1)*srot(mod(3*l,4))
+
176 clon(l,7)=clon(l,1)*crot(mod(3*l,4))
+
177 & +slon(l,1)*srot(mod(3*l,4))
+
178 ENDDO
+
179CDIR$ IVDEP
+
180 DO k=1,kmax
+
181 ijk1=ij1+(k-1)*kg
+
182 ijk3=ij3+(k-1)*kg
+
183 ijk5=ij5+(k-1)*kg
+
184 ijk7=ij7+(k-1)*kg
+
185 gn(ijk1)=f(1,1,k)
+
186 gn(ijk3)=f(1,1,k)
+
187 gn(ijk5)=f(1,1,k)
+
188 gn(ijk7)=f(1,1,k)
+
189 gs(ijk1)=f(1,2,k)
+
190 gs(ijk3)=f(1,2,k)
+
191 gs(ijk5)=f(1,2,k)
+
192 gs(ijk7)=f(1,2,k)
+
193 ENDDO
+
194 IF(kmax.EQ.1) THEN
+
195 DO l=1,maxwv
+
196 lr=2*l+1
+
197 li=2*l+2
+
198 gn(ij1)=gn(ij1)+2*(f(lr,1,1)*clon(l,1)
+
199 & -f(li,1,1)*slon(l,1))
+
200 gn(ij3)=gn(ij3)+2*(f(lr,1,1)*clon(l,3)
+
201 & -f(li,1,1)*slon(l,3))
+
202 gn(ij5)=gn(ij5)+2*(f(lr,1,1)*clon(l,5)
+
203 & -f(li,1,1)*slon(l,5))
+
204 gn(ij7)=gn(ij7)+2*(f(lr,1,1)*clon(l,7)
+
205 & -f(li,1,1)*slon(l,7))
+
206 gs(ij1)=gs(ij1)+2*(f(lr,2,1)*clon(l,5)
+
207 & -f(li,2,1)*slon(l,5))
+
208 gs(ij3)=gs(ij3)+2*(f(lr,2,1)*clon(l,3)
+
209 & -f(li,2,1)*slon(l,3))
+
210 gs(ij5)=gs(ij5)+2*(f(lr,2,1)*clon(l,1)
+
211 & -f(li,2,1)*slon(l,1))
+
212 gs(ij7)=gs(ij7)+2*(f(lr,2,1)*clon(l,7)
+
213 & -f(li,2,1)*slon(l,7))
+
214 ENDDO
+
215 ELSE
+
216 DO l=1,maxwv
+
217 lr=2*l+1
+
218 li=2*l+2
+
219CDIR$ IVDEP
+
220 DO k=1,kmax
+
221 ijk1=ij1+(k-1)*kg
+
222 ijk3=ij3+(k-1)*kg
+
223 ijk5=ij5+(k-1)*kg
+
224 ijk7=ij7+(k-1)*kg
+
225 gn(ijk1)=gn(ijk1)+2*(f(lr,1,k)*clon(l,1)
+
226 & -f(li,1,k)*slon(l,1))
+
227 gn(ijk3)=gn(ijk3)+2*(f(lr,1,k)*clon(l,3)
+
228 & -f(li,1,k)*slon(l,3))
+
229 gn(ijk5)=gn(ijk5)+2*(f(lr,1,k)*clon(l,5)
+
230 & -f(li,1,k)*slon(l,5))
+
231 gn(ijk7)=gn(ijk7)+2*(f(lr,1,k)*clon(l,7)
+
232 & -f(li,1,k)*slon(l,7))
+
233 gs(ijk1)=gs(ijk1)+2*(f(lr,2,k)*clon(l,5)
+
234 & -f(li,2,k)*slon(l,5))
+
235 gs(ijk3)=gs(ijk3)+2*(f(lr,2,k)*clon(l,3)
+
236 & -f(li,2,k)*slon(l,3))
+
237 gs(ijk5)=gs(ijk5)+2*(f(lr,2,k)*clon(l,1)
+
238 & -f(li,2,k)*slon(l,1))
+
239 gs(ijk7)=gs(ijk7)+2*(f(lr,2,k)*clon(l,7)
+
240 & -f(li,2,k)*slon(l,7))
+
241 ENDDO
+
242 ENDDO
+
243 ENDIF
+
244 ENDDO
+
245
+
246C CALCULATE POINTS ON THE MAIN DIAGONALS THROUGH THE POLE,
+
247C STARTING CLOCKWISE OF THE ORIENTATION LONGITUDE AND GOING CLOCKWISE.
+
248C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8)
+
249C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8)
+
250C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8)
+
251C$OMP& PRIVATE(DJ1,DI1,RQ,RADLON,RADLON1,RADLON2,SLAT1,CLAT1)
+
252C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,LR,LI)
+
253 DO j1=1,nph
+
254 i1=j1
+
255 radlon=(orient-45)/dpr
+
256 j3=nps+1-i1
+
257 i3=j1
+
258 j5=nps+1-j1
+
259 i5=nps+1-i1
+
260 j7=i1
+
261 i7=nps+1-j1
+
262 ij1=(i1-1)*ni+(j1-1)*nj+1
+
263 ij3=(i3-1)*ni+(j3-1)*nj+1
+
264 ij5=(i5-1)*ni+(j5-1)*nj+1
+
265 ij7=(i7-1)*ni+(j7-1)*nj+1
+
266 di1=i1-nph-1
+
267 dj1=j1-nph-1
+
268 rq=di1**2+dj1**2
+
269 slat1=(gq-rq)/(gq+rq)
+
270 clat1=sqrt(1.-slat1**2)
+
271 CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
+
272 & pln,plntop)
+
273 CALL spsynth(iromb,maxwv,2*maxwv,idim,kw,2*mxtop,kmax,
+
274 & clat1,pln,plntop,mp,wave,wtop,f)
+
275 DO l=1,maxwv
+
276 slon(l,1)=sin(l*radlon)
+
277 clon(l,1)=cos(l*radlon)
+
278 slon(l,3)=slon(l,1)*crot(mod(1*l,4))
+
279 & -clon(l,1)*srot(mod(1*l,4))
+
280 clon(l,3)=clon(l,1)*crot(mod(1*l,4))
+
281 & +slon(l,1)*srot(mod(1*l,4))
+
282 slon(l,5)=slon(l,1)*crot(mod(2*l,4))
+
283 & -clon(l,1)*srot(mod(2*l,4))
+
284 clon(l,5)=clon(l,1)*crot(mod(2*l,4))
+
285 & +slon(l,1)*srot(mod(2*l,4))
+
286 slon(l,7)=slon(l,1)*crot(mod(3*l,4))
+
287 & -clon(l,1)*srot(mod(3*l,4))
+
288 clon(l,7)=clon(l,1)*crot(mod(3*l,4))
+
289 & +slon(l,1)*srot(mod(3*l,4))
+
290 ENDDO
+
291CDIR$ IVDEP
+
292 DO k=1,kmax
+
293 ijk1=ij1+(k-1)*kg
+
294 ijk3=ij3+(k-1)*kg
+
295 ijk5=ij5+(k-1)*kg
+
296 ijk7=ij7+(k-1)*kg
+
297 gn(ijk1)=f(1,1,k)
+
298 gn(ijk3)=f(1,1,k)
+
299 gn(ijk5)=f(1,1,k)
+
300 gn(ijk7)=f(1,1,k)
+
301 gs(ijk1)=f(1,2,k)
+
302 gs(ijk3)=f(1,2,k)
+
303 gs(ijk5)=f(1,2,k)
+
304 gs(ijk7)=f(1,2,k)
+
305 ENDDO
+
306 IF(kmax.EQ.1) THEN
+
307 DO l=1,maxwv
+
308 lr=2*l+1
+
309 li=2*l+2
+
310 gn(ij1)=gn(ij1)+2*(f(lr,1,1)*clon(l,1)
+
311 & -f(li,1,1)*slon(l,1))
+
312 gn(ij3)=gn(ij3)+2*(f(lr,1,1)*clon(l,3)
+
313 & -f(li,1,1)*slon(l,3))
+
314 gn(ij5)=gn(ij5)+2*(f(lr,1,1)*clon(l,5)
+
315 & -f(li,1,1)*slon(l,5))
+
316 gn(ij7)=gn(ij7)+2*(f(lr,1,1)*clon(l,7)
+
317 & -f(li,1,1)*slon(l,7))
+
318 gs(ij1)=gs(ij1)+2*(f(lr,2,1)*clon(l,3)
+
319 & -f(li,2,1)*slon(l,3))
+
320 gs(ij3)=gs(ij3)+2*(f(lr,2,1)*clon(l,1)
+
321 & -f(li,2,1)*slon(l,1))
+
322 gs(ij5)=gs(ij5)+2*(f(lr,2,1)*clon(l,7)
+
323 & -f(li,2,1)*slon(l,7))
+
324 gs(ij7)=gs(ij7)+2*(f(lr,2,1)*clon(l,5)
+
325 & -f(li,2,1)*slon(l,5))
+
326 ENDDO
+
327 ELSE
+
328 DO l=1,maxwv
+
329 lr=2*l+1
+
330 li=2*l+2
+
331CDIR$ IVDEP
+
332 DO k=1,kmax
+
333 ijk1=ij1+(k-1)*kg
+
334 ijk3=ij3+(k-1)*kg
+
335 ijk5=ij5+(k-1)*kg
+
336 ijk7=ij7+(k-1)*kg
+
337 gn(ijk1)=gn(ijk1)+2*(f(lr,1,k)*clon(l,1)
+
338 & -f(li,1,k)*slon(l,1))
+
339 gn(ijk3)=gn(ijk3)+2*(f(lr,1,k)*clon(l,3)
+
340 & -f(li,1,k)*slon(l,3))
+
341 gn(ijk5)=gn(ijk5)+2*(f(lr,1,k)*clon(l,5)
+
342 & -f(li,1,k)*slon(l,5))
+
343 gn(ijk7)=gn(ijk7)+2*(f(lr,1,k)*clon(l,7)
+
344 & -f(li,1,k)*slon(l,7))
+
345 gs(ijk1)=gs(ijk1)+2*(f(lr,2,k)*clon(l,3)
+
346 & -f(li,2,k)*slon(l,3))
+
347 gs(ijk3)=gs(ijk3)+2*(f(lr,2,k)*clon(l,1)
+
348 & -f(li,2,k)*slon(l,1))
+
349 gs(ijk5)=gs(ijk5)+2*(f(lr,2,k)*clon(l,7)
+
350 & -f(li,2,k)*slon(l,7))
+
351 gs(ijk7)=gs(ijk7)+2*(f(lr,2,k)*clon(l,5)
+
352 & -f(li,2,k)*slon(l,5))
+
353 ENDDO
+
354 ENDDO
+
355 ENDIF
+
356 ENDDO
+
357
+
358C CALCULATE THE REMAINDER OF THE POLAR STEREOGRAPHIC DOMAIN,
+
359C STARTING AT THE SECTOR JUST CLOCKWISE OF THE ORIENTATION LONGITUDE
+
360C AND GOING CLOCKWISE UNTIL ALL EIGHT SECTORS ARE DONE.
+
361C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8)
+
362C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8)
+
363C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8)
+
364C$OMP& PRIVATE(DJ1,DI1,RQ,RADLON,RADLON1,RADLON2,SLAT1,CLAT1)
+
365C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,LR,LI)
+
366 DO j1=1,nph-1
+
367 DO i1=j1+1,nph
+
368 j2=i1
+
369 i2=j1
+
370 j3=nps+1-i1
+
371 i3=j1
+
372 j4=nps+1-j1
+
373 i4=i1
+
374 j5=nps+1-j1
+
375 i5=nps+1-i1
+
376 j6=nps+1-i1
+
377 i6=nps+1-j1
+
378 j7=i1
+
379 i7=nps+1-j1
+
380 j8=j1
+
381 i8=nps+1-i1
+
382 ij1=(i1-1)*ni+(j1-1)*nj+1
+
383 ij2=(i2-1)*ni+(j2-1)*nj+1
+
384 ij3=(i3-1)*ni+(j3-1)*nj+1
+
385 ij4=(i4-1)*ni+(j4-1)*nj+1
+
386 ij5=(i5-1)*ni+(j5-1)*nj+1
+
387 ij6=(i6-1)*ni+(j6-1)*nj+1
+
388 ij7=(i7-1)*ni+(j7-1)*nj+1
+
389 ij8=(i8-1)*ni+(j8-1)*nj+1
+
390 di1=i1-nph-1
+
391 dj1=j1-nph-1
+
392 rq=di1**2+dj1**2
+
393 slat1=(gq-rq)/(gq+rq)
+
394 clat1=sqrt(1.-slat1**2)
+
395 radlon1=orient/dpr+atan(-di1/dj1)
+
396 radlon2=(orient-45)/dpr*2-radlon1
+
397 CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
+
398 & pln,plntop)
+
399 CALL spsynth(iromb,maxwv,2*maxwv,idim,kw,2*mxtop,kmax,
+
400 & clat1,pln,plntop,mp,wave,wtop,f)
+
401 DO l=1,maxwv
+
402 slon(l,1)=sin(l*radlon1)
+
403 clon(l,1)=cos(l*radlon1)
+
404 slon(l,2)=sin(l*radlon2)
+
405 clon(l,2)=cos(l*radlon2)
+
406 slon(l,3)=slon(l,1)*crot(mod(1*l,4))
+
407 & -clon(l,1)*srot(mod(1*l,4))
+
408 clon(l,3)=clon(l,1)*crot(mod(1*l,4))
+
409 & +slon(l,1)*srot(mod(1*l,4))
+
410 slon(l,4)=slon(l,2)*crot(mod(1*l,4))
+
411 & -clon(l,2)*srot(mod(1*l,4))
+
412 clon(l,4)=clon(l,2)*crot(mod(1*l,4))
+
413 & +slon(l,2)*srot(mod(1*l,4))
+
414 slon(l,5)=slon(l,1)*crot(mod(2*l,4))
+
415 & -clon(l,1)*srot(mod(2*l,4))
+
416 clon(l,5)=clon(l,1)*crot(mod(2*l,4))
+
417 & +slon(l,1)*srot(mod(2*l,4))
+
418 slon(l,6)=slon(l,2)*crot(mod(2*l,4))
+
419 & -clon(l,2)*srot(mod(2*l,4))
+
420 clon(l,6)=clon(l,2)*crot(mod(2*l,4))
+
421 & +slon(l,2)*srot(mod(2*l,4))
+
422 slon(l,7)=slon(l,1)*crot(mod(3*l,4))
+
423 & -clon(l,1)*srot(mod(3*l,4))
+
424 clon(l,7)=clon(l,1)*crot(mod(3*l,4))
+
425 & +slon(l,1)*srot(mod(3*l,4))
+
426 slon(l,8)=slon(l,2)*crot(mod(3*l,4))
+
427 & -clon(l,2)*srot(mod(3*l,4))
+
428 clon(l,8)=clon(l,2)*crot(mod(3*l,4))
+
429 & +slon(l,2)*srot(mod(3*l,4))
+
430 ENDDO
+
431CDIR$ IVDEP
+
432 DO k=1,kmax
+
433 ijk1=ij1+(k-1)*kg
+
434 ijk2=ij2+(k-1)*kg
+
435 ijk3=ij3+(k-1)*kg
+
436 ijk4=ij4+(k-1)*kg
+
437 ijk5=ij5+(k-1)*kg
+
438 ijk6=ij6+(k-1)*kg
+
439 ijk7=ij7+(k-1)*kg
+
440 ijk8=ij8+(k-1)*kg
+
441 gn(ijk1)=f(1,1,k)
+
442 gn(ijk2)=f(1,1,k)
+
443 gn(ijk3)=f(1,1,k)
+
444 gn(ijk4)=f(1,1,k)
+
445 gn(ijk5)=f(1,1,k)
+
446 gn(ijk6)=f(1,1,k)
+
447 gn(ijk7)=f(1,1,k)
+
448 gn(ijk8)=f(1,1,k)
+
449 gs(ijk1)=f(1,2,k)
+
450 gs(ijk2)=f(1,2,k)
+
451 gs(ijk3)=f(1,2,k)
+
452 gs(ijk4)=f(1,2,k)
+
453 gs(ijk5)=f(1,2,k)
+
454 gs(ijk6)=f(1,2,k)
+
455 gs(ijk7)=f(1,2,k)
+
456 gs(ijk8)=f(1,2,k)
+
457 ENDDO
+
458 IF(kmax.EQ.1) THEN
+
459 DO l=1,maxwv
+
460 lr=2*l+1
+
461 li=2*l+2
+
462 gn(ij1)=gn(ij1)+2*(f(lr,1,1)*clon(l,1)
+
463 & -f(li,1,1)*slon(l,1))
+
464 gn(ij2)=gn(ij2)+2*(f(lr,1,1)*clon(l,2)
+
465 & -f(li,1,1)*slon(l,2))
+
466 gn(ij3)=gn(ij3)+2*(f(lr,1,1)*clon(l,3)
+
467 & -f(li,1,1)*slon(l,3))
+
468 gn(ij4)=gn(ij4)+2*(f(lr,1,1)*clon(l,4)
+
469 & -f(li,1,1)*slon(l,4))
+
470 gn(ij5)=gn(ij5)+2*(f(lr,1,1)*clon(l,5)
+
471 & -f(li,1,1)*slon(l,5))
+
472 gn(ij6)=gn(ij6)+2*(f(lr,1,1)*clon(l,6)
+
473 & -f(li,1,1)*slon(l,6))
+
474 gn(ij7)=gn(ij7)+2*(f(lr,1,1)*clon(l,7)
+
475 & -f(li,1,1)*slon(l,7))
+
476 gn(ij8)=gn(ij8)+2*(f(lr,1,1)*clon(l,8)
+
477 & -f(li,1,1)*slon(l,8))
+
478 gs(ij1)=gs(ij1)+2*(f(lr,2,1)*clon(l,4)
+
479 & -f(li,2,1)*slon(l,4))
+
480 gs(ij2)=gs(ij2)+2*(f(lr,2,1)*clon(l,3)
+
481 & -f(li,2,1)*slon(l,3))
+
482 gs(ij3)=gs(ij3)+2*(f(lr,2,1)*clon(l,2)
+
483 & -f(li,2,1)*slon(l,2))
+
484 gs(ij4)=gs(ij4)+2*(f(lr,2,1)*clon(l,1)
+
485 & -f(li,2,1)*slon(l,1))
+
486 gs(ij5)=gs(ij5)+2*(f(lr,2,1)*clon(l,8)
+
487 & -f(li,2,1)*slon(l,8))
+
488 gs(ij6)=gs(ij6)+2*(f(lr,2,1)*clon(l,7)
+
489 & -f(li,2,1)*slon(l,7))
+
490 gs(ij7)=gs(ij7)+2*(f(lr,2,1)*clon(l,6)
+
491 & -f(li,2,1)*slon(l,6))
+
492 gs(ij8)=gs(ij8)+2*(f(lr,2,1)*clon(l,5)
+
493 & -f(li,2,1)*slon(l,5))
+
494 ENDDO
+
495 ELSE
+
496 DO l=1,maxwv
+
497 lr=2*l+1
+
498 li=2*l+2
+
499CDIR$ IVDEP
+
500 DO k=1,kmax
+
501 ijk1=ij1+(k-1)*kg
+
502 ijk2=ij2+(k-1)*kg
+
503 ijk3=ij3+(k-1)*kg
+
504 ijk4=ij4+(k-1)*kg
+
505 ijk5=ij5+(k-1)*kg
+
506 ijk6=ij6+(k-1)*kg
+
507 ijk7=ij7+(k-1)*kg
+
508 ijk8=ij8+(k-1)*kg
+
509 gn(ijk1)=gn(ijk1)+2*(f(lr,1,k)*clon(l,1)
+
510 & -f(li,1,k)*slon(l,1))
+
511 gn(ijk2)=gn(ijk2)+2*(f(lr,1,k)*clon(l,2)
+
512 & -f(li,1,k)*slon(l,2))
+
513 gn(ijk3)=gn(ijk3)+2*(f(lr,1,k)*clon(l,3)
+
514 & -f(li,1,k)*slon(l,3))
+
515 gn(ijk4)=gn(ijk4)+2*(f(lr,1,k)*clon(l,4)
+
516 & -f(li,1,k)*slon(l,4))
+
517 gn(ijk5)=gn(ijk5)+2*(f(lr,1,k)*clon(l,5)
+
518 & -f(li,1,k)*slon(l,5))
+
519 gn(ijk6)=gn(ijk6)+2*(f(lr,1,k)*clon(l,6)
+
520 & -f(li,1,k)*slon(l,6))
+
521 gn(ijk7)=gn(ijk7)+2*(f(lr,1,k)*clon(l,7)
+
522 & -f(li,1,k)*slon(l,7))
+
523 gn(ijk8)=gn(ijk8)+2*(f(lr,1,k)*clon(l,8)
+
524 & -f(li,1,k)*slon(l,8))
+
525 gs(ijk1)=gs(ijk1)+2*(f(lr,2,k)*clon(l,4)
+
526 & -f(li,2,k)*slon(l,4))
+
527 gs(ijk2)=gs(ijk2)+2*(f(lr,2,k)*clon(l,3)
+
528 & -f(li,2,k)*slon(l,3))
+
529 gs(ijk3)=gs(ijk3)+2*(f(lr,2,k)*clon(l,2)
+
530 & -f(li,2,k)*slon(l,2))
+
531 gs(ijk4)=gs(ijk4)+2*(f(lr,2,k)*clon(l,1)
+
532 & -f(li,2,k)*slon(l,1))
+
533 gs(ijk5)=gs(ijk5)+2*(f(lr,2,k)*clon(l,8)
+
534 & -f(li,2,k)*slon(l,8))
+
535 gs(ijk6)=gs(ijk6)+2*(f(lr,2,k)*clon(l,7)
+
536 & -f(li,2,k)*slon(l,7))
+
537 gs(ijk7)=gs(ijk7)+2*(f(lr,2,k)*clon(l,6)
+
538 & -f(li,2,k)*slon(l,6))
+
539 gs(ijk8)=gs(ijk8)+2*(f(lr,2,k)*clon(l,5)
+
540 & -f(li,2,k)*slon(l,5))
+
541 ENDDO
+
542 ENDDO
+
543 ENDIF
+
544 ENDDO
+
545 ENDDO
+
546
+
+
547 END
+
subroutine splegend(i, m, slat, clat, eps, epstop, pln, plntop)
Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
Definition splegend.f:45
+
subroutine spsynth(i, m, im, ix, nc, nctop, km, clat, pln, plntop, mp, spc, spctop, f)
Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
Definition spsynth.f:39
+
subroutine sptgps(iromb, maxwv, kmax, nps, kwskip, kgskip, niskip, njskip, true, xmesh, orient, wave, gn, gs)
This subprogram performs a spherical transform from spectral coefficients of scalar quantities to sca...
Definition sptgps.f:81
+
subroutine spwget(iromb, maxwv, eps, epstop, enn1, elonn1, eon, eontop)
This subprogram gets wave-space constants.
Definition spwget.f:18
diff --git a/sptgpsd_8f.html b/sptgpsd_8f.html index 951e05dd..8c7fb39e 100644 --- a/sptgpsd_8f.html +++ b/sptgpsd_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgpsd.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgpsd.f File Reference
+
sptgpsd.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptgpsd (IROMB, MAXWV, KMAX, NPS, KWSKIP, KGSKIP, NISKIP, NJSKIP, TRUE, XMESH, ORIENT, WAVE, XN, YN, XS, YS)
 This subprogram performs a spherical transform from spectral coefficients of scalar fields to gradient fields on a pair of polar stereographic grids. More...
 
subroutine sptgpsd (iromb, maxwv, kmax, nps, kwskip, kgskip, niskip, njskip, true, xmesh, orient, wave, xn, yn, xs, ys)
 This subprogram performs a spherical transform from spectral coefficients of scalar fields to gradient fields on a pair of polar stereographic grids.
 

Detailed Description

Transform spectral to polar stereographic gradients.

@@ -117,8 +123,8 @@

Definition in file sptgpsd.f.

Function/Subroutine Documentation

- -

◆ sptgpsd()

+ +

◆ sptgpsd()

diff --git a/sptgpsd_8f.js b/sptgpsd_8f.js index 1b5e1ff3..8aa0c7e3 100644 --- a/sptgpsd_8f.js +++ b/sptgpsd_8f.js @@ -1,4 +1,4 @@ var sptgpsd_8f = [ - [ "sptgpsd", "sptgpsd_8f.html#ad6d10c3360c47558a8116b2f5666ed30", null ] + [ "sptgpsd", "sptgpsd_8f.html#afac272664e9946be76b9803c0663bb61", null ] ]; \ No newline at end of file diff --git a/sptgpsd_8f_source.html b/sptgpsd_8f_source.html index 75c49195..1e2a56d6 100644 --- a/sptgpsd_8f_source.html +++ b/sptgpsd_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgpsd.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,127 +81,135 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgpsd.f
+
sptgpsd.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Transform spectral to polar stereographic gradients
-
3 C> ### Program history log:
-
4 C> Date | Programmer | Comments
-
5 C> -----|------------|----------
-
6 C> 96-02-29 | IREDELL | Initial.
-
7 C> 1998-12-15 | IREDELL | OpenMP directives inserted.
-
8 C> @author IREDELL @date 96-02-29
-
9 
-
10 C> This subprogram performs a spherical transform
-
11 C> from spectral coefficients of scalar fields
-
12 C> to gradient fields on a pair of polar stereographic grids.
-
13 C> The wave-space can be either triangular or rhomboidal.
-
14 C> The wave and grid fields may have general indexing,
-
15 C> but each wave field is in sequential 'ibm order',
-
16 C> i.e., with zonal wavenumber as the slower index.
-
17 C> The two square polar stereographic grids are centered
-
18 C> on the respective poles, with the orientation longitude
-
19 C> of the southern hemisphere grid 180 degrees opposite
-
20 C> that of the northern hemisphere grid.
-
21 C> The vectors are automatically rotated to be resolved
-
22 C> relative to the respective polar stereographic grids.
-
23 C>
-
24 C> The transform is made efficient by combining points in eight
-
25 C> sectors of each polar stereographic grid, numbered as in the
-
26 C> following diagram. The pole and the sector boundaries are
-
27 C> treated specially in the code. Unfortunately, this approach
-
28 C> induces some hairy indexing and code loquacity, for which
-
29 C> the developer apologizes.
-
30 C>
-
31 C> \verbatim
-
32 C> \ 4 | 5 /
-
33 C> \ | /
-
34 C> 3 \ | / 6
-
35 C> \|/
-
36 C> ----+----
-
37 C> /|\
-
38 C> 2 / | \ 7
-
39 C> / | \
-
40 C> / 1 | 8 \
-
41 C> \endverbatim
-
42 C>
-
43 C> The transforms are all multiprocessed over sector points.
-
44 C> transform several fields at a time to improve vectorization.
-
45 C> Subprogram can be called from a multiprocessing environment.
-
46 C>
-
47 C> @param IROMB Spectral domain shape
-
48 C> (0 for triangular, 1 for rhomboidal)
-
49 C> @param MAXWV Spectral truncation
-
50 C> @param KMAX Number of fields to transform
-
51 C> @param NPS Odd order of the polar stereographic grids
-
52 C> @param KWSKIP Skip number between wave fields
-
53 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
-
54 C> @param KGSKIP Skip number between grid fields
-
55 C> (defaults to NPS*NPS if KGSKIP=0)
-
56 C> @param NISKIP Skip number between grid i-points
-
57 C> (defaults to 1 if NISKIP=0)
-
58 C> @param NJSKIP Skip number between grid j-points
-
59 C> (defaults to NPS if NJSKIP=0)
-
60 C> @param TRUE Latitude at which PS grid is true (usually 60.)
-
61 C> @param XMESH Grid length at true latitude (M)
-
62 C> @param ORIENT Longitude at bottom of northern PS grid
-
63 C> (southern PS grid will have opposite orientation.)
-
64 C> @param WAVE Wave fields
-
65 C> @param XN Northern polar stereographic x-gradients
-
66 C> @param YN Northern polar stereographic y-gradients
-
67 C> @param XS Southern polar stereographic x-gradients
-
68 C> @param YS Southern polar stereographic y-gradients
-
69 C>
-
70 C> @author IREDELL @date 96-02-29
-
71  SUBROUTINE sptgpsd(IROMB,MAXWV,KMAX,NPS,
-
72  & KWSKIP,KGSKIP,NISKIP,NJSKIP,
-
73  & TRUE,XMESH,ORIENT,WAVE,XN,YN,XS,YS)
-
74 
-
75  REAL WAVE(*),XN(*),YN(*),XS(*),YS(*)
-
76  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
-
77  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
78  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
79  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
-
80  REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
-
81  REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
-
82 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
83 C CALCULATE PRELIMINARY CONSTANTS
-
84  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
-
85  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
86  mdim=2*mx+1
-
87  kw=kwskip
-
88  IF(kw.EQ.0) kw=2*mx
-
89 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
90 C CALCULATE GRADIENTS
-
91 C$OMP PARALLEL DO PRIVATE(KWS)
-
92  DO k=1,kmax
-
93  kws=(k-1)*kw
-
94  CALL splaplac(iromb,maxwv,enn1,wave(kws+1),wd(1,k),1)
-
95  wz(1:2*mx,k)=0.
-
96  ENDDO
-
97  CALL sptgpsv(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
-
98  & true,xmesh,orient,wd,wz,xn,yn,xs,ys)
-
99 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
100  END
-
subroutine splaplac(I, M, ENN1, Q, QD2, IDIR)
Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
Definition: splaplac.f:25
-
subroutine sptgpsd(IROMB, MAXWV, KMAX, NPS, KWSKIP, KGSKIP, NISKIP, NJSKIP, TRUE, XMESH, ORIENT, WAVE, XN, YN, XS, YS)
This subprogram performs a spherical transform from spectral coefficients of scalar fields to gradien...
Definition: sptgpsd.f:74
-
subroutine sptgpsv(IROMB, MAXWV, KMAX, NPS, KWSKIP, KGSKIP, NISKIP, NJSKIP, TRUE, XMESH, ORIENT, WAVED, WAVEZ, UN, VN, US, VS)
This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
Definition: sptgpsv.f:83
-
subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
This subprogram gets wave-space constants.
Definition: spwget.f:18
+Go to the documentation of this file.
1C> @file
+
2C> @brief Transform spectral to polar stereographic gradients
+
3C> ### Program history log:
+
4C> Date | Programmer | Comments
+
5C> -----|------------|----------
+
6C> 96-02-29 | IREDELL | Initial.
+
7C> 1998-12-15 | IREDELL | OpenMP directives inserted.
+
8C> @author IREDELL @date 96-02-29
+
9
+
10C> This subprogram performs a spherical transform
+
11C> from spectral coefficients of scalar fields
+
12C> to gradient fields on a pair of polar stereographic grids.
+
13C> The wave-space can be either triangular or rhomboidal.
+
14C> The wave and grid fields may have general indexing,
+
15C> but each wave field is in sequential 'ibm order',
+
16C> i.e., with zonal wavenumber as the slower index.
+
17C> The two square polar stereographic grids are centered
+
18C> on the respective poles, with the orientation longitude
+
19C> of the southern hemisphere grid 180 degrees opposite
+
20C> that of the northern hemisphere grid.
+
21C> The vectors are automatically rotated to be resolved
+
22C> relative to the respective polar stereographic grids.
+
23C>
+
24C> The transform is made efficient by combining points in eight
+
25C> sectors of each polar stereographic grid, numbered as in the
+
26C> following diagram. The pole and the sector boundaries are
+
27C> treated specially in the code. Unfortunately, this approach
+
28C> induces some hairy indexing and code loquacity, for which
+
29C> the developer apologizes.
+
30C>
+
31C> \verbatim
+
32C> \ 4 | 5 /
+
33C> \ | /
+
34C> 3 \ | / 6
+
35C> \|/
+
36C> ----+----
+
37C> /|\
+
38C> 2 / | \ 7
+
39C> / | \
+
40C> / 1 | 8 \
+
41C> \endverbatim
+
42C>
+
43C> The transforms are all multiprocessed over sector points.
+
44C> transform several fields at a time to improve vectorization.
+
45C> Subprogram can be called from a multiprocessing environment.
+
46C>
+
47C> @param IROMB Spectral domain shape
+
48C> (0 for triangular, 1 for rhomboidal)
+
49C> @param MAXWV Spectral truncation
+
50C> @param KMAX Number of fields to transform
+
51C> @param NPS Odd order of the polar stereographic grids
+
52C> @param KWSKIP Skip number between wave fields
+
53C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
+
54C> @param KGSKIP Skip number between grid fields
+
55C> (defaults to NPS*NPS if KGSKIP=0)
+
56C> @param NISKIP Skip number between grid i-points
+
57C> (defaults to 1 if NISKIP=0)
+
58C> @param NJSKIP Skip number between grid j-points
+
59C> (defaults to NPS if NJSKIP=0)
+
60C> @param TRUE Latitude at which PS grid is true (usually 60.)
+
61C> @param XMESH Grid length at true latitude (M)
+
62C> @param ORIENT Longitude at bottom of northern PS grid
+
63C> (southern PS grid will have opposite orientation.)
+
64C> @param WAVE Wave fields
+
65C> @param XN Northern polar stereographic x-gradients
+
66C> @param YN Northern polar stereographic y-gradients
+
67C> @param XS Southern polar stereographic x-gradients
+
68C> @param YS Southern polar stereographic y-gradients
+
69C>
+
70C> @author IREDELL @date 96-02-29
+
+
71 SUBROUTINE sptgpsd(IROMB,MAXWV,KMAX,NPS,
+
72 & KWSKIP,KGSKIP,NISKIP,NJSKIP,
+
73 & TRUE,XMESH,ORIENT,WAVE,XN,YN,XS,YS)
+
74
+
75 REAL WAVE(*),XN(*),YN(*),XS(*),YS(*)
+
76 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
+
77 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
78 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
79 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
+
80 REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
+
81 REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
+
82C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
83C CALCULATE PRELIMINARY CONSTANTS
+
84 CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
+
85 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
86 mdim=2*mx+1
+
87 kw=kwskip
+
88 IF(kw.EQ.0) kw=2*mx
+
89C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
90C CALCULATE GRADIENTS
+
91C$OMP PARALLEL DO PRIVATE(KWS)
+
92 DO k=1,kmax
+
93 kws=(k-1)*kw
+
94 CALL splaplac(iromb,maxwv,enn1,wave(kws+1),wd(1,k),1)
+
95 wz(1:2*mx,k)=0.
+
96 ENDDO
+
97 CALL sptgpsv(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
+
98 & true,xmesh,orient,wd,wz,xn,yn,xs,ys)
+
99C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+
100 END
+
subroutine splaplac(i, m, enn1, q, qd2, idir)
Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
Definition splaplac.f:25
+
subroutine sptgpsd(iromb, maxwv, kmax, nps, kwskip, kgskip, niskip, njskip, true, xmesh, orient, wave, xn, yn, xs, ys)
This subprogram performs a spherical transform from spectral coefficients of scalar fields to gradien...
Definition sptgpsd.f:74
+
subroutine sptgpsv(iromb, maxwv, kmax, nps, kwskip, kgskip, niskip, njskip, true, xmesh, orient, waved, wavez, un, vn, us, vs)
This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
Definition sptgpsv.f:83
+
subroutine spwget(iromb, maxwv, eps, epstop, enn1, elonn1, eon, eontop)
This subprogram gets wave-space constants.
Definition spwget.f:18
diff --git a/sptgpsv_8f.html b/sptgpsv_8f.html index fdcaf59b..1ce7e06d 100644 --- a/sptgpsv_8f.html +++ b/sptgpsv_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgpsv.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgpsv.f File Reference
+
sptgpsv.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptgpsv (IROMB, MAXWV, KMAX, NPS, KWSKIP, KGSKIP, NISKIP, NJSKIP, TRUE, XMESH, ORIENT, WAVED, WAVEZ, UN, VN, US, VS)
 This subprogram performs a spherical transform from spectral coefficients of divergences and curls to vector fields on a pair of polar stereographic grids. More...
 
subroutine sptgpsv (iromb, maxwv, kmax, nps, kwskip, kgskip, niskip, njskip, true, xmesh, orient, waved, wavez, un, vn, us, vs)
 This subprogram performs a spherical transform from spectral coefficients of divergences and curls to vector fields on a pair of polar stereographic grids.
 

Detailed Description

Transform spectral vector to polar stereo.

@@ -117,8 +123,8 @@

Definition in file sptgpsv.f.

Function/Subroutine Documentation

- -

◆ sptgpsv()

+ +

◆ sptgpsv()

diff --git a/sptgpsv_8f.js b/sptgpsv_8f.js index ec835636..b272cc05 100644 --- a/sptgpsv_8f.js +++ b/sptgpsv_8f.js @@ -1,4 +1,4 @@ var sptgpsv_8f = [ - [ "sptgpsv", "sptgpsv_8f.html#af2bf2335047ec277730564dbfa859079", null ] + [ "sptgpsv", "sptgpsv_8f.html#a3d8afc14a2f4aaaa30c63adfc5039ead", null ] ]; \ No newline at end of file diff --git a/sptgpsv_8f_source.html b/sptgpsv_8f_source.html index 3422cb0b..32f20084 100644 --- a/sptgpsv_8f_source.html +++ b/sptgpsv_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgpsv.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,962 +81,970 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgpsv.f
+
sptgpsv.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Transform spectral vector to polar stereo.
-
3 C>
-
4 C> ### Program History Log
-
5 C> Date | Programmer | Comments
-
6 C> -----|------------|---------
-
7 C> 96-02-29 | Iredell | Initial.
-
8 C> 1998-12-15 | Iredell | Openmp directives inserted.
-
9 C>
-
10 C> @author Iredell @date 96-02-29
-
11 
-
12 C> This subprogram performs a spherical transform
-
13 C> from spectral coefficients of divergences and curls
-
14 C> to vector fields on a pair of polar stereographic grids.
-
15 C> The wave-space can be either triangular or rhomboidal.
-
16 C>
-
17 C> The wave and grid fields may have general indexing,
-
18 C> but each wave field is in sequential 'IBM order',
-
19 C> i.e. with zonal wavenumber as the slower index.
-
20 C>
-
21 C> The two square polar stereographic grids are centered
-
22 C> on the respective poles, with the orientation longitude
-
23 C> of the southern hemisphere grid 180 degrees opposite
-
24 C> that of the northern hemisphere grid.
-
25 C>
-
26 C> The vectors are automatically rotated to be resolved
-
27 C> relative to the respective polar stereographic grids.
-
28 C>
-
29 C> The transform is made efficient
-
30 C> by combining points in eight sectors
-
31 C> of each polar stereographic grid,
-
32 C> numbered as in the diagram below.
-
33 C> The pole and the sector boundaries
-
34 C> are treated specially in the code.
-
35 C> Unfortunately, this approach induces
-
36 C> some hairy indexing and code loquacity,
-
37 C> for which the developer apologizes.
-
38 C>
-
39 C> <pre>
-
40 C> \ 4 | 5 /
-
41 C> \ | /
-
42 C> 3 \ | / 6
-
43 C> \|/
-
44 C> ----+----
-
45 C> /|\
-
46 C> 2 / | \ 7
-
47 C> / | \
-
48 C> / 1 | 8 \
-
49 C> </pre>
-
50 C>
-
51 C> The transforms are all multiprocessed over sector points.
-
52 C> transform several fields at a time to improve vectorization.
-
53 C> subprogram can be called from a multiprocessing environment.
-
54 C>
-
55 C> @param IROMB spectral domain shape
-
56 C> (0 for triangular, 1 for rhomboidal)
-
57 C> @param MAXWV spectral truncation
-
58 C> @param KMAX number of fields to transform.
-
59 C> @param NPS odd order of the polar stereographic grids
-
60 C> @param KWSKIP skip number between wave fields
-
61 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
-
62 C> @param KGSKIP skip number between grid fields
-
63 C> (defaults to NPS*NPS if KGSKIP=0)
-
64 C> @param NISKIP skip number between grid i-points
-
65 C> (defaults to 1 if NISKIP=0)
-
66 C> @param NJSKIP skip number between grid j-points
-
67 C> (defaults to NPS if NJSKIP=0)
-
68 C> @param TRUE latitude at which ps grid is true (usually 60.)
-
69 C> @param XMESH grid length at true latitude (m)
-
70 C> @param ORIENT longitude at bottom of northern ps grid
-
71 C> (southern ps grid will have opposite orientation.)
-
72 C> @param WAVED wave divergence fields
-
73 C> @param WAVEZ wave vorticity fields
-
74 C> @param UN northern polar stereographic u-winds
-
75 C> @param VN northern polar stereographic v-winds
-
76 C> @param US southern polar stereographic u-winds
-
77 C> @param VS southern polar stereographic v-winds
-
78 C>
-
79 C> @author Iredell @date 96-02-29
-
80  SUBROUTINE sptgpsv(IROMB,MAXWV,KMAX,NPS,
-
81  & KWSKIP,KGSKIP,NISKIP,NJSKIP,
-
82  & TRUE,XMESH,ORIENT,WAVED,WAVEZ,UN,VN,US,VS)
-
83 
-
84  REAL WAVED(*),WAVEZ(*),UN(*),VN(*),US(*),VS(*)
-
85  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
-
86  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
87  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
88  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
-
89  INTEGER MP(2*KMAX)
-
90  REAL SLON(MAXWV,8),CLON(MAXWV,8),SROT(0:3),CROT(0:3)
-
91  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,2*KMAX)
-
92  REAL WTOP(2*(MAXWV+1),2*KMAX)
-
93  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
-
94  REAL F(2*MAXWV+3,2,2*KMAX)
-
95  DATA srot/0.,1.,0.,-1./,crot/1.,0.,-1.,0./
-
96  parameter(rerth=6.3712e6)
-
97  parameter(pi=3.14159265358979,dpr=180./pi)
-
98 
-
99 C CALCULATE PRELIMINARY CONSTANTS
-
100  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
-
101  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
102  mxtop=maxwv+1
-
103  mdim=2*mx+1
-
104  idim=2*maxwv+3
-
105  kw=kwskip
-
106  kg=kgskip
-
107  ni=niskip
-
108  nj=njskip
-
109  IF(kw.EQ.0) kw=2*mx
-
110  IF(kg.EQ.0) kg=nps*nps
-
111  IF(ni.EQ.0) ni=1
-
112  IF(nj.EQ.0) nj=nps
-
113  mp=1
-
114  nph=(nps-1)/2
-
115  gq=((1.+sin(true/dpr))*rerth/xmesh)**2
-
116  srh=sqrt(0.5)
-
117 
-
118 C CALCULATE SPECTRAL WINDS
-
119 C$OMP PARALLEL DO PRIVATE(KWS)
-
120  DO k=1,kmax
-
121  kws=(k-1)*kw
-
122  CALL spdz2uv(iromb,maxwv,enn1,elonn1,eon,eontop,
-
123  & waved(kws+1),wavez(kws+1),
-
124  & w(1,k),w(1,kmax+k),wtop(1,k),wtop(1,kmax+k))
-
125  ENDDO
-
126 
-
127 C CALCULATE POLE POINT
-
128  i1=nph+1
-
129  j1=nph+1
-
130  ij1=(i1-1)*ni+(j1-1)*nj+1
-
131  slat1=1.
-
132  clat1=0.
-
133  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
-
134  & pln,plntop)
-
135  CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
-
136  & clat1,pln,plntop,mp,w,wtop,f)
-
137  coso=cos(orient/dpr)
-
138  sino=sin(orient/dpr)
-
139 CDIR$ IVDEP
-
140  DO k=1,kmax
-
141  ku=k
-
142  kv=k+kmax
-
143  ijk1=ij1+(k-1)*kg
-
144  un(ijk1)=2*( coso*f(3,1,ku)+sino*f(3,1,kv))
-
145  vn(ijk1)=2*(-sino*f(3,1,ku)+coso*f(3,1,kv))
-
146  us(ijk1)=2*( coso*f(3,2,ku)-sino*f(3,2,kv))
-
147  vs(ijk1)=2*( sino*f(3,2,ku)+coso*f(3,2,kv))
-
148  ENDDO
-
149 
-
150 C CALCULATE POINTS ALONG THE ROW AND COLUMN OF THE POLE,
-
151 C STARTING AT THE ORIENTATION LONGITUDE AND GOING CLOCKWISE.
-
152 C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8)
-
153 C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8)
-
154 C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8)
-
155 C$OMP& PRIVATE(DJ1,DI1,RQ,RR,RADLON,RADLON1,RADLON2,SLAT1,CLAT1)
-
156 C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,KU,KV,LR,LI)
-
157  DO j1=1,nph
-
158  i1=nph+1
-
159  radlon=orient/dpr
-
160  j3=nps+1-i1
-
161  i3=j1
-
162  j5=nps+1-j1
-
163  i5=nps+1-i1
-
164  j7=i1
-
165  i7=nps+1-j1
-
166  ij1=(i1-1)*ni+(j1-1)*nj+1
-
167  ij3=(i3-1)*ni+(j3-1)*nj+1
-
168  ij5=(i5-1)*ni+(j5-1)*nj+1
-
169  ij7=(i7-1)*ni+(j7-1)*nj+1
-
170  di1=i1-nph-1
-
171  dj1=j1-nph-1
-
172  rq=di1**2+dj1**2
-
173  slat1=(gq-rq)/(gq+rq)
-
174  clat1=sqrt(1.-slat1**2)
-
175  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
-
176  & pln,plntop)
-
177  CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
-
178  & clat1,pln,plntop,mp,w,wtop,f)
-
179  DO l=1,maxwv
-
180  slon(l,1)=sin(l*radlon)
-
181  clon(l,1)=cos(l*radlon)
-
182  slon(l,3)=slon(l,1)*crot(mod(1*l,4))
-
183  & -clon(l,1)*srot(mod(1*l,4))
-
184  clon(l,3)=clon(l,1)*crot(mod(1*l,4))
-
185  & +slon(l,1)*srot(mod(1*l,4))
-
186  slon(l,5)=slon(l,1)*crot(mod(2*l,4))
-
187  & -clon(l,1)*srot(mod(2*l,4))
-
188  clon(l,5)=clon(l,1)*crot(mod(2*l,4))
-
189  & +slon(l,1)*srot(mod(2*l,4))
-
190  slon(l,7)=slon(l,1)*crot(mod(3*l,4))
-
191  & -clon(l,1)*srot(mod(3*l,4))
-
192  clon(l,7)=clon(l,1)*crot(mod(3*l,4))
-
193  & +slon(l,1)*srot(mod(3*l,4))
-
194  ENDDO
-
195 CDIR$ IVDEP
-
196  DO k=1,kmax
-
197  ku=k
-
198  kv=k+kmax
-
199  ijk1=ij1+(k-1)*kg
-
200  ijk3=ij3+(k-1)*kg
-
201  ijk5=ij5+(k-1)*kg
-
202  ijk7=ij7+(k-1)*kg
-
203  un(ijk1)= f(1,1,ku)
-
204  vn(ijk1)= f(1,1,kv)
-
205  un(ijk3)= f(1,1,kv)
-
206  vn(ijk3)=-f(1,1,ku)
-
207  un(ijk5)=-f(1,1,ku)
-
208  vn(ijk5)=-f(1,1,kv)
-
209  un(ijk7)=-f(1,1,kv)
-
210  vn(ijk7)= f(1,1,ku)
-
211  us(ijk1)=-f(1,2,ku)
-
212  vs(ijk1)=-f(1,2,kv)
-
213  us(ijk3)=-f(1,2,kv)
-
214  vs(ijk3)= f(1,2,ku)
-
215  us(ijk5)= f(1,2,ku)
-
216  vs(ijk5)= f(1,2,kv)
-
217  us(ijk7)= f(1,2,kv)
-
218  vs(ijk7)=-f(1,2,ku)
-
219  ENDDO
-
220  IF(kmax.EQ.1) THEN
-
221  ku=1
-
222  kv=2
-
223  DO l=1,maxwv
-
224  lr=2*l+1
-
225  li=2*l+2
-
226  un(ij1)=un(ij1)+2*(f(lr,1,ku)*clon(l,1)
-
227  & -f(li,1,ku)*slon(l,1))
-
228  vn(ij1)=vn(ij1)+2*(f(lr,1,kv)*clon(l,1)
-
229  & -f(li,1,kv)*slon(l,1))
-
230  un(ij3)=un(ij3)+2*(f(lr,1,kv)*clon(l,3)
-
231  & -f(li,1,kv)*slon(l,3))
-
232  vn(ij3)=vn(ij3)-2*(f(lr,1,ku)*clon(l,3)
-
233  & -f(li,1,ku)*slon(l,3))
-
234  un(ij5)=un(ij5)-2*(f(lr,1,ku)*clon(l,5)
-
235  & -f(li,1,ku)*slon(l,5))
-
236  vn(ij5)=vn(ij5)-2*(f(lr,1,kv)*clon(l,5)
-
237  & -f(li,1,kv)*slon(l,5))
-
238  un(ij7)=un(ij7)-2*(f(lr,1,kv)*clon(l,7)
-
239  & -f(li,1,kv)*slon(l,7))
-
240  vn(ij7)=vn(ij7)+2*(f(lr,1,ku)*clon(l,7)
-
241  & -f(li,1,ku)*slon(l,7))
-
242  us(ij1)=us(ij1)-2*(f(lr,2,ku)*clon(l,5)
-
243  & -f(li,2,ku)*slon(l,5))
-
244  vs(ij1)=vs(ij1)-2*(f(lr,2,kv)*clon(l,5)
-
245  & -f(li,2,kv)*slon(l,5))
-
246  us(ij3)=us(ij3)-2*(f(lr,2,kv)*clon(l,3)
-
247  & -f(li,2,kv)*slon(l,3))
-
248  vs(ij3)=vs(ij3)+2*(f(lr,2,ku)*clon(l,3)
-
249  & -f(li,2,ku)*slon(l,3))
-
250  us(ij5)=us(ij5)+2*(f(lr,2,ku)*clon(l,1)
-
251  & -f(li,2,ku)*slon(l,1))
-
252  vs(ij5)=vs(ij5)+2*(f(lr,2,kv)*clon(l,1)
-
253  & -f(li,2,kv)*slon(l,1))
-
254  us(ij7)=us(ij7)+2*(f(lr,2,kv)*clon(l,7)
-
255  & -f(li,2,kv)*slon(l,7))
-
256  vs(ij7)=vs(ij7)-2*(f(lr,2,ku)*clon(l,7)
-
257  & -f(li,2,ku)*slon(l,7))
-
258  ENDDO
-
259  ELSE
-
260  DO l=1,maxwv
-
261  lr=2*l+1
-
262  li=2*l+2
-
263 CDIR$ IVDEP
-
264  DO k=1,kmax
-
265  ku=k
-
266  kv=k+kmax
-
267  ijk1=ij1+(k-1)*kg
-
268  ijk3=ij3+(k-1)*kg
-
269  ijk5=ij5+(k-1)*kg
-
270  ijk7=ij7+(k-1)*kg
-
271  un(ijk1)=un(ijk1)+2*(f(lr,1,ku)*clon(l,1)
-
272  & -f(li,1,ku)*slon(l,1))
-
273  vn(ijk1)=vn(ijk1)+2*(f(lr,1,kv)*clon(l,1)
-
274  & -f(li,1,kv)*slon(l,1))
-
275  un(ijk3)=un(ijk3)+2*(f(lr,1,kv)*clon(l,3)
-
276  & -f(li,1,kv)*slon(l,3))
-
277  vn(ijk3)=vn(ijk3)-2*(f(lr,1,ku)*clon(l,3)
-
278  & -f(li,1,ku)*slon(l,3))
-
279  un(ijk5)=un(ijk5)-2*(f(lr,1,ku)*clon(l,5)
-
280  & -f(li,1,ku)*slon(l,5))
-
281  vn(ijk5)=vn(ijk5)-2*(f(lr,1,kv)*clon(l,5)
-
282  & -f(li,1,kv)*slon(l,5))
-
283  un(ijk7)=un(ijk7)-2*(f(lr,1,kv)*clon(l,7)
-
284  & -f(li,1,kv)*slon(l,7))
-
285  vn(ijk7)=vn(ijk7)+2*(f(lr,1,ku)*clon(l,7)
-
286  & -f(li,1,ku)*slon(l,7))
-
287  us(ijk1)=us(ijk1)-2*(f(lr,2,ku)*clon(l,5)
-
288  & -f(li,2,ku)*slon(l,5))
-
289  vs(ijk1)=vs(ijk1)-2*(f(lr,2,kv)*clon(l,5)
-
290  & -f(li,2,kv)*slon(l,5))
-
291  us(ijk3)=us(ijk3)-2*(f(lr,2,kv)*clon(l,3)
-
292  & -f(li,2,kv)*slon(l,3))
-
293  vs(ijk3)=vs(ijk3)+2*(f(lr,2,ku)*clon(l,3)
-
294  & -f(li,2,ku)*slon(l,3))
-
295  us(ijk5)=us(ijk5)+2*(f(lr,2,ku)*clon(l,1)
-
296  & -f(li,2,ku)*slon(l,1))
-
297  vs(ijk5)=vs(ijk5)+2*(f(lr,2,kv)*clon(l,1)
-
298  & -f(li,2,kv)*slon(l,1))
-
299  us(ijk7)=us(ijk7)+2*(f(lr,2,kv)*clon(l,7)
-
300  & -f(li,2,kv)*slon(l,7))
-
301  vs(ijk7)=vs(ijk7)-2*(f(lr,2,ku)*clon(l,7)
-
302  & -f(li,2,ku)*slon(l,7))
-
303  ENDDO
-
304  ENDDO
-
305  ENDIF
-
306  ENDDO
-
307 
-
308 C CALCULATE POINTS ON THE MAIN DIAGONALS THROUGH THE POLE,
-
309 C STARTING CLOCKWISE OF THE ORIENTATION LONGITUDE AND GOING CLOCKWISE.
-
310 C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8)
-
311 C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8)
-
312 C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8)
-
313 C$OMP& PRIVATE(DJ1,DI1,RQ,RR,RADLON,RADLON1,RADLON2,SLAT1,CLAT1)
-
314 C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,KU,KV,LR,LI)
-
315  DO j1=1,nph
-
316  i1=j1
-
317  radlon=(orient-45)/dpr
-
318  j3=nps+1-i1
-
319  i3=j1
-
320  j5=nps+1-j1
-
321  i5=nps+1-i1
-
322  j7=i1
-
323  i7=nps+1-j1
-
324  ij1=(i1-1)*ni+(j1-1)*nj+1
-
325  ij3=(i3-1)*ni+(j3-1)*nj+1
-
326  ij5=(i5-1)*ni+(j5-1)*nj+1
-
327  ij7=(i7-1)*ni+(j7-1)*nj+1
-
328  di1=i1-nph-1
-
329  dj1=j1-nph-1
-
330  rq=di1**2+dj1**2
-
331  slat1=(gq-rq)/(gq+rq)
-
332  clat1=sqrt(1.-slat1**2)
-
333  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
-
334  & pln,plntop)
-
335  CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
-
336  & clat1,pln,plntop,mp,w,wtop,f)
-
337  DO l=1,maxwv
-
338  slon(l,1)=sin(l*radlon)
-
339  clon(l,1)=cos(l*radlon)
-
340  slon(l,3)=slon(l,1)*crot(mod(1*l,4))
-
341  & -clon(l,1)*srot(mod(1*l,4))
-
342  clon(l,3)=clon(l,1)*crot(mod(1*l,4))
-
343  & +slon(l,1)*srot(mod(1*l,4))
-
344  slon(l,5)=slon(l,1)*crot(mod(2*l,4))
-
345  & -clon(l,1)*srot(mod(2*l,4))
-
346  clon(l,5)=clon(l,1)*crot(mod(2*l,4))
-
347  & +slon(l,1)*srot(mod(2*l,4))
-
348  slon(l,7)=slon(l,1)*crot(mod(3*l,4))
-
349  & -clon(l,1)*srot(mod(3*l,4))
-
350  clon(l,7)=clon(l,1)*crot(mod(3*l,4))
-
351  & +slon(l,1)*srot(mod(3*l,4))
-
352  ENDDO
-
353 CDIR$ IVDEP
-
354  DO k=1,kmax
-
355  ku=k
-
356  kv=k+kmax
-
357  ijk1=ij1+(k-1)*kg
-
358  ijk3=ij3+(k-1)*kg
-
359  ijk5=ij5+(k-1)*kg
-
360  ijk7=ij7+(k-1)*kg
-
361  un(ijk1)=srh*( f(1,1,ku)+f(1,1,kv))
-
362  vn(ijk1)=srh*(-f(1,1,ku)+f(1,1,kv))
-
363  un(ijk3)=srh*(-f(1,1,ku)+f(1,1,kv))
-
364  vn(ijk3)=srh*(-f(1,1,ku)-f(1,1,kv))
-
365  un(ijk5)=srh*(-f(1,1,ku)-f(1,1,kv))
-
366  vn(ijk5)=srh*( f(1,1,ku)-f(1,1,kv))
-
367  un(ijk7)=srh*( f(1,1,ku)-f(1,1,kv))
-
368  vn(ijk7)=srh*( f(1,1,ku)+f(1,1,kv))
-
369  us(ijk1)=srh*(-f(1,2,ku)-f(1,2,kv))
-
370  vs(ijk1)=srh*( f(1,2,ku)-f(1,2,kv))
-
371  us(ijk3)=srh*( f(1,2,ku)-f(1,2,kv))
-
372  vs(ijk3)=srh*( f(1,2,ku)+f(1,2,kv))
-
373  us(ijk5)=srh*( f(1,2,ku)+f(1,2,kv))
-
374  vs(ijk5)=srh*(-f(1,2,ku)+f(1,2,kv))
-
375  us(ijk7)=srh*(-f(1,2,ku)+f(1,2,kv))
-
376  vs(ijk7)=srh*(-f(1,2,ku)-f(1,2,kv))
-
377  ENDDO
-
378  IF(kmax.EQ.1) THEN
-
379  ku=1
-
380  kv=2
-
381  DO l=1,maxwv
-
382  lr=2*l+1
-
383  li=2*l+2
-
384  un(ij1)=un(ij1)+2*srh*(( f(lr,1,ku)+f(lr,1,kv))
-
385  & *clon(l,1)
-
386  & -( f(li,1,ku)+f(li,1,kv))
-
387  & *slon(l,1))
-
388  vn(ij1)=vn(ij1)+2*srh*((-f(lr,1,ku)+f(lr,1,kv))
-
389  & *clon(l,1)
-
390  & -(-f(li,1,ku)+f(li,1,kv))
-
391  & *slon(l,1))
-
392  un(ij3)=un(ij3)+2*srh*((-f(lr,1,ku)+f(lr,1,kv))
-
393  & *clon(l,3)
-
394  & -(-f(li,1,ku)+f(li,1,kv))
-
395  & *slon(l,3))
-
396  vn(ij3)=vn(ij3)+2*srh*((-f(lr,1,ku)-f(lr,1,kv))
-
397  & *clon(l,3)
-
398  & -(-f(li,1,ku)-f(li,1,kv))
-
399  & *slon(l,3))
-
400  un(ij5)=un(ij5)+2*srh*((-f(lr,1,ku)-f(lr,1,kv))
-
401  & *clon(l,5)
-
402  & -(-f(li,1,ku)-f(li,1,kv))
-
403  & *slon(l,5))
-
404  vn(ij5)=vn(ij5)+2*srh*(( f(lr,1,ku)-f(lr,1,kv))
-
405  & *clon(l,5)
-
406  & -( f(li,1,ku)-f(li,1,kv))
-
407  & *slon(l,5))
-
408  un(ij7)=un(ij7)+2*srh*(( f(lr,1,ku)-f(lr,1,kv))
-
409  & *clon(l,7)
-
410  & -( f(li,1,ku)-f(li,1,kv))
-
411  & *slon(l,7))
-
412  vn(ij7)=vn(ij7)+2*srh*(( f(lr,1,ku)+f(lr,1,kv))
-
413  & *clon(l,7)
-
414  & -( f(li,1,ku)+f(li,1,kv))
-
415  & *slon(l,7))
-
416  us(ij1)=us(ij1)+2*srh*((-f(lr,2,ku)-f(lr,2,kv))
-
417  & *clon(l,3)
-
418  & -(-f(li,2,ku)-f(li,2,kv))
-
419  & *slon(l,3))
-
420  vs(ij1)=vs(ij1)+2*srh*(( f(lr,2,ku)-f(lr,2,kv))
-
421  & *clon(l,3)
-
422  & -( f(li,2,ku)-f(li,2,kv))
-
423  & *slon(l,3))
-
424  us(ij3)=us(ij3)+2*srh*(( f(lr,2,ku)-f(lr,2,kv))
-
425  & *clon(l,1)
-
426  & -( f(li,2,ku)-f(li,2,kv))
-
427  & *slon(l,1))
-
428  vs(ij3)=vs(ij3)+2*srh*(( f(lr,2,ku)+f(lr,2,kv))
-
429  & *clon(l,1)
-
430  & -( f(li,2,ku)+f(li,2,kv))
-
431  & *slon(l,1))
-
432  us(ij5)=us(ij5)+2*srh*(( f(lr,2,ku)+f(lr,2,kv))
-
433  & *clon(l,7)
-
434  & -( f(li,2,ku)+f(li,2,kv))
-
435  & *slon(l,7))
-
436  vs(ij5)=vs(ij5)+2*srh*((-f(lr,2,ku)+f(lr,2,kv))
-
437  & *clon(l,7)
-
438  & -(-f(li,2,ku)+f(li,2,kv))
-
439  & *slon(l,7))
-
440  us(ij7)=us(ij7)+2*srh*((-f(lr,2,ku)+f(lr,2,kv))
-
441  & *clon(l,5)
-
442  & -(-f(li,2,ku)+f(li,2,kv))
-
443  & *slon(l,5))
-
444  vs(ij7)=vs(ij7)+2*srh*((-f(lr,2,ku)-f(lr,2,kv))
-
445  & *clon(l,5)
-
446  & -(-f(li,2,ku)-f(li,2,kv))
-
447  & *slon(l,5))
-
448  ENDDO
-
449  ELSE
-
450  DO l=1,maxwv
-
451  lr=2*l+1
-
452  li=2*l+2
-
453 CDIR$ IVDEP
-
454  DO k=1,kmax
-
455  ku=k
-
456  kv=k+kmax
-
457  ijk1=ij1+(k-1)*kg
-
458  ijk3=ij3+(k-1)*kg
-
459  ijk5=ij5+(k-1)*kg
-
460  ijk7=ij7+(k-1)*kg
-
461  un(ijk1)=un(ijk1)+2*srh*(( f(lr,1,ku)+f(lr,1,kv))
-
462  & *clon(l,1)
-
463  & -( f(li,1,ku)+f(li,1,kv))
-
464  & *slon(l,1))
-
465  vn(ijk1)=vn(ijk1)+2*srh*((-f(lr,1,ku)+f(lr,1,kv))
-
466  & *clon(l,1)
-
467  & -(-f(li,1,ku)+f(li,1,kv))
-
468  & *slon(l,1))
-
469  un(ijk3)=un(ijk3)+2*srh*((-f(lr,1,ku)+f(lr,1,kv))
-
470  & *clon(l,3)
-
471  & -(-f(li,1,ku)+f(li,1,kv))
-
472  & *slon(l,3))
-
473  vn(ijk3)=vn(ijk3)+2*srh*((-f(lr,1,ku)-f(lr,1,kv))
-
474  & *clon(l,3)
-
475  & -(-f(li,1,ku)-f(li,1,kv))
-
476  & *slon(l,3))
-
477  un(ijk5)=un(ijk5)+2*srh*((-f(lr,1,ku)-f(lr,1,kv))
-
478  & *clon(l,5)
-
479  & -(-f(li,1,ku)-f(li,1,kv))
-
480  & *slon(l,5))
-
481  vn(ijk5)=vn(ijk5)+2*srh*(( f(lr,1,ku)-f(lr,1,kv))
-
482  & *clon(l,5)
-
483  & -( f(li,1,ku)-f(li,1,kv))
-
484  & *slon(l,5))
-
485  un(ijk7)=un(ijk7)+2*srh*(( f(lr,1,ku)-f(lr,1,kv))
-
486  & *clon(l,7)
-
487  & -( f(li,1,ku)-f(li,1,kv))
-
488  & *slon(l,7))
-
489  vn(ijk7)=vn(ijk7)+2*srh*(( f(lr,1,ku)+f(lr,1,kv))
-
490  & *clon(l,7)
-
491  & -( f(li,1,ku)+f(li,1,kv))
-
492  & *slon(l,7))
-
493  us(ijk1)=us(ijk1)+2*srh*((-f(lr,2,ku)-f(lr,2,kv))
-
494  & *clon(l,3)
-
495  & -(-f(li,2,ku)-f(li,2,kv))
-
496  & *slon(l,3))
-
497  vs(ijk1)=vs(ijk1)+2*srh*(( f(lr,2,ku)-f(lr,2,kv))
-
498  & *clon(l,3)
-
499  & -( f(li,2,ku)-f(li,2,kv))
-
500  & *slon(l,3))
-
501  us(ijk3)=us(ijk3)+2*srh*(( f(lr,2,ku)-f(lr,2,kv))
-
502  & *clon(l,1)
-
503  & -( f(li,2,ku)-f(li,2,kv))
-
504  & *slon(l,1))
-
505  vs(ijk3)=vs(ijk3)+2*srh*(( f(lr,2,ku)+f(lr,2,kv))
-
506  & *clon(l,1)
-
507  & -( f(li,2,ku)+f(li,2,kv))
-
508  & *slon(l,1))
-
509  us(ijk5)=us(ijk5)+2*srh*(( f(lr,2,ku)+f(lr,2,kv))
-
510  & *clon(l,7)
-
511  & -( f(li,2,ku)+f(li,2,kv))
-
512  & *slon(l,7))
-
513  vs(ijk5)=vs(ijk5)+2*srh*((-f(lr,2,ku)+f(lr,2,kv))
-
514  & *clon(l,7)
-
515  & -(-f(li,2,ku)+f(li,2,kv))
-
516  & *slon(l,7))
-
517  us(ijk7)=us(ijk7)+2*srh*((-f(lr,2,ku)+f(lr,2,kv))
-
518  & *clon(l,5)
-
519  & -(-f(li,2,ku)+f(li,2,kv))
-
520  & *slon(l,5))
-
521  vs(ijk7)=vs(ijk7)+2*srh*((-f(lr,2,ku)-f(lr,2,kv))
-
522  & *clon(l,5)
-
523  & -(-f(li,2,ku)-f(li,2,kv))
-
524  & *slon(l,5))
-
525  ENDDO
-
526  ENDDO
-
527  ENDIF
-
528  ENDDO
-
529 
-
530 C CALCULATE THE REMAINDER OF THE POLAR STEREOGRAPHIC DOMAIN,
-
531 C STARTING AT THE SECTOR JUST CLOCKWISE OF THE ORIENTATION LONGITUDE
-
532 C AND GOING CLOCKWISE UNTIL ALL EIGHT SECTORS ARE DONE.
-
533 C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8)
-
534 C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8)
-
535 C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8)
-
536 C$OMP& PRIVATE(DJ1,DI1,RQ,RR,RADLON,RADLON1,RADLON2,SLAT1,CLAT1)
-
537 C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,KU,KV,LR,LI)
-
538  DO j1=1,nph-1
-
539  DO i1=j1+1,nph
-
540  j2=i1
-
541  i2=j1
-
542  j3=nps+1-i1
-
543  i3=j1
-
544  j4=nps+1-j1
-
545  i4=i1
-
546  j5=nps+1-j1
-
547  i5=nps+1-i1
-
548  j6=nps+1-i1
-
549  i6=nps+1-j1
-
550  j7=i1
-
551  i7=nps+1-j1
-
552  j8=j1
-
553  i8=nps+1-i1
-
554  ij1=(i1-1)*ni+(j1-1)*nj+1
-
555  ij2=(i2-1)*ni+(j2-1)*nj+1
-
556  ij3=(i3-1)*ni+(j3-1)*nj+1
-
557  ij4=(i4-1)*ni+(j4-1)*nj+1
-
558  ij5=(i5-1)*ni+(j5-1)*nj+1
-
559  ij6=(i6-1)*ni+(j6-1)*nj+1
-
560  ij7=(i7-1)*ni+(j7-1)*nj+1
-
561  ij8=(i8-1)*ni+(j8-1)*nj+1
-
562  di1=i1-nph-1
-
563  dj1=j1-nph-1
-
564  rq=di1**2+dj1**2
-
565  rr=sqrt(1/rq)
-
566  slat1=(gq-rq)/(gq+rq)
-
567  clat1=sqrt(1.-slat1**2)
-
568  radlon1=orient/dpr+atan(-di1/dj1)
-
569  radlon2=(orient-45)/dpr*2-radlon1
-
570  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
-
571  & pln,plntop)
-
572  CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
-
573  & clat1,pln,plntop,mp,w,wtop,f)
-
574  DO l=1,maxwv
-
575  slon(l,1)=sin(l*radlon1)
-
576  clon(l,1)=cos(l*radlon1)
-
577  slon(l,2)=sin(l*radlon2)
-
578  clon(l,2)=cos(l*radlon2)
-
579  slon(l,3)=slon(l,1)*crot(mod(1*l,4))
-
580  & -clon(l,1)*srot(mod(1*l,4))
-
581  clon(l,3)=clon(l,1)*crot(mod(1*l,4))
-
582  & +slon(l,1)*srot(mod(1*l,4))
-
583  slon(l,4)=slon(l,2)*crot(mod(1*l,4))
-
584  & -clon(l,2)*srot(mod(1*l,4))
-
585  clon(l,4)=clon(l,2)*crot(mod(1*l,4))
-
586  & +slon(l,2)*srot(mod(1*l,4))
-
587  slon(l,5)=slon(l,1)*crot(mod(2*l,4))
-
588  & -clon(l,1)*srot(mod(2*l,4))
-
589  clon(l,5)=clon(l,1)*crot(mod(2*l,4))
-
590  & +slon(l,1)*srot(mod(2*l,4))
-
591  slon(l,6)=slon(l,2)*crot(mod(2*l,4))
-
592  & -clon(l,2)*srot(mod(2*l,4))
-
593  clon(l,6)=clon(l,2)*crot(mod(2*l,4))
-
594  & +slon(l,2)*srot(mod(2*l,4))
-
595  slon(l,7)=slon(l,1)*crot(mod(3*l,4))
-
596  & -clon(l,1)*srot(mod(3*l,4))
-
597  clon(l,7)=clon(l,1)*crot(mod(3*l,4))
-
598  & +slon(l,1)*srot(mod(3*l,4))
-
599  slon(l,8)=slon(l,2)*crot(mod(3*l,4))
-
600  & -clon(l,2)*srot(mod(3*l,4))
-
601  clon(l,8)=clon(l,2)*crot(mod(3*l,4))
-
602  & +slon(l,2)*srot(mod(3*l,4))
-
603  ENDDO
-
604 CDIR$ IVDEP
-
605  DO k=1,kmax
-
606  ku=k
-
607  kv=k+kmax
-
608  ijk1=ij1+(k-1)*kg
-
609  ijk2=ij2+(k-1)*kg
-
610  ijk3=ij3+(k-1)*kg
-
611  ijk4=ij4+(k-1)*kg
-
612  ijk5=ij5+(k-1)*kg
-
613  ijk6=ij6+(k-1)*kg
-
614  ijk7=ij7+(k-1)*kg
-
615  ijk8=ij8+(k-1)*kg
-
616  un(ijk1)=rr*(-dj1*f(1,1,ku)-di1*f(1,1,kv))
-
617  vn(ijk1)=rr*( di1*f(1,1,ku)-dj1*f(1,1,kv))
-
618  un(ijk2)=rr*(-di1*f(1,1,ku)-dj1*f(1,1,kv))
-
619  vn(ijk2)=rr*( dj1*f(1,1,ku)-di1*f(1,1,kv))
-
620  un(ijk3)=rr*( di1*f(1,1,ku)-dj1*f(1,1,kv))
-
621  vn(ijk3)=rr*( dj1*f(1,1,ku)+di1*f(1,1,kv))
-
622  un(ijk4)=rr*( dj1*f(1,1,ku)-di1*f(1,1,kv))
-
623  vn(ijk4)=rr*( di1*f(1,1,ku)+dj1*f(1,1,kv))
-
624  un(ijk5)=rr*( dj1*f(1,1,ku)+di1*f(1,1,kv))
-
625  vn(ijk5)=rr*(-di1*f(1,1,ku)+dj1*f(1,1,kv))
-
626  un(ijk6)=rr*( di1*f(1,1,ku)+dj1*f(1,1,kv))
-
627  vn(ijk6)=rr*(-dj1*f(1,1,ku)+di1*f(1,1,kv))
-
628  un(ijk7)=rr*(-di1*f(1,1,ku)+dj1*f(1,1,kv))
-
629  vn(ijk7)=rr*(-dj1*f(1,1,ku)-di1*f(1,1,kv))
-
630  un(ijk8)=rr*(-dj1*f(1,1,ku)+di1*f(1,1,kv))
-
631  vn(ijk8)=rr*(-di1*f(1,1,ku)-dj1*f(1,1,kv))
-
632  us(ijk1)=rr*( dj1*f(1,2,ku)+di1*f(1,2,kv))
-
633  vs(ijk1)=rr*(-di1*f(1,2,ku)+dj1*f(1,2,kv))
-
634  us(ijk2)=rr*( di1*f(1,2,ku)+dj1*f(1,2,kv))
-
635  vs(ijk2)=rr*(-dj1*f(1,2,ku)+di1*f(1,2,kv))
-
636  us(ijk3)=rr*(-di1*f(1,2,ku)+dj1*f(1,2,kv))
-
637  vs(ijk3)=rr*(-dj1*f(1,2,ku)-di1*f(1,2,kv))
-
638  us(ijk4)=rr*(-dj1*f(1,2,ku)+di1*f(1,2,kv))
-
639  vs(ijk4)=rr*(-di1*f(1,2,ku)-dj1*f(1,2,kv))
-
640  us(ijk5)=rr*(-dj1*f(1,2,ku)-di1*f(1,2,kv))
-
641  vs(ijk5)=rr*( di1*f(1,2,ku)-dj1*f(1,2,kv))
-
642  us(ijk6)=rr*(-di1*f(1,2,ku)-dj1*f(1,2,kv))
-
643  vs(ijk6)=rr*( dj1*f(1,2,ku)-di1*f(1,2,kv))
-
644  us(ijk7)=rr*( di1*f(1,2,ku)-dj1*f(1,2,kv))
-
645  vs(ijk7)=rr*( dj1*f(1,2,ku)+di1*f(1,2,kv))
-
646  us(ijk8)=rr*( dj1*f(1,2,ku)-di1*f(1,2,kv))
-
647  vs(ijk8)=rr*( di1*f(1,2,ku)+dj1*f(1,2,kv))
-
648  ENDDO
-
649  IF(kmax.EQ.1) THEN
-
650  ku=1
-
651  kv=2
-
652  DO l=1,maxwv
-
653  lr=2*l+1
-
654  li=2*l+2
-
655  un(ij1)=un(ij1)+2*rr*((-dj1*f(lr,1,ku)-di1*f(lr,1,kv))
-
656  & *clon(l,1)
-
657  & -(-dj1*f(li,1,ku)-di1*f(li,1,kv))
-
658  & *slon(l,1))
-
659  vn(ij1)=vn(ij1)+2*rr*(( di1*f(lr,1,ku)-dj1*f(lr,1,kv))
-
660  & *clon(l,1)
-
661  & -( di1*f(li,1,ku)-dj1*f(li,1,kv))
-
662  & *slon(l,1))
-
663  un(ij2)=un(ij2)+2*rr*((-di1*f(lr,1,ku)-dj1*f(lr,1,kv))
-
664  & *clon(l,2)
-
665  & -(-di1*f(li,1,ku)-dj1*f(li,1,kv))
-
666  & *slon(l,2))
-
667  vn(ij2)=vn(ij2)+2*rr*(( dj1*f(lr,1,ku)-di1*f(lr,1,kv))
-
668  & *clon(l,2)
-
669  & -( dj1*f(li,1,ku)-di1*f(li,1,kv))
-
670  & *slon(l,2))
-
671  un(ij3)=un(ij3)+2*rr*(( di1*f(lr,1,ku)-dj1*f(lr,1,kv))
-
672  & *clon(l,3)
-
673  & -( di1*f(li,1,ku)-dj1*f(li,1,kv))
-
674  & *slon(l,3))
-
675  vn(ij3)=vn(ij3)+2*rr*(( dj1*f(lr,1,ku)+di1*f(lr,1,kv))
-
676  & *clon(l,3)
-
677  & -( dj1*f(li,1,ku)+di1*f(li,1,kv))
-
678  & *slon(l,3))
-
679  un(ij4)=un(ij4)+2*rr*(( dj1*f(lr,1,ku)-di1*f(lr,1,kv))
-
680  & *clon(l,4)
-
681  & -( dj1*f(li,1,ku)-di1*f(li,1,kv))
-
682  & *slon(l,4))
-
683  vn(ij4)=vn(ij4)+2*rr*(( di1*f(lr,1,ku)+dj1*f(lr,1,kv))
-
684  & *clon(l,4)
-
685  & -( di1*f(li,1,ku)+dj1*f(li,1,kv))
-
686  & *slon(l,4))
-
687  un(ij5)=un(ij5)+2*rr*(( dj1*f(lr,1,ku)+di1*f(lr,1,kv))
-
688  & *clon(l,5)
-
689  & -( dj1*f(li,1,ku)+di1*f(li,1,kv))
-
690  & *slon(l,5))
-
691  vn(ij5)=vn(ij5)+2*rr*((-di1*f(lr,1,ku)+dj1*f(lr,1,kv))
-
692  & *clon(l,5)
-
693  & -(-di1*f(li,1,ku)+dj1*f(li,1,kv))
-
694  & *slon(l,5))
-
695  un(ij6)=un(ij6)+2*rr*(( di1*f(lr,1,ku)+dj1*f(lr,1,kv))
-
696  & *clon(l,6)
-
697  & -( di1*f(li,1,ku)+dj1*f(li,1,kv))
-
698  & *slon(l,6))
-
699  vn(ij6)=vn(ij6)+2*rr*((-dj1*f(lr,1,ku)+di1*f(lr,1,kv))
-
700  & *clon(l,6)
-
701  & -(-dj1*f(li,1,ku)+di1*f(li,1,kv))
-
702  & *slon(l,6))
-
703  un(ij7)=un(ij7)+2*rr*((-di1*f(lr,1,ku)+dj1*f(lr,1,kv))
-
704  & *clon(l,7)
-
705  & -(-di1*f(li,1,ku)+dj1*f(li,1,kv))
-
706  & *slon(l,7))
-
707  vn(ij7)=vn(ij7)+2*rr*((-dj1*f(lr,1,ku)-di1*f(lr,1,kv))
-
708  & *clon(l,7)
-
709  & -(-dj1*f(li,1,ku)-di1*f(li,1,kv))
-
710  & *slon(l,7))
-
711  un(ij8)=un(ij8)+2*rr*((-dj1*f(lr,1,ku)+di1*f(lr,1,kv))
-
712  & *clon(l,8)
-
713  & -(-dj1*f(li,1,ku)+di1*f(li,1,kv))
-
714  & *slon(l,8))
-
715  vn(ij8)=vn(ij8)+2*rr*((-di1*f(lr,1,ku)-dj1*f(lr,1,kv))
-
716  & *clon(l,8)
-
717  & -(-di1*f(li,1,ku)-dj1*f(li,1,kv))
-
718  & *slon(l,8))
-
719  us(ij1)=us(ij1)+2*rr*(( dj1*f(lr,2,ku)+di1*f(lr,2,kv))
-
720  & *clon(l,4)
-
721  & -( dj1*f(li,2,ku)+di1*f(li,2,kv))
-
722  & *slon(l,4))
-
723  vs(ij1)=vs(ij1)+2*rr*((-di1*f(lr,2,ku)+dj1*f(lr,2,kv))
-
724  & *clon(l,4)
-
725  & -(-di1*f(li,2,ku)+dj1*f(li,2,kv))
-
726  & *slon(l,4))
-
727  us(ij2)=us(ij2)+2*rr*(( di1*f(lr,2,ku)+dj1*f(lr,2,kv))
-
728  & *clon(l,3)
-
729  & -( di1*f(li,2,ku)+dj1*f(li,2,kv))
-
730  & *slon(l,3))
-
731  vs(ij2)=vs(ij2)+2*rr*((-dj1*f(lr,2,ku)+di1*f(lr,2,kv))
-
732  & *clon(l,3)
-
733  & -(-dj1*f(li,2,ku)+di1*f(li,2,kv))
-
734  & *slon(l,3))
-
735  us(ij3)=us(ij3)+2*rr*((-di1*f(lr,2,ku)+dj1*f(lr,2,kv))
-
736  & *clon(l,2)
-
737  & -(-di1*f(li,2,ku)+dj1*f(li,2,kv))
-
738  & *slon(l,2))
-
739  vs(ij3)=vs(ij3)+2*rr*((-dj1*f(lr,2,ku)-di1*f(lr,2,kv))
-
740  & *clon(l,2)
-
741  & -(-dj1*f(li,2,ku)-di1*f(li,2,kv))
-
742  & *slon(l,2))
-
743  us(ij4)=us(ij4)+2*rr*((-dj1*f(lr,2,ku)+di1*f(lr,2,kv))
-
744  & *clon(l,1)
-
745  & -(-dj1*f(li,2,ku)+di1*f(li,2,kv))
-
746  & *slon(l,1))
-
747  vs(ij4)=vs(ij4)+2*rr*((-di1*f(lr,2,ku)-dj1*f(lr,2,kv))
-
748  & *clon(l,1)
-
749  & -(-di1*f(li,2,ku)-dj1*f(li,2,kv))
-
750  & *slon(l,1))
-
751  us(ij5)=us(ij5)+2*rr*((-dj1*f(lr,2,ku)-di1*f(lr,2,kv))
-
752  & *clon(l,8)
-
753  & -(-dj1*f(li,2,ku)-di1*f(li,2,kv))
-
754  & *slon(l,8))
-
755  vs(ij5)=vs(ij5)+2*rr*(( di1*f(lr,2,ku)-dj1*f(lr,2,kv))
-
756  & *clon(l,8)
-
757  & -( di1*f(li,2,ku)-dj1*f(li,2,kv))
-
758  & *slon(l,8))
-
759  us(ij6)=us(ij6)+2*rr*((-di1*f(lr,2,ku)-dj1*f(lr,2,kv))
-
760  & *clon(l,7)
-
761  & -(-di1*f(li,2,ku)-dj1*f(li,2,kv))
-
762  & *slon(l,7))
-
763  vs(ij6)=vs(ij6)+2*rr*(( dj1*f(lr,2,ku)-di1*f(lr,2,kv))
-
764  & *clon(l,7)
-
765  & -( dj1*f(li,2,ku)-di1*f(li,2,kv))
-
766  & *slon(l,7))
-
767  us(ij7)=us(ij7)+2*rr*(( di1*f(lr,2,ku)-dj1*f(lr,2,kv))
-
768  & *clon(l,6)
-
769  & -( di1*f(li,2,ku)-dj1*f(li,2,kv))
-
770  & *slon(l,6))
-
771  vs(ij7)=vs(ij7)+2*rr*(( dj1*f(lr,2,ku)+di1*f(lr,2,kv))
-
772  & *clon(l,6)
-
773  & -( dj1*f(li,2,ku)+di1*f(li,2,kv))
-
774  & *slon(l,6))
-
775  us(ij8)=us(ij8)+2*rr*(( dj1*f(lr,2,ku)-di1*f(lr,2,kv))
-
776  & *clon(l,5)
-
777  & -( dj1*f(li,2,ku)-di1*f(li,2,kv))
-
778  & *slon(l,5))
-
779  vs(ij8)=vs(ij8)+2*rr*(( di1*f(lr,2,ku)+dj1*f(lr,2,kv))
-
780  & *clon(l,5)
-
781  & -( di1*f(li,2,ku)+dj1*f(li,2,kv))
-
782  & *slon(l,5))
-
783  ENDDO
-
784  ELSE
-
785  DO l=1,maxwv
-
786  lr=2*l+1
-
787  li=2*l+2
-
788 CDIR$ IVDEP
-
789  DO k=1,kmax
-
790  ku=k
-
791  kv=k+kmax
-
792  ijk1=ij1+(k-1)*kg
-
793  ijk2=ij2+(k-1)*kg
-
794  ijk3=ij3+(k-1)*kg
-
795  ijk4=ij4+(k-1)*kg
-
796  ijk5=ij5+(k-1)*kg
-
797  ijk6=ij6+(k-1)*kg
-
798  ijk7=ij7+(k-1)*kg
-
799  ijk8=ij8+(k-1)*kg
-
800  un(ijk1)=un(ijk1)+2*rr*((-dj1*f(lr,1,ku)-di1*f(lr,1,kv))
-
801  & *clon(l,1)
-
802  & -(-dj1*f(li,1,ku)-di1*f(li,1,kv))
-
803  & *slon(l,1))
-
804  vn(ijk1)=vn(ijk1)+2*rr*(( di1*f(lr,1,ku)-dj1*f(lr,1,kv))
-
805  & *clon(l,1)
-
806  & -( di1*f(li,1,ku)-dj1*f(li,1,kv))
-
807  & *slon(l,1))
-
808  un(ijk2)=un(ijk2)+2*rr*((-di1*f(lr,1,ku)-dj1*f(lr,1,kv))
-
809  & *clon(l,2)
-
810  & -(-di1*f(li,1,ku)-dj1*f(li,1,kv))
-
811  & *slon(l,2))
-
812  vn(ijk2)=vn(ijk2)+2*rr*(( dj1*f(lr,1,ku)-di1*f(lr,1,kv))
-
813  & *clon(l,2)
-
814  & -( dj1*f(li,1,ku)-di1*f(li,1,kv))
-
815  & *slon(l,2))
-
816  un(ijk3)=un(ijk3)+2*rr*(( di1*f(lr,1,ku)-dj1*f(lr,1,kv))
-
817  & *clon(l,3)
-
818  & -( di1*f(li,1,ku)-dj1*f(li,1,kv))
-
819  & *slon(l,3))
-
820  vn(ijk3)=vn(ijk3)+2*rr*(( dj1*f(lr,1,ku)+di1*f(lr,1,kv))
-
821  & *clon(l,3)
-
822  & -( dj1*f(li,1,ku)+di1*f(li,1,kv))
-
823  & *slon(l,3))
-
824  un(ijk4)=un(ijk4)+2*rr*(( dj1*f(lr,1,ku)-di1*f(lr,1,kv))
-
825  & *clon(l,4)
-
826  & -( dj1*f(li,1,ku)-di1*f(li,1,kv))
-
827  & *slon(l,4))
-
828  vn(ijk4)=vn(ijk4)+2*rr*(( di1*f(lr,1,ku)+dj1*f(lr,1,kv))
-
829  & *clon(l,4)
-
830  & -( di1*f(li,1,ku)+dj1*f(li,1,kv))
-
831  & *slon(l,4))
-
832  un(ijk5)=un(ijk5)+2*rr*(( dj1*f(lr,1,ku)+di1*f(lr,1,kv))
-
833  & *clon(l,5)
-
834  & -( dj1*f(li,1,ku)+di1*f(li,1,kv))
-
835  & *slon(l,5))
-
836  vn(ijk5)=vn(ijk5)+2*rr*((-di1*f(lr,1,ku)+dj1*f(lr,1,kv))
-
837  & *clon(l,5)
-
838  & -(-di1*f(li,1,ku)+dj1*f(li,1,kv))
-
839  & *slon(l,5))
-
840  un(ijk6)=un(ijk6)+2*rr*(( di1*f(lr,1,ku)+dj1*f(lr,1,kv))
-
841  & *clon(l,6)
-
842  & -( di1*f(li,1,ku)+dj1*f(li,1,kv))
-
843  & *slon(l,6))
-
844  vn(ijk6)=vn(ijk6)+2*rr*((-dj1*f(lr,1,ku)+di1*f(lr,1,kv))
-
845  & *clon(l,6)
-
846  & -(-dj1*f(li,1,ku)+di1*f(li,1,kv))
-
847  & *slon(l,6))
-
848  un(ijk7)=un(ijk7)+2*rr*((-di1*f(lr,1,ku)+dj1*f(lr,1,kv))
-
849  & *clon(l,7)
-
850  & -(-di1*f(li,1,ku)+dj1*f(li,1,kv))
-
851  & *slon(l,7))
-
852  vn(ijk7)=vn(ijk7)+2*rr*((-dj1*f(lr,1,ku)-di1*f(lr,1,kv))
-
853  & *clon(l,7)
-
854  & -(-dj1*f(li,1,ku)-di1*f(li,1,kv))
-
855  & *slon(l,7))
-
856  un(ijk8)=un(ijk8)+2*rr*((-dj1*f(lr,1,ku)+di1*f(lr,1,kv))
-
857  & *clon(l,8)
-
858  & -(-dj1*f(li,1,ku)+di1*f(li,1,kv))
-
859  & *slon(l,8))
-
860  vn(ijk8)=vn(ijk8)+2*rr*((-di1*f(lr,1,ku)-dj1*f(lr,1,kv))
-
861  & *clon(l,8)
-
862  & -(-di1*f(li,1,ku)-dj1*f(li,1,kv))
-
863  & *slon(l,8))
-
864  us(ijk1)=us(ijk1)+2*rr*(( dj1*f(lr,2,ku)+di1*f(lr,2,kv))
-
865  & *clon(l,4)
-
866  & -( dj1*f(li,2,ku)+di1*f(li,2,kv))
-
867  & *slon(l,4))
-
868  vs(ijk1)=vs(ijk1)+2*rr*((-di1*f(lr,2,ku)+dj1*f(lr,2,kv))
-
869  & *clon(l,4)
-
870  & -(-di1*f(li,2,ku)+dj1*f(li,2,kv))
-
871  & *slon(l,4))
-
872  us(ijk2)=us(ijk2)+2*rr*(( di1*f(lr,2,ku)+dj1*f(lr,2,kv))
-
873  & *clon(l,3)
-
874  & -( di1*f(li,2,ku)+dj1*f(li,2,kv))
-
875  & *slon(l,3))
-
876  vs(ijk2)=vs(ijk2)+2*rr*((-dj1*f(lr,2,ku)+di1*f(lr,2,kv))
-
877  & *clon(l,3)
-
878  & -(-dj1*f(li,2,ku)+di1*f(li,2,kv))
-
879  & *slon(l,3))
-
880  us(ijk3)=us(ijk3)+2*rr*((-di1*f(lr,2,ku)+dj1*f(lr,2,kv))
-
881  & *clon(l,2)
-
882  & -(-di1*f(li,2,ku)+dj1*f(li,2,kv))
-
883  & *slon(l,2))
-
884  vs(ijk3)=vs(ijk3)+2*rr*((-dj1*f(lr,2,ku)-di1*f(lr,2,kv))
-
885  & *clon(l,2)
-
886  & -(-dj1*f(li,2,ku)-di1*f(li,2,kv))
-
887  & *slon(l,2))
-
888  us(ijk4)=us(ijk4)+2*rr*((-dj1*f(lr,2,ku)+di1*f(lr,2,kv))
-
889  & *clon(l,1)
-
890  & -(-dj1*f(li,2,ku)+di1*f(li,2,kv))
-
891  & *slon(l,1))
-
892  vs(ijk4)=vs(ijk4)+2*rr*((-di1*f(lr,2,ku)-dj1*f(lr,2,kv))
-
893  & *clon(l,1)
-
894  & -(-di1*f(li,2,ku)-dj1*f(li,2,kv))
-
895  & *slon(l,1))
-
896  us(ijk5)=us(ijk5)+2*rr*((-dj1*f(lr,2,ku)-di1*f(lr,2,kv))
-
897  & *clon(l,8)
-
898  & -(-dj1*f(li,2,ku)-di1*f(li,2,kv))
-
899  & *slon(l,8))
-
900  vs(ijk5)=vs(ijk5)+2*rr*(( di1*f(lr,2,ku)-dj1*f(lr,2,kv))
-
901  & *clon(l,8)
-
902  & -( di1*f(li,2,ku)-dj1*f(li,2,kv))
-
903  & *slon(l,8))
-
904  us(ijk6)=us(ijk6)+2*rr*((-di1*f(lr,2,ku)-dj1*f(lr,2,kv))
-
905  & *clon(l,7)
-
906  & -(-di1*f(li,2,ku)-dj1*f(li,2,kv))
-
907  & *slon(l,7))
-
908  vs(ijk6)=vs(ijk6)+2*rr*(( dj1*f(lr,2,ku)-di1*f(lr,2,kv))
-
909  & *clon(l,7)
-
910  & -( dj1*f(li,2,ku)-di1*f(li,2,kv))
-
911  & *slon(l,7))
-
912  us(ijk7)=us(ijk7)+2*rr*(( di1*f(lr,2,ku)-dj1*f(lr,2,kv))
-
913  & *clon(l,6)
-
914  & -( di1*f(li,2,ku)-dj1*f(li,2,kv))
-
915  & *slon(l,6))
-
916  vs(ijk7)=vs(ijk7)+2*rr*(( dj1*f(lr,2,ku)+di1*f(lr,2,kv))
-
917  & *clon(l,6)
-
918  & -( dj1*f(li,2,ku)+di1*f(li,2,kv))
-
919  & *slon(l,6))
-
920  us(ijk8)=us(ijk8)+2*rr*(( dj1*f(lr,2,ku)-di1*f(lr,2,kv))
-
921  & *clon(l,5)
-
922  & -( dj1*f(li,2,ku)-di1*f(li,2,kv))
-
923  & *slon(l,5))
-
924  vs(ijk8)=vs(ijk8)+2*rr*(( di1*f(lr,2,ku)+dj1*f(lr,2,kv))
-
925  & *clon(l,5)
-
926  & -( di1*f(li,2,ku)+dj1*f(li,2,kv))
-
927  & *slon(l,5))
-
928  ENDDO
-
929  ENDDO
-
930  ENDIF
-
931  ENDDO
-
932  ENDDO
-
933 
-
934  END
-
subroutine spdz2uv(I, M, ENN1, ELONN1, EON, EONTOP, D, Z, U, V, UTOP, VTOP)
Computes the wind components from divergence and vorticity in spectral space.
Definition: spdz2uv.f:49
-
subroutine splegend(I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
Definition: splegend.f:45
-
subroutine spsynth(I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
Definition: spsynth.f:39
-
subroutine sptgpsv(IROMB, MAXWV, KMAX, NPS, KWSKIP, KGSKIP, NISKIP, NJSKIP, TRUE, XMESH, ORIENT, WAVED, WAVEZ, UN, VN, US, VS)
This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
Definition: sptgpsv.f:83
-
subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
This subprogram gets wave-space constants.
Definition: spwget.f:18
+Go to the documentation of this file.
1C> @file
+
2C> @brief Transform spectral vector to polar stereo.
+
3C>
+
4C> ### Program History Log
+
5C> Date | Programmer | Comments
+
6C> -----|------------|---------
+
7C> 96-02-29 | Iredell | Initial.
+
8C> 1998-12-15 | Iredell | Openmp directives inserted.
+
9C>
+
10C> @author Iredell @date 96-02-29
+
11
+
12C> This subprogram performs a spherical transform
+
13C> from spectral coefficients of divergences and curls
+
14C> to vector fields on a pair of polar stereographic grids.
+
15C> The wave-space can be either triangular or rhomboidal.
+
16C>
+
17C> The wave and grid fields may have general indexing,
+
18C> but each wave field is in sequential 'IBM order',
+
19C> i.e. with zonal wavenumber as the slower index.
+
20C>
+
21C> The two square polar stereographic grids are centered
+
22C> on the respective poles, with the orientation longitude
+
23C> of the southern hemisphere grid 180 degrees opposite
+
24C> that of the northern hemisphere grid.
+
25C>
+
26C> The vectors are automatically rotated to be resolved
+
27C> relative to the respective polar stereographic grids.
+
28C>
+
29C> The transform is made efficient
+
30C> by combining points in eight sectors
+
31C> of each polar stereographic grid,
+
32C> numbered as in the diagram below.
+
33C> The pole and the sector boundaries
+
34C> are treated specially in the code.
+
35C> Unfortunately, this approach induces
+
36C> some hairy indexing and code loquacity,
+
37C> for which the developer apologizes.
+
38C>
+
39C> <pre>
+
40C> \ 4 | 5 /
+
41C> \ | /
+
42C> 3 \ | / 6
+
43C> \|/
+
44C> ----+----
+
45C> /|\
+
46C> 2 / | \ 7
+
47C> / | \
+
48C> / 1 | 8 \
+
49C> </pre>
+
50C>
+
51C> The transforms are all multiprocessed over sector points.
+
52C> transform several fields at a time to improve vectorization.
+
53C> subprogram can be called from a multiprocessing environment.
+
54C>
+
55C> @param IROMB spectral domain shape
+
56C> (0 for triangular, 1 for rhomboidal)
+
57C> @param MAXWV spectral truncation
+
58C> @param KMAX number of fields to transform.
+
59C> @param NPS odd order of the polar stereographic grids
+
60C> @param KWSKIP skip number between wave fields
+
61C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
+
62C> @param KGSKIP skip number between grid fields
+
63C> (defaults to NPS*NPS if KGSKIP=0)
+
64C> @param NISKIP skip number between grid i-points
+
65C> (defaults to 1 if NISKIP=0)
+
66C> @param NJSKIP skip number between grid j-points
+
67C> (defaults to NPS if NJSKIP=0)
+
68C> @param TRUE latitude at which ps grid is true (usually 60.)
+
69C> @param XMESH grid length at true latitude (m)
+
70C> @param ORIENT longitude at bottom of northern ps grid
+
71C> (southern ps grid will have opposite orientation.)
+
72C> @param WAVED wave divergence fields
+
73C> @param WAVEZ wave vorticity fields
+
74C> @param UN northern polar stereographic u-winds
+
75C> @param VN northern polar stereographic v-winds
+
76C> @param US southern polar stereographic u-winds
+
77C> @param VS southern polar stereographic v-winds
+
78C>
+
79C> @author Iredell @date 96-02-29
+
+
80 SUBROUTINE sptgpsv(IROMB,MAXWV,KMAX,NPS,
+
81 & KWSKIP,KGSKIP,NISKIP,NJSKIP,
+
82 & TRUE,XMESH,ORIENT,WAVED,WAVEZ,UN,VN,US,VS)
+
83
+
84 REAL WAVED(*),WAVEZ(*),UN(*),VN(*),US(*),VS(*)
+
85 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
+
86 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
87 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
88 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
+
89 INTEGER MP(2*KMAX)
+
90 REAL SLON(MAXWV,8),CLON(MAXWV,8),SROT(0:3),CROT(0:3)
+
91 REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,2*KMAX)
+
92 REAL WTOP(2*(MAXWV+1),2*KMAX)
+
93 REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
+
94 REAL F(2*MAXWV+3,2,2*KMAX)
+
95 DATA srot/0.,1.,0.,-1./,crot/1.,0.,-1.,0./
+
96 parameter(rerth=6.3712e6)
+
97 parameter(pi=3.14159265358979,dpr=180./pi)
+
98
+
99C CALCULATE PRELIMINARY CONSTANTS
+
100 CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
+
101 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
102 mxtop=maxwv+1
+
103 mdim=2*mx+1
+
104 idim=2*maxwv+3
+
105 kw=kwskip
+
106 kg=kgskip
+
107 ni=niskip
+
108 nj=njskip
+
109 IF(kw.EQ.0) kw=2*mx
+
110 IF(kg.EQ.0) kg=nps*nps
+
111 IF(ni.EQ.0) ni=1
+
112 IF(nj.EQ.0) nj=nps
+
113 mp=1
+
114 nph=(nps-1)/2
+
115 gq=((1.+sin(true/dpr))*rerth/xmesh)**2
+
116 srh=sqrt(0.5)
+
117
+
118C CALCULATE SPECTRAL WINDS
+
119C$OMP PARALLEL DO PRIVATE(KWS)
+
120 DO k=1,kmax
+
121 kws=(k-1)*kw
+
122 CALL spdz2uv(iromb,maxwv,enn1,elonn1,eon,eontop,
+
123 & waved(kws+1),wavez(kws+1),
+
124 & w(1,k),w(1,kmax+k),wtop(1,k),wtop(1,kmax+k))
+
125 ENDDO
+
126
+
127C CALCULATE POLE POINT
+
128 i1=nph+1
+
129 j1=nph+1
+
130 ij1=(i1-1)*ni+(j1-1)*nj+1
+
131 slat1=1.
+
132 clat1=0.
+
133 CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
+
134 & pln,plntop)
+
135 CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
+
136 & clat1,pln,plntop,mp,w,wtop,f)
+
137 coso=cos(orient/dpr)
+
138 sino=sin(orient/dpr)
+
139CDIR$ IVDEP
+
140 DO k=1,kmax
+
141 ku=k
+
142 kv=k+kmax
+
143 ijk1=ij1+(k-1)*kg
+
144 un(ijk1)=2*( coso*f(3,1,ku)+sino*f(3,1,kv))
+
145 vn(ijk1)=2*(-sino*f(3,1,ku)+coso*f(3,1,kv))
+
146 us(ijk1)=2*( coso*f(3,2,ku)-sino*f(3,2,kv))
+
147 vs(ijk1)=2*( sino*f(3,2,ku)+coso*f(3,2,kv))
+
148 ENDDO
+
149
+
150C CALCULATE POINTS ALONG THE ROW AND COLUMN OF THE POLE,
+
151C STARTING AT THE ORIENTATION LONGITUDE AND GOING CLOCKWISE.
+
152C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8)
+
153C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8)
+
154C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8)
+
155C$OMP& PRIVATE(DJ1,DI1,RQ,RR,RADLON,RADLON1,RADLON2,SLAT1,CLAT1)
+
156C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,KU,KV,LR,LI)
+
157 DO j1=1,nph
+
158 i1=nph+1
+
159 radlon=orient/dpr
+
160 j3=nps+1-i1
+
161 i3=j1
+
162 j5=nps+1-j1
+
163 i5=nps+1-i1
+
164 j7=i1
+
165 i7=nps+1-j1
+
166 ij1=(i1-1)*ni+(j1-1)*nj+1
+
167 ij3=(i3-1)*ni+(j3-1)*nj+1
+
168 ij5=(i5-1)*ni+(j5-1)*nj+1
+
169 ij7=(i7-1)*ni+(j7-1)*nj+1
+
170 di1=i1-nph-1
+
171 dj1=j1-nph-1
+
172 rq=di1**2+dj1**2
+
173 slat1=(gq-rq)/(gq+rq)
+
174 clat1=sqrt(1.-slat1**2)
+
175 CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
+
176 & pln,plntop)
+
177 CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
+
178 & clat1,pln,plntop,mp,w,wtop,f)
+
179 DO l=1,maxwv
+
180 slon(l,1)=sin(l*radlon)
+
181 clon(l,1)=cos(l*radlon)
+
182 slon(l,3)=slon(l,1)*crot(mod(1*l,4))
+
183 & -clon(l,1)*srot(mod(1*l,4))
+
184 clon(l,3)=clon(l,1)*crot(mod(1*l,4))
+
185 & +slon(l,1)*srot(mod(1*l,4))
+
186 slon(l,5)=slon(l,1)*crot(mod(2*l,4))
+
187 & -clon(l,1)*srot(mod(2*l,4))
+
188 clon(l,5)=clon(l,1)*crot(mod(2*l,4))
+
189 & +slon(l,1)*srot(mod(2*l,4))
+
190 slon(l,7)=slon(l,1)*crot(mod(3*l,4))
+
191 & -clon(l,1)*srot(mod(3*l,4))
+
192 clon(l,7)=clon(l,1)*crot(mod(3*l,4))
+
193 & +slon(l,1)*srot(mod(3*l,4))
+
194 ENDDO
+
195CDIR$ IVDEP
+
196 DO k=1,kmax
+
197 ku=k
+
198 kv=k+kmax
+
199 ijk1=ij1+(k-1)*kg
+
200 ijk3=ij3+(k-1)*kg
+
201 ijk5=ij5+(k-1)*kg
+
202 ijk7=ij7+(k-1)*kg
+
203 un(ijk1)= f(1,1,ku)
+
204 vn(ijk1)= f(1,1,kv)
+
205 un(ijk3)= f(1,1,kv)
+
206 vn(ijk3)=-f(1,1,ku)
+
207 un(ijk5)=-f(1,1,ku)
+
208 vn(ijk5)=-f(1,1,kv)
+
209 un(ijk7)=-f(1,1,kv)
+
210 vn(ijk7)= f(1,1,ku)
+
211 us(ijk1)=-f(1,2,ku)
+
212 vs(ijk1)=-f(1,2,kv)
+
213 us(ijk3)=-f(1,2,kv)
+
214 vs(ijk3)= f(1,2,ku)
+
215 us(ijk5)= f(1,2,ku)
+
216 vs(ijk5)= f(1,2,kv)
+
217 us(ijk7)= f(1,2,kv)
+
218 vs(ijk7)=-f(1,2,ku)
+
219 ENDDO
+
220 IF(kmax.EQ.1) THEN
+
221 ku=1
+
222 kv=2
+
223 DO l=1,maxwv
+
224 lr=2*l+1
+
225 li=2*l+2
+
226 un(ij1)=un(ij1)+2*(f(lr,1,ku)*clon(l,1)
+
227 & -f(li,1,ku)*slon(l,1))
+
228 vn(ij1)=vn(ij1)+2*(f(lr,1,kv)*clon(l,1)
+
229 & -f(li,1,kv)*slon(l,1))
+
230 un(ij3)=un(ij3)+2*(f(lr,1,kv)*clon(l,3)
+
231 & -f(li,1,kv)*slon(l,3))
+
232 vn(ij3)=vn(ij3)-2*(f(lr,1,ku)*clon(l,3)
+
233 & -f(li,1,ku)*slon(l,3))
+
234 un(ij5)=un(ij5)-2*(f(lr,1,ku)*clon(l,5)
+
235 & -f(li,1,ku)*slon(l,5))
+
236 vn(ij5)=vn(ij5)-2*(f(lr,1,kv)*clon(l,5)
+
237 & -f(li,1,kv)*slon(l,5))
+
238 un(ij7)=un(ij7)-2*(f(lr,1,kv)*clon(l,7)
+
239 & -f(li,1,kv)*slon(l,7))
+
240 vn(ij7)=vn(ij7)+2*(f(lr,1,ku)*clon(l,7)
+
241 & -f(li,1,ku)*slon(l,7))
+
242 us(ij1)=us(ij1)-2*(f(lr,2,ku)*clon(l,5)
+
243 & -f(li,2,ku)*slon(l,5))
+
244 vs(ij1)=vs(ij1)-2*(f(lr,2,kv)*clon(l,5)
+
245 & -f(li,2,kv)*slon(l,5))
+
246 us(ij3)=us(ij3)-2*(f(lr,2,kv)*clon(l,3)
+
247 & -f(li,2,kv)*slon(l,3))
+
248 vs(ij3)=vs(ij3)+2*(f(lr,2,ku)*clon(l,3)
+
249 & -f(li,2,ku)*slon(l,3))
+
250 us(ij5)=us(ij5)+2*(f(lr,2,ku)*clon(l,1)
+
251 & -f(li,2,ku)*slon(l,1))
+
252 vs(ij5)=vs(ij5)+2*(f(lr,2,kv)*clon(l,1)
+
253 & -f(li,2,kv)*slon(l,1))
+
254 us(ij7)=us(ij7)+2*(f(lr,2,kv)*clon(l,7)
+
255 & -f(li,2,kv)*slon(l,7))
+
256 vs(ij7)=vs(ij7)-2*(f(lr,2,ku)*clon(l,7)
+
257 & -f(li,2,ku)*slon(l,7))
+
258 ENDDO
+
259 ELSE
+
260 DO l=1,maxwv
+
261 lr=2*l+1
+
262 li=2*l+2
+
263CDIR$ IVDEP
+
264 DO k=1,kmax
+
265 ku=k
+
266 kv=k+kmax
+
267 ijk1=ij1+(k-1)*kg
+
268 ijk3=ij3+(k-1)*kg
+
269 ijk5=ij5+(k-1)*kg
+
270 ijk7=ij7+(k-1)*kg
+
271 un(ijk1)=un(ijk1)+2*(f(lr,1,ku)*clon(l,1)
+
272 & -f(li,1,ku)*slon(l,1))
+
273 vn(ijk1)=vn(ijk1)+2*(f(lr,1,kv)*clon(l,1)
+
274 & -f(li,1,kv)*slon(l,1))
+
275 un(ijk3)=un(ijk3)+2*(f(lr,1,kv)*clon(l,3)
+
276 & -f(li,1,kv)*slon(l,3))
+
277 vn(ijk3)=vn(ijk3)-2*(f(lr,1,ku)*clon(l,3)
+
278 & -f(li,1,ku)*slon(l,3))
+
279 un(ijk5)=un(ijk5)-2*(f(lr,1,ku)*clon(l,5)
+
280 & -f(li,1,ku)*slon(l,5))
+
281 vn(ijk5)=vn(ijk5)-2*(f(lr,1,kv)*clon(l,5)
+
282 & -f(li,1,kv)*slon(l,5))
+
283 un(ijk7)=un(ijk7)-2*(f(lr,1,kv)*clon(l,7)
+
284 & -f(li,1,kv)*slon(l,7))
+
285 vn(ijk7)=vn(ijk7)+2*(f(lr,1,ku)*clon(l,7)
+
286 & -f(li,1,ku)*slon(l,7))
+
287 us(ijk1)=us(ijk1)-2*(f(lr,2,ku)*clon(l,5)
+
288 & -f(li,2,ku)*slon(l,5))
+
289 vs(ijk1)=vs(ijk1)-2*(f(lr,2,kv)*clon(l,5)
+
290 & -f(li,2,kv)*slon(l,5))
+
291 us(ijk3)=us(ijk3)-2*(f(lr,2,kv)*clon(l,3)
+
292 & -f(li,2,kv)*slon(l,3))
+
293 vs(ijk3)=vs(ijk3)+2*(f(lr,2,ku)*clon(l,3)
+
294 & -f(li,2,ku)*slon(l,3))
+
295 us(ijk5)=us(ijk5)+2*(f(lr,2,ku)*clon(l,1)
+
296 & -f(li,2,ku)*slon(l,1))
+
297 vs(ijk5)=vs(ijk5)+2*(f(lr,2,kv)*clon(l,1)
+
298 & -f(li,2,kv)*slon(l,1))
+
299 us(ijk7)=us(ijk7)+2*(f(lr,2,kv)*clon(l,7)
+
300 & -f(li,2,kv)*slon(l,7))
+
301 vs(ijk7)=vs(ijk7)-2*(f(lr,2,ku)*clon(l,7)
+
302 & -f(li,2,ku)*slon(l,7))
+
303 ENDDO
+
304 ENDDO
+
305 ENDIF
+
306 ENDDO
+
307
+
308C CALCULATE POINTS ON THE MAIN DIAGONALS THROUGH THE POLE,
+
309C STARTING CLOCKWISE OF THE ORIENTATION LONGITUDE AND GOING CLOCKWISE.
+
310C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8)
+
311C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8)
+
312C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8)
+
313C$OMP& PRIVATE(DJ1,DI1,RQ,RR,RADLON,RADLON1,RADLON2,SLAT1,CLAT1)
+
314C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,KU,KV,LR,LI)
+
315 DO j1=1,nph
+
316 i1=j1
+
317 radlon=(orient-45)/dpr
+
318 j3=nps+1-i1
+
319 i3=j1
+
320 j5=nps+1-j1
+
321 i5=nps+1-i1
+
322 j7=i1
+
323 i7=nps+1-j1
+
324 ij1=(i1-1)*ni+(j1-1)*nj+1
+
325 ij3=(i3-1)*ni+(j3-1)*nj+1
+
326 ij5=(i5-1)*ni+(j5-1)*nj+1
+
327 ij7=(i7-1)*ni+(j7-1)*nj+1
+
328 di1=i1-nph-1
+
329 dj1=j1-nph-1
+
330 rq=di1**2+dj1**2
+
331 slat1=(gq-rq)/(gq+rq)
+
332 clat1=sqrt(1.-slat1**2)
+
333 CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
+
334 & pln,plntop)
+
335 CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
+
336 & clat1,pln,plntop,mp,w,wtop,f)
+
337 DO l=1,maxwv
+
338 slon(l,1)=sin(l*radlon)
+
339 clon(l,1)=cos(l*radlon)
+
340 slon(l,3)=slon(l,1)*crot(mod(1*l,4))
+
341 & -clon(l,1)*srot(mod(1*l,4))
+
342 clon(l,3)=clon(l,1)*crot(mod(1*l,4))
+
343 & +slon(l,1)*srot(mod(1*l,4))
+
344 slon(l,5)=slon(l,1)*crot(mod(2*l,4))
+
345 & -clon(l,1)*srot(mod(2*l,4))
+
346 clon(l,5)=clon(l,1)*crot(mod(2*l,4))
+
347 & +slon(l,1)*srot(mod(2*l,4))
+
348 slon(l,7)=slon(l,1)*crot(mod(3*l,4))
+
349 & -clon(l,1)*srot(mod(3*l,4))
+
350 clon(l,7)=clon(l,1)*crot(mod(3*l,4))
+
351 & +slon(l,1)*srot(mod(3*l,4))
+
352 ENDDO
+
353CDIR$ IVDEP
+
354 DO k=1,kmax
+
355 ku=k
+
356 kv=k+kmax
+
357 ijk1=ij1+(k-1)*kg
+
358 ijk3=ij3+(k-1)*kg
+
359 ijk5=ij5+(k-1)*kg
+
360 ijk7=ij7+(k-1)*kg
+
361 un(ijk1)=srh*( f(1,1,ku)+f(1,1,kv))
+
362 vn(ijk1)=srh*(-f(1,1,ku)+f(1,1,kv))
+
363 un(ijk3)=srh*(-f(1,1,ku)+f(1,1,kv))
+
364 vn(ijk3)=srh*(-f(1,1,ku)-f(1,1,kv))
+
365 un(ijk5)=srh*(-f(1,1,ku)-f(1,1,kv))
+
366 vn(ijk5)=srh*( f(1,1,ku)-f(1,1,kv))
+
367 un(ijk7)=srh*( f(1,1,ku)-f(1,1,kv))
+
368 vn(ijk7)=srh*( f(1,1,ku)+f(1,1,kv))
+
369 us(ijk1)=srh*(-f(1,2,ku)-f(1,2,kv))
+
370 vs(ijk1)=srh*( f(1,2,ku)-f(1,2,kv))
+
371 us(ijk3)=srh*( f(1,2,ku)-f(1,2,kv))
+
372 vs(ijk3)=srh*( f(1,2,ku)+f(1,2,kv))
+
373 us(ijk5)=srh*( f(1,2,ku)+f(1,2,kv))
+
374 vs(ijk5)=srh*(-f(1,2,ku)+f(1,2,kv))
+
375 us(ijk7)=srh*(-f(1,2,ku)+f(1,2,kv))
+
376 vs(ijk7)=srh*(-f(1,2,ku)-f(1,2,kv))
+
377 ENDDO
+
378 IF(kmax.EQ.1) THEN
+
379 ku=1
+
380 kv=2
+
381 DO l=1,maxwv
+
382 lr=2*l+1
+
383 li=2*l+2
+
384 un(ij1)=un(ij1)+2*srh*(( f(lr,1,ku)+f(lr,1,kv))
+
385 & *clon(l,1)
+
386 & -( f(li,1,ku)+f(li,1,kv))
+
387 & *slon(l,1))
+
388 vn(ij1)=vn(ij1)+2*srh*((-f(lr,1,ku)+f(lr,1,kv))
+
389 & *clon(l,1)
+
390 & -(-f(li,1,ku)+f(li,1,kv))
+
391 & *slon(l,1))
+
392 un(ij3)=un(ij3)+2*srh*((-f(lr,1,ku)+f(lr,1,kv))
+
393 & *clon(l,3)
+
394 & -(-f(li,1,ku)+f(li,1,kv))
+
395 & *slon(l,3))
+
396 vn(ij3)=vn(ij3)+2*srh*((-f(lr,1,ku)-f(lr,1,kv))
+
397 & *clon(l,3)
+
398 & -(-f(li,1,ku)-f(li,1,kv))
+
399 & *slon(l,3))
+
400 un(ij5)=un(ij5)+2*srh*((-f(lr,1,ku)-f(lr,1,kv))
+
401 & *clon(l,5)
+
402 & -(-f(li,1,ku)-f(li,1,kv))
+
403 & *slon(l,5))
+
404 vn(ij5)=vn(ij5)+2*srh*(( f(lr,1,ku)-f(lr,1,kv))
+
405 & *clon(l,5)
+
406 & -( f(li,1,ku)-f(li,1,kv))
+
407 & *slon(l,5))
+
408 un(ij7)=un(ij7)+2*srh*(( f(lr,1,ku)-f(lr,1,kv))
+
409 & *clon(l,7)
+
410 & -( f(li,1,ku)-f(li,1,kv))
+
411 & *slon(l,7))
+
412 vn(ij7)=vn(ij7)+2*srh*(( f(lr,1,ku)+f(lr,1,kv))
+
413 & *clon(l,7)
+
414 & -( f(li,1,ku)+f(li,1,kv))
+
415 & *slon(l,7))
+
416 us(ij1)=us(ij1)+2*srh*((-f(lr,2,ku)-f(lr,2,kv))
+
417 & *clon(l,3)
+
418 & -(-f(li,2,ku)-f(li,2,kv))
+
419 & *slon(l,3))
+
420 vs(ij1)=vs(ij1)+2*srh*(( f(lr,2,ku)-f(lr,2,kv))
+
421 & *clon(l,3)
+
422 & -( f(li,2,ku)-f(li,2,kv))
+
423 & *slon(l,3))
+
424 us(ij3)=us(ij3)+2*srh*(( f(lr,2,ku)-f(lr,2,kv))
+
425 & *clon(l,1)
+
426 & -( f(li,2,ku)-f(li,2,kv))
+
427 & *slon(l,1))
+
428 vs(ij3)=vs(ij3)+2*srh*(( f(lr,2,ku)+f(lr,2,kv))
+
429 & *clon(l,1)
+
430 & -( f(li,2,ku)+f(li,2,kv))
+
431 & *slon(l,1))
+
432 us(ij5)=us(ij5)+2*srh*(( f(lr,2,ku)+f(lr,2,kv))
+
433 & *clon(l,7)
+
434 & -( f(li,2,ku)+f(li,2,kv))
+
435 & *slon(l,7))
+
436 vs(ij5)=vs(ij5)+2*srh*((-f(lr,2,ku)+f(lr,2,kv))
+
437 & *clon(l,7)
+
438 & -(-f(li,2,ku)+f(li,2,kv))
+
439 & *slon(l,7))
+
440 us(ij7)=us(ij7)+2*srh*((-f(lr,2,ku)+f(lr,2,kv))
+
441 & *clon(l,5)
+
442 & -(-f(li,2,ku)+f(li,2,kv))
+
443 & *slon(l,5))
+
444 vs(ij7)=vs(ij7)+2*srh*((-f(lr,2,ku)-f(lr,2,kv))
+
445 & *clon(l,5)
+
446 & -(-f(li,2,ku)-f(li,2,kv))
+
447 & *slon(l,5))
+
448 ENDDO
+
449 ELSE
+
450 DO l=1,maxwv
+
451 lr=2*l+1
+
452 li=2*l+2
+
453CDIR$ IVDEP
+
454 DO k=1,kmax
+
455 ku=k
+
456 kv=k+kmax
+
457 ijk1=ij1+(k-1)*kg
+
458 ijk3=ij3+(k-1)*kg
+
459 ijk5=ij5+(k-1)*kg
+
460 ijk7=ij7+(k-1)*kg
+
461 un(ijk1)=un(ijk1)+2*srh*(( f(lr,1,ku)+f(lr,1,kv))
+
462 & *clon(l,1)
+
463 & -( f(li,1,ku)+f(li,1,kv))
+
464 & *slon(l,1))
+
465 vn(ijk1)=vn(ijk1)+2*srh*((-f(lr,1,ku)+f(lr,1,kv))
+
466 & *clon(l,1)
+
467 & -(-f(li,1,ku)+f(li,1,kv))
+
468 & *slon(l,1))
+
469 un(ijk3)=un(ijk3)+2*srh*((-f(lr,1,ku)+f(lr,1,kv))
+
470 & *clon(l,3)
+
471 & -(-f(li,1,ku)+f(li,1,kv))
+
472 & *slon(l,3))
+
473 vn(ijk3)=vn(ijk3)+2*srh*((-f(lr,1,ku)-f(lr,1,kv))
+
474 & *clon(l,3)
+
475 & -(-f(li,1,ku)-f(li,1,kv))
+
476 & *slon(l,3))
+
477 un(ijk5)=un(ijk5)+2*srh*((-f(lr,1,ku)-f(lr,1,kv))
+
478 & *clon(l,5)
+
479 & -(-f(li,1,ku)-f(li,1,kv))
+
480 & *slon(l,5))
+
481 vn(ijk5)=vn(ijk5)+2*srh*(( f(lr,1,ku)-f(lr,1,kv))
+
482 & *clon(l,5)
+
483 & -( f(li,1,ku)-f(li,1,kv))
+
484 & *slon(l,5))
+
485 un(ijk7)=un(ijk7)+2*srh*(( f(lr,1,ku)-f(lr,1,kv))
+
486 & *clon(l,7)
+
487 & -( f(li,1,ku)-f(li,1,kv))
+
488 & *slon(l,7))
+
489 vn(ijk7)=vn(ijk7)+2*srh*(( f(lr,1,ku)+f(lr,1,kv))
+
490 & *clon(l,7)
+
491 & -( f(li,1,ku)+f(li,1,kv))
+
492 & *slon(l,7))
+
493 us(ijk1)=us(ijk1)+2*srh*((-f(lr,2,ku)-f(lr,2,kv))
+
494 & *clon(l,3)
+
495 & -(-f(li,2,ku)-f(li,2,kv))
+
496 & *slon(l,3))
+
497 vs(ijk1)=vs(ijk1)+2*srh*(( f(lr,2,ku)-f(lr,2,kv))
+
498 & *clon(l,3)
+
499 & -( f(li,2,ku)-f(li,2,kv))
+
500 & *slon(l,3))
+
501 us(ijk3)=us(ijk3)+2*srh*(( f(lr,2,ku)-f(lr,2,kv))
+
502 & *clon(l,1)
+
503 & -( f(li,2,ku)-f(li,2,kv))
+
504 & *slon(l,1))
+
505 vs(ijk3)=vs(ijk3)+2*srh*(( f(lr,2,ku)+f(lr,2,kv))
+
506 & *clon(l,1)
+
507 & -( f(li,2,ku)+f(li,2,kv))
+
508 & *slon(l,1))
+
509 us(ijk5)=us(ijk5)+2*srh*(( f(lr,2,ku)+f(lr,2,kv))
+
510 & *clon(l,7)
+
511 & -( f(li,2,ku)+f(li,2,kv))
+
512 & *slon(l,7))
+
513 vs(ijk5)=vs(ijk5)+2*srh*((-f(lr,2,ku)+f(lr,2,kv))
+
514 & *clon(l,7)
+
515 & -(-f(li,2,ku)+f(li,2,kv))
+
516 & *slon(l,7))
+
517 us(ijk7)=us(ijk7)+2*srh*((-f(lr,2,ku)+f(lr,2,kv))
+
518 & *clon(l,5)
+
519 & -(-f(li,2,ku)+f(li,2,kv))
+
520 & *slon(l,5))
+
521 vs(ijk7)=vs(ijk7)+2*srh*((-f(lr,2,ku)-f(lr,2,kv))
+
522 & *clon(l,5)
+
523 & -(-f(li,2,ku)-f(li,2,kv))
+
524 & *slon(l,5))
+
525 ENDDO
+
526 ENDDO
+
527 ENDIF
+
528 ENDDO
+
529
+
530C CALCULATE THE REMAINDER OF THE POLAR STEREOGRAPHIC DOMAIN,
+
531C STARTING AT THE SECTOR JUST CLOCKWISE OF THE ORIENTATION LONGITUDE
+
532C AND GOING CLOCKWISE UNTIL ALL EIGHT SECTORS ARE DONE.
+
533C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8)
+
534C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8)
+
535C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8)
+
536C$OMP& PRIVATE(DJ1,DI1,RQ,RR,RADLON,RADLON1,RADLON2,SLAT1,CLAT1)
+
537C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,KU,KV,LR,LI)
+
538 DO j1=1,nph-1
+
539 DO i1=j1+1,nph
+
540 j2=i1
+
541 i2=j1
+
542 j3=nps+1-i1
+
543 i3=j1
+
544 j4=nps+1-j1
+
545 i4=i1
+
546 j5=nps+1-j1
+
547 i5=nps+1-i1
+
548 j6=nps+1-i1
+
549 i6=nps+1-j1
+
550 j7=i1
+
551 i7=nps+1-j1
+
552 j8=j1
+
553 i8=nps+1-i1
+
554 ij1=(i1-1)*ni+(j1-1)*nj+1
+
555 ij2=(i2-1)*ni+(j2-1)*nj+1
+
556 ij3=(i3-1)*ni+(j3-1)*nj+1
+
557 ij4=(i4-1)*ni+(j4-1)*nj+1
+
558 ij5=(i5-1)*ni+(j5-1)*nj+1
+
559 ij6=(i6-1)*ni+(j6-1)*nj+1
+
560 ij7=(i7-1)*ni+(j7-1)*nj+1
+
561 ij8=(i8-1)*ni+(j8-1)*nj+1
+
562 di1=i1-nph-1
+
563 dj1=j1-nph-1
+
564 rq=di1**2+dj1**2
+
565 rr=sqrt(1/rq)
+
566 slat1=(gq-rq)/(gq+rq)
+
567 clat1=sqrt(1.-slat1**2)
+
568 radlon1=orient/dpr+atan(-di1/dj1)
+
569 radlon2=(orient-45)/dpr*2-radlon1
+
570 CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
+
571 & pln,plntop)
+
572 CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
+
573 & clat1,pln,plntop,mp,w,wtop,f)
+
574 DO l=1,maxwv
+
575 slon(l,1)=sin(l*radlon1)
+
576 clon(l,1)=cos(l*radlon1)
+
577 slon(l,2)=sin(l*radlon2)
+
578 clon(l,2)=cos(l*radlon2)
+
579 slon(l,3)=slon(l,1)*crot(mod(1*l,4))
+
580 & -clon(l,1)*srot(mod(1*l,4))
+
581 clon(l,3)=clon(l,1)*crot(mod(1*l,4))
+
582 & +slon(l,1)*srot(mod(1*l,4))
+
583 slon(l,4)=slon(l,2)*crot(mod(1*l,4))
+
584 & -clon(l,2)*srot(mod(1*l,4))
+
585 clon(l,4)=clon(l,2)*crot(mod(1*l,4))
+
586 & +slon(l,2)*srot(mod(1*l,4))
+
587 slon(l,5)=slon(l,1)*crot(mod(2*l,4))
+
588 & -clon(l,1)*srot(mod(2*l,4))
+
589 clon(l,5)=clon(l,1)*crot(mod(2*l,4))
+
590 & +slon(l,1)*srot(mod(2*l,4))
+
591 slon(l,6)=slon(l,2)*crot(mod(2*l,4))
+
592 & -clon(l,2)*srot(mod(2*l,4))
+
593 clon(l,6)=clon(l,2)*crot(mod(2*l,4))
+
594 & +slon(l,2)*srot(mod(2*l,4))
+
595 slon(l,7)=slon(l,1)*crot(mod(3*l,4))
+
596 & -clon(l,1)*srot(mod(3*l,4))
+
597 clon(l,7)=clon(l,1)*crot(mod(3*l,4))
+
598 & +slon(l,1)*srot(mod(3*l,4))
+
599 slon(l,8)=slon(l,2)*crot(mod(3*l,4))
+
600 & -clon(l,2)*srot(mod(3*l,4))
+
601 clon(l,8)=clon(l,2)*crot(mod(3*l,4))
+
602 & +slon(l,2)*srot(mod(3*l,4))
+
603 ENDDO
+
604CDIR$ IVDEP
+
605 DO k=1,kmax
+
606 ku=k
+
607 kv=k+kmax
+
608 ijk1=ij1+(k-1)*kg
+
609 ijk2=ij2+(k-1)*kg
+
610 ijk3=ij3+(k-1)*kg
+
611 ijk4=ij4+(k-1)*kg
+
612 ijk5=ij5+(k-1)*kg
+
613 ijk6=ij6+(k-1)*kg
+
614 ijk7=ij7+(k-1)*kg
+
615 ijk8=ij8+(k-1)*kg
+
616 un(ijk1)=rr*(-dj1*f(1,1,ku)-di1*f(1,1,kv))
+
617 vn(ijk1)=rr*( di1*f(1,1,ku)-dj1*f(1,1,kv))
+
618 un(ijk2)=rr*(-di1*f(1,1,ku)-dj1*f(1,1,kv))
+
619 vn(ijk2)=rr*( dj1*f(1,1,ku)-di1*f(1,1,kv))
+
620 un(ijk3)=rr*( di1*f(1,1,ku)-dj1*f(1,1,kv))
+
621 vn(ijk3)=rr*( dj1*f(1,1,ku)+di1*f(1,1,kv))
+
622 un(ijk4)=rr*( dj1*f(1,1,ku)-di1*f(1,1,kv))
+
623 vn(ijk4)=rr*( di1*f(1,1,ku)+dj1*f(1,1,kv))
+
624 un(ijk5)=rr*( dj1*f(1,1,ku)+di1*f(1,1,kv))
+
625 vn(ijk5)=rr*(-di1*f(1,1,ku)+dj1*f(1,1,kv))
+
626 un(ijk6)=rr*( di1*f(1,1,ku)+dj1*f(1,1,kv))
+
627 vn(ijk6)=rr*(-dj1*f(1,1,ku)+di1*f(1,1,kv))
+
628 un(ijk7)=rr*(-di1*f(1,1,ku)+dj1*f(1,1,kv))
+
629 vn(ijk7)=rr*(-dj1*f(1,1,ku)-di1*f(1,1,kv))
+
630 un(ijk8)=rr*(-dj1*f(1,1,ku)+di1*f(1,1,kv))
+
631 vn(ijk8)=rr*(-di1*f(1,1,ku)-dj1*f(1,1,kv))
+
632 us(ijk1)=rr*( dj1*f(1,2,ku)+di1*f(1,2,kv))
+
633 vs(ijk1)=rr*(-di1*f(1,2,ku)+dj1*f(1,2,kv))
+
634 us(ijk2)=rr*( di1*f(1,2,ku)+dj1*f(1,2,kv))
+
635 vs(ijk2)=rr*(-dj1*f(1,2,ku)+di1*f(1,2,kv))
+
636 us(ijk3)=rr*(-di1*f(1,2,ku)+dj1*f(1,2,kv))
+
637 vs(ijk3)=rr*(-dj1*f(1,2,ku)-di1*f(1,2,kv))
+
638 us(ijk4)=rr*(-dj1*f(1,2,ku)+di1*f(1,2,kv))
+
639 vs(ijk4)=rr*(-di1*f(1,2,ku)-dj1*f(1,2,kv))
+
640 us(ijk5)=rr*(-dj1*f(1,2,ku)-di1*f(1,2,kv))
+
641 vs(ijk5)=rr*( di1*f(1,2,ku)-dj1*f(1,2,kv))
+
642 us(ijk6)=rr*(-di1*f(1,2,ku)-dj1*f(1,2,kv))
+
643 vs(ijk6)=rr*( dj1*f(1,2,ku)-di1*f(1,2,kv))
+
644 us(ijk7)=rr*( di1*f(1,2,ku)-dj1*f(1,2,kv))
+
645 vs(ijk7)=rr*( dj1*f(1,2,ku)+di1*f(1,2,kv))
+
646 us(ijk8)=rr*( dj1*f(1,2,ku)-di1*f(1,2,kv))
+
647 vs(ijk8)=rr*( di1*f(1,2,ku)+dj1*f(1,2,kv))
+
648 ENDDO
+
649 IF(kmax.EQ.1) THEN
+
650 ku=1
+
651 kv=2
+
652 DO l=1,maxwv
+
653 lr=2*l+1
+
654 li=2*l+2
+
655 un(ij1)=un(ij1)+2*rr*((-dj1*f(lr,1,ku)-di1*f(lr,1,kv))
+
656 & *clon(l,1)
+
657 & -(-dj1*f(li,1,ku)-di1*f(li,1,kv))
+
658 & *slon(l,1))
+
659 vn(ij1)=vn(ij1)+2*rr*(( di1*f(lr,1,ku)-dj1*f(lr,1,kv))
+
660 & *clon(l,1)
+
661 & -( di1*f(li,1,ku)-dj1*f(li,1,kv))
+
662 & *slon(l,1))
+
663 un(ij2)=un(ij2)+2*rr*((-di1*f(lr,1,ku)-dj1*f(lr,1,kv))
+
664 & *clon(l,2)
+
665 & -(-di1*f(li,1,ku)-dj1*f(li,1,kv))
+
666 & *slon(l,2))
+
667 vn(ij2)=vn(ij2)+2*rr*(( dj1*f(lr,1,ku)-di1*f(lr,1,kv))
+
668 & *clon(l,2)
+
669 & -( dj1*f(li,1,ku)-di1*f(li,1,kv))
+
670 & *slon(l,2))
+
671 un(ij3)=un(ij3)+2*rr*(( di1*f(lr,1,ku)-dj1*f(lr,1,kv))
+
672 & *clon(l,3)
+
673 & -( di1*f(li,1,ku)-dj1*f(li,1,kv))
+
674 & *slon(l,3))
+
675 vn(ij3)=vn(ij3)+2*rr*(( dj1*f(lr,1,ku)+di1*f(lr,1,kv))
+
676 & *clon(l,3)
+
677 & -( dj1*f(li,1,ku)+di1*f(li,1,kv))
+
678 & *slon(l,3))
+
679 un(ij4)=un(ij4)+2*rr*(( dj1*f(lr,1,ku)-di1*f(lr,1,kv))
+
680 & *clon(l,4)
+
681 & -( dj1*f(li,1,ku)-di1*f(li,1,kv))
+
682 & *slon(l,4))
+
683 vn(ij4)=vn(ij4)+2*rr*(( di1*f(lr,1,ku)+dj1*f(lr,1,kv))
+
684 & *clon(l,4)
+
685 & -( di1*f(li,1,ku)+dj1*f(li,1,kv))
+
686 & *slon(l,4))
+
687 un(ij5)=un(ij5)+2*rr*(( dj1*f(lr,1,ku)+di1*f(lr,1,kv))
+
688 & *clon(l,5)
+
689 & -( dj1*f(li,1,ku)+di1*f(li,1,kv))
+
690 & *slon(l,5))
+
691 vn(ij5)=vn(ij5)+2*rr*((-di1*f(lr,1,ku)+dj1*f(lr,1,kv))
+
692 & *clon(l,5)
+
693 & -(-di1*f(li,1,ku)+dj1*f(li,1,kv))
+
694 & *slon(l,5))
+
695 un(ij6)=un(ij6)+2*rr*(( di1*f(lr,1,ku)+dj1*f(lr,1,kv))
+
696 & *clon(l,6)
+
697 & -( di1*f(li,1,ku)+dj1*f(li,1,kv))
+
698 & *slon(l,6))
+
699 vn(ij6)=vn(ij6)+2*rr*((-dj1*f(lr,1,ku)+di1*f(lr,1,kv))
+
700 & *clon(l,6)
+
701 & -(-dj1*f(li,1,ku)+di1*f(li,1,kv))
+
702 & *slon(l,6))
+
703 un(ij7)=un(ij7)+2*rr*((-di1*f(lr,1,ku)+dj1*f(lr,1,kv))
+
704 & *clon(l,7)
+
705 & -(-di1*f(li,1,ku)+dj1*f(li,1,kv))
+
706 & *slon(l,7))
+
707 vn(ij7)=vn(ij7)+2*rr*((-dj1*f(lr,1,ku)-di1*f(lr,1,kv))
+
708 & *clon(l,7)
+
709 & -(-dj1*f(li,1,ku)-di1*f(li,1,kv))
+
710 & *slon(l,7))
+
711 un(ij8)=un(ij8)+2*rr*((-dj1*f(lr,1,ku)+di1*f(lr,1,kv))
+
712 & *clon(l,8)
+
713 & -(-dj1*f(li,1,ku)+di1*f(li,1,kv))
+
714 & *slon(l,8))
+
715 vn(ij8)=vn(ij8)+2*rr*((-di1*f(lr,1,ku)-dj1*f(lr,1,kv))
+
716 & *clon(l,8)
+
717 & -(-di1*f(li,1,ku)-dj1*f(li,1,kv))
+
718 & *slon(l,8))
+
719 us(ij1)=us(ij1)+2*rr*(( dj1*f(lr,2,ku)+di1*f(lr,2,kv))
+
720 & *clon(l,4)
+
721 & -( dj1*f(li,2,ku)+di1*f(li,2,kv))
+
722 & *slon(l,4))
+
723 vs(ij1)=vs(ij1)+2*rr*((-di1*f(lr,2,ku)+dj1*f(lr,2,kv))
+
724 & *clon(l,4)
+
725 & -(-di1*f(li,2,ku)+dj1*f(li,2,kv))
+
726 & *slon(l,4))
+
727 us(ij2)=us(ij2)+2*rr*(( di1*f(lr,2,ku)+dj1*f(lr,2,kv))
+
728 & *clon(l,3)
+
729 & -( di1*f(li,2,ku)+dj1*f(li,2,kv))
+
730 & *slon(l,3))
+
731 vs(ij2)=vs(ij2)+2*rr*((-dj1*f(lr,2,ku)+di1*f(lr,2,kv))
+
732 & *clon(l,3)
+
733 & -(-dj1*f(li,2,ku)+di1*f(li,2,kv))
+
734 & *slon(l,3))
+
735 us(ij3)=us(ij3)+2*rr*((-di1*f(lr,2,ku)+dj1*f(lr,2,kv))
+
736 & *clon(l,2)
+
737 & -(-di1*f(li,2,ku)+dj1*f(li,2,kv))
+
738 & *slon(l,2))
+
739 vs(ij3)=vs(ij3)+2*rr*((-dj1*f(lr,2,ku)-di1*f(lr,2,kv))
+
740 & *clon(l,2)
+
741 & -(-dj1*f(li,2,ku)-di1*f(li,2,kv))
+
742 & *slon(l,2))
+
743 us(ij4)=us(ij4)+2*rr*((-dj1*f(lr,2,ku)+di1*f(lr,2,kv))
+
744 & *clon(l,1)
+
745 & -(-dj1*f(li,2,ku)+di1*f(li,2,kv))
+
746 & *slon(l,1))
+
747 vs(ij4)=vs(ij4)+2*rr*((-di1*f(lr,2,ku)-dj1*f(lr,2,kv))
+
748 & *clon(l,1)
+
749 & -(-di1*f(li,2,ku)-dj1*f(li,2,kv))
+
750 & *slon(l,1))
+
751 us(ij5)=us(ij5)+2*rr*((-dj1*f(lr,2,ku)-di1*f(lr,2,kv))
+
752 & *clon(l,8)
+
753 & -(-dj1*f(li,2,ku)-di1*f(li,2,kv))
+
754 & *slon(l,8))
+
755 vs(ij5)=vs(ij5)+2*rr*(( di1*f(lr,2,ku)-dj1*f(lr,2,kv))
+
756 & *clon(l,8)
+
757 & -( di1*f(li,2,ku)-dj1*f(li,2,kv))
+
758 & *slon(l,8))
+
759 us(ij6)=us(ij6)+2*rr*((-di1*f(lr,2,ku)-dj1*f(lr,2,kv))
+
760 & *clon(l,7)
+
761 & -(-di1*f(li,2,ku)-dj1*f(li,2,kv))
+
762 & *slon(l,7))
+
763 vs(ij6)=vs(ij6)+2*rr*(( dj1*f(lr,2,ku)-di1*f(lr,2,kv))
+
764 & *clon(l,7)
+
765 & -( dj1*f(li,2,ku)-di1*f(li,2,kv))
+
766 & *slon(l,7))
+
767 us(ij7)=us(ij7)+2*rr*(( di1*f(lr,2,ku)-dj1*f(lr,2,kv))
+
768 & *clon(l,6)
+
769 & -( di1*f(li,2,ku)-dj1*f(li,2,kv))
+
770 & *slon(l,6))
+
771 vs(ij7)=vs(ij7)+2*rr*(( dj1*f(lr,2,ku)+di1*f(lr,2,kv))
+
772 & *clon(l,6)
+
773 & -( dj1*f(li,2,ku)+di1*f(li,2,kv))
+
774 & *slon(l,6))
+
775 us(ij8)=us(ij8)+2*rr*(( dj1*f(lr,2,ku)-di1*f(lr,2,kv))
+
776 & *clon(l,5)
+
777 & -( dj1*f(li,2,ku)-di1*f(li,2,kv))
+
778 & *slon(l,5))
+
779 vs(ij8)=vs(ij8)+2*rr*(( di1*f(lr,2,ku)+dj1*f(lr,2,kv))
+
780 & *clon(l,5)
+
781 & -( di1*f(li,2,ku)+dj1*f(li,2,kv))
+
782 & *slon(l,5))
+
783 ENDDO
+
784 ELSE
+
785 DO l=1,maxwv
+
786 lr=2*l+1
+
787 li=2*l+2
+
788CDIR$ IVDEP
+
789 DO k=1,kmax
+
790 ku=k
+
791 kv=k+kmax
+
792 ijk1=ij1+(k-1)*kg
+
793 ijk2=ij2+(k-1)*kg
+
794 ijk3=ij3+(k-1)*kg
+
795 ijk4=ij4+(k-1)*kg
+
796 ijk5=ij5+(k-1)*kg
+
797 ijk6=ij6+(k-1)*kg
+
798 ijk7=ij7+(k-1)*kg
+
799 ijk8=ij8+(k-1)*kg
+
800 un(ijk1)=un(ijk1)+2*rr*((-dj1*f(lr,1,ku)-di1*f(lr,1,kv))
+
801 & *clon(l,1)
+
802 & -(-dj1*f(li,1,ku)-di1*f(li,1,kv))
+
803 & *slon(l,1))
+
804 vn(ijk1)=vn(ijk1)+2*rr*(( di1*f(lr,1,ku)-dj1*f(lr,1,kv))
+
805 & *clon(l,1)
+
806 & -( di1*f(li,1,ku)-dj1*f(li,1,kv))
+
807 & *slon(l,1))
+
808 un(ijk2)=un(ijk2)+2*rr*((-di1*f(lr,1,ku)-dj1*f(lr,1,kv))
+
809 & *clon(l,2)
+
810 & -(-di1*f(li,1,ku)-dj1*f(li,1,kv))
+
811 & *slon(l,2))
+
812 vn(ijk2)=vn(ijk2)+2*rr*(( dj1*f(lr,1,ku)-di1*f(lr,1,kv))
+
813 & *clon(l,2)
+
814 & -( dj1*f(li,1,ku)-di1*f(li,1,kv))
+
815 & *slon(l,2))
+
816 un(ijk3)=un(ijk3)+2*rr*(( di1*f(lr,1,ku)-dj1*f(lr,1,kv))
+
817 & *clon(l,3)
+
818 & -( di1*f(li,1,ku)-dj1*f(li,1,kv))
+
819 & *slon(l,3))
+
820 vn(ijk3)=vn(ijk3)+2*rr*(( dj1*f(lr,1,ku)+di1*f(lr,1,kv))
+
821 & *clon(l,3)
+
822 & -( dj1*f(li,1,ku)+di1*f(li,1,kv))
+
823 & *slon(l,3))
+
824 un(ijk4)=un(ijk4)+2*rr*(( dj1*f(lr,1,ku)-di1*f(lr,1,kv))
+
825 & *clon(l,4)
+
826 & -( dj1*f(li,1,ku)-di1*f(li,1,kv))
+
827 & *slon(l,4))
+
828 vn(ijk4)=vn(ijk4)+2*rr*(( di1*f(lr,1,ku)+dj1*f(lr,1,kv))
+
829 & *clon(l,4)
+
830 & -( di1*f(li,1,ku)+dj1*f(li,1,kv))
+
831 & *slon(l,4))
+
832 un(ijk5)=un(ijk5)+2*rr*(( dj1*f(lr,1,ku)+di1*f(lr,1,kv))
+
833 & *clon(l,5)
+
834 & -( dj1*f(li,1,ku)+di1*f(li,1,kv))
+
835 & *slon(l,5))
+
836 vn(ijk5)=vn(ijk5)+2*rr*((-di1*f(lr,1,ku)+dj1*f(lr,1,kv))
+
837 & *clon(l,5)
+
838 & -(-di1*f(li,1,ku)+dj1*f(li,1,kv))
+
839 & *slon(l,5))
+
840 un(ijk6)=un(ijk6)+2*rr*(( di1*f(lr,1,ku)+dj1*f(lr,1,kv))
+
841 & *clon(l,6)
+
842 & -( di1*f(li,1,ku)+dj1*f(li,1,kv))
+
843 & *slon(l,6))
+
844 vn(ijk6)=vn(ijk6)+2*rr*((-dj1*f(lr,1,ku)+di1*f(lr,1,kv))
+
845 & *clon(l,6)
+
846 & -(-dj1*f(li,1,ku)+di1*f(li,1,kv))
+
847 & *slon(l,6))
+
848 un(ijk7)=un(ijk7)+2*rr*((-di1*f(lr,1,ku)+dj1*f(lr,1,kv))
+
849 & *clon(l,7)
+
850 & -(-di1*f(li,1,ku)+dj1*f(li,1,kv))
+
851 & *slon(l,7))
+
852 vn(ijk7)=vn(ijk7)+2*rr*((-dj1*f(lr,1,ku)-di1*f(lr,1,kv))
+
853 & *clon(l,7)
+
854 & -(-dj1*f(li,1,ku)-di1*f(li,1,kv))
+
855 & *slon(l,7))
+
856 un(ijk8)=un(ijk8)+2*rr*((-dj1*f(lr,1,ku)+di1*f(lr,1,kv))
+
857 & *clon(l,8)
+
858 & -(-dj1*f(li,1,ku)+di1*f(li,1,kv))
+
859 & *slon(l,8))
+
860 vn(ijk8)=vn(ijk8)+2*rr*((-di1*f(lr,1,ku)-dj1*f(lr,1,kv))
+
861 & *clon(l,8)
+
862 & -(-di1*f(li,1,ku)-dj1*f(li,1,kv))
+
863 & *slon(l,8))
+
864 us(ijk1)=us(ijk1)+2*rr*(( dj1*f(lr,2,ku)+di1*f(lr,2,kv))
+
865 & *clon(l,4)
+
866 & -( dj1*f(li,2,ku)+di1*f(li,2,kv))
+
867 & *slon(l,4))
+
868 vs(ijk1)=vs(ijk1)+2*rr*((-di1*f(lr,2,ku)+dj1*f(lr,2,kv))
+
869 & *clon(l,4)
+
870 & -(-di1*f(li,2,ku)+dj1*f(li,2,kv))
+
871 & *slon(l,4))
+
872 us(ijk2)=us(ijk2)+2*rr*(( di1*f(lr,2,ku)+dj1*f(lr,2,kv))
+
873 & *clon(l,3)
+
874 & -( di1*f(li,2,ku)+dj1*f(li,2,kv))
+
875 & *slon(l,3))
+
876 vs(ijk2)=vs(ijk2)+2*rr*((-dj1*f(lr,2,ku)+di1*f(lr,2,kv))
+
877 & *clon(l,3)
+
878 & -(-dj1*f(li,2,ku)+di1*f(li,2,kv))
+
879 & *slon(l,3))
+
880 us(ijk3)=us(ijk3)+2*rr*((-di1*f(lr,2,ku)+dj1*f(lr,2,kv))
+
881 & *clon(l,2)
+
882 & -(-di1*f(li,2,ku)+dj1*f(li,2,kv))
+
883 & *slon(l,2))
+
884 vs(ijk3)=vs(ijk3)+2*rr*((-dj1*f(lr,2,ku)-di1*f(lr,2,kv))
+
885 & *clon(l,2)
+
886 & -(-dj1*f(li,2,ku)-di1*f(li,2,kv))
+
887 & *slon(l,2))
+
888 us(ijk4)=us(ijk4)+2*rr*((-dj1*f(lr,2,ku)+di1*f(lr,2,kv))
+
889 & *clon(l,1)
+
890 & -(-dj1*f(li,2,ku)+di1*f(li,2,kv))
+
891 & *slon(l,1))
+
892 vs(ijk4)=vs(ijk4)+2*rr*((-di1*f(lr,2,ku)-dj1*f(lr,2,kv))
+
893 & *clon(l,1)
+
894 & -(-di1*f(li,2,ku)-dj1*f(li,2,kv))
+
895 & *slon(l,1))
+
896 us(ijk5)=us(ijk5)+2*rr*((-dj1*f(lr,2,ku)-di1*f(lr,2,kv))
+
897 & *clon(l,8)
+
898 & -(-dj1*f(li,2,ku)-di1*f(li,2,kv))
+
899 & *slon(l,8))
+
900 vs(ijk5)=vs(ijk5)+2*rr*(( di1*f(lr,2,ku)-dj1*f(lr,2,kv))
+
901 & *clon(l,8)
+
902 & -( di1*f(li,2,ku)-dj1*f(li,2,kv))
+
903 & *slon(l,8))
+
904 us(ijk6)=us(ijk6)+2*rr*((-di1*f(lr,2,ku)-dj1*f(lr,2,kv))
+
905 & *clon(l,7)
+
906 & -(-di1*f(li,2,ku)-dj1*f(li,2,kv))
+
907 & *slon(l,7))
+
908 vs(ijk6)=vs(ijk6)+2*rr*(( dj1*f(lr,2,ku)-di1*f(lr,2,kv))
+
909 & *clon(l,7)
+
910 & -( dj1*f(li,2,ku)-di1*f(li,2,kv))
+
911 & *slon(l,7))
+
912 us(ijk7)=us(ijk7)+2*rr*(( di1*f(lr,2,ku)-dj1*f(lr,2,kv))
+
913 & *clon(l,6)
+
914 & -( di1*f(li,2,ku)-dj1*f(li,2,kv))
+
915 & *slon(l,6))
+
916 vs(ijk7)=vs(ijk7)+2*rr*(( dj1*f(lr,2,ku)+di1*f(lr,2,kv))
+
917 & *clon(l,6)
+
918 & -( dj1*f(li,2,ku)+di1*f(li,2,kv))
+
919 & *slon(l,6))
+
920 us(ijk8)=us(ijk8)+2*rr*(( dj1*f(lr,2,ku)-di1*f(lr,2,kv))
+
921 & *clon(l,5)
+
922 & -( dj1*f(li,2,ku)-di1*f(li,2,kv))
+
923 & *slon(l,5))
+
924 vs(ijk8)=vs(ijk8)+2*rr*(( di1*f(lr,2,ku)+dj1*f(lr,2,kv))
+
925 & *clon(l,5)
+
926 & -( di1*f(li,2,ku)+dj1*f(li,2,kv))
+
927 & *slon(l,5))
+
928 ENDDO
+
929 ENDDO
+
930 ENDIF
+
931 ENDDO
+
932 ENDDO
+
933
+
+
934 END
+
subroutine spdz2uv(i, m, enn1, elonn1, eon, eontop, d, z, u, v, utop, vtop)
Computes the wind components from divergence and vorticity in spectral space.
Definition spdz2uv.f:49
+
subroutine splegend(i, m, slat, clat, eps, epstop, pln, plntop)
Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
Definition splegend.f:45
+
subroutine spsynth(i, m, im, ix, nc, nctop, km, clat, pln, plntop, mp, spc, spctop, f)
Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
Definition spsynth.f:39
+
subroutine sptgpsv(iromb, maxwv, kmax, nps, kwskip, kgskip, niskip, njskip, true, xmesh, orient, waved, wavez, un, vn, us, vs)
This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
Definition sptgpsv.f:83
+
subroutine spwget(iromb, maxwv, eps, epstop, enn1, elonn1, eon, eontop)
This subprogram gets wave-space constants.
Definition spwget.f:18
diff --git a/sptgpt_8f.html b/sptgpt_8f.html index 2d0b850b..e099cb0a 100644 --- a/sptgpt_8f.html +++ b/sptgpt_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgpt.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgpt.f File Reference
+
sptgpt.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptgpt (IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVE, GP)
 This subprogram performs a spherical transform from spectral coefficients of scalar quantities to specified sets of station points on the globe. More...
 
subroutine sptgpt (iromb, maxwv, kmax, nmax, kwskip, kgskip, nrskip, ngskip, rlat, rlon, wave, gp)
 This subprogram performs a spherical transform from spectral coefficients of scalar quantities to specified sets of station points on the globe.
 

Detailed Description

Transform spectral scalar to station points.

@@ -112,15 +118,15 @@

1998-12-15 Iredell Openmp directives inserted. -2003-06-30 Iredell Use spfftpt(). +2003-06-30 Iredell Use spfftpt().
Author
Iredell
Date
96-02-29

Definition in file sptgpt.f.

Function/Subroutine Documentation

- -

◆ sptgpt()

+ +

◆ sptgpt()

diff --git a/sptgpt_8f.js b/sptgpt_8f.js index 708e1051..101e3c1e 100644 --- a/sptgpt_8f.js +++ b/sptgpt_8f.js @@ -1,4 +1,4 @@ var sptgpt_8f = [ - [ "sptgpt", "sptgpt_8f.html#a1b8d333bcc601e5b7e8d3dd1369f54b1", null ] + [ "sptgpt", "sptgpt_8f.html#af93cf936e85b91e804de516feb6fb42c", null ] ]; \ No newline at end of file diff --git a/sptgpt_8f_source.html b/sptgpt_8f_source.html index 70741732..de8374ca 100644 --- a/sptgpt_8f_source.html +++ b/sptgpt_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgpt.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,132 +81,140 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgpt.f
+
sptgpt.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Transform spectral scalar to station points.
-
3 C>
-
4 C> ### Program History Log
-
5 C> Date | Programmer | Comments
-
6 C> -----|------------|---------
-
7 C> 96-02-29 | Iredell | Initial.
-
8 C> 1998-12-15 | Iredell | Openmp directives inserted.
-
9 C> 2003-06-30 | Iredell | Use spfftpt().
-
10 C>
-
11 C> @author Iredell @date 96-02-29
-
12 
-
13 C> This subprogram performs a spherical transform
-
14 c> from spectral coefficients of scalar quantities
-
15 c> to specified sets of station points on the globe.
-
16 C>
-
17 C> The wave-space can be either triangular or rhomboidal.
-
18 C>
-
19 C> The wave and point fields may have general indexing,
-
20 c> but each wave field is in sequential 'IBM order',
-
21 c> i.e. with zonal wavenumber as the slower index.
-
22 C>
-
23 C> The transforms are all multiprocessed over stations.
-
24 C>
-
25 C> Transform several fields at a time to improve vectorization.
-
26 C>
-
27 C> Subprogram can be called from a multiprocessing environment.
-
28 C>
-
29 C> @param IROMB spectral domain shape
-
30 C> (0 for triangular, 1 for rhomboidal)
-
31 C> @param MAXWV spectral truncation
-
32 C> @param KMAX number of fields to transform.
-
33 C> @param NMAX number of station points to return
-
34 C> @param KWSKIP skip number between wave fields
-
35 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
-
36 C> @param KGSKIP skip number between station point sets
-
37 C> (defaults to NMAX if KGSKIP=0)
-
38 C> @param NRSKIP skip number between station lats and lons
-
39 C> (defaults to 1 if NRSKIP=0)
-
40 C> @param NGSKIP skip number between station points
-
41 C> (defaults to 1 if NGSKIP=0)
-
42 C> @param RLAT station latitudes in degrees
-
43 C> @param RLON station longitudes in degrees
-
44 C> @param WAVE wave fields
-
45 C> @param GP station point sets
-
46 C>
-
47 C> @author Iredell @date 96-02-29
-
48  SUBROUTINE sptgpt(IROMB,MAXWV,KMAX,NMAX,
-
49  & KWSKIP,KGSKIP,NRSKIP,NGSKIP,
-
50  & RLAT,RLON,WAVE,GP)
-
51 
-
52  REAL RLAT(*),RLON(*),WAVE(*),GP(*)
-
53  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
-
54  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
55  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
56  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
-
57  INTEGER MP(KMAX)
-
58  REAL WTOP(2*(MAXWV+1),KMAX)
-
59  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
-
60  REAL F(2*MAXWV+3,2,KMAX)
-
61  parameter(pi=3.14159265358979)
-
62 
-
63 C CALCULATE PRELIMINARY CONSTANTS
-
64  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
-
65  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
66  mxtop=maxwv+1
-
67  idim=2*maxwv+3
-
68  kw=kwskip
-
69  kg=kgskip
-
70  nr=nrskip
-
71  ng=ngskip
-
72  IF(kw.EQ.0) kw=2*mx
-
73  IF(kg.EQ.0) kg=nmax
-
74  IF(nr.EQ.0) nr=1
-
75  IF(ng.EQ.0) ng=1
-
76  mp=0
-
77 C$OMP PARALLEL DO
-
78  DO k=1,kmax
-
79  wtop(1:2*mxtop,k)=0
-
80  ENDDO
-
81 
-
82 C CALCULATE STATION FIELDS
-
83 C$OMP PARALLEL DO PRIVATE(RADLAT,SLAT1,CLAT1)
-
84 C$OMP& PRIVATE(PLN,PLNTOP,F,NK)
-
85  DO n=1,nmax
-
86  radlat=pi/180*rlat((n-1)*nr+1)
-
87  IF(rlat((n-1)*nr+1).GE.89.9995) THEN
-
88  slat1=1.
-
89  clat1=0.
-
90  ELSEIF(rlat((n-1)*nr+1).LE.-89.9995) THEN
-
91  slat1=-1.
-
92  clat1=0.
-
93  ELSE
-
94  slat1=sin(radlat)
-
95  clat1=cos(radlat)
-
96  ENDIF
-
97  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
-
98  & pln,plntop)
-
99  CALL spsynth(iromb,maxwv,2*maxwv,idim,kw,2*mxtop,kmax,
-
100  & clat1,pln,plntop,mp,wave,wtop,f)
-
101  CALL spfftpt(maxwv,1,2*maxwv+3,kg,kmax,rlon((n-1)*nr+1),
-
102  & f,gp((n-1)*ng+1))
-
103  ENDDO
-
104  END
-
subroutine spfftpt(M, N, INCW, INCG, KMAX, RLON, W, G)
This subprogram computes a slow Fourier transform from Fourier space to a set of gridpoints.
Definition: spfftpt.f:23
-
subroutine splegend(I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
Definition: splegend.f:45
-
subroutine spsynth(I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
Definition: spsynth.f:39
-
subroutine sptgpt(IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVE, GP)
This subprogram performs a spherical transform from spectral coefficients of scalar quantities to spe...
Definition: sptgpt.f:51
-
subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
This subprogram gets wave-space constants.
Definition: spwget.f:18
+Go to the documentation of this file.
1C> @file
+
2C> @brief Transform spectral scalar to station points.
+
3C>
+
4C> ### Program History Log
+
5C> Date | Programmer | Comments
+
6C> -----|------------|---------
+
7C> 96-02-29 | Iredell | Initial.
+
8C> 1998-12-15 | Iredell | Openmp directives inserted.
+
9C> 2003-06-30 | Iredell | Use spfftpt().
+
10C>
+
11C> @author Iredell @date 96-02-29
+
12
+
13C> This subprogram performs a spherical transform
+
14c> from spectral coefficients of scalar quantities
+
15c> to specified sets of station points on the globe.
+
16C>
+
17C> The wave-space can be either triangular or rhomboidal.
+
18C>
+
19C> The wave and point fields may have general indexing,
+
20c> but each wave field is in sequential 'IBM order',
+
21c> i.e. with zonal wavenumber as the slower index.
+
22C>
+
23C> The transforms are all multiprocessed over stations.
+
24C>
+
25C> Transform several fields at a time to improve vectorization.
+
26C>
+
27C> Subprogram can be called from a multiprocessing environment.
+
28C>
+
29C> @param IROMB spectral domain shape
+
30C> (0 for triangular, 1 for rhomboidal)
+
31C> @param MAXWV spectral truncation
+
32C> @param KMAX number of fields to transform.
+
33C> @param NMAX number of station points to return
+
34C> @param KWSKIP skip number between wave fields
+
35C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
+
36C> @param KGSKIP skip number between station point sets
+
37C> (defaults to NMAX if KGSKIP=0)
+
38C> @param NRSKIP skip number between station lats and lons
+
39C> (defaults to 1 if NRSKIP=0)
+
40C> @param NGSKIP skip number between station points
+
41C> (defaults to 1 if NGSKIP=0)
+
42C> @param RLAT station latitudes in degrees
+
43C> @param RLON station longitudes in degrees
+
44C> @param WAVE wave fields
+
45C> @param GP station point sets
+
46C>
+
47C> @author Iredell @date 96-02-29
+
+
48 SUBROUTINE sptgpt(IROMB,MAXWV,KMAX,NMAX,
+
49 & KWSKIP,KGSKIP,NRSKIP,NGSKIP,
+
50 & RLAT,RLON,WAVE,GP)
+
51
+
52 REAL RLAT(*),RLON(*),WAVE(*),GP(*)
+
53 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
+
54 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
55 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
56 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
+
57 INTEGER MP(KMAX)
+
58 REAL WTOP(2*(MAXWV+1),KMAX)
+
59 REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
+
60 REAL F(2*MAXWV+3,2,KMAX)
+
61 parameter(pi=3.14159265358979)
+
62
+
63C CALCULATE PRELIMINARY CONSTANTS
+
64 CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
+
65 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
66 mxtop=maxwv+1
+
67 idim=2*maxwv+3
+
68 kw=kwskip
+
69 kg=kgskip
+
70 nr=nrskip
+
71 ng=ngskip
+
72 IF(kw.EQ.0) kw=2*mx
+
73 IF(kg.EQ.0) kg=nmax
+
74 IF(nr.EQ.0) nr=1
+
75 IF(ng.EQ.0) ng=1
+
76 mp=0
+
77C$OMP PARALLEL DO
+
78 DO k=1,kmax
+
79 wtop(1:2*mxtop,k)=0
+
80 ENDDO
+
81
+
82C CALCULATE STATION FIELDS
+
83C$OMP PARALLEL DO PRIVATE(RADLAT,SLAT1,CLAT1)
+
84C$OMP& PRIVATE(PLN,PLNTOP,F,NK)
+
85 DO n=1,nmax
+
86 radlat=pi/180*rlat((n-1)*nr+1)
+
87 IF(rlat((n-1)*nr+1).GE.89.9995) THEN
+
88 slat1=1.
+
89 clat1=0.
+
90 ELSEIF(rlat((n-1)*nr+1).LE.-89.9995) THEN
+
91 slat1=-1.
+
92 clat1=0.
+
93 ELSE
+
94 slat1=sin(radlat)
+
95 clat1=cos(radlat)
+
96 ENDIF
+
97 CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
+
98 & pln,plntop)
+
99 CALL spsynth(iromb,maxwv,2*maxwv,idim,kw,2*mxtop,kmax,
+
100 & clat1,pln,plntop,mp,wave,wtop,f)
+
101 CALL spfftpt(maxwv,1,2*maxwv+3,kg,kmax,rlon((n-1)*nr+1),
+
102 & f,gp((n-1)*ng+1))
+
103 ENDDO
+
+
104 END
+
subroutine spfftpt(m, n, incw, incg, kmax, rlon, w, g)
This subprogram computes a slow Fourier transform from Fourier space to a set of gridpoints.
Definition spfftpt.f:23
+
subroutine splegend(i, m, slat, clat, eps, epstop, pln, plntop)
Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
Definition splegend.f:45
+
subroutine spsynth(i, m, im, ix, nc, nctop, km, clat, pln, plntop, mp, spc, spctop, f)
Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
Definition spsynth.f:39
+
subroutine sptgpt(iromb, maxwv, kmax, nmax, kwskip, kgskip, nrskip, ngskip, rlat, rlon, wave, gp)
This subprogram performs a spherical transform from spectral coefficients of scalar quantities to spe...
Definition sptgpt.f:51
+
subroutine spwget(iromb, maxwv, eps, epstop, enn1, elonn1, eon, eontop)
This subprogram gets wave-space constants.
Definition spwget.f:18
diff --git a/sptgptd_8f.html b/sptgptd_8f.html index 0888fc77..d7a51672 100644 --- a/sptgptd_8f.html +++ b/sptgptd_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgptd.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgptd.f File Reference
+
sptgptd.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptgptd (IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVE, XP, YP)
 This subprogram performs a spherical transform from spectral coefficients of scalar fields to specified sets of station point gradients on the globe. More...
 
subroutine sptgptd (iromb, maxwv, kmax, nmax, kwskip, kgskip, nrskip, ngskip, rlat, rlon, wave, xp, yp)
 This subprogram performs a spherical transform from spectral coefficients of scalar fields to specified sets of station point gradients on the globe.
 

Detailed Description

Transform spectral to station point gradients.

@@ -117,8 +123,8 @@

Definition in file sptgptd.f.

Function/Subroutine Documentation

- -

◆ sptgptd()

+ +

◆ sptgptd()

diff --git a/sptgptd_8f.js b/sptgptd_8f.js index 437951b8..878b9604 100644 --- a/sptgptd_8f.js +++ b/sptgptd_8f.js @@ -1,4 +1,4 @@ var sptgptd_8f = [ - [ "sptgptd", "sptgptd_8f.html#a64d1fe761662182ca3495531152d1cd3", null ] + [ "sptgptd", "sptgptd_8f.html#aac47fe0487fb23d3174456a87134343c", null ] ]; \ No newline at end of file diff --git a/sptgptd_8f_source.html b/sptgptd_8f_source.html index 5d45d7ca..d48e82f4 100644 --- a/sptgptd_8f_source.html +++ b/sptgptd_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgptd.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,104 +81,112 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgptd.f
+
sptgptd.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Transform spectral to station point gradients.
-
3 C>
-
4 C> ### Program History Log
-
5 C> Date | Programmer | Comments
-
6 C> -----|------------|---------
-
7 C> 96-02-29 | Iredell | Initial.
-
8 C> 1998-12-15 | Iredell | Openmp directives inserted.
-
9 C>
-
10 C> @author Iredell @date 96-02-29
-
11 
-
12 C> This subprogram performs a spherical transform
-
13 c> from spectral coefficients of scalar fields
-
14 c> to specified sets of station point gradients on the globe.
-
15 C>
-
16 C> The wave-space can be either triangular or rhomboidal.
-
17 C>
-
18 C> The wave and point fields may have general indexing,
-
19 c> but each wave field is in sequential 'IBM order',
-
20 c> i.e. with zonal wavenumber as the slower index.
-
21 C>
-
22 C> The transforms are all multiprocessed over stations.
-
23 C>
-
24 C> Transform several fields at a time to improve vectorization.
-
25 C>
-
26 C> Subprogram can be called from a multiprocessing environment.
-
27 C>
-
28 C> @param IROMB spectral domain shape
-
29 c> (0 for triangular, 1 for rhomboidal)
-
30 C> @param MAXWV spectral truncation
-
31 C> @param KMAX number of fields to transform.
-
32 C> @param NMAX number of station points to return
-
33 C> @param KWSKIP skip number between wave fields
-
34 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
-
35 C> @param KGSKIP skip number between station point sets
-
36 C> (defaults to NMAX if KGSKIP=0)
-
37 C> @param NRSKIP skip number between station lats and lons
-
38 C> (defaults to 1 if NRSKIP=0)
-
39 C> @param NGSKIP skip number between station points
-
40 c> (defaults to 1 if NGSKIP=0)
-
41 C> @param RLAT station latitudes in degrees
-
42 C> @param RLON station longitudes in degrees
-
43 C> @param WAVE wave fields
-
44 C> @param XP station point x-gradient sets
-
45 C> @param YP station point y-gradient sets
-
46 C>
-
47 C> @author Iredell @date 96-02-29
-
48  SUBROUTINE sptgptd(IROMB,MAXWV,KMAX,NMAX,
-
49  & KWSKIP,KGSKIP,NRSKIP,NGSKIP,
-
50  & RLAT,RLON,WAVE,XP,YP)
-
51 
-
52  REAL RLAT(*),RLON(*),WAVE(*),XP(*),YP(*)
-
53  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
-
54  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
55  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
56  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
-
57  REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
-
58  REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
-
59 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
60 C CALCULATE PRELIMINARY CONSTANTS
-
61  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
-
62  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
63  mdim=2*mx+1
-
64  kw=kwskip
-
65  IF(kw.EQ.0) kw=2*mx
-
66 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
67 C CALCULATE STATION FIELDS
-
68 C$OMP PARALLEL DO PRIVATE(KWS)
-
69  DO k=1,kmax
-
70  kws=(k-1)*kw
-
71  CALL splaplac(iromb,maxwv,enn1,wave(kws+1),wd(1,k),1)
-
72  wz(1:2*mx,k)=0.
-
73  ENDDO
-
74  CALL sptgptv(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
-
75  & rlat,rlon,wd,wz,xp,yp)
-
76 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
77  END
-
subroutine splaplac(I, M, ENN1, Q, QD2, IDIR)
Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
Definition: splaplac.f:25
-
subroutine sptgptd(IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVE, XP, YP)
This subprogram performs a spherical transform from spectral coefficients of scalar fields to specifi...
Definition: sptgptd.f:51
-
subroutine sptgptv(IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVED, WAVEZ, UP, VP)
This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
Definition: sptgptv.f:54
-
subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
This subprogram gets wave-space constants.
Definition: spwget.f:18
+Go to the documentation of this file.
1C> @file
+
2C> @brief Transform spectral to station point gradients.
+
3C>
+
4C> ### Program History Log
+
5C> Date | Programmer | Comments
+
6C> -----|------------|---------
+
7C> 96-02-29 | Iredell | Initial.
+
8C> 1998-12-15 | Iredell | Openmp directives inserted.
+
9C>
+
10C> @author Iredell @date 96-02-29
+
11
+
12C> This subprogram performs a spherical transform
+
13c> from spectral coefficients of scalar fields
+
14c> to specified sets of station point gradients on the globe.
+
15C>
+
16C> The wave-space can be either triangular or rhomboidal.
+
17C>
+
18C> The wave and point fields may have general indexing,
+
19c> but each wave field is in sequential 'IBM order',
+
20c> i.e. with zonal wavenumber as the slower index.
+
21C>
+
22C> The transforms are all multiprocessed over stations.
+
23C>
+
24C> Transform several fields at a time to improve vectorization.
+
25C>
+
26C> Subprogram can be called from a multiprocessing environment.
+
27C>
+
28C> @param IROMB spectral domain shape
+
29c> (0 for triangular, 1 for rhomboidal)
+
30C> @param MAXWV spectral truncation
+
31C> @param KMAX number of fields to transform.
+
32C> @param NMAX number of station points to return
+
33C> @param KWSKIP skip number between wave fields
+
34C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
+
35C> @param KGSKIP skip number between station point sets
+
36C> (defaults to NMAX if KGSKIP=0)
+
37C> @param NRSKIP skip number between station lats and lons
+
38C> (defaults to 1 if NRSKIP=0)
+
39C> @param NGSKIP skip number between station points
+
40c> (defaults to 1 if NGSKIP=0)
+
41C> @param RLAT station latitudes in degrees
+
42C> @param RLON station longitudes in degrees
+
43C> @param WAVE wave fields
+
44C> @param XP station point x-gradient sets
+
45C> @param YP station point y-gradient sets
+
46C>
+
47C> @author Iredell @date 96-02-29
+
+
48 SUBROUTINE sptgptd(IROMB,MAXWV,KMAX,NMAX,
+
49 & KWSKIP,KGSKIP,NRSKIP,NGSKIP,
+
50 & RLAT,RLON,WAVE,XP,YP)
+
51
+
52 REAL RLAT(*),RLON(*),WAVE(*),XP(*),YP(*)
+
53 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
+
54 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
55 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
56 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
+
57 REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
+
58 REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
+
59C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
60C CALCULATE PRELIMINARY CONSTANTS
+
61 CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
+
62 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
63 mdim=2*mx+1
+
64 kw=kwskip
+
65 IF(kw.EQ.0) kw=2*mx
+
66C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
67C CALCULATE STATION FIELDS
+
68C$OMP PARALLEL DO PRIVATE(KWS)
+
69 DO k=1,kmax
+
70 kws=(k-1)*kw
+
71 CALL splaplac(iromb,maxwv,enn1,wave(kws+1),wd(1,k),1)
+
72 wz(1:2*mx,k)=0.
+
73 ENDDO
+
74 CALL sptgptv(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
+
75 & rlat,rlon,wd,wz,xp,yp)
+
76C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+
77 END
+
subroutine splaplac(i, m, enn1, q, qd2, idir)
Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
Definition splaplac.f:25
+
subroutine sptgptd(iromb, maxwv, kmax, nmax, kwskip, kgskip, nrskip, ngskip, rlat, rlon, wave, xp, yp)
This subprogram performs a spherical transform from spectral coefficients of scalar fields to specifi...
Definition sptgptd.f:51
+
subroutine sptgptv(iromb, maxwv, kmax, nmax, kwskip, kgskip, nrskip, ngskip, rlat, rlon, waved, wavez, up, vp)
This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
Definition sptgptv.f:54
+
subroutine spwget(iromb, maxwv, eps, epstop, enn1, elonn1, eon, eontop)
This subprogram gets wave-space constants.
Definition spwget.f:18
diff --git a/sptgptsd_8f.html b/sptgptsd_8f.html index f1b24209..3727809b 100644 --- a/sptgptsd_8f.html +++ b/sptgptsd_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgptsd.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgptsd.f File Reference
+
sptgptsd.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptgptsd (IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVE, GP, XP, YP)
 This subprogram performs a spherical transform from spectral coefficients of scalar quantities to specified sets of station point values and their gradients on the globe. More...
 
subroutine sptgptsd (iromb, maxwv, kmax, nmax, kwskip, kgskip, nrskip, ngskip, rlat, rlon, wave, gp, xp, yp)
 This subprogram performs a spherical transform from spectral coefficients of scalar quantities to specified sets of station point values and their gradients on the globe.
 

Detailed Description

Transform spectral scalar to station points.

@@ -121,8 +127,8 @@

Definition in file sptgptsd.f.

Function/Subroutine Documentation

- -

◆ sptgptsd()

+ +

◆ sptgptsd()

diff --git a/sptgptsd_8f.js b/sptgptsd_8f.js index ccdb5de0..a36e64cf 100644 --- a/sptgptsd_8f.js +++ b/sptgptsd_8f.js @@ -1,4 +1,4 @@ var sptgptsd_8f = [ - [ "sptgptsd", "sptgptsd_8f.html#ad3ab15089a57b493cc74443ea3b3d88f", null ] + [ "sptgptsd", "sptgptsd_8f.html#a7f079778becc7e99aea9c44f81169043", null ] ]; \ No newline at end of file diff --git a/sptgptsd_8f_source.html b/sptgptsd_8f_source.html index dc78dd3d..c99d02c1 100644 --- a/sptgptsd_8f_source.html +++ b/sptgptsd_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgptsd.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,160 +81,168 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgptsd.f
+
sptgptsd.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Transform spectral scalar to station points.
-
3 C> @author Iredell @date 96-02-29
-
4 C>
-
5 C> ### Program History Log
-
6 C> Date | Programmer | Comments
-
7 C> -----|------------|---------
-
8 C> 96-02-29 | Iredell | Initial.
-
9 C> 1998-12-15 | Iredell | Openmp directives inserted.
-
10 C> 1999-08-18 | Iredell | Openmp directive typo fixed.
-
11 C>
-
12 C> @author Iredell @date 96-02-29
-
13 
-
14 C> This subprogram performs a spherical transform
-
15 C> from spectral coefficients of scalar quantities
-
16 C> to specified sets of station point values
-
17 C> and their gradients on the globe.
-
18 C>
-
19 C> The wave-space can be either triangular or rhomboidal.
-
20 C>
-
21 C> The wave and point fields may have general indexing,
-
22 C> but each wave field is in sequential 'IBM order',
-
23 C> i.e. with zonal wavenumber as the slower index.
-
24 C>
-
25 C> The transforms are all multiprocessed over stations.
-
26 C>
-
27 C> Transform several fields at a time to improve vectorization.
-
28 C>
-
29 C> Subprogram can be called from a multiprocessing environment.
-
30 C>
-
31 C> @param IROMB spectral domain shape
-
32 C> (0 for triangular, 1 for rhomboidal)
-
33 C> @param MAXWV spectral truncation
-
34 C> @param KMAX number of fields to transform.
-
35 C> @param NMAX number of station points to return
-
36 C> @param KWSKIP skip number between wave fields
-
37 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
-
38 C> @param KGSKIP skip number between station point sets
-
39 C> (defaults to NMAX if KGSKIP=0)
-
40 C> @param NRSKIP skip number between station lats and lons
-
41 C> (defaults to 1 if NRSKIP=0)
-
42 C> @param NGSKIP skip number between station points
-
43 C> (defaults to 1 if NGSKIP=0)
-
44 C> @param RLAT station latitudes in degrees
-
45 C> @param RLON station longitudes in degrees
-
46 C> @param WAVE wave fields
-
47 C> @param GP station point sets
-
48 C> @param XP station point x-gradient sets
-
49 C> @param YP station point y-gradient sets
-
50 C>
-
51 C> @author Iredell @date 96-02-29
-
52  SUBROUTINE sptgptsd(IROMB,MAXWV,KMAX,NMAX,
-
53  & KWSKIP,KGSKIP,NRSKIP,NGSKIP,
-
54  & RLAT,RLON,WAVE,GP,XP,YP)
-
55 
-
56  REAL RLAT(*),RLON(*),WAVE(*)
-
57  REAL GP(*),XP(*),YP(*)
-
58  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
-
59  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
60  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
61  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
-
62  INTEGER MP(2*KMAX)
-
63  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2,2*KMAX)
-
64  REAL WTOP(2*(MAXWV+1),2*KMAX)
-
65  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
-
66  REAL F(2*MAXWV+2,2,3*KMAX),G(3*KMAX)
-
67  parameter(pi=3.14159265358979)
-
68 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
69 C CALCULATE PRELIMINARY CONSTANTS
-
70  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
-
71  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
72  mxtop=maxwv+1
-
73  mdim=2*mx
-
74  idim=2*maxwv+2
-
75  kw=kwskip
-
76  kg=kgskip
-
77  nr=nrskip
-
78  ng=ngskip
-
79  IF(kw.EQ.0) kw=2*mx
-
80  IF(kg.EQ.0) kg=nmax
-
81  IF(nr.EQ.0) nr=1
-
82  IF(ng.EQ.0) ng=1
-
83  mp(1:kmax)=10
-
84  mp(kmax+1:2*kmax)=1
-
85 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
86 C CALCULATE SPECTRAL WINDS
-
87 C$OMP PARALLEL DO PRIVATE(KWS,KS,KY)
-
88  DO k=1,kmax
-
89  kws=(k-1)*kw
-
90  ks=0*kmax+k
-
91  ky=1*kmax+k
-
92  DO i=1,2*mx
-
93  w(i,ks)=wave(kws+i)
-
94  ENDDO
-
95  DO i=1,2*mxtop
-
96  wtop(i,ks)=0
-
97  ENDDO
-
98  CALL spgrady(iromb,maxwv,enn1,eon,eontop,
-
99  & wave(kws+1),w(1,ky),wtop(1,ky))
-
100  ENDDO
-
101 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
102 C CALCULATE STATION FIELDS
-
103 C$OMP PARALLEL DO PRIVATE(KS,KY,KX,SLAT1,CLAT1)
-
104 C$OMP& PRIVATE(PLN,PLNTOP,F,G,NK)
-
105  DO n=1,nmax
-
106  IF(abs(rlat((n-1)*nr+1)).GE.89.9995) THEN
-
107  slat1=sign(1.,rlat((n-1)*nr+1))
-
108  clat1=0.
-
109  ELSE
-
110  slat1=sin(pi/180*rlat((n-1)*nr+1))
-
111  clat1=cos(pi/180*rlat((n-1)*nr+1))
-
112  ENDIF
-
113  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
-
114  & pln,plntop)
-
115  CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
-
116  & clat1,pln,plntop,mp,w,wtop,f)
-
117  CALL spgradx(maxwv,idim,kmax,mp,clat1,f(1,1,1),f(1,1,2*kmax+1))
-
118  CALL spfftpt(maxwv,1,idim,1,3*kmax,rlon((n-1)*nr+1),f,g)
-
119  DO k=1,kmax
-
120  ks=0*kmax+k
-
121  ky=1*kmax+k
-
122  kx=2*kmax+k
-
123  nk=(n-1)*ng+(k-1)*kg+1
-
124  gp(nk)=g(ks)
-
125  xp(nk)=g(kx)
-
126  yp(nk)=g(ky)
-
127  ENDDO
-
128  ENDDO
-
129 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
130  END
-
subroutine spfftpt(M, N, INCW, INCG, KMAX, RLON, W, G)
This subprogram computes a slow Fourier transform from Fourier space to a set of gridpoints.
Definition: spfftpt.f:23
-
subroutine spgradx(M, INCW, KMAX, MP, CLAT, W, WX)
This subprogram computes the x-gradient of fields in complex Fourier space.
Definition: spgradx.f:38
-
subroutine spgrady(I, M, ENN1, EON, EONTOP, Q, QDY, QDYTOP)
Computes the horizontal vector y-gradient of a scalar field in spectral space.
Definition: spgrady.f:32
-
subroutine splegend(I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
Definition: splegend.f:45
-
subroutine spsynth(I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
Definition: spsynth.f:39
-
subroutine sptgptsd(IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVE, GP, XP, YP)
This subprogram performs a spherical transform from spectral coefficients of scalar quantities to spe...
Definition: sptgptsd.f:55
-
subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
This subprogram gets wave-space constants.
Definition: spwget.f:18
+Go to the documentation of this file.
1C> @file
+
2C> @brief Transform spectral scalar to station points.
+
3C> @author Iredell @date 96-02-29
+
4C>
+
5C> ### Program History Log
+
6C> Date | Programmer | Comments
+
7C> -----|------------|---------
+
8C> 96-02-29 | Iredell | Initial.
+
9C> 1998-12-15 | Iredell | Openmp directives inserted.
+
10C> 1999-08-18 | Iredell | Openmp directive typo fixed.
+
11C>
+
12C> @author Iredell @date 96-02-29
+
13
+
14C> This subprogram performs a spherical transform
+
15C> from spectral coefficients of scalar quantities
+
16C> to specified sets of station point values
+
17C> and their gradients on the globe.
+
18C>
+
19C> The wave-space can be either triangular or rhomboidal.
+
20C>
+
21C> The wave and point fields may have general indexing,
+
22C> but each wave field is in sequential 'IBM order',
+
23C> i.e. with zonal wavenumber as the slower index.
+
24C>
+
25C> The transforms are all multiprocessed over stations.
+
26C>
+
27C> Transform several fields at a time to improve vectorization.
+
28C>
+
29C> Subprogram can be called from a multiprocessing environment.
+
30C>
+
31C> @param IROMB spectral domain shape
+
32C> (0 for triangular, 1 for rhomboidal)
+
33C> @param MAXWV spectral truncation
+
34C> @param KMAX number of fields to transform.
+
35C> @param NMAX number of station points to return
+
36C> @param KWSKIP skip number between wave fields
+
37C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
+
38C> @param KGSKIP skip number between station point sets
+
39C> (defaults to NMAX if KGSKIP=0)
+
40C> @param NRSKIP skip number between station lats and lons
+
41C> (defaults to 1 if NRSKIP=0)
+
42C> @param NGSKIP skip number between station points
+
43C> (defaults to 1 if NGSKIP=0)
+
44C> @param RLAT station latitudes in degrees
+
45C> @param RLON station longitudes in degrees
+
46C> @param WAVE wave fields
+
47C> @param GP station point sets
+
48C> @param XP station point x-gradient sets
+
49C> @param YP station point y-gradient sets
+
50C>
+
51C> @author Iredell @date 96-02-29
+
+
52 SUBROUTINE sptgptsd(IROMB,MAXWV,KMAX,NMAX,
+
53 & KWSKIP,KGSKIP,NRSKIP,NGSKIP,
+
54 & RLAT,RLON,WAVE,GP,XP,YP)
+
55
+
56 REAL RLAT(*),RLON(*),WAVE(*)
+
57 REAL GP(*),XP(*),YP(*)
+
58 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
+
59 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
60 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
61 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
+
62 INTEGER MP(2*KMAX)
+
63 REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2,2*KMAX)
+
64 REAL WTOP(2*(MAXWV+1),2*KMAX)
+
65 REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
+
66 REAL F(2*MAXWV+2,2,3*KMAX),G(3*KMAX)
+
67 parameter(pi=3.14159265358979)
+
68C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
69C CALCULATE PRELIMINARY CONSTANTS
+
70 CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
+
71 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
72 mxtop=maxwv+1
+
73 mdim=2*mx
+
74 idim=2*maxwv+2
+
75 kw=kwskip
+
76 kg=kgskip
+
77 nr=nrskip
+
78 ng=ngskip
+
79 IF(kw.EQ.0) kw=2*mx
+
80 IF(kg.EQ.0) kg=nmax
+
81 IF(nr.EQ.0) nr=1
+
82 IF(ng.EQ.0) ng=1
+
83 mp(1:kmax)=10
+
84 mp(kmax+1:2*kmax)=1
+
85C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
86C CALCULATE SPECTRAL WINDS
+
87C$OMP PARALLEL DO PRIVATE(KWS,KS,KY)
+
88 DO k=1,kmax
+
89 kws=(k-1)*kw
+
90 ks=0*kmax+k
+
91 ky=1*kmax+k
+
92 DO i=1,2*mx
+
93 w(i,ks)=wave(kws+i)
+
94 ENDDO
+
95 DO i=1,2*mxtop
+
96 wtop(i,ks)=0
+
97 ENDDO
+
98 CALL spgrady(iromb,maxwv,enn1,eon,eontop,
+
99 & wave(kws+1),w(1,ky),wtop(1,ky))
+
100 ENDDO
+
101C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
102C CALCULATE STATION FIELDS
+
103C$OMP PARALLEL DO PRIVATE(KS,KY,KX,SLAT1,CLAT1)
+
104C$OMP& PRIVATE(PLN,PLNTOP,F,G,NK)
+
105 DO n=1,nmax
+
106 IF(abs(rlat((n-1)*nr+1)).GE.89.9995) THEN
+
107 slat1=sign(1.,rlat((n-1)*nr+1))
+
108 clat1=0.
+
109 ELSE
+
110 slat1=sin(pi/180*rlat((n-1)*nr+1))
+
111 clat1=cos(pi/180*rlat((n-1)*nr+1))
+
112 ENDIF
+
113 CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
+
114 & pln,plntop)
+
115 CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
+
116 & clat1,pln,plntop,mp,w,wtop,f)
+
117 CALL spgradx(maxwv,idim,kmax,mp,clat1,f(1,1,1),f(1,1,2*kmax+1))
+
118 CALL spfftpt(maxwv,1,idim,1,3*kmax,rlon((n-1)*nr+1),f,g)
+
119 DO k=1,kmax
+
120 ks=0*kmax+k
+
121 ky=1*kmax+k
+
122 kx=2*kmax+k
+
123 nk=(n-1)*ng+(k-1)*kg+1
+
124 gp(nk)=g(ks)
+
125 xp(nk)=g(kx)
+
126 yp(nk)=g(ky)
+
127 ENDDO
+
128 ENDDO
+
129C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+
130 END
+
subroutine spfftpt(m, n, incw, incg, kmax, rlon, w, g)
This subprogram computes a slow Fourier transform from Fourier space to a set of gridpoints.
Definition spfftpt.f:23
+
subroutine spgradx(m, incw, kmax, mp, clat, w, wx)
This subprogram computes the x-gradient of fields in complex Fourier space.
Definition spgradx.f:38
+
subroutine spgrady(i, m, enn1, eon, eontop, q, qdy, qdytop)
Computes the horizontal vector y-gradient of a scalar field in spectral space.
Definition spgrady.f:32
+
subroutine splegend(i, m, slat, clat, eps, epstop, pln, plntop)
Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
Definition splegend.f:45
+
subroutine spsynth(i, m, im, ix, nc, nctop, km, clat, pln, plntop, mp, spc, spctop, f)
Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
Definition spsynth.f:39
+
subroutine sptgptsd(iromb, maxwv, kmax, nmax, kwskip, kgskip, nrskip, ngskip, rlat, rlon, wave, gp, xp, yp)
This subprogram performs a spherical transform from spectral coefficients of scalar quantities to spe...
Definition sptgptsd.f:55
+
subroutine spwget(iromb, maxwv, eps, epstop, enn1, elonn1, eon, eontop)
This subprogram gets wave-space constants.
Definition spwget.f:18
diff --git a/sptgptv_8f.html b/sptgptv_8f.html index ff0ef75b..03f204b8 100644 --- a/sptgptv_8f.html +++ b/sptgptv_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgptv.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgptv.f File Reference
+
sptgptv.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptgptv (IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVED, WAVEZ, UP, VP)
 This subprogram performs a spherical transform from spectral coefficients of divergences and curls to specified sets of station point vectors on the globe. More...
 
subroutine sptgptv (iromb, maxwv, kmax, nmax, kwskip, kgskip, nrskip, ngskip, rlat, rlon, waved, wavez, up, vp)
 This subprogram performs a spherical transform from spectral coefficients of divergences and curls to specified sets of station point vectors on the globe.
 

Detailed Description

Transform spectral vector to station points.

@@ -114,15 +120,15 @@

1999-08-18 IREDELL Openmp directive typo fixed -2003-06-30 IREDELL use spfftpt() +2003-06-30 IREDELL use spfftpt()
Author
IREDELL
Date
96-02-29

Definition in file sptgptv.f.

Function/Subroutine Documentation

- -

◆ sptgptv()

+ +

◆ sptgptv()

diff --git a/sptgptv_8f.js b/sptgptv_8f.js index 59a8e5b1..9c2778e1 100644 --- a/sptgptv_8f.js +++ b/sptgptv_8f.js @@ -1,4 +1,4 @@ var sptgptv_8f = [ - [ "sptgptv", "sptgptv_8f.html#a9af8a22564d132a887a5237f30710f13", null ] + [ "sptgptv", "sptgptv_8f.html#a95a897645f7999969105fdd79a7af886", null ] ]; \ No newline at end of file diff --git a/sptgptv_8f_source.html b/sptgptv_8f_source.html index fb9575ed..e74cd346 100644 --- a/sptgptv_8f_source.html +++ b/sptgptv_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgptv.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,151 +81,159 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgptv.f
+
sptgptv.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Transform spectral vector to station points.
-
3 C>
-
4 C> ### Program History Log
-
5 C> Date | Programmer | Comments
-
6 C> -----|------------|---------
-
7 C> 96-02-29 | IREDELL | Initial
-
8 C> 1998-12-15 | IREDELL | Openmp directives inserted
-
9 C> 1999-08-18 | IREDELL | Openmp directive typo fixed
-
10 C> 2003-06-30 | IREDELL | use spfftpt()
-
11 C>
-
12 C> @author IREDELL @date 96-02-29
-
13 
-
14 C> This subprogram performs a spherical transform
-
15 C> from spectral coefficients of divergences and curls
-
16 C> to specified sets of station point vectors on the globe.
-
17 C>
-
18 C> The wave-space can be either triangular or rhomboidal.
-
19 C>
-
20 C> The wave and point fields may have general indexing,
-
21 C> but each wave field is in sequential 'IBM order',
-
22 C> i.e. with zonal wavenumber as the slower index.
-
23 C>
-
24 C> The transforms are all multiprocessed over stations.
-
25 C>
-
26 C> Transform several fields at a time to improve vectorization.
-
27 C>
-
28 C> Subprogram can be called from a multiprocessing environment.
-
29 C>
-
30 C> @param IROMB spectral domain shape
-
31 c> (0 for triangular, 1 for rhomboidal)
-
32 C> @param MAXWV spectral truncation
-
33 C> @param KMAX number of fields to transform.
-
34 C> @param NMAX number of station points to return
-
35 C> @param KWSKIP skip number between wave fields
-
36 c> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0)
-
37 C> @param KGSKIP skip number between station point sets
-
38 c> (defaults to NMAX IF KGSKIP=0)
-
39 C> @param NRSKIP skip number between station lats and lons
-
40 c> (defaults to 1 if NRSKIP=0)
-
41 C> @param NGSKIP skip number between station points
-
42 c> (defaults to 1 if NGSKIP=0)
-
43 C> @param RLAT station latitudes in degrees
-
44 C> @param RLON station longitudes in degrees
-
45 C> @param WAVED wave divergence fields
-
46 C> @param WAVEZ wave vorticity fields
-
47 C> @param UP station point u-wind sets
-
48 C> @param VP station point v-wind sets
-
49 C>
-
50 C> @author IREDELL @date 96-02-29
-
51  SUBROUTINE sptgptv(IROMB,MAXWV,KMAX,NMAX,
-
52  & KWSKIP,KGSKIP,NRSKIP,NGSKIP,
-
53  & RLAT,RLON,WAVED,WAVEZ,UP,VP)
-
54 
-
55  REAL RLAT(*),RLON(*),WAVED(*),WAVEZ(*),UP(*),VP(*)
-
56  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
-
57  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
58  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
59  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
-
60  INTEGER MP(2*KMAX)
-
61  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,2*KMAX)
-
62  REAL WTOP(2*(MAXWV+1),2*KMAX)
-
63  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
-
64  REAL F(2*MAXWV+3,2,2*KMAX)
-
65  REAL G(2*KMAX)
-
66  parameter(pi=3.14159265358979)
-
67 
-
68 C CALCULATE PRELIMINARY CONSTANTS
-
69  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
-
70  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
71  mxtop=maxwv+1
-
72  mdim=2*mx+1
-
73  idim=2*maxwv+3
-
74  kw=kwskip
-
75  kg=kgskip
-
76  nr=nrskip
-
77  ng=ngskip
-
78  IF(kw.EQ.0) kw=2*mx
-
79  IF(kg.EQ.0) kg=nmax
-
80  IF(nr.EQ.0) nr=1
-
81  IF(ng.EQ.0) ng=1
-
82  mp=1
-
83 
-
84 C CALCULATE SPECTRAL WINDS
-
85 C$OMP PARALLEL DO PRIVATE(KWS)
-
86  DO k=1,kmax
-
87  kws=(k-1)*kw
-
88  CALL spdz2uv(iromb,maxwv,enn1,elonn1,eon,eontop,
-
89  & waved(kws+1),wavez(kws+1),
-
90  & w(1,k),w(1,kmax+k),wtop(1,k),wtop(1,kmax+k))
-
91  ENDDO
-
92 
-
93 C CALCULATE STATION FIELDS
-
94 C$OMP PARALLEL DO PRIVATE(KU,KV,RADLAT,SLAT1,CLAT1)
-
95 C$OMP& PRIVATE(PLN,PLNTOP,F,G,NK)
-
96  DO n=1,nmax
-
97  radlat=pi/180*rlat((n-1)*nr+1)
-
98  IF(rlat((n-1)*nr+1).GE.89.9995) THEN
-
99  slat1=1.
-
100  clat1=0.
-
101  ELSEIF(rlat((n-1)*nr+1).LE.-89.9995) THEN
-
102  slat1=-1.
-
103  clat1=0.
-
104  ELSE
-
105  slat1=sin(radlat)
-
106  clat1=cos(radlat)
-
107  ENDIF
-
108  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
-
109  & pln,plntop)
-
110  CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
-
111  & clat1,pln,plntop,mp,w,wtop,f)
-
112  CALL spfftpt(maxwv,1,2*maxwv+3,1,2*kmax,rlon((n-1)*nr+1),f,g)
-
113  DO k=1,kmax
-
114  ku=k
-
115  kv=k+kmax
-
116  nk=(n-1)*ng+(k-1)*kg+1
-
117  up(nk)=g(ku)
-
118  vp(nk)=g(kv)
-
119  ENDDO
-
120  ENDDO
-
121 
-
122  END
-
subroutine spdz2uv(I, M, ENN1, ELONN1, EON, EONTOP, D, Z, U, V, UTOP, VTOP)
Computes the wind components from divergence and vorticity in spectral space.
Definition: spdz2uv.f:49
-
subroutine spfftpt(M, N, INCW, INCG, KMAX, RLON, W, G)
This subprogram computes a slow Fourier transform from Fourier space to a set of gridpoints.
Definition: spfftpt.f:23
-
subroutine splegend(I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
Definition: splegend.f:45
-
subroutine spsynth(I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
Definition: spsynth.f:39
-
subroutine sptgptv(IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVED, WAVEZ, UP, VP)
This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
Definition: sptgptv.f:54
-
subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
This subprogram gets wave-space constants.
Definition: spwget.f:18
+Go to the documentation of this file.
1C> @file
+
2C> @brief Transform spectral vector to station points.
+
3C>
+
4C> ### Program History Log
+
5C> Date | Programmer | Comments
+
6C> -----|------------|---------
+
7C> 96-02-29 | IREDELL | Initial
+
8C> 1998-12-15 | IREDELL | Openmp directives inserted
+
9C> 1999-08-18 | IREDELL | Openmp directive typo fixed
+
10C> 2003-06-30 | IREDELL | use spfftpt()
+
11C>
+
12C> @author IREDELL @date 96-02-29
+
13
+
14C> This subprogram performs a spherical transform
+
15C> from spectral coefficients of divergences and curls
+
16C> to specified sets of station point vectors on the globe.
+
17C>
+
18C> The wave-space can be either triangular or rhomboidal.
+
19C>
+
20C> The wave and point fields may have general indexing,
+
21C> but each wave field is in sequential 'IBM order',
+
22C> i.e. with zonal wavenumber as the slower index.
+
23C>
+
24C> The transforms are all multiprocessed over stations.
+
25C>
+
26C> Transform several fields at a time to improve vectorization.
+
27C>
+
28C> Subprogram can be called from a multiprocessing environment.
+
29C>
+
30C> @param IROMB spectral domain shape
+
31c> (0 for triangular, 1 for rhomboidal)
+
32C> @param MAXWV spectral truncation
+
33C> @param KMAX number of fields to transform.
+
34C> @param NMAX number of station points to return
+
35C> @param KWSKIP skip number between wave fields
+
36c> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0)
+
37C> @param KGSKIP skip number between station point sets
+
38c> (defaults to NMAX IF KGSKIP=0)
+
39C> @param NRSKIP skip number between station lats and lons
+
40c> (defaults to 1 if NRSKIP=0)
+
41C> @param NGSKIP skip number between station points
+
42c> (defaults to 1 if NGSKIP=0)
+
43C> @param RLAT station latitudes in degrees
+
44C> @param RLON station longitudes in degrees
+
45C> @param WAVED wave divergence fields
+
46C> @param WAVEZ wave vorticity fields
+
47C> @param UP station point u-wind sets
+
48C> @param VP station point v-wind sets
+
49C>
+
50C> @author IREDELL @date 96-02-29
+
+
51 SUBROUTINE sptgptv(IROMB,MAXWV,KMAX,NMAX,
+
52 & KWSKIP,KGSKIP,NRSKIP,NGSKIP,
+
53 & RLAT,RLON,WAVED,WAVEZ,UP,VP)
+
54
+
55 REAL RLAT(*),RLON(*),WAVED(*),WAVEZ(*),UP(*),VP(*)
+
56 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
+
57 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
58 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
59 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
+
60 INTEGER MP(2*KMAX)
+
61 REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,2*KMAX)
+
62 REAL WTOP(2*(MAXWV+1),2*KMAX)
+
63 REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
+
64 REAL F(2*MAXWV+3,2,2*KMAX)
+
65 REAL G(2*KMAX)
+
66 parameter(pi=3.14159265358979)
+
67
+
68C CALCULATE PRELIMINARY CONSTANTS
+
69 CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
+
70 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
71 mxtop=maxwv+1
+
72 mdim=2*mx+1
+
73 idim=2*maxwv+3
+
74 kw=kwskip
+
75 kg=kgskip
+
76 nr=nrskip
+
77 ng=ngskip
+
78 IF(kw.EQ.0) kw=2*mx
+
79 IF(kg.EQ.0) kg=nmax
+
80 IF(nr.EQ.0) nr=1
+
81 IF(ng.EQ.0) ng=1
+
82 mp=1
+
83
+
84C CALCULATE SPECTRAL WINDS
+
85C$OMP PARALLEL DO PRIVATE(KWS)
+
86 DO k=1,kmax
+
87 kws=(k-1)*kw
+
88 CALL spdz2uv(iromb,maxwv,enn1,elonn1,eon,eontop,
+
89 & waved(kws+1),wavez(kws+1),
+
90 & w(1,k),w(1,kmax+k),wtop(1,k),wtop(1,kmax+k))
+
91 ENDDO
+
92
+
93C CALCULATE STATION FIELDS
+
94C$OMP PARALLEL DO PRIVATE(KU,KV,RADLAT,SLAT1,CLAT1)
+
95C$OMP& PRIVATE(PLN,PLNTOP,F,G,NK)
+
96 DO n=1,nmax
+
97 radlat=pi/180*rlat((n-1)*nr+1)
+
98 IF(rlat((n-1)*nr+1).GE.89.9995) THEN
+
99 slat1=1.
+
100 clat1=0.
+
101 ELSEIF(rlat((n-1)*nr+1).LE.-89.9995) THEN
+
102 slat1=-1.
+
103 clat1=0.
+
104 ELSE
+
105 slat1=sin(radlat)
+
106 clat1=cos(radlat)
+
107 ENDIF
+
108 CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
+
109 & pln,plntop)
+
110 CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
+
111 & clat1,pln,plntop,mp,w,wtop,f)
+
112 CALL spfftpt(maxwv,1,2*maxwv+3,1,2*kmax,rlon((n-1)*nr+1),f,g)
+
113 DO k=1,kmax
+
114 ku=k
+
115 kv=k+kmax
+
116 nk=(n-1)*ng+(k-1)*kg+1
+
117 up(nk)=g(ku)
+
118 vp(nk)=g(kv)
+
119 ENDDO
+
120 ENDDO
+
121
+
+
122 END
+
subroutine spdz2uv(i, m, enn1, elonn1, eon, eontop, d, z, u, v, utop, vtop)
Computes the wind components from divergence and vorticity in spectral space.
Definition spdz2uv.f:49
+
subroutine spfftpt(m, n, incw, incg, kmax, rlon, w, g)
This subprogram computes a slow Fourier transform from Fourier space to a set of gridpoints.
Definition spfftpt.f:23
+
subroutine splegend(i, m, slat, clat, eps, epstop, pln, plntop)
Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
Definition splegend.f:45
+
subroutine spsynth(i, m, im, ix, nc, nctop, km, clat, pln, plntop, mp, spc, spctop, f)
Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
Definition spsynth.f:39
+
subroutine sptgptv(iromb, maxwv, kmax, nmax, kwskip, kgskip, nrskip, ngskip, rlat, rlon, waved, wavez, up, vp)
This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
Definition sptgptv.f:54
+
subroutine spwget(iromb, maxwv, eps, epstop, enn1, elonn1, eon, eontop)
This subprogram gets wave-space constants.
Definition spwget.f:18
diff --git a/sptgptvd_8f.html b/sptgptvd_8f.html index 6fb47a35..18a28378 100644 --- a/sptgptvd_8f.html +++ b/sptgptvd_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgptvd.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgptvd.f File Reference
+
sptgptvd.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptgptvd (IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVED, WAVEZ, DP, ZP, UP, VP, UXP, VXP, UYP, VYP)
 This subprogram performs a spherical transform from spectral coefficients of divergences and curls to specified sets of station point vectors and their gradients on the globe. More...
 
subroutine sptgptvd (iromb, maxwv, kmax, nmax, kwskip, kgskip, nrskip, ngskip, rlat, rlon, waved, wavez, dp, zp, up, vp, uxp, vxp, uyp, vyp)
 This subprogram performs a spherical transform from spectral coefficients of divergences and curls to specified sets of station point vectors and their gradients on the globe.
 

Detailed Description

Transform spectral vector to station points.

@@ -119,8 +125,8 @@

Definition in file sptgptvd.f.

Function/Subroutine Documentation

- -

◆ sptgptvd()

+ +

◆ sptgptvd()

diff --git a/sptgptvd_8f.js b/sptgptvd_8f.js index 9a2bc046..a931ac43 100644 --- a/sptgptvd_8f.js +++ b/sptgptvd_8f.js @@ -1,4 +1,4 @@ var sptgptvd_8f = [ - [ "sptgptvd", "sptgptvd_8f.html#ae03c6c76cad685ae1ed32d74bcba6753", null ] + [ "sptgptvd", "sptgptvd_8f.html#a97af133831ac01ede42f45cae1f506b4", null ] ]; \ No newline at end of file diff --git a/sptgptvd_8f_source.html b/sptgptvd_8f_source.html index 53aeaf77..4bb4b620 100644 --- a/sptgptvd_8f_source.html +++ b/sptgptvd_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptgptvd.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,190 +81,198 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptgptvd.f
+
sptgptvd.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Transform spectral vector to station points.
-
3 C>
-
4 C> ### Program History Log
-
5 C> Date | Programmer | Comments
-
6 C> -----|------------|---------
-
7 C> 96-02-29 | Iredell | Initial.
-
8 C> 1998-12-15 | Iredell | Openmp directives inserted.
-
9 C> 1999-08-18 | Iredell | Openmp directive typo fixed.
-
10 C>
-
11 C> @author Iredell @date 96-02-29
-
12 
-
13 C> This subprogram performs a spherical transform
-
14 C> from spectral coefficients of divergences and curls
-
15 C> to specified sets of station point vectors and their
-
16 C> gradients on the globe.
-
17 C>
-
18 C> <pre>
-
19 C> DP=(D(UP)/DLON+D(VP*CLAT)/DLAT)/(R*CLAT)
-
20 C> ZP=(D(VP)/DLON-D(UP*CLAT)/DLAT)/(R*CLAT)
-
21 C> UXP=D(UP*CLAT)/DLON/(R*CLAT)
-
22 C> VXP=D(VP*CLAT)/DLON/(R*CLAT)
-
23 C> UYP=D(UP*CLAT)/DLAT/R
-
24 C> VYP=D(VP*CLAT)/DLAT/R
-
25 C> </pre>
-
26 C>
-
27 C> The wave-space can be either triangular or rhomboidal.
-
28 C>
-
29 C> The wave and point fields may have general indexing,
-
30 C> but each wave field is in sequential 'IBM order',
-
31 C> i.e. with zonal wavenumber as the slower index.
-
32 C>
-
33 C> The transforms are all multiprocessed over stations.
-
34 C>
-
35 C> Transform several fields at a time to improve vectorization.
-
36 C>
-
37 C> Subprogram can be called from a multiprocessing environment.
-
38 C>
-
39 C> @param IROMB spectral domain shape
-
40 C> (0 for triangular, 1 for rhomboidal)
-
41 C> @param MAXWV spectral truncation
-
42 C> @param KMAX number of fields to transform.
-
43 C> @param NMAX number of station points to return
-
44 C> @param KWSKIP skip number between wave fields
-
45 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0)
-
46 C> @param KGSKIP skip number between station point sets
-
47 C> (defaults to NMAX if KGSKIP=0)
-
48 C> @param NRSKIP skip number between station lats and lons
-
49 C> (defaults to 1 if NRSKIP=0)
-
50 C> @param NGSKIP skip number between station points
-
51 C> (defaults to 1 if NGSKIP=0)
-
52 C> @param RLAT station latitudes in degrees
-
53 C> @param RLON station longitudes in degrees
-
54 C> @param WAVED wave divergence fields
-
55 C> @param WAVEZ wave vorticity fields
-
56 C> @param DP station point divergence sets
-
57 C> @param ZP station point vorticity sets
-
58 C> @param UP station point u-wind sets
-
59 C> @param VP station point v-wind sets
-
60 C> @param UXP station point u-wind x-gradient sets
-
61 C> @param VXP station point v-wind x-gradient sets
-
62 C> @param UYP station point u-wind y-gradient sets
-
63 C> @param VYP station point v-wind y-gradient sets
-
64 C>
-
65 C> @author Iredell @date 96-02-29
-
66  SUBROUTINE sptgptvd(IROMB,MAXWV,KMAX,NMAX,
-
67  & KWSKIP,KGSKIP,NRSKIP,NGSKIP,
-
68  & RLAT,RLON,WAVED,WAVEZ,
-
69  & DP,ZP,UP,VP,UXP,VXP,UYP,VYP)
-
70 
-
71  REAL RLAT(*),RLON(*),WAVED(*),WAVEZ(*)
-
72  REAL DP(*),ZP(*),UP(*),VP(*),UXP(*),VXP(*),UYP(*),VYP(*)
-
73  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
-
74  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
75  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
76  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
-
77  INTEGER MP(4*KMAX)
-
78  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2,4*KMAX)
-
79  REAL WTOP(2*(MAXWV+1),4*KMAX)
-
80  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
-
81  REAL F(2*MAXWV+2,2,6*KMAX),G(6*KMAX)
-
82  parameter(pi=3.14159265358979)
-
83 
-
84 C CALCULATE PRELIMINARY CONSTANTS
-
85  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
-
86  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
87  mxtop=maxwv+1
-
88  mdim=2*mx
-
89  idim=2*maxwv+2
-
90  kw=kwskip
-
91  kg=kgskip
-
92  nr=nrskip
-
93  ng=ngskip
-
94  IF(kw.EQ.0) kw=2*mx
-
95  IF(kg.EQ.0) kg=nmax
-
96  IF(nr.EQ.0) nr=1
-
97  IF(ng.EQ.0) ng=1
-
98  mp(1:2*kmax)=0
-
99  mp(2*kmax+1:4*kmax)=1
-
100 
-
101 C CALCULATE SPECTRAL WINDS
-
102 C$OMP PARALLEL DO PRIVATE(KWS,KD,KZ,KU,KV)
-
103  DO k=1,kmax
-
104  kws=(k-1)*kw
-
105  kd=0*kmax+k
-
106  kz=1*kmax+k
-
107  ku=2*kmax+k
-
108  kv=3*kmax+k
-
109  DO i=1,2*mx
-
110  w(i,kd)=waved(kws+i)
-
111  w(i,kz)=wavez(kws+i)
-
112  ENDDO
-
113  DO i=1,2*mxtop
-
114  wtop(i,kd)=0
-
115  wtop(i,kz)=0
-
116  ENDDO
-
117  CALL spdz2uv(iromb,maxwv,enn1,elonn1,eon,eontop,
-
118  & waved(kws+1),wavez(kws+1),
-
119  & w(1,ku),w(1,kv),wtop(1,ku),wtop(1,kv))
-
120  ENDDO
-
121 
-
122 C CALCULATE STATION FIELDS
-
123 C$OMP PARALLEL DO PRIVATE(KD,KZ,KU,KV,KUX,KVX,SLAT1,CLAT1)
-
124 C$OMP& PRIVATE(PLN,PLNTOP,F,G,NK)
-
125  DO n=1,nmax
-
126  ku=2*kmax+1
-
127  kux=4*kmax+1
-
128  IF(abs(rlat((n-1)*nr+1)).GE.89.9995) THEN
-
129  slat1=sign(1.,rlat((n-1)*nr+1))
-
130  clat1=0.
-
131  ELSE
-
132  slat1=sin(pi/180*rlat((n-1)*nr+1))
-
133  clat1=cos(pi/180*rlat((n-1)*nr+1))
-
134  ENDIF
-
135  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
-
136  & pln,plntop)
-
137  CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,4*kmax,
-
138  & clat1,pln,plntop,mp,w,wtop,f)
-
139  CALL spgradx(maxwv,idim,2*kmax,mp(2*kmax+1),clat1,
-
140  & f(1,1,2*kmax+1),f(1,1,4*kmax+1))
-
141  CALL spfftpt(maxwv,1,idim,1,6*kmax,rlon((n-1)*nr+1),f,g)
-
142  DO k=1,kmax
-
143  kd=0*kmax+k
-
144  kz=1*kmax+k
-
145  ku=2*kmax+k
-
146  kv=3*kmax+k
-
147  kux=4*kmax+k
-
148  kvx=5*kmax+k
-
149  nk=(n-1)*ng+(k-1)*kg+1
-
150  dp(nk)=g(kd)
-
151  zp(nk)=g(kz)
-
152  up(nk)=g(ku)
-
153  vp(nk)=g(kv)
-
154  uxp(nk)=g(kux)
-
155  vxp(nk)=g(kvx)
-
156  uyp(nk)=g(kvx)-clat1*g(kz)
-
157  vyp(nk)=clat1*g(kd)-g(kux)
-
158  ENDDO
-
159  ENDDO
-
160  END
-
subroutine spdz2uv(I, M, ENN1, ELONN1, EON, EONTOP, D, Z, U, V, UTOP, VTOP)
Computes the wind components from divergence and vorticity in spectral space.
Definition: spdz2uv.f:49
-
subroutine spfftpt(M, N, INCW, INCG, KMAX, RLON, W, G)
This subprogram computes a slow Fourier transform from Fourier space to a set of gridpoints.
Definition: spfftpt.f:23
-
subroutine spgradx(M, INCW, KMAX, MP, CLAT, W, WX)
This subprogram computes the x-gradient of fields in complex Fourier space.
Definition: spgradx.f:38
-
subroutine splegend(I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
Definition: splegend.f:45
-
subroutine spsynth(I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
Definition: spsynth.f:39
-
subroutine sptgptvd(IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVED, WAVEZ, DP, ZP, UP, VP, UXP, VXP, UYP, VYP)
This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
Definition: sptgptvd.f:70
-
subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
This subprogram gets wave-space constants.
Definition: spwget.f:18
+Go to the documentation of this file.
1C> @file
+
2C> @brief Transform spectral vector to station points.
+
3C>
+
4C> ### Program History Log
+
5C> Date | Programmer | Comments
+
6C> -----|------------|---------
+
7C> 96-02-29 | Iredell | Initial.
+
8C> 1998-12-15 | Iredell | Openmp directives inserted.
+
9C> 1999-08-18 | Iredell | Openmp directive typo fixed.
+
10C>
+
11C> @author Iredell @date 96-02-29
+
12
+
13C> This subprogram performs a spherical transform
+
14C> from spectral coefficients of divergences and curls
+
15C> to specified sets of station point vectors and their
+
16C> gradients on the globe.
+
17C>
+
18C> <pre>
+
19C> DP=(D(UP)/DLON+D(VP*CLAT)/DLAT)/(R*CLAT)
+
20C> ZP=(D(VP)/DLON-D(UP*CLAT)/DLAT)/(R*CLAT)
+
21C> UXP=D(UP*CLAT)/DLON/(R*CLAT)
+
22C> VXP=D(VP*CLAT)/DLON/(R*CLAT)
+
23C> UYP=D(UP*CLAT)/DLAT/R
+
24C> VYP=D(VP*CLAT)/DLAT/R
+
25C> </pre>
+
26C>
+
27C> The wave-space can be either triangular or rhomboidal.
+
28C>
+
29C> The wave and point fields may have general indexing,
+
30C> but each wave field is in sequential 'IBM order',
+
31C> i.e. with zonal wavenumber as the slower index.
+
32C>
+
33C> The transforms are all multiprocessed over stations.
+
34C>
+
35C> Transform several fields at a time to improve vectorization.
+
36C>
+
37C> Subprogram can be called from a multiprocessing environment.
+
38C>
+
39C> @param IROMB spectral domain shape
+
40C> (0 for triangular, 1 for rhomboidal)
+
41C> @param MAXWV spectral truncation
+
42C> @param KMAX number of fields to transform.
+
43C> @param NMAX number of station points to return
+
44C> @param KWSKIP skip number between wave fields
+
45C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0)
+
46C> @param KGSKIP skip number between station point sets
+
47C> (defaults to NMAX if KGSKIP=0)
+
48C> @param NRSKIP skip number between station lats and lons
+
49C> (defaults to 1 if NRSKIP=0)
+
50C> @param NGSKIP skip number between station points
+
51C> (defaults to 1 if NGSKIP=0)
+
52C> @param RLAT station latitudes in degrees
+
53C> @param RLON station longitudes in degrees
+
54C> @param WAVED wave divergence fields
+
55C> @param WAVEZ wave vorticity fields
+
56C> @param DP station point divergence sets
+
57C> @param ZP station point vorticity sets
+
58C> @param UP station point u-wind sets
+
59C> @param VP station point v-wind sets
+
60C> @param UXP station point u-wind x-gradient sets
+
61C> @param VXP station point v-wind x-gradient sets
+
62C> @param UYP station point u-wind y-gradient sets
+
63C> @param VYP station point v-wind y-gradient sets
+
64C>
+
65C> @author Iredell @date 96-02-29
+
+
66 SUBROUTINE sptgptvd(IROMB,MAXWV,KMAX,NMAX,
+
67 & KWSKIP,KGSKIP,NRSKIP,NGSKIP,
+
68 & RLAT,RLON,WAVED,WAVEZ,
+
69 & DP,ZP,UP,VP,UXP,VXP,UYP,VYP)
+
70
+
71 REAL RLAT(*),RLON(*),WAVED(*),WAVEZ(*)
+
72 REAL DP(*),ZP(*),UP(*),VP(*),UXP(*),VXP(*),UYP(*),VYP(*)
+
73 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
+
74 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
75 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
76 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
+
77 INTEGER MP(4*KMAX)
+
78 REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2,4*KMAX)
+
79 REAL WTOP(2*(MAXWV+1),4*KMAX)
+
80 REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
+
81 REAL F(2*MAXWV+2,2,6*KMAX),G(6*KMAX)
+
82 parameter(pi=3.14159265358979)
+
83
+
84C CALCULATE PRELIMINARY CONSTANTS
+
85 CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
+
86 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
87 mxtop=maxwv+1
+
88 mdim=2*mx
+
89 idim=2*maxwv+2
+
90 kw=kwskip
+
91 kg=kgskip
+
92 nr=nrskip
+
93 ng=ngskip
+
94 IF(kw.EQ.0) kw=2*mx
+
95 IF(kg.EQ.0) kg=nmax
+
96 IF(nr.EQ.0) nr=1
+
97 IF(ng.EQ.0) ng=1
+
98 mp(1:2*kmax)=0
+
99 mp(2*kmax+1:4*kmax)=1
+
100
+
101C CALCULATE SPECTRAL WINDS
+
102C$OMP PARALLEL DO PRIVATE(KWS,KD,KZ,KU,KV)
+
103 DO k=1,kmax
+
104 kws=(k-1)*kw
+
105 kd=0*kmax+k
+
106 kz=1*kmax+k
+
107 ku=2*kmax+k
+
108 kv=3*kmax+k
+
109 DO i=1,2*mx
+
110 w(i,kd)=waved(kws+i)
+
111 w(i,kz)=wavez(kws+i)
+
112 ENDDO
+
113 DO i=1,2*mxtop
+
114 wtop(i,kd)=0
+
115 wtop(i,kz)=0
+
116 ENDDO
+
117 CALL spdz2uv(iromb,maxwv,enn1,elonn1,eon,eontop,
+
118 & waved(kws+1),wavez(kws+1),
+
119 & w(1,ku),w(1,kv),wtop(1,ku),wtop(1,kv))
+
120 ENDDO
+
121
+
122C CALCULATE STATION FIELDS
+
123C$OMP PARALLEL DO PRIVATE(KD,KZ,KU,KV,KUX,KVX,SLAT1,CLAT1)
+
124C$OMP& PRIVATE(PLN,PLNTOP,F,G,NK)
+
125 DO n=1,nmax
+
126 ku=2*kmax+1
+
127 kux=4*kmax+1
+
128 IF(abs(rlat((n-1)*nr+1)).GE.89.9995) THEN
+
129 slat1=sign(1.,rlat((n-1)*nr+1))
+
130 clat1=0.
+
131 ELSE
+
132 slat1=sin(pi/180*rlat((n-1)*nr+1))
+
133 clat1=cos(pi/180*rlat((n-1)*nr+1))
+
134 ENDIF
+
135 CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
+
136 & pln,plntop)
+
137 CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,4*kmax,
+
138 & clat1,pln,plntop,mp,w,wtop,f)
+
139 CALL spgradx(maxwv,idim,2*kmax,mp(2*kmax+1),clat1,
+
140 & f(1,1,2*kmax+1),f(1,1,4*kmax+1))
+
141 CALL spfftpt(maxwv,1,idim,1,6*kmax,rlon((n-1)*nr+1),f,g)
+
142 DO k=1,kmax
+
143 kd=0*kmax+k
+
144 kz=1*kmax+k
+
145 ku=2*kmax+k
+
146 kv=3*kmax+k
+
147 kux=4*kmax+k
+
148 kvx=5*kmax+k
+
149 nk=(n-1)*ng+(k-1)*kg+1
+
150 dp(nk)=g(kd)
+
151 zp(nk)=g(kz)
+
152 up(nk)=g(ku)
+
153 vp(nk)=g(kv)
+
154 uxp(nk)=g(kux)
+
155 vxp(nk)=g(kvx)
+
156 uyp(nk)=g(kvx)-clat1*g(kz)
+
157 vyp(nk)=clat1*g(kd)-g(kux)
+
158 ENDDO
+
159 ENDDO
+
+
160 END
+
subroutine spdz2uv(i, m, enn1, elonn1, eon, eontop, d, z, u, v, utop, vtop)
Computes the wind components from divergence and vorticity in spectral space.
Definition spdz2uv.f:49
+
subroutine spfftpt(m, n, incw, incg, kmax, rlon, w, g)
This subprogram computes a slow Fourier transform from Fourier space to a set of gridpoints.
Definition spfftpt.f:23
+
subroutine spgradx(m, incw, kmax, mp, clat, w, wx)
This subprogram computes the x-gradient of fields in complex Fourier space.
Definition spgradx.f:38
+
subroutine splegend(i, m, slat, clat, eps, epstop, pln, plntop)
Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
Definition splegend.f:45
+
subroutine spsynth(i, m, im, ix, nc, nctop, km, clat, pln, plntop, mp, spc, spctop, f)
Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
Definition spsynth.f:39
+
subroutine sptgptvd(iromb, maxwv, kmax, nmax, kwskip, kgskip, nrskip, ngskip, rlat, rlon, waved, wavez, dp, zp, up, vp, uxp, vxp, uyp, vyp)
This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
Definition sptgptvd.f:70
+
subroutine spwget(iromb, maxwv, eps, epstop, enn1, elonn1, eon, eontop)
This subprogram gets wave-space constants.
Definition spwget.f:18
diff --git a/sptran_8f.html b/sptran_8f.html index 9fb66fbb..6197b1ff 100644 --- a/sptran_8f.html +++ b/sptran_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptran.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptran.f File Reference
+
sptran.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptran (IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDN, GRIDS, IDIR)
 This subprogram performs a spherical transform between spectral coefficients of scalar quantities and fields on a global cylindrical grid. More...
 
subroutine sptran (iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, wave, gridn, grids, idir)
 This subprogram performs a spherical transform between spectral coefficients of scalar quantities and fields on a global cylindrical grid.
 

Detailed Description

Perform a scalar spherical transform.

@@ -117,8 +123,8 @@

Definition in file sptran.f.

Function/Subroutine Documentation

- -

◆ sptran()

+ +

◆ sptran()

diff --git a/sptran_8f.js b/sptran_8f.js index ec95a0ac..6c7b330b 100644 --- a/sptran_8f.js +++ b/sptran_8f.js @@ -1,4 +1,4 @@ var sptran_8f = [ - [ "sptran", "sptran_8f.html#af7610e42f0dcd199b8cf80f851dcfed0", null ] + [ "sptran", "sptran_8f.html#adff21f68dffb1652ed2266037f1f6811", null ] ]; \ No newline at end of file diff --git a/sptran_8f_source.html b/sptran_8f_source.html index 88dedaa8..6c8423e2 100644 --- a/sptran_8f_source.html +++ b/sptran_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptran.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,148 +81,156 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptran.f
+
sptran.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Perform a scalar spherical transform.
-
3 C>
-
4 C> ### Program History Log
-
5 C> Date | Programmer | Comments
-
6 C> -----|------------|---------
-
7 C> 96-02-29 | IREDELL | Initial
-
8 C> 1998-12-15 | IREDELL | Generic fft used, openmp directives inserted
-
9 C>
-
10 C> @author IREDELL @date 96-02-29
-
11 
-
12 C> This subprogram performs a spherical transform between spectral
-
13 C> coefficients of scalar quantities and fields on a global
-
14 C> cylindrical grid.
-
15 C>
-
16 C> The wave-space can be either triangular or
-
17 C> rhomboidal.
-
18 C>
-
19 C> The grid-space can be either an equally-spaced grid
-
20 C> (with or without pole points) or a Gaussian grid.
-
21 C>
-
22 C> The wave and grid fields may have general indexing,
-
23 C> but each wave field is in sequential 'IBM order',
-
24 C> i.e. with zonal wavenumber as the slower index.
-
25 C>
-
26 C> Transforms are done in latitude pairs for efficiency;
-
27 C> thus grid arrays for each hemisphere must be passed.
-
28 C> If so requested, just a subset of the latitude pairs
-
29 C> may be transformed in each invocation of the subprogram.
-
30 C>
-
31 C> The transforms are all multiprocessed over latitude except
-
32 C> the transform from Fourier to spectral is multiprocessed
-
33 C> over zonal wavenumber to ensure reproducibility.
-
34 C>
-
35 C> Transform several fields at a time to improve vectorization.
-
36 C> Subprogram can be called from a multiprocessing environment.
-
37 C>
-
38 C> Minimum grid dimensions for unaliased transforms to spectral:
-
39 C> DIMENSION |LINEAR |QUADRATIC
-
40 C> ----------------------- |--------- |-------------
-
41 C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2
-
42 C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1
-
43 C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1
-
44 C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3
-
45 C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3
-
46 C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1
-
47 C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1
-
48 C>
-
49 C> @param IROMB spectral domain shape
-
50 c> (0 for triangular, 1 for rhomboidal)
-
51 C> @param MAXWV spectral truncation
-
52 C> @param IDRT grid identifier
-
53 C> - IDRT=4 for Gaussian grid,
-
54 C> - IDRT=0 for equally-spaced grid including poles,
-
55 C> - IDRT=256 for equally-spaced grid excluding poles
-
56 C> @param IMAX even number of longitudes.
-
57 C> @param JMAX number of latitudes.
-
58 C> @param KMAX number of fields to transform.
-
59 C> @param IPRIME longitude index for the prime meridian.
-
60 C> (defaults to 1 if IPRIME=0)
-
61 C> @param ISKIP skip number between longitudes
-
62 C> (defaults to 1 if ISKIP=0)
-
63 C> @param JNSKIP skip number between n.h. latitudes from north
-
64 C> (defaults to imax if JNSKIP=0)
-
65 C> @param JSSKIP skip number between s.h. latitudes from south
-
66 c> (defaults to -imax if JSSKIP=0)
-
67 C> @param KWSKIP skip number between wave fields
-
68 c> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0)
-
69 C> @param KGSKIP skip number between grid fields
-
70 c> (defaults to IMAX*JMAX IF KGSKIP=0)
-
71 C> @param JBEG latitude index (from pole) to begin transform
-
72 c> (defaults to 1 if JBEG=0)
-
73 C> (if JBEG=0 and IDIR<0, wave is zeroed before transform)
-
74 C> @param JEND latitude index (from pole) to end transform
-
75 c> (defaults to (JMAX+1)/2 IF JEND=0)
-
76 C> @param JCPU number of cpus over which to multiprocess
-
77 C> @param[out] WAVE wave fields if IDIR>0
-
78 C> @param[out] gridn n.h. grid fields (starting at jbeg) if IDIR<0
-
79 C> @param[out] grids s.h. grid fields (starting at jbeg) if IDIR<0
-
80 C> @param IDIR transform flag
-
81 C> (idir>0 for wave to grid, idir<0 for grid to wave)
-
82 C>
-
83 C> @author IREDELL @date 96-02-29
-
84  SUBROUTINE sptran(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
-
85  & IPRIME,ISKIP,JNSKIP,JSSKIP,KWSKIP,KGSKIP,
-
86  & JBEG,JEND,JCPU,
-
87  & WAVE,GRIDN,GRIDS,IDIR)
-
88 
-
89  REAL WAVE(*),GRIDN(*),GRIDS(*)
-
90 
-
91  MX=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
92  ip=iprime
-
93  is=iskip
-
94  jn=jnskip
-
95  js=jsskip
-
96  kw=kwskip
-
97  kg=kgskip
-
98  jb=jbeg
-
99  je=jend
-
100  jc=jcpu
-
101  IF(ip.EQ.0) ip=1
-
102  IF(is.EQ.0) is=1
-
103  IF(jn.EQ.0) jn=imax
-
104  IF(js.EQ.0) js=-jn
-
105  IF(kw.EQ.0) kw=2*mx
-
106  IF(kg.EQ.0) kg=imax*jmax
-
107  IF(jb.EQ.0) jb=1
-
108  IF(je.EQ.0) je=(jmax+1)/2
-
109  IF(jc.EQ.0) jc=ncpus()
-
110 
-
111  IF(idir.LT.0.AND.jbeg.EQ.0) THEN
-
112  DO k=1,kmax
-
113  kws=(k-1)*kw
-
114  wave(kws+1:kws+2*mx)=0
-
115  ENDDO
-
116  ENDIF
-
117 
-
118  CALL sptranf(iromb,maxwv,idrt,imax,jmax,kmax,
-
119  & ip,is,jn,js,kw,kg,jb,je,jc,
-
120  & wave,gridn,grids,idir)
-
121 
-
122  END
-
function ncpus()
Set number of CPUs - the number of processors over which to parallelize.
Definition: ncpus.F:24
-
subroutine sptran(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDN, GRIDS, IDIR)
This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
Definition: sptran.f:88
-
subroutine sptranf(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IP, IS, JN, JS, KW, KG, JB, JE, JC, WAVE, GRIDN, GRIDS, IDIR)
This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
Definition: sptranf.f:77
+Go to the documentation of this file.
1C> @file
+
2C> @brief Perform a scalar spherical transform.
+
3C>
+
4C> ### Program History Log
+
5C> Date | Programmer | Comments
+
6C> -----|------------|---------
+
7C> 96-02-29 | IREDELL | Initial
+
8C> 1998-12-15 | IREDELL | Generic fft used, openmp directives inserted
+
9C>
+
10C> @author IREDELL @date 96-02-29
+
11
+
12C> This subprogram performs a spherical transform between spectral
+
13C> coefficients of scalar quantities and fields on a global
+
14C> cylindrical grid.
+
15C>
+
16C> The wave-space can be either triangular or
+
17C> rhomboidal.
+
18C>
+
19C> The grid-space can be either an equally-spaced grid
+
20C> (with or without pole points) or a Gaussian grid.
+
21C>
+
22C> The wave and grid fields may have general indexing,
+
23C> but each wave field is in sequential 'IBM order',
+
24C> i.e. with zonal wavenumber as the slower index.
+
25C>
+
26C> Transforms are done in latitude pairs for efficiency;
+
27C> thus grid arrays for each hemisphere must be passed.
+
28C> If so requested, just a subset of the latitude pairs
+
29C> may be transformed in each invocation of the subprogram.
+
30C>
+
31C> The transforms are all multiprocessed over latitude except
+
32C> the transform from Fourier to spectral is multiprocessed
+
33C> over zonal wavenumber to ensure reproducibility.
+
34C>
+
35C> Transform several fields at a time to improve vectorization.
+
36C> Subprogram can be called from a multiprocessing environment.
+
37C>
+
38C> Minimum grid dimensions for unaliased transforms to spectral:
+
39C> DIMENSION |LINEAR |QUADRATIC
+
40C> ----------------------- |--------- |-------------
+
41C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2
+
42C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1
+
43C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1
+
44C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3
+
45C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3
+
46C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1
+
47C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1
+
48C>
+
49C> @param IROMB spectral domain shape
+
50c> (0 for triangular, 1 for rhomboidal)
+
51C> @param MAXWV spectral truncation
+
52C> @param IDRT grid identifier
+
53C> - IDRT=4 for Gaussian grid,
+
54C> - IDRT=0 for equally-spaced grid including poles,
+
55C> - IDRT=256 for equally-spaced grid excluding poles
+
56C> @param IMAX even number of longitudes.
+
57C> @param JMAX number of latitudes.
+
58C> @param KMAX number of fields to transform.
+
59C> @param IPRIME longitude index for the prime meridian.
+
60C> (defaults to 1 if IPRIME=0)
+
61C> @param ISKIP skip number between longitudes
+
62C> (defaults to 1 if ISKIP=0)
+
63C> @param JNSKIP skip number between n.h. latitudes from north
+
64C> (defaults to imax if JNSKIP=0)
+
65C> @param JSSKIP skip number between s.h. latitudes from south
+
66c> (defaults to -imax if JSSKIP=0)
+
67C> @param KWSKIP skip number between wave fields
+
68c> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0)
+
69C> @param KGSKIP skip number between grid fields
+
70c> (defaults to IMAX*JMAX IF KGSKIP=0)
+
71C> @param JBEG latitude index (from pole) to begin transform
+
72c> (defaults to 1 if JBEG=0)
+
73C> (if JBEG=0 and IDIR<0, wave is zeroed before transform)
+
74C> @param JEND latitude index (from pole) to end transform
+
75c> (defaults to (JMAX+1)/2 IF JEND=0)
+
76C> @param JCPU number of cpus over which to multiprocess
+
77C> @param[out] WAVE wave fields if IDIR>0
+
78C> @param[out] gridn n.h. grid fields (starting at jbeg) if IDIR<0
+
79C> @param[out] grids s.h. grid fields (starting at jbeg) if IDIR<0
+
80C> @param IDIR transform flag
+
81C> (idir>0 for wave to grid, idir<0 for grid to wave)
+
82C>
+
83C> @author IREDELL @date 96-02-29
+
+
84 SUBROUTINE sptran(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
+
85 & IPRIME,ISKIP,JNSKIP,JSSKIP,KWSKIP,KGSKIP,
+
86 & JBEG,JEND,JCPU,
+
87 & WAVE,GRIDN,GRIDS,IDIR)
+
88
+
89 REAL WAVE(*),GRIDN(*),GRIDS(*)
+
90
+
91 MX=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
92 ip=iprime
+
93 is=iskip
+
94 jn=jnskip
+
95 js=jsskip
+
96 kw=kwskip
+
97 kg=kgskip
+
98 jb=jbeg
+
99 je=jend
+
100 jc=jcpu
+
101 IF(ip.EQ.0) ip=1
+
102 IF(is.EQ.0) is=1
+
103 IF(jn.EQ.0) jn=imax
+
104 IF(js.EQ.0) js=-jn
+
105 IF(kw.EQ.0) kw=2*mx
+
106 IF(kg.EQ.0) kg=imax*jmax
+
107 IF(jb.EQ.0) jb=1
+
108 IF(je.EQ.0) je=(jmax+1)/2
+
109 IF(jc.EQ.0) jc=ncpus()
+
110
+
111 IF(idir.LT.0.AND.jbeg.EQ.0) THEN
+
112 DO k=1,kmax
+
113 kws=(k-1)*kw
+
114 wave(kws+1:kws+2*mx)=0
+
115 ENDDO
+
116 ENDIF
+
117
+
118 CALL sptranf(iromb,maxwv,idrt,imax,jmax,kmax,
+
119 & ip,is,jn,js,kw,kg,jb,je,jc,
+
120 & wave,gridn,grids,idir)
+
121
+
+
122 END
+
function ncpus()
Set number of CPUs - the number of processors over which to parallelize.
Definition ncpus.F:22
+
subroutine sptran(iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, wave, gridn, grids, idir)
This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
Definition sptran.f:88
+
subroutine sptranf(iromb, maxwv, idrt, imax, jmax, kmax, ip, is, jn, js, kw, kg, jb, je, jc, wave, gridn, grids, idir)
This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
Definition sptranf.f:77
diff --git a/sptrand_8f.html b/sptrand_8f.html index d4338b9d..085c337c 100644 --- a/sptrand_8f.html +++ b/sptrand_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptrand.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptrand.f File Reference
+
sptrand.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptrand (IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDMN, GRIDXN, GRIDXS, GRIDYN, GRIDYS, IDIR)
 This subprogram performs a spherical transform between spectral coefficients of scalar fields and their means and gradients on a global cylindrical grid. More...
 
subroutine sptrand (iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, wave, gridmn, gridxn, gridxs, gridyn, gridys, idir)
 This subprogram performs a spherical transform between spectral coefficients of scalar fields and their means and gradients on a global cylindrical grid.
 

Detailed Description

Perform a gradient spherical transform.

@@ -117,8 +123,8 @@

Definition in file sptrand.f.

Function/Subroutine Documentation

- -

◆ sptrand()

+ +

◆ sptrand()

diff --git a/sptrand_8f.js b/sptrand_8f.js index c01144d7..8a8e1248 100644 --- a/sptrand_8f.js +++ b/sptrand_8f.js @@ -1,4 +1,4 @@ var sptrand_8f = [ - [ "sptrand", "sptrand_8f.html#ae810abad32bcbdfb8345a30e50bcc1ef", null ] + [ "sptrand", "sptrand_8f.html#a7086f0e3893ca22fa1e8e66887e5c947", null ] ]; \ No newline at end of file diff --git a/sptrand_8f_source.html b/sptrand_8f_source.html index 5f90bd36..61998ab7 100644 --- a/sptrand_8f_source.html +++ b/sptrand_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptrand.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,177 +81,185 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptrand.f
+
sptrand.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Perform a gradient spherical transform.
-
3 C>
-
4 C> ### Program History Log
-
5 C> Date | Programmer | Comments
-
6 C> -----|------------|---------
-
7 C> 96-02-29 | IREDELL | Initial
-
8 C> 1998-12-15 | IREDELL | openmp directives inserted
-
9 C>
-
10 C> @author Iredell @date 96-02-29
-
11 
-
12 C> This subprogram performs a spherical transform
-
13 C> between spectral coefficients of scalar fields
-
14 C> and their means and gradients on a global cylindrical grid.
-
15 C>
-
16 C> The wave-space can be either triangular or rhomboidal.
-
17 C>
-
18 C> The grid-space can be either an equally-spaced grid
-
19 C> (with or without pole points) or a Gaussian grid.
-
20 C>
-
21 C> The wave and grid fields may have general indexing,
-
22 C> but each wave field is in sequential 'IBM order',
-
23 C> i.e. with zonal wavenumber as the slower index.
-
24 C>
-
25 C> Transforms are done in latitude pairs for efficiency;
-
26 C> thus grid arrays for each hemisphere must be passed.
-
27 C> if so requested, just a subset of the latitude pairs
-
28 C> may be transformed in each invocation of the subprogram.
-
29 C>
-
30 C> The transforms are all multiprocessed over latitude except
-
31 C> the transform from Fourier to spectral is multiprocessed
-
32 C> over zonal wavenumber to ensure reproducibility.
-
33 C>
-
34 C> Transform several fields at a time to improve vectorization.
-
35 C>
-
36 C> Subprogram can be called from a multiprocessing environment.
-
37 C>
-
38 C> Minimum grid dimensions for unaliased transforms to spectral:
-
39 C> DIMENSION |LINEAR |QUADRATIC
-
40 C> ----------------------- |--------- |-------------
-
41 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
-
42 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
-
43 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
-
44 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
-
45 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
-
46 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
-
47 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
-
48 C>
-
49 C> @param IROMB spectral domain shape
-
50 C> (0 for triangular, 1 for rhomboidal)
-
51 C> @param MAXWV spectral truncation
-
52 C> @param IDRT grid identifier
-
53 C> - IDRT=4 for Gaussian grid
-
54 C> - IDRT=0 for equally-spaced grid including poles
-
55 C> - IDRT=256 for equally-spaced grid excluding poles
-
56 C> @param IMAX even number of longitudes.
-
57 C> @param JMAX number of latitudes.
-
58 C> @param KMAX number of fields to transform.
-
59 C> @param IPRIME longitude index for the prime meridian.
-
60 C> (defaults to 1 if IPRIME=0)
-
61 C> @param ISKIP skip number between longitudes
-
62 C> (defaults to 1 if ISKIP=0)
-
63 C> @param JNSKIP skip number between n.h. latitudes from north
-
64 C> (defaults to IMAX if JNSKIP=0)
-
65 C> @param JSSKIP skip number between s.h. latitudes from south
-
66 C> (defaults to -IMAX if JSSKIP=0)
-
67 C> @param KWSKIP skip number between wave fields
-
68 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
-
69 C> @param KGSKIP skip number between grid fields
-
70 C> (defaults to IMAX*JMAX if KGSKIP=0)
-
71 C> @param JBEG latitude index (from pole) to begin transform
-
72 C> (defaults to 1 if JBEG=0). If JBEG=0 and IDIR<0, wave is zeroed before transform.
-
73 C> @param JEND latitude index (from pole) to end transform
-
74 C> (defaults to (JMAX+1)/2 if JEND=0)
-
75 C> @param JCPU number of cpus over which to multiprocess
-
76 C> @param[out] WAVE wave fields if IDIR>0
-
77 C> @param[out] GRIDMN global means if IDIR<0
-
78 C> @param[out] GRIDXN n.h. x-gradients (starting at JBEG) if IDIR<0
-
79 C> @param[out] GRIDXS s.h. x-gradients (starting at JBEG) if IDIR<0
-
80 C> [GRIDX=(D(WAVE)/DLAM)/(CLAT*RERTH)]
-
81 C> @param[out] GRIDYN n.h. y-gradients (starting at JBEG) if IDIR<0
-
82 C> @param[out] GRIDYS s.h. y-gradients (starting at JBEG) if IDIR<0
-
83 C> [GRIDY=(D(WAVE)/DPHI)/RERTH]
-
84 C> @param IDIR transform flag
-
85 C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave)
-
86 C>
-
87 C> @author Iredell @date 96-02-29
-
88  SUBROUTINE sptrand(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
-
89  & IPRIME,ISKIP,JNSKIP,JSSKIP,KWSKIP,KGSKIP,
-
90  & JBEG,JEND,JCPU,
-
91  & WAVE,GRIDMN,GRIDXN,GRIDXS,GRIDYN,GRIDYS,IDIR)
-
92 
-
93  REAL WAVE(*),GRIDMN(KMAX),GRIDXN(*),GRIDXS(*),GRIDYN(*),GRIDYS(*)
-
94  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
-
95  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
96  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
97  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
-
98  REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
-
99  REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
-
100 
-
101 C SET PARAMETERS
-
102  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
-
103  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
104  mdim=2*mx+1
-
105  kw=kwskip
-
106  IF(kw.EQ.0) kw=2*mx
-
107 
-
108 C TRANSFORM WAVE TO GRID
-
109  IF(idir.GT.0) THEN
-
110 C$OMP PARALLEL DO PRIVATE(KWS)
-
111  DO k=1,kmax
-
112  kws=(k-1)*kw
-
113  gridmn(k)=wave(kws+1)/sqrt(2.)
-
114  CALL splaplac(iromb,maxwv,enn1,wave(kws+1),wd(1,k),1)
-
115  wz(1:2*mx,k)=0.
-
116  ENDDO
-
117  CALL sptranv(iromb,maxwv,idrt,imax,jmax,kmax,
-
118  & iprime,iskip,jnskip,jsskip,mdim,kgskip,
-
119  & jbeg,jend,jcpu,
-
120  & wd,wz,gridxn,gridxs,gridyn,gridys,idir)
-
121 
-
122 C TRANSFORM GRID TO WAVE
-
123  ELSE
-
124 C$OMP PARALLEL DO
-
125  DO k=1,kmax
-
126  wd(1:2*mx,k)=0.
-
127  wz(1:2*mx,k)=0.
-
128  ENDDO
-
129  CALL sptranv(iromb,maxwv,idrt,imax,jmax,kmax,
-
130  & iprime,iskip,jnskip,jsskip,mdim,kgskip,
-
131  & jbeg,jend,jcpu,
-
132  & wd,wz,gridxn,gridxs,gridyn,gridys,idir)
-
133  IF(jbeg.EQ.0) THEN
-
134 C$OMP PARALLEL DO PRIVATE(KWS)
-
135  DO k=1,kmax
-
136  kws=(k-1)*kw
-
137  CALL splaplac(iromb,maxwv,enn1,wave(kws+1),wd(1,k),-1)
-
138  wave(kws+1)=gridmn(k)*sqrt(2.)
-
139  ENDDO
-
140  ELSE
-
141 C$OMP PARALLEL DO PRIVATE(KWS)
-
142  DO k=1,kmax
-
143  kws=(k-1)*kw
-
144  CALL splaplac(iromb,maxwv,enn1,wz(1,k),wd(1,k),-1)
-
145  wave(kws+1:kws+2*mx)=wave(kws+1:kws+2*mx)+wz(1:2*mx,k)
-
146  wave(kws+1)=gridmn(k)*sqrt(2.)
-
147  ENDDO
-
148  ENDIF
-
149  ENDIF
-
150  END
-
subroutine splaplac(I, M, ENN1, Q, QD2, IDIR)
Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
Definition: splaplac.f:25
-
subroutine sptrand(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDMN, GRIDXN, GRIDXS, GRIDYN, GRIDYS, IDIR)
This subprogram performs a spherical transform between spectral coefficients of scalar fields and the...
Definition: sptrand.f:92
-
subroutine sptranv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
Definition: sptranv.f:91
-
subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
This subprogram gets wave-space constants.
Definition: spwget.f:18
+Go to the documentation of this file.
1C> @file
+
2C> @brief Perform a gradient spherical transform.
+
3C>
+
4C> ### Program History Log
+
5C> Date | Programmer | Comments
+
6C> -----|------------|---------
+
7C> 96-02-29 | IREDELL | Initial
+
8C> 1998-12-15 | IREDELL | openmp directives inserted
+
9C>
+
10C> @author Iredell @date 96-02-29
+
11
+
12C> This subprogram performs a spherical transform
+
13C> between spectral coefficients of scalar fields
+
14C> and their means and gradients on a global cylindrical grid.
+
15C>
+
16C> The wave-space can be either triangular or rhomboidal.
+
17C>
+
18C> The grid-space can be either an equally-spaced grid
+
19C> (with or without pole points) or a Gaussian grid.
+
20C>
+
21C> The wave and grid fields may have general indexing,
+
22C> but each wave field is in sequential 'IBM order',
+
23C> i.e. with zonal wavenumber as the slower index.
+
24C>
+
25C> Transforms are done in latitude pairs for efficiency;
+
26C> thus grid arrays for each hemisphere must be passed.
+
27C> if so requested, just a subset of the latitude pairs
+
28C> may be transformed in each invocation of the subprogram.
+
29C>
+
30C> The transforms are all multiprocessed over latitude except
+
31C> the transform from Fourier to spectral is multiprocessed
+
32C> over zonal wavenumber to ensure reproducibility.
+
33C>
+
34C> Transform several fields at a time to improve vectorization.
+
35C>
+
36C> Subprogram can be called from a multiprocessing environment.
+
37C>
+
38C> Minimum grid dimensions for unaliased transforms to spectral:
+
39C> DIMENSION |LINEAR |QUADRATIC
+
40C> ----------------------- |--------- |-------------
+
41C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
+
42C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
+
43C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
+
44C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
+
45C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
+
46C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
+
47C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
+
48C>
+
49C> @param IROMB spectral domain shape
+
50C> (0 for triangular, 1 for rhomboidal)
+
51C> @param MAXWV spectral truncation
+
52C> @param IDRT grid identifier
+
53C> - IDRT=4 for Gaussian grid
+
54C> - IDRT=0 for equally-spaced grid including poles
+
55C> - IDRT=256 for equally-spaced grid excluding poles
+
56C> @param IMAX even number of longitudes.
+
57C> @param JMAX number of latitudes.
+
58C> @param KMAX number of fields to transform.
+
59C> @param IPRIME longitude index for the prime meridian.
+
60C> (defaults to 1 if IPRIME=0)
+
61C> @param ISKIP skip number between longitudes
+
62C> (defaults to 1 if ISKIP=0)
+
63C> @param JNSKIP skip number between n.h. latitudes from north
+
64C> (defaults to IMAX if JNSKIP=0)
+
65C> @param JSSKIP skip number between s.h. latitudes from south
+
66C> (defaults to -IMAX if JSSKIP=0)
+
67C> @param KWSKIP skip number between wave fields
+
68C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
+
69C> @param KGSKIP skip number between grid fields
+
70C> (defaults to IMAX*JMAX if KGSKIP=0)
+
71C> @param JBEG latitude index (from pole) to begin transform
+
72C> (defaults to 1 if JBEG=0). If JBEG=0 and IDIR<0, wave is zeroed before transform.
+
73C> @param JEND latitude index (from pole) to end transform
+
74C> (defaults to (JMAX+1)/2 if JEND=0)
+
75C> @param JCPU number of cpus over which to multiprocess
+
76C> @param[out] WAVE wave fields if IDIR>0
+
77C> @param[out] GRIDMN global means if IDIR<0
+
78C> @param[out] GRIDXN n.h. x-gradients (starting at JBEG) if IDIR<0
+
79C> @param[out] GRIDXS s.h. x-gradients (starting at JBEG) if IDIR<0
+
80C> [GRIDX=(D(WAVE)/DLAM)/(CLAT*RERTH)]
+
81C> @param[out] GRIDYN n.h. y-gradients (starting at JBEG) if IDIR<0
+
82C> @param[out] GRIDYS s.h. y-gradients (starting at JBEG) if IDIR<0
+
83C> [GRIDY=(D(WAVE)/DPHI)/RERTH]
+
84C> @param IDIR transform flag
+
85C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave)
+
86C>
+
87C> @author Iredell @date 96-02-29
+
+
88 SUBROUTINE sptrand(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
+
89 & IPRIME,ISKIP,JNSKIP,JSSKIP,KWSKIP,KGSKIP,
+
90 & JBEG,JEND,JCPU,
+
91 & WAVE,GRIDMN,GRIDXN,GRIDXS,GRIDYN,GRIDYS,IDIR)
+
92
+
93 REAL WAVE(*),GRIDMN(KMAX),GRIDXN(*),GRIDXS(*),GRIDYN(*),GRIDYS(*)
+
94 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
+
95 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
96 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
97 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
+
98 REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
+
99 REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
+
100
+
101C SET PARAMETERS
+
102 CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
+
103 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
104 mdim=2*mx+1
+
105 kw=kwskip
+
106 IF(kw.EQ.0) kw=2*mx
+
107
+
108C TRANSFORM WAVE TO GRID
+
109 IF(idir.GT.0) THEN
+
110C$OMP PARALLEL DO PRIVATE(KWS)
+
111 DO k=1,kmax
+
112 kws=(k-1)*kw
+
113 gridmn(k)=wave(kws+1)/sqrt(2.)
+
114 CALL splaplac(iromb,maxwv,enn1,wave(kws+1),wd(1,k),1)
+
115 wz(1:2*mx,k)=0.
+
116 ENDDO
+
117 CALL sptranv(iromb,maxwv,idrt,imax,jmax,kmax,
+
118 & iprime,iskip,jnskip,jsskip,mdim,kgskip,
+
119 & jbeg,jend,jcpu,
+
120 & wd,wz,gridxn,gridxs,gridyn,gridys,idir)
+
121
+
122C TRANSFORM GRID TO WAVE
+
123 ELSE
+
124C$OMP PARALLEL DO
+
125 DO k=1,kmax
+
126 wd(1:2*mx,k)=0.
+
127 wz(1:2*mx,k)=0.
+
128 ENDDO
+
129 CALL sptranv(iromb,maxwv,idrt,imax,jmax,kmax,
+
130 & iprime,iskip,jnskip,jsskip,mdim,kgskip,
+
131 & jbeg,jend,jcpu,
+
132 & wd,wz,gridxn,gridxs,gridyn,gridys,idir)
+
133 IF(jbeg.EQ.0) THEN
+
134C$OMP PARALLEL DO PRIVATE(KWS)
+
135 DO k=1,kmax
+
136 kws=(k-1)*kw
+
137 CALL splaplac(iromb,maxwv,enn1,wave(kws+1),wd(1,k),-1)
+
138 wave(kws+1)=gridmn(k)*sqrt(2.)
+
139 ENDDO
+
140 ELSE
+
141C$OMP PARALLEL DO PRIVATE(KWS)
+
142 DO k=1,kmax
+
143 kws=(k-1)*kw
+
144 CALL splaplac(iromb,maxwv,enn1,wz(1,k),wd(1,k),-1)
+
145 wave(kws+1:kws+2*mx)=wave(kws+1:kws+2*mx)+wz(1:2*mx,k)
+
146 wave(kws+1)=gridmn(k)*sqrt(2.)
+
147 ENDDO
+
148 ENDIF
+
149 ENDIF
+
+
150 END
+
subroutine splaplac(i, m, enn1, q, qd2, idir)
Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
Definition splaplac.f:25
+
subroutine sptrand(iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, wave, gridmn, gridxn, gridxs, gridyn, gridys, idir)
This subprogram performs a spherical transform between spectral coefficients of scalar fields and the...
Definition sptrand.f:92
+
subroutine sptranv(iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, waved, wavez, gridun, gridus, gridvn, gridvs, idir)
This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
Definition sptranv.f:91
+
subroutine spwget(iromb, maxwv, eps, epstop, enn1, elonn1, eon, eontop)
This subprogram gets wave-space constants.
Definition spwget.f:18
diff --git a/sptranf0_8f.html b/sptranf0_8f.html index cf5dd981..e210069d 100644 --- a/sptranf0_8f.html +++ b/sptranf0_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptranf0.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptranf0.f File Reference
+
sptranf0.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptranf0 (IROMB, MAXWV, IDRT, IMAX, JMAX, JB, JE, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP, AFFT, CLAT, SLAT, WLAT, PLN, PLNTOP)
 This subprogram performs an initialization for subprogram sptranf(). More...
 
subroutine sptranf0 (iromb, maxwv, idrt, imax, jmax, jb, je, eps, epstop, enn1, elonn1, eon, eontop, afft, clat, slat, wlat, pln, plntop)
 This subprogram performs an initialization for subprogram sptranf().
 

Detailed Description

Sptranf spectral initialization.

@@ -107,8 +113,8 @@

Definition in file sptranf0.f.

Function/Subroutine Documentation

- -

◆ sptranf0()

+ +

◆ sptranf0()

@@ -117,115 +123,115 @@

subroutine sptranf0 (   - IROMB, + iromb,   - MAXWV, + maxwv,   - IDRT, + idrt,   - IMAX, + imax,   - JMAX, + jmax,   - JB, + jb,   - JE, + je, real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2)  - EPS, + eps, real, dimension(maxwv+1)  - EPSTOP, + epstop, real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2)  - ENN1, + enn1, real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2)  - ELONN1, + elonn1, real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2)  - EON, + eon, real, dimension(maxwv+1)  - EONTOP, + eontop, real(8), dimension(50000+4*imax)  - AFFT, + afft, real, dimension(jb:je)  - CLAT, + clat, real, dimension(jb:je)  - SLAT, + slat, real, dimension(jb:je)  - WLAT, + wlat, real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2,jb:je)  - PLN, + pln, real, dimension(maxwv+1,jb:je)  - PLNTOP  + plntop  @@ -235,8 +241,8 @@

-

This subprogram performs an initialization for subprogram sptranf().

-

Use this subprogram outside the sptranf() family context at your own risk.

+

This subprogram performs an initialization for subprogram sptranf().

+

Use this subprogram outside the sptranf() family context at your own risk.

Parameters
@@ -283,7 +289,7 @@

diff --git a/sptranf0_8f.js b/sptranf0_8f.js index 68775895..93ff5add 100644 --- a/sptranf0_8f.js +++ b/sptranf0_8f.js @@ -1,4 +1,4 @@ var sptranf0_8f = [ - [ "sptranf0", "sptranf0_8f.html#aaf9f9002ccd7074dc04dbc40a5aad9f0", null ] + [ "sptranf0", "sptranf0_8f.html#a15de727a54551bd930432f71cd8f893f", null ] ]; \ No newline at end of file diff --git a/sptranf0_8f_source.html b/sptranf0_8f_source.html index c145b7d3..016ad9c7 100644 --- a/sptranf0_8f_source.html +++ b/sptranf0_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptranf0.f Source File @@ -23,10 +23,9 @@

IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0

- + +/* @license-end */ + +
@@ -76,94 +81,102 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptranf0.f
+
sptranf0.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Sptranf spectral initialization.
-
3 C> @author IREDELL @date 96-02-29
-
4 
-
5 C> This subprogram performs an initialization for
-
6 C> subprogram sptranf(). Use this subprogram outside
-
7 C> the sptranf() family context at your own risk.
-
8 C>
-
9 C> @param IROMB spectral domain shape
-
10 c> (0 for triangular, 1 for rhomboidal)
-
11 C> @param MAXWV spectral truncation
-
12 C> @param IDRT grid identifier
-
13 C> - IDRT=4 for Gaussian grid,
-
14 C> - IDRT=0 for equally-spaced grid including poles,
-
15 C> - IDRT=256 for equally-spaced grid excluding poles
-
16 C> @param IMAX even number of longitudes
-
17 C> @param JMAX number of latitudes
-
18 C> @param JB latitude index (from pole) to begin transform
-
19 C> @param JE latitude index (from pole) to end transform
-
20 C> @param EPS
-
21 C> @param EPSTOP
-
22 C> @param ENN1
-
23 C> @param ELONN1
-
24 C> @param EON
-
25 C> @param EONTOP
-
26 C> @param AFFT auxiliary array if IDIR=0
-
27 C> @param CLAT cosines of latitude
-
28 C> @param SLAT sines of latitude
-
29 C> @param WLAT Gaussian weights
-
30 C> @param PLN Legendre polynomials
-
31 C> @param PLNTOP Legendre polynomial over top
-
32 C>
-
33 C> @author IREDELL @date 96-02-29
-
34  SUBROUTINE sptranf0(IROMB,MAXWV,IDRT,IMAX,JMAX,JB,JE,
-
35  & EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP,
-
36  & AFFT,CLAT,SLAT,WLAT,PLN,PLNTOP)
-
37 
-
38  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
-
39  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
40  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
41  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
-
42  REAL(8) AFFT(50000+4*IMAX)
-
43  REAL CLAT(JB:JE),SLAT(JB:JE),WLAT(JB:JE)
-
44  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2,JB:JE)
-
45  REAL PLNTOP(MAXWV+1,JB:JE)
-
46  REAL SLATX(JMAX),WLATX(JMAX)
-
47  REAL W(IMAX+2,2),G(IMAX,2)
-
48 
-
49  w = 0.0
-
50  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
-
51  CALL spffte(imax,(imax+2)/2,imax,2,w,g,0,afft)
-
52  CALL splat(idrt,jmax,slatx,wlatx)
-
53  jhe=(jmax+1)/2
-
54  IF(jhe.GT.jmax/2) wlatx(jhe)=wlatx(jhe)/2
-
55  DO j=jb,je
-
56  clat(j)=sqrt(1.-slatx(j)**2)
-
57  slat(j)=slatx(j)
-
58  wlat(j)=wlatx(j)
-
59  ENDDO
-
60 C$OMP PARALLEL DO
-
61  DO j=jb,je
-
62  CALL splegend(iromb,maxwv,slat(j),clat(j),eps,epstop,
-
63  & pln(1,j),plntop(1,j))
-
64  ENDDO
-
65 
-
66  END
-
subroutine spffte(IMAX, INCW, INCG, KMAX, W, G, IDIR, AFFT)
This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space...
Definition: spffte.f:49
-
subroutine splat(IDRT, JMAX, SLAT, WLAT)
Computes cosines of colatitude and Gaussian weights for one of the following specific global sets of ...
Definition: splat.F:46
-
subroutine splegend(I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
Definition: splegend.f:45
-
subroutine sptranf0(IROMB, MAXWV, IDRT, IMAX, JMAX, JB, JE, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP, AFFT, CLAT, SLAT, WLAT, PLN, PLNTOP)
This subprogram performs an initialization for subprogram sptranf().
Definition: sptranf0.f:37
-
subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
This subprogram gets wave-space constants.
Definition: spwget.f:18
+Go to the documentation of this file.
1C> @file
+
2C> @brief Sptranf spectral initialization.
+
3C> @author IREDELL @date 96-02-29
+
4
+
5C> This subprogram performs an initialization for
+
6C> subprogram sptranf(). Use this subprogram outside
+
7C> the sptranf() family context at your own risk.
+
8C>
+
9C> @param IROMB spectral domain shape
+
10c> (0 for triangular, 1 for rhomboidal)
+
11C> @param MAXWV spectral truncation
+
12C> @param IDRT grid identifier
+
13C> - IDRT=4 for Gaussian grid,
+
14C> - IDRT=0 for equally-spaced grid including poles,
+
15C> - IDRT=256 for equally-spaced grid excluding poles
+
16C> @param IMAX even number of longitudes
+
17C> @param JMAX number of latitudes
+
18C> @param JB latitude index (from pole) to begin transform
+
19C> @param JE latitude index (from pole) to end transform
+
20C> @param EPS
+
21C> @param EPSTOP
+
22C> @param ENN1
+
23C> @param ELONN1
+
24C> @param EON
+
25C> @param EONTOP
+
26C> @param AFFT auxiliary array if IDIR=0
+
27C> @param CLAT cosines of latitude
+
28C> @param SLAT sines of latitude
+
29C> @param WLAT Gaussian weights
+
30C> @param PLN Legendre polynomials
+
31C> @param PLNTOP Legendre polynomial over top
+
32C>
+
33C> @author IREDELL @date 96-02-29
+
+
34 SUBROUTINE sptranf0(IROMB,MAXWV,IDRT,IMAX,JMAX,JB,JE,
+
35 & EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP,
+
36 & AFFT,CLAT,SLAT,WLAT,PLN,PLNTOP)
+
37
+
38 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
+
39 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
40 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
41 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
+
42 REAL(8) AFFT(50000+4*IMAX)
+
43 REAL CLAT(JB:JE),SLAT(JB:JE),WLAT(JB:JE)
+
44 REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2,JB:JE)
+
45 REAL PLNTOP(MAXWV+1,JB:JE)
+
46 REAL SLATX(JMAX),WLATX(JMAX)
+
47 REAL W(IMAX+2,2),G(IMAX,2)
+
48
+
49 w = 0.0
+
50 CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
+
51 CALL spffte(imax,(imax+2)/2,imax,2,w,g,0,afft)
+
52 CALL splat(idrt,jmax,slatx,wlatx)
+
53 jhe=(jmax+1)/2
+
54 IF(jhe.GT.jmax/2) wlatx(jhe)=wlatx(jhe)/2
+
55 DO j=jb,je
+
56 clat(j)=sqrt(1.-slatx(j)**2)
+
57 slat(j)=slatx(j)
+
58 wlat(j)=wlatx(j)
+
59 ENDDO
+
60C$OMP PARALLEL DO
+
61 DO j=jb,je
+
62 CALL splegend(iromb,maxwv,slat(j),clat(j),eps,epstop,
+
63 & pln(1,j),plntop(1,j))
+
64 ENDDO
+
65
+
+
66 END
+
subroutine spffte(imax, incw, incg, kmax, w, g, idir, afft)
This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space...
Definition spffte.f:49
+
subroutine splat(idrt, jmax, slat, wlat)
Computes cosines of colatitude and Gaussian weights for one of the following specific global sets of ...
Definition splat.F:46
+
subroutine splegend(i, m, slat, clat, eps, epstop, pln, plntop)
Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
Definition splegend.f:45
+
subroutine sptranf0(iromb, maxwv, idrt, imax, jmax, jb, je, eps, epstop, enn1, elonn1, eon, eontop, afft, clat, slat, wlat, pln, plntop)
This subprogram performs an initialization for subprogram sptranf().
Definition sptranf0.f:37
+
subroutine spwget(iromb, maxwv, eps, epstop, enn1, elonn1, eon, eontop)
This subprogram gets wave-space constants.
Definition spwget.f:18
diff --git a/sptranf1_8f.html b/sptranf1_8f.html index ee94d7e0..a1a38d5b 100644 --- a/sptranf1_8f.html +++ b/sptranf1_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptranf1.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptranf1.f File Reference
+
sptranf1.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptranf1 (IROMB, MAXWV, IDRT, IMAX, JMAX, JB, JE, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP, AFFT, CLAT, SLAT, WLAT, PLN, PLNTOP, MP, W, WTOP, G, IDIR)
 This subprogram performs an single latitude transform for subprogram sptranf(). More...
 
subroutine sptranf1 (iromb, maxwv, idrt, imax, jmax, jb, je, eps, epstop, enn1, elonn1, eon, eontop, afft, clat, slat, wlat, pln, plntop, mp, w, wtop, g, idir)
 This subprogram performs an single latitude transform for subprogram sptranf().
 

Detailed Description

Sptranf spectral transform.

@@ -107,8 +113,8 @@

Definition in file sptranf1.f.

Function/Subroutine Documentation

- -

◆ sptranf1()

+ +

◆ sptranf1()

@@ -117,145 +123,145 @@

subroutine sptranf1 (   - IROMB, + iromb,   - MAXWV, + maxwv,   - IDRT, + idrt,   - IMAX, + imax,   - JMAX, + jmax,   - JB, + jb,   - JE, + je, real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2)  - EPS, + eps, real, dimension(maxwv+1)  - EPSTOP, + epstop, real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2)  - ENN1, + enn1, real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2)  - ELONN1, + elonn1, real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2)  - EON, + eon, real, dimension(maxwv+1)  - EONTOP, + eontop, real(8), dimension(50000+4*imax)  - AFFT, + afft, real, dimension(jb:je)  - CLAT, + clat, real, dimension(jb:je)  - SLAT, + slat, real, dimension(jb:je)  - WLAT, + wlat, real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2,jb:je)  - PLN, + pln, real, dimension(maxwv+1,jb:je)  - PLNTOP, + plntop,   - MP, + mp, real, dimension((maxwv+1)*((iromb+1)*maxwv+2))  - W, + w, real, dimension(2*(maxwv+1))  - WTOP, + wtop, real, dimension(imax,2,jb:je)  - G, + g,   - IDIR  + idir  @@ -265,8 +271,8 @@

-

This subprogram performs an single latitude transform for subprogram sptranf().

-

Use this subprogram outside the sptranf() family context at your own risk.

+

This subprogram performs an single latitude transform for subprogram sptranf().

+

Use this subprogram outside the sptranf() family context at your own risk.

Parameters
@@ -318,7 +324,7 @@

diff --git a/sptranf1_8f.js b/sptranf1_8f.js index 2123eae8..7d2f196f 100644 --- a/sptranf1_8f.js +++ b/sptranf1_8f.js @@ -1,4 +1,4 @@ var sptranf1_8f = [ - [ "sptranf1", "sptranf1_8f.html#ad7cec2fd6729ca84b1fac3436f9730e6", null ] + [ "sptranf1", "sptranf1_8f.html#ab3dd3812c9371e56eb568aac6f80b176", null ] ]; \ No newline at end of file diff --git a/sptranf1_8f_source.html b/sptranf1_8f_source.html index d836688b..c17455c6 100644 --- a/sptranf1_8f_source.html +++ b/sptranf1_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptranf1.f Source File @@ -23,10 +23,9 @@

IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0

- + +/* @license-end */ + +
@@ -76,103 +81,111 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptranf1.f
+
sptranf1.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Sptranf spectral transform.
-
3 C> @author Iredell @date 96-02-29
-
4 
-
5 C> This subprogram performs an single latitude transform for
-
6 C> subprogram sptranf(). Use this subprogram outside
-
7 C> the sptranf() family context at your own risk.
-
8 C>
-
9 C> @param IROMB spectral domain shape
-
10 C> (0 for triangular, 1 for rhomboidal)
-
11 C> @param MAXWV spectral truncation
-
12 C> @param IDRT grid identifier
-
13 C> - IDRT=4 for Gaussian grid,
-
14 C> - IDRT=0 for equally-spaced grid including poles,
-
15 C> - IDRT=256 for equally-spaced grid excluding poles
-
16 C> @param IMAX even number of longitudes
-
17 C> @param JMAX number of latitudes
-
18 C> @param JB latitude index (from pole) to begin transform
-
19 C> @param JE latitude index (from pole) to end transform
-
20 C> @param EPS
-
21 C> @param EPSTOP
-
22 C> @param ENN1
-
23 C> @param ELONN1
-
24 C> @param EON
-
25 C> @param EONTOP
-
26 C> @param CLAT cosines of latitude
-
27 C> @param SLAT sines of latitude
-
28 C> @param WLAT Gaussian weights
-
29 C> @param AFFT auxiliary array if IDIR=0
-
30 C> @param PLN Legendre polynomials
-
31 C> @param PLNTOP Legendre polynomial over top
-
32 C> @param MP identifier (0 for scalar, 1 for vector)
-
33 C> @param[out] W wave field if IDIR>0
-
34 C> @param[out] WTOP wave field over top if IDIR>0
-
35 C> @param[out] G grid field if IDIR<0
-
36 C> @param IDIR transform flag
-
37 C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave)
-
38 C>
-
39 C> @author Iredell @date 96-02-29
-
40  SUBROUTINE sptranf1(IROMB,MAXWV,IDRT,IMAX,JMAX,JB,JE,
-
41  & EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP,
-
42  & AFFT,CLAT,SLAT,WLAT,PLN,PLNTOP,MP,
-
43  & W,WTOP,G,IDIR)
-
44 
-
45  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
-
46  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
47  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
48  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
-
49  REAL(8) AFFT(50000+4*IMAX)
-
50  REAL CLAT(JB:JE),SLAT(JB:JE),WLAT(JB:JE)
-
51  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2,JB:JE)
-
52  REAL PLNTOP(MAXWV+1,JB:JE)
-
53  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2))
-
54  REAL WTOP(2*(MAXWV+1))
-
55  REAL G(IMAX,2,JB:JE)
-
56  REAL F(IMAX+2,2)
-
57 
-
58  kw=(maxwv+1)*((iromb+1)*maxwv+2)
-
59  kwtop=2*(maxwv+1)
-
60  IF(idir.GT.0) THEN
-
61  DO j=jb,je
-
62  CALL spsynth(iromb,maxwv,imax,imax+2,kw,kwtop,1,
-
63  & clat(j),pln(1,j),plntop(1,j),(/mp/),
-
64  & w,wtop,f)
-
65  CALL spffte(imax,(imax+2)/2,imax,2,f,g(1,1,j),+1,afft)
-
66  ENDDO
-
67  ELSE
-
68  DO j=jb,je
-
69  CALL spffte(imax,(imax+2)/2,imax,2,f,g(1,1,j),-1,afft)
-
70  CALL spanaly(iromb,maxwv,imax,imax+2,kw,kwtop,1,
-
71  & wlat(j),clat(j),pln(1,j),plntop(1,j),(/mp/),
-
72  & f,w,wtop)
-
73  ENDDO
-
74  ENDIF
-
75 
-
76  END
-
subroutine spanaly(I, M, IM, IX, NC, NCTOP, KM, WGT, CLAT, PLN, PLNTOP, MP, F, SPC, SPCTOP)
Analyzes spectral coefficients from Fourier coefficients for a latitude pair (Northern and Southern h...
Definition: spanaly.f:37
-
subroutine spffte(IMAX, INCW, INCG, KMAX, W, G, IDIR, AFFT)
This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space...
Definition: spffte.f:49
-
subroutine spsynth(I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
Definition: spsynth.f:39
-
subroutine sptranf1(IROMB, MAXWV, IDRT, IMAX, JMAX, JB, JE, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP, AFFT, CLAT, SLAT, WLAT, PLN, PLNTOP, MP, W, WTOP, G, IDIR)
This subprogram performs an single latitude transform for subprogram sptranf().
Definition: sptranf1.f:44
+Go to the documentation of this file.
1C> @file
+
2C> @brief Sptranf spectral transform.
+
3C> @author Iredell @date 96-02-29
+
4
+
5C> This subprogram performs an single latitude transform for
+
6C> subprogram sptranf(). Use this subprogram outside
+
7C> the sptranf() family context at your own risk.
+
8C>
+
9C> @param IROMB spectral domain shape
+
10C> (0 for triangular, 1 for rhomboidal)
+
11C> @param MAXWV spectral truncation
+
12C> @param IDRT grid identifier
+
13C> - IDRT=4 for Gaussian grid,
+
14C> - IDRT=0 for equally-spaced grid including poles,
+
15C> - IDRT=256 for equally-spaced grid excluding poles
+
16C> @param IMAX even number of longitudes
+
17C> @param JMAX number of latitudes
+
18C> @param JB latitude index (from pole) to begin transform
+
19C> @param JE latitude index (from pole) to end transform
+
20C> @param EPS
+
21C> @param EPSTOP
+
22C> @param ENN1
+
23C> @param ELONN1
+
24C> @param EON
+
25C> @param EONTOP
+
26C> @param CLAT cosines of latitude
+
27C> @param SLAT sines of latitude
+
28C> @param WLAT Gaussian weights
+
29C> @param AFFT auxiliary array if IDIR=0
+
30C> @param PLN Legendre polynomials
+
31C> @param PLNTOP Legendre polynomial over top
+
32C> @param MP identifier (0 for scalar, 1 for vector)
+
33C> @param[out] W wave field if IDIR>0
+
34C> @param[out] WTOP wave field over top if IDIR>0
+
35C> @param[out] G grid field if IDIR<0
+
36C> @param IDIR transform flag
+
37C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave)
+
38C>
+
39C> @author Iredell @date 96-02-29
+
+
40 SUBROUTINE sptranf1(IROMB,MAXWV,IDRT,IMAX,JMAX,JB,JE,
+
41 & EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP,
+
42 & AFFT,CLAT,SLAT,WLAT,PLN,PLNTOP,MP,
+
43 & W,WTOP,G,IDIR)
+
44
+
45 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
+
46 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
47 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
48 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
+
49 REAL(8) AFFT(50000+4*IMAX)
+
50 REAL CLAT(JB:JE),SLAT(JB:JE),WLAT(JB:JE)
+
51 REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2,JB:JE)
+
52 REAL PLNTOP(MAXWV+1,JB:JE)
+
53 REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2))
+
54 REAL WTOP(2*(MAXWV+1))
+
55 REAL G(IMAX,2,JB:JE)
+
56 REAL F(IMAX+2,2)
+
57
+
58 kw=(maxwv+1)*((iromb+1)*maxwv+2)
+
59 kwtop=2*(maxwv+1)
+
60 IF(idir.GT.0) THEN
+
61 DO j=jb,je
+
62 CALL spsynth(iromb,maxwv,imax,imax+2,kw,kwtop,1,
+
63 & clat(j),pln(1,j),plntop(1,j),(/mp/),
+
64 & w,wtop,f)
+
65 CALL spffte(imax,(imax+2)/2,imax,2,f,g(1,1,j),+1,afft)
+
66 ENDDO
+
67 ELSE
+
68 DO j=jb,je
+
69 CALL spffte(imax,(imax+2)/2,imax,2,f,g(1,1,j),-1,afft)
+
70 CALL spanaly(iromb,maxwv,imax,imax+2,kw,kwtop,1,
+
71 & wlat(j),clat(j),pln(1,j),plntop(1,j),(/mp/),
+
72 & f,w,wtop)
+
73 ENDDO
+
74 ENDIF
+
75
+
+
76 END
+
subroutine spanaly(i, m, im, ix, nc, nctop, km, wgt, clat, pln, plntop, mp, f, spc, spctop)
Analyzes spectral coefficients from Fourier coefficients for a latitude pair (Northern and Southern h...
Definition spanaly.f:37
+
subroutine spffte(imax, incw, incg, kmax, w, g, idir, afft)
This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space...
Definition spffte.f:49
+
subroutine spsynth(i, m, im, ix, nc, nctop, km, clat, pln, plntop, mp, spc, spctop, f)
Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
Definition spsynth.f:39
+
subroutine sptranf1(iromb, maxwv, idrt, imax, jmax, jb, je, eps, epstop, enn1, elonn1, eon, eontop, afft, clat, slat, wlat, pln, plntop, mp, w, wtop, g, idir)
This subprogram performs an single latitude transform for subprogram sptranf().
Definition sptranf1.f:44
diff --git a/sptranf_8f.html b/sptranf_8f.html index a33379e1..691d020b 100644 --- a/sptranf_8f.html +++ b/sptranf_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptranf.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptranf.f File Reference
+
sptranf.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptranf (IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IP, IS, JN, JS, KW, KG, JB, JE, JC, WAVE, GRIDN, GRIDS, IDIR)
 This subprogram performs a spherical transform between spectral coefficients of scalar quantities and fields on a global cylindrical grid. More...
 
subroutine sptranf (iromb, maxwv, idrt, imax, jmax, kmax, ip, is, jn, js, kw, kg, jb, je, jc, wave, gridn, grids, idir)
 This subprogram performs a spherical transform between spectral coefficients of scalar quantities and fields on a global cylindrical grid.
 

Detailed Description

Perform a scalar spherical transform.

@@ -119,8 +125,8 @@

Definition in file sptranf.f.

Function/Subroutine Documentation

- -

◆ sptranf()

+ +

◆ sptranf()

diff --git a/sptranf_8f.js b/sptranf_8f.js index 5f0a52f8..749448be 100644 --- a/sptranf_8f.js +++ b/sptranf_8f.js @@ -1,4 +1,4 @@ var sptranf_8f = [ - [ "sptranf", "sptranf_8f.html#acf086b5141203e48bdb7250441a16c8c", null ] + [ "sptranf", "sptranf_8f.html#add7fc54aea6dd040b71e29b199895c67", null ] ]; \ No newline at end of file diff --git a/sptranf_8f_source.html b/sptranf_8f_source.html index 579c9765..f3627c13 100644 --- a/sptranf_8f_source.html +++ b/sptranf_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptranf.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,187 +81,195 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptranf.f
+
sptranf.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Perform a scalar spherical transform
-
3 C>
-
4 C> ### Program History Log
-
5 C> Date | Programmer | Comments
-
6 C> -----|------------|---------
-
7 C> 96-02-29 | Iredell | Initial.
-
8 C> 1998-12-15 | Iredell | Generic fft used, openmp directives inserted
-
9 C> 2013-01-16 | Iredell, Mirvis | Fixing afft negative sharing effect
-
10 C>
-
11 C> @author Iredell @date 96-02-29
-
12 
-
13 C> This subprogram performs a spherical transform between spectral
-
14 C> coefficients of scalar quantities and fields on a global
-
15 C> cylindrical grid.
-
16 C>
-
17 C> The wave-space can be either triangular or
-
18 C> rhomboidal. The grid-space can be either an equally-spaced grid
-
19 C> (with or without pole points) or a Gaussian grid.
-
20 C>
-
21 C> The wave and grid fields may have general indexing,
-
22 C> but each wave field is in sequential 'ibm order',
-
23 C> i.e. with zonal wavenumber as the slower index.
-
24 C>
-
25 C> Transforms are done in latitude pairs for efficiency;
-
26 C> thus grid arrays for each hemisphere must be passed.
-
27 C>
-
28 C> If so requested, just a subset of the latitude pairs
-
29 C> may be transformed in each invocation of the subprogram.
-
30 C> The transforms are all multiprocessed over latitude except
-
31 C> the transform from fourier to spectral is multiprocessed
-
32 C> over zonal wavenumber to ensure reproducibility.
-
33 C>
-
34 C> Transform several fields at a time to improve vectorization.
-
35 C> Subprogram can be called from a multiprocessing environment.
-
36 C>
-
37 C> Minimum grid dimensions for unaliased transforms to spectral:
-
38 C> DIMENSION |LINEAR |QUADRATIC
-
39 C> ----------------------- |--------- |-------------
-
40 C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2
-
41 C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1
-
42 C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1
-
43 C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3
-
44 C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3
-
45 C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1
-
46 C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1
-
47 C>
-
48 C> @param IROMB spectral domain shape
-
49 c> (0 for triangular, 1 for rhomboidal)
-
50 C> @param MAXWV spectral truncation
-
51 C> @param IDRT grid identifier
-
52 C> - IDRT=4 for Gaussian grid,
-
53 C> - IDRT=0 for equally-spaced grid including poles
-
54 C> - IDRT=256 for equally-spaced grid excluding poles
-
55 C> @param IMAX even number of longitudes.
-
56 C> @param JMAX number of latitudes.
-
57 C> @param KMAX number of fields to transform.
-
58 C> @param IP longitude index for the prime meridian
-
59 C> @param IS skip number between longitudes
-
60 C> @param JN skip number between n.h. latitudes from north
-
61 C> @param JS skip number between s.h. latitudes from south
-
62 C> @param KW skip number between wave fields
-
63 C> @param KG skip number between grid fields
-
64 C> @param JB latitude index (from pole) to begin transform
-
65 C> @param JE latitude index (from pole) to end transform
-
66 C> @param JC number of cpus over which to multiprocess
-
67 C> @param[out] WAVE wave fields if IDIR>0
-
68 C> @param[out] GRIDN n.h. grid fields (starting at JB) if IDIR<0
-
69 C> @param[out] GRIDS s.h. grid fields (starting at JB) if IDIR<0
-
70 C> @param IDIR transform flag
-
71 C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave)
-
72 C>
-
73 C> @author Iredell @date 96-02-29
-
74  SUBROUTINE sptranf(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
-
75  & IP,IS,JN,JS,KW,KG,JB,JE,JC,
-
76  & WAVE,GRIDN,GRIDS,IDIR)
-
77 
-
78  REAL WAVE(*),GRIDN(*),GRIDS(*)
-
79  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
-
80  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
81  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
82  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
-
83  REAL(8) AFFT(50000+4*IMAX), AFFT_TMP(50000+4*IMAX)
-
84  REAL CLAT(JB:JE),SLAT(JB:JE),WLAT(JB:JE)
-
85  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2,JB:JE)
-
86  REAL PLNTOP(MAXWV+1,JB:JE)
-
87  REAL WTOP(2*(MAXWV+1))
-
88  REAL G(IMAX,2)
-
89 ! write(0,*) 'sptranf top'
-
90 
-
91 C SET PARAMETERS
-
92  mp=0
-
93  CALL sptranf0(iromb,maxwv,idrt,imax,jmax,jb,je,
-
94  & eps,epstop,enn1,elonn1,eon,eontop,
-
95  & afft,clat,slat,wlat,pln,plntop)
-
96 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
97 C TRANSFORM WAVE TO GRID
-
98  IF(idir.GT.0) THEN
-
99 C$OMP PARALLEL DO PRIVATE(AFFT_TMP,KWS,WTOP,G,IJKN,IJKS)
-
100  DO k=1,kmax
-
101  afft_tmp=afft
-
102  kws=(k-1)*kw
-
103  wtop=0
-
104  DO j=jb,je
-
105  CALL sptranf1(iromb,maxwv,idrt,imax,jmax,j,j,
-
106  & eps,epstop,enn1,elonn1,eon,eontop,
-
107  & afft_tmp,clat(j),slat(j),wlat(j),
-
108  & pln(1,j),plntop(1,j),mp,
-
109  & wave(kws+1),wtop,g,idir)
-
110  IF(ip.EQ.1.AND.is.EQ.1) THEN
-
111  DO i=1,imax
-
112  ijkn=i+(j-jb)*jn+(k-1)*kg
-
113  ijks=i+(j-jb)*js+(k-1)*kg
-
114  gridn(ijkn)=g(i,1)
-
115  grids(ijks)=g(i,2)
-
116  ENDDO
-
117  ELSE
-
118  DO i=1,imax
-
119  ijkn=mod(i+ip-2,imax)*is+(j-jb)*jn+(k-1)*kg+1
-
120  ijks=mod(i+ip-2,imax)*is+(j-jb)*js+(k-1)*kg+1
-
121  gridn(ijkn)=g(i,1)
-
122  grids(ijks)=g(i,2)
-
123  ENDDO
-
124  ENDIF
-
125  ENDDO
-
126  ENDDO
-
127 
-
128 C TRANSFORM GRID TO WAVE
-
129  ELSE
-
130 C$OMP PARALLEL DO PRIVATE(AFFT_TMP,KWS,WTOP,G,IJKN,IJKS)
-
131  DO k=1,kmax
-
132  afft_tmp=afft
-
133  kws=(k-1)*kw
-
134  wtop=0
-
135  DO j=jb,je
-
136  IF(wlat(j).GT.0.) THEN
-
137  IF(ip.EQ.1.AND.is.EQ.1) THEN
-
138  DO i=1,imax
-
139  ijkn=i+(j-jb)*jn+(k-1)*kg
-
140  ijks=i+(j-jb)*js+(k-1)*kg
-
141  g(i,1)=gridn(ijkn)
-
142  g(i,2)=grids(ijks)
-
143  ENDDO
-
144  ELSE
-
145  DO i=1,imax
-
146  ijkn=mod(i+ip-2,imax)*is+(j-jb)*jn+(k-1)*kg+1
-
147  ijks=mod(i+ip-2,imax)*is+(j-jb)*js+(k-1)*kg+1
-
148  g(i,1)=gridn(ijkn)
-
149  g(i,2)=grids(ijks)
-
150  ENDDO
-
151  ENDIF
-
152  CALL sptranf1(iromb,maxwv,idrt,imax,jmax,j,j,
-
153  & eps,epstop,enn1,elonn1,eon,eontop,
-
154  & afft_tmp,clat(j),slat(j),wlat(j),
-
155  & pln(1,j),plntop(1,j),mp,
-
156  & wave(kws+1),wtop,g,idir)
-
157  ENDIF
-
158  ENDDO
-
159  ENDDO
-
160  ENDIF
-
161  END
-
subroutine sptranf0(IROMB, MAXWV, IDRT, IMAX, JMAX, JB, JE, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP, AFFT, CLAT, SLAT, WLAT, PLN, PLNTOP)
This subprogram performs an initialization for subprogram sptranf().
Definition: sptranf0.f:37
-
subroutine sptranf1(IROMB, MAXWV, IDRT, IMAX, JMAX, JB, JE, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP, AFFT, CLAT, SLAT, WLAT, PLN, PLNTOP, MP, W, WTOP, G, IDIR)
This subprogram performs an single latitude transform for subprogram sptranf().
Definition: sptranf1.f:44
-
subroutine sptranf(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IP, IS, JN, JS, KW, KG, JB, JE, JC, WAVE, GRIDN, GRIDS, IDIR)
This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
Definition: sptranf.f:77
+Go to the documentation of this file.
1C> @file
+
2C> @brief Perform a scalar spherical transform
+
3C>
+
4C> ### Program History Log
+
5C> Date | Programmer | Comments
+
6C> -----|------------|---------
+
7C> 96-02-29 | Iredell | Initial.
+
8C> 1998-12-15 | Iredell | Generic fft used, openmp directives inserted
+
9C> 2013-01-16 | Iredell, Mirvis | Fixing afft negative sharing effect
+
10C>
+
11C> @author Iredell @date 96-02-29
+
12
+
13C> This subprogram performs a spherical transform between spectral
+
14C> coefficients of scalar quantities and fields on a global
+
15C> cylindrical grid.
+
16C>
+
17C> The wave-space can be either triangular or
+
18C> rhomboidal. The grid-space can be either an equally-spaced grid
+
19C> (with or without pole points) or a Gaussian grid.
+
20C>
+
21C> The wave and grid fields may have general indexing,
+
22C> but each wave field is in sequential 'ibm order',
+
23C> i.e. with zonal wavenumber as the slower index.
+
24C>
+
25C> Transforms are done in latitude pairs for efficiency;
+
26C> thus grid arrays for each hemisphere must be passed.
+
27C>
+
28C> If so requested, just a subset of the latitude pairs
+
29C> may be transformed in each invocation of the subprogram.
+
30C> The transforms are all multiprocessed over latitude except
+
31C> the transform from fourier to spectral is multiprocessed
+
32C> over zonal wavenumber to ensure reproducibility.
+
33C>
+
34C> Transform several fields at a time to improve vectorization.
+
35C> Subprogram can be called from a multiprocessing environment.
+
36C>
+
37C> Minimum grid dimensions for unaliased transforms to spectral:
+
38C> DIMENSION |LINEAR |QUADRATIC
+
39C> ----------------------- |--------- |-------------
+
40C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2
+
41C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1
+
42C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1
+
43C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3
+
44C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3
+
45C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1
+
46C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1
+
47C>
+
48C> @param IROMB spectral domain shape
+
49c> (0 for triangular, 1 for rhomboidal)
+
50C> @param MAXWV spectral truncation
+
51C> @param IDRT grid identifier
+
52C> - IDRT=4 for Gaussian grid,
+
53C> - IDRT=0 for equally-spaced grid including poles
+
54C> - IDRT=256 for equally-spaced grid excluding poles
+
55C> @param IMAX even number of longitudes.
+
56C> @param JMAX number of latitudes.
+
57C> @param KMAX number of fields to transform.
+
58C> @param IP longitude index for the prime meridian
+
59C> @param IS skip number between longitudes
+
60C> @param JN skip number between n.h. latitudes from north
+
61C> @param JS skip number between s.h. latitudes from south
+
62C> @param KW skip number between wave fields
+
63C> @param KG skip number between grid fields
+
64C> @param JB latitude index (from pole) to begin transform
+
65C> @param JE latitude index (from pole) to end transform
+
66C> @param JC number of cpus over which to multiprocess
+
67C> @param[out] WAVE wave fields if IDIR>0
+
68C> @param[out] GRIDN n.h. grid fields (starting at JB) if IDIR<0
+
69C> @param[out] GRIDS s.h. grid fields (starting at JB) if IDIR<0
+
70C> @param IDIR transform flag
+
71C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave)
+
72C>
+
73C> @author Iredell @date 96-02-29
+
+
74 SUBROUTINE sptranf(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
+
75 & IP,IS,JN,JS,KW,KG,JB,JE,JC,
+
76 & WAVE,GRIDN,GRIDS,IDIR)
+
77
+
78 REAL WAVE(*),GRIDN(*),GRIDS(*)
+
79 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
+
80 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
81 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
82 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
+
83 REAL(8) AFFT(50000+4*IMAX), AFFT_TMP(50000+4*IMAX)
+
84 REAL CLAT(JB:JE),SLAT(JB:JE),WLAT(JB:JE)
+
85 REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2,JB:JE)
+
86 REAL PLNTOP(MAXWV+1,JB:JE)
+
87 REAL WTOP(2*(MAXWV+1))
+
88 REAL G(IMAX,2)
+
89! write(0,*) 'sptranf top'
+
90
+
91C SET PARAMETERS
+
92 mp=0
+
93 CALL sptranf0(iromb,maxwv,idrt,imax,jmax,jb,je,
+
94 & eps,epstop,enn1,elonn1,eon,eontop,
+
95 & afft,clat,slat,wlat,pln,plntop)
+
96C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
97C TRANSFORM WAVE TO GRID
+
98 IF(idir.GT.0) THEN
+
99C$OMP PARALLEL DO PRIVATE(AFFT_TMP,KWS,WTOP,G,IJKN,IJKS)
+
100 DO k=1,kmax
+
101 afft_tmp=afft
+
102 kws=(k-1)*kw
+
103 wtop=0
+
104 DO j=jb,je
+
105 CALL sptranf1(iromb,maxwv,idrt,imax,jmax,j,j,
+
106 & eps,epstop,enn1,elonn1,eon,eontop,
+
107 & afft_tmp,clat(j),slat(j),wlat(j),
+
108 & pln(1,j),plntop(1,j),mp,
+
109 & wave(kws+1),wtop,g,idir)
+
110 IF(ip.EQ.1.AND.is.EQ.1) THEN
+
111 DO i=1,imax
+
112 ijkn=i+(j-jb)*jn+(k-1)*kg
+
113 ijks=i+(j-jb)*js+(k-1)*kg
+
114 gridn(ijkn)=g(i,1)
+
115 grids(ijks)=g(i,2)
+
116 ENDDO
+
117 ELSE
+
118 DO i=1,imax
+
119 ijkn=mod(i+ip-2,imax)*is+(j-jb)*jn+(k-1)*kg+1
+
120 ijks=mod(i+ip-2,imax)*is+(j-jb)*js+(k-1)*kg+1
+
121 gridn(ijkn)=g(i,1)
+
122 grids(ijks)=g(i,2)
+
123 ENDDO
+
124 ENDIF
+
125 ENDDO
+
126 ENDDO
+
127
+
128C TRANSFORM GRID TO WAVE
+
129 ELSE
+
130C$OMP PARALLEL DO PRIVATE(AFFT_TMP,KWS,WTOP,G,IJKN,IJKS)
+
131 DO k=1,kmax
+
132 afft_tmp=afft
+
133 kws=(k-1)*kw
+
134 wtop=0
+
135 DO j=jb,je
+
136 IF(wlat(j).GT.0.) THEN
+
137 IF(ip.EQ.1.AND.is.EQ.1) THEN
+
138 DO i=1,imax
+
139 ijkn=i+(j-jb)*jn+(k-1)*kg
+
140 ijks=i+(j-jb)*js+(k-1)*kg
+
141 g(i,1)=gridn(ijkn)
+
142 g(i,2)=grids(ijks)
+
143 ENDDO
+
144 ELSE
+
145 DO i=1,imax
+
146 ijkn=mod(i+ip-2,imax)*is+(j-jb)*jn+(k-1)*kg+1
+
147 ijks=mod(i+ip-2,imax)*is+(j-jb)*js+(k-1)*kg+1
+
148 g(i,1)=gridn(ijkn)
+
149 g(i,2)=grids(ijks)
+
150 ENDDO
+
151 ENDIF
+
152 CALL sptranf1(iromb,maxwv,idrt,imax,jmax,j,j,
+
153 & eps,epstop,enn1,elonn1,eon,eontop,
+
154 & afft_tmp,clat(j),slat(j),wlat(j),
+
155 & pln(1,j),plntop(1,j),mp,
+
156 & wave(kws+1),wtop,g,idir)
+
157 ENDIF
+
158 ENDDO
+
159 ENDDO
+
160 ENDIF
+
+
161 END
+
subroutine sptranf0(iromb, maxwv, idrt, imax, jmax, jb, je, eps, epstop, enn1, elonn1, eon, eontop, afft, clat, slat, wlat, pln, plntop)
This subprogram performs an initialization for subprogram sptranf().
Definition sptranf0.f:37
+
subroutine sptranf1(iromb, maxwv, idrt, imax, jmax, jb, je, eps, epstop, enn1, elonn1, eon, eontop, afft, clat, slat, wlat, pln, plntop, mp, w, wtop, g, idir)
This subprogram performs an single latitude transform for subprogram sptranf().
Definition sptranf1.f:44
+
subroutine sptranf(iromb, maxwv, idrt, imax, jmax, kmax, ip, is, jn, js, kw, kg, jb, je, jc, wave, gridn, grids, idir)
This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
Definition sptranf.f:77
diff --git a/sptranfv_8f.html b/sptranfv_8f.html index 46469efd..d9ac39f3 100644 --- a/sptranfv_8f.html +++ b/sptranfv_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptranfv.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptranfv.f File Reference
+
sptranfv.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptranfv (IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IP, IS, JN, JS, KW, KG, JB, JE, JC, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
 This subprogram performs a spherical transform between spectral coefficients of divergences and curls and vector fields on a global cylindrical grid. More...
 
subroutine sptranfv (iromb, maxwv, idrt, imax, jmax, kmax, ip, is, jn, js, kw, kg, jb, je, jc, waved, wavez, gridun, gridus, gridvn, gridvs, idir)
 This subprogram performs a spherical transform between spectral coefficients of divergences and curls and vector fields on a global cylindrical grid.
 

Detailed Description

Perform a vector spherical transform.

@@ -119,8 +125,8 @@

Definition in file sptranfv.f.

Function/Subroutine Documentation

- -

◆ sptranfv()

+ +

◆ sptranfv()

diff --git a/sptranfv_8f.js b/sptranfv_8f.js index 7311d700..4213df7a 100644 --- a/sptranfv_8f.js +++ b/sptranfv_8f.js @@ -1,4 +1,4 @@ var sptranfv_8f = [ - [ "sptranfv", "sptranfv_8f.html#a1a7aabbd358d4fe984dac6813c98b106", null ] + [ "sptranfv", "sptranfv_8f.html#aa84cd9dc4da90d4245a32e5658bbf513", null ] ]; \ No newline at end of file diff --git a/sptranfv_8f_source.html b/sptranfv_8f_source.html index 91e20040..27e14adc 100644 --- a/sptranfv_8f_source.html +++ b/sptranfv_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptranfv.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,224 +81,232 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptranfv.f
+
sptranfv.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Perform a vector spherical transform
-
3 C>
-
4 C> ### Program History Log
-
5 C> Date | Programmer | Comments
-
6 C> -----|------------|---------
-
7 C> 96-02-29 | Iredell | Initial.
-
8 C> 1998-12-15 | Iredell | Generic fft used, openmp directives inserted
-
9 C> 2013-01-16 | Iredell & MIRVIS | Fixing afft negative sharing effect during omp loops
-
10 C>
-
11 C> @author Iredell @date 96-02-29
-
12 
-
13 C> This subprogram performs a spherical transform
-
14 C> between spectral coefficients of divergences and curls
-
15 C> and vector fields on a global cylindrical grid.
-
16 C>
-
17 C> The wave-space can be either triangular or rhomboidal.
-
18 C>
-
19 C> The grid-space can be either an equally-spaced grid
-
20 C> (with or without pole points) or a Gaussian grid.
-
21 C>
-
22 C> The wave and grid fields may have general indexing,
-
23 C> but each wave field is in sequential 'ibm order',
-
24 C> i.e. with zonal wavenumber as the slower index.
-
25 C>
-
26 C> Transforms are done in latitude pairs for efficiency;
-
27 C> thus grid arrays for each hemisphere must be passed.
-
28 C> if so requested, just a subset of the latitude pairs
-
29 C> may be transformed in each invocation of the subprogram.
-
30 C>
-
31 C> The transforms are all multiprocessed over latitude except
-
32 C> the transform from fourier to spectral is multiprocessed
-
33 C> over zonal wavenumber to ensure reproducibility.
-
34 C>
-
35 C> Transform several fields at a time to improve vectorization.
-
36 C> subprogram can be called from a multiprocessing environment.
-
37 C>
-
38 C> Minimum grid dimensions for unaliased transforms to spectral:
-
39 C> DIMENSION |LINEAR |QUADRATIC
-
40 C> ----------------------- |--------- |-------------
-
41 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
-
42 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
-
43 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
-
44 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
-
45 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
-
46 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
-
47 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
-
48 C>
-
49 C> @param IROMB spectral domain shape
-
50 C> (0 for triangular, 1 for rhomboidal)
-
51 C> @param MAXWV spectral truncation
-
52 C> @param IDRT grid identifier
-
53 C> - IDRT=4 for Gaussian grid
-
54 C> - IDRT=0 for equally-spaced grid including poles
-
55 C> - IDRT=256 for equally-spaced grid excluding poles
-
56 C> @param IMAX even number of longitudes.
-
57 C> @param JMAX number of latitudes.
-
58 C> @param KMAX number of fields to transform.
-
59 C> @param IP longitude index for the prime meridian
-
60 C> @param IS skip number between longitudes
-
61 C> @param JN skip number between n.h. latitudes from north
-
62 C> @param JS skip number between s.h. latitudes from south
-
63 C> @param KW skip number between wave fields
-
64 C> @param KG skip number between grid fields
-
65 C> @param JB latitude index (from pole) to begin transform
-
66 C> @param JE latitude index (from pole) to end transform
-
67 C> @param JC number of cpus over which to multiprocess
-
68 C> @param[out] WAVED wave divergence fields if IDIR>0
-
69 C> [WAVED=(D(GRIDU)/DLAM+D(CLAT*GRIDV)/DPHI)/(CLAT*RERTH)]
-
70 C> @param[out] WAVEZ wave vorticity fields if IDIR>0
-
71 C> [WAVEZ=(D(GRIDV)/DLAM-D(CLAT*GRIDU)/DPHI)/(CLAT*RERTH)]
-
72 C> @param[out] GRIDUN N.H. grid u-winds (starting at jb) if IDIR<0
-
73 C> @param[out] GRIDUS S.H. grid u-winds (starting at jb) if IDIR<0
-
74 C> @param[out] GRIDVN N.H. grid v-winds (starting at jb) if IDIR<0
-
75 C> @param[out] GRIDVS S.H. grid v-winds (starting at jb) if IDIR<0
-
76 C> @param IDIR transform flag
-
77 C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
-
78 C>
-
79 C> @author Iredell @date 96-02-29
-
80  SUBROUTINE sptranfv(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
-
81  & IP,IS,JN,JS,KW,KG,JB,JE,JC,
-
82  & WAVED,WAVEZ,GRIDUN,GRIDUS,GRIDVN,GRIDVS,IDIR)
-
83 
-
84  REAL WAVED(*),WAVEZ(*),GRIDUN(*),GRIDUS(*),GRIDVN(*),GRIDVS(*)
-
85  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
-
86  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
87  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
-
88  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
-
89  REAL(8) AFFT(50000+4*IMAX), AFFT_TMP(50000+4*IMAX)
-
90  REAL CLAT(JB:JE),SLAT(JB:JE),WLAT(JB:JE)
-
91  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2,JB:JE)
-
92  REAL PLNTOP(MAXWV+1,JB:JE)
-
93  INTEGER MP
-
94  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2,2)
-
95  REAL WTOP(2*(MAXWV+1),2)
-
96  REAL G(IMAX,2,2)
-
97  REAL WINC((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2,2)
-
98 
-
99 C SET PARAMETERS
-
100  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
101  mp=1
-
102  CALL sptranf0(iromb,maxwv,idrt,imax,jmax,jb,je,
-
103  & eps,epstop,enn1,elonn1,eon,eontop,
-
104  & afft,clat,slat,wlat,pln,plntop)
-
105 
-
106 C TRANSFORM WAVE TO GRID
-
107  IF(idir.GT.0) THEN
-
108 C$OMP PARALLEL DO PRIVATE(AFFT_TMP,KWS,W,WTOP,G,IJKN,IJKS)
-
109  DO k=1,kmax
-
110  afft_tmp=afft
-
111  kws=(k-1)*kw
-
112  CALL spdz2uv(iromb,maxwv,enn1,elonn1,eon,eontop,
-
113  & waved(kws+1),wavez(kws+1),
-
114  & w(1,1),w(1,2),wtop(1,1),wtop(1,2))
-
115  DO j=jb,je
-
116  CALL sptranf1(iromb,maxwv,idrt,imax,jmax,j,j,
-
117  & eps,epstop,enn1,elonn1,eon,eontop,
-
118  & afft_tmp,clat(j),slat(j),wlat(j),
-
119  & pln(1,j),plntop(1,j),mp,
-
120  & w(1,1),wtop(1,1),g(1,1,1),idir)
-
121  CALL sptranf1(iromb,maxwv,idrt,imax,jmax,j,j,
-
122  & eps,epstop,enn1,elonn1,eon,eontop,
-
123  & afft_tmp,clat(j),slat(j),wlat(j),
-
124  & pln(1,j),plntop(1,j),mp,
-
125  & w(1,2),wtop(1,2),g(1,1,2),idir)
-
126  IF(ip.EQ.1.AND.is.EQ.1) THEN
-
127  DO i=1,imax
-
128  ijkn=i+(j-jb)*jn+(k-1)*kg
-
129  ijks=i+(j-jb)*js+(k-1)*kg
-
130  gridun(ijkn)=g(i,1,1)
-
131  gridus(ijks)=g(i,2,1)
-
132  gridvn(ijkn)=g(i,1,2)
-
133  gridvs(ijks)=g(i,2,2)
-
134  ENDDO
-
135  ELSE
-
136  DO i=1,imax
-
137  ijkn=mod(i+ip-2,imax)*is+(j-jb)*jn+(k-1)*kg+1
-
138  ijks=mod(i+ip-2,imax)*is+(j-jb)*js+(k-1)*kg+1
-
139  gridun(ijkn)=g(i,1,1)
-
140  gridus(ijks)=g(i,2,1)
-
141  gridvn(ijkn)=g(i,1,2)
-
142  gridvs(ijks)=g(i,2,2)
-
143  ENDDO
-
144  ENDIF
-
145  ENDDO
-
146  ENDDO
-
147 
-
148 C TRANSFORM GRID TO WAVE
-
149  ELSE
-
150 C$OMP PARALLEL DO PRIVATE(AFFT_TMP,KWS,W,WTOP,G,IJKN,IJKS,WINC)
-
151  DO k=1,kmax
-
152  afft_tmp=afft
-
153  kws=(k-1)*kw
-
154  w=0
-
155  wtop=0
-
156  DO j=jb,je
-
157  IF(wlat(j).GT.0.) THEN
-
158  IF(ip.EQ.1.AND.is.EQ.1) THEN
-
159  DO i=1,imax
-
160  ijkn=i+(j-jb)*jn+(k-1)*kg
-
161  ijks=i+(j-jb)*js+(k-1)*kg
-
162  g(i,1,1)=gridun(ijkn)/clat(j)**2
-
163  g(i,2,1)=gridus(ijks)/clat(j)**2
-
164  g(i,1,2)=gridvn(ijkn)/clat(j)**2
-
165  g(i,2,2)=gridvs(ijks)/clat(j)**2
-
166  ENDDO
-
167  ELSE
-
168  DO i=1,imax
-
169  ijkn=mod(i+ip-2,imax)*is+(j-jb)*jn+(k-1)*kg+1
-
170  ijks=mod(i+ip-2,imax)*is+(j-jb)*js+(k-1)*kg+1
-
171  g(i,1,1)=gridun(ijkn)/clat(j)**2
-
172  g(i,2,1)=gridus(ijks)/clat(j)**2
-
173  g(i,1,2)=gridvn(ijkn)/clat(j)**2
-
174  g(i,2,2)=gridvs(ijks)/clat(j)**2
-
175  ENDDO
-
176  ENDIF
-
177  CALL sptranf1(iromb,maxwv,idrt,imax,jmax,j,j,
-
178  & eps,epstop,enn1,elonn1,eon,eontop,
-
179  & afft_tmp,clat(j),slat(j),wlat(j),
-
180  & pln(1,j),plntop(1,j),mp,
-
181  & w(1,1),wtop(1,1),g(1,1,1),idir)
-
182  CALL sptranf1(iromb,maxwv,idrt,imax,jmax,j,j,
-
183  & eps,epstop,enn1,elonn1,eon,eontop,
-
184  & afft_tmp,clat(j),slat(j),wlat(j),
-
185  & pln(1,j),plntop(1,j),mp,
-
186  & w(1,2),wtop(1,2),g(1,1,2),idir)
-
187  ENDIF
-
188  ENDDO
-
189  CALL spuv2dz(iromb,maxwv,enn1,elonn1,eon,eontop,
-
190  & w(1,1),w(1,2),wtop(1,1),wtop(1,2),
-
191  & winc(1,1),winc(1,2))
-
192  waved(kws+1:kws+2*mx)=waved(kws+1:kws+2*mx)+winc(1:2*mx,1)
-
193  wavez(kws+1:kws+2*mx)=wavez(kws+1:kws+2*mx)+winc(1:2*mx,2)
-
194  ENDDO
-
195  ENDIF
-
196  END
-
subroutine spdz2uv(I, M, ENN1, ELONN1, EON, EONTOP, D, Z, U, V, UTOP, VTOP)
Computes the wind components from divergence and vorticity in spectral space.
Definition: spdz2uv.f:49
-
subroutine sptranf0(IROMB, MAXWV, IDRT, IMAX, JMAX, JB, JE, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP, AFFT, CLAT, SLAT, WLAT, PLN, PLNTOP)
This subprogram performs an initialization for subprogram sptranf().
Definition: sptranf0.f:37
-
subroutine sptranf1(IROMB, MAXWV, IDRT, IMAX, JMAX, JB, JE, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP, AFFT, CLAT, SLAT, WLAT, PLN, PLNTOP, MP, W, WTOP, G, IDIR)
This subprogram performs an single latitude transform for subprogram sptranf().
Definition: sptranf1.f:44
-
subroutine sptranfv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IP, IS, JN, JS, KW, KG, JB, JE, JC, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
Definition: sptranfv.f:83
-
subroutine spuv2dz(I, M, ENN1, ELONN1, EON, EONTOP, U, V, UTOP, VTOP, D, Z)
Computes the divergence and vorticity from wind components in spectral space.
Definition: spuv2dz.f:49
+Go to the documentation of this file.
1C> @file
+
2C> @brief Perform a vector spherical transform
+
3C>
+
4C> ### Program History Log
+
5C> Date | Programmer | Comments
+
6C> -----|------------|---------
+
7C> 96-02-29 | Iredell | Initial.
+
8C> 1998-12-15 | Iredell | Generic fft used, openmp directives inserted
+
9C> 2013-01-16 | Iredell & MIRVIS | Fixing afft negative sharing effect during omp loops
+
10C>
+
11C> @author Iredell @date 96-02-29
+
12
+
13C> This subprogram performs a spherical transform
+
14C> between spectral coefficients of divergences and curls
+
15C> and vector fields on a global cylindrical grid.
+
16C>
+
17C> The wave-space can be either triangular or rhomboidal.
+
18C>
+
19C> The grid-space can be either an equally-spaced grid
+
20C> (with or without pole points) or a Gaussian grid.
+
21C>
+
22C> The wave and grid fields may have general indexing,
+
23C> but each wave field is in sequential 'ibm order',
+
24C> i.e. with zonal wavenumber as the slower index.
+
25C>
+
26C> Transforms are done in latitude pairs for efficiency;
+
27C> thus grid arrays for each hemisphere must be passed.
+
28C> if so requested, just a subset of the latitude pairs
+
29C> may be transformed in each invocation of the subprogram.
+
30C>
+
31C> The transforms are all multiprocessed over latitude except
+
32C> the transform from fourier to spectral is multiprocessed
+
33C> over zonal wavenumber to ensure reproducibility.
+
34C>
+
35C> Transform several fields at a time to improve vectorization.
+
36C> subprogram can be called from a multiprocessing environment.
+
37C>
+
38C> Minimum grid dimensions for unaliased transforms to spectral:
+
39C> DIMENSION |LINEAR |QUADRATIC
+
40C> ----------------------- |--------- |-------------
+
41C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
+
42C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
+
43C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
+
44C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
+
45C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
+
46C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
+
47C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
+
48C>
+
49C> @param IROMB spectral domain shape
+
50C> (0 for triangular, 1 for rhomboidal)
+
51C> @param MAXWV spectral truncation
+
52C> @param IDRT grid identifier
+
53C> - IDRT=4 for Gaussian grid
+
54C> - IDRT=0 for equally-spaced grid including poles
+
55C> - IDRT=256 for equally-spaced grid excluding poles
+
56C> @param IMAX even number of longitudes.
+
57C> @param JMAX number of latitudes.
+
58C> @param KMAX number of fields to transform.
+
59C> @param IP longitude index for the prime meridian
+
60C> @param IS skip number between longitudes
+
61C> @param JN skip number between n.h. latitudes from north
+
62C> @param JS skip number between s.h. latitudes from south
+
63C> @param KW skip number between wave fields
+
64C> @param KG skip number between grid fields
+
65C> @param JB latitude index (from pole) to begin transform
+
66C> @param JE latitude index (from pole) to end transform
+
67C> @param JC number of cpus over which to multiprocess
+
68C> @param[out] WAVED wave divergence fields if IDIR>0
+
69C> [WAVED=(D(GRIDU)/DLAM+D(CLAT*GRIDV)/DPHI)/(CLAT*RERTH)]
+
70C> @param[out] WAVEZ wave vorticity fields if IDIR>0
+
71C> [WAVEZ=(D(GRIDV)/DLAM-D(CLAT*GRIDU)/DPHI)/(CLAT*RERTH)]
+
72C> @param[out] GRIDUN N.H. grid u-winds (starting at jb) if IDIR<0
+
73C> @param[out] GRIDUS S.H. grid u-winds (starting at jb) if IDIR<0
+
74C> @param[out] GRIDVN N.H. grid v-winds (starting at jb) if IDIR<0
+
75C> @param[out] GRIDVS S.H. grid v-winds (starting at jb) if IDIR<0
+
76C> @param IDIR transform flag
+
77C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
+
78C>
+
79C> @author Iredell @date 96-02-29
+
+
80 SUBROUTINE sptranfv(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
+
81 & IP,IS,JN,JS,KW,KG,JB,JE,JC,
+
82 & WAVED,WAVEZ,GRIDUN,GRIDUS,GRIDVN,GRIDVS,IDIR)
+
83
+
84 REAL WAVED(*),WAVEZ(*),GRIDUN(*),GRIDUS(*),GRIDVN(*),GRIDVS(*)
+
85 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
+
86 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
87 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
+
88 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
+
89 REAL(8) AFFT(50000+4*IMAX), AFFT_TMP(50000+4*IMAX)
+
90 REAL CLAT(JB:JE),SLAT(JB:JE),WLAT(JB:JE)
+
91 REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2,JB:JE)
+
92 REAL PLNTOP(MAXWV+1,JB:JE)
+
93 INTEGER MP
+
94 REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2,2)
+
95 REAL WTOP(2*(MAXWV+1),2)
+
96 REAL G(IMAX,2,2)
+
97 REAL WINC((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2,2)
+
98
+
99C SET PARAMETERS
+
100 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
101 mp=1
+
102 CALL sptranf0(iromb,maxwv,idrt,imax,jmax,jb,je,
+
103 & eps,epstop,enn1,elonn1,eon,eontop,
+
104 & afft,clat,slat,wlat,pln,plntop)
+
105
+
106C TRANSFORM WAVE TO GRID
+
107 IF(idir.GT.0) THEN
+
108C$OMP PARALLEL DO PRIVATE(AFFT_TMP,KWS,W,WTOP,G,IJKN,IJKS)
+
109 DO k=1,kmax
+
110 afft_tmp=afft
+
111 kws=(k-1)*kw
+
112 CALL spdz2uv(iromb,maxwv,enn1,elonn1,eon,eontop,
+
113 & waved(kws+1),wavez(kws+1),
+
114 & w(1,1),w(1,2),wtop(1,1),wtop(1,2))
+
115 DO j=jb,je
+
116 CALL sptranf1(iromb,maxwv,idrt,imax,jmax,j,j,
+
117 & eps,epstop,enn1,elonn1,eon,eontop,
+
118 & afft_tmp,clat(j),slat(j),wlat(j),
+
119 & pln(1,j),plntop(1,j),mp,
+
120 & w(1,1),wtop(1,1),g(1,1,1),idir)
+
121 CALL sptranf1(iromb,maxwv,idrt,imax,jmax,j,j,
+
122 & eps,epstop,enn1,elonn1,eon,eontop,
+
123 & afft_tmp,clat(j),slat(j),wlat(j),
+
124 & pln(1,j),plntop(1,j),mp,
+
125 & w(1,2),wtop(1,2),g(1,1,2),idir)
+
126 IF(ip.EQ.1.AND.is.EQ.1) THEN
+
127 DO i=1,imax
+
128 ijkn=i+(j-jb)*jn+(k-1)*kg
+
129 ijks=i+(j-jb)*js+(k-1)*kg
+
130 gridun(ijkn)=g(i,1,1)
+
131 gridus(ijks)=g(i,2,1)
+
132 gridvn(ijkn)=g(i,1,2)
+
133 gridvs(ijks)=g(i,2,2)
+
134 ENDDO
+
135 ELSE
+
136 DO i=1,imax
+
137 ijkn=mod(i+ip-2,imax)*is+(j-jb)*jn+(k-1)*kg+1
+
138 ijks=mod(i+ip-2,imax)*is+(j-jb)*js+(k-1)*kg+1
+
139 gridun(ijkn)=g(i,1,1)
+
140 gridus(ijks)=g(i,2,1)
+
141 gridvn(ijkn)=g(i,1,2)
+
142 gridvs(ijks)=g(i,2,2)
+
143 ENDDO
+
144 ENDIF
+
145 ENDDO
+
146 ENDDO
+
147
+
148C TRANSFORM GRID TO WAVE
+
149 ELSE
+
150C$OMP PARALLEL DO PRIVATE(AFFT_TMP,KWS,W,WTOP,G,IJKN,IJKS,WINC)
+
151 DO k=1,kmax
+
152 afft_tmp=afft
+
153 kws=(k-1)*kw
+
154 w=0
+
155 wtop=0
+
156 DO j=jb,je
+
157 IF(wlat(j).GT.0.) THEN
+
158 IF(ip.EQ.1.AND.is.EQ.1) THEN
+
159 DO i=1,imax
+
160 ijkn=i+(j-jb)*jn+(k-1)*kg
+
161 ijks=i+(j-jb)*js+(k-1)*kg
+
162 g(i,1,1)=gridun(ijkn)/clat(j)**2
+
163 g(i,2,1)=gridus(ijks)/clat(j)**2
+
164 g(i,1,2)=gridvn(ijkn)/clat(j)**2
+
165 g(i,2,2)=gridvs(ijks)/clat(j)**2
+
166 ENDDO
+
167 ELSE
+
168 DO i=1,imax
+
169 ijkn=mod(i+ip-2,imax)*is+(j-jb)*jn+(k-1)*kg+1
+
170 ijks=mod(i+ip-2,imax)*is+(j-jb)*js+(k-1)*kg+1
+
171 g(i,1,1)=gridun(ijkn)/clat(j)**2
+
172 g(i,2,1)=gridus(ijks)/clat(j)**2
+
173 g(i,1,2)=gridvn(ijkn)/clat(j)**2
+
174 g(i,2,2)=gridvs(ijks)/clat(j)**2
+
175 ENDDO
+
176 ENDIF
+
177 CALL sptranf1(iromb,maxwv,idrt,imax,jmax,j,j,
+
178 & eps,epstop,enn1,elonn1,eon,eontop,
+
179 & afft_tmp,clat(j),slat(j),wlat(j),
+
180 & pln(1,j),plntop(1,j),mp,
+
181 & w(1,1),wtop(1,1),g(1,1,1),idir)
+
182 CALL sptranf1(iromb,maxwv,idrt,imax,jmax,j,j,
+
183 & eps,epstop,enn1,elonn1,eon,eontop,
+
184 & afft_tmp,clat(j),slat(j),wlat(j),
+
185 & pln(1,j),plntop(1,j),mp,
+
186 & w(1,2),wtop(1,2),g(1,1,2),idir)
+
187 ENDIF
+
188 ENDDO
+
189 CALL spuv2dz(iromb,maxwv,enn1,elonn1,eon,eontop,
+
190 & w(1,1),w(1,2),wtop(1,1),wtop(1,2),
+
191 & winc(1,1),winc(1,2))
+
192 waved(kws+1:kws+2*mx)=waved(kws+1:kws+2*mx)+winc(1:2*mx,1)
+
193 wavez(kws+1:kws+2*mx)=wavez(kws+1:kws+2*mx)+winc(1:2*mx,2)
+
194 ENDDO
+
195 ENDIF
+
+
196 END
+
subroutine spdz2uv(i, m, enn1, elonn1, eon, eontop, d, z, u, v, utop, vtop)
Computes the wind components from divergence and vorticity in spectral space.
Definition spdz2uv.f:49
+
subroutine sptranf0(iromb, maxwv, idrt, imax, jmax, jb, je, eps, epstop, enn1, elonn1, eon, eontop, afft, clat, slat, wlat, pln, plntop)
This subprogram performs an initialization for subprogram sptranf().
Definition sptranf0.f:37
+
subroutine sptranf1(iromb, maxwv, idrt, imax, jmax, jb, je, eps, epstop, enn1, elonn1, eon, eontop, afft, clat, slat, wlat, pln, plntop, mp, w, wtop, g, idir)
This subprogram performs an single latitude transform for subprogram sptranf().
Definition sptranf1.f:44
+
subroutine sptranfv(iromb, maxwv, idrt, imax, jmax, kmax, ip, is, jn, js, kw, kg, jb, je, jc, waved, wavez, gridun, gridus, gridvn, gridvs, idir)
This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
Definition sptranfv.f:83
+
subroutine spuv2dz(i, m, enn1, elonn1, eon, eontop, u, v, utop, vtop, d, z)
Computes the divergence and vorticity from wind components in spectral space.
Definition spuv2dz.f:49
diff --git a/sptranv_8f.html b/sptranv_8f.html index c95dd51c..31a27a10 100644 --- a/sptranv_8f.html +++ b/sptranv_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptranv.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptranv.f File Reference
+
sptranv.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptranv (IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
 This subprogram performs a spherical transform between spectral coefficients of divergences and curls and vector fields on a global cylindrical grid. More...
 
subroutine sptranv (iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, waved, wavez, gridun, gridus, gridvn, gridvs, idir)
 This subprogram performs a spherical transform between spectral coefficients of divergences and curls and vector fields on a global cylindrical grid.
 

Detailed Description

Perform a vector spherical transform.

@@ -117,8 +123,8 @@

Definition in file sptranv.f.

Function/Subroutine Documentation

- -

◆ sptranv()

+ +

◆ sptranv()

diff --git a/sptranv_8f.js b/sptranv_8f.js index ef79c537..4e7f80e1 100644 --- a/sptranv_8f.js +++ b/sptranv_8f.js @@ -1,4 +1,4 @@ var sptranv_8f = [ - [ "sptranv", "sptranv_8f.html#a7d6aaa3ed70df1dfaf8dd4443b7190c1", null ] + [ "sptranv", "sptranv_8f.html#ad8f5c701843b1f78e093048113b1f454", null ] ]; \ No newline at end of file diff --git a/sptranv_8f_source.html b/sptranv_8f_source.html index 1493c46d..6d67b4fc 100644 --- a/sptranv_8f_source.html +++ b/sptranv_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptranv.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,152 +81,160 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptranv.f
+
sptranv.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Perform a vector spherical transform.
-
3 C>
-
4 C> ### Program History Log
-
5 C> Date | Programmer | Comments
-
6 C> -----|------------|---------
-
7 C> 96-02-29 | IREDELL | Initial.
-
8 C> 1998-12-15 | IREDELL | Generic fft used, openmp directives inserted
-
9 C>
-
10 C> @author IREDELL @date 96-02-29
-
11 
-
12 C> This subprogram performs a spherical transform
-
13 C> between spectral coefficients of divergences and curls
-
14 C> and vector fields on a global cylindrical grid.
-
15 C>
-
16 C> The wave-space can be either triangular or rhomboidal.
-
17 C>
-
18 C> The grid-space can be either an equally-spaced grid
-
19 C> (with or without pole points) or a Gaussian grid.
-
20 C> the wave and grid fields may have general indexing,
-
21 C> but each wave field is in sequential 'ibm order',
-
22 C> i.e. with zonal wavenumber as the slower index.
-
23 C>
-
24 C> Transforms are done in latitude pairs for efficiency;
-
25 C> thus grid arrays for each hemisphere must be passed.
-
26 C> If so requested, just a subset of the latitude pairs
-
27 C> may be transformed in each invocation of the subprogram.
-
28 C>
-
29 C> The transforms are all multiprocessed over latitude except
-
30 C> the transform from fourier to spectral is multiprocessed
-
31 C> over zonal wavenumber to ensure reproducibility.
-
32 C>
-
33 C> Transform several fields at a time to improve vectorization.
-
34 C> Subprogram can be called from a multiprocessing environment.
-
35 C>
-
36 C> Minimum grid dimensions for unaliased transforms to spectral:
-
37 C> DIMENSION |LINEAR |QUADRATIC
-
38 C> ----------------------- |--------- |-------------
-
39 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
-
40 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
-
41 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
-
42 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
-
43 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
-
44 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
-
45 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
-
46 C>
-
47 C> @param IROMB SPECTRAL DOMAIN SHAPE
-
48 C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
-
49 C> @param MAXWV SPECTRAL TRUNCATION
-
50 C> @param IDRT GRID IDENTIFIER
-
51 C> - IDRT=4 FOR GAUSSIAN GRID,
-
52 C> - IDRT=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
-
53 C> - IDRT=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES
-
54 C> @param IMAX EVEN NUMBER OF LONGITUDES.
-
55 C> @param JMAX NUMBER OF LATITUDES.
-
56 C> @param KMAX NUMBER OF FIELDS TO TRANSFORM.
-
57 C> @param IPRIME LONGITUDE INDEX FOR THE PRIME MERIDIAN.
-
58 C> (DEFAULTS TO 1 IF IPRIME=0)
-
59 C> @param ISKIP SKIP NUMBER BETWEEN LONGITUDES
-
60 C> (DEFAULTS TO 1 IF ISKIP=0)
-
61 C> @param JNSKIP SKIP NUMBER BETWEEN N.H. LATITUDES FROM NORTH
-
62 C> (DEFAULTS TO IMAX IF JNSKIP=0)
-
63 C> @param JSSKIP SKIP NUMBER BETWEEN S.H. LATITUDES FROM SOUTH
-
64 C> (DEFAULTS TO -IMAX IF JSSKIP=0)
-
65 C> @param KWSKIP SKIP NUMBER BETWEEN WAVE FIELDS
-
66 C> (DEFAULTS TO (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0)
-
67 C> @param KGSKIP SKIP NUMBER BETWEEN GRID FIELDS
-
68 C> (DEFAULTS TO IMAX*JMAX IF KGSKIP=0)
-
69 C> @param JBEG LATITUDE INDEX (FROM POLE) TO BEGIN TRANSFORM
-
70 C> - DEFAULTS TO 1 IF JBEG=0
-
71 C> - IF JBEG=0 AND IDIR<0, WAVE IS ZEROED BEFORE TRANSFORM
-
72 C> @param JEND LATITUDE INDEX (FROM POLE) TO END TRANSFORM
-
73 C> (DEFAULTS TO (JMAX+1)/2 IF JEND=0)
-
74 C> @param JCPU NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
-
75 C> @param[out] WAVED (*) WAVE DIVERGENCE FIELDS IF IDIR>0
-
76 C> [WAVED=(D(GRIDU)/DLAM+D(CLAT*GRIDV)/DPHI)/(CLAT*RERTH)]
-
77 C> @param[out] WAVEZ (*) WAVE VORTICITY FIELDS IF IDIR>0
-
78 C> [WAVEZ=(D(GRIDV)/DLAM-D(CLAT*GRIDU)/DPHI)/(CLAT*RERTH)]
-
79 C> @param[out] GRIDUN N.H. GRID U-WINDS (STARTING AT JBEG) IF IDIR<0
-
80 C> @param[out] GRIDUS S.H. GRID U-WINDS (STARTING AT JBEG) IF IDIR<0
-
81 C> @param[out] GRIDVN N.H. GRID V-WINDS (STARTING AT JBEG) IF IDIR<0
-
82 C> @param[out] GRIDVS S.H. GRID V-WINDS (STARTING AT JBEG) IF IDIR<0
-
83 C> @param IDIR TRANSFORM FLAG
-
84 C> - IDIR>0 FOR WAVE TO GRID,
-
85 C> - IDIR<0 FOR GRID TO WAVE
-
86 C>
-
87  SUBROUTINE sptranv(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
-
88  & IPRIME,ISKIP,JNSKIP,JSSKIP,KWSKIP,KGSKIP,
-
89  & JBEG,JEND,JCPU,
-
90  & WAVED,WAVEZ,GRIDUN,GRIDUS,GRIDVN,GRIDVS,IDIR)
-
91 
-
92  REAL WAVED(*),WAVEZ(*),GRIDUN(*),GRIDUS(*),GRIDVN(*),GRIDVS(*)
-
93 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
94  MX=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
95  ip=iprime
-
96  is=iskip
-
97  jn=jnskip
-
98  js=jsskip
-
99  kw=kwskip
-
100  kg=kgskip
-
101  jb=jbeg
-
102  je=jend
-
103  jc=jcpu
-
104  IF(ip.EQ.0) ip=1
-
105  IF(is.EQ.0) is=1
-
106  IF(jn.EQ.0) jn=imax
-
107  IF(js.EQ.0) js=-jn
-
108  IF(kw.EQ.0) kw=2*mx
-
109  IF(kg.EQ.0) kg=imax*jmax
-
110  IF(jb.EQ.0) jb=1
-
111  IF(je.EQ.0) je=(jmax+1)/2
-
112  IF(jc.EQ.0) jc=ncpus()
-
113 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
114  IF(idir.LT.0.AND.jbeg.EQ.0) THEN
-
115  DO k=1,kmax
-
116  kws=(k-1)*kw
-
117  waved(kws+1:kws+2*mx)=0
-
118  wavez(kws+1:kws+2*mx)=0
-
119  ENDDO
-
120  ENDIF
-
121 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
122  CALL sptranfv(iromb,maxwv,idrt,imax,jmax,kmax,
-
123  & ip,is,jn,js,kw,kg,jb,je,jc,
-
124  & waved,wavez,gridun,gridus,gridvn,gridvs,idir)
-
125 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
126  END
-
function ncpus()
Set number of CPUs - the number of processors over which to parallelize.
Definition: ncpus.F:24
-
subroutine sptranfv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IP, IS, JN, JS, KW, KG, JB, JE, JC, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
Definition: sptranfv.f:83
-
subroutine sptranv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
Definition: sptranv.f:91
+Go to the documentation of this file.
1C> @file
+
2C> @brief Perform a vector spherical transform.
+
3C>
+
4C> ### Program History Log
+
5C> Date | Programmer | Comments
+
6C> -----|------------|---------
+
7C> 96-02-29 | IREDELL | Initial.
+
8C> 1998-12-15 | IREDELL | Generic fft used, openmp directives inserted
+
9C>
+
10C> @author IREDELL @date 96-02-29
+
11
+
12C> This subprogram performs a spherical transform
+
13C> between spectral coefficients of divergences and curls
+
14C> and vector fields on a global cylindrical grid.
+
15C>
+
16C> The wave-space can be either triangular or rhomboidal.
+
17C>
+
18C> The grid-space can be either an equally-spaced grid
+
19C> (with or without pole points) or a Gaussian grid.
+
20C> the wave and grid fields may have general indexing,
+
21C> but each wave field is in sequential 'ibm order',
+
22C> i.e. with zonal wavenumber as the slower index.
+
23C>
+
24C> Transforms are done in latitude pairs for efficiency;
+
25C> thus grid arrays for each hemisphere must be passed.
+
26C> If so requested, just a subset of the latitude pairs
+
27C> may be transformed in each invocation of the subprogram.
+
28C>
+
29C> The transforms are all multiprocessed over latitude except
+
30C> the transform from fourier to spectral is multiprocessed
+
31C> over zonal wavenumber to ensure reproducibility.
+
32C>
+
33C> Transform several fields at a time to improve vectorization.
+
34C> Subprogram can be called from a multiprocessing environment.
+
35C>
+
36C> Minimum grid dimensions for unaliased transforms to spectral:
+
37C> DIMENSION |LINEAR |QUADRATIC
+
38C> ----------------------- |--------- |-------------
+
39C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
+
40C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
+
41C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
+
42C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
+
43C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
+
44C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
+
45C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
+
46C>
+
47C> @param IROMB SPECTRAL DOMAIN SHAPE
+
48C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
+
49C> @param MAXWV SPECTRAL TRUNCATION
+
50C> @param IDRT GRID IDENTIFIER
+
51C> - IDRT=4 FOR GAUSSIAN GRID,
+
52C> - IDRT=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
+
53C> - IDRT=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES
+
54C> @param IMAX EVEN NUMBER OF LONGITUDES.
+
55C> @param JMAX NUMBER OF LATITUDES.
+
56C> @param KMAX NUMBER OF FIELDS TO TRANSFORM.
+
57C> @param IPRIME LONGITUDE INDEX FOR THE PRIME MERIDIAN.
+
58C> (DEFAULTS TO 1 IF IPRIME=0)
+
59C> @param ISKIP SKIP NUMBER BETWEEN LONGITUDES
+
60C> (DEFAULTS TO 1 IF ISKIP=0)
+
61C> @param JNSKIP SKIP NUMBER BETWEEN N.H. LATITUDES FROM NORTH
+
62C> (DEFAULTS TO IMAX IF JNSKIP=0)
+
63C> @param JSSKIP SKIP NUMBER BETWEEN S.H. LATITUDES FROM SOUTH
+
64C> (DEFAULTS TO -IMAX IF JSSKIP=0)
+
65C> @param KWSKIP SKIP NUMBER BETWEEN WAVE FIELDS
+
66C> (DEFAULTS TO (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0)
+
67C> @param KGSKIP SKIP NUMBER BETWEEN GRID FIELDS
+
68C> (DEFAULTS TO IMAX*JMAX IF KGSKIP=0)
+
69C> @param JBEG LATITUDE INDEX (FROM POLE) TO BEGIN TRANSFORM
+
70C> - DEFAULTS TO 1 IF JBEG=0
+
71C> - IF JBEG=0 AND IDIR<0, WAVE IS ZEROED BEFORE TRANSFORM
+
72C> @param JEND LATITUDE INDEX (FROM POLE) TO END TRANSFORM
+
73C> (DEFAULTS TO (JMAX+1)/2 IF JEND=0)
+
74C> @param JCPU NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
+
75C> @param[out] WAVED (*) WAVE DIVERGENCE FIELDS IF IDIR>0
+
76C> [WAVED=(D(GRIDU)/DLAM+D(CLAT*GRIDV)/DPHI)/(CLAT*RERTH)]
+
77C> @param[out] WAVEZ (*) WAVE VORTICITY FIELDS IF IDIR>0
+
78C> [WAVEZ=(D(GRIDV)/DLAM-D(CLAT*GRIDU)/DPHI)/(CLAT*RERTH)]
+
79C> @param[out] GRIDUN N.H. GRID U-WINDS (STARTING AT JBEG) IF IDIR<0
+
80C> @param[out] GRIDUS S.H. GRID U-WINDS (STARTING AT JBEG) IF IDIR<0
+
81C> @param[out] GRIDVN N.H. GRID V-WINDS (STARTING AT JBEG) IF IDIR<0
+
82C> @param[out] GRIDVS S.H. GRID V-WINDS (STARTING AT JBEG) IF IDIR<0
+
83C> @param IDIR TRANSFORM FLAG
+
84C> - IDIR>0 FOR WAVE TO GRID,
+
85C> - IDIR<0 FOR GRID TO WAVE
+
86C>
+
+
87 SUBROUTINE sptranv(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
+
88 & IPRIME,ISKIP,JNSKIP,JSSKIP,KWSKIP,KGSKIP,
+
89 & JBEG,JEND,JCPU,
+
90 & WAVED,WAVEZ,GRIDUN,GRIDUS,GRIDVN,GRIDVS,IDIR)
+
91
+
92 REAL WAVED(*),WAVEZ(*),GRIDUN(*),GRIDUS(*),GRIDVN(*),GRIDVS(*)
+
93C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
94 MX=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
95 ip=iprime
+
96 is=iskip
+
97 jn=jnskip
+
98 js=jsskip
+
99 kw=kwskip
+
100 kg=kgskip
+
101 jb=jbeg
+
102 je=jend
+
103 jc=jcpu
+
104 IF(ip.EQ.0) ip=1
+
105 IF(is.EQ.0) is=1
+
106 IF(jn.EQ.0) jn=imax
+
107 IF(js.EQ.0) js=-jn
+
108 IF(kw.EQ.0) kw=2*mx
+
109 IF(kg.EQ.0) kg=imax*jmax
+
110 IF(jb.EQ.0) jb=1
+
111 IF(je.EQ.0) je=(jmax+1)/2
+
112 IF(jc.EQ.0) jc=ncpus()
+
113C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
114 IF(idir.LT.0.AND.jbeg.EQ.0) THEN
+
115 DO k=1,kmax
+
116 kws=(k-1)*kw
+
117 waved(kws+1:kws+2*mx)=0
+
118 wavez(kws+1:kws+2*mx)=0
+
119 ENDDO
+
120 ENDIF
+
121C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
122 CALL sptranfv(iromb,maxwv,idrt,imax,jmax,kmax,
+
123 & ip,is,jn,js,kw,kg,jb,je,jc,
+
124 & waved,wavez,gridun,gridus,gridvn,gridvs,idir)
+
125C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+
126 END
+
function ncpus()
Set number of CPUs - the number of processors over which to parallelize.
Definition ncpus.F:22
+
subroutine sptranfv(iromb, maxwv, idrt, imax, jmax, kmax, ip, is, jn, js, kw, kg, jb, je, jc, waved, wavez, gridun, gridus, gridvn, gridvs, idir)
This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
Definition sptranfv.f:83
+
subroutine sptranv(iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, waved, wavez, gridun, gridus, gridvn, gridvs, idir)
This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
Definition sptranv.f:91
diff --git a/sptrun_8f.html b/sptrun_8f.html index fcaf1b2b..ec3ee498 100644 --- a/sptrun_8f.html +++ b/sptrun_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptrun.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptrun.f File Reference
+
sptrun.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptrun (IROMB, MAXWV, IDRTI, IMAXI, JMAXI, IDRTO, IMAXO, JMAXO, KMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, ISKIPO, JSKIPO, KSKIPO, JCPU, GRIDI, GRIDO)
 This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields to a possibly different global cylindrical grid. More...
 
subroutine sptrun (iromb, maxwv, idrti, imaxi, jmaxi, idrto, imaxo, jmaxo, kmax, iprime, iskipi, jskipi, kskipi, iskipo, jskipo, kskipo, jcpu, gridi, grido)
 This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields to a possibly different global cylindrical grid.
 

Detailed Description

Truncate gridded scalar fields.

@@ -107,8 +113,8 @@

Definition in file sptrun.f.

Function/Subroutine Documentation

- -

◆ sptrun()

+ +

◆ sptrun()

diff --git a/sptrun_8f.js b/sptrun_8f.js index 0409c09b..4996c260 100644 --- a/sptrun_8f.js +++ b/sptrun_8f.js @@ -1,4 +1,4 @@ var sptrun_8f = [ - [ "sptrun", "sptrun_8f.html#a1f04574fbd5018f73b68bd2cd0ffc473", null ] + [ "sptrun", "sptrun_8f.html#a043d74dc559aafb2b1f5cc52fe81b924", null ] ]; \ No newline at end of file diff --git a/sptrun_8f_source.html b/sptrun_8f_source.html index 3d77bdac..a79cd0a9 100644 --- a/sptrun_8f_source.html +++ b/sptrun_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptrun.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,111 +81,119 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptrun.f
+
sptrun.f
-Go to the documentation of this file.
1 C> @file
-
2 C> @brief Truncate gridded scalar fields
-
3 C> @author IREDELL @date 96-02-29
-
4 
-
5 C> This subprogram spectrally truncates scalar fields on a global
-
6 C> cylindrical grid, returning the fields to a possibly different
-
7 C> global cylindrical grid. The wave-space can be either triangular
-
8 C> or rhomboidal. either grid-space can be either an equally-spaced
-
9 C> grid (with or without pole points) or a Gaussian grid. the grid
-
10 C> fields may have general indexing. the transforms are all
-
11 C> multiprocessed. Transform several fields at a time to improve
-
12 C> vectorization. Subprogram can be called from a multiprocessing
-
13 C> environment.
-
14 C>
-
15 C> Remarks: Minimum grid dimensions for unaliased transforms to spectral:
-
16 C> Dimension | Linear | Quadratic
-
17 C> ----------------------- | --------- | -------------
-
18 C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2
-
19 C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1
-
20 C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1
-
21 C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3
-
22 C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3
-
23 C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1
-
24 C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1
-
25 C>
-
26 C> @param IROMB Spectral domain shape (0 for triangular, 1 for rhomboidal)
-
27 C> @param MAXWV Spectral truncation
-
28 C> @param IDRTI Input grid identifier
-
29 C> - IDRTI=4 for Gaussian grid
-
30 C> - IDRTI=0 for equally-spaced grid including poles
-
31 C> - IDRTI=256 for equally-spaced grid excluding poles
-
32 C> @param IMAXI Even number of input longitudes
-
33 C> @param JMAXI Number of input latitudes
-
34 C> @param IDRTO Output grid identifier
-
35 C> - IDRTO=4 for Gaussian grid
-
36 C> - IDRTO=0 for equally-spaced grid including poles
-
37 C> - IDRTO=256 for equally-spaced grid excluding poles
-
38 C> @param IMAXO Even number of output longitudes
-
39 C> @param JMAXO Number of output latitudes
-
40 C> @param KMAX Number of fields to transform
-
41 C> @param IPRIME Input longitude index for the prime meridian.
-
42 C> - Defaults to 1 if IPRIME=0
-
43 C> - Output longitude index for prime meridian assumed 1
-
44 C> @param ISKIPI Skip number between input longitudes (defaults to 1 if ISKIPI=0)
-
45 C> @param JSKIPI Skip number between input latitudes from south (defaults to -IMAXI if JSKIPI=0)
-
46 C> @param KSKIPI Skip number between input grid fields (defaults to IMAXI*JMAXI if KSKIPI=0)
-
47 C> @param ISKIPO Skip number between output longitudes (defaults to 1 if ISKIPO=0)
-
48 C> @param JSKIPO Skip number between output latitudes from south (defaults to -IMAXO if JSKIPO=0)
-
49 C> @param KSKIPO Skip number between output grid fields (defaults to IMAXO*JMAXO if KSKIPO=0)
-
50 C> @param JCPU Number of CPUs over which to multiprocess (defaults to environment NCPUS if JCPU=0)
-
51 C> @param GRIDI Input grid fields
-
52 C> @param GRIDO Output grid fields (may overlay input fields if grid shape is appropriate)
-
53 C>
-
54 C> @author IREDELL @date 96-02-29
-
55  SUBROUTINE sptrun(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,IDRTO,IMAXO,JMAXO,
-
56  & KMAX,IPRIME,ISKIPI,JSKIPI,KSKIPI,
-
57  & ISKIPO,JSKIPO,KSKIPO,JCPU,GRIDI,GRIDO)
-
58  REAL GRIDI(*),GRIDO(*)
-
59  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
-
60 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
61 C TRANSFORM INPUT GRID TO WAVE
-
62  jc=jcpu
-
63  IF(jc.EQ.0) jc=ncpus()
-
64  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
65  mdim=2*mx+1
-
66  jn=-jskipi
-
67  IF(jn.EQ.0) jn=imaxi
-
68  js=-jn
-
69  inp=(jmaxi-1)*max(0,-jn)+1
-
70  isp=(jmaxi-1)*max(0,-js)+1
-
71  CALL sptran(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
-
72  & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
-
73  & w,gridi(inp),gridi(isp),-1)
-
74 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
75 C TRANSFORM WAVE TO OUTPUT
-
76  jn=-jskipo
-
77  IF(jn.EQ.0) jn=imaxo
-
78  js=-jn
-
79  inp=(jmaxo-1)*max(0,-jn)+1
-
80  isp=(jmaxo-1)*max(0,-js)+1
-
81  CALL sptran(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
-
82  & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
-
83  & w,grido(inp),grido(isp),1)
-
84 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
85  END
-
function ncpus()
Set number of CPUs - the number of processors over which to parallelize.
Definition: ncpus.F:24
-
subroutine sptran(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDN, GRIDS, IDIR)
This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
Definition: sptran.f:88
-
subroutine sptrun(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, IDRTO, IMAXO, JMAXO, KMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, ISKIPO, JSKIPO, KSKIPO, JCPU, GRIDI, GRIDO)
This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields...
Definition: sptrun.f:58
+Go to the documentation of this file.
1C> @file
+
2C> @brief Truncate gridded scalar fields
+
3C> @author IREDELL @date 96-02-29
+
4
+
5C> This subprogram spectrally truncates scalar fields on a global
+
6C> cylindrical grid, returning the fields to a possibly different
+
7C> global cylindrical grid. The wave-space can be either triangular
+
8C> or rhomboidal. either grid-space can be either an equally-spaced
+
9C> grid (with or without pole points) or a Gaussian grid. the grid
+
10C> fields may have general indexing. the transforms are all
+
11C> multiprocessed. Transform several fields at a time to improve
+
12C> vectorization. Subprogram can be called from a multiprocessing
+
13C> environment.
+
14C>
+
15C> Remarks: Minimum grid dimensions for unaliased transforms to spectral:
+
16C> Dimension | Linear | Quadratic
+
17C> ----------------------- | --------- | -------------
+
18C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2
+
19C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1
+
20C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1
+
21C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3
+
22C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3
+
23C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1
+
24C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1
+
25C>
+
26C> @param IROMB Spectral domain shape (0 for triangular, 1 for rhomboidal)
+
27C> @param MAXWV Spectral truncation
+
28C> @param IDRTI Input grid identifier
+
29C> - IDRTI=4 for Gaussian grid
+
30C> - IDRTI=0 for equally-spaced grid including poles
+
31C> - IDRTI=256 for equally-spaced grid excluding poles
+
32C> @param IMAXI Even number of input longitudes
+
33C> @param JMAXI Number of input latitudes
+
34C> @param IDRTO Output grid identifier
+
35C> - IDRTO=4 for Gaussian grid
+
36C> - IDRTO=0 for equally-spaced grid including poles
+
37C> - IDRTO=256 for equally-spaced grid excluding poles
+
38C> @param IMAXO Even number of output longitudes
+
39C> @param JMAXO Number of output latitudes
+
40C> @param KMAX Number of fields to transform
+
41C> @param IPRIME Input longitude index for the prime meridian.
+
42C> - Defaults to 1 if IPRIME=0
+
43C> - Output longitude index for prime meridian assumed 1
+
44C> @param ISKIPI Skip number between input longitudes (defaults to 1 if ISKIPI=0)
+
45C> @param JSKIPI Skip number between input latitudes from south (defaults to -IMAXI if JSKIPI=0)
+
46C> @param KSKIPI Skip number between input grid fields (defaults to IMAXI*JMAXI if KSKIPI=0)
+
47C> @param ISKIPO Skip number between output longitudes (defaults to 1 if ISKIPO=0)
+
48C> @param JSKIPO Skip number between output latitudes from south (defaults to -IMAXO if JSKIPO=0)
+
49C> @param KSKIPO Skip number between output grid fields (defaults to IMAXO*JMAXO if KSKIPO=0)
+
50C> @param JCPU Number of CPUs over which to multiprocess (defaults to environment NCPUS if JCPU=0)
+
51C> @param GRIDI Input grid fields
+
52C> @param GRIDO Output grid fields (may overlay input fields if grid shape is appropriate)
+
53C>
+
54C> @author IREDELL @date 96-02-29
+
+
55 SUBROUTINE sptrun(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,IDRTO,IMAXO,JMAXO,
+
56 & KMAX,IPRIME,ISKIPI,JSKIPI,KSKIPI,
+
57 & ISKIPO,JSKIPO,KSKIPO,JCPU,GRIDI,GRIDO)
+
58 REAL GRIDI(*),GRIDO(*)
+
59 REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
+
60C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
61C TRANSFORM INPUT GRID TO WAVE
+
62 jc=jcpu
+
63 IF(jc.EQ.0) jc=ncpus()
+
64 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
65 mdim=2*mx+1
+
66 jn=-jskipi
+
67 IF(jn.EQ.0) jn=imaxi
+
68 js=-jn
+
69 inp=(jmaxi-1)*max(0,-jn)+1
+
70 isp=(jmaxi-1)*max(0,-js)+1
+
71 CALL sptran(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
+
72 & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
+
73 & w,gridi(inp),gridi(isp),-1)
+
74C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
75C TRANSFORM WAVE TO OUTPUT
+
76 jn=-jskipo
+
77 IF(jn.EQ.0) jn=imaxo
+
78 js=-jn
+
79 inp=(jmaxo-1)*max(0,-jn)+1
+
80 isp=(jmaxo-1)*max(0,-js)+1
+
81 CALL sptran(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
+
82 & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
+
83 & w,grido(inp),grido(isp),1)
+
84C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+
85 END
+
function ncpus()
Set number of CPUs - the number of processors over which to parallelize.
Definition ncpus.F:22
+
subroutine sptran(iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, wave, gridn, grids, idir)
This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
Definition sptran.f:88
+
subroutine sptrun(iromb, maxwv, idrti, imaxi, jmaxi, idrto, imaxo, jmaxo, kmax, iprime, iskipi, jskipi, kskipi, iskipo, jskipo, kskipo, jcpu, gridi, grido)
This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields...
Definition sptrun.f:58
diff --git a/sptrund_8f.html b/sptrund_8f.html index 6fe8896c..0723097a 100644 --- a/sptrund_8f.html +++ b/sptrund_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptrund.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptrund.f File Reference
+
sptrund.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptrund (IROMB, MAXWV, IDRTI, IMAXI, JMAXI, IDRTO, IMAXO, JMAXO, KMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, ISKIPO, JSKIPO, KSKIPO, JCPU, GRID, GRIDMN, GRIDX, GRIDY)
 THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR MEANS AND GRADIENTS TO A POSSIBLY DIFFERENT GLOBAL CYLINDRICAL GRID. More...
 
subroutine sptrund (iromb, maxwv, idrti, imaxi, jmaxi, idrto, imaxo, jmaxo, kmax, iprime, iskipi, jskipi, kskipi, iskipo, jskipo, kskipo, jcpu, grid, gridmn, gridx, gridy)
 THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR MEANS AND GRADIENTS TO A POSSIBLY DIFFERENT GLOBAL CYLINDRICAL GRID.
 

Detailed Description

Spectrally truncate to gradients.

@@ -107,8 +113,8 @@

Definition in file sptrund.f.

Function/Subroutine Documentation

- -

◆ sptrund()

+ +

◆ sptrund()

@@ -311,7 +317,7 @@

diff --git a/sptrund_8f.js b/sptrund_8f.js index 20c45793..4460540f 100644 --- a/sptrund_8f.js +++ b/sptrund_8f.js @@ -1,4 +1,4 @@ var sptrund_8f = [ - [ "sptrund", "sptrund_8f.html#a2636d99e658dfabd4b85f15a76fca480", null ] + [ "sptrund", "sptrund_8f.html#ab4df2316de48a5a199c5be026ab9fab0", null ] ]; \ No newline at end of file diff --git a/sptrund_8f_source.html b/sptrund_8f_source.html index a6b7d3d2..0c68a9da 100644 --- a/sptrund_8f_source.html +++ b/sptrund_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptrund.f Source File @@ -23,10 +23,9 @@
- - + @@ -34,22 +33,28 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ + +
@@ -76,132 +81,140 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptrund.f
+
sptrund.f
-Go to the documentation of this file.
1 C> @file
-
2 C>
-
3 C> Spectrally truncate to gradients
-
4 C> @author IREDELL @date 96-02-29
-
5 
-
6 C> THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS
-
7 C> ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR MEANS AND
-
8 C> GRADIENTS TO A POSSIBLY DIFFERENT GLOBAL CYLINDRICAL GRID.
-
9 C> THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL.
-
10 C> EITHER GRID-SPACE CAN BE EITHER AN EQUALLY-SPACED GRID
-
11 C> (WITH OR WITHOUT POLE POINTS) OR A GAUSSIAN GRID.
-
12 C> THE GRID FIELDS MAY HAVE GENERAL INDEXING.
-
13 C> THE TRANSFORMS ARE ALL MULTIPROCESSED.
-
14 C> OVER ZONAL WAVENUMBER TO ENSURE REPRODUCIBILITY.
-
15 C> TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION.
-
16 C> SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
-
17 C>
-
18 C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
-
19 C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
-
20 C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
-
21 C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
-
22 C> (IDRTI=4 FOR GAUSSIAN GRID,
-
23 C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
-
24 C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
-
25 C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
-
26 C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
-
27 C> @param IDRTO - INTEGER OUTPUT GRID IDENTIFIER
-
28 C> (IDRTO=4 FOR GAUSSIAN GRID,
-
29 C> IDRTO=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
-
30 C> IDRTO=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
-
31 C> @param IMAXO - INTEGER EVEN NUMBER OF OUTPUT LONGITUDES.
-
32 C> @param JMAXO - INTEGER NUMBER OF OUTPUT LATITUDES.
-
33 C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
-
34 C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
-
35 C> (DEFAULTS TO 1 IF IPRIME=0)
-
36 C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
-
37 C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
-
38 C> (DEFAULTS TO 1 IF ISKIPI=0)
-
39 C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
-
40 C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
-
41 C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
-
42 C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
-
43 C> @param ISKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LONGITUDES
-
44 C> (DEFAULTS TO 1 IF ISKIPO=0)
-
45 C> @param JSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LATITUDES FROM SOUTH
-
46 C> (DEFAULTS TO -IMAXO IF JSKIPO=0)
-
47 C> @param KSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT GRID FIELDS
-
48 C> (DEFAULTS TO IMAXO*JMAXO IF KSKIPO=0)
-
49 C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
-
50 C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
-
51 C> @param GRID - REAL (*) INPUT GRID FIELDS
-
52 C> @param GRIDMN - REAL (KMAX) OUTPUT GLOBAL MEANS
-
53 C> @param GRIDX - REAL (*) OUTPUT X-GRADIENTS
-
54 C> @param GRIDY - REAL (*) OUTPUT Y-GRADIENTS
-
55 C>
-
56 C> SUBPROGRAMS CALLED:
-
57 C> - SPTRAN PERFORM A SCALAR SPHERICAL TRANSFORM
-
58 C> - SPTRAND PERFORM A GRADIENT SPHERICAL TRANSFORM
-
59 C> - NCPUS GETS ENVIRONMENT NUMBER OF CPUS
-
60 C>
-
61 C> REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:
-
62 C> DIMENSION |LINEAR |QUADRATIC
-
63 C> ----------------------- |--------- |-------------
-
64 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
-
65 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
-
66 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
-
67 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
-
68 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
-
69 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
-
70 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
-
71  SUBROUTINE sptrund(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,
-
72  & IDRTO,IMAXO,JMAXO,KMAX,
-
73  & IPRIME,ISKIPI,JSKIPI,KSKIPI,
-
74  & ISKIPO,JSKIPO,KSKIPO,JCPU,GRID,
-
75  & GRIDMN,GRIDX,GRIDY)
-
76 
-
77  REAL GRID(*),GRIDX(*),GRIDY(*),GRIDMN(*)
-
78  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
-
79 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
80 C TRANSFORM INPUT GRID TO WAVE
-
81  jc=jcpu
-
82  IF(jc.EQ.0) jc=ncpus()
-
83  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
-
84  mdim=2*mx+1
-
85  jn=-jskipi
-
86  IF(jn.EQ.0) jn=imaxi
-
87  js=-jn
-
88  inp=(jmaxi-1)*max(0,-jn)+1
-
89  isp=(jmaxi-1)*max(0,-js)+1
-
90  CALL sptran(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
-
91  & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
-
92  & w,grid(inp),grid(isp),-1)
-
93 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
94 C TRANSFORM WAVE TO OUTPUT GRADIENTS
-
95  jn=-jskipo
-
96  IF(jn.EQ.0) jn=imaxo
-
97  js=-jn
-
98  inp=(jmaxo-1)*max(0,-jn)+1
-
99  isp=(jmaxo-1)*max(0,-js)+1
-
100  CALL sptrand(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
-
101  & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
-
102  & w,gridmn,
-
103  & gridx(inp),gridx(isp),gridy(inp),gridy(isp),1)
-
104 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
105  END
-
function ncpus()
Set number of CPUs - the number of processors over which to parallelize.
Definition: ncpus.F:24
-
subroutine sptran(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDN, GRIDS, IDIR)
This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
Definition: sptran.f:88
-
subroutine sptrand(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDMN, GRIDXN, GRIDXS, GRIDYN, GRIDYS, IDIR)
This subprogram performs a spherical transform between spectral coefficients of scalar fields and the...
Definition: sptrand.f:92
-
subroutine sptrund(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, IDRTO, IMAXO, JMAXO, KMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, ISKIPO, JSKIPO, KSKIPO, JCPU, GRID, GRIDMN, GRIDX, GRIDY)
THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR MEAN...
Definition: sptrund.f:76
+Go to the documentation of this file.
1C> @file
+
2C>
+
3C> Spectrally truncate to gradients
+
4C> @author IREDELL @date 96-02-29
+
5
+
6C> THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS
+
7C> ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR MEANS AND
+
8C> GRADIENTS TO A POSSIBLY DIFFERENT GLOBAL CYLINDRICAL GRID.
+
9C> THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL.
+
10C> EITHER GRID-SPACE CAN BE EITHER AN EQUALLY-SPACED GRID
+
11C> (WITH OR WITHOUT POLE POINTS) OR A GAUSSIAN GRID.
+
12C> THE GRID FIELDS MAY HAVE GENERAL INDEXING.
+
13C> THE TRANSFORMS ARE ALL MULTIPROCESSED.
+
14C> OVER ZONAL WAVENUMBER TO ENSURE REPRODUCIBILITY.
+
15C> TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION.
+
16C> SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
+
17C>
+
18C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
+
19C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
+
20C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
+
21C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
+
22C> (IDRTI=4 FOR GAUSSIAN GRID,
+
23C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
+
24C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
+
25C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
+
26C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
+
27C> @param IDRTO - INTEGER OUTPUT GRID IDENTIFIER
+
28C> (IDRTO=4 FOR GAUSSIAN GRID,
+
29C> IDRTO=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
+
30C> IDRTO=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
+
31C> @param IMAXO - INTEGER EVEN NUMBER OF OUTPUT LONGITUDES.
+
32C> @param JMAXO - INTEGER NUMBER OF OUTPUT LATITUDES.
+
33C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
+
34C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
+
35C> (DEFAULTS TO 1 IF IPRIME=0)
+
36C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
+
37C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
+
38C> (DEFAULTS TO 1 IF ISKIPI=0)
+
39C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
+
40C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
+
41C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
+
42C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
+
43C> @param ISKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LONGITUDES
+
44C> (DEFAULTS TO 1 IF ISKIPO=0)
+
45C> @param JSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LATITUDES FROM SOUTH
+
46C> (DEFAULTS TO -IMAXO IF JSKIPO=0)
+
47C> @param KSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT GRID FIELDS
+
48C> (DEFAULTS TO IMAXO*JMAXO IF KSKIPO=0)
+
49C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
+
50C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
+
51C> @param GRID - REAL (*) INPUT GRID FIELDS
+
52C> @param GRIDMN - REAL (KMAX) OUTPUT GLOBAL MEANS
+
53C> @param GRIDX - REAL (*) OUTPUT X-GRADIENTS
+
54C> @param GRIDY - REAL (*) OUTPUT Y-GRADIENTS
+
55C>
+
56C> SUBPROGRAMS CALLED:
+
57C> - SPTRAN PERFORM A SCALAR SPHERICAL TRANSFORM
+
58C> - SPTRAND PERFORM A GRADIENT SPHERICAL TRANSFORM
+
59C> - NCPUS GETS ENVIRONMENT NUMBER OF CPUS
+
60C>
+
61C> REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:
+
62C> DIMENSION |LINEAR |QUADRATIC
+
63C> ----------------------- |--------- |-------------
+
64C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
+
65C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
+
66C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
+
67C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
+
68C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
+
69C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
+
70C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
+
+
71 SUBROUTINE sptrund(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,
+
72 & IDRTO,IMAXO,JMAXO,KMAX,
+
73 & IPRIME,ISKIPI,JSKIPI,KSKIPI,
+
74 & ISKIPO,JSKIPO,KSKIPO,JCPU,GRID,
+
75 & GRIDMN,GRIDX,GRIDY)
+
76
+
77 REAL GRID(*),GRIDX(*),GRIDY(*),GRIDMN(*)
+
78 REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
+
79C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
80C TRANSFORM INPUT GRID TO WAVE
+
81 jc=jcpu
+
82 IF(jc.EQ.0) jc=ncpus()
+
83 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
+
84 mdim=2*mx+1
+
85 jn=-jskipi
+
86 IF(jn.EQ.0) jn=imaxi
+
87 js=-jn
+
88 inp=(jmaxi-1)*max(0,-jn)+1
+
89 isp=(jmaxi-1)*max(0,-js)+1
+
90 CALL sptran(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
+
91 & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
+
92 & w,grid(inp),grid(isp),-1)
+
93C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
94C TRANSFORM WAVE TO OUTPUT GRADIENTS
+
95 jn=-jskipo
+
96 IF(jn.EQ.0) jn=imaxo
+
97 js=-jn
+
98 inp=(jmaxo-1)*max(0,-jn)+1
+
99 isp=(jmaxo-1)*max(0,-js)+1
+
100 CALL sptrand(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
+
101 & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
+
102 & w,gridmn,
+
103 & gridx(inp),gridx(isp),gridy(inp),gridy(isp),1)
+
104C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+
105 END
+
function ncpus()
Set number of CPUs - the number of processors over which to parallelize.
Definition ncpus.F:22
+
subroutine sptran(iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, wave, gridn, grids, idir)
This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
Definition sptran.f:88
+
subroutine sptrand(iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, wave, gridmn, gridxn, gridxs, gridyn, gridys, idir)
This subprogram performs a spherical transform between spectral coefficients of scalar fields and the...
Definition sptrand.f:92
+
subroutine sptrund(iromb, maxwv, idrti, imaxi, jmaxi, idrto, imaxo, jmaxo, kmax, iprime, iskipi, jskipi, kskipi, iskipo, jskipo, kskipo, jcpu, grid, gridmn, gridx, gridy)
THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR MEAN...
Definition sptrund.f:76
diff --git a/sptrung_8f.html b/sptrung_8f.html index 2332b302..fe9f7741 100644 --- a/sptrung_8f.html +++ b/sptrung_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptrung.f File Reference @@ -23,10 +23,9 @@
- - + @@ -34,21 +33,22 @@
-
NCEPLIBS-ip -  5.1.0 +
+
NCEPLIBS-ip 5.2.0
- + +/* @license-end */ +
@@ -62,7 +62,7 @@
@@ -76,16 +76,22 @@
- +
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
-
-
sptrung.f File Reference
+
sptrung.f File Reference
@@ -94,11 +100,11 @@

Go to the source code of this file.

- - - - + + +

+

Functions/Subroutines

subroutine sptrung (IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NRSKIP, NGSKIP, JCPU, RLAT, RLON, GRIDI, GP)
 This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields to specified sets of station points on the globe. More...
 
subroutine sptrung (iromb, maxwv, idrti, imaxi, jmaxi, kmax, nmax, iprime, iskipi, jskipi, kskipi, kgskip, nrskip, ngskip, jcpu, rlat, rlon, gridi, gp)
 This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields to specified sets of station points on the globe.
 

Detailed Description

Spectrally interpolate scalars to stations.

@@ -107,8 +113,8 @@

Definition in file sptrung.f.

Function/Subroutine Documentation

- -

◆ sptrung()

+ +

◆ sptrung()

@@ -117,115 +123,115 @@

subroutine sptrung (   - IROMB, + iromb,   - MAXWV, + maxwv,   - IDRTI, + idrti,   - IMAXI, + imaxi,   - JMAXI, + jmaxi,   - KMAX, + kmax,   - NMAX, + nmax,   - IPRIME, + iprime,   - ISKIPI, + iskipi,   - JSKIPI, + jskipi,   - KSKIPI, + kskipi,   - KGSKIP, + kgskip,   - NRSKIP, + nrskip,   - NGSKIP, + ngskip,   - JCPU, + jcpu, real, dimension(*)  - RLAT, + rlat, real, dimension(*)  - RLON, + rlon, real, dimension(*)  - GRIDI, + gridi, real, dimension(*)  - GP  + gp  @@ -262,8 +268,8 @@

sptran() Perform a scalar spherical transform -
  • sptgpt() Transform spectral scalar to station points
  • +
  • sptran() Perform a scalar spherical transform
  • +
  • sptgpt() Transform spectral scalar to station points
  • ncpus() Gets environment number of cpus
  • Minimum grid dimensions for unaliased transforms to spectral:

    @@ -287,7 +293,7 @@

    Definition at line 65 of file sptrung.f.

    -

    References ncpus(), sptgpt(), and sptran().

    +

    References ncpus(), sptgpt(), and sptran().

    Referenced by spectral_interp_mod::polates4::polates4_grib1(), and spectral_interp_mod::polates4::polates4_grib2().

    @@ -299,7 +305,7 @@

    diff --git a/sptrung_8f.js b/sptrung_8f.js index 2105f854..c85c2570 100644 --- a/sptrung_8f.js +++ b/sptrung_8f.js @@ -1,4 +1,4 @@ var sptrung_8f = [ - [ "sptrung", "sptrung_8f.html#af41b64dad4789617a315515ef885912c", null ] + [ "sptrung", "sptrung_8f.html#a8715a29c9ad05ee81a35642f2ff60a0b", null ] ]; \ No newline at end of file diff --git a/sptrung_8f_source.html b/sptrung_8f_source.html index a23390f1..2c8b2cbf 100644 --- a/sptrung_8f_source.html +++ b/sptrung_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptrung.f Source File @@ -23,10 +23,9 @@

    - - + @@ -34,22 +33,28 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0

    - + +/* @license-end */ + +
    @@ -76,117 +81,125 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    sptrung.f
    +
    sptrung.f
    -Go to the documentation of this file.
    1 C> @file
    -
    2 C>
    -
    3 C> Spectrally interpolate scalars to stations
    -
    4 C> @author IREDELL @date 96-02-29
    -
    5 
    -
    6 C> This subprogram spectrally truncates scalar fields on a global
    -
    7 C> cylindrical grid, returning the fields to specified sets of
    -
    8 C> station points on the globe. The wave-space can be either
    -
    9 C> triangular or rhomboidal. The grid-space can be either an
    -
    10 C> equally-spaced grid (with or without pole points) or a Gaussian
    -
    11 C> grid. The grid and point fields may have general indexing. The
    -
    12 C> transforms are all multiprocessed. Transform several fields at a
    -
    13 C> time to improve vectorization. Subprogram can be called from a
    -
    14 C> multiprocessing environment.
    -
    15 C>
    -
    16 C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    -
    17 C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    -
    18 C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    -
    19 C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    -
    20 C> (IDRTI=4 FOR GAUSSIAN GRID,
    -
    21 C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    -
    22 C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    -
    23 C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    -
    24 C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    -
    25 C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    -
    26 C> @param NMAX - INTEGER NUMBER OF STATION POINTS TO RETURN
    -
    27 C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    -
    28 C> (DEFAULTS TO 1 IF IPRIME=0)
    -
    29 C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    -
    30 C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    -
    31 C> (DEFAULTS TO 1 IF ISKIPI=0)
    -
    32 C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    -
    33 C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    -
    34 C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    -
    35 C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    -
    36 C> @param KGSKIP - INTEGER SKIP NUMBER BETWEEN STATION POINT SETS
    -
    37 C> (DEFAULTS TO NMAX IF KGSKIP=0)
    -
    38 C> @param NRSKIP - INTEGER SKIP NUMBER BETWEEN STATION LATS AND LONS
    -
    39 C> (DEFAULTS TO 1 IF NRSKIP=0)
    -
    40 C> @param NGSKIP - INTEGER SKIP NUMBER BETWEEN STATION POINTS
    -
    41 C> (DEFAULTS TO 1 IF NGSKIP=0)
    -
    42 C> @param RLAT - REAL (*) STATION LATITUDES IN DEGREES
    -
    43 C> @param RLON - REAL (*) STATION LONGITUDES IN DEGREES
    -
    44 C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    -
    45 C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    -
    46 C> @param GRIDI - REAL (*) INPUT GRID FIELDS
    -
    47 C> @param[out] GP - REAL (*) STATION POINT SETS
    -
    48 C>
    -
    49 C> SUBPROGRAMS CALLED:
    -
    50 C> - sptran() Perform a scalar spherical transform
    -
    51 C> - sptgpt() Transform spectral scalar to station points
    -
    52 C> - ncpus() Gets environment number of cpus
    -
    53 C>
    -
    54 C> Minimum grid dimensions for unaliased transforms to spectral:
    -
    55 C> DIMENSION |LINEAR |QUADRATIC
    -
    56 C> ----------------------- |--------- |-------------
    -
    57 C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2
    -
    58 C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1
    -
    59 C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1
    -
    60 C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3
    -
    61 C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3
    -
    62 C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1
    -
    63 C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1
    -
    64 C>
    -
    65  SUBROUTINE sptrung(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,NMAX,
    -
    66  & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP,
    -
    67  & NRSKIP,NGSKIP,JCPU,RLAT,RLON,GRIDI,GP)
    -
    68 
    -
    69  REAL RLAT(*),RLON(*),GRIDI(*),GP(*)
    -
    70  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    -
    71 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    72 C TRANSFORM INPUT GRID TO WAVE
    -
    73  jc=jcpu
    -
    74  IF(jc.EQ.0) jc=ncpus()
    -
    75  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    -
    76  mdim=2*mx+1
    -
    77  jn=-jskipi
    -
    78  IF(jn.EQ.0) jn=imaxi
    -
    79  js=-jn
    -
    80  inp=(jmaxi-1)*max(0,-jn)+1
    -
    81  isp=(jmaxi-1)*max(0,-js)+1
    -
    82  CALL sptran(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    -
    83  & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    -
    84  & w,gridi(inp),gridi(isp),-1)
    -
    85 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    86 C TRANSFORM WAVE TO OUTPUT
    -
    87  CALL sptgpt(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
    -
    88  & rlat,rlon,w,gp)
    -
    89 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    90  END
    -
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    -
    subroutine sptgpt(IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVE, GP)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to spe...
    Definition: sptgpt.f:51
    -
    subroutine sptran(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDN, GRIDS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition: sptran.f:88
    -
    subroutine sptrung(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NRSKIP, NGSKIP, JCPU, RLAT, RLON, GRIDI, GP)
    This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields...
    Definition: sptrung.f:68
    +Go to the documentation of this file.
    1C> @file
    +
    2C>
    +
    3C> Spectrally interpolate scalars to stations
    +
    4C> @author IREDELL @date 96-02-29
    +
    5
    +
    6C> This subprogram spectrally truncates scalar fields on a global
    +
    7C> cylindrical grid, returning the fields to specified sets of
    +
    8C> station points on the globe. The wave-space can be either
    +
    9C> triangular or rhomboidal. The grid-space can be either an
    +
    10C> equally-spaced grid (with or without pole points) or a Gaussian
    +
    11C> grid. The grid and point fields may have general indexing. The
    +
    12C> transforms are all multiprocessed. Transform several fields at a
    +
    13C> time to improve vectorization. Subprogram can be called from a
    +
    14C> multiprocessing environment.
    +
    15C>
    +
    16C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    +
    17C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    +
    18C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    +
    19C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    +
    20C> (IDRTI=4 FOR GAUSSIAN GRID,
    +
    21C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    22C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    +
    23C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    +
    24C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    +
    25C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    +
    26C> @param NMAX - INTEGER NUMBER OF STATION POINTS TO RETURN
    +
    27C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    +
    28C> (DEFAULTS TO 1 IF IPRIME=0)
    +
    29C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    +
    30C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    +
    31C> (DEFAULTS TO 1 IF ISKIPI=0)
    +
    32C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    +
    33C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    +
    34C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    +
    35C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    +
    36C> @param KGSKIP - INTEGER SKIP NUMBER BETWEEN STATION POINT SETS
    +
    37C> (DEFAULTS TO NMAX IF KGSKIP=0)
    +
    38C> @param NRSKIP - INTEGER SKIP NUMBER BETWEEN STATION LATS AND LONS
    +
    39C> (DEFAULTS TO 1 IF NRSKIP=0)
    +
    40C> @param NGSKIP - INTEGER SKIP NUMBER BETWEEN STATION POINTS
    +
    41C> (DEFAULTS TO 1 IF NGSKIP=0)
    +
    42C> @param RLAT - REAL (*) STATION LATITUDES IN DEGREES
    +
    43C> @param RLON - REAL (*) STATION LONGITUDES IN DEGREES
    +
    44C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    +
    45C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    +
    46C> @param GRIDI - REAL (*) INPUT GRID FIELDS
    +
    47C> @param[out] GP - REAL (*) STATION POINT SETS
    +
    48C>
    +
    49C> SUBPROGRAMS CALLED:
    +
    50C> - sptran() Perform a scalar spherical transform
    +
    51C> - sptgpt() Transform spectral scalar to station points
    +
    52C> - ncpus() Gets environment number of cpus
    +
    53C>
    +
    54C> Minimum grid dimensions for unaliased transforms to spectral:
    +
    55C> DIMENSION |LINEAR |QUADRATIC
    +
    56C> ----------------------- |--------- |-------------
    +
    57C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2
    +
    58C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1
    +
    59C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1
    +
    60C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3
    +
    61C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3
    +
    62C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1
    +
    63C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1
    +
    64C>
    +
    +
    65 SUBROUTINE sptrung(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,NMAX,
    +
    66 & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP,
    +
    67 & NRSKIP,NGSKIP,JCPU,RLAT,RLON,GRIDI,GP)
    +
    68
    +
    69 REAL RLAT(*),RLON(*),GRIDI(*),GP(*)
    +
    70 REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    71C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    72C TRANSFORM INPUT GRID TO WAVE
    +
    73 jc=jcpu
    +
    74 IF(jc.EQ.0) jc=ncpus()
    +
    75 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    76 mdim=2*mx+1
    +
    77 jn=-jskipi
    +
    78 IF(jn.EQ.0) jn=imaxi
    +
    79 js=-jn
    +
    80 inp=(jmaxi-1)*max(0,-jn)+1
    +
    81 isp=(jmaxi-1)*max(0,-js)+1
    +
    82 CALL sptran(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    +
    83 & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    +
    84 & w,gridi(inp),gridi(isp),-1)
    +
    85C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    86C TRANSFORM WAVE TO OUTPUT
    +
    87 CALL sptgpt(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
    +
    88 & rlat,rlon,w,gp)
    +
    89C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    +
    90 END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition ncpus.F:22
    +
    subroutine sptgpt(iromb, maxwv, kmax, nmax, kwskip, kgskip, nrskip, ngskip, rlat, rlon, wave, gp)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to spe...
    Definition sptgpt.f:51
    +
    subroutine sptran(iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, wave, gridn, grids, idir)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition sptran.f:88
    +
    subroutine sptrung(iromb, maxwv, idrti, imaxi, jmaxi, kmax, nmax, iprime, iskipi, jskipi, kskipi, kgskip, nrskip, ngskip, jcpu, rlat, rlon, gridi, gp)
    This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields...
    Definition sptrung.f:68
    diff --git a/sptrungv_8f.html b/sptrungv_8f.html index 43b9cbac..f6ed8238 100644 --- a/sptrungv_8f.html +++ b/sptrungv_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptrungv.f File Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@
    @@ -76,16 +76,22 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    sptrungv.f File Reference
    +
    sptrungv.f File Reference
    @@ -94,11 +100,11 @@

    Go to the source code of this file.

    - - - - + + +

    +

    Functions/Subroutines

    subroutine sptrungv (IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NRSKIP, NGSKIP, JCPU, RLAT, RLON, GRIDUI, GRIDVI, LUV, UP, VP, LDZ, DP, ZP, LPS, PP, SP)
     THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTORS FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELDS TO SPECIFIED SETS OF STATION POINTS ON THE GLOBE. More...
     
    subroutine sptrungv (iromb, maxwv, idrti, imaxi, jmaxi, kmax, nmax, iprime, iskipi, jskipi, kskipi, kgskip, nrskip, ngskip, jcpu, rlat, rlon, gridui, gridvi, luv, up, vp, ldz, dp, zp, lps, pp, sp)
     THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTORS FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELDS TO SPECIFIED SETS OF STATION POINTS ON THE GLOBE.
     

    Detailed Description

    Spectrally interpolate vectors to stations.

    @@ -107,8 +113,8 @@

    Definition in file sptrungv.f.

    Function/Subroutine Documentation

    - -

    ◆ sptrungv()

    + +

    ◆ sptrungv()

    diff --git a/sptrungv_8f.js b/sptrungv_8f.js index c69c1059..b3205b70 100644 --- a/sptrungv_8f.js +++ b/sptrungv_8f.js @@ -1,4 +1,4 @@ var sptrungv_8f = [ - [ "sptrungv", "sptrungv_8f.html#ab7bbe6ecde57394b15e5d4925cb07164", null ] + [ "sptrungv", "sptrungv_8f.html#a53c1e5ccef37ef3753a057ca9b930fb3", null ] ]; \ No newline at end of file diff --git a/sptrungv_8f_source.html b/sptrungv_8f_source.html index 7dab915f..91fae410 100644 --- a/sptrungv_8f_source.html +++ b/sptrungv_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptrungv.f Source File @@ -23,10 +23,9 @@
    - - + @@ -34,22 +33,28 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ + +
    @@ -76,171 +81,179 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    sptrungv.f
    +
    sptrungv.f
    -Go to the documentation of this file.
    1 C> @file
    -
    2 C>
    -
    3 C> Spectrally interpolate vectors to stations
    -
    4 C> @author IREDELL @date 96-02-29
    -
    5 
    -
    6 C> THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTORS FIELDS
    -
    7 C> ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELDS
    -
    8 C> TO SPECIFIED SETS OF STATION POINTS ON THE GLOBE.
    -
    9 C> THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL.
    -
    10 C> THE GRID-SPACE CAN BE EITHER AN EQUALLY-SPACED GRID
    -
    11 C> (WITH OR WITHOUT POLE POINTS) OR A GAUSSIAN GRID.
    -
    12 C> THE GRID AND POINT FIELDS MAY HAVE GENERAL INDEXING.
    -
    13 C> THE TRANSFORMS ARE ALL MULTIPROCESSED.
    -
    14 C> TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION.
    -
    15 C> SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
    -
    16 C>
    -
    17 C> PROGRAM HISTORY LOG:
    -
    18 C> - 96-02-29 IREDELL
    -
    19 C> - 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED
    -
    20 C>
    -
    21 C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    -
    22 C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    -
    23 C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    -
    24 C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    -
    25 C> (IDRTI=4 FOR GAUSSIAN GRID,
    -
    26 C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    -
    27 C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    -
    28 C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    -
    29 C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    -
    30 C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    -
    31 C> @param NMAX - INTEGER NUMBER OF STATION POINTS TO RETURN
    -
    32 C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    -
    33 C> (DEFAULTS TO 1 IF IPRIME=0)
    -
    34 C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    -
    35 C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    -
    36 C> (DEFAULTS TO 1 IF ISKIPI=0)
    -
    37 C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    -
    38 C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    -
    39 C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    -
    40 C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    -
    41 C> @param KGSKIP - INTEGER SKIP NUMBER BETWEEN STATION POINT SETS
    -
    42 C> (DEFAULTS TO NMAX IF KGSKIP=0)
    -
    43 C> @param NRSKIP - INTEGER SKIP NUMBER BETWEEN STATION LATS AND LONS
    -
    44 C> (DEFAULTS TO 1 IF NRSKIP=0)
    -
    45 C> @param NGSKIP - INTEGER SKIP NUMBER BETWEEN STATION POINTS
    -
    46 C> (DEFAULTS TO 1 IF NGSKIP=0)
    -
    47 C> @param RLAT - REAL (*) STATION LATITUDES IN DEGREES
    -
    48 C> @param RLON - REAL (*) STATION LONGITUDES IN DEGREES
    -
    49 C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    -
    50 C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    -
    51 C> @param GRIDUI - REAL (*) INPUT GRID U-WINDS
    -
    52 C> @param GRIDVI - REAL (*) INPUT GRID V-WINDS
    -
    53 C> @param LUV - LOGICAL FLAG WHETHER TO RETURN WINDS
    -
    54 C> @param LDZ - LOGICAL FLAG WHETHER TO RETURN DIVERGENCE AND VORTICITY
    -
    55 C> @param LPS - LOGICAL FLAG WHETHER TO RETURN POTENTIAL AND STREAMFCN
    -
    56 C> @param UP - REAL (*) STATION U-WINDS IF LUV
    -
    57 C> @param VP - REAL (*) STATION V-WINDS IF LUV
    -
    58 C> @param DP - REAL (*) STATION DIVERGENCES IF LDZ
    -
    59 C> @param ZP - REAL (*) STATION VORTICITIES IF LDZ
    -
    60 C> @param PP - REAL (*) STATION POTENTIALS IF LPS
    -
    61 C> @param SP - REAL (*) STATION STREAMFCNS IF LPS
    -
    62 C>
    -
    63 C> SUBPROGRAMS CALLED:
    -
    64 C> - SPWGET GET WAVE-SPACE CONSTANTS
    -
    65 C> - SPLAPLAC COMPUTE LAPLACIAN IN SPECTRAL SPACE
    -
    66 C> - SPTRANV PERFORM A VECTOR SPHERICAL TRANSFORM
    -
    67 C> - SPTGPT TRANSFORM SPECTRAL SCALAR TO STATION POINTS
    -
    68 C> - SPTGPTV TRANSFORM SPECTRAL VECTOR TO STATION POINTS
    -
    69 C> - NCPUS GETS ENVIRONMENT NUMBER OF CPUS
    -
    70 C>
    -
    71 C> REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:
    -
    72 C> DIMENSION |LINEAR |QUADRATIC
    -
    73 C> ----------------------- |--------- |-------------
    -
    74 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    -
    75 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    -
    76 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    -
    77 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    -
    78 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    -
    79 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    -
    80 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    -
    81  SUBROUTINE sptrungv(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,NMAX,
    -
    82  & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP,
    -
    83  & NRSKIP,NGSKIP,JCPU,RLAT,RLON,GRIDUI,GRIDVI,
    -
    84  & LUV,UP,VP,LDZ,DP,ZP,LPS,PP,SP)
    -
    85 
    -
    86  LOGICAL LUV,LDZ,LPS
    -
    87  REAL RLAT(*),RLON(*),GRIDUI(*),GRIDVI(*)
    -
    88  REAL UP(*),VP(*),DP(*),ZP(*),PP(*),SP(*)
    -
    89  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    -
    90  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    -
    91  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    -
    92  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    -
    93  REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    -
    94  REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    -
    95 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    96 C TRANSFORM INPUT GRID TO WAVE
    -
    97  jc=jcpu
    -
    98  IF(jc.EQ.0) jc=ncpus()
    -
    99  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    -
    100  mdim=2*mx+1
    -
    101  jn=-jskipi
    -
    102  IF(jn.EQ.0) jn=imaxi
    -
    103  js=-jn
    -
    104  inp=(jmaxi-1)*max(0,-jn)+1
    -
    105  isp=(jmaxi-1)*max(0,-js)+1
    -
    106  CALL sptranv(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    -
    107  & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    -
    108  & wd,wz,
    -
    109  & gridui(inp),gridui(isp),gridvi(inp),gridvi(isp),-1)
    -
    110 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    111 C TRANSFORM WAVE TO OUTPUT WINDS
    -
    112  IF(luv) THEN
    -
    113  CALL sptgptv(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
    -
    114  & rlat,rlon,wd,wz,up,vp)
    -
    115  ENDIF
    -
    116 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    117 C TRANSFORM WAVE TO OUTPUT DIVERGENCE AND VORTICITY
    -
    118  IF(ldz) THEN
    -
    119  CALL sptgpt(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
    -
    120  & rlat,rlon,wd,dp)
    -
    121  CALL sptgpt(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
    -
    122  & rlat,rlon,wz,zp)
    -
    123  ENDIF
    -
    124 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    125 C TRANSFORM WAVE TO OUTPUT POTENTIAL AND STREAMFUNCTION
    -
    126  IF(lps) THEN
    -
    127  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    -
    128 C$OMP PARALLEL DO
    -
    129  DO k=1,kmax
    -
    130  CALL splaplac(iromb,maxwv,enn1,wd(1,k),wd(1,k),-1)
    -
    131  CALL splaplac(iromb,maxwv,enn1,wz(1,k),wz(1,k),-1)
    -
    132  wd(1:2,k)=0.
    -
    133  wz(1:2,k)=0.
    -
    134  ENDDO
    -
    135  CALL sptgpt(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
    -
    136  & rlat,rlon,wd,pp)
    -
    137  CALL sptgpt(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
    -
    138  & rlat,rlon,wz,sp)
    -
    139  ENDIF
    -
    140 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    141  END
    -
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    -
    subroutine splaplac(I, M, ENN1, Q, QD2, IDIR)
    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
    Definition: splaplac.f:25
    -
    subroutine sptgpt(IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVE, GP)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to spe...
    Definition: sptgpt.f:51
    -
    subroutine sptgptv(IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVED, WAVEZ, UP, VP)
    This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
    Definition: sptgptv.f:54
    -
    subroutine sptranv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
    Definition: sptranv.f:91
    -
    subroutine sptrungv(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NRSKIP, NGSKIP, JCPU, RLAT, RLON, GRIDUI, GRIDVI, LUV, UP, VP, LDZ, DP, ZP, LPS, PP, SP)
    THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTORS FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELD...
    Definition: sptrungv.f:85
    -
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +Go to the documentation of this file.
    1C> @file
    +
    2C>
    +
    3C> Spectrally interpolate vectors to stations
    +
    4C> @author IREDELL @date 96-02-29
    +
    5
    +
    6C> THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTORS FIELDS
    +
    7C> ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELDS
    +
    8C> TO SPECIFIED SETS OF STATION POINTS ON THE GLOBE.
    +
    9C> THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL.
    +
    10C> THE GRID-SPACE CAN BE EITHER AN EQUALLY-SPACED GRID
    +
    11C> (WITH OR WITHOUT POLE POINTS) OR A GAUSSIAN GRID.
    +
    12C> THE GRID AND POINT FIELDS MAY HAVE GENERAL INDEXING.
    +
    13C> THE TRANSFORMS ARE ALL MULTIPROCESSED.
    +
    14C> TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION.
    +
    15C> SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
    +
    16C>
    +
    17C> PROGRAM HISTORY LOG:
    +
    18C> - 96-02-29 IREDELL
    +
    19C> - 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED
    +
    20C>
    +
    21C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    +
    22C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    +
    23C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    +
    24C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    +
    25C> (IDRTI=4 FOR GAUSSIAN GRID,
    +
    26C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    27C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    +
    28C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    +
    29C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    +
    30C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    +
    31C> @param NMAX - INTEGER NUMBER OF STATION POINTS TO RETURN
    +
    32C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    +
    33C> (DEFAULTS TO 1 IF IPRIME=0)
    +
    34C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    +
    35C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    +
    36C> (DEFAULTS TO 1 IF ISKIPI=0)
    +
    37C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    +
    38C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    +
    39C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    +
    40C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    +
    41C> @param KGSKIP - INTEGER SKIP NUMBER BETWEEN STATION POINT SETS
    +
    42C> (DEFAULTS TO NMAX IF KGSKIP=0)
    +
    43C> @param NRSKIP - INTEGER SKIP NUMBER BETWEEN STATION LATS AND LONS
    +
    44C> (DEFAULTS TO 1 IF NRSKIP=0)
    +
    45C> @param NGSKIP - INTEGER SKIP NUMBER BETWEEN STATION POINTS
    +
    46C> (DEFAULTS TO 1 IF NGSKIP=0)
    +
    47C> @param RLAT - REAL (*) STATION LATITUDES IN DEGREES
    +
    48C> @param RLON - REAL (*) STATION LONGITUDES IN DEGREES
    +
    49C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    +
    50C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    +
    51C> @param GRIDUI - REAL (*) INPUT GRID U-WINDS
    +
    52C> @param GRIDVI - REAL (*) INPUT GRID V-WINDS
    +
    53C> @param LUV - LOGICAL FLAG WHETHER TO RETURN WINDS
    +
    54C> @param LDZ - LOGICAL FLAG WHETHER TO RETURN DIVERGENCE AND VORTICITY
    +
    55C> @param LPS - LOGICAL FLAG WHETHER TO RETURN POTENTIAL AND STREAMFCN
    +
    56C> @param UP - REAL (*) STATION U-WINDS IF LUV
    +
    57C> @param VP - REAL (*) STATION V-WINDS IF LUV
    +
    58C> @param DP - REAL (*) STATION DIVERGENCES IF LDZ
    +
    59C> @param ZP - REAL (*) STATION VORTICITIES IF LDZ
    +
    60C> @param PP - REAL (*) STATION POTENTIALS IF LPS
    +
    61C> @param SP - REAL (*) STATION STREAMFCNS IF LPS
    +
    62C>
    +
    63C> SUBPROGRAMS CALLED:
    +
    64C> - SPWGET GET WAVE-SPACE CONSTANTS
    +
    65C> - SPLAPLAC COMPUTE LAPLACIAN IN SPECTRAL SPACE
    +
    66C> - SPTRANV PERFORM A VECTOR SPHERICAL TRANSFORM
    +
    67C> - SPTGPT TRANSFORM SPECTRAL SCALAR TO STATION POINTS
    +
    68C> - SPTGPTV TRANSFORM SPECTRAL VECTOR TO STATION POINTS
    +
    69C> - NCPUS GETS ENVIRONMENT NUMBER OF CPUS
    +
    70C>
    +
    71C> REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:
    +
    72C> DIMENSION |LINEAR |QUADRATIC
    +
    73C> ----------------------- |--------- |-------------
    +
    74C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    +
    75C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    +
    76C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    +
    77C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    +
    78C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    +
    79C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    +
    80C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    +
    +
    81 SUBROUTINE sptrungv(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,NMAX,
    +
    82 & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP,
    +
    83 & NRSKIP,NGSKIP,JCPU,RLAT,RLON,GRIDUI,GRIDVI,
    +
    84 & LUV,UP,VP,LDZ,DP,ZP,LPS,PP,SP)
    +
    85
    +
    86 LOGICAL LUV,LDZ,LPS
    +
    87 REAL RLAT(*),RLON(*),GRIDUI(*),GRIDVI(*)
    +
    88 REAL UP(*),VP(*),DP(*),ZP(*),PP(*),SP(*)
    +
    89 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    90 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    91 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    92 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    93 REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    94 REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    95C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    96C TRANSFORM INPUT GRID TO WAVE
    +
    97 jc=jcpu
    +
    98 IF(jc.EQ.0) jc=ncpus()
    +
    99 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    100 mdim=2*mx+1
    +
    101 jn=-jskipi
    +
    102 IF(jn.EQ.0) jn=imaxi
    +
    103 js=-jn
    +
    104 inp=(jmaxi-1)*max(0,-jn)+1
    +
    105 isp=(jmaxi-1)*max(0,-js)+1
    +
    106 CALL sptranv(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    +
    107 & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    +
    108 & wd,wz,
    +
    109 & gridui(inp),gridui(isp),gridvi(inp),gridvi(isp),-1)
    +
    110C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    111C TRANSFORM WAVE TO OUTPUT WINDS
    +
    112 IF(luv) THEN
    +
    113 CALL sptgptv(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
    +
    114 & rlat,rlon,wd,wz,up,vp)
    +
    115 ENDIF
    +
    116C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    117C TRANSFORM WAVE TO OUTPUT DIVERGENCE AND VORTICITY
    +
    118 IF(ldz) THEN
    +
    119 CALL sptgpt(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
    +
    120 & rlat,rlon,wd,dp)
    +
    121 CALL sptgpt(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
    +
    122 & rlat,rlon,wz,zp)
    +
    123 ENDIF
    +
    124C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    125C TRANSFORM WAVE TO OUTPUT POTENTIAL AND STREAMFUNCTION
    +
    126 IF(lps) THEN
    +
    127 CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    128C$OMP PARALLEL DO
    +
    129 DO k=1,kmax
    +
    130 CALL splaplac(iromb,maxwv,enn1,wd(1,k),wd(1,k),-1)
    +
    131 CALL splaplac(iromb,maxwv,enn1,wz(1,k),wz(1,k),-1)
    +
    132 wd(1:2,k)=0.
    +
    133 wz(1:2,k)=0.
    +
    134 ENDDO
    +
    135 CALL sptgpt(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
    +
    136 & rlat,rlon,wd,pp)
    +
    137 CALL sptgpt(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
    +
    138 & rlat,rlon,wz,sp)
    +
    139 ENDIF
    +
    140C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    +
    141 END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition ncpus.F:22
    +
    subroutine splaplac(i, m, enn1, q, qd2, idir)
    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
    Definition splaplac.f:25
    +
    subroutine sptgpt(iromb, maxwv, kmax, nmax, kwskip, kgskip, nrskip, ngskip, rlat, rlon, wave, gp)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to spe...
    Definition sptgpt.f:51
    +
    subroutine sptgptv(iromb, maxwv, kmax, nmax, kwskip, kgskip, nrskip, ngskip, rlat, rlon, waved, wavez, up, vp)
    This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
    Definition sptgptv.f:54
    +
    subroutine sptranv(iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, waved, wavez, gridun, gridus, gridvn, gridvs, idir)
    This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
    Definition sptranv.f:91
    +
    subroutine sptrungv(iromb, maxwv, idrti, imaxi, jmaxi, kmax, nmax, iprime, iskipi, jskipi, kskipi, kgskip, nrskip, ngskip, jcpu, rlat, rlon, gridui, gridvi, luv, up, vp, ldz, dp, zp, lps, pp, sp)
    THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTORS FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELD...
    Definition sptrungv.f:85
    +
    subroutine spwget(iromb, maxwv, eps, epstop, enn1, elonn1, eon, eontop)
    This subprogram gets wave-space constants.
    Definition spwget.f:18
    diff --git a/sptrunl_8f.html b/sptrunl_8f.html index 26b7b2c6..22fdae2f 100644 --- a/sptrunl_8f.html +++ b/sptrunl_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptrunl.f File Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@
    @@ -76,16 +76,22 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    sptrunl.f File Reference
    +
    sptrunl.f File Reference
    @@ -94,11 +100,11 @@

    Go to the source code of this file.

    - - - - + + +

    +

    Functions/Subroutines

    subroutine sptrunl (IROMB, MAXWV, IDRTI, IMAXI, JMAXI, IDRTO, IMAXO, JMAXO, KMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, ISKIPO, JSKIPO, KSKIPO, JCPU, IDIR, GRIDI, GRIDO)
     THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR LAPLACIAN OR INVERSE TO A POSSIBLY DIFFERENT GLOBAL CYLINDRICAL GRID. More...
     
    subroutine sptrunl (iromb, maxwv, idrti, imaxi, jmaxi, idrto, imaxo, jmaxo, kmax, iprime, iskipi, jskipi, kskipi, iskipo, jskipo, kskipo, jcpu, idir, gridi, grido)
     THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR LAPLACIAN OR INVERSE TO A POSSIBLY DIFFERENT GLOBAL CYLINDRICAL GRID.
     

    Detailed Description

    Spectrally truncate to laplacian.

    @@ -107,8 +113,8 @@

    Definition in file sptrunl.f.

    Function/Subroutine Documentation

    - -

    ◆ sptrunl()

    + +

    ◆ sptrunl()

    @@ -309,7 +315,7 @@

    diff --git a/sptrunl_8f.js b/sptrunl_8f.js index 892c4e7f..a639146b 100644 --- a/sptrunl_8f.js +++ b/sptrunl_8f.js @@ -1,4 +1,4 @@ var sptrunl_8f = [ - [ "sptrunl", "sptrunl_8f.html#a52c4250d24e52304e49aa1d82a93bdb8", null ] + [ "sptrunl", "sptrunl_8f.html#a4782dd6e787b07311f93f4d07d2d6239", null ] ]; \ No newline at end of file diff --git a/sptrunl_8f_source.html b/sptrunl_8f_source.html index fafc43c1..b5b7562a 100644 --- a/sptrunl_8f_source.html +++ b/sptrunl_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptrunl.f Source File @@ -23,10 +23,9 @@
    - - + @@ -34,22 +33,28 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ + +
    @@ -76,143 +81,151 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    sptrunl.f
    +
    sptrunl.f
    -Go to the documentation of this file.
    1 C> @file
    -
    2 C>
    -
    3 C> Spectrally truncate to laplacian
    -
    4 C> @author IREDELL @date 96-02-29
    -
    5 
    -
    6 C> THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS
    -
    7 C> ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR LAPLACIAN
    -
    8 C> OR INVERSE TO A POSSIBLY DIFFERENT GLOBAL CYLINDRICAL GRID.
    -
    9 C> THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL.
    -
    10 C> EITHER GRID-SPACE CAN BE EITHER AN EQUALLY-SPACED GRID
    -
    11 C> (WITH OR WITHOUT POLE POINTS) OR A GAUSSIAN GRID.
    -
    12 C> THE GRID FIELDS MAY HAVE GENERAL INDEXING.
    -
    13 C> THE TRANSFORMS ARE ALL MULTIPROCESSED.
    -
    14 C> OVER ZONAL WAVENUMBER TO ENSURE REPRODUCIBILITY.
    -
    15 C> TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION.
    -
    16 C> SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
    -
    17 C>
    -
    18 C> PROGRAM HISTORY LOG:
    -
    19 C> - 96-02-29 IREDELL
    -
    20 C> - 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED
    -
    21 C>
    -
    22 C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    -
    23 C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    -
    24 C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    -
    25 C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    -
    26 C> (IDRTI=4 FOR GAUSSIAN GRID,
    -
    27 C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    -
    28 C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    -
    29 C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    -
    30 C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    -
    31 C> @param IDRTO - INTEGER OUTPUT GRID IDENTIFIER
    -
    32 C> (IDRTO=4 FOR GAUSSIAN GRID,
    -
    33 C> IDRTO=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    -
    34 C> IDRTO=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    -
    35 C> @param IMAXO - INTEGER EVEN NUMBER OF OUTPUT LONGITUDES.
    -
    36 C> @param JMAXO - INTEGER NUMBER OF OUTPUT LATITUDES.
    -
    37 C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    -
    38 C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    -
    39 C> (DEFAULTS TO 1 IF IPRIME=0)
    -
    40 C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    -
    41 C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    -
    42 C> (DEFAULTS TO 1 IF ISKIPI=0)
    -
    43 C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    -
    44 C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    -
    45 C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    -
    46 C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    -
    47 C> @param ISKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LONGITUDES
    -
    48 C> (DEFAULTS TO 1 IF ISKIPO=0)
    -
    49 C> @param JSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LATITUDES FROM SOUTH
    -
    50 C> (DEFAULTS TO -IMAXO IF JSKIPO=0)
    -
    51 C> @param KSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT GRID FIELDS
    -
    52 C> (DEFAULTS TO IMAXO*JMAXO IF KSKIPO=0)
    -
    53 C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    -
    54 C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    -
    55 C> @param IDIR - INTEGER FLAG
    -
    56 C> IDIR > 0 TO TAKE LAPLACIAN
    -
    57 C> IDIR < 0 TO TAKE INVERSE LAPLACIAN
    -
    58 C> @param GRIDI - REAL (*) INPUT GRID FIELDS
    -
    59 C> @param GRIDO - REAL (*) OUTPUT GRID FIELDS
    -
    60 C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    -
    61 C>
    -
    62 C> SUBPROGRAMS CALLED:
    -
    63 C> - SPWGET GET WAVE-SPACE CONSTANTS
    -
    64 C> - SPLAPLAC COMPUTE LAPLACIAN IN SPECTRAL SPACE
    -
    65 C> - SPTRAN PERFORM A SCALAR SPHERICAL TRANSFORM
    -
    66 C> - NCPUS GETS ENVIRONMENT NUMBER OF CPUS
    -
    67 C>
    -
    68 C> REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:
    -
    69 C> DIMENSION |LINEAR |QUADRATIC
    -
    70 C> ----------------------- |--------- |-------------
    -
    71 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    -
    72 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    -
    73 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    -
    74 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    -
    75 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    -
    76 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    -
    77 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    -
    78  SUBROUTINE sptrunl(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,
    -
    79  & IDRTO,IMAXO,JMAXO,KMAX,
    -
    80  & IPRIME,ISKIPI,JSKIPI,KSKIPI,
    -
    81  & ISKIPO,JSKIPO,KSKIPO,JCPU,IDIR,GRIDI,GRIDO)
    -
    82 
    -
    83  REAL GRIDI(*),GRIDO(*)
    -
    84  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    -
    85  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    -
    86  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    -
    87  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    -
    88  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    -
    89 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    90 C TRANSFORM INPUT GRID TO WAVE
    -
    91  jc=jcpu
    -
    92  IF(jc.EQ.0) jc=ncpus()
    -
    93  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    -
    94  mdim=2*mx+1
    -
    95  jn=-jskipi
    -
    96  IF(jn.EQ.0) jn=imaxi
    -
    97  js=-jn
    -
    98  inp=(jmaxi-1)*max(0,-jn)+1
    -
    99  isp=(jmaxi-1)*max(0,-js)+1
    -
    100  CALL sptran(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    -
    101  & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    -
    102  & w,gridi(inp),gridi(isp),-1)
    -
    103 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    104 C TAKE LAPLACIAN AND TRANSFORM WAVE TO OUTPUT GRID
    -
    105  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    -
    106 C$OMP PARALLEL DO
    -
    107  DO k=1,kmax
    -
    108  CALL splaplac(iromb,maxwv,enn1,w(1,k),w(1,k),idir)
    -
    109  w(1:2,k)=0.
    -
    110  ENDDO
    -
    111  CALL sptran(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
    -
    112  & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
    -
    113  & w,grido(inp),grido(isp),1)
    -
    114 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    115  END
    -
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    -
    subroutine splaplac(I, M, ENN1, Q, QD2, IDIR)
    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
    Definition: splaplac.f:25
    -
    subroutine sptran(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDN, GRIDS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition: sptran.f:88
    -
    subroutine sptrunl(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, IDRTO, IMAXO, JMAXO, KMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, ISKIPO, JSKIPO, KSKIPO, JCPU, IDIR, GRIDI, GRIDO)
    THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR LAPL...
    Definition: sptrunl.f:82
    -
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +Go to the documentation of this file.
    1C> @file
    +
    2C>
    +
    3C> Spectrally truncate to laplacian
    +
    4C> @author IREDELL @date 96-02-29
    +
    5
    +
    6C> THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS
    +
    7C> ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR LAPLACIAN
    +
    8C> OR INVERSE TO A POSSIBLY DIFFERENT GLOBAL CYLINDRICAL GRID.
    +
    9C> THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL.
    +
    10C> EITHER GRID-SPACE CAN BE EITHER AN EQUALLY-SPACED GRID
    +
    11C> (WITH OR WITHOUT POLE POINTS) OR A GAUSSIAN GRID.
    +
    12C> THE GRID FIELDS MAY HAVE GENERAL INDEXING.
    +
    13C> THE TRANSFORMS ARE ALL MULTIPROCESSED.
    +
    14C> OVER ZONAL WAVENUMBER TO ENSURE REPRODUCIBILITY.
    +
    15C> TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION.
    +
    16C> SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
    +
    17C>
    +
    18C> PROGRAM HISTORY LOG:
    +
    19C> - 96-02-29 IREDELL
    +
    20C> - 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED
    +
    21C>
    +
    22C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    +
    23C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    +
    24C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    +
    25C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    +
    26C> (IDRTI=4 FOR GAUSSIAN GRID,
    +
    27C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    28C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    +
    29C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    +
    30C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    +
    31C> @param IDRTO - INTEGER OUTPUT GRID IDENTIFIER
    +
    32C> (IDRTO=4 FOR GAUSSIAN GRID,
    +
    33C> IDRTO=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    34C> IDRTO=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    +
    35C> @param IMAXO - INTEGER EVEN NUMBER OF OUTPUT LONGITUDES.
    +
    36C> @param JMAXO - INTEGER NUMBER OF OUTPUT LATITUDES.
    +
    37C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    +
    38C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    +
    39C> (DEFAULTS TO 1 IF IPRIME=0)
    +
    40C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    +
    41C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    +
    42C> (DEFAULTS TO 1 IF ISKIPI=0)
    +
    43C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    +
    44C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    +
    45C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    +
    46C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    +
    47C> @param ISKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LONGITUDES
    +
    48C> (DEFAULTS TO 1 IF ISKIPO=0)
    +
    49C> @param JSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LATITUDES FROM SOUTH
    +
    50C> (DEFAULTS TO -IMAXO IF JSKIPO=0)
    +
    51C> @param KSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT GRID FIELDS
    +
    52C> (DEFAULTS TO IMAXO*JMAXO IF KSKIPO=0)
    +
    53C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    +
    54C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    +
    55C> @param IDIR - INTEGER FLAG
    +
    56C> IDIR > 0 TO TAKE LAPLACIAN
    +
    57C> IDIR < 0 TO TAKE INVERSE LAPLACIAN
    +
    58C> @param GRIDI - REAL (*) INPUT GRID FIELDS
    +
    59C> @param GRIDO - REAL (*) OUTPUT GRID FIELDS
    +
    60C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    +
    61C>
    +
    62C> SUBPROGRAMS CALLED:
    +
    63C> - SPWGET GET WAVE-SPACE CONSTANTS
    +
    64C> - SPLAPLAC COMPUTE LAPLACIAN IN SPECTRAL SPACE
    +
    65C> - SPTRAN PERFORM A SCALAR SPHERICAL TRANSFORM
    +
    66C> - NCPUS GETS ENVIRONMENT NUMBER OF CPUS
    +
    67C>
    +
    68C> REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:
    +
    69C> DIMENSION |LINEAR |QUADRATIC
    +
    70C> ----------------------- |--------- |-------------
    +
    71C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    +
    72C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    +
    73C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    +
    74C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    +
    75C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    +
    76C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    +
    77C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    +
    +
    78 SUBROUTINE sptrunl(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,
    +
    79 & IDRTO,IMAXO,JMAXO,KMAX,
    +
    80 & IPRIME,ISKIPI,JSKIPI,KSKIPI,
    +
    81 & ISKIPO,JSKIPO,KSKIPO,JCPU,IDIR,GRIDI,GRIDO)
    +
    82
    +
    83 REAL GRIDI(*),GRIDO(*)
    +
    84 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    85 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    86 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    87 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    88 REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    89C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    90C TRANSFORM INPUT GRID TO WAVE
    +
    91 jc=jcpu
    +
    92 IF(jc.EQ.0) jc=ncpus()
    +
    93 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    94 mdim=2*mx+1
    +
    95 jn=-jskipi
    +
    96 IF(jn.EQ.0) jn=imaxi
    +
    97 js=-jn
    +
    98 inp=(jmaxi-1)*max(0,-jn)+1
    +
    99 isp=(jmaxi-1)*max(0,-js)+1
    +
    100 CALL sptran(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    +
    101 & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    +
    102 & w,gridi(inp),gridi(isp),-1)
    +
    103C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    104C TAKE LAPLACIAN AND TRANSFORM WAVE TO OUTPUT GRID
    +
    105 CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    106C$OMP PARALLEL DO
    +
    107 DO k=1,kmax
    +
    108 CALL splaplac(iromb,maxwv,enn1,w(1,k),w(1,k),idir)
    +
    109 w(1:2,k)=0.
    +
    110 ENDDO
    +
    111 CALL sptran(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
    +
    112 & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
    +
    113 & w,grido(inp),grido(isp),1)
    +
    114C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    +
    115 END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition ncpus.F:22
    +
    subroutine splaplac(i, m, enn1, q, qd2, idir)
    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
    Definition splaplac.f:25
    +
    subroutine sptran(iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, wave, gridn, grids, idir)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition sptran.f:88
    +
    subroutine sptrunl(iromb, maxwv, idrti, imaxi, jmaxi, idrto, imaxo, jmaxo, kmax, iprime, iskipi, jskipi, kskipi, iskipo, jskipo, kskipo, jcpu, idir, gridi, grido)
    THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR LAPL...
    Definition sptrunl.f:82
    +
    subroutine spwget(iromb, maxwv, eps, epstop, enn1, elonn1, eon, eontop)
    This subprogram gets wave-space constants.
    Definition spwget.f:18
    diff --git a/sptrunm_8f.html b/sptrunm_8f.html index 1e62005e..0128eebf 100644 --- a/sptrunm_8f.html +++ b/sptrunm_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptrunm.f File Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@
    @@ -76,16 +76,22 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    sptrunm.f File Reference
    +
    sptrunm.f File Reference
    @@ -94,11 +100,11 @@

    Go to the source code of this file.

    - - - - + + +

    +

    Functions/Subroutines

    subroutine sptrunm (IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, MI, MJ, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, RLAT1, RLON1, DLAT, DLON, GRIDI, GM)
     This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields to a Mercator grid. More...
     
    subroutine sptrunm (iromb, maxwv, idrti, imaxi, jmaxi, kmax, mi, mj, iprime, iskipi, jskipi, kskipi, kgskip, niskip, njskip, jcpu, rlat1, rlon1, dlat, dlon, gridi, gm)
     This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields to a Mercator grid.
     

    Detailed Description

    Spectrally interpolate scalars to Mercator.

    @@ -107,8 +113,8 @@

    Definition in file sptrunm.f.

    Function/Subroutine Documentation

    - -

    ◆ sptrunm()

    + +

    ◆ sptrunm()

    @@ -117,133 +123,133 @@

    subroutine sptrunm (   - IROMB, + iromb,   - MAXWV, + maxwv,   - IDRTI, + idrti,   - IMAXI, + imaxi,   - JMAXI, + jmaxi,   - KMAX, + kmax,   - MI, + mi,   - MJ, + mj,   - IPRIME, + iprime,   - ISKIPI, + iskipi,   - JSKIPI, + jskipi,   - KSKIPI, + kskipi,   - KGSKIP, + kgskip,   - NISKIP, + niskip,   - NJSKIP, + njskip,   - JCPU, + jcpu,   - RLAT1, + rlat1,   - RLON1, + rlon1,   - DLAT, + dlat,   - DLON, + dlon, real, dimension(*)  - GRIDI, + gridi, real, dimension(*)  - GM  + gm  @@ -283,8 +289,8 @@

    sptran() Perform a scalar spherical transform -
  • sptgpm() Transform spectral scalar to Mercator
  • +
  • sptran() Perform a scalar spherical transform
  • +
  • sptgpm() Transform spectral scalar to Mercator
  • ncpus() Gets environment number of cpus
  • MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:

    @@ -308,7 +314,7 @@

    Definition at line 76 of file sptrunm.f.

    -

    References ncpus(), sptgpm(), and sptran().

    +

    References ncpus(), sptgpm(), and sptran().

    Referenced by spectral_interp_mod::polates4::polates4_grib1(), and spectral_interp_mod::polates4::polates4_grib2().

    @@ -320,7 +326,7 @@

    diff --git a/sptrunm_8f.js b/sptrunm_8f.js index 285bd268..e0cb8bed 100644 --- a/sptrunm_8f.js +++ b/sptrunm_8f.js @@ -1,4 +1,4 @@ var sptrunm_8f = [ - [ "sptrunm", "sptrunm_8f.html#a2a4e579890d3cf7f6a26091f544b6cb6", null ] + [ "sptrunm", "sptrunm_8f.html#ae8204e04b20b7202a8abe429a66666de", null ] ]; \ No newline at end of file diff --git a/sptrunm_8f_source.html b/sptrunm_8f_source.html index 860840d6..749b55e5 100644 --- a/sptrunm_8f_source.html +++ b/sptrunm_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptrunm.f Source File @@ -23,10 +23,9 @@

    - - + @@ -34,22 +33,28 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0

    - + +/* @license-end */ + +
    @@ -76,128 +81,136 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    sptrunm.f
    +
    sptrunm.f
    -Go to the documentation of this file.
    1 C> @file
    -
    2 C>
    -
    3 C> Spectrally interpolate scalars to Mercator
    -
    4 C> @author IREDELL @date 96-02-29
    -
    5 
    -
    6 C> This subprogram spectrally truncates scalar fields on a global
    -
    7 C> cylindrical grid, returning the fields to a Mercator grid. The
    -
    8 C> wave-space can be either triangular or rhomboidal. The grid-space
    -
    9 C> can be either an equally-spaced grid (with or without pole
    -
    10 C> points) or a Gaussian grid. The grid fields may have general
    -
    11 C> indexing. The transforms are all multiprocessed. Transform
    -
    12 C> several fields at a time to improve vectorization. Subprogram can
    -
    13 C> be called from a multiprocessing environment.
    -
    14 C>
    -
    15 C>
    -
    16 C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    -
    17 C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    -
    18 C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    -
    19 C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    -
    20 C> (IDRTI=4 FOR GAUSSIAN GRID,
    -
    21 C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    -
    22 C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    -
    23 C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    -
    24 C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    -
    25 C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    -
    26 C> @param MI - INTEGER NUMBER OF POINTS IN THE FASTER ZONAL DIRECTION
    -
    27 C> @param MJ - INTEGER NUMBER OF POINTS IN THE SLOWER MERID DIRECTION
    -
    28 C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    -
    29 C> (DEFAULTS TO 1 IF IPRIME=0)
    -
    30 C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    -
    31 C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    -
    32 C> (DEFAULTS TO 1 IF ISKIPI=0)
    -
    33 C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    -
    34 C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    -
    35 C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    -
    36 C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    -
    37 C> @param KGSKIP - INTEGER SKIP NUMBER BETWEEN GRID FIELDS
    -
    38 C> (DEFAULTS TO NPS*NPS IF KGSKIP=0)
    -
    39 C> @param NISKIP - INTEGER SKIP NUMBER BETWEEN GRID I-POINTS
    -
    40 C> (DEFAULTS TO 1 IF NISKIP=0)
    -
    41 C> @param NJSKIP - INTEGER SKIP NUMBER BETWEEN GRID J-POINTS
    -
    42 C> (DEFAULTS TO NPS IF NJSKIP=0)
    -
    43 C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    -
    44 C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    -
    45 C> @param RLAT1 - REAL LATITUDE OF THE FIRST GRID POINT IN DEGREES
    -
    46 C> @param RLON1 - REAL LONGITUDE OF THE FIRST GRID POINT IN DEGREES
    -
    47 C> @param DLAT - REAL LATITUDE INCREMENT IN DEGREES SUCH THAT
    -
    48 C> D(PHI)/D(J)=DLAT*COS(PHI) WHERE J IS MERIDIONAL INDEX.
    -
    49 C> DLAT IS NEGATIVE FOR GRIDS INDEXED SOUTHWARD.
    -
    50 C> (IN TERMS OF GRID INCREMENT DY VALID AT LATITUDE RLATI,
    -
    51 C> THE LATITUDE INCREMENT DLAT IS DETERMINED AS
    -
    52 C> DLAT=DPR*DY/(RERTH*COS(RLATI/DPR))
    -
    53 C> WHERE DPR=180/PI AND RERTH IS EARTH'S RADIUS)
    -
    54 C> @param DLON - REAL LONGITUDE INCREMENT IN DEGREES SUCH THAT
    -
    55 C> D(LAMBDA)/D(I)=DLON WHERE I IS ZONAL INDEX.
    -
    56 C> DLON IS NEGATIVE FOR GRIDS INDEXED WESTWARD.
    -
    57 C> @param GRIDI - REAL (*) INPUT GRID FIELDS
    -
    58 C> @param GM - REAL (*) MERCATOR FIELDS
    -
    59 C>
    -
    60 C> SUBPROGRAMS CALLED:
    -
    61 C> - sptran() Perform a scalar spherical transform
    -
    62 C> - sptgpm() Transform spectral scalar to Mercator
    -
    63 C> - ncpus() Gets environment number of cpus
    -
    64 C>
    -
    65 C> MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:
    -
    66 C> DIMENSION |LINEAR |QUADRATIC
    -
    67 C> ----------------------- |--------- |-------------
    -
    68 C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2
    -
    69 C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1
    -
    70 C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1
    -
    71 C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3
    -
    72 C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3
    -
    73 C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1
    -
    74 C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1
    -
    75 C>
    -
    76  SUBROUTINE sptrunm(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,MI,MJ,
    -
    77  & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP,
    -
    78  & NISKIP,NJSKIP,JCPU,RLAT1,RLON1,DLAT,DLON,
    -
    79  & GRIDI,GM)
    -
    80  REAL GRIDI(*),GM(*)
    -
    81  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    -
    82 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    83 C TRANSFORM INPUT GRID TO WAVE
    -
    84  jc=jcpu
    -
    85  IF(jc.EQ.0) jc=ncpus()
    -
    86  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    -
    87  mdim=2*mx+1
    -
    88  jn=-jskipi
    -
    89  IF(jn.EQ.0) jn=imaxi
    -
    90  js=-jn
    -
    91  inp=(jmaxi-1)*max(0,-jn)+1
    -
    92  isp=(jmaxi-1)*max(0,-js)+1
    -
    93  CALL sptran(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    -
    94  & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    -
    95  & w,gridi(inp),gridi(isp),-1)
    -
    96 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    97 C TRANSFORM WAVE TO OUTPUT
    -
    98  CALL sptgpm(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
    -
    99  & rlat1,rlon1,dlat,dlon,w,gm)
    -
    100 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    101  END
    -
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    -
    subroutine sptgpm(IROMB, MAXWV, KMAX, MI, MJ, KWSKIP, KGSKIP, NISKIP, NJSKIP, RLAT1, RLON1, DLAT, DLON, WAVE, GM)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to sca...
    Definition: sptgpm.f:56
    -
    subroutine sptran(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDN, GRIDS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition: sptran.f:88
    -
    subroutine sptrunm(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, MI, MJ, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, RLAT1, RLON1, DLAT, DLON, GRIDI, GM)
    This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields...
    Definition: sptrunm.f:80
    +Go to the documentation of this file.
    1C> @file
    +
    2C>
    +
    3C> Spectrally interpolate scalars to Mercator
    +
    4C> @author IREDELL @date 96-02-29
    +
    5
    +
    6C> This subprogram spectrally truncates scalar fields on a global
    +
    7C> cylindrical grid, returning the fields to a Mercator grid. The
    +
    8C> wave-space can be either triangular or rhomboidal. The grid-space
    +
    9C> can be either an equally-spaced grid (with or without pole
    +
    10C> points) or a Gaussian grid. The grid fields may have general
    +
    11C> indexing. The transforms are all multiprocessed. Transform
    +
    12C> several fields at a time to improve vectorization. Subprogram can
    +
    13C> be called from a multiprocessing environment.
    +
    14C>
    +
    15C>
    +
    16C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    +
    17C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    +
    18C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    +
    19C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    +
    20C> (IDRTI=4 FOR GAUSSIAN GRID,
    +
    21C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    22C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    +
    23C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    +
    24C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    +
    25C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    +
    26C> @param MI - INTEGER NUMBER OF POINTS IN THE FASTER ZONAL DIRECTION
    +
    27C> @param MJ - INTEGER NUMBER OF POINTS IN THE SLOWER MERID DIRECTION
    +
    28C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    +
    29C> (DEFAULTS TO 1 IF IPRIME=0)
    +
    30C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    +
    31C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    +
    32C> (DEFAULTS TO 1 IF ISKIPI=0)
    +
    33C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    +
    34C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    +
    35C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    +
    36C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    +
    37C> @param KGSKIP - INTEGER SKIP NUMBER BETWEEN GRID FIELDS
    +
    38C> (DEFAULTS TO NPS*NPS IF KGSKIP=0)
    +
    39C> @param NISKIP - INTEGER SKIP NUMBER BETWEEN GRID I-POINTS
    +
    40C> (DEFAULTS TO 1 IF NISKIP=0)
    +
    41C> @param NJSKIP - INTEGER SKIP NUMBER BETWEEN GRID J-POINTS
    +
    42C> (DEFAULTS TO NPS IF NJSKIP=0)
    +
    43C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    +
    44C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    +
    45C> @param RLAT1 - REAL LATITUDE OF THE FIRST GRID POINT IN DEGREES
    +
    46C> @param RLON1 - REAL LONGITUDE OF THE FIRST GRID POINT IN DEGREES
    +
    47C> @param DLAT - REAL LATITUDE INCREMENT IN DEGREES SUCH THAT
    +
    48C> D(PHI)/D(J)=DLAT*COS(PHI) WHERE J IS MERIDIONAL INDEX.
    +
    49C> DLAT IS NEGATIVE FOR GRIDS INDEXED SOUTHWARD.
    +
    50C> (IN TERMS OF GRID INCREMENT DY VALID AT LATITUDE RLATI,
    +
    51C> THE LATITUDE INCREMENT DLAT IS DETERMINED AS
    +
    52C> DLAT=DPR*DY/(RERTH*COS(RLATI/DPR))
    +
    53C> WHERE DPR=180/PI AND RERTH IS EARTH'S RADIUS)
    +
    54C> @param DLON - REAL LONGITUDE INCREMENT IN DEGREES SUCH THAT
    +
    55C> D(LAMBDA)/D(I)=DLON WHERE I IS ZONAL INDEX.
    +
    56C> DLON IS NEGATIVE FOR GRIDS INDEXED WESTWARD.
    +
    57C> @param GRIDI - REAL (*) INPUT GRID FIELDS
    +
    58C> @param GM - REAL (*) MERCATOR FIELDS
    +
    59C>
    +
    60C> SUBPROGRAMS CALLED:
    +
    61C> - sptran() Perform a scalar spherical transform
    +
    62C> - sptgpm() Transform spectral scalar to Mercator
    +
    63C> - ncpus() Gets environment number of cpus
    +
    64C>
    +
    65C> MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:
    +
    66C> DIMENSION |LINEAR |QUADRATIC
    +
    67C> ----------------------- |--------- |-------------
    +
    68C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2
    +
    69C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1
    +
    70C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1
    +
    71C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3
    +
    72C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3
    +
    73C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1
    +
    74C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1
    +
    75C>
    +
    +
    76 SUBROUTINE sptrunm(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,MI,MJ,
    +
    77 & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP,
    +
    78 & NISKIP,NJSKIP,JCPU,RLAT1,RLON1,DLAT,DLON,
    +
    79 & GRIDI,GM)
    +
    80 REAL GRIDI(*),GM(*)
    +
    81 REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    82C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    83C TRANSFORM INPUT GRID TO WAVE
    +
    84 jc=jcpu
    +
    85 IF(jc.EQ.0) jc=ncpus()
    +
    86 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    87 mdim=2*mx+1
    +
    88 jn=-jskipi
    +
    89 IF(jn.EQ.0) jn=imaxi
    +
    90 js=-jn
    +
    91 inp=(jmaxi-1)*max(0,-jn)+1
    +
    92 isp=(jmaxi-1)*max(0,-js)+1
    +
    93 CALL sptran(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    +
    94 & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    +
    95 & w,gridi(inp),gridi(isp),-1)
    +
    96C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    97C TRANSFORM WAVE TO OUTPUT
    +
    98 CALL sptgpm(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
    +
    99 & rlat1,rlon1,dlat,dlon,w,gm)
    +
    100C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    +
    101 END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition ncpus.F:22
    +
    subroutine sptgpm(iromb, maxwv, kmax, mi, mj, kwskip, kgskip, niskip, njskip, rlat1, rlon1, dlat, dlon, wave, gm)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to sca...
    Definition sptgpm.f:56
    +
    subroutine sptran(iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, wave, gridn, grids, idir)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition sptran.f:88
    +
    subroutine sptrunm(iromb, maxwv, idrti, imaxi, jmaxi, kmax, mi, mj, iprime, iskipi, jskipi, kskipi, kgskip, niskip, njskip, jcpu, rlat1, rlon1, dlat, dlon, gridi, gm)
    This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields...
    Definition sptrunm.f:80
    diff --git a/sptrunmv_8f.html b/sptrunmv_8f.html index 33407bf7..1a1c1223 100644 --- a/sptrunmv_8f.html +++ b/sptrunmv_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptrunmv.f File Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@
    @@ -76,16 +76,22 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    sptrunmv.f File Reference
    +
    sptrunmv.f File Reference
    @@ -94,11 +100,11 @@

    Go to the source code of this file.

    - - - - + + +

    +

    Functions/Subroutines

    subroutine sptrunmv (IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, MI, MJ, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, RLAT1, RLON1, DLAT, DLON, GRIDUI, GRIDVI, LUV, UM, VM, LDZ, DM, ZM, LPS, PM, SM)
     THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTOR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELDS TO A MERCATOR GRID. More...
     
    subroutine sptrunmv (iromb, maxwv, idrti, imaxi, jmaxi, kmax, mi, mj, iprime, iskipi, jskipi, kskipi, kgskip, niskip, njskip, jcpu, rlat1, rlon1, dlat, dlon, gridui, gridvi, luv, um, vm, ldz, dm, zm, lps, pm, sm)
     THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTOR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELDS TO A MERCATOR GRID.
     

    Detailed Description

    Spectrally interpolate vectors to Mercator.

    @@ -107,8 +113,8 @@

    Definition in file sptrunmv.f.

    Function/Subroutine Documentation

    - -

    ◆ sptrunmv()

    + +

    ◆ sptrunmv()

    diff --git a/sptrunmv_8f.js b/sptrunmv_8f.js index 68c3d828..59e83ea2 100644 --- a/sptrunmv_8f.js +++ b/sptrunmv_8f.js @@ -1,4 +1,4 @@ var sptrunmv_8f = [ - [ "sptrunmv", "sptrunmv_8f.html#a8b405d0621112d6852a3bb99602ac2fd", null ] + [ "sptrunmv", "sptrunmv_8f.html#a41037888bc1641912a21d810df5d4d1c", null ] ]; \ No newline at end of file diff --git a/sptrunmv_8f_source.html b/sptrunmv_8f_source.html index ecd958df..67353318 100644 --- a/sptrunmv_8f_source.html +++ b/sptrunmv_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptrunmv.f Source File @@ -23,10 +23,9 @@
    - - + @@ -34,22 +33,28 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ + +
    @@ -76,182 +81,190 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    sptrunmv.f
    +
    sptrunmv.f
    -Go to the documentation of this file.
    1 C> @file
    -
    2 C>
    -
    3 C> Spectrally interpolate vectors to Mercator
    -
    4 C> @author IREDELL @date 96-02-29
    -
    5 
    -
    6 C> THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTOR FIELDS
    -
    7 C> ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELDS
    -
    8 C> TO A MERCATOR GRID.
    -
    9 C> THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL.
    -
    10 C> THE GRID-SPACE CAN BE EITHER AN EQUALLY-SPACED GRID
    -
    11 C> (WITH OR WITHOUT POLE POINTS) OR A GAUSSIAN GRID.
    -
    12 C> THE GRID FIELDS MAY HAVE GENERAL INDEXING.
    -
    13 C> THE TRANSFORMS ARE ALL MULTIPROCESSED.
    -
    14 C> TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION.
    -
    15 C> SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
    -
    16 C>
    -
    17 C> PROGRAM HISTORY LOG:
    -
    18 C> 96-02-29 IREDELL
    -
    19 C> 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED
    -
    20 C>
    -
    21 C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    -
    22 C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    -
    23 C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    -
    24 C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    -
    25 C> (IDRTI=4 FOR GAUSSIAN GRID,
    -
    26 C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    -
    27 C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    -
    28 C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    -
    29 C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    -
    30 C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    -
    31 C> @param MI - INTEGER NUMBER OF POINTS IN THE FASTER ZONAL DIRECTION
    -
    32 C> @param MJ - INTEGER NUMBER OF POINTS IN THE SLOWER MERID DIRECTION
    -
    33 C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    -
    34 C> (DEFAULTS TO 1 IF IPRIME=0)
    -
    35 C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    -
    36 C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    -
    37 C> (DEFAULTS TO 1 IF ISKIPI=0)
    -
    38 C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    -
    39 C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    -
    40 C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    -
    41 C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    -
    42 C> @param KGSKIP - INTEGER SKIP NUMBER BETWEEN GRID FIELDS
    -
    43 C> (DEFAULTS TO MI*MJ IF KGSKIP=0)
    -
    44 C> @param NISKIP - INTEGER SKIP NUMBER BETWEEN GRID I-POINTS
    -
    45 C> (DEFAULTS TO 1 IF NISKIP=0)
    -
    46 C> @param NJSKIP - INTEGER SKIP NUMBER BETWEEN GRID J-POINTS
    -
    47 C> (DEFAULTS TO MI IF NJSKIP=0)
    -
    48 C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    -
    49 C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    -
    50 C> @param RLAT1 - REAL LATITUDE OF THE FIRST GRID POINT IN DEGREES
    -
    51 C> @param RLON1 - REAL LONGITUDE OF THE FIRST GRID POINT IN DEGREES
    -
    52 C> @param DLAT - REAL LATITUDE INCREMENT IN DEGREES SUCH THAT
    -
    53 C> D(PHI)/D(J)=DLAT*COS(PHI) WHERE J IS MERIDIONAL INDEX.
    -
    54 C> DLAT IS NEGATIVE FOR GRIDS INDEXED SOUTHWARD.
    -
    55 C> (IN TERMS OF GRID INCREMENT DY VALID AT LATITUDE RLATI,
    -
    56 C> THE LATITUDE INCREMENT DLAT IS DETERMINED AS
    -
    57 C> DLAT=DPR*DY/(RERTH*COS(RLATI/DPR))
    -
    58 C> WHERE DPR=180/PI AND RERTH IS EARTH'S RADIUS)
    -
    59 C> @param DLON - REAL LONGITUDE INCREMENT IN DEGREES SUCH THAT
    -
    60 C> D(LAMBDA)/D(I)=DLON WHERE I IS ZONAL INDEX.
    -
    61 C> DLON IS NEGATIVE FOR GRIDS INDEXED WESTWARD.
    -
    62 C> @param GRIDUI - REAL (*) INPUT GRID U-WINDS
    -
    63 C> @param GRIDVI - REAL (*) INPUT GRID V-WINDS
    -
    64 C> @param LUV - LOGICAL FLAG WHETHER TO RETURN WINDS
    -
    65 C> @param LDZ - LOGICAL FLAG WHETHER TO RETURN DIVERGENCE AND VORTICITY
    -
    66 C> @param LPS - LOGICAL FLAG WHETHER TO RETURN POTENTIAL AND STREAMFCN
    -
    67 C> @param UM - REAL (*) MERCATOR U-WINDS IF LUV
    -
    68 C> @param VM - REAL (*) MERCATOR V-WINDS IF LUV
    -
    69 C> @param DM - REAL (*) MERCATOR DIVERGENCES IF LDZ
    -
    70 C> @param ZM - REAL (*) MERCATOR VORTICITIES IF LDZ
    -
    71 C> @param PM - REAL (*) MERCATOR POTENTIALS IF LPS
    -
    72 C> @param SM - REAL (*) MERCATOR STREAMFCNS IF LPS
    -
    73 C>
    -
    74 C> SUBPROGRAMS CALLED:
    -
    75 C> - SPWGET GET WAVE-SPACE CONSTANTS
    -
    76 C> - SPLAPLAC COMPUTE LAPLACIAN IN SPECTRAL SPACE
    -
    77 C> - SPTRANV PERFORM A VECTOR SPHERICAL TRANSFORM
    -
    78 C> - SPTGPM TRANSFORM SPECTRAL SCALAR TO MERCATOR
    -
    79 C> - SPTGPMV TRANSFORM SPECTRAL VECTOR TO MERCATOR
    -
    80 C> - NCPUS GETS ENVIRONMENT NUMBER OF CPUS
    -
    81 C>
    -
    82 C> REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:
    -
    83 C> DIMENSION |LINEAR |QUADRATIC
    -
    84 C> ----------------------- |--------- |-------------
    -
    85 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    -
    86 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    -
    87 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    -
    88 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    -
    89 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    -
    90 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    -
    91 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    -
    92  SUBROUTINE sptrunmv(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,MI,MJ,
    -
    93  & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP,
    -
    94  & NISKIP,NJSKIP,JCPU,RLAT1,RLON1,DLAT,DLON,
    -
    95  & GRIDUI,GRIDVI,LUV,UM,VM,LDZ,DM,ZM,LPS,PM,SM)
    -
    96 
    -
    97  LOGICAL LUV,LDZ,LPS
    -
    98  REAL GRIDUI(*),GRIDVI(*)
    -
    99  REAL UM(*),VM(*),DM(*),ZM(*),PM(*),SM(*)
    -
    100  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    -
    101  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    -
    102  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    -
    103  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    -
    104  REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    -
    105  REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    -
    106 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    107 C TRANSFORM INPUT GRID TO WAVE
    -
    108  jc=jcpu
    -
    109  IF(jc.EQ.0) jc=ncpus()
    -
    110  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    -
    111  mdim=2*mx+1
    -
    112  jn=-jskipi
    -
    113  IF(jn.EQ.0) jn=imaxi
    -
    114  js=-jn
    -
    115  inp=(jmaxi-1)*max(0,-jn)+1
    -
    116  isp=(jmaxi-1)*max(0,-js)+1
    -
    117  CALL sptranv(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    -
    118  & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    -
    119  & wd,wz,
    -
    120  & gridui(inp),gridui(isp),gridvi(inp),gridvi(isp),-1)
    -
    121 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    122 C TRANSFORM WAVE TO OUTPUT WINDS
    -
    123  IF(luv) THEN
    -
    124  CALL sptgpmv(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
    -
    125  & rlat1,rlon1,dlat,dlon,wd,wz,um,vm)
    -
    126  ENDIF
    -
    127 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    128 C TRANSFORM WAVE TO OUTPUT DIVERGENCE AND VORTICITY
    -
    129  IF(ldz) THEN
    -
    130  CALL sptgpm(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
    -
    131  & rlat1,rlon1,dlat,dlon,wd,dm)
    -
    132  CALL sptgpm(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
    -
    133  & rlat1,rlon1,dlat,dlon,wz,zm)
    -
    134  ENDIF
    -
    135 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    136 C TRANSFORM WAVE TO OUTPUT POTENTIAL AND STREAMFUNCTION
    -
    137  IF(lps) THEN
    -
    138  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    -
    139 C$OMP PARALLEL DO
    -
    140  DO k=1,kmax
    -
    141  CALL splaplac(iromb,maxwv,enn1,wd(1,k),wd(1,k),-1)
    -
    142  CALL splaplac(iromb,maxwv,enn1,wz(1,k),wz(1,k),-1)
    -
    143  wd(1:2,k)=0.
    -
    144  wz(1:2,k)=0.
    -
    145  ENDDO
    -
    146  CALL sptgpm(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
    -
    147  & rlat1,rlon1,dlat,dlon,wd,pm)
    -
    148  CALL sptgpm(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
    -
    149  & rlat1,rlon1,dlat,dlon,wz,sm)
    -
    150  ENDIF
    -
    151 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    152  END
    -
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    -
    subroutine splaplac(I, M, ENN1, Q, QD2, IDIR)
    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
    Definition: splaplac.f:25
    -
    subroutine sptgpm(IROMB, MAXWV, KMAX, MI, MJ, KWSKIP, KGSKIP, NISKIP, NJSKIP, RLAT1, RLON1, DLAT, DLON, WAVE, GM)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to sca...
    Definition: sptgpm.f:56
    -
    subroutine sptgpmv(IROMB, MAXWV, KMAX, MI, MJ, KWSKIP, KGSKIP, NISKIP, NJSKIP, RLAT1, RLON1, DLAT, DLON, WAVED, WAVEZ, UM, VM)
    This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
    Definition: sptgpmv.f:63
    -
    subroutine sptranv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
    Definition: sptranv.f:91
    -
    subroutine sptrunmv(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, MI, MJ, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, RLAT1, RLON1, DLAT, DLON, GRIDUI, GRIDVI, LUV, UM, VM, LDZ, DM, ZM, LPS, PM, SM)
    THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTOR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELDS...
    Definition: sptrunmv.f:96
    -
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +Go to the documentation of this file.
    1C> @file
    +
    2C>
    +
    3C> Spectrally interpolate vectors to Mercator
    +
    4C> @author IREDELL @date 96-02-29
    +
    5
    +
    6C> THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTOR FIELDS
    +
    7C> ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELDS
    +
    8C> TO A MERCATOR GRID.
    +
    9C> THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL.
    +
    10C> THE GRID-SPACE CAN BE EITHER AN EQUALLY-SPACED GRID
    +
    11C> (WITH OR WITHOUT POLE POINTS) OR A GAUSSIAN GRID.
    +
    12C> THE GRID FIELDS MAY HAVE GENERAL INDEXING.
    +
    13C> THE TRANSFORMS ARE ALL MULTIPROCESSED.
    +
    14C> TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION.
    +
    15C> SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
    +
    16C>
    +
    17C> PROGRAM HISTORY LOG:
    +
    18C> 96-02-29 IREDELL
    +
    19C> 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED
    +
    20C>
    +
    21C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    +
    22C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    +
    23C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    +
    24C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    +
    25C> (IDRTI=4 FOR GAUSSIAN GRID,
    +
    26C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    27C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    +
    28C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    +
    29C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    +
    30C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    +
    31C> @param MI - INTEGER NUMBER OF POINTS IN THE FASTER ZONAL DIRECTION
    +
    32C> @param MJ - INTEGER NUMBER OF POINTS IN THE SLOWER MERID DIRECTION
    +
    33C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    +
    34C> (DEFAULTS TO 1 IF IPRIME=0)
    +
    35C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    +
    36C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    +
    37C> (DEFAULTS TO 1 IF ISKIPI=0)
    +
    38C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    +
    39C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    +
    40C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    +
    41C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    +
    42C> @param KGSKIP - INTEGER SKIP NUMBER BETWEEN GRID FIELDS
    +
    43C> (DEFAULTS TO MI*MJ IF KGSKIP=0)
    +
    44C> @param NISKIP - INTEGER SKIP NUMBER BETWEEN GRID I-POINTS
    +
    45C> (DEFAULTS TO 1 IF NISKIP=0)
    +
    46C> @param NJSKIP - INTEGER SKIP NUMBER BETWEEN GRID J-POINTS
    +
    47C> (DEFAULTS TO MI IF NJSKIP=0)
    +
    48C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    +
    49C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    +
    50C> @param RLAT1 - REAL LATITUDE OF THE FIRST GRID POINT IN DEGREES
    +
    51C> @param RLON1 - REAL LONGITUDE OF THE FIRST GRID POINT IN DEGREES
    +
    52C> @param DLAT - REAL LATITUDE INCREMENT IN DEGREES SUCH THAT
    +
    53C> D(PHI)/D(J)=DLAT*COS(PHI) WHERE J IS MERIDIONAL INDEX.
    +
    54C> DLAT IS NEGATIVE FOR GRIDS INDEXED SOUTHWARD.
    +
    55C> (IN TERMS OF GRID INCREMENT DY VALID AT LATITUDE RLATI,
    +
    56C> THE LATITUDE INCREMENT DLAT IS DETERMINED AS
    +
    57C> DLAT=DPR*DY/(RERTH*COS(RLATI/DPR))
    +
    58C> WHERE DPR=180/PI AND RERTH IS EARTH'S RADIUS)
    +
    59C> @param DLON - REAL LONGITUDE INCREMENT IN DEGREES SUCH THAT
    +
    60C> D(LAMBDA)/D(I)=DLON WHERE I IS ZONAL INDEX.
    +
    61C> DLON IS NEGATIVE FOR GRIDS INDEXED WESTWARD.
    +
    62C> @param GRIDUI - REAL (*) INPUT GRID U-WINDS
    +
    63C> @param GRIDVI - REAL (*) INPUT GRID V-WINDS
    +
    64C> @param LUV - LOGICAL FLAG WHETHER TO RETURN WINDS
    +
    65C> @param LDZ - LOGICAL FLAG WHETHER TO RETURN DIVERGENCE AND VORTICITY
    +
    66C> @param LPS - LOGICAL FLAG WHETHER TO RETURN POTENTIAL AND STREAMFCN
    +
    67C> @param UM - REAL (*) MERCATOR U-WINDS IF LUV
    +
    68C> @param VM - REAL (*) MERCATOR V-WINDS IF LUV
    +
    69C> @param DM - REAL (*) MERCATOR DIVERGENCES IF LDZ
    +
    70C> @param ZM - REAL (*) MERCATOR VORTICITIES IF LDZ
    +
    71C> @param PM - REAL (*) MERCATOR POTENTIALS IF LPS
    +
    72C> @param SM - REAL (*) MERCATOR STREAMFCNS IF LPS
    +
    73C>
    +
    74C> SUBPROGRAMS CALLED:
    +
    75C> - SPWGET GET WAVE-SPACE CONSTANTS
    +
    76C> - SPLAPLAC COMPUTE LAPLACIAN IN SPECTRAL SPACE
    +
    77C> - SPTRANV PERFORM A VECTOR SPHERICAL TRANSFORM
    +
    78C> - SPTGPM TRANSFORM SPECTRAL SCALAR TO MERCATOR
    +
    79C> - SPTGPMV TRANSFORM SPECTRAL VECTOR TO MERCATOR
    +
    80C> - NCPUS GETS ENVIRONMENT NUMBER OF CPUS
    +
    81C>
    +
    82C> REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:
    +
    83C> DIMENSION |LINEAR |QUADRATIC
    +
    84C> ----------------------- |--------- |-------------
    +
    85C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    +
    86C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    +
    87C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    +
    88C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    +
    89C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    +
    90C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    +
    91C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    +
    +
    92 SUBROUTINE sptrunmv(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,MI,MJ,
    +
    93 & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP,
    +
    94 & NISKIP,NJSKIP,JCPU,RLAT1,RLON1,DLAT,DLON,
    +
    95 & GRIDUI,GRIDVI,LUV,UM,VM,LDZ,DM,ZM,LPS,PM,SM)
    +
    96
    +
    97 LOGICAL LUV,LDZ,LPS
    +
    98 REAL GRIDUI(*),GRIDVI(*)
    +
    99 REAL UM(*),VM(*),DM(*),ZM(*),PM(*),SM(*)
    +
    100 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    101 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    102 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    103 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    104 REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    105 REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    106C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    107C TRANSFORM INPUT GRID TO WAVE
    +
    108 jc=jcpu
    +
    109 IF(jc.EQ.0) jc=ncpus()
    +
    110 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    111 mdim=2*mx+1
    +
    112 jn=-jskipi
    +
    113 IF(jn.EQ.0) jn=imaxi
    +
    114 js=-jn
    +
    115 inp=(jmaxi-1)*max(0,-jn)+1
    +
    116 isp=(jmaxi-1)*max(0,-js)+1
    +
    117 CALL sptranv(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    +
    118 & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    +
    119 & wd,wz,
    +
    120 & gridui(inp),gridui(isp),gridvi(inp),gridvi(isp),-1)
    +
    121C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    122C TRANSFORM WAVE TO OUTPUT WINDS
    +
    123 IF(luv) THEN
    +
    124 CALL sptgpmv(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
    +
    125 & rlat1,rlon1,dlat,dlon,wd,wz,um,vm)
    +
    126 ENDIF
    +
    127C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    128C TRANSFORM WAVE TO OUTPUT DIVERGENCE AND VORTICITY
    +
    129 IF(ldz) THEN
    +
    130 CALL sptgpm(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
    +
    131 & rlat1,rlon1,dlat,dlon,wd,dm)
    +
    132 CALL sptgpm(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
    +
    133 & rlat1,rlon1,dlat,dlon,wz,zm)
    +
    134 ENDIF
    +
    135C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    136C TRANSFORM WAVE TO OUTPUT POTENTIAL AND STREAMFUNCTION
    +
    137 IF(lps) THEN
    +
    138 CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    139C$OMP PARALLEL DO
    +
    140 DO k=1,kmax
    +
    141 CALL splaplac(iromb,maxwv,enn1,wd(1,k),wd(1,k),-1)
    +
    142 CALL splaplac(iromb,maxwv,enn1,wz(1,k),wz(1,k),-1)
    +
    143 wd(1:2,k)=0.
    +
    144 wz(1:2,k)=0.
    +
    145 ENDDO
    +
    146 CALL sptgpm(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
    +
    147 & rlat1,rlon1,dlat,dlon,wd,pm)
    +
    148 CALL sptgpm(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
    +
    149 & rlat1,rlon1,dlat,dlon,wz,sm)
    +
    150 ENDIF
    +
    151C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    +
    152 END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition ncpus.F:22
    +
    subroutine splaplac(i, m, enn1, q, qd2, idir)
    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
    Definition splaplac.f:25
    +
    subroutine sptgpm(iromb, maxwv, kmax, mi, mj, kwskip, kgskip, niskip, njskip, rlat1, rlon1, dlat, dlon, wave, gm)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to sca...
    Definition sptgpm.f:56
    +
    subroutine sptgpmv(iromb, maxwv, kmax, mi, mj, kwskip, kgskip, niskip, njskip, rlat1, rlon1, dlat, dlon, waved, wavez, um, vm)
    This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
    Definition sptgpmv.f:63
    +
    subroutine sptranv(iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, waved, wavez, gridun, gridus, gridvn, gridvs, idir)
    This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
    Definition sptranv.f:91
    +
    subroutine sptrunmv(iromb, maxwv, idrti, imaxi, jmaxi, kmax, mi, mj, iprime, iskipi, jskipi, kskipi, kgskip, niskip, njskip, jcpu, rlat1, rlon1, dlat, dlon, gridui, gridvi, luv, um, vm, ldz, dm, zm, lps, pm, sm)
    THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTOR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELDS...
    Definition sptrunmv.f:96
    +
    subroutine spwget(iromb, maxwv, eps, epstop, enn1, elonn1, eon, eontop)
    This subprogram gets wave-space constants.
    Definition spwget.f:18
    diff --git a/sptruns_8f.html b/sptruns_8f.html index 8491dd6d..5f24bf02 100644 --- a/sptruns_8f.html +++ b/sptruns_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptruns.f File Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@
    @@ -76,16 +76,22 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    sptruns.f File Reference
    +
    sptruns.f File Reference
    @@ -94,11 +100,11 @@

    Go to the source code of this file.

    - - - - + + +

    +

    Functions/Subroutines

    subroutine sptruns (IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NPS, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, TRUE, XMESH, ORIENT, GRIDI, GN, GS)
     This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields to specific pairs of polar stereographic scalar fields. More...
     
    subroutine sptruns (iromb, maxwv, idrti, imaxi, jmaxi, kmax, nps, iprime, iskipi, jskipi, kskipi, kgskip, niskip, njskip, jcpu, true, xmesh, orient, gridi, gn, gs)
     This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields to specific pairs of polar stereographic scalar fields.
     

    Detailed Description

    Spectrally interpolate scalars to polar stereo.

    @@ -107,8 +113,8 @@

    Definition in file sptruns.f.

    Function/Subroutine Documentation

    - -

    ◆ sptruns()

    + +

    ◆ sptruns()

    @@ -117,127 +123,127 @@

    subroutine sptruns (   - IROMB, + iromb,   - MAXWV, + maxwv,   - IDRTI, + idrti,   - IMAXI, + imaxi,   - JMAXI, + jmaxi,   - KMAX, + kmax,   - NPS, + nps,   - IPRIME, + iprime,   - ISKIPI, + iskipi,   - JSKIPI, + jskipi,   - KSKIPI, + kskipi,   - KGSKIP, + kgskip,   - NISKIP, + niskip,   - NJSKIP, + njskip,   - JCPU, + jcpu,   - TRUE, + true,   - XMESH, + xmesh,   - ORIENT, + orient, real, dimension(*)  - GRIDI, + gridi, real, dimension(*)  - GN, + gn, real, dimension(*)  - GS  + gs  @@ -277,8 +283,8 @@

    sptran() Perform a scalar spherical transform -
  • sptgps() Transform spectral scalar to polar stereo.
  • +
  • sptran() Perform a scalar spherical transform
  • +
  • sptgps() Transform spectral scalar to polar stereo.
  • ncpus() Gets environment number of cpus
  • Minimum grid dimensions for unaliased transforms to spectral:

    @@ -302,7 +308,7 @@

    Definition at line 71 of file sptruns.f.

    -

    References ncpus(), sptgps(), and sptran().

    +

    References ncpus(), sptgps(), and sptran().

    Referenced by spectral_interp_mod::polates4::polates4_grib1(), and spectral_interp_mod::polates4::polates4_grib2().

    @@ -314,7 +320,7 @@

    diff --git a/sptruns_8f.js b/sptruns_8f.js index cc546092..32d5b3a9 100644 --- a/sptruns_8f.js +++ b/sptruns_8f.js @@ -1,4 +1,4 @@ var sptruns_8f = [ - [ "sptruns", "sptruns_8f.html#a34f156e2049105d012e445f8aa215444", null ] + [ "sptruns", "sptruns_8f.html#aa9b383d3b480b774eaf56de03ca39339", null ] ]; \ No newline at end of file diff --git a/sptruns_8f_source.html b/sptruns_8f_source.html index 58997ed2..dda99f61 100644 --- a/sptruns_8f_source.html +++ b/sptruns_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptruns.f Source File @@ -23,10 +23,9 @@

    - - + @@ -34,22 +33,28 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0

    - + +/* @license-end */ + +
    @@ -76,123 +81,131 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    sptruns.f
    +
    sptruns.f
    -Go to the documentation of this file.
    1 C> @file
    -
    2 C>
    -
    3 C> Spectrally interpolate scalars to polar stereo
    -
    4 C> @author IREDELL @date 96-02-29
    -
    5 
    -
    6 C> This subprogram spectrally truncates scalar fields on a global
    -
    7 C> cylindrical grid, returning the fields to specific pairs of polar
    -
    8 C> stereographic scalar fields. The wave-space can be either
    -
    9 C> triangular or rhomboidal. The grid-space can be either an
    -
    10 C> equally-spaced grid (with or without pole points) or a Gaussian
    -
    11 C> grid. The grid fields may have general indexing. The transforms
    -
    12 C> are all multiprocessed. Transform several fields at a time to
    -
    13 C> improve vectorization. Subprogram can be called from a
    -
    14 C> multiprocessing environment.
    -
    15 C>
    -
    16 C> PROGRAM HISTORY LOG:
    -
    17 C> 96-02-29 IREDELL
    -
    18 C>
    -
    19 C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    -
    20 C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    -
    21 C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    -
    22 C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    -
    23 C> (IDRTI=4 FOR GAUSSIAN GRID,
    -
    24 C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    -
    25 C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    -
    26 C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    -
    27 C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    -
    28 C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    -
    29 C> @param NPS - INTEGER ODD ORDER OF THE POLAR STEREOGRAPHIC GRIDS
    -
    30 C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    -
    31 C> (DEFAULTS TO 1 IF IPRIME=0)
    -
    32 C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    -
    33 C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    -
    34 C> (DEFAULTS TO 1 IF ISKIPI=0)
    -
    35 C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    -
    36 C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    -
    37 C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    -
    38 C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    -
    39 C> @param KGSKIP - INTEGER SKIP NUMBER BETWEEN GRID FIELDS
    -
    40 C> (DEFAULTS TO NPS*NPS IF KGSKIP=0)
    -
    41 C> @param NISKIP - INTEGER SKIP NUMBER BETWEEN GRID I-POINTS
    -
    42 C> (DEFAULTS TO 1 IF NISKIP=0)
    -
    43 C> @param NJSKIP - INTEGER SKIP NUMBER BETWEEN GRID J-POINTS
    -
    44 C> (DEFAULTS TO NPS IF NJSKIP=0)
    -
    45 C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    -
    46 C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    -
    47 C> @param TRUE - REAL LATITUDE AT WHICH PS GRID IS TRUE (USUALLY 60.)
    -
    48 C> @param XMESH - REAL GRID LENGTH AT TRUE LATITUDE (M)
    -
    49 C> @param ORIENT - REAL LONGITUDE AT BOTTOM OF NORTHERN PS GRID
    -
    50 C> (SOUTHERN PS GRID WILL HAVE OPPOSITE ORIENTATION.)
    -
    51 C> @param GRIDI - REAL (*) INPUT GRID FIELDS
    -
    52 C> @param GN - REAL (*) NORTHERN POLAR STEREOGRAPHIC FIELDS
    -
    53 C> @param GS - REAL (*) SOUTHERN POLAR STEREOGRAPHIC FIELDS
    -
    54 C>
    -
    55 C> SUBPROGRAMS CALLED:
    -
    56 C> - sptran() Perform a scalar spherical transform
    -
    57 C> - sptgps() Transform spectral scalar to polar stereo.
    -
    58 C> - ncpus() Gets environment number of cpus
    -
    59 C>
    -
    60 C> Minimum grid dimensions for unaliased transforms to spectral:
    -
    61 C> DIMENSION | LINEAR | QUADRATIC
    -
    62 C> ----------------------- | --------- | -------------
    -
    63 C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2
    -
    64 C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1
    -
    65 C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1
    -
    66 C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3
    -
    67 C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3
    -
    68 C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1
    -
    69 C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1
    -
    70 C>
    -
    71  SUBROUTINE sptruns(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,NPS,
    -
    72  & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP,
    -
    73  & NISKIP,NJSKIP,JCPU,TRUE,XMESH,ORIENT,
    -
    74  & GRIDI,GN,GS)
    -
    75  REAL GRIDI(*),GN(*),GS(*)
    -
    76  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    -
    77 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    78 C TRANSFORM INPUT GRID TO WAVE
    -
    79  jc=jcpu
    -
    80  IF(jc.EQ.0) jc=ncpus()
    -
    81  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    -
    82  mdim=2*mx+1
    -
    83  jn=-jskipi
    -
    84  IF(jn.EQ.0) jn=imaxi
    -
    85  js=-jn
    -
    86  inp=(jmaxi-1)*max(0,-jn)+1
    -
    87  isp=(jmaxi-1)*max(0,-js)+1
    -
    88  CALL sptran(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    -
    89  & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    -
    90  & w,gridi(inp),gridi(isp),-1)
    -
    91 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    92 C TRANSFORM WAVE TO OUTPUT
    -
    93  CALL sptgps(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
    -
    94  & true,xmesh,orient,w,gn,gs)
    -
    95 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    96  END
    -
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    -
    subroutine sptgps(IROMB, MAXWV, KMAX, NPS, KWSKIP, KGSKIP, NISKIP, NJSKIP, TRUE, XMESH, ORIENT, WAVE, GN, GS)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to sca...
    Definition: sptgps.f:81
    -
    subroutine sptran(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDN, GRIDS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition: sptran.f:88
    -
    subroutine sptruns(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NPS, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, TRUE, XMESH, ORIENT, GRIDI, GN, GS)
    This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields...
    Definition: sptruns.f:75
    +Go to the documentation of this file.
    1C> @file
    +
    2C>
    +
    3C> Spectrally interpolate scalars to polar stereo
    +
    4C> @author IREDELL @date 96-02-29
    +
    5
    +
    6C> This subprogram spectrally truncates scalar fields on a global
    +
    7C> cylindrical grid, returning the fields to specific pairs of polar
    +
    8C> stereographic scalar fields. The wave-space can be either
    +
    9C> triangular or rhomboidal. The grid-space can be either an
    +
    10C> equally-spaced grid (with or without pole points) or a Gaussian
    +
    11C> grid. The grid fields may have general indexing. The transforms
    +
    12C> are all multiprocessed. Transform several fields at a time to
    +
    13C> improve vectorization. Subprogram can be called from a
    +
    14C> multiprocessing environment.
    +
    15C>
    +
    16C> PROGRAM HISTORY LOG:
    +
    17C> 96-02-29 IREDELL
    +
    18C>
    +
    19C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    +
    20C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    +
    21C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    +
    22C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    +
    23C> (IDRTI=4 FOR GAUSSIAN GRID,
    +
    24C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    25C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    +
    26C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    +
    27C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    +
    28C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    +
    29C> @param NPS - INTEGER ODD ORDER OF THE POLAR STEREOGRAPHIC GRIDS
    +
    30C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    +
    31C> (DEFAULTS TO 1 IF IPRIME=0)
    +
    32C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    +
    33C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    +
    34C> (DEFAULTS TO 1 IF ISKIPI=0)
    +
    35C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    +
    36C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    +
    37C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    +
    38C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    +
    39C> @param KGSKIP - INTEGER SKIP NUMBER BETWEEN GRID FIELDS
    +
    40C> (DEFAULTS TO NPS*NPS IF KGSKIP=0)
    +
    41C> @param NISKIP - INTEGER SKIP NUMBER BETWEEN GRID I-POINTS
    +
    42C> (DEFAULTS TO 1 IF NISKIP=0)
    +
    43C> @param NJSKIP - INTEGER SKIP NUMBER BETWEEN GRID J-POINTS
    +
    44C> (DEFAULTS TO NPS IF NJSKIP=0)
    +
    45C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    +
    46C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    +
    47C> @param TRUE - REAL LATITUDE AT WHICH PS GRID IS TRUE (USUALLY 60.)
    +
    48C> @param XMESH - REAL GRID LENGTH AT TRUE LATITUDE (M)
    +
    49C> @param ORIENT - REAL LONGITUDE AT BOTTOM OF NORTHERN PS GRID
    +
    50C> (SOUTHERN PS GRID WILL HAVE OPPOSITE ORIENTATION.)
    +
    51C> @param GRIDI - REAL (*) INPUT GRID FIELDS
    +
    52C> @param GN - REAL (*) NORTHERN POLAR STEREOGRAPHIC FIELDS
    +
    53C> @param GS - REAL (*) SOUTHERN POLAR STEREOGRAPHIC FIELDS
    +
    54C>
    +
    55C> SUBPROGRAMS CALLED:
    +
    56C> - sptran() Perform a scalar spherical transform
    +
    57C> - sptgps() Transform spectral scalar to polar stereo.
    +
    58C> - ncpus() Gets environment number of cpus
    +
    59C>
    +
    60C> Minimum grid dimensions for unaliased transforms to spectral:
    +
    61C> DIMENSION | LINEAR | QUADRATIC
    +
    62C> ----------------------- | --------- | -------------
    +
    63C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2
    +
    64C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1
    +
    65C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1
    +
    66C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3
    +
    67C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3
    +
    68C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1
    +
    69C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1
    +
    70C>
    +
    +
    71 SUBROUTINE sptruns(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,NPS,
    +
    72 & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP,
    +
    73 & NISKIP,NJSKIP,JCPU,TRUE,XMESH,ORIENT,
    +
    74 & GRIDI,GN,GS)
    +
    75 REAL GRIDI(*),GN(*),GS(*)
    +
    76 REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    77C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    78C TRANSFORM INPUT GRID TO WAVE
    +
    79 jc=jcpu
    +
    80 IF(jc.EQ.0) jc=ncpus()
    +
    81 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    82 mdim=2*mx+1
    +
    83 jn=-jskipi
    +
    84 IF(jn.EQ.0) jn=imaxi
    +
    85 js=-jn
    +
    86 inp=(jmaxi-1)*max(0,-jn)+1
    +
    87 isp=(jmaxi-1)*max(0,-js)+1
    +
    88 CALL sptran(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    +
    89 & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    +
    90 & w,gridi(inp),gridi(isp),-1)
    +
    91C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    92C TRANSFORM WAVE TO OUTPUT
    +
    93 CALL sptgps(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
    +
    94 & true,xmesh,orient,w,gn,gs)
    +
    95C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    +
    96 END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition ncpus.F:22
    +
    subroutine sptgps(iromb, maxwv, kmax, nps, kwskip, kgskip, niskip, njskip, true, xmesh, orient, wave, gn, gs)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to sca...
    Definition sptgps.f:81
    +
    subroutine sptran(iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, wave, gridn, grids, idir)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition sptran.f:88
    +
    subroutine sptruns(iromb, maxwv, idrti, imaxi, jmaxi, kmax, nps, iprime, iskipi, jskipi, kskipi, kgskip, niskip, njskip, jcpu, true, xmesh, orient, gridi, gn, gs)
    This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields...
    Definition sptruns.f:75
    diff --git a/sptrunsv_8f.html b/sptrunsv_8f.html index eada62f8..7deae4b5 100644 --- a/sptrunsv_8f.html +++ b/sptrunsv_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptrunsv.f File Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@
    @@ -76,16 +76,22 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    sptrunsv.f File Reference
    +
    sptrunsv.f File Reference
    @@ -94,11 +100,11 @@

    Go to the source code of this file.

    - - - - + + +

    +

    Functions/Subroutines

    subroutine sptrunsv (IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NPS, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, TRUE, XMESH, ORIENT, GRIDUI, GRIDVI, LUV, UN, VN, US, VS, LDZ, DN, ZN, DS, ZS, LPS, PN, SN, PS, SS)
     This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields to specific pairs of polar stereographic scalar fields. More...
     
    subroutine sptrunsv (iromb, maxwv, idrti, imaxi, jmaxi, kmax, nps, iprime, iskipi, jskipi, kskipi, kgskip, niskip, njskip, jcpu, true, xmesh, orient, gridui, gridvi, luv, un, vn, us, vs, ldz, dn, zn, ds, zs, lps, pn, sn, ps, ss)
     This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields to specific pairs of polar stereographic scalar fields.
     

    Detailed Description

    Spectrally interpolate vectors to polar stereo.

    @@ -108,8 +114,8 @@

    Definition in file sptrunsv.f.

    Function/Subroutine Documentation

    - -

    ◆ sptrunsv()

    + +

    ◆ sptrunsv()

    diff --git a/sptrunsv_8f.js b/sptrunsv_8f.js index af10490c..fac923d4 100644 --- a/sptrunsv_8f.js +++ b/sptrunsv_8f.js @@ -1,4 +1,4 @@ var sptrunsv_8f = [ - [ "sptrunsv", "sptrunsv_8f.html#a1373b651b9dea586e33d3033aae68656", null ] + [ "sptrunsv", "sptrunsv_8f.html#ac9ab3491104aebec37d502d077213991", null ] ]; \ No newline at end of file diff --git a/sptrunsv_8f_source.html b/sptrunsv_8f_source.html index c3298aa7..4a5fdb25 100644 --- a/sptrunsv_8f_source.html +++ b/sptrunsv_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptrunsv.f Source File @@ -23,10 +23,9 @@
    - - + @@ -34,22 +33,28 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ + +
    @@ -76,179 +81,187 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    sptrunsv.f
    +
    sptrunsv.f
    -Go to the documentation of this file.
    1 C> @file
    -
    2 C> @brief Spectrally interpolate vectors to polar stereo.
    -
    3 C>
    -
    4 C> 96-02-29 | Iredell | Initial.
    -
    5 C> 1998-12-15 | Iredell | Openmp directives inserted.
    -
    6 C>
    -
    7 C> @author Iredell @date 96-02-29
    -
    8 
    -
    9 C> This subprogram spectrally truncates vector fields
    -
    10 C> on a global cylindrical grid, returning the fields
    -
    11 C> to specific pairs of polar stereographic scalar fields.
    -
    12 C>
    -
    13 C> The wave-space can be either triangular or rhomboidal.
    -
    14 C>
    -
    15 C> The grid-space can be either an equally-spaced grid
    -
    16 C> (with or without pole points) or a gaussian grid.
    -
    17 C>
    -
    18 C> The grid fields may have general indexing.
    -
    19 C>
    -
    20 C> The transforms are all multiprocessed.
    -
    21 C>
    -
    22 C> Transform several fields at a time to improve vectorization.
    -
    23 C>
    -
    24 C> Subprogram can be called from a multiprocessing environment.
    -
    25 C>
    -
    26 C> Minimum grid dimensions for unaliased transforms to spectral:
    -
    27 C> Dimension |Linear |Quadratic
    -
    28 C> ----------------------- |--------- |-------------
    -
    29 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    -
    30 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    -
    31 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    -
    32 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    -
    33 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    -
    34 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    -
    35 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    -
    36 C>
    -
    37 C> @param IROMB integer spectral domain shape
    -
    38 C> (0 for triangular, 1 for rhomboidal)
    -
    39 C> @param MAXWV integer spectral truncation
    -
    40 C> @param IDRTI integer input grid identifier
    -
    41 C> - IDRTI=4 for Gaussian grid
    -
    42 C> - IDRTI=0 for equally-spaced grid including poles
    -
    43 C> - IDRTI=256 for equally-spaced grid excluding poles
    -
    44 C> @param IMAXI integer even number of input longitudes.
    -
    45 C> @param JMAXI integer number of input latitudes.
    -
    46 C> @param KMAX integer number of fields to transform.
    -
    47 C> @param NPS integer odd order of the polar stereographic grids
    -
    48 C> @param IPRIME integer input longitude index for the prime meridian.
    -
    49 C> (defaults to 1 if IPRIME=0)
    -
    50 C> (output longitude index for prime meridian assumed 1.)
    -
    51 C> @param ISKIPI integer skip number between input longitudes
    -
    52 C> (defaults to 1 if ISKIPI=0)
    -
    53 C> @param JSKIPI integer skip number between input latitudes from south
    -
    54 C> (defaults to -IMAXI if JSKIPI=0)
    -
    55 C> @param KSKIPI integer skip number between input grid fields
    -
    56 C> (defaults to IMAXI*JMAXI if KSKIPI=0)
    -
    57 C> @param KGSKIP integer skip number between grid fields
    -
    58 C> (defaults to NPS*NPS if KGSKIP=0)
    -
    59 C> @param NISKIP integer skip number between grid i-points
    -
    60 C> (defaults to 1 if NISKIP=0)
    -
    61 C> @param NJSKIP integer skip number between grid j-points
    -
    62 C> (defaults to NPS if NJSKIP=0)
    -
    63 C> @param JCPU integer number of cpus over which to multiprocess
    -
    64 C> (defaults to environment NCPUS if JCPU=0)
    -
    65 C> @param TRUE real latitude at which ps grid is true (usually 60.)
    -
    66 C> @param XMESH real grid length at true latitude (m)
    -
    67 C> @param ORIENT real longitude at bottom of Northern PS grid
    -
    68 C> (Southern PS grid will have opposite orientation.)
    -
    69 C> @param GRIDUI real input grid u-winds
    -
    70 C> @param GRIDVI real input grid v-winds
    -
    71 C> @param LUV logical flag whether to return winds
    -
    72 C> @param LDZ logical flag whether to return divergence and vorticity
    -
    73 C> @param LPS logical flag whether to return potential and streamfcn
    -
    74 C> @param UN real northern ps u-winds if luv
    -
    75 C> @param VN real northern ps v-winds if luv
    -
    76 C> @param US real southern ps u-winds if luv
    -
    77 C> @param VS real southern ps v-winds if luv
    -
    78 C> @param DN real northern divergences if ldz
    -
    79 C> @param ZN real northern vorticities if ldz
    -
    80 C> @param DS real southern divergences if ldz
    -
    81 C> @param ZS real southern vorticities if ldz
    -
    82 C> @param PN real northern potentials if lps
    -
    83 C> @param SN real northern streamfcns if lps
    -
    84 C> @param PS real southern potentials if lps
    -
    85 C> @param SS real southern streamfcns if lps
    -
    86 C>
    -
    87 C> @author Iredell @date 96-02-29
    -
    88  SUBROUTINE sptrunsv(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,NPS,
    -
    89  & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP,
    -
    90  & NISKIP,NJSKIP,JCPU,TRUE,XMESH,ORIENT,
    -
    91  & GRIDUI,GRIDVI,
    -
    92  & LUV,UN,VN,US,VS,LDZ,DN,ZN,DS,ZS,
    -
    93  & LPS,PN,SN,PS,SS)
    -
    94  LOGICAL LUV,LDZ,LPS
    -
    95  REAL GRIDUI(*),GRIDVI(*)
    -
    96  REAL UN(*),VN(*),US(*),VS(*),DN(*),ZN(*),DS(*),ZS(*)
    -
    97  REAL PN(*),SN(*),PS(*),SS(*)
    -
    98  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    -
    99  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    -
    100  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    -
    101  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    -
    102  REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    -
    103  REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    -
    104 
    -
    105 C TRANSFORM INPUT GRID TO WAVE
    -
    106  jc=jcpu
    -
    107  IF(jc.EQ.0) jc=ncpus()
    -
    108  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    -
    109  mdim=2*mx+1
    -
    110  jn=-jskipi
    -
    111  IF(jn.EQ.0) jn=imaxi
    -
    112  js=-jn
    -
    113  inp=(jmaxi-1)*max(0,-jn)+1
    -
    114  isp=(jmaxi-1)*max(0,-js)+1
    -
    115  CALL sptranv(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    -
    116  & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    -
    117  & wd,wz,
    -
    118  & gridui(inp),gridui(isp),gridvi(inp),gridvi(isp),-1)
    -
    119 
    -
    120 C TRANSFORM WAVE TO OUTPUT WINDS
    -
    121  IF(luv) THEN
    -
    122  CALL sptgpsv(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
    -
    123  & true,xmesh,orient,wd,wz,un,vn,us,vs)
    -
    124  ENDIF
    -
    125 
    -
    126 C TRANSFORM WAVE TO OUTPUT DIVERGENCE AND VORTICITY
    -
    127  IF(ldz) THEN
    -
    128  CALL sptgps(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
    -
    129  & true,xmesh,orient,wd,dn,ds)
    -
    130  CALL sptgps(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
    -
    131  & true,xmesh,orient,wz,zn,zs)
    -
    132  ENDIF
    -
    133 
    -
    134 C TRANSFORM WAVE TO OUTPUT POTENTIAL AND STREAMFUNCTION
    -
    135  IF(lps) THEN
    -
    136  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    -
    137 C$OMP PARALLEL DO
    -
    138  DO k=1,kmax
    -
    139  CALL splaplac(iromb,maxwv,enn1,wd(1,k),wd(1,k),-1)
    -
    140  CALL splaplac(iromb,maxwv,enn1,wz(1,k),wz(1,k),-1)
    -
    141  wd(1:2,k)=0.
    -
    142  wz(1:2,k)=0.
    -
    143  ENDDO
    -
    144  CALL sptgps(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
    -
    145  & true,xmesh,orient,wd,pn,ps)
    -
    146  CALL sptgps(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
    -
    147  & true,xmesh,orient,wz,sn,ss)
    -
    148  ENDIF
    -
    149  END
    -
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    -
    subroutine splaplac(I, M, ENN1, Q, QD2, IDIR)
    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
    Definition: splaplac.f:25
    -
    subroutine sptgps(IROMB, MAXWV, KMAX, NPS, KWSKIP, KGSKIP, NISKIP, NJSKIP, TRUE, XMESH, ORIENT, WAVE, GN, GS)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to sca...
    Definition: sptgps.f:81
    -
    subroutine sptgpsv(IROMB, MAXWV, KMAX, NPS, KWSKIP, KGSKIP, NISKIP, NJSKIP, TRUE, XMESH, ORIENT, WAVED, WAVEZ, UN, VN, US, VS)
    This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
    Definition: sptgpsv.f:83
    -
    subroutine sptranv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
    Definition: sptranv.f:91
    -
    subroutine sptrunsv(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NPS, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, TRUE, XMESH, ORIENT, GRIDUI, GRIDVI, LUV, UN, VN, US, VS, LDZ, DN, ZN, DS, ZS, LPS, PN, SN, PS, SS)
    This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields...
    Definition: sptrunsv.f:94
    -
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +Go to the documentation of this file.
    1C> @file
    +
    2C> @brief Spectrally interpolate vectors to polar stereo.
    +
    3C>
    +
    4C> 96-02-29 | Iredell | Initial.
    +
    5C> 1998-12-15 | Iredell | Openmp directives inserted.
    +
    6C>
    +
    7C> @author Iredell @date 96-02-29
    +
    8
    +
    9C> This subprogram spectrally truncates vector fields
    +
    10C> on a global cylindrical grid, returning the fields
    +
    11C> to specific pairs of polar stereographic scalar fields.
    +
    12C>
    +
    13C> The wave-space can be either triangular or rhomboidal.
    +
    14C>
    +
    15C> The grid-space can be either an equally-spaced grid
    +
    16C> (with or without pole points) or a gaussian grid.
    +
    17C>
    +
    18C> The grid fields may have general indexing.
    +
    19C>
    +
    20C> The transforms are all multiprocessed.
    +
    21C>
    +
    22C> Transform several fields at a time to improve vectorization.
    +
    23C>
    +
    24C> Subprogram can be called from a multiprocessing environment.
    +
    25C>
    +
    26C> Minimum grid dimensions for unaliased transforms to spectral:
    +
    27C> Dimension |Linear |Quadratic
    +
    28C> ----------------------- |--------- |-------------
    +
    29C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    +
    30C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    +
    31C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    +
    32C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    +
    33C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    +
    34C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    +
    35C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    +
    36C>
    +
    37C> @param IROMB integer spectral domain shape
    +
    38C> (0 for triangular, 1 for rhomboidal)
    +
    39C> @param MAXWV integer spectral truncation
    +
    40C> @param IDRTI integer input grid identifier
    +
    41C> - IDRTI=4 for Gaussian grid
    +
    42C> - IDRTI=0 for equally-spaced grid including poles
    +
    43C> - IDRTI=256 for equally-spaced grid excluding poles
    +
    44C> @param IMAXI integer even number of input longitudes.
    +
    45C> @param JMAXI integer number of input latitudes.
    +
    46C> @param KMAX integer number of fields to transform.
    +
    47C> @param NPS integer odd order of the polar stereographic grids
    +
    48C> @param IPRIME integer input longitude index for the prime meridian.
    +
    49C> (defaults to 1 if IPRIME=0)
    +
    50C> (output longitude index for prime meridian assumed 1.)
    +
    51C> @param ISKIPI integer skip number between input longitudes
    +
    52C> (defaults to 1 if ISKIPI=0)
    +
    53C> @param JSKIPI integer skip number between input latitudes from south
    +
    54C> (defaults to -IMAXI if JSKIPI=0)
    +
    55C> @param KSKIPI integer skip number between input grid fields
    +
    56C> (defaults to IMAXI*JMAXI if KSKIPI=0)
    +
    57C> @param KGSKIP integer skip number between grid fields
    +
    58C> (defaults to NPS*NPS if KGSKIP=0)
    +
    59C> @param NISKIP integer skip number between grid i-points
    +
    60C> (defaults to 1 if NISKIP=0)
    +
    61C> @param NJSKIP integer skip number between grid j-points
    +
    62C> (defaults to NPS if NJSKIP=0)
    +
    63C> @param JCPU integer number of cpus over which to multiprocess
    +
    64C> (defaults to environment NCPUS if JCPU=0)
    +
    65C> @param TRUE real latitude at which ps grid is true (usually 60.)
    +
    66C> @param XMESH real grid length at true latitude (m)
    +
    67C> @param ORIENT real longitude at bottom of Northern PS grid
    +
    68C> (Southern PS grid will have opposite orientation.)
    +
    69C> @param GRIDUI real input grid u-winds
    +
    70C> @param GRIDVI real input grid v-winds
    +
    71C> @param LUV logical flag whether to return winds
    +
    72C> @param LDZ logical flag whether to return divergence and vorticity
    +
    73C> @param LPS logical flag whether to return potential and streamfcn
    +
    74C> @param UN real northern ps u-winds if luv
    +
    75C> @param VN real northern ps v-winds if luv
    +
    76C> @param US real southern ps u-winds if luv
    +
    77C> @param VS real southern ps v-winds if luv
    +
    78C> @param DN real northern divergences if ldz
    +
    79C> @param ZN real northern vorticities if ldz
    +
    80C> @param DS real southern divergences if ldz
    +
    81C> @param ZS real southern vorticities if ldz
    +
    82C> @param PN real northern potentials if lps
    +
    83C> @param SN real northern streamfcns if lps
    +
    84C> @param PS real southern potentials if lps
    +
    85C> @param SS real southern streamfcns if lps
    +
    86C>
    +
    87C> @author Iredell @date 96-02-29
    +
    +
    88 SUBROUTINE sptrunsv(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,NPS,
    +
    89 & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP,
    +
    90 & NISKIP,NJSKIP,JCPU,TRUE,XMESH,ORIENT,
    +
    91 & GRIDUI,GRIDVI,
    +
    92 & LUV,UN,VN,US,VS,LDZ,DN,ZN,DS,ZS,
    +
    93 & LPS,PN,SN,PS,SS)
    +
    94 LOGICAL LUV,LDZ,LPS
    +
    95 REAL GRIDUI(*),GRIDVI(*)
    +
    96 REAL UN(*),VN(*),US(*),VS(*),DN(*),ZN(*),DS(*),ZS(*)
    +
    97 REAL PN(*),SN(*),PS(*),SS(*)
    +
    98 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    99 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    100 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    101 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    102 REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    103 REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    104
    +
    105C TRANSFORM INPUT GRID TO WAVE
    +
    106 jc=jcpu
    +
    107 IF(jc.EQ.0) jc=ncpus()
    +
    108 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    109 mdim=2*mx+1
    +
    110 jn=-jskipi
    +
    111 IF(jn.EQ.0) jn=imaxi
    +
    112 js=-jn
    +
    113 inp=(jmaxi-1)*max(0,-jn)+1
    +
    114 isp=(jmaxi-1)*max(0,-js)+1
    +
    115 CALL sptranv(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    +
    116 & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    +
    117 & wd,wz,
    +
    118 & gridui(inp),gridui(isp),gridvi(inp),gridvi(isp),-1)
    +
    119
    +
    120C TRANSFORM WAVE TO OUTPUT WINDS
    +
    121 IF(luv) THEN
    +
    122 CALL sptgpsv(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
    +
    123 & true,xmesh,orient,wd,wz,un,vn,us,vs)
    +
    124 ENDIF
    +
    125
    +
    126C TRANSFORM WAVE TO OUTPUT DIVERGENCE AND VORTICITY
    +
    127 IF(ldz) THEN
    +
    128 CALL sptgps(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
    +
    129 & true,xmesh,orient,wd,dn,ds)
    +
    130 CALL sptgps(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
    +
    131 & true,xmesh,orient,wz,zn,zs)
    +
    132 ENDIF
    +
    133
    +
    134C TRANSFORM WAVE TO OUTPUT POTENTIAL AND STREAMFUNCTION
    +
    135 IF(lps) THEN
    +
    136 CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    137C$OMP PARALLEL DO
    +
    138 DO k=1,kmax
    +
    139 CALL splaplac(iromb,maxwv,enn1,wd(1,k),wd(1,k),-1)
    +
    140 CALL splaplac(iromb,maxwv,enn1,wz(1,k),wz(1,k),-1)
    +
    141 wd(1:2,k)=0.
    +
    142 wz(1:2,k)=0.
    +
    143 ENDDO
    +
    144 CALL sptgps(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
    +
    145 & true,xmesh,orient,wd,pn,ps)
    +
    146 CALL sptgps(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
    +
    147 & true,xmesh,orient,wz,sn,ss)
    +
    148 ENDIF
    +
    +
    149 END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition ncpus.F:22
    +
    subroutine splaplac(i, m, enn1, q, qd2, idir)
    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
    Definition splaplac.f:25
    +
    subroutine sptgps(iromb, maxwv, kmax, nps, kwskip, kgskip, niskip, njskip, true, xmesh, orient, wave, gn, gs)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to sca...
    Definition sptgps.f:81
    +
    subroutine sptgpsv(iromb, maxwv, kmax, nps, kwskip, kgskip, niskip, njskip, true, xmesh, orient, waved, wavez, un, vn, us, vs)
    This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
    Definition sptgpsv.f:83
    +
    subroutine sptranv(iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, waved, wavez, gridun, gridus, gridvn, gridvs, idir)
    This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
    Definition sptranv.f:91
    +
    subroutine sptrunsv(iromb, maxwv, idrti, imaxi, jmaxi, kmax, nps, iprime, iskipi, jskipi, kskipi, kgskip, niskip, njskip, jcpu, true, xmesh, orient, gridui, gridvi, luv, un, vn, us, vs, ldz, dn, zn, ds, zs, lps, pn, sn, ps, ss)
    This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields...
    Definition sptrunsv.f:94
    +
    subroutine spwget(iromb, maxwv, eps, epstop, enn1, elonn1, eon, eontop)
    This subprogram gets wave-space constants.
    Definition spwget.f:18
    diff --git a/sptrunv_8f.html b/sptrunv_8f.html index 19b8f50e..3592165e 100644 --- a/sptrunv_8f.html +++ b/sptrunv_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptrunv.f File Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@
    @@ -76,16 +76,22 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    sptrunv.f File Reference
    +
    sptrunv.f File Reference
    @@ -94,11 +100,11 @@

    Go to the source code of this file.

    - - - - + + +

    +

    Functions/Subroutines

    subroutine sptrunv (IROMB, MAXWV, IDRTI, IMAXI, JMAXI, IDRTO, IMAXO, JMAXO, KMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, ISKIPO, JSKIPO, KSKIPO, JCPU, GRIDUI, GRIDVI, LUV, GRIDUO, GRIDVO, LDZ, GRIDDO, GRIDZO, LPS, GRIDPO, GRIDSO)
     This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields to a possibly different global cylindrical grid. More...
     
    subroutine sptrunv (iromb, maxwv, idrti, imaxi, jmaxi, idrto, imaxo, jmaxo, kmax, iprime, iskipi, jskipi, kskipi, iskipo, jskipo, kskipo, jcpu, gridui, gridvi, luv, griduo, gridvo, ldz, griddo, gridzo, lps, gridpo, gridso)
     This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields to a possibly different global cylindrical grid.
     

    Detailed Description

    Spectrally truncate gridded vector fields.

    @@ -107,8 +113,8 @@

    Definition in file sptrunv.f.

    Function/Subroutine Documentation

    - -

    ◆ sptrunv()

    + +

    ◆ sptrunv()

    diff --git a/sptrunv_8f.js b/sptrunv_8f.js index ce8c98f1..879e2e2d 100644 --- a/sptrunv_8f.js +++ b/sptrunv_8f.js @@ -1,4 +1,4 @@ var sptrunv_8f = [ - [ "sptrunv", "sptrunv_8f.html#a9aa39c13dd38585b3afb30cb2486817f", null ] + [ "sptrunv", "sptrunv_8f.html#a123aaebce789911420b9e5c7d89d8de7", null ] ]; \ No newline at end of file diff --git a/sptrunv_8f_source.html b/sptrunv_8f_source.html index 9d41d87d..865ca49c 100644 --- a/sptrunv_8f_source.html +++ b/sptrunv_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: sptrunv.f Source File @@ -23,10 +23,9 @@
    - - + @@ -34,22 +33,28 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ + +
    @@ -76,191 +81,199 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    sptrunv.f
    +
    sptrunv.f
    -Go to the documentation of this file.
    1 C> @file
    -
    2 C>
    -
    3 C> Spectrally truncate gridded vector fields
    -
    4 C> @author IREDELL @date 96-02-29
    -
    5 
    -
    6 C> This subprogram spectrally truncates vector fields
    -
    7 C> on a global cylindrical grid, returning the fields
    -
    8 C> to a possibly different global cylindrical grid.
    -
    9 C> The wave-space can be either triangular or rhomboidal.
    -
    10 C> Either grid-space can be either an equally-spaced grid
    -
    11 C> (with or without pole points) or a Gaussian grid.
    -
    12 C> The grid fields may have general indexing.
    -
    13 C> The transforms are all multiprocessed.
    -
    14 C> Over zonal wavenumber to ensure reproducibility.
    -
    15 C> Transform several fields at a time to improve vectorization.
    -
    16 C> Subprogram can be called from a multiprocessing environment.
    -
    17 C>
    -
    18 C> PROGRAM HISTORY LOG:
    -
    19 C> - 96-02-29 IREDELL
    -
    20 C> - 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED
    -
    21 C>
    -
    22 C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    -
    23 C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    -
    24 C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    -
    25 C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    -
    26 C> (IDRTI=4 FOR GAUSSIAN GRID,
    -
    27 C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    -
    28 C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    -
    29 C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    -
    30 C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    -
    31 C> @param IDRTO - INTEGER OUTPUT GRID IDENTIFIER
    -
    32 C> (IDRTO=4 FOR GAUSSIAN GRID,
    -
    33 C> IDRTO=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    -
    34 C> IDRTO=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    -
    35 C> @param IMAXO - INTEGER EVEN NUMBER OF OUTPUT LONGITUDES.
    -
    36 C> @param JMAXO - INTEGER NUMBER OF OUTPUT LATITUDES.
    -
    37 C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    -
    38 C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    -
    39 C> (DEFAULTS TO 1 IF IPRIME=0)
    -
    40 C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    -
    41 C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    -
    42 C> (DEFAULTS TO 1 IF ISKIPI=0)
    -
    43 C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    -
    44 C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    -
    45 C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    -
    46 C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    -
    47 C> @param ISKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LONGITUDES
    -
    48 C> (DEFAULTS TO 1 IF ISKIPO=0)
    -
    49 C> @param JSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LATITUDES FROM SOUTH
    -
    50 C> (DEFAULTS TO -IMAXO IF JSKIPO=0)
    -
    51 C> @param KSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT GRID FIELDS
    -
    52 C> (DEFAULTS TO IMAXO*JMAXO IF KSKIPO=0)
    -
    53 C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    -
    54 C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    -
    55 C> @param GRIDUI - REAL (*) INPUT GRID U-WINDS
    -
    56 C> @param GRIDVI - REAL (*) INPUT GRID V-WINDS
    -
    57 C> @param LUV - LOGICAL FLAG WHETHER TO RETURN WINDS
    -
    58 C> @param LDZ - LOGICAL FLAG WHETHER TO RETURN DIVERGENCE AND VORTICITY
    -
    59 C> @param LPS - LOGICAL FLAG WHETHER TO RETURN POTENTIAL AND STREAMFCN
    -
    60 C> @param GRIDUO - REAL (*) OUTPUT U-WINDS IF LUV
    -
    61 C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    -
    62 C> @param GRIDVO - REAL (*) OUTPUT V-WINDS IF LUV
    -
    63 C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    -
    64 C> @param GRIDDO - REAL (*) OUTPUT DIVERGENCES IF LDZ
    -
    65 C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    -
    66 C> @param GRIDZO - REAL (*) OUTPUT VORTICITIES IF LDZ
    -
    67 C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    -
    68 C> @param GRIDPO - REAL (*) OUTPUT POTENTIALS IF LPS
    -
    69 C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    -
    70 C> @param GRIDSO - REAL (*) OUTPUT STREAMFCNS IF LPS
    -
    71 C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    -
    72 C>
    -
    73 C> SUBPROGRAMS CALLED:
    -
    74 C> - SPWGET() GET WAVE-SPACE CONSTANTS
    -
    75 C> - SPLAPLAC() COMPUTE LAPLACIAN IN SPECTRAL SPACE
    -
    76 C> - SPTRAN() PERFORM A SCALAR SPHERICAL TRANSFORM
    -
    77 C> - SPTRANV() PERFORM A VECTOR SPHERICAL TRANSFORM
    -
    78 C> - NCPUS() GETS ENVIRONMENT NUMBER OF CPUS
    -
    79 C>
    -
    80 C> REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:
    -
    81 C> DIMENSION |LINEAR |QUADRATIC
    -
    82 C> ----------------------- |--------- |-------------
    -
    83 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    -
    84 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    -
    85 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    -
    86 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    -
    87 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    -
    88 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    -
    89 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    -
    90  SUBROUTINE sptrunv(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,
    -
    91  & IDRTO,IMAXO,JMAXO,KMAX,
    -
    92  & IPRIME,ISKIPI,JSKIPI,KSKIPI,
    -
    93  & ISKIPO,JSKIPO,KSKIPO,JCPU,GRIDUI,GRIDVI,
    -
    94  & LUV,GRIDUO,GRIDVO,LDZ,GRIDDO,GRIDZO,
    -
    95  & LPS,GRIDPO,GRIDSO)
    -
    96  LOGICAL LUV,LDZ,LPS
    -
    97  REAL GRIDUI(*),GRIDVI(*)
    -
    98  REAL GRIDUO(*),GRIDVO(*),GRIDDO(*),GRIDZO(*),GRIDPO(*),GRIDSO(*)
    -
    99  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    -
    100  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    -
    101  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    -
    102  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    -
    103  REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    -
    104  REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    -
    105 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    106 C TRANSFORM INPUT GRID TO WAVE
    -
    107  jc=jcpu
    -
    108  IF(jc.EQ.0) jc=ncpus()
    -
    109  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    -
    110  mdim=2*mx+1
    -
    111  jn=-jskipi
    -
    112  IF(jn.EQ.0) jn=imaxi
    -
    113  js=-jn
    -
    114  inp=(jmaxi-1)*max(0,-jn)+1
    -
    115  isp=(jmaxi-1)*max(0,-js)+1
    -
    116  CALL sptranv(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    -
    117  & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    -
    118  & wd,wz,
    -
    119  & gridui(inp),gridui(isp),gridvi(inp),gridvi(isp),-1)
    -
    120 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    121 C TRANSFORM WAVE TO OUTPUT WINDS
    -
    122  jn=-jskipo
    -
    123  IF(jn.EQ.0) jn=imaxo
    -
    124  js=-jn
    -
    125  inp=(jmaxo-1)*max(0,-jn)+1
    -
    126  isp=(jmaxo-1)*max(0,-js)+1
    -
    127  IF(luv) THEN
    -
    128  CALL sptranv(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
    -
    129  & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
    -
    130  & wd,wz,
    -
    131  & griduo(inp),griduo(isp),gridvo(inp),gridvo(isp),1)
    -
    132  ENDIF
    -
    133 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    134 C TRANSFORM WAVE TO OUTPUT DIVERGENCE AND VORTICITY
    -
    135  IF(ldz) THEN
    -
    136  CALL sptran(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
    -
    137  & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
    -
    138  & wd,griddo(inp),griddo(isp),1)
    -
    139  CALL sptran(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
    -
    140  & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
    -
    141  & wz,gridzo(inp),gridzo(isp),1)
    -
    142  ENDIF
    -
    143 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    144 C TRANSFORM WAVE TO OUTPUT POTENTIAL AND STREAMFUNCTION
    -
    145  IF(lps) THEN
    -
    146  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    -
    147 C$OMP PARALLEL DO
    -
    148  DO k=1,kmax
    -
    149  CALL splaplac(iromb,maxwv,enn1,wd(1,k),wd(1,k),-1)
    -
    150  CALL splaplac(iromb,maxwv,enn1,wz(1,k),wz(1,k),-1)
    -
    151  wd(1:2,k)=0.
    -
    152  wz(1:2,k)=0.
    -
    153  ENDDO
    -
    154  CALL sptran(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
    -
    155  & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
    -
    156  & wd,gridpo(inp),gridpo(isp),1)
    -
    157  CALL sptran(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
    -
    158  & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
    -
    159  & wz,gridso(inp),gridso(isp),1)
    -
    160  ENDIF
    -
    161 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    162  END
    -
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    -
    subroutine splaplac(I, M, ENN1, Q, QD2, IDIR)
    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
    Definition: splaplac.f:25
    -
    subroutine sptran(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDN, GRIDS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition: sptran.f:88
    -
    subroutine sptranv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
    Definition: sptranv.f:91
    -
    subroutine sptrunv(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, IDRTO, IMAXO, JMAXO, KMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, ISKIPO, JSKIPO, KSKIPO, JCPU, GRIDUI, GRIDVI, LUV, GRIDUO, GRIDVO, LDZ, GRIDDO, GRIDZO, LPS, GRIDPO, GRIDSO)
    This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields...
    Definition: sptrunv.f:96
    -
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +Go to the documentation of this file.
    1C> @file
    +
    2C>
    +
    3C> Spectrally truncate gridded vector fields
    +
    4C> @author IREDELL @date 96-02-29
    +
    5
    +
    6C> This subprogram spectrally truncates vector fields
    +
    7C> on a global cylindrical grid, returning the fields
    +
    8C> to a possibly different global cylindrical grid.
    +
    9C> The wave-space can be either triangular or rhomboidal.
    +
    10C> Either grid-space can be either an equally-spaced grid
    +
    11C> (with or without pole points) or a Gaussian grid.
    +
    12C> The grid fields may have general indexing.
    +
    13C> The transforms are all multiprocessed.
    +
    14C> Over zonal wavenumber to ensure reproducibility.
    +
    15C> Transform several fields at a time to improve vectorization.
    +
    16C> Subprogram can be called from a multiprocessing environment.
    +
    17C>
    +
    18C> PROGRAM HISTORY LOG:
    +
    19C> - 96-02-29 IREDELL
    +
    20C> - 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED
    +
    21C>
    +
    22C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    +
    23C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    +
    24C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    +
    25C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    +
    26C> (IDRTI=4 FOR GAUSSIAN GRID,
    +
    27C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    28C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    +
    29C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    +
    30C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    +
    31C> @param IDRTO - INTEGER OUTPUT GRID IDENTIFIER
    +
    32C> (IDRTO=4 FOR GAUSSIAN GRID,
    +
    33C> IDRTO=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    34C> IDRTO=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    +
    35C> @param IMAXO - INTEGER EVEN NUMBER OF OUTPUT LONGITUDES.
    +
    36C> @param JMAXO - INTEGER NUMBER OF OUTPUT LATITUDES.
    +
    37C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    +
    38C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    +
    39C> (DEFAULTS TO 1 IF IPRIME=0)
    +
    40C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    +
    41C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    +
    42C> (DEFAULTS TO 1 IF ISKIPI=0)
    +
    43C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    +
    44C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    +
    45C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    +
    46C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    +
    47C> @param ISKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LONGITUDES
    +
    48C> (DEFAULTS TO 1 IF ISKIPO=0)
    +
    49C> @param JSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LATITUDES FROM SOUTH
    +
    50C> (DEFAULTS TO -IMAXO IF JSKIPO=0)
    +
    51C> @param KSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT GRID FIELDS
    +
    52C> (DEFAULTS TO IMAXO*JMAXO IF KSKIPO=0)
    +
    53C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    +
    54C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    +
    55C> @param GRIDUI - REAL (*) INPUT GRID U-WINDS
    +
    56C> @param GRIDVI - REAL (*) INPUT GRID V-WINDS
    +
    57C> @param LUV - LOGICAL FLAG WHETHER TO RETURN WINDS
    +
    58C> @param LDZ - LOGICAL FLAG WHETHER TO RETURN DIVERGENCE AND VORTICITY
    +
    59C> @param LPS - LOGICAL FLAG WHETHER TO RETURN POTENTIAL AND STREAMFCN
    +
    60C> @param GRIDUO - REAL (*) OUTPUT U-WINDS IF LUV
    +
    61C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    +
    62C> @param GRIDVO - REAL (*) OUTPUT V-WINDS IF LUV
    +
    63C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    +
    64C> @param GRIDDO - REAL (*) OUTPUT DIVERGENCES IF LDZ
    +
    65C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    +
    66C> @param GRIDZO - REAL (*) OUTPUT VORTICITIES IF LDZ
    +
    67C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    +
    68C> @param GRIDPO - REAL (*) OUTPUT POTENTIALS IF LPS
    +
    69C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    +
    70C> @param GRIDSO - REAL (*) OUTPUT STREAMFCNS IF LPS
    +
    71C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    +
    72C>
    +
    73C> SUBPROGRAMS CALLED:
    +
    74C> - SPWGET() GET WAVE-SPACE CONSTANTS
    +
    75C> - SPLAPLAC() COMPUTE LAPLACIAN IN SPECTRAL SPACE
    +
    76C> - SPTRAN() PERFORM A SCALAR SPHERICAL TRANSFORM
    +
    77C> - SPTRANV() PERFORM A VECTOR SPHERICAL TRANSFORM
    +
    78C> - NCPUS() GETS ENVIRONMENT NUMBER OF CPUS
    +
    79C>
    +
    80C> REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:
    +
    81C> DIMENSION |LINEAR |QUADRATIC
    +
    82C> ----------------------- |--------- |-------------
    +
    83C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    +
    84C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    +
    85C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    +
    86C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    +
    87C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    +
    88C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    +
    89C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    +
    +
    90 SUBROUTINE sptrunv(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,
    +
    91 & IDRTO,IMAXO,JMAXO,KMAX,
    +
    92 & IPRIME,ISKIPI,JSKIPI,KSKIPI,
    +
    93 & ISKIPO,JSKIPO,KSKIPO,JCPU,GRIDUI,GRIDVI,
    +
    94 & LUV,GRIDUO,GRIDVO,LDZ,GRIDDO,GRIDZO,
    +
    95 & LPS,GRIDPO,GRIDSO)
    +
    96 LOGICAL LUV,LDZ,LPS
    +
    97 REAL GRIDUI(*),GRIDVI(*)
    +
    98 REAL GRIDUO(*),GRIDVO(*),GRIDDO(*),GRIDZO(*),GRIDPO(*),GRIDSO(*)
    +
    99 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    100 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    101 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    102 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    103 REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    104 REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    105C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    106C TRANSFORM INPUT GRID TO WAVE
    +
    107 jc=jcpu
    +
    108 IF(jc.EQ.0) jc=ncpus()
    +
    109 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    110 mdim=2*mx+1
    +
    111 jn=-jskipi
    +
    112 IF(jn.EQ.0) jn=imaxi
    +
    113 js=-jn
    +
    114 inp=(jmaxi-1)*max(0,-jn)+1
    +
    115 isp=(jmaxi-1)*max(0,-js)+1
    +
    116 CALL sptranv(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    +
    117 & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    +
    118 & wd,wz,
    +
    119 & gridui(inp),gridui(isp),gridvi(inp),gridvi(isp),-1)
    +
    120C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    121C TRANSFORM WAVE TO OUTPUT WINDS
    +
    122 jn=-jskipo
    +
    123 IF(jn.EQ.0) jn=imaxo
    +
    124 js=-jn
    +
    125 inp=(jmaxo-1)*max(0,-jn)+1
    +
    126 isp=(jmaxo-1)*max(0,-js)+1
    +
    127 IF(luv) THEN
    +
    128 CALL sptranv(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
    +
    129 & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
    +
    130 & wd,wz,
    +
    131 & griduo(inp),griduo(isp),gridvo(inp),gridvo(isp),1)
    +
    132 ENDIF
    +
    133C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    134C TRANSFORM WAVE TO OUTPUT DIVERGENCE AND VORTICITY
    +
    135 IF(ldz) THEN
    +
    136 CALL sptran(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
    +
    137 & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
    +
    138 & wd,griddo(inp),griddo(isp),1)
    +
    139 CALL sptran(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
    +
    140 & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
    +
    141 & wz,gridzo(inp),gridzo(isp),1)
    +
    142 ENDIF
    +
    143C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    144C TRANSFORM WAVE TO OUTPUT POTENTIAL AND STREAMFUNCTION
    +
    145 IF(lps) THEN
    +
    146 CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    147C$OMP PARALLEL DO
    +
    148 DO k=1,kmax
    +
    149 CALL splaplac(iromb,maxwv,enn1,wd(1,k),wd(1,k),-1)
    +
    150 CALL splaplac(iromb,maxwv,enn1,wz(1,k),wz(1,k),-1)
    +
    151 wd(1:2,k)=0.
    +
    152 wz(1:2,k)=0.
    +
    153 ENDDO
    +
    154 CALL sptran(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
    +
    155 & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
    +
    156 & wd,gridpo(inp),gridpo(isp),1)
    +
    157 CALL sptran(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
    +
    158 & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
    +
    159 & wz,gridso(inp),gridso(isp),1)
    +
    160 ENDIF
    +
    161C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    +
    162 END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition ncpus.F:22
    +
    subroutine splaplac(i, m, enn1, q, qd2, idir)
    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
    Definition splaplac.f:25
    +
    subroutine sptran(iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, wave, gridn, grids, idir)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition sptran.f:88
    +
    subroutine sptranv(iromb, maxwv, idrt, imax, jmax, kmax, iprime, iskip, jnskip, jsskip, kwskip, kgskip, jbeg, jend, jcpu, waved, wavez, gridun, gridus, gridvn, gridvs, idir)
    This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
    Definition sptranv.f:91
    +
    subroutine sptrunv(iromb, maxwv, idrti, imaxi, jmaxi, idrto, imaxo, jmaxo, kmax, iprime, iskipi, jskipi, kskipi, iskipo, jskipo, kskipo, jcpu, gridui, gridvi, luv, griduo, gridvo, ldz, griddo, gridzo, lps, gridpo, gridso)
    This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields...
    Definition sptrunv.f:96
    +
    subroutine spwget(iromb, maxwv, eps, epstop, enn1, elonn1, eon, eontop)
    This subprogram gets wave-space constants.
    Definition spwget.f:18
    diff --git a/spuv2dz_8f.html b/spuv2dz_8f.html index 2d5eff30..25d535d4 100644 --- a/spuv2dz_8f.html +++ b/spuv2dz_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spuv2dz.f File Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@
    @@ -76,16 +76,22 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    spuv2dz.f File Reference
    +
    spuv2dz.f File Reference
    @@ -94,11 +100,11 @@

    Go to the source code of this file.

    - - - - + + +

    +

    Functions/Subroutines

    subroutine spuv2dz (I, M, ENN1, ELONN1, EON, EONTOP, U, V, UTOP, VTOP, D, Z)
     Computes the divergence and vorticity from wind components in spectral space. More...
     
    subroutine spuv2dz (i, m, enn1, elonn1, eon, eontop, u, v, utop, vtop, d, z)
     Computes the divergence and vorticity from wind components in spectral space.
     

    Detailed Description

    Compute divergence and vorticity from winds.

    @@ -107,8 +113,8 @@

    Definition in file spuv2dz.f.

    Function/Subroutine Documentation

    - -

    ◆ spuv2dz()

    + +

    ◆ spuv2dz()

    diff --git a/spuv2dz_8f.js b/spuv2dz_8f.js index fb93c82c..f508ecd9 100644 --- a/spuv2dz_8f.js +++ b/spuv2dz_8f.js @@ -1,4 +1,4 @@ var spuv2dz_8f = [ - [ "spuv2dz", "spuv2dz_8f.html#a27edc2d10e0a76a45e4aaae58bf018b9", null ] + [ "spuv2dz", "spuv2dz_8f.html#a89104e49dc661c344807f3edfd70be12", null ] ]; \ No newline at end of file diff --git a/spuv2dz_8f_source.html b/spuv2dz_8f_source.html index f382afec..3bd49e4f 100644 --- a/spuv2dz_8f_source.html +++ b/spuv2dz_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spuv2dz.f Source File @@ -23,10 +23,9 @@
    - - + @@ -34,22 +33,28 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ + +
    @@ -76,115 +81,123 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    spuv2dz.f
    +
    spuv2dz.f
    -Go to the documentation of this file.
    1 C> @file
    -
    2 C> @brief Compute divergence and vorticity from winds.
    -
    3 C> @author Iredell @date 92-10-31
    -
    4 
    -
    5 C> Computes the divergence and vorticity from wind components
    -
    6 C> in spectral space.
    -
    7 C>
    -
    8 C> Subprogram speps() should be called already.
    -
    9 C>
    -
    10 C> If L is the zonal wavenumber, N is the total wavenumber,
    -
    11 C> EPS(L,N)=SQRT((N**2-L**2)/(4*N**2-1)) and A is earth radius,
    -
    12 C> then the divergence D is computed as:
    -
    13 C> <pre>
    -
    14 C> D(L,N)=I*L*A*U(L,N)
    -
    15 C> +EPS(L,N+1)*N*A*V(L,N+1)-EPS(L,N)*(N+1)*A*V(L,N-1)
    -
    16 C> </pre>
    -
    17 C>
    -
    18 C> and the vorticity Z is computed as:
    -
    19 C> <pre>
    -
    20 C> Z(L,N)=I*L*A*V(L,N)
    -
    21 C> -EPS(L,N+1)*N*A*U(L,N+1)+EPS(L,N)*(N+1)*A*U(L,N-1)
    -
    22 C> </pre>
    -
    23 C>
    -
    24 C> where U is the zonal wind and V is the meridional wind.
    -
    25 C>
    -
    26 C> U and V are weighted by the secant of latitude.
    -
    27 C>
    -
    28 C> Extra terms are used over top of the spectral domain.
    -
    29 C>
    -
    30 C> Advantage is taken of the fact that EPS(L,L)=0
    -
    31 C> in order to vectorize over the entire spectral domain.
    -
    32 C>
    -
    33 C> @param I integer spectral domain shape
    -
    34 C> (0 for triangular, 1 for rhomboidal)
    -
    35 C> @param M INTEGER spectral truncation
    -
    36 C> @param ENN1 ((M+1)*((I+1)*M+2)/2) N*(N+1)/A**2
    -
    37 C> @param ELONN1 ((M+1)*((I+1)*M+2)/2) L/(N*(N+1))*A
    -
    38 C> @param EON ((M+1)*((I+1)*M+2)/2) EPSILON/N*A
    -
    39 C> @param EONTOP (M+1) EPSILON/N*A over top
    -
    40 C> @param U ((M+1)*((I+1)*M+2)) zonal wind (over coslat)
    -
    41 C> @param V ((M+1)*((I+1)*M+2)) merid wind (over coslat)
    -
    42 C> @param UTOP (2*(M+1)) zonal wind (over coslat) over top
    -
    43 C> @param VTOP (2*(M+1)) merid wind (over coslat) over top
    -
    44 C> @param D ((M+1)*((I+1)*M+2)) divergence
    -
    45 C> @param Z ((M+1)*((I+1)*M+2)) vorticity
    -
    46 C>
    -
    47 C> @author Iredell @date 92-10-31
    -
    48  SUBROUTINE spuv2dz(I,M,ENN1,ELONN1,EON,EONTOP,U,V,UTOP,VTOP,D,Z)
    -
    49  REAL ENN1((M+1)*((I+1)*M+2)/2),ELONN1((M+1)*((I+1)*M+2)/2)
    -
    50  REAL EON((M+1)*((I+1)*M+2)/2),EONTOP(M+1)
    -
    51  REAL U((M+1)*((I+1)*M+2)),V((M+1)*((I+1)*M+2))
    -
    52  REAL UTOP(2*(M+1)),VTOP(2*(M+1))
    -
    53  REAL D((M+1)*((I+1)*M+2)),Z((M+1)*((I+1)*M+2))
    -
    54 
    -
    55 C COMPUTE TERMS FROM THE SPECTRAL DOMAIN
    -
    56  k=1
    -
    57  d(2*k-1)=0.
    -
    58  d(2*k)=0.
    -
    59  z(2*k-1)=0.
    -
    60  z(2*k)=0.
    -
    61  DO k=2,(m+1)*((i+1)*m+2)/2-1
    -
    62  d(2*k-1)=-elonn1(k)*u(2*k)+eon(k+1)*v(2*k+1)-eon(k)*v(2*k-3)
    -
    63  d(2*k)=elonn1(k)*u(2*k-1)+eon(k+1)*v(2*k+2)-eon(k)*v(2*k-2)
    -
    64  z(2*k-1)=-elonn1(k)*v(2*k)-eon(k+1)*u(2*k+1)+eon(k)*u(2*k-3)
    -
    65  z(2*k)=elonn1(k)*v(2*k-1)-eon(k+1)*u(2*k+2)+eon(k)*u(2*k-2)
    -
    66  ENDDO
    -
    67  k=(m+1)*((i+1)*m+2)/2
    -
    68  d(2*k-1)=-elonn1(k)*u(2*k)-eon(k)*v(2*k-3)
    -
    69  d(2*k)=elonn1(k)*u(2*k-1)-eon(k)*v(2*k-2)
    -
    70  z(2*k-1)=-elonn1(k)*v(2*k)+eon(k)*u(2*k-3)
    -
    71  z(2*k)=elonn1(k)*v(2*k-1)+eon(k)*u(2*k-2)
    -
    72 
    -
    73 C COMPUTE TERMS FROM OVER TOP OF THE SPECTRAL DOMAIN
    -
    74 CDIR$ IVDEP
    -
    75  DO l=0,m
    -
    76  k=l*(2*m+(i-1)*(l-1))/2+i*l+m+1
    -
    77  d(2*k-1)=d(2*k-1)+eontop(l+1)*vtop(2*l+1)
    -
    78  d(2*k)=d(2*k)+eontop(l+1)*vtop(2*l+2)
    -
    79  z(2*k-1)=z(2*k-1)-eontop(l+1)*utop(2*l+1)
    -
    80  z(2*k)=z(2*k)-eontop(l+1)*utop(2*l+2)
    -
    81  ENDDO
    -
    82 
    -
    83 C MULTIPLY BY LAPLACIAN TERM
    -
    84  DO k=2,(m+1)*((i+1)*m+2)/2
    -
    85  d(2*k-1)=d(2*k-1)*enn1(k)
    -
    86  d(2*k)=d(2*k)*enn1(k)
    -
    87  z(2*k-1)=z(2*k-1)*enn1(k)
    -
    88  z(2*k)=z(2*k)*enn1(k)
    -
    89  ENDDO
    -
    90  RETURN
    -
    91  END
    -
    subroutine spuv2dz(I, M, ENN1, ELONN1, EON, EONTOP, U, V, UTOP, VTOP, D, Z)
    Computes the divergence and vorticity from wind components in spectral space.
    Definition: spuv2dz.f:49
    +Go to the documentation of this file.
    1C> @file
    +
    2C> @brief Compute divergence and vorticity from winds.
    +
    3C> @author Iredell @date 92-10-31
    +
    4
    +
    5C> Computes the divergence and vorticity from wind components
    +
    6C> in spectral space.
    +
    7C>
    +
    8C> Subprogram speps() should be called already.
    +
    9C>
    +
    10C> If L is the zonal wavenumber, N is the total wavenumber,
    +
    11C> EPS(L,N)=SQRT((N**2-L**2)/(4*N**2-1)) and A is earth radius,
    +
    12C> then the divergence D is computed as:
    +
    13C> <pre>
    +
    14C> D(L,N)=I*L*A*U(L,N)
    +
    15C> +EPS(L,N+1)*N*A*V(L,N+1)-EPS(L,N)*(N+1)*A*V(L,N-1)
    +
    16C> </pre>
    +
    17C>
    +
    18C> and the vorticity Z is computed as:
    +
    19C> <pre>
    +
    20C> Z(L,N)=I*L*A*V(L,N)
    +
    21C> -EPS(L,N+1)*N*A*U(L,N+1)+EPS(L,N)*(N+1)*A*U(L,N-1)
    +
    22C> </pre>
    +
    23C>
    +
    24C> where U is the zonal wind and V is the meridional wind.
    +
    25C>
    +
    26C> U and V are weighted by the secant of latitude.
    +
    27C>
    +
    28C> Extra terms are used over top of the spectral domain.
    +
    29C>
    +
    30C> Advantage is taken of the fact that EPS(L,L)=0
    +
    31C> in order to vectorize over the entire spectral domain.
    +
    32C>
    +
    33C> @param I integer spectral domain shape
    +
    34C> (0 for triangular, 1 for rhomboidal)
    +
    35C> @param M INTEGER spectral truncation
    +
    36C> @param ENN1 ((M+1)*((I+1)*M+2)/2) N*(N+1)/A**2
    +
    37C> @param ELONN1 ((M+1)*((I+1)*M+2)/2) L/(N*(N+1))*A
    +
    38C> @param EON ((M+1)*((I+1)*M+2)/2) EPSILON/N*A
    +
    39C> @param EONTOP (M+1) EPSILON/N*A over top
    +
    40C> @param U ((M+1)*((I+1)*M+2)) zonal wind (over coslat)
    +
    41C> @param V ((M+1)*((I+1)*M+2)) merid wind (over coslat)
    +
    42C> @param UTOP (2*(M+1)) zonal wind (over coslat) over top
    +
    43C> @param VTOP (2*(M+1)) merid wind (over coslat) over top
    +
    44C> @param D ((M+1)*((I+1)*M+2)) divergence
    +
    45C> @param Z ((M+1)*((I+1)*M+2)) vorticity
    +
    46C>
    +
    47C> @author Iredell @date 92-10-31
    +
    +
    48 SUBROUTINE spuv2dz(I,M,ENN1,ELONN1,EON,EONTOP,U,V,UTOP,VTOP,D,Z)
    +
    49 REAL ENN1((M+1)*((I+1)*M+2)/2),ELONN1((M+1)*((I+1)*M+2)/2)
    +
    50 REAL EON((M+1)*((I+1)*M+2)/2),EONTOP(M+1)
    +
    51 REAL U((M+1)*((I+1)*M+2)),V((M+1)*((I+1)*M+2))
    +
    52 REAL UTOP(2*(M+1)),VTOP(2*(M+1))
    +
    53 REAL D((M+1)*((I+1)*M+2)),Z((M+1)*((I+1)*M+2))
    +
    54
    +
    55C COMPUTE TERMS FROM THE SPECTRAL DOMAIN
    +
    56 k=1
    +
    57 d(2*k-1)=0.
    +
    58 d(2*k)=0.
    +
    59 z(2*k-1)=0.
    +
    60 z(2*k)=0.
    +
    61 DO k=2,(m+1)*((i+1)*m+2)/2-1
    +
    62 d(2*k-1)=-elonn1(k)*u(2*k)+eon(k+1)*v(2*k+1)-eon(k)*v(2*k-3)
    +
    63 d(2*k)=elonn1(k)*u(2*k-1)+eon(k+1)*v(2*k+2)-eon(k)*v(2*k-2)
    +
    64 z(2*k-1)=-elonn1(k)*v(2*k)-eon(k+1)*u(2*k+1)+eon(k)*u(2*k-3)
    +
    65 z(2*k)=elonn1(k)*v(2*k-1)-eon(k+1)*u(2*k+2)+eon(k)*u(2*k-2)
    +
    66 ENDDO
    +
    67 k=(m+1)*((i+1)*m+2)/2
    +
    68 d(2*k-1)=-elonn1(k)*u(2*k)-eon(k)*v(2*k-3)
    +
    69 d(2*k)=elonn1(k)*u(2*k-1)-eon(k)*v(2*k-2)
    +
    70 z(2*k-1)=-elonn1(k)*v(2*k)+eon(k)*u(2*k-3)
    +
    71 z(2*k)=elonn1(k)*v(2*k-1)+eon(k)*u(2*k-2)
    +
    72
    +
    73C COMPUTE TERMS FROM OVER TOP OF THE SPECTRAL DOMAIN
    +
    74CDIR$ IVDEP
    +
    75 DO l=0,m
    +
    76 k=l*(2*m+(i-1)*(l-1))/2+i*l+m+1
    +
    77 d(2*k-1)=d(2*k-1)+eontop(l+1)*vtop(2*l+1)
    +
    78 d(2*k)=d(2*k)+eontop(l+1)*vtop(2*l+2)
    +
    79 z(2*k-1)=z(2*k-1)-eontop(l+1)*utop(2*l+1)
    +
    80 z(2*k)=z(2*k)-eontop(l+1)*utop(2*l+2)
    +
    81 ENDDO
    +
    82
    +
    83C MULTIPLY BY LAPLACIAN TERM
    +
    84 DO k=2,(m+1)*((i+1)*m+2)/2
    +
    85 d(2*k-1)=d(2*k-1)*enn1(k)
    +
    86 d(2*k)=d(2*k)*enn1(k)
    +
    87 z(2*k-1)=z(2*k-1)*enn1(k)
    +
    88 z(2*k)=z(2*k)*enn1(k)
    +
    89 ENDDO
    +
    90 RETURN
    +
    +
    91 END
    +
    subroutine spuv2dz(i, m, enn1, elonn1, eon, eontop, u, v, utop, vtop, d, z)
    Computes the divergence and vorticity from wind components in spectral space.
    Definition spuv2dz.f:49
    diff --git a/spvar_8f.html b/spvar_8f.html index 73948c37..23c099ad 100644 --- a/spvar_8f.html +++ b/spvar_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spvar.f File Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@
    @@ -76,16 +76,22 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    spvar.f File Reference
    +
    spvar.f File Reference
    @@ -94,11 +100,11 @@

    Go to the source code of this file.

    - - - - + + +

    +

    Functions/Subroutines

    subroutine spvar (I, M, Q, QVAR)
     Computes the variances by total wavenumber of a scalar field in spectral space. More...
     
    subroutine spvar (i, m, q, qvar)
     Computes the variances by total wavenumber of a scalar field in spectral space.
     

    Detailed Description

    Compute variance by total wavenumber.

    @@ -107,8 +113,8 @@

    Definition in file spvar.f.

    Function/Subroutine Documentation

    - -

    ◆ spvar()

    + +

    ◆ spvar()

    diff --git a/spvar_8f.js b/spvar_8f.js index 4cfca763..8b9bafd6 100644 --- a/spvar_8f.js +++ b/spvar_8f.js @@ -1,4 +1,4 @@ var spvar_8f = [ - [ "spvar", "spvar_8f.html#a840f95e09b8d930b38638a391933bee4", null ] + [ "spvar", "spvar_8f.html#ae2f7a1068275fa8d245d1c6cc9643f3f", null ] ]; \ No newline at end of file diff --git a/spvar_8f_source.html b/spvar_8f_source.html index 9f559d95..0b45835c 100644 --- a/spvar_8f_source.html +++ b/spvar_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spvar.f Source File @@ -23,10 +23,9 @@
    - - + @@ -34,22 +33,28 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ + +
    @@ -76,59 +81,67 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    spvar.f
    +
    spvar.f
    -Go to the documentation of this file.
    1 C> @file
    -
    2 C> @brief Compute variance by total wavenumber.
    -
    3 C> @author Iredell @date 92-10-31
    -
    4 
    -
    5 C> Computes the variances by total wavenumber
    -
    6 C> of a scalar field in spectral space.
    -
    7 C>
    -
    8 C> @param I spectral domain shape
    -
    9 C> (0 for triangular, 1 for rhomboidal)
    -
    10 C> @param M spectral truncation
    -
    11 C> @param Q ((M+1)*((I+1)*M+2)) scalar field
    -
    12 C> @param QVAR (0:(I+1)*M) variances
    -
    13 C>
    -
    14 C> @author Iredell @date 92-10-31
    -
    15  SUBROUTINE spvar(I,M,Q,QVAR)
    -
    16  REAL Q((M+1)*((I+1)*M+2))
    -
    17  REAL QVAR(0:(I+1)*M)
    -
    18 
    -
    19  l=0
    -
    20  DO n=0,m
    -
    21  ks=l*(2*m+(i-1)*(l-1))+2*n
    -
    22  qvar(n)=0.5*q(ks+1)**2
    -
    23  ENDDO
    -
    24  DO n=m+1,(i+1)*m
    -
    25  qvar(n)=0.
    -
    26  ENDDO
    -
    27  DO n=0,(i+1)*m
    -
    28  DO l=max(1,n-m),min(n,m)
    -
    29  ks=l*(2*m+(i-1)*(l-1))+2*n
    -
    30  qvar(n)=qvar(n)+q(ks+1)**2+q(ks+2)**2
    -
    31  ENDDO
    -
    32  ENDDO
    -
    33 
    -
    34  RETURN
    -
    35  END
    -
    subroutine spvar(I, M, Q, QVAR)
    Computes the variances by total wavenumber of a scalar field in spectral space.
    Definition: spvar.f:16
    +Go to the documentation of this file.
    1C> @file
    +
    2C> @brief Compute variance by total wavenumber.
    +
    3C> @author Iredell @date 92-10-31
    +
    4
    +
    5C> Computes the variances by total wavenumber
    +
    6C> of a scalar field in spectral space.
    +
    7C>
    +
    8C> @param I spectral domain shape
    +
    9C> (0 for triangular, 1 for rhomboidal)
    +
    10C> @param M spectral truncation
    +
    11C> @param Q ((M+1)*((I+1)*M+2)) scalar field
    +
    12C> @param QVAR (0:(I+1)*M) variances
    +
    13C>
    +
    14C> @author Iredell @date 92-10-31
    +
    +
    15 SUBROUTINE spvar(I,M,Q,QVAR)
    +
    16 REAL Q((M+1)*((I+1)*M+2))
    +
    17 REAL QVAR(0:(I+1)*M)
    +
    18
    +
    19 l=0
    +
    20 DO n=0,m
    +
    21 ks=l*(2*m+(i-1)*(l-1))+2*n
    +
    22 qvar(n)=0.5*q(ks+1)**2
    +
    23 ENDDO
    +
    24 DO n=m+1,(i+1)*m
    +
    25 qvar(n)=0.
    +
    26 ENDDO
    +
    27 DO n=0,(i+1)*m
    +
    28 DO l=max(1,n-m),min(n,m)
    +
    29 ks=l*(2*m+(i-1)*(l-1))+2*n
    +
    30 qvar(n)=qvar(n)+q(ks+1)**2+q(ks+2)**2
    +
    31 ENDDO
    +
    32 ENDDO
    +
    33
    +
    34 RETURN
    +
    +
    35 END
    +
    subroutine spvar(i, m, q, qvar)
    Computes the variances by total wavenumber of a scalar field in spectral space.
    Definition spvar.f:16
    diff --git a/spwget_8f.html b/spwget_8f.html index 8d9f2dd3..ea360dbe 100644 --- a/spwget_8f.html +++ b/spwget_8f.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spwget.f File Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@
    @@ -76,16 +76,22 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    spwget.f File Reference
    +
    spwget.f File Reference
    @@ -94,11 +100,11 @@

    Go to the source code of this file.

    - - - - + + +

    +

    Functions/Subroutines

    subroutine spwget (IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
     This subprogram gets wave-space constants. More...
     
    subroutine spwget (iromb, maxwv, eps, epstop, enn1, elonn1, eon, eontop)
     This subprogram gets wave-space constants.
     

    Detailed Description

    Get wave-space constants.

    @@ -107,8 +113,8 @@

    Definition in file spwget.f.

    Function/Subroutine Documentation

    - -

    ◆ spwget()

    + +

    ◆ spwget()

    diff --git a/spwget_8f.js b/spwget_8f.js index 3fba636e..644cab41 100644 --- a/spwget_8f.js +++ b/spwget_8f.js @@ -1,4 +1,4 @@ var spwget_8f = [ - [ "spwget", "spwget_8f.html#a9b6ce78350f7adf2fed874a18312c7a6", null ] + [ "spwget", "spwget_8f.html#a8ede1d8ebcc8a6515401e89f591e3aeb", null ] ]; \ No newline at end of file diff --git a/spwget_8f_source.html b/spwget_8f_source.html index 2ed57cce..9ec00293 100644 --- a/spwget_8f_source.html +++ b/spwget_8f_source.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: spwget.f Source File @@ -23,10 +23,9 @@
    - - + @@ -34,22 +33,28 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ + +
    @@ -76,51 +81,59 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    spwget.f
    +
    spwget.f
    -Go to the documentation of this file.
    1 C> @file
    -
    2 C> @brief Get wave-space constants.
    -
    3 C> @author Iredell @date 96-02-29
    -
    4 
    -
    5 C> This subprogram gets wave-space constants.
    -
    6 C>
    -
    7 C> @param IROMB spectral domain shape (0 for triangular, 1 for rhomboidal)
    -
    8 C> @param MAXWV spectral truncation
    -
    9 C> @param EPS
    -
    10 C> @param EPSTOP
    -
    11 C> @param ENN1
    -
    12 C> @param ELONN1
    -
    13 C> @param EON
    -
    14 C> @param EONTOP
    -
    15 C>
    -
    16 C> @author Iredell @date 96-02-29
    -
    17  SUBROUTINE spwget(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP)
    -
    18  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    -
    19  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    -
    20  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    -
    21  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    -
    22 
    -
    23  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    -
    24  mxtop=maxwv+1
    -
    25  CALL speps(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    -
    26  END
    -
    subroutine speps(I, M, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    Computes constant fields indexed in the spectral domain in "IBM ORDER" (Zonal wavenumber is the slowe...
    Definition: speps.f:26
    -
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +Go to the documentation of this file.
    1C> @file
    +
    2C> @brief Get wave-space constants.
    +
    3C> @author Iredell @date 96-02-29
    +
    4
    +
    5C> This subprogram gets wave-space constants.
    +
    6C>
    +
    7C> @param IROMB spectral domain shape (0 for triangular, 1 for rhomboidal)
    +
    8C> @param MAXWV spectral truncation
    +
    9C> @param EPS
    +
    10C> @param EPSTOP
    +
    11C> @param ENN1
    +
    12C> @param ELONN1
    +
    13C> @param EON
    +
    14C> @param EONTOP
    +
    15C>
    +
    16C> @author Iredell @date 96-02-29
    +
    +
    17 SUBROUTINE spwget(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP)
    +
    18 REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    19 REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    20 REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    21 REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    22
    +
    23 mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    24 mxtop=maxwv+1
    +
    25 CALL speps(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    +
    26 END
    +
    subroutine speps(i, m, eps, epstop, enn1, elonn1, eon, eontop)
    Computes constant fields indexed in the spectral domain in "IBM ORDER" (Zonal wavenumber is the slowe...
    Definition speps.f:26
    +
    subroutine spwget(iromb, maxwv, eps, epstop, enn1, elonn1, eon, eontop)
    This subprogram gets wave-space constants.
    Definition spwget.f:18
    diff --git a/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html b/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html index 62d9b4da..7aa926f5 100644 --- a/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html +++ b/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: ip_equid_cylind_grid_mod::ip_equid_cylind_grid Type Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@
    @@ -76,17 +76,23 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    ip_equid_cylind_grid_mod::ip_equid_cylind_grid Type Reference
    +Public Member Functions | +Data Fields
    +
    ip_equid_cylind_grid_mod::ip_equid_cylind_grid Type Reference
    @@ -99,89 +105,92 @@
    - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +

    -Private Member Functions

    procedure field_pos
     Field position for a given grid point. More...
     
    procedure gdswzd => gdswzd_equid_cylind
     See gdswzd_equid_cylind(). More...
     
    generic init => init_grib1, init_grib2
     Init subprogram. More...
     
    procedure init_grib1
     Init GRIB1. More...
     
    procedure init_grib2
     Init GRIB2. More...
     

    +Public Member Functions

    procedure field_pos (self, i, j)
     Field position for a given grid point.
     
    procedure gdswzd (self, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for equidistant cylindrical grids.
     
    generic init init_grib1
     Init subprogram.
     
    generic init init_grib2
     Init subprogram.
     
    procedure init_grib1 (self, g1_desc)
     Init GRIB1.
     
    procedure init_grib2 (self, g2_desc)
     Init GRIB2.
     
    - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + +

    -Private Attributes

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor. More...

    +Data Fields

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor.
     
    real dlat
     Di — i direction increment. More...
    real dlat
     Di — i direction increment.
     
    real dlon
     Dj — j direction increment. More...
    real dlon
     Dj — j direction increment.
     
    real eccen_squared
     Eccentricity of the Earth squared (e^2). More...
    real eccen_squared
     Eccentricity of the Earth squared (e^2).
     
    real hi
     Scan mode in the 'i' direction. More...
    real hi
     Scan mode in the 'i' direction.
     
    integer im
     Number of x points. More...
    integer im
     Number of x points.
     
    integer iwrap
     x wraparound increment (0 if no wraparound). More...
    integer iwrap
     x wraparound increment (0 if no wraparound).
     
    integer jm
     Number of y points. More...
    integer jm
     Number of y points.
     
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound). More...
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound).
     
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound). More...
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound).
     
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind). More...
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind).
     
    integer nm
     Total number of points. More...
    integer nm
     Total number of points.
     
    integer nscan
    integer nscan
     
    integer nscan_field_pos
     nscan for field_pos routine. More...
    integer nscan_field_pos
     nscan for field_pos routine.
     
    real rerth
     Radius of the Earth. More...
    real rerth
     Radius of the Earth.
     
    real rlat1
     Latitude of first grid point. More...
    real rlat1
     Latitude of first grid point.
     
    real rlat2
     Latitude of last grid point. More...
    real rlat2
     Latitude of last grid point.
     
    real rlon1
     Longitude of first grid point. More...
    real rlon1
     Longitude of first grid point.
     
    real rlon2
     Longitude of last grid point. More...
    real rlon2
     Longitude of last grid point.
     

    Detailed Description

    Definition at line 26 of file ip_equid_cylind_grid_mod.F90.

    Member Function/Subroutine Documentation

    - -

    ◆ field_pos()

    + +

    ◆ field_pos()

    + +

    ◆ gdswzd()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    procedure ip_equid_cylind_grid_mod::ip_equid_cylind_grid::gdswzd (class(ip_equid_cylind_grid), intent(in) self,
    integer, intent(in) iopt,
    integer, intent(in) npts,
    real, intent(in) fill,
    real, dimension(npts), intent(inout) xpts,
    real, dimension(npts), intent(inout) ypts,
    real, dimension(npts), intent(inout) rlon,
    real, dimension(npts), intent(inout) rlat,
    integer, intent(out) nret,
    real, dimension(npts), intent(out), optional crot,
    real, dimension(npts), intent(out), optional srot,
    real, dimension(npts), intent(out), optional xlon,
    real, dimension(npts), intent(out), optional xlat,
    real, dimension(npts), intent(out), optional ylon,
    real, dimension(npts), intent(out), optional ylat,
    real, dimension(npts), intent(out), optional area 
    )
    +
    + +

    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for equidistant cylindrical grids.

    +
    Returns
    N/A Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for equidistant cylindrical grids.
    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values.

    +

    The actual number of valid points computed is returned too. Optionally, the vector rotations, the map jacobians and the grid box areas may be returned as well.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present.

    +

    To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present.

    +

    To compute the grid box areas, the optional argument 'area' must be present.

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]selfThe grid object gdswzd was called on.
    [in]ioptoption flag
      +
    • +1 to compute earth coords of selected grid coords.
    • +
    • -1 o compute grid coords of selected earth coords.
    • +
    +
    [in]nptsMaximum number of coordinates.
    [in]fillFill value to set invalid output data. Must be impossible value; suggested value: -9999.
    [in,out]xptsGrid x point coordinates if iopt>0.
    [in,out]yptsGrid y point coordinates if iopt>0.
    [in,out]rlonEarth longitudes in degrees e if iopt<0 (Acceptable range: -360. to 360.)
    [in,out]rlatEarth latitudes in degrees n if iopt<0 (Acceptable range: -90. to 90.)
    [out]nretNumber of valid points computed.
    [out]crotOptional clockwise vector rotation cosines.
    [out]srotOptional clockwise vector rotation sines.
    [out]xlonOptional dx/dlon in 1/degrees.
    [out]xlatOptional dx/dlat in 1/degrees.
    [out]ylonOptional dy/dlon in 1/degrees.
    [out]ylatOptional dy/dlat in 1/degrees.
    [out]areaOptional area weights in m**2.
    +
    +
    +
    Author
    Mark Iredell, George Gayno, Kyle Gerheiser
    +
    Date
    July 2021
    -

    Definition at line 88 of file ip_grid_mod.F90.

    +

    Definition at line 40 of file ip_equid_cylind_grid_mod.F90.

    - -

    ◆ gdswzd()

    + +

    ◆ init() [1/2]

    - -

    ◆ init()

    + +

    ◆ init() [2/2]

    - -

    ◆ init_grib1()

    + +

    ◆ init_grib1()

    - - - - - -
    - + + + + + + + + + + + + + + +
    procedure ip_equid_cylind_grid_mod::ip_equid_cylind_grid::init_grib1procedure ip_equid_cylind_grid_mod::ip_equid_cylind_grid::init_grib1 (class(ip_equid_cylind_grid), intent(inout) self,
    type(grib1_descriptor), intent(in) g1_desc 
    )
    -
    -private

    Init GRIB1.

    -
    Returns
    N/A
    +
    Returns
    N/A Initializes an equidistant cylindrical grid given a grib1_descriptor object.
    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g1_descA grib1_descriptor
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    -

    Definition at line 35 of file ip_equid_cylind_grid_mod.F90.

    +

    Definition at line 36 of file ip_equid_cylind_grid_mod.F90.

    - -

    ◆ init_grib2()

    + +

    ◆ init_grib2()

    - - - - - -
    - + + + + + + + + + + + + + + +
    procedure ip_equid_cylind_grid_mod::ip_equid_cylind_grid::init_grib2procedure ip_equid_cylind_grid_mod::ip_equid_cylind_grid::init_grib2 (class(ip_equid_cylind_grid), intent(inout) self,
    type(grib2_descriptor), intent(in) g2_desc 
    )
    -
    -private

    Init GRIB2.

    -
    Returns
    N/A
    +
    Returns
    N/A Initializes an equidistant cylindrical grid given a grib2_descriptor object.
    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g2_descA grib2_descriptor
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    -

    Definition at line 36 of file ip_equid_cylind_grid_mod.F90.

    +

    Definition at line 38 of file ip_equid_cylind_grid_mod.F90.

    Field Documentation

    - -

    ◆ descriptor

    + +

    ◆ descriptor

    @@ -331,7 +551,7 @@

    -privateinherited +inherited

    @@ -342,24 +562,16 @@

    -

    ◆ dlat

    + +

    ◆ dlat

    - - - - - -
    real ip_equid_cylind_grid_mod::ip_equid_cylind_grid::dlat
    -
    -private

    Di — i direction increment.

    @@ -369,24 +581,16 @@

    -

    ◆ dlon

    + +

    ◆ dlon

    - - - - - -
    real ip_equid_cylind_grid_mod::ip_equid_cylind_grid::dlon
    -
    -private

    Dj — j direction increment.

    @@ -396,8 +600,8 @@

    -

    ◆ eccen_squared

    + +

    ◆ eccen_squared

    @@ -411,7 +615,7 @@

    -privateinherited +inherited

    @@ -422,24 +626,16 @@

    -

    ◆ hi

    + +

    ◆ hi

    - - - - - -
    real ip_equid_cylind_grid_mod::ip_equid_cylind_grid::hi
    -
    -private

    Scan mode in the 'i' direction.

    @@ -449,8 +645,8 @@

    -

    ◆ im

    + +

    ◆ im

    @@ -464,7 +660,7 @@

    -privateinherited +inherited

    @@ -475,8 +671,8 @@

    -

    ◆ iwrap

    + +

    ◆ iwrap

    @@ -490,7 +686,7 @@

    -privateinherited +inherited

    @@ -501,8 +697,8 @@

    -

    ◆ jm

    + +

    ◆ jm

    @@ -516,7 +712,7 @@

    -privateinherited +inherited

    @@ -527,8 +723,8 @@

    -

    ◆ jwrap1

    + +

    ◆ jwrap1

    @@ -542,7 +738,7 @@

    -privateinherited +inherited

    @@ -553,8 +749,8 @@

    -

    ◆ jwrap2

    + +

    ◆ jwrap2

    @@ -568,7 +764,7 @@

    -privateinherited +inherited

    @@ -579,8 +775,8 @@

    -

    ◆ kscan

    + +

    ◆ kscan

    @@ -594,7 +790,7 @@

    -privateinherited +inherited

    @@ -605,8 +801,8 @@

    -

    ◆ nm

    + +

    ◆ nm

    @@ -620,7 +816,7 @@

    -privateinherited +inherited

    @@ -631,8 +827,8 @@

    -

    ◆ nscan

    + +

    ◆ nscan

    @@ -646,7 +842,7 @@

    -privateinherited +inherited

    @@ -666,8 +862,8 @@

    -

    ◆ nscan_field_pos

    + +

    ◆ nscan_field_pos

    @@ -681,7 +877,7 @@

    -privateinherited +inherited

    @@ -693,8 +889,8 @@

    -

    ◆ rerth

    + +

    ◆ rerth

    @@ -708,7 +904,7 @@

    -privateinherited +inherited

    @@ -719,24 +915,16 @@

    -

    ◆ rlat1

    + +

    ◆ rlat1

    - - - - - -
    real ip_equid_cylind_grid_mod::ip_equid_cylind_grid::rlat1
    -
    -private

    Latitude of first grid point.

    @@ -746,24 +934,16 @@

    -

    ◆ rlat2

    + +

    ◆ rlat2

    - - - - - -
    real ip_equid_cylind_grid_mod::ip_equid_cylind_grid::rlat2
    -
    -private

    Latitude of last grid point.

    @@ -773,24 +953,16 @@

    -

    ◆ rlon1

    + +

    ◆ rlon1

    - - - - - -
    real ip_equid_cylind_grid_mod::ip_equid_cylind_grid::rlon1
    -
    -private

    Longitude of first grid point.

    @@ -800,24 +972,16 @@

    -

    ◆ rlon2

    + +

    ◆ rlon2

    - - - - - -
    real ip_equid_cylind_grid_mod::ip_equid_cylind_grid::rlon2
    -
    -private

    Longitude of last grid point.

    @@ -836,7 +1000,7 @@

    diff --git a/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.js b/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.js index 39a1c72a..32b4e9fb 100644 --- a/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.js +++ b/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.js @@ -1,10 +1,11 @@ var structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid = [ - [ "field_pos", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#ac071b3d3eca9a5fa88ff5dc211d19179", null ], - [ "gdswzd", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#aa1023c3efed20a990b75f937bbcac6a3", null ], - [ "init", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a1f3fa40acb8c2ae4a65c00db21872d7c", null ], - [ "init_grib1", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a68fb7543888cc76885560709184e7d70", null ], - [ "init_grib2", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a8dd212953e754964770fa1c3d4bcd3db", null ], + [ "field_pos", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#ad0430873da72a0a81f9f1086d44dd415", null ], + [ "gdswzd", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a64ebc69450ec7581a9e63970f35a800d", null ], + [ "init", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a99982835dc866faae95d1d5d027e0d80", null ], + [ "init", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a6efe57f024c3d8ac77b5ecd8256c2bdf", null ], + [ "init_grib1", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a3ef6bc6a2dc40d2e6bd23e4e9e5bfb0c", null ], + [ "init_grib2", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a41029e699ca3495ae153cc0fc5e448b9", null ], [ "descriptor", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a4a2a0dab09f05931d12615b0ac74bc51", null ], [ "dlat", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a6bd00527219fc596b2c2a7ba47fec719", null ], [ "dlon", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#ae675dc8c49e64700d941eadc31e8f4e7", null ], diff --git a/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.png b/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.png index 544294150259a63c73c46f6a26eb3d2c67b4334f..4a5b9e605e1972ac7c25115a712aaf55ab76e999 100644 GIT binary patch literal 830 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y!~12~w0 z_0L=Ka^HX9`Ynrf8QW8TFUXmseNN&=;aNrBe?i%6J=bnsx6ms{$y0Zw+a#x;UX|7* zQl4C%rjta9Ce2dvw0-s<@0|9p|4UU~vd36tvt9ML6#hrmGdlWOg}e9s-8z+lvuM#vptvZa;&%UahmeX`T zS@>@pNFYSnQxRnCy?xhAR(r;u)&8|NXi|y5`}+&iZpprSnYz4JX0nuX|BAzMlw*rQ;>byq$Q5$f|Wh%XTgky`Do^q zD^b}%|7tVT@yj!C9+(xvEb#H;#5@M3AYO+fDQb5aay(5LWP^AdJXSGs0GWy_*%VZ+ zGPEp_YM202J1L9738<2M$rJB`g1t07HJ7egc%v-ow(iPf+nj@XbK93l-RAQ&-6s1f z#5ms#fvTYn{c{YU0@5|39B>=B%H+Ch+o^-L6+t*^BR~t>ks@oWHm2VD;tPxk>x` zyrr_!eeXDaF52dKd-~<|*Lc6R$6dS8H|uu#o@U=;m09<$-1xVqlJDoDW{t;JB0u*X zJ9d56J^iiMlb@^K{LKsZvKvC8`sYIt#y6R(u5aQEARiAbK~Cu>(CtQM{j#&EwbJ2-D_aF-3L^(RO+@L zFc98P&dRY?xq73_W7WpD6Fhx2m#QqCvgwihVZ)d5firoI08=`Hr>mdKI;Vst0IAb~ A3;+NC literal 804 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y!~12~w0^W`4L>2EV9+RG` zn7U4?I&<*uobWIIr%zfEU+{2^WQek-{YU+kGpls9PWLTuzWwm+?|uL8*=~CO^ZVt` z>t>qfPnoo&*&^`l$7WLRl3f;axiF8i9q_fSy#X6++>-5TkThzrl(a0 z%%;chXFbck6#ltuU%1yKzDJ+6ulVeCvfZl_zT&7^3`j)9v~1G6Dun~q7D zp4}525?f~QJa^Kq4c>p=U1fXkySab;JNJvu#u_ - + - - + + NCEPLIBS-ip: ip_gaussian_grid_mod::ip_gaussian_grid Type Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@

    @@ -76,17 +76,23 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    ip_gaussian_grid_mod::ip_gaussian_grid Type Reference
    +Public Member Functions | +Data Fields
    +
    ip_gaussian_grid_mod::ip_gaussian_grid Type Reference
    @@ -99,92 +105,95 @@
    - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +

    -Private Member Functions

    procedure field_pos
     Field position for a given grid point. More...
     
    procedure gdswzd => gdswzd_gaussian
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids. More...
     
    generic init => init_grib1, init_grib2
     Init subprogram. More...
     
    procedure init_grib1
     Initializes a gaussian grid given a grib1_descriptor object. More...
     
    procedure init_grib2
     Initializes a gaussian grid given a grib2_descriptor object. More...
     

    +Public Member Functions

    procedure field_pos (self, i, j)
     Field position for a given grid point.
     
    procedure gdswzd (self, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids.
     
    generic init init_grib1
     Init subprogram.
     
    generic init init_grib2
     Init subprogram.
     
    procedure init_grib1 (self, g1_desc)
     Initializes a gaussian grid given a grib1_descriptor object.
     
    procedure init_grib2 (self, g2_desc)
     Initializes a gaussian grid given a grib2_descriptor object.
     
    - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + +

    -Private Attributes

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor. More...

    +Data Fields

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor.
     
    real dlon
     "i"-direction increment. More...
    real dlon
     "i"-direction increment.
     
    real eccen_squared
     Eccentricity of the Earth squared (e^2). More...
    real eccen_squared
     Eccentricity of the Earth squared (e^2).
     
    real hi
     Scan mode flag in 'i' direction. More...
    real hi
     Scan mode flag in 'i' direction.
     
    integer im
     Number of x points. More...
    integer im
     Number of x points.
     
    integer iwrap
     x wraparound increment (0 if no wraparound). More...
    integer iwrap
     x wraparound increment (0 if no wraparound).
     
    integer jg
     Number of parallels between the equator and pole times 2. More...
    integer jg
     Number of parallels between the equator and pole times 2.
     
    integer jh
     Scan mode flag in 'j' direction. More...
    integer jh
     Scan mode flag in 'j' direction.
     
    integer jm
     Number of y points. More...
    integer jm
     Number of y points.
     
    integer jscan
     Scanning mode in the 'j' direction. More...
    integer jscan
     Scanning mode in the 'j' direction.
     
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound). More...
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound).
     
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound). More...
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound).
     
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind). More...
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind).
     
    integer nm
     Total number of points. More...
    integer nm
     Total number of points.
     
    integer nscan
    integer nscan
     
    integer nscan_field_pos
     nscan for field_pos routine. More...
    integer nscan_field_pos
     nscan for field_pos routine.
     
    real rerth
     Radius of the Earth. More...
    real rerth
     Radius of the Earth.
     
    real rlat1
     Latitude of first grid point. More...
    real rlat1
     Latitude of first grid point.
     
    real rlon1
     Longitude of first grid point. More...
    real rlon1
     Longitude of first grid point.
     
    real rlon2
     Longitude of last grid point. More...
    real rlon2
     Longitude of last grid point.
     

    Detailed Description

    Definition at line 25 of file ip_gaussian_grid_mod.F90.

    Member Function/Subroutine Documentation

    - -

    ◆ field_pos()

    + +

    ◆ field_pos()

    - -

    ◆ gdswzd()

    + +

    ◆ gdswzd()

    - - - - - -
    - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    procedure ip_gaussian_grid_mod::ip_gaussian_grid::gdswzdprocedure ip_gaussian_grid_mod::ip_gaussian_grid::gdswzd (class(ip_gaussian_grid), intent(in) self,
    integer, intent(in) iopt,
    integer, intent(in) npts,
    real, intent(in) fill,
    real, dimension(npts), intent(inout) xpts,
    real, dimension(npts), intent(inout) ypts,
    real, dimension(npts), intent(inout) rlon,
    real, dimension(npts), intent(inout) rlat,
    integer, intent(out) nret,
    real, dimension(npts), intent(out), optional crot,
    real, dimension(npts), intent(out), optional srot,
    real, dimension(npts), intent(out), optional xlon,
    real, dimension(npts), intent(out), optional xlat,
    real, dimension(npts), intent(out), optional ylon,
    real, dimension(npts), intent(out), optional ylat,
    real, dimension(npts), intent(out), optional area 
    )
    -
    -private

    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids.

    -
    Returns
    N/A
    +
    Returns
    N/A Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids.
    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values.

    +

    The actual number of valid points computed is returned too. Optionally, the vector rotations, the map jacobians and the grid box areas may be returned as well.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present.

    +

    To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present.

    +

    To compute the grid box areas, the optional argument 'area' must be present.

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]selfThe grid object gdswzd was called on.
    [in]ioptoption flag
      +
    • +1 to compute earth coords of selected grid coords.
    • +
    • -1 o compute grid coords of selected earth coords.
    • +
    +
    [in]nptsMaximum number of coordinates.
    [in]fillFill value to set invalid output data. Must be impossible value; suggested value: -9999.
    [in,out]xptsGrid x point coordinates if iopt>0.
    [in,out]yptsGrid y point coordinates if iopt>0.
    [in,out]rlonEarth longitudes in degrees e if iopt<0 (Acceptable range: -360. to 360.)
    [in,out]rlatEarth latitudes in degrees n if iopt<0 (Acceptable range: -90. to 90.)
    [out]nretNumber of valid points computed.
    [out]crotOptional clockwise vector rotation cosines.
    [out]srotOptional clockwise vector rotation sines.
    [out]xlonOptional dx/dlon in 1/degrees.
    [out]xlatOptional dx/dlat in 1/degrees.
    [out]ylonOptional dy/dlon in 1/degrees.
    [out]ylatOptional dy/dlat in 1/degrees.
    [out]areaOptional area weights in m**2.
    +
    +
    +
    Author
    Mark Iredell, George Gayno, Kyle Gerheiser
    +
    Date
    July 2021
    -

    Definition at line 41 of file ip_gaussian_grid_mod.F90.

    +

    Definition at line 44 of file ip_gaussian_grid_mod.F90.

    - -

    ◆ init()

    + +

    ◆ init() [1/2]

    - -

    ◆ init_grib1()

    + +

    ◆ init() [2/2]

    - -

    ◆ init_grib2()

    + +

    ◆ init_grib1()

    - - - - - -
    - + + + + + + + + + + + + + + + + +
    procedure ip_gaussian_grid_mod::ip_gaussian_grid::init_grib2procedure ip_gaussian_grid_mod::ip_gaussian_grid::init_grib1 (class(ip_gaussian_grid), intent(inout) self,
    type(grib1_descriptor), intent(in) g1_desc 
    )
    +
    + +

    Initializes a gaussian grid given a grib1_descriptor object.

    +
    Returns
    N/A Initializes a gaussian grid given a grib1_descriptor object.
    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g1_descA grib1_descriptor
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 37 of file ip_gaussian_grid_mod.F90.

    + +
    + + +

    ◆ init_grib2()

    + +
    +
    + + + + + + + + + + + + + + + + +
    procedure ip_gaussian_grid_mod::ip_gaussian_grid::init_grib2 (class(ip_gaussian_grid), intent(inout) self,
    type(grib2_descriptor), intent(in) g2_desc 
    )
    -
    -private

    Initializes a gaussian grid given a grib2_descriptor object.

    -
    Returns
    N/A
    +
    Returns
    N/A Initializes a gaussian grid given a grib2_descriptor object.
    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g2_descA grib2_descriptor
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    -

    Definition at line 38 of file ip_gaussian_grid_mod.F90.

    +

    Definition at line 40 of file ip_gaussian_grid_mod.F90.

    Field Documentation

    - -

    ◆ descriptor

    + +

    ◆ descriptor

    @@ -334,7 +554,7 @@

    -privateinherited +inherited

    @@ -345,24 +565,16 @@

    -

    ◆ dlon

    + +

    ◆ dlon

    - - - - - -
    real ip_gaussian_grid_mod::ip_gaussian_grid::dlon
    -
    -private

    "i"-direction increment.

    @@ -372,8 +584,8 @@

    -

    ◆ eccen_squared

    + +

    ◆ eccen_squared

    @@ -387,7 +599,7 @@

    -privateinherited +inherited

    @@ -398,24 +610,16 @@

    -

    ◆ hi

    + +

    ◆ hi

    - - - - - -
    real ip_gaussian_grid_mod::ip_gaussian_grid::hi
    -
    -private

    Scan mode flag in 'i' direction.

    @@ -425,8 +629,8 @@

    -

    ◆ im

    + +

    ◆ im

    @@ -440,7 +644,7 @@

    -privateinherited +inherited

    @@ -451,8 +655,8 @@

    -

    ◆ iwrap

    + +

    ◆ iwrap

    @@ -466,7 +670,7 @@

    -privateinherited +inherited

    @@ -477,24 +681,16 @@

    -

    ◆ jg

    + +

    ◆ jg

    - - - - - -
    integer ip_gaussian_grid_mod::ip_gaussian_grid::jg
    -
    -private

    Number of parallels between the equator and pole times 2.

    @@ -504,24 +700,16 @@

    -

    ◆ jh

    + +

    ◆ jh

    - - - - - -
    integer ip_gaussian_grid_mod::ip_gaussian_grid::jh
    -
    -private

    Scan mode flag in 'j' direction.

    @@ -531,8 +719,8 @@

    -

    ◆ jm

    + +

    ◆ jm

    @@ -546,7 +734,7 @@

    -privateinherited +inherited

    @@ -557,24 +745,16 @@

    -

    ◆ jscan

    + +

    ◆ jscan

    - - - - - -
    integer ip_gaussian_grid_mod::ip_gaussian_grid::jscan
    -
    -private

    Scanning mode in the 'j' direction.

    @@ -584,8 +764,8 @@

    -

    ◆ jwrap1

    + +

    ◆ jwrap1

    @@ -599,7 +779,7 @@

    -privateinherited +inherited

    @@ -610,8 +790,8 @@

    -

    ◆ jwrap2

    + +

    ◆ jwrap2

    @@ -625,7 +805,7 @@

    -privateinherited +inherited

    @@ -636,8 +816,8 @@

    -

    ◆ kscan

    + +

    ◆ kscan

    @@ -651,7 +831,7 @@

    -privateinherited +inherited

    @@ -662,8 +842,8 @@

    -

    ◆ nm

    + +

    ◆ nm

    @@ -677,7 +857,7 @@

    -privateinherited +inherited

    @@ -688,8 +868,8 @@

    -

    ◆ nscan

    + +

    ◆ nscan

    @@ -703,7 +883,7 @@

    -privateinherited +inherited

    @@ -723,8 +903,8 @@

    -

    ◆ nscan_field_pos

    + +

    ◆ nscan_field_pos

    @@ -738,7 +918,7 @@

    -privateinherited +inherited

    @@ -750,8 +930,8 @@

    -

    ◆ rerth

    + +

    ◆ rerth

    @@ -765,7 +945,7 @@

    -privateinherited +inherited

    @@ -776,24 +956,16 @@

    -

    ◆ rlat1

    + +

    ◆ rlat1

    - - - - - -
    real ip_gaussian_grid_mod::ip_gaussian_grid::rlat1
    -
    -private

    Latitude of first grid point.

    @@ -803,24 +975,16 @@

    -

    ◆ rlon1

    + +

    ◆ rlon1

    - - - - - -
    real ip_gaussian_grid_mod::ip_gaussian_grid::rlon1
    -
    -private

    Longitude of first grid point.

    @@ -830,24 +994,16 @@

    -

    ◆ rlon2

    + +

    ◆ rlon2

    - - - - - -
    real ip_gaussian_grid_mod::ip_gaussian_grid::rlon2
    -
    -private

    Longitude of last grid point.

    @@ -866,7 +1022,7 @@

    diff --git a/structip__gaussian__grid__mod_1_1ip__gaussian__grid.js b/structip__gaussian__grid__mod_1_1ip__gaussian__grid.js index ea089373..67912d1d 100644 --- a/structip__gaussian__grid__mod_1_1ip__gaussian__grid.js +++ b/structip__gaussian__grid__mod_1_1ip__gaussian__grid.js @@ -1,10 +1,11 @@ var structip__gaussian__grid__mod_1_1ip__gaussian__grid = [ - [ "field_pos", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#ac071b3d3eca9a5fa88ff5dc211d19179", null ], - [ "gdswzd", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a7ce52d987d2bd2442053042c03f96885", null ], - [ "init", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a1f3fa40acb8c2ae4a65c00db21872d7c", null ], - [ "init_grib1", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#afd3658924783d5dbbd3fe5f07d5b60a7", null ], - [ "init_grib2", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a378b72a1b6090acb90a36385ab9eda5a", null ], + [ "field_pos", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#ad0430873da72a0a81f9f1086d44dd415", null ], + [ "gdswzd", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#aaca172b2f61460a0d9192fa365c7b690", null ], + [ "init", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a99982835dc866faae95d1d5d027e0d80", null ], + [ "init", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a6efe57f024c3d8ac77b5ecd8256c2bdf", null ], + [ "init_grib1", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a982912dd382254402b4d447b97366e76", null ], + [ "init_grib2", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#ac36818dd88f306d27107f93dc675220d", null ], [ "descriptor", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a4a2a0dab09f05931d12615b0ac74bc51", null ], [ "dlon", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a35c454d320c59a6c71c4aebb881abcb8", null ], [ "eccen_squared", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a180a5da6c470fac34b8439d4c0a32d2a", null ], diff --git a/structip__gaussian__grid__mod_1_1ip__gaussian__grid.png b/structip__gaussian__grid__mod_1_1ip__gaussian__grid.png index 8937e993e9c6d1a26d0b379607f66f02c8b38ff8..88bc3f727681563fa95e6f1a8b0be7832592dc03 100644 GIT binary patch delta 678 zcmV;X0$Kg61-=E4B!3%FOjJex|Nj600O;)Xb&tZQI4~)27?;fGz`(%&|Nm2x)2ILd z010$bPE!E?|NsC0|Ns9t0-MwT00K!#L_t(|0qvd9lB^&MM4Ps1D*yk*7ac(mbzlbF zx*@wBT@1mTMer5VG)*Ici6qCtgh^5}CQOo=`CZtN$z4lFe|#P$bz-AK@U8-UxR?b2Et2TQuuhITT5@ z(`klxRi+fdcofmLp-8eF6DG+fh7>+tc-bmF7v7?6Ly=@Vx9-v_`7Rx8(_K0_s)r)U zcDj6r%ObumtAFEABw5l?*iYH~bG*_*kR-3D7>Xpn=Z+b!5hKYXIu1pWC0&F`@_)gE zNm4T=Op==M!qYTO0|5Yk!V3UKVl?5`YcS){guU-r#={BQE)4*>F<}7Ej0ppPW=t3W zG-JX5pcxYe0L_>%0BFX90YEb*3;>!jVF1vK2?Ky;On(>vG-JX5@C42|Hxh6nBI97f zA|jeGVG$9{MB#StnvAN!WAup{o|)lFVG)tr*bDoM6PG^QH|D1QbgkXrtu+*y@4pTc zm*3b7k69iRQ?uw3HDtn}mi>+F;zZKpG%?%_&8?6qy+yOGx7Lu)@Gd8L{gY?r=kvt8 z%ybfW1Apc-d~*$-h5Z|o#LCy{3E_@4d=xHH;`yZN8-#n-(6EN{wRZWibdTAs;WBlL zK2by6F8xk8*&)MzSniPV4LlIecj@G~xrX#RTz(I~{z7(4>|8@BJnsSPf3)pkmx&=L zB67u@HGG=kn)*aU3cgN!qJ~shL_|F%EFz*A6CV~4(To>%&bfj32a|2aS4iCIwEzGB M07*qoM6N<$f=Tv8#sB~S delta 660 zcmdnTx`uUvO1(sYPl)UP|Nj{n7+$>jTH1eT0+0p92M!!y?YtuoYoU~ej$Blo!@$Y~AHCwxyLbPK`p0~ZJ*doMsRU$ZUG~{;yBBqo>tlCoRuk^Q_%|bj?uNyEswHQ!7(R$MZio$lZmBo}12S z*zg>_AjnXEh~L5gi`t*hmuD8{A6lFrf9x*jZ!O*gX>qm1L@$66V69v@-=>R~v& z!=NEGM&f{x9#4WKsvsOE+1~Q#?Vs1V$5ku0ecfB9Z<(~Jq$Pj7qHy2VH}Wad8D19NFtqF4 z9<8|gi`dy&_oAHb4(+x}&8eF(uiyGv>ayk?-ZT0?oHeZxliNQ-C9KY`-k-yK&BMh7 z7gKHJLu#7~PD^P$E3mun7e8&C;cm;Avb&4?uN34?oo6kxW2u3^92<<^t$BEvBYq|Sf(Nhr{I5*lVxDmv k8YDB#ehE0eXs>@KYOEe~CYJXkFnuw2y85}Sb4q9e0IrTZZvX%Q diff --git a/structip__grid__descriptor__mod_1_1grib1__descriptor.html b/structip__grid__descriptor__mod_1_1grib1__descriptor.html index e440e729..551b3e0f 100644 --- a/structip__grid__descriptor__mod_1_1grib1__descriptor.html +++ b/structip__grid__descriptor__mod_1_1grib1__descriptor.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: ip_grid_descriptor_mod::grib1_descriptor Type Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@

    @@ -76,17 +76,23 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    ip_grid_descriptor_mod::grib1_descriptor Type Reference
    +Public Member Functions | +Data Fields
    +
    ip_grid_descriptor_mod::grib1_descriptor Type Reference
    @@ -102,32 +108,32 @@

    - - - - - - - + + + + + + +

    -Private Member Functions

    procedure is_same_grid
     Test whether two grid descriptors are the same. More...
     
    procedure is_same_grid_grib1
     Test whether two grid descriptors are the same. More...
     

    +Public Member Functions

    procedure is_same_grid (grid1, grid2)
     Test whether two grid descriptors are the same.
     
    procedure is_same_grid_grib1 (self, grid_desc)
     Test whether two grid descriptors are the same.
     
    - - - + + + - - + +

    -Private Attributes

    integer, dimension(200) gds
     Grib-1 grib descriptor section (GDS) More...

    +Data Fields

    integer, dimension(200) gds
     Grib-1 grib descriptor section (GDS)
     
    integer grid_num
     Integer representing the grid type (see *_GRID_ID_GRIB1/2 in ip_grid_mod). More...
    integer grid_num
     Integer representing the grid type (see *_GRID_ID_GRIB1/2 in ip_grid_mod).
     

    Detailed Description

    Descriptor representing a grib1 grib descriptor section (GDS) with an integer array.

    Date
    July 2021
    -

    Definition at line 38 of file ip_grid_descriptor_mod.F90.

    +

    Definition at line 39 of file ip_grid_descriptor_mod.F90.

    Member Function/Subroutine Documentation

    - -

    ◆ is_same_grid()

    + +

    ◆ is_same_grid()

    - -

    ◆ is_same_grid_grib1()

    + +

    ◆ is_same_grid_grib1()

    - - - - - -
    - + + + + + + + + + + + + + + +
    procedure ip_grid_descriptor_mod::grib1_descriptor::is_same_grid_grib1procedure ip_grid_descriptor_mod::grib1_descriptor::is_same_grid_grib1 (class(grib1_descriptor), intent(in) self,
    class(grib1_descriptor), intent(in) grid_desc 
    )
    -
    -private

    Test whether two grid descriptors are the same.

    -
    Returns
    N/A
    +
    Returns
    N/A Test whether two grib1_descriptors are the same.
    +
    Parameters
    + + + +
    [in]selfThe grib1_descriptor which this routine was called on.
    [in]grid_descA grib1_descriptor to compare.
    +
    +
    +
    Returns
    True if the grids are the same, false if they are not.
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    -

    Definition at line 42 of file ip_grid_descriptor_mod.F90.

    +

    Definition at line 44 of file ip_grid_descriptor_mod.F90.

    Field Documentation

    - -

    ◆ gds

    + +

    ◆ gds

    - - - - - -
    integer, dimension(200) ip_grid_descriptor_mod::grib1_descriptor::gds
    -
    -private

    Grib-1 grib descriptor section (GDS)

    -

    Definition at line 39 of file ip_grid_descriptor_mod.F90.

    +

    Definition at line 40 of file ip_grid_descriptor_mod.F90.

    - -

    ◆ grid_num

    + +

    ◆ grid_num

    @@ -222,7 +260,7 @@

    -privateinherited +inherited

    @@ -242,7 +280,7 @@

    diff --git a/structip__grid__descriptor__mod_1_1grib1__descriptor.js b/structip__grid__descriptor__mod_1_1grib1__descriptor.js index af5c5429..ff782614 100644 --- a/structip__grid__descriptor__mod_1_1grib1__descriptor.js +++ b/structip__grid__descriptor__mod_1_1grib1__descriptor.js @@ -1,7 +1,7 @@ var structip__grid__descriptor__mod_1_1grib1__descriptor = [ - [ "is_same_grid", "structip__grid__descriptor__mod_1_1grib1__descriptor.html#a9da102dac348a63ffce6556ed5da81b6", null ], - [ "is_same_grid_grib1", "structip__grid__descriptor__mod_1_1grib1__descriptor.html#a33b4fc04d218c73e3c4d061163dcbc95", null ], + [ "is_same_grid", "structip__grid__descriptor__mod_1_1grib1__descriptor.html#a264988a6fa9b15eb88ae2482c4b69a84", null ], + [ "is_same_grid_grib1", "structip__grid__descriptor__mod_1_1grib1__descriptor.html#ab51405a373b8ae0a012466bbbc916552", null ], [ "gds", "structip__grid__descriptor__mod_1_1grib1__descriptor.html#a08920c194e39d562fbf527939f0ac6c9", null ], [ "grid_num", "structip__grid__descriptor__mod_1_1grib1__descriptor.html#a6d4598dc4bbf46e059f636715cc390f1", null ] ]; \ No newline at end of file diff --git a/structip__grid__descriptor__mod_1_1grib1__descriptor.png b/structip__grid__descriptor__mod_1_1grib1__descriptor.png index 1ca1b0c06cf6317c529c584ff50560f2d77e02f2..1cb7939c9aa9d375bf2e04be146b35de1cca03e2 100644 GIT binary patch delta 770 zcmV+d1O5Dl2AT$tB!3%FOjJex|Nj600O;)Xb&tZQI4~)27?;fGz`(%&|Nm2x)2ILd z010$bPE!E?|NsC0|Ns9t0-MwT00N~+L_t(|0qtGg(yJg0T-KRR-v5b@6@f(gTBtqt zBI&p?k{@}*Bsf={~+AT)gt#Ez$-#N z0C+{n2LP`K`2gS*As+y|BIE;rSA={3@QRQR0A3OD0l+IlJ^=g-DW&8WNFpL$5%NVu zydva_h-^E-8iD!hkISF+ddYJi(v19pw8!eFbqPJQ zes6|-%zwkdm?O$N4>=%b+vb#^u2#z0GN^)?l`AbH$Tz9HZ_ag$`>L1UHLf5EUL{znAH&%QaGBS+8Jhvm2I$Cang{(As{iOyg9#%Sl)*-Ya-%eS4s&e`fu zcmDSTI`{thh8(}NMMNyF#9oaaN%4pLt(&O*7m@Z9qlm~Gbe)FcyDNW*z{ZSBh`ES%2@@)GfA0Kf7tQue!hgS>XEQdDjCs zUiJ67mi(`x&hGx{9emc0r6%5gy@74b&1sg&8a`tD(+`II*VFQ=Tb82!Dd*psJ?5XY zn~NPTCumI9&G>QO^=No~eGtzqH{+aZr_zjXGQBtY@#?*qh~e_HSQwB~E< zkNnm3bG(kg|7YfA@w|S=GN3+xzxfTJhU$)81R}uY9*K>HXhdaW*BQ z-kZ+Pym5QQl~2>@M*R2nekE}2Fx%e~lk)spp`2|Fs?HodQeli3a zK4Eq_I)Q+|A0Ex6BH}6yDNBPo_Jpx!F(;J{`4Hf8(U*1oP8Ir zw`IKe_oQvNHdf_+gm~CK8`gxuyQ)J>3+XyDMHWBdoqY4Ia8Xuhy`Y zAB)z0AAMDl>H3NKf1kGfbNRQOMQ?T8)rIfZ{R?OLb$*}qTwC|^H+MhHzxiET-tM<7 z3t!2 - + - - + + NCEPLIBS-ip: ip_grid_descriptor_mod::grib2_descriptor Type Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@
    @@ -76,17 +76,23 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    ip_grid_descriptor_mod::grib2_descriptor Type Reference
    +Public Member Functions | +Data Fields
    +
    ip_grid_descriptor_mod::grib2_descriptor Type Reference
    @@ -102,38 +108,38 @@
    - - - - - - - + + + + + + +

    -Private Member Functions

    procedure is_same_grid
     Test whether two grid descriptors are the same. More...
     
    procedure is_same_grid_grib2
     Test whether two grid descriptors are the same. More...
     

    +Public Member Functions

    procedure is_same_grid (grid1, grid2)
     Test whether two grid descriptors are the same.
     
    procedure is_same_grid_grib2 (self, grid_desc)
     Test whether two grid descriptors are the same.
     
    - - - + + + - - + + - - + + - - + +

    -Private Attributes

    integer gdt_len
     Length of the template. More...

    +Data Fields

    integer gdt_len
     Length of the template.
     
    integer gdt_num
     Grid number which represents grid type. More...
    integer gdt_num
     Grid number which represents grid type.
     
    integer, dimension(:), allocatable gdt_tmpl
     Grib-2 grid definition template. More...
    integer, dimension(:), allocatable gdt_tmpl
     Grib-2 grid definition template.
     
    integer grid_num
     Integer representing the grid type (see *_GRID_ID_GRIB1/2 in ip_grid_mod). More...
    integer grid_num
     Integer representing the grid type (see *_GRID_ID_GRIB1/2 in ip_grid_mod).
     

    Detailed Description

    Grib-2 descriptor containing a grib2 GDT represented by an integer array.

    Date
    July 2021
    -

    Definition at line 47 of file ip_grid_descriptor_mod.F90.

    +

    Definition at line 49 of file ip_grid_descriptor_mod.F90.

    Member Function/Subroutine Documentation

    - -

    ◆ is_same_grid()

    + +

    ◆ is_same_grid()

    - -

    ◆ is_same_grid_grib2()

    + +

    ◆ is_same_grid_grib2()

    - - - - - -
    - + + + + + + + + + + + + + + +
    procedure ip_grid_descriptor_mod::grib2_descriptor::is_same_grid_grib2procedure ip_grid_descriptor_mod::grib2_descriptor::is_same_grid_grib2 (class(grib2_descriptor), intent(in) self,
    class(grib2_descriptor), intent(in) grid_desc 
    )
    -
    -private

    Test whether two grid descriptors are the same.

    -
    Returns
    N/A
    +
    Returns
    N/A Test whether two grib2_descriptors are the same.
    +
    Parameters
    + + + +
    [in]selfThe grib2_descriptor which this routine was called on.
    [in]grid_descgrib2_descriptor to compare.
    +
    +
    +
    Returns
    True if the grids are the same, false if they are not.
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    -

    Definition at line 53 of file ip_grid_descriptor_mod.F90.

    +

    Definition at line 56 of file ip_grid_descriptor_mod.F90.

    Field Documentation

    - -

    ◆ gdt_len

    + +

    ◆ gdt_len

    - - - - - -
    integer ip_grid_descriptor_mod::grib2_descriptor::gdt_len
    -
    -private

    Length of the template.

    -

    Definition at line 49 of file ip_grid_descriptor_mod.F90.

    +

    Definition at line 51 of file ip_grid_descriptor_mod.F90.

    - -

    ◆ gdt_num

    + +

    ◆ gdt_num

    - - - - - -
    integer ip_grid_descriptor_mod::grib2_descriptor::gdt_num
    -
    -private

    Grid number which represents grid type.

    -

    Definition at line 48 of file ip_grid_descriptor_mod.F90.

    +

    Definition at line 50 of file ip_grid_descriptor_mod.F90.

    - -

    ◆ gdt_tmpl

    + +

    ◆ gdt_tmpl

    - - - - - -
    integer, dimension(:), allocatable ip_grid_descriptor_mod::grib2_descriptor::gdt_tmpl
    -
    -private

    Grib-2 grid definition template.

    -

    Definition at line 50 of file ip_grid_descriptor_mod.F90.

    +

    Definition at line 52 of file ip_grid_descriptor_mod.F90.

    - -

    ◆ grid_num

    + +

    ◆ grid_num

    @@ -280,7 +302,7 @@

    -privateinherited +inherited

    @@ -300,7 +322,7 @@

    diff --git a/structip__grid__descriptor__mod_1_1grib2__descriptor.js b/structip__grid__descriptor__mod_1_1grib2__descriptor.js index 23620eb7..2f9976fc 100644 --- a/structip__grid__descriptor__mod_1_1grib2__descriptor.js +++ b/structip__grid__descriptor__mod_1_1grib2__descriptor.js @@ -1,7 +1,7 @@ var structip__grid__descriptor__mod_1_1grib2__descriptor = [ - [ "is_same_grid", "structip__grid__descriptor__mod_1_1grib2__descriptor.html#a9da102dac348a63ffce6556ed5da81b6", null ], - [ "is_same_grid_grib2", "structip__grid__descriptor__mod_1_1grib2__descriptor.html#ae27b09a835144baf782e2cde0c1ea013", null ], + [ "is_same_grid", "structip__grid__descriptor__mod_1_1grib2__descriptor.html#a264988a6fa9b15eb88ae2482c4b69a84", null ], + [ "is_same_grid_grib2", "structip__grid__descriptor__mod_1_1grib2__descriptor.html#aa23aa26e7de6904fdb773aa3a5df04be", null ], [ "gdt_len", "structip__grid__descriptor__mod_1_1grib2__descriptor.html#abf8e6d212308608a039e8e97c05c4a06", null ], [ "gdt_num", "structip__grid__descriptor__mod_1_1grib2__descriptor.html#aa5dd78817926e0246f93819ab7037e19", null ], [ "gdt_tmpl", "structip__grid__descriptor__mod_1_1grib2__descriptor.html#a3a90e1ef19332a1d8ec1f6a3193c6ebe", null ], diff --git a/structip__grid__descriptor__mod_1_1grib2__descriptor.png b/structip__grid__descriptor__mod_1_1grib2__descriptor.png index 8ad07329986a9f3e135b9c2150491096b453cf42..e9b64a7fb45a812a77e69ace0b47d88788c4f537 100644 GIT binary patch delta 777 zcmV+k1NQuk2A~FzB!3%FOjJex|Nj600O;)Xb&tZQI4~)27?;fGz`(%&|Nm2x)2ILd z010$bPE!E?|NsC0|Ns9t0-MwT00OH?L_t(|0qtE~lY<}(T-KSJ{QqBkRtqG;wRl+j zkaS!b$p^cngjX!fviJoSlJts@Pm*2{@=4Mwiu^>9f8lAgK7X$ws_kW7lJzN`H&QuO z{qZ%=dY$vUj*6~+V$vS#$K&(y-o|}6825<$-iJM4&$i7eLt(Ocm<+o5cTq9&GbKHd zXY*&{UCqx8&H-J6qFlD1<9`6|+Mk*tnzjTYycB`|QcH7FgonJloP|^2(doP~4 zib?8cCiXTet^BQrsO=_MpKK(_H|RQz#@|5YUG)cZlVlH927io-mQRw-5b{aVD?&a= zdc`V#S(e2u0N|VW0RX@7E&u1owSM37SM{FtJC`4wAAbP+BIE;rSA={3@QRQR0A3OD z0l+IlJ^*+{$Oizg2>Afu6(Ju0ydvZSfLDZk0Pu>C4**^f@&Vv$NGT=1KoSx0ijXfN z;uRrZM8qqs{FhttG+Lim5!E)n#a+*JGS9EgT13<{N8o(*$K{{(ddag6R}yHdpVkf5 zGwb(ecz=%ja4_x>`MnQ&z@BZJQ--oyE^E!83T9STw5}u2ldt}1Wg^e!&&Io&bBU^V zYf$9N7Igg0%7vCDKS`il{o|QY=o;0a&gjvmGnv(F2KCqIuY7D(GX$=Y|M=x?{j_{b zev-gt)o(lWXXLkSZ-&75**B+i6|+xPNl>96b921Wt7R(l@V5U#VXBJ!n@K|djLv_S z5kE6YMAUhoitEt{`ksLsPtR9*slTV^-t$e%>467rMXp?B=-VHtQEB zt+vnHBzOAw=g&Xmj^|oPZ14DTuT3}M^tN-7htH*aEs)Il`hL-)C+c2hN@tgyKV&^S zUV0AGDmLfJ`%PW{V?%1b_NyOVkY(b$P0VceNwFUj4u=1i)0+Ef{{Ag9?Wg^Z5BatF z{h|8kzn?>-&eiX;o~z4#?&j>L&)=8_Wxo7Vy*(p$yV>mQ?MrL!|2$jFFIxS6`u9gG zS4T{$txC#Y9CRway5nY^=TA>J&tDCzg0uhdhS-JfH{7mrwIKDw^%W66CyDSNyn15( z^GZJMhWJN}0^%E=+RH8cdVJdc75!`Mcl^2dlkri~iF)>qE=73-t+twm6%wBq7bTq_ zAW+wqIcwRD1SW*G51;Pm9X^l!0n+vz7w{^wkCsQbk+XMNr7Kbzy;SH3$u zm8I*IzHnYzamBvt7k{ch7MpnQ_6F9RoAuW$lQ(4VR+xQveNINK`vSH5e=dLPG?{J3 z{XWM}_0+wk2PfR$zTnaOuzQ)7pK4iFUA3Pl*}Uo^&$Ax6T(im1XVVSpdw-oe9(L9F zfz;3Q@wcw!pSGXyUb!Ih>uJ8fvOiOAzgE0Z_wDY>9LuV6_jK&j?bpq*l|Em`+$cP^ z{=M|t-rVbH#l737ytn>u_k8t#uP1u{{FtUz@86?%TR)eff8LFIFQ$pqpNKEN`Nn?2 z{1lcSz#tE - + - - + + NCEPLIBS-ip: ip_grid_descriptor_mod::ip_grid_descriptor Type Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@
    @@ -76,17 +76,23 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    ip_grid_descriptor_mod::ip_grid_descriptor Type Reference
    +Public Member Functions | +Data Fields
    +
    ip_grid_descriptor_mod::ip_grid_descriptor Type Reference
    @@ -103,16 +109,16 @@
    - - - - + + + +

    -Private Member Functions

    procedure is_same_grid
     Test whether two grid descriptors are the same. More...
     

    +Public Member Functions

    procedure is_same_grid (grid1, grid2)
     Test whether two grid descriptors are the same.
     
    - - - + + +

    -Private Attributes

    integer grid_num
     Integer representing the grid type (see *_GRID_ID_GRIB1/2 in ip_grid_mod). More...

    +Data Fields

    integer grid_num
     Integer representing the grid type (see *_GRID_ID_GRIB1/2 in ip_grid_mod).
     

    Detailed Description

    @@ -121,52 +127,60 @@

    Definition at line 28 of file ip_grid_descriptor_mod.F90.

    Member Function/Subroutine Documentation

    - -

    ◆ is_same_grid()

    + +

    ◆ is_same_grid()

    - - - - - -
    - + + + + + + + + + + + + + + +
    procedure ip_grid_descriptor_mod::ip_grid_descriptor::is_same_gridprocedure ip_grid_descriptor_mod::ip_grid_descriptor::is_same_grid (class(ip_grid_descriptor), intent(in) grid1,
    class(ip_grid_descriptor), intent(in) grid2 
    )
    -
    -private

    Test whether two grid descriptors are the same.

    -
    Returns
    N/A
    +
    Returns
    N/A Test whether two grid descriptors are the same.
    +
    Parameters
    + + + +
    [in]grid1An ip_grid_descriptor.
    [in]grid2Another ip_grid_descriptor.
    +
    +
    +
    Returns
    True if the grids are the same, false if they are not.
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    -

    Definition at line 32 of file ip_grid_descriptor_mod.F90.

    +

    Definition at line 33 of file ip_grid_descriptor_mod.F90.

    Field Documentation

    - -

    ◆ grid_num

    + +

    ◆ grid_num

    - - - - - -
    integer ip_grid_descriptor_mod::ip_grid_descriptor::grid_num
    -
    -private

    Integer representing the grid type (see *_GRID_ID_GRIB1/2 in ip_grid_mod).

    @@ -184,7 +198,7 @@

    diff --git a/structip__grid__descriptor__mod_1_1ip__grid__descriptor.js b/structip__grid__descriptor__mod_1_1ip__grid__descriptor.js index 20582279..f4100d7e 100644 --- a/structip__grid__descriptor__mod_1_1ip__grid__descriptor.js +++ b/structip__grid__descriptor__mod_1_1ip__grid__descriptor.js @@ -1,5 +1,5 @@ var structip__grid__descriptor__mod_1_1ip__grid__descriptor = [ - [ "is_same_grid", "structip__grid__descriptor__mod_1_1ip__grid__descriptor.html#a9da102dac348a63ffce6556ed5da81b6", null ], + [ "is_same_grid", "structip__grid__descriptor__mod_1_1ip__grid__descriptor.html#a264988a6fa9b15eb88ae2482c4b69a84", null ], [ "grid_num", "structip__grid__descriptor__mod_1_1ip__grid__descriptor.html#a6d4598dc4bbf46e059f636715cc390f1", null ] ]; \ No newline at end of file diff --git a/structip__grid__descriptor__mod_1_1ip__grid__descriptor.png b/structip__grid__descriptor__mod_1_1ip__grid__descriptor.png index 9e35e4973250b4f814588271d5339107c6daee11..378de8166b2515fa815f7404bc5e3aae87125c6d 100644 GIT binary patch literal 1091 zcmeAS@N?(olHy`uVBq!ia0y~yU}6KZ12~w0WavuYKp-U@;1lBd|Nnm=^TnI5rTvGN zTNr2-NK8NT;=q9eK=I&7msbGgI7@>3f*F8(FfeDDeT9L6`JAVVV@L(#+qoBo7Ax?$ z_9reo{J;L=wjdFK*yz}|IeEvU-JBGTI9IUlh&^n;Q^%^X*Pz4DZM_iNAqNQ#=0paO zeglRA{X~Wbarr!EnJ@ZoewvZ{TXVKsoJ5zwk3~{%&i`G$*iO1KPUBEQByXF=l$llg z_Qb{iPo6#N*bJLb^;wggXXU=p=D92`=^kP{V@=br(h$LP(xS(D!eEau#+&eeDKbA1>?;)Ta>!n0)%1#bnYP{F%*prF> zgM-hS)ivF`kQ8vn;7Ekc^%f-_DV|s7x7-p=?)hDEKY#kQHPvSRo|GQL zWBXTFXRQCvx{!l8p)PFo!E-XlC6fKqt^RKYDivy$NG?%JRN!f8G!S5O_y~-x??P-0 z?@W0PKL}?KIuKRC7X&0V)S6xU=f`O*)#0F+d8KXf(XddZ5jJeEa`jseAHn{@cztr|00*$`$XA34ba$rMcqHdkfZh z)`B|I9a{WX)%;E#-eObTe|vuO_SE7CUbc3o8%G{2|GeSAg916RY3}M7 zGryJ``1#o6T>BG`{r~?Y zcWZ{jt6Pt<(u=L{SqXJKtZE2vxNXXFSRkC?k}z|_3L&;4Cy5iBzH$ZA4H!7|6Bz{J z^wrCFGr!%G-gvA}dheG#8$=R6v>(f zo#X!G|4%di8Jm4`^)~D&c@>!QVfVq%r5w#{Y(FpmXuC5@-hA)%589D(7kGB~Z(nfX zMSZB|p#@u|uc)sKHhz(pT_XH>=AWkZMpJelGzIDkHmLab>CrC9=Jj5JZ0T>=j((^v zZ$9rW$i~Zai@m6@O5Sop_m4!LYj4D-De*+@ZY(Z0TEC&VZcWqYjz9MIyK*k8M=+bR z=^bWxw`-Y5VnE`BFH4Ru)oWj`dpu492R3@pHa>sZIm`iMbc zTMJ`DivlzlK{{F(9V$4P8$JlJF+5b|VL0S1!O#K?=YrM83T2ia=T}&_Md)esGJScI z+Mf$vGXKM(R3HwQS=aB{EtztuS1Q=+rQON)>HH_p=&Z6~OG^t>&^q8w)K3U zb+9pdPo?JS86N43)w>U_{~cga*u?+!%U`}Z(nZ;IcfQ0Omb|+4yV--Tc%6(d`uFx& zT-E!&nyJk2N1;3ym*0oP&0McGA6Y3`VqRW$)o}jGis+dKbtitCt&AWFq@Ne; z|324$TzdM;e%%KtJnOzJw2}7z@Ni0K0MGtp(VEZ$KY_{3PGqvh(e~u@q{1v&%Sl~7 z9==?E^R@Z&Ou{wBI%zx1C?{FVRh&$HYAwfeQ}=$SV&s*Zi@vzzpYmyNMD!>@kP*}{yp*HfF* z(&_^@Utaj}toi(q1BE<~er(v!#kcS1nKeuM4$jTDt2F=dzIMg3{4_E5_l5?>-O7my ph - + - - + + NCEPLIBS-ip: ip_grid_mod::ip_grid Type Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@
    @@ -76,17 +76,23 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    ip_grid_mod::ip_grid Type Reference
    +Public Member Functions | +Data Fields
    +
    ip_grid_mod::ip_grid Type Reference
    @@ -109,232 +115,172 @@
    - - - - - - - - - - - - - - - - + + + + + + + + + +

    -Private Member Functions

    procedure field_pos
     Field position for a given grid point. More...
     
    procedure(gdswzd_interface), deferred gdswzd
     Coordinate transformations for the grid. More...
     
    generic init => init_grib1, init_grib2
     Init subprogram. More...
     
    procedure(init_grib1_interface), deferred init_grib1
     Initializer for grib1 input descriptor. More...
     
    procedure(init_grib2_interface), deferred init_grib2
     Initializer for grib2 input descriptor. More...
     

    +Public Member Functions

    procedure field_pos (self, i, j)
     Field position for a given grid point.
     
    generic init init_grib1
     Init subprogram.
     
    generic init init_grib2
     Init subprogram.
     
    - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + +

    -Private Attributes

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor. More...

    +Data Fields

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor.
     
    real eccen_squared
     Eccentricity of the Earth squared (e^2). More...
    real eccen_squared
     Eccentricity of the Earth squared (e^2).
     
    integer im
     Number of x points. More...
    integer im
     Number of x points.
     
    integer iwrap
     x wraparound increment (0 if no wraparound). More...
    integer iwrap
     x wraparound increment (0 if no wraparound).
     
    integer jm
     Number of y points. More...
    integer jm
     Number of y points.
     
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound). More...
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound).
     
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound). More...
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound).
     
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind). More...
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind).
     
    integer nm
     Total number of points. More...
    integer nm
     Total number of points.
     
    integer nscan
    integer nscan
     
    integer nscan_field_pos
     nscan for field_pos routine. More...
    integer nscan_field_pos
     nscan for field_pos routine.
     
    real rerth
     Radius of the Earth. More...
    real rerth
     Radius of the Earth.
     

    Detailed Description

    Abstract grid that holds fields and methods common to all grids.

    ip_grid is meant to be subclassed when implementing a new grid.

    There are three methods that must be implemented:

    The init methods are responsible for setting up the grid using GRIB1/GRIB2 descriptors.

    -

    gdswzd() performs transformations to and from Earth coordinates and grid coordinates.

    +

    gdswzd() performs transformations to and from Earth coordinates and grid coordinates.

    A good reference for all the map projection equations used by NCEPLIBS-ip can be found here: https://doi.org/10.3133/pp1395.

    Author
    Kyle Gerheiser
    Date
    July 2021

    Definition at line 58 of file ip_grid_mod.F90.

    Member Function/Subroutine Documentation

    - -

    ◆ field_pos()

    + +

    ◆ field_pos()

    - - - - - -
    - + + + + -
    procedure ip_grid_mod::ip_grid::field_posprocedure ip_grid_mod::ip_grid::field_pos (class(ip_grid), intent(in) self,
    -
    -private
    -
    - -

    Field position for a given grid point.

    -
    Returns
    Integer position in grib field to locate grid point.
    - -

    Definition at line 88 of file ip_grid_mod.F90.

    - -
    -
    - -

    ◆ gdswzd()

    - -
    -
    - - - - - -
    - - + + + + -
    procedure(gdswzd_interface), deferred ip_grid_mod::ip_grid::gdswzdinteger, intent(in) i,
    -
    -private
    -
    - -

    Coordinate transformations for the grid.

    -
    Returns
    N/A
    - -

    Definition at line 85 of file ip_grid_mod.F90.

    - -
    -
    - -

    ◆ init()

    - -
    -
    - - - - - -
    - - + + + + + + + + +
    generic ip_grid_mod::ip_grid::initinteger, intent(in) j 
    )
    -
    -private
    -

    Init subprogram.

    -
    Returns
    N/A
    +

    Field position for a given grid point.

    +
    Returns
    Integer position in grib field to locate grid point.
    +

    Returns the field position for a given grid point.

    +
    Parameters
    + + + + +
    [in]self
    [in]i
    [in]j
    +
    +
    +
    Returns
    Integer position in grib field to locate grid point.
    +
    Author
    Mark Iredell, George Gayno, Kyle Gerheiser
    +
    Date
    April 1996
    -

    Definition at line 90 of file ip_grid_mod.F90.

    +

    Definition at line 91 of file ip_grid_mod.F90.

    - -

    ◆ init_grib1()

    + +

    ◆ init() [1/2]

    - - - - - -
    - +
    procedure(init_grib1_interface), deferred ip_grid_mod::ip_grid::init_grib1generic ip_grid_mod::ip_grid::init
    -
    -private
    -

    Initializer for grib1 input descriptor.

    +

    Init subprogram.

    Returns
    N/A
    -

    Definition at line 81 of file ip_grid_mod.F90.

    +

    Definition at line 93 of file ip_grid_mod.F90.

    - -

    ◆ init_grib2()

    + +

    ◆ init() [2/2]

    - - - - - -
    - +
    procedure(init_grib2_interface), deferred ip_grid_mod::ip_grid::init_grib2generic ip_grid_mod::ip_grid::init
    -
    -private
    -

    Initializer for grib2 input descriptor.

    +

    Init subprogram.

    Returns
    N/A
    -

    Definition at line 83 of file ip_grid_mod.F90.

    +

    Definition at line 93 of file ip_grid_mod.F90.

    Field Documentation

    - -

    ◆ descriptor

    + +

    ◆ descriptor

    - - - - - -
    class(ip_grid_descriptor), allocatable ip_grid_mod::ip_grid::descriptor
    -
    -private

    Descriptor.

    @@ -343,24 +289,16 @@

    -

    ◆ eccen_squared

    + +

    ◆ eccen_squared

    - - - - - -
    real ip_grid_mod::ip_grid::eccen_squared
    -
    -private

    Eccentricity of the Earth squared (e^2).

    @@ -369,24 +307,16 @@

    -

    ◆ im

    + +

    ◆ im

    - - - - - -
    integer ip_grid_mod::ip_grid::im
    -
    -private

    Number of x points.

    @@ -395,24 +325,16 @@

    -

    ◆ iwrap

    + +

    ◆ iwrap

    - - - - - -
    integer ip_grid_mod::ip_grid::iwrap
    -
    -private

    x wraparound increment (0 if no wraparound).

    @@ -421,24 +343,16 @@

    -

    ◆ jm

    + +

    ◆ jm

    - - - - - -
    integer ip_grid_mod::ip_grid::jm
    -
    -private

    Number of y points.

    @@ -447,24 +361,16 @@

    -

    ◆ jwrap1

    + +

    ◆ jwrap1

    - - - - - -
    integer ip_grid_mod::ip_grid::jwrap1
    -
    -private

    y wraparound lower pivot point (0 if no wraparound).

    @@ -473,24 +379,16 @@

    -

    ◆ jwrap2

    + +

    ◆ jwrap2

    - - - - - -
    integer ip_grid_mod::ip_grid::jwrap2
    -
    -private

    y wraparound upper pivot point (0 if no wraparound).

    @@ -499,24 +397,16 @@

    -

    ◆ kscan

    + +

    ◆ kscan

    - - - - - -
    integer ip_grid_mod::ip_grid::kscan
    -
    -private

    Mass/wind flag for staggered diagonal (0 if mass; 1 if wind).

    @@ -525,24 +415,16 @@

    -

    ◆ nm

    + +

    ◆ nm

    - - - - - -
    integer ip_grid_mod::ip_grid::nm
    -
    -private

    Total number of points.

    @@ -551,24 +433,16 @@

    -

    ◆ nscan

    + +

    ◆ nscan

    - - - - - -
    integer ip_grid_mod::ip_grid::nscan
    -
    -private
    Parameters
    @@ -586,24 +460,16 @@

    -

    ◆ nscan_field_pos

    + +

    ◆ nscan_field_pos

    -

    - - - - -
    integer ip_grid_mod::ip_grid::nscan_field_pos
    -
    -private

    nscan for field_pos routine.

    @@ -613,24 +479,16 @@

    -

    ◆ rerth

    + +

    ◆ rerth

    - - - - - -
    real ip_grid_mod::ip_grid::rerth
    -
    -private

    Radius of the Earth.

    @@ -648,7 +506,7 @@

    diff --git a/structip__grid__mod_1_1ip__grid.js b/structip__grid__mod_1_1ip__grid.js index d4a1fd30..05f8c41f 100644 --- a/structip__grid__mod_1_1ip__grid.js +++ b/structip__grid__mod_1_1ip__grid.js @@ -1,10 +1,8 @@ var structip__grid__mod_1_1ip__grid = [ - [ "field_pos", "structip__grid__mod_1_1ip__grid.html#ac071b3d3eca9a5fa88ff5dc211d19179", null ], - [ "gdswzd", "structip__grid__mod_1_1ip__grid.html#a5fb366fb577a90cc09f21269b90ac080", null ], - [ "init", "structip__grid__mod_1_1ip__grid.html#a1f3fa40acb8c2ae4a65c00db21872d7c", null ], - [ "init_grib1", "structip__grid__mod_1_1ip__grid.html#a5a2c16279eb73a0c54ae0a1586d5b806", null ], - [ "init_grib2", "structip__grid__mod_1_1ip__grid.html#ad13e0ad8d616e1839ced388826fefee9", null ], + [ "field_pos", "structip__grid__mod_1_1ip__grid.html#ad0430873da72a0a81f9f1086d44dd415", null ], + [ "init", "structip__grid__mod_1_1ip__grid.html#a99982835dc866faae95d1d5d027e0d80", null ], + [ "init", "structip__grid__mod_1_1ip__grid.html#a6efe57f024c3d8ac77b5ecd8256c2bdf", null ], [ "descriptor", "structip__grid__mod_1_1ip__grid.html#a4a2a0dab09f05931d12615b0ac74bc51", null ], [ "eccen_squared", "structip__grid__mod_1_1ip__grid.html#a180a5da6c470fac34b8439d4c0a32d2a", null ], [ "im", "structip__grid__mod_1_1ip__grid.html#a546a9c3bb8e93ec8e8f7eaf2a14537dc", null ], diff --git a/structip__grid__mod_1_1ip__grid.png b/structip__grid__mod_1_1ip__grid.png index 81595cd45710d1fe6f014aaff336a9cf519293d4..09adbee9b26e44b8bc418f8d23ec211709303e89 100644 GIT binary patch literal 5605 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 K5&y$a4*wVWre8w< literal 5524 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 Pdf|VU@L9ue_kQ)Cv9;_d diff --git a/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html b/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html index d99f1331..cf9aca52 100644 --- a/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html +++ b/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: ip_lambert_conf_grid_mod::ip_lambert_conf_grid Type Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@

    @@ -76,17 +76,23 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    ip_lambert_conf_grid_mod::ip_lambert_conf_grid Type Reference
    +Public Member Functions | +Data Fields
    +
    ip_lambert_conf_grid_mod::ip_lambert_conf_grid Type Reference
    @@ -99,95 +105,98 @@
    - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +

    -Private Member Functions

    procedure field_pos
     Field position for a given grid point. More...
     
    procedure gdswzd => gdswzd_lambert_conf
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids. More...
     
    generic init => init_grib1, init_grib2
     Init subprogram. More...
     
    procedure init_grib1
     Initializes a gaussian grid given a grib1_descriptor object. More...
     
    procedure init_grib2
     Initializes a gaussian grid given a grib2_descriptor object. More...
     

    +Public Member Functions

    procedure field_pos (self, i, j)
     Field position for a given grid point.
     
    procedure gdswzd (self, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids.
     
    generic init init_grib1
     Init subprogram.
     
    generic init init_grib2
     Init subprogram.
     
    procedure init_grib1 (self, g1_desc)
     Initializes a gaussian grid given a grib1_descriptor object.
     
    procedure init_grib2 (self, g2_desc)
     Initializes a gaussian grid given a grib2_descriptor object.
     
    - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + +

    -Private Attributes

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor. More...

    +Data Fields

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor.
     
    real dxs
     x-direction grid length adjusted for scan mode. More...
    real dxs
     x-direction grid length adjusted for scan mode.
     
    real dys
     y-direction grid length adjusted for scan model. More...
    real dys
     y-direction grid length adjusted for scan model.
     
    real eccen_squared
     Eccentricity of the Earth squared (e^2). More...
    real eccen_squared
     Eccentricity of the Earth squared (e^2).
     
    real h
     Hemisphere flag. More...
    real h
     Hemisphere flag.
     
    integer im
     Number of x points. More...
    integer im
     Number of x points.
     
    integer irot
     vector rotation flag. More...
    integer irot
     vector rotation flag.
     
    integer iwrap
     x wraparound increment (0 if no wraparound). More...
    integer iwrap
     x wraparound increment (0 if no wraparound).
     
    integer jm
     Number of y points. More...
    integer jm
     Number of y points.
     
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound). More...
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound).
     
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound). More...
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound).
     
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind). More...
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind).
     
    integer nm
     Total number of points. More...
    integer nm
     Total number of points.
     
    integer nscan
    integer nscan
     
    integer nscan_field_pos
     nscan for field_pos routine. More...
    integer nscan_field_pos
     nscan for field_pos routine.
     
    real orient
     Longitude of meridian parallel to y-axis along which latitude increases at the latitude increases. More...
    real orient
     Longitude of meridian parallel to y-axis along which latitude increases at the latitude increases.
     
    real rerth
     Radius of the Earth. More...
    real rerth
     Radius of the Earth.
     
    real rlat1
     La1― latitude of first grid point. More...
    real rlat1
     La1― latitude of first grid point.
     
    real rlati1
     First latitude from the pole at which the secant cone cuts the sphere. More...
    real rlati1
     First latitude from the pole at which the secant cone cuts the sphere.
     
    real rlati2
     Second latitude from the pole at which the scant cone cuts the sphere. More...
    real rlati2
     Second latitude from the pole at which the scant cone cuts the sphere.
     
    real rlon1
     Lo1― longitude of first grid point. More...
    real rlon1
     Lo1― longitude of first grid point.
     

    Detailed Description

    Definition at line 24 of file ip_lambert_conf_grid_mod.F90.

    Member Function/Subroutine Documentation

    - -

    ◆ field_pos()

    + +

    ◆ field_pos()

    - -

    ◆ gdswzd()

    + +

    ◆ gdswzd()

    - - - - - -
    - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    procedure ip_lambert_conf_grid_mod::ip_lambert_conf_grid::gdswzdprocedure ip_lambert_conf_grid_mod::ip_lambert_conf_grid::gdswzd (class(ip_lambert_conf_grid), intent(in) self,
    integer, intent(in) iopt,
    integer, intent(in) npts,
    real, intent(in) fill,
    real, dimension(npts), intent(inout) xpts,
    real, dimension(npts), intent(inout) ypts,
    real, dimension(npts), intent(inout) rlon,
    real, dimension(npts), intent(inout) rlat,
    integer, intent(out) nret,
    real, dimension(npts), intent(out), optional crot,
    real, dimension(npts), intent(out), optional srot,
    real, dimension(npts), intent(out), optional xlon,
    real, dimension(npts), intent(out), optional xlat,
    real, dimension(npts), intent(out), optional ylon,
    real, dimension(npts), intent(out), optional ylat,
    real, dimension(npts), intent(out), optional area 
    )
    -
    -private

    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids.

    -
    Returns
    N/A
    +
    Returns
    N/A GDS wizard for lambert conformal conical.
    +

    This subprogram decodes the grib 2 grid definition template (passed in integer form as decoded by the ncep g2 library) and returns one of the following:

      +
    • (iopt=+1) earth coordinates of selected grid coordinates
    • +
    • (iopt=-1) grid coordinates of selected earth coordinates
    • +
    +

    Works for lambert conformal conical projections.

    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values.

    +

    The actual number of valid points computed is returned too.

    +

    Optionally, the vector rotations, map jacobians and grid box areas for this grid may be returned as well.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present. To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present. To compute the grid box areas the optional argument 'area' must be present.

    +

    +Program History Log

    + + + + + + + + + + + + + + + + + + + +
    Date Programmer Comments
    96-04-10 iredell Initial.
    96-10-01 iredell protected against unresolvable points
    97-10-20 iredell include map options
    1999-04-27 gilbert corrected minor error calculating variable an for the secant projection case (rlati1.ne.rlati2).
    2012-08-14 gayno fix problem with sh grids. Ensure grid box area always positive.
    2015-01-21 gayno merger of gdswiz03() and gdswzd03(). Make crot,sort,xlon,xlat,ylon,ylat and area optional arguments. Make part of a module. Move vector rotation, map jacobian and grid box area computations to separate subroutines.
    2015-07-13 gayno Convert to grib 2. Replace grib 1 kgds array with grib 2 grid definition template array. Rename routine.
    2018-07-20 wesley add threads.
    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]selfip_lambert_conf_grid object.
    [in]ioptoption flag
      +
    • 1 to compute earth coords of selected grid coords
    • +
    • -1 to compute grid coords of selected earth coords
    • +
    +
    [in]nptsmaximum number of coordinates
    [in]fillfill value to set invalid output data (must be impossible value; suggested value: -9999.)
    [in,out]xpts(npts) grid x point coordinates if iopt>0
    [in,out]ypts(npts) grid y point coordinates if iopt>0
    [in,out]rlon(npts) earth longitudes in degrees e if iopt<0 (acceptable range: -360. to 360.)
    [in,out]rlat(npts) earth latitudes in degrees n if iopt<0 (acceptable range: -90. to 90.)
    [out]nretnumber of valid points computed
    [out]crotoptional (npts) clockwise vector rotation cosines
    [out]srotoptional (npts) clockwise vector rotation sines (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlonoptional (npts) dx/dlon in 1/degrees
    [out]xlatoptional (npts) dx/dlat in 1/degrees
    [out]ylonoptional (npts) dy/dlon in 1/degrees
    [out]ylatoptional (npts) dy/dlat in 1/degrees
    [out]areaoptional (npts) area weights in m**2 (proportional to the square of the map factor)
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    +
    -

    Definition at line 41 of file ip_lambert_conf_grid_mod.F90.

    +

    Definition at line 44 of file ip_lambert_conf_grid_mod.F90.

    - -

    ◆ init()

    + +

    ◆ init() [1/2]

    - -

    ◆ init_grib1()

    + +

    ◆ init() [2/2]

    - -

    ◆ init_grib2()

    + +

    ◆ init_grib1()

    - - - - - -
    - + + + + + + + + + + + + + + + + +
    procedure ip_lambert_conf_grid_mod::ip_lambert_conf_grid::init_grib2procedure ip_lambert_conf_grid_mod::ip_lambert_conf_grid::init_grib1 (class(ip_lambert_conf_grid), intent(inout) self,
    type(grib1_descriptor), intent(in) g1_desc 
    )
    +
    + +

    Initializes a gaussian grid given a grib1_descriptor object.

    +
    Returns
    N/A Initializes a Lambert Conformal grid given a grib1_descriptor object.
    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g1_descA grib1_descriptor
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    +
    + +

    Definition at line 37 of file ip_lambert_conf_grid_mod.F90.

    + +
    + + +

    ◆ init_grib2()

    + +
    +
    + + + + + + + + + + + + + + + + +
    procedure ip_lambert_conf_grid_mod::ip_lambert_conf_grid::init_grib2 (class(ip_lambert_conf_grid), intent(inout) self,
    type(grib2_descriptor), intent(in) g2_desc 
    )
    -
    -private

    Initializes a gaussian grid given a grib2_descriptor object.

    -
    Returns
    N/A
    +
    Returns
    N/A Initializes a Lambert Conformal grid given a grib2_descriptor object.
    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g2_descA grib2_descriptor
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    +
    -

    Definition at line 38 of file ip_lambert_conf_grid_mod.F90.

    +

    Definition at line 40 of file ip_lambert_conf_grid_mod.F90.

    Field Documentation

    - -

    ◆ descriptor

    + +

    ◆ descriptor

    @@ -337,7 +586,7 @@

    -privateinherited +inherited

    @@ -348,24 +597,16 @@

    -

    ◆ dxs

    + +

    ◆ dxs

    - - - - - -
    real ip_lambert_conf_grid_mod::ip_lambert_conf_grid::dxs
    -
    -private

    x-direction grid length adjusted for scan mode.

    @@ -375,24 +616,16 @@

    -

    ◆ dys

    + +

    ◆ dys

    - - - - - -
    real ip_lambert_conf_grid_mod::ip_lambert_conf_grid::dys
    -
    -private

    y-direction grid length adjusted for scan model.

    @@ -402,8 +635,8 @@

    -

    ◆ eccen_squared

    + +

    ◆ eccen_squared

    @@ -417,7 +650,7 @@

    -privateinherited +inherited

    @@ -428,24 +661,16 @@

    -

    ◆ h

    + +

    ◆ h

    - - - - - -
    real ip_lambert_conf_grid_mod::ip_lambert_conf_grid::h
    -
    -private

    Hemisphere flag.

    @@ -455,8 +680,8 @@

    -

    ◆ im

    + +

    ◆ im

    @@ -470,7 +695,7 @@

    -privateinherited +inherited

    @@ -481,24 +706,16 @@

    -

    ◆ irot

    + +

    ◆ irot

    - - - - - -
    integer ip_lambert_conf_grid_mod::ip_lambert_conf_grid::irot
    -
    -private

    vector rotation flag.

    @@ -508,8 +725,8 @@

    -

    ◆ iwrap

    + +

    ◆ iwrap

    @@ -523,7 +740,7 @@

    -privateinherited +inherited

    @@ -534,8 +751,8 @@

    -

    ◆ jm

    + +

    ◆ jm

    @@ -549,7 +766,7 @@

    -privateinherited +inherited

    @@ -560,8 +777,8 @@

    -

    ◆ jwrap1

    + +

    ◆ jwrap1

    @@ -575,7 +792,7 @@

    -privateinherited +inherited

    @@ -586,8 +803,8 @@

    -

    ◆ jwrap2

    + +

    ◆ jwrap2

    @@ -601,7 +818,7 @@

    -privateinherited +inherited

    @@ -612,8 +829,8 @@

    -

    ◆ kscan

    + +

    ◆ kscan

    @@ -627,7 +844,7 @@

    -privateinherited +inherited

    @@ -638,8 +855,8 @@

    -

    ◆ nm

    + +

    ◆ nm

    @@ -653,7 +870,7 @@

    -privateinherited +inherited

    @@ -664,8 +881,8 @@

    -

    ◆ nscan

    + +

    ◆ nscan

    @@ -679,7 +896,7 @@

    -privateinherited +inherited

    @@ -699,8 +916,8 @@

    -

    ◆ nscan_field_pos

    + +

    ◆ nscan_field_pos

    @@ -714,7 +931,7 @@

    -privateinherited +inherited

    @@ -726,24 +943,16 @@

    -

    ◆ orient

    + +

    ◆ orient

    - - - - - -
    real ip_lambert_conf_grid_mod::ip_lambert_conf_grid::orient
    -
    -private

    Longitude of meridian parallel to y-axis along which latitude increases at the latitude increases.

    @@ -753,8 +962,8 @@

    -

    ◆ rerth

    + +

    ◆ rerth

    @@ -768,7 +977,7 @@

    -privateinherited +inherited

    @@ -779,24 +988,16 @@

    -

    ◆ rlat1

    + +

    ◆ rlat1

    - - - - - -
    real ip_lambert_conf_grid_mod::ip_lambert_conf_grid::rlat1
    -
    -private

    La1― latitude of first grid point.

    @@ -806,24 +1007,16 @@

    -

    ◆ rlati1

    + +

    ◆ rlati1

    - - - - - -
    real ip_lambert_conf_grid_mod::ip_lambert_conf_grid::rlati1
    -
    -private

    First latitude from the pole at which the secant cone cuts the sphere.

    @@ -833,24 +1026,16 @@

    -

    ◆ rlati2

    + +

    ◆ rlati2

    - - - - - -
    real ip_lambert_conf_grid_mod::ip_lambert_conf_grid::rlati2
    -
    -private

    Second latitude from the pole at which the scant cone cuts the sphere.

    @@ -860,24 +1045,16 @@

    -

    ◆ rlon1

    + +

    ◆ rlon1

    - - - - - -
    real ip_lambert_conf_grid_mod::ip_lambert_conf_grid::rlon1
    -
    -private

    Lo1― longitude of first grid point.

    @@ -896,7 +1073,7 @@

    diff --git a/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.js b/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.js index 68099979..f82e4061 100644 --- a/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.js +++ b/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.js @@ -1,10 +1,11 @@ var structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid = [ - [ "field_pos", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#ac071b3d3eca9a5fa88ff5dc211d19179", null ], - [ "gdswzd", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#aa69861340bc268b91a1076048ed489fc", null ], - [ "init", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a1f3fa40acb8c2ae4a65c00db21872d7c", null ], - [ "init_grib1", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a35dd86b4a9017f5b03a0a6a01eb4d370", null ], - [ "init_grib2", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a64129413df8ea478ab1360fd1a274e9a", null ], + [ "field_pos", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#ad0430873da72a0a81f9f1086d44dd415", null ], + [ "gdswzd", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a4fbf6d843796ecdb2d9516fd409cd4f9", null ], + [ "init", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a99982835dc866faae95d1d5d027e0d80", null ], + [ "init", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a6efe57f024c3d8ac77b5ecd8256c2bdf", null ], + [ "init_grib1", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a36be1740b8ec6bc374b8b2881033cd6c", null ], + [ "init_grib2", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#adfef5696d6e69b84a5ea448dc50b0b83", null ], [ "descriptor", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a4a2a0dab09f05931d12615b0ac74bc51", null ], [ "dxs", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#aa3288a7fbf2db34946116c771e5bc7dc", null ], [ "dys", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a46fa89562e4dd23c765029d2d6c087bc", null ], diff --git a/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.png b/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.png index a7f309bc4104a6e901fbe30c915444dbed6cba45..98ed020198eefdb2805b75806c1e7c45cf535d1b 100644 GIT binary patch literal 850 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y&012~w0^xpqYeZ_}|56+$x$FX*c=w+7mk@}a{{+%9`?VGiBD|_f9AB)-QXwwJZnvoE{&vaIrc1ADLQ!X@*BO4^HhJuX?a@pX#1^We|yq&cjWw-)!F4Bk;`97 zr2ie)FHF$#ymj_xRa@DPzhBBbG&MZe-vHV7y!q~C_hyx^76wyQ-ahlOo%H26$XFB) zIr^{Ns=M7j{42~Knx-%dOsZmV3gUP0 zc*V%!Y0IFvl3hXND?`f?xrPZ>D3Sbh`^%IduOKf?Ta9gVZ+x3}CHc1E%H!LdgZgvZ zm&o1boB1_Ir*z9(=}miMmRc)DUH(>d_9C};_wMHtq{_H9yyY$YQoMBS?&T&<`SI<| z^?%IRrgMIO__6Hk5fdxh;_4Ni7SAL%-z{FRHD`LnCX>6xp_#q&RvuZpBJclr-6TY0VA>-RR_OSF`GrfywzYjXDHPs_b$e>K^a`|`&vWIus;Zgs&(9zK{yAIruf+e1xP7x;RVq(WnR{$$ z)ivGgyxFgRMSa_?skQg)g=V03lXYw7-JO@U>)hLyRrk47J(nliP7+B1;-bShFVE52 zIPcQ$I1Nv$UhBMdt>2#Ax^u-m{HqKfP+j57d5H)AR|u=OOdE$(o|>wYgS?bI7}ypZN3kL0^5saW4C`ww zQ_`(|GnTnzGd;aomG7gwZeDPag$Ba{<#&H$vP!@D>|bs9`TWmE@yB%R<(TK4?Z2LN z?AESxGu2HQ=VzatfBr^j+if9LuVCBqrPp3W2J3jPeS4nsbi>k}^7qf(EW4u<@YUq! zdheXTRfXS|UJE;Kmv(Y%XMC7U-+kWP;ydgw!(RgJe7kjCdTW`bPHXk*dFPjW3-S+r zx%fc&tDgZ`?dRtGv*6I$ar^!Y`- - + - - + + NCEPLIBS-ip: ip_mercator_grid_mod::ip_mercator_grid Type Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@

    @@ -76,17 +76,23 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    ip_mercator_grid_mod::ip_mercator_grid Type Reference
    +Public Member Functions | +Data Fields
    +
    ip_mercator_grid_mod::ip_mercator_grid Type Reference
    @@ -99,89 +105,92 @@
    - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +

    -Private Member Functions

    procedure field_pos
     Field position for a given grid point. More...
     
    procedure gdswzd => gdswzd_mercator
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids. More...
     
    generic init => init_grib1, init_grib2
     Init subprogram. More...
     
    procedure init_grib1
     Initializes a gaussian grid given a grib1_descriptor object. More...
     
    procedure init_grib2
     Initializes a gaussian grid given a grib2_descriptor object. More...
     

    +Public Member Functions

    procedure field_pos (self, i, j)
     Field position for a given grid point.
     
    procedure gdswzd (self, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids.
     
    generic init init_grib1
     Init subprogram.
     
    generic init init_grib2
     Init subprogram.
     
    procedure init_grib1 (self, g1_desc)
     Initializes a gaussian grid given a grib1_descriptor object.
     
    procedure init_grib2 (self, g2_desc)
     Initializes a gaussian grid given a grib2_descriptor object.
     
    - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + +

    -Private Attributes

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor. More...

    +Data Fields

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor.
     
    real dlon
     Longitudinal direction grid length. More...
    real dlon
     Longitudinal direction grid length.
     
    real dphi
     Latitudinal direction grid length. More...
    real dphi
     Latitudinal direction grid length.
     
    real eccen_squared
     Eccentricity of the Earth squared (e^2). More...
    real eccen_squared
     Eccentricity of the Earth squared (e^2).
     
    real hi
     Scan mode in the 'i' direction. More...
    real hi
     Scan mode in the 'i' direction.
     
    integer im
     Number of x points. More...
    integer im
     Number of x points.
     
    integer iwrap
     x wraparound increment (0 if no wraparound). More...
    integer iwrap
     x wraparound increment (0 if no wraparound).
     
    integer jm
     Number of y points. More...
    integer jm
     Number of y points.
     
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound). More...
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound).
     
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound). More...
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound).
     
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind). More...
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind).
     
    integer nm
     Total number of points. More...
    integer nm
     Total number of points.
     
    integer nscan
    integer nscan
     
    integer nscan_field_pos
     nscan for field_pos routine. More...
    integer nscan_field_pos
     nscan for field_pos routine.
     
    real rerth
     Radius of the Earth. More...
    real rerth
     Radius of the Earth.
     
    real rlat1
     Latitude of first grid point. More...
    real rlat1
     Latitude of first grid point.
     
    real rlati
     Latitude at which the Mercator projection intersects the Earth. More...
    real rlati
     Latitude at which the Mercator projection intersects the Earth.
     
    real rlon1
     Longitude of first grid point. More...
    real rlon1
     Longitude of first grid point.
     
    real rlon2
     Longitude of last grid point. More...
    real rlon2
     Longitude of last grid point.
     

    Detailed Description

    Definition at line 22 of file ip_mercator_grid_mod.F90.

    Member Function/Subroutine Documentation

    - -

    ◆ field_pos()

    + +

    ◆ field_pos()

    - -

    ◆ gdswzd()

    + +

    ◆ gdswzd()

    - - - - - -
    - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    procedure ip_mercator_grid_mod::ip_mercator_grid::gdswzdprocedure ip_mercator_grid_mod::ip_mercator_grid::gdswzd (class(ip_mercator_grid), intent(in) self,
    integer, intent(in) iopt,
    integer, intent(in) npts,
    real, intent(in) fill,
    real, dimension(npts), intent(inout) xpts,
    real, dimension(npts), intent(inout) ypts,
    real, dimension(npts), intent(inout) rlon,
    real, dimension(npts), intent(inout) rlat,
    integer, intent(out) nret,
    real, dimension(npts), intent(out), optional crot,
    real, dimension(npts), intent(out), optional srot,
    real, dimension(npts), intent(out), optional xlon,
    real, dimension(npts), intent(out), optional xlat,
    real, dimension(npts), intent(out), optional ylon,
    real, dimension(npts), intent(out), optional ylat,
    real, dimension(npts), intent(out), optional area 
    )
    -
    -private

    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids.

    -
    Returns
    N/A gdswzd()
    -
    -N/A
    +
    Returns
    N/A GDS wizard for mercator cylindrical.
    +

    This routine decodes the grib 2 grid definition template (passed in integer form as decoded by the ncep g2 library) and returns one of the following:

      +
    • (iopt=+1) earth coordinates of selected grid coordinates
    • +
    • (iopt=-1) grid coordinates of selected earth coordinates
    • +
    +

    Works for mercator cylindrical projections.

    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values.

    +

    The actual number of valid points computed is returned too.

    +

    Optionally, the vector rotations, map jacobians and the grid box areas may be returned. To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present. To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present. to compute the grid box areas, the optional argument 'area' must be present.

    +

    +Program History Log

    + + + + + + + + + + + + + + + +
    Date Programmer Comments
    96-04-10 iredell Initial
    96-10-01 iredell protected against unresolvable points
    97-10-20 iredell include map options
    2015-01-21 gayno merger of gdswiz01() and gdswzd01(). Make crot,sort,xlon,xlat,ylon,ylat and area optional arguments. Make part of a module. move vector rotation, map jacobian and grid box area computations to separate subroutines.
    2015-07-13 gayno convert to grib 2. replace grib 1 kgds array with grib 2 grid definition template array. Rename.
    2018-07-20 wesley add threads.
    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]selfgrid descriptor.
    [in]ioptoption flag
      +
    • 1 to compute earth coords of selected grid coords
    • +
    • -1 to compute grid coords of selected earth coords
    • +
    +
    [in]nptsmaximum number of coordinates
    [in]fillfill value to set invalid output data (must be impossible value; suggested value: -9999.)
    [in,out]xpts(npts) grid x point coordinates if iopt>0
    [in,out]ypts(npts) grid y point coordinates if iopt>0
    [in,out]rlon(npts) earth longitudes in degrees e if iopt<0 (acceptable range: -360. to 360.)
    [in,out]rlat(npts) earth latitudes in degrees n if iopt<0 (acceptable range: -90. to 90.)
    [out]nretnumber of valid points computed
    [out]crotoptional (npts) clockwise vector rotation cosines
    [out]srotoptional (npts) clockwise vector rotation sines (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlonoptional (npts) dx/dlon in 1/degrees
    [out]xlatoptional (npts) dx/dlat in 1/degrees
    [out]ylonoptional (npts) dy/dlon in 1/degrees
    [out]ylatoptional (npts) dy/dlat in 1/degrees
    [out]areaoptional (npts) area weights in m**2 (proportional to the square of the map factor)
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    -

    Definition at line 37 of file ip_mercator_grid_mod.F90.

    +

    Definition at line 40 of file ip_mercator_grid_mod.F90.

    - -

    ◆ init()

    + +

    ◆ init() [1/2]

    - -

    ◆ init_grib1()

    + +

    ◆ init() [2/2]

    - -

    ◆ init_grib2()

    + +

    ◆ init_grib1()

    - - - - - -
    - + + + + + + + + + + + + + + + + +
    procedure ip_mercator_grid_mod::ip_mercator_grid::init_grib2procedure ip_mercator_grid_mod::ip_mercator_grid::init_grib1 (class(ip_mercator_grid), intent(inout) self,
    type(grib1_descriptor), intent(in) g1_desc 
    )
    +
    + +

    Initializes a gaussian grid given a grib1_descriptor object.

    +
    Returns
    N/A Initializes a mercator grid given a grib1_descriptor object.
    +
    Parameters
    + + + +
    [in,out]selfip_mercator_grid object.
    [in]g1_descGRIB1 descriptor.
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    +
    + +

    Definition at line 33 of file ip_mercator_grid_mod.F90.

    + +
    + + +

    ◆ init_grib2()

    + +
    +
    + + + + + + + + + + + + + + + + +
    procedure ip_mercator_grid_mod::ip_mercator_grid::init_grib2 (class(ip_mercator_grid), intent(inout) self,
    type(grib2_descriptor), intent(in) g2_desc 
    )
    -
    -private

    Initializes a gaussian grid given a grib2_descriptor object.

    -
    Returns
    N/A
    +
    Returns
    N/A Init GRIB2.
    +
    Parameters
    + + + +
    [in,out]selfip_mercator_grid object.
    [in]g2_descGRIB2 descriptor.
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    +
    -

    Definition at line 34 of file ip_mercator_grid_mod.F90.

    +

    Definition at line 36 of file ip_mercator_grid_mod.F90.

    Field Documentation

    - -

    ◆ descriptor

    + +

    ◆ descriptor

    @@ -333,7 +574,7 @@

    -privateinherited +inherited

    @@ -344,24 +585,16 @@

    -

    ◆ dlon

    + +

    ◆ dlon

    - - - - - -
    real ip_mercator_grid_mod::ip_mercator_grid::dlon
    -
    -private

    Longitudinal direction grid length.

    @@ -371,24 +604,16 @@

    -

    ◆ dphi

    + +

    ◆ dphi

    - - - - - -
    real ip_mercator_grid_mod::ip_mercator_grid::dphi
    -
    -private

    Latitudinal direction grid length.

    @@ -398,8 +623,8 @@

    -

    ◆ eccen_squared

    + +

    ◆ eccen_squared

    @@ -413,7 +638,7 @@

    -privateinherited +inherited

    @@ -424,24 +649,16 @@

    -

    ◆ hi

    + +

    ◆ hi

    - - - - - -
    real ip_mercator_grid_mod::ip_mercator_grid::hi
    -
    -private

    Scan mode in the 'i' direction.

    @@ -451,8 +668,8 @@

    -

    ◆ im

    + +

    ◆ im

    @@ -466,7 +683,7 @@

    -privateinherited +inherited

    @@ -477,8 +694,8 @@

    -

    ◆ iwrap

    + +

    ◆ iwrap

    @@ -492,7 +709,7 @@

    -privateinherited +inherited

    @@ -503,8 +720,8 @@

    -

    ◆ jm

    + +

    ◆ jm

    @@ -518,7 +735,7 @@

    -privateinherited +inherited

    @@ -529,8 +746,8 @@

    -

    ◆ jwrap1

    + +

    ◆ jwrap1

    @@ -544,7 +761,7 @@

    -privateinherited +inherited

    @@ -555,8 +772,8 @@

    -

    ◆ jwrap2

    + +

    ◆ jwrap2

    @@ -570,7 +787,7 @@

    -privateinherited +inherited

    @@ -581,8 +798,8 @@

    -

    ◆ kscan

    + +

    ◆ kscan

    @@ -596,7 +813,7 @@

    -privateinherited +inherited

    @@ -607,8 +824,8 @@

    -

    ◆ nm

    + +

    ◆ nm

    @@ -622,7 +839,7 @@

    -privateinherited +inherited

    @@ -633,8 +850,8 @@

    -

    ◆ nscan

    + +

    ◆ nscan

    @@ -648,7 +865,7 @@

    -privateinherited +inherited

    @@ -668,8 +885,8 @@

    -

    ◆ nscan_field_pos

    + +

    ◆ nscan_field_pos

    @@ -683,7 +900,7 @@

    -privateinherited +inherited

    @@ -695,8 +912,8 @@

    -

    ◆ rerth

    + +

    ◆ rerth

    @@ -710,7 +927,7 @@

    -privateinherited +inherited

    @@ -721,24 +938,16 @@

    -

    ◆ rlat1

    + +

    ◆ rlat1

    - - - - - -
    real ip_mercator_grid_mod::ip_mercator_grid::rlat1
    -
    -private

    Latitude of first grid point.

    @@ -748,24 +957,16 @@

    -

    ◆ rlati

    + +

    ◆ rlati

    - - - - - -
    real ip_mercator_grid_mod::ip_mercator_grid::rlati
    -
    -private

    Latitude at which the Mercator projection intersects the Earth.

    @@ -775,24 +976,16 @@

    -

    ◆ rlon1

    + +

    ◆ rlon1

    - - - - - -
    real ip_mercator_grid_mod::ip_mercator_grid::rlon1
    -
    -private

    Longitude of first grid point.

    @@ -802,24 +995,16 @@

    -

    ◆ rlon2

    + +

    ◆ rlon2

    - - - - - -
    real ip_mercator_grid_mod::ip_mercator_grid::rlon2
    -
    -private

    Longitude of last grid point.

    @@ -838,7 +1023,7 @@

    diff --git a/structip__mercator__grid__mod_1_1ip__mercator__grid.js b/structip__mercator__grid__mod_1_1ip__mercator__grid.js index 8852aa25..da01e292 100644 --- a/structip__mercator__grid__mod_1_1ip__mercator__grid.js +++ b/structip__mercator__grid__mod_1_1ip__mercator__grid.js @@ -1,10 +1,11 @@ var structip__mercator__grid__mod_1_1ip__mercator__grid = [ - [ "field_pos", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#ac071b3d3eca9a5fa88ff5dc211d19179", null ], - [ "gdswzd", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a940420aa99e0fbe51a976f9d0c343f1a", null ], - [ "init", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a1f3fa40acb8c2ae4a65c00db21872d7c", null ], - [ "init_grib1", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a3ae3bbb47f4c03c36404a2b35014d65c", null ], - [ "init_grib2", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a505b0114c7ff5fbb58c4e7ce5ccde3f0", null ], + [ "field_pos", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#ad0430873da72a0a81f9f1086d44dd415", null ], + [ "gdswzd", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#aac84596473d43673fa523f658f934f3d", null ], + [ "init", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a99982835dc866faae95d1d5d027e0d80", null ], + [ "init", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a6efe57f024c3d8ac77b5ecd8256c2bdf", null ], + [ "init_grib1", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a819d01342cfb040b9e67f61d258cca59", null ], + [ "init_grib2", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a34194cbd2cbec84f1b04cb8ade644f44", null ], [ "descriptor", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a4a2a0dab09f05931d12615b0ac74bc51", null ], [ "dlon", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a455057778c7f2ad677956bdef2d754ee", null ], [ "dphi", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a39168528a2c207b2e2c5373487d705c5", null ], diff --git a/structip__mercator__grid__mod_1_1ip__mercator__grid.png b/structip__mercator__grid__mod_1_1ip__mercator__grid.png index 942758ef6eadebc68ec7533124a31dbd219e687f..1e1e2b259fb5aeb2986e509862d653060efe0215 100644 GIT binary patch delta 685 zcmV;e0#g041;quBB!3%FOjJex|Nj600O;)Xb&tZQI4~)27?;fGz`(%&|Nm2x)2ILd z010$bPE!E?|NsC0|Ns9t0-MwT00K}+L_t(|0qvd9j;k;XL??q(&HsP#1(tvVlnpJg zx{gpd-n42w{@+ObC;tXTBFsB>9dhcz-x&iGH7oB#(J!hbx6i z@;CloxUV2F**f~cFdRO|^Uo>I9_Npjr&F=RCsL8*d9D%8681vAnum+QEWJdFsgDktHX>(Mk zBFXby@*dt6@qcky7p5Y~Ef)&+TQ>adKWRBgl1EgeBFWFWV~1yRPdR0s#Jm7XY+GYr?NrW5%rs_r7fzHzyoj8UTC~!T{iz5C#Cx zgfIYjCWHaNGa(EBo(W+9@Jt8;fM-G&06Y`I0N|Mr27dt0gfIYjCWHat2~tX_C6FYk z9YR==JQKo_R}m z${T1KG=KMw;W%p%eWHdM;o)zU^XJlo!k5)hxx+R|k>|l3zNUtQXZYRiwEz5+_gOi2 z^>D3I6vB7caMY#eWVs32-a7U_+ab-$+#%;)vZGLTX>;6MgMANw^*)qjj*nB_Uc**+ z><{+eEJ-!wg{!-(3`)`wch+#*4u4eYQ#Dv&NhWen2uqS@LRgYK(+j7RQbYU$dz8kj Txu?sU00000NkvXXu0mjfYR^wh delta 665 zcmX@gx{-B)O1(sYPl)UP|Nj{n7+$>jTH1eT0+0p92M!!y?YtuoJlm|Y+(rr0exRNWLYzB9pV(yg6t7G6)(AKk3jA*J%tG%6-)CP*-&%{=tko2Hk$ zySFW!w4@AZ%d8hcKPn!IuKu$3gH*1!s^{A~x0Z^Z(wm#}S#NIb>R`_x>*;&izq{7N zTx(saQlELg_0Z!fzVjbX6>FYU;^wO5`D>1K+736LNqsvErmDQ%=@K#NpE%s{ffYdi zC^P(P5qI$aqV}h%H0{pp4=-*{FDyTFZz*HW<3kM73KJPl?=WacjgdHDq{ovWDbBW` zhnqR#SSusY|H#r0IGs4^7pikG{CxlwS9$2ar(QmIs*UUX6%SWSu9J(>(*?)zOY%kPP8jJ>Aw%Z0bK;LN~U{l+DTfgJ4m)D#-m2KXgJ$sSBzTIt`_2y1Gsy5^MwVnT;${I;aTBp2H zW#>wrer})n^$nVA54i07N~?LRAMUh&Qg7_QTlnDFORZ*x^gEGjgJevkgWDK6JelF{r5}E)lVL$Bv diff --git a/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html b/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html index e96e0fc3..a2dae5c5 100644 --- a/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html +++ b/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: ip_polar_stereo_grid_mod::ip_polar_stereo_grid Type Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@

    @@ -76,17 +76,23 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    ip_polar_stereo_grid_mod::ip_polar_stereo_grid Type Reference
    +Public Member Functions | +Data Fields
    +
    ip_polar_stereo_grid_mod::ip_polar_stereo_grid Type Reference
    @@ -99,95 +105,98 @@
    - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +

    -Private Member Functions

    procedure field_pos
     Field position for a given grid point. More...
     
    procedure gdswzd => gdswzd_polar_stereo
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1). More...
     
    generic init => init_grib1, init_grib2
     Init subprogram. More...
     
    procedure init_grib1
     Initializes a grid given a grib1_descriptor object. More...
     
    procedure init_grib2
     Initializes a grid given a grib2_descriptor object. More...
     

    +Public Member Functions

    procedure field_pos (self, i, j)
     Field position for a given grid point.
     
    procedure gdswzd (self, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1).
     
    generic init init_grib1
     Init subprogram.
     
    generic init init_grib2
     Init subprogram.
     
    procedure init_grib1 (self, g1_desc)
     Initializes a grid given a grib1_descriptor object.
     
    procedure init_grib2 (self, g2_desc)
     Initializes a grid given a grib2_descriptor object.
     
    - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + +

    -Private Attributes

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor. More...

    +Data Fields

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor.
     
    real dxs
     'x'-direction grid length, adjusted by the scanning mode. More...
    real dxs
     'x'-direction grid length, adjusted by the scanning mode.
     
    real dys
     'y'-direction grid length, adjusted by the scanning mode. More...
    real dys
     'y'-direction grid length, adjusted by the scanning mode.
     
    real eccen_squared
     Eccentricity of the Earth squared (e^2). More...
    real eccen_squared
     Eccentricity of the Earth squared (e^2).
     
    logical elliptical
     When true/false, computations are based on an elliptical/spherical earth. More...
    logical elliptical
     When true/false, computations are based on an elliptical/spherical earth.
     
    real h
     Hemisphere flag. More...
    real h
     Hemisphere flag.
     
    integer im
     Number of x points. More...
    integer im
     Number of x points.
     
    integer irot
     Rotation flag. More...
    integer irot
     Rotation flag.
     
    integer iwrap
     x wraparound increment (0 if no wraparound). More...
    integer iwrap
     x wraparound increment (0 if no wraparound).
     
    integer jm
     Number of y points. More...
    integer jm
     Number of y points.
     
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound). More...
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound).
     
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound). More...
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound).
     
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind). More...
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind).
     
    integer nm
     Total number of points. More...
    integer nm
     Total number of points.
     
    integer nscan
    integer nscan
     
    integer nscan_field_pos
     nscan for field_pos routine. More...
    integer nscan_field_pos
     nscan for field_pos routine.
     
    real orient
     Orientation longitude. More...
    real orient
     Orientation longitude.
     
    real rerth
     Radius of the Earth. More...
    real rerth
     Radius of the Earth.
     
    real rlat1
     Latitude of the first grid point. More...
    real rlat1
     Latitude of the first grid point.
     
    real rlon1
     Longitude of the first grid point. More...
    real rlon1
     Longitude of the first grid point.
     
    real slatr
     Standard latitude of grid in radians. More...
    real slatr
     Standard latitude of grid in radians.
     

    Detailed Description

    Definition at line 23 of file ip_polar_stereo_grid_mod.F90.

    Member Function/Subroutine Documentation

    - -

    ◆ field_pos()

    + +

    ◆ field_pos()

    - -

    ◆ gdswzd()

    + +

    ◆ gdswzd()

    - - - - - -
    - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    procedure ip_polar_stereo_grid_mod::ip_polar_stereo_grid::gdswzdprocedure ip_polar_stereo_grid_mod::ip_polar_stereo_grid::gdswzd (class(ip_polar_stereo_grid), intent(in) self,
    integer, intent(in) iopt,
    integer, intent(in) npts,
    real, intent(in) fill,
    real, dimension(npts), intent(inout) xpts,
    real, dimension(npts), intent(inout) ypts,
    real, dimension(npts), intent(inout) rlon,
    real, dimension(npts), intent(inout) rlat,
    integer, intent(out) nret,
    real, dimension(npts), intent(out), optional crot,
    real, dimension(npts), intent(out), optional srot,
    real, dimension(npts), intent(out), optional xlon,
    real, dimension(npts), intent(out), optional xlat,
    real, dimension(npts), intent(out), optional ylon,
    real, dimension(npts), intent(out), optional ylat,
    real, dimension(npts), intent(out), optional area 
    )
    -
    -private

    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1).

    -
    Returns
    N/A
    +
    Returns
    N/A GDS wizard for polar stereographic azimuthal.
    +

    This subprogram decodes the grib 2 grid definition template (passed in integer form as decoded by the ncep g2 library) and returns one of the following:

      +
    • (iopt=+1) earth coordinates of selected grid coordinates
    • +
    • (iopt=-1) grid coordinates of selected earth coordinates
    • +
    +

    Works for polar stereographic azimuthal projections.

    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values.

    +

    The actual number of valid points computed is returned too.

    +

    Optionally, the vector rotations, map jacobians, and grid box areas may be returned as well. Routine works for both spherical and elliptical earths with the exception of the map jacobians and grid box areas, which are only computed for spherical earths.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present. To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present. to compute the grid box areas, the optional argument 'area' must be present.

    +

    +Program History Log

    + + + + + + + + + + + + + + + +
    Date Programmer Comments
    96-04-10 iredell Initial
    97-10-20 iredell include map options
    09-05-13 gayno ensure area always positive
    2015-01-21 gayno merger of gdswiz05 and gdswzd05. make crot,sort,xlon,xlat,ylon,ylat and area optional arguments. make part of a module. move vector rotation, map jacobian and grid box area computations to separate subroutines. include option for elliptical earths.
    2015-07-13 gayno convert to grib 2. replace grib 1 kgds array with grib 2 grid definition template array. rename routine.
    2018-07-20 wesley add threading.
    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]selfgrid
    [in]ioptoption flag
      +
    • 1 to compute earth coords of selected grid coords
    • +
    • -1 to compute grid coords of selected earth coords
    • +
    +
    [in]nptsmaximum number of coordinates
    [in]fillfill value to set invalid output data (must be impossible value; suggested value: -9999.)
    [in,out]xpts(npts) grid x point coordinates if iopt>0
    [in,out]ypts(npts) grid y point coordinates if iopt>0
    [in,out]rlon(npts) earth longitudes in degrees e if iopt<0 (acceptable range: -360. to 360.)
    [in,out]rlat(npts) earth latitudes in degrees n if iopt<0 (acceptable range: -90. to 90.)
    [out]nretnumber of valid points computed
    [out]crotoptional (npts) clockwise vector rotation cosines
    [out]srotoptional (npts) clockwise vector rotation sines (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlonoptional (npts) dx/dlon in 1/degrees
    [out]xlatoptional (npts) dx/dlat in 1/degrees
    [out]ylonoptional (npts) dy/dlon in 1/degrees
    [out]ylatoptional (npts) dy/dlat in 1/degrees
    [out]areaoptional (npts) area weights in m**2 (proportional to the square of the map factor)
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    -

    Definition at line 41 of file ip_polar_stereo_grid_mod.F90.

    +

    Definition at line 46 of file ip_polar_stereo_grid_mod.F90.

    - -

    ◆ init()

    + +

    ◆ init() [1/2]

    - -

    ◆ init_grib1()

    + +

    ◆ init() [2/2]

    - -

    ◆ init_grib2()

    + +

    ◆ init_grib1()

    - - - - - -
    - + + + + + + + + + + + + + + + + +
    procedure ip_polar_stereo_grid_mod::ip_polar_stereo_grid::init_grib2procedure ip_polar_stereo_grid_mod::ip_polar_stereo_grid::init_grib1 (class(ip_polar_stereo_grid), intent(inout) self,
    type(grib1_descriptor), intent(in) g1_desc 
    )
    +
    + +

    Initializes a grid given a grib1_descriptor object.

    +
    Returns
    N/A Initializes a polar stereographic grid given a grib1_descriptor object.
    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g1_descA grib1_descriptor
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    +
    + +

    Definition at line 39 of file ip_polar_stereo_grid_mod.F90.

    + +
    + + +

    ◆ init_grib2()

    + +
    +
    + + + + + + + + + + + + + + + + +
    procedure ip_polar_stereo_grid_mod::ip_polar_stereo_grid::init_grib2 (class(ip_polar_stereo_grid), intent(inout) self,
    type(grib2_descriptor), intent(in) g2_desc 
    )
    -
    -private

    Initializes a grid given a grib2_descriptor object.

    -
    Returns
    N/A
    +
    Returns
    N/A Initializes a polar stereographic grid given a grib2_descriptor object.
    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g2_descA grib2_descriptor
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    +
    -

    Definition at line 38 of file ip_polar_stereo_grid_mod.F90.

    +

    Definition at line 42 of file ip_polar_stereo_grid_mod.F90.

    Field Documentation

    - -

    ◆ descriptor

    + +

    ◆ descriptor

    @@ -337,7 +581,7 @@

    -privateinherited +inherited

    @@ -348,24 +592,16 @@

    -

    ◆ dxs

    + +

    ◆ dxs

    - - - - - -
    real ip_polar_stereo_grid_mod::ip_polar_stereo_grid::dxs
    -
    -private

    'x'-direction grid length, adjusted by the scanning mode.

    @@ -374,24 +610,16 @@

    -

    ◆ dys

    + +

    ◆ dys

    - - - - - -
    real ip_polar_stereo_grid_mod::ip_polar_stereo_grid::dys
    -
    -private

    'y'-direction grid length, adjusted by the scanning mode.

    @@ -400,8 +628,8 @@

    -

    ◆ eccen_squared

    + +

    ◆ eccen_squared

    @@ -415,7 +643,7 @@

    -privateinherited +inherited

    @@ -426,24 +654,16 @@

    -

    ◆ elliptical

    + +

    ◆ elliptical

    - - - - - -
    logical ip_polar_stereo_grid_mod::ip_polar_stereo_grid::elliptical
    -
    -private

    When true/false, computations are based on an elliptical/spherical earth.

    @@ -452,24 +672,16 @@

    -

    ◆ h

    + +

    ◆ h

    - - - - - -
    real ip_polar_stereo_grid_mod::ip_polar_stereo_grid::h
    -
    -private

    Hemisphere flag.

    @@ -479,8 +691,8 @@

    -

    ◆ im

    + +

    ◆ im

    @@ -494,7 +706,7 @@

    -privateinherited +inherited

    @@ -505,24 +717,16 @@

    -

    ◆ irot

    + +

    ◆ irot

    - - - - - -
    integer ip_polar_stereo_grid_mod::ip_polar_stereo_grid::irot
    -
    -private

    Rotation flag.

    @@ -532,8 +736,8 @@

    -

    ◆ iwrap

    + +

    ◆ iwrap

    @@ -547,7 +751,7 @@

    -privateinherited +inherited

    @@ -558,8 +762,8 @@

    -

    ◆ jm

    + +

    ◆ jm

    @@ -573,7 +777,7 @@

    -privateinherited +inherited

    @@ -584,8 +788,8 @@

    -

    ◆ jwrap1

    + +

    ◆ jwrap1

    @@ -599,7 +803,7 @@

    -privateinherited +inherited

    @@ -610,8 +814,8 @@

    -

    ◆ jwrap2

    + +

    ◆ jwrap2

    @@ -625,7 +829,7 @@

    -privateinherited +inherited

    @@ -636,8 +840,8 @@

    -

    ◆ kscan

    + +

    ◆ kscan

    @@ -651,7 +855,7 @@

    -privateinherited +inherited

    @@ -662,8 +866,8 @@

    -

    ◆ nm

    + +

    ◆ nm

    @@ -677,7 +881,7 @@

    -privateinherited +inherited

    @@ -688,8 +892,8 @@

    -

    ◆ nscan

    + +

    ◆ nscan

    @@ -703,7 +907,7 @@

    -privateinherited +inherited

    @@ -723,8 +927,8 @@

    -

    ◆ nscan_field_pos

    + +

    ◆ nscan_field_pos

    @@ -738,7 +942,7 @@

    -privateinherited +inherited

    @@ -750,24 +954,16 @@

    -

    ◆ orient

    + +

    ◆ orient

    - - - - - -
    real ip_polar_stereo_grid_mod::ip_polar_stereo_grid::orient
    -
    -private

    Orientation longitude.

    @@ -776,8 +972,8 @@

    -

    ◆ rerth

    + +

    ◆ rerth

    @@ -791,7 +987,7 @@

    -privateinherited +inherited

    @@ -802,24 +998,16 @@

    -

    ◆ rlat1

    + +

    ◆ rlat1

    - - - - - -
    real ip_polar_stereo_grid_mod::ip_polar_stereo_grid::rlat1
    -
    -private

    Latitude of the first grid point.

    @@ -828,24 +1016,16 @@

    -

    ◆ rlon1

    + +

    ◆ rlon1

    - - - - - -
    real ip_polar_stereo_grid_mod::ip_polar_stereo_grid::rlon1
    -
    -private

    Longitude of the first grid point.

    @@ -854,24 +1034,16 @@

    -

    ◆ slatr

    + +

    ◆ slatr

    - - - - - -
    real ip_polar_stereo_grid_mod::ip_polar_stereo_grid::slatr
    -
    -private

    Standard latitude of grid in radians.

    @@ -889,7 +1061,7 @@

    diff --git a/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.js b/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.js index 32b6b141..81f8117a 100644 --- a/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.js +++ b/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.js @@ -1,10 +1,11 @@ var structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid = [ - [ "field_pos", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#ac071b3d3eca9a5fa88ff5dc211d19179", null ], - [ "gdswzd", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a9e97b7352e67dd629f622f292cf0ca21", null ], - [ "init", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a1f3fa40acb8c2ae4a65c00db21872d7c", null ], - [ "init_grib1", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#ae2a5a7c08e4578f3d0ff6b85e5a14cce", null ], - [ "init_grib2", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a9622ce9892084b52303f27722572b87c", null ], + [ "field_pos", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#ad0430873da72a0a81f9f1086d44dd415", null ], + [ "gdswzd", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#ad71855b6293dc7be0d8ff418cad9e7d3", null ], + [ "init", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a99982835dc866faae95d1d5d027e0d80", null ], + [ "init", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a6efe57f024c3d8ac77b5ecd8256c2bdf", null ], + [ "init_grib1", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#adcabd864f1c2d0ea18dfa0ffa3e3ecaf", null ], + [ "init_grib2", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a591d405c9ad8520a7030154e627bc461", null ], [ "descriptor", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a4a2a0dab09f05931d12615b0ac74bc51", null ], [ "dxs", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#ac009bce0c0c14b3e0970da6c032a11b1", null ], [ "dys", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a95e155383895ad3f56a3876877b5896b", null ], diff --git a/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.png b/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.png index b5c2a91e3b1113ff41d78ddf52416d3a6d52a9e6..6d0bca7fee8851e8f76a8324cbce93eaf4175c46 100644 GIT binary patch literal 843 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y!~12~w0^xpqYea{~o5+_fJ<5;^zRG2CI+Ub<+|4Xk$O^(Wrb)LG!Wl~j8uS)9@DNim> z(@7$evQ#vmsF=D=nrFxs-xs;)|9r1Wbq88wHwX8s)EhRXR%e#4cy?p1*Cf72DyE5( z|Nmg+^HKG*wv0Y|fo=Q#3fCD;lfHDxu2gxMV0X>5TErvhNaISCO!en0CoZw~g&Dol zZITnnV?0?|YfV>fy(Y@Azg@q9CBb(UW5Y+EALpuR++VL}MA zz@#h&ryyPjk5!Buo~8_nKqV?y8Crk}D3H9rblH@kNkLwb&Kutz*;XCYo7=ub>NcOJ z={DI(Svl4zVV`>!hCeKS`fgTXUtHLYd+RJWHO2P7^{t9a%)Kr$UF~LxY0ihoAC7O2 zPLM3A&iN;ieEGZC?c68I=PTZAvPsKdma%BM=(UwIxnd^u2XDWB%jmg-bo9Iz_x^pn zGij@DasBPOO-cI4Ra?KtZmwFke!1Fp@QU8BScY~v>Dl+l?yMWk< zZ@J8JS>Bon=dpa=B(dTpFzR+J+7Rh`Wx}>v1^aUqzKPMM-;b{P9hkd2T`KwZ`pnI_ z$KLyX{&>jlw&`!KZEtn2i(Ff^@vX|$8{e{#gT`ou=F%xkrUZrkVZML%Wh49AoNQpS OXYh3Ob6Mw<&;$TNBa5;C literal 819 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y!~12~w0+RlX>ZmteY^~Z|?Y%+SYZqRNdLE#v=@I0A#bc6cmdZ&X(@80vQl6V+ zmMrtQWIgX-fAX>y|NT`x;|mh6uL)81-2c&hrDT?_R_@WmXWxGN_Wti5i{8cWAHVOP zzkFS`*^)_1=2`@t{ju|H^T(GJ*0ry_&x^cmTj!(dXW$*)6UNWVgo(~H4(p)$t=ve>*lY>8sp?j|UNqP}nvHDJ^@xDdVMYnCs{=j_>?`=S3~|LSwk-k$thC@sDIcFy*R{Wj-|r$05UHg*->yJmym z*@y>I{#ce)U!C@oYsz)^73N zIqy%;_6G`zw&n&Jn>f&kP0M=M9r}GS)0duP2D{5?(LM3ApM5!W?(M8nR%V@@%Ql?1XF6by8p=FbUYe>? ef=>1PXJ~zC!}u_0W-Ks;GkCiCxvX - + - - + + NCEPLIBS-ip: ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid Type Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@

    @@ -76,17 +76,23 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid Type Reference
    +Public Member Functions | +Data Fields
    +
    ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid Type Reference
    @@ -99,95 +105,98 @@
    - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +

    -Private Member Functions

    procedure field_pos
     Field position for a given grid point. More...
     
    procedure gdswzd => gdswzd_rot_equid_cylind_egrid
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1). More...
     
    generic init => init_grib1, init_grib2
     Init subprogram. More...
     
    procedure init_grib1
     Initializes a rotated equidistant cylindrical grid given a grib1_descriptor object. More...
     
    procedure init_grib2
     Initializes a rotated equidistant cylindrical grid given a grib2_descriptor object. More...
     

    +Public Member Functions

    procedure field_pos (self, i, j)
     Field position for a given grid point.
     
    procedure gdswzd (self, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1).
     
    generic init init_grib1
     Init subprogram.
     
    generic init init_grib2
     Init subprogram.
     
    procedure init_grib1 (self, g1_desc)
     Initializes a rotated equidistant cylindrical grid given a grib1_descriptor object.
     
    procedure init_grib2 (self, g2_desc)
     Initializes a rotated equidistant cylindrical grid given a grib2_descriptor object.
     
    - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + +

    -Private Attributes

    real(kdclat0
     Cosine of the latitude of the southern pole of projection. More...

    +Data Fields

    real(kdclat0
     Cosine of the latitude of the southern pole of projection.
     
    class(ip_grid_descriptor), allocatable descriptor
     Descriptor. More...
    class(ip_grid_descriptor), allocatable descriptor
     Descriptor.
     
    real(kddlats
     'J'-direction grid increment. More...
    real(kddlats
     'J'-direction grid increment.
     
    real(kddlons
     'I'-direction grid increment. More...
    real(kddlons
     'I'-direction grid increment.
     
    real eccen_squared
     Eccentricity of the Earth squared (e^2). More...
    real eccen_squared
     Eccentricity of the Earth squared (e^2).
     
    real(kdhi
     Scan mode in the 'i' direction. More...
    real(kdhi
     Scan mode in the 'i' direction.
     
    integer im
     Number of x points. More...
    integer im
     Number of x points.
     
    integer irot
     Rotation flag. More...
    integer irot
     Rotation flag.
     
    integer iwrap
     x wraparound increment (0 if no wraparound). More...
    integer iwrap
     x wraparound increment (0 if no wraparound).
     
    integer jm
     Number of y points. More...
    integer jm
     Number of y points.
     
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound). More...
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound).
     
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound). More...
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound).
     
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind). More...
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind).
     
    integer nm
     Total number of points. More...
    integer nm
     Total number of points.
     
    integer nscan
    integer nscan
     
    integer nscan_field_pos
     nscan for field_pos routine. More...
    integer nscan_field_pos
     nscan for field_pos routine.
     
    real rerth
     Radius of the Earth. More...
    real rerth
     Radius of the Earth.
     
    real(kdrlat1
     Latitude of first grid point. More...
    real(kdrlat1
     Latitude of first grid point.
     
    real(kdrlon0
     Longitude of southern pole of projection. More...
    real(kdrlon0
     Longitude of southern pole of projection.
     
    real(kdrlon1
     Longitude of first grid point. More...
    real(kdrlon1
     Longitude of first grid point.
     
    real(kdslat0
     Sine of the latitude of the southern pole of projection. More...
    real(kdslat0
     Sine of the latitude of the southern pole of projection.
     

    Detailed Description

    Definition at line 37 of file ip_rot_equid_cylind_egrid_mod.F90.

    Member Function/Subroutine Documentation

    - -

    ◆ field_pos()

    + +

    ◆ field_pos()

    - -

    ◆ gdswzd()

    + +

    ◆ gdswzd()

    - - - - - -
    - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    procedure ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::gdswzdprocedure ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::gdswzd (class(ip_rot_equid_cylind_egrid), intent(in) self,
    integer, intent(in) iopt,
    integer, intent(in) npts,
    real, intent(in) fill,
    real, dimension(npts), intent(inout) xpts,
    real, dimension(npts), intent(inout) ypts,
    real, dimension(npts), intent(inout) rlon,
    real, dimension(npts), intent(inout) rlat,
    integer, intent(out) nret,
    real, dimension(npts), intent(out), optional crot,
    real, dimension(npts), intent(out), optional srot,
    real, dimension(npts), intent(out), optional xlon,
    real, dimension(npts), intent(out), optional xlat,
    real, dimension(npts), intent(out), optional ylon,
    real, dimension(npts), intent(out), optional ylat,
    real, dimension(npts), intent(out), optional area 
    )
    -
    -private

    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1).

    -
    Returns
    N/A
    +
    Returns
    N/A Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for rotated equidistant cylindrical grids.
    +

    Works for e-staggered rotated equidistant cylindrical projections. The scan mode determines whether this is an "h" or "v" grid.

    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values.

    +

    The actual number of valid points computed is returned too. Optionally, the vector rotations, the map jacobians and the grid box areas may be returned as well.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present.

    +

    To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present.

    +

    To compute the grid box areas, the optional argument 'area' must be present.

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]selfThe grid object gdswzd was called on.
    [in]ioptoption flag
      +
    • +1 to compute earth coords of selected grid coords.
    • +
    • -1 o compute grid coords of selected earth coords.
    • +
    +
    [in]nptsMaximum number of coordinates.
    [in]fillFill value to set invalid output data. Must be impossible value; suggested value: -9999.
    [in,out]xptsGrid x point coordinates if iopt>0.
    [in,out]yptsGrid y point coordinates if iopt>0.
    [in,out]rlonEarth longitudes in degrees e if iopt<0 (Acceptable range: -360. to 360.)
    [in,out]rlatEarth latitudes in degrees n if iopt<0 (Acceptable range: -90. to 90.)
    [out]nretNumber of valid points computed.
    [out]crotOptional clockwise vector rotation cosines.
    [out]srotOptional clockwise vector rotation sines.
    [out]xlonOptional dx/dlon in 1/degrees.
    [out]xlatOptional dx/dlat in 1/degrees.
    [out]ylonOptional dy/dlon in 1/degrees.
    [out]ylatOptional dy/dlat in 1/degrees.
    [out]areaOptional area weights in m**2.
    +
    +
    +
    Author
    Mark Iredell, George Gayno, Kyle Gerheiser
    +
    Date
    Jan 2015
    -

    Definition at line 59 of file ip_rot_equid_cylind_egrid_mod.F90.

    +

    Definition at line 62 of file ip_rot_equid_cylind_egrid_mod.F90.

    - -

    ◆ init()

    + +

    ◆ init() [1/2]

    - -

    ◆ init_grib1()

    + +

    ◆ init() [2/2]

    - -

    ◆ init_grib2()

    + +

    ◆ init_grib1()

    - - - - - -
    - + + + + + + + + + + + + + + + + +
    procedure ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::init_grib2procedure ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::init_grib1 (class(ip_rot_equid_cylind_egrid), intent(inout) self,
    type(grib1_descriptor), intent(in) g1_desc 
    )
    +
    + +

    Initializes a rotated equidistant cylindrical grid given a grib1_descriptor object.

    +
    Returns
    N/A Initializes a rotated equidistant cylindrical grid given a grib1_descriptor object.
    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g1_descA grib1_descriptor
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 54 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +
    + + +

    ◆ init_grib2()

    + +
    +
    + + + + + + + + + + + + + + + + +
    procedure ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::init_grib2 (class(ip_rot_equid_cylind_egrid), intent(inout) self,
    type(grib2_descriptor), intent(in) g2_desc 
    )
    -
    -private

    Initializes a rotated equidistant cylindrical grid given a grib2_descriptor object.

    -
    Returns
    N/A
    +
    Returns
    N/A Initializes a rotated equidistant cylindrical grid given a grib2_descriptor object.
    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g2_descA grib2_descriptor
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    -

    Definition at line 56 of file ip_rot_equid_cylind_egrid_mod.F90.

    +

    Definition at line 58 of file ip_rot_equid_cylind_egrid_mod.F90.

    Field Documentation

    - -

    ◆ clat0

    + +

    ◆ clat0

    - - - - - -
    real(kd) ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::clat0
    -
    -private

    Cosine of the latitude of the southern pole of projection.

    @@ -348,8 +561,8 @@

    -

    ◆ descriptor

    + +

    ◆ descriptor

    @@ -363,7 +576,7 @@

    -privateinherited +inherited

    @@ -374,24 +587,16 @@

    -

    ◆ dlats

    + +

    ◆ dlats

    - - - - - -
    real(kd) ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::dlats
    -
    -private

    'J'-direction grid increment.

    @@ -400,24 +605,16 @@

    -

    ◆ dlons

    + +

    ◆ dlons

    - - - - - -
    real(kd) ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::dlons
    -
    -private

    'I'-direction grid increment.

    @@ -426,8 +623,8 @@

    -

    ◆ eccen_squared

    + +

    ◆ eccen_squared

    @@ -441,7 +638,7 @@

    -privateinherited +inherited

    @@ -452,24 +649,16 @@

    -

    ◆ hi

    + +

    ◆ hi

    - - - - - -
    real(kd) ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::hi
    -
    -private

    Scan mode in the 'i' direction.

    @@ -478,8 +667,8 @@

    -

    ◆ im

    + +

    ◆ im

    @@ -493,7 +682,7 @@

    -privateinherited +inherited

    @@ -504,24 +693,16 @@

    -

    ◆ irot

    + +

    ◆ irot

    - - - - - -
    integer ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::irot
    -
    -private

    Rotation flag.

    @@ -531,8 +712,8 @@

    -

    ◆ iwrap

    + +

    ◆ iwrap

    @@ -546,7 +727,7 @@

    -privateinherited +inherited

    @@ -557,8 +738,8 @@

    -

    ◆ jm

    + +

    ◆ jm

    @@ -572,7 +753,7 @@

    -privateinherited +inherited

    @@ -583,8 +764,8 @@

    -

    ◆ jwrap1

    + +

    ◆ jwrap1

    @@ -598,7 +779,7 @@

    -privateinherited +inherited

    @@ -609,8 +790,8 @@

    -

    ◆ jwrap2

    + +

    ◆ jwrap2

    @@ -624,7 +805,7 @@

    -privateinherited +inherited

    @@ -635,8 +816,8 @@

    -

    ◆ kscan

    + +

    ◆ kscan

    @@ -650,7 +831,7 @@

    -privateinherited +inherited

    @@ -661,8 +842,8 @@

    -

    ◆ nm

    + +

    ◆ nm

    @@ -676,7 +857,7 @@

    -privateinherited +inherited

    @@ -687,8 +868,8 @@

    -

    ◆ nscan

    + +

    ◆ nscan

    @@ -702,7 +883,7 @@

    -privateinherited +inherited

    @@ -722,8 +903,8 @@

    -

    ◆ nscan_field_pos

    + +

    ◆ nscan_field_pos

    @@ -737,7 +918,7 @@

    -privateinherited +inherited

    @@ -749,8 +930,8 @@

    -

    ◆ rerth

    + +

    ◆ rerth

    @@ -764,7 +945,7 @@

    -privateinherited +inherited

    @@ -775,24 +956,16 @@

    -

    ◆ rlat1

    + +

    ◆ rlat1

    - - - - - -
    real(kd) ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::rlat1
    -
    -private

    Latitude of first grid point.

    @@ -801,24 +974,16 @@

    -

    ◆ rlon0

    + +

    ◆ rlon0

    - - - - - -
    real(kd) ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::rlon0
    -
    -private

    Longitude of southern pole of projection.

    @@ -827,24 +992,16 @@

    -

    ◆ rlon1

    + +

    ◆ rlon1

    - - - - - -
    real(kd) ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::rlon1
    -
    -private

    Longitude of first grid point.

    @@ -853,24 +1010,16 @@

    -

    ◆ slat0

    + +

    ◆ slat0

    - - - - - -
    real(kd) ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::slat0
    -
    -private

    Sine of the latitude of the southern pole of projection.

    @@ -888,7 +1037,7 @@

    diff --git a/structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.js b/structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.js index fa593342..fc6e7521 100644 --- a/structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.js +++ b/structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.js @@ -1,10 +1,11 @@ var structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid = [ - [ "field_pos", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#ac071b3d3eca9a5fa88ff5dc211d19179", null ], - [ "gdswzd", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a62c8147f8845d75e8f52c7524a74c780", null ], - [ "init", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a1f3fa40acb8c2ae4a65c00db21872d7c", null ], - [ "init_grib1", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#ab9a85830bfd06183a8df73726f62217a", null ], - [ "init_grib2", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#adda32463a76ad97ac35b01f1ac693fa4", null ], + [ "field_pos", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#ad0430873da72a0a81f9f1086d44dd415", null ], + [ "gdswzd", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a1442af4a25a658fb23d8c64a8a993a0b", null ], + [ "init", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a99982835dc866faae95d1d5d027e0d80", null ], + [ "init", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a6efe57f024c3d8ac77b5ecd8256c2bdf", null ], + [ "init_grib1", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a19254fbf7b4744a2e4e53cf74af99fd6", null ], + [ "init_grib2", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a5e3f069c3f05bc89041f5702e1fb00b8", null ], [ "clat0", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a7a1b97e05b77bb7563165bf3f3e97dda", null ], [ "descriptor", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a4a2a0dab09f05931d12615b0ac74bc51", null ], [ "dlats", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a00d41c3d43370d3f02bb92d59f66866c", null ], diff --git a/structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.png b/structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.png index 4a47e89af38706d2c8ea370a3259e6dac691515a..5e963b262dd9338f89ead425af5bd12d6f77e413 100644 GIT binary patch literal 893 zcmeAS@N?(olHy`uVBq!ia0y~yURUjoD;1lBd|Nnm=^TnI5rTvGN zTNr2-NK8NT;=q9eK=I&7msbGgI7@>3f*F8(FfeDDeT9L6nZwh?F{Fa=?cCg=#RdYb z(f*+;%l`}OA3HYfOnafx!8h-gWXLQ@G%<1d<-K;R+SY4Q?4gr{JiC;ZdIcG1hE8ho zTscX^$7|}61Utp89+#xHpF2Cl{r&l1&mfcZxht)gdR@}~$G`G$u-MdZk?q~5pFXwu z7gxXRg<)OJzP}~LUwcC)m9Wg8WYw7^z3ke{Pl+$}zFoZC`p!qy)BVH7nZHsNrCzJF zPuu%`>7*sf9x$8EZCzHj`q{24?(eHts=Vaz+xGkZi}L@wFP44J@4E{Uu~RJlIQh@F z#q7%_E#a`!DxFa^egD&``LCud(Jfm7G|BR~&s}BzNz*uh_6XK^tWx>Adr62Vmm0F4 z&M0iX7Bx94o0s{4{zGmB#t!ABOh-O_of^jIxhJ+w32Lqt=j46~#pNUu5IwfdQkXL7O((TS%_lZHd)-$GL-3Hon zn@?@&tull1m9z7b6^^k0Mv!GY>95`>gj*qJg-Sz#n^uWrG^EUVHoMy;xS9o>qmAX^@(_^!Z zQ=;#^eHR&Uf3ILg?YyHiJ|6s4aLPme{9cs_Wn<=gv&d`HqU!F zCv?B=*H7E`?}*Rby!W+LgEEFXb-09Z?c? z>UPB3u%v6ob2h&^d-wlFWxe-{-|}tRVtX&>i}rF-?_*8caP)z6|Z(*`KP?; zZTK6GdgaHno9llcQ(iUCTXy=xcTd-EIVWt#zBcT;$d4^L>-sWo8=njPy8ir?zdyg7 z*!))2FQQcY>Nerq{}eT^Zfo{jxlPu`YwO#DpjEl-#vZy$r!1Kgbm#~3p)$!L-Bky+ Q0W%7Nr>mdKI;Vst06!eAlmGw# literal 863 zcmeAS@N?(olHy`uVBq!ia0y~yURUjo1;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|!1T`3#WAFU@$KB#lQwG!xQfqSwdcQb z{jm%deV&;&7oW47Tcj#@Ygw$)AJyk`n&%XMbDXxsVNy&>h^LWokm^YvkEtrgilLLv z#3-72UJ?vWH%@!`w^GZqsQCKKTbiMh_C5NqSi0l%l8}3^3qIM@*7fgSKi{&dM}GG5 z`B}^ACU{Lc_dsjq<`tU~^XB@Cd*^TT&KJEk6C}E6<}RbaO)qQYXWu&?Ikk;7U+i!Zd?(B}3Z1pxJr1AMHP3u;qHJt#fH_#r0Lc)3UDTLTm6xy1Ua)Jo;E!GN@6Pym>{SWpw8wR!*NwO8t(VJ4f0Fel z^uo89@+@M#?uN%D-$i~s9yEXczfWd@s}C66&iAt2{_6diE9Jk%pT2e7qIUfKxhuk} z^VY6>E1ntkLaO_mV`cBvmkQ4;4%@EId-v~j-;VwL)2vV2`)09pMfieecDsawW8!%C z-dm6#@^w{BL!8wi`x8GNKDfW{L(i)1LB~^fRQ+IId%NZJg2S)E8ds-&EO2Sy{l4ng z_4KUzeR7oy)ps_$%3907!BFRh8ZT!QOqWh+ni90>BY*i!k6_U^a)*Gqfx*+&&t;uc GLK6U5pN{ze diff --git a/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html b/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html index 6a372b93..56d2bfaf 100644 --- a/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html +++ b/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid Type Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@

    @@ -76,17 +76,23 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid Type Reference
    +Public Member Functions | +Data Fields
    +
    ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid Type Reference
    @@ -99,92 +105,95 @@
    - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +

    -Private Member Functions

    procedure field_pos
     Field position for a given grid point. More...
     
    procedure gdswzd => gdswzd_rot_equid_cylind
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids. More...
     
    generic init => init_grib1, init_grib2
     Init subprogram. More...
     
    procedure init_grib1
     Initializes a Rotated equidistant cylindrical grid given a grib1_descriptor object. More...
     
    procedure init_grib2
     Initializes a Rotated equidistant cylindrical given a grib2_descriptor object. More...
     

    +Public Member Functions

    procedure field_pos (self, i, j)
     Field position for a given grid point.
     
    procedure gdswzd (self, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids.
     
    generic init init_grib1
     Init subprogram.
     
    generic init init_grib2
     Init subprogram.
     
    procedure init_grib1 (self, g1_desc)
     Initializes a Rotated equidistant cylindrical grid given a grib1_descriptor object.
     
    procedure init_grib2 (self, g2_desc)
     Initializes a Rotated equidistant cylindrical given a grib2_descriptor object.
     
    - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + +

    -Private Attributes

    real(kdclat0
     Cosine of the latitude of the southern pole of projection. More...

    +Data Fields

    real(kdclat0
     Cosine of the latitude of the southern pole of projection.
     
    class(ip_grid_descriptor), allocatable descriptor
     Descriptor. More...
    class(ip_grid_descriptor), allocatable descriptor
     Descriptor.
     
    real(kddlats
     'J'-direction grid increment. More...
    real(kddlats
     'J'-direction grid increment.
     
    real(kddlons
     'I'-direction grid increment. More...
    real(kddlons
     'I'-direction grid increment.
     
    real eccen_squared
     Eccentricity of the Earth squared (e^2). More...
    real eccen_squared
     Eccentricity of the Earth squared (e^2).
     
    integer im
     Number of x points. More...
    integer im
     Number of x points.
     
    integer irot
     Rotation flag. More...
    integer irot
     Rotation flag.
     
    integer iwrap
     x wraparound increment (0 if no wraparound). More...
    integer iwrap
     x wraparound increment (0 if no wraparound).
     
    integer jm
     Number of y points. More...
    integer jm
     Number of y points.
     
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound). More...
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound).
     
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound). More...
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound).
     
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind). More...
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind).
     
    integer nm
     Total number of points. More...
    integer nm
     Total number of points.
     
    integer nscan
    integer nscan
     
    integer nscan_field_pos
     nscan for field_pos routine. More...
    integer nscan_field_pos
     nscan for field_pos routine.
     
    real rerth
     Radius of the Earth. More...
    real rerth
     Radius of the Earth.
     
    real(kdrlon0
     Longitude of southern pole of projection. More...
    real(kdrlon0
     Longitude of southern pole of projection.
     
    real(kdsbd
     Latitude of the southern boundary of the grid before rotation. More...
    real(kdsbd
     Latitude of the southern boundary of the grid before rotation.
     
    real(kdslat0
     Sine of the latitude of the southern pole of projection. More...
    real(kdslat0
     Sine of the latitude of the southern pole of projection.
     
    real(kdwbd
     Longitude of the western boundary of the grid before rotation. More...
    real(kdwbd
     Longitude of the western boundary of the grid before rotation.
     

    Detailed Description

    Definition at line 32 of file ip_rot_equid_cylind_grid_mod.F90.

    Member Function/Subroutine Documentation

    - -

    ◆ field_pos()

    + +

    ◆ field_pos()

    - -

    ◆ gdswzd()

    + +

    ◆ gdswzd()

    - - - - - -
    - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    procedure ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::gdswzdprocedure ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::gdswzd (class(ip_rot_equid_cylind_grid), intent(in) self,
    integer, intent(in) iopt,
    integer, intent(in) npts,
    real, intent(in) fill,
    real, dimension(npts), intent(inout) xpts,
    real, dimension(npts), intent(inout) ypts,
    real, dimension(npts), intent(inout) rlon,
    real, dimension(npts), intent(inout) rlat,
    integer, intent(out) nret,
    real, dimension(npts), intent(out), optional crot,
    real, dimension(npts), intent(out), optional srot,
    real, dimension(npts), intent(out), optional xlon,
    real, dimension(npts), intent(out), optional xlat,
    real, dimension(npts), intent(out), optional ylon,
    real, dimension(npts), intent(out), optional ylat,
    real, dimension(npts), intent(out), optional area 
    )
    -
    -private

    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids.

    -
    Returns
    N/A
    +
    Returns
    N/A GDS wizard for rotated equidistant cylindrical.
    +

    This subprogram decodes the grib 2 grid definition template (passed in integer form as decoded by the ncep g2 library) and returns one of the following:

      +
    • (iopt=+1) earth coordinates of selected grid coordinates
    • +
    • (iopt=-1) grid coordinates of selected earth coordinates
    • +
    +

    Works for non-"e" staggered rotated equidistant cylindrical projections. the scan mode (section 3, octet 72, bits 5-6) determine whether this is an "h" or "v" grid.

    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values. The actual number of valid points computed is returned too.

    +

    Optionally, the vector rotations, the map jacobians and the grid box areas may be returned as well.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present. To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present. To compute the grid box areas, the optional argument 'area' must be present.

    +

    +Program History Log

    + + + + + + + + + + + +
    Date Programmer Comments
    2010-jan-15 gayno based on routines gdswzdcb and gdswzdca
    2015-jan-21 gayno merger of gdswizcd and gdswzdcd. make crot,sort,xlon,xlat,ylon,ylat and area optional arguments. make part of a module. move vector rotation, map jacobian and grid box area computations to separate subroutines.
    2015-jul-13 gayno convert to grib 2. replace grib 1 kgds array with grib 2 grid definition template array. rename as "gdswzd_rot_equid_cylind."
    2018-07-20 wesley add threads.
    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]selfModule reference.
    [in]ioptinteger option flag
      +
    • 1 to compute earth coords of selected grid coords
    • +
    • -1 to compute grid coords of selected earth coords
    • +
    +
    [in]nptsinteger maximum number of coordinates
    [in]fillreal fill value to set invalid output data (must be impossible value; suggested value: -9999.)
    [in,out]xptsreal (npts) grid x point coordinates if iopt>0
    [in,out]yptsreal (npts) grid y point coordinates if iopt>0
    [in,out]rlonreal (npts) earth longitudes in degrees e if iopt<0 (acceptable range: -360. to 360.)
    [in,out]rlatreal (npts) earth latitudes in degrees n if iopt<0 (acceptable range: -90. to 90.)
    [out]nretinteger number of valid points computed
    [out]crotreal, optional (npts) clockwise vector rotation cosines
    [out]srotreal, optional (npts) clockwise vector rotation sines (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlonreal, optional (npts) dx/dlon in 1/degrees
    [out]xlatreal, optional (npts) dx/dlat in 1/degrees
    [out]ylonreal, optional (npts) dy/dlon in 1/degrees
    [out]ylatreal, optional (npts) dy/dlat in 1/degrees
    [out]areareal, optional (npts) area weights in m**2
    +
    +
    +
    Author
    Gayno
    +
    Date
    2007-NOV-15
    -

    Definition at line 53 of file ip_rot_equid_cylind_grid_mod.F90.

    +

    Definition at line 56 of file ip_rot_equid_cylind_grid_mod.F90.

    - -

    ◆ init()

    + +

    ◆ init() [1/2]

    - -

    ◆ init_grib1()

    + +

    ◆ init() [2/2]

    - -

    ◆ init_grib2()

    + +

    ◆ init_grib1()

    - - - - - -
    - + + + + + + + + + + + + + + + + +
    procedure ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::init_grib2procedure ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::init_grib1 (class(ip_rot_equid_cylind_grid), intent(inout) self,
    type(grib1_descriptor), intent(in) g1_desc 
    )
    +
    + +

    Initializes a Rotated equidistant cylindrical grid given a grib1_descriptor object.

    +
    Returns
    N/A Initializes a Rotated equidistant cylindrical grid given a grib1_descriptor object.
    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g1_descA grib1_descriptor
    +
    +
    +
    Author
    Gayno
    +
    Date
    2007-NOV-15
    + +

    Definition at line 48 of file ip_rot_equid_cylind_grid_mod.F90.

    + +
    + + +

    ◆ init_grib2()

    + +
    +
    + + + + + + + + + + + + + + + + +
    procedure ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::init_grib2 (class(ip_rot_equid_cylind_grid), intent(inout) self,
    type(grib2_descriptor), intent(in) g2_desc 
    )
    -
    -private

    Initializes a Rotated equidistant cylindrical given a grib2_descriptor object.

    -
    Returns
    N/A
    +
    Returns
    N/A Initializes a Rotated equidistant cylindrical grid given a grib2_descriptor object.
    +

    Call 'use_ncep_post_arakawa()' before using this subroutine to use ncep_post-compatible grid definition.

    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g2_descA grib2_descriptor
    +
    +
    +
    Author
    Alex Richert
    +
    Date
    2024-MAY-20
    -

    Definition at line 50 of file ip_rot_equid_cylind_grid_mod.F90.

    +

    Definition at line 52 of file ip_rot_equid_cylind_grid_mod.F90.

    Field Documentation

    - -

    ◆ clat0

    + +

    ◆ clat0

    - - - - - -
    real(kd) ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::clat0
    -
    -private

    Cosine of the latitude of the southern pole of projection.

    @@ -345,8 +575,8 @@

    -

    ◆ descriptor

    + +

    ◆ descriptor

    @@ -360,7 +590,7 @@

    -privateinherited +inherited

    @@ -371,24 +601,16 @@

    -

    ◆ dlats

    + +

    ◆ dlats

    - - - - - -
    real(kd) ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::dlats
    -
    -private

    'J'-direction grid increment.

    @@ -397,24 +619,16 @@

    -

    ◆ dlons

    + +

    ◆ dlons

    - - - - - -
    real(kd) ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::dlons
    -
    -private

    'I'-direction grid increment.

    @@ -423,8 +637,8 @@

    -

    ◆ eccen_squared

    + +

    ◆ eccen_squared

    @@ -438,7 +652,7 @@

    -privateinherited +inherited

    @@ -449,8 +663,8 @@

    -

    ◆ im

    + +

    ◆ im

    @@ -464,7 +678,7 @@

    -privateinherited +inherited

    @@ -475,24 +689,16 @@

    -

    ◆ irot

    + +

    ◆ irot

    - - - - - -
    integer ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::irot
    -
    -private

    Rotation flag.

    @@ -502,8 +708,8 @@

    -

    ◆ iwrap

    + +

    ◆ iwrap

    @@ -517,7 +723,7 @@

    -privateinherited +inherited

    @@ -528,8 +734,8 @@

    -

    ◆ jm

    + +

    ◆ jm

    @@ -543,7 +749,7 @@

    -privateinherited +inherited

    @@ -554,8 +760,8 @@

    -

    ◆ jwrap1

    + +

    ◆ jwrap1

    @@ -569,7 +775,7 @@

    -privateinherited +inherited

    @@ -580,8 +786,8 @@

    -

    ◆ jwrap2

    + +

    ◆ jwrap2

    @@ -595,7 +801,7 @@

    -privateinherited +inherited

    @@ -606,8 +812,8 @@

    -

    ◆ kscan

    + +

    ◆ kscan

    @@ -621,7 +827,7 @@

    -privateinherited +inherited

    @@ -632,8 +838,8 @@

    -

    ◆ nm

    + +

    ◆ nm

    @@ -647,7 +853,7 @@

    -privateinherited +inherited

    @@ -658,8 +864,8 @@

    -

    ◆ nscan

    + +

    ◆ nscan

    @@ -673,7 +879,7 @@

    -privateinherited +inherited

    @@ -693,8 +899,8 @@

    -

    ◆ nscan_field_pos

    + +

    ◆ nscan_field_pos

    @@ -708,7 +914,7 @@

    -privateinherited +inherited

    @@ -720,8 +926,8 @@

    -

    ◆ rerth

    + +

    ◆ rerth

    @@ -735,7 +941,7 @@

    -privateinherited +inherited

    @@ -746,24 +952,16 @@

    -

    ◆ rlon0

    + +

    ◆ rlon0

    - - - - - -
    real(kd) ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::rlon0
    -
    -private

    Longitude of southern pole of projection.

    @@ -772,24 +970,16 @@

    -

    ◆ sbd

    + +

    ◆ sbd

    - - - - - -
    real(kd) ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::sbd
    -
    -private

    Latitude of the southern boundary of the grid before rotation.

    @@ -798,24 +988,16 @@

    -

    ◆ slat0

    + +

    ◆ slat0

    - - - - - -
    real(kd) ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::slat0
    -
    -private

    Sine of the latitude of the southern pole of projection.

    @@ -824,24 +1006,16 @@

    -

    ◆ wbd

    + +

    ◆ wbd

    - - - - - -
    real(kd) ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::wbd
    -
    -private

    Longitude of the western boundary of the grid before rotation.

    @@ -859,7 +1033,7 @@

    diff --git a/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.js b/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.js index 696035bb..e1d33583 100644 --- a/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.js +++ b/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.js @@ -1,10 +1,11 @@ var structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid = [ - [ "field_pos", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#ac071b3d3eca9a5fa88ff5dc211d19179", null ], - [ "gdswzd", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a0f14a253b51bcb0633cd00d32d5130a4", null ], - [ "init", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a1f3fa40acb8c2ae4a65c00db21872d7c", null ], - [ "init_grib1", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a9942c787bda2e118f1355476670edfca", null ], - [ "init_grib2", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a30ae580d169972e8d68c3d97ab3b2634", null ], + [ "field_pos", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#ad0430873da72a0a81f9f1086d44dd415", null ], + [ "gdswzd", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a02d398fd4eface830af2c786e1f33055", null ], + [ "init", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a99982835dc866faae95d1d5d027e0d80", null ], + [ "init", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a6efe57f024c3d8ac77b5ecd8256c2bdf", null ], + [ "init_grib1", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#afe3cd2637f7b618a40cda510f4472c79", null ], + [ "init_grib2", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a87f3f4f67868002cb8fc8dd5608fe97a", null ], [ "clat0", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a49835868e8c8b96e243a5992daee6ea5", null ], [ "descriptor", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a4a2a0dab09f05931d12615b0ac74bc51", null ], [ "dlats", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#affd9cfc7a0e1d8e74735eac35b2e03c6", null ], diff --git a/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.png b/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.png index 9dd76b75540a54a94526e536dc8a65713a93c35b..5ff66798124cfa2b0b9942bf534c73d0d9ea3c58 100644 GIT binary patch literal 885 zcmeAS@N?(olHy`uVBq!ia0y~yU~~hr12~w0WY9;Q4?s#fz$e7@|Ns9$=8HF9OZyKk zw=mEwkeGhv#eo9{fa1ZEF0TN}ah3%61v3EoU|`NP`w9aCGlQp#V@L(#+qn-XZL$(z zwN?*}e*Sm<52Y?O4jrpgMf+#zN=-X6fydY9Ur_d1&$V0K7I+0IdA^@4rK;(ZHD!sx z%D_p7mbiIx6|Xp^+nki#H(~ord;4Ex$9i50w><4vyZHXf_k6eK?y@W^SM`j48qnKqzh!&; zx8_*SppN|)EqvCWzW<5Kj8!$WTNbEA@z2McJBz(1P5Y4$K1t+JM(?CA{FBiAW1O*O z>$N4-x%$09oQEGyzDnZO z?+Znb=2^*IoIG`RzS+B38>LHc=JoAhx_$4#kD}W*BVum3x7~hNk}2gM{QB$vhc?HS z_nY54KS}Q4vd@)|bYGX{HedhvJb7F3Gn=PnQon!N+$~#sHX=86`||mdetigf^p#hv z`SI#6e?@*5&RKD%&g@(1S7jZZo4hvORsZ&AcWzGnwJ2QPHgcza_MSg)*T2?$oYBiZ z_4m1)J=^~WT@N}Yf99C-sk>3q+v`=gmu4q#j9i(WxiOM^on6(YBJ=WB$JMs&`MNdw zz@cmAr59^=Oc*Ev;ujPH8^8xQ-lmByXe0%@K#C^+;i@VqUKDd6`?=^)nQ+L1L zbLrQehc=m8*Ju`Q+q0H0^|t?H@=+?3Mw_^u#+^I h7UUJ=rOEh@c~TSaH|5gw=fDiY;OXk;vd$@?2>=e*t2_Vz literal 854 zcmeAS@N?(olHy`uVBq!ia0y~yU~~hr12~w0WY9;Q4?s#Hz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-op6p0jjU@SZer$@h(Jo?OYjlSGb5scQC^dIil0 zHdXVymCPmgOy^=n_@pm}dgjvBre2r)|Ah7)E>>Oo>1A8@@27vOZS4Juzs;~W^Ix82 zw(r7JmD;J7P0wYWYTH@5FJ_NTsNO}bt(&zye`!5Gf9&e!={Zg3lZ9*7f&{K@>k0b7cJN8dj}Gkvufi{_v+t?_BW=gwEmFo zJ^W=?{VnYqGE(B>2bEn>QAFPl~G9pzX<3xXsP;S98Q-l~!aAompTA_A5KX z4l8p8W`ToJjEnB%ed7=~0%Y)ry%khwGi9n_@Mhsi?qx_^BdE}0%G9#at-;_Lhrlr@ z#zPUx4iedvNPf1@@X=JA9ONbF!NB&Q7S)DlD?eU%w(*sGmBg*r0oEIr_o-HGEc%_6 ze7(nZ1-C}u4yFd?bNbuo^d5fyX`11bcfOCW-}&{!w#GhhZrr_!yIaKrR@|vFyH_U^RQ`}zNNnMtN++pN4(p7wb2-}YTmlKTy$&ue_o z$hG-5-RJeSgGrl%!?QQunY z7p|x4Ua`Gcs=RmkadG$B-^bQZ+kMqy-Kne9_cHI6?eM#$o9!2)o4?zcF=vOz&iMJg zw(s{li#v2{PmTWjm67MbYSf?yM&!~dK3Cb`4KGA@CTO2^c(G{an^LB{Ts5 Dzt4p5 diff --git a/structip__station__points__grid__mod_1_1ip__station__points__grid.html b/structip__station__points__grid__mod_1_1ip__station__points__grid.html index 3082ed30..60a644df 100644 --- a/structip__station__points__grid__mod_1_1ip__station__points__grid.html +++ b/structip__station__points__grid__mod_1_1ip__station__points__grid.html @@ -1,9 +1,9 @@ - + - - + + NCEPLIBS-ip: ip_station_points_grid_mod::ip_station_points_grid Type Reference @@ -23,10 +23,9 @@
    - - + @@ -34,21 +33,22 @@
    -
    NCEPLIBS-ip -  5.1.0 +
    +
    NCEPLIBS-ip 5.2.0
    - + +/* @license-end */ +
    @@ -62,7 +62,7 @@

    @@ -76,17 +76,23 @@
    - +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    -
    -
    ip_station_points_grid_mod::ip_station_points_grid Type Reference
    +Public Member Functions | +Data Fields
    +
    ip_station_points_grid_mod::ip_station_points_grid Type Reference
    @@ -99,68 +105,71 @@
    - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +

    -Private Member Functions

    procedure field_pos
     Field position for a given grid point. More...
     
    procedure gdswzd => gdswzd_station_points
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for IP Station Point grids. More...
     
    generic init => init_grib1, init_grib2
     Init subprogram. More...
     
    procedure init_grib1
     Initializes a gaussian grid given a grib1_descriptor object. More...
     
    procedure init_grib2
     Initializes a gaussian grid given a grib2_descriptor object. More...
     

    +Public Member Functions

    procedure field_pos (self, i, j)
     Field position for a given grid point.
     
    procedure gdswzd (self, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for IP Station Point grids.
     
    generic init init_grib1
     Init subprogram.
     
    generic init init_grib2
     Init subprogram.
     
    procedure init_grib1 (self, g1_desc)
     Initializes a gaussian grid given a grib1_descriptor object.
     
    procedure init_grib2 (self, g2_desc)
     Initializes a gaussian grid given a grib2_descriptor object.
     
    - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + +

    -Private Attributes

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor. More...

    +Data Fields

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor.
     
    real eccen_squared
     Eccentricity of the Earth squared (e^2). More...
    real eccen_squared
     Eccentricity of the Earth squared (e^2).
     
    integer im
     Number of x points. More...
    integer im
     Number of x points.
     
    integer iwrap
     x wraparound increment (0 if no wraparound). More...
    integer iwrap
     x wraparound increment (0 if no wraparound).
     
    integer jm
     Number of y points. More...
    integer jm
     Number of y points.
     
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound). More...
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound).
     
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound). More...
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound).
     
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind). More...
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind).
     
    integer nm
     Total number of points. More...
    integer nm
     Total number of points.
     
    integer nscan
    integer nscan
     
    integer nscan_field_pos
     nscan for field_pos routine. More...
    integer nscan_field_pos
     nscan for field_pos routine.
     
    real rerth
     Radius of the Earth. More...
    real rerth
     Radius of the Earth.
     

    Detailed Description

    Definition at line 18 of file ip_station_points_grid_mod.F90.

    Member Function/Subroutine Documentation

    - -

    ◆ field_pos()

    + +

    ◆ field_pos()

    - -

    ◆ gdswzd()

    + +

    ◆ gdswzd()

    - - - - - -
    - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    procedure ip_station_points_grid_mod::ip_station_points_grid::gdswzdprocedure ip_station_points_grid_mod::ip_station_points_grid::gdswzd (class(ip_station_points_grid), intent(in) self,
    integer, intent(in) iopt,
    integer, intent(in) npts,
    real, intent(in) fill,
    real, dimension(npts), intent(inout) xpts,
    real, dimension(npts), intent(inout) ypts,
    real, dimension(npts), intent(inout) rlon,
    real, dimension(npts), intent(inout) rlat,
    integer, intent(out) nret,
    real, dimension(npts), intent(out), optional crot,
    real, dimension(npts), intent(out), optional srot,
    real, dimension(npts), intent(out), optional xlon,
    real, dimension(npts), intent(out), optional xlat,
    real, dimension(npts), intent(out), optional ylon,
    real, dimension(npts), intent(out), optional ylat,
    real, dimension(npts), intent(out), optional area 
    )
    -
    -private

    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for IP Station Point grids.

    -
    Returns
    N/A
    +
    Returns
    N/A Interpolate gridded data to a series of station points.
    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]selfThe grid.
    [in]IOPTmust be minus 1 (return grid coordinates for selected earth coordinates).
    [in]NPTSMaximum number of points.
    [in]FILLFill value to set invalid output data. Must be impossible value; suggested value: -9999.
    [in,out]XPTSX point coordinates. Always output.
    [in,out]YPTSY point coordinates. Always output.
    [in,out]RLONPoint longitudes. Always input.
    [in,out]RLATPoint latitudes. Always input.
    [out]NRETNumber of valid points computed.
    [out]CROTNot used.
    [out]SROTNot used.
    [out]XLONNot used.
    [out]XLATNot used.
    [out]YLONNot used.
    [out]YLATNot used.
    [out]AREANot used.
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    7/21/21
    +
    Author
    Eric Engle
    +
    Date
    5/4/23
    -

    Definition at line 26 of file ip_station_points_grid_mod.F90.

    +

    Definition at line 29 of file ip_station_points_grid_mod.F90.

    - -

    ◆ init()

    + +

    ◆ init() [1/2]

    - -

    ◆ init_grib1()

    + +

    ◆ init() [2/2]

    - -

    ◆ init_grib2()

    + +

    ◆ init_grib1()

    - - - - - -
    - + + + + + + + + + + + + + + + + +
    procedure ip_station_points_grid_mod::ip_station_points_grid::init_grib2procedure ip_station_points_grid_mod::ip_station_points_grid::init_grib1 (class(ip_station_points_grid), intent(inout) self,
    type(grib1_descriptor), intent(in) g1_desc 
    )
    +
    + +

    Initializes a gaussian grid given a grib1_descriptor object.

    +
    Returns
    N/A Initializes an IP Station grid given a grib1_descriptor object.
    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g1_descA grib1_descriptor
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    + +

    Definition at line 22 of file ip_station_points_grid_mod.F90.

    + +
    + + +

    ◆ init_grib2()

    + +
    +
    + + + + + + + + + + + + + + + + +
    procedure ip_station_points_grid_mod::ip_station_points_grid::init_grib2 (class(ip_station_points_grid), intent(inout) self,
    type(grib2_descriptor), intent(in) g2_desc 
    )
    -
    -private

    Initializes a gaussian grid given a grib2_descriptor object.

    -
    Returns
    N/A
    +
    Returns
    N/A Initializes an IP Station grid given a grib2_descriptor object.
    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g2_descA grib2_descriptor
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    -

    Definition at line 23 of file ip_station_points_grid_mod.F90.

    +

    Definition at line 25 of file ip_station_points_grid_mod.F90.

    Field Documentation

    - -

    ◆ descriptor

    + +

    ◆ descriptor

    @@ -310,7 +523,7 @@

    -privateinherited +inherited

    @@ -321,8 +534,8 @@

    -

    ◆ eccen_squared

    + +

    ◆ eccen_squared

    @@ -336,7 +549,7 @@

    -privateinherited +inherited

    @@ -347,8 +560,8 @@

    -

    ◆ im

    + +

    ◆ im

    @@ -362,7 +575,7 @@

    -privateinherited +inherited

    @@ -373,8 +586,8 @@

    -

    ◆ iwrap

    + +

    ◆ iwrap

    @@ -388,7 +601,7 @@

    -privateinherited +inherited

    @@ -399,8 +612,8 @@

    -

    ◆ jm

    + +

    ◆ jm

    @@ -414,7 +627,7 @@

    -privateinherited +inherited

    @@ -425,8 +638,8 @@

    -

    ◆ jwrap1

    + +

    ◆ jwrap1

    @@ -440,7 +653,7 @@

    -privateinherited +inherited

    @@ -451,8 +664,8 @@

    -

    ◆ jwrap2

    + +

    ◆ jwrap2

    @@ -466,7 +679,7 @@

    -privateinherited +inherited

    @@ -477,8 +690,8 @@

    -

    ◆ kscan

    + +

    ◆ kscan

    @@ -492,7 +705,7 @@

    -privateinherited +inherited

    @@ -503,8 +716,8 @@

    -

    ◆ nm

    + +

    ◆ nm

    @@ -518,7 +731,7 @@

    -privateinherited +inherited

    @@ -529,8 +742,8 @@

    -

    ◆ nscan

    + +

    ◆ nscan

    @@ -544,7 +757,7 @@

    -privateinherited +inherited

    @@ -564,8 +777,8 @@

    -

    ◆ nscan_field_pos

    + +

    ◆ nscan_field_pos

    @@ -579,7 +792,7 @@

    -privateinherited +inherited

    @@ -591,8 +804,8 @@

    -

    ◆ rerth

    + +

    ◆ rerth

    @@ -606,7 +819,7 @@

    -privateinherited +inherited

    diff --git a/structip__station__points__grid__mod_1_1ip__station__points__grid.js b/structip__station__points__grid__mod_1_1ip__station__points__grid.js index f8d6a0a4..39db142d 100644 --- a/structip__station__points__grid__mod_1_1ip__station__points__grid.js +++ b/structip__station__points__grid__mod_1_1ip__station__points__grid.js @@ -1,10 +1,11 @@ var structip__station__points__grid__mod_1_1ip__station__points__grid = [ - [ "field_pos", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#ac071b3d3eca9a5fa88ff5dc211d19179", null ], - [ "gdswzd", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a9fff8b24553d11177b8c1ee38bfbd91f", null ], - [ "init", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a1f3fa40acb8c2ae4a65c00db21872d7c", null ], - [ "init_grib1", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#aa5ec2cbc9bf0dadf20a226e0afeb3d32", null ], - [ "init_grib2", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a69fac68e7a40d5c3106a47bf1851891e", null ], + [ "field_pos", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#ad0430873da72a0a81f9f1086d44dd415", null ], + [ "gdswzd", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a807b4676d46bee923d8da142c568a6d9", null ], + [ "init", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a99982835dc866faae95d1d5d027e0d80", null ], + [ "init", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a6efe57f024c3d8ac77b5ecd8256c2bdf", null ], + [ "init_grib1", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#afddeaff2580e7f29ad0dc814db4058c6", null ], + [ "init_grib2", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a9ee208a252d14bda751a5a96078da5c7", null ], [ "descriptor", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a4a2a0dab09f05931d12615b0ac74bc51", null ], [ "eccen_squared", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a180a5da6c470fac34b8439d4c0a32d2a", null ], [ "im", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a546a9c3bb8e93ec8e8f7eaf2a14537dc", null ], diff --git a/structip__station__points__grid__mod_1_1ip__station__points__grid.png b/structip__station__points__grid__mod_1_1ip__station__points__grid.png index 2419f86307327b8139cef09c3368c688cece859f..caa8b132887eb71669d7afb789d82f58f9c9cd49 100644 GIT binary patch literal 855 zcmeAS@N?(olHy`uVBq!ia0y~yU{nFJ12~w0Wc%YEdx4a6fKQ0)|NsAi%olIImi8Z7 zZegHVATj;SivtG^0L6nRU0wl{<17jC3uXZF!N8np_7w&OrbnJGjv*C{Z|C0Zdu+hN z;;ox-;s5`mvkymzqt1a=ZOKRz*Q-X?w6|WHbtUSxS%{~XN@n*I6;DP@&q+){ zlT=ujsCaVySh7UPGrDB*Zo|iK-UoYL+8uM(lU>y_=*WM~mtm!WGq2T2-)aAT{`mLL ztNZJY*yokU`>OAq;5F&olgpES_4?<3DgXU&$7{zc7PnjEd{jNtKYjF@^)}~JQqc~v z&Fhy=T4LtS=-tfn7Z^s|6G3&qaP3!mRbHXvvu~$5g7v1{C#V%*LYgexR&!E!F zep-5$+21!`s=1Rc-yE4?|LXZJ>AS_br{2BP3*UTppY*)USvRv+XRDan{+21(F4k;T zA{g=JrK#slU3<)0y^ySL~}%F!>(ExkR-YVCQu z+TA^okLRnsTz&Pe$F1BKhf~)anXB}2_SL<={jx5v-}>?1`hAtQZ`NG**tKrggA(a; zjsMnK%@cfk(8S*USnb+*^3I#r=j^tgTe~DWM4fUy6!} literal 825 zcmeAS@N?(olHy`uVBq!ia0y~yU{nFJ12~w0Wc%YEdx4ZhfKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+1Jeml7srqa#?z&hJG^xpr8 z_LD0Z^?TBK-(4%;_C|uGePKCM{YlI8$;IbxPf$JSaY<~NiYFs7zCUG(N@n-I&6a7e z{#I&u{+hB|J9D{;XV;I}lXk6{95l1~dWG5i`RjlGHtVVDt+#!bAF3+Lq3W6bDcAGx zq0{V#FE6xQTP0%pHO#rZZPF6spH-@7!@@SbkXi5geq+F-5;d4z-`{v%UAI{`^Odcb z*Q9e#mR(-E-0rTM^V64MF}s~TFU_n8zVyof!Q-WKB)lf|6?86HXELw;we|4}nx494 zEt8hy7v!qGov7%U4VM3q>N)Al_l+u^TpN(^3zesHHlMV7?#oao$%2hIkFlrBi&oG;^Jq3>cy#gd7@F8CjrI&m^-L z-~QeCziYzQGpxBZuT1X2y*G=zZix#gw92l3Ggmg@r0dP8Q?JzO$Jdwzef{{R)-=tz z{n~}=_Al)y?w7^;57J3Y2wSMT!!8&>Q=hyZZU@ zh&S4&*ZFUMv`cq)4%VaU_VHvO?!^7nJ){$=JN xm(D$9)Y)OUJHq5ZeIFt`fWhLR4h^nP{MO&>j1S8m=>ev522WQ%mvv4FO#mtjVx0g0 diff --git a/tab_ad.png b/tab_ad.png new file mode 100644 index 0000000000000000000000000000000000000000..e34850acfc24be58da6d2fd1ccc6b29cc84fe34d GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QhuH;jv*C{Z|5d*H3V=pKi{In zd2jxLclDRPylmD}^l7{QOtL{vUjO{-WqItb5sQp2h-99b8^^Scr-=2mblCdZuUm?4 jzOJvgvt3{(cjKLW5(A@0qPS@<&}0TrS3j3^P6y&q2{!U5bk+Tso_B!YCpDh>v z{CM*1U8YvQRyBUHt^Ju0W_sq-?;9@_4equ-bavTs=gk796zopr0EBT&m;e9( literal 0 HcmV?d00001 diff --git a/tab_sd.png b/tab_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..757a565ced4730f85c833fb2547d8e199ae68f19 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qq7(&jv*C{Z|_!fH5o7*c=%9% zcILh!EA=pAQKdx-Cdiev=v{eg{8Ht<{e8_NAN~b=)%W>-WDCE0PyDHGemi$BoXwcK z{>e9^za6*c1ilttWw&V+U;WCPlV9{LdC~Ey%_H(qj`xgfES(4Yz5jSTZfCt`4E$0YRsR*S^mTCR^;V&sxC8{l_Cp7w8-YPgg&ebxsLQ00$vXK>z>% literal 0 HcmV?d00001 diff --git a/tabs.css b/tabs.css index 7d45d36c..df7944b7 100644 --- a/tabs.css +++ b/tabs.css @@ -1 +1 @@ -.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283A5D transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/ver-5.1.0/annotated.html b/ver-5.1.0/annotated.html new file mode 100644 index 00000000..7bfc9a79 --- /dev/null +++ b/ver-5.1.0/annotated.html @@ -0,0 +1,152 @@ + + + + + + + +NCEPLIBS-ip: Data Types List + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Data Types List
    +
    +
    +
    Here are the data types with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     Nbicubic_interp_modBicubic interpolation routines for scalars and vectors
     Cinterpolate_bicubic
     Nbilinear_interp_modBilinear interpolation routines for scalars and vectors
     Cinterpolate_bilinear
     Nbudget_interp_modBudget interpolation routines for scalars and vectors
     Cinterpolate_budget
     Ngdswzd_modDriver module for gdswzd routines
     Cgdswzd
     Nip_equid_cylind_grid_modEquidistant cylindrical grib decoder and grid coordinate transformations
     Cip_equid_cylind_grid
     Nip_gaussian_grid_modGaussian grid coordinate transformations
     Cip_gaussian_grid
     Nip_grid_descriptor_modUsers derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions
     Cgrib1_descriptorDescriptor representing a grib1 grib descriptor section (GDS) with an integer array
     Cgrib2_descriptorGrib-2 descriptor containing a grib2 GDT represented by an integer array
     Cinit_descriptor
     Cip_grid_descriptorAbstract descriptor object which represents a grib1 or grib2 descriptor
     Coperator(==)
     Nip_grid_factory_modRoutines for creating an ip_grid given a Grib descriptor
     Cinit_grid
     Nip_grid_modAbstract ip_grid type
     Cgdswzd_interface
     Cinit_grib1_interface
     Cinit_grib2_interface
     Cip_gridAbstract grid that holds fields and methods common to all grids
     Coperator(==)Check equality
     Nip_lambert_conf_grid_modLambert conformal grib decoder and grid coordinate transformations
     Cip_lambert_conf_grid
     Nip_mercator_grid_modGDS wizard for mercator cylindrical
     Cip_mercator_grid
     Nip_polar_stereo_grid_modGDS wizard for polar stereographic azimuthal
     Cip_polar_stereo_grid
     Nip_rot_equid_cylind_egrid_modRotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grid E
     Cip_rot_equid_cylind_egrid
     Nip_rot_equid_cylind_grid_modRotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grids A through D
     Cip_rot_equid_cylind_grid
     Nip_station_points_grid_modInterpolate gridded data to a series of station points
     Cip_station_points_grid
     Nipolates_modTop-level driver for scalar interpolation interpolation routine ipolates()
     Cipolates
     Nipolatev_modTop-level driver for vector interpolation interpolation routine ipolatev()
     Cipolatev
     Nneighbor_budget_interp_modInterpolate scalar fields (neighbor)
     Cinterpolate_neighbor_budget
     Nneighbor_interp_modInterpolate scalar fields (neighbor)
     Cinterpolate_neighbor
     Nspectral_interp_modInterpolate spectral
     Cinterpolate_spectral
     Cpolates4
     Cpolatev4
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/annotated_dup.js b/ver-5.1.0/annotated_dup.js new file mode 100644 index 00000000..fdb0e0fd --- /dev/null +++ b/ver-5.1.0/annotated_dup.js @@ -0,0 +1,73 @@ +var annotated_dup = +[ + [ "bicubic_interp_mod", "namespacebicubic__interp__mod.html", [ + [ "interpolate_bicubic", "interfacebicubic__interp__mod_1_1interpolate__bicubic.html", "interfacebicubic__interp__mod_1_1interpolate__bicubic" ] + ] ], + [ "bilinear_interp_mod", "namespacebilinear__interp__mod.html", [ + [ "interpolate_bilinear", "interfacebilinear__interp__mod_1_1interpolate__bilinear.html", "interfacebilinear__interp__mod_1_1interpolate__bilinear" ] + ] ], + [ "budget_interp_mod", "namespacebudget__interp__mod.html", [ + [ "interpolate_budget", "interfacebudget__interp__mod_1_1interpolate__budget.html", "interfacebudget__interp__mod_1_1interpolate__budget" ] + ] ], + [ "gdswzd_mod", "namespacegdswzd__mod.html", [ + [ "gdswzd", "interfacegdswzd__mod_1_1gdswzd.html", "interfacegdswzd__mod_1_1gdswzd" ] + ] ], + [ "ip_equid_cylind_grid_mod", "namespaceip__equid__cylind__grid__mod.html", [ + [ "ip_equid_cylind_grid", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid" ] + ] ], + [ "ip_gaussian_grid_mod", "namespaceip__gaussian__grid__mod.html", [ + [ "ip_gaussian_grid", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html", "structip__gaussian__grid__mod_1_1ip__gaussian__grid" ] + ] ], + [ "ip_grid_descriptor_mod", "namespaceip__grid__descriptor__mod.html", [ + [ "grib1_descriptor", "structip__grid__descriptor__mod_1_1grib1__descriptor.html", "structip__grid__descriptor__mod_1_1grib1__descriptor" ], + [ "grib2_descriptor", "structip__grid__descriptor__mod_1_1grib2__descriptor.html", "structip__grid__descriptor__mod_1_1grib2__descriptor" ], + [ "init_descriptor", "interfaceip__grid__descriptor__mod_1_1init__descriptor.html", "interfaceip__grid__descriptor__mod_1_1init__descriptor" ], + [ "ip_grid_descriptor", "structip__grid__descriptor__mod_1_1ip__grid__descriptor.html", "structip__grid__descriptor__mod_1_1ip__grid__descriptor" ], + [ "operator(==)", "interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08.html", "interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08" ] + ] ], + [ "ip_grid_factory_mod", "namespaceip__grid__factory__mod.html", [ + [ "init_grid", "interfaceip__grid__factory__mod_1_1init__grid.html", "interfaceip__grid__factory__mod_1_1init__grid" ] + ] ], + [ "ip_grid_mod", "namespaceip__grid__mod.html", [ + [ "gdswzd_interface", "interfaceip__grid__mod_1_1gdswzd__interface.html", "interfaceip__grid__mod_1_1gdswzd__interface" ], + [ "init_grib1_interface", "interfaceip__grid__mod_1_1init__grib1__interface.html", "interfaceip__grid__mod_1_1init__grib1__interface" ], + [ "init_grib2_interface", "interfaceip__grid__mod_1_1init__grib2__interface.html", "interfaceip__grid__mod_1_1init__grib2__interface" ], + [ "ip_grid", "structip__grid__mod_1_1ip__grid.html", "structip__grid__mod_1_1ip__grid" ], + [ "operator(==)", "interfaceip__grid__mod_1_1operator_07_0a_0a_08.html", "interfaceip__grid__mod_1_1operator_07_0a_0a_08" ] + ] ], + [ "ip_lambert_conf_grid_mod", "namespaceip__lambert__conf__grid__mod.html", [ + [ "ip_lambert_conf_grid", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid" ] + ] ], + [ "ip_mercator_grid_mod", "namespaceip__mercator__grid__mod.html", [ + [ "ip_mercator_grid", "structip__mercator__grid__mod_1_1ip__mercator__grid.html", "structip__mercator__grid__mod_1_1ip__mercator__grid" ] + ] ], + [ "ip_polar_stereo_grid_mod", "namespaceip__polar__stereo__grid__mod.html", [ + [ "ip_polar_stereo_grid", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid" ] + ] ], + [ "ip_rot_equid_cylind_egrid_mod", "namespaceip__rot__equid__cylind__egrid__mod.html", [ + [ "ip_rot_equid_cylind_egrid", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid" ] + ] ], + [ "ip_rot_equid_cylind_grid_mod", "namespaceip__rot__equid__cylind__grid__mod.html", [ + [ "ip_rot_equid_cylind_grid", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid" ] + ] ], + [ "ip_station_points_grid_mod", "namespaceip__station__points__grid__mod.html", [ + [ "ip_station_points_grid", "structip__station__points__grid__mod_1_1ip__station__points__grid.html", "structip__station__points__grid__mod_1_1ip__station__points__grid" ] + ] ], + [ "ipolates_mod", "namespaceipolates__mod.html", [ + [ "ipolates", "interfaceipolates__mod_1_1ipolates.html", "interfaceipolates__mod_1_1ipolates" ] + ] ], + [ "ipolatev_mod", "namespaceipolatev__mod.html", [ + [ "ipolatev", "interfaceipolatev__mod_1_1ipolatev.html", "interfaceipolatev__mod_1_1ipolatev" ] + ] ], + [ "neighbor_budget_interp_mod", "namespaceneighbor__budget__interp__mod.html", [ + [ "interpolate_neighbor_budget", "interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget.html", "interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget" ] + ] ], + [ "neighbor_interp_mod", "namespaceneighbor__interp__mod.html", [ + [ "interpolate_neighbor", "interfaceneighbor__interp__mod_1_1interpolate__neighbor.html", "interfaceneighbor__interp__mod_1_1interpolate__neighbor" ] + ] ], + [ "spectral_interp_mod", "namespacespectral__interp__mod.html", [ + [ "interpolate_spectral", "interfacespectral__interp__mod_1_1interpolate__spectral.html", "interfacespectral__interp__mod_1_1interpolate__spectral" ], + [ "polates4", "interfacespectral__interp__mod_1_1polates4.html", "interfacespectral__interp__mod_1_1polates4" ], + [ "polatev4", "interfacespectral__interp__mod_1_1polatev4.html", "interfacespectral__interp__mod_1_1polatev4" ] + ] ] +]; \ No newline at end of file diff --git a/ver-5.1.0/bc_s.png b/ver-5.1.0/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/bdwn.png b/ver-5.1.0/bdwn.png similarity index 100% rename from bdwn.png rename to ver-5.1.0/bdwn.png diff --git a/ver-5.1.0/bicubic__interp__mod_8F90.html b/ver-5.1.0/bicubic__interp__mod_8F90.html new file mode 100644 index 00000000..1ae3ce7b --- /dev/null +++ b/ver-5.1.0/bicubic__interp__mod_8F90.html @@ -0,0 +1,134 @@ + + + + + + + +NCEPLIBS-ip: bicubic_interp_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    bicubic_interp_mod.F90 File Reference
    +
    +
    + +

    Bicubic interpolation routines for scalars and vectors. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Data Types

    interface  bicubic_interp_mod::interpolate_bicubic
     
    + + + + +

    +Modules

    module  bicubic_interp_mod
     Bicubic interpolation routines for scalars and vectors.
     
    + + + + + + + +

    +Functions/Subroutines

    subroutine bicubic_interp_mod::interpolate_bicubic_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     This subprogram performs bicubic interpolation from any grid to any grid for scalar fields. More...
     
    subroutine bicubic_interp_mod::interpolate_bicubic_vector (ipopt, grid_in, grid_out, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
     This subprogram performs bicubic interpolation from any grid to any grid for vector fields. More...
     
    +

    Detailed Description

    +

    Bicubic interpolation routines for scalars and vectors.

    +
    Author
    Mark Iredell, Kyle Gerheiser, Eric Engle
    + +

    Definition in file bicubic_interp_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/bicubic__interp__mod_8F90.js b/ver-5.1.0/bicubic__interp__mod_8F90.js new file mode 100644 index 00000000..6b9a6998 --- /dev/null +++ b/ver-5.1.0/bicubic__interp__mod_8F90.js @@ -0,0 +1,6 @@ +var bicubic__interp__mod_8F90 = +[ + [ "interpolate_bicubic", "interfacebicubic__interp__mod_1_1interpolate__bicubic.html", "interfacebicubic__interp__mod_1_1interpolate__bicubic" ], + [ "interpolate_bicubic_scalar", "bicubic__interp__mod_8F90.html#a54a442e47f1be9511c1684a337d7e2d1", null ], + [ "interpolate_bicubic_vector", "bicubic__interp__mod_8F90.html#a9d27db7d350fc2699aaf5057c3b53d16", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/bicubic__interp__mod_8F90_source.html b/ver-5.1.0/bicubic__interp__mod_8F90_source.html new file mode 100644 index 00000000..b31c8184 --- /dev/null +++ b/ver-5.1.0/bicubic__interp__mod_8F90_source.html @@ -0,0 +1,565 @@ + + + + + + + +NCEPLIBS-ip: bicubic_interp_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    bicubic_interp_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    4 
    + +
    9  use gdswzd_mod
    +
    10  use polfix_mod
    +
    11  use ip_grids_mod
    +
    12  implicit none
    +
    13 
    +
    14  private
    +
    15  public :: interpolate_bicubic
    +
    16 
    + +
    18  module procedure interpolate_bicubic_scalar
    +
    19  module procedure interpolate_bicubic_vector
    +
    20  end interface interpolate_bicubic
    +
    21 
    +
    22  ! Smallest positive real value (use for equality comparisons)
    +
    23  REAL :: TINYREAL=tiny(1.0)
    +
    24 
    +
    25 contains
    +
    26 
    +
    80  SUBROUTINE interpolate_bicubic_scalar(IPOPT,grid_in,grid_out, &
    +
    81  MI,MO,KM,IBI,LI,GI, &
    +
    82  NO,RLAT,RLON,IBO,LO,GO,IRET)
    +
    83  class(ip_grid), intent(in) :: grid_in, grid_out
    +
    84  INTEGER, INTENT(IN ) :: IPOPT(20)
    +
    85  INTEGER, INTENT(IN ) :: MI,MO,KM
    +
    86  INTEGER, INTENT(IN ) :: IBI(KM)
    +
    87  INTEGER, INTENT(INOUT) :: NO
    +
    88  INTEGER, INTENT( OUT) :: IRET, IBO(KM)
    +
    89  !
    +
    90  LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
    +
    91  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
    +
    92  !
    +
    93  REAL, INTENT(IN ) :: GI(MI,KM)
    +
    94  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    95  REAL, INTENT( OUT) :: GO(MO,KM)
    +
    96  !
    +
    97  REAL, PARAMETER :: FILL=-9999.
    +
    98  !
    +
    99  INTEGER :: IJX(4),IJY(4)
    +
    100  INTEGER :: MCON,MP,N,I,J,K
    +
    101  INTEGER :: NK,NV
    +
    102  LOGICAL :: SAME_GRIDI, SAME_GRIDO
    +
    103  !
    +
    104  REAL :: PMP,XIJ,YIJ,XF,YF
    +
    105  REAL :: G,W,GMIN,GMAX
    +
    106  REAL :: WX(4),WY(4)
    +
    107  REAL :: XPTS(MO),YPTS(MO)
    +
    108  logical :: to_station_points
    +
    109 
    +
    110  ! Save coeffecients between calls and only compute if grids have changed
    +
    111  REAL, ALLOCATABLE,SAVE :: RLATX(:),RLONX(:)
    +
    112  REAL, ALLOCATABLE,SAVE :: WXY(:,:,:)
    +
    113  INTEGER, SAVE :: NOX=-1,iretx=-1
    +
    114  INTEGER, ALLOCATABLE,SAVE :: NXY(:,:,:),NC(:)
    +
    115  class(ip_grid), allocatable,save :: prev_grid_in, prev_grid_out
    +
    116 
    +
    117  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    118  ! SET PARAMETERS
    +
    119  iret=0
    +
    120  mcon=ipopt(1)
    +
    121  mp=ipopt(2)
    +
    122  IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
    +
    123  IF(mp.LT.0.OR.mp.GT.100) iret=32
    +
    124  pmp=mp*0.01
    +
    125 
    +
    126  if (.not. allocated(prev_grid_in) .or. .not. allocated(prev_grid_out)) then
    +
    127  allocate(prev_grid_in, source = grid_in)
    +
    128  allocate(prev_grid_out, source = grid_out)
    +
    129 
    +
    130  same_gridi = .false.
    +
    131  same_grido = .false.
    +
    132  else
    +
    133  same_gridi = grid_in == prev_grid_in
    +
    134  same_grido = grid_out == prev_grid_out
    +
    135 
    +
    136  if (.not. same_gridi .or. .not. same_grido) then
    +
    137  deallocate(prev_grid_in)
    +
    138  deallocate(prev_grid_out)
    +
    139 
    +
    140  allocate(prev_grid_in, source = grid_in)
    +
    141  allocate(prev_grid_out, source = grid_out)
    +
    142  end if
    +
    143  end if
    +
    144 
    +
    145  select type(grid_out)
    +
    146  type is(ip_station_points_grid)
    +
    147  to_station_points = .true.
    +
    148  class default
    +
    149  to_station_points = .false.
    +
    150  end select
    +
    151 
    +
    152  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    153  ! SAVE OR SKIP WEIGHT COMPUTATION
    +
    154  IF(iret.EQ.0.AND.(to_station_points.OR..NOT.same_gridi.OR..NOT.same_grido))THEN
    +
    155  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    156  ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
    +
    157  CALL gdswzd(grid_out,0,mo,fill,xpts,ypts,rlon,rlat,no)
    +
    158  IF(no.EQ.0) iret=3
    +
    159  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    160  ! LOCATE INPUT POINTS
    +
    161  CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv)
    +
    162  IF(iret.EQ.0.AND.nv.EQ.0) iret=2
    +
    163  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    164  ! ALLOCATE AND SAVE GRID DATA
    +
    165  IF(nox.NE.no) THEN
    +
    166  IF(nox.GE.0) DEALLOCATE(rlatx,rlonx,nc,nxy,wxy)
    +
    167  ALLOCATE(rlatx(no),rlonx(no),nc(no),nxy(4,4,no),wxy(4,4,no))
    +
    168  nox=no
    +
    169  ENDIF
    +
    170  iretx=iret
    +
    171  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    172  ! COMPUTE WEIGHTS
    +
    173  IF(iret.EQ.0) THEN
    +
    174  !$OMP PARALLEL DO PRIVATE(N,XIJ,YIJ,IJX,IJY,XF,YF,J,I,WX,WY) SCHEDULE(STATIC)
    +
    175  DO n=1,no
    +
    176  rlonx(n)=rlon(n)
    +
    177  rlatx(n)=rlat(n)
    +
    178  xij=xpts(n)
    +
    179  yij=ypts(n)
    +
    180  IF(abs(xij-fill).GT.tinyreal.AND.abs(yij-fill).GT.tinyreal) THEN
    +
    181  ijx(1:4)=floor(xij-1)+(/0,1,2,3/)
    +
    182  ijy(1:4)=floor(yij-1)+(/0,1,2,3/)
    +
    183  xf=xij-ijx(2)
    +
    184  yf=yij-ijy(2)
    +
    185  DO j=1,4
    +
    186  DO i=1,4
    +
    187  nxy(i,j,n) = grid_in%field_pos(ijx(i), ijy(j))
    +
    188  ENDDO
    +
    189  ENDDO
    +
    190  IF(minval(nxy(1:4,1:4,n)).GT.0) THEN
    +
    191  ! BICUBIC WHERE 16-POINT STENCIL IS AVAILABLE
    +
    192  nc(n)=1
    +
    193  wx(1)=xf*(1-xf)*(2-xf)/(-6.)
    +
    194  wx(2)=(xf+1)*(1-xf)*(2-xf)/2.
    +
    195  wx(3)=(xf+1)*xf*(2-xf)/2.
    +
    196  wx(4)=(xf+1)*xf*(1-xf)/(-6.)
    +
    197  wy(1)=yf*(1-yf)*(2-yf)/(-6.)
    +
    198  wy(2)=(yf+1)*(1-yf)*(2-yf)/2.
    +
    199  wy(3)=(yf+1)*yf*(2-yf)/2.
    +
    200  wy(4)=(yf+1)*yf*(1-yf)/(-6.)
    +
    201  ELSE
    +
    202  ! BILINEAR ELSEWHERE NEAR THE EDGE OF THE GRID
    +
    203  nc(n)=2
    +
    204  wx(1)=0
    +
    205  wx(2)=(1-xf)
    +
    206  wx(3)=xf
    +
    207  wx(4)=0
    +
    208  wy(1)=0
    +
    209  wy(2)=(1-yf)
    +
    210  wy(3)=yf
    +
    211  wy(4)=0
    +
    212  ENDIF
    +
    213  DO j=1,4
    +
    214  DO i=1,4
    +
    215  wxy(i,j,n)=wx(i)*wy(j)
    +
    216  ENDDO
    +
    217  ENDDO
    +
    218  ELSE
    +
    219  nc(n)=0
    +
    220  ENDIF
    +
    221  ENDDO
    +
    222  ENDIF
    +
    223  ENDIF
    +
    224  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    225  ! INTERPOLATE OVER ALL FIELDS
    +
    226  IF(iret.EQ.0.AND.iretx.EQ.0) THEN
    +
    227  IF(.not. to_station_points) THEN
    +
    228  no=nox
    +
    229  DO n=1,no
    +
    230  rlon(n)=rlonx(n)
    +
    231  rlat(n)=rlatx(n)
    +
    232  ENDDO
    +
    233  ENDIF
    +
    234  !$OMP PARALLEL DO PRIVATE(NK,K,N,G,W,GMIN,GMAX,J,I) SCHEDULE(STATIC)
    +
    235  DO nk=1,no*km
    +
    236  k=(nk-1)/no+1
    +
    237  n=nk-no*(k-1)
    +
    238  IF(nc(n).GT.0) THEN
    +
    239  g=0
    +
    240  w=0
    +
    241  IF(mcon.GT.0) gmin=huge(gmin)
    +
    242  IF(mcon.GT.0) gmax=-huge(gmax)
    +
    243  DO j=nc(n),5-nc(n)
    +
    244  DO i=nc(n),5-nc(n)
    +
    245  IF(nxy(i,j,n).GT.0)THEN
    +
    246  IF(ibi(k).EQ.0.OR.li(nxy(i,j,n),k))THEN
    +
    247  g=g+wxy(i,j,n)*gi(nxy(i,j,n),k)
    +
    248  w=w+wxy(i,j,n)
    +
    249  IF(mcon.GT.0) gmin=min(gmin,gi(nxy(i,j,n),k))
    +
    250  IF(mcon.GT.0) gmax=max(gmax,gi(nxy(i,j,n),k))
    +
    251  ENDIF
    +
    252  ENDIF
    +
    253  ENDDO
    +
    254  ENDDO
    +
    255  lo(n,k)=w.GE.pmp
    +
    256  IF(lo(n,k)) THEN
    +
    257  go(n,k)=g/w
    +
    258  IF(mcon.GT.0) go(n,k)=min(max(go(n,k),gmin),gmax)
    +
    259  ELSE
    +
    260  go(n,k)=0.
    +
    261  ENDIF
    +
    262  ELSE
    +
    263  lo(n,k)=.false.
    +
    264  go(n,k)=0.
    +
    265  ENDIF
    +
    266  ENDDO
    +
    267  DO k=1,km
    +
    268  ibo(k)=ibi(k)
    +
    269  IF(.NOT.all(lo(1:no,k))) ibo(k)=1
    +
    270  ENDDO
    +
    271  select type(grid_out)
    +
    272  type is(ip_equid_cylind_grid)
    +
    273  CALL polfixs(no,mo,km,rlat,ibo,lo,go)
    +
    274  end select
    +
    275  ELSE
    +
    276  IF(iret.EQ.0) iret=iretx
    +
    277  IF(.not. to_station_points) no=0
    +
    278  ENDIF
    +
    279  end subroutine interpolate_bicubic_scalar
    +
    280 
    +
    338  subroutine interpolate_bicubic_vector(ipopt, grid_in, grid_out, &
    +
    339  mi, mo, km, ibi, li, ui, vi, &
    +
    340  no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
    +
    341  class(ip_grid), intent(in) :: grid_in, grid_out
    +
    342  INTEGER, INTENT(IN ) :: IPOPT(20)
    +
    343  INTEGER, INTENT(IN ) :: IBI(KM),MI,MO,KM
    +
    344  INTEGER, INTENT(INOUT) :: NO
    +
    345  INTEGER, INTENT( OUT) :: IRET, IBO(KM)
    +
    346  !
    +
    347  LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
    +
    348  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
    +
    349  !
    +
    350  REAL, INTENT(IN ) :: UI(MI,KM),VI(MI,KM)
    +
    351  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO),CROT(MO),SROT(MO)
    +
    352  REAL, INTENT( OUT) :: UO(MO,KM),VO(MO,KM)
    +
    353  !
    +
    354  REAL, PARAMETER :: FILL=-9999.
    +
    355  !
    +
    356  INTEGER :: IJX(4),IJY(4)
    +
    357  INTEGER :: MCON,MP,N,I,J,K,NK,NV
    +
    358  !
    +
    359  LOGICAL :: SAME_GRIDI,SAME_GRIDO
    +
    360  !
    +
    361  REAL :: CM,SM,UROT,VROT
    +
    362  REAL :: PMP,XIJ,YIJ,XF,YF
    +
    363  REAL :: U,V,W,UMIN,UMAX,VMIN,VMAX
    +
    364  REAL :: XPTS(MO),YPTS(MO)
    +
    365  REAL :: WX(4),WY(4)
    +
    366  REAL :: XPTI(MI),YPTI(MI),RLOI(MI),RLAI(MI)
    +
    367  REAL :: CROI(MI),SROI(MI)
    +
    368 
    +
    369  logical :: to_station_points
    +
    370 
    +
    371  ! Save coeffecients between calls and only compute if grids have changed
    +
    372  REAL, ALLOCATABLE, SAVE :: RLATX(:),RLONX(:),CROTX(:),SROTX(:)
    +
    373  REAL, ALLOCATABLE, SAVE :: WXY(:,:,:),CXY(:,:,:),SXY(:,:,:)
    +
    374  INTEGER, SAVE :: NOX=-1,iretx=-1
    +
    375  INTEGER, ALLOCATABLE, SAVE :: NXY(:,:,:),NC(:)
    +
    376  class(ip_grid), allocatable, save :: prev_grid_in, prev_grid_out
    +
    377  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    378  ! SET PARAMETERS
    +
    379  iret=0
    +
    380  mcon=ipopt(1)
    +
    381  mp=ipopt(2)
    +
    382  IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
    +
    383  IF(mp.LT.0.OR.mp.GT.100) iret=32
    +
    384  pmp=mp*0.01
    +
    385 
    +
    386 
    +
    387  if (.not. allocated(prev_grid_in) .or. .not. allocated(prev_grid_out)) then
    +
    388  allocate(prev_grid_in, source = grid_in)
    +
    389  allocate(prev_grid_out, source = grid_out)
    +
    390 
    +
    391  same_gridi = .false.
    +
    392  same_grido = .false.
    +
    393  else
    +
    394  same_gridi = grid_in == prev_grid_in
    +
    395  same_grido = grid_out == prev_grid_out
    +
    396 
    +
    397  if (.not. same_gridi .or. .not. same_grido) then
    +
    398  deallocate(prev_grid_in)
    +
    399  deallocate(prev_grid_out)
    +
    400 
    +
    401  allocate(prev_grid_in, source = grid_in)
    +
    402  allocate(prev_grid_out, source = grid_out)
    +
    403  end if
    +
    404  end if
    +
    405 
    +
    406  select type(grid_out)
    +
    407  type is(ip_station_points_grid)
    +
    408  to_station_points = .true.
    +
    409  class default
    +
    410  to_station_points = .false.
    +
    411  end select
    +
    412 
    +
    413  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    414  ! SAVE OR SKIP WEIGHT COMPUTATION
    +
    415  IF(iret.EQ.0.AND.(to_station_points.OR..NOT.same_gridi.OR..NOT.same_grido))THEN
    +
    416  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    417  ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
    +
    418  CALL gdswzd(grid_out, 0,mo,fill,xpts,ypts,rlon,rlat,no,crot,srot)
    +
    419  IF(no.EQ.0) iret=3
    +
    420  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    421  ! LOCATE INPUT POINTS
    +
    422  CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv)
    +
    423  IF(iret.EQ.0.AND.nv.EQ.0) iret=2
    +
    424  CALL gdswzd(grid_in, 0,mi,fill,xpti,ypti,rloi,rlai,nv,croi,sroi)
    +
    425  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    426  ! ALLOCATE AND SAVE GRID DATA
    +
    427  IF(nox.NE.no) THEN
    +
    428  IF(nox.GE.0) DEALLOCATE(rlatx,rlonx,crotx,srotx,nc,nxy,wxy,cxy,sxy)
    +
    429  ALLOCATE(rlatx(no),rlonx(no),crotx(no),srotx(no),nc(no), &
    +
    430  nxy(4,4,no),wxy(4,4,no),cxy(4,4,no),sxy(4,4,no))
    +
    431  nox=no
    +
    432  ENDIF
    +
    433  iretx=iret
    +
    434  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    435  ! COMPUTE WEIGHTS
    +
    436  IF(iret.EQ.0) THEN
    +
    437  !$OMP PARALLEL DO PRIVATE(N,XIJ,YIJ,IJX,IJY,XF,YF,J,I,WX,WY,CM,SM) SCHEDULE(STATIC)
    +
    438  DO n=1,no
    +
    439  rlonx(n)=rlon(n)
    +
    440  rlatx(n)=rlat(n)
    +
    441  crotx(n)=crot(n)
    +
    442  srotx(n)=srot(n)
    +
    443  xij=xpts(n)
    +
    444  yij=ypts(n)
    +
    445  IF(abs(xij-fill).GT.tinyreal.AND.abs(yij-fill).GT.tinyreal) THEN
    +
    446  ijx(1:4)=floor(xij-1)+(/0,1,2,3/)
    +
    447  ijy(1:4)=floor(yij-1)+(/0,1,2,3/)
    +
    448  xf=xij-ijx(2)
    +
    449  yf=yij-ijy(2)
    +
    450  DO j=1,4
    +
    451  DO i=1,4
    +
    452  nxy(i,j,n) = grid_in%field_pos(ijx(i), ijy(j))
    +
    453  ENDDO
    +
    454  ENDDO
    +
    455  IF(minval(nxy(1:4,1:4,n)).GT.0) THEN
    +
    456  ! BICUBIC WHERE 16-POINT STENCIL IS AVAILABLE
    +
    457  nc(n)=1
    +
    458  wx(1)=xf*(1-xf)*(2-xf)/(-6.)
    +
    459  wx(2)=(xf+1)*(1-xf)*(2-xf)/2.
    +
    460  wx(3)=(xf+1)*xf*(2-xf)/2.
    +
    461  wx(4)=(xf+1)*xf*(1-xf)/(-6.)
    +
    462  wy(1)=yf*(1-yf)*(2-yf)/(-6.)
    +
    463  wy(2)=(yf+1)*(1-yf)*(2-yf)/2.
    +
    464  wy(3)=(yf+1)*yf*(2-yf)/2.
    +
    465  wy(4)=(yf+1)*yf*(1-yf)/(-6.)
    +
    466  ELSE
    +
    467  ! BILINEAR ELSEWHERE NEAR THE EDGE OF THE GRID
    +
    468  nc(n)=2
    +
    469  wx(1)=0
    +
    470  wx(2)=(1-xf)
    +
    471  wx(3)=xf
    +
    472  wx(4)=0
    +
    473  wy(1)=0
    +
    474  wy(2)=(1-yf)
    +
    475  wy(3)=yf
    +
    476  wy(4)=0
    +
    477  ENDIF
    +
    478  DO j=1,4
    +
    479  DO i=1,4
    +
    480  wxy(i,j,n)=wx(i)*wy(j)
    +
    481  IF(nxy(i,j,n).GT.0) THEN
    +
    482  CALL movect(rlai(nxy(i,j,n)),rloi(nxy(i,j,n)), &
    +
    483  rlat(n),rlon(n),cm,sm)
    +
    484  cxy(i,j,n)=cm*croi(nxy(i,j,n))+sm*sroi(nxy(i,j,n))
    +
    485  sxy(i,j,n)=sm*croi(nxy(i,j,n))-cm*sroi(nxy(i,j,n))
    +
    486  ENDIF
    +
    487  ENDDO
    +
    488  ENDDO
    +
    489  ELSE
    +
    490  nc(n)=0
    +
    491  ENDIF
    +
    492  ENDDO
    +
    493  ENDIF
    +
    494  ENDIF
    +
    495  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    496  ! INTERPOLATE OVER ALL FIELDS
    +
    497  IF(iret.EQ.0.AND.iretx.EQ.0) THEN
    +
    498  IF(.not. to_station_points) THEN
    +
    499  no=nox
    +
    500  DO n=1,no
    +
    501  rlon(n)=rlonx(n)
    +
    502  rlat(n)=rlatx(n)
    +
    503  crot(n)=crotx(n)
    +
    504  srot(n)=srotx(n)
    +
    505  ENDDO
    +
    506  ENDIF
    +
    507  !$OMP PARALLEL DO PRIVATE(NK,K,N,U,V,W,UMIN,UMAX,VMIN,VMAX,UROT,VROT,J,I) SCHEDULE(STATIC)
    +
    508  DO nk=1,no*km
    +
    509  k=(nk-1)/no+1
    +
    510  n=nk-no*(k-1)
    +
    511  IF(nc(n).GT.0) THEN
    +
    512  u=0
    +
    513  v=0
    +
    514  w=0
    +
    515  IF(mcon.GT.0) umin=huge(umin)
    +
    516  IF(mcon.GT.0) umax=-huge(umax)
    +
    517  IF(mcon.GT.0) vmin=huge(vmin)
    +
    518  IF(mcon.GT.0) vmax=-huge(vmax)
    +
    519  DO j=nc(n),5-nc(n)
    +
    520  DO i=nc(n),5-nc(n)
    +
    521  IF(nxy(i,j,n).GT.0) THEN
    +
    522  IF(ibi(k).EQ.0.OR.li(nxy(i,j,n),k)) THEN
    +
    523  urot=cxy(i,j,n)*ui(nxy(i,j,n),k)-sxy(i,j,n)*vi(nxy(i,j,n),k)
    +
    524  vrot=sxy(i,j,n)*ui(nxy(i,j,n),k)+cxy(i,j,n)*vi(nxy(i,j,n),k)
    +
    525  u=u+wxy(i,j,n)*urot
    +
    526  v=v+wxy(i,j,n)*vrot
    +
    527  w=w+wxy(i,j,n)
    +
    528  IF(mcon.GT.0) umin=min(umin,urot)
    +
    529  IF(mcon.GT.0) umax=max(umax,urot)
    +
    530  IF(mcon.GT.0) vmin=min(vmin,vrot)
    +
    531  IF(mcon.GT.0) vmax=max(vmax,vrot)
    +
    532  ENDIF
    +
    533  ENDIF
    +
    534  ENDDO
    +
    535  ENDDO
    +
    536  lo(n,k)=w.GE.pmp
    +
    537  IF(lo(n,k)) THEN
    +
    538  urot=crot(n)*u-srot(n)*v
    +
    539  vrot=srot(n)*u+crot(n)*v
    +
    540  uo(n,k)=urot/w
    +
    541  vo(n,k)=vrot/w
    +
    542  IF(mcon.GT.0) uo(n,k)=min(max(uo(n,k),umin),umax)
    +
    543  IF(mcon.GT.0) vo(n,k)=min(max(vo(n,k),vmin),vmax)
    +
    544  ELSE
    +
    545  uo(n,k)=0.
    +
    546  vo(n,k)=0.
    +
    547  ENDIF
    +
    548  ELSE
    +
    549  lo(n,k)=.false.
    +
    550  uo(n,k)=0.
    +
    551  vo(n,k)=0.
    +
    552  ENDIF
    +
    553  ENDDO
    +
    554  DO k=1,km
    +
    555  ibo(k)=ibi(k)
    +
    556  IF(.NOT.all(lo(1:no,k))) ibo(k)=1
    +
    557  ENDDO
    +
    558  select type(grid_out)
    +
    559  type is(ip_equid_cylind_grid)
    +
    560  CALL polfixv(no,mo,km,rlat,rlon,ibo,lo,uo,vo)
    +
    561  end select
    +
    562  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    563  ELSE
    +
    564  IF(iret.EQ.0) iret=iretx
    +
    565  IF(.not. to_station_points) no=0
    +
    566  ENDIF
    +
    567  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    568  end subroutine interpolate_bicubic_vector
    +
    569 
    +
    570 end module bicubic_interp_mod
    + + +
    subroutine movect(FLAT, FLON, TLAT, TLON, CROT, SROT)
    This subprogram provides the rotation parameters to move a vector along a great circle from one posit...
    Definition: movect.F90:26
    +
    Bicubic interpolation routines for scalars and vectors.
    +
    subroutine interpolate_bicubic_scalar(IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
    This subprogram performs bicubic interpolation from any grid to any grid for scalar fields.
    +
    subroutine interpolate_bicubic_vector(ipopt, grid_in, grid_out, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
    This subprogram performs bicubic interpolation from any grid to any grid for vector fields.
    +
    Driver module for gdswzd routines.
    Definition: gdswzd_mod.F90:25
    +
    Re-export the individual grids.
    Definition: ip_grids_mod.F90:7
    +
    Make multiple pole scalar values consistent.
    Definition: polfix_mod.F90:7
    +
    subroutine, public polfixs(NM, NX, KM, RLAT, IB, LO, GO)
    Make multiple pole scalar values consistent.
    Definition: polfix_mod.F90:30
    +
    subroutine, public polfixv(NM, NX, KM, RLAT, RLON, IB, LO, UO, VO)
    Make multiple pole vector values consistent,.
    Definition: polfix_mod.F90:125
    +
    +
    + + + + diff --git a/ver-5.1.0/bilinear__interp__mod_8F90.html b/ver-5.1.0/bilinear__interp__mod_8F90.html new file mode 100644 index 00000000..f289e4f4 --- /dev/null +++ b/ver-5.1.0/bilinear__interp__mod_8F90.html @@ -0,0 +1,134 @@ + + + + + + + +NCEPLIBS-ip: bilinear_interp_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    bilinear_interp_mod.F90 File Reference
    +
    +
    + +

    Bilinear interpolation routines for scalars and vectors. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Data Types

    interface  bilinear_interp_mod::interpolate_bilinear
     
    + + + + +

    +Modules

    module  bilinear_interp_mod
     Bilinear interpolation routines for scalars and vectors.
     
    + + + + + + + +

    +Functions/Subroutines

    subroutine bilinear_interp_mod::interpolate_bilinear_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     This subprogram performs bilinear interpolation from any grid to any grid for scalar fields. More...
     
    subroutine bilinear_interp_mod::interpolate_bilinear_vector (ipopt, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     This subprogram performs bilinear interpolation from any grid to any grid for vector fields. More...
     
    +

    Detailed Description

    +

    Bilinear interpolation routines for scalars and vectors.

    +
    Author
    Mark Iredell, Kyle Gerheiser, Eric Engle
    + +

    Definition in file bilinear_interp_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/bilinear__interp__mod_8F90.js b/ver-5.1.0/bilinear__interp__mod_8F90.js new file mode 100644 index 00000000..27b7b9c0 --- /dev/null +++ b/ver-5.1.0/bilinear__interp__mod_8F90.js @@ -0,0 +1,6 @@ +var bilinear__interp__mod_8F90 = +[ + [ "interpolate_bilinear", "interfacebilinear__interp__mod_1_1interpolate__bilinear.html", "interfacebilinear__interp__mod_1_1interpolate__bilinear" ], + [ "interpolate_bilinear_scalar", "bilinear__interp__mod_8F90.html#a34d2eea4682104097dccf3e7ab6a9398", null ], + [ "interpolate_bilinear_vector", "bilinear__interp__mod_8F90.html#abc218f8774d2af09299eb299d6f38e04", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/bilinear__interp__mod_8F90_source.html b/ver-5.1.0/bilinear__interp__mod_8F90_source.html new file mode 100644 index 00000000..810f6f11 --- /dev/null +++ b/ver-5.1.0/bilinear__interp__mod_8F90_source.html @@ -0,0 +1,534 @@ + + + + + + + +NCEPLIBS-ip: bilinear_interp_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    bilinear_interp_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    4 
    + +
    9  use gdswzd_mod
    +
    10  use ip_grids_mod
    + + +
    13  use polfix_mod
    +
    14  implicit none
    +
    15 
    +
    16  private
    +
    17  public :: interpolate_bilinear
    +
    18 
    + +
    20  module procedure interpolate_bilinear_scalar
    +
    21  module procedure interpolate_bilinear_vector
    +
    22  end interface interpolate_bilinear
    +
    23 
    +
    24  ! Smallest positive real value (use for equality comparisons)
    +
    25  REAL :: TINYREAL=tiny(1.0)
    +
    26 
    +
    27 contains
    +
    28 
    +
    72  subroutine interpolate_bilinear_scalar(IPOPT,grid_in,grid_out,MI,MO,KM,IBI,LI,GI,NO,RLAT,RLON,IBO,LO,GO,IRET)
    +
    73  class(ip_grid), intent(in) :: grid_in, grid_out
    +
    74  INTEGER, INTENT(IN ) :: IPOPT(20)
    +
    75  INTEGER, INTENT(IN ) :: MI,MO,KM
    +
    76  INTEGER, INTENT(IN ) :: IBI(KM)
    +
    77  INTEGER, INTENT(INOUT) :: NO
    +
    78  INTEGER, INTENT( OUT) :: IRET, IBO(KM)
    +
    79  !
    +
    80  LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
    +
    81  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
    +
    82  !
    +
    83  REAL, INTENT(IN ) :: GI(MI,KM)
    +
    84  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    85  REAL, INTENT( OUT) :: GO(MO,KM)
    +
    86  !
    +
    87  REAL, PARAMETER :: FILL=-9999.
    +
    88  !
    +
    89  INTEGER :: IJX(2),IJY(2)
    +
    90  INTEGER :: MP,N,I,J,K
    +
    91  INTEGER :: NK,NV
    +
    92  INTEGER :: MSPIRAL,I1,J1,IXS,JXS
    +
    93  INTEGER :: MX,KXS,KXT,IX,JX,NX
    +
    94  !
    +
    95  LOGICAL :: SAME_GRIDI, SAME_GRIDO
    +
    96  !
    +
    97  REAL :: WX(2),WY(2)
    +
    98  REAL :: XPTS(MO),YPTS(MO)
    +
    99  REAL :: PMP,XIJ,YIJ,XF,YF,G,W
    +
    100 
    +
    101  logical :: to_station_points
    +
    102 
    +
    103  ! Save coeffecients between calls and only compute if grids have changed
    +
    104  INTEGER, SAVE :: NOX=-1,iretx=-1
    +
    105  INTEGER, ALLOCATABLE,SAVE :: NXY(:,:,:)
    +
    106  REAL, ALLOCATABLE,SAVE :: RLATX(:),RLONX(:)
    +
    107  REAL, ALLOCATABLE,SAVE :: WXY(:,:,:)
    +
    108  class(ip_grid), allocatable,save :: prev_grid_in, prev_grid_out
    +
    109 
    +
    110  iret=0
    +
    111  mp=ipopt(1)
    +
    112  IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
    +
    113  IF(mp.LT.0.OR.mp.GT.100) iret=32
    +
    114  pmp=mp*0.01
    +
    115  mspiral=max(ipopt(2),0)
    +
    116 
    +
    117  if (.not. allocated(prev_grid_in) .or. .not. allocated(prev_grid_out)) then
    +
    118  allocate(prev_grid_in, source = grid_in)
    +
    119  allocate(prev_grid_out, source = grid_out)
    +
    120 
    +
    121  same_gridi = .false.
    +
    122  same_grido = .false.
    +
    123  else
    +
    124  same_gridi = grid_in == prev_grid_in
    +
    125  same_grido = grid_out == prev_grid_out
    +
    126 
    +
    127  if (.not. same_gridi .or. .not. same_grido) then
    +
    128  deallocate(prev_grid_in)
    +
    129  deallocate(prev_grid_out)
    +
    130 
    +
    131  allocate(prev_grid_in, source = grid_in)
    +
    132  allocate(prev_grid_out, source = grid_out)
    +
    133  end if
    +
    134  end if
    +
    135 
    +
    136  select type(grid_out)
    +
    137  type is(ip_station_points_grid)
    +
    138  to_station_points = .true.
    +
    139  class default
    +
    140  to_station_points = .false.
    +
    141  end select
    +
    142 
    +
    143  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    144  ! SAVE OR SKIP WEIGHT COMPUTATION
    +
    145  IF(iret==0.AND.(to_station_points.OR..NOT.same_gridi.OR..NOT.same_grido))THEN
    +
    146  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    147  ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
    +
    148  CALL gdswzd(grid_out, 0,mo,fill,xpts,ypts,rlon,rlat,no)
    +
    149  IF(no.EQ.0) iret=3
    +
    150  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    151  ! LOCATE INPUT POINTS
    +
    152  CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv)
    +
    153  IF(iret.EQ.0.AND.nv.EQ.0) iret=2
    +
    154  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    155  ! ALLOCATE AND SAVE GRID DATA
    +
    156  IF(nox.NE.no) THEN
    +
    157  IF(nox.GE.0) DEALLOCATE(rlatx,rlonx,nxy,wxy)
    +
    158  ALLOCATE(rlatx(no),rlonx(no),nxy(2,2,no),wxy(2,2,no))
    +
    159  nox=no
    +
    160  ENDIF
    +
    161  iretx=iret
    +
    162  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    163  ! COMPUTE WEIGHTS
    +
    164  IF(iret.EQ.0) THEN
    +
    165  !$OMP PARALLEL DO PRIVATE(N,XIJ,YIJ,IJX,IJY,XF,YF,J,I,WX,WY) SCHEDULE(STATIC)
    +
    166  DO n=1,no
    +
    167  rlonx(n)=rlon(n)
    +
    168  rlatx(n)=rlat(n)
    +
    169  xij=xpts(n)
    +
    170  yij=ypts(n)
    +
    171  IF(abs(xij-fill).GT.tinyreal.AND.abs(yij-fill).GT.tinyreal) THEN
    +
    172  ijx(1:2)=floor(xij)+(/0,1/)
    +
    173  ijy(1:2)=floor(yij)+(/0,1/)
    +
    174  xf=xij-ijx(1)
    +
    175  yf=yij-ijy(1)
    +
    176  wx(1)=(1-xf)
    +
    177  wx(2)=xf
    +
    178  wy(1)=(1-yf)
    +
    179  wy(2)=yf
    +
    180  DO j=1,2
    +
    181  DO i=1,2
    +
    182  nxy(i,j,n)=grid_in%field_pos(ijx(i), ijy(j))
    +
    183  wxy(i,j,n)=wx(i)*wy(j)
    +
    184  ENDDO
    +
    185  ENDDO
    +
    186  ELSE
    +
    187  nxy(:,:,n)=0
    +
    188  ENDIF
    +
    189  ENDDO
    +
    190  ENDIF
    +
    191  ENDIF
    +
    192  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    193  ! INTERPOLATE OVER ALL FIELDS
    +
    194  IF(iret.EQ.0.AND.iretx.EQ.0) THEN
    +
    195  IF(.not. to_station_points) THEN
    +
    196  no=nox
    +
    197  DO n=1,no
    +
    198  rlon(n)=rlonx(n)
    +
    199  rlat(n)=rlatx(n)
    +
    200  ENDDO
    +
    201  ENDIF
    +
    202  !$OMP PARALLEL DO &
    +
    203  !$OMP PRIVATE(NK,K,N,G,W,J,I) &
    +
    204  !$OMP PRIVATE(I1,J1,IXS,JXS,MX,KXS,KXT,IX,JX,NX) SCHEDULE(STATIC)
    +
    205  DO nk=1,no*km
    +
    206  k=(nk-1)/no+1
    +
    207  n=nk-no*(k-1)
    +
    208  g=0
    +
    209  w=0
    +
    210  DO j=1,2
    +
    211  DO i=1,2
    +
    212  IF(nxy(i,j,n).GT.0)THEN
    +
    213  IF(ibi(k).EQ.0.OR.li(nxy(i,j,n),k)) THEN
    +
    214  g=g+wxy(i,j,n)*gi(nxy(i,j,n),k)
    +
    215  w=w+wxy(i,j,n)
    +
    216  ENDIF
    +
    217  ENDIF
    +
    218  ENDDO
    +
    219  ENDDO
    +
    220  lo(n,k)=w.GE.pmp
    +
    221  IF(lo(n,k)) THEN
    +
    222  go(n,k)=g/w
    +
    223  ELSEIF(mspiral.GT.0.AND.abs(xpts(n)-fill).GT.tinyreal.AND.abs(ypts(n)-fill).GT.tinyreal) THEN
    +
    224  i1=nint(xpts(n))
    +
    225  j1=nint(ypts(n))
    +
    226  ixs=int(sign(1.,xpts(n)-i1))
    +
    227  jxs=int(sign(1.,ypts(n)-j1))
    +
    228  spiral : DO mx=1,mspiral**2
    +
    229  kxs=int(sqrt(4*mx-2.5))
    +
    230  kxt=mx-(kxs**2/4+1)
    +
    231  SELECT CASE(mod(kxs,4))
    +
    232  CASE(1)
    +
    233  ix=i1-ixs*(kxs/4-kxt)
    +
    234  jx=j1-jxs*kxs/4
    +
    235  CASE(2)
    +
    236  ix=i1+ixs*(1+kxs/4)
    +
    237  jx=j1-jxs*(kxs/4-kxt)
    +
    238  CASE(3)
    +
    239  ix=i1+ixs*(1+kxs/4-kxt)
    +
    240  jx=j1+jxs*(1+kxs/4)
    +
    241  CASE DEFAULT
    +
    242  ix=i1-ixs*kxs/4
    +
    243  jx=j1+jxs*(kxs/4-kxt)
    +
    244  END SELECT
    +
    245  nx=grid_in%field_pos(ix, jx)
    +
    246  IF(nx.GT.0.)THEN
    +
    247  IF(li(nx,k).OR.ibi(k).EQ.0)THEN
    +
    248  go(n,k)=gi(nx,k)
    +
    249  lo(n,k)=.true.
    +
    250  EXIT spiral
    +
    251  ENDIF
    +
    252  ENDIF
    +
    253  ENDDO spiral
    +
    254  IF(.NOT.lo(n,k))THEN
    +
    255  ibo(k)=1
    +
    256  go(n,k)=0.
    +
    257  ENDIF
    +
    258  ELSE
    +
    259  go(n,k)=0.
    +
    260  ENDIF
    +
    261  ENDDO
    +
    262  DO k=1,km
    +
    263  ibo(k)=ibi(k)
    +
    264  IF(.NOT.all(lo(1:no,k))) ibo(k)=1
    +
    265  ENDDO
    +
    266  select type(grid_out)
    +
    267  type is(ip_equid_cylind_grid)
    +
    268  CALL polfixs(no,mo,km,rlat,ibo,lo,go)
    +
    269  end select
    +
    270  ELSE
    +
    271  IF(iret.EQ.0) iret=iretx
    +
    272  IF(.not. to_station_points) no=0
    +
    273  ENDIF
    +
    274 
    +
    275  end subroutine interpolate_bilinear_scalar
    +
    276 
    +
    329  SUBROUTINE interpolate_bilinear_vector(ipopt,grid_in,grid_out, &
    +
    330  MI,MO,KM,IBI,LI,UI,VI, &
    +
    331  NO,RLAT,RLON,CROT,SROT,IBO,LO,UO,VO,IRET)
    +
    332  class(ip_grid), intent(in) :: grid_in, grid_out
    +
    333  INTEGER, INTENT(IN ) :: IPOPT(20),IBI(KM),MI,MO,KM
    +
    334  INTEGER, INTENT(INOUT) :: NO
    +
    335  INTEGER, INTENT( OUT) :: IRET, IBO(KM)
    +
    336  !
    +
    337  LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
    +
    338  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
    +
    339  !
    +
    340  REAL, INTENT(IN ) :: UI(MI,KM),VI(MI,KM)
    +
    341  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO),CROT(MO),SROT(MO)
    +
    342  REAL, INTENT( OUT) :: UO(MO,KM),VO(MO,KM)
    +
    343  !
    +
    344  REAL, PARAMETER :: FILL=-9999.
    +
    345  !
    +
    346  INTEGER :: IJX(2),IJY(2)
    +
    347  INTEGER :: MP,N,I,J,K,NK,NV
    +
    348  !
    +
    349  LOGICAL :: SAME_GRIDI, SAME_GRIDO
    +
    350  !
    +
    351  REAL :: CM,SM,UROT,VROT
    +
    352  REAL :: PMP,XIJ,YIJ,XF,YF,U,V,W
    +
    353  REAL :: XPTS(MO),YPTS(MO)
    +
    354  REAL :: WX(2),WY(2)
    +
    355  REAL :: XPTI(MI),YPTI(MI)
    +
    356  REAL :: RLOI(MI),RLAI(MI)
    +
    357  REAL :: CROI(MI),SROI(MI)
    +
    358 
    +
    359  logical :: to_station_points
    +
    360 
    +
    361  ! Save coeffecients between calls and only compute if grids have changed
    +
    362  INTEGER, SAVE :: NOX=-1,iretx=-1
    +
    363  INTEGER, ALLOCATABLE,SAVE :: NXY(:,:,:)
    +
    364  REAL, ALLOCATABLE,SAVE :: RLATX(:),RLONX(:)
    +
    365  REAL, ALLOCATABLE,SAVE :: CROTX(:),SROTX(:)
    +
    366  REAL, ALLOCATABLE,SAVE :: WXY(:,:,:),CXY(:,:,:),SXY(:,:,:)
    +
    367  class(ip_grid), allocatable,save :: prev_grid_in, prev_grid_out
    +
    368 
    +
    369  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    370  ! SET PARAMETERS
    +
    371  iret=0
    +
    372  mp=ipopt(1)
    +
    373  IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
    +
    374  IF(mp.LT.0.OR.mp.GT.100) iret=32
    +
    375  pmp=mp*0.01
    +
    376 
    +
    377  if (.not. allocated(prev_grid_in) .or. .not. allocated(prev_grid_out)) then
    +
    378  allocate(prev_grid_in, source = grid_in)
    +
    379  allocate(prev_grid_out, source = grid_out)
    +
    380 
    +
    381  same_gridi = .false.
    +
    382  same_grido = .false.
    +
    383  else
    +
    384  same_gridi = grid_in == prev_grid_in
    +
    385  same_grido = grid_out == prev_grid_out
    +
    386 
    +
    387  if (.not. same_gridi .or. .not. same_grido) then
    +
    388  deallocate(prev_grid_in)
    +
    389  deallocate(prev_grid_out)
    +
    390 
    +
    391  allocate(prev_grid_in, source = grid_in)
    +
    392  allocate(prev_grid_out, source = grid_out)
    +
    393  end if
    +
    394  end if
    +
    395 
    +
    396  select type(grid_out)
    +
    397  type is(ip_station_points_grid)
    +
    398  to_station_points = .true.
    +
    399  class default
    +
    400  to_station_points = .false.
    +
    401  end select
    +
    402 
    +
    403  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    404  ! SAVE OR SKIP WEIGHT COMPUTATION
    +
    405  IF(iret.EQ.0.AND.(to_station_points.OR..NOT.same_gridi.OR..NOT.same_grido))THEN
    +
    406  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    407  ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
    +
    408  CALL gdswzd(grid_out, 0,mo,fill,xpts,ypts,rlon,rlat,no,crot,srot)
    +
    409  IF(no.EQ.0) iret=3
    +
    410  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    411  ! LOCATE INPUT POINTS
    +
    412  CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv)
    +
    413  IF(iret.EQ.0.AND.nv.EQ.0) iret=2
    +
    414  CALL gdswzd(grid_in, 0,mi,fill,xpti,ypti,rloi,rlai,nv,croi,sroi)
    +
    415  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    416  ! ALLOCATE AND SAVE GRID DATA
    +
    417  IF(nox.NE.no) THEN
    +
    418  IF(nox.GE.0) DEALLOCATE(rlatx,rlonx,crotx,srotx,nxy,wxy,cxy,sxy)
    +
    419  ALLOCATE(rlatx(no),rlonx(no),crotx(no),srotx(no), &
    +
    420  nxy(2,2,no),wxy(2,2,no),cxy(2,2,no),sxy(2,2,no))
    +
    421  nox=no
    +
    422  ENDIF
    +
    423  iretx=iret
    +
    424  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    425  ! COMPUTE WEIGHTS
    +
    426  IF(iret.EQ.0) THEN
    +
    427  !$OMP PARALLEL DO PRIVATE(N,XIJ,YIJ,IJX,IJY,XF,YF,J,I,WX,WY,CM,SM) SCHEDULE(STATIC)
    +
    428  DO n=1,no
    +
    429  rlonx(n)=rlon(n)
    +
    430  rlatx(n)=rlat(n)
    +
    431  crotx(n)=crot(n)
    +
    432  srotx(n)=srot(n)
    +
    433  xij=xpts(n)
    +
    434  yij=ypts(n)
    +
    435  IF(abs(xij-fill).GT.tinyreal.AND.abs(yij-fill).GT.tinyreal) THEN
    +
    436  ijx(1:2)=floor(xij)+(/0,1/)
    +
    437  ijy(1:2)=floor(yij)+(/0,1/)
    +
    438  xf=xij-ijx(1)
    +
    439  yf=yij-ijy(1)
    +
    440  wx(1)=(1-xf)
    +
    441  wx(2)=xf
    +
    442  wy(1)=(1-yf)
    +
    443  wy(2)=yf
    +
    444  DO j=1,2
    +
    445  DO i=1,2
    +
    446  nxy(i, j, n) = grid_in%field_pos(ijx(i), ijy(j))
    +
    447  wxy(i,j,n)=wx(i)*wy(j)
    +
    448  IF(nxy(i,j,n).GT.0) THEN
    +
    449  CALL movect(rlai(nxy(i,j,n)),rloi(nxy(i,j,n)), &
    +
    450  rlat(n),rlon(n),cm,sm)
    +
    451  cxy(i,j,n)=cm*croi(nxy(i,j,n))+sm*sroi(nxy(i,j,n))
    +
    452  sxy(i,j,n)=sm*croi(nxy(i,j,n))-cm*sroi(nxy(i,j,n))
    +
    453  ENDIF
    +
    454  ENDDO
    +
    455  ENDDO
    +
    456  ELSE
    +
    457  nxy(:,:,n)=0
    +
    458  ENDIF
    +
    459  ENDDO
    +
    460  ENDIF ! IS IRET 0?
    +
    461  ENDIF
    +
    462  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    463  ! INTERPOLATE OVER ALL FIELDS
    +
    464  IF(iret.EQ.0.AND.iretx.EQ.0) THEN
    +
    465  IF(.not. to_station_points) THEN
    +
    466  no=nox
    +
    467  DO n=1,no
    +
    468  rlon(n)=rlonx(n)
    +
    469  rlat(n)=rlatx(n)
    +
    470  crot(n)=crotx(n)
    +
    471  srot(n)=srotx(n)
    +
    472  ENDDO
    +
    473  ENDIF
    +
    474  !$OMP PARALLEL DO PRIVATE(NK,K,N,U,V,W,UROT,VROT,J,I) SCHEDULE(STATIC)
    +
    475  DO nk=1,no*km
    +
    476  k=(nk-1)/no+1
    +
    477  n=nk-no*(k-1)
    +
    478  u=0
    +
    479  v=0
    +
    480  w=0
    +
    481  DO j=1,2
    +
    482  DO i=1,2
    +
    483  IF(nxy(i,j,n).GT.0) THEN
    +
    484  IF(ibi(k).EQ.0.OR.li(nxy(i,j,n),k)) THEN
    +
    485  urot=cxy(i,j,n)*ui(nxy(i,j,n),k)-sxy(i,j,n)*vi(nxy(i,j,n),k)
    +
    486  vrot=sxy(i,j,n)*ui(nxy(i,j,n),k)+cxy(i,j,n)*vi(nxy(i,j,n),k)
    +
    487  u=u+wxy(i,j,n)*urot
    +
    488  v=v+wxy(i,j,n)*vrot
    +
    489  w=w+wxy(i,j,n)
    +
    490  ENDIF
    +
    491  ENDIF
    +
    492  ENDDO
    +
    493  ENDDO
    +
    494  lo(n,k)=w.GE.pmp
    +
    495  IF(lo(n,k)) THEN
    +
    496  urot=crot(n)*u-srot(n)*v
    +
    497  vrot=srot(n)*u+crot(n)*v
    +
    498  uo(n,k)=urot/w
    +
    499  vo(n,k)=vrot/w
    +
    500  ELSE
    +
    501  uo(n,k)=0.
    +
    502  vo(n,k)=0.
    +
    503  ENDIF
    +
    504  ENDDO ! NK LOOP
    +
    505  DO k=1,km
    +
    506  ibo(k)=ibi(k)
    +
    507  IF(.NOT.all(lo(1:no,k))) ibo(k)=1
    +
    508  ENDDO
    +
    509 
    +
    510  select type(grid_out)
    +
    511  type is(ip_equid_cylind_grid)
    +
    512  CALL polfixv(no,mo,km,rlat,rlon,ibo,lo,uo,vo)
    +
    513  end select
    +
    514 
    +
    515  ELSE
    +
    516  IF(iret.EQ.0) iret=iretx
    +
    517  IF(.not. to_station_points) no=0
    +
    518  ENDIF
    +
    519  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    520  END SUBROUTINE interpolate_bilinear_vector
    +
    521 
    +
    522 end module bilinear_interp_mod
    + + +
    subroutine movect(FLAT, FLON, TLAT, TLON, CROT, SROT)
    This subprogram provides the rotation parameters to move a vector along a great circle from one posit...
    Definition: movect.F90:26
    +
    Bilinear interpolation routines for scalars and vectors.
    +
    subroutine interpolate_bilinear_scalar(IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
    This subprogram performs bilinear interpolation from any grid to any grid for scalar fields.
    +
    subroutine interpolate_bilinear_vector(ipopt, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
    This subprogram performs bilinear interpolation from any grid to any grid for vector fields.
    +
    Driver module for gdswzd routines.
    Definition: gdswzd_mod.F90:25
    +
    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
    +
    Routines for creating an ip_grid given a Grib descriptor.
    +
    Re-export the individual grids.
    Definition: ip_grids_mod.F90:7
    +
    Make multiple pole scalar values consistent.
    Definition: polfix_mod.F90:7
    +
    subroutine, public polfixs(NM, NX, KM, RLAT, IB, LO, GO)
    Make multiple pole scalar values consistent.
    Definition: polfix_mod.F90:30
    +
    subroutine, public polfixv(NM, NX, KM, RLAT, RLON, IB, LO, UO, VO)
    Make multiple pole vector values consistent,.
    Definition: polfix_mod.F90:125
    +
    +
    + + + + diff --git a/ver-5.1.0/budget__interp__mod_8F90.html b/ver-5.1.0/budget__interp__mod_8F90.html new file mode 100644 index 00000000..932a1ffd --- /dev/null +++ b/ver-5.1.0/budget__interp__mod_8F90.html @@ -0,0 +1,135 @@ + + + + + + + +NCEPLIBS-ip: budget_interp_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    budget_interp_mod.F90 File Reference
    +
    +
    + +

    Budget interpolation routines for scalars and vectors. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Data Types

    interface  budget_interp_mod::interpolate_budget
     
    + + + + +

    +Modules

    module  budget_interp_mod
     Budget interpolation routines for scalars and vectors.
     
    + + + + + + + +

    +Functions/Subroutines

    subroutine budget_interp_mod::interpolate_budget_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Performs budget interpolation from any grid to any grid (or to random station points) for scalar fields. More...
     
    subroutine budget_interp_mod::interpolate_budget_vector (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     This subprogram performs budget interpolation from any grid to any grid (or to random station points) for vector fields. More...
     
    +

    Detailed Description

    +

    Budget interpolation routines for scalars and vectors.

    +
    Author
    Mark Iredell, Kyle Gerheiser, Eric Engle
    +
    Date
    July 2021
    + +

    Definition in file budget_interp_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/budget__interp__mod_8F90.js b/ver-5.1.0/budget__interp__mod_8F90.js new file mode 100644 index 00000000..44bc00ff --- /dev/null +++ b/ver-5.1.0/budget__interp__mod_8F90.js @@ -0,0 +1,6 @@ +var budget__interp__mod_8F90 = +[ + [ "interpolate_budget", "interfacebudget__interp__mod_1_1interpolate__budget.html", "interfacebudget__interp__mod_1_1interpolate__budget" ], + [ "interpolate_budget_scalar", "budget__interp__mod_8F90.html#a09bd6535b0c2e1022cfde39c39d14466", null ], + [ "interpolate_budget_vector", "budget__interp__mod_8F90.html#abc99486ee9c0091c1514af6114d4e803", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/budget__interp__mod_8F90_source.html b/ver-5.1.0/budget__interp__mod_8F90_source.html new file mode 100644 index 00000000..b4cc3add --- /dev/null +++ b/ver-5.1.0/budget__interp__mod_8F90_source.html @@ -0,0 +1,686 @@ + + + + + + + +NCEPLIBS-ip: budget_interp_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    budget_interp_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    5 
    + +
    11  use gdswzd_mod
    +
    12  use polfix_mod
    +
    13  use ip_grids_mod
    + + +
    16  implicit none
    +
    17 
    +
    18  private
    +
    19  public :: interpolate_budget
    +
    20 
    + +
    22  module procedure interpolate_budget_scalar
    +
    23  module procedure interpolate_budget_vector
    +
    24  end interface interpolate_budget
    +
    25 
    +
    26  ! Smallest positive real value (use for equality comparisons)
    +
    27  REAL :: TINYREAL=tiny(1.0)
    +
    28 
    +
    29 contains
    +
    30 
    +
    94  SUBROUTINE interpolate_budget_scalar(IPOPT,grid_in,grid_out, &
    +
    95  MI,MO,KM,IBI,LI,GI, &
    +
    96  NO,RLAT,RLON,IBO,LO,GO,IRET)
    +
    97  class(ip_grid), intent(in) :: grid_in, grid_out
    +
    98  INTEGER, INTENT(IN ) :: IBI(KM), IPOPT(20)
    +
    99  INTEGER, INTENT(IN ) :: KM, MI, MO
    +
    100  INTEGER, INTENT( OUT) :: IBO(KM), IRET, NO
    +
    101  !
    +
    102  LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
    +
    103  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
    +
    104  !
    +
    105  REAL, INTENT(IN ) :: GI(MI,KM)
    +
    106  REAL, INTENT(INOUT) :: RLAT(MO), RLON(MO)
    +
    107  REAL, INTENT( OUT) :: GO(MO,KM)
    +
    108  !
    +
    109  REAL, PARAMETER :: FILL=-9999.
    +
    110  !
    +
    111  INTEGER :: I1, J1, I2, J2, IB, JB
    +
    112  INTEGER :: IX, JX, IXS, JXS
    +
    113  INTEGER :: K, KXS, KXT
    +
    114  INTEGER :: LB, LSW, MP, MSPIRAL, MX
    +
    115  INTEGER :: N, NB, NB1, NB2, NB3, NB4, NV, NX
    +
    116  INTEGER :: N11(MO),N21(MO),N12(MO),N22(MO)
    +
    117  !
    +
    118  REAL :: GB, LAT(1), LON(1)
    +
    119  REAL :: PMP, RB2, RLOB(MO), RLAB(MO), WB
    +
    120  REAL :: W11(MO), W21(MO), W12(MO), W22(MO)
    +
    121  REAL :: WO(MO,KM), XF, YF, XI, YI, XX, YY
    +
    122  REAL :: XPTS(MO),YPTS(MO),XPTB(MO),YPTB(MO)
    +
    123  REAL :: XXX(1), YYY(1)
    +
    124 
    +
    125  logical :: to_station_points
    +
    126 
    +
    127  class(ip_grid), allocatable :: grid_out2
    +
    128 
    +
    129  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    130  ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
    +
    131  ! DO SUBSECTION OF GRID IF KGDSO(1) IS SUBTRACTED FROM 255.
    +
    132  iret=0
    +
    133 
    +
    134  select type(grid_out)
    +
    135  type is(ip_station_points_grid)
    +
    136  to_station_points = .true.
    +
    137  allocate(grid_out2, source = grid_out)
    +
    138  CALL gdswzd(grid_out2, 0,mo,fill,xpts,ypts,rlon,rlat,no)
    +
    139  IF(no.EQ.0) iret=3
    +
    140  CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv)
    +
    141  IF(nv.EQ.0) iret=2
    +
    142  class default
    +
    143  to_station_points = .false.
    +
    144  allocate(grid_out2, source = grid_out)
    +
    145  CALL gdswzd(grid_out2, 0,mo,fill,xpts,ypts,rlon,rlat,no)
    +
    146  IF(no.EQ.0) iret=3
    +
    147  end select
    +
    148 
    +
    149  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    150  ! SET PARAMETERS
    +
    151  IF(ipopt(1).GT.16) iret=32
    +
    152  mspiral=max(ipopt(20),1)
    +
    153  nb1=ipopt(1)
    +
    154  IF(nb1.EQ.-1) nb1=2
    +
    155  IF(iret.EQ.0.AND.nb1.LT.0) iret=32
    +
    156  lsw=1
    +
    157  IF(ipopt(2).EQ.-2) lsw=2
    +
    158  IF(ipopt(1).EQ.-1.OR.ipopt(2).EQ.-1) lsw=0
    +
    159  IF(iret.EQ.0.AND.lsw.EQ.1.AND.nb1.GT.15) iret=32
    +
    160  mp=ipopt(3+ipopt(1))
    +
    161  IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
    +
    162  IF(mp.LT.0.OR.mp.GT.100) iret=32
    +
    163  pmp=mp*0.01
    +
    164  IF(iret.EQ.0) THEN
    +
    165  nb2=2*nb1+1
    +
    166  rb2=1./nb2
    +
    167  nb3=nb2*nb2
    +
    168  nb4=nb3
    +
    169  IF(lsw.EQ.2) THEN
    +
    170  rb2=1./(nb1+1)
    +
    171  nb4=(nb1+1)**4
    +
    172  ELSEIF(lsw.EQ.1) THEN
    +
    173  nb4=ipopt(2)
    +
    174  DO ib=1,nb1
    +
    175  nb4=nb4+8*ib*ipopt(2+ib)
    +
    176  ENDDO
    +
    177  ENDIF
    +
    178  ELSE
    +
    179  nb3=0
    +
    180  nb4=1
    +
    181  ENDIF
    +
    182  DO k=1,km
    +
    183  DO n=1,no
    +
    184  go(n,k)=0.
    +
    185  wo(n,k)=0.
    +
    186  ENDDO
    +
    187  ENDDO
    +
    188  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    189  ! LOOP OVER SAMPLE POINTS IN OUTPUT GRID BOX
    +
    190  DO nb=1,nb3
    +
    191  ! LOCATE INPUT POINTS AND COMPUTE THEIR WEIGHTS
    +
    192  jb=(nb-1)/nb2-nb1
    +
    193  ib=nb-(jb+nb1)*nb2-nb1-1
    +
    194  lb=max(abs(ib),abs(jb))
    +
    195  wb=1
    +
    196  IF(lsw.EQ.2) THEN
    +
    197  wb=(nb1+1-abs(ib))*(nb1+1-abs(jb))
    +
    198  ELSEIF(lsw.EQ.1) THEN
    +
    199  wb=ipopt(2+lb)
    +
    200  ENDIF
    +
    201  IF(abs(wb).GT.tinyreal) THEN
    +
    202  !$OMP PARALLEL DO PRIVATE(N) SCHEDULE(STATIC)
    +
    203  DO n=1,no
    +
    204  xptb(n)=xpts(n)+ib*rb2
    +
    205  yptb(n)=ypts(n)+jb*rb2
    +
    206  ENDDO
    +
    207  !$OMP END PARALLEL DO
    +
    208  if(to_station_points)then
    +
    209  CALL gdswzd(grid_in, 1,no,fill,xptb,yptb,rlob,rlab,nv)
    +
    210  CALL gdswzd(grid_in,-1,no,fill,xptb,yptb,rlob,rlab,nv)
    +
    211  else
    +
    212  CALL gdswzd(grid_out2, 1,no,fill,xptb,yptb,rlob,rlab,nv)
    +
    213  CALL gdswzd(grid_in,-1,no,fill,xptb,yptb,rlob,rlab,nv)
    +
    214  endif
    +
    215  IF(iret.EQ.0.AND.nv.EQ.0.AND.lb.EQ.0) iret=2
    +
    216  !$OMP PARALLEL DO PRIVATE(N,XI,YI,I1,I2,J1,J2,XF,YF) SCHEDULE(STATIC)
    +
    217  DO n=1,no
    +
    218  xi=xptb(n)
    +
    219  yi=yptb(n)
    +
    220  IF(abs(xi-fill).GT.tinyreal.AND.abs(yi-fill).GT.tinyreal) THEN
    +
    221  i1=int(xi)
    +
    222  i2=i1+1
    +
    223  j1=int(yi)
    +
    224  j2=j1+1
    +
    225  xf=xi-i1
    +
    226  yf=yi-j1
    +
    227  n11(n)=grid_in%field_pos(i1, j1)
    +
    228  n21(n)=grid_in%field_pos(i2, j1)
    +
    229  n12(n)=grid_in%field_pos(i1, j2)
    +
    230  n22(n)=grid_in%field_pos(i2, j2)
    +
    231  IF(min(n11(n),n21(n),n12(n),n22(n)).GT.0) THEN
    +
    232  w11(n)=(1-xf)*(1-yf)
    +
    233  w21(n)=xf*(1-yf)
    +
    234  w12(n)=(1-xf)*yf
    +
    235  w22(n)=xf*yf
    +
    236  ELSE
    +
    237  n11(n)=0
    +
    238  n21(n)=0
    +
    239  n12(n)=0
    +
    240  n22(n)=0
    +
    241  ENDIF
    +
    242  ELSE
    +
    243  n11(n)=0
    +
    244  n21(n)=0
    +
    245  n12(n)=0
    +
    246  n22(n)=0
    +
    247  ENDIF
    +
    248  ENDDO
    +
    249  !$OMP END PARALLEL DO
    +
    250  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    251  ! INTERPOLATE WITH OR WITHOUT BITMAPS
    +
    252  !$OMP PARALLEL DO PRIVATE(K,N,GB) SCHEDULE(STATIC)
    +
    253  DO k=1,km
    +
    254  DO n=1,no
    +
    255  IF(n11(n).GT.0) THEN
    +
    256  IF(ibi(k).EQ.0) THEN
    +
    257  gb=w11(n)*gi(n11(n),k)+w21(n)*gi(n21(n),k) &
    +
    258  +w12(n)*gi(n12(n),k)+w22(n)*gi(n22(n),k)
    +
    259  go(n,k)=go(n,k)+wb*gb
    +
    260  wo(n,k)=wo(n,k)+wb
    +
    261  ELSE
    +
    262  IF(li(n11(n),k)) THEN
    +
    263  go(n,k)=go(n,k)+wb*w11(n)*gi(n11(n),k)
    +
    264  wo(n,k)=wo(n,k)+wb*w11(n)
    +
    265  ENDIF
    +
    266  IF(li(n21(n),k)) THEN
    +
    267  go(n,k)=go(n,k)+wb*w21(n)*gi(n21(n),k)
    +
    268  wo(n,k)=wo(n,k)+wb*w21(n)
    +
    269  ENDIF
    +
    270  IF(li(n12(n),k)) THEN
    +
    271  go(n,k)=go(n,k)+wb*w12(n)*gi(n12(n),k)
    +
    272  wo(n,k)=wo(n,k)+wb*w12(n)
    +
    273  ENDIF
    +
    274  IF(li(n22(n),k)) THEN
    +
    275  go(n,k)=go(n,k)+wb*w22(n)*gi(n22(n),k)
    +
    276  wo(n,k)=wo(n,k)+wb*w22(n)
    +
    277  ENDIF
    +
    278  ENDIF
    +
    279  ENDIF
    +
    280  ENDDO
    +
    281  ENDDO
    +
    282  !$OMP END PARALLEL DO
    +
    283  ENDIF
    +
    284  ENDDO ! sub-grid points
    +
    285  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    286  ! COMPUTE OUTPUT BITMAPS AND FIELDS
    +
    287  ! KM is often 1 .. do not do OMP PARALLEL DO here
    +
    288  km_loop : DO k=1,km
    +
    289  ibo(k)=ibi(k)
    +
    290  !$OMP PARALLEL DO PRIVATE(N,LAT,LON,XXX,YYY,NV,XX,YY,IXS,JXS,MX,KXS,KXT,IX,JX,NX) SCHEDULE(STATIC)
    +
    291  n_loop : DO n=1,no
    +
    292  lo(n,k)=wo(n,k).GE.pmp*nb4
    +
    293  IF(lo(n,k)) THEN
    +
    294  go(n,k)=go(n,k)/wo(n,k)
    +
    295  ELSEIF (mspiral.GT.1) THEN
    +
    296  lat(1)=rlat(n)
    +
    297  lon(1)=rlon(n)
    +
    298  CALL gdswzd(grid_in,-1,1,fill,xxx,yyy,lon,lat,nv)
    +
    299  xx=xxx(1)
    +
    300  yy=yyy(1)
    +
    301  IF(nv.EQ.1)THEN
    +
    302  i1=nint(xx)
    +
    303  j1=nint(yy)
    +
    304  ixs=int(sign(1.,xx-i1))
    +
    305  jxs=int(sign(1.,yy-j1))
    +
    306  spiral_loop : DO mx=2,mspiral**2
    +
    307  kxs=int(sqrt(4*mx-2.5))
    +
    308  kxt=mx-(kxs**2/4+1)
    +
    309  SELECT CASE(mod(kxs,4))
    +
    310  CASE(1)
    +
    311  ix=i1-ixs*(kxs/4-kxt)
    +
    312  jx=j1-jxs*kxs/4
    +
    313  CASE(2)
    +
    314  ix=i1+ixs*(1+kxs/4)
    +
    315  jx=j1-jxs*(kxs/4-kxt)
    +
    316  CASE(3)
    +
    317  ix=i1+ixs*(1+kxs/4-kxt)
    +
    318  jx=j1+jxs*(1+kxs/4)
    +
    319  CASE DEFAULT
    +
    320  ix=i1-ixs*kxs/4
    +
    321  jx=j1+jxs*(kxs/4-kxt)
    +
    322  END SELECT
    +
    323  nx=grid_in%field_pos(ix, jx)
    +
    324  IF(nx.GT.0.)THEN
    +
    325  IF(li(nx,k).OR.ibi(k).EQ.0) THEN
    +
    326  go(n,k)=gi(nx,k)
    +
    327  lo(n,k)=.true.
    +
    328  cycle n_loop
    +
    329  ENDIF
    +
    330  ENDIF
    +
    331  ENDDO spiral_loop
    +
    332  ibo(k)=1
    +
    333  go(n,k)=0.
    +
    334  ELSE
    +
    335  ibo(k)=1
    +
    336  go(n,k)=0.
    +
    337  ENDIF
    +
    338  ELSE ! no spiral search option
    +
    339  ibo(k)=1
    +
    340  go(n,k)=0.
    +
    341  ENDIF
    +
    342  ENDDO n_loop
    +
    343  !$OMP END PARALLEL DO
    +
    344  ENDDO km_loop
    +
    345 
    +
    346  select type(grid_out2)
    +
    347  type is(ip_equid_cylind_grid)
    +
    348  CALL polfixs(no,mo,km,rlat,ibo,lo,go)
    +
    349  end select
    +
    350  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    351  END SUBROUTINE interpolate_budget_scalar
    +
    352 
    +
    423  SUBROUTINE interpolate_budget_vector(IPOPT,grid_in,grid_out, &
    +
    424  MI,MO,KM,IBI,LI,UI,VI, &
    +
    425  NO,RLAT,RLON,CROT,SROT,IBO,LO,UO,VO,IRET)
    +
    426  class(ip_grid), intent(in) :: grid_in, grid_out
    +
    427  INTEGER, INTENT(IN ) :: IPOPT(20), IBI(KM)
    +
    428  INTEGER, INTENT(IN ) :: KM, MI, MO
    +
    429  INTEGER, INTENT( OUT) :: IRET, NO, IBO(KM)
    +
    430  !
    +
    431  LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
    +
    432  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
    +
    433  !
    +
    434  REAL, INTENT(IN ) :: UI(MI,KM),VI(MI,KM)
    +
    435  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    436  REAL, INTENT( OUT) :: UO(MO,KM),VO(MO,KM)
    +
    437  REAL, INTENT( OUT) :: CROT(MO),SROT(MO)
    +
    438  !
    +
    439  REAL, PARAMETER :: FILL=-9999.
    +
    440  !
    +
    441  INTEGER :: I1,I2,J1,J2,IB,JB,LSW,MP
    +
    442  INTEGER :: K,LB,N,NB,NB1,NB2,NB3,NB4,NV
    +
    443  INTEGER :: N11(MO),N21(MO),N12(MO),N22(MO)
    +
    444  !
    +
    445  LOGICAL :: SAME_GRID
    +
    446  !
    +
    447  REAL :: CM11,SM11,CM12,SM12
    +
    448  REAL :: CM21,SM21,CM22,SM22
    +
    449  REAL :: PMP,RB2
    +
    450  REAL :: C11(MO),C21(MO),C12(MO),C22(MO)
    +
    451  REAL :: S11(MO),S21(MO),S12(MO),S22(MO)
    +
    452  REAL :: W11(MO),W21(MO),W12(MO),W22(MO)
    +
    453  REAL :: UB,VB,WB,UROT,VROT
    +
    454  REAL :: U11,V11,U21,V21,U12,V12,U22,V22
    +
    455  REAL :: WI1,WJ1,WI2,WJ2
    +
    456  REAL :: WO(MO,KM),XI,YI
    +
    457  REAL :: XPTS(MO),YPTS(MO)
    +
    458  REAL :: XPTB(MO),YPTB(MO),RLOB(MO),RLAB(MO)
    +
    459 
    +
    460  logical :: to_station_points
    +
    461 
    +
    462  class(ip_grid), allocatable :: grid_out2
    +
    463 
    +
    464  ! Save coeffecients between calls and only compute if grids have changed
    +
    465  INTEGER, SAVE :: MIX=-1
    +
    466  REAL, ALLOCATABLE, SAVE :: CROI(:),SROI(:)
    +
    467  REAL, ALLOCATABLE, SAVE :: XPTI(:),YPTI(:),RLOI(:),RLAI(:)
    +
    468 
    +
    469  class(ip_grid), allocatable, save :: prev_grid_in
    +
    470 
    +
    471  iret=0
    +
    472 
    +
    473  ! Negative grid number means interpolate to subgrid
    +
    474  ! The type of the subgrid is calculated by 255 +
    +
    475  select type(grid_out)
    +
    476  type is(ip_station_points_grid)
    +
    477  to_station_points = .true.
    +
    478  allocate(grid_out2, source = grid_out)
    +
    479  CALL gdswzd(grid_out2, 0,mo,fill,xpts,ypts,rlon,rlat,no,crot,srot)
    +
    480  IF(no.EQ.0) iret=3
    +
    481  CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv,crot,srot)
    +
    482  IF(nv.EQ.0) iret=2
    +
    483  class default
    +
    484  to_station_points = .false.
    +
    485  allocate(grid_out2, source = grid_out)
    +
    486  CALL gdswzd(grid_out2, 0,mo,fill,xpts,ypts,rlon,rlat,no,crot,srot)
    +
    487  end select
    +
    488 
    +
    489  if (.not. allocated(prev_grid_in)) then
    +
    490  allocate(prev_grid_in, source = grid_in)
    +
    491 
    +
    492  same_grid = .false.
    +
    493  else
    +
    494  same_grid = grid_in == prev_grid_in
    +
    495 
    +
    496  if (.not. same_grid) then
    +
    497  deallocate(prev_grid_in)
    +
    498  allocate(prev_grid_in, source = grid_in)
    +
    499  end if
    +
    500  end if
    +
    501 
    +
    502  IF(.NOT.same_grid) THEN
    +
    503  IF(mix.NE.mi) THEN
    +
    504  IF(mix.GE.0) DEALLOCATE(xpti,ypti,rloi,rlai,croi,sroi)
    +
    505  ALLOCATE(xpti(mi),ypti(mi),rloi(mi),rlai(mi),croi(mi),sroi(mi))
    +
    506  mix=mi
    +
    507  ENDIF
    +
    508  CALL gdswzd(grid_in, 0,mi,fill,xpti,ypti,rloi,rlai,nv,croi,sroi)
    +
    509  ENDIF
    +
    510 
    +
    511  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    512  ! SET PARAMETERS
    +
    513  nb1=ipopt(1)
    +
    514  IF(nb1.EQ.-1) nb1=2
    +
    515  IF(iret.EQ.0.AND.nb1.LT.0) iret=32
    +
    516  lsw=1
    +
    517  IF(ipopt(2).EQ.-2) lsw=2
    +
    518  IF(ipopt(1).EQ.-1.OR.ipopt(2).EQ.-1) lsw=0
    +
    519  IF(iret.EQ.0.AND.lsw.EQ.1.AND.nb1.GT.15) iret=32
    +
    520  mp=ipopt(3+ipopt(1))
    +
    521  IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
    +
    522  IF(mp.LT.0.OR.mp.GT.100) iret=32
    +
    523  pmp=mp*0.01
    +
    524  IF(iret.EQ.0) THEN
    +
    525  nb2=2*nb1+1
    +
    526  rb2=1./nb2
    +
    527  nb3=nb2*nb2
    +
    528  nb4=nb3
    +
    529  IF(lsw.EQ.2) THEN
    +
    530  rb2=1./(nb1+1)
    +
    531  nb4=(nb1+1)**4
    +
    532  ELSEIF(lsw.EQ.1) THEN
    +
    533  nb4=ipopt(2)
    +
    534  DO ib=1,nb1
    +
    535  nb4=nb4+8*ib*ipopt(2+ib)
    +
    536  ENDDO
    +
    537  ENDIF
    +
    538  ELSE
    +
    539  nb3=0
    +
    540  nb4=1
    +
    541  ENDIF
    +
    542  DO k=1,km
    +
    543  DO n=1,no
    +
    544  uo(n,k)=0
    +
    545  vo(n,k)=0
    +
    546  wo(n,k)=0.
    +
    547  ENDDO
    +
    548  ENDDO
    +
    549  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    550  ! LOOP OVER SAMPLE POINTS IN OUTPUT GRID BOX
    +
    551  DO nb=1,nb3
    +
    552  ! LOCATE INPUT POINTS AND COMPUTE THEIR WEIGHTS AND ROTATIONS
    +
    553  jb=(nb-1)/nb2-nb1
    +
    554  ib=nb-(jb+nb1)*nb2-nb1-1
    +
    555  lb=max(abs(ib),abs(jb))
    +
    556  wb=1
    +
    557  IF(ipopt(2).EQ.-2) THEN
    +
    558  wb=(nb1+1-abs(ib))*(nb1+1-abs(jb))
    +
    559  ELSEIF(ipopt(2).NE.-1) THEN
    +
    560  wb=ipopt(2+lb)
    +
    561  ENDIF
    +
    562  IF(abs(wb).GT.tinyreal) THEN
    +
    563  !$OMP PARALLEL DO PRIVATE(N) SCHEDULE(STATIC)
    +
    564  DO n=1,no
    +
    565  xptb(n)=xpts(n)+ib*rb2
    +
    566  yptb(n)=ypts(n)+jb*rb2
    +
    567  ENDDO
    +
    568  !$OMP END PARALLEL DO
    +
    569  if(to_station_points)then
    +
    570  CALL gdswzd(grid_in, 1,no,fill,xptb,yptb,rlob,rlab,nv)
    +
    571  CALL gdswzd(grid_in,-1,no,fill,xptb,yptb,rlob,rlab,nv)
    +
    572  else
    +
    573  CALL gdswzd(grid_out2, 1,no,fill,xptb,yptb,rlob,rlab,nv)
    +
    574  CALL gdswzd(grid_in,-1,no,fill,xptb,yptb,rlob,rlab,nv)
    +
    575  endif
    +
    576  IF(iret.EQ.0.AND.nv.EQ.0.AND.lb.EQ.0) iret=2
    +
    577  !$OMP PARALLEL DO PRIVATE(N,XI,YI,I1,I2,WI1,WI2,J1,J2,WJ1,WJ2,CM11,CM21,CM12,CM22,SM11,SM21,SM12,SM22) &
    +
    578  !$OMP SCHEDULE(STATIC)
    +
    579  DO n=1,no
    +
    580  xi=xptb(n)
    +
    581  yi=yptb(n)
    +
    582  IF(abs(xi-fill).GT.tinyreal.AND.abs(yi-fill).GT.tinyreal) THEN
    +
    583  i1=int(xi)
    +
    584  i2=i1+1
    +
    585  wi2=xi-i1
    +
    586  wi1=1-wi2
    +
    587  j1=int(yi)
    +
    588  j2=j1+1
    +
    589  wj2=yi-j1
    +
    590  wj1=1-wj2
    +
    591  n11(n) = grid_in%field_pos(i1,j1)
    +
    592  n21(n) = grid_in%field_pos(i2, j1)
    +
    593  n12(n) = grid_in%field_pos(i1, j2)
    +
    594  n22(n) = grid_in%field_pos(i2, j2)
    +
    595  IF(min(n11(n),n21(n),n12(n),n22(n)).GT.0) THEN
    +
    596  w11(n)=wi1*wj1
    +
    597  w21(n)=wi2*wj1
    +
    598  w12(n)=wi1*wj2
    +
    599  w22(n)=wi2*wj2
    +
    600  CALL movect(rlai(n11(n)),rloi(n11(n)),rlat(n),rlon(n),cm11,sm11)
    +
    601  CALL movect(rlai(n21(n)),rloi(n21(n)),rlat(n),rlon(n),cm21,sm21)
    +
    602  CALL movect(rlai(n12(n)),rloi(n12(n)),rlat(n),rlon(n),cm12,sm12)
    +
    603  CALL movect(rlai(n22(n)),rloi(n22(n)),rlat(n),rlon(n),cm22,sm22)
    +
    604  c11(n)=cm11*croi(n11(n))+sm11*sroi(n11(n))
    +
    605  s11(n)=sm11*croi(n11(n))-cm11*sroi(n11(n))
    +
    606  c21(n)=cm21*croi(n21(n))+sm21*sroi(n21(n))
    +
    607  s21(n)=sm21*croi(n21(n))-cm21*sroi(n21(n))
    +
    608  c12(n)=cm12*croi(n12(n))+sm12*sroi(n12(n))
    +
    609  s12(n)=sm12*croi(n12(n))-cm12*sroi(n12(n))
    +
    610  c22(n)=cm22*croi(n22(n))+sm22*sroi(n22(n))
    +
    611  s22(n)=sm22*croi(n22(n))-cm22*sroi(n22(n))
    +
    612  ELSE
    +
    613  n11(n)=0
    +
    614  n21(n)=0
    +
    615  n12(n)=0
    +
    616  n22(n)=0
    +
    617  ENDIF
    +
    618  ELSE
    +
    619  n11(n)=0
    +
    620  n21(n)=0
    +
    621  n12(n)=0
    +
    622  n22(n)=0
    +
    623  ENDIF
    +
    624  ENDDO
    +
    625  !$OMP END PARALLEL DO
    +
    626  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    627  ! INTERPOLATE WITH OR WITHOUT BITMAPS
    +
    628  ! KM IS OFTEN 1 .. DO NO PUT OMP PARALLEL DO HERE
    +
    629  DO k=1,km
    +
    630  !$OMP PARALLEL DO PRIVATE(N,U11,U12,U21,U22,UB,V11,V12,V21,V22,VB) SCHEDULE(STATIC)
    +
    631  DO n=1,no
    +
    632  IF(n11(n).GT.0) THEN
    +
    633  IF(ibi(k).EQ.0) THEN
    +
    634  u11=c11(n)*ui(n11(n),k)-s11(n)*vi(n11(n),k)
    +
    635  v11=s11(n)*ui(n11(n),k)+c11(n)*vi(n11(n),k)
    +
    636  u21=c21(n)*ui(n21(n),k)-s21(n)*vi(n21(n),k)
    +
    637  v21=s21(n)*ui(n21(n),k)+c21(n)*vi(n21(n),k)
    +
    638  u12=c12(n)*ui(n12(n),k)-s12(n)*vi(n12(n),k)
    +
    639  v12=s12(n)*ui(n12(n),k)+c12(n)*vi(n12(n),k)
    +
    640  u22=c22(n)*ui(n22(n),k)-s22(n)*vi(n22(n),k)
    +
    641  v22=s22(n)*ui(n22(n),k)+c22(n)*vi(n22(n),k)
    +
    642  ub=w11(n)*u11+w21(n)*u21+w12(n)*u12+w22(n)*u22
    +
    643  vb=w11(n)*v11+w21(n)*v21+w12(n)*v12+w22(n)*v22
    +
    644  uo(n,k)=uo(n,k)+wb*ub
    +
    645  vo(n,k)=vo(n,k)+wb*vb
    +
    646  wo(n,k)=wo(n,k)+wb
    +
    647  ELSE
    +
    648  IF(li(n11(n),k)) THEN
    +
    649  u11=c11(n)*ui(n11(n),k)-s11(n)*vi(n11(n),k)
    +
    650  v11=s11(n)*ui(n11(n),k)+c11(n)*vi(n11(n),k)
    +
    651  uo(n,k)=uo(n,k)+wb*w11(n)*u11
    +
    652  vo(n,k)=vo(n,k)+wb*w11(n)*v11
    +
    653  wo(n,k)=wo(n,k)+wb*w11(n)
    +
    654  ENDIF
    +
    655  IF(li(n21(n),k)) THEN
    +
    656  u21=c21(n)*ui(n21(n),k)-s21(n)*vi(n21(n),k)
    +
    657  v21=s21(n)*ui(n21(n),k)+c21(n)*vi(n21(n),k)
    +
    658  uo(n,k)=uo(n,k)+wb*w21(n)*u21
    +
    659  vo(n,k)=vo(n,k)+wb*w21(n)*v21
    +
    660  wo(n,k)=wo(n,k)+wb*w21(n)
    +
    661  ENDIF
    +
    662  IF(li(n12(n),k)) THEN
    +
    663  u12=c12(n)*ui(n12(n),k)-s12(n)*vi(n12(n),k)
    +
    664  v12=s12(n)*ui(n12(n),k)+c12(n)*vi(n12(n),k)
    +
    665  uo(n,k)=uo(n,k)+wb*w12(n)*u12
    +
    666  vo(n,k)=vo(n,k)+wb*w12(n)*v12
    +
    667  wo(n,k)=wo(n,k)+wb*w12(n)
    +
    668  ENDIF
    +
    669  IF(li(n22(n),k)) THEN
    +
    670  u22=c22(n)*ui(n22(n),k)-s22(n)*vi(n22(n),k)
    +
    671  v22=s22(n)*ui(n22(n),k)+c22(n)*vi(n22(n),k)
    +
    672  uo(n,k)=uo(n,k)+wb*w22(n)*u22
    +
    673  vo(n,k)=vo(n,k)+wb*w22(n)*v22
    +
    674  wo(n,k)=wo(n,k)+wb*w22(n)
    +
    675  ENDIF
    +
    676  ENDIF
    +
    677  ENDIF
    +
    678  ENDDO
    +
    679  !$OMP END PARALLEL DO
    +
    680  ENDDO
    +
    681  ENDIF
    +
    682  ENDDO
    +
    683  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    684  ! COMPUTE OUTPUT BITMAPS AND FIELDS
    +
    685  ! KM is often 1, do not put OMP PARALLEL here
    +
    686  DO k=1,km
    +
    687  ibo(k)=ibi(k)
    +
    688  !$OMP PARALLEL DO PRIVATE(N,UROT,VROT) SCHEDULE(STATIC)
    +
    689  DO n=1,no
    +
    690  lo(n,k)=wo(n,k).GE.pmp*nb4
    +
    691  IF(lo(n,k)) THEN
    +
    692  uo(n,k)=uo(n,k)/wo(n,k)
    +
    693  vo(n,k)=vo(n,k)/wo(n,k)
    +
    694  urot=crot(n)*uo(n,k)-srot(n)*vo(n,k)
    +
    695  vrot=srot(n)*uo(n,k)+crot(n)*vo(n,k)
    +
    696  uo(n,k)=urot
    +
    697  vo(n,k)=vrot
    +
    698  ELSE
    +
    699  ibo(k)=1
    +
    700  uo(n,k)=0.
    +
    701  vo(n,k)=0.
    +
    702  ENDIF
    +
    703  ENDDO
    +
    704  !$OMP END PARALLEL DO
    +
    705  ENDDO
    +
    706 
    +
    707  select type(grid_out2)
    +
    708  type is(ip_equid_cylind_grid)
    +
    709  CALL polfixv(no,mo,km,rlat,rlon,ibo,lo,uo,vo)
    +
    710  end select
    +
    711  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    712  END SUBROUTINE interpolate_budget_vector
    +
    713 
    +
    714 end module budget_interp_mod
    + + +
    subroutine movect(FLAT, FLON, TLAT, TLON, CROT, SROT)
    This subprogram provides the rotation parameters to move a vector along a great circle from one posit...
    Definition: movect.F90:26
    +
    Budget interpolation routines for scalars and vectors.
    +
    subroutine interpolate_budget_scalar(IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
    Performs budget interpolation from any grid to any grid (or to random station points) for scalar fiel...
    +
    subroutine interpolate_budget_vector(IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
    This subprogram performs budget interpolation from any grid to any grid (or to random station points)...
    +
    Driver module for gdswzd routines.
    Definition: gdswzd_mod.F90:25
    +
    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
    +
    Routines for creating an ip_grid given a Grib descriptor.
    +
    Re-export the individual grids.
    Definition: ip_grids_mod.F90:7
    +
    Make multiple pole scalar values consistent.
    Definition: polfix_mod.F90:7
    +
    subroutine, public polfixs(NM, NX, KM, RLAT, IB, LO, GO)
    Make multiple pole scalar values consistent.
    Definition: polfix_mod.F90:30
    +
    subroutine, public polfixv(NM, NX, KM, RLAT, RLON, IB, LO, UO, VO)
    Make multiple pole vector values consistent,.
    Definition: polfix_mod.F90:125
    +
    +
    + + + + diff --git a/ver-5.1.0/classes.html b/ver-5.1.0/classes.html new file mode 100644 index 00000000..b64bf5d2 --- /dev/null +++ b/ver-5.1.0/classes.html @@ -0,0 +1,113 @@ + + + + + + + +NCEPLIBS-ip: Data Types + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + + + + + + diff --git a/ver-5.1.0/closed.png b/ver-5.1.0/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/ver-5.1.0/dir_49e56c817e5e54854c35e136979f97ca.html b/ver-5.1.0/dir_49e56c817e5e54854c35e136979f97ca.html new file mode 100644 index 00000000..ad5da577 --- /dev/null +++ b/ver-5.1.0/dir_49e56c817e5e54854c35e136979f97ca.html @@ -0,0 +1,99 @@ + + + + + + + +NCEPLIBS-ip: docs Directory Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    docs Directory Reference
    +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/ver-5.1.0/dir_68267d1309a1af8e8297ef4c3efbcdba.html new file mode 100644 index 00000000..b4bd3e34 --- /dev/null +++ b/ver-5.1.0/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -0,0 +1,370 @@ + + + + + + + +NCEPLIBS-ip: src Directory Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    src Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  bicubic_interp_mod.F90 [code]
     Bicubic interpolation routines for scalars and vectors.
     
    file  bilinear_interp_mod.F90 [code]
     Bilinear interpolation routines for scalars and vectors.
     
    file  budget_interp_mod.F90 [code]
     Budget interpolation routines for scalars and vectors.
     
    file  earth_radius_mod.F90 [code]
     Determine earth radius and shape.
     
    file  fftpack.F [code]
     A concatination of the (FFTPACK)[https://netlib.org/fftpack/] library code.
     
    file  gdswzd_c.F90 [code]
     C wrapper for routine gdswzd().
     
    file  gdswzd_mod.F90 [code]
     Driver module for gdswzd routines.
     
    file  ip_constants_mod.F90 [code]
     Constants for use in NCEPLIBS-ip.
     
    file  ip_equid_cylind_grid_mod.F90 [code]
     Equidistant cylindrical grib decoder and grid coordinate transformations.
     
    file  ip_gaussian_grid_mod.F90 [code]
     Gaussian grid coordinate transformations.
     
    file  ip_grid_descriptor_mod.F90 [code]
     Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
     
    file  ip_grid_factory_mod.F90 [code]
     Routines for creating an ip_grid given a Grib descriptor.
     
    file  ip_grid_mod.F90 [code]
     Abstract ip_grid type.
     
    file  ip_grids_mod.F90 [code]
     Re-export the individual grids.
     
    file  ip_interpolators_mod.F90 [code]
     Top-level module to export interpolation routines and constants.
     
    file  ip_lambert_conf_grid_mod.F90 [code]
     GDS wizard for lambert conformal conical.
     
    file  ip_mercator_grid_mod.F90 [code]
     GDS wizard for mercator cylindrical.
     
    file  ip_mod.F90 [code]
     Top-level module for the ip library.
     
    file  ip_polar_stereo_grid_mod.F90 [code]
     GDS wizard for polar stereographic azimuthal.
     
    file  ip_rot_equid_cylind_egrid_mod.F90 [code]
     Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grid E.
     
    file  ip_rot_equid_cylind_grid_mod.F90 [code]
     Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grids A through D.
     
    file  ip_station_points_grid_mod.F90 [code]
     Interpolate gridded data to a series of station points.
     
    file  iplib_4.h [code]
     C interface to gdswzd() and gdswzd_grib1() functions for '4' library build.
     
    file  iplib_8.h [code]
     C interface to gdswzd() and gdswzd_grib1() functions for '8' library build.
     
    file  iplib_d.h [code]
     C interface to gdswzd() and gdswzd_grib1() functions for 'd' library build.
     
    file  ipolates.F90 [code]
     Top-level driver for scalar interpolation routine ipolates().
     
    file  ipolatev.F90 [code]
     Top-level driver for vector interpolation routine ipolates.
     
    file  ipxetas.F90 [code]
     Expand or contract eta grids using linear interpolation.
     
    file  ipxwafs.F90 [code]
     Expand or contract wafs grids.
     
    file  ipxwafs2.F90 [code]
     Expand or contract wafs grids using linear interpolation and account for bitmapped data.
     
    file  ipxwafs3.F90 [code]
     Expand or contract wafs grids using neighbor interpolation and accout for bitmapped data.
     
    file  movect.F90 [code]
     Move a vector along a great circle.
     
    file  ncpus.F [code]
     Set number of cpus.
     
    file  neighbor_budget_interp_mod.F90 [code]
     Interpolate scalar and vector fields with neighbor budget interpolation.
     
    file  neighbor_interp_mod.F90 [code]
     Interpolate scalar and vector fields with neighbor interpolation.
     
    file  polfix_mod.F90 [code]
     Make multiple pole scalar values consistent.
     
    file  spanaly.f [code]
     Analyze spectral from Fourier.
     
    file  spdz2uv.f [code]
     Compute winds from divergence and vorticity.
     
    file  spectral_interp_mod.F90 [code]
     Interpolate spectral.
     
    file  speps.f [code]
     Compute utility spectral fields.
     
    file  spfft.f [code]
     Perform multiple fast fourier transforms.
     
    file  spfft1.f [code]
     Perform multiple fast Fourier transforms.
     
    file  spffte.f [code]
     Perform multiple fast Fourier transforms.
     
    file  spfftpt.f [code]
     Compute fourier transform to gridpoints.
     
    file  spgradq.f [code]
     Compute gradient in spectral space.
     
    file  spgradx.f [code]
     Compute x-gradient in Fourier space.
     
    file  spgrady.f [code]
     Compute y-gradient in spectral space.
     
    file  splaplac.f [code]
     Compute laplacian in spectral space.
     
    file  splat.F [code]
     Computes cosines of colatitude and Gaussian weights for sets of latitudes.
     
    file  splegend.f [code]
     Compute Legendre polynomials.
     
    file  sppad.f [code]
     Pad or truncate a spectral field.
     
    file  spsynth.f [code]
     Synthesize Fourier coefficients from spectral coefficients.
     
    file  sptez.f [code]
     Perform a simple scalar spherical transform.
     
    file  sptezd.f [code]
     Perform a simple gradient spherical transform.
     
    file  sptezm.f [code]
     Perform simple scalar spherical transforms.
     
    file  sptezmd.f [code]
     Perform simple gradient spherical transforms.
     
    file  sptezmv.f [code]
     Perform simple vector spherical transforms.
     
    file  sptezv.f [code]
     Perform a simple vector spherical transform.
     
    file  sptgpm.f [code]
     Transform spectral scalar to Mercator.
     
    file  sptgpmd.f [code]
     Transform spectral to Mercator gradients.
     
    file  sptgpmv.f [code]
     Transform spectral vector to Mercator.
     
    file  sptgps.f [code]
     Transform spectral scalar to polar stereo.
     
    file  sptgpsd.f [code]
     Transform spectral to polar stereographic gradients.
     
    file  sptgpsv.f [code]
     Transform spectral vector to polar stereo.
     
    file  sptgpt.f [code]
     Transform spectral scalar to station points.
     
    file  sptgptd.f [code]
     Transform spectral to station point gradients.
     
    file  sptgptsd.f [code]
     Transform spectral scalar to station points.
     
    file  sptgptv.f [code]
     Transform spectral vector to station points.
     
    file  sptgptvd.f [code]
     Transform spectral vector to station points.
     
    file  sptran.f [code]
     Perform a scalar spherical transform.
     
    file  sptrand.f [code]
     Perform a gradient spherical transform.
     
    file  sptranf.f [code]
     Perform a scalar spherical transform.
     
    file  sptranf0.f [code]
     Sptranf spectral initialization.
     
    file  sptranf1.f [code]
     Sptranf spectral transform.
     
    file  sptranfv.f [code]
     Perform a vector spherical transform.
     
    file  sptranv.f [code]
     Perform a vector spherical transform.
     
    file  sptrun.f [code]
     Truncate gridded scalar fields.
     
    file  sptrund.f [code]
     Spectrally truncate to gradients.
     
    file  sptrung.f [code]
     Spectrally interpolate scalars to stations.
     
    file  sptrungv.f [code]
     Spectrally interpolate vectors to stations.
     
    file  sptrunl.f [code]
     Spectrally truncate to laplacian.
     
    file  sptrunm.f [code]
     Spectrally interpolate scalars to Mercator.
     
    file  sptrunmv.f [code]
     Spectrally interpolate vectors to Mercator.
     
    file  sptruns.f [code]
     Spectrally interpolate scalars to polar stereo.
     
    file  sptrunsv.f [code]
     Spectrally interpolate vectors to polar stereo.
     
    file  sptrunv.f [code]
     Spectrally truncate gridded vector fields.
     
    file  spuv2dz.f [code]
     Compute divergence and vorticity from winds.
     
    file  spvar.f [code]
     Compute variance by total wavenumber.
     
    file  spwget.f [code]
     Get wave-space constants.
     
    +
    +
    + + + + diff --git a/doc.png b/ver-5.1.0/doc.png similarity index 100% rename from doc.png rename to ver-5.1.0/doc.png diff --git a/ver-5.1.0/doxygen.css b/ver-5.1.0/doxygen.css new file mode 100644 index 00000000..ffbff022 --- /dev/null +++ b/ver-5.1.0/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + border-right: 1px solid #A3B4D7; + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} +td.navtabHL { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/ver-5.1.0/doxygen.svg b/ver-5.1.0/doxygen.svg new file mode 100644 index 00000000..d42dad52 --- /dev/null +++ b/ver-5.1.0/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ver-5.1.0/dynsections.js b/ver-5.1.0/dynsections.js new file mode 100644 index 00000000..88f2c27e --- /dev/null +++ b/ver-5.1.0/dynsections.js @@ -0,0 +1,128 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + + +NCEPLIBS-ip: earth_radius_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    earth_radius_mod.F90 File Reference
    +
    +
    + +

    Determine earth radius and shape. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Modules

    module  earth_radius_mod
     Determine earth radius and shape.
     
    + + + + +

    +Functions/Subroutines

    subroutine, public earth_radius_mod::earth_radius (IGDTMPL, IGDTLEN, RADIUS, ECCEN_SQUARED)
     Determine earth radius and shape. More...
     
    +

    Detailed Description

    +

    Determine earth radius and shape.

    +
    Author
    Kyle Gerheiser
    +
    Date
    2021-07-21
    + +

    Definition in file earth_radius_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/earth__radius__mod_8F90.js b/ver-5.1.0/earth__radius__mod_8F90.js new file mode 100644 index 00000000..bc2c8f77 --- /dev/null +++ b/ver-5.1.0/earth__radius__mod_8F90.js @@ -0,0 +1,4 @@ +var earth__radius__mod_8F90 = +[ + [ "earth_radius", "earth__radius__mod_8F90.html#a810f60db1a1faff0d6f59937a8207a54", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/earth__radius__mod_8F90_source.html b/ver-5.1.0/earth__radius__mod_8F90_source.html new file mode 100644 index 00000000..209f1e37 --- /dev/null +++ b/ver-5.1.0/earth__radius__mod_8F90_source.html @@ -0,0 +1,168 @@ + + + + + + + +NCEPLIBS-ip: earth_radius_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    earth_radius_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    4 
    + +
    8  implicit none
    +
    9 
    +
    10  private
    +
    11  public :: earth_radius
    +
    12 
    +
    13 contains
    +
    14 
    +
    40  SUBROUTINE earth_radius(IGDTMPL, IGDTLEN, RADIUS, ECCEN_SQUARED)
    +
    41  IMPLICIT NONE
    +
    42 
    +
    43  INTEGER, INTENT(IN ) :: igdtlen
    +
    44  INTEGER, INTENT(IN ) :: igdtmpl(igdtlen)
    +
    45 
    +
    46  REAL, INTENT( OUT) :: eccen_squared
    +
    47  REAL, INTENT( OUT) :: radius
    +
    48 
    +
    49  REAL :: flat
    +
    50  REAL :: major_axis, minor_axis
    +
    51 
    +
    52  SELECT CASE (igdtmpl(1))
    +
    53  CASE (0)
    +
    54  radius = 6367470.0
    +
    55  eccen_squared = 0.0
    +
    56  CASE (1) ! USER SPECIFIED SPHERICAL
    +
    57  radius = float(igdtmpl(3))/float(10**igdtmpl(2))
    +
    58  eccen_squared = 0.0
    +
    59  CASE (2) ! IAU 1965
    +
    60  radius = 6378160.0 ! SEMI MAJOR AXIS
    +
    61  flat = 1.0/297.0 ! FLATTENING
    +
    62  eccen_squared = (2.0*flat) - (flat**2)
    +
    63  CASE (3) ! USER SPECIFIED ELLIPTICAL (KM)
    +
    64  major_axis = float(igdtmpl(5))/float(10**igdtmpl(4))
    +
    65  major_axis = major_axis * 1000.0
    +
    66  minor_axis = float(igdtmpl(7))/float(10**igdtmpl(6))
    +
    67  minor_axis = minor_axis * 1000.0
    +
    68  eccen_squared = 1.0 - (minor_axis**2 / major_axis**2)
    +
    69  radius = major_axis
    +
    70  CASE (4) ! IAG-GRS80 MODEL
    +
    71  radius = 6378137.0 ! SEMI MAJOR AXIS
    +
    72  flat = 1.0/298.2572 ! FLATTENING
    +
    73  eccen_squared = (2.0*flat) - (flat**2)
    +
    74  CASE (5) ! WGS84 DATUM
    +
    75  radius = 6378137.0 ! SEMI MAJOR AXIS
    +
    76  eccen_squared = 0.00669437999013
    +
    77  CASE (6)
    +
    78  radius = 6371229.0
    +
    79  eccen_squared = 0.0
    +
    80  CASE (7) ! USER SPECIFIED ELLIPTICAL (M)
    +
    81  major_axis = float(igdtmpl(5))/float(10**igdtmpl(4))
    +
    82  minor_axis = float(igdtmpl(7))/float(10**igdtmpl(6))
    +
    83  eccen_squared = 1.0 - (minor_axis**2 / major_axis**2)
    +
    84  radius = major_axis
    +
    85  CASE (8)
    +
    86  radius = 6371200.0
    +
    87  eccen_squared = 0.0
    +
    88  CASE DEFAULT
    +
    89  radius = -9999.
    +
    90  eccen_squared = -9999.
    +
    91  END SELECT
    +
    92  !
    +
    93  RETURN
    +
    94  !
    +
    95  END SUBROUTINE earth_radius
    +
    96 end module earth_radius_mod
    +
    Determine earth radius and shape.
    +
    subroutine, public earth_radius(IGDTMPL, IGDTLEN, RADIUS, ECCEN_SQUARED)
    Determine earth radius and shape.
    +
    +
    + + + + diff --git a/ver-5.1.0/fftpack_8F.html b/ver-5.1.0/fftpack_8F.html new file mode 100644 index 00000000..2627441e --- /dev/null +++ b/ver-5.1.0/fftpack_8F.html @@ -0,0 +1,2006 @@ + + + + + + + +NCEPLIBS-ip: fftpack.F File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    fftpack.F File Reference
    +
    +
    + +

    A concatination of the (FFTPACK)[https://netlib.org/fftpack/] library code. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine csfft (isign, n, scale, x, y, table, work, isys)
     csfft More...
     
    subroutine dcrft (init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
     dcrft More...
     
    subroutine drcft (init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
     drcft More...
     
    subroutine radb2 (IDO, L1, CC, CH, WA1)
     RADB2. More...
     
    subroutine radb3 (IDO, L1, CC, CH, WA1, WA2)
     RADB3
    + More...
     
    subroutine radb4 (IDO, L1, CC, CH, WA1, WA2, WA3)
     RADB4. More...
     
    subroutine radb5 (IDO, L1, CC, CH, WA1, WA2, WA3, WA4)
     RADB5. More...
     
    subroutine radbg (IDO, IP, L1, IDL1, CC, C1, C2, CH, CH2, WA)
     RADBG. More...
     
    subroutine radf2 (IDO, L1, CC, CH, WA1)
     RADBG. More...
     
    subroutine radf3 (IDO, L1, CC, CH, WA1, WA2)
     RADF3. More...
     
    subroutine radf4 (IDO, L1, CC, CH, WA1, WA2, WA3)
     RADF4. More...
     
    subroutine radf5 (IDO, L1, CC, CH, WA1, WA2, WA3, WA4)
     RADF5. More...
     
    subroutine radfg (IDO, IP, L1, IDL1, CC, C1, C2, CH, CH2, WA)
     RADFG. More...
     
    subroutine rfftb (N, R, WSAVE)
     RFFTB. More...
     
    subroutine rfftb1 (N, C, CH, WA, IFAC)
     RFFTB1. More...
     
    subroutine rfftf (N, R, WSAVE)
     RFFTF. More...
     
    subroutine rfftf1 (N, C, CH, WA, IFAC)
     RFFTF1. More...
     
    subroutine rffti (N, WSAVE)
     RFFTI. More...
     
    subroutine rffti1 (N, WA, IFAC)
     RFFTI1. More...
     
    subroutine scfft (isign, n, scale, x, y, table, work, isys)
     scfft More...
     
    subroutine scrft (init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
     scrft More...
     
    subroutine srcft (init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
     srcft More...
     
    +

    Detailed Description

    +

    A concatination of the (FFTPACK)[https://netlib.org/fftpack/] library code.

    +

    FFTPACK is a package of Fortran subprograms for the fast Fourier transform of periodic and other symmetric sequences. It includes complex, real, sine, cosine, and quarter-wave transforms.

    +

    Reference:

      +
    • P.N. Swarztrauber, Vectorizing the FFTs, in Parallel Computations (G. Rodrigue, ed.), Academic Press, 1982, pp. 51–83.

      +
      Author
      Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
      +
    • +
    + +

    Definition in file fftpack.F.

    +

    Function/Subroutine Documentation

    + +

    ◆ csfft()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine csfft (integer isign,
    integer n,
    real scale,
    real, dimension(*) x,
    real, dimension(*) y,
    real, dimension(*) table,
    real, dimension(*) work,
    integer isys 
    )
    +
    + +

    csfft

    +
    Parameters
    + + + + + + + + + +
    isign
    n
    scale
    x
    y
    table
    work
    isys
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 120 of file fftpack.F.

    + +

    References rfftb(), and rffti().

    + +
    +
    + +

    ◆ dcrft()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine dcrft (integer init,
    real, dimension(2*ldx,*) x,
    integer ldx,
    real, dimension(ldy,*) y,
    integer ldy,
    integer n,
    integer m,
    integer isign,
    real scale,
    real, dimension(44002) table,
    integer n1,
    real, dimension(*) wrk,
    integer n2,
    real, optional z,
    integer, optional nz 
    )
    +
    + +

    dcrft

    +
    Parameters
    + + + + + + + + + + + + + + + + +
    init
    x
    ldx
    y
    ldy
    n
    m
    isign
    scale
    table
    n1
    wrk
    n2
    z
    nz
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 32 of file fftpack.F.

    + +

    References rfftb(), and rffti().

    + +

    Referenced by spffte().

    + +
    +
    + +

    ◆ drcft()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine drcft (integer init,
    real, dimension(ldx,*) x,
    integer ldx,
    real, dimension(2*ldy,*) y,
    integer ldy,
    integer n,
    integer m,
    integer isign,
    real scale,
    real, dimension(44002) table,
    integer n1,
    real, dimension(*) wrk,
    integer n2,
    real, optional z,
    integer, optional nz 
    )
    +
    + +

    drcft

    +
    Parameters
    + + + + + + + + + + + + + + + + +
    init
    x
    ldx
    y
    ldy
    n
    m
    isign
    scale
    table
    n1
    wrk
    n2
    z
    nz
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 162 of file fftpack.F.

    + +

    References rfftf(), and rffti().

    + +

    Referenced by spffte().

    + +
    +
    + +

    ◆ radb2()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine radb2 ( IDO,
     L1,
    dimension(ido,2,l1) CC,
    dimension(ido,l1,2) CH,
    dimension(*) WA1 
    )
    +
    + +

    RADB2.

    +
    Parameters
    + + + + + + +
    IDO
    L1
    CC
    CH
    WA1
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 546 of file fftpack.F.

    + +

    Referenced by rfftb1().

    + +
    +
    + +

    ◆ radb3()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine radb3 ( IDO,
     L1,
    dimension(ido,3,l1) CC,
    dimension(ido,l1,3) CH,
    dimension(*) WA1,
    dimension(*) WA2 
    )
    +
    + +

    RADB3
    +

    +
    Parameters
    + + + + + + + +
    IDO
    L1
    CC
    CH
    WA1
    WA2
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 591 of file fftpack.F.

    + +

    Referenced by rfftb1().

    + +
    +
    + +

    ◆ radb4()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine radb4 ( IDO,
     L1,
    dimension(ido,4,l1) CC,
    dimension(ido,l1,4) CH,
    dimension(*) WA1,
    dimension(*) WA2,
    dimension(*) WA3 
    )
    +
    + +

    RADB4.

    +
    Parameters
    + + + + + + + + +
    IDO
    L1
    CC
    CH
    WA1
    WA2
    WA3
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 641 of file fftpack.F.

    + +

    Referenced by rfftb1().

    + +
    +
    + +

    ◆ radb5()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine radb5 ( IDO,
     L1,
    dimension(ido,5,l1) CC,
    dimension(ido,l1,5) CH,
    dimension(*) WA1,
    dimension(*) WA2,
    dimension(*) WA3,
    dimension(*) WA4 
    )
    +
    + +

    RADB5.

    +
    Parameters
    + + + + + + + + + +
    IDO
    L1
    CC
    CH
    WA1
    WA2
    WA3
    WA4
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 718 of file fftpack.F.

    + +

    Referenced by rfftb1().

    + +
    +
    + +

    ◆ radbg()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine radbg ( IDO,
     IP,
     L1,
     IDL1,
    dimension(ido,ip,l1) CC,
    dimension(ido,l1,ip) C1,
    dimension(idl1,ip) C2,
    dimension(ido,l1,ip) CH,
    dimension(idl1,ip) CH2,
    dimension(*) WA 
    )
    +
    + +

    RADBG.

    +
    Parameters
    + + + + + + + + + + + +
    IDO
    IP
    L1
    IDL1
    CC
    C1
    C2
    CH
    CH2
    WA
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 796 of file fftpack.F.

    + +

    Referenced by rfftb1().

    + +
    +
    + +

    ◆ radf2()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine radf2 ( IDO,
     L1,
    dimension(ido,l1,2) CC,
    dimension(ido,2,l1) CH,
    dimension(*) WA1 
    )
    +
    + +

    RADBG.

    +
    Parameters
    + + + + + + +
    IDO
    L1
    CC
    CH
    WA1
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 974 of file fftpack.F.

    + +

    Referenced by rfftf1().

    + +
    +
    + +

    ◆ radf3()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine radf3 ( IDO,
     L1,
    dimension(ido,l1,3) CC,
    dimension(ido,3,l1) CH,
    dimension(*) WA1,
    dimension(*) WA2 
    )
    +
    + +

    RADF3.

    +
    Parameters
    + + + + + + + +
    IDO
    L1
    CC
    CH
    WA1
    WA2
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 1018 of file fftpack.F.

    + +

    Referenced by rfftf1().

    + +
    +
    + +

    ◆ radf4()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine radf4 ( IDO,
     L1,
    dimension(ido,l1,4) CC,
    dimension(ido,4,l1) CH,
    dimension(*) WA1,
    dimension(*) WA2,
    dimension(*) WA3 
    )
    +
    + +

    RADF4.

    +
    Parameters
    + + + + + + + + +
    IDO
    L1
    CC
    CH
    WA1
    WA2
    WA3
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 1065 of file fftpack.F.

    + +

    Referenced by rfftf1().

    + +
    +
    + +

    ◆ radf5()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine radf5 ( IDO,
     L1,
    dimension(ido,l1,5) CC,
    dimension(ido,5,l1) CH,
    dimension(*) WA1,
    dimension(*) WA2,
    dimension(*) WA3,
    dimension(*) WA4 
    )
    +
    + +

    RADF5.

    +
    Parameters
    + + + + + + + + + +
    IDO
    L1
    CC
    CH
    WA1
    WA2
    WA3
    WA4
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 1138 of file fftpack.F.

    + +

    Referenced by rfftf1().

    + +
    +
    + +

    ◆ radfg()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine radfg ( IDO,
     IP,
     L1,
     IDL1,
    dimension(ido,ip,l1) CC,
    dimension(ido,l1,ip) C1,
    dimension(idl1,ip) C2,
    dimension(ido,l1,ip) CH,
    dimension(idl1,ip) CH2,
    dimension(*) WA 
    )
    +
    + +

    RADFG.

    +
    Parameters
    + + + + + + + + + + + +
    IDO
    IP
    L1
    IDL1
    CC
    C1
    C2
    CH
    CH2
    WA
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 1212 of file fftpack.F.

    + +

    Referenced by rfftf1().

    + +
    +
    + +

    ◆ rfftb()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine rfftb ( N,
    dimension(*) R,
    dimension(*) WSAVE 
    )
    +
    + +

    RFFTB.

    +
    Parameters
    + + + + +
    N
    R
    WSAVE
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 304 of file fftpack.F.

    + +

    References rfftb1().

    + +

    Referenced by csfft(), dcrft(), and scrft().

    + +
    +
    + +

    ◆ rfftb1()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine rfftb1 ( N,
    real, dimension(*) C,
    real, dimension(*) CH,
    real, dimension(*) WA,
    real, dimension(*) IFAC 
    )
    +
    + +

    RFFTB1.

    +
    Parameters
    + + + + + + +
    N
    C
    CH
    WA
    IFAC
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 333 of file fftpack.F.

    + +

    References radb2(), radb3(), radb4(), radb5(), and radbg().

    + +

    Referenced by rfftb().

    + +
    +
    + +

    ◆ rfftf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine rfftf ( N,
    dimension(*) R,
    dimension(*) WSAVE 
    )
    +
    + +

    RFFTF.

    +
    Parameters
    + + + + +
    N
    R
    WSAVE
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 290 of file fftpack.F.

    + +

    References rfftf1().

    + +

    Referenced by drcft(), scfft(), and srcft().

    + +
    +
    + +

    ◆ rfftf1()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine rfftf1 ( N,
    real, dimension(*) C,
    real, dimension(*) CH,
    real, dimension(*) WA,
    real, dimension(*) IFAC 
    )
    +
    + +

    RFFTF1.

    +
    Parameters
    + + + + + + +
    N
    C
    CH
    WA
    IFAC
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 402 of file fftpack.F.

    + +

    References radf2(), radf3(), radf4(), radf5(), and radfg().

    + +

    Referenced by rfftf().

    + +
    +
    + +

    ◆ rffti()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    subroutine rffti ( N,
    dimension(*) WSAVE 
    )
    +
    + +

    RFFTI.

    +
    Parameters
    + + + +
    N
    WSAVE
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 317 of file fftpack.F.

    + +

    References rffti1().

    + +

    Referenced by csfft(), dcrft(), drcft(), scfft(), scrft(), and srcft().

    + +
    +
    + +

    ◆ rffti1()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine rffti1 ( N,
    real, dimension(*) WA,
    real, dimension(*) IFAC 
    )
    +
    + +

    RFFTI1.

    +
    Parameters
    + + + + +
    N
    WA
    IFAC
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 469 of file fftpack.F.

    + +

    Referenced by rffti().

    + +
    +
    + +

    ◆ scfft()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine scfft (integer isign,
    integer n,
    real scale,
    real, dimension(*) x,
    real, dimension(*) y,
    real, dimension(*) table,
    real, dimension(*) work,
    integer isys 
    )
    +
    + +

    scfft

    +
    Parameters
    + + + + + + + + + +
    isign
    n
    scale
    x
    y
    table
    work
    isys
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 257 of file fftpack.F.

    + +

    References rfftf(), and rffti().

    + +
    +
    + +

    ◆ scrft()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine scrft (integer init,
    real, dimension(2*ldx,*) x,
    integer ldx,
    real, dimension(ldy,*) y,
    integer ldy,
    integer n,
    integer m,
    integer isign,
    real scale,
    real, dimension(44002) table,
    integer n1,
    real, dimension(*) wrk,
    integer n2,
    real, optional z,
    integer, optional nz 
    )
    +
    + +

    scrft

    +
    Parameters
    + + + + + + + + + + + + + + + + +
    init
    x
    ldx
    y
    ldy
    n
    m
    isign
    scale
    table
    n1
    wrk
    n2
    z
    nz
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 80 of file fftpack.F.

    + +

    References rfftb(), and rffti().

    + +

    Referenced by spfft(), spfft1(), and spffte().

    + +
    +
    + +

    ◆ srcft()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine srcft (integer init,
    real, dimension(ldx,*) x,
    integer ldx,
    real, dimension(2*ldy,*) y,
    integer ldy,
    integer n,
    integer m,
    integer isign,
    real scale,
    real, dimension(44002) table,
    integer n1,
    real, dimension(*) wrk,
    integer n2,
    real, optional z,
    integer, optional nz 
    )
    +
    + +

    srcft

    +
    Parameters
    + + + + + + + + + + + + + + + + +
    init
    x
    ldx
    y
    ldy
    n
    m
    isign
    scale
    table
    n1
    wrk
    n2
    z
    nz
    +
    +
    +
    Author
    Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    + +

    Definition at line 213 of file fftpack.F.

    + +

    References rfftf(), and rffti().

    + +

    Referenced by spfft(), spfft1(), and spffte().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/fftpack_8F.js b/ver-5.1.0/fftpack_8F.js new file mode 100644 index 00000000..98c5a031 --- /dev/null +++ b/ver-5.1.0/fftpack_8F.js @@ -0,0 +1,25 @@ +var fftpack_8F = +[ + [ "csfft", "fftpack_8F.html#ad261879c88a7f040e43f1549e65f36e5", null ], + [ "dcrft", "fftpack_8F.html#a713ef445886ad8dc8b16692c6075d225", null ], + [ "drcft", "fftpack_8F.html#a55b05419c0d3bb0595b34c8cacf93be8", null ], + [ "radb2", "fftpack_8F.html#ae63abe3a02989ed4fbd60b50bc0c6dda", null ], + [ "radb3", "fftpack_8F.html#a6129001ac4cdf5d5a345edc2822d8014", null ], + [ "radb4", "fftpack_8F.html#a3b5aab129020968eaf92f2e6ca0785ef", null ], + [ "radb5", "fftpack_8F.html#a2b6492f922cbee03af5b89d52356abf1", null ], + [ "radbg", "fftpack_8F.html#af5a2521b66fece6cc768206c1df0d20b", null ], + [ "radf2", "fftpack_8F.html#a70e2420dd5bee9e41eb6c15bbad5eef6", null ], + [ "radf3", "fftpack_8F.html#a51374398f8edd5701987ce483c739592", null ], + [ "radf4", "fftpack_8F.html#ae9910ca606fd0cdb03b5b3b98533f486", null ], + [ "radf5", "fftpack_8F.html#a6d852c36924b038f77a24b8e22205add", null ], + [ "radfg", "fftpack_8F.html#ad5dbca6bb6ee7c0a86a1e140627de1b2", null ], + [ "rfftb", "fftpack_8F.html#a79ba25d1f342858b0faa3c3e3585ec88", null ], + [ "rfftb1", "fftpack_8F.html#afa735c298a72dd1c13ab1c45e737c066", null ], + [ "rfftf", "fftpack_8F.html#afbb5dc9c70ebe24759d5ffec1d3e42e2", null ], + [ "rfftf1", "fftpack_8F.html#acdf9efa42dc73f90af444ee0da649a09", null ], + [ "rffti", "fftpack_8F.html#a50f1237ff5990436609962c0eae406db", null ], + [ "rffti1", "fftpack_8F.html#ae3569ef7a371390f6bf38417865ef71b", null ], + [ "scfft", "fftpack_8F.html#a369071ea2d380c9d91ba36d1bf375e33", null ], + [ "scrft", "fftpack_8F.html#ac69cbd64be972c20a4424f5327fb4b36", null ], + [ "srcft", "fftpack_8F.html#acf248c4f27a9fa81cffdfded50eee742", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/fftpack_8F_source.html b/ver-5.1.0/fftpack_8F_source.html new file mode 100644 index 00000000..4c82f5e5 --- /dev/null +++ b/ver-5.1.0/fftpack_8F_source.html @@ -0,0 +1,1498 @@ + + + + + + + +NCEPLIBS-ip: fftpack.F Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    fftpack.F
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief A concatination of the (FFTPACK)[https://netlib.org/fftpack/] library code.
    +
    3 C>
    +
    4 C> FFTPACK is a package of Fortran subprograms for the fast Fourier
    +
    5 C> transform of periodic and other symmetric sequences. It includes
    +
    6 C> complex, real, sine, cosine, and quarter-wave transforms.
    +
    7 C>
    +
    8 C>Reference:
    +
    9 C>- P.N. Swarztrauber, Vectorizing the FFTs, in Parallel Computations
    +
    10 C>(G. Rodrigue, ed.), Academic Press, 1982, pp. 51--83.
    +
    11 C>
    +
    12 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    13 
    +
    14 C> dcrft
    +
    15 C>
    +
    16 C> @param init
    +
    17 C> @param x
    +
    18 C> @param ldx
    +
    19 C> @param y
    +
    20 C> @param ldy
    +
    21 C> @param n
    +
    22 C> @param m
    +
    23 C> @param isign
    +
    24 C> @param scale
    +
    25 C> @param table
    +
    26 C> @param n1
    +
    27 C> @param wrk
    +
    28 C> @param n2
    +
    29 C> @param z
    +
    30 C> @param nz
    +
    31 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    32  SUBROUTINE dcrft(init,x,ldx,y,ldy,n,m,isign,scale,
    +
    33  & table,n1,wrk,n2,z,nz)
    +
    34 
    +
    35  implicit none
    +
    36  integer init,ldx,ldy,n,m,isign,n1,n2,i,j
    +
    37  real x(2*ldx,*),y(ldy,*),scale,table(44002),wrk(*)
    +
    38  real, optional :: z
    +
    39  integer, optional :: nz
    +
    40 
    +
    41  IF (init.ne.0) THEN
    +
    42  CALL rffti(n,table)
    +
    43  ELSE
    +
    44 !OCL NOVREC
    +
    45  DO j=1,m
    +
    46  y(1,j)=x(1,j)
    +
    47  DO i=2,n
    +
    48  y(i,j)=x(i+1,j)
    +
    49  ENDDO
    +
    50  CALL rfftb(n,y(1,j),table)
    +
    51  DO i=1,n
    +
    52  y(i,j)=scale*y(i,j)
    +
    53  ENDDO
    +
    54  ENDDO
    +
    55  ENDIF
    +
    56 
    +
    57  RETURN
    +
    58  END
    +
    59 
    +
    60 C> scrft
    +
    61 C>
    +
    62 C> @param init
    +
    63 C> @param x
    +
    64 C> @param ldx
    +
    65 C> @param y
    +
    66 C> @param ldy
    +
    67 C> @param n
    +
    68 C> @param m
    +
    69 C> @param isign
    +
    70 C> @param scale
    +
    71 C> @param table
    +
    72 C> @param n1
    +
    73 C> @param wrk
    +
    74 C> @param n2
    +
    75 C> @param z
    +
    76 C> @param nz
    +
    77 C>
    +
    78 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    79 
    +
    80  SUBROUTINE scrft(init,x,ldx,y,ldy,n,m,isign,scale,
    +
    81  & table,n1,wrk,n2,z,nz)
    +
    82 
    +
    83  implicit none
    +
    84  integer init,ldx,ldy,n,m,isign,n1,n2,i,j
    +
    85  real x(2*ldx,*),y(ldy,*),scale,table(44002),wrk(*)
    +
    86  real, optional :: z
    +
    87  integer, optional :: nz
    +
    88 
    +
    89  IF (init.ne.0) THEN
    +
    90  CALL rffti(n,table)
    +
    91  ELSE
    +
    92 !OCL NOVREC
    +
    93  DO j=1,m
    +
    94  y(1,j)=x(1,j)
    +
    95  DO i=2,n
    +
    96  y(i,j)=x(i+1,j)
    +
    97  ENDDO
    +
    98  CALL rfftb(n,y(1,j),table)
    +
    99  DO i=1,n
    +
    100  y(i,j)=scale*y(i,j)
    +
    101  ENDDO
    +
    102  ENDDO
    +
    103  ENDIF
    +
    104 
    +
    105  RETURN
    +
    106  END
    +
    107 
    +
    108 C> csfft
    +
    109 C>
    +
    110 C> @param isign
    +
    111 C> @param n
    +
    112 C> @param scale
    +
    113 C> @param x
    +
    114 C> @param y
    +
    115 C> @param table
    +
    116 C> @param work
    +
    117 C> @param isys
    +
    118 C>
    +
    119 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    120  SUBROUTINE csfft(isign,n,scale,x,y,table,work,isys)
    +
    121 
    +
    122  implicit none
    +
    123  integer isign,n,isys,i
    +
    124  real scale,x(*),y(*),table(*),work(*)
    +
    125 
    +
    126  IF (isign.eq.0) THEN
    +
    127  CALL rffti(n,table)
    +
    128  ENDIF
    +
    129  IF (isign.eq.1) THEN
    +
    130  y(1)=x(1)
    +
    131  DO i=2,n
    +
    132  y(i)=x(i+1)
    +
    133  ENDDO
    +
    134  CALL rfftb(n,y,table)
    +
    135  DO i=1,n
    +
    136  y(i)=scale*y(i)
    +
    137  ENDDO
    +
    138  ENDIF
    +
    139 
    +
    140  RETURN
    +
    141  END
    +
    142 
    +
    143 C> drcft
    +
    144 C>
    +
    145 C> @param init
    +
    146 C> @param x
    +
    147 C> @param ldx
    +
    148 C> @param y
    +
    149 C> @param ldy
    +
    150 C> @param n
    +
    151 C> @param m
    +
    152 C> @param isign
    +
    153 C> @param scale
    +
    154 C> @param table
    +
    155 C> @param n1
    +
    156 C> @param wrk
    +
    157 C> @param n2
    +
    158 C> @param z
    +
    159 C> @param nz
    +
    160 C>
    +
    161 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    162  SUBROUTINE drcft(init,x,ldx,y,ldy,n,m,isign,scale,
    +
    163  & table,n1,wrk,n2,z,nz)
    +
    164 
    +
    165  implicit none
    +
    166  integer init,ldx,ldy,n,m,isign,n1,n2,i,j
    +
    167  real x(ldx,*),y(2*ldy,*),scale,table(44002),wrk(*)
    +
    168  real, optional :: z
    +
    169  integer, optional :: nz
    +
    170 
    +
    171  IF (init.ne.0) THEN
    +
    172  CALL rffti(n,table)
    +
    173  ELSE
    +
    174  DO j=1,m
    +
    175  DO i=1,n
    +
    176  y(i,j)=x(i,j)
    +
    177  ENDDO
    +
    178  CALL rfftf(n,y(1,j),table)
    +
    179  DO i=1,n
    +
    180  y(i,j)=scale*y(i,j)
    +
    181  ENDDO
    +
    182  DO i=n,2,-1
    +
    183  y(i+1,j)=y(i,j)
    +
    184  ENDDO
    +
    185  y(2,j)=0.
    +
    186 C 01/17/2013 vvvvvvvvvvvvv E.Mirvis added ver 2.0.1 by S.Moorthi request. No +|- demo.
    +
    187  y(n+2,j) = 0.
    +
    188  ENDDO
    +
    189  ENDIF
    +
    190 
    +
    191  RETURN
    +
    192  END
    +
    193 
    +
    194 C> srcft
    +
    195 C>
    +
    196 C> @param init
    +
    197 C> @param x
    +
    198 C> @param ldx
    +
    199 C> @param y
    +
    200 C> @param ldy
    +
    201 C> @param n
    +
    202 C> @param m
    +
    203 C> @param isign
    +
    204 C> @param scale
    +
    205 C> @param table
    +
    206 C> @param n1
    +
    207 C> @param wrk
    +
    208 C> @param n2
    +
    209 C> @param z
    +
    210 C> @param nz
    +
    211 C>
    +
    212 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    213  SUBROUTINE srcft(init,x,ldx,y,ldy,n,m,isign,scale,
    +
    214  & table,n1,wrk,n2,z,nz)
    +
    215 
    +
    216  implicit none
    +
    217  integer init,ldx,ldy,n,m,isign,n1,n2,i,j
    +
    218  real x(ldx,*),y(2*ldy,*),scale,table(44002),wrk(*)
    +
    219  real, optional :: z
    +
    220  integer, optional :: nz
    +
    221 
    +
    222  IF (init.ne.0) THEN
    +
    223  CALL rffti(n,table)
    +
    224  ELSE
    +
    225  DO j=1,m
    +
    226  DO i=1,n
    +
    227  y(i,j)=x(i,j)
    +
    228  ENDDO
    +
    229  CALL rfftf(n,y(1,j),table)
    +
    230  DO i=1,n
    +
    231  y(i,j)=scale*y(i,j)
    +
    232  ENDDO
    +
    233  DO i=n,2,-1
    +
    234  y(i+1,j)=y(i,j)
    +
    235  ENDDO
    +
    236  y(2,j)=0.
    +
    237  y(n+2,j) = 0.
    +
    238 C 01/17/2013 ^^^^^^^^^^E.Mirvis added ver 2.0.1 by S.Moorthi request. No +|- demo.
    +
    239  ENDDO
    +
    240  ENDIF
    +
    241 
    +
    242  RETURN
    +
    243  END
    +
    244 
    +
    245 C> scfft
    +
    246 C>
    +
    247 C> @param isign
    +
    248 C> @param n
    +
    249 C> @param scale
    +
    250 C> @param x
    +
    251 C> @param y
    +
    252 C> @param table
    +
    253 C> @param work
    +
    254 C> @param isys
    +
    255 C>
    +
    256 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    257  SUBROUTINE scfft(isign,n,scale,x,y,table,work,isys)
    +
    258 
    +
    259  implicit none
    +
    260  integer isign,n,isys,i
    +
    261  real scale,x(*),y(*),table(*),work(*)
    +
    262 
    +
    263  IF (isign.eq.0) THEN
    +
    264  CALL rffti(n,table)
    +
    265  ENDIF
    +
    266  IF (isign.eq.-1) THEN
    +
    267  DO i=1,n
    +
    268  y(i)=x(i)
    +
    269  ENDDO
    +
    270  CALL rfftf(n,y,table)
    +
    271  DO i=1,n
    +
    272  y(i)=scale*y(i)
    +
    273  ENDDO
    +
    274  DO i=n,2,-1
    +
    275  y(i+1)=y(i)
    +
    276  ENDDO
    +
    277  y(2)=0.
    +
    278  ENDIF
    +
    279 
    +
    280  RETURN
    +
    281  END
    +
    282 
    +
    283 C> RFFTF
    +
    284 C>
    +
    285 C> @param N
    +
    286 C> @param R
    +
    287 C> @param WSAVE
    +
    288 C>
    +
    289 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    290  SUBROUTINE rfftf (N,R,WSAVE)
    +
    291  dimension r(*) ,wsave(*)
    +
    292  IF (n .EQ. 1) RETURN
    +
    293  CALL rfftf1 (n,r,wsave,wsave(n+1),wsave(2*n+1))
    +
    294  RETURN
    +
    295  END
    +
    296 
    +
    297 C> RFFTB
    +
    298 C>
    +
    299 C> @param N
    +
    300 C> @param R
    +
    301 C> @param WSAVE
    +
    302 C>
    +
    303 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    304  SUBROUTINE rfftb (N,R,WSAVE)
    +
    305  dimension r(*) ,wsave(*)
    +
    306  IF (n .EQ. 1) RETURN
    +
    307  CALL rfftb1 (n,r,wsave,wsave(n+1),wsave(2*n+1))
    +
    308  RETURN
    +
    309  END
    +
    310 
    +
    311 C> RFFTI
    +
    312 C>
    +
    313 C> @param N
    +
    314 C> @param WSAVE
    +
    315 C>
    +
    316 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    317  SUBROUTINE rffti (N,WSAVE)
    +
    318  dimension wsave(*)
    +
    319  IF (n .EQ. 1) RETURN
    +
    320  CALL rffti1 (n,wsave(n+1),wsave(2*n+1))
    +
    321  RETURN
    +
    322  END
    +
    323 
    +
    324 C> RFFTB1
    +
    325 C>
    +
    326 C> @param N
    +
    327 C> @param C
    +
    328 C> @param CH
    +
    329 C> @param WA
    +
    330 C> @param IFAC
    +
    331 C>
    +
    332 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    333  SUBROUTINE rfftb1 (N,C,CH,WA,IFAC)
    +
    334  REAL CH(*) ,C(*) ,WA(*) ,IFAC(*)
    +
    335  NF = int(ifac(2))
    +
    336  na = 0
    +
    337  l1 = 1
    +
    338  iw = 1
    +
    339  DO 116 k1=1,nf
    +
    340  ip = int(ifac(k1+2))
    +
    341  l2 = ip*l1
    +
    342  ido = n/l2
    +
    343  idl1 = ido*l1
    +
    344  IF (ip .NE. 4) GO TO 103
    +
    345  ix2 = iw+ido
    +
    346  ix3 = ix2+ido
    +
    347  IF (na .NE. 0) GO TO 101
    +
    348  CALL radb4 (ido,l1,c,ch,wa(iw),wa(ix2),wa(ix3))
    +
    349  GO TO 102
    +
    350  101 CALL radb4 (ido,l1,ch,c,wa(iw),wa(ix2),wa(ix3))
    +
    351  102 na = 1-na
    +
    352  GO TO 115
    +
    353  103 IF (ip .NE. 2) GO TO 106
    +
    354  IF (na .NE. 0) GO TO 104
    +
    355  CALL radb2 (ido,l1,c,ch,wa(iw))
    +
    356  GO TO 105
    +
    357  104 CALL radb2 (ido,l1,ch,c,wa(iw))
    +
    358  105 na = 1-na
    +
    359  GO TO 115
    +
    360  106 IF (ip .NE. 3) GO TO 109
    +
    361  ix2 = iw+ido
    +
    362  IF (na .NE. 0) GO TO 107
    +
    363  CALL radb3 (ido,l1,c,ch,wa(iw),wa(ix2))
    +
    364  GO TO 108
    +
    365  107 CALL radb3 (ido,l1,ch,c,wa(iw),wa(ix2))
    +
    366  108 na = 1-na
    +
    367  GO TO 115
    +
    368  109 IF (ip .NE. 5) GO TO 112
    +
    369  ix2 = iw+ido
    +
    370  ix3 = ix2+ido
    +
    371  ix4 = ix3+ido
    +
    372  IF (na .NE. 0) GO TO 110
    +
    373  CALL radb5 (ido,l1,c,ch,wa(iw),wa(ix2),wa(ix3),wa(ix4))
    +
    374  GO TO 111
    +
    375  110 CALL radb5 (ido,l1,ch,c,wa(iw),wa(ix2),wa(ix3),wa(ix4))
    +
    376  111 na = 1-na
    +
    377  GO TO 115
    +
    378  112 IF (na .NE. 0) GO TO 113
    +
    379  CALL radbg (ido,ip,l1,idl1,c,c,c,ch,ch,wa(iw))
    +
    380  GO TO 114
    +
    381  113 CALL radbg (ido,ip,l1,idl1,ch,ch,ch,c,c,wa(iw))
    +
    382  114 IF (ido .EQ. 1) na = 1-na
    +
    383  115 l1 = l2
    +
    384  iw = iw+(ip-1)*ido
    +
    385  116 CONTINUE
    +
    386  IF (na .EQ. 0) RETURN
    +
    387  DO 117 i=1,n
    +
    388  c(i) = ch(i)
    +
    389  117 CONTINUE
    +
    390  RETURN
    +
    391  END
    +
    392 
    +
    393 C> RFFTF1
    +
    394 C>
    +
    395 C> @param N
    +
    396 C> @param C
    +
    397 C> @param CH
    +
    398 C> @param WA
    +
    399 C> @param IFAC
    +
    400 C>
    +
    401 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    402  SUBROUTINE rfftf1 (N,C,CH,WA,IFAC)
    +
    403  REAL CH(*) ,C(*) ,WA(*) ,IFAC(*)
    +
    404  NF = int(ifac(2))
    +
    405  na = 1
    +
    406  l2 = n
    +
    407  iw = n
    +
    408  DO 111 k1=1,nf
    +
    409  kh = nf-k1
    +
    410  ip = int(ifac(kh+3))
    +
    411  l1 = l2/ip
    +
    412  ido = n/l2
    +
    413  idl1 = ido*l1
    +
    414  iw = iw-(ip-1)*ido
    +
    415  na = 1-na
    +
    416  IF (ip .NE. 4) GO TO 102
    +
    417  ix2 = iw+ido
    +
    418  ix3 = ix2+ido
    +
    419  IF (na .NE. 0) GO TO 101
    +
    420  CALL radf4 (ido,l1,c,ch,wa(iw),wa(ix2),wa(ix3))
    +
    421  GO TO 110
    +
    422  101 CALL radf4 (ido,l1,ch,c,wa(iw),wa(ix2),wa(ix3))
    +
    423  GO TO 110
    +
    424  102 IF (ip .NE. 2) GO TO 104
    +
    425  IF (na .NE. 0) GO TO 103
    +
    426  CALL radf2 (ido,l1,c,ch,wa(iw))
    +
    427  GO TO 110
    +
    428  103 CALL radf2 (ido,l1,ch,c,wa(iw))
    +
    429  GO TO 110
    +
    430  104 IF (ip .NE. 3) GO TO 106
    +
    431  ix2 = iw+ido
    +
    432  IF (na .NE. 0) GO TO 105
    +
    433  CALL radf3 (ido,l1,c,ch,wa(iw),wa(ix2))
    +
    434  GO TO 110
    +
    435  105 CALL radf3 (ido,l1,ch,c,wa(iw),wa(ix2))
    +
    436  GO TO 110
    +
    437  106 IF (ip .NE. 5) GO TO 108
    +
    438  ix2 = iw+ido
    +
    439  ix3 = ix2+ido
    +
    440  ix4 = ix3+ido
    +
    441  IF (na .NE. 0) GO TO 107
    +
    442  CALL radf5 (ido,l1,c,ch,wa(iw),wa(ix2),wa(ix3),wa(ix4))
    +
    443  GO TO 110
    +
    444  107 CALL radf5 (ido,l1,ch,c,wa(iw),wa(ix2),wa(ix3),wa(ix4))
    +
    445  GO TO 110
    +
    446  108 IF (ido .EQ. 1) na = 1-na
    +
    447  IF (na .NE. 0) GO TO 109
    +
    448  CALL radfg (ido,ip,l1,idl1,c,c,c,ch,ch,wa(iw))
    +
    449  na = 1
    +
    450  GO TO 110
    +
    451  109 CALL radfg (ido,ip,l1,idl1,ch,ch,ch,c,c,wa(iw))
    +
    452  na = 0
    +
    453  110 l2 = l1
    +
    454  111 CONTINUE
    +
    455  IF (na .EQ. 1) RETURN
    +
    456  DO 112 i=1,n
    +
    457  c(i) = ch(i)
    +
    458  112 CONTINUE
    +
    459  RETURN
    +
    460  END
    +
    461 
    +
    462 C> RFFTI1
    +
    463 C>
    +
    464 C> @param N
    +
    465 C> @param WA
    +
    466 C> @param IFAC
    +
    467 C>
    +
    468 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    469  SUBROUTINE rffti1 (N,WA,IFAC)
    +
    470  REAL WA(*) ,IFAC(*) ,NTRYH(4)
    +
    471  DATA NTRYH(1),NTRYH(2),NTRYH(3),NTRYH(4)/4,2,3,5/
    +
    472  NL = n
    +
    473  nf = 0
    +
    474  j = 0
    +
    475  101 j = j+1
    +
    476  IF ((j-4).LE.0) THEN
    +
    477  GO TO 102
    +
    478  ELSE
    +
    479  GO TO 103
    +
    480  ENDIF
    +
    481  102 ntry = int(ntryh(j))
    +
    482  GO TO 104
    +
    483  103 ntry = ntry+2
    +
    484  104 nq = nl/ntry
    +
    485  nr = nl-ntry*nq
    +
    486  IF (nr.EQ.0) THEN
    +
    487  GO TO 105
    +
    488  ELSE
    +
    489  GO TO 101
    +
    490  ENDIF
    +
    491  105 nf = nf+1
    +
    492  ifac(nf+2) = ntry
    +
    493  nl = nq
    +
    494  IF (ntry .NE. 2) GO TO 107
    +
    495  IF (nf .EQ. 1) GO TO 107
    +
    496  DO 106 i=2,nf
    +
    497  ib = nf-i+2
    +
    498  ifac(ib+2) = ifac(ib+1)
    +
    499  106 CONTINUE
    +
    500  ifac(3) = 2
    +
    501  107 IF (nl .NE. 1) GO TO 104
    +
    502  ifac(1) = n
    +
    503  ifac(2) = nf
    +
    504  tpi = 6.28318530717959
    +
    505  argh = tpi/float(n)
    +
    506  is = 0
    +
    507  nfm1 = nf-1
    +
    508  l1 = 1
    +
    509  IF (nfm1 .EQ. 0) RETURN
    +
    510 !OCL NOVREC
    +
    511  DO 110 k1=1,nfm1
    +
    512  ip = int(ifac(k1+2))
    +
    513  ld = 0
    +
    514  l2 = l1*ip
    +
    515  ido = n/l2
    +
    516  ipm = ip-1
    +
    517  DO 109 j=1,ipm
    +
    518  ld = ld+l1
    +
    519  i = is
    +
    520  argld = float(ld)*argh
    +
    521  fi = 0
    +
    522 !OCL SCALAR
    +
    523  DO 108 ii=3,ido,2
    +
    524  i = i+2
    +
    525  fi = fi+1
    +
    526  arg = fi*argld
    +
    527  wa(i-1) = cos(arg)
    +
    528  wa(i) = sin(arg)
    +
    529  108 CONTINUE
    +
    530  is = is+ido
    +
    531  109 CONTINUE
    +
    532  l1 = l2
    +
    533  110 CONTINUE
    +
    534  RETURN
    +
    535  END
    +
    536 
    +
    537 C> RADB2
    +
    538 C>
    +
    539 C> @param IDO
    +
    540 C> @param L1
    +
    541 C> @param CC
    +
    542 C> @param CH
    +
    543 C> @param WA1
    +
    544 C>
    +
    545 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    546  SUBROUTINE radb2 (IDO,L1,CC,CH,WA1)
    +
    547  dimension cc(ido,2,l1) ,ch(ido,l1,2) ,
    +
    548  1 wa1(*)
    +
    549  DO 101 k=1,l1
    +
    550  ch(1,k,1) = cc(1,1,k)+cc(ido,2,k)
    +
    551  ch(1,k,2) = cc(1,1,k)-cc(ido,2,k)
    +
    552  101 CONTINUE
    +
    553  IF (ido.LT.2) THEN
    +
    554  GO TO 107
    +
    555  ELSEIF (ido.EQ.2) THEN
    +
    556  GO TO 105
    +
    557  ELSE
    +
    558  GO TO 102
    +
    559  ENDIF
    +
    560  102 idp2 = ido+2
    +
    561 !OCL NOVREC
    +
    562  DO 104 k=1,l1
    +
    563  DO 103 i=3,ido,2
    +
    564  ic = idp2-i
    +
    565  ch(i-1,k,1) = cc(i-1,1,k)+cc(ic-1,2,k)
    +
    566  tr2 = cc(i-1,1,k)-cc(ic-1,2,k)
    +
    567  ch(i,k,1) = cc(i,1,k)-cc(ic,2,k)
    +
    568  ti2 = cc(i,1,k)+cc(ic,2,k)
    +
    569  ch(i-1,k,2) = wa1(i-2)*tr2-wa1(i-1)*ti2
    +
    570  ch(i,k,2) = wa1(i-2)*ti2+wa1(i-1)*tr2
    +
    571  103 CONTINUE
    +
    572  104 CONTINUE
    +
    573  IF (mod(ido,2) .EQ. 1) RETURN
    +
    574  105 DO 106 k=1,l1
    +
    575  ch(ido,k,1) = cc(ido,1,k)+cc(ido,1,k)
    +
    576  ch(ido,k,2) = -(cc(1,2,k)+cc(1,2,k))
    +
    577  106 CONTINUE
    +
    578  107 RETURN
    +
    579  END
    +
    580 
    +
    581 C> RADB3
    +
    582 C>
    +
    583 C> @param IDO
    +
    584 C> @param L1
    +
    585 C> @param CC
    +
    586 C> @param CH
    +
    587 C> @param WA1
    +
    588 C> @param WA2
    +
    589 C>
    +
    590 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    591  SUBROUTINE radb3 (IDO,L1,CC,CH,WA1,WA2)
    +
    592  dimension cc(ido,3,l1) ,ch(ido,l1,3) ,
    +
    593  1 wa1(*) ,wa2(*)
    +
    594  DATA taur,taui /-.5,.866025403784439/
    +
    595  DO 101 k=1,l1
    +
    596  tr2 = cc(ido,2,k)+cc(ido,2,k)
    +
    597  cr2 = cc(1,1,k)+taur*tr2
    +
    598  ch(1,k,1) = cc(1,1,k)+tr2
    +
    599  ci3 = taui*(cc(1,3,k)+cc(1,3,k))
    +
    600  ch(1,k,2) = cr2-ci3
    +
    601  ch(1,k,3) = cr2+ci3
    +
    602  101 CONTINUE
    +
    603  IF (ido .EQ. 1) RETURN
    +
    604  idp2 = ido+2
    +
    605 !OCL NOVREC
    +
    606  DO 103 k=1,l1
    +
    607  DO 102 i=3,ido,2
    +
    608  ic = idp2-i
    +
    609  tr2 = cc(i-1,3,k)+cc(ic-1,2,k)
    +
    610  cr2 = cc(i-1,1,k)+taur*tr2
    +
    611  ch(i-1,k,1) = cc(i-1,1,k)+tr2
    +
    612  ti2 = cc(i,3,k)-cc(ic,2,k)
    +
    613  ci2 = cc(i,1,k)+taur*ti2
    +
    614  ch(i,k,1) = cc(i,1,k)+ti2
    +
    615  cr3 = taui*(cc(i-1,3,k)-cc(ic-1,2,k))
    +
    616  ci3 = taui*(cc(i,3,k)+cc(ic,2,k))
    +
    617  dr2 = cr2-ci3
    +
    618  dr3 = cr2+ci3
    +
    619  di2 = ci2+cr3
    +
    620  di3 = ci2-cr3
    +
    621  ch(i-1,k,2) = wa1(i-2)*dr2-wa1(i-1)*di2
    +
    622  ch(i,k,2) = wa1(i-2)*di2+wa1(i-1)*dr2
    +
    623  ch(i-1,k,3) = wa2(i-2)*dr3-wa2(i-1)*di3
    +
    624  ch(i,k,3) = wa2(i-2)*di3+wa2(i-1)*dr3
    +
    625  102 CONTINUE
    +
    626  103 CONTINUE
    +
    627  RETURN
    +
    628  END
    +
    629 
    +
    630 C> RADB4
    +
    631 C>
    +
    632 C> @param IDO
    +
    633 C> @param L1
    +
    634 C> @param CC
    +
    635 C> @param CH
    +
    636 C> @param WA1
    +
    637 C> @param WA2
    +
    638 C> @param WA3
    +
    639 C>
    +
    640 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    641  SUBROUTINE radb4 (IDO,L1,CC,CH,WA1,WA2,WA3)
    +
    642  dimension cc(ido,4,l1) ,ch(ido,l1,4) ,
    +
    643  1 wa1(*) ,wa2(*) ,wa3(*)
    +
    644  DATA sqrt2 /1.414213562373095/
    +
    645  DO 101 k=1,l1
    +
    646  tr1 = cc(1,1,k)-cc(ido,4,k)
    +
    647  tr2 = cc(1,1,k)+cc(ido,4,k)
    +
    648  tr3 = cc(ido,2,k)+cc(ido,2,k)
    +
    649  tr4 = cc(1,3,k)+cc(1,3,k)
    +
    650  ch(1,k,1) = tr2+tr3
    +
    651  ch(1,k,2) = tr1-tr4
    +
    652  ch(1,k,3) = tr2-tr3
    +
    653  ch(1,k,4) = tr1+tr4
    +
    654  101 CONTINUE
    +
    655  IF (ido.LT.2) THEN
    +
    656  GO TO 107
    +
    657  ELSEIF (ido.EQ.2) THEN
    +
    658  GO TO 105
    +
    659  ELSE
    +
    660  GO TO 102
    +
    661  ENDIF
    +
    662  102 idp2 = ido+2
    +
    663 !OCL NOVREC
    +
    664  DO 104 k=1,l1
    +
    665  DO 103 i=3,ido,2
    +
    666  ic = idp2-i
    +
    667  ti1 = cc(i,1,k)+cc(ic,4,k)
    +
    668  ti2 = cc(i,1,k)-cc(ic,4,k)
    +
    669  ti3 = cc(i,3,k)-cc(ic,2,k)
    +
    670  tr4 = cc(i,3,k)+cc(ic,2,k)
    +
    671  tr1 = cc(i-1,1,k)-cc(ic-1,4,k)
    +
    672  tr2 = cc(i-1,1,k)+cc(ic-1,4,k)
    +
    673  ti4 = cc(i-1,3,k)-cc(ic-1,2,k)
    +
    674  tr3 = cc(i-1,3,k)+cc(ic-1,2,k)
    +
    675  ch(i-1,k,1) = tr2+tr3
    +
    676  cr3 = tr2-tr3
    +
    677  ch(i,k,1) = ti2+ti3
    +
    678  ci3 = ti2-ti3
    +
    679  cr2 = tr1-tr4
    +
    680  cr4 = tr1+tr4
    +
    681  ci2 = ti1+ti4
    +
    682  ci4 = ti1-ti4
    +
    683  ch(i-1,k,2) = wa1(i-2)*cr2-wa1(i-1)*ci2
    +
    684  ch(i,k,2) = wa1(i-2)*ci2+wa1(i-1)*cr2
    +
    685  ch(i-1,k,3) = wa2(i-2)*cr3-wa2(i-1)*ci3
    +
    686  ch(i,k,3) = wa2(i-2)*ci3+wa2(i-1)*cr3
    +
    687  ch(i-1,k,4) = wa3(i-2)*cr4-wa3(i-1)*ci4
    +
    688  ch(i,k,4) = wa3(i-2)*ci4+wa3(i-1)*cr4
    +
    689  103 CONTINUE
    +
    690  104 CONTINUE
    +
    691  IF (mod(ido,2) .EQ. 1) RETURN
    +
    692  105 CONTINUE
    +
    693  DO 106 k=1,l1
    +
    694  ti1 = cc(1,2,k)+cc(1,4,k)
    +
    695  ti2 = cc(1,4,k)-cc(1,2,k)
    +
    696  tr1 = cc(ido,1,k)-cc(ido,3,k)
    +
    697  tr2 = cc(ido,1,k)+cc(ido,3,k)
    +
    698  ch(ido,k,1) = tr2+tr2
    +
    699  ch(ido,k,2) = sqrt2*(tr1-ti1)
    +
    700  ch(ido,k,3) = ti2+ti2
    +
    701  ch(ido,k,4) = -sqrt2*(tr1+ti1)
    +
    702  106 CONTINUE
    +
    703  107 RETURN
    +
    704  END
    +
    705 
    +
    706 C> RADB5
    +
    707 C>
    +
    708 C> @param IDO
    +
    709 C> @param L1
    +
    710 C> @param CC
    +
    711 C> @param CH
    +
    712 C> @param WA1
    +
    713 C> @param WA2
    +
    714 C> @param WA3
    +
    715 C> @param WA4
    +
    716 C>
    +
    717 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    718  SUBROUTINE radb5 (IDO,L1,CC,CH,WA1,WA2,WA3,WA4)
    +
    719  dimension cc(ido,5,l1) ,ch(ido,l1,5) ,
    +
    720  1 wa1(*) ,wa2(*) ,wa3(*) ,wa4(*)
    +
    721  DATA tr11,ti11,tr12,ti12 /.309016994374947,.951056516295154,
    +
    722  1-.809016994374947,.587785252292473/
    +
    723  DO 101 k=1,l1
    +
    724  ti5 = cc(1,3,k)+cc(1,3,k)
    +
    725  ti4 = cc(1,5,k)+cc(1,5,k)
    +
    726  tr2 = cc(ido,2,k)+cc(ido,2,k)
    +
    727  tr3 = cc(ido,4,k)+cc(ido,4,k)
    +
    728  ch(1,k,1) = cc(1,1,k)+tr2+tr3
    +
    729  cr2 = cc(1,1,k)+tr11*tr2+tr12*tr3
    +
    730  cr3 = cc(1,1,k)+tr12*tr2+tr11*tr3
    +
    731  ci5 = ti11*ti5+ti12*ti4
    +
    732  ci4 = ti12*ti5-ti11*ti4
    +
    733  ch(1,k,2) = cr2-ci5
    +
    734  ch(1,k,3) = cr3-ci4
    +
    735  ch(1,k,4) = cr3+ci4
    +
    736  ch(1,k,5) = cr2+ci5
    +
    737  101 CONTINUE
    +
    738  IF (ido .EQ. 1) RETURN
    +
    739  idp2 = ido+2
    +
    740  DO 103 k=1,l1
    +
    741  DO 102 i=3,ido,2
    +
    742  ic = idp2-i
    +
    743  ti5 = cc(i,3,k)+cc(ic,2,k)
    +
    744  ti2 = cc(i,3,k)-cc(ic,2,k)
    +
    745  ti4 = cc(i,5,k)+cc(ic,4,k)
    +
    746  ti3 = cc(i,5,k)-cc(ic,4,k)
    +
    747  tr5 = cc(i-1,3,k)-cc(ic-1,2,k)
    +
    748  tr2 = cc(i-1,3,k)+cc(ic-1,2,k)
    +
    749  tr4 = cc(i-1,5,k)-cc(ic-1,4,k)
    +
    750  tr3 = cc(i-1,5,k)+cc(ic-1,4,k)
    +
    751  ch(i-1,k,1) = cc(i-1,1,k)+tr2+tr3
    +
    752  ch(i,k,1) = cc(i,1,k)+ti2+ti3
    +
    753  cr2 = cc(i-1,1,k)+tr11*tr2+tr12*tr3
    +
    754  ci2 = cc(i,1,k)+tr11*ti2+tr12*ti3
    +
    755  cr3 = cc(i-1,1,k)+tr12*tr2+tr11*tr3
    +
    756  ci3 = cc(i,1,k)+tr12*ti2+tr11*ti3
    +
    757  cr5 = ti11*tr5+ti12*tr4
    +
    758  ci5 = ti11*ti5+ti12*ti4
    +
    759  cr4 = ti12*tr5-ti11*tr4
    +
    760  ci4 = ti12*ti5-ti11*ti4
    +
    761  dr3 = cr3-ci4
    +
    762  dr4 = cr3+ci4
    +
    763  di3 = ci3+cr4
    +
    764  di4 = ci3-cr4
    +
    765  dr5 = cr2+ci5
    +
    766  dr2 = cr2-ci5
    +
    767  di5 = ci2-cr5
    +
    768  di2 = ci2+cr5
    +
    769  ch(i-1,k,2) = wa1(i-2)*dr2-wa1(i-1)*di2
    +
    770  ch(i,k,2) = wa1(i-2)*di2+wa1(i-1)*dr2
    +
    771  ch(i-1,k,3) = wa2(i-2)*dr3-wa2(i-1)*di3
    +
    772  ch(i,k,3) = wa2(i-2)*di3+wa2(i-1)*dr3
    +
    773  ch(i-1,k,4) = wa3(i-2)*dr4-wa3(i-1)*di4
    +
    774  ch(i,k,4) = wa3(i-2)*di4+wa3(i-1)*dr4
    +
    775  ch(i-1,k,5) = wa4(i-2)*dr5-wa4(i-1)*di5
    +
    776  ch(i,k,5) = wa4(i-2)*di5+wa4(i-1)*dr5
    +
    777  102 CONTINUE
    +
    778  103 CONTINUE
    +
    779  RETURN
    +
    780  END
    +
    781 
    +
    782 C> RADBG
    +
    783 C>
    +
    784 C> @param IDO
    +
    785 C> @param IP
    +
    786 C> @param L1
    +
    787 C> @param IDL1
    +
    788 C> @param CC
    +
    789 C> @param C1
    +
    790 C> @param C2
    +
    791 C> @param CH
    +
    792 C> @param CH2
    +
    793 C> @param WA
    +
    794 C>
    +
    795 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    796  SUBROUTINE radbg (IDO,IP,L1,IDL1,CC,C1,C2,CH,CH2,WA)
    +
    797  dimension ch(ido,l1,ip) ,cc(ido,ip,l1) ,
    +
    798  1 c1(ido,l1,ip) ,c2(idl1,ip),
    +
    799  2 ch2(idl1,ip) ,wa(*)
    +
    800  DATA tpi/6.28318530717959/
    +
    801  arg = tpi/float(ip)
    +
    802  dcp = cos(arg)
    +
    803  dsp = sin(arg)
    +
    804  idp2 = ido+2
    +
    805  nbd = (ido-1)/2
    +
    806  ipp2 = ip+2
    +
    807  ipph = (ip+1)/2
    +
    808  IF (ido .LT. l1) GO TO 103
    +
    809  DO 102 k=1,l1
    +
    810  DO 101 i=1,ido
    +
    811  ch(i,k,1) = cc(i,1,k)
    +
    812  101 CONTINUE
    +
    813  102 CONTINUE
    +
    814  GO TO 106
    +
    815  103 DO 105 i=1,ido
    +
    816  DO 104 k=1,l1
    +
    817  ch(i,k,1) = cc(i,1,k)
    +
    818  104 CONTINUE
    +
    819  105 CONTINUE
    +
    820 !OCL NOVREC
    +
    821  106 DO 108 j=2,ipph
    +
    822  jc = ipp2-j
    +
    823  j2 = j+j
    +
    824  DO 107 k=1,l1
    +
    825  ch(1,k,j) = cc(ido,j2-2,k)+cc(ido,j2-2,k)
    +
    826  ch(1,k,jc) = cc(1,j2-1,k)+cc(1,j2-1,k)
    +
    827  107 CONTINUE
    +
    828  108 CONTINUE
    +
    829  IF (ido .EQ. 1) GO TO 116
    +
    830  IF (nbd .LT. l1) GO TO 112
    +
    831 !OCL NOVREC
    +
    832  DO 111 j=2,ipph
    +
    833  jc = ipp2-j
    +
    834  DO 110 k=1,l1
    +
    835  DO 109 i=3,ido,2
    +
    836  ic = idp2-i
    +
    837  ch(i-1,k,j) = cc(i-1,2*j-1,k)+cc(ic-1,2*j-2,k)
    +
    838  ch(i-1,k,jc) = cc(i-1,2*j-1,k)-cc(ic-1,2*j-2,k)
    +
    839  ch(i,k,j) = cc(i,2*j-1,k)-cc(ic,2*j-2,k)
    +
    840  ch(i,k,jc) = cc(i,2*j-1,k)+cc(ic,2*j-2,k)
    +
    841  109 CONTINUE
    +
    842  110 CONTINUE
    +
    843  111 CONTINUE
    +
    844  GO TO 116
    +
    845  112 DO 115 j=2,ipph
    +
    846  jc = ipp2-j
    +
    847  DO 114 i=3,ido,2
    +
    848  ic = idp2-i
    +
    849  DO 113 k=1,l1
    +
    850  ch(i-1,k,j) = cc(i-1,2*j-1,k)+cc(ic-1,2*j-2,k)
    +
    851  ch(i-1,k,jc) = cc(i-1,2*j-1,k)-cc(ic-1,2*j-2,k)
    +
    852  ch(i,k,j) = cc(i,2*j-1,k)-cc(ic,2*j-2,k)
    +
    853  ch(i,k,jc) = cc(i,2*j-1,k)+cc(ic,2*j-2,k)
    +
    854  113 CONTINUE
    +
    855  114 CONTINUE
    +
    856  115 CONTINUE
    +
    857  116 ar1 = 1.
    +
    858  ai1 = 0.
    +
    859 !OCL NOVREC
    +
    860  DO 120 l=2,ipph
    +
    861  lc = ipp2-l
    +
    862  ar1h = dcp*ar1-dsp*ai1
    +
    863  ai1 = dcp*ai1+dsp*ar1
    +
    864  ar1 = ar1h
    +
    865  DO 117 ik=1,idl1
    +
    866  c2(ik,l) = ch2(ik,1)+ar1*ch2(ik,2)
    +
    867  c2(ik,lc) = ai1*ch2(ik,ip)
    +
    868  117 CONTINUE
    +
    869  dc2 = ar1
    +
    870  ds2 = ai1
    +
    871  ar2 = ar1
    +
    872  ai2 = ai1
    +
    873 !OCL NOVREC
    +
    874  DO 119 j=3,ipph
    +
    875  jc = ipp2-j
    +
    876  ar2h = dc2*ar2-ds2*ai2
    +
    877  ai2 = dc2*ai2+ds2*ar2
    +
    878  ar2 = ar2h
    +
    879  DO 118 ik=1,idl1
    +
    880  c2(ik,l) = c2(ik,l)+ar2*ch2(ik,j)
    +
    881  c2(ik,lc) = c2(ik,lc)+ai2*ch2(ik,jc)
    +
    882  118 CONTINUE
    +
    883  119 CONTINUE
    +
    884  120 CONTINUE
    +
    885 !OCL NOVREC
    +
    886  DO 122 j=2,ipph
    +
    887  DO 121 ik=1,idl1
    +
    888  ch2(ik,1) = ch2(ik,1)+ch2(ik,j)
    +
    889  121 CONTINUE
    +
    890  122 CONTINUE
    +
    891 !OCL NOVREC
    +
    892  DO 124 j=2,ipph
    +
    893  jc = ipp2-j
    +
    894  DO 123 k=1,l1
    +
    895  ch(1,k,j) = c1(1,k,j)-c1(1,k,jc)
    +
    896  ch(1,k,jc) = c1(1,k,j)+c1(1,k,jc)
    +
    897  123 CONTINUE
    +
    898  124 CONTINUE
    +
    899  IF (ido .EQ. 1) GO TO 132
    +
    900  IF (nbd .LT. l1) GO TO 128
    +
    901 !OCL NOVREC
    +
    902  DO 127 j=2,ipph
    +
    903  jc = ipp2-j
    +
    904  DO 126 k=1,l1
    +
    905  DO 125 i=3,ido,2
    +
    906  ch(i-1,k,j) = c1(i-1,k,j)-c1(i,k,jc)
    +
    907  ch(i-1,k,jc) = c1(i-1,k,j)+c1(i,k,jc)
    +
    908  ch(i,k,j) = c1(i,k,j)+c1(i-1,k,jc)
    +
    909  ch(i,k,jc) = c1(i,k,j)-c1(i-1,k,jc)
    +
    910  125 CONTINUE
    +
    911  126 CONTINUE
    +
    912  127 CONTINUE
    +
    913  GO TO 132
    +
    914  128 DO 131 j=2,ipph
    +
    915  jc = ipp2-j
    +
    916  DO 130 i=3,ido,2
    +
    917  DO 129 k=1,l1
    +
    918  ch(i-1,k,j) = c1(i-1,k,j)-c1(i,k,jc)
    +
    919  ch(i-1,k,jc) = c1(i-1,k,j)+c1(i,k,jc)
    +
    920  ch(i,k,j) = c1(i,k,j)+c1(i-1,k,jc)
    +
    921  ch(i,k,jc) = c1(i,k,j)-c1(i-1,k,jc)
    +
    922  129 CONTINUE
    +
    923  130 CONTINUE
    +
    924  131 CONTINUE
    +
    925  132 CONTINUE
    +
    926  IF (ido .EQ. 1) RETURN
    +
    927  DO 133 ik=1,idl1
    +
    928  c2(ik,1) = ch2(ik,1)
    +
    929  133 CONTINUE
    +
    930  DO 135 j=2,ip
    +
    931  DO 134 k=1,l1
    +
    932  c1(1,k,j) = ch(1,k,j)
    +
    933  134 CONTINUE
    +
    934  135 CONTINUE
    +
    935  IF (nbd .GT. l1) GO TO 139
    +
    936  is = -ido
    +
    937  DO 138 j=2,ip
    +
    938  is = is+ido
    +
    939  idij = is
    +
    940  DO 137 i=3,ido,2
    +
    941  idij = idij+2
    +
    942  DO 136 k=1,l1
    +
    943  c1(i-1,k,j) = wa(idij-1)*ch(i-1,k,j)-wa(idij)*ch(i,k,j)
    +
    944  c1(i,k,j) = wa(idij-1)*ch(i,k,j)+wa(idij)*ch(i-1,k,j)
    +
    945  136 CONTINUE
    +
    946  137 CONTINUE
    +
    947  138 CONTINUE
    +
    948  GO TO 143
    +
    949  139 is = -ido
    +
    950 !OCL NOVREC
    +
    951  DO 142 j=2,ip
    +
    952  is = is+ido
    +
    953  DO 141 k=1,l1
    +
    954  idij = is
    +
    955  DO 140 i=3,ido,2
    +
    956  idij = idij+2
    +
    957  c1(i-1,k,j) = wa(idij-1)*ch(i-1,k,j)-wa(idij)*ch(i,k,j)
    +
    958  c1(i,k,j) = wa(idij-1)*ch(i,k,j)+wa(idij)*ch(i-1,k,j)
    +
    959  140 CONTINUE
    +
    960  141 CONTINUE
    +
    961  142 CONTINUE
    +
    962  143 RETURN
    +
    963  END
    +
    964 
    +
    965 C> RADBG
    +
    966 C>
    +
    967 C> @param IDO
    +
    968 C> @param L1
    +
    969 C> @param CC
    +
    970 C> @param CH
    +
    971 C> @param WA1
    +
    972 C>
    +
    973 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    974  SUBROUTINE radf2 (IDO,L1,CC,CH,WA1)
    +
    975  dimension ch(ido,2,l1) ,cc(ido,l1,2) ,
    +
    976  1 wa1(*)
    +
    977  DO 101 k=1,l1
    +
    978  ch(1,1,k) = cc(1,k,1)+cc(1,k,2)
    +
    979  ch(ido,2,k) = cc(1,k,1)-cc(1,k,2)
    +
    980  101 CONTINUE
    +
    981  IF (ido.LT.2) THEN
    +
    982  GO TO 107
    +
    983  ELSEIF (ido.EQ.2) THEN
    +
    984  GO TO 105
    +
    985  ELSE
    +
    986  GO TO 102
    +
    987  ENDIF
    +
    988  102 idp2 = ido+2
    +
    989  DO 104 k=1,l1
    +
    990  DO 103 i=3,ido,2
    +
    991  ic = idp2-i
    +
    992  tr2 = wa1(i-2)*cc(i-1,k,2)+wa1(i-1)*cc(i,k,2)
    +
    993  ti2 = wa1(i-2)*cc(i,k,2)-wa1(i-1)*cc(i-1,k,2)
    +
    994  ch(i,1,k) = cc(i,k,1)+ti2
    +
    995  ch(ic,2,k) = ti2-cc(i,k,1)
    +
    996  ch(i-1,1,k) = cc(i-1,k,1)+tr2
    +
    997  ch(ic-1,2,k) = cc(i-1,k,1)-tr2
    +
    998  103 CONTINUE
    +
    999  104 CONTINUE
    +
    1000  IF (mod(ido,2) .EQ. 1) RETURN
    +
    1001  105 DO 106 k=1,l1
    +
    1002  ch(1,2,k) = -cc(ido,k,2)
    +
    1003  ch(ido,1,k) = cc(ido,k,1)
    +
    1004  106 CONTINUE
    +
    1005  107 RETURN
    +
    1006  END
    +
    1007 
    +
    1008 C> RADF3
    +
    1009 C>
    +
    1010 C> @param IDO
    +
    1011 C> @param L1
    +
    1012 C> @param CC
    +
    1013 C> @param CH
    +
    1014 C> @param WA1
    +
    1015 C> @param WA2
    +
    1016 C>
    +
    1017 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    1018  SUBROUTINE radf3 (IDO,L1,CC,CH,WA1,WA2)
    +
    1019  dimension ch(ido,3,l1) ,cc(ido,l1,3) ,
    +
    1020  1 wa1(*) ,wa2(*)
    +
    1021  DATA taur,taui /-.5,.866025403784439/
    +
    1022  DO 101 k=1,l1
    +
    1023  cr2 = cc(1,k,2)+cc(1,k,3)
    +
    1024  ch(1,1,k) = cc(1,k,1)+cr2
    +
    1025  ch(1,3,k) = taui*(cc(1,k,3)-cc(1,k,2))
    +
    1026  ch(ido,2,k) = cc(1,k,1)+taur*cr2
    +
    1027  101 CONTINUE
    +
    1028  IF (ido .EQ. 1) RETURN
    +
    1029  idp2 = ido+2
    +
    1030  DO 103 k=1,l1
    +
    1031  DO 102 i=3,ido,2
    +
    1032  ic = idp2-i
    +
    1033  dr2 = wa1(i-2)*cc(i-1,k,2)+wa1(i-1)*cc(i,k,2)
    +
    1034  di2 = wa1(i-2)*cc(i,k,2)-wa1(i-1)*cc(i-1,k,2)
    +
    1035  dr3 = wa2(i-2)*cc(i-1,k,3)+wa2(i-1)*cc(i,k,3)
    +
    1036  di3 = wa2(i-2)*cc(i,k,3)-wa2(i-1)*cc(i-1,k,3)
    +
    1037  cr2 = dr2+dr3
    +
    1038  ci2 = di2+di3
    +
    1039  ch(i-1,1,k) = cc(i-1,k,1)+cr2
    +
    1040  ch(i,1,k) = cc(i,k,1)+ci2
    +
    1041  tr2 = cc(i-1,k,1)+taur*cr2
    +
    1042  ti2 = cc(i,k,1)+taur*ci2
    +
    1043  tr3 = taui*(di2-di3)
    +
    1044  ti3 = taui*(dr3-dr2)
    +
    1045  ch(i-1,3,k) = tr2+tr3
    +
    1046  ch(ic-1,2,k) = tr2-tr3
    +
    1047  ch(i,3,k) = ti2+ti3
    +
    1048  ch(ic,2,k) = ti3-ti2
    +
    1049  102 CONTINUE
    +
    1050  103 CONTINUE
    +
    1051  RETURN
    +
    1052  END
    +
    1053 
    +
    1054 C> RADF4
    +
    1055 C>
    +
    1056 C> @param IDO
    +
    1057 C> @param L1
    +
    1058 C> @param CC
    +
    1059 C> @param CH
    +
    1060 C> @param WA1
    +
    1061 C> @param WA2
    +
    1062 C> @param WA3
    +
    1063 C>
    +
    1064 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    1065  SUBROUTINE radf4 (IDO,L1,CC,CH,WA1,WA2,WA3)
    +
    1066  dimension cc(ido,l1,4) ,ch(ido,4,l1) ,
    +
    1067  1 wa1(*) ,wa2(*) ,wa3(*)
    +
    1068  DATA hsqt2 /.7071067811865475/
    +
    1069  DO 101 k=1,l1
    +
    1070  tr1 = cc(1,k,2)+cc(1,k,4)
    +
    1071  tr2 = cc(1,k,1)+cc(1,k,3)
    +
    1072  ch(1,1,k) = tr1+tr2
    +
    1073  ch(ido,4,k) = tr2-tr1
    +
    1074  ch(ido,2,k) = cc(1,k,1)-cc(1,k,3)
    +
    1075  ch(1,3,k) = cc(1,k,4)-cc(1,k,2)
    +
    1076  101 CONTINUE
    +
    1077  IF (ido.LT.2) THEN
    +
    1078  GO TO 107
    +
    1079  ELSEIF (ido.EQ.2) THEN
    +
    1080  GO TO 105
    +
    1081  ELSE
    +
    1082  GO TO 102
    +
    1083  ENDIF
    +
    1084  102 idp2 = ido+2
    +
    1085 !OCL NOVREC
    +
    1086  DO 104 k=1,l1
    +
    1087  DO 103 i=3,ido,2
    +
    1088  ic = idp2-i
    +
    1089  cr2 = wa1(i-2)*cc(i-1,k,2)+wa1(i-1)*cc(i,k,2)
    +
    1090  ci2 = wa1(i-2)*cc(i,k,2)-wa1(i-1)*cc(i-1,k,2)
    +
    1091  cr3 = wa2(i-2)*cc(i-1,k,3)+wa2(i-1)*cc(i,k,3)
    +
    1092  ci3 = wa2(i-2)*cc(i,k,3)-wa2(i-1)*cc(i-1,k,3)
    +
    1093  cr4 = wa3(i-2)*cc(i-1,k,4)+wa3(i-1)*cc(i,k,4)
    +
    1094  ci4 = wa3(i-2)*cc(i,k,4)-wa3(i-1)*cc(i-1,k,4)
    +
    1095  tr1 = cr2+cr4
    +
    1096  tr4 = cr4-cr2
    +
    1097  ti1 = ci2+ci4
    +
    1098  ti4 = ci2-ci4
    +
    1099  ti2 = cc(i,k,1)+ci3
    +
    1100  ti3 = cc(i,k,1)-ci3
    +
    1101  tr2 = cc(i-1,k,1)+cr3
    +
    1102  tr3 = cc(i-1,k,1)-cr3
    +
    1103  ch(i-1,1,k) = tr1+tr2
    +
    1104  ch(ic-1,4,k) = tr2-tr1
    +
    1105  ch(i,1,k) = ti1+ti2
    +
    1106  ch(ic,4,k) = ti1-ti2
    +
    1107  ch(i-1,3,k) = ti4+tr3
    +
    1108  ch(ic-1,2,k) = tr3-ti4
    +
    1109  ch(i,3,k) = tr4+ti3
    +
    1110  ch(ic,2,k) = tr4-ti3
    +
    1111  103 CONTINUE
    +
    1112  104 CONTINUE
    +
    1113  IF (mod(ido,2) .EQ. 1) RETURN
    +
    1114  105 CONTINUE
    +
    1115  DO 106 k=1,l1
    +
    1116  ti1 = -hsqt2*(cc(ido,k,2)+cc(ido,k,4))
    +
    1117  tr1 = hsqt2*(cc(ido,k,2)-cc(ido,k,4))
    +
    1118  ch(ido,1,k) = tr1+cc(ido,k,1)
    +
    1119  ch(ido,3,k) = cc(ido,k,1)-tr1
    +
    1120  ch(1,2,k) = ti1-cc(ido,k,3)
    +
    1121  ch(1,4,k) = ti1+cc(ido,k,3)
    +
    1122  106 CONTINUE
    +
    1123  107 RETURN
    +
    1124  END
    +
    1125 
    +
    1126 C> RADF5
    +
    1127 C>
    +
    1128 C> @param IDO
    +
    1129 C> @param L1
    +
    1130 C> @param CC
    +
    1131 C> @param CH
    +
    1132 C> @param WA1
    +
    1133 C> @param WA2
    +
    1134 C> @param WA3
    +
    1135 C> @param WA4
    +
    1136 C>
    +
    1137 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    1138  SUBROUTINE radf5 (IDO,L1,CC,CH,WA1,WA2,WA3,WA4)
    +
    1139  dimension cc(ido,l1,5) ,ch(ido,5,l1) ,
    +
    1140  1 wa1(*) ,wa2(*) ,wa3(*) ,wa4(*)
    +
    1141  DATA tr11,ti11,tr12,ti12 /.309016994374947,.951056516295154,
    +
    1142  1-.809016994374947,.587785252292473/
    +
    1143  DO 101 k=1,l1
    +
    1144  cr2 = cc(1,k,5)+cc(1,k,2)
    +
    1145  ci5 = cc(1,k,5)-cc(1,k,2)
    +
    1146  cr3 = cc(1,k,4)+cc(1,k,3)
    +
    1147  ci4 = cc(1,k,4)-cc(1,k,3)
    +
    1148  ch(1,1,k) = cc(1,k,1)+cr2+cr3
    +
    1149  ch(ido,2,k) = cc(1,k,1)+tr11*cr2+tr12*cr3
    +
    1150  ch(1,3,k) = ti11*ci5+ti12*ci4
    +
    1151  ch(ido,4,k) = cc(1,k,1)+tr12*cr2+tr11*cr3
    +
    1152  ch(1,5,k) = ti12*ci5-ti11*ci4
    +
    1153  101 CONTINUE
    +
    1154  IF (ido .EQ. 1) RETURN
    +
    1155  idp2 = ido+2
    +
    1156  DO 103 k=1,l1
    +
    1157  DO 102 i=3,ido,2
    +
    1158  ic = idp2-i
    +
    1159  dr2 = wa1(i-2)*cc(i-1,k,2)+wa1(i-1)*cc(i,k,2)
    +
    1160  di2 = wa1(i-2)*cc(i,k,2)-wa1(i-1)*cc(i-1,k,2)
    +
    1161  dr3 = wa2(i-2)*cc(i-1,k,3)+wa2(i-1)*cc(i,k,3)
    +
    1162  di3 = wa2(i-2)*cc(i,k,3)-wa2(i-1)*cc(i-1,k,3)
    +
    1163  dr4 = wa3(i-2)*cc(i-1,k,4)+wa3(i-1)*cc(i,k,4)
    +
    1164  di4 = wa3(i-2)*cc(i,k,4)-wa3(i-1)*cc(i-1,k,4)
    +
    1165  dr5 = wa4(i-2)*cc(i-1,k,5)+wa4(i-1)*cc(i,k,5)
    +
    1166  di5 = wa4(i-2)*cc(i,k,5)-wa4(i-1)*cc(i-1,k,5)
    +
    1167  cr2 = dr2+dr5
    +
    1168  ci5 = dr5-dr2
    +
    1169  cr5 = di2-di5
    +
    1170  ci2 = di2+di5
    +
    1171  cr3 = dr3+dr4
    +
    1172  ci4 = dr4-dr3
    +
    1173  cr4 = di3-di4
    +
    1174  ci3 = di3+di4
    +
    1175  ch(i-1,1,k) = cc(i-1,k,1)+cr2+cr3
    +
    1176  ch(i,1,k) = cc(i,k,1)+ci2+ci3
    +
    1177  tr2 = cc(i-1,k,1)+tr11*cr2+tr12*cr3
    +
    1178  ti2 = cc(i,k,1)+tr11*ci2+tr12*ci3
    +
    1179  tr3 = cc(i-1,k,1)+tr12*cr2+tr11*cr3
    +
    1180  ti3 = cc(i,k,1)+tr12*ci2+tr11*ci3
    +
    1181  tr5 = ti11*cr5+ti12*cr4
    +
    1182  ti5 = ti11*ci5+ti12*ci4
    +
    1183  tr4 = ti12*cr5-ti11*cr4
    +
    1184  ti4 = ti12*ci5-ti11*ci4
    +
    1185  ch(i-1,3,k) = tr2+tr5
    +
    1186  ch(ic-1,2,k) = tr2-tr5
    +
    1187  ch(i,3,k) = ti2+ti5
    +
    1188  ch(ic,2,k) = ti5-ti2
    +
    1189  ch(i-1,5,k) = tr3+tr4
    +
    1190  ch(ic-1,4,k) = tr3-tr4
    +
    1191  ch(i,5,k) = ti3+ti4
    +
    1192  ch(ic,4,k) = ti4-ti3
    +
    1193  102 CONTINUE
    +
    1194  103 CONTINUE
    +
    1195  RETURN
    +
    1196  END
    +
    1197 
    +
    1198 C> RADFG
    +
    1199 C>
    +
    1200 C> @param IDO
    +
    1201 C> @param IP
    +
    1202 C> @param L1
    +
    1203 C> @param IDL1
    +
    1204 C> @param CC
    +
    1205 C> @param C1
    +
    1206 C> @param C2
    +
    1207 C> @param CH
    +
    1208 C> @param CH2
    +
    1209 C> @param WA
    +
    1210 C>
    +
    1211 C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO
    +
    1212  SUBROUTINE radfg (IDO,IP,L1,IDL1,CC,C1,C2,CH,CH2,WA)
    +
    1213  dimension ch(ido,l1,ip) ,cc(ido,ip,l1) ,
    +
    1214  1 c1(ido,l1,ip) ,c2(idl1,ip),
    +
    1215  2 ch2(idl1,ip) ,wa(*)
    +
    1216  DATA tpi/6.28318530717959/
    +
    1217  arg = tpi/float(ip)
    +
    1218  dcp = cos(arg)
    +
    1219  dsp = sin(arg)
    +
    1220  ipph = (ip+1)/2
    +
    1221  ipp2 = ip+2
    +
    1222  idp2 = ido+2
    +
    1223  nbd = (ido-1)/2
    +
    1224  IF (ido .EQ. 1) GO TO 119
    +
    1225  DO 101 ik=1,idl1
    +
    1226  ch2(ik,1) = c2(ik,1)
    +
    1227  101 CONTINUE
    +
    1228  DO 103 j=2,ip
    +
    1229  DO 102 k=1,l1
    +
    1230  ch(1,k,j) = c1(1,k,j)
    +
    1231  102 CONTINUE
    +
    1232  103 CONTINUE
    +
    1233  IF (nbd .GT. l1) GO TO 107
    +
    1234  is = -ido
    +
    1235  DO 106 j=2,ip
    +
    1236  is = is+ido
    +
    1237  idij = is
    +
    1238  DO 105 i=3,ido,2
    +
    1239  idij = idij+2
    +
    1240  DO 104 k=1,l1
    +
    1241  ch(i-1,k,j) = wa(idij-1)*c1(i-1,k,j)+wa(idij)*c1(i,k,j)
    +
    1242  ch(i,k,j) = wa(idij-1)*c1(i,k,j)-wa(idij)*c1(i-1,k,j)
    +
    1243  104 CONTINUE
    +
    1244  105 CONTINUE
    +
    1245  106 CONTINUE
    +
    1246  GO TO 111
    +
    1247  107 is = -ido
    +
    1248  DO 110 j=2,ip
    +
    1249  is = is+ido
    +
    1250  DO 109 k=1,l1
    +
    1251  idij = is
    +
    1252  DO 108 i=3,ido,2
    +
    1253  idij = idij+2
    +
    1254  ch(i-1,k,j) = wa(idij-1)*c1(i-1,k,j)+wa(idij)*c1(i,k,j)
    +
    1255  ch(i,k,j) = wa(idij-1)*c1(i,k,j)-wa(idij)*c1(i-1,k,j)
    +
    1256  108 CONTINUE
    +
    1257  109 CONTINUE
    +
    1258  110 CONTINUE
    +
    1259  111 IF (nbd .LT. l1) GO TO 115
    +
    1260  DO 114 j=2,ipph
    +
    1261  jc = ipp2-j
    +
    1262  DO 113 k=1,l1
    +
    1263  DO 112 i=3,ido,2
    +
    1264  c1(i-1,k,j) = ch(i-1,k,j)+ch(i-1,k,jc)
    +
    1265  c1(i-1,k,jc) = ch(i,k,j)-ch(i,k,jc)
    +
    1266  c1(i,k,j) = ch(i,k,j)+ch(i,k,jc)
    +
    1267  c1(i,k,jc) = ch(i-1,k,jc)-ch(i-1,k,j)
    +
    1268  112 CONTINUE
    +
    1269  113 CONTINUE
    +
    1270  114 CONTINUE
    +
    1271  GO TO 121
    +
    1272  115 DO 118 j=2,ipph
    +
    1273  jc = ipp2-j
    +
    1274  DO 117 i=3,ido,2
    +
    1275  DO 116 k=1,l1
    +
    1276  c1(i-1,k,j) = ch(i-1,k,j)+ch(i-1,k,jc)
    +
    1277  c1(i-1,k,jc) = ch(i,k,j)-ch(i,k,jc)
    +
    1278  c1(i,k,j) = ch(i,k,j)+ch(i,k,jc)
    +
    1279  c1(i,k,jc) = ch(i-1,k,jc)-ch(i-1,k,j)
    +
    1280  116 CONTINUE
    +
    1281  117 CONTINUE
    +
    1282  118 CONTINUE
    +
    1283  GO TO 121
    +
    1284  119 DO 120 ik=1,idl1
    +
    1285  c2(ik,1) = ch2(ik,1)
    +
    1286  120 CONTINUE
    +
    1287  121 DO 123 j=2,ipph
    +
    1288  jc = ipp2-j
    +
    1289  DO 122 k=1,l1
    +
    1290  c1(1,k,j) = ch(1,k,j)+ch(1,k,jc)
    +
    1291  c1(1,k,jc) = ch(1,k,jc)-ch(1,k,j)
    +
    1292  122 CONTINUE
    +
    1293  123 CONTINUE
    +
    1294 C
    +
    1295  ar1 = 1.
    +
    1296  ai1 = 0.
    +
    1297  DO 127 l=2,ipph
    +
    1298  lc = ipp2-l
    +
    1299  ar1h = dcp*ar1-dsp*ai1
    +
    1300  ai1 = dcp*ai1+dsp*ar1
    +
    1301  ar1 = ar1h
    +
    1302  DO 124 ik=1,idl1
    +
    1303  ch2(ik,l) = c2(ik,1)+ar1*c2(ik,2)
    +
    1304  ch2(ik,lc) = ai1*c2(ik,ip)
    +
    1305  124 CONTINUE
    +
    1306  dc2 = ar1
    +
    1307  ds2 = ai1
    +
    1308  ar2 = ar1
    +
    1309  ai2 = ai1
    +
    1310  DO 126 j=3,ipph
    +
    1311  jc = ipp2-j
    +
    1312  ar2h = dc2*ar2-ds2*ai2
    +
    1313  ai2 = dc2*ai2+ds2*ar2
    +
    1314  ar2 = ar2h
    +
    1315  DO 125 ik=1,idl1
    +
    1316  ch2(ik,l) = ch2(ik,l)+ar2*c2(ik,j)
    +
    1317  ch2(ik,lc) = ch2(ik,lc)+ai2*c2(ik,jc)
    +
    1318  125 CONTINUE
    +
    1319  126 CONTINUE
    +
    1320  127 CONTINUE
    +
    1321  DO 129 j=2,ipph
    +
    1322  DO 128 ik=1,idl1
    +
    1323  ch2(ik,1) = ch2(ik,1)+c2(ik,j)
    +
    1324  128 CONTINUE
    +
    1325  129 CONTINUE
    +
    1326 C
    +
    1327  IF (ido .LT. l1) GO TO 132
    +
    1328  DO 131 k=1,l1
    +
    1329  DO 130 i=1,ido
    +
    1330  cc(i,1,k) = ch(i,k,1)
    +
    1331  130 CONTINUE
    +
    1332  131 CONTINUE
    +
    1333  GO TO 135
    +
    1334  132 DO 134 i=1,ido
    +
    1335  DO 133 k=1,l1
    +
    1336  cc(i,1,k) = ch(i,k,1)
    +
    1337  133 CONTINUE
    +
    1338  134 CONTINUE
    +
    1339  135 DO 137 j=2,ipph
    +
    1340  jc = ipp2-j
    +
    1341  j2 = j+j
    +
    1342  DO 136 k=1,l1
    +
    1343  cc(ido,j2-2,k) = ch(1,k,j)
    +
    1344  cc(1,j2-1,k) = ch(1,k,jc)
    +
    1345  136 CONTINUE
    +
    1346  137 CONTINUE
    +
    1347  IF (ido .EQ. 1) RETURN
    +
    1348  IF (nbd .LT. l1) GO TO 141
    +
    1349  DO 140 j=2,ipph
    +
    1350  jc = ipp2-j
    +
    1351  j2 = j+j
    +
    1352  DO 139 k=1,l1
    +
    1353  DO 138 i=3,ido,2
    +
    1354  ic = idp2-i
    +
    1355  cc(i-1,j2-1,k) = ch(i-1,k,j)+ch(i-1,k,jc)
    +
    1356  cc(ic-1,j2-2,k) = ch(i-1,k,j)-ch(i-1,k,jc)
    +
    1357  cc(i,j2-1,k) = ch(i,k,j)+ch(i,k,jc)
    +
    1358  cc(ic,j2-2,k) = ch(i,k,jc)-ch(i,k,j)
    +
    1359  138 CONTINUE
    +
    1360  139 CONTINUE
    +
    1361  140 CONTINUE
    +
    1362  RETURN
    +
    1363  141 DO 144 j=2,ipph
    +
    1364  jc = ipp2-j
    +
    1365  j2 = j+j
    +
    1366  DO 143 i=3,ido,2
    +
    1367  ic = idp2-i
    +
    1368  DO 142 k=1,l1
    +
    1369  cc(i-1,j2-1,k) = ch(i-1,k,j)+ch(i-1,k,jc)
    +
    1370  cc(ic-1,j2-2,k) = ch(i-1,k,j)-ch(i-1,k,jc)
    +
    1371  cc(i,j2-1,k) = ch(i,k,j)+ch(i,k,jc)
    +
    1372  cc(ic,j2-2,k) = ch(i,k,jc)-ch(i,k,j)
    +
    1373  142 CONTINUE
    +
    1374  143 CONTINUE
    +
    1375  144 CONTINUE
    +
    1376  RETURN
    +
    1377  END
    +
    subroutine radb5(IDO, L1, CC, CH, WA1, WA2, WA3, WA4)
    RADB5.
    Definition: fftpack.F:719
    +
    subroutine scfft(isign, n, scale, x, y, table, work, isys)
    scfft
    Definition: fftpack.F:258
    +
    subroutine radb4(IDO, L1, CC, CH, WA1, WA2, WA3)
    RADB4.
    Definition: fftpack.F:642
    +
    subroutine rffti(N, WSAVE)
    RFFTI.
    Definition: fftpack.F:318
    +
    subroutine radf3(IDO, L1, CC, CH, WA1, WA2)
    RADF3.
    Definition: fftpack.F:1019
    +
    subroutine drcft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
    drcft
    Definition: fftpack.F:164
    +
    subroutine radb3(IDO, L1, CC, CH, WA1, WA2)
    RADB3
    Definition: fftpack.F:592
    +
    subroutine radf5(IDO, L1, CC, CH, WA1, WA2, WA3, WA4)
    RADF5.
    Definition: fftpack.F:1139
    +
    subroutine radf2(IDO, L1, CC, CH, WA1)
    RADBG.
    Definition: fftpack.F:975
    +
    subroutine dcrft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
    dcrft
    Definition: fftpack.F:34
    +
    subroutine rfftb(N, R, WSAVE)
    RFFTB.
    Definition: fftpack.F:305
    +
    subroutine scrft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
    scrft
    Definition: fftpack.F:82
    +
    subroutine rfftf1(N, C, CH, WA, IFAC)
    RFFTF1.
    Definition: fftpack.F:403
    +
    subroutine srcft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
    srcft
    Definition: fftpack.F:215
    +
    subroutine csfft(isign, n, scale, x, y, table, work, isys)
    csfft
    Definition: fftpack.F:121
    +
    subroutine radfg(IDO, IP, L1, IDL1, CC, C1, C2, CH, CH2, WA)
    RADFG.
    Definition: fftpack.F:1213
    +
    subroutine rffti1(N, WA, IFAC)
    RFFTI1.
    Definition: fftpack.F:470
    +
    subroutine radb2(IDO, L1, CC, CH, WA1)
    RADB2.
    Definition: fftpack.F:547
    +
    subroutine radf4(IDO, L1, CC, CH, WA1, WA2, WA3)
    RADF4.
    Definition: fftpack.F:1066
    +
    subroutine radbg(IDO, IP, L1, IDL1, CC, C1, C2, CH, CH2, WA)
    RADBG.
    Definition: fftpack.F:797
    +
    subroutine rfftb1(N, C, CH, WA, IFAC)
    RFFTB1.
    Definition: fftpack.F:334
    +
    subroutine rfftf(N, R, WSAVE)
    RFFTF.
    Definition: fftpack.F:291
    +
    +
    + + + + diff --git a/ver-5.1.0/files.html b/ver-5.1.0/files.html new file mode 100644 index 00000000..7c55cf73 --- /dev/null +++ b/ver-5.1.0/files.html @@ -0,0 +1,192 @@ + + + + + + + +NCEPLIBS-ip: File List + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     bicubic_interp_mod.F90Bicubic interpolation routines for scalars and vectors
     bilinear_interp_mod.F90Bilinear interpolation routines for scalars and vectors
     budget_interp_mod.F90Budget interpolation routines for scalars and vectors
     earth_radius_mod.F90Determine earth radius and shape
     fftpack.FA concatination of the (FFTPACK)[https://netlib.org/fftpack/] library code
     gdswzd_c.F90C wrapper for routine gdswzd()
     gdswzd_mod.F90Driver module for gdswzd routines
     ip_constants_mod.F90Constants for use in NCEPLIBS-ip
     ip_equid_cylind_grid_mod.F90Equidistant cylindrical grib decoder and grid coordinate transformations
     ip_gaussian_grid_mod.F90Gaussian grid coordinate transformations
     ip_grid_descriptor_mod.F90Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions
     ip_grid_factory_mod.F90Routines for creating an ip_grid given a Grib descriptor
     ip_grid_mod.F90Abstract ip_grid type
     ip_grids_mod.F90Re-export the individual grids
     ip_interpolators_mod.F90Top-level module to export interpolation routines and constants
     ip_lambert_conf_grid_mod.F90GDS wizard for lambert conformal conical
     ip_mercator_grid_mod.F90GDS wizard for mercator cylindrical
     ip_mod.F90Top-level module for the ip library
     ip_polar_stereo_grid_mod.F90GDS wizard for polar stereographic azimuthal
     ip_rot_equid_cylind_egrid_mod.F90Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grid E
     ip_rot_equid_cylind_grid_mod.F90Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grids A through D
     ip_station_points_grid_mod.F90Interpolate gridded data to a series of station points
     iplib_4.hC interface to gdswzd() and gdswzd_grib1() functions for '4' library build
     iplib_8.hC interface to gdswzd() and gdswzd_grib1() functions for '8' library build
     iplib_d.hC interface to gdswzd() and gdswzd_grib1() functions for 'd' library build
     ipolates.F90Top-level driver for scalar interpolation routine ipolates()
     ipolatev.F90Top-level driver for vector interpolation routine ipolates
     ipxetas.F90Expand or contract eta grids using linear interpolation
     ipxwafs.F90Expand or contract wafs grids
     ipxwafs2.F90Expand or contract wafs grids using linear interpolation and account for bitmapped data
     ipxwafs3.F90Expand or contract wafs grids using neighbor interpolation and accout for bitmapped data
     movect.F90Move a vector along a great circle
     ncpus.FSet number of cpus
     neighbor_budget_interp_mod.F90Interpolate scalar and vector fields with neighbor budget interpolation
     neighbor_interp_mod.F90Interpolate scalar and vector fields with neighbor interpolation
     polfix_mod.F90Make multiple pole scalar values consistent
     sp_mod.F
     spanaly.fAnalyze spectral from Fourier
     spdz2uv.fCompute winds from divergence and vorticity
     spectral_interp_mod.F90Interpolate spectral
     speps.fCompute utility spectral fields
     spfft.fPerform multiple fast fourier transforms
     spfft1.fPerform multiple fast Fourier transforms
     spffte.fPerform multiple fast Fourier transforms
     spfftpt.fCompute fourier transform to gridpoints
     spgradq.fCompute gradient in spectral space
     spgradx.fCompute x-gradient in Fourier space
     spgrady.fCompute y-gradient in spectral space
     splaplac.fCompute laplacian in spectral space
     splat.FComputes cosines of colatitude and Gaussian weights for sets of latitudes
     splegend.fCompute Legendre polynomials
     sppad.fPad or truncate a spectral field
     spsynth.fSynthesize Fourier coefficients from spectral coefficients
     sptez.fPerform a simple scalar spherical transform
     sptezd.fPerform a simple gradient spherical transform
     sptezm.fPerform simple scalar spherical transforms
     sptezmd.fPerform simple gradient spherical transforms
     sptezmv.fPerform simple vector spherical transforms
     sptezv.fPerform a simple vector spherical transform
     sptgpm.fTransform spectral scalar to Mercator
     sptgpmd.fTransform spectral to Mercator gradients
     sptgpmv.fTransform spectral vector to Mercator
     sptgps.fTransform spectral scalar to polar stereo
     sptgpsd.fTransform spectral to polar stereographic gradients
     sptgpsv.fTransform spectral vector to polar stereo
     sptgpt.fTransform spectral scalar to station points
     sptgptd.fTransform spectral to station point gradients
     sptgptsd.fTransform spectral scalar to station points
     sptgptv.fTransform spectral vector to station points
     sptgptvd.fTransform spectral vector to station points
     sptran.fPerform a scalar spherical transform
     sptrand.fPerform a gradient spherical transform
     sptranf.fPerform a scalar spherical transform
     sptranf0.fSptranf spectral initialization
     sptranf1.fSptranf spectral transform
     sptranfv.fPerform a vector spherical transform
     sptranv.fPerform a vector spherical transform
     sptrun.fTruncate gridded scalar fields
     sptrund.fSpectrally truncate to gradients
     sptrung.fSpectrally interpolate scalars to stations
     sptrungv.fSpectrally interpolate vectors to stations
     sptrunl.fSpectrally truncate to laplacian
     sptrunm.fSpectrally interpolate scalars to Mercator
     sptrunmv.fSpectrally interpolate vectors to Mercator
     sptruns.fSpectrally interpolate scalars to polar stereo
     sptrunsv.fSpectrally interpolate vectors to polar stereo
     sptrunv.fSpectrally truncate gridded vector fields
     spuv2dz.fCompute divergence and vorticity from winds
     spvar.fCompute variance by total wavenumber
     spwget.fGet wave-space constants
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/files_dup.js b/ver-5.1.0/files_dup.js new file mode 100644 index 00000000..f385241f --- /dev/null +++ b/ver-5.1.0/files_dup.js @@ -0,0 +1,93 @@ +var files_dup = +[ + [ "bicubic_interp_mod.F90", "bicubic__interp__mod_8F90.html", "bicubic__interp__mod_8F90" ], + [ "bilinear_interp_mod.F90", "bilinear__interp__mod_8F90.html", "bilinear__interp__mod_8F90" ], + [ "budget_interp_mod.F90", "budget__interp__mod_8F90.html", "budget__interp__mod_8F90" ], + [ "earth_radius_mod.F90", "earth__radius__mod_8F90.html", "earth__radius__mod_8F90" ], + [ "fftpack.F", "fftpack_8F.html", "fftpack_8F" ], + [ "gdswzd_c.F90", "gdswzd__c_8F90.html", "gdswzd__c_8F90" ], + [ "gdswzd_mod.F90", "gdswzd__mod_8F90.html", "gdswzd__mod_8F90" ], + [ "ip_constants_mod.F90", "ip__constants__mod_8F90.html", "ip__constants__mod_8F90" ], + [ "ip_equid_cylind_grid_mod.F90", "ip__equid__cylind__grid__mod_8F90.html", "ip__equid__cylind__grid__mod_8F90" ], + [ "ip_gaussian_grid_mod.F90", "ip__gaussian__grid__mod_8F90.html", "ip__gaussian__grid__mod_8F90" ], + [ "ip_grid_descriptor_mod.F90", "ip__grid__descriptor__mod_8F90.html", "ip__grid__descriptor__mod_8F90" ], + [ "ip_grid_factory_mod.F90", "ip__grid__factory__mod_8F90.html", "ip__grid__factory__mod_8F90" ], + [ "ip_grid_mod.F90", "ip__grid__mod_8F90.html", "ip__grid__mod_8F90" ], + [ "ip_grids_mod.F90", "ip__grids__mod_8F90.html", null ], + [ "ip_interpolators_mod.F90", "ip__interpolators__mod_8F90.html", "ip__interpolators__mod_8F90" ], + [ "ip_lambert_conf_grid_mod.F90", "ip__lambert__conf__grid__mod_8F90.html", "ip__lambert__conf__grid__mod_8F90" ], + [ "ip_mercator_grid_mod.F90", "ip__mercator__grid__mod_8F90.html", "ip__mercator__grid__mod_8F90" ], + [ "ip_mod.F90", "ip__mod_8F90.html", null ], + [ "ip_polar_stereo_grid_mod.F90", "ip__polar__stereo__grid__mod_8F90.html", "ip__polar__stereo__grid__mod_8F90" ], + [ "ip_rot_equid_cylind_egrid_mod.F90", "ip__rot__equid__cylind__egrid__mod_8F90.html", "ip__rot__equid__cylind__egrid__mod_8F90" ], + [ "ip_rot_equid_cylind_grid_mod.F90", "ip__rot__equid__cylind__grid__mod_8F90.html", "ip__rot__equid__cylind__grid__mod_8F90" ], + [ "ip_station_points_grid_mod.F90", "ip__station__points__grid__mod_8F90.html", "ip__station__points__grid__mod_8F90" ], + [ "iplib_4.h", "iplib__4_8h.html", "iplib__4_8h" ], + [ "iplib_8.h", "iplib__8_8h.html", "iplib__8_8h" ], + [ "iplib_d.h", "iplib__d_8h.html", "iplib__d_8h" ], + [ "ipolates.F90", "ipolates_8F90.html", "ipolates_8F90" ], + [ "ipolatev.F90", "ipolatev_8F90.html", "ipolatev_8F90" ], + [ "ipxetas.F90", "ipxetas_8F90.html", "ipxetas_8F90" ], + [ "ipxwafs.F90", "ipxwafs_8F90.html", "ipxwafs_8F90" ], + [ "ipxwafs2.F90", "ipxwafs2_8F90.html", "ipxwafs2_8F90" ], + [ "ipxwafs3.F90", "ipxwafs3_8F90.html", "ipxwafs3_8F90" ], + [ "movect.F90", "movect_8F90.html", "movect_8F90" ], + [ "ncpus.F", "ncpus_8F.html", "ncpus_8F" ], + [ "neighbor_budget_interp_mod.F90", "neighbor__budget__interp__mod_8F90.html", "neighbor__budget__interp__mod_8F90" ], + [ "neighbor_interp_mod.F90", "neighbor__interp__mod_8F90.html", "neighbor__interp__mod_8F90" ], + [ "polfix_mod.F90", "polfix__mod_8F90.html", "polfix__mod_8F90" ], + [ "sp_mod.F", "sp__mod_8F_source.html", null ], + [ "spanaly.f", "spanaly_8f.html", "spanaly_8f" ], + [ "spdz2uv.f", "spdz2uv_8f.html", "spdz2uv_8f" ], + [ "spectral_interp_mod.F90", "spectral__interp__mod_8F90.html", "spectral__interp__mod_8F90" ], + [ "speps.f", "speps_8f.html", "speps_8f" ], + [ "spfft.f", "spfft_8f.html", "spfft_8f" ], + [ "spfft1.f", "spfft1_8f.html", "spfft1_8f" ], + [ "spffte.f", "spffte_8f.html", "spffte_8f" ], + [ "spfftpt.f", "spfftpt_8f.html", "spfftpt_8f" ], + [ "spgradq.f", "spgradq_8f.html", "spgradq_8f" ], + [ "spgradx.f", "spgradx_8f.html", "spgradx_8f" ], + [ "spgrady.f", "spgrady_8f.html", "spgrady_8f" ], + [ "splaplac.f", "splaplac_8f.html", "splaplac_8f" ], + [ "splat.F", "splat_8F.html", "splat_8F" ], + [ "splegend.f", "splegend_8f.html", "splegend_8f" ], + [ "sppad.f", "sppad_8f.html", "sppad_8f" ], + [ "spsynth.f", "spsynth_8f.html", "spsynth_8f" ], + [ "sptez.f", "sptez_8f.html", "sptez_8f" ], + [ "sptezd.f", "sptezd_8f.html", "sptezd_8f" ], + [ "sptezm.f", "sptezm_8f.html", "sptezm_8f" ], + [ "sptezmd.f", "sptezmd_8f.html", "sptezmd_8f" ], + [ "sptezmv.f", "sptezmv_8f.html", "sptezmv_8f" ], + [ "sptezv.f", "sptezv_8f.html", "sptezv_8f" ], + [ "sptgpm.f", "sptgpm_8f.html", "sptgpm_8f" ], + [ "sptgpmd.f", "sptgpmd_8f.html", "sptgpmd_8f" ], + [ "sptgpmv.f", "sptgpmv_8f.html", "sptgpmv_8f" ], + [ "sptgps.f", "sptgps_8f.html", "sptgps_8f" ], + [ "sptgpsd.f", "sptgpsd_8f.html", "sptgpsd_8f" ], + [ "sptgpsv.f", "sptgpsv_8f.html", "sptgpsv_8f" ], + [ "sptgpt.f", "sptgpt_8f.html", "sptgpt_8f" ], + [ "sptgptd.f", "sptgptd_8f.html", "sptgptd_8f" ], + [ "sptgptsd.f", "sptgptsd_8f.html", "sptgptsd_8f" ], + [ "sptgptv.f", "sptgptv_8f.html", "sptgptv_8f" ], + [ "sptgptvd.f", "sptgptvd_8f.html", "sptgptvd_8f" ], + [ "sptran.f", "sptran_8f.html", "sptran_8f" ], + [ "sptrand.f", "sptrand_8f.html", "sptrand_8f" ], + [ "sptranf.f", "sptranf_8f.html", "sptranf_8f" ], + [ "sptranf0.f", "sptranf0_8f.html", "sptranf0_8f" ], + [ "sptranf1.f", "sptranf1_8f.html", "sptranf1_8f" ], + [ "sptranfv.f", "sptranfv_8f.html", "sptranfv_8f" ], + [ "sptranv.f", "sptranv_8f.html", "sptranv_8f" ], + [ "sptrun.f", "sptrun_8f.html", "sptrun_8f" ], + [ "sptrund.f", "sptrund_8f.html", "sptrund_8f" ], + [ "sptrung.f", "sptrung_8f.html", "sptrung_8f" ], + [ "sptrungv.f", "sptrungv_8f.html", "sptrungv_8f" ], + [ "sptrunl.f", "sptrunl_8f.html", "sptrunl_8f" ], + [ "sptrunm.f", "sptrunm_8f.html", "sptrunm_8f" ], + [ "sptrunmv.f", "sptrunmv_8f.html", "sptrunmv_8f" ], + [ "sptruns.f", "sptruns_8f.html", "sptruns_8f" ], + [ "sptrunsv.f", "sptrunsv_8f.html", "sptrunsv_8f" ], + [ "sptrunv.f", "sptrunv_8f.html", "sptrunv_8f" ], + [ "spuv2dz.f", "spuv2dz_8f.html", "spuv2dz_8f" ], + [ "spvar.f", "spvar_8f.html", "spvar_8f" ], + [ "spwget.f", "spwget_8f.html", "spwget_8f" ] +]; \ No newline at end of file diff --git a/folderclosed.png b/ver-5.1.0/folderclosed.png similarity index 100% rename from folderclosed.png rename to ver-5.1.0/folderclosed.png diff --git a/folderopen.png b/ver-5.1.0/folderopen.png similarity index 100% rename from folderopen.png rename to ver-5.1.0/folderopen.png diff --git a/ver-5.1.0/functions.html b/ver-5.1.0/functions.html new file mode 100644 index 00000000..d095edd2 --- /dev/null +++ b/ver-5.1.0/functions.html @@ -0,0 +1,476 @@ + + + + + + + +NCEPLIBS-ip: Data Fields + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all documented data types members with links to the data structure documentation for each member
    + +

    - c -

    + + +

    - d -

    + + +

    - e -

    + + +

    - f -

    + + +

    - g -

    + + +

    - h -

    + + +

    - i -

    + + +

    - j -

    + + +

    - k -

    + + +

    - n -

    + + +

    - o -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - w -

    +
    +
    + + + + diff --git a/ver-5.1.0/functions_func.html b/ver-5.1.0/functions_func.html new file mode 100644 index 00000000..302f4b7e --- /dev/null +++ b/ver-5.1.0/functions_func.html @@ -0,0 +1,268 @@ + + + + + + + +NCEPLIBS-ip: Data Fields - Functions/Subroutines + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - f -

    + + +

    - g -

    + + +

    - i -

    + + +

    - p -

    +
    +
    + + + + diff --git a/ver-5.1.0/functions_vars.html b/ver-5.1.0/functions_vars.html new file mode 100644 index 00000000..f226994b --- /dev/null +++ b/ver-5.1.0/functions_vars.html @@ -0,0 +1,310 @@ + + + + + + + +NCEPLIBS-ip: Data Fields - Variables + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - c -

    + + +

    - d -

    + + +

    - e -

    + + +

    - g -

    + + +

    - h -

    + + +

    - i -

    + + +

    - j -

    + + +

    - k -

    + + +

    - n -

    + + +

    - o -

    + + +

    - r -

    + + +

    - s -

    + + +

    - w -

    +
    +
    + + + + diff --git a/ver-5.1.0/gdswzd__c_8F90.html b/ver-5.1.0/gdswzd__c_8F90.html new file mode 100644 index 00000000..9a8d640e --- /dev/null +++ b/ver-5.1.0/gdswzd__c_8F90.html @@ -0,0 +1,129 @@ + + + + + + + +NCEPLIBS-ip: gdswzd_c.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    gdswzd_c.F90 File Reference
    +
    +
    + +

    C wrapper for routine gdswzd(). +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Modules

    module  gdswzd_c_mod
     Module that contains C wrapper for routine gdswzd().
     
    + + + + + + + +

    +Functions/Subroutines

    subroutine gdswzd_c_mod::gdswzd_c (IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     C wrapper for routine gdswzd(). More...
     
    subroutine gdswzd_c_mod::gdswzd_c_grib1 (KGDS, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     C wrapper for routine gdswzd. More...
     
    +

    Detailed Description

    +

    C wrapper for routine gdswzd().

    +
    Author
    JOVIC
    +
    Date
    2016-04-10
    + +

    Definition in file gdswzd_c.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/gdswzd__c_8F90.js b/ver-5.1.0/gdswzd__c_8F90.js new file mode 100644 index 00000000..db0f3b21 --- /dev/null +++ b/ver-5.1.0/gdswzd__c_8F90.js @@ -0,0 +1,5 @@ +var gdswzd__c_8F90 = +[ + [ "gdswzd_c", "gdswzd__c_8F90.html#ae3026381f7f41561507c97c9125d24e4", null ], + [ "gdswzd_c_grib1", "gdswzd__c_8F90.html#a06861f1403edf106bb3b399c39981504", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/gdswzd__c_8F90_source.html b/ver-5.1.0/gdswzd__c_8F90_source.html new file mode 100644 index 00000000..7f02ddbf --- /dev/null +++ b/ver-5.1.0/gdswzd__c_8F90_source.html @@ -0,0 +1,189 @@ + + + + + + + +NCEPLIBS-ip: gdswzd_c.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    gdswzd_c.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    4 
    + +
    8  use gdswzd_mod
    +
    9  implicit none
    +
    10 
    +
    11 contains
    +
    12 
    +
    173  SUBROUTINE gdswzd_c(IGDTNUM,IGDTMPL,IGDTLEN,IOPT,NPTS,FILL, &
    +
    174  XPTS,YPTS,RLON,RLAT,NRET,CROT,SROT, &
    +
    175  XLON,XLAT,YLON,YLAT,AREA) bind(C, NAME='gdswzd')
    +
    176  use, INTRINSIC :: iso_c_binding
    +
    177 
    +
    178  USE gdswzd_mod
    +
    179 
    +
    180  IMPLICIT NONE
    +
    181 
    +
    182 #if (LSIZE==8)
    +
    183  INTEGER(KIND=C_LONG), INTENT(IN) :: IGDTMPL(IGDTLEN)
    +
    184  INTEGER(KIND=C_LONG), VALUE, INTENT(IN) :: IGDTNUM, IGDTLEN
    +
    185  INTEGER(KIND=C_LONG), VALUE, INTENT(IN) :: IOPT, NPTS
    +
    186  INTEGER(KIND=C_LONG), INTENT(OUT) :: NRET
    +
    187 #else
    +
    188  INTEGER(KIND=C_INT), INTENT(IN) :: IGDTMPL(IGDTLEN)
    +
    189  INTEGER(KIND=C_INT), VALUE, INTENT(IN) :: IGDTNUM, IGDTLEN
    +
    190  INTEGER(KIND=C_INT), VALUE, INTENT(IN) :: IOPT, NPTS
    +
    191  INTEGER(KIND=C_INT), INTENT(OUT) :: NRET
    +
    192 #endif
    +
    193 
    +
    194 #if (LSIZE==4)
    +
    195  REAL(KIND=c_float), VALUE, INTENT(IN) :: fill
    +
    196  REAL(KIND=c_float), INTENT(INOUT) :: xpts(npts),ypts(npts),rlon(npts),rlat(npts)
    +
    197  REAL(KIND=c_float), INTENT(OUT) :: crot(npts),srot(npts),xlon(npts),xlat(npts)
    +
    198  REAL(KIND=c_float), INTENT(OUT) :: ylon(npts),ylat(npts),area(npts)
    +
    199 #else
    +
    200  REAL(KIND=c_double), VALUE, INTENT(IN) :: fill
    +
    201  REAL(KIND=c_double), INTENT(INOUT) :: xpts(npts),ypts(npts),rlon(npts),rlat(npts)
    +
    202  REAL(KIND=c_double), INTENT(OUT) :: crot(npts),srot(npts),xlon(npts),xlat(npts)
    +
    203  REAL(KIND=c_double), INTENT(OUT) :: ylon(npts),ylat(npts),area(npts)
    +
    204 #endif
    +
    205 
    +
    206  CALL gdswzd(igdtnum,igdtmpl,igdtlen,iopt,npts,fill, &
    +
    207  xpts,ypts,rlon,rlat,nret, &
    +
    208  crot,srot,xlon,xlat,ylon,ylat,area)
    +
    209 
    +
    210  END SUBROUTINE gdswzd_c
    +
    211 
    +
    259  SUBROUTINE gdswzd_c_grib1(KGDS,IOPT,NPTS,FILL,XPTS,YPTS,RLON,RLAT,NRET, &
    +
    260  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA) bind(C, NAME='gdswzd_grib1')
    +
    261  use, INTRINSIC :: iso_c_binding
    +
    262 
    +
    263  USE gdswzd_mod
    +
    264 
    +
    265  IMPLICIT NONE
    +
    266 
    +
    267 #if (LSIZE==8)
    +
    268  INTEGER(KIND=C_LONG), INTENT(IN) :: KGDS(200)
    +
    269  INTEGER(KIND=C_LONG), VALUE, INTENT(IN) :: IOPT
    +
    270  INTEGER(KIND=C_LONG), VALUE, INTENT(IN) :: NPTS
    +
    271  INTEGER(KIND=C_LONG), INTENT(OUT) :: NRET
    +
    272 #else
    +
    273  INTEGER(KIND=C_INT), INTENT(IN) :: KGDS(200)
    +
    274  INTEGER(KIND=C_INT), VALUE, INTENT(IN) :: IOPT
    +
    275  INTEGER(KIND=C_INT), VALUE, INTENT(IN) :: NPTS
    +
    276  INTEGER(KIND=C_INT), INTENT(OUT) :: NRET
    +
    277 #endif
    +
    278 
    +
    279 #if (LSIZE==4)
    +
    280  REAL(KIND=c_float), VALUE, INTENT(IN) :: fill
    +
    281  REAL(KIND=c_float), INTENT(INOUT) :: xpts(npts),ypts(npts),rlon(npts),rlat(npts)
    +
    282  REAL(KIND=c_float), INTENT(OUT) :: crot(npts),srot(npts),xlon(npts),xlat(npts)
    +
    283  REAL(KIND=c_float), INTENT(OUT) :: ylon(npts),ylat(npts),area(npts)
    +
    284 #else
    +
    285  REAL(KIND=c_double), VALUE, INTENT(IN) :: fill
    +
    286  REAL(KIND=c_double), INTENT(INOUT) :: xpts(npts),ypts(npts),rlon(npts),rlat(npts)
    +
    287  REAL(KIND=c_double), INTENT(OUT) :: crot(npts),srot(npts),xlon(npts),xlat(npts)
    +
    288  REAL(KIND=c_double), INTENT(OUT) :: ylon(npts),ylat(npts),area(npts)
    +
    289 #endif
    +
    290 
    +
    291  CALL gdswzd(kgds,iopt,npts,fill,xpts,ypts,rlon,rlat,nret, &
    +
    292  crot,srot,xlon,xlat,ylon,ylat,area)
    +
    293 
    +
    294  END SUBROUTINE gdswzd_c_grib1
    +
    295 
    +
    296 end module gdswzd_c_mod
    + +
    Module that contains C wrapper for routine gdswzd().
    Definition: gdswzd_c.F90:7
    +
    subroutine gdswzd_c_grib1(KGDS, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
    C wrapper for routine gdswzd.
    Definition: gdswzd_c.F90:261
    +
    subroutine gdswzd_c(IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
    C wrapper for routine gdswzd().
    Definition: gdswzd_c.F90:176
    +
    Driver module for gdswzd routines.
    Definition: gdswzd_mod.F90:25
    +
    +
    + + + + diff --git a/ver-5.1.0/gdswzd__mod_8F90.html b/ver-5.1.0/gdswzd__mod_8F90.html new file mode 100644 index 00000000..881c2de3 --- /dev/null +++ b/ver-5.1.0/gdswzd__mod_8F90.html @@ -0,0 +1,147 @@ + + + + + + + +NCEPLIBS-ip: gdswzd_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    gdswzd_mod.F90 File Reference
    +
    +
    + +

    Driver module for gdswzd routines. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Data Types

    interface  gdswzd_mod::gdswzd
     
    + + + + +

    +Modules

    module  gdswzd_mod
     Driver module for gdswzd routines.
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine gdswzd_mod::gdswzd_1d_array (IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Decodes the grib 2 grid definition template and returns one of the following: More...
     
    subroutine gdswzd_mod::gdswzd_2d_array (IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Decodes the grib 2 grid definition template and returns one of the following (for 2d-arrays): More...
     
    subroutine, public gdswzd_mod::gdswzd_2d_array_grib1 (KGDS, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Decodes the grib grid description section and returns one of the following (for 2-d arrays): More...
     
    subroutine, public gdswzd_mod::gdswzd_grib1 (KGDS, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Decodes the grib grid description section and returns one of the following (for 1-d arrays): More...
     
    subroutine gdswzd_mod::gdswzd_grid (grid, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Returns one of the following for a grid object: More...
     
    subroutine gdswzd_mod::gdswzd_scalar (IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Decodes the grib 2 grid definition template and returns one of the following (for scalars): More...
     
    +

    Detailed Description

    +

    Driver module for gdswzd routines.

    +
    Date
    Jan 2015
    +
    Author
    George Gayno, Kyle Gerheiser
    + +

    Definition in file gdswzd_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/gdswzd__mod_8F90.js b/ver-5.1.0/gdswzd__mod_8F90.js new file mode 100644 index 00000000..3b950779 --- /dev/null +++ b/ver-5.1.0/gdswzd__mod_8F90.js @@ -0,0 +1,10 @@ +var gdswzd__mod_8F90 = +[ + [ "gdswzd", "interfacegdswzd__mod_1_1gdswzd.html", "interfacegdswzd__mod_1_1gdswzd" ], + [ "gdswzd_1d_array", "gdswzd__mod_8F90.html#ac304e2b046eccc701e24827c81107e76", null ], + [ "gdswzd_2d_array", "gdswzd__mod_8F90.html#acdf970e498e9317522fbdfb690b86e25", null ], + [ "gdswzd_2d_array_grib1", "gdswzd__mod_8F90.html#aa032a55281b18e208630a730679958f4", null ], + [ "gdswzd_grib1", "gdswzd__mod_8F90.html#a133e040fac8dd56e607b8e3fb6a58c37", null ], + [ "gdswzd_grid", "gdswzd__mod_8F90.html#a584d2bddbc6d857b80cfac5e3b288d45", null ], + [ "gdswzd_scalar", "gdswzd__mod_8F90.html#aba3235c5bc5797e72b9a6a8a587b8861", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/gdswzd__mod_8F90_source.html b/ver-5.1.0/gdswzd__mod_8F90_source.html new file mode 100644 index 00000000..2b3993b6 --- /dev/null +++ b/ver-5.1.0/gdswzd__mod_8F90_source.html @@ -0,0 +1,450 @@ + + + + + + + +NCEPLIBS-ip: gdswzd_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    gdswzd_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    6 
    +
    25 MODULE gdswzd_mod
    + +
    27  use ip_grids_mod
    +
    28  use ip_grid_mod
    + +
    30 
    +
    31  IMPLICIT NONE
    +
    32 
    +
    33  PRIVATE
    +
    34 
    + +
    36 
    +
    37  INTERFACE gdswzd
    +
    38  MODULE PROCEDURE gdswzd_1d_array
    +
    39  MODULE PROCEDURE gdswzd_2d_array
    +
    40  MODULE PROCEDURE gdswzd_scalar
    +
    41  module procedure gdswzd_grib1
    +
    42  module procedure gdswzd_2d_array_grib1
    +
    43  module procedure gdswzd_grid
    +
    44  END INTERFACE gdswzd
    +
    45 
    +
    46 CONTAINS
    +
    47 
    +
    105  subroutine gdswzd_grid(grid,IOPT,NPTS,FILL, &
    +
    106  XPTS,YPTS,RLON,RLAT,NRET, &
    +
    107  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
    +
    108 
    +
    109  class(ip_grid), intent(in) :: grid
    +
    110  INTEGER, INTENT(IN ) :: IOPT, NPTS
    +
    111  INTEGER, INTENT( OUT) :: NRET
    +
    112  !
    +
    113  REAL, INTENT(IN ) :: FILL
    +
    114  REAL, INTENT(INOUT) :: RLON(NPTS),RLAT(NPTS)
    +
    115  REAL, INTENT(INOUT) :: XPTS(NPTS),YPTS(NPTS)
    +
    116  REAL, OPTIONAL, INTENT( OUT) :: CROT(NPTS),SROT(NPTS)
    +
    117  REAL, OPTIONAL, INTENT( OUT) :: XLON(NPTS),XLAT(NPTS)
    +
    118  REAL, OPTIONAL, INTENT( OUT) :: YLON(NPTS),YLAT(NPTS),AREA(NPTS)
    +
    119 
    +
    120  INTEGER :: IS1, IM, JM, NM, KSCAN, NSCAN, N
    +
    121  INTEGER :: IOPF, NN, I, J
    +
    122 
    +
    123  ! COMPUTE GRID COORDINATES FOR ALL GRID POINTS
    +
    124  IF(iopt.EQ.0) THEN
    +
    125  iopf=1
    +
    126 
    +
    127  if(grid%descriptor%grid_num.eq.-1)then
    +
    128  nm = npts
    +
    129  else
    +
    130  im = grid%im
    +
    131  jm = grid%jm
    +
    132  nm = im * jm
    +
    133  endif
    +
    134  nscan = grid%nscan
    +
    135  kscan = grid%kscan
    +
    136 
    +
    137  if (nm > npts) then
    +
    138  rlat=fill
    +
    139  rlon=fill
    +
    140  xpts=fill
    +
    141  ypts=fill
    +
    142  return
    +
    143  end if
    +
    144 
    +
    145  select type(grid)
    +
    146  type is(ip_rot_equid_cylind_egrid)
    +
    147  if(kscan == 0) then
    +
    148  is1 = (jm + 1) / 2
    +
    149  else
    +
    150  is1 = jm / 2
    +
    151  end if
    +
    152 
    +
    153  DO n=1,nm
    +
    154  IF(nscan.EQ.0) THEN
    +
    155  j=(n-1)/im+1
    +
    156  i=(n-im*(j-1))*2-mod(j+kscan,2)
    +
    157  ELSE
    +
    158  nn=(n*2)-1+kscan
    +
    159  i = (nn-1)/jm + 1
    +
    160  j = mod(nn-1,jm) + 1
    +
    161  IF (mod(jm,2)==0.AND.mod(i,2)==0.AND.kscan==0) j = j + 1
    +
    162  IF (mod(jm,2)==0.AND.mod(i,2)==0.AND.kscan==1) j = j - 1
    +
    163  ENDIF
    +
    164  xpts(n)=is1+(i-(j-kscan))/2
    +
    165  ypts(n)=(i+(j-kscan))/2
    +
    166  ENDDO
    +
    167  type is(ip_station_points_grid)
    +
    168  DO n=1,nm
    +
    169  xpts(n)=fill
    +
    170  ypts(n)=fill
    +
    171  ENDDO
    +
    172  class default
    +
    173  DO n=1,nm
    +
    174  IF(nscan.EQ.0) THEN
    +
    175  j=(n-1)/im+1
    +
    176  i=n-im*(j-1)
    +
    177  ELSE
    +
    178  i=(n-1)/jm+1
    +
    179  j=n-jm*(i-1)
    +
    180  ENDIF
    +
    181  xpts(n)=i
    +
    182  ypts(n)=j
    +
    183  ENDDO
    +
    184  end select
    +
    185 
    +
    186  DO n=nm+1,npts
    +
    187  xpts(n)=fill
    +
    188  ypts(n)=fill
    +
    189  ENDDO
    +
    190 
    +
    191  ELSE ! IOPT /= 0
    +
    192  iopf=iopt
    +
    193  ENDIF ! IOPT CHECK
    +
    194 
    +
    195  call grid%gdswzd(iopf,npts,fill, &
    +
    196  xpts,ypts,rlon,rlat,nret, &
    +
    197  crot,srot,xlon,xlat,ylon,ylat,area)
    +
    198 
    +
    199  end subroutine gdswzd_grid
    +
    200 
    +
    201 
    +
    278  SUBROUTINE gdswzd_scalar(IGDTNUM,IGDTMPL,IGDTLEN,IOPT,NPTS,FILL, &
    +
    279  XPTS,YPTS,RLON,RLAT,NRET, &
    +
    280  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
    +
    281 
    +
    282  IMPLICIT NONE
    +
    283  !
    +
    284  INTEGER, INTENT(IN ) :: IGDTNUM, IGDTLEN
    +
    285  INTEGER, INTENT(IN ) :: IGDTMPL(IGDTLEN)
    +
    286  INTEGER, INTENT(IN ) :: IOPT, NPTS
    +
    287  INTEGER, INTENT( OUT) :: NRET
    +
    288  !
    +
    289  REAL, INTENT(IN ) :: FILL
    +
    290  REAL, INTENT(INOUT) :: RLON, RLAT
    +
    291  REAL, INTENT(INOUT) :: XPTS, YPTS
    +
    292  REAL, OPTIONAL, INTENT( OUT) :: CROT, SROT
    +
    293  REAL, OPTIONAL, INTENT( OUT) :: XLON, XLAT
    +
    294  REAL, OPTIONAL, INTENT( OUT) :: YLON, YLAT, AREA
    +
    295 
    +
    296  REAL :: RLONA(1),RLATA(1)
    +
    297  REAL :: XPTSA(1),YPTSA(1)
    +
    298  REAL :: CROTA(1),SROTA(1)
    +
    299  REAL :: XLONA(1),XLATA(1)
    +
    300  REAL :: YLONA(1),YLATA(1),AREAA(1)
    +
    301 
    +
    302  rlona(1) = rlon
    +
    303  rlata(1) = rlat
    +
    304  xptsa(1) = xpts
    +
    305  yptsa(1) = ypts
    +
    306 
    +
    307  nret = 0
    +
    308 
    +
    309  ! CALL WITHOUT EXTRA FIELDS.
    +
    310 
    +
    311  IF (.NOT. PRESENT(crot) .AND. &
    +
    312  .NOT. PRESENT(srot) .AND. &
    +
    313  .NOT. PRESENT(xlon) .AND. &
    +
    314  .NOT. PRESENT(xlat) .AND. &
    +
    315  .NOT. PRESENT(ylon) .AND. &
    +
    316  .NOT. PRESENT(ylat) .AND. &
    +
    317  .NOT. PRESENT(area) ) THEN
    +
    318 
    +
    319  CALL gdswzd_1d_array(igdtnum,igdtmpl,igdtlen,iopt,npts,fill, &
    +
    320  xptsa,yptsa,rlona,rlata,nret)
    +
    321 
    +
    322  rlon = rlona(1)
    +
    323  rlat = rlata(1)
    +
    324  xpts = xptsa(1)
    +
    325  ypts = yptsa(1)
    +
    326 
    +
    327  ENDIF
    +
    328 
    +
    329  ! MIMIC CALL TO OLD 'GDSWIZ' ROUTINES.
    +
    330 
    +
    331  IF (PRESENT(crot) .AND. &
    +
    332  PRESENT(srot) .AND. &
    +
    333  .NOT. PRESENT(xlon) .AND. &
    +
    334  .NOT. PRESENT(xlat) .AND. &
    +
    335  .NOT. PRESENT(ylon) .AND. &
    +
    336  .NOT. PRESENT(ylat) .AND. &
    +
    337  .NOT. PRESENT(area) ) THEN
    +
    338 
    +
    339  CALL gdswzd_1d_array(igdtnum,igdtmpl,igdtlen,iopt,npts,fill, &
    +
    340  xptsa,yptsa,rlona,rlata,nret,crota,srota)
    +
    341 
    +
    342  rlon = rlona(1)
    +
    343  rlat = rlata(1)
    +
    344  xpts = xptsa(1)
    +
    345  ypts = yptsa(1)
    +
    346  crot = crota(1)
    +
    347  srot = srota(1)
    +
    348 
    +
    349  ENDIF
    +
    350 
    +
    351  ! MIMIC CALL TO OLD 'GDSWZD' ROUTINES.
    +
    352 
    +
    353  IF (PRESENT(crot) .AND. &
    +
    354  PRESENT(srot) .AND. &
    +
    355  PRESENT(xlon) .AND. &
    +
    356  PRESENT(xlat) .AND. &
    +
    357  PRESENT(ylon) .AND. &
    +
    358  PRESENT(ylat) .AND. &
    +
    359  PRESENT(area) ) THEN
    +
    360 
    +
    361  CALL gdswzd_1d_array(igdtnum,igdtmpl,igdtlen,iopt,npts,fill, &
    +
    362  xptsa,yptsa,rlona,rlata,nret, &
    +
    363  crota,srota,xlona,xlata,ylona,ylata,areaa)
    +
    364 
    +
    365  rlon = rlona(1)
    +
    366  rlat = rlata(1)
    +
    367  xpts = xptsa(1)
    +
    368  ypts = yptsa(1)
    +
    369  crot = crota(1)
    +
    370  srot = srota(1)
    +
    371  xlon = xlona(1)
    +
    372  xlat = xlata(1)
    +
    373  ylon = ylona(1)
    +
    374  ylat = ylata(1)
    +
    375  area = areaa(1)
    +
    376 
    +
    377  ENDIF
    +
    378 
    +
    379  RETURN
    +
    380 
    +
    381  END SUBROUTINE gdswzd_scalar
    +
    382 
    +
    459  SUBROUTINE gdswzd_2d_array(IGDTNUM,IGDTMPL,IGDTLEN,IOPT,NPTS,FILL, &
    +
    460  XPTS,YPTS,RLON,RLAT,NRET, &
    +
    461  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
    +
    462 
    +
    463  IMPLICIT NONE
    +
    464  !
    +
    465  INTEGER, INTENT(IN ) :: IGDTNUM, IGDTLEN
    +
    466  INTEGER, INTENT(IN ) :: IGDTMPL(IGDTLEN)
    +
    467  INTEGER, INTENT(IN ) :: IOPT, NPTS
    +
    468  INTEGER, INTENT( OUT) :: NRET
    +
    469  !
    +
    470  REAL, INTENT(IN ) :: FILL
    +
    471  REAL, INTENT(INOUT) :: RLON(:,:),RLAT(:,:)
    +
    472  REAL, INTENT(INOUT) :: XPTS(:,:),YPTS(:,:)
    +
    473  REAL, OPTIONAL, INTENT( OUT) :: CROT(:,:),SROT(:,:)
    +
    474  REAL, OPTIONAL, INTENT( OUT) :: XLON(:,:),XLAT(:,:)
    +
    475  REAL, OPTIONAL, INTENT( OUT) :: YLON(:,:),YLAT(:,:),AREA(:,:)
    +
    476 
    +
    477  CALL gdswzd_1d_array(igdtnum,igdtmpl,igdtlen,iopt,npts,fill, &
    +
    478  xpts,ypts,rlon,rlat,nret, &
    +
    479  crot,srot,xlon,xlat,ylon,ylat,area)
    +
    480 
    +
    481  END SUBROUTINE gdswzd_2d_array
    +
    482 
    +
    665  SUBROUTINE gdswzd_1d_array(IGDTNUM,IGDTMPL,IGDTLEN,IOPT,NPTS,FILL, &
    +
    666  XPTS,YPTS,RLON,RLAT,NRET, &
    +
    667  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
    +
    668  INTEGER, INTENT(IN ) :: IGDTNUM, IGDTLEN
    +
    669  INTEGER, INTENT(IN ) :: IGDTMPL(IGDTLEN)
    +
    670  INTEGER, INTENT(IN ) :: IOPT, NPTS
    +
    671  INTEGER, INTENT( OUT) :: NRET
    +
    672  !
    +
    673  REAL, INTENT(IN ) :: FILL
    +
    674  REAL, INTENT(INOUT) :: RLON(NPTS),RLAT(NPTS)
    +
    675  REAL, INTENT(INOUT) :: XPTS(NPTS),YPTS(NPTS)
    +
    676  REAL, OPTIONAL, INTENT( OUT) :: CROT(NPTS),SROT(NPTS)
    +
    677  REAL, OPTIONAL, INTENT( OUT) :: XLON(NPTS),XLAT(NPTS)
    +
    678  REAL, OPTIONAL, INTENT( OUT) :: YLON(NPTS),YLAT(NPTS),AREA(NPTS)
    +
    679 
    +
    680  type(grib2_descriptor) :: desc
    +
    681  class(ip_grid), allocatable :: grid
    +
    682 
    +
    683  desc = init_descriptor(igdtnum, igdtlen, igdtmpl)
    +
    684  call init_grid(grid, desc)
    +
    685 
    +
    686  call gdswzd_grid(grid,iopt,npts,fill, &
    +
    687  xpts,ypts,rlon,rlat,nret, &
    +
    688  crot,srot,xlon,xlat,ylon,ylat,area)
    +
    689 
    +
    690  END SUBROUTINE gdswzd_1d_array
    +
    691 
    +
    758  SUBROUTINE gdswzd_grib1(KGDS,IOPT,NPTS,FILL,XPTS,YPTS,RLON,RLAT,NRET, &
    +
    759  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
    +
    760  INTEGER, INTENT(IN ) :: IOPT, KGDS(200), NPTS
    +
    761  INTEGER, INTENT( OUT) :: NRET
    +
    762  !
    +
    763  REAL, INTENT(IN ) :: FILL
    +
    764  REAL, INTENT(INOUT) :: RLON(NPTS),RLAT(NPTS)
    +
    765  REAL, INTENT(INOUT) :: XPTS(NPTS),YPTS(NPTS)
    +
    766  REAL, OPTIONAL, INTENT( OUT) :: CROT(NPTS),SROT(NPTS)
    +
    767  REAL, OPTIONAL, INTENT( OUT) :: XLON(NPTS),XLAT(NPTS)
    +
    768  REAL, OPTIONAL, INTENT( OUT) :: YLON(NPTS),YLAT(NPTS),AREA(NPTS)
    +
    769 
    +
    770 
    +
    771  type(grib1_descriptor) :: desc
    +
    772  class(ip_grid), allocatable :: grid
    +
    773 
    +
    774  desc = init_descriptor(kgds)
    +
    775  call init_grid(grid, desc)
    +
    776 
    +
    777  call gdswzd_grid(grid,iopt,npts,fill, &
    +
    778  xpts,ypts,rlon,rlat,nret, &
    +
    779  crot,srot,xlon,xlat,ylon,ylat,area)
    +
    780 
    +
    781  END SUBROUTINE gdswzd_grib1
    +
    782 
    +
    783 
    +
    850  SUBROUTINE gdswzd_2d_array_grib1(KGDS,IOPT,NPTS,FILL,XPTS,YPTS,RLON,RLAT,NRET, &
    +
    851  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
    +
    852 
    +
    853  !$$$
    +
    854  INTEGER, INTENT(IN ) :: IOPT, KGDS(200), NPTS
    +
    855  INTEGER, INTENT( OUT) :: NRET
    +
    856  !
    +
    857  REAL, INTENT(IN ) :: FILL
    +
    858  REAL, INTENT(INOUT) :: RLON(:,:),RLAT(:,:)
    +
    859  REAL, INTENT(INOUT) :: XPTS(:,:),YPTS(:,:)
    +
    860  REAL, OPTIONAL, INTENT( OUT) :: CROT(:,:),SROT(:,:)
    +
    861  REAL, OPTIONAL, INTENT( OUT) :: XLON(:,:),XLAT(:,:)
    +
    862  REAL, OPTIONAL, INTENT( OUT) :: YLON(:,:),YLAT(:,:),AREA(:,:)
    +
    863 
    +
    864 
    +
    865  type(grib1_descriptor) :: desc
    +
    866  class(ip_grid), allocatable :: grid
    +
    867 
    +
    868  desc = init_descriptor(kgds)
    +
    869  call init_grid(grid, desc)
    +
    870 
    +
    871  call gdswzd_grid(grid,iopt,npts,fill, &
    +
    872  xpts,ypts,rlon,rlat,nret, &
    +
    873  crot,srot,xlon,xlat,ylon,ylat,area)
    +
    874 
    +
    875  END SUBROUTINE gdswzd_2d_array_grib1
    +
    876 
    +
    877 
    +
    878 
    +
    879 END MODULE gdswzd_mod
    + + + +
    Driver module for gdswzd routines.
    Definition: gdswzd_mod.F90:25
    +
    subroutine, public gdswzd_grib1(KGDS, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
    Decodes the grib grid description section and returns one of the following (for 1-d arrays):
    Definition: gdswzd_mod.F90:760
    +
    subroutine gdswzd_grid(grid, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
    Returns one of the following for a grid object:
    Definition: gdswzd_mod.F90:108
    +
    subroutine, public gdswzd_2d_array_grib1(KGDS, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
    Decodes the grib grid description section and returns one of the following (for 2-d arrays):
    Definition: gdswzd_mod.F90:852
    +
    subroutine gdswzd_scalar(IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
    Decodes the grib 2 grid definition template and returns one of the following (for scalars):
    Definition: gdswzd_mod.F90:281
    +
    subroutine gdswzd_1d_array(IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
    Decodes the grib 2 grid definition template and returns one of the following:
    Definition: gdswzd_mod.F90:668
    +
    subroutine gdswzd_2d_array(IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
    Decodes the grib 2 grid definition template and returns one of the following (for 2d-arrays):
    Definition: gdswzd_mod.F90:462
    +
    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
    +
    Routines for creating an ip_grid given a Grib descriptor.
    +
    Abstract ip_grid type.
    Definition: ip_grid_mod.F90:10
    +
    Re-export the individual grids.
    Definition: ip_grids_mod.F90:7
    +
    Descriptor representing a grib1 grib descriptor section (GDS) with an integer array.
    +
    Grib-2 descriptor containing a grib2 GDT represented by an integer array.
    +
    Abstract grid that holds fields and methods common to all grids.
    Definition: ip_grid_mod.F90:58
    +
    +
    + + + + diff --git a/ver-5.1.0/globals.html b/ver-5.1.0/globals.html new file mode 100644 index 00000000..462f477c --- /dev/null +++ b/ver-5.1.0/globals.html @@ -0,0 +1,376 @@ + + + + + + + +NCEPLIBS-ip: Globals + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - c -

    + + +

    - d -

    + + +

    - g -

    + + +

    - i -

    + + +

    - m -

    + + +

    - n -

    + + +

    - r -

    + + +

    - s -

    +
    +
    + + + + diff --git a/ver-5.1.0/globals_func.html b/ver-5.1.0/globals_func.html new file mode 100644 index 00000000..bc86712c --- /dev/null +++ b/ver-5.1.0/globals_func.html @@ -0,0 +1,376 @@ + + + + + + + +NCEPLIBS-ip: Globals + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - c -

    + + +

    - d -

    + + +

    - g -

    + + +

    - i -

    + + +

    - m -

    + + +

    - n -

    + + +

    - r -

    + + +

    - s -

    +
    +
    + + + + diff --git a/ver-5.1.0/hierarchy.html b/ver-5.1.0/hierarchy.html new file mode 100644 index 00000000..36d6a3fd --- /dev/null +++ b/ver-5.1.0/hierarchy.html @@ -0,0 +1,132 @@ + + + + + + + +NCEPLIBS-ip: Class Hierarchy + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Class Hierarchy
    +
    +
    +
    This inheritance list is sorted roughly, but not completely, alphabetically:
    +
    [detail level 12]
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     Cgdswzd_mod::gdswzd
     Cip_grid_mod::gdswzd_interface
     Cip_grid_descriptor_mod::init_descriptor
     Cip_grid_mod::init_grib1_interface
     Cip_grid_mod::init_grib2_interface
     Cip_grid_factory_mod::init_grid
     Cbicubic_interp_mod::interpolate_bicubic
     Cbilinear_interp_mod::interpolate_bilinear
     Cbudget_interp_mod::interpolate_budget
     Cneighbor_interp_mod::interpolate_neighbor
     Cneighbor_budget_interp_mod::interpolate_neighbor_budget
     Cspectral_interp_mod::interpolate_spectral
     Cip_grid_mod::ip_gridAbstract grid that holds fields and methods common to all grids
     Cip_equid_cylind_grid_mod::ip_equid_cylind_grid
     Cip_gaussian_grid_mod::ip_gaussian_grid
     Cip_lambert_conf_grid_mod::ip_lambert_conf_grid
     Cip_mercator_grid_mod::ip_mercator_grid
     Cip_polar_stereo_grid_mod::ip_polar_stereo_grid
     Cip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid
     Cip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid
     Cip_station_points_grid_mod::ip_station_points_grid
     Cip_grid_descriptor_mod::ip_grid_descriptorAbstract descriptor object which represents a grib1 or grib2 descriptor
     Cip_grid_descriptor_mod::grib1_descriptorDescriptor representing a grib1 grib descriptor section (GDS) with an integer array
     Cip_grid_descriptor_mod::grib2_descriptorGrib-2 descriptor containing a grib2 GDT represented by an integer array
     Cipolates_mod::ipolates
     Cipolatev_mod::ipolatev
     Cip_grid_descriptor_mod::operator(==)
     Cip_grid_mod::operator(==)Check equality
     Cspectral_interp_mod::polates4
     Cspectral_interp_mod::polatev4
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/hierarchy.js b/ver-5.1.0/hierarchy.js new file mode 100644 index 00000000..c1f43a9e --- /dev/null +++ b/ver-5.1.0/hierarchy.js @@ -0,0 +1,35 @@ +var hierarchy = +[ + [ "gdswzd_mod::gdswzd", "interfacegdswzd__mod_1_1gdswzd.html", null ], + [ "ip_grid_mod::gdswzd_interface", "interfaceip__grid__mod_1_1gdswzd__interface.html", null ], + [ "ip_grid_descriptor_mod::init_descriptor", "interfaceip__grid__descriptor__mod_1_1init__descriptor.html", null ], + [ "ip_grid_mod::init_grib1_interface", "interfaceip__grid__mod_1_1init__grib1__interface.html", null ], + [ "ip_grid_mod::init_grib2_interface", "interfaceip__grid__mod_1_1init__grib2__interface.html", null ], + [ "ip_grid_factory_mod::init_grid", "interfaceip__grid__factory__mod_1_1init__grid.html", null ], + [ "bicubic_interp_mod::interpolate_bicubic", "interfacebicubic__interp__mod_1_1interpolate__bicubic.html", null ], + [ "bilinear_interp_mod::interpolate_bilinear", "interfacebilinear__interp__mod_1_1interpolate__bilinear.html", null ], + [ "budget_interp_mod::interpolate_budget", "interfacebudget__interp__mod_1_1interpolate__budget.html", null ], + [ "neighbor_interp_mod::interpolate_neighbor", "interfaceneighbor__interp__mod_1_1interpolate__neighbor.html", null ], + [ "neighbor_budget_interp_mod::interpolate_neighbor_budget", "interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget.html", null ], + [ "spectral_interp_mod::interpolate_spectral", "interfacespectral__interp__mod_1_1interpolate__spectral.html", null ], + [ "ip_grid_mod::ip_grid", "structip__grid__mod_1_1ip__grid.html", [ + [ "ip_equid_cylind_grid_mod::ip_equid_cylind_grid", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html", null ], + [ "ip_gaussian_grid_mod::ip_gaussian_grid", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html", null ], + [ "ip_lambert_conf_grid_mod::ip_lambert_conf_grid", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html", null ], + [ "ip_mercator_grid_mod::ip_mercator_grid", "structip__mercator__grid__mod_1_1ip__mercator__grid.html", null ], + [ "ip_polar_stereo_grid_mod::ip_polar_stereo_grid", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html", null ], + [ "ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html", null ], + [ "ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html", null ], + [ "ip_station_points_grid_mod::ip_station_points_grid", "structip__station__points__grid__mod_1_1ip__station__points__grid.html", null ] + ] ], + [ "ip_grid_descriptor_mod::ip_grid_descriptor", "structip__grid__descriptor__mod_1_1ip__grid__descriptor.html", [ + [ "ip_grid_descriptor_mod::grib1_descriptor", "structip__grid__descriptor__mod_1_1grib1__descriptor.html", null ], + [ "ip_grid_descriptor_mod::grib2_descriptor", "structip__grid__descriptor__mod_1_1grib2__descriptor.html", null ] + ] ], + [ "ipolates_mod::ipolates", "interfaceipolates__mod_1_1ipolates.html", null ], + [ "ipolatev_mod::ipolatev", "interfaceipolatev__mod_1_1ipolatev.html", null ], + [ "ip_grid_descriptor_mod::operator(==)", "interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08.html", null ], + [ "ip_grid_mod::operator(==)", "interfaceip__grid__mod_1_1operator_07_0a_0a_08.html", null ], + [ "spectral_interp_mod::polates4", "interfacespectral__interp__mod_1_1polates4.html", null ], + [ "spectral_interp_mod::polatev4", "interfacespectral__interp__mod_1_1polatev4.html", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/index.html b/ver-5.1.0/index.html new file mode 100644 index 00000000..6b7d9944 --- /dev/null +++ b/ver-5.1.0/index.html @@ -0,0 +1,1076 @@ + + + + + + + +NCEPLIBS-ip: Introduction + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Introduction
    +
    +
    + +Previous versions:

    5.0.0, 4.4.0, 4.3.0, 4.2.0, 4.1.0, 4.0.0 + +

    The NCEP general interpolation library (NCEPLIBS-ip) contains Fortran 90 subprograms to be used for interpolating between nearly all grids used at NCEP. The library is particularly efficient when interpolating many fields at one time. It also contains functionality for interpolating, transforming, and otherwise manipulating spectral data (these functions were formerly contained in the NCEPLIBS-sp library).

    +

    NCEPLIBS-ip supports compilation with the GNU Compiler Collection (gfortran), Intel Classic (ifort), and Intel OneAPI (ifx) compilers. In the case of Intel OneAPI (IntelLLVM), it is recommended to use at least version 2023.2.1 to avoid any number of compiler issues.

    +
    Note
    Some routines may behave poorly or unpredictably when using 4-byte reals (libip_4). For instance, there is an ATAN2 function used for polar stereo grids where for certain regions of certain grids, floating point differences between 4-byte output values (~1e-7) can be amplified into sizable differences in output field values. Some applications may therefore benefit from the use of 8-byte reals (libip_d or libip_8).
    +

    NCEPLIBS-ip uses several BLAS/LAPACK routines in the splat() subroutine, and therefore requires an external BLAS/LAPACK provider. In practice, this should generally be OpenBLAS, which is the spack-stack BLAS/LAPACK provider.

    +

    +Interpolation

    +

    +Interpolation Methods

    +

    There are currently six interpolation methods available in the library:

      +
    • bilinear
    • +
    • bicubic
    • +
    • neighbor
    • +
    • budget
    • +
    • spectral
    • +
    • neighbor-budget
    • +
    +

    Some of the methods have interpolation sub-options. A few methods have restrictions on the type of input or output grids.

    +

    Several methods can perform interpolation on fields with bitmaps (i.e. some points on the input grid may be undefined). In this case, the bitmap is interpolated to the output grid. Only valid input points are used to interpolate to valid output points. An output bitmap will also be created to locate invalid data where the output grid extends outside the domain of the input grid.

    +

    The driver routines for interpolating scalars and vectors may be found in ipolates_mod. The interpolation method is chosen via the first argument of these routines (variable IP). Sub-options are set via the IPOPT array.

    +

    +Bilinear Interpolation Method

    +

    Bilinear interpolation is chosen by setting IP=0.

    +

    This method has two sub-options:

    +
      +
    1. The percent of valid input data required to make output data (the default is 50%).
    2. +
    3. If valid input data is not found near an a spiral search may be performed. The spiral search is only an option for scalar data.
    4. +
    +

    The bilinear method has no restrictions and can interpolate with bitmaps.

    +

    +Bicubic Interpolation Method

    +

    Bicubic interpolation is chosen by setting IP=1.

    +

    This method has two sub-options:

    +
      +
    1. A monotonic constraint option for straight bicubic or for constraining the output value to be within the range of the four surrounding input values.
    2. +
    3. The percent of valid input data required to make output data, which defaults to 50%.
    4. +
    +

    The bicubic method cannot interpolate data with bitmaps.

    +

    +Neighbor Interpolation Method

    +

    Neighbor interpolation is chosen by setting IP=2.

    +

    Neighbor interpolation means that the output value is set to the nearest input value. It would be appropriate for interpolating integer fields such as vegetation index.

    +

    This method has one sub-option: If valid input data is not found near an an output point, a spiral search is optionally performed.

    +

    The neighbor method has no restrictions and can interpolate with bitmaps.

    +

    +Budget Interpolation Method

    +

    Budget interpolation is chosen by setting IP=3.

    +

    Budget interpolation means a low-order interpolation method that quasi-conserves area averages. It would be appropriate for interpolating budget fields such as precipitation.

    +

    This method assumes that the field really represents box averages where each box extends halfway to its neighboring grid point in each direction. The method actually averages bilinearly interpolated values in a square array of points distributed within each output grid box.

    +

    There are several sub-options:

    +
      +
    1. The number of points in the radius of the square array may be set. The default is 2, meaning that 25 sample points will be averaged for each output value.
    2. +
    3. The respective averaging weights for the radius points are adjustable. The default is for all weights equal to 1, giving an unweighted average.
    4. +
    5. Optionally, one may assume the boxes stretch nearly all the way to each of the neighboring grid points and the weights are the adjoint of the bilinear interpolation weights.
    6. +
    7. The percent of valid input data required to make output data is adjustable. The default is 50%.
    8. +
    9. In cases where there is no or insufficient valid input data, a spiral search may be invoked to search for the nearest valid data. search square (scalar interpolation only).
    10. +
    +

    This method can interpolate data with bitmaps.

    +

    +Spectral Interpolation Method

    +

    The spectral interpolation scheme is chosen by setting IP=4.

    +

    This method has two sub-options:

    +
      +
    1. set the spectral shape (triangular or rhomboidal)
    2. +
    3. set the spectral truncation.
    4. +
    +

    The input grid must be a global cylindrical grid (either Gaussian or equidistant). This method cannot interpolate data with bitmaps.

    +

    Unless the output grid is a global cylindrical grid, a polar stereographic grid centered at the pole, or a Mercator grid, this method can be quite expensive.

    +

    +Neighbor-Budget Interpolation Method

    +

    Neighbor-budget interpolation is chosen by setting IP=6.

    +

    This method computes weighted averages of neighbor points arranged in a square box centered around each output grid point and stretching nearly halfway to each of the neighboring grid points. The main difference with the budget interpolation (IP=3) is neighbor vs bilinear interpolation of the square box of points.

    +

    There are the following sub-options:

    +
      +
    1. The number of points in the radius of the square array may be set. The default is 2, meaning that 25 sample points will be averaged for each output value.
    2. +
    3. The respective averaging weights for the radius points are adjustable. The default is for all weights equal to 1, giving an unweighted average.
    4. +
    5. The percent of valid input data required to make output data is adjustable. The default is 50%.
    6. +
    +

    +Vectors and Scalars

    +

    The library can handle two-dimensional vector fields as well as scalar fields. The input and output vectors are rotated if necessary so that they are either resolved relative to their defined grid in the direction of increasing x and y coordinates or resolved relative to eastward and northward directions on the earth. The rotation is determined by the grid definitions.

    +

    Vectors are generally interpolated (by all methods except spectral interpolation) by moving the relevant input vectors along a great circle to the output point, keeping their orientations with respect to the great circle constant, before independently interpolating the respective components. This ensures that vector interpolation will be consistent over the whole globe including the poles.

    +

    +Grids

    +

    The input and output grids are defined by their respective GRIB2 grid definition template and template number as decoced by the NCEP G2 library. There are six map projections recognized by the library:

    + + + + + + + + + + + + + + + +
    Grid Template Number Map projection
    00 Equidistant cyclindrical
    01 Rotated equidistant cylindrical
    10 Mercator cyclindrical
    20 Polar stereographic azimuthal
    30 Lambert conformal conical
    40 Gaussian equidistant cyclindrical
    +

    If the output grid definition template number is negative, then the output data may be just a set of station points. In this case, the user must pass the number of points to be output along with their latitudes and longitudes.

    +

    For vector interpolation, the vector rotations parameters must also be passed. On the other hand, for non-negative output data representation types, the number of output grid points and their latitudes and longitudes (and the vector rotation parameters for vector interpolation) are all returned by the interpolation subprograms.

    +

    If an output equidistant cylindrical grid contains multiple pole points, then the pole points are forced to be self-consistent. That is, scalar fields are obliged to be constant at the pole and vector components are obliged to exhibit a wavenumber one variation at the pole.

    +

    Generally, only regular grids can be interpolated in this library. However, the thinned WAFS grids may be expanded to a regular grid (or vice versa) using subprograms ipxwafs(), ipxwafs2(), or ipxwafs3(). Eta data (with Arakawa "E" staggering) on the "H" or "V" grid may be expanded to a filled regular grid (or vice versa) using subprogram ipxetas().

    +

    +Return Codes

    +

    The return code issued by an interpolation subprogram determines whether it ran successfully or how it failed. Check nonzero return codes against the docblock of the respective subprogram.

    +

    +Entry point list: interpolation

    +

    Scalar and vecotr field interpolation subprograms can be found in the relevant module documentation:

    + + + + + + + + + + + + + + + + + + + + + + + +
    Name Function
    ipolates_mod Iredell's polate
    bilinear_interp_mod bilinear interpolation
    bicubic_interp_mod bicubic interpolation
    neighbor_interp_mod neighbor interpolation
    budget_interp_mod budget interpolation
    spectral_interp_mod spectral interpolation
    neighbor_budget_interp_mod neighbor-budget interpolation
    polfixs() make multiple pole scalar values consistent
    movect() move a vector along a great circle
    polfixv() make multiple pole vector values consistent
    +

    Grid description section decoders:

    + + + + + + + + + + + + + + + + + + + + + + + +
    Name Function
    gdswzd() grid description section (GDS) wizard
    gdswzd_c() C wrapper for calling gdswzd
    gdswzd_equid_cylind() GDS wizard for equidistant cyclindrical
    gdswzd_mercator() GDS wizard for mercator cyclindrical
    gdswzd_lambert_conf() GDS wizard for lambert conformal conical
    gdswzd_gaussian() GDS wizard for gaussian cyclindrical
    gdswzd_polar_stereo() GDS wizard for polar stereographic
    gdswzd_rot_equid_cylind_egrid() GDS wizard for rotated equidistant cyclindrical "e" stagger.
    gdswzd_rot_equid_cylind() GDS wizard for rotated equidistant cyclindrical non "e" stagger.
    field_pos() return field position for a given grid point
    +

    Transform subprograms for special irregular grids:

    + + + + + + + + + +
    Name Function
    ipxwafs() expand or contract wafs grids
    ipxwafs2() expand or contract wafs grids
    ipxwafs3() expand or contract wafs grids
    +

    +Spectral Transformation & Processing

    +

    The library's spectral processing subroutines can handle both scalar and two-dimensional vector fields. Each vector field will be represented in spectral space appropriately by its respective spherical divergence and curl (vorticity), thus avoiding the pole problems associated with representing components separately.

    +

    Some of the functions performed by the library are spectral interpolations between two grids, spectral truncations in place on a grid, and basic spectral transforms between grid and wave space. Only global Gaussian or global equidistant cylindrical grids are allowed for transforming into wave space. There are no such restricitions on grids for transforming from wave space. However, there are special fast entry points for transforming wave space to polar stereographic and Mercator grids as well as the aforementioned cylindrical grids.

    +

    The indexing of the cylindrical transform grids is totally general. The grids may run north to south or south to north; they may run east to west or west to east; they may start at any longitude as long as the prime meridian is on the grid; they may be dimensioned in any order (e.g. (i,j,k), (k,j,i), (i,k,nfield,j), etc.). Furthermore, the transform may be performed on only some of the latitudes at one time as long as both hemisphere counterparts are transformed at the same time (as in the global spectral model). The grid indexing will default to the customary global indexing, i.e. north to south, east to west, prime meridian as first longitude, and (i,j,k) order.

    +

    The wave space may be either triangular or rhomboidal in shape. Its internal indexing is strictly "IBM order", i.e. zonal wavenumber is the slower index with the real and imaginary components always paired together. The imaginary components of all the zonally symmetric modes should always be zero, as should the global mean of any divergence and vorticity fields. The stride between the start of successive wave fields is general, defaulting to the computed length of each field.

    +

    +Entry Point List: Spectral Interpolation & Transformation

    +

    Spectral interpolations or truncations between grid and grid

    + + + + + + + + + + + + + + + + + + + +
    Name Function
    sptrun() Spectrally truncate gridded scalar fields
    sptrunv() Spectrally truncate gridded vector fields
    sptrung() Spectrally interpolate scalars to stations
    sptrungv() Spectrally interpolate vectors to stations
    sptruns() Spectrally interpolate scalars to polar stereo
    sptrunsv() Spectrally interpolate vectors to polar stereo
    sptrunm() Spectrally interpolate scalars to Mercator
    sptrunmv() Spectrally interpolate vectors to Mercator
    +

    Spectral transforms between wave and grid

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Name Function
    sptran() Perform a scalar spherical transform
    sptranv() Perform a vector spherical transform
    sptrand() Perform a gradient spherical transform
    sptgpt() Transform spectral scalar to station points
    sptgptv() Transform spectral vector to station points
    sptgptd() Transform spectral to station point gradients
    sptgps() Transform spectral scalar to polar stereo
    sptgpsv() Transform spectral vector to polar stereo
    sptgpsd() Transform spectral to polar stereo gradients
    sptgpm() Transform spectral scalar to Mercator
    sptgpmv() Transform spectral vector to Mercator
    sptgpmd() Transform spectral to Mercator gradients
    +

    Spectral transform utilities

    + + + + + + + + + + + + + + + + + + + + + + + +
    Name Function
    spwget() Get wave-space constants
    splat() Compute latitude functions
    speps() Compute utility spectral fields
    splegend() Compute Legendre polynomials
    spanaly() Analyze spectral from Fourier
    spsynth() Synthesize Fourier from spectral
    spdz2uv() Compute winds from divergence and vorticity
    spuv2dz() Compute divergence and vorticity from winds
    spgradq() Compute gradient in spectral space
    splaplac() Compute Laplacian in spectral space
    +

    +Examples: Interpolation Routines

    +

    Example 1. Read a grib 2 file of scalar data on a global regular 1-deg lat/lon grid and call ipolates to interpolate it to NCEP standard grid 218, a lambert conformal grid. Uses the NCEP G2 library to degrib the data.

    +
    program example_1
    +
    +
    use ip_mod
    +
    use grib_mod ! ncep grib 2 library
    +
    +
    implicit none
    +
    +
    character(len=100) :: input_file
    +
    +
    integer :: iunit, iret, lugi
    +
    integer :: mi, mo, no
    +
    integer, allocatable :: ibi(:), ibo(:)
    +
    integer :: ip, ipopt(20)
    +
    integer :: j, jdisc, jpdtn, jgdtn, k, km
    +
    integer :: jids(200), jgdt(200), jpdt(200)
    +
    integer :: idim_input, jdim_input
    +
    integer :: idim_output, jdim_output
    +
    +
    logical :: unpack
    +
    logical*1, allocatable :: input_bitmap(:,:), output_bitmap(:,:)
    +
    +
    real, allocatable :: input_data(:,:)
    +
    real, allocatable :: output_rlat(:), output_rlon(:)
    +
    real, allocatable :: output_data(:,:)
    +
    +
    type(gribfield) :: gfld_input
    +
    +
    !---------------------------------------------------------------------------
    +
    ! the output grid specs. this is ncep grid 218, a lambert conformal
    +
    ! grid. the grid definition information is stored in section 3
    +
    ! of a grib 2 message.
    +
    !---------------------------------------------------------------------------
    +
    +
    integer, parameter :: igdtnum218 = 30 ! grid definition template number.
    +
    ! "30" is lambert conformal.
    +
    integer, parameter :: igdtlen218 = 22 ! number of array elements needed
    +
    ! for a lambert conf. grid definition
    +
    ! template.
    +
    integer :: igdtmpl218(igdtlen218) ! the grid definition template.
    +
    ! the entries are:
    +
    ! 1 -shape of earth, oct 15
    +
    ! 2 -scale factor, spherical earth, oct 16
    +
    ! 3 -scaled value, spherical earth, octs 17-20
    +
    ! 4 -scale factor, major axis of
    +
    ! elliptical earth, oct 21
    +
    ! 5 -scaled value of major axis of
    +
    ! elliptical earth, octs 22-25
    +
    ! 6 -scale factor, minor axis of
    +
    ! elliptical earth, oct 26
    +
    ! 7 -scaled value of minor axis of
    +
    ! elliptical earth, octs 27-30
    +
    ! 8 -number points along x-axis, octs 31-34
    +
    ! 9 -number points along y-axis, octs 35-38
    +
    ! 10-latitude of first point, octs 39-42
    +
    ! 11-longitude of first point, octs 43-46
    +
    ! 12-resolution and component flags, oct 47
    +
    ! 13-latitude where grid lengths specified,
    +
    ! octs 48-51
    +
    ! 14-longitude parallel to y-axis, octs 52-55
    +
    ! 15-x-direction grid length, octs 56-59
    +
    ! 16-y-direction grid length, octs 60-63
    +
    ! 17-projection center flag, oct 64
    +
    ! 18-scanning mode, oct 65
    +
    ! 19-first tangent latitude from pole, octs 66-69
    +
    ! 20-second tangent latitude from pole, octs 70-73
    +
    ! 21-latitude of south pole, octs 74-77
    +
    ! 22-longitude of south pole, octs 78-81
    +
    +
    integer, parameter :: missing=b'11111111111111111111111111111111'
    +
    data igdtmpl218 / 6, 255, missing, 255, missing, 255, missing, 614, 428, &
    +
    12190000, 226541000, 56, 25000000, 265000000, &
    +
    12191000, 12191000, 0, 64, 25000000, 25000000, -90000000, 0/
    +
    +
    !---------------------------------------------------------------------------
    +
    ! open the grib 2 file containing data to be interpolated. for this
    +
    ! example, there are two data records.
    +
    !---------------------------------------------------------------------------
    +
    +
    iunit=9
    +
    input_file="${path}/input.data.grib2"
    +
    call baopenr (iunit, input_file, iret)
    +
    +
    !---------------------------------------------------------------------------
    +
    ! prep for call to g2 library to degrib data. the data are on a regular
    +
    ! lat/lon grid with i/j dimension of 360/181.
    +
    !---------------------------------------------------------------------------
    +
    +
    idim_input = 360 ! the i/j dimensions of input grid
    +
    jdim_input = 181
    +
    mi = idim_input * jdim_input ! total number of pts, input grid
    +
    +
    jdisc = -1 ! search for any discipline
    +
    jpdtn = -1 ! search for any product definition template number
    +
    jgdtn = 0 ! search for grid definition template number 0 - regular lat/lon grid
    +
    jids = -9999 ! array of values in identification section, set to wildcard
    +
    jgdt = -9999 ! array of values in grid definition template 3.m
    +
    jgdt(8) = idim_input ! search for grid with i/j of 360/181
    +
    jgdt(9) = jdim_input
    +
    jpdt = -9999 ! array of values in product definition template 4.n
    +
    unpack = .true. ! unpack data
    +
    lugi = 0 ! no index file
    +
    +
    nullify(gfld_input%idsect)
    +
    nullify(gfld_input%local)
    +
    nullify(gfld_input%list_opt)
    +
    nullify(gfld_input%igdtmpl) ! holds the grid definition template information
    +
    nullify(gfld_input%ipdtmpl)
    +
    nullify(gfld_input%coord_list)
    +
    nullify(gfld_input%idrtmpl)
    +
    nullify(gfld_input%bmap) ! holds the bitmap
    +
    nullify(gfld_input%fld) ! holds the data
    +
    +
    !---------------------------------------------------------------------------
    +
    ! degrib the data. non-zero "iret" indicates a problem during degrib.
    +
    !---------------------------------------------------------------------------
    +
    +
    km = 2 ! number of records to interpolate
    +
    +
    allocate(ibi(km))
    +
    allocate(input_bitmap(mi,km))
    +
    allocate(input_data(mi,km))
    +
    +
    do j = 0, (km-1) ! number of records to skip
    +
    +
    call getgb2(iunit, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
    +
    unpack, k, gfld_input, iret)
    +
    +
    if (iret /= 0) stop
    +
    +
    !---------------------------------------------------------------------------
    +
    ! does input data have a bitmap?
    +
    !---------------------------------------------------------------------------
    +
    +
    if (gfld_input%ibmap==0) then ! input data has bitmap
    +
    ibi(k) = 1 ! tell ipolates to use bitmap
    +
    input_bitmap(:,k) = gfld_input%bmap
    +
    else ! no bitmap, data everywhere
    +
    ibi(k) = 0 ! tell ipolates there is no bitmap
    +
    input_bitmap(:,k) = .true.
    +
    endif
    +
    +
    input_data(:,k) = gfld_input%fld ! the input data field
    +
    +
    enddo
    +
    +
    call baclose (iunit, iret)
    +
    +
    !---------------------------------------------------------------------------
    +
    ! setup arguments for ipolates (scalar interpolation) call.
    +
    !---------------------------------------------------------------------------
    +
    +
    ip = 0 ! bilinear interpolation
    +
    ipopt = 0 ! options for bilinear:
    +
    ipopt(1) = 75 ! set minimum mask to 75%
    +
    +
    !---------------------------------------------------------------------------
    +
    ! the i/j dimensions of the output grid.
    +
    !---------------------------------------------------------------------------
    +
    +
    idim_output = igdtmpl218(8)
    +
    jdim_output = igdtmpl218(9)
    +
    mo = idim_output * jdim_output ! total number of output pts
    +
    +
    !---------------------------------------------------------------------------
    +
    ! will hold the latitude, longitude, data and bitmap on the output grid,
    +
    ! which are computed in ipolates.
    +
    !---------------------------------------------------------------------------
    +
    +
    allocate (ibo(km)) ! bitmap flags on output grid
    +
    allocate (output_rlat(mo))
    +
    allocate (output_rlon(mo))
    +
    allocate (output_data(mo,km))
    +
    allocate (output_bitmap(mo,km))
    +
    +
    !---------------------------------------------------------------------------
    +
    ! call ipolates to interpolate scalar data. non-zero "iret" indicates
    +
    ! a problem.
    +
    !---------------------------------------------------------------------------
    +
    +
    call ipolates(ip, ipopt, gfld_input%igdtnum, gfld_input%igdtmpl, &
    +
    gfld_input%igdtlen, igdtnum218, igdtmpl218, igdtlen218, &
    +
    mi, mo, km, ibi, input_bitmap, input_data, no, output_rlat, &
    +
    output_rlon, ibo, output_bitmap, output_data, iret)
    +
    +
    if (iret /= 0) stop
    +
    +
    !---------------------------------------------------------------------------
    +
    ! write interpolated data to file. if ipolates computed a bitmap (ibo==1)
    +
    ! for the output grid, one may mask out this data with a flag value.
    +
    !---------------------------------------------------------------------------
    +
    +
    open (10, file="./output.bin", access='direct', recl=idim_output*jdim_output*4)
    +
    +
    do k = 1, km
    +
    if(ibo(k)==1) where (.not. output_bitmap(:,k)) output_data(:,k) = -999.
    +
    write(10, rec=k) output_data(:,k)
    +
    enddo
    +
    write(10, rec=km+1) output_rlat
    +
    write(10, rec=km+2) output_rlon
    +
    +
    close(10)
    +
    +
    end program example_1
    +
    Top-level module for the ip library which re-exports public routines such as ipolates,...
    Definition: ip_mod.F90:6
    +

    Example 2. Read a grib 2 file of u/v wind data on a global regular 1-deg lat/lon grid and call ipolatev to interpolate it to four random station points. Uses the NCEP G2 library to degrib the data.

    +
    program example_2
    +
    +
    use grib_mod ! ncep grib 2 library
    +
    +
    implicit none
    +
    +
    character(len=100) :: input_file
    +
    +
    integer :: iunit, iret, lugi
    +
    integer :: mi, mo, no
    +
    integer :: ibi, ibo
    +
    integer :: ip, ipopt(20)
    +
    integer :: j, jdisc, jpdtn, jgdtn, k, km
    +
    integer :: jids(200), jgdt(200), jpdt(200)
    +
    integer :: idim_input, jdim_input
    +
    +
    logical :: unpack
    +
    logical*1, allocatable :: input_bitmap(:), output_bitmap(:)
    +
    +
    real, allocatable :: input_u_data(:), input_v_data(:)
    +
    real, allocatable :: output_rlat(:), output_rlon(:)
    +
    real, allocatable :: output_crot(:), output_srot(:)
    +
    real, allocatable :: output_u_data(:), output_v_data(:)
    +
    +
    type(gribfield) :: gfld_input
    +
    +
    !---------------------------------------------------------------------------
    +
    ! the output "grid" is a series of random station points. in this case,
    +
    ! set the grid definition template number of a negative number.
    +
    ! the grid definition template array information is not used, so set
    +
    ! to a flag value.
    +
    !---------------------------------------------------------------------------
    +
    +
    integer, parameter :: igdtnumo = -1
    +
    integer, parameter :: igdtleno = 1
    +
    integer :: igdtmplo(igdtleno)
    +
    +
    data igdtmplo / -9999 /
    +
    +
    !---------------------------------------------------------------------------
    +
    ! open the grib 2 file containing data to be interpolated. for this
    +
    ! example, there is one record of u-wind and v-wind.
    +
    !---------------------------------------------------------------------------
    +
    +
    iunit=9
    +
    input_file="./reg_tests/copygb2/data/uv_wind.grb2"
    +
    call baopenr (iunit, input_file, iret)
    +
    +
    !---------------------------------------------------------------------------
    +
    ! prep for call to g2 library to degrib data. the data are on a regular
    +
    ! lat/lon grid with i/j dimension of 360/181.
    +
    !---------------------------------------------------------------------------
    +
    +
    idim_input = 360 ! the i/j dimensions of input grid
    +
    jdim_input = 181
    +
    mi = idim_input * jdim_input ! total number of pts, input grid
    +
    +
    jdisc = -1 ! search for any discipline
    +
    jpdtn = -1 ! search for any product definition template number
    +
    jgdtn = 0 ! search for grid definition template number 0 - regular lat/lon grid
    +
    jids = -9999 ! array of values in identification section, set to wildcard
    +
    jgdt = -9999 ! array of values in grid definition template 3.m
    +
    jgdt(8) = idim_input ! search for grid with i/j of 360/181
    +
    jgdt(9) = jdim_input
    +
    jpdt = -9999 ! array of values in product definition template 4.n
    +
    unpack = .true. ! unpack data
    +
    lugi = 0 ! no index file
    +
    +
    nullify(gfld_input%idsect)
    +
    nullify(gfld_input%local)
    +
    nullify(gfld_input%list_opt)
    +
    nullify(gfld_input%igdtmpl) ! holds the grid definition template information
    +
    nullify(gfld_input%ipdtmpl)
    +
    nullify(gfld_input%coord_list)
    +
    nullify(gfld_input%idrtmpl)
    +
    nullify(gfld_input%bmap) ! holds the bitmap
    +
    nullify(gfld_input%fld) ! holds the data
    +
    +
    !---------------------------------------------------------------------------
    +
    ! degrib the data. non-zero "iret" indicates a problem during degrib.
    +
    !---------------------------------------------------------------------------
    +
    +
    allocate(input_bitmap(mi))
    +
    allocate(input_u_data(mi))
    +
    allocate(input_v_data(mi))
    +
    +
    !---------------------------------------------------------------------------
    +
    ! read u-wind record.
    +
    !---------------------------------------------------------------------------
    +
    +
    j = 0
    +
    call getgb2(iunit, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
    +
    unpack, k, gfld_input, iret)
    +
    +
    if (iret /= 0) stop
    +
    +
    !---------------------------------------------------------------------------
    +
    ! does input data have a bitmap?
    +
    !---------------------------------------------------------------------------
    +
    +
    if (gfld_input%ibmap==0) then ! input data has bitmap
    +
    ibi = 1 ! tell ipolates to use bitmap
    +
    input_bitmap = gfld_input%bmap
    +
    else ! no bitmap, data everywhere
    +
    ibi = 0 ! tell ipolates there is no bitmap
    +
    input_bitmap = .true.
    +
    endif
    +
    +
    input_u_data = gfld_input%fld ! the input u-wind data
    +
    +
    !---------------------------------------------------------------------------
    +
    ! read v-wind record.
    +
    !---------------------------------------------------------------------------
    +
    +
    j = 1
    +
    call getgb2(iunit, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
    +
    unpack, k, gfld_input, iret)
    +
    +
    if (iret /= 0) stop
    +
    +
    input_v_data = gfld_input%fld ! the input v-wind data
    +
    +
    call baclose (iunit, iret)
    +
    +
    !---------------------------------------------------------------------------
    +
    ! setup arguments for ipolatev (vector interpolation) call.
    +
    !---------------------------------------------------------------------------
    +
    +
    km = 1 ! number of records to interpolate
    +
    ip = 0 ! bilinear interpolation
    +
    ipopt = 0 ! options for bilinear:
    +
    ipopt(1) = 75 ! set minimum mask to 75%
    +
    +
    !---------------------------------------------------------------------------
    +
    ! interpolate to four random station points.
    +
    !---------------------------------------------------------------------------
    +
    +
    mo = 4
    +
    no = mo
    +
    +
    !---------------------------------------------------------------------------
    +
    ! when interpolating to random station points, need to pass to ipolatev
    +
    ! their latitude, longitude and the sines and cosines of the vector
    +
    ! rotation angles. the vector rotation is defined:
    +
    !
    +
    ! ugrid=crot*uearth-sort*vearth
    +
    ! vgrid=srot*uearth+cort*vearth
    +
    !---------------------------------------------------------------------------
    +
    +
    allocate (output_rlat(mo))
    +
    allocate (output_rlon(mo))
    +
    allocate (output_srot(mo))
    +
    allocate (output_crot(mo))
    +
    allocate (output_u_data(mo))
    +
    allocate (output_v_data(mo))
    +
    allocate (output_bitmap(mo))
    +
    +
    output_rlat(1) = 45.0
    +
    output_rlon(1) = -100.0
    +
    output_rlat(2) = 35.0
    +
    output_rlon(2) = -100.0
    +
    output_rlat(3) = 40.0
    +
    output_rlon(3) = -90.0
    +
    output_rlat(4) = 35.0
    +
    output_rlon(4) = -120.0
    +
    +
    output_srot = 0.0 ! no turning of wind
    +
    output_crot = 1.0
    +
    +
    !---------------------------------------------------------------------------
    +
    ! call ipolatev to interpolate vector data. non-zero "iret" indicates
    +
    ! a problem.
    +
    !---------------------------------------------------------------------------
    +
    +
    call ipolatev(ip, ipopt, gfld_input%igdtnum, gfld_input%igdtmpl, &
    +
    gfld_input%igdtlen, igdtnumo, igdtmplo, igdtleno, &
    +
    mi, mo, km, ibi, input_bitmap, input_u_data, input_v_data, &
    +
    no, output_rlat, output_rlon, output_crot, output_srot, &
    +
    ibo, output_bitmap, output_u_data, output_v_data, iret)
    +
    +
    if (iret /= 0) stop
    +
    +
    do k = 1, mo
    +
    print*,'station point ',k,' latitude ',output_rlat(k),' longitude ', &
    +
    output_rlon(k), ' u-wind ', output_u_data(k), ' v-wind ', output_v_data(k)
    +
    enddo
    +
    +
    end program example_2
    +

    +Examples: Spectral Processing & Transformation

    +

    Example 1. Interpolate heights and winds from a latlon grid to two antipodal polar stereographic grids. Subprograms GETGB and PUTGB from w3lib are referenced.

    +
    c unit number 11 is the input latlon grib file
    +
    c unit number 31 is the input latlon grib index file
    +
    c unit number 51 is the output northern polar stereographic grib file
    +
    c unit number 52 is the output southern polar stereographic grib file
    +
    c nominal spectral truncation is r40
    +
    c maximum input gridsize is 360x181
    +
    c maximum number of levels wanted is 12
    +
    parameter(lug=11,lui=31,lun=51,lus=52)
    +
    parameter(iromb=1,maxwv=40,jf=360*181,kx=12)
    +
    integer kp5(kx),kp6(kx),kp7(kx)
    +
    integer kpo(kx)
    +
    data kpo/1000,850,700,500,400,300,250,200,150,100,70,50/
    +
    c height
    +
    km=12
    +
    kp5=7
    +
    kp6=100
    +
    kp7=kpo
    +
    call gs65(lug,lui,lun,lus,jf,km,kp5,kp6,kp7,iromb,maxwv)
    +
    c winds
    +
    km=12
    +
    kp5=33
    +
    kp6=100
    +
    kp7=kpo
    +
    call gv65(lug,lui,lun,lus,jf,km,kp5,kp6,kp7,iromb,maxwv)
    +
    c
    +
    stop
    +
    end
    +
    c
    +
    subroutine gs65(lug,lui,lun,lus,jf,km,kp5,kp6,kp7,iromb,maxwv)
    +
    c interpolates a scalar field using spectral transforms.
    +
    integer kp5(km),kp6(km),kp7(km)
    +
    c output grids are 65x65 (381 km true at latitide 60).
    +
    c nh grid oriented at 280E; sh grid oriented at 100E.
    +
    parameter(nph=32,nps=2*nph+1,npq=nps*nps)
    +
    parameter(true=60.,xmesh=381.e3,orient=280.)
    +
    parameter(rerth=6.3712e6)
    +
    parameter(pi=3.14159265358979,dpr=180./pi)
    +
    real gn(npq,km),gs(npq,km)
    +
    integer jpds(25),jgds(22),kpds(25,km),kgds(22,km)
    +
    logical lb(jf)
    +
    real f(jf,km)
    +
    c
    +
    g2=((1.+sin(abs(true)/dpr))*rerth/xmesh)**2
    +
    r2=2*nph**2
    +
    rlatn1=dpr*asin((g2-r2)/(g2+r2))
    +
    rlonn1=mod(orient+315,360.)
    +
    rlats1=-rlatn1
    +
    rlons1=mod(rlonn1+270,360.)
    +
    jpds=-1
    +
    do k=1,km
    +
    jpds(5)=kp5(k)
    +
    jpds(6)=kp6(k)
    +
    jpds(7)=kp7(k)
    +
    j=0
    +
    call getgb(lug,lui,jf,j,jpds,jgds,kf,j,kpds(1,k),kgds(1,k),
    +
    & lb,f(1,k),iret)
    +
    if(iret.ne.0) call exit(1)
    +
    if(mod(kpds(4,k)/64,2).eq.1) call exit(2)
    +
    enddo
    +
    idrt=kgds(1,1)
    +
    imax=kgds(2,1)
    +
    jmax=kgds(3,1)
    +
    c
    +
    call sptruns(iromb,maxwv,idrt,imax,jmax,km,nps,
    +
    & 0,0,0,jf,0,0,0,0,true,xmesh,orient,f,gn,gs)
    +
    c
    +
    do k=1,km
    +
    kpds(3,k)=27
    +
    kgds(1,k)=5
    +
    kgds(2,k)=nps
    +
    kgds(3,k)=nps
    +
    kgds(4,k)=nint(rlatn1*1.e3)
    +
    kgds(5,k)=nint(rlonn1*1.e3)
    +
    kgds(6,k)=8
    +
    kgds(7,k)=nint(orient*1.e3)
    +
    kgds(8,k)=nint(xmesh)
    +
    kgds(9,k)=nint(xmesh)
    +
    kgds(10,k)=0
    +
    kgds(11,k)=64
    +
    call putgb(lun,npq,kpds(1,k),kgds(1,k),lb,gn(1,k),iret)
    +
    enddo
    +
    do k=1,km
    +
    kpds(3,k)=28
    +
    kgds(1,k)=5
    +
    kgds(2,k)=nps
    +
    kgds(3,k)=nps
    +
    kgds(4,k)=nint(rlats1*1.e3)
    +
    kgds(5,k)=nint(rlons1*1.e3)
    +
    kgds(6,k)=8
    +
    kgds(7,k)=nint(mod(orient+180,360.)*1.e3)
    +
    kgds(8,k)=nint(xmesh)
    +
    kgds(9,k)=nint(xmesh)
    +
    kgds(10,k)=128
    +
    kgds(11,k)=64
    +
    call putgb(lus,npq,kpds(1,k),kgds(1,k),lb,gs(1,k),iret)
    +
    enddo
    +
    c
    +
    end
    +
    c
    +
    subroutine gv65(lug,lui,lun,lus,jf,km,kp5,kp6,kp7,iromb,maxwv)
    +
    c interpolates a vector field using spectral transforms.
    +
    integer kp5(km),kp6(km),kp7(km)
    +
    c output grids are 65x65 (381 km true at latitide 60).
    +
    c nh grid oriented at 280E; sh grid oriented at 100E.
    +
    c winds are rotated to be relative to grid coordinates.
    +
    parameter(nph=32,nps=2*nph+1,npq=nps*nps)
    +
    parameter(true=60.,xmesh=381.e3,orient=280.)
    +
    parameter(rerth=6.3712e6)
    +
    parameter(pi=3.14159265358979,dpr=180./pi)
    +
    real un(npq,km),vn(npq,km),us(npq,km),vs(npq,km)
    +
    integer jpds(25),jgds(22),kpds(25,km),kgds(22,km)
    +
    logical lb(jf)
    +
    real u(jf,km),v(jf,km)
    +
    c
    +
    g2=((1.+sin(abs(true)/dpr))*rerth/xmesh)**2
    +
    r2=2*nph**2
    +
    rlatn1=dpr*asin((g2-r2)/(g2+r2))
    +
    rlonn1=mod(orient+315,360.)
    +
    rlats1=-rlatn1
    +
    rlons1=mod(rlonn1+270,360.)
    +
    jpds=-1
    +
    do k=1,km
    +
    jpds(5)=kp5(k)
    +
    jpds(6)=kp6(k)
    +
    jpds(7)=kp7(k)
    +
    j=0
    +
    call getgb(lug,lui,jf,j,jpds,jgds,kf,j,kpds(1,k),kgds(1,k),
    +
    & lb,u(1,k),iret)
    +
    if(iret.ne.0) call exit(1)
    +
    if(mod(kpds(4,k)/64,2).eq.1) call exit(2)
    +
    jpds=kpds(:,k)
    +
    jgds=kgds(:,k)
    +
    jpds(5)=jpds(5)+1
    +
    j=0
    +
    call getgb(lug,lui,jf,j,jpds,jgds,kf,j,kpds(1,k),kgds(1,k),
    +
    & lb,v(1,k),iret)
    +
    if(iret.ne.0) call exit(1)
    +
    if(mod(kpds(4,k)/64,2).eq.1) call exit(2)
    +
    enddo
    +
    idrt=kgds(1,1)
    +
    imax=kgds(2,1)
    +
    jmax=kgds(3,1)
    +
    c
    +
    call sptrunsv(iromb,maxwv,idrt,imax,jmax,km,nps,
    +
    & 0,0,0,jf,0,0,0,0,true,xmesh,orient,u,v,
    +
    & .true.,un,vn,us,vs,.false.,dum,dum,dum,dum,
    +
    & .false.,dum,dum,dum,dum)
    +
    c
    +
    do k=1,km
    +
    kpds(3,k)=27
    +
    kgds(1,k)=5
    +
    kgds(2,k)=nps
    +
    kgds(3,k)=nps
    +
    kgds(4,k)=nint(rlatn1*1.e3)
    +
    kgds(5,k)=nint(rlonn1*1.e3)
    +
    kgds(6,k)=8
    +
    kgds(7,k)=nint(orient*1.e3)
    +
    kgds(8,k)=nint(xmesh)
    +
    kgds(9,k)=nint(xmesh)
    +
    kgds(10,k)=0
    +
    kgds(11,k)=64
    +
    kpds(5,k)=kp5(k)
    +
    call putgb(lun,npq,kpds(1,k),kgds(1,k),lb,un(1,k),iret)
    +
    enddo
    +
    do k=1,km
    +
    kpds(3,k)=27
    +
    kgds(1,k)=5
    +
    kgds(2,k)=nps
    +
    kgds(3,k)=nps
    +
    kgds(4,k)=nint(rlatn1*1.e3)
    +
    kgds(5,k)=nint(rlonn1*1.e3)
    +
    kgds(6,k)=8
    +
    kgds(7,k)=nint(orient*1.e3)
    +
    kgds(8,k)=nint(xmesh)
    +
    kgds(9,k)=nint(xmesh)
    +
    kgds(10,k)=0
    +
    kgds(11,k)=64
    +
    kpds(5,k)=kp5(k)+1
    +
    call putgb(lun,npq,kpds(1,k),kgds(1,k),lb,vn(1,k),iret)
    +
    enddo
    +
    do k=1,km
    +
    kpds(3,k)=28
    +
    kgds(1,k)=5
    +
    kgds(2,k)=nps
    +
    kgds(3,k)=nps
    +
    kgds(4,k)=nint(rlats1*1.e3)
    +
    kgds(5,k)=nint(rlons1*1.e3)
    +
    kgds(6,k)=8
    +
    kgds(7,k)=nint(mod(orient+180,360.)*1.e3)
    +
    kgds(8,k)=nint(xmesh)
    +
    kgds(9,k)=nint(xmesh)
    +
    kgds(10,k)=128
    +
    kgds(11,k)=64
    +
    kpds(5,k)=kp5(k)
    +
    call putgb(lus,npq,kpds(1,k),kgds(1,k),lb,us(1,k),iret)
    +
    enddo
    +
    do k=1,km
    +
    kpds(3,k)=28
    +
    kgds(1,k)=5
    +
    kgds(2,k)=nps
    +
    kgds(3,k)=nps
    +
    kgds(4,k)=nint(rlats1*1.e3)
    +
    kgds(5,k)=nint(rlons1*1.e3)
    +
    kgds(6,k)=8
    +
    kgds(7,k)=nint(mod(orient+180,360.)*1.e3)
    +
    kgds(8,k)=nint(xmesh)
    +
    kgds(9,k)=nint(xmesh)
    +
    kgds(10,k)=128
    +
    kgds(11,k)=64
    +
    kpds(5,k)=kp5(k)+1
    +
    call putgb(lus,npq,kpds(1,k),kgds(1,k),lb,vs(1,k),iret)
    +
    enddo
    +
    c
    +
    end
    +
    subroutine sptruns(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NPS, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, TRUE, XMESH, ORIENT, GRIDI, GN, GS)
    This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields...
    Definition: sptruns.f:75
    +
    subroutine sptrunsv(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NPS, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, TRUE, XMESH, ORIENT, GRIDUI, GRIDVI, LUV, UN, VN, US, VS, LDZ, DN, ZN, DS, ZS, LPS, PN, SN, PS, SS)
    This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields...
    Definition: sptrunsv.f:94
    +

    Example 2. Spectrally truncate winds in place on a latlon grid.

    +
    c unit number 11 is the input latlon grib file
    +
    c unit number 31 is the input latlon grib index file
    +
    c unit number 51 is the output latlon grib file
    +
    c nominal spectral truncation is r40
    +
    c maximum input gridsize is 360x181
    +
    c maximum number of levels wanted is 12
    +
    parameter(lug=11,lui=31,luo=51)
    +
    parameter(iromb=1,maxwv=40,jf=360*181,kx=12)
    +
    integer kp5(kx),kp6(kx),kp7(kx)
    +
    integer kpo(kx)
    +
    data kpo/1000,850,700,500,400,300,250,200,150,100,70,50/
    +
    c winds
    +
    km=12
    +
    kp5=33
    +
    kp6=100
    +
    kp7=kpo
    +
    call gvr40(lug,lui,luo,jf,km,kp5,kp6,kp7,iromb,maxwv)
    +
    c
    +
    stop
    +
    end
    +
    c
    +
    subroutine gvr40(lug,lui,luo,jf,km,kp5,kp6,kp7,iromb,maxwv)
    +
    c interpolates a vector field using spectral transforms.
    +
    integer kp5(km),kp6(km),kp7(km)
    +
    integer jpds(25),jgds(22),kpds(25,km),kgds(22,km)
    +
    logical lb(jf)
    +
    real u(jf,km),v(jf,km)
    +
    c
    +
    jpds=-1
    +
    do k=1,km
    +
    jpds(5)=kp5(k)
    +
    jpds(6)=kp6(k)
    +
    jpds(7)=kp7(k)
    +
    j=0
    +
    call getgb(lug,lui,jf,j,jpds,jgds,kf,j,kpds(1,k),kgds(1,k),
    +
    & lb,u(1,k),iret)
    +
    if(iret.ne.0) call exit(1)
    +
    if(mod(kpds(4,k)/64,2).eq.1) call exit(2)
    +
    jpds=kpds(:,k)
    +
    jgds=kgds(:,k)
    +
    jpds(5)=jpds(5)+1
    +
    j=0
    +
    call getgb(lug,lui,jf,j,jpds,jgds,kf,j,kpds(1,k),kgds(1,k),
    +
    & lb,v(1,k),iret)
    +
    if(iret.ne.0) call exit(1)
    +
    if(mod(kpds(4,k)/64,2).eq.1) call exit(2)
    +
    enddo
    +
    idrt=kgds(1,1)
    +
    imax=kgds(2,1)
    +
    jmax=kgds(3,1)
    +
    c
    +
    call sptrunv(iromb,maxwv,idrt,imax,jmax,idrt,imax,jmax,km,
    +
    & 0,0,0,jf,0,0,jf,0,u,v,.true.,u,v,
    +
    & .false.,dum,dum,.false.,dum,dum)
    +
    c
    +
    do k=1,km
    +
    kpds(5,k)=kp5(k)
    +
    call putgb(luo,kf,kpds(1,k),kgds(1,k),lb,u(1,k),iret)
    +
    enddo
    +
    do k=1,km
    +
    kpds(5,k)=kp5(k)+1
    +
    call putgb(luo,kf,kpds(1,k),kgds(1,k),lb,v(1,k),iret)
    +
    enddo
    +
    c
    +
    end
    +
    subroutine sptrunv(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, IDRTO, IMAXO, JMAXO, KMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, ISKIPO, JSKIPO, KSKIPO, JCPU, GRIDUI, GRIDVI, LUV, GRIDUO, GRIDVO, LDZ, GRIDDO, GRIDZO, LPS, GRIDPO, GRIDSO)
    This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields...
    Definition: sptrunv.f:96
    +

    Example 3. Compute latlon temperatures from spectral temperatures and compute latlon winds from spectral divergence and vorticity.

    +
    c unit number 11 is the input sigma file
    +
    c unit number 51 is the output latlon file
    +
    c nominal spectral truncation is t62
    +
    c output gridsize is 144x73
    +
    c number of levels is 28
    +
    parameter(iromb=0,maxwv=62)
    +
    parameter(idrt=0,im=144,jm=73)
    +
    parameter(levs=28)
    +
    parameter(mx=(maxwv+1)*((iromb+1)*maxwv+2)/2)
    +
    real t(mx,levs),d(mx,levs),z(mx,levs)
    +
    real tg(im,jm,km),ug(im,jm,km),vg(im,jm,km)
    +
    c temperature
    +
    do k=1,4
    +
    read(11)
    +
    enddo
    +
    do k=1,levs
    +
    read(11) (t(m,k),m=1,mx)
    +
    enddo
    +
    call sptran(iromb,maxwv,idrt,im,jm,levs,0,0,0,0,0,0,0,0,1,
    +
    & t,tg(1,1,1),tg(1,jm,1),1)
    +
    call sptran(
    +
    do k=1,levs
    +
    write(51) ((tg(i,j,k),i=1,im),j=1,jm)
    +
    enddo
    +
    c winds
    +
    do k=1,levs
    +
    read(11) (d(m,k),m=1,mx)
    +
    read(11) (z(m,k),m=1,mx)
    +
    enddo
    +
    call sptranv(iromb,maxwv,idrt,im,jm,levs,0,0,0,0,0,0,0,0,1,
    +
    & d,z,ug(1,1,1),ug(1,jm,1),vg(1,1,1),vg(1,jm,1),1)
    +
    do k=1,levs
    +
    write(51) ((ug(i,j,k),i=1,im),j=1,jm)
    +
    write(51) ((vg(i,j,k),i=1,im),j=1,jm)
    +
    enddo
    +
    end
    +
    subroutine sptran(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDN, GRIDS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition: sptran.f:88
    +
    subroutine sptranv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
    Definition: sptranv.f:91
    +
    +
    +

    + + + + diff --git a/ver-5.1.0/interfacebicubic__interp__mod_1_1interpolate__bicubic.html b/ver-5.1.0/interfacebicubic__interp__mod_1_1interpolate__bicubic.html new file mode 100644 index 00000000..c8d35bcd --- /dev/null +++ b/ver-5.1.0/interfacebicubic__interp__mod_1_1interpolate__bicubic.html @@ -0,0 +1,473 @@ + + + + + + + +NCEPLIBS-ip: bicubic_interp_mod::interpolate_bicubic Interface Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    bicubic_interp_mod::interpolate_bicubic Interface Reference
    +
    +
    + + + + + + + + +

    +Private Member Functions

    subroutine interpolate_bicubic_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     This subprogram performs bicubic interpolation from any grid to any grid for scalar fields. More...
     
    subroutine interpolate_bicubic_vector (ipopt, grid_in, grid_out, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
     This subprogram performs bicubic interpolation from any grid to any grid for vector fields. More...
     
    +

    Detailed Description

    +
    +

    Definition at line 17 of file bicubic_interp_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ interpolate_bicubic_scalar()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine bicubic_interp_mod::interpolate_bicubic::interpolate_bicubic_scalar (integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    logical*1, dimension(mi,km), intent(in) LI,
    real, dimension(mi,km), intent(in) GI,
    integer, intent(inout) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) GO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    This subprogram performs bicubic interpolation from any grid to any grid for scalar fields.

    +

    Bitmaps are now allowed even when invalid points are within the bicubic template provided the minimum weight is reached.

    +

    Options allow choices between straight bicubic (ipopt(1)=0) and constrained bicubic (ipopt(1)=1) where the value is confined within the range of the surrounding 16 points.

    +

    Another option is the minimum percentage for mask, i.e. percent valid input data required to make output data, (ipopt(2)) which defaults to 50 (if ipopt(2)=-1).

    +

    Bilinear used within one grid length of boundaries. Only horizontal interpolation is performed.

    +

    The code recognizes the following projections, where for the input and output grids, respectively: as an added bonus the number of output grid points and their latitudes and longitudes are also returned. On the other hand, the output can be a set of station points if igdtnumo<0, in which case the number of points and their latitudes and longitudes must be input. output bitmaps will only be created when the output grid extends outside of the domain of the input grid. the output field is set to 0 where the output bitmap is off.

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]ipoptInterpolation options.
      +
    • ipopt(1)=0 For straight bicubic;
    • +
    • ipopt(1)=1 For constrained bicubic where value is confined within the range of the surrounding 4 points.
    • +
    • ipopt(2) Is minimum percentage for mask (defaults to 50 if ipopt(2)=-1)
    • +
    +
    [in]grid_inInput grid.
    [in]grid_outOutput grid.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [out]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if some ibi(k)=1).
    [in]giInput fields to interpolate.
    [in,out]noNumber of output points (only if igdtnumo<0).
    [in,out]rlatOutput latitudes in degrees (if igdtnumo<0).
    [in,out]rlonOutput longitudes in degrees (if igdtnumo<0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]goOutput fields interpolated.
    [out]iretReturn code.
      +
    • 0 successful interpolation,
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    +
    +
    +
    +
    Author
    George Gayno, Mark Iredell, Kyle Gerheiser, Eric Engle
    + +

    Definition at line 80 of file bicubic_interp_mod.F90.

    + +

    References polfix_mod::polfixs().

    + +
    +
    + +

    ◆ interpolate_bicubic_vector()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine bicubic_interp_mod::interpolate_bicubic::interpolate_bicubic_vector (integer, dimension(20), intent(in) ipopt,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) mi,
    integer, intent(in) mo,
    integer, intent(in) km,
    integer, dimension(km), intent(in) ibi,
    logical*1, dimension(mi,km), intent(in) li,
    real, dimension(mi,km), intent(in) ui,
    real, dimension(mi,km), intent(in) vi,
    integer, intent(inout) no,
    real, dimension(mo), intent(inout) rlat,
    real, dimension(mo), intent(inout) rlon,
    real, dimension(mo), intent(inout) crot,
    real, dimension(mo), intent(inout) srot,
    integer, dimension(km), intent(out) ibo,
    logical*1, dimension(mo,km), intent(out) lo,
    real, dimension(mo,km), intent(out) uo,
    real, dimension(mo,km), intent(out) vo,
    integer, intent(out) iret 
    )
    +
    +private
    +
    + +

    This subprogram performs bicubic interpolation from any grid to any grid for vector fields.

    +

    Bitmaps are now allowed even when invalid points are within the bicubic template provided the minimum weight is reached.

    +

    Options allow choices between straight bicubic (ipopt(1)=0) and constrained bicubic (ipopt(1)=1) where the value is confined within the range of the surrounding 16 points.

    +

    Another option is the minimum percentage for mask, i.e. percent valid input data required to make output data, (ipopt(2)) which defaults to 50 (if ipopt(2)=-1).

    +

    Bilinear used within one grid length of boundaries. Only horizontal interpolation is performed.

    +

    The code recognizes the following projections, where for the input and output grids, respectively: as an added bonus the number of output grid points and their latitudes and longitudes are also returned. On the other hand, the output can be a set of station points if igdtnumo<0, in which case the number of points and their latitudes and longitudes must be input.

    +

    Output bitmaps will only be created when the output grid extends outside of the domain of the input grid. the output field is set to 0 where the output bitmap is off.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + +
    [in]ipoptinteger (20) interpolation options
      +
    • ipopt(1)=0 for straight bicubic;
    • +
    • ipopt(1)=1 for constrained bicubic where value is confined within the range of the surrounding 4 points.
    • +
    • ipopt(2) is minimum percentage for mask (defaults to 50 if ipopt(2)=-1)
    • +
    +
    [in]grid_inInput grid.
    [in]grid_outOutput grid.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [out]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if some ibi(k)=1).
    [in]uiInput u-component fields to interpolate.
    [in]viInput v-component fields to interpolate.
    [in,out]noNumber of output points (only if igdtnumo<0).
    [in,out]rlatOutput latitudes in degrees (if igdtnumo<0).
    [in,out]rlonOutput longitudes in degrees (if igdtnumo<0).
    [in,out]crotVector rotation cosines (if igdtnumo<0) ugrid=crot*uearth-srot*vearth.
    [in,out]srotVector rotation sines (if igdtnumo<0) vgrid=srot*uearth+crot*vearth).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]uoOutput u-component fields interpolated.
    [out]voOutput v-component fields interpolated.
    [out]iretReturn code.
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    +
    +
    +
    +
    Author
    George Gayno, Mark Iredell, Kyle Gerheiser, Eric Engle
    + +

    Definition at line 338 of file bicubic_interp_mod.F90.

    + +

    References movect(), and polfix_mod::polfixv().

    + +
    +
    +
    The documentation for this interface was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/interfacebicubic__interp__mod_1_1interpolate__bicubic.js b/ver-5.1.0/interfacebicubic__interp__mod_1_1interpolate__bicubic.js new file mode 100644 index 00000000..22f72d65 --- /dev/null +++ b/ver-5.1.0/interfacebicubic__interp__mod_1_1interpolate__bicubic.js @@ -0,0 +1,5 @@ +var interfacebicubic__interp__mod_1_1interpolate__bicubic = +[ + [ "interpolate_bicubic_scalar", "interfacebicubic__interp__mod_1_1interpolate__bicubic.html#acbfecc99184cf9ae71b2c9f79c7d4077", null ], + [ "interpolate_bicubic_vector", "interfacebicubic__interp__mod_1_1interpolate__bicubic.html#aac45c15e1c9d76158d72e62ccaca915b", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/interfacebilinear__interp__mod_1_1interpolate__bilinear.html b/ver-5.1.0/interfacebilinear__interp__mod_1_1interpolate__bilinear.html new file mode 100644 index 00000000..cea3853c --- /dev/null +++ b/ver-5.1.0/interfacebilinear__interp__mod_1_1interpolate__bilinear.html @@ -0,0 +1,463 @@ + + + + + + + +NCEPLIBS-ip: bilinear_interp_mod::interpolate_bilinear Interface Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    bilinear_interp_mod::interpolate_bilinear Interface Reference
    +
    +
    + + + + + + + + +

    +Private Member Functions

    subroutine interpolate_bilinear_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     This subprogram performs bilinear interpolation from any grid to any grid for scalar fields. More...
     
    subroutine interpolate_bilinear_vector (ipopt, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     This subprogram performs bilinear interpolation from any grid to any grid for vector fields. More...
     
    +

    Detailed Description

    +
    +

    Definition at line 19 of file bilinear_interp_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ interpolate_bilinear_scalar()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine bilinear_interp_mod::interpolate_bilinear::interpolate_bilinear_scalar (integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    logical*1, dimension(mi,km), intent(in) LI,
    real, dimension(mi,km), intent(in) GI,
    integer, intent(inout) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) GO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    This subprogram performs bilinear interpolation from any grid to any grid for scalar fields.

    +

    Options allow varying the minimum percentage for mask, i.e. percent valid input data required to make output data, (ipopt(1)) which defaults to 50 (if ipopt(1)=-1). only horizontal interpolation is performed. if no input data is found near the output point, a spiral search may be invoked by setting ipopt(2)> 0. no searching is done if output point is outside the input grid. as an added bonus the number of output grid points and their latitudes and longitudes are also returned. on the other hand, the output can be a set of station points if igdtnumo<0, in which case the number of points and their latitudes and longitudes must be input. input bitmaps will be interpolated to output bitmaps. output bitmaps will also be created when the output grid extends outside of the domain of the input grid.

    +

    The output field is set to 0 where the output bitmap is off.

    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]ipoptinterpolation options
      +
    • ipopt(1) is minimum percentage for mask (defaults to 50 if ipopt(1)=-1)
    • +
    • ipopt(2) is width of square to examine in spiral search (defaults to no search if ipopt(2)=-1)
    • +
    +
    [in]grid_ininput grid
    [in]grid_outoutput grid
    [in]miskip number between input grid fields if km>1 or dimension of input grid fields if km=1
    [out]moskip number between output grid fields if km>1 or dimension of output grid fields if km=1
    [in]kmnumber of fields to interpolate
    [in]ibiinput bitmap flags
    [in]liinput bitmaps (if some ibi(k)=1)
    [in]giinput fields to interpolate
    [in,out]nonumber of output points (only if igdtnumo<0)
    [in,out]rlatoutput latitudes in degrees (if igdtnumo<0)
    [in,out]rlonoutput longitudes in degrees (if igdtnumo<0)
    [out]ibooutput bitmap flags
    [out]looutput bitmaps (always output)
    [out]gooutput fields interpolated
    [out]iretreturn code
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    +
    +
    +
    +
    Author
    George Gayno, Mark Iredell, Kyle Gerheiser, Eric Engle
    + +

    Definition at line 72 of file bilinear_interp_mod.F90.

    + +

    References polfix_mod::polfixs().

    + +
    +
    + +

    ◆ interpolate_bilinear_vector()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine bilinear_interp_mod::interpolate_bilinear::interpolate_bilinear_vector (integer, dimension(20), intent(in) ipopt,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    logical*1, dimension(mi,km), intent(in) LI,
    real, dimension(mi,km), intent(in) UI,
    real, dimension(mi,km), intent(in) VI,
    integer, intent(inout) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    real, dimension(mo), intent(inout) CROT,
    real, dimension(mo), intent(inout) SROT,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) UO,
    real, dimension(mo,km), intent(out) VO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    This subprogram performs bilinear interpolation from any grid to any grid for vector fields.

    +

    Options allow varying the minimum percentage for mask, i.e. percent valid input data required to make output data, (ipopt(1)) which defaults to 50 (if ipopt(1)=-1).

    +

    Only horizontal interpolation is performed. the input and output vectors are rotated so that they are either resolved relative to the defined grid in the direction of increasing x and y coordinates or resolved relative to easterly and northerly directions, as designated by their respective grid description sections.

    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned along with their vector rotation parameters. on the other hand, the data may be interpolated to a set of station points if igdtnumo < 0, in which case the number of points and their latitudes and longitudes must be input along with their vector rotation parameters. input bitmaps will be interpolated to output bitmaps. output bitmaps will also be created when the output grid extends outside of the domain of the input grid. the output field is set to 0 where the output bitmap is off.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + +
    [in]ipoptinterpolation options
      +
    • ipopt(1) is minimum percentage for mask (defaults to 50 if ipopt(1)=-1)
    • +
    +
    [in]grid_inInput grid
    [in]grid_outOutput grid
    [in]miskip number between input grid fields if km>1 or dimension of input grid fields if km=1
    [out]moskip number between output grid fields if km>1 or dimension of output grid fields if km=1
    [in]kmnumber of fields to interpolate
    [in]ibiinput bitmap flags
    [in]liinput bitmaps (if some ibi(k)=1)
    [in]uiinput u-component fields to interpolate
    [in]viinput v-component fields to interpolate
    [in,out]nonumber of output points (only if igdtnumo<0)
    [in,out]rlatoutput latitudes in degrees (if igdtnumo<0)
    [in,out]rlonoutput longitudes in degrees (if igdtnumo<0)
    [in,out]crotvector rotation cosines (if igdtnumo<0) ugrid=crot*uearth-srot*vearth;
    [in,out]srotvector rotation sines (if igdtnumo<0) vgrid=srot*uearth+crot*vearth)
    [out]ibooutput bitmap flags
    [out]looutput bitmaps (always output)
    [out]uooutput u-component fields interpolated
    [out]vooutput v-component fields interpolated
    [out]iretreturn code
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    +
    +
    +
    +
    Author
    George Gayno, Mark Iredell, Kyle Gerheiser, Eric Engle
    + +

    Definition at line 329 of file bilinear_interp_mod.F90.

    + +

    References movect(), and polfix_mod::polfixv().

    + +
    +
    +
    The documentation for this interface was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/interfacebilinear__interp__mod_1_1interpolate__bilinear.js b/ver-5.1.0/interfacebilinear__interp__mod_1_1interpolate__bilinear.js new file mode 100644 index 00000000..0aa40a0e --- /dev/null +++ b/ver-5.1.0/interfacebilinear__interp__mod_1_1interpolate__bilinear.js @@ -0,0 +1,5 @@ +var interfacebilinear__interp__mod_1_1interpolate__bilinear = +[ + [ "interpolate_bilinear_scalar", "interfacebilinear__interp__mod_1_1interpolate__bilinear.html#a3493cf5bc04aa4551ffd4c314ef09a65", null ], + [ "interpolate_bilinear_vector", "interfacebilinear__interp__mod_1_1interpolate__bilinear.html#ab4692c5250b37325f764b38c570892dd", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/interfacebudget__interp__mod_1_1interpolate__budget.html b/ver-5.1.0/interfacebudget__interp__mod_1_1interpolate__budget.html new file mode 100644 index 00000000..1df3948f --- /dev/null +++ b/ver-5.1.0/interfacebudget__interp__mod_1_1interpolate__budget.html @@ -0,0 +1,473 @@ + + + + + + + +NCEPLIBS-ip: budget_interp_mod::interpolate_budget Interface Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    budget_interp_mod::interpolate_budget Interface Reference
    +
    +
    + + + + + + + + +

    +Private Member Functions

    subroutine interpolate_budget_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Performs budget interpolation from any grid to any grid (or to random station points) for scalar fields. More...
     
    subroutine interpolate_budget_vector (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     This subprogram performs budget interpolation from any grid to any grid (or to random station points) for vector fields. More...
     
    +

    Detailed Description

    +
    +

    Definition at line 21 of file budget_interp_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ interpolate_budget_scalar()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine budget_interp_mod::interpolate_budget::interpolate_budget_scalar (integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    logical*1, dimension(mi,km), intent(in) LI,
    real, dimension(mi,km), intent(in) GI,
    integer, intent(out) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) GO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Performs budget interpolation from any grid to any grid (or to random station points) for scalar fields.

    +

    The algorithm simply computes (weighted) averages of bilinearly interpolated points arranged in a square box centered around each output grid point and stretching nearly halfway to each of the neighboring grid points.

    +

    Options allow choices of number of points in each radius from the center point (ipopt(1)) which defaults to 2 (if ipopt(1)=-1) meaning that 25 points will be averaged; further options are the respective weights for the radius points starting at the center point (ipopt(2:2+ipopt(1)) which defaults to all 1 (if ipopt(1)=-1 or ipopt(2)=-1).

    +

    A special interpolation is done if ipopt(2)=-2. in this case, the boxes stretch nearly all the way to each of the neighboring grid points and the weights are the adjoint of the bilinear interpolation weights. This case gives quasi-second-order budget interpolation.

    +

    Another option is the minimum percentage for mask, i.e. percent valid input data required to make output data, (ipopt(3+ipopt(1)) which defaults to 50 (if -1).

    +

    In cases where there is no or insufficient valid input data, the user may choose to search for the nearest valid data. this is invoked by setting ipopt(20) to the width of the search square. The default is 1 (no search). Squares are searched for valid data in a spiral pattern starting from the center. No searching is done where the output grid is outside the input grid.

    +

    Only horizontal interpolation is performed.

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]ipoptInterpolation options
      +
    • ipopt(1) is number of radius points (defaults to 2 if ipopt(1)=-1).
    • +
    • ipopt(2:2+ipopt(1)) are respective weights (defaults to all 1 if ipopt(1)=-1 or ipopt(2)=-1).
    • +
    • ipopt(3+ipopt(1)) is minimum percentage for mask (defaults to 50 if ipopt(3+ipopt(1)=-1).
    • +
    +
    [in]grid_inInput grid
    [in]grid_outOutput grid
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [out]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if some ibi(k)=1).
    [in]giInput fields to interpolate.
    [in,out]noNumber of output points (only if igdtnumo<0).
    [in,out]rlatOutput latitudes in degrees (if igdtnumo<0).
    [in,out]rlonOutput longitudes in degrees (if igdtnumo<0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]goOutput fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 32 Invalid budget method parameters.
    • +
    +
    +
    +
    +
    Author
    Marke Iredell, George Gayno, Kyle Gerheiser, Eric Engle
    +
    Date
    July 2021
    + +

    Definition at line 94 of file budget_interp_mod.F90.

    + +

    References polfix_mod::polfixs().

    + +
    +
    + +

    ◆ interpolate_budget_vector()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine budget_interp_mod::interpolate_budget::interpolate_budget_vector (integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    logical*1, dimension(mi,km), intent(in) LI,
    real, dimension(mi,km), intent(in) UI,
    real, dimension(mi,km), intent(in) VI,
    integer, intent(out) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    real, dimension(mo), intent(out) CROT,
    real, dimension(mo), intent(out) SROT,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) UO,
    real, dimension(mo,km), intent(out) VO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    This subprogram performs budget interpolation from any grid to any grid (or to random station points) for vector fields.

    +

    The algorithm simply computes (weighted) averages of bilinearly interpolated points arranged in a square box centered around each output grid point and stretching nearly halfway to each of the neighboring grid points.

    +

    Options allow choices of number of points in each radius from the center point (ipopt(1)) which defaults to 2 (if ipopt(1)=-1) meaning that 25 points will be averaged; further options are the respective weights for the radius points starting at the center point (ipopt(2:2+ipopt(1)) which defaults to all 1 (if ipopt(1)=-1 or ipopt(2)=-1).

    +

    A special interpolation is done if ipopt(2)=-2. in this case, the boxes stretch nearly all the way to each of the neighboring grid points and the weights are the adjoint of the bilinear interpolation weights. This case gives quasi-second-order budget interpolation.

    +

    Another option is the minimum percentage for mask, i.e. percent valid input data required to make output data, (ipopt(3+ipopt(1)) which defaults to 50 (if -1).

    +

    In cases where there is no or insufficient valid input data, the user may choose to search for the nearest valid data. this is invoked by setting ipopt(20) to the width of the search square. The default is 1 (no search). Squares are searched for valid data in a spiral pattern starting from the center. No searching is done where the output grid is outside the input grid.

    +

    Only horizontal interpolation is performed.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + +
    [in]ipoptinterpolation options ipopt(1) Number of radius points (defaults to 2 if ipopt(1)=-1); ipopt(2:2+ipopt(1)) Respective weights (defaults to all 1 if ipopt(1)=-1 or ipopt(2)=-1). ipopt(3+ipopt(1)) Minimum percentage for mask (defaults to 50 if ipopt(3+ipopt(1)=-1)
    [in]grid_inInput grid.
    [in]grid_outOutput grid.
    [in]miskip Number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [out]moskip Number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if some ibi(k)=1).
    [in]uiInput u-component fields to interpolate.
    [in]viInput v-component fields to interpolate.
    [in,out]noNumber of output points (only if igdtnumo<0)
    [in,out]rlatOutput latitudes in degrees (if igdtnumo<0)
    [in,out]rlonOutput longitudes in degrees (if igdtnumo<0)
    [in,out]crotVector rotation cosines. If interpolating subgrid ugrid=crot * uearth - srot * vearth.
    [in,out]srotVector rotation sines. If interpolating subgrid vgrid = srot * uearth + crot * vearth.
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]uoOutput u-component fields interpolated.
    [out]voOutput v-component fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 32 Invalid budget method parameters.
    • +
    +
    +
    +
    +
    Author
    Marke Iredell, George Gayno, Kyle Gerheiser, Eric Engle
    +
    Date
    July 2021
    + +

    Definition at line 423 of file budget_interp_mod.F90.

    + +

    References movect(), and polfix_mod::polfixv().

    + +
    +
    +
    The documentation for this interface was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/interfacebudget__interp__mod_1_1interpolate__budget.js b/ver-5.1.0/interfacebudget__interp__mod_1_1interpolate__budget.js new file mode 100644 index 00000000..6c0949c3 --- /dev/null +++ b/ver-5.1.0/interfacebudget__interp__mod_1_1interpolate__budget.js @@ -0,0 +1,5 @@ +var interfacebudget__interp__mod_1_1interpolate__budget = +[ + [ "interpolate_budget_scalar", "interfacebudget__interp__mod_1_1interpolate__budget.html#a4b96cbeedb86ef43b687f7ea55914ef0", null ], + [ "interpolate_budget_vector", "interfacebudget__interp__mod_1_1interpolate__budget.html#a573e89e56381d0f69e4022d791a087e6", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/interfacegdswzd__mod_1_1gdswzd.html b/ver-5.1.0/interfacegdswzd__mod_1_1gdswzd.html new file mode 100644 index 00000000..48da6fe0 --- /dev/null +++ b/ver-5.1.0/interfacegdswzd__mod_1_1gdswzd.html @@ -0,0 +1,1310 @@ + + + + + + + +NCEPLIBS-ip: gdswzd_mod::gdswzd Interface Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    gdswzd_mod::gdswzd Interface Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Private Member Functions

    subroutine gdswzd_1d_array (IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Decodes the grib 2 grid definition template and returns one of the following: More...
     
    subroutine gdswzd_2d_array (IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Decodes the grib 2 grid definition template and returns one of the following (for 2d-arrays): More...
     
    subroutine gdswzd_2d_array_grib1 (KGDS, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Decodes the grib grid description section and returns one of the following (for 2-d arrays): More...
     
    subroutine gdswzd_grib1 (KGDS, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Decodes the grib grid description section and returns one of the following (for 1-d arrays): More...
     
    subroutine gdswzd_grid (grid, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Returns one of the following for a grid object: More...
     
    subroutine gdswzd_scalar (IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Decodes the grib 2 grid definition template and returns one of the following (for scalars): More...
     
    +

    Detailed Description

    +
    +

    Definition at line 37 of file gdswzd_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ gdswzd_1d_array()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine gdswzd_mod::gdswzd::gdswzd_1d_array (integer, intent(in) IGDTNUM,
    integer, dimension(igdtlen), intent(in) IGDTMPL,
    integer, intent(in) IGDTLEN,
    integer, intent(in) IOPT,
    integer, intent(in) NPTS,
    real, intent(in) FILL,
    real, dimension(npts), intent(inout) XPTS,
    real, dimension(npts), intent(inout) YPTS,
    real, dimension(npts), intent(inout) RLON,
    real, dimension(npts), intent(inout) RLAT,
    integer, intent(out) NRET,
    real, dimension(npts), intent(out), optional CROT,
    real, dimension(npts), intent(out), optional SROT,
    real, dimension(npts), intent(out), optional XLON,
    real, dimension(npts), intent(out), optional XLAT,
    real, dimension(npts), intent(out), optional YLON,
    real, dimension(npts), intent(out), optional YLAT,
    real, dimension(npts), intent(out), optional AREA 
    )
    +
    +private
    +
    + +

    Decodes the grib 2 grid definition template and returns one of the following:

    +
      +
    • iopt=0 Grid and earth coordinates of all grid points.
    • +
    • iopt=+1 Earth coordinates of selected grid coordinates.
    • +
    • iopt=-1 Grid coordinates of selected earth coordinates.
    • +
    +

    The current code recognizes the following projections, where "igdtnum" is the grid definition template number:

      +
    • igdtnum=00 Equidistant Cylindrical
    • +
    • igdtnum=01 Rotated Equidistant Cylindrical. "E" and non-"E" staggered
    • +
    • igdtnum=10 Mercator Cyclindrical
    • +
    • igdtnum=20 Polar Stereographic Azimuthal
    • +
    • igdtnum=30 Lambert Conformal Conical
    • +
    • igdtnum=40 Gaussian Equidistant Cyclindrical
    • +
    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values. Also if iopt=0, if the number of grid points exceeds the number allotted, then all the output elements are set to fill values.

    +

    The actual number of valid points computed is returned too.

    +

    Optionally, the vector rotations, map jacobians and grid box areas may be returned.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present. To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present.

    +

    To compute the grid box areas, the optional argument 'area' must be present.

    +
    Parameters
    + + + +
    [in]igdtnumGrid definition template number. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure:
      +
    • 00 - Equidistant Cylindrical
    • +
    • 01 - Rotated Equidistant Cylindrical. "E" and non-"E" staggered
    • +
    • 10 - Mercator Cyclindrical
    • +
    • 20 - Polar Stereographic Azimuthal
    • +
    • 30 - Lambert Conformal Conical
    • +
    • 40 - Gaussian Equidistant Cyclindrical
    • +
    +
    [in]igdtmplGrid definition template array. Corresponds to the gfldigdtmpl component of the NCEPLIBS-g2 gridmod data structure
    +
    +
    +

    Section 3 Info:

    +

    All Map Projections:

      +
    • 1: Shape of earth, octet 15.
    • +
    • 2: Scale factor of spherical earth radius, octet 16.
    • +
    • 3: Scaled value of radius of spherical earth, octets 17-20.
    • +
    • 4: Scale factor of major axis of elliptical earth, octet 21.
    • +
    • 5: Scaled value of major axis of elliptical earth, octets 22-25.
    • +
    • 6: Scale factor of minor axis of elliptical earth, octet 26.
    • +
    • 7: Scaled value of minor axis of elliptical earth, octets 27-30.
    • +
    +

    Equidistant Cyclindrical:

      +
    • 8: Number of points along a parallel, octs 31-34.
    • +
    • 9: Number of points along a meridian, octs 35-38.
    • +
    • 10: Basic angle of initial production domain, octets 39-42.
    • +
    • 11: Subdivisions of basic angle, octets 43-46.
    • +
    • 12: Latitude of first grid point, octets 47-50.
    • +
    • 13: Longitude of first grid point, octets 51-54.
    • +
    • 14: Resolution and component flags, octet 55.
    • +
    • 15: Latitude of last grid point, octets 56-59.
    • +
    • 16: Longitude of last grid point, octets 60-63.
    • +
    • 17: i-direction increment, octets 64-67.
    • +
    • 18: j-direction increment, octets 68-71.
    • +
    • 19: Scanning mode, octet 72.
    • +
    +

    Mercator Cyclindrical:

      +
    • 8: Number of points along a parallel, octs 31-34.
    • +
    • 9: Number of points along a meridian, octs 35-38.
    • +
    • 10: Latitude of first point, octets 39-42.
    • +
    • 11: Longitude of first point, octets 43-46.
    • +
    • 12: Resolution and component flags, octet 47.
    • +
    • 13: Tangent latitude, octets 48-51.
    • +
    • 14: Latitude of last point, octets 52-55.
    • +
    • 15: Longitude of last point, octets 56-59.
    • +
    • 16: Scanning mode flags, octet 60.
    • +
    • 17: Orientation of grid, octets 61-64.
    • +
    • 18: Longitudinal grid length, octets 65-68.
    • +
    • 19: Latitudinal grid length, octets 69-72.
    • +
    +

    Lambert Conformal Conical:

      +
    • 8: Number of points along x-axis, octs 31-34.
    • +
    • 9: Number of points along y-axis, octs 35-38.
    • +
    • 10: Latitude of first point, octets 39-42.
    • +
    • 11: Longitude of first point, octets 43-46.
    • +
    • 12: Resolution of component flag, octet 47.
    • +
    • 13: Latitude where grid lengths specified,octets 48-51.
    • +
    • 14: Longitude of meridian that is parallel to y-axis, octets 52-55.
    • +
    • 15: x-direction grid length, octets 56-59.
    • +
    • 16: y-direction grid length, octets 60-63.
    • +
    • 17: Projection center flag, octet 64.
    • +
    • 18: Scanning mode, octet 65.
    • +
    • 19: First tangent latitude from pole, octets 66-69.
    • +
    • 20: Second tangent latitude from pole, octets 70-73.
    • +
    • 21: Latitude of south pole of projection, octets 74-77.
    • +
    • 22: Longitude of south pole of projection, octets 78-81.
    • +
    +

    Gaussian Cylindrical:

      +
    • 8: Number of points along a parallel, octs 31-34.
    • +
    • 9: Number of points along a meridian, octs 35-38.
    • +
    • 10: Basic angle of initial production domain, octets 39-42.
    • +
    • 11: Subdivisions of basic angle, octets 43-46.
    • +
    • 12: Latitude of first grid point, octets 47-50.
    • +
    • 13: Longitude of first grid point, octets 51-54.
    • +
    • 14: Resolution and component flags, octet 55.
    • +
    • 15: Latitude of last grid point, octets 56-59.
    • +
    • 16: Longitude of last grid point, octets 60-63.
    • +
    • 17: i-direction increment, octets 64-67.
    • +
    • 18: Number of parallels between pole and equator, octets 68-71.
    • +
    • 19: Scanning mode, octet 72.
    • +
    +

    Polar Stereographic Azimuthal:

      +
    • 8: Number of points along x-axis, octets 31-34.
    • +
    • 9: Number of points along y-axis, octets 35-38.
    • +
    • 10: Latitude of first grid point, octets 39-42.
    • +
    • 11: Longitude of first grid point, octets 43-46.
    • +
    • 12: Resolution and component flags, octet 47.
    • +
    • 13: True latitude, octets 48-51.
    • +
    • 14: Orientation longitude, octets 52-55.
    • +
    • 15: x-direction grid length, octets 56-59.
    • +
    • 16: y-direction grid length, octets 60-63.
    • +
    • 17: Projection center flag, octet 64.
    • +
    • 18: Scanning mode flags, octet 65.
    • +
    +

    Rotated Equidistant Cyclindrical:

      +
    • 8: Number of points along a parallel, octs 31-34.
    • +
    • 9: Number of points along a meridian, octs 35-38.
    • +
    • 10: Basic angle of initial production domain, octets 39-42.
    • +
    • 11: Subdivisions of basic angle, octets 43-46.
    • +
    • 12: Latitude of first grid point, octets 47-50.
    • +
    • 13: Longitude of first grid point, octets 51-54.
    • +
    • 14: Resolution and component flags, octet 55.
    • +
    • 15: Latitude of last grid point, octets 56-59.
    • +
    • 16: Longitude of last grid point, octets 60-63.
    • +
    • 17: i-direction increment, octets 64-67.
    • +
    • 18: j-direction increment, octets 68-71.
    • +
    • 19: Scanning mode, octet 72.
    • +
    • 20: Latitude of southern pole of projection, octets 73-76.
    • +
    • 21: Longitude of southern pole of projection, octets 77-80.
    • +
    • 22: Angle of rotation of projection, octs 81-84.
    • +
    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]igdtlenNumber of elements of the grid definition template array. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]ioptOption flag.
      +
    • 0 Earth coords of all the grid points.
    • +
    • 1 Earth coords of selected grid coords.
    • +
    • -1 Grid coords of selected earth coords
    • +
    +
    [in]nptsMaximum number of coordinates.
    [in]fillFill value to set invalid output data. Must be impossible value; suggested value: -9999.
    [in,out]xptsGrid x point coordinates.
    [in,out]yptsGrid y point coordinates.
    [in,out]rlonEarth longitudes in degrees E. (Acceptable range: -360. to 360.)
    [in,out]rlatEarth latitudes in degrees N. (Acceptable range: -90. to 90.)
    [out]nretNumber of valid points computed.
    [out]crotClockwise vector rotation cosines.
    [out]srotClockwise vector rotation sines. ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlondx/dlat in 1/degrees
    [out]xlatdy/dlon in 1/degrees
    [out]ylondy/dlon in 1/degrees
    [out]ylatdy/dlat in 1/degrees
    [out]areaArea weights in m^2. Proportional to the square of the map factor in the case of conformal projections
    +
    +
    +
    Author
    George Gayno, Mark Iredell
    +
    Date
    Jan 2015
    + +

    Definition at line 665 of file gdswzd_mod.F90.

    + +

    References gdswzd_mod::gdswzd_grid().

    + +
    +
    + +

    ◆ gdswzd_2d_array()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine gdswzd_mod::gdswzd::gdswzd_2d_array (integer, intent(in) IGDTNUM,
    integer, dimension(igdtlen), intent(in) IGDTMPL,
    integer, intent(in) IGDTLEN,
    integer, intent(in) IOPT,
    integer, intent(in) NPTS,
    real, intent(in) FILL,
    real, dimension(:,:), intent(inout) XPTS,
    real, dimension(:,:), intent(inout) YPTS,
    real, dimension(:,:), intent(inout) RLON,
    real, dimension(:,:), intent(inout) RLAT,
    integer, intent(out) NRET,
    real, dimension(:,:), intent(out), optional CROT,
    real, dimension(:,:), intent(out), optional SROT,
    real, dimension(:,:), intent(out), optional XLON,
    real, dimension(:,:), intent(out), optional XLAT,
    real, dimension(:,:), intent(out), optional YLON,
    real, dimension(:,:), intent(out), optional YLAT,
    real, dimension(:,:), intent(out), optional AREA 
    )
    +
    +private
    +
    + +

    Decodes the grib 2 grid definition template and returns one of the following (for 2d-arrays):

    +
      +
    • iopt=0 Grid and earth coordinates of all grid points.
    • +
    • iopt=+1 Earth coordinates of selected grid coordinates.
    • +
    • iopt=-1 Grid coordinates of selected earth coordinates.
    • +
    +

    The current code recognizes the following projections, where "igdtnum" is the grid definition template number:

      +
    • igdtnum=00 Equidistant Cylindrical
    • +
    • igdtnum=01 Rotated Equidistant Cylindrical. "E" and non-"E" staggered
    • +
    • igdtnum=10 Mercator Cyclindrical
    • +
    • igdtnum=20 Polar Stereographic Azimuthal
    • +
    • igdtnum=30 Lambert Conformal Conical
    • +
    • igdtnum=40 Gaussian Equidistant Cyclindrical
    • +
    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values. Also if iopt=0, if the number of grid points exceeds the number allotted, then all the output elements are set to fill values.

    +

    The actual number of valid points computed is returned too.

    +

    Optionally, the vector rotations, map jacobians and grid box areas may be returned.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present. To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present.

    +

    To compute the grid box areas, the optional argument 'area' must be present.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + +
    [in]igdtnumGrid definition template number.
    [in]igdtmplGrid definition template array. Corresponds to the gfldigdtmpl component of the NCEPLIBS-g2 gridmod data structure. See igdtmpl definition in gdswzd_1d_array() for full details.
    [in]igdtlenNumber of elements of the grid definition template array. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]ioptOption flag.
      +
    • 0 Earth coords of all the grid points.
    • +
    • 1 Earth coords of selected grid coords.
    • +
    • -1 Grid coords of selected earth coords
    • +
    +
    [in]nptsMaximum number of coordinates.
    [in]fillFill value to set invalid output data. Must be impossible value; suggested value: -9999.
    [in,out]xptsGrid x point coordinates.
    [in,out]yptsGrid y point coordinates.
    [in,out]rlonEarth longitudes in degrees E. (Acceptable range: -360. to 360.)
    [in,out]rlatEarth latitudes in degrees N. (Acceptable range: -90. to 90.)
    [out]nretNumber of valid points computed.
    [out]crotClockwise vector rotation cosines.
    [out]srotClockwise vector rotation sines. ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlondx/dlat in 1/degrees
    [out]xlatdy/dlon in 1/degrees
    [out]ylondy/dlon in 1/degrees
    [out]ylatdy/dlat in 1/degrees
    [out]areaArea weights in m^2. Proportional to the square of the map factor in the case of conformal projections
    +
    +
    +
    Author
    George Gayno, Mark Iredell
    +
    Date
    Jan 2015
    + +

    Definition at line 459 of file gdswzd_mod.F90.

    + +

    References gdswzd_mod::gdswzd_1d_array().

    + +
    +
    + +

    ◆ gdswzd_2d_array_grib1()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine gdswzd_mod::gdswzd::gdswzd_2d_array_grib1 (integer, dimension(200), intent(in) KGDS,
    integer, intent(in) IOPT,
    integer, intent(in) NPTS,
    real, intent(in) FILL,
    real, dimension(:,:), intent(inout) XPTS,
    real, dimension(:,:), intent(inout) YPTS,
    real, dimension(:,:), intent(inout) RLON,
    real, dimension(:,:), intent(inout) RLAT,
    integer, intent(out) NRET,
    real, dimension(:,:), intent(out), optional CROT,
    real, dimension(:,:), intent(out), optional SROT,
    real, dimension(:,:), intent(out), optional XLON,
    real, dimension(:,:), intent(out), optional XLAT,
    real, dimension(:,:), intent(out), optional YLON,
    real, dimension(:,:), intent(out), optional YLAT,
    real, dimension(:,:), intent(out), optional AREA 
    )
    +
    +private
    +
    + +

    Decodes the grib grid description section and returns one of the following (for 2-d arrays):

    +
      +
    • iopt=0 Grid and earth coordinates of all grid points.
    • +
    • iopt=+1 Earth coordinates of selected grid coordinates.
    • +
    • iopt=-1 Grid coordinates of selected earth coordinates.
    • +
    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values. Also if iopt=0, if the number of grid points exceeds the number allotted, then all the output elements are set to fill values.

    +

    The actual number of valid points computed is returned too.

    +

    Optionally, the vector rotations, map jacobians and grid box areas may be returned.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present. To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present.

    +

    To compute the grid box areas, the optional argument 'area' must be present.

    +

    The current code recognizes the following projections:

      +
    • kgds(1)=000 Equidistant Cylindrical
    • +
    • kgds(1)=001 Mercator Cylindrical
    • +
    • kgds(1)=003 lambert Conformal Conical
    • +
    • kgds(1)=004 Gaussian Cylindrical
    • +
    • kgds(1)=005 Polar Stereographic azimuthal
    • +
    • kgds(1)=203 E-staggered Rotated Equidistant Cylindrical
    • +
    • kgds(1)=205 B-staggered Rotated Equidistant Cylindrical
    • +
    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]kgdsGDS parameters as decoded by w3fi63.
    +
    [in]ioptOption flag.
      +
    • 0 Earth coords of all the grid points.
    • +
    • 1 Earth coords of selected grid coords.
    • +
    • -1 Grid coords of selected earth coords
    • +
    +
    [in]nptsMaximum number of coordinates.
    [in]fillFill value to set invalid output data. Must be impossible value; suggested value: -9999.
    [in,out]xptsGrid x point coordinates.
    [in,out]yptsGrid y point coordinates.
    [in,out]rlonEarth longitudes in degrees E. (Acceptable range: -360. to 360.)
    [in,out]rlatEarth latitudes in degrees N. (Acceptable range: -90. to 90.)
    [out]nretNumber of valid points computed.
    [out]crotClockwise vector rotation cosines.
    [out]srotClockwise vector rotation sines. ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlondx/dlat in 1/degrees
    [out]xlatdy/dlon in 1/degrees
    [out]ylondy/dlon in 1/degrees
    [out]ylatdy/dlat in 1/degrees
    [out]areaArea weights in m^2. Proportional to the square of the map factor in the case of conformal projections
    +
    +
    +
    Author
    George Gayno, Mark Iredell
    +
    Date
    April 1996
    + +

    Definition at line 850 of file gdswzd_mod.F90.

    + +

    References gdswzd_mod::gdswzd_grid().

    + +
    +
    + +

    ◆ gdswzd_grib1()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine gdswzd_mod::gdswzd::gdswzd_grib1 (integer, dimension(200), intent(in) KGDS,
    integer, intent(in) IOPT,
    integer, intent(in) NPTS,
    real, intent(in) FILL,
    real, dimension(npts), intent(inout) XPTS,
    real, dimension(npts), intent(inout) YPTS,
    real, dimension(npts), intent(inout) RLON,
    real, dimension(npts), intent(inout) RLAT,
    integer, intent(out) NRET,
    real, dimension(npts), intent(out), optional CROT,
    real, dimension(npts), intent(out), optional SROT,
    real, dimension(npts), intent(out), optional XLON,
    real, dimension(npts), intent(out), optional XLAT,
    real, dimension(npts), intent(out), optional YLON,
    real, dimension(npts), intent(out), optional YLAT,
    real, dimension(npts), intent(out), optional AREA 
    )
    +
    +private
    +
    + +

    Decodes the grib grid description section and returns one of the following (for 1-d arrays):

    +
      +
    • iopt=0 Grid and earth coordinates of all grid points.
    • +
    • iopt=+1 Earth coordinates of selected grid coordinates.
    • +
    • iopt=-1 Grid coordinates of selected earth coordinates.
    • +
    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values. Also if iopt=0, if the number of grid points exceeds the number allotted, then all the output elements are set to fill values.

    +

    The actual number of valid points computed is returned too.

    +

    Optionally, the vector rotations, map jacobians and grid box areas may be returned.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present. To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present.

    +

    To compute the grid box areas, the optional argument 'area' must be present.

    +

    The current code recognizes the following projections:

      +
    • kgds(1)=000 Equidistant Cylindrical
    • +
    • kgds(1)=001 Mercator Cylindrical
    • +
    • kgds(1)=003 lambert Conformal Conical
    • +
    • kgds(1)=004 Gaussian Cylindrical
    • +
    • kgds(1)=005 Polar Stereographic azimuthal
    • +
    • kgds(1)=203 E-staggered Rotated Equidistant Cylindrical
    • +
    • kgds(1)=205 B-staggered Rotated Equidistant Cylindrical
    • +
    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]kgdsGDS parameters as decoded by w3fi63.
    +
    [in]ioptOption flag.
      +
    • 0 Earth coords of all the grid points.
    • +
    • 1 Earth coords of selected grid coords.
    • +
    • -1 Grid coords of selected earth coords
    • +
    +
    [in]nptsMaximum number of coordinates.
    [in]fillFill value to set invalid output data. Must be impossible value; suggested value: -9999.
    [in,out]xptsGrid x point coordinates.
    [in,out]yptsGrid y point coordinates.
    [in,out]rlonEarth longitudes in degrees E. (Acceptable range: -360. to 360.)
    [in,out]rlatEarth latitudes in degrees N. (Acceptable range: -90. to 90.)
    [out]nretNumber of valid points computed.
    [out]crotClockwise vector rotation cosines.
    [out]srotClockwise vector rotation sines. ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlondx/dlat in 1/degrees
    [out]xlatdy/dlon in 1/degrees
    [out]ylondy/dlon in 1/degrees
    [out]ylatdy/dlat in 1/degrees
    [out]areaArea weights in m^2. Proportional to the square of the map factor in the case of conformal projections
    +
    +
    +
    Author
    George Gayno, Mark Iredell
    +
    Date
    April 1996
    + +

    Definition at line 758 of file gdswzd_mod.F90.

    + +

    References gdswzd_mod::gdswzd_grid().

    + +
    +
    + +

    ◆ gdswzd_grid()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine gdswzd_mod::gdswzd::gdswzd_grid (class(ip_grid), intent(in) grid,
    integer, intent(in) IOPT,
    integer, intent(in) NPTS,
    real, intent(in) FILL,
    real, dimension(npts), intent(inout) XPTS,
    real, dimension(npts), intent(inout) YPTS,
    real, dimension(npts), intent(inout) RLON,
    real, dimension(npts), intent(inout) RLAT,
    integer, intent(out) NRET,
    real, dimension(npts), intent(out), optional CROT,
    real, dimension(npts), intent(out), optional SROT,
    real, dimension(npts), intent(out), optional XLON,
    real, dimension(npts), intent(out), optional XLAT,
    real, dimension(npts), intent(out), optional YLON,
    real, dimension(npts), intent(out), optional YLAT,
    real, dimension(npts), intent(out), optional AREA 
    )
    +
    +private
    +
    + +

    Returns one of the following for a grid object:

    +
      +
    • iopt=0 Grid and earth coordinates of all grid points.
    • +
    • iopt=+1 Earth coordinates of selected grid coordinates.
    • +
    • iopt=-1 Grid coordinates of selected earth coordinates.
    • +
    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values. Also if iopt=0, if the number of grid points exceeds the number allotted, then all the output elements are set to fill values.

    +

    The actual number of valid points computed is returned too.

    +

    Optionally, the vector rotations, map jacobians and grid box areas may be returned.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present. To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present.

    +

    To compute the grid box areas, the optional argument 'area' must be present.

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]gridGrid to call gdswzd on.
    [in]ioptOption flag.
      +
    • 0 Earth coords of all the grid points.
    • +
    • 1 Earth coords of selected grid coords.
    • +
    • -1 Grid coords of selected earth coords
    • +
    +
    [in]nptsMaximum number of coordinates.
    [in]fillFill value to set invalid output data. Must be impossible value; suggested value: -9999.
    [in,out]xptsGrid x point coordinates.
    [in,out]yptsGrid y point coordinates.
    [in,out]rlonEarth longitudes in degrees E. (Acceptable range: -360. to 360.)
    [in,out]rlatEarth latitudes in degrees N. (Acceptable range: -90. to 90.)
    [out]nretNumber of valid points computed.
    [out]crotClockwise vector rotation cosines.
    [out]srotClockwise vector rotation sines. ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlondx/dlat in 1/degrees
    [out]xlatdy/dlon in 1/degrees
    [out]ylondy/dlon in 1/degrees
    [out]ylatdy/dlat in 1/degrees
    [out]areaArea weights in m^2. Proportional to the square of the map factor in the case of conformal projections
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 105 of file gdswzd_mod.F90.

    + +
    +
    + +

    ◆ gdswzd_scalar()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine gdswzd_mod::gdswzd::gdswzd_scalar (integer, intent(in) IGDTNUM,
    integer, dimension(igdtlen), intent(in) IGDTMPL,
    integer, intent(in) IGDTLEN,
    integer, intent(in) IOPT,
    integer, intent(in) NPTS,
    real, intent(in) FILL,
    real, intent(inout) XPTS,
    real, intent(inout) YPTS,
    real, intent(inout) RLON,
    real, intent(inout) RLAT,
    integer, intent(out) NRET,
    real, intent(out), optional CROT,
    real, intent(out), optional SROT,
    real, intent(out), optional XLON,
    real, intent(out), optional XLAT,
    real, intent(out), optional YLON,
    real, intent(out), optional YLAT,
    real, intent(out), optional AREA 
    )
    +
    +private
    +
    + +

    Decodes the grib 2 grid definition template and returns one of the following (for scalars):

    +
      +
    • iopt=0 Grid and earth coordinates of all grid points.
    • +
    • iopt=+1 Earth coordinates of selected grid coordinates.
    • +
    • iopt=-1 Grid coordinates of selected earth coordinates.
    • +
    +

    The current code recognizes the following projections, where "igdtnum" is the grid definition template number:

      +
    • igdtnum=00 Equidistant Cylindrical
    • +
    • igdtnum=01 Rotated Equidistant Cylindrical. "E" and non-"E" staggered
    • +
    • igdtnum=10 Mercator Cyclindrical
    • +
    • igdtnum=20 Polar Stereographic Azimuthal
    • +
    • igdtnum=30 Lambert Conformal Conical
    • +
    • igdtnum=40 Gaussian Equidistant Cyclindrical
    • +
    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values. Also if iopt=0, if the number of grid points exceeds the number allotted, then all the output elements are set to fill values.

    +

    The actual number of valid points computed is returned too.

    +

    Optionally, the vector rotations, map jacobians and grid box areas may be returned.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present. To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present.

    +

    To compute the grid box areas, the optional argument 'area' must be present.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + +
    [in]igdtnumGrid definition template number.
    [in]igdtmplGrid definition template array. Corresponds to the gfldigdtmpl component of the NCEPLIBS-g2 gridmod data structure See igdtmpl definition in gdswzd_1d_array() for full details.
    [in]igdtlenNumber of elements of the grid definition template array. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]ioptOption flag.
      +
    • 0 Earth coords of all the grid points.
    • +
    • 1 Earth coords of selected grid coords.
    • +
    • -1 Grid coords of selected earth coords
    • +
    +
    [in]nptsMaximum number of coordinates.
    [in]fillFill value to set invalid output data. Must be impossible value; suggested value: -9999.
    [in,out]xptsGrid x point coordinates.
    [in,out]yptsGrid y point coordinates.
    [in,out]rlonEarth longitudes in degrees E. (Acceptable range: -360. to 360.)
    [in,out]rlatEarth latitudes in degrees N. (Acceptable range: -90. to 90.)
    [out]nretNumber of valid points computed.
    [out]crotClockwise vector rotation cosines.
    [out]srotClockwise vector rotation sines. ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlondx/dlat in 1/degrees
    [out]xlatdy/dlon in 1/degrees
    [out]ylondy/dlon in 1/degrees
    [out]ylatdy/dlat in 1/degrees
    [out]areaArea weights in m^2. Proportional to the square of the map factor in the case of conformal projections
    +
    +
    +
    Author
    George Gayno, Mark Iredell
    +
    Date
    Jan 2015
    + +

    Definition at line 278 of file gdswzd_mod.F90.

    + +

    References gdswzd_mod::gdswzd_1d_array().

    + +
    +
    +
    The documentation for this interface was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/interfacegdswzd__mod_1_1gdswzd.js b/ver-5.1.0/interfacegdswzd__mod_1_1gdswzd.js new file mode 100644 index 00000000..46bd3363 --- /dev/null +++ b/ver-5.1.0/interfacegdswzd__mod_1_1gdswzd.js @@ -0,0 +1,9 @@ +var interfacegdswzd__mod_1_1gdswzd = +[ + [ "gdswzd_1d_array", "interfacegdswzd__mod_1_1gdswzd.html#afaf35e3ce949dd2ce3d72dd3f06d4e3b", null ], + [ "gdswzd_2d_array", "interfacegdswzd__mod_1_1gdswzd.html#a8b60240eefdc297eacf90c348b529d31", null ], + [ "gdswzd_2d_array_grib1", "interfacegdswzd__mod_1_1gdswzd.html#a7c66a7ede2b644f7e366df9f70b9f0a5", null ], + [ "gdswzd_grib1", "interfacegdswzd__mod_1_1gdswzd.html#a65b95791813ffd5afbfba9d4cb67676a", null ], + [ "gdswzd_grid", "interfacegdswzd__mod_1_1gdswzd.html#abfe059339c6c9f05fd4eadb5d70aec16", null ], + [ "gdswzd_scalar", "interfacegdswzd__mod_1_1gdswzd.html#a1fc841ec08d39463b3f5f36eac0068cd", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/interfaceip__grid__descriptor__mod_1_1init__descriptor.html b/ver-5.1.0/interfaceip__grid__descriptor__mod_1_1init__descriptor.html new file mode 100644 index 00000000..c002a289 --- /dev/null +++ b/ver-5.1.0/interfaceip__grid__descriptor__mod_1_1init__descriptor.html @@ -0,0 +1,214 @@ + + + + + + + +NCEPLIBS-ip: ip_grid_descriptor_mod::init_descriptor Interface Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_grid_descriptor_mod::init_descriptor Interface Reference
    +
    +
    + + + + + + + + +

    +Private Member Functions

    type(grib1_descriptor) function init_grib1_descriptor (gds)
     Initialize grib-1 descriptor from integer grid definition section (GDS). More...
     
    type(grib2_descriptor) function init_grib2_descriptor (gdt_num, gdt_len, gdt_tmpl)
     Initialize grib-2 descriptor from integer grid definition template (GDT). More...
     
    +

    Detailed Description

    +
    +

    Definition at line 60 of file ip_grid_descriptor_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ init_grib1_descriptor()

    + +
    +
    + + + + + +
    + + + + + + + + +
    type(grib1_descriptor) function ip_grid_descriptor_mod::init_descriptor::init_grib1_descriptor (integer, dimension(:), intent(in) gds)
    +
    +private
    +
    + +

    Initialize grib-1 descriptor from integer grid definition section (GDS).

    +
    Parameters
    + + +
    [in]gdsGrib-1 grid definition section.
    +
    +
    +
    Returns
    Initialized Grib-1 descriptor.
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 74 of file ip_grid_descriptor_mod.F90.

    + +
    +
    + +

    ◆ init_grib2_descriptor()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    type(grib2_descriptor) function ip_grid_descriptor_mod::init_descriptor::init_grib2_descriptor (integer, intent(in) gdt_num,
    integer, intent(in) gdt_len,
    integer, dimension(:), intent(in) gdt_tmpl 
    )
    +
    +private
    +
    + +

    Initialize grib-2 descriptor from integer grid definition template (GDT).

    +
    Parameters
    + + + + +
    [in]gdt_numGrib-2 grid number.
    [in]gdt_lenLenght of the grid definition template.
    [in]gdt_tmplGrib-2 grid definition template.
    +
    +
    +
    Returns
    Initialized Grib-2 descriptor.
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 93 of file ip_grid_descriptor_mod.F90.

    + +
    +
    +
    The documentation for this interface was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/interfaceip__grid__descriptor__mod_1_1init__descriptor.js b/ver-5.1.0/interfaceip__grid__descriptor__mod_1_1init__descriptor.js new file mode 100644 index 00000000..ffaab030 --- /dev/null +++ b/ver-5.1.0/interfaceip__grid__descriptor__mod_1_1init__descriptor.js @@ -0,0 +1,5 @@ +var interfaceip__grid__descriptor__mod_1_1init__descriptor = +[ + [ "init_grib1_descriptor", "interfaceip__grid__descriptor__mod_1_1init__descriptor.html#a3b5b267aa7a17a4615dcc0cb4e590f6e", null ], + [ "init_grib2_descriptor", "interfaceip__grid__descriptor__mod_1_1init__descriptor.html#a6702c4bf3a3d914e5cd2fce8fba4f95c", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08.html b/ver-5.1.0/interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08.html new file mode 100644 index 00000000..51109273 --- /dev/null +++ b/ver-5.1.0/interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08.html @@ -0,0 +1,167 @@ + + + + + + + +NCEPLIBS-ip: ip_grid_descriptor_mod::operator(==) Interface Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_grid_descriptor_mod::operator(==) Interface Reference
    +
    +
    + + + + + +

    +Private Member Functions

    logical function is_same_grid (grid1, grid2)
     Test whether two grid descriptors are the same. More...
     
    +

    Detailed Description

    +
    +

    Definition at line 56 of file ip_grid_descriptor_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ is_same_grid()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    logical function ip_grid_descriptor_mod::operator(==)::is_same_grid (class(ip_grid_descriptor), intent(in) grid1,
    class(ip_grid_descriptor), intent(in) grid2 
    )
    +
    +private
    +
    + +

    Test whether two grid descriptors are the same.

    +
    Parameters
    + + + +
    [in]grid1An ip_grid_descriptor.
    [in]grid2Another ip_grid_descriptor.
    +
    +
    +
    Returns
    True if the grids are the same, false if they are not.
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 115 of file ip_grid_descriptor_mod.F90.

    + +

    References ip_grid_descriptor_mod::is_same_grid().

    + +
    +
    +
    The documentation for this interface was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08.js b/ver-5.1.0/interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08.js new file mode 100644 index 00000000..faf96850 --- /dev/null +++ b/ver-5.1.0/interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08.js @@ -0,0 +1,4 @@ +var interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08 = +[ + [ "is_same_grid", "interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08.html#a34e94f8aada186a3d22112a1ab31b53c", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/interfaceip__grid__factory__mod_1_1init__grid.html b/ver-5.1.0/interfaceip__grid__factory__mod_1_1init__grid.html new file mode 100644 index 00000000..38c67c54 --- /dev/null +++ b/ver-5.1.0/interfaceip__grid__factory__mod_1_1init__grid.html @@ -0,0 +1,166 @@ + + + + + + + +NCEPLIBS-ip: ip_grid_factory_mod::init_grid Interface Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_grid_factory_mod::init_grid Interface Reference
    +
    +
    + + + + + +

    +Private Member Functions

    subroutine init_grid_generic (grid, grid_desc)
     Initializes a polymorphic ip_grid object from an ip_grid_descriptor. More...
     
    +

    Detailed Description

    +
    +

    Definition at line 20 of file ip_grid_factory_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ init_grid_generic()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_grid_factory_mod::init_grid::init_grid_generic (class(ip_grid), intent(out), allocatable grid,
    class(ip_grid_descriptor), intent(in) grid_desc 
    )
    +
    +private
    +
    + +

    Initializes a polymorphic ip_grid object from an ip_grid_descriptor.

    +
    Parameters
    + + + +
    [out]gridGrid to initialize
    [in]grid_descGrid descriptor created from a grib1/grib2 template.
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 33 of file ip_grid_factory_mod.F90.

    + +

    References ip_grid_factory_mod::init_grid_grib1(), and ip_grid_factory_mod::init_grid_grib2().

    + +
    +
    +
    The documentation for this interface was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/interfaceip__grid__factory__mod_1_1init__grid.js b/ver-5.1.0/interfaceip__grid__factory__mod_1_1init__grid.js new file mode 100644 index 00000000..da9790e1 --- /dev/null +++ b/ver-5.1.0/interfaceip__grid__factory__mod_1_1init__grid.js @@ -0,0 +1,4 @@ +var interfaceip__grid__factory__mod_1_1init__grid = +[ + [ "init_grid_generic", "interfaceip__grid__factory__mod_1_1init__grid.html#a3fbbec3ddc7dfd918c2abc02e7a4cd72", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/interfaceip__grid__mod_1_1gdswzd__interface.html b/ver-5.1.0/interfaceip__grid__mod_1_1gdswzd__interface.html new file mode 100644 index 00000000..94444f08 --- /dev/null +++ b/ver-5.1.0/interfaceip__grid__mod_1_1gdswzd__interface.html @@ -0,0 +1,266 @@ + + + + + + + +NCEPLIBS-ip: ip_grid_mod::gdswzd_interface Interface Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_grid_mod::gdswzd_interface Interface Reference
    +
    +
    + + + + + +

    +Private Member Functions

    subroutine gdswzd_interface (self, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, xlon, xlat, ylon, ylat, area)
     Interface to gdswzd(). More...
     
    +

    Detailed Description

    +
    +

    Definition at line 125 of file ip_grid_mod.F90.

    +

    Constructor & Destructor Documentation

    + +

    ◆ gdswzd_interface()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ip_grid_mod::gdswzd_interface::gdswzd_interface (class(ip_grid), intent(in) self,
    integer, intent(in) iopt,
    integer, intent(in) npts,
    real, intent(in) fill,
    real, dimension(npts), intent(inout) xpts,
    real, dimension(npts), intent(inout) ypts,
    real, dimension(npts), intent(inout) rlon,
    real, dimension(npts), intent(inout) rlat,
    integer, intent(out) nret,
    real, dimension(npts), intent(out), optional crot,
    real, dimension(npts), intent(out), optional srot,
    real, dimension(npts), intent(out), optional xlon,
    real, dimension(npts), intent(out), optional xlat,
    real, dimension(npts), intent(out), optional ylon,
    real, dimension(npts), intent(out), optional ylat,
    real, dimension(npts), intent(out), optional area 
    )
    +
    +private
    +
    + +

    Interface to gdswzd().

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]selfip_grid_mod object.
    [in]ioptoption flag
      +
    • 1 to compute earth coords of selected grid coords
    • +
    • -1 to compute grid coords of selected earth coords
    • +
    +
    [in]nptsmaximum number of coordinates
    [in]fillfill value to set invalid output data (must be impossible value; suggested value: -9999.)
    [in,out]xpts(npts) grid x point coordinates if iopt>0
    [in,out]ypts(npts) grid y point coordinates if iopt>0
    [in,out]rlon(npts) earth longitudes in degrees e if iopt<0 (acceptable range: -360. to 360.)
    [in,out]rlat(npts) earth latitudes in degrees n if iopt<0 (acceptable range: -90. to 90.)
    [out]nretnumber of valid points computed
    [out]crotoptional (npts) clockwise vector rotation cosines
    [out]srotoptional (npts) clockwise vector rotation sines (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlonoptional (npts) dx/dlon in 1/degrees
    [out]xlatoptional (npts) dx/dlat in 1/degrees
    [out]ylonoptional (npts) dy/dlon in 1/degrees
    [out]ylatoptional (npts) dy/dlat in 1/degrees
    [out]areaoptional (npts) area weights in m**2 (proportional to the square of the map factor)
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 125 of file ip_grid_mod.F90.

    + +
    +
    +
    The documentation for this interface was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/interfaceip__grid__mod_1_1gdswzd__interface.js b/ver-5.1.0/interfaceip__grid__mod_1_1gdswzd__interface.js new file mode 100644 index 00000000..f9cb65f6 --- /dev/null +++ b/ver-5.1.0/interfaceip__grid__mod_1_1gdswzd__interface.js @@ -0,0 +1,4 @@ +var interfaceip__grid__mod_1_1gdswzd__interface = +[ + [ "gdswzd_interface", "interfaceip__grid__mod_1_1gdswzd__interface.html#af34c5d9da54a36322bb1a141217c6369", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/interfaceip__grid__mod_1_1init__grib1__interface.html b/ver-5.1.0/interfaceip__grid__mod_1_1init__grib1__interface.html new file mode 100644 index 00000000..4e1652e4 --- /dev/null +++ b/ver-5.1.0/interfaceip__grid__mod_1_1init__grib1__interface.html @@ -0,0 +1,164 @@ + + + + + + + +NCEPLIBS-ip: ip_grid_mod::init_grib1_interface Interface Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_grid_mod::init_grib1_interface Interface Reference
    +
    +
    + + + + + +

    +Private Member Functions

    subroutine init_grib1_interface (self, g1_desc)
     Init GRIB1 interface. More...
     
    +

    Detailed Description

    +
    +

    Definition at line 148 of file ip_grid_mod.F90.

    +

    Constructor & Destructor Documentation

    + +

    ◆ init_grib1_interface()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    ip_grid_mod::init_grib1_interface::init_grib1_interface (class(ip_grid), intent(inout) self,
    type(grib1_descriptor), intent(in) g1_desc 
    )
    +
    +private
    +
    + +

    Init GRIB1 interface.

    +
    Parameters
    + + + +
    [in,out]selfip_grid_mod object.
    [in]g1_descGRIB1 descriptor.
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 148 of file ip_grid_mod.F90.

    + +
    +
    +
    The documentation for this interface was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/interfaceip__grid__mod_1_1init__grib1__interface.js b/ver-5.1.0/interfaceip__grid__mod_1_1init__grib1__interface.js new file mode 100644 index 00000000..4ed1637f --- /dev/null +++ b/ver-5.1.0/interfaceip__grid__mod_1_1init__grib1__interface.js @@ -0,0 +1,4 @@ +var interfaceip__grid__mod_1_1init__grib1__interface = +[ + [ "init_grib1_interface", "interfaceip__grid__mod_1_1init__grib1__interface.html#a47e255b76f02fe58a1aebdadcc5894eb", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/interfaceip__grid__mod_1_1init__grib2__interface.html b/ver-5.1.0/interfaceip__grid__mod_1_1init__grib2__interface.html new file mode 100644 index 00000000..17696c6c --- /dev/null +++ b/ver-5.1.0/interfaceip__grid__mod_1_1init__grib2__interface.html @@ -0,0 +1,164 @@ + + + + + + + +NCEPLIBS-ip: ip_grid_mod::init_grib2_interface Interface Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_grid_mod::init_grib2_interface Interface Reference
    +
    +
    + + + + + +

    +Private Member Functions

    subroutine init_grib2_interface (self, g2_desc)
     Init GRIB2 interface. More...
     
    +

    Detailed Description

    +
    +

    Definition at line 162 of file ip_grid_mod.F90.

    +

    Constructor & Destructor Documentation

    + +

    ◆ init_grib2_interface()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    ip_grid_mod::init_grib2_interface::init_grib2_interface (class(ip_grid), intent(inout) self,
    type(grib2_descriptor), intent(in) g2_desc 
    )
    +
    +private
    +
    + +

    Init GRIB2 interface.

    +
    Parameters
    + + + +
    [in,out]selfip_grid_mod object.
    [in]g2_descGRIB2 descriptor.
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 162 of file ip_grid_mod.F90.

    + +
    +
    +
    The documentation for this interface was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/interfaceip__grid__mod_1_1init__grib2__interface.js b/ver-5.1.0/interfaceip__grid__mod_1_1init__grib2__interface.js new file mode 100644 index 00000000..64ba9730 --- /dev/null +++ b/ver-5.1.0/interfaceip__grid__mod_1_1init__grib2__interface.js @@ -0,0 +1,4 @@ +var interfaceip__grid__mod_1_1init__grib2__interface = +[ + [ "init_grib2_interface", "interfaceip__grid__mod_1_1init__grib2__interface.html#a25dcec4470effb9b20dfc7981c21ec6c", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/interfaceip__grid__mod_1_1operator_07_0a_0a_08.html b/ver-5.1.0/interfaceip__grid__mod_1_1operator_07_0a_0a_08.html new file mode 100644 index 00000000..40217261 --- /dev/null +++ b/ver-5.1.0/interfaceip__grid__mod_1_1operator_07_0a_0a_08.html @@ -0,0 +1,173 @@ + + + + + + + +NCEPLIBS-ip: ip_grid_mod::operator(==) Interface Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_grid_mod::operator(==) Interface Reference
    +
    +
    + +

    Check equality. + More...

    + + + + + +

    +Private Member Functions

    logical function is_same_grid (grid1, grid2)
     Compares two grids. More...
     
    +

    Detailed Description

    +

    Check equality.

    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 172 of file ip_grid_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ is_same_grid()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    logical function ip_grid_mod::operator(==)::is_same_grid (class(ip_grid), intent(in) grid1,
    class(ip_grid), intent(in) grid2 
    )
    +
    +private
    +
    + +

    Compares two grids.

    +
    Parameters
    + + + +
    [in]grid1An ip_grid
    [in]grid2Another ip_grid
    +
    +
    +
    Returns
    True if the grids are the same, false if not.
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 208 of file ip_grid_mod.F90.

    + +

    References ip_grid_descriptor_mod::is_same_grid().

    + +
    +
    +
    The documentation for this interface was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/interfaceip__grid__mod_1_1operator_07_0a_0a_08.js b/ver-5.1.0/interfaceip__grid__mod_1_1operator_07_0a_0a_08.js new file mode 100644 index 00000000..ef540651 --- /dev/null +++ b/ver-5.1.0/interfaceip__grid__mod_1_1operator_07_0a_0a_08.js @@ -0,0 +1,4 @@ +var interfaceip__grid__mod_1_1operator_07_0a_0a_08 = +[ + [ "is_same_grid", "interfaceip__grid__mod_1_1operator_07_0a_0a_08.html#a0303cd13db74e096af7f77200ef09c6b", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/interfaceipolates__mod_1_1ipolates.html b/ver-5.1.0/interfaceipolates__mod_1_1ipolates.html new file mode 100644 index 00000000..07b76568 --- /dev/null +++ b/ver-5.1.0/interfaceipolates__mod_1_1ipolates.html @@ -0,0 +1,1221 @@ + + + + + + + +NCEPLIBS-ip: ipolates_mod::ipolates Interface Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ipolates_mod::ipolates Interface Reference
    +
    +
    + + + + + + + + + + + + + + +

    +Private Member Functions

    subroutine ipolates_grib1 (ip, ipopt, kgdsi, kgdso, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
     This subprogram interpolates scalar field from any grid to any grid given a grib1 Grid Descriptor Section. More...
     
    subroutine ipolates_grib1_single_field (ip, ipopt, kgdsi, kgdso, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
     Special case of ipolates_grib1 when interpolating a single field. More...
     
    subroutine ipolates_grib2 (IP, IPOPT, IGDTNUMI, IGDTMPLI, IGDTLENI, IGDTNUMO, IGDTMPLO, IGDTLENO, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     This subprogram interpolates scalar field from any grid to any grid given a grib2 descriptor. More...
     
    subroutine ipolates_grib2_single_field (IP, IPOPT, IGDTNUMI, IGDTMPLI, IGDTLENI, IGDTNUMO, IGDTMPLO, IGDTLENO, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Special case of ipolates_grib2 when interpolating a single field. More...
     
    +

    Detailed Description

    +
    +

    Definition at line 23 of file ipolates.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ ipolates_grib1()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ipolates_mod::ipolates::ipolates_grib1 (integer(c_int), intent(in) ip,
    integer(c_int), dimension(20), intent(in) ipopt,
    integer(c_int), dimension(200), intent(in) kgdsi,
    integer(c_int), dimension(200), intent(in) kgdso,
    integer(c_int), intent(in) mi,
    integer(c_int), intent(in) mo,
    integer(c_int), intent(in) km,
    integer(c_int), dimension(km), intent(in) ibi,
    logical(c_bool), dimension(mi,km), intent(in) li,
    real(c_double), dimension(mi,km), intent(in) gi,
    integer(c_int), intent(inout) no,
    real(c_double), dimension(mo), intent(inout) rlat,
    real(c_double), dimension(mo), intent(inout) rlon,
    integer(c_int), dimension(km), intent(out) ibo,
    logical(c_bool), dimension(mo,km), intent(out) lo,
    real(c_double), dimension(mo,km), intent(out) go,
    integer(c_int), intent(out) iret 
    )
    +
    +private
    +
    + +

    This subprogram interpolates scalar field from any grid to any grid given a grib1 Grid Descriptor Section.

    +

    Only horizontal interpolation is performed. The following interpolation methods are possible:

      +
    • (ip=0) bilinear
    • +
    • (ip=1) bicubic
    • +
    • (ip=2) neighbor
    • +
    • (ip=3) budget
    • +
    • (ip=4) spectral
    • +
    • (ip=6) neighbor-budget
    • +
    +

    Some of these methods have interpolation options and/or restrictions on the input or output grids, both of which are documented more fully in their respective subprograms.

    +

    The grids are defined by their grid description sections (passed in integer form as decoded by subprogram w3fi63).

    +

    The current code recognizes the following projections:

      +
    • (kgds(1)=000) equidistant cylindrical
    • +
    • (kgds(1)=001) mercator cylindrical
    • +
    • (kgds(1)=003) lambert conformal conical
    • +
    • (kgds(1)=004) gaussian cylindrical
    • +
    • (kgds(1)=005) polar stereographic azimuthal
    • +
    • (kgds(1)=203) rotated equidistant cylindrical - e-stagger
    • +
    • (kgds(1)=205) rotated equidistant cylindrical - b-stagger
    • +
    +

    Where kgds could be either input kgdsi or output kgdso.

    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned.

    +

    On the other hand, the output can be a set of station points if kgdso(1)<0, in which case the number of points and their latitudes and longitudes must be input. for the budget approach, a subsection of the grid may be output by subtracting kgdso(1) from 255 and passing in the latitudes and longitudes of the points. Input bitmaps will be interpolated to output bitmaps.

    +

    Output bitmaps will also be created when the output grid extends outside of the domain of the input grid. the output field is set to 0 where the output bitmap is off.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + +
    ipInterpolation method
      +
    • ip = BILINEAR_INTERP_ID = 0 for bilinear
    • +
    • ip = BICUBIC_INTERP_ID = 1 for bicubic
    • +
    • ip = NEIGHBOR_INTERP_ID = 2 for neighbor;
    • +
    • ip = BUDGET_INTERP_ID = 3 for budget;
    • +
    • ip = SPECTRAL_INTERP_ID = 4 for spectral;
    • +
    • ip = NEIGHBOR_BUDGET_INTERP_ID = 6 for neighbor-budget
    • +
    +
    ipoptInterpolation options
      +
    • ip=0 (bilinear): (No options)
    • +
    • ip=1 Cbicubic): constraint option
    • +
    • ip=2 (neighbor): (No options)
    • +
    • ip=3 (budget): Number in radius, radius weights, search radius
    • +
    • ip=4 (spectral): Spectral shape, spectral truncation
    • +
    • ip=6 (neighbor-budget): Number in radius, radius weights ...)
    • +
    +
    [in]kgdsiInput gds parameters as decoded by w3fi63.
    [in]kgdsoOutput gds parameters.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if respective ibi(k)=1).
    [in]giInput fields to interpolate.
    [out]noNumber of output points (only if kgdso(1)<0).
    [out]rlatOutput latitudes in degrees (if kgdso(1)<0).
    [out]rlonOutput longitudes in degrees (if kgdso(1)<0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]goOutput fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 1 Unrecognized interpolation method.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 1x Invalid bicubic method parameters.
    • +
    • 3x Invalid budget method parameters.
    • +
    • 4x Invalid spectral method parameters.
    • +
    +
    +
    +
    +
    Author
    Mark Iredell, Kyle Gerheiser
    + +

    Definition at line 293 of file ipolates.F90.

    + +

    References ipolates_mod::ipolates_grid().

    + +
    +
    + +

    ◆ ipolates_grib1_single_field()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ipolates_mod::ipolates::ipolates_grib1_single_field (integer(c_int), intent(in) ip,
    integer(c_int), dimension(20), intent(in) ipopt,
    integer(c_int), dimension(200), intent(in) kgdsi,
    integer(c_int), dimension(200), intent(in) kgdso,
    integer(c_int), intent(in) mi,
    integer(c_int), intent(in) mo,
    integer(c_int), intent(in) km,
    integer(c_int), intent(in) ibi,
    logical(c_bool), dimension(mi), intent(in) li,
    real(c_double), dimension(mi), intent(in) gi,
    integer(c_int), intent(inout) no,
    real(c_double), dimension(mo), intent(inout) rlat,
    real(c_double), dimension(mo), intent(inout) rlon,
    integer(c_int), intent(out) ibo,
    logical(c_bool), dimension(mo), intent(out) lo,
    real(c_double), dimension(mo), intent(out) go,
    integer(c_int), intent(out) iret 
    )
    +
    +private
    +
    + +

    Special case of ipolates_grib1 when interpolating a single field.

    +

    Removes the km dimension of input arrays so scalars can be passed to ibi/ibo.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + +
    ipInterpolation method
      +
    • ip = BILINEAR_INTERP_ID = 0 for bilinear
    • +
    • ip = BICUBIC_INTERP_ID = 1 for bicubic
    • +
    • ip = NEIGHBOR_INTERP_ID = 2 for neighbor;
    • +
    • ip = BUDGET_INTERP_ID = 3 for budget;
    • +
    • ip = SPECTRAL_INTERP_ID = 4 for spectral;
    • +
    • ip = NEIGHBOR_BUDGET_INTERP_ID = 6 for neighbor-budget
    • +
    +
    ipoptInterpolation options
      +
    • ip=0 (bilinear): (No options)
    • +
    • ip=1 Cbicubic): constraint option
    • +
    • ip=2 (neighbor): (No options)
    • +
    • ip=3 (budget): Number in radius, radius weights, search radius
    • +
    • ip=4 (spectral): Spectral shape, spectral truncation
    • +
    • ip=6 (neighbor-budget): Number in radius, radius weights ...)
    • +
    +
    [in]kgdsiInput gds parameters as decoded by w3fi63.
    [in]kgdsoOutput gds parameters.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if respective ibi(k)=1).
    [in]giInput fields to interpolate.
    [out]noNumber of output points (only if kgdso(1)<0).
    [out]rlatOutput latitudes in degrees (if kgdso(1)<0).
    [out]rlonOutput longitudes in degrees (if kgdso(1)<0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]goOutput fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 1 Unrecognized interpolation method.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 1x Invalid bicubic method parameters.
    • +
    • 3x Invalid budget method parameters.
    • +
    • 4x Invalid spectral method parameters.
    • +
    +
    +
    +
    +
    Date
    Jan 2022
    +
    Author
    Kyle Gerheiser
    + +

    Definition at line 158 of file ipolates.F90.

    + +

    References ipolates_mod::ipolates_grid().

    + +
    +
    + +

    ◆ ipolates_grib2()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ipolates_mod::ipolates::ipolates_grib2 (integer(c_int), intent(in) IP,
    integer(c_int), dimension(20), intent(in) IPOPT,
    integer(c_int), intent(in) IGDTNUMI,
    integer(c_int), dimension(igdtleni), intent(in) IGDTMPLI,
    integer(c_int), intent(in) IGDTLENI,
    integer(c_int), intent(in) IGDTNUMO,
    integer(c_int), dimension(igdtleno), intent(in) IGDTMPLO,
    integer(c_int), intent(in) IGDTLENO,
    integer(c_int), intent(in) MI,
    integer(c_int), intent(in) MO,
    integer(c_int), intent(in) KM,
    integer(c_int), dimension(km), intent(in) IBI,
    logical(c_bool), dimension(mi,km), intent(in) LI,
    real(c_double), dimension(mi,km), intent(in) GI,
    integer(c_int), intent(out) NO,
    real(c_double), dimension(mo), intent(inout) RLAT,
    real(c_double), dimension(mo), intent(inout) RLON,
    integer(c_int), dimension(km), intent(out) IBO,
    logical(c_bool), dimension(mo,km), intent(out) LO,
    real(c_double), dimension(mo,km), intent(out) GO,
    integer(c_int), intent(out) IRET 
    )
    +
    +private
    +
    + +

    This subprogram interpolates scalar field from any grid to any grid given a grib2 descriptor.

    +

    Wrapper for ipolates_grid which converts a grib1 descriptor into an ip_grid_descriptor, which is used to create an ip_grid. Only horizontal interpolation is performed.

    +

    The following interpolation methods are possible:

      +
    • (ip=0) bilinear
    • +
    • (ip=1) bicubic
    • +
    • (ip=2) neighbor
    • +
    • (ip=3) budget
    • +
    • (ip=4) spectral
    • +
    • (ip=6) neighbor-budget
    • +
    +

    Some of these methods have interpolation options and/or restrictions on the input or output grids, both of which are documented more fully in their respective subprograms.

    +

    Input and output grids are defined by their grib 2 grid definition template as decoded by the ncep g2 library. The current code recognizes the following projections, where "igdtnumi/o" is the grib 2 grid defintion template number for the input and output grids, respectively:

      +
    • (igdtnumi/o=00) equidistant cylindrical
    • +
    • (igdtnumi/o=01) rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • (igdtnumi/o=10) mercator cylindrical
    • +
    • (igdtnumi/o=20) polar stereographic azimuthal
    • +
    • (igdtnumi/o=30) lambert conformal conical
    • +
    • (igdtnumi/o=40) gaussian cylindrical
    • +
    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned.

    +

    On the other hand, data may be interpolated to a set of station points if "igdtnumo"<0 (or subtracted from 255 for the budget option), in which case the number of points and their latitudes and longitudes must be input.

    +

    Input bitmaps will be interpolated to output bitmaps. Output bitmaps will also be created when the output grid extends outside of the domain of the input grid.

    +

    The output field is set to 0 where the output bitmap is off.

    +
    Parameters
    + + + + + +
    [in]ipInterpolation method
      +
    • ip=0 for bilinear
    • +
    • ip=1 for bicubic
    • +
    • ip=2 for neighbor;
    • +
    • ip=3 for budget;
    • +
    • ip=4 for spectral;
    • +
    • ip=6 for neighbor-budget
    • +
    +
    [in]ipoptInterpolation options
      +
    • ip=0: (No options)
    • +
    • ip=1: Constraint option
    • +
    • ip=2: (No options)
    • +
    • ip=3: Number in radius, radius weights, search radius
    • +
    • ip=4: Spectral shape, spectral truncation
    • +
    • ip=6: Number in radius, radius weights ...)
    • +
    +
    [in]igdtnumiGrid definition template number for the input grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure:
      +
    • 00 - EQUIDISTANT CYLINDRICAL
    • +
    • 01 - Rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • 10 - MERCATOR CYCLINDRICAL
    • +
    • 20 - POLAR STEREOGRAPHIC AZIMUTHAL
    • +
    • 30 - LAMBERT CONFORMAL CONICAL
    • +
    • 40 - GAUSSIAN EQUIDISTANT CYCLINDRICAL
    • +
    +
    [in]igdtmpliGrid definition template array input grid. Corresponds to the gfldigdtmpl component of the NCEPLIBS-g2 gridmod data structure
    +
    +
    +

    Section 3 Info:

    +

    All map projections:

      +
    • (1): SHAPE OF EARTH, OCTET 15
    • +
    • (2): SCALE FACTOR OF SPHERICAL EARTH RADIUS, OCTET 16
    • +
    • (3): SCALED VALUE OF RADIUS OF SPHERICAL EARTH, OCTETS 17-20
    • +
    • (4): SCALE FACTOR OF MAJOR AXIS OF ELLIPTICAL EARTH, OCTET 21
    • +
    • (5): SCALED VALUE OF MAJOR AXIS OF ELLIPTICAL EARTH, OCTETS 22-25
    • +
    • (6): SCALE FACTOR OF MINOR AXIS OF ELLIPTICAL EARTH, OCTET 26
    • +
    • (7): SCALED VALUE OF MINOR AXIS OF ELLIPTICAL EARTH, OCTETS 27-30
    • +
    +

    Equidistant Cyclindrical:

      +
    • (8): NUMBER OF POINTS ALONG A PARALLEL, OCTS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG A MERIDIAN, OCTS 35-38
    • +
    • (10): BASIC ANGLE OF INITIAL PRODUCTION DOMAIN, OCTETS 39-42.
    • +
    • (11): SUBDIVISIONS OF BASIC ANGLE, OCTETS 43-46
    • +
    • (12): LATITUDE OF FIRST GRID POINT, OCTETS 47-50
    • +
    • (13): LONGITUDE OF FIRST GRID POINT, OCTETS 51-54
    • +
    • (14): RESOLUTION AND COMPONENT FLAGS, OCTET 55
    • +
    • (15): LATITUDE OF LAST GRID POINT, OCTETS 56-59
    • +
    • (16): LONGITUDE OF LAST GRID POINT, OCTETS 60-63
    • +
    • (17): I-DIRECTION INCREMENT, OCTETS 64-67
    • +
    • (18): J-DIRECTION INCREMENT, OCTETS 68-71
    • +
    • (19): SCANNING MODE, OCTET 72
    • +
    +

    Mercator Cyclindrical:

      +
    • (8): NUMBER OF POINTS ALONG A PARALLEL, OCTS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG A MERIDIAN, OCTS 35-38
    • +
    • (10): LATITUDE OF FIRST POINT, OCTETS 39-42
    • +
    • (11): LONGITUDE OF FIRST POINT, OCTETS 43-46
    • +
    • (12): RESOLUTION AND COMPONENT FLAGS, OCTET 47
    • +
    • (13): TANGENT LATITUDE, OCTETS 48-51
    • +
    • (14): LATITUDE OF LAST POINT, OCTETS 52-55
    • +
    • (15): LONGITUDE OF LAST POINT, OCTETS 56-59
    • +
    • (16): SCANNING MODE FLAGS, OCTET 60
    • +
    • (17): ORIENTATION OF GRID, OCTETS 61-64
    • +
    • (18): LONGITUDINAL GRID LENGTH, OCTETS 65-68
    • +
    • (19): LATITUDINAL GRID LENGTH, OCTETS 69-72
    • +
    +

    Lambert Conformal Conical:

      +
    • (8): NUMBER OF POINTS ALONG X-AXIS, OCTS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG Y-AXIS, OCTS 35-38
    • +
    • (10): LATITUDE OF FIRST POINT, OCTETS 39-42
    • +
    • (11): LONGITUDE OF FIRST POINT, OCTETS 43-46
    • +
    • (12): RESOLUTION OF COMPONENT FLAG, OCTET 47
    • +
    • (13): LATITUDE WHERE GRID LENGTHS SPECIFIED,OCTETS 48-51
    • +
    • (14): LONGITUDE OF MERIDIAN THAT IS PARALLEL TO Y-AXIS, OCTETS 52-55
    • +
    • (15): X-DIRECTION GRID LENGTH, OCTETS 56-59
    • +
    • (16): Y-DIRECTION GRID LENGTH, OCTETS 60-63
    • +
    • (17): PROJECTION CENTER FLAG, OCTET 64
    • +
    • (18): SCANNING MODE, OCTET 65
    • +
    • (19): FIRST TANGENT LATITUDE FROM POLE, OCTETS 66-69
    • +
    • (20): SECOND TANGENT LATITUDE FROM POLE, OCTETS 70-73
    • +
    • (21): LATITUDE OF SOUTH POLE OF PROJECTION, OCTETS 74-77
    • +
    • (22): LONGITUDE OF SOUTH POLE OF PROJECTION, OCTETS 78-81
    • +
    +

    Gaussian Cylindrical:

      +
    • (8): NUMBER OF POINTS ALONG A PARALLEL, OCTS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG A MERIDIAN, OCTS 35-38
    • +
    • (10): BASIC ANGLE OF INITIAL PRODUCTION DOMAIN, OCTETS 39-42
    • +
    • (11): SUBDIVISIONS OF BASIC ANGLE, OCTETS 43-46
    • +
    • (12): LATITUDE OF FIRST GRID POINT, OCTETS 47-50
    • +
    • (13): LONGITUDE OF FIRST GRID POINT, OCTETS 51-54
    • +
    • (14): RESOLUTION AND COMPONENT FLAGS, OCTET 55
    • +
    • (15): LATITUDE OF LAST GRID POINT, OCTETS 56-59
    • +
    • (16): LONGITUDE OF LAST GRID POINT, OCTETS 60-63
    • +
    • (17): I-DIRECTION INCREMENT, OCTETS 64-67
    • +
    • (18): NUMBER OF PARALLELS BETWEEN POLE AND EQUATOR, OCTETS 68-71
    • +
    • (19): SCANNING MODE, OCTET 72
    • +
    +

    Polar Stereographic Azimuthal:

      +
    • (8): NUMBER OF POINTS ALONG X-AXIS, OCTETS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG Y-AXIS, OCTETS 35-38
    • +
    • (10): LATITUDE OF FIRST GRID POINT, OCTETS 39-42
    • +
    • (11): LONGITUDE OF FIRST GRID POINT, OCTETS 43-46
    • +
    • (12): RESOLUTION AND COMPONENT FLAGS, OCTET 47
    • +
    • (13): TRUE LATITUDE, OCTETS 48-51
    • +
    • (14): ORIENTATION LONGITUDE, OCTETS 52-55
    • +
    • (15): X-DIRECTION GRID LENGTH, OCTETS 56-59
    • +
    • (16): Y-DIRECTION GRID LENGTH, OCTETS 60-63
    • +
    • (17): PROJECTION CENTER FLAG, OCTET 64
    • +
    • (18): SCANNING MODE FLAGS, OCTET 65
    • +
    +

    Rotated Equidistant Cyclindrical:

      +
    • (8): NUMBER OF POINTS ALONG A PARALLEL, OCTS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG A MERIDIAN, OCTS 35-38
    • +
    • (10): BASIC ANGLE OF INITIAL PRODUCTION DOMAIN, OCTETS 39-42
    • +
    • (11): SUBDIVISIONS OF BASIC ANGLE, OCTETS 43-46
    • +
    • (12): LATITUDE OF FIRST GRID POINT, OCTETS 47-50
    • +
    • (13): LONGITUDE OF FIRST GRID POINT, OCTETS 51-54
    • +
    • (14): RESOLUTION AND COMPONENT FLAGS, OCTET 55
    • +
    • (15): LATITUDE OF LAST GRID POINT, OCTETS 56-59
    • +
    • (16): LONGITUDE OF LAST GRID POINT, OCTETS 60-63
    • +
    • (17): I-DIRECTION INCREMENT, OCTETS 64-67
    • +
    • (18): J-DIRECTION INCREMENT, OCTETS 68-71
    • +
    • (19): SCANNING MODE, OCTET 72
    • +
    • (20): LATITUDE OF SOUTHERN POLE OF PROJECTION, OCTETS 73-76
    • +
    • (21): LONGITUDE OF SOUTHERN POLE OF PROJECTION, OCTETS 77-80
    • +
    • (22): ANGLE OF ROTATION OF PROJECTION, OCTS 81-84
    • +
    +
    Parameters
    + + + + + + + + + + + + + + + + + + +
    [in]igdtleniNumber of elements of the grid definition template array for the input grid. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]igdtnumoGrid definition template number for the output grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure. See "igdtnumi" for specific template definitions. Note: igdtnumo<0 means interpolate to random station points.
    [in]igdtmploGrid definition template array for the output grid. Corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure. See "igdtmpli" for definition of array elements.
    [in]igdtlenoNumber of elements of the grid definition template array for the output grid. c Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if respective ibi(k)=1).
    [in]giInput fields to interpolate.
    [out]noNumber of output points (only if kgdso(1)<0).
    [out]rlatOutput latitudes in degrees (if kgdso(1)<0).
    [out]rlonOutput longitudes in degrees (if kgdso(1)<0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]goOutput fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 1 Unrecognized interpolation method.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 1x Invalid bicubic method parameters.
    • +
    • 3x Invalid budget method parameters.
    • +
    • 4x Invalid spectral method parameters.
    • +
    +
    +
    +
    +
    Note
    Examples demonstrating relative cpu costs. This example is interpolating 12 levels of temperatures from the 360 x 181 global grid (ncep grid 3) to the 93 x 68 hawaiian mercator grid (ncep grid 204).
    +

    The example times are for the c90. As a reference, the cp time for unpacking the global 12 temperature fields is 0.04 seconds.

    + + + + + + + + + + + + + + + + + + + + + +
    METHOD IP IPOPT CP SECONDS
    BILINEAR 0 0.03
    BICUBIC 1 0 0.07
    BICUBIC 1 1 0.07
    NEIGHBOR 2 0.01
    BUDGET 3 -1,-1 0.48
    SPECTRAL 4 0,40 0.22
    SPECTRAL 4 1,40 0.24
    SPECTRAL 4 0,-1 0.42
    N-BUDGET 6 -1,-1 0.15
    +

    The spectral interpolation is fast for the mercator grid. However, for some grids the spectral interpolation is slow.

    +

    The following example is interpolating 12 levels of temperatures from the 360 x 181 global grid (ncep grid 3) to the 93 x 65 conus lambert conformal grid (ncep grid 211).

    + + + + + + + + + + + + + + + + + + + + + +
    METHOD IP IPOPT CP SECONDS
    BILINEAR 0 0.03
    BICUBIC 1 0 0.07
    BICUBIC 1 1 0.07
    NEIGHBOR 2 0.01
    BUDGET 3 -1,-1 0.51
    SPECTRAL 4 0,40 3.94
    SPECTRAL 4 1,40 5.02
    SPECTRAL 4 0,-1 11.36
    N-BUDGET 6 -1,-1 0.18
    +
    Author
    Mark Iredell, Kyle Gerheiser
    + +

    Definition at line 587 of file ipolates.F90.

    + +

    References ipolates_mod::ipolates_grid().

    + +
    +
    + +

    ◆ ipolates_grib2_single_field()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ipolates_mod::ipolates::ipolates_grib2_single_field (integer(c_int), intent(in) IP,
    integer(c_int), dimension(20), intent(in) IPOPT,
    integer(c_int), intent(in) IGDTNUMI,
    integer(c_int), dimension(igdtleni), intent(in) IGDTMPLI,
    integer(c_int), intent(in) IGDTLENI,
    integer(c_int), intent(in) IGDTNUMO,
    integer(c_int), dimension(igdtleno), intent(in) IGDTMPLO,
    integer(c_int), intent(in) IGDTLENO,
    integer(c_int), intent(in) MI,
    integer(c_int), intent(in) MO,
    integer(c_int), intent(in) KM,
    integer(c_int), intent(in) IBI,
    logical(c_bool), dimension(mi), intent(in) LI,
    real(c_double), dimension(mi), intent(in) GI,
    integer(c_int), intent(out) NO,
    real(c_double), dimension(mo), intent(inout) RLAT,
    real(c_double), dimension(mo), intent(inout) RLON,
    integer(c_int), intent(out) IBO,
    logical(c_bool), dimension(mo), intent(out) LO,
    real(c_double), dimension(mo), intent(out) GO,
    integer(c_int), intent(out) IRET 
    )
    +
    +private
    +
    + +

    Special case of ipolates_grib2 when interpolating a single field.

    +

    Removes the km dimension of input arrays so scalars can be passed to ibi/ibo.

    +
    Parameters
    + + + + + +
    [in]ipInterpolation method
      +
    • ip=0 for bilinear
    • +
    • ip=1 for bicubic
    • +
    • ip=2 for neighbor;
    • +
    • ip=3 for budget;
    • +
    • ip=4 for spectral;
    • +
    • ip=6 for neighbor-budget
    • +
    +
    [in]ipoptInterpolation options
      +
    • ip=0: (No options)
    • +
    • ip=1: Constraint option
    • +
    • ip=2: (No options)
    • +
    • ip=3: Number in radius, radius weights, search radius
    • +
    • ip=4: Spectral shape, spectral truncation
    • +
    • ip=6: Number in radius, radius weights ...)
    • +
    +
    [in]igdtnumiGrid definition template number for the input grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure:
      +
    • 00 - EQUIDISTANT CYLINDRICAL
    • +
    • 01 - Rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • 10 - MERCATOR CYCLINDRICAL
    • +
    • 20 - POLAR STEREOGRAPHIC AZIMUTHAL
    • +
    • 30 - LAMBERT CONFORMAL CONICAL
    • +
    • 40 - GAUSSIAN EQUIDISTANT CYCLINDRICAL
    • +
    +
    [in]igdtmpliGrid definition template array input grid. Corresponds to the gfldigdtmpl component of the NCEPLIBS-g2 gridmod data structure
    +
    +
    +

    Section 3 Info:

    +

    All map projections:

      +
    • (1): SHAPE OF EARTH, OCTET 15
    • +
    • (2): SCALE FACTOR OF SPHERICAL EARTH RADIUS, OCTET 16
    • +
    • (3): SCALED VALUE OF RADIUS OF SPHERICAL EARTH, OCTETS 17-20
    • +
    • (4): SCALE FACTOR OF MAJOR AXIS OF ELLIPTICAL EARTH, OCTET 21
    • +
    • (5): SCALED VALUE OF MAJOR AXIS OF ELLIPTICAL EARTH, OCTETS 22-25
    • +
    • (6): SCALE FACTOR OF MINOR AXIS OF ELLIPTICAL EARTH, OCTET 26
    • +
    • (7): SCALED VALUE OF MINOR AXIS OF ELLIPTICAL EARTH, OCTETS 27-30
    • +
    +

    Equidistant Cyclindrical:

      +
    • (8): NUMBER OF POINTS ALONG A PARALLEL, OCTS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG A MERIDIAN, OCTS 35-38
    • +
    • (10): BASIC ANGLE OF INITIAL PRODUCTION DOMAIN, OCTETS 39-42.
    • +
    • (11): SUBDIVISIONS OF BASIC ANGLE, OCTETS 43-46
    • +
    • (12): LATITUDE OF FIRST GRID POINT, OCTETS 47-50
    • +
    • (13): LONGITUDE OF FIRST GRID POINT, OCTETS 51-54
    • +
    • (14): RESOLUTION AND COMPONENT FLAGS, OCTET 55
    • +
    • (15): LATITUDE OF LAST GRID POINT, OCTETS 56-59
    • +
    • (16): LONGITUDE OF LAST GRID POINT, OCTETS 60-63
    • +
    • (17): I-DIRECTION INCREMENT, OCTETS 64-67
    • +
    • (18): J-DIRECTION INCREMENT, OCTETS 68-71
    • +
    • (19): SCANNING MODE, OCTET 72
    • +
    +

    Mercator Cyclindrical:

      +
    • (8): NUMBER OF POINTS ALONG A PARALLEL, OCTS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG A MERIDIAN, OCTS 35-38
    • +
    • (10): LATITUDE OF FIRST POINT, OCTETS 39-42
    • +
    • (11): LONGITUDE OF FIRST POINT, OCTETS 43-46
    • +
    • (12): RESOLUTION AND COMPONENT FLAGS, OCTET 47
    • +
    • (13): TANGENT LATITUDE, OCTETS 48-51
    • +
    • (14): LATITUDE OF LAST POINT, OCTETS 52-55
    • +
    • (15): LONGITUDE OF LAST POINT, OCTETS 56-59
    • +
    • (16): SCANNING MODE FLAGS, OCTET 60
    • +
    • (17): ORIENTATION OF GRID, OCTETS 61-64
    • +
    • (18): LONGITUDINAL GRID LENGTH, OCTETS 65-68
    • +
    • (19): LATITUDINAL GRID LENGTH, OCTETS 69-72
    • +
    +

    Lambert Conformal Conical:

      +
    • (8): NUMBER OF POINTS ALONG X-AXIS, OCTS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG Y-AXIS, OCTS 35-38
    • +
    • (10): LATITUDE OF FIRST POINT, OCTETS 39-42
    • +
    • (11): LONGITUDE OF FIRST POINT, OCTETS 43-46
    • +
    • (12): RESOLUTION OF COMPONENT FLAG, OCTET 47
    • +
    • (13): LATITUDE WHERE GRID LENGTHS SPECIFIED,OCTETS 48-51
    • +
    • (14): LONGITUDE OF MERIDIAN THAT IS PARALLEL TO Y-AXIS, OCTETS 52-55
    • +
    • (15): X-DIRECTION GRID LENGTH, OCTETS 56-59
    • +
    • (16): Y-DIRECTION GRID LENGTH, OCTETS 60-63
    • +
    • (17): PROJECTION CENTER FLAG, OCTET 64
    • +
    • (18): SCANNING MODE, OCTET 65
    • +
    • (19): FIRST TANGENT LATITUDE FROM POLE, OCTETS 66-69
    • +
    • (20): SECOND TANGENT LATITUDE FROM POLE, OCTETS 70-73
    • +
    • (21): LATITUDE OF SOUTH POLE OF PROJECTION, OCTETS 74-77
    • +
    • (22): LONGITUDE OF SOUTH POLE OF PROJECTION, OCTETS 78-81
    • +
    +

    Gaussian Cylindrical:

      +
    • (8): NUMBER OF POINTS ALONG A PARALLEL, OCTS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG A MERIDIAN, OCTS 35-38
    • +
    • (10): BASIC ANGLE OF INITIAL PRODUCTION DOMAIN, OCTETS 39-42
    • +
    • (11): SUBDIVISIONS OF BASIC ANGLE, OCTETS 43-46
    • +
    • (12): LATITUDE OF FIRST GRID POINT, OCTETS 47-50
    • +
    • (13): LONGITUDE OF FIRST GRID POINT, OCTETS 51-54
    • +
    • (14): RESOLUTION AND COMPONENT FLAGS, OCTET 55
    • +
    • (15): LATITUDE OF LAST GRID POINT, OCTETS 56-59
    • +
    • (16): LONGITUDE OF LAST GRID POINT, OCTETS 60-63
    • +
    • (17): I-DIRECTION INCREMENT, OCTETS 64-67
    • +
    • (18): NUMBER OF PARALLELS BETWEEN POLE AND EQUATOR, OCTETS 68-71
    • +
    • (19): SCANNING MODE, OCTET 72
    • +
    +

    Polar Stereographic Azimuthal:

      +
    • (8): NUMBER OF POINTS ALONG X-AXIS, OCTETS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG Y-AXIS, OCTETS 35-38
    • +
    • (10): LATITUDE OF FIRST GRID POINT, OCTETS 39-42
    • +
    • (11): LONGITUDE OF FIRST GRID POINT, OCTETS 43-46
    • +
    • (12): RESOLUTION AND COMPONENT FLAGS, OCTET 47
    • +
    • (13): TRUE LATITUDE, OCTETS 48-51
    • +
    • (14): ORIENTATION LONGITUDE, OCTETS 52-55
    • +
    • (15): X-DIRECTION GRID LENGTH, OCTETS 56-59
    • +
    • (16): Y-DIRECTION GRID LENGTH, OCTETS 60-63
    • +
    • (17): PROJECTION CENTER FLAG, OCTET 64
    • +
    • (18): SCANNING MODE FLAGS, OCTET 65
    • +
    +

    Rotated Equidistant Cyclindrical:

      +
    • (8): NUMBER OF POINTS ALONG A PARALLEL, OCTS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG A MERIDIAN, OCTS 35-38
    • +
    • (10): BASIC ANGLE OF INITIAL PRODUCTION DOMAIN, OCTETS 39-42
    • +
    • (11): SUBDIVISIONS OF BASIC ANGLE, OCTETS 43-46
    • +
    • (12): LATITUDE OF FIRST GRID POINT, OCTETS 47-50
    • +
    • (13): LONGITUDE OF FIRST GRID POINT, OCTETS 51-54
    • +
    • (14): RESOLUTION AND COMPONENT FLAGS, OCTET 55
    • +
    • (15): LATITUDE OF LAST GRID POINT, OCTETS 56-59
    • +
    • (16): LONGITUDE OF LAST GRID POINT, OCTETS 60-63
    • +
    • (17): I-DIRECTION INCREMENT, OCTETS 64-67
    • +
    • (18): J-DIRECTION INCREMENT, OCTETS 68-71
    • +
    • (19): SCANNING MODE, OCTET 72
    • +
    • (20): LATITUDE OF SOUTHERN POLE OF PROJECTION, OCTETS 73-76
    • +
    • (21): LONGITUDE OF SOUTHERN POLE OF PROJECTION, OCTETS 77-80
    • +
    • (22): ANGLE OF ROTATION OF PROJECTION, OCTS 81-84
    • +
    +
    Parameters
    + + + + + + + + + + + + + + + + + + +
    [in]igdtleniNumber of elements of the grid definition template array for the input grid. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]igdtnumoGrid definition template number for the output grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure. See "igdtnumi" for specific template definitions. Note: igdtnumo<0 means interpolate to random station points.
    [in]igdtmploGrid definition template array for the output grid. Corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure. See "igdtmpli" for definition of array elements.
    [in]igdtlenoNumber of elements of the grid definition template array for the output grid. c Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if respective ibi(k)=1).
    [in]giInput fields to interpolate.
    [out]noNumber of output points (only if kgdso(1)<0).
    [out]rlatOutput latitudes in degrees (if kgdso(1)<0).
    [out]rlonOutput longitudes in degrees (if kgdso(1)<0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]goOutput fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 1 Unrecognized interpolation method.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 1x Invalid bicubic method parameters.
    • +
    • 3x Invalid budget method parameters.
    • +
    • 4x Invalid spectral method parameters.
    • +
    +
    +
    +
    +
    Author
    Eric Engle
    +
    Date
    November 2022
    + +

    Definition at line 808 of file ipolates.F90.

    + +

    References ipolates_mod::ipolates_grid().

    + +
    +
    +
    The documentation for this interface was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/interfaceipolates__mod_1_1ipolates.js b/ver-5.1.0/interfaceipolates__mod_1_1ipolates.js new file mode 100644 index 00000000..1b23bd7c --- /dev/null +++ b/ver-5.1.0/interfaceipolates__mod_1_1ipolates.js @@ -0,0 +1,7 @@ +var interfaceipolates__mod_1_1ipolates = +[ + [ "ipolates_grib1", "interfaceipolates__mod_1_1ipolates.html#a8ff62af694c759f29c332836ff66437b", null ], + [ "ipolates_grib1_single_field", "interfaceipolates__mod_1_1ipolates.html#afbc36431f96adfbbf552bc6137d0519d", null ], + [ "ipolates_grib2", "interfaceipolates__mod_1_1ipolates.html#a791ae0a257adcc3a789494489e28302b", null ], + [ "ipolates_grib2_single_field", "interfaceipolates__mod_1_1ipolates.html#a3a77b7de2dce406829a3b01689372240", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/interfaceipolatev__mod_1_1ipolatev.html b/ver-5.1.0/interfaceipolatev__mod_1_1ipolatev.html new file mode 100644 index 00000000..e968fdfa --- /dev/null +++ b/ver-5.1.0/interfaceipolatev__mod_1_1ipolatev.html @@ -0,0 +1,1277 @@ + + + + + + + +NCEPLIBS-ip: ipolatev_mod::ipolatev Interface Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ipolatev_mod::ipolatev Interface Reference
    +
    +
    + + + + + + + + + + + + + + +

    +Private Member Functions

    subroutine ipolatev_grib1 (ip, ipopt, kgdsi, kgdso, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
     This subprogram interpolates vector field from any grid to any grid given a grib1 Grid Descriptor Section. More...
     
    subroutine ipolatev_grib1_single_field (ip, ipopt, kgdsi, kgdso, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
     Special case of ipolatev_grib1 when interpolating a single field. More...
     
    subroutine ipolatev_grib2 (ip, ipopt, igdtnumi, igdtmpli, igdtleni, igdtnumo, igdtmplo, igdtleno, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
     This subprogram interpolates vector fields from any grid to any grid given a grib2 descriptor. More...
     
    subroutine ipolatev_grib2_single_field (ip, ipopt, igdtnumi, igdtmpli, igdtleni, igdtnumo, igdtmplo, igdtleno, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
     This subprogram interpolates vector fields from any grid to any grid given a grib2 descriptor. More...
     
    +

    Detailed Description

    +
    +

    Definition at line 21 of file ipolatev.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ ipolatev_grib1()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ipolatev_mod::ipolatev::ipolatev_grib1 (integer(c_int), intent(in) ip,
    integer(c_int), dimension(20), intent(in) ipopt,
    integer(c_int), dimension(200), intent(inout) kgdsi,
    integer(c_int), dimension(200), intent(inout) kgdso,
    integer(c_int), intent(in) mi,
    integer(c_int), intent(in) mo,
    integer(c_int), intent(in) km,
    integer(c_int), dimension(km), intent(in) ibi,
    logical(c_bool), dimension(mi,km), intent(in) li,
    real(c_double), dimension(mi,km), intent(in) ui,
    real(c_double), dimension(mi,km), intent(in) vi,
    integer(c_int), intent(out) no,
    real(c_double), dimension(mo), intent(inout) rlat,
    real(c_double), dimension(mo), intent(inout) rlon,
    real(c_double), dimension(mo), intent(inout) crot,
    real(c_double), dimension(mo), intent(inout) srot,
    integer(c_int), dimension(km), intent(out) ibo,
    logical(c_bool), dimension(mo,km), intent(out) lo,
    real(c_double), dimension(mo,km), intent(out) uo,
    real(c_double), dimension(mo,km), intent(out) vo,
    integer(c_int), intent(out) iret 
    )
    +
    +private
    +
    + +

    This subprogram interpolates vector field from any grid to any grid given a grib1 Grid Descriptor Section.

    +

    Only horizontal interpolation is performed. The following interpolation methods are possible:

      +
    • (ip=0) bilinear
    • +
    • (ip=1) bicubic
    • +
    • (ip=2) neighbor
    • +
    • (ip=3) budget
    • +
    • (ip=4) spectral
    • +
    • (ip=6) neighbor-budget
    • +
    +

    Some of these methods have interpolation options and/or restrictions on the input or output grids, both of which are documented more fully in their respective subprograms.

    +

    The grids are defined by their grid description sections (passed in integer form as decoded by subprogram w3fi63).

    +

    The current code recognizes the following projections:

      +
    • (kgds(1)=000) equidistant cylindrical
    • +
    • (kgds(1)=001) mercator cylindrical
    • +
    • (kgds(1)=003) lambert conformal conical
    • +
    • (kgds(1)=004) gaussian cylindrical
    • +
    • (kgds(1)=005) polar stereographic azimuthal
    • +
    • (kgds(1)=203) rotated equidistant cylindrical - e-stagger
    • +
    • (kgds(1)=205) rotated equidistant cylindrical - b-stagger
    • +
    +

    Where kgds could be either input kgdsi or output kgdso.

    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned.

    +

    On the other hand, the output can be a set of station points if kgdso(1)<0, in which case the number of points and their latitudes and longitudes must be input. for the budget approach, a subsection of the grid may be output by subtracting kgdso(1) from 255 and passing in the latitudes and longitudes of the points. Input bitmaps will be interpolated to output bitmaps.

    +

    Output bitmaps will also be created when the output grid extends outside of the domain of the input grid. the output field is set to 0 where the output bitmap is off.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + +
    ipInterpolation method
      +
    • ip = BILINEAR_INTERP_ID = 0 for bilinear
    • +
    • ip = BICUBIC_INTERP_ID = 1 for bicubic
    • +
    • ip = NEIGHBOR_INTERP_ID = 2 for neighbor;
    • +
    • ip = BUDGET_INTERP_ID = 3 for budget;
    • +
    • ip = SPECTRAL_INTERP_ID = 4 for spectral;
    • +
    • ip = NEIGHBOR_BUDGET_INTERP_ID = 6 for neighbor-budget
    • +
    +
    ipoptInterpolation options
      +
    • ip=0 (bilinear): (No options)
    • +
    • ip=1 Cbicubic): constraint option
    • +
    • ip=2 (neighbor): (No options)
    • +
    • ip=3 (budget): Number in radius, radius weights, search radius
    • +
    • ip=4 (spectral): Spectral shape, spectral truncation
    • +
    • ip=6 (neighbor-budget): Number in radius, radius weights ...)
    • +
    +
    [in]kgdsiInput gds parameters as decoded by w3fi63.
    [in]kgdsoOutput gds parameters.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if respective ibi(k)=1).
    [in]uiInput u-component fields to interpolate.
    [in]viInput v-component fields to interpolate.
    [out]noNumber of output points (only if kgdso(1)<0).
    [out]rlatOutput latitudes in degrees (if kgdso(1)<0).
    [out]rlonOutput longitudes in degrees (if kgdso(1)<0).
    [in,out]crotVector rotation cosines (if igdtnumo>=0).
    [in,out]srotVector rotation sines (if igdtnumo>=0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]uoOutput u-component fields interpolated.
    [out]voOutput v-component fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 1 Unrecognized interpolation method.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 1x Invalid bicubic method parameters.
    • +
    • 3x Invalid budget method parameters.
    • +
    • 4x Invalid spectral method parameters.
    • +
    +
    +
    +
    +
    Note
    Examples demonstrating relative cpu costs. This example is interpolating 12 levels of winds from the 360 x 181 global grid (ncep grid 3) to the 93 x 68 hawaiian mercator grid (ncep grid 204).
    +

    The example times are for the c90. As a reference, the cp time for unpacking the global 12 temperature fields is 0.07 seconds.

    + + + + + + + + + + + + + + + + + + + + + +
    METHOD IP IPOPT CP SECONDS
    BILINEAR 0 0.05
    BICUBIC 1 0 0.16
    BICUBIC 1 1 0.17
    NEIGHBOR 2 0.02
    BUDGET 3 -1,-1 0.94
    SPECTRAL 4 0,40 0.31
    SPECTRAL 4 1,40 0.33
    SPECTRAL 4 0,-1 0.59
    N-BUDGET 6 -1,-1 0.31
    +

    The spectral interpolation is fast for the mercator grid. However, for some grids the spectral interpolation is slow.

    +

    The following example is interpolating 12 levels of temperatures from the 360 x 181 global grid (ncep grid 3) to the 93 x 65 conus lambert conformal grid (ncep grid 211).

    + + + + + + + + + + + + + + + + + + + + + +
    METHOD IP IPOPT CP SECONDS
    BILINEAR 0 0.05
    BICUBIC 1 0 0.15
    BICUBIC 1 1 0.16
    NEIGHBOR 2 0.02
    BUDGET 3 -1,-1 0.92
    SPECTRAL 4 0,40 4.51
    SPECTRAL 4 1,40 5.77
    SPECTRAL 4 0,-1 12.60
    N-BUDGET 6 -1,-1 0.33
    +
    Date
    July 2021
    +
    Author
    Kyle Gerheiser
    + +

    Definition at line 565 of file ipolatev.F90.

    + +

    References ipolatev_mod::ipolatev_grid().

    + +
    +
    + +

    ◆ ipolatev_grib1_single_field()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ipolatev_mod::ipolatev::ipolatev_grib1_single_field (integer(c_int), intent(in) ip,
    integer(c_int), dimension(20), intent(in) ipopt,
    integer(c_int), dimension(200), intent(inout) kgdsi,
    integer(c_int), dimension(200), intent(inout) kgdso,
    integer(c_int), intent(in) mi,
    integer(c_int), intent(in) mo,
    integer(c_int), intent(in) km,
    integer(c_int), intent(in) ibi,
    logical(c_bool), dimension(mi), intent(in) li,
    real(c_double), dimension(mi), intent(in) ui,
    real(c_double), dimension(mi), intent(in) vi,
    integer(c_int), intent(out) no,
    real(c_double), dimension(mo), intent(inout) rlat,
    real(c_double), dimension(mo), intent(inout) rlon,
    real(c_double), dimension(mo), intent(inout) crot,
    real(c_double), dimension(mo), intent(inout) srot,
    integer(c_int), intent(out) ibo,
    logical(c_bool), dimension(mo), intent(out) lo,
    real(c_double), dimension(mo), intent(out) uo,
    real(c_double), dimension(mo), intent(out) vo,
    integer(c_int), intent(out) iret 
    )
    +
    +private
    +
    + +

    Special case of ipolatev_grib1 when interpolating a single field.

    +

    Removes the km dimension of input arrays so vectors can be passed to ibi/ibo.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + +
    ipInterpolation method
      +
    • ip = BILINEAR_INTERP_ID = 0 for bilinear
    • +
    • ip = BICUBIC_INTERP_ID = 1 for bicubic
    • +
    • ip = NEIGHBOR_INTERP_ID = 2 for neighbor;
    • +
    • ip = BUDGET_INTERP_ID = 3 for budget;
    • +
    • ip = SPECTRAL_INTERP_ID = 4 for spectral;
    • +
    • ip = NEIGHBOR_BUDGET_INTERP_ID = 6 for neighbor-budget
    • +
    +
    ipoptInterpolation options
      +
    • ip=0 (bilinear): (No options)
    • +
    • ip=1 Cbicubic): constraint option
    • +
    • ip=2 (neighbor): (No options)
    • +
    • ip=3 (budget): Number in radius, radius weights, search radius
    • +
    • ip=4 (spectral): Spectral shape, spectral truncation
    • +
    • ip=6 (neighbor-budget): Number in radius, radius weights ...)
    • +
    +
    [in]kgdsiInput gds parameters as decoded by w3fi63.
    [in]kgdsoOutput gds parameters.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if respective ibi(k)=1).
    [in]uiInput u-component fields to interpolate.
    [in]viInput v-component fields to interpolate.
    [out]noNumber of output points (only if kgdso(1)<0).
    [out]rlatOutput latitudes in degrees (if kgdso(1)<0).
    [out]rlonOutput longitudes in degrees (if kgdso(1)<0).
    [in,out]crotVector rotation cosines (if igdtnumo>=0).
    [in,out]srotVector rotation sines (if igdtnumo>=0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]uoOutput u-component fields interpolated.
    [out]voOutput v-component fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 1 Unrecognized interpolation method.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 1x Invalid bicubic method parameters.
    • +
    • 3x Invalid budget method parameters.
    • +
    • 4x Invalid spectral method parameters.
    • +
    +
    +
    +
    +
    Date
    Jan 2022
    +
    Author
    Kyle Gerheiser
    + +

    Definition at line 680 of file ipolatev.F90.

    + +

    References ipolatev_mod::ipolatev_grid().

    + +
    +
    + +

    ◆ ipolatev_grib2()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ipolatev_mod::ipolatev::ipolatev_grib2 (integer(c_int), intent(in) ip,
    integer(c_int), dimension(20), intent(in) ipopt,
    integer(c_int), intent(in) igdtnumi,
    integer(c_int), dimension(igdtleni), intent(in) igdtmpli,
    integer(c_int), intent(in) igdtleni,
    integer(c_int), intent(in) igdtnumo,
    integer(c_int), dimension(igdtleno), intent(in) igdtmplo,
    integer(c_int), intent(in) igdtleno,
    integer(c_int), intent(in) mi,
    integer(c_int), intent(in) mo,
    integer(c_int), intent(in) km,
    integer(c_int), dimension(km), intent(in) ibi,
    logical(c_bool), dimension(mi,km), intent(in) li,
    real(c_double), dimension(mi,km), intent(in) ui,
    real(c_double), dimension(mi,km), intent(in) vi,
    integer(c_int), intent(out) no,
    real(c_double), dimension(mo), intent(inout) rlat,
    real(c_double), dimension(mo), intent(inout) rlon,
    real(c_double), dimension(mo), intent(inout) crot,
    real(c_double), dimension(mo), intent(inout) srot,
    integer(c_int), dimension(km), intent(out) ibo,
    logical(c_bool), dimension(mo,km), intent(out) lo,
    real(c_double), dimension(mo,km), intent(out) uo,
    real(c_double), dimension(mo,km), intent(out) vo,
    integer(c_int), intent(out) iret 
    )
    +
    +private
    +
    + +

    This subprogram interpolates vector fields from any grid to any grid given a grib2 descriptor.

    +

    This is a wrapper for ipolates_grid which converts a grib1 descriptor into an ip_grid_descriptor, which is used to create an ip_grid. Only horizontal interpolation is performed.

    +

    The following interpolation methods are possible:

      +
    • (ip=0) bilinear
    • +
    • (ip=1) bicubic
    • +
    • (ip=2) neighbor
    • +
    • (ip=3) budget
    • +
    • (ip=4) spectral
    • +
    • (ip=6) neighbor-budget
    • +
    +

    Some of these methods have interpolation options and/or restrictions on the input or output grids, both of which are documented more fully in their respective subprograms.

    +

    Input and output grids are defined by their grib 2 grid definition template as decoded by the ncep g2 library. The current code recognizes the following projections, where "igdtnumi/o" is the grib 2 grid defintion template number for the input and output grids, respectively:

      +
    • (igdtnumi/o=00) equidistant cylindrical
    • +
    • (igdtnumi/o=01) rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • (igdtnumi/o=10) mercator cylindrical
    • +
    • (igdtnumi/o=20) polar stereographic azimuthal
    • +
    • (igdtnumi/o=30) lambert conformal conical
    • +
    • (igdtnumi/o=40) gaussian cylindrical
    • +
    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned.

    +

    On the other hand, data may be interpolated to a set of station points if "igdtnumo"<0 (or subtracted from 255 for the budget option), in which case the number of points and their latitudes and longitudes must be input.

    +

    Input bitmaps will be interpolated to output bitmaps. Output bitmaps will also be created when the output grid extends outside of the domain of the input grid.

    +

    The output field is set to 0 where the output bitmap is off.

    +
    Parameters
    + + + + + +
    [in]ipInterpolation method
      +
    • ip=0 for bilinear
    • +
    • ip=1 for bicubic
    • +
    • ip=2 for neighbor;
    • +
    • ip=3 for budget;
    • +
    • ip=4 for spectral;
    • +
    • ip=6 for neighbor-budget
    • +
    +
    [in]ipoptInterpolation options
      +
    • ip=0: (No options)
    • +
    • ip=1: Constraint option
    • +
    • ip=2: (No options)
    • +
    • ip=3: Number in radius, radius weights, search radius
    • +
    • ip=4: Spectral shape, spectral truncation
    • +
    • ip=6: Number in radius, radius weights ...)
    • +
    +
    [in]igdtnumiGrid definition template number for the input grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure:
      +
    • 00 - Equidistant Cylindrical
    • +
    • 01 - Rotated Equidistant cylindrical. "e" and non-"e" staggered
    • +
    • 10 - Mercator Cyclindrical
    • +
    • 20 - Polar Stereographic azimuthal
    • +
    • 30 - Lambert Conformal Conical
    • +
    • 40 - Gaussian Equidistant Cyclindrical
    • +
    +
    [in]igdtmpliGrid definition template array input grid. Corresponds to the gfldigdtmpl component of the NCEPLIBS-g2 gridmod data structure
    +
    +
    +

    Section 3 Info:

    +

    All map projections:

      +
    1. Shape of earth, octet 15.
    2. +
    3. Scale factor of spherical earth radius, octet 16.
    4. +
    5. Scaled value of radius of spherical earth, octets 17-20.
    6. +
    7. Scale factor of major axis of elliptical earth, octet 21.
    8. +
    9. Scaled value of major axis of elliptical earth, octets 22-25.
    10. +
    11. Scale factor of minor axis of elliptical earth, octet 26. 7: Scaled value of minor axis of elliptical earth, octets 27-30.
    12. +
    +

    Equidistant Cyclindrical:

      +
    1. Number of points along a parallel, octs 31-34.
    2. +
    3. Number of points along a meridian, octs 35-38.
    4. +
    5. Basic angle of initial production domain, octets 39-42.
    6. +
    7. Subdivisions of basic angle, octets 43-46.
    8. +
    9. Latitude of first grid point, octets 47-50.
    10. +
    11. Longitude of first grid point, octets 51-54.
    12. +
    13. Resolution and component flags, octet 55.
    14. +
    15. Latitude of last grid point, octets 56-59.
    16. +
    17. Longitude of last grid point, octets 60-63.
    18. +
    19. i-direction increment, octets 64-67.
    20. +
    21. j-direction increment, octets 68-71.
    22. +
    23. Scanning mode, octet 72.
    24. +
    +

    Mercator Cyclindrical:

      +
    1. Number of points along a parallel, octs 31-34.
    2. +
    3. Number of points along a meridian, octs 35-38.
    4. +
    5. Latitude of first point, octets 39-42.
    6. +
    7. Longitude of first point, octets 43-46.
    8. +
    9. Resolution and component flags, octet 47.
    10. +
    11. Tangent latitude, octets 48-51.
    12. +
    13. Latitude of last point, octets 52-55.
    14. +
    15. Longitude of last point, octets 56-59.
    16. +
    17. Scanning mode flags, octet 60.
    18. +
    19. Orientation of grid, octets 61-64.
    20. +
    21. Longitudinal grid length, octets 65-68.
    22. +
    23. Latitudinal grid length, octets 69-72.
    24. +
    +

    Lambert Conformal Conical:

      +
    1. Number of points along x-axis, octs 31-34.
    2. +
    3. Number of points along y-axis, octs 35-38.
    4. +
    5. Latitude of first point, octets 39-42.
    6. +
    7. Longitude of first point, octets 43-46.
    8. +
    9. Resolution of component flag, octet 47.
    10. +
    11. Latitude where grid lengths specified,octets 48-51.
    12. +
    13. Longitude of meridian that is parallel to y-axis, octets 52-55.
    14. +
    15. x-direction grid length, octets 56-59.
    16. +
    17. y-direction grid length, octets 60-63.
    18. +
    19. Projection center flag, octet 64.
    20. +
    21. Scanning mode, octet 65.
    22. +
    23. First tangent latitude from pole, octets 66-69.
    24. +
    25. Second tangent latitude from pole, octets 70-73.
    26. +
    27. Latitude of south pole of projection, octets 74-77.
    28. +
    29. Longitude of south pole of projection, octets 78-81.
    30. +
    +

    Gaussian Cylindrical:

      +
    1. Number of points along a parallel, octs 31-34.
    2. +
    3. Number of points along a meridian, octs 35-38.
    4. +
    5. Basic angle of initial production domain, octets 39-42.
    6. +
    7. Subdivisions of basic angle, octets 43-46.
    8. +
    9. Latitude of first grid point, octets 47-50.
    10. +
    11. Longitude of first grid point, octets 51-54.
    12. +
    13. Resolution and component flags, octet 55.
    14. +
    15. Latitude of last grid point, octets 56-59.
    16. +
    17. Longitude of last grid point, octets 60-63.
    18. +
    19. i-direction increment, octets 64-67.
    20. +
    21. Number of parallels between pole and equator, octets 68-71.
    22. +
    23. Scanning mode, octet 72.
    24. +
    +

    Polar Stereographic Azimuthal:

      +
    1. Number of points along x-axis, octets 31-34.
    2. +
    3. Number of points along y-axis, octets 35-38.
    4. +
    5. Latitude of first grid point, octets 39-42.
    6. +
    7. Longitude of first grid point, octets 43-46.
    8. +
    9. Resolution and component flags, octet 47.
    10. +
    11. True latitude, octets 48-51.
    12. +
    13. Orientation longitude, octets 52-55.
    14. +
    15. x-direction grid length, octets 56-59.
    16. +
    17. y-direction grid length, octets 60-63.
    18. +
    19. Projection center flag, octet 64.
    20. +
    21. Scanning mode flags, octet 65.
    22. +
    +

    Rotated Equidistant Cyclindrical:

      +
    1. Number of points along a parallel, octs 31-34.
    2. +
    3. Number of points along a meridian, octs 35-38.
    4. +
    5. Basic angle of initial production domain, octets 39-42.
    6. +
    7. Subdivisions of basic angle, octets 43-46.
    8. +
    9. Latitude of first grid point, octets 47-50.
    10. +
    11. Longitude of first grid point, octets 51-54.
    12. +
    13. Resolution and component flags, octet 55.
    14. +
    15. Latitude of last grid point, octets 56-59.
    16. +
    17. Longitude of last grid point, octets 60-63.
    18. +
    19. i-direction increment, octets 64-67.
    20. +
    21. j-direction increment, octets 68-71.
    22. +
    23. Scanning mode, octet 72.
    24. +
    25. Latitude of southern pole of projection, octets 73-76.
    26. +
    27. Longitude of southern pole of projection, octets 77-80.
    28. +
    29. Angle of rotation of projection, octs 81-84.
    30. +
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + +
    [in]igdtleniNumber of elements of the grid definition template array for the input grid. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]igdtnumoGrid definition template number for the output grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure. See "igdtnumi" for specific template definitions. Note: igdtnumo<0 means interpolate to random station points.
    [in]igdtmploGrid definition template array for the output grid. Corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure. See "igdtmpli" for definition of array elements.
    [in]igdtlenoNumber of elements of the grid definition template array for the output grid. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if respective ibi(k)=1).
    [in]uiInput u-component fields to interpolate.
    [in]viInput v-component fields to interpolate.
    [out]noNumber of output points (only if kgdso(1)<0).
    [in,out]rlatOutput latitudes in degrees (if kgdso(1)<0).
    [in,out]rlonOutput longitudes in degrees (if kgdso(1)<0).
    [in,out]crotVector rotation cosines (if igdtnumo>=0).
    [in,out]srotVector rotation sines (if igdtnumo>=0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]uoOutput u-component fields interpolated.
    [out]voOutput v-component fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 1 Unrecognized interpolation method.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 1x Invalid bicubic method parameters.
    • +
    • 3x Invalid budget method parameters.
    • +
    • 4x Invalid spectral method parameters.
    • +
    +
    +
    +
    +
    Note
    Examples demonstrating relative cpu costs. This example is interpolating 12 levels of winds from the 360 x 181 global grid (ncep grid 3) to the 93 x 68 hawaiian mercator grid (ncep grid 204).
    +

    The example times are for the c90. As a reference, the cp time for unpacking the global 12 wind fields is 0.07 seconds.

    + + + + + + + + + + + + + + + + + + + + + +
    METHOD IP IPOPT CP SECONDS
    BILINEAR 0 0.05
    BICUBIC 1 0 0.16
    BICUBIC 1 1 0.17
    NEIGHBOR 2 0.02
    BUDGET 3 -1,-1 0.94
    SPECTRAL 4 0,40 0.31
    SPECTRAL 4 1,40 0.33
    SPECTRAL 4 0,-1 0.59
    N-BUDGET 6 -1,-1 0.31
    +

    The spectral interpolation is fast for the mercator grid. However, for some grids the spectral interpolation is slow.

    +

    The following example is interpolating 12 levels of winds from the 360 x 181 global grid (ncep grid 3) to the 93 x 65 conus lambert conformal grid (ncep grid 211).

    + + + + + + + + + + + + + + + + + + + + + +
    METHOD IP IPOPT CP SECONDS
    BILINEAR 0 0.05
    BICUBIC 1 0 0.15
    BICUBIC 1 1 0.16
    NEIGHBOR 2 0.02
    BUDGET 3 -1,-1 0.92
    SPECTRAL 4 0,40 4.51
    SPECTRAL 4 1,40 5.77
    SPECTRAL 4 0,-1 12.60
    N-BUDGET 6 -1,-1 0.33
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 382 of file ipolatev.F90.

    + +

    References ipolatev_mod::ipolatev_grid().

    + +
    +
    + +

    ◆ ipolatev_grib2_single_field()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ipolatev_mod::ipolatev::ipolatev_grib2_single_field (integer(c_int), intent(in) ip,
    integer(c_int), dimension(20), intent(in) ipopt,
    integer(c_int), intent(in) igdtnumi,
    integer(c_int), dimension(igdtleni), intent(in) igdtmpli,
    integer(c_int), intent(in) igdtleni,
    integer(c_int), intent(in) igdtnumo,
    integer(c_int), dimension(igdtleno), intent(in) igdtmplo,
    integer(c_int), intent(in) igdtleno,
    integer(c_int), intent(in) mi,
    integer(c_int), intent(in) mo,
    integer(c_int), intent(in) km,
    integer(c_int), intent(in) ibi,
    logical(c_bool), dimension(mi), intent(in) li,
    real(c_double), dimension(mi), intent(in) ui,
    real(c_double), dimension(mi), intent(in) vi,
    integer(c_int), intent(out) no,
    real(c_double), dimension(mo), intent(inout) rlat,
    real(c_double), dimension(mo), intent(inout) rlon,
    real(c_double), dimension(mo), intent(inout) crot,
    real(c_double), dimension(mo), intent(inout) srot,
    integer(c_int), intent(out) ibo,
    logical(c_bool), dimension(mo), intent(out) lo,
    real(c_double), dimension(mo), intent(out) uo,
    real(c_double), dimension(mo), intent(out) vo,
    integer(c_int), intent(out) iret 
    )
    +
    +private
    +
    + +

    This subprogram interpolates vector fields from any grid to any grid given a grib2 descriptor.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    [in]ipInterpolation method
      +
    • ip=0 for bilinear
    • +
    • ip=1 for bicubic
    • +
    • ip=2 for neighbor;
    • +
    • ip=3 for budget;
    • +
    • ip=4 for spectral;
    • +
    • ip=6 for neighbor-budget
    • +
    +
    [in]ipoptInterpolation options
      +
    • ip=0: (No options)
    • +
    • ip=1: Constraint option
    • +
    • ip=2: (No options)
    • +
    • ip=3: Number in radius, radius weights, search radius
    • +
    • ip=4: Spectral shape, spectral truncation
    • +
    • ip=6: Number in radius, radius weights ...)
    • +
    +
    [in]igdtnumiGrid definition template number for the input grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure:
      +
    • 00 - Equidistant Cylindrical
    • +
    • 01 - Rotated Equidistant cylindrical. "e" and non-"e" staggered
    • +
    • 10 - Mercator Cyclindrical
    • +
    • 20 - Polar Stereographic azimuthal
    • +
    • 30 - Lambert Conformal Conical
    • +
    • 40 - Gaussian Equidistant Cyclindrical
    • +
    +
    [in]igdtmpliGrid definition template array input grid. Corresponds to the gfldigdtmpl component of the NCEPLIBS-g2 gridmod data structure
    [in]igdtleniNumber of elements of the grid definition template array for the input grid. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]igdtnumoGrid definition template number for the output grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure. See "igdtnumi" for specific template definitions. Note: igdtnumo<0 means interpolate to random station points.
    [in]igdtmploGrid definition template array for the output grid. Corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure. See "igdtmpli" for definition of array elements.
    [in]igdtlenoNumber of elements of the grid definition template array for the output grid. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if respective ibi(k)=1).
    [in]uiInput u-component fields to interpolate.
    [in]viInput v-component fields to interpolate.
    [out]noNumber of output points (only if kgdso(1)<0).
    [in,out]rlatOutput latitudes in degrees (if kgdso(1)<0).
    [in,out]rlonOutput longitudes in degrees (if kgdso(1)<0).
    [in,out]crotVector rotation cosines (if igdtnumo>=0).
    [in,out]srotVector rotation sines (if igdtnumo>=0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]uoOutput u-component fields interpolated.
    [out]voOutput v-component fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 1 Unrecognized interpolation method.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 1x Invalid bicubic method parameters.
    • +
    • 3x Invalid budget method parameters.
    • +
    • 4x Invalid spectral method parameters.
    • +
    +
    +
    +
    +
    Author
    Eric Engle
    +
    Date
    November 2022
    + +

    Definition at line 832 of file ipolatev.F90.

    + +

    References ipolatev_mod::ipolatev_grid().

    + +
    +
    +
    The documentation for this interface was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/interfaceipolatev__mod_1_1ipolatev.js b/ver-5.1.0/interfaceipolatev__mod_1_1ipolatev.js new file mode 100644 index 00000000..37dfd10b --- /dev/null +++ b/ver-5.1.0/interfaceipolatev__mod_1_1ipolatev.js @@ -0,0 +1,7 @@ +var interfaceipolatev__mod_1_1ipolatev = +[ + [ "ipolatev_grib1", "interfaceipolatev__mod_1_1ipolatev.html#ac721867d3d8e8adc11d56baba4702d53", null ], + [ "ipolatev_grib1_single_field", "interfaceipolatev__mod_1_1ipolatev.html#ad211b25631afd3fd7c04bbfba589a7c5", null ], + [ "ipolatev_grib2", "interfaceipolatev__mod_1_1ipolatev.html#ac1ec04e3119f285f0f3955f016926efe", null ], + [ "ipolatev_grib2_single_field", "interfaceipolatev__mod_1_1ipolatev.html#aa0af88a9ccef79a921680fe40ec30ccd", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget.html b/ver-5.1.0/interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget.html new file mode 100644 index 00000000..927d153f --- /dev/null +++ b/ver-5.1.0/interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget.html @@ -0,0 +1,529 @@ + + + + + + + +NCEPLIBS-ip: neighbor_budget_interp_mod::interpolate_neighbor_budget Interface Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    neighbor_budget_interp_mod::interpolate_neighbor_budget Interface Reference
    +
    +
    + + + + + + + + +

    +Private Member Functions

    subroutine interpolate_neighbor_budget_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Interpolate scalar fields (budget). More...
     
    subroutine interpolate_neighbor_budget_vector (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     Interpolate vector fields (budget). More...
     
    +

    Detailed Description

    +
    +

    Definition at line 17 of file neighbor_budget_interp_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ interpolate_neighbor_budget_scalar()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine neighbor_budget_interp_mod::interpolate_neighbor_budget::interpolate_neighbor_budget_scalar (integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    logical*1, dimension(mi,km), intent(in) LI,
    real, dimension(mi,km), intent(in) GI,
    integer, intent(out) NO,
    real, dimension(mo), intent(out) RLAT,
    real, dimension(mo), intent(out) RLON,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) GO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolate scalar fields (budget).

    +

    This subprogram performs budget interpolation from any grid to any grid for scalar fields.

    +

    The algorithm simply computes (weighted) averages of neighbor points arranged in a square box centered around each output grid point and stretching nearly halfway to each of the neighboring grid points.

    +

    Options allow choices of number of points in each radius from the center point (ipopt(1)) which defaults to 2 (if ipopt(1)=-1) meaning that 25 points will be averaged; further options are the respective weights for the radius points starting at the center point (ipopt(2:2+ipopt(1)) which defaults to all 1 (if ipopt(1)=-1 or ipopt(2)=-1).

    +

    Another option is the minimum percentage for mask, i.e. percent valid input data required to make output data, (ipopt(3+ipopt(1)) which defaults to 50 (if -1).

    +

    Only horizontal interpolation is performed.

    +

    The code recognizes the following projections, where "igdtnumi/o" is the grib 2 grid defintion template number for the input and output grids, respectively:

      +
    • (igdtnumi/o=00) equidistant cylindrical
    • +
    • (igdtnumi/o=01) rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • (igdtnumi/o=10) mercator cylindrical
    • +
    • (igdtnumi/o=20) polar stereographic azimuthal
    • +
    • (igdtnumi/o=30) lambert conformal conical
    • +
    • (igdtnumi/o=40) gaussian cylindrical
    • +
    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned. Input bitmaps will be interpolated to output bitmaps. Output bitmaps will also be created when the output grid extends outside of the domain of the input grid. The output field is set to 0 where the output bitmap is off.

    +

    +Program History Log

    + + + + + + + + + + + + + + + + + +
    Date Programmer Comments
    96-04-10 Iredell Initial
    96-10-04 Iredell neighbor points not bilinear interpolation
    1999-04-08 Iredell split ijkgds into two pieces
    2001-06-18 Iredell include minimum mask percentage option
    2015-01-27 Gayno replace calls to gdswiz with new merged version of gdswzd.
    2015-07-13 Gayno replace grib 1 kgds arrays with grib 2 grid definition template arrays.
    2023-05-04 Engle allow calls to GDSWZD for station points
    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]ipopt(20) interpolation options ipopt(1) is number of radius points (defaults to 2 if ipopt(1)=-1); ipopt(2:2+ipopt(1)) are respective weights (defaults to all 1 if ipopt(1)=-1 or ipopt(2)=-1). ipopt(3+ipopt(1)) is minimum percentage for mask (defaults to 50 if ipopt(3+ipopt(1)=-1)
    [in]grid_inThe input grid.
    [in]grid_outThe output grid.
    [in]miskip number between input grid fields if km>1 or dimension of input grid fields if km=1
    [in]moskip number between output grid fields if km>1 or dimension of output grid fields if km=1
    [in]kmnumber of fields to interpolate
    [in]ibi(km) input bitmap flags
    [in]li(mi,km) input bitmaps (if some ibi(k)=1)
    [in]gi(mi,km) input fields to interpolate
    [out]nonumber of output points
    [out]rlat(mo) output latitudes in degrees
    [out]rlon(mo) output longitudes in degrees
    [out]ibo(km) output bitmap flags
    [out]lo(mo,km) output bitmaps (always output)
    [out]go(mo,km) output fields interpolated
    [out]iretreturn code
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    • 31 invalid undefined output grid
    • +
    • 32 invalid budget method parameters
    • +
    +
    +
    +
    +
    Author
    Mark Iredell
    +
    Date
    96-04-10
    + +

    Definition at line 107 of file neighbor_budget_interp_mod.F90.

    + +

    References polfix_mod::polfixs().

    + +
    +
    + +

    ◆ interpolate_neighbor_budget_vector()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine neighbor_budget_interp_mod::interpolate_neighbor_budget::interpolate_neighbor_budget_vector (integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    logical*1, dimension(mi,km), intent(in) LI,
    real, dimension(mi,km), intent(in) UI,
    real, dimension(mi,km), intent(in) VI,
    integer, intent(out) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    real, dimension(mo), intent(out) CROT,
    real, dimension(mo), intent(out) SROT,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) UO,
    real, dimension(mo,km), intent(out) VO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolate vector fields (budget).

    +

    This subprogram performs budget interpolation from any grid to any grid for vector fields.

    +

    The algorithm simply computes (weighted) averages of neighbor points arranged in a square box centered around each output grid point and stretching nearly halfway to each of the neighboring grid points.

    +

    Options allow choices of number of points in each radius from the center point (ipopt(1)) which defaults to 2 (if ipopt(1)=-1) meaning that 25 points will be averaged; further options are the respective weights for the radius points starting at the center point (ipopt(2:2+ipopt(1)) which defaults to all 1 (if ipopt(1)=-1 or ipopt(2)=-1).

    +

    Another option is the minimum percentage for mask, i.e. percent valid input data required to make output data, (ipopt(3+ipopt(1)) which defaults to 50 (if -1).

    +

    Only horizontal interpolation is performed.

    +

    The input and output grids are defined by their grib 2 grid definition template as decoded by the ncep g2 library. the code recognizes the following projections, where "igdtnumi/o" is the grib 2 grid defintion template number for the input and output grids, respectively:

      +
    • (igdtnumi/o=00) equidistant cylindrical
    • +
    • (igdtnumi/o=01) rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • (igdtnumi/o=10) mercator cylindrical
    • +
    • (igdtnumi/o=20) polar stereographic azimuthal
    • +
    • (igdtnumi/o=30) lambert conformal conical
    • +
    • (igdtnumi/o=40) gaussian cylindrical
    • +
    +

    The input and output vectors are rotated so that they are either resolved relative to the defined grid in the direction of increasing x and y coordinates or resolved relative to easterly and northerly directions, as designated by their respective grid description sections.

    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned along with their vector rotation parameters. Input bitmaps will be interpolated to output bitmaps.

    +

    Output bitmaps will also be created when the output grid extends outside of the domain of the input grid. The output field is set to 0 where the output bitmap is off.

    +

    +Program History Log

    + + + + + + + + + + + + + + + + + +
    Date Programmer Comments
    96-04-10 Iredell Initial
    1999-04-08 Iredell split ijkgds into two pieces
    2001-06-18 Iredell include minimum mask percentage option
    2002-01-17 Iredell save data from last call for optimization
    2015-01-27 Gayno replace calls to gdswiz with new merged routine gdswzd.
    2015-07-13 Gayno replace grib 1 kgds arrays with grib 2 grid definition template arrays.
    2023-05-04 Engle allow calls to GDSWZD for station points
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + +
    [in]ipopt(20) interpolation options ipopt(1) is number of radius points (defaults to 2 if ipopt(1)=-1); ipopt(2:2+ipopt(1)) are respective weights (defaults to all 1 if ipopt(1)=-1 or ipopt(2)=-1). ipopt(3+ipopt(1)) is minimum percentage for mask (defaults to 50 if ipopt(3+ipopt(1)=-1)
    [in]grid_inThe input grid.
    [in]grid_outThe output grid.
    [in]miskip number between input grid fields if km>1 or dimension of input grid fields if km=1
    [in]moskip number between output grid fields if km>1 or dimension of output grid fields if km=1
    [in]kmnumber of fields to interpolate
    [in]ibi(km) input bitmap flags
    [in]li(mi,km) input bitmaps (if some ibi(k)=1)
    [in]ui(mi,km) input u-component fields to interpolate
    [in]vi(mi,km) input v-component fields to interpolate
    [out]nonumber of output points
    [out]rlat(mo) output latitudes in degrees
    [out]rlon(mo) output longitudes in degrees
    [out]crot(mo) vector rotation cosines
    [out]srot(mo) vector rotation sines (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]ibo(km) output bitmap flags
    [out]lo(mo,km) output bitmaps (always output)
    [out]uo(mo,km) output u-component fields interpolated
    [out]vo(mo,km) output v-component fields interpolated
    [out]iretreturn code
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    • 31 invalid undefined output grid
    • +
    • 32 invalid budget method parameters
    • +
    +
    +
    +
    +
    Author
    Mark Iredell
    +
    Date
    96-04-10
    +
    + +

    Definition at line 351 of file neighbor_budget_interp_mod.F90.

    + +

    References movect(), and polfix_mod::polfixv().

    + +
    +
    +
    The documentation for this interface was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget.js b/ver-5.1.0/interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget.js new file mode 100644 index 00000000..6e10186a --- /dev/null +++ b/ver-5.1.0/interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget.js @@ -0,0 +1,5 @@ +var interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget = +[ + [ "interpolate_neighbor_budget_scalar", "interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget.html#a96e4b145a4df6f4948b1d5ae2da6a71a", null ], + [ "interpolate_neighbor_budget_vector", "interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget.html#a573bd5ac43484aa6d051e58f37ff7c06", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/interfaceneighbor__interp__mod_1_1interpolate__neighbor.html b/ver-5.1.0/interfaceneighbor__interp__mod_1_1interpolate__neighbor.html new file mode 100644 index 00000000..feb994d3 --- /dev/null +++ b/ver-5.1.0/interfaceneighbor__interp__mod_1_1interpolate__neighbor.html @@ -0,0 +1,486 @@ + + + + + + + +NCEPLIBS-ip: neighbor_interp_mod::interpolate_neighbor Interface Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    neighbor_interp_mod::interpolate_neighbor Interface Reference
    +
    +
    + + + + + + + + +

    +Private Member Functions

    subroutine interpolate_neighbor_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Interpolate scalar fields (neighbor). More...
     
    subroutine interpolate_neighbor_vector (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     Interpolate vector fields (neighbor). More...
     
    +

    Detailed Description

    +
    +

    Definition at line 29 of file neighbor_interp_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ interpolate_neighbor_scalar()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine neighbor_interp_mod::interpolate_neighbor::interpolate_neighbor_scalar (integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    logical*1, dimension(mi,km), intent(in) LI,
    real, dimension(mi,km), intent(in) GI,
    integer, intent(inout) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) GO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolate scalar fields (neighbor).

    +

    This subprogram performs neighbor interpolation from any grid to any grid for scalar fields.

    +

    Options allow choosing the width of the grid square (ipopt(1)) to search for valid data, which defaults to 1 (if ipopt(1)=-1). Odd width squares are centered on the nearest input grid point; even width squares are centered on the nearest four input grid points. Squares are searched for valid data in a spiral pattern starting from the center. No searching is done where the output grid is outside the input grid. Only horizontal interpolation is performed.

    +

    The code recognizes the following projections, where "igdtnumi/o" is the grib 2 grid defintion template number for the input and output grids, respectively:

      +
    • (igdtnumi/o=00) equidistant cylindrical
    • +
    • (igdtnumi/o=01) rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • (igdtnumi/o=10) mercator cylindrical
    • +
    • (igdtnumi/o=20) polar stereographic azimuthal
    • +
    • (igdtnumi/o=30) lambert conformal conical
    • +
    • (igdtnumi/o=40) gaussian cylindrical
    • +
    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned. On the other hand, the output can be a set of station points if igdtnumo<0, in which case the number of points and their latitudes and longitudes must be input.

    +

    Input bitmaps will be interpolated to output bitmaps.

    +

    Output bitmaps will also be created when the output grid extends outside of the domain of the input grid. The output field is set to 0 where the output bitmap is off.

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]ipopt(20) interpolation options ipopt(1) is width of square to examine in spiral search (defaults to 1 if ipopt(1)=-1)
    [in]grid_inThe input grid.
    [in]grid_outThe output grid.
    [in]miskip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moskip number between output grid fields if km>1 or dimension of output grid fields if km=1
    [in]kmnumber of fields to interpolate
    [in]ibi(km) input bitmap flags
    [in]li(mi,km) input bitmaps (if some ibi(k)=1)
    [in]gi(mi,km) input fields to interpolate
    [in,out]nonumber of output points (only if igdtnumo<0)
    [in,out]rlat(no) output latitudes in degrees (if igdtnumo<0)
    [in,out]rlon(no) output longitudes in degrees (if igdtnumo<0)
    [out]ibo(km) output bitmap flags
    [out]lo(mo,km) output bitmaps (always output)
    [out]go(mo,km) output fields interpolated
    [out]iretreturn code
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    +
    +
    +
    +
    Author
    Mark Iredell
    +
    Date
    96-04-10
    +
    Author
    Eric Engle
    +
    Date
    23-05-04
    + +

    Definition at line 100 of file neighbor_interp_mod.F90.

    + +

    References polfix_mod::polfixs().

    + +
    +
    + +

    ◆ interpolate_neighbor_vector()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine neighbor_interp_mod::interpolate_neighbor::interpolate_neighbor_vector (integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    logical*1, dimension(mi,km), intent(in) LI,
    real, dimension(mi,km), intent(in) UI,
    real, dimension(mi,km), intent(in) VI,
    integer, intent(inout) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    real, dimension(mo), intent(inout) CROT,
    real, dimension(mo), intent(inout) SROT,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) UO,
    real, dimension(mo,km), intent(out) VO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolate vector fields (neighbor).

    +

    This subprogram performs neighbor interpolation from any grid to any grid for vector fields.

    +

    Options allow choosing the width of the grid square (ipopt(1)) to search for valid data, which defaults to 1 (IF IPOPT(1)=-1). Odd width squares are centered on the nearest input grid point; even width squares are centered on the nearest four input grid points.

    +

    Squares are searched for valid data in a spiral pattern starting from the center. no searching is done where the output grid is outside the input grid. Only horizontal interpolation is performed.

    +

    The input and output grids are defined by their grib 2 grid definition template as decoded by the ncep g2 library.

    +

    The code recognizes the following projections, where "igdtnumi/o" is the grib 2 grid defintion template number for the input and output grids, respectively:

      +
    • (igdtnumi/o=00) equidistant cylindrical
    • +
    • (igdtnumi/o=01) rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • (igdtnumi/o=10) mercator cylindrical
    • +
    • (igdtnumi/o=20) polar stereographic azimuthal
    • +
    • (igdtnumi/o=30) lambert conformal conical
    • +
    • (igdtnumi/o=40) gaussian cylindrical
    • +
    +

    The input and output vectors are rotated so that they are either resolved relative to the defined grid in the direction of increasing x and y coordinates or resolved relative to easterly and northerly directions, as designated by their respective grid definition sections.

    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned along with their vector rotation parameters. On the other hand, the output can be a set of station points if igdtnumo<0, in which case the number of points and their latitudes and longitudes must be input along with their vector rotation parameters.

    +

    Input bitmaps will be interpolated to output bitmaps. output bitmaps will also be created when the output grid extends outside of the domain of the input grid. The output field is set to 0 where the output bitmap is off.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + +
    [in]ipopt(20) interpolation options ipopt(1) is width of square to examine in spiral search (defaults to 1 if ipopt(1)=-1)
    [in]grid_inThe input grid.
    [in]grid_outThe output grid.
    [in]miskip number between input grid fields if km>1 or dimension of input grid fields if km=1
    [in]moskip number between output grid fields if km>1 or dimension of output grid fields if km=1
    [in]kmnumber of fields to interpolate
    [in]ibi(km) input bitmap flags
    [in]li(mi,km) input bitmaps (if some ibi(k)=1)
    [in]ui(mi,km) input u-component fields to interpolate
    [in]vi(mi,km) input v-component fields to interpolate
    [in,out]nonumber of output points (only if igdtnumo>=0)
    [in,out]rlat(mo) output latitudes in degrees (if igdtnumo<0)
    [in,out]rlon(mo) output longitudes in degrees (if igdtnumo<0)
    [in,out]crot(mo) vector rotation cosines (if igdtnumo<0)
    [in,out]srot(mo) vector rotation sines (if igdtnumo<0) (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]ibo(km) output bitmap flags
    [out]lo(mo,km) output bitmaps (always output)
    [out]uo(mo,km) output u-component fields interpolated
    [out]vo(mo,km) output v-component fields interpolated
    [out]iretreturn code
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    +
    +
    +
    +
    Author
    Mark Iredell
    +
    Date
    96-04-10
    +
    Author
    Eric Engle
    +
    Date
    23-05-04
    + +

    Definition at line 352 of file neighbor_interp_mod.F90.

    + +

    References movect(), and polfix_mod::polfixv().

    + +
    +
    +
    The documentation for this interface was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/interfaceneighbor__interp__mod_1_1interpolate__neighbor.js b/ver-5.1.0/interfaceneighbor__interp__mod_1_1interpolate__neighbor.js new file mode 100644 index 00000000..8c728bf7 --- /dev/null +++ b/ver-5.1.0/interfaceneighbor__interp__mod_1_1interpolate__neighbor.js @@ -0,0 +1,5 @@ +var interfaceneighbor__interp__mod_1_1interpolate__neighbor = +[ + [ "interpolate_neighbor_scalar", "interfaceneighbor__interp__mod_1_1interpolate__neighbor.html#a04ebb54535e67ff95c1d3d64b9cf6246", null ], + [ "interpolate_neighbor_vector", "interfaceneighbor__interp__mod_1_1interpolate__neighbor.html#a4662245e2744fd14628b48f23bf4f0a7", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/interfacespectral__interp__mod_1_1interpolate__spectral.html b/ver-5.1.0/interfacespectral__interp__mod_1_1interpolate__spectral.html new file mode 100644 index 00000000..5e1c2a0b --- /dev/null +++ b/ver-5.1.0/interfacespectral__interp__mod_1_1interpolate__spectral.html @@ -0,0 +1,428 @@ + + + + + + + +NCEPLIBS-ip: spectral_interp_mod::interpolate_spectral Interface Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    spectral_interp_mod::interpolate_spectral Interface Reference
    +
    +
    + + + + + + + + +

    +Private Member Functions

    subroutine interpolate_spectral_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Interpolate spectral scalar. More...
     
    subroutine interpolate_spectral_vector (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     Interpolate spectral vector. More...
     
    +

    Detailed Description

    +
    +

    Definition at line 20 of file spectral_interp_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ interpolate_spectral_scalar()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spectral_interp_mod::interpolate_spectral::interpolate_spectral_scalar (integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    real, dimension(mi,km), intent(in) GI,
    integer, intent(out) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) GO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolate spectral scalar.

    +
    Parameters
    + + + + + + + + + + + + + + + + +
    [in]ipoptinterpolation options; ipopt(1)=0 for triangular; ipopt(1)=1 for rhomboidal; ipopt(2) is truncation number (defaults to a sensible truncation if ipopt(2)=-1).
    [in]grid_ininput grid descriptor.
    [in]grid_outoutput grid descriptor.
    [in]MIskip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]MOskip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]KMnumber of fields to interpolate.
    [in]IBIinput bitmap flags (Must be all 0. Routine does not do bitmapped interpolation.)
    [in]GIinput fields to interpolate.
    [out]NOnumber of output points.
    [in,out]RLAToutput latitudes in degrees.
    [in,out]RLONoutput longitudes in degrees.
    [out]IBOoutput bitmap flags.
    [out]LOoutput bitmaps.
    [out]GOoutput fields interpolated.
    [out]IRETreturn code. 0/non-0 - successful/not successful.
    +
    +
    +
    Author
    Mark Iredell
    +
    Date
    96-04-10
    + +

    Definition at line 61 of file spectral_interp_mod.F90.

    + +
    +
    + +

    ◆ interpolate_spectral_vector()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spectral_interp_mod::interpolate_spectral::interpolate_spectral_vector (integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    real, dimension(mi,km), intent(in) UI,
    real, dimension(mi,km), intent(in) VI,
    integer, intent(out) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    real, dimension(mo), intent(out) CROT,
    real, dimension(mo), intent(out) SROT,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) UO,
    real, dimension(mo,km), intent(out) VO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolate spectral vector.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + +
    ipoptinterpolation options; ipopt(1)=0 for triangular; ipopt(1)=1 for rhomboidal; ipopt(2) is truncation number (defaults to a sensible truncation if ipopt(2)=-1).
    grid_ininput grid descriptor.
    grid_outoutput grid descriptor.
    MIskip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    MOskip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    KMnumber of fields to interpolate.
    IBIinput bitmap flags (Must be all 0. Routine does not do bitmapped interpolation.)
    UIinput u-component fields to interpolate.
    VIinput v-component fields to interpolate.
    NOnumber of output points.
    RLAToutput latitudes in degrees.
    RLONoutput longitudes in degrees.
    CROTvector rotation cosines.
    SROTvector rotation sines.
    IBOoutput bitmap flags.
    LOoutput bitmaps.
    UOoutput u-component fields interpolated.
    VOoutput v-component fields interpolated.
    IRETreturn code. 0/non-0 - successful/not successful.
    +
    +
    +
    Author
    Mark Iredell
    +
    Date
    96-04-10
    + +

    Definition at line 122 of file spectral_interp_mod.F90.

    + +

    References spectral_interp_mod::polatev4_grib1().

    + +
    +
    +
    The documentation for this interface was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/interfacespectral__interp__mod_1_1interpolate__spectral.js b/ver-5.1.0/interfacespectral__interp__mod_1_1interpolate__spectral.js new file mode 100644 index 00000000..3730bfea --- /dev/null +++ b/ver-5.1.0/interfacespectral__interp__mod_1_1interpolate__spectral.js @@ -0,0 +1,5 @@ +var interfacespectral__interp__mod_1_1interpolate__spectral = +[ + [ "interpolate_spectral_scalar", "interfacespectral__interp__mod_1_1interpolate__spectral.html#a79f600a26ecf256a8a13cf4bdbaf2ab1", null ], + [ "interpolate_spectral_vector", "interfacespectral__interp__mod_1_1interpolate__spectral.html#a9e939bbb3f7b214fee26c1e77764e487", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/interfacespectral__interp__mod_1_1polates4.html b/ver-5.1.0/interfacespectral__interp__mod_1_1polates4.html new file mode 100644 index 00000000..30c287ce --- /dev/null +++ b/ver-5.1.0/interfacespectral__interp__mod_1_1polates4.html @@ -0,0 +1,504 @@ + + + + + + + +NCEPLIBS-ip: spectral_interp_mod::polates4 Interface Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    spectral_interp_mod::polates4 Interface Reference
    +
    +
    + + + + + + + + +

    +Private Member Functions

    subroutine polates4_grib1 (IPOPT, KGDSI, KGDSO, MI, MO, KM, IBI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Interpolate scalar fields (spectral). More...
     
    subroutine polates4_grib2 (IPOPT, IGDTNUMI, IGDTMPLI, IGDTLENI, IGDTNUMO, IGDTMPLO, IGDTLENO, MI, MO, KM, IBI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Interpolate scalar fields (spectral). More...
     
    +

    Detailed Description

    +
    +

    Definition at line 25 of file spectral_interp_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ polates4_grib1()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spectral_interp_mod::polates4::polates4_grib1 (integer, dimension(20), intent(in) IPOPT,
    integer, dimension(200), intent(in) KGDSI,
    integer, dimension(200), intent(in) KGDSO,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    real, dimension(mi,km), intent(in) GI,
    integer NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) GO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolate scalar fields (spectral).

    +

    This subprogram performs spectral interpolation from any grid to any grid for scalar fields. It requires that the input fields be uniformly global.

    +

    Options allow choices between triangular shape (ipopt(1)=0) and rhomboidal shape (ipopt(1)=1) which has no default; a second option is the truncation (ipopt(2)) which defaults to a sensible truncation for the input grid (if opt(2)=-1).

    +
    Note
    If the output grid is not found in a special list, then the transform back to grid is not very fast. This special list contains global cylindrical grids, polar stereographic grids centered at the pole and mercator grids.
    +

    Only horizontal interpolation is performed. The grids are defined by their grid description sections (passed in integer form as decoded by subprogram w3fi63()).

    +

    The current code recognizes the following projections:

      +
    • kgds(1) = 000 equidistant cylindrical
    • +
    • kgds(1) = 001 mercator cylindrical
    • +
    • kgds(1) = 003 lambert conformal conical
    • +
    • kgds(1) = 004 gaussian cylindrical (spectral native)
    • +
    • kgds(1) = 005 polar stereographic azimuthal
    • +
    • kgds(1) = 203 rotated equidistant cylindrical (e-stagger)
    • +
    • kgds(1) = 205 rotated equidistant cylindrical (b-stagger)
    • +
    +

    Where kgds could be either input kgdsi or output kgdso. As an added bonus the number of output grid points and their latitudes and longitudes are also returned. On the other hand, the output can be a set of station points if kgdso(1)<0, in which case the number of points and their latitudes and longitudes must be input. Output bitmaps will not be created.

    +

    +Program History Log

    + + + + + + + + + +
    Date Programmer Comments
    96-04-10 Iredell Initial
    2001-06-18 Iredell improve detection of special fast transform
    2015-01-27 Gayno replace calls to gdswiz() with new merged version of gdswzd().
    +
    Parameters
    + + + + + + + + + + + + + + + + +
    [in]ipopt(20) interpolation options ipopt(1)=0 for triangular, ipopt(1)=1 for rhomboidal; ipopt(2) is truncation number (defaults to sensible if ipopt(2)=-1).
    [in]kgdsi(200) input gds parameters as decoded by w3fi63
    [in]kgdso(200) output gds parameters (kgdso(1)<0 implies random station points)
    [in]miskip number between input grid fields if km>1 or dimension of input grid fields if km=1
    [in]moskip number between output grid fields if km>1 or dimension of output grid fields if km=1
    [in]kmnumber of fields to interpolate
    [in]ibi(km) input bitmap flags (must be all 0)
    [in]gi(mi,km) input fields to interpolate
    [out]nonumber of output points (only if kgdso(1)<0)
    [out]rlat(no) output latitudes in degrees (if kgdso(1)<0)
    [out]rlon(no) output longitudes in degrees (if kgdso(1)<0)
    [out]ibo(km) output bitmap flags
    [out]lo(mo,km) output bitmaps (always output)
    [out]go(mo,km) output fields interpolated
    [out]iretreturn code
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    • 41 invalid nonglobal input grid
    • +
    • 42 invalid spectral method parameters
    • +
    +
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    + +

    Definition at line 560 of file spectral_interp_mod.F90.

    + +

    References sptrun(), sptrung(), sptrunm(), and sptruns().

    + +
    +
    + +

    ◆ polates4_grib2()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spectral_interp_mod::polates4::polates4_grib2 (integer, dimension(20), intent(in) IPOPT,
    integer, intent(in) IGDTNUMI,
    integer, dimension(igdtleni), intent(in) IGDTMPLI,
    integer, intent(in) IGDTLENI,
    integer, intent(in) IGDTNUMO,
    integer, dimension(igdtleno), intent(in) IGDTMPLO,
    integer, intent(in) IGDTLENO,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    real, dimension(mi,km), intent(in) GI,
    integer, intent(out) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) GO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolate scalar fields (spectral).

    +

    This subprogram performs spectral interpolation from any grid to any grid for scalar fields. It requires that the input fields be uniformly global. Options allow choices between triangular shape (ipopt(1)=0) and rhomboidal shape (ipopt(1)=1) which has no default; a second option is the truncation (ipopt(2)) which defaults to a sensible truncation for the input grid (if opt(2)=-1).

    +
    Note
    If the output grid is not found in a special list, then the transform back to grid is not very fast. This special list contains global cylindrical grids, polar stereographic grids centered at the pole and mercator grids.
    +

    Only horizontal interpolation is performed.

    +

    The code recognizes the following projections, where "igdtnumi/o" is the GRIB2 grid defintion template number for the input and onutput grids, respectively:

      +
    • igdtnumi/o = 00 equidistant cylindrical
    • +
    • igdtnumo = 01 rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • igdtnumo = 10 mercator cylindrical
    • +
    • igdtnumo = 20 polar stereographic azimuthal
    • +
    • igdtnumo = 30 lambert conformal conical
    • +
    • igdtnumi/o = 40 gaussian cylindrical
    • +
    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned. On the other hand, the output can be a set of station points if igdtnumo < 0, in which case the number of points and their latitudes and longitudes must be input. Output bitmaps will not be created.

    +

    +Program History Log

    + + + + + + + + + + + +
    Date Programmer Comments
    96-04-10 Iredell initial
    2001-06-18 Iredell improve detection of special fast transform
    2015-01-27 Gayno replace calls to gdswiz with new merged version of gdswzd.
    2015-07-13 Gayno convert to grib 2. replace grib 1 kgds arrays with grib 2 grid definition template arrays.
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + +
    [in]ipopt(20) interpolation options; ipopt(1)=0 for triangular, ipopt(1)=1 for rhomboidal; ipopt(2) is truncation number (defaults to sensible if ipopt(2)=-1).
    [in]igdtnumigrid definition template number - input grid. Corresponds to the gfldigdtnum component of the NCEPLIBS-g2 library gridmod data structure.
      +
    • 00 - equidistant cylindrical
    • +
    • 01 - rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • 10 - mercator cyclindrical
    • +
    • 20 - polar stereographic azimuthal
    • +
    • 30 - lambert conformal conical
    • +
    • 40 - gaussian equidistant cyclindrical
    • +
    +
    [in]igdtmpli(igdtleni) grid definition template array - input grid. corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure: (section 3 info). See comments in routine ipolates() for complete definition.
    [in]igdtleninumber of elements of the grid definition template array - input grid. corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]igdtnumogrid definition template number - output grid. Corresponds to the gfldigdtnum component of the NCEPLIBS-g2 library gridmod data structure. igdtnumo<0 means interpolate to random station points. Otherwise, same definition as igdtnumi.
    [in]igdtmplo(igdtleno) grid definition template array - output grid. Corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure (section 3 info). See comments in routine ipolates() for complete definition.
    [in]igdtlenonumber of elements of the grid definition template array - output grid. Corresponds to the gfldigdtlen component of the [NCEPLIBS-g2](https://github.com/NOAA-EMC/NCEPLIBS-g2) library gridmod data structure.
    [in]miskip number between input grid fields if km>1 or dimension of input grid fields if km=1
    [in]moskip number between output grid fields if km>1 or dimension of output grid fields if km=1
    [out]kmnumber of fields to interpolate
    [out]ibi(km) input bitmap flags (must be all 0)
    [out]gi(mi,km) input fields to interpolate
    [out]nonumber of output points (only if igdtnumo>=0)
    [out]rlat(mo) output latitudes in degrees (if igdtnumo<0)
    [out]rlon(mo) output longitudes in degrees (if igdtnumo<0)
    [out]ibo(km) output bitmap flags
    [out]lo(mo,km) output bitmaps (always output)
    [out]go(mo,km) output fields interpolated
    [out]iretreturn code
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    • 41 invalid nonglobal input grid
    • +
    • 42 invalid spectral method parameters
    • +
    +
    +
    +
    +

    !

    Author
    Mark Iredell
    +
    Date
    96-04-10
    + +

    Definition at line 255 of file spectral_interp_mod.F90.

    + +

    References earth_radius_mod::earth_radius(), sptrun(), sptrung(), sptrunm(), and sptruns().

    + +
    +
    +
    The documentation for this interface was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/interfacespectral__interp__mod_1_1polates4.js b/ver-5.1.0/interfacespectral__interp__mod_1_1polates4.js new file mode 100644 index 00000000..ab313a31 --- /dev/null +++ b/ver-5.1.0/interfacespectral__interp__mod_1_1polates4.js @@ -0,0 +1,5 @@ +var interfacespectral__interp__mod_1_1polates4 = +[ + [ "polates4_grib1", "interfacespectral__interp__mod_1_1polates4.html#a0be1315db4dce899083176b47b6ea6a4", null ], + [ "polates4_grib2", "interfacespectral__interp__mod_1_1polates4.html#a3fdc75851f1f741e715a1c3e1e4d89c9", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/interfacespectral__interp__mod_1_1polatev4.html b/ver-5.1.0/interfacespectral__interp__mod_1_1polatev4.html new file mode 100644 index 00000000..660d0edf --- /dev/null +++ b/ver-5.1.0/interfacespectral__interp__mod_1_1polatev4.html @@ -0,0 +1,562 @@ + + + + + + + +NCEPLIBS-ip: spectral_interp_mod::polatev4 Interface Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    spectral_interp_mod::polatev4 Interface Reference
    +
    +
    + + + + + + + + +

    +Private Member Functions

    subroutine polatev4_grib1 (IPOPT, KGDSI, KGDSO, MI, MO, KM, IBI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     Interpolate vector fields (spectral). More...
     
    subroutine polatev4_grib2 (IPOPT, IGDTNUMI, IGDTMPLI, IGDTLENI, IGDTNUMO, IGDTMPLO, IGDTLENO, MI, MO, KM, IBI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     Interpolate vector fields (spectral). More...
     
    +

    Detailed Description

    +
    +

    Definition at line 30 of file spectral_interp_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ polatev4_grib1()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spectral_interp_mod::polatev4::polatev4_grib1 (integer, dimension(20), intent(in) IPOPT,
    integer, dimension(200), intent(in) KGDSI,
    integer, dimension(200), intent(in) KGDSO,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    real, dimension(mi,km), intent(in) UI,
    real, dimension(mi,km), intent(in) VI,
    integer NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    real, dimension(mo), intent(out) CROT,
    real, dimension(mo), intent(out) SROT,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) UO,
    real, dimension(mo,km), intent(out) VO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolate vector fields (spectral).

    +

    This subprogram performs spectral interpolation from any grid to any grid for vector fields. It requires that the input fields be uniformly global. Options allow choices between triangular shape (ipopt(1)=0) and rhomboidal shape (ipopt(1)=1) which has no default; a second option is the truncation (ipopt(2)) which defaults to a sensible truncation for the input grid (if opt(2)=-1).

    +
    Note
    If the output grid is not found in a special list, then the transform back to grid is not very fast. This special list contains global cylindrical grids, polar stereographic grids centered at the pole and mercator grids.
    +

    Only horizontal interpolation is performed. The grids are defined by their grid description sections (passed in integer form as decoded by subprogram w3fi63).

    +

    The current code recognizes the following projections:

      +
    • (KGDS(1)=000) EQUIDISTANT CYLINDRICAL
    • +
    • (KGDS(1)=001) MERCATOR CYLINDRICAL
    • +
    • (KGDS(1)=003) LAMBERT CONFORMAL CONICAL
    • +
    • (KGDS(1)=004) GAUSSIAN CYLINDRICAL (SPECTRAL NATIVE)
    • +
    • (KGDS(1)=005) POLAR STEREOGRAPHIC AZIMUTHAL
    • +
    • (KGDS(1)=203) ROTATED EQUIDISTANT CYLINDRICAL (E-STAGGER)
    • +
    • (KGDS(1)=205) ROTATED EQUIDISTANT CYLINDRICAL (B-STAGGER)
    • +
    +

    Where kgds could be either input kgdsi or output kgdso.

    +

    The input and output vectors are rotated so that they are either resolved relative to the defined grid in the direction of increasing x and y coordinates or resolved relative to easterly and northerly directions, as designated by their respective grid description sections. As an added bonus the number of output grid points and their latitudes and longitudes are also returned along with their vector rotation parameters. On the other hand, the output can be a set of station points if kgdso(1)<0, in which case the number of points and their latitudes and longitudes must be input along with their vector rotation parameters.

    +

    Output bitmaps will only be created when the output grid extends outside of the domain of the input grid. The output field is set to 0 where the output bitmap is off.

    +

    +Program History Log

    + + + + + + + + + +
    Date Programmer Comments
    96-04-10 iredell initial.
    2001-06-18 iredell improve detection of special fast transform
    2015-01-27 gayno replace calls to gdswiz() with new merged routine gdswzd().
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + +
    [in]ipopt(20) interpolation options ipopt(1)=0 for triangular, ipopt(1)=1 for rhomboidal; ipopt(2) is truncation number (defaults to sensible if ipopt(2)=-1).
    [in]kgdsi(200) input gds parameters as decoded by w3fi63.
    [in]kgdso(200) output gds parameters (kgdso(1)<0 implies random station points).
    [in]miskip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moskip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmnumber of fields to interpolate
    [in]ibi(km) input bitmap flags (must be all 0)
    [in]ui(mi,km) input u-component fields to interpolate
    [in]vi(mi,km) input v-component fields to interpolate
    [out]nonumber of output points (only if kgdso(1)<0)
    [out]rlat(no) output latitudes in degrees (if kgdso(1)<0)
    [out]rlon(no) output longitudes in degrees (if kgdso(1)<0)
    [out]crot(no) vector rotation cosines (if kgdso(1)<0)
    [out]srot(no) vector rotation sines (if kgdso(1)<0) (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]ibo(km) output bitmap flags
    [out]lo(mo,km) output bitmaps (always output)
    [out]uo(mo,km) output u-component fields interpolated
    [out]vo(mo,km) output v-component fields interpolated
    [out]iretreturn code
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    • 41 invalid nonglobal input grid
    • +
    • 42 invalid spectral method parameters
    • +
    +
    +
    +
    +
    Author
    IREDELL
    +
    Date
    96-04-10
    + +

    Definition at line 1222 of file spectral_interp_mod.F90.

    + +

    References sptrungv(), sptrunmv(), sptrunsv(), and sptrunv().

    + +
    +
    + +

    ◆ polatev4_grib2()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spectral_interp_mod::polatev4::polatev4_grib2 (integer, dimension(20), intent(in) IPOPT,
    integer, intent(in) IGDTNUMI,
    integer, dimension(igdtleni), intent(in) IGDTMPLI,
    integer, intent(in) IGDTLENI,
    integer, intent(in) IGDTNUMO,
    integer, dimension(igdtleno), intent(in) IGDTMPLO,
    integer, intent(in) IGDTLENO,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    real, dimension(mi,km), intent(in) UI,
    real, dimension(mi,km), intent(in) VI,
    integer, intent(out) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    real, dimension(mo), intent(out) CROT,
    real, dimension(mo), intent(out) SROT,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) UO,
    real, dimension(mo,km), intent(out) VO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolate vector fields (spectral).

    +

    This subprogram performs spectral interpolation from any grid to any grid for vector fields. It requires that the input fields be uniformly global. Options allow choices between triangular shape (ipopt(1)=0) and rhomboidal shape (ipopt(1)=1) which has no default; a second option is the truncation (ipopt(2)) which defaults to a sensible truncation for the input grid (if opt(2)=-1).

    +
    Note
    If the output grid is not found in a special list, then the transform back to grid is not very fast. This special list contains global cylindrical grids, polar stereographic grids centered at the pole and mercator grids. Only horizontal interpolation is performed.
    +

    The input and output grids are defined by their grib 2 grid definition template as decoded by the ncep g2 library. The code recognizes the following projections, where "igdtnumi/o" is the grib 2 grid defintion template number for the input and output grids, respectively:

      +
    • igdtnumi/o=00 equidistant cylindrical
    • +
    • igdtnumo =01 rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • igdtnumo =10 mercator cylindrical
    • +
    • igdtnumo =20 polar stereographic azimuthal
    • +
    • igdtnumo =30 lambert conformal conical
    • +
    • igdtnumi/o=40 gaussian cylindrical
    • +
    +

    The input and output vectors are rotated so that they are either resolved relative to the defined grid in the direction of increasing x and y coordinates or resolved relative to easterly and northerly directions, as designated by their respective grid description sections.

    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned along with their vector rotation parameters. On the other hand, the output can be a set of station points if igdtnumo<0, in which case the number of points and their latitudes and longitudes must be input along with their vector rotation parameters.

    +

    Output bitmaps will only be created when the output grid extends outside of the domain of the input grid. the output field is set to 0 where the output bitmap is off.

    +

    +Program History Log

    + + + + + + + + + + + +
    Date Programmer Comments
    96-04-10 iredell initial
    2001-06-18 iredell improve detection of special fast transform
    2015-01-27 gayno replace calls to gdswiz() with new merged routine gdswzd().
    2015-07-13 gayno convert to grib 2. replace grib 1 kgds arrays with grib 2 grid definition template arrays.
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + + + +
    [in]ipopt(20) interpolation options ipopt(1)=0 for triangular, ipopt(1)=1 for rhomboidal; ipopt(2) is truncation number (defaults to sensible if ipopt(2)=-1).
    [in]igdtnumigrid definition template number - input grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure:
      +
    • 00 equidistant cylindrical
    • +
    • 01 rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • 10 mercator cyclindrical
    • +
    • 20 polar stereographic azimuthal
    • +
    • 30 lambert conformal conical
    • +
    • 40 gaussian equidistant cyclindrical
    • +
    +
    [in]igdtmpli(igdtleni) grid definition template array - input grid. corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure (section 3 info). see comments in routine ipolatev for complete definition.
    [in]igdtleninumber of elements of the grid definition template array - input grid. corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]igdtnumogrid definition template number - output grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure. igdtnumo<0 means interpolate to random station points. Otherwise, same definition as "igdtnumi".
    [in]igdtmplo(igdtleno) grid definition template array - output grid. corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure (section 3 info). see comments in routine ipolatev() for complete definition.
    [in]igdtlenonumber of elements of the grid definition template array - output grid. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]miskip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moskip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmnumber of fields to interpolate
    [in]ibi(km) input bitmap flags (must be all 0)
    [in]ui(mi,km) input u-component fields to interpolate
    [in]vi(mi,km) input v-component fields to interpolate
    [out]nonumber of output points (only if igdtnumo>=0)
    [in,out]rlat(mo) output latitudes in degrees (if igdtnumo<0)
    [in,out]rlon(mo) output longitudes in degrees (if igdtnumo<0)
    [in,out]crot(mo) vector rotation cosines (if igdtnumo<0)
    [in,out]srot(mo) vector rotation sines (if igdtnumo<0) (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]ibo(km) output bitmap flags
    [out]lo(mo,km) output bitmaps (always output)
    [out]uo(mo,km) output u-component fields interpolated
    [out]vo(mo,km) output v-component fields interpolated
    [out]iretreturn code
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    • 41 invalid nonglobal input grid
    • +
    • 42 invalid spectral method parameters
    • +
    +
    +
    +
    +
    Author
    IREDELL
    +
    Date
    96-04-10
    + +

    Definition at line 888 of file spectral_interp_mod.F90.

    + +

    References earth_radius_mod::earth_radius(), sptrungv(), sptrunmv(), sptrunsv(), and sptrunv().

    + +
    +
    +
    The documentation for this interface was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/interfacespectral__interp__mod_1_1polatev4.js b/ver-5.1.0/interfacespectral__interp__mod_1_1polatev4.js new file mode 100644 index 00000000..f9e2e84e --- /dev/null +++ b/ver-5.1.0/interfacespectral__interp__mod_1_1polatev4.js @@ -0,0 +1,5 @@ +var interfacespectral__interp__mod_1_1polatev4 = +[ + [ "polatev4_grib1", "interfacespectral__interp__mod_1_1polatev4.html#a5fa619eb983da3326380e9bafcf49ca8", null ], + [ "polatev4_grib2", "interfacespectral__interp__mod_1_1polatev4.html#a9dcbaeb719e3872ad5ad461adde5c98b", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ip__constants__mod_8F90.html b/ver-5.1.0/ip__constants__mod_8F90.html new file mode 100644 index 00000000..9462b41c --- /dev/null +++ b/ver-5.1.0/ip__constants__mod_8F90.html @@ -0,0 +1,141 @@ + + + + + + + +NCEPLIBS-ip: ip_constants_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_constants_mod.F90 File Reference
    +
    +
    + +

    Constants for use in NCEPLIBS-ip. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Modules

    module  ip_constants_mod
     Module containing common constants.
     
    + + + + + + + + + + + + + + + + + + + +

    +Variables

    real, parameter ip_constants_mod::dpr =180.0/pi
     Radians to degrees. More...
     
    real, parameter ip_constants_mod::e2_wgs84 = 0.00669437999013
     Eccentricity squared of Earth defined by WGS-84. More...
     
    real, parameter ip_constants_mod::pi =3.14159265358979
     PI. More...
     
    real, parameter ip_constants_mod::pi2 =pi/2.0
     PI / 2.0. More...
     
    real, parameter ip_constants_mod::pi4 =pi/4.0
     PI / 4.0. More...
     
    real, parameter ip_constants_mod::rerth_wgs84 =6.378137E6
     Radius of the Earth defined by WGS-84. More...
     
    +

    Detailed Description

    +

    Constants for use in NCEPLIBS-ip.

    +
    Author
    Kyle Gerheiser, George Gayno, Alex Richert
    +
    Date
    July 2021
    + +

    Definition in file ip_constants_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/ip__constants__mod_8F90.js b/ver-5.1.0/ip__constants__mod_8F90.js new file mode 100644 index 00000000..1cc27c8a --- /dev/null +++ b/ver-5.1.0/ip__constants__mod_8F90.js @@ -0,0 +1,9 @@ +var ip__constants__mod_8F90 = +[ + [ "dpr", "ip__constants__mod_8F90.html#ae6b74489db06341b78c3088b3f207011", null ], + [ "e2_wgs84", "ip__constants__mod_8F90.html#af7783a977fa10c54d85282dc6ac5f545", null ], + [ "pi", "ip__constants__mod_8F90.html#a47f83a2267da693170054c958c401cd4", null ], + [ "pi2", "ip__constants__mod_8F90.html#a309f7e3b1f83b6b272b12ce4fff501c5", null ], + [ "pi4", "ip__constants__mod_8F90.html#a5fe7cdd86b44487666dc37f655d9ff15", null ], + [ "rerth_wgs84", "ip__constants__mod_8F90.html#ac6a501512f426673f064edbecd7a62fb", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ip__constants__mod_8F90_source.html b/ver-5.1.0/ip__constants__mod_8F90_source.html new file mode 100644 index 00000000..b5fa81e1 --- /dev/null +++ b/ver-5.1.0/ip__constants__mod_8F90_source.html @@ -0,0 +1,122 @@ + + + + + + + +NCEPLIBS-ip: ip_constants_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ip_constants_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    5 
    + +
    10  implicit none
    +
    11 
    +
    12  public
    +
    13 
    +
    14  real, parameter :: pi=3.14159265358979
    +
    15  real, parameter :: dpr=180.0/pi
    +
    16  real, parameter :: pi2=pi/2.0
    +
    17  real, parameter :: pi4=pi/4.0
    +
    18  real, parameter :: rerth_wgs84=6.378137e6
    +
    19  real, parameter :: e2_wgs84 = 0.00669437999013
    +
    20 
    +
    21 end module ip_constants_mod
    +
    22 
    +
    Module containing common constants.
    +
    real, parameter pi2
    PI / 2.0.
    +
    real, parameter pi
    PI.
    +
    real, parameter pi4
    PI / 4.0.
    +
    real, parameter rerth_wgs84
    Radius of the Earth defined by WGS-84.
    +
    real, parameter dpr
    Radians to degrees.
    +
    real, parameter e2_wgs84
    Eccentricity squared of Earth defined by WGS-84.
    +
    +
    + + + + diff --git a/ver-5.1.0/ip__equid__cylind__grid__mod_8F90.html b/ver-5.1.0/ip__equid__cylind__grid__mod_8F90.html new file mode 100644 index 00000000..d59e5b17 --- /dev/null +++ b/ver-5.1.0/ip__equid__cylind__grid__mod_8F90.html @@ -0,0 +1,160 @@ + + + + + + + +NCEPLIBS-ip: ip_equid_cylind_grid_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_equid_cylind_grid_mod.F90 File Reference
    +
    +
    + +

    Equidistant cylindrical grib decoder and grid coordinate transformations. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Data Types

    type  ip_equid_cylind_grid_mod::ip_equid_cylind_grid
     
    + + + + +

    +Modules

    module  ip_equid_cylind_grid_mod
     Equidistant cylindrical grib decoder and grid coordinate transformations.
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine ip_equid_cylind_grid_mod::equid_cylind_grid_area (RLAT, AREA)
     Computes the grid box area for a equidistant cylindrical grid. More...
     
    subroutine ip_equid_cylind_grid_mod::equid_cylind_map_jacob (XLON, XLAT, YLON, YLAT)
     Computes the map jacobians for a equidistant cylindrical grid. More...
     
    subroutine ip_equid_cylind_grid_mod::equid_cylind_vect_rot (CROT, SROT)
     Computes the vector rotation sines and cosines for a equidistant cylindrical grid. More...
     
    subroutine ip_equid_cylind_grid_mod::gdswzd_equid_cylind (self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for equidistant cylindrical grids. More...
     
    subroutine ip_equid_cylind_grid_mod::init_grib1 (self, g1_desc)
     Initializes an equidistant cylindrical grid given a grib1_descriptor object. More...
     
    subroutine ip_equid_cylind_grid_mod::init_grib2 (self, g2_desc)
     Initializes an equidistant cylindrical grid given a grib2_descriptor object. More...
     
    + + + + + + + + + + +

    +Variables

    real ip_equid_cylind_grid_mod::dlat
     Grid resolution in degrees n/s direction. More...
     
    real ip_equid_cylind_grid_mod::dlon
     Grid resolution in degrees e/w direction. More...
     
    real ip_equid_cylind_grid_mod::rerth
     Radius of the Earth. More...
     
    +

    Detailed Description

    +

    Equidistant cylindrical grib decoder and grid coordinate transformations.

    +
    Author
    Mark Iredell, George Gayno, Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition in file ip_equid_cylind_grid_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/ip__equid__cylind__grid__mod_8F90.js b/ver-5.1.0/ip__equid__cylind__grid__mod_8F90.js new file mode 100644 index 00000000..aa7b18ea --- /dev/null +++ b/ver-5.1.0/ip__equid__cylind__grid__mod_8F90.js @@ -0,0 +1,13 @@ +var ip__equid__cylind__grid__mod_8F90 = +[ + [ "ip_equid_cylind_grid", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid" ], + [ "equid_cylind_grid_area", "ip__equid__cylind__grid__mod_8F90.html#a5a70b82abdce76bef22cdeaa96a986c2", null ], + [ "equid_cylind_map_jacob", "ip__equid__cylind__grid__mod_8F90.html#a039501b44cd3ad4409983e193d509afd", null ], + [ "equid_cylind_vect_rot", "ip__equid__cylind__grid__mod_8F90.html#ade88ecea1c0bb4b4d5b0d08f8482268d", null ], + [ "gdswzd_equid_cylind", "ip__equid__cylind__grid__mod_8F90.html#af20f6f308b5a33211c677b894e41b727", null ], + [ "init_grib1", "ip__equid__cylind__grid__mod_8F90.html#a3d0132823d27b60835ebb59ead173477", null ], + [ "init_grib2", "ip__equid__cylind__grid__mod_8F90.html#a39d24c9468ecb7effd16972fd72e088a", null ], + [ "dlat", "ip__equid__cylind__grid__mod_8F90.html#a30cb127d26d74d2de6ab3cbfd63183fb", null ], + [ "dlon", "ip__equid__cylind__grid__mod_8F90.html#a46335f95ac343f7751bd519aec0a160f", null ], + [ "rerth", "ip__equid__cylind__grid__mod_8F90.html#ab5b84516fab9cee3316c07450f49746c", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ip__equid__cylind__grid__mod_8F90_source.html b/ver-5.1.0/ip__equid__cylind__grid__mod_8F90_source.html new file mode 100644 index 00000000..7d95bd8f --- /dev/null +++ b/ver-5.1.0/ip__equid__cylind__grid__mod_8F90_source.html @@ -0,0 +1,399 @@ + + + + + + + +NCEPLIBS-ip: ip_equid_cylind_grid_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ip_equid_cylind_grid_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    7 
    + + +
    19  use ip_grid_mod
    + +
    21  implicit none
    +
    22 
    +
    23  private
    +
    24  public :: ip_equid_cylind_grid
    +
    25 
    +
    26  type, extends(ip_grid) :: ip_equid_cylind_grid
    +
    27  real :: hi
    +
    28  real :: rlat1
    +
    29  real :: rlon1
    +
    30  real :: rlat2
    +
    31  real :: rlon2
    +
    32  real :: dlat
    +
    33  real :: dlon
    +
    34  contains
    +
    35  procedure :: init_grib1
    +
    36  procedure :: init_grib2
    +
    37  procedure :: gdswzd => gdswzd_equid_cylind
    +
    38  end type ip_equid_cylind_grid
    +
    39 
    +
    40  REAL :: dlat
    +
    41  REAL :: dlon
    +
    42  REAL :: rerth
    +
    43 
    +
    44 contains
    +
    45 
    +
    53  subroutine init_grib1(self, g1_desc)
    +
    54  class(ip_equid_cylind_grid), intent(inout) :: self
    +
    55  type(grib1_descriptor), intent(in) :: g1_desc
    +
    56 
    +
    57  integer :: iscan
    +
    58 
    +
    59  associate(kgds => g1_desc%gds)
    +
    60  self%IM=kgds(2)
    +
    61  self%JM=kgds(3)
    +
    62  self%RLAT1=kgds(4)*1.e-3
    +
    63  self%RLON1=kgds(5)*1.e-3
    +
    64  self%RLAT2=kgds(7)*1.e-3
    +
    65  self%RLON2=kgds(8)*1.e-3
    +
    66  iscan=mod(kgds(11)/128,2)
    +
    67  self%HI=(-1.)**iscan
    +
    68  self%DLON=self%HI*(mod(self%HI*(self%RLON2-self%RLON1)-1+3600,360.)+1)/(self%IM-1)
    +
    69  self%DLAT=(self%RLAT2-self%RLAT1)/(self%JM-1)
    +
    70 
    +
    71  ! defaults
    +
    72  self%iwrap = 0
    +
    73  self%jwrap1 = 0
    +
    74  self%jwrap2 = 0
    +
    75  self%nscan = mod(kgds(11) / 32, 2)
    +
    76  self%nscan_field_pos = self%nscan
    +
    77  self%kscan = 0
    +
    78 
    +
    79  self%iwrap = nint(360/abs(self%dlon))
    +
    80 
    +
    81  if(self%im < self%iwrap) self%iwrap=0
    +
    82  self%jwrap1 = 0
    +
    83  self%jwrap2 = 0
    +
    84  if(self%iwrap > 0 .and. mod(self%iwrap,2) == 0) then
    +
    85  if(abs(self%rlat1) > 90-0.25*self%dlat) then
    +
    86  self%jwrap1 = 2
    +
    87  elseif(abs(self%rlat1) > 90-0.75*self%dlat) then
    +
    88  self%jwrap1 = 1
    +
    89  endif
    +
    90  if(abs(self%rlat2) > 90-0.25*self%dlat) then
    +
    91  self%jwrap2 = 2 * self%jm
    +
    92  elseif(abs(self%rlat2) > 90-0.75*self%dlat) then
    +
    93  self%jwrap2 = 2 * self%jm+1
    +
    94  endif
    +
    95  endif
    +
    96 
    +
    97  self%rerth = 6.3712e6
    +
    98  self%eccen_squared = 0.0
    +
    99  end associate
    +
    100 
    +
    101  end subroutine init_grib1
    +
    102 
    +
    109  subroutine init_grib2(self, g2_desc)
    +
    110  class(ip_equid_cylind_grid), intent(inout) :: self
    +
    111  type(grib2_descriptor), intent(in) :: g2_desc
    +
    112 
    +
    113  integer :: iscale, iscan
    +
    114 
    +
    115  associate(igdtmpl => g2_desc%gdt_tmpl, igdtlen => g2_desc%gdt_len)
    +
    116  self%IM=igdtmpl(8)
    +
    117  self%JM=igdtmpl(9)
    +
    118  iscale=igdtmpl(10)*igdtmpl(11)
    +
    119  IF(iscale==0) iscale=10**6
    +
    120  self%RLAT1=float(igdtmpl(12))/float(iscale)
    +
    121  self%RLON1=float(igdtmpl(13))/float(iscale)
    +
    122  self%RLAT2=float(igdtmpl(15))/float(iscale)
    +
    123  self%RLON2=float(igdtmpl(16))/float(iscale)
    +
    124  iscan=mod(igdtmpl(19)/128,2)
    +
    125  self%HI=(-1.)**iscan
    +
    126  self%DLON=self%HI*(mod(self%HI*(self%RLON2-self%RLON1)-1+3600,360.)+1)/(self%IM-1)
    +
    127  self%DLAT=(self%RLAT2-self%RLAT1)/(self%JM-1)
    +
    128 
    +
    129  self%nscan = mod(igdtmpl(19)/32,2)
    +
    130  self%nscan_field_pos = self%nscan
    +
    131  self%kscan = 0
    +
    132  self%iwrap = nint(360/abs(self%DLON))
    +
    133 
    +
    134  if(self%im.lt.self%iwrap) self%iwrap=0
    +
    135  self%jwrap1=0
    +
    136  self%jwrap2=0
    +
    137 
    +
    138  if(self%im < self%iwrap) self%iwrap=0
    +
    139  self%jwrap1 = 0
    +
    140  self%jwrap2 = 0
    +
    141  if(self%iwrap > 0 .and. mod(self%iwrap,2) == 0) then
    +
    142  if(abs(self%rlat1) > 90-0.25*self%dlat) then
    +
    143  self%jwrap1 = 2
    +
    144  elseif(abs(self%rlat1) > 90-0.75*self%dlat) then
    +
    145  self%jwrap1 = 1
    +
    146  endif
    +
    147  if(abs(self%rlat2) > 90-0.25*self%dlat) then
    +
    148  self%jwrap2 = 2 * self%jm
    +
    149  elseif(abs(self%rlat2) > 90-0.75*self%dlat) then
    +
    150  self%jwrap2 = 2 * self%jm+1
    +
    151  endif
    +
    152  endif
    +
    153 
    +
    154  call earth_radius(igdtmpl, igdtlen, self%rerth, self%eccen_squared)
    +
    155 
    +
    156  end associate
    +
    157  end subroutine init_grib2
    +
    158 
    +
    203  SUBROUTINE gdswzd_equid_cylind(self,IOPT,NPTS,FILL, &
    +
    204  XPTS,YPTS,RLON,RLAT,NRET, &
    +
    205  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
    +
    206  IMPLICIT NONE
    +
    207  !
    +
    208  class(ip_equid_cylind_grid), intent(in) :: self
    +
    209  INTEGER, INTENT(IN ) :: IOPT, NPTS
    +
    210  INTEGER, INTENT( OUT) :: NRET
    +
    211  !
    +
    212  REAL, INTENT(IN ) :: FILL
    +
    213  REAL, INTENT(INOUT) :: RLON(NPTS),RLAT(NPTS)
    +
    214  REAL, INTENT(INOUT) :: XPTS(NPTS),YPTS(NPTS)
    +
    215  REAL, OPTIONAL, INTENT( OUT) :: CROT(NPTS),SROT(NPTS)
    +
    216  REAL, OPTIONAL, INTENT( OUT) :: XLON(NPTS),XLAT(NPTS)
    +
    217  REAL, OPTIONAL, INTENT( OUT) :: YLON(NPTS),YLAT(NPTS),AREA(NPTS)
    +
    218  !
    +
    219  INTEGER :: IM, JM, N
    +
    220  !
    +
    221  LOGICAL :: LROT, LMAP, LAREA
    +
    222  !
    +
    223  REAL :: HI, RLAT1, RLON1, RLAT2, RLON2
    +
    224  REAL :: XMAX, XMIN, YMAX, YMIN
    +
    225  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    226  IF(PRESENT(crot)) crot=fill
    +
    227  IF(PRESENT(srot)) srot=fill
    +
    228  IF(PRESENT(xlon)) xlon=fill
    +
    229  IF(PRESENT(xlat)) xlat=fill
    +
    230  IF(PRESENT(ylon)) ylon=fill
    +
    231  IF(PRESENT(ylat)) ylat=fill
    +
    232  IF(PRESENT(area)) area=fill
    +
    233 
    +
    234  im=self%im
    +
    235  jm=self%jm
    +
    236 
    +
    237  rlat1=self%rlat1
    +
    238  rlon1=self%rlon1
    +
    239  rlat2=self%rlat2
    +
    240  rlon2=self%rlon2
    +
    241 
    +
    242  hi=self%hi
    +
    243 
    +
    244  rerth = self%rerth
    +
    245  dlat = self%dlat
    +
    246  dlon = self%dlon
    +
    247 
    +
    248  xmin=0
    +
    249  xmax=im+1
    +
    250  IF(im.EQ.nint(360/abs(dlon))) xmax=im+2
    +
    251  ymin=0
    +
    252  ymax=jm+1
    +
    253  nret=0
    +
    254  IF(PRESENT(crot).AND.PRESENT(srot))THEN
    +
    255  lrot=.true.
    +
    256  ELSE
    +
    257  lrot=.false.
    +
    258  ENDIF
    +
    259  IF(PRESENT(xlon).AND.PRESENT(xlat).AND.PRESENT(ylon).AND.PRESENT(ylat))THEN
    +
    260  lmap=.true.
    +
    261  ELSE
    +
    262  lmap=.false.
    +
    263  ENDIF
    +
    264  IF(PRESENT(area))THEN
    +
    265  larea=.true.
    +
    266  ELSE
    +
    267  larea=.false.
    +
    268  ENDIF
    +
    269  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    270  ! TRANSLATE GRID COORDINATES TO EARTH COORDINATES
    +
    271  IF(iopt.EQ.0.OR.iopt.EQ.1) THEN
    +
    272  !$OMP PARALLEL DO PRIVATE(N) REDUCTION(+:NRET) SCHEDULE(STATIC)
    +
    273  DO n=1,npts
    +
    274  IF(xpts(n).GE.xmin.AND.xpts(n).LE.xmax.AND. &
    +
    275  ypts(n).GE.ymin.AND.ypts(n).LE.ymax) THEN
    +
    276  rlon(n)=mod(rlon1+dlon*(xpts(n)-1)+3600,360.)
    +
    277  rlat(n)=min(max(rlat1+dlat*(ypts(n)-1),-90.),90.)
    +
    278  nret=nret+1
    +
    279  IF(lrot) CALL equid_cylind_vect_rot(crot(n),srot(n))
    +
    280  IF(lmap) CALL equid_cylind_map_jacob(xlon(n),xlat(n),ylon(n),ylat(n))
    +
    281  IF(larea) CALL equid_cylind_grid_area(rlat(n),area(n))
    +
    282  ELSE
    +
    283  rlon(n)=fill
    +
    284  rlat(n)=fill
    +
    285  ENDIF
    +
    286  ENDDO
    +
    287  !$OMP END PARALLEL DO
    +
    288  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    289  ! TRANSLATE EARTH COORDINATES TO GRID COORDINATES
    +
    290  ELSEIF(iopt.EQ.-1) THEN
    +
    291  !$OMP PARALLEL DO PRIVATE(N) REDUCTION(+:NRET) SCHEDULE(STATIC)
    +
    292  DO n=1,npts
    +
    293  IF(abs(rlon(n)).LE.360.AND.abs(rlat(n)).LE.90) THEN
    +
    294  xpts(n)=1+hi*mod(hi*(rlon(n)-rlon1)+3600,360.)/dlon
    +
    295  ypts(n)=1+(rlat(n)-rlat1)/dlat
    +
    296  IF(xpts(n).GE.xmin.AND.xpts(n).LE.xmax.AND. &
    +
    297  ypts(n).GE.ymin.AND.ypts(n).LE.ymax) THEN
    +
    298  nret=nret+1
    +
    299  IF(lrot) CALL equid_cylind_vect_rot(crot(n),srot(n))
    +
    300  IF(lmap) CALL equid_cylind_map_jacob(xlon(n),xlat(n),ylon(n),ylat(n))
    +
    301  IF(larea) CALL equid_cylind_grid_area(rlat(n),area(n))
    +
    302  ELSE
    +
    303  xpts(n)=fill
    +
    304  ypts(n)=fill
    +
    305  ENDIF
    +
    306  ELSE
    +
    307  xpts(n)=fill
    +
    308  ypts(n)=fill
    +
    309  ENDIF
    +
    310  ENDDO
    +
    311  !$OMP END PARALLEL DO
    +
    312  ENDIF
    +
    313  END SUBROUTINE gdswzd_equid_cylind
    +
    314 
    +
    327  SUBROUTINE equid_cylind_vect_rot(CROT,SROT)
    +
    328  IMPLICIT NONE
    +
    329 
    +
    330  REAL, INTENT( OUT) :: CROT, SROT
    +
    331 
    +
    332  crot=1.0
    +
    333  srot=0.0
    +
    334 
    +
    335  END SUBROUTINE equid_cylind_vect_rot
    +
    336 
    +
    346  SUBROUTINE equid_cylind_map_jacob(XLON,XLAT,YLON,YLAT)
    +
    347  REAL, INTENT( OUT) :: XLON,XLAT,YLON,YLAT
    +
    348 
    +
    349  xlon=1.0/dlon
    +
    350  xlat=0.
    +
    351  ylon=0.
    +
    352  ylat=1.0/dlat
    +
    353 
    +
    354  END SUBROUTINE equid_cylind_map_jacob
    +
    355 
    +
    363  SUBROUTINE equid_cylind_grid_area(RLAT,AREA)
    +
    364  IMPLICIT NONE
    +
    365 
    +
    366  REAL, INTENT(IN ) :: RLAT
    +
    367  REAL, INTENT( OUT) :: AREA
    +
    368 
    +
    369  REAL, PARAMETER :: PI=3.14159265358979
    +
    370  REAL, PARAMETER :: DPR=180./pi
    +
    371 
    +
    372  REAL :: DSLAT, RLATU, RLATD
    +
    373 
    +
    374  rlatu=min(max(rlat+dlat/2,-90.),90.)
    +
    375  rlatd=min(max(rlat-dlat/2,-90.),90.)
    +
    376  dslat=sin(rlatu/dpr)-sin(rlatd/dpr)
    +
    377  area=rerth**2*abs(dslat*dlon)/dpr
    +
    378 
    +
    379  END SUBROUTINE equid_cylind_grid_area
    +
    380 
    +
    381 end module ip_equid_cylind_grid_mod
    +
    382 
    +
    void gdswzd(int igdtnum, int *igdtmpl, int igdtlen, int iopt, int npts, float fill, float *xpts, float *ypts, float *rlon, float *rlat, int *nret, float *crot, float *srot, float *xlon, float *xlat, float *ylon, float *ylat, float *area)
    gdswzd() interface for C for _4 build of library.
    +
    Determine earth radius and shape.
    +
    Equidistant cylindrical grib decoder and grid coordinate transformations.
    +
    subroutine equid_cylind_map_jacob(XLON, XLAT, YLON, YLAT)
    Computes the map jacobians for a equidistant cylindrical grid.
    +
    real dlat
    Grid resolution in degrees n/s direction.
    +
    subroutine init_grib2(self, g2_desc)
    Initializes an equidistant cylindrical grid given a grib2_descriptor object.
    +
    subroutine init_grib1(self, g1_desc)
    Initializes an equidistant cylindrical grid given a grib1_descriptor object.
    +
    real dlon
    Grid resolution in degrees e/w direction.
    +
    subroutine equid_cylind_grid_area(RLAT, AREA)
    Computes the grid box area for a equidistant cylindrical grid.
    +
    real rerth
    Radius of the Earth.
    +
    subroutine equid_cylind_vect_rot(CROT, SROT)
    Computes the vector rotation sines and cosines for a equidistant cylindrical grid.
    +
    subroutine gdswzd_equid_cylind(self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for equidistant cylindrical g...
    +
    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
    +
    Abstract ip_grid type.
    Definition: ip_grid_mod.F90:10
    + +
    Descriptor representing a grib1 grib descriptor section (GDS) with an integer array.
    +
    Abstract grid that holds fields and methods common to all grids.
    Definition: ip_grid_mod.F90:58
    +
    +
    + + + + diff --git a/ver-5.1.0/ip__gaussian__grid__mod_8F90.html b/ver-5.1.0/ip__gaussian__grid__mod_8F90.html new file mode 100644 index 00000000..60e15944 --- /dev/null +++ b/ver-5.1.0/ip__gaussian__grid__mod_8F90.html @@ -0,0 +1,169 @@ + + + + + + + +NCEPLIBS-ip: ip_gaussian_grid_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_gaussian_grid_mod.F90 File Reference
    +
    +
    + +

    Gaussian grid coordinate transformations. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Data Types

    type  ip_gaussian_grid_mod::ip_gaussian_grid
     
    + + + + +

    +Modules

    module  ip_gaussian_grid_mod
     Gaussian grid coordinate transformations.
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine ip_gaussian_grid_mod::gaussian_grid_area (YPTS, AREA)
     Computes the grid box area for a gaussian cylindrical grid. More...
     
    subroutine ip_gaussian_grid_mod::gaussian_map_jacob (YPTS, XLON, XLAT, YLON, YLAT)
     Computes the map jacobians for a gaussian cylindrical grid. More...
     
    subroutine ip_gaussian_grid_mod::gaussian_vect_rot (CROT, SROT)
     Computes the vector rotation sines and cosines for a gaussian cylindrical grid. More...
     
    subroutine ip_gaussian_grid_mod::gdswzd_gaussian (self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids. More...
     
    subroutine ip_gaussian_grid_mod::init_grib1 (self, g1_desc)
     Initializes a gaussian grid given a grib1_descriptor object. More...
     
    subroutine ip_gaussian_grid_mod::init_grib2 (self, g2_desc)
     Initializes a gaussian grid given a grib2_descriptor object. More...
     
    + + + + + + + + + + + + + + + + + + + +

    +Variables

    real, dimension(:), allocatable ip_gaussian_grid_mod::blat
     Gaussian latitude for each parallel. More...
     
    real ip_gaussian_grid_mod::dlon
     "i"-direction increment. More...
     
    integer ip_gaussian_grid_mod::j1
     'j' index of first grid point within the global array of latitudes. More...
     
    integer ip_gaussian_grid_mod::jh
     Scan mode flag in 'j' direction. More...
     
    real ip_gaussian_grid_mod::rerth
     Radius of the earth. More...
     
    real, dimension(:), allocatable ip_gaussian_grid_mod::ylat_row
     dy/dlat for each row in 1/degrees. More...
     
    +

    Detailed Description

    +

    Gaussian grid coordinate transformations.

    +
    Author
    Mark Iredell, George Gayno, Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition in file ip_gaussian_grid_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/ip__gaussian__grid__mod_8F90.js b/ver-5.1.0/ip__gaussian__grid__mod_8F90.js new file mode 100644 index 00000000..d975899c --- /dev/null +++ b/ver-5.1.0/ip__gaussian__grid__mod_8F90.js @@ -0,0 +1,16 @@ +var ip__gaussian__grid__mod_8F90 = +[ + [ "ip_gaussian_grid", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html", "structip__gaussian__grid__mod_1_1ip__gaussian__grid" ], + [ "gaussian_grid_area", "ip__gaussian__grid__mod_8F90.html#ab602a870a477c7ab77438700af4e7780", null ], + [ "gaussian_map_jacob", "ip__gaussian__grid__mod_8F90.html#adca7b03877c6a7048ff1716a95e0bd9d", null ], + [ "gaussian_vect_rot", "ip__gaussian__grid__mod_8F90.html#ac72eec96d0012fbe0f0ec7c520f40dad", null ], + [ "gdswzd_gaussian", "ip__gaussian__grid__mod_8F90.html#a6eefd9270b3f9bb2c59a77bea4ecf1b9", null ], + [ "init_grib1", "ip__gaussian__grid__mod_8F90.html#a8fe2ee732a3a2db4891a6431787a0b01", null ], + [ "init_grib2", "ip__gaussian__grid__mod_8F90.html#ae048ac033628515113b11b8c7364e0c2", null ], + [ "blat", "ip__gaussian__grid__mod_8F90.html#ae2697b9c4dbe4945276633d1951e79fc", null ], + [ "dlon", "ip__gaussian__grid__mod_8F90.html#a8852b7cfb7b99318140c66b0c551dc6d", null ], + [ "j1", "ip__gaussian__grid__mod_8F90.html#af5c4024263aa3eaef5801849ae32c15a", null ], + [ "jh", "ip__gaussian__grid__mod_8F90.html#a67d6cd6d188a8bded8bdf64927617028", null ], + [ "rerth", "ip__gaussian__grid__mod_8F90.html#a8213e02ccf4325ad5db14f2e48990da2", null ], + [ "ylat_row", "ip__gaussian__grid__mod_8F90.html#a3591b5701f3d03931c6a9d5278e161dc", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ip__gaussian__grid__mod_8F90_source.html b/ver-5.1.0/ip__gaussian__grid__mod_8F90_source.html new file mode 100644 index 00000000..e02ff25d --- /dev/null +++ b/ver-5.1.0/ip__gaussian__grid__mod_8F90_source.html @@ -0,0 +1,456 @@ + + + + + + + +NCEPLIBS-ip: ip_gaussian_grid_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ip_gaussian_grid_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    5 
    + + +
    16  use ip_grid_mod
    + + +
    19  use sp_mod
    +
    20  implicit none
    +
    21 
    +
    22  private
    +
    23  public :: ip_gaussian_grid
    +
    24 
    +
    25  type, extends(ip_grid) :: ip_gaussian_grid
    +
    26  integer :: jh
    +
    27  real :: dlon
    +
    28  real :: rlat1
    +
    29  real :: rlon1
    +
    30  real :: rlon2
    +
    31  real :: hi
    +
    32  integer :: jg
    +
    33  integer :: jscan
    +
    34  contains
    +
    36  procedure :: init_grib1
    +
    38  procedure :: init_grib2
    +
    41  procedure :: gdswzd => gdswzd_gaussian
    +
    42  end type ip_gaussian_grid
    +
    43 
    +
    44  INTEGER :: j1
    +
    45  INTEGER :: jh
    +
    46  REAL, ALLOCATABLE :: blat(:)
    +
    47  REAL :: dlon
    +
    48  REAL :: rerth
    +
    49  REAL, ALLOCATABLE :: ylat_row(:)
    +
    50 
    +
    51 contains
    +
    52 
    +
    60  subroutine init_grib1(self, g1_desc)
    +
    61  class(ip_gaussian_grid), intent(inout) :: self
    +
    62  type(grib1_descriptor), intent(in) :: g1_desc
    +
    63 
    +
    64  integer :: iscan, jg
    +
    65 
    +
    66  associate(kgds => g1_desc%gds)
    +
    67  self%rerth = 6.3712e6
    +
    68  self%eccen_squared = 0.0
    +
    69 
    +
    70  self%IM=kgds(2)
    +
    71  self%JM=kgds(3)
    +
    72  self%RLAT1=kgds(4)*1.e-3
    +
    73  self%RLON1=kgds(5)*1.e-3
    +
    74  self%RLON2=kgds(8)*1.e-3
    +
    75  self%JG=kgds(10)*2
    +
    76  iscan=mod(kgds(11)/128,2)
    +
    77  self%JSCAN=mod(kgds(11)/64,2)
    +
    78  self%HI=(-1.)**iscan
    +
    79  self%JH=(-1)**self%JSCAN
    +
    80  self%DLON=self%HI*(mod(self%HI*(self%RLON2-self%RLON1)-1+3600,360.)+1)/(self%IM-1)
    +
    81 
    +
    82  self%iwrap = 0
    +
    83  self%jwrap1 = 0
    +
    84  self%jwrap2 = 0
    +
    85  self%nscan = mod(kgds(11) / 32, 2)
    +
    86  self%nscan_field_pos = self%nscan
    +
    87  self%kscan = 0
    +
    88 
    +
    89  self%iwrap=nint(360 / abs(self%dlon))
    +
    90  if(self%im < self%iwrap) self%iwrap = 0
    +
    91 
    +
    92  if(self%iwrap > 0 .and. mod(self%iwrap, 2) == 0) then
    +
    93  jg=kgds(10)*2
    +
    94  if(self%jm == self%jg) then
    +
    95  self%jwrap1 = 1
    +
    96  self%jwrap2 = 2 * self%jm + 1
    +
    97  endif
    +
    98  endif
    +
    99 
    +
    100  end associate
    +
    101  end subroutine init_grib1
    +
    102 
    +
    109  subroutine init_grib2(self, g2_desc)
    +
    110  class(ip_gaussian_grid), intent(inout) :: self
    +
    111  type(grib2_descriptor), intent(in) :: g2_desc
    +
    112 
    +
    113  integer :: iscale, iscan, jg
    +
    114 
    +
    115  associate(igdtmpl => g2_desc%gdt_tmpl, igdtlen => g2_desc%gdt_len)
    +
    116  call earth_radius(igdtmpl, igdtlen, self%rerth, self%eccen_squared)
    +
    117 
    +
    118  self%IM=igdtmpl(8)
    +
    119  self%JM=igdtmpl(9)
    +
    120  iscale=igdtmpl(10)*igdtmpl(11)
    +
    121  IF(iscale==0) iscale=10**6
    +
    122  self%RLAT1=float(igdtmpl(12))/float(iscale)
    +
    123  self%RLON1=float(igdtmpl(13))/float(iscale)
    +
    124  self%RLON2=float(igdtmpl(16))/float(iscale)
    +
    125  self%JG=igdtmpl(18)*2
    +
    126  iscan=mod(igdtmpl(19)/128,2)
    +
    127  self%JSCAN=mod(igdtmpl(19)/64,2)
    +
    128  self%HI=(-1.)**iscan
    +
    129  self%JH=(-1)**self%JSCAN
    +
    130  self%DLON=self%HI*(mod(self%HI*(self%RLON2-self%RLON1)-1+3600,360.)+1)/(self%IM-1)
    +
    131 
    +
    132 
    +
    133  self%iwrap = nint(360 / abs(self%dlon))
    +
    134  if(self%im < self%iwrap) self%iwrap = 0
    +
    135  self%jwrap1 = 0
    +
    136  self%jwrap2 = 0
    +
    137  if(self%iwrap > 0 .and. mod(self%iwrap, 2) == 0) then
    +
    138  jg = igdtmpl(18) * 2
    +
    139  if(self%jm == jg) then
    +
    140  self%jwrap1=1
    +
    141  self%jwrap2 = 2 * self%jm + 1
    +
    142  endif
    +
    143  endif
    +
    144  self%nscan = mod(igdtmpl(19) / 32, 2)
    +
    145  self%nscan_field_pos = self%nscan
    +
    146  self%kscan = 0
    +
    147  end associate
    +
    148 
    +
    149  end subroutine init_grib2
    +
    150 
    +
    195  SUBROUTINE gdswzd_gaussian(self,IOPT,NPTS,FILL, &
    +
    196  XPTS,YPTS,RLON,RLAT,NRET, &
    +
    197  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
    +
    198  IMPLICIT NONE
    +
    199  !
    +
    200  class(ip_gaussian_grid), intent(in) :: self
    +
    201  INTEGER, INTENT(IN ) :: IOPT, NPTS
    +
    202  INTEGER, INTENT( OUT) :: NRET
    +
    203  !
    +
    204  REAL, INTENT(IN ) :: FILL
    +
    205  REAL, INTENT(INOUT) :: RLON(NPTS),RLAT(NPTS)
    +
    206  REAL, INTENT(INOUT) :: XPTS(NPTS),YPTS(NPTS)
    +
    207  REAL, OPTIONAL, INTENT( OUT) :: CROT(NPTS),SROT(NPTS)
    +
    208  REAL, OPTIONAL, INTENT( OUT) :: XLON(NPTS),XLAT(NPTS)
    +
    209  REAL, OPTIONAL, INTENT( OUT) :: YLON(NPTS),YLAT(NPTS),AREA(NPTS)
    +
    210  !
    +
    211  INTEGER :: JSCAN, IM, JM
    +
    212  INTEGER :: J, JA, JG
    +
    213  INTEGER :: N
    +
    214  !
    +
    215  LOGICAL :: LROT, LMAP, LAREA
    +
    216  !
    +
    217  REAL, ALLOCATABLE :: ALAT(:), ALAT_JSCAN(:)
    +
    218  REAL, ALLOCATABLE :: ALAT_TEMP(:),BLAT_TEMP(:)
    +
    219  REAL :: HI, RLATA, RLATB, RLAT1, RLON1, RLON2
    +
    220  REAL :: XMAX, XMIN, YMAX, YMIN, YPTSA, YPTSB
    +
    221  REAL :: WB
    +
    222 
    +
    223  IF(PRESENT(crot)) crot=fill
    +
    224  IF(PRESENT(srot)) srot=fill
    +
    225  IF(PRESENT(xlon)) xlon=fill
    +
    226  IF(PRESENT(xlat)) xlat=fill
    +
    227  IF(PRESENT(ylon)) ylon=fill
    +
    228  IF(PRESENT(ylat)) ylat=fill
    +
    229  IF(PRESENT(area)) area=fill
    +
    230 
    +
    231  IF(PRESENT(crot).AND.PRESENT(srot))THEN
    +
    232  lrot=.true.
    +
    233  ELSE
    +
    234  lrot=.false.
    +
    235  ENDIF
    +
    236  IF(PRESENT(xlon).AND.PRESENT(xlat).AND.PRESENT(ylon).AND.PRESENT(ylat))THEN
    +
    237  lmap=.true.
    +
    238  ELSE
    +
    239  lmap=.false.
    +
    240  ENDIF
    +
    241  IF(PRESENT(area))THEN
    +
    242  larea=.true.
    +
    243  ELSE
    +
    244  larea=.false.
    +
    245  ENDIF
    +
    246 
    +
    247  im=self%im
    +
    248  jm=self%jm
    +
    249 
    +
    250  rlat1=self%rlat1
    +
    251  rlon1=self%rlon1
    +
    252  rlon2=self%rlon2
    +
    253 
    +
    254  jg=self%jg
    +
    255  jscan=self%jscan
    +
    256  hi=self%hi
    +
    257 
    +
    258  jh=self%jh
    +
    259  dlon=self%dlon
    +
    260  rerth = self%rerth
    +
    261 
    +
    262  ALLOCATE(alat_temp(jg))
    +
    263  ALLOCATE(blat_temp(jg))
    +
    264  CALL splat(4,jg,alat_temp,blat_temp)
    +
    265  ALLOCATE(alat(0:jg+1))
    +
    266  ALLOCATE(blat(0:jg+1))
    +
    267  !$OMP PARALLEL DO PRIVATE(JA) SCHEDULE(STATIC)
    +
    268  DO ja=1,jg
    +
    269  alat(ja)=real(dpr*asin(alat_temp(ja)))
    +
    270  blat(ja)=blat_temp(ja)
    +
    271  ENDDO
    +
    272  !$OMP END PARALLEL DO
    +
    273  DEALLOCATE(alat_temp,blat_temp)
    +
    274  alat(0)=180.-alat(1)
    +
    275  alat(jg+1)=-alat(0)
    +
    276  blat(0)=-blat(1)
    +
    277  blat(jg+1)=blat(0)
    +
    278  j1=1
    +
    279  DO WHILE(j1.LT.jg.AND.rlat1.LT.(alat(j1)+alat(j1+1))/2)
    +
    280  j1=j1+1
    +
    281  ENDDO
    +
    282  IF(lmap)THEN
    +
    283  ALLOCATE(alat_jscan(jg))
    +
    284  DO ja=1,jg
    +
    285  alat_jscan(j1+jh*(ja-1))=alat(ja)
    +
    286  ENDDO
    +
    287  ALLOCATE(ylat_row(0:jg+1))
    +
    288  DO ja=2,(jg-1)
    +
    289  ylat_row(ja)=2.0/(alat_jscan(ja+1)-alat_jscan(ja-1))
    +
    290  ENDDO
    +
    291  ylat_row(1)=1.0/(alat_jscan(2)-alat_jscan(1))
    +
    292  ylat_row(0)=ylat_row(1)
    +
    293  ylat_row(jg)=1.0/(alat_jscan(jg)-alat_jscan(jg-1))
    +
    294  ylat_row(jg+1)=ylat_row(jg)
    +
    295  DEALLOCATE(alat_jscan)
    +
    296  ENDIF
    +
    297  xmin=0
    +
    298  xmax=im+1
    +
    299  IF(im.EQ.nint(360/abs(dlon))) xmax=im+2
    +
    300  ymin=0.5
    +
    301  ymax=jm+0.5
    +
    302  nret=0
    +
    303 
    +
    304  ! TRANSLATE GRID COORDINATES TO EARTH COORDINATES
    +
    305  IF(iopt.EQ.0.OR.iopt.EQ.1) THEN
    +
    306  !$OMP PARALLEL DO PRIVATE(N,J,WB,RLATA,RLATB) REDUCTION(+:NRET) SCHEDULE(STATIC)
    +
    307  DO n=1,npts
    +
    308  IF(xpts(n).GE.xmin.AND.xpts(n).LE.xmax.AND. &
    +
    309  ypts(n).GE.ymin.AND.ypts(n).LE.ymax) THEN
    +
    310  rlon(n)=mod(rlon1+dlon*(xpts(n)-1)+3600,360.)
    +
    311  j=int(ypts(n))
    +
    312  wb=ypts(n)-j
    +
    313  rlata=alat(j1+jh*(j-1))
    +
    314  rlatb=alat(j1+jh*j)
    +
    315  rlat(n)=rlata+wb*(rlatb-rlata)
    +
    316  nret=nret+1
    +
    317  IF(lrot) CALL gaussian_vect_rot(crot(n),srot(n))
    +
    318  IF(lmap) CALL gaussian_map_jacob(ypts(n),&
    +
    319  xlon(n),xlat(n),ylon(n),ylat(n))
    +
    320  IF(larea) CALL gaussian_grid_area(ypts(n),area(n))
    +
    321  ELSE
    +
    322  rlon(n)=fill
    +
    323  rlat(n)=fill
    +
    324  ENDIF
    +
    325  ENDDO
    +
    326  !$OMP END PARALLEL DO
    +
    327 
    +
    328  ! TRANSLATE EARTH COORDINATES TO GRID COORDINATES
    +
    329  ELSEIF(iopt.EQ.-1) THEN
    +
    330  !$OMP PARALLEL DO PRIVATE(N,JA,YPTSA, YPTSB, WB) REDUCTION(+:NRET) SCHEDULE(STATIC)
    +
    331  DO n=1,npts
    +
    332  xpts(n)=fill
    +
    333  ypts(n)=fill
    +
    334  IF(abs(rlon(n)).LE.360.AND.abs(rlat(n)).LE.90) THEN
    +
    335  xpts(n)=1+hi*mod(hi*(rlon(n)-rlon1)+3600,360.)/dlon
    +
    336  ja=min(int((jg+1)/180.*(90-rlat(n))),jg)
    +
    337  IF(rlat(n).GT.alat(ja)) ja=max(ja-2,0)
    +
    338  IF(rlat(n).LT.alat(ja+1)) ja=min(ja+2,jg)
    +
    339  IF(rlat(n).GT.alat(ja)) ja=ja-1
    +
    340  IF(rlat(n).LT.alat(ja+1)) ja=ja+1
    +
    341  yptsa=1+jh*(ja-j1)
    +
    342  yptsb=1+jh*(ja+1-j1)
    +
    343  wb=(alat(ja)-rlat(n))/(alat(ja)-alat(ja+1))
    +
    344  ypts(n)=yptsa+wb*(yptsb-yptsa)
    +
    345  IF(xpts(n).GE.xmin.AND.xpts(n).LE.xmax.AND. &
    +
    346  ypts(n).GE.ymin.AND.ypts(n).LE.ymax) THEN
    +
    347  nret=nret+1
    +
    348  IF(lrot) CALL gaussian_vect_rot(crot(n),srot(n))
    +
    349  IF(lmap) CALL gaussian_map_jacob(ypts(n), &
    +
    350  xlon(n),xlat(n),ylon(n),ylat(n))
    +
    351  IF(larea) CALL gaussian_grid_area(ypts(n),area(n))
    +
    352  ELSE
    +
    353  xpts(n)=fill
    +
    354  ypts(n)=fill
    +
    355  ENDIF
    +
    356  ENDIF
    +
    357  ENDDO
    +
    358  !$OMP END PARALLEL DO
    +
    359  ENDIF
    +
    360  DEALLOCATE(alat, blat)
    +
    361  IF (ALLOCATED(ylat_row)) DEALLOCATE(ylat_row)
    +
    362 
    +
    363  END SUBROUTINE gdswzd_gaussian
    +
    364 
    +
    377  SUBROUTINE gaussian_vect_rot(CROT,SROT)
    +
    378  IMPLICIT NONE
    +
    379 
    +
    380  REAL, INTENT( OUT) :: CROT, SROT
    +
    381 
    +
    382  crot=1.0
    +
    383  srot=0.0
    +
    384 
    +
    385  END SUBROUTINE gaussian_vect_rot
    +
    386 
    +
    397  SUBROUTINE gaussian_map_jacob(YPTS, XLON, XLAT, YLON, YLAT)
    +
    398  IMPLICIT NONE
    +
    399 
    +
    400  REAL, INTENT(IN ) :: YPTS
    +
    401  REAL, INTENT( OUT) :: XLON, XLAT, YLON, YLAT
    +
    402 
    +
    403  xlon=1/dlon
    +
    404  xlat=0.
    +
    405  ylon=0.
    +
    406  ylat=ylat_row(nint(ypts))
    +
    407 
    +
    408  END SUBROUTINE gaussian_map_jacob
    +
    409 
    +
    417  SUBROUTINE gaussian_grid_area(YPTS,AREA)
    +
    418  IMPLICIT NONE
    +
    419 
    +
    420  REAL, INTENT(IN ) :: YPTS
    +
    421  REAL, INTENT( OUT) :: AREA
    +
    422 
    +
    423  INTEGER :: J
    +
    424 
    +
    425  REAL :: WB, WLAT, WLATA, WLATB
    +
    426 
    +
    427  j = int(ypts)
    +
    428  wb=ypts-j
    +
    429  wlata=blat(j1+jh*(j-1))
    +
    430  wlatb=blat(j1+jh*j)
    +
    431  wlat=wlata+wb*(wlatb-wlata)
    +
    432  area=real(rerth**2*wlat*dlon/dpr)
    +
    433 
    +
    434  END SUBROUTINE gaussian_grid_area
    +
    435 end module ip_gaussian_grid_mod
    +
    436 
    +
    void gdswzd(int igdtnum, int *igdtmpl, int igdtlen, int iopt, int npts, float fill, float *xpts, float *ypts, float *rlon, float *rlat, int *nret, float *crot, float *srot, float *xlon, float *xlat, float *ylon, float *ylat, float *area)
    gdswzd() interface for C for _4 build of library.
    +
    Determine earth radius and shape.
    +
    Module containing common constants.
    +
    Gaussian grid coordinate transformations.
    +
    real, dimension(:), allocatable ylat_row
    dy/dlat for each row in 1/degrees.
    +
    integer jh
    Scan mode flag in 'j' direction.
    +
    subroutine gdswzd_gaussian(self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids.
    +
    real rerth
    Radius of the earth.
    +
    real dlon
    "i"-direction increment.
    +
    subroutine init_grib1(self, g1_desc)
    Initializes a gaussian grid given a grib1_descriptor object.
    +
    subroutine gaussian_grid_area(YPTS, AREA)
    Computes the grid box area for a gaussian cylindrical grid.
    +
    subroutine gaussian_vect_rot(CROT, SROT)
    Computes the vector rotation sines and cosines for a gaussian cylindrical grid.
    +
    subroutine gaussian_map_jacob(YPTS, XLON, XLAT, YLON, YLAT)
    Computes the map jacobians for a gaussian cylindrical grid.
    +
    subroutine init_grib2(self, g2_desc)
    Initializes a gaussian grid given a grib2_descriptor object.
    +
    real, dimension(:), allocatable blat
    Gaussian latitude for each parallel.
    +
    integer j1
    'j' index of first grid point within the global array of latitudes.
    +
    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
    +
    Abstract ip_grid type.
    Definition: ip_grid_mod.F90:10
    +
    subroutine splat(IDRT, JMAX, SLAT, WLAT)
    Computes cosines of colatitude and Gaussian weights for one of the following specific global sets of ...
    Definition: splat.F:46
    + +
    Descriptor representing a grib1 grib descriptor section (GDS) with an integer array.
    +
    Abstract grid that holds fields and methods common to all grids.
    Definition: ip_grid_mod.F90:58
    +
    +
    + + + + diff --git a/ver-5.1.0/ip__grid__descriptor__mod_8F90.html b/ver-5.1.0/ip__grid__descriptor__mod_8F90.html new file mode 100644 index 00000000..59cf6d5f --- /dev/null +++ b/ver-5.1.0/ip__grid__descriptor__mod_8F90.html @@ -0,0 +1,154 @@ + + + + + + + +NCEPLIBS-ip: ip_grid_descriptor_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_grid_descriptor_mod.F90 File Reference
    +
    +
    + +

    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + +

    +Data Types

    type  ip_grid_descriptor_mod::grib1_descriptor
     Descriptor representing a grib1 grib descriptor section (GDS) with an integer array. More...
     
    type  ip_grid_descriptor_mod::grib2_descriptor
     Grib-2 descriptor containing a grib2 GDT represented by an integer array. More...
     
    interface  ip_grid_descriptor_mod::init_descriptor
     
    type  ip_grid_descriptor_mod::ip_grid_descriptor
     Abstract descriptor object which represents a grib1 or grib2 descriptor. More...
     
    interface  ip_grid_descriptor_mod::operator(==)
     
    + + + + +

    +Modules

    module  ip_grid_descriptor_mod
     Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
     
    + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    type(grib1_descriptor) function, public ip_grid_descriptor_mod::init_grib1_descriptor (gds)
     Initialize grib-1 descriptor from integer grid definition section (GDS). More...
     
    type(grib2_descriptor) function, public ip_grid_descriptor_mod::init_grib2_descriptor (gdt_num, gdt_len, gdt_tmpl)
     Initialize grib-2 descriptor from integer grid definition template (GDT). More...
     
    logical function ip_grid_descriptor_mod::is_same_grid (grid1, grid2)
     Test whether two grid descriptors are the same. More...
     
    logical function ip_grid_descriptor_mod::is_same_grid_grib1 (self, grid_desc)
     Test whether two grib1_descriptors are the same. More...
     
    logical function ip_grid_descriptor_mod::is_same_grid_grib2 (self, grid_desc)
     Test whether two grib2_descriptors are the same. More...
     
    +

    Detailed Description

    +

    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.

    +
    Author
    Kyle Gerheiser
    + +

    Definition in file ip_grid_descriptor_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/ip__grid__descriptor__mod_8F90.js b/ver-5.1.0/ip__grid__descriptor__mod_8F90.js new file mode 100644 index 00000000..4b84aa87 --- /dev/null +++ b/ver-5.1.0/ip__grid__descriptor__mod_8F90.js @@ -0,0 +1,13 @@ +var ip__grid__descriptor__mod_8F90 = +[ + [ "grib1_descriptor", "structip__grid__descriptor__mod_1_1grib1__descriptor.html", "structip__grid__descriptor__mod_1_1grib1__descriptor" ], + [ "grib2_descriptor", "structip__grid__descriptor__mod_1_1grib2__descriptor.html", "structip__grid__descriptor__mod_1_1grib2__descriptor" ], + [ "init_descriptor", "interfaceip__grid__descriptor__mod_1_1init__descriptor.html", "interfaceip__grid__descriptor__mod_1_1init__descriptor" ], + [ "ip_grid_descriptor", "structip__grid__descriptor__mod_1_1ip__grid__descriptor.html", "structip__grid__descriptor__mod_1_1ip__grid__descriptor" ], + [ "operator(==)", "interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08.html", "interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08" ], + [ "init_grib1_descriptor", "ip__grid__descriptor__mod_8F90.html#aa00884a7fca018535eaf0c2ebe26bc98", null ], + [ "init_grib2_descriptor", "ip__grid__descriptor__mod_8F90.html#a143ac06a2a20697d01606a259213b451", null ], + [ "is_same_grid", "ip__grid__descriptor__mod_8F90.html#a202219f9c5c84fa04d3eb1c2208358ec", null ], + [ "is_same_grid_grib1", "ip__grid__descriptor__mod_8F90.html#a5bb3c5230b88012bddc3922bfa1cb019", null ], + [ "is_same_grid_grib2", "ip__grid__descriptor__mod_8F90.html#a75ac34ea9372afaa29b0df2ce8919988", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ip__grid__descriptor__mod_8F90_source.html b/ver-5.1.0/ip__grid__descriptor__mod_8F90_source.html new file mode 100644 index 00000000..ee2abb74 --- /dev/null +++ b/ver-5.1.0/ip__grid__descriptor__mod_8F90_source.html @@ -0,0 +1,577 @@ + + + + + + + +NCEPLIBS-ip: ip_grid_descriptor_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ip_grid_descriptor_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    5 
    + +
    16  implicit none
    +
    17 
    +
    18  private
    +
    19 
    +
    20  public :: ip_grid_descriptor
    + + +
    23 
    +
    24  public :: operator(==)
    +
    25 
    +
    28  type, abstract :: ip_grid_descriptor
    +
    29  integer :: grid_num
    +
    30  contains
    +
    32  procedure :: is_same_grid
    +
    33  end type ip_grid_descriptor
    +
    34 
    + +
    39  integer :: gds(200)
    +
    40  contains
    +
    42  procedure :: is_same_grid_grib1
    +
    43  end type grib1_descriptor
    +
    44 
    + +
    48  integer :: gdt_num
    +
    49  integer :: gdt_len
    +
    50  integer, allocatable :: gdt_tmpl(:)
    +
    51  contains
    +
    53  procedure :: is_same_grid_grib2
    +
    54  end type grib2_descriptor
    +
    55 
    +
    56  interface operator (==)
    +
    57  module procedure is_same_grid
    +
    58  end interface operator (==)
    +
    59 
    +
    60  interface init_descriptor
    +
    61  module procedure init_grib1_descriptor
    +
    62  module procedure init_grib2_descriptor
    +
    63  end interface init_descriptor
    +
    64 
    +
    65 contains
    +
    66 
    +
    74  function init_grib1_descriptor(gds) result(desc)
    +
    75  type(grib1_descriptor) :: desc
    +
    76  integer, intent(in) :: gds(:)
    +
    77  desc%gds = gds
    +
    78  desc%grid_num = gds(1)
    +
    79 
    +
    80  !call desc%decode_template()
    +
    81 
    +
    82  end function init_grib1_descriptor
    +
    83 
    +
    93  function init_grib2_descriptor(gdt_num, gdt_len, gdt_tmpl) result(desc)
    +
    94  type(grib2_descriptor) :: desc
    +
    95  integer, intent(in) :: gdt_num, gdt_len, gdt_tmpl(:)
    +
    96  desc%grid_num = gdt_num
    +
    97 
    +
    98  desc%gdt_num = gdt_num
    +
    99  desc%gdt_len = gdt_len
    +
    100  allocate(desc%gdt_tmpl(gdt_len))
    +
    101  desc%gdt_tmpl = gdt_tmpl
    +
    102 
    +
    103  !call desc%decode_template()
    +
    104 
    +
    105  end function init_grib2_descriptor
    +
    106 
    +
    115  logical function is_same_grid(grid1, grid2)
    +
    116  class(ip_grid_descriptor), intent(in) :: grid1, grid2
    +
    117 
    +
    118  select type(grid1)
    +
    119  type is(grib1_descriptor)
    +
    120  select type(grid2)
    +
    121  type is(grib1_descriptor)
    +
    122  is_same_grid = grid1%is_same_grid_grib1(grid2)
    +
    123  class default
    +
    124  is_same_grid = .false.
    +
    125  end select
    +
    126  type is(grib2_descriptor)
    +
    127  select type(grid2)
    +
    128  type is(grib2_descriptor)
    +
    129  is_same_grid = grid1%is_same_grid_grib2(grid2)
    +
    130  class default
    +
    131  is_same_grid = .false.
    +
    132  end select
    +
    133  end select
    +
    134 
    +
    135  end function is_same_grid
    +
    136 
    +
    145  logical function is_same_grid_grib1(self, grid_desc) result(same_grid)
    +
    146  class(grib1_descriptor), intent(in) :: self, grid_desc
    +
    147 
    +
    148  if (all(self%gds == grid_desc%gds)) then
    +
    149  same_grid = .true.
    +
    150  else
    +
    151  same_grid = .false.
    +
    152  end if
    +
    153 
    +
    154  end function is_same_grid_grib1
    +
    155 
    +
    164  logical function is_same_grid_grib2(self, grid_desc) result(same_grid)
    +
    165  class(grib2_descriptor), intent(in) :: self, grid_desc
    +
    166 
    +
    167  same_grid = .false.
    +
    168  if (self%grid_num == grid_desc%grid_num) then
    +
    169  if (self%gdt_len == grid_desc%gdt_len) then
    +
    170  if (all(self%gdt_tmpl == grid_desc%gdt_tmpl)) then
    +
    171  same_grid = .true.
    +
    172  end if
    +
    173  end if
    +
    174  end if
    +
    175 
    +
    176  end function is_same_grid_grib2
    +
    177 
    +
    178 
    +
    179 
    +
    180  ! subroutine decode_template_grib1(self)
    +
    181  ! type(grib1_descriptor), intent(inout) :: self
    +
    182 
    +
    183  ! integer :: im, jm, iwrap, jg
    +
    184  ! integer :: iscan, kscan, nscan, nscan_field_pos
    +
    185  ! integer :: jwrap1, jwrap2
    +
    186 
    +
    187  ! real :: dlat, dlon
    +
    188  ! real :: rlat1, rlat2
    +
    189  ! real :: rlon1, rlon2
    +
    190 
    +
    191  ! ! set a default value for this to check if it has changed
    +
    192  ! ! for rotated grids nscan is set = 3, but in other places it's not, so use this special value
    +
    193  ! ! just for field_position routine
    +
    194  ! nscan_field_pos = -1
    +
    195 
    +
    196  ! im = self%gds(2)
    +
    197  ! jm = self%gds(3)
    +
    198  ! iwrap = 0
    +
    199  ! jwrap1 = 0
    +
    200  ! jwrap2 = 0
    +
    201  ! nscan = mod(self%gds(11) / 32, 2)
    +
    202  ! kscan = 0
    +
    203 
    +
    204  ! select case(self%gds(1))
    +
    205  ! case(0)
    +
    206  ! rlon1=self%gds(5)*1.e-3
    +
    207  ! rlon2=self%gds(8)*1.e-3
    +
    208  ! iscan=mod(self%gds(11)/128,2)
    +
    209  ! if(iscan.eq.0) then
    +
    210  ! dlon=(mod(rlon2-rlon1-1+3600,360.)+1)/(im-1)
    +
    211  ! else
    +
    212  ! dlon=-(mod(rlon1-rlon2-1+3600,360.)+1)/(im-1)
    +
    213  ! endif
    +
    214  ! iwrap=nint(360/abs(dlon))
    +
    215  ! if(im.lt.iwrap) iwrap=0
    +
    216  ! if(iwrap.gt.0.and.mod(iwrap,2).eq.0) then
    +
    217  ! rlat1=self%gds(4)*1.e-3
    +
    218  ! rlat2=self%gds(7)*1.e-3
    +
    219  ! dlat=abs(rlat2-rlat1)/(jm-1)
    +
    220  ! if(abs(rlat1).gt.90-0.25*dlat) then
    +
    221  ! jwrap1=2
    +
    222  ! elseif(abs(rlat1).gt.90-0.75*dlat) then
    +
    223  ! jwrap1=1
    +
    224  ! endif
    +
    225  ! if(abs(rlat2).gt.90-0.25*dlat) then
    +
    226  ! jwrap2=2*jm
    +
    227  ! elseif(abs(rlat2).gt.90-0.75*dlat) then
    +
    228  ! jwrap2=2*jm+1
    +
    229  ! endif
    +
    230  ! endif
    +
    231  ! case(1)
    +
    232  ! rlon1=self%gds(5)*1.e-3
    +
    233  ! rlon2=self%gds(8)*1.e-3
    +
    234  ! iscan=mod(self%gds(11)/128,2)
    +
    235  ! if(iscan.eq.0) then
    +
    236  ! dlon=(mod(rlon2-rlon1-1+3600,360.)+1)/(im-1)
    +
    237  ! else
    +
    238  ! dlon=-(mod(rlon1-rlon2-1+3600,360.)+1)/(im-1)
    +
    239  ! endif
    +
    240  ! iwrap=nint(360/abs(dlon))
    +
    241  ! if(im.lt.iwrap) iwrap=0
    +
    242  ! case(4)
    +
    243  ! rlon1=self%gds(5)*1.e-3
    +
    244  ! rlon2=self%gds(8)*1.e-3
    +
    245  ! iscan=mod(self%gds(11)/128,2)
    +
    246  ! if(iscan.eq.0) then
    +
    247  ! dlon=(mod(rlon2-rlon1-1+3600,360.)+1)/(im-1)
    +
    248  ! else
    +
    249  ! dlon=-(mod(rlon1-rlon2-1+3600,360.)+1)/(im-1)
    +
    250  ! endif
    +
    251  ! iwrap=nint(360/abs(dlon))
    +
    252  ! if(im.lt.iwrap) iwrap=0
    +
    253  ! if(iwrap.gt.0.and.mod(iwrap,2).eq.0) then
    +
    254  ! jg=self%gds(10)*2
    +
    255  ! if(jm.eq.jg) then
    +
    256  ! jwrap1=1
    +
    257  ! jwrap2=2*jm+1
    +
    258  ! endif
    +
    259  ! endif
    +
    260  ! case(203)
    +
    261  ! ! why is nscan set to 3 for this grid?
    +
    262  ! nscan_field_pos = 3
    +
    263  ! kscan=mod(self%gds(11) / 256, 2)
    +
    264  ! case default
    +
    265  ! print *, "grib1 grid type ", self%gds(1), " not recognized"
    +
    266  ! error stop
    +
    267  ! end select
    +
    268 
    +
    269  ! self%im = im
    +
    270  ! self%jm = jm
    +
    271  ! self%nm = im * jm
    +
    272  ! self%iwrap = iwrap
    +
    273  ! self%jwrap1 = jwrap1
    +
    274  ! self%jwrap2 = jwrap2
    +
    275  ! self%nscan = nscan
    +
    276 
    +
    277  ! if (nscan_field_pos == -1) then
    +
    278  ! ! just use regular value of nscan
    +
    279  ! self%nscan_field_pos = nscan
    +
    280  ! else
    +
    281  ! ! nscan = 3 for rotated grids and is set to 3 for use in field_position
    +
    282  ! self%nscan_field_pos = nscan_field_pos
    +
    283  ! end if
    +
    284 
    +
    285  ! self%kscan = kscan
    +
    286 
    +
    287  ! end subroutine decode_template_grib1
    +
    288 
    +
    289  ! subroutine decode_template_grib2(self)
    +
    290  ! type(grib2_descriptor), intent(inout) :: self
    +
    291 
    +
    292  ! integer :: im, jm, iwrap, jg
    +
    293  ! integer :: i_offset_odd, i_offset_even
    +
    294  ! integer :: iscan, kscan, nscan, nscan_field_pos
    +
    295  ! integer :: jwrap1, jwrap2, iscale
    +
    296 
    +
    297  ! real :: dlat, dlon
    +
    298  ! real :: rlat1, rlat2
    +
    299  ! real :: rlon1, rlon2
    +
    300 
    +
    301  ! nscan_field_pos = -1
    +
    302 
    +
    303  ! select case(self%gdt_num)
    +
    304  ! ! EQUIDISTANT CYLINDRICAL
    +
    305  ! case(0)
    +
    306  ! im=self%gdt_tmpl(8)
    +
    307  ! jm=self%gdt_tmpl(9)
    +
    308  ! nscan=mod(self%gdt_tmpl(19)/32,2)
    +
    309  ! kscan=0
    +
    310  ! iscale=self%gdt_tmpl(10)*self%gdt_tmpl(11)
    +
    311  ! if(iscale==0) iscale=10**6
    +
    312  ! rlon1=float(self%gdt_tmpl(13))/float(iscale)
    +
    313  ! rlon2=float(self%gdt_tmpl(16))/float(iscale)
    +
    314  ! iscan=mod(self%gdt_tmpl(19)/128,2)
    +
    315  ! if(iscan.eq.0) then
    +
    316  ! dlon=(mod(rlon2-rlon1-1+3600,360.)+1)/(im-1)
    +
    317  ! else
    +
    318  ! dlon=-(mod(rlon1-rlon2-1+3600,360.)+1)/(im-1)
    +
    319  ! endif
    +
    320  ! iwrap=nint(360/abs(dlon))
    +
    321  ! if(im.lt.iwrap) iwrap=0
    +
    322  ! jwrap1=0
    +
    323  ! jwrap2=0
    +
    324  ! if(iwrap.gt.0.and.mod(iwrap,2).eq.0) then
    +
    325  ! rlat1=float(self%gdt_tmpl(12))/float(iscale)
    +
    326  ! rlat2=float(self%gdt_tmpl(15))/float(iscale)
    +
    327  ! dlat=abs(rlat2-rlat1)/(jm-1)
    +
    328  ! if(abs(rlat1).gt.90-0.25*dlat) then
    +
    329  ! jwrap1=2
    +
    330  ! elseif(abs(rlat1).gt.90-0.75*dlat) then
    +
    331  ! jwrap1=1
    +
    332  ! endif
    +
    333  ! if(abs(rlat2).gt.90-0.25*dlat) then
    +
    334  ! jwrap2=2*jm
    +
    335  ! elseif(abs(rlat2).gt.90-0.75*dlat) then
    +
    336  ! jwrap2=2*jm+1
    +
    337  ! endif
    +
    338  ! endif
    +
    339  ! case(1)
    +
    340  ! i_offset_odd=mod(self%gdt_tmpl(19)/8,2)
    +
    341  ! i_offset_even=mod(self%gdt_tmpl(19)/4,2)
    +
    342  ! im=self%gdt_tmpl(8)
    +
    343  ! jm=self%gdt_tmpl(9)
    +
    344  ! iwrap=0
    +
    345  ! jwrap1=0
    +
    346  ! jwrap2=0
    +
    347  ! kscan=0
    +
    348  ! nscan=mod(self%gdt_tmpl(19)/32,2)
    +
    349  ! if(i_offset_odd/=i_offset_even)then
    +
    350  ! kscan=i_offset_odd
    +
    351  ! nscan_field_pos=3
    +
    352  ! endif
    +
    353  ! ! MERCATOR CYLINDRICAL
    +
    354  ! case(10)
    +
    355  ! im=self%gdt_tmpl(8)
    +
    356  ! jm=self%gdt_tmpl(9)
    +
    357  ! rlon1=float(self%gdt_tmpl(11))*1.0e-6
    +
    358  ! rlon2=float(self%gdt_tmpl(15))*1.0e-6
    +
    359  ! iscan=mod(self%gdt_tmpl(16)/128,2)
    +
    360  ! if(iscan.eq.0) then
    +
    361  ! dlon=(mod(rlon2-rlon1-1+3600,360.)+1)/(im-1)
    +
    362  ! else
    +
    363  ! dlon=-(mod(rlon1-rlon2-1+3600,360.)+1)/(im-1)
    +
    364  ! endif
    +
    365  ! iwrap=nint(360/abs(dlon))
    +
    366  ! if(im.lt.iwrap) iwrap=0
    +
    367  ! jwrap1=0
    +
    368  ! jwrap2=0
    +
    369  ! kscan=0
    +
    370  ! nscan=mod(self%gdt_tmpl(16)/32,2)
    +
    371  ! ! POLAR STEREOGRAPHIC AZIMUTHAL
    +
    372  ! case(20)
    +
    373  ! im=self%gdt_tmpl(8)
    +
    374  ! jm=self%gdt_tmpl(9)
    +
    375  ! nscan=mod(self%gdt_tmpl(18)/32,2)
    +
    376  ! iwrap=0
    +
    377  ! jwrap1=0
    +
    378  ! jwrap2=0
    +
    379  ! kscan=0
    +
    380  ! ! LAMBERT CONFORMAL CONICAL
    +
    381  ! case(30)
    +
    382  ! im=self%gdt_tmpl(8)
    +
    383  ! jm=self%gdt_tmpl(9)
    +
    384  ! nscan=mod(self%gdt_tmpl(18)/32,2)
    +
    385  ! iwrap=0
    +
    386  ! jwrap1=0
    +
    387  ! jwrap2=0
    +
    388  ! kscan=0
    +
    389  ! ! GAUSSIAN CYLINDRICAL
    +
    390  ! case(40)
    +
    391  ! im=self%gdt_tmpl(8)
    +
    392  ! jm=self%gdt_tmpl(9)
    +
    393  ! iscale=self%gdt_tmpl(10)*self%gdt_tmpl(11)
    +
    394  ! if(iscale==0) iscale=10**6
    +
    395  ! rlon1=float(self%gdt_tmpl(13))/float(iscale)
    +
    396  ! rlon2=float(self%gdt_tmpl(16))/float(iscale)
    +
    397  ! iscan=mod(self%gdt_tmpl(19)/128,2)
    +
    398  ! if(iscan.eq.0) then
    +
    399  ! dlon=(mod(rlon2-rlon1-1+3600,360.)+1)/(im-1)
    +
    400  ! else
    +
    401  ! dlon=-(mod(rlon1-rlon2-1+3600,360.)+1)/(im-1)
    +
    402  ! endif
    +
    403  ! iwrap=nint(360/abs(dlon))
    +
    404  ! if(im.lt.iwrap) iwrap=0
    +
    405  ! jwrap1=0
    +
    406  ! jwrap2=0
    +
    407  ! if(iwrap.gt.0.and.mod(iwrap,2).eq.0) then
    +
    408  ! jg=self%gdt_tmpl(18)*2
    +
    409  ! if(jm.eq.jg) then
    +
    410  ! jwrap1=1
    +
    411  ! jwrap2=2*jm+1
    +
    412  ! endif
    +
    413  ! endif
    +
    414  ! nscan=mod(self%gdt_tmpl(19)/32,2)
    +
    415  ! kscan=0
    +
    416  ! case default
    +
    417  ! print *, "gdt_num ", self%gdt_num, " not recognized"
    +
    418  ! error stop
    +
    419  ! end select
    +
    420 
    +
    421  ! self%im = im
    +
    422  ! self%jm = jm
    +
    423  ! self%nm = im*jm
    +
    424  ! self%iwrap = iwrap
    +
    425  ! self%jwrap1 = jwrap1
    +
    426  ! self%jwrap2 = jwrap2
    +
    427  ! self%nscan = nscan
    +
    428  ! if (nscan_field_pos == -1) then
    +
    429  ! self%nscan_field_pos = nscan
    +
    430  ! else
    +
    431  ! self%nscan_field_pos = nscan_field_pos
    +
    432  ! end if
    +
    433  ! self%kscan = kscan
    +
    434 
    +
    435  ! end subroutine decode_template_grib2
    +
    436 
    +
    437  ! subroutine earth_radius(self, radius, eccen_squared)
    +
    438  ! class(ip_grid_descriptor), intent(in) :: self
    +
    439  ! real, intent(out) :: radius, eccen_squared
    +
    440 
    +
    441  ! real :: flat, major_axis, minor_axis
    +
    442  ! logical :: elliptical
    +
    443 
    +
    444  ! select type(self)
    +
    445  ! type is(grib1_descriptor)
    +
    446  ! associate(gds => self%gds)
    +
    447  ! select case(gds(1))
    +
    448  ! case(0)
    +
    449  ! radius = 6.3712d6
    +
    450  ! eccen_squared = 0d0
    +
    451  ! case(1)
    +
    452  ! radius = 6.3712d6
    +
    453  ! eccen_squared = 0d0
    +
    454  ! case(3)
    +
    455  ! radius = 6.3712d6
    +
    456  ! eccen_squared = 0d0
    +
    457  ! case(4)
    +
    458  ! radius = 6.3712d6
    +
    459  ! eccen_squared = 0d0
    +
    460  ! case(5)
    +
    461  ! elliptical = mod(gds(6) / 64, 2) == 1
    +
    462  ! if (.not. elliptical) then
    +
    463  ! radius = 6.3712d6
    +
    464  ! eccen_squared = 0d0
    +
    465  ! else
    +
    466  ! radius = 6.378137E6 ! WGS-84
    +
    467  ! eccen_squared = 0.00669437999013d0
    +
    468  ! end if
    +
    469  ! case(203)
    +
    470  ! radius = 6.3712d6
    +
    471  ! eccen_squared = 0d0
    +
    472  ! case(205)
    +
    473  ! radius = 6.3712d6
    +
    474  ! eccen_squared = 0d0
    +
    475  ! case default
    +
    476  ! print *, "grib1 grid not recognized. gds(1) = ", gds(1)
    +
    477  ! error stop
    +
    478  ! end select
    +
    479  ! end associate
    +
    480  ! type is(grib2_descriptor)
    +
    481  ! associate(gdt_tmpl => self%gdt_tmpl)
    +
    482  ! select case (gdt_tmpl(1))
    +
    483  ! case (0)
    +
    484  ! radius = 6367470.0
    +
    485  ! eccen_squared = 0.0
    +
    486  ! case (1) ! user specified spherical
    +
    487  ! radius = float(gdt_tmpl(3))/float(10**gdt_tmpl(2))
    +
    488  ! eccen_squared = 0.0
    +
    489  ! case (2) ! iau 1965
    +
    490  ! radius = 6378160.0 ! semi major axis
    +
    491  ! flat = 1.0/297.0 ! flattening
    +
    492  ! eccen_squared = (2.0*flat) - (flat**2)
    +
    493  ! case (3) ! user specified elliptical (km)
    +
    494  ! major_axis = float(gdt_tmpl(5))/float(10**gdt_tmpl(4))
    +
    495  ! major_axis = major_axis * 1000.0
    +
    496  ! minor_axis = float(gdt_tmpl(7))/float(10**gdt_tmpl(6))
    +
    497  ! minor_axis = minor_axis * 1000.0
    +
    498  ! eccen_squared = 1.0 - (minor_axis**2 / major_axis**2)
    +
    499  ! radius = major_axis
    +
    500  ! case (4) ! iag-grs80 model
    +
    501  ! radius = 6378137.0 ! semi major axis
    +
    502  ! flat = 1.0/298.2572 ! flattening
    +
    503  ! eccen_squared = (2.0*flat) - (flat**2)
    +
    504  ! case (5) ! wgs84 datum
    +
    505  ! radius = 6378137.0 ! semi major axis
    +
    506  ! eccen_squared = 0.00669437999013
    +
    507  ! case (6)
    +
    508  ! radius = 6371229.0
    +
    509  ! eccen_squared = 0.0
    +
    510  ! case (7) ! user specified elliptical (m)
    +
    511  ! major_axis = float(gdt_tmpl(5))/float(10**gdt_tmpl(4))
    +
    512  ! minor_axis = float(gdt_tmpl(7))/float(10**gdt_tmpl(6))
    +
    513  ! eccen_squared = 1.0 - (minor_axis**2 / major_axis**2)
    +
    514  ! radius = major_axis
    +
    515  ! case (8)
    +
    516  ! radius = 6371200.0
    +
    517  ! eccen_squared = 0.0
    +
    518  ! case default
    +
    519  ! radius = -9999.
    +
    520  ! eccen_squared = -9999.
    +
    521  ! error stop
    +
    522  ! end select
    +
    523  ! end associate
    +
    524  ! class default
    +
    525  ! print *, "unknown descriptor type"
    +
    526  ! error stop
    +
    527  ! end select
    +
    528  ! end subroutine earth_radius
    +
    529 
    +
    530 end module ip_grid_descriptor_mod
    + +
    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
    +
    type(grib2_descriptor) function, public init_grib2_descriptor(gdt_num, gdt_len, gdt_tmpl)
    Initialize grib-2 descriptor from integer grid definition template (GDT).
    +
    logical function is_same_grid(grid1, grid2)
    Test whether two grid descriptors are the same.
    +
    logical function is_same_grid_grib1(self, grid_desc)
    Test whether two grib1_descriptors are the same.
    +
    logical function is_same_grid_grib2(self, grid_desc)
    Test whether two grib2_descriptors are the same.
    +
    type(grib1_descriptor) function, public init_grib1_descriptor(gds)
    Initialize grib-1 descriptor from integer grid definition section (GDS).
    +
    Descriptor representing a grib1 grib descriptor section (GDS) with an integer array.
    +
    Grib-2 descriptor containing a grib2 GDT represented by an integer array.
    +
    Abstract descriptor object which represents a grib1 or grib2 descriptor.
    +
    +
    + + + + diff --git a/ver-5.1.0/ip__grid__factory__mod_8F90.html b/ver-5.1.0/ip__grid__factory__mod_8F90.html new file mode 100644 index 00000000..fe2f1ead --- /dev/null +++ b/ver-5.1.0/ip__grid__factory__mod_8F90.html @@ -0,0 +1,138 @@ + + + + + + + +NCEPLIBS-ip: ip_grid_factory_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_grid_factory_mod.F90 File Reference
    +
    +
    + +

    Routines for creating an ip_grid given a Grib descriptor. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Data Types

    interface  ip_grid_factory_mod::init_grid
     
    + + + + +

    +Modules

    module  ip_grid_factory_mod
     Routines for creating an ip_grid given a Grib descriptor.
     
    + + + + + + + + + + +

    +Functions/Subroutines

    subroutine ip_grid_factory_mod::init_grid_generic (grid, grid_desc)
     Initializes a polymorphic ip_grid object from an ip_grid_descriptor. More...
     
    subroutine ip_grid_factory_mod::init_grid_grib1 (grid, g1_desc)
     Initializes a polymorphic ip_grid from a grib1_descriptor. More...
     
    subroutine ip_grid_factory_mod::init_grid_grib2 (grid, g2_desc)
     Initializes a polymorphic ip_grid from a grib2_descriptor. More...
     
    +

    Detailed Description

    +

    Routines for creating an ip_grid given a Grib descriptor.

    +
    Author
    Mark Iredell, George Gayno, Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition in file ip_grid_factory_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/ip__grid__factory__mod_8F90.js b/ver-5.1.0/ip__grid__factory__mod_8F90.js new file mode 100644 index 00000000..c8acead3 --- /dev/null +++ b/ver-5.1.0/ip__grid__factory__mod_8F90.js @@ -0,0 +1,7 @@ +var ip__grid__factory__mod_8F90 = +[ + [ "init_grid", "interfaceip__grid__factory__mod_1_1init__grid.html", "interfaceip__grid__factory__mod_1_1init__grid" ], + [ "init_grid_generic", "ip__grid__factory__mod_8F90.html#a2d2ea07d353bae8b057471aa99b58e46", null ], + [ "init_grid_grib1", "ip__grid__factory__mod_8F90.html#ad8906ed6fe52c2426c0ff09ce50b6fc5", null ], + [ "init_grid_grib2", "ip__grid__factory__mod_8F90.html#aa187dc8dbd1d004a51cc0e9826ffa225", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ip__grid__factory__mod_8F90_source.html b/ver-5.1.0/ip__grid__factory__mod_8F90_source.html new file mode 100644 index 00000000..f2e3bfce --- /dev/null +++ b/ver-5.1.0/ip__grid__factory__mod_8F90_source.html @@ -0,0 +1,224 @@ + + + + + + + +NCEPLIBS-ip: ip_grid_factory_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ip_grid_factory_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    6 
    + + +
    13  use ip_grids_mod
    +
    14  use ip_grid_mod
    +
    15  implicit none
    +
    16 
    +
    17  private
    +
    18  public :: init_grid
    +
    19 
    +
    20  interface init_grid
    +
    21  module procedure init_grid_generic
    +
    22  end interface init_grid
    +
    23 
    +
    24 contains
    +
    25 
    +
    33  subroutine init_grid_generic(grid, grid_desc)
    +
    34  class(ip_grid_descriptor), intent(in) :: grid_desc
    +
    35  class(ip_grid), allocatable, intent(out) :: grid
    +
    36 
    +
    37  select type(grid_desc)
    +
    38  type is(grib1_descriptor)
    +
    39  call init_grid_grib1(grid, grid_desc)
    +
    40  type is(grib2_descriptor)
    +
    41  call init_grid_grib2(grid, grid_desc)
    +
    42  end select
    +
    43  end subroutine init_grid_generic
    +
    44 
    +
    53  subroutine init_grid_grib1(grid, g1_desc)
    +
    54  type(grib1_descriptor), intent(in) :: g1_desc
    +
    55  class(ip_grid), allocatable, intent(out) :: grid
    +
    56 
    +
    57  select case(g1_desc%grid_num)
    +
    58  case(:-1)
    +
    59  allocate(ip_station_points_grid::grid)
    + +
    61  allocate(ip_equid_cylind_grid::grid)
    + +
    63  allocate(ip_mercator_grid::grid)
    + +
    65  allocate(ip_lambert_conf_grid::grid)
    + +
    67  allocate(ip_gaussian_grid::grid)
    + +
    69  allocate(ip_polar_stereo_grid::grid)
    + +
    71  allocate(ip_rot_equid_cylind_egrid::grid)
    + +
    73  allocate(ip_rot_equid_cylind_grid::grid)
    +
    74  end select
    +
    75 
    +
    76  call grid%init(g1_desc)
    +
    77  allocate(grid%descriptor, source = g1_desc)
    +
    78  end subroutine init_grid_grib1
    +
    79 
    +
    80 
    +
    89  subroutine init_grid_grib2(grid, g2_desc)
    +
    90  type(grib2_descriptor), intent(in) :: g2_desc
    +
    91  class(ip_grid), allocatable, intent(out) :: grid
    +
    92 
    +
    93  integer :: i_offset_odd, i_offset_even
    +
    94 
    +
    95  select case(g2_desc%grid_num)
    +
    96  case(:-1)
    +
    97  allocate(ip_station_points_grid::grid)
    + +
    99  allocate(ip_equid_cylind_grid::grid)
    + +
    101  i_offset_odd = mod(g2_desc%gdt_tmpl(19) / 8, 2)
    +
    102  i_offset_even = mod(g2_desc%gdt_tmpl(19) / 4, 2)
    +
    103  if (i_offset_odd /= i_offset_even) then
    +
    104  allocate(ip_rot_equid_cylind_egrid::grid)
    +
    105  else
    +
    106  allocate(ip_rot_equid_cylind_grid::grid)
    +
    107  end if
    + +
    109  allocate(ip_mercator_grid::grid)
    + +
    111  allocate(ip_polar_stereo_grid::grid)
    + +
    113  allocate(ip_lambert_conf_grid::grid)
    + +
    115  allocate(ip_gaussian_grid::grid)
    + +
    117  allocate(ip_rot_equid_cylind_egrid::grid)
    + +
    119  allocate(ip_rot_equid_cylind_grid::grid)
    +
    120  case default
    +
    121  print *, "gdt_num: ", g2_desc%gdt_num, " not recognized"
    +
    122  error stop
    +
    123  end select
    +
    124 
    +
    125  call grid%init(g2_desc)
    +
    126  allocate(grid%descriptor, source = g2_desc)
    +
    127  end subroutine init_grid_grib2
    +
    128 
    +
    129 end module ip_grid_factory_mod
    + +
    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
    +
    Routines for creating an ip_grid given a Grib descriptor.
    +
    subroutine init_grid_generic(grid, grid_desc)
    Initializes a polymorphic ip_grid object from an ip_grid_descriptor.
    +
    subroutine init_grid_grib2(grid, g2_desc)
    Initializes a polymorphic ip_grid from a grib2_descriptor.
    +
    subroutine init_grid_grib1(grid, g1_desc)
    Initializes a polymorphic ip_grid from a grib1_descriptor.
    +
    Abstract ip_grid type.
    Definition: ip_grid_mod.F90:10
    +
    integer, parameter, public rot_equid_cylind_e_grid_id_grib2
    Integer grid number for rotated equidistant cylindrical E-stagger grid (grib2)
    Definition: ip_grid_mod.F90:28
    +
    integer, parameter, public lambert_conf_grid_id_grib2
    Integer grid number for Lambert conformal grid in grib2.
    Definition: ip_grid_mod.F90:26
    +
    integer, parameter, public gaussian_grid_id_grib2
    Integer grid number for Gaussian grid in grib2.
    Definition: ip_grid_mod.F90:27
    +
    integer, parameter, public equid_cylind_grid_id_grib2
    Integer grid number for equidistant cylindrical grid in grib2.
    Definition: ip_grid_mod.F90:22
    +
    integer, parameter, public gaussian_grid_id_grib1
    Integer grid number for Gaussian grid in grib1.
    Definition: ip_grid_mod.F90:17
    +
    integer, parameter, public rot_equid_cylind_e_grid_id_grib1
    Integer grid number for rotated equidistant cylindrical E-stagger grid.
    Definition: ip_grid_mod.F90:19
    +
    integer, parameter, public polar_stereo_grid_id_grib2
    Integer grid number for polar stereo grid in grib2.
    Definition: ip_grid_mod.F90:25
    +
    integer, parameter, public lambert_conf_grid_id_grib1
    Integer grid number for Lambert Conformal grid in grib1.
    Definition: ip_grid_mod.F90:16
    +
    integer, parameter, public mercator_grid_id_grib1
    Integer grid number for Mercator grid in grib1.
    Definition: ip_grid_mod.F90:15
    +
    integer, parameter, public equid_cylind_grid_id_grib1
    Integer grid number for equidistant cylindrical grid in grib1.
    Definition: ip_grid_mod.F90:14
    +
    integer, parameter, public rot_equid_cylind_b_grid_id_grib1
    Integer grid number for rotated equidistant cylindrical B-stagger grid.
    Definition: ip_grid_mod.F90:20
    +
    integer, parameter, public rot_equid_cylind_b_grid_id_grib2
    Integer grid number for rotated equidistant cylindrical B-stagger grid (grib2)
    Definition: ip_grid_mod.F90:29
    +
    integer, parameter, public rot_equid_cylind_grid_id_grib2
    Integer grid number for rotated equidistant cylindrical grid in grib2.
    Definition: ip_grid_mod.F90:23
    +
    integer, parameter, public mercator_grid_id_grib2
    Integer grid number for Mercator grid in grib2.
    Definition: ip_grid_mod.F90:24
    +
    integer, parameter, public polar_stereo_grid_id_grib1
    Integer grid number for polar stereo grid in grib1.
    Definition: ip_grid_mod.F90:18
    +
    Re-export the individual grids.
    Definition: ip_grids_mod.F90:7
    +
    Descriptor representing a grib1 grib descriptor section (GDS) with an integer array.
    +
    Grib-2 descriptor containing a grib2 GDT represented by an integer array.
    +
    Abstract descriptor object which represents a grib1 or grib2 descriptor.
    +
    Abstract grid that holds fields and methods common to all grids.
    Definition: ip_grid_mod.F90:58
    +
    +
    + + + + diff --git a/ver-5.1.0/ip__grid__mod_8F90.html b/ver-5.1.0/ip__grid__mod_8F90.html new file mode 100644 index 00000000..c8b0a83c --- /dev/null +++ b/ver-5.1.0/ip__grid__mod_8F90.html @@ -0,0 +1,203 @@ + + + + + + + +NCEPLIBS-ip: ip_grid_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_grid_mod.F90 File Reference
    +
    +
    + +

    Abstract ip_grid type. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + +

    +Data Types

    interface  ip_grid_mod::gdswzd_interface
     
    interface  ip_grid_mod::init_grib1_interface
     
    interface  ip_grid_mod::init_grib2_interface
     
    type  ip_grid_mod::ip_grid
     Abstract grid that holds fields and methods common to all grids. More...
     
    interface  ip_grid_mod::operator(==)
     Check equality. More...
     
    + + + + +

    +Modules

    module  ip_grid_mod
     Abstract ip_grid type.
     
    + + + + + + + + + + + + + +

    +Functions/Subroutines

    integer function ip_grid_mod::field_pos (self, i, j)
     Returns the field position for a given grid point. More...
     
    logical function ip_grid_mod::is_same_grid (grid1, grid2)
     Compares two grids. More...
     
    subroutine, public ip_grid_mod::unuse_ncep_post_arakawa ()
     Disables ncep_post/wgrib2-compatible non-E Arakawa grib2 grids by setting 'ncep_post_arakawa=.false. More...
     
    subroutine, public ip_grid_mod::use_ncep_post_arakawa ()
     Enables ncep_post/wgrib2-compatible non-E Arakawa grib2 grids by setting 'ncep_post_arakawa=.true. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Variables

    integer, parameter, public ip_grid_mod::equid_cylind_grid_id_grib1 = 0
     Integer grid number for equidistant cylindrical grid in grib1. More...
     
    integer, parameter, public ip_grid_mod::equid_cylind_grid_id_grib2 = 0
     Integer grid number for equidistant cylindrical grid in grib2. More...
     
    integer, parameter, public ip_grid_mod::gaussian_grid_id_grib1 = 4
     Integer grid number for Gaussian grid in grib1. More...
     
    integer, parameter, public ip_grid_mod::gaussian_grid_id_grib2 = 40
     Integer grid number for Gaussian grid in grib2. More...
     
    integer, parameter, public ip_grid_mod::lambert_conf_grid_id_grib1 = 3
     Integer grid number for Lambert Conformal grid in grib1. More...
     
    integer, parameter, public ip_grid_mod::lambert_conf_grid_id_grib2 = 30
     Integer grid number for Lambert conformal grid in grib2. More...
     
    integer, parameter, public ip_grid_mod::mercator_grid_id_grib1 = 1
     Integer grid number for Mercator grid in grib1. More...
     
    integer, parameter, public ip_grid_mod::mercator_grid_id_grib2 = 10
     Integer grid number for Mercator grid in grib2. More...
     
    logical, save, public ip_grid_mod::ncep_post_arakawa =.false.
     Use ncep_post/wgrib2-compatible version of init_grib2() for non-E Arakawa grids (enable with use_ncep_post_arakawa()) More...
     
    integer, parameter, public ip_grid_mod::polar_stereo_grid_id_grib1 = 5
     Integer grid number for polar stereo grid in grib1. More...
     
    integer, parameter, public ip_grid_mod::polar_stereo_grid_id_grib2 = 20
     Integer grid number for polar stereo grid in grib2. More...
     
    integer, parameter, public ip_grid_mod::rot_equid_cylind_b_grid_id_grib1 = 205
     Integer grid number for rotated equidistant cylindrical B-stagger grid. More...
     
    integer, parameter, public ip_grid_mod::rot_equid_cylind_b_grid_id_grib2 = 32769
     Integer grid number for rotated equidistant cylindrical B-stagger grid (grib2) More...
     
    integer, parameter, public ip_grid_mod::rot_equid_cylind_e_grid_id_grib1 = 203
     Integer grid number for rotated equidistant cylindrical E-stagger grid. More...
     
    integer, parameter, public ip_grid_mod::rot_equid_cylind_e_grid_id_grib2 = 32768
     Integer grid number for rotated equidistant cylindrical E-stagger grid (grib2) More...
     
    integer, parameter, public ip_grid_mod::rot_equid_cylind_grid_id_grib2 = 1
     Integer grid number for rotated equidistant cylindrical grid in grib2. More...
     
    +

    Detailed Description

    +

    Abstract ip_grid type.

    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition in file ip_grid_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/ip__grid__mod_8F90.js b/ver-5.1.0/ip__grid__mod_8F90.js new file mode 100644 index 00000000..e5002d6d --- /dev/null +++ b/ver-5.1.0/ip__grid__mod_8F90.js @@ -0,0 +1,28 @@ +var ip__grid__mod_8F90 = +[ + [ "gdswzd_interface", "interfaceip__grid__mod_1_1gdswzd__interface.html", "interfaceip__grid__mod_1_1gdswzd__interface" ], + [ "init_grib1_interface", "interfaceip__grid__mod_1_1init__grib1__interface.html", "interfaceip__grid__mod_1_1init__grib1__interface" ], + [ "init_grib2_interface", "interfaceip__grid__mod_1_1init__grib2__interface.html", "interfaceip__grid__mod_1_1init__grib2__interface" ], + [ "ip_grid", "structip__grid__mod_1_1ip__grid.html", "structip__grid__mod_1_1ip__grid" ], + [ "operator(==)", "interfaceip__grid__mod_1_1operator_07_0a_0a_08.html", "interfaceip__grid__mod_1_1operator_07_0a_0a_08" ], + [ "field_pos", "ip__grid__mod_8F90.html#a63572318d74ec94c20c5ccd6ded2d442", null ], + [ "is_same_grid", "ip__grid__mod_8F90.html#a663bda9af9dd991a09ba0f0de66dc045", null ], + [ "unuse_ncep_post_arakawa", "ip__grid__mod_8F90.html#ac8e716adbe5c1156bfd20f936a4205de", null ], + [ "use_ncep_post_arakawa", "ip__grid__mod_8F90.html#a1d570947cf124c28ba67305494bff450", null ], + [ "equid_cylind_grid_id_grib1", "ip__grid__mod_8F90.html#ad96da95d40beceb1a1c405971e8130bb", null ], + [ "equid_cylind_grid_id_grib2", "ip__grid__mod_8F90.html#a3b5ae57fe3d6d365cfd1ccdb4feb8ac6", null ], + [ "gaussian_grid_id_grib1", "ip__grid__mod_8F90.html#a45e8afad72b1b8856b3e44f2dd3123b3", null ], + [ "gaussian_grid_id_grib2", "ip__grid__mod_8F90.html#a36a9a73ecd50353f892341ae8a5c8316", null ], + [ "lambert_conf_grid_id_grib1", "ip__grid__mod_8F90.html#ab82b90d20f38ff39741f6890fa422d16", null ], + [ "lambert_conf_grid_id_grib2", "ip__grid__mod_8F90.html#a2e49846c9122b1fe1fcdbb2913fc32fe", null ], + [ "mercator_grid_id_grib1", "ip__grid__mod_8F90.html#ab9ff525eca4f053b04ec96a83cb06682", null ], + [ "mercator_grid_id_grib2", "ip__grid__mod_8F90.html#af9c58af5162d96cb7d1ac5001139b856", null ], + [ "ncep_post_arakawa", "ip__grid__mod_8F90.html#a88751d2ee535d807b6d420fcfb99ee71", null ], + [ "polar_stereo_grid_id_grib1", "ip__grid__mod_8F90.html#afee73c2f09ea9de43c156dc594ae1df1", null ], + [ "polar_stereo_grid_id_grib2", "ip__grid__mod_8F90.html#a5b3ad320b41791e65966e1bb498e9ae3", null ], + [ "rot_equid_cylind_b_grid_id_grib1", "ip__grid__mod_8F90.html#adb7d7d18410aaae52d7eee2e97f04b14", null ], + [ "rot_equid_cylind_b_grid_id_grib2", "ip__grid__mod_8F90.html#adbda63b51409aaed34a707b222da8c43", null ], + [ "rot_equid_cylind_e_grid_id_grib1", "ip__grid__mod_8F90.html#a4e11ce780c3d165c282684188890af1c", null ], + [ "rot_equid_cylind_e_grid_id_grib2", "ip__grid__mod_8F90.html#a248f834201bea9295bbe6a99abd038f8", null ], + [ "rot_equid_cylind_grid_id_grib2", "ip__grid__mod_8F90.html#adc7c650c524eb6425e77b2e0eac0979a", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ip__grid__mod_8F90_source.html b/ver-5.1.0/ip__grid__mod_8F90_source.html new file mode 100644 index 00000000..7f842a2c --- /dev/null +++ b/ver-5.1.0/ip__grid__mod_8F90_source.html @@ -0,0 +1,292 @@ + + + + + + + +NCEPLIBS-ip: ip_grid_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ip_grid_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    5 
    + + +
    12  implicit none
    +
    13 
    +
    14  integer, public, parameter :: equid_cylind_grid_id_grib1 = 0
    +
    15  integer, public, parameter :: mercator_grid_id_grib1 = 1
    +
    16  integer, public, parameter :: lambert_conf_grid_id_grib1 = 3
    +
    17  integer, public, parameter :: gaussian_grid_id_grib1 = 4
    +
    18  integer, public, parameter :: polar_stereo_grid_id_grib1 = 5
    +
    19  integer, public, parameter :: rot_equid_cylind_e_grid_id_grib1 = 203
    +
    20  integer, public, parameter :: rot_equid_cylind_b_grid_id_grib1 = 205
    +
    21 
    +
    22  integer, public, parameter :: equid_cylind_grid_id_grib2 = 0
    +
    23  integer, public, parameter :: rot_equid_cylind_grid_id_grib2 = 1
    +
    24  integer, public, parameter :: mercator_grid_id_grib2 = 10
    +
    25  integer, public, parameter :: polar_stereo_grid_id_grib2 = 20
    +
    26  integer, public, parameter :: lambert_conf_grid_id_grib2 = 30
    +
    27  integer, public, parameter :: gaussian_grid_id_grib2 = 40
    +
    28  integer, public, parameter :: rot_equid_cylind_e_grid_id_grib2 = 32768
    +
    29  integer, public, parameter :: rot_equid_cylind_b_grid_id_grib2 = 32769
    +
    30 
    +
    31  logical, public, save :: ncep_post_arakawa=.false.
    +
    32 
    +
    33  private
    +
    34  public :: ip_grid
    +
    35  public :: gdswzd_interface
    +
    36  public :: operator(==)
    +
    37  public :: use_ncep_post_arakawa
    +
    38  public :: unuse_ncep_post_arakawa
    +
    39 
    +
    58  type, abstract :: ip_grid
    +
    59  class(ip_grid_descriptor), allocatable :: descriptor
    +
    60 
    +
    61  integer :: im
    +
    62  integer :: jm
    +
    63  integer :: nm
    +
    64 
    +
    69  integer :: nscan
    +
    70  integer :: kscan
    +
    71 
    +
    72  integer :: nscan_field_pos
    +
    73 
    +
    74  integer :: iwrap
    +
    75  integer :: jwrap1
    +
    76  integer :: jwrap2
    +
    77  real :: rerth
    +
    78  real :: eccen_squared
    +
    79  contains
    +
    81  procedure(init_grib1_interface), deferred :: init_grib1
    +
    83  procedure(init_grib2_interface), deferred :: init_grib2
    +
    85  procedure(gdswzd_interface), deferred :: gdswzd
    +
    88  procedure :: field_pos
    +
    90  generic :: init => init_grib1, init_grib2
    +
    91  end type ip_grid
    +
    92 
    +
    93  abstract interface
    +
    94 
    +
    125  subroutine gdswzd_interface(self, iopt, npts, fill, xpts, ypts, rlon, rlat, nret, crot, srot, &
    +
    126  xlon, xlat, ylon, ylat, area)
    +
    127  import
    +
    128  class(ip_grid), intent(in) :: self
    +
    129  INTEGER, INTENT(IN ) :: IOPT, NPTS
    +
    130  INTEGER, INTENT( OUT) :: NRET
    +
    131  !
    +
    132  REAL, INTENT(IN ) :: FILL
    +
    133  REAL, INTENT(INOUT) :: RLON(NPTS),RLAT(NPTS)
    +
    134  REAL, INTENT(INOUT) :: XPTS(NPTS),YPTS(NPTS)
    +
    135  REAL, OPTIONAL, INTENT( OUT) :: CROT(NPTS),SROT(NPTS)
    +
    136  REAL, OPTIONAL, INTENT( OUT) :: XLON(NPTS),XLAT(NPTS)
    +
    137  REAL, OPTIONAL, INTENT( OUT) :: YLON(NPTS),YLAT(NPTS),AREA(NPTS)
    +
    138  end subroutine gdswzd_interface
    +
    139 
    +
    148  subroutine init_grib1_interface(self, g1_desc)
    +
    149  import
    +
    150  class(ip_grid), intent(inout) :: self
    +
    151  type(grib1_descriptor), intent(in) :: g1_desc
    +
    152  end subroutine init_grib1_interface
    +
    153 
    +
    162  subroutine init_grib2_interface(self, g2_desc)
    +
    163  import
    +
    164  class(ip_grid), intent(inout) :: self
    +
    165  type(grib2_descriptor), intent(in) :: g2_desc
    +
    166  end subroutine init_grib2_interface
    +
    167 
    +
    168  end interface
    +
    169 
    +
    172  interface operator (==)
    +
    173  module procedure is_same_grid
    +
    174  end interface operator (==)
    +
    175 
    +
    176 
    +
    177 contains
    +
    178 
    +
    185  subroutine use_ncep_post_arakawa() bind(c)
    +
    186  ncep_post_arakawa = .true.
    +
    187  end subroutine use_ncep_post_arakawa
    +
    188 
    +
    195  subroutine unuse_ncep_post_arakawa() bind(c)
    +
    196  ncep_post_arakawa = .false.
    +
    197  end subroutine unuse_ncep_post_arakawa
    +
    198 
    +
    208  logical function is_same_grid(grid1, grid2)
    +
    209  class(ip_grid), intent(in) :: grid1, grid2
    +
    210  is_same_grid = grid1%descriptor == grid2%descriptor
    +
    211  end function is_same_grid
    +
    212 
    +
    223  function field_pos(self, i, j)
    +
    224  class(ip_grid), intent(in) :: self
    +
    225  integer, intent(in) :: i, j
    +
    226  integer :: field_pos
    +
    227 
    +
    228  integer :: ii, jj, im, jm
    +
    229  integer :: iif, jjf, is1, iwrap
    +
    230  integer :: jwrap1, jwrap2, kscan, nscan
    +
    231 
    +
    232  ! extract from navigation parameter array
    +
    233  im=self%im
    +
    234  jm=self%jm
    +
    235  iwrap=self%iwrap
    +
    236  jwrap1=self%jwrap1
    +
    237  jwrap2=self%jwrap2
    +
    238  nscan=self%nscan_field_pos
    +
    239  kscan=self%kscan
    +
    240 
    +
    241  ! compute wraparounds in x and y if necessary and possible
    +
    242  ii=i
    +
    243  jj=j
    +
    244  if(iwrap.gt.0) then
    +
    245  ii=mod(i-1+iwrap,iwrap)+1
    +
    246  if(j.lt.1.and.jwrap1.gt.0) then
    +
    247  jj=jwrap1-j
    +
    248  ii=mod(ii-1+iwrap/2,iwrap)+1
    +
    249  elseif(j.gt.jm.and.jwrap2.gt.0) then
    +
    250  jj=jwrap2-j
    +
    251  ii=mod(ii-1+iwrap/2,iwrap)+1
    +
    252  endif
    +
    253  endif
    +
    254 
    +
    255  ! compute position for the appropriate scanning mode
    +
    256  field_pos=0
    +
    257  if(nscan.eq.0) then
    +
    258  if(ii.ge.1.and.ii.le.im.and.jj.ge.1.and.jj.le.jm) field_pos=ii+(jj-1)*im
    +
    259  elseif(nscan.eq.1) then
    +
    260  if(ii.ge.1.and.ii.le.im.and.jj.ge.1.and.jj.le.jm) field_pos=jj+(ii-1)*jm
    +
    261  elseif(nscan.eq.2) then
    +
    262  is1=(jm+1-kscan)/2
    +
    263  iif=jj+(ii-is1)
    +
    264  jjf=jj-(ii-is1)+kscan
    +
    265  if(iif.ge.1.and.iif.le.2*im-1.and.jjf.ge.1.and.jjf.le.jm) &
    +
    266  field_pos=(iif+(jjf-1)*(2*im-1)+1-kscan)/2
    +
    267  elseif(nscan.eq.3) then
    +
    268  is1=(jm+1-kscan)/2
    +
    269  iif=jj+(ii-is1)
    +
    270  jjf=jj-(ii-is1)+kscan
    +
    271  if(iif.ge.1.and.iif.le.2*im-1.and.jjf.ge.1.and.jjf.le.jm) field_pos=(iif+1)/2+(jjf-1)*im
    +
    272  endif
    +
    273  end function field_pos
    +
    274 
    +
    275 
    +
    276 end module ip_grid_mod
    +
    277 
    + + + +
    void gdswzd(int igdtnum, int *igdtmpl, int igdtlen, int iopt, int npts, float fill, float *xpts, float *ypts, float *rlon, float *rlat, int *nret, float *crot, float *srot, float *xlon, float *xlat, float *ylon, float *ylat, float *area)
    gdswzd() interface for C for _4 build of library.
    +
    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
    +
    logical function is_same_grid(grid1, grid2)
    Test whether two grid descriptors are the same.
    +
    Abstract ip_grid type.
    Definition: ip_grid_mod.F90:10
    +
    subroutine, public use_ncep_post_arakawa()
    Enables ncep_post/wgrib2-compatible non-E Arakawa grib2 grids by setting 'ncep_post_arakawa=....
    +
    integer, parameter, public rot_equid_cylind_e_grid_id_grib2
    Integer grid number for rotated equidistant cylindrical E-stagger grid (grib2)
    Definition: ip_grid_mod.F90:28
    +
    integer, parameter, public lambert_conf_grid_id_grib2
    Integer grid number for Lambert conformal grid in grib2.
    Definition: ip_grid_mod.F90:26
    +
    integer, parameter, public gaussian_grid_id_grib2
    Integer grid number for Gaussian grid in grib2.
    Definition: ip_grid_mod.F90:27
    +
    integer, parameter, public equid_cylind_grid_id_grib2
    Integer grid number for equidistant cylindrical grid in grib2.
    Definition: ip_grid_mod.F90:22
    +
    integer, parameter, public gaussian_grid_id_grib1
    Integer grid number for Gaussian grid in grib1.
    Definition: ip_grid_mod.F90:17
    +
    integer, parameter, public rot_equid_cylind_e_grid_id_grib1
    Integer grid number for rotated equidistant cylindrical E-stagger grid.
    Definition: ip_grid_mod.F90:19
    +
    integer, parameter, public polar_stereo_grid_id_grib2
    Integer grid number for polar stereo grid in grib2.
    Definition: ip_grid_mod.F90:25
    +
    integer function field_pos(self, i, j)
    Returns the field position for a given grid point.
    +
    logical, save, public ncep_post_arakawa
    Use ncep_post/wgrib2-compatible version of init_grib2() for non-E Arakawa grids (enable with use_ncep...
    Definition: ip_grid_mod.F90:31
    +
    integer, parameter, public lambert_conf_grid_id_grib1
    Integer grid number for Lambert Conformal grid in grib1.
    Definition: ip_grid_mod.F90:16
    +
    integer, parameter, public mercator_grid_id_grib1
    Integer grid number for Mercator grid in grib1.
    Definition: ip_grid_mod.F90:15
    +
    subroutine, public unuse_ncep_post_arakawa()
    Disables ncep_post/wgrib2-compatible non-E Arakawa grib2 grids by setting 'ncep_post_arakawa=....
    +
    integer, parameter, public equid_cylind_grid_id_grib1
    Integer grid number for equidistant cylindrical grid in grib1.
    Definition: ip_grid_mod.F90:14
    +
    integer, parameter, public rot_equid_cylind_b_grid_id_grib1
    Integer grid number for rotated equidistant cylindrical B-stagger grid.
    Definition: ip_grid_mod.F90:20
    +
    integer, parameter, public rot_equid_cylind_b_grid_id_grib2
    Integer grid number for rotated equidistant cylindrical B-stagger grid (grib2)
    Definition: ip_grid_mod.F90:29
    +
    integer, parameter, public rot_equid_cylind_grid_id_grib2
    Integer grid number for rotated equidistant cylindrical grid in grib2.
    Definition: ip_grid_mod.F90:23
    +
    integer, parameter, public mercator_grid_id_grib2
    Integer grid number for Mercator grid in grib2.
    Definition: ip_grid_mod.F90:24
    +
    integer, parameter, public polar_stereo_grid_id_grib1
    Integer grid number for polar stereo grid in grib1.
    Definition: ip_grid_mod.F90:18
    +
    Descriptor representing a grib1 grib descriptor section (GDS) with an integer array.
    +
    Grib-2 descriptor containing a grib2 GDT represented by an integer array.
    +
    Abstract descriptor object which represents a grib1 or grib2 descriptor.
    +
    Abstract grid that holds fields and methods common to all grids.
    Definition: ip_grid_mod.F90:58
    +
    +
    + + + + diff --git a/ver-5.1.0/ip__grids__mod_8F90.html b/ver-5.1.0/ip__grids__mod_8F90.html new file mode 100644 index 00000000..d5b5603c --- /dev/null +++ b/ver-5.1.0/ip__grids__mod_8F90.html @@ -0,0 +1,119 @@ + + + + + + + +NCEPLIBS-ip: ip_grids_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_grids_mod.F90 File Reference
    +
    +
    + +

    Re-export the individual grids. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Modules

    module  ip_grids_mod
     Re-export the individual grids.
     
    +

    Detailed Description

    +

    Re-export the individual grids.

    +
    Author
    Kyle Gerheiser
    +
    Date
    7/21/21
    + +

    Definition in file ip_grids_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/ip__grids__mod_8F90_source.html b/ver-5.1.0/ip__grids__mod_8F90_source.html new file mode 100644 index 00000000..eb67ee42 --- /dev/null +++ b/ver-5.1.0/ip__grids__mod_8F90_source.html @@ -0,0 +1,126 @@ + + + + + + + +NCEPLIBS-ip: ip_grids_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ip_grids_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    4 
    + + + + + + + + + +
    16  use ip_grid_mod
    +
    17  implicit none
    +
    18 end module ip_grids_mod
    +
    19 
    +
    20 
    +
    21 
    +
    Equidistant cylindrical grib decoder and grid coordinate transformations.
    +
    Gaussian grid coordinate transformations.
    +
    Abstract ip_grid type.
    Definition: ip_grid_mod.F90:10
    +
    Re-export the individual grids.
    Definition: ip_grids_mod.F90:7
    +
    Lambert conformal grib decoder and grid coordinate transformations.
    +
    GDS wizard for mercator cylindrical.
    +
    GDS wizard for polar stereographic azimuthal.
    +
    Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grid E.
    +
    Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grids A ...
    +
    Interpolate gridded data to a series of station points.
    +
    +
    + + + + diff --git a/ver-5.1.0/ip__interpolators__mod_8F90.html b/ver-5.1.0/ip__interpolators__mod_8F90.html new file mode 100644 index 00000000..b176ea20 --- /dev/null +++ b/ver-5.1.0/ip__interpolators__mod_8F90.html @@ -0,0 +1,134 @@ + + + + + + + +NCEPLIBS-ip: ip_interpolators_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_interpolators_mod.F90 File Reference
    +
    +
    + +

    Top-level module to export interpolation routines and constants. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Modules

    module  ip_interpolators_mod
     Top-level module to export interpolation routines and constants.
     
    + + + + + + + + + + + + + +

    +Variables

    integer, parameter, public ip_interpolators_mod::bicubic_interp_id = 1
     
    integer, parameter, public ip_interpolators_mod::bilinear_interp_id = 0
     
    integer, parameter, public ip_interpolators_mod::budget_interp_id = 3
     
    integer, parameter, public ip_interpolators_mod::neighbor_budget_interp_id = 6
     
    integer, parameter, public ip_interpolators_mod::neighbor_interp_id = 2
     
    integer, parameter, public ip_interpolators_mod::spectral_interp_id = 4
     
    +

    Detailed Description

    +

    Top-level module to export interpolation routines and constants.

    +
    Author
    Kyle Gerheiser
    + +

    Definition in file ip_interpolators_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/ip__interpolators__mod_8F90.js b/ver-5.1.0/ip__interpolators__mod_8F90.js new file mode 100644 index 00000000..11e232b6 --- /dev/null +++ b/ver-5.1.0/ip__interpolators__mod_8F90.js @@ -0,0 +1,9 @@ +var ip__interpolators__mod_8F90 = +[ + [ "bicubic_interp_id", "ip__interpolators__mod_8F90.html#adfdc7760718083d85618df85320c495e", null ], + [ "bilinear_interp_id", "ip__interpolators__mod_8F90.html#a753e4b6c113a9a8b226c3c834786f3e1", null ], + [ "budget_interp_id", "ip__interpolators__mod_8F90.html#a7df843ca4a64e3178f448aebf7dad359", null ], + [ "neighbor_budget_interp_id", "ip__interpolators__mod_8F90.html#ae77a1da241f5de94f1874004ee8e715c", null ], + [ "neighbor_interp_id", "ip__interpolators__mod_8F90.html#a35e5fe3a2dd79d205c0503f550388258", null ], + [ "spectral_interp_id", "ip__interpolators__mod_8F90.html#a83ba2963a0b686c6ae67b53f9c385851", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ip__interpolators__mod_8F90_source.html b/ver-5.1.0/ip__interpolators__mod_8F90_source.html new file mode 100644 index 00000000..0f1d0275 --- /dev/null +++ b/ver-5.1.0/ip__interpolators__mod_8F90_source.html @@ -0,0 +1,135 @@ + + + + + + + +NCEPLIBS-ip: ip_interpolators_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ip_interpolators_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    4 
    + + + + + + + +
    14  implicit none
    +
    15 
    +
    17  integer, parameter, public :: bilinear_interp_id = 0
    +
    19  integer, parameter, public :: bicubic_interp_id = 1
    +
    21  integer, parameter, public :: neighbor_interp_id = 2
    +
    23  integer, parameter, public :: budget_interp_id = 3
    +
    25  integer, parameter, public :: spectral_interp_id = 4
    +
    27  integer, parameter, public :: neighbor_budget_interp_id = 6
    +
    28 
    +
    29 contains
    +
    30 
    +
    31 
    +
    32 end module ip_interpolators_mod
    +
    33 
    +
    Bicubic interpolation routines for scalars and vectors.
    +
    Bilinear interpolation routines for scalars and vectors.
    +
    Budget interpolation routines for scalars and vectors.
    +
    Top-level module to export interpolation routines and constants.
    +
    integer, parameter, public neighbor_interp_id
    +
    integer, parameter, public bilinear_interp_id
    +
    integer, parameter, public budget_interp_id
    +
    integer, parameter, public spectral_interp_id
    +
    integer, parameter, public bicubic_interp_id
    +
    integer, parameter, public neighbor_budget_interp_id
    +
    Interpolate scalar fields (neighbor).
    +
    Interpolate scalar fields (neighbor).
    +
    Interpolate spectral.
    +
    +
    + + + + diff --git a/ver-5.1.0/ip__lambert__conf__grid__mod_8F90.html b/ver-5.1.0/ip__lambert__conf__grid__mod_8F90.html new file mode 100644 index 00000000..49e82109 --- /dev/null +++ b/ver-5.1.0/ip__lambert__conf__grid__mod_8F90.html @@ -0,0 +1,169 @@ + + + + + + + +NCEPLIBS-ip: ip_lambert_conf_grid_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_lambert_conf_grid_mod.F90 File Reference
    +
    +
    + +

    GDS wizard for lambert conformal conical. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Data Types

    type  ip_lambert_conf_grid_mod::ip_lambert_conf_grid
     
    + + + + +

    +Modules

    module  ip_lambert_conf_grid_mod
     Lambert conformal grib decoder and grid coordinate transformations.
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine ip_lambert_conf_grid_mod::gdswzd_lambert_conf (self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     GDS wizard for lambert conformal conical. More...
     
    subroutine ip_lambert_conf_grid_mod::init_grib1 (self, g1_desc)
     Initializes a Lambert Conformal grid given a grib1_descriptor object. More...
     
    subroutine ip_lambert_conf_grid_mod::init_grib2 (self, g2_desc)
     Initializes a Lambert Conformal grid given a grib2_descriptor object. More...
     
    subroutine ip_lambert_conf_grid_mod::lambert_conf_grid_area (RLAT, FILL, DR, AREA)
     Grid box area for lambert conformal conical. More...
     
    subroutine ip_lambert_conf_grid_mod::lambert_conf_map_jacob (RLAT, FILL, DLON, DR, XLON, XLAT, YLON, YLAT)
     Map jacobians for lambert conformal conical. More...
     
    subroutine ip_lambert_conf_grid_mod::lambert_conf_vect_rot (DLON, CROT, SROT)
     Vector rotation fields for lambert conformal conical. More...
     
    + + + + + + + + + + + + + + + + + + + +

    +Variables

    real ip_lambert_conf_grid_mod::an
     Cone factor. More...
     
    real ip_lambert_conf_grid_mod::dxs
     x-direction grid length adjusted for scan mode. More...
     
    real ip_lambert_conf_grid_mod::dys
     y-direction grid length adjusted for scan model. More...
     
    real ip_lambert_conf_grid_mod::h
     Hemisphere flag. More...
     
    integer ip_lambert_conf_grid_mod::irot
     vector rotation flag. More...
     
    real ip_lambert_conf_grid_mod::rerth
     Radius of the earth. More...
     
    +

    Detailed Description

    +

    GDS wizard for lambert conformal conical.

    +
    Author
    Iredell
    +
    Date
    96-04-10
    + +

    Definition in file ip_lambert_conf_grid_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/ip__lambert__conf__grid__mod_8F90.js b/ver-5.1.0/ip__lambert__conf__grid__mod_8F90.js new file mode 100644 index 00000000..87e405da --- /dev/null +++ b/ver-5.1.0/ip__lambert__conf__grid__mod_8F90.js @@ -0,0 +1,16 @@ +var ip__lambert__conf__grid__mod_8F90 = +[ + [ "ip_lambert_conf_grid", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid" ], + [ "gdswzd_lambert_conf", "ip__lambert__conf__grid__mod_8F90.html#a5ebb9e4f1bd58caa254771b305c94f71", null ], + [ "init_grib1", "ip__lambert__conf__grid__mod_8F90.html#a5544708e893ffcfbe7d958fdec700eea", null ], + [ "init_grib2", "ip__lambert__conf__grid__mod_8F90.html#acb0339a9fff4fff6c2017d37f8bed0cf", null ], + [ "lambert_conf_grid_area", "ip__lambert__conf__grid__mod_8F90.html#a15c44b47172b926aea840caee9723b1c", null ], + [ "lambert_conf_map_jacob", "ip__lambert__conf__grid__mod_8F90.html#a5e1d42f0027236f47467e25c525e66ae", null ], + [ "lambert_conf_vect_rot", "ip__lambert__conf__grid__mod_8F90.html#a58187073914efa18eca897c6ec203b71", null ], + [ "an", "ip__lambert__conf__grid__mod_8F90.html#a82b75fe2d8495aab75b225c6309e61c8", null ], + [ "dxs", "ip__lambert__conf__grid__mod_8F90.html#a196e94b5a2add34133c87f845394fa81", null ], + [ "dys", "ip__lambert__conf__grid__mod_8F90.html#aad8b04b77b0920dbf9ed3827e2e8cfd7", null ], + [ "h", "ip__lambert__conf__grid__mod_8F90.html#aa91572e8b5ba3559c041f1750b6696c6", null ], + [ "irot", "ip__lambert__conf__grid__mod_8F90.html#a7dea876ed4206c5ecc0444aadb7d6acd", null ], + [ "rerth", "ip__lambert__conf__grid__mod_8F90.html#a9f0538d092cd7d2829a5b98247eb560d", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ip__lambert__conf__grid__mod_8F90_source.html b/ver-5.1.0/ip__lambert__conf__grid__mod_8F90_source.html new file mode 100644 index 00000000..acf6e46f --- /dev/null +++ b/ver-5.1.0/ip__lambert__conf__grid__mod_8F90_source.html @@ -0,0 +1,461 @@ + + + + + + + +NCEPLIBS-ip: ip_lambert_conf_grid_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ip_lambert_conf_grid_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    5 
    + + +
    16  use ip_grid_mod
    + + +
    19  implicit none
    +
    20 
    +
    21  private
    +
    22  public :: ip_lambert_conf_grid
    +
    23 
    +
    24  type, extends(ip_grid) :: ip_lambert_conf_grid
    +
    25  real :: rlat1
    +
    26  real :: rlon1
    +
    27  real :: rlati1
    +
    28  real :: rlati2
    +
    29  real :: orient
    +
    30  real :: dxs
    +
    31  real :: dys
    +
    32  real :: h
    +
    33  integer :: irot
    +
    34  contains
    +
    36  procedure :: init_grib1
    +
    38  procedure :: init_grib2
    +
    41  procedure :: gdswzd => gdswzd_lambert_conf
    +
    42  end type ip_lambert_conf_grid
    +
    43 
    +
    44  INTEGER :: irot
    +
    45  REAL :: an
    +
    46  REAL :: dxs
    +
    47  REAL :: dys
    +
    48  REAL :: h
    +
    49  REAL :: rerth
    +
    50  REAL :: tinyreal=tiny(1.0)
    +
    51 
    +
    52 contains
    +
    53 
    +
    60  subroutine init_grib1(self, g1_desc)
    +
    61  class(ip_lambert_conf_grid), intent(inout) :: self
    +
    62  type(grib1_descriptor), intent(in) :: g1_desc
    +
    63 
    +
    64  real :: dx, dy, hi, hj
    +
    65  integer :: iproj, iscan, jscan
    +
    66 
    +
    67  associate(kgds => g1_desc%gds)
    +
    68  self%rerth = 6.3712e6
    +
    69  self%eccen_squared = 0.0
    +
    70 
    +
    71  self%IM=kgds(2)
    +
    72  self%JM=kgds(3)
    +
    73 
    +
    74  self%RLAT1=kgds(4)*1.e-3
    +
    75  self%RLON1=kgds(5)*1.e-3
    +
    76 
    +
    77  self%IROT=mod(kgds(6)/8,2)
    +
    78  self%ORIENT=kgds(7)*1.e-3
    +
    79 
    +
    80  dx=kgds(8)
    +
    81  dy=kgds(9)
    +
    82 
    +
    83  iproj=mod(kgds(10)/128,2)
    +
    84  iscan=mod(kgds(11)/128,2)
    +
    85  jscan=mod(kgds(11)/64,2)
    +
    86 
    +
    87  self%RLATI1=kgds(12)*1.e-3
    +
    88  self%RLATI2=kgds(13)*1.e-3
    +
    89  self%H=(-1.)**iproj
    +
    90 
    +
    91  hi=(-1.)**iscan
    +
    92  hj=(-1.)**(1-jscan)
    +
    93  self%DXS=dx*hi
    +
    94  self%DYS=dy*hj
    +
    95 
    +
    96  self%iwrap = 0
    +
    97  self%jwrap1 = 0
    +
    98  self%jwrap2 = 0
    +
    99  self%nscan = mod(kgds(11) / 32, 2)
    +
    100  self%nscan_field_pos = self%nscan
    +
    101  self%kscan = 0
    +
    102  end associate
    +
    103 
    +
    104  end subroutine init_grib1
    +
    105 
    +
    112  subroutine init_grib2(self, g2_desc)
    +
    113  class(ip_lambert_conf_grid), intent(inout) :: self
    +
    114  type(grib2_descriptor), intent(in) :: g2_desc
    +
    115 
    +
    116  real :: dx, dy, hi, hj
    +
    117  integer :: iproj, iscan, jscan
    +
    118 
    +
    119 
    +
    120  associate(igdtmpl => g2_desc%gdt_tmpl, igdtlen => g2_desc%gdt_len)
    +
    121  call earth_radius(igdtmpl, igdtlen, self%rerth, self%eccen_squared)
    +
    122 
    +
    123  self%IM=igdtmpl(8)
    +
    124  self%JM=igdtmpl(9)
    +
    125 
    +
    126  self%RLAT1=float(igdtmpl(10))*1.0e-6
    +
    127  self%RLON1=float(igdtmpl(11))*1.0e-6
    +
    128 
    +
    129  self%IROT=mod(igdtmpl(12)/8,2)
    +
    130  self%ORIENT=float(igdtmpl(14))*1.0e-6
    +
    131 
    +
    132  dx=float(igdtmpl(15))*1.0e-3
    +
    133  dy=float(igdtmpl(16))*1.0e-3
    +
    134 
    +
    135  iproj=mod(igdtmpl(17)/128,2)
    +
    136  iscan=mod(igdtmpl(18)/128,2)
    +
    137  jscan=mod(igdtmpl(18)/64,2)
    +
    138 
    +
    139  self%RLATI1=float(igdtmpl(19))*1.0e-6
    +
    140  self%RLATI2=float(igdtmpl(20))*1.0e-6
    +
    141 
    +
    142  self%H=(-1.)**iproj
    +
    143  hi=(-1.)**iscan
    +
    144  hj=(-1.)**(1-jscan)
    +
    145  self%DXS=dx*hi
    +
    146  self%DYS=dy*hj
    +
    147 
    +
    148  self%nscan = mod(igdtmpl(18) / 32, 2)
    +
    149  self%nscan_field_pos = self%nscan
    +
    150  self%iwrap = 0
    +
    151  self%jwrap1 = 0
    +
    152  self%jwrap2 = 0
    +
    153  self%kscan = 0
    +
    154  end associate
    +
    155  end subroutine init_grib2
    +
    156 
    +
    219  SUBROUTINE gdswzd_lambert_conf(self,IOPT,NPTS,FILL, &
    +
    220  XPTS,YPTS,RLON,RLAT,NRET, &
    +
    221  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
    +
    222  IMPLICIT NONE
    +
    223  !
    +
    224  class(ip_lambert_conf_grid), intent(in) :: self
    +
    225  INTEGER, INTENT(IN ) :: IOPT, NPTS
    +
    226  INTEGER, INTENT( OUT) :: NRET
    +
    227  !
    +
    228  REAL, INTENT(IN ) :: FILL
    +
    229  REAL, INTENT(INOUT) :: RLON(NPTS),RLAT(NPTS)
    +
    230  REAL, INTENT(INOUT) :: XPTS(NPTS),YPTS(NPTS)
    +
    231  REAL, OPTIONAL, INTENT( OUT) :: CROT(NPTS),SROT(NPTS)
    +
    232  REAL, OPTIONAL, INTENT( OUT) :: XLON(NPTS),XLAT(NPTS)
    +
    233  REAL, OPTIONAL, INTENT( OUT) :: YLON(NPTS),YLAT(NPTS),AREA(NPTS)
    +
    234  !
    +
    235  INTEGER :: IM, JM, N
    +
    236  !
    +
    237  LOGICAL :: LROT, LMAP, LAREA
    +
    238  !
    +
    239  REAL :: ANTR, DI, DJ
    +
    240  REAL :: DLON1
    +
    241  REAL :: DE, DE2, DR2
    +
    242  REAL :: ORIENT, RLAT1, RLON1
    +
    243  REAL :: RLATI1, RLATI2
    +
    244  REAL :: XMAX, XMIN, YMAX, YMIN, XP, YP
    +
    245  REAL :: DLON, DR
    +
    246  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    247  IF(PRESENT(crot)) crot=fill
    +
    248  IF(PRESENT(srot)) srot=fill
    +
    249  IF(PRESENT(xlon)) xlon=fill
    +
    250  IF(PRESENT(xlat)) xlat=fill
    +
    251  IF(PRESENT(ylon)) ylon=fill
    +
    252  IF(PRESENT(ylat)) ylat=fill
    +
    253  IF(PRESENT(area)) area=fill
    +
    254 
    +
    255  im=self%im
    +
    256  jm=self%jm
    +
    257 
    +
    258  rlat1=self%rlat1
    +
    259  rlon1=self%rlon1
    +
    260 
    +
    261  irot=self%irot
    +
    262  orient=self%orient
    +
    263 
    +
    264  rlati1=self%rlati1
    +
    265  rlati2=self%rlati2
    +
    266 
    +
    267  h=self%h
    +
    268  dxs=self%dxs
    +
    269  dys=self%dys
    +
    270 
    +
    271  rerth = self%rerth
    +
    272 
    +
    273  IF(abs(rlati1-rlati2).LT.tinyreal) THEN
    +
    274  an=sin(rlati1/dpr)
    +
    275  ELSE
    +
    276  an=log(cos(rlati1/dpr)/cos(rlati2/dpr))/ &
    +
    277  log(tan((90-rlati1)/2/dpr)/tan((90-rlati2)/2/dpr))
    +
    278  ENDIF
    +
    279  de=rerth*cos(rlati1/dpr)*tan((rlati1+90)/2/dpr)**an/an
    +
    280  IF(abs(h*rlat1-90).LT.tinyreal) THEN
    +
    281  xp=1
    +
    282  yp=1
    +
    283  ELSE
    +
    284  dr=de/tan((rlat1+90)/2/dpr)**an
    +
    285  dlon1=mod(rlon1-orient+180+3600,360.)-180
    +
    286  xp=1-sin(an*dlon1/dpr)*dr/dxs
    +
    287  yp=1+cos(an*dlon1/dpr)*dr/dys
    +
    288  ENDIF
    +
    289  antr=1/(2*an)
    +
    290  de2=de**2
    +
    291  xmin=0
    +
    292  xmax=im+1
    +
    293  ymin=0
    +
    294  ymax=jm+1
    +
    295  nret=0
    +
    296  IF(PRESENT(crot).AND.PRESENT(srot))THEN
    +
    297  lrot=.true.
    +
    298  ELSE
    +
    299  lrot=.false.
    +
    300  ENDIF
    +
    301  IF(PRESENT(xlon).AND.PRESENT(xlat).AND.PRESENT(ylon).AND.PRESENT(ylat))THEN
    +
    302  lmap=.true.
    +
    303  ELSE
    +
    304  lmap=.false.
    +
    305  ENDIF
    +
    306  IF(PRESENT(area))THEN
    +
    307  larea=.true.
    +
    308  ELSE
    +
    309  larea=.false.
    +
    310  ENDIF
    +
    311  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    312  ! TRANSLATE GRID COORDINATES TO EARTH COORDINATES
    +
    313  IF(iopt.EQ.0.OR.iopt.EQ.1) THEN
    +
    314  !$OMP PARALLEL DO PRIVATE(N,DI,DJ,DR2,DR,DLON) REDUCTION(+:NRET) SCHEDULE(STATIC)
    +
    315  DO n=1,npts
    +
    316  IF(xpts(n).GE.xmin.AND.xpts(n).LE.xmax.AND. &
    +
    317  ypts(n).GE.ymin.AND.ypts(n).LE.ymax) THEN
    +
    318  di=h*(xpts(n)-xp)*dxs
    +
    319  dj=h*(ypts(n)-yp)*dys
    +
    320  dr2=di**2+dj**2
    +
    321  dr=sqrt(dr2)
    +
    322  IF(dr2.LT.de2*1.e-6) THEN
    +
    323  rlon(n)=0.
    +
    324  rlat(n)=h*90.
    +
    325  ELSE
    +
    326  rlon(n)=mod(orient+1./an*dpr*atan2(di,-dj)+3600,360.)
    +
    327  rlat(n)=(2*dpr*atan((de2/dr2)**antr)-90)
    +
    328  ENDIF
    +
    329  nret=nret+1
    +
    330  dlon=mod(rlon(n)-orient+180+3600,360.)-180
    +
    331  IF(lrot) CALL lambert_conf_vect_rot(dlon,crot(n),srot(n))
    +
    332  IF(lmap) CALL lambert_conf_map_jacob(rlat(n),fill, dlon, dr, &
    +
    333  xlon(n),xlat(n),ylon(n),ylat(n))
    +
    334  IF(larea) CALL lambert_conf_grid_area(rlat(n),fill,dr,area(n))
    +
    335  ELSE
    +
    336  rlon(n)=fill
    +
    337  rlat(n)=fill
    +
    338  ENDIF
    +
    339  ENDDO
    +
    340  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    341  ! TRANSLATE EARTH COORDINATES TO GRID COORDINATES
    +
    342  ELSEIF(iopt.EQ.-1) THEN
    +
    343  !$OMP PARALLEL DO PRIVATE(N,DR,DLON) REDUCTION(+:NRET) SCHEDULE(STATIC)
    +
    344  DO n=1,npts
    +
    345  IF(abs(rlon(n)).LT.(360.+tinyreal).AND.abs(rlat(n)).LT.(90.+tinyreal).AND. &
    +
    346  abs(h*rlat(n)+90).GT.tinyreal) THEN
    +
    347  dr=h*de*tan((90-rlat(n))/2/dpr)**an
    +
    348  dlon=mod(rlon(n)-orient+180+3600,360.)-180
    +
    349  xpts(n)=xp+h*sin(an*dlon/dpr)*dr/dxs
    +
    350  ypts(n)=yp-h*cos(an*dlon/dpr)*dr/dys
    +
    351  IF(xpts(n).GE.xmin.AND.xpts(n).LE.xmax.AND. &
    +
    352  ypts(n).GE.ymin.AND.ypts(n).LE.ymax) THEN
    +
    353  nret=nret+1
    +
    354  IF(lrot) CALL lambert_conf_vect_rot(dlon,crot(n),srot(n))
    +
    355  IF(lmap) CALL lambert_conf_map_jacob(rlat(n),fill,dlon,dr, &
    +
    356  xlon(n),xlat(n),ylon(n),ylat(n))
    +
    357  IF(larea) CALL lambert_conf_grid_area(rlat(n),fill,dr,area(n))
    +
    358  ELSE
    +
    359  xpts(n)=fill
    +
    360  ypts(n)=fill
    +
    361  ENDIF
    +
    362  ELSE
    +
    363  xpts(n)=fill
    +
    364  ypts(n)=fill
    +
    365  ENDIF
    +
    366  ENDDO
    +
    367  !$OMP END PARALLEL DO
    +
    368  ENDIF
    +
    369  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    370  END SUBROUTINE gdswzd_lambert_conf
    +
    371 
    +
    390  SUBROUTINE lambert_conf_vect_rot(DLON,CROT,SROT)
    +
    391  IMPLICIT NONE
    +
    392  REAL, INTENT( IN) :: DLON
    +
    393  REAL, INTENT( OUT) :: CROT, SROT
    +
    394 
    +
    395  IF(irot.EQ.1) THEN
    +
    396  crot=cos(an*dlon/dpr)
    +
    397  srot=sin(an*dlon/dpr)
    +
    398  ELSE
    +
    399  crot=1.
    +
    400  srot=0.
    +
    401  ENDIF
    +
    402 
    +
    403  END SUBROUTINE lambert_conf_vect_rot
    +
    404 
    +
    427  SUBROUTINE lambert_conf_map_jacob(RLAT,FILL,DLON,DR,XLON,XLAT,YLON,YLAT)
    +
    428  IMPLICIT NONE
    +
    429 
    +
    430  REAL, INTENT(IN ) :: RLAT, FILL, DLON, DR
    +
    431  REAL, INTENT( OUT) :: XLON, XLAT, YLON, YLAT
    +
    432 
    +
    433  REAL :: CLAT
    +
    434 
    +
    435  clat=cos(rlat/dpr)
    +
    436  IF(clat.LE.0.OR.dr.LE.0) THEN
    +
    437  xlon=fill
    +
    438  xlat=fill
    +
    439  ylon=fill
    +
    440  ylat=fill
    +
    441  ELSE
    +
    442  xlon=h*cos(an*dlon/dpr)*an/dpr*dr/dxs
    +
    443  xlat=-h*sin(an*dlon/dpr)*an/dpr*dr/dxs/clat
    +
    444  ylon=h*sin(an*dlon/dpr)*an/dpr*dr/dys
    +
    445  ylat=h*cos(an*dlon/dpr)*an/dpr*dr/dys/clat
    +
    446  ENDIF
    +
    447 
    +
    448  END SUBROUTINE lambert_conf_map_jacob
    +
    449 
    +
    468  SUBROUTINE lambert_conf_grid_area(RLAT,FILL,DR,AREA)
    +
    469  IMPLICIT NONE
    +
    470 
    +
    471  REAL, INTENT(IN ) :: RLAT
    +
    472  REAL, INTENT(IN ) :: FILL
    +
    473  REAL, INTENT(IN ) :: DR
    +
    474  REAL, INTENT( OUT) :: AREA
    +
    475 
    +
    476  REAL :: CLAT
    +
    477 
    +
    478  clat=cos(rlat/dpr)
    +
    479  IF(clat.LE.0.OR.dr.LE.0) THEN
    +
    480  area=fill
    +
    481  ELSE
    +
    482  area=rerth**2*clat**2*abs(dxs)*abs(dys)/(an*dr)**2
    +
    483  ENDIF
    +
    484 
    +
    485  END SUBROUTINE lambert_conf_grid_area
    +
    486 
    +
    487 end module ip_lambert_conf_grid_mod
    +
    488 
    +
    void gdswzd(int igdtnum, int *igdtmpl, int igdtlen, int iopt, int npts, float fill, float *xpts, float *ypts, float *rlon, float *rlat, int *nret, float *crot, float *srot, float *xlon, float *xlat, float *ylon, float *ylat, float *area)
    gdswzd() interface for C for _4 build of library.
    +
    Determine earth radius and shape.
    +
    Module containing common constants.
    +
    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
    +
    Abstract ip_grid type.
    Definition: ip_grid_mod.F90:10
    +
    Lambert conformal grib decoder and grid coordinate transformations.
    +
    subroutine lambert_conf_grid_area(RLAT, FILL, DR, AREA)
    Grid box area for lambert conformal conical.
    +
    real dxs
    x-direction grid length adjusted for scan mode.
    +
    subroutine init_grib1(self, g1_desc)
    Initializes a Lambert Conformal grid given a grib1_descriptor object.
    +
    subroutine lambert_conf_vect_rot(DLON, CROT, SROT)
    Vector rotation fields for lambert conformal conical.
    +
    subroutine lambert_conf_map_jacob(RLAT, FILL, DLON, DR, XLON, XLAT, YLON, YLAT)
    Map jacobians for lambert conformal conical.
    +
    subroutine gdswzd_lambert_conf(self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
    GDS wizard for lambert conformal conical.
    +
    integer irot
    vector rotation flag.
    + +
    real rerth
    Radius of the earth.
    + +
    real dys
    y-direction grid length adjusted for scan model.
    +
    subroutine init_grib2(self, g2_desc)
    Initializes a Lambert Conformal grid given a grib2_descriptor object.
    +
    Descriptor representing a grib1 grib descriptor section (GDS) with an integer array.
    +
    Abstract grid that holds fields and methods common to all grids.
    Definition: ip_grid_mod.F90:58
    + +
    +
    + + + + diff --git a/ver-5.1.0/ip__mercator__grid__mod_8F90.html b/ver-5.1.0/ip__mercator__grid__mod_8F90.html new file mode 100644 index 00000000..9b6485d1 --- /dev/null +++ b/ver-5.1.0/ip__mercator__grid__mod_8F90.html @@ -0,0 +1,160 @@ + + + + + + + +NCEPLIBS-ip: ip_mercator_grid_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_mercator_grid_mod.F90 File Reference
    +
    +
    + +

    GDS wizard for mercator cylindrical. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Data Types

    type  ip_mercator_grid_mod::ip_mercator_grid
     
    + + + + +

    +Modules

    module  ip_mercator_grid_mod
     GDS wizard for mercator cylindrical.
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine ip_mercator_grid_mod::gdswzd_mercator (self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     GDS wizard for mercator cylindrical. More...
     
    subroutine ip_mercator_grid_mod::init_grib1 (self, g1_desc)
     Initializes a mercator grid given a grib1_descriptor object. More...
     
    subroutine ip_mercator_grid_mod::init_grib2 (self, g2_desc)
     Init GRIB2. More...
     
    subroutine ip_mercator_grid_mod::mercator_grid_area (RLAT, AREA)
     Grid box area for mercator cylindrical grids. More...
     
    subroutine ip_mercator_grid_mod::mercator_map_jacob (RLAT, XLON, XLAT, YLON, YLAT)
     Map jacobians for mercator cylindrical grids. More...
     
    subroutine ip_mercator_grid_mod::mercator_vect_rot (CROT, SROT)
     Vector rotation fields for mercator cylindrical grids. More...
     
    + + + + + + + + + + +

    +Variables

    real ip_mercator_grid_mod::dlon
     Longitudinal direction grid length. More...
     
    real ip_mercator_grid_mod::dphi
     Latitudinal direction grid length. More...
     
    real ip_mercator_grid_mod::rerth
     Radius of the Earth. More...
     
    +

    Detailed Description

    +

    GDS wizard for mercator cylindrical.

    +
    Author
    Iredell
    +
    Date
    96-04-10
    + +

    Definition in file ip_mercator_grid_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/ip__mercator__grid__mod_8F90.js b/ver-5.1.0/ip__mercator__grid__mod_8F90.js new file mode 100644 index 00000000..90631cb4 --- /dev/null +++ b/ver-5.1.0/ip__mercator__grid__mod_8F90.js @@ -0,0 +1,13 @@ +var ip__mercator__grid__mod_8F90 = +[ + [ "ip_mercator_grid", "structip__mercator__grid__mod_1_1ip__mercator__grid.html", "structip__mercator__grid__mod_1_1ip__mercator__grid" ], + [ "gdswzd_mercator", "ip__mercator__grid__mod_8F90.html#acc39017fa51125972ab8e755e16d339e", null ], + [ "init_grib1", "ip__mercator__grid__mod_8F90.html#a4125dba8b09e9b69933e224b00f4758d", null ], + [ "init_grib2", "ip__mercator__grid__mod_8F90.html#aad3b6fef6ee74b8df984c0159ff29c82", null ], + [ "mercator_grid_area", "ip__mercator__grid__mod_8F90.html#a952ab9add18587c4dbe54699feb8eafd", null ], + [ "mercator_map_jacob", "ip__mercator__grid__mod_8F90.html#ab93a0a6ae8c5f5056abece1dcffdc57a", null ], + [ "mercator_vect_rot", "ip__mercator__grid__mod_8F90.html#aea5e18faf7a18bf8d06c87ccb11f3e17", null ], + [ "dlon", "ip__mercator__grid__mod_8F90.html#a14e1cb3f8c05d2de49d2aa8dc69d104f", null ], + [ "dphi", "ip__mercator__grid__mod_8F90.html#a156e638e2d1b93e388d674462ac3f732", null ], + [ "rerth", "ip__mercator__grid__mod_8F90.html#adaa27c5d41ee24185b6d020420ce9419", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ip__mercator__grid__mod_8F90_source.html b/ver-5.1.0/ip__mercator__grid__mod_8F90_source.html new file mode 100644 index 00000000..de3e1212 --- /dev/null +++ b/ver-5.1.0/ip__mercator__grid__mod_8F90_source.html @@ -0,0 +1,385 @@ + + + + + + + +NCEPLIBS-ip: ip_mercator_grid_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ip_mercator_grid_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    5 
    + + +
    14  use ip_grid_mod
    +
    15  use ip_constants_mod, only: dpr, pi
    + +
    17  implicit none
    +
    18 
    +
    19  private
    +
    20  public :: ip_mercator_grid
    +
    21 
    +
    22  type, extends(ip_grid) :: ip_mercator_grid
    +
    23  real :: rlat1
    +
    24  real :: rlon1
    +
    25  real :: rlon2
    +
    26  real :: rlati
    +
    27  real :: hi
    +
    28  real :: dlon
    +
    29  real :: dphi
    +
    30  contains
    +
    32  procedure :: init_grib1
    +
    34  procedure :: init_grib2
    +
    37  procedure :: gdswzd => gdswzd_mercator
    +
    38  end type ip_mercator_grid
    +
    39 
    +
    40  REAL :: dlon
    +
    41  REAL :: dphi
    +
    42  REAL :: rerth
    +
    43 
    +
    44 CONTAINS
    +
    45 
    +
    52  subroutine init_grib1(self, g1_desc)
    +
    53  class(ip_mercator_grid), intent(inout) :: self
    +
    54  type(grib1_descriptor), intent(in) :: g1_desc
    +
    55 
    +
    56  integer :: iscan, jscan
    +
    57  real :: dy, hj
    +
    58 
    +
    59  associate(kgds => g1_desc%gds)
    +
    60  self%rerth = 6.3712e6
    +
    61  self%eccen_squared = 0.0
    +
    62 
    +
    63  self%IM=kgds(2)
    +
    64  self%JM=kgds(3)
    +
    65 
    +
    66  self%RLAT1=kgds(4)*1.e-3
    +
    67  self%RLON1=kgds(5)*1.e-3
    +
    68  self%RLON2=kgds(8)*1.e-3
    +
    69  self%RLATI=kgds(9)*1.e-3
    +
    70 
    +
    71  iscan=mod(kgds(11)/128,2)
    +
    72  jscan=mod(kgds(11)/64,2)
    +
    73 
    +
    74  dy=kgds(13)
    +
    75  self%HI=(-1.)**iscan
    +
    76  hj=(-1.)**(1-jscan)
    +
    77  self%DLON=self%HI*(mod(self%HI*(self%RLON2-self%RLON1)-1+3600,360.)+1)/(self%IM-1)
    +
    78  self%DPHI=hj*dy/(self%RERTH*cos(self%RLATI/dpr))
    +
    79 
    +
    80  ! defaults
    +
    81  self%iwrap = 0
    +
    82  self%jwrap1 = 0
    +
    83  self%jwrap2 = 0
    +
    84  self%nscan = mod(kgds(11) / 32, 2)
    +
    85  self%nscan_field_pos = self%nscan
    +
    86  self%kscan = 0
    +
    87 
    +
    88  self%iwrap = nint(360 / abs(self%dlon))
    +
    89  if (self%im < self%iwrap) self%iwrap = 0
    +
    90  end associate
    +
    91 
    +
    92  end subroutine init_grib1
    +
    93 
    +
    100  subroutine init_grib2(self, g2_desc)
    +
    101  class(ip_mercator_grid), intent(inout) :: self
    +
    102  type(grib2_descriptor), intent(in) :: g2_desc
    +
    103 
    +
    104  integer :: iscan, jscan
    +
    105  real :: hj, dy
    +
    106 
    +
    107  associate(igdtmpl => g2_desc%gdt_tmpl, igdtlen => g2_desc%gdt_len)
    +
    108 
    +
    109  call earth_radius(igdtmpl, igdtlen, self%rerth, self%eccen_squared)
    +
    110 
    +
    111  self%IM=igdtmpl(8)
    +
    112  self%JM=igdtmpl(9)
    +
    113 
    +
    114  self%RLAT1=float(igdtmpl(10))*1.0e-6
    +
    115  self%RLON1=float(igdtmpl(11))*1.0e-6
    +
    116  self%RLON2=float(igdtmpl(15))*1.0e-6
    +
    117  self%RLATI=float(igdtmpl(13))*1.0e-6
    +
    118 
    +
    119  iscan=mod(igdtmpl(16)/128,2)
    +
    120  jscan=mod(igdtmpl(16)/64,2)
    +
    121 
    +
    122  dy=float(igdtmpl(19))*1.0e-3
    +
    123  self%HI=(-1.)**iscan
    +
    124  hj=(-1.)**(1-jscan)
    +
    125  self%DLON=self%HI*(mod(self%HI*(self%RLON2-self%RLON1)-1+3600,360.)+1)/(self%IM-1)
    +
    126  self%DPHI=hj*dy/(self%RERTH*cos(self%RLATI/dpr))
    +
    127 
    +
    128  self%jwrap1 = 0
    +
    129  self%jwrap2 = 0
    +
    130  self%kscan = 0
    +
    131  self%nscan=mod(igdtmpl(16) / 32,2)
    +
    132  self%nscan_field_pos = self%nscan
    +
    133 
    +
    134  self%iwrap = nint(360 / abs(self%dlon))
    +
    135  if(self%im < self%iwrap) self%iwrap = 0
    +
    136 
    +
    137  end associate
    +
    138  end subroutine init_grib2
    +
    139 
    +
    198  SUBROUTINE gdswzd_mercator(self,IOPT,NPTS,FILL, &
    +
    199  XPTS,YPTS,RLON,RLAT,NRET, &
    +
    200  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
    +
    201  IMPLICIT NONE
    +
    202  !
    +
    203  class(ip_mercator_grid), intent(in) :: self
    +
    204  INTEGER, INTENT(IN ) :: IOPT, NPTS
    +
    205  INTEGER, INTENT( OUT) :: NRET
    +
    206  !
    +
    207  REAL, INTENT(IN ) :: FILL
    +
    208  REAL, INTENT(INOUT) :: RLON(NPTS),RLAT(NPTS)
    +
    209  REAL, INTENT(INOUT) :: XPTS(NPTS),YPTS(NPTS)
    +
    210  REAL, OPTIONAL, INTENT( OUT) :: CROT(NPTS),SROT(NPTS)
    +
    211  REAL, OPTIONAL, INTENT( OUT) :: XLON(NPTS),XLAT(NPTS)
    +
    212  REAL, OPTIONAL, INTENT( OUT) :: YLON(NPTS),YLAT(NPTS),AREA(NPTS)
    +
    213  !
    +
    214  INTEGER :: IM, JM, N
    +
    215  !
    +
    216  LOGICAL :: LROT, LMAP, LAREA
    +
    217  !
    +
    218  REAL :: HI
    +
    219  REAL :: RLAT1, RLON1, RLON2, RLATI
    +
    220  REAL :: XMAX, XMIN, YMAX, YMIN
    +
    221  REAL :: YE
    +
    222  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    223  IF(PRESENT(crot)) crot=fill
    +
    224  IF(PRESENT(srot)) srot=fill
    +
    225  IF(PRESENT(xlon)) xlon=fill
    +
    226  IF(PRESENT(xlat)) xlat=fill
    +
    227  IF(PRESENT(ylon)) ylon=fill
    +
    228  IF(PRESENT(ylat)) ylat=fill
    +
    229  IF(PRESENT(area)) area=fill
    +
    230  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    231 
    +
    232  im=self%im
    +
    233  jm=self%jm
    +
    234 
    +
    235  rlat1=self%rlat1
    +
    236  rlon1=self%rlon1
    +
    237  rlon2=self%rlon2
    +
    238  rlati=self%rlati
    +
    239 
    +
    240  hi=self%hi
    +
    241 
    +
    242  dlon=self%dlon
    +
    243  dphi=self%dphi
    +
    244  rerth = self%rerth
    +
    245 
    +
    246  ye=1-log(tan((rlat1+90)/2/dpr))/dphi
    +
    247  xmin=0
    +
    248  xmax=im+1
    +
    249  IF(im.EQ.nint(360/abs(dlon))) xmax=im+2
    +
    250  ymin=0
    +
    251  ymax=jm+1
    +
    252  nret=0
    +
    253  IF(PRESENT(crot).AND.PRESENT(srot))THEN
    +
    254  lrot=.true.
    +
    255  ELSE
    +
    256  lrot=.false.
    +
    257  ENDIF
    +
    258  IF(PRESENT(xlon).AND.PRESENT(xlat).AND.PRESENT(ylon).AND.PRESENT(ylat))THEN
    +
    259  lmap=.true.
    +
    260  ELSE
    +
    261  lmap=.false.
    +
    262  ENDIF
    +
    263  IF(PRESENT(area))THEN
    +
    264  larea=.true.
    +
    265  ELSE
    +
    266  larea=.false.
    +
    267  ENDIF
    +
    268  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    269  ! TRANSLATE GRID COORDINATES TO EARTH COORDINATES
    +
    270  IF(iopt.EQ.0.OR.iopt.EQ.1) THEN
    +
    271  !$OMP PARALLEL DO PRIVATE(N) REDUCTION(+:NRET) SCHEDULE(STATIC)
    +
    272  DO n=1,npts
    +
    273  IF(xpts(n).GE.xmin.AND.xpts(n).LE.xmax.AND. &
    +
    274  ypts(n).GE.ymin.AND.ypts(n).LE.ymax) THEN
    +
    275  rlon(n)=mod(rlon1+dlon*(xpts(n)-1)+3600,360.)
    +
    276  rlat(n)=2*atan(exp(dphi*(ypts(n)-ye)))*dpr-90
    +
    277  nret=nret+1
    +
    278  IF(lrot) CALL mercator_vect_rot(crot(n),srot(n))
    +
    279  IF(lmap) CALL mercator_map_jacob(rlat(n),xlon(n),xlat(n),ylon(n),ylat(n))
    +
    280  IF(larea) CALL mercator_grid_area(rlat(n),area(n))
    +
    281  ELSE
    +
    282  rlon(n)=fill
    +
    283  rlat(n)=fill
    +
    284  ENDIF
    +
    285  ENDDO
    +
    286  !$OMP END PARALLEL DO
    +
    287  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    288  ! TRANSLATE EARTH COORDINATES TO GRID COORDINATES
    +
    289  ELSEIF(iopt.EQ.-1) THEN
    +
    290  !$OMP PARALLEL DO PRIVATE(N) REDUCTION(+:NRET) SCHEDULE(STATIC)
    +
    291  DO n=1,npts
    +
    292  IF(abs(rlon(n)).LE.360.AND.abs(rlat(n)).LT.90) THEN
    +
    293  xpts(n)=1+hi*mod(hi*(rlon(n)-rlon1)+3600,360.)/dlon
    +
    294  ypts(n)=ye+log(tan((rlat(n)+90)/2/dpr))/dphi
    +
    295  IF(xpts(n).GE.xmin.AND.xpts(n).LE.xmax.AND. &
    +
    296  ypts(n).GE.ymin.AND.ypts(n).LE.ymax) THEN
    +
    297  nret=nret+1
    +
    298  IF(lrot) CALL mercator_vect_rot(crot(n),srot(n))
    +
    299  IF(lmap) CALL mercator_map_jacob(rlat(n),xlon(n),xlat(n),ylon(n),ylat(n))
    +
    300  IF(larea) CALL mercator_grid_area(rlat(n),area(n))
    +
    301  ELSE
    +
    302  xpts(n)=fill
    +
    303  ypts(n)=fill
    +
    304  ENDIF
    +
    305  ELSE
    +
    306  xpts(n)=fill
    +
    307  ypts(n)=fill
    +
    308  ENDIF
    +
    309  ENDDO
    +
    310  !$OMP END PARALLEL DO
    +
    311  ENDIF
    +
    312  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    313  END SUBROUTINE gdswzd_mercator
    +
    314 
    +
    331  SUBROUTINE mercator_vect_rot(CROT,SROT)
    +
    332  IMPLICIT NONE
    +
    333 
    +
    334  REAL, INTENT( OUT) :: CROT, SROT
    +
    335 
    +
    336  crot=1.0
    +
    337  srot=0.0
    +
    338 
    +
    339  END SUBROUTINE mercator_vect_rot
    +
    340 
    +
    359  SUBROUTINE mercator_map_jacob(RLAT,XLON,XLAT,YLON,YLAT)
    +
    360  IMPLICIT NONE
    +
    361 
    +
    362  REAL, INTENT(IN ) :: RLAT
    +
    363  REAL, INTENT( OUT) :: XLON, XLAT, YLON, YLAT
    +
    364 
    +
    365  xlon=1./dlon
    +
    366  xlat=0.
    +
    367  ylon=0.
    +
    368  ylat=1./dphi/cos(rlat/dpr)/dpr
    +
    369 
    +
    370  END SUBROUTINE mercator_map_jacob
    +
    371 
    +
    387  SUBROUTINE mercator_grid_area(RLAT,AREA)
    +
    388  IMPLICIT NONE
    +
    389 
    +
    390  REAL, INTENT(IN ) :: RLAT
    +
    391  REAL, INTENT( OUT) :: AREA
    +
    392 
    +
    393  area=rerth**2*cos(rlat/dpr)**2*dphi*dlon/dpr
    +
    394 
    +
    395  END SUBROUTINE mercator_grid_area
    +
    396 
    +
    397 end module ip_mercator_grid_mod
    +
    398 
    +
    void gdswzd(int igdtnum, int *igdtmpl, int igdtlen, int iopt, int npts, float fill, float *xpts, float *ypts, float *rlon, float *rlat, int *nret, float *crot, float *srot, float *xlon, float *xlat, float *ylon, float *ylat, float *area)
    gdswzd() interface for C for _4 build of library.
    +
    Determine earth radius and shape.
    +
    Module containing common constants.
    +
    real, parameter pi
    PI.
    +
    real, parameter dpr
    Radians to degrees.
    +
    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
    +
    Abstract ip_grid type.
    Definition: ip_grid_mod.F90:10
    +
    GDS wizard for mercator cylindrical.
    +
    real dlon
    Longitudinal direction grid length.
    +
    real dphi
    Latitudinal direction grid length.
    +
    subroutine init_grib1(self, g1_desc)
    Initializes a mercator grid given a grib1_descriptor object.
    +
    subroutine mercator_grid_area(RLAT, AREA)
    Grid box area for mercator cylindrical grids.
    +
    subroutine init_grib2(self, g2_desc)
    Init GRIB2.
    +
    subroutine mercator_map_jacob(RLAT, XLON, XLAT, YLON, YLAT)
    Map jacobians for mercator cylindrical grids.
    +
    subroutine gdswzd_mercator(self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
    GDS wizard for mercator cylindrical.
    +
    real rerth
    Radius of the Earth.
    +
    subroutine mercator_vect_rot(CROT, SROT)
    Vector rotation fields for mercator cylindrical grids.
    +
    Descriptor representing a grib1 grib descriptor section (GDS) with an integer array.
    +
    Abstract grid that holds fields and methods common to all grids.
    Definition: ip_grid_mod.F90:58
    + +
    +
    + + + + diff --git a/ver-5.1.0/ip__mod_8F90.html b/ver-5.1.0/ip__mod_8F90.html new file mode 100644 index 00000000..d289c2ea --- /dev/null +++ b/ver-5.1.0/ip__mod_8F90.html @@ -0,0 +1,118 @@ + + + + + + + +NCEPLIBS-ip: ip_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_mod.F90 File Reference
    +
    +
    + +

    Top-level module for the ip library. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Modules

    module  ip_mod
     Top-level module for the ip library which re-exports public routines such as ipolates, ipolatev, and gdswzd.
     
    +

    Detailed Description

    +

    Top-level module for the ip library.

    +
    Author
    Kyle Gerheiser
    + +

    Definition in file ip_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/ip__mod_8F90_source.html b/ver-5.1.0/ip__mod_8F90_source.html new file mode 100644 index 00000000..4218db9d --- /dev/null +++ b/ver-5.1.0/ip__mod_8F90_source.html @@ -0,0 +1,127 @@ + + + + + + + +NCEPLIBS-ip: ip_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ip_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    4 
    +
    6 module ip_mod
    +
    7 
    +
    8  ! Make these constants public to everyone instead of
    +
    9  ! using numbers directly
    + + + + + + +
    16 
    +
    17  use ipolates_mod
    +
    18  use ipolatev_mod
    +
    19  use gdswzd_mod
    +
    20 end module ip_mod
    +
    Driver module for gdswzd routines.
    Definition: gdswzd_mod.F90:25
    +
    Top-level module to export interpolation routines and constants.
    +
    integer, parameter, public neighbor_interp_id
    +
    integer, parameter, public bilinear_interp_id
    +
    integer, parameter, public budget_interp_id
    +
    integer, parameter, public spectral_interp_id
    +
    integer, parameter, public bicubic_interp_id
    +
    integer, parameter, public neighbor_budget_interp_id
    +
    Top-level module for the ip library which re-exports public routines such as ipolates,...
    Definition: ip_mod.F90:6
    +
    Top-level driver for scalar interpolation interpolation routine ipolates().
    Definition: ipolates.F90:12
    +
    Top-level driver for vector interpolation interpolation routine ipolatev().
    Definition: ipolatev.F90:10
    +
    +
    + + + + diff --git a/ver-5.1.0/ip__polar__stereo__grid__mod_8F90.html b/ver-5.1.0/ip__polar__stereo__grid__mod_8F90.html new file mode 100644 index 00000000..9d002aad --- /dev/null +++ b/ver-5.1.0/ip__polar__stereo__grid__mod_8F90.html @@ -0,0 +1,175 @@ + + + + + + + +NCEPLIBS-ip: ip_polar_stereo_grid_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_polar_stereo_grid_mod.F90 File Reference
    +
    +
    + +

    GDS wizard for polar stereographic azimuthal. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Data Types

    type  ip_polar_stereo_grid_mod::ip_polar_stereo_grid
     
    + + + + +

    +Modules

    module  ip_polar_stereo_grid_mod
     GDS wizard for polar stereographic azimuthal.
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine ip_polar_stereo_grid_mod::gdswzd_polar_stereo (self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     GDS wizard for polar stereographic azimuthal. More...
     
    subroutine ip_polar_stereo_grid_mod::init_grib1 (self, g1_desc)
     Initializes a polar stereographic grid given a grib1_descriptor object. More...
     
    subroutine ip_polar_stereo_grid_mod::init_grib2 (self, g2_desc)
     Initializes a polar stereographic grid given a grib2_descriptor object. More...
     
    subroutine ip_polar_stereo_grid_mod::polar_stereo_grid_area (RLAT, DR2, AREA)
     Grid box area for polar stereographic grids. More...
     
    subroutine ip_polar_stereo_grid_mod::polar_stereo_map_jacob (RLON, RLAT, DR2, XLON, XLAT, YLON, YLAT)
     Map jacobians for polar stereographic grids. More...
     
    subroutine ip_polar_stereo_grid_mod::polar_stereo_vect_rot (RLON, CROT, SROT)
     Vector rotation fields for polar stereographic grids. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Variables

    real ip_polar_stereo_grid_mod::de2
     Square of DE. More...
     
    real ip_polar_stereo_grid_mod::dxs
     Local copy of dxs. More...
     
    real ip_polar_stereo_grid_mod::dys
     Local copy of dys. More...
     
    real ip_polar_stereo_grid_mod::e2
     Eccentricity squared. More...
     
    real ip_polar_stereo_grid_mod::h
     Local copy of h. More...
     
    integer ip_polar_stereo_grid_mod::irot
     Local copy of irot. More...
     
    real ip_polar_stereo_grid_mod::orient
     Local copy of orient. More...
     
    real ip_polar_stereo_grid_mod::rerth
     Radius of the Earth. More...
     
    +

    Detailed Description

    +

    GDS wizard for polar stereographic azimuthal.

    +
    Author
    Iredell
    +
    Date
    96-04-10
    + +

    Definition in file ip_polar_stereo_grid_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/ip__polar__stereo__grid__mod_8F90.js b/ver-5.1.0/ip__polar__stereo__grid__mod_8F90.js new file mode 100644 index 00000000..79171727 --- /dev/null +++ b/ver-5.1.0/ip__polar__stereo__grid__mod_8F90.js @@ -0,0 +1,18 @@ +var ip__polar__stereo__grid__mod_8F90 = +[ + [ "ip_polar_stereo_grid", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid" ], + [ "gdswzd_polar_stereo", "ip__polar__stereo__grid__mod_8F90.html#ae2694d90ab514a131e083dfba3b173c5", null ], + [ "init_grib1", "ip__polar__stereo__grid__mod_8F90.html#a6ed76f58f30993cd7be84b7e03cf4d6f", null ], + [ "init_grib2", "ip__polar__stereo__grid__mod_8F90.html#a5210b986366b503683ae966519d501e7", null ], + [ "polar_stereo_grid_area", "ip__polar__stereo__grid__mod_8F90.html#a2a2e0854e5c129e320924a811cbd08e2", null ], + [ "polar_stereo_map_jacob", "ip__polar__stereo__grid__mod_8F90.html#a386933f7e52c348b9d742df423e0e223", null ], + [ "polar_stereo_vect_rot", "ip__polar__stereo__grid__mod_8F90.html#abe4d416201e986421a8e325a9b00e462", null ], + [ "de2", "ip__polar__stereo__grid__mod_8F90.html#a605d287e34e60f553521a5de2da22962", null ], + [ "dxs", "ip__polar__stereo__grid__mod_8F90.html#acf60181f89954e2ff31b08bb1b345354", null ], + [ "dys", "ip__polar__stereo__grid__mod_8F90.html#aea7950530d06d9c59ff61bf706df0a0f", null ], + [ "e2", "ip__polar__stereo__grid__mod_8F90.html#abf3a34d9bb00c39dac5225798aea4d5b", null ], + [ "h", "ip__polar__stereo__grid__mod_8F90.html#a5a63da5168a1432a1af42c0b668f0645", null ], + [ "irot", "ip__polar__stereo__grid__mod_8F90.html#a1269037aaecd12e75e17d8aac8e20c8c", null ], + [ "orient", "ip__polar__stereo__grid__mod_8F90.html#aa4a88f48d7b78cfdfc54754882195d18", null ], + [ "rerth", "ip__polar__stereo__grid__mod_8F90.html#a3315b2efb5cb9aebc0b2cb2773aa20b5", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ip__polar__stereo__grid__mod_8F90_source.html b/ver-5.1.0/ip__polar__stereo__grid__mod_8F90_source.html new file mode 100644 index 00000000..99fbc360 --- /dev/null +++ b/ver-5.1.0/ip__polar__stereo__grid__mod_8F90_source.html @@ -0,0 +1,557 @@ + + + + + + + +NCEPLIBS-ip: ip_polar_stereo_grid_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ip_polar_stereo_grid_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    5 
    + + +
    15  use ip_grid_mod
    + + +
    18  implicit none
    +
    19 
    +
    20  private
    +
    21  public :: ip_polar_stereo_grid
    +
    22 
    +
    23  type, extends(ip_grid) :: ip_polar_stereo_grid
    +
    24  logical :: elliptical
    +
    25  real :: rlat1
    +
    26  real :: rlon1
    +
    27  real :: orient
    +
    28  real :: h
    +
    29  real :: dxs
    +
    30  real :: dys
    +
    31  real :: slatr
    +
    35  integer :: irot
    +
    36  contains
    +
    37  procedure :: init_grib1
    +
    38  procedure :: init_grib2
    +
    41  procedure :: gdswzd => gdswzd_polar_stereo
    +
    42  end type ip_polar_stereo_grid
    +
    43 
    +
    44  INTEGER :: irot
    +
    45  REAL :: de2
    +
    46  REAL :: dxs
    +
    47  REAL :: dys
    +
    48  REAL :: e2
    +
    49  REAL :: rerth
    +
    50  REAL :: h
    +
    51  REAL :: orient
    +
    52  REAL :: tinyreal=tiny(1.0)
    +
    53 
    +
    54 CONTAINS
    +
    55 
    +
    63  subroutine init_grib1(self, g1_desc)
    +
    64  class(ip_polar_stereo_grid), intent(inout) :: self
    +
    65  type(grib1_descriptor), intent(in) :: g1_desc
    +
    66 
    +
    67  REAL, PARAMETER :: SLAT=60.0 ! standard latitude according grib1 standard
    +
    68 
    +
    69  real :: dx, dy, hi, hj
    +
    70  integer :: iproj, iscan, jscan
    +
    71 
    +
    72  associate(kgds => g1_desc%gds)
    +
    73  self%ELLIPTICAL=mod(kgds(6)/64,2).EQ.1
    +
    74 
    +
    75  if (.not. self%elliptical) then
    +
    76  self%rerth = 6.3712e6
    +
    77  self%eccen_squared = 0d0
    +
    78  else
    +
    79  self%rerth = rerth_wgs84
    +
    80  self%eccen_squared = e2_wgs84 !wgs84 datum
    +
    81  end if
    +
    82 
    +
    83  self%IM=kgds(2)
    +
    84  self%JM=kgds(3)
    +
    85 
    +
    86  self%RLAT1=kgds(4)*1.e-3
    +
    87  self%RLON1=kgds(5)*1.e-3
    +
    88 
    +
    89  self%IROT=mod(kgds(6)/8,2)
    +
    90 
    +
    91  self%SLATR=slat/dpr
    +
    92 
    +
    93  self%ORIENT=kgds(7)*1.e-3
    +
    94 
    +
    95  dx=kgds(8)
    +
    96  dy=kgds(9)
    +
    97 
    +
    98  iproj=mod(kgds(10)/128,2)
    +
    99  iscan=mod(kgds(11)/128,2)
    +
    100  jscan=mod(kgds(11)/64,2)
    +
    101 
    +
    102  self%H=(-1.)**iproj
    +
    103  hi=(-1.)**iscan
    +
    104  hj=(-1.)**(1-jscan)
    +
    105 
    +
    106  IF(abs(self%H+1.).LT.tinyreal) self%ORIENT=self%ORIENT+180.
    +
    107 
    +
    108  self%DXS=dx*hi
    +
    109  self%DYS=dy*hj
    +
    110 
    +
    111  self%iwrap= 0
    +
    112  self%jwrap1 = 0
    +
    113  self%jwrap2 = 0
    +
    114  self%nscan = mod(kgds(11) / 32, 2)
    +
    115  self%nscan_field_pos = self%nscan
    +
    116  self%kscan = 0
    +
    117  end associate
    +
    118 
    +
    119  end subroutine init_grib1
    +
    120 
    +
    128  subroutine init_grib2(self, g2_desc)
    +
    129  class(ip_polar_stereo_grid), intent(inout) :: self
    +
    130  type(grib2_descriptor), intent(in) :: g2_desc
    +
    131 
    +
    132  real :: slat, dx, dy, hi, hj
    +
    133  integer :: iproj, iscan, jscan
    +
    134 
    +
    135  associate(igdtmpl => g2_desc%gdt_tmpl, igdtlen => g2_desc%gdt_len)
    +
    136  call earth_radius(igdtmpl, igdtlen, self%rerth, self%eccen_squared)
    +
    137 
    +
    138  self%ELLIPTICAL = self%eccen_squared > 0.0
    +
    139 
    +
    140  self%IM=igdtmpl(8)
    +
    141  self%JM=igdtmpl(9)
    +
    142 
    +
    143  self%RLAT1=float(igdtmpl(10))*1.e-6
    +
    144  self%RLON1=float(igdtmpl(11))*1.e-6
    +
    145 
    +
    146  self%IROT=mod(igdtmpl(12)/8,2)
    +
    147 
    +
    148  slat=float(abs(igdtmpl(13)))*1.e-6
    +
    149  self%SLATR=slat/dpr
    +
    150 
    +
    151  self%ORIENT=float(igdtmpl(14))*1.e-6
    +
    152 
    +
    153  dx=float(igdtmpl(15))*1.e-3
    +
    154  dy=float(igdtmpl(16))*1.e-3
    +
    155 
    +
    156  iproj=mod(igdtmpl(17)/128,2)
    +
    157  iscan=mod(igdtmpl(18)/128,2)
    +
    158  jscan=mod(igdtmpl(18)/64,2)
    +
    159 
    +
    160  self%H=(-1.)**iproj
    +
    161  hi=(-1.)**iscan
    +
    162  hj=(-1.)**(1-jscan)
    +
    163 
    +
    164  self%DXS=dx*hi
    +
    165  self%DYS=dy*hj
    +
    166 
    +
    167  self%nscan = mod(igdtmpl(18) / 32, 2)
    +
    168  self%nscan_field_pos = self%nscan
    +
    169  self%iwrap = 0
    +
    170  self%jwrap1 = 0
    +
    171  self%jwrap2 = 0
    +
    172  self%kscan = 0
    +
    173  end associate
    +
    174  end subroutine init_grib2
    +
    175 
    +
    239  SUBROUTINE gdswzd_polar_stereo(self,IOPT,NPTS, &
    +
    240  FILL,XPTS,YPTS,RLON,RLAT,NRET, &
    +
    241  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
    +
    242  IMPLICIT NONE
    +
    243  !
    +
    244 
    +
    245  class(ip_polar_stereo_grid), intent(in) :: self
    +
    246  INTEGER, INTENT(IN ) :: IOPT, NPTS
    +
    247  INTEGER, INTENT( OUT) :: NRET
    +
    248  !
    +
    249  REAL, INTENT(IN ) :: FILL
    +
    250  REAL, INTENT(INOUT) :: RLON(NPTS),RLAT(NPTS)
    +
    251  REAL, INTENT(INOUT) :: XPTS(NPTS),YPTS(NPTS)
    +
    252  REAL, OPTIONAL, INTENT( OUT) :: CROT(NPTS),SROT(NPTS)
    +
    253  REAL, OPTIONAL, INTENT( OUT) :: XLON(NPTS),XLAT(NPTS)
    +
    254  REAL, OPTIONAL, INTENT( OUT) :: YLON(NPTS),YLAT(NPTS),AREA(NPTS)
    +
    255  !
    +
    256  INTEGER :: IM, JM
    +
    257  INTEGER :: ITER, N
    +
    258  !
    +
    259  LOGICAL :: ELLIPTICAL, LROT, LMAP, LAREA
    +
    260  !
    +
    261  REAL :: ALAT, ALAT1, ALONG, DIFF
    +
    262  REAL :: DI, DJ, DE
    +
    263  REAL :: DR, E, E_OVER_2
    +
    264  REAL :: MC, SLATR
    +
    265  REAL :: RLAT1, RLON1, RHO, T, TC
    +
    266  REAL :: XMAX, XMIN, YMAX, YMIN
    +
    267  REAL :: XP, YP, DR2
    +
    268  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    269  IF(PRESENT(crot)) crot=fill
    +
    270  IF(PRESENT(srot)) srot=fill
    +
    271  IF(PRESENT(xlon)) xlon=fill
    +
    272  IF(PRESENT(xlat)) xlat=fill
    +
    273  IF(PRESENT(ylon)) ylon=fill
    +
    274  IF(PRESENT(ylat)) ylat=fill
    +
    275  IF(PRESENT(area)) area=fill
    +
    276 
    +
    277  elliptical = self%elliptical
    +
    278  im=self%im
    +
    279  jm=self%jm
    +
    280 
    +
    281  rlat1=self%rlat1
    +
    282  rlon1=self%rlon1
    +
    283 
    +
    284  irot=self%irot
    +
    285  slatr=self%slatr
    +
    286  orient=self%orient
    +
    287 
    +
    288  h=self%h
    +
    289  dxs=self%dxs
    +
    290  dys=self%dys
    +
    291 
    +
    292  rerth = self%rerth
    +
    293  e2 = self%eccen_squared
    +
    294  !
    +
    295  ! FIND X/Y OF POLE
    +
    296  IF (.NOT.elliptical) THEN
    +
    297  de=(1.+sin(slatr))*rerth
    +
    298  dr=de*cos(rlat1/dpr)/(1+h*sin(rlat1/dpr))
    +
    299  xp=1-h*sin((rlon1-orient)/dpr)*dr/dxs
    +
    300  yp=1+cos((rlon1-orient)/dpr)*dr/dys
    +
    301  de2=de**2
    +
    302  ELSE
    +
    303  e=sqrt(e2)
    +
    304  e_over_2=e*0.5
    +
    305  alat=h*rlat1/dpr
    +
    306  along = (rlon1-orient)/dpr
    +
    307  t=tan(pi4-alat/2.)/((1.-e*sin(alat))/ &
    +
    308  (1.+e*sin(alat)))**(e_over_2)
    +
    309  tc=tan(pi4-slatr/2.)/((1.-e*sin(slatr))/ &
    +
    310  (1.+e*sin(slatr)))**(e_over_2)
    +
    311  mc=cos(slatr)/sqrt(1.0-e2*(sin(slatr)**2))
    +
    312  rho=rerth*mc*t/tc
    +
    313  yp = 1.0 + rho*cos(h*along)/dys
    +
    314  xp = 1.0 - rho*sin(h*along)/dxs
    +
    315  ENDIF ! ELLIPTICAL
    +
    316  xmin=0
    +
    317  xmax=im+1
    +
    318  ymin=0
    +
    319  ymax=jm+1
    +
    320  nret=0
    +
    321  IF(PRESENT(crot).AND.PRESENT(srot))THEN
    +
    322  lrot=.true.
    +
    323  ELSE
    +
    324  lrot=.false.
    +
    325  ENDIF
    +
    326  IF(PRESENT(xlon).AND.PRESENT(xlat).AND.PRESENT(ylon).AND.PRESENT(ylat))THEN
    +
    327  lmap=.true.
    +
    328  ELSE
    +
    329  lmap=.false.
    +
    330  ENDIF
    +
    331  IF(PRESENT(area))THEN
    +
    332  larea=.true.
    +
    333  ELSE
    +
    334  larea=.false.
    +
    335  ENDIF
    +
    336  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    337  ! TRANSLATE GRID COORDINATES TO EARTH COORDINATES
    +
    338  IF(iopt.EQ.0.OR.iopt.EQ.1) THEN
    +
    339  IF(.NOT.elliptical)THEN
    +
    340  !$OMP PARALLEL DO PRIVATE(N,DI,DJ,DR2) REDUCTION(+:NRET) SCHEDULE(STATIC)
    +
    341  DO n=1,npts
    +
    342  IF(xpts(n).GE.xmin.AND.xpts(n).LE.xmax.AND. &
    +
    343  ypts(n).GE.ymin.AND.ypts(n).LE.ymax) THEN
    +
    344  di=(xpts(n)-xp)*dxs
    +
    345  dj=(ypts(n)-yp)*dys
    +
    346  dr2=di**2+dj**2
    +
    347  IF(dr2.LT.de2*1.e-6) THEN
    +
    348  rlon(n)=0.
    +
    349  rlat(n)=h*90.
    +
    350  ELSE
    +
    351  rlon(n)=mod(orient+h*dpr*atan2(di,-dj)+3600,360.)
    +
    352  rlat(n)=h*dpr*asin((de2-dr2)/(de2+dr2))
    +
    353  ENDIF
    +
    354  nret=nret+1
    +
    355  IF(lrot) CALL polar_stereo_vect_rot(rlon(n),crot(n),srot(n))
    +
    356  IF(lmap) CALL polar_stereo_map_jacob(rlon(n),rlat(n),dr2, &
    +
    357  xlon(n),xlat(n),ylon(n),ylat(n))
    +
    358  IF(larea) CALL polar_stereo_grid_area(rlat(n),dr2,area(n))
    +
    359  ELSE
    +
    360  rlon(n)=fill
    +
    361  rlat(n)=fill
    +
    362  ENDIF
    +
    363  ENDDO
    +
    364  !$OMP END PARALLEL DO
    +
    365  ELSE ! ELLIPTICAL
    +
    366  !$OMP PARALLEL DO PRIVATE(N,DI,DJ,RHO,T,ALONG,ALAT1,ALAT,DIFF) &
    +
    367  !$OMP& REDUCTION(+:NRET) SCHEDULE(STATIC)
    +
    368  DO n=1,npts
    +
    369  IF(xpts(n).GE.xmin.AND.xpts(n).LE.xmax.AND. &
    +
    370  ypts(n).GE.ymin.AND.ypts(n).LE.ymax) THEN
    +
    371  di=(xpts(n)-xp)*dxs
    +
    372  dj=(ypts(n)-yp)*dys
    +
    373  rho=sqrt(di*di+dj*dj)
    +
    374  t=(rho*tc)/(rerth*mc)
    +
    375  IF(abs(ypts(n)-yp)<0.01)THEN
    +
    376  IF(di>0.0) along=orient+h*90.0
    +
    377  IF(di<=0.0) along=orient-h*90.0
    +
    378  ELSE
    +
    379  along=orient+h*atan(di/(-dj))*dpr
    +
    380  IF(dj>0) along=along+180.
    +
    381  END IF
    +
    382  alat1=pi2-2.0*atan(t)
    +
    383  DO iter=1,10
    +
    384  alat = pi2 - 2.0*atan(t*(((1.0-e*sin(alat1))/ &
    +
    385  (1.0+e*sin(alat1)))**(e_over_2)))
    +
    386  diff = abs(alat-alat1)*dpr
    +
    387  IF (diff < 0.000001) EXIT
    +
    388  alat1=alat
    +
    389  ENDDO
    +
    390  rlat(n)=h*alat*dpr
    +
    391  rlon(n)=along
    +
    392  IF(rlon(n)<0.0) rlon(n)=rlon(n)+360.
    +
    393  IF(rlon(n)>360.0) rlon(n)=rlon(n)-360.0
    +
    394  nret=nret+1
    +
    395  IF(lrot) CALL polar_stereo_vect_rot(rlon(n),crot(n),srot(n))
    +
    396  ELSE
    +
    397  rlon(n)=fill
    +
    398  rlat(n)=fill
    +
    399  ENDIF
    +
    400  ENDDO
    +
    401  !$OMP END PARALLEL DO
    +
    402  ENDIF ! ELLIPTICAL
    +
    403  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    404  ! TRANSLATE EARTH COORDINATES TO GRID COORDINATES
    +
    405  ELSEIF(iopt.EQ.-1) THEN
    +
    406  IF(.NOT.elliptical)THEN
    +
    407  !$OMP PARALLEL DO PRIVATE(N,DR,DR2) REDUCTION(+:NRET) SCHEDULE(STATIC)
    +
    408  DO n=1,npts
    +
    409  IF(abs(rlon(n)).LT.(360.+tinyreal).AND.abs(rlat(n)).LT.(90.+tinyreal).AND. &
    +
    410  abs(h*rlat(n)+90).GT.tinyreal) THEN
    +
    411  dr=de*tan((90-h*rlat(n))/2/dpr)
    +
    412  dr2=dr**2
    +
    413  xpts(n)=xp+h*sin((rlon(n)-orient)/dpr)*dr/dxs
    +
    414  ypts(n)=yp-cos((rlon(n)-orient)/dpr)*dr/dys
    +
    415  IF(xpts(n).GE.xmin.AND.xpts(n).LE.xmax.AND. &
    +
    416  ypts(n).GE.ymin.AND.ypts(n).LE.ymax) THEN
    +
    417  nret=nret+1
    +
    418  IF(lrot) CALL polar_stereo_vect_rot(rlon(n),crot(n),srot(n))
    +
    419  IF(lmap) CALL polar_stereo_map_jacob(rlon(n),rlat(n),dr2, &
    +
    420  xlon(n),xlat(n),ylon(n),ylat(n))
    +
    421  IF(larea) CALL polar_stereo_grid_area(rlat(n),dr2,area(n))
    +
    422  ELSE
    +
    423  xpts(n)=fill
    +
    424  ypts(n)=fill
    +
    425  ENDIF
    +
    426  ELSE
    +
    427  xpts(n)=fill
    +
    428  ypts(n)=fill
    +
    429  ENDIF
    +
    430  ENDDO
    +
    431  !$OMP END PARALLEL DO
    +
    432  ELSE ! ELLIPTICAL CASE
    +
    433  !$OMP PARALLEL DO PRIVATE(N,ALAT,ALONG,T,RHO) REDUCTION(+:NRET) SCHEDULE(STATIC)
    +
    434  DO n=1,npts
    +
    435  IF(abs(rlon(n)).LT.(360+tinyreal).AND.abs(rlat(n)).LT.(90+tinyreal).AND. &
    +
    436  abs(h*rlat(n)+90).GT.tinyreal) THEN
    +
    437  alat = h*rlat(n)/dpr
    +
    438  along = (rlon(n)-orient)/dpr
    +
    439  t=tan(pi4-alat*0.5)/((1.-e*sin(alat))/ &
    +
    440  (1.+e*sin(alat)))**(e_over_2)
    +
    441  rho=rerth*mc*t/tc
    +
    442  xpts(n)= xp + rho*sin(h*along) / dxs
    +
    443  ypts(n)= yp - rho*cos(h*along) / dys
    +
    444  IF(xpts(n).GE.xmin.AND.xpts(n).LE.xmax.AND. &
    +
    445  ypts(n).GE.ymin.AND.ypts(n).LE.ymax) THEN
    +
    446  nret=nret+1
    +
    447  IF(lrot) CALL polar_stereo_vect_rot(rlon(n),crot(n),srot(n))
    +
    448  ELSE
    +
    449  xpts(n)=fill
    +
    450  ypts(n)=fill
    +
    451  ENDIF
    +
    452  ELSE
    +
    453  xpts(n)=fill
    +
    454  ypts(n)=fill
    +
    455  ENDIF
    +
    456  ENDDO
    +
    457  !$OMP END PARALLEL DO
    +
    458  ENDIF
    +
    459  ENDIF
    +
    460  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    461  END SUBROUTINE gdswzd_polar_stereo
    +
    462 
    +
    482  SUBROUTINE polar_stereo_vect_rot(RLON, CROT, SROT)
    +
    483  IMPLICIT NONE
    +
    484 
    +
    485  REAL, INTENT(IN ) :: RLON
    +
    486  REAL, INTENT( OUT) :: CROT, SROT
    +
    487 
    +
    488  IF(irot.EQ.1) THEN
    +
    489  crot=h*cos((rlon-orient)/dpr)
    +
    490  srot=sin((rlon-orient)/dpr)
    +
    491  ELSE
    +
    492  crot=1.
    +
    493  srot=0.
    +
    494  ENDIF
    +
    495 
    +
    496  END SUBROUTINE polar_stereo_vect_rot
    +
    497 
    +
    520  SUBROUTINE polar_stereo_map_jacob(RLON,RLAT,DR2,XLON,XLAT,YLON,YLAT)
    +
    521  IMPLICIT NONE
    +
    522 
    +
    523  REAL, INTENT(IN ) :: RLON, RLAT, DR2
    +
    524  REAL, INTENT( OUT) :: XLON, XLAT, YLON, YLAT
    +
    525 
    +
    526  REAL :: CLAT, DE, DR
    +
    527 
    +
    528  IF(dr2.LT.de2*1.e-6) THEN
    +
    529  de=sqrt(de2)
    +
    530  xlon=0.
    +
    531  xlat=-sin((rlon-orient)/dpr)/dpr*de/dxs/2
    +
    532  ylon=0.
    +
    533  ylat=h*cos((rlon-orient)/dpr)/dpr*de/dys/2
    +
    534  ELSE
    +
    535  dr=sqrt(dr2)
    +
    536  clat=cos(rlat/dpr)
    +
    537  xlon=h*cos((rlon-orient)/dpr)/dpr*dr/dxs
    +
    538  xlat=-sin((rlon-orient)/dpr)/dpr*dr/dxs/clat
    +
    539  ylon=sin((rlon-orient)/dpr)/dpr*dr/dys
    +
    540  ylat=h*cos((rlon-orient)/dpr)/dpr*dr/dys/clat
    +
    541  ENDIF
    +
    542 
    +
    543  END SUBROUTINE polar_stereo_map_jacob
    +
    544 
    +
    563  SUBROUTINE polar_stereo_grid_area(RLAT, DR2, AREA)
    +
    564  IMPLICIT NONE
    +
    565 
    +
    566  REAL, INTENT(IN ) :: RLAT, DR2
    +
    567  REAL, INTENT( OUT) :: AREA
    +
    568 
    +
    569  REAL :: CLAT
    +
    570 
    +
    571  IF(dr2.LT.de2*1.e-6) THEN
    +
    572  area=rerth**2*abs(dxs)*abs(dys)*4/de2
    +
    573  ELSE
    +
    574  clat=cos(rlat/dpr)
    +
    575  area=rerth**2*clat**2*abs(dxs)*abs(dys)/dr2
    +
    576  ENDIF
    +
    577 
    +
    578  END SUBROUTINE polar_stereo_grid_area
    +
    579 
    +
    580 end module ip_polar_stereo_grid_mod
    +
    void gdswzd(int igdtnum, int *igdtmpl, int igdtlen, int iopt, int npts, float fill, float *xpts, float *ypts, float *rlon, float *rlat, int *nret, float *crot, float *srot, float *xlon, float *xlat, float *ylon, float *ylat, float *area)
    gdswzd() interface for C for _4 build of library.
    +
    Determine earth radius and shape.
    +
    Module containing common constants.
    +
    real, parameter pi2
    PI / 2.0.
    +
    real, parameter pi
    PI.
    +
    real, parameter pi4
    PI / 4.0.
    +
    real, parameter rerth_wgs84
    Radius of the Earth defined by WGS-84.
    +
    real, parameter dpr
    Radians to degrees.
    +
    real, parameter e2_wgs84
    Eccentricity squared of Earth defined by WGS-84.
    +
    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
    +
    Abstract ip_grid type.
    Definition: ip_grid_mod.F90:10
    +
    GDS wizard for polar stereographic azimuthal.
    +
    integer irot
    Local copy of irot.
    +
    subroutine polar_stereo_grid_area(RLAT, DR2, AREA)
    Grid box area for polar stereographic grids.
    +
    real rerth
    Radius of the Earth.
    +
    subroutine polar_stereo_map_jacob(RLON, RLAT, DR2, XLON, XLAT, YLON, YLAT)
    Map jacobians for polar stereographic grids.
    +
    subroutine init_grib2(self, g2_desc)
    Initializes a polar stereographic grid given a grib2_descriptor object.
    + + +
    subroutine init_grib1(self, g1_desc)
    Initializes a polar stereographic grid given a grib1_descriptor object.
    +
    real orient
    Local copy of orient.
    +
    subroutine polar_stereo_vect_rot(RLON, CROT, SROT)
    Vector rotation fields for polar stereographic grids.
    +
    real e2
    Eccentricity squared.
    + +
    subroutine gdswzd_polar_stereo(self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
    GDS wizard for polar stereographic azimuthal.
    + +
    Descriptor representing a grib1 grib descriptor section (GDS) with an integer array.
    +
    Abstract grid that holds fields and methods common to all grids.
    Definition: ip_grid_mod.F90:58
    + +
    +
    + + + + diff --git a/ver-5.1.0/ip__rot__equid__cylind__egrid__mod_8F90.html b/ver-5.1.0/ip__rot__equid__cylind__egrid__mod_8F90.html new file mode 100644 index 00000000..36d36f55 --- /dev/null +++ b/ver-5.1.0/ip__rot__equid__cylind__egrid__mod_8F90.html @@ -0,0 +1,193 @@ + + + + + + + +NCEPLIBS-ip: ip_rot_equid_cylind_egrid_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_rot_equid_cylind_egrid_mod.F90 File Reference
    +
    +
    + +

    Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grid E. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Data Types

    type  ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid
     
    + + + + +

    +Modules

    module  ip_rot_equid_cylind_egrid_mod
     Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grid E.
     
    + + + + + + + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine ip_rot_equid_cylind_egrid_mod::gdswzd_rot_equid_cylind_egrid (self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for rotated equidistant cylindrical grids. More...
     
    subroutine ip_rot_equid_cylind_egrid_mod::init_grib1 (self, g1_desc)
     Initializes a rotated equidistant cylindrical grid given a grib1_descriptor object. More...
     
    subroutine ip_rot_equid_cylind_egrid_mod::init_grib2 (self, g2_desc)
     Initializes a rotated equidistant cylindrical grid given a grib2_descriptor object. More...
     
    subroutine ip_rot_equid_cylind_egrid_mod::rot_equid_cylind_egrid_error (IOPT, FILL, RLAT, RLON, XPTS, YPTS, NPTS)
     Error handler. More...
     
    subroutine ip_rot_equid_cylind_egrid_mod::rot_equid_cylind_egrid_grid_area (FILL, AREA)
     Computes the grid box area for a rotated equidistant cylindrical grid. More...
     
    subroutine ip_rot_equid_cylind_egrid_mod::rot_equid_cylind_egrid_map_jacob (FILL, RLON, XLON, XLAT, YLON, YLAT)
     Computes the map jacobians for a rotated equidistant cylindrical grid. More...
     
    subroutine ip_rot_equid_cylind_egrid_mod::rot_equid_cylind_egrid_vect_rot (RLON, CROT, SROT)
     Computes the vector rotation sines and cosines for a rotated equidistant cylindrical grid. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Variables

    real(kind=kd) ip_rot_equid_cylind_egrid_mod::clat
     Cosine of the latitude. More...
     
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::clat0
     Local copy of clat0. More...
     
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::clatr
     Cosine of the rotated latitude. More...
     
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::clon
     Cosine of the difference between rlon and rlon0. More...
     
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::dlats
     Local copy of dlats. More...
     
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::dlons
     Local copy of dlons. More...
     
    integer ip_rot_equid_cylind_egrid_mod::irot
     Local copy of irot. More...
     
    integer, parameter ip_rot_equid_cylind_egrid_mod::kd = real64
     Kind of reals. More...
     
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::rerth
     Radius of the Earth. More...
     
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::rlon0
     Local copy of rlon0. More...
     
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::slat
     Sine of the latitude. More...
     
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::slat0
     Local copy of slat0. More...
     
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::slatr
     Sine of the rotated latitude. More...
     
    +

    Detailed Description

    +

    Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grid E.

    +
    Author
    Mark Iredell, George Gayno, Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition in file ip_rot_equid_cylind_egrid_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/ip__rot__equid__cylind__egrid__mod_8F90.js b/ver-5.1.0/ip__rot__equid__cylind__egrid__mod_8F90.js new file mode 100644 index 00000000..2854a1d9 --- /dev/null +++ b/ver-5.1.0/ip__rot__equid__cylind__egrid__mod_8F90.js @@ -0,0 +1,24 @@ +var ip__rot__equid__cylind__egrid__mod_8F90 = +[ + [ "ip_rot_equid_cylind_egrid", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid" ], + [ "gdswzd_rot_equid_cylind_egrid", "ip__rot__equid__cylind__egrid__mod_8F90.html#a9ad11a599fc0bdc4a9ece86a3b1cc399", null ], + [ "init_grib1", "ip__rot__equid__cylind__egrid__mod_8F90.html#aa65616b97df9c89893161ff802e16eab", null ], + [ "init_grib2", "ip__rot__equid__cylind__egrid__mod_8F90.html#af3cbc17f27800bc67135feacb2c1c3e0", null ], + [ "rot_equid_cylind_egrid_error", "ip__rot__equid__cylind__egrid__mod_8F90.html#a69d4e473a1a276b855d37518dc6f1d48", null ], + [ "rot_equid_cylind_egrid_grid_area", "ip__rot__equid__cylind__egrid__mod_8F90.html#a4e6c3a758f9a6474d3e499fabeac0640", null ], + [ "rot_equid_cylind_egrid_map_jacob", "ip__rot__equid__cylind__egrid__mod_8F90.html#a45b87f77888d428ca0f551edae8da94e", null ], + [ "rot_equid_cylind_egrid_vect_rot", "ip__rot__equid__cylind__egrid__mod_8F90.html#a9ac1f76f515981c464e8391d8c941888", null ], + [ "clat", "ip__rot__equid__cylind__egrid__mod_8F90.html#aac1018f3ca1b7ad4b5d33f245678d416", null ], + [ "clat0", "ip__rot__equid__cylind__egrid__mod_8F90.html#a83649d02b55d6252d59514aec4eb3142", null ], + [ "clatr", "ip__rot__equid__cylind__egrid__mod_8F90.html#aad4e673a94976b2b5a9bfad9de9e6e30", null ], + [ "clon", "ip__rot__equid__cylind__egrid__mod_8F90.html#a557d49c609fc8c5c564a3a5f10174eec", null ], + [ "dlats", "ip__rot__equid__cylind__egrid__mod_8F90.html#a0b2faca2325b413e1f3207778d4c4c68", null ], + [ "dlons", "ip__rot__equid__cylind__egrid__mod_8F90.html#af04f8a1044f4d9a7e0d13d38887adcbc", null ], + [ "irot", "ip__rot__equid__cylind__egrid__mod_8F90.html#a93ed996cf2dc9569e356256ec946b571", null ], + [ "kd", "ip__rot__equid__cylind__egrid__mod_8F90.html#a50497d277c347a2991b0e34e85f1787e", null ], + [ "rerth", "ip__rot__equid__cylind__egrid__mod_8F90.html#aed7a425f4d300fe14ac1b48d76378edb", null ], + [ "rlon0", "ip__rot__equid__cylind__egrid__mod_8F90.html#a134acf8ab7f40ff49ce8e03daad900e6", null ], + [ "slat", "ip__rot__equid__cylind__egrid__mod_8F90.html#ae1f8503816477fb685fbadc7a9e50f0b", null ], + [ "slat0", "ip__rot__equid__cylind__egrid__mod_8F90.html#a72199c827ab3218b7f2aba35ad30b94d", null ], + [ "slatr", "ip__rot__equid__cylind__egrid__mod_8F90.html#a4ccccb64d3e7236d8cac19c279aab900", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ip__rot__equid__cylind__egrid__mod_8F90_source.html b/ver-5.1.0/ip__rot__equid__cylind__egrid__mod_8F90_source.html new file mode 100644 index 00000000..2be3d5bb --- /dev/null +++ b/ver-5.1.0/ip__rot__equid__cylind__egrid__mod_8F90_source.html @@ -0,0 +1,588 @@ + + + + + + + +NCEPLIBS-ip: ip_rot_equid_cylind_egrid_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ip_rot_equid_cylind_egrid_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    7 
    + +
    25  use iso_fortran_env, only: real64
    + +
    27  use ip_grid_mod
    +
    28  use ip_constants_mod, only: dpr, pi
    + +
    30  implicit none
    +
    31 
    +
    32  private
    + +
    34 
    +
    35  integer, parameter :: kd = real64
    +
    36 
    + +
    38  real(kd) :: rlon0
    +
    39  real(kd) :: rlon1
    +
    40  real(kd) :: rlat1
    +
    41  real(kd) :: clat0
    +
    42  real(kd) :: slat0
    +
    43  real(kd) :: dlats
    +
    44  real(kd) :: dlons
    +
    45  real(kd) :: hi
    +
    49  integer :: irot
    +
    50  contains
    +
    53  procedure :: init_grib1
    +
    56  procedure :: init_grib2
    + + +
    61 
    +
    62  INTEGER :: irot
    +
    63 
    +
    64  REAL(kind=kd) :: clat
    +
    65  REAL(kind=kd) :: clat0
    +
    66  REAL(kind=kd) :: clatr
    +
    67  REAL(kind=kd) :: clon
    +
    68  REAL(kind=kd) :: dlats
    +
    69  REAL(kind=kd) :: dlons
    +
    70  REAL(kind=kd) :: rerth
    +
    71  REAL(kind=kd) :: rlon0
    +
    72  REAL(kind=kd) :: slat
    +
    73  REAL(kind=kd) :: slat0
    +
    74  REAL(kind=kd) :: slatr
    +
    75 
    +
    76 contains
    +
    77 
    +
    86  subroutine init_grib1(self, g1_desc)
    +
    87  class(ip_rot_equid_cylind_egrid), intent(inout) :: self
    +
    88  type(grib1_descriptor), intent(in) :: g1_desc
    +
    89 
    +
    90  integer :: iscan
    +
    91  real(kd) :: rlat0
    +
    92 
    +
    93  real(kd) :: rlat1, rlon1, rlon0, slat1, clat1, slat0, clat0, clon1
    +
    94  real(kd) :: slatr, clatr, clonr, rlatr, rlonr, dlats, dlons, hs, hi
    +
    95  integer :: im, jm
    +
    96 
    +
    97  integer :: is1, kscan, irot
    +
    98 
    +
    99  associate(kgds => g1_desc%gds)
    +
    100  self%rerth = 6.3712e6_kd
    +
    101  self%eccen_squared = 0.0
    +
    102 
    +
    103  im=kgds(2)
    +
    104  jm=kgds(3)
    +
    105 
    +
    106  self%nscan_field_pos = 3
    +
    107  self%nscan = mod(kgds(11)/32,2)
    +
    108 
    +
    109  rlat1=kgds(4)*1.e-3_kd
    +
    110  rlon1=kgds(5)*1.e-3_kd
    +
    111  rlat0=kgds(7)*1.e-3_kd
    +
    112  rlon0=kgds(8)*1.e-3_kd
    +
    113 
    +
    114  irot=mod(kgds(6)/8,2)
    +
    115  kscan=mod(kgds(11)/256,2)
    +
    116  iscan=mod(kgds(11)/128,2)
    +
    117  hi=(-1.)**iscan
    +
    118  slat1=sin(rlat1/dpr)
    +
    119  clat1=cos(rlat1/dpr)
    +
    120  slat0=sin(rlat0/dpr)
    +
    121  clat0=cos(rlat0/dpr)
    +
    122  hs=sign(1._kd,mod(rlon1-rlon0+180+3600,360._kd)-180)
    +
    123  clon1=cos((rlon1-rlon0)/dpr)
    +
    124  slatr=clat0*slat1-slat0*clat1*clon1
    +
    125  clatr=sqrt(1-slatr**2)
    +
    126  clonr=(clat0*clat1*clon1+slat0*slat1)/clatr
    +
    127  rlatr=dpr*asin(slatr)
    +
    128  rlonr=hs*dpr*acos(clonr)
    +
    129  dlats=rlatr/(-(jm-1)/2)
    +
    130  dlons=rlonr/(-((im * 2 - 1) -1)/2)
    +
    131 
    +
    132  IF(kscan.EQ.0) THEN
    +
    133  is1=(jm+1)/2
    +
    134  ELSE
    +
    135  is1=jm/2
    +
    136  ENDIF
    +
    137 
    +
    138  self%im = im
    +
    139  self%jm = jm
    +
    140  self%rlon0 = rlon0
    +
    141  self%rlon1 = rlon1
    +
    142  self%rlat1 = rlat1
    +
    143  self%clat0 = clat0
    +
    144  self%slat0 = slat0
    +
    145  self%dlats = dlats
    +
    146  self%dlons = dlons
    +
    147  self%hi = hi
    +
    148  self%irot = irot
    +
    149  self%kscan = kscan
    +
    150 
    +
    151 
    +
    152  end associate
    +
    153 
    +
    154  end subroutine init_grib1
    +
    155 
    +
    156 
    +
    163  subroutine init_grib2(self, g2_desc)
    +
    164  class(ip_rot_equid_cylind_egrid), intent(inout) :: self
    +
    165  type(grib2_descriptor), intent(in) :: g2_desc
    +
    166 
    +
    167  integer :: iscale, iscan
    +
    168  real(kd) :: rlat0
    +
    169  integer :: i_offset_odd!, i_offset_even
    +
    170 
    +
    171  associate(igdtmpl => g2_desc%gdt_tmpl, igdtlen => g2_desc%gdt_len)
    +
    172  CALL earth_radius(igdtmpl,igdtlen,self%rerth,self%eccen_squared)
    +
    173 
    +
    174  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    175  ! ROUTINE ONLY WORKS FOR "E"-STAGGER GRIDS.
    +
    176  ! "V" GRID WHEN BIT 5 IS '1' AND BIT 6 IS '0'.
    +
    177  ! "H" GRID WHEN BIT 5 IS '0' AND BIT 6 IS '1'.
    +
    178  ! I_OFFSET_ODD=MOD(IGDTMPL(19)/8,2)
    +
    179  ! I_OFFSET_EVEN=MOD(IGDTMPL(19)/4,2)
    +
    180  ! IF(I_OFFSET_ODD==I_OFFSET_EVEN) THEN
    +
    181  ! CALL ROT_EQUID_CYLIND_EGRID_ERROR(IOPT,FILL,RLAT,RLON,XPTS,YPTS,NPTS)
    +
    182  ! RETURN
    +
    183  ! ENDIF
    +
    184  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    185 
    +
    186  self%IM=igdtmpl(8)
    +
    187  self%JM=igdtmpl(9)
    +
    188 
    +
    189  self%NSCAN=mod(igdtmpl(16)/32,2)
    +
    190  self%nscan_field_pos = 3
    +
    191 
    +
    192  iscale=igdtmpl(10)*igdtmpl(11)
    +
    193  IF(iscale==0) iscale=10**6
    +
    194 
    +
    195  self%RLON0=float(igdtmpl(21))/float(iscale)
    +
    196  self%DLATS=float(igdtmpl(18))/float(iscale)
    +
    197  ! THE GRIB2 CONVENTION FOR "I" RESOLUTION IS TWICE WHAT THIS ROUTINE ASSUMES.
    +
    198  self%DLONS=float(igdtmpl(17))/float(iscale) * 0.5_kd
    +
    199 
    +
    200  self%IROT=mod(igdtmpl(14)/8,2)
    +
    201 
    +
    202  i_offset_odd=mod(igdtmpl(19)/8,2)
    +
    203  self%KSCAN=i_offset_odd
    +
    204  iscan=mod(igdtmpl(19)/128,2)
    +
    205 
    +
    206  self%HI=(-1.)**iscan
    +
    207 
    +
    208  rlat0=float(igdtmpl(20))/float(iscale)
    +
    209  rlat0=rlat0+90.0_kd
    +
    210 
    +
    211  self%SLAT0=sin(rlat0/dpr)
    +
    212  self%CLAT0=cos(rlat0/dpr)
    +
    213 
    +
    214  self%RLAT1=float(igdtmpl(12))/float(iscale)
    +
    215  self%RLON1=float(igdtmpl(13))/float(iscale)
    +
    216  end associate
    +
    217  end subroutine init_grib2
    +
    218 
    +
    219 
    +
    267  SUBROUTINE gdswzd_rot_equid_cylind_egrid(self,IOPT,NPTS,&
    +
    268  FILL,XPTS,YPTS,RLON,RLAT,NRET, &
    +
    269  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
    +
    270  IMPLICIT NONE
    +
    271  !
    +
    272  class(ip_rot_equid_cylind_egrid), intent(in) :: self
    +
    273 
    +
    274  INTEGER, INTENT(IN ) :: IOPT, NPTS
    +
    275  INTEGER, INTENT( OUT) :: NRET
    +
    276  !
    +
    277  REAL, INTENT(IN ) :: FILL
    +
    278  REAL, INTENT(INOUT) :: RLON(NPTS),RLAT(NPTS)
    +
    279  REAL, INTENT(INOUT) :: XPTS(NPTS),YPTS(NPTS)
    +
    280  REAL, OPTIONAL, INTENT( OUT) :: CROT(NPTS),SROT(NPTS)
    +
    281  REAL, OPTIONAL, INTENT( OUT) :: XLON(NPTS),XLAT(NPTS)
    +
    282  REAL, OPTIONAL, INTENT( OUT) :: YLON(NPTS),YLAT(NPTS),AREA(NPTS)
    +
    283  !
    +
    284  INTEGER :: IM, JM, IS1, N
    +
    285  INTEGER :: KSCAN
    +
    286  ! INTEGER :: I_OFFSET_ODD, I_OFFSET_EVEN
    +
    287  !
    +
    288  LOGICAL :: LROT, LMAP, LAREA
    +
    289  !
    +
    290  REAL(KIND=kd) :: rlat1, rlon1
    +
    291  REAL(KIND=kd) :: clonr
    +
    292  REAL(KIND=kd) :: rlatr, rlonr, sbd, wbd, hs, hi
    +
    293  REAL :: XMAX, XMIN, YMAX, YMIN, XPTF, YPTF
    +
    294  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    295  IF(PRESENT(crot)) crot=fill
    +
    296  IF(PRESENT(srot)) srot=fill
    +
    297  IF(PRESENT(xlon)) xlon=fill
    +
    298  IF(PRESENT(xlat)) xlat=fill
    +
    299  IF(PRESENT(ylon)) ylon=fill
    +
    300  IF(PRESENT(ylat)) ylat=fill
    +
    301  IF(PRESENT(area)) area=fill
    +
    302 
    +
    303  rlon0=self%rlon0
    +
    304  irot=self%irot
    +
    305  im=self%im * 2 - 1
    +
    306  jm=self%jm
    +
    307  dlats=self%dlats
    +
    308  dlons=self%dlons
    +
    309  kscan=self%kscan
    +
    310  hi=self%hi
    +
    311  slat0=self%slat0
    +
    312  clat0=self%clat0
    +
    313  rlat1=self%rlat1
    +
    314  rlon1=self%rlon1
    +
    315 
    +
    316  rerth = self%rerth
    +
    317 
    +
    318  ! IS THE EARTH RADIUS DEFINED?
    +
    319  IF(rerth<0.)THEN
    +
    320  CALL rot_equid_cylind_egrid_error(iopt,fill,rlat,rlon,xpts,ypts,npts)
    +
    321  RETURN
    +
    322  ENDIF
    +
    323 
    +
    324  sbd=rlat1
    +
    325  wbd=rlon1
    +
    326 
    +
    327  IF (wbd > 180.0) wbd = wbd - 360.0
    +
    328  IF(kscan.EQ.0) THEN
    +
    329  is1=(jm+1)/2
    +
    330  ELSE
    +
    331  is1=jm/2
    +
    332  ENDIF
    +
    333 
    +
    334  xmin=0
    +
    335  xmax=im+2
    +
    336  ymin=0
    +
    337  ymax=jm+1
    +
    338  nret=0
    +
    339 
    +
    340  IF(PRESENT(crot).AND.PRESENT(srot))THEN
    +
    341  lrot=.true.
    +
    342  ELSE
    +
    343  lrot=.false.
    +
    344  ENDIF
    +
    345  IF(PRESENT(xlon).AND.PRESENT(xlat).AND.PRESENT(ylon).AND.PRESENT(ylat))THEN
    +
    346  lmap=.true.
    +
    347  ELSE
    +
    348  lmap=.false.
    +
    349  ENDIF
    +
    350  IF(PRESENT(area))THEN
    +
    351  larea=.true.
    +
    352  ELSE
    +
    353  larea=.false.
    +
    354  ENDIF
    +
    355 
    +
    356  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    357  ! TRANSLATE GRID COORDINATES TO EARTH COORDINATES
    +
    358  IF(iopt.EQ.0.OR.iopt.EQ.1) THEN
    +
    359  DO n=1,npts
    +
    360  xptf=ypts(n)+(xpts(n)-is1)
    +
    361  yptf=ypts(n)-(xpts(n)-is1)+kscan
    +
    362  IF(xptf.GE.xmin.AND.xptf.LE.xmax.AND. &
    +
    363  yptf.GE.ymin.AND.yptf.LE.ymax) THEN
    +
    364  hs=hi*sign(1.,xptf-(im+1)/2)
    +
    365  select type(desc => self%descriptor)
    +
    366  type is(grib1_descriptor)
    +
    367  rlonr=(xptf-(im+1)/2)*dlons
    +
    368  rlatr=(yptf-(jm+1)/2)*dlats
    +
    369  type is(grib2_descriptor)
    +
    370  rlonr=(xptf-1.0_kd)*dlons + wbd
    +
    371  rlatr=(yptf-1.0_kd)*dlats + sbd
    +
    372  end select
    +
    373  clonr=cos(rlonr/dpr)
    +
    374  slatr=sin(rlatr/dpr)
    +
    375  clatr=cos(rlatr/dpr)
    +
    376  slat=clat0*slatr+slat0*clatr*clonr
    +
    377  IF(slat.LE.-1) THEN
    +
    378  clat=0.
    +
    379  clon=cos(rlon0/dpr)
    +
    380  rlon(n)=0
    +
    381  rlat(n)=-90
    +
    382  ELSEIF(slat.GE.1) THEN
    +
    383  clat=0.
    +
    384  clon=cos(rlon0/dpr)
    +
    385  rlon(n)=0
    +
    386  rlat(n)=90
    +
    387  ELSE
    +
    388  clat=sqrt(1-slat**2)
    +
    389  clon=(clat0*clatr*clonr-slat0*slatr)/clat
    +
    390  clon=min(max(clon,-1._kd),1._kd)
    +
    391  rlon(n)=real(mod(rlon0+hs*dpr*acos(clon)+3600,360._kd))
    +
    392  rlat(n)=real(dpr*asin(slat))
    +
    393  ENDIF
    +
    394  nret=nret+1
    +
    395  IF(lrot) CALL rot_equid_cylind_egrid_vect_rot(rlon(n),crot(n),srot(n))
    +
    396  IF(lmap) CALL rot_equid_cylind_egrid_map_jacob(fill, rlon(n), &
    +
    397  xlon(n),xlat(n),ylon(n),ylat(n))
    +
    398  IF(larea) CALL rot_equid_cylind_egrid_grid_area(fill, area(n))
    +
    399  ELSE
    +
    400  rlon(n)=fill
    +
    401  rlat(n)=fill
    +
    402  ENDIF
    +
    403  ENDDO
    +
    404  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    405  ! TRANSLATE EARTH COORDINATES TO GRID COORDINATES
    +
    406  ELSEIF(iopt.EQ.-1) THEN
    +
    407  DO n=1,npts
    +
    408  IF(abs(rlon(n)).LE.360.AND.abs(rlat(n)).LE.90) THEN
    +
    409  hs=sign(1._kd,mod(rlon(n)-rlon0+180+3600,360._kd)-180)
    +
    410  clon=cos((rlon(n)-rlon0)/dpr)
    +
    411  slat=sin(rlat(n)/dpr)
    +
    412  clat=cos(rlat(n)/dpr)
    + +
    414  IF(slatr.LE.-1) THEN
    +
    415  clatr=0.
    +
    416  rlonr=0
    +
    417  rlatr=-90
    +
    418  ELSEIF(slatr.GE.1) THEN
    +
    419  clatr=0.
    +
    420  rlonr=0
    +
    421  rlatr=90
    +
    422  ELSE
    +
    423  clatr=sqrt(1-slatr**2)
    +
    424  clonr=(clat0*clat*clon+slat0*slat)/clatr
    +
    425  clonr=min(max(clonr,-1._kd),1._kd)
    +
    426  rlonr=hs*dpr*acos(clonr)
    +
    427  rlatr=dpr*asin(slatr)
    +
    428  ENDIF
    +
    429  select type(desc => self%descriptor)
    +
    430  type is(grib1_descriptor)
    +
    431  xptf=real(((rlonr-wbd)/dlons)+1.0_kd)
    +
    432  yptf=real(((rlatr-sbd)/dlats)+1.0_kd)
    +
    433  type is(grib2_descriptor)
    +
    434  xptf=real((im+1)/2+rlonr/dlons)
    +
    435  yptf=real((jm+1)/2+rlatr/dlats)
    +
    436  end select
    +
    437 
    +
    438  IF(xptf.GE.xmin.AND.xptf.LE.xmax.AND. &
    +
    439  yptf.GE.ymin.AND.yptf.LE.ymax) THEN
    +
    440  xpts(n)=is1+(xptf-(yptf-kscan))/2
    +
    441  ypts(n)=(xptf+(yptf-kscan))/2
    +
    442  nret=nret+1
    +
    443  IF(lrot) CALL rot_equid_cylind_egrid_vect_rot(rlon(n),crot(n),srot(n))
    +
    444  IF(lmap) CALL rot_equid_cylind_egrid_map_jacob(fill, rlon(n), &
    +
    445  xlon(n),xlat(n),ylon(n),ylat(n))
    +
    446  IF(larea) CALL rot_equid_cylind_egrid_grid_area(fill, area(n))
    +
    447  ELSE
    +
    448  xpts(n)=fill
    +
    449  ypts(n)=fill
    +
    450  ENDIF
    +
    451  ELSE
    +
    452  xpts(n)=fill
    +
    453  ypts(n)=fill
    +
    454  ENDIF
    +
    455  ENDDO
    +
    456  ENDIF
    +
    457  END SUBROUTINE gdswzd_rot_equid_cylind_egrid
    +
    458 
    +
    482  SUBROUTINE rot_equid_cylind_egrid_error(IOPT,FILL,RLAT,RLON,XPTS,YPTS,NPTS)
    +
    483  IMPLICIT NONE
    +
    484  !
    +
    485  INTEGER, INTENT(IN ) :: IOPT, NPTS
    +
    486  !
    +
    487  REAL, INTENT(IN ) :: FILL
    +
    488  REAL, INTENT( OUT) :: RLAT(NPTS),RLON(NPTS)
    +
    489  REAL, INTENT( OUT) :: XPTS(NPTS),YPTS(NPTS)
    +
    490 
    +
    491  IF(iopt>=0) THEN
    +
    492  rlon=fill
    +
    493  rlat=fill
    +
    494  ENDIF
    +
    495  IF(iopt<=0) THEN
    +
    496  xpts=fill
    +
    497  ypts=fill
    +
    498  ENDIF
    +
    499  END SUBROUTINE rot_equid_cylind_egrid_error
    +
    500 
    +
    514  SUBROUTINE rot_equid_cylind_egrid_vect_rot(RLON, CROT, SROT)
    +
    515  IMPLICIT NONE
    +
    516 
    +
    517  REAL , INTENT(IN ) :: RLON
    +
    518  REAL , INTENT( OUT) :: CROT, SROT
    +
    519 
    +
    520  REAL(KIND=kd) :: slon
    +
    521 
    +
    522  IF(irot.EQ.1) THEN
    +
    523  IF(clatr.LE.0) THEN
    +
    524  crot=real(-sign(1._kd,slatr*slat0))
    +
    525  srot=0.
    +
    526  ELSE
    +
    527  slon=sin((rlon-rlon0)/dpr)
    +
    528  crot=real((clat0*clat+slat0*slat*clon)/clatr)
    +
    529  srot=real(slat0*slon/clatr)
    +
    530  ENDIF
    +
    531  ELSE
    +
    532  crot=1.
    +
    533  srot=0.
    +
    534  ENDIF
    +
    535 
    +
    536  END SUBROUTINE rot_equid_cylind_egrid_vect_rot
    +
    537 
    +
    549  SUBROUTINE rot_equid_cylind_egrid_map_jacob(FILL, RLON, &
    +
    550  XLON, XLAT, YLON, YLAT)
    +
    551  IMPLICIT NONE
    +
    552 
    +
    553  REAL , INTENT(IN ) :: FILL, RLON
    +
    554  REAL , INTENT( OUT) :: XLON, XLAT, YLON, YLAT
    +
    555 
    +
    556  REAL(KIND=kd) :: slon, term1, term2
    +
    557  REAL(KIND=kd) :: xlatf, xlonf, ylatf, ylonf
    +
    558 
    +
    559  IF(clatr.LE.0._kd) THEN
    +
    560  xlon=fill
    +
    561  xlat=fill
    +
    562  ylon=fill
    +
    563  ylat=fill
    +
    564  ELSE
    +
    565  slon=sin((rlon-rlon0)/dpr)
    +
    566  term1=(clat0*clat+slat0*slat*clon)/clatr
    +
    567  term2=slat0*slon/clatr
    +
    568  xlonf=term1*clat/(dlons*clatr)
    +
    569  xlatf=-term2/(dlons*clatr)
    +
    570  ylonf=term2*clat/dlats
    +
    571  ylatf=term1/dlats
    +
    572  xlon=real(xlonf-ylonf)
    +
    573  xlat=real(xlatf-ylatf)
    +
    574  ylon=real(xlonf+ylonf)
    +
    575  ylat=real(xlatf+ylatf)
    +
    576  ENDIF
    +
    577 
    +
    578  END SUBROUTINE rot_equid_cylind_egrid_map_jacob
    +
    579 
    +
    587  SUBROUTINE rot_equid_cylind_egrid_grid_area(FILL, AREA)
    +
    588  IMPLICIT NONE
    +
    589 
    +
    590  REAL, INTENT(IN ) :: FILL
    +
    591  REAL, INTENT( OUT) :: AREA
    +
    592 
    +
    593  IF(clatr.LE.0._kd) THEN
    +
    594  area=fill
    +
    595  ELSE
    +
    596  area=real(rerth**2*clatr*dlats*dlons)*2/dpr**2
    +
    597  ENDIF
    +
    598 
    +
    599  END SUBROUTINE rot_equid_cylind_egrid_grid_area
    +
    600 
    + +
    602 
    +
    603 
    +
    void gdswzd(int igdtnum, int *igdtmpl, int igdtlen, int iopt, int npts, float fill, float *xpts, float *ypts, float *rlon, float *rlat, int *nret, float *crot, float *srot, float *xlon, float *xlat, float *ylon, float *ylat, float *area)
    gdswzd() interface for C for _4 build of library.
    +
    Determine earth radius and shape.
    +
    Module containing common constants.
    +
    real, parameter pi
    PI.
    +
    real, parameter dpr
    Radians to degrees.
    +
    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
    +
    Abstract ip_grid type.
    Definition: ip_grid_mod.F90:10
    +
    Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grid E.
    +
    real(kind=kd) dlats
    Local copy of dlats.
    +
    real(kind=kd) rlon0
    Local copy of rlon0.
    +
    subroutine rot_equid_cylind_egrid_map_jacob(FILL, RLON, XLON, XLAT, YLON, YLAT)
    Computes the map jacobians for a rotated equidistant cylindrical grid.
    +
    real(kind=kd) slatr
    Sine of the rotated latitude.
    +
    subroutine rot_equid_cylind_egrid_grid_area(FILL, AREA)
    Computes the grid box area for a rotated equidistant cylindrical grid.
    +
    integer, parameter kd
    Kind of reals.
    +
    real(kind=kd) clon
    Cosine of the difference between rlon and rlon0.
    +
    subroutine rot_equid_cylind_egrid_error(IOPT, FILL, RLAT, RLON, XPTS, YPTS, NPTS)
    Error handler.
    +
    real(kind=kd) slat0
    Local copy of slat0.
    +
    real(kind=kd) clat0
    Local copy of clat0.
    + +
    subroutine rot_equid_cylind_egrid_vect_rot(RLON, CROT, SROT)
    Computes the vector rotation sines and cosines for a rotated equidistant cylindrical grid.
    +
    subroutine gdswzd_rot_equid_cylind_egrid(self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for rotated equidistant cylin...
    +
    subroutine init_grib1(self, g1_desc)
    Initializes a rotated equidistant cylindrical grid given a grib1_descriptor object.
    +
    real(kind=kd) clat
    Cosine of the latitude.
    +
    real(kind=kd) clatr
    Cosine of the rotated latitude.
    +
    real(kind=kd) slat
    Sine of the latitude.
    +
    real(kind=kd) rerth
    Radius of the Earth.
    +
    real(kind=kd) dlons
    Local copy of dlons.
    +
    subroutine init_grib2(self, g2_desc)
    Initializes a rotated equidistant cylindrical grid given a grib2_descriptor object.
    +
    Descriptor representing a grib1 grib descriptor section (GDS) with an integer array.
    +
    Abstract grid that holds fields and methods common to all grids.
    Definition: ip_grid_mod.F90:58
    + +
    +
    + + + + diff --git a/ver-5.1.0/ip__rot__equid__cylind__grid__mod_8F90.html b/ver-5.1.0/ip__rot__equid__cylind__grid__mod_8F90.html new file mode 100644 index 00000000..5d1349eb --- /dev/null +++ b/ver-5.1.0/ip__rot__equid__cylind__grid__mod_8F90.html @@ -0,0 +1,184 @@ + + + + + + + +NCEPLIBS-ip: ip_rot_equid_cylind_grid_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_rot_equid_cylind_grid_mod.F90 File Reference
    +
    +
    + +

    Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grids A through D. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Data Types

    type  ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid
     
    + + + + +

    +Modules

    module  ip_rot_equid_cylind_grid_mod
     Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grids A through D.
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine ip_rot_equid_cylind_grid_mod::gdswzd_rot_equid_cylind (self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     GDS wizard for rotated equidistant cylindrical. More...
     
    subroutine ip_rot_equid_cylind_grid_mod::init_grib1 (self, g1_desc)
     Initializes a Rotated equidistant cylindrical grid given a grib1_descriptor object. More...
     
    subroutine ip_rot_equid_cylind_grid_mod::init_grib2 (self, g2_desc)
     Initializes a Rotated equidistant cylindrical grid given a grib2_descriptor object. More...
     
    subroutine ip_rot_equid_cylind_grid_mod::init_grib2_default (self, g2_desc)
     Initializes a Rotated equidistant cylindrical grid given a grib2_descriptor object. More...
     
    subroutine ip_rot_equid_cylind_grid_mod::init_grib2_ncep_post (self, g2_desc)
     Initializes a Rotated equidistant cylindrical grid given a grib2_descriptor object. More...
     
    subroutine ip_rot_equid_cylind_grid_mod::rot_equid_cylind_error (IOPT, FILL, RLAT, RLON, XPTS, YPTS, NPTS)
     Error handler. More...
     
    subroutine ip_rot_equid_cylind_grid_mod::rot_equid_cylind_grid_area (CLATR, FILL, AREA)
     Grid box area for rotated equidistant cylindrical grids - non "e" stagger. More...
     
    subroutine ip_rot_equid_cylind_grid_mod::rot_equid_cylind_map_jacob (FILL, RLON, CLATR, CLAT, SLAT, CLON, XLON, XLAT, YLON, YLAT)
     Map jacobians for rotated equidistant cylindrical grids - non "e" stagger. More...
     
    subroutine ip_rot_equid_cylind_grid_mod::rot_equid_cylind_vect_rot (RLON, CLATR, SLATR, CLAT, SLAT, CLON, CROT, SROT)
     Vector rotation fields for rotated equidistant cylindrical grids - non "e" stagger. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Variables

    real(kind=kd) ip_rot_equid_cylind_grid_mod::clat0
     Local copy of clat0. More...
     
    real(kind=kd) ip_rot_equid_cylind_grid_mod::dlats
     Local copy of dlats. More...
     
    real(kind=kd) ip_rot_equid_cylind_grid_mod::dlons
     Local copy of dlons. More...
     
    integer ip_rot_equid_cylind_grid_mod::irot
     Local copy of irot. More...
     
    integer, parameter ip_rot_equid_cylind_grid_mod::kd = real64
     Fortran kind for reals. More...
     
    real(kind=kd) ip_rot_equid_cylind_grid_mod::rerth
     Radius of the Earth. More...
     
    real(kind=kd) ip_rot_equid_cylind_grid_mod::rlon0
     Local copy of rlon0. More...
     
    real(kind=kd) ip_rot_equid_cylind_grid_mod::slat0
     Local copy of slat0. More...
     
    +

    Detailed Description

    +

    Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grids A through D.

    +
    Author
    Mark Iredell, George Gayno, Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition in file ip_rot_equid_cylind_grid_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/ip__rot__equid__cylind__grid__mod_8F90.js b/ver-5.1.0/ip__rot__equid__cylind__grid__mod_8F90.js new file mode 100644 index 00000000..560c3a93 --- /dev/null +++ b/ver-5.1.0/ip__rot__equid__cylind__grid__mod_8F90.js @@ -0,0 +1,21 @@ +var ip__rot__equid__cylind__grid__mod_8F90 = +[ + [ "ip_rot_equid_cylind_grid", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid" ], + [ "gdswzd_rot_equid_cylind", "ip__rot__equid__cylind__grid__mod_8F90.html#a55c153201e15205d3f75e4ffb717cc0b", null ], + [ "init_grib1", "ip__rot__equid__cylind__grid__mod_8F90.html#acb27dfdc6f03dea897d509910365afee", null ], + [ "init_grib2", "ip__rot__equid__cylind__grid__mod_8F90.html#add3c6c1dad5748b452d291df6619867d", null ], + [ "init_grib2_default", "ip__rot__equid__cylind__grid__mod_8F90.html#a9ade5de892a935c3b62c1860b719ce74", null ], + [ "init_grib2_ncep_post", "ip__rot__equid__cylind__grid__mod_8F90.html#a74abf723e815f9ff196e6d0174fd449b", null ], + [ "rot_equid_cylind_error", "ip__rot__equid__cylind__grid__mod_8F90.html#a1cc09c83f9a3815d8c5f8ed2f239f53f", null ], + [ "rot_equid_cylind_grid_area", "ip__rot__equid__cylind__grid__mod_8F90.html#ad8f1133eb6809705c15337134eafe9fd", null ], + [ "rot_equid_cylind_map_jacob", "ip__rot__equid__cylind__grid__mod_8F90.html#a985f1dc1a20444cef706d4bb20e0841b", null ], + [ "rot_equid_cylind_vect_rot", "ip__rot__equid__cylind__grid__mod_8F90.html#a3de472bfc18740a7d985f560f3541c10", null ], + [ "clat0", "ip__rot__equid__cylind__grid__mod_8F90.html#afeb699d0eaa8d157277e93fe8e8c5852", null ], + [ "dlats", "ip__rot__equid__cylind__grid__mod_8F90.html#ab43075e39d4e2dde4110e608931a392d", null ], + [ "dlons", "ip__rot__equid__cylind__grid__mod_8F90.html#aa0cf7bb2dd8be1239ae38c7220d29702", null ], + [ "irot", "ip__rot__equid__cylind__grid__mod_8F90.html#abb0c2acdbd71f0c07ffaf9db54ce06c1", null ], + [ "kd", "ip__rot__equid__cylind__grid__mod_8F90.html#af5dea0592cccce2de1c5c6a92d42cfd6", null ], + [ "rerth", "ip__rot__equid__cylind__grid__mod_8F90.html#ae08318392106d174ab36cf7dc05c570b", null ], + [ "rlon0", "ip__rot__equid__cylind__grid__mod_8F90.html#a620a55069afd33b301240533915387df", null ], + [ "slat0", "ip__rot__equid__cylind__grid__mod_8F90.html#a64831f92d5306513987a98e97a32aea1", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ip__rot__equid__cylind__grid__mod_8F90_source.html b/ver-5.1.0/ip__rot__equid__cylind__grid__mod_8F90_source.html new file mode 100644 index 00000000..efa50e96 --- /dev/null +++ b/ver-5.1.0/ip__rot__equid__cylind__grid__mod_8F90_source.html @@ -0,0 +1,651 @@ + + + + + + + +NCEPLIBS-ip: ip_rot_equid_cylind_grid_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ip_rot_equid_cylind_grid_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    7 
    + +
    20  use iso_fortran_env, only: real64
    + +
    22  use ip_grid_mod
    +
    23  use ip_constants_mod, only: dpr, pi
    + +
    25  implicit none
    +
    26 
    +
    27  private
    +
    28  public :: ip_rot_equid_cylind_grid
    +
    29 
    +
    30  integer, parameter :: kd = real64
    +
    31 
    + +
    33  real(kd) :: clat0
    +
    34  real(kd) :: dlats
    +
    35  real(kd) :: dlons
    +
    36  real(kd) :: rlon0
    +
    37  real(kd) :: slat0
    +
    38  real(kd) :: wbd
    +
    39  real(kd) :: sbd
    +
    43  integer :: irot
    +
    44  contains
    +
    47  procedure :: init_grib1
    +
    50  procedure :: init_grib2
    + + +
    55 
    +
    56  INTEGER :: irot
    +
    57  REAL(kind=kd) :: rerth
    +
    58  REAL(kind=kd) :: clat0
    +
    59  REAL(kind=kd) :: dlats
    +
    60  REAL(kind=kd) :: dlons
    +
    61  REAL(kind=kd) :: rlon0
    +
    62  REAL(kind=kd) :: slat0
    +
    63 
    +
    64 CONTAINS
    +
    65 
    +
    73  subroutine init_grib1(self, g1_desc)
    +
    74  class(ip_rot_equid_cylind_grid), intent(inout) :: self
    +
    75  type(grib1_descriptor), intent(in) :: g1_desc
    +
    76 
    +
    77  real(kd) :: rlat1, rlon1, rlat0, rlat2, rlon2, nbd, ebd
    +
    78  real(kd) :: hs, hs2, slat1, slat2, slatr, clon1, clon2, clat1, clat2, clatr, clonr, rlonr, rlatr
    +
    79 
    +
    80  associate(kgds => g1_desc%gds)
    +
    81  self%rerth = 6.3712e6_kd
    +
    82  self%eccen_squared = 0d0
    +
    83 
    +
    84  rlat1=kgds(4)*1.e-3_kd
    +
    85  rlon1=kgds(5)*1.e-3_kd
    +
    86  rlat0=kgds(7)*1.e-3_kd
    +
    87  self%RLON0=kgds(8)*1.e-3_kd
    +
    88  rlat2=kgds(12)*1.e-3_kd
    +
    89  rlon2=kgds(13)*1.e-3_kd
    +
    90 
    +
    91  self%IROT=mod(kgds(6)/8,2)
    +
    92  self%IM=kgds(2)
    +
    93  self%JM=kgds(3)
    +
    94 
    +
    95  slat1=sin(rlat1/dpr)
    +
    96  clat1=cos(rlat1/dpr)
    +
    97  self%SLAT0=sin(rlat0/dpr)
    +
    98  self%CLAT0=cos(rlat0/dpr)
    +
    99 
    +
    100  hs=sign(1._kd,mod(rlon1-self%RLON0+180+3600,360._kd)-180)
    +
    101  clon1=cos((rlon1-self%RLON0)/dpr)
    +
    102  slatr=self%CLAT0*slat1-self%SLAT0*clat1*clon1
    +
    103  clatr=sqrt(1-slatr**2)
    +
    104  clonr=(self%CLAT0*clat1*clon1+self%SLAT0*slat1)/clatr
    +
    105  rlatr=dpr*asin(slatr)
    +
    106  rlonr=hs*dpr*acos(clonr)
    +
    107 
    +
    108  self%WBD=rlonr
    +
    109  self%SBD=rlatr
    +
    110  slat2=sin(rlat2/dpr)
    +
    111  clat2=cos(rlat2/dpr)
    +
    112  hs2=sign(1._kd,mod(rlon2-self%RLON0+180+3600,360._kd)-180)
    +
    113  clon2=cos((rlon2-self%RLON0)/dpr)
    +
    114  slatr=self%CLAT0*slat2-self%SLAT0*clat2*clon2
    +
    115  clatr=sqrt(1-slatr**2)
    +
    116  clonr=(self%CLAT0*clat2*clon2+self%SLAT0*slat2)/clatr
    +
    117  nbd=dpr*asin(slatr)
    +
    118  ebd=hs2*dpr*acos(clonr)
    +
    119  self%DLATS=(nbd-self%SBD)/float(self%JM-1)
    +
    120  self%DLONS=(ebd-self%WBD)/float(self%IM-1)
    +
    121 
    +
    122  self%iwrap = 0
    +
    123  self%jwrap1 = 0
    +
    124  self%jwrap2 = 0
    +
    125  self%nscan = mod(kgds(11) / 32, 2)
    +
    126  self%nscan_field_pos = self%nscan
    +
    127  self%kscan = 0
    +
    128  end associate
    +
    129 
    +
    130  end subroutine init_grib1
    +
    131 
    +
    140  subroutine init_grib2(self, g2_desc)
    +
    141  class(ip_rot_equid_cylind_grid), intent(inout) :: self
    +
    142  type(grib2_descriptor), intent(in) :: g2_desc
    +
    143 
    +
    144  if (ncep_post_arakawa.and.(g2_desc%gdt_num.eq.32769)) then
    +
    145  call init_grib2_ncep_post(self, g2_desc)
    +
    146  else
    +
    147  call init_grib2_default(self, g2_desc)
    +
    148  endif
    +
    149 
    +
    150  end subroutine init_grib2
    +
    151 
    +
    160  subroutine init_grib2_default(self, g2_desc)
    +
    161  class(ip_rot_equid_cylind_grid), intent(inout) :: self
    +
    162  type(grib2_descriptor), intent(in) :: g2_desc
    +
    163 
    +
    164  real(kd) :: rlat1, rlon1, rlat0, rlat2, rlon2, nbd, ebd
    +
    165  integer :: iscale
    +
    166  integer :: i_offset_odd, i_offset_even, j_offset
    +
    167 
    +
    168  associate(igdtmpl => g2_desc%gdt_tmpl, igdtlen => g2_desc%gdt_len)
    +
    169 
    +
    170  CALL earth_radius(igdtmpl,igdtlen,self%rerth,self%eccen_squared)
    +
    171 
    +
    172  i_offset_odd=mod(igdtmpl(19)/8,2)
    +
    173  i_offset_even=mod(igdtmpl(19)/4,2)
    +
    174  j_offset=mod(igdtmpl(19)/2,2)
    +
    175 
    +
    176  iscale=igdtmpl(10)*igdtmpl(11)
    +
    177  IF(iscale==0) iscale=10**6
    +
    178 
    +
    179  rlat1=float(igdtmpl(12))/float(iscale)
    +
    180  rlon1=float(igdtmpl(13))/float(iscale)
    +
    181  rlat0=float(igdtmpl(20))/float(iscale)
    +
    182  rlat0=rlat0+90.0_kd
    +
    183 
    +
    184  self%RLON0=float(igdtmpl(21))/float(iscale)
    +
    185 
    +
    186  rlat2=float(igdtmpl(15))/float(iscale)
    +
    187  rlon2=float(igdtmpl(16))/float(iscale)
    +
    188 
    +
    189  self%IROT=mod(igdtmpl(14)/8,2)
    +
    190  self%IM=igdtmpl(8)
    +
    191  self%JM=igdtmpl(9)
    +
    192 
    +
    193  self%SLAT0=sin(rlat0/dpr)
    +
    194  self%CLAT0=cos(rlat0/dpr)
    +
    195 
    +
    196  self%WBD=rlon1
    +
    197  IF (self%WBD > 180.0) self%WBD = self%WBD - 360.0
    +
    198  self%SBD=rlat1
    +
    199 
    +
    200  nbd=rlat2
    +
    201  ebd=rlon2
    +
    202 
    +
    203  self%DLATS=(nbd-self%SBD)/float(self%JM-1)
    +
    204  self%DLONS=(ebd-self%WBD)/float(self%IM-1)
    +
    205 
    +
    206  IF(i_offset_odd==1) self%WBD=self%WBD+(0.5_kd*self%DLONS)
    +
    207  IF(j_offset==1) self%SBD=self%SBD+(0.5_kd*self%DLATS)
    +
    208 
    +
    209  self%iwrap = 0
    +
    210  self%jwrap1 = 0
    +
    211  self%jwrap2 = 0
    +
    212  self%kscan = 0
    +
    213  self%nscan = mod(igdtmpl(19) / 32, 2)
    +
    214  self%nscan_field_pos = self%nscan
    +
    215  end associate
    +
    216  end subroutine init_grib2_default
    +
    217 
    +
    227  subroutine init_grib2_ncep_post(self, g2_desc)
    +
    228  class(ip_rot_equid_cylind_grid), intent(inout) :: self
    +
    229  type(grib2_descriptor), intent(in) :: g2_desc
    +
    230 
    +
    231  real(kd) :: rlat1, rlon1, rlat0, rlat2, rlon2, nbd, ebd
    +
    232  integer :: iscale
    +
    233  integer :: i_offset_odd, i_offset_even, j_offset
    +
    234  real(kd) :: hs, hs2, slat1, slat2, slatr, clon1, clon2, clat1, clat2, clatr, clonr, rlonr, rlatr
    +
    235 
    +
    236  associate(igdtmpl => g2_desc%gdt_tmpl, igdtlen => g2_desc%gdt_len)
    +
    237 
    +
    238  CALL earth_radius(igdtmpl,igdtlen,self%rerth,self%eccen_squared)
    +
    239 
    +
    240  i_offset_odd=mod(igdtmpl(19)/8,2)
    +
    241  i_offset_even=mod(igdtmpl(19)/4,2)
    +
    242  j_offset=mod(igdtmpl(19)/2,2)
    +
    243 
    +
    244  iscale=igdtmpl(10)*igdtmpl(11)
    +
    245  IF(iscale==0) iscale=10**6
    +
    246 
    +
    247  rlat1=float(igdtmpl(12))/float(iscale)
    +
    248  rlon1=float(igdtmpl(13))/float(iscale)
    +
    249  rlat0=float(igdtmpl(15))/float(iscale)
    +
    250 
    +
    251  self%RLON0=float(igdtmpl(16))/float(iscale)
    +
    252 
    +
    253  rlat2=float(igdtmpl(20))/float(iscale)
    +
    254  rlon2=float(igdtmpl(21))/float(iscale)
    +
    255 
    +
    256  self%IROT=mod(igdtmpl(14)/8,2)
    +
    257  self%IM=igdtmpl(8)
    +
    258  self%JM=igdtmpl(9)
    +
    259 
    +
    260  slat1=sin(rlat1/dpr)
    +
    261  clat1=cos(rlat1/dpr)
    +
    262 
    +
    263  self%SLAT0=sin(rlat0/dpr)
    +
    264  self%CLAT0=cos(rlat0/dpr)
    +
    265 
    +
    266  hs=sign(1._kd,mod(rlon1-self%RLON0+180+3600,360._kd)-180)
    +
    267 
    +
    268  clon1=cos((rlon1-self%RLON0)/dpr)
    +
    269  slatr=self%CLAT0*slat1-self%SLAT0*clat1*clon1
    +
    270  clatr=sqrt(1-slatr**2)
    +
    271  clonr=(self%CLAT0*clat1*clon1+self%SLAT0*slat1)/clatr
    +
    272  rlatr=dpr*asin(slatr)
    +
    273  rlonr=hs*dpr*acos(clonr)
    +
    274 
    +
    275  self%WBD=rlonr
    +
    276  IF (self%WBD > 180.0) self%WBD = self%WBD - 360.0
    +
    277  self%SBD=rlatr
    +
    278 
    +
    279  slat2=sin(rlat2/dpr)
    +
    280  clat2=cos(rlat2/dpr)
    +
    281  hs2=sign(1._kd,mod(rlon2-self%RLON0+180+3600,360._kd)-180)
    +
    282  clon2=cos((rlon2-self%RLON0)/dpr)
    +
    283  slatr=self%CLAT0*slat2-self%SLAT0*clat2*clon2
    +
    284  clatr=sqrt(1-slatr**2)
    +
    285  clonr=(self%CLAT0*clat2*clon2+self%SLAT0*slat2)/clatr
    +
    286  nbd=dpr*asin(slatr)
    +
    287  ebd=hs2*dpr*acos(clonr)
    +
    288  self%DLATS=(nbd-self%SBD)/float(self%JM-1)
    +
    289  self%DLONS=(ebd-self%WBD)/float(self%IM-1)
    +
    290 
    +
    291  IF(i_offset_odd==1) self%WBD=self%WBD+(0.5_kd*self%DLONS)
    +
    292  IF(j_offset==1) self%SBD=self%SBD+(0.5_kd*self%DLATS)
    +
    293 
    +
    294  self%iwrap = 0
    +
    295  self%jwrap1 = 0
    +
    296  self%jwrap2 = 0
    +
    297  self%kscan = 0
    +
    298  self%nscan = mod(igdtmpl(19) / 32, 2)
    +
    299  self%nscan_field_pos = self%nscan
    +
    300  end associate
    +
    301  end subroutine init_grib2_ncep_post
    +
    302 
    +
    362  SUBROUTINE gdswzd_rot_equid_cylind(self,IOPT,NPTS, &
    +
    363  FILL,XPTS,YPTS,RLON,RLAT,NRET, &
    +
    364  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
    +
    365  IMPLICIT NONE
    +
    366 
    +
    367  class(ip_rot_equid_cylind_grid), intent(in) :: self
    +
    368  INTEGER, INTENT(IN ) :: IOPT, NPTS
    +
    369  INTEGER, INTENT( OUT) :: NRET
    +
    370  !
    +
    371  REAL, INTENT(IN ) :: FILL
    +
    372  REAL, INTENT(INOUT) :: RLON(NPTS),RLAT(NPTS)
    +
    373  REAL, INTENT(INOUT) :: XPTS(NPTS),YPTS(NPTS)
    +
    374  REAL, OPTIONAL, INTENT( OUT) :: CROT(NPTS),SROT(NPTS)
    +
    375  REAL, OPTIONAL, INTENT( OUT) :: XLON(NPTS),XLAT(NPTS)
    +
    376  REAL, OPTIONAL, INTENT( OUT) :: YLON(NPTS),YLAT(NPTS),AREA(NPTS)
    +
    377  !
    +
    378  INTEGER :: IM,JM,N
    +
    379  !
    +
    380  LOGICAL :: LROT, LMAP, LAREA
    +
    381  !
    +
    382  REAL(KIND=kd) :: hs
    +
    383  REAL(KIND=kd) :: clonr,clatr,slatr
    +
    384  REAL(KIND=kd) :: clat,slat,clon
    +
    385  REAL(KIND=kd) :: rlatr,rlonr
    +
    386  REAL(KIND=kd) :: wbd,sbd
    +
    387  REAL :: XMIN,XMAX,YMIN,YMAX
    +
    388  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    389  IF(PRESENT(crot)) crot=fill
    +
    390  IF(PRESENT(srot)) srot=fill
    +
    391  IF(PRESENT(xlon)) xlon=fill
    +
    392  IF(PRESENT(xlat)) xlat=fill
    +
    393  IF(PRESENT(ylon)) ylon=fill
    +
    394  IF(PRESENT(ylat)) ylat=fill
    +
    395  IF(PRESENT(area)) area=fill
    +
    396  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    397  ! IS THE EARTH RADIUS DEFINED?
    +
    398  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    399  ! IS THIS AN "E"-STAGGER GRID? ROUTINE CAN'T PROCESS THOSE.
    +
    400  ! I_OFFSET_ODD=MOD(IGDTMPL(19)/8,2)
    +
    401  ! I_OFFSET_EVEN=MOD(IGDTMPL(19)/4,2)
    +
    402  ! J_OFFSET=MOD(IGDTMPL(19)/2,2)
    +
    403  ! IF(I_OFFSET_ODD/=I_OFFSET_EVEN) THEN
    +
    404  ! CALL ROT_EQUID_CYLIND_ERROR(IOPT,FILL,RLAT,RLON,XPTS,YPTS,NPTS)
    +
    405  ! RETURN
    +
    406  ! ENDIF
    +
    407  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    408 
    +
    409 
    +
    410  rlon0=self%rlon0
    +
    411  irot=self%irot
    +
    412 
    +
    413  im=self%im
    +
    414  jm=self%jm
    +
    415 
    +
    416  slat0=self%slat0
    +
    417  clat0=self%clat0
    +
    418 
    +
    419  wbd=self%wbd
    +
    420  sbd=self%sbd
    +
    421 
    +
    422  dlats=self%dlats
    +
    423  dlons=self%dlons
    +
    424 
    +
    425  xmin=0
    +
    426  xmax=im+1
    +
    427  ymin=0
    +
    428  ymax=jm+1
    +
    429  nret=0
    +
    430 
    +
    431  rerth = self%rerth
    +
    432  IF(rerth<0.)THEN
    +
    433  CALL rot_equid_cylind_error(iopt,fill,rlat,rlon,xpts,ypts,npts)
    +
    434  RETURN
    +
    435  ENDIF
    +
    436 
    +
    437  IF(PRESENT(crot).AND.PRESENT(srot))THEN
    +
    438  lrot=.true.
    +
    439  ELSE
    +
    440  lrot=.false.
    +
    441  ENDIF
    +
    442  IF(PRESENT(xlon).AND.PRESENT(xlat).AND.PRESENT(ylon).AND.PRESENT(ylat))THEN
    +
    443  lmap=.true.
    +
    444  ELSE
    +
    445  lmap=.false.
    +
    446  ENDIF
    +
    447  IF(PRESENT(area))THEN
    +
    448  larea=.true.
    +
    449  ELSE
    +
    450  larea=.false.
    +
    451  ENDIF
    +
    452  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    453  ! TRANSLATE GRID COORDINATES TO EARTH COORDINATES
    +
    454  IF(iopt.EQ.0.OR.iopt.EQ.1) THEN
    +
    455  !$OMP PARALLEL DO PRIVATE(N,RLONR,RLATR,HS,CLONR,SLATR,CLATR,SLAT,CLAT,CLON) &
    +
    456  !$OMP& REDUCTION(+:NRET) SCHEDULE(STATIC)
    +
    457  DO n=1,npts
    +
    458  IF(xpts(n).GE.xmin.AND.xpts(n).LE.xmax.AND. &
    +
    459  ypts(n).GE.ymin.AND.ypts(n).LE.ymax) THEN
    +
    460  rlonr=wbd+(xpts(n)-1._kd)*dlons
    +
    461  rlatr=sbd+(ypts(n)-1._kd)*dlats
    +
    462  IF(rlonr <= 0._kd) THEN
    +
    463  hs=-1.0_kd
    +
    464  ELSE
    +
    465  hs=1.0_kd
    +
    466  ENDIF
    +
    467  clonr=cos(rlonr/dpr)
    +
    468  slatr=sin(rlatr/dpr)
    +
    469  clatr=cos(rlatr/dpr)
    +
    470  slat=clat0*slatr+slat0*clatr*clonr
    +
    471  IF(slat.LE.-1) THEN
    +
    472  clat=0.
    +
    473  clon=cos(rlon0/dpr)
    +
    474  rlon(n)=0.
    +
    475  rlat(n)=-90.
    +
    476  ELSEIF(slat.GE.1) THEN
    +
    477  clat=0.
    +
    478  clon=cos(rlon0/dpr)
    +
    479  rlon(n)=0.
    +
    480  rlat(n)=90.
    +
    481  ELSE
    +
    482  clat=sqrt(1-slat**2)
    +
    483  clon=(clat0*clatr*clonr-slat0*slatr)/clat
    +
    484  clon=min(max(clon,-1._kd),1._kd)
    +
    485  rlon(n)=real(mod(rlon0+hs*dpr*acos(clon)+3600,360._kd))
    +
    486  rlat(n)=real(dpr*asin(slat))
    +
    487  ENDIF
    +
    488  nret=nret+1
    +
    489  IF(lrot) CALL rot_equid_cylind_vect_rot(rlon(n), clatr, slatr, &
    +
    490  clat, slat, clon, crot(n), srot(n))
    +
    491  IF(lmap) CALL rot_equid_cylind_map_jacob(fill, rlon(n), clatr, &
    +
    492  clat, slat, clon, xlon(n), xlat(n), ylon(n), ylat(n))
    +
    493  IF(larea) CALL rot_equid_cylind_grid_area(clatr, fill, area(n))
    +
    494  ELSE
    +
    495  rlon(n)=fill
    +
    496  rlat(n)=fill
    +
    497  ENDIF
    +
    498  ENDDO
    +
    499  !$OMP END PARALLEL DO
    +
    500  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    501  ! TRANSLATE EARTH COORDINATES TO GRID COORDINATES
    +
    502  ELSEIF(iopt.EQ.-1) THEN
    +
    503  !$OMP PARALLEL DO PRIVATE(N,HS,CLON,SLAT,CLAT,SLATR,CLATR,CLONR,RLONR,RLATR) &
    +
    504  !$OMP& REDUCTION(+:NRET) SCHEDULE(STATIC)
    +
    505  DO n=1,npts
    +
    506  IF(abs(rlon(n)).LE.360.AND.abs(rlat(n)).LE.90) THEN
    +
    507  hs=sign(1._kd,mod(rlon(n)-rlon0+180+3600,360._kd)-180)
    +
    508  clon=cos((rlon(n)-rlon0)/dpr)
    +
    509  slat=sin(rlat(n)/dpr)
    +
    510  clat=cos(rlat(n)/dpr)
    +
    511  slatr=clat0*slat-slat0*clat*clon
    +
    512  IF(slatr.LE.-1) THEN
    +
    513  clatr=0._kd
    +
    514  rlonr=0.
    +
    515  rlatr=-90.
    +
    516  ELSEIF(slatr.GE.1) THEN
    +
    517  clatr=0._kd
    +
    518  rlonr=0.
    +
    519  rlatr=90.
    +
    520  ELSE
    +
    521  clatr=sqrt(1-slatr**2)
    +
    522  clonr=(clat0*clat*clon+slat0*slat)/clatr
    +
    523  clonr=min(max(clonr,-1._kd),1._kd)
    +
    524  rlonr=hs*dpr*acos(clonr)
    +
    525  rlatr=dpr*asin(slatr)
    +
    526  ENDIF
    +
    527  xpts(n)=real((rlonr-wbd)/dlons+1._kd)
    +
    528  ypts(n)=real((rlatr-sbd)/dlats+1._kd)
    +
    529  IF(xpts(n).GE.xmin.AND.xpts(n).LE.xmax.AND. &
    +
    530  ypts(n).GE.ymin.AND.ypts(n).LE.ymax) THEN
    +
    531  nret=nret+1
    +
    532  IF(lrot) CALL rot_equid_cylind_vect_rot(rlon(n), clatr, slatr, &
    +
    533  clat, slat, clon, crot(n), srot(n))
    +
    534  IF(lmap) CALL rot_equid_cylind_map_jacob(fill, rlon(n), clatr, &
    +
    535  clat, slat, clon, xlon(n), xlat(n), ylon(n), ylat(n))
    +
    536  IF(larea) CALL rot_equid_cylind_grid_area(clatr, fill, area(n))
    +
    537  ELSE
    +
    538  xpts(n)=fill
    +
    539  ypts(n)=fill
    +
    540  ENDIF
    +
    541  ELSE
    +
    542  xpts(n)=fill
    +
    543  ypts(n)=fill
    +
    544  ENDIF
    +
    545  ENDDO
    +
    546  !$OMP END PARALLEL DO
    +
    547  ENDIF
    +
    548  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    549  END SUBROUTINE gdswzd_rot_equid_cylind
    +
    550 
    +
    568  SUBROUTINE rot_equid_cylind_error(IOPT,FILL,RLAT,RLON,XPTS,YPTS,NPTS)
    +
    569  IMPLICIT NONE
    +
    570  !
    +
    571  INTEGER, INTENT(IN ) :: IOPT, NPTS
    +
    572  !
    +
    573  REAL, INTENT(IN ) :: FILL
    +
    574  REAL, INTENT( OUT) :: RLAT(NPTS),RLON(NPTS)
    +
    575  REAL, INTENT( OUT) :: XPTS(NPTS),YPTS(NPTS)
    +
    576  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    577  IF(iopt>=0) THEN
    +
    578  rlon=fill
    +
    579  rlat=fill
    +
    580  ENDIF
    +
    581  IF(iopt<=0) THEN
    +
    582  xpts=fill
    +
    583  ypts=fill
    +
    584  ENDIF
    +
    585  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    586  END SUBROUTINE rot_equid_cylind_error
    +
    587 
    +
    613  SUBROUTINE rot_equid_cylind_vect_rot(RLON, CLATR, SLATR, CLAT, SLAT, &
    +
    614  CLON, CROT, SROT)
    +
    615  IMPLICIT NONE
    +
    616 
    +
    617  REAL(KIND=kd), INTENT(IN ) :: clat, clatr, clon, slat, slatr
    +
    618  REAL , INTENT(IN ) :: RLON
    +
    619  REAL , INTENT( OUT) :: CROT, SROT
    +
    620 
    +
    621  REAL(KIND=kd) :: slon
    +
    622 
    +
    623  IF(irot.EQ.1) THEN
    +
    624  IF(clatr.LE.0._kd) THEN
    +
    625  crot=real(-sign(1._kd,slatr*slat0))
    +
    626  srot=0.
    +
    627  ELSE
    +
    628  slon=sin((rlon-rlon0)/dpr)
    +
    629  crot=real((clat0*clat+slat0*slat*clon)/clatr)
    +
    630  srot=real(slat0*slon/clatr)
    +
    631  ENDIF
    +
    632  ELSE
    +
    633  crot=1.
    +
    634  srot=0.
    +
    635  ENDIF
    +
    636 
    +
    637  END SUBROUTINE rot_equid_cylind_vect_rot
    +
    638 
    +
    664  SUBROUTINE rot_equid_cylind_map_jacob(FILL, RLON, CLATR, CLAT, &
    +
    665  SLAT, CLON, XLON, XLAT, YLON, YLAT)
    +
    666  IMPLICIT NONE
    +
    667 
    +
    668  REAL(KIND=kd), INTENT(IN ) :: clatr, clat, slat, clon
    +
    669  REAL , INTENT(IN ) :: FILL, RLON
    +
    670  REAL , INTENT( OUT) :: XLON, XLAT, YLON, YLAT
    +
    671 
    +
    672  REAL(KIND=kd) :: slon, term1, term2
    +
    673 
    +
    674  IF(clatr.LE.0._kd) THEN
    +
    675  xlon=fill
    +
    676  xlat=fill
    +
    677  ylon=fill
    +
    678  ylat=fill
    +
    679  ELSE
    +
    680  slon=sin((rlon-rlon0)/dpr)
    +
    681  term1=(clat0*clat+slat0*slat*clon)/clatr
    +
    682  term2=slat0*slon/clatr
    +
    683  xlon=real(term1*clat/(dlons*clatr))
    +
    684  xlat=real(-term2/(dlons*clatr))
    +
    685  ylon=real(term2*clat/dlats)
    +
    686  ylat=real(term1/dlats)
    +
    687  ENDIF
    +
    688 
    +
    689  END SUBROUTINE rot_equid_cylind_map_jacob
    +
    690 
    +
    709  SUBROUTINE rot_equid_cylind_grid_area(CLATR, FILL, AREA)
    +
    710  IMPLICIT NONE
    +
    711 
    +
    712  REAL(KIND=kd), INTENT(IN ) :: clatr
    +
    713  REAL, INTENT(IN ) :: FILL
    +
    714  REAL, INTENT( OUT) :: AREA
    +
    715 
    +
    716  IF(clatr.LE.0._kd) THEN
    +
    717  area=fill
    +
    718  ELSE
    +
    719  area=real(2._kd*(rerth**2)*clatr*(dlons/dpr)*sin(0.5_kd*dlats/dpr))
    +
    720  ENDIF
    +
    721 
    +
    722  END SUBROUTINE rot_equid_cylind_grid_area
    +
    723 
    + +
    725 
    +
    void gdswzd(int igdtnum, int *igdtmpl, int igdtlen, int iopt, int npts, float fill, float *xpts, float *ypts, float *rlon, float *rlat, int *nret, float *crot, float *srot, float *xlon, float *xlat, float *ylon, float *ylat, float *area)
    gdswzd() interface for C for _4 build of library.
    +
    Determine earth radius and shape.
    +
    Module containing common constants.
    +
    real, parameter pi
    PI.
    +
    real, parameter dpr
    Radians to degrees.
    +
    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
    +
    Abstract ip_grid type.
    Definition: ip_grid_mod.F90:10
    +
    Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grids A ...
    +
    subroutine rot_equid_cylind_error(IOPT, FILL, RLAT, RLON, XPTS, YPTS, NPTS)
    Error handler.
    +
    subroutine rot_equid_cylind_vect_rot(RLON, CLATR, SLATR, CLAT, SLAT, CLON, CROT, SROT)
    Vector rotation fields for rotated equidistant cylindrical grids - non "e" stagger.
    +
    subroutine gdswzd_rot_equid_cylind(self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
    GDS wizard for rotated equidistant cylindrical.
    +
    real(kind=kd) rlon0
    Local copy of rlon0.
    +
    real(kind=kd) slat0
    Local copy of slat0.
    +
    subroutine init_grib2_ncep_post(self, g2_desc)
    Initializes a Rotated equidistant cylindrical grid given a grib2_descriptor object.
    +
    subroutine rot_equid_cylind_map_jacob(FILL, RLON, CLATR, CLAT, SLAT, CLON, XLON, XLAT, YLON, YLAT)
    Map jacobians for rotated equidistant cylindrical grids - non "e" stagger.
    +
    subroutine init_grib2_default(self, g2_desc)
    Initializes a Rotated equidistant cylindrical grid given a grib2_descriptor object.
    +
    real(kind=kd) dlons
    Local copy of dlons.
    +
    real(kind=kd) dlats
    Local copy of dlats.
    + +
    subroutine init_grib1(self, g1_desc)
    Initializes a Rotated equidistant cylindrical grid given a grib1_descriptor object.
    +
    subroutine rot_equid_cylind_grid_area(CLATR, FILL, AREA)
    Grid box area for rotated equidistant cylindrical grids - non "e" stagger.
    +
    subroutine init_grib2(self, g2_desc)
    Initializes a Rotated equidistant cylindrical grid given a grib2_descriptor object.
    +
    real(kind=kd) rerth
    Radius of the Earth.
    +
    integer, parameter kd
    Fortran kind for reals.
    +
    real(kind=kd) clat0
    Local copy of clat0.
    +
    Descriptor representing a grib1 grib descriptor section (GDS) with an integer array.
    +
    Abstract grid that holds fields and methods common to all grids.
    Definition: ip_grid_mod.F90:58
    + +
    +
    + + + + diff --git a/ver-5.1.0/ip__station__points__grid__mod_8F90.html b/ver-5.1.0/ip__station__points__grid__mod_8F90.html new file mode 100644 index 00000000..1d726aac --- /dev/null +++ b/ver-5.1.0/ip__station__points__grid__mod_8F90.html @@ -0,0 +1,138 @@ + + + + + + + +NCEPLIBS-ip: ip_station_points_grid_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_station_points_grid_mod.F90 File Reference
    +
    +
    + +

    Interpolate gridded data to a series of station points. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Data Types

    type  ip_station_points_grid_mod::ip_station_points_grid
     
    + + + + +

    +Modules

    module  ip_station_points_grid_mod
     Interpolate gridded data to a series of station points.
     
    + + + + + + + + + + +

    +Functions/Subroutines

    subroutine ip_station_points_grid_mod::gdswzd_station_points (self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Interpolate gridded data to a series of station points. More...
     
    subroutine ip_station_points_grid_mod::init_grib1 (self, g1_desc)
     Initializes an IP Station grid given a grib1_descriptor object. More...
     
    subroutine ip_station_points_grid_mod::init_grib2 (self, g2_desc)
     Initializes an IP Station grid given a grib2_descriptor object. More...
     
    +

    Detailed Description

    +

    Interpolate gridded data to a series of station points.

    +
    Author
    Kyle Gerheiser
    +
    Date
    7/21/21
    + +

    Definition in file ip_station_points_grid_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/ip__station__points__grid__mod_8F90.js b/ver-5.1.0/ip__station__points__grid__mod_8F90.js new file mode 100644 index 00000000..f83de141 --- /dev/null +++ b/ver-5.1.0/ip__station__points__grid__mod_8F90.js @@ -0,0 +1,7 @@ +var ip__station__points__grid__mod_8F90 = +[ + [ "ip_station_points_grid", "structip__station__points__grid__mod_1_1ip__station__points__grid.html", "structip__station__points__grid__mod_1_1ip__station__points__grid" ], + [ "gdswzd_station_points", "ip__station__points__grid__mod_8F90.html#a8da297b45242279a497dbd7062a33197", null ], + [ "init_grib1", "ip__station__points__grid__mod_8F90.html#a4b28ebf2b4fe826c96af69db28e0a1ff", null ], + [ "init_grib2", "ip__station__points__grid__mod_8F90.html#ad17e6d245295803b62b146be984f874d", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ip__station__points__grid__mod_8F90_source.html b/ver-5.1.0/ip__station__points__grid__mod_8F90_source.html new file mode 100644 index 00000000..b695ff11 --- /dev/null +++ b/ver-5.1.0/ip__station__points__grid__mod_8F90_source.html @@ -0,0 +1,160 @@ + + + + + + + +NCEPLIBS-ip: ip_station_points_grid_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ip_station_points_grid_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    5 
    + + +
    11  use ip_grid_mod
    +
    12  implicit none
    +
    13 
    +
    14  ! Not really a grid
    +
    15  private
    +
    16  public :: ip_station_points_grid
    +
    17 
    +
    18  type, extends(ip_grid) :: ip_station_points_grid
    +
    19  contains
    +
    21  procedure :: init_grib1
    +
    23  procedure :: init_grib2
    +
    26  procedure :: gdswzd => gdswzd_station_points
    +
    27  end type ip_station_points_grid
    +
    28 
    +
    29 contains
    +
    30 
    +
    37  subroutine init_grib1(self, g1_desc)
    +
    38  class(ip_station_points_grid), intent(inout) :: self
    +
    39  type(grib1_descriptor), intent(in) :: g1_desc
    +
    40  end subroutine init_grib1
    +
    41 
    +
    48  subroutine init_grib2(self, g2_desc)
    +
    49  class(ip_station_points_grid), intent(inout) :: self
    +
    50  type(grib2_descriptor), intent(in) :: g2_desc
    +
    51  end subroutine init_grib2
    +
    52 
    +
    75  SUBROUTINE gdswzd_station_points(self,IOPT,NPTS, &
    +
    76  FILL,XPTS,YPTS,RLON,RLAT,NRET, &
    +
    77  CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
    +
    78  class(ip_station_points_grid), intent(in) :: self
    +
    79  INTEGER, INTENT(IN ) :: IOPT, NPTS
    +
    80  INTEGER, INTENT( OUT) :: NRET
    +
    81  !
    +
    82  REAL, INTENT(IN ) :: FILL
    +
    83  REAL, INTENT(INOUT) :: RLON(NPTS),RLAT(NPTS)
    +
    84  REAL, INTENT(INOUT) :: XPTS(NPTS),YPTS(NPTS)
    +
    85  REAL, OPTIONAL, INTENT( OUT) :: CROT(NPTS),SROT(NPTS)
    +
    86  REAL, OPTIONAL, INTENT( OUT) :: XLON(NPTS),XLAT(NPTS)
    +
    87  REAL, OPTIONAL, INTENT( OUT) :: YLON(NPTS),YLAT(NPTS),AREA(NPTS)
    +
    88 
    +
    89  ! This is all that needs to be done for GDSWZD for station points.
    +
    90  nret = npts
    +
    91 
    +
    92  end subroutine gdswzd_station_points
    +
    93 
    + +
    void gdswzd(int igdtnum, int *igdtmpl, int igdtlen, int iopt, int npts, float fill, float *xpts, float *ypts, float *rlon, float *rlat, int *nret, float *crot, float *srot, float *xlon, float *xlat, float *ylon, float *ylat, float *area)
    gdswzd() interface for C for _4 build of library.
    +
    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
    +
    Abstract ip_grid type.
    Definition: ip_grid_mod.F90:10
    +
    Interpolate gridded data to a series of station points.
    +
    subroutine init_grib1(self, g1_desc)
    Initializes an IP Station grid given a grib1_descriptor object.
    +
    subroutine gdswzd_station_points(self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
    Interpolate gridded data to a series of station points.
    +
    subroutine init_grib2(self, g2_desc)
    Initializes an IP Station grid given a grib2_descriptor object.
    +
    Descriptor representing a grib1 grib descriptor section (GDS) with an integer array.
    +
    Grib-2 descriptor containing a grib2 GDT represented by an integer array.
    +
    Abstract grid that holds fields and methods common to all grids.
    Definition: ip_grid_mod.F90:58
    + +
    +
    + + + + diff --git a/ver-5.1.0/iplib__4_8h.html b/ver-5.1.0/iplib__4_8h.html new file mode 100644 index 00000000..47b03264 --- /dev/null +++ b/ver-5.1.0/iplib__4_8h.html @@ -0,0 +1,516 @@ + + + + + + + +NCEPLIBS-ip: iplib_4.h File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    iplib_4.h File Reference
    +
    +
    + +

    C interface to gdswzd() and gdswzd_grib1() functions for '4' library build. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Functions

    void gdswzd (int igdtnum, int *igdtmpl, int igdtlen, int iopt, int npts, float fill, float *xpts, float *ypts, float *rlon, float *rlat, int *nret, float *crot, float *srot, float *xlon, float *xlat, float *ylon, float *ylat, float *area)
     gdswzd() interface for C for _4 build of library. More...
     
    void gdswzd_grib1 (int *kgds, int iopt, int npts, float fill, float *xpts, float *ypts, float *rlon, float *rlat, int *nret, float *crot, float *srot, float *xlon, float *xlat, float *ylon, float *ylat, float *area)
     gdswzd_grib1() interface for C for the _4 build of the library. More...
     
    +

    Detailed Description

    +

    C interface to gdswzd() and gdswzd_grib1() functions for '4' library build.

    +
    Author
    Jovic
    +
    Date
    2016
    + +

    Definition in file iplib_4.h.

    +

    Function Documentation

    + +

    ◆ gdswzd()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void gdswzd (int igdtnum,
    int * igdtmpl,
    int igdtlen,
    int iopt,
    int npts,
    float fill,
    float * xpts,
    float * ypts,
    float * rlon,
    float * rlat,
    int * nret,
    float * crot,
    float * srot,
    float * xlon,
    float * xlat,
    float * ylon,
    float * ylat,
    float * area 
    )
    +
    + +

    gdswzd() interface for C for _4 build of library.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + +
    igdtnumgrid definition template number. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure.
      +
    • 00 equidistant cylindrical
    • +
    • 01 rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • 10 mercator cyclindrical
    • +
    • 20 polar stereographic azimuthal
    • +
    • 30 lambert conformal conical
    • +
    • 40 gaussian equidistant cyclindrical
    • +
    +
    igdtmpl(igdtlen) grid definition template array. corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure for section three. all projections:
      +
    • 1 shape of earth, octet 15
    • +
    • 2 scale factor of spherical earth radius, octet 16
    • +
    • 3 scaled value of radius of spherical earth, octets 17-20
    • +
    • 4 scale factor of major axis of elliptical earth, octet 21
    • +
    • 5 scaled value of major axis of elliptical earth, octets 22-25
    • +
    • 6 scale factor of minor axis of elliptical earth, octet 26
    • +
    • 7 scaled value of minor axis of elliptical earth, octets 27-30 equidistant cyclindrical:
    • +
    • 8 number of points along a parallel, octs 31-34
    • +
    • 9 number of points along a meridian, octs 35-38
    • +
    • 10 basic angle of initial production domain, octets 39-42.
    • +
    • 11 subdivisions of basic angle, octets 43-46
    • +
    • 12 latitude of first grid point, octets 47-50
    • +
    • 13 longitude of first grid point, octets 51-54
    • +
    • 14 resolution and component flags, octet 55
    • +
    • 15 latitude of last grid point, octets 56-59
    • +
    • 16 longitude of last grid point, octets 60-63
    • +
    • 17 i-direction increment, octets 64-67
    • +
    • 18 j-direction increment, octets 68-71
    • +
    • 19 scanning mode, octet 72 mercator cyclindrical:
    • +
    • 8 number of points along a parallel, octs 31-34
    • +
    • 9 number of points along a meridian, octs 35-38
    • +
    • 10 latitude of first point, octets 39-42
    • +
    • 11 longitude of first point, octets 43-46
    • +
    • 12 resolution and component flags, octet 47
    • +
    • 13 tangent latitude, octets 48-51
    • +
    • 14 latitude of last point, octets 52-55
    • +
    • 15 longitude of last point, octets 56-59
    • +
    • 16 scanning mode flags, octet 60
    • +
    • 17 orientation of grid, octets 61-64
    • +
    • 18 longitudinal grid length, octets 65-68
    • +
    • 19 latitudinal grid length, octets 69-72 Lambert conformal conical:
    • +
    • 8 number of points along x-axis, octs 31-34
    • +
    • 9 number of points along y-axis, octs 35-38
    • +
    • 10 latitude of first point, octets 39-42
    • +
    • 11 longitude of first point, octets 43-46
    • +
    • 12 resolution of component flag, octet 47
    • +
    • 13 latitude where grid lengths specified, octets 48-51
    • +
    • 14 longitude of meridian that is parallel to y-axis, octets 52-55
    • +
    • 15 x-direction grid length, octets 56-59
    • +
    • 16 y-direction grid length, octets 60-63
    • +
    • 17 projection center flag, octet 64
    • +
    • 18 scanning mode, octet 65
    • +
    • 19 first tangent latitude from pole, octets 66-69
    • +
    • 20 second tangent latitude from pole, octets 70-73
    • +
    • 21 latitude of south pole of projection, octets 74-77
    • +
    • 22 longitude of south pole of projection, octets 78-81 gaussian cylindrical:
    • +
    • 8 number of points along a parallel, octs 31-34
    • +
    • 9 number of points along a meridian, octs 35-38
    • +
    • 10 basic angle of initial production domain, octets 39-42
    • +
    • 11 subdivisions of basic angle, octets 43-46
    • +
    • 12 latitude of first grid point, octets 47-50
    • +
    • 13 longitude of first grid point, octets 51-54
    • +
    • 14 resolution and component flags, octet 55
    • +
    • 15 latitude of last grid point, octets 56-59
    • +
    • 16 longitude of last grid point, octets 60-63
    • +
    • 17 i-direction increment, octets 64-67
    • +
    • 18 number of parallels between pole and equator, octets 68-71
    • +
    • 19 scanning mode, octet 72 polar stereographic azimuthal:
    • +
    • 8 number of points along x-axis, octets 31-34
    • +
    • 9 number of points along y-axis, octets 35-38
    • +
    • 10 latitude of first grid point, octets 39-42
    • +
    • 11 longitude of first grid point, octets 43-46
    • +
    • 12 resolution and component flags, octet 47
    • +
    • 13 true latitude, octets 48-51
    • +
    • 14 orientation longitude, octets 52-55
    • +
    • 15 x-direction grid length, octets 56-59
    • +
    • 16 y-direction grid length, octets 60-63
    • +
    • 17 projection center flag, octet 64
    • +
    • 18 scanning mode flags, octet 65 rotated equidistant cyclindrical:
    • +
    • 8 number of points along a parallel, octs 31-34
    • +
    • 9 number of points along a meridian, octs 35-38
    • +
    • 10 basic angle of initial production domain, octets 39-42
    • +
    • 11 subdivisions of basic angle, octets 43-46
    • +
    • 12 latitude of first grid point, octets 47-50
    • +
    • 13 longitude of first grid point, octets 51-54
    • +
    • 14 resolution and component flags, octet 55
    • +
    • 15 latitude of last grid point, octets 56-59
    • +
    • 16 longitude of last grid point, octets 60-63
    • +
    • 17 i-direction increment, octets 64-67
    • +
    • 18 j-direction increment, octets 68-71
    • +
    • 19 scanning mode, octet 72
    • +
    • 20 latitude of southern pole of projection, octets 73-76
    • +
    • 21 longitude of southern pole of projection, octets 77-80
    • +
    • 22 angle of rotation of projection, octs 81-84
    • +
    +
    igdtlennumber of elements of the grid definition template array. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    ioptoption flag
      +
    • 0 to compute earth coords of all the grid points
    • +
    • 1 to compute earth coords of selected grid coords
    • +
    • -1 to compute grid coords of selected earth coords
    • +
    +
    nptsinteger maximum number of coordinates
    fillreal fill value to set invalid output data (must be impossible value; suggested value: -9999.)
    xptsreal (npts) grid x point coordinates if iopt>0
    yptsreal (npts) grid y point coordinates if iopt>0
    rlonreal (npts) earth longitudes in degrees e if iopt<0 (acceptable range: -360. to 360.)
    rlatreal (npts) earth latitudes in degrees n if iopt<0 (acceptable range: -90. to 90.)
    nretnumber of valid points computed (-1 if projection unrecognized)
    crot(npts) clockwise vector rotation cosines
    srot(npts) clockwise vector rotation sines (ugrid=crot*uearth-srot*vearth, vgrid=srot*uearth+crot*vearth)
    xlon(npts) dx/dlon in 1/degrees
    xlat(npts) dx/dlat in 1/degrees
    ylon(npts) dy/dlon in 1/degrees
    ylat(npts) dy/dlat in 1/degrees
    area(npts) area weights in m**2 (Proportional to the square of the map factor in the case of conformal projections.)
    +
    +
    +
    Author
    Jovic
    +
    Date
    2016
    + +
    +
    + +

    ◆ gdswzd_grib1()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void gdswzd_grib1 (int * kgds,
    int iopt,
    int npts,
    float fill,
    float * xpts,
    float * ypts,
    float * rlon,
    float * rlat,
    int * nret,
    float * crot,
    float * srot,
    float * xlon,
    float * xlat,
    float * ylon,
    float * ylat,
    float * area 
    )
    +
    + +

    gdswzd_grib1() interface for C for the _4 build of the library.

    +

    This is a C prototype to call the Fortran module subroutine gdswzd_c_grib1() for the _4 version of the library.

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    kgds(200) gds parameters as decoded by w3fi63.
    ioptoption flag
      +
    • 0 to compute earth coords of all the grid points
    • +
    • 1 to compute earth coords of selected grid coords
    • +
    • -1 to compute grid coords of selected earth coords
    • +
    +
    nptsmaximum number of coordinates
    fillfill value to set invalid output data (must be impossible value; suggested value: -9999.)
    xpts(npts) grid x point coordinates if iopt>0
    ypts(npts) grid y point coordinates if iopt>0
    rlon(npts) earth longitudes in degrees e if iopt<0 (acceptable range: -360. to 360.)
    rlat(npts) earth latitudes in degrees n if iopt<0 (acceptable range: -90. to 90.)
    nretnumber of valid points computed (-1 if projection unrecognized)
    crot(npts) clockwise vector rotation cosines
    srot(npts) clockwise vector rotation sines (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    xlon(npts) dx/dlon in 1/degrees
    xlat(npts) dx/dlat in 1/degrees
    ylon(npts) dy/dlon in 1/degrees
    ylat(npts) dy/dlat in 1/degrees
    area(npts) area weights in m**2 (proportional to the square of the map factor in the case of conformal projections.)
    +
    +
    +
    Author
    Jovic
    +
    Date
    2016
    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/iplib__4_8h.js b/ver-5.1.0/iplib__4_8h.js new file mode 100644 index 00000000..a2de2916 --- /dev/null +++ b/ver-5.1.0/iplib__4_8h.js @@ -0,0 +1,5 @@ +var iplib__4_8h = +[ + [ "gdswzd", "iplib__4_8h.html#a44daefd49c37e9bc59933d98e56efa53", null ], + [ "gdswzd_grib1", "iplib__4_8h.html#a7f2f96041c0d42926e14cb0f40f336e1", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/iplib__4_8h_source.html b/ver-5.1.0/iplib__4_8h_source.html new file mode 100644 index 00000000..18ff4d6b --- /dev/null +++ b/ver-5.1.0/iplib__4_8h_source.html @@ -0,0 +1,117 @@ + + + + + + + +NCEPLIBS-ip: iplib_4.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    iplib_4.h
    +
    +
    +Go to the documentation of this file.
    1 
    +
    7 #ifndef IPLIB
    +
    8 #define IPLIB
    +
    9 
    +
    146 void gdswzd(int igdtnum, int *igdtmpl, int igdtlen, int iopt,
    +
    147  int npts, float fill, float *xpts, float *ypts,
    +
    148  float *rlon, float *rlat, int *nret,
    +
    149  float *crot, float *srot, float *xlon, float *xlat,
    +
    150  float *ylon, float *ylat, float *area);
    +
    151 
    +
    187 void gdswzd_grib1(int *kgds, int iopt, int npts, float fill,
    +
    188  float *xpts, float *ypts, float *rlon, float *rlat,
    +
    189  int *nret, float *crot, float *srot,
    +
    190  float *xlon, float *xlat, float *ylon, float *ylat, float *area);
    +
    191 
    +
    192 #endif
    +
    void gdswzd(int igdtnum, int *igdtmpl, int igdtlen, int iopt, int npts, float fill, float *xpts, float *ypts, float *rlon, float *rlat, int *nret, float *crot, float *srot, float *xlon, float *xlat, float *ylon, float *ylat, float *area)
    gdswzd() interface for C for _4 build of library.
    +
    void gdswzd_grib1(int *kgds, int iopt, int npts, float fill, float *xpts, float *ypts, float *rlon, float *rlat, int *nret, float *crot, float *srot, float *xlon, float *xlat, float *ylon, float *ylat, float *area)
    gdswzd_grib1() interface for C for the _4 build of the library.
    +
    +
    + + + + diff --git a/ver-5.1.0/iplib__8_8h.html b/ver-5.1.0/iplib__8_8h.html new file mode 100644 index 00000000..19eb1340 --- /dev/null +++ b/ver-5.1.0/iplib__8_8h.html @@ -0,0 +1,516 @@ + + + + + + + +NCEPLIBS-ip: iplib_8.h File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    iplib_8.h File Reference
    +
    +
    + +

    C interface to gdswzd() and gdswzd_grib1() functions for '8' library build. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Functions

    void gdswzd (long igdtnum, long *igdtmpl, long igdtlen, long iopt, long npts, double fill, double *xpts, double *ypts, double *rlon, double *rlat, long *nret, double *crot, double *srot, double *xlon, double *xlat, double *ylon, double *ylat, double *area)
     gdswzd() interface for C for _8 build of library. More...
     
    void gdswzd_grib1 (long *kgds, long iopt, long npts, double fill, double *xpts, double *ypts, double *rlon, double *rlat, long *nret, double *crot, double *srot, double *xlon, double *xlat, double *ylon, double *ylat, double *area)
     gdswzd_grib1() interface for C for _8 build of the library. More...
     
    +

    Detailed Description

    +

    C interface to gdswzd() and gdswzd_grib1() functions for '8' library build.

    +
    Author
    Jovic
    +
    Date
    2016
    + +

    Definition in file iplib_8.h.

    +

    Function Documentation

    + +

    ◆ gdswzd()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void gdswzd (long igdtnum,
    long * igdtmpl,
    long igdtlen,
    long iopt,
    long npts,
    double fill,
    double * xpts,
    double * ypts,
    double * rlon,
    double * rlat,
    long * nret,
    double * crot,
    double * srot,
    double * xlon,
    double * xlat,
    double * ylon,
    double * ylat,
    double * area 
    )
    +
    + +

    gdswzd() interface for C for _8 build of library.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + +
    igdtnumgrid definition template number. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure.
      +
    • 00 equidistant cylindrical
    • +
    • 01 rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • 10 mercator cyclindrical
    • +
    • 20 polar stereographic azimuthal
    • +
    • 30 lambert conformal conical
    • +
    • 40 gaussian equidistant cyclindrical
    • +
    +
    igdtmpl(igdtlen) grid definition template array. corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure for section three. all projections:
      +
    • 1 shape of earth, octet 15
    • +
    • 2 scale factor of spherical earth radius, octet 16
    • +
    • 3 scaled value of radius of spherical earth, octets 17-20
    • +
    • 4 scale factor of major axis of elliptical earth, octet 21
    • +
    • 5 scaled value of major axis of elliptical earth, octets 22-25
    • +
    • 6 scale factor of minor axis of elliptical earth, octet 26
    • +
    • 7 scaled value of minor axis of elliptical earth, octets 27-30 equidistant cyclindrical:
    • +
    • 8 number of points along a parallel, octs 31-34
    • +
    • 9 number of points along a meridian, octs 35-38
    • +
    • 10 basic angle of initial production domain, octets 39-42.
    • +
    • 11 subdivisions of basic angle, octets 43-46
    • +
    • 12 latitude of first grid point, octets 47-50
    • +
    • 13 longitude of first grid point, octets 51-54
    • +
    • 14 resolution and component flags, octet 55
    • +
    • 15 latitude of last grid point, octets 56-59
    • +
    • 16 longitude of last grid point, octets 60-63
    • +
    • 17 i-direction increment, octets 64-67
    • +
    • 18 j-direction increment, octets 68-71
    • +
    • 19 scanning mode, octet 72 mercator cyclindrical:
    • +
    • 8 number of points along a parallel, octs 31-34
    • +
    • 9 number of points along a meridian, octs 35-38
    • +
    • 10 latitude of first point, octets 39-42
    • +
    • 11 longitude of first point, octets 43-46
    • +
    • 12 resolution and component flags, octet 47
    • +
    • 13 tangent latitude, octets 48-51
    • +
    • 14 latitude of last point, octets 52-55
    • +
    • 15 longitude of last point, octets 56-59
    • +
    • 16 scanning mode flags, octet 60
    • +
    • 17 orientation of grid, octets 61-64
    • +
    • 18 longitudinal grid length, octets 65-68
    • +
    • 19 latitudinal grid length, octets 69-72 Lambert conformal conical:
    • +
    • 8 number of points along x-axis, octs 31-34
    • +
    • 9 number of points along y-axis, octs 35-38
    • +
    • 10 latitude of first point, octets 39-42
    • +
    • 11 longitude of first point, octets 43-46
    • +
    • 12 resolution of component flag, octet 47
    • +
    • 13 latitude where grid lengths specified, octets 48-51
    • +
    • 14 longitude of meridian that is parallel to y-axis, octets 52-55
    • +
    • 15 x-direction grid length, octets 56-59
    • +
    • 16 y-direction grid length, octets 60-63
    • +
    • 17 projection center flag, octet 64
    • +
    • 18 scanning mode, octet 65
    • +
    • 19 first tangent latitude from pole, octets 66-69
    • +
    • 20 second tangent latitude from pole, octets 70-73
    • +
    • 21 latitude of south pole of projection, octets 74-77
    • +
    • 22 longitude of south pole of projection, octets 78-81 gaussian cylindrical:
    • +
    • 8 number of points along a parallel, octs 31-34
    • +
    • 9 number of points along a meridian, octs 35-38
    • +
    • 10 basic angle of initial production domain, octets 39-42
    • +
    • 11 subdivisions of basic angle, octets 43-46
    • +
    • 12 latitude of first grid point, octets 47-50
    • +
    • 13 longitude of first grid point, octets 51-54
    • +
    • 14 resolution and component flags, octet 55
    • +
    • 15 latitude of last grid point, octets 56-59
    • +
    • 16 longitude of last grid point, octets 60-63
    • +
    • 17 i-direction increment, octets 64-67
    • +
    • 18 number of parallels between pole and equator, octets 68-71
    • +
    • 19 scanning mode, octet 72 polar stereographic azimuthal:
    • +
    • 8 number of points along x-axis, octets 31-34
    • +
    • 9 number of points along y-axis, octets 35-38
    • +
    • 10 latitude of first grid point, octets 39-42
    • +
    • 11 longitude of first grid point, octets 43-46
    • +
    • 12 resolution and component flags, octet 47
    • +
    • 13 true latitude, octets 48-51
    • +
    • 14 orientation longitude, octets 52-55
    • +
    • 15 x-direction grid length, octets 56-59
    • +
    • 16 y-direction grid length, octets 60-63
    • +
    • 17 projection center flag, octet 64
    • +
    • 18 scanning mode flags, octet 65 rotated equidistant cyclindrical:
    • +
    • 8 number of points along a parallel, octs 31-34
    • +
    • 9 number of points along a meridian, octs 35-38
    • +
    • 10 basic angle of initial production domain, octets 39-42
    • +
    • 11 subdivisions of basic angle, octets 43-46
    • +
    • 12 latitude of first grid point, octets 47-50
    • +
    • 13 longitude of first grid point, octets 51-54
    • +
    • 14 resolution and component flags, octet 55
    • +
    • 15 latitude of last grid point, octets 56-59
    • +
    • 16 longitude of last grid point, octets 60-63
    • +
    • 17 i-direction increment, octets 64-67
    • +
    • 18 j-direction increment, octets 68-71
    • +
    • 19 scanning mode, octet 72
    • +
    • 20 latitude of southern pole of projection, octets 73-76
    • +
    • 21 longitude of southern pole of projection, octets 77-80
    • +
    • 22 angle of rotation of projection, octs 81-84
    • +
    +
    igdtlennumber of elements of the grid definition template array. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    ioptoption flag
      +
    • 0 to compute earth coords of all the grid points
    • +
    • 1 to compute earth coords of selected grid coords
    • +
    • -1 to compute grid coords of selected earth coords
    • +
    +
    nptsinteger maximum number of coordinates
    fillreal fill value to set invalid output data (must be impossible value; suggested value: -9999.)
    xptsreal (npts) grid x point coordinates if iopt>0
    yptsreal (npts) grid y point coordinates if iopt>0
    rlonreal (npts) earth longitudes in degrees e if iopt<0 (acceptable range: -360. to 360.)
    rlatreal (npts) earth latitudes in degrees n if iopt<0 (acceptable range: -90. to 90.)
    nretnumber of valid points computed (-1 if projection unrecognized)
    crot(npts) clockwise vector rotation cosines
    srot(npts) clockwise vector rotation sines (ugrid=crot*uearth-srot*vearth, vgrid=srot*uearth+crot*vearth)
    xlon(npts) dx/dlon in 1/degrees
    xlat(npts) dx/dlat in 1/degrees
    ylon(npts) dy/dlon in 1/degrees
    ylat(npts) dy/dlat in 1/degrees
    area(npts) area weights in m**2 (Proportional to the square of the map factor in the case of conformal projections.)
    +
    +
    +
    Author
    Jovic
    +
    Date
    2016
    + +
    +
    + +

    ◆ gdswzd_grib1()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void gdswzd_grib1 (long * kgds,
    long iopt,
    long npts,
    double fill,
    double * xpts,
    double * ypts,
    double * rlon,
    double * rlat,
    long * nret,
    double * crot,
    double * srot,
    double * xlon,
    double * xlat,
    double * ylon,
    double * ylat,
    double * area 
    )
    +
    + +

    gdswzd_grib1() interface for C for _8 build of the library.

    +

    This is a C prototype to call the Fortran module subroutine gdswzd_c_grib1() for the _4 version of the library.

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    kgds(200) gds parameters as decoded by w3fi63.
    ioptoption flag
      +
    • 0 to compute earth coords of all the grid points
    • +
    • 1 to compute earth coords of selected grid coords
    • +
    • -1 to compute grid coords of selected earth coords
    • +
    +
    nptsmaximum number of coordinates
    fillfill value to set invalid output data (must be impossible value; suggested value: -9999.)
    xpts(npts) grid x point coordinates if iopt>0
    ypts(npts) grid y point coordinates if iopt>0
    rlon(npts) earth longitudes in degrees e if iopt<0 (acceptable range: -360. to 360.)
    rlat(npts) earth latitudes in degrees n if iopt<0 (acceptable range: -90. to 90.)
    nretnumber of valid points computed (-1 if projection unrecognized)
    crot(npts) clockwise vector rotation cosines
    srot(npts) clockwise vector rotation sines (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    xlon(npts) dx/dlon in 1/degrees
    xlat(npts) dx/dlat in 1/degrees
    ylon(npts) dy/dlon in 1/degrees
    ylat(npts) dy/dlat in 1/degrees
    area(npts) area weights in m**2 (proportional to the square of the map factor in the case of conformal projections.)
    +
    +
    +
    Author
    Jovic
    +
    Date
    2016
    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/iplib__8_8h.js b/ver-5.1.0/iplib__8_8h.js new file mode 100644 index 00000000..8ec13f88 --- /dev/null +++ b/ver-5.1.0/iplib__8_8h.js @@ -0,0 +1,5 @@ +var iplib__8_8h = +[ + [ "gdswzd", "iplib__8_8h.html#af41ad9a4b34f78d182a68b3d72b9bdf4", null ], + [ "gdswzd_grib1", "iplib__8_8h.html#ab8e46b623c66911913f66d314c15cc93", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/iplib__8_8h_source.html b/ver-5.1.0/iplib__8_8h_source.html new file mode 100644 index 00000000..b1eae34a --- /dev/null +++ b/ver-5.1.0/iplib__8_8h_source.html @@ -0,0 +1,116 @@ + + + + + + + +NCEPLIBS-ip: iplib_8.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    iplib_8.h
    +
    +
    +Go to the documentation of this file.
    1 
    +
    7 #ifndef IPLIB
    +
    8 #define IPLIB
    +
    9 
    +
    146 void gdswzd(long igdtnum, long *igdtmpl, long igdtlen, long iopt,
    +
    147  long npts, double fill, double *xpts, double *ypts,
    +
    148  double *rlon, double *rlat, long *nret,
    +
    149  double *crot, double *srot, double *xlon, double *xlat,
    +
    150  double *ylon, double *ylat, double *area);
    +
    151 
    +
    187 void gdswzd_grib1(long *kgds, long iopt, long npts, double fill,
    +
    188  double *xpts, double *ypts, double *rlon, double *rlat,
    +
    189  long *nret, double *crot, double *srot,
    +
    190  double *xlon, double *xlat, double *ylon, double *ylat, double *area);
    +
    191 #endif
    +
    void gdswzd_grib1(long *kgds, long iopt, long npts, double fill, double *xpts, double *ypts, double *rlon, double *rlat, long *nret, double *crot, double *srot, double *xlon, double *xlat, double *ylon, double *ylat, double *area)
    gdswzd_grib1() interface for C for _8 build of the library.
    +
    void gdswzd(long igdtnum, long *igdtmpl, long igdtlen, long iopt, long npts, double fill, double *xpts, double *ypts, double *rlon, double *rlat, long *nret, double *crot, double *srot, double *xlon, double *xlat, double *ylon, double *ylat, double *area)
    gdswzd() interface for C for _8 build of library.
    +
    +
    + + + + diff --git a/ver-5.1.0/iplib__d_8h.html b/ver-5.1.0/iplib__d_8h.html new file mode 100644 index 00000000..492ec61c --- /dev/null +++ b/ver-5.1.0/iplib__d_8h.html @@ -0,0 +1,516 @@ + + + + + + + +NCEPLIBS-ip: iplib_d.h File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    iplib_d.h File Reference
    +
    +
    + +

    C interface to gdswzd() and gdswzd_grib1() functions for 'd' library build. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Functions

    void gdswzd (int igdtnum, int *igdtmpl, int igdtlen, int iopt, int npts, double fill, double *xpts, double *ypts, double *rlon, double *rlat, int *nret, double *crot, double *srot, double *xlon, double *xlat, double *ylon, double *ylat, double *area)
     gdswzd() interface for C for _d build of library. More...
     
    void gdswzd_grib1 (int *kgds, int iopt, int npts, double fill, double *xpts, double *ypts, double *rlon, double *rlat, int *nret, double *crot, double *srot, double *xlon, double *xlat, double *ylon, double *ylat, double *area)
     gdswzd_grib1() interface for C for _d build of the library. More...
     
    +

    Detailed Description

    +

    C interface to gdswzd() and gdswzd_grib1() functions for 'd' library build.

    +
    Author
    Jovic
    +
    Date
    2016
    + +

    Definition in file iplib_d.h.

    +

    Function Documentation

    + +

    ◆ gdswzd()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void gdswzd (int igdtnum,
    int * igdtmpl,
    int igdtlen,
    int iopt,
    int npts,
    double fill,
    double * xpts,
    double * ypts,
    double * rlon,
    double * rlat,
    int * nret,
    double * crot,
    double * srot,
    double * xlon,
    double * xlat,
    double * ylon,
    double * ylat,
    double * area 
    )
    +
    + +

    gdswzd() interface for C for _d build of library.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + +
    igdtnumgrid definition template number. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure.
      +
    • 00 equidistant cylindrical
    • +
    • 01 rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • 10 mercator cyclindrical
    • +
    • 20 polar stereographic azimuthal
    • +
    • 30 lambert conformal conical
    • +
    • 40 gaussian equidistant cyclindrical
    • +
    +
    igdtmpl(igdtlen) grid definition template array. corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure for section three. all projections:
      +
    • 1 shape of earth, octet 15
    • +
    • 2 scale factor of spherical earth radius, octet 16
    • +
    • 3 scaled value of radius of spherical earth, octets 17-20
    • +
    • 4 scale factor of major axis of elliptical earth, octet 21
    • +
    • 5 scaled value of major axis of elliptical earth, octets 22-25
    • +
    • 6 scale factor of minor axis of elliptical earth, octet 26
    • +
    • 7 scaled value of minor axis of elliptical earth, octets 27-30 equidistant cyclindrical:
    • +
    • 8 number of points along a parallel, octs 31-34
    • +
    • 9 number of points along a meridian, octs 35-38
    • +
    • 10 basic angle of initial production domain, octets 39-42.
    • +
    • 11 subdivisions of basic angle, octets 43-46
    • +
    • 12 latitude of first grid point, octets 47-50
    • +
    • 13 longitude of first grid point, octets 51-54
    • +
    • 14 resolution and component flags, octet 55
    • +
    • 15 latitude of last grid point, octets 56-59
    • +
    • 16 longitude of last grid point, octets 60-63
    • +
    • 17 i-direction increment, octets 64-67
    • +
    • 18 j-direction increment, octets 68-71
    • +
    • 19 scanning mode, octet 72 mercator cyclindrical:
    • +
    • 8 number of points along a parallel, octs 31-34
    • +
    • 9 number of points along a meridian, octs 35-38
    • +
    • 10 latitude of first point, octets 39-42
    • +
    • 11 longitude of first point, octets 43-46
    • +
    • 12 resolution and component flags, octet 47
    • +
    • 13 tangent latitude, octets 48-51
    • +
    • 14 latitude of last point, octets 52-55
    • +
    • 15 longitude of last point, octets 56-59
    • +
    • 16 scanning mode flags, octet 60
    • +
    • 17 orientation of grid, octets 61-64
    • +
    • 18 longitudinal grid length, octets 65-68
    • +
    • 19 latitudinal grid length, octets 69-72 Lambert conformal conical:
    • +
    • 8 number of points along x-axis, octs 31-34
    • +
    • 9 number of points along y-axis, octs 35-38
    • +
    • 10 latitude of first point, octets 39-42
    • +
    • 11 longitude of first point, octets 43-46
    • +
    • 12 resolution of component flag, octet 47
    • +
    • 13 latitude where grid lengths specified, octets 48-51
    • +
    • 14 longitude of meridian that is parallel to y-axis, octets 52-55
    • +
    • 15 x-direction grid length, octets 56-59
    • +
    • 16 y-direction grid length, octets 60-63
    • +
    • 17 projection center flag, octet 64
    • +
    • 18 scanning mode, octet 65
    • +
    • 19 first tangent latitude from pole, octets 66-69
    • +
    • 20 second tangent latitude from pole, octets 70-73
    • +
    • 21 latitude of south pole of projection, octets 74-77
    • +
    • 22 longitude of south pole of projection, octets 78-81 gaussian cylindrical:
    • +
    • 8 number of points along a parallel, octs 31-34
    • +
    • 9 number of points along a meridian, octs 35-38
    • +
    • 10 basic angle of initial production domain, octets 39-42
    • +
    • 11 subdivisions of basic angle, octets 43-46
    • +
    • 12 latitude of first grid point, octets 47-50
    • +
    • 13 longitude of first grid point, octets 51-54
    • +
    • 14 resolution and component flags, octet 55
    • +
    • 15 latitude of last grid point, octets 56-59
    • +
    • 16 longitude of last grid point, octets 60-63
    • +
    • 17 i-direction increment, octets 64-67
    • +
    • 18 number of parallels between pole and equator, octets 68-71
    • +
    • 19 scanning mode, octet 72 polar stereographic azimuthal:
    • +
    • 8 number of points along x-axis, octets 31-34
    • +
    • 9 number of points along y-axis, octets 35-38
    • +
    • 10 latitude of first grid point, octets 39-42
    • +
    • 11 longitude of first grid point, octets 43-46
    • +
    • 12 resolution and component flags, octet 47
    • +
    • 13 true latitude, octets 48-51
    • +
    • 14 orientation longitude, octets 52-55
    • +
    • 15 x-direction grid length, octets 56-59
    • +
    • 16 y-direction grid length, octets 60-63
    • +
    • 17 projection center flag, octet 64
    • +
    • 18 scanning mode flags, octet 65 rotated equidistant cyclindrical:
    • +
    • 8 number of points along a parallel, octs 31-34
    • +
    • 9 number of points along a meridian, octs 35-38
    • +
    • 10 basic angle of initial production domain, octets 39-42
    • +
    • 11 subdivisions of basic angle, octets 43-46
    • +
    • 12 latitude of first grid point, octets 47-50
    • +
    • 13 longitude of first grid point, octets 51-54
    • +
    • 14 resolution and component flags, octet 55
    • +
    • 15 latitude of last grid point, octets 56-59
    • +
    • 16 longitude of last grid point, octets 60-63
    • +
    • 17 i-direction increment, octets 64-67
    • +
    • 18 j-direction increment, octets 68-71
    • +
    • 19 scanning mode, octet 72
    • +
    • 20 latitude of southern pole of projection, octets 73-76
    • +
    • 21 longitude of southern pole of projection, octets 77-80
    • +
    • 22 angle of rotation of projection, octs 81-84
    • +
    +
    igdtlennumber of elements of the grid definition template array. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    ioptoption flag
      +
    • 0 to compute earth coords of all the grid points
    • +
    • 1 to compute earth coords of selected grid coords
    • +
    • -1 to compute grid coords of selected earth coords
    • +
    +
    nptsinteger maximum number of coordinates
    fillreal fill value to set invalid output data (must be impossible value; suggested value: -9999.)
    xptsreal (npts) grid x point coordinates if iopt>0
    yptsreal (npts) grid y point coordinates if iopt>0
    rlonreal (npts) earth longitudes in degrees e if iopt<0 (acceptable range: -360. to 360.)
    rlatreal (npts) earth latitudes in degrees n if iopt<0 (acceptable range: -90. to 90.)
    nretnumber of valid points computed (-1 if projection unrecognized)
    crot(npts) clockwise vector rotation cosines
    srot(npts) clockwise vector rotation sines (ugrid=crot*uearth-srot*vearth, vgrid=srot*uearth+crot*vearth)
    xlon(npts) dx/dlon in 1/degrees
    xlat(npts) dx/dlat in 1/degrees
    ylon(npts) dy/dlon in 1/degrees
    ylat(npts) dy/dlat in 1/degrees
    area(npts) area weights in m**2 (Proportional to the square of the map factor in the case of conformal projections.)
    +
    +
    +
    Author
    Jovic
    +
    Date
    2016
    + +
    +
    + +

    ◆ gdswzd_grib1()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void gdswzd_grib1 (int * kgds,
    int iopt,
    int npts,
    double fill,
    double * xpts,
    double * ypts,
    double * rlon,
    double * rlat,
    int * nret,
    double * crot,
    double * srot,
    double * xlon,
    double * xlat,
    double * ylon,
    double * ylat,
    double * area 
    )
    +
    + +

    gdswzd_grib1() interface for C for _d build of the library.

    +

    This is a C prototype to call the Fortran module subroutine gdswzd_c_grib1() for the _4 version of the library.

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    kgds(200) gds parameters as decoded by w3fi63.
    ioptoption flag
      +
    • 0 to compute earth coords of all the grid points
    • +
    • 1 to compute earth coords of selected grid coords
    • +
    • -1 to compute grid coords of selected earth coords
    • +
    +
    nptsmaximum number of coordinates
    fillfill value to set invalid output data (must be impossible value; suggested value: -9999.)
    xpts(npts) grid x point coordinates if iopt>0
    ypts(npts) grid y point coordinates if iopt>0
    rlon(npts) earth longitudes in degrees e if iopt<0 (acceptable range: -360. to 360.)
    rlat(npts) earth latitudes in degrees n if iopt<0 (acceptable range: -90. to 90.)
    nretnumber of valid points computed (-1 if projection unrecognized)
    crot(npts) clockwise vector rotation cosines
    srot(npts) clockwise vector rotation sines (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    xlon(npts) dx/dlon in 1/degrees
    xlat(npts) dx/dlat in 1/degrees
    ylon(npts) dy/dlon in 1/degrees
    ylat(npts) dy/dlat in 1/degrees
    area(npts) area weights in m**2 (proportional to the square of the map factor in the case of conformal projections.)
    +
    +
    +
    Author
    Jovic
    +
    Date
    2016
    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/iplib__d_8h.js b/ver-5.1.0/iplib__d_8h.js new file mode 100644 index 00000000..3bc76200 --- /dev/null +++ b/ver-5.1.0/iplib__d_8h.js @@ -0,0 +1,5 @@ +var iplib__d_8h = +[ + [ "gdswzd", "iplib__d_8h.html#ac919f31612096fd6a7547a425ab3d38e", null ], + [ "gdswzd_grib1", "iplib__d_8h.html#ac33340cba2ac7b42dd9b9116fc28d691", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/iplib__d_8h_source.html b/ver-5.1.0/iplib__d_8h_source.html new file mode 100644 index 00000000..1f503f91 --- /dev/null +++ b/ver-5.1.0/iplib__d_8h_source.html @@ -0,0 +1,116 @@ + + + + + + + +NCEPLIBS-ip: iplib_d.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    iplib_d.h
    +
    +
    +Go to the documentation of this file.
    1 
    +
    7 #ifndef IPLIB
    +
    8 #define IPLIB
    +
    9 
    +
    146 void gdswzd(int igdtnum, int *igdtmpl, int igdtlen, int iopt,
    +
    147  int npts, double fill, double *xpts, double *ypts,
    +
    148  double *rlon, double *rlat, int *nret,
    +
    149  double *crot, double *srot, double *xlon, double *xlat,
    +
    150  double *ylon, double *ylat, double *area);
    +
    151 
    +
    187 void gdswzd_grib1(int *kgds, int iopt, int npts, double fill,
    +
    188  double *xpts, double *ypts, double *rlon, double *rlat,
    +
    189  int *nret, double *crot, double *srot,
    +
    190  double *xlon, double *xlat, double *ylon, double *ylat, double *area);
    +
    191 #endif
    +
    void gdswzd_grib1(int *kgds, int iopt, int npts, double fill, double *xpts, double *ypts, double *rlon, double *rlat, int *nret, double *crot, double *srot, double *xlon, double *xlat, double *ylon, double *ylat, double *area)
    gdswzd_grib1() interface for C for _d build of the library.
    +
    void gdswzd(int igdtnum, int *igdtmpl, int igdtlen, int iopt, int npts, double fill, double *xpts, double *ypts, double *rlon, double *rlat, int *nret, double *crot, double *srot, double *xlon, double *xlat, double *ylon, double *ylat, double *area)
    gdswzd() interface for C for _d build of library.
    +
    +
    + + + + diff --git a/ver-5.1.0/ipolates_8F90.html b/ver-5.1.0/ipolates_8F90.html new file mode 100644 index 00000000..6eb0367c --- /dev/null +++ b/ver-5.1.0/ipolates_8F90.html @@ -0,0 +1,143 @@ + + + + + + + +NCEPLIBS-ip: ipolates.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ipolates.F90 File Reference
    +
    +
    + +

    Top-level driver for scalar interpolation routine ipolates(). +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Data Types

    interface  ipolates_mod::ipolates
     
    + + + + +

    +Modules

    module  ipolates_mod
     Top-level driver for scalar interpolation interpolation routine ipolates().
     
    + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine, public ipolates_mod::ipolates_grib1 (ip, ipopt, kgdsi, kgdso, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
     This subprogram interpolates scalar field from any grid to any grid given a grib1 Grid Descriptor Section. More...
     
    subroutine, public ipolates_mod::ipolates_grib1_single_field (ip, ipopt, kgdsi, kgdso, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
     Special case of ipolates_grib1 when interpolating a single field. More...
     
    subroutine, public ipolates_mod::ipolates_grib2 (IP, IPOPT, IGDTNUMI, IGDTMPLI, IGDTLENI, IGDTNUMO, IGDTMPLO, IGDTLENO, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     This subprogram interpolates scalar field from any grid to any grid given a grib2 descriptor. More...
     
    subroutine, public ipolates_mod::ipolates_grib2_single_field (IP, IPOPT, IGDTNUMI, IGDTMPLI, IGDTLENI, IGDTNUMO, IGDTMPLO, IGDTLENO, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Special case of ipolates_grib2 when interpolating a single field. More...
     
    subroutine ipolates_mod::ipolates_grid (ip, ipopt, grid_in, grid_out, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
     Interpolates scalar fields between grids given ip_grid objects. More...
     
    +

    Detailed Description

    +

    Top-level driver for scalar interpolation routine ipolates().

    +
    Author
    Mark Iredell, Kyle Gerheiser
    + +

    Definition in file ipolates.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/ipolates_8F90.js b/ver-5.1.0/ipolates_8F90.js new file mode 100644 index 00000000..7387fc3c --- /dev/null +++ b/ver-5.1.0/ipolates_8F90.js @@ -0,0 +1,9 @@ +var ipolates_8F90 = +[ + [ "ipolates", "interfaceipolates__mod_1_1ipolates.html", "interfaceipolates__mod_1_1ipolates" ], + [ "ipolates_grib1", "ipolates_8F90.html#acb5408cf5c3a0f50326edc183f9bd269", null ], + [ "ipolates_grib1_single_field", "ipolates_8F90.html#ae70a9ca9871bb33e038782b036b7b53d", null ], + [ "ipolates_grib2", "ipolates_8F90.html#a6b2ea6d5b04d2a68baad261e7a409fac", null ], + [ "ipolates_grib2_single_field", "ipolates_8F90.html#a49541b2af75b7c037a863a4785726856", null ], + [ "ipolates_grid", "ipolates_8F90.html#a2761e20fab898e7fd9963f3e0eb5d104", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ipolates_8F90_source.html b/ver-5.1.0/ipolates_8F90_source.html new file mode 100644 index 00000000..2338e98a --- /dev/null +++ b/ver-5.1.0/ipolates_8F90_source.html @@ -0,0 +1,398 @@ + + + + + + + +NCEPLIBS-ip: ipolates.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ipolates.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    4 
    + + + + + +
    17  use ip_grid_mod
    +
    18  implicit none
    +
    19 
    +
    20  private
    + +
    22 
    +
    23  interface ipolates
    +
    24  module procedure ipolates_grib1
    +
    25  module procedure ipolates_grib1_single_field
    +
    26  module procedure ipolates_grib2
    +
    27  module procedure ipolates_grib2_single_field
    +
    28  end interface ipolates
    +
    29 
    +
    30 contains
    +
    31 
    +
    63  subroutine ipolates_grid(ip, ipopt, grid_in, grid_out, mi, mo, km,&
    +
    64  & ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
    +
    65  class(ip_grid), intent(in) :: grid_in, grid_out
    +
    66  INTEGER, INTENT(IN ) :: IP, IPOPT(20), KM, MI, MO
    +
    67  INTEGER, INTENT(IN ) :: IBI(KM)
    +
    68  INTEGER, INTENT(INOUT) :: NO
    +
    69  INTEGER, INTENT( OUT) :: IRET, IBO(KM)
    +
    70  !
    +
    71  LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
    +
    72  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
    +
    73  !
    +
    74  REAL, INTENT(IN ) :: GI(MI,KM)
    +
    75  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    76  REAL, INTENT( OUT) :: GO(MO,KM)
    +
    77  !
    +
    78 
    +
    79  select case(ip)
    +
    80  case(bilinear_interp_id)
    +
    81  CALL interpolate_bilinear(ipopt,grid_in,grid_out,mi,mo,km,ibi&
    +
    82  &,li,gi,no,rlat,rlon,ibo,lo,go,iret)
    +
    83  case(bicubic_interp_id)
    +
    84  CALL interpolate_bicubic(ipopt,grid_in,grid_out,mi,mo,km,ibi&
    +
    85  &,li,gi,no,rlat,rlon,ibo,lo,go,iret)
    +
    86  case(neighbor_interp_id)
    +
    87  CALL interpolate_neighbor(ipopt,grid_in,grid_out,mi,mo,km,ibi&
    +
    88  &,li,gi,no,rlat,rlon,ibo,lo,go,iret)
    +
    89  case(budget_interp_id)
    +
    90  CALL interpolate_budget(ipopt,grid_in,grid_out,mi,mo,km,ibi,li&
    +
    91  &,gi,no,rlat,rlon,ibo,lo,go,iret)
    +
    92  case(spectral_interp_id)
    +
    93  CALL interpolate_spectral(ipopt,grid_in,grid_out,mi,mo,km,ibi&
    +
    94  &,gi,no,rlat,rlon,ibo,lo,go,iret)
    + +
    96  CALL interpolate_neighbor_budget(ipopt,grid_in,grid_out,mi,mo&
    +
    97  &,km,ibi,li,gi,no,rlat,rlon,ibo,lo,go,iret)
    +
    98  case default
    +
    99  ! IF(KGDSO(1).GE.0) NO=0
    +
    100  ! DO K=1,KM
    +
    101  ! IBO(K)=1
    +
    102  ! DO N=1,NO
    +
    103  ! LO(N,K)=.FALSE.
    +
    104  ! GO(N,K)=0.
    +
    105  ! ENDDO
    +
    106  ! ENDDO
    +
    107  iret=1
    +
    108  print *, "Unrecognized interp option: ", ip
    +
    109  error stop
    +
    110  end select
    +
    111 
    +
    112  end subroutine ipolates_grid
    +
    113 
    +
    158  subroutine ipolates_grib1_single_field(ip,ipopt,kgdsi,kgdso,mi,mo,km,ibi,li,gi, &
    +
    159  no,rlat,rlon,ibo,lo,go,iret) bind(c)
    +
    160  !
    +
    161  USE iso_c_binding, ONLY: c_int, c_float, c_double, c_bool, c_long
    +
    162 #if (LSIZE==8)
    +
    163  INTEGER(C_LONG), INTENT(IN ) :: IP, IPOPT(20), KM, MI, MO
    +
    164  INTEGER(C_LONG), INTENT(IN ) :: IBI, KGDSI(200), KGDSO(200)
    +
    165  INTEGER(C_LONG), INTENT(INOUT) :: NO
    +
    166  INTEGER(C_LONG), INTENT( OUT) :: IRET, IBO
    +
    167 #else
    +
    168  INTEGER(C_INT), INTENT(IN ) :: IP, IPOPT(20), KM, MI, MO
    +
    169  INTEGER(C_INT), INTENT(IN ) :: IBI, KGDSI(200), KGDSO(200)
    +
    170  INTEGER(C_INT), INTENT(INOUT) :: NO
    +
    171  INTEGER(C_INT), INTENT( OUT) :: IRET, IBO
    +
    172 #endif
    +
    173  !
    +
    174  LOGICAL(C_BOOL), INTENT(IN ) :: LI(MI)
    +
    175  LOGICAL(C_BOOL), INTENT( OUT) :: LO(MO)
    +
    176  !
    +
    177 #if (LSIZE==4)
    +
    178  REAL(C_FLOAT), INTENT(IN ) :: GI(MI)
    +
    179  REAL(C_FLOAT), INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    180  REAL(C_FLOAT), INTENT( OUT) :: GO(MO)
    +
    181 #else
    +
    182  REAL(C_DOUBLE), INTENT(IN ) :: GI(MI)
    +
    183  REAL(C_DOUBLE), INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    184  REAL(C_DOUBLE), INTENT( OUT) :: GO(MO)
    +
    185 #endif
    +
    186  !
    +
    187 
    +
    188  type(grib1_descriptor) :: desc_in, desc_out
    +
    189  class(ip_grid), allocatable :: grid_in, grid_out
    +
    190  integer :: ibo_array(1)
    +
    191 
    +
    192  desc_in = init_descriptor(kgdsi)
    +
    193  desc_out = init_descriptor(kgdso)
    +
    194 
    +
    195  call init_grid(grid_in, desc_in)
    +
    196  call init_grid(grid_out, desc_out)
    +
    197 
    +
    198  ! Can't pass expression (e.g. [ibo]) to intent(out) argument.
    +
    199  ! Initialize placeholder array of size 1 to make rank match.
    +
    200  ibo_array(1) = ibo
    +
    201 
    +
    202  call ipolates_grid(ip, ipopt, grid_in, grid_out, mi, mo, km, [ibi], li, gi, no, rlat, rlon, ibo_array, lo, go, iret)
    +
    203 
    +
    204  ibo = ibo_array(1)
    +
    205 
    +
    206  END SUBROUTINE ipolates_grib1_single_field
    +
    207 
    +
    293  subroutine ipolates_grib1(ip,ipopt,kgdsi,kgdso,mi,mo,km,ibi,li,gi, &
    +
    294  no,rlat,rlon,ibo,lo,go,iret) bind(c)
    +
    295  !
    +
    296  USE iso_c_binding, ONLY: c_int, c_float, c_double, c_bool, c_long
    +
    297 #if (LSIZE==8)
    +
    298  INTEGER(C_LONG), INTENT(IN ) :: IP, IPOPT(20), KM, MI, MO
    +
    299  INTEGER(C_LONG), INTENT(IN ) :: IBI(KM), KGDSI(200), KGDSO(200)
    +
    300  INTEGER(C_LONG), INTENT(INOUT) :: NO
    +
    301  INTEGER(C_LONG), INTENT( OUT) :: IRET, IBO(KM)
    +
    302 #else
    +
    303  INTEGER(C_INT), INTENT(IN ) :: IP, IPOPT(20), KM, MI, MO
    +
    304  INTEGER(C_INT), INTENT(IN ) :: IBI(KM), KGDSI(200), KGDSO(200)
    +
    305  INTEGER(C_INT), INTENT(INOUT) :: NO
    +
    306  INTEGER(C_INT), INTENT( OUT) :: IRET, IBO(KM)
    +
    307 #endif
    +
    308  !
    +
    309  LOGICAL(C_BOOL), INTENT(IN ) :: LI(MI,KM)
    +
    310  LOGICAL(C_BOOL), INTENT( OUT) :: LO(MO,KM)
    +
    311  !
    +
    312 #if (LSIZE==4)
    +
    313  REAL(C_FLOAT), INTENT(IN ) :: GI(MI,KM)
    +
    314  REAL(C_FLOAT), INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    315  REAL(C_FLOAT), INTENT( OUT) :: GO(MO,KM)
    +
    316 #else
    +
    317  REAL(C_DOUBLE), INTENT(IN ) :: GI(MI,KM)
    +
    318  REAL(C_DOUBLE), INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    319  REAL(C_DOUBLE), INTENT( OUT) :: GO(MO,KM)
    +
    320 #endif
    +
    321  !
    +
    322 
    +
    323  type(grib1_descriptor) :: desc_in, desc_out
    +
    324  class(ip_grid), allocatable :: grid_in, grid_out
    +
    325 
    +
    326  desc_in = init_descriptor(kgdsi)
    +
    327  desc_out = init_descriptor(kgdso)
    +
    328 
    +
    329  call init_grid(grid_in, desc_in)
    +
    330  call init_grid(grid_out, desc_out)
    +
    331 
    +
    332  call ipolates_grid(ip, ipopt, grid_in, grid_out, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
    +
    333 
    +
    334  END SUBROUTINE ipolates_grib1
    +
    335 
    +
    587  SUBROUTINE ipolates_grib2(IP,IPOPT,IGDTNUMI,IGDTMPLI,IGDTLENI, &
    +
    588  IGDTNUMO,IGDTMPLO,IGDTLENO, &
    +
    589  MI,MO,KM,IBI,LI,GI, &
    +
    590  NO,RLAT,RLON,IBO,LO,GO,IRET) bind(C)
    +
    591  USE iso_c_binding, ONLY: c_int, c_float, c_double, c_bool, c_long
    +
    592 #if (LSIZE==8)
    +
    593  INTEGER(C_LONG), INTENT(IN ) :: IP, IPOPT(20), KM, MI, MO
    +
    594  INTEGER(C_LONG), INTENT(IN ) :: IBI(KM)
    +
    595  INTEGER(C_LONG), INTENT(IN ) :: IGDTNUMI, IGDTLENI
    +
    596  INTEGER(C_LONG), INTENT(IN ) :: IGDTMPLI(IGDTLENI)
    +
    597  INTEGER(C_LONG), INTENT(IN ) :: IGDTNUMO, IGDTLENO
    +
    598  INTEGER(C_LONG), INTENT(IN ) :: IGDTMPLO(IGDTLENO)
    +
    599  INTEGER(C_LONG), INTENT( OUT) :: NO
    +
    600  INTEGER(C_LONG), INTENT( OUT) :: IRET, IBO(KM)
    +
    601 #else
    +
    602  INTEGER(C_INT), INTENT(IN ) :: IP, IPOPT(20), KM, MI, MO
    +
    603  INTEGER(C_INT), INTENT(IN ) :: IBI(KM)
    +
    604  INTEGER(C_INT), INTENT(IN ) :: IGDTNUMI, IGDTLENI
    +
    605  INTEGER(C_INT), INTENT(IN ) :: IGDTMPLI(IGDTLENI)
    +
    606  INTEGER(C_INT), INTENT(IN ) :: IGDTNUMO, IGDTLENO
    +
    607  INTEGER(C_INT), INTENT(IN ) :: IGDTMPLO(IGDTLENO)
    +
    608  INTEGER(C_INT), INTENT( OUT) :: NO
    +
    609  INTEGER(C_INT), INTENT( OUT) :: IRET, IBO(KM)
    +
    610 #endif
    +
    611  !
    +
    612  LOGICAL(C_BOOL), INTENT(IN ) :: LI(MI,KM)
    +
    613  LOGICAL(C_BOOL), INTENT( OUT) :: LO(MO,KM)
    +
    614  !
    +
    615 #if (LSIZE==4)
    +
    616  REAL(C_FLOAT), INTENT(IN ) :: GI(MI,KM)
    +
    617  REAL(C_FLOAT), INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    618  REAL(C_FLOAT), INTENT( OUT) :: GO(MO,KM)
    +
    619 #else
    +
    620  REAL(C_DOUBLE), INTENT(IN ) :: GI(MI,KM)
    +
    621  REAL(C_DOUBLE), INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    622  REAL(C_DOUBLE), INTENT( OUT) :: GO(MO,KM)
    +
    623 #endif
    +
    624 
    +
    625  type(grib2_descriptor) :: desc_in, desc_out
    +
    626  class(ip_grid), allocatable :: grid_in, grid_out
    +
    627 
    +
    628  desc_in = init_descriptor(igdtnumi, igdtleni, igdtmpli)
    +
    629  desc_out = init_descriptor(igdtnumo, igdtleno, igdtmplo)
    +
    630 
    +
    631  call init_grid(grid_in, desc_in)
    +
    632  call init_grid(grid_out, desc_out)
    +
    633 
    +
    634  CALL ipolates_grid(ip,ipopt,grid_in,grid_out,mi,mo,km,ibi,li,gi,no,rlat,rlon,ibo,lo,go,iret)
    +
    635 
    +
    636  END SUBROUTINE ipolates_grib2
    +
    637 
    +
    808  SUBROUTINE ipolates_grib2_single_field(IP,IPOPT,IGDTNUMI,IGDTMPLI,IGDTLENI, &
    +
    809  IGDTNUMO,IGDTMPLO,IGDTLENO, &
    +
    810  MI,MO,KM,IBI,LI,GI, &
    +
    811  NO,RLAT,RLON,IBO,LO,GO,IRET) bind(C)
    +
    812  USE iso_c_binding, ONLY: c_int, c_float, c_double, c_bool, c_long
    +
    813 #if (LSIZE==8)
    +
    814  INTEGER(C_LONG), INTENT(IN ) :: IP, IPOPT(20), KM, MI, MO
    +
    815  INTEGER(C_LONG), INTENT(IN ) :: IBI
    +
    816  INTEGER(C_LONG), INTENT(IN ) :: IGDTNUMI, IGDTLENI
    +
    817  INTEGER(C_LONG), INTENT(IN ) :: IGDTMPLI(IGDTLENI)
    +
    818  INTEGER(C_LONG), INTENT(IN ) :: IGDTNUMO, IGDTLENO
    +
    819  INTEGER(C_LONG), INTENT(IN ) :: IGDTMPLO(IGDTLENO)
    +
    820  INTEGER(C_LONG), INTENT( OUT) :: NO
    +
    821  INTEGER(C_LONG), INTENT( OUT) :: IRET, IBO
    +
    822 #else
    +
    823  INTEGER(C_INT), INTENT(IN ) :: IP, IPOPT(20), KM, MI, MO
    +
    824  INTEGER(C_INT), INTENT(IN ) :: IBI
    +
    825  INTEGER(C_INT), INTENT(IN ) :: IGDTNUMI, IGDTLENI
    +
    826  INTEGER(C_INT), INTENT(IN ) :: IGDTMPLI(IGDTLENI)
    +
    827  INTEGER(C_INT), INTENT(IN ) :: IGDTNUMO, IGDTLENO
    +
    828  INTEGER(C_INT), INTENT(IN ) :: IGDTMPLO(IGDTLENO)
    +
    829  INTEGER(C_INT), INTENT( OUT) :: NO
    +
    830  INTEGER(C_INT), INTENT( OUT) :: IRET, IBO
    +
    831 #endif
    +
    832  !
    +
    833  LOGICAL(C_BOOL), INTENT(IN ) :: LI(MI)
    +
    834  LOGICAL(C_BOOL), INTENT( OUT) :: LO(MO)
    +
    835  !
    +
    836 #if (LSIZE==4)
    +
    837  REAL(C_FLOAT), INTENT(IN ) :: GI(MI)
    +
    838  REAL(C_FLOAT), INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    839  REAL(C_FLOAT), INTENT( OUT) :: GO(MO)
    +
    840 #else
    +
    841  REAL(C_DOUBLE), INTENT(IN ) :: GI(MI)
    +
    842  REAL(C_DOUBLE), INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    843  REAL(C_DOUBLE), INTENT( OUT) :: GO(MO)
    +
    844 #endif
    +
    845 
    +
    846  type(grib2_descriptor) :: desc_in, desc_out
    +
    847  class(ip_grid), allocatable :: grid_in, grid_out
    +
    848  integer :: ibo_array(1)
    +
    849 
    +
    850  desc_in = init_descriptor(igdtnumi, igdtleni, igdtmpli)
    +
    851  desc_out = init_descriptor(igdtnumo, igdtleno, igdtmplo)
    +
    852 
    +
    853  call init_grid(grid_in, desc_in)
    +
    854  call init_grid(grid_out, desc_out)
    +
    855 
    +
    856  ! Can't pass expression (e.g. [ibo]) to intent(out) argument.
    +
    857  ! Initialize placeholder array of size 1 to make rank match.
    +
    858  ibo_array(1) = ibo
    +
    859 
    +
    860  call ipolates_grid(ip,ipopt,grid_in,grid_out,mi,mo,km,[ibi],li,gi,no,rlat,rlon,ibo_array,lo,go,iret)
    +
    861 
    +
    862  ibo = ibo_array(1)
    +
    863 
    +
    864  END SUBROUTINE ipolates_grib2_single_field
    +
    865 
    +
    866 end module ipolates_mod
    +
    867 
    + + + +
    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
    +
    Routines for creating an ip_grid given a Grib descriptor.
    +
    Abstract ip_grid type.
    Definition: ip_grid_mod.F90:10
    +
    Top-level module to export interpolation routines and constants.
    +
    integer, parameter, public neighbor_interp_id
    +
    integer, parameter, public bilinear_interp_id
    +
    integer, parameter, public budget_interp_id
    +
    integer, parameter, public spectral_interp_id
    +
    integer, parameter, public bicubic_interp_id
    +
    integer, parameter, public neighbor_budget_interp_id
    +
    Top-level driver for scalar interpolation interpolation routine ipolates().
    Definition: ipolates.F90:12
    +
    subroutine ipolates_grid(ip, ipopt, grid_in, grid_out, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
    Interpolates scalar fields between grids given ip_grid objects.
    Definition: ipolates.F90:65
    +
    subroutine, public ipolates_grib2_single_field(IP, IPOPT, IGDTNUMI, IGDTMPLI, IGDTLENI, IGDTNUMO, IGDTMPLO, IGDTLENO, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
    Special case of ipolates_grib2 when interpolating a single field.
    Definition: ipolates.F90:812
    +
    subroutine, public ipolates_grib2(IP, IPOPT, IGDTNUMI, IGDTMPLI, IGDTLENI, IGDTNUMO, IGDTMPLO, IGDTLENO, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
    This subprogram interpolates scalar field from any grid to any grid given a grib2 descriptor.
    Definition: ipolates.F90:591
    +
    subroutine, public ipolates_grib1(ip, ipopt, kgdsi, kgdso, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
    This subprogram interpolates scalar field from any grid to any grid given a grib1 Grid Descriptor Sec...
    Definition: ipolates.F90:295
    +
    subroutine, public ipolates_grib1_single_field(ip, ipopt, kgdsi, kgdso, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
    Special case of ipolates_grib1 when interpolating a single field.
    Definition: ipolates.F90:160
    +
    Descriptor representing a grib1 grib descriptor section (GDS) with an integer array.
    +
    Grib-2 descriptor containing a grib2 GDT represented by an integer array.
    +
    Abstract grid that holds fields and methods common to all grids.
    Definition: ip_grid_mod.F90:58
    +
    +
    + + + + diff --git a/ver-5.1.0/ipolatev_8F90.html b/ver-5.1.0/ipolatev_8F90.html new file mode 100644 index 00000000..907e1784 --- /dev/null +++ b/ver-5.1.0/ipolatev_8F90.html @@ -0,0 +1,144 @@ + + + + + + + +NCEPLIBS-ip: ipolatev.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ipolatev.F90 File Reference
    +
    +
    + +

    Top-level driver for vector interpolation routine ipolates. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Data Types

    interface  ipolatev_mod::ipolatev
     
    + + + + +

    +Modules

    module  ipolatev_mod
     Top-level driver for vector interpolation interpolation routine ipolatev().
     
    + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine, public ipolatev_mod::ipolatev_grib1 (ip, ipopt, kgdsi, kgdso, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
     This subprogram interpolates vector field from any grid to any grid given a grib1 Grid Descriptor Section. More...
     
    subroutine, public ipolatev_mod::ipolatev_grib1_single_field (ip, ipopt, kgdsi, kgdso, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
     Special case of ipolatev_grib1 when interpolating a single field. More...
     
    subroutine, public ipolatev_mod::ipolatev_grib2 (ip, ipopt, igdtnumi, igdtmpli, igdtleni, igdtnumo, igdtmplo, igdtleno, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
     This subprogram interpolates vector fields from any grid to any grid given a grib2 descriptor. More...
     
    subroutine, public ipolatev_mod::ipolatev_grib2_single_field (ip, ipopt, igdtnumi, igdtmpli, igdtleni, igdtnumo, igdtmplo, igdtleno, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
     This subprogram interpolates vector fields from any grid to any grid given a grib2 descriptor. More...
     
    subroutine ipolatev_mod::ipolatev_grid (IP, IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     Interpolates vector fields between grids given ip_grid objects. More...
     
    +

    Detailed Description

    +

    Top-level driver for vector interpolation routine ipolates.

    +
    Author
    Mark Iredell, Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition in file ipolatev.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/ipolatev_8F90.js b/ver-5.1.0/ipolatev_8F90.js new file mode 100644 index 00000000..ecf26618 --- /dev/null +++ b/ver-5.1.0/ipolatev_8F90.js @@ -0,0 +1,9 @@ +var ipolatev_8F90 = +[ + [ "ipolatev", "interfaceipolatev__mod_1_1ipolatev.html", "interfaceipolatev__mod_1_1ipolatev" ], + [ "ipolatev_grib1", "ipolatev_8F90.html#abddc4a9b00133b358443b118f1352d1f", null ], + [ "ipolatev_grib1_single_field", "ipolatev_8F90.html#ad535ffd159c46e770effd774aabede58", null ], + [ "ipolatev_grib2", "ipolatev_8F90.html#a00fed53dd867a802b3adbc1141e8d272", null ], + [ "ipolatev_grib2_single_field", "ipolatev_8F90.html#a71d7507e8f89e1229caaaacb37e0c9c7", null ], + [ "ipolatev_grid", "ipolatev_8F90.html#a8f3bfec7495e13b75b2035e8e1f081a1", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ipolatev_8F90_source.html b/ver-5.1.0/ipolatev_8F90_source.html new file mode 100644 index 00000000..d0d61640 --- /dev/null +++ b/ver-5.1.0/ipolatev_8F90_source.html @@ -0,0 +1,451 @@ + + + + + + + +NCEPLIBS-ip: ipolatev.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ipolatev.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    4 
    + + + + +
    14  use ip_grid_mod
    +
    15 
    +
    16  implicit none
    +
    17 
    +
    18  private
    + +
    20 
    +
    21  interface ipolatev
    +
    22  module procedure ipolatev_grib1
    +
    23  module procedure ipolatev_grib1_single_field
    +
    24  module procedure ipolatev_grib2
    +
    25  module procedure ipolatev_grib2_single_field
    +
    26  end interface ipolatev
    +
    27 
    +
    28 contains
    +
    29 
    +
    67  SUBROUTINE ipolatev_grid(IP,IPOPT,grid_in,grid_out, &
    +
    68  MI,MO,KM,IBI,LI,UI,VI, &
    +
    69  NO,RLAT,RLON,CROT,SROT,IBO,LO,UO,VO,IRET)
    +
    70  class(ip_grid), intent(in) :: grid_in, grid_out
    +
    71  INTEGER, INTENT(IN ) :: IP, IPOPT(20), IBI(KM)
    +
    72  INTEGER, INTENT(IN ) :: KM, MI, MO
    +
    73  INTEGER, INTENT( OUT) :: IBO(KM), IRET, NO
    +
    74  !
    +
    75  LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
    +
    76  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
    +
    77  !
    +
    78  REAL, INTENT(IN ) :: UI(MI,KM),VI(MI,KM)
    +
    79  REAL, INTENT(INOUT) :: CROT(MO),SROT(MO)
    +
    80  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    81  REAL, INTENT( OUT) :: UO(MO,KM),VO(MO,KM)
    +
    82 
    +
    83  select case(ip)
    +
    84  case(bilinear_interp_id)
    +
    85  CALL interpolate_bilinear(ipopt,grid_in,grid_out, &
    +
    86  mi,mo,km,ibi,li,ui,vi,&
    +
    87  no,rlat,rlon,crot,srot,ibo,lo,uo,vo,iret)
    +
    88  case(bicubic_interp_id)
    +
    89  CALL interpolate_bicubic(ipopt,grid_in,grid_out,mi,mo,km,ibi,li,ui,vi,&
    +
    90  no,rlat,rlon,crot,srot,ibo,lo,uo,vo,iret)
    +
    91  case(neighbor_interp_id)
    +
    92  CALL interpolate_neighbor(ipopt,grid_in,grid_out,mi,mo,km,ibi,li,ui,vi,&
    +
    93  no,rlat,rlon,crot,srot,ibo,lo,uo,vo,iret)
    +
    94  case(budget_interp_id)
    +
    95  CALL interpolate_budget(ipopt,grid_in,grid_out,mi,mo,km,ibi,li,ui,vi,&
    +
    96  no,rlat,rlon,crot,srot,ibo,lo,uo,vo,iret)
    +
    97  case(spectral_interp_id)
    +
    98  CALL interpolate_spectral(ipopt,grid_in,grid_out, &
    +
    99  mi,mo,km,ibi,ui,vi,&
    +
    100  no,rlat,rlon,crot,srot,ibo,lo,uo,vo,iret)
    + +
    102  CALL interpolate_neighbor_budget(ipopt,grid_in,grid_out,mi,mo,km,ibi,li,ui,vi,&
    +
    103  no,rlat,rlon,crot,srot,ibo,lo,uo,vo,iret)
    +
    104  case default
    +
    105  print *, "unrecognized interpolation option: ", ip
    +
    106  error stop
    +
    107  ! IF(IGDTNUMO.GE.0) NO=0
    +
    108  ! DO K=1,KM
    +
    109  ! IBO(K)=1
    +
    110  ! DO N=1,NO
    +
    111  ! LO(N,K)=.FALSE.
    +
    112  ! UO(N,K)=0.
    +
    113  ! VO(N,K)=0.
    +
    114  ! ENDDO
    +
    115  ! ENDDO
    +
    116  ! IRET=1
    +
    117  end select
    +
    118 
    +
    119  end subroutine ipolatev_grid
    +
    120 
    +
    382  subroutine ipolatev_grib2(ip,ipopt,igdtnumi,igdtmpli,igdtleni, &
    +
    383  igdtnumo,igdtmplo,igdtleno, &
    +
    384  mi,mo,km,ibi,li,ui,vi, &
    +
    385  no,rlat,rlon,crot,srot,ibo,lo,uo,vo,iret) bind(c)
    +
    386  USE iso_c_binding, ONLY: c_int, c_float, c_double, c_bool, c_long
    +
    387 #if (LSIZE==8)
    +
    388  INTEGER(C_LONG), INTENT(IN ) :: IP, IPOPT(20), IBI(KM)
    +
    389  INTEGER(C_LONG), INTENT(IN ) :: KM, MI, MO
    +
    390  INTEGER(C_LONG), INTENT(IN ) :: IGDTNUMI, IGDTLENI
    +
    391  INTEGER(C_LONG), INTENT(IN ) :: IGDTMPLI(IGDTLENI)
    +
    392  INTEGER(C_LONG), INTENT(IN ) :: IGDTNUMO, IGDTLENO
    +
    393  INTEGER(C_LONG), INTENT(IN ) :: IGDTMPLO(IGDTLENO)
    +
    394  INTEGER(C_LONG), INTENT( OUT) :: IBO(KM), IRET, NO
    +
    395 #else
    +
    396  INTEGER(C_INT), INTENT(IN ) :: IP, IPOPT(20), IBI(KM)
    +
    397  INTEGER(C_INT), INTENT(IN ) :: KM, MI, MO
    +
    398  INTEGER(C_INT), INTENT(IN ) :: IGDTNUMI, IGDTLENI
    +
    399  INTEGER(C_INT), INTENT(IN ) :: IGDTMPLI(IGDTLENI)
    +
    400  INTEGER(C_INT), INTENT(IN ) :: IGDTNUMO, IGDTLENO
    +
    401  INTEGER(C_INT), INTENT(IN ) :: IGDTMPLO(IGDTLENO)
    +
    402  INTEGER(C_INT), INTENT( OUT) :: IBO(KM), IRET, NO
    +
    403 #endif
    +
    404  !
    +
    405  LOGICAL(C_BOOL), INTENT(IN ) :: LI(MI,KM)
    +
    406  LOGICAL(C_BOOL), INTENT( OUT) :: LO(MO,KM)
    +
    407  !
    +
    408 #if (LSIZE==4)
    +
    409  REAL(C_FLOAT), INTENT(IN ) :: UI(MI,KM),VI(MI,KM)
    +
    410  REAL(C_FLOAT), INTENT(INOUT) :: CROT(MO),SROT(MO)
    +
    411  REAL(C_FLOAT), INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    412  REAL(C_FLOAT), INTENT( OUT) :: UO(MO,KM),VO(MO,KM)
    +
    413 #else
    +
    414  REAL(C_DOUBLE), INTENT(IN ) :: UI(MI,KM),VI(MI,KM)
    +
    415  REAL(C_DOUBLE), INTENT(INOUT) :: CROT(MO),SROT(MO)
    +
    416  REAL(C_DOUBLE), INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    417  REAL(C_DOUBLE), INTENT( OUT) :: UO(MO,KM),VO(MO,KM)
    +
    418 #endif
    +
    419  !
    +
    420 
    +
    421  type(grib2_descriptor) :: desc_in, desc_out
    +
    422  class(ip_grid), allocatable :: grid_in, grid_out
    +
    423 
    +
    424  desc_in = init_descriptor(igdtnumi, igdtleni, igdtmpli)
    +
    425  desc_out = init_descriptor(igdtnumo, igdtleno, igdtmplo)
    +
    426 
    +
    427  call init_grid(grid_in, desc_in)
    +
    428  call init_grid(grid_out, desc_out)
    +
    429 
    +
    430  CALL ipolatev_grid(ip,ipopt,grid_in,grid_out, &
    +
    431  mi,mo,km,ibi,li,ui,vi,&
    +
    432  no,rlat,rlon,crot,srot,ibo,lo,uo,vo,iret)
    +
    433 
    +
    434  end subroutine ipolatev_grib2
    +
    435 
    +
    565  subroutine ipolatev_grib1(ip,ipopt,kgdsi,kgdso,mi,mo,km,ibi,li,ui,vi, &
    +
    566  no,rlat,rlon,crot,srot,ibo,lo,uo,vo,iret) bind(c)
    +
    567  USE iso_c_binding, ONLY: c_int, c_float, c_double, c_bool, c_long
    +
    568  IMPLICIT NONE
    +
    569  !
    +
    570 #if (LSIZE==8)
    +
    571  INTEGER(C_LONG), INTENT(IN ):: IP, IPOPT(20), IBI(KM)
    +
    572  INTEGER(C_LONG), INTENT(IN ):: KM, MI, MO
    +
    573  INTEGER(C_LONG), INTENT(INOUT):: KGDSI(200), KGDSO(200)
    +
    574  INTEGER(C_LONG), INTENT( OUT):: IBO(KM), IRET, NO
    +
    575 #else
    +
    576  INTEGER(C_INT), INTENT(IN ):: IP, IPOPT(20), IBI(KM)
    +
    577  INTEGER(C_INT), INTENT(IN ):: KM, MI, MO
    +
    578  INTEGER(C_INT), INTENT(INOUT):: KGDSI(200), KGDSO(200)
    +
    579  INTEGER(C_INT), INTENT( OUT):: IBO(KM), IRET, NO
    +
    580 #endif
    +
    581  !
    +
    582  LOGICAL(C_BOOL), INTENT(IN ):: LI(MI,KM)
    +
    583  LOGICAL(C_BOOL), INTENT( OUT):: LO(MO,KM)
    +
    584  !
    +
    585 #if (LSIZE==4)
    +
    586  REAL(C_FLOAT), INTENT(IN ):: UI(MI,KM),VI(MI,KM)
    +
    587  REAL(C_FLOAT), INTENT(INOUT):: CROT(MO),SROT(MO)
    +
    588  REAL(C_FLOAT), INTENT(INOUT):: RLAT(MO),RLON(MO)
    +
    589  REAL(C_FLOAT), INTENT( OUT):: UO(MO,KM),VO(MO,KM)
    +
    590 #else
    +
    591  REAL(C_DOUBLE), INTENT(IN ):: UI(MI,KM),VI(MI,KM)
    +
    592  REAL(C_DOUBLE), INTENT(INOUT):: CROT(MO),SROT(MO)
    +
    593  REAL(C_DOUBLE), INTENT(INOUT):: RLAT(MO),RLON(MO)
    +
    594  REAL(C_DOUBLE), INTENT( OUT):: UO(MO,KM),VO(MO,KM)
    +
    595 #endif
    +
    596  !
    +
    597  INTEGER :: KGDSI11, KGDSO11
    +
    598 
    +
    599  type(grib1_descriptor) :: desc_in, desc_out
    +
    600  class(ip_grid), allocatable :: grid_in, grid_out
    +
    601 
    +
    602  IF(kgdsi(1).EQ.203) THEN
    +
    603  kgdsi11=kgdsi(11)
    +
    604  kgdsi(11)=ior(kgdsi(11),256)
    +
    605  ENDIF
    +
    606  IF(kgdso(1).EQ.203) THEN
    +
    607  kgdso11=kgdso(11)
    +
    608  kgdso(11)=ior(kgdso(11),256)
    +
    609  ENDIF
    +
    610 
    +
    611  desc_in = init_descriptor(kgdsi)
    +
    612  desc_out = init_descriptor(kgdso)
    +
    613 
    +
    614  call init_grid(grid_in, desc_in)
    +
    615  call init_grid(grid_out, desc_out)
    +
    616 
    +
    617  CALL ipolatev_grid(ip,ipopt,grid_in,grid_out, &
    +
    618  mi,mo,km,ibi,li,ui,vi,&
    +
    619  no,rlat,rlon,crot,srot,ibo,lo,uo,vo,iret)
    +
    620 
    +
    621  IF(kgdsi(1).EQ.203) THEN
    +
    622  kgdsi(11)=kgdsi11
    +
    623  ENDIF
    +
    624  IF(kgdso(1).EQ.203) THEN
    +
    625  kgdso(11)=kgdso11
    +
    626  ENDIF
    +
    627 
    +
    628  END SUBROUTINE ipolatev_grib1
    +
    629 
    +
    680  subroutine ipolatev_grib1_single_field(ip,ipopt,kgdsi,kgdso,mi,mo,km,ibi,li,ui,vi, &
    +
    681  no,rlat,rlon,crot,srot,ibo,lo,uo,vo,iret) bind(c)
    +
    682  USE iso_c_binding, ONLY: c_int, c_float, c_double, c_bool, c_long
    +
    683  IMPLICIT NONE
    +
    684  !
    +
    685 #if (LSIZE==8)
    +
    686  INTEGER(C_LONG), INTENT(IN ):: IP, IPOPT(20), IBI
    +
    687  INTEGER(C_LONG), INTENT(IN ):: KM, MI, MO
    +
    688  INTEGER(C_LONG), INTENT(INOUT):: KGDSI(200), KGDSO(200)
    +
    689  INTEGER(C_LONG), INTENT( OUT):: IBO, IRET, NO
    +
    690 #else
    +
    691  INTEGER(C_INT), INTENT(IN ):: IP, IPOPT(20), IBI
    +
    692  INTEGER(C_INT), INTENT(IN ):: KM, MI, MO
    +
    693  INTEGER(C_INT), INTENT(INOUT):: KGDSI(200), KGDSO(200)
    +
    694  INTEGER(C_INT), INTENT( OUT):: IBO, IRET, NO
    +
    695 #endif
    +
    696  !
    +
    697  LOGICAL(C_BOOL), INTENT(IN ):: LI(MI)
    +
    698  LOGICAL(C_BOOL), INTENT( OUT):: LO(MO)
    +
    699  !
    +
    700 #if (LSIZE==4)
    +
    701  REAL(C_FLOAT), INTENT(IN ):: UI(MI),VI(MI)
    +
    702  REAL(C_FLOAT), INTENT(INOUT):: CROT(MO),SROT(MO)
    +
    703  REAL(C_FLOAT), INTENT(INOUT):: RLAT(MO),RLON(MO)
    +
    704  REAL(C_FLOAT), INTENT( OUT):: UO(MO),VO(MO)
    +
    705 #else
    +
    706  REAL(C_DOUBLE), INTENT(IN ):: UI(MI),VI(MI)
    +
    707  REAL(C_DOUBLE), INTENT(INOUT):: CROT(MO),SROT(MO)
    +
    708  REAL(C_DOUBLE), INTENT(INOUT):: RLAT(MO),RLON(MO)
    +
    709  REAL(C_DOUBLE), INTENT( OUT):: UO(MO),VO(MO)
    +
    710 #endif
    +
    711  !
    +
    712  INTEGER :: KGDSI11, KGDSO11
    +
    713 
    +
    714  type(grib1_descriptor) :: desc_in, desc_out
    +
    715  class(ip_grid), allocatable :: grid_in, grid_out
    +
    716  integer :: ibo_array(1)
    +
    717 
    +
    718  ! Can't pass expression (e.g. [ibo]) to intent(out) argument.
    +
    719  ! Initialize placeholder array of size 1 to make rank match.
    +
    720  ibo_array(1) = ibo
    +
    721 
    +
    722  IF(kgdsi(1).EQ.203) THEN
    +
    723  kgdsi11=kgdsi(11)
    +
    724  kgdsi(11)=ior(kgdsi(11),256)
    +
    725  ENDIF
    +
    726  IF(kgdso(1).EQ.203) THEN
    +
    727  kgdso11=kgdso(11)
    +
    728  kgdso(11)=ior(kgdso(11),256)
    +
    729  ENDIF
    +
    730 
    +
    731  desc_in = init_descriptor(kgdsi)
    +
    732  desc_out = init_descriptor(kgdso)
    +
    733 
    +
    734  call init_grid(grid_in, desc_in)
    +
    735  call init_grid(grid_out, desc_out)
    +
    736 
    +
    737  CALL ipolatev_grid(ip,ipopt,grid_in,grid_out, &
    +
    738  mi,mo,km,[ibi],li,ui,vi,&
    +
    739  no,rlat,rlon,crot,srot,ibo_array,lo,uo,vo,iret)
    +
    740 
    +
    741  ibo = ibo_array(1)
    +
    742 
    +
    743  IF(kgdsi(1).EQ.203) THEN
    +
    744  kgdsi(11)=kgdsi11
    +
    745  ENDIF
    +
    746  IF(kgdso(1).EQ.203) THEN
    +
    747  kgdso(11)=kgdso11
    +
    748  ENDIF
    +
    749 
    +
    750  END SUBROUTINE ipolatev_grib1_single_field
    +
    751 
    +
    832  subroutine ipolatev_grib2_single_field(ip,ipopt,igdtnumi,igdtmpli,igdtleni, &
    +
    833  igdtnumo,igdtmplo,igdtleno, &
    +
    834  mi,mo,km,ibi,li,ui,vi, &
    +
    835  no,rlat,rlon,crot,srot,ibo,lo,uo,vo,iret) bind(c)
    +
    836  USE iso_c_binding, ONLY: c_int, c_float, c_double, c_bool, c_long
    +
    837 #if (LSIZE==8)
    +
    838  INTEGER(C_LONG), INTENT(IN ) :: IP, IPOPT(20), IBI
    +
    839  INTEGER(C_LONG), INTENT(IN ) :: KM, MI, MO
    +
    840  INTEGER(C_LONG), INTENT(IN ) :: IGDTNUMI, IGDTLENI
    +
    841  INTEGER(C_LONG), INTENT(IN ) :: IGDTMPLI(IGDTLENI)
    +
    842  INTEGER(C_LONG), INTENT(IN ) :: IGDTNUMO, IGDTLENO
    +
    843  INTEGER(C_LONG), INTENT(IN ) :: IGDTMPLO(IGDTLENO)
    +
    844  INTEGER(C_LONG), INTENT( OUT) :: IBO, IRET, NO
    +
    845 #else
    +
    846  INTEGER(C_INT), INTENT(IN ) :: IP, IPOPT(20), IBI
    +
    847  INTEGER(C_INT), INTENT(IN ) :: KM, MI, MO
    +
    848  INTEGER(C_INT), INTENT(IN ) :: IGDTNUMI, IGDTLENI
    +
    849  INTEGER(C_INT), INTENT(IN ) :: IGDTMPLI(IGDTLENI)
    +
    850  INTEGER(C_INT), INTENT(IN ) :: IGDTNUMO, IGDTLENO
    +
    851  INTEGER(C_INT), INTENT(IN ) :: IGDTMPLO(IGDTLENO)
    +
    852  INTEGER(C_INT), INTENT( OUT) :: IBO, IRET, NO
    +
    853 #endif
    +
    854  !
    +
    855  LOGICAL(C_BOOL), INTENT(IN ) :: LI(MI)
    +
    856  LOGICAL(C_BOOL), INTENT( OUT) :: LO(MO)
    +
    857  !
    +
    858 #if (LSIZE==4)
    +
    859  REAL(C_FLOAT), INTENT(IN ) :: UI(MI),VI(MI)
    +
    860  REAL(C_FLOAT), INTENT(INOUT) :: CROT(MO),SROT(MO)
    +
    861  REAL(C_FLOAT), INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    862  REAL(C_FLOAT), INTENT( OUT) :: UO(MO),VO(MO)
    +
    863 #else
    +
    864  REAL(C_DOUBLE), INTENT(IN ) :: UI(MI),VI(MI)
    +
    865  REAL(C_DOUBLE), INTENT(INOUT) :: CROT(MO),SROT(MO)
    +
    866  REAL(C_DOUBLE), INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    867  REAL(C_DOUBLE), INTENT( OUT) :: UO(MO),VO(MO)
    +
    868 #endif
    +
    869  !
    +
    870 
    +
    871  type(grib2_descriptor) :: desc_in, desc_out
    +
    872  class(ip_grid), allocatable :: grid_in, grid_out
    +
    873  integer :: ibo_array(1)
    +
    874 
    +
    875  ! Can't pass expression (e.g. [ibo]) to intent(out) argument.
    +
    876  ! Initialize placeholder array of size 1 to make rank match.
    +
    877  ibo_array(1) = ibo
    +
    878 
    +
    879  desc_in = init_descriptor(igdtnumi, igdtleni, igdtmpli)
    +
    880  desc_out = init_descriptor(igdtnumo, igdtleno, igdtmplo)
    +
    881 
    +
    882  call init_grid(grid_in, desc_in)
    +
    883  call init_grid(grid_out, desc_out)
    +
    884 
    +
    885  CALL ipolatev_grid(ip,ipopt,grid_in,grid_out, &
    +
    886  mi,mo,km,[ibi],li,ui,vi,&
    +
    887  no,rlat,rlon,crot,srot,ibo_array,lo,uo,vo,iret)
    +
    888 
    +
    889  ibo = ibo_array(1)
    +
    890 
    +
    891  end subroutine ipolatev_grib2_single_field
    +
    892 
    +
    893 end module ipolatev_mod
    +
    894 
    + + + +
    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
    +
    Routines for creating an ip_grid given a Grib descriptor.
    +
    Abstract ip_grid type.
    Definition: ip_grid_mod.F90:10
    +
    Top-level module to export interpolation routines and constants.
    +
    integer, parameter, public neighbor_interp_id
    +
    integer, parameter, public bilinear_interp_id
    +
    integer, parameter, public budget_interp_id
    +
    integer, parameter, public spectral_interp_id
    +
    integer, parameter, public bicubic_interp_id
    +
    integer, parameter, public neighbor_budget_interp_id
    +
    Top-level driver for vector interpolation interpolation routine ipolatev().
    Definition: ipolatev.F90:10
    +
    subroutine, public ipolatev_grib2(ip, ipopt, igdtnumi, igdtmpli, igdtleni, igdtnumo, igdtmplo, igdtleno, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
    This subprogram interpolates vector fields from any grid to any grid given a grib2 descriptor.
    Definition: ipolatev.F90:386
    +
    subroutine, public ipolatev_grib2_single_field(ip, ipopt, igdtnumi, igdtmpli, igdtleni, igdtnumo, igdtmplo, igdtleno, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
    This subprogram interpolates vector fields from any grid to any grid given a grib2 descriptor.
    Definition: ipolatev.F90:836
    +
    subroutine ipolatev_grid(IP, IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
    Interpolates vector fields between grids given ip_grid objects.
    Definition: ipolatev.F90:70
    +
    subroutine, public ipolatev_grib1(ip, ipopt, kgdsi, kgdso, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
    This subprogram interpolates vector field from any grid to any grid given a grib1 Grid Descriptor Sec...
    Definition: ipolatev.F90:567
    +
    subroutine, public ipolatev_grib1_single_field(ip, ipopt, kgdsi, kgdso, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
    Special case of ipolatev_grib1 when interpolating a single field.
    Definition: ipolatev.F90:682
    +
    Descriptor representing a grib1 grib descriptor section (GDS) with an integer array.
    +
    Grib-2 descriptor containing a grib2 GDT represented by an integer array.
    +
    Abstract grid that holds fields and methods common to all grids.
    Definition: ip_grid_mod.F90:58
    +
    +
    + + + + diff --git a/ver-5.1.0/ipxetas_8F90.html b/ver-5.1.0/ipxetas_8F90.html new file mode 100644 index 00000000..23e41785 --- /dev/null +++ b/ver-5.1.0/ipxetas_8F90.html @@ -0,0 +1,290 @@ + + + + + + + +NCEPLIBS-ip: ipxetas.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ipxetas.F90 File Reference
    +
    +
    + +

    Expand or contract eta grids using linear interpolation. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine ipxetas (IDIR, IGDTNUMI, IGDTLEN, IGDTMPLI, NPTS_INPUT, BITMAP_INPUT, DATA_INPUT, IGDTNUMO, IGDTMPLO, NPTS_OUTPUT, BITMAP_OUTPUT, DATA_OUTPUT, IRET)
     Expand or contract eta grids using linear interpolation. More...
     
    +

    Detailed Description

    +

    Expand or contract eta grids using linear interpolation.

    +
    Author
    Iredell
    +
    Date
    96-04-10
    + +

    Definition in file ipxetas.F90.

    +

    Function/Subroutine Documentation

    + +

    ◆ ipxetas()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ipxetas (integer, intent(in) IDIR,
    integer, intent(in) IGDTNUMI,
    integer, intent(in) IGDTLEN,
    integer, dimension(igdtlen), intent(in) IGDTMPLI,
    integer, intent(in) NPTS_INPUT,
    logical(kind=1), dimension(npts_input), intent(in) BITMAP_INPUT,
    real, dimension(npts_input), intent(in) DATA_INPUT,
    integer, intent(out) IGDTNUMO,
    integer, dimension(igdtlen), intent(out) IGDTMPLO,
    integer, intent(in) NPTS_OUTPUT,
    logical(kind=1), dimension(npts_output), intent(out) BITMAP_OUTPUT,
    real, dimension(npts_output), intent(out) DATA_OUTPUT,
    integer, intent(out) IRET 
    )
    +
    + +

    Expand or contract eta grids using linear interpolation.

    +

    This subprogram transforms between the staggered eta grids as used in the eta model and for native grid transmission and their full expansion as used for general interpolation and graphics. The eta grids are rotated latitude-longitude grids staggered as defined by the arakawa e-grid, that is with mass data points alternating with wind data points.

    +

    This is similar to:

      +
    • ipxwafs2() which uses linear interpolation and accounts for
    • +
    • bitmapped data.
    • +
    • ipxwafs2() which uses neighbor interpolation and accounts for
    • +
    • bitmapped data.
    • +
    +

    +Program History Log

    + + + + + + + + + +
    Date Programmer Comments
    96-04-10 Iredell Initial
    2015-07-14 Gayno Make grib 2 compliant. Replace 4-pt interpolation with call to ipolates.
    2022-11-09 Engle Made ibi and ibo scalars.
    +
    Parameters
    + + + + + + + + + + + + + + +
    [in]idirinteger transform option.
      +
    • 0 to expand staggered fields to full fields
    • +
    • -1 to contract full mass fields to staggered fields
    • +
    • -2 to contract full wind fields to staggered fields
    • +
    +
    [in]igdtnumiinteger grid definition template number - input grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure. Must be = 1 (for a rotated lat/lon grid.)
    [in]igdtleninteger number of elements of the grid definition template array - same for input and output grids (=22) which are both rotated lat/lon grids. corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]igdtmpliinteger (igdtlen) grid definition template array - input grid. Corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure (section 3 info):
      +
    • 1 shape of earth, octet 15
        +
      • 2 scale factor of spherical earth radius, octet 16
      • +
      • 3 scaled value of radius of spherical earth, octets 17-20
      • +
      • 4 scale factor of major axis of elliptical earth, octet 21
      • +
      • 5 scaled value of major axis of elliptical earth, octets 22-25
      • +
      • 6 scale factor of minor axis of elliptical earth, octet 26
      • +
      • 7 scaled value of minor axis of elliptical earth, octets 27-30
      • +
      • 8 number of points along a parallel, octs 31-34
      • +
      • 9 number of points along a meridian, octs 35-38
      • +
      • 10 basic angle of initial production domain, octets 39-42
      • +
      • 11 subdivisions of basic angle, octets 43-46
      • +
      • 12 latitude of first grid point, octets 47-50
      • +
      • 13 longitude of first grid point, octets 51-54
      • +
      • 14 resolution and component flags, octet 55
      • +
      • 15 latitude of last grid point, octets 56-59
      • +
      • 16 longitude of last grid point, octets 60-63
      • +
      • 17 i-direction increment, octets 64-67
      • +
      • 18 j-direction increment, octets 68-71
      • +
      • 19 scanning mode, octet 72
      • +
      • 20 latitude of southern pole of projection, octets 73-76
      • +
      • 21 longitude of southern pole of projection, octets 77-80
      • +
      • 22 angle of rotation of projection, octs 81-84
      • +
      +
    • +
    +
    [in]npts_inputinteger number points input grid
    [in]bitmap_inputlogical (npts_input) input grid bitmap
    [in]data_inputreal (npts_input) input grid data
    [out]igdtnumointeger grid definition template number - output grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure. Same as igdtnumi (=1 for a rotated lat/lon grid).
    [out]igdtmplointeger (igdtlen) grid definition template array - output grid. Corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure. Array definitions same as "igdtmpli".
    [out]npts_outputinteger number points output grid. the j-dimension of the input and output grids are the same. When going from a staggered to a full grid the i-dimension increases to idim*2-1. When going from full to staggered the i-dimension decreases to (idim+1)/2.
    [out]bitmap_outputlogical (npts_outut) output grid bitmap
    [out]data_outputreal (npts_output) output grid data
    [out]iretinteger return code
      +
    • 0 successful transformation
    • +
    • non-0 invalid grid specs or problem in ipolates().
    • +
    +
    +
    +
    + +

    Definition at line 90 of file ipxetas.F90.

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/ipxetas_8F90.js b/ver-5.1.0/ipxetas_8F90.js new file mode 100644 index 00000000..d61378ad --- /dev/null +++ b/ver-5.1.0/ipxetas_8F90.js @@ -0,0 +1,4 @@ +var ipxetas_8F90 = +[ + [ "ipxetas", "ipxetas_8F90.html#a89ff34ee39b0da1895e9d8552bb462e1", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ipxetas_8F90_source.html b/ver-5.1.0/ipxetas_8F90_source.html new file mode 100644 index 00000000..03db0b2d --- /dev/null +++ b/ver-5.1.0/ipxetas_8F90_source.html @@ -0,0 +1,222 @@ + + + + + + + +NCEPLIBS-ip: ipxetas.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ipxetas.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    4 
    +
    40 
    +
    44 
    +
    89 ! @author Iredell @date 96-04-10
    +
    90  SUBROUTINE ipxetas(IDIR, IGDTNUMI, IGDTLEN, IGDTMPLI, NPTS_INPUT, &
    +
    91  BITMAP_INPUT, DATA_INPUT, IGDTNUMO, IGDTMPLO, &
    +
    92  NPTS_OUTPUT, BITMAP_OUTPUT, DATA_OUTPUT, IRET)
    +
    93  USE ipolates_mod
    +
    94  IMPLICIT NONE
    +
    95 !
    +
    96  INTEGER, INTENT(IN ) :: IDIR
    +
    97  INTEGER, INTENT(IN ) :: IGDTNUMI, IGDTLEN
    +
    98  INTEGER, INTENT(IN ) :: IGDTMPLI(IGDTLEN)
    +
    99  INTEGER, INTENT(IN ) :: NPTS_INPUT, NPTS_OUTPUT
    +
    100  INTEGER, INTENT( OUT) :: IGDTNUMO
    +
    101  INTEGER, INTENT( OUT) :: IGDTMPLO(IGDTLEN)
    +
    102  INTEGER, INTENT( OUT) :: IRET
    +
    103 
    +
    104  LOGICAL(KIND=1), INTENT(IN ) :: BITMAP_INPUT(NPTS_INPUT)
    +
    105  LOGICAL(KIND=1), INTENT( OUT) :: BITMAP_OUTPUT(NPTS_OUTPUT)
    +
    106 
    +
    107  REAL, INTENT(IN ) :: DATA_INPUT(NPTS_INPUT)
    +
    108  REAL, INTENT( OUT) :: DATA_OUTPUT(NPTS_OUTPUT)
    +
    109 
    +
    110  INTEGER :: SCAN_MODE, ISCALE, IP, IPOPT(20)
    +
    111  INTEGER :: IBI, IBO, J, KM, NO
    +
    112 
    +
    113  REAL :: DLONS
    +
    114  REAL, ALLOCATABLE :: OUTPUT_RLAT(:), OUTPUT_RLON(:)
    +
    115 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    116  iret = 0
    +
    117 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    118 ! ROUTINE ONLY WORKS FOR ROTATED LAT/LON GRIDS.
    +
    119  IF (igdtnumi/=1) THEN
    +
    120  iret=1
    +
    121  RETURN
    +
    122  ENDIF
    +
    123 !
    +
    124  scan_mode=igdtmpli(19)
    +
    125  IF((scan_mode==68.OR.scan_mode==72).AND.(idir<-2.OR.idir>-1))THEN
    +
    126  igdtnumo=igdtnumi
    +
    127  igdtmplo=igdtmpli
    +
    128  igdtmplo(19)=64
    +
    129  igdtmplo(8)=igdtmplo(8)*2-1
    +
    130  IF((igdtmplo(8)*igdtmplo(9))/=npts_output)THEN
    +
    131  iret=3
    +
    132  RETURN
    +
    133  ENDIF
    +
    134  iscale=igdtmplo(10)*igdtmplo(11)
    +
    135  IF(iscale==0) iscale=10**6
    +
    136  dlons=float(igdtmplo(17))/float(iscale)
    +
    137  dlons=dlons*0.5
    +
    138  igdtmplo(17)=nint(dlons*float(iscale))
    +
    139  ELSEIF(scan_mode==64.AND.idir==-1)THEN ! FULL TO H-GRID
    +
    140  igdtnumo=igdtnumi
    +
    141  igdtmplo=igdtmpli
    +
    142  igdtmplo(19)=68
    +
    143  igdtmplo(8)=(igdtmplo(8)+1)/2
    +
    144  IF((igdtmplo(8)*igdtmplo(9))/=npts_output)THEN
    +
    145  iret=3
    +
    146  RETURN
    +
    147  ENDIF
    +
    148  iscale=igdtmplo(10)*igdtmplo(11)
    +
    149  IF(iscale==0) iscale=10**6
    +
    150  dlons=float(igdtmplo(17))/float(iscale)
    +
    151  dlons=dlons*2.0
    +
    152  igdtmplo(17)=nint(dlons*float(iscale))
    +
    153  ELSEIF(scan_mode==64.AND.idir==-2)THEN ! FULL TO V-GRID
    +
    154  igdtnumo=igdtnumi
    +
    155  igdtmplo=igdtmpli
    +
    156  igdtmplo(19)=72
    +
    157  igdtmplo(8)=(igdtmplo(8)+1)/2
    +
    158  IF((igdtmplo(8)*igdtmplo(9))/=npts_output)THEN
    +
    159  iret=3
    +
    160  RETURN
    +
    161  ENDIF
    +
    162  iscale=igdtmplo(10)*igdtmplo(11)
    +
    163  IF(iscale==0) iscale=10**6
    +
    164  dlons=float(igdtmplo(17))/float(iscale)
    +
    165  dlons=dlons*2.0
    +
    166  igdtmplo(17)=nint(dlons*float(iscale))
    +
    167  ELSE
    +
    168  iret=2
    +
    169  RETURN
    +
    170  ENDIF
    +
    171 
    +
    172  km=1
    +
    173  ip=0
    +
    174  ipopt=0
    +
    175  ibi=1
    +
    176  ibo=0
    +
    177 
    +
    178  ALLOCATE(output_rlat(npts_output))
    +
    179  ALLOCATE(output_rlon(npts_output))
    +
    180 
    +
    181  CALL ipolates(ip, ipopt, igdtnumi, igdtmpli, igdtlen, &
    +
    182  igdtnumo, igdtmplo, igdtlen, &
    +
    183  npts_input, npts_output, km, ibi, bitmap_input, data_input, &
    +
    184  no, output_rlat, output_rlon, ibo, bitmap_output, data_output, iret)
    +
    185 
    +
    186  DEALLOCATE(output_rlat, output_rlon)
    +
    187 
    +
    188  IF(iret /= 0)THEN
    +
    189  print*,'- PROBLEM IN IPOLATES: ', iret
    +
    190  RETURN
    +
    191  ENDIF
    +
    192 
    +
    193 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    194 ! REPLACE ANY UNDEFINED POINTS ALONG THE LEFT AND RIGHT EDGES.
    +
    195  DO j=1, igdtmplo(9)
    +
    196  bitmap_output(j*igdtmplo(8))=bitmap_output(j*igdtmplo(8)-1)
    +
    197  data_output(j*igdtmplo(8))=data_output(j*igdtmplo(8)-1)
    +
    198  bitmap_output((j-1)*igdtmplo(8)+1)=bitmap_output((j-1)*igdtmplo(8)+2)
    +
    199  data_output((j-1)*igdtmplo(8)+1)=data_output((j-1)*igdtmplo(8)+2)
    +
    200  ENDDO
    +
    201 
    +
    202  RETURN
    +
    203 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    204  END SUBROUTINE ipxetas
    + +
    subroutine ipxetas(IDIR, IGDTNUMI, IGDTLEN, IGDTMPLI, NPTS_INPUT, BITMAP_INPUT, DATA_INPUT, IGDTNUMO, IGDTMPLO, NPTS_OUTPUT, BITMAP_OUTPUT, DATA_OUTPUT, IRET)
    Expand or contract eta grids using linear interpolation.
    Definition: ipxetas.F90:93
    +
    Top-level driver for scalar interpolation interpolation routine ipolates().
    Definition: ipolates.F90:12
    +
    +
    + + + + diff --git a/ver-5.1.0/ipxwafs2_8F90.html b/ver-5.1.0/ipxwafs2_8F90.html new file mode 100644 index 00000000..d42845f3 --- /dev/null +++ b/ver-5.1.0/ipxwafs2_8F90.html @@ -0,0 +1,308 @@ + + + + + + + +NCEPLIBS-ip: ipxwafs2.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ipxwafs2.F90 File Reference
    +
    +
    + +

    Expand or contract wafs grids using linear interpolation and account for bitmapped data. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine ipxwafs2 (IDIR, NUMPTS_THIN, NUMPTS_FULL, KM, NUM_OPT, OPT_PTS, IGDTLEN, IGDTMPL_THIN, DATA_THIN, IB_THIN, BITMAP_THIN, IGDTMPL_FULL, DATA_FULL, IB_FULL, BITMAP_FULL, IRET)
     Expand or contract wafs grids using linear interpolation and account for bitmapped data. More...
     
    +

    Detailed Description

    +

    Expand or contract wafs grids using linear interpolation and account for bitmapped data.

    +
    Author
    Iredell
    +
    Date
    96-04-10
    + +

    Definition in file ipxwafs2.F90.

    +

    Function/Subroutine Documentation

    + +

    ◆ ipxwafs2()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ipxwafs2 (integer, intent(in) IDIR,
    integer, intent(in) NUMPTS_THIN,
    integer, intent(in) NUMPTS_FULL,
    integer, intent(in) KM,
    integer, intent(in) NUM_OPT,
    integer, dimension(num_opt), intent(inout) OPT_PTS,
    integer, intent(in) IGDTLEN,
    integer, dimension(igdtlen), intent(inout) IGDTMPL_THIN,
    real, dimension(numpts_thin,km), intent(inout) DATA_THIN,
    integer, dimension(km), intent(inout) IB_THIN,
    logical(kind=1), dimension(numpts_thin,km), intent(inout) BITMAP_THIN,
    integer, dimension(igdtlen), intent(inout) IGDTMPL_FULL,
    real, dimension(numpts_full,km), intent(inout) DATA_FULL,
    integer, dimension(km), intent(inout) IB_FULL,
    logical(kind=1), dimension(numpts_full,km), intent(inout) BITMAP_FULL,
    integer, intent(out) IRET 
    )
    +
    + +

    Expand or contract wafs grids using linear interpolation and account for bitmapped data.

    +

    This subprogram transforms between the thinned wafs grids used for transmitting to the aviation community and their full expansion as used for general interpolation and graphics. The thinned wafs grids are latitude-longitude grids where the number of points in each row decrease toward the pole. This information is stored in the grib 2 grid definition template (section 3) starting at octet 73.

    +

    The full grid counterparts have an equal number of points per row.

    +

    The transform between the full and thinned wafs wafs grid is done by linear interpolation and is not reversible. This routine works with bitmapped data.

    +

    This subroutine is similar to:

      +
    • ipxwafs() which uses linear interpolation.
    • +
    • ipxwafs3() which uses neighbor interpolation and accounts for
    • +
    • bitmapped data.
    • +
    +

    +Program History Log

    + + + + + + + + + +
    Date Programmer Comments
    96-04-10 iredell initial version
    99-01-25 gilbert changed bitmap fields from logical to logical*1
    2015-jul gayno convert to grib 2
    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]idirinteger transform option
      +
    • 1 to expand thinned fields to full fields
    • +
    • -1 to contract full fields to thinned fields
    • +
    +
    [in]numpts_thininteger number of grid points - thinned grid. Must be 3447.
    [in]numpts_fullinteger number of grid points - full grid. Must be 5329.
    [in]kminteger number of fields to transform
    [in]num_optinteger number of values to describe the thinned grid. must be 73. dimension of array opt_pts.
    [in,out]opt_ptsinteger (num_opt) number of grid points per row - thinned grid - if idir=+1
    [in]igdtleninteger grid defintion template array length. must be 19 for lat/lon grids. corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure. same for thin and full grids which are both lat/lon.
    [in]igdtmpl_thininteger (igdtlen) grid definition template array - thinned grid - if idir=+1. corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure (section 3 info):
      +
    • 1 shape of earth, octet 15
    • +
    • 2 scale factor of spherical earth radius, octet 16
    • +
    • 3 scaled value of radius of spherical earth, octets 17-20
    • +
    • 4 scale factor of major axis of elliptical earth, octet 21
    • +
    • 5 scaled value of major axis of elliptical earth, octets 22-25
    • +
    • 6 scale factor of minor axis of elliptical earth, octet 26
    • +
    • 7 scaled value of minor axis of elliptical earth, octets 27-30
    • +
    • 8 set to missing for thinned grid., octs 31-34
    • +
    • 9 number of points along a meridian, octs 35-38
    • +
    • 10 basic angle of initial production domain, octets 39-42.
    • +
    • 11 subdivisions of basic angle, octets 43-46
    • +
    • 12 latitude of first grid point, octets 47-50
    • +
    • 13 longitude of first grid point, octets 51-54
    • +
    • 14 resolution and component flags, octet 55
    • +
    • 15 latitude of last grid point, octets 56-59
    • +
    • 16 longitude of last grid point, octets 60-63
    • +
    • 17 set to missing for thinned grid, octets 64-67
    • +
    • 18 j-direction increment, octets 68-71
    • +
    • 19 scanning mode, octet 72
    • +
    +
    [in,out]data_thinreal (numpts_thin,km) thinned grid fields if idir=+1
    [in,out]ib_thininteger (km) bitmap flags thinned grid - if idir=+1
    [in,out]bitmap_thinlogical (numpts_thin,km) bitmap fields thin grid - if idir=+1
    [in,out]igdtmpl_fullinteger (igdtlen) grid definition template array - full grid - if idir=-1. corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure. same as igdtmpl_thin except: (8): number of points along a parallel, octs 31-34 (17): i-direction increment, octets 64-67
    [in,out]data_fullreal (numpts_full,km) full grid fields if idir=-1
    [in,out]ib_fullinteger (km) bitmap flags full grid - if idir=-1
    [in,out]bitmap_fulllogical (numpts_full,km) bitmap fields full grid - if idir=-1
    [out]iretinteger return code
      +
    • 0 successful transformation
    • +
    • 1 improper grid specification
    • +
    +
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    + +

    Definition at line 89 of file ipxwafs2.F90.

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/ipxwafs2_8F90.js b/ver-5.1.0/ipxwafs2_8F90.js new file mode 100644 index 00000000..524b1d34 --- /dev/null +++ b/ver-5.1.0/ipxwafs2_8F90.js @@ -0,0 +1,4 @@ +var ipxwafs2_8F90 = +[ + [ "ipxwafs2", "ipxwafs2_8F90.html#ab602c9c04957836c0b8860560d442894", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ipxwafs2_8F90_source.html b/ver-5.1.0/ipxwafs2_8F90_source.html new file mode 100644 index 00000000..49afe29e --- /dev/null +++ b/ver-5.1.0/ipxwafs2_8F90_source.html @@ -0,0 +1,267 @@ + + + + + + + +NCEPLIBS-ip: ipxwafs2.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ipxwafs2.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    5 
    +
    89 SUBROUTINE ipxwafs2(IDIR, NUMPTS_THIN, NUMPTS_FULL, KM, NUM_OPT, OPT_PTS, &
    +
    90  IGDTLEN, IGDTMPL_THIN, DATA_THIN, IB_THIN, BITMAP_THIN, &
    +
    91  IGDTMPL_FULL, DATA_FULL, IB_FULL, BITMAP_FULL, IRET)
    +
    92  IMPLICIT NONE
    +
    93  !
    +
    94  INTEGER, INTENT(IN ) :: NUM_OPT
    +
    95  INTEGER, INTENT(INOUT) :: OPT_PTS(NUM_OPT)
    +
    96  INTEGER, INTENT(IN ) :: IDIR, KM, NUMPTS_THIN, NUMPTS_FULL
    +
    97  INTEGER, INTENT(IN ) :: IGDTLEN
    +
    98  INTEGER, INTENT(INOUT) :: IGDTMPL_THIN(IGDTLEN)
    +
    99  INTEGER, INTENT(INOUT) :: IGDTMPL_FULL(IGDTLEN)
    +
    100  INTEGER, INTENT(INOUT) :: IB_THIN(KM), IB_FULL(KM)
    +
    101  INTEGER, INTENT( OUT) :: IRET
    +
    102  !
    +
    103  LOGICAL(KIND=1), INTENT(INOUT) :: BITMAP_THIN(NUMPTS_THIN,KM)
    +
    104  LOGICAL(KIND=1), INTENT(INOUT) :: BITMAP_FULL(NUMPTS_FULL,KM)
    +
    105  !
    +
    106  REAL, INTENT(INOUT) :: DATA_THIN(NUMPTS_THIN,KM)
    +
    107  REAL, INTENT(INOUT) :: DATA_FULL(NUMPTS_FULL,KM)
    +
    108  !
    +
    109  INTEGER, PARAMETER :: MISSING=-1
    +
    110  !
    +
    111  INTEGER :: SCAN_MODE, I, J, K, IDLAT, IDLON
    +
    112  INTEGER :: IA, IB, IM, IM1, IM2, NPWAFS(73)
    +
    113  INTEGER :: IS1, IS2, ISCAN, ISCALE
    +
    114  !
    +
    115  LOGICAL :: TEST1, TEST2
    +
    116  !
    +
    117  REAL :: DLON, HI
    +
    118  REAL :: RAT1, RAT2, RLON1, RLON2
    +
    119  REAL :: WA, WB, X1, X2
    +
    120  !
    +
    121  DATA npwafs/ &
    +
    122  73, 73, 73, 73, 73, 73, 73, 73, 72, 72, 72, 71, 71, 71, 70,&
    +
    123  70, 69, 69, 68, 67, 67, 66, 65, 65, 64, 63, 62, 61, 60, 60,&
    +
    124  59, 58, 57, 56, 55, 54, 52, 51, 50, 49, 48, 47, 45, 44, 43,&
    +
    125  42, 40, 39, 38, 36, 35, 33, 32, 30, 29, 28, 26, 25, 23, 22,&
    +
    126  20, 19, 17, 16, 14, 12, 11, 9, 8, 6, 5, 3, 2/
    +
    127  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    128  ! TRANSFORM GDS
    +
    129  iret=0
    +
    130  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    131  ! REG LAT/LON GRIDS HAVE 19 GDT ELEMENTS.
    +
    132  IF (igdtlen /= 19 .OR. numpts_thin/=3447 .OR. numpts_full/=5329) THEN
    +
    133  iret=1
    +
    134  RETURN
    +
    135  ENDIF
    +
    136  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    137  ! EXPAND THINNED GDS TO FULL GDS
    +
    138  IF(idir.GT.0) THEN
    +
    139  scan_mode=igdtmpl_thin(19)
    +
    140  iscale=igdtmpl_thin(10)*igdtmpl_thin(11)
    +
    141  IF(iscale==0) iscale=10**6
    +
    142  idlat=nint(1.25*float(iscale))
    +
    143  test1=all(opt_pts==npwafs)
    +
    144  test2=all(opt_pts==npwafs(73:1:-1))
    +
    145  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    146  ! SOME CHECKS TO ENSURE THIS IS A WAFS GRID
    +
    147  IF(scan_mode==64 .AND. igdtmpl_thin(9)==73 .AND. &
    +
    148  idlat==igdtmpl_thin(18) .AND. (test1 .OR. test2) ) THEN
    +
    149  igdtmpl_full=igdtmpl_thin
    +
    150  im=73
    +
    151  igdtmpl_full(8)=im
    +
    152  rlon1=float(igdtmpl_full(13))/float(iscale)
    +
    153  rlon2=float(igdtmpl_full(16))/float(iscale)
    +
    154  iscan=mod(igdtmpl_full(19)/128,2)
    +
    155  hi=(-1.)**iscan
    +
    156  dlon=hi*(mod(hi*(rlon2-rlon1)-1+3600,360.)+1)/(im-1)
    +
    157  igdtmpl_full(17)=nint(dlon*float(iscale))
    +
    158  ELSE
    +
    159  iret=1
    +
    160  ENDIF
    +
    161  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    162  ! CONTRACT FULL GDS TO THINNED GDS
    +
    163  ELSEIF(idir.LT.0) THEN
    +
    164  scan_mode=igdtmpl_full(19)
    +
    165  iscale=igdtmpl_full(10)*igdtmpl_full(11)
    +
    166  IF(iscale==0) iscale=10**6
    +
    167  idlat=nint(1.25*float(iscale))
    +
    168  idlon=idlat
    +
    169  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    170  ! SOME CHECKS TO ENSURE THIS IS A WAFS GRID
    +
    171  IF(scan_mode==64 .AND. igdtmpl_full(8)==73 .AND. igdtmpl_full(9)==73 .AND. &
    +
    172  num_opt==73 .AND. idlat==igdtmpl_full(18) .AND. idlon==igdtmpl_full(17))THEN
    +
    173  igdtmpl_thin=igdtmpl_full
    +
    174  igdtmpl_thin(8)=missing
    +
    175  igdtmpl_thin(17)=missing
    +
    176  IF(igdtmpl_thin(12)==0) THEN ! IS LATITUDE OF ROW 1 THE EQUATOR?
    +
    177  opt_pts=npwafs
    +
    178  ELSE
    +
    179  opt_pts=npwafs(73:1:-1)
    +
    180  ENDIF
    +
    181  ELSE
    +
    182  iret=1
    +
    183  ENDIF
    +
    184  ENDIF
    +
    185  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    186  ! TRANSFORM FIELDS
    +
    187  IF(iret.EQ.0) THEN
    +
    188  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    189  ! EXPAND THINNED FIELDS TO FULL FIELDS
    +
    190  IF(idir.EQ.1) THEN
    +
    191  DO k=1,km
    +
    192  is1=0
    +
    193  is2=0
    +
    194  ib_full(k)=0
    +
    195  DO j=1,igdtmpl_full(9)
    +
    196  im1=opt_pts(j)
    +
    197  im2=igdtmpl_full(8)
    +
    198  rat1=float(im1-1)/float(im2-1)
    +
    199  DO i=1,im2
    +
    200  x1=(i-1)*rat1+1
    +
    201  ia=int(x1)
    +
    202  ia=min(max(ia,1),im1-1)
    +
    203  ib=ia+1
    +
    204  wa=ib-x1
    +
    205  wb=x1-ia
    +
    206  IF(ib_thin(k)==0.OR.(bitmap_thin(is1+ia,k).AND.bitmap_thin(is1+ib,k))) THEN
    +
    207  data_full(is2+i,k)=wa*data_thin(is1+ia,k)+wb*data_thin(is1+ib,k)
    +
    208  bitmap_full(is2+i,k)=.true.
    +
    209  ELSE
    +
    210  data_full(is2+i,k)=0.0
    +
    211  bitmap_full(is2+i,k)=.false.
    +
    212  ib_full(k)=1
    +
    213  ENDIF
    +
    214  ENDDO
    +
    215  is1=is1+im1
    +
    216  is2=is2+im2
    +
    217  ENDDO
    +
    218  ENDDO
    +
    219  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    220  ! CONTRACT FULL FIELDS TO THINNED FIELDS
    +
    221  ELSEIF(idir.EQ.-1) THEN
    +
    222  DO k=1,km
    +
    223  is1=0
    +
    224  is2=0
    +
    225  ib_thin(k)=0
    +
    226  DO j=1,igdtmpl_full(9)
    +
    227  im1=opt_pts(j)
    +
    228  im2=igdtmpl_full(8)
    +
    229  rat2=float(im2-1)/float(im1-1)
    +
    230  DO i=1,im1
    +
    231  x2=(i-1)*rat2+1
    +
    232  ia=int(x2)
    +
    233  ia=min(max(ia,1),im2-1)
    +
    234  ib=ia+1
    +
    235  wa=ib-x2
    +
    236  wb=x2-ia
    +
    237  IF(ib_full(k)==0.OR.(bitmap_full(is2+ia,k).AND.bitmap_full(is2+ib,k))) THEN
    +
    238  data_thin(is1+i,k)=wa*data_full(is2+ia,k)+wb*data_full(is2+ib,k)
    +
    239  bitmap_thin(is1+i,k)=.true.
    +
    240  ELSE
    +
    241  data_thin(is1+i,k)=0.0
    +
    242  bitmap_thin(is1+i,k)=.false.
    +
    243  ib_thin(k)=1
    +
    244  ENDIF
    +
    245  ENDDO
    +
    246  is1=is1+im1
    +
    247  is2=is2+im2
    +
    248  ENDDO
    +
    249  ENDDO
    +
    250  ENDIF
    +
    251  ENDIF
    +
    252  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    253 END SUBROUTINE ipxwafs2
    +
    subroutine ipxwafs2(IDIR, NUMPTS_THIN, NUMPTS_FULL, KM, NUM_OPT, OPT_PTS, IGDTLEN, IGDTMPL_THIN, DATA_THIN, IB_THIN, BITMAP_THIN, IGDTMPL_FULL, DATA_FULL, IB_FULL, BITMAP_FULL, IRET)
    Expand or contract wafs grids using linear interpolation and account for bitmapped data.
    Definition: ipxwafs2.F90:92
    +
    +
    + + + + diff --git a/ver-5.1.0/ipxwafs3_8F90.html b/ver-5.1.0/ipxwafs3_8F90.html new file mode 100644 index 00000000..be1e2ca7 --- /dev/null +++ b/ver-5.1.0/ipxwafs3_8F90.html @@ -0,0 +1,306 @@ + + + + + + + +NCEPLIBS-ip: ipxwafs3.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ipxwafs3.F90 File Reference
    +
    +
    + +

    Expand or contract wafs grids using neighbor interpolation and accout for bitmapped data. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine ipxwafs3 (IDIR, NUMPTS_THIN, NUMPTS_FULL, KM, NUM_OPT, OPT_PTS, IGDTLEN, IGDTMPL_THIN, DATA_THIN, IB_THIN, BITMAP_THIN, IGDTMPL_FULL, DATA_FULL, IB_FULL, BITMAP_FULL, IRET)
     Expand or contract wafs grids using neighbor interpolation and accout for bitmapped data. More...
     
    +

    Detailed Description

    +

    Expand or contract wafs grids using neighbor interpolation and accout for bitmapped data.

    +
    Author
    Trojan
    +
    Date
    7-7-13
    + +

    Definition in file ipxwafs3.F90.

    +

    Function/Subroutine Documentation

    + +

    ◆ ipxwafs3()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ipxwafs3 (integer, intent(in) IDIR,
    integer, intent(in) NUMPTS_THIN,
    integer, intent(in) NUMPTS_FULL,
    integer, intent(in) KM,
    integer, intent(in) NUM_OPT,
    integer, dimension(num_opt), intent(inout) OPT_PTS,
    integer, intent(in) IGDTLEN,
    integer, dimension(igdtlen), intent(inout) IGDTMPL_THIN,
    real, dimension(numpts_thin,km), intent(inout) DATA_THIN,
    integer, dimension(km), intent(inout) IB_THIN,
    logical(kind=1), dimension(numpts_thin,km), intent(inout) BITMAP_THIN,
    integer, dimension(igdtlen), intent(inout) IGDTMPL_FULL,
    real, dimension(numpts_full,km), intent(inout) DATA_FULL,
    integer, dimension(km), intent(inout) IB_FULL,
    logical(kind=1), dimension(numpts_full,km), intent(inout) BITMAP_FULL,
    integer, intent(out) IRET 
    )
    +
    + +

    Expand or contract wafs grids using neighbor interpolation and accout for bitmapped data.

    +

    This subprogram transforms between the thinned wafs grids used for transmitting to the aviation community and their full expansion as used for general interpolation and graphics. The thinned wafs grids are latitude-longitude grids where the number of points in each row decrease toward the pole. This information is stored in the grib 2 grid definition template (section 3) starting at octet 73.

    +

    The full grid counterparts have an equal number of points per row.

    +

    The transform between the full and thinned wafs wafs grid is done by linear interpolation and is not reversible. This routine works with bitmapped data.

    +

    This subroutine is similar to:

      +
    • ipxwafs() which uses linear interpolation.
    • +
    • ipxwafs2() which uses linear interpolation and accounts for
    • +
    • bitmapped data.
    • +
    +

    +Program History Log

    + + + + + + + +
    Date Programmer Comments
    07-07-13 Trojan initial version based on ipxwafs2
    2015-jul gayno convert to grib 2
    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]idirinteger transform option
      +
    • 1 to expand thinned fields to full fields
    • +
    • -1 to contract full fields to thinned fields
    • +
    +
    [in]numpts_thininteger number of grid points - thinned grid. Must be 3447.
    [in]numpts_fullinteger number of grid points - full grid. Must be 5329.
    [in]kminteger number of fields to transform
    [in]num_optinteger number of values to describe the thinned grid. must be 73. dimension of array opt_pts.
    [in,out]opt_ptsinteger (num_opt) number of grid points per row - thinned grid - if idir=+1
    [in]igdtleninteger grid defintion template array length. must be 19 for lat/lon grids. corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure. same for thin and full grids which are both lat/lon.
    [in]igdtmpl_thininteger (igdtlen) grid definition template array - thinned grid - if idir=+1. corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure (section 3 info):
      +
    • 1 shape of earth, octet 15
    • +
    • 2 scale factor of spherical earth radius, octet 16
    • +
    • 3 scaled value of radius of spherical earth, octets 17-20
    • +
    • 4 scale factor of major axis of elliptical earth, octet 21
    • +
    • 5 scaled value of major axis of elliptical earth, octets 22-25
    • +
    • 6 scale factor of minor axis of elliptical earth, octet 26
    • +
    • 7 scaled value of minor axis of elliptical earth, octets 27-30
    • +
    • 8 set to missing for thinned grid., octs 31-34
    • +
    • 9 number of points along a meridian, octs 35-38
    • +
    • 10 basic angle of initial production domain, octets 39-42.
    • +
    • 11 subdivisions of basic angle, octets 43-46
    • +
    • 12 latitude of first grid point, octets 47-50
    • +
    • 13 longitude of first grid point, octets 51-54
    • +
    • 14 resolution and component flags, octet 55
    • +
    • 15 latitude of last grid point, octets 56-59
    • +
    • 16 longitude of last grid point, octets 60-63
    • +
    • 17 set to missing for thinned grid, octets 64-67
    • +
    • 18 j-direction increment, octets 68-71
    • +
    • 19 scanning mode, octet 72
    • +
    +
    [in,out]data_thinreal (numpts_thin,km) thinned grid fields if idir=+1
    [in,out]ib_thininteger (km) bitmap flags thinned grid - if idir=+1
    [in,out]bitmap_thinlogical (numpts_thin,km) bitmap fields thin grid - if idir=+1
    [in,out]igdtmpl_fullinteger (igdtlen) grid definition template array - full grid - if idir=-1. corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure. same as igdtmpl_thin except: (8): number of points along a parallel, octs 31-34 (17): i-direction increment, octets 64-67
    [in,out]data_fullreal (numpts_full,km) full grid fields if idir=-1
    [in,out]ib_fullinteger (km) bitmap flags full grid - if idir=-1
    [in,out]bitmap_fulllogical (numpts_full,km) bitmap fields full grid - if idir=-1
    [out]iretinteger return code
      +
    • 0 successful transformation
    • +
    • 1 improper grid specification
    • +
    +
    +
    +
    +
    Author
    Trojan
    +
    Date
    7-7-13
    + +

    Definition at line 88 of file ipxwafs3.F90.

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/ipxwafs3_8F90.js b/ver-5.1.0/ipxwafs3_8F90.js new file mode 100644 index 00000000..30094c7a --- /dev/null +++ b/ver-5.1.0/ipxwafs3_8F90.js @@ -0,0 +1,4 @@ +var ipxwafs3_8F90 = +[ + [ "ipxwafs3", "ipxwafs3_8F90.html#aae7be3c77cbe16d0219c86e443e6ec1d", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ipxwafs3_8F90_source.html b/ver-5.1.0/ipxwafs3_8F90_source.html new file mode 100644 index 00000000..e8c66cef --- /dev/null +++ b/ver-5.1.0/ipxwafs3_8F90_source.html @@ -0,0 +1,289 @@ + + + + + + + +NCEPLIBS-ip: ipxwafs3.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ipxwafs3.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    5 
    +
    88 SUBROUTINE ipxwafs3(IDIR, NUMPTS_THIN, NUMPTS_FULL, KM, NUM_OPT, OPT_PTS, &
    +
    89  IGDTLEN, IGDTMPL_THIN, DATA_THIN, IB_THIN, BITMAP_THIN, &
    +
    90  IGDTMPL_FULL, DATA_FULL, IB_FULL, BITMAP_FULL, IRET)
    +
    91  IMPLICIT NONE
    +
    92 !
    +
    93  INTEGER, INTENT(IN ) :: NUM_OPT
    +
    94  INTEGER, INTENT(INOUT) :: OPT_PTS(NUM_OPT)
    +
    95  INTEGER, INTENT(IN ) :: IDIR, KM, NUMPTS_THIN, NUMPTS_FULL
    +
    96  INTEGER, INTENT(IN ) :: IGDTLEN
    +
    97  INTEGER, INTENT(INOUT) :: IGDTMPL_THIN(IGDTLEN)
    +
    98  INTEGER, INTENT(INOUT) :: IGDTMPL_FULL(IGDTLEN)
    +
    99  INTEGER, INTENT(INOUT) :: IB_THIN(KM), IB_FULL(KM)
    +
    100  INTEGER, INTENT( OUT) :: IRET
    +
    101 !
    +
    102  LOGICAL(KIND=1), INTENT(INOUT) :: BITMAP_THIN(NUMPTS_THIN,KM)
    +
    103  LOGICAL(KIND=1), INTENT(INOUT) :: BITMAP_FULL(NUMPTS_FULL,KM)
    +
    104 !
    +
    105  REAL, INTENT(INOUT) :: DATA_THIN(NUMPTS_THIN,KM)
    +
    106  REAL, INTENT(INOUT) :: DATA_FULL(NUMPTS_FULL,KM)
    +
    107 !
    +
    108  INTEGER, PARAMETER :: MISSING=-1
    +
    109 !
    +
    110  INTEGER :: SCAN_MODE, I, J, K, IDLAT, IDLON
    +
    111  INTEGER :: IA, IB, IM, IM1, IM2, NPWAFS(73)
    +
    112  INTEGER :: IS1, IS2, ISCAN, ISCALE
    +
    113 !
    +
    114  LOGICAL :: TEST1, TEST2
    +
    115 !
    +
    116  REAL :: DLON, HI
    +
    117  REAL :: RAT1, RAT2, RLON1, RLON2
    +
    118  REAL :: WA, WB, X1, X2
    +
    119 !
    +
    120  DATA npwafs/ &
    +
    121  73, 73, 73, 73, 73, 73, 73, 73, 72, 72, 72, 71, 71, 71, 70,&
    +
    122  70, 69, 69, 68, 67, 67, 66, 65, 65, 64, 63, 62, 61, 60, 60,&
    +
    123  59, 58, 57, 56, 55, 54, 52, 51, 50, 49, 48, 47, 45, 44, 43,&
    +
    124  42, 40, 39, 38, 36, 35, 33, 32, 30, 29, 28, 26, 25, 23, 22,&
    +
    125  20, 19, 17, 16, 14, 12, 11, 9, 8, 6, 5, 3, 2/
    +
    126 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    127 ! TRANSFORM GDS
    +
    128  iret=0
    +
    129 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    130 ! REG LAT/LON GRIDS HAVE 19 GDT ELEMENTS.
    +
    131  IF (igdtlen /= 19 .OR. numpts_thin/=3447 .OR. numpts_full/=5329) THEN
    +
    132  iret=1
    +
    133  RETURN
    +
    134  ENDIF
    +
    135 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    136 ! EXPAND THINNED GDS TO FULL GDS
    +
    137  IF(idir.GT.0) THEN
    +
    138  scan_mode=igdtmpl_thin(19)
    +
    139  iscale=igdtmpl_thin(10)*igdtmpl_thin(11)
    +
    140  IF(iscale==0) iscale=10**6
    +
    141  idlat=nint(1.25*float(iscale))
    +
    142  test1=all(opt_pts==npwafs)
    +
    143  test2=all(opt_pts==npwafs(73:1:-1))
    +
    144 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    145 ! SOME CHECKS TO ENSURE THIS IS A WAFS GRID
    +
    146  IF(scan_mode==64 .AND. igdtmpl_thin(9)==73 .AND. &
    +
    147  idlat==igdtmpl_thin(18) .AND. (test1 .OR. test2) ) THEN
    +
    148  igdtmpl_full=igdtmpl_thin
    +
    149  im=73
    +
    150  igdtmpl_full(8)=im
    +
    151  rlon1=float(igdtmpl_full(13))/float(iscale)
    +
    152  rlon2=float(igdtmpl_full(16))/float(iscale)
    +
    153  iscan=mod(igdtmpl_full(19)/128,2)
    +
    154  hi=(-1.)**iscan
    +
    155  dlon=hi*(mod(hi*(rlon2-rlon1)-1+3600,360.)+1)/(im-1)
    +
    156  igdtmpl_full(17)=nint(dlon*float(iscale))
    +
    157  ELSE
    +
    158  iret=1
    +
    159  ENDIF
    +
    160 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    161 ! CONTRACT FULL GDS TO THINNED GDS
    +
    162  ELSEIF(idir.LT.0) THEN
    +
    163  scan_mode=igdtmpl_full(19)
    +
    164  iscale=igdtmpl_full(10)*igdtmpl_full(11)
    +
    165  IF(iscale==0) iscale=10**6
    +
    166  idlat=nint(1.25*float(iscale))
    +
    167  idlon=idlat
    +
    168 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    169 ! SOME CHECKS TO ENSURE THIS IS A WAFS GRID
    +
    170  IF(scan_mode==64 .AND. igdtmpl_full(8)==73 .AND. igdtmpl_full(9)==73 .AND. &
    +
    171  num_opt==73 .AND. idlat==igdtmpl_full(18) .AND. idlon==igdtmpl_full(17))THEN
    +
    172  igdtmpl_thin=igdtmpl_full
    +
    173  igdtmpl_thin(8)=missing
    +
    174  igdtmpl_thin(17)=missing
    +
    175  IF(igdtmpl_thin(12)==0) THEN ! IS LATITUDE OF ROW 1 THE EQUATOR?
    +
    176  opt_pts=npwafs
    +
    177  ELSE
    +
    178  opt_pts=npwafs(73:1:-1)
    +
    179  ENDIF
    +
    180  ELSE
    +
    181  iret=1
    +
    182  ENDIF
    +
    183  ENDIF
    +
    184 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    185 ! TRANSFORM FIELDS
    +
    186  IF(iret.EQ.0) THEN
    +
    187 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    188 ! EXPAND THINNED FIELDS TO FULL FIELDS
    +
    189  IF(idir.EQ.1) THEN
    +
    190  DO k=1,km
    +
    191  is1=0
    +
    192  is2=0
    +
    193  ib_full(k)=0
    +
    194  DO j=1,igdtmpl_full(9)
    +
    195  im1=opt_pts(j)
    +
    196  im2=igdtmpl_full(8)
    +
    197  rat1=float(im1-1)/float(im2-1)
    +
    198  DO i=1,im2
    +
    199  x1=(i-1)*rat1+1
    +
    200  ia=int(x1)
    +
    201  ia=min(max(ia,1),im1-1)
    +
    202  ib=ia+1
    +
    203  wa=ib-x1
    +
    204  wb=x1-ia
    +
    205  IF(wa.GE.wb) THEN
    +
    206  IF(ib_thin(k).EQ.0.OR.bitmap_thin(is1+ia,k)) THEN
    +
    207  data_full(is2+i,k)=data_thin(is1+ia,k)
    +
    208  bitmap_full(is2+i,k)=.true.
    +
    209  ELSE
    +
    210  data_full(is2+i,k)=0.0
    +
    211  bitmap_full(is2+i,k)=.false.
    +
    212  ib_full(k)=1
    +
    213  ENDIF
    +
    214  ELSE
    +
    215  IF(ib_thin(k).EQ.0.OR.bitmap_thin(is1+ib,k)) THEN
    +
    216  data_full(is2+i,k)=data_thin(is1+ib,k)
    +
    217  bitmap_full(is2+i,k)=.true.
    +
    218  ELSE
    +
    219  data_full(is2+i,k)=0.0
    +
    220  bitmap_full(is2+i,k)=.false.
    +
    221  ib_full(k)=1
    +
    222  ENDIF
    +
    223  ENDIF
    +
    224  ENDDO
    +
    225  is1=is1+im1
    +
    226  is2=is2+im2
    +
    227  ENDDO
    +
    228  ENDDO
    +
    229 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    230 ! CONTRACT FULL FIELDS TO THINNED FIELDS
    +
    231  ELSEIF(idir.EQ.-1) THEN
    +
    232  DO k=1,km
    +
    233  is1=0
    +
    234  is2=0
    +
    235  ib_thin(k)=0
    +
    236  DO j=1,igdtmpl_full(9)
    +
    237  im1=opt_pts(j)
    +
    238  im2=igdtmpl_full(8)
    +
    239  rat2=float(im2-1)/float(im1-1)
    +
    240  DO i=1,im1
    +
    241  x2=(i-1)*rat2+1
    +
    242  ia=int(x2)
    +
    243  ia=min(max(ia,1),im2-1)
    +
    244  ib=ia+1
    +
    245  wa=ib-x2
    +
    246  wb=x2-ia
    +
    247  IF(wa.GE.wb) THEN
    +
    248  IF(ib_full(k).EQ.0.OR.bitmap_full(is2+ia,k)) THEN
    +
    249  data_thin(is1+i,k)=data_full(is2+ia,k)
    +
    250  bitmap_thin(is1+i,k)=.true.
    +
    251  ELSE
    +
    252  data_thin(is1+i,k)=0.0
    +
    253  bitmap_thin(is1+i,k)=.false.
    +
    254  ib_thin(k)=1
    +
    255  ENDIF
    +
    256  ELSE
    +
    257  IF(ib_full(k).EQ.0.OR.bitmap_full(is2+ib,k)) THEN
    +
    258  data_thin(is1+i,k)=data_full(is2+ib,k)
    +
    259  bitmap_thin(is1+i,k)=.true.
    +
    260  ELSE
    +
    261  data_thin(is1+i,k)=0.0
    +
    262  bitmap_thin(is1+i,k)=.false.
    +
    263  ib_thin(k)=1
    +
    264  ENDIF
    +
    265  ENDIF
    +
    266  ENDDO
    +
    267  is1=is1+im1
    +
    268  is2=is2+im2
    +
    269  ENDDO
    +
    270  ENDDO
    +
    271  ENDIF
    +
    272  ENDIF
    +
    273 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    274  END SUBROUTINE ipxwafs3
    +
    subroutine ipxwafs3(IDIR, NUMPTS_THIN, NUMPTS_FULL, KM, NUM_OPT, OPT_PTS, IGDTLEN, IGDTMPL_THIN, DATA_THIN, IB_THIN, BITMAP_THIN, IGDTMPL_FULL, DATA_FULL, IB_FULL, BITMAP_FULL, IRET)
    Expand or contract wafs grids using neighbor interpolation and accout for bitmapped data.
    Definition: ipxwafs3.F90:91
    +
    +
    + + + + diff --git a/ver-5.1.0/ipxwafs_8F90.html b/ver-5.1.0/ipxwafs_8F90.html new file mode 100644 index 00000000..491f7c06 --- /dev/null +++ b/ver-5.1.0/ipxwafs_8F90.html @@ -0,0 +1,278 @@ + + + + + + + +NCEPLIBS-ip: ipxwafs.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ipxwafs.F90 File Reference
    +
    +
    + +

    Expand or contract wafs grids. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine ipxwafs (IDIR, NUMPTS_THIN, NUMPTS_FULL, KM, NUM_OPT, OPT_PTS, IGDTLEN, IGDTMPL_THIN, DATA_THIN, IGDTMPL_FULL, DATA_FULL, IRET)
     Expand or contract wafs grids. More...
     
    +

    Detailed Description

    +

    Expand or contract wafs grids.

    +
    Author
    Iredell
    +
    Date
    96-04-10
    + +

    Definition in file ipxwafs.F90.

    +

    Function/Subroutine Documentation

    + +

    ◆ ipxwafs()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ipxwafs (integer, intent(in) IDIR,
    integer, intent(in) NUMPTS_THIN,
    integer, intent(in) NUMPTS_FULL,
    integer, intent(in) KM,
    integer, intent(in) NUM_OPT,
    integer, dimension(num_opt), intent(inout) OPT_PTS,
    integer, intent(in) IGDTLEN,
    integer, dimension(igdtlen), intent(inout) IGDTMPL_THIN,
    real, dimension(numpts_thin,km), intent(inout) DATA_THIN,
    integer, dimension(igdtlen), intent(inout) IGDTMPL_FULL,
    real, dimension(numpts_full,km), intent(inout) DATA_FULL,
    integer, intent(out) IRET 
    )
    +
    + +

    Expand or contract wafs grids.

    +

    This subprogram transforms between the thinned wafs grids used for transmitting to the aviation community and their full expansion as used for general interpolation and graphics.

    +

    The thinned wafs grids are latitude-longitude grids where the number of points in each row decrease toward the pole.

    +

    This information is stored in the grib 2 grid definition template (section 3) starting at octet 73. The full grid counterparts have an equal number of points per row. The transform between the full and thinned wafs grid is done by linear interpolation and is not reversible.

    +

    This routine does not work for bitmapped data.

    +

    +Program History Log

    + + + + + + + +
    Date Programmer Comments
    96-04-10 iredell initial version
    2015-july gayno convert to grib 2
    +
    Parameters
    + + + + + + + + + + + + + +
    [in]idirinteger transform option
      +
    • (+1 to expand thinned fields to full fields)
    • +
    • (-1 to contract full fields to thinned fields)
    • +
    +
    [in]numpts_thininteger number of grid points - thinned grid. must be 3447.
    [in]numpts_fullinteger number of grid points - full grid. must be 5329 (73^2).
    [in]kminteger number of fields to transform
    [in]num_optinteger number of values to describe the thinned grid. must be 73. dimension of array opt_pts.
    [in,out]opt_ptsinteger (num_opt) number of grid points per row - thinned grid - if idir=+1
    [in]igdtleninteger grid defintion template array length. must be 19 for lat/lon grids. corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure. same for thin and full grids which are both lat/lon.
    [in,out]igdtmpl_thininteger (igdtlen) grid definition template array - thinned grid - if idir=+1. corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure (section 3 info):
      +
    • 1 shape of earth, octet 15
    • +
    • 2 scale factor of spherical earth radius, octet 16
    • +
    • 3 scaled value of radius of spherical earth, octets 17-20
    • +
    • 4 scale factor of major axis of elliptical earth, octet 21
    • +
    • 5 scaled value of major axis of elliptical earth, octets 22-25
    • +
    • 6 scale factor of minor axis of elliptical earth, octet 26
    • +
    • 7 scaled value of minor axis of elliptical earth, octets 27-30
    • +
    • 8 set to missing for thinned grid., octs 31-34
    • +
    • 9 number of points along a meridian, octs 35-38
    • +
    • 10 basic angle of initial production domain, octets 39-42.
    • +
    • 11 subdivisions of basic angle, octets 43-46
    • +
    • 12 latitude of first grid point, octets 47-50
    • +
    • 13 longitude of first grid point, octets 51-54
    • +
    • 14 resolution and component flags, octet 55
    • +
    • 15 latitude of last grid point, octets 56-59
    • +
    • 16 longitude of last grid point, octets 60-63
    • +
    • 17 set to missing for thinned grid, octets 64-67
    • +
    • 18 j-direction increment, octets 68-71
    • +
    • 19 scanning mode, octet 72
    • +
    +
    [in,out]data_thinreal (numpts_thin,km) thinned grid fields if idir=+1
    [in,out]igdtmpl_fullinteger (igdtlen) grid definition template array - full grid - if idir=-1. corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure. same as igdtmpl_thin except:
      +
    • 8 number of points along a parallel, octs 31-34
    • +
    • 17 i-direction increment, octets 64-67
    • +
    +
    [in,out]data_fullreal (numpts_full,km) full grid fields if idir=-1
    [out]iretinteger return code
      +
    • 0 successful transformation
    • +
    • 1 improper grid specification
    • +
    +
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    + +

    Definition at line 81 of file ipxwafs.F90.

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/ipxwafs_8F90.js b/ver-5.1.0/ipxwafs_8F90.js new file mode 100644 index 00000000..79c0b5e0 --- /dev/null +++ b/ver-5.1.0/ipxwafs_8F90.js @@ -0,0 +1,4 @@ +var ipxwafs_8F90 = +[ + [ "ipxwafs", "ipxwafs_8F90.html#a1465ea191950f7464bb3374abed94c12", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ipxwafs_8F90_source.html b/ver-5.1.0/ipxwafs_8F90_source.html new file mode 100644 index 00000000..2c613b10 --- /dev/null +++ b/ver-5.1.0/ipxwafs_8F90_source.html @@ -0,0 +1,248 @@ + + + + + + + +NCEPLIBS-ip: ipxwafs.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ipxwafs.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    4 
    +
    68 
    +
    81  SUBROUTINE ipxwafs(IDIR, NUMPTS_THIN, NUMPTS_FULL, KM, NUM_OPT, &
    +
    82  OPT_PTS, IGDTLEN, IGDTMPL_THIN, DATA_THIN, &
    +
    83  IGDTMPL_FULL, DATA_FULL, IRET)
    +
    84  IMPLICIT NONE
    +
    85 !
    +
    86  INTEGER, INTENT(IN ) :: NUM_OPT
    +
    87  INTEGER, INTENT(INOUT) :: OPT_PTS(NUM_OPT)
    +
    88  INTEGER, INTENT(IN ) :: IDIR, KM, NUMPTS_THIN, NUMPTS_FULL
    +
    89  INTEGER, INTENT(IN ) :: IGDTLEN
    +
    90  INTEGER, INTENT(INOUT) :: IGDTMPL_THIN(IGDTLEN)
    +
    91  INTEGER, INTENT(INOUT) :: IGDTMPL_FULL(IGDTLEN)
    +
    92  INTEGER, INTENT( OUT) :: IRET
    +
    93 !
    +
    94  REAL, INTENT(INOUT) :: DATA_THIN(NUMPTS_THIN,KM)
    +
    95  REAL, INTENT(INOUT) :: DATA_FULL(NUMPTS_FULL,KM)
    +
    96 !
    +
    97  INTEGER, PARAMETER :: MISSING=-1
    +
    98 !
    +
    99  INTEGER :: SCAN_MODE, I, J, K, IDLAT, IDLON
    +
    100  INTEGER :: IA, IB, IM, IM1, IM2, NPWAFS(73)
    +
    101  INTEGER :: IS1, IS2, ISCAN, ISCALE
    +
    102 !
    +
    103  LOGICAL :: TEST1, TEST2
    +
    104 !
    +
    105  REAL :: DLON, HI
    +
    106  REAL :: RAT1, RAT2, RLON1, RLON2
    +
    107  REAL :: WA, WB, X1, X2
    +
    108 !
    +
    109  DATA npwafs/ &
    +
    110  73, 73, 73, 73, 73, 73, 73, 73, 72, 72, 72, 71, 71, 71, 70,&
    +
    111  70, 69, 69, 68, 67, 67, 66, 65, 65, 64, 63, 62, 61, 60, 60,&
    +
    112  59, 58, 57, 56, 55, 54, 52, 51, 50, 49, 48, 47, 45, 44, 43,&
    +
    113  42, 40, 39, 38, 36, 35, 33, 32, 30, 29, 28, 26, 25, 23, 22,&
    +
    114  20, 19, 17, 16, 14, 12, 11, 9, 8, 6, 5, 3, 2/
    +
    115 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    116 ! TRANSFORM GDS
    +
    117  iret=0
    +
    118 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    119 ! REG LAT/LON GRIDS HAVE 19 GDT ELEMENTS.
    +
    120  IF (igdtlen /= 19 .OR. numpts_thin/=3447 .OR. numpts_full/=5329) THEN
    +
    121  iret=1
    +
    122  RETURN
    +
    123  ENDIF
    +
    124 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    125 ! EXPAND THINNED GDS TO FULL GDS
    +
    126  IF(idir.GT.0) THEN
    +
    127  scan_mode=igdtmpl_thin(19)
    +
    128  iscale=igdtmpl_thin(10)*igdtmpl_thin(11)
    +
    129  IF(iscale==0) iscale=10**6
    +
    130  idlat=nint(1.25*float(iscale))
    +
    131  test1=all(opt_pts==npwafs)
    +
    132  test2=all(opt_pts==npwafs(73:1:-1))
    +
    133 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    134 ! SOME CHECKS TO ENSURE THIS IS A WAFS GRID
    +
    135  IF(scan_mode==64 .AND. igdtmpl_thin(9)==73 .AND. &
    +
    136  idlat==igdtmpl_thin(18) .AND. (test1 .OR. test2) ) THEN
    +
    137  igdtmpl_full=igdtmpl_thin
    +
    138  im=73
    +
    139  igdtmpl_full(8)=im
    +
    140  rlon1=float(igdtmpl_full(13))/float(iscale)
    +
    141  rlon2=float(igdtmpl_full(16))/float(iscale)
    +
    142  iscan=mod(igdtmpl_full(19)/128,2)
    +
    143  hi=(-1.)**iscan
    +
    144  dlon=hi*(mod(hi*(rlon2-rlon1)-1+3600,360.)+1)/(im-1)
    +
    145  igdtmpl_full(17)=nint(dlon*float(iscale))
    +
    146  ELSE
    +
    147  iret=1
    +
    148  ENDIF
    +
    149 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    150 ! CONTRACT FULL GDS TO THINNED GDS
    +
    151  ELSEIF(idir.LT.0) THEN
    +
    152  scan_mode=igdtmpl_full(19)
    +
    153  iscale=igdtmpl_full(10)*igdtmpl_full(11)
    +
    154  IF(iscale==0) iscale=10**6
    +
    155  idlat=nint(1.25*float(iscale))
    +
    156  idlon=idlat
    +
    157 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    158 ! SOME CHECKS TO ENSURE THIS IS A WAFS GRID
    +
    159  IF(scan_mode==64 .AND. igdtmpl_full(8)==73 .AND. igdtmpl_full(9)==73 .AND. &
    +
    160  num_opt==73 .AND. idlat==igdtmpl_full(18) .AND. idlon==igdtmpl_full(17))THEN
    +
    161  igdtmpl_thin=igdtmpl_full
    +
    162  igdtmpl_thin(8)=missing
    +
    163  igdtmpl_thin(17)=missing
    +
    164  IF(igdtmpl_thin(12)==0) THEN ! IS LATITUDE OF ROW 1 THE EQUATOR?
    +
    165  opt_pts=npwafs
    +
    166  ELSE
    +
    167  opt_pts=npwafs(73:1:-1)
    +
    168  ENDIF
    +
    169  ELSE
    +
    170  iret=1
    +
    171  ENDIF
    +
    172  ENDIF
    +
    173 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    174 ! TRANSFORM FIELDS
    +
    175  IF(iret.EQ.0) THEN
    +
    176 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    177 ! EXPAND THINNED FIELDS TO FULL FIELDS
    +
    178  IF(idir.EQ.1) THEN
    +
    179  DO k=1,km
    +
    180  is1=0
    +
    181  is2=0
    +
    182  DO j=1,igdtmpl_full(9)
    +
    183  im1=opt_pts(j)
    +
    184  im2=igdtmpl_full(8)
    +
    185  rat1=float(im1-1)/float(im2-1)
    +
    186  DO i=1,im2
    +
    187  x1=(i-1)*rat1+1
    +
    188  ia=int(x1)
    +
    189  ia=min(max(ia,1),im1-1)
    +
    190  ib=ia+1
    +
    191  wa=ib-x1
    +
    192  wb=x1-ia
    +
    193  data_full(is2+i,k)=wa*data_thin(is1+ia,k)+wb*data_thin(is1+ib,k)
    +
    194  ENDDO
    +
    195  is1=is1+im1
    +
    196  is2=is2+im2
    +
    197  ENDDO
    +
    198  ENDDO
    +
    199 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    200 ! CONTRACT FULL FIELDS TO THINNED FIELDS
    +
    201  ELSEIF(idir.EQ.-1) THEN
    +
    202  DO k=1,km
    +
    203  is1=0
    +
    204  is2=0
    +
    205  DO j=1,igdtmpl_full(9)
    +
    206  im1=opt_pts(j)
    +
    207  im2=igdtmpl_full(8)
    +
    208  rat2=float(im2-1)/float(im1-1)
    +
    209  DO i=1,im1
    +
    210  x2=(i-1)*rat2+1
    +
    211  ia=int(x2)
    +
    212  ia=min(max(ia,1),im2-1)
    +
    213  ib=ia+1
    +
    214  wa=ib-x2
    +
    215  wb=x2-ia
    +
    216  data_thin(is1+i,k)=wa*data_full(is2+ia,k)+wb*data_full(is2+ib,k)
    +
    217  ENDDO
    +
    218  is1=is1+im1
    +
    219  is2=is2+im2
    +
    220  ENDDO
    +
    221  ENDDO
    +
    222  ENDIF
    +
    223  ENDIF
    +
    224 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    225  END SUBROUTINE ipxwafs
    +
    subroutine ipxwafs(IDIR, NUMPTS_THIN, NUMPTS_FULL, KM, NUM_OPT, OPT_PTS, IGDTLEN, IGDTMPL_THIN, DATA_THIN, IGDTMPL_FULL, DATA_FULL, IRET)
    Expand or contract wafs grids.
    Definition: ipxwafs.F90:84
    +
    +
    + + + + diff --git a/ver-5.1.0/jquery.js b/ver-5.1.0/jquery.js new file mode 100644 index 00000000..103c32d7 --- /dev/null +++ b/ver-5.1.0/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/ver-5.1.0/menu.js b/ver-5.1.0/menu.js new file mode 100644 index 00000000..2fe2214f --- /dev/null +++ b/ver-5.1.0/menu.js @@ -0,0 +1,51 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/ver-5.1.0/menudata.js b/ver-5.1.0/menudata.js new file mode 100644 index 00000000..ac5b6fd0 --- /dev/null +++ b/ver-5.1.0/menudata.js @@ -0,0 +1,139 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Modules",url:"namespaces.html",children:[ +{text:"Modules List",url:"namespaces.html"}, +{text:"Module Members",url:"namespacemembers.html",children:[ +{text:"All",url:"namespacemembers.html",children:[ +{text:"a",url:"namespacemembers.html#index_a"}, +{text:"b",url:"namespacemembers.html#index_b"}, +{text:"c",url:"namespacemembers.html#index_c"}, +{text:"d",url:"namespacemembers.html#index_d"}, +{text:"e",url:"namespacemembers.html#index_e"}, +{text:"f",url:"namespacemembers.html#index_f"}, +{text:"g",url:"namespacemembers.html#index_g"}, +{text:"h",url:"namespacemembers.html#index_h"}, +{text:"i",url:"namespacemembers.html#index_i"}, +{text:"j",url:"namespacemembers.html#index_j"}, +{text:"k",url:"namespacemembers.html#index_k"}, +{text:"l",url:"namespacemembers.html#index_l"}, +{text:"m",url:"namespacemembers.html#index_m"}, +{text:"n",url:"namespacemembers.html#index_n"}, +{text:"o",url:"namespacemembers.html#index_o"}, +{text:"p",url:"namespacemembers.html#index_p"}, +{text:"r",url:"namespacemembers.html#index_r"}, +{text:"s",url:"namespacemembers.html#index_s"}, +{text:"u",url:"namespacemembers.html#index_u"}, +{text:"y",url:"namespacemembers.html#index_y"}]}, +{text:"Functions/Subroutines",url:"namespacemembers_func.html",children:[ +{text:"e",url:"namespacemembers_func.html#index_e"}, +{text:"f",url:"namespacemembers_func.html#index_f"}, +{text:"g",url:"namespacemembers_func.html#index_g"}, +{text:"i",url:"namespacemembers_func.html#index_i"}, +{text:"l",url:"namespacemembers_func.html#index_l"}, +{text:"m",url:"namespacemembers_func.html#index_m"}, +{text:"p",url:"namespacemembers_func.html#index_p"}, +{text:"r",url:"namespacemembers_func.html#index_r"}, +{text:"u",url:"namespacemembers_func.html#index_u"}]}, +{text:"Variables",url:"namespacemembers_vars.html",children:[ +{text:"a",url:"namespacemembers_vars.html#index_a"}, +{text:"b",url:"namespacemembers_vars.html#index_b"}, +{text:"c",url:"namespacemembers_vars.html#index_c"}, +{text:"d",url:"namespacemembers_vars.html#index_d"}, +{text:"e",url:"namespacemembers_vars.html#index_e"}, +{text:"g",url:"namespacemembers_vars.html#index_g"}, +{text:"h",url:"namespacemembers_vars.html#index_h"}, +{text:"i",url:"namespacemembers_vars.html#index_i"}, +{text:"j",url:"namespacemembers_vars.html#index_j"}, +{text:"k",url:"namespacemembers_vars.html#index_k"}, +{text:"l",url:"namespacemembers_vars.html#index_l"}, +{text:"m",url:"namespacemembers_vars.html#index_m"}, +{text:"n",url:"namespacemembers_vars.html#index_n"}, +{text:"o",url:"namespacemembers_vars.html#index_o"}, +{text:"p",url:"namespacemembers_vars.html#index_p"}, +{text:"r",url:"namespacemembers_vars.html#index_r"}, +{text:"s",url:"namespacemembers_vars.html#index_s"}, +{text:"y",url:"namespacemembers_vars.html#index_y"}]}]}]}, +{text:"Data Types List",url:"annotated.html",children:[ +{text:"Data Types List",url:"annotated.html"}, +{text:"Class Hierarchy",url:"hierarchy.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"c",url:"functions.html#index_c"}, +{text:"d",url:"functions.html#index_d"}, +{text:"e",url:"functions.html#index_e"}, +{text:"f",url:"functions.html#index_f"}, +{text:"g",url:"functions.html#index_g"}, +{text:"h",url:"functions.html#index_h"}, +{text:"i",url:"functions.html#index_i"}, +{text:"j",url:"functions.html#index_j"}, +{text:"k",url:"functions.html#index_k"}, +{text:"n",url:"functions.html#index_n"}, +{text:"o",url:"functions.html#index_o"}, +{text:"p",url:"functions.html#index_p"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"w",url:"functions.html#index_w"}]}, +{text:"Functions/Subroutines",url:"functions_func.html",children:[ +{text:"f",url:"functions_func.html#index_f"}, +{text:"g",url:"functions_func.html#index_g"}, +{text:"i",url:"functions_func.html#index_i"}, +{text:"p",url:"functions_func.html#index_p"}]}, +{text:"Variables",url:"functions_vars.html",children:[ +{text:"c",url:"functions_vars.html#index_c"}, +{text:"d",url:"functions_vars.html#index_d"}, +{text:"e",url:"functions_vars.html#index_e"}, +{text:"g",url:"functions_vars.html#index_g"}, +{text:"h",url:"functions_vars.html#index_h"}, +{text:"i",url:"functions_vars.html#index_i"}, +{text:"j",url:"functions_vars.html#index_j"}, +{text:"k",url:"functions_vars.html#index_k"}, +{text:"n",url:"functions_vars.html#index_n"}, +{text:"o",url:"functions_vars.html#index_o"}, +{text:"r",url:"functions_vars.html#index_r"}, +{text:"s",url:"functions_vars.html#index_s"}, +{text:"w",url:"functions_vars.html#index_w"}]}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"c",url:"globals.html#index_c"}, +{text:"d",url:"globals.html#index_d"}, +{text:"g",url:"globals.html#index_g"}, +{text:"i",url:"globals.html#index_i"}, +{text:"m",url:"globals.html#index_m"}, +{text:"n",url:"globals.html#index_n"}, +{text:"r",url:"globals.html#index_r"}, +{text:"s",url:"globals.html#index_s"}]}, +{text:"Functions/Subroutines",url:"globals_func.html",children:[ +{text:"c",url:"globals_func.html#index_c"}, +{text:"d",url:"globals_func.html#index_d"}, +{text:"g",url:"globals_func.html#index_g"}, +{text:"i",url:"globals_func.html#index_i"}, +{text:"m",url:"globals_func.html#index_m"}, +{text:"n",url:"globals_func.html#index_n"}, +{text:"r",url:"globals_func.html#index_r"}, +{text:"s",url:"globals_func.html#index_s"}]}]}]}]} diff --git a/ver-5.1.0/movect_8F90.html b/ver-5.1.0/movect_8F90.html new file mode 100644 index 00000000..439bf301 --- /dev/null +++ b/ver-5.1.0/movect_8F90.html @@ -0,0 +1,202 @@ + + + + + + + +NCEPLIBS-ip: movect.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    movect.F90 File Reference
    +
    +
    + +

    Move a vector along a great circle. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine movect (FLAT, FLON, TLAT, TLON, CROT, SROT)
     This subprogram provides the rotation parameters to move a vector along a great circle from one position to another while conserving its orientation with respect to the great circle. More...
     
    +

    Detailed Description

    +

    Move a vector along a great circle.

    +
    Author
    Iredell
    +
    Date
    96-04-10
    + +

    Definition in file movect.F90.

    +

    Function/Subroutine Documentation

    + +

    ◆ movect()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine movect (real, intent(in) FLAT,
    real, intent(in) FLON,
    real, intent(in) TLAT,
    real, intent(in) TLON,
    real, intent(out) CROT,
    real, intent(out) SROT 
    )
    +
    + +

    This subprogram provides the rotation parameters to move a vector along a great circle from one position to another while conserving its orientation with respect to the great circle.

    +

    These rotation parameters are useful for vector interpolation.

    +

    +Program History Log

    + + + + + + + +
    Date Programmer Comments
    96-04-10 Iredell Initial
    1999-04-08 Iredell generalize precision
    +
    Parameters
    + + + + + + + +
    [in]flatreal latitude in degrees from which to move the vector.
    [in]flonreal longitude in degrees from which to move the vector.
    [in]tlatreal latitude in degrees to which to move the vector.
    [in]tlonreal longitude in degrees to which to move the vector.
    [out]crotreal clockwise vector rotation cosine.
    [out]srotreal clockwise vector rotation sine. (uto=crot*ufrom-srot*vfrom; vto=srot*ufrom+crot*vfrom)
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    + +

    Definition at line 25 of file movect.F90.

    + +

    Referenced by bicubic_interp_mod::interpolate_bicubic::interpolate_bicubic_vector(), bilinear_interp_mod::interpolate_bilinear::interpolate_bilinear_vector(), budget_interp_mod::interpolate_budget::interpolate_budget_vector(), neighbor_budget_interp_mod::interpolate_neighbor_budget::interpolate_neighbor_budget_vector(), and neighbor_interp_mod::interpolate_neighbor::interpolate_neighbor_vector().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/movect_8F90.js b/ver-5.1.0/movect_8F90.js new file mode 100644 index 00000000..033e8055 --- /dev/null +++ b/ver-5.1.0/movect_8F90.js @@ -0,0 +1,4 @@ +var movect_8F90 = +[ + [ "movect", "movect_8F90.html#a5974e32c0cf90a65b39c68460d761882", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/movect_8F90_source.html b/ver-5.1.0/movect_8F90_source.html new file mode 100644 index 00000000..05a48391 --- /dev/null +++ b/ver-5.1.0/movect_8F90_source.html @@ -0,0 +1,146 @@ + + + + + + + +NCEPLIBS-ip: movect.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    movect.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    4 
    +
    25  SUBROUTINE movect(FLAT,FLON,TLAT,TLON,CROT,SROT)
    +
    26  IMPLICIT NONE
    +
    27 !
    +
    28  INTEGER, PARAMETER :: KD=selected_real_kind(15,45)
    +
    29 !
    +
    30  REAL, INTENT(IN ) :: FLAT, FLON
    +
    31  REAL, INTENT(IN ) :: TLAT, TLON
    +
    32  REAL, INTENT( OUT) :: CROT, SROT
    +
    33 !
    +
    34  REAL(KIND=kd), PARAMETER :: crdlim=0.9999999
    +
    35  REAL(KIND=kd), PARAMETER :: pi=3.14159265358979
    +
    36  REAL(KIND=kd), PARAMETER :: dpr=180./pi
    +
    37 !
    +
    38  REAL(KIND=kd) :: ctlat,stlat,cflat,sflat
    +
    39  REAL(KIND=kd) :: cdlon,sdlon,crd
    +
    40  REAL(KIND=kd) :: srd2rn,str,ctr,sfr,cfr
    +
    41 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    42 ! COMPUTE COSINE OF THE RADIAL DISTANCE BETWEEN THE POINTS.
    +
    43  ctlat=cos(tlat/dpr)
    +
    44  stlat=sin(tlat/dpr)
    +
    45  cflat=cos(flat/dpr)
    +
    46  sflat=sin(flat/dpr)
    +
    47  cdlon=cos((flon-tlon)/dpr)
    +
    48  sdlon=sin((flon-tlon)/dpr)
    +
    49  crd=stlat*sflat+ctlat*cflat*cdlon
    +
    50 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    51 ! COMPUTE ROTATIONS AT BOTH POINTS WITH RESPECT TO THE GREAT CIRCLE
    +
    52 ! AND COMBINE THEM TO GIVE THE TOTAL VECTOR ROTATION PARAMETERS.
    +
    53  IF(abs(crd).LE.crdlim) THEN
    +
    54  srd2rn=-1/(1-crd**2)
    +
    55  str=cflat*sdlon
    +
    56  ctr=cflat*stlat*cdlon-sflat*ctlat
    +
    57  sfr=ctlat*sdlon
    +
    58  cfr=ctlat*sflat*cdlon-stlat*cflat
    +
    59  crot=real(srd2rn*(ctr*cfr-str*sfr))
    +
    60  srot=real(srd2rn*(ctr*sfr+str*cfr))
    +
    61 ! USE A DIFFERENT APPROXIMATION FOR NEARLY COINCIDENT POINTS.
    +
    62 ! MOVING VECTORS TO ANTIPODAL POINTS IS AMBIGUOUS ANYWAY.
    +
    63  ELSE
    +
    64  crot=real(cdlon)
    +
    65  srot=real(sdlon*stlat)
    +
    66  ENDIF
    +
    67 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    68  END SUBROUTINE movect
    +
    subroutine movect(FLAT, FLON, TLAT, TLON, CROT, SROT)
    This subprogram provides the rotation parameters to move a vector along a great circle from one posit...
    Definition: movect.F90:26
    +
    +
    + + + + diff --git a/ver-5.1.0/namespacebicubic__interp__mod.html b/ver-5.1.0/namespacebicubic__interp__mod.html new file mode 100644 index 00000000..d77fa1c8 --- /dev/null +++ b/ver-5.1.0/namespacebicubic__interp__mod.html @@ -0,0 +1,475 @@ + + + + + + + +NCEPLIBS-ip: bicubic_interp_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    bicubic_interp_mod Module Reference
    +
    +
    + +

    Bicubic interpolation routines for scalars and vectors. +More...

    + + + + +

    +Data Types

    interface  interpolate_bicubic
     
    + + + + + + + +

    +Functions/Subroutines

    subroutine interpolate_bicubic_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     This subprogram performs bicubic interpolation from any grid to any grid for scalar fields. More...
     
    subroutine interpolate_bicubic_vector (ipopt, grid_in, grid_out, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
     This subprogram performs bicubic interpolation from any grid to any grid for vector fields. More...
     
    +

    Detailed Description

    +

    Bicubic interpolation routines for scalars and vectors.

    +
    Author
    George Gayno, Mark Iredell, Kyle Gerheiser, Eric Engle
    +

    Function/Subroutine Documentation

    + +

    ◆ interpolate_bicubic_scalar()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine bicubic_interp_mod::interpolate_bicubic_scalar (integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    logical*1, dimension(mi,km), intent(in) LI,
    real, dimension(mi,km), intent(in) GI,
    integer, intent(inout) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) GO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    This subprogram performs bicubic interpolation from any grid to any grid for scalar fields.

    +

    Bitmaps are now allowed even when invalid points are within the bicubic template provided the minimum weight is reached.

    +

    Options allow choices between straight bicubic (ipopt(1)=0) and constrained bicubic (ipopt(1)=1) where the value is confined within the range of the surrounding 16 points.

    +

    Another option is the minimum percentage for mask, i.e. percent valid input data required to make output data, (ipopt(2)) which defaults to 50 (if ipopt(2)=-1).

    +

    Bilinear used within one grid length of boundaries. Only horizontal interpolation is performed.

    +

    The code recognizes the following projections, where for the input and output grids, respectively: as an added bonus the number of output grid points and their latitudes and longitudes are also returned. On the other hand, the output can be a set of station points if igdtnumo<0, in which case the number of points and their latitudes and longitudes must be input. output bitmaps will only be created when the output grid extends outside of the domain of the input grid. the output field is set to 0 where the output bitmap is off.

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]ipoptInterpolation options.
      +
    • ipopt(1)=0 For straight bicubic;
    • +
    • ipopt(1)=1 For constrained bicubic where value is confined within the range of the surrounding 4 points.
    • +
    • ipopt(2) Is minimum percentage for mask (defaults to 50 if ipopt(2)=-1)
    • +
    +
    [in]grid_inInput grid.
    [in]grid_outOutput grid.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [out]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if some ibi(k)=1).
    [in]giInput fields to interpolate.
    [in,out]noNumber of output points (only if igdtnumo<0).
    [in,out]rlatOutput latitudes in degrees (if igdtnumo<0).
    [in,out]rlonOutput longitudes in degrees (if igdtnumo<0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]goOutput fields interpolated.
    [out]iretReturn code.
      +
    • 0 successful interpolation,
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    +
    +
    +
    +
    Author
    George Gayno, Mark Iredell, Kyle Gerheiser, Eric Engle
    + +

    Definition at line 80 of file bicubic_interp_mod.F90.

    + +
    +
    + +

    ◆ interpolate_bicubic_vector()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine bicubic_interp_mod::interpolate_bicubic_vector (integer, dimension(20), intent(in) ipopt,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) mi,
    integer, intent(in) mo,
    integer, intent(in) km,
    integer, dimension(km), intent(in) ibi,
    logical*1, dimension(mi,km), intent(in) li,
    real, dimension(mi,km), intent(in) ui,
    real, dimension(mi,km), intent(in) vi,
    integer, intent(inout) no,
    real, dimension(mo), intent(inout) rlat,
    real, dimension(mo), intent(inout) rlon,
    real, dimension(mo), intent(inout) crot,
    real, dimension(mo), intent(inout) srot,
    integer, dimension(km), intent(out) ibo,
    logical*1, dimension(mo,km), intent(out) lo,
    real, dimension(mo,km), intent(out) uo,
    real, dimension(mo,km), intent(out) vo,
    integer, intent(out) iret 
    )
    +
    +private
    +
    + +

    This subprogram performs bicubic interpolation from any grid to any grid for vector fields.

    +

    Bitmaps are now allowed even when invalid points are within the bicubic template provided the minimum weight is reached.

    +

    Options allow choices between straight bicubic (ipopt(1)=0) and constrained bicubic (ipopt(1)=1) where the value is confined within the range of the surrounding 16 points.

    +

    Another option is the minimum percentage for mask, i.e. percent valid input data required to make output data, (ipopt(2)) which defaults to 50 (if ipopt(2)=-1).

    +

    Bilinear used within one grid length of boundaries. Only horizontal interpolation is performed.

    +

    The code recognizes the following projections, where for the input and output grids, respectively: as an added bonus the number of output grid points and their latitudes and longitudes are also returned. On the other hand, the output can be a set of station points if igdtnumo<0, in which case the number of points and their latitudes and longitudes must be input.

    +

    Output bitmaps will only be created when the output grid extends outside of the domain of the input grid. the output field is set to 0 where the output bitmap is off.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + +
    [in]ipoptinteger (20) interpolation options
      +
    • ipopt(1)=0 for straight bicubic;
    • +
    • ipopt(1)=1 for constrained bicubic where value is confined within the range of the surrounding 4 points.
    • +
    • ipopt(2) is minimum percentage for mask (defaults to 50 if ipopt(2)=-1)
    • +
    +
    [in]grid_inInput grid.
    [in]grid_outOutput grid.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [out]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if some ibi(k)=1).
    [in]uiInput u-component fields to interpolate.
    [in]viInput v-component fields to interpolate.
    [in,out]noNumber of output points (only if igdtnumo<0).
    [in,out]rlatOutput latitudes in degrees (if igdtnumo<0).
    [in,out]rlonOutput longitudes in degrees (if igdtnumo<0).
    [in,out]crotVector rotation cosines (if igdtnumo<0) ugrid=crot*uearth-srot*vearth.
    [in,out]srotVector rotation sines (if igdtnumo<0) vgrid=srot*uearth+crot*vearth).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]uoOutput u-component fields interpolated.
    [out]voOutput v-component fields interpolated.
    [out]iretReturn code.
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    +
    +
    +
    +
    Author
    George Gayno, Mark Iredell, Kyle Gerheiser, Eric Engle
    + +

    Definition at line 338 of file bicubic_interp_mod.F90.

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespacebicubic__interp__mod.js b/ver-5.1.0/namespacebicubic__interp__mod.js new file mode 100644 index 00000000..bd0e9a49 --- /dev/null +++ b/ver-5.1.0/namespacebicubic__interp__mod.js @@ -0,0 +1,6 @@ +var namespacebicubic__interp__mod = +[ + [ "interpolate_bicubic", "interfacebicubic__interp__mod_1_1interpolate__bicubic.html", "interfacebicubic__interp__mod_1_1interpolate__bicubic" ], + [ "interpolate_bicubic_scalar", "namespacebicubic__interp__mod.html#a54a442e47f1be9511c1684a337d7e2d1", null ], + [ "interpolate_bicubic_vector", "namespacebicubic__interp__mod.html#a9d27db7d350fc2699aaf5057c3b53d16", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/namespacebilinear__interp__mod.html b/ver-5.1.0/namespacebilinear__interp__mod.html new file mode 100644 index 00000000..9bc7065d --- /dev/null +++ b/ver-5.1.0/namespacebilinear__interp__mod.html @@ -0,0 +1,465 @@ + + + + + + + +NCEPLIBS-ip: bilinear_interp_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    bilinear_interp_mod Module Reference
    +
    +
    + +

    Bilinear interpolation routines for scalars and vectors. +More...

    + + + + +

    +Data Types

    interface  interpolate_bilinear
     
    + + + + + + + +

    +Functions/Subroutines

    subroutine interpolate_bilinear_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     This subprogram performs bilinear interpolation from any grid to any grid for scalar fields. More...
     
    subroutine interpolate_bilinear_vector (ipopt, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     This subprogram performs bilinear interpolation from any grid to any grid for vector fields. More...
     
    +

    Detailed Description

    +

    Bilinear interpolation routines for scalars and vectors.

    +
    Author
    George Gayno, Mark Iredell, Kyle Gerheiser, Eric Engle
    +

    Function/Subroutine Documentation

    + +

    ◆ interpolate_bilinear_scalar()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine bilinear_interp_mod::interpolate_bilinear_scalar (integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    logical*1, dimension(mi,km), intent(in) LI,
    real, dimension(mi,km), intent(in) GI,
    integer, intent(inout) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) GO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    This subprogram performs bilinear interpolation from any grid to any grid for scalar fields.

    +

    Options allow varying the minimum percentage for mask, i.e. percent valid input data required to make output data, (ipopt(1)) which defaults to 50 (if ipopt(1)=-1). only horizontal interpolation is performed. if no input data is found near the output point, a spiral search may be invoked by setting ipopt(2)> 0. no searching is done if output point is outside the input grid. as an added bonus the number of output grid points and their latitudes and longitudes are also returned. on the other hand, the output can be a set of station points if igdtnumo<0, in which case the number of points and their latitudes and longitudes must be input. input bitmaps will be interpolated to output bitmaps. output bitmaps will also be created when the output grid extends outside of the domain of the input grid.

    +

    The output field is set to 0 where the output bitmap is off.

    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]ipoptinterpolation options
      +
    • ipopt(1) is minimum percentage for mask (defaults to 50 if ipopt(1)=-1)
    • +
    • ipopt(2) is width of square to examine in spiral search (defaults to no search if ipopt(2)=-1)
    • +
    +
    [in]grid_ininput grid
    [in]grid_outoutput grid
    [in]miskip number between input grid fields if km>1 or dimension of input grid fields if km=1
    [out]moskip number between output grid fields if km>1 or dimension of output grid fields if km=1
    [in]kmnumber of fields to interpolate
    [in]ibiinput bitmap flags
    [in]liinput bitmaps (if some ibi(k)=1)
    [in]giinput fields to interpolate
    [in,out]nonumber of output points (only if igdtnumo<0)
    [in,out]rlatoutput latitudes in degrees (if igdtnumo<0)
    [in,out]rlonoutput longitudes in degrees (if igdtnumo<0)
    [out]ibooutput bitmap flags
    [out]looutput bitmaps (always output)
    [out]gooutput fields interpolated
    [out]iretreturn code
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    +
    +
    +
    +
    Author
    George Gayno, Mark Iredell, Kyle Gerheiser, Eric Engle
    + +

    Definition at line 72 of file bilinear_interp_mod.F90.

    + +
    +
    + +

    ◆ interpolate_bilinear_vector()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine bilinear_interp_mod::interpolate_bilinear_vector (integer, dimension(20), intent(in) ipopt,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    logical*1, dimension(mi,km), intent(in) LI,
    real, dimension(mi,km), intent(in) UI,
    real, dimension(mi,km), intent(in) VI,
    integer, intent(inout) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    real, dimension(mo), intent(inout) CROT,
    real, dimension(mo), intent(inout) SROT,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) UO,
    real, dimension(mo,km), intent(out) VO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    This subprogram performs bilinear interpolation from any grid to any grid for vector fields.

    +

    Options allow varying the minimum percentage for mask, i.e. percent valid input data required to make output data, (ipopt(1)) which defaults to 50 (if ipopt(1)=-1).

    +

    Only horizontal interpolation is performed. the input and output vectors are rotated so that they are either resolved relative to the defined grid in the direction of increasing x and y coordinates or resolved relative to easterly and northerly directions, as designated by their respective grid description sections.

    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned along with their vector rotation parameters. on the other hand, the data may be interpolated to a set of station points if igdtnumo < 0, in which case the number of points and their latitudes and longitudes must be input along with their vector rotation parameters. input bitmaps will be interpolated to output bitmaps. output bitmaps will also be created when the output grid extends outside of the domain of the input grid. the output field is set to 0 where the output bitmap is off.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + +
    [in]ipoptinterpolation options
      +
    • ipopt(1) is minimum percentage for mask (defaults to 50 if ipopt(1)=-1)
    • +
    +
    [in]grid_inInput grid
    [in]grid_outOutput grid
    [in]miskip number between input grid fields if km>1 or dimension of input grid fields if km=1
    [out]moskip number between output grid fields if km>1 or dimension of output grid fields if km=1
    [in]kmnumber of fields to interpolate
    [in]ibiinput bitmap flags
    [in]liinput bitmaps (if some ibi(k)=1)
    [in]uiinput u-component fields to interpolate
    [in]viinput v-component fields to interpolate
    [in,out]nonumber of output points (only if igdtnumo<0)
    [in,out]rlatoutput latitudes in degrees (if igdtnumo<0)
    [in,out]rlonoutput longitudes in degrees (if igdtnumo<0)
    [in,out]crotvector rotation cosines (if igdtnumo<0) ugrid=crot*uearth-srot*vearth;
    [in,out]srotvector rotation sines (if igdtnumo<0) vgrid=srot*uearth+crot*vearth)
    [out]ibooutput bitmap flags
    [out]looutput bitmaps (always output)
    [out]uooutput u-component fields interpolated
    [out]vooutput v-component fields interpolated
    [out]iretreturn code
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    +
    +
    +
    +
    Author
    George Gayno, Mark Iredell, Kyle Gerheiser, Eric Engle
    + +

    Definition at line 329 of file bilinear_interp_mod.F90.

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespacebilinear__interp__mod.js b/ver-5.1.0/namespacebilinear__interp__mod.js new file mode 100644 index 00000000..b8f83c44 --- /dev/null +++ b/ver-5.1.0/namespacebilinear__interp__mod.js @@ -0,0 +1,6 @@ +var namespacebilinear__interp__mod = +[ + [ "interpolate_bilinear", "interfacebilinear__interp__mod_1_1interpolate__bilinear.html", "interfacebilinear__interp__mod_1_1interpolate__bilinear" ], + [ "interpolate_bilinear_scalar", "namespacebilinear__interp__mod.html#a34d2eea4682104097dccf3e7ab6a9398", null ], + [ "interpolate_bilinear_vector", "namespacebilinear__interp__mod.html#abc218f8774d2af09299eb299d6f38e04", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/namespacebudget__interp__mod.html b/ver-5.1.0/namespacebudget__interp__mod.html new file mode 100644 index 00000000..1ee077a1 --- /dev/null +++ b/ver-5.1.0/namespacebudget__interp__mod.html @@ -0,0 +1,476 @@ + + + + + + + +NCEPLIBS-ip: budget_interp_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    budget_interp_mod Module Reference
    +
    +
    + +

    Budget interpolation routines for scalars and vectors. +More...

    + + + + +

    +Data Types

    interface  interpolate_budget
     
    + + + + + + + +

    +Functions/Subroutines

    subroutine interpolate_budget_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Performs budget interpolation from any grid to any grid (or to random station points) for scalar fields. More...
     
    subroutine interpolate_budget_vector (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     This subprogram performs budget interpolation from any grid to any grid (or to random station points) for vector fields. More...
     
    +

    Detailed Description

    +

    Budget interpolation routines for scalars and vectors.

    +
    Author
    George Gayno, Mark Iredell, Kyle Gerheiser, Eric Engle
    +
    Date
    July 2021
    +

    Function/Subroutine Documentation

    + +

    ◆ interpolate_budget_scalar()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine budget_interp_mod::interpolate_budget_scalar (integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    logical*1, dimension(mi,km), intent(in) LI,
    real, dimension(mi,km), intent(in) GI,
    integer, intent(out) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) GO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Performs budget interpolation from any grid to any grid (or to random station points) for scalar fields.

    +

    The algorithm simply computes (weighted) averages of bilinearly interpolated points arranged in a square box centered around each output grid point and stretching nearly halfway to each of the neighboring grid points.

    +

    Options allow choices of number of points in each radius from the center point (ipopt(1)) which defaults to 2 (if ipopt(1)=-1) meaning that 25 points will be averaged; further options are the respective weights for the radius points starting at the center point (ipopt(2:2+ipopt(1)) which defaults to all 1 (if ipopt(1)=-1 or ipopt(2)=-1).

    +

    A special interpolation is done if ipopt(2)=-2. in this case, the boxes stretch nearly all the way to each of the neighboring grid points and the weights are the adjoint of the bilinear interpolation weights. This case gives quasi-second-order budget interpolation.

    +

    Another option is the minimum percentage for mask, i.e. percent valid input data required to make output data, (ipopt(3+ipopt(1)) which defaults to 50 (if -1).

    +

    In cases where there is no or insufficient valid input data, the user may choose to search for the nearest valid data. this is invoked by setting ipopt(20) to the width of the search square. The default is 1 (no search). Squares are searched for valid data in a spiral pattern starting from the center. No searching is done where the output grid is outside the input grid.

    +

    Only horizontal interpolation is performed.

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]ipoptInterpolation options
      +
    • ipopt(1) is number of radius points (defaults to 2 if ipopt(1)=-1).
    • +
    • ipopt(2:2+ipopt(1)) are respective weights (defaults to all 1 if ipopt(1)=-1 or ipopt(2)=-1).
    • +
    • ipopt(3+ipopt(1)) is minimum percentage for mask (defaults to 50 if ipopt(3+ipopt(1)=-1).
    • +
    +
    [in]grid_inInput grid
    [in]grid_outOutput grid
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [out]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if some ibi(k)=1).
    [in]giInput fields to interpolate.
    [in,out]noNumber of output points (only if igdtnumo<0).
    [in,out]rlatOutput latitudes in degrees (if igdtnumo<0).
    [in,out]rlonOutput longitudes in degrees (if igdtnumo<0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]goOutput fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 32 Invalid budget method parameters.
    • +
    +
    +
    +
    +
    Author
    Marke Iredell, George Gayno, Kyle Gerheiser, Eric Engle
    +
    Date
    July 2021
    + +

    Definition at line 94 of file budget_interp_mod.F90.

    + +
    +
    + +

    ◆ interpolate_budget_vector()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine budget_interp_mod::interpolate_budget_vector (integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    logical*1, dimension(mi,km), intent(in) LI,
    real, dimension(mi,km), intent(in) UI,
    real, dimension(mi,km), intent(in) VI,
    integer, intent(out) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    real, dimension(mo), intent(out) CROT,
    real, dimension(mo), intent(out) SROT,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) UO,
    real, dimension(mo,km), intent(out) VO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    This subprogram performs budget interpolation from any grid to any grid (or to random station points) for vector fields.

    +

    The algorithm simply computes (weighted) averages of bilinearly interpolated points arranged in a square box centered around each output grid point and stretching nearly halfway to each of the neighboring grid points.

    +

    Options allow choices of number of points in each radius from the center point (ipopt(1)) which defaults to 2 (if ipopt(1)=-1) meaning that 25 points will be averaged; further options are the respective weights for the radius points starting at the center point (ipopt(2:2+ipopt(1)) which defaults to all 1 (if ipopt(1)=-1 or ipopt(2)=-1).

    +

    A special interpolation is done if ipopt(2)=-2. in this case, the boxes stretch nearly all the way to each of the neighboring grid points and the weights are the adjoint of the bilinear interpolation weights. This case gives quasi-second-order budget interpolation.

    +

    Another option is the minimum percentage for mask, i.e. percent valid input data required to make output data, (ipopt(3+ipopt(1)) which defaults to 50 (if -1).

    +

    In cases where there is no or insufficient valid input data, the user may choose to search for the nearest valid data. this is invoked by setting ipopt(20) to the width of the search square. The default is 1 (no search). Squares are searched for valid data in a spiral pattern starting from the center. No searching is done where the output grid is outside the input grid.

    +

    Only horizontal interpolation is performed.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + +
    [in]ipoptinterpolation options ipopt(1) Number of radius points (defaults to 2 if ipopt(1)=-1); ipopt(2:2+ipopt(1)) Respective weights (defaults to all 1 if ipopt(1)=-1 or ipopt(2)=-1). ipopt(3+ipopt(1)) Minimum percentage for mask (defaults to 50 if ipopt(3+ipopt(1)=-1)
    [in]grid_inInput grid.
    [in]grid_outOutput grid.
    [in]miskip Number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [out]moskip Number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if some ibi(k)=1).
    [in]uiInput u-component fields to interpolate.
    [in]viInput v-component fields to interpolate.
    [in,out]noNumber of output points (only if igdtnumo<0)
    [in,out]rlatOutput latitudes in degrees (if igdtnumo<0)
    [in,out]rlonOutput longitudes in degrees (if igdtnumo<0)
    [in,out]crotVector rotation cosines. If interpolating subgrid ugrid=crot * uearth - srot * vearth.
    [in,out]srotVector rotation sines. If interpolating subgrid vgrid = srot * uearth + crot * vearth.
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]uoOutput u-component fields interpolated.
    [out]voOutput v-component fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 32 Invalid budget method parameters.
    • +
    +
    +
    +
    +
    Author
    Marke Iredell, George Gayno, Kyle Gerheiser, Eric Engle
    +
    Date
    July 2021
    + +

    Definition at line 423 of file budget_interp_mod.F90.

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespacebudget__interp__mod.js b/ver-5.1.0/namespacebudget__interp__mod.js new file mode 100644 index 00000000..7a866c1c --- /dev/null +++ b/ver-5.1.0/namespacebudget__interp__mod.js @@ -0,0 +1,6 @@ +var namespacebudget__interp__mod = +[ + [ "interpolate_budget", "interfacebudget__interp__mod_1_1interpolate__budget.html", "interfacebudget__interp__mod_1_1interpolate__budget" ], + [ "interpolate_budget_scalar", "namespacebudget__interp__mod.html#a09bd6535b0c2e1022cfde39c39d14466", null ], + [ "interpolate_budget_vector", "namespacebudget__interp__mod.html#abc99486ee9c0091c1514af6114d4e803", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/namespaceearth__radius__mod.html b/ver-5.1.0/namespaceearth__radius__mod.html new file mode 100644 index 00000000..b72f743f --- /dev/null +++ b/ver-5.1.0/namespaceearth__radius__mod.html @@ -0,0 +1,183 @@ + + + + + + + +NCEPLIBS-ip: earth_radius_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    earth_radius_mod Module Reference
    +
    +
    + +

    Determine earth radius and shape. +More...

    + + + + + +

    +Functions/Subroutines

    subroutine, public earth_radius (IGDTMPL, IGDTLEN, RADIUS, ECCEN_SQUARED)
     Determine earth radius and shape. More...
     
    +

    Detailed Description

    +

    Determine earth radius and shape.

    +
    Author
    Gayno, Kyle Gerheiser
    +

    Function/Subroutine Documentation

    + +

    ◆ earth_radius()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine, public earth_radius_mod::earth_radius (integer, dimension(igdtlen), intent(in) IGDTMPL,
    integer, intent(in) IGDTLEN,
    real, intent(out) RADIUS,
    real, intent(out) ECCEN_SQUARED 
    )
    +
    + +

    Determine earth radius and shape.

    +

    Determine the radius and shape of the earth from the grib 2 grid definition template array - section 3.

    +
    Parameters
    + + + + + +
    [in]igdtmplinteger (igdtlen) grid definition template array. Corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure. For all map projections recognized by iplib, the entries use by this routine are:
      +
    • 1 shape of earth, section 3, octet 15
    • +
    • 2 scale factor of spherical earth radius, octet 16
    • +
    • 3 scaled value of radius of spherical earth, octets 17-20
    • +
    • 4 scale factor of major axis of elliptical earth, octet 21
    • +
    • 5 scaled value of major axis of elliptical earth, octets 22-25
    • +
    • 6 scale factor of minor axis of elliptical earth, octet 26
    • +
    • 7 scaled value of minor axis of elliptical earth, octets 27-30
    • +
    +
    [in]igdtleninteger number of elements of the grid definition template array. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [out]radiusreal earth radius in meters. For ellipitical earths, this is the semi major axis. See "map projectsions - a + working manual" by Snyder (1987) for details.
    [out]eccen_squaredreal earth eccentricity squared
    +
    +
    +
    Author
    Gayno
    +
    Date
    2015-07-14
    + +

    Definition at line 40 of file earth_radius_mod.F90.

    + +

    Referenced by spectral_interp_mod::polates4::polates4_grib2(), and spectral_interp_mod::polatev4::polatev4_grib2().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespacegdswzd__c__mod.html b/ver-5.1.0/namespacegdswzd__c__mod.html new file mode 100644 index 00000000..7fff573a --- /dev/null +++ b/ver-5.1.0/namespacegdswzd__c__mod.html @@ -0,0 +1,556 @@ + + + + + + + +NCEPLIBS-ip: gdswzd_c_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    gdswzd_c_mod Module Reference
    +
    +
    + +

    Module that contains C wrapper for routine gdswzd(). +More...

    + + + + + + + + +

    +Functions/Subroutines

    subroutine gdswzd_c (IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     C wrapper for routine gdswzd(). More...
     
    subroutine gdswzd_c_grib1 (KGDS, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     C wrapper for routine gdswzd. More...
     
    +

    Detailed Description

    +

    Module that contains C wrapper for routine gdswzd().

    +
    Author
    JOVIC
    +
    Date
    2016-04-10
    +

    Function/Subroutine Documentation

    + +

    ◆ gdswzd_c()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine gdswzd_c_mod::gdswzd_c (integer(kind=c_int), intent(in), value IGDTNUM,
    integer(kind=c_int), dimension(igdtlen), intent(in) IGDTMPL,
    integer(kind=c_int), intent(in), value IGDTLEN,
    integer(kind=c_int), intent(in), value IOPT,
    integer(kind=c_int), intent(in), value NPTS,
    real(kind=c_double), intent(in), value FILL,
    real(kind=c_double), dimension(npts), intent(inout) XPTS,
    real(kind=c_double), dimension(npts), intent(inout) YPTS,
    real(kind=c_double), dimension(npts), intent(inout) RLON,
    real(kind=c_double), dimension(npts), intent(inout) RLAT,
    integer(kind=c_int), intent(out) NRET,
    real(kind=c_double), dimension(npts), intent(out) CROT,
    real(kind=c_double), dimension(npts), intent(out) SROT,
    real(kind=c_double), dimension(npts), intent(out) XLON,
    real(kind=c_double), dimension(npts), intent(out) XLAT,
    real(kind=c_double), dimension(npts), intent(out) YLON,
    real(kind=c_double), dimension(npts), intent(out) YLAT,
    real(kind=c_double), dimension(npts), intent(out) AREA 
    )
    +
    + +

    C wrapper for routine gdswzd().

    +

    Use this routine to call gdswzd() from a C or C++ program. Takes advantage of the fortran/c interoperability standard.

    +

    +Program History Log

    + + + + + + + +
    Date Programmer Comments
    2016-04-10 Jovic initial version.
    2016-04-26 G. Gayno update for grib 2
    +

    +Example: Mixed precsion iplib call

    +
    include "iplib.h"
    +
    +
    int *igdtmpl;
    +
    int igdtnum, igdtlen, iopt, npts, nret;
    +
    double fill;
    +
    double *xpts, *ypts, *rlon, *rlat;
    +
    double *crot, *srot, *xlon, *xlat, *ylon, *ylat, *area;
    +
    +
    gdswzd(igdtnum, igdtmpl, igdtlen, iopt, npts,
    +
    fill, xpts, ypts, rlon, rlat,
    +
    &nret, crot, srot, xlon,
    +
    xlat, ylon, ylat, area);
    +
    void gdswzd(int igdtnum, int *igdtmpl, int igdtlen, int iopt, int npts, float fill, float *xpts, float *ypts, float *rlon, float *rlat, int *nret, float *crot, float *srot, float *xlon, float *xlat, float *ylon, float *ylat, float *area)
    gdswzd() interface for C for _4 build of library.
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + +
    [in]igdtnumgrid definition template number. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure.
      +
    • 00 equidistant cylindrical
    • +
    • 01 rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • 10 mercator cyclindrical
    • +
    • 20 polar stereographic azimuthal
    • +
    • 30 lambert conformal conical
    • +
    • 40 gaussian equidistant cyclindrical
    • +
    +
    [in]igdtmpl(igdtlen) grid definition template array. corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure for section three. all projections:
      +
    • 1 shape of earth, octet 15
    • +
    • 2 scale factor of spherical earth radius, octet 16
    • +
    • 3 scaled value of radius of spherical earth, octets 17-20
    • +
    • 4 scale factor of major axis of elliptical earth, octet 21
    • +
    • 5 scaled value of major axis of elliptical earth, octets 22-25
    • +
    • 6 scale factor of minor axis of elliptical earth, octet 26
    • +
    • 7 scaled value of minor axis of elliptical earth, octets 27-30 equidistant cyclindrical:
    • +
    • 8 number of points along a parallel, octs 31-34
    • +
    • 9 number of points along a meridian, octs 35-38
    • +
    • 10 basic angle of initial production domain, octets 39-42.
    • +
    • 11 subdivisions of basic angle, octets 43-46
    • +
    • 12 latitude of first grid point, octets 47-50
    • +
    • 13 longitude of first grid point, octets 51-54
    • +
    • 14 resolution and component flags, octet 55
    • +
    • 15 latitude of last grid point, octets 56-59
    • +
    • 16 longitude of last grid point, octets 60-63
    • +
    • 17 i-direction increment, octets 64-67
    • +
    • 18 j-direction increment, octets 68-71
    • +
    • 19 scanning mode, octet 72 mercator cyclindrical:
    • +
    • 8 number of points along a parallel, octs 31-34
    • +
    • 9 number of points along a meridian, octs 35-38
    • +
    • 10 latitude of first point, octets 39-42
    • +
    • 11 longitude of first point, octets 43-46
    • +
    • 12 resolution and component flags, octet 47
    • +
    • 13 tangent latitude, octets 48-51
    • +
    • 14 latitude of last point, octets 52-55
    • +
    • 15 longitude of last point, octets 56-59
    • +
    • 16 scanning mode flags, octet 60
    • +
    • 17 orientation of grid, octets 61-64
    • +
    • 18 longitudinal grid length, octets 65-68
    • +
    • 19 latitudinal grid length, octets 69-72 Lambert conformal conical:
    • +
    • 8 number of points along x-axis, octs 31-34
    • +
    • 9 number of points along y-axis, octs 35-38
    • +
    • 10 latitude of first point, octets 39-42
    • +
    • 11 longitude of first point, octets 43-46
    • +
    • 12 resolution of component flag, octet 47
    • +
    • 13 latitude where grid lengths specified, octets 48-51
    • +
    • 14 longitude of meridian that is parallel to y-axis, octets 52-55
    • +
    • 15 x-direction grid length, octets 56-59
    • +
    • 16 y-direction grid length, octets 60-63
    • +
    • 17 projection center flag, octet 64
    • +
    • 18 scanning mode, octet 65
    • +
    • 19 first tangent latitude from pole, octets 66-69
    • +
    • 20 second tangent latitude from pole, octets 70-73
    • +
    • 21 latitude of south pole of projection, octets 74-77
    • +
    • 22 longitude of south pole of projection, octets 78-81 gaussian cylindrical:
    • +
    • 8 number of points along a parallel, octs 31-34
    • +
    • 9 number of points along a meridian, octs 35-38
    • +
    • 10 basic angle of initial production domain, octets 39-42
    • +
    • 11 subdivisions of basic angle, octets 43-46
    • +
    • 12 latitude of first grid point, octets 47-50
    • +
    • 13 longitude of first grid point, octets 51-54
    • +
    • 14 resolution and component flags, octet 55
    • +
    • 15 latitude of last grid point, octets 56-59
    • +
    • 16 longitude of last grid point, octets 60-63
    • +
    • 17 i-direction increment, octets 64-67
    • +
    • 18 number of parallels between pole and equator, octets 68-71
    • +
    • 19 scanning mode, octet 72 polar stereographic azimuthal:
    • +
    • 8 number of points along x-axis, octets 31-34
    • +
    • 9 number of points along y-axis, octets 35-38
    • +
    • 10 latitude of first grid point, octets 39-42
    • +
    • 11 longitude of first grid point, octets 43-46
    • +
    • 12 resolution and component flags, octet 47
    • +
    • 13 true latitude, octets 48-51
    • +
    • 14 orientation longitude, octets 52-55
    • +
    • 15 x-direction grid length, octets 56-59
    • +
    • 16 y-direction grid length, octets 60-63
    • +
    • 17 projection center flag, octet 64
    • +
    • 18 scanning mode flags, octet 65 rotated equidistant cyclindrical:
    • +
    • 8 number of points along a parallel, octs 31-34
    • +
    • 9 number of points along a meridian, octs 35-38
    • +
    • 10 basic angle of initial production domain, octets 39-42
    • +
    • 11 subdivisions of basic angle, octets 43-46
    • +
    • 12 latitude of first grid point, octets 47-50
    • +
    • 13 longitude of first grid point, octets 51-54
    • +
    • 14 resolution and component flags, octet 55
    • +
    • 15 latitude of last grid point, octets 56-59
    • +
    • 16 longitude of last grid point, octets 60-63
    • +
    • 17 i-direction increment, octets 64-67
    • +
    • 18 j-direction increment, octets 68-71
    • +
    • 19 scanning mode, octet 72
    • +
    • 20 latitude of southern pole of projection, octets 73-76
    • +
    • 21 longitude of southern pole of projection, octets 77-80
    • +
    • 22 angle of rotation of projection, octs 81-84
    • +
    +
    [in]igdtlennumber of elements of the grid definition template array. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]ioptoption flag
      +
    • 0 to compute earth coords of all the grid points
    • +
    • 1 to compute earth coords of selected grid coords
    • +
    • -1 to compute grid coords of selected earth coords
    • +
    +
    [in]nptsinteger maximum number of coordinates
    [in]fillreal fill value to set invalid output data (must be impossible value; suggested value: -9999.)
    [in,out]xptsreal (npts) grid x point coordinates if iopt>0
    [in,out]yptsreal (npts) grid y point coordinates if iopt>0
    [in,out]rlonreal (npts) earth longitudes in degrees e if iopt<0 (acceptable range: -360. to 360.)
    [in,out]rlatreal (npts) earth latitudes in degrees n if iopt<0 (acceptable range: -90. to 90.)
    [out]nretnumber of valid points computed (-1 if projection unrecognized)
    [out]crot(npts) clockwise vector rotation cosines
    [out]srot(npts) clockwise vector rotation sines (ugrid=crot*uearth-srot*vearth, vgrid=srot*uearth+crot*vearth)
    [out]xlon(npts) dx/dlon in 1/degrees
    [out]xlat(npts) dx/dlat in 1/degrees
    [out]ylon(npts) dy/dlon in 1/degrees
    [out]ylat(npts) dy/dlat in 1/degrees
    [out]AREA(npts) area weights in m**2 (Proportional to the square of the map factor in the case of conformal projections.)
    +
    +
    +
    Author
    JOVIC
    +
    Date
    2016-04-10
    + +

    Definition at line 173 of file gdswzd_c.F90.

    + +
    +
    + +

    ◆ gdswzd_c_grib1()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine gdswzd_c_mod::gdswzd_c_grib1 (integer(kind=c_int), dimension(200), intent(in) KGDS,
    integer(kind=c_int), intent(in), value IOPT,
    integer(kind=c_int), intent(in), value NPTS,
    real(kind=c_double), intent(in), value FILL,
    real(kind=c_double), dimension(npts), intent(inout) XPTS,
    real(kind=c_double), dimension(npts), intent(inout) YPTS,
    real(kind=c_double), dimension(npts), intent(inout) RLON,
    real(kind=c_double), dimension(npts), intent(inout) RLAT,
    integer(kind=c_int), intent(out) NRET,
    real(kind=c_double), dimension(npts), intent(out) CROT,
    real(kind=c_double), dimension(npts), intent(out) SROT,
    real(kind=c_double), dimension(npts), intent(out) XLON,
    real(kind=c_double), dimension(npts), intent(out) XLAT,
    real(kind=c_double), dimension(npts), intent(out) YLON,
    real(kind=c_double), dimension(npts), intent(out) YLAT,
    real(kind=c_double), dimension(npts), intent(out) AREA 
    )
    +
    + +

    C wrapper for routine gdswzd.

    +

    Use this routine to call 'gdswzd' from a C or C++ program. Takes advantage of the fortran/c interoperability standard.

    +

    +Example: mixed precsion iplib call

    +
    include "iplib.h"
    +
    +
    int kgds[200];
    +
    int iopt, npts, nret;
    +
    double fill;
    +
    double *xpts, *ypts, *rlon, *rlat;
    +
    double *crot, *srot, *xlon, *xlat, *ylon, *ylat, *area;
    +
    +
    gdswzd(kgds, iopt, npts, fill,
    +
    xpts, ypts, rlon, rlat,
    +
    &nret, crot, srot, xlon,
    +
    xlat, ylon, ylat, area);
    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    kgds(200) gds parameters as decoded by w3fi63.
    ioptoption flag
      +
    • 0 to compute earth coords of all the grid points
    • +
    • 1 to compute earth coords of selected grid coords
    • +
    • -1 to compute grid coords of selected earth coords
    • +
    +
    nptsmaximum number of coordinates
    fillfill value to set invalid output data (must be impossible value; suggested value: -9999.)
    xpts(npts) grid x point coordinates if iopt>0
    ypts(npts) grid y point coordinates if iopt>0
    [out]rlon(npts) earth longitudes in degrees e if iopt<0 (acceptable range: -360. to 360.)
    [out]rlat(npts) earth latitudes in degrees n if iopt<0 (acceptable range: -90. to 90.)
    [out]nretnumber of valid points computed (-1 if projection unrecognized)
    [out]crot(npts) clockwise vector rotation cosines
    [out]srot(npts) clockwise vector rotation sines (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlon(npts) dx/dlon in 1/degrees
    [out]xlat(npts) dx/dlat in 1/degrees
    [out]ylon(npts) dy/dlon in 1/degrees
    [out]ylat(npts) dy/dlat in 1/degrees
    [out]area(npts) area weights in m**2 (proportional to the square of the map factor in the case of conformal projections.)
    +
    +
    +
    Author
    JOVIC
    +
    Date
    2016-04-10
    + +

    Definition at line 259 of file gdswzd_c.F90.

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespacegdswzd__mod.html b/ver-5.1.0/namespacegdswzd__mod.html new file mode 100644 index 00000000..9d403096 --- /dev/null +++ b/ver-5.1.0/namespacegdswzd__mod.html @@ -0,0 +1,1309 @@ + + + + + + + +NCEPLIBS-ip: gdswzd_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    gdswzd_mod Module Reference
    +
    +
    + +

    Driver module for gdswzd routines. +More...

    + + + + +

    +Data Types

    interface  gdswzd
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine gdswzd_1d_array (IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Decodes the grib 2 grid definition template and returns one of the following: More...
     
    subroutine gdswzd_2d_array (IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Decodes the grib 2 grid definition template and returns one of the following (for 2d-arrays): More...
     
    subroutine, public gdswzd_2d_array_grib1 (KGDS, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Decodes the grib grid description section and returns one of the following (for 2-d arrays): More...
     
    subroutine, public gdswzd_grib1 (KGDS, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Decodes the grib grid description section and returns one of the following (for 1-d arrays): More...
     
    subroutine gdswzd_grid (grid, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Returns one of the following for a grid object: More...
     
    subroutine gdswzd_scalar (IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Decodes the grib 2 grid definition template and returns one of the following (for scalars): More...
     
    +

    Detailed Description

    +

    Driver module for gdswzd routines.

    +

    These routines do the following for several map projections:

      +
    • Convert from earth to grid coordinates or vice versa.
    • +
    • Compute vector rotation sines and cosines.
    • +
    • Compute map jacobians.
    • +
    • Compute grid box area.
    • +
    +

    Map projections include:

      +
    • Equidistant Cyclindrical
    • +
    • Mercator Cylindrical
    • +
    • Gaussian Cylindrical
    • +
    • Polar stereographic
    • +
    • Lambert Conformal Conic
    • +
    • Rotated Equidistant Cyclindrical ("E" and non-"E" staggers)
    • +
    +
    Author
    Mark Iredell, George Gayno, Kyle Gerheiser
    +
    Date
    Jan 2015
    +

    Function/Subroutine Documentation

    + +

    ◆ gdswzd_1d_array()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine gdswzd_mod::gdswzd_1d_array (integer, intent(in) IGDTNUM,
    integer, dimension(igdtlen), intent(in) IGDTMPL,
    integer, intent(in) IGDTLEN,
    integer, intent(in) IOPT,
    integer, intent(in) NPTS,
    real, intent(in) FILL,
    real, dimension(npts), intent(inout) XPTS,
    real, dimension(npts), intent(inout) YPTS,
    real, dimension(npts), intent(inout) RLON,
    real, dimension(npts), intent(inout) RLAT,
    integer, intent(out) NRET,
    real, dimension(npts), intent(out), optional CROT,
    real, dimension(npts), intent(out), optional SROT,
    real, dimension(npts), intent(out), optional XLON,
    real, dimension(npts), intent(out), optional XLAT,
    real, dimension(npts), intent(out), optional YLON,
    real, dimension(npts), intent(out), optional YLAT,
    real, dimension(npts), intent(out), optional AREA 
    )
    +
    +private
    +
    + +

    Decodes the grib 2 grid definition template and returns one of the following:

    +
      +
    • iopt=0 Grid and earth coordinates of all grid points.
    • +
    • iopt=+1 Earth coordinates of selected grid coordinates.
    • +
    • iopt=-1 Grid coordinates of selected earth coordinates.
    • +
    +

    The current code recognizes the following projections, where "igdtnum" is the grid definition template number:

      +
    • igdtnum=00 Equidistant Cylindrical
    • +
    • igdtnum=01 Rotated Equidistant Cylindrical. "E" and non-"E" staggered
    • +
    • igdtnum=10 Mercator Cyclindrical
    • +
    • igdtnum=20 Polar Stereographic Azimuthal
    • +
    • igdtnum=30 Lambert Conformal Conical
    • +
    • igdtnum=40 Gaussian Equidistant Cyclindrical
    • +
    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values. Also if iopt=0, if the number of grid points exceeds the number allotted, then all the output elements are set to fill values.

    +

    The actual number of valid points computed is returned too.

    +

    Optionally, the vector rotations, map jacobians and grid box areas may be returned.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present. To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present.

    +

    To compute the grid box areas, the optional argument 'area' must be present.

    +
    Parameters
    + + + +
    [in]igdtnumGrid definition template number. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure:
      +
    • 00 - Equidistant Cylindrical
    • +
    • 01 - Rotated Equidistant Cylindrical. "E" and non-"E" staggered
    • +
    • 10 - Mercator Cyclindrical
    • +
    • 20 - Polar Stereographic Azimuthal
    • +
    • 30 - Lambert Conformal Conical
    • +
    • 40 - Gaussian Equidistant Cyclindrical
    • +
    +
    [in]igdtmplGrid definition template array. Corresponds to the gfldigdtmpl component of the NCEPLIBS-g2 gridmod data structure
    +
    +
    +

    Section 3 Info:

    +

    All Map Projections:

      +
    • 1: Shape of earth, octet 15.
    • +
    • 2: Scale factor of spherical earth radius, octet 16.
    • +
    • 3: Scaled value of radius of spherical earth, octets 17-20.
    • +
    • 4: Scale factor of major axis of elliptical earth, octet 21.
    • +
    • 5: Scaled value of major axis of elliptical earth, octets 22-25.
    • +
    • 6: Scale factor of minor axis of elliptical earth, octet 26.
    • +
    • 7: Scaled value of minor axis of elliptical earth, octets 27-30.
    • +
    +

    Equidistant Cyclindrical:

      +
    • 8: Number of points along a parallel, octs 31-34.
    • +
    • 9: Number of points along a meridian, octs 35-38.
    • +
    • 10: Basic angle of initial production domain, octets 39-42.
    • +
    • 11: Subdivisions of basic angle, octets 43-46.
    • +
    • 12: Latitude of first grid point, octets 47-50.
    • +
    • 13: Longitude of first grid point, octets 51-54.
    • +
    • 14: Resolution and component flags, octet 55.
    • +
    • 15: Latitude of last grid point, octets 56-59.
    • +
    • 16: Longitude of last grid point, octets 60-63.
    • +
    • 17: i-direction increment, octets 64-67.
    • +
    • 18: j-direction increment, octets 68-71.
    • +
    • 19: Scanning mode, octet 72.
    • +
    +

    Mercator Cyclindrical:

      +
    • 8: Number of points along a parallel, octs 31-34.
    • +
    • 9: Number of points along a meridian, octs 35-38.
    • +
    • 10: Latitude of first point, octets 39-42.
    • +
    • 11: Longitude of first point, octets 43-46.
    • +
    • 12: Resolution and component flags, octet 47.
    • +
    • 13: Tangent latitude, octets 48-51.
    • +
    • 14: Latitude of last point, octets 52-55.
    • +
    • 15: Longitude of last point, octets 56-59.
    • +
    • 16: Scanning mode flags, octet 60.
    • +
    • 17: Orientation of grid, octets 61-64.
    • +
    • 18: Longitudinal grid length, octets 65-68.
    • +
    • 19: Latitudinal grid length, octets 69-72.
    • +
    +

    Lambert Conformal Conical:

      +
    • 8: Number of points along x-axis, octs 31-34.
    • +
    • 9: Number of points along y-axis, octs 35-38.
    • +
    • 10: Latitude of first point, octets 39-42.
    • +
    • 11: Longitude of first point, octets 43-46.
    • +
    • 12: Resolution of component flag, octet 47.
    • +
    • 13: Latitude where grid lengths specified,octets 48-51.
    • +
    • 14: Longitude of meridian that is parallel to y-axis, octets 52-55.
    • +
    • 15: x-direction grid length, octets 56-59.
    • +
    • 16: y-direction grid length, octets 60-63.
    • +
    • 17: Projection center flag, octet 64.
    • +
    • 18: Scanning mode, octet 65.
    • +
    • 19: First tangent latitude from pole, octets 66-69.
    • +
    • 20: Second tangent latitude from pole, octets 70-73.
    • +
    • 21: Latitude of south pole of projection, octets 74-77.
    • +
    • 22: Longitude of south pole of projection, octets 78-81.
    • +
    +

    Gaussian Cylindrical:

      +
    • 8: Number of points along a parallel, octs 31-34.
    • +
    • 9: Number of points along a meridian, octs 35-38.
    • +
    • 10: Basic angle of initial production domain, octets 39-42.
    • +
    • 11: Subdivisions of basic angle, octets 43-46.
    • +
    • 12: Latitude of first grid point, octets 47-50.
    • +
    • 13: Longitude of first grid point, octets 51-54.
    • +
    • 14: Resolution and component flags, octet 55.
    • +
    • 15: Latitude of last grid point, octets 56-59.
    • +
    • 16: Longitude of last grid point, octets 60-63.
    • +
    • 17: i-direction increment, octets 64-67.
    • +
    • 18: Number of parallels between pole and equator, octets 68-71.
    • +
    • 19: Scanning mode, octet 72.
    • +
    +

    Polar Stereographic Azimuthal:

      +
    • 8: Number of points along x-axis, octets 31-34.
    • +
    • 9: Number of points along y-axis, octets 35-38.
    • +
    • 10: Latitude of first grid point, octets 39-42.
    • +
    • 11: Longitude of first grid point, octets 43-46.
    • +
    • 12: Resolution and component flags, octet 47.
    • +
    • 13: True latitude, octets 48-51.
    • +
    • 14: Orientation longitude, octets 52-55.
    • +
    • 15: x-direction grid length, octets 56-59.
    • +
    • 16: y-direction grid length, octets 60-63.
    • +
    • 17: Projection center flag, octet 64.
    • +
    • 18: Scanning mode flags, octet 65.
    • +
    +

    Rotated Equidistant Cyclindrical:

      +
    • 8: Number of points along a parallel, octs 31-34.
    • +
    • 9: Number of points along a meridian, octs 35-38.
    • +
    • 10: Basic angle of initial production domain, octets 39-42.
    • +
    • 11: Subdivisions of basic angle, octets 43-46.
    • +
    • 12: Latitude of first grid point, octets 47-50.
    • +
    • 13: Longitude of first grid point, octets 51-54.
    • +
    • 14: Resolution and component flags, octet 55.
    • +
    • 15: Latitude of last grid point, octets 56-59.
    • +
    • 16: Longitude of last grid point, octets 60-63.
    • +
    • 17: i-direction increment, octets 64-67.
    • +
    • 18: j-direction increment, octets 68-71.
    • +
    • 19: Scanning mode, octet 72.
    • +
    • 20: Latitude of southern pole of projection, octets 73-76.
    • +
    • 21: Longitude of southern pole of projection, octets 77-80.
    • +
    • 22: Angle of rotation of projection, octs 81-84.
    • +
    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]igdtlenNumber of elements of the grid definition template array. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]ioptOption flag.
      +
    • 0 Earth coords of all the grid points.
    • +
    • 1 Earth coords of selected grid coords.
    • +
    • -1 Grid coords of selected earth coords
    • +
    +
    [in]nptsMaximum number of coordinates.
    [in]fillFill value to set invalid output data. Must be impossible value; suggested value: -9999.
    [in,out]xptsGrid x point coordinates.
    [in,out]yptsGrid y point coordinates.
    [in,out]rlonEarth longitudes in degrees E. (Acceptable range: -360. to 360.)
    [in,out]rlatEarth latitudes in degrees N. (Acceptable range: -90. to 90.)
    [out]nretNumber of valid points computed.
    [out]crotClockwise vector rotation cosines.
    [out]srotClockwise vector rotation sines. ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlondx/dlat in 1/degrees
    [out]xlatdy/dlon in 1/degrees
    [out]ylondy/dlon in 1/degrees
    [out]ylatdy/dlat in 1/degrees
    [out]areaArea weights in m^2. Proportional to the square of the map factor in the case of conformal projections
    +
    +
    +
    Author
    George Gayno, Mark Iredell
    +
    Date
    Jan 2015
    + +

    Definition at line 665 of file gdswzd_mod.F90.

    + +

    Referenced by gdswzd_mod::gdswzd::gdswzd_2d_array(), and gdswzd_mod::gdswzd::gdswzd_scalar().

    + +
    +
    + +

    ◆ gdswzd_2d_array()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine gdswzd_mod::gdswzd_2d_array (integer, intent(in) IGDTNUM,
    integer, dimension(igdtlen), intent(in) IGDTMPL,
    integer, intent(in) IGDTLEN,
    integer, intent(in) IOPT,
    integer, intent(in) NPTS,
    real, intent(in) FILL,
    real, dimension(:,:), intent(inout) XPTS,
    real, dimension(:,:), intent(inout) YPTS,
    real, dimension(:,:), intent(inout) RLON,
    real, dimension(:,:), intent(inout) RLAT,
    integer, intent(out) NRET,
    real, dimension(:,:), intent(out), optional CROT,
    real, dimension(:,:), intent(out), optional SROT,
    real, dimension(:,:), intent(out), optional XLON,
    real, dimension(:,:), intent(out), optional XLAT,
    real, dimension(:,:), intent(out), optional YLON,
    real, dimension(:,:), intent(out), optional YLAT,
    real, dimension(:,:), intent(out), optional AREA 
    )
    +
    +private
    +
    + +

    Decodes the grib 2 grid definition template and returns one of the following (for 2d-arrays):

    +
      +
    • iopt=0 Grid and earth coordinates of all grid points.
    • +
    • iopt=+1 Earth coordinates of selected grid coordinates.
    • +
    • iopt=-1 Grid coordinates of selected earth coordinates.
    • +
    +

    The current code recognizes the following projections, where "igdtnum" is the grid definition template number:

      +
    • igdtnum=00 Equidistant Cylindrical
    • +
    • igdtnum=01 Rotated Equidistant Cylindrical. "E" and non-"E" staggered
    • +
    • igdtnum=10 Mercator Cyclindrical
    • +
    • igdtnum=20 Polar Stereographic Azimuthal
    • +
    • igdtnum=30 Lambert Conformal Conical
    • +
    • igdtnum=40 Gaussian Equidistant Cyclindrical
    • +
    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values. Also if iopt=0, if the number of grid points exceeds the number allotted, then all the output elements are set to fill values.

    +

    The actual number of valid points computed is returned too.

    +

    Optionally, the vector rotations, map jacobians and grid box areas may be returned.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present. To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present.

    +

    To compute the grid box areas, the optional argument 'area' must be present.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + +
    [in]igdtnumGrid definition template number.
    [in]igdtmplGrid definition template array. Corresponds to the gfldigdtmpl component of the NCEPLIBS-g2 gridmod data structure. See igdtmpl definition in gdswzd_1d_array() for full details.
    [in]igdtlenNumber of elements of the grid definition template array. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]ioptOption flag.
      +
    • 0 Earth coords of all the grid points.
    • +
    • 1 Earth coords of selected grid coords.
    • +
    • -1 Grid coords of selected earth coords
    • +
    +
    [in]nptsMaximum number of coordinates.
    [in]fillFill value to set invalid output data. Must be impossible value; suggested value: -9999.
    [in,out]xptsGrid x point coordinates.
    [in,out]yptsGrid y point coordinates.
    [in,out]rlonEarth longitudes in degrees E. (Acceptable range: -360. to 360.)
    [in,out]rlatEarth latitudes in degrees N. (Acceptable range: -90. to 90.)
    [out]nretNumber of valid points computed.
    [out]crotClockwise vector rotation cosines.
    [out]srotClockwise vector rotation sines. ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlondx/dlat in 1/degrees
    [out]xlatdy/dlon in 1/degrees
    [out]ylondy/dlon in 1/degrees
    [out]ylatdy/dlat in 1/degrees
    [out]areaArea weights in m^2. Proportional to the square of the map factor in the case of conformal projections
    +
    +
    +
    Author
    George Gayno, Mark Iredell
    +
    Date
    Jan 2015
    + +

    Definition at line 459 of file gdswzd_mod.F90.

    + +
    +
    + +

    ◆ gdswzd_2d_array_grib1()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine, public gdswzd_mod::gdswzd_2d_array_grib1 (integer, dimension(200), intent(in) KGDS,
    integer, intent(in) IOPT,
    integer, intent(in) NPTS,
    real, intent(in) FILL,
    real, dimension(:,:), intent(inout) XPTS,
    real, dimension(:,:), intent(inout) YPTS,
    real, dimension(:,:), intent(inout) RLON,
    real, dimension(:,:), intent(inout) RLAT,
    integer, intent(out) NRET,
    real, dimension(:,:), intent(out), optional CROT,
    real, dimension(:,:), intent(out), optional SROT,
    real, dimension(:,:), intent(out), optional XLON,
    real, dimension(:,:), intent(out), optional XLAT,
    real, dimension(:,:), intent(out), optional YLON,
    real, dimension(:,:), intent(out), optional YLAT,
    real, dimension(:,:), intent(out), optional AREA 
    )
    +
    + +

    Decodes the grib grid description section and returns one of the following (for 2-d arrays):

    +
      +
    • iopt=0 Grid and earth coordinates of all grid points.
    • +
    • iopt=+1 Earth coordinates of selected grid coordinates.
    • +
    • iopt=-1 Grid coordinates of selected earth coordinates.
    • +
    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values. Also if iopt=0, if the number of grid points exceeds the number allotted, then all the output elements are set to fill values.

    +

    The actual number of valid points computed is returned too.

    +

    Optionally, the vector rotations, map jacobians and grid box areas may be returned.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present. To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present.

    +

    To compute the grid box areas, the optional argument 'area' must be present.

    +

    The current code recognizes the following projections:

      +
    • kgds(1)=000 Equidistant Cylindrical
    • +
    • kgds(1)=001 Mercator Cylindrical
    • +
    • kgds(1)=003 lambert Conformal Conical
    • +
    • kgds(1)=004 Gaussian Cylindrical
    • +
    • kgds(1)=005 Polar Stereographic azimuthal
    • +
    • kgds(1)=203 E-staggered Rotated Equidistant Cylindrical
    • +
    • kgds(1)=205 B-staggered Rotated Equidistant Cylindrical
    • +
    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]kgdsGDS parameters as decoded by w3fi63.
    +
    [in]ioptOption flag.
      +
    • 0 Earth coords of all the grid points.
    • +
    • 1 Earth coords of selected grid coords.
    • +
    • -1 Grid coords of selected earth coords
    • +
    +
    [in]nptsMaximum number of coordinates.
    [in]fillFill value to set invalid output data. Must be impossible value; suggested value: -9999.
    [in,out]xptsGrid x point coordinates.
    [in,out]yptsGrid y point coordinates.
    [in,out]rlonEarth longitudes in degrees E. (Acceptable range: -360. to 360.)
    [in,out]rlatEarth latitudes in degrees N. (Acceptable range: -90. to 90.)
    [out]nretNumber of valid points computed.
    [out]crotClockwise vector rotation cosines.
    [out]srotClockwise vector rotation sines. ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlondx/dlat in 1/degrees
    [out]xlatdy/dlon in 1/degrees
    [out]ylondy/dlon in 1/degrees
    [out]ylatdy/dlat in 1/degrees
    [out]areaArea weights in m^2. Proportional to the square of the map factor in the case of conformal projections
    +
    +
    +
    Author
    George Gayno, Mark Iredell
    +
    Date
    April 1996
    + +

    Definition at line 850 of file gdswzd_mod.F90.

    + +
    +
    + +

    ◆ gdswzd_grib1()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine, public gdswzd_mod::gdswzd_grib1 (integer, dimension(200), intent(in) KGDS,
    integer, intent(in) IOPT,
    integer, intent(in) NPTS,
    real, intent(in) FILL,
    real, dimension(npts), intent(inout) XPTS,
    real, dimension(npts), intent(inout) YPTS,
    real, dimension(npts), intent(inout) RLON,
    real, dimension(npts), intent(inout) RLAT,
    integer, intent(out) NRET,
    real, dimension(npts), intent(out), optional CROT,
    real, dimension(npts), intent(out), optional SROT,
    real, dimension(npts), intent(out), optional XLON,
    real, dimension(npts), intent(out), optional XLAT,
    real, dimension(npts), intent(out), optional YLON,
    real, dimension(npts), intent(out), optional YLAT,
    real, dimension(npts), intent(out), optional AREA 
    )
    +
    + +

    Decodes the grib grid description section and returns one of the following (for 1-d arrays):

    +
      +
    • iopt=0 Grid and earth coordinates of all grid points.
    • +
    • iopt=+1 Earth coordinates of selected grid coordinates.
    • +
    • iopt=-1 Grid coordinates of selected earth coordinates.
    • +
    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values. Also if iopt=0, if the number of grid points exceeds the number allotted, then all the output elements are set to fill values.

    +

    The actual number of valid points computed is returned too.

    +

    Optionally, the vector rotations, map jacobians and grid box areas may be returned.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present. To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present.

    +

    To compute the grid box areas, the optional argument 'area' must be present.

    +

    The current code recognizes the following projections:

      +
    • kgds(1)=000 Equidistant Cylindrical
    • +
    • kgds(1)=001 Mercator Cylindrical
    • +
    • kgds(1)=003 lambert Conformal Conical
    • +
    • kgds(1)=004 Gaussian Cylindrical
    • +
    • kgds(1)=005 Polar Stereographic azimuthal
    • +
    • kgds(1)=203 E-staggered Rotated Equidistant Cylindrical
    • +
    • kgds(1)=205 B-staggered Rotated Equidistant Cylindrical
    • +
    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]kgdsGDS parameters as decoded by w3fi63.
    +
    [in]ioptOption flag.
      +
    • 0 Earth coords of all the grid points.
    • +
    • 1 Earth coords of selected grid coords.
    • +
    • -1 Grid coords of selected earth coords
    • +
    +
    [in]nptsMaximum number of coordinates.
    [in]fillFill value to set invalid output data. Must be impossible value; suggested value: -9999.
    [in,out]xptsGrid x point coordinates.
    [in,out]yptsGrid y point coordinates.
    [in,out]rlonEarth longitudes in degrees E. (Acceptable range: -360. to 360.)
    [in,out]rlatEarth latitudes in degrees N. (Acceptable range: -90. to 90.)
    [out]nretNumber of valid points computed.
    [out]crotClockwise vector rotation cosines.
    [out]srotClockwise vector rotation sines. ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlondx/dlat in 1/degrees
    [out]xlatdy/dlon in 1/degrees
    [out]ylondy/dlon in 1/degrees
    [out]ylatdy/dlat in 1/degrees
    [out]areaArea weights in m^2. Proportional to the square of the map factor in the case of conformal projections
    +
    +
    +
    Author
    George Gayno, Mark Iredell
    +
    Date
    April 1996
    + +

    Definition at line 758 of file gdswzd_mod.F90.

    + +
    +
    + +

    ◆ gdswzd_grid()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine gdswzd_mod::gdswzd_grid (class(ip_grid), intent(in) grid,
    integer, intent(in) IOPT,
    integer, intent(in) NPTS,
    real, intent(in) FILL,
    real, dimension(npts), intent(inout) XPTS,
    real, dimension(npts), intent(inout) YPTS,
    real, dimension(npts), intent(inout) RLON,
    real, dimension(npts), intent(inout) RLAT,
    integer, intent(out) NRET,
    real, dimension(npts), intent(out), optional CROT,
    real, dimension(npts), intent(out), optional SROT,
    real, dimension(npts), intent(out), optional XLON,
    real, dimension(npts), intent(out), optional XLAT,
    real, dimension(npts), intent(out), optional YLON,
    real, dimension(npts), intent(out), optional YLAT,
    real, dimension(npts), intent(out), optional AREA 
    )
    +
    +private
    +
    + +

    Returns one of the following for a grid object:

    +
      +
    • iopt=0 Grid and earth coordinates of all grid points.
    • +
    • iopt=+1 Earth coordinates of selected grid coordinates.
    • +
    • iopt=-1 Grid coordinates of selected earth coordinates.
    • +
    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values. Also if iopt=0, if the number of grid points exceeds the number allotted, then all the output elements are set to fill values.

    +

    The actual number of valid points computed is returned too.

    +

    Optionally, the vector rotations, map jacobians and grid box areas may be returned.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present. To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present.

    +

    To compute the grid box areas, the optional argument 'area' must be present.

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]gridGrid to call gdswzd on.
    [in]ioptOption flag.
      +
    • 0 Earth coords of all the grid points.
    • +
    • 1 Earth coords of selected grid coords.
    • +
    • -1 Grid coords of selected earth coords
    • +
    +
    [in]nptsMaximum number of coordinates.
    [in]fillFill value to set invalid output data. Must be impossible value; suggested value: -9999.
    [in,out]xptsGrid x point coordinates.
    [in,out]yptsGrid y point coordinates.
    [in,out]rlonEarth longitudes in degrees E. (Acceptable range: -360. to 360.)
    [in,out]rlatEarth latitudes in degrees N. (Acceptable range: -90. to 90.)
    [out]nretNumber of valid points computed.
    [out]crotClockwise vector rotation cosines.
    [out]srotClockwise vector rotation sines. ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlondx/dlat in 1/degrees
    [out]xlatdy/dlon in 1/degrees
    [out]ylondy/dlon in 1/degrees
    [out]ylatdy/dlat in 1/degrees
    [out]areaArea weights in m^2. Proportional to the square of the map factor in the case of conformal projections
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 105 of file gdswzd_mod.F90.

    + +

    Referenced by gdswzd_mod::gdswzd::gdswzd_1d_array(), gdswzd_mod::gdswzd::gdswzd_2d_array_grib1(), and gdswzd_mod::gdswzd::gdswzd_grib1().

    + +
    +
    + +

    ◆ gdswzd_scalar()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine gdswzd_mod::gdswzd_scalar (integer, intent(in) IGDTNUM,
    integer, dimension(igdtlen), intent(in) IGDTMPL,
    integer, intent(in) IGDTLEN,
    integer, intent(in) IOPT,
    integer, intent(in) NPTS,
    real, intent(in) FILL,
    real, intent(inout) XPTS,
    real, intent(inout) YPTS,
    real, intent(inout) RLON,
    real, intent(inout) RLAT,
    integer, intent(out) NRET,
    real, intent(out), optional CROT,
    real, intent(out), optional SROT,
    real, intent(out), optional XLON,
    real, intent(out), optional XLAT,
    real, intent(out), optional YLON,
    real, intent(out), optional YLAT,
    real, intent(out), optional AREA 
    )
    +
    +private
    +
    + +

    Decodes the grib 2 grid definition template and returns one of the following (for scalars):

    +
      +
    • iopt=0 Grid and earth coordinates of all grid points.
    • +
    • iopt=+1 Earth coordinates of selected grid coordinates.
    • +
    • iopt=-1 Grid coordinates of selected earth coordinates.
    • +
    +

    The current code recognizes the following projections, where "igdtnum" is the grid definition template number:

      +
    • igdtnum=00 Equidistant Cylindrical
    • +
    • igdtnum=01 Rotated Equidistant Cylindrical. "E" and non-"E" staggered
    • +
    • igdtnum=10 Mercator Cyclindrical
    • +
    • igdtnum=20 Polar Stereographic Azimuthal
    • +
    • igdtnum=30 Lambert Conformal Conical
    • +
    • igdtnum=40 Gaussian Equidistant Cyclindrical
    • +
    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values. Also if iopt=0, if the number of grid points exceeds the number allotted, then all the output elements are set to fill values.

    +

    The actual number of valid points computed is returned too.

    +

    Optionally, the vector rotations, map jacobians and grid box areas may be returned.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present. To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present.

    +

    To compute the grid box areas, the optional argument 'area' must be present.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + +
    [in]igdtnumGrid definition template number.
    [in]igdtmplGrid definition template array. Corresponds to the gfldigdtmpl component of the NCEPLIBS-g2 gridmod data structure See igdtmpl definition in gdswzd_1d_array() for full details.
    [in]igdtlenNumber of elements of the grid definition template array. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]ioptOption flag.
      +
    • 0 Earth coords of all the grid points.
    • +
    • 1 Earth coords of selected grid coords.
    • +
    • -1 Grid coords of selected earth coords
    • +
    +
    [in]nptsMaximum number of coordinates.
    [in]fillFill value to set invalid output data. Must be impossible value; suggested value: -9999.
    [in,out]xptsGrid x point coordinates.
    [in,out]yptsGrid y point coordinates.
    [in,out]rlonEarth longitudes in degrees E. (Acceptable range: -360. to 360.)
    [in,out]rlatEarth latitudes in degrees N. (Acceptable range: -90. to 90.)
    [out]nretNumber of valid points computed.
    [out]crotClockwise vector rotation cosines.
    [out]srotClockwise vector rotation sines. ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlondx/dlat in 1/degrees
    [out]xlatdy/dlon in 1/degrees
    [out]ylondy/dlon in 1/degrees
    [out]ylatdy/dlat in 1/degrees
    [out]areaArea weights in m^2. Proportional to the square of the map factor in the case of conformal projections
    +
    +
    +
    Author
    George Gayno, Mark Iredell
    +
    Date
    Jan 2015
    + +

    Definition at line 278 of file gdswzd_mod.F90.

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespacegdswzd__mod.js b/ver-5.1.0/namespacegdswzd__mod.js new file mode 100644 index 00000000..23d8b304 --- /dev/null +++ b/ver-5.1.0/namespacegdswzd__mod.js @@ -0,0 +1,10 @@ +var namespacegdswzd__mod = +[ + [ "gdswzd", "interfacegdswzd__mod_1_1gdswzd.html", "interfacegdswzd__mod_1_1gdswzd" ], + [ "gdswzd_1d_array", "namespacegdswzd__mod.html#ac304e2b046eccc701e24827c81107e76", null ], + [ "gdswzd_2d_array", "namespacegdswzd__mod.html#acdf970e498e9317522fbdfb690b86e25", null ], + [ "gdswzd_2d_array_grib1", "namespacegdswzd__mod.html#aa032a55281b18e208630a730679958f4", null ], + [ "gdswzd_grib1", "namespacegdswzd__mod.html#a133e040fac8dd56e607b8e3fb6a58c37", null ], + [ "gdswzd_grid", "namespacegdswzd__mod.html#a584d2bddbc6d857b80cfac5e3b288d45", null ], + [ "gdswzd_scalar", "namespacegdswzd__mod.html#aba3235c5bc5797e72b9a6a8a587b8861", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/namespaceip__constants__mod.html b/ver-5.1.0/namespaceip__constants__mod.html new file mode 100644 index 00000000..08afad38 --- /dev/null +++ b/ver-5.1.0/namespaceip__constants__mod.html @@ -0,0 +1,244 @@ + + + + + + + +NCEPLIBS-ip: ip_constants_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_constants_mod Module Reference
    +
    +
    + +

    Module containing common constants. +More...

    + + + + + + + + + + + + + + + + + + + + +

    +Variables

    real, parameter dpr =180.0/pi
     Radians to degrees. More...
     
    real, parameter e2_wgs84 = 0.00669437999013
     Eccentricity squared of Earth defined by WGS-84. More...
     
    real, parameter pi =3.14159265358979
     PI. More...
     
    real, parameter pi2 =pi/2.0
     PI / 2.0. More...
     
    real, parameter pi4 =pi/4.0
     PI / 4.0. More...
     
    real, parameter rerth_wgs84 =6.378137E6
     Radius of the Earth defined by WGS-84. More...
     
    +

    Detailed Description

    +

    Module containing common constants.

    +
    Author
    Kyle Gerheiser, George Gayno, Alex Richert
    +

    Variable Documentation

    + +

    ◆ dpr

    + +
    +
    + + + + +
    real, parameter ip_constants_mod::dpr =180.0/pi
    +
    +
    + +

    ◆ e2_wgs84

    + +
    +
    + + + + +
    real, parameter ip_constants_mod::e2_wgs84 = 0.00669437999013
    +
    + +

    Eccentricity squared of Earth defined by WGS-84.

    + +

    Definition at line 19 of file ip_constants_mod.F90.

    + +

    Referenced by ip_polar_stereo_grid_mod::init_grib1().

    + +
    +
    + +

    ◆ pi

    + +
    +
    + + + + +
    real, parameter ip_constants_mod::pi =3.14159265358979
    +
    + +

    PI.

    + +

    Definition at line 14 of file ip_constants_mod.F90.

    + +
    +
    + +

    ◆ pi2

    + +
    +
    + + + + +
    real, parameter ip_constants_mod::pi2 =pi/2.0
    +
    + +

    PI / 2.0.

    + +

    Definition at line 16 of file ip_constants_mod.F90.

    + +
    +
    + +

    ◆ pi4

    + +
    +
    + + + + +
    real, parameter ip_constants_mod::pi4 =pi/4.0
    +
    + +

    PI / 4.0.

    + +

    Definition at line 17 of file ip_constants_mod.F90.

    + +
    +
    + +

    ◆ rerth_wgs84

    + +
    +
    + + + + +
    real, parameter ip_constants_mod::rerth_wgs84 =6.378137E6
    +
    + +

    Radius of the Earth defined by WGS-84.

    + +

    Definition at line 18 of file ip_constants_mod.F90.

    + +

    Referenced by ip_polar_stereo_grid_mod::init_grib1().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespaceip__equid__cylind__grid__mod.html b/ver-5.1.0/namespaceip__equid__cylind__grid__mod.html new file mode 100644 index 00000000..c6f16d91 --- /dev/null +++ b/ver-5.1.0/namespaceip__equid__cylind__grid__mod.html @@ -0,0 +1,668 @@ + + + + + + + +NCEPLIBS-ip: ip_equid_cylind_grid_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_equid_cylind_grid_mod Module Reference
    +
    +
    + +

    Equidistant cylindrical grib decoder and grid coordinate transformations. +More...

    + + + + +

    +Data Types

    type  ip_equid_cylind_grid
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine equid_cylind_grid_area (RLAT, AREA)
     Computes the grid box area for a equidistant cylindrical grid. More...
     
    subroutine equid_cylind_map_jacob (XLON, XLAT, YLON, YLAT)
     Computes the map jacobians for a equidistant cylindrical grid. More...
     
    subroutine equid_cylind_vect_rot (CROT, SROT)
     Computes the vector rotation sines and cosines for a equidistant cylindrical grid. More...
     
    subroutine gdswzd_equid_cylind (self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for equidistant cylindrical grids. More...
     
    subroutine init_grib1 (self, g1_desc)
     Initializes an equidistant cylindrical grid given a grib1_descriptor object. More...
     
    subroutine init_grib2 (self, g2_desc)
     Initializes an equidistant cylindrical grid given a grib2_descriptor object. More...
     
    + + + + + + + + + + +

    +Variables

    real dlat
     Grid resolution in degrees n/s direction. More...
     
    real dlon
     Grid resolution in degrees e/w direction. More...
     
    real rerth
     Radius of the Earth. More...
     
    +

    Detailed Description

    +

    Equidistant cylindrical grib decoder and grid coordinate transformations.

    +

    Octet numbers refer to [GRIB2 - GRID DEFINITION TEMPLATE 3.0 Latitude/Longitude or equidistant cylindrical, or Plate Carree](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_temp3-0.shtml).

    +
    Author
    George Gayno, Mark Iredell, Kyle Gerheiser
    +
    Date
    July 2021
    +

    Function/Subroutine Documentation

    + +

    ◆ equid_cylind_grid_area()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_equid_cylind_grid_mod::equid_cylind_grid_area (real, intent(in) RLAT,
    real, intent(out) AREA 
    )
    +
    +private
    +
    + +

    Computes the grid box area for a equidistant cylindrical grid.

    +
    Parameters
    + + + +
    [in]rlatLatitude of grid point in degrees.
    [out]areaArea weights in m^2.
    +
    +
    +
    Author
    Mark Iredell, George Gayno
    +
    Date
    July 2021
    + +

    Definition at line 363 of file ip_equid_cylind_grid_mod.F90.

    + +

    References dlat, dlon, and rerth.

    + +

    Referenced by gdswzd_equid_cylind().

    + +
    +
    + +

    ◆ equid_cylind_map_jacob()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_equid_cylind_grid_mod::equid_cylind_map_jacob (real, intent(out) XLON,
    real, intent(out) XLAT,
    real, intent(out) YLON,
    real, intent(out) YLAT 
    )
    +
    +private
    +
    + +

    Computes the map jacobians for a equidistant cylindrical grid.

    +
    Parameters
    + + + + + +
    [out]xlondx/dlon in 1/degrees.
    [out]xlatdx/dlat in 1/degrees.
    [out]ylondy/dlon in 1/degrees.
    [out]ylatdy/dlat in 1/degrees.
    +
    +
    +
    Author
    George Gayno
    +
    Date
    July 2021
    + +

    Definition at line 346 of file ip_equid_cylind_grid_mod.F90.

    + +

    References dlat, and dlon.

    + +

    Referenced by gdswzd_equid_cylind().

    + +
    +
    + +

    ◆ equid_cylind_vect_rot()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_equid_cylind_grid_mod::equid_cylind_vect_rot (real, intent(out) CROT,
    real, intent(out) SROT 
    )
    +
    +private
    +
    + +

    Computes the vector rotation sines and cosines for a equidistant cylindrical grid.

    +
    Parameters
    + + + +
    [out]crotClockwise vector rotation cosines.
    [out]srotClockwise vector rotation sines.
    +
    +
    +
    Note
      +
    • ugrid=crot*uearth-srot*vearth;
    • +
    • vgrid=srot*uearth+crot*vearth
    • +
    +
    +
    Author
    George Gayno
    +
    Date
    July 2021
    + +

    Definition at line 327 of file ip_equid_cylind_grid_mod.F90.

    + +

    Referenced by gdswzd_equid_cylind().

    + +
    +
    + +

    ◆ gdswzd_equid_cylind()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_equid_cylind_grid_mod::gdswzd_equid_cylind (class(ip_equid_cylind_grid), intent(in) self,
    integer, intent(in) IOPT,
    integer, intent(in) NPTS,
    real, intent(in) FILL,
    real, dimension(npts), intent(inout) XPTS,
    real, dimension(npts), intent(inout) YPTS,
    real, dimension(npts), intent(inout) RLON,
    real, dimension(npts), intent(inout) RLAT,
    integer, intent(out) NRET,
    real, dimension(npts), intent(out), optional CROT,
    real, dimension(npts), intent(out), optional SROT,
    real, dimension(npts), intent(out), optional XLON,
    real, dimension(npts), intent(out), optional XLAT,
    real, dimension(npts), intent(out), optional YLON,
    real, dimension(npts), intent(out), optional YLAT,
    real, dimension(npts), intent(out), optional AREA 
    )
    +
    +private
    +
    + +

    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for equidistant cylindrical grids.

    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values.

    +

    The actual number of valid points computed is returned too. Optionally, the vector rotations, the map jacobians and the grid box areas may be returned as well.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present.

    +

    To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present.

    +

    To compute the grid box areas, the optional argument 'area' must be present.

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]selfThe grid object gdswzd was called on.
    [in]ioptoption flag
      +
    • +1 to compute earth coords of selected grid coords.
    • +
    • -1 o compute grid coords of selected earth coords.
    • +
    +
    [in]nptsMaximum number of coordinates.
    [in]fillFill value to set invalid output data. Must be impossible value; suggested value: -9999.
    [in,out]xptsGrid x point coordinates if iopt>0.
    [in,out]yptsGrid y point coordinates if iopt>0.
    [in,out]rlonEarth longitudes in degrees e if iopt<0 (Acceptable range: -360. to 360.)
    [in,out]rlatEarth latitudes in degrees n if iopt<0 (Acceptable range: -90. to 90.)
    [out]nretNumber of valid points computed.
    [out]crotOptional clockwise vector rotation cosines.
    [out]srotOptional clockwise vector rotation sines.
    [out]xlonOptional dx/dlon in 1/degrees.
    [out]xlatOptional dx/dlat in 1/degrees.
    [out]ylonOptional dy/dlon in 1/degrees.
    [out]ylatOptional dy/dlat in 1/degrees.
    [out]areaOptional area weights in m**2.
    +
    +
    +
    Author
    Mark Iredell, George Gayno, Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 203 of file ip_equid_cylind_grid_mod.F90.

    + +

    References dlat, dlon, equid_cylind_grid_area(), equid_cylind_map_jacob(), equid_cylind_vect_rot(), and rerth.

    + +
    +
    + +

    ◆ init_grib1()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_equid_cylind_grid_mod::init_grib1 (class(ip_equid_cylind_grid), intent(inout) self,
    type(grib1_descriptor), intent(in) g1_desc 
    )
    +
    +private
    +
    + +

    Initializes an equidistant cylindrical grid given a grib1_descriptor object.

    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g1_descA grib1_descriptor
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 53 of file ip_equid_cylind_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib2()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_equid_cylind_grid_mod::init_grib2 (class(ip_equid_cylind_grid), intent(inout) self,
    type(grib2_descriptor), intent(in) g2_desc 
    )
    +
    +private
    +
    + +

    Initializes an equidistant cylindrical grid given a grib2_descriptor object.

    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g2_descA grib2_descriptor
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 109 of file ip_equid_cylind_grid_mod.F90.

    + +
    +
    +

    Variable Documentation

    + +

    ◆ dlat

    + +
    +
    + + + + + +
    + + + + +
    real ip_equid_cylind_grid_mod::dlat
    +
    +private
    +
    + +

    Grid resolution in degrees n/s direction.

    + +

    Definition at line 40 of file ip_equid_cylind_grid_mod.F90.

    + +

    Referenced by equid_cylind_grid_area(), equid_cylind_map_jacob(), and gdswzd_equid_cylind().

    + +
    +
    + +

    ◆ dlon

    + +
    +
    + + + + + +
    + + + + +
    real ip_equid_cylind_grid_mod::dlon
    +
    +private
    +
    + +

    Grid resolution in degrees e/w direction.

    + +

    Definition at line 41 of file ip_equid_cylind_grid_mod.F90.

    + +

    Referenced by equid_cylind_grid_area(), equid_cylind_map_jacob(), and gdswzd_equid_cylind().

    + +
    +
    + +

    ◆ rerth

    + +
    +
    + + + + + +
    + + + + +
    real ip_equid_cylind_grid_mod::rerth
    +
    +private
    +
    + +

    Radius of the Earth.

    + +

    Definition at line 42 of file ip_equid_cylind_grid_mod.F90.

    + +

    Referenced by equid_cylind_grid_area(), and gdswzd_equid_cylind().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespaceip__equid__cylind__grid__mod.js b/ver-5.1.0/namespaceip__equid__cylind__grid__mod.js new file mode 100644 index 00000000..56328f48 --- /dev/null +++ b/ver-5.1.0/namespaceip__equid__cylind__grid__mod.js @@ -0,0 +1,13 @@ +var namespaceip__equid__cylind__grid__mod = +[ + [ "ip_equid_cylind_grid", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid" ], + [ "equid_cylind_grid_area", "namespaceip__equid__cylind__grid__mod.html#a5a70b82abdce76bef22cdeaa96a986c2", null ], + [ "equid_cylind_map_jacob", "namespaceip__equid__cylind__grid__mod.html#a039501b44cd3ad4409983e193d509afd", null ], + [ "equid_cylind_vect_rot", "namespaceip__equid__cylind__grid__mod.html#ade88ecea1c0bb4b4d5b0d08f8482268d", null ], + [ "gdswzd_equid_cylind", "namespaceip__equid__cylind__grid__mod.html#af20f6f308b5a33211c677b894e41b727", null ], + [ "init_grib1", "namespaceip__equid__cylind__grid__mod.html#a3d0132823d27b60835ebb59ead173477", null ], + [ "init_grib2", "namespaceip__equid__cylind__grid__mod.html#a39d24c9468ecb7effd16972fd72e088a", null ], + [ "dlat", "namespaceip__equid__cylind__grid__mod.html#a30cb127d26d74d2de6ab3cbfd63183fb", null ], + [ "dlon", "namespaceip__equid__cylind__grid__mod.html#a46335f95ac343f7751bd519aec0a160f", null ], + [ "rerth", "namespaceip__equid__cylind__grid__mod.html#ab5b84516fab9cee3316c07450f49746c", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/namespaceip__gaussian__grid__mod.html b/ver-5.1.0/namespaceip__gaussian__grid__mod.html new file mode 100644 index 00000000..887fa4a6 --- /dev/null +++ b/ver-5.1.0/namespaceip__gaussian__grid__mod.html @@ -0,0 +1,767 @@ + + + + + + + +NCEPLIBS-ip: ip_gaussian_grid_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_gaussian_grid_mod Module Reference
    +
    +
    + +

    Gaussian grid coordinate transformations. +More...

    + + + + +

    +Data Types

    type  ip_gaussian_grid
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine gaussian_grid_area (YPTS, AREA)
     Computes the grid box area for a gaussian cylindrical grid. More...
     
    subroutine gaussian_map_jacob (YPTS, XLON, XLAT, YLON, YLAT)
     Computes the map jacobians for a gaussian cylindrical grid. More...
     
    subroutine gaussian_vect_rot (CROT, SROT)
     Computes the vector rotation sines and cosines for a gaussian cylindrical grid. More...
     
    subroutine gdswzd_gaussian (self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids. More...
     
    subroutine init_grib1 (self, g1_desc)
     Initializes a gaussian grid given a grib1_descriptor object. More...
     
    subroutine init_grib2 (self, g2_desc)
     Initializes a gaussian grid given a grib2_descriptor object. More...
     
    + + + + + + + + + + + + + + + + + + + +

    +Variables

    real, dimension(:), allocatable blat
     Gaussian latitude for each parallel. More...
     
    real dlon
     "i"-direction increment. More...
     
    integer j1
     'j' index of first grid point within the global array of latitudes. More...
     
    integer jh
     Scan mode flag in 'j' direction. More...
     
    real rerth
     Radius of the earth. More...
     
    real, dimension(:), allocatable ylat_row
     dy/dlat for each row in 1/degrees. More...
     
    +

    Detailed Description

    +

    Gaussian grid coordinate transformations.

    +

    Octet numbers refer to [GRIB2 - GRID DEFINITION TEMPLATE 3.40 Gaussian Latitude/Longitude](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_temp3-40.shtml).

    +
    Author
    George Gayno, Mark Iredell, Kyle Gerheiser
    +
    Date
    July 2021
    +

    Function/Subroutine Documentation

    + +

    ◆ gaussian_grid_area()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_gaussian_grid_mod::gaussian_grid_area (real, intent(in) YPTS,
    real, intent(out) AREA 
    )
    +
    +private
    +
    + +

    Computes the grid box area for a gaussian cylindrical grid.

    +
    Parameters
    + + + +
    [in]yptsy-index of grid point.
    [out]areaArea weights in m^2
    +
    +
    +
    Author
    Mark Iredell, George Gayno
    +
    Date
    July 2021
    + +

    Definition at line 417 of file ip_gaussian_grid_mod.F90.

    + +

    References blat, dlon, j1, jh, and rerth.

    + +

    Referenced by gdswzd_gaussian().

    + +
    +
    + +

    ◆ gaussian_map_jacob()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_gaussian_grid_mod::gaussian_map_jacob (real, intent(in) YPTS,
    real, intent(out) XLON,
    real, intent(out) XLAT,
    real, intent(out) YLON,
    real, intent(out) YLAT 
    )
    +
    +private
    +
    + +

    Computes the map jacobians for a gaussian cylindrical grid.

    +
    Parameters
    + + + + + + +
    [in]yptsy-index of grid point.
    [out]xlondx/dlon in 1/degrees.
    [out]xlatdx/dlat in 1/degrees.
    [out]ylondy/dlon in 1/degrees.
    [out]ylatdy/dlat in 1/degrees.
    +
    +
    +
    Author
    George Gayno
    +
    Date
    July 2021
    + +

    Definition at line 397 of file ip_gaussian_grid_mod.F90.

    + +

    References dlon, and ylat_row.

    + +

    Referenced by gdswzd_gaussian().

    + +
    +
    + +

    ◆ gaussian_vect_rot()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_gaussian_grid_mod::gaussian_vect_rot (real, intent(out) CROT,
    real, intent(out) SROT 
    )
    +
    +private
    +
    + +

    Computes the vector rotation sines and cosines for a gaussian cylindrical grid.

    +
    Parameters
    + + + +
    [out]crotClockwise vector rotation cosines.
    [out]srotClockwise vector rotation sines.
    +
    +
    +
    Note
    ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    +
    Author
    George Gayno
    +
    Date
    July 2021
    + +

    Definition at line 377 of file ip_gaussian_grid_mod.F90.

    + +

    Referenced by gdswzd_gaussian().

    + +
    +
    + +

    ◆ gdswzd_gaussian()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_gaussian_grid_mod::gdswzd_gaussian (class(ip_gaussian_grid), intent(in) self,
    integer, intent(in) IOPT,
    integer, intent(in) NPTS,
    real, intent(in) FILL,
    real, dimension(npts), intent(inout) XPTS,
    real, dimension(npts), intent(inout) YPTS,
    real, dimension(npts), intent(inout) RLON,
    real, dimension(npts), intent(inout) RLAT,
    integer, intent(out) NRET,
    real, dimension(npts), intent(out), optional CROT,
    real, dimension(npts), intent(out), optional SROT,
    real, dimension(npts), intent(out), optional XLON,
    real, dimension(npts), intent(out), optional XLAT,
    real, dimension(npts), intent(out), optional YLON,
    real, dimension(npts), intent(out), optional YLAT,
    real, dimension(npts), intent(out), optional AREA 
    )
    +
    +private
    +
    + +

    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids.

    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values.

    +

    The actual number of valid points computed is returned too. Optionally, the vector rotations, the map jacobians and the grid box areas may be returned as well.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present.

    +

    To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present.

    +

    To compute the grid box areas, the optional argument 'area' must be present.

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]selfThe grid object gdswzd was called on.
    [in]ioptoption flag
      +
    • +1 to compute earth coords of selected grid coords.
    • +
    • -1 o compute grid coords of selected earth coords.
    • +
    +
    [in]nptsMaximum number of coordinates.
    [in]fillFill value to set invalid output data. Must be impossible value; suggested value: -9999.
    [in,out]xptsGrid x point coordinates if iopt>0.
    [in,out]yptsGrid y point coordinates if iopt>0.
    [in,out]rlonEarth longitudes in degrees e if iopt<0 (Acceptable range: -360. to 360.)
    [in,out]rlatEarth latitudes in degrees n if iopt<0 (Acceptable range: -90. to 90.)
    [out]nretNumber of valid points computed.
    [out]crotOptional clockwise vector rotation cosines.
    [out]srotOptional clockwise vector rotation sines.
    [out]xlonOptional dx/dlon in 1/degrees.
    [out]xlatOptional dx/dlat in 1/degrees.
    [out]ylonOptional dy/dlon in 1/degrees.
    [out]ylatOptional dy/dlat in 1/degrees.
    [out]areaOptional area weights in m**2.
    +
    +
    +
    Author
    Mark Iredell, George Gayno, Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 195 of file ip_gaussian_grid_mod.F90.

    + +

    References blat, dlon, gaussian_grid_area(), gaussian_map_jacob(), gaussian_vect_rot(), j1, jh, rerth, splat(), and ylat_row.

    + +
    +
    + +

    ◆ init_grib1()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_gaussian_grid_mod::init_grib1 (class(ip_gaussian_grid), intent(inout) self,
    type(grib1_descriptor), intent(in) g1_desc 
    )
    +
    +private
    +
    + +

    Initializes a gaussian grid given a grib1_descriptor object.

    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g1_descA grib1_descriptor
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 60 of file ip_gaussian_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib2()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_gaussian_grid_mod::init_grib2 (class(ip_gaussian_grid), intent(inout) self,
    type(grib2_descriptor), intent(in) g2_desc 
    )
    +
    +private
    +
    + +

    Initializes a gaussian grid given a grib2_descriptor object.

    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g2_descA grib2_descriptor
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 109 of file ip_gaussian_grid_mod.F90.

    + +
    +
    +

    Variable Documentation

    + +

    ◆ blat

    + +
    +
    + + + + + +
    + + + + +
    real, dimension(:), allocatable ip_gaussian_grid_mod::blat
    +
    +private
    +
    + +

    Gaussian latitude for each parallel.

    + +

    Definition at line 46 of file ip_gaussian_grid_mod.F90.

    + +

    Referenced by gaussian_grid_area(), and gdswzd_gaussian().

    + +
    +
    + +

    ◆ dlon

    + +
    +
    + + + + + +
    + + + + +
    real ip_gaussian_grid_mod::dlon
    +
    +private
    +
    + +

    "i"-direction increment.

    +

    GRIB2 Section 3, octets 64-67.

    + +

    Definition at line 47 of file ip_gaussian_grid_mod.F90.

    + +

    Referenced by gaussian_grid_area(), gaussian_map_jacob(), and gdswzd_gaussian().

    + +
    +
    + +

    ◆ j1

    + +
    +
    + + + + + +
    + + + + +
    integer ip_gaussian_grid_mod::j1
    +
    +private
    +
    + +

    'j' index of first grid point within the global array of latitudes.

    + +

    Definition at line 44 of file ip_gaussian_grid_mod.F90.

    + +

    Referenced by gaussian_grid_area(), and gdswzd_gaussian().

    + +
    +
    + +

    ◆ jh

    + +
    +
    + + + + + +
    + + + + +
    integer ip_gaussian_grid_mod::jh
    +
    +private
    +
    + +

    Scan mode flag in 'j' direction.

    +

    When '1' points scan from N to S. When "-1" points scan from S to N.

    + +

    Definition at line 45 of file ip_gaussian_grid_mod.F90.

    + +

    Referenced by gaussian_grid_area(), and gdswzd_gaussian().

    + +
    +
    + +

    ◆ rerth

    + +
    +
    + + + + + +
    + + + + +
    real ip_gaussian_grid_mod::rerth
    +
    +private
    +
    + +

    Radius of the earth.

    +

    GRIB2 Section 3, octets 15-30.

    + +

    Definition at line 48 of file ip_gaussian_grid_mod.F90.

    + +

    Referenced by gaussian_grid_area(), and gdswzd_gaussian().

    + +
    +
    + +

    ◆ ylat_row

    + +
    +
    + + + + + +
    + + + + +
    real, dimension(:), allocatable ip_gaussian_grid_mod::ylat_row
    +
    +private
    +
    + +

    dy/dlat for each row in 1/degrees.

    + +

    Definition at line 49 of file ip_gaussian_grid_mod.F90.

    + +

    Referenced by gaussian_map_jacob(), and gdswzd_gaussian().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespaceip__gaussian__grid__mod.js b/ver-5.1.0/namespaceip__gaussian__grid__mod.js new file mode 100644 index 00000000..1413b539 --- /dev/null +++ b/ver-5.1.0/namespaceip__gaussian__grid__mod.js @@ -0,0 +1,16 @@ +var namespaceip__gaussian__grid__mod = +[ + [ "ip_gaussian_grid", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html", "structip__gaussian__grid__mod_1_1ip__gaussian__grid" ], + [ "gaussian_grid_area", "namespaceip__gaussian__grid__mod.html#ab602a870a477c7ab77438700af4e7780", null ], + [ "gaussian_map_jacob", "namespaceip__gaussian__grid__mod.html#adca7b03877c6a7048ff1716a95e0bd9d", null ], + [ "gaussian_vect_rot", "namespaceip__gaussian__grid__mod.html#ac72eec96d0012fbe0f0ec7c520f40dad", null ], + [ "gdswzd_gaussian", "namespaceip__gaussian__grid__mod.html#a6eefd9270b3f9bb2c59a77bea4ecf1b9", null ], + [ "init_grib1", "namespaceip__gaussian__grid__mod.html#a8fe2ee732a3a2db4891a6431787a0b01", null ], + [ "init_grib2", "namespaceip__gaussian__grid__mod.html#ae048ac033628515113b11b8c7364e0c2", null ], + [ "blat", "namespaceip__gaussian__grid__mod.html#ae2697b9c4dbe4945276633d1951e79fc", null ], + [ "dlon", "namespaceip__gaussian__grid__mod.html#a8852b7cfb7b99318140c66b0c551dc6d", null ], + [ "j1", "namespaceip__gaussian__grid__mod.html#af5c4024263aa3eaef5801849ae32c15a", null ], + [ "jh", "namespaceip__gaussian__grid__mod.html#a67d6cd6d188a8bded8bdf64927617028", null ], + [ "rerth", "namespaceip__gaussian__grid__mod.html#a8213e02ccf4325ad5db14f2e48990da2", null ], + [ "ylat_row", "namespaceip__gaussian__grid__mod.html#a3591b5701f3d03931c6a9d5278e161dc", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/namespaceip__grid__descriptor__mod.html b/ver-5.1.0/namespaceip__grid__descriptor__mod.html new file mode 100644 index 00000000..82e74124 --- /dev/null +++ b/ver-5.1.0/namespaceip__grid__descriptor__mod.html @@ -0,0 +1,378 @@ + + + + + + + +NCEPLIBS-ip: ip_grid_descriptor_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_grid_descriptor_mod Module Reference
    +
    +
    + +

    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions. +More...

    + + + + + + + + + + + + + + + +

    +Data Types

    type  grib1_descriptor
     Descriptor representing a grib1 grib descriptor section (GDS) with an integer array. More...
     
    type  grib2_descriptor
     Grib-2 descriptor containing a grib2 GDT represented by an integer array. More...
     
    interface  init_descriptor
     
    type  ip_grid_descriptor
     Abstract descriptor object which represents a grib1 or grib2 descriptor. More...
     
    interface  operator(==)
     
    + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    type(grib1_descriptor) function, public init_grib1_descriptor (gds)
     Initialize grib-1 descriptor from integer grid definition section (GDS). More...
     
    type(grib2_descriptor) function, public init_grib2_descriptor (gdt_num, gdt_len, gdt_tmpl)
     Initialize grib-2 descriptor from integer grid definition template (GDT). More...
     
    logical function is_same_grid (grid1, grid2)
     Test whether two grid descriptors are the same. More...
     
    logical function is_same_grid_grib1 (self, grid_desc)
     Test whether two grib1_descriptors are the same. More...
     
    logical function is_same_grid_grib2 (self, grid_desc)
     Test whether two grib2_descriptors are the same. More...
     
    +

    Detailed Description

    +

    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.

    +

    An abstract ip_grid_descriptor class is subclassed by the GRIB1 and GRIB2 descriptor types which contain the raw integer grib arrays. A comparison operator to test whether two grid descriptors are the same is also included.

    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    +

    Function/Subroutine Documentation

    + +

    ◆ init_grib1_descriptor()

    + +
    +
    + + + + + + + + +
    type(grib1_descriptor) function, public ip_grid_descriptor_mod::init_grib1_descriptor (integer, dimension(:), intent(in) gds)
    +
    + +

    Initialize grib-1 descriptor from integer grid definition section (GDS).

    +
    Parameters
    + + +
    [in]gdsGrib-1 grid definition section.
    +
    +
    +
    Returns
    Initialized Grib-1 descriptor.
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 74 of file ip_grid_descriptor_mod.F90.

    + +
    +
    + +

    ◆ init_grib2_descriptor()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    type(grib2_descriptor) function, public ip_grid_descriptor_mod::init_grib2_descriptor (integer, intent(in) gdt_num,
    integer, intent(in) gdt_len,
    integer, dimension(:), intent(in) gdt_tmpl 
    )
    +
    + +

    Initialize grib-2 descriptor from integer grid definition template (GDT).

    +
    Parameters
    + + + + +
    [in]gdt_numGrib-2 grid number.
    [in]gdt_lenLenght of the grid definition template.
    [in]gdt_tmplGrib-2 grid definition template.
    +
    +
    +
    Returns
    Initialized Grib-2 descriptor.
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 93 of file ip_grid_descriptor_mod.F90.

    + +
    +
    + +

    ◆ is_same_grid()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    logical function ip_grid_descriptor_mod::is_same_grid (class(ip_grid_descriptor), intent(in) grid1,
    class(ip_grid_descriptor), intent(in) grid2 
    )
    +
    +private
    +
    + +

    Test whether two grid descriptors are the same.

    +
    Parameters
    + + + +
    [in]grid1An ip_grid_descriptor.
    [in]grid2Another ip_grid_descriptor.
    +
    +
    +
    Returns
    True if the grids are the same, false if they are not.
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 115 of file ip_grid_descriptor_mod.F90.

    + +

    Referenced by ip_grid_descriptor_mod::operator(==)::is_same_grid(), and ip_grid_mod::operator(==)::is_same_grid().

    + +
    +
    + +

    ◆ is_same_grid_grib1()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    logical function ip_grid_descriptor_mod::is_same_grid_grib1 (class(grib1_descriptor), intent(in) self,
    class(grib1_descriptor), intent(in) grid_desc 
    )
    +
    +private
    +
    + +

    Test whether two grib1_descriptors are the same.

    +
    Parameters
    + + + +
    [in]selfThe grib1_descriptor which this routine was called on.
    [in]grid_descA grib1_descriptor to compare.
    +
    +
    +
    Returns
    True if the grids are the same, false if they are not.
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 145 of file ip_grid_descriptor_mod.F90.

    + +
    +
    + +

    ◆ is_same_grid_grib2()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    logical function ip_grid_descriptor_mod::is_same_grid_grib2 (class(grib2_descriptor), intent(in) self,
    class(grib2_descriptor), intent(in) grid_desc 
    )
    +
    +private
    +
    + +

    Test whether two grib2_descriptors are the same.

    +
    Parameters
    + + + +
    [in]selfThe grib2_descriptor which this routine was called on.
    [in]grid_descgrib2_descriptor to compare.
    +
    +
    +
    Returns
    True if the grids are the same, false if they are not.
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 164 of file ip_grid_descriptor_mod.F90.

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespaceip__grid__descriptor__mod.js b/ver-5.1.0/namespaceip__grid__descriptor__mod.js new file mode 100644 index 00000000..06ef1ff6 --- /dev/null +++ b/ver-5.1.0/namespaceip__grid__descriptor__mod.js @@ -0,0 +1,13 @@ +var namespaceip__grid__descriptor__mod = +[ + [ "grib1_descriptor", "structip__grid__descriptor__mod_1_1grib1__descriptor.html", "structip__grid__descriptor__mod_1_1grib1__descriptor" ], + [ "grib2_descriptor", "structip__grid__descriptor__mod_1_1grib2__descriptor.html", "structip__grid__descriptor__mod_1_1grib2__descriptor" ], + [ "init_descriptor", "interfaceip__grid__descriptor__mod_1_1init__descriptor.html", "interfaceip__grid__descriptor__mod_1_1init__descriptor" ], + [ "ip_grid_descriptor", "structip__grid__descriptor__mod_1_1ip__grid__descriptor.html", "structip__grid__descriptor__mod_1_1ip__grid__descriptor" ], + [ "operator(==)", "interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08.html", "interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08" ], + [ "init_grib1_descriptor", "namespaceip__grid__descriptor__mod.html#aa00884a7fca018535eaf0c2ebe26bc98", null ], + [ "init_grib2_descriptor", "namespaceip__grid__descriptor__mod.html#a143ac06a2a20697d01606a259213b451", null ], + [ "is_same_grid", "namespaceip__grid__descriptor__mod.html#a202219f9c5c84fa04d3eb1c2208358ec", null ], + [ "is_same_grid_grib1", "namespaceip__grid__descriptor__mod.html#a5bb3c5230b88012bddc3922bfa1cb019", null ], + [ "is_same_grid_grib2", "namespaceip__grid__descriptor__mod.html#a75ac34ea9372afaa29b0df2ce8919988", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/namespaceip__grid__factory__mod.html b/ver-5.1.0/namespaceip__grid__factory__mod.html new file mode 100644 index 00000000..aaa7e55f --- /dev/null +++ b/ver-5.1.0/namespaceip__grid__factory__mod.html @@ -0,0 +1,285 @@ + + + + + + + +NCEPLIBS-ip: ip_grid_factory_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_grid_factory_mod Module Reference
    +
    +
    + +

    Routines for creating an ip_grid given a Grib descriptor. +More...

    + + + + +

    +Data Types

    interface  init_grid
     
    + + + + + + + + + + +

    +Functions/Subroutines

    subroutine init_grid_generic (grid, grid_desc)
     Initializes a polymorphic ip_grid object from an ip_grid_descriptor. More...
     
    subroutine init_grid_grib1 (grid, g1_desc)
     Initializes a polymorphic ip_grid from a grib1_descriptor. More...
     
    subroutine init_grid_grib2 (grid, g2_desc)
     Initializes a polymorphic ip_grid from a grib2_descriptor. More...
     
    +

    Detailed Description

    +

    Routines for creating an ip_grid given a Grib descriptor.

    +
    Author
    George Gayno, Mark Iredell, Kyle Gerheiser
    +
    Date
    July 2021
    +

    Function/Subroutine Documentation

    + +

    ◆ init_grid_generic()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_grid_factory_mod::init_grid_generic (class(ip_grid), intent(out), allocatable grid,
    class(ip_grid_descriptor), intent(in) grid_desc 
    )
    +
    +private
    +
    + +

    Initializes a polymorphic ip_grid object from an ip_grid_descriptor.

    +
    Parameters
    + + + +
    [out]gridGrid to initialize
    [in]grid_descGrid descriptor created from a grib1/grib2 template.
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 33 of file ip_grid_factory_mod.F90.

    + +
    +
    + +

    ◆ init_grid_grib1()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_grid_factory_mod::init_grid_grib1 (class(ip_grid), intent(out), allocatable grid,
    type(grib1_descriptor), intent(in) g1_desc 
    )
    +
    +private
    +
    + +

    Initializes a polymorphic ip_grid from a grib1_descriptor.

    +

    The concrete grid type is chosen based on the grid number in the descriptor.

    +
    Parameters
    + + + +
    [out]gridGrid to initialize
    [in]g1_desc
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 53 of file ip_grid_factory_mod.F90.

    + +

    References ip_grid_mod::equid_cylind_grid_id_grib1, ip_grid_mod::gaussian_grid_id_grib1, ip_grid_mod::lambert_conf_grid_id_grib1, ip_grid_mod::mercator_grid_id_grib1, ip_grid_mod::polar_stereo_grid_id_grib1, ip_grid_mod::rot_equid_cylind_b_grid_id_grib1, and ip_grid_mod::rot_equid_cylind_e_grid_id_grib1.

    + +

    Referenced by ip_grid_factory_mod::init_grid::init_grid_generic().

    + +
    +
    + +

    ◆ init_grid_grib2()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_grid_factory_mod::init_grid_grib2 (class(ip_grid), intent(out), allocatable grid,
    type(grib2_descriptor), intent(in) g2_desc 
    )
    +
    +private
    +
    + +

    Initializes a polymorphic ip_grid from a grib2_descriptor.

    +

    The concrete grid type is chosen based on the grid number in the descriptor.

    +
    Parameters
    + + + +
    [out]gridGrid to initialize
    [in]g2_descGrib2 descriptor
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 89 of file ip_grid_factory_mod.F90.

    + +

    References ip_grid_mod::equid_cylind_grid_id_grib2, ip_grid_mod::gaussian_grid_id_grib2, ip_grid_mod::lambert_conf_grid_id_grib2, ip_grid_mod::mercator_grid_id_grib2, ip_grid_mod::polar_stereo_grid_id_grib2, ip_grid_mod::rot_equid_cylind_b_grid_id_grib2, ip_grid_mod::rot_equid_cylind_e_grid_id_grib2, and ip_grid_mod::rot_equid_cylind_grid_id_grib2.

    + +

    Referenced by ip_grid_factory_mod::init_grid::init_grid_generic().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespaceip__grid__factory__mod.js b/ver-5.1.0/namespaceip__grid__factory__mod.js new file mode 100644 index 00000000..162fc99b --- /dev/null +++ b/ver-5.1.0/namespaceip__grid__factory__mod.js @@ -0,0 +1,7 @@ +var namespaceip__grid__factory__mod = +[ + [ "init_grid", "interfaceip__grid__factory__mod_1_1init__grid.html", "interfaceip__grid__factory__mod_1_1init__grid" ], + [ "init_grid_generic", "namespaceip__grid__factory__mod.html#a2d2ea07d353bae8b057471aa99b58e46", null ], + [ "init_grid_grib1", "namespaceip__grid__factory__mod.html#ad8906ed6fe52c2426c0ff09ce50b6fc5", null ], + [ "init_grid_grib2", "namespaceip__grid__factory__mod.html#aa187dc8dbd1d004a51cc0e9826ffa225", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/namespaceip__grid__mod.html b/ver-5.1.0/namespaceip__grid__mod.html new file mode 100644 index 00000000..ae1efd3d --- /dev/null +++ b/ver-5.1.0/namespaceip__grid__mod.html @@ -0,0 +1,667 @@ + + + + + + + +NCEPLIBS-ip: ip_grid_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_grid_mod Module Reference
    +
    +
    + +

    Abstract ip_grid type. +More...

    + + + + + + + + + + + + + + +

    +Data Types

    interface  gdswzd_interface
     
    interface  init_grib1_interface
     
    interface  init_grib2_interface
     
    type  ip_grid
     Abstract grid that holds fields and methods common to all grids. More...
     
    interface  operator(==)
     Check equality. More...
     
    + + + + + + + + + + + + + +

    +Functions/Subroutines

    integer function field_pos (self, i, j)
     Returns the field position for a given grid point. More...
     
    logical function is_same_grid (grid1, grid2)
     Compares two grids. More...
     
    subroutine, public unuse_ncep_post_arakawa ()
     Disables ncep_post/wgrib2-compatible non-E Arakawa grib2 grids by setting 'ncep_post_arakawa=.false. More...
     
    subroutine, public use_ncep_post_arakawa ()
     Enables ncep_post/wgrib2-compatible non-E Arakawa grib2 grids by setting 'ncep_post_arakawa=.true. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Variables

    integer, parameter, public equid_cylind_grid_id_grib1 = 0
     Integer grid number for equidistant cylindrical grid in grib1. More...
     
    integer, parameter, public equid_cylind_grid_id_grib2 = 0
     Integer grid number for equidistant cylindrical grid in grib2. More...
     
    integer, parameter, public gaussian_grid_id_grib1 = 4
     Integer grid number for Gaussian grid in grib1. More...
     
    integer, parameter, public gaussian_grid_id_grib2 = 40
     Integer grid number for Gaussian grid in grib2. More...
     
    integer, parameter, public lambert_conf_grid_id_grib1 = 3
     Integer grid number for Lambert Conformal grid in grib1. More...
     
    integer, parameter, public lambert_conf_grid_id_grib2 = 30
     Integer grid number for Lambert conformal grid in grib2. More...
     
    integer, parameter, public mercator_grid_id_grib1 = 1
     Integer grid number for Mercator grid in grib1. More...
     
    integer, parameter, public mercator_grid_id_grib2 = 10
     Integer grid number for Mercator grid in grib2. More...
     
    logical, save, public ncep_post_arakawa =.false.
     Use ncep_post/wgrib2-compatible version of init_grib2() for non-E Arakawa grids (enable with use_ncep_post_arakawa()) More...
     
    integer, parameter, public polar_stereo_grid_id_grib1 = 5
     Integer grid number for polar stereo grid in grib1. More...
     
    integer, parameter, public polar_stereo_grid_id_grib2 = 20
     Integer grid number for polar stereo grid in grib2. More...
     
    integer, parameter, public rot_equid_cylind_b_grid_id_grib1 = 205
     Integer grid number for rotated equidistant cylindrical B-stagger grid. More...
     
    integer, parameter, public rot_equid_cylind_b_grid_id_grib2 = 32769
     Integer grid number for rotated equidistant cylindrical B-stagger grid (grib2) More...
     
    integer, parameter, public rot_equid_cylind_e_grid_id_grib1 = 203
     Integer grid number for rotated equidistant cylindrical E-stagger grid. More...
     
    integer, parameter, public rot_equid_cylind_e_grid_id_grib2 = 32768
     Integer grid number for rotated equidistant cylindrical E-stagger grid (grib2) More...
     
    integer, parameter, public rot_equid_cylind_grid_id_grib2 = 1
     Integer grid number for rotated equidistant cylindrical grid in grib2. More...
     
    +

    Detailed Description

    +

    Abstract ip_grid type.

    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    +

    Function/Subroutine Documentation

    + +

    ◆ field_pos()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    integer function ip_grid_mod::field_pos (class(ip_grid), intent(in) self,
    integer, intent(in) i,
    integer, intent(in) j 
    )
    +
    +private
    +
    + +

    Returns the field position for a given grid point.

    +
    Parameters
    + + + + +
    [in]self
    [in]i
    [in]j
    +
    +
    +
    Returns
    Integer position in grib field to locate grid point.
    +
    Author
    Mark Iredell, George Gayno, Kyle Gerheiser
    +
    Date
    April 1996
    + +

    Definition at line 223 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ is_same_grid()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    logical function ip_grid_mod::is_same_grid (class(ip_grid), intent(in) grid1,
    class(ip_grid), intent(in) grid2 
    )
    +
    +private
    +
    + +

    Compares two grids.

    +
    Parameters
    + + + +
    [in]grid1An ip_grid
    [in]grid2Another ip_grid
    +
    +
    +
    Returns
    True if the grids are the same, false if not.
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 208 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ unuse_ncep_post_arakawa()

    + +
    +
    + + + + +
    subroutine, public ip_grid_mod::unuse_ncep_post_arakawa
    +
    + +

    Disables ncep_post/wgrib2-compatible non-E Arakawa grib2 grids by setting 'ncep_post_arakawa=.false.

    +

    '. This subroutine should be called prior to init_grib2().

    +
    Author
    Alex Richert
    +
    Date
    May 2024
    + +

    Definition at line 195 of file ip_grid_mod.F90.

    + +

    References ncep_post_arakawa.

    + +
    +
    + +

    ◆ use_ncep_post_arakawa()

    + +
    +
    + + + + +
    subroutine, public ip_grid_mod::use_ncep_post_arakawa
    +
    + +

    Enables ncep_post/wgrib2-compatible non-E Arakawa grib2 grids by setting 'ncep_post_arakawa=.true.

    +

    '. This subroutine should be called prior to init_grib2().

    +
    Author
    Alex Richert
    +
    Date
    May 2024
    + +

    Definition at line 185 of file ip_grid_mod.F90.

    + +

    References ncep_post_arakawa.

    + +
    +
    +

    Variable Documentation

    + +

    ◆ equid_cylind_grid_id_grib1

    + +
    +
    + + + + +
    integer, parameter, public ip_grid_mod::equid_cylind_grid_id_grib1 = 0
    +
    + +

    Integer grid number for equidistant cylindrical grid in grib1.

    + +

    Definition at line 14 of file ip_grid_mod.F90.

    + +

    Referenced by ip_grid_factory_mod::init_grid_grib1().

    + +
    +
    + +

    ◆ equid_cylind_grid_id_grib2

    + +
    +
    + + + + +
    integer, parameter, public ip_grid_mod::equid_cylind_grid_id_grib2 = 0
    +
    + +

    Integer grid number for equidistant cylindrical grid in grib2.

    + +

    Definition at line 22 of file ip_grid_mod.F90.

    + +

    Referenced by ip_grid_factory_mod::init_grid_grib2().

    + +
    +
    + +

    ◆ gaussian_grid_id_grib1

    + +
    +
    + + + + +
    integer, parameter, public ip_grid_mod::gaussian_grid_id_grib1 = 4
    +
    + +

    Integer grid number for Gaussian grid in grib1.

    + +

    Definition at line 17 of file ip_grid_mod.F90.

    + +

    Referenced by ip_grid_factory_mod::init_grid_grib1().

    + +
    +
    + +

    ◆ gaussian_grid_id_grib2

    + +
    +
    + + + + +
    integer, parameter, public ip_grid_mod::gaussian_grid_id_grib2 = 40
    +
    + +

    Integer grid number for Gaussian grid in grib2.

    + +

    Definition at line 27 of file ip_grid_mod.F90.

    + +

    Referenced by ip_grid_factory_mod::init_grid_grib2().

    + +
    +
    + +

    ◆ lambert_conf_grid_id_grib1

    + +
    +
    + + + + +
    integer, parameter, public ip_grid_mod::lambert_conf_grid_id_grib1 = 3
    +
    + +

    Integer grid number for Lambert Conformal grid in grib1.

    + +

    Definition at line 16 of file ip_grid_mod.F90.

    + +

    Referenced by ip_grid_factory_mod::init_grid_grib1().

    + +
    +
    + +

    ◆ lambert_conf_grid_id_grib2

    + +
    +
    + + + + +
    integer, parameter, public ip_grid_mod::lambert_conf_grid_id_grib2 = 30
    +
    + +

    Integer grid number for Lambert conformal grid in grib2.

    + +

    Definition at line 26 of file ip_grid_mod.F90.

    + +

    Referenced by ip_grid_factory_mod::init_grid_grib2().

    + +
    +
    + +

    ◆ mercator_grid_id_grib1

    + +
    +
    + + + + +
    integer, parameter, public ip_grid_mod::mercator_grid_id_grib1 = 1
    +
    + +

    Integer grid number for Mercator grid in grib1.

    + +

    Definition at line 15 of file ip_grid_mod.F90.

    + +

    Referenced by ip_grid_factory_mod::init_grid_grib1().

    + +
    +
    + +

    ◆ mercator_grid_id_grib2

    + +
    +
    + + + + +
    integer, parameter, public ip_grid_mod::mercator_grid_id_grib2 = 10
    +
    + +

    Integer grid number for Mercator grid in grib2.

    + +

    Definition at line 24 of file ip_grid_mod.F90.

    + +

    Referenced by ip_grid_factory_mod::init_grid_grib2().

    + +
    +
    + +

    ◆ ncep_post_arakawa

    + +
    +
    + + + + +
    logical, save, public ip_grid_mod::ncep_post_arakawa =.false.
    +
    + +

    Use ncep_post/wgrib2-compatible version of init_grib2() for non-E Arakawa grids (enable with use_ncep_post_arakawa())

    + +

    Definition at line 31 of file ip_grid_mod.F90.

    + +

    Referenced by unuse_ncep_post_arakawa(), and use_ncep_post_arakawa().

    + +
    +
    + +

    ◆ polar_stereo_grid_id_grib1

    + +
    +
    + + + + +
    integer, parameter, public ip_grid_mod::polar_stereo_grid_id_grib1 = 5
    +
    + +

    Integer grid number for polar stereo grid in grib1.

    + +

    Definition at line 18 of file ip_grid_mod.F90.

    + +

    Referenced by ip_grid_factory_mod::init_grid_grib1().

    + +
    +
    + +

    ◆ polar_stereo_grid_id_grib2

    + +
    +
    + + + + +
    integer, parameter, public ip_grid_mod::polar_stereo_grid_id_grib2 = 20
    +
    + +

    Integer grid number for polar stereo grid in grib2.

    + +

    Definition at line 25 of file ip_grid_mod.F90.

    + +

    Referenced by ip_grid_factory_mod::init_grid_grib2().

    + +
    +
    + +

    ◆ rot_equid_cylind_b_grid_id_grib1

    + +
    +
    + + + + +
    integer, parameter, public ip_grid_mod::rot_equid_cylind_b_grid_id_grib1 = 205
    +
    + +

    Integer grid number for rotated equidistant cylindrical B-stagger grid.

    + +

    Definition at line 20 of file ip_grid_mod.F90.

    + +

    Referenced by ip_grid_factory_mod::init_grid_grib1().

    + +
    +
    + +

    ◆ rot_equid_cylind_b_grid_id_grib2

    + +
    +
    + + + + +
    integer, parameter, public ip_grid_mod::rot_equid_cylind_b_grid_id_grib2 = 32769
    +
    + +

    Integer grid number for rotated equidistant cylindrical B-stagger grid (grib2)

    + +

    Definition at line 29 of file ip_grid_mod.F90.

    + +

    Referenced by ip_grid_factory_mod::init_grid_grib2().

    + +
    +
    + +

    ◆ rot_equid_cylind_e_grid_id_grib1

    + +
    +
    + + + + +
    integer, parameter, public ip_grid_mod::rot_equid_cylind_e_grid_id_grib1 = 203
    +
    + +

    Integer grid number for rotated equidistant cylindrical E-stagger grid.

    + +

    Definition at line 19 of file ip_grid_mod.F90.

    + +

    Referenced by ip_grid_factory_mod::init_grid_grib1().

    + +
    +
    + +

    ◆ rot_equid_cylind_e_grid_id_grib2

    + +
    +
    + + + + +
    integer, parameter, public ip_grid_mod::rot_equid_cylind_e_grid_id_grib2 = 32768
    +
    + +

    Integer grid number for rotated equidistant cylindrical E-stagger grid (grib2)

    + +

    Definition at line 28 of file ip_grid_mod.F90.

    + +

    Referenced by ip_grid_factory_mod::init_grid_grib2().

    + +
    +
    + +

    ◆ rot_equid_cylind_grid_id_grib2

    + +
    +
    + + + + +
    integer, parameter, public ip_grid_mod::rot_equid_cylind_grid_id_grib2 = 1
    +
    + +

    Integer grid number for rotated equidistant cylindrical grid in grib2.

    + +

    Definition at line 23 of file ip_grid_mod.F90.

    + +

    Referenced by ip_grid_factory_mod::init_grid_grib2().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespaceip__grid__mod.js b/ver-5.1.0/namespaceip__grid__mod.js new file mode 100644 index 00000000..291e51a3 --- /dev/null +++ b/ver-5.1.0/namespaceip__grid__mod.js @@ -0,0 +1,28 @@ +var namespaceip__grid__mod = +[ + [ "gdswzd_interface", "interfaceip__grid__mod_1_1gdswzd__interface.html", "interfaceip__grid__mod_1_1gdswzd__interface" ], + [ "init_grib1_interface", "interfaceip__grid__mod_1_1init__grib1__interface.html", "interfaceip__grid__mod_1_1init__grib1__interface" ], + [ "init_grib2_interface", "interfaceip__grid__mod_1_1init__grib2__interface.html", "interfaceip__grid__mod_1_1init__grib2__interface" ], + [ "ip_grid", "structip__grid__mod_1_1ip__grid.html", "structip__grid__mod_1_1ip__grid" ], + [ "operator(==)", "interfaceip__grid__mod_1_1operator_07_0a_0a_08.html", "interfaceip__grid__mod_1_1operator_07_0a_0a_08" ], + [ "field_pos", "namespaceip__grid__mod.html#a63572318d74ec94c20c5ccd6ded2d442", null ], + [ "is_same_grid", "namespaceip__grid__mod.html#a663bda9af9dd991a09ba0f0de66dc045", null ], + [ "unuse_ncep_post_arakawa", "namespaceip__grid__mod.html#ac8e716adbe5c1156bfd20f936a4205de", null ], + [ "use_ncep_post_arakawa", "namespaceip__grid__mod.html#a1d570947cf124c28ba67305494bff450", null ], + [ "equid_cylind_grid_id_grib1", "namespaceip__grid__mod.html#ad96da95d40beceb1a1c405971e8130bb", null ], + [ "equid_cylind_grid_id_grib2", "namespaceip__grid__mod.html#a3b5ae57fe3d6d365cfd1ccdb4feb8ac6", null ], + [ "gaussian_grid_id_grib1", "namespaceip__grid__mod.html#a45e8afad72b1b8856b3e44f2dd3123b3", null ], + [ "gaussian_grid_id_grib2", "namespaceip__grid__mod.html#a36a9a73ecd50353f892341ae8a5c8316", null ], + [ "lambert_conf_grid_id_grib1", "namespaceip__grid__mod.html#ab82b90d20f38ff39741f6890fa422d16", null ], + [ "lambert_conf_grid_id_grib2", "namespaceip__grid__mod.html#a2e49846c9122b1fe1fcdbb2913fc32fe", null ], + [ "mercator_grid_id_grib1", "namespaceip__grid__mod.html#ab9ff525eca4f053b04ec96a83cb06682", null ], + [ "mercator_grid_id_grib2", "namespaceip__grid__mod.html#af9c58af5162d96cb7d1ac5001139b856", null ], + [ "ncep_post_arakawa", "namespaceip__grid__mod.html#a88751d2ee535d807b6d420fcfb99ee71", null ], + [ "polar_stereo_grid_id_grib1", "namespaceip__grid__mod.html#afee73c2f09ea9de43c156dc594ae1df1", null ], + [ "polar_stereo_grid_id_grib2", "namespaceip__grid__mod.html#a5b3ad320b41791e65966e1bb498e9ae3", null ], + [ "rot_equid_cylind_b_grid_id_grib1", "namespaceip__grid__mod.html#adb7d7d18410aaae52d7eee2e97f04b14", null ], + [ "rot_equid_cylind_b_grid_id_grib2", "namespaceip__grid__mod.html#adbda63b51409aaed34a707b222da8c43", null ], + [ "rot_equid_cylind_e_grid_id_grib1", "namespaceip__grid__mod.html#a4e11ce780c3d165c282684188890af1c", null ], + [ "rot_equid_cylind_e_grid_id_grib2", "namespaceip__grid__mod.html#a248f834201bea9295bbe6a99abd038f8", null ], + [ "rot_equid_cylind_grid_id_grib2", "namespaceip__grid__mod.html#adc7c650c524eb6425e77b2e0eac0979a", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/namespaceip__grids__mod.html b/ver-5.1.0/namespaceip__grids__mod.html new file mode 100644 index 00000000..1835d563 --- /dev/null +++ b/ver-5.1.0/namespaceip__grids__mod.html @@ -0,0 +1,106 @@ + + + + + + + +NCEPLIBS-ip: ip_grids_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ip_grids_mod Module Reference
    +
    +
    + +

    Re-export the individual grids. +More...

    +

    Detailed Description

    +

    Re-export the individual grids.

    +
    Author
    Kyle Gerheiser
    +
    Date
    7/21/21
    +
    +
    + + + + diff --git a/ver-5.1.0/namespaceip__interpolators__mod.html b/ver-5.1.0/namespaceip__interpolators__mod.html new file mode 100644 index 00000000..d4c286a7 --- /dev/null +++ b/ver-5.1.0/namespaceip__interpolators__mod.html @@ -0,0 +1,268 @@ + + + + + + + +NCEPLIBS-ip: ip_interpolators_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_interpolators_mod Module Reference
    +
    +
    + +

    Top-level module to export interpolation routines and constants. +More...

    + + + + + + + + + + + + + + +

    +Variables

    integer, parameter, public bicubic_interp_id = 1
     
    integer, parameter, public bilinear_interp_id = 0
     
    integer, parameter, public budget_interp_id = 3
     
    integer, parameter, public neighbor_budget_interp_id = 6
     
    integer, parameter, public neighbor_interp_id = 2
     
    integer, parameter, public spectral_interp_id = 4
     
    +

    Detailed Description

    +

    Top-level module to export interpolation routines and constants.

    +
    Author
    Kyle Gerheiser
    +

    Variable Documentation

    + +

    ◆ bicubic_interp_id

    + +
    +
    + + + + +
    integer, parameter, public ip_interpolators_mod::bicubic_interp_id = 1
    +
    +
    Parameters
    + + +
    Constantto choose BICUBIC interpolation method
    +
    +
    + +

    Definition at line 19 of file ip_interpolators_mod.F90.

    + +

    Referenced by ipolates_mod::ipolates_grid(), and ipolatev_mod::ipolatev_grid().

    + +
    +
    + +

    ◆ bilinear_interp_id

    + +
    +
    + + + + +
    integer, parameter, public ip_interpolators_mod::bilinear_interp_id = 0
    +
    +
    Parameters
    + + +
    Constantto choose BILINEAR interpolation method
    +
    +
    + +

    Definition at line 17 of file ip_interpolators_mod.F90.

    + +

    Referenced by ipolates_mod::ipolates_grid(), and ipolatev_mod::ipolatev_grid().

    + +
    +
    + +

    ◆ budget_interp_id

    + +
    +
    + + + + +
    integer, parameter, public ip_interpolators_mod::budget_interp_id = 3
    +
    +
    Parameters
    + + +
    Constantto choose BUDGET interpolation method
    +
    +
    + +

    Definition at line 23 of file ip_interpolators_mod.F90.

    + +

    Referenced by ipolates_mod::ipolates_grid(), and ipolatev_mod::ipolatev_grid().

    + +
    +
    + +

    ◆ neighbor_budget_interp_id

    + +
    +
    + + + + +
    integer, parameter, public ip_interpolators_mod::neighbor_budget_interp_id = 6
    +
    +
    Parameters
    + + +
    Constantto choose NEIGBOR_BUDGET interpolation method
    +
    +
    + +

    Definition at line 27 of file ip_interpolators_mod.F90.

    + +

    Referenced by ipolates_mod::ipolates_grid(), and ipolatev_mod::ipolatev_grid().

    + +
    +
    + +

    ◆ neighbor_interp_id

    + +
    +
    + + + + +
    integer, parameter, public ip_interpolators_mod::neighbor_interp_id = 2
    +
    +
    Parameters
    + + +
    Constantto choose NEIGBOR interpolation method
    +
    +
    + +

    Definition at line 21 of file ip_interpolators_mod.F90.

    + +

    Referenced by ipolates_mod::ipolates_grid(), and ipolatev_mod::ipolatev_grid().

    + +
    +
    + +

    ◆ spectral_interp_id

    + +
    +
    + + + + +
    integer, parameter, public ip_interpolators_mod::spectral_interp_id = 4
    +
    +
    Parameters
    + + +
    Constantto choose SPECTRAL interpolation method
    +
    +
    + +

    Definition at line 25 of file ip_interpolators_mod.F90.

    + +

    Referenced by ipolates_mod::ipolates_grid(), and ipolatev_mod::ipolatev_grid().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespaceip__lambert__conf__grid__mod.html b/ver-5.1.0/namespaceip__lambert__conf__grid__mod.html new file mode 100644 index 00000000..ccd5540d --- /dev/null +++ b/ver-5.1.0/namespaceip__lambert__conf__grid__mod.html @@ -0,0 +1,880 @@ + + + + + + + +NCEPLIBS-ip: ip_lambert_conf_grid_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_lambert_conf_grid_mod Module Reference
    +
    +
    + +

    Lambert conformal grib decoder and grid coordinate transformations. +More...

    + + + + +

    +Data Types

    type  ip_lambert_conf_grid
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine gdswzd_lambert_conf (self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     GDS wizard for lambert conformal conical. More...
     
    subroutine init_grib1 (self, g1_desc)
     Initializes a Lambert Conformal grid given a grib1_descriptor object. More...
     
    subroutine init_grib2 (self, g2_desc)
     Initializes a Lambert Conformal grid given a grib2_descriptor object. More...
     
    subroutine lambert_conf_grid_area (RLAT, FILL, DR, AREA)
     Grid box area for lambert conformal conical. More...
     
    subroutine lambert_conf_map_jacob (RLAT, FILL, DLON, DR, XLON, XLAT, YLON, YLAT)
     Map jacobians for lambert conformal conical. More...
     
    subroutine lambert_conf_vect_rot (DLON, CROT, SROT)
     Vector rotation fields for lambert conformal conical. More...
     
    + + + + + + + + + + + + + + + + + + + +

    +Variables

    real an
     Cone factor. More...
     
    real dxs
     x-direction grid length adjusted for scan mode. More...
     
    real dys
     y-direction grid length adjusted for scan model. More...
     
    real h
     Hemisphere flag. More...
     
    integer irot
     vector rotation flag. More...
     
    real rerth
     Radius of the earth. More...
     
    +

    Detailed Description

    +

    Lambert conformal grib decoder and grid coordinate transformations.

    +

    Octet numbers refer to [GRIB2 - GRID DEFINITION TEMPLATE 3.30 Lambert conformal](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_temp3-30.shtml).

    +
    Author
    Iredell
    +
    Date
    96-04-10
    +

    Function/Subroutine Documentation

    + +

    ◆ gdswzd_lambert_conf()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_lambert_conf_grid_mod::gdswzd_lambert_conf (class(ip_lambert_conf_grid), intent(in) self,
    integer, intent(in) IOPT,
    integer, intent(in) NPTS,
    real, intent(in) FILL,
    real, dimension(npts), intent(inout) XPTS,
    real, dimension(npts), intent(inout) YPTS,
    real, dimension(npts), intent(inout) RLON,
    real, dimension(npts), intent(inout) RLAT,
    integer, intent(out) NRET,
    real, dimension(npts), intent(out), optional CROT,
    real, dimension(npts), intent(out), optional SROT,
    real, dimension(npts), intent(out), optional XLON,
    real, dimension(npts), intent(out), optional XLAT,
    real, dimension(npts), intent(out), optional YLON,
    real, dimension(npts), intent(out), optional YLAT,
    real, dimension(npts), intent(out), optional AREA 
    )
    +
    +private
    +
    + +

    GDS wizard for lambert conformal conical.

    +

    This subprogram decodes the grib 2 grid definition template (passed in integer form as decoded by the ncep g2 library) and returns one of the following:

      +
    • (iopt=+1) earth coordinates of selected grid coordinates
    • +
    • (iopt=-1) grid coordinates of selected earth coordinates
    • +
    +

    Works for lambert conformal conical projections.

    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values.

    +

    The actual number of valid points computed is returned too.

    +

    Optionally, the vector rotations, map jacobians and grid box areas for this grid may be returned as well.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present. To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present. To compute the grid box areas the optional argument 'area' must be present.

    +

    +Program History Log

    + + + + + + + + + + + + + + + + + + + +
    Date Programmer Comments
    96-04-10 iredell Initial.
    96-10-01 iredell protected against unresolvable points
    97-10-20 iredell include map options
    1999-04-27 gilbert corrected minor error calculating variable an for the secant projection case (rlati1.ne.rlati2).
    2012-08-14 gayno fix problem with sh grids. Ensure grid box area always positive.
    2015-01-21 gayno merger of gdswiz03() and gdswzd03(). Make crot,sort,xlon,xlat,ylon,ylat and area optional arguments. Make part of a module. Move vector rotation, map jacobian and grid box area computations to separate subroutines.
    2015-07-13 gayno Convert to grib 2. Replace grib 1 kgds array with grib 2 grid definition template array. Rename routine.
    2018-07-20 wesley add threads.
    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]selfip_lambert_conf_grid object.
    [in]ioptoption flag
      +
    • 1 to compute earth coords of selected grid coords
    • +
    • -1 to compute grid coords of selected earth coords
    • +
    +
    [in]nptsmaximum number of coordinates
    [in]fillfill value to set invalid output data (must be impossible value; suggested value: -9999.)
    [in,out]xpts(npts) grid x point coordinates if iopt>0
    [in,out]ypts(npts) grid y point coordinates if iopt>0
    [in,out]rlon(npts) earth longitudes in degrees e if iopt<0 (acceptable range: -360. to 360.)
    [in,out]rlat(npts) earth latitudes in degrees n if iopt<0 (acceptable range: -90. to 90.)
    [out]nretnumber of valid points computed
    [out]crotoptional (npts) clockwise vector rotation cosines
    [out]srotoptional (npts) clockwise vector rotation sines (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlonoptional (npts) dx/dlon in 1/degrees
    [out]xlatoptional (npts) dx/dlat in 1/degrees
    [out]ylonoptional (npts) dy/dlon in 1/degrees
    [out]ylatoptional (npts) dy/dlat in 1/degrees
    [out]areaoptional (npts) area weights in m**2 (proportional to the square of the map factor)
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    +
    + +

    Definition at line 219 of file ip_lambert_conf_grid_mod.F90.

    + +

    References an, dxs, dys, h, irot, lambert_conf_grid_area(), lambert_conf_map_jacob(), lambert_conf_vect_rot(), and rerth.

    + +
    +
    + +

    ◆ init_grib1()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_lambert_conf_grid_mod::init_grib1 (class(ip_lambert_conf_grid), intent(inout) self,
    type(grib1_descriptor), intent(in) g1_desc 
    )
    +
    +private
    +
    + +

    Initializes a Lambert Conformal grid given a grib1_descriptor object.

    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g1_descA grib1_descriptor
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    +
    + +

    Definition at line 60 of file ip_lambert_conf_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib2()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_lambert_conf_grid_mod::init_grib2 (class(ip_lambert_conf_grid), intent(inout) self,
    type(grib2_descriptor), intent(in) g2_desc 
    )
    +
    +private
    +
    + +

    Initializes a Lambert Conformal grid given a grib2_descriptor object.

    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g2_descA grib2_descriptor
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    +
    + +

    Definition at line 112 of file ip_lambert_conf_grid_mod.F90.

    + +
    +
    + +

    ◆ lambert_conf_grid_area()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_lambert_conf_grid_mod::lambert_conf_grid_area (real, intent(in) RLAT,
    real, intent(in) FILL,
    real, intent(in) DR,
    real, intent(out) AREA 
    )
    +
    +private
    +
    + +

    Grid box area for lambert conformal conical.

    +

    This subprogram computes the grid box area for a lambert conformal conical grid.

    +

    +Program History Log

    + + + + + + + + + +
    Date Programmer Comments
    2015-01-21 Gayno initial version
    2015-09-17 Gayno rename as "lambert_conf_grid_area"
    2018-07-20 Wesley pass in dr for threading.
    +
    Parameters
    + + + + + +
    [in]rlatlatitude of grid point in degrees (real)
    [in]fillfill value for undefined points (real)
    [in]drdistance from pole point (real)
    [out]areaarea weights in m**2 (real)
    +
    +
    +
    Author
    Gayno
    +
    Date
    2015-01-21
    + +

    Definition at line 468 of file ip_lambert_conf_grid_mod.F90.

    + +

    References an, dxs, dys, and rerth.

    + +

    Referenced by gdswzd_lambert_conf().

    + +
    +
    + +

    ◆ lambert_conf_map_jacob()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_lambert_conf_grid_mod::lambert_conf_map_jacob (real, intent(in) RLAT,
    real, intent(in) FILL,
    real, intent(in) DLON,
    real, intent(in) DR,
    real, intent(out) XLON,
    real, intent(out) XLAT,
    real, intent(out) YLON,
    real, intent(out) YLAT 
    )
    +
    +private
    +
    + +

    Map jacobians for lambert conformal conical.

    +

    This subprogram computes the map jacobians for a lambert conformal conical grid.

    +

    +Program History Log

    + + + + + + + + + +
    Date Programmer Comments
    2015-01-21 Gayno initial version
    2015-09-17 Gayno rename as "lambert_conf_map_jacob"
    2018-07-20 Wesley pass dlon and dr for threading.
    +
    Parameters
    + + + + + + + + + +
    [in]rlatgrid point latitude in degrees (real)
    [in]fillfill value for undefined points (real)
    [in]dlondistance from orientation longitude (real)
    [in]drdistance from pole point (real)
    [out]xlondx/dlon in 1/degrees (real)
    [out]xlatdx/dlat in 1/degrees (real)
    [out]ylondy/dlon in 1/degrees (real)
    [out]ylatdy/dlat in 1/degrees (real)
    +
    +
    +
    Author
    Gayno
    +
    Date
    2015-01-21
    + +

    Definition at line 427 of file ip_lambert_conf_grid_mod.F90.

    + +

    References an, dxs, dys, and h.

    + +

    Referenced by gdswzd_lambert_conf().

    + +
    +
    + +

    ◆ lambert_conf_vect_rot()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_lambert_conf_grid_mod::lambert_conf_vect_rot (real, intent(in) DLON,
    real, intent(out) CROT,
    real, intent(out) SROT 
    )
    +
    +private
    +
    + +

    Vector rotation fields for lambert conformal conical.

    +

    This subprogram computes the vector rotation sines and cosines for a lambert conformal conical grid.

    +

    +Program History Log

    + + + + + + + + + +
    Date Programmer Comments
    2015-01-21 gayno initial version
    2015-09-17 gayno rename as "lambert_conf_vect_rot"
    2018-07-20 wesley pass in dlon for threading.
    +
    Parameters
    + + + + +
    [in]dlonfrom orientation longitude (real)
    [out]crotvector rotation cosines (real)
    [out]srotvector rotation sines (real) (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    +
    +
    +
    Author
    Gayno
    +
    Date
    2015-01-21
    + +

    Definition at line 390 of file ip_lambert_conf_grid_mod.F90.

    + +

    References an, and irot.

    + +

    Referenced by gdswzd_lambert_conf().

    + +
    +
    +

    Variable Documentation

    + +

    ◆ an

    + +
    +
    + + + + + +
    + + + + +
    real ip_lambert_conf_grid_mod::an
    +
    +private
    +
    + +

    Cone factor.

    + +

    Definition at line 45 of file ip_lambert_conf_grid_mod.F90.

    + +

    Referenced by gdswzd_lambert_conf(), lambert_conf_grid_area(), lambert_conf_map_jacob(), and lambert_conf_vect_rot().

    + +
    +
    + +

    ◆ dxs

    + +
    +
    + + + + + +
    + + + + +
    real ip_lambert_conf_grid_mod::dxs
    +
    +private
    +
    + +

    x-direction grid length adjusted for scan mode.

    +

    GRIB2, Section 3, octets 56-59.

    + +

    Definition at line 46 of file ip_lambert_conf_grid_mod.F90.

    + +

    Referenced by gdswzd_lambert_conf(), lambert_conf_grid_area(), and lambert_conf_map_jacob().

    + +
    +
    + +

    ◆ dys

    + +
    +
    + + + + + +
    + + + + +
    real ip_lambert_conf_grid_mod::dys
    +
    +private
    +
    + +

    y-direction grid length adjusted for scan model.

    +

    GRIB2, Section 3, octets 60-63.

    + +

    Definition at line 47 of file ip_lambert_conf_grid_mod.F90.

    + +

    Referenced by gdswzd_lambert_conf(), lambert_conf_grid_area(), and lambert_conf_map_jacob().

    + +
    +
    + +

    ◆ h

    + +
    +
    + + + + + +
    + + + + +
    real ip_lambert_conf_grid_mod::h
    +
    +private
    +
    + +

    Hemisphere flag.

    +

    1-NH, minus 1-SH.

    + +

    Definition at line 48 of file ip_lambert_conf_grid_mod.F90.

    + +

    Referenced by gdswzd_lambert_conf(), and lambert_conf_map_jacob().

    + +
    +
    + +

    ◆ irot

    + +
    +
    + + + + + +
    + + + + +
    integer ip_lambert_conf_grid_mod::irot
    +
    +private
    +
    + +

    vector rotation flag.

    +

    When "1", vectors are grid relative. When "0", vectors are earth relative. GRIB2, Section 3, octet 55.

    + +

    Definition at line 44 of file ip_lambert_conf_grid_mod.F90.

    + +

    Referenced by gdswzd_lambert_conf(), and lambert_conf_vect_rot().

    + +
    +
    + +

    ◆ rerth

    + +
    +
    + + + + + +
    + + + + +
    real ip_lambert_conf_grid_mod::rerth
    +
    +private
    +
    + +

    Radius of the earth.

    +

    GRIB2, Section 3, octets 15-30.

    + +

    Definition at line 49 of file ip_lambert_conf_grid_mod.F90.

    + +

    Referenced by gdswzd_lambert_conf(), and lambert_conf_grid_area().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespaceip__lambert__conf__grid__mod.js b/ver-5.1.0/namespaceip__lambert__conf__grid__mod.js new file mode 100644 index 00000000..b1bbe278 --- /dev/null +++ b/ver-5.1.0/namespaceip__lambert__conf__grid__mod.js @@ -0,0 +1,16 @@ +var namespaceip__lambert__conf__grid__mod = +[ + [ "ip_lambert_conf_grid", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid" ], + [ "gdswzd_lambert_conf", "namespaceip__lambert__conf__grid__mod.html#a5ebb9e4f1bd58caa254771b305c94f71", null ], + [ "init_grib1", "namespaceip__lambert__conf__grid__mod.html#a5544708e893ffcfbe7d958fdec700eea", null ], + [ "init_grib2", "namespaceip__lambert__conf__grid__mod.html#acb0339a9fff4fff6c2017d37f8bed0cf", null ], + [ "lambert_conf_grid_area", "namespaceip__lambert__conf__grid__mod.html#a15c44b47172b926aea840caee9723b1c", null ], + [ "lambert_conf_map_jacob", "namespaceip__lambert__conf__grid__mod.html#a5e1d42f0027236f47467e25c525e66ae", null ], + [ "lambert_conf_vect_rot", "namespaceip__lambert__conf__grid__mod.html#a58187073914efa18eca897c6ec203b71", null ], + [ "an", "namespaceip__lambert__conf__grid__mod.html#a82b75fe2d8495aab75b225c6309e61c8", null ], + [ "dxs", "namespaceip__lambert__conf__grid__mod.html#a196e94b5a2add34133c87f845394fa81", null ], + [ "dys", "namespaceip__lambert__conf__grid__mod.html#aad8b04b77b0920dbf9ed3827e2e8cfd7", null ], + [ "h", "namespaceip__lambert__conf__grid__mod.html#aa91572e8b5ba3559c041f1750b6696c6", null ], + [ "irot", "namespaceip__lambert__conf__grid__mod.html#a7dea876ed4206c5ecc0444aadb7d6acd", null ], + [ "rerth", "namespaceip__lambert__conf__grid__mod.html#a9f0538d092cd7d2829a5b98247eb560d", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/namespaceip__mercator__grid__mod.html b/ver-5.1.0/namespaceip__mercator__grid__mod.html new file mode 100644 index 00000000..d6e63329 --- /dev/null +++ b/ver-5.1.0/namespaceip__mercator__grid__mod.html @@ -0,0 +1,728 @@ + + + + + + + +NCEPLIBS-ip: ip_mercator_grid_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_mercator_grid_mod Module Reference
    +
    +
    + +

    GDS wizard for mercator cylindrical. +More...

    + + + + +

    +Data Types

    type  ip_mercator_grid
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine gdswzd_mercator (self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     GDS wizard for mercator cylindrical. More...
     
    subroutine init_grib1 (self, g1_desc)
     Initializes a mercator grid given a grib1_descriptor object. More...
     
    subroutine init_grib2 (self, g2_desc)
     Init GRIB2. More...
     
    subroutine mercator_grid_area (RLAT, AREA)
     Grid box area for mercator cylindrical grids. More...
     
    subroutine mercator_map_jacob (RLAT, XLON, XLAT, YLON, YLAT)
     Map jacobians for mercator cylindrical grids. More...
     
    subroutine mercator_vect_rot (CROT, SROT)
     Vector rotation fields for mercator cylindrical grids. More...
     
    + + + + + + + + + + +

    +Variables

    real dlon
     Longitudinal direction grid length. More...
     
    real dphi
     Latitudinal direction grid length. More...
     
    real rerth
     Radius of the Earth. More...
     
    +

    Detailed Description

    +

    GDS wizard for mercator cylindrical.

    +

    Octet numbers refer to GRIB2 - GRID DEFINITION TEMPLATE 3.10 - Mercator.

    +
    Author
    Iredell
    +
    Date
    96-04-10
    +

    Function/Subroutine Documentation

    + +

    ◆ gdswzd_mercator()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_mercator_grid_mod::gdswzd_mercator (class(ip_mercator_grid), intent(in) self,
    integer, intent(in) IOPT,
    integer, intent(in) NPTS,
    real, intent(in) FILL,
    real, dimension(npts), intent(inout) XPTS,
    real, dimension(npts), intent(inout) YPTS,
    real, dimension(npts), intent(inout) RLON,
    real, dimension(npts), intent(inout) RLAT,
    integer, intent(out) NRET,
    real, dimension(npts), intent(out), optional CROT,
    real, dimension(npts), intent(out), optional SROT,
    real, dimension(npts), intent(out), optional XLON,
    real, dimension(npts), intent(out), optional XLAT,
    real, dimension(npts), intent(out), optional YLON,
    real, dimension(npts), intent(out), optional YLAT,
    real, dimension(npts), intent(out), optional AREA 
    )
    +
    +private
    +
    + +

    GDS wizard for mercator cylindrical.

    +

    This routine decodes the grib 2 grid definition template (passed in integer form as decoded by the ncep g2 library) and returns one of the following:

      +
    • (iopt=+1) earth coordinates of selected grid coordinates
    • +
    • (iopt=-1) grid coordinates of selected earth coordinates
    • +
    +

    Works for mercator cylindrical projections.

    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values.

    +

    The actual number of valid points computed is returned too.

    +

    Optionally, the vector rotations, map jacobians and the grid box areas may be returned. To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present. To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present. to compute the grid box areas, the optional argument 'area' must be present.

    +

    +Program History Log

    + + + + + + + + + + + + + + + +
    Date Programmer Comments
    96-04-10 iredell Initial
    96-10-01 iredell protected against unresolvable points
    97-10-20 iredell include map options
    2015-01-21 gayno merger of gdswiz01() and gdswzd01(). Make crot,sort,xlon,xlat,ylon,ylat and area optional arguments. Make part of a module. move vector rotation, map jacobian and grid box area computations to separate subroutines.
    2015-07-13 gayno convert to grib 2. replace grib 1 kgds array with grib 2 grid definition template array. Rename.
    2018-07-20 wesley add threads.
    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]selfgrid descriptor.
    [in]ioptoption flag
      +
    • 1 to compute earth coords of selected grid coords
    • +
    • -1 to compute grid coords of selected earth coords
    • +
    +
    [in]nptsmaximum number of coordinates
    [in]fillfill value to set invalid output data (must be impossible value; suggested value: -9999.)
    [in,out]xpts(npts) grid x point coordinates if iopt>0
    [in,out]ypts(npts) grid y point coordinates if iopt>0
    [in,out]rlon(npts) earth longitudes in degrees e if iopt<0 (acceptable range: -360. to 360.)
    [in,out]rlat(npts) earth latitudes in degrees n if iopt<0 (acceptable range: -90. to 90.)
    [out]nretnumber of valid points computed
    [out]crotoptional (npts) clockwise vector rotation cosines
    [out]srotoptional (npts) clockwise vector rotation sines (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlonoptional (npts) dx/dlon in 1/degrees
    [out]xlatoptional (npts) dx/dlat in 1/degrees
    [out]ylonoptional (npts) dy/dlon in 1/degrees
    [out]ylatoptional (npts) dy/dlat in 1/degrees
    [out]areaoptional (npts) area weights in m**2 (proportional to the square of the map factor)
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    + +

    Definition at line 198 of file ip_mercator_grid_mod.F90.

    + +

    References dlon, dphi, mercator_grid_area(), mercator_map_jacob(), mercator_vect_rot(), and rerth.

    + +
    +
    + +

    ◆ init_grib1()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_mercator_grid_mod::init_grib1 (class(ip_mercator_grid), intent(inout) self,
    type(grib1_descriptor), intent(in) g1_desc 
    )
    +
    +private
    +
    + +

    Initializes a mercator grid given a grib1_descriptor object.

    +
    Parameters
    + + + +
    [in,out]selfip_mercator_grid object.
    [in]g1_descGRIB1 descriptor.
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    +
    + +

    Definition at line 52 of file ip_mercator_grid_mod.F90.

    + +

    References ip_constants_mod::dpr.

    + +
    +
    + +

    ◆ init_grib2()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_mercator_grid_mod::init_grib2 (class(ip_mercator_grid), intent(inout) self,
    type(grib2_descriptor), intent(in) g2_desc 
    )
    +
    +private
    +
    + +

    Init GRIB2.

    +
    Parameters
    + + + +
    [in,out]selfip_mercator_grid object.
    [in]g2_descGRIB2 descriptor.
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    +
    + +

    Definition at line 100 of file ip_mercator_grid_mod.F90.

    + +
    +
    + +

    ◆ mercator_grid_area()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_mercator_grid_mod::mercator_grid_area (real, intent(in) RLAT,
    real, intent(out) AREA 
    )
    +
    +private
    +
    + +

    Grid box area for mercator cylindrical grids.

    +

    This subprogram computes the grid box area for a mercator cylindrical grid.

    +

    +Program History Log

    + + + + + + + +
    Date Programmer Comments
    2015-01-21 gayno initial version
    2015-09-17 gayno rename as "mercator_grid_area"
    +
    Parameters
    + + + +
    [in]rlatlatitude of grid point in degrees (real)
    [out]areaarea weights in m**2 (real)
    +
    +
    +
    Author
    Gayno
    +
    Date
    2015-01-21
    + +

    Definition at line 387 of file ip_mercator_grid_mod.F90.

    + +

    References dlon, dphi, and rerth.

    + +

    Referenced by gdswzd_mercator().

    + +
    +
    + +

    ◆ mercator_map_jacob()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_mercator_grid_mod::mercator_map_jacob (real, intent(in) RLAT,
    real, intent(out) XLON,
    real, intent(out) XLAT,
    real, intent(out) YLON,
    real, intent(out) YLAT 
    )
    +
    +private
    +
    + +

    Map jacobians for mercator cylindrical grids.

    +

    This subprogram computes the map jacobians for a mercator cylindrical grid.

    +

    +Program History Log

    + + + + + + + +
    Date Programmer Comments
    2015-01-21 gayno initial version
    2015-09-17 gayno rename as "mercator_map_jacob"
    +
    Parameters
    + + + + + + +
    [in]rlatlatitude in degrees (real)
    [out]xlondx/dlon in 1/degrees (real)
    [out]xlatdx/dlat in 1/degrees (real)
    [out]ylondy/dlon in 1/degrees (real)
    [out]ylatdy/dlat in 1/degrees (real)
    +
    +
    +
    Author
    Gayno
    +
    Date
    2015-01-21
    + +

    Definition at line 359 of file ip_mercator_grid_mod.F90.

    + +

    References dlon, and dphi.

    + +

    Referenced by gdswzd_mercator().

    + +
    +
    + +

    ◆ mercator_vect_rot()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_mercator_grid_mod::mercator_vect_rot (real, intent(out) CROT,
    real, intent(out) SROT 
    )
    +
    +private
    +
    + +

    Vector rotation fields for mercator cylindrical grids.

    +

    This subprogram computes the vector rotation sines and cosines for a mercator cylindrical grid.

    +

    +Program History Log

    + + + + + + + +
    Date Programmer Comments
    2015-01-21 gayno initial version
    2015-09-17 gayno rename as "mercator_vect_rot".
    +
    Parameters
    + + + +
    [in]crotclockwise vector rotation cosines (real)
    [in]srotclockwise vector rotation sines (real) (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    +
    +
    +
    Author
    Gayno
    +
    Date
    2015-01-21
    + +

    Definition at line 331 of file ip_mercator_grid_mod.F90.

    + +

    Referenced by gdswzd_mercator().

    + +
    +
    +

    Variable Documentation

    + +

    ◆ dlon

    + +
    +
    + + + + + +
    + + + + +
    real ip_mercator_grid_mod::dlon
    +
    +private
    +
    + +

    Longitudinal direction grid length.

    + +

    Definition at line 40 of file ip_mercator_grid_mod.F90.

    + +

    Referenced by gdswzd_mercator(), mercator_grid_area(), and mercator_map_jacob().

    + +
    +
    + +

    ◆ dphi

    + +
    +
    + + + + + +
    + + + + +
    real ip_mercator_grid_mod::dphi
    +
    +private
    +
    + +

    Latitudinal direction grid length.

    + +

    Definition at line 41 of file ip_mercator_grid_mod.F90.

    + +

    Referenced by gdswzd_mercator(), mercator_grid_area(), and mercator_map_jacob().

    + +
    +
    + +

    ◆ rerth

    + +
    +
    + + + + + +
    + + + + +
    real ip_mercator_grid_mod::rerth
    +
    +private
    +
    + +

    Radius of the Earth.

    + +

    Definition at line 42 of file ip_mercator_grid_mod.F90.

    + +

    Referenced by gdswzd_mercator(), and mercator_grid_area().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespaceip__mercator__grid__mod.js b/ver-5.1.0/namespaceip__mercator__grid__mod.js new file mode 100644 index 00000000..c9942f70 --- /dev/null +++ b/ver-5.1.0/namespaceip__mercator__grid__mod.js @@ -0,0 +1,13 @@ +var namespaceip__mercator__grid__mod = +[ + [ "ip_mercator_grid", "structip__mercator__grid__mod_1_1ip__mercator__grid.html", "structip__mercator__grid__mod_1_1ip__mercator__grid" ], + [ "gdswzd_mercator", "namespaceip__mercator__grid__mod.html#acc39017fa51125972ab8e755e16d339e", null ], + [ "init_grib1", "namespaceip__mercator__grid__mod.html#a4125dba8b09e9b69933e224b00f4758d", null ], + [ "init_grib2", "namespaceip__mercator__grid__mod.html#aad3b6fef6ee74b8df984c0159ff29c82", null ], + [ "mercator_grid_area", "namespaceip__mercator__grid__mod.html#a952ab9add18587c4dbe54699feb8eafd", null ], + [ "mercator_map_jacob", "namespaceip__mercator__grid__mod.html#ab93a0a6ae8c5f5056abece1dcffdc57a", null ], + [ "mercator_vect_rot", "namespaceip__mercator__grid__mod.html#aea5e18faf7a18bf8d06c87ccb11f3e17", null ], + [ "dlon", "namespaceip__mercator__grid__mod.html#a14e1cb3f8c05d2de49d2aa8dc69d104f", null ], + [ "dphi", "namespaceip__mercator__grid__mod.html#a156e638e2d1b93e388d674462ac3f732", null ], + [ "rerth", "namespaceip__mercator__grid__mod.html#adaa27c5d41ee24185b6d020420ce9419", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/namespaceip__mod.html b/ver-5.1.0/namespaceip__mod.html new file mode 100644 index 00000000..018f82bc --- /dev/null +++ b/ver-5.1.0/namespaceip__mod.html @@ -0,0 +1,104 @@ + + + + + + + +NCEPLIBS-ip: ip_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ip_mod Module Reference
    +
    +
    + +

    Top-level module for the ip library which re-exports public routines such as ipolates, ipolatev, and gdswzd. +More...

    +

    Detailed Description

    +

    Top-level module for the ip library which re-exports public routines such as ipolates, ipolatev, and gdswzd.

    +
    +
    + + + + diff --git a/ver-5.1.0/namespaceip__polar__stereo__grid__mod.html b/ver-5.1.0/namespaceip__polar__stereo__grid__mod.html new file mode 100644 index 00000000..930a7b4b --- /dev/null +++ b/ver-5.1.0/namespaceip__polar__stereo__grid__mod.html @@ -0,0 +1,918 @@ + + + + + + + +NCEPLIBS-ip: ip_polar_stereo_grid_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_polar_stereo_grid_mod Module Reference
    +
    +
    + +

    GDS wizard for polar stereographic azimuthal. +More...

    + + + + +

    +Data Types

    type  ip_polar_stereo_grid
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine gdswzd_polar_stereo (self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     GDS wizard for polar stereographic azimuthal. More...
     
    subroutine init_grib1 (self, g1_desc)
     Initializes a polar stereographic grid given a grib1_descriptor object. More...
     
    subroutine init_grib2 (self, g2_desc)
     Initializes a polar stereographic grid given a grib2_descriptor object. More...
     
    subroutine polar_stereo_grid_area (RLAT, DR2, AREA)
     Grid box area for polar stereographic grids. More...
     
    subroutine polar_stereo_map_jacob (RLON, RLAT, DR2, XLON, XLAT, YLON, YLAT)
     Map jacobians for polar stereographic grids. More...
     
    subroutine polar_stereo_vect_rot (RLON, CROT, SROT)
     Vector rotation fields for polar stereographic grids. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Variables

    real de2
     Square of DE. More...
     
    real dxs
     Local copy of dxs. More...
     
    real dys
     Local copy of dys. More...
     
    real e2
     Eccentricity squared. More...
     
    real h
     Local copy of h. More...
     
    integer irot
     Local copy of irot. More...
     
    real orient
     Local copy of orient. More...
     
    real rerth
     Radius of the Earth. More...
     
    +

    Detailed Description

    +

    GDS wizard for polar stereographic azimuthal.

    +

    Octet numbers refer to [GRIB2 - GRID DEFINITION TEMPLATE 3.20 Polar stereographic projection](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_temp3-20.shtml).

    +
    Author
    Iredell
    +
    Date
    96-04-10
    +

    Function/Subroutine Documentation

    + +

    ◆ gdswzd_polar_stereo()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_polar_stereo_grid_mod::gdswzd_polar_stereo (class(ip_polar_stereo_grid), intent(in) self,
    integer, intent(in) IOPT,
    integer, intent(in) NPTS,
    real, intent(in) FILL,
    real, dimension(npts), intent(inout) XPTS,
    real, dimension(npts), intent(inout) YPTS,
    real, dimension(npts), intent(inout) RLON,
    real, dimension(npts), intent(inout) RLAT,
    integer, intent(out) NRET,
    real, dimension(npts), intent(out), optional CROT,
    real, dimension(npts), intent(out), optional SROT,
    real, dimension(npts), intent(out), optional XLON,
    real, dimension(npts), intent(out), optional XLAT,
    real, dimension(npts), intent(out), optional YLON,
    real, dimension(npts), intent(out), optional YLAT,
    real, dimension(npts), intent(out), optional AREA 
    )
    +
    +private
    +
    + +

    GDS wizard for polar stereographic azimuthal.

    +

    This subprogram decodes the grib 2 grid definition template (passed in integer form as decoded by the ncep g2 library) and returns one of the following:

      +
    • (iopt=+1) earth coordinates of selected grid coordinates
    • +
    • (iopt=-1) grid coordinates of selected earth coordinates
    • +
    +

    Works for polar stereographic azimuthal projections.

    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values.

    +

    The actual number of valid points computed is returned too.

    +

    Optionally, the vector rotations, map jacobians, and grid box areas may be returned as well. Routine works for both spherical and elliptical earths with the exception of the map jacobians and grid box areas, which are only computed for spherical earths.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present. To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present. to compute the grid box areas, the optional argument 'area' must be present.

    +

    +Program History Log

    + + + + + + + + + + + + + + + +
    Date Programmer Comments
    96-04-10 iredell Initial
    97-10-20 iredell include map options
    09-05-13 gayno ensure area always positive
    2015-01-21 gayno merger of gdswiz05 and gdswzd05. make crot,sort,xlon,xlat,ylon,ylat and area optional arguments. make part of a module. move vector rotation, map jacobian and grid box area computations to separate subroutines. include option for elliptical earths.
    2015-07-13 gayno convert to grib 2. replace grib 1 kgds array with grib 2 grid definition template array. rename routine.
    2018-07-20 wesley add threading.
    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]selfgrid
    [in]ioptoption flag
      +
    • 1 to compute earth coords of selected grid coords
    • +
    • -1 to compute grid coords of selected earth coords
    • +
    +
    [in]nptsmaximum number of coordinates
    [in]fillfill value to set invalid output data (must be impossible value; suggested value: -9999.)
    [in,out]xpts(npts) grid x point coordinates if iopt>0
    [in,out]ypts(npts) grid y point coordinates if iopt>0
    [in,out]rlon(npts) earth longitudes in degrees e if iopt<0 (acceptable range: -360. to 360.)
    [in,out]rlat(npts) earth latitudes in degrees n if iopt<0 (acceptable range: -90. to 90.)
    [out]nretnumber of valid points computed
    [out]crotoptional (npts) clockwise vector rotation cosines
    [out]srotoptional (npts) clockwise vector rotation sines (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlonoptional (npts) dx/dlon in 1/degrees
    [out]xlatoptional (npts) dx/dlat in 1/degrees
    [out]ylonoptional (npts) dy/dlon in 1/degrees
    [out]ylatoptional (npts) dy/dlat in 1/degrees
    [out]areaoptional (npts) area weights in m**2 (proportional to the square of the map factor)
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    + +

    Definition at line 239 of file ip_polar_stereo_grid_mod.F90.

    + +

    References de2, dxs, dys, e2, h, irot, orient, polar_stereo_grid_area(), polar_stereo_map_jacob(), polar_stereo_vect_rot(), and rerth.

    + +
    +
    + +

    ◆ init_grib1()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_polar_stereo_grid_mod::init_grib1 (class(ip_polar_stereo_grid), intent(inout) self,
    type(grib1_descriptor), intent(in) g1_desc 
    )
    +
    +private
    +
    + +

    Initializes a polar stereographic grid given a grib1_descriptor object.

    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g1_descA grib1_descriptor
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    +
    + +

    Definition at line 63 of file ip_polar_stereo_grid_mod.F90.

    + +

    References ip_constants_mod::dpr, ip_constants_mod::e2_wgs84, and ip_constants_mod::rerth_wgs84.

    + +
    +
    + +

    ◆ init_grib2()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_polar_stereo_grid_mod::init_grib2 (class(ip_polar_stereo_grid), intent(inout) self,
    type(grib2_descriptor), intent(in) g2_desc 
    )
    +
    +private
    +
    + +

    Initializes a polar stereographic grid given a grib2_descriptor object.

    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g2_descA grib2_descriptor
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    +
    + +

    Definition at line 128 of file ip_polar_stereo_grid_mod.F90.

    + +
    +
    + +

    ◆ polar_stereo_grid_area()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_polar_stereo_grid_mod::polar_stereo_grid_area (real, intent(in) RLAT,
    real, intent(in) DR2,
    real, intent(out) AREA 
    )
    +
    +private
    +
    + +

    Grid box area for polar stereographic grids.

    +

    This subprogram computes the grid box area for a polar stereographic azimuthal grid (spherical earth).

    +

    +Program History Log

    + + + + + + + + + +
    Date Programmer Comments
    2015-01-21 gayno initial version
    2015-09-17 gayno rename as "polar_stereo_grid_area".
    2018-07-20 wesley pass in dr2 for threading.
    +
    Parameters
    + + + + +
    [in]rlatlatitude of grid point in degrees (real)
    [in]dr2squared distance from pole (real)
    [out]areaarea weights in m**2 (real)
    +
    +
    +
    Author
    Gayno
    +
    Date
    2015-01-21
    + +

    Definition at line 563 of file ip_polar_stereo_grid_mod.F90.

    + +

    References de2, dxs, dys, and rerth.

    + +

    Referenced by gdswzd_polar_stereo().

    + +
    +
    + +

    ◆ polar_stereo_map_jacob()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_polar_stereo_grid_mod::polar_stereo_map_jacob (real, intent(in) RLON,
    real, intent(in) RLAT,
    real, intent(in) DR2,
    real, intent(out) XLON,
    real, intent(out) XLAT,
    real, intent(out) YLON,
    real, intent(out) YLAT 
    )
    +
    +private
    +
    + +

    Map jacobians for polar stereographic grids.

    +

    This subprogram computes the map jacobians for a polar stereographic azimuthal grid (spherical earth).

    +

    +Program History Log

    + + + + + + + + + +
    Date Programmer Comments
    2015-01-21 gayno initial version
    2015-09-17 gayno rename as "polar_stereo_map_jacob"
    2018-07-20 wesley pass in dr2 for threading.
    +
    Parameters
    + + + + + + + + +
    [in]rlonlongitude in degrees (real)
    [in]rlatlatitude in degrees (real)
    [in]dr2squared distance from pole (real)
    [out]xlondx/dlon in 1/degrees (real)
    [out]xlatdx/dlat in 1/degrees (real)
    [out]ylondy/dlon in 1/degrees (real)
    [out]ylatdy/dlat in 1/degrees (real)
    +
    +
    +
    Author
    Gayno
    +
    Date
    2015-01-21
    + +

    Definition at line 520 of file ip_polar_stereo_grid_mod.F90.

    + +

    References de2, dxs, dys, h, and orient.

    + +

    Referenced by gdswzd_polar_stereo().

    + +
    +
    + +

    ◆ polar_stereo_vect_rot()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_polar_stereo_grid_mod::polar_stereo_vect_rot (real, intent(in) RLON,
    real, intent(out) CROT,
    real, intent(out) SROT 
    )
    +
    +private
    +
    + +

    Vector rotation fields for polar stereographic grids.

    +

    This subprogram computes the vector rotation sines and cosines for a polar stereographic azimuthal grid.

    +

    +Program History Log

    + + + + + + + +
    Date Programmer Comments
    2015-01-21 gayno initial version
    2015-09-17 gayno rename as "polar_stereo_vect_rot"
    +
    Parameters
    + + + + +
    [in]rlongrid point longitude in degrees (real)
    [in]crotclockwise vector rotation cosines (real)
    [in]srotclockwise vector rotation sines (real) (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    +
    +
    +
    Author
    Gayno
    +
    Date
    2015-01-21
    + +

    Definition at line 482 of file ip_polar_stereo_grid_mod.F90.

    + +

    References h, irot, and orient.

    + +

    Referenced by gdswzd_polar_stereo().

    + +
    +
    +

    Variable Documentation

    + +

    ◆ de2

    + +
    +
    + + + + + +
    + + + + +
    real ip_polar_stereo_grid_mod::de2
    +
    +private
    +
    + +

    Square of DE.

    + +

    Definition at line 45 of file ip_polar_stereo_grid_mod.F90.

    + +

    Referenced by gdswzd_polar_stereo(), polar_stereo_grid_area(), and polar_stereo_map_jacob().

    + +
    +
    + +

    ◆ dxs

    + +
    +
    + + + + + +
    + + + + +
    real ip_polar_stereo_grid_mod::dxs
    +
    +private
    +
    + +

    Local copy of dxs.

    + +

    Definition at line 46 of file ip_polar_stereo_grid_mod.F90.

    + +

    Referenced by gdswzd_polar_stereo(), polar_stereo_grid_area(), and polar_stereo_map_jacob().

    + +
    +
    + +

    ◆ dys

    + +
    +
    + + + + + +
    + + + + +
    real ip_polar_stereo_grid_mod::dys
    +
    +private
    +
    + +

    Local copy of dys.

    + +

    Definition at line 47 of file ip_polar_stereo_grid_mod.F90.

    + +

    Referenced by gdswzd_polar_stereo(), polar_stereo_grid_area(), and polar_stereo_map_jacob().

    + +
    +
    + +

    ◆ e2

    + +
    +
    + + + + + +
    + + + + +
    real ip_polar_stereo_grid_mod::e2
    +
    +private
    +
    + +

    Eccentricity squared.

    + +

    Definition at line 48 of file ip_polar_stereo_grid_mod.F90.

    + +

    Referenced by gdswzd_polar_stereo().

    + +
    +
    + +

    ◆ h

    + +
    +
    + + + + + +
    + + + + +
    real ip_polar_stereo_grid_mod::h
    +
    +private
    +
    + +

    Local copy of h.

    + +

    Definition at line 50 of file ip_polar_stereo_grid_mod.F90.

    + +

    Referenced by gdswzd_polar_stereo(), polar_stereo_map_jacob(), and polar_stereo_vect_rot().

    + +
    +
    + +

    ◆ irot

    + +
    +
    + + + + + +
    + + + + +
    integer ip_polar_stereo_grid_mod::irot
    +
    +private
    +
    + +

    Local copy of irot.

    + +

    Definition at line 44 of file ip_polar_stereo_grid_mod.F90.

    + +

    Referenced by gdswzd_polar_stereo(), and polar_stereo_vect_rot().

    + +
    +
    + +

    ◆ orient

    + +
    +
    + + + + + +
    + + + + +
    real ip_polar_stereo_grid_mod::orient
    +
    +private
    +
    + +

    Local copy of orient.

    + +

    Definition at line 51 of file ip_polar_stereo_grid_mod.F90.

    + +

    Referenced by gdswzd_polar_stereo(), polar_stereo_map_jacob(), and polar_stereo_vect_rot().

    + +
    +
    + +

    ◆ rerth

    + +
    +
    + + + + + +
    + + + + +
    real ip_polar_stereo_grid_mod::rerth
    +
    +private
    +
    + +

    Radius of the Earth.

    + +

    Definition at line 49 of file ip_polar_stereo_grid_mod.F90.

    + +

    Referenced by gdswzd_polar_stereo(), and polar_stereo_grid_area().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespaceip__polar__stereo__grid__mod.js b/ver-5.1.0/namespaceip__polar__stereo__grid__mod.js new file mode 100644 index 00000000..bef9f38c --- /dev/null +++ b/ver-5.1.0/namespaceip__polar__stereo__grid__mod.js @@ -0,0 +1,18 @@ +var namespaceip__polar__stereo__grid__mod = +[ + [ "ip_polar_stereo_grid", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid" ], + [ "gdswzd_polar_stereo", "namespaceip__polar__stereo__grid__mod.html#ae2694d90ab514a131e083dfba3b173c5", null ], + [ "init_grib1", "namespaceip__polar__stereo__grid__mod.html#a6ed76f58f30993cd7be84b7e03cf4d6f", null ], + [ "init_grib2", "namespaceip__polar__stereo__grid__mod.html#a5210b986366b503683ae966519d501e7", null ], + [ "polar_stereo_grid_area", "namespaceip__polar__stereo__grid__mod.html#a2a2e0854e5c129e320924a811cbd08e2", null ], + [ "polar_stereo_map_jacob", "namespaceip__polar__stereo__grid__mod.html#a386933f7e52c348b9d742df423e0e223", null ], + [ "polar_stereo_vect_rot", "namespaceip__polar__stereo__grid__mod.html#abe4d416201e986421a8e325a9b00e462", null ], + [ "de2", "namespaceip__polar__stereo__grid__mod.html#a605d287e34e60f553521a5de2da22962", null ], + [ "dxs", "namespaceip__polar__stereo__grid__mod.html#acf60181f89954e2ff31b08bb1b345354", null ], + [ "dys", "namespaceip__polar__stereo__grid__mod.html#aea7950530d06d9c59ff61bf706df0a0f", null ], + [ "e2", "namespaceip__polar__stereo__grid__mod.html#abf3a34d9bb00c39dac5225798aea4d5b", null ], + [ "h", "namespaceip__polar__stereo__grid__mod.html#a5a63da5168a1432a1af42c0b668f0645", null ], + [ "irot", "namespaceip__polar__stereo__grid__mod.html#a1269037aaecd12e75e17d8aac8e20c8c", null ], + [ "orient", "namespaceip__polar__stereo__grid__mod.html#aa4a88f48d7b78cfdfc54754882195d18", null ], + [ "rerth", "namespaceip__polar__stereo__grid__mod.html#a3315b2efb5cb9aebc0b2cb2773aa20b5", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/namespaceip__rot__equid__cylind__egrid__mod.html b/ver-5.1.0/namespaceip__rot__equid__cylind__egrid__mod.html new file mode 100644 index 00000000..a160a866 --- /dev/null +++ b/ver-5.1.0/namespaceip__rot__equid__cylind__egrid__mod.html @@ -0,0 +1,1105 @@ + + + + + + + +NCEPLIBS-ip: ip_rot_equid_cylind_egrid_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_rot_equid_cylind_egrid_mod Module Reference
    +
    +
    + +

    Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grid E. +More...

    + + + + +

    +Data Types

    type  ip_rot_equid_cylind_egrid
     
    + + + + + + + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine gdswzd_rot_equid_cylind_egrid (self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for rotated equidistant cylindrical grids. More...
     
    subroutine init_grib1 (self, g1_desc)
     Initializes a rotated equidistant cylindrical grid given a grib1_descriptor object. More...
     
    subroutine init_grib2 (self, g2_desc)
     Initializes a rotated equidistant cylindrical grid given a grib2_descriptor object. More...
     
    subroutine rot_equid_cylind_egrid_error (IOPT, FILL, RLAT, RLON, XPTS, YPTS, NPTS)
     Error handler. More...
     
    subroutine rot_equid_cylind_egrid_grid_area (FILL, AREA)
     Computes the grid box area for a rotated equidistant cylindrical grid. More...
     
    subroutine rot_equid_cylind_egrid_map_jacob (FILL, RLON, XLON, XLAT, YLON, YLAT)
     Computes the map jacobians for a rotated equidistant cylindrical grid. More...
     
    subroutine rot_equid_cylind_egrid_vect_rot (RLON, CROT, SROT)
     Computes the vector rotation sines and cosines for a rotated equidistant cylindrical grid. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Variables

    real(kind=kdclat
     Cosine of the latitude. More...
     
    real(kind=kdclat0
     Local copy of clat0. More...
     
    real(kind=kdclatr
     Cosine of the rotated latitude. More...
     
    real(kind=kdclon
     Cosine of the difference between rlon and rlon0. More...
     
    real(kind=kddlats
     Local copy of dlats. More...
     
    real(kind=kddlons
     Local copy of dlons. More...
     
    integer irot
     Local copy of irot. More...
     
    integer, parameter kd = real64
     Kind of reals. More...
     
    real(kind=kdrerth
     Radius of the Earth. More...
     
    real(kind=kdrlon0
     Local copy of rlon0. More...
     
    real(kind=kdslat
     Sine of the latitude. More...
     
    real(kind=kdslat0
     Local copy of slat0. More...
     
    real(kind=kdslatr
     Sine of the rotated latitude. More...
     
    +

    Detailed Description

    +

    Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grid E.

    +

    (To handle the A through D grids, see ip_rot_equid_cylind_grid_mod).

    +

    The E stagger is a bit odd because the 'wind' points shift by half a grid box in each row. That makes the logic tricky. So the routine does its computations by rotating the grid by 45 degrees.

    +

    See more info about Awakawa grids.

    +

    Octet numbers refer to GRIB2 - GRID DEFINITION TEMPLATE 3.1 Rotate Latitude/Longitude.

    +
    Author
    George Gayno, Mark Iredell, Kyle Gerheiser
    +
    Date
    July 2021
    +

    Function/Subroutine Documentation

    + +

    ◆ gdswzd_rot_equid_cylind_egrid()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_rot_equid_cylind_egrid_mod::gdswzd_rot_equid_cylind_egrid (class(ip_rot_equid_cylind_egrid), intent(in) self,
    integer, intent(in) IOPT,
    integer, intent(in) NPTS,
    real, intent(in) FILL,
    real, dimension(npts), intent(inout) XPTS,
    real, dimension(npts), intent(inout) YPTS,
    real, dimension(npts), intent(inout) RLON,
    real, dimension(npts), intent(inout) RLAT,
    integer, intent(out) NRET,
    real, dimension(npts), intent(out), optional CROT,
    real, dimension(npts), intent(out), optional SROT,
    real, dimension(npts), intent(out), optional XLON,
    real, dimension(npts), intent(out), optional XLAT,
    real, dimension(npts), intent(out), optional YLON,
    real, dimension(npts), intent(out), optional YLAT,
    real, dimension(npts), intent(out), optional AREA 
    )
    +
    +private
    +
    + +

    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for rotated equidistant cylindrical grids.

    +

    Works for e-staggered rotated equidistant cylindrical projections. The scan mode determines whether this is an "h" or "v" grid.

    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values.

    +

    The actual number of valid points computed is returned too. Optionally, the vector rotations, the map jacobians and the grid box areas may be returned as well.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present.

    +

    To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present.

    +

    To compute the grid box areas, the optional argument 'area' must be present.

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]selfThe grid object gdswzd was called on.
    [in]ioptoption flag
      +
    • +1 to compute earth coords of selected grid coords.
    • +
    • -1 o compute grid coords of selected earth coords.
    • +
    +
    [in]nptsMaximum number of coordinates.
    [in]fillFill value to set invalid output data. Must be impossible value; suggested value: -9999.
    [in,out]xptsGrid x point coordinates if iopt>0.
    [in,out]yptsGrid y point coordinates if iopt>0.
    [in,out]rlonEarth longitudes in degrees e if iopt<0 (Acceptable range: -360. to 360.)
    [in,out]rlatEarth latitudes in degrees n if iopt<0 (Acceptable range: -90. to 90.)
    [out]nretNumber of valid points computed.
    [out]crotOptional clockwise vector rotation cosines.
    [out]srotOptional clockwise vector rotation sines.
    [out]xlonOptional dx/dlon in 1/degrees.
    [out]xlatOptional dx/dlat in 1/degrees.
    [out]ylonOptional dy/dlon in 1/degrees.
    [out]ylatOptional dy/dlat in 1/degrees.
    [out]areaOptional area weights in m**2.
    +
    +
    +
    Author
    Mark Iredell, George Gayno, Kyle Gerheiser
    +
    Date
    Jan 2015
    + +

    Definition at line 267 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +

    References clat, clat0, clatr, clon, dlats, dlons, irot, rerth, rlon0, rot_equid_cylind_egrid_error(), rot_equid_cylind_egrid_grid_area(), rot_equid_cylind_egrid_map_jacob(), rot_equid_cylind_egrid_vect_rot(), slat, slat0, and slatr.

    + +
    +
    + +

    ◆ init_grib1()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_rot_equid_cylind_egrid_mod::init_grib1 (class(ip_rot_equid_cylind_egrid), intent(inout) self,
    type(grib1_descriptor), intent(in) g1_desc 
    )
    +
    +private
    +
    + +

    Initializes a rotated equidistant cylindrical grid given a grib1_descriptor object.

    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g1_descA grib1_descriptor
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 86 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +

    References ip_constants_mod::dpr.

    + +
    +
    + +

    ◆ init_grib2()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_rot_equid_cylind_egrid_mod::init_grib2 (class(ip_rot_equid_cylind_egrid), intent(inout) self,
    type(grib2_descriptor), intent(in) g2_desc 
    )
    +
    +private
    +
    + +

    Initializes a rotated equidistant cylindrical grid given a grib2_descriptor object.

    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g2_descA grib2_descriptor
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 163 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +
    +
    + +

    ◆ rot_equid_cylind_egrid_error()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_rot_equid_cylind_egrid_mod::rot_equid_cylind_egrid_error (integer, intent(in) IOPT,
    real, intent(in) FILL,
    real, dimension(npts), intent(out) RLAT,
    real, dimension(npts), intent(out) RLON,
    real, dimension(npts), intent(out) XPTS,
    real, dimension(npts), intent(out) YPTS,
    integer, intent(in) NPTS 
    )
    +
    +private
    +
    + +

    Error handler.

    +

    UPON AN ERROR, THIS SUBPROGRAM ASSIGNS A "FILL" VALUE TO THE OUTPUT FIELDS.

    +

    +Program History Log

    + + + + + + + +
    Date Programmer Comments
    2015-07-13 GAYNO Initial version
    2015-09-17 GAYNO Rename as "rot_equid_cylind_egrid_error"
    +
    Parameters
    + + + + + + + + +
    [in]ioptoption flag
      +
    • 1 to compute earth coords of selected grid coords
    • +
    • -1 to compute grid coords of selected earth coords
    • +
    +
    [in]fillfill value to set invalid output data (must be impossible value; suggested value: -9999.)
    [out]rlat(npts) earth latitudes in degrees n if iopt<0
    [out]rlon(npts) earth longitudes in degrees e if iopt<0
    [out]xpts(npts) grid x point coordinates if iopt>0
    [out]ypts(npts) grid y point coordinates if iopt>0
    [in]nptsmaximum number of coordinates
    +
    +
    +
    Author
    GAYNO
    +
    Date
    2015-07-13
    + +

    Definition at line 482 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +

    Referenced by gdswzd_rot_equid_cylind_egrid().

    + +
    +
    + +

    ◆ rot_equid_cylind_egrid_grid_area()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_rot_equid_cylind_egrid_mod::rot_equid_cylind_egrid_grid_area (real, intent(in) FILL,
    real, intent(out) AREA 
    )
    +
    +private
    +
    + +

    Computes the grid box area for a rotated equidistant cylindrical grid.

    +
    Parameters
    + + + +
    [in]fillFill value for undefined points.
    [out]areaArea weights in m^2.
    +
    +
    +
    Author
    George Gayno
    +
    Date
    Jan 2015
    + +

    Definition at line 587 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +

    References clatr, dlats, dlons, and rerth.

    + +

    Referenced by gdswzd_rot_equid_cylind_egrid().

    + +
    +
    + +

    ◆ rot_equid_cylind_egrid_map_jacob()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_rot_equid_cylind_egrid_mod::rot_equid_cylind_egrid_map_jacob (real, intent(in) FILL,
    real, intent(in) RLON,
    real, intent(out) XLON,
    real, intent(out) XLAT,
    real, intent(out) YLON,
    real, intent(out) YLAT 
    )
    +
    +private
    +
    + +

    Computes the map jacobians for a rotated equidistant cylindrical grid.

    +
    Parameters
    + + + + + + + +
    [in]fillFill value for undefined points.
    [in]rlonLongitude in degrees.
    [out]xlondx/dlon in 1/degrees.
    [out]xlatdx/dlat in 1/degrees.
    [out]ylondy/dlon in 1/degrees.
    [out]ylatdy/dlat in 1/degrees.
    +
    +
    +
    Author
    George Gayno
    +
    Date
    Jan 2015
    + +

    Definition at line 549 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +

    References clat, clat0, clatr, clon, dlats, dlons, rlon0, slat, and slat0.

    + +

    Referenced by gdswzd_rot_equid_cylind_egrid().

    + +
    +
    + +

    ◆ rot_equid_cylind_egrid_vect_rot()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_rot_equid_cylind_egrid_mod::rot_equid_cylind_egrid_vect_rot (real, intent(in) RLON,
    real, intent(out) CROT,
    real, intent(out) SROT 
    )
    +
    +private
    +
    + +

    Computes the vector rotation sines and cosines for a rotated equidistant cylindrical grid.

    +
    Parameters
    + + + + +
    [in]rlonLongitude in degrees.
    [out]crotClockwise vector rotation cosines.
    [out]srotClockwise vector rotation sines.
    +
    +
    +
    Note
    ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    +
    Author
    George Gayno
    +
    Date
    Jan 2015
    + +

    Definition at line 514 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +

    References clat, clat0, clatr, clon, irot, rlon0, slat, slat0, and slatr.

    + +

    Referenced by gdswzd_rot_equid_cylind_egrid().

    + +
    +
    +

    Variable Documentation

    + +

    ◆ clat

    + +
    +
    + + + + + +
    + + + + +
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::clat
    +
    +private
    +
    + +

    Cosine of the latitude.

    + +

    Definition at line 64 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +

    Referenced by gdswzd_rot_equid_cylind_egrid(), rot_equid_cylind_egrid_map_jacob(), and rot_equid_cylind_egrid_vect_rot().

    + +
    +
    + +

    ◆ clat0

    + +
    +
    + + + + + +
    + + + + +
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::clat0
    +
    +private
    +
    +
    + +

    ◆ clatr

    + +
    +
    + + + + + +
    + + + + +
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::clatr
    +
    +private
    +
    +
    + +

    ◆ clon

    + +
    +
    + + + + + +
    + + + + +
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::clon
    +
    +private
    +
    + +

    Cosine of the difference between rlon and rlon0.

    + +

    Definition at line 67 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +

    Referenced by gdswzd_rot_equid_cylind_egrid(), rot_equid_cylind_egrid_map_jacob(), and rot_equid_cylind_egrid_vect_rot().

    + +
    +
    + +

    ◆ dlats

    + +
    +
    + + + + + +
    + + + + +
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::dlats
    +
    +private
    +
    +
    + +

    ◆ dlons

    + +
    +
    + + + + + +
    + + + + +
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::dlons
    +
    +private
    +
    +
    + +

    ◆ irot

    + +
    +
    + + + + + +
    + + + + +
    integer ip_rot_equid_cylind_egrid_mod::irot
    +
    +private
    +
    + +

    Local copy of irot.

    + +

    Definition at line 62 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +

    Referenced by gdswzd_rot_equid_cylind_egrid(), and rot_equid_cylind_egrid_vect_rot().

    + +
    +
    + +

    ◆ kd

    + +
    +
    + + + + + +
    + + + + +
    integer, parameter ip_rot_equid_cylind_egrid_mod::kd = real64
    +
    +private
    +
    + +

    Kind of reals.

    + +

    Definition at line 35 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +
    +
    + +

    ◆ rerth

    + +
    +
    + + + + + +
    + + + + +
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::rerth
    +
    +private
    +
    + +

    Radius of the Earth.

    + +

    Definition at line 70 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +

    Referenced by gdswzd_rot_equid_cylind_egrid(), and rot_equid_cylind_egrid_grid_area().

    + +
    +
    + +

    ◆ rlon0

    + +
    +
    + + + + + +
    + + + + +
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::rlon0
    +
    +private
    +
    +
    + +

    ◆ slat

    + +
    +
    + + + + + +
    + + + + +
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::slat
    +
    +private
    +
    + +

    Sine of the latitude.

    + +

    Definition at line 72 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +

    Referenced by gdswzd_rot_equid_cylind_egrid(), rot_equid_cylind_egrid_map_jacob(), and rot_equid_cylind_egrid_vect_rot().

    + +
    +
    + +

    ◆ slat0

    + +
    +
    + + + + + +
    + + + + +
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::slat0
    +
    +private
    +
    +
    + +

    ◆ slatr

    + +
    +
    + + + + + +
    + + + + +
    real(kind=kd) ip_rot_equid_cylind_egrid_mod::slatr
    +
    +private
    +
    + +

    Sine of the rotated latitude.

    + +

    Definition at line 74 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +

    Referenced by gdswzd_rot_equid_cylind_egrid(), and rot_equid_cylind_egrid_vect_rot().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespaceip__rot__equid__cylind__egrid__mod.js b/ver-5.1.0/namespaceip__rot__equid__cylind__egrid__mod.js new file mode 100644 index 00000000..36361095 --- /dev/null +++ b/ver-5.1.0/namespaceip__rot__equid__cylind__egrid__mod.js @@ -0,0 +1,24 @@ +var namespaceip__rot__equid__cylind__egrid__mod = +[ + [ "ip_rot_equid_cylind_egrid", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid" ], + [ "gdswzd_rot_equid_cylind_egrid", "namespaceip__rot__equid__cylind__egrid__mod.html#a9ad11a599fc0bdc4a9ece86a3b1cc399", null ], + [ "init_grib1", "namespaceip__rot__equid__cylind__egrid__mod.html#aa65616b97df9c89893161ff802e16eab", null ], + [ "init_grib2", "namespaceip__rot__equid__cylind__egrid__mod.html#af3cbc17f27800bc67135feacb2c1c3e0", null ], + [ "rot_equid_cylind_egrid_error", "namespaceip__rot__equid__cylind__egrid__mod.html#a69d4e473a1a276b855d37518dc6f1d48", null ], + [ "rot_equid_cylind_egrid_grid_area", "namespaceip__rot__equid__cylind__egrid__mod.html#a4e6c3a758f9a6474d3e499fabeac0640", null ], + [ "rot_equid_cylind_egrid_map_jacob", "namespaceip__rot__equid__cylind__egrid__mod.html#a45b87f77888d428ca0f551edae8da94e", null ], + [ "rot_equid_cylind_egrid_vect_rot", "namespaceip__rot__equid__cylind__egrid__mod.html#a9ac1f76f515981c464e8391d8c941888", null ], + [ "clat", "namespaceip__rot__equid__cylind__egrid__mod.html#aac1018f3ca1b7ad4b5d33f245678d416", null ], + [ "clat0", "namespaceip__rot__equid__cylind__egrid__mod.html#a83649d02b55d6252d59514aec4eb3142", null ], + [ "clatr", "namespaceip__rot__equid__cylind__egrid__mod.html#aad4e673a94976b2b5a9bfad9de9e6e30", null ], + [ "clon", "namespaceip__rot__equid__cylind__egrid__mod.html#a557d49c609fc8c5c564a3a5f10174eec", null ], + [ "dlats", "namespaceip__rot__equid__cylind__egrid__mod.html#a0b2faca2325b413e1f3207778d4c4c68", null ], + [ "dlons", "namespaceip__rot__equid__cylind__egrid__mod.html#af04f8a1044f4d9a7e0d13d38887adcbc", null ], + [ "irot", "namespaceip__rot__equid__cylind__egrid__mod.html#a93ed996cf2dc9569e356256ec946b571", null ], + [ "kd", "namespaceip__rot__equid__cylind__egrid__mod.html#a50497d277c347a2991b0e34e85f1787e", null ], + [ "rerth", "namespaceip__rot__equid__cylind__egrid__mod.html#aed7a425f4d300fe14ac1b48d76378edb", null ], + [ "rlon0", "namespaceip__rot__equid__cylind__egrid__mod.html#a134acf8ab7f40ff49ce8e03daad900e6", null ], + [ "slat", "namespaceip__rot__equid__cylind__egrid__mod.html#ae1f8503816477fb685fbadc7a9e50f0b", null ], + [ "slat0", "namespaceip__rot__equid__cylind__egrid__mod.html#a72199c827ab3218b7f2aba35ad30b94d", null ], + [ "slatr", "namespaceip__rot__equid__cylind__egrid__mod.html#a4ccccb64d3e7236d8cac19c279aab900", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/namespaceip__rot__equid__cylind__grid__mod.html b/ver-5.1.0/namespaceip__rot__equid__cylind__grid__mod.html new file mode 100644 index 00000000..c07f5a15 --- /dev/null +++ b/ver-5.1.0/namespaceip__rot__equid__cylind__grid__mod.html @@ -0,0 +1,1176 @@ + + + + + + + +NCEPLIBS-ip: ip_rot_equid_cylind_grid_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_rot_equid_cylind_grid_mod Module Reference
    +
    +
    + +

    Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grids A through D. +More...

    + + + + +

    +Data Types

    type  ip_rot_equid_cylind_grid
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine gdswzd_rot_equid_cylind (self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     GDS wizard for rotated equidistant cylindrical. More...
     
    subroutine init_grib1 (self, g1_desc)
     Initializes a Rotated equidistant cylindrical grid given a grib1_descriptor object. More...
     
    subroutine init_grib2 (self, g2_desc)
     Initializes a Rotated equidistant cylindrical grid given a grib2_descriptor object. More...
     
    subroutine init_grib2_default (self, g2_desc)
     Initializes a Rotated equidistant cylindrical grid given a grib2_descriptor object. More...
     
    subroutine init_grib2_ncep_post (self, g2_desc)
     Initializes a Rotated equidistant cylindrical grid given a grib2_descriptor object. More...
     
    subroutine rot_equid_cylind_error (IOPT, FILL, RLAT, RLON, XPTS, YPTS, NPTS)
     Error handler. More...
     
    subroutine rot_equid_cylind_grid_area (CLATR, FILL, AREA)
     Grid box area for rotated equidistant cylindrical grids - non "e" stagger. More...
     
    subroutine rot_equid_cylind_map_jacob (FILL, RLON, CLATR, CLAT, SLAT, CLON, XLON, XLAT, YLON, YLAT)
     Map jacobians for rotated equidistant cylindrical grids - non "e" stagger. More...
     
    subroutine rot_equid_cylind_vect_rot (RLON, CLATR, SLATR, CLAT, SLAT, CLON, CROT, SROT)
     Vector rotation fields for rotated equidistant cylindrical grids - non "e" stagger. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Variables

    real(kind=kdclat0
     Local copy of clat0. More...
     
    real(kind=kddlats
     Local copy of dlats. More...
     
    real(kind=kddlons
     Local copy of dlons. More...
     
    integer irot
     Local copy of irot. More...
     
    integer, parameter kd = real64
     Fortran kind for reals. More...
     
    real(kind=kdrerth
     Radius of the Earth. More...
     
    real(kind=kdrlon0
     Local copy of rlon0. More...
     
    real(kind=kdslat0
     Local copy of slat0. More...
     
    +

    Detailed Description

    +

    Rotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grids A through D.

    +

    (To handle the E grid, see ip_rot_equid_cylind_egrid_mod).

    +

    See more info about Awakawa grids.

    +

    Octet numbers refer to GRIB2 - GRID DEFINITION TEMPLATE 3.1 Rotate Latitude/Longitude.

    +
    Author
    Gayno
    +
    Date
    2007-NOV-15
    +

    Function/Subroutine Documentation

    + +

    ◆ gdswzd_rot_equid_cylind()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_rot_equid_cylind_grid_mod::gdswzd_rot_equid_cylind (class(ip_rot_equid_cylind_grid), intent(in) self,
    integer, intent(in) IOPT,
    integer, intent(in) NPTS,
    real, intent(in) FILL,
    real, dimension(npts), intent(inout) XPTS,
    real, dimension(npts), intent(inout) YPTS,
    real, dimension(npts), intent(inout) RLON,
    real, dimension(npts), intent(inout) RLAT,
    integer, intent(out) NRET,
    real, dimension(npts), intent(out), optional CROT,
    real, dimension(npts), intent(out), optional SROT,
    real, dimension(npts), intent(out), optional XLON,
    real, dimension(npts), intent(out), optional XLAT,
    real, dimension(npts), intent(out), optional YLON,
    real, dimension(npts), intent(out), optional YLAT,
    real, dimension(npts), intent(out), optional AREA 
    )
    +
    +private
    +
    + +

    GDS wizard for rotated equidistant cylindrical.

    +

    This subprogram decodes the grib 2 grid definition template (passed in integer form as decoded by the ncep g2 library) and returns one of the following:

      +
    • (iopt=+1) earth coordinates of selected grid coordinates
    • +
    • (iopt=-1) grid coordinates of selected earth coordinates
    • +
    +

    Works for non-"e" staggered rotated equidistant cylindrical projections. the scan mode (section 3, octet 72, bits 5-6) determine whether this is an "h" or "v" grid.

    +

    If the selected coordinates are more than one gridpoint beyond the the edges of the grid domain, then the relevant output elements are set to fill values. The actual number of valid points computed is returned too.

    +

    Optionally, the vector rotations, the map jacobians and the grid box areas may be returned as well.

    +

    To compute the vector rotations, the optional arguments 'srot' and 'crot' must be present. To compute the map jacobians, the optional arguments 'xlon', 'xlat', 'ylon', 'ylat' must be present. To compute the grid box areas, the optional argument 'area' must be present.

    +

    +Program History Log

    + + + + + + + + + + + +
    Date Programmer Comments
    2010-jan-15 gayno based on routines gdswzdcb and gdswzdca
    2015-jan-21 gayno merger of gdswizcd and gdswzdcd. make crot,sort,xlon,xlat,ylon,ylat and area optional arguments. make part of a module. move vector rotation, map jacobian and grid box area computations to separate subroutines.
    2015-jul-13 gayno convert to grib 2. replace grib 1 kgds array with grib 2 grid definition template array. rename as "gdswzd_rot_equid_cylind."
    2018-07-20 wesley add threads.
    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]selfModule reference.
    [in]ioptinteger option flag
      +
    • 1 to compute earth coords of selected grid coords
    • +
    • -1 to compute grid coords of selected earth coords
    • +
    +
    [in]nptsinteger maximum number of coordinates
    [in]fillreal fill value to set invalid output data (must be impossible value; suggested value: -9999.)
    [in,out]xptsreal (npts) grid x point coordinates if iopt>0
    [in,out]yptsreal (npts) grid y point coordinates if iopt>0
    [in,out]rlonreal (npts) earth longitudes in degrees e if iopt<0 (acceptable range: -360. to 360.)
    [in,out]rlatreal (npts) earth latitudes in degrees n if iopt<0 (acceptable range: -90. to 90.)
    [out]nretinteger number of valid points computed
    [out]crotreal, optional (npts) clockwise vector rotation cosines
    [out]srotreal, optional (npts) clockwise vector rotation sines (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]xlonreal, optional (npts) dx/dlon in 1/degrees
    [out]xlatreal, optional (npts) dx/dlat in 1/degrees
    [out]ylonreal, optional (npts) dy/dlon in 1/degrees
    [out]ylatreal, optional (npts) dy/dlat in 1/degrees
    [out]areareal, optional (npts) area weights in m**2
    +
    +
    +
    Author
    Gayno
    +
    Date
    2007-NOV-15
    + +

    Definition at line 362 of file ip_rot_equid_cylind_grid_mod.F90.

    + +

    References clat0, dlats, dlons, irot, rerth, rlon0, rot_equid_cylind_error(), rot_equid_cylind_grid_area(), rot_equid_cylind_map_jacob(), rot_equid_cylind_vect_rot(), and slat0.

    + +
    +
    + +

    ◆ init_grib1()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_rot_equid_cylind_grid_mod::init_grib1 (class(ip_rot_equid_cylind_grid), intent(inout) self,
    type(grib1_descriptor), intent(in) g1_desc 
    )
    +
    +private
    +
    + +

    Initializes a Rotated equidistant cylindrical grid given a grib1_descriptor object.

    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g1_descA grib1_descriptor
    +
    +
    +
    Author
    Gayno
    +
    Date
    2007-NOV-15
    + +

    Definition at line 73 of file ip_rot_equid_cylind_grid_mod.F90.

    + +

    References ip_constants_mod::dpr.

    + +
    +
    + +

    ◆ init_grib2()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_rot_equid_cylind_grid_mod::init_grib2 (class(ip_rot_equid_cylind_grid), intent(inout) self,
    type(grib2_descriptor), intent(in) g2_desc 
    )
    +
    +private
    +
    + +

    Initializes a Rotated equidistant cylindrical grid given a grib2_descriptor object.

    +

    Call 'use_ncep_post_arakawa()' before using this subroutine to use ncep_post-compatible grid definition.

    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g2_descA grib2_descriptor
    +
    +
    +
    Author
    Alex Richert
    +
    Date
    2024-MAY-20
    + +

    Definition at line 140 of file ip_rot_equid_cylind_grid_mod.F90.

    + +

    References init_grib2_default(), and init_grib2_ncep_post().

    + +
    +
    + +

    ◆ init_grib2_default()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_rot_equid_cylind_grid_mod::init_grib2_default (class(ip_rot_equid_cylind_grid), intent(inout) self,
    type(grib2_descriptor), intent(in) g2_desc 
    )
    +
    +private
    +
    + +

    Initializes a Rotated equidistant cylindrical grid given a grib2_descriptor object.

    +

    Uses template definitions consistent with WMO standards.

    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g2_descA grib2_descriptor
    +
    +
    +
    Author
    Gayno
    +
    Date
    2007-NOV-15
    + +

    Definition at line 160 of file ip_rot_equid_cylind_grid_mod.F90.

    + +

    Referenced by init_grib2().

    + +
    +
    + +

    ◆ init_grib2_ncep_post()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_rot_equid_cylind_grid_mod::init_grib2_ncep_post (class(ip_rot_equid_cylind_grid), intent(inout) self,
    type(grib2_descriptor), intent(in) g2_desc 
    )
    +
    +private
    +
    + +

    Initializes a Rotated equidistant cylindrical grid given a grib2_descriptor object.

    +

    Uses template number definitions in a manner compatible with wgrib2 and ncep_post, which is based on grib1.

    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g2_descA grib2_descriptor
    +
    +
    +
    Author
    Alex Richert, George Gayno
    +
    Date
    2024-MAY-20
    + +

    Definition at line 227 of file ip_rot_equid_cylind_grid_mod.F90.

    + +

    Referenced by init_grib2().

    + +
    +
    + +

    ◆ rot_equid_cylind_error()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_rot_equid_cylind_grid_mod::rot_equid_cylind_error (integer, intent(in) IOPT,
    real, intent(in) FILL,
    real, dimension(npts), intent(out) RLAT,
    real, dimension(npts), intent(out) RLON,
    real, dimension(npts), intent(out) XPTS,
    real, dimension(npts), intent(out) YPTS,
    integer, intent(in) NPTS 
    )
    +
    +private
    +
    + +

    Error handler.

    +

    Upon an error, this subprogram assigns a "fill" value to the output fields.

    +
    Parameters
    + + + + + + + + +
    [in]ioptinteger option flag
      +
    • +1 to compute earth coords of selected grid coords
    • +
    • -1 to compute grid coords of selected earth coords
    • +
    +
    [in]fillreal fill value to set invalid output data (must be impossible value; suggested value: -9999.)
    [out]rlatreal (npts) earth latitudes in degrees n if iopt<0
    [out]rlonreal (npts) earth longitudes in degrees e if iopt<0
    [out]xptsreal (npts) grid x point coordinates if iopt>0
    [out]yptsreal (npts) grid y point coordinates if iopt>0
    [in]nptsinteger maximum number of coordinates
    +
    +
    +
    Author
    Gayno
    +
    Date
    2015-07-13
    + +

    Definition at line 568 of file ip_rot_equid_cylind_grid_mod.F90.

    + +

    Referenced by gdswzd_rot_equid_cylind().

    + +
    +
    + +

    ◆ rot_equid_cylind_grid_area()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_rot_equid_cylind_grid_mod::rot_equid_cylind_grid_area (real(kind=kd), intent(in) CLATR,
    real, intent(in) FILL,
    real, intent(out) AREA 
    )
    +
    +private
    +
    + +

    Grid box area for rotated equidistant cylindrical grids - non "e" stagger.

    +

    This subprogram computes the grid box area for a rotated equidistant cylindrical grid - non "e" stagger.

    +

    +Program History Log

    + + + + + + + + + +
    Date Programmer Comments
    2015-01-21 Gayno initial version
    2015-07-19 gayno rename as "rot_equid_cylind_grid_area."
    2018-07-20 wesley pass in clatr for threading
    +
    Parameters
    + + + + +
    [in]clatrcosine of unrotated latitude (real)
    [in]fillfill value for undefined points (real)
    [out]areaarea weights in m**2 (real)
    +
    +
    +
    Author
    Gayno
    +
    Date
    2015-01-21
    + +

    Definition at line 709 of file ip_rot_equid_cylind_grid_mod.F90.

    + +

    References dlats, dlons, and rerth.

    + +

    Referenced by gdswzd_rot_equid_cylind().

    + +
    +
    + +

    ◆ rot_equid_cylind_map_jacob()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_rot_equid_cylind_grid_mod::rot_equid_cylind_map_jacob (real, intent(in) FILL,
    real, intent(in) RLON,
    real(kind=kd), intent(in) CLATR,
    real(kind=kd), intent(in) CLAT,
    real(kind=kd), intent(in) SLAT,
    real(kind=kd), intent(in) CLON,
    real, intent(out) XLON,
    real, intent(out) XLAT,
    real, intent(out) YLON,
    real, intent(out) YLAT 
    )
    +
    +private
    +
    + +

    Map jacobians for rotated equidistant cylindrical grids - non "e" stagger.

    +

    This subprogram computes the map jacobians for a rotated equidistant cylindrical grid - non "e" stagger.

    +

    +Program History Log

    + + + + + + + + + +
    Date Programmer Comments
    2015-01-21 gayno initial version
    2015-09-17 gayno rename as "rot_equid_cylind_map_jacob".
    2018-07-20 wesley pass in clatr, clat, slat, clon to allow threading.
    +
    Parameters
    + + + + + + + + + + + +
    [in]fillfill value for undefined points (real)
    [in]rlonlongitude in degrees (real)
    [in]clatrcosine of unrotated latitude (real)
    [in]clatcosine of latitude (real)
    [in]slatsine of latitude (real)
    [in]cloncosine of latitude (real)
    [out]xlondx/dlon in 1/degrees (real)
    [out]xlatdx/dlat in 1/degrees (real)
    [out]ylondy/dlon in 1/degrees (real)
    [out]ylatdy/dlat in 1/degrees (real)
    +
    +
    +
    Author
    Gayno
    +
    Date
    2015-01-21
    + +

    Definition at line 664 of file ip_rot_equid_cylind_grid_mod.F90.

    + +

    References clat0, dlats, dlons, rlon0, and slat0.

    + +

    Referenced by gdswzd_rot_equid_cylind().

    + +
    +
    + +

    ◆ rot_equid_cylind_vect_rot()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_rot_equid_cylind_grid_mod::rot_equid_cylind_vect_rot (real, intent(in) RLON,
    real(kind=kd), intent(in) CLATR,
    real(kind=kd), intent(in) SLATR,
    real(kind=kd), intent(in) CLAT,
    real(kind=kd), intent(in) SLAT,
    real(kind=kd), intent(in) CLON,
    real, intent(out) CROT,
    real, intent(out) SROT 
    )
    +
    +private
    +
    + +

    Vector rotation fields for rotated equidistant cylindrical grids - non "e" stagger.

    +

    This subprogram computes the vector rotation sines and cosines for a rotated equidistant cylindrical grid - non "e" stagger.

    +

    +Program History Log

    + + + + + + + + + +
    Date Programmer Comments
    2015-01-21 gayno initial version
    2015-07-19 gayno rename as "rot_equid_cylind_vect_rot."
    2018-07-20 wesley pass in clatr, slatr, clat, slat, clon for threading.
    +
    Parameters
    + + + + + + + + + +
    [in]rlonlongitude in degrees (real)
    [in]clatrcosine of rotated latitude (real)
    [in]slatrsine of rotated latitude (real)
    [in]clatcosine of latitude (real)
    [in]slatsine of latitude (real)
    [in]cloncosine of longitude (real)
    [out]crotclockwise vector rotation cosines (real)
    [out]srotclockwise vector rotation sines (real) (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    +
    +
    +
    Author
    Gayno
    +
    Date
    2015-01-21
    + +

    Definition at line 613 of file ip_rot_equid_cylind_grid_mod.F90.

    + +

    References clat0, irot, rlon0, and slat0.

    + +

    Referenced by gdswzd_rot_equid_cylind().

    + +
    +
    +

    Variable Documentation

    + +

    ◆ clat0

    + +
    +
    + + + + + +
    + + + + +
    real(kind=kd) ip_rot_equid_cylind_grid_mod::clat0
    +
    +private
    +
    + +

    Local copy of clat0.

    + +

    Definition at line 58 of file ip_rot_equid_cylind_grid_mod.F90.

    + +

    Referenced by gdswzd_rot_equid_cylind(), rot_equid_cylind_map_jacob(), and rot_equid_cylind_vect_rot().

    + +
    +
    + +

    ◆ dlats

    + +
    +
    + + + + + +
    + + + + +
    real(kind=kd) ip_rot_equid_cylind_grid_mod::dlats
    +
    +private
    +
    + +

    Local copy of dlats.

    + +

    Definition at line 59 of file ip_rot_equid_cylind_grid_mod.F90.

    + +

    Referenced by gdswzd_rot_equid_cylind(), rot_equid_cylind_grid_area(), and rot_equid_cylind_map_jacob().

    + +
    +
    + +

    ◆ dlons

    + +
    +
    + + + + + +
    + + + + +
    real(kind=kd) ip_rot_equid_cylind_grid_mod::dlons
    +
    +private
    +
    + +

    Local copy of dlons.

    + +

    Definition at line 60 of file ip_rot_equid_cylind_grid_mod.F90.

    + +

    Referenced by gdswzd_rot_equid_cylind(), rot_equid_cylind_grid_area(), and rot_equid_cylind_map_jacob().

    + +
    +
    + +

    ◆ irot

    + +
    +
    + + + + + +
    + + + + +
    integer ip_rot_equid_cylind_grid_mod::irot
    +
    +private
    +
    + +

    Local copy of irot.

    + +

    Definition at line 56 of file ip_rot_equid_cylind_grid_mod.F90.

    + +

    Referenced by gdswzd_rot_equid_cylind(), and rot_equid_cylind_vect_rot().

    + +
    +
    + +

    ◆ kd

    + +
    +
    + + + + + +
    + + + + +
    integer, parameter ip_rot_equid_cylind_grid_mod::kd = real64
    +
    +private
    +
    + +

    Fortran kind for reals.

    + +

    Definition at line 30 of file ip_rot_equid_cylind_grid_mod.F90.

    + +
    +
    + +

    ◆ rerth

    + +
    +
    + + + + + +
    + + + + +
    real(kind=kd) ip_rot_equid_cylind_grid_mod::rerth
    +
    +private
    +
    + +

    Radius of the Earth.

    + +

    Definition at line 57 of file ip_rot_equid_cylind_grid_mod.F90.

    + +

    Referenced by gdswzd_rot_equid_cylind(), and rot_equid_cylind_grid_area().

    + +
    +
    + +

    ◆ rlon0

    + +
    +
    + + + + + +
    + + + + +
    real(kind=kd) ip_rot_equid_cylind_grid_mod::rlon0
    +
    +private
    +
    + +

    Local copy of rlon0.

    + +

    Definition at line 61 of file ip_rot_equid_cylind_grid_mod.F90.

    + +

    Referenced by gdswzd_rot_equid_cylind(), rot_equid_cylind_map_jacob(), and rot_equid_cylind_vect_rot().

    + +
    +
    + +

    ◆ slat0

    + +
    +
    + + + + + +
    + + + + +
    real(kind=kd) ip_rot_equid_cylind_grid_mod::slat0
    +
    +private
    +
    + +

    Local copy of slat0.

    + +

    Definition at line 62 of file ip_rot_equid_cylind_grid_mod.F90.

    + +

    Referenced by gdswzd_rot_equid_cylind(), rot_equid_cylind_map_jacob(), and rot_equid_cylind_vect_rot().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespaceip__rot__equid__cylind__grid__mod.js b/ver-5.1.0/namespaceip__rot__equid__cylind__grid__mod.js new file mode 100644 index 00000000..8d250b58 --- /dev/null +++ b/ver-5.1.0/namespaceip__rot__equid__cylind__grid__mod.js @@ -0,0 +1,21 @@ +var namespaceip__rot__equid__cylind__grid__mod = +[ + [ "ip_rot_equid_cylind_grid", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid" ], + [ "gdswzd_rot_equid_cylind", "namespaceip__rot__equid__cylind__grid__mod.html#a55c153201e15205d3f75e4ffb717cc0b", null ], + [ "init_grib1", "namespaceip__rot__equid__cylind__grid__mod.html#acb27dfdc6f03dea897d509910365afee", null ], + [ "init_grib2", "namespaceip__rot__equid__cylind__grid__mod.html#add3c6c1dad5748b452d291df6619867d", null ], + [ "init_grib2_default", "namespaceip__rot__equid__cylind__grid__mod.html#a9ade5de892a935c3b62c1860b719ce74", null ], + [ "init_grib2_ncep_post", "namespaceip__rot__equid__cylind__grid__mod.html#a74abf723e815f9ff196e6d0174fd449b", null ], + [ "rot_equid_cylind_error", "namespaceip__rot__equid__cylind__grid__mod.html#a1cc09c83f9a3815d8c5f8ed2f239f53f", null ], + [ "rot_equid_cylind_grid_area", "namespaceip__rot__equid__cylind__grid__mod.html#ad8f1133eb6809705c15337134eafe9fd", null ], + [ "rot_equid_cylind_map_jacob", "namespaceip__rot__equid__cylind__grid__mod.html#a985f1dc1a20444cef706d4bb20e0841b", null ], + [ "rot_equid_cylind_vect_rot", "namespaceip__rot__equid__cylind__grid__mod.html#a3de472bfc18740a7d985f560f3541c10", null ], + [ "clat0", "namespaceip__rot__equid__cylind__grid__mod.html#afeb699d0eaa8d157277e93fe8e8c5852", null ], + [ "dlats", "namespaceip__rot__equid__cylind__grid__mod.html#ab43075e39d4e2dde4110e608931a392d", null ], + [ "dlons", "namespaceip__rot__equid__cylind__grid__mod.html#aa0cf7bb2dd8be1239ae38c7220d29702", null ], + [ "irot", "namespaceip__rot__equid__cylind__grid__mod.html#abb0c2acdbd71f0c07ffaf9db54ce06c1", null ], + [ "kd", "namespaceip__rot__equid__cylind__grid__mod.html#af5dea0592cccce2de1c5c6a92d42cfd6", null ], + [ "rerth", "namespaceip__rot__equid__cylind__grid__mod.html#ae08318392106d174ab36cf7dc05c570b", null ], + [ "rlon0", "namespaceip__rot__equid__cylind__grid__mod.html#a620a55069afd33b301240533915387df", null ], + [ "slat0", "namespaceip__rot__equid__cylind__grid__mod.html#a64831f92d5306513987a98e97a32aea1", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/namespaceip__station__points__grid__mod.html b/ver-5.1.0/namespaceip__station__points__grid__mod.html new file mode 100644 index 00000000..d419adeb --- /dev/null +++ b/ver-5.1.0/namespaceip__station__points__grid__mod.html @@ -0,0 +1,375 @@ + + + + + + + +NCEPLIBS-ip: ip_station_points_grid_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_station_points_grid_mod Module Reference
    +
    +
    + +

    Interpolate gridded data to a series of station points. +More...

    + + + + +

    +Data Types

    type  ip_station_points_grid
     
    + + + + + + + + + + +

    +Functions/Subroutines

    subroutine gdswzd_station_points (self, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)
     Interpolate gridded data to a series of station points. More...
     
    subroutine init_grib1 (self, g1_desc)
     Initializes an IP Station grid given a grib1_descriptor object. More...
     
    subroutine init_grib2 (self, g2_desc)
     Initializes an IP Station grid given a grib2_descriptor object. More...
     
    +

    Detailed Description

    +

    Interpolate gridded data to a series of station points.

    +
    Author
    Kyle Gerheiser
    +
    Date
    7/21/21
    +

    Function/Subroutine Documentation

    + +

    ◆ gdswzd_station_points()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ip_station_points_grid_mod::gdswzd_station_points (class(ip_station_points_grid), intent(in) self,
    integer, intent(in) IOPT,
    integer, intent(in) NPTS,
    real, intent(in) FILL,
    real, dimension(npts), intent(inout) XPTS,
    real, dimension(npts), intent(inout) YPTS,
    real, dimension(npts), intent(inout) RLON,
    real, dimension(npts), intent(inout) RLAT,
    integer, intent(out) NRET,
    real, dimension(npts), intent(out), optional CROT,
    real, dimension(npts), intent(out), optional SROT,
    real, dimension(npts), intent(out), optional XLON,
    real, dimension(npts), intent(out), optional XLAT,
    real, dimension(npts), intent(out), optional YLON,
    real, dimension(npts), intent(out), optional YLAT,
    real, dimension(npts), intent(out), optional AREA 
    )
    +
    +private
    +
    + +

    Interpolate gridded data to a series of station points.

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]selfThe grid.
    [in]IOPTmust be minus 1 (return grid coordinates for selected earth coordinates).
    [in]NPTSMaximum number of points.
    [in]FILLFill value to set invalid output data. Must be impossible value; suggested value: -9999.
    [in,out]XPTSX point coordinates. Always output.
    [in,out]YPTSY point coordinates. Always output.
    [in,out]RLONPoint longitudes. Always input.
    [in,out]RLATPoint latitudes. Always input.
    [out]NRETNumber of valid points computed.
    [out]CROTNot used.
    [out]SROTNot used.
    [out]XLONNot used.
    [out]XLATNot used.
    [out]YLONNot used.
    [out]YLATNot used.
    [out]AREANot used.
    +
    +
    +
    Author
    Kyle Gerheiser
    +
    Date
    7/21/21
    +
    Author
    Eric Engle
    +
    Date
    5/4/23
    + +

    Definition at line 75 of file ip_station_points_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib1()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_station_points_grid_mod::init_grib1 (class(ip_station_points_grid), intent(inout) self,
    type(grib1_descriptor), intent(in) g1_desc 
    )
    +
    +private
    +
    + +

    Initializes an IP Station grid given a grib1_descriptor object.

    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g1_descA grib1_descriptor
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    + +

    Definition at line 37 of file ip_station_points_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib2()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    subroutine ip_station_points_grid_mod::init_grib2 (class(ip_station_points_grid), intent(inout) self,
    type(grib2_descriptor), intent(in) g2_desc 
    )
    +
    +private
    +
    + +

    Initializes an IP Station grid given a grib2_descriptor object.

    +
    Parameters
    + + + +
    [in,out]selfThe grid to initialize
    [in]g2_descA grib2_descriptor
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    + +

    Definition at line 48 of file ip_station_points_grid_mod.F90.

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespaceip__station__points__grid__mod.js b/ver-5.1.0/namespaceip__station__points__grid__mod.js new file mode 100644 index 00000000..3db1fca4 --- /dev/null +++ b/ver-5.1.0/namespaceip__station__points__grid__mod.js @@ -0,0 +1,7 @@ +var namespaceip__station__points__grid__mod = +[ + [ "ip_station_points_grid", "structip__station__points__grid__mod_1_1ip__station__points__grid.html", "structip__station__points__grid__mod_1_1ip__station__points__grid" ], + [ "gdswzd_station_points", "namespaceip__station__points__grid__mod.html#a8da297b45242279a497dbd7062a33197", null ], + [ "init_grib1", "namespaceip__station__points__grid__mod.html#a4b28ebf2b4fe826c96af69db28e0a1ff", null ], + [ "init_grib2", "namespaceip__station__points__grid__mod.html#ad17e6d245295803b62b146be984f874d", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/namespaceipolates__mod.html b/ver-5.1.0/namespaceipolates__mod.html new file mode 100644 index 00000000..d63c038c --- /dev/null +++ b/ver-5.1.0/namespaceipolates__mod.html @@ -0,0 +1,1358 @@ + + + + + + + +NCEPLIBS-ip: ipolates_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ipolates_mod Module Reference
    +
    +
    + +

    Top-level driver for scalar interpolation interpolation routine ipolates(). +More...

    + + + + +

    +Data Types

    interface  ipolates
     
    + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine, public ipolates_grib1 (ip, ipopt, kgdsi, kgdso, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
     This subprogram interpolates scalar field from any grid to any grid given a grib1 Grid Descriptor Section. More...
     
    subroutine, public ipolates_grib1_single_field (ip, ipopt, kgdsi, kgdso, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
     Special case of ipolates_grib1 when interpolating a single field. More...
     
    subroutine, public ipolates_grib2 (IP, IPOPT, IGDTNUMI, IGDTMPLI, IGDTLENI, IGDTNUMO, IGDTMPLO, IGDTLENO, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     This subprogram interpolates scalar field from any grid to any grid given a grib2 descriptor. More...
     
    subroutine, public ipolates_grib2_single_field (IP, IPOPT, IGDTNUMI, IGDTMPLI, IGDTLENI, IGDTNUMO, IGDTMPLO, IGDTLENO, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Special case of ipolates_grib2 when interpolating a single field. More...
     
    subroutine ipolates_grid (ip, ipopt, grid_in, grid_out, mi, mo, km, ibi, li, gi, no, rlat, rlon, ibo, lo, go, iret)
     Interpolates scalar fields between grids given ip_grid objects. More...
     
    +

    Detailed Description

    +

    Top-level driver for scalar interpolation interpolation routine ipolates().

    +

    ipolates() is overloaded with interfaces for GRIB1 and GRIB2 descriptors.

    +
    Author
    George Gayno, Mark Iredell, Kyle Gerheiser
    +

    Function/Subroutine Documentation

    + +

    ◆ ipolates_grib1()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine, public ipolates_mod::ipolates_grib1 (integer(c_int), intent(in) ip,
    integer(c_int), dimension(20), intent(in) ipopt,
    integer(c_int), dimension(200), intent(in) kgdsi,
    integer(c_int), dimension(200), intent(in) kgdso,
    integer(c_int), intent(in) mi,
    integer(c_int), intent(in) mo,
    integer(c_int), intent(in) km,
    integer(c_int), dimension(km), intent(in) ibi,
    logical(c_bool), dimension(mi,km), intent(in) li,
    real(c_double), dimension(mi,km), intent(in) gi,
    integer(c_int), intent(inout) no,
    real(c_double), dimension(mo), intent(inout) rlat,
    real(c_double), dimension(mo), intent(inout) rlon,
    integer(c_int), dimension(km), intent(out) ibo,
    logical(c_bool), dimension(mo,km), intent(out) lo,
    real(c_double), dimension(mo,km), intent(out) go,
    integer(c_int), intent(out) iret 
    )
    +
    + +

    This subprogram interpolates scalar field from any grid to any grid given a grib1 Grid Descriptor Section.

    +

    Only horizontal interpolation is performed. The following interpolation methods are possible:

      +
    • (ip=0) bilinear
    • +
    • (ip=1) bicubic
    • +
    • (ip=2) neighbor
    • +
    • (ip=3) budget
    • +
    • (ip=4) spectral
    • +
    • (ip=6) neighbor-budget
    • +
    +

    Some of these methods have interpolation options and/or restrictions on the input or output grids, both of which are documented more fully in their respective subprograms.

    +

    The grids are defined by their grid description sections (passed in integer form as decoded by subprogram w3fi63).

    +

    The current code recognizes the following projections:

      +
    • (kgds(1)=000) equidistant cylindrical
    • +
    • (kgds(1)=001) mercator cylindrical
    • +
    • (kgds(1)=003) lambert conformal conical
    • +
    • (kgds(1)=004) gaussian cylindrical
    • +
    • (kgds(1)=005) polar stereographic azimuthal
    • +
    • (kgds(1)=203) rotated equidistant cylindrical - e-stagger
    • +
    • (kgds(1)=205) rotated equidistant cylindrical - b-stagger
    • +
    +

    Where kgds could be either input kgdsi or output kgdso.

    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned.

    +

    On the other hand, the output can be a set of station points if kgdso(1)<0, in which case the number of points and their latitudes and longitudes must be input. for the budget approach, a subsection of the grid may be output by subtracting kgdso(1) from 255 and passing in the latitudes and longitudes of the points. Input bitmaps will be interpolated to output bitmaps.

    +

    Output bitmaps will also be created when the output grid extends outside of the domain of the input grid. the output field is set to 0 where the output bitmap is off.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + +
    ipInterpolation method
      +
    • ip = BILINEAR_INTERP_ID = 0 for bilinear
    • +
    • ip = BICUBIC_INTERP_ID = 1 for bicubic
    • +
    • ip = NEIGHBOR_INTERP_ID = 2 for neighbor;
    • +
    • ip = BUDGET_INTERP_ID = 3 for budget;
    • +
    • ip = SPECTRAL_INTERP_ID = 4 for spectral;
    • +
    • ip = NEIGHBOR_BUDGET_INTERP_ID = 6 for neighbor-budget
    • +
    +
    ipoptInterpolation options
      +
    • ip=0 (bilinear): (No options)
    • +
    • ip=1 Cbicubic): constraint option
    • +
    • ip=2 (neighbor): (No options)
    • +
    • ip=3 (budget): Number in radius, radius weights, search radius
    • +
    • ip=4 (spectral): Spectral shape, spectral truncation
    • +
    • ip=6 (neighbor-budget): Number in radius, radius weights ...)
    • +
    +
    [in]kgdsiInput gds parameters as decoded by w3fi63.
    [in]kgdsoOutput gds parameters.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if respective ibi(k)=1).
    [in]giInput fields to interpolate.
    [out]noNumber of output points (only if kgdso(1)<0).
    [out]rlatOutput latitudes in degrees (if kgdso(1)<0).
    [out]rlonOutput longitudes in degrees (if kgdso(1)<0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]goOutput fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 1 Unrecognized interpolation method.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 1x Invalid bicubic method parameters.
    • +
    • 3x Invalid budget method parameters.
    • +
    • 4x Invalid spectral method parameters.
    • +
    +
    +
    +
    +
    Author
    Mark Iredell, Kyle Gerheiser
    + +

    Definition at line 293 of file ipolates.F90.

    + +
    +
    + +

    ◆ ipolates_grib1_single_field()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine, public ipolates_mod::ipolates_grib1_single_field (integer(c_int), intent(in) ip,
    integer(c_int), dimension(20), intent(in) ipopt,
    integer(c_int), dimension(200), intent(in) kgdsi,
    integer(c_int), dimension(200), intent(in) kgdso,
    integer(c_int), intent(in) mi,
    integer(c_int), intent(in) mo,
    integer(c_int), intent(in) km,
    integer(c_int), intent(in) ibi,
    logical(c_bool), dimension(mi), intent(in) li,
    real(c_double), dimension(mi), intent(in) gi,
    integer(c_int), intent(inout) no,
    real(c_double), dimension(mo), intent(inout) rlat,
    real(c_double), dimension(mo), intent(inout) rlon,
    integer(c_int), intent(out) ibo,
    logical(c_bool), dimension(mo), intent(out) lo,
    real(c_double), dimension(mo), intent(out) go,
    integer(c_int), intent(out) iret 
    )
    +
    + +

    Special case of ipolates_grib1 when interpolating a single field.

    +

    Removes the km dimension of input arrays so scalars can be passed to ibi/ibo.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + +
    ipInterpolation method
      +
    • ip = BILINEAR_INTERP_ID = 0 for bilinear
    • +
    • ip = BICUBIC_INTERP_ID = 1 for bicubic
    • +
    • ip = NEIGHBOR_INTERP_ID = 2 for neighbor;
    • +
    • ip = BUDGET_INTERP_ID = 3 for budget;
    • +
    • ip = SPECTRAL_INTERP_ID = 4 for spectral;
    • +
    • ip = NEIGHBOR_BUDGET_INTERP_ID = 6 for neighbor-budget
    • +
    +
    ipoptInterpolation options
      +
    • ip=0 (bilinear): (No options)
    • +
    • ip=1 Cbicubic): constraint option
    • +
    • ip=2 (neighbor): (No options)
    • +
    • ip=3 (budget): Number in radius, radius weights, search radius
    • +
    • ip=4 (spectral): Spectral shape, spectral truncation
    • +
    • ip=6 (neighbor-budget): Number in radius, radius weights ...)
    • +
    +
    [in]kgdsiInput gds parameters as decoded by w3fi63.
    [in]kgdsoOutput gds parameters.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if respective ibi(k)=1).
    [in]giInput fields to interpolate.
    [out]noNumber of output points (only if kgdso(1)<0).
    [out]rlatOutput latitudes in degrees (if kgdso(1)<0).
    [out]rlonOutput longitudes in degrees (if kgdso(1)<0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]goOutput fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 1 Unrecognized interpolation method.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 1x Invalid bicubic method parameters.
    • +
    • 3x Invalid budget method parameters.
    • +
    • 4x Invalid spectral method parameters.
    • +
    +
    +
    +
    +
    Date
    Jan 2022
    +
    Author
    Kyle Gerheiser
    + +

    Definition at line 158 of file ipolates.F90.

    + +
    +
    + +

    ◆ ipolates_grib2()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine, public ipolates_mod::ipolates_grib2 (integer(c_int), intent(in) IP,
    integer(c_int), dimension(20), intent(in) IPOPT,
    integer(c_int), intent(in) IGDTNUMI,
    integer(c_int), dimension(igdtleni), intent(in) IGDTMPLI,
    integer(c_int), intent(in) IGDTLENI,
    integer(c_int), intent(in) IGDTNUMO,
    integer(c_int), dimension(igdtleno), intent(in) IGDTMPLO,
    integer(c_int), intent(in) IGDTLENO,
    integer(c_int), intent(in) MI,
    integer(c_int), intent(in) MO,
    integer(c_int), intent(in) KM,
    integer(c_int), dimension(km), intent(in) IBI,
    logical(c_bool), dimension(mi,km), intent(in) LI,
    real(c_double), dimension(mi,km), intent(in) GI,
    integer(c_int), intent(out) NO,
    real(c_double), dimension(mo), intent(inout) RLAT,
    real(c_double), dimension(mo), intent(inout) RLON,
    integer(c_int), dimension(km), intent(out) IBO,
    logical(c_bool), dimension(mo,km), intent(out) LO,
    real(c_double), dimension(mo,km), intent(out) GO,
    integer(c_int), intent(out) IRET 
    )
    +
    + +

    This subprogram interpolates scalar field from any grid to any grid given a grib2 descriptor.

    +

    Wrapper for ipolates_grid which converts a grib1 descriptor into an ip_grid_descriptor, which is used to create an ip_grid. Only horizontal interpolation is performed.

    +

    The following interpolation methods are possible:

      +
    • (ip=0) bilinear
    • +
    • (ip=1) bicubic
    • +
    • (ip=2) neighbor
    • +
    • (ip=3) budget
    • +
    • (ip=4) spectral
    • +
    • (ip=6) neighbor-budget
    • +
    +

    Some of these methods have interpolation options and/or restrictions on the input or output grids, both of which are documented more fully in their respective subprograms.

    +

    Input and output grids are defined by their grib 2 grid definition template as decoded by the ncep g2 library. The current code recognizes the following projections, where "igdtnumi/o" is the grib 2 grid defintion template number for the input and output grids, respectively:

      +
    • (igdtnumi/o=00) equidistant cylindrical
    • +
    • (igdtnumi/o=01) rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • (igdtnumi/o=10) mercator cylindrical
    • +
    • (igdtnumi/o=20) polar stereographic azimuthal
    • +
    • (igdtnumi/o=30) lambert conformal conical
    • +
    • (igdtnumi/o=40) gaussian cylindrical
    • +
    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned.

    +

    On the other hand, data may be interpolated to a set of station points if "igdtnumo"<0 (or subtracted from 255 for the budget option), in which case the number of points and their latitudes and longitudes must be input.

    +

    Input bitmaps will be interpolated to output bitmaps. Output bitmaps will also be created when the output grid extends outside of the domain of the input grid.

    +

    The output field is set to 0 where the output bitmap is off.

    +
    Parameters
    + + + + + +
    [in]ipInterpolation method
      +
    • ip=0 for bilinear
    • +
    • ip=1 for bicubic
    • +
    • ip=2 for neighbor;
    • +
    • ip=3 for budget;
    • +
    • ip=4 for spectral;
    • +
    • ip=6 for neighbor-budget
    • +
    +
    [in]ipoptInterpolation options
      +
    • ip=0: (No options)
    • +
    • ip=1: Constraint option
    • +
    • ip=2: (No options)
    • +
    • ip=3: Number in radius, radius weights, search radius
    • +
    • ip=4: Spectral shape, spectral truncation
    • +
    • ip=6: Number in radius, radius weights ...)
    • +
    +
    [in]igdtnumiGrid definition template number for the input grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure:
      +
    • 00 - EQUIDISTANT CYLINDRICAL
    • +
    • 01 - Rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • 10 - MERCATOR CYCLINDRICAL
    • +
    • 20 - POLAR STEREOGRAPHIC AZIMUTHAL
    • +
    • 30 - LAMBERT CONFORMAL CONICAL
    • +
    • 40 - GAUSSIAN EQUIDISTANT CYCLINDRICAL
    • +
    +
    [in]igdtmpliGrid definition template array input grid. Corresponds to the gfldigdtmpl component of the NCEPLIBS-g2 gridmod data structure
    +
    +
    +

    Section 3 Info:

    +

    All map projections:

      +
    • (1): SHAPE OF EARTH, OCTET 15
    • +
    • (2): SCALE FACTOR OF SPHERICAL EARTH RADIUS, OCTET 16
    • +
    • (3): SCALED VALUE OF RADIUS OF SPHERICAL EARTH, OCTETS 17-20
    • +
    • (4): SCALE FACTOR OF MAJOR AXIS OF ELLIPTICAL EARTH, OCTET 21
    • +
    • (5): SCALED VALUE OF MAJOR AXIS OF ELLIPTICAL EARTH, OCTETS 22-25
    • +
    • (6): SCALE FACTOR OF MINOR AXIS OF ELLIPTICAL EARTH, OCTET 26
    • +
    • (7): SCALED VALUE OF MINOR AXIS OF ELLIPTICAL EARTH, OCTETS 27-30
    • +
    +

    Equidistant Cyclindrical:

      +
    • (8): NUMBER OF POINTS ALONG A PARALLEL, OCTS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG A MERIDIAN, OCTS 35-38
    • +
    • (10): BASIC ANGLE OF INITIAL PRODUCTION DOMAIN, OCTETS 39-42.
    • +
    • (11): SUBDIVISIONS OF BASIC ANGLE, OCTETS 43-46
    • +
    • (12): LATITUDE OF FIRST GRID POINT, OCTETS 47-50
    • +
    • (13): LONGITUDE OF FIRST GRID POINT, OCTETS 51-54
    • +
    • (14): RESOLUTION AND COMPONENT FLAGS, OCTET 55
    • +
    • (15): LATITUDE OF LAST GRID POINT, OCTETS 56-59
    • +
    • (16): LONGITUDE OF LAST GRID POINT, OCTETS 60-63
    • +
    • (17): I-DIRECTION INCREMENT, OCTETS 64-67
    • +
    • (18): J-DIRECTION INCREMENT, OCTETS 68-71
    • +
    • (19): SCANNING MODE, OCTET 72
    • +
    +

    Mercator Cyclindrical:

      +
    • (8): NUMBER OF POINTS ALONG A PARALLEL, OCTS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG A MERIDIAN, OCTS 35-38
    • +
    • (10): LATITUDE OF FIRST POINT, OCTETS 39-42
    • +
    • (11): LONGITUDE OF FIRST POINT, OCTETS 43-46
    • +
    • (12): RESOLUTION AND COMPONENT FLAGS, OCTET 47
    • +
    • (13): TANGENT LATITUDE, OCTETS 48-51
    • +
    • (14): LATITUDE OF LAST POINT, OCTETS 52-55
    • +
    • (15): LONGITUDE OF LAST POINT, OCTETS 56-59
    • +
    • (16): SCANNING MODE FLAGS, OCTET 60
    • +
    • (17): ORIENTATION OF GRID, OCTETS 61-64
    • +
    • (18): LONGITUDINAL GRID LENGTH, OCTETS 65-68
    • +
    • (19): LATITUDINAL GRID LENGTH, OCTETS 69-72
    • +
    +

    Lambert Conformal Conical:

      +
    • (8): NUMBER OF POINTS ALONG X-AXIS, OCTS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG Y-AXIS, OCTS 35-38
    • +
    • (10): LATITUDE OF FIRST POINT, OCTETS 39-42
    • +
    • (11): LONGITUDE OF FIRST POINT, OCTETS 43-46
    • +
    • (12): RESOLUTION OF COMPONENT FLAG, OCTET 47
    • +
    • (13): LATITUDE WHERE GRID LENGTHS SPECIFIED,OCTETS 48-51
    • +
    • (14): LONGITUDE OF MERIDIAN THAT IS PARALLEL TO Y-AXIS, OCTETS 52-55
    • +
    • (15): X-DIRECTION GRID LENGTH, OCTETS 56-59
    • +
    • (16): Y-DIRECTION GRID LENGTH, OCTETS 60-63
    • +
    • (17): PROJECTION CENTER FLAG, OCTET 64
    • +
    • (18): SCANNING MODE, OCTET 65
    • +
    • (19): FIRST TANGENT LATITUDE FROM POLE, OCTETS 66-69
    • +
    • (20): SECOND TANGENT LATITUDE FROM POLE, OCTETS 70-73
    • +
    • (21): LATITUDE OF SOUTH POLE OF PROJECTION, OCTETS 74-77
    • +
    • (22): LONGITUDE OF SOUTH POLE OF PROJECTION, OCTETS 78-81
    • +
    +

    Gaussian Cylindrical:

      +
    • (8): NUMBER OF POINTS ALONG A PARALLEL, OCTS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG A MERIDIAN, OCTS 35-38
    • +
    • (10): BASIC ANGLE OF INITIAL PRODUCTION DOMAIN, OCTETS 39-42
    • +
    • (11): SUBDIVISIONS OF BASIC ANGLE, OCTETS 43-46
    • +
    • (12): LATITUDE OF FIRST GRID POINT, OCTETS 47-50
    • +
    • (13): LONGITUDE OF FIRST GRID POINT, OCTETS 51-54
    • +
    • (14): RESOLUTION AND COMPONENT FLAGS, OCTET 55
    • +
    • (15): LATITUDE OF LAST GRID POINT, OCTETS 56-59
    • +
    • (16): LONGITUDE OF LAST GRID POINT, OCTETS 60-63
    • +
    • (17): I-DIRECTION INCREMENT, OCTETS 64-67
    • +
    • (18): NUMBER OF PARALLELS BETWEEN POLE AND EQUATOR, OCTETS 68-71
    • +
    • (19): SCANNING MODE, OCTET 72
    • +
    +

    Polar Stereographic Azimuthal:

      +
    • (8): NUMBER OF POINTS ALONG X-AXIS, OCTETS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG Y-AXIS, OCTETS 35-38
    • +
    • (10): LATITUDE OF FIRST GRID POINT, OCTETS 39-42
    • +
    • (11): LONGITUDE OF FIRST GRID POINT, OCTETS 43-46
    • +
    • (12): RESOLUTION AND COMPONENT FLAGS, OCTET 47
    • +
    • (13): TRUE LATITUDE, OCTETS 48-51
    • +
    • (14): ORIENTATION LONGITUDE, OCTETS 52-55
    • +
    • (15): X-DIRECTION GRID LENGTH, OCTETS 56-59
    • +
    • (16): Y-DIRECTION GRID LENGTH, OCTETS 60-63
    • +
    • (17): PROJECTION CENTER FLAG, OCTET 64
    • +
    • (18): SCANNING MODE FLAGS, OCTET 65
    • +
    +

    Rotated Equidistant Cyclindrical:

      +
    • (8): NUMBER OF POINTS ALONG A PARALLEL, OCTS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG A MERIDIAN, OCTS 35-38
    • +
    • (10): BASIC ANGLE OF INITIAL PRODUCTION DOMAIN, OCTETS 39-42
    • +
    • (11): SUBDIVISIONS OF BASIC ANGLE, OCTETS 43-46
    • +
    • (12): LATITUDE OF FIRST GRID POINT, OCTETS 47-50
    • +
    • (13): LONGITUDE OF FIRST GRID POINT, OCTETS 51-54
    • +
    • (14): RESOLUTION AND COMPONENT FLAGS, OCTET 55
    • +
    • (15): LATITUDE OF LAST GRID POINT, OCTETS 56-59
    • +
    • (16): LONGITUDE OF LAST GRID POINT, OCTETS 60-63
    • +
    • (17): I-DIRECTION INCREMENT, OCTETS 64-67
    • +
    • (18): J-DIRECTION INCREMENT, OCTETS 68-71
    • +
    • (19): SCANNING MODE, OCTET 72
    • +
    • (20): LATITUDE OF SOUTHERN POLE OF PROJECTION, OCTETS 73-76
    • +
    • (21): LONGITUDE OF SOUTHERN POLE OF PROJECTION, OCTETS 77-80
    • +
    • (22): ANGLE OF ROTATION OF PROJECTION, OCTS 81-84
    • +
    +
    Parameters
    + + + + + + + + + + + + + + + + + + +
    [in]igdtleniNumber of elements of the grid definition template array for the input grid. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]igdtnumoGrid definition template number for the output grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure. See "igdtnumi" for specific template definitions. Note: igdtnumo<0 means interpolate to random station points.
    [in]igdtmploGrid definition template array for the output grid. Corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure. See "igdtmpli" for definition of array elements.
    [in]igdtlenoNumber of elements of the grid definition template array for the output grid. c Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if respective ibi(k)=1).
    [in]giInput fields to interpolate.
    [out]noNumber of output points (only if kgdso(1)<0).
    [out]rlatOutput latitudes in degrees (if kgdso(1)<0).
    [out]rlonOutput longitudes in degrees (if kgdso(1)<0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]goOutput fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 1 Unrecognized interpolation method.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 1x Invalid bicubic method parameters.
    • +
    • 3x Invalid budget method parameters.
    • +
    • 4x Invalid spectral method parameters.
    • +
    +
    +
    +
    +
    Note
    Examples demonstrating relative cpu costs. This example is interpolating 12 levels of temperatures from the 360 x 181 global grid (ncep grid 3) to the 93 x 68 hawaiian mercator grid (ncep grid 204).
    +

    The example times are for the c90. As a reference, the cp time for unpacking the global 12 temperature fields is 0.04 seconds.

    + + + + + + + + + + + + + + + + + + + + + +
    METHOD IP IPOPT CP SECONDS
    BILINEAR 0 0.03
    BICUBIC 1 0 0.07
    BICUBIC 1 1 0.07
    NEIGHBOR 2 0.01
    BUDGET 3 -1,-1 0.48
    SPECTRAL 4 0,40 0.22
    SPECTRAL 4 1,40 0.24
    SPECTRAL 4 0,-1 0.42
    N-BUDGET 6 -1,-1 0.15
    +

    The spectral interpolation is fast for the mercator grid. However, for some grids the spectral interpolation is slow.

    +

    The following example is interpolating 12 levels of temperatures from the 360 x 181 global grid (ncep grid 3) to the 93 x 65 conus lambert conformal grid (ncep grid 211).

    + + + + + + + + + + + + + + + + + + + + + +
    METHOD IP IPOPT CP SECONDS
    BILINEAR 0 0.03
    BICUBIC 1 0 0.07
    BICUBIC 1 1 0.07
    NEIGHBOR 2 0.01
    BUDGET 3 -1,-1 0.51
    SPECTRAL 4 0,40 3.94
    SPECTRAL 4 1,40 5.02
    SPECTRAL 4 0,-1 11.36
    N-BUDGET 6 -1,-1 0.18
    +
    Author
    Mark Iredell, Kyle Gerheiser
    + +

    Definition at line 587 of file ipolates.F90.

    + +
    +
    + +

    ◆ ipolates_grib2_single_field()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine, public ipolates_mod::ipolates_grib2_single_field (integer(c_int), intent(in) IP,
    integer(c_int), dimension(20), intent(in) IPOPT,
    integer(c_int), intent(in) IGDTNUMI,
    integer(c_int), dimension(igdtleni), intent(in) IGDTMPLI,
    integer(c_int), intent(in) IGDTLENI,
    integer(c_int), intent(in) IGDTNUMO,
    integer(c_int), dimension(igdtleno), intent(in) IGDTMPLO,
    integer(c_int), intent(in) IGDTLENO,
    integer(c_int), intent(in) MI,
    integer(c_int), intent(in) MO,
    integer(c_int), intent(in) KM,
    integer(c_int), intent(in) IBI,
    logical(c_bool), dimension(mi), intent(in) LI,
    real(c_double), dimension(mi), intent(in) GI,
    integer(c_int), intent(out) NO,
    real(c_double), dimension(mo), intent(inout) RLAT,
    real(c_double), dimension(mo), intent(inout) RLON,
    integer(c_int), intent(out) IBO,
    logical(c_bool), dimension(mo), intent(out) LO,
    real(c_double), dimension(mo), intent(out) GO,
    integer(c_int), intent(out) IRET 
    )
    +
    + +

    Special case of ipolates_grib2 when interpolating a single field.

    +

    Removes the km dimension of input arrays so scalars can be passed to ibi/ibo.

    +
    Parameters
    + + + + + +
    [in]ipInterpolation method
      +
    • ip=0 for bilinear
    • +
    • ip=1 for bicubic
    • +
    • ip=2 for neighbor;
    • +
    • ip=3 for budget;
    • +
    • ip=4 for spectral;
    • +
    • ip=6 for neighbor-budget
    • +
    +
    [in]ipoptInterpolation options
      +
    • ip=0: (No options)
    • +
    • ip=1: Constraint option
    • +
    • ip=2: (No options)
    • +
    • ip=3: Number in radius, radius weights, search radius
    • +
    • ip=4: Spectral shape, spectral truncation
    • +
    • ip=6: Number in radius, radius weights ...)
    • +
    +
    [in]igdtnumiGrid definition template number for the input grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure:
      +
    • 00 - EQUIDISTANT CYLINDRICAL
    • +
    • 01 - Rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • 10 - MERCATOR CYCLINDRICAL
    • +
    • 20 - POLAR STEREOGRAPHIC AZIMUTHAL
    • +
    • 30 - LAMBERT CONFORMAL CONICAL
    • +
    • 40 - GAUSSIAN EQUIDISTANT CYCLINDRICAL
    • +
    +
    [in]igdtmpliGrid definition template array input grid. Corresponds to the gfldigdtmpl component of the NCEPLIBS-g2 gridmod data structure
    +
    +
    +

    Section 3 Info:

    +

    All map projections:

      +
    • (1): SHAPE OF EARTH, OCTET 15
    • +
    • (2): SCALE FACTOR OF SPHERICAL EARTH RADIUS, OCTET 16
    • +
    • (3): SCALED VALUE OF RADIUS OF SPHERICAL EARTH, OCTETS 17-20
    • +
    • (4): SCALE FACTOR OF MAJOR AXIS OF ELLIPTICAL EARTH, OCTET 21
    • +
    • (5): SCALED VALUE OF MAJOR AXIS OF ELLIPTICAL EARTH, OCTETS 22-25
    • +
    • (6): SCALE FACTOR OF MINOR AXIS OF ELLIPTICAL EARTH, OCTET 26
    • +
    • (7): SCALED VALUE OF MINOR AXIS OF ELLIPTICAL EARTH, OCTETS 27-30
    • +
    +

    Equidistant Cyclindrical:

      +
    • (8): NUMBER OF POINTS ALONG A PARALLEL, OCTS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG A MERIDIAN, OCTS 35-38
    • +
    • (10): BASIC ANGLE OF INITIAL PRODUCTION DOMAIN, OCTETS 39-42.
    • +
    • (11): SUBDIVISIONS OF BASIC ANGLE, OCTETS 43-46
    • +
    • (12): LATITUDE OF FIRST GRID POINT, OCTETS 47-50
    • +
    • (13): LONGITUDE OF FIRST GRID POINT, OCTETS 51-54
    • +
    • (14): RESOLUTION AND COMPONENT FLAGS, OCTET 55
    • +
    • (15): LATITUDE OF LAST GRID POINT, OCTETS 56-59
    • +
    • (16): LONGITUDE OF LAST GRID POINT, OCTETS 60-63
    • +
    • (17): I-DIRECTION INCREMENT, OCTETS 64-67
    • +
    • (18): J-DIRECTION INCREMENT, OCTETS 68-71
    • +
    • (19): SCANNING MODE, OCTET 72
    • +
    +

    Mercator Cyclindrical:

      +
    • (8): NUMBER OF POINTS ALONG A PARALLEL, OCTS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG A MERIDIAN, OCTS 35-38
    • +
    • (10): LATITUDE OF FIRST POINT, OCTETS 39-42
    • +
    • (11): LONGITUDE OF FIRST POINT, OCTETS 43-46
    • +
    • (12): RESOLUTION AND COMPONENT FLAGS, OCTET 47
    • +
    • (13): TANGENT LATITUDE, OCTETS 48-51
    • +
    • (14): LATITUDE OF LAST POINT, OCTETS 52-55
    • +
    • (15): LONGITUDE OF LAST POINT, OCTETS 56-59
    • +
    • (16): SCANNING MODE FLAGS, OCTET 60
    • +
    • (17): ORIENTATION OF GRID, OCTETS 61-64
    • +
    • (18): LONGITUDINAL GRID LENGTH, OCTETS 65-68
    • +
    • (19): LATITUDINAL GRID LENGTH, OCTETS 69-72
    • +
    +

    Lambert Conformal Conical:

      +
    • (8): NUMBER OF POINTS ALONG X-AXIS, OCTS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG Y-AXIS, OCTS 35-38
    • +
    • (10): LATITUDE OF FIRST POINT, OCTETS 39-42
    • +
    • (11): LONGITUDE OF FIRST POINT, OCTETS 43-46
    • +
    • (12): RESOLUTION OF COMPONENT FLAG, OCTET 47
    • +
    • (13): LATITUDE WHERE GRID LENGTHS SPECIFIED,OCTETS 48-51
    • +
    • (14): LONGITUDE OF MERIDIAN THAT IS PARALLEL TO Y-AXIS, OCTETS 52-55
    • +
    • (15): X-DIRECTION GRID LENGTH, OCTETS 56-59
    • +
    • (16): Y-DIRECTION GRID LENGTH, OCTETS 60-63
    • +
    • (17): PROJECTION CENTER FLAG, OCTET 64
    • +
    • (18): SCANNING MODE, OCTET 65
    • +
    • (19): FIRST TANGENT LATITUDE FROM POLE, OCTETS 66-69
    • +
    • (20): SECOND TANGENT LATITUDE FROM POLE, OCTETS 70-73
    • +
    • (21): LATITUDE OF SOUTH POLE OF PROJECTION, OCTETS 74-77
    • +
    • (22): LONGITUDE OF SOUTH POLE OF PROJECTION, OCTETS 78-81
    • +
    +

    Gaussian Cylindrical:

      +
    • (8): NUMBER OF POINTS ALONG A PARALLEL, OCTS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG A MERIDIAN, OCTS 35-38
    • +
    • (10): BASIC ANGLE OF INITIAL PRODUCTION DOMAIN, OCTETS 39-42
    • +
    • (11): SUBDIVISIONS OF BASIC ANGLE, OCTETS 43-46
    • +
    • (12): LATITUDE OF FIRST GRID POINT, OCTETS 47-50
    • +
    • (13): LONGITUDE OF FIRST GRID POINT, OCTETS 51-54
    • +
    • (14): RESOLUTION AND COMPONENT FLAGS, OCTET 55
    • +
    • (15): LATITUDE OF LAST GRID POINT, OCTETS 56-59
    • +
    • (16): LONGITUDE OF LAST GRID POINT, OCTETS 60-63
    • +
    • (17): I-DIRECTION INCREMENT, OCTETS 64-67
    • +
    • (18): NUMBER OF PARALLELS BETWEEN POLE AND EQUATOR, OCTETS 68-71
    • +
    • (19): SCANNING MODE, OCTET 72
    • +
    +

    Polar Stereographic Azimuthal:

      +
    • (8): NUMBER OF POINTS ALONG X-AXIS, OCTETS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG Y-AXIS, OCTETS 35-38
    • +
    • (10): LATITUDE OF FIRST GRID POINT, OCTETS 39-42
    • +
    • (11): LONGITUDE OF FIRST GRID POINT, OCTETS 43-46
    • +
    • (12): RESOLUTION AND COMPONENT FLAGS, OCTET 47
    • +
    • (13): TRUE LATITUDE, OCTETS 48-51
    • +
    • (14): ORIENTATION LONGITUDE, OCTETS 52-55
    • +
    • (15): X-DIRECTION GRID LENGTH, OCTETS 56-59
    • +
    • (16): Y-DIRECTION GRID LENGTH, OCTETS 60-63
    • +
    • (17): PROJECTION CENTER FLAG, OCTET 64
    • +
    • (18): SCANNING MODE FLAGS, OCTET 65
    • +
    +

    Rotated Equidistant Cyclindrical:

      +
    • (8): NUMBER OF POINTS ALONG A PARALLEL, OCTS 31-34
    • +
    • (9): NUMBER OF POINTS ALONG A MERIDIAN, OCTS 35-38
    • +
    • (10): BASIC ANGLE OF INITIAL PRODUCTION DOMAIN, OCTETS 39-42
    • +
    • (11): SUBDIVISIONS OF BASIC ANGLE, OCTETS 43-46
    • +
    • (12): LATITUDE OF FIRST GRID POINT, OCTETS 47-50
    • +
    • (13): LONGITUDE OF FIRST GRID POINT, OCTETS 51-54
    • +
    • (14): RESOLUTION AND COMPONENT FLAGS, OCTET 55
    • +
    • (15): LATITUDE OF LAST GRID POINT, OCTETS 56-59
    • +
    • (16): LONGITUDE OF LAST GRID POINT, OCTETS 60-63
    • +
    • (17): I-DIRECTION INCREMENT, OCTETS 64-67
    • +
    • (18): J-DIRECTION INCREMENT, OCTETS 68-71
    • +
    • (19): SCANNING MODE, OCTET 72
    • +
    • (20): LATITUDE OF SOUTHERN POLE OF PROJECTION, OCTETS 73-76
    • +
    • (21): LONGITUDE OF SOUTHERN POLE OF PROJECTION, OCTETS 77-80
    • +
    • (22): ANGLE OF ROTATION OF PROJECTION, OCTS 81-84
    • +
    +
    Parameters
    + + + + + + + + + + + + + + + + + + +
    [in]igdtleniNumber of elements of the grid definition template array for the input grid. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]igdtnumoGrid definition template number for the output grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure. See "igdtnumi" for specific template definitions. Note: igdtnumo<0 means interpolate to random station points.
    [in]igdtmploGrid definition template array for the output grid. Corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure. See "igdtmpli" for definition of array elements.
    [in]igdtlenoNumber of elements of the grid definition template array for the output grid. c Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if respective ibi(k)=1).
    [in]giInput fields to interpolate.
    [out]noNumber of output points (only if kgdso(1)<0).
    [out]rlatOutput latitudes in degrees (if kgdso(1)<0).
    [out]rlonOutput longitudes in degrees (if kgdso(1)<0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]goOutput fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 1 Unrecognized interpolation method.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 1x Invalid bicubic method parameters.
    • +
    • 3x Invalid budget method parameters.
    • +
    • 4x Invalid spectral method parameters.
    • +
    +
    +
    +
    +
    Author
    Eric Engle
    +
    Date
    November 2022
    + +

    Definition at line 808 of file ipolates.F90.

    + +
    +
    + +

    ◆ ipolates_grid()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ipolates_mod::ipolates_grid (integer, intent(in) ip,
    integer, dimension(20), intent(in) ipopt,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) mi,
    integer, intent(in) mo,
    integer, intent(in) km,
    integer, dimension(km), intent(in) ibi,
    logical*1, dimension(mi,km), intent(in) li,
    real, dimension(mi,km), intent(in) gi,
    integer, intent(inout) no,
    real, dimension(mo), intent(inout) rlat,
    real, dimension(mo), intent(inout) rlon,
    integer, dimension(km), intent(out) ibo,
    logical*1, dimension(mo,km), intent(out) lo,
    real, dimension(mo,km), intent(out) go,
    integer, intent(out) iret 
    )
    +
    +private
    +
    + +

    Interpolates scalar fields between grids given ip_grid objects.

    +

    Calls the specific interpolation routines on the generic ip_grids created from a grib1/grib2 descriptor.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + +
    [in]ipInterpolation method.
    [in]ipoptInterpolation options.
    [in]grid_inInput grid.
    [in]grid_outOutput grid object created.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if respective ibi(k)=1).
    [in]giInput fields to interpolate.
    [out]noNumber of output points (only if kgdso(1)<0).
    [out]rlatOutput latitudes in degrees (if kgdso(1)<0).
    [out]rlonOutput longitudes in degrees (if kgdso(1)<0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]goOutput fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 1 Unrecognized interpolation method.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 1x Invalid bicubic method parameters.
    • +
    • 3x Invalid budget method parameters.
    • +
    • 4x Invalid spectral method parameters.
    • +
    +
    +
    +
    +
    Author
    Mark Iredell, Kyle Gerheiser
    + +

    Definition at line 63 of file ipolates.F90.

    + +

    References ip_interpolators_mod::bicubic_interp_id, ip_interpolators_mod::bilinear_interp_id, ip_interpolators_mod::budget_interp_id, ip_interpolators_mod::neighbor_budget_interp_id, ip_interpolators_mod::neighbor_interp_id, and ip_interpolators_mod::spectral_interp_id.

    + +

    Referenced by ipolates_mod::ipolates::ipolates_grib1(), ipolates_mod::ipolates::ipolates_grib1_single_field(), ipolates_mod::ipolates::ipolates_grib2(), and ipolates_mod::ipolates::ipolates_grib2_single_field().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespaceipolates__mod.js b/ver-5.1.0/namespaceipolates__mod.js new file mode 100644 index 00000000..4197e28d --- /dev/null +++ b/ver-5.1.0/namespaceipolates__mod.js @@ -0,0 +1,9 @@ +var namespaceipolates__mod = +[ + [ "ipolates", "interfaceipolates__mod_1_1ipolates.html", "interfaceipolates__mod_1_1ipolates" ], + [ "ipolates_grib1", "namespaceipolates__mod.html#acb5408cf5c3a0f50326edc183f9bd269", null ], + [ "ipolates_grib1_single_field", "namespaceipolates__mod.html#ae70a9ca9871bb33e038782b036b7b53d", null ], + [ "ipolates_grib2", "namespaceipolates__mod.html#a6b2ea6d5b04d2a68baad261e7a409fac", null ], + [ "ipolates_grib2_single_field", "namespaceipolates__mod.html#a49541b2af75b7c037a863a4785726856", null ], + [ "ipolates_grid", "namespaceipolates__mod.html#a2761e20fab898e7fd9963f3e0eb5d104", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/namespaceipolatev__mod.html b/ver-5.1.0/namespaceipolatev__mod.html new file mode 100644 index 00000000..c5760f9d --- /dev/null +++ b/ver-5.1.0/namespaceipolatev__mod.html @@ -0,0 +1,1443 @@ + + + + + + + +NCEPLIBS-ip: ipolatev_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ipolatev_mod Module Reference
    +
    +
    + +

    Top-level driver for vector interpolation interpolation routine ipolatev(). +More...

    + + + + +

    +Data Types

    interface  ipolatev
     
    + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine, public ipolatev_grib1 (ip, ipopt, kgdsi, kgdso, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
     This subprogram interpolates vector field from any grid to any grid given a grib1 Grid Descriptor Section. More...
     
    subroutine, public ipolatev_grib1_single_field (ip, ipopt, kgdsi, kgdso, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
     Special case of ipolatev_grib1 when interpolating a single field. More...
     
    subroutine, public ipolatev_grib2 (ip, ipopt, igdtnumi, igdtmpli, igdtleni, igdtnumo, igdtmplo, igdtleno, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
     This subprogram interpolates vector fields from any grid to any grid given a grib2 descriptor. More...
     
    subroutine, public ipolatev_grib2_single_field (ip, ipopt, igdtnumi, igdtmpli, igdtleni, igdtnumo, igdtmplo, igdtleno, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)
     This subprogram interpolates vector fields from any grid to any grid given a grib2 descriptor. More...
     
    subroutine ipolatev_grid (IP, IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     Interpolates vector fields between grids given ip_grid objects. More...
     
    +

    Detailed Description

    +

    Top-level driver for vector interpolation interpolation routine ipolatev().

    +

    The ipolatev() subprogram is overloaded with interfaces for GRIB1 and GRIB2 descriptors.

    +
    Author
    George Gayno, Mark Iredell, Kyle Gerheiser
    +

    Function/Subroutine Documentation

    + +

    ◆ ipolatev_grib1()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine, public ipolatev_mod::ipolatev_grib1 (integer(c_int), intent(in) ip,
    integer(c_int), dimension(20), intent(in) ipopt,
    integer(c_int), dimension(200), intent(inout) kgdsi,
    integer(c_int), dimension(200), intent(inout) kgdso,
    integer(c_int), intent(in) mi,
    integer(c_int), intent(in) mo,
    integer(c_int), intent(in) km,
    integer(c_int), dimension(km), intent(in) ibi,
    logical(c_bool), dimension(mi,km), intent(in) li,
    real(c_double), dimension(mi,km), intent(in) ui,
    real(c_double), dimension(mi,km), intent(in) vi,
    integer(c_int), intent(out) no,
    real(c_double), dimension(mo), intent(inout) rlat,
    real(c_double), dimension(mo), intent(inout) rlon,
    real(c_double), dimension(mo), intent(inout) crot,
    real(c_double), dimension(mo), intent(inout) srot,
    integer(c_int), dimension(km), intent(out) ibo,
    logical(c_bool), dimension(mo,km), intent(out) lo,
    real(c_double), dimension(mo,km), intent(out) uo,
    real(c_double), dimension(mo,km), intent(out) vo,
    integer(c_int), intent(out) iret 
    )
    +
    + +

    This subprogram interpolates vector field from any grid to any grid given a grib1 Grid Descriptor Section.

    +

    Only horizontal interpolation is performed. The following interpolation methods are possible:

      +
    • (ip=0) bilinear
    • +
    • (ip=1) bicubic
    • +
    • (ip=2) neighbor
    • +
    • (ip=3) budget
    • +
    • (ip=4) spectral
    • +
    • (ip=6) neighbor-budget
    • +
    +

    Some of these methods have interpolation options and/or restrictions on the input or output grids, both of which are documented more fully in their respective subprograms.

    +

    The grids are defined by their grid description sections (passed in integer form as decoded by subprogram w3fi63).

    +

    The current code recognizes the following projections:

      +
    • (kgds(1)=000) equidistant cylindrical
    • +
    • (kgds(1)=001) mercator cylindrical
    • +
    • (kgds(1)=003) lambert conformal conical
    • +
    • (kgds(1)=004) gaussian cylindrical
    • +
    • (kgds(1)=005) polar stereographic azimuthal
    • +
    • (kgds(1)=203) rotated equidistant cylindrical - e-stagger
    • +
    • (kgds(1)=205) rotated equidistant cylindrical - b-stagger
    • +
    +

    Where kgds could be either input kgdsi or output kgdso.

    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned.

    +

    On the other hand, the output can be a set of station points if kgdso(1)<0, in which case the number of points and their latitudes and longitudes must be input. for the budget approach, a subsection of the grid may be output by subtracting kgdso(1) from 255 and passing in the latitudes and longitudes of the points. Input bitmaps will be interpolated to output bitmaps.

    +

    Output bitmaps will also be created when the output grid extends outside of the domain of the input grid. the output field is set to 0 where the output bitmap is off.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + +
    ipInterpolation method
      +
    • ip = BILINEAR_INTERP_ID = 0 for bilinear
    • +
    • ip = BICUBIC_INTERP_ID = 1 for bicubic
    • +
    • ip = NEIGHBOR_INTERP_ID = 2 for neighbor;
    • +
    • ip = BUDGET_INTERP_ID = 3 for budget;
    • +
    • ip = SPECTRAL_INTERP_ID = 4 for spectral;
    • +
    • ip = NEIGHBOR_BUDGET_INTERP_ID = 6 for neighbor-budget
    • +
    +
    ipoptInterpolation options
      +
    • ip=0 (bilinear): (No options)
    • +
    • ip=1 Cbicubic): constraint option
    • +
    • ip=2 (neighbor): (No options)
    • +
    • ip=3 (budget): Number in radius, radius weights, search radius
    • +
    • ip=4 (spectral): Spectral shape, spectral truncation
    • +
    • ip=6 (neighbor-budget): Number in radius, radius weights ...)
    • +
    +
    [in]kgdsiInput gds parameters as decoded by w3fi63.
    [in]kgdsoOutput gds parameters.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if respective ibi(k)=1).
    [in]uiInput u-component fields to interpolate.
    [in]viInput v-component fields to interpolate.
    [out]noNumber of output points (only if kgdso(1)<0).
    [out]rlatOutput latitudes in degrees (if kgdso(1)<0).
    [out]rlonOutput longitudes in degrees (if kgdso(1)<0).
    [in,out]crotVector rotation cosines (if igdtnumo>=0).
    [in,out]srotVector rotation sines (if igdtnumo>=0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]uoOutput u-component fields interpolated.
    [out]voOutput v-component fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 1 Unrecognized interpolation method.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 1x Invalid bicubic method parameters.
    • +
    • 3x Invalid budget method parameters.
    • +
    • 4x Invalid spectral method parameters.
    • +
    +
    +
    +
    +
    Note
    Examples demonstrating relative cpu costs. This example is interpolating 12 levels of winds from the 360 x 181 global grid (ncep grid 3) to the 93 x 68 hawaiian mercator grid (ncep grid 204).
    +

    The example times are for the c90. As a reference, the cp time for unpacking the global 12 temperature fields is 0.07 seconds.

    + + + + + + + + + + + + + + + + + + + + + +
    METHOD IP IPOPT CP SECONDS
    BILINEAR 0 0.05
    BICUBIC 1 0 0.16
    BICUBIC 1 1 0.17
    NEIGHBOR 2 0.02
    BUDGET 3 -1,-1 0.94
    SPECTRAL 4 0,40 0.31
    SPECTRAL 4 1,40 0.33
    SPECTRAL 4 0,-1 0.59
    N-BUDGET 6 -1,-1 0.31
    +

    The spectral interpolation is fast for the mercator grid. However, for some grids the spectral interpolation is slow.

    +

    The following example is interpolating 12 levels of temperatures from the 360 x 181 global grid (ncep grid 3) to the 93 x 65 conus lambert conformal grid (ncep grid 211).

    + + + + + + + + + + + + + + + + + + + + + +
    METHOD IP IPOPT CP SECONDS
    BILINEAR 0 0.05
    BICUBIC 1 0 0.15
    BICUBIC 1 1 0.16
    NEIGHBOR 2 0.02
    BUDGET 3 -1,-1 0.92
    SPECTRAL 4 0,40 4.51
    SPECTRAL 4 1,40 5.77
    SPECTRAL 4 0,-1 12.60
    N-BUDGET 6 -1,-1 0.33
    +
    Date
    July 2021
    +
    Author
    Kyle Gerheiser
    + +

    Definition at line 565 of file ipolatev.F90.

    + +
    +
    + +

    ◆ ipolatev_grib1_single_field()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine, public ipolatev_mod::ipolatev_grib1_single_field (integer(c_int), intent(in) ip,
    integer(c_int), dimension(20), intent(in) ipopt,
    integer(c_int), dimension(200), intent(inout) kgdsi,
    integer(c_int), dimension(200), intent(inout) kgdso,
    integer(c_int), intent(in) mi,
    integer(c_int), intent(in) mo,
    integer(c_int), intent(in) km,
    integer(c_int), intent(in) ibi,
    logical(c_bool), dimension(mi), intent(in) li,
    real(c_double), dimension(mi), intent(in) ui,
    real(c_double), dimension(mi), intent(in) vi,
    integer(c_int), intent(out) no,
    real(c_double), dimension(mo), intent(inout) rlat,
    real(c_double), dimension(mo), intent(inout) rlon,
    real(c_double), dimension(mo), intent(inout) crot,
    real(c_double), dimension(mo), intent(inout) srot,
    integer(c_int), intent(out) ibo,
    logical(c_bool), dimension(mo), intent(out) lo,
    real(c_double), dimension(mo), intent(out) uo,
    real(c_double), dimension(mo), intent(out) vo,
    integer(c_int), intent(out) iret 
    )
    +
    + +

    Special case of ipolatev_grib1 when interpolating a single field.

    +

    Removes the km dimension of input arrays so vectors can be passed to ibi/ibo.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + +
    ipInterpolation method
      +
    • ip = BILINEAR_INTERP_ID = 0 for bilinear
    • +
    • ip = BICUBIC_INTERP_ID = 1 for bicubic
    • +
    • ip = NEIGHBOR_INTERP_ID = 2 for neighbor;
    • +
    • ip = BUDGET_INTERP_ID = 3 for budget;
    • +
    • ip = SPECTRAL_INTERP_ID = 4 for spectral;
    • +
    • ip = NEIGHBOR_BUDGET_INTERP_ID = 6 for neighbor-budget
    • +
    +
    ipoptInterpolation options
      +
    • ip=0 (bilinear): (No options)
    • +
    • ip=1 Cbicubic): constraint option
    • +
    • ip=2 (neighbor): (No options)
    • +
    • ip=3 (budget): Number in radius, radius weights, search radius
    • +
    • ip=4 (spectral): Spectral shape, spectral truncation
    • +
    • ip=6 (neighbor-budget): Number in radius, radius weights ...)
    • +
    +
    [in]kgdsiInput gds parameters as decoded by w3fi63.
    [in]kgdsoOutput gds parameters.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if respective ibi(k)=1).
    [in]uiInput u-component fields to interpolate.
    [in]viInput v-component fields to interpolate.
    [out]noNumber of output points (only if kgdso(1)<0).
    [out]rlatOutput latitudes in degrees (if kgdso(1)<0).
    [out]rlonOutput longitudes in degrees (if kgdso(1)<0).
    [in,out]crotVector rotation cosines (if igdtnumo>=0).
    [in,out]srotVector rotation sines (if igdtnumo>=0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]uoOutput u-component fields interpolated.
    [out]voOutput v-component fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 1 Unrecognized interpolation method.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 1x Invalid bicubic method parameters.
    • +
    • 3x Invalid budget method parameters.
    • +
    • 4x Invalid spectral method parameters.
    • +
    +
    +
    +
    +
    Date
    Jan 2022
    +
    Author
    Kyle Gerheiser
    + +

    Definition at line 680 of file ipolatev.F90.

    + +
    +
    + +

    ◆ ipolatev_grib2()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine, public ipolatev_mod::ipolatev_grib2 (integer(c_int), intent(in) ip,
    integer(c_int), dimension(20), intent(in) ipopt,
    integer(c_int), intent(in) igdtnumi,
    integer(c_int), dimension(igdtleni), intent(in) igdtmpli,
    integer(c_int), intent(in) igdtleni,
    integer(c_int), intent(in) igdtnumo,
    integer(c_int), dimension(igdtleno), intent(in) igdtmplo,
    integer(c_int), intent(in) igdtleno,
    integer(c_int), intent(in) mi,
    integer(c_int), intent(in) mo,
    integer(c_int), intent(in) km,
    integer(c_int), dimension(km), intent(in) ibi,
    logical(c_bool), dimension(mi,km), intent(in) li,
    real(c_double), dimension(mi,km), intent(in) ui,
    real(c_double), dimension(mi,km), intent(in) vi,
    integer(c_int), intent(out) no,
    real(c_double), dimension(mo), intent(inout) rlat,
    real(c_double), dimension(mo), intent(inout) rlon,
    real(c_double), dimension(mo), intent(inout) crot,
    real(c_double), dimension(mo), intent(inout) srot,
    integer(c_int), dimension(km), intent(out) ibo,
    logical(c_bool), dimension(mo,km), intent(out) lo,
    real(c_double), dimension(mo,km), intent(out) uo,
    real(c_double), dimension(mo,km), intent(out) vo,
    integer(c_int), intent(out) iret 
    )
    +
    + +

    This subprogram interpolates vector fields from any grid to any grid given a grib2 descriptor.

    +

    This is a wrapper for ipolates_grid which converts a grib1 descriptor into an ip_grid_descriptor, which is used to create an ip_grid. Only horizontal interpolation is performed.

    +

    The following interpolation methods are possible:

      +
    • (ip=0) bilinear
    • +
    • (ip=1) bicubic
    • +
    • (ip=2) neighbor
    • +
    • (ip=3) budget
    • +
    • (ip=4) spectral
    • +
    • (ip=6) neighbor-budget
    • +
    +

    Some of these methods have interpolation options and/or restrictions on the input or output grids, both of which are documented more fully in their respective subprograms.

    +

    Input and output grids are defined by their grib 2 grid definition template as decoded by the ncep g2 library. The current code recognizes the following projections, where "igdtnumi/o" is the grib 2 grid defintion template number for the input and output grids, respectively:

      +
    • (igdtnumi/o=00) equidistant cylindrical
    • +
    • (igdtnumi/o=01) rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • (igdtnumi/o=10) mercator cylindrical
    • +
    • (igdtnumi/o=20) polar stereographic azimuthal
    • +
    • (igdtnumi/o=30) lambert conformal conical
    • +
    • (igdtnumi/o=40) gaussian cylindrical
    • +
    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned.

    +

    On the other hand, data may be interpolated to a set of station points if "igdtnumo"<0 (or subtracted from 255 for the budget option), in which case the number of points and their latitudes and longitudes must be input.

    +

    Input bitmaps will be interpolated to output bitmaps. Output bitmaps will also be created when the output grid extends outside of the domain of the input grid.

    +

    The output field is set to 0 where the output bitmap is off.

    +
    Parameters
    + + + + + +
    [in]ipInterpolation method
      +
    • ip=0 for bilinear
    • +
    • ip=1 for bicubic
    • +
    • ip=2 for neighbor;
    • +
    • ip=3 for budget;
    • +
    • ip=4 for spectral;
    • +
    • ip=6 for neighbor-budget
    • +
    +
    [in]ipoptInterpolation options
      +
    • ip=0: (No options)
    • +
    • ip=1: Constraint option
    • +
    • ip=2: (No options)
    • +
    • ip=3: Number in radius, radius weights, search radius
    • +
    • ip=4: Spectral shape, spectral truncation
    • +
    • ip=6: Number in radius, radius weights ...)
    • +
    +
    [in]igdtnumiGrid definition template number for the input grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure:
      +
    • 00 - Equidistant Cylindrical
    • +
    • 01 - Rotated Equidistant cylindrical. "e" and non-"e" staggered
    • +
    • 10 - Mercator Cyclindrical
    • +
    • 20 - Polar Stereographic azimuthal
    • +
    • 30 - Lambert Conformal Conical
    • +
    • 40 - Gaussian Equidistant Cyclindrical
    • +
    +
    [in]igdtmpliGrid definition template array input grid. Corresponds to the gfldigdtmpl component of the NCEPLIBS-g2 gridmod data structure
    +
    +
    +

    Section 3 Info:

    +

    All map projections:

      +
    1. Shape of earth, octet 15.
    2. +
    3. Scale factor of spherical earth radius, octet 16.
    4. +
    5. Scaled value of radius of spherical earth, octets 17-20.
    6. +
    7. Scale factor of major axis of elliptical earth, octet 21.
    8. +
    9. Scaled value of major axis of elliptical earth, octets 22-25.
    10. +
    11. Scale factor of minor axis of elliptical earth, octet 26. 7: Scaled value of minor axis of elliptical earth, octets 27-30.
    12. +
    +

    Equidistant Cyclindrical:

      +
    1. Number of points along a parallel, octs 31-34.
    2. +
    3. Number of points along a meridian, octs 35-38.
    4. +
    5. Basic angle of initial production domain, octets 39-42.
    6. +
    7. Subdivisions of basic angle, octets 43-46.
    8. +
    9. Latitude of first grid point, octets 47-50.
    10. +
    11. Longitude of first grid point, octets 51-54.
    12. +
    13. Resolution and component flags, octet 55.
    14. +
    15. Latitude of last grid point, octets 56-59.
    16. +
    17. Longitude of last grid point, octets 60-63.
    18. +
    19. i-direction increment, octets 64-67.
    20. +
    21. j-direction increment, octets 68-71.
    22. +
    23. Scanning mode, octet 72.
    24. +
    +

    Mercator Cyclindrical:

      +
    1. Number of points along a parallel, octs 31-34.
    2. +
    3. Number of points along a meridian, octs 35-38.
    4. +
    5. Latitude of first point, octets 39-42.
    6. +
    7. Longitude of first point, octets 43-46.
    8. +
    9. Resolution and component flags, octet 47.
    10. +
    11. Tangent latitude, octets 48-51.
    12. +
    13. Latitude of last point, octets 52-55.
    14. +
    15. Longitude of last point, octets 56-59.
    16. +
    17. Scanning mode flags, octet 60.
    18. +
    19. Orientation of grid, octets 61-64.
    20. +
    21. Longitudinal grid length, octets 65-68.
    22. +
    23. Latitudinal grid length, octets 69-72.
    24. +
    +

    Lambert Conformal Conical:

      +
    1. Number of points along x-axis, octs 31-34.
    2. +
    3. Number of points along y-axis, octs 35-38.
    4. +
    5. Latitude of first point, octets 39-42.
    6. +
    7. Longitude of first point, octets 43-46.
    8. +
    9. Resolution of component flag, octet 47.
    10. +
    11. Latitude where grid lengths specified,octets 48-51.
    12. +
    13. Longitude of meridian that is parallel to y-axis, octets 52-55.
    14. +
    15. x-direction grid length, octets 56-59.
    16. +
    17. y-direction grid length, octets 60-63.
    18. +
    19. Projection center flag, octet 64.
    20. +
    21. Scanning mode, octet 65.
    22. +
    23. First tangent latitude from pole, octets 66-69.
    24. +
    25. Second tangent latitude from pole, octets 70-73.
    26. +
    27. Latitude of south pole of projection, octets 74-77.
    28. +
    29. Longitude of south pole of projection, octets 78-81.
    30. +
    +

    Gaussian Cylindrical:

      +
    1. Number of points along a parallel, octs 31-34.
    2. +
    3. Number of points along a meridian, octs 35-38.
    4. +
    5. Basic angle of initial production domain, octets 39-42.
    6. +
    7. Subdivisions of basic angle, octets 43-46.
    8. +
    9. Latitude of first grid point, octets 47-50.
    10. +
    11. Longitude of first grid point, octets 51-54.
    12. +
    13. Resolution and component flags, octet 55.
    14. +
    15. Latitude of last grid point, octets 56-59.
    16. +
    17. Longitude of last grid point, octets 60-63.
    18. +
    19. i-direction increment, octets 64-67.
    20. +
    21. Number of parallels between pole and equator, octets 68-71.
    22. +
    23. Scanning mode, octet 72.
    24. +
    +

    Polar Stereographic Azimuthal:

      +
    1. Number of points along x-axis, octets 31-34.
    2. +
    3. Number of points along y-axis, octets 35-38.
    4. +
    5. Latitude of first grid point, octets 39-42.
    6. +
    7. Longitude of first grid point, octets 43-46.
    8. +
    9. Resolution and component flags, octet 47.
    10. +
    11. True latitude, octets 48-51.
    12. +
    13. Orientation longitude, octets 52-55.
    14. +
    15. x-direction grid length, octets 56-59.
    16. +
    17. y-direction grid length, octets 60-63.
    18. +
    19. Projection center flag, octet 64.
    20. +
    21. Scanning mode flags, octet 65.
    22. +
    +

    Rotated Equidistant Cyclindrical:

      +
    1. Number of points along a parallel, octs 31-34.
    2. +
    3. Number of points along a meridian, octs 35-38.
    4. +
    5. Basic angle of initial production domain, octets 39-42.
    6. +
    7. Subdivisions of basic angle, octets 43-46.
    8. +
    9. Latitude of first grid point, octets 47-50.
    10. +
    11. Longitude of first grid point, octets 51-54.
    12. +
    13. Resolution and component flags, octet 55.
    14. +
    15. Latitude of last grid point, octets 56-59.
    16. +
    17. Longitude of last grid point, octets 60-63.
    18. +
    19. i-direction increment, octets 64-67.
    20. +
    21. j-direction increment, octets 68-71.
    22. +
    23. Scanning mode, octet 72.
    24. +
    25. Latitude of southern pole of projection, octets 73-76.
    26. +
    27. Longitude of southern pole of projection, octets 77-80.
    28. +
    29. Angle of rotation of projection, octs 81-84.
    30. +
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + +
    [in]igdtleniNumber of elements of the grid definition template array for the input grid. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]igdtnumoGrid definition template number for the output grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure. See "igdtnumi" for specific template definitions. Note: igdtnumo<0 means interpolate to random station points.
    [in]igdtmploGrid definition template array for the output grid. Corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure. See "igdtmpli" for definition of array elements.
    [in]igdtlenoNumber of elements of the grid definition template array for the output grid. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if respective ibi(k)=1).
    [in]uiInput u-component fields to interpolate.
    [in]viInput v-component fields to interpolate.
    [out]noNumber of output points (only if kgdso(1)<0).
    [in,out]rlatOutput latitudes in degrees (if kgdso(1)<0).
    [in,out]rlonOutput longitudes in degrees (if kgdso(1)<0).
    [in,out]crotVector rotation cosines (if igdtnumo>=0).
    [in,out]srotVector rotation sines (if igdtnumo>=0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]uoOutput u-component fields interpolated.
    [out]voOutput v-component fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 1 Unrecognized interpolation method.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 1x Invalid bicubic method parameters.
    • +
    • 3x Invalid budget method parameters.
    • +
    • 4x Invalid spectral method parameters.
    • +
    +
    +
    +
    +
    Note
    Examples demonstrating relative cpu costs. This example is interpolating 12 levels of winds from the 360 x 181 global grid (ncep grid 3) to the 93 x 68 hawaiian mercator grid (ncep grid 204).
    +

    The example times are for the c90. As a reference, the cp time for unpacking the global 12 wind fields is 0.07 seconds.

    + + + + + + + + + + + + + + + + + + + + + +
    METHOD IP IPOPT CP SECONDS
    BILINEAR 0 0.05
    BICUBIC 1 0 0.16
    BICUBIC 1 1 0.17
    NEIGHBOR 2 0.02
    BUDGET 3 -1,-1 0.94
    SPECTRAL 4 0,40 0.31
    SPECTRAL 4 1,40 0.33
    SPECTRAL 4 0,-1 0.59
    N-BUDGET 6 -1,-1 0.31
    +

    The spectral interpolation is fast for the mercator grid. However, for some grids the spectral interpolation is slow.

    +

    The following example is interpolating 12 levels of winds from the 360 x 181 global grid (ncep grid 3) to the 93 x 65 conus lambert conformal grid (ncep grid 211).

    + + + + + + + + + + + + + + + + + + + + + +
    METHOD IP IPOPT CP SECONDS
    BILINEAR 0 0.05
    BICUBIC 1 0 0.15
    BICUBIC 1 1 0.16
    NEIGHBOR 2 0.02
    BUDGET 3 -1,-1 0.92
    SPECTRAL 4 0,40 4.51
    SPECTRAL 4 1,40 5.77
    SPECTRAL 4 0,-1 12.60
    N-BUDGET 6 -1,-1 0.33
    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 382 of file ipolatev.F90.

    + +
    +
    + +

    ◆ ipolatev_grib2_single_field()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine, public ipolatev_mod::ipolatev_grib2_single_field (integer(c_int), intent(in) ip,
    integer(c_int), dimension(20), intent(in) ipopt,
    integer(c_int), intent(in) igdtnumi,
    integer(c_int), dimension(igdtleni), intent(in) igdtmpli,
    integer(c_int), intent(in) igdtleni,
    integer(c_int), intent(in) igdtnumo,
    integer(c_int), dimension(igdtleno), intent(in) igdtmplo,
    integer(c_int), intent(in) igdtleno,
    integer(c_int), intent(in) mi,
    integer(c_int), intent(in) mo,
    integer(c_int), intent(in) km,
    integer(c_int), intent(in) ibi,
    logical(c_bool), dimension(mi), intent(in) li,
    real(c_double), dimension(mi), intent(in) ui,
    real(c_double), dimension(mi), intent(in) vi,
    integer(c_int), intent(out) no,
    real(c_double), dimension(mo), intent(inout) rlat,
    real(c_double), dimension(mo), intent(inout) rlon,
    real(c_double), dimension(mo), intent(inout) crot,
    real(c_double), dimension(mo), intent(inout) srot,
    integer(c_int), intent(out) ibo,
    logical(c_bool), dimension(mo), intent(out) lo,
    real(c_double), dimension(mo), intent(out) uo,
    real(c_double), dimension(mo), intent(out) vo,
    integer(c_int), intent(out) iret 
    )
    +
    + +

    This subprogram interpolates vector fields from any grid to any grid given a grib2 descriptor.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    [in]ipInterpolation method
      +
    • ip=0 for bilinear
    • +
    • ip=1 for bicubic
    • +
    • ip=2 for neighbor;
    • +
    • ip=3 for budget;
    • +
    • ip=4 for spectral;
    • +
    • ip=6 for neighbor-budget
    • +
    +
    [in]ipoptInterpolation options
      +
    • ip=0: (No options)
    • +
    • ip=1: Constraint option
    • +
    • ip=2: (No options)
    • +
    • ip=3: Number in radius, radius weights, search radius
    • +
    • ip=4: Spectral shape, spectral truncation
    • +
    • ip=6: Number in radius, radius weights ...)
    • +
    +
    [in]igdtnumiGrid definition template number for the input grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure:
      +
    • 00 - Equidistant Cylindrical
    • +
    • 01 - Rotated Equidistant cylindrical. "e" and non-"e" staggered
    • +
    • 10 - Mercator Cyclindrical
    • +
    • 20 - Polar Stereographic azimuthal
    • +
    • 30 - Lambert Conformal Conical
    • +
    • 40 - Gaussian Equidistant Cyclindrical
    • +
    +
    [in]igdtmpliGrid definition template array input grid. Corresponds to the gfldigdtmpl component of the NCEPLIBS-g2 gridmod data structure
    [in]igdtleniNumber of elements of the grid definition template array for the input grid. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]igdtnumoGrid definition template number for the output grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure. See "igdtnumi" for specific template definitions. Note: igdtnumo<0 means interpolate to random station points.
    [in]igdtmploGrid definition template array for the output grid. Corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure. See "igdtmpli" for definition of array elements.
    [in]igdtlenoNumber of elements of the grid definition template array for the output grid. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if respective ibi(k)=1).
    [in]uiInput u-component fields to interpolate.
    [in]viInput v-component fields to interpolate.
    [out]noNumber of output points (only if kgdso(1)<0).
    [in,out]rlatOutput latitudes in degrees (if kgdso(1)<0).
    [in,out]rlonOutput longitudes in degrees (if kgdso(1)<0).
    [in,out]crotVector rotation cosines (if igdtnumo>=0).
    [in,out]srotVector rotation sines (if igdtnumo>=0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]uoOutput u-component fields interpolated.
    [out]voOutput v-component fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 1 Unrecognized interpolation method.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 1x Invalid bicubic method parameters.
    • +
    • 3x Invalid budget method parameters.
    • +
    • 4x Invalid spectral method parameters.
    • +
    +
    +
    +
    +
    Author
    Eric Engle
    +
    Date
    November 2022
    + +

    Definition at line 832 of file ipolatev.F90.

    + +
    +
    + +

    ◆ ipolatev_grid()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine ipolatev_mod::ipolatev_grid (integer, intent(in) IP,
    integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    logical*1, dimension(mi,km), intent(in) LI,
    real, dimension(mi,km), intent(in) UI,
    real, dimension(mi,km), intent(in) VI,
    integer, intent(out) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    real, dimension(mo), intent(inout) CROT,
    real, dimension(mo), intent(inout) SROT,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) UO,
    real, dimension(mo,km), intent(out) VO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolates vector fields between grids given ip_grid objects.

    +

    Calls the specific interpolation routines on the generic ip_grids created from a GRIB1 or GRIB2 descriptor.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + +
    [in]ipInterpolation method.
    [in]ipoptInterpolation options.
    [in]grid_inInput grid.
    [in]grid_outOutput grid object created.
    [in]miSkip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moSkip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmNumber of fields to interpolate.
    [in]ibiInput bitmap flags.
    [in]liInput bitmaps (if respective ibi(k)=1).
    [in]uiInput u-component fields to interpolate.
    [in]viInput v-component fields to interpolate.
    [out]noNumber of output points (only if kgdso(1)<0).
    [out]rlatOutput latitudes in degrees (if kgdso(1)<0).
    [out]rlonOutput longitudes in degrees (if kgdso(1)<0).
    [in,out]crotVector rotation cosines (if igdtnumo>=0).
    [in,out]srotVector rotation sines (if igdtnumo>=0).
    [out]iboOutput bitmap flags.
    [out]loOutput bitmaps (always output).
    [out]uoOutput u-component fields interpolated.
    [out]voOutput v-component fields interpolated.
    [out]iretReturn code.
      +
    • 0 Successful interpolation.
    • +
    • 1 Unrecognized interpolation method.
    • +
    • 2 Unrecognized input grid or no grid overlap.
    • +
    • 3 Unrecognized output grid.
    • +
    • 1x Invalid bicubic method parameters.
    • +
    • 3x Invalid budget method parameters.
    • +
    • 4x Invalid spectral method parameters.
    • +
    +
    +
    +
    +
    Date
    July 2021
    +
    Author
    Kyle Gerheiser
    + +

    Definition at line 67 of file ipolatev.F90.

    + +

    References ip_interpolators_mod::bicubic_interp_id, ip_interpolators_mod::bilinear_interp_id, ip_interpolators_mod::budget_interp_id, ip_interpolators_mod::neighbor_budget_interp_id, ip_interpolators_mod::neighbor_interp_id, and ip_interpolators_mod::spectral_interp_id.

    + +

    Referenced by ipolatev_mod::ipolatev::ipolatev_grib1(), ipolatev_mod::ipolatev::ipolatev_grib1_single_field(), ipolatev_mod::ipolatev::ipolatev_grib2(), and ipolatev_mod::ipolatev::ipolatev_grib2_single_field().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespaceipolatev__mod.js b/ver-5.1.0/namespaceipolatev__mod.js new file mode 100644 index 00000000..89b5018f --- /dev/null +++ b/ver-5.1.0/namespaceipolatev__mod.js @@ -0,0 +1,9 @@ +var namespaceipolatev__mod = +[ + [ "ipolatev", "interfaceipolatev__mod_1_1ipolatev.html", "interfaceipolatev__mod_1_1ipolatev" ], + [ "ipolatev_grib1", "namespaceipolatev__mod.html#abddc4a9b00133b358443b118f1352d1f", null ], + [ "ipolatev_grib1_single_field", "namespaceipolatev__mod.html#ad535ffd159c46e770effd774aabede58", null ], + [ "ipolatev_grib2", "namespaceipolatev__mod.html#a00fed53dd867a802b3adbc1141e8d272", null ], + [ "ipolatev_grib2_single_field", "namespaceipolatev__mod.html#a71d7507e8f89e1229caaaacb37e0c9c7", null ], + [ "ipolatev_grid", "namespaceipolatev__mod.html#a8f3bfec7495e13b75b2035e8e1f081a1", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/namespacemembers.html b/ver-5.1.0/namespacemembers.html new file mode 100644 index 00000000..805196c6 --- /dev/null +++ b/ver-5.1.0/namespacemembers.html @@ -0,0 +1,623 @@ + + + + + + + +NCEPLIBS-ip: Module Members + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all documented module members with links to the modules they belong to:
    + +

    - a -

    + + +

    - b -

    + + +

    - c -

    + + +

    - d -

    + + +

    - e -

    + + +

    - f -

    + + +

    - g -

    + + +

    - h -

    + + +

    - i -

    + + +

    - j -

    + + +

    - k -

    + + +

    - l -

    + + +

    - m -

    + + +

    - n -

    + + +

    - o -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - u -

    + + +

    - y -

    +
    +
    + + + + diff --git a/ver-5.1.0/namespacemembers_func.html b/ver-5.1.0/namespacemembers_func.html new file mode 100644 index 00000000..e0a9651b --- /dev/null +++ b/ver-5.1.0/namespacemembers_func.html @@ -0,0 +1,394 @@ + + + + + + + +NCEPLIBS-ip: Module Members + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - e -

    + + +

    - f -

    + + +

    - g -

    + + +

    - i -

    + + +

    - l -

    + + +

    - m -

    + + +

    - p -

    + + +

    - r -

    + + +

    - u -

    +
    +
    + + + + diff --git a/ver-5.1.0/namespacemembers_vars.html b/ver-5.1.0/namespacemembers_vars.html new file mode 100644 index 00000000..91a1f6b9 --- /dev/null +++ b/ver-5.1.0/namespacemembers_vars.html @@ -0,0 +1,351 @@ + + + + + + + +NCEPLIBS-ip: Module Members + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - a -

    + + +

    - b -

    + + +

    - c -

    + + +

    - d -

    + + +

    - e -

    + + +

    - g -

    + + +

    - h -

    + + +

    - i -

    + + +

    - j -

    + + +

    - k -

    + + +

    - l -

    + + +

    - m -

    + + +

    - n -

    + + +

    - o -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - y -

    +
    +
    + + + + diff --git a/ver-5.1.0/namespaceneighbor__budget__interp__mod.html b/ver-5.1.0/namespaceneighbor__budget__interp__mod.html new file mode 100644 index 00000000..d2e059bc --- /dev/null +++ b/ver-5.1.0/namespaceneighbor__budget__interp__mod.html @@ -0,0 +1,532 @@ + + + + + + + +NCEPLIBS-ip: neighbor_budget_interp_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    neighbor_budget_interp_mod Module Reference
    +
    +
    + +

    Interpolate scalar fields (neighbor). +More...

    + + + + +

    +Data Types

    interface  interpolate_neighbor_budget
     
    + + + + + + + +

    +Functions/Subroutines

    subroutine interpolate_neighbor_budget_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Interpolate scalar fields (budget). More...
     
    subroutine interpolate_neighbor_budget_vector (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     Interpolate vector fields (budget). More...
     
    +

    Detailed Description

    +

    Interpolate scalar fields (neighbor).

    +
    Author
    Mark Iredell
    +
    Date
    96-04-10
    +

    Function/Subroutine Documentation

    + +

    ◆ interpolate_neighbor_budget_scalar()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine neighbor_budget_interp_mod::interpolate_neighbor_budget_scalar (integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    logical*1, dimension(mi,km), intent(in) LI,
    real, dimension(mi,km), intent(in) GI,
    integer, intent(out) NO,
    real, dimension(mo), intent(out) RLAT,
    real, dimension(mo), intent(out) RLON,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) GO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolate scalar fields (budget).

    +

    This subprogram performs budget interpolation from any grid to any grid for scalar fields.

    +

    The algorithm simply computes (weighted) averages of neighbor points arranged in a square box centered around each output grid point and stretching nearly halfway to each of the neighboring grid points.

    +

    Options allow choices of number of points in each radius from the center point (ipopt(1)) which defaults to 2 (if ipopt(1)=-1) meaning that 25 points will be averaged; further options are the respective weights for the radius points starting at the center point (ipopt(2:2+ipopt(1)) which defaults to all 1 (if ipopt(1)=-1 or ipopt(2)=-1).

    +

    Another option is the minimum percentage for mask, i.e. percent valid input data required to make output data, (ipopt(3+ipopt(1)) which defaults to 50 (if -1).

    +

    Only horizontal interpolation is performed.

    +

    The code recognizes the following projections, where "igdtnumi/o" is the grib 2 grid defintion template number for the input and output grids, respectively:

      +
    • (igdtnumi/o=00) equidistant cylindrical
    • +
    • (igdtnumi/o=01) rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • (igdtnumi/o=10) mercator cylindrical
    • +
    • (igdtnumi/o=20) polar stereographic azimuthal
    • +
    • (igdtnumi/o=30) lambert conformal conical
    • +
    • (igdtnumi/o=40) gaussian cylindrical
    • +
    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned. Input bitmaps will be interpolated to output bitmaps. Output bitmaps will also be created when the output grid extends outside of the domain of the input grid. The output field is set to 0 where the output bitmap is off.

    +

    +Program History Log

    + + + + + + + + + + + + + + + + + +
    Date Programmer Comments
    96-04-10 Iredell Initial
    96-10-04 Iredell neighbor points not bilinear interpolation
    1999-04-08 Iredell split ijkgds into two pieces
    2001-06-18 Iredell include minimum mask percentage option
    2015-01-27 Gayno replace calls to gdswiz with new merged version of gdswzd.
    2015-07-13 Gayno replace grib 1 kgds arrays with grib 2 grid definition template arrays.
    2023-05-04 Engle allow calls to GDSWZD for station points
    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]ipopt(20) interpolation options ipopt(1) is number of radius points (defaults to 2 if ipopt(1)=-1); ipopt(2:2+ipopt(1)) are respective weights (defaults to all 1 if ipopt(1)=-1 or ipopt(2)=-1). ipopt(3+ipopt(1)) is minimum percentage for mask (defaults to 50 if ipopt(3+ipopt(1)=-1)
    [in]grid_inThe input grid.
    [in]grid_outThe output grid.
    [in]miskip number between input grid fields if km>1 or dimension of input grid fields if km=1
    [in]moskip number between output grid fields if km>1 or dimension of output grid fields if km=1
    [in]kmnumber of fields to interpolate
    [in]ibi(km) input bitmap flags
    [in]li(mi,km) input bitmaps (if some ibi(k)=1)
    [in]gi(mi,km) input fields to interpolate
    [out]nonumber of output points
    [out]rlat(mo) output latitudes in degrees
    [out]rlon(mo) output longitudes in degrees
    [out]ibo(km) output bitmap flags
    [out]lo(mo,km) output bitmaps (always output)
    [out]go(mo,km) output fields interpolated
    [out]iretreturn code
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    • 31 invalid undefined output grid
    • +
    • 32 invalid budget method parameters
    • +
    +
    +
    +
    +
    Author
    Mark Iredell
    +
    Date
    96-04-10
    + +

    Definition at line 107 of file neighbor_budget_interp_mod.F90.

    + +
    +
    + +

    ◆ interpolate_neighbor_budget_vector()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine neighbor_budget_interp_mod::interpolate_neighbor_budget_vector (integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    logical*1, dimension(mi,km), intent(in) LI,
    real, dimension(mi,km), intent(in) UI,
    real, dimension(mi,km), intent(in) VI,
    integer, intent(out) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    real, dimension(mo), intent(out) CROT,
    real, dimension(mo), intent(out) SROT,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) UO,
    real, dimension(mo,km), intent(out) VO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolate vector fields (budget).

    +

    This subprogram performs budget interpolation from any grid to any grid for vector fields.

    +

    The algorithm simply computes (weighted) averages of neighbor points arranged in a square box centered around each output grid point and stretching nearly halfway to each of the neighboring grid points.

    +

    Options allow choices of number of points in each radius from the center point (ipopt(1)) which defaults to 2 (if ipopt(1)=-1) meaning that 25 points will be averaged; further options are the respective weights for the radius points starting at the center point (ipopt(2:2+ipopt(1)) which defaults to all 1 (if ipopt(1)=-1 or ipopt(2)=-1).

    +

    Another option is the minimum percentage for mask, i.e. percent valid input data required to make output data, (ipopt(3+ipopt(1)) which defaults to 50 (if -1).

    +

    Only horizontal interpolation is performed.

    +

    The input and output grids are defined by their grib 2 grid definition template as decoded by the ncep g2 library. the code recognizes the following projections, where "igdtnumi/o" is the grib 2 grid defintion template number for the input and output grids, respectively:

      +
    • (igdtnumi/o=00) equidistant cylindrical
    • +
    • (igdtnumi/o=01) rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • (igdtnumi/o=10) mercator cylindrical
    • +
    • (igdtnumi/o=20) polar stereographic azimuthal
    • +
    • (igdtnumi/o=30) lambert conformal conical
    • +
    • (igdtnumi/o=40) gaussian cylindrical
    • +
    +

    The input and output vectors are rotated so that they are either resolved relative to the defined grid in the direction of increasing x and y coordinates or resolved relative to easterly and northerly directions, as designated by their respective grid description sections.

    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned along with their vector rotation parameters. Input bitmaps will be interpolated to output bitmaps.

    +

    Output bitmaps will also be created when the output grid extends outside of the domain of the input grid. The output field is set to 0 where the output bitmap is off.

    +

    +Program History Log

    + + + + + + + + + + + + + + + + + +
    Date Programmer Comments
    96-04-10 Iredell Initial
    1999-04-08 Iredell split ijkgds into two pieces
    2001-06-18 Iredell include minimum mask percentage option
    2002-01-17 Iredell save data from last call for optimization
    2015-01-27 Gayno replace calls to gdswiz with new merged routine gdswzd.
    2015-07-13 Gayno replace grib 1 kgds arrays with grib 2 grid definition template arrays.
    2023-05-04 Engle allow calls to GDSWZD for station points
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + +
    [in]ipopt(20) interpolation options ipopt(1) is number of radius points (defaults to 2 if ipopt(1)=-1); ipopt(2:2+ipopt(1)) are respective weights (defaults to all 1 if ipopt(1)=-1 or ipopt(2)=-1). ipopt(3+ipopt(1)) is minimum percentage for mask (defaults to 50 if ipopt(3+ipopt(1)=-1)
    [in]grid_inThe input grid.
    [in]grid_outThe output grid.
    [in]miskip number between input grid fields if km>1 or dimension of input grid fields if km=1
    [in]moskip number between output grid fields if km>1 or dimension of output grid fields if km=1
    [in]kmnumber of fields to interpolate
    [in]ibi(km) input bitmap flags
    [in]li(mi,km) input bitmaps (if some ibi(k)=1)
    [in]ui(mi,km) input u-component fields to interpolate
    [in]vi(mi,km) input v-component fields to interpolate
    [out]nonumber of output points
    [out]rlat(mo) output latitudes in degrees
    [out]rlon(mo) output longitudes in degrees
    [out]crot(mo) vector rotation cosines
    [out]srot(mo) vector rotation sines (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]ibo(km) output bitmap flags
    [out]lo(mo,km) output bitmaps (always output)
    [out]uo(mo,km) output u-component fields interpolated
    [out]vo(mo,km) output v-component fields interpolated
    [out]iretreturn code
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    • 31 invalid undefined output grid
    • +
    • 32 invalid budget method parameters
    • +
    +
    +
    +
    +
    Author
    Mark Iredell
    +
    Date
    96-04-10
    +
    + +

    Definition at line 351 of file neighbor_budget_interp_mod.F90.

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespaceneighbor__budget__interp__mod.js b/ver-5.1.0/namespaceneighbor__budget__interp__mod.js new file mode 100644 index 00000000..86fa793e --- /dev/null +++ b/ver-5.1.0/namespaceneighbor__budget__interp__mod.js @@ -0,0 +1,6 @@ +var namespaceneighbor__budget__interp__mod = +[ + [ "interpolate_neighbor_budget", "interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget.html", "interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget" ], + [ "interpolate_neighbor_budget_scalar", "namespaceneighbor__budget__interp__mod.html#a6d5110a9e9facf8c3132ec27d6857817", null ], + [ "interpolate_neighbor_budget_vector", "namespaceneighbor__budget__interp__mod.html#a4309c1e6b7fc60ded40657fe6c72297e", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/namespaceneighbor__interp__mod.html b/ver-5.1.0/namespaceneighbor__interp__mod.html new file mode 100644 index 00000000..27d73b54 --- /dev/null +++ b/ver-5.1.0/namespaceneighbor__interp__mod.html @@ -0,0 +1,511 @@ + + + + + + + +NCEPLIBS-ip: neighbor_interp_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    neighbor_interp_mod Module Reference
    +
    +
    + +

    Interpolate scalar fields (neighbor). +More...

    + + + + +

    +Data Types

    interface  interpolate_neighbor
     
    + + + + + + + +

    +Functions/Subroutines

    subroutine interpolate_neighbor_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Interpolate scalar fields (neighbor). More...
     
    subroutine interpolate_neighbor_vector (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     Interpolate vector fields (neighbor). More...
     
    +

    Detailed Description

    +

    Interpolate scalar fields (neighbor).

    +

    +Program History Log

    + + + + + + + + + + + + + + + + + + + +
    Date Programmer Comments
    96-04-10 Iredell initial
    1999-04-08 Iredell split ijkgds into two pieces
    2001-06-18 Iredell include spiral search option
    2006-01-04 Gayno minor bug fix
    2007-10-30 Iredell save weights and thread for performance
    2012-06-26 Gayno fix out-of-bounds error. see nceplibs ticket #9.
    2015-01-27 Gayno replace calls to gdswiz() with new merged version of gdswzd().
    2015-07-13 Gayno replace grib 1 kgds arrays with grib 2 grid definition template arrays.
    +
    Author
    Mark Iredell
    +
    Date
    96-04-10
    +

    Function/Subroutine Documentation

    + +

    ◆ interpolate_neighbor_scalar()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine neighbor_interp_mod::interpolate_neighbor_scalar (integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    logical*1, dimension(mi,km), intent(in) LI,
    real, dimension(mi,km), intent(in) GI,
    integer, intent(inout) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) GO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolate scalar fields (neighbor).

    +

    This subprogram performs neighbor interpolation from any grid to any grid for scalar fields.

    +

    Options allow choosing the width of the grid square (ipopt(1)) to search for valid data, which defaults to 1 (if ipopt(1)=-1). Odd width squares are centered on the nearest input grid point; even width squares are centered on the nearest four input grid points. Squares are searched for valid data in a spiral pattern starting from the center. No searching is done where the output grid is outside the input grid. Only horizontal interpolation is performed.

    +

    The code recognizes the following projections, where "igdtnumi/o" is the grib 2 grid defintion template number for the input and output grids, respectively:

      +
    • (igdtnumi/o=00) equidistant cylindrical
    • +
    • (igdtnumi/o=01) rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • (igdtnumi/o=10) mercator cylindrical
    • +
    • (igdtnumi/o=20) polar stereographic azimuthal
    • +
    • (igdtnumi/o=30) lambert conformal conical
    • +
    • (igdtnumi/o=40) gaussian cylindrical
    • +
    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned. On the other hand, the output can be a set of station points if igdtnumo<0, in which case the number of points and their latitudes and longitudes must be input.

    +

    Input bitmaps will be interpolated to output bitmaps.

    +

    Output bitmaps will also be created when the output grid extends outside of the domain of the input grid. The output field is set to 0 where the output bitmap is off.

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    [in]ipopt(20) interpolation options ipopt(1) is width of square to examine in spiral search (defaults to 1 if ipopt(1)=-1)
    [in]grid_inThe input grid.
    [in]grid_outThe output grid.
    [in]miskip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moskip number between output grid fields if km>1 or dimension of output grid fields if km=1
    [in]kmnumber of fields to interpolate
    [in]ibi(km) input bitmap flags
    [in]li(mi,km) input bitmaps (if some ibi(k)=1)
    [in]gi(mi,km) input fields to interpolate
    [in,out]nonumber of output points (only if igdtnumo<0)
    [in,out]rlat(no) output latitudes in degrees (if igdtnumo<0)
    [in,out]rlon(no) output longitudes in degrees (if igdtnumo<0)
    [out]ibo(km) output bitmap flags
    [out]lo(mo,km) output bitmaps (always output)
    [out]go(mo,km) output fields interpolated
    [out]iretreturn code
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    +
    +
    +
    +
    Author
    Mark Iredell
    +
    Date
    96-04-10
    +
    Author
    Eric Engle
    +
    Date
    23-05-04
    + +

    Definition at line 100 of file neighbor_interp_mod.F90.

    + +
    +
    + +

    ◆ interpolate_neighbor_vector()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine neighbor_interp_mod::interpolate_neighbor_vector (integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    logical*1, dimension(mi,km), intent(in) LI,
    real, dimension(mi,km), intent(in) UI,
    real, dimension(mi,km), intent(in) VI,
    integer, intent(inout) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    real, dimension(mo), intent(inout) CROT,
    real, dimension(mo), intent(inout) SROT,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) UO,
    real, dimension(mo,km), intent(out) VO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolate vector fields (neighbor).

    +

    This subprogram performs neighbor interpolation from any grid to any grid for vector fields.

    +

    Options allow choosing the width of the grid square (ipopt(1)) to search for valid data, which defaults to 1 (IF IPOPT(1)=-1). Odd width squares are centered on the nearest input grid point; even width squares are centered on the nearest four input grid points.

    +

    Squares are searched for valid data in a spiral pattern starting from the center. no searching is done where the output grid is outside the input grid. Only horizontal interpolation is performed.

    +

    The input and output grids are defined by their grib 2 grid definition template as decoded by the ncep g2 library.

    +

    The code recognizes the following projections, where "igdtnumi/o" is the grib 2 grid defintion template number for the input and output grids, respectively:

      +
    • (igdtnumi/o=00) equidistant cylindrical
    • +
    • (igdtnumi/o=01) rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • (igdtnumi/o=10) mercator cylindrical
    • +
    • (igdtnumi/o=20) polar stereographic azimuthal
    • +
    • (igdtnumi/o=30) lambert conformal conical
    • +
    • (igdtnumi/o=40) gaussian cylindrical
    • +
    +

    The input and output vectors are rotated so that they are either resolved relative to the defined grid in the direction of increasing x and y coordinates or resolved relative to easterly and northerly directions, as designated by their respective grid definition sections.

    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned along with their vector rotation parameters. On the other hand, the output can be a set of station points if igdtnumo<0, in which case the number of points and their latitudes and longitudes must be input along with their vector rotation parameters.

    +

    Input bitmaps will be interpolated to output bitmaps. output bitmaps will also be created when the output grid extends outside of the domain of the input grid. The output field is set to 0 where the output bitmap is off.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + +
    [in]ipopt(20) interpolation options ipopt(1) is width of square to examine in spiral search (defaults to 1 if ipopt(1)=-1)
    [in]grid_inThe input grid.
    [in]grid_outThe output grid.
    [in]miskip number between input grid fields if km>1 or dimension of input grid fields if km=1
    [in]moskip number between output grid fields if km>1 or dimension of output grid fields if km=1
    [in]kmnumber of fields to interpolate
    [in]ibi(km) input bitmap flags
    [in]li(mi,km) input bitmaps (if some ibi(k)=1)
    [in]ui(mi,km) input u-component fields to interpolate
    [in]vi(mi,km) input v-component fields to interpolate
    [in,out]nonumber of output points (only if igdtnumo>=0)
    [in,out]rlat(mo) output latitudes in degrees (if igdtnumo<0)
    [in,out]rlon(mo) output longitudes in degrees (if igdtnumo<0)
    [in,out]crot(mo) vector rotation cosines (if igdtnumo<0)
    [in,out]srot(mo) vector rotation sines (if igdtnumo<0) (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]ibo(km) output bitmap flags
    [out]lo(mo,km) output bitmaps (always output)
    [out]uo(mo,km) output u-component fields interpolated
    [out]vo(mo,km) output v-component fields interpolated
    [out]iretreturn code
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    +
    +
    +
    +
    Author
    Mark Iredell
    +
    Date
    96-04-10
    +
    Author
    Eric Engle
    +
    Date
    23-05-04
    + +

    Definition at line 352 of file neighbor_interp_mod.F90.

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespaceneighbor__interp__mod.js b/ver-5.1.0/namespaceneighbor__interp__mod.js new file mode 100644 index 00000000..2e4123af --- /dev/null +++ b/ver-5.1.0/namespaceneighbor__interp__mod.js @@ -0,0 +1,6 @@ +var namespaceneighbor__interp__mod = +[ + [ "interpolate_neighbor", "interfaceneighbor__interp__mod_1_1interpolate__neighbor.html", "interfaceneighbor__interp__mod_1_1interpolate__neighbor" ], + [ "interpolate_neighbor_scalar", "namespaceneighbor__interp__mod.html#a78452d1527c6974ad54091f0318e4b1f", null ], + [ "interpolate_neighbor_vector", "namespaceneighbor__interp__mod.html#a744ccffd8cd6c13d360e634db4851756", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/namespacepolfix__mod.html b/ver-5.1.0/namespacepolfix__mod.html new file mode 100644 index 00000000..57c2d849 --- /dev/null +++ b/ver-5.1.0/namespacepolfix__mod.html @@ -0,0 +1,290 @@ + + + + + + + +NCEPLIBS-ip: polfix_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    polfix_mod Module Reference
    +
    +
    + +

    Make multiple pole scalar values consistent. +More...

    + + + + + + + + +

    +Functions/Subroutines

    subroutine, public polfixs (NM, NX, KM, RLAT, IB, LO, GO)
     Make multiple pole scalar values consistent. More...
     
    subroutine, public polfixv (NM, NX, KM, RLAT, RLON, IB, LO, UO, VO)
     Make multiple pole vector values consistent,. More...
     
    +

    Detailed Description

    +

    Make multiple pole scalar values consistent.

    +
    Author
    Iredell, Kyle Gerheiser
    +

    Function/Subroutine Documentation

    + +

    ◆ polfixs()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine, public polfix_mod::polfixs (integer, intent(in) NM,
    integer, intent(in) NX,
    integer, intent(in) KM,
    real, dimension(nm), intent(in) RLAT,
    integer, dimension(km), intent(in) IB,
    logical*1, dimension(nx,km), intent(inout) LO,
    real, dimension(nx,km), intent(inout) GO 
    )
    +
    + +

    Make multiple pole scalar values consistent.

    +

    This subprogram averages multiple pole scalar values on a latitude/longitude grid. Bitmaps may be averaged too.

    +
    Parameters
    + + + + + + + + +
    [in]nminteger number of grid points
    [in]nxinteger leading dimension of fields
    [in]kminteger number of fields
    [in]rlatreal (no) latitudes in degrees
    [in]ibinteger (km) bitmap flags
    [out]lological*1 (nx,km) bitmaps (if some ib(k)=1)
    [out]goreal (nx,km) fields
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    + +

    Definition at line 29 of file polfix_mod.F90.

    + +

    Referenced by bicubic_interp_mod::interpolate_bicubic::interpolate_bicubic_scalar(), bilinear_interp_mod::interpolate_bilinear::interpolate_bilinear_scalar(), budget_interp_mod::interpolate_budget::interpolate_budget_scalar(), neighbor_budget_interp_mod::interpolate_neighbor_budget::interpolate_neighbor_budget_scalar(), and neighbor_interp_mod::interpolate_neighbor::interpolate_neighbor_scalar().

    + +
    +
    + +

    ◆ polfixv()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine, public polfix_mod::polfixv (integer, intent(in) NM,
    integer, intent(in) NX,
    integer, intent(in) KM,
    real, dimension(nm), intent(in) RLAT,
    real, dimension(nm), intent(in) RLON,
    integer, dimension(km), intent(in) IB,
    logical*1, dimension(nx,km), intent(inout) LO,
    real, dimension(nx,km), intent(inout) UO,
    real, dimension(nx,km), intent(inout) VO 
    )
    +
    + +

    Make multiple pole vector values consistent,.

    +

    This subprogram averages multiple pole vector values on a latitude/longitude grid. Bitmaps may be averaged too. Vectors are rotated with respect to their longitude.

    +
    Parameters
    + + + + + + + + + + +
    [in]nminteger number of grid points
    [in]nxinteger leading dimension of fields
    [in]kminteger number of fields
    [in]rlatreal (nm) latitudes in degrees
    [in]rlonreal (nm) longitudes in degrees
    [in]ibinteger (km) bitmap flags
    [in,out]lological*1 (nx,km) bitmaps (if some ib(k)=1)
    [in,out]uoreal (nx,km) u-winds
    [in,out]voreal (nx,km) v-winds
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    + +

    Definition at line 124 of file polfix_mod.F90.

    + +

    Referenced by bicubic_interp_mod::interpolate_bicubic::interpolate_bicubic_vector(), bilinear_interp_mod::interpolate_bilinear::interpolate_bilinear_vector(), budget_interp_mod::interpolate_budget::interpolate_budget_vector(), neighbor_budget_interp_mod::interpolate_neighbor_budget::interpolate_neighbor_budget_vector(), and neighbor_interp_mod::interpolate_neighbor::interpolate_neighbor_vector().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespaces.html b/ver-5.1.0/namespaces.html new file mode 100644 index 00000000..7edb8180 --- /dev/null +++ b/ver-5.1.0/namespaces.html @@ -0,0 +1,159 @@ + + + + + + + +NCEPLIBS-ip: Modules List + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules List
    +
    +
    +
    Here is a list of all documented modules with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     Nbicubic_interp_modBicubic interpolation routines for scalars and vectors
     Cinterpolate_bicubic
     Nbilinear_interp_modBilinear interpolation routines for scalars and vectors
     Cinterpolate_bilinear
     Nbudget_interp_modBudget interpolation routines for scalars and vectors
     Cinterpolate_budget
     Nearth_radius_modDetermine earth radius and shape
     Ngdswzd_c_modModule that contains C wrapper for routine gdswzd()
     Ngdswzd_modDriver module for gdswzd routines
     Cgdswzd
     Nip_constants_modModule containing common constants
     Nip_equid_cylind_grid_modEquidistant cylindrical grib decoder and grid coordinate transformations
     Cip_equid_cylind_grid
     Nip_gaussian_grid_modGaussian grid coordinate transformations
     Cip_gaussian_grid
     Nip_grid_descriptor_modUsers derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions
     Cgrib1_descriptorDescriptor representing a grib1 grib descriptor section (GDS) with an integer array
     Cgrib2_descriptorGrib-2 descriptor containing a grib2 GDT represented by an integer array
     Cinit_descriptor
     Cip_grid_descriptorAbstract descriptor object which represents a grib1 or grib2 descriptor
     Coperator(==)
     Nip_grid_factory_modRoutines for creating an ip_grid given a Grib descriptor
     Cinit_grid
     Nip_grid_modAbstract ip_grid type
     Cgdswzd_interface
     Cinit_grib1_interface
     Cinit_grib2_interface
     Cip_gridAbstract grid that holds fields and methods common to all grids
     Coperator(==)Check equality
     Nip_grids_modRe-export the individual grids
     Nip_interpolators_modTop-level module to export interpolation routines and constants
     Nip_lambert_conf_grid_modLambert conformal grib decoder and grid coordinate transformations
     Cip_lambert_conf_grid
     Nip_mercator_grid_modGDS wizard for mercator cylindrical
     Cip_mercator_grid
     Nip_modTop-level module for the ip library which re-exports public routines such as ipolates, ipolatev, and gdswzd
     Nip_polar_stereo_grid_modGDS wizard for polar stereographic azimuthal
     Cip_polar_stereo_grid
     Nip_rot_equid_cylind_egrid_modRotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grid E
     Cip_rot_equid_cylind_egrid
     Nip_rot_equid_cylind_grid_modRotated equidistant cylindrical GRIB decoder and grid coordinate transformations for Arakawa grids A through D
     Cip_rot_equid_cylind_grid
     Nip_station_points_grid_modInterpolate gridded data to a series of station points
     Cip_station_points_grid
     Nipolates_modTop-level driver for scalar interpolation interpolation routine ipolates()
     Cipolates
     Nipolatev_modTop-level driver for vector interpolation interpolation routine ipolatev()
     Cipolatev
     Nneighbor_budget_interp_modInterpolate scalar fields (neighbor)
     Cinterpolate_neighbor_budget
     Nneighbor_interp_modInterpolate scalar fields (neighbor)
     Cinterpolate_neighbor
     Npolfix_modMake multiple pole scalar values consistent
     Nspectral_interp_modInterpolate spectral
     Cinterpolate_spectral
     Cpolates4
     Cpolatev4
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespaces_dup.js b/ver-5.1.0/namespaces_dup.js new file mode 100644 index 00000000..703939f4 --- /dev/null +++ b/ver-5.1.0/namespaces_dup.js @@ -0,0 +1,52 @@ +var namespaces_dup = +[ + [ "bicubic_interp_mod", "namespacebicubic__interp__mod.html", "namespacebicubic__interp__mod" ], + [ "bilinear_interp_mod", "namespacebilinear__interp__mod.html", "namespacebilinear__interp__mod" ], + [ "budget_interp_mod", "namespacebudget__interp__mod.html", "namespacebudget__interp__mod" ], + [ "earth_radius_mod", "namespaceearth__radius__mod.html", [ + [ "earth_radius", "namespaceearth__radius__mod.html#a810f60db1a1faff0d6f59937a8207a54", null ] + ] ], + [ "gdswzd_c_mod", "namespacegdswzd__c__mod.html", [ + [ "gdswzd_c", "namespacegdswzd__c__mod.html#ae3026381f7f41561507c97c9125d24e4", null ], + [ "gdswzd_c_grib1", "namespacegdswzd__c__mod.html#a06861f1403edf106bb3b399c39981504", null ] + ] ], + [ "gdswzd_mod", "namespacegdswzd__mod.html", "namespacegdswzd__mod" ], + [ "ip_constants_mod", "namespaceip__constants__mod.html", [ + [ "dpr", "namespaceip__constants__mod.html#ae6b74489db06341b78c3088b3f207011", null ], + [ "e2_wgs84", "namespaceip__constants__mod.html#af7783a977fa10c54d85282dc6ac5f545", null ], + [ "pi", "namespaceip__constants__mod.html#a47f83a2267da693170054c958c401cd4", null ], + [ "pi2", "namespaceip__constants__mod.html#a309f7e3b1f83b6b272b12ce4fff501c5", null ], + [ "pi4", "namespaceip__constants__mod.html#a5fe7cdd86b44487666dc37f655d9ff15", null ], + [ "rerth_wgs84", "namespaceip__constants__mod.html#ac6a501512f426673f064edbecd7a62fb", null ] + ] ], + [ "ip_equid_cylind_grid_mod", "namespaceip__equid__cylind__grid__mod.html", "namespaceip__equid__cylind__grid__mod" ], + [ "ip_gaussian_grid_mod", "namespaceip__gaussian__grid__mod.html", "namespaceip__gaussian__grid__mod" ], + [ "ip_grid_descriptor_mod", "namespaceip__grid__descriptor__mod.html", "namespaceip__grid__descriptor__mod" ], + [ "ip_grid_factory_mod", "namespaceip__grid__factory__mod.html", "namespaceip__grid__factory__mod" ], + [ "ip_grid_mod", "namespaceip__grid__mod.html", "namespaceip__grid__mod" ], + [ "ip_grids_mod", "namespaceip__grids__mod.html", null ], + [ "ip_interpolators_mod", "namespaceip__interpolators__mod.html", [ + [ "bicubic_interp_id", "namespaceip__interpolators__mod.html#adfdc7760718083d85618df85320c495e", null ], + [ "bilinear_interp_id", "namespaceip__interpolators__mod.html#a753e4b6c113a9a8b226c3c834786f3e1", null ], + [ "budget_interp_id", "namespaceip__interpolators__mod.html#a7df843ca4a64e3178f448aebf7dad359", null ], + [ "neighbor_budget_interp_id", "namespaceip__interpolators__mod.html#ae77a1da241f5de94f1874004ee8e715c", null ], + [ "neighbor_interp_id", "namespaceip__interpolators__mod.html#a35e5fe3a2dd79d205c0503f550388258", null ], + [ "spectral_interp_id", "namespaceip__interpolators__mod.html#a83ba2963a0b686c6ae67b53f9c385851", null ] + ] ], + [ "ip_lambert_conf_grid_mod", "namespaceip__lambert__conf__grid__mod.html", "namespaceip__lambert__conf__grid__mod" ], + [ "ip_mercator_grid_mod", "namespaceip__mercator__grid__mod.html", "namespaceip__mercator__grid__mod" ], + [ "ip_mod", "namespaceip__mod.html", null ], + [ "ip_polar_stereo_grid_mod", "namespaceip__polar__stereo__grid__mod.html", "namespaceip__polar__stereo__grid__mod" ], + [ "ip_rot_equid_cylind_egrid_mod", "namespaceip__rot__equid__cylind__egrid__mod.html", "namespaceip__rot__equid__cylind__egrid__mod" ], + [ "ip_rot_equid_cylind_grid_mod", "namespaceip__rot__equid__cylind__grid__mod.html", "namespaceip__rot__equid__cylind__grid__mod" ], + [ "ip_station_points_grid_mod", "namespaceip__station__points__grid__mod.html", "namespaceip__station__points__grid__mod" ], + [ "ipolates_mod", "namespaceipolates__mod.html", "namespaceipolates__mod" ], + [ "ipolatev_mod", "namespaceipolatev__mod.html", "namespaceipolatev__mod" ], + [ "neighbor_budget_interp_mod", "namespaceneighbor__budget__interp__mod.html", "namespaceneighbor__budget__interp__mod" ], + [ "neighbor_interp_mod", "namespaceneighbor__interp__mod.html", "namespaceneighbor__interp__mod" ], + [ "polfix_mod", "namespacepolfix__mod.html", [ + [ "polfixs", "namespacepolfix__mod.html#a15df1ba2e1fcad1e9465c4aa3a2ba0d6", null ], + [ "polfixv", "namespacepolfix__mod.html#aeefc8f045777f6d962d9ec539ef6007d", null ] + ] ], + [ "spectral_interp_mod", "namespacespectral__interp__mod.html", "namespacespectral__interp__mod" ] +]; \ No newline at end of file diff --git a/ver-5.1.0/namespacespectral__interp__mod.html b/ver-5.1.0/namespacespectral__interp__mod.html new file mode 100644 index 00000000..a63c289f --- /dev/null +++ b/ver-5.1.0/namespacespectral__interp__mod.html @@ -0,0 +1,1273 @@ + + + + + + + +NCEPLIBS-ip: spectral_interp_mod Module Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    spectral_interp_mod Module Reference
    +
    +
    + +

    Interpolate spectral. +More...

    + + + + + + + + +

    +Data Types

    interface  interpolate_spectral
     
    interface  polates4
     
    interface  polatev4
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine interpolate_spectral_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Interpolate spectral scalar. More...
     
    subroutine interpolate_spectral_vector (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     Interpolate spectral vector. More...
     
    subroutine polates4_grib1 (IPOPT, KGDSI, KGDSO, MI, MO, KM, IBI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Interpolate scalar fields (spectral). More...
     
    subroutine polates4_grib2 (IPOPT, IGDTNUMI, IGDTMPLI, IGDTLENI, IGDTNUMO, IGDTMPLO, IGDTLENO, MI, MO, KM, IBI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Interpolate scalar fields (spectral). More...
     
    subroutine polatev4_grib1 (IPOPT, KGDSI, KGDSO, MI, MO, KM, IBI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     Interpolate vector fields (spectral). More...
     
    subroutine polatev4_grib2 (IPOPT, IGDTNUMI, IGDTMPLI, IGDTLENI, IGDTNUMO, IGDTMPLO, IGDTLENO, MI, MO, KM, IBI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     Interpolate vector fields (spectral). More...
     
    +

    Detailed Description

    +

    Interpolate spectral.

    +
    Author
    Mark Iredell
    +
    Date
    96-04-10
    +

    Function/Subroutine Documentation

    + +

    ◆ interpolate_spectral_scalar()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spectral_interp_mod::interpolate_spectral_scalar (integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    real, dimension(mi,km), intent(in) GI,
    integer, intent(out) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) GO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolate spectral scalar.

    +
    Parameters
    + + + + + + + + + + + + + + + + +
    [in]ipoptinterpolation options; ipopt(1)=0 for triangular; ipopt(1)=1 for rhomboidal; ipopt(2) is truncation number (defaults to a sensible truncation if ipopt(2)=-1).
    [in]grid_ininput grid descriptor.
    [in]grid_outoutput grid descriptor.
    [in]MIskip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]MOskip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]KMnumber of fields to interpolate.
    [in]IBIinput bitmap flags (Must be all 0. Routine does not do bitmapped interpolation.)
    [in]GIinput fields to interpolate.
    [out]NOnumber of output points.
    [in,out]RLAToutput latitudes in degrees.
    [in,out]RLONoutput longitudes in degrees.
    [out]IBOoutput bitmap flags.
    [out]LOoutput bitmaps.
    [out]GOoutput fields interpolated.
    [out]IRETreturn code. 0/non-0 - successful/not successful.
    +
    +
    +
    Author
    Mark Iredell
    +
    Date
    96-04-10
    + +

    Definition at line 61 of file spectral_interp_mod.F90.

    + +
    +
    + +

    ◆ interpolate_spectral_vector()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spectral_interp_mod::interpolate_spectral_vector (integer, dimension(20), intent(in) IPOPT,
    class(ip_grid), intent(in) grid_in,
    class(ip_grid), intent(in) grid_out,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    real, dimension(mi,km), intent(in) UI,
    real, dimension(mi,km), intent(in) VI,
    integer, intent(out) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    real, dimension(mo), intent(out) CROT,
    real, dimension(mo), intent(out) SROT,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) UO,
    real, dimension(mo,km), intent(out) VO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolate spectral vector.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + +
    ipoptinterpolation options; ipopt(1)=0 for triangular; ipopt(1)=1 for rhomboidal; ipopt(2) is truncation number (defaults to a sensible truncation if ipopt(2)=-1).
    grid_ininput grid descriptor.
    grid_outoutput grid descriptor.
    MIskip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    MOskip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    KMnumber of fields to interpolate.
    IBIinput bitmap flags (Must be all 0. Routine does not do bitmapped interpolation.)
    UIinput u-component fields to interpolate.
    VIinput v-component fields to interpolate.
    NOnumber of output points.
    RLAToutput latitudes in degrees.
    RLONoutput longitudes in degrees.
    CROTvector rotation cosines.
    SROTvector rotation sines.
    IBOoutput bitmap flags.
    LOoutput bitmaps.
    UOoutput u-component fields interpolated.
    VOoutput v-component fields interpolated.
    IRETreturn code. 0/non-0 - successful/not successful.
    +
    +
    +
    Author
    Mark Iredell
    +
    Date
    96-04-10
    + +

    Definition at line 122 of file spectral_interp_mod.F90.

    + +
    +
    + +

    ◆ polates4_grib1()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spectral_interp_mod::polates4_grib1 (integer, dimension(20), intent(in) IPOPT,
    integer, dimension(200), intent(in) KGDSI,
    integer, dimension(200), intent(in) KGDSO,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    real, dimension(mi,km), intent(in) GI,
    integer NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) GO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolate scalar fields (spectral).

    +

    This subprogram performs spectral interpolation from any grid to any grid for scalar fields. It requires that the input fields be uniformly global.

    +

    Options allow choices between triangular shape (ipopt(1)=0) and rhomboidal shape (ipopt(1)=1) which has no default; a second option is the truncation (ipopt(2)) which defaults to a sensible truncation for the input grid (if opt(2)=-1).

    +
    Note
    If the output grid is not found in a special list, then the transform back to grid is not very fast. This special list contains global cylindrical grids, polar stereographic grids centered at the pole and mercator grids.
    +

    Only horizontal interpolation is performed. The grids are defined by their grid description sections (passed in integer form as decoded by subprogram w3fi63()).

    +

    The current code recognizes the following projections:

      +
    • kgds(1) = 000 equidistant cylindrical
    • +
    • kgds(1) = 001 mercator cylindrical
    • +
    • kgds(1) = 003 lambert conformal conical
    • +
    • kgds(1) = 004 gaussian cylindrical (spectral native)
    • +
    • kgds(1) = 005 polar stereographic azimuthal
    • +
    • kgds(1) = 203 rotated equidistant cylindrical (e-stagger)
    • +
    • kgds(1) = 205 rotated equidistant cylindrical (b-stagger)
    • +
    +

    Where kgds could be either input kgdsi or output kgdso. As an added bonus the number of output grid points and their latitudes and longitudes are also returned. On the other hand, the output can be a set of station points if kgdso(1)<0, in which case the number of points and their latitudes and longitudes must be input. Output bitmaps will not be created.

    +

    +Program History Log

    + + + + + + + + + +
    Date Programmer Comments
    96-04-10 Iredell Initial
    2001-06-18 Iredell improve detection of special fast transform
    2015-01-27 Gayno replace calls to gdswiz() with new merged version of gdswzd().
    +
    Parameters
    + + + + + + + + + + + + + + + + +
    [in]ipopt(20) interpolation options ipopt(1)=0 for triangular, ipopt(1)=1 for rhomboidal; ipopt(2) is truncation number (defaults to sensible if ipopt(2)=-1).
    [in]kgdsi(200) input gds parameters as decoded by w3fi63
    [in]kgdso(200) output gds parameters (kgdso(1)<0 implies random station points)
    [in]miskip number between input grid fields if km>1 or dimension of input grid fields if km=1
    [in]moskip number between output grid fields if km>1 or dimension of output grid fields if km=1
    [in]kmnumber of fields to interpolate
    [in]ibi(km) input bitmap flags (must be all 0)
    [in]gi(mi,km) input fields to interpolate
    [out]nonumber of output points (only if kgdso(1)<0)
    [out]rlat(no) output latitudes in degrees (if kgdso(1)<0)
    [out]rlon(no) output longitudes in degrees (if kgdso(1)<0)
    [out]ibo(km) output bitmap flags
    [out]lo(mo,km) output bitmaps (always output)
    [out]go(mo,km) output fields interpolated
    [out]iretreturn code
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    • 41 invalid nonglobal input grid
    • +
    • 42 invalid spectral method parameters
    • +
    +
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-04-10
    + +

    Definition at line 560 of file spectral_interp_mod.F90.

    + +
    +
    + +

    ◆ polates4_grib2()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spectral_interp_mod::polates4_grib2 (integer, dimension(20), intent(in) IPOPT,
    integer, intent(in) IGDTNUMI,
    integer, dimension(igdtleni), intent(in) IGDTMPLI,
    integer, intent(in) IGDTLENI,
    integer, intent(in) IGDTNUMO,
    integer, dimension(igdtleno), intent(in) IGDTMPLO,
    integer, intent(in) IGDTLENO,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    real, dimension(mi,km), intent(in) GI,
    integer, intent(out) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) GO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolate scalar fields (spectral).

    +

    This subprogram performs spectral interpolation from any grid to any grid for scalar fields. It requires that the input fields be uniformly global. Options allow choices between triangular shape (ipopt(1)=0) and rhomboidal shape (ipopt(1)=1) which has no default; a second option is the truncation (ipopt(2)) which defaults to a sensible truncation for the input grid (if opt(2)=-1).

    +
    Note
    If the output grid is not found in a special list, then the transform back to grid is not very fast. This special list contains global cylindrical grids, polar stereographic grids centered at the pole and mercator grids.
    +

    Only horizontal interpolation is performed.

    +

    The code recognizes the following projections, where "igdtnumi/o" is the GRIB2 grid defintion template number for the input and onutput grids, respectively:

      +
    • igdtnumi/o = 00 equidistant cylindrical
    • +
    • igdtnumo = 01 rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • igdtnumo = 10 mercator cylindrical
    • +
    • igdtnumo = 20 polar stereographic azimuthal
    • +
    • igdtnumo = 30 lambert conformal conical
    • +
    • igdtnumi/o = 40 gaussian cylindrical
    • +
    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned. On the other hand, the output can be a set of station points if igdtnumo < 0, in which case the number of points and their latitudes and longitudes must be input. Output bitmaps will not be created.

    +

    +Program History Log

    + + + + + + + + + + + +
    Date Programmer Comments
    96-04-10 Iredell initial
    2001-06-18 Iredell improve detection of special fast transform
    2015-01-27 Gayno replace calls to gdswiz with new merged version of gdswzd.
    2015-07-13 Gayno convert to grib 2. replace grib 1 kgds arrays with grib 2 grid definition template arrays.
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + +
    [in]ipopt(20) interpolation options; ipopt(1)=0 for triangular, ipopt(1)=1 for rhomboidal; ipopt(2) is truncation number (defaults to sensible if ipopt(2)=-1).
    [in]igdtnumigrid definition template number - input grid. Corresponds to the gfldigdtnum component of the NCEPLIBS-g2 library gridmod data structure.
      +
    • 00 - equidistant cylindrical
    • +
    • 01 - rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • 10 - mercator cyclindrical
    • +
    • 20 - polar stereographic azimuthal
    • +
    • 30 - lambert conformal conical
    • +
    • 40 - gaussian equidistant cyclindrical
    • +
    +
    [in]igdtmpli(igdtleni) grid definition template array - input grid. corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure: (section 3 info). See comments in routine ipolates() for complete definition.
    [in]igdtleninumber of elements of the grid definition template array - input grid. corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]igdtnumogrid definition template number - output grid. Corresponds to the gfldigdtnum component of the NCEPLIBS-g2 library gridmod data structure. igdtnumo<0 means interpolate to random station points. Otherwise, same definition as igdtnumi.
    [in]igdtmplo(igdtleno) grid definition template array - output grid. Corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure (section 3 info). See comments in routine ipolates() for complete definition.
    [in]igdtlenonumber of elements of the grid definition template array - output grid. Corresponds to the gfldigdtlen component of the [NCEPLIBS-g2](https://github.com/NOAA-EMC/NCEPLIBS-g2) library gridmod data structure.
    [in]miskip number between input grid fields if km>1 or dimension of input grid fields if km=1
    [in]moskip number between output grid fields if km>1 or dimension of output grid fields if km=1
    [out]kmnumber of fields to interpolate
    [out]ibi(km) input bitmap flags (must be all 0)
    [out]gi(mi,km) input fields to interpolate
    [out]nonumber of output points (only if igdtnumo>=0)
    [out]rlat(mo) output latitudes in degrees (if igdtnumo<0)
    [out]rlon(mo) output longitudes in degrees (if igdtnumo<0)
    [out]ibo(km) output bitmap flags
    [out]lo(mo,km) output bitmaps (always output)
    [out]go(mo,km) output fields interpolated
    [out]iretreturn code
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    • 41 invalid nonglobal input grid
    • +
    • 42 invalid spectral method parameters
    • +
    +
    +
    +
    +

    !

    Author
    Mark Iredell
    +
    Date
    96-04-10
    + +

    Definition at line 255 of file spectral_interp_mod.F90.

    + +
    +
    + +

    ◆ polatev4_grib1()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spectral_interp_mod::polatev4_grib1 (integer, dimension(20), intent(in) IPOPT,
    integer, dimension(200), intent(in) KGDSI,
    integer, dimension(200), intent(in) KGDSO,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    real, dimension(mi,km), intent(in) UI,
    real, dimension(mi,km), intent(in) VI,
    integer NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    real, dimension(mo), intent(out) CROT,
    real, dimension(mo), intent(out) SROT,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) UO,
    real, dimension(mo,km), intent(out) VO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolate vector fields (spectral).

    +

    This subprogram performs spectral interpolation from any grid to any grid for vector fields. It requires that the input fields be uniformly global. Options allow choices between triangular shape (ipopt(1)=0) and rhomboidal shape (ipopt(1)=1) which has no default; a second option is the truncation (ipopt(2)) which defaults to a sensible truncation for the input grid (if opt(2)=-1).

    +
    Note
    If the output grid is not found in a special list, then the transform back to grid is not very fast. This special list contains global cylindrical grids, polar stereographic grids centered at the pole and mercator grids.
    +

    Only horizontal interpolation is performed. The grids are defined by their grid description sections (passed in integer form as decoded by subprogram w3fi63).

    +

    The current code recognizes the following projections:

      +
    • (KGDS(1)=000) EQUIDISTANT CYLINDRICAL
    • +
    • (KGDS(1)=001) MERCATOR CYLINDRICAL
    • +
    • (KGDS(1)=003) LAMBERT CONFORMAL CONICAL
    • +
    • (KGDS(1)=004) GAUSSIAN CYLINDRICAL (SPECTRAL NATIVE)
    • +
    • (KGDS(1)=005) POLAR STEREOGRAPHIC AZIMUTHAL
    • +
    • (KGDS(1)=203) ROTATED EQUIDISTANT CYLINDRICAL (E-STAGGER)
    • +
    • (KGDS(1)=205) ROTATED EQUIDISTANT CYLINDRICAL (B-STAGGER)
    • +
    +

    Where kgds could be either input kgdsi or output kgdso.

    +

    The input and output vectors are rotated so that they are either resolved relative to the defined grid in the direction of increasing x and y coordinates or resolved relative to easterly and northerly directions, as designated by their respective grid description sections. As an added bonus the number of output grid points and their latitudes and longitudes are also returned along with their vector rotation parameters. On the other hand, the output can be a set of station points if kgdso(1)<0, in which case the number of points and their latitudes and longitudes must be input along with their vector rotation parameters.

    +

    Output bitmaps will only be created when the output grid extends outside of the domain of the input grid. The output field is set to 0 where the output bitmap is off.

    +

    +Program History Log

    + + + + + + + + + +
    Date Programmer Comments
    96-04-10 iredell initial.
    2001-06-18 iredell improve detection of special fast transform
    2015-01-27 gayno replace calls to gdswiz() with new merged routine gdswzd().
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + +
    [in]ipopt(20) interpolation options ipopt(1)=0 for triangular, ipopt(1)=1 for rhomboidal; ipopt(2) is truncation number (defaults to sensible if ipopt(2)=-1).
    [in]kgdsi(200) input gds parameters as decoded by w3fi63.
    [in]kgdso(200) output gds parameters (kgdso(1)<0 implies random station points).
    [in]miskip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moskip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmnumber of fields to interpolate
    [in]ibi(km) input bitmap flags (must be all 0)
    [in]ui(mi,km) input u-component fields to interpolate
    [in]vi(mi,km) input v-component fields to interpolate
    [out]nonumber of output points (only if kgdso(1)<0)
    [out]rlat(no) output latitudes in degrees (if kgdso(1)<0)
    [out]rlon(no) output longitudes in degrees (if kgdso(1)<0)
    [out]crot(no) vector rotation cosines (if kgdso(1)<0)
    [out]srot(no) vector rotation sines (if kgdso(1)<0) (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]ibo(km) output bitmap flags
    [out]lo(mo,km) output bitmaps (always output)
    [out]uo(mo,km) output u-component fields interpolated
    [out]vo(mo,km) output v-component fields interpolated
    [out]iretreturn code
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    • 41 invalid nonglobal input grid
    • +
    • 42 invalid spectral method parameters
    • +
    +
    +
    +
    +
    Author
    IREDELL
    +
    Date
    96-04-10
    + +

    Definition at line 1222 of file spectral_interp_mod.F90.

    + +

    Referenced by spectral_interp_mod::interpolate_spectral::interpolate_spectral_vector().

    + +
    +
    + +

    ◆ polatev4_grib2()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spectral_interp_mod::polatev4_grib2 (integer, dimension(20), intent(in) IPOPT,
    integer, intent(in) IGDTNUMI,
    integer, dimension(igdtleni), intent(in) IGDTMPLI,
    integer, intent(in) IGDTLENI,
    integer, intent(in) IGDTNUMO,
    integer, dimension(igdtleno), intent(in) IGDTMPLO,
    integer, intent(in) IGDTLENO,
    integer, intent(in) MI,
    integer, intent(in) MO,
    integer, intent(in) KM,
    integer, dimension(km), intent(in) IBI,
    real, dimension(mi,km), intent(in) UI,
    real, dimension(mi,km), intent(in) VI,
    integer, intent(out) NO,
    real, dimension(mo), intent(inout) RLAT,
    real, dimension(mo), intent(inout) RLON,
    real, dimension(mo), intent(out) CROT,
    real, dimension(mo), intent(out) SROT,
    integer, dimension(km), intent(out) IBO,
    logical*1, dimension(mo,km), intent(out) LO,
    real, dimension(mo,km), intent(out) UO,
    real, dimension(mo,km), intent(out) VO,
    integer, intent(out) IRET 
    )
    +
    +private
    +
    + +

    Interpolate vector fields (spectral).

    +

    This subprogram performs spectral interpolation from any grid to any grid for vector fields. It requires that the input fields be uniformly global. Options allow choices between triangular shape (ipopt(1)=0) and rhomboidal shape (ipopt(1)=1) which has no default; a second option is the truncation (ipopt(2)) which defaults to a sensible truncation for the input grid (if opt(2)=-1).

    +
    Note
    If the output grid is not found in a special list, then the transform back to grid is not very fast. This special list contains global cylindrical grids, polar stereographic grids centered at the pole and mercator grids. Only horizontal interpolation is performed.
    +

    The input and output grids are defined by their grib 2 grid definition template as decoded by the ncep g2 library. The code recognizes the following projections, where "igdtnumi/o" is the grib 2 grid defintion template number for the input and output grids, respectively:

      +
    • igdtnumi/o=00 equidistant cylindrical
    • +
    • igdtnumo =01 rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • igdtnumo =10 mercator cylindrical
    • +
    • igdtnumo =20 polar stereographic azimuthal
    • +
    • igdtnumo =30 lambert conformal conical
    • +
    • igdtnumi/o=40 gaussian cylindrical
    • +
    +

    The input and output vectors are rotated so that they are either resolved relative to the defined grid in the direction of increasing x and y coordinates or resolved relative to easterly and northerly directions, as designated by their respective grid description sections.

    +

    As an added bonus the number of output grid points and their latitudes and longitudes are also returned along with their vector rotation parameters. On the other hand, the output can be a set of station points if igdtnumo<0, in which case the number of points and their latitudes and longitudes must be input along with their vector rotation parameters.

    +

    Output bitmaps will only be created when the output grid extends outside of the domain of the input grid. the output field is set to 0 where the output bitmap is off.

    +

    +Program History Log

    + + + + + + + + + + + +
    Date Programmer Comments
    96-04-10 iredell initial
    2001-06-18 iredell improve detection of special fast transform
    2015-01-27 gayno replace calls to gdswiz() with new merged routine gdswzd().
    2015-07-13 gayno convert to grib 2. replace grib 1 kgds arrays with grib 2 grid definition template arrays.
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + + + +
    [in]ipopt(20) interpolation options ipopt(1)=0 for triangular, ipopt(1)=1 for rhomboidal; ipopt(2) is truncation number (defaults to sensible if ipopt(2)=-1).
    [in]igdtnumigrid definition template number - input grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure:
      +
    • 00 equidistant cylindrical
    • +
    • 01 rotated equidistant cylindrical. "e" and non-"e" staggered
    • +
    • 10 mercator cyclindrical
    • +
    • 20 polar stereographic azimuthal
    • +
    • 30 lambert conformal conical
    • +
    • 40 gaussian equidistant cyclindrical
    • +
    +
    [in]igdtmpli(igdtleni) grid definition template array - input grid. corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure (section 3 info). see comments in routine ipolatev for complete definition.
    [in]igdtleninumber of elements of the grid definition template array - input grid. corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]igdtnumogrid definition template number - output grid. Corresponds to the gfldigdtnum component of the ncep g2 library gridmod data structure. igdtnumo<0 means interpolate to random station points. Otherwise, same definition as "igdtnumi".
    [in]igdtmplo(igdtleno) grid definition template array - output grid. corresponds to the gfldigdtmpl component of the ncep g2 library gridmod data structure (section 3 info). see comments in routine ipolatev() for complete definition.
    [in]igdtlenonumber of elements of the grid definition template array - output grid. Corresponds to the gfldigdtlen component of the ncep g2 library gridmod data structure.
    [in]miskip number between input grid fields if km>1 or dimension of input grid fields if km=1.
    [in]moskip number between output grid fields if km>1 or dimension of output grid fields if km=1.
    [in]kmnumber of fields to interpolate
    [in]ibi(km) input bitmap flags (must be all 0)
    [in]ui(mi,km) input u-component fields to interpolate
    [in]vi(mi,km) input v-component fields to interpolate
    [out]nonumber of output points (only if igdtnumo>=0)
    [in,out]rlat(mo) output latitudes in degrees (if igdtnumo<0)
    [in,out]rlon(mo) output longitudes in degrees (if igdtnumo<0)
    [in,out]crot(mo) vector rotation cosines (if igdtnumo<0)
    [in,out]srot(mo) vector rotation sines (if igdtnumo<0) (ugrid=crot*uearth-srot*vearth; vgrid=srot*uearth+crot*vearth)
    [out]ibo(km) output bitmap flags
    [out]lo(mo,km) output bitmaps (always output)
    [out]uo(mo,km) output u-component fields interpolated
    [out]vo(mo,km) output v-component fields interpolated
    [out]iretreturn code
      +
    • 0 successful interpolation
    • +
    • 2 unrecognized input grid or no grid overlap
    • +
    • 3 unrecognized output grid
    • +
    • 41 invalid nonglobal input grid
    • +
    • 42 invalid spectral method parameters
    • +
    +
    +
    +
    +
    Author
    IREDELL
    +
    Date
    96-04-10
    + +

    Definition at line 888 of file spectral_interp_mod.F90.

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/namespacespectral__interp__mod.js b/ver-5.1.0/namespacespectral__interp__mod.js new file mode 100644 index 00000000..05dbff31 --- /dev/null +++ b/ver-5.1.0/namespacespectral__interp__mod.js @@ -0,0 +1,12 @@ +var namespacespectral__interp__mod = +[ + [ "interpolate_spectral", "interfacespectral__interp__mod_1_1interpolate__spectral.html", "interfacespectral__interp__mod_1_1interpolate__spectral" ], + [ "polates4", "interfacespectral__interp__mod_1_1polates4.html", "interfacespectral__interp__mod_1_1polates4" ], + [ "polatev4", "interfacespectral__interp__mod_1_1polatev4.html", "interfacespectral__interp__mod_1_1polatev4" ], + [ "interpolate_spectral_scalar", "namespacespectral__interp__mod.html#a438646d69e941def0ada00d5ca19f618", null ], + [ "interpolate_spectral_vector", "namespacespectral__interp__mod.html#acb61ad529b7decc2a6ff58dd12fbadd0", null ], + [ "polates4_grib1", "namespacespectral__interp__mod.html#ab9fb87d87f2f9d578a5ade6b512ff366", null ], + [ "polates4_grib2", "namespacespectral__interp__mod.html#a54dfd0ea8368242a1053d64770bd295a", null ], + [ "polatev4_grib1", "namespacespectral__interp__mod.html#af4ce7638750e787dd69c7fe3ff2335cc", null ], + [ "polatev4_grib2", "namespacespectral__interp__mod.html#a2f76e9900554d90753ca788c2ddf9ac3", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/nav_f.png b/ver-5.1.0/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 HcmV?d00001 diff --git a/ver-5.1.0/nav_g.png b/ver-5.1.0/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL=0 ? varName.substring(i+1) : varName; + return eval(n.replace(/\-/g,'_')); +} + +function stripPath(uri) +{ + return uri.substring(uri.lastIndexOf('/')+1); +} + +function stripPath2(uri) +{ + var i = uri.lastIndexOf('/'); + var s = uri.substring(i+1); + var m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; +} + +function hashValue() +{ + return $(location).attr('hash').substring(1).replace(/[^\w\-]/g,''); +} + +function hashUrl() +{ + return '#'+hashValue(); +} + +function pathName() +{ + return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]/g, ''); +} + +function localStorageSupported() +{ + try { + return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem; + } + catch(e) { + return false; + } +} + +function storeLink(link) +{ + if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) { + window.localStorage.setItem('navpath',link); + } +} + +function deleteLink() +{ + if (localStorageSupported()) { + window.localStorage.setItem('navpath',''); + } +} + +function cachedLink() +{ + if (localStorageSupported()) { + return window.localStorage.getItem('navpath'); + } else { + return ''; + } +} + +function getScript(scriptName,func,show) +{ + var head = document.getElementsByTagName("head")[0]; + var script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = func; + script.src = scriptName+'.js'; + head.appendChild(script); +} + +function createIndent(o,domNode,node,level) +{ + var level=-1; + var n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + var imgNode = document.createElement("span"); + imgNode.className = 'arrow'; + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.innerHTML=arrowRight; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast"); + node.plus_img.innerHTML=arrowRight; + node.expanded = false; + } else { + expandNode(o, node, false, false); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + } else { + var span = document.createElement("span"); + span.className = 'arrow'; + span.style.width = 16*(level+1)+'px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } +} + +var animationInProgress = false; + +function gotoAnchor(anchor,aname,updateLocation) +{ + var pos, docContent = $('#doc-content'); + var ancParent = $(anchor.parent()); + if (ancParent.hasClass('memItemLeft') || + ancParent.hasClass('memtitle') || + ancParent.hasClass('fieldname') || + ancParent.hasClass('fieldtype') || + ancParent.is(':header')) + { + pos = ancParent.position().top; + } else if (anchor.position()) { + pos = anchor.position().top; + } + if (pos) { + var dist = Math.abs(Math.min( + pos-docContent.offset().top, + docContent[0].scrollHeight- + docContent.height()-docContent.scrollTop())); + animationInProgress=true; + docContent.animate({ + scrollTop: pos + docContent.scrollTop() - docContent.offset().top + },Math.max(50,Math.min(500,dist)),function(){ + if (updateLocation) window.location.href=aname; + animationInProgress=false; + }); + } +} + +function newNode(o, po, text, link, childrenData, lastNode) +{ + var node = new Object(); + node.children = Array(); + node.childrenData = childrenData; + node.depth = po.depth + 1; + node.relpath = po.relpath; + node.isLast = lastNode; + + node.li = document.createElement("li"); + po.getChildrenUL().appendChild(node.li); + node.parentNode = po; + + node.itemDiv = document.createElement("div"); + node.itemDiv.className = "item"; + + node.labelSpan = document.createElement("span"); + node.labelSpan.className = "label"; + + createIndent(o,node.itemDiv,node,0); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + var a = document.createElement("a"); + node.labelSpan.appendChild(a); + node.label = document.createTextNode(text); + node.expanded = false; + a.appendChild(node.label); + if (link) { + var url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + var aname = '#'+link.split('#')[1]; + var srcPage = stripPath(pathName()); + var targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : "javascript:void(0)"; + a.onclick = function(){ + storeLink(link); + if (!$(a).parent().parent().hasClass('selected')) + { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + $(a).parent().parent().addClass('selected'); + $(a).parent().parent().attr('id','selected'); + } + var anchor = $(aname); + gotoAnchor(anchor,aname,true); + }; + } else { + a.href = url; + a.onclick = function() { storeLink(link); } + } + } else { + if (childrenData != null) + { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + } + + node.childrenUL = null; + node.getChildrenUL = function() { + if (!node.childrenUL) { + node.childrenUL = document.createElement("ul"); + node.childrenUL.className = "children_ul"; + node.childrenUL.style.display = "none"; + node.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }; + + return node; +} + +function showRoot() +{ + var headerHeight = $("#top").height(); + var footerHeight = $("#nav-path").height(); + var windowHeight = $(window).height() - headerHeight - footerHeight; + (function (){ // retry until we can scroll to the selected item + try { + var navtree=$('#nav-tree'); + navtree.scrollTo('#selected',100,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); +} + +function expandNode(o, node, imm, showRoot) +{ + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + expandNode(o, node, imm, showRoot); + }, showRoot); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).slideDown("fast"); + node.plus_img.innerHTML = arrowDown; + node.expanded = true; + } + } +} + +function glowEffect(n,duration) +{ + n.addClass('glow').delay(duration).queue(function(next){ + $(this).removeClass('glow');next(); + }); +} + +function highlightAnchor() +{ + var aname = hashUrl(); + var anchor = $(aname); + if (anchor.parent().attr('class')=='memItemLeft'){ + var rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname'){ + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype'){ + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } +} + +function selectAndHighlight(hash,n) +{ + var a; + if (hash) { + var link=stripPath(pathName())+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + $('#nav-sync').css('top','30px'); + } else { + $('#nav-sync').css('top','5px'); + } + showRoot(); +} + +function showNode(o, node, index, hash) +{ + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + showNode(o,node,index,hash); + },true); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + node.plus_img.innerHTML = arrowDown; + node.expanded = true; + var n = node.children[o.breadcrumbs[index]]; + if (index+11) hash = '#'+parts[1].replace(/[^\w\-]/g,''); + else hash=''; + } + if (hash.match(/^#l\d+$/)) { + var anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + } + var url=root+hash; + var i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function(){ + navTreeSubIndices[i] = eval('NAVTREEINDEX'+i); + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + },true); + } +} + +function showSyncOff(n,relpath) +{ + n.html(''); +} + +function showSyncOn(n,relpath) +{ + n.html(''); +} + +function toggleSyncButton(relpath) +{ + var navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } +} + +var loadTriggered = false; +var readyTriggered = false; +var loadObject,loadToRoot,loadUrl,loadRelPath; + +$(window).on('load',function(){ + if (readyTriggered) { // ready first + navTo(loadObject,loadToRoot,loadUrl,loadRelPath); + showRoot(); + } + loadTriggered=true; +}); + +function initNavTree(toroot,relpath) +{ + var o = new Object(); + o.toroot = toroot; + o.node = new Object(); + o.node.li = document.getElementById("nav-tree-contents"); + o.node.childrenData = NAVTREE; + o.node.children = new Array(); + o.node.childrenUL = document.createElement("ul"); + o.node.getChildrenUL = function() { return o.node.childrenUL; }; + o.node.li.appendChild(o.node.childrenUL); + o.node.depth = 0; + o.node.relpath = relpath; + o.node.expanded = false; + o.node.isLast = true; + o.node.plus_img = document.createElement("span"); + o.node.plus_img.className = 'arrow'; + o.node.plus_img.innerHTML = arrowRight; + + if (localStorageSupported()) { + var navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + navSync.click(function(){ toggleSyncButton(relpath); }); + } + + if (loadTriggered) { // load before ready + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + } else { // ready before load + loadObject = o; + loadToRoot = toroot; + loadUrl = hashUrl(); + loadRelPath = relpath; + readyTriggered=true; + } + + $(window).bind('hashchange', function(){ + if (window.location.hash && window.location.hash.length>1){ + var a; + if ($(location).attr('hash')){ + var clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/ + + + + + + +NCEPLIBS-ip: ncpus.F File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ncpus.F File Reference
    +
    +
    + +

    Set number of cpus. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    function ncpus ()
     Set number of CPUs - the number of processors over which to parallelize. More...
     
    +

    Detailed Description

    +

    Set number of cpus.

    +

    +Program History Log

    + + + + + + + + + + + + + +
    Date Programmer Comments
    94-08-19 Iredell Initial.
    98-11-09 Vuong Add doc>block and remove cray references.
    1998-12-18 Iredell IBM SMP version.
    2010-11-16 Slovacek Linux must have different call.
    2012-11-01 Mirvis Multi-threading on LINUX-IBM/TIDE.
    +
    Author
    Iredell
    +
    Date
    94-08-19
    + +

    Definition in file ncpus.F.

    +

    Function/Subroutine Documentation

    + +

    ◆ ncpus()

    + +
    +
    + + + + +
    function ncpus
    +
    + +

    Set number of CPUs - the number of processors over which to parallelize.

    +
    Parameters
    + + +
    [out]ncpusnumber of CPUs.
    +
    +
    +
    Returns
    Number of CPUs assigned.
    +
    Author
    Iredell
    +
    Date
    94-08-19
    + +

    Definition at line 23 of file ncpus.F.

    + +

    Referenced by sptez(), sptezd(), sptezm(), sptezmd(), sptezmv(), sptezv(), sptran(), sptranv(), sptrun(), sptrund(), sptrung(), sptrungv(), sptrunl(), sptrunm(), sptrunmv(), sptruns(), sptrunsv(), and sptrunv().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/ncpus_8F.js b/ver-5.1.0/ncpus_8F.js new file mode 100644 index 00000000..16d02677 --- /dev/null +++ b/ver-5.1.0/ncpus_8F.js @@ -0,0 +1,4 @@ +var ncpus_8F = +[ + [ "ncpus", "ncpus_8F.html#a821a75ee067ea31758a038c0327bd3bd", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/ncpus_8F_source.html b/ver-5.1.0/ncpus_8F_source.html new file mode 100644 index 00000000..c50cbf76 --- /dev/null +++ b/ver-5.1.0/ncpus_8F_source.html @@ -0,0 +1,141 @@ + + + + + + + +NCEPLIBS-ip: ncpus.F Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ncpus.F
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> Set number of cpus.
    +
    3 C>
    +
    4 C> ### Program History Log
    +
    5 C> Date | Programmer | Comments
    +
    6 C> -----|------------|---------
    +
    7 C> 94-08-19 | Iredell | Initial.
    +
    8 C> 98-11-09 | Vuong | Add doc>block and remove cray references.
    +
    9 C> 1998-12-18 | Iredell | IBM SMP version.
    +
    10 C> 2010-11-16 | Slovacek | Linux must have different call.
    +
    11 C> 2012-11-01 | Mirvis | Multi-threading on LINUX-IBM/TIDE.
    +
    12 C>
    +
    13 C> @author Iredell @date 94-08-19
    +
    14 
    +
    15 C> Set number of CPUs - the number of processors over which
    +
    16 C> to parallelize.
    +
    17 C>
    +
    18 C> @param[out] ncpus number of CPUs.
    +
    19 C>
    +
    20 C> @return Number of CPUs assigned.
    +
    21 C>
    +
    22 C> @author Iredell @date 94-08-19
    +
    23  FUNCTION ncpus()
    +
    24  INTEGER tid
    +
    25 C Obtain thread number
    +
    26 #ifdef openmp
    +
    27  INTEGER omp_get_num_threads,omp_get_thread_num
    +
    28 !$OMP PARALLEL PRIVATE(TID)
    +
    29  tid = omp_get_thread_num()
    +
    30 ! PRINT *, '...............thread # ', TID
    +
    31  if (tid. eq. 0) then
    +
    32  ncpus=omp_get_num_threads()
    +
    33 ! PRINT *, 'totaly #------------------- of threads = ',NCPUS
    +
    34  endif
    +
    35 !$OMP END PARALLEL
    +
    36 #else
    +
    37  tid = 0
    +
    38  ncpus = 1
    +
    39 #endif
    +
    40  RETURN
    +
    41  END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    +
    +
    + + + + diff --git a/ver-5.1.0/neighbor__budget__interp__mod_8F90.html b/ver-5.1.0/neighbor__budget__interp__mod_8F90.html new file mode 100644 index 00000000..550da539 --- /dev/null +++ b/ver-5.1.0/neighbor__budget__interp__mod_8F90.html @@ -0,0 +1,135 @@ + + + + + + + +NCEPLIBS-ip: neighbor_budget_interp_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    neighbor_budget_interp_mod.F90 File Reference
    +
    +
    + +

    Interpolate scalar and vector fields with neighbor budget interpolation. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Data Types

    interface  neighbor_budget_interp_mod::interpolate_neighbor_budget
     
    + + + + +

    +Modules

    module  neighbor_budget_interp_mod
     Interpolate scalar fields (neighbor).
     
    + + + + + + + +

    +Functions/Subroutines

    subroutine neighbor_budget_interp_mod::interpolate_neighbor_budget_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Interpolate scalar fields (budget). More...
     
    subroutine neighbor_budget_interp_mod::interpolate_neighbor_budget_vector (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     Interpolate vector fields (budget). More...
     
    +

    Detailed Description

    +

    Interpolate scalar and vector fields with neighbor budget interpolation.

    +
    Author
    Mark Iredell
    +
    Date
    96-04-10
    + +

    Definition in file neighbor_budget_interp_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/neighbor__budget__interp__mod_8F90.js b/ver-5.1.0/neighbor__budget__interp__mod_8F90.js new file mode 100644 index 00000000..15ede1c0 --- /dev/null +++ b/ver-5.1.0/neighbor__budget__interp__mod_8F90.js @@ -0,0 +1,6 @@ +var neighbor__budget__interp__mod_8F90 = +[ + [ "interpolate_neighbor_budget", "interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget.html", "interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget" ], + [ "interpolate_neighbor_budget_scalar", "neighbor__budget__interp__mod_8F90.html#a6d5110a9e9facf8c3132ec27d6857817", null ], + [ "interpolate_neighbor_budget_vector", "neighbor__budget__interp__mod_8F90.html#a4309c1e6b7fc60ded40657fe6c72297e", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/neighbor__budget__interp__mod_8F90_source.html b/ver-5.1.0/neighbor__budget__interp__mod_8F90_source.html new file mode 100644 index 00000000..9a5a5c04 --- /dev/null +++ b/ver-5.1.0/neighbor__budget__interp__mod_8F90_source.html @@ -0,0 +1,481 @@ + + + + + + + +NCEPLIBS-ip: neighbor_budget_interp_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    neighbor_budget_interp_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    4 
    + +
    9  use gdswzd_mod
    +
    10  use polfix_mod
    +
    11  use ip_grids_mod
    +
    12  implicit none
    +
    13 
    +
    14  private
    + +
    16 
    + +
    18  module procedure interpolate_neighbor_budget_scalar
    +
    19  module procedure interpolate_neighbor_budget_vector
    +
    20  end interface interpolate_neighbor_budget
    +
    21 
    +
    22  ! Smallest positive real value (use for equality comparisons)
    +
    23  REAL :: TINYREAL=tiny(1.0)
    +
    24 
    +
    25 contains
    +
    26 
    +
    107  SUBROUTINE interpolate_neighbor_budget_scalar(IPOPT,grid_in,grid_out, &
    +
    108  MI,MO,KM,IBI,LI,GI, &
    +
    109  NO,RLAT,RLON,IBO,LO,GO,IRET)
    +
    110  class(ip_grid), intent(in) :: grid_in, grid_out
    +
    111 
    +
    112  INTEGER, INTENT(IN ) :: IBI(KM), IPOPT(20), KM, MI, MO
    +
    113  INTEGER, INTENT( OUT) :: IBO(KM), IRET, NO
    +
    114  !
    +
    115  LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
    +
    116  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
    +
    117  !
    +
    118  REAL, INTENT(IN ) :: GI(MI,KM)
    +
    119  REAL, INTENT( OUT) :: GO(MO,KM), RLAT(MO), RLON(MO)
    +
    120  !
    +
    121  REAL, PARAMETER :: FILL=-9999.
    +
    122  !
    +
    123  INTEGER :: IB, I1
    +
    124  INTEGER :: JB, J1, K, LB, LSW, MP, N
    +
    125  INTEGER :: N11(MO), NB, NB1, NB2, NB3, NB4, NV
    +
    126  !
    +
    127  REAL :: PMP,RLOB(MO),RLAB(MO)
    +
    128  REAL :: WB, WO(MO,KM), XI, YI
    +
    129  REAL :: XPTB(MO),YPTB(MO),XPTS(MO),YPTS(MO)
    +
    130 
    +
    131  logical :: to_station_points
    +
    132 
    +
    133  select type(grid_out)
    +
    134  type is(ip_station_points_grid)
    +
    135  to_station_points = .true.
    +
    136  class default
    +
    137  to_station_points = .false.
    +
    138  end select
    +
    139 
    +
    140  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    141  ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
    +
    142  iret=0
    +
    143  if(to_station_points) then
    +
    144  CALL gdswzd(grid_out, 0,mo,fill,xpts,ypts,rlon,rlat,no)
    +
    145  IF(no.EQ.0) iret=3
    +
    146  CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv)
    +
    147  IF(nv.EQ.0) iret=2
    +
    148  else
    +
    149  CALL gdswzd(grid_out, 0,mo,fill,xpts,ypts,rlon,rlat,no)
    +
    150  IF(no.EQ.0) iret=3
    +
    151  endif
    +
    152  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    153  ! SET PARAMETERS
    +
    154  nb1=ipopt(1)
    +
    155  IF(nb1.EQ.-1) nb1=2
    +
    156  IF(iret.EQ.0.AND.nb1.LT.0) iret=32
    +
    157  lsw=1
    +
    158  IF(ipopt(1).EQ.-1.OR.ipopt(2).EQ.-1) lsw=0
    +
    159  IF(iret.EQ.0.AND.lsw.EQ.1.AND.nb1.GT.15) iret=32
    +
    160  mp=ipopt(3+ipopt(1))
    +
    161  IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
    +
    162  IF(mp.LT.0.OR.mp.GT.100) iret=32
    +
    163  pmp=mp*0.01
    +
    164  IF(iret.EQ.0) THEN
    +
    165  nb2=2*nb1+1
    +
    166  nb3=nb2*nb2
    +
    167  nb4=nb3
    +
    168  IF(lsw.EQ.1) THEN
    +
    169  nb4=ipopt(2)
    +
    170  DO ib=1,nb1
    +
    171  nb4=nb4+8*ib*ipopt(2+ib)
    +
    172  ENDDO
    +
    173  ENDIF
    +
    174  ELSE
    +
    175  nb2=0
    +
    176  nb3=0
    +
    177  nb4=0
    +
    178  ENDIF
    +
    179  DO k=1,km
    +
    180  DO n=1,no
    +
    181  go(n,k)=0.
    +
    182  wo(n,k)=0.
    +
    183  ENDDO
    +
    184  ENDDO
    +
    185  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    186  ! LOOP OVER SAMPLE POINTS IN OUTPUT GRID BOX
    +
    187 
    +
    188  DO nb=1,nb3
    +
    189  ! LOCATE INPUT POINTS AND COMPUTE THEIR WEIGHTS
    +
    190  jb=(nb-1)/nb2-nb1
    +
    191  ib=nb-(jb+nb1)*nb2-nb1-1
    +
    192  lb=max(abs(ib),abs(jb))
    +
    193  wb=1
    +
    194  IF(lsw.EQ.1) wb=ipopt(2+lb)
    +
    195  IF(abs(wb).GT.tinyreal) THEN
    +
    196  DO n=1,no
    +
    197  xptb(n)=xpts(n)+ib/real(nb2)
    +
    198  yptb(n)=ypts(n)+jb/real(nb2)
    +
    199  ENDDO
    +
    200  if(to_station_points)then
    +
    201  CALL gdswzd(grid_in, 1,no,fill,xptb,yptb,rlob,rlab,nv)
    +
    202  CALL gdswzd(grid_in,-1,no,fill,xptb,yptb,rlob,rlab,nv)
    +
    203  else
    +
    204  CALL gdswzd(grid_out, 1,no,fill,xptb,yptb,rlob,rlab,nv)
    +
    205  CALL gdswzd(grid_in,-1,no,fill,xptb,yptb,rlob,rlab,nv)
    +
    206  endif
    +
    207  IF(iret.EQ.0.AND.nv.EQ.0.AND.lb.EQ.0) iret=2
    +
    208  DO n=1,no
    +
    209  xi=xptb(n)
    +
    210  yi=yptb(n)
    +
    211  IF(abs(xi-fill).GT.tinyreal.AND.abs(yi-fill).GT.tinyreal) THEN
    +
    212  i1=nint(xi)
    +
    213  j1=nint(yi)
    +
    214  n11(n)=grid_in%field_pos(i1, j1)
    +
    215  ELSE
    +
    216  n11(n)=0
    +
    217  ENDIF
    +
    218  ENDDO
    +
    219  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    220  ! INTERPOLATE WITH OR WITHOUT BITMAPS
    +
    221  DO k=1,km
    +
    222  DO n=1,no
    +
    223  IF(n11(n).GT.0) THEN
    +
    224  IF(ibi(k).EQ.0.OR.li(n11(n),k)) THEN
    +
    225  go(n,k)=go(n,k)+wb*gi(n11(n),k)
    +
    226  wo(n,k)=wo(n,k)+wb
    +
    227  ENDIF
    +
    228  ENDIF
    +
    229  ENDDO
    +
    230  ENDDO
    +
    231  ENDIF
    +
    232  ENDDO
    +
    233  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    234  ! COMPUTE OUTPUT BITMAPS AND FIELDS
    +
    235  DO k=1,km
    +
    236  ibo(k)=ibi(k)
    +
    237  DO n=1,no
    +
    238  lo(n,k)=wo(n,k).GE.pmp*nb4
    +
    239  IF(lo(n,k)) THEN
    +
    240  go(n,k)=go(n,k)/wo(n,k)
    +
    241  ELSE
    +
    242  ibo(k)=1
    +
    243  go(n,k)=0.
    +
    244  ENDIF
    +
    245  ENDDO
    +
    246  ENDDO
    +
    247 
    +
    248  select type(grid_out)
    +
    249  type is(ip_equid_cylind_grid)
    +
    250  CALL polfixs(no,mo,km,rlat,ibo,lo,go)
    +
    251  end select
    +
    252 
    + +
    254 
    +
    255 
    +
    351  SUBROUTINE interpolate_neighbor_budget_vector(IPOPT,grid_in,grid_out, &
    +
    352  MI,MO,KM,IBI,LI,UI,VI, &
    +
    353  NO,RLAT,RLON,CROT,SROT,IBO,LO,UO,VO,IRET)
    +
    354  class(ip_grid), intent(in) :: grid_in, grid_out
    +
    355 
    +
    356  INTEGER, INTENT(IN ) :: IPOPT(20), IBI(KM)
    +
    357  INTEGER, INTENT(IN ) :: KM, MI, MO
    +
    358  INTEGER, INTENT( OUT) :: IRET, NO, IBO(KM)
    +
    359  !
    +
    360  LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
    +
    361  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
    +
    362  !
    +
    363  REAL, INTENT(IN ) :: UI(MI,KM),VI(MI,KM)
    +
    364  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    365  REAL, INTENT( OUT) :: UO(MO,KM),VO(MO,KM)
    +
    366  REAL, INTENT( OUT) :: CROT(MO),SROT(MO)
    +
    367  !
    +
    368  REAL, PARAMETER :: FILL=-9999.
    +
    369  !
    +
    370  INTEGER :: N11(MO)
    +
    371  INTEGER :: IB, JB, I1, J1
    +
    372  INTEGER :: K, LB, LSW, MP, N, NV
    +
    373  INTEGER :: NB, NB1, NB2, NB3, NB4
    +
    374  !
    +
    375  LOGICAL :: SAME_GRID
    +
    376  !
    +
    377  REAL :: C11(MO),S11(MO)
    +
    378  REAL :: CM11, SM11, PMP
    +
    379  REAL :: U11, V11, UROT, VROT
    +
    380  REAL :: WB, WO(MO,KM), XI, YI
    +
    381  REAL :: RLOB(MO),RLAB(MO)
    +
    382  REAL :: XPTS(MO),YPTS(MO)
    +
    383  REAL :: XPTB(MO),YPTB(MO)
    +
    384 
    +
    385  logical :: to_station_points
    +
    386 
    +
    387  ! Save coeffecients between runs and only compute if grid has changed
    +
    388  INTEGER, SAVE :: MIX=-1
    +
    389  REAL, ALLOCATABLE,SAVE :: CROI(:),SROI(:)
    +
    390  REAL, ALLOCATABLE,SAVE :: XPTI(:),YPTI(:)
    +
    391  REAL, ALLOCATABLE,SAVE :: RLOI(:),RLAI(:)
    +
    392  class(ip_grid), allocatable, save :: prev_grid_in
    +
    393 
    +
    394  select type(grid_out)
    +
    395  type is(ip_station_points_grid)
    +
    396  to_station_points = .true.
    +
    397  class default
    +
    398  to_station_points = .false.
    +
    399  end select
    +
    400 
    +
    401  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    402  ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
    +
    403  iret=0
    +
    404  CALL gdswzd(grid_out, 0,mo,fill,xpts,ypts,rlon,rlat,no,crot,srot)
    +
    405  IF(no.EQ.0) iret=3
    +
    406  if(to_station_points) then
    +
    407  CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv,crot,srot)
    +
    408  IF(nv.EQ.0) iret=2
    +
    409  endif
    +
    410 
    +
    411  if (.not. allocated(prev_grid_in)) then
    +
    412  allocate(prev_grid_in, source = grid_in)
    +
    413 
    +
    414  same_grid = .false.
    +
    415  else
    +
    416  same_grid = grid_in == prev_grid_in
    +
    417 
    +
    418  if (.not. same_grid) then
    +
    419  deallocate(prev_grid_in)
    +
    420  allocate(prev_grid_in, source = grid_in)
    +
    421  end if
    +
    422  end if
    +
    423 
    +
    424  IF(.NOT.same_grid) THEN
    +
    425  IF(mix.NE.mi) THEN
    +
    426  IF(mix.GE.0) DEALLOCATE(xpti,ypti,rloi,rlai,croi,sroi)
    +
    427  ALLOCATE(xpti(mi),ypti(mi),rloi(mi),rlai(mi),croi(mi),sroi(mi))
    +
    428  mix=mi
    +
    429  ENDIF
    +
    430  CALL gdswzd(grid_in,0,mi,fill,xpti,ypti, &
    +
    431  rloi,rlai,nv,croi,sroi)
    +
    432  ENDIF
    +
    433  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    434  ! SET PARAMETERS
    +
    435  nb1=ipopt(1)
    +
    436  IF(nb1.EQ.-1) nb1=2
    +
    437  IF(iret.EQ.0.AND.nb1.LT.0) iret=32
    +
    438  lsw=1
    +
    439  IF(ipopt(1).EQ.-1.OR.ipopt(2).EQ.-1) lsw=0
    +
    440  IF(iret.EQ.0.AND.lsw.EQ.1.AND.nb1.GT.15) iret=32
    +
    441  mp=ipopt(3+ipopt(1))
    +
    442  IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
    +
    443  IF(mp.LT.0.OR.mp.GT.100) iret=32
    +
    444  pmp=mp*0.01
    +
    445  IF(iret.EQ.0) THEN
    +
    446  nb2=2*nb1+1
    +
    447  nb3=nb2*nb2
    +
    448  nb4=nb3
    +
    449  IF(lsw.EQ.1) THEN
    +
    450  nb4=ipopt(2)
    +
    451  DO ib=1,nb1
    +
    452  nb4=nb4+8*ib*ipopt(2+ib)
    +
    453  ENDDO
    +
    454  ENDIF
    +
    455  ELSE
    +
    456  nb2=0
    +
    457  nb3=0
    +
    458  nb4=0
    +
    459  ENDIF
    +
    460  DO k=1,km
    +
    461  DO n=1,no
    +
    462  uo(n,k)=0
    +
    463  vo(n,k)=0
    +
    464  wo(n,k)=0.
    +
    465  ENDDO
    +
    466  ENDDO
    +
    467  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    468  ! LOOP OVER SAMPLE POINTS IN OUTPUT GRID BOX
    +
    469  DO nb=1,nb3
    +
    470  ! LOCATE INPUT POINTS AND COMPUTE THEIR WEIGHTS AND ROTATIONS
    +
    471  jb=(nb-1)/nb2-nb1
    +
    472  ib=nb-(jb+nb1)*nb2-nb1-1
    +
    473  lb=max(abs(ib),abs(jb))
    +
    474  wb=1
    +
    475  IF(lsw.EQ.1) wb=ipopt(2+lb)
    +
    476  IF(abs(wb).GT.tinyreal) THEN
    +
    477  DO n=1,no
    +
    478  xptb(n)=xpts(n)+ib/real(nb2)
    +
    479  yptb(n)=ypts(n)+jb/real(nb2)
    +
    480  ENDDO
    +
    481  if(to_station_points)then
    +
    482  CALL gdswzd(grid_in, 1,no,fill,xptb,yptb,rlob,rlab,nv)
    +
    483  CALL gdswzd(grid_in,-1,no,fill,xptb,yptb,rlob,rlab,nv)
    +
    484  else
    +
    485  CALL gdswzd(grid_out, 1,no,fill,xptb,yptb,rlob,rlab,nv)
    +
    486  CALL gdswzd(grid_in,-1,no,fill,xptb,yptb,rlob,rlab,nv)
    +
    487  endif
    +
    488  IF(iret.EQ.0.AND.nv.EQ.0.AND.lb.EQ.0) iret=2
    +
    489  DO n=1,no
    +
    490  xi=xptb(n)
    +
    491  yi=yptb(n)
    +
    492  IF(abs(xi-fill).GT.tinyreal.AND.abs(yi-fill).GT.tinyreal) THEN
    +
    493  i1=nint(xi)
    +
    494  j1=nint(yi)
    +
    495  n11(n)=grid_in%field_pos(i1, j1)
    +
    496  IF(n11(n).GT.0) THEN
    +
    497  CALL movect(rlai(n11(n)),rloi(n11(n)),rlat(n),rlon(n),cm11,sm11)
    +
    498  c11(n)=cm11*croi(n11(n))+sm11*sroi(n11(n))
    +
    499  s11(n)=sm11*croi(n11(n))-cm11*sroi(n11(n))
    +
    500  ENDIF
    +
    501  ELSE
    +
    502  n11(n)=0
    +
    503  ENDIF
    +
    504  ENDDO
    +
    505  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    506  ! INTERPOLATE WITH OR WITHOUT BITMAPS
    +
    507  DO k=1,km
    +
    508  DO n=1,no
    +
    509  IF(n11(n).GT.0) THEN
    +
    510  IF(ibi(k).EQ.0.OR.li(n11(n),k)) THEN
    +
    511  u11=c11(n)*ui(n11(n),k)-s11(n)*vi(n11(n),k)
    +
    512  v11=s11(n)*ui(n11(n),k)+c11(n)*vi(n11(n),k)
    +
    513  uo(n,k)=uo(n,k)+wb*u11
    +
    514  vo(n,k)=vo(n,k)+wb*v11
    +
    515  wo(n,k)=wo(n,k)+wb
    +
    516  ENDIF
    +
    517  ENDIF
    +
    518  ENDDO
    +
    519  ENDDO
    +
    520  ENDIF
    +
    521  ENDDO ! NB LOOP
    +
    522  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    523  ! COMPUTE OUTPUT BITMAPS AND FIELDS
    +
    524  DO k=1,km
    +
    525  ibo(k)=ibi(k)
    +
    526  DO n=1,no
    +
    527  lo(n,k)=wo(n,k).GE.pmp*nb4
    +
    528  IF(lo(n,k)) THEN
    +
    529  uo(n,k)=uo(n,k)/wo(n,k)
    +
    530  vo(n,k)=vo(n,k)/wo(n,k)
    +
    531  urot=crot(n)*uo(n,k)-srot(n)*vo(n,k)
    +
    532  vrot=srot(n)*uo(n,k)+crot(n)*vo(n,k)
    +
    533  uo(n,k)=urot
    +
    534  vo(n,k)=vrot
    +
    535  ELSE
    +
    536  ibo(k)=1
    +
    537  uo(n,k)=0.
    +
    538  vo(n,k)=0.
    +
    539  ENDIF
    +
    540  ENDDO
    +
    541  ENDDO
    +
    542 
    +
    543  select type(grid_out)
    +
    544  type is(ip_equid_cylind_grid)
    +
    545  CALL polfixv(no,mo,km,rlat,rlon,ibo,lo,uo,vo)
    +
    546  end select
    +
    547 
    +
    548  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    + +
    550 
    + + + +
    subroutine movect(FLAT, FLON, TLAT, TLON, CROT, SROT)
    This subprogram provides the rotation parameters to move a vector along a great circle from one posit...
    Definition: movect.F90:26
    +
    Driver module for gdswzd routines.
    Definition: gdswzd_mod.F90:25
    +
    Re-export the individual grids.
    Definition: ip_grids_mod.F90:7
    +
    Interpolate scalar fields (neighbor).
    +
    subroutine interpolate_neighbor_budget_vector(IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
    Interpolate vector fields (budget).
    +
    subroutine interpolate_neighbor_budget_scalar(IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
    Interpolate scalar fields (budget).
    +
    Make multiple pole scalar values consistent.
    Definition: polfix_mod.F90:7
    +
    subroutine, public polfixs(NM, NX, KM, RLAT, IB, LO, GO)
    Make multiple pole scalar values consistent.
    Definition: polfix_mod.F90:30
    +
    subroutine, public polfixv(NM, NX, KM, RLAT, RLON, IB, LO, UO, VO)
    Make multiple pole vector values consistent,.
    Definition: polfix_mod.F90:125
    +
    +
    + + + + diff --git a/ver-5.1.0/neighbor__interp__mod_8F90.html b/ver-5.1.0/neighbor__interp__mod_8F90.html new file mode 100644 index 00000000..71dc1c71 --- /dev/null +++ b/ver-5.1.0/neighbor__interp__mod_8F90.html @@ -0,0 +1,135 @@ + + + + + + + +NCEPLIBS-ip: neighbor_interp_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    neighbor_interp_mod.F90 File Reference
    +
    +
    + +

    Interpolate scalar and vector fields with neighbor interpolation. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Data Types

    interface  neighbor_interp_mod::interpolate_neighbor
     
    + + + + +

    +Modules

    module  neighbor_interp_mod
     Interpolate scalar fields (neighbor).
     
    + + + + + + + +

    +Functions/Subroutines

    subroutine neighbor_interp_mod::interpolate_neighbor_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Interpolate scalar fields (neighbor). More...
     
    subroutine neighbor_interp_mod::interpolate_neighbor_vector (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     Interpolate vector fields (neighbor). More...
     
    +

    Detailed Description

    +

    Interpolate scalar and vector fields with neighbor interpolation.

    +
    Author
    Mark Iredell
    +
    Date
    96-04-10
    + +

    Definition in file neighbor_interp_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/neighbor__interp__mod_8F90.js b/ver-5.1.0/neighbor__interp__mod_8F90.js new file mode 100644 index 00000000..90d45008 --- /dev/null +++ b/ver-5.1.0/neighbor__interp__mod_8F90.js @@ -0,0 +1,6 @@ +var neighbor__interp__mod_8F90 = +[ + [ "interpolate_neighbor", "interfaceneighbor__interp__mod_1_1interpolate__neighbor.html", "interfaceneighbor__interp__mod_1_1interpolate__neighbor" ], + [ "interpolate_neighbor_scalar", "neighbor__interp__mod_8F90.html#a78452d1527c6974ad54091f0318e4b1f", null ], + [ "interpolate_neighbor_vector", "neighbor__interp__mod_8F90.html#a744ccffd8cd6c13d360e634db4851756", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/neighbor__interp__mod_8F90_source.html b/ver-5.1.0/neighbor__interp__mod_8F90_source.html new file mode 100644 index 00000000..4537b4be --- /dev/null +++ b/ver-5.1.0/neighbor__interp__mod_8F90_source.html @@ -0,0 +1,515 @@ + + + + + + + +NCEPLIBS-ip: neighbor_interp_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    neighbor_interp_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    4 
    + +
    21  use gdswzd_mod
    +
    22  use polfix_mod
    +
    23  use ip_grids_mod
    +
    24  implicit none
    +
    25 
    +
    26  private
    +
    27  public :: interpolate_neighbor
    +
    28 
    + +
    30  module procedure interpolate_neighbor_scalar
    +
    31  module procedure interpolate_neighbor_vector
    +
    32  end interface interpolate_neighbor
    +
    33 
    +
    34  ! Smallest positive real value (use for equality comparisons)
    +
    35  REAL :: TINYREAL=tiny(1.0)
    +
    36 
    +
    37 contains
    +
    38 
    +
    100  SUBROUTINE interpolate_neighbor_scalar(IPOPT,grid_in,grid_out, &
    +
    101  MI,MO,KM,IBI,LI,GI, &
    +
    102  NO,RLAT,RLON,IBO,LO,GO,IRET)
    +
    103  class(ip_grid), intent(in) :: grid_in, grid_out
    +
    104  INTEGER, INTENT(IN ) :: IPOPT(20)
    +
    105  INTEGER, INTENT(IN ) :: MI,MO,KM
    +
    106  INTEGER, INTENT(IN ) :: IBI(KM)
    +
    107  INTEGER, INTENT(INOUT) :: NO
    +
    108  INTEGER, INTENT( OUT) :: IRET, IBO(KM)
    +
    109  !
    +
    110  LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
    +
    111  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
    +
    112  !
    +
    113  REAL, INTENT(IN ) :: GI(MI,KM)
    +
    114  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    115  REAL, INTENT( OUT) :: GO(MO,KM)
    +
    116  !
    +
    117  REAL, PARAMETER :: FILL=-9999.
    +
    118  !
    +
    119  INTEGER :: I1,J1,IXS,JXS
    +
    120  INTEGER :: MSPIRAL,N,K,NK
    +
    121  INTEGER :: NV
    +
    122  INTEGER :: MX,KXS,KXT,IX,JX,NX
    +
    123  !
    +
    124  LOGICAL :: SAME_GRIDI, SAME_GRIDO
    +
    125  !
    +
    126  REAL :: XPTS(MO),YPTS(MO)
    +
    127  logical :: to_station_points
    +
    128 
    +
    129  INTEGER, SAVE :: NOX=-1,iretx=-1
    +
    130  INTEGER, ALLOCATABLE, SAVE :: NXY(:)
    +
    131  REAL, ALLOCATABLE, SAVE :: RLATX(:),RLONX(:),XPTSX(:),YPTSX(:)
    +
    132  class(ip_grid), allocatable, save :: prev_grid_in, prev_grid_out
    +
    133  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    134  ! SET PARAMETERS
    +
    135  iret=0
    +
    136  mspiral=max(ipopt(1),1)
    +
    137  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    138  if (.not. allocated(prev_grid_in) .or. .not. allocated(prev_grid_out)) then
    +
    139  allocate(prev_grid_in, source = grid_in)
    +
    140  allocate(prev_grid_out, source = grid_out)
    +
    141 
    +
    142  same_gridi = .false.
    +
    143  same_grido = .false.
    +
    144  else
    +
    145  same_gridi = grid_in == prev_grid_in
    +
    146  same_grido = grid_out == prev_grid_out
    +
    147 
    +
    148  if (.not. same_gridi .or. .not. same_grido) then
    +
    149  deallocate(prev_grid_in)
    +
    150  deallocate(prev_grid_out)
    +
    151 
    +
    152  allocate(prev_grid_in, source = grid_in)
    +
    153  allocate(prev_grid_out, source = grid_out)
    +
    154  end if
    +
    155  end if
    +
    156 
    +
    157  select type(grid_out)
    +
    158  type is(ip_station_points_grid)
    +
    159  to_station_points = .true.
    +
    160  class default
    +
    161  to_station_points = .false.
    +
    162  end select
    +
    163  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    164  ! SAVE OR SKIP WEIGHT COMPUTATION
    +
    165  IF(iret.EQ.0.AND.(to_station_points.OR..NOT.same_gridi.OR..NOT.same_grido))THEN
    +
    166  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    167  ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
    +
    168  CALL gdswzd(grid_out, 0,mo,fill,xpts,ypts,rlon,rlat,no)
    +
    169  IF(no.EQ.0) iret=3
    +
    170  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    171  ! LOCATE INPUT POINTS
    +
    172  CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv)
    +
    173  IF(iret.EQ.0.AND.nv.EQ.0) iret=2
    +
    174  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    175  ! ALLOCATE AND SAVE GRID DATA
    +
    176  IF(nox.NE.no) THEN
    +
    177  IF(nox.GE.0) DEALLOCATE(rlatx,rlonx,xptsx,yptsx,nxy)
    +
    178  ALLOCATE(rlatx(no),rlonx(no),xptsx(no),yptsx(no),nxy(no))
    +
    179  nox=no
    +
    180  ENDIF
    +
    181  iretx=iret
    +
    182  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    183  ! COMPUTE WEIGHTS
    +
    184  IF(iret.EQ.0) THEN
    +
    185  !$OMP PARALLEL DO PRIVATE(N) SCHEDULE(STATIC)
    +
    186  DO n=1,no
    +
    187  rlonx(n)=rlon(n)
    +
    188  rlatx(n)=rlat(n)
    +
    189  xptsx(n)=xpts(n)
    +
    190  yptsx(n)=ypts(n)
    +
    191  IF(abs(xpts(n)-fill).GT.tinyreal.AND.abs(ypts(n)-fill).GT.tinyreal) THEN
    +
    192  nxy(n) = grid_in%field_pos(nint(xpts(n)), nint(ypts(n)))
    +
    193  ELSE
    +
    194  nxy(n)=0
    +
    195  ENDIF
    +
    196  ENDDO
    +
    197  ENDIF
    +
    198  ENDIF
    +
    199  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    200  ! INTERPOLATE OVER ALL FIELDS
    +
    201  IF(iret.EQ.0.AND.iretx.EQ.0) THEN
    +
    202  IF(.not. to_station_points) THEN
    +
    203  no=nox
    +
    204  DO n=1,no
    +
    205  rlon(n)=rlonx(n)
    +
    206  rlat(n)=rlatx(n)
    +
    207  ENDDO
    +
    208  ENDIF
    +
    209  DO n=1,no
    +
    210  xpts(n)=xptsx(n)
    +
    211  ypts(n)=yptsx(n)
    +
    212  ENDDO
    +
    213  !$OMP PARALLEL DO PRIVATE(NK,K,N,I1,J1,IXS,JXS,MX,KXS,KXT,IX,JX,NX) SCHEDULE(STATIC)
    +
    214  DO nk=1,no*km
    +
    215  k=(nk-1)/no+1
    +
    216  n=nk-no*(k-1)
    +
    217  go(n,k)=0
    +
    218  lo(n,k)=.false.
    +
    219  IF(nxy(n).GT.0) THEN
    +
    220  IF(ibi(k).EQ.0.OR.li(nxy(n),k)) THEN
    +
    221  go(n,k)=gi(nxy(n),k)
    +
    222  lo(n,k)=.true.
    +
    223  ! SPIRAL AROUND UNTIL VALID DATA IS FOUND.
    +
    224  ELSEIF(mspiral.GT.1) THEN
    +
    225  i1=nint(xpts(n))
    +
    226  j1=nint(ypts(n))
    +
    227  ixs=int(sign(1.,xpts(n)-i1))
    +
    228  jxs=int(sign(1.,ypts(n)-j1))
    +
    229  DO mx=2,mspiral**2
    +
    230  kxs=int(sqrt(4*mx-2.5))
    +
    231  kxt=mx-(kxs**2/4+1)
    +
    232  SELECT CASE(mod(kxs,4))
    +
    233  CASE(1)
    +
    234  ix=i1-ixs*(kxs/4-kxt)
    +
    235  jx=j1-jxs*kxs/4
    +
    236  CASE(2)
    +
    237  ix=i1+ixs*(1+kxs/4)
    +
    238  jx=j1-jxs*(kxs/4-kxt)
    +
    239  CASE(3)
    +
    240  ix=i1+ixs*(1+kxs/4-kxt)
    +
    241  jx=j1+jxs*(1+kxs/4)
    +
    242  CASE DEFAULT
    +
    243  ix=i1-ixs*kxs/4
    +
    244  jx=j1+jxs*(kxs/4-kxt)
    +
    245  END SELECT
    +
    246  nx = grid_in%field_pos(ix, jx)
    +
    247  IF(nx.GT.0) THEN
    +
    248  IF(li(nx,k)) THEN
    +
    249  go(n,k)=gi(nx,k)
    +
    250  lo(n,k)=.true.
    +
    251  EXIT
    +
    252  ENDIF
    +
    253  ENDIF
    +
    254  ENDDO
    +
    255  ENDIF
    +
    256  ENDIF
    +
    257  ENDDO
    +
    258 
    +
    259  DO k=1,km
    +
    260  ibo(k)=ibi(k)
    +
    261  IF(.NOT.all(lo(1:no,k))) ibo(k)=1
    +
    262  ENDDO
    +
    263 
    +
    264  select type(grid_out)
    +
    265  type is(ip_equid_cylind_grid)
    +
    266  CALL polfixs(no,mo,km,rlat,ibo,lo,go)
    +
    267  end select
    +
    268  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    269  ELSE
    +
    270  IF(iret.EQ.0) iret=iretx
    +
    271  IF(.not. to_station_points) no=0
    +
    272  ENDIF
    +
    273  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    274  END SUBROUTINE interpolate_neighbor_scalar
    +
    275 
    +
    352  SUBROUTINE interpolate_neighbor_vector(IPOPT,grid_in,grid_out, &
    +
    353  MI,MO,KM,IBI,LI,UI,VI, &
    +
    354  NO,RLAT,RLON,CROT,SROT,IBO,LO,UO,VO,IRET)
    +
    355 
    +
    356  class(ip_grid), intent(in) :: grid_in, grid_out
    +
    357  INTEGER, INTENT(IN ) :: IPOPT(20)
    +
    358  INTEGER, INTENT(IN ) :: IBI(KM),MI,MO,KM
    +
    359  INTEGER, INTENT(INOUT) :: NO
    +
    360  INTEGER, INTENT( OUT) :: IRET, IBO(KM)
    +
    361  !
    +
    362  LOGICAL*1, INTENT(IN ) :: LI(MI,KM)
    +
    363  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
    +
    364  !
    +
    365  REAL, INTENT(IN ) :: UI(MI,KM),VI(MI,KM)
    +
    366  REAL, INTENT(INOUT) :: CROT(MO),SROT(MO)
    +
    367  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    368  REAL, INTENT( OUT) :: UO(MO,KM),VO(MO,KM)
    +
    369  !
    +
    370  REAL, PARAMETER :: FILL=-9999.
    +
    371  !
    +
    372  INTEGER :: I1,J1,IXS,JXS,MX
    +
    373  INTEGER :: KXS,KXT,IX,JX,NX
    +
    374  INTEGER :: MSPIRAL,N,K,NK,NV
    +
    375  !
    +
    376  LOGICAL :: SAME_GRIDI, SAME_GRIDO
    +
    377  !
    +
    378  REAL :: CX,SX,CM,SM,UROT,VROT
    +
    379  REAL :: XPTS(MO),YPTS(MO)
    +
    380  REAL :: CROI(MI),SROI(MI)
    +
    381  REAL :: XPTI(MI),YPTI(MI),RLOI(MI),RLAI(MI)
    +
    382 
    +
    383  logical :: to_station_points
    +
    384 
    +
    385  INTEGER, SAVE :: NOX=-1,iretx=-1
    +
    386  INTEGER, ALLOCATABLE, SAVE :: NXY(:)
    +
    387 
    +
    388  REAL, ALLOCATABLE, SAVE :: RLATX(:),RLONX(:),XPTSX(:),YPTSX(:)
    +
    389  REAL, ALLOCATABLE, SAVE :: CROTX(:),SROTX(:),CXY(:),SXY(:)
    +
    390  class(ip_grid), allocatable, save :: prev_grid_in, prev_grid_out
    +
    391  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    392  ! SET PARAMETERS
    +
    393  iret=0
    +
    394  mspiral=max(ipopt(1),1)
    +
    395  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    396 
    +
    397  if (.not. allocated(prev_grid_in) .or. .not. allocated(prev_grid_out)) then
    +
    398  allocate(prev_grid_in, source = grid_in)
    +
    399  allocate(prev_grid_out, source = grid_out)
    +
    400 
    +
    401  same_gridi = .false.
    +
    402  same_grido = .false.
    +
    403  else
    +
    404  same_gridi = grid_in == prev_grid_in
    +
    405  same_grido = grid_out == prev_grid_out
    +
    406 
    +
    407  if (.not. same_gridi .or. .not. same_grido) then
    +
    408  deallocate(prev_grid_in)
    +
    409  deallocate(prev_grid_out)
    +
    410 
    +
    411  allocate(prev_grid_in, source = grid_in)
    +
    412  allocate(prev_grid_out, source = grid_out)
    +
    413  end if
    +
    414  end if
    +
    415 
    +
    416  select type(grid_out)
    +
    417  type is(ip_station_points_grid)
    +
    418  to_station_points = .true.
    +
    419  class default
    +
    420  to_station_points = .false.
    +
    421  end select
    +
    422 
    +
    423  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    424  ! SAVE OR SKIP WEIGHT COMPUTATION
    +
    425  IF(iret.EQ.0.AND.(to_station_points.OR..NOT.same_gridi.OR..NOT.same_grido))THEN
    +
    426  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    427  ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
    +
    428  CALL gdswzd(grid_out, 0,mo,fill,xpts,ypts,rlon,rlat,no,crot,srot)
    +
    429  IF(no.EQ.0) iret=3
    +
    430  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    431  ! LOCATE INPUT POINTS
    +
    432  CALL gdswzd(grid_in,-1,no,fill,xpts,ypts,rlon,rlat,nv)
    +
    433  IF(iret.EQ.0.AND.nv.EQ.0) iret=2
    +
    434  CALL gdswzd(grid_in, 0,mi,fill,xpti,ypti,rloi,rlai,nv,croi,sroi)
    +
    435  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    436  ! ALLOCATE AND SAVE GRID DATA
    +
    437  IF(nox.NE.no) THEN
    +
    438  IF(nox.GE.0) DEALLOCATE(rlatx,rlonx,xptsx,yptsx,crotx,srotx,nxy,cxy,sxy)
    +
    439  ALLOCATE(rlatx(no),rlonx(no),xptsx(no),yptsx(no), &
    +
    440  crotx(no),srotx(no),nxy(no),cxy(no),sxy(no))
    +
    441  nox=no
    +
    442  ENDIF
    +
    443  iretx=iret
    +
    444  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    445  ! COMPUTE WEIGHTS
    +
    446  IF(iret.EQ.0) THEN
    +
    447  !$OMP PARALLEL DO PRIVATE(N,CM,SM) SCHEDULE(STATIC)
    +
    448  DO n=1,no
    +
    449  rlonx(n)=rlon(n)
    +
    450  rlatx(n)=rlat(n)
    +
    451  xptsx(n)=xpts(n)
    +
    452  yptsx(n)=ypts(n)
    +
    453  crotx(n)=crot(n)
    +
    454  srotx(n)=srot(n)
    +
    455  IF(abs(xpts(n)-fill).GT.tinyreal.AND.abs(ypts(n)-fill).GT.tinyreal) THEN
    +
    456  nxy(n) = grid_in%field_pos(nint(xpts(n)),nint(ypts(n)))
    +
    457  IF(nxy(n).GT.0) THEN
    +
    458  CALL movect(rlai(nxy(n)),rloi(nxy(n)),rlat(n),rlon(n),cm,sm)
    +
    459  cxy(n)=cm*croi(nxy(n))+sm*sroi(nxy(n))
    +
    460  sxy(n)=sm*croi(nxy(n))-cm*sroi(nxy(n))
    +
    461  ENDIF
    +
    462  ELSE
    +
    463  nxy(n)=0
    +
    464  ENDIF
    +
    465  ENDDO
    +
    466  ENDIF
    +
    467  ENDIF
    +
    468  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    469  ! INTERPOLATE OVER ALL FIELDS
    +
    470  IF(iret.EQ.0.AND.iretx.EQ.0) THEN
    +
    471  IF(.not. to_station_points) THEN
    +
    472  no=nox
    +
    473  DO n=1,no
    +
    474  rlon(n)=rlonx(n)
    +
    475  rlat(n)=rlatx(n)
    +
    476  crot(n)=crotx(n)
    +
    477  srot(n)=srotx(n)
    +
    478  ENDDO
    +
    479  ENDIF
    +
    480  DO n=1,no
    +
    481  xpts(n)=xptsx(n)
    +
    482  ypts(n)=yptsx(n)
    +
    483  ENDDO
    +
    484  !$OMP PARALLEL DO &
    +
    485  !$OMP PRIVATE(NK,K,N,I1,J1,IXS,JXS,MX,KXS,KXT,IX,JX,NX) &
    +
    486  !$OMP PRIVATE(CM,SM,CX,SX,UROT,VROT) SCHEDULE(STATIC)
    +
    487  DO nk=1,no*km
    +
    488  k=(nk-1)/no+1
    +
    489  n=nk-no*(k-1)
    +
    490  uo(n,k)=0
    +
    491  vo(n,k)=0
    +
    492  lo(n,k)=.false.
    +
    493  IF(nxy(n).GT.0) THEN
    +
    494  IF(ibi(k).EQ.0.OR.li(nxy(n),k)) THEN
    +
    495  urot=cxy(n)*ui(nxy(n),k)-sxy(n)*vi(nxy(n),k)
    +
    496  vrot=sxy(n)*ui(nxy(n),k)+cxy(n)*vi(nxy(n),k)
    +
    497  uo(n,k)=crot(n)*urot-srot(n)*vrot
    +
    498  vo(n,k)=srot(n)*urot+crot(n)*vrot
    +
    499  lo(n,k)=.true.
    +
    500  ! SPIRAL AROUND UNTIL VALID DATA IS FOUND.
    +
    501  ELSEIF(mspiral.GT.1) THEN
    +
    502  i1=nint(xpts(n))
    +
    503  j1=nint(ypts(n))
    +
    504  ixs=int(sign(1.,xpts(n)-i1))
    +
    505  jxs=int(sign(1.,ypts(n)-j1))
    +
    506  DO mx=2,mspiral**2
    +
    507  kxs=int(sqrt(4*mx-2.5))
    +
    508  kxt=mx-(kxs**2/4+1)
    +
    509  SELECT CASE(mod(kxs,4))
    +
    510  CASE(1)
    +
    511  ix=i1-ixs*(kxs/4-kxt)
    +
    512  jx=j1-jxs*kxs/4
    +
    513  CASE(2)
    +
    514  ix=i1+ixs*(1+kxs/4)
    +
    515  jx=j1-jxs*(kxs/4-kxt)
    +
    516  CASE(3)
    +
    517  ix=i1+ixs*(1+kxs/4-kxt)
    +
    518  jx=j1+jxs*(1+kxs/4)
    +
    519  CASE DEFAULT
    +
    520  ix=i1-ixs*kxs/4
    +
    521  jx=j1+jxs*(kxs/4-kxt)
    +
    522  END SELECT
    +
    523  nx = grid_in%field_pos(ix, jx)
    +
    524  IF(nx.GT.0) THEN
    +
    525  IF(li(nx,k)) THEN
    +
    526  CALL movect(rlai(nx),rloi(nx),rlat(n),rlon(n),cm,sm)
    +
    527  cx=cm*croi(nx)+sm*sroi(nx)
    +
    528  sx=sm*croi(nx)-cm*sroi(nx)
    +
    529  urot=cx*ui(nx,k)-sx*vi(nx,k)
    +
    530  vrot=sx*ui(nx,k)+cx*vi(nx,k)
    +
    531  uo(n,k)=crot(n)*urot-srot(n)*vrot
    +
    532  vo(n,k)=srot(n)*urot+crot(n)*vrot
    +
    533  lo(n,k)=.true.
    +
    534  EXIT
    +
    535  ENDIF
    +
    536  ENDIF
    +
    537  ENDDO
    +
    538  ENDIF
    +
    539  ENDIF
    +
    540  ENDDO
    +
    541  DO k=1,km
    +
    542  ibo(k)=ibi(k)
    +
    543  IF(.NOT.all(lo(1:no,k))) ibo(k)=1
    +
    544  ENDDO
    +
    545 
    +
    546  select type(grid_out)
    +
    547  type is(ip_equid_cylind_grid)
    +
    548  CALL polfixv(no,mo,km,rlat,rlon,ibo,lo,uo,vo)
    +
    549  end select
    +
    550 
    +
    551  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    552  ELSE
    +
    553  IF(iret.EQ.0) iret=iretx
    +
    554  IF(.not. to_station_points) no=0
    +
    555  ENDIF
    +
    556  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    557  END SUBROUTINE interpolate_neighbor_vector
    +
    558 
    +
    559 end module neighbor_interp_mod
    + + +
    subroutine movect(FLAT, FLON, TLAT, TLON, CROT, SROT)
    This subprogram provides the rotation parameters to move a vector along a great circle from one posit...
    Definition: movect.F90:26
    +
    Driver module for gdswzd routines.
    Definition: gdswzd_mod.F90:25
    +
    Re-export the individual grids.
    Definition: ip_grids_mod.F90:7
    +
    Interpolate scalar fields (neighbor).
    +
    subroutine interpolate_neighbor_vector(IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
    Interpolate vector fields (neighbor).
    +
    subroutine interpolate_neighbor_scalar(IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
    Interpolate scalar fields (neighbor).
    +
    Make multiple pole scalar values consistent.
    Definition: polfix_mod.F90:7
    +
    subroutine, public polfixs(NM, NX, KM, RLAT, IB, LO, GO)
    Make multiple pole scalar values consistent.
    Definition: polfix_mod.F90:30
    +
    subroutine, public polfixv(NM, NX, KM, RLAT, RLON, IB, LO, UO, VO)
    Make multiple pole vector values consistent,.
    Definition: polfix_mod.F90:125
    +
    +
    + + + + diff --git a/ver-5.1.0/open.png b/ver-5.1.0/open.png new file mode 100644 index 0000000000000000000000000000000000000000..30f75c7efe2dd0c9e956e35b69777a02751f048b GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM + + + + + + +NCEPLIBS-ip: polfix_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    polfix_mod.F90 File Reference
    +
    +
    + +

    Make multiple pole scalar values consistent. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Modules

    module  polfix_mod
     Make multiple pole scalar values consistent.
     
    + + + + + + + +

    +Functions/Subroutines

    subroutine, public polfix_mod::polfixs (NM, NX, KM, RLAT, IB, LO, GO)
     Make multiple pole scalar values consistent. More...
     
    subroutine, public polfix_mod::polfixv (NM, NX, KM, RLAT, RLON, IB, LO, UO, VO)
     Make multiple pole vector values consistent,. More...
     
    +

    Detailed Description

    +

    Make multiple pole scalar values consistent.

    +
    Author
    Kyle Gerheiser
    +
    Date
    2021-07-21
    + +

    Definition in file polfix_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/polfix__mod_8F90.js b/ver-5.1.0/polfix__mod_8F90.js new file mode 100644 index 00000000..b8ccde41 --- /dev/null +++ b/ver-5.1.0/polfix__mod_8F90.js @@ -0,0 +1,5 @@ +var polfix__mod_8F90 = +[ + [ "polfixs", "polfix__mod_8F90.html#a15df1ba2e1fcad1e9465c4aa3a2ba0d6", null ], + [ "polfixv", "polfix__mod_8F90.html#aeefc8f045777f6d962d9ec539ef6007d", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/polfix__mod_8F90_source.html b/ver-5.1.0/polfix__mod_8F90_source.html new file mode 100644 index 00000000..4b71f8b6 --- /dev/null +++ b/ver-5.1.0/polfix__mod_8F90_source.html @@ -0,0 +1,288 @@ + + + + + + + +NCEPLIBS-ip: polfix_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    polfix_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    4 
    +
    7 module polfix_mod
    +
    8  implicit none
    +
    9 
    +
    10  private
    +
    11  public :: polfixs, polfixv
    +
    12 
    +
    13 contains
    +
    14 
    +
    29  SUBROUTINE polfixs(NM,NX,KM,RLAT,IB,LO,GO)
    +
    30  IMPLICIT NONE
    +
    31  !
    +
    32  INTEGER, INTENT(IN ) :: nm, nx, km
    +
    33  INTEGER, INTENT(IN ) :: ib(km)
    +
    34  !
    +
    35  LOGICAL*1, INTENT(INOUT) :: lo(nx,km)
    +
    36  !
    +
    37  REAL, INTENT(IN ) :: rlat(nm)
    +
    38  REAL, INTENT(INOUT) :: go(nx,km)
    +
    39  !
    +
    40  REAL, PARAMETER :: rlatnp=89.9995
    +
    41  REAL, PARAMETER :: rlatsp=-rlatnp
    +
    42  !
    +
    43  INTEGER :: k, n
    +
    44  !
    +
    45  REAL :: wnp, gnp, tnp, wsp, gsp, tsp
    +
    46  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    47  DO k=1,km
    +
    48  wnp=0.
    +
    49  gnp=0.
    +
    50  tnp=0.
    +
    51  wsp=0.
    +
    52  gsp=0.
    +
    53  tsp=0.
    +
    54  ! AVERAGE MULTIPLE POLE VALUES
    +
    55  !$OMP PARALLEL DO PRIVATE(N) REDUCTION(+:WNP,GNP,TNP,WSP,GSP,TSP) SCHEDULE(STATIC)
    +
    56  DO n=1,nm
    +
    57  IF(rlat(n).GE.rlatnp) THEN
    +
    58  wnp=wnp+1
    +
    59  IF(ib(k).EQ.0.OR.lo(n,k)) THEN
    +
    60  gnp=gnp+go(n,k)
    +
    61  tnp=tnp+1
    +
    62  ENDIF
    +
    63  ELSEIF(rlat(n).LE.rlatsp) THEN
    +
    64  wsp=wsp+1
    +
    65  IF(ib(k).EQ.0.OR.lo(n,k)) THEN
    +
    66  gsp=gsp+go(n,k)
    +
    67  tsp=tsp+1
    +
    68  ENDIF
    +
    69  ENDIF
    +
    70  ENDDO
    +
    71  !$OMP END PARALLEL DO
    +
    72  ! DISTRIBUTE AVERAGE VALUES BACK TO MULTIPLE POLES
    +
    73  IF(wnp.GT.1) THEN
    +
    74  IF(tnp.GE.wnp/2) THEN
    +
    75  gnp=gnp/tnp
    +
    76  ELSE
    +
    77  gnp=0.
    +
    78  ENDIF
    +
    79  !$OMP PARALLEL DO PRIVATE(N) SCHEDULE(STATIC)
    +
    80  DO n=1,nm
    +
    81  IF(rlat(n).GE.rlatnp) THEN
    +
    82  IF(ib(k).NE.0) lo(n,k)=tnp.GE.wnp/2
    +
    83  go(n,k)=gnp
    +
    84  ENDIF
    +
    85  ENDDO
    +
    86  !$OMP END PARALLEL DO
    +
    87  ENDIF
    +
    88  IF(wsp.GT.1) THEN
    +
    89  IF(tsp.GE.wsp/2) THEN
    +
    90  gsp=gsp/tsp
    +
    91  ELSE
    +
    92  gsp=0.
    +
    93  ENDIF
    +
    94  !$OMP PARALLEL DO PRIVATE(N) SCHEDULE(STATIC)
    +
    95  DO n=1,nm
    +
    96  IF(rlat(n).LE.rlatsp) THEN
    +
    97  IF(ib(k).NE.0) lo(n,k)=tsp.GE.wsp/2
    +
    98  go(n,k)=gsp
    +
    99  ENDIF
    +
    100  ENDDO
    +
    101  !$OMP END PARALLEL DO
    +
    102  ENDIF
    +
    103  ENDDO
    +
    104  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    105  END SUBROUTINE polfixs
    +
    106 
    +
    124  SUBROUTINE polfixv(NM,NX,KM,RLAT,RLON,IB,LO,UO,VO)
    +
    125  IMPLICIT NONE
    +
    126  !
    +
    127  INTEGER, INTENT(IN ) :: ib(km), nm, nx, km
    +
    128  !
    +
    129  LOGICAL*1, INTENT(INOUT) :: lo(nx,km)
    +
    130  !
    +
    131  REAL, INTENT(IN ) :: rlat(nm), rlon(nm)
    +
    132  REAL, INTENT(INOUT) :: uo(nx,km), vo(nx,km)
    +
    133  !
    +
    134  REAL, PARAMETER :: rlatnp=89.9995
    +
    135  REAL, PARAMETER :: rlatsp=-rlatnp
    +
    136  REAL, PARAMETER :: pi=3.14159265358979
    +
    137  REAL, PARAMETER :: dpr=180./pi
    +
    138  !
    +
    139  INTEGER :: k, n
    +
    140  !
    +
    141  REAL :: clon(nm),slon(nm)
    +
    142  REAL :: tnp, unp, vnp, wnp
    +
    143  REAL :: tsp, usp, vsp, wsp
    +
    144  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    145  !$OMP PARALLEL DO PRIVATE(N) SCHEDULE(STATIC)
    +
    146  DO n=1,nm
    +
    147  clon(n)=cos(rlon(n)/dpr)
    +
    148  slon(n)=sin(rlon(n)/dpr)
    +
    149  ENDDO
    +
    150  !$OMP END PARALLEL DO
    +
    151  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    152  DO k=1,km
    +
    153  wnp=0.
    +
    154  unp=0.
    +
    155  vnp=0.
    +
    156  tnp=0.
    +
    157  wsp=0.
    +
    158  usp=0.
    +
    159  vsp=0.
    +
    160  tsp=0.
    +
    161  ! AVERAGE MULTIPLE POLE VALUES
    +
    162  !$OMP PARALLEL DO PRIVATE(N) REDUCTION(+:WNP,UNP,VNP,TNP,WSP,USP,VSP,TSP) SCHEDULE(STATIC)
    +
    163  DO n=1,nm
    +
    164  IF(rlat(n).GE.rlatnp) THEN
    +
    165  wnp=wnp+1
    +
    166  IF(ib(k).EQ.0.OR.lo(n,k)) THEN
    +
    167  unp=unp+(clon(n)*uo(n,k)-slon(n)*vo(n,k))
    +
    168  vnp=vnp+(slon(n)*uo(n,k)+clon(n)*vo(n,k))
    +
    169  tnp=tnp+1
    +
    170  ENDIF
    +
    171  ELSEIF(rlat(n).LE.rlatsp) THEN
    +
    172  wsp=wsp+1
    +
    173  IF(ib(k).EQ.0.OR.lo(n,k)) THEN
    +
    174  usp=usp+(clon(n)*uo(n,k)+slon(n)*vo(n,k))
    +
    175  vsp=vsp+(-slon(n)*uo(n,k)+clon(n)*vo(n,k))
    +
    176  tsp=tsp+1
    +
    177  ENDIF
    +
    178  ENDIF
    +
    179  ENDDO
    +
    180  !$OMP END PARALLEL DO
    +
    181  ! DISTRIBUTE AVERAGE VALUES BACK TO MULTIPLE POLES
    +
    182  IF(wnp.GT.1) THEN
    +
    183  IF(tnp.GE.wnp/2) THEN
    +
    184  unp=unp/tnp
    +
    185  vnp=vnp/tnp
    +
    186  ELSE
    +
    187  unp=0.
    +
    188  vnp=0.
    +
    189  ENDIF
    +
    190  !$OMP PARALLEL DO PRIVATE(N) SCHEDULE(STATIC)
    +
    191  DO n=1,nm
    +
    192  IF(rlat(n).GE.rlatnp) THEN
    +
    193  IF(ib(k).NE.0) lo(n,k)=tnp.GE.wnp/2
    +
    194  uo(n,k)=clon(n)*unp+slon(n)*vnp
    +
    195  vo(n,k)=-slon(n)*unp+clon(n)*vnp
    +
    196  ENDIF
    +
    197  ENDDO
    +
    198  !$OMP END PARALLEL DO
    +
    199  ENDIF
    +
    200  IF(wsp.GT.1) THEN
    +
    201  IF(tsp.GE.wsp/2) THEN
    +
    202  usp=usp/wsp
    +
    203  vsp=vsp/wsp
    +
    204  ELSE
    +
    205  usp=0.
    +
    206  vsp=0.
    +
    207  ENDIF
    +
    208  !$OMP PARALLEL DO PRIVATE(N) SCHEDULE(STATIC)
    +
    209  DO n=1,nm
    +
    210  IF(rlat(n).LE.rlatsp) THEN
    +
    211  IF(ib(k).NE.0) lo(n,k)=tsp.GE.wsp/2
    +
    212  uo(n,k)=clon(n)*usp-slon(n)*vsp
    +
    213  vo(n,k)=slon(n)*usp+clon(n)*vsp
    +
    214  ENDIF
    +
    215  ENDDO
    +
    216  !$OMP END PARALLEL DO
    +
    217  ENDIF
    +
    218  ENDDO
    +
    219  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    220  END SUBROUTINE polfixv
    +
    221 end module polfix_mod
    +
    Make multiple pole scalar values consistent.
    Definition: polfix_mod.F90:7
    +
    subroutine, public polfixs(NM, NX, KM, RLAT, IB, LO, GO)
    Make multiple pole scalar values consistent.
    Definition: polfix_mod.F90:30
    +
    subroutine, public polfixv(NM, NX, KM, RLAT, RLON, IB, LO, UO, VO)
    Make multiple pole vector values consistent,.
    Definition: polfix_mod.F90:125
    +
    +
    + + + + diff --git a/ver-5.1.0/resize.js b/ver-5.1.0/resize.js new file mode 100644 index 00000000..e1ad0fe3 --- /dev/null +++ b/ver-5.1.0/resize.js @@ -0,0 +1,140 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initResizable() +{ + var cookie_namespace = 'doxygen'; + var sidenav,navtree,content,header,collapsed,collapsedWidth=0,barWidth=6,desktop_vp=768,titleHeight; + + function readCookie(cookie) + { + var myCookie = cookie_namespace+"_"+cookie+"="; + if (document.cookie) { + var index = document.cookie.indexOf(myCookie); + if (index != -1) { + var valStart = index + myCookie.length; + var valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + var val = document.cookie.substring(valStart, valEnd); + return val; + } + } + return 0; + } + + function writeCookie(cookie, val, expiration) + { + if (val==undefined) return; + if (expiration == null) { + var date = new Date(); + date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week + expiration = date.toGMTString(); + } + document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; expires=" + expiration+"; path=/"; + } + + function resizeWidth() + { + var windowWidth = $(window).width() + "px"; + var sidenavWidth = $(sidenav).outerWidth(); + content.css({marginLeft:parseInt(sidenavWidth)+"px"}); + writeCookie('width',sidenavWidth-barWidth, null); + } + + function restoreWidth(navWidth) + { + var windowWidth = $(window).width() + "px"; + content.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + sidenav.css({width:navWidth + "px"}); + } + + function resizeHeight() + { + var headerHeight = header.outerHeight(); + var footerHeight = footer.outerHeight(); + var windowHeight = $(window).height() - headerHeight - footerHeight; + content.css({height:windowHeight + "px"}); + navtree.css({height:windowHeight + "px"}); + sidenav.css({height:windowHeight + "px"}); + var width=$(window).width(); + if (width!=collapsedWidth) { + if (width=desktop_vp) { + if (!collapsed) { + collapseExpand(); + } + } else if (width>desktop_vp && collapsedWidth0) { + restoreWidth(0); + collapsed=true; + } + else { + var width = readCookie('width'); + if (width>200 && width<$(window).width()) { restoreWidth(width); } else { restoreWidth(200); } + collapsed=false; + } + } + + header = $("#top"); + sidenav = $("#side-nav"); + content = $("#doc-content"); + navtree = $("#nav-tree"); + footer = $("#nav-path"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } }); + $(sidenav).resizable({ minWidth: 0 }); + $(window).resize(function() { resizeHeight(); }); + var device = navigator.userAgent.toLowerCase(); + var touch_device = device.match(/(iphone|ipod|ipad|android)/); + if (touch_device) { /* wider split bar for touch only devices */ + $(sidenav).css({ paddingRight:'20px' }); + $('.ui-resizable-e').css({ width:'20px' }); + $('#nav-sync').css({ right:'34px' }); + barWidth=20; + } + var width = readCookie('width'); + if (width) { restoreWidth(width); } else { resizeWidth(); } + resizeHeight(); + var url = location.href; + var i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + var _preventDefault = function(evt) { evt.preventDefault(); }; + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(".ui-resizable-handle").dblclick(collapseExpand); + $(window).on('load',resizeHeight); +} +/* @license-end */ diff --git a/search/all_0.html b/ver-5.1.0/search/all_0.html similarity index 100% rename from search/all_0.html rename to ver-5.1.0/search/all_0.html diff --git a/ver-5.1.0/search/all_0.js b/ver-5.1.0/search/all_0.js new file mode 100644 index 00000000..bba3ab42 --- /dev/null +++ b/ver-5.1.0/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['an_0',['an',['../namespaceip__lambert__conf__grid__mod.html#a82b75fe2d8495aab75b225c6309e61c8',1,'ip_lambert_conf_grid_mod']]] +]; diff --git a/search/all_1.html b/ver-5.1.0/search/all_1.html similarity index 100% rename from search/all_1.html rename to ver-5.1.0/search/all_1.html diff --git a/ver-5.1.0/search/all_1.js b/ver-5.1.0/search/all_1.js new file mode 100644 index 00000000..ce0809b3 --- /dev/null +++ b/ver-5.1.0/search/all_1.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['bicubic_5finterp_5fid_1',['bicubic_interp_id',['../namespaceip__interpolators__mod.html#adfdc7760718083d85618df85320c495e',1,'ip_interpolators_mod']]], + ['bicubic_5finterp_5fmod_2',['bicubic_interp_mod',['../namespacebicubic__interp__mod.html',1,'']]], + ['bicubic_5finterp_5fmod_2ef90_3',['bicubic_interp_mod.F90',['../bicubic__interp__mod_8F90.html',1,'']]], + ['bilinear_5finterp_5fid_4',['bilinear_interp_id',['../namespaceip__interpolators__mod.html#a753e4b6c113a9a8b226c3c834786f3e1',1,'ip_interpolators_mod']]], + ['bilinear_5finterp_5fmod_5',['bilinear_interp_mod',['../namespacebilinear__interp__mod.html',1,'']]], + ['bilinear_5finterp_5fmod_2ef90_6',['bilinear_interp_mod.F90',['../bilinear__interp__mod_8F90.html',1,'']]], + ['blat_7',['blat',['../namespaceip__gaussian__grid__mod.html#ae2697b9c4dbe4945276633d1951e79fc',1,'ip_gaussian_grid_mod']]], + ['budget_5finterp_5fid_8',['budget_interp_id',['../namespaceip__interpolators__mod.html#a7df843ca4a64e3178f448aebf7dad359',1,'ip_interpolators_mod']]], + ['budget_5finterp_5fmod_9',['budget_interp_mod',['../namespacebudget__interp__mod.html',1,'']]], + ['budget_5finterp_5fmod_2ef90_10',['budget_interp_mod.F90',['../budget__interp__mod_8F90.html',1,'']]] +]; diff --git a/search/all_10.html b/ver-5.1.0/search/all_10.html similarity index 100% rename from search/all_10.html rename to ver-5.1.0/search/all_10.html diff --git a/ver-5.1.0/search/all_10.js b/ver-5.1.0/search/all_10.js new file mode 100644 index 00000000..3c46c133 --- /dev/null +++ b/ver-5.1.0/search/all_10.js @@ -0,0 +1,42 @@ +var searchData= +[ + ['radb2_237',['radb2',['../fftpack_8F.html#ae63abe3a02989ed4fbd60b50bc0c6dda',1,'fftpack.F']]], + ['radb3_238',['radb3',['../fftpack_8F.html#a6129001ac4cdf5d5a345edc2822d8014',1,'fftpack.F']]], + ['radb4_239',['radb4',['../fftpack_8F.html#a3b5aab129020968eaf92f2e6ca0785ef',1,'fftpack.F']]], + ['radb5_240',['radb5',['../fftpack_8F.html#a2b6492f922cbee03af5b89d52356abf1',1,'fftpack.F']]], + ['radbg_241',['radbg',['../fftpack_8F.html#af5a2521b66fece6cc768206c1df0d20b',1,'fftpack.F']]], + ['radf2_242',['radf2',['../fftpack_8F.html#a70e2420dd5bee9e41eb6c15bbad5eef6',1,'fftpack.F']]], + ['radf3_243',['radf3',['../fftpack_8F.html#a51374398f8edd5701987ce483c739592',1,'fftpack.F']]], + ['radf4_244',['radf4',['../fftpack_8F.html#ae9910ca606fd0cdb03b5b3b98533f486',1,'fftpack.F']]], + ['radf5_245',['radf5',['../fftpack_8F.html#a6d852c36924b038f77a24b8e22205add',1,'fftpack.F']]], + ['radfg_246',['radfg',['../fftpack_8F.html#ad5dbca6bb6ee7c0a86a1e140627de1b2',1,'fftpack.F']]], + ['rerth_247',['rerth',['../namespaceip__lambert__conf__grid__mod.html#a9f0538d092cd7d2829a5b98247eb560d',1,'ip_lambert_conf_grid_mod::rerth()'],['../namespaceip__equid__cylind__grid__mod.html#ab5b84516fab9cee3316c07450f49746c',1,'ip_equid_cylind_grid_mod::rerth()'],['../namespaceip__gaussian__grid__mod.html#a8213e02ccf4325ad5db14f2e48990da2',1,'ip_gaussian_grid_mod::rerth()'],['../namespaceip__mercator__grid__mod.html#adaa27c5d41ee24185b6d020420ce9419',1,'ip_mercator_grid_mod::rerth()'],['../namespaceip__polar__stereo__grid__mod.html#a3315b2efb5cb9aebc0b2cb2773aa20b5',1,'ip_polar_stereo_grid_mod::rerth()'],['../namespaceip__rot__equid__cylind__egrid__mod.html#aed7a425f4d300fe14ac1b48d76378edb',1,'ip_rot_equid_cylind_egrid_mod::rerth()'],['../namespaceip__rot__equid__cylind__grid__mod.html#ae08318392106d174ab36cf7dc05c570b',1,'ip_rot_equid_cylind_grid_mod::rerth()'],['../structip__grid__mod_1_1ip__grid.html#a2bb4d4ec2455c3148313bf7cc54e1cc8',1,'ip_grid_mod::ip_grid::rerth()']]], + ['rerth_5fwgs84_248',['rerth_wgs84',['../namespaceip__constants__mod.html#ac6a501512f426673f064edbecd7a62fb',1,'ip_constants_mod']]], + ['rfftb_249',['rfftb',['../fftpack_8F.html#a79ba25d1f342858b0faa3c3e3585ec88',1,'fftpack.F']]], + ['rfftb1_250',['rfftb1',['../fftpack_8F.html#afa735c298a72dd1c13ab1c45e737c066',1,'fftpack.F']]], + ['rfftf_251',['rfftf',['../fftpack_8F.html#afbb5dc9c70ebe24759d5ffec1d3e42e2',1,'fftpack.F']]], + ['rfftf1_252',['rfftf1',['../fftpack_8F.html#acdf9efa42dc73f90af444ee0da649a09',1,'fftpack.F']]], + ['rffti_253',['rffti',['../fftpack_8F.html#a50f1237ff5990436609962c0eae406db',1,'fftpack.F']]], + ['rffti1_254',['rffti1',['../fftpack_8F.html#ae3569ef7a371390f6bf38417865ef71b',1,'fftpack.F']]], + ['rlat1_255',['rlat1',['../structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a493e017343795e89f794bae5229eb6a7',1,'ip_equid_cylind_grid_mod::ip_equid_cylind_grid::rlat1()'],['../structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#acdf76c4b3444d0d85dbf9ee09b5f35fc',1,'ip_gaussian_grid_mod::ip_gaussian_grid::rlat1()'],['../structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a618bb61b83c39dd344264933e51fa932',1,'ip_lambert_conf_grid_mod::ip_lambert_conf_grid::rlat1()'],['../structip__mercator__grid__mod_1_1ip__mercator__grid.html#a1f98e5046c7c1eda30735e5919b79cc7',1,'ip_mercator_grid_mod::ip_mercator_grid::rlat1()'],['../structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a00565fd51d334324e9d68d1fc8c52640',1,'ip_polar_stereo_grid_mod::ip_polar_stereo_grid::rlat1()'],['../structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a884837892bf520ea7950f95d8c562a08',1,'ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::rlat1()']]], + ['rlat2_256',['rlat2',['../structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#acfd62fa8199f9b57b555364bca920e42',1,'ip_equid_cylind_grid_mod::ip_equid_cylind_grid']]], + ['rlati_257',['rlati',['../structip__mercator__grid__mod_1_1ip__mercator__grid.html#a3826e3e6b4f3264932c890a3c9804cef',1,'ip_mercator_grid_mod::ip_mercator_grid']]], + ['rlati1_258',['rlati1',['../structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a7dcfaef2adc076604ad32d1ecd1f1cb4',1,'ip_lambert_conf_grid_mod::ip_lambert_conf_grid']]], + ['rlati2_259',['rlati2',['../structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#ae8b2c54b8d00685e179fec7786422f3b',1,'ip_lambert_conf_grid_mod::ip_lambert_conf_grid']]], + ['rlon0_260',['rlon0',['../structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a65579b8557bffeedb99f384048dea14e',1,'ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::rlon0()'],['../structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a7b111301b2fc41270869ee182512f13c',1,'ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::rlon0()'],['../namespaceip__rot__equid__cylind__egrid__mod.html#a134acf8ab7f40ff49ce8e03daad900e6',1,'ip_rot_equid_cylind_egrid_mod::rlon0()'],['../namespaceip__rot__equid__cylind__grid__mod.html#a620a55069afd33b301240533915387df',1,'ip_rot_equid_cylind_grid_mod::rlon0()']]], + ['rlon1_261',['rlon1',['../structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#aa927f5ecca3f2880ad88e60c8d4b8871',1,'ip_equid_cylind_grid_mod::ip_equid_cylind_grid::rlon1()'],['../structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a583517b74d3c1c1b354fefe0d6871c4d',1,'ip_gaussian_grid_mod::ip_gaussian_grid::rlon1()'],['../structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#ab7e9e396d5eeb63c8079a901c2c8743f',1,'ip_lambert_conf_grid_mod::ip_lambert_conf_grid::rlon1()'],['../structip__mercator__grid__mod_1_1ip__mercator__grid.html#adb673d1f9dbc7d7ee6f87513a2eed723',1,'ip_mercator_grid_mod::ip_mercator_grid::rlon1()'],['../structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a61650c9ce1a2ce44243bf491e5d93728',1,'ip_polar_stereo_grid_mod::ip_polar_stereo_grid::rlon1()'],['../structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a3684458139a165cd719b054637a7d121',1,'ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::rlon1()']]], + ['rlon2_262',['rlon2',['../structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a3794a22c4866631c6b5bc6a8871e3e44',1,'ip_gaussian_grid_mod::ip_gaussian_grid::rlon2()'],['../structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a1e5b9f8ab3de743b5e392478694154ea',1,'ip_equid_cylind_grid_mod::ip_equid_cylind_grid::rlon2()'],['../structip__mercator__grid__mod_1_1ip__mercator__grid.html#a0b9bfef606985f5e682f4ddb84c99d2c',1,'ip_mercator_grid_mod::ip_mercator_grid::rlon2()']]], + ['rot_5fequid_5fcylind_5fb_5fgrid_5fid_5fgrib1_263',['rot_equid_cylind_b_grid_id_grib1',['../namespaceip__grid__mod.html#adb7d7d18410aaae52d7eee2e97f04b14',1,'ip_grid_mod']]], + ['rot_5fequid_5fcylind_5fb_5fgrid_5fid_5fgrib2_264',['rot_equid_cylind_b_grid_id_grib2',['../namespaceip__grid__mod.html#adbda63b51409aaed34a707b222da8c43',1,'ip_grid_mod']]], + ['rot_5fequid_5fcylind_5fe_5fgrid_5fid_5fgrib1_265',['rot_equid_cylind_e_grid_id_grib1',['../namespaceip__grid__mod.html#a4e11ce780c3d165c282684188890af1c',1,'ip_grid_mod']]], + ['rot_5fequid_5fcylind_5fe_5fgrid_5fid_5fgrib2_266',['rot_equid_cylind_e_grid_id_grib2',['../namespaceip__grid__mod.html#a248f834201bea9295bbe6a99abd038f8',1,'ip_grid_mod']]], + ['rot_5fequid_5fcylind_5fegrid_5ferror_267',['rot_equid_cylind_egrid_error',['../namespaceip__rot__equid__cylind__egrid__mod.html#a69d4e473a1a276b855d37518dc6f1d48',1,'ip_rot_equid_cylind_egrid_mod']]], + ['rot_5fequid_5fcylind_5fegrid_5fgrid_5farea_268',['rot_equid_cylind_egrid_grid_area',['../namespaceip__rot__equid__cylind__egrid__mod.html#a4e6c3a758f9a6474d3e499fabeac0640',1,'ip_rot_equid_cylind_egrid_mod']]], + ['rot_5fequid_5fcylind_5fegrid_5fmap_5fjacob_269',['rot_equid_cylind_egrid_map_jacob',['../namespaceip__rot__equid__cylind__egrid__mod.html#a45b87f77888d428ca0f551edae8da94e',1,'ip_rot_equid_cylind_egrid_mod']]], + ['rot_5fequid_5fcylind_5fegrid_5fvect_5frot_270',['rot_equid_cylind_egrid_vect_rot',['../namespaceip__rot__equid__cylind__egrid__mod.html#a9ac1f76f515981c464e8391d8c941888',1,'ip_rot_equid_cylind_egrid_mod']]], + ['rot_5fequid_5fcylind_5ferror_271',['rot_equid_cylind_error',['../namespaceip__rot__equid__cylind__grid__mod.html#a1cc09c83f9a3815d8c5f8ed2f239f53f',1,'ip_rot_equid_cylind_grid_mod']]], + ['rot_5fequid_5fcylind_5fgrid_5farea_272',['rot_equid_cylind_grid_area',['../namespaceip__rot__equid__cylind__grid__mod.html#ad8f1133eb6809705c15337134eafe9fd',1,'ip_rot_equid_cylind_grid_mod']]], + ['rot_5fequid_5fcylind_5fgrid_5fid_5fgrib2_273',['rot_equid_cylind_grid_id_grib2',['../namespaceip__grid__mod.html#adc7c650c524eb6425e77b2e0eac0979a',1,'ip_grid_mod']]], + ['rot_5fequid_5fcylind_5fmap_5fjacob_274',['rot_equid_cylind_map_jacob',['../namespaceip__rot__equid__cylind__grid__mod.html#a985f1dc1a20444cef706d4bb20e0841b',1,'ip_rot_equid_cylind_grid_mod']]], + ['rot_5fequid_5fcylind_5fvect_5frot_275',['rot_equid_cylind_vect_rot',['../namespaceip__rot__equid__cylind__grid__mod.html#a3de472bfc18740a7d985f560f3541c10',1,'ip_rot_equid_cylind_grid_mod']]] +]; diff --git a/search/all_11.html b/ver-5.1.0/search/all_11.html similarity index 100% rename from search/all_11.html rename to ver-5.1.0/search/all_11.html diff --git a/ver-5.1.0/search/all_11.js b/ver-5.1.0/search/all_11.js new file mode 100644 index 00000000..c2b858ec --- /dev/null +++ b/ver-5.1.0/search/all_11.js @@ -0,0 +1,117 @@ +var searchData= +[ + ['sbd_276',['sbd',['../structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a246ec0afc422f6cfcc3758ff62c6017f',1,'ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid']]], + ['scfft_277',['scfft',['../fftpack_8F.html#a369071ea2d380c9d91ba36d1bf375e33',1,'fftpack.F']]], + ['scrft_278',['scrft',['../fftpack_8F.html#ac69cbd64be972c20a4424f5327fb4b36',1,'fftpack.F']]], + ['slat_279',['slat',['../namespaceip__rot__equid__cylind__egrid__mod.html#ae1f8503816477fb685fbadc7a9e50f0b',1,'ip_rot_equid_cylind_egrid_mod']]], + ['slat0_280',['slat0',['../namespaceip__rot__equid__cylind__grid__mod.html#a64831f92d5306513987a98e97a32aea1',1,'ip_rot_equid_cylind_grid_mod::slat0()'],['../namespaceip__rot__equid__cylind__egrid__mod.html#a72199c827ab3218b7f2aba35ad30b94d',1,'ip_rot_equid_cylind_egrid_mod::slat0()'],['../structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a8a02c6fc1ad38174e15679e69b5cbfdc',1,'ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::slat0()'],['../structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#aca4b0ae69f756ef4854369bf88423d66',1,'ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::slat0()']]], + ['slatr_281',['slatr',['../namespaceip__rot__equid__cylind__egrid__mod.html#a4ccccb64d3e7236d8cac19c279aab900',1,'ip_rot_equid_cylind_egrid_mod::slatr()'],['../structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#aae4f801c95b7b61e2e6b1dd824d3688b',1,'ip_polar_stereo_grid_mod::ip_polar_stereo_grid::slatr()']]], + ['spanaly_282',['spanaly',['../spanaly_8f.html#a5cc846d796d393d7499cde0f3d1d6e6a',1,'spanaly.f']]], + ['spanaly_2ef_283',['spanaly.f',['../spanaly_8f.html',1,'']]], + ['spdz2uv_284',['spdz2uv',['../spdz2uv_8f.html#ae3a4a74c49f78a25425b610743dc0692',1,'spdz2uv.f']]], + ['spdz2uv_2ef_285',['spdz2uv.f',['../spdz2uv_8f.html',1,'']]], + ['spectral_5finterp_5fid_286',['spectral_interp_id',['../namespaceip__interpolators__mod.html#a83ba2963a0b686c6ae67b53f9c385851',1,'ip_interpolators_mod']]], + ['spectral_5finterp_5fmod_287',['spectral_interp_mod',['../namespacespectral__interp__mod.html',1,'']]], + ['spectral_5finterp_5fmod_2ef90_288',['spectral_interp_mod.F90',['../spectral__interp__mod_8F90.html',1,'']]], + ['speps_289',['speps',['../speps_8f.html#a0ab523ec5e1393ffca970897e63a9131',1,'speps.f']]], + ['speps_2ef_290',['speps.f',['../speps_8f.html',1,'']]], + ['spfft_291',['spfft',['../spfft_8f.html#a1041af8ac4f6a2407b5b7a799a13fb5d',1,'spfft.f']]], + ['spfft_2ef_292',['spfft.f',['../spfft_8f.html',1,'']]], + ['spfft1_293',['spfft1',['../spfft1_8f.html#ac63643472eda83948c0b249b611346d6',1,'spfft1.f']]], + ['spfft1_2ef_294',['spfft1.f',['../spfft1_8f.html',1,'']]], + ['spffte_295',['spffte',['../spffte_8f.html#af06489254bd3e99030b39744fce32233',1,'spffte.f']]], + ['spffte_2ef_296',['spffte.f',['../spffte_8f.html',1,'']]], + ['spfftpt_297',['spfftpt',['../spfftpt_8f.html#ad16e674ce87bd762a714853967f81356',1,'spfftpt.f']]], + ['spfftpt_2ef_298',['spfftpt.f',['../spfftpt_8f.html',1,'']]], + ['spgradq_299',['spgradq',['../spgradq_8f.html#a0bb358cf2a405ce9f17c6e5dfde65849',1,'spgradq.f']]], + ['spgradq_2ef_300',['spgradq.f',['../spgradq_8f.html',1,'']]], + ['spgradx_301',['spgradx',['../spgradx_8f.html#a749bc07e763e9cd44490fff2284d00b4',1,'spgradx.f']]], + ['spgradx_2ef_302',['spgradx.f',['../spgradx_8f.html',1,'']]], + ['spgrady_303',['spgrady',['../spgrady_8f.html#a1b3e38e56560de7d7dcf19ea3e931cf1',1,'spgrady.f']]], + ['spgrady_2ef_304',['spgrady.f',['../spgrady_8f.html',1,'']]], + ['splaplac_305',['splaplac',['../splaplac_8f.html#a64338955857a3cf58283146940e7ae42',1,'splaplac.f']]], + ['splaplac_2ef_306',['splaplac.f',['../splaplac_8f.html',1,'']]], + ['splat_307',['splat',['../splat_8F.html#aa6db21451bb67635e7e4426546140e11',1,'splat.F']]], + ['splat_2ef_308',['splat.F',['../splat_8F.html',1,'']]], + ['splegend_309',['splegend',['../splegend_8f.html#a9c68adc80e97c43ac983b955dd6cabac',1,'splegend.f']]], + ['splegend_2ef_310',['splegend.f',['../splegend_8f.html',1,'']]], + ['sppad_311',['sppad',['../sppad_8f.html#a4338b3ccd7844251bbdabf3da1d6476e',1,'sppad.f']]], + ['sppad_2ef_312',['sppad.f',['../sppad_8f.html',1,'']]], + ['spsynth_313',['spsynth',['../spsynth_8f.html#aa6a8113a459918728c876673520126bf',1,'spsynth.f']]], + ['spsynth_2ef_314',['spsynth.f',['../spsynth_8f.html',1,'']]], + ['sptez_315',['sptez',['../sptez_8f.html#a418a7d182834b2e2dafae2fe881ba9fc',1,'sptez.f']]], + ['sptez_2ef_316',['sptez.f',['../sptez_8f.html',1,'']]], + ['sptezd_317',['sptezd',['../sptezd_8f.html#a6c30b52dcb4da9e403eeeb307b9516d7',1,'sptezd.f']]], + ['sptezd_2ef_318',['sptezd.f',['../sptezd_8f.html',1,'']]], + ['sptezm_319',['sptezm',['../sptezm_8f.html#a1430a0df2cba7eefaf67c939684be2d1',1,'sptezm.f']]], + ['sptezm_2ef_320',['sptezm.f',['../sptezm_8f.html',1,'']]], + ['sptezmd_321',['sptezmd',['../sptezmd_8f.html#a2b9ead06893e51604bfb18928ddee996',1,'sptezmd.f']]], + ['sptezmd_2ef_322',['sptezmd.f',['../sptezmd_8f.html',1,'']]], + ['sptezmv_323',['sptezmv',['../sptezmv_8f.html#a22dc4fc10c5225ec8d3c12ed3cb4786e',1,'sptezmv.f']]], + ['sptezmv_2ef_324',['sptezmv.f',['../sptezmv_8f.html',1,'']]], + ['sptezv_325',['sptezv',['../sptezv_8f.html#a83e49d961c40a2621c3f2afe70846226',1,'sptezv.f']]], + ['sptezv_2ef_326',['sptezv.f',['../sptezv_8f.html',1,'']]], + ['sptgpm_327',['sptgpm',['../sptgpm_8f.html#a6cffaeaa602eaae5c03166f48065158d',1,'sptgpm.f']]], + ['sptgpm_2ef_328',['sptgpm.f',['../sptgpm_8f.html',1,'']]], + ['sptgpmd_329',['sptgpmd',['../sptgpmd_8f.html#af71718c75a2b24b74fa7e1e4318d0539',1,'sptgpmd.f']]], + ['sptgpmd_2ef_330',['sptgpmd.f',['../sptgpmd_8f.html',1,'']]], + ['sptgpmv_331',['sptgpmv',['../sptgpmv_8f.html#a15de3accfd448d116324872c8fb1bb17',1,'sptgpmv.f']]], + ['sptgpmv_2ef_332',['sptgpmv.f',['../sptgpmv_8f.html',1,'']]], + ['sptgps_333',['sptgps',['../sptgps_8f.html#af06a2dccfa311014fc9f671b14f247b2',1,'sptgps.f']]], + ['sptgps_2ef_334',['sptgps.f',['../sptgps_8f.html',1,'']]], + ['sptgpsd_335',['sptgpsd',['../sptgpsd_8f.html#ad6d10c3360c47558a8116b2f5666ed30',1,'sptgpsd.f']]], + ['sptgpsd_2ef_336',['sptgpsd.f',['../sptgpsd_8f.html',1,'']]], + ['sptgpsv_337',['sptgpsv',['../sptgpsv_8f.html#af2bf2335047ec277730564dbfa859079',1,'sptgpsv.f']]], + ['sptgpsv_2ef_338',['sptgpsv.f',['../sptgpsv_8f.html',1,'']]], + ['sptgpt_339',['sptgpt',['../sptgpt_8f.html#a1b8d333bcc601e5b7e8d3dd1369f54b1',1,'sptgpt.f']]], + ['sptgpt_2ef_340',['sptgpt.f',['../sptgpt_8f.html',1,'']]], + ['sptgptd_341',['sptgptd',['../sptgptd_8f.html#a64d1fe761662182ca3495531152d1cd3',1,'sptgptd.f']]], + ['sptgptd_2ef_342',['sptgptd.f',['../sptgptd_8f.html',1,'']]], + ['sptgptsd_343',['sptgptsd',['../sptgptsd_8f.html#ad3ab15089a57b493cc74443ea3b3d88f',1,'sptgptsd.f']]], + ['sptgptsd_2ef_344',['sptgptsd.f',['../sptgptsd_8f.html',1,'']]], + ['sptgptv_345',['sptgptv',['../sptgptv_8f.html#a9af8a22564d132a887a5237f30710f13',1,'sptgptv.f']]], + ['sptgptv_2ef_346',['sptgptv.f',['../sptgptv_8f.html',1,'']]], + ['sptgptvd_347',['sptgptvd',['../sptgptvd_8f.html#ae03c6c76cad685ae1ed32d74bcba6753',1,'sptgptvd.f']]], + ['sptgptvd_2ef_348',['sptgptvd.f',['../sptgptvd_8f.html',1,'']]], + ['sptran_349',['sptran',['../sptran_8f.html#af7610e42f0dcd199b8cf80f851dcfed0',1,'sptran.f']]], + ['sptran_2ef_350',['sptran.f',['../sptran_8f.html',1,'']]], + ['sptrand_351',['sptrand',['../sptrand_8f.html#ae810abad32bcbdfb8345a30e50bcc1ef',1,'sptrand.f']]], + ['sptrand_2ef_352',['sptrand.f',['../sptrand_8f.html',1,'']]], + ['sptranf_353',['sptranf',['../sptranf_8f.html#acf086b5141203e48bdb7250441a16c8c',1,'sptranf.f']]], + ['sptranf_2ef_354',['sptranf.f',['../sptranf_8f.html',1,'']]], + ['sptranf0_355',['sptranf0',['../sptranf0_8f.html#aaf9f9002ccd7074dc04dbc40a5aad9f0',1,'sptranf0.f']]], + ['sptranf0_2ef_356',['sptranf0.f',['../sptranf0_8f.html',1,'']]], + ['sptranf1_357',['sptranf1',['../sptranf1_8f.html#ad7cec2fd6729ca84b1fac3436f9730e6',1,'sptranf1.f']]], + ['sptranf1_2ef_358',['sptranf1.f',['../sptranf1_8f.html',1,'']]], + ['sptranfv_359',['sptranfv',['../sptranfv_8f.html#a1a7aabbd358d4fe984dac6813c98b106',1,'sptranfv.f']]], + ['sptranfv_2ef_360',['sptranfv.f',['../sptranfv_8f.html',1,'']]], + ['sptranv_361',['sptranv',['../sptranv_8f.html#a7d6aaa3ed70df1dfaf8dd4443b7190c1',1,'sptranv.f']]], + ['sptranv_2ef_362',['sptranv.f',['../sptranv_8f.html',1,'']]], + ['sptrun_363',['sptrun',['../sptrun_8f.html#a1f04574fbd5018f73b68bd2cd0ffc473',1,'sptrun.f']]], + ['sptrun_2ef_364',['sptrun.f',['../sptrun_8f.html',1,'']]], + ['sptrund_365',['sptrund',['../sptrund_8f.html#a2636d99e658dfabd4b85f15a76fca480',1,'sptrund.f']]], + ['sptrund_2ef_366',['sptrund.f',['../sptrund_8f.html',1,'']]], + ['sptrung_367',['sptrung',['../sptrung_8f.html#af41b64dad4789617a315515ef885912c',1,'sptrung.f']]], + ['sptrung_2ef_368',['sptrung.f',['../sptrung_8f.html',1,'']]], + ['sptrungv_369',['sptrungv',['../sptrungv_8f.html#ab7bbe6ecde57394b15e5d4925cb07164',1,'sptrungv.f']]], + ['sptrungv_2ef_370',['sptrungv.f',['../sptrungv_8f.html',1,'']]], + ['sptrunl_371',['sptrunl',['../sptrunl_8f.html#a52c4250d24e52304e49aa1d82a93bdb8',1,'sptrunl.f']]], + ['sptrunl_2ef_372',['sptrunl.f',['../sptrunl_8f.html',1,'']]], + ['sptrunm_373',['sptrunm',['../sptrunm_8f.html#a2a4e579890d3cf7f6a26091f544b6cb6',1,'sptrunm.f']]], + ['sptrunm_2ef_374',['sptrunm.f',['../sptrunm_8f.html',1,'']]], + ['sptrunmv_375',['sptrunmv',['../sptrunmv_8f.html#a8b405d0621112d6852a3bb99602ac2fd',1,'sptrunmv.f']]], + ['sptrunmv_2ef_376',['sptrunmv.f',['../sptrunmv_8f.html',1,'']]], + ['sptruns_377',['sptruns',['../sptruns_8f.html#a34f156e2049105d012e445f8aa215444',1,'sptruns.f']]], + ['sptruns_2ef_378',['sptruns.f',['../sptruns_8f.html',1,'']]], + ['sptrunsv_379',['sptrunsv',['../sptrunsv_8f.html#a1373b651b9dea586e33d3033aae68656',1,'sptrunsv.f']]], + ['sptrunsv_2ef_380',['sptrunsv.f',['../sptrunsv_8f.html',1,'']]], + ['sptrunv_381',['sptrunv',['../sptrunv_8f.html#a9aa39c13dd38585b3afb30cb2486817f',1,'sptrunv.f']]], + ['sptrunv_2ef_382',['sptrunv.f',['../sptrunv_8f.html',1,'']]], + ['spuv2dz_383',['spuv2dz',['../spuv2dz_8f.html#a27edc2d10e0a76a45e4aaae58bf018b9',1,'spuv2dz.f']]], + ['spuv2dz_2ef_384',['spuv2dz.f',['../spuv2dz_8f.html',1,'']]], + ['spvar_385',['spvar',['../spvar_8f.html#a840f95e09b8d930b38638a391933bee4',1,'spvar.f']]], + ['spvar_2ef_386',['spvar.f',['../spvar_8f.html',1,'']]], + ['spwget_387',['spwget',['../spwget_8f.html#a9b6ce78350f7adf2fed874a18312c7a6',1,'spwget.f']]], + ['spwget_2ef_388',['spwget.f',['../spwget_8f.html',1,'']]], + ['srcft_389',['srcft',['../fftpack_8F.html#acf248c4f27a9fa81cffdfded50eee742',1,'fftpack.F']]] +]; diff --git a/search/all_12.html b/ver-5.1.0/search/all_12.html similarity index 100% rename from search/all_12.html rename to ver-5.1.0/search/all_12.html diff --git a/ver-5.1.0/search/all_12.js b/ver-5.1.0/search/all_12.js new file mode 100644 index 00000000..9f80c09a --- /dev/null +++ b/ver-5.1.0/search/all_12.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['unuse_5fncep_5fpost_5farakawa_390',['unuse_ncep_post_arakawa',['../namespaceip__grid__mod.html#ac8e716adbe5c1156bfd20f936a4205de',1,'ip_grid_mod']]], + ['use_5fncep_5fpost_5farakawa_391',['use_ncep_post_arakawa',['../namespaceip__grid__mod.html#a1d570947cf124c28ba67305494bff450',1,'ip_grid_mod']]] +]; diff --git a/search/all_13.html b/ver-5.1.0/search/all_13.html similarity index 100% rename from search/all_13.html rename to ver-5.1.0/search/all_13.html diff --git a/ver-5.1.0/search/all_13.js b/ver-5.1.0/search/all_13.js new file mode 100644 index 00000000..5e1cafb9 --- /dev/null +++ b/ver-5.1.0/search/all_13.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['wbd_392',['wbd',['../structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a33ae1763c4f1267091bee36a9c92e46a',1,'ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid']]] +]; diff --git a/search/all_14.html b/ver-5.1.0/search/all_14.html similarity index 100% rename from search/all_14.html rename to ver-5.1.0/search/all_14.html diff --git a/ver-5.1.0/search/all_14.js b/ver-5.1.0/search/all_14.js new file mode 100644 index 00000000..352c9ffe --- /dev/null +++ b/ver-5.1.0/search/all_14.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['ylat_5frow_393',['ylat_row',['../namespaceip__gaussian__grid__mod.html#a3591b5701f3d03931c6a9d5278e161dc',1,'ip_gaussian_grid_mod']]] +]; diff --git a/search/all_2.html b/ver-5.1.0/search/all_2.html similarity index 100% rename from search/all_2.html rename to ver-5.1.0/search/all_2.html diff --git a/ver-5.1.0/search/all_2.js b/ver-5.1.0/search/all_2.js new file mode 100644 index 00000000..d92ac7fb --- /dev/null +++ b/ver-5.1.0/search/all_2.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['clat_11',['clat',['../namespaceip__rot__equid__cylind__egrid__mod.html#aac1018f3ca1b7ad4b5d33f245678d416',1,'ip_rot_equid_cylind_egrid_mod']]], + ['clat0_12',['clat0',['../structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a7a1b97e05b77bb7563165bf3f3e97dda',1,'ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::clat0()'],['../structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a49835868e8c8b96e243a5992daee6ea5',1,'ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::clat0()'],['../namespaceip__rot__equid__cylind__egrid__mod.html#a83649d02b55d6252d59514aec4eb3142',1,'ip_rot_equid_cylind_egrid_mod::clat0()'],['../namespaceip__rot__equid__cylind__grid__mod.html#afeb699d0eaa8d157277e93fe8e8c5852',1,'ip_rot_equid_cylind_grid_mod::clat0()']]], + ['clatr_13',['clatr',['../namespaceip__rot__equid__cylind__egrid__mod.html#aad4e673a94976b2b5a9bfad9de9e6e30',1,'ip_rot_equid_cylind_egrid_mod']]], + ['clon_14',['clon',['../namespaceip__rot__equid__cylind__egrid__mod.html#a557d49c609fc8c5c564a3a5f10174eec',1,'ip_rot_equid_cylind_egrid_mod']]], + ['csfft_15',['csfft',['../fftpack_8F.html#ad261879c88a7f040e43f1549e65f36e5',1,'fftpack.F']]] +]; diff --git a/search/all_3.html b/ver-5.1.0/search/all_3.html similarity index 100% rename from search/all_3.html rename to ver-5.1.0/search/all_3.html diff --git a/ver-5.1.0/search/all_3.js b/ver-5.1.0/search/all_3.js new file mode 100644 index 00000000..a345b7ae --- /dev/null +++ b/ver-5.1.0/search/all_3.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['dcrft_16',['dcrft',['../fftpack_8F.html#a713ef445886ad8dc8b16692c6075d225',1,'fftpack.F']]], + ['de2_17',['de2',['../namespaceip__polar__stereo__grid__mod.html#a605d287e34e60f553521a5de2da22962',1,'ip_polar_stereo_grid_mod']]], + ['descriptor_18',['descriptor',['../structip__grid__mod_1_1ip__grid.html#a4a2a0dab09f05931d12615b0ac74bc51',1,'ip_grid_mod::ip_grid']]], + ['dlat_19',['dlat',['../structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a6bd00527219fc596b2c2a7ba47fec719',1,'ip_equid_cylind_grid_mod::ip_equid_cylind_grid::dlat()'],['../namespaceip__equid__cylind__grid__mod.html#a30cb127d26d74d2de6ab3cbfd63183fb',1,'ip_equid_cylind_grid_mod::dlat()']]], + ['dlats_20',['dlats',['../namespaceip__rot__equid__cylind__grid__mod.html#ab43075e39d4e2dde4110e608931a392d',1,'ip_rot_equid_cylind_grid_mod::dlats()'],['../namespaceip__rot__equid__cylind__egrid__mod.html#a0b2faca2325b413e1f3207778d4c4c68',1,'ip_rot_equid_cylind_egrid_mod::dlats()'],['../structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a00d41c3d43370d3f02bb92d59f66866c',1,'ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::dlats()'],['../structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#affd9cfc7a0e1d8e74735eac35b2e03c6',1,'ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::dlats()']]], + ['dlon_21',['dlon',['../structip__mercator__grid__mod_1_1ip__mercator__grid.html#a455057778c7f2ad677956bdef2d754ee',1,'ip_mercator_grid_mod::ip_mercator_grid::dlon()'],['../namespaceip__mercator__grid__mod.html#a14e1cb3f8c05d2de49d2aa8dc69d104f',1,'ip_mercator_grid_mod::dlon()'],['../namespaceip__gaussian__grid__mod.html#a8852b7cfb7b99318140c66b0c551dc6d',1,'ip_gaussian_grid_mod::dlon()'],['../namespaceip__equid__cylind__grid__mod.html#a46335f95ac343f7751bd519aec0a160f',1,'ip_equid_cylind_grid_mod::dlon()'],['../structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#ae675dc8c49e64700d941eadc31e8f4e7',1,'ip_equid_cylind_grid_mod::ip_equid_cylind_grid::dlon()'],['../structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a35c454d320c59a6c71c4aebb881abcb8',1,'ip_gaussian_grid_mod::ip_gaussian_grid::dlon()']]], + ['dlons_22',['dlons',['../structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a76222910f6c9fa0c5374bed672904c85',1,'ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::dlons()'],['../structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a23a172ccd2e026746925e2029c0a9206',1,'ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::dlons()'],['../namespaceip__rot__equid__cylind__egrid__mod.html#af04f8a1044f4d9a7e0d13d38887adcbc',1,'ip_rot_equid_cylind_egrid_mod::dlons()'],['../namespaceip__rot__equid__cylind__grid__mod.html#aa0cf7bb2dd8be1239ae38c7220d29702',1,'ip_rot_equid_cylind_grid_mod::dlons()']]], + ['dphi_23',['dphi',['../structip__mercator__grid__mod_1_1ip__mercator__grid.html#a39168528a2c207b2e2c5373487d705c5',1,'ip_mercator_grid_mod::ip_mercator_grid::dphi()'],['../namespaceip__mercator__grid__mod.html#a156e638e2d1b93e388d674462ac3f732',1,'ip_mercator_grid_mod::dphi()']]], + ['dpr_24',['dpr',['../namespaceip__constants__mod.html#ae6b74489db06341b78c3088b3f207011',1,'ip_constants_mod']]], + ['drcft_25',['drcft',['../fftpack_8F.html#a55b05419c0d3bb0595b34c8cacf93be8',1,'fftpack.F']]], + ['dxs_26',['dxs',['../structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#ac009bce0c0c14b3e0970da6c032a11b1',1,'ip_polar_stereo_grid_mod::ip_polar_stereo_grid::dxs()'],['../structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#aa3288a7fbf2db34946116c771e5bc7dc',1,'ip_lambert_conf_grid_mod::ip_lambert_conf_grid::dxs()'],['../namespaceip__lambert__conf__grid__mod.html#a196e94b5a2add34133c87f845394fa81',1,'ip_lambert_conf_grid_mod::dxs()'],['../namespaceip__polar__stereo__grid__mod.html#acf60181f89954e2ff31b08bb1b345354',1,'ip_polar_stereo_grid_mod::dxs()']]], + ['dys_27',['dys',['../namespaceip__polar__stereo__grid__mod.html#aea7950530d06d9c59ff61bf706df0a0f',1,'ip_polar_stereo_grid_mod::dys()'],['../structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a95e155383895ad3f56a3876877b5896b',1,'ip_polar_stereo_grid_mod::ip_polar_stereo_grid::dys()'],['../namespaceip__lambert__conf__grid__mod.html#aad8b04b77b0920dbf9ed3827e2e8cfd7',1,'ip_lambert_conf_grid_mod::dys()'],['../structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a46fa89562e4dd23c765029d2d6c087bc',1,'ip_lambert_conf_grid_mod::ip_lambert_conf_grid::dys()']]] +]; diff --git a/search/all_4.html b/ver-5.1.0/search/all_4.html similarity index 100% rename from search/all_4.html rename to ver-5.1.0/search/all_4.html diff --git a/ver-5.1.0/search/all_4.js b/ver-5.1.0/search/all_4.js new file mode 100644 index 00000000..254b4c31 --- /dev/null +++ b/ver-5.1.0/search/all_4.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['e2_28',['e2',['../namespaceip__polar__stereo__grid__mod.html#abf3a34d9bb00c39dac5225798aea4d5b',1,'ip_polar_stereo_grid_mod']]], + ['e2_5fwgs84_29',['e2_wgs84',['../namespaceip__constants__mod.html#af7783a977fa10c54d85282dc6ac5f545',1,'ip_constants_mod']]], + ['earth_5fradius_30',['earth_radius',['../namespaceearth__radius__mod.html#a810f60db1a1faff0d6f59937a8207a54',1,'earth_radius_mod']]], + ['earth_5fradius_5fmod_31',['earth_radius_mod',['../namespaceearth__radius__mod.html',1,'']]], + ['earth_5fradius_5fmod_2ef90_32',['earth_radius_mod.F90',['../earth__radius__mod_8F90.html',1,'']]], + ['eccen_5fsquared_33',['eccen_squared',['../structip__grid__mod_1_1ip__grid.html#a180a5da6c470fac34b8439d4c0a32d2a',1,'ip_grid_mod::ip_grid']]], + ['elliptical_34',['elliptical',['../structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a1bac1023f8d8cd631760403b222a8c3f',1,'ip_polar_stereo_grid_mod::ip_polar_stereo_grid']]], + ['equid_5fcylind_5fgrid_5farea_35',['equid_cylind_grid_area',['../namespaceip__equid__cylind__grid__mod.html#a5a70b82abdce76bef22cdeaa96a986c2',1,'ip_equid_cylind_grid_mod']]], + ['equid_5fcylind_5fgrid_5fid_5fgrib1_36',['equid_cylind_grid_id_grib1',['../namespaceip__grid__mod.html#ad96da95d40beceb1a1c405971e8130bb',1,'ip_grid_mod']]], + ['equid_5fcylind_5fgrid_5fid_5fgrib2_37',['equid_cylind_grid_id_grib2',['../namespaceip__grid__mod.html#a3b5ae57fe3d6d365cfd1ccdb4feb8ac6',1,'ip_grid_mod']]], + ['equid_5fcylind_5fmap_5fjacob_38',['equid_cylind_map_jacob',['../namespaceip__equid__cylind__grid__mod.html#a039501b44cd3ad4409983e193d509afd',1,'ip_equid_cylind_grid_mod']]], + ['equid_5fcylind_5fvect_5frot_39',['equid_cylind_vect_rot',['../namespaceip__equid__cylind__grid__mod.html#ade88ecea1c0bb4b4d5b0d08f8482268d',1,'ip_equid_cylind_grid_mod']]] +]; diff --git a/search/all_5.html b/ver-5.1.0/search/all_5.html similarity index 100% rename from search/all_5.html rename to ver-5.1.0/search/all_5.html diff --git a/ver-5.1.0/search/all_5.js b/ver-5.1.0/search/all_5.js new file mode 100644 index 00000000..cd3eac50 --- /dev/null +++ b/ver-5.1.0/search/all_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['fftpack_2ef_40',['fftpack.F',['../fftpack_8F.html',1,'']]], + ['field_5fpos_41',['field_pos',['../structip__grid__mod_1_1ip__grid.html#ac071b3d3eca9a5fa88ff5dc211d19179',1,'ip_grid_mod::ip_grid::field_pos()'],['../namespaceip__grid__mod.html#a63572318d74ec94c20c5ccd6ded2d442',1,'ip_grid_mod::field_pos()']]] +]; diff --git a/search/all_6.html b/ver-5.1.0/search/all_6.html similarity index 100% rename from search/all_6.html rename to ver-5.1.0/search/all_6.html diff --git a/ver-5.1.0/search/all_6.js b/ver-5.1.0/search/all_6.js new file mode 100644 index 00000000..c46a7671 --- /dev/null +++ b/ver-5.1.0/search/all_6.js @@ -0,0 +1,37 @@ +var searchData= +[ + ['gaussian_5fgrid_5farea_42',['gaussian_grid_area',['../namespaceip__gaussian__grid__mod.html#ab602a870a477c7ab77438700af4e7780',1,'ip_gaussian_grid_mod']]], + ['gaussian_5fgrid_5fid_5fgrib1_43',['gaussian_grid_id_grib1',['../namespaceip__grid__mod.html#a45e8afad72b1b8856b3e44f2dd3123b3',1,'ip_grid_mod']]], + ['gaussian_5fgrid_5fid_5fgrib2_44',['gaussian_grid_id_grib2',['../namespaceip__grid__mod.html#a36a9a73ecd50353f892341ae8a5c8316',1,'ip_grid_mod']]], + ['gaussian_5fmap_5fjacob_45',['gaussian_map_jacob',['../namespaceip__gaussian__grid__mod.html#adca7b03877c6a7048ff1716a95e0bd9d',1,'ip_gaussian_grid_mod']]], + ['gaussian_5fvect_5frot_46',['gaussian_vect_rot',['../namespaceip__gaussian__grid__mod.html#ac72eec96d0012fbe0f0ec7c520f40dad',1,'ip_gaussian_grid_mod']]], + ['gds_47',['gds',['../structip__grid__descriptor__mod_1_1grib1__descriptor.html#a08920c194e39d562fbf527939f0ac6c9',1,'ip_grid_descriptor_mod::grib1_descriptor']]], + ['gdswzd_48',['gdswzd',['../structip__mercator__grid__mod_1_1ip__mercator__grid.html#a940420aa99e0fbe51a976f9d0c343f1a',1,'ip_mercator_grid_mod::ip_mercator_grid::gdswzd()'],['../structip__station__points__grid__mod_1_1ip__station__points__grid.html#a9fff8b24553d11177b8c1ee38bfbd91f',1,'ip_station_points_grid_mod::ip_station_points_grid::gdswzd()'],['../structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a0f14a253b51bcb0633cd00d32d5130a4',1,'ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::gdswzd()'],['../structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a62c8147f8845d75e8f52c7524a74c780',1,'ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::gdswzd()'],['../structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a9e97b7352e67dd629f622f292cf0ca21',1,'ip_polar_stereo_grid_mod::ip_polar_stereo_grid::gdswzd()'],['../structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#aa69861340bc268b91a1076048ed489fc',1,'ip_lambert_conf_grid_mod::ip_lambert_conf_grid::gdswzd()'],['../structip__grid__mod_1_1ip__grid.html#a5fb366fb577a90cc09f21269b90ac080',1,'ip_grid_mod::ip_grid::gdswzd()'],['../structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a7ce52d987d2bd2442053042c03f96885',1,'ip_gaussian_grid_mod::ip_gaussian_grid::gdswzd()'],['../structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#aa1023c3efed20a990b75f937bbcac6a3',1,'ip_equid_cylind_grid_mod::ip_equid_cylind_grid::gdswzd()'],['../iplib__4_8h.html#a44daefd49c37e9bc59933d98e56efa53',1,'gdswzd(int igdtnum, int *igdtmpl, int igdtlen, int iopt, int npts, float fill, float *xpts, float *ypts, float *rlon, float *rlat, int *nret, float *crot, float *srot, float *xlon, float *xlat, float *ylon, float *ylat, float *area): iplib_4.h'],['../iplib__8_8h.html#af41ad9a4b34f78d182a68b3d72b9bdf4',1,'gdswzd(long igdtnum, long *igdtmpl, long igdtlen, long iopt, long npts, double fill, double *xpts, double *ypts, double *rlon, double *rlat, long *nret, double *crot, double *srot, double *xlon, double *xlat, double *ylon, double *ylat, double *area): iplib_8.h'],['../iplib__d_8h.html#ac919f31612096fd6a7547a425ab3d38e',1,'gdswzd(int igdtnum, int *igdtmpl, int igdtlen, int iopt, int npts, double fill, double *xpts, double *ypts, double *rlon, double *rlat, int *nret, double *crot, double *srot, double *xlon, double *xlat, double *ylon, double *ylat, double *area): iplib_d.h'],['../interfacegdswzd__mod_1_1gdswzd.html',1,'gdswzd_mod::gdswzd']]], + ['gdswzd_5f1d_5farray_49',['gdswzd_1d_array',['../interfacegdswzd__mod_1_1gdswzd.html#afaf35e3ce949dd2ce3d72dd3f06d4e3b',1,'gdswzd_mod::gdswzd::gdswzd_1d_array()'],['../namespacegdswzd__mod.html#ac304e2b046eccc701e24827c81107e76',1,'gdswzd_mod::gdswzd_1d_array()']]], + ['gdswzd_5f2d_5farray_50',['gdswzd_2d_array',['../interfacegdswzd__mod_1_1gdswzd.html#a8b60240eefdc297eacf90c348b529d31',1,'gdswzd_mod::gdswzd::gdswzd_2d_array()'],['../namespacegdswzd__mod.html#acdf970e498e9317522fbdfb690b86e25',1,'gdswzd_mod::gdswzd_2d_array()']]], + ['gdswzd_5f2d_5farray_5fgrib1_51',['gdswzd_2d_array_grib1',['../interfacegdswzd__mod_1_1gdswzd.html#a7c66a7ede2b644f7e366df9f70b9f0a5',1,'gdswzd_mod::gdswzd::gdswzd_2d_array_grib1()'],['../namespacegdswzd__mod.html#aa032a55281b18e208630a730679958f4',1,'gdswzd_mod::gdswzd_2d_array_grib1()']]], + ['gdswzd_5fc_52',['gdswzd_c',['../namespacegdswzd__c__mod.html#ae3026381f7f41561507c97c9125d24e4',1,'gdswzd_c_mod']]], + ['gdswzd_5fc_2ef90_53',['gdswzd_c.F90',['../gdswzd__c_8F90.html',1,'']]], + ['gdswzd_5fc_5fgrib1_54',['gdswzd_c_grib1',['../namespacegdswzd__c__mod.html#a06861f1403edf106bb3b399c39981504',1,'gdswzd_c_mod']]], + ['gdswzd_5fc_5fmod_55',['gdswzd_c_mod',['../namespacegdswzd__c__mod.html',1,'']]], + ['gdswzd_5fequid_5fcylind_56',['gdswzd_equid_cylind',['../namespaceip__equid__cylind__grid__mod.html#af20f6f308b5a33211c677b894e41b727',1,'ip_equid_cylind_grid_mod']]], + ['gdswzd_5fgaussian_57',['gdswzd_gaussian',['../namespaceip__gaussian__grid__mod.html#a6eefd9270b3f9bb2c59a77bea4ecf1b9',1,'ip_gaussian_grid_mod']]], + ['gdswzd_5fgrib1_58',['gdswzd_grib1',['../namespacegdswzd__mod.html#a133e040fac8dd56e607b8e3fb6a58c37',1,'gdswzd_mod::gdswzd_grib1()'],['../iplib__4_8h.html#a7f2f96041c0d42926e14cb0f40f336e1',1,'gdswzd_grib1(): iplib_4.h'],['../interfacegdswzd__mod_1_1gdswzd.html#a65b95791813ffd5afbfba9d4cb67676a',1,'gdswzd_mod::gdswzd::gdswzd_grib1()'],['../iplib__8_8h.html#ab8e46b623c66911913f66d314c15cc93',1,'gdswzd_grib1(long *kgds, long iopt, long npts, double fill, double *xpts, double *ypts, double *rlon, double *rlat, long *nret, double *crot, double *srot, double *xlon, double *xlat, double *ylon, double *ylat, double *area): iplib_8.h'],['../iplib__d_8h.html#ac33340cba2ac7b42dd9b9116fc28d691',1,'gdswzd_grib1(int *kgds, int iopt, int npts, double fill, double *xpts, double *ypts, double *rlon, double *rlat, int *nret, double *crot, double *srot, double *xlon, double *xlat, double *ylon, double *ylat, double *area): iplib_d.h']]], + ['gdswzd_5fgrid_59',['gdswzd_grid',['../interfacegdswzd__mod_1_1gdswzd.html#abfe059339c6c9f05fd4eadb5d70aec16',1,'gdswzd_mod::gdswzd::gdswzd_grid()'],['../namespacegdswzd__mod.html#a584d2bddbc6d857b80cfac5e3b288d45',1,'gdswzd_mod::gdswzd_grid()']]], + ['gdswzd_5finterface_60',['gdswzd_interface',['../interfaceip__grid__mod_1_1gdswzd__interface.html#af34c5d9da54a36322bb1a141217c6369',1,'ip_grid_mod::gdswzd_interface::gdswzd_interface()'],['../interfaceip__grid__mod_1_1gdswzd__interface.html',1,'ip_grid_mod::gdswzd_interface']]], + ['gdswzd_5flambert_5fconf_61',['gdswzd_lambert_conf',['../namespaceip__lambert__conf__grid__mod.html#a5ebb9e4f1bd58caa254771b305c94f71',1,'ip_lambert_conf_grid_mod']]], + ['gdswzd_5fmercator_62',['gdswzd_mercator',['../namespaceip__mercator__grid__mod.html#acc39017fa51125972ab8e755e16d339e',1,'ip_mercator_grid_mod']]], + ['gdswzd_5fmod_63',['gdswzd_mod',['../namespacegdswzd__mod.html',1,'']]], + ['gdswzd_5fmod_2ef90_64',['gdswzd_mod.F90',['../gdswzd__mod_8F90.html',1,'']]], + ['gdswzd_5fpolar_5fstereo_65',['gdswzd_polar_stereo',['../namespaceip__polar__stereo__grid__mod.html#ae2694d90ab514a131e083dfba3b173c5',1,'ip_polar_stereo_grid_mod']]], + ['gdswzd_5frot_5fequid_5fcylind_66',['gdswzd_rot_equid_cylind',['../namespaceip__rot__equid__cylind__grid__mod.html#a55c153201e15205d3f75e4ffb717cc0b',1,'ip_rot_equid_cylind_grid_mod']]], + ['gdswzd_5frot_5fequid_5fcylind_5fegrid_67',['gdswzd_rot_equid_cylind_egrid',['../namespaceip__rot__equid__cylind__egrid__mod.html#a9ad11a599fc0bdc4a9ece86a3b1cc399',1,'ip_rot_equid_cylind_egrid_mod']]], + ['gdswzd_5fscalar_68',['gdswzd_scalar',['../interfacegdswzd__mod_1_1gdswzd.html#a1fc841ec08d39463b3f5f36eac0068cd',1,'gdswzd_mod::gdswzd::gdswzd_scalar()'],['../namespacegdswzd__mod.html#aba3235c5bc5797e72b9a6a8a587b8861',1,'gdswzd_mod::gdswzd_scalar()']]], + ['gdswzd_5fstation_5fpoints_69',['gdswzd_station_points',['../namespaceip__station__points__grid__mod.html#a8da297b45242279a497dbd7062a33197',1,'ip_station_points_grid_mod']]], + ['gdt_5flen_70',['gdt_len',['../structip__grid__descriptor__mod_1_1grib2__descriptor.html#abf8e6d212308608a039e8e97c05c4a06',1,'ip_grid_descriptor_mod::grib2_descriptor']]], + ['gdt_5fnum_71',['gdt_num',['../structip__grid__descriptor__mod_1_1grib2__descriptor.html#aa5dd78817926e0246f93819ab7037e19',1,'ip_grid_descriptor_mod::grib2_descriptor']]], + ['gdt_5ftmpl_72',['gdt_tmpl',['../structip__grid__descriptor__mod_1_1grib2__descriptor.html#a3a90e1ef19332a1d8ec1f6a3193c6ebe',1,'ip_grid_descriptor_mod::grib2_descriptor']]], + ['grib1_5fdescriptor_73',['grib1_descriptor',['../structip__grid__descriptor__mod_1_1grib1__descriptor.html',1,'ip_grid_descriptor_mod']]], + ['grib2_5fdescriptor_74',['grib2_descriptor',['../structip__grid__descriptor__mod_1_1grib2__descriptor.html',1,'ip_grid_descriptor_mod']]], + ['grid_5fnum_75',['grid_num',['../structip__grid__descriptor__mod_1_1ip__grid__descriptor.html#a6d4598dc4bbf46e059f636715cc390f1',1,'ip_grid_descriptor_mod::ip_grid_descriptor']]] +]; diff --git a/search/all_7.html b/ver-5.1.0/search/all_7.html similarity index 100% rename from search/all_7.html rename to ver-5.1.0/search/all_7.html diff --git a/ver-5.1.0/search/all_7.js b/ver-5.1.0/search/all_7.js new file mode 100644 index 00000000..028e2c11 --- /dev/null +++ b/ver-5.1.0/search/all_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['h_76',['h',['../structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a733c8a9b6ed498aeec73fa8f11283c03',1,'ip_lambert_conf_grid_mod::ip_lambert_conf_grid::h()'],['../structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a6df619b3050279d9d560e72a3e87168f',1,'ip_polar_stereo_grid_mod::ip_polar_stereo_grid::h()'],['../namespaceip__lambert__conf__grid__mod.html#aa91572e8b5ba3559c041f1750b6696c6',1,'ip_lambert_conf_grid_mod::h()'],['../namespaceip__polar__stereo__grid__mod.html#a5a63da5168a1432a1af42c0b668f0645',1,'ip_polar_stereo_grid_mod::h()']]], + ['hi_77',['hi',['../structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#afb1ebcfab0d637688bcac84cbc8582fc',1,'ip_equid_cylind_grid_mod::ip_equid_cylind_grid::hi()'],['../structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#ae71229713fc9322e23140541993459fc',1,'ip_gaussian_grid_mod::ip_gaussian_grid::hi()'],['../structip__mercator__grid__mod_1_1ip__mercator__grid.html#a91b223ca51a556fa11b76b0c05e0d3f2',1,'ip_mercator_grid_mod::ip_mercator_grid::hi()'],['../structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a970c2655cb03ad0927e03c1d550e3fe5',1,'ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::hi()']]] +]; diff --git a/search/all_8.html b/ver-5.1.0/search/all_8.html similarity index 100% rename from search/all_8.html rename to ver-5.1.0/search/all_8.html diff --git a/ver-5.1.0/search/all_8.js b/ver-5.1.0/search/all_8.js new file mode 100644 index 00000000..d0920be4 --- /dev/null +++ b/ver-5.1.0/search/all_8.js @@ -0,0 +1,109 @@ +var searchData= +[ + ['im_78',['im',['../structip__grid__mod_1_1ip__grid.html#a546a9c3bb8e93ec8e8f7eaf2a14537dc',1,'ip_grid_mod::ip_grid']]], + ['init_79',['init',['../structip__grid__mod_1_1ip__grid.html#a1f3fa40acb8c2ae4a65c00db21872d7c',1,'ip_grid_mod::ip_grid']]], + ['init_5fdescriptor_80',['init_descriptor',['../interfaceip__grid__descriptor__mod_1_1init__descriptor.html',1,'ip_grid_descriptor_mod']]], + ['init_5fgrib1_81',['init_grib1',['../namespaceip__station__points__grid__mod.html#a4b28ebf2b4fe826c96af69db28e0a1ff',1,'ip_station_points_grid_mod::init_grib1()'],['../namespaceip__gaussian__grid__mod.html#a8fe2ee732a3a2db4891a6431787a0b01',1,'ip_gaussian_grid_mod::init_grib1()'],['../namespaceip__rot__equid__cylind__grid__mod.html#acb27dfdc6f03dea897d509910365afee',1,'ip_rot_equid_cylind_grid_mod::init_grib1()'],['../namespaceip__rot__equid__cylind__egrid__mod.html#aa65616b97df9c89893161ff802e16eab',1,'ip_rot_equid_cylind_egrid_mod::init_grib1()'],['../namespaceip__polar__stereo__grid__mod.html#a6ed76f58f30993cd7be84b7e03cf4d6f',1,'ip_polar_stereo_grid_mod::init_grib1()'],['../namespaceip__mercator__grid__mod.html#a4125dba8b09e9b69933e224b00f4758d',1,'ip_mercator_grid_mod::init_grib1()'],['../namespaceip__lambert__conf__grid__mod.html#a5544708e893ffcfbe7d958fdec700eea',1,'ip_lambert_conf_grid_mod::init_grib1()'],['../namespaceip__equid__cylind__grid__mod.html#a3d0132823d27b60835ebb59ead173477',1,'ip_equid_cylind_grid_mod::init_grib1()'],['../structip__station__points__grid__mod_1_1ip__station__points__grid.html#aa5ec2cbc9bf0dadf20a226e0afeb3d32',1,'ip_station_points_grid_mod::ip_station_points_grid::init_grib1()'],['../structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a9942c787bda2e118f1355476670edfca',1,'ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::init_grib1()'],['../structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#ab9a85830bfd06183a8df73726f62217a',1,'ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::init_grib1()'],['../structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#ae2a5a7c08e4578f3d0ff6b85e5a14cce',1,'ip_polar_stereo_grid_mod::ip_polar_stereo_grid::init_grib1()'],['../structip__mercator__grid__mod_1_1ip__mercator__grid.html#a3ae3bbb47f4c03c36404a2b35014d65c',1,'ip_mercator_grid_mod::ip_mercator_grid::init_grib1()'],['../structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a35dd86b4a9017f5b03a0a6a01eb4d370',1,'ip_lambert_conf_grid_mod::ip_lambert_conf_grid::init_grib1()'],['../structip__grid__mod_1_1ip__grid.html#a5a2c16279eb73a0c54ae0a1586d5b806',1,'ip_grid_mod::ip_grid::init_grib1()'],['../structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#afd3658924783d5dbbd3fe5f07d5b60a7',1,'ip_gaussian_grid_mod::ip_gaussian_grid::init_grib1()'],['../structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a68fb7543888cc76885560709184e7d70',1,'ip_equid_cylind_grid_mod::ip_equid_cylind_grid::init_grib1()']]], + ['init_5fgrib1_5fdescriptor_82',['init_grib1_descriptor',['../interfaceip__grid__descriptor__mod_1_1init__descriptor.html#a3b5b267aa7a17a4615dcc0cb4e590f6e',1,'ip_grid_descriptor_mod::init_descriptor::init_grib1_descriptor()'],['../namespaceip__grid__descriptor__mod.html#aa00884a7fca018535eaf0c2ebe26bc98',1,'ip_grid_descriptor_mod::init_grib1_descriptor()']]], + ['init_5fgrib1_5finterface_83',['init_grib1_interface',['../interfaceip__grid__mod_1_1init__grib1__interface.html#a47e255b76f02fe58a1aebdadcc5894eb',1,'ip_grid_mod::init_grib1_interface::init_grib1_interface()'],['../interfaceip__grid__mod_1_1init__grib1__interface.html',1,'ip_grid_mod::init_grib1_interface']]], + ['init_5fgrib2_84',['init_grib2',['../structip__mercator__grid__mod_1_1ip__mercator__grid.html#a505b0114c7ff5fbb58c4e7ce5ccde3f0',1,'ip_mercator_grid_mod::ip_mercator_grid::init_grib2()'],['../structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a8dd212953e754964770fa1c3d4bcd3db',1,'ip_equid_cylind_grid_mod::ip_equid_cylind_grid::init_grib2()'],['../structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a378b72a1b6090acb90a36385ab9eda5a',1,'ip_gaussian_grid_mod::ip_gaussian_grid::init_grib2()'],['../structip__grid__mod_1_1ip__grid.html#ad13e0ad8d616e1839ced388826fefee9',1,'ip_grid_mod::ip_grid::init_grib2()'],['../structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a64129413df8ea478ab1360fd1a274e9a',1,'ip_lambert_conf_grid_mod::ip_lambert_conf_grid::init_grib2()'],['../structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a9622ce9892084b52303f27722572b87c',1,'ip_polar_stereo_grid_mod::ip_polar_stereo_grid::init_grib2()'],['../structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#adda32463a76ad97ac35b01f1ac693fa4',1,'ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::init_grib2()'],['../structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a30ae580d169972e8d68c3d97ab3b2634',1,'ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::init_grib2()'],['../structip__station__points__grid__mod_1_1ip__station__points__grid.html#a69fac68e7a40d5c3106a47bf1851891e',1,'ip_station_points_grid_mod::ip_station_points_grid::init_grib2()'],['../namespaceip__equid__cylind__grid__mod.html#a39d24c9468ecb7effd16972fd72e088a',1,'ip_equid_cylind_grid_mod::init_grib2()'],['../namespaceip__gaussian__grid__mod.html#ae048ac033628515113b11b8c7364e0c2',1,'ip_gaussian_grid_mod::init_grib2()'],['../namespaceip__station__points__grid__mod.html#ad17e6d245295803b62b146be984f874d',1,'ip_station_points_grid_mod::init_grib2()'],['../namespaceip__rot__equid__cylind__grid__mod.html#add3c6c1dad5748b452d291df6619867d',1,'ip_rot_equid_cylind_grid_mod::init_grib2()'],['../namespaceip__lambert__conf__grid__mod.html#acb0339a9fff4fff6c2017d37f8bed0cf',1,'ip_lambert_conf_grid_mod::init_grib2()'],['../namespaceip__rot__equid__cylind__egrid__mod.html#af3cbc17f27800bc67135feacb2c1c3e0',1,'ip_rot_equid_cylind_egrid_mod::init_grib2()'],['../namespaceip__polar__stereo__grid__mod.html#a5210b986366b503683ae966519d501e7',1,'ip_polar_stereo_grid_mod::init_grib2()'],['../namespaceip__mercator__grid__mod.html#aad3b6fef6ee74b8df984c0159ff29c82',1,'ip_mercator_grid_mod::init_grib2()']]], + ['init_5fgrib2_5fdefault_85',['init_grib2_default',['../namespaceip__rot__equid__cylind__grid__mod.html#a9ade5de892a935c3b62c1860b719ce74',1,'ip_rot_equid_cylind_grid_mod']]], + ['init_5fgrib2_5fdescriptor_86',['init_grib2_descriptor',['../interfaceip__grid__descriptor__mod_1_1init__descriptor.html#a6702c4bf3a3d914e5cd2fce8fba4f95c',1,'ip_grid_descriptor_mod::init_descriptor::init_grib2_descriptor()'],['../namespaceip__grid__descriptor__mod.html#a143ac06a2a20697d01606a259213b451',1,'ip_grid_descriptor_mod::init_grib2_descriptor()']]], + ['init_5fgrib2_5finterface_87',['init_grib2_interface',['../interfaceip__grid__mod_1_1init__grib2__interface.html#a25dcec4470effb9b20dfc7981c21ec6c',1,'ip_grid_mod::init_grib2_interface::init_grib2_interface()'],['../interfaceip__grid__mod_1_1init__grib2__interface.html',1,'ip_grid_mod::init_grib2_interface']]], + ['init_5fgrib2_5fncep_5fpost_88',['init_grib2_ncep_post',['../namespaceip__rot__equid__cylind__grid__mod.html#a74abf723e815f9ff196e6d0174fd449b',1,'ip_rot_equid_cylind_grid_mod']]], + ['init_5fgrid_89',['init_grid',['../interfaceip__grid__factory__mod_1_1init__grid.html',1,'ip_grid_factory_mod']]], + ['init_5fgrid_5fgeneric_90',['init_grid_generic',['../interfaceip__grid__factory__mod_1_1init__grid.html#a3fbbec3ddc7dfd918c2abc02e7a4cd72',1,'ip_grid_factory_mod::init_grid::init_grid_generic()'],['../namespaceip__grid__factory__mod.html#a2d2ea07d353bae8b057471aa99b58e46',1,'ip_grid_factory_mod::init_grid_generic(grid, grid_desc)']]], + ['init_5fgrid_5fgrib1_91',['init_grid_grib1',['../namespaceip__grid__factory__mod.html#ad8906ed6fe52c2426c0ff09ce50b6fc5',1,'ip_grid_factory_mod']]], + ['init_5fgrid_5fgrib2_92',['init_grid_grib2',['../namespaceip__grid__factory__mod.html#aa187dc8dbd1d004a51cc0e9826ffa225',1,'ip_grid_factory_mod']]], + ['interpolate_5fbicubic_93',['interpolate_bicubic',['../interfacebicubic__interp__mod_1_1interpolate__bicubic.html',1,'bicubic_interp_mod']]], + ['interpolate_5fbicubic_5fscalar_94',['interpolate_bicubic_scalar',['../interfacebicubic__interp__mod_1_1interpolate__bicubic.html#acbfecc99184cf9ae71b2c9f79c7d4077',1,'bicubic_interp_mod::interpolate_bicubic::interpolate_bicubic_scalar()'],['../namespacebicubic__interp__mod.html#a54a442e47f1be9511c1684a337d7e2d1',1,'bicubic_interp_mod::interpolate_bicubic_scalar(IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)']]], + ['interpolate_5fbicubic_5fvector_95',['interpolate_bicubic_vector',['../namespacebicubic__interp__mod.html#a9d27db7d350fc2699aaf5057c3b53d16',1,'bicubic_interp_mod::interpolate_bicubic_vector()'],['../interfacebicubic__interp__mod_1_1interpolate__bicubic.html#aac45c15e1c9d76158d72e62ccaca915b',1,'bicubic_interp_mod::interpolate_bicubic::interpolate_bicubic_vector()']]], + ['interpolate_5fbilinear_96',['interpolate_bilinear',['../interfacebilinear__interp__mod_1_1interpolate__bilinear.html',1,'bilinear_interp_mod']]], + ['interpolate_5fbilinear_5fscalar_97',['interpolate_bilinear_scalar',['../namespacebilinear__interp__mod.html#a34d2eea4682104097dccf3e7ab6a9398',1,'bilinear_interp_mod::interpolate_bilinear_scalar()'],['../interfacebilinear__interp__mod_1_1interpolate__bilinear.html#a3493cf5bc04aa4551ffd4c314ef09a65',1,'bilinear_interp_mod::interpolate_bilinear::interpolate_bilinear_scalar()']]], + ['interpolate_5fbilinear_5fvector_98',['interpolate_bilinear_vector',['../namespacebilinear__interp__mod.html#abc218f8774d2af09299eb299d6f38e04',1,'bilinear_interp_mod::interpolate_bilinear_vector()'],['../interfacebilinear__interp__mod_1_1interpolate__bilinear.html#ab4692c5250b37325f764b38c570892dd',1,'bilinear_interp_mod::interpolate_bilinear::interpolate_bilinear_vector()']]], + ['interpolate_5fbudget_99',['interpolate_budget',['../interfacebudget__interp__mod_1_1interpolate__budget.html',1,'budget_interp_mod']]], + ['interpolate_5fbudget_5fscalar_100',['interpolate_budget_scalar',['../namespacebudget__interp__mod.html#a09bd6535b0c2e1022cfde39c39d14466',1,'budget_interp_mod::interpolate_budget_scalar()'],['../interfacebudget__interp__mod_1_1interpolate__budget.html#a4b96cbeedb86ef43b687f7ea55914ef0',1,'budget_interp_mod::interpolate_budget::interpolate_budget_scalar()']]], + ['interpolate_5fbudget_5fvector_101',['interpolate_budget_vector',['../namespacebudget__interp__mod.html#abc99486ee9c0091c1514af6114d4e803',1,'budget_interp_mod::interpolate_budget_vector()'],['../interfacebudget__interp__mod_1_1interpolate__budget.html#a573e89e56381d0f69e4022d791a087e6',1,'budget_interp_mod::interpolate_budget::interpolate_budget_vector()']]], + ['interpolate_5fneighbor_102',['interpolate_neighbor',['../interfaceneighbor__interp__mod_1_1interpolate__neighbor.html',1,'neighbor_interp_mod']]], + ['interpolate_5fneighbor_5fbudget_103',['interpolate_neighbor_budget',['../interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget.html',1,'neighbor_budget_interp_mod']]], + ['interpolate_5fneighbor_5fbudget_5fscalar_104',['interpolate_neighbor_budget_scalar',['../interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget.html#a96e4b145a4df6f4948b1d5ae2da6a71a',1,'neighbor_budget_interp_mod::interpolate_neighbor_budget::interpolate_neighbor_budget_scalar()'],['../namespaceneighbor__budget__interp__mod.html#a6d5110a9e9facf8c3132ec27d6857817',1,'neighbor_budget_interp_mod::interpolate_neighbor_budget_scalar()']]], + ['interpolate_5fneighbor_5fbudget_5fvector_105',['interpolate_neighbor_budget_vector',['../interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget.html#a573bd5ac43484aa6d051e58f37ff7c06',1,'neighbor_budget_interp_mod::interpolate_neighbor_budget::interpolate_neighbor_budget_vector()'],['../namespaceneighbor__budget__interp__mod.html#a4309c1e6b7fc60ded40657fe6c72297e',1,'neighbor_budget_interp_mod::interpolate_neighbor_budget_vector()']]], + ['interpolate_5fneighbor_5fscalar_106',['interpolate_neighbor_scalar',['../namespaceneighbor__interp__mod.html#a78452d1527c6974ad54091f0318e4b1f',1,'neighbor_interp_mod::interpolate_neighbor_scalar()'],['../interfaceneighbor__interp__mod_1_1interpolate__neighbor.html#a04ebb54535e67ff95c1d3d64b9cf6246',1,'neighbor_interp_mod::interpolate_neighbor::interpolate_neighbor_scalar(IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)']]], + ['interpolate_5fneighbor_5fvector_107',['interpolate_neighbor_vector',['../interfaceneighbor__interp__mod_1_1interpolate__neighbor.html#a4662245e2744fd14628b48f23bf4f0a7',1,'neighbor_interp_mod::interpolate_neighbor::interpolate_neighbor_vector()'],['../namespaceneighbor__interp__mod.html#a744ccffd8cd6c13d360e634db4851756',1,'neighbor_interp_mod::interpolate_neighbor_vector()']]], + ['interpolate_5fspectral_108',['interpolate_spectral',['../interfacespectral__interp__mod_1_1interpolate__spectral.html',1,'spectral_interp_mod']]], + ['interpolate_5fspectral_5fscalar_109',['interpolate_spectral_scalar',['../interfacespectral__interp__mod_1_1interpolate__spectral.html#a79f600a26ecf256a8a13cf4bdbaf2ab1',1,'spectral_interp_mod::interpolate_spectral::interpolate_spectral_scalar()'],['../namespacespectral__interp__mod.html#a438646d69e941def0ada00d5ca19f618',1,'spectral_interp_mod::interpolate_spectral_scalar()']]], + ['interpolate_5fspectral_5fvector_110',['interpolate_spectral_vector',['../interfacespectral__interp__mod_1_1interpolate__spectral.html#a9e939bbb3f7b214fee26c1e77764e487',1,'spectral_interp_mod::interpolate_spectral::interpolate_spectral_vector()'],['../namespacespectral__interp__mod.html#acb61ad529b7decc2a6ff58dd12fbadd0',1,'spectral_interp_mod::interpolate_spectral_vector()']]], + ['introduction_111',['Introduction',['../index.html',1,'']]], + ['ip_5fconstants_5fmod_112',['ip_constants_mod',['../namespaceip__constants__mod.html',1,'']]], + ['ip_5fconstants_5fmod_2ef90_113',['ip_constants_mod.F90',['../ip__constants__mod_8F90.html',1,'']]], + ['ip_5fequid_5fcylind_5fgrid_114',['ip_equid_cylind_grid',['../structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html',1,'ip_equid_cylind_grid_mod']]], + ['ip_5fequid_5fcylind_5fgrid_5fmod_115',['ip_equid_cylind_grid_mod',['../namespaceip__equid__cylind__grid__mod.html',1,'']]], + ['ip_5fequid_5fcylind_5fgrid_5fmod_2ef90_116',['ip_equid_cylind_grid_mod.F90',['../ip__equid__cylind__grid__mod_8F90.html',1,'']]], + ['ip_5fgaussian_5fgrid_117',['ip_gaussian_grid',['../structip__gaussian__grid__mod_1_1ip__gaussian__grid.html',1,'ip_gaussian_grid_mod']]], + ['ip_5fgaussian_5fgrid_5fmod_118',['ip_gaussian_grid_mod',['../namespaceip__gaussian__grid__mod.html',1,'']]], + ['ip_5fgaussian_5fgrid_5fmod_2ef90_119',['ip_gaussian_grid_mod.F90',['../ip__gaussian__grid__mod_8F90.html',1,'']]], + ['ip_5fgrid_120',['ip_grid',['../structip__grid__mod_1_1ip__grid.html',1,'ip_grid_mod']]], + ['ip_5fgrid_5fdescriptor_121',['ip_grid_descriptor',['../structip__grid__descriptor__mod_1_1ip__grid__descriptor.html',1,'ip_grid_descriptor_mod']]], + ['ip_5fgrid_5fdescriptor_5fmod_122',['ip_grid_descriptor_mod',['../namespaceip__grid__descriptor__mod.html',1,'']]], + ['ip_5fgrid_5fdescriptor_5fmod_2ef90_123',['ip_grid_descriptor_mod.F90',['../ip__grid__descriptor__mod_8F90.html',1,'']]], + ['ip_5fgrid_5ffactory_5fmod_124',['ip_grid_factory_mod',['../namespaceip__grid__factory__mod.html',1,'']]], + ['ip_5fgrid_5ffactory_5fmod_2ef90_125',['ip_grid_factory_mod.F90',['../ip__grid__factory__mod_8F90.html',1,'']]], + ['ip_5fgrid_5fmod_126',['ip_grid_mod',['../namespaceip__grid__mod.html',1,'']]], + ['ip_5fgrid_5fmod_2ef90_127',['ip_grid_mod.F90',['../ip__grid__mod_8F90.html',1,'']]], + ['ip_5fgrids_5fmod_128',['ip_grids_mod',['../namespaceip__grids__mod.html',1,'']]], + ['ip_5fgrids_5fmod_2ef90_129',['ip_grids_mod.F90',['../ip__grids__mod_8F90.html',1,'']]], + ['ip_5finterpolators_5fmod_130',['ip_interpolators_mod',['../namespaceip__interpolators__mod.html',1,'']]], + ['ip_5finterpolators_5fmod_2ef90_131',['ip_interpolators_mod.F90',['../ip__interpolators__mod_8F90.html',1,'']]], + ['ip_5flambert_5fconf_5fgrid_132',['ip_lambert_conf_grid',['../structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html',1,'ip_lambert_conf_grid_mod']]], + ['ip_5flambert_5fconf_5fgrid_5fmod_133',['ip_lambert_conf_grid_mod',['../namespaceip__lambert__conf__grid__mod.html',1,'']]], + ['ip_5flambert_5fconf_5fgrid_5fmod_2ef90_134',['ip_lambert_conf_grid_mod.F90',['../ip__lambert__conf__grid__mod_8F90.html',1,'']]], + ['ip_5fmercator_5fgrid_135',['ip_mercator_grid',['../structip__mercator__grid__mod_1_1ip__mercator__grid.html',1,'ip_mercator_grid_mod']]], + ['ip_5fmercator_5fgrid_5fmod_136',['ip_mercator_grid_mod',['../namespaceip__mercator__grid__mod.html',1,'']]], + ['ip_5fmercator_5fgrid_5fmod_2ef90_137',['ip_mercator_grid_mod.F90',['../ip__mercator__grid__mod_8F90.html',1,'']]], + ['ip_5fmod_138',['ip_mod',['../namespaceip__mod.html',1,'']]], + ['ip_5fmod_2ef90_139',['ip_mod.F90',['../ip__mod_8F90.html',1,'']]], + ['ip_5fpolar_5fstereo_5fgrid_140',['ip_polar_stereo_grid',['../structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html',1,'ip_polar_stereo_grid_mod']]], + ['ip_5fpolar_5fstereo_5fgrid_5fmod_141',['ip_polar_stereo_grid_mod',['../namespaceip__polar__stereo__grid__mod.html',1,'']]], + ['ip_5fpolar_5fstereo_5fgrid_5fmod_2ef90_142',['ip_polar_stereo_grid_mod.F90',['../ip__polar__stereo__grid__mod_8F90.html',1,'']]], + ['ip_5frot_5fequid_5fcylind_5fegrid_143',['ip_rot_equid_cylind_egrid',['../structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html',1,'ip_rot_equid_cylind_egrid_mod']]], + ['ip_5frot_5fequid_5fcylind_5fegrid_5fmod_144',['ip_rot_equid_cylind_egrid_mod',['../namespaceip__rot__equid__cylind__egrid__mod.html',1,'']]], + ['ip_5frot_5fequid_5fcylind_5fegrid_5fmod_2ef90_145',['ip_rot_equid_cylind_egrid_mod.F90',['../ip__rot__equid__cylind__egrid__mod_8F90.html',1,'']]], + ['ip_5frot_5fequid_5fcylind_5fgrid_146',['ip_rot_equid_cylind_grid',['../structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html',1,'ip_rot_equid_cylind_grid_mod']]], + ['ip_5frot_5fequid_5fcylind_5fgrid_5fmod_147',['ip_rot_equid_cylind_grid_mod',['../namespaceip__rot__equid__cylind__grid__mod.html',1,'']]], + ['ip_5frot_5fequid_5fcylind_5fgrid_5fmod_2ef90_148',['ip_rot_equid_cylind_grid_mod.F90',['../ip__rot__equid__cylind__grid__mod_8F90.html',1,'']]], + ['ip_5fstation_5fpoints_5fgrid_149',['ip_station_points_grid',['../structip__station__points__grid__mod_1_1ip__station__points__grid.html',1,'ip_station_points_grid_mod']]], + ['ip_5fstation_5fpoints_5fgrid_5fmod_150',['ip_station_points_grid_mod',['../namespaceip__station__points__grid__mod.html',1,'']]], + ['ip_5fstation_5fpoints_5fgrid_5fmod_2ef90_151',['ip_station_points_grid_mod.F90',['../ip__station__points__grid__mod_8F90.html',1,'']]], + ['iplib_5f4_2eh_152',['iplib_4.h',['../iplib__4_8h.html',1,'']]], + ['iplib_5f8_2eh_153',['iplib_8.h',['../iplib__8_8h.html',1,'']]], + ['iplib_5fd_2eh_154',['iplib_d.h',['../iplib__d_8h.html',1,'']]], + ['ipolates_155',['ipolates',['../interfaceipolates__mod_1_1ipolates.html',1,'ipolates_mod']]], + ['ipolates_2ef90_156',['ipolates.F90',['../ipolates_8F90.html',1,'']]], + ['ipolates_5fgrib1_157',['ipolates_grib1',['../namespaceipolates__mod.html#acb5408cf5c3a0f50326edc183f9bd269',1,'ipolates_mod::ipolates_grib1()'],['../interfaceipolates__mod_1_1ipolates.html#a8ff62af694c759f29c332836ff66437b',1,'ipolates_mod::ipolates::ipolates_grib1()']]], + ['ipolates_5fgrib1_5fsingle_5ffield_158',['ipolates_grib1_single_field',['../namespaceipolates__mod.html#ae70a9ca9871bb33e038782b036b7b53d',1,'ipolates_mod::ipolates_grib1_single_field()'],['../interfaceipolates__mod_1_1ipolates.html#afbc36431f96adfbbf552bc6137d0519d',1,'ipolates_mod::ipolates::ipolates_grib1_single_field()']]], + ['ipolates_5fgrib2_159',['ipolates_grib2',['../namespaceipolates__mod.html#a6b2ea6d5b04d2a68baad261e7a409fac',1,'ipolates_mod::ipolates_grib2()'],['../interfaceipolates__mod_1_1ipolates.html#a791ae0a257adcc3a789494489e28302b',1,'ipolates_mod::ipolates::ipolates_grib2()']]], + ['ipolates_5fgrib2_5fsingle_5ffield_160',['ipolates_grib2_single_field',['../namespaceipolates__mod.html#a49541b2af75b7c037a863a4785726856',1,'ipolates_mod::ipolates_grib2_single_field()'],['../interfaceipolates__mod_1_1ipolates.html#a3a77b7de2dce406829a3b01689372240',1,'ipolates_mod::ipolates::ipolates_grib2_single_field()']]], + ['ipolates_5fgrid_161',['ipolates_grid',['../namespaceipolates__mod.html#a2761e20fab898e7fd9963f3e0eb5d104',1,'ipolates_mod']]], + ['ipolates_5fmod_162',['ipolates_mod',['../namespaceipolates__mod.html',1,'']]], + ['ipolatev_163',['ipolatev',['../interfaceipolatev__mod_1_1ipolatev.html',1,'ipolatev_mod']]], + ['ipolatev_2ef90_164',['ipolatev.F90',['../ipolatev_8F90.html',1,'']]], + ['ipolatev_5fgrib1_165',['ipolatev_grib1',['../interfaceipolatev__mod_1_1ipolatev.html#ac721867d3d8e8adc11d56baba4702d53',1,'ipolatev_mod::ipolatev::ipolatev_grib1()'],['../namespaceipolatev__mod.html#abddc4a9b00133b358443b118f1352d1f',1,'ipolatev_mod::ipolatev_grib1()']]], + ['ipolatev_5fgrib1_5fsingle_5ffield_166',['ipolatev_grib1_single_field',['../interfaceipolatev__mod_1_1ipolatev.html#ad211b25631afd3fd7c04bbfba589a7c5',1,'ipolatev_mod::ipolatev::ipolatev_grib1_single_field()'],['../namespaceipolatev__mod.html#ad535ffd159c46e770effd774aabede58',1,'ipolatev_mod::ipolatev_grib1_single_field()']]], + ['ipolatev_5fgrib2_167',['ipolatev_grib2',['../interfaceipolatev__mod_1_1ipolatev.html#ac1ec04e3119f285f0f3955f016926efe',1,'ipolatev_mod::ipolatev::ipolatev_grib2()'],['../namespaceipolatev__mod.html#a00fed53dd867a802b3adbc1141e8d272',1,'ipolatev_mod::ipolatev_grib2(ip, ipopt, igdtnumi, igdtmpli, igdtleni, igdtnumo, igdtmplo, igdtleno, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)']]], + ['ipolatev_5fgrib2_5fsingle_5ffield_168',['ipolatev_grib2_single_field',['../namespaceipolatev__mod.html#a71d7507e8f89e1229caaaacb37e0c9c7',1,'ipolatev_mod::ipolatev_grib2_single_field()'],['../interfaceipolatev__mod_1_1ipolatev.html#aa0af88a9ccef79a921680fe40ec30ccd',1,'ipolatev_mod::ipolatev::ipolatev_grib2_single_field()']]], + ['ipolatev_5fgrid_169',['ipolatev_grid',['../namespaceipolatev__mod.html#a8f3bfec7495e13b75b2035e8e1f081a1',1,'ipolatev_mod']]], + ['ipolatev_5fmod_170',['ipolatev_mod',['../namespaceipolatev__mod.html',1,'']]], + ['ipxetas_171',['ipxetas',['../ipxetas_8F90.html#a89ff34ee39b0da1895e9d8552bb462e1',1,'ipxetas.F90']]], + ['ipxetas_2ef90_172',['ipxetas.F90',['../ipxetas_8F90.html',1,'']]], + ['ipxwafs_173',['ipxwafs',['../ipxwafs_8F90.html#a1465ea191950f7464bb3374abed94c12',1,'ipxwafs.F90']]], + ['ipxwafs_2ef90_174',['ipxwafs.F90',['../ipxwafs_8F90.html',1,'']]], + ['ipxwafs2_175',['ipxwafs2',['../ipxwafs2_8F90.html#ab602c9c04957836c0b8860560d442894',1,'ipxwafs2.F90']]], + ['ipxwafs2_2ef90_176',['ipxwafs2.F90',['../ipxwafs2_8F90.html',1,'']]], + ['ipxwafs3_177',['ipxwafs3',['../ipxwafs3_8F90.html#aae7be3c77cbe16d0219c86e443e6ec1d',1,'ipxwafs3.F90']]], + ['ipxwafs3_2ef90_178',['ipxwafs3.F90',['../ipxwafs3_8F90.html',1,'']]], + ['irot_179',['irot',['../namespaceip__lambert__conf__grid__mod.html#a7dea876ed4206c5ecc0444aadb7d6acd',1,'ip_lambert_conf_grid_mod::irot()'],['../namespaceip__polar__stereo__grid__mod.html#a1269037aaecd12e75e17d8aac8e20c8c',1,'ip_polar_stereo_grid_mod::irot()'],['../namespaceip__rot__equid__cylind__egrid__mod.html#a93ed996cf2dc9569e356256ec946b571',1,'ip_rot_equid_cylind_egrid_mod::irot()'],['../namespaceip__rot__equid__cylind__grid__mod.html#abb0c2acdbd71f0c07ffaf9db54ce06c1',1,'ip_rot_equid_cylind_grid_mod::irot()'],['../structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#ae4c44c4cf8d1376b24861534edbf514f',1,'ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::irot()'],['../structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a558e99f37191cb2ea7398ac2a05ef29e',1,'ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::irot()'],['../structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a13f3f267f5a26602eb93b6525f494a10',1,'ip_polar_stereo_grid_mod::ip_polar_stereo_grid::irot()'],['../structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a0d90490fa5eb04604fc0e01bea2cf3cf',1,'ip_lambert_conf_grid_mod::ip_lambert_conf_grid::irot()']]], + ['is_5fsame_5fgrid_180',['is_same_grid',['../namespaceip__grid__descriptor__mod.html#a202219f9c5c84fa04d3eb1c2208358ec',1,'ip_grid_descriptor_mod::is_same_grid()'],['../namespaceip__grid__mod.html#a663bda9af9dd991a09ba0f0de66dc045',1,'ip_grid_mod::is_same_grid()'],['../interfaceip__grid__mod_1_1operator_07_0a_0a_08.html#a0303cd13db74e096af7f77200ef09c6b',1,'ip_grid_mod::operator(==)::is_same_grid()'],['../interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08.html#a34e94f8aada186a3d22112a1ab31b53c',1,'ip_grid_descriptor_mod::operator(==)::is_same_grid()'],['../structip__grid__descriptor__mod_1_1ip__grid__descriptor.html#a9da102dac348a63ffce6556ed5da81b6',1,'ip_grid_descriptor_mod::ip_grid_descriptor::is_same_grid()']]], + ['is_5fsame_5fgrid_5fgrib1_181',['is_same_grid_grib1',['../namespaceip__grid__descriptor__mod.html#a5bb3c5230b88012bddc3922bfa1cb019',1,'ip_grid_descriptor_mod::is_same_grid_grib1()'],['../structip__grid__descriptor__mod_1_1grib1__descriptor.html#a33b4fc04d218c73e3c4d061163dcbc95',1,'ip_grid_descriptor_mod::grib1_descriptor::is_same_grid_grib1()']]], + ['is_5fsame_5fgrid_5fgrib2_182',['is_same_grid_grib2',['../structip__grid__descriptor__mod_1_1grib2__descriptor.html#ae27b09a835144baf782e2cde0c1ea013',1,'ip_grid_descriptor_mod::grib2_descriptor::is_same_grid_grib2()'],['../namespaceip__grid__descriptor__mod.html#a75ac34ea9372afaa29b0df2ce8919988',1,'ip_grid_descriptor_mod::is_same_grid_grib2()']]], + ['iwrap_183',['iwrap',['../structip__grid__mod_1_1ip__grid.html#ae179622b9a4c764a5ca90385330941ed',1,'ip_grid_mod::ip_grid']]] +]; diff --git a/search/all_9.html b/ver-5.1.0/search/all_9.html similarity index 100% rename from search/all_9.html rename to ver-5.1.0/search/all_9.html diff --git a/ver-5.1.0/search/all_9.js b/ver-5.1.0/search/all_9.js new file mode 100644 index 00000000..3ae699f4 --- /dev/null +++ b/ver-5.1.0/search/all_9.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['j1_184',['j1',['../namespaceip__gaussian__grid__mod.html#af5c4024263aa3eaef5801849ae32c15a',1,'ip_gaussian_grid_mod']]], + ['jg_185',['jg',['../structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a110f99e158a977a1679133235fa06c34',1,'ip_gaussian_grid_mod::ip_gaussian_grid']]], + ['jh_186',['jh',['../structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a549ccd3ce1f5c75d99e8e04d4d4341b4',1,'ip_gaussian_grid_mod::ip_gaussian_grid::jh()'],['../namespaceip__gaussian__grid__mod.html#a67d6cd6d188a8bded8bdf64927617028',1,'ip_gaussian_grid_mod::jh()']]], + ['jm_187',['jm',['../structip__grid__mod_1_1ip__grid.html#a41a2a38288864520d8c50854d1843f87',1,'ip_grid_mod::ip_grid']]], + ['jscan_188',['jscan',['../structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a3e199827f764b162a14515e837c28903',1,'ip_gaussian_grid_mod::ip_gaussian_grid']]], + ['jwrap1_189',['jwrap1',['../structip__grid__mod_1_1ip__grid.html#a92976f110dd7e823799991137ac970a1',1,'ip_grid_mod::ip_grid']]], + ['jwrap2_190',['jwrap2',['../structip__grid__mod_1_1ip__grid.html#ae70be8cebcd217a49be4da1cebfc19d2',1,'ip_grid_mod::ip_grid']]] +]; diff --git a/search/all_a.html b/ver-5.1.0/search/all_a.html similarity index 100% rename from search/all_a.html rename to ver-5.1.0/search/all_a.html diff --git a/ver-5.1.0/search/all_a.js b/ver-5.1.0/search/all_a.js new file mode 100644 index 00000000..05c2155a --- /dev/null +++ b/ver-5.1.0/search/all_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['kd_191',['kd',['../namespaceip__rot__equid__cylind__egrid__mod.html#a50497d277c347a2991b0e34e85f1787e',1,'ip_rot_equid_cylind_egrid_mod::kd()'],['../namespaceip__rot__equid__cylind__grid__mod.html#af5dea0592cccce2de1c5c6a92d42cfd6',1,'ip_rot_equid_cylind_grid_mod::kd()']]], + ['kscan_192',['kscan',['../structip__grid__mod_1_1ip__grid.html#a084603b1c052e76c3335fea2e887cfce',1,'ip_grid_mod::ip_grid']]] +]; diff --git a/search/all_b.html b/ver-5.1.0/search/all_b.html similarity index 100% rename from search/all_b.html rename to ver-5.1.0/search/all_b.html diff --git a/ver-5.1.0/search/all_b.js b/ver-5.1.0/search/all_b.js new file mode 100644 index 00000000..ed3ec51e --- /dev/null +++ b/ver-5.1.0/search/all_b.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['lambert_5fconf_5fgrid_5farea_193',['lambert_conf_grid_area',['../namespaceip__lambert__conf__grid__mod.html#a15c44b47172b926aea840caee9723b1c',1,'ip_lambert_conf_grid_mod']]], + ['lambert_5fconf_5fgrid_5fid_5fgrib1_194',['lambert_conf_grid_id_grib1',['../namespaceip__grid__mod.html#ab82b90d20f38ff39741f6890fa422d16',1,'ip_grid_mod']]], + ['lambert_5fconf_5fgrid_5fid_5fgrib2_195',['lambert_conf_grid_id_grib2',['../namespaceip__grid__mod.html#a2e49846c9122b1fe1fcdbb2913fc32fe',1,'ip_grid_mod']]], + ['lambert_5fconf_5fmap_5fjacob_196',['lambert_conf_map_jacob',['../namespaceip__lambert__conf__grid__mod.html#a5e1d42f0027236f47467e25c525e66ae',1,'ip_lambert_conf_grid_mod']]], + ['lambert_5fconf_5fvect_5frot_197',['lambert_conf_vect_rot',['../namespaceip__lambert__conf__grid__mod.html#a58187073914efa18eca897c6ec203b71',1,'ip_lambert_conf_grid_mod']]] +]; diff --git a/search/all_c.html b/ver-5.1.0/search/all_c.html similarity index 100% rename from search/all_c.html rename to ver-5.1.0/search/all_c.html diff --git a/ver-5.1.0/search/all_c.js b/ver-5.1.0/search/all_c.js new file mode 100644 index 00000000..121259b3 --- /dev/null +++ b/ver-5.1.0/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['mercator_5fgrid_5farea_198',['mercator_grid_area',['../namespaceip__mercator__grid__mod.html#a952ab9add18587c4dbe54699feb8eafd',1,'ip_mercator_grid_mod']]], + ['mercator_5fgrid_5fid_5fgrib1_199',['mercator_grid_id_grib1',['../namespaceip__grid__mod.html#ab9ff525eca4f053b04ec96a83cb06682',1,'ip_grid_mod']]], + ['mercator_5fgrid_5fid_5fgrib2_200',['mercator_grid_id_grib2',['../namespaceip__grid__mod.html#af9c58af5162d96cb7d1ac5001139b856',1,'ip_grid_mod']]], + ['mercator_5fmap_5fjacob_201',['mercator_map_jacob',['../namespaceip__mercator__grid__mod.html#ab93a0a6ae8c5f5056abece1dcffdc57a',1,'ip_mercator_grid_mod']]], + ['mercator_5fvect_5frot_202',['mercator_vect_rot',['../namespaceip__mercator__grid__mod.html#aea5e18faf7a18bf8d06c87ccb11f3e17',1,'ip_mercator_grid_mod']]], + ['movect_203',['movect',['../movect_8F90.html#a5974e32c0cf90a65b39c68460d761882',1,'movect.F90']]], + ['movect_2ef90_204',['movect.F90',['../movect_8F90.html',1,'']]] +]; diff --git a/search/all_d.html b/ver-5.1.0/search/all_d.html similarity index 100% rename from search/all_d.html rename to ver-5.1.0/search/all_d.html diff --git a/ver-5.1.0/search/all_d.js b/ver-5.1.0/search/all_d.js new file mode 100644 index 00000000..045d2308 --- /dev/null +++ b/ver-5.1.0/search/all_d.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['ncep_5fpost_5farakawa_205',['ncep_post_arakawa',['../namespaceip__grid__mod.html#a88751d2ee535d807b6d420fcfb99ee71',1,'ip_grid_mod']]], + ['ncpus_206',['ncpus',['../ncpus_8F.html#a821a75ee067ea31758a038c0327bd3bd',1,'ncpus.F']]], + ['ncpus_2ef_207',['ncpus.F',['../ncpus_8F.html',1,'']]], + ['neighbor_5fbudget_5finterp_5fid_208',['neighbor_budget_interp_id',['../namespaceip__interpolators__mod.html#ae77a1da241f5de94f1874004ee8e715c',1,'ip_interpolators_mod']]], + ['neighbor_5fbudget_5finterp_5fmod_209',['neighbor_budget_interp_mod',['../namespaceneighbor__budget__interp__mod.html',1,'']]], + ['neighbor_5fbudget_5finterp_5fmod_2ef90_210',['neighbor_budget_interp_mod.F90',['../neighbor__budget__interp__mod_8F90.html',1,'']]], + ['neighbor_5finterp_5fid_211',['neighbor_interp_id',['../namespaceip__interpolators__mod.html#a35e5fe3a2dd79d205c0503f550388258',1,'ip_interpolators_mod']]], + ['neighbor_5finterp_5fmod_212',['neighbor_interp_mod',['../namespaceneighbor__interp__mod.html',1,'']]], + ['neighbor_5finterp_5fmod_2ef90_213',['neighbor_interp_mod.F90',['../neighbor__interp__mod_8F90.html',1,'']]], + ['nm_214',['nm',['../structip__grid__mod_1_1ip__grid.html#a2ae87fb4e6bdcb75fc6fdc80ad73ee30',1,'ip_grid_mod::ip_grid']]], + ['nscan_215',['nscan',['../structip__grid__mod_1_1ip__grid.html#a1a15aa48354dbbd0b8debafbfc6e7b18',1,'ip_grid_mod::ip_grid']]], + ['nscan_5ffield_5fpos_216',['nscan_field_pos',['../structip__grid__mod_1_1ip__grid.html#a0640093c52461763f904cc2f12c96b6c',1,'ip_grid_mod::ip_grid']]] +]; diff --git a/search/all_e.html b/ver-5.1.0/search/all_e.html similarity index 100% rename from search/all_e.html rename to ver-5.1.0/search/all_e.html diff --git a/ver-5.1.0/search/all_e.js b/ver-5.1.0/search/all_e.js new file mode 100644 index 00000000..30900898 --- /dev/null +++ b/ver-5.1.0/search/all_e.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['operator_28_3d_3d_29_217',['operator(==)',['../interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08.html',1,'ip_grid_descriptor_mod::operator(==)'],['../interfaceip__grid__mod_1_1operator_07_0a_0a_08.html',1,'ip_grid_mod::operator(==)']]], + ['orient_218',['orient',['../structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a0614cfdb69e59e3c3e2937f3319fe34a',1,'ip_lambert_conf_grid_mod::ip_lambert_conf_grid::orient()'],['../structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#aeaeb6d72861b9b62de5bcd435bc96ea4',1,'ip_polar_stereo_grid_mod::ip_polar_stereo_grid::orient()'],['../namespaceip__polar__stereo__grid__mod.html#aa4a88f48d7b78cfdfc54754882195d18',1,'ip_polar_stereo_grid_mod::orient()']]] +]; diff --git a/search/all_f.html b/ver-5.1.0/search/all_f.html similarity index 100% rename from search/all_f.html rename to ver-5.1.0/search/all_f.html diff --git a/ver-5.1.0/search/all_f.js b/ver-5.1.0/search/all_f.js new file mode 100644 index 00000000..f39c5e13 --- /dev/null +++ b/ver-5.1.0/search/all_f.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['pi_219',['pi',['../namespaceip__constants__mod.html#a47f83a2267da693170054c958c401cd4',1,'ip_constants_mod']]], + ['pi2_220',['pi2',['../namespaceip__constants__mod.html#a309f7e3b1f83b6b272b12ce4fff501c5',1,'ip_constants_mod']]], + ['pi4_221',['pi4',['../namespaceip__constants__mod.html#a5fe7cdd86b44487666dc37f655d9ff15',1,'ip_constants_mod']]], + ['polar_5fstereo_5fgrid_5farea_222',['polar_stereo_grid_area',['../namespaceip__polar__stereo__grid__mod.html#a2a2e0854e5c129e320924a811cbd08e2',1,'ip_polar_stereo_grid_mod']]], + ['polar_5fstereo_5fgrid_5fid_5fgrib1_223',['polar_stereo_grid_id_grib1',['../namespaceip__grid__mod.html#afee73c2f09ea9de43c156dc594ae1df1',1,'ip_grid_mod']]], + ['polar_5fstereo_5fgrid_5fid_5fgrib2_224',['polar_stereo_grid_id_grib2',['../namespaceip__grid__mod.html#a5b3ad320b41791e65966e1bb498e9ae3',1,'ip_grid_mod']]], + ['polar_5fstereo_5fmap_5fjacob_225',['polar_stereo_map_jacob',['../namespaceip__polar__stereo__grid__mod.html#a386933f7e52c348b9d742df423e0e223',1,'ip_polar_stereo_grid_mod']]], + ['polar_5fstereo_5fvect_5frot_226',['polar_stereo_vect_rot',['../namespaceip__polar__stereo__grid__mod.html#abe4d416201e986421a8e325a9b00e462',1,'ip_polar_stereo_grid_mod']]], + ['polates4_227',['polates4',['../interfacespectral__interp__mod_1_1polates4.html',1,'spectral_interp_mod']]], + ['polates4_5fgrib1_228',['polates4_grib1',['../namespacespectral__interp__mod.html#ab9fb87d87f2f9d578a5ade6b512ff366',1,'spectral_interp_mod::polates4_grib1()'],['../interfacespectral__interp__mod_1_1polates4.html#a0be1315db4dce899083176b47b6ea6a4',1,'spectral_interp_mod::polates4::polates4_grib1()']]], + ['polates4_5fgrib2_229',['polates4_grib2',['../namespacespectral__interp__mod.html#a54dfd0ea8368242a1053d64770bd295a',1,'spectral_interp_mod::polates4_grib2()'],['../interfacespectral__interp__mod_1_1polates4.html#a3fdc75851f1f741e715a1c3e1e4d89c9',1,'spectral_interp_mod::polates4::polates4_grib2()']]], + ['polatev4_230',['polatev4',['../interfacespectral__interp__mod_1_1polatev4.html',1,'spectral_interp_mod']]], + ['polatev4_5fgrib1_231',['polatev4_grib1',['../interfacespectral__interp__mod_1_1polatev4.html#a5fa619eb983da3326380e9bafcf49ca8',1,'spectral_interp_mod::polatev4::polatev4_grib1()'],['../namespacespectral__interp__mod.html#af4ce7638750e787dd69c7fe3ff2335cc',1,'spectral_interp_mod::polatev4_grib1()']]], + ['polatev4_5fgrib2_232',['polatev4_grib2',['../interfacespectral__interp__mod_1_1polatev4.html#a9dcbaeb719e3872ad5ad461adde5c98b',1,'spectral_interp_mod::polatev4::polatev4_grib2()'],['../namespacespectral__interp__mod.html#a2f76e9900554d90753ca788c2ddf9ac3',1,'spectral_interp_mod::polatev4_grib2()']]], + ['polfix_5fmod_233',['polfix_mod',['../namespacepolfix__mod.html',1,'']]], + ['polfix_5fmod_2ef90_234',['polfix_mod.F90',['../polfix__mod_8F90.html',1,'']]], + ['polfixs_235',['polfixs',['../namespacepolfix__mod.html#a15df1ba2e1fcad1e9465c4aa3a2ba0d6',1,'polfix_mod']]], + ['polfixv_236',['polfixv',['../namespacepolfix__mod.html#aeefc8f045777f6d962d9ec539ef6007d',1,'polfix_mod']]] +]; diff --git a/search/classes_0.html b/ver-5.1.0/search/classes_0.html similarity index 100% rename from search/classes_0.html rename to ver-5.1.0/search/classes_0.html diff --git a/ver-5.1.0/search/classes_0.js b/ver-5.1.0/search/classes_0.js new file mode 100644 index 00000000..683b64bc --- /dev/null +++ b/ver-5.1.0/search/classes_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['gdswzd_394',['gdswzd',['../interfacegdswzd__mod_1_1gdswzd.html',1,'gdswzd_mod']]], + ['gdswzd_5finterface_395',['gdswzd_interface',['../interfaceip__grid__mod_1_1gdswzd__interface.html',1,'ip_grid_mod']]], + ['grib1_5fdescriptor_396',['grib1_descriptor',['../structip__grid__descriptor__mod_1_1grib1__descriptor.html',1,'ip_grid_descriptor_mod']]], + ['grib2_5fdescriptor_397',['grib2_descriptor',['../structip__grid__descriptor__mod_1_1grib2__descriptor.html',1,'ip_grid_descriptor_mod']]] +]; diff --git a/search/classes_1.html b/ver-5.1.0/search/classes_1.html similarity index 100% rename from search/classes_1.html rename to ver-5.1.0/search/classes_1.html diff --git a/ver-5.1.0/search/classes_1.js b/ver-5.1.0/search/classes_1.js new file mode 100644 index 00000000..e97c691d --- /dev/null +++ b/ver-5.1.0/search/classes_1.js @@ -0,0 +1,25 @@ +var searchData= +[ + ['init_5fdescriptor_398',['init_descriptor',['../interfaceip__grid__descriptor__mod_1_1init__descriptor.html',1,'ip_grid_descriptor_mod']]], + ['init_5fgrib1_5finterface_399',['init_grib1_interface',['../interfaceip__grid__mod_1_1init__grib1__interface.html',1,'ip_grid_mod']]], + ['init_5fgrib2_5finterface_400',['init_grib2_interface',['../interfaceip__grid__mod_1_1init__grib2__interface.html',1,'ip_grid_mod']]], + ['init_5fgrid_401',['init_grid',['../interfaceip__grid__factory__mod_1_1init__grid.html',1,'ip_grid_factory_mod']]], + ['interpolate_5fbicubic_402',['interpolate_bicubic',['../interfacebicubic__interp__mod_1_1interpolate__bicubic.html',1,'bicubic_interp_mod']]], + ['interpolate_5fbilinear_403',['interpolate_bilinear',['../interfacebilinear__interp__mod_1_1interpolate__bilinear.html',1,'bilinear_interp_mod']]], + ['interpolate_5fbudget_404',['interpolate_budget',['../interfacebudget__interp__mod_1_1interpolate__budget.html',1,'budget_interp_mod']]], + ['interpolate_5fneighbor_405',['interpolate_neighbor',['../interfaceneighbor__interp__mod_1_1interpolate__neighbor.html',1,'neighbor_interp_mod']]], + ['interpolate_5fneighbor_5fbudget_406',['interpolate_neighbor_budget',['../interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget.html',1,'neighbor_budget_interp_mod']]], + ['interpolate_5fspectral_407',['interpolate_spectral',['../interfacespectral__interp__mod_1_1interpolate__spectral.html',1,'spectral_interp_mod']]], + ['ip_5fequid_5fcylind_5fgrid_408',['ip_equid_cylind_grid',['../structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html',1,'ip_equid_cylind_grid_mod']]], + ['ip_5fgaussian_5fgrid_409',['ip_gaussian_grid',['../structip__gaussian__grid__mod_1_1ip__gaussian__grid.html',1,'ip_gaussian_grid_mod']]], + ['ip_5fgrid_410',['ip_grid',['../structip__grid__mod_1_1ip__grid.html',1,'ip_grid_mod']]], + ['ip_5fgrid_5fdescriptor_411',['ip_grid_descriptor',['../structip__grid__descriptor__mod_1_1ip__grid__descriptor.html',1,'ip_grid_descriptor_mod']]], + ['ip_5flambert_5fconf_5fgrid_412',['ip_lambert_conf_grid',['../structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html',1,'ip_lambert_conf_grid_mod']]], + ['ip_5fmercator_5fgrid_413',['ip_mercator_grid',['../structip__mercator__grid__mod_1_1ip__mercator__grid.html',1,'ip_mercator_grid_mod']]], + ['ip_5fpolar_5fstereo_5fgrid_414',['ip_polar_stereo_grid',['../structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html',1,'ip_polar_stereo_grid_mod']]], + ['ip_5frot_5fequid_5fcylind_5fegrid_415',['ip_rot_equid_cylind_egrid',['../structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html',1,'ip_rot_equid_cylind_egrid_mod']]], + ['ip_5frot_5fequid_5fcylind_5fgrid_416',['ip_rot_equid_cylind_grid',['../structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html',1,'ip_rot_equid_cylind_grid_mod']]], + ['ip_5fstation_5fpoints_5fgrid_417',['ip_station_points_grid',['../structip__station__points__grid__mod_1_1ip__station__points__grid.html',1,'ip_station_points_grid_mod']]], + ['ipolates_418',['ipolates',['../interfaceipolates__mod_1_1ipolates.html',1,'ipolates_mod']]], + ['ipolatev_419',['ipolatev',['../interfaceipolatev__mod_1_1ipolatev.html',1,'ipolatev_mod']]] +]; diff --git a/search/classes_2.html b/ver-5.1.0/search/classes_2.html similarity index 100% rename from search/classes_2.html rename to ver-5.1.0/search/classes_2.html diff --git a/ver-5.1.0/search/classes_2.js b/ver-5.1.0/search/classes_2.js new file mode 100644 index 00000000..4710f4f0 --- /dev/null +++ b/ver-5.1.0/search/classes_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['operator_28_3d_3d_29_420',['operator(==)',['../interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08.html',1,'ip_grid_descriptor_mod::operator(==)'],['../interfaceip__grid__mod_1_1operator_07_0a_0a_08.html',1,'ip_grid_mod::operator(==)']]] +]; diff --git a/search/classes_3.html b/ver-5.1.0/search/classes_3.html similarity index 100% rename from search/classes_3.html rename to ver-5.1.0/search/classes_3.html diff --git a/ver-5.1.0/search/classes_3.js b/ver-5.1.0/search/classes_3.js new file mode 100644 index 00000000..37aac054 --- /dev/null +++ b/ver-5.1.0/search/classes_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['polates4_421',['polates4',['../interfacespectral__interp__mod_1_1polates4.html',1,'spectral_interp_mod']]], + ['polatev4_422',['polatev4',['../interfacespectral__interp__mod_1_1polatev4.html',1,'spectral_interp_mod']]] +]; diff --git a/ver-5.1.0/search/close.svg b/ver-5.1.0/search/close.svg new file mode 100644 index 00000000..a933eea1 --- /dev/null +++ b/ver-5.1.0/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/search/files_0.html b/ver-5.1.0/search/files_0.html similarity index 100% rename from search/files_0.html rename to ver-5.1.0/search/files_0.html diff --git a/ver-5.1.0/search/files_0.js b/ver-5.1.0/search/files_0.js new file mode 100644 index 00000000..3928635b --- /dev/null +++ b/ver-5.1.0/search/files_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['bicubic_5finterp_5fmod_2ef90_450',['bicubic_interp_mod.F90',['../bicubic__interp__mod_8F90.html',1,'']]], + ['bilinear_5finterp_5fmod_2ef90_451',['bilinear_interp_mod.F90',['../bilinear__interp__mod_8F90.html',1,'']]], + ['budget_5finterp_5fmod_2ef90_452',['budget_interp_mod.F90',['../budget__interp__mod_8F90.html',1,'']]] +]; diff --git a/search/files_1.html b/ver-5.1.0/search/files_1.html similarity index 100% rename from search/files_1.html rename to ver-5.1.0/search/files_1.html diff --git a/ver-5.1.0/search/files_1.js b/ver-5.1.0/search/files_1.js new file mode 100644 index 00000000..c8419619 --- /dev/null +++ b/ver-5.1.0/search/files_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['earth_5fradius_5fmod_2ef90_453',['earth_radius_mod.F90',['../earth__radius__mod_8F90.html',1,'']]] +]; diff --git a/search/files_2.html b/ver-5.1.0/search/files_2.html similarity index 100% rename from search/files_2.html rename to ver-5.1.0/search/files_2.html diff --git a/ver-5.1.0/search/files_2.js b/ver-5.1.0/search/files_2.js new file mode 100644 index 00000000..859cb8a3 --- /dev/null +++ b/ver-5.1.0/search/files_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['fftpack_2ef_454',['fftpack.F',['../fftpack_8F.html',1,'']]] +]; diff --git a/search/files_3.html b/ver-5.1.0/search/files_3.html similarity index 100% rename from search/files_3.html rename to ver-5.1.0/search/files_3.html diff --git a/ver-5.1.0/search/files_3.js b/ver-5.1.0/search/files_3.js new file mode 100644 index 00000000..93599ee8 --- /dev/null +++ b/ver-5.1.0/search/files_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['gdswzd_5fc_2ef90_455',['gdswzd_c.F90',['../gdswzd__c_8F90.html',1,'']]], + ['gdswzd_5fmod_2ef90_456',['gdswzd_mod.F90',['../gdswzd__mod_8F90.html',1,'']]] +]; diff --git a/search/files_4.html b/ver-5.1.0/search/files_4.html similarity index 100% rename from search/files_4.html rename to ver-5.1.0/search/files_4.html diff --git a/ver-5.1.0/search/files_4.js b/ver-5.1.0/search/files_4.js new file mode 100644 index 00000000..5e9b50ff --- /dev/null +++ b/ver-5.1.0/search/files_4.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['ip_5fconstants_5fmod_2ef90_457',['ip_constants_mod.F90',['../ip__constants__mod_8F90.html',1,'']]], + ['ip_5fequid_5fcylind_5fgrid_5fmod_2ef90_458',['ip_equid_cylind_grid_mod.F90',['../ip__equid__cylind__grid__mod_8F90.html',1,'']]], + ['ip_5fgaussian_5fgrid_5fmod_2ef90_459',['ip_gaussian_grid_mod.F90',['../ip__gaussian__grid__mod_8F90.html',1,'']]], + ['ip_5fgrid_5fdescriptor_5fmod_2ef90_460',['ip_grid_descriptor_mod.F90',['../ip__grid__descriptor__mod_8F90.html',1,'']]], + ['ip_5fgrid_5ffactory_5fmod_2ef90_461',['ip_grid_factory_mod.F90',['../ip__grid__factory__mod_8F90.html',1,'']]], + ['ip_5fgrid_5fmod_2ef90_462',['ip_grid_mod.F90',['../ip__grid__mod_8F90.html',1,'']]], + ['ip_5fgrids_5fmod_2ef90_463',['ip_grids_mod.F90',['../ip__grids__mod_8F90.html',1,'']]], + ['ip_5finterpolators_5fmod_2ef90_464',['ip_interpolators_mod.F90',['../ip__interpolators__mod_8F90.html',1,'']]], + ['ip_5flambert_5fconf_5fgrid_5fmod_2ef90_465',['ip_lambert_conf_grid_mod.F90',['../ip__lambert__conf__grid__mod_8F90.html',1,'']]], + ['ip_5fmercator_5fgrid_5fmod_2ef90_466',['ip_mercator_grid_mod.F90',['../ip__mercator__grid__mod_8F90.html',1,'']]], + ['ip_5fmod_2ef90_467',['ip_mod.F90',['../ip__mod_8F90.html',1,'']]], + ['ip_5fpolar_5fstereo_5fgrid_5fmod_2ef90_468',['ip_polar_stereo_grid_mod.F90',['../ip__polar__stereo__grid__mod_8F90.html',1,'']]], + ['ip_5frot_5fequid_5fcylind_5fegrid_5fmod_2ef90_469',['ip_rot_equid_cylind_egrid_mod.F90',['../ip__rot__equid__cylind__egrid__mod_8F90.html',1,'']]], + ['ip_5frot_5fequid_5fcylind_5fgrid_5fmod_2ef90_470',['ip_rot_equid_cylind_grid_mod.F90',['../ip__rot__equid__cylind__grid__mod_8F90.html',1,'']]], + ['ip_5fstation_5fpoints_5fgrid_5fmod_2ef90_471',['ip_station_points_grid_mod.F90',['../ip__station__points__grid__mod_8F90.html',1,'']]], + ['iplib_5f4_2eh_472',['iplib_4.h',['../iplib__4_8h.html',1,'']]], + ['iplib_5f8_2eh_473',['iplib_8.h',['../iplib__8_8h.html',1,'']]], + ['iplib_5fd_2eh_474',['iplib_d.h',['../iplib__d_8h.html',1,'']]], + ['ipolates_2ef90_475',['ipolates.F90',['../ipolates_8F90.html',1,'']]], + ['ipolatev_2ef90_476',['ipolatev.F90',['../ipolatev_8F90.html',1,'']]], + ['ipxetas_2ef90_477',['ipxetas.F90',['../ipxetas_8F90.html',1,'']]], + ['ipxwafs_2ef90_478',['ipxwafs.F90',['../ipxwafs_8F90.html',1,'']]], + ['ipxwafs2_2ef90_479',['ipxwafs2.F90',['../ipxwafs2_8F90.html',1,'']]], + ['ipxwafs3_2ef90_480',['ipxwafs3.F90',['../ipxwafs3_8F90.html',1,'']]] +]; diff --git a/search/files_5.html b/ver-5.1.0/search/files_5.html similarity index 100% rename from search/files_5.html rename to ver-5.1.0/search/files_5.html diff --git a/ver-5.1.0/search/files_5.js b/ver-5.1.0/search/files_5.js new file mode 100644 index 00000000..42ab7f1d --- /dev/null +++ b/ver-5.1.0/search/files_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['movect_2ef90_481',['movect.F90',['../movect_8F90.html',1,'']]] +]; diff --git a/search/files_6.html b/ver-5.1.0/search/files_6.html similarity index 100% rename from search/files_6.html rename to ver-5.1.0/search/files_6.html diff --git a/ver-5.1.0/search/files_6.js b/ver-5.1.0/search/files_6.js new file mode 100644 index 00000000..85fe4d56 --- /dev/null +++ b/ver-5.1.0/search/files_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['ncpus_2ef_482',['ncpus.F',['../ncpus_8F.html',1,'']]], + ['neighbor_5fbudget_5finterp_5fmod_2ef90_483',['neighbor_budget_interp_mod.F90',['../neighbor__budget__interp__mod_8F90.html',1,'']]], + ['neighbor_5finterp_5fmod_2ef90_484',['neighbor_interp_mod.F90',['../neighbor__interp__mod_8F90.html',1,'']]] +]; diff --git a/search/files_7.html b/ver-5.1.0/search/files_7.html similarity index 100% rename from search/files_7.html rename to ver-5.1.0/search/files_7.html diff --git a/ver-5.1.0/search/files_7.js b/ver-5.1.0/search/files_7.js new file mode 100644 index 00000000..13b605ea --- /dev/null +++ b/ver-5.1.0/search/files_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['polfix_5fmod_2ef90_485',['polfix_mod.F90',['../polfix__mod_8F90.html',1,'']]] +]; diff --git a/search/files_8.html b/ver-5.1.0/search/files_8.html similarity index 100% rename from search/files_8.html rename to ver-5.1.0/search/files_8.html diff --git a/ver-5.1.0/search/files_8.js b/ver-5.1.0/search/files_8.js new file mode 100644 index 00000000..0b230cdb --- /dev/null +++ b/ver-5.1.0/search/files_8.js @@ -0,0 +1,56 @@ +var searchData= +[ + ['spanaly_2ef_486',['spanaly.f',['../spanaly_8f.html',1,'']]], + ['spdz2uv_2ef_487',['spdz2uv.f',['../spdz2uv_8f.html',1,'']]], + ['spectral_5finterp_5fmod_2ef90_488',['spectral_interp_mod.F90',['../spectral__interp__mod_8F90.html',1,'']]], + ['speps_2ef_489',['speps.f',['../speps_8f.html',1,'']]], + ['spfft_2ef_490',['spfft.f',['../spfft_8f.html',1,'']]], + ['spfft1_2ef_491',['spfft1.f',['../spfft1_8f.html',1,'']]], + ['spffte_2ef_492',['spffte.f',['../spffte_8f.html',1,'']]], + ['spfftpt_2ef_493',['spfftpt.f',['../spfftpt_8f.html',1,'']]], + ['spgradq_2ef_494',['spgradq.f',['../spgradq_8f.html',1,'']]], + ['spgradx_2ef_495',['spgradx.f',['../spgradx_8f.html',1,'']]], + ['spgrady_2ef_496',['spgrady.f',['../spgrady_8f.html',1,'']]], + ['splaplac_2ef_497',['splaplac.f',['../splaplac_8f.html',1,'']]], + ['splat_2ef_498',['splat.F',['../splat_8F.html',1,'']]], + ['splegend_2ef_499',['splegend.f',['../splegend_8f.html',1,'']]], + ['sppad_2ef_500',['sppad.f',['../sppad_8f.html',1,'']]], + ['spsynth_2ef_501',['spsynth.f',['../spsynth_8f.html',1,'']]], + ['sptez_2ef_502',['sptez.f',['../sptez_8f.html',1,'']]], + ['sptezd_2ef_503',['sptezd.f',['../sptezd_8f.html',1,'']]], + ['sptezm_2ef_504',['sptezm.f',['../sptezm_8f.html',1,'']]], + ['sptezmd_2ef_505',['sptezmd.f',['../sptezmd_8f.html',1,'']]], + ['sptezmv_2ef_506',['sptezmv.f',['../sptezmv_8f.html',1,'']]], + ['sptezv_2ef_507',['sptezv.f',['../sptezv_8f.html',1,'']]], + ['sptgpm_2ef_508',['sptgpm.f',['../sptgpm_8f.html',1,'']]], + ['sptgpmd_2ef_509',['sptgpmd.f',['../sptgpmd_8f.html',1,'']]], + ['sptgpmv_2ef_510',['sptgpmv.f',['../sptgpmv_8f.html',1,'']]], + ['sptgps_2ef_511',['sptgps.f',['../sptgps_8f.html',1,'']]], + ['sptgpsd_2ef_512',['sptgpsd.f',['../sptgpsd_8f.html',1,'']]], + ['sptgpsv_2ef_513',['sptgpsv.f',['../sptgpsv_8f.html',1,'']]], + ['sptgpt_2ef_514',['sptgpt.f',['../sptgpt_8f.html',1,'']]], + ['sptgptd_2ef_515',['sptgptd.f',['../sptgptd_8f.html',1,'']]], + ['sptgptsd_2ef_516',['sptgptsd.f',['../sptgptsd_8f.html',1,'']]], + ['sptgptv_2ef_517',['sptgptv.f',['../sptgptv_8f.html',1,'']]], + ['sptgptvd_2ef_518',['sptgptvd.f',['../sptgptvd_8f.html',1,'']]], + ['sptran_2ef_519',['sptran.f',['../sptran_8f.html',1,'']]], + ['sptrand_2ef_520',['sptrand.f',['../sptrand_8f.html',1,'']]], + ['sptranf_2ef_521',['sptranf.f',['../sptranf_8f.html',1,'']]], + ['sptranf0_2ef_522',['sptranf0.f',['../sptranf0_8f.html',1,'']]], + ['sptranf1_2ef_523',['sptranf1.f',['../sptranf1_8f.html',1,'']]], + ['sptranfv_2ef_524',['sptranfv.f',['../sptranfv_8f.html',1,'']]], + ['sptranv_2ef_525',['sptranv.f',['../sptranv_8f.html',1,'']]], + ['sptrun_2ef_526',['sptrun.f',['../sptrun_8f.html',1,'']]], + ['sptrund_2ef_527',['sptrund.f',['../sptrund_8f.html',1,'']]], + ['sptrung_2ef_528',['sptrung.f',['../sptrung_8f.html',1,'']]], + ['sptrungv_2ef_529',['sptrungv.f',['../sptrungv_8f.html',1,'']]], + ['sptrunl_2ef_530',['sptrunl.f',['../sptrunl_8f.html',1,'']]], + ['sptrunm_2ef_531',['sptrunm.f',['../sptrunm_8f.html',1,'']]], + ['sptrunmv_2ef_532',['sptrunmv.f',['../sptrunmv_8f.html',1,'']]], + ['sptruns_2ef_533',['sptruns.f',['../sptruns_8f.html',1,'']]], + ['sptrunsv_2ef_534',['sptrunsv.f',['../sptrunsv_8f.html',1,'']]], + ['sptrunv_2ef_535',['sptrunv.f',['../sptrunv_8f.html',1,'']]], + ['spuv2dz_2ef_536',['spuv2dz.f',['../spuv2dz_8f.html',1,'']]], + ['spvar_2ef_537',['spvar.f',['../spvar_8f.html',1,'']]], + ['spwget_2ef_538',['spwget.f',['../spwget_8f.html',1,'']]] +]; diff --git a/search/functions_0.html b/ver-5.1.0/search/functions_0.html similarity index 100% rename from search/functions_0.html rename to ver-5.1.0/search/functions_0.html diff --git a/ver-5.1.0/search/functions_0.js b/ver-5.1.0/search/functions_0.js new file mode 100644 index 00000000..cf1d6e85 --- /dev/null +++ b/ver-5.1.0/search/functions_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['csfft_539',['csfft',['../fftpack_8F.html#ad261879c88a7f040e43f1549e65f36e5',1,'fftpack.F']]] +]; diff --git a/search/functions_1.html b/ver-5.1.0/search/functions_1.html similarity index 100% rename from search/functions_1.html rename to ver-5.1.0/search/functions_1.html diff --git a/ver-5.1.0/search/functions_1.js b/ver-5.1.0/search/functions_1.js new file mode 100644 index 00000000..839706fd --- /dev/null +++ b/ver-5.1.0/search/functions_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['dcrft_540',['dcrft',['../fftpack_8F.html#a713ef445886ad8dc8b16692c6075d225',1,'fftpack.F']]], + ['drcft_541',['drcft',['../fftpack_8F.html#a55b05419c0d3bb0595b34c8cacf93be8',1,'fftpack.F']]] +]; diff --git a/search/functions_2.html b/ver-5.1.0/search/functions_2.html similarity index 100% rename from search/functions_2.html rename to ver-5.1.0/search/functions_2.html diff --git a/ver-5.1.0/search/functions_2.js b/ver-5.1.0/search/functions_2.js new file mode 100644 index 00000000..d1cf929b --- /dev/null +++ b/ver-5.1.0/search/functions_2.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['earth_5fradius_542',['earth_radius',['../namespaceearth__radius__mod.html#a810f60db1a1faff0d6f59937a8207a54',1,'earth_radius_mod']]], + ['equid_5fcylind_5fgrid_5farea_543',['equid_cylind_grid_area',['../namespaceip__equid__cylind__grid__mod.html#a5a70b82abdce76bef22cdeaa96a986c2',1,'ip_equid_cylind_grid_mod']]], + ['equid_5fcylind_5fmap_5fjacob_544',['equid_cylind_map_jacob',['../namespaceip__equid__cylind__grid__mod.html#a039501b44cd3ad4409983e193d509afd',1,'ip_equid_cylind_grid_mod']]], + ['equid_5fcylind_5fvect_5frot_545',['equid_cylind_vect_rot',['../namespaceip__equid__cylind__grid__mod.html#ade88ecea1c0bb4b4d5b0d08f8482268d',1,'ip_equid_cylind_grid_mod']]] +]; diff --git a/search/functions_3.html b/ver-5.1.0/search/functions_3.html similarity index 100% rename from search/functions_3.html rename to ver-5.1.0/search/functions_3.html diff --git a/ver-5.1.0/search/functions_3.js b/ver-5.1.0/search/functions_3.js new file mode 100644 index 00000000..5b55ebf3 --- /dev/null +++ b/ver-5.1.0/search/functions_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['field_5fpos_546',['field_pos',['../structip__grid__mod_1_1ip__grid.html#ac071b3d3eca9a5fa88ff5dc211d19179',1,'ip_grid_mod::ip_grid::field_pos()'],['../namespaceip__grid__mod.html#a63572318d74ec94c20c5ccd6ded2d442',1,'ip_grid_mod::field_pos()']]] +]; diff --git a/search/functions_4.html b/ver-5.1.0/search/functions_4.html similarity index 100% rename from search/functions_4.html rename to ver-5.1.0/search/functions_4.html diff --git a/ver-5.1.0/search/functions_4.js b/ver-5.1.0/search/functions_4.js new file mode 100644 index 00000000..9a05b688 --- /dev/null +++ b/ver-5.1.0/search/functions_4.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['gaussian_5fgrid_5farea_547',['gaussian_grid_area',['../namespaceip__gaussian__grid__mod.html#ab602a870a477c7ab77438700af4e7780',1,'ip_gaussian_grid_mod']]], + ['gaussian_5fmap_5fjacob_548',['gaussian_map_jacob',['../namespaceip__gaussian__grid__mod.html#adca7b03877c6a7048ff1716a95e0bd9d',1,'ip_gaussian_grid_mod']]], + ['gaussian_5fvect_5frot_549',['gaussian_vect_rot',['../namespaceip__gaussian__grid__mod.html#ac72eec96d0012fbe0f0ec7c520f40dad',1,'ip_gaussian_grid_mod']]], + ['gdswzd_550',['gdswzd',['../structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a7ce52d987d2bd2442053042c03f96885',1,'ip_gaussian_grid_mod::ip_gaussian_grid::gdswzd()'],['../iplib__d_8h.html#ac919f31612096fd6a7547a425ab3d38e',1,'gdswzd(int igdtnum, int *igdtmpl, int igdtlen, int iopt, int npts, double fill, double *xpts, double *ypts, double *rlon, double *rlat, int *nret, double *crot, double *srot, double *xlon, double *xlat, double *ylon, double *ylat, double *area): iplib_d.h'],['../iplib__8_8h.html#af41ad9a4b34f78d182a68b3d72b9bdf4',1,'gdswzd(long igdtnum, long *igdtmpl, long igdtlen, long iopt, long npts, double fill, double *xpts, double *ypts, double *rlon, double *rlat, long *nret, double *crot, double *srot, double *xlon, double *xlat, double *ylon, double *ylat, double *area): iplib_8.h'],['../iplib__4_8h.html#a44daefd49c37e9bc59933d98e56efa53',1,'gdswzd(int igdtnum, int *igdtmpl, int igdtlen, int iopt, int npts, float fill, float *xpts, float *ypts, float *rlon, float *rlat, int *nret, float *crot, float *srot, float *xlon, float *xlat, float *ylon, float *ylat, float *area): iplib_4.h'],['../structip__station__points__grid__mod_1_1ip__station__points__grid.html#a9fff8b24553d11177b8c1ee38bfbd91f',1,'ip_station_points_grid_mod::ip_station_points_grid::gdswzd()'],['../structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a0f14a253b51bcb0633cd00d32d5130a4',1,'ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::gdswzd()'],['../structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#aa1023c3efed20a990b75f937bbcac6a3',1,'ip_equid_cylind_grid_mod::ip_equid_cylind_grid::gdswzd()'],['../structip__grid__mod_1_1ip__grid.html#a5fb366fb577a90cc09f21269b90ac080',1,'ip_grid_mod::ip_grid::gdswzd()'],['../structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a62c8147f8845d75e8f52c7524a74c780',1,'ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::gdswzd()'],['../structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a9e97b7352e67dd629f622f292cf0ca21',1,'ip_polar_stereo_grid_mod::ip_polar_stereo_grid::gdswzd()'],['../structip__mercator__grid__mod_1_1ip__mercator__grid.html#a940420aa99e0fbe51a976f9d0c343f1a',1,'ip_mercator_grid_mod::ip_mercator_grid::gdswzd()'],['../structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#aa69861340bc268b91a1076048ed489fc',1,'ip_lambert_conf_grid_mod::ip_lambert_conf_grid::gdswzd()']]], + ['gdswzd_5f1d_5farray_551',['gdswzd_1d_array',['../interfacegdswzd__mod_1_1gdswzd.html#afaf35e3ce949dd2ce3d72dd3f06d4e3b',1,'gdswzd_mod::gdswzd::gdswzd_1d_array()'],['../namespacegdswzd__mod.html#ac304e2b046eccc701e24827c81107e76',1,'gdswzd_mod::gdswzd_1d_array()']]], + ['gdswzd_5f2d_5farray_552',['gdswzd_2d_array',['../interfacegdswzd__mod_1_1gdswzd.html#a8b60240eefdc297eacf90c348b529d31',1,'gdswzd_mod::gdswzd::gdswzd_2d_array()'],['../namespacegdswzd__mod.html#acdf970e498e9317522fbdfb690b86e25',1,'gdswzd_mod::gdswzd_2d_array(IGDTNUM, IGDTMPL, IGDTLEN, IOPT, NPTS, FILL, XPTS, YPTS, RLON, RLAT, NRET, CROT, SROT, XLON, XLAT, YLON, YLAT, AREA)']]], + ['gdswzd_5f2d_5farray_5fgrib1_553',['gdswzd_2d_array_grib1',['../namespacegdswzd__mod.html#aa032a55281b18e208630a730679958f4',1,'gdswzd_mod::gdswzd_2d_array_grib1()'],['../interfacegdswzd__mod_1_1gdswzd.html#a7c66a7ede2b644f7e366df9f70b9f0a5',1,'gdswzd_mod::gdswzd::gdswzd_2d_array_grib1()']]], + ['gdswzd_5fc_554',['gdswzd_c',['../namespacegdswzd__c__mod.html#ae3026381f7f41561507c97c9125d24e4',1,'gdswzd_c_mod']]], + ['gdswzd_5fc_5fgrib1_555',['gdswzd_c_grib1',['../namespacegdswzd__c__mod.html#a06861f1403edf106bb3b399c39981504',1,'gdswzd_c_mod']]], + ['gdswzd_5fequid_5fcylind_556',['gdswzd_equid_cylind',['../namespaceip__equid__cylind__grid__mod.html#af20f6f308b5a33211c677b894e41b727',1,'ip_equid_cylind_grid_mod']]], + ['gdswzd_5fgaussian_557',['gdswzd_gaussian',['../namespaceip__gaussian__grid__mod.html#a6eefd9270b3f9bb2c59a77bea4ecf1b9',1,'ip_gaussian_grid_mod']]], + ['gdswzd_5fgrib1_558',['gdswzd_grib1',['../interfacegdswzd__mod_1_1gdswzd.html#a65b95791813ffd5afbfba9d4cb67676a',1,'gdswzd_mod::gdswzd::gdswzd_grib1()'],['../namespacegdswzd__mod.html#a133e040fac8dd56e607b8e3fb6a58c37',1,'gdswzd_mod::gdswzd_grib1()'],['../iplib__4_8h.html#a7f2f96041c0d42926e14cb0f40f336e1',1,'gdswzd_grib1(int *kgds, int iopt, int npts, float fill, float *xpts, float *ypts, float *rlon, float *rlat, int *nret, float *crot, float *srot, float *xlon, float *xlat, float *ylon, float *ylat, float *area): iplib_4.h'],['../iplib__8_8h.html#ab8e46b623c66911913f66d314c15cc93',1,'gdswzd_grib1(long *kgds, long iopt, long npts, double fill, double *xpts, double *ypts, double *rlon, double *rlat, long *nret, double *crot, double *srot, double *xlon, double *xlat, double *ylon, double *ylat, double *area): iplib_8.h'],['../iplib__d_8h.html#ac33340cba2ac7b42dd9b9116fc28d691',1,'gdswzd_grib1(int *kgds, int iopt, int npts, double fill, double *xpts, double *ypts, double *rlon, double *rlat, int *nret, double *crot, double *srot, double *xlon, double *xlat, double *ylon, double *ylat, double *area): iplib_d.h']]], + ['gdswzd_5fgrid_559',['gdswzd_grid',['../namespacegdswzd__mod.html#a584d2bddbc6d857b80cfac5e3b288d45',1,'gdswzd_mod::gdswzd_grid()'],['../interfacegdswzd__mod_1_1gdswzd.html#abfe059339c6c9f05fd4eadb5d70aec16',1,'gdswzd_mod::gdswzd::gdswzd_grid()']]], + ['gdswzd_5finterface_560',['gdswzd_interface',['../interfaceip__grid__mod_1_1gdswzd__interface.html#af34c5d9da54a36322bb1a141217c6369',1,'ip_grid_mod::gdswzd_interface']]], + ['gdswzd_5flambert_5fconf_561',['gdswzd_lambert_conf',['../namespaceip__lambert__conf__grid__mod.html#a5ebb9e4f1bd58caa254771b305c94f71',1,'ip_lambert_conf_grid_mod']]], + ['gdswzd_5fmercator_562',['gdswzd_mercator',['../namespaceip__mercator__grid__mod.html#acc39017fa51125972ab8e755e16d339e',1,'ip_mercator_grid_mod']]], + ['gdswzd_5fpolar_5fstereo_563',['gdswzd_polar_stereo',['../namespaceip__polar__stereo__grid__mod.html#ae2694d90ab514a131e083dfba3b173c5',1,'ip_polar_stereo_grid_mod']]], + ['gdswzd_5frot_5fequid_5fcylind_564',['gdswzd_rot_equid_cylind',['../namespaceip__rot__equid__cylind__grid__mod.html#a55c153201e15205d3f75e4ffb717cc0b',1,'ip_rot_equid_cylind_grid_mod']]], + ['gdswzd_5frot_5fequid_5fcylind_5fegrid_565',['gdswzd_rot_equid_cylind_egrid',['../namespaceip__rot__equid__cylind__egrid__mod.html#a9ad11a599fc0bdc4a9ece86a3b1cc399',1,'ip_rot_equid_cylind_egrid_mod']]], + ['gdswzd_5fscalar_566',['gdswzd_scalar',['../interfacegdswzd__mod_1_1gdswzd.html#a1fc841ec08d39463b3f5f36eac0068cd',1,'gdswzd_mod::gdswzd::gdswzd_scalar()'],['../namespacegdswzd__mod.html#aba3235c5bc5797e72b9a6a8a587b8861',1,'gdswzd_mod::gdswzd_scalar()']]], + ['gdswzd_5fstation_5fpoints_567',['gdswzd_station_points',['../namespaceip__station__points__grid__mod.html#a8da297b45242279a497dbd7062a33197',1,'ip_station_points_grid_mod']]] +]; diff --git a/search/functions_5.html b/ver-5.1.0/search/functions_5.html similarity index 100% rename from search/functions_5.html rename to ver-5.1.0/search/functions_5.html diff --git a/ver-5.1.0/search/functions_5.js b/ver-5.1.0/search/functions_5.js new file mode 100644 index 00000000..1a96bb09 --- /dev/null +++ b/ver-5.1.0/search/functions_5.js @@ -0,0 +1,44 @@ +var searchData= +[ + ['init_568',['init',['../structip__grid__mod_1_1ip__grid.html#a1f3fa40acb8c2ae4a65c00db21872d7c',1,'ip_grid_mod::ip_grid']]], + ['init_5fgrib1_569',['init_grib1',['../structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a68fb7543888cc76885560709184e7d70',1,'ip_equid_cylind_grid_mod::ip_equid_cylind_grid::init_grib1()'],['../namespaceip__station__points__grid__mod.html#a4b28ebf2b4fe826c96af69db28e0a1ff',1,'ip_station_points_grid_mod::init_grib1()'],['../namespaceip__rot__equid__cylind__grid__mod.html#acb27dfdc6f03dea897d509910365afee',1,'ip_rot_equid_cylind_grid_mod::init_grib1()'],['../namespaceip__rot__equid__cylind__egrid__mod.html#aa65616b97df9c89893161ff802e16eab',1,'ip_rot_equid_cylind_egrid_mod::init_grib1()'],['../namespaceip__polar__stereo__grid__mod.html#a6ed76f58f30993cd7be84b7e03cf4d6f',1,'ip_polar_stereo_grid_mod::init_grib1()'],['../namespaceip__mercator__grid__mod.html#a4125dba8b09e9b69933e224b00f4758d',1,'ip_mercator_grid_mod::init_grib1()'],['../namespaceip__lambert__conf__grid__mod.html#a5544708e893ffcfbe7d958fdec700eea',1,'ip_lambert_conf_grid_mod::init_grib1()'],['../namespaceip__gaussian__grid__mod.html#a8fe2ee732a3a2db4891a6431787a0b01',1,'ip_gaussian_grid_mod::init_grib1()'],['../namespaceip__equid__cylind__grid__mod.html#a3d0132823d27b60835ebb59ead173477',1,'ip_equid_cylind_grid_mod::init_grib1()'],['../structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#afd3658924783d5dbbd3fe5f07d5b60a7',1,'ip_gaussian_grid_mod::ip_gaussian_grid::init_grib1()'],['../structip__grid__mod_1_1ip__grid.html#a5a2c16279eb73a0c54ae0a1586d5b806',1,'ip_grid_mod::ip_grid::init_grib1()'],['../structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a35dd86b4a9017f5b03a0a6a01eb4d370',1,'ip_lambert_conf_grid_mod::ip_lambert_conf_grid::init_grib1()'],['../structip__mercator__grid__mod_1_1ip__mercator__grid.html#a3ae3bbb47f4c03c36404a2b35014d65c',1,'ip_mercator_grid_mod::ip_mercator_grid::init_grib1()'],['../structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#ae2a5a7c08e4578f3d0ff6b85e5a14cce',1,'ip_polar_stereo_grid_mod::ip_polar_stereo_grid::init_grib1()'],['../structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#ab9a85830bfd06183a8df73726f62217a',1,'ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::init_grib1()'],['../structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a9942c787bda2e118f1355476670edfca',1,'ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::init_grib1()'],['../structip__station__points__grid__mod_1_1ip__station__points__grid.html#aa5ec2cbc9bf0dadf20a226e0afeb3d32',1,'ip_station_points_grid_mod::ip_station_points_grid::init_grib1()']]], + ['init_5fgrib1_5fdescriptor_570',['init_grib1_descriptor',['../interfaceip__grid__descriptor__mod_1_1init__descriptor.html#a3b5b267aa7a17a4615dcc0cb4e590f6e',1,'ip_grid_descriptor_mod::init_descriptor::init_grib1_descriptor()'],['../namespaceip__grid__descriptor__mod.html#aa00884a7fca018535eaf0c2ebe26bc98',1,'ip_grid_descriptor_mod::init_grib1_descriptor()']]], + ['init_5fgrib1_5finterface_571',['init_grib1_interface',['../interfaceip__grid__mod_1_1init__grib1__interface.html#a47e255b76f02fe58a1aebdadcc5894eb',1,'ip_grid_mod::init_grib1_interface']]], + ['init_5fgrib2_572',['init_grib2',['../namespaceip__gaussian__grid__mod.html#ae048ac033628515113b11b8c7364e0c2',1,'ip_gaussian_grid_mod::init_grib2()'],['../structip__station__points__grid__mod_1_1ip__station__points__grid.html#a69fac68e7a40d5c3106a47bf1851891e',1,'ip_station_points_grid_mod::ip_station_points_grid::init_grib2()'],['../structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a30ae580d169972e8d68c3d97ab3b2634',1,'ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::init_grib2()'],['../structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#adda32463a76ad97ac35b01f1ac693fa4',1,'ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::init_grib2()'],['../structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a9622ce9892084b52303f27722572b87c',1,'ip_polar_stereo_grid_mod::ip_polar_stereo_grid::init_grib2()'],['../structip__mercator__grid__mod_1_1ip__mercator__grid.html#a505b0114c7ff5fbb58c4e7ce5ccde3f0',1,'ip_mercator_grid_mod::ip_mercator_grid::init_grib2()'],['../structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a64129413df8ea478ab1360fd1a274e9a',1,'ip_lambert_conf_grid_mod::ip_lambert_conf_grid::init_grib2()'],['../structip__grid__mod_1_1ip__grid.html#ad13e0ad8d616e1839ced388826fefee9',1,'ip_grid_mod::ip_grid::init_grib2()'],['../structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a378b72a1b6090acb90a36385ab9eda5a',1,'ip_gaussian_grid_mod::ip_gaussian_grid::init_grib2()'],['../structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a8dd212953e754964770fa1c3d4bcd3db',1,'ip_equid_cylind_grid_mod::ip_equid_cylind_grid::init_grib2()'],['../namespaceip__equid__cylind__grid__mod.html#a39d24c9468ecb7effd16972fd72e088a',1,'ip_equid_cylind_grid_mod::init_grib2()'],['../namespaceip__lambert__conf__grid__mod.html#acb0339a9fff4fff6c2017d37f8bed0cf',1,'ip_lambert_conf_grid_mod::init_grib2()'],['../namespaceip__mercator__grid__mod.html#aad3b6fef6ee74b8df984c0159ff29c82',1,'ip_mercator_grid_mod::init_grib2()'],['../namespaceip__polar__stereo__grid__mod.html#a5210b986366b503683ae966519d501e7',1,'ip_polar_stereo_grid_mod::init_grib2()'],['../namespaceip__rot__equid__cylind__egrid__mod.html#af3cbc17f27800bc67135feacb2c1c3e0',1,'ip_rot_equid_cylind_egrid_mod::init_grib2()'],['../namespaceip__rot__equid__cylind__grid__mod.html#add3c6c1dad5748b452d291df6619867d',1,'ip_rot_equid_cylind_grid_mod::init_grib2()'],['../namespaceip__station__points__grid__mod.html#ad17e6d245295803b62b146be984f874d',1,'ip_station_points_grid_mod::init_grib2()']]], + ['init_5fgrib2_5fdefault_573',['init_grib2_default',['../namespaceip__rot__equid__cylind__grid__mod.html#a9ade5de892a935c3b62c1860b719ce74',1,'ip_rot_equid_cylind_grid_mod']]], + ['init_5fgrib2_5fdescriptor_574',['init_grib2_descriptor',['../namespaceip__grid__descriptor__mod.html#a143ac06a2a20697d01606a259213b451',1,'ip_grid_descriptor_mod::init_grib2_descriptor()'],['../interfaceip__grid__descriptor__mod_1_1init__descriptor.html#a6702c4bf3a3d914e5cd2fce8fba4f95c',1,'ip_grid_descriptor_mod::init_descriptor::init_grib2_descriptor()']]], + ['init_5fgrib2_5finterface_575',['init_grib2_interface',['../interfaceip__grid__mod_1_1init__grib2__interface.html#a25dcec4470effb9b20dfc7981c21ec6c',1,'ip_grid_mod::init_grib2_interface']]], + ['init_5fgrib2_5fncep_5fpost_576',['init_grib2_ncep_post',['../namespaceip__rot__equid__cylind__grid__mod.html#a74abf723e815f9ff196e6d0174fd449b',1,'ip_rot_equid_cylind_grid_mod']]], + ['init_5fgrid_5fgeneric_577',['init_grid_generic',['../namespaceip__grid__factory__mod.html#a2d2ea07d353bae8b057471aa99b58e46',1,'ip_grid_factory_mod::init_grid_generic()'],['../interfaceip__grid__factory__mod_1_1init__grid.html#a3fbbec3ddc7dfd918c2abc02e7a4cd72',1,'ip_grid_factory_mod::init_grid::init_grid_generic()']]], + ['init_5fgrid_5fgrib1_578',['init_grid_grib1',['../namespaceip__grid__factory__mod.html#ad8906ed6fe52c2426c0ff09ce50b6fc5',1,'ip_grid_factory_mod']]], + ['init_5fgrid_5fgrib2_579',['init_grid_grib2',['../namespaceip__grid__factory__mod.html#aa187dc8dbd1d004a51cc0e9826ffa225',1,'ip_grid_factory_mod']]], + ['interpolate_5fbicubic_5fscalar_580',['interpolate_bicubic_scalar',['../namespacebicubic__interp__mod.html#a54a442e47f1be9511c1684a337d7e2d1',1,'bicubic_interp_mod::interpolate_bicubic_scalar()'],['../interfacebicubic__interp__mod_1_1interpolate__bicubic.html#acbfecc99184cf9ae71b2c9f79c7d4077',1,'bicubic_interp_mod::interpolate_bicubic::interpolate_bicubic_scalar()']]], + ['interpolate_5fbicubic_5fvector_581',['interpolate_bicubic_vector',['../namespacebicubic__interp__mod.html#a9d27db7d350fc2699aaf5057c3b53d16',1,'bicubic_interp_mod::interpolate_bicubic_vector()'],['../interfacebicubic__interp__mod_1_1interpolate__bicubic.html#aac45c15e1c9d76158d72e62ccaca915b',1,'bicubic_interp_mod::interpolate_bicubic::interpolate_bicubic_vector()']]], + ['interpolate_5fbilinear_5fscalar_582',['interpolate_bilinear_scalar',['../namespacebilinear__interp__mod.html#a34d2eea4682104097dccf3e7ab6a9398',1,'bilinear_interp_mod::interpolate_bilinear_scalar()'],['../interfacebilinear__interp__mod_1_1interpolate__bilinear.html#a3493cf5bc04aa4551ffd4c314ef09a65',1,'bilinear_interp_mod::interpolate_bilinear::interpolate_bilinear_scalar()']]], + ['interpolate_5fbilinear_5fvector_583',['interpolate_bilinear_vector',['../namespacebilinear__interp__mod.html#abc218f8774d2af09299eb299d6f38e04',1,'bilinear_interp_mod::interpolate_bilinear_vector()'],['../interfacebilinear__interp__mod_1_1interpolate__bilinear.html#ab4692c5250b37325f764b38c570892dd',1,'bilinear_interp_mod::interpolate_bilinear::interpolate_bilinear_vector()']]], + ['interpolate_5fbudget_5fscalar_584',['interpolate_budget_scalar',['../interfacebudget__interp__mod_1_1interpolate__budget.html#a4b96cbeedb86ef43b687f7ea55914ef0',1,'budget_interp_mod::interpolate_budget::interpolate_budget_scalar()'],['../namespacebudget__interp__mod.html#a09bd6535b0c2e1022cfde39c39d14466',1,'budget_interp_mod::interpolate_budget_scalar()']]], + ['interpolate_5fbudget_5fvector_585',['interpolate_budget_vector',['../interfacebudget__interp__mod_1_1interpolate__budget.html#a573e89e56381d0f69e4022d791a087e6',1,'budget_interp_mod::interpolate_budget::interpolate_budget_vector()'],['../namespacebudget__interp__mod.html#abc99486ee9c0091c1514af6114d4e803',1,'budget_interp_mod::interpolate_budget_vector()']]], + ['interpolate_5fneighbor_5fbudget_5fscalar_586',['interpolate_neighbor_budget_scalar',['../interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget.html#a96e4b145a4df6f4948b1d5ae2da6a71a',1,'neighbor_budget_interp_mod::interpolate_neighbor_budget::interpolate_neighbor_budget_scalar()'],['../namespaceneighbor__budget__interp__mod.html#a6d5110a9e9facf8c3132ec27d6857817',1,'neighbor_budget_interp_mod::interpolate_neighbor_budget_scalar()']]], + ['interpolate_5fneighbor_5fbudget_5fvector_587',['interpolate_neighbor_budget_vector',['../interfaceneighbor__budget__interp__mod_1_1interpolate__neighbor__budget.html#a573bd5ac43484aa6d051e58f37ff7c06',1,'neighbor_budget_interp_mod::interpolate_neighbor_budget::interpolate_neighbor_budget_vector()'],['../namespaceneighbor__budget__interp__mod.html#a4309c1e6b7fc60ded40657fe6c72297e',1,'neighbor_budget_interp_mod::interpolate_neighbor_budget_vector()']]], + ['interpolate_5fneighbor_5fscalar_588',['interpolate_neighbor_scalar',['../interfaceneighbor__interp__mod_1_1interpolate__neighbor.html#a04ebb54535e67ff95c1d3d64b9cf6246',1,'neighbor_interp_mod::interpolate_neighbor::interpolate_neighbor_scalar()'],['../namespaceneighbor__interp__mod.html#a78452d1527c6974ad54091f0318e4b1f',1,'neighbor_interp_mod::interpolate_neighbor_scalar()']]], + ['interpolate_5fneighbor_5fvector_589',['interpolate_neighbor_vector',['../interfaceneighbor__interp__mod_1_1interpolate__neighbor.html#a4662245e2744fd14628b48f23bf4f0a7',1,'neighbor_interp_mod::interpolate_neighbor::interpolate_neighbor_vector()'],['../namespaceneighbor__interp__mod.html#a744ccffd8cd6c13d360e634db4851756',1,'neighbor_interp_mod::interpolate_neighbor_vector()']]], + ['interpolate_5fspectral_5fscalar_590',['interpolate_spectral_scalar',['../interfacespectral__interp__mod_1_1interpolate__spectral.html#a79f600a26ecf256a8a13cf4bdbaf2ab1',1,'spectral_interp_mod::interpolate_spectral::interpolate_spectral_scalar()'],['../namespacespectral__interp__mod.html#a438646d69e941def0ada00d5ca19f618',1,'spectral_interp_mod::interpolate_spectral_scalar()']]], + ['interpolate_5fspectral_5fvector_591',['interpolate_spectral_vector',['../interfacespectral__interp__mod_1_1interpolate__spectral.html#a9e939bbb3f7b214fee26c1e77764e487',1,'spectral_interp_mod::interpolate_spectral::interpolate_spectral_vector()'],['../namespacespectral__interp__mod.html#acb61ad529b7decc2a6ff58dd12fbadd0',1,'spectral_interp_mod::interpolate_spectral_vector()']]], + ['ipolates_5fgrib1_592',['ipolates_grib1',['../interfaceipolates__mod_1_1ipolates.html#a8ff62af694c759f29c332836ff66437b',1,'ipolates_mod::ipolates::ipolates_grib1()'],['../namespaceipolates__mod.html#acb5408cf5c3a0f50326edc183f9bd269',1,'ipolates_mod::ipolates_grib1()']]], + ['ipolates_5fgrib1_5fsingle_5ffield_593',['ipolates_grib1_single_field',['../interfaceipolates__mod_1_1ipolates.html#afbc36431f96adfbbf552bc6137d0519d',1,'ipolates_mod::ipolates::ipolates_grib1_single_field()'],['../namespaceipolates__mod.html#ae70a9ca9871bb33e038782b036b7b53d',1,'ipolates_mod::ipolates_grib1_single_field()']]], + ['ipolates_5fgrib2_594',['ipolates_grib2',['../interfaceipolates__mod_1_1ipolates.html#a791ae0a257adcc3a789494489e28302b',1,'ipolates_mod::ipolates::ipolates_grib2()'],['../namespaceipolates__mod.html#a6b2ea6d5b04d2a68baad261e7a409fac',1,'ipolates_mod::ipolates_grib2(IP, IPOPT, IGDTNUMI, IGDTMPLI, IGDTLENI, IGDTNUMO, IGDTMPLO, IGDTLENO, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)']]], + ['ipolates_5fgrib2_5fsingle_5ffield_595',['ipolates_grib2_single_field',['../namespaceipolates__mod.html#a49541b2af75b7c037a863a4785726856',1,'ipolates_mod::ipolates_grib2_single_field()'],['../interfaceipolates__mod_1_1ipolates.html#a3a77b7de2dce406829a3b01689372240',1,'ipolates_mod::ipolates::ipolates_grib2_single_field()']]], + ['ipolates_5fgrid_596',['ipolates_grid',['../namespaceipolates__mod.html#a2761e20fab898e7fd9963f3e0eb5d104',1,'ipolates_mod']]], + ['ipolatev_5fgrib1_597',['ipolatev_grib1',['../interfaceipolatev__mod_1_1ipolatev.html#ac721867d3d8e8adc11d56baba4702d53',1,'ipolatev_mod::ipolatev::ipolatev_grib1()'],['../namespaceipolatev__mod.html#abddc4a9b00133b358443b118f1352d1f',1,'ipolatev_mod::ipolatev_grib1()']]], + ['ipolatev_5fgrib1_5fsingle_5ffield_598',['ipolatev_grib1_single_field',['../interfaceipolatev__mod_1_1ipolatev.html#ad211b25631afd3fd7c04bbfba589a7c5',1,'ipolatev_mod::ipolatev::ipolatev_grib1_single_field()'],['../namespaceipolatev__mod.html#ad535ffd159c46e770effd774aabede58',1,'ipolatev_mod::ipolatev_grib1_single_field(ip, ipopt, kgdsi, kgdso, mi, mo, km, ibi, li, ui, vi, no, rlat, rlon, crot, srot, ibo, lo, uo, vo, iret)']]], + ['ipolatev_5fgrib2_599',['ipolatev_grib2',['../namespaceipolatev__mod.html#a00fed53dd867a802b3adbc1141e8d272',1,'ipolatev_mod::ipolatev_grib2()'],['../interfaceipolatev__mod_1_1ipolatev.html#ac1ec04e3119f285f0f3955f016926efe',1,'ipolatev_mod::ipolatev::ipolatev_grib2()']]], + ['ipolatev_5fgrib2_5fsingle_5ffield_600',['ipolatev_grib2_single_field',['../namespaceipolatev__mod.html#a71d7507e8f89e1229caaaacb37e0c9c7',1,'ipolatev_mod::ipolatev_grib2_single_field()'],['../interfaceipolatev__mod_1_1ipolatev.html#aa0af88a9ccef79a921680fe40ec30ccd',1,'ipolatev_mod::ipolatev::ipolatev_grib2_single_field()']]], + ['ipolatev_5fgrid_601',['ipolatev_grid',['../namespaceipolatev__mod.html#a8f3bfec7495e13b75b2035e8e1f081a1',1,'ipolatev_mod']]], + ['ipxetas_602',['ipxetas',['../ipxetas_8F90.html#a89ff34ee39b0da1895e9d8552bb462e1',1,'ipxetas.F90']]], + ['ipxwafs_603',['ipxwafs',['../ipxwafs_8F90.html#a1465ea191950f7464bb3374abed94c12',1,'ipxwafs.F90']]], + ['ipxwafs2_604',['ipxwafs2',['../ipxwafs2_8F90.html#ab602c9c04957836c0b8860560d442894',1,'ipxwafs2.F90']]], + ['ipxwafs3_605',['ipxwafs3',['../ipxwafs3_8F90.html#aae7be3c77cbe16d0219c86e443e6ec1d',1,'ipxwafs3.F90']]], + ['is_5fsame_5fgrid_606',['is_same_grid',['../interfaceip__grid__mod_1_1operator_07_0a_0a_08.html#a0303cd13db74e096af7f77200ef09c6b',1,'ip_grid_mod::operator(==)::is_same_grid()'],['../interfaceip__grid__descriptor__mod_1_1operator_07_0a_0a_08.html#a34e94f8aada186a3d22112a1ab31b53c',1,'ip_grid_descriptor_mod::operator(==)::is_same_grid()'],['../structip__grid__descriptor__mod_1_1ip__grid__descriptor.html#a9da102dac348a63ffce6556ed5da81b6',1,'ip_grid_descriptor_mod::ip_grid_descriptor::is_same_grid()'],['../namespaceip__grid__descriptor__mod.html#a202219f9c5c84fa04d3eb1c2208358ec',1,'ip_grid_descriptor_mod::is_same_grid()'],['../namespaceip__grid__mod.html#a663bda9af9dd991a09ba0f0de66dc045',1,'ip_grid_mod::is_same_grid()']]], + ['is_5fsame_5fgrid_5fgrib1_607',['is_same_grid_grib1',['../structip__grid__descriptor__mod_1_1grib1__descriptor.html#a33b4fc04d218c73e3c4d061163dcbc95',1,'ip_grid_descriptor_mod::grib1_descriptor::is_same_grid_grib1()'],['../namespaceip__grid__descriptor__mod.html#a5bb3c5230b88012bddc3922bfa1cb019',1,'ip_grid_descriptor_mod::is_same_grid_grib1()']]], + ['is_5fsame_5fgrid_5fgrib2_608',['is_same_grid_grib2',['../structip__grid__descriptor__mod_1_1grib2__descriptor.html#ae27b09a835144baf782e2cde0c1ea013',1,'ip_grid_descriptor_mod::grib2_descriptor::is_same_grid_grib2()'],['../namespaceip__grid__descriptor__mod.html#a75ac34ea9372afaa29b0df2ce8919988',1,'ip_grid_descriptor_mod::is_same_grid_grib2()']]] +]; diff --git a/search/functions_6.html b/ver-5.1.0/search/functions_6.html similarity index 100% rename from search/functions_6.html rename to ver-5.1.0/search/functions_6.html diff --git a/ver-5.1.0/search/functions_6.js b/ver-5.1.0/search/functions_6.js new file mode 100644 index 00000000..4a5c2917 --- /dev/null +++ b/ver-5.1.0/search/functions_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['lambert_5fconf_5fgrid_5farea_609',['lambert_conf_grid_area',['../namespaceip__lambert__conf__grid__mod.html#a15c44b47172b926aea840caee9723b1c',1,'ip_lambert_conf_grid_mod']]], + ['lambert_5fconf_5fmap_5fjacob_610',['lambert_conf_map_jacob',['../namespaceip__lambert__conf__grid__mod.html#a5e1d42f0027236f47467e25c525e66ae',1,'ip_lambert_conf_grid_mod']]], + ['lambert_5fconf_5fvect_5frot_611',['lambert_conf_vect_rot',['../namespaceip__lambert__conf__grid__mod.html#a58187073914efa18eca897c6ec203b71',1,'ip_lambert_conf_grid_mod']]] +]; diff --git a/search/functions_7.html b/ver-5.1.0/search/functions_7.html similarity index 100% rename from search/functions_7.html rename to ver-5.1.0/search/functions_7.html diff --git a/ver-5.1.0/search/functions_7.js b/ver-5.1.0/search/functions_7.js new file mode 100644 index 00000000..7a582e96 --- /dev/null +++ b/ver-5.1.0/search/functions_7.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['mercator_5fgrid_5farea_612',['mercator_grid_area',['../namespaceip__mercator__grid__mod.html#a952ab9add18587c4dbe54699feb8eafd',1,'ip_mercator_grid_mod']]], + ['mercator_5fmap_5fjacob_613',['mercator_map_jacob',['../namespaceip__mercator__grid__mod.html#ab93a0a6ae8c5f5056abece1dcffdc57a',1,'ip_mercator_grid_mod']]], + ['mercator_5fvect_5frot_614',['mercator_vect_rot',['../namespaceip__mercator__grid__mod.html#aea5e18faf7a18bf8d06c87ccb11f3e17',1,'ip_mercator_grid_mod']]], + ['movect_615',['movect',['../movect_8F90.html#a5974e32c0cf90a65b39c68460d761882',1,'movect.F90']]] +]; diff --git a/search/functions_8.html b/ver-5.1.0/search/functions_8.html similarity index 100% rename from search/functions_8.html rename to ver-5.1.0/search/functions_8.html diff --git a/ver-5.1.0/search/functions_8.js b/ver-5.1.0/search/functions_8.js new file mode 100644 index 00000000..3d1aaf28 --- /dev/null +++ b/ver-5.1.0/search/functions_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['ncpus_616',['ncpus',['../ncpus_8F.html#a821a75ee067ea31758a038c0327bd3bd',1,'ncpus.F']]] +]; diff --git a/search/functions_9.html b/ver-5.1.0/search/functions_9.html similarity index 100% rename from search/functions_9.html rename to ver-5.1.0/search/functions_9.html diff --git a/ver-5.1.0/search/functions_9.js b/ver-5.1.0/search/functions_9.js new file mode 100644 index 00000000..e17292a3 --- /dev/null +++ b/ver-5.1.0/search/functions_9.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['polar_5fstereo_5fgrid_5farea_617',['polar_stereo_grid_area',['../namespaceip__polar__stereo__grid__mod.html#a2a2e0854e5c129e320924a811cbd08e2',1,'ip_polar_stereo_grid_mod']]], + ['polar_5fstereo_5fmap_5fjacob_618',['polar_stereo_map_jacob',['../namespaceip__polar__stereo__grid__mod.html#a386933f7e52c348b9d742df423e0e223',1,'ip_polar_stereo_grid_mod']]], + ['polar_5fstereo_5fvect_5frot_619',['polar_stereo_vect_rot',['../namespaceip__polar__stereo__grid__mod.html#abe4d416201e986421a8e325a9b00e462',1,'ip_polar_stereo_grid_mod']]], + ['polates4_5fgrib1_620',['polates4_grib1',['../interfacespectral__interp__mod_1_1polates4.html#a0be1315db4dce899083176b47b6ea6a4',1,'spectral_interp_mod::polates4::polates4_grib1()'],['../namespacespectral__interp__mod.html#ab9fb87d87f2f9d578a5ade6b512ff366',1,'spectral_interp_mod::polates4_grib1()']]], + ['polates4_5fgrib2_621',['polates4_grib2',['../interfacespectral__interp__mod_1_1polates4.html#a3fdc75851f1f741e715a1c3e1e4d89c9',1,'spectral_interp_mod::polates4::polates4_grib2()'],['../namespacespectral__interp__mod.html#a54dfd0ea8368242a1053d64770bd295a',1,'spectral_interp_mod::polates4_grib2()']]], + ['polatev4_5fgrib1_622',['polatev4_grib1',['../interfacespectral__interp__mod_1_1polatev4.html#a5fa619eb983da3326380e9bafcf49ca8',1,'spectral_interp_mod::polatev4::polatev4_grib1()'],['../namespacespectral__interp__mod.html#af4ce7638750e787dd69c7fe3ff2335cc',1,'spectral_interp_mod::polatev4_grib1()']]], + ['polatev4_5fgrib2_623',['polatev4_grib2',['../interfacespectral__interp__mod_1_1polatev4.html#a9dcbaeb719e3872ad5ad461adde5c98b',1,'spectral_interp_mod::polatev4::polatev4_grib2()'],['../namespacespectral__interp__mod.html#a2f76e9900554d90753ca788c2ddf9ac3',1,'spectral_interp_mod::polatev4_grib2()']]], + ['polfixs_624',['polfixs',['../namespacepolfix__mod.html#a15df1ba2e1fcad1e9465c4aa3a2ba0d6',1,'polfix_mod']]], + ['polfixv_625',['polfixv',['../namespacepolfix__mod.html#aeefc8f045777f6d962d9ec539ef6007d',1,'polfix_mod']]] +]; diff --git a/search/functions_a.html b/ver-5.1.0/search/functions_a.html similarity index 100% rename from search/functions_a.html rename to ver-5.1.0/search/functions_a.html diff --git a/ver-5.1.0/search/functions_a.js b/ver-5.1.0/search/functions_a.js new file mode 100644 index 00000000..4d5292c3 --- /dev/null +++ b/ver-5.1.0/search/functions_a.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['radb2_626',['radb2',['../fftpack_8F.html#ae63abe3a02989ed4fbd60b50bc0c6dda',1,'fftpack.F']]], + ['radb3_627',['radb3',['../fftpack_8F.html#a6129001ac4cdf5d5a345edc2822d8014',1,'fftpack.F']]], + ['radb4_628',['radb4',['../fftpack_8F.html#a3b5aab129020968eaf92f2e6ca0785ef',1,'fftpack.F']]], + ['radb5_629',['radb5',['../fftpack_8F.html#a2b6492f922cbee03af5b89d52356abf1',1,'fftpack.F']]], + ['radbg_630',['radbg',['../fftpack_8F.html#af5a2521b66fece6cc768206c1df0d20b',1,'fftpack.F']]], + ['radf2_631',['radf2',['../fftpack_8F.html#a70e2420dd5bee9e41eb6c15bbad5eef6',1,'fftpack.F']]], + ['radf3_632',['radf3',['../fftpack_8F.html#a51374398f8edd5701987ce483c739592',1,'fftpack.F']]], + ['radf4_633',['radf4',['../fftpack_8F.html#ae9910ca606fd0cdb03b5b3b98533f486',1,'fftpack.F']]], + ['radf5_634',['radf5',['../fftpack_8F.html#a6d852c36924b038f77a24b8e22205add',1,'fftpack.F']]], + ['radfg_635',['radfg',['../fftpack_8F.html#ad5dbca6bb6ee7c0a86a1e140627de1b2',1,'fftpack.F']]], + ['rfftb_636',['rfftb',['../fftpack_8F.html#a79ba25d1f342858b0faa3c3e3585ec88',1,'fftpack.F']]], + ['rfftb1_637',['rfftb1',['../fftpack_8F.html#afa735c298a72dd1c13ab1c45e737c066',1,'fftpack.F']]], + ['rfftf_638',['rfftf',['../fftpack_8F.html#afbb5dc9c70ebe24759d5ffec1d3e42e2',1,'fftpack.F']]], + ['rfftf1_639',['rfftf1',['../fftpack_8F.html#acdf9efa42dc73f90af444ee0da649a09',1,'fftpack.F']]], + ['rffti_640',['rffti',['../fftpack_8F.html#a50f1237ff5990436609962c0eae406db',1,'fftpack.F']]], + ['rffti1_641',['rffti1',['../fftpack_8F.html#ae3569ef7a371390f6bf38417865ef71b',1,'fftpack.F']]], + ['rot_5fequid_5fcylind_5fegrid_5ferror_642',['rot_equid_cylind_egrid_error',['../namespaceip__rot__equid__cylind__egrid__mod.html#a69d4e473a1a276b855d37518dc6f1d48',1,'ip_rot_equid_cylind_egrid_mod']]], + ['rot_5fequid_5fcylind_5fegrid_5fgrid_5farea_643',['rot_equid_cylind_egrid_grid_area',['../namespaceip__rot__equid__cylind__egrid__mod.html#a4e6c3a758f9a6474d3e499fabeac0640',1,'ip_rot_equid_cylind_egrid_mod']]], + ['rot_5fequid_5fcylind_5fegrid_5fmap_5fjacob_644',['rot_equid_cylind_egrid_map_jacob',['../namespaceip__rot__equid__cylind__egrid__mod.html#a45b87f77888d428ca0f551edae8da94e',1,'ip_rot_equid_cylind_egrid_mod']]], + ['rot_5fequid_5fcylind_5fegrid_5fvect_5frot_645',['rot_equid_cylind_egrid_vect_rot',['../namespaceip__rot__equid__cylind__egrid__mod.html#a9ac1f76f515981c464e8391d8c941888',1,'ip_rot_equid_cylind_egrid_mod']]], + ['rot_5fequid_5fcylind_5ferror_646',['rot_equid_cylind_error',['../namespaceip__rot__equid__cylind__grid__mod.html#a1cc09c83f9a3815d8c5f8ed2f239f53f',1,'ip_rot_equid_cylind_grid_mod']]], + ['rot_5fequid_5fcylind_5fgrid_5farea_647',['rot_equid_cylind_grid_area',['../namespaceip__rot__equid__cylind__grid__mod.html#ad8f1133eb6809705c15337134eafe9fd',1,'ip_rot_equid_cylind_grid_mod']]], + ['rot_5fequid_5fcylind_5fmap_5fjacob_648',['rot_equid_cylind_map_jacob',['../namespaceip__rot__equid__cylind__grid__mod.html#a985f1dc1a20444cef706d4bb20e0841b',1,'ip_rot_equid_cylind_grid_mod']]], + ['rot_5fequid_5fcylind_5fvect_5frot_649',['rot_equid_cylind_vect_rot',['../namespaceip__rot__equid__cylind__grid__mod.html#a3de472bfc18740a7d985f560f3541c10',1,'ip_rot_equid_cylind_grid_mod']]] +]; diff --git a/search/functions_b.html b/ver-5.1.0/search/functions_b.html similarity index 100% rename from search/functions_b.html rename to ver-5.1.0/search/functions_b.html diff --git a/ver-5.1.0/search/functions_b.js b/ver-5.1.0/search/functions_b.js new file mode 100644 index 00000000..9ddba113 --- /dev/null +++ b/ver-5.1.0/search/functions_b.js @@ -0,0 +1,58 @@ +var searchData= +[ + ['scfft_650',['scfft',['../fftpack_8F.html#a369071ea2d380c9d91ba36d1bf375e33',1,'fftpack.F']]], + ['scrft_651',['scrft',['../fftpack_8F.html#ac69cbd64be972c20a4424f5327fb4b36',1,'fftpack.F']]], + ['spanaly_652',['spanaly',['../spanaly_8f.html#a5cc846d796d393d7499cde0f3d1d6e6a',1,'spanaly.f']]], + ['spdz2uv_653',['spdz2uv',['../spdz2uv_8f.html#ae3a4a74c49f78a25425b610743dc0692',1,'spdz2uv.f']]], + ['speps_654',['speps',['../speps_8f.html#a0ab523ec5e1393ffca970897e63a9131',1,'speps.f']]], + ['spfft_655',['spfft',['../spfft_8f.html#a1041af8ac4f6a2407b5b7a799a13fb5d',1,'spfft.f']]], + ['spfft1_656',['spfft1',['../spfft1_8f.html#ac63643472eda83948c0b249b611346d6',1,'spfft1.f']]], + ['spffte_657',['spffte',['../spffte_8f.html#af06489254bd3e99030b39744fce32233',1,'spffte.f']]], + ['spfftpt_658',['spfftpt',['../spfftpt_8f.html#ad16e674ce87bd762a714853967f81356',1,'spfftpt.f']]], + ['spgradq_659',['spgradq',['../spgradq_8f.html#a0bb358cf2a405ce9f17c6e5dfde65849',1,'spgradq.f']]], + ['spgradx_660',['spgradx',['../spgradx_8f.html#a749bc07e763e9cd44490fff2284d00b4',1,'spgradx.f']]], + ['spgrady_661',['spgrady',['../spgrady_8f.html#a1b3e38e56560de7d7dcf19ea3e931cf1',1,'spgrady.f']]], + ['splaplac_662',['splaplac',['../splaplac_8f.html#a64338955857a3cf58283146940e7ae42',1,'splaplac.f']]], + ['splat_663',['splat',['../splat_8F.html#aa6db21451bb67635e7e4426546140e11',1,'splat.F']]], + ['splegend_664',['splegend',['../splegend_8f.html#a9c68adc80e97c43ac983b955dd6cabac',1,'splegend.f']]], + ['sppad_665',['sppad',['../sppad_8f.html#a4338b3ccd7844251bbdabf3da1d6476e',1,'sppad.f']]], + ['spsynth_666',['spsynth',['../spsynth_8f.html#aa6a8113a459918728c876673520126bf',1,'spsynth.f']]], + ['sptez_667',['sptez',['../sptez_8f.html#a418a7d182834b2e2dafae2fe881ba9fc',1,'sptez.f']]], + ['sptezd_668',['sptezd',['../sptezd_8f.html#a6c30b52dcb4da9e403eeeb307b9516d7',1,'sptezd.f']]], + ['sptezm_669',['sptezm',['../sptezm_8f.html#a1430a0df2cba7eefaf67c939684be2d1',1,'sptezm.f']]], + ['sptezmd_670',['sptezmd',['../sptezmd_8f.html#a2b9ead06893e51604bfb18928ddee996',1,'sptezmd.f']]], + ['sptezmv_671',['sptezmv',['../sptezmv_8f.html#a22dc4fc10c5225ec8d3c12ed3cb4786e',1,'sptezmv.f']]], + ['sptezv_672',['sptezv',['../sptezv_8f.html#a83e49d961c40a2621c3f2afe70846226',1,'sptezv.f']]], + ['sptgpm_673',['sptgpm',['../sptgpm_8f.html#a6cffaeaa602eaae5c03166f48065158d',1,'sptgpm.f']]], + ['sptgpmd_674',['sptgpmd',['../sptgpmd_8f.html#af71718c75a2b24b74fa7e1e4318d0539',1,'sptgpmd.f']]], + ['sptgpmv_675',['sptgpmv',['../sptgpmv_8f.html#a15de3accfd448d116324872c8fb1bb17',1,'sptgpmv.f']]], + ['sptgps_676',['sptgps',['../sptgps_8f.html#af06a2dccfa311014fc9f671b14f247b2',1,'sptgps.f']]], + ['sptgpsd_677',['sptgpsd',['../sptgpsd_8f.html#ad6d10c3360c47558a8116b2f5666ed30',1,'sptgpsd.f']]], + ['sptgpsv_678',['sptgpsv',['../sptgpsv_8f.html#af2bf2335047ec277730564dbfa859079',1,'sptgpsv.f']]], + ['sptgpt_679',['sptgpt',['../sptgpt_8f.html#a1b8d333bcc601e5b7e8d3dd1369f54b1',1,'sptgpt.f']]], + ['sptgptd_680',['sptgptd',['../sptgptd_8f.html#a64d1fe761662182ca3495531152d1cd3',1,'sptgptd.f']]], + ['sptgptsd_681',['sptgptsd',['../sptgptsd_8f.html#ad3ab15089a57b493cc74443ea3b3d88f',1,'sptgptsd.f']]], + ['sptgptv_682',['sptgptv',['../sptgptv_8f.html#a9af8a22564d132a887a5237f30710f13',1,'sptgptv.f']]], + ['sptgptvd_683',['sptgptvd',['../sptgptvd_8f.html#ae03c6c76cad685ae1ed32d74bcba6753',1,'sptgptvd.f']]], + ['sptran_684',['sptran',['../sptran_8f.html#af7610e42f0dcd199b8cf80f851dcfed0',1,'sptran.f']]], + ['sptrand_685',['sptrand',['../sptrand_8f.html#ae810abad32bcbdfb8345a30e50bcc1ef',1,'sptrand.f']]], + ['sptranf_686',['sptranf',['../sptranf_8f.html#acf086b5141203e48bdb7250441a16c8c',1,'sptranf.f']]], + ['sptranf0_687',['sptranf0',['../sptranf0_8f.html#aaf9f9002ccd7074dc04dbc40a5aad9f0',1,'sptranf0.f']]], + ['sptranf1_688',['sptranf1',['../sptranf1_8f.html#ad7cec2fd6729ca84b1fac3436f9730e6',1,'sptranf1.f']]], + ['sptranfv_689',['sptranfv',['../sptranfv_8f.html#a1a7aabbd358d4fe984dac6813c98b106',1,'sptranfv.f']]], + ['sptranv_690',['sptranv',['../sptranv_8f.html#a7d6aaa3ed70df1dfaf8dd4443b7190c1',1,'sptranv.f']]], + ['sptrun_691',['sptrun',['../sptrun_8f.html#a1f04574fbd5018f73b68bd2cd0ffc473',1,'sptrun.f']]], + ['sptrund_692',['sptrund',['../sptrund_8f.html#a2636d99e658dfabd4b85f15a76fca480',1,'sptrund.f']]], + ['sptrung_693',['sptrung',['../sptrung_8f.html#af41b64dad4789617a315515ef885912c',1,'sptrung.f']]], + ['sptrungv_694',['sptrungv',['../sptrungv_8f.html#ab7bbe6ecde57394b15e5d4925cb07164',1,'sptrungv.f']]], + ['sptrunl_695',['sptrunl',['../sptrunl_8f.html#a52c4250d24e52304e49aa1d82a93bdb8',1,'sptrunl.f']]], + ['sptrunm_696',['sptrunm',['../sptrunm_8f.html#a2a4e579890d3cf7f6a26091f544b6cb6',1,'sptrunm.f']]], + ['sptrunmv_697',['sptrunmv',['../sptrunmv_8f.html#a8b405d0621112d6852a3bb99602ac2fd',1,'sptrunmv.f']]], + ['sptruns_698',['sptruns',['../sptruns_8f.html#a34f156e2049105d012e445f8aa215444',1,'sptruns.f']]], + ['sptrunsv_699',['sptrunsv',['../sptrunsv_8f.html#a1373b651b9dea586e33d3033aae68656',1,'sptrunsv.f']]], + ['sptrunv_700',['sptrunv',['../sptrunv_8f.html#a9aa39c13dd38585b3afb30cb2486817f',1,'sptrunv.f']]], + ['spuv2dz_701',['spuv2dz',['../spuv2dz_8f.html#a27edc2d10e0a76a45e4aaae58bf018b9',1,'spuv2dz.f']]], + ['spvar_702',['spvar',['../spvar_8f.html#a840f95e09b8d930b38638a391933bee4',1,'spvar.f']]], + ['spwget_703',['spwget',['../spwget_8f.html#a9b6ce78350f7adf2fed874a18312c7a6',1,'spwget.f']]], + ['srcft_704',['srcft',['../fftpack_8F.html#acf248c4f27a9fa81cffdfded50eee742',1,'fftpack.F']]] +]; diff --git a/search/functions_c.html b/ver-5.1.0/search/functions_c.html similarity index 100% rename from search/functions_c.html rename to ver-5.1.0/search/functions_c.html diff --git a/ver-5.1.0/search/functions_c.js b/ver-5.1.0/search/functions_c.js new file mode 100644 index 00000000..8074160f --- /dev/null +++ b/ver-5.1.0/search/functions_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['unuse_5fncep_5fpost_5farakawa_705',['unuse_ncep_post_arakawa',['../namespaceip__grid__mod.html#ac8e716adbe5c1156bfd20f936a4205de',1,'ip_grid_mod']]], + ['use_5fncep_5fpost_5farakawa_706',['use_ncep_post_arakawa',['../namespaceip__grid__mod.html#a1d570947cf124c28ba67305494bff450',1,'ip_grid_mod']]] +]; diff --git a/ver-5.1.0/search/mag_sel.svg b/ver-5.1.0/search/mag_sel.svg new file mode 100644 index 00000000..03626f64 --- /dev/null +++ b/ver-5.1.0/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/search/namespaces_0.html b/ver-5.1.0/search/namespaces_0.html similarity index 100% rename from search/namespaces_0.html rename to ver-5.1.0/search/namespaces_0.html diff --git a/ver-5.1.0/search/namespaces_0.js b/ver-5.1.0/search/namespaces_0.js new file mode 100644 index 00000000..9d67d19b --- /dev/null +++ b/ver-5.1.0/search/namespaces_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['bicubic_5finterp_5fmod_423',['bicubic_interp_mod',['../namespacebicubic__interp__mod.html',1,'']]], + ['bilinear_5finterp_5fmod_424',['bilinear_interp_mod',['../namespacebilinear__interp__mod.html',1,'']]], + ['budget_5finterp_5fmod_425',['budget_interp_mod',['../namespacebudget__interp__mod.html',1,'']]] +]; diff --git a/search/namespaces_1.html b/ver-5.1.0/search/namespaces_1.html similarity index 100% rename from search/namespaces_1.html rename to ver-5.1.0/search/namespaces_1.html diff --git a/ver-5.1.0/search/namespaces_1.js b/ver-5.1.0/search/namespaces_1.js new file mode 100644 index 00000000..e93bf1b4 --- /dev/null +++ b/ver-5.1.0/search/namespaces_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['earth_5fradius_5fmod_426',['earth_radius_mod',['../namespaceearth__radius__mod.html',1,'']]] +]; diff --git a/search/namespaces_2.html b/ver-5.1.0/search/namespaces_2.html similarity index 100% rename from search/namespaces_2.html rename to ver-5.1.0/search/namespaces_2.html diff --git a/ver-5.1.0/search/namespaces_2.js b/ver-5.1.0/search/namespaces_2.js new file mode 100644 index 00000000..223057b8 --- /dev/null +++ b/ver-5.1.0/search/namespaces_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['gdswzd_5fc_5fmod_427',['gdswzd_c_mod',['../namespacegdswzd__c__mod.html',1,'']]], + ['gdswzd_5fmod_428',['gdswzd_mod',['../namespacegdswzd__mod.html',1,'']]] +]; diff --git a/search/namespaces_3.html b/ver-5.1.0/search/namespaces_3.html similarity index 100% rename from search/namespaces_3.html rename to ver-5.1.0/search/namespaces_3.html diff --git a/ver-5.1.0/search/namespaces_3.js b/ver-5.1.0/search/namespaces_3.js new file mode 100644 index 00000000..5c573362 --- /dev/null +++ b/ver-5.1.0/search/namespaces_3.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['ip_5fconstants_5fmod_429',['ip_constants_mod',['../namespaceip__constants__mod.html',1,'']]], + ['ip_5fequid_5fcylind_5fgrid_5fmod_430',['ip_equid_cylind_grid_mod',['../namespaceip__equid__cylind__grid__mod.html',1,'']]], + ['ip_5fgaussian_5fgrid_5fmod_431',['ip_gaussian_grid_mod',['../namespaceip__gaussian__grid__mod.html',1,'']]], + ['ip_5fgrid_5fdescriptor_5fmod_432',['ip_grid_descriptor_mod',['../namespaceip__grid__descriptor__mod.html',1,'']]], + ['ip_5fgrid_5ffactory_5fmod_433',['ip_grid_factory_mod',['../namespaceip__grid__factory__mod.html',1,'']]], + ['ip_5fgrid_5fmod_434',['ip_grid_mod',['../namespaceip__grid__mod.html',1,'']]], + ['ip_5fgrids_5fmod_435',['ip_grids_mod',['../namespaceip__grids__mod.html',1,'']]], + ['ip_5finterpolators_5fmod_436',['ip_interpolators_mod',['../namespaceip__interpolators__mod.html',1,'']]], + ['ip_5flambert_5fconf_5fgrid_5fmod_437',['ip_lambert_conf_grid_mod',['../namespaceip__lambert__conf__grid__mod.html',1,'']]], + ['ip_5fmercator_5fgrid_5fmod_438',['ip_mercator_grid_mod',['../namespaceip__mercator__grid__mod.html',1,'']]], + ['ip_5fmod_439',['ip_mod',['../namespaceip__mod.html',1,'']]], + ['ip_5fpolar_5fstereo_5fgrid_5fmod_440',['ip_polar_stereo_grid_mod',['../namespaceip__polar__stereo__grid__mod.html',1,'']]], + ['ip_5frot_5fequid_5fcylind_5fegrid_5fmod_441',['ip_rot_equid_cylind_egrid_mod',['../namespaceip__rot__equid__cylind__egrid__mod.html',1,'']]], + ['ip_5frot_5fequid_5fcylind_5fgrid_5fmod_442',['ip_rot_equid_cylind_grid_mod',['../namespaceip__rot__equid__cylind__grid__mod.html',1,'']]], + ['ip_5fstation_5fpoints_5fgrid_5fmod_443',['ip_station_points_grid_mod',['../namespaceip__station__points__grid__mod.html',1,'']]], + ['ipolates_5fmod_444',['ipolates_mod',['../namespaceipolates__mod.html',1,'']]], + ['ipolatev_5fmod_445',['ipolatev_mod',['../namespaceipolatev__mod.html',1,'']]] +]; diff --git a/search/namespaces_4.html b/ver-5.1.0/search/namespaces_4.html similarity index 100% rename from search/namespaces_4.html rename to ver-5.1.0/search/namespaces_4.html diff --git a/ver-5.1.0/search/namespaces_4.js b/ver-5.1.0/search/namespaces_4.js new file mode 100644 index 00000000..32397ba0 --- /dev/null +++ b/ver-5.1.0/search/namespaces_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['neighbor_5fbudget_5finterp_5fmod_446',['neighbor_budget_interp_mod',['../namespaceneighbor__budget__interp__mod.html',1,'']]], + ['neighbor_5finterp_5fmod_447',['neighbor_interp_mod',['../namespaceneighbor__interp__mod.html',1,'']]] +]; diff --git a/search/namespaces_5.html b/ver-5.1.0/search/namespaces_5.html similarity index 100% rename from search/namespaces_5.html rename to ver-5.1.0/search/namespaces_5.html diff --git a/ver-5.1.0/search/namespaces_5.js b/ver-5.1.0/search/namespaces_5.js new file mode 100644 index 00000000..aac145d1 --- /dev/null +++ b/ver-5.1.0/search/namespaces_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['polfix_5fmod_448',['polfix_mod',['../namespacepolfix__mod.html',1,'']]] +]; diff --git a/search/namespaces_6.html b/ver-5.1.0/search/namespaces_6.html similarity index 100% rename from search/namespaces_6.html rename to ver-5.1.0/search/namespaces_6.html diff --git a/ver-5.1.0/search/namespaces_6.js b/ver-5.1.0/search/namespaces_6.js new file mode 100644 index 00000000..c1c66095 --- /dev/null +++ b/ver-5.1.0/search/namespaces_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['spectral_5finterp_5fmod_449',['spectral_interp_mod',['../namespacespectral__interp__mod.html',1,'']]] +]; diff --git a/search/nomatches.html b/ver-5.1.0/search/nomatches.html similarity index 100% rename from search/nomatches.html rename to ver-5.1.0/search/nomatches.html diff --git a/search/pages_0.html b/ver-5.1.0/search/pages_0.html similarity index 100% rename from search/pages_0.html rename to ver-5.1.0/search/pages_0.html diff --git a/ver-5.1.0/search/pages_0.js b/ver-5.1.0/search/pages_0.js new file mode 100644 index 00000000..cbef086c --- /dev/null +++ b/ver-5.1.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['introduction_791',['Introduction',['../index.html',1,'']]] +]; diff --git a/ver-5.1.0/search/search.css b/ver-5.1.0/search/search.css new file mode 100644 index 00000000..9074198f --- /dev/null +++ b/ver-5.1.0/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/ver-5.1.0/search/search.js b/ver-5.1.0/search/search.js new file mode 100644 index 00000000..fb226f73 --- /dev/null +++ b/ver-5.1.0/search/search.js @@ -0,0 +1,816 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + +NCEPLIBS-ip: sp_mod.F Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sp_mod.F
    +
    +
    +
    1  module sp_mod
    +
    2 
    +
    3  contains
    +
    4 
    +
    5 #include "fftpack.F"
    +
    6 #include "ncpus.F"
    +
    7 #include "spanaly.f"
    +
    8 #include "spdz2uv.f"
    +
    9 #include "speps.f"
    +
    10 #include "spfft1.f"
    +
    11 #include "spffte.f"
    +
    12 #include "spfftpt.f"
    +
    13 #include "splaplac.f"
    +
    14 #include "splat.F"
    +
    15 #include "splegend.f"
    +
    16 #include "sppad.f"
    +
    17 #include "spsynth.f"
    +
    18 #include "sptezd.f"
    +
    19 #include "sptez.f"
    +
    20 #include "sptezmd.f"
    +
    21 #include "sptezm.f"
    +
    22 #include "sptezmv.f"
    +
    23 #include "sptezv.f"
    +
    24 #include "sptgpm.f"
    +
    25 #include "sptgpmv.f"
    +
    26 #include "sptgps.f"
    +
    27 #include "sptgpsv.f"
    +
    28 #include "sptgpt.f"
    +
    29 #include "sptgptv.f"
    +
    30 #include "sptrand.f"
    +
    31 #include "sptran.f"
    +
    32 #include "sptranf0.f"
    +
    33 #include "sptranf1.f"
    +
    34 #include "sptranf.f"
    +
    35 #include "sptranfv.f"
    +
    36 #include "sptranv.f"
    +
    37 #include "sptrun.f"
    +
    38 #include "sptrung.f"
    +
    39 #include "sptrungv.f"
    +
    40 #include "sptrunm.f"
    +
    41 #include "sptrunmv.f"
    +
    42 #include "sptruns.f"
    +
    43 #include "sptrunsv.f"
    +
    44 #include "sptrunv.f"
    +
    45 #include "spuv2dz.f"
    +
    46 #include "spwget.f"
    +
    47 
    +
    48 #ifdef BUILD_DEPRECATED
    +
    49 #include "spfft.f"
    +
    50 #include "spgradq.f"
    +
    51 #include "spgradx.f"
    +
    52 #include "spgrady.f"
    +
    53 #include "sptgpmd.f"
    +
    54 #include "sptgpsd.f"
    +
    55 #include "sptgptd.f"
    +
    56 #include "sptgptsd.f"
    +
    57 #include "sptgptvd.f"
    +
    58 #include "sptrund.f"
    +
    59 #include "sptrunl.f"
    +
    60 #include "spvar.f"
    +
    61 #endif
    +
    62 
    +
    63  end module
    +
    +
    + + + + diff --git a/ver-5.1.0/spanaly_8f.html b/ver-5.1.0/spanaly_8f.html new file mode 100644 index 00000000..f3db851f --- /dev/null +++ b/ver-5.1.0/spanaly_8f.html @@ -0,0 +1,267 @@ + + + + + + + +NCEPLIBS-ip: spanaly.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    spanaly.f File Reference
    +
    +
    + +

    Analyze spectral from Fourier. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine spanaly (I, M, IM, IX, NC, NCTOP, KM, WGT, CLAT, PLN, PLNTOP, MP, F, SPC, SPCTOP)
     Analyzes spectral coefficients from Fourier coefficients for a latitude pair (Northern and Southern hemispheres). More...
     
    +

    Detailed Description

    +

    Analyze spectral from Fourier.

    +

    +Program History Log

    + + + + + + + + + +
    Date Programmer Comments
    91-10-31 Mark Iredell Initial.
    94-08-01 Mark Iredell Moved zonal wavenumber loop inside.
    1998-12-15 Iredell Openmp directives inserted.
    +
    Author
    Iredell
    +
    Date
    91-10-31
    + +

    Definition in file spanaly.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ spanaly()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spanaly ( I,
     M,
     IM,
     IX,
     NC,
     NCTOP,
     KM,
     WGT,
     CLAT,
    real, dimension((m+1)*((i+1)*m+2)/2) PLN,
    real, dimension(m+1) PLNTOP,
    integer, dimension(km) MP,
    real, dimension(ix,2,km) F,
    real, dimension(nc,km) SPC,
    real, dimension(nctop,km) SPCTOP 
    )
    +
    + +

    Analyzes spectral coefficients from Fourier coefficients for a latitude pair (Northern and Southern hemispheres).

    +

    Vector components are multiplied by cosine of latitude.

    +
    Parameters
    + + + + + + + + + + + + + + + + +
    Ispectral domain shape (0 for triangular, 1 for rhomboidal)
    Mspectral truncation
    IMeven number of Fourier coefficients
    IXdimension of Fourier coefficients (IX>=IM+2)
    NCdimension of spectral coefficients (NC>=(M+1)*((I+1)*M+2))
    NCTOPdimension of spectral coefficients over top (NCTOP>=2*(M+1))
    KMnumber of fields
    WGTGaussian weight
    CLATcosine of latitude
    PLNLegendre polynomials
    PLNTOPLegendre polynomial over top
    MPidentifiers (0 for scalar, 1 for vector)
    FFourier coefficients combined
    SPCspectral coefficients
    SPCTOPspectral coefficients over top
    +
    +
    +
    Author
    Iredell
    +
    Date
    91-10-31
    + +

    Definition at line 35 of file spanaly.f.

    + +

    Referenced by sptranf1().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/spanaly_8f.js b/ver-5.1.0/spanaly_8f.js new file mode 100644 index 00000000..c397fb92 --- /dev/null +++ b/ver-5.1.0/spanaly_8f.js @@ -0,0 +1,4 @@ +var spanaly_8f = +[ + [ "spanaly", "spanaly_8f.html#a5cc846d796d393d7499cde0f3d1d6e6a", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/spanaly_8f_source.html b/ver-5.1.0/spanaly_8f_source.html new file mode 100644 index 00000000..f651984d --- /dev/null +++ b/ver-5.1.0/spanaly_8f_source.html @@ -0,0 +1,176 @@ + + + + + + + +NCEPLIBS-ip: spanaly.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    spanaly.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Analyze spectral from Fourier.
    +
    3 C>
    +
    4 C> ### Program History Log
    +
    5 C> Date | Programmer | Comments
    +
    6 C> -----|------------|---------
    +
    7 C> 91-10-31 | Mark Iredell | Initial.
    +
    8 C> 94-08-01 | Mark Iredell | Moved zonal wavenumber loop inside.
    +
    9 C> 1998-12-15 | Iredell | Openmp directives inserted.
    +
    10 C>
    +
    11 C> @author Iredell @date 91-10-31
    +
    12 
    +
    13 C> Analyzes spectral coefficients from Fourier coefficients
    +
    14 C> for a latitude pair (Northern and Southern hemispheres).
    +
    15 C>
    +
    16 C> Vector components are multiplied by cosine of latitude.
    +
    17 C>
    +
    18 C> @param I spectral domain shape (0 for triangular, 1 for rhomboidal)
    +
    19 C> @param M spectral truncation
    +
    20 C> @param IM even number of Fourier coefficients
    +
    21 C> @param IX dimension of Fourier coefficients (IX>=IM+2)
    +
    22 C> @param NC dimension of spectral coefficients (NC>=(M+1)*((I+1)*M+2))
    +
    23 C> @param NCTOP dimension of spectral coefficients over top (NCTOP>=2*(M+1))
    +
    24 C> @param KM number of fields
    +
    25 C> @param WGT Gaussian weight
    +
    26 C> @param CLAT cosine of latitude
    +
    27 C> @param PLN Legendre polynomials
    +
    28 C> @param PLNTOP Legendre polynomial over top
    +
    29 C> @param MP identifiers (0 for scalar, 1 for vector)
    +
    30 C> @param F Fourier coefficients combined
    +
    31 C> @param SPC spectral coefficients
    +
    32 C> @param SPCTOP spectral coefficients over top
    +
    33 C>
    +
    34 C> @author Iredell @date 91-10-31
    +
    35  SUBROUTINE spanaly(I,M,IM,IX,NC,NCTOP,KM,WGT,CLAT,PLN,PLNTOP,MP,
    +
    36  & F,SPC,SPCTOP)
    +
    37  INTEGER MP(KM)
    +
    38  REAL PLN((M+1)*((I+1)*M+2)/2),PLNTOP(M+1)
    +
    39  REAL F(IX,2,KM)
    +
    40  REAL SPC(NC,KM),SPCTOP(NCTOP,KM)
    +
    41  REAL FW(2,2)
    +
    42 
    +
    43 C FOR EACH ZONAL WAVENUMBER, ANALYZE TERMS OVER TOTAL WAVENUMBER.
    +
    44 C ANALYZE EVEN AND ODD POLYNOMIALS SEPARATELY.
    +
    45  lx=min(m,im/2)
    +
    46 !C$OMP PARALLEL DO PRIVATE(L,NT,KS,KP,FW)
    +
    47  DO k=1,km
    +
    48  DO l=0,lx
    +
    49  nt=mod(m+1+(i-1)*l,2)+1
    +
    50  ks=l*(2*m+(i-1)*(l-1))
    +
    51  kp=ks/2+1
    +
    52  IF(mp(k).EQ.0) THEN
    +
    53  fw(1,1)=wgt*(f(2*l+1,1,k)+f(2*l+1,2,k))
    +
    54  fw(2,1)=wgt*(f(2*l+2,1,k)+f(2*l+2,2,k))
    +
    55  fw(1,2)=wgt*(f(2*l+1,1,k)-f(2*l+1,2,k))
    +
    56  fw(2,2)=wgt*(f(2*l+2,1,k)-f(2*l+2,2,k))
    +
    57  ELSE
    +
    58  fw(1,1)=wgt*clat*(f(2*l+1,1,k)+f(2*l+1,2,k))
    +
    59  fw(2,1)=wgt*clat*(f(2*l+2,1,k)+f(2*l+2,2,k))
    +
    60  fw(1,2)=wgt*clat*(f(2*l+1,1,k)-f(2*l+1,2,k))
    +
    61  fw(2,2)=wgt*clat*(f(2*l+2,1,k)-f(2*l+2,2,k))
    +
    62  spctop(2*l+1,k)=spctop(2*l+1,k)+plntop(l+1)*fw(1,nt)
    +
    63  spctop(2*l+2,k)=spctop(2*l+2,k)+plntop(l+1)*fw(2,nt)
    +
    64  ENDIF
    +
    65  DO n=l,i*l+m,2
    +
    66  spc(ks+2*n+1,k)=spc(ks+2*n+1,k)+pln(kp+n)*fw(1,1)
    +
    67  spc(ks+2*n+2,k)=spc(ks+2*n+2,k)+pln(kp+n)*fw(2,1)
    +
    68  ENDDO
    +
    69  DO n=l+1,i*l+m,2
    +
    70  spc(ks+2*n+1,k)=spc(ks+2*n+1,k)+pln(kp+n)*fw(1,2)
    +
    71  spc(ks+2*n+2,k)=spc(ks+2*n+2,k)+pln(kp+n)*fw(2,2)
    +
    72  ENDDO
    +
    73  ENDDO
    +
    74  ENDDO
    +
    75  RETURN
    +
    76  END
    +
    subroutine spanaly(I, M, IM, IX, NC, NCTOP, KM, WGT, CLAT, PLN, PLNTOP, MP, F, SPC, SPCTOP)
    Analyzes spectral coefficients from Fourier coefficients for a latitude pair (Northern and Southern h...
    Definition: spanaly.f:37
    +
    +
    + + + + diff --git a/ver-5.1.0/spdz2uv_8f.html b/ver-5.1.0/spdz2uv_8f.html new file mode 100644 index 00000000..45148686 --- /dev/null +++ b/ver-5.1.0/spdz2uv_8f.html @@ -0,0 +1,247 @@ + + + + + + + +NCEPLIBS-ip: spdz2uv.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    spdz2uv.f File Reference
    +
    +
    + +

    Compute winds from divergence and vorticity. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine spdz2uv (I, M, ENN1, ELONN1, EON, EONTOP, D, Z, U, V, UTOP, VTOP)
     Computes the wind components from divergence and vorticity in spectral space. More...
     
    +

    Detailed Description

    +

    Compute winds from divergence and vorticity.

    +
    Author
    Iredell
    +
    Date
    92-10-31
    + +

    Definition in file spdz2uv.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ spdz2uv()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spdz2uv ( I,
     M,
    real, dimension((m+1)*((i+1)*m+2)/2) ENN1,
    real, dimension((m+1)*((i+1)*m+2)/2) ELONN1,
    real, dimension((m+1)*((i+1)*m+2)/2) EON,
    real, dimension(m+1) EONTOP,
    real, dimension((m+1)*((i+1)*m+2)) D,
    real, dimension((m+1)*((i+1)*m+2)) Z,
    real, dimension((m+1)*((i+1)*m+2)) U,
    real, dimension((m+1)*((i+1)*m+2)) V,
    real, dimension(2*(m+1)) UTOP,
    real, dimension(2*(m+1)) VTOP 
    )
    +
    + +

    Computes the wind components from divergence and vorticity in spectral space.

    +

    Subprogram speps() should be called already.

    +

    If L is the zonal wavenumber, N is the total wavenumber,

          
    + EPS(L,N) = SQRT((N**2-L**2)/(4*N**2-1))
    + 

    a
    +nd A is earth radius, then the zonal wind component U is computed as

    + U(L,N)=-I*L/(N*(N+1))*A*D(L,N)
    + +EPS(L,N+1)/(N+1)*A*Z(L,N+1)-EPS(L,N)/N*A*Z(L,N-1)
    + 

    and the meridional wind component V is computed as

    + V(L,N)=-I*L/(N*(N+1))*A*Z(L,N)
    + -EPS(L,N+1)/(N+1)*A*D(L,N+1)+EPS(L,N)/N*A*D(L,N-1)
    + 

    where D is divergence and Z is vorticity.

    +

    U and V are weighted by the cosine of latitude.

    +

    Cxtra terms are computed over top of the spectral domain.

    +

    Advantage is taken of the fact that EPS(L,L)=0 in order to vectorize over the entire spectral domain.

    +
    Parameters
    + + + + + + + + + + + + + +
    Ispectral domain shape (0 for triangular, 1 for rhomboidal)
    Mspectral truncation
    ENN1((M+1)*((I+1)*M+2)/2) N*(N+1)/A**2
    ELONN1((M+1)*((I+1)*M+2)/2) L/(N*(N+1))*A
    EON((M+1)*((I+1)*M+2)/2) EPSILON/N*A
    EONTOP(M+1) EPSILON/N*A OVER TOP
    D((M+1)*((I+1)*M+2)) divergence
    Z((M+1)*((I+1)*M+2)) vorticity
    U((M+1)*((I+1)*M+2)) zonal wind (times coslat)
    V((M+1)*((I+1)*M+2)) merid wind (times coslat)
    UTOP(2*(M+1)) zonal wind (times coslat) over top
    VTOP(2*(M+1)) merid wind (times coslat) over top
    +
    +
    +
    Author
    Iredell
    +
    Date
    92-10-31
    + +

    Definition at line 48 of file spdz2uv.f.

    + +

    Referenced by sptgpmv(), sptgpsv(), sptgptv(), sptgptvd(), and sptranfv().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/spdz2uv_8f.js b/ver-5.1.0/spdz2uv_8f.js new file mode 100644 index 00000000..e0e6edd1 --- /dev/null +++ b/ver-5.1.0/spdz2uv_8f.js @@ -0,0 +1,4 @@ +var spdz2uv_8f = +[ + [ "spdz2uv", "spdz2uv_8f.html#ae3a4a74c49f78a25425b610743dc0692", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/spdz2uv_8f_source.html b/ver-5.1.0/spdz2uv_8f_source.html new file mode 100644 index 00000000..2150369b --- /dev/null +++ b/ver-5.1.0/spdz2uv_8f_source.html @@ -0,0 +1,182 @@ + + + + + + + +NCEPLIBS-ip: spdz2uv.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    spdz2uv.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Compute winds from divergence and vorticity.
    +
    3 C> @author Iredell @date 92-10-31
    +
    4 
    +
    5 C> Computes the wind components from divergence and vorticity
    +
    6 C> in spectral space.
    +
    7 C>
    +
    8 C> Subprogram speps() should be called already.
    +
    9 C>
    +
    10 C> If L is the zonal wavenumber, N is the total wavenumber,
    +
    11 C> <pre>
    +
    12 C> EPS(L,N) = SQRT((N**2-L**2)/(4*N**2-1))
    +
    13 C> </pre>
    +
    14 C> and A is earth radius,
    +
    15 C> then the zonal wind component U is computed as
    +
    16 C> <pre>
    +
    17 C> U(L,N)=-I*L/(N*(N+1))*A*D(L,N)
    +
    18 C> +EPS(L,N+1)/(N+1)*A*Z(L,N+1)-EPS(L,N)/N*A*Z(L,N-1)
    +
    19 C> </pre>
    +
    20 C> and the meridional wind component V is computed as
    +
    21 C> <pre>
    +
    22 C> V(L,N)=-I*L/(N*(N+1))*A*Z(L,N)
    +
    23 C> -EPS(L,N+1)/(N+1)*A*D(L,N+1)+EPS(L,N)/N*A*D(L,N-1)
    +
    24 C> </pre>
    +
    25 C> where D is divergence and Z is vorticity.
    +
    26 C>
    +
    27 C> U and V are weighted by the cosine of latitude.
    +
    28 C>
    +
    29 C> Cxtra terms are computed over top of the spectral domain.
    +
    30 C>
    +
    31 C> Advantage is taken of the fact that EPS(L,L)=0
    +
    32 C> in order to vectorize over the entire spectral domain.
    +
    33 C>
    +
    34 C> @param I spectral domain shape (0 for triangular, 1 for rhomboidal)
    +
    35 C> @param M spectral truncation
    +
    36 C> @param ENN1 ((M+1)*((I+1)*M+2)/2) N*(N+1)/A**2
    +
    37 C> @param ELONN1 ((M+1)*((I+1)*M+2)/2) L/(N*(N+1))*A
    +
    38 C> @param EON ((M+1)*((I+1)*M+2)/2) EPSILON/N*A
    +
    39 C> @param EONTOP (M+1) EPSILON/N*A OVER TOP
    +
    40 C> @param D ((M+1)*((I+1)*M+2)) divergence
    +
    41 C> @param Z ((M+1)*((I+1)*M+2)) vorticity
    +
    42 C> @param U ((M+1)*((I+1)*M+2)) zonal wind (times coslat)
    +
    43 C> @param V ((M+1)*((I+1)*M+2)) merid wind (times coslat)
    +
    44 C> @param UTOP (2*(M+1)) zonal wind (times coslat) over top
    +
    45 C> @param VTOP (2*(M+1)) merid wind (times coslat) over top
    +
    46 C>
    +
    47 C> @author Iredell @date 92-10-31
    +
    48  SUBROUTINE spdz2uv(I,M,ENN1,ELONN1,EON,EONTOP,D,Z,U,V,UTOP,VTOP)
    +
    49  REAL ENN1((M+1)*((I+1)*M+2)/2),ELONN1((M+1)*((I+1)*M+2)/2)
    +
    50  REAL EON((M+1)*((I+1)*M+2)/2),EONTOP(M+1)
    +
    51  REAL D((M+1)*((I+1)*M+2)),Z((M+1)*((I+1)*M+2))
    +
    52  REAL U((M+1)*((I+1)*M+2)),V((M+1)*((I+1)*M+2))
    +
    53  REAL UTOP(2*(M+1)),VTOP(2*(M+1))
    +
    54 
    +
    55 C COMPUTE WINDS IN THE SPECTRAL DOMAIN
    +
    56  k=1
    +
    57  u(2*k-1)=eon(k+1)*z(2*k+1)
    +
    58  u(2*k)=eon(k+1)*z(2*k+2)
    +
    59  v(2*k-1)=-eon(k+1)*d(2*k+1)
    +
    60  v(2*k)=-eon(k+1)*d(2*k+2)
    +
    61  DO k=2,(m+1)*((i+1)*m+2)/2-1
    +
    62  u(2*k-1)=elonn1(k)*d(2*k)+eon(k+1)*z(2*k+1)-eon(k)*z(2*k-3)
    +
    63  u(2*k)=-elonn1(k)*d(2*k-1)+eon(k+1)*z(2*k+2)-eon(k)*z(2*k-2)
    +
    64  v(2*k-1)=elonn1(k)*z(2*k)-eon(k+1)*d(2*k+1)+eon(k)*d(2*k-3)
    +
    65  v(2*k)=-elonn1(k)*z(2*k-1)-eon(k+1)*d(2*k+2)+eon(k)*d(2*k-2)
    +
    66  ENDDO
    +
    67  k=(m+1)*((i+1)*m+2)/2
    +
    68  u(2*k-1)=elonn1(k)*d(2*k)-eon(k)*z(2*k-3)
    +
    69  u(2*k)=-elonn1(k)*d(2*k-1)-eon(k)*z(2*k-2)
    +
    70  v(2*k-1)=elonn1(k)*z(2*k)+eon(k)*d(2*k-3)
    +
    71  v(2*k)=-elonn1(k)*z(2*k-1)+eon(k)*d(2*k-2)
    +
    72 
    +
    73 C COMPUTE WINDS OVER TOP OF THE SPECTRAL DOMAIN
    +
    74  DO l=0,m
    +
    75  k=l*(2*m+(i-1)*(l-1))/2+i*l+m+1
    +
    76  utop(2*l+1)=-eontop(l+1)*z(2*k-1)
    +
    77  utop(2*l+2)=-eontop(l+1)*z(2*k)
    +
    78  vtop(2*l+1)=eontop(l+1)*d(2*k-1)
    +
    79  vtop(2*l+2)=eontop(l+1)*d(2*k)
    +
    80  ENDDO
    +
    81  RETURN
    +
    82  END
    +
    subroutine spdz2uv(I, M, ENN1, ELONN1, EON, EONTOP, D, Z, U, V, UTOP, VTOP)
    Computes the wind components from divergence and vorticity in spectral space.
    Definition: spdz2uv.f:49
    +
    +
    + + + + diff --git a/ver-5.1.0/spectral__interp__mod_8F90.html b/ver-5.1.0/spectral__interp__mod_8F90.html new file mode 100644 index 00000000..7936949e --- /dev/null +++ b/ver-5.1.0/spectral__interp__mod_8F90.html @@ -0,0 +1,151 @@ + + + + + + + +NCEPLIBS-ip: spectral_interp_mod.F90 File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    spectral_interp_mod.F90 File Reference
    +
    +
    + +

    Interpolate spectral. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Data Types

    interface  spectral_interp_mod::interpolate_spectral
     
    interface  spectral_interp_mod::polates4
     
    interface  spectral_interp_mod::polatev4
     
    + + + + +

    +Modules

    module  spectral_interp_mod
     Interpolate spectral.
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions/Subroutines

    subroutine spectral_interp_mod::interpolate_spectral_scalar (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Interpolate spectral scalar. More...
     
    subroutine spectral_interp_mod::interpolate_spectral_vector (IPOPT, grid_in, grid_out, MI, MO, KM, IBI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     Interpolate spectral vector. More...
     
    subroutine spectral_interp_mod::polates4_grib1 (IPOPT, KGDSI, KGDSO, MI, MO, KM, IBI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Interpolate scalar fields (spectral). More...
     
    subroutine spectral_interp_mod::polates4_grib2 (IPOPT, IGDTNUMI, IGDTMPLI, IGDTLENI, IGDTNUMO, IGDTMPLO, IGDTLENO, MI, MO, KM, IBI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
     Interpolate scalar fields (spectral). More...
     
    subroutine spectral_interp_mod::polatev4_grib1 (IPOPT, KGDSI, KGDSO, MI, MO, KM, IBI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     Interpolate vector fields (spectral). More...
     
    subroutine spectral_interp_mod::polatev4_grib2 (IPOPT, IGDTNUMI, IGDTMPLI, IGDTLENI, IGDTNUMO, IGDTMPLO, IGDTLENO, MI, MO, KM, IBI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
     Interpolate vector fields (spectral). More...
     
    +

    Detailed Description

    +

    Interpolate spectral.

    +
    Author
    Mark Iredell
    +
    Date
    96-04-10
    + +

    Definition in file spectral_interp_mod.F90.

    +
    +
    + + + + diff --git a/ver-5.1.0/spectral__interp__mod_8F90.js b/ver-5.1.0/spectral__interp__mod_8F90.js new file mode 100644 index 00000000..c8774d15 --- /dev/null +++ b/ver-5.1.0/spectral__interp__mod_8F90.js @@ -0,0 +1,12 @@ +var spectral__interp__mod_8F90 = +[ + [ "interpolate_spectral", "interfacespectral__interp__mod_1_1interpolate__spectral.html", "interfacespectral__interp__mod_1_1interpolate__spectral" ], + [ "polates4", "interfacespectral__interp__mod_1_1polates4.html", "interfacespectral__interp__mod_1_1polates4" ], + [ "polatev4", "interfacespectral__interp__mod_1_1polatev4.html", "interfacespectral__interp__mod_1_1polatev4" ], + [ "interpolate_spectral_scalar", "spectral__interp__mod_8F90.html#a438646d69e941def0ada00d5ca19f618", null ], + [ "interpolate_spectral_vector", "spectral__interp__mod_8F90.html#acb61ad529b7decc2a6ff58dd12fbadd0", null ], + [ "polates4_grib1", "spectral__interp__mod_8F90.html#ab9fb87d87f2f9d578a5ade6b512ff366", null ], + [ "polates4_grib2", "spectral__interp__mod_8F90.html#a54dfd0ea8368242a1053d64770bd295a", null ], + [ "polatev4_grib1", "spectral__interp__mod_8F90.html#af4ce7638750e787dd69c7fe3ff2335cc", null ], + [ "polatev4_grib2", "spectral__interp__mod_8F90.html#a2f76e9900554d90753ca788c2ddf9ac3", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/spectral__interp__mod_8F90_source.html b/ver-5.1.0/spectral__interp__mod_8F90_source.html new file mode 100644 index 00000000..0f451c14 --- /dev/null +++ b/ver-5.1.0/spectral__interp__mod_8F90_source.html @@ -0,0 +1,1164 @@ + + + + + + + +NCEPLIBS-ip: spectral_interp_mod.F90 Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    spectral_interp_mod.F90
    +
    +
    +Go to the documentation of this file.
    1 
    +
    4 
    + +
    9  use gdswzd_mod
    +
    10  use ip_grid_mod
    + + + +
    14  use sp_mod
    +
    15  implicit none
    +
    16 
    +
    17  private
    +
    18  public :: interpolate_spectral
    +
    19 
    + +
    21  module procedure interpolate_spectral_scalar
    +
    22  module procedure interpolate_spectral_vector
    +
    23  end interface interpolate_spectral
    +
    24 
    +
    25  interface polates4
    +
    26  module procedure polates4_grib1
    +
    27  module procedure polates4_grib2
    +
    28  end interface polates4
    +
    29 
    +
    30  interface polatev4
    +
    31  module procedure polatev4_grib1
    +
    32  module procedure polatev4_grib2
    +
    33  end interface polatev4
    +
    34 
    +
    35 contains
    +
    36 
    +
    61  subroutine interpolate_spectral_scalar(IPOPT,grid_in,grid_out, &
    +
    62  MI,MO,KM,IBI,GI, &
    +
    63  NO,RLAT,RLON,IBO,LO,GO,IRET)
    +
    64  INTEGER, INTENT(IN ) :: IPOPT(20)
    +
    65  class(ip_grid), intent(in) :: grid_in, grid_out
    +
    66  INTEGER, INTENT(IN ) :: MI, MO
    +
    67  INTEGER, INTENT(IN ) :: IBI(KM), KM
    +
    68  INTEGER, INTENT( OUT) :: IBO(KM), IRET, NO
    +
    69  !
    +
    70  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
    +
    71  !
    +
    72  REAL, INTENT(IN ) :: GI(MI,KM)
    +
    73  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    74  REAL, INTENT( OUT) :: GO(MO,KM)
    +
    75 
    +
    76 
    +
    77  select type(desc_in => grid_in%descriptor)
    +
    78  type is(grib1_descriptor)
    +
    79  select type(desc_out => grid_out%descriptor)
    +
    80  type is(grib1_descriptor)
    +
    81  CALL polates4(ipopt,desc_in%gds,desc_out%gds,mi,mo,km,ibi,gi,no,rlat,rlon,ibo,lo,go,iret)
    +
    82  end select
    +
    83 
    +
    84  type is(grib2_descriptor)
    +
    85  select type(desc_out => grid_out%descriptor)
    +
    86  type is(grib2_descriptor)
    +
    87  CALL polates4(ipopt,desc_in%gdt_num,desc_in%gdt_tmpl,desc_in%gdt_len, &
    +
    88  desc_out%gdt_num,desc_out%gdt_tmpl,desc_out%gdt_len, &
    +
    89  mi,mo,km,ibi,gi,no,rlat,rlon,ibo,lo,go,iret)
    +
    90  end select
    +
    91  end select
    +
    92  end subroutine interpolate_spectral_scalar
    +
    93 
    +
    122  subroutine interpolate_spectral_vector(IPOPT,grid_in,grid_out, &
    +
    123  MI,MO,KM,IBI,UI,VI, &
    +
    124  NO,RLAT,RLON,CROT,SROT,IBO,LO,UO,VO,IRET)
    +
    125  class(ip_grid), intent(in) :: grid_in, grid_out
    +
    126  INTEGER, INTENT(IN ) :: IPOPT(20), IBI(KM)
    +
    127  INTEGER, INTENT(IN ) :: KM, MI, MO
    +
    128  INTEGER, INTENT( OUT) :: IRET, IBO(KM), NO
    +
    129  !
    +
    130  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
    +
    131  !
    +
    132  REAL, INTENT(IN ) :: UI(MI,KM),VI(MI,KM)
    +
    133  REAL, INTENT( OUT) :: UO(MO,KM),VO(MO,KM)
    +
    134  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    135  REAL, INTENT( OUT) :: CROT(MO),SROT(MO)
    +
    136 
    +
    137 
    +
    138  select type(desc_in => grid_in%descriptor)
    +
    139  type is(grib1_descriptor)
    +
    140  select type(desc_out => grid_out%descriptor)
    +
    141  type is(grib1_descriptor)
    +
    142  CALL polatev4_grib1(ipopt,desc_in%gds,desc_out%gds,mi,mo,km,ibi,ui,vi,&
    +
    143  no,rlat,rlon,crot,srot,ibo,lo,uo,vo,iret)
    +
    144  end select
    +
    145 
    +
    146  type is(grib2_descriptor)
    +
    147  select type(desc_out => grid_out%descriptor)
    +
    148  type is(grib2_descriptor)
    +
    149  CALL polatev4(ipopt,desc_in%gdt_num,desc_in%gdt_tmpl,desc_in%gdt_len, &
    +
    150  desc_out%gdt_num,desc_out%gdt_tmpl,desc_out%gdt_len, &
    +
    151  mi,mo,km,ibi,ui,vi,&
    +
    152  no,rlat,rlon,crot,srot,ibo,lo,uo,vo,iret)
    +
    153  end select
    +
    154  end select
    +
    155 
    +
    156 
    +
    157  end subroutine interpolate_spectral_vector
    +
    158 ! @author Mark Iredell @date 96-04-10
    +
    255  SUBROUTINE polates4_grib2(IPOPT,IGDTNUMI,IGDTMPLI,IGDTLENI, &
    +
    256  IGDTNUMO,IGDTMPLO,IGDTLENO, &
    +
    257  MI,MO,KM,IBI,GI, &
    +
    258  NO,RLAT,RLON,IBO,LO,GO,IRET)
    +
    259  INTEGER, INTENT(IN ) :: IGDTNUMI, IGDTLENI
    +
    260  INTEGER, INTENT(IN ) :: IGDTMPLI(IGDTLENI)
    +
    261  INTEGER, INTENT(IN ) :: IGDTNUMO, IGDTLENO
    +
    262  INTEGER, INTENT(IN ) :: IGDTMPLO(IGDTLENO)
    +
    263  INTEGER, INTENT(IN ) :: IPOPT(20)
    +
    264  INTEGER, INTENT(IN ) :: MI, MO
    +
    265  INTEGER, INTENT(IN ) :: IBI(KM), KM
    +
    266  INTEGER, INTENT( OUT) :: IBO(KM), IRET, NO
    +
    267  !
    +
    268  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
    +
    269  !
    +
    270  REAL, INTENT(IN ) :: GI(MI,KM)
    +
    271  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    272  REAL, INTENT( OUT) :: GO(MO,KM)
    +
    273  !
    +
    274  REAL, PARAMETER :: FILL=-9999.
    +
    275  REAL, PARAMETER :: PI=3.14159265358979
    +
    276  REAL, PARAMETER :: DPR=180./pi
    +
    277  !
    +
    278  INTEGER :: IDRTI, IDRTO, IG, JG, IM, JM
    +
    279  INTEGER :: IGO, JGO, IMO, JMO
    +
    280  INTEGER :: ISCAN, JSCAN, NSCAN
    +
    281  INTEGER :: ISCANO, JSCANO, NSCANO
    +
    282  INTEGER :: ISKIPI, JSKIPI, ISCALE
    +
    283  INTEGER :: IMAXI, JMAXI, ISPEC
    +
    284  INTEGER :: IP, IPRIME, IPROJ, IROMB, K
    +
    285  INTEGER :: MAXWV, N, NI, NJ, NPS
    +
    286  !
    +
    287  REAL :: DE, DR, DY
    +
    288  REAL :: DLAT, DLON, DLATO, DLONO
    +
    289  REAL :: GO2(MO,KM), H, HI, HJ
    +
    290  REAL :: ORIENT, SLAT, RERTH, E2
    +
    291  REAL :: RLAT1, RLON1, RLAT2, RLON2, RLATI
    +
    292  REAL :: XMESH, XP, YP
    +
    293  REAL :: XPTS(MO), YPTS(MO)
    +
    294 
    +
    295  type(grib2_descriptor) :: desc_in, desc_out
    +
    296  class(ip_grid), allocatable :: grid_in, grid_out
    +
    297 
    +
    298  desc_in = init_descriptor(igdtnumi, igdtleni, igdtmpli)
    +
    299  desc_out = init_descriptor(igdtnumo, igdtleno, igdtmplo)
    +
    300 
    +
    301  call init_grid(grid_in, desc_in)
    +
    302  call init_grid(grid_out, desc_out)
    +
    303  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    304  ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
    +
    305  iret=0
    +
    306  IF(igdtnumo.GE.0) THEN
    +
    307  !CALL GDSWZD(IGDTNUMO,IGDTMPLO,IGDTLENO, 0,MO,FILL,XPTS,YPTS,RLON,RLAT,NO)
    +
    308  CALL gdswzd(grid_out, 0,mo,fill,xpts,ypts,rlon,rlat,no)
    +
    309  IF(no.EQ.0) iret=3
    +
    310  ENDIF
    +
    311  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    312  ! AFFIRM APPROPRIATE INPUT GRID
    +
    313  ! LAT/LON OR GAUSSIAN
    +
    314  ! NO BITMAPS
    +
    315  ! FULL ZONAL COVERAGE
    +
    316  ! FULL MERIDIONAL COVERAGE
    +
    317  idrti=igdtnumi
    +
    318  IF(idrti==40) idrti=4
    +
    319  IF(idrti==0.OR.idrti==4)THEN
    +
    320  im=igdtmpli(8)
    +
    321  jm=igdtmpli(9)
    +
    322  iscale=igdtmpli(10)*igdtmpli(11)
    +
    323  IF(iscale==0) iscale=10**6
    +
    324  rlon1=float(igdtmpli(13))/float(iscale)
    +
    325  rlon2=float(igdtmpli(16))/float(iscale)
    +
    326  iscan=mod(igdtmpli(19)/128,2)
    +
    327  jscan=mod(igdtmpli(19)/64,2)
    +
    328  nscan=mod(igdtmpli(19)/32,2)
    +
    329  ELSE
    +
    330  iret=41
    +
    331  ENDIF
    +
    332  DO k=1,km
    +
    333  IF(ibi(k).NE.0) iret=41
    +
    334  ENDDO
    +
    335  IF(iret.EQ.0) THEN
    +
    336  IF(iscan.EQ.0) THEN
    +
    337  dlon=(mod(rlon2-rlon1-1+3600,360.)+1)/(im-1)
    +
    338  ELSE
    +
    339  dlon=-(mod(rlon1-rlon2-1+3600,360.)+1)/(im-1)
    +
    340  ENDIF
    +
    341  ig=nint(360/abs(dlon))
    +
    342  iprime=1+mod(-nint(rlon1/dlon)+ig,ig)
    +
    343  imaxi=ig
    +
    344  jmaxi=jm
    +
    345  IF(mod(ig,2).NE.0.OR.im.LT.ig) iret=41
    +
    346  ENDIF
    +
    347  IF(iret.EQ.0.AND.idrti.EQ.0) THEN
    +
    348  iscale=igdtmpli(10)*igdtmpli(11)
    +
    349  IF(iscale==0) iscale=10**6
    +
    350  rlat1=float(igdtmpli(12))/float(iscale)
    +
    351  rlat2=float(igdtmpli(15))/float(iscale)
    +
    352  dlat=(rlat2-rlat1)/(jm-1)
    +
    353  jg=nint(180/abs(dlat))
    +
    354  IF(jm.EQ.jg) idrti=256
    +
    355  IF(jm.NE.jg.AND.jm.NE.jg+1) iret=41
    +
    356  ELSEIF(iret.EQ.0.AND.idrti.EQ.4) THEN
    +
    357  jg=igdtmpli(18)*2
    +
    358  IF(jm.NE.jg) iret=41
    +
    359  ENDIF
    +
    360  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    361  ! SET PARAMETERS
    +
    362  IF(iret.EQ.0) THEN
    +
    363  iromb=ipopt(1)
    +
    364  maxwv=ipopt(2)
    +
    365  IF(maxwv.EQ.-1) THEN
    +
    366  IF(iromb.EQ.0.AND.idrti.EQ.4) maxwv=(jmaxi-1)
    +
    367  IF(iromb.EQ.1.AND.idrti.EQ.4) maxwv=(jmaxi-1)/2
    +
    368  IF(iromb.EQ.0.AND.idrti.EQ.0) maxwv=(jmaxi-3)/2
    +
    369  IF(iromb.EQ.1.AND.idrti.EQ.0) maxwv=(jmaxi-3)/4
    +
    370  IF(iromb.EQ.0.AND.idrti.EQ.256) maxwv=(jmaxi-1)/2
    +
    371  IF(iromb.EQ.1.AND.idrti.EQ.256) maxwv=(jmaxi-1)/4
    +
    372  ENDIF
    +
    373  IF((iromb.NE.0.AND.iromb.NE.1).OR.maxwv.LT.0) iret=42
    +
    374  ENDIF
    +
    375  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    376  ! INTERPOLATE
    +
    377  IF(iret.EQ.0) THEN
    +
    378  IF(nscan.EQ.0) THEN
    +
    379  iskipi=1
    +
    380  jskipi=im
    +
    381  ELSE
    +
    382  iskipi=jm
    +
    383  jskipi=1
    +
    384  ENDIF
    +
    385  IF(iscan.EQ.1) iskipi=-iskipi
    +
    386  IF(jscan.EQ.0) jskipi=-jskipi
    +
    387  ispec=0
    +
    388  ! SPECIAL CASE OF GLOBAL CYLINDRICAL GRID
    +
    389  IF((igdtnumo.EQ.0.OR.igdtnumo.EQ.40).AND. &
    +
    390  mod(igdtmplo(8),2).EQ.0.AND.igdtmplo(13).EQ.0.AND.igdtmplo(19).EQ.0) THEN
    +
    391  idrto=igdtnumo
    +
    392  IF(idrto==40)idrto=4
    +
    393  imo=igdtmplo(8)
    +
    394  jmo=igdtmplo(9)
    +
    395  iscale=igdtmplo(10)*igdtmplo(11)
    +
    396  IF(iscale==0) iscale=10**6
    +
    397  rlon2=float(igdtmplo(16))/float(iscale)
    +
    398  dlono=(mod(rlon2-1+3600,360.)+1)/(imo-1)
    +
    399  igo=nint(360/abs(dlono))
    +
    400  IF(imo.EQ.igo.AND.idrto.EQ.0) THEN
    +
    401  rlat1=float(igdtmplo(12))/float(iscale)
    +
    402  rlat2=float(igdtmplo(15))/float(iscale)
    +
    403  dlat=(rlat2-rlat1)/(jmo-1)
    +
    404  jgo=nint(180/abs(dlat))
    +
    405  IF(jmo.EQ.jgo) idrto=256
    +
    406  IF(jmo.EQ.jgo.OR.jmo.EQ.jgo+1) ispec=1
    +
    407  ELSEIF(imo.EQ.igo.AND.idrto.EQ.4) THEN
    +
    408  jgo=igdtmplo(18)*2
    +
    409  IF(jmo.EQ.jgo) ispec=1
    +
    410  ENDIF
    +
    411  IF(ispec.EQ.1) THEN
    +
    412  CALL sptrun(iromb,maxwv,idrti,imaxi,jmaxi,idrto,imo,jmo, &
    +
    413  km,iprime,iskipi,jskipi,mi,0,0,mo,0,gi,go)
    +
    414  ENDIF
    +
    415  ! SPECIAL CASE OF POLAR STEREOGRAPHIC GRID
    +
    416  ELSEIF(igdtnumo.EQ.20.AND. &
    +
    417  igdtmplo(8).EQ.igdtmplo(9).AND.mod(igdtmplo(8),2).EQ.1.AND. &
    +
    418  igdtmplo(15).EQ.igdtmplo(16).AND.igdtmplo(18).EQ.64) THEN
    +
    419  nps=igdtmplo(8)
    +
    420  rlat1=float(igdtmplo(10))*1.e-6
    +
    421  rlon1=float(igdtmplo(11))*1.e-6
    +
    422  orient=float(igdtmplo(14))*1.e-6
    +
    423  xmesh=float(igdtmplo(15))*1.e-3
    +
    424  iproj=mod(igdtmplo(17)/128,2)
    +
    425  ip=(nps+1)/2
    +
    426  h=(-1.)**iproj
    +
    427  slat=float(abs(igdtmplo(13)))*1.e-6
    +
    428  CALL earth_radius(igdtmplo,igdtleno,rerth,e2)
    +
    429  de=(1.+sin(slat/dpr))*rerth
    +
    430  dr=de*cos(rlat1/dpr)/(1+h*sin(rlat1/dpr))
    +
    431  xp=1-h*sin((rlon1-orient)/dpr)*dr/xmesh
    +
    432  yp=1+cos((rlon1-orient)/dpr)*dr/xmesh
    +
    433  IF(nint(xp).EQ.ip.AND.nint(yp).EQ.ip) THEN
    +
    434  IF(iproj.EQ.0) THEN
    +
    435  CALL sptruns(iromb,maxwv,idrti,imaxi,jmaxi,km,nps, &
    +
    436  iprime,iskipi,jskipi,mi,mo,0,0,0, &
    +
    437  slat,xmesh,orient,gi,go,go2)
    +
    438  ELSE
    +
    439  CALL sptruns(iromb,maxwv,idrti,imaxi,jmaxi,km,nps, &
    +
    440  iprime,iskipi,jskipi,mi,mo,0,0,0, &
    +
    441  slat,xmesh,orient,gi,go2,go)
    +
    442  ENDIF
    +
    443  ispec=1
    +
    444  ENDIF
    +
    445  ! SPECIAL CASE OF MERCATOR GRID
    +
    446  ELSEIF(igdtnumo.EQ.10) THEN
    +
    447  ni=igdtmplo(8)
    +
    448  nj=igdtmplo(9)
    +
    449  rlat1=float(igdtmplo(10))*1.0e-6
    +
    450  rlon1=float(igdtmplo(11))*1.0e-6
    +
    451  rlon2=float(igdtmplo(15))*1.0e-6
    +
    452  rlati=float(igdtmplo(13))*1.0e-6
    +
    453  iscano=mod(igdtmplo(16)/128,2)
    +
    454  jscano=mod(igdtmplo(16)/64,2)
    +
    455  nscano=mod(igdtmplo(16)/32,2)
    +
    456  dy=float(igdtmplo(19))*1.0e-3
    +
    457  hi=(-1.)**iscano
    +
    458  hj=(-1.)**(1-jscano)
    +
    459  CALL earth_radius(igdtmplo,igdtleno,rerth,e2)
    +
    460  dlono=hi*(mod(hi*(rlon2-rlon1)-1+3600,360.)+1)/(ni-1)
    +
    461  dlato=hj*dy/(rerth*cos(rlati/dpr))*dpr
    +
    462  IF(nscano.EQ.0) THEN
    +
    463  CALL sptrunm(iromb,maxwv,idrti,imaxi,jmaxi,km,ni,nj, &
    +
    464  iprime,iskipi,jskipi,mi,mo,0,0,0, &
    +
    465  rlat1,rlon1,dlato,dlono,gi,go)
    +
    466  ispec=1
    +
    467  ENDIF
    +
    468  ENDIF
    +
    469  ! GENERAL SLOW CASE
    +
    470  IF(ispec.EQ.0) THEN
    +
    471  CALL sptrung(iromb,maxwv,idrti,imaxi,jmaxi,km,no, &
    +
    472  iprime,iskipi,jskipi,mi,mo,0,0,0,rlat,rlon,gi,go)
    +
    473  ENDIF
    +
    474  DO k=1,km
    +
    475  ibo(k)=0
    +
    476  DO n=1,no
    +
    477  lo(n,k)=.true.
    +
    478  ENDDO
    +
    479  ENDDO
    +
    480  ELSE
    +
    481  DO k=1,km
    +
    482  ibo(k)=1
    +
    483  DO n=1,no
    +
    484  lo(n,k)=.false.
    +
    485  go(n,k)=0.
    +
    486  ENDDO
    +
    487  ENDDO
    +
    488  ENDIF
    +
    489  END SUBROUTINE polates4_grib2
    +
    490 
    +
    560  suBROUTINE polates4_grib1(IPOPT,KGDSI,KGDSO,MI,MO,KM,IBI,GI, &
    +
    561  NO,RLAT,RLON,IBO,LO,GO,IRET)
    +
    562  INTEGER, INTENT(IN ) :: IPOPT(20), KGDSI(200)
    +
    563  INTEGER, INTENT(IN ) :: KGDSO(200), MI, MO
    +
    564  INTEGER, INTENT(IN ) :: IBI(KM), KM
    +
    565  INTEGER, INTENT( OUT) :: IBO(KM), IRET
    +
    566  !
    +
    567  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
    +
    568  !
    +
    569  REAL, INTENT(IN ) :: GI(MI,KM)
    +
    570  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    571  REAL, INTENT( OUT) :: GO(MO,KM)
    +
    572  !
    +
    573  REAL, PARAMETER :: FILL=-9999.
    +
    574  REAL, PARAMETER :: RERTH=6.3712e6
    +
    575  REAL, PARAMETER :: PI=3.14159265358979
    +
    576  REAL, PARAMETER :: DPR=180./pi
    +
    577  !
    +
    578  INTEGER :: IDRTI, IDRTO, IG, JG, IM, JM
    +
    579  INTEGER :: IGO, JGO, IMO, JMO
    +
    580  INTEGER :: ISCAN, JSCAN, NSCAN
    +
    581  INTEGER :: ISCANO, JSCANO, NSCANO
    +
    582  INTEGER :: ISKIPI, JSKIPI
    +
    583  INTEGER :: IMAXI, JMAXI, ISPEC
    +
    584  INTEGER :: IP, IPRIME, IPROJ, IROMB, K
    +
    585  INTEGER :: MAXWV, N, NI, NJ, NPS, NO
    +
    586  !
    +
    587  REAL :: DE, DR, DY
    +
    588  REAL :: DLAT, DLON, DLATO, DLONO
    +
    589  REAL :: GO2(MO,KM), H, HI, HJ
    +
    590  REAL :: ORIENT
    +
    591  REAL :: RLAT1, RLON1, RLAT2, RLON2, RLATI
    +
    592  REAL :: XMESH, XP, YP
    +
    593  REAL :: XPTS(MO), YPTS(MO)
    +
    594 
    +
    595  type(grib1_descriptor) :: desc_in, desc_out
    +
    596  class(ip_grid), allocatable :: grid_in, grid_out
    +
    597 
    +
    598  desc_in = init_descriptor(kgdsi)
    +
    599  desc_out = init_descriptor(kgdso)
    +
    600 
    +
    601  call init_grid(grid_in, desc_in)
    +
    602  call init_grid(grid_out, desc_out)
    +
    603 
    +
    604  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    605  ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
    +
    606  iret=0
    +
    607  IF(kgdso(1).GE.0) THEN
    +
    608  CALL gdswzd(grid_out, 0,mo,fill,xpts,ypts,rlon,rlat,no)
    +
    609  IF(no.EQ.0) iret=3
    +
    610  ENDIF
    +
    611  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    612  ! AFFIRM APPROPRIATE INPUT GRID
    +
    613  ! LAT/LON OR GAUSSIAN
    +
    614  ! NO BITMAPS
    +
    615  ! FULL ZONAL COVERAGE
    +
    616  ! FULL MERIDIONAL COVERAGE
    +
    617  idrti=kgdsi(1)
    +
    618  im=kgdsi(2)
    +
    619  jm=kgdsi(3)
    +
    620  rlon1=kgdsi(5)*1.e-3
    +
    621  rlon2=kgdsi(8)*1.e-3
    +
    622  iscan=mod(kgdsi(11)/128,2)
    +
    623  jscan=mod(kgdsi(11)/64,2)
    +
    624  nscan=mod(kgdsi(11)/32,2)
    +
    625  IF(idrti.NE.0.AND.idrti.NE.4) iret=41
    +
    626  DO k=1,km
    +
    627  IF(ibi(k).NE.0) iret=41
    +
    628  ENDDO
    +
    629  IF(iret.EQ.0) THEN
    +
    630  IF(iscan.EQ.0) THEN
    +
    631  dlon=(mod(rlon2-rlon1-1+3600,360.)+1)/(im-1)
    +
    632  ELSE
    +
    633  dlon=-(mod(rlon1-rlon2-1+3600,360.)+1)/(im-1)
    +
    634  ENDIF
    +
    635  ig=nint(360/abs(dlon))
    +
    636  iprime=1+mod(-nint(rlon1/dlon)+ig,ig)
    +
    637  imaxi=ig
    +
    638  jmaxi=jm
    +
    639  IF(mod(ig,2).NE.0.OR.im.LT.ig) iret=41
    +
    640  ENDIF
    +
    641  IF(iret.EQ.0.AND.idrti.EQ.0) THEN
    +
    642  rlat1=kgdsi(4)*1.e-3
    +
    643  rlat2=kgdsi(7)*1.e-3
    +
    644  dlat=(rlat2-rlat1)/(jm-1)
    +
    645  jg=nint(180/abs(dlat))
    +
    646  IF(jm.EQ.jg) idrti=256
    +
    647  IF(jm.NE.jg.AND.jm.NE.jg+1) iret=41
    +
    648  ELSEIF(iret.EQ.0.AND.idrti.EQ.4) THEN
    +
    649  jg=kgdsi(10)*2
    +
    650  IF(jm.NE.jg) iret=41
    +
    651  ENDIF
    +
    652  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    653  ! SET PARAMETERS
    +
    654  IF(iret.EQ.0) THEN
    +
    655  iromb=ipopt(1)
    +
    656  maxwv=ipopt(2)
    +
    657  IF(maxwv.EQ.-1) THEN
    +
    658  IF(iromb.EQ.0.AND.idrti.EQ.4) maxwv=(jmaxi-1)
    +
    659  IF(iromb.EQ.1.AND.idrti.EQ.4) maxwv=(jmaxi-1)/2
    +
    660  IF(iromb.EQ.0.AND.idrti.EQ.0) maxwv=(jmaxi-3)/2
    +
    661  IF(iromb.EQ.1.AND.idrti.EQ.0) maxwv=(jmaxi-3)/4
    +
    662  IF(iromb.EQ.0.AND.idrti.EQ.256) maxwv=(jmaxi-1)/2
    +
    663  IF(iromb.EQ.1.AND.idrti.EQ.256) maxwv=(jmaxi-1)/4
    +
    664  ENDIF
    +
    665  IF((iromb.NE.0.AND.iromb.NE.1).OR.maxwv.LT.0) iret=42
    +
    666  ENDIF
    +
    667  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    668  ! INTERPOLATE
    +
    669  IF(iret.EQ.0) THEN
    +
    670  IF(nscan.EQ.0) THEN
    +
    671  iskipi=1
    +
    672  jskipi=im
    +
    673  ELSE
    +
    674  iskipi=jm
    +
    675  jskipi=1
    +
    676  ENDIF
    +
    677  IF(iscan.EQ.1) iskipi=-iskipi
    +
    678  IF(jscan.EQ.0) jskipi=-jskipi
    +
    679  ispec=0
    +
    680  ! SPECIAL CASE OF GLOBAL CYLINDRICAL GRID
    +
    681  IF((kgdso(1).EQ.0.OR.kgdso(1).EQ.4).AND. &
    +
    682  mod(kgdso(2),2).EQ.0.AND.kgdso(5).EQ.0.AND.kgdso(11).EQ.0) THEN
    +
    683  idrto=kgdso(1)
    +
    684  imo=kgdso(2)
    +
    685  jmo=kgdso(3)
    +
    686  rlon2=kgdso(8)*1.e-3
    +
    687  dlono=(mod(rlon2-1+3600,360.)+1)/(imo-1)
    +
    688  igo=nint(360/abs(dlono))
    +
    689  IF(imo.EQ.igo.AND.idrto.EQ.0) THEN
    +
    690  rlat1=kgdso(4)*1.e-3
    +
    691  rlat2=kgdso(7)*1.e-3
    +
    692  dlat=(rlat2-rlat1)/(jmo-1)
    +
    693  jgo=nint(180/abs(dlat))
    +
    694  IF(jmo.EQ.jgo) idrto=256
    +
    695  IF(jmo.EQ.jgo.OR.jmo.EQ.jgo+1) ispec=1
    +
    696  ELSEIF(imo.EQ.igo.AND.idrto.EQ.4) THEN
    +
    697  jgo=kgdso(10)*2
    +
    698  IF(jmo.EQ.jgo) ispec=1
    +
    699  ENDIF
    +
    700  IF(ispec.EQ.1) THEN
    +
    701  CALL sptrun(iromb,maxwv,idrti,imaxi,jmaxi,idrto,imo,jmo, &
    +
    702  km,iprime,iskipi,jskipi,mi,0,0,mo,0,gi,go)
    +
    703  ENDIF
    +
    704  ! SPECIAL CASE OF POLAR STEREOGRAPHIC GRID
    +
    705  ELSEIF(kgdso(1).EQ.5.AND. &
    +
    706  kgdso(2).EQ.kgdso(3).AND.mod(kgdso(2),2).EQ.1.AND. &
    +
    707  kgdso(8).EQ.kgdso(9).AND.kgdso(11).EQ.64) THEN
    +
    708  nps=kgdso(2)
    +
    709  rlat1=kgdso(4)*1.e-3
    +
    710  rlon1=kgdso(5)*1.e-3
    +
    711  orient=kgdso(7)*1.e-3
    +
    712  xmesh=kgdso(8)
    +
    713  iproj=mod(kgdso(10)/128,2)
    +
    714  ip=(nps+1)/2
    +
    715  h=(-1.)**iproj
    +
    716  de=(1.+sin(60./dpr))*rerth
    +
    717  dr=de*cos(rlat1/dpr)/(1+h*sin(rlat1/dpr))
    +
    718  xp=1-h*sin((rlon1-orient)/dpr)*dr/xmesh
    +
    719  yp=1+cos((rlon1-orient)/dpr)*dr/xmesh
    +
    720  IF(nint(xp).EQ.ip.AND.nint(yp).EQ.ip) THEN
    +
    721  IF(iproj.EQ.0) THEN
    +
    722  CALL sptruns(iromb,maxwv,idrti,imaxi,jmaxi,km,nps, &
    +
    723  iprime,iskipi,jskipi,mi,mo,0,0,0, &
    +
    724  60.,xmesh,orient,gi,go,go2)
    +
    725  ELSE
    +
    726  CALL sptruns(iromb,maxwv,idrti,imaxi,jmaxi,km,nps, &
    +
    727  iprime,iskipi,jskipi,mi,mo,0,0,0, &
    +
    728  60.,xmesh,orient,gi,go2,go)
    +
    729  ENDIF
    +
    730  ispec=1
    +
    731  ENDIF
    +
    732  ! SPECIAL CASE OF MERCATOR GRID
    +
    733  ELSEIF(kgdso(1).EQ.1) THEN
    +
    734  ni=kgdso(2)
    +
    735  nj=kgdso(3)
    +
    736  rlat1=kgdso(4)*1.e-3
    +
    737  rlon1=kgdso(5)*1.e-3
    +
    738  rlon2=kgdso(8)*1.e-3
    +
    739  rlati=kgdso(9)*1.e-3
    +
    740  iscano=mod(kgdso(11)/128,2)
    +
    741  jscano=mod(kgdso(11)/64,2)
    +
    742  nscano=mod(kgdso(11)/32,2)
    +
    743  dy=kgdso(13)
    +
    744  hi=(-1.)**iscano
    +
    745  hj=(-1.)**(1-jscano)
    +
    746  dlono=hi*(mod(hi*(rlon2-rlon1)-1+3600,360.)+1)/(ni-1)
    +
    747  dlato=hj*dy/(rerth*cos(rlati/dpr))*dpr
    +
    748  IF(nscano.EQ.0) THEN
    +
    749  CALL sptrunm(iromb,maxwv,idrti,imaxi,jmaxi,km,ni,nj, &
    +
    750  iprime,iskipi,jskipi,mi,mo,0,0,0, &
    +
    751  rlat1,rlon1,dlato,dlono,gi,go)
    +
    752  ispec=1
    +
    753  ENDIF
    +
    754  ENDIF
    +
    755  ! GENERAL SLOW CASE
    +
    756  IF(ispec.EQ.0) THEN
    +
    757  CALL sptrung(iromb,maxwv,idrti,imaxi,jmaxi,km,no, &
    +
    758  iprime,iskipi,jskipi,mi,mo,0,0,0,rlat,rlon,gi,go)
    +
    759  ENDIF
    +
    760  DO k=1,km
    +
    761  ibo(k)=0
    +
    762  DO n=1,no
    +
    763  lo(n,k)=.true.
    +
    764  ENDDO
    +
    765  ENDDO
    +
    766  ELSE
    +
    767  DO k=1,km
    +
    768  ibo(k)=1
    +
    769  DO n=1,no
    +
    770  lo(n,k)=.false.
    +
    771  go(n,k)=0.
    +
    772  ENDDO
    +
    773  ENDDO
    +
    774  ENDIF
    +
    775  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    776  END SUBROUTINE polates4_grib1
    +
    777 
    +
    778 
    +
    888  SUBROUTINE polatev4_grib2(IPOPT,IGDTNUMI,IGDTMPLI,IGDTLENI, &
    +
    889  IGDTNUMO,IGDTMPLO,IGDTLENO, &
    +
    890  MI,MO,KM,IBI,UI,VI, &
    +
    891  NO,RLAT,RLON,CROT,SROT,IBO,LO,UO,VO,IRET)
    +
    892  INTEGER, INTENT(IN ) :: IPOPT(20), IBI(KM)
    +
    893  INTEGER, INTENT(IN ) :: KM, MI, MO
    +
    894  INTEGER, INTENT( OUT) :: IRET, IBO(KM), NO
    +
    895  INTEGER, INTENT(IN ) :: IGDTNUMI, IGDTLENI
    +
    896  INTEGER, INTENT(IN ) :: IGDTMPLI(IGDTLENI)
    +
    897  INTEGER, INTENT(IN ) :: IGDTNUMO, IGDTLENO
    +
    898  INTEGER, INTENT(IN ) :: IGDTMPLO(IGDTLENO)
    +
    899  !
    +
    900  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
    +
    901  !
    +
    902  REAL, INTENT(IN ) :: UI(MI,KM),VI(MI,KM)
    +
    903  REAL, INTENT( OUT) :: UO(MO,KM),VO(MO,KM)
    +
    904  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    905  REAL, INTENT( OUT) :: CROT(MO),SROT(MO)
    +
    906  !
    +
    907  REAL, PARAMETER :: FILL=-9999.
    +
    908  REAL, PARAMETER :: PI=3.14159265358979
    +
    909  REAL, PARAMETER :: DPR=180./pi
    +
    910  !
    +
    911  INTEGER :: IDRTO, IROMB, ISKIPI, ISPEC
    +
    912  INTEGER :: IDRTI, IMAXI, JMAXI, IM, JM
    +
    913  INTEGER :: IPRIME, IG, IMO, JMO, IGO, JGO
    +
    914  INTEGER :: ISCAN, JSCAN, NSCAN
    +
    915  INTEGER :: ISCANO, JSCANO, NSCANO
    +
    916  INTEGER :: ISCALE, IP, IPROJ, JSKIPI, JG
    +
    917  INTEGER :: K, MAXWV, N, NI, NJ, NPS
    +
    918  !
    +
    919  REAL :: DLAT, DLON, DLATO, DLONO, DE, DR, DY
    +
    920  REAL :: E2, H, HI, HJ, DUMM(1)
    +
    921  REAL :: ORIENT, RERTH, SLAT
    +
    922  REAL :: RLAT1, RLON1, RLAT2, RLON2, RLATI
    +
    923  REAL :: UROT, VROT, UO2(MO,KM),VO2(MO,KM)
    +
    924  REAL :: XMESH, XP, YP, XPTS(MO),YPTS(MO)
    +
    925 
    +
    926  type(grib2_descriptor) :: desc_in, desc_out
    +
    927  class(ip_grid), allocatable :: grid_in, grid_out
    +
    928 
    +
    929  desc_in = init_descriptor(igdtnumi, igdtleni, igdtmpli)
    +
    930  desc_out = init_descriptor(igdtnumo, igdtleno, igdtmplo)
    +
    931 
    +
    932  call init_grid(grid_in, desc_in)
    +
    933  call init_grid(grid_out, desc_out)
    +
    934 
    +
    935  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    936  ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
    +
    937  iret=0
    +
    938  IF(igdtnumo.GE.0) THEN
    +
    939  CALL gdswzd(grid_out, 0,mo,fill,xpts,ypts, &
    +
    940  rlon,rlat,no,crot,srot)
    +
    941  IF(no.EQ.0) iret=3
    +
    942  ENDIF
    +
    943  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    944  ! AFFIRM APPROPRIATE INPUT GRID
    +
    945  ! LAT/LON OR GAUSSIAN
    +
    946  ! NO BITMAPS
    +
    947  ! FULL ZONAL COVERAGE
    +
    948  ! FULL MERIDIONAL COVERAGE
    +
    949  idrti=igdtnumi
    +
    950  IF(idrti==40) idrti=4
    +
    951  IF(idrti==0.OR.idrti==4)THEN
    +
    952  im=igdtmpli(8)
    +
    953  jm=igdtmpli(9)
    +
    954  iscale=igdtmpli(10)*igdtmpli(11)
    +
    955  IF(iscale==0) iscale=10**6
    +
    956  rlon1=float(igdtmpli(13))/float(iscale)
    +
    957  rlon2=float(igdtmpli(16))/float(iscale)
    +
    958  iscan=mod(igdtmpli(19)/128,2)
    +
    959  jscan=mod(igdtmpli(19)/64,2)
    +
    960  nscan=mod(igdtmpli(19)/32,2)
    +
    961  ELSE
    +
    962  iret=41
    +
    963  ENDIF
    +
    964  DO k=1,km
    +
    965  IF(ibi(k).NE.0) iret=41
    +
    966  ENDDO
    +
    967  IF(iret.EQ.0) THEN
    +
    968  IF(iscan.EQ.0) THEN
    +
    969  dlon=(mod(rlon2-rlon1-1+3600,360.)+1)/(im-1)
    +
    970  ELSE
    +
    971  dlon=-(mod(rlon1-rlon2-1+3600,360.)+1)/(im-1)
    +
    972  ENDIF
    +
    973  ig=nint(360/abs(dlon))
    +
    974  iprime=1+mod(-nint(rlon1/dlon)+ig,ig)
    +
    975  imaxi=ig
    +
    976  jmaxi=jm
    +
    977  IF(mod(ig,2).NE.0.OR.im.LT.ig) iret=41
    +
    978  ENDIF
    +
    979  IF(iret.EQ.0.AND.idrti.EQ.0) THEN
    +
    980  iscale=igdtmpli(10)*igdtmpli(11)
    +
    981  IF(iscale==0) iscale=10**6
    +
    982  rlat1=float(igdtmpli(12))/float(iscale)
    +
    983  rlat2=float(igdtmpli(15))/float(iscale)
    +
    984  dlat=(rlat2-rlat1)/(jm-1)
    +
    985  jg=nint(180/abs(dlat))
    +
    986  IF(jm.EQ.jg) idrti=256
    +
    987  IF(jm.NE.jg.AND.jm.NE.jg+1) iret=41
    +
    988  ELSEIF(iret.EQ.0.AND.idrti.EQ.4) THEN
    +
    989  jg=igdtmpli(18)*2
    +
    990  IF(jm.NE.jg) iret=41
    +
    991  ENDIF
    +
    992  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    993  ! SET PARAMETERS
    +
    994  IF(iret.EQ.0) THEN
    +
    995  iromb=ipopt(1)
    +
    996  maxwv=ipopt(2)
    +
    997  IF(maxwv.EQ.-1) THEN
    +
    998  IF(iromb.EQ.0.AND.idrti.EQ.4) maxwv=(jmaxi-1)
    +
    999  IF(iromb.EQ.1.AND.idrti.EQ.4) maxwv=(jmaxi-1)/2
    +
    1000  IF(iromb.EQ.0.AND.idrti.EQ.0) maxwv=(jmaxi-3)/2
    +
    1001  IF(iromb.EQ.1.AND.idrti.EQ.0) maxwv=(jmaxi-3)/4
    +
    1002  IF(iromb.EQ.0.AND.idrti.EQ.256) maxwv=(jmaxi-1)/2
    +
    1003  IF(iromb.EQ.1.AND.idrti.EQ.256) maxwv=(jmaxi-1)/4
    +
    1004  ENDIF
    +
    1005  IF((iromb.NE.0.AND.iromb.NE.1).OR.maxwv.LT.0) iret=42
    +
    1006  ENDIF
    +
    1007  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    1008  ! INTERPOLATE
    +
    1009  IF(iret.EQ.0) THEN
    +
    1010  IF(nscan.EQ.0) THEN
    +
    1011  iskipi=1
    +
    1012  jskipi=im
    +
    1013  ELSE
    +
    1014  iskipi=jm
    +
    1015  jskipi=1
    +
    1016  ENDIF
    +
    1017  IF(iscan.EQ.1) iskipi=-iskipi
    +
    1018  IF(jscan.EQ.0) jskipi=-jskipi
    +
    1019  ispec=0
    +
    1020  ! SPECIAL CASE OF GLOBAL CYLINDRICAL GRID
    +
    1021  IF((igdtnumo.EQ.0.OR.igdtnumo.EQ.40).AND. &
    +
    1022  mod(igdtmplo(8),2).EQ.0.AND.igdtmplo(13).EQ.0.AND. &
    +
    1023  igdtmplo(19).EQ.0) THEN
    +
    1024  idrto=igdtnumo
    +
    1025  IF(idrto==40)idrto=4
    +
    1026  imo=igdtmplo(8)
    +
    1027  jmo=igdtmplo(9)
    +
    1028  iscale=igdtmplo(10)*igdtmplo(11)
    +
    1029  IF(iscale==0) iscale=10**6
    +
    1030  rlon2=float(igdtmplo(16))/float(iscale)
    +
    1031  dlono=(mod(rlon2-1+3600,360.)+1)/(imo-1)
    +
    1032  igo=nint(360/abs(dlono))
    +
    1033  IF(imo.EQ.igo.AND.idrto.EQ.0) THEN
    +
    1034  rlat1=float(igdtmplo(12))/float(iscale)
    +
    1035  rlat2=float(igdtmplo(15))/float(iscale)
    +
    1036  dlat=(rlat2-rlat1)/(jmo-1)
    +
    1037  jgo=nint(180/abs(dlat))
    +
    1038  IF(jmo.EQ.jgo) idrto=256
    +
    1039  IF(jmo.EQ.jgo.OR.jmo.EQ.jgo+1) ispec=1
    +
    1040  ELSEIF(imo.EQ.igo.AND.idrto.EQ.4) THEN
    +
    1041  jgo=igdtmplo(18)*2
    +
    1042  IF(jmo.EQ.jgo) ispec=1
    +
    1043  ENDIF
    +
    1044  IF(ispec.EQ.1) THEN
    +
    1045  CALL sptrunv(iromb,maxwv,idrti,imaxi,jmaxi,idrto,imo,jmo, &
    +
    1046  km,iprime,iskipi,jskipi,mi,0,0,mo,0,ui,vi, &
    +
    1047  .true.,uo,vo,.false.,dumm,dumm,.false.,dumm,dumm)
    +
    1048  ENDIF
    +
    1049  ! SPECIAL CASE OF POLAR STEREOGRAPHIC GRID
    +
    1050  ELSEIF(igdtnumo.EQ.20.AND. &
    +
    1051  igdtmplo(8).EQ.igdtmplo(9).AND.mod(igdtmplo(8),2).EQ.1.AND. &
    +
    1052  igdtmplo(15).EQ.igdtmplo(16).AND.igdtmplo(18).EQ.64.AND. &
    +
    1053  mod(igdtmplo(12)/8,2).EQ.1) THEN
    +
    1054  nps=igdtmplo(8)
    +
    1055  rlat1=float(igdtmplo(10))*1.e-6
    +
    1056  rlon1=float(igdtmplo(11))*1.e-6
    +
    1057  orient=float(igdtmplo(14))*1.e-6
    +
    1058  xmesh=float(igdtmplo(15))*1.e-3
    +
    1059  iproj=mod(igdtmplo(17)/128,2)
    +
    1060  ip=(nps+1)/2
    +
    1061  h=(-1.)**iproj
    +
    1062  slat=float(abs(igdtmplo(13)))*1.e-6
    +
    1063  CALL earth_radius(igdtmplo,igdtleno,rerth,e2)
    +
    1064  de=(1.+sin(slat/dpr))*rerth
    +
    1065  dr=de*cos(rlat1/dpr)/(1+h*sin(rlat1/dpr))
    +
    1066  xp=1-h*sin((rlon1-orient)/dpr)*dr/xmesh
    +
    1067  yp=1+cos((rlon1-orient)/dpr)*dr/xmesh
    +
    1068  IF(nint(xp).EQ.ip.AND.nint(yp).EQ.ip) THEN
    +
    1069  IF(iproj.EQ.0) THEN
    +
    1070  CALL sptrunsv(iromb,maxwv,idrti,imaxi,jmaxi,km,nps, &
    +
    1071  iprime,iskipi,jskipi,mi,mo,0,0,0, &
    +
    1072  slat,xmesh,orient,ui,vi,.true.,uo,vo,uo2,vo2, &
    +
    1073  .false.,dumm,dumm,dumm,dumm, &
    +
    1074  .false.,dumm,dumm,dumm,dumm)
    +
    1075  ELSE
    +
    1076  CALL sptrunsv(iromb,maxwv,idrti,imaxi,jmaxi,km,nps, &
    +
    1077  iprime,iskipi,jskipi,mi,mo,0,0,0, &
    +
    1078  slat,xmesh,orient,ui,vi,.true.,uo2,vo2,uo,vo, &
    +
    1079  .false.,dumm,dumm,dumm,dumm, &
    +
    1080  .false.,dumm,dumm,dumm,dumm)
    +
    1081  ENDIF
    +
    1082  ispec=1
    +
    1083  ENDIF
    +
    1084  ! SPECIAL CASE OF MERCATOR GRID
    +
    1085  ELSEIF(igdtnumo.EQ.10) THEN
    +
    1086  ni=igdtmplo(8)
    +
    1087  nj=igdtmplo(9)
    +
    1088  rlat1=float(igdtmplo(10))*1.0e-6
    +
    1089  rlon1=float(igdtmplo(11))*1.0e-6
    +
    1090  rlon2=float(igdtmplo(15))*1.0e-6
    +
    1091  rlati=float(igdtmplo(13))*1.0e-6
    +
    1092  iscano=mod(igdtmplo(16)/128,2)
    +
    1093  jscano=mod(igdtmplo(16)/64,2)
    +
    1094  nscano=mod(igdtmplo(16)/32,2)
    +
    1095  dy=float(igdtmplo(19))*1.0e-3
    +
    1096  hi=(-1.)**iscano
    +
    1097  hj=(-1.)**(1-jscano)
    +
    1098  CALL earth_radius(igdtmplo,igdtleno,rerth,e2)
    +
    1099  dlono=hi*(mod(hi*(rlon2-rlon1)-1+3600,360.)+1)/(ni-1)
    +
    1100  dlato=hj*dy/(rerth*cos(rlati/dpr))*dpr
    +
    1101  IF(nscano.EQ.0) THEN
    +
    1102  CALL sptrunmv(iromb,maxwv,idrti,imaxi,jmaxi,km,ni,nj, &
    +
    1103  iprime,iskipi,jskipi,mi,mo,0,0,0, &
    +
    1104  rlat1,rlon1,dlato,dlono,ui,vi, &
    +
    1105  .true.,uo,vo,.false.,dumm,dumm,.false.,dumm,dumm)
    +
    1106  ispec=1
    +
    1107  ENDIF
    +
    1108  ENDIF
    +
    1109  ! GENERAL SLOW CASE
    +
    1110  IF(ispec.EQ.0) THEN
    +
    1111  CALL sptrungv(iromb,maxwv,idrti,imaxi,jmaxi,km,no, &
    +
    1112  iprime,iskipi,jskipi,mi,mo,0,0,0,rlat,rlon, &
    +
    1113  ui,vi,.true.,uo,vo,.false.,dumm,dumm,.false.,dumm,dumm)
    +
    1114  DO k=1,km
    +
    1115  ibo(k)=0
    +
    1116  DO n=1,no
    +
    1117  lo(n,k)=.true.
    +
    1118  urot=crot(n)*uo(n,k)-srot(n)*vo(n,k)
    +
    1119  vrot=srot(n)*uo(n,k)+crot(n)*vo(n,k)
    +
    1120  uo(n,k)=urot
    +
    1121  vo(n,k)=vrot
    +
    1122  ENDDO
    +
    1123  ENDDO
    +
    1124  ENDIF
    +
    1125  ELSE
    +
    1126  DO k=1,km
    +
    1127  ibo(k)=1
    +
    1128  DO n=1,no
    +
    1129  lo(n,k)=.false.
    +
    1130  uo(n,k)=0.
    +
    1131  vo(n,k)=0.
    +
    1132  ENDDO
    +
    1133  ENDDO
    +
    1134  ENDIF
    +
    1135  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    1136  END SUBROUTINE polatev4_grib2
    +
    1137 
    +
    1222  SUBROUTINE polatev4_grib1(IPOPT,KGDSI,KGDSO,MI,MO,KM,IBI,UI,VI, &
    +
    1223  NO,RLAT,RLON,CROT,SROT,IBO,LO,UO,VO,IRET)
    +
    1224  INTEGER, INTENT(IN ) :: IPOPT(20), IBI(KM)
    +
    1225  INTEGER, INTENT(IN ) :: KM, MI, MO
    +
    1226  INTEGER, INTENT( OUT) :: IRET, IBO(KM)
    +
    1227  INTEGER, INTENT(IN) :: KGDSI(200),KGDSO(200)
    +
    1228  !
    +
    1229  LOGICAL*1, INTENT( OUT) :: LO(MO,KM)
    +
    1230  !
    +
    1231  REAL, INTENT(IN ) :: UI(MI,KM),VI(MI,KM)
    +
    1232  REAL, INTENT( OUT) :: UO(MO,KM),VO(MO,KM)
    +
    1233  REAL, INTENT(INOUT) :: RLAT(MO),RLON(MO)
    +
    1234  REAL, INTENT( OUT) :: CROT(MO),SROT(MO)
    +
    1235  !
    +
    1236  REAL, PARAMETER :: FILL=-9999.
    +
    1237  REAL, PARAMETER :: RERTH=6.3712e6
    +
    1238  REAL, PARAMETER :: PI=3.14159265358979
    +
    1239  REAL, PARAMETER :: DPR=180./pi
    +
    1240  !
    +
    1241  INTEGER :: IDRTO, IROMB, ISKIPI, ISPEC
    +
    1242  INTEGER :: IDRTI, IMAXI, JMAXI, IM, JM
    +
    1243  INTEGER :: IPRIME, IG, IMO, JMO, IGO, JGO
    +
    1244  INTEGER :: ISCAN, JSCAN, NSCAN
    +
    1245  INTEGER :: ISCANO, JSCANO, NSCANO
    +
    1246  INTEGER :: IP, IPROJ, JSKIPI, JG
    +
    1247  INTEGER :: K, MAXWV, N, NI, NJ, NO, NPS
    +
    1248  !
    +
    1249  REAL :: DLAT, DLON, DLATO, DLONO, DE, DR, DY
    +
    1250  REAL :: H, HI, HJ, DUMM(1)
    +
    1251  REAL :: ORIENT
    +
    1252  REAL :: RLAT1, RLON1, RLAT2, RLON2, RLATI
    +
    1253  REAL :: UROT, VROT, UO2(MO,KM),VO2(MO,KM)
    +
    1254  REAL :: XMESH, XP, YP, XPTS(MO),YPTS(MO)
    +
    1255 
    +
    1256  type(grib1_descriptor) :: desc_in, desc_out
    +
    1257  class(ip_grid), allocatable :: grid_in, grid_out
    +
    1258 
    +
    1259  desc_in = init_descriptor(kgdsi)
    +
    1260  desc_out = init_descriptor(kgdso)
    +
    1261 
    +
    1262  call init_grid(grid_in, desc_in)
    +
    1263  call init_grid(grid_out, desc_out)
    +
    1264  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    1265  ! COMPUTE NUMBER OF OUTPUT POINTS AND THEIR LATITUDES AND LONGITUDES.
    +
    1266  iret=0
    +
    1267  IF(kgdso(1).GE.0) THEN
    +
    1268  CALL gdswzd(grid_out, 0,mo,fill,xpts,ypts,rlon,rlat,no,crot,srot)
    +
    1269  IF(no.EQ.0) iret=3
    +
    1270  ENDIF
    +
    1271  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    1272  ! AFFIRM APPROPRIATE INPUT GRID
    +
    1273  ! LAT/LON OR GAUSSIAN
    +
    1274  ! NO BITMAPS
    +
    1275  ! FULL ZONAL COVERAGE
    +
    1276  ! FULL MERIDIONAL COVERAGE
    +
    1277  idrti=kgdsi(1)
    +
    1278  im=kgdsi(2)
    +
    1279  jm=kgdsi(3)
    +
    1280  rlon1=kgdsi(5)*1.e-3
    +
    1281  rlon2=kgdsi(8)*1.e-3
    +
    1282  iscan=mod(kgdsi(11)/128,2)
    +
    1283  jscan=mod(kgdsi(11)/64,2)
    +
    1284  nscan=mod(kgdsi(11)/32,2)
    +
    1285  IF(idrti.NE.0.AND.idrti.NE.4) iret=41
    +
    1286  DO k=1,km
    +
    1287  IF(ibi(k).NE.0) iret=41
    +
    1288  ENDDO
    +
    1289  IF(iret.EQ.0) THEN
    +
    1290  IF(iscan.EQ.0) THEN
    +
    1291  dlon=(mod(rlon2-rlon1-1+3600,360.)+1)/(im-1)
    +
    1292  ELSE
    +
    1293  dlon=-(mod(rlon1-rlon2-1+3600,360.)+1)/(im-1)
    +
    1294  ENDIF
    +
    1295  ig=nint(360/abs(dlon))
    +
    1296  iprime=1+mod(-nint(rlon1/dlon)+ig,ig)
    +
    1297  imaxi=ig
    +
    1298  jmaxi=jm
    +
    1299  IF(mod(ig,2).NE.0.OR.im.LT.ig) iret=41
    +
    1300  ENDIF
    +
    1301  IF(iret.EQ.0.AND.idrti.EQ.0) THEN
    +
    1302  rlat1=kgdsi(4)*1.e-3
    +
    1303  rlat2=kgdsi(7)*1.e-3
    +
    1304  dlat=(rlat2-rlat1)/(jm-1)
    +
    1305  jg=nint(180/abs(dlat))
    +
    1306  IF(jm.EQ.jg) idrti=256
    +
    1307  IF(jm.NE.jg.AND.jm.NE.jg+1) iret=41
    +
    1308  ELSEIF(iret.EQ.0.AND.idrti.EQ.4) THEN
    +
    1309  jg=kgdsi(10)*2
    +
    1310  IF(jm.NE.jg) iret=41
    +
    1311  ENDIF
    +
    1312  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    1313  ! SET PARAMETERS
    +
    1314  IF(iret.EQ.0) THEN
    +
    1315  iromb=ipopt(1)
    +
    1316  maxwv=ipopt(2)
    +
    1317  IF(maxwv.EQ.-1) THEN
    +
    1318  IF(iromb.EQ.0.AND.idrti.EQ.4) maxwv=(jmaxi-1)
    +
    1319  IF(iromb.EQ.1.AND.idrti.EQ.4) maxwv=(jmaxi-1)/2
    +
    1320  IF(iromb.EQ.0.AND.idrti.EQ.0) maxwv=(jmaxi-3)/2
    +
    1321  IF(iromb.EQ.1.AND.idrti.EQ.0) maxwv=(jmaxi-3)/4
    +
    1322  IF(iromb.EQ.0.AND.idrti.EQ.256) maxwv=(jmaxi-1)/2
    +
    1323  IF(iromb.EQ.1.AND.idrti.EQ.256) maxwv=(jmaxi-1)/4
    +
    1324  ENDIF
    +
    1325  IF((iromb.NE.0.AND.iromb.NE.1).OR.maxwv.LT.0) iret=42
    +
    1326  ENDIF
    +
    1327  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    1328  ! INTERPOLATE
    +
    1329  IF(iret.EQ.0) THEN
    +
    1330  IF(nscan.EQ.0) THEN
    +
    1331  iskipi=1
    +
    1332  jskipi=im
    +
    1333  ELSE
    +
    1334  iskipi=jm
    +
    1335  jskipi=1
    +
    1336  ENDIF
    +
    1337  IF(iscan.EQ.1) iskipi=-iskipi
    +
    1338  IF(jscan.EQ.0) jskipi=-jskipi
    +
    1339  ispec=0
    +
    1340  ! SPECIAL CASE OF GLOBAL CYLINDRICAL GRID
    +
    1341  IF((kgdso(1).EQ.0.OR.kgdso(1).EQ.4).AND. &
    +
    1342  mod(kgdso(2),2).EQ.0.AND.kgdso(5).EQ.0.AND. &
    +
    1343  kgdso(11).EQ.0) THEN
    +
    1344  idrto=kgdso(1)
    +
    1345  imo=kgdso(2)
    +
    1346  jmo=kgdso(3)
    +
    1347  rlon2=kgdso(8)*1.e-3
    +
    1348  dlono=(mod(rlon2-1+3600,360.)+1)/(imo-1)
    +
    1349  igo=nint(360/abs(dlono))
    +
    1350  IF(imo.EQ.igo.AND.idrto.EQ.0) THEN
    +
    1351  rlat1=kgdso(4)*1.e-3
    +
    1352  rlat2=kgdso(7)*1.e-3
    +
    1353  dlat=(rlat2-rlat1)/(jmo-1)
    +
    1354  jgo=nint(180/abs(dlat))
    +
    1355  IF(jmo.EQ.jgo) idrto=256
    +
    1356  IF(jmo.EQ.jgo.OR.jmo.EQ.jgo+1) ispec=1
    +
    1357  ELSEIF(imo.EQ.igo.AND.idrto.EQ.4) THEN
    +
    1358  jgo=kgdso(10)*2
    +
    1359  IF(jmo.EQ.jgo) ispec=1
    +
    1360  ENDIF
    +
    1361  IF(ispec.EQ.1) THEN
    +
    1362  CALL sptrunv(iromb,maxwv,idrti,imaxi,jmaxi,idrto,imo,jmo, &
    +
    1363  km,iprime,iskipi,jskipi,mi,0,0,mo,0,ui,vi, &
    +
    1364  .true.,uo,vo,.false.,dumm,dumm,.false.,dumm,dumm)
    +
    1365  ENDIF
    +
    1366  ! SPECIAL CASE OF POLAR STEREOGRAPHIC GRID
    +
    1367  ELSEIF(kgdso(1).EQ.5.AND. &
    +
    1368  kgdso(2).EQ.kgdso(3).AND.mod(kgdso(2),2).EQ.1.AND. &
    +
    1369  kgdso(8).EQ.kgdso(9).AND.kgdso(11).EQ.64.AND. &
    +
    1370  mod(kgdso(6)/8,2).EQ.1) THEN
    +
    1371  nps=kgdso(2)
    +
    1372  rlat1=kgdso(4)*1.e-3
    +
    1373  rlon1=kgdso(5)*1.e-3
    +
    1374  orient=kgdso(7)*1.e-3
    +
    1375  xmesh=kgdso(8)
    +
    1376  iproj=mod(kgdso(10)/128,2)
    +
    1377  ip=(nps+1)/2
    +
    1378  h=(-1.)**iproj
    +
    1379  de=(1.+sin(60./dpr))*rerth
    +
    1380  dr=de*cos(rlat1/dpr)/(1+h*sin(rlat1/dpr))
    +
    1381  xp=1-h*sin((rlon1-orient)/dpr)*dr/xmesh
    +
    1382  yp=1+cos((rlon1-orient)/dpr)*dr/xmesh
    +
    1383  IF(nint(xp).EQ.ip.AND.nint(yp).EQ.ip) THEN
    +
    1384  IF(iproj.EQ.0) THEN
    +
    1385  CALL sptrunsv(iromb,maxwv,idrti,imaxi,jmaxi,km,nps, &
    +
    1386  iprime,iskipi,jskipi,mi,mo,0,0,0, &
    +
    1387  60.,xmesh,orient,ui,vi,.true.,uo,vo,uo2,vo2, &
    +
    1388  .false.,dumm,dumm,dumm,dumm, &
    +
    1389  .false.,dumm,dumm,dumm,dumm)
    +
    1390  ELSE
    +
    1391  CALL sptrunsv(iromb,maxwv,idrti,imaxi,jmaxi,km,nps, &
    +
    1392  iprime,iskipi,jskipi,mi,mo,0,0,0, &
    +
    1393  60.,xmesh,orient,ui,vi,.true.,uo2,vo2,uo,vo, &
    +
    1394  .false.,dumm,dumm,dumm,dumm, &
    +
    1395  .false.,dumm,dumm,dumm,dumm)
    +
    1396  ENDIF
    +
    1397  ispec=1
    +
    1398  ENDIF
    +
    1399  ! SPECIAL CASE OF MERCATOR GRID
    +
    1400  ELSEIF(kgdso(1).EQ.1) THEN
    +
    1401  ni=kgdso(2)
    +
    1402  nj=kgdso(3)
    +
    1403  rlat1=kgdso(4)*1.e-3
    +
    1404  rlon1=kgdso(5)*1.e-3
    +
    1405  rlon2=kgdso(8)*1.e-3
    +
    1406  rlati=kgdso(9)*1.e-3
    +
    1407  iscano=mod(kgdso(11)/128,2)
    +
    1408  jscano=mod(kgdso(11)/64,2)
    +
    1409  nscano=mod(kgdso(11)/32,2)
    +
    1410  dy=kgdso(13)
    +
    1411  hi=(-1.)**iscano
    +
    1412  hj=(-1.)**(1-jscano)
    +
    1413  dlono=hi*(mod(hi*(rlon2-rlon1)-1+3600,360.)+1)/(ni-1)
    +
    1414  dlato=hj*dy/(rerth*cos(rlati/dpr))*dpr
    +
    1415  IF(nscano.EQ.0) THEN
    +
    1416  CALL sptrunmv(iromb,maxwv,idrti,imaxi,jmaxi,km,ni,nj, &
    +
    1417  iprime,iskipi,jskipi,mi,mo,0,0,0, &
    +
    1418  rlat1,rlon1,dlato,dlono,ui,vi, &
    +
    1419  .true.,uo,vo,.false.,dumm,dumm,.false.,dumm,dumm)
    +
    1420  ispec=1
    +
    1421  ENDIF
    +
    1422  ENDIF
    +
    1423  ! GENERAL SLOW CASE
    +
    1424  IF(ispec.EQ.0) THEN
    +
    1425  CALL sptrungv(iromb,maxwv,idrti,imaxi,jmaxi,km,no, &
    +
    1426  iprime,iskipi,jskipi,mi,mo,0,0,0,rlat,rlon, &
    +
    1427  ui,vi,.true.,uo,vo,.false.,dumm,dumm,.false.,dumm,dumm)
    +
    1428  DO k=1,km
    +
    1429  ibo(k)=0
    +
    1430  DO n=1,no
    +
    1431  lo(n,k)=.true.
    +
    1432  urot=crot(n)*uo(n,k)-srot(n)*vo(n,k)
    +
    1433  vrot=srot(n)*uo(n,k)+crot(n)*vo(n,k)
    +
    1434  uo(n,k)=urot
    +
    1435  vo(n,k)=vrot
    +
    1436  ENDDO
    +
    1437  ENDDO
    +
    1438  ENDIF
    +
    1439  ELSE
    +
    1440  DO k=1,km
    +
    1441  ibo(k)=1
    +
    1442  DO n=1,no
    +
    1443  lo(n,k)=.false.
    +
    1444  uo(n,k)=0.
    +
    1445  vo(n,k)=0.
    +
    1446  ENDDO
    +
    1447  ENDDO
    +
    1448  ENDIF
    +
    1449  END SUBROUTINE polatev4_grib1
    +
    1450 end module spectral_interp_mod
    + + + + + + +
    Determine earth radius and shape.
    +
    subroutine, public earth_radius(IGDTMPL, IGDTLEN, RADIUS, ECCEN_SQUARED)
    Determine earth radius and shape.
    +
    Driver module for gdswzd routines.
    Definition: gdswzd_mod.F90:25
    +
    Users derived type grid descriptor objects to abstract away the raw GRIB1 and GRIB2 grid definitions.
    +
    Routines for creating an ip_grid given a Grib descriptor.
    +
    Abstract ip_grid type.
    Definition: ip_grid_mod.F90:10
    +
    Interpolate spectral.
    +
    subroutine polatev4_grib2(IPOPT, IGDTNUMI, IGDTMPLI, IGDTLENI, IGDTNUMO, IGDTMPLO, IGDTLENO, MI, MO, KM, IBI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
    Interpolate vector fields (spectral).
    +
    subroutine interpolate_spectral_scalar(IPOPT, grid_in, grid_out, MI, MO, KM, IBI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
    Interpolate spectral scalar.
    +
    subroutine polates4_grib2(IPOPT, IGDTNUMI, IGDTMPLI, IGDTLENI, IGDTNUMO, IGDTMPLO, IGDTLENO, MI, MO, KM, IBI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
    Interpolate scalar fields (spectral).
    +
    subroutine polates4_grib1(IPOPT, KGDSI, KGDSO, MI, MO, KM, IBI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
    Interpolate scalar fields (spectral).
    +
    subroutine interpolate_spectral_vector(IPOPT, grid_in, grid_out, MI, MO, KM, IBI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
    Interpolate spectral vector.
    +
    subroutine polatev4_grib1(IPOPT, KGDSI, KGDSO, MI, MO, KM, IBI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
    Interpolate vector fields (spectral).
    +
    subroutine sptrun(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, IDRTO, IMAXO, JMAXO, KMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, ISKIPO, JSKIPO, KSKIPO, JCPU, GRIDI, GRIDO)
    This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields...
    Definition: sptrun.f:58
    +
    subroutine sptrung(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NRSKIP, NGSKIP, JCPU, RLAT, RLON, GRIDI, GP)
    This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields...
    Definition: sptrung.f:68
    +
    subroutine sptrungv(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NRSKIP, NGSKIP, JCPU, RLAT, RLON, GRIDUI, GRIDVI, LUV, UP, VP, LDZ, DP, ZP, LPS, PP, SP)
    THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTORS FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELD...
    Definition: sptrungv.f:85
    +
    subroutine sptrunm(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, MI, MJ, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, RLAT1, RLON1, DLAT, DLON, GRIDI, GM)
    This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields...
    Definition: sptrunm.f:80
    +
    subroutine sptrunmv(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, MI, MJ, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, RLAT1, RLON1, DLAT, DLON, GRIDUI, GRIDVI, LUV, UM, VM, LDZ, DM, ZM, LPS, PM, SM)
    THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTOR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELDS...
    Definition: sptrunmv.f:96
    +
    subroutine sptruns(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NPS, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, TRUE, XMESH, ORIENT, GRIDI, GN, GS)
    This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields...
    Definition: sptruns.f:75
    +
    subroutine sptrunsv(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NPS, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, TRUE, XMESH, ORIENT, GRIDUI, GRIDVI, LUV, UN, VN, US, VS, LDZ, DN, ZN, DS, ZS, LPS, PN, SN, PS, SS)
    This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields...
    Definition: sptrunsv.f:94
    +
    subroutine sptrunv(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, IDRTO, IMAXO, JMAXO, KMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, ISKIPO, JSKIPO, KSKIPO, JCPU, GRIDUI, GRIDVI, LUV, GRIDUO, GRIDVO, LDZ, GRIDDO, GRIDZO, LPS, GRIDPO, GRIDSO)
    This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields...
    Definition: sptrunv.f:96
    +
    Descriptor representing a grib1 grib descriptor section (GDS) with an integer array.
    +
    Grib-2 descriptor containing a grib2 GDT represented by an integer array.
    +
    Abstract grid that holds fields and methods common to all grids.
    Definition: ip_grid_mod.F90:58
    +
    +
    + + + + diff --git a/ver-5.1.0/speps_8f.html b/ver-5.1.0/speps_8f.html new file mode 100644 index 00000000..c56a4928 --- /dev/null +++ b/ver-5.1.0/speps_8f.html @@ -0,0 +1,211 @@ + + + + + + + +NCEPLIBS-ip: speps.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    speps.f File Reference
    +
    +
    + +

    Compute utility spectral fields. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine speps (I, M, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
     Computes constant fields indexed in the spectral domain in "IBM ORDER" (Zonal wavenumber is the slower index). More...
     
    +

    Detailed Description

    +

    Compute utility spectral fields.

    +
    Author
    Iredell
    +
    Date
    92-10-31
    + +

    Definition in file speps.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ speps()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine speps ( I,
     M,
    real, dimension((m+1)*((i+1)*m+2)/2) EPS,
    real, dimension(m+1) EPSTOP,
    real, dimension((m+1)*((i+1)*m+2)/2) ENN1,
    real, dimension((m+1)*((i+1)*m+2)/2) ELONN1,
    real, dimension((m+1)*((i+1)*m+2)/2) EON,
    real, dimension(m+1) EONTOP 
    )
    +
    + +

    Computes constant fields indexed in the spectral domain in "IBM ORDER" (Zonal wavenumber is the slower index).

    +

    If L is the zonal wavenumber and N is the total wavenumber and A is the earth radius, then the fields returned are:

      +
    • (1) normalizing factor EPSILON=SQRT((N**2-L**2)/(4*N**2-1))
    • +
    • (2) Laplacian factor N*(N+1)/A**2
    • +
    • (3) zonal derivative/Laplacian factor L/(N*(N+1))*A
    • +
    • (4) Meridional derivative/Laplacian factor EPSILON/N*A
    • +
    +
    Parameters
    + + + + + + + + + +
    Ispectral domain shape (0 for triangular, 1 for rhomboidal)
    Mspectral truncation
    EPS((M+1)*((I+1)*M+2)/2) SQRT((N**2-L**2)/(4*N**2-1))
    EPSTOP(M+1) SQRT((N**2-L**2)/(4*N**2-1)) OVER TOP
    ENN1((M+1)*((I+1)*M+2)/2) N*(N+1)/A**2
    ELONN1((M+1)*((I+1)*M+2)/2) L/(N*(N+1))*A
    EON((M+1)*((I+1)*M+2)/2) EPSILON/N*A
    EONTOP(M+1) EPSILON/N*A OVER TOP
    +
    +
    +
    Author
    Iredell
    +
    Date
    92-10-31
    + +

    Definition at line 25 of file speps.f.

    + +

    Referenced by spwget().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/speps_8f.js b/ver-5.1.0/speps_8f.js new file mode 100644 index 00000000..48596d4c --- /dev/null +++ b/ver-5.1.0/speps_8f.js @@ -0,0 +1,4 @@ +var speps_8f = +[ + [ "speps", "speps_8f.html#a0ab523ec5e1393ffca970897e63a9131", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/speps_8f_source.html b/ver-5.1.0/speps_8f_source.html new file mode 100644 index 00000000..27153cbd --- /dev/null +++ b/ver-5.1.0/speps_8f_source.html @@ -0,0 +1,153 @@ + + + + + + + +NCEPLIBS-ip: speps.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    speps.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Compute utility spectral fields.
    +
    3 C> @author Iredell @date 92-10-31
    +
    4 
    +
    5 C> Computes constant fields indexed in the spectral domain
    +
    6 C> in "IBM ORDER" (Zonal wavenumber is the slower index).
    +
    7 C>
    +
    8 C> If L is the zonal wavenumber and N is the total wavenumber
    +
    9 C> and A is the earth radius, then the fields returned are:
    +
    10 C> - (1) normalizing factor EPSILON=SQRT((N**2-L**2)/(4*N**2-1))
    +
    11 C> - (2) Laplacian factor N*(N+1)/A**2
    +
    12 C> - (3) zonal derivative/Laplacian factor L/(N*(N+1))*A
    +
    13 C> - (4) Meridional derivative/Laplacian factor EPSILON/N*A
    +
    14 C>
    +
    15 C> @param I spectral domain shape (0 for triangular, 1 for rhomboidal)
    +
    16 C> @param M spectral truncation
    +
    17 C> @param EPS ((M+1)*((I+1)*M+2)/2) SQRT((N**2-L**2)/(4*N**2-1))
    +
    18 C> @param EPSTOP (M+1) SQRT((N**2-L**2)/(4*N**2-1)) OVER TOP
    +
    19 C> @param ENN1 ((M+1)*((I+1)*M+2)/2) N*(N+1)/A**2
    +
    20 C> @param ELONN1 ((M+1)*((I+1)*M+2)/2) L/(N*(N+1))*A
    +
    21 C> @param EON ((M+1)*((I+1)*M+2)/2) EPSILON/N*A
    +
    22 C> @param EONTOP (M+1) EPSILON/N*A OVER TOP
    +
    23 C>
    +
    24 C> @author Iredell @date 92-10-31
    +
    25  SUBROUTINE speps(I,M,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP)
    +
    26  REAL EPS((M+1)*((I+1)*M+2)/2),EPSTOP(M+1)
    +
    27  REAL ENN1((M+1)*((I+1)*M+2)/2),ELONN1((M+1)*((I+1)*M+2)/2)
    +
    28  REAL EON((M+1)*((I+1)*M+2)/2),EONTOP(M+1)
    +
    29  parameter(rerth=6.3712e6,ra2=1./rerth**2)
    +
    30 
    +
    31  DO l=0,m
    +
    32  k=l*(2*m+(i-1)*(l-1))/2+l+1
    +
    33  eps(k)=0.
    +
    34  enn1(k)=ra2*l*(l+1)
    +
    35  elonn1(k)=rerth/(l+1)
    +
    36  eon(k)=0.
    +
    37  ENDDO
    +
    38  DO l=0,m
    +
    39  DO n=l+1,i*l+m
    +
    40  k=l*(2*m+(i-1)*(l-1))/2+n+1
    +
    41  eps(k)=sqrt(float(n**2-l**2)/float(4*n**2-1))
    +
    42  enn1(k)=ra2*n*(n+1)
    +
    43  elonn1(k)=rerth*l/(n*(n+1))
    +
    44  eon(k)=rerth/n*eps(k)
    +
    45  ENDDO
    +
    46  ENDDO
    +
    47  DO l=0,m
    +
    48  n=i*l+m+1
    +
    49  epstop(l+1)=sqrt(float(n**2-l**2)/float(4*n**2-1))
    +
    50  eontop(l+1)=rerth/n*epstop(l+1)
    +
    51  ENDDO
    +
    52  RETURN
    +
    53  END
    +
    subroutine speps(I, M, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    Computes constant fields indexed in the spectral domain in "IBM ORDER" (Zonal wavenumber is the slowe...
    Definition: speps.f:26
    +
    +
    + + + + diff --git a/ver-5.1.0/spfft1_8f.html b/ver-5.1.0/spfft1_8f.html new file mode 100644 index 00000000..1aae07f9 --- /dev/null +++ b/ver-5.1.0/spfft1_8f.html @@ -0,0 +1,206 @@ + + + + + + + +NCEPLIBS-ip: spfft1.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    spfft1.f File Reference
    +
    +
    + +

    Perform multiple fast Fourier transforms. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine spfft1 (IMAX, INCW, INCG, KMAX, W, G, IDIR)
     This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space and real values in cyclic physical space. More...
     
    +

    Detailed Description

    +

    Perform multiple fast Fourier transforms.

    +
    Author
    Iredell
    +
    Date
    96-02-20
    + +

    Definition in file spfft1.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ spfft1()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spfft1 (integer, intent(in) IMAX,
    integer, intent(in) INCW,
    integer, intent(in) INCG,
    integer, intent(in) KMAX,
    complex, dimension(incw,kmax), intent(inout) W,
    real, dimension(incg,kmax), intent(inout) G,
    integer, intent(in) IDIR 
    )
    +
    + +

    This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space and real values in cyclic physical space.

    +

    Subprogram spfft1() initializes trigonometric data each call. Use subprogram spfft() to save time and initialize once. This version invokes the IBM ESSL FFT.

    +
    Note
    The restrictions on IMAX are that it must be a multiple of 1 to 25 factors of two, up to 2 factors of three, and up to 1 factor of five, seven and eleven.
    +
    +This subprogram is thread-safe.
    +
    Parameters
    + + + + + + + + +
    IMAXnumber of values in the cyclic physical space (see limitations on imax in remarks below.)
    INCWfirst dimension of the complex amplitude array (INCW >= IMAX/2+1)
    INCGfirst dimension of the real value array (INCG >= IMAX)
    KMAXnumber of transforms to perform
    [out]Wcomplex amplitudes if IDIR>0
    [out]Gvalues if IDIR<0
    IDIRdirection flag
      +
    • IDIR>0 to transform from Fourier to physical space
    • +
    • IDIR<0 to transform from physical to Fourier space
    • +
    +
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-20
    + +

    Definition at line 32 of file spfft1.f.

    + +

    References scrft(), and srcft().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/spfft1_8f.js b/ver-5.1.0/spfft1_8f.js new file mode 100644 index 00000000..d459d959 --- /dev/null +++ b/ver-5.1.0/spfft1_8f.js @@ -0,0 +1,4 @@ +var spfft1_8f = +[ + [ "spfft1", "spfft1_8f.html#ac63643472eda83948c0b249b611346d6", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/spfft1_8f_source.html b/ver-5.1.0/spfft1_8f_source.html new file mode 100644 index 00000000..7e233e21 --- /dev/null +++ b/ver-5.1.0/spfft1_8f_source.html @@ -0,0 +1,164 @@ + + + + + + + +NCEPLIBS-ip: spfft1.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    spfft1.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Perform multiple fast Fourier transforms.
    +
    3 C> @author Iredell @date 96-02-20
    +
    4 
    +
    5 C> This subprogram performs multiple fast Fourier transforms
    +
    6 C> between complex amplitudes in Fourier space and real values
    +
    7 C> in cyclic physical space.
    +
    8 C>
    +
    9 C> Subprogram spfft1() initializes trigonometric data each call.
    +
    10 C> Use subprogram spfft() to save time and initialize once.
    +
    11 C> This version invokes the IBM ESSL FFT.
    +
    12 C>
    +
    13 C> @note The restrictions on IMAX are that it must be a multiple of 1
    +
    14 C> to 25 factors of two, up to 2 factors of three, and up to 1 factor of
    +
    15 C> five, seven and eleven.
    +
    16 C>
    +
    17 C> @note This subprogram is thread-safe.
    +
    18 C>
    +
    19 C> @param IMAX number of values in the cyclic physical space
    +
    20 C> (see limitations on imax in remarks below.)
    +
    21 C> @param INCW first dimension of the complex amplitude array
    +
    22 C> (INCW >= IMAX/2+1)
    +
    23 C> @param INCG first dimension of the real value array (INCG >= IMAX)
    +
    24 C> @param KMAX number of transforms to perform
    +
    25 C> @param[out] W complex amplitudes if IDIR>0
    +
    26 C> @param[out] G values if IDIR<0
    +
    27 C> @param IDIR direction flag
    +
    28 C> - IDIR>0 to transform from Fourier to physical space
    +
    29 C> - IDIR<0 to transform from physical to Fourier space
    +
    30 C>
    +
    31 C> @author Iredell @date 96-02-20
    +
    32  SUBROUTINE spfft1(IMAX,INCW,INCG,KMAX,W,G,IDIR)
    +
    33  IMPLICIT NONE
    +
    34  INTEGER,INTENT(IN):: IMAX,INCW,INCG,KMAX,IDIR
    +
    35  COMPLEX,INTENT(INOUT):: W(INCW,KMAX)
    +
    36  REAL:: WREAL(INCW,KMAX)
    +
    37  REAL,INTENT(INOUT):: G(INCG,KMAX)
    +
    38  REAL:: AUX1(25000+INT(0.82*IMAX))
    +
    39  REAL:: AUX2(20000+INT(0.57*IMAX))
    +
    40  INTEGER:: NAUX1,NAUX2
    +
    41 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    42  naux1=25000+int(0.82*imax)
    +
    43  naux2=20000+int(0.57*imax)
    +
    44  wreal=real(w)
    +
    45 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    46 C FOURIER TO PHYSICAL TRANSFORM.
    +
    47  SELECT CASE(idir)
    +
    48  CASE(1:)
    +
    49  CALL scrft(1,real(w),incw,g,incg,imax,kmax,-1,1.,
    +
    50  & aux1,naux1,aux2,naux2,0.,0)
    +
    51  CALL scrft(0,real(w),incw,g,incg,imax,kmax,-1,1.,
    +
    52  & aux1,naux1,aux2,naux2,0.,0)
    +
    53 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    54 C PHYSICAL TO FOURIER TRANSFORM.
    +
    55  CASE(:-1)
    +
    56  CALL srcft(1,g,incg,wreal,incw,imax,kmax,+1,1./imax,
    +
    57  & aux1,naux1,aux2,naux2,0.,0)
    +
    58  CALL srcft(0,g,incg,wreal,incw,imax,kmax,+1,1./imax,
    +
    59  & aux1,naux1,aux2,naux2,0.,0)
    +
    60  END SELECT
    +
    61  w=cmplx(wreal,0.0)
    +
    62  END SUBROUTINE
    +
    subroutine scrft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
    scrft
    Definition: fftpack.F:82
    +
    subroutine srcft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
    srcft
    Definition: fftpack.F:215
    +
    subroutine spfft1(IMAX, INCW, INCG, KMAX, W, G, IDIR)
    This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space...
    Definition: spfft1.f:33
    +
    +
    + + + + diff --git a/ver-5.1.0/spfft_8f.html b/ver-5.1.0/spfft_8f.html new file mode 100644 index 00000000..6bc0daab --- /dev/null +++ b/ver-5.1.0/spfft_8f.html @@ -0,0 +1,207 @@ + + + + + + + +NCEPLIBS-ip: spfft.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    spfft.f File Reference
    +
    +
    + +

    Perform multiple fast fourier transforms. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine spfft (IMAX, INCW, INCG, KMAX, W, G, IDIR)
     This subprogram performs multiple fast fourier transforms between complex amplitudes in fourier space and real values in cyclic physical space. More...
     
    +

    Detailed Description

    +

    Perform multiple fast fourier transforms.

    +
    Author
    Iredell
    +
    Date
    96-02-20
    + +

    Definition in file spfft.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ spfft()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spfft (integer, intent(in) IMAX,
    integer, intent(in) INCW,
    integer, intent(in) INCG,
    integer, intent(in) KMAX,
    complex, dimension(incw,kmax), intent(inout) W,
    real, dimension(incg,kmax), intent(inout) G,
    integer, intent(in) IDIR 
    )
    +
    + +

    This subprogram performs multiple fast fourier transforms between complex amplitudes in fourier space and real values in cyclic physical space.

    +

    Subprogram spfft must be invoked first with idir=0 to initialize trigonemetric data. Use subprogram spfft1 to perform an fft without previous initialization. This version invokes the ibm essl fft.

    +

    The restrictions on imax are that it must be a multiple of 1 to 25 factors of two, up to 2 factors of three, and up to 1 factor of five, seven and eleven.

    +

    If IDIR=0, then W and G need not contain any valid data. the other parameters must be supplied and cannot change in succeeding calls until the next time it is called with IDIR=0.

    +

    This subprogram is not thread-safe when IDIR=0. On the other hand, when IDIR is not zero, it can be called from a threaded region.

    +
    Parameters
    + + + + + + + + +
    IMAXnumber of values in the cyclic physical space (see limitations on imax in remarks below.)
    INCWfirst dimension of the complex amplitude array (INCW >= IMAX/2+1)
    INCGfirst dimension of the real value array (INCG >= IMAX)
    KMAXnumber of transforms to perform
    [out]Wcomplex amplitudes if IDIR>0
    [out]Greal values if IDIR<0
    IDIRdirection flag
      +
    • IDIR=0 to initialize internal trigonometric data
    • +
    • IDIR>0 TO transform from Fourier to physical space
    • +
    • IDIR<0 TO transform from physical to fourier space
    • +
    +
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-20
    + +

    Definition at line 40 of file spfft.f.

    + +

    References scrft(), and srcft().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/spfft_8f.js b/ver-5.1.0/spfft_8f.js new file mode 100644 index 00000000..f458e16b --- /dev/null +++ b/ver-5.1.0/spfft_8f.js @@ -0,0 +1,4 @@ +var spfft_8f = +[ + [ "spfft", "spfft_8f.html#a1041af8ac4f6a2407b5b7a799a13fb5d", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/spfft_8f_source.html b/ver-5.1.0/spfft_8f_source.html new file mode 100644 index 00000000..8fbb20e0 --- /dev/null +++ b/ver-5.1.0/spfft_8f_source.html @@ -0,0 +1,180 @@ + + + + + + + +NCEPLIBS-ip: spfft.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    spfft.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Perform multiple fast fourier transforms.
    +
    3 C> @author Iredell @date 96-02-20
    +
    4 
    +
    5 C> This subprogram performs multiple fast fourier transforms
    +
    6 C> between complex amplitudes in fourier space and real values
    +
    7 C> in cyclic physical space.
    +
    8 C>
    +
    9 C> Subprogram spfft must be invoked first with idir=0
    +
    10 C> to initialize trigonemetric data. Use subprogram spfft1
    +
    11 C> to perform an fft without previous initialization.
    +
    12 C> This version invokes the ibm essl fft.
    +
    13 C>
    +
    14 C> The restrictions on imax are that it must be a multiple
    +
    15 C> of 1 to 25 factors of two, up to 2 factors of three,
    +
    16 C> and up to 1 factor of five, seven and eleven.
    +
    17 C>
    +
    18 C> If IDIR=0, then W and G need not contain any valid data.
    +
    19 C> the other parameters must be supplied and cannot change
    +
    20 C> in succeeding calls until the next time it is called with IDIR=0.
    +
    21 C>
    +
    22 C> This subprogram is not thread-safe when IDIR=0. On the other hand,
    +
    23 C> when IDIR is not zero, it can be called from a threaded region.
    +
    24 C>
    +
    25 C> @param IMAX number of values in the cyclic physical space
    +
    26 C> (see limitations on imax in remarks below.)
    +
    27 C> @param INCW first dimension of the complex amplitude array
    +
    28 C> (INCW >= IMAX/2+1)
    +
    29 C> @param INCG first dimension of the real value array
    +
    30 C> (INCG >= IMAX)
    +
    31 C> @param KMAX number of transforms to perform
    +
    32 C> @param[out] W complex amplitudes if IDIR>0
    +
    33 C> @param[out] G real values if IDIR<0
    +
    34 C> @param IDIR direction flag
    +
    35 C> - IDIR=0 to initialize internal trigonometric data
    +
    36 C> - IDIR>0 TO transform from Fourier to physical space
    +
    37 C> - IDIR<0 TO transform from physical to fourier space
    +
    38 C>
    +
    39 C> @author Iredell @date 96-02-20
    +
    40  SUBROUTINE spfft(IMAX,INCW,INCG,KMAX,W,G,IDIR)
    +
    41 
    +
    42  IMPLICIT NONE
    +
    43  INTEGER,INTENT(IN):: IMAX,INCW,INCG,KMAX,IDIR
    +
    44  COMPLEX,INTENT(INOUT):: W(INCW,KMAX)
    +
    45  REAL:: WREAL(INCW,KMAX)
    +
    46  REAL,INTENT(INOUT):: G(INCG,KMAX)
    +
    47  INTEGER,SAVE:: NAUX1=0
    +
    48  REAL,SAVE,ALLOCATABLE:: AUX1CR(:),AUX1RC(:)
    +
    49  INTEGER:: NAUX2
    +
    50  REAL:: AUX2(20000+INT(0.57*IMAX))
    +
    51 
    +
    52  naux2=20000+int(0.57*imax)
    +
    53 
    +
    54  wreal=real(w)
    +
    55 C INITIALIZATION.
    +
    56 C ALLOCATE AND FILL AUXILIARY ARRAYS WITH TRIGONOMETRIC DATA
    +
    57  SELECT CASE(idir)
    +
    58  CASE(0)
    +
    59  IF(naux1.GT.0) DEALLOCATE(aux1cr,aux1rc)
    +
    60  naux1=25000+int(0.82*imax)
    +
    61  ALLOCATE(aux1cr(naux1),aux1rc(naux1))
    +
    62  CALL scrft(1,wreal,incw,g,incg,imax,kmax,-1,1.,
    +
    63  & aux1cr,naux1,aux2,naux2,0.,0)
    +
    64  CALL srcft(1,g,incg,wreal,incw,imax,kmax,+1,1./imax,
    +
    65  & aux1rc,naux1,aux2,naux2,0.,0)
    +
    66 
    +
    67 C FOURIER TO PHYSICAL TRANSFORM.
    +
    68  CASE(1:)
    +
    69  CALL scrft(0,wreal,incw,g,incg,imax,kmax,-1,1.,
    +
    70  & aux1cr,naux1,aux2,naux2,0.,0)
    +
    71 
    +
    72 C PHYSICAL TO FOURIER TRANSFORM.
    +
    73  CASE(:-1)
    +
    74  CALL srcft(0,g,incg,wreal,incw,imax,kmax,+1,1./imax,
    +
    75  & aux1rc,naux1,aux2,naux2,0.,0)
    +
    76  END SELECT
    +
    77  w=cmplx(wreal)
    +
    78  END SUBROUTINE
    +
    subroutine scrft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
    scrft
    Definition: fftpack.F:82
    +
    subroutine srcft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
    srcft
    Definition: fftpack.F:215
    +
    subroutine spfft(IMAX, INCW, INCG, KMAX, W, G, IDIR)
    This subprogram performs multiple fast fourier transforms between complex amplitudes in fourier space...
    Definition: spfft.f:41
    +
    +
    + + + + diff --git a/ver-5.1.0/spffte_8f.html b/ver-5.1.0/spffte_8f.html new file mode 100644 index 00000000..4710a7b0 --- /dev/null +++ b/ver-5.1.0/spffte_8f.html @@ -0,0 +1,227 @@ + + + + + + + +NCEPLIBS-ip: spffte.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    spffte.f File Reference
    +
    +
    + +

    Perform multiple fast Fourier transforms. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine spffte (IMAX, INCW, INCG, KMAX, W, G, IDIR, AFFT)
     This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space and real values in cyclic physical space. More...
     
    +

    Detailed Description

    +

    Perform multiple fast Fourier transforms.

    +

    +Program History Log

    + + + + + + + +
    Date Programmer Comments
    1998-12-18 Iredell Initial.
    2012-11-12 Mirvis fixing hard-wired types problem on Intel/Linux.
    +
    Author
    Iredell
    +
    Date
    96-02-20
    + +

    Definition in file spffte.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ spffte()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spffte (integer, intent(in) IMAX,
    integer, intent(in) INCW,
    integer, intent(in) INCG,
    integer, intent(in) KMAX,
    real, dimension(2*incw,kmax), intent(inout) W,
    real, dimension(incg,kmax), intent(inout) G,
    integer, intent(in) IDIR,
    real(8), dimension(50000+4*imax), intent(inout) AFFT 
    )
    +
    + +

    This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space and real values in cyclic physical space.

    +

    This subprogram must be invoked first with IDIR=0 to initialize trigonemetric data. Use subprogram spfft1() to perform an FFT without previous initialization.

    +

    This version invokes the IBM ESSL FFT.

    +
    Note
    The restrictions on IMAX are that it must be a multiple of 1 to 25 factors of two, up to 2 factors of three, and up to 1 factor of five, seven and eleven.
    +

    If IDIR=0, then W and G need not contain any valid data. The other parameters must be supplied and cannot change in succeeding calls until the next time it is called with IDIR=0.

    +

    This subprogram is thread-safe.

    +
    Parameters
    + + + + + + + + + +
    IMAXnumber of values in the cyclic physical space (see limitations on imax in remarks below.)
    INCWfirst dimension of the complex amplitude array (INCW >= IMAX/2+1)
    INCGfirst dimension of the real value array (INCG >= IMAX)
    KMAXnumber of transforms to perform
    [out]Wcomplex amplitudes if IDIR>0
    [out]Greal values if IDIR<0
    IDIRdirection flag
      +
    • IDIR=0 to initialize trigonometric data
    • +
    • IDIR>0 to transform from Fourier to physical space
    • +
    • IDIR<0 to transform from physical to Fourier space
    • +
    +
    [out]AFFTauxiliary array if IDIR<>0
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-20
    + +

    Definition at line 48 of file spffte.f.

    + +

    References dcrft(), drcft(), scrft(), and srcft().

    + +

    Referenced by sptranf0(), and sptranf1().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/spffte_8f.js b/ver-5.1.0/spffte_8f.js new file mode 100644 index 00000000..34e90bee --- /dev/null +++ b/ver-5.1.0/spffte_8f.js @@ -0,0 +1,4 @@ +var spffte_8f = +[ + [ "spffte", "spffte_8f.html#af06489254bd3e99030b39744fce32233", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/spffte_8f_source.html b/ver-5.1.0/spffte_8f_source.html new file mode 100644 index 00000000..69d39699 --- /dev/null +++ b/ver-5.1.0/spffte_8f_source.html @@ -0,0 +1,240 @@ + + + + + + + +NCEPLIBS-ip: spffte.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    spffte.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Perform multiple fast Fourier transforms.
    +
    3 C>
    +
    4 C> ### Program History Log
    +
    5 C> Date | Programmer | Comments
    +
    6 C> -----|------------|---------
    +
    7 C> 1998-12-18 | Iredell | Initial.
    +
    8 C> 2012-11-12 | Mirvis | fixing hard-wired types problem on Intel/Linux.
    +
    9 C>
    +
    10 C> @author Iredell @date 96-02-20
    +
    11 
    +
    12 C> This subprogram performs multiple fast Fourier transforms
    +
    13 C> between complex amplitudes in Fourier space and real values
    +
    14 C> in cyclic physical space.
    +
    15 C>
    +
    16 C> This subprogram must be invoked first with IDIR=0
    +
    17 C> to initialize trigonemetric data. Use subprogram spfft1()
    +
    18 C> to perform an FFT without previous initialization.
    +
    19 C>
    +
    20 C> This version invokes the IBM ESSL FFT.
    +
    21 C>
    +
    22 C> @note The restrictions on IMAX are that it must be a multiple
    +
    23 C> of 1 to 25 factors of two, up to 2 factors of three,
    +
    24 C> and up to 1 factor of five, seven and eleven.
    +
    25 C>
    +
    26 C> If IDIR=0, then W and G need not contain any valid data.
    +
    27 C> The other parameters must be supplied and cannot change
    +
    28 C> in succeeding calls until the next time it is called with IDIR=0.
    +
    29 C>
    +
    30 C> This subprogram is thread-safe.
    +
    31 C>
    +
    32 C> @param IMAX number of values in the cyclic physical space
    +
    33 C> (see limitations on imax in remarks below.)
    +
    34 C> @param INCW first dimension of the complex amplitude array
    +
    35 C> (INCW >= IMAX/2+1)
    +
    36 C> @param INCG first dimension of the real value array
    +
    37 C> (INCG >= IMAX)
    +
    38 C> @param KMAX number of transforms to perform
    +
    39 C> @param[out] W complex amplitudes if IDIR>0
    +
    40 C> @param[out] G real values if IDIR<0
    +
    41 C> @param IDIR direction flag
    +
    42 C> - IDIR=0 to initialize trigonometric data
    +
    43 C> - IDIR>0 to transform from Fourier to physical space
    +
    44 C> - IDIR<0 to transform from physical to Fourier space
    +
    45 C> @param[out] AFFT auxiliary array if IDIR<>0
    +
    46 C>
    +
    47 C> @author Iredell @date 96-02-20
    +
    48  SUBROUTINE spffte(IMAX,INCW,INCG,KMAX,W,G,IDIR,AFFT)
    +
    49  IMPLICIT NONE
    +
    50  INTEGER,INTENT(IN):: IMAX,INCW,INCG,KMAX,IDIR
    +
    51  REAL,INTENT(INOUT):: W(2*INCW,KMAX)
    +
    52  REAL,INTENT(INOUT):: G(INCG,KMAX)
    +
    53  REAL(8),INTENT(INOUT):: AFFT(50000+4*IMAX)
    +
    54  REAL:: AFFTR(50000+4*IMAX)
    +
    55  INTEGER:: INIT,INC2X,INC2Y,N,M,ISIGN,NAUX1,NAUX2,NAUX3
    +
    56 C ==EM== ^(4)
    +
    57  REAL:: SCALE
    +
    58  REAL :: AUX2(20000+2*IMAX),AUX3
    +
    59  INTEGER:: IACR,IARC
    +
    60 
    +
    61  naux1=25000+2*imax
    +
    62  naux2=20000+2*imax
    +
    63  naux3=1
    +
    64  iacr=1
    +
    65  iarc=1+naux1
    +
    66  afftr=real(afft)
    +
    67 
    +
    68 C INITIALIZATION.
    +
    69 C FILL AUXILIARY ARRAYS WITH TRIGONOMETRIC DATA
    +
    70  SELECT CASE(idir)
    +
    71  CASE(0)
    +
    72  init=1
    +
    73  inc2x=incw
    +
    74  inc2y=incg
    +
    75  n=imax
    +
    76  m=kmax
    +
    77  isign=-1
    +
    78  scale=1.
    +
    79  IF(digits(1.).LT.digits(1._8)) THEN
    +
    80  CALL scrft(init,w,inc2x,g,inc2y,n,m,isign,scale,
    +
    81  & afftr(iacr),naux1,aux2,naux2,aux3,naux3)
    +
    82  ELSE
    +
    83  CALL dcrft(init,w,inc2x,g,inc2y,n,m,isign,scale,
    +
    84  & afftr(iacr),naux1,aux2,naux2)
    +
    85  ENDIF
    +
    86  init=1
    +
    87  inc2x=incg
    +
    88  inc2y=incw
    +
    89  n=imax
    +
    90  m=kmax
    +
    91  isign=+1
    +
    92  scale=1./imax
    +
    93  IF(digits(1.).LT.digits(1._8)) THEN
    +
    94  CALL srcft(init,g,inc2x,w,inc2y,n,m,isign,scale,
    +
    95  & afftr(iarc),naux1,aux2,naux2,aux3,naux3)
    +
    96  ELSE
    +
    97  CALL drcft(init,g,inc2x,w,inc2y,n,m,isign,scale,
    +
    98  & afftr(iarc),naux1,aux2,naux2)
    +
    99  ENDIF
    +
    100 
    +
    101 C FOURIER TO PHYSICAL TRANSFORM.
    +
    102  CASE(1:)
    +
    103  init=0
    +
    104  inc2x=incw
    +
    105  inc2y=incg
    +
    106  n=imax
    +
    107  m=kmax
    +
    108  isign=-1
    +
    109  scale=1.
    +
    110  IF(digits(1.).LT.digits(1._8)) THEN
    +
    111  CALL scrft(init,w,inc2x,g,inc2y,n,m,isign,scale,
    +
    112  & afftr(iacr),naux1,aux2,naux2,aux3,naux3)
    +
    113  ELSE
    +
    114  CALL dcrft(init,w,inc2x,g,inc2y,n,m,isign,scale,
    +
    115  & afftr(iacr),naux1,aux2,naux2)
    +
    116  ENDIF
    +
    117 
    +
    118 C PHYSICAL TO FOURIER TRANSFORM.
    +
    119  CASE(:-1)
    +
    120  init=0
    +
    121  inc2x=incg
    +
    122  inc2y=incw
    +
    123  n=imax
    +
    124  m=kmax
    +
    125  isign=+1
    +
    126  scale=1./imax
    +
    127  IF(digits(1.).LT.digits(1._8)) THEN
    +
    128  CALL srcft(init,g,inc2x,w,inc2y,n,m,isign,scale,
    +
    129  & afftr(iarc),naux1,aux2,naux2,aux3,naux3)
    +
    130  ELSE
    +
    131  CALL drcft(init,g,inc2x,w,inc2y,n,m,isign,scale,
    +
    132  & afftr(iarc),naux1,aux2,naux2)
    +
    133  ENDIF
    +
    134  END SELECT
    +
    135  afft=real(afftr,kind=8)
    +
    136  END SUBROUTINE
    +
    subroutine drcft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
    drcft
    Definition: fftpack.F:164
    +
    subroutine dcrft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
    dcrft
    Definition: fftpack.F:34
    +
    subroutine scrft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
    scrft
    Definition: fftpack.F:82
    +
    subroutine srcft(init, x, ldx, y, ldy, n, m, isign, scale, table, n1, wrk, n2, z, nz)
    srcft
    Definition: fftpack.F:215
    +
    subroutine spffte(IMAX, INCW, INCG, KMAX, W, G, IDIR, AFFT)
    This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space...
    Definition: spffte.f:49
    +
    +
    + + + + diff --git a/ver-5.1.0/spfftpt_8f.html b/ver-5.1.0/spfftpt_8f.html new file mode 100644 index 00000000..795ad261 --- /dev/null +++ b/ver-5.1.0/spfftpt_8f.html @@ -0,0 +1,206 @@ + + + + + + + +NCEPLIBS-ip: spfftpt.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    spfftpt.f File Reference
    +
    +
    + +

    Compute fourier transform to gridpoints. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine spfftpt (M, N, INCW, INCG, KMAX, RLON, W, G)
     This subprogram computes a slow Fourier transform from Fourier space to a set of gridpoints. More...
     
    +

    Detailed Description

    +

    Compute fourier transform to gridpoints.

    +
    Author
    Iredell
    +
    Date
    96-02-20
    + +

    Definition in file spfftpt.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ spfftpt()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spfftpt (integer, intent(in) M,
    integer, intent(in) N,
    integer, intent(in) INCW,
    integer, intent(in) INCG,
    integer, intent(in) KMAX,
    real, dimension(n), intent(in) RLON,
    real, dimension(2*incw,kmax), intent(in) W,
    real, dimension(incg,kmax), intent(out) G 
    )
    +
    + +

    This subprogram computes a slow Fourier transform from Fourier space to a set of gridpoints.

    +
    Note
    This subprogram is thread-safe.
    +
    Parameters
    + + + + + + + + + +
    MFourier wavenumber truncation
    Nnumber of gridpoints
    INCWfirst dimension of the complex amplitude array (INCW >= M+1)
    INCGfirst dimension of the gridpoint array (INCG >= N)
    KMAXnumber of Fourier fields
    RLONgrid longitudes in degrees
    WFourier amplitudes
    Ggridpoint values
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-20
    + +

    Definition at line 22 of file spfftpt.f.

    + +

    Referenced by sptgpt(), sptgptsd(), sptgptv(), and sptgptvd().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/spfftpt_8f.js b/ver-5.1.0/spfftpt_8f.js new file mode 100644 index 00000000..a4e4b804 --- /dev/null +++ b/ver-5.1.0/spfftpt_8f.js @@ -0,0 +1,4 @@ +var spfftpt_8f = +[ + [ "spfftpt", "spfftpt_8f.html#ad16e674ce87bd762a714853967f81356", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/spfftpt_8f_source.html b/ver-5.1.0/spfftpt_8f_source.html new file mode 100644 index 00000000..d5574160 --- /dev/null +++ b/ver-5.1.0/spfftpt_8f_source.html @@ -0,0 +1,148 @@ + + + + + + + +NCEPLIBS-ip: spfftpt.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    spfftpt.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Compute fourier transform to gridpoints.
    +
    3 C> @author Iredell @date 96-02-20
    +
    4 
    +
    5 C> This subprogram computes a slow Fourier transform
    +
    6 C> from Fourier space to a set of gridpoints.
    +
    7 C>
    +
    8 C> @note This subprogram is thread-safe.
    +
    9 C>
    +
    10 C> @param M Fourier wavenumber truncation
    +
    11 C> @param N number of gridpoints
    +
    12 C> @param INCW first dimension of the complex amplitude array
    +
    13 C> (INCW >= M+1)
    +
    14 C> @param INCG first dimension of the gridpoint array
    +
    15 C> (INCG >= N)
    +
    16 C> @param KMAX number of Fourier fields
    +
    17 C> @param RLON grid longitudes in degrees
    +
    18 C> @param W Fourier amplitudes
    +
    19 C> @param G gridpoint values
    +
    20 C>
    +
    21 C> @author Iredell @date 96-02-20
    +
    22  SUBROUTINE spfftpt(M,N,INCW,INCG,KMAX,RLON,W,G)
    +
    23 
    +
    24  IMPLICIT NONE
    +
    25  INTEGER,INTENT(IN):: M,N,INCW,INCG,KMAX
    +
    26  REAL,INTENT(IN):: RLON(N)
    +
    27  REAL,INTENT(IN):: W(2*INCW,KMAX)
    +
    28  REAL,INTENT(OUT):: G(INCG,KMAX)
    +
    29  INTEGER I,K,L
    +
    30  REAL RADLON,SLON(M),CLON(M)
    +
    31  REAL,PARAMETER:: PI=3.14159265358979
    +
    32 
    +
    33  DO i=1,n
    +
    34  radlon=pi/180*rlon(i)
    +
    35  DO l=1,m
    +
    36  slon(l)=sin(l*radlon)
    +
    37  clon(l)=cos(l*radlon)
    +
    38  ENDDO
    +
    39  DO k=1,kmax
    +
    40  g(i,k)=w(1,k)
    +
    41  ENDDO
    +
    42  DO l=1,m
    +
    43  DO k=1,kmax
    +
    44  g(i,k)=g(i,k)+2.*(w(2*l+1,k)*clon(l)-w(2*l+2,k)*slon(l))
    +
    45  ENDDO
    +
    46  ENDDO
    +
    47  ENDDO
    +
    48  END SUBROUTINE
    +
    subroutine spfftpt(M, N, INCW, INCG, KMAX, RLON, W, G)
    This subprogram computes a slow Fourier transform from Fourier space to a set of gridpoints.
    Definition: spfftpt.f:23
    +
    +
    + + + + diff --git a/ver-5.1.0/spgradq_8f.html b/ver-5.1.0/spgradq_8f.html new file mode 100644 index 00000000..b1495d40 --- /dev/null +++ b/ver-5.1.0/spgradq_8f.html @@ -0,0 +1,221 @@ + + + + + + + +NCEPLIBS-ip: spgradq.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    spgradq.f File Reference
    +
    +
    + +

    Compute gradient in spectral space. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine spgradq (I, M, ENN1, ELONN1, EON, EONTOP, Q, QDX, QDY, QDYTOP)
     Computes the horizontal vector gradient of a scalar field in spectral space. More...
     
    +

    Detailed Description

    +

    Compute gradient in spectral space.

    +
    Author
    Iredell
    +
    Date
    92-10-31
    + +

    Definition in file spgradq.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ spgradq()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spgradq ( I,
     M,
    real, dimension((m+1)*((i+1)*m+2)/2) ENN1,
    real, dimension((m+1)*((i+1)*m+2)/2) ELONN1,
    real, dimension((m+1)*((i+1)*m+2)/2) EON,
    real, dimension(m+1) EONTOP,
    real, dimension((m+1)*((i+1)*m+2)) Q,
    real, dimension((m+1)*((i+1)*m+2)) QDX,
    real, dimension((m+1)*((i+1)*m+2)) QDY,
    real, dimension(2*(m+1)) QDYTOP 
    )
    +
    + +

    Computes the horizontal vector gradient of a scalar field in spectral space.

    +

    Subprogram speps() should be called already.

    +

    If l is the zonal wavenumber, n is the total wavenumber, eps(l,n)=sqrt((n**2-l**2)/(4*n**2-1)) and a is earth radius, then the zonal gradient of q(l,n) is simply i*l/a*q(l,n) while the meridional gradient of q(l,n) is computed as eps(l,n+1)*(n+2)/a*q(l,n+1)-eps(l,n+1)*(n-1)/a*q(l,n-1).

    +

    Extra terms are computed over top of the spectral domain.

    +

    Advantage is taken of the fact that eps(l,l)=0 in order to vectorize over the entire spectral domain.

    +
    Parameters
    + + + + + + + + + + + +
    Ispectral domain shape (0 for triangular, 1 for rhomboidal)
    Mspectral truncation
    ENN1
    ELONN1
    EONEPSILON/N*A
    EONTOPEPSILON/N*A over top
    Qscalar field
    QDXzonal gradient (times coslat)
    QDYmerid gradient (times coslat)
    QDYTOPmerid gradient (times coslat) over top
    +
    +
    +
    Author
    IREDELL
    +
    Date
    92-10-31
    + +

    Definition at line 33 of file spgradq.f.

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/spgradq_8f.js b/ver-5.1.0/spgradq_8f.js new file mode 100644 index 00000000..f2dc8b8f --- /dev/null +++ b/ver-5.1.0/spgradq_8f.js @@ -0,0 +1,4 @@ +var spgradq_8f = +[ + [ "spgradq", "spgradq_8f.html#a0bb358cf2a405ce9f17c6e5dfde65849", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/spgradq_8f_source.html b/ver-5.1.0/spgradq_8f_source.html new file mode 100644 index 00000000..b1b29ede --- /dev/null +++ b/ver-5.1.0/spgradq_8f_source.html @@ -0,0 +1,166 @@ + + + + + + + +NCEPLIBS-ip: spgradq.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    spgradq.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Compute gradient in spectral space.
    +
    3 C> @author Iredell @date 92-10-31
    +
    4 
    +
    5 C> Computes the horizontal vector gradient of a scalar field
    +
    6 C> in spectral space.
    +
    7 C>
    +
    8 C> Subprogram speps() should be called already.
    +
    9 C>
    +
    10 C> If l is the zonal wavenumber, n is the total wavenumber,
    +
    11 C> eps(l,n)=sqrt((n**2-l**2)/(4*n**2-1)) and a is earth radius,
    +
    12 C> then the zonal gradient of q(l,n) is simply i*l/a*q(l,n)
    +
    13 C> while the meridional gradient of q(l,n) is computed as
    +
    14 C> eps(l,n+1)*(n+2)/a*q(l,n+1)-eps(l,n+1)*(n-1)/a*q(l,n-1).
    +
    15 C>
    +
    16 C> Extra terms are computed over top of the spectral domain.
    +
    17 C>
    +
    18 C> Advantage is taken of the fact that eps(l,l)=0
    +
    19 C> in order to vectorize over the entire spectral domain.
    +
    20 C>
    +
    21 C> @param I spectral domain shape (0 for triangular, 1 for rhomboidal)
    +
    22 C> @param M spectral truncation
    +
    23 C> @param ENN1
    +
    24 C> @param ELONN1
    +
    25 C> @param EON EPSILON/N*A
    +
    26 C> @param EONTOP EPSILON/N*A over top
    +
    27 C> @param Q scalar field
    +
    28 C> @param QDX zonal gradient (times coslat)
    +
    29 C> @param QDY merid gradient (times coslat)
    +
    30 C> @param QDYTOP merid gradient (times coslat) over top
    +
    31 C>
    +
    32 C> @author IREDELL @date 92-10-31
    +
    33  SUBROUTINE spgradq(I,M,ENN1,ELONN1,EON,EONTOP,Q,QDX,QDY,QDYTOP)
    +
    34 
    +
    35  REAL ENN1((M+1)*((I+1)*M+2)/2),ELONN1((M+1)*((I+1)*M+2)/2)
    +
    36  REAL EON((M+1)*((I+1)*M+2)/2),EONTOP(M+1)
    +
    37  REAL Q((M+1)*((I+1)*M+2))
    +
    38  REAL QDX((M+1)*((I+1)*M+2)),QDY((M+1)*((I+1)*M+2))
    +
    39  REAL QDYTOP(2*(M+1))
    +
    40 
    +
    41 C TAKE ZONAL AND MERIDIONAL GRADIENTS
    +
    42  k=1
    +
    43  qdx(2*k-1)=0.
    +
    44  qdx(2*k)=0.
    +
    45  qdy(2*k-1)=eon(k+1)*enn1(k+1)*q(2*k+1)
    +
    46  qdy(2*k)=eon(k+1)*enn1(k+1)*q(2*k+2)
    +
    47  DO k=2,(m+1)*((i+1)*m+2)/2-1
    +
    48  qdx(2*k-1)=-elonn1(k)*enn1(k)*q(2*k)
    +
    49  qdx(2*k)=elonn1(k)*enn1(k)*q(2*k-1)
    +
    50  qdy(2*k-1)=eon(k+1)*enn1(k+1)*q(2*k+1)-eon(k)*enn1(k-1)*q(2*k-3)
    +
    51  qdy(2*k)=eon(k+1)*enn1(k+1)*q(2*k+2)-eon(k)*enn1(k-1)*q(2*k-2)
    +
    52  ENDDO
    +
    53  k=(m+1)*((i+1)*m+2)/2
    +
    54  qdx(2*k-1)=-elonn1(k)*enn1(k)*q(2*k)
    +
    55  qdx(2*k)=elonn1(k)*enn1(k)*q(2*k-1)
    +
    56  qdy(2*k-1)=-eon(k)*enn1(k-1)*q(2*k-3)
    +
    57  qdy(2*k)=-eon(k)*enn1(k-1)*q(2*k-2)
    +
    58 
    +
    59 C TAKE MERIDIONAL GRADIENT OVER TOP
    +
    60  DO l=0,m
    +
    61  k=l*(2*m+(i-1)*(l-1))/2+i*l+m+1
    +
    62  qdytop(2*l+1)=-eontop(l+1)*enn1(k)*q(2*k-1)
    +
    63  qdytop(2*l+2)=-eontop(l+1)*enn1(k)*q(2*k)
    +
    64  ENDDO
    +
    65  RETURN
    +
    66  END
    +
    subroutine spgradq(I, M, ENN1, ELONN1, EON, EONTOP, Q, QDX, QDY, QDYTOP)
    Computes the horizontal vector gradient of a scalar field in spectral space.
    Definition: spgradq.f:34
    +
    +
    + + + + diff --git a/ver-5.1.0/spgradx_8f.html b/ver-5.1.0/spgradx_8f.html new file mode 100644 index 00000000..f18a6604 --- /dev/null +++ b/ver-5.1.0/spgradx_8f.html @@ -0,0 +1,202 @@ + + + + + + + +NCEPLIBS-ip: spgradx.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    spgradx.f File Reference
    +
    +
    + +

    Compute x-gradient in Fourier space. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine spgradx (M, INCW, KMAX, MP, CLAT, W, WX)
     This subprogram computes the x-gradient of fields in complex Fourier space. More...
     
    +

    Detailed Description

    +

    Compute x-gradient in Fourier space.

    +
    Author
    IREDELL
    +
    Date
    96-02-20
    + +

    Definition in file spgradx.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ spgradx()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spgradx (integer, intent(in) M,
    integer, intent(in) INCW,
    integer, intent(in) KMAX,
    integer, dimension(kmax), intent(in) MP,
    real, intent(in) CLAT,
    real, dimension(2*incw,kmax), intent(inout) W,
    real, dimension(2*incw,kmax), intent(out) WX 
    )
    +
    + +

    This subprogram computes the x-gradient of fields in complex Fourier space.

    +

    The x-gradient of a vector field W is WX=CONJG(W)*L/RERTH where L is the wavenumber and RERTH is the Earth radius, so that the result is the x-gradient of the pseudo-vector.

    +

    The x-gradient of a scalar field W is WX=CONJG(W)*L/(RERTH*CLAT) where CLAT is the cosine of latitude.

    +

    At the pole this is undefined, so the way to get the x-gradient at the pole is by passing both the weighted wavenumber 0 and the unweighted wavenumber 1 amplitudes at the pole and setting MP=10. In this case, the wavenumber 1 amplitudes are used to compute the x-gradient and then zeroed out.

    +
    Note
    This subprogram is thread-safe.
    +
    Parameters
    + + + + + + + + +
    MFourier wavenumber truncation
    INCWfirst dimension of the complex amplitude array (INCW >= M+1)
    KMAXnumber of Fourier fields
    MPidentifiers (0 or 10 for scalar, 1 for vector)
    CLATcosine of latitude
    [out]WFourier amplitudes corrected when MP=10 and CLAT=0
    [out]WXcomplex amplitudes of x-gradients
    +
    +
    +
    Author
    IREDELL
    +
    Date
    96-02-20
    + +

    Definition at line 37 of file spgradx.f.

    + +

    Referenced by sptgptsd(), and sptgptvd().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/spgradx_8f.js b/ver-5.1.0/spgradx_8f.js new file mode 100644 index 00000000..b419f805 --- /dev/null +++ b/ver-5.1.0/spgradx_8f.js @@ -0,0 +1,4 @@ +var spgradx_8f = +[ + [ "spgradx", "spgradx_8f.html#a749bc07e763e9cd44490fff2284d00b4", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/spgradx_8f_source.html b/ver-5.1.0/spgradx_8f_source.html new file mode 100644 index 00000000..32de9c2d --- /dev/null +++ b/ver-5.1.0/spgradx_8f_source.html @@ -0,0 +1,172 @@ + + + + + + + +NCEPLIBS-ip: spgradx.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    spgradx.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Compute x-gradient in Fourier space
    +
    3 C> @author IREDELL @date 96-02-20
    +
    4 
    +
    5 C> This subprogram computes the x-gradient of fields
    +
    6 C> in complex Fourier space.
    +
    7 C>
    +
    8 C> The x-gradient of a vector field W is
    +
    9 C> WX=CONJG(W)*L/RERTH
    +
    10 C> where L is the wavenumber and RERTH is the Earth radius,
    +
    11 C> so that the result is the x-gradient of the pseudo-vector.
    +
    12 C>
    +
    13 C> The x-gradient of a scalar field W is
    +
    14 C> WX=CONJG(W)*L/(RERTH*CLAT)
    +
    15 C> where CLAT is the cosine of latitude.
    +
    16 C>
    +
    17 C> At the pole this is undefined, so the way to get
    +
    18 C> the x-gradient at the pole is by passing both
    +
    19 C> the weighted wavenumber 0 and the unweighted wavenumber 1
    +
    20 C> amplitudes at the pole and setting MP=10.
    +
    21 C> In this case, the wavenumber 1 amplitudes are used
    +
    22 C> to compute the x-gradient and then zeroed out.
    +
    23 C>
    +
    24 C> @note This subprogram is thread-safe.
    +
    25 C>
    +
    26 C> @param M Fourier wavenumber truncation
    +
    27 C> @param INCW first dimension of the complex amplitude array
    +
    28 C> (INCW >= M+1)
    +
    29 C> @param KMAX number of Fourier fields
    +
    30 C> @param MP identifiers
    +
    31 C> (0 or 10 for scalar, 1 for vector)
    +
    32 C> @param CLAT cosine of latitude
    +
    33 C> @param[out] W Fourier amplitudes corrected when MP=10 and CLAT=0
    +
    34 C> @param[out] WX complex amplitudes of x-gradients
    +
    35 C>
    +
    36 C> @author IREDELL @date 96-02-20
    +
    37  SUBROUTINE spgradx(M,INCW,KMAX,MP,CLAT,W,WX)
    +
    38 
    +
    39  IMPLICIT NONE
    +
    40  INTEGER,INTENT(IN):: M,INCW,KMAX,MP(KMAX)
    +
    41  REAL,INTENT(IN):: CLAT
    +
    42  REAL,INTENT(INOUT):: W(2*INCW,KMAX)
    +
    43  REAL,INTENT(OUT):: WX(2*INCW,KMAX)
    +
    44  INTEGER K,L
    +
    45  REAL,PARAMETER:: RERTH=6.3712e6
    +
    46 
    +
    47  DO k=1,kmax
    +
    48  IF(mp(k).EQ.1) THEN
    +
    49  DO l=0,m
    +
    50  wx(2*l+1,k)=-w(2*l+2,k)*(l/rerth)
    +
    51  wx(2*l+2,k)=+w(2*l+1,k)*(l/rerth)
    +
    52  ENDDO
    +
    53  ELSEIF(clat.EQ.0.) THEN
    +
    54  DO l=0,m
    +
    55  wx(2*l+1,k)=0
    +
    56  wx(2*l+2,k)=0
    +
    57  ENDDO
    +
    58  IF(mp(k).EQ.10.AND.m.GE.2) THEN
    +
    59  wx(3,k)=-w(4,k)/rerth
    +
    60  wx(4,k)=+w(3,k)/rerth
    +
    61  w(3,k)=0
    +
    62  w(4,k)=0
    +
    63  ENDIF
    +
    64  ELSE
    +
    65  DO l=0,m
    +
    66  wx(2*l+1,k)=-w(2*l+2,k)*(l/(rerth*clat))
    +
    67  wx(2*l+2,k)=+w(2*l+1,k)*(l/(rerth*clat))
    +
    68  ENDDO
    +
    69  ENDIF
    +
    70  ENDDO
    +
    71 
    +
    72  END SUBROUTINE
    +
    subroutine spgradx(M, INCW, KMAX, MP, CLAT, W, WX)
    This subprogram computes the x-gradient of fields in complex Fourier space.
    Definition: spgradx.f:38
    +
    +
    + + + + diff --git a/ver-5.1.0/spgrady_8f.html b/ver-5.1.0/spgrady_8f.html new file mode 100644 index 00000000..fa75c33c --- /dev/null +++ b/ver-5.1.0/spgrady_8f.html @@ -0,0 +1,209 @@ + + + + + + + +NCEPLIBS-ip: spgrady.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    spgrady.f File Reference
    +
    +
    + +

    Compute y-gradient in spectral space. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine spgrady (I, M, ENN1, EON, EONTOP, Q, QDY, QDYTOP)
     Computes the horizontal vector y-gradient of a scalar field in spectral space. More...
     
    +

    Detailed Description

    +

    Compute y-gradient in spectral space.

    +
    Author
    IREDELL
    +
    Date
    92-10-31
    + +

    Definition in file spgrady.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ spgrady()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spgrady ( I,
     M,
    real, dimension((m+1)*((i+1)*m+2)/2) ENN1,
    real, dimension((m+1)*((i+1)*m+2)/2) EON,
    real, dimension(m+1) EONTOP,
    real, dimension((m+1)*((i+1)*m+2)) Q,
    real, dimension((m+1)*((i+1)*m+2)) QDY,
    real, dimension(2*(m+1)) QDYTOP 
    )
    +
    + +

    Computes the horizontal vector y-gradient of a scalar field in spectral space.

    +

    Subprogram speps should be called already.

    +

    If L is the zonal wavenumber, N is the total wavenumber, EPS(L,N)=SQRT((N**2-L**2)/(4*N**2-1)) and A is Earth radius, then the meridional gradient of Q(L,N) is computed as EPS(L,N+1)*(N+2)/A*Q(L,N+1)-EPS(L,N+1)*(N-1)/A*Q(L,N-1).

    +

    Extra terms are computed over top of the spectral domain.

    +

    Advantage is taken of the fact that EPS(L,L)=0 in order to vectorize over the entire spectral domain.

    +
    Parameters
    + + + + + + + + + +
    Ispectral domain shape (0 for triangular, 1 for rhomboidal)
    Mspectral truncation
    ENN1N*(N+1)/A**2
    EONEPSILON/N*A
    EONTOPEPSILON/N*A over top
    Qscalar field
    QDYmerid gradient (times coslat)
    QDYTOPmerid gradient (times coslat) over top
    +
    +
    +
    Author
    IREDELL
    +
    Date
    92-10-31
    + +

    Definition at line 31 of file spgrady.f.

    + +

    Referenced by sptgptsd().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/spgrady_8f.js b/ver-5.1.0/spgrady_8f.js new file mode 100644 index 00000000..f8529204 --- /dev/null +++ b/ver-5.1.0/spgrady_8f.js @@ -0,0 +1,4 @@ +var spgrady_8f = +[ + [ "spgrady", "spgrady_8f.html#a1b3e38e56560de7d7dcf19ea3e931cf1", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/spgrady_8f_source.html b/ver-5.1.0/spgrady_8f_source.html new file mode 100644 index 00000000..1d44b973 --- /dev/null +++ b/ver-5.1.0/spgrady_8f_source.html @@ -0,0 +1,159 @@ + + + + + + + +NCEPLIBS-ip: spgrady.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    spgrady.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Compute y-gradient in spectral space.
    +
    3 C> @author IREDELL @date 92-10-31
    +
    4 
    +
    5 C> Computes the horizontal vector y-gradient of a scalar field
    +
    6 c> in spectral space.
    +
    7 C>
    +
    8 C> Subprogram speps should be called already.
    +
    9 C>
    +
    10 C> If L is the zonal wavenumber, N is the total wavenumber,
    +
    11 C> EPS(L,N)=SQRT((N**2-L**2)/(4*N**2-1)) and A is Earth radius,
    +
    12 C> then the meridional gradient of Q(L,N) is computed as
    +
    13 C> EPS(L,N+1)*(N+2)/A*Q(L,N+1)-EPS(L,N+1)*(N-1)/A*Q(L,N-1).
    +
    14 C>
    +
    15 C> Extra terms are computed over top of the spectral domain.
    +
    16 C>
    +
    17 C> Advantage is taken of the fact that EPS(L,L)=0
    +
    18 C> in order to vectorize over the entire spectral domain.
    +
    19 C>
    +
    20 C> @param I spectral domain shape
    +
    21 c> (0 for triangular, 1 for rhomboidal)
    +
    22 C> @param M spectral truncation
    +
    23 C> @param ENN1 N*(N+1)/A**2
    +
    24 C> @param EON EPSILON/N*A
    +
    25 C> @param EONTOP EPSILON/N*A over top
    +
    26 C> @param Q scalar field
    +
    27 C> @param QDY merid gradient (times coslat)
    +
    28 C> @param QDYTOP merid gradient (times coslat) over top
    +
    29 C>
    +
    30 C> @author IREDELL @date 92-10-31
    +
    31  SUBROUTINE spgrady(I,M,ENN1,EON,EONTOP,Q,QDY,QDYTOP)
    +
    32 
    +
    33  REAL ENN1((M+1)*((I+1)*M+2)/2)
    +
    34  REAL EON((M+1)*((I+1)*M+2)/2),EONTOP(M+1)
    +
    35  REAL Q((M+1)*((I+1)*M+2))
    +
    36  REAL QDY((M+1)*((I+1)*M+2))
    +
    37  REAL QDYTOP(2*(M+1))
    +
    38 
    +
    39 C TAKE MERIDIONAL GRADIENT
    +
    40  k=1
    +
    41  qdy(2*k-1)=eon(k+1)*enn1(k+1)*q(2*k+1)
    +
    42  qdy(2*k)=eon(k+1)*enn1(k+1)*q(2*k+2)
    +
    43  DO k=2,(m+1)*((i+1)*m+2)/2-1
    +
    44  qdy(2*k-1)=eon(k+1)*enn1(k+1)*q(2*k+1)-eon(k)*enn1(k-1)*q(2*k-3)
    +
    45  qdy(2*k)=eon(k+1)*enn1(k+1)*q(2*k+2)-eon(k)*enn1(k-1)*q(2*k-2)
    +
    46  ENDDO
    +
    47  k=(m+1)*((i+1)*m+2)/2
    +
    48  qdy(2*k-1)=-eon(k)*enn1(k-1)*q(2*k-3)
    +
    49  qdy(2*k)=-eon(k)*enn1(k-1)*q(2*k-2)
    +
    50 
    +
    51 C TAKE MERIDIONAL GRADIENT OVER TOP
    +
    52  DO l=0,m
    +
    53  k=l*(2*m+(i-1)*(l-1))/2+i*l+m+1
    +
    54  qdytop(2*l+1)=-eontop(l+1)*enn1(k)*q(2*k-1)
    +
    55  qdytop(2*l+2)=-eontop(l+1)*enn1(k)*q(2*k)
    +
    56  ENDDO
    +
    57 
    +
    58  RETURN
    +
    59  END
    +
    subroutine spgrady(I, M, ENN1, EON, EONTOP, Q, QDY, QDYTOP)
    Computes the horizontal vector y-gradient of a scalar field in spectral space.
    Definition: spgrady.f:32
    +
    +
    + + + + diff --git a/ver-5.1.0/splaplac_8f.html b/ver-5.1.0/splaplac_8f.html new file mode 100644 index 00000000..3589a880 --- /dev/null +++ b/ver-5.1.0/splaplac_8f.html @@ -0,0 +1,197 @@ + + + + + + + +NCEPLIBS-ip: splaplac.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    splaplac.f File Reference
    +
    +
    + +

    Compute laplacian in spectral space. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine splaplac (I, M, ENN1, Q, QD2, IDIR)
     Computes the laplacian or the inverse laplacian of a scalar field in spectral space. More...
     
    +

    Detailed Description

    +

    Compute laplacian in spectral space.

    +
    Author
    Iredell
    +
    Date
    92-10-31
    + +

    Definition in file splaplac.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ splaplac()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine splaplac ( I,
     M,
    real, dimension((m+1)*((i+1)*m+2)/2) ENN1,
    real, dimension((m+1)*((i+1)*m+2)) Q,
    real, dimension((m+1)*((i+1)*m+2)) QD2,
     IDIR 
    )
    +
    + +

    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.

    +

    Subprogram speps() should be called already.

    +

    The Laplacian of Q(L,N) is simply -N*(N+1)/A**2*Q(L,N)

    +
    Parameters
    + + + + + + + +
    Ispectral domain shape (0 for triangular, 1 for rhomboidal)
    Mspectral truncation
    ENN1N*(N+1)/A**2
    [out]Qif IDIR > 0, scalar field (Q(0,0) is not computed)
    [out]QD2if IDIR < 0, Laplacian
    IDIRflag
      +
    • IDIR > 0 to take Laplacian
    • +
    • IDIR < 0 to take inverse Laplacian
    • +
    +
    +
    +
    +
    Author
    Iredell
    +
    Date
    92-10-31
    + +

    Definition at line 24 of file splaplac.f.

    + +

    Referenced by sptgpmd(), sptgpsd(), sptgptd(), sptrand(), sptrungv(), sptrunl(), sptrunmv(), sptrunsv(), and sptrunv().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/splaplac_8f.js b/ver-5.1.0/splaplac_8f.js new file mode 100644 index 00000000..45b0c9dc --- /dev/null +++ b/ver-5.1.0/splaplac_8f.js @@ -0,0 +1,4 @@ +var splaplac_8f = +[ + [ "splaplac", "splaplac_8f.html#a64338955857a3cf58283146940e7ae42", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/splaplac_8f_source.html b/ver-5.1.0/splaplac_8f_source.html new file mode 100644 index 00000000..d73b3247 --- /dev/null +++ b/ver-5.1.0/splaplac_8f_source.html @@ -0,0 +1,149 @@ + + + + + + + +NCEPLIBS-ip: splaplac.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    splaplac.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Compute laplacian in spectral space.
    +
    3 C> @author Iredell @date 92-10-31
    +
    4 
    +
    5 C> Computes the laplacian or the inverse laplacian
    +
    6 C> of a scalar field in spectral space.
    +
    7 C>
    +
    8 C> Subprogram speps() should be called already.
    +
    9 C>
    +
    10 C> The Laplacian of Q(L,N) is simply -N*(N+1)/A**2*Q(L,N)
    +
    11 C>
    +
    12 C> @param I spectral domain shape
    +
    13 C> (0 for triangular, 1 for rhomboidal)
    +
    14 C> @param M spectral truncation
    +
    15 C> @param ENN1 N*(N+1)/A**2
    +
    16 C> @param[out] Q if IDIR > 0, scalar field
    +
    17 C> (Q(0,0) is not computed)
    +
    18 C> @param[out] QD2 if IDIR < 0, Laplacian
    +
    19 C> @param IDIR flag
    +
    20 C> - IDIR > 0 to take Laplacian
    +
    21 C> - IDIR < 0 to take inverse Laplacian
    +
    22 C>
    +
    23 C> @author Iredell @date 92-10-31
    +
    24  SUBROUTINE splaplac(I,M,ENN1,Q,QD2,IDIR)
    +
    25 
    +
    26  REAL ENN1((M+1)*((I+1)*M+2)/2)
    +
    27  REAL Q((M+1)*((I+1)*M+2))
    +
    28  REAL QD2((M+1)*((I+1)*M+2))
    +
    29 
    +
    30 C TAKE LAPLACIAN
    +
    31  IF(idir.GT.0) THEN
    +
    32  k=1
    +
    33  qd2(2*k-1)=0.
    +
    34  qd2(2*k)=0.
    +
    35  DO k=2,(m+1)*((i+1)*m+2)/2
    +
    36  qd2(2*k-1)=q(2*k-1)*(-enn1(k))
    +
    37  qd2(2*k)=q(2*k)*(-enn1(k))
    +
    38  ENDDO
    +
    39 
    +
    40 C TAKE INVERSE LAPLACIAN
    +
    41  ELSE
    +
    42  DO k=2,(m+1)*((i+1)*m+2)/2
    +
    43  q(2*k-1)=qd2(2*k-1)/(-enn1(k))
    +
    44  q(2*k)=qd2(2*k)/(-enn1(k))
    +
    45  ENDDO
    +
    46  ENDIF
    +
    47 
    +
    48  RETURN
    +
    49  END
    +
    subroutine splaplac(I, M, ENN1, Q, QD2, IDIR)
    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
    Definition: splaplac.f:25
    +
    +
    + + + + diff --git a/ver-5.1.0/splat_8F.html b/ver-5.1.0/splat_8F.html new file mode 100644 index 00000000..dc01b1de --- /dev/null +++ b/ver-5.1.0/splat_8F.html @@ -0,0 +1,212 @@ + + + + + + + +NCEPLIBS-ip: splat.F File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    splat.F File Reference
    +
    +
    + +

    Computes cosines of colatitude and Gaussian weights for sets of latitudes. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine splat (IDRT, JMAX, SLAT, WLAT)
     Computes cosines of colatitude and Gaussian weights for one of the following specific global sets of latitudes. More...
     
    +

    Detailed Description

    +

    Computes cosines of colatitude and Gaussian weights for sets of latitudes.

    +

    +Program History Log

    + + + + + + + + + + + + + + + + + + + + + +
    Date Programmer Comments
    96-02-20 Iredell Initial.
    97-10-20 Iredell Adjust precision.
    98-06-11 Iredell Generalize precision using FORTRAN 90 intrinsic.
    1998-12-03 Iredell Generalize precision further.
    1998-12-03 Iredell Uses AIX ESSL BLAS calls.
    2009-12-27 D. Stark Updated to switch between ESSL calls on an AIX platform, and Numerical Recipies calls elsewise.
    2010-12-30 Slovacek Update alignment so preprocessor does not cause compilation failure.
    2012-09-01 E. Mirvis & M.Iredell Merging & debugging linux errors of _d and _8 using generic LU factorization.
    2012-11-05 E. Mirvis Generic FFTPACK and LU lapack were removed.
    +
    Author
    Iredell
    +
    Date
    96-02-20
    + +

    Definition in file splat.F.

    +

    Function/Subroutine Documentation

    + +

    ◆ splat()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine splat ( IDRT,
     JMAX,
    real, dimension(jmax) SLAT,
    real, dimension(jmax) WLAT 
    )
    +
    + +

    Computes cosines of colatitude and Gaussian weights for one of the following specific global sets of latitudes.

    +
      +
    • Gaussian latitudes (IDRT=4)
    • +
    • Equally-spaced latitudes including poles (IDRT=0)
    • +
    • Equally-spaced latitudes excluding poles (IDRT=256)
    • +
    +

    The Gaussian latitudes are located at the zeroes of the Legendre polynomial of the given order. These latitudes are efficient for reversible transforms from spectral space. (About twice as many equally-spaced latitudes are needed.) The weights for the equally-spaced latitudes are based on Ellsaesser (JAM,1966). (No weight is given the pole point.) Note that when analyzing grid to spectral in latitude pairs, if an equator point exists, its weight should be halved. This version invokes the ibm essl matrix solver.

    +
    Parameters
    + + + + + +
    [in]IDRTgrid identifier
      +
    • 4 for Gaussian grid
    • +
    • 0 for equally-spaced grid including poles
    • +
    • 256 for equally-spaced grid excluding poles
    • +
    +
    [in]JMAXnumber of latitudes
    [out]SLATsines of latitude
    [out]WLATGaussian weights
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-20
    + +

    Definition at line 45 of file splat.F.

    + +

    Referenced by ip_gaussian_grid_mod::gdswzd_gaussian(), and sptranf0().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/splat_8F.js b/ver-5.1.0/splat_8F.js new file mode 100644 index 00000000..1bbff9ef --- /dev/null +++ b/ver-5.1.0/splat_8F.js @@ -0,0 +1,4 @@ +var splat_8F = +[ + [ "splat", "splat_8F.html#aa6db21451bb67635e7e4426546140e11", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/splat_8F_source.html b/ver-5.1.0/splat_8F_source.html new file mode 100644 index 00000000..f1408b6e --- /dev/null +++ b/ver-5.1.0/splat_8F_source.html @@ -0,0 +1,304 @@ + + + + + + + +NCEPLIBS-ip: splat.F Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    splat.F
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Computes cosines of colatitude and Gaussian weights
    +
    3 C> for sets of latitudes.
    +
    4 C>
    +
    5 C> ### Program History Log
    +
    6 C> Date | Programmer | Comments
    +
    7 C> -----|------------|---------
    +
    8 C> 96-02-20 | Iredell | Initial.
    +
    9 C> 97-10-20 | Iredell | Adjust precision.
    +
    10 C> 98-06-11 | Iredell | Generalize precision using FORTRAN 90 intrinsic.
    +
    11 C> 1998-12-03 | Iredell | Generalize precision further.
    +
    12 C> 1998-12-03 | Iredell | Uses AIX ESSL BLAS calls.
    +
    13 C> 2009-12-27 | D. Stark | Updated to switch between ESSL calls on an AIX platform, and Numerical Recipies calls elsewise.
    +
    14 C> 2010-12-30 | Slovacek | Update alignment so preprocessor does not cause compilation failure.
    +
    15 C> 2012-09-01 | E. Mirvis & M.Iredell | Merging & debugging linux errors of _d and _8 using generic LU factorization.
    +
    16 C> 2012-11-05 | E. Mirvis | Generic FFTPACK and LU lapack were removed.
    +
    17 C>
    +
    18 C> @author Iredell @date 96-02-20
    +
    19 
    +
    20 C> Computes cosines of colatitude and Gaussian weights
    +
    21 C> for one of the following specific global sets of latitudes.
    +
    22 C> - Gaussian latitudes (IDRT=4)
    +
    23 C> - Equally-spaced latitudes including poles (IDRT=0)
    +
    24 C> - Equally-spaced latitudes excluding poles (IDRT=256)
    +
    25 C>
    +
    26 C> The Gaussian latitudes are located at the zeroes of the
    +
    27 C> Legendre polynomial of the given order. These latitudes
    +
    28 C> are efficient for reversible transforms from spectral space.
    +
    29 C> (About twice as many equally-spaced latitudes are needed.)
    +
    30 C> The weights for the equally-spaced latitudes are based on
    +
    31 C> Ellsaesser (JAM,1966). (No weight is given the pole point.)
    +
    32 C> Note that when analyzing grid to spectral in latitude pairs,
    +
    33 C> if an equator point exists, its weight should be halved.
    +
    34 C> This version invokes the ibm essl matrix solver.
    +
    35 C>
    +
    36 C> @param[in] IDRT grid identifier
    +
    37 C> - 4 for Gaussian grid
    +
    38 C> - 0 for equally-spaced grid including poles
    +
    39 C> - 256 for equally-spaced grid excluding poles
    +
    40 C> @param[in] JMAX number of latitudes
    +
    41 C> @param[out] SLAT sines of latitude
    +
    42 C> @param[out] WLAT Gaussian weights
    +
    43 C>
    +
    44 C> @author Iredell @date 96-02-20
    +
    45  SUBROUTINE splat(IDRT,JMAX,SLAT,WLAT)
    +
    46  REAL SLAT(JMAX),WLAT(JMAX)
    +
    47  INTEGER,PARAMETER:: KD=selected_real_kind(15,45)
    +
    48  REAL(KIND=kd):: pk(jmax/2),pkm1(jmax/2),pkm2(jmax/2)
    +
    49  REAL(KIND=kd):: slatd(jmax/2),sp,spmax,eps=10.*epsilon(sp)
    +
    50  parameter(jz=50)
    +
    51  REAL BZ(JZ)
    +
    52  DATA bz / 2.4048255577, 5.5200781103,
    +
    53  $ 8.6537279129, 11.7915344391, 14.9309177086, 18.0710639679,
    +
    54  $ 21.2116366299, 24.3524715308, 27.4934791320, 30.6346064684,
    +
    55  $ 33.7758202136, 36.9170983537, 40.0584257646, 43.1997917132,
    +
    56  $ 46.3411883717, 49.4826098974, 52.6240518411, 55.7655107550,
    +
    57  $ 58.9069839261, 62.0484691902, 65.1899648002, 68.3314693299,
    +
    58  $ 71.4729816036, 74.6145006437, 77.7560256304, 80.8975558711,
    +
    59  $ 84.0390907769, 87.1806298436, 90.3221726372, 93.4637187819,
    +
    60  $ 96.6052679510, 99.7468198587, 102.888374254, 106.029930916,
    +
    61  $ 109.171489649, 112.313050280, 115.454612653, 118.596176630,
    +
    62  $ 121.737742088, 124.879308913, 128.020877005, 131.162446275,
    +
    63  $ 134.304016638, 137.445588020, 140.587160352, 143.728733573,
    +
    64  $ 146.870307625, 150.011882457, 153.153458019, 156.295034268 /
    +
    65  REAL:: DLT,D1=1.
    +
    66  REAL AWORK((JMAX+1)/2,((JMAX+1)/2)),BWORK(((JMAX+1)/2))
    +
    67  INTEGER:: JHE,JHO,INFO
    +
    68  INTEGER IPVT((JMAX+1)/2)
    +
    69  parameter(pi=3.14159265358979,c=(1.-(2./pi)**2)*0.25)
    +
    70 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    71 C GAUSSIAN LATITUDES
    +
    72  IF(idrt.EQ.4) THEN
    +
    73  jh=jmax/2
    +
    74  jhe=(jmax+1)/2
    +
    75  r=1./sqrt((jmax+0.5)**2+c)
    +
    76  DO j=1,min(jh,jz)
    +
    77  slatd(j)=cos(bz(j)*r)
    +
    78  ENDDO
    +
    79  DO j=jz+1,jh
    +
    80  slatd(j)=cos((bz(jz)+(j-jz)*pi)*r)
    +
    81  ENDDO
    +
    82  spmax=1.
    +
    83  DO WHILE(spmax.GT.eps)
    +
    84  spmax=0.
    +
    85  DO j=1,jh
    +
    86  pkm1(j)=1.
    +
    87  pk(j)=slatd(j)
    +
    88  ENDDO
    +
    89  DO n=2,jmax
    +
    90  DO j=1,jh
    +
    91  pkm2(j)=pkm1(j)
    +
    92  pkm1(j)=pk(j)
    +
    93  pk(j)=((2*n-1)*slatd(j)*pkm1(j)-(n-1)*pkm2(j))/n
    +
    94  ENDDO
    +
    95  ENDDO
    +
    96  DO j=1,jh
    +
    97  sp=pk(j)*(1.-slatd(j)**2)/(jmax*(pkm1(j)-slatd(j)*pk(j)))
    +
    98  slatd(j)=slatd(j)-sp
    +
    99  spmax=max(spmax,abs(sp))
    +
    100  ENDDO
    +
    101  ENDDO
    +
    102 CDIR$ IVDEP
    +
    103  DO j=1,jh
    +
    104  slat(j)=real(slatd(j))
    +
    105  wlat(j)=real((2.*(1.-slatd(j)**2))/(jmax*pkm1(j))**2)
    +
    106  slat(jmax+1-j)=-slat(j)
    +
    107  wlat(jmax+1-j)=wlat(j)
    +
    108  ENDDO
    +
    109  IF(jhe.GT.jh) THEN
    +
    110  slat(jhe)=0.
    +
    111  wlat(jhe)=2./jmax**2
    +
    112  DO n=2,jmax,2
    +
    113  wlat(jhe)=wlat(jhe)*n**2/(n-1)**2
    +
    114  ENDDO
    +
    115  ENDIF
    +
    116 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    117 C EQUALLY-SPACED LATITUDES INCLUDING POLES
    +
    118  ELSEIF(idrt.EQ.0) THEN
    +
    119  jh=jmax/2
    +
    120  jhe=(jmax+1)/2
    +
    121  jho=jhe-1
    +
    122  dlt=pi/(jmax-1)
    +
    123  slat(1)=1.
    +
    124  DO j=2,jh
    +
    125  slat(j)=cos((j-1)*dlt)
    +
    126  ENDDO
    +
    127  DO js=1,jho
    +
    128  DO j=1,jho
    +
    129  awork(js,j)=cos(2*(js-1)*j*dlt)
    +
    130  ENDDO
    +
    131  ENDDO
    +
    132  DO js=1,jho
    +
    133  bwork(js)=-d1/(4*(js-1)**2-1)
    +
    134  ENDDO
    +
    135 
    +
    136  ! Call LAPACK routines
    +
    137 #if (LSIZE==4)
    +
    138  CALL sgetrf(jho, jho, awork, jhe, ipvt, info)
    +
    139  CALL sgetrs('N', jho, 1, awork, jhe, ipvt, bwork, jho, info)
    +
    140 #else
    +
    141  CALL dgetrf(jho, jho, awork, jhe, ipvt, info)
    +
    142  CALL dgetrs('N', jho, 1, awork, jhe, ipvt, bwork, jho, info)
    +
    143 #endif
    +
    144 
    +
    145  wlat(1)=0.
    +
    146  DO j=1,jho
    +
    147  wlat(j+1)=bwork(j)
    +
    148  ENDDO
    +
    149 CDIR$ IVDEP
    +
    150  DO j=1,jh
    +
    151  print *, j, jmax, jmax+1-j
    +
    152  slat(jmax+1-j)=-slat(j)
    +
    153  wlat(jmax+1-j)=wlat(j)
    +
    154  ENDDO
    +
    155  IF(jhe.GT.jh) THEN
    +
    156  slat(jhe)=0.
    +
    157  wlat(jhe)=2.*wlat(jhe)
    +
    158  ENDIF
    +
    159 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    160 C EQUALLY-SPACED LATITUDES EXCLUDING POLES
    +
    161  ELSEIF(idrt.EQ.256) THEN
    +
    162  jh=jmax/2
    +
    163  jhe=(jmax+1)/2
    +
    164  jho=jhe
    +
    165  dlt=pi/jmax
    +
    166  slat(1)=1.
    +
    167  DO j=1,jh
    +
    168  slat(j)=cos((j-0.5)*dlt)
    +
    169  ENDDO
    +
    170  DO js=1,jho
    +
    171  DO j=1,jho
    +
    172  awork(js,j)=cos(2*(js-1)*(j-0.5)*dlt)
    +
    173  ENDDO
    +
    174  ENDDO
    +
    175  DO js=1,jho
    +
    176  bwork(js)=-d1/(4*(js-1)**2-1)
    +
    177  ENDDO
    +
    178 
    +
    179  ! Call LAPACK routines
    +
    180 #if (LSIZE==4)
    +
    181  CALL sgetrf(jho, jho, awork, jhe, ipvt, info)
    +
    182  CALL sgetrs('N', jho, 1, awork, jhe, ipvt, bwork, jho, info)
    +
    183 #else
    +
    184  CALL dgetrf(jho, jho, awork, jhe, ipvt, info)
    +
    185  CALL dgetrs('N', jho, 1, awork, jhe, ipvt, bwork, jho, info)
    +
    186 #endif
    +
    187 
    +
    188  wlat(1)=0.
    +
    189  DO j=1,jho
    +
    190  wlat(j)=bwork(j)
    +
    191  ENDDO
    +
    192 CDIR$ IVDEP
    +
    193  DO j=1,jh
    +
    194  slat(jmax+1-j)=-slat(j)
    +
    195  wlat(jmax+1-j)=wlat(j)
    +
    196  ENDDO
    +
    197  IF(jhe.GT.jh) THEN
    +
    198  slat(jhe)=0.
    +
    199  wlat(jhe)=2.*wlat(jhe)
    +
    200  ENDIF
    +
    201  ENDIF
    +
    202 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    203  RETURN
    +
    204  END
    +
    subroutine splat(IDRT, JMAX, SLAT, WLAT)
    Computes cosines of colatitude and Gaussian weights for one of the following specific global sets of ...
    Definition: splat.F:46
    +
    +
    + + + + diff --git a/ver-5.1.0/splegend_8f.html b/ver-5.1.0/splegend_8f.html new file mode 100644 index 00000000..60627878 --- /dev/null +++ b/ver-5.1.0/splegend_8f.html @@ -0,0 +1,217 @@ + + + + + + + +NCEPLIBS-ip: splegend.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    splegend.f File Reference
    +
    +
    + +

    Compute Legendre polynomials. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine splegend (I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
     Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude. More...
     
    +

    Detailed Description

    +

    Compute Legendre polynomials.

    +
    Author
    IREDELL
    +
    Date
    92-10-31
    + +

    Definition in file splegend.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ splegend()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine splegend ( I,
     M,
     SLAT,
     CLAT,
    real, dimension((m+1)*((i+1)*m+2)/2) EPS,
    real, dimension(m+1) EPSTOP,
    real, dimension((m+1)*((i+1)*m+2)/2) PLN,
    real, dimension(m+1) PLNTOP 
    )
    +
    + +

    Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.

    +

    Subprogram splegend should be called already. If l is the zonal wavenumber, N is the total wavenumber, and EPS(L,N)=SQRT((N**2-L**2)/(4*N**2-1)) then the following bootstrapping formulas are used:

    +
    + PLN(0,0)=SQRT(0.5)
    + PLN(L,L)=PLN(L-1,L-1)*CLAT*SQRT(FLOAT(2*L+1)/FLOAT(2*L))
    + PLN(L,N)=(SLAT*PLN(L,N-1)-EPS(L,N-1)*PLN(L,N-2))/EPS(L,N)
    + 

    Synthesis at the pole needs only two zonal wavenumbers. Scalar fields are synthesized with zonal wavenumber 0 while vector fields are synthesized with zonal wavenumber 1. (Thus polar vector fields are implicitly divided by clat.) The following bootstrapping formulas are used at the pole:

    +
    + PLN(0,0)=SQRT(0.5)
    + PLN(1,1)=SQRT(0.75)
    + PLN(L,N)=(PLN(L,N-1)-EPS(L,N-1)*PLN(L,N-2))/EPS(L,N)
    + 

    PROGRAM HISTORY LOG:

      +
    • 91-10-31 MARK IREDELL
    • +
    • 98-06-10 MARK IREDELL GENERALIZE PRECISION
    • +
    +
    Parameters
    + + + + + + + + + +
    I- INTEGER SPECTRAL DOMAIN SHAPE (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    M- INTEGER SPECTRAL TRUNCATION
    SLAT- REAL SINE OF LATITUDE
    CLAT- REAL COSINE OF LATITUDE
    EPS- REAL ((M+1)*((I+1)*M+2)/2) SQRT((N**2-L**2)/(4*N**2-1))
    EPSTOP- REAL (M+1) SQRT((N**2-L**2)/(4*N**2-1)) OVER TOP
    [out]PLN- REAL ((M+1)*((I+1)*M+2)/2) LEGENDRE POLYNOMIAL
    [out]PLNTOP- REAL (M+1) LEGENDRE POLYNOMIAL OVER TOP
    +
    +
    + +

    Definition at line 44 of file splegend.f.

    + +

    Referenced by sptgpm(), sptgpmv(), sptgps(), sptgpsv(), sptgpt(), sptgptsd(), sptgptv(), sptgptvd(), and sptranf0().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/splegend_8f.js b/ver-5.1.0/splegend_8f.js new file mode 100644 index 00000000..8ab7c002 --- /dev/null +++ b/ver-5.1.0/splegend_8f.js @@ -0,0 +1,4 @@ +var splegend_8f = +[ + [ "splegend", "splegend_8f.html#a9c68adc80e97c43ac983b955dd6cabac", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/splegend_8f_source.html b/ver-5.1.0/splegend_8f_source.html new file mode 100644 index 00000000..0259094a --- /dev/null +++ b/ver-5.1.0/splegend_8f_source.html @@ -0,0 +1,238 @@ + + + + + + + +NCEPLIBS-ip: splegend.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    splegend.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C>
    +
    3 C> Compute Legendre polynomials
    +
    4 C> @author IREDELL @date 92-10-31
    +
    5 
    +
    6 C> Evaluates the orthonormal associated Legendre polynomials in the
    +
    7 C> spectral domain at a given latitude. Subprogram splegend should
    +
    8 C> be called already. If l is the zonal wavenumber, N is the total
    +
    9 C> wavenumber, and EPS(L,N)=SQRT((N**2-L**2)/(4*N**2-1)) then the
    +
    10 C> following bootstrapping formulas are used:
    +
    11 C>
    +
    12 C> <pre>
    +
    13 C> PLN(0,0)=SQRT(0.5)
    +
    14 C> PLN(L,L)=PLN(L-1,L-1)*CLAT*SQRT(FLOAT(2*L+1)/FLOAT(2*L))
    +
    15 C> PLN(L,N)=(SLAT*PLN(L,N-1)-EPS(L,N-1)*PLN(L,N-2))/EPS(L,N)
    +
    16 C> </pre>
    +
    17 C>
    +
    18 C> Synthesis at the pole needs only two zonal wavenumbers. Scalar
    +
    19 C> fields are synthesized with zonal wavenumber 0 while vector
    +
    20 C> fields are synthesized with zonal wavenumber 1. (Thus polar
    +
    21 C> vector fields are implicitly divided by clat.) The following
    +
    22 C> bootstrapping formulas are used at the pole:
    +
    23 C>
    +
    24 C> <pre>
    +
    25 C> PLN(0,0)=SQRT(0.5)
    +
    26 C> PLN(1,1)=SQRT(0.75)
    +
    27 C> PLN(L,N)=(PLN(L,N-1)-EPS(L,N-1)*PLN(L,N-2))/EPS(L,N)
    +
    28 C> </pre>
    +
    29 C>
    +
    30 C> PROGRAM HISTORY LOG:
    +
    31 C> - 91-10-31 MARK IREDELL
    +
    32 C> - 98-06-10 MARK IREDELL GENERALIZE PRECISION
    +
    33 C>
    +
    34 C> @param I - INTEGER SPECTRAL DOMAIN SHAPE
    +
    35 C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    +
    36 C> @param M - INTEGER SPECTRAL TRUNCATION
    +
    37 C> @param SLAT - REAL SINE OF LATITUDE
    +
    38 C> @param CLAT - REAL COSINE OF LATITUDE
    +
    39 C> @param EPS - REAL ((M+1)*((I+1)*M+2)/2) SQRT((N**2-L**2)/(4*N**2-1))
    +
    40 C> @param EPSTOP - REAL (M+1) SQRT((N**2-L**2)/(4*N**2-1)) OVER TOP
    +
    41 C> @param[out] PLN - REAL ((M+1)*((I+1)*M+2)/2) LEGENDRE POLYNOMIAL
    +
    42 C> @param[out] PLNTOP - REAL (M+1) LEGENDRE POLYNOMIAL OVER TOP
    +
    43 C>
    +
    44  SUBROUTINE splegend(I,M,SLAT,CLAT,EPS,EPSTOP,PLN,PLNTOP)
    +
    45 
    +
    46 CFPP$ NOCONCUR R
    +
    47  REAL EPS((M+1)*((I+1)*M+2)/2),EPSTOP(M+1)
    +
    48  REAL PLN((M+1)*((I+1)*M+2)/2),PLNTOP(M+1)
    +
    49  REAL(KIND=selected_real_kind(15,45)):: dln((m+1)*((i+1)*m+2)/2)
    +
    50  REAL :: TINYREAL=tiny(1.0), rdln1, rdln2
    +
    51 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    52 C ITERATIVELY COMPUTE PLN WITHIN SPECTRAL DOMAIN AT POLE
    +
    53  m1=m+1
    +
    54  m2=2*m+i+1
    +
    55  mx=(m+1)*((i+1)*m+2)/2
    +
    56  IF(abs(clat).LT.tinyreal) THEN
    +
    57  dln(1)=sqrt(0.5)
    +
    58  IF(m.GT.0) THEN
    +
    59  dln(m1+1)=sqrt(0.75)
    +
    60  dln(2)=slat*dln(1)/eps(2)
    +
    61  ENDIF
    +
    62  IF(m.GT.1) THEN
    +
    63  dln(m1+2)=slat*dln(m1+1)/eps(m1+2)
    +
    64  dln(3)=(slat*dln(2)-eps(2)*dln(1))/eps(3)
    +
    65  DO n=3,m
    +
    66  k=1+n
    +
    67  dln(k)=(slat*dln(k-1)-eps(k-1)*dln(k-2))/eps(k)
    +
    68  k=m1+n
    +
    69  dln(k)=(slat*dln(k-1)-eps(k-1)*dln(k-2))/eps(k)
    +
    70  ENDDO
    +
    71  IF(i.EQ.1) THEN
    +
    72  k=m2
    +
    73  dln(k)=(slat*dln(k-1)-eps(k-1)*dln(k-2))/eps(k)
    +
    74  ENDIF
    +
    75  DO k=m2+1,mx
    +
    76  dln(k)=0.
    +
    77  ENDDO
    +
    78  ENDIF
    +
    79 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    80 C COMPUTE POLYNOMIALS OVER TOP OF SPECTRAL DOMAIN
    +
    81  k=m1+1
    +
    82  rdln1=real(dln(k-1))
    +
    83  rdln2=real(dln(k-2))
    +
    84  plntop(1)=(slat*rdln1-eps(k-1)*rdln2)/epstop(1)
    +
    85  IF(m.GT.0) THEN
    +
    86  k=m2+1
    +
    87  rdln1=real(dln(k-1))
    +
    88  rdln2=real(dln(k-2))
    +
    89  plntop(2)=(slat*rdln1-eps(k-1)*rdln2)/epstop(2)
    +
    90  DO l=2,m
    +
    91  plntop(l+1)=0.
    +
    92  ENDDO
    +
    93  ENDIF
    +
    94 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    95 C ITERATIVELY COMPUTE PLN(L,L) (BOTTOM HYPOTENUSE OF DOMAIN)
    +
    96  ELSE
    +
    97  nml=0
    +
    98  k=1
    +
    99  dln(k)=sqrt(0.5)
    +
    100  DO l=1,m+(i-1)*nml
    +
    101  kp=k
    +
    102  k=l*(2*m+(i-1)*(l-1))/2+l+nml+1
    +
    103  dln(k)=dln(kp)*clat*sqrt(float(2*l+1)/float(2*l))
    +
    104  ENDDO
    +
    105 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    106 C COMPUTE PLN(L,L+1) (DIAGONAL NEXT TO BOTTOM HYPOTENUSE OF DOMAIN)
    +
    107  nml=1
    +
    108 CDIR$ IVDEP
    +
    109  DO l=0,m+(i-1)*nml
    +
    110  k=l*(2*m+(i-1)*(l-1))/2+l+nml+1
    +
    111  dln(k)=slat*dln(k-1)/eps(k)
    +
    112  ENDDO
    +
    113 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    114 C COMPUTE REMAINING PLN IN SPECTRAL DOMAIN
    +
    115  DO nml=2,m
    +
    116 CDIR$ IVDEP
    +
    117  DO l=0,m+(i-1)*nml
    +
    118  k=l*(2*m+(i-1)*(l-1))/2+l+nml+1
    +
    119  dln(k)=(slat*dln(k-1)-eps(k-1)*dln(k-2))/eps(k)
    +
    120  ENDDO
    +
    121  ENDDO
    +
    122 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    123 C COMPUTE POLYNOMIALS OVER TOP OF SPECTRAL DOMAIN
    +
    124  DO l=0,m
    +
    125  nml=m+1+(i-1)*l
    +
    126  k=l*(2*m+(i-1)*(l-1))/2+l+nml+1
    +
    127  rdln1=real(dln(k-1))
    +
    128  rdln2=real(dln(k-2))
    +
    129  plntop(l+1)=(slat*rdln1-eps(k-1)*rdln2)/epstop(l+1)
    +
    130  ENDDO
    +
    131  ENDIF
    +
    132 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    133 C RETURN VALUES
    +
    134  DO k=1,mx
    +
    135  pln(k)=real(dln(k))
    +
    136  ENDDO
    +
    137  RETURN
    +
    138  END
    +
    subroutine splegend(I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
    Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
    Definition: splegend.f:45
    +
    +
    + + + + diff --git a/ver-5.1.0/splitbar.png b/ver-5.1.0/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/ver-5.1.0/sppad_8f.html b/ver-5.1.0/sppad_8f.html new file mode 100644 index 00000000..89bd770b --- /dev/null +++ b/ver-5.1.0/sppad_8f.html @@ -0,0 +1,189 @@ + + + + + + + +NCEPLIBS-ip: sppad.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sppad.f File Reference
    +
    +
    + +

    Pad or truncate a spectral field. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sppad (I1, M1, Q1, I2, M2, Q2)
     Pad or truncate a spectral field. More...
     
    +

    Detailed Description

    +

    Pad or truncate a spectral field.

    +
    Author
    Iredell
    +
    Date
    92-10-31
    + +

    Definition in file sppad.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sppad()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sppad ( I1,
     M1,
    real, dimension((m1+1)*((i1+1)*m1+2)) Q1,
     I2,
     M2,
    real, dimension((m2+1)*((i2+1)*m2+2)) Q2 
    )
    +
    + +

    Pad or truncate a spectral field.

    +
    Parameters
    + + + + + + + +
    I1input spectral domain shape (0 for triangular, 1 for rhomboidal)
    M1input spectral truncation
    Q1((M+1)*((I+1)*M+2)) input field
    I2output spectral domain shape (0 for triangular, 1 for rhomboidal)
    M2output spectral truncation
    Q2((M+1)*((I+1)*M+2)) output field
    +
    +
    +
    Author
    Iredell
    +
    Date
    92-10-31
    + +

    Definition at line 17 of file sppad.f.

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sppad_8f.js b/ver-5.1.0/sppad_8f.js new file mode 100644 index 00000000..a47faa1f --- /dev/null +++ b/ver-5.1.0/sppad_8f.js @@ -0,0 +1,4 @@ +var sppad_8f = +[ + [ "sppad", "sppad_8f.html#a4338b3ccd7844251bbdabf3da1d6476e", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sppad_8f_source.html b/ver-5.1.0/sppad_8f_source.html new file mode 100644 index 00000000..fae04c86 --- /dev/null +++ b/ver-5.1.0/sppad_8f_source.html @@ -0,0 +1,136 @@ + + + + + + + +NCEPLIBS-ip: sppad.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sppad.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Pad or truncate a spectral field.
    +
    3 C> @author Iredell @date 92-10-31
    +
    4 
    +
    5 C> Pad or truncate a spectral field.
    +
    6 C>
    +
    7 C> @param I1 input spectral domain shape
    +
    8 C> (0 for triangular, 1 for rhomboidal)
    +
    9 C> @param M1 input spectral truncation
    +
    10 C> @param Q1 ((M+1)*((I+1)*M+2)) input field
    +
    11 C> @param I2 output spectral domain shape
    +
    12 C> (0 for triangular, 1 for rhomboidal)
    +
    13 C> @param M2 output spectral truncation
    +
    14 C> @param Q2 ((M+1)*((I+1)*M+2)) output field
    +
    15 C>
    +
    16 C> @author Iredell @date 92-10-31
    +
    17  SUBROUTINE sppad(I1,M1,Q1,I2,M2,Q2)
    +
    18 
    +
    19  REAL Q1((M1+1)*((I1+1)*M1+2))
    +
    20  REAL Q2((M2+1)*((I2+1)*M2+2))
    +
    21 
    +
    22  DO l=0,m2
    +
    23  DO n=l,i2*l+m2
    +
    24  ks2=l*(2*m2+(i2-1)*(l-1))+2*n
    +
    25  IF(l.LE.m1.AND.n.LE.i1*l+m1) THEN
    +
    26  ks1=l*(2*m1+(i1-1)*(l-1))+2*n
    +
    27  q2(ks2+1)=q1(ks1+1)
    +
    28  q2(ks2+2)=q1(ks1+2)
    +
    29  ELSE
    +
    30  q2(ks2+1)=0
    +
    31  q2(ks2+2)=0
    +
    32  ENDIF
    +
    33  ENDDO
    +
    34  ENDDO
    +
    35  RETURN
    +
    36  END
    +
    subroutine sppad(I1, M1, Q1, I2, M2, Q2)
    Pad or truncate a spectral field.
    Definition: sppad.f:18
    +
    +
    + + + + diff --git a/ver-5.1.0/spsynth_8f.html b/ver-5.1.0/spsynth_8f.html new file mode 100644 index 00000000..f9ff4462 --- /dev/null +++ b/ver-5.1.0/spsynth_8f.html @@ -0,0 +1,258 @@ + + + + + + + +NCEPLIBS-ip: spsynth.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    spsynth.f File Reference
    +
    +
    + +

    Synthesize Fourier coefficients from spectral coefficients. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine spsynth (I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
     Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Southern hemispheres). More...
     
    +

    Detailed Description

    +

    Synthesize Fourier coefficients from spectral coefficients.

    +

    +Program History Log

    + + + + + + + +
    Date Programmer Comments
    91-10-31 Mark Iredell Initial.
    1998-12-18 Mark Iredell Include scalar and gradient option.
    +
    Author
    Iredell
    +
    Date
    92-10-31
    + +

    Definition in file spsynth.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ spsynth()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spsynth ( I,
     M,
     IM,
     IX,
     NC,
     NCTOP,
     KM,
     CLAT,
    real, dimension((m+1)*((i+1)*m+2)/2) PLN,
    real, dimension(m+1) PLNTOP,
    integer, dimension(km) MP,
    real, dimension(nc,km) SPC,
    real, dimension(nctop,km) SPCTOP,
    real, dimension(ix,2,km) F 
    )
    +
    + +

    Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Southern hemispheres).

    +

    Vector components are divided by cosine of latitude.

    +
    Parameters
    + + + + + + + + + + + + + + + +
    Ispectral domain shape (0 for triangular, 1 for rhomboidal)
    Mspectral truncation
    IMeven number of Fourier coefficients
    IXdimension of Fourier coefficients (IX>=IM+2)
    NCdimension of spectral coefficients (NC>=(M+1)*((I+1)*M+2))
    NCTOPdimension of spectral coefficients over top (NCTOP>=2*(M+1))
    KMnumber of fields
    CLATcosine of latitude
    PLN((M+1)*((I+1)*M+2)/2) Legendre polynomial
    PLNTOPLegendre polynomial over top
    SPCspectral coefficients
    SPCTOPspectral coefficients over top
    MPidentifiers (0 for scalar, 1 for vector, or 10 for scalar and gradient)
    FFourier coefficients for latitude pair
    +
    +
    +
    Author
    Iredell
    +
    Date
    92-10-31
    + +

    Definition at line 37 of file spsynth.f.

    + +

    Referenced by sptgpm(), sptgpmv(), sptgps(), sptgpsv(), sptgpt(), sptgptsd(), sptgptv(), sptgptvd(), and sptranf1().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/spsynth_8f.js b/ver-5.1.0/spsynth_8f.js new file mode 100644 index 00000000..6cb85dd1 --- /dev/null +++ b/ver-5.1.0/spsynth_8f.js @@ -0,0 +1,4 @@ +var spsynth_8f = +[ + [ "spsynth", "spsynth_8f.html#aa6a8113a459918728c876673520126bf", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/spsynth_8f_source.html b/ver-5.1.0/spsynth_8f_source.html new file mode 100644 index 00000000..7235ebde --- /dev/null +++ b/ver-5.1.0/spsynth_8f_source.html @@ -0,0 +1,259 @@ + + + + + + + +NCEPLIBS-ip: spsynth.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    spsynth.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Synthesize Fourier coefficients from spectral coefficients.
    +
    3 C>
    +
    4 C> ### Program History Log
    +
    5 C> Date | Programmer | Comments
    +
    6 C> -----|------------|---------
    +
    7 C> 91-10-31 | Mark Iredell | Initial.
    +
    8 C> 1998-12-18 | Mark Iredell | Include scalar and gradient option.
    +
    9 C>
    +
    10 C> @author Iredell @date 92-10-31
    +
    11 
    +
    12 C> Synthesizes Fourier coefficients from spectral coefficients
    +
    13 C> for a latitude pair (Northern and Southern hemispheres).
    +
    14 C>
    +
    15 C> Vector components are divided by cosine of latitude.
    +
    16 C>
    +
    17 C> @param I spectral domain shape
    +
    18 C> (0 for triangular, 1 for rhomboidal)
    +
    19 C> @param M spectral truncation
    +
    20 C> @param IM even number of Fourier coefficients
    +
    21 C> @param IX dimension of Fourier coefficients (IX>=IM+2)
    +
    22 C> @param NC dimension of spectral coefficients
    +
    23 C> (NC>=(M+1)*((I+1)*M+2))
    +
    24 C> @param NCTOP dimension of spectral coefficients over top
    +
    25 C> (NCTOP>=2*(M+1))
    +
    26 C> @param KM number of fields
    +
    27 C> @param CLAT cosine of latitude
    +
    28 C> @param PLN ((M+1)*((I+1)*M+2)/2) Legendre polynomial
    +
    29 C> @param PLNTOP Legendre polynomial over top
    +
    30 C> @param SPC spectral coefficients
    +
    31 C> @param SPCTOP spectral coefficients over top
    +
    32 C> @param MP identifiers (0 for scalar, 1 for vector,
    +
    33 C> or 10 for scalar and gradient)
    +
    34 C> @param F Fourier coefficients for latitude pair
    +
    35 C>
    +
    36 C> @author Iredell @date 92-10-31
    +
    37  SUBROUTINE spsynth(I,M,IM,IX,NC,NCTOP,KM,CLAT,PLN,PLNTOP,MP,
    +
    38  & SPC,SPCTOP,F)
    +
    39 
    +
    40  REAL PLN((M+1)*((I+1)*M+2)/2),PLNTOP(M+1)
    +
    41  INTEGER MP(KM)
    +
    42  REAL SPC(NC,KM),SPCTOP(NCTOP,KM)
    +
    43  REAL F(IX,2,KM)
    +
    44  REAL :: TINYREAL=tiny(1.0)
    +
    45 
    +
    46 C ZERO OUT FOURIER COEFFICIENTS.
    +
    47  DO k=1,km
    +
    48  DO l=0,im/2
    +
    49  f(2*l+1,1,k)=0.
    +
    50  f(2*l+2,1,k)=0.
    +
    51  f(2*l+1,2,k)=0.
    +
    52  f(2*l+2,2,k)=0.
    +
    53  ENDDO
    +
    54  ENDDO
    +
    55 
    +
    56 C SYNTHESIS OVER POLE.
    +
    57 C INITIALIZE FOURIER COEFFICIENTS WITH TERMS OVER TOP OF THE SPECTRUM.
    +
    58 C INITIALIZE EVEN AND ODD POLYNOMIALS SEPARATELY.
    +
    59  IF(abs(clat).LT.tinyreal) THEN
    +
    60  ltope=mod(m+1+i,2)
    +
    61 !C$OMP PARALLEL DO PRIVATE(LB,LE,L,KS,KP,N,F1R,F1I)
    +
    62  DO k=1,km
    +
    63  lb=mp(k)
    +
    64  le=mp(k)
    +
    65  IF(mp(k).EQ.10) THEN
    +
    66  lb=0
    +
    67  le=1
    +
    68  ENDIF
    +
    69  l=lb
    +
    70  IF(l.EQ.1) THEN
    +
    71  IF(l.EQ.ltope) THEN
    +
    72  f(2*l+1,1,k)=plntop(l+1)*spctop(2*l+1,k)
    +
    73  f(2*l+2,1,k)=plntop(l+1)*spctop(2*l+2,k)
    +
    74  ELSE
    +
    75  f(2*l+1,2,k)=plntop(l+1)*spctop(2*l+1,k)
    +
    76  f(2*l+2,2,k)=plntop(l+1)*spctop(2*l+2,k)
    +
    77  ENDIF
    +
    78  ENDIF
    +
    79 C FOR EACH ZONAL WAVENUMBER, SYNTHESIZE TERMS OVER TOTAL WAVENUMBER.
    +
    80 C SYNTHESIZE EVEN AND ODD POLYNOMIALS SEPARATELY.
    +
    81  DO l=lb,le
    +
    82  ks=l*(2*m+(i-1)*(l-1))
    +
    83  kp=ks/2+1
    +
    84  DO n=l,i*l+m,2
    +
    85  f(2*l+1,1,k)=f(2*l+1,1,k)+pln(kp+n)*spc(ks+2*n+1,k)
    +
    86  f(2*l+2,1,k)=f(2*l+2,1,k)+pln(kp+n)*spc(ks+2*n+2,k)
    +
    87  ENDDO
    +
    88  DO n=l+1,i*l+m,2
    +
    89  f(2*l+1,2,k)=f(2*l+1,2,k)+pln(kp+n)*spc(ks+2*n+1,k)
    +
    90  f(2*l+2,2,k)=f(2*l+2,2,k)+pln(kp+n)*spc(ks+2*n+2,k)
    +
    91  ENDDO
    +
    92 C SEPARATE FOURIER COEFFICIENTS FROM EACH HEMISPHERE.
    +
    93 C ODD POLYNOMIALS CONTRIBUTE NEGATIVELY TO THE SOUTHERN HEMISPHERE.
    +
    94  f1r=f(2*l+1,1,k)
    +
    95  f1i=f(2*l+2,1,k)
    +
    96  f(2*l+1,1,k)=f1r+f(2*l+1,2,k)
    +
    97  f(2*l+2,1,k)=f1i+f(2*l+2,2,k)
    +
    98  f(2*l+1,2,k)=f1r-f(2*l+1,2,k)
    +
    99  f(2*l+2,2,k)=f1i-f(2*l+2,2,k)
    +
    100  ENDDO
    +
    101  ENDDO
    +
    102 
    +
    103 C SYNTHESIS OVER FINITE LATITUDE.
    +
    104 C INITIALIZE FOURIER COEFFICIENTS WITH TERMS OVER TOP OF THE SPECTRUM.
    +
    105 C INITIALIZE EVEN AND ODD POLYNOMIALS SEPARATELY.
    +
    106  ELSE
    +
    107  lx=min(m,im/2)
    +
    108  ltope=mod(m+1,2)
    +
    109  ltopo=1-ltope
    +
    110  le=1+i*ltope
    +
    111  lo=2-i*ltopo
    +
    112 !C$OMP PARALLEL DO PRIVATE(L,KS,KP,N,F1R,F1I)
    +
    113  DO k=1,km
    +
    114  IF(mp(k).EQ.1) THEN
    +
    115  DO l=ltope,lx,2
    +
    116  f(2*l+1,le,k)=plntop(l+1)*spctop(2*l+1,k)
    +
    117  f(2*l+2,le,k)=plntop(l+1)*spctop(2*l+2,k)
    +
    118  ENDDO
    +
    119  DO l=ltopo,lx,2
    +
    120  f(2*l+1,lo,k)=plntop(l+1)*spctop(2*l+1,k)
    +
    121  f(2*l+2,lo,k)=plntop(l+1)*spctop(2*l+2,k)
    +
    122  ENDDO
    +
    123  ENDIF
    +
    124 C FOR EACH ZONAL WAVENUMBER, SYNTHESIZE TERMS OVER TOTAL WAVENUMBER.
    +
    125 C SYNTHESIZE EVEN AND ODD POLYNOMIALS SEPARATELY.
    +
    126  DO l=0,lx
    +
    127  ks=l*(2*m+(i-1)*(l-1))
    +
    128  kp=ks/2+1
    +
    129  DO n=l,i*l+m,2
    +
    130  f(2*l+1,1,k)=f(2*l+1,1,k)+pln(kp+n)*spc(ks+2*n+1,k)
    +
    131  f(2*l+2,1,k)=f(2*l+2,1,k)+pln(kp+n)*spc(ks+2*n+2,k)
    +
    132  ENDDO
    +
    133  DO n=l+1,i*l+m,2
    +
    134  f(2*l+1,2,k)=f(2*l+1,2,k)+pln(kp+n)*spc(ks+2*n+1,k)
    +
    135  f(2*l+2,2,k)=f(2*l+2,2,k)+pln(kp+n)*spc(ks+2*n+2,k)
    +
    136  ENDDO
    +
    137  ENDDO
    +
    138 C SEPARATE FOURIER COEFFICIENTS FROM EACH HEMISPHERE.
    +
    139 C ODD POLYNOMIALS CONTRIBUTE NEGATIVELY TO THE SOUTHERN HEMISPHERE.
    +
    140 C DIVIDE VECTOR COMPONENTS BY COSINE LATITUDE.
    +
    141  DO l=0,lx
    +
    142  f1r=f(2*l+1,1,k)
    +
    143  f1i=f(2*l+2,1,k)
    +
    144  f(2*l+1,1,k)=f1r+f(2*l+1,2,k)
    +
    145  f(2*l+2,1,k)=f1i+f(2*l+2,2,k)
    +
    146  f(2*l+1,2,k)=f1r-f(2*l+1,2,k)
    +
    147  f(2*l+2,2,k)=f1i-f(2*l+2,2,k)
    +
    148  ENDDO
    +
    149  IF(mp(k).EQ.1) THEN
    +
    150  DO l=0,lx
    +
    151  f(2*l+1,1,k)=f(2*l+1,1,k)/clat
    +
    152  f(2*l+2,1,k)=f(2*l+2,1,k)/clat
    +
    153  f(2*l+1,2,k)=f(2*l+1,2,k)/clat
    +
    154  f(2*l+2,2,k)=f(2*l+2,2,k)/clat
    +
    155  ENDDO
    +
    156  ENDIF
    +
    157  ENDDO
    +
    158  ENDIF
    +
    159  END
    +
    subroutine spsynth(I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
    Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
    Definition: spsynth.f:39
    +
    +
    + + + + diff --git a/ver-5.1.0/sptez_8f.html b/ver-5.1.0/sptez_8f.html new file mode 100644 index 00000000..dabb0310 --- /dev/null +++ b/ver-5.1.0/sptez_8f.html @@ -0,0 +1,234 @@ + + + + + + + +NCEPLIBS-ip: sptez.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptez.f File Reference
    +
    +
    + +

    Perform a simple scalar spherical transform. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptez (IROMB, MAXWV, IDRT, IMAX, JMAX, WAVE, GRID, IDIR)
     This subprogram performs a spherical transform between spectral coefficients of a scalar quantity and a field on a global cylindrical grid. More...
     
    +

    Detailed Description

    +

    Perform a simple scalar spherical transform.

    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition in file sptez.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptez()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptez ( IROMB,
     MAXWV,
     IDRT,
     IMAX,
     JMAX,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2)) WAVE,
    real, dimension(imax,jmax) GRID,
     IDIR 
    )
    +
    + +

    This subprogram performs a spherical transform between spectral coefficients of a scalar quantity and a field on a global cylindrical grid.

    +

    The wave-space can be either triangular or rhomboidal.

    +

    The grid-space can be either an equally-spaced grid (with or without pole points) or a Gaussian grid.

    +

    The wave field is in sequential 'IBM ORDER'.

    +

    The grid field is indexed East to West, then North to South.

    +

    For more flexibility and efficiency, call sptran().

    +

    Subprogram can be called from a multiprocessing environment.

    +

    Minimum grid dimensions for unaliased transforms to spectral:

    + + + + + + + + + + + + + + + + +
    DIMENSION LINEAR QUADRATIC
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    +
    Parameters
    + + + + + + + + + +
    IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVspectral truncation
    IDRTgrid identifier
      +
    • IDRT=4 for Gaussian grid,
    • +
    • IDRT=0 for equally-spaced grid including poles,
    • +
    • IDRT=256 for equally-spaced grid excluding poles
    • +
    +
    IMAXeven number of longitudes.
    JMAXnumber of latitudes.
    [out]WAVEwave field if IDIR>0 where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
    [out]GRIDgrid field (E->W,N->S) if IDIR<0
    IDIRtransform flag (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition at line 49 of file sptez.f.

    + +

    References ncpus(), and sptranf().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptez_8f.js b/ver-5.1.0/sptez_8f.js new file mode 100644 index 00000000..03fe31e3 --- /dev/null +++ b/ver-5.1.0/sptez_8f.js @@ -0,0 +1,4 @@ +var sptez_8f = +[ + [ "sptez", "sptez_8f.html#a418a7d182834b2e2dafae2fe881ba9fc", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptez_8f_source.html b/ver-5.1.0/sptez_8f_source.html new file mode 100644 index 00000000..e907436c --- /dev/null +++ b/ver-5.1.0/sptez_8f_source.html @@ -0,0 +1,173 @@ + + + + + + + +NCEPLIBS-ip: sptez.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptez.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Perform a simple scalar spherical transform.
    +
    3 C> @author Iredell @date 96-02-29
    +
    4 
    +
    5 C> This subprogram performs a spherical transform
    +
    6 C> between spectral coefficients of a scalar quantity
    +
    7 C> and a field on a global cylindrical grid.
    +
    8 C>
    +
    9 C> The wave-space can be either triangular or rhomboidal.
    +
    10 C>
    +
    11 C> The grid-space can be either an equally-spaced grid
    +
    12 C> (with or without pole points) or a Gaussian grid.
    +
    13 C>
    +
    14 C> The wave field is in sequential 'IBM ORDER'.
    +
    15 C>
    +
    16 C> The grid field is indexed East to West, then North to South.
    +
    17 C>
    +
    18 C> For more flexibility and efficiency, call sptran().
    +
    19 C>
    +
    20 C> Subprogram can be called from a multiprocessing environment.
    +
    21 C>
    +
    22 C> Minimum grid dimensions for unaliased transforms to spectral:
    +
    23 C> DIMENSION |LINEAR |QUADRATIC
    +
    24 C> ----------------------- |--------- |-------------
    +
    25 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    +
    26 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    +
    27 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    +
    28 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    +
    29 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    +
    30 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    +
    31 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    +
    32 C>
    +
    33 C> @param IROMB spectral domain shape
    +
    34 C> (0 for triangular, 1 for rhomboidal)
    +
    35 C> @param MAXWV spectral truncation
    +
    36 C> @param IDRT grid identifier
    +
    37 C> - IDRT=4 for Gaussian grid,
    +
    38 C> - IDRT=0 for equally-spaced grid including poles,
    +
    39 C> - IDRT=256 for equally-spaced grid excluding poles
    +
    40 C> @param IMAX even number of longitudes.
    +
    41 C> @param JMAX number of latitudes.
    +
    42 C> @param[out] WAVE wave field if IDIR>0
    +
    43 C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
    +
    44 C> @param[out] GRID grid field (E->W,N->S) if IDIR<0
    +
    45 C> @param IDIR transform flag
    +
    46 C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
    +
    47 C>
    +
    48 C> @author Iredell @date 96-02-29
    +
    49  SUBROUTINE sptez(IROMB,MAXWV,IDRT,IMAX,JMAX,WAVE,GRID,IDIR)
    +
    50 
    +
    51  REAL WAVE((MAXWV+1)*((IROMB+1)*MAXWV+2))
    +
    52  REAL GRID(IMAX,JMAX)
    +
    53 
    +
    54  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    55  ip=1
    +
    56  is=1
    +
    57  jn=imax
    +
    58  js=-jn
    +
    59  kw=2*mx
    +
    60  kg=imax*jmax
    +
    61  jb=1
    +
    62  je=(jmax+1)/2
    +
    63  jc=ncpus()
    +
    64 ! print *, " EM: SPTEZ:::JJJJJJJJJJJJJJJJJJJCCCCCCCCCCC=" ,JC
    +
    65  IF(idir.LT.0) wave=0
    +
    66 
    +
    67  CALL sptranf(iromb,maxwv,idrt,imax,jmax,1,
    +
    68  & ip,is,jn,js,kw,kg,jb,je,jc,
    +
    69  & wave,grid,grid(1,jmax),idir)
    +
    70 
    +
    71  END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    +
    subroutine sptez(IROMB, MAXWV, IDRT, IMAX, JMAX, WAVE, GRID, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of a scalar quantity and...
    Definition: sptez.f:50
    +
    subroutine sptranf(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IP, IS, JN, JS, KW, KG, JB, JE, JC, WAVE, GRIDN, GRIDS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition: sptranf.f:77
    +
    +
    + + + + diff --git a/ver-5.1.0/sptezd_8f.html b/ver-5.1.0/sptezd_8f.html new file mode 100644 index 00000000..0d2359c9 --- /dev/null +++ b/ver-5.1.0/sptezd_8f.html @@ -0,0 +1,248 @@ + + + + + + + +NCEPLIBS-ip: sptezd.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptezd.f File Reference
    +
    +
    + +

    Perform a simple gradient spherical transform. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptezd (IROMB, MAXWV, IDRT, IMAX, JMAX, WAVE, GRIDMN, GRIDX, GRIDY, IDIR)
     This subprogram performs a spherical transform between spectral coefficients of a scalar field and its mean and gradient on a global cylindrical grid. More...
     
    +

    Detailed Description

    +

    Perform a simple gradient spherical transform.

    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition in file sptezd.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptezd()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptezd ( IROMB,
     MAXWV,
     IDRT,
     IMAX,
     JMAX,
    real, dimension(*) WAVE,
    real, dimension(*) GRIDMN,
    real, dimension(imax,jmax) GRIDX,
    real, dimension(imax,jmax) GRIDY,
     IDIR 
    )
    +
    + +

    This subprogram performs a spherical transform between spectral coefficients of a scalar field and its mean and gradient on a global cylindrical grid.

    +

    The wave-space can be either triangular or rhomboidal.

    +

    The grid-space can be either an equally-spaced grid (with or without pole points) or a Gaussian grid.

    +

    The wave field is in sequential 'IBM ORDER'.

    +

    The grid fiels is indexed East to West, then North to South.

    +

    For more flexibility and efficiency, call sptran().

    +

    Subprogram can be called from a multiprocessing environment.

    +

    Minimum grid dimensions for unaliased transforms to spectral:

    + + + + + + + + + + + + + + + + +
    DIMENSION LINEAR QUADRATIC
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    +
    Parameters
    + + + + + + + + + + + +
    IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVspectral truncation
    IDRTgrid identifier
      +
    • IDRT=4 for Gaussian grid
    • +
    • IDRT=0 for equally-spaced grid including poles
    • +
    • IDRT=256 for equally-spaced grid excluding poles
    • +
    +
    IMAXeven number of longitudes.
    JMAXnumber of latitudes.
    [out]WAVEwave field if IDIR>0
    [out]GRIDMNglobal mean if IDIR<0
    [out]GRIDXgrid x-gradients (E->W,N->S) if IDIR<0
    [out]GRIDYgrid y-gradients (E->W,N->S) if IDIR<0
    IDIRtransform flag (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition at line 50 of file sptezd.f.

    + +

    References ncpus(), and sptrand().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptezd_8f.js b/ver-5.1.0/sptezd_8f.js new file mode 100644 index 00000000..d5a75e40 --- /dev/null +++ b/ver-5.1.0/sptezd_8f.js @@ -0,0 +1,4 @@ +var sptezd_8f = +[ + [ "sptezd", "sptezd_8f.html#a6c30b52dcb4da9e403eeeb307b9516d7", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptezd_8f_source.html b/ver-5.1.0/sptezd_8f_source.html new file mode 100644 index 00000000..d86821c3 --- /dev/null +++ b/ver-5.1.0/sptezd_8f_source.html @@ -0,0 +1,162 @@ + + + + + + + +NCEPLIBS-ip: sptezd.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptezd.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Perform a simple gradient spherical transform.
    +
    3 C> @author Iredell @date 96-02-29
    +
    4 
    +
    5 C> This subprogram performs a spherical transform
    +
    6 C> between spectral coefficients of a scalar field
    +
    7 C> and its mean and gradient on a global cylindrical grid.
    +
    8 C>
    +
    9 C> The wave-space can be either triangular or rhomboidal.
    +
    10 C>
    +
    11 C> The grid-space can be either an equally-spaced grid
    +
    12 C> (with or without pole points) or a Gaussian grid.
    +
    13 C>
    +
    14 C> The wave field is in sequential 'IBM ORDER'.
    +
    15 C>
    +
    16 C> The grid fiels is indexed East to West, then North to South.
    +
    17 C>
    +
    18 C> For more flexibility and efficiency, call sptran().
    +
    19 C>
    +
    20 C> Subprogram can be called from a multiprocessing environment.
    +
    21 C>
    +
    22 C> Minimum grid dimensions for unaliased transforms to spectral:
    +
    23 C> DIMENSION |LINEAR |QUADRATIC
    +
    24 C> ----------------------- |--------- |-------------
    +
    25 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    +
    26 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    +
    27 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    +
    28 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    +
    29 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    +
    30 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    +
    31 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    +
    32 C>
    +
    33 C> @param IROMB spectral domain shape
    +
    34 C> (0 for triangular, 1 for rhomboidal)
    +
    35 C> @param MAXWV spectral truncation
    +
    36 C> @param IDRT grid identifier
    +
    37 C> - IDRT=4 for Gaussian grid
    +
    38 C> - IDRT=0 for equally-spaced grid including poles
    +
    39 C> - IDRT=256 for equally-spaced grid excluding poles
    +
    40 C> @param IMAX even number of longitudes.
    +
    41 C> @param JMAX number of latitudes.
    +
    42 C> @param[out] WAVE wave field if IDIR>0
    +
    43 C> @param[out] GRIDMN global mean if IDIR<0
    +
    44 C> @param[out] GRIDX grid x-gradients (E->W,N->S) if IDIR<0
    +
    45 C> @param[out] GRIDY grid y-gradients (E->W,N->S) if IDIR<0
    +
    46 C> @param IDIR transform flag
    +
    47 C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
    +
    48 C>
    +
    49 C> @author Iredell @date 96-02-29
    +
    50  SUBROUTINE sptezd(IROMB,MAXWV,IDRT,IMAX,JMAX,
    +
    51  & WAVE,GRIDMN,GRIDX,GRIDY,IDIR)
    +
    52 
    +
    53  REAL WAVE(*),GRIDX(IMAX,JMAX),GRIDY(IMAX,JMAX),GRIDMN(*)
    +
    54 
    +
    55  jc=ncpus()
    +
    56  CALL sptrand(iromb,maxwv,idrt,imax,jmax,1,
    +
    57  & 0,0,0,0,0,0,0,0,jc,
    +
    58  & wave,gridmn,
    +
    59  & gridx,gridx(1,jmax),gridy,gridy(1,jmax),1)
    +
    60  END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    +
    subroutine sptezd(IROMB, MAXWV, IDRT, IMAX, JMAX, WAVE, GRIDMN, GRIDX, GRIDY, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of a scalar field and it...
    Definition: sptezd.f:52
    +
    subroutine sptrand(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDMN, GRIDXN, GRIDXS, GRIDYN, GRIDYS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar fields and the...
    Definition: sptrand.f:92
    +
    +
    + + + + diff --git a/ver-5.1.0/sptezm_8f.html b/ver-5.1.0/sptezm_8f.html new file mode 100644 index 00000000..d3955611 --- /dev/null +++ b/ver-5.1.0/sptezm_8f.html @@ -0,0 +1,241 @@ + + + + + + + +NCEPLIBS-ip: sptezm.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptezm.f File Reference
    +
    +
    + +

    Perform simple scalar spherical transforms. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptezm (IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, WAVE, GRID, IDIR)
     This subprogram performs spherical transforms between spectral coefficients of scalar quantities and fields on a global cylindrical grid. More...
     
    +

    Detailed Description

    +

    Perform simple scalar spherical transforms.

    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition in file sptezm.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptezm()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptezm ( IROMB,
     MAXWV,
     IDRT,
     IMAX,
     JMAX,
     KMAX,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2),kmax) WAVE,
    real, dimension(imax,jmax,kmax) GRID,
     IDIR 
    )
    +
    + +

    This subprogram performs spherical transforms between spectral coefficients of scalar quantities and fields on a global cylindrical grid.

    +

    The wave-space can be either triangular or rhomboidal.

    +

    The grid-space can be either an equally-spaced grid (with or without pole points) or a Gaussian grid.

    +

    Wave fields are in sequential 'IBM ORDER'.

    +

    Grid fields are indexed East to West, then North to South.

    +

    For more flexibility and efficiency, call sptran().

    +

    Subprogram can be called from a multiprocessing environment.

    +

    Minimum grid dimensions for unaliased transforms to spectral:

    + + + + + + + + + + + + + + + + +
    DIMENSION LINEAR QUADRATIC
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    +
    Parameters
    + + + + + + + + + + +
    IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVspectral truncation
    IDRTgrid identifier
      +
    • IDRT=4 for Gaussian grid
    • +
    • IDRT=0 for equally-spaced grid including poles
    • +
    • IDRT=256 for equally-spaced grid excluding poles
    • +
    +
    IMAXeven number of longitudes
    JMAXnumber of latitudes
    KMAXnumber of fields to transform
    [out]WAVEwave field if IDIR>0 where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
    [out]GRIDgrid field (E->W,N->S) if IDIR<0
    IDIRtransform flag (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition at line 50 of file sptezm.f.

    + +

    References ncpus(), and sptranf().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptezm_8f.js b/ver-5.1.0/sptezm_8f.js new file mode 100644 index 00000000..d8cb8be0 --- /dev/null +++ b/ver-5.1.0/sptezm_8f.js @@ -0,0 +1,4 @@ +var sptezm_8f = +[ + [ "sptezm", "sptezm_8f.html#a1430a0df2cba7eefaf67c939684be2d1", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptezm_8f_source.html b/ver-5.1.0/sptezm_8f_source.html new file mode 100644 index 00000000..a68c0f93 --- /dev/null +++ b/ver-5.1.0/sptezm_8f_source.html @@ -0,0 +1,172 @@ + + + + + + + +NCEPLIBS-ip: sptezm.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptezm.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Perform simple scalar spherical transforms.
    +
    3 C> @author Iredell @date 96-02-29
    +
    4 
    +
    5 C> This subprogram performs spherical transforms
    +
    6 C> between spectral coefficients of scalar quantities
    +
    7 C> and fields on a global cylindrical grid.
    +
    8 C>
    +
    9 C> The wave-space can be either triangular or rhomboidal.
    +
    10 C>
    +
    11 C> The grid-space can be either an equally-spaced grid
    +
    12 C> (with or without pole points) or a Gaussian grid.
    +
    13 C>
    +
    14 C> Wave fields are in sequential 'IBM ORDER'.
    +
    15 C>
    +
    16 C> Grid fields are indexed East to West, then North to South.
    +
    17 C>
    +
    18 C> For more flexibility and efficiency, call sptran().
    +
    19 C>
    +
    20 C> Subprogram can be called from a multiprocessing environment.
    +
    21 C>
    +
    22 C> Minimum grid dimensions for unaliased transforms to spectral:
    +
    23 C> DIMENSION |LINEAR |QUADRATIC
    +
    24 C> ----------------------- |--------- |-------------
    +
    25 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    +
    26 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    +
    27 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    +
    28 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    +
    29 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    +
    30 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    +
    31 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    +
    32 C>
    +
    33 C> @param IROMB spectral domain shape
    +
    34 C> (0 for triangular, 1 for rhomboidal)
    +
    35 C> @param MAXWV spectral truncation
    +
    36 C> @param IDRT grid identifier
    +
    37 C> - IDRT=4 for Gaussian grid
    +
    38 C> - IDRT=0 for equally-spaced grid including poles
    +
    39 C> - IDRT=256 for equally-spaced grid excluding poles
    +
    40 C> @param IMAX even number of longitudes
    +
    41 C> @param JMAX number of latitudes
    +
    42 C> @param KMAX number of fields to transform
    +
    43 C> @param[out] WAVE wave field if IDIR>0
    +
    44 C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
    +
    45 C> @param[out] GRID grid field (E->W,N->S) if IDIR<0
    +
    46 C> @param IDIR transform flag
    +
    47 C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
    +
    48 C>
    +
    49 C> @author Iredell @date 96-02-29
    +
    50  SUBROUTINE sptezm(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,WAVE,GRID,IDIR)
    +
    51 
    +
    52  REAL WAVE((MAXWV+1)*((IROMB+1)*MAXWV+2),KMAX)
    +
    53  REAL GRID(IMAX,JMAX,KMAX)
    +
    54 
    +
    55  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    56  ip=1
    +
    57  is=1
    +
    58  jn=imax
    +
    59  js=-jn
    +
    60  kw=2*mx
    +
    61  kg=imax*jmax
    +
    62  jb=1
    +
    63  je=(jmax+1)/2
    +
    64  jc=ncpus()
    +
    65  IF(idir.LT.0) wave=0
    +
    66 
    +
    67  CALL sptranf(iromb,maxwv,idrt,imax,jmax,kmax,
    +
    68  & ip,is,jn,js,kw,kg,jb,je,jc,
    +
    69  & wave,grid,grid(1,jmax,1),idir)
    +
    70  END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    +
    subroutine sptezm(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, WAVE, GRID, IDIR)
    This subprogram performs spherical transforms between spectral coefficients of scalar quantities and ...
    Definition: sptezm.f:51
    +
    subroutine sptranf(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IP, IS, JN, JS, KW, KG, JB, JE, JC, WAVE, GRIDN, GRIDS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition: sptranf.f:77
    +
    +
    + + + + diff --git a/ver-5.1.0/sptezmd_8f.html b/ver-5.1.0/sptezmd_8f.html new file mode 100644 index 00000000..80753eaf --- /dev/null +++ b/ver-5.1.0/sptezmd_8f.html @@ -0,0 +1,255 @@ + + + + + + + +NCEPLIBS-ip: sptezmd.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptezmd.f File Reference
    +
    +
    + +

    Perform simple gradient spherical transforms. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptezmd (IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, WAVE, GRIDMN, GRIDX, GRIDY, IDIR)
     This subprogram performs spherical transforms between spectral coefficients of scalar fields and their means and gradients on a global cylindrical grid. More...
     
    +

    Detailed Description

    +

    Perform simple gradient spherical transforms.

    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition in file sptezmd.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptezmd()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptezmd ( IROMB,
     MAXWV,
     IDRT,
     IMAX,
     JMAX,
     KMAX,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2),kmax) WAVE,
    real, dimension(kmax) GRIDMN,
    real, dimension(imax,jmax,kmax) GRIDX,
    real, dimension(imax,jmax,kmax) GRIDY,
     IDIR 
    )
    +
    + +

    This subprogram performs spherical transforms between spectral coefficients of scalar fields and their means and gradients on a global cylindrical grid.

    +

    The wave-space can be either triangular or rhomboidal.

    +

    The grid-space can be either an equally-spaced grid (with or without pole points) or a gaussian grid.

    +

    The wave fields are in sequential 'IBM ORDER'.

    +

    The grid fields are indexed East to West, then North to South.

    +

    For more flexibility and efficiency, call sptran().

    +

    Subprogram can be called from a multiprocessing environment.

    +

    Minimum grid dimensions for unaliased transforms to spectral:

    + + + + + + + + + + + + + + + + +
    DIMENSION LINEAR QUADRATIC
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    +
    Parameters
    + + + + + + + + + + + + +
    IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVspectral truncation
    IDRTgrid identifier
      +
    • IDRT=4 for Gaussian grid
    • +
    • IDRT=0 for equally-spaced grid including poles
    • +
    • IDRT=256 for equally-spaced grid excluding poles
    • +
    +
    IMAXeven number of longitudes.
    JMAXnumber of latitudes.
    KMAXnumber
    [out]WAVEwave field if IDIR>0 where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)
    [out]GRIDMNglobal mean if IDIR<0
    [out]GRIDXgrid x-gradients (E->W,N->S) if IDIR<0
    [out]GRIDYgrid y-gradients (E->W,N->S) if IDIR<0
    IDIRtransform flag (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition at line 52 of file sptezmd.f.

    + +

    References ncpus(), and sptrand().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptezmd_8f.js b/ver-5.1.0/sptezmd_8f.js new file mode 100644 index 00000000..31e96979 --- /dev/null +++ b/ver-5.1.0/sptezmd_8f.js @@ -0,0 +1,4 @@ +var sptezmd_8f = +[ + [ "sptezmd", "sptezmd_8f.html#a2b9ead06893e51604bfb18928ddee996", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptezmd_8f_source.html b/ver-5.1.0/sptezmd_8f_source.html new file mode 100644 index 00000000..2e7916a5 --- /dev/null +++ b/ver-5.1.0/sptezmd_8f_source.html @@ -0,0 +1,165 @@ + + + + + + + +NCEPLIBS-ip: sptezmd.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptezmd.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Perform simple gradient spherical transforms.
    +
    3 C> @author Iredell @date 96-02-29
    +
    4 
    +
    5 C> This subprogram performs spherical transforms
    +
    6 C> between spectral coefficients of scalar fields
    +
    7 C> and their means and gradients on a global cylindrical grid.
    +
    8 C>
    +
    9 C> The wave-space can be either triangular or rhomboidal.
    +
    10 C>
    +
    11 C> The grid-space can be either an equally-spaced grid
    +
    12 C> (with or without pole points) or a gaussian grid.
    +
    13 C>
    +
    14 C> The wave fields are in sequential 'IBM ORDER'.
    +
    15 C>
    +
    16 C> The grid fields are indexed East to West, then North to South.
    +
    17 C>
    +
    18 C> For more flexibility and efficiency, call sptran().
    +
    19 C>
    +
    20 C> Subprogram can be called from a multiprocessing environment.
    +
    21 C>
    +
    22 C> Minimum grid dimensions for unaliased transforms to spectral:
    +
    23 C> DIMENSION |LINEAR |QUADRATIC
    +
    24 C> ----------------------- |--------- |-------------
    +
    25 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    +
    26 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    +
    27 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    +
    28 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    +
    29 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    +
    30 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    +
    31 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    +
    32 C>
    +
    33 C> @param IROMB spectral domain shape
    +
    34 C> (0 for triangular, 1 for rhomboidal)
    +
    35 C> @param MAXWV spectral truncation
    +
    36 C> @param IDRT grid identifier
    +
    37 C> - IDRT=4 for Gaussian grid
    +
    38 C> - IDRT=0 for equally-spaced grid including poles
    +
    39 C> - IDRT=256 for equally-spaced grid excluding poles
    +
    40 C> @param IMAX even number of longitudes.
    +
    41 C> @param JMAX number of latitudes.
    +
    42 C> @param KMAX number
    +
    43 C> @param[out] WAVE wave field if IDIR>0
    +
    44 C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)
    +
    45 C> @param[out] GRIDMN global mean if IDIR<0
    +
    46 C> @param[out] GRIDX grid x-gradients (E->W,N->S) if IDIR<0
    +
    47 C> @param[out] GRIDY grid y-gradients (E->W,N->S) if IDIR<0
    +
    48 C> @param IDIR transform flag
    +
    49 C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
    +
    50 C>
    +
    51 C> @author Iredell @date 96-02-29
    +
    52  SUBROUTINE sptezmd(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
    +
    53  & WAVE,GRIDMN,GRIDX,GRIDY,IDIR)
    +
    54 
    +
    55  REAL WAVE((MAXWV+1)*((IROMB+1)*MAXWV+2),KMAX)
    +
    56  REAL GRIDMN(KMAX),GRIDX(IMAX,JMAX,KMAX),GRIDY(IMAX,JMAX,KMAX)
    +
    57 
    +
    58  jc=ncpus()
    +
    59  CALL sptrand(iromb,maxwv,idrt,imax,jmax,kmax,
    +
    60  & 0,0,0,0,0,0,0,0,jc,
    +
    61  & wave,gridmn,
    +
    62  & gridx,gridx(1,jmax,1),gridy,gridy(1,jmax,1),idir)
    +
    63  END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    +
    subroutine sptezmd(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, WAVE, GRIDMN, GRIDX, GRIDY, IDIR)
    This subprogram performs spherical transforms between spectral coefficients of scalar fields and thei...
    Definition: sptezmd.f:54
    +
    subroutine sptrand(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDMN, GRIDXN, GRIDXS, GRIDYN, GRIDYS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar fields and the...
    Definition: sptrand.f:92
    +
    +
    + + + + diff --git a/ver-5.1.0/sptezmv_8f.html b/ver-5.1.0/sptezmv_8f.html new file mode 100644 index 00000000..8556ba90 --- /dev/null +++ b/ver-5.1.0/sptezmv_8f.html @@ -0,0 +1,255 @@ + + + + + + + +NCEPLIBS-ip: sptezmv.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptezmv.f File Reference
    +
    +
    + +

    Perform simple vector spherical transforms. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptezmv (IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, WAVED, WAVEZ, GRIDU, GRIDV, IDIR)
     This subprogram performs spherical transforms between spectral coefficients of divergence and curl and vector fields on a global cylindrical grid. More...
     
    +

    Detailed Description

    +

    Perform simple vector spherical transforms.

    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition in file sptezmv.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptezmv()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptezmv ( IROMB,
     MAXWV,
     IDRT,
     IMAX,
     JMAX,
     KMAX,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2),kmax) WAVED,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2),kmax) WAVEZ,
    real, dimension(imax,jmax,kmax) GRIDU,
    real, dimension(imax,jmax,kmax) GRIDV,
     IDIR 
    )
    +
    + +

    This subprogram performs spherical transforms between spectral coefficients of divergence and curl and vector fields on a global cylindrical grid.

    +

    The wave-space can be either triangular or rhomboidal.

    +

    The grid-space can be either an equally-spaced grid (with or without pole points) or a Gaussian grid.

    +

    Wave fields are in sequential 'IBM ORDER'.

    +

    Grid fields are indexed east to west, then north to south.

    +

    For more flexibility and efficiency, call sptran().

    +

    Subprogram can be called from a multiprocessing environment.

    +

    Minimum grid dimensions for unaliased transforms to spectral:

    + + + + + + + + + + + + + + + + +
    DIMENSION LINEAR QUADRATIC
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    +
    Parameters
    + + + + + + + + + + + + +
    IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVspectral truncation
    IDRTgrid identifier
      +
    • IDRT=4 for Gaussian grid
    • +
    • IDRT=0 for equally-spaced grid including poles
    • +
    • IDRT=256 for equally-spaced grid excluding poles
    • +
    +
    IMAXeven number of longitudes
    JMAXnumber of latitudes
    KMAXnumber of fields to transform
    [out]WAVEDwave divergence field if IDIR<0 where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
    [out]WAVEZwave vorticity field if IDIR>0 where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
    [out]GRIDUgrid u-wind (E->W,N->S) if IDIR>0
    [out]GRIDVgrid v-wind (E->W,N->S) if IDIR>0
    IDIRtransform flag (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition at line 53 of file sptezmv.f.

    + +

    References ncpus(), and sptranfv().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptezmv_8f.js b/ver-5.1.0/sptezmv_8f.js new file mode 100644 index 00000000..2b2725eb --- /dev/null +++ b/ver-5.1.0/sptezmv_8f.js @@ -0,0 +1,4 @@ +var sptezmv_8f = +[ + [ "sptezmv", "sptezmv_8f.html#a22dc4fc10c5225ec8d3c12ed3cb4786e", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptezmv_8f_source.html b/ver-5.1.0/sptezmv_8f_source.html new file mode 100644 index 00000000..20f789af --- /dev/null +++ b/ver-5.1.0/sptezmv_8f_source.html @@ -0,0 +1,180 @@ + + + + + + + +NCEPLIBS-ip: sptezmv.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptezmv.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Perform simple vector spherical transforms.
    +
    3 C> @author Iredell @date 96-02-29
    +
    4 
    +
    5 C> This subprogram performs spherical transforms
    +
    6 C> between spectral coefficients of divergence and curl
    +
    7 C> and vector fields on a global cylindrical grid.
    +
    8 C>
    +
    9 C> The wave-space can be either triangular or rhomboidal.
    +
    10 C>
    +
    11 C> The grid-space can be either an equally-spaced grid
    +
    12 C> (with or without pole points) or a Gaussian grid.
    +
    13 C>
    +
    14 C> Wave fields are in sequential 'IBM ORDER'.
    +
    15 C>
    +
    16 C> Grid fields are indexed east to west, then north to south.
    +
    17 C>
    +
    18 C> For more flexibility and efficiency, call sptran().
    +
    19 C>
    +
    20 C> Subprogram can be called from a multiprocessing environment.
    +
    21 C>
    +
    22 C> Minimum grid dimensions for unaliased transforms to spectral:
    +
    23 C> DIMENSION |LINEAR |QUADRATIC
    +
    24 C> ----------------------- |--------- |-------------
    +
    25 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    +
    26 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    +
    27 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    +
    28 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    +
    29 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    +
    30 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    +
    31 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    +
    32 C>
    +
    33 C> @param IROMB spectral domain shape
    +
    34 C> (0 for triangular, 1 for rhomboidal)
    +
    35 C> @param MAXWV spectral truncation
    +
    36 C> @param IDRT grid identifier
    +
    37 C> - IDRT=4 for Gaussian grid
    +
    38 C> - IDRT=0 for equally-spaced grid including poles
    +
    39 C> - IDRT=256 for equally-spaced grid excluding poles
    +
    40 C> @param IMAX even number of longitudes
    +
    41 C> @param JMAX number of latitudes
    +
    42 C> @param KMAX number of fields to transform
    +
    43 C> @param[out] WAVED wave divergence field if IDIR<0
    +
    44 C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
    +
    45 C> @param[out] WAVEZ wave vorticity field if IDIR>0
    +
    46 C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
    +
    47 C> @param[out] GRIDU grid u-wind (E->W,N->S) if IDIR>0
    +
    48 C> @param[out] GRIDV grid v-wind (E->W,N->S) if IDIR>0
    +
    49 C> @param IDIR transform flag
    +
    50 C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
    +
    51 C>
    +
    52 C> @author Iredell @date 96-02-29
    +
    53  SUBROUTINE sptezmv(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
    +
    54  & WAVED,WAVEZ,GRIDU,GRIDV,IDIR)
    +
    55 
    +
    56  REAL WAVED((MAXWV+1)*((IROMB+1)*MAXWV+2),KMAX)
    +
    57  REAL WAVEZ((MAXWV+1)*((IROMB+1)*MAXWV+2),KMAX)
    +
    58  REAL GRIDU(IMAX,JMAX,KMAX)
    +
    59  REAL GRIDV(IMAX,JMAX,KMAX)
    +
    60 
    +
    61  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    62  ip=1
    +
    63  is=1
    +
    64  jn=imax
    +
    65  js=-jn
    +
    66  kw=2*mx
    +
    67  kg=imax*jmax
    +
    68  jb=1
    +
    69  je=(jmax+1)/2
    +
    70  jc=ncpus()
    +
    71  IF(idir.LT.0) waved=0
    +
    72  IF(idir.LT.0) wavez=0
    +
    73 
    +
    74  CALL sptranfv(iromb,maxwv,idrt,imax,jmax,kmax,
    +
    75  & ip,is,jn,js,kw,kg,jb,je,jc,
    +
    76  & waved,wavez,
    +
    77  & gridu,gridu(1,jmax,1),gridv,gridv(1,jmax,1),idir)
    +
    78  END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    +
    subroutine sptezmv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, WAVED, WAVEZ, GRIDU, GRIDV, IDIR)
    This subprogram performs spherical transforms between spectral coefficients of divergence and curl an...
    Definition: sptezmv.f:55
    +
    subroutine sptranfv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IP, IS, JN, JS, KW, KG, JB, JE, JC, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
    Definition: sptranfv.f:83
    +
    +
    + + + + diff --git a/ver-5.1.0/sptezv_8f.html b/ver-5.1.0/sptezv_8f.html new file mode 100644 index 00000000..be8521ff --- /dev/null +++ b/ver-5.1.0/sptezv_8f.html @@ -0,0 +1,248 @@ + + + + + + + +NCEPLIBS-ip: sptezv.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptezv.f File Reference
    +
    +
    + +

    Perform a simple vector spherical transform. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptezv (IROMB, MAXWV, IDRT, IMAX, JMAX, WAVED, WAVEZ, GRIDU, GRIDV, IDIR)
     This subprogram performs a spherical transform between spectral coefficients of divergence and curl and a vector field on a global cylindrical grid. More...
     
    +

    Detailed Description

    +

    Perform a simple vector spherical transform.

    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition in file sptezv.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptezv()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptezv ( IROMB,
     MAXWV,
     IDRT,
     IMAX,
     JMAX,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2)) WAVED,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2)) WAVEZ,
    real, dimension(imax,jmax) GRIDU,
    real, dimension(imax,jmax) GRIDV,
     IDIR 
    )
    +
    + +

    This subprogram performs a spherical transform between spectral coefficients of divergence and curl and a vector field on a global cylindrical grid.

    +

    The wave-space can be either triangular or rhomboidal.

    +

    The grid-space can be either an equally-spaced grid (with or without pole points) or a Gaussian grid.

    +

    The wave field is in sequential 'IBM order'.

    +

    The grid field is indexed east to west, then north to south.

    +

    For more flexibility and efficiency, call SPTRAN().

    +

    Subprogram can be called from a multiprocessing environment.

    +

    Minimum grid dimensions for unaliased transforms to spectral:

    + + + + + + + + + + + + + + + + +
    Dimension Linear Quadratic
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    +
    Parameters
    + + + + + + + + + + + +
    IROMBSpectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVSpectral truncation
    IDRTGrid identifier
      +
    • IDRT=4 for Gaussian grid
    • +
    • IDRT=0 for equally-spaced grid including poles
    • +
    • IDRT=256 for equally-spaced grid excluding poles
    • +
    +
    IMAXEven number of longitudes
    JMAXNumber of latitudes
    [out]WAVEDWave divergence field if IDIR>0 where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
    [out]WAVEZWave vorticity field if IDIR>0 where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
    [out]GRIDUGrid u-wind (E->W,N->S) if IDIR<0
    [out]GRIDVGrid v-wind (E->W,N->S) if IDIR<0
    IDIRTransform flag (IDIR>0 for wave to grid, IDIR<0 for grid to wave)
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition at line 51 of file sptezv.f.

    + +

    References ncpus(), and sptranfv().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptezv_8f.js b/ver-5.1.0/sptezv_8f.js new file mode 100644 index 00000000..d9e51fb2 --- /dev/null +++ b/ver-5.1.0/sptezv_8f.js @@ -0,0 +1,4 @@ +var sptezv_8f = +[ + [ "sptezv", "sptezv_8f.html#a83e49d961c40a2621c3f2afe70846226", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptezv_8f_source.html b/ver-5.1.0/sptezv_8f_source.html new file mode 100644 index 00000000..d467cea5 --- /dev/null +++ b/ver-5.1.0/sptezv_8f_source.html @@ -0,0 +1,178 @@ + + + + + + + +NCEPLIBS-ip: sptezv.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptezv.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Perform a simple vector spherical transform
    +
    3 C> @author Iredell @date 96-02-29
    +
    4 
    +
    5 C> This subprogram performs a spherical transform
    +
    6 C> between spectral coefficients of divergence and curl
    +
    7 C> and a vector field on a global cylindrical grid.
    +
    8 C> The wave-space can be either triangular or rhomboidal.
    +
    9 C>
    +
    10 C> The grid-space can be either an equally-spaced grid
    +
    11 C> (with or without pole points) or a Gaussian grid.
    +
    12 C>
    +
    13 C> The wave field is in sequential 'IBM order'.
    +
    14 C>
    +
    15 C> The grid field is indexed east to west, then north to south.
    +
    16 C>
    +
    17 C> For more flexibility and efficiency, call SPTRAN().
    +
    18 C>
    +
    19 C> Subprogram can be called from a multiprocessing environment.
    +
    20 C>
    +
    21 C> Minimum grid dimensions for unaliased transforms to spectral:
    +
    22 C> Dimension |Linear |Quadratic
    +
    23 C> ----------------------- |--------- |-------------
    +
    24 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    +
    25 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    +
    26 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    +
    27 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    +
    28 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    +
    29 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    +
    30 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    +
    31 C>
    +
    32 C> @param IROMB Spectral domain shape
    +
    33 C> (0 for triangular, 1 for rhomboidal)
    +
    34 C> @param MAXWV Spectral truncation
    +
    35 C> @param IDRT Grid identifier
    +
    36 C> - IDRT=4 for Gaussian grid
    +
    37 C> - IDRT=0 for equally-spaced grid including poles
    +
    38 C> - IDRT=256 for equally-spaced grid excluding poles
    +
    39 C> @param IMAX Even number of longitudes
    +
    40 C> @param JMAX Number of latitudes
    +
    41 C> @param[out] WAVED Wave divergence field if IDIR>0
    +
    42 C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
    +
    43 C> @param[out] WAVEZ Wave vorticity field if IDIR>0
    +
    44 C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2
    +
    45 C> @param[out] GRIDU Grid u-wind (E->W,N->S) if IDIR<0
    +
    46 C> @param[out] GRIDV Grid v-wind (E->W,N->S) if IDIR<0
    +
    47 C> @param IDIR Transform flag
    +
    48 C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave)
    +
    49 C>
    +
    50 C> @author Iredell @date 96-02-29
    +
    51  SUBROUTINE sptezv(IROMB,MAXWV,IDRT,IMAX,JMAX,
    +
    52  & WAVED,WAVEZ,GRIDU,GRIDV,IDIR)
    +
    53 
    +
    54  REAL WAVED((MAXWV+1)*((IROMB+1)*MAXWV+2))
    +
    55  REAL WAVEZ((MAXWV+1)*((IROMB+1)*MAXWV+2))
    +
    56  REAL GRIDU(IMAX,JMAX)
    +
    57  REAL GRIDV(IMAX,JMAX)
    +
    58 
    +
    59  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    60  ip=1
    +
    61  is=1
    +
    62  jn=imax
    +
    63  js=-jn
    +
    64  kw=2*mx
    +
    65  kg=imax*jmax
    +
    66  jb=1
    +
    67  je=(jmax+1)/2
    +
    68  jc=ncpus()
    +
    69  IF(idir.LT.0) waved=0
    +
    70  IF(idir.LT.0) wavez=0
    +
    71 
    +
    72  CALL sptranfv(iromb,maxwv,idrt,imax,jmax,1,
    +
    73  & ip,is,jn,js,kw,kg,jb,je,jc,
    +
    74  & waved,wavez,
    +
    75  & gridu,gridu(1,jmax),gridv,gridv(1,jmax),idir)
    +
    76  END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    +
    subroutine sptezv(IROMB, MAXWV, IDRT, IMAX, JMAX, WAVED, WAVEZ, GRIDU, GRIDV, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of divergence and curl a...
    Definition: sptezv.f:53
    +
    subroutine sptranfv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IP, IS, JN, JS, KW, KG, JB, JE, JC, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
    Definition: sptranfv.f:83
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgpm_8f.html b/ver-5.1.0/sptgpm_8f.html new file mode 100644 index 00000000..aa4450a7 --- /dev/null +++ b/ver-5.1.0/sptgpm_8f.html @@ -0,0 +1,267 @@ + + + + + + + +NCEPLIBS-ip: sptgpm.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptgpm.f File Reference
    +
    +
    + +

    Transform spectral scalar to Mercator. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptgpm (IROMB, MAXWV, KMAX, MI, MJ, KWSKIP, KGSKIP, NISKIP, NJSKIP, RLAT1, RLON1, DLAT, DLON, WAVE, GM)
     This subprogram performs a spherical transform from spectral coefficients of scalar quantities to scalar fields on a Mercator grid. More...
     
    +

    Detailed Description

    +

    Transform spectral scalar to Mercator.

    +

    +Program history log:

    + + + + + + + +
    Date Programmer Comments
    96-02-29 IREDELL Initial.
    1998-12-15 IREDELL OpenMP directives inserted.
    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition in file sptgpm.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptgpm()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptgpm ( IROMB,
     MAXWV,
     KMAX,
     MI,
     MJ,
     KWSKIP,
     KGSKIP,
     NISKIP,
     NJSKIP,
     RLAT1,
     RLON1,
     DLAT,
     DLON,
    real, dimension(*) WAVE,
    real, dimension(*) GM 
    )
    +
    + +

    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to scalar fields on a Mercator grid.

    +

    The wave-space can be either triangular or rhomboidal. The wave and grid fields may have general indexing, but each wave field is in sequential 'ibm order', i.e. with zonal wavenumber as the slower index. The Mercator grid is identified by the location of its first point and by its respective increments. The transforms are all multiprocessed over sector points. Transform several fields at a time to improve vectorization. Subprogram can be called from a multiprocessing environment.

    +
    Parameters
    + + + + + + + + + + + + + + + + +
    IROMBSpectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVSpectral truncation
    KMAXNumber of fields to transform
    MINumber of points in the faster zonal direction
    MJNumber of points in the slower merid direction
    KWSKIPSkip number between wave fields (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
    KGSKIPSkip number between grid fields (defaults to MI*MJ if KGSKIP=0)
    NISKIPSkip number between grid i-points (defaults to 1 if NISKIP=0)
    NJSKIPSkip number between grid j-points (defaults to MI if NJSKIP=0)
    RLAT1Latitude of the first grid point in degrees
    RLON1Longitude of the first grid point in degrees
    DLATLatitude increment in degrees such that D(PHI)/D(J)=DLAT*COS(PHI) where J is meridional index. DLAT is negative for grids indexed southward. (in terms of grid increment DY valid at latitude RLATI, the latitude increment DLAT is determined as DLAT=DPR*DY/(RERTH*COS(RLATI/DPR)) where DPR=180/PI and RERTH is earth's radius)
    DLONLongitude increment in degrees such that D(LAMBDA)/D(I)=DLON where I is zonal index. DLON is negative for grids indexed westward.
    WAVEWave fields
    GMMercator fields
    +
    +
    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition at line 53 of file sptgpm.f.

    + +

    References splegend(), spsynth(), and spwget().

    + +

    Referenced by sptrunm(), and sptrunmv().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgpm_8f.js b/ver-5.1.0/sptgpm_8f.js new file mode 100644 index 00000000..d1806195 --- /dev/null +++ b/ver-5.1.0/sptgpm_8f.js @@ -0,0 +1,4 @@ +var sptgpm_8f = +[ + [ "sptgpm", "sptgpm_8f.html#a6cffaeaa602eaae5c03166f48065158d", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptgpm_8f_source.html b/ver-5.1.0/sptgpm_8f_source.html new file mode 100644 index 00000000..65c529ce --- /dev/null +++ b/ver-5.1.0/sptgpm_8f_source.html @@ -0,0 +1,226 @@ + + + + + + + +NCEPLIBS-ip: sptgpm.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptgpm.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Transform spectral scalar to Mercator
    +
    3 C> ### Program history log:
    +
    4 C> Date | Programmer | Comments
    +
    5 C> -----------|------------|---------
    +
    6 C> 96-02-29 | IREDELL | Initial.
    +
    7 C> 1998-12-15 | IREDELL | OpenMP directives inserted.
    +
    8 C> @author IREDELL @date 96-02-29
    +
    9 
    +
    10 C> This subprogram performs a spherical transform
    +
    11 C> from spectral coefficients of scalar quantities
    +
    12 C> to scalar fields on a Mercator grid.
    +
    13 C> The wave-space can be either triangular or rhomboidal.
    +
    14 C> The wave and grid fields may have general indexing,
    +
    15 C> but each wave field is in sequential 'ibm order',
    +
    16 C> i.e. with zonal wavenumber as the slower index.
    +
    17 C> The Mercator grid is identified by the location
    +
    18 C> of its first point and by its respective increments.
    +
    19 C> The transforms are all multiprocessed over sector points.
    +
    20 C> Transform several fields at a time to improve vectorization.
    +
    21 C> Subprogram can be called from a multiprocessing environment.
    +
    22 C>
    +
    23 C> @param IROMB Spectral domain shape
    +
    24 C> (0 for triangular, 1 for rhomboidal)
    +
    25 C> @param MAXWV Spectral truncation
    +
    26 C> @param KMAX Number of fields to transform
    +
    27 C> @param MI Number of points in the faster zonal direction
    +
    28 C> @param MJ Number of points in the slower merid direction
    +
    29 C> @param KWSKIP Skip number between wave fields
    +
    30 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
    +
    31 C> @param KGSKIP Skip number between grid fields
    +
    32 C> (defaults to MI*MJ if KGSKIP=0)
    +
    33 C> @param NISKIP Skip number between grid i-points
    +
    34 C> (defaults to 1 if NISKIP=0)
    +
    35 C> @param NJSKIP Skip number between grid j-points
    +
    36 C> (defaults to MI if NJSKIP=0)
    +
    37 C> @param RLAT1 Latitude of the first grid point in degrees
    +
    38 C> @param RLON1 Longitude of the first grid point in degrees
    +
    39 C> @param DLAT Latitude increment in degrees such that
    +
    40 C> D(PHI)/D(J)=DLAT*COS(PHI) where J is meridional index.
    +
    41 C> DLAT is negative for grids indexed southward.
    +
    42 C> (in terms of grid increment DY valid at latitude RLATI,
    +
    43 C> the latitude increment DLAT is determined as
    +
    44 C> DLAT=DPR*DY/(RERTH*COS(RLATI/DPR))
    +
    45 C> where DPR=180/PI and RERTH is earth's radius)
    +
    46 C> @param DLON Longitude increment in degrees such that
    +
    47 C> D(LAMBDA)/D(I)=DLON where I is zonal index.
    +
    48 C> DLON is negative for grids indexed westward.
    +
    49 C> @param WAVE Wave fields
    +
    50 C> @param GM Mercator fields
    +
    51 C>
    +
    52 C> @author IREDELL @date 96-02-29
    +
    53  SUBROUTINE sptgpm(IROMB,MAXWV,KMAX,MI,MJ,
    +
    54  & KWSKIP,KGSKIP,NISKIP,NJSKIP,
    +
    55  & RLAT1,RLON1,DLAT,DLON,WAVE,GM)
    +
    56 
    +
    57  REAL WAVE(*),GM(*)
    +
    58  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    59  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    60  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    61  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    62  INTEGER MP(KMAX)
    +
    63  REAL WTOP(2*(MAXWV+1),KMAX)
    +
    64  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
    +
    65  REAL F(2*MAXWV+3,2,KMAX)
    +
    66  REAL CLAT(MJ),SLAT(MJ),CLON(MAXWV,MI),SLON(MAXWV,MI)
    +
    67  parameter(pi=3.14159265358979,dpr=180./pi)
    +
    68 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    69 C CALCULATE PRELIMINARY CONSTANTS
    +
    70  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    71  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    72  mxtop=maxwv+1
    +
    73  idim=2*maxwv+3
    +
    74  kw=kwskip
    +
    75  kg=kgskip
    +
    76  ni=niskip
    +
    77  nj=njskip
    +
    78  IF(kw.EQ.0) kw=2*mx
    +
    79  IF(kg.EQ.0) kg=mi*mj
    +
    80  IF(ni.EQ.0) ni=1
    +
    81  IF(nj.EQ.0) nj=mi
    +
    82  DO i=1,mi
    +
    83  rlon=mod(rlon1+dlon*(i-1)+3600,360.)
    +
    84  DO l=1,maxwv
    +
    85  clon(l,i)=cos(l*rlon/dpr)
    +
    86  slon(l,i)=sin(l*rlon/dpr)
    +
    87  ENDDO
    +
    88  ENDDO
    +
    89  ye=1-log(tan((rlat1+90)/2/dpr))*dpr/dlat
    +
    90  DO j=1,mj
    +
    91  rlat=atan(exp(dlat/dpr*(j-ye)))*2*dpr-90
    +
    92  clat(j)=cos(rlat/dpr)
    +
    93  slat(j)=sin(rlat/dpr)
    +
    94  ENDDO
    +
    95  mp=0
    +
    96 C$OMP PARALLEL DO
    +
    97  DO k=1,kmax
    +
    98  wtop(1:2*mxtop,k)=0
    +
    99  ENDDO
    +
    100 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    101 C TRANSFORM TO GRID
    +
    102 C$OMP PARALLEL DO PRIVATE(PLN,PLNTOP,F,IJK)
    +
    103  DO j=1,mj
    +
    104  CALL splegend(iromb,maxwv,slat(j),clat(j),eps,epstop,
    +
    105  & pln,plntop)
    +
    106  CALL spsynth(iromb,maxwv,2*maxwv,idim,kw,2*mxtop,kmax,
    +
    107  & clat(j),pln,plntop,mp,wave,wtop,f)
    +
    108  DO k=1,kmax
    +
    109  DO i=1,mi
    +
    110  ijk=(i-1)*ni+(j-1)*nj+(k-1)*kg+1
    +
    111  gm(ijk)=f(1,1,k)
    +
    112  ENDDO
    +
    113  DO l=1,maxwv
    +
    114  DO i=1,mi
    +
    115  ijk=(i-1)*ni+(j-1)*nj+(k-1)*kg+1
    +
    116  gm(ijk)=gm(ijk)+2.*(f(2*l+1,1,k)*clon(l,i)
    +
    117  & -f(2*l+2,1,k)*slon(l,i))
    +
    118  ENDDO
    +
    119  ENDDO
    +
    120  ENDDO
    +
    121  ENDDO
    +
    122 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    123  END
    +
    subroutine splegend(I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
    Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
    Definition: splegend.f:45
    +
    subroutine spsynth(I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
    Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
    Definition: spsynth.f:39
    +
    subroutine sptgpm(IROMB, MAXWV, KMAX, MI, MJ, KWSKIP, KGSKIP, NISKIP, NJSKIP, RLAT1, RLON1, DLAT, DLON, WAVE, GM)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to sca...
    Definition: sptgpm.f:56
    +
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgpmd_8f.html b/ver-5.1.0/sptgpmd_8f.html new file mode 100644 index 00000000..b5ce380c --- /dev/null +++ b/ver-5.1.0/sptgpmd_8f.html @@ -0,0 +1,265 @@ + + + + + + + +NCEPLIBS-ip: sptgpmd.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptgpmd.f File Reference
    +
    +
    + +

    Transform spectral to Mercator gradients. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptgpmd (IROMB, MAXWV, KMAX, MI, MJ, KWSKIP, KGSKIP, NISKIP, NJSKIP, RLAT1, RLON1, DLAT, DLON, WAVE, XM, YM)
     This subprogram performs a spherical transform from spectral coefficients of scalar fields to gradient fields on a Mercator grid. More...
     
    +

    Detailed Description

    +

    Transform spectral to Mercator gradients.

    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition in file sptgpmd.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptgpmd()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptgpmd ( IROMB,
     MAXWV,
     KMAX,
     MI,
     MJ,
     KWSKIP,
     KGSKIP,
     NISKIP,
     NJSKIP,
     RLAT1,
     RLON1,
     DLAT,
     DLON,
    real, dimension(*) WAVE,
    real, dimension(*) XM,
    real, dimension(*) YM 
    )
    +
    + +

    This subprogram performs a spherical transform from spectral coefficients of scalar fields to gradient fields on a Mercator grid.

    +

    The wave-space can be either triangular or rhomboidal. The wave and grid fields may have general indexing, but each wave field is in sequential 'IBM order', i.e. with zonal wavenumber as the slower index.

    +

    The Mercator grid is identified by the location of its first point and by its respective increments.

    +

    The transforms are all multiprocessed over sector points.

    +

    Transform several fields at a time to improve vectorization. Subprogram can be called from a multiprocessing environment.

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    IROMBSpectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVSpectral truncation
    KMAXNumber of fields to transform
    MINumber of points in the faster zonal direction
    MJNumber of points in the slower merid direction
    KWSKIPSkip number between wave fields (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
    KGSKIPSkip number between grid fields (defaults to MI*MJ if KGSKIP=0)
    NISKIPSkip number between grid i-points (defaults to 1 if NISKIP=0)
    NJSKIPSkip number between grid j-points (defaults to MI if NJSKIP=0)
    RLAT1Latitude of the first grid point in degrees
    RLON1Longitude of the first grid point in degrees
    DLATLatitude increment in degrees such that D(PHI)/D(J)=DLAT*COS(PHI) where J is meridional index. DLAT is negative for grids indexed southward. (in terms of grid increment dy valid at latitude RLATI, the latitude increment DLAT is determined as DLAT=DPR*DY/(RERTH*COS(RLATI/DPR)) where DPR=180/PI and RERTH is Earth's radius)
    DLONLongitude increment in degrees such that D(LAMBDA)/D(I)=DLON where I is zonal index. DLON is negative for grids indexed westward.
    WAVEWave fields
    XMMercator x-gradients
    YMMercator y-gradients
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition at line 53 of file sptgpmd.f.

    + +

    References splaplac(), sptgpmv(), and spwget().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgpmd_8f.js b/ver-5.1.0/sptgpmd_8f.js new file mode 100644 index 00000000..37a6a937 --- /dev/null +++ b/ver-5.1.0/sptgpmd_8f.js @@ -0,0 +1,4 @@ +var sptgpmd_8f = +[ + [ "sptgpmd", "sptgpmd_8f.html#af71718c75a2b24b74fa7e1e4318d0539", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptgpmd_8f_source.html b/ver-5.1.0/sptgpmd_8f_source.html new file mode 100644 index 00000000..2f78312e --- /dev/null +++ b/ver-5.1.0/sptgpmd_8f_source.html @@ -0,0 +1,184 @@ + + + + + + + +NCEPLIBS-ip: sptgpmd.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptgpmd.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Transform spectral to Mercator gradients.
    +
    3 C> @author Iredell @date 96-02-29
    +
    4 
    +
    5 C> This subprogram performs a spherical transform
    +
    6 C> from spectral coefficients of scalar fields
    +
    7 C> to gradient fields on a Mercator grid.
    +
    8 C>
    +
    9 C> The wave-space can be either triangular or rhomboidal.
    +
    10 C> The wave and grid fields may have general indexing,
    +
    11 C> but each wave field is in sequential 'IBM order',
    +
    12 C> i.e. with zonal wavenumber as the slower index.
    +
    13 C>
    +
    14 C> The Mercator grid is identified by the location
    +
    15 C> of its first point and by its respective increments.
    +
    16 C>
    +
    17 C> The transforms are all multiprocessed over sector points.
    +
    18 C>
    +
    19 C> Transform several fields at a time to improve vectorization.
    +
    20 C> Subprogram can be called from a multiprocessing environment.
    +
    21 C>
    +
    22 C> @param IROMB Spectral domain shape
    +
    23 C> (0 for triangular, 1 for rhomboidal)
    +
    24 C> @param MAXWV Spectral truncation
    +
    25 C> @param KMAX Number of fields to transform
    +
    26 C> @param MI Number of points in the faster zonal direction
    +
    27 C> @param MJ Number of points in the slower merid direction
    +
    28 C> @param KWSKIP Skip number between wave fields
    +
    29 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
    +
    30 C> @param KGSKIP Skip number between grid fields
    +
    31 C> (defaults to MI*MJ if KGSKIP=0)
    +
    32 C> @param NISKIP Skip number between grid i-points
    +
    33 C> (defaults to 1 if NISKIP=0)
    +
    34 C> @param NJSKIP Skip number between grid j-points
    +
    35 C> (defaults to MI if NJSKIP=0)
    +
    36 C> @param RLAT1 Latitude of the first grid point in degrees
    +
    37 C> @param RLON1 Longitude of the first grid point in degrees
    +
    38 C> @param DLAT Latitude increment in degrees such that
    +
    39 C> D(PHI)/D(J)=DLAT*COS(PHI) where J is meridional index.
    +
    40 C> DLAT is negative for grids indexed southward.
    +
    41 C> (in terms of grid increment dy valid at latitude RLATI,
    +
    42 C> the latitude increment DLAT is determined as
    +
    43 C> DLAT=DPR*DY/(RERTH*COS(RLATI/DPR))
    +
    44 C> where DPR=180/PI and RERTH is Earth's radius)
    +
    45 C> @param DLON Longitude increment in degrees such that
    +
    46 C> D(LAMBDA)/D(I)=DLON where I is zonal index.
    +
    47 C> DLON is negative for grids indexed westward.
    +
    48 C> @param WAVE Wave fields
    +
    49 C> @param XM Mercator x-gradients
    +
    50 C> @param YM Mercator y-gradients
    +
    51 C>
    +
    52 C> @author Iredell @date 96-02-29
    +
    53  SUBROUTINE sptgpmd(IROMB,MAXWV,KMAX,MI,MJ,
    +
    54  & KWSKIP,KGSKIP,NISKIP,NJSKIP,
    +
    55  & RLAT1,RLON1,DLAT,DLON,WAVE,XM,YM)
    +
    56 
    +
    57  REAL WAVE(*),XM(*),YM(*)
    +
    58  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    59  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    60  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    61  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    62  REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    63  REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    64 
    +
    65 C CALCULATE PRELIMINARY CONSTANTS
    +
    66  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    67  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    68  mdim=2*mx+1
    +
    69  kw=kwskip
    +
    70  IF(kw.EQ.0) kw=2*mx
    +
    71 
    +
    72 C CALCULATE GRADIENTS
    +
    73 C$OMP PARALLEL DO PRIVATE(KWS)
    +
    74  DO k=1,kmax
    +
    75  kws=(k-1)*kw
    +
    76  CALL splaplac(iromb,maxwv,enn1,wave(kws+1),wd(1,k),1)
    +
    77  wz(1:2*mx,k)=0.
    +
    78  ENDDO
    +
    79  CALL sptgpmv(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
    +
    80  & rlat1,rlon1,dlat,dlon,wd,wz,xm,ym)
    +
    81  END
    +
    subroutine splaplac(I, M, ENN1, Q, QD2, IDIR)
    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
    Definition: splaplac.f:25
    +
    subroutine sptgpmd(IROMB, MAXWV, KMAX, MI, MJ, KWSKIP, KGSKIP, NISKIP, NJSKIP, RLAT1, RLON1, DLAT, DLON, WAVE, XM, YM)
    This subprogram performs a spherical transform from spectral coefficients of scalar fields to gradien...
    Definition: sptgpmd.f:56
    +
    subroutine sptgpmv(IROMB, MAXWV, KMAX, MI, MJ, KWSKIP, KGSKIP, NISKIP, NJSKIP, RLAT1, RLON1, DLAT, DLON, WAVED, WAVEZ, UM, VM)
    This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
    Definition: sptgpmv.f:63
    +
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgpmv_8f.html b/ver-5.1.0/sptgpmv_8f.html new file mode 100644 index 00000000..fdaeed43 --- /dev/null +++ b/ver-5.1.0/sptgpmv_8f.html @@ -0,0 +1,285 @@ + + + + + + + +NCEPLIBS-ip: sptgpmv.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptgpmv.f File Reference
    +
    +
    + +

    Transform spectral vector to Mercator. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptgpmv (IROMB, MAXWV, KMAX, MI, MJ, KWSKIP, KGSKIP, NISKIP, NJSKIP, RLAT1, RLON1, DLAT, DLON, WAVED, WAVEZ, UM, VM)
     This subprogram performs a spherical transform from spectral coefficients of divergences and curls to vector fields on a Mercator grid. More...
     
    +

    Detailed Description

    +

    Transform spectral vector to Mercator.

    +

    +Program history log:

    + + + + + + + +
    Date Programmer Comments
    96-02-29 IREDELL Initial.
    1998-12-15 IREDELL OpenMP directives inserted.
    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition in file sptgpmv.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptgpmv()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptgpmv ( IROMB,
     MAXWV,
     KMAX,
     MI,
     MJ,
     KWSKIP,
     KGSKIP,
     NISKIP,
     NJSKIP,
     RLAT1,
     RLON1,
     DLAT,
     DLON,
    real, dimension(*) WAVED,
    real, dimension(*) WAVEZ,
    real, dimension(*) UM,
    real, dimension(*) VM 
    )
    +
    + +

    This subprogram performs a spherical transform from spectral coefficients of divergences and curls to vector fields on a Mercator grid.

    +

    The wave-space can be either triangular or rhomboidal.

    +

    The wave and grid fields may have general indexing, but each wave field is in sequential 'ibm order', i.e., with zonal wavenumber as the slower index.

    +

    The Mercator grid is identified by the location of its first point and by its respective increments.

    +

    The transforms are all multiprocessed over sector points. Transform several fields at a time to improve vectorization.

    +

    Subprogram can be called from a multiprocessing environment.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + +
    IROMBSpectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVSpectral truncation
    KMAXNumber of fields to transform
    MINumber of points in the faster zonal direction
    MJNumber of points in the slower merid direction
    KWSKIPSkip number between wave fields (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
    KGSKIPSkip number between grid fields (defaults to MI*MJ if KGSKIP=0)
    NISKIPSkip number between grid i-points (defaults to 1 if NISKIP=0)
    NJSKIPSkip number between grid j-points (defaults to MI if NJSKIP=0)
    RLAT1Latitude of the first grid point in degrees
    RLON1Longitude of the first grid point in degrees
    DLATLatitude increment in degrees such that D(PHI)/D(J)=DLAT*COS(PHI) where J is meridional index. DLAT is negative for grids indexed southward. (in terms of grid increment dy valid at latitude RLATI, The latitude increment DLAT is determined as DLAT=DPR*DY/(RERTH*COS(RLATI/DPR)) where DPR=180/PI and RERTH is Earth's radius)
    DLONlongitude increment in degrees such that D(LAMBDA)/D(I)=DLON where I is zonal index. DLON is negative for grids indexed westward.
    WAVEDWave divergence fields
    WAVEZWave vorticity fields
    UMMercator u-winds
    VMMercator v-winds
    +
    +
    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition at line 60 of file sptgpmv.f.

    + +

    References spdz2uv(), splegend(), spsynth(), and spwget().

    + +

    Referenced by sptgpmd(), and sptrunmv().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgpmv_8f.js b/ver-5.1.0/sptgpmv_8f.js new file mode 100644 index 00000000..a46a2628 --- /dev/null +++ b/ver-5.1.0/sptgpmv_8f.js @@ -0,0 +1,4 @@ +var sptgpmv_8f = +[ + [ "sptgpmv", "sptgpmv_8f.html#a15de3accfd448d116324872c8fb1bb17", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptgpmv_8f_source.html b/ver-5.1.0/sptgpmv_8f_source.html new file mode 100644 index 00000000..71c666ac --- /dev/null +++ b/ver-5.1.0/sptgpmv_8f_source.html @@ -0,0 +1,246 @@ + + + + + + + +NCEPLIBS-ip: sptgpmv.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptgpmv.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Transform spectral vector to Mercator
    +
    3 C> ### Program history log:
    +
    4 C> Date | Programmer | Comments
    +
    5 C> -----|------------|----------
    +
    6 C> 96-02-29 | IREDELL | Initial.
    +
    7 C> 1998-12-15 | IREDELL | OpenMP directives inserted.
    +
    8 C> @author IREDELL @date 96-02-29
    +
    9 
    +
    10 C> This subprogram performs a spherical transform
    +
    11 C> from spectral coefficients of divergences and curls
    +
    12 C> to vector fields on a Mercator grid.
    +
    13 C>
    +
    14 C> The wave-space can be either triangular or rhomboidal.
    +
    15 C>
    +
    16 C> The wave and grid fields may have general indexing,
    +
    17 C> but each wave field is in sequential 'ibm order',
    +
    18 C> i.e., with zonal wavenumber as the slower index.
    +
    19 C>
    +
    20 C> The Mercator grid is identified by the location
    +
    21 C> of its first point and by its respective increments.
    +
    22 C>
    +
    23 C> The transforms are all multiprocessed over sector points.
    +
    24 C> Transform several fields at a time to improve vectorization.
    +
    25 C>
    +
    26 C> Subprogram can be called from a multiprocessing environment.
    +
    27 C>
    +
    28 C> @param IROMB Spectral domain shape
    +
    29 C> (0 for triangular, 1 for rhomboidal)
    +
    30 C> @param MAXWV Spectral truncation
    +
    31 C> @param KMAX Number of fields to transform
    +
    32 C> @param MI Number of points in the faster zonal direction
    +
    33 C> @param MJ Number of points in the slower merid direction
    +
    34 C> @param KWSKIP Skip number between wave fields
    +
    35 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
    +
    36 C> @param KGSKIP Skip number between grid fields
    +
    37 C> (defaults to MI*MJ if KGSKIP=0)
    +
    38 C> @param NISKIP Skip number between grid i-points
    +
    39 C> (defaults to 1 if NISKIP=0)
    +
    40 C> @param NJSKIP Skip number between grid j-points
    +
    41 C> (defaults to MI if NJSKIP=0)
    +
    42 C> @param RLAT1 Latitude of the first grid point in degrees
    +
    43 C> @param RLON1 Longitude of the first grid point in degrees
    +
    44 C> @param DLAT Latitude increment in degrees such that
    +
    45 C> D(PHI)/D(J)=DLAT*COS(PHI) where J is meridional index.
    +
    46 C> DLAT is negative for grids indexed southward.
    +
    47 C> (in terms of grid increment dy valid at latitude RLATI,
    +
    48 C> The latitude increment DLAT is determined as
    +
    49 C> DLAT=DPR*DY/(RERTH*COS(RLATI/DPR))
    +
    50 C> where DPR=180/PI and RERTH is Earth's radius)
    +
    51 C> @param DLON longitude increment in degrees such that
    +
    52 C> D(LAMBDA)/D(I)=DLON where I is zonal index.
    +
    53 C> DLON is negative for grids indexed westward.
    +
    54 C> @param WAVED Wave divergence fields
    +
    55 C> @param WAVEZ Wave vorticity fields
    +
    56 C> @param UM Mercator u-winds
    +
    57 C> @param VM Mercator v-winds
    +
    58 C>
    +
    59 C> @author IREDELL @date 96-02-29
    +
    60  SUBROUTINE sptgpmv(IROMB,MAXWV,KMAX,MI,MJ,
    +
    61  & KWSKIP,KGSKIP,NISKIP,NJSKIP,
    +
    62  & RLAT1,RLON1,DLAT,DLON,WAVED,WAVEZ,UM,VM)
    +
    63 
    +
    64  REAL WAVED(*),WAVEZ(*),UM(*),VM(*)
    +
    65  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    66  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    67  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    68  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    69  INTEGER MP(2*KMAX)
    +
    70  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,2*KMAX)
    +
    71  REAL WTOP(2*(MAXWV+1),2*KMAX)
    +
    72  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
    +
    73  REAL F(2*MAXWV+3,2,2*KMAX)
    +
    74  REAL CLAT(MJ),SLAT(MJ),CLON(MAXWV,MI),SLON(MAXWV,MI)
    +
    75  parameter(pi=3.14159265358979,dpr=180./pi)
    +
    76 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    77 C CALCULATE PRELIMINARY CONSTANTS
    +
    78  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    79  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    80  mxtop=maxwv+1
    +
    81  mdim=2*mx+1
    +
    82  idim=2*maxwv+3
    +
    83  kw=kwskip
    +
    84  kg=kgskip
    +
    85  ni=niskip
    +
    86  nj=njskip
    +
    87  IF(kw.EQ.0) kw=2*mx
    +
    88  IF(kg.EQ.0) kg=mi*mj
    +
    89  IF(ni.EQ.0) ni=1
    +
    90  IF(nj.EQ.0) nj=mi
    +
    91  DO i=1,mi
    +
    92  rlon=mod(rlon1+dlon*(i-1)+3600,360.)
    +
    93  DO l=1,maxwv
    +
    94  clon(l,i)=cos(l*rlon/dpr)
    +
    95  slon(l,i)=sin(l*rlon/dpr)
    +
    96  ENDDO
    +
    97  ENDDO
    +
    98  ye=1-log(tan((rlat1+90)/2/dpr))*dpr/dlat
    +
    99  DO j=1,mj
    +
    100  rlat=atan(exp(dlat/dpr*(j-ye)))*2*dpr-90
    +
    101  clat(j)=cos(rlat/dpr)
    +
    102  slat(j)=sin(rlat/dpr)
    +
    103  ENDDO
    +
    104  mp=1
    +
    105 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    106 C CALCULATE SPECTRAL WINDS
    +
    107 C$OMP PARALLEL DO PRIVATE(KWS)
    +
    108  DO k=1,kmax
    +
    109  kws=(k-1)*kw
    +
    110  CALL spdz2uv(iromb,maxwv,enn1,elonn1,eon,eontop,
    +
    111  & waved(kws+1),wavez(kws+1),
    +
    112  & w(1,k),w(1,kmax+k),wtop(1,k),wtop(1,kmax+k))
    +
    113  ENDDO
    +
    114 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    115 C TRANSFORM TO GRID
    +
    116 C$OMP PARALLEL DO PRIVATE(PLN,PLNTOP,F,KU,KV,IJK)
    +
    117  DO j=1,mj
    +
    118  CALL splegend(iromb,maxwv,slat(j),clat(j),eps,epstop,
    +
    119  & pln,plntop)
    +
    120  CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
    +
    121  & clat(j),pln,plntop,mp,w,wtop,f)
    +
    122  DO k=1,kmax
    +
    123  ku=k
    +
    124  kv=k+kmax
    +
    125  DO i=1,mi
    +
    126  ijk=(i-1)*ni+(j-1)*nj+(k-1)*kg+1
    +
    127  um(ijk)=f(1,1,ku)
    +
    128  vm(ijk)=f(1,1,kv)
    +
    129  ENDDO
    +
    130  DO l=1,maxwv
    +
    131  DO i=1,mi
    +
    132  ijk=(i-1)*ni+(j-1)*nj+(k-1)*kg+1
    +
    133  um(ijk)=um(ijk)+2.*(f(2*l+1,1,ku)*clon(l,i)
    +
    134  & -f(2*l+2,1,ku)*slon(l,i))
    +
    135  vm(ijk)=vm(ijk)+2.*(f(2*l+1,1,kv)*clon(l,i)
    +
    136  & -f(2*l+2,1,kv)*slon(l,i))
    +
    137  ENDDO
    +
    138  ENDDO
    +
    139  ENDDO
    +
    140  ENDDO
    +
    141 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    142  END
    +
    subroutine spdz2uv(I, M, ENN1, ELONN1, EON, EONTOP, D, Z, U, V, UTOP, VTOP)
    Computes the wind components from divergence and vorticity in spectral space.
    Definition: spdz2uv.f:49
    +
    subroutine splegend(I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
    Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
    Definition: splegend.f:45
    +
    subroutine spsynth(I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
    Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
    Definition: spsynth.f:39
    +
    subroutine sptgpmv(IROMB, MAXWV, KMAX, MI, MJ, KWSKIP, KGSKIP, NISKIP, NJSKIP, RLAT1, RLON1, DLAT, DLON, WAVED, WAVEZ, UM, VM)
    This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
    Definition: sptgpmv.f:63
    +
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgps_8f.html b/ver-5.1.0/sptgps_8f.html new file mode 100644 index 00000000..8b17dee0 --- /dev/null +++ b/ver-5.1.0/sptgps_8f.html @@ -0,0 +1,281 @@ + + + + + + + +NCEPLIBS-ip: sptgps.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptgps.f File Reference
    +
    +
    + +

    Transform spectral scalar to polar stereo. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptgps (IROMB, MAXWV, KMAX, NPS, KWSKIP, KGSKIP, NISKIP, NJSKIP, TRUE, XMESH, ORIENT, WAVE, GN, GS)
     This subprogram performs a spherical transform from spectral coefficients of scalar quantities to scalar fields on a pair of polar stereographic grids. More...
     
    +

    Detailed Description

    +

    Transform spectral scalar to polar stereo.

    +

    +Program History Log

    + + + + + + + +
    Date Programmer Comments
    96-02-29 Iredell Initial.
    1998-12-15 Iredell Openmp directives inserted.
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition in file sptgps.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptgps()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptgps ( IROMB,
     MAXWV,
     KMAX,
     NPS,
     KWSKIP,
     KGSKIP,
     NISKIP,
     NJSKIP,
     TRUE,
     XMESH,
     ORIENT,
    real, dimension(*) WAVE,
    real, dimension(*) GN,
    real, dimension(*) GS 
    )
    +
    + +

    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to scalar fields on a pair of polar stereographic grids.

    +

    The wave-space can be either triangular or rhomboidal.

    +

    The wave and grid fields may have general indexing, but each wave field is in sequential 'IBM order', i.e. with zonal wavenumber as the slower index.

    +

    The two square polar stereographic grids are centered on the respective poles, with the orientation longitude of the southern hemisphere grid 180 degrees opposite that of the northern hemisphere grid.

    +

    The transform is made efficient by combining points in eight sectors of each polar stereographic grid,
    + numbered as in the diagram below.

    +

    The pole and the sector boundaries
    + are treated specially in the code.
    +

    +

    Unfortunately, this approach induces some hairy indexing and code loquacity.

    +
    +              \ 4 | 5 /
    +               \  |  /
    +              3 \ | / 6
    +                 |/
    +              ----+----
    +                 /|\
    +              2 / | \ 7
    +               /  |  \
    +              / 1 | 8 \
    + 

    The transforms are all multiprocessed over sector points.

    +

    Transform several fields at a time to improve vectorization.

    +

    Subprogram can be called from a multiprocessing environment.

    +
    Parameters
    + + + + + + + + + + + + + + + +
    IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVspectral truncation
    KMAXnumber of fields to transform.
    NPSodd order of the polar stereographic grids.
    KWSKIPskip number between wave fields (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
    KGSKIPskip number between grid fields (defaults to NPS*NPS if KGSKIP=0)
    NISKIPskip number between grid i-points (defaults to 1 if NISKIP=0)
    NJSKIPskip number between grid j-points (defaults to NPS if NJSKIP=0)
    TRUElatitude at which ps grid is true (usually 60.)
    XMESHgrid length at true latitude (m)
    ORIENTlongitude at bottom of northern ps grid (southern ps grid will have opposite orientation.)
    WAVEwave fields
    GNnorthern polar stereographic fields
    GSsouthern polar stereographic fields
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition at line 78 of file sptgps.f.

    + +

    References splegend(), spsynth(), and spwget().

    + +

    Referenced by sptruns(), and sptrunsv().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgps_8f.js b/ver-5.1.0/sptgps_8f.js new file mode 100644 index 00000000..8cdfa429 --- /dev/null +++ b/ver-5.1.0/sptgps_8f.js @@ -0,0 +1,4 @@ +var sptgps_8f = +[ + [ "sptgps", "sptgps_8f.html#af06a2dccfa311014fc9f671b14f247b2", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptgps_8f_source.html b/ver-5.1.0/sptgps_8f_source.html new file mode 100644 index 00000000..3aac1362 --- /dev/null +++ b/ver-5.1.0/sptgps_8f_source.html @@ -0,0 +1,650 @@ + + + + + + + +NCEPLIBS-ip: sptgps.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptgps.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Transform spectral scalar to polar stereo.
    +
    3 C>
    +
    4 C> ### Program History Log
    +
    5 C> Date | Programmer | Comments
    +
    6 C> -----|------------|---------
    +
    7 C> 96-02-29 | Iredell | Initial.
    +
    8 C> 1998-12-15 | Iredell | Openmp directives inserted.
    +
    9 C>
    +
    10 C> @author Iredell @date 96-02-29
    +
    11 
    +
    12 C> This subprogram performs a spherical transform
    +
    13 C> from spectral coefficients of scalar quantities
    +
    14 C> to scalar fields on a pair of polar stereographic grids.
    +
    15 C>
    +
    16 C> The wave-space can be either triangular or rhomboidal.
    +
    17 C>
    +
    18 C> The wave and grid fields may have general indexing,
    +
    19 C> but each wave field is in sequential 'IBM order',
    +
    20 C> i.e. with zonal wavenumber as the slower index.
    +
    21 C>
    +
    22 C> The two square polar stereographic grids are centered
    +
    23 C> on the respective poles, with the orientation longitude
    +
    24 C> of the southern hemisphere grid 180 degrees opposite
    +
    25 C> that of the northern hemisphere grid.
    +
    26 C>
    +
    27 C> The transform is made efficient
    +
    28 C> by combining points in eight sectors
    +
    29 C> of each polar stereographic grid,
    +
    30 C> numbered as in the diagram below.
    +
    31 C>
    +
    32 C> The pole and the sector boundaries
    +
    33 C> are treated specially in the code.
    +
    34 C>
    +
    35 C> Unfortunately, this approach induces
    +
    36 C> some hairy indexing and code loquacity.
    +
    37 C>
    +
    38 C> <pre>
    +
    39 C> \ 4 | 5 /
    +
    40 C> \ | /
    +
    41 C> 3 \ | / 6
    +
    42 C> \|/
    +
    43 C> ----+----
    +
    44 C> /|\
    +
    45 C> 2 / | \ 7
    +
    46 C> / | \
    +
    47 C> / 1 | 8 \
    +
    48 C> </pre>
    +
    49 C>
    +
    50 C> The transforms are all multiprocessed over sector points.
    +
    51 C>
    +
    52 C> Transform several fields at a time to improve vectorization.
    +
    53 C>
    +
    54 C> Subprogram can be called from a multiprocessing environment.
    +
    55 C>
    +
    56 C> @param IROMB spectral domain shape
    +
    57 C> (0 for triangular, 1 for rhomboidal)
    +
    58 C> @param MAXWV spectral truncation
    +
    59 C> @param KMAX number of fields to transform.
    +
    60 C> @param NPS odd order of the polar stereographic grids.
    +
    61 C> @param KWSKIP skip number between wave fields
    +
    62 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
    +
    63 C> @param KGSKIP skip number between grid fields
    +
    64 C> (defaults to NPS*NPS if KGSKIP=0)
    +
    65 C> @param NISKIP skip number between grid i-points
    +
    66 C> (defaults to 1 if NISKIP=0)
    +
    67 C> @param NJSKIP skip number between grid j-points
    +
    68 C> (defaults to NPS if NJSKIP=0)
    +
    69 C> @param TRUE latitude at which ps grid is true (usually 60.)
    +
    70 C> @param XMESH grid length at true latitude (m)
    +
    71 C> @param ORIENT longitude at bottom of northern ps grid
    +
    72 C> (southern ps grid will have opposite orientation.)
    +
    73 C> @param WAVE wave fields
    +
    74 C> @param GN northern polar stereographic fields
    +
    75 C> @param GS southern polar stereographic fields
    +
    76 C>
    +
    77 C> @author Iredell @date 96-02-29
    +
    78  SUBROUTINE sptgps(IROMB,MAXWV,KMAX,NPS,
    +
    79  & KWSKIP,KGSKIP,NISKIP,NJSKIP,
    +
    80  & TRUE,XMESH,ORIENT,WAVE,GN,GS)
    +
    81 
    +
    82  REAL WAVE(*),GN(*),GS(*)
    +
    83  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    84  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    85  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    86  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    87  INTEGER MP(KMAX)
    +
    88  REAL SLON(MAXWV,8),CLON(MAXWV,8),SROT(0:3),CROT(0:3)
    +
    89  REAL WTOP(2*(MAXWV+1),KMAX)
    +
    90  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
    +
    91  REAL F(2*MAXWV+3,2,KMAX)
    +
    92  DATA srot/0.,1.,0.,-1./,crot/1.,0.,-1.,0./
    +
    93  parameter(rerth=6.3712e6)
    +
    94  parameter(pi=3.14159265358979,dpr=180./pi)
    +
    95 
    +
    96 C CALCULATE PRELIMINARY CONSTANTS
    +
    97  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    98  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    99  mxtop=maxwv+1
    +
    100  idim=2*maxwv+3
    +
    101  kw=kwskip
    +
    102  kg=kgskip
    +
    103  ni=niskip
    +
    104  nj=njskip
    +
    105  IF(kw.EQ.0) kw=2*mx
    +
    106  IF(kg.EQ.0) kg=nps*nps
    +
    107  IF(ni.EQ.0) ni=1
    +
    108  IF(nj.EQ.0) nj=nps
    +
    109  mp=0
    +
    110  nph=(nps-1)/2
    +
    111  gq=((1.+sin(true/dpr))*rerth/xmesh)**2
    +
    112 C$OMP PARALLEL DO
    +
    113  DO k=1,kmax
    +
    114  wtop(1:2*mxtop,k)=0
    +
    115  ENDDO
    +
    116 
    +
    117 C CALCULATE POLE POINT
    +
    118  i1=nph+1
    +
    119  j1=nph+1
    +
    120  ij1=(i1-1)*ni+(j1-1)*nj+1
    +
    121  slat1=1.
    +
    122  clat1=0.
    +
    123  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
    +
    124  & pln,plntop)
    +
    125  CALL spsynth(iromb,maxwv,2*maxwv,idim,kw,2*mxtop,kmax,
    +
    126  & clat1,pln,plntop,mp,wave,wtop,f)
    +
    127 CDIR$ IVDEP
    +
    128  DO k=1,kmax
    +
    129  ijk1=ij1+(k-1)*kg
    +
    130  gn(ijk1)=f(1,1,k)
    +
    131  gs(ijk1)=f(1,2,k)
    +
    132  ENDDO
    +
    133 
    +
    134 C CALCULATE POINTS ALONG THE ROW AND COLUMN OF THE POLE,
    +
    135 C STARTING AT THE ORIENTATION LONGITUDE AND GOING CLOCKWISE.
    +
    136 C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8)
    +
    137 C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8)
    +
    138 C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8)
    +
    139 C$OMP& PRIVATE(DJ1,DI1,RQ,RADLON,RADLON1,RADLON2,SLAT1,CLAT1)
    +
    140 C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,LR,LI)
    +
    141  DO j1=1,nph
    +
    142  i1=nph+1
    +
    143  radlon=orient/dpr
    +
    144  j3=nps+1-i1
    +
    145  i3=j1
    +
    146  j5=nps+1-j1
    +
    147  i5=nps+1-i1
    +
    148  j7=i1
    +
    149  i7=nps+1-j1
    +
    150  ij1=(i1-1)*ni+(j1-1)*nj+1
    +
    151  ij3=(i3-1)*ni+(j3-1)*nj+1
    +
    152  ij5=(i5-1)*ni+(j5-1)*nj+1
    +
    153  ij7=(i7-1)*ni+(j7-1)*nj+1
    +
    154  di1=i1-nph-1
    +
    155  dj1=j1-nph-1
    +
    156  rq=di1**2+dj1**2
    +
    157  slat1=(gq-rq)/(gq+rq)
    +
    158  clat1=sqrt(1.-slat1**2)
    +
    159  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
    +
    160  & pln,plntop)
    +
    161  CALL spsynth(iromb,maxwv,2*maxwv,idim,kw,2*mxtop,kmax,
    +
    162  & clat1,pln,plntop,mp,wave,wtop,f)
    +
    163  DO l=1,maxwv
    +
    164  slon(l,1)=sin(l*radlon)
    +
    165  clon(l,1)=cos(l*radlon)
    +
    166  slon(l,3)=slon(l,1)*crot(mod(1*l,4))
    +
    167  & -clon(l,1)*srot(mod(1*l,4))
    +
    168  clon(l,3)=clon(l,1)*crot(mod(1*l,4))
    +
    169  & +slon(l,1)*srot(mod(1*l,4))
    +
    170  slon(l,5)=slon(l,1)*crot(mod(2*l,4))
    +
    171  & -clon(l,1)*srot(mod(2*l,4))
    +
    172  clon(l,5)=clon(l,1)*crot(mod(2*l,4))
    +
    173  & +slon(l,1)*srot(mod(2*l,4))
    +
    174  slon(l,7)=slon(l,1)*crot(mod(3*l,4))
    +
    175  & -clon(l,1)*srot(mod(3*l,4))
    +
    176  clon(l,7)=clon(l,1)*crot(mod(3*l,4))
    +
    177  & +slon(l,1)*srot(mod(3*l,4))
    +
    178  ENDDO
    +
    179 CDIR$ IVDEP
    +
    180  DO k=1,kmax
    +
    181  ijk1=ij1+(k-1)*kg
    +
    182  ijk3=ij3+(k-1)*kg
    +
    183  ijk5=ij5+(k-1)*kg
    +
    184  ijk7=ij7+(k-1)*kg
    +
    185  gn(ijk1)=f(1,1,k)
    +
    186  gn(ijk3)=f(1,1,k)
    +
    187  gn(ijk5)=f(1,1,k)
    +
    188  gn(ijk7)=f(1,1,k)
    +
    189  gs(ijk1)=f(1,2,k)
    +
    190  gs(ijk3)=f(1,2,k)
    +
    191  gs(ijk5)=f(1,2,k)
    +
    192  gs(ijk7)=f(1,2,k)
    +
    193  ENDDO
    +
    194  IF(kmax.EQ.1) THEN
    +
    195  DO l=1,maxwv
    +
    196  lr=2*l+1
    +
    197  li=2*l+2
    +
    198  gn(ij1)=gn(ij1)+2*(f(lr,1,1)*clon(l,1)
    +
    199  & -f(li,1,1)*slon(l,1))
    +
    200  gn(ij3)=gn(ij3)+2*(f(lr,1,1)*clon(l,3)
    +
    201  & -f(li,1,1)*slon(l,3))
    +
    202  gn(ij5)=gn(ij5)+2*(f(lr,1,1)*clon(l,5)
    +
    203  & -f(li,1,1)*slon(l,5))
    +
    204  gn(ij7)=gn(ij7)+2*(f(lr,1,1)*clon(l,7)
    +
    205  & -f(li,1,1)*slon(l,7))
    +
    206  gs(ij1)=gs(ij1)+2*(f(lr,2,1)*clon(l,5)
    +
    207  & -f(li,2,1)*slon(l,5))
    +
    208  gs(ij3)=gs(ij3)+2*(f(lr,2,1)*clon(l,3)
    +
    209  & -f(li,2,1)*slon(l,3))
    +
    210  gs(ij5)=gs(ij5)+2*(f(lr,2,1)*clon(l,1)
    +
    211  & -f(li,2,1)*slon(l,1))
    +
    212  gs(ij7)=gs(ij7)+2*(f(lr,2,1)*clon(l,7)
    +
    213  & -f(li,2,1)*slon(l,7))
    +
    214  ENDDO
    +
    215  ELSE
    +
    216  DO l=1,maxwv
    +
    217  lr=2*l+1
    +
    218  li=2*l+2
    +
    219 CDIR$ IVDEP
    +
    220  DO k=1,kmax
    +
    221  ijk1=ij1+(k-1)*kg
    +
    222  ijk3=ij3+(k-1)*kg
    +
    223  ijk5=ij5+(k-1)*kg
    +
    224  ijk7=ij7+(k-1)*kg
    +
    225  gn(ijk1)=gn(ijk1)+2*(f(lr,1,k)*clon(l,1)
    +
    226  & -f(li,1,k)*slon(l,1))
    +
    227  gn(ijk3)=gn(ijk3)+2*(f(lr,1,k)*clon(l,3)
    +
    228  & -f(li,1,k)*slon(l,3))
    +
    229  gn(ijk5)=gn(ijk5)+2*(f(lr,1,k)*clon(l,5)
    +
    230  & -f(li,1,k)*slon(l,5))
    +
    231  gn(ijk7)=gn(ijk7)+2*(f(lr,1,k)*clon(l,7)
    +
    232  & -f(li,1,k)*slon(l,7))
    +
    233  gs(ijk1)=gs(ijk1)+2*(f(lr,2,k)*clon(l,5)
    +
    234  & -f(li,2,k)*slon(l,5))
    +
    235  gs(ijk3)=gs(ijk3)+2*(f(lr,2,k)*clon(l,3)
    +
    236  & -f(li,2,k)*slon(l,3))
    +
    237  gs(ijk5)=gs(ijk5)+2*(f(lr,2,k)*clon(l,1)
    +
    238  & -f(li,2,k)*slon(l,1))
    +
    239  gs(ijk7)=gs(ijk7)+2*(f(lr,2,k)*clon(l,7)
    +
    240  & -f(li,2,k)*slon(l,7))
    +
    241  ENDDO
    +
    242  ENDDO
    +
    243  ENDIF
    +
    244  ENDDO
    +
    245 
    +
    246 C CALCULATE POINTS ON THE MAIN DIAGONALS THROUGH THE POLE,
    +
    247 C STARTING CLOCKWISE OF THE ORIENTATION LONGITUDE AND GOING CLOCKWISE.
    +
    248 C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8)
    +
    249 C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8)
    +
    250 C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8)
    +
    251 C$OMP& PRIVATE(DJ1,DI1,RQ,RADLON,RADLON1,RADLON2,SLAT1,CLAT1)
    +
    252 C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,LR,LI)
    +
    253  DO j1=1,nph
    +
    254  i1=j1
    +
    255  radlon=(orient-45)/dpr
    +
    256  j3=nps+1-i1
    +
    257  i3=j1
    +
    258  j5=nps+1-j1
    +
    259  i5=nps+1-i1
    +
    260  j7=i1
    +
    261  i7=nps+1-j1
    +
    262  ij1=(i1-1)*ni+(j1-1)*nj+1
    +
    263  ij3=(i3-1)*ni+(j3-1)*nj+1
    +
    264  ij5=(i5-1)*ni+(j5-1)*nj+1
    +
    265  ij7=(i7-1)*ni+(j7-1)*nj+1
    +
    266  di1=i1-nph-1
    +
    267  dj1=j1-nph-1
    +
    268  rq=di1**2+dj1**2
    +
    269  slat1=(gq-rq)/(gq+rq)
    +
    270  clat1=sqrt(1.-slat1**2)
    +
    271  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
    +
    272  & pln,plntop)
    +
    273  CALL spsynth(iromb,maxwv,2*maxwv,idim,kw,2*mxtop,kmax,
    +
    274  & clat1,pln,plntop,mp,wave,wtop,f)
    +
    275  DO l=1,maxwv
    +
    276  slon(l,1)=sin(l*radlon)
    +
    277  clon(l,1)=cos(l*radlon)
    +
    278  slon(l,3)=slon(l,1)*crot(mod(1*l,4))
    +
    279  & -clon(l,1)*srot(mod(1*l,4))
    +
    280  clon(l,3)=clon(l,1)*crot(mod(1*l,4))
    +
    281  & +slon(l,1)*srot(mod(1*l,4))
    +
    282  slon(l,5)=slon(l,1)*crot(mod(2*l,4))
    +
    283  & -clon(l,1)*srot(mod(2*l,4))
    +
    284  clon(l,5)=clon(l,1)*crot(mod(2*l,4))
    +
    285  & +slon(l,1)*srot(mod(2*l,4))
    +
    286  slon(l,7)=slon(l,1)*crot(mod(3*l,4))
    +
    287  & -clon(l,1)*srot(mod(3*l,4))
    +
    288  clon(l,7)=clon(l,1)*crot(mod(3*l,4))
    +
    289  & +slon(l,1)*srot(mod(3*l,4))
    +
    290  ENDDO
    +
    291 CDIR$ IVDEP
    +
    292  DO k=1,kmax
    +
    293  ijk1=ij1+(k-1)*kg
    +
    294  ijk3=ij3+(k-1)*kg
    +
    295  ijk5=ij5+(k-1)*kg
    +
    296  ijk7=ij7+(k-1)*kg
    +
    297  gn(ijk1)=f(1,1,k)
    +
    298  gn(ijk3)=f(1,1,k)
    +
    299  gn(ijk5)=f(1,1,k)
    +
    300  gn(ijk7)=f(1,1,k)
    +
    301  gs(ijk1)=f(1,2,k)
    +
    302  gs(ijk3)=f(1,2,k)
    +
    303  gs(ijk5)=f(1,2,k)
    +
    304  gs(ijk7)=f(1,2,k)
    +
    305  ENDDO
    +
    306  IF(kmax.EQ.1) THEN
    +
    307  DO l=1,maxwv
    +
    308  lr=2*l+1
    +
    309  li=2*l+2
    +
    310  gn(ij1)=gn(ij1)+2*(f(lr,1,1)*clon(l,1)
    +
    311  & -f(li,1,1)*slon(l,1))
    +
    312  gn(ij3)=gn(ij3)+2*(f(lr,1,1)*clon(l,3)
    +
    313  & -f(li,1,1)*slon(l,3))
    +
    314  gn(ij5)=gn(ij5)+2*(f(lr,1,1)*clon(l,5)
    +
    315  & -f(li,1,1)*slon(l,5))
    +
    316  gn(ij7)=gn(ij7)+2*(f(lr,1,1)*clon(l,7)
    +
    317  & -f(li,1,1)*slon(l,7))
    +
    318  gs(ij1)=gs(ij1)+2*(f(lr,2,1)*clon(l,3)
    +
    319  & -f(li,2,1)*slon(l,3))
    +
    320  gs(ij3)=gs(ij3)+2*(f(lr,2,1)*clon(l,1)
    +
    321  & -f(li,2,1)*slon(l,1))
    +
    322  gs(ij5)=gs(ij5)+2*(f(lr,2,1)*clon(l,7)
    +
    323  & -f(li,2,1)*slon(l,7))
    +
    324  gs(ij7)=gs(ij7)+2*(f(lr,2,1)*clon(l,5)
    +
    325  & -f(li,2,1)*slon(l,5))
    +
    326  ENDDO
    +
    327  ELSE
    +
    328  DO l=1,maxwv
    +
    329  lr=2*l+1
    +
    330  li=2*l+2
    +
    331 CDIR$ IVDEP
    +
    332  DO k=1,kmax
    +
    333  ijk1=ij1+(k-1)*kg
    +
    334  ijk3=ij3+(k-1)*kg
    +
    335  ijk5=ij5+(k-1)*kg
    +
    336  ijk7=ij7+(k-1)*kg
    +
    337  gn(ijk1)=gn(ijk1)+2*(f(lr,1,k)*clon(l,1)
    +
    338  & -f(li,1,k)*slon(l,1))
    +
    339  gn(ijk3)=gn(ijk3)+2*(f(lr,1,k)*clon(l,3)
    +
    340  & -f(li,1,k)*slon(l,3))
    +
    341  gn(ijk5)=gn(ijk5)+2*(f(lr,1,k)*clon(l,5)
    +
    342  & -f(li,1,k)*slon(l,5))
    +
    343  gn(ijk7)=gn(ijk7)+2*(f(lr,1,k)*clon(l,7)
    +
    344  & -f(li,1,k)*slon(l,7))
    +
    345  gs(ijk1)=gs(ijk1)+2*(f(lr,2,k)*clon(l,3)
    +
    346  & -f(li,2,k)*slon(l,3))
    +
    347  gs(ijk3)=gs(ijk3)+2*(f(lr,2,k)*clon(l,1)
    +
    348  & -f(li,2,k)*slon(l,1))
    +
    349  gs(ijk5)=gs(ijk5)+2*(f(lr,2,k)*clon(l,7)
    +
    350  & -f(li,2,k)*slon(l,7))
    +
    351  gs(ijk7)=gs(ijk7)+2*(f(lr,2,k)*clon(l,5)
    +
    352  & -f(li,2,k)*slon(l,5))
    +
    353  ENDDO
    +
    354  ENDDO
    +
    355  ENDIF
    +
    356  ENDDO
    +
    357 
    +
    358 C CALCULATE THE REMAINDER OF THE POLAR STEREOGRAPHIC DOMAIN,
    +
    359 C STARTING AT THE SECTOR JUST CLOCKWISE OF THE ORIENTATION LONGITUDE
    +
    360 C AND GOING CLOCKWISE UNTIL ALL EIGHT SECTORS ARE DONE.
    +
    361 C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8)
    +
    362 C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8)
    +
    363 C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8)
    +
    364 C$OMP& PRIVATE(DJ1,DI1,RQ,RADLON,RADLON1,RADLON2,SLAT1,CLAT1)
    +
    365 C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,LR,LI)
    +
    366  DO j1=1,nph-1
    +
    367  DO i1=j1+1,nph
    +
    368  j2=i1
    +
    369  i2=j1
    +
    370  j3=nps+1-i1
    +
    371  i3=j1
    +
    372  j4=nps+1-j1
    +
    373  i4=i1
    +
    374  j5=nps+1-j1
    +
    375  i5=nps+1-i1
    +
    376  j6=nps+1-i1
    +
    377  i6=nps+1-j1
    +
    378  j7=i1
    +
    379  i7=nps+1-j1
    +
    380  j8=j1
    +
    381  i8=nps+1-i1
    +
    382  ij1=(i1-1)*ni+(j1-1)*nj+1
    +
    383  ij2=(i2-1)*ni+(j2-1)*nj+1
    +
    384  ij3=(i3-1)*ni+(j3-1)*nj+1
    +
    385  ij4=(i4-1)*ni+(j4-1)*nj+1
    +
    386  ij5=(i5-1)*ni+(j5-1)*nj+1
    +
    387  ij6=(i6-1)*ni+(j6-1)*nj+1
    +
    388  ij7=(i7-1)*ni+(j7-1)*nj+1
    +
    389  ij8=(i8-1)*ni+(j8-1)*nj+1
    +
    390  di1=i1-nph-1
    +
    391  dj1=j1-nph-1
    +
    392  rq=di1**2+dj1**2
    +
    393  slat1=(gq-rq)/(gq+rq)
    +
    394  clat1=sqrt(1.-slat1**2)
    +
    395  radlon1=orient/dpr+atan(-di1/dj1)
    +
    396  radlon2=(orient-45)/dpr*2-radlon1
    +
    397  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
    +
    398  & pln,plntop)
    +
    399  CALL spsynth(iromb,maxwv,2*maxwv,idim,kw,2*mxtop,kmax,
    +
    400  & clat1,pln,plntop,mp,wave,wtop,f)
    +
    401  DO l=1,maxwv
    +
    402  slon(l,1)=sin(l*radlon1)
    +
    403  clon(l,1)=cos(l*radlon1)
    +
    404  slon(l,2)=sin(l*radlon2)
    +
    405  clon(l,2)=cos(l*radlon2)
    +
    406  slon(l,3)=slon(l,1)*crot(mod(1*l,4))
    +
    407  & -clon(l,1)*srot(mod(1*l,4))
    +
    408  clon(l,3)=clon(l,1)*crot(mod(1*l,4))
    +
    409  & +slon(l,1)*srot(mod(1*l,4))
    +
    410  slon(l,4)=slon(l,2)*crot(mod(1*l,4))
    +
    411  & -clon(l,2)*srot(mod(1*l,4))
    +
    412  clon(l,4)=clon(l,2)*crot(mod(1*l,4))
    +
    413  & +slon(l,2)*srot(mod(1*l,4))
    +
    414  slon(l,5)=slon(l,1)*crot(mod(2*l,4))
    +
    415  & -clon(l,1)*srot(mod(2*l,4))
    +
    416  clon(l,5)=clon(l,1)*crot(mod(2*l,4))
    +
    417  & +slon(l,1)*srot(mod(2*l,4))
    +
    418  slon(l,6)=slon(l,2)*crot(mod(2*l,4))
    +
    419  & -clon(l,2)*srot(mod(2*l,4))
    +
    420  clon(l,6)=clon(l,2)*crot(mod(2*l,4))
    +
    421  & +slon(l,2)*srot(mod(2*l,4))
    +
    422  slon(l,7)=slon(l,1)*crot(mod(3*l,4))
    +
    423  & -clon(l,1)*srot(mod(3*l,4))
    +
    424  clon(l,7)=clon(l,1)*crot(mod(3*l,4))
    +
    425  & +slon(l,1)*srot(mod(3*l,4))
    +
    426  slon(l,8)=slon(l,2)*crot(mod(3*l,4))
    +
    427  & -clon(l,2)*srot(mod(3*l,4))
    +
    428  clon(l,8)=clon(l,2)*crot(mod(3*l,4))
    +
    429  & +slon(l,2)*srot(mod(3*l,4))
    +
    430  ENDDO
    +
    431 CDIR$ IVDEP
    +
    432  DO k=1,kmax
    +
    433  ijk1=ij1+(k-1)*kg
    +
    434  ijk2=ij2+(k-1)*kg
    +
    435  ijk3=ij3+(k-1)*kg
    +
    436  ijk4=ij4+(k-1)*kg
    +
    437  ijk5=ij5+(k-1)*kg
    +
    438  ijk6=ij6+(k-1)*kg
    +
    439  ijk7=ij7+(k-1)*kg
    +
    440  ijk8=ij8+(k-1)*kg
    +
    441  gn(ijk1)=f(1,1,k)
    +
    442  gn(ijk2)=f(1,1,k)
    +
    443  gn(ijk3)=f(1,1,k)
    +
    444  gn(ijk4)=f(1,1,k)
    +
    445  gn(ijk5)=f(1,1,k)
    +
    446  gn(ijk6)=f(1,1,k)
    +
    447  gn(ijk7)=f(1,1,k)
    +
    448  gn(ijk8)=f(1,1,k)
    +
    449  gs(ijk1)=f(1,2,k)
    +
    450  gs(ijk2)=f(1,2,k)
    +
    451  gs(ijk3)=f(1,2,k)
    +
    452  gs(ijk4)=f(1,2,k)
    +
    453  gs(ijk5)=f(1,2,k)
    +
    454  gs(ijk6)=f(1,2,k)
    +
    455  gs(ijk7)=f(1,2,k)
    +
    456  gs(ijk8)=f(1,2,k)
    +
    457  ENDDO
    +
    458  IF(kmax.EQ.1) THEN
    +
    459  DO l=1,maxwv
    +
    460  lr=2*l+1
    +
    461  li=2*l+2
    +
    462  gn(ij1)=gn(ij1)+2*(f(lr,1,1)*clon(l,1)
    +
    463  & -f(li,1,1)*slon(l,1))
    +
    464  gn(ij2)=gn(ij2)+2*(f(lr,1,1)*clon(l,2)
    +
    465  & -f(li,1,1)*slon(l,2))
    +
    466  gn(ij3)=gn(ij3)+2*(f(lr,1,1)*clon(l,3)
    +
    467  & -f(li,1,1)*slon(l,3))
    +
    468  gn(ij4)=gn(ij4)+2*(f(lr,1,1)*clon(l,4)
    +
    469  & -f(li,1,1)*slon(l,4))
    +
    470  gn(ij5)=gn(ij5)+2*(f(lr,1,1)*clon(l,5)
    +
    471  & -f(li,1,1)*slon(l,5))
    +
    472  gn(ij6)=gn(ij6)+2*(f(lr,1,1)*clon(l,6)
    +
    473  & -f(li,1,1)*slon(l,6))
    +
    474  gn(ij7)=gn(ij7)+2*(f(lr,1,1)*clon(l,7)
    +
    475  & -f(li,1,1)*slon(l,7))
    +
    476  gn(ij8)=gn(ij8)+2*(f(lr,1,1)*clon(l,8)
    +
    477  & -f(li,1,1)*slon(l,8))
    +
    478  gs(ij1)=gs(ij1)+2*(f(lr,2,1)*clon(l,4)
    +
    479  & -f(li,2,1)*slon(l,4))
    +
    480  gs(ij2)=gs(ij2)+2*(f(lr,2,1)*clon(l,3)
    +
    481  & -f(li,2,1)*slon(l,3))
    +
    482  gs(ij3)=gs(ij3)+2*(f(lr,2,1)*clon(l,2)
    +
    483  & -f(li,2,1)*slon(l,2))
    +
    484  gs(ij4)=gs(ij4)+2*(f(lr,2,1)*clon(l,1)
    +
    485  & -f(li,2,1)*slon(l,1))
    +
    486  gs(ij5)=gs(ij5)+2*(f(lr,2,1)*clon(l,8)
    +
    487  & -f(li,2,1)*slon(l,8))
    +
    488  gs(ij6)=gs(ij6)+2*(f(lr,2,1)*clon(l,7)
    +
    489  & -f(li,2,1)*slon(l,7))
    +
    490  gs(ij7)=gs(ij7)+2*(f(lr,2,1)*clon(l,6)
    +
    491  & -f(li,2,1)*slon(l,6))
    +
    492  gs(ij8)=gs(ij8)+2*(f(lr,2,1)*clon(l,5)
    +
    493  & -f(li,2,1)*slon(l,5))
    +
    494  ENDDO
    +
    495  ELSE
    +
    496  DO l=1,maxwv
    +
    497  lr=2*l+1
    +
    498  li=2*l+2
    +
    499 CDIR$ IVDEP
    +
    500  DO k=1,kmax
    +
    501  ijk1=ij1+(k-1)*kg
    +
    502  ijk2=ij2+(k-1)*kg
    +
    503  ijk3=ij3+(k-1)*kg
    +
    504  ijk4=ij4+(k-1)*kg
    +
    505  ijk5=ij5+(k-1)*kg
    +
    506  ijk6=ij6+(k-1)*kg
    +
    507  ijk7=ij7+(k-1)*kg
    +
    508  ijk8=ij8+(k-1)*kg
    +
    509  gn(ijk1)=gn(ijk1)+2*(f(lr,1,k)*clon(l,1)
    +
    510  & -f(li,1,k)*slon(l,1))
    +
    511  gn(ijk2)=gn(ijk2)+2*(f(lr,1,k)*clon(l,2)
    +
    512  & -f(li,1,k)*slon(l,2))
    +
    513  gn(ijk3)=gn(ijk3)+2*(f(lr,1,k)*clon(l,3)
    +
    514  & -f(li,1,k)*slon(l,3))
    +
    515  gn(ijk4)=gn(ijk4)+2*(f(lr,1,k)*clon(l,4)
    +
    516  & -f(li,1,k)*slon(l,4))
    +
    517  gn(ijk5)=gn(ijk5)+2*(f(lr,1,k)*clon(l,5)
    +
    518  & -f(li,1,k)*slon(l,5))
    +
    519  gn(ijk6)=gn(ijk6)+2*(f(lr,1,k)*clon(l,6)
    +
    520  & -f(li,1,k)*slon(l,6))
    +
    521  gn(ijk7)=gn(ijk7)+2*(f(lr,1,k)*clon(l,7)
    +
    522  & -f(li,1,k)*slon(l,7))
    +
    523  gn(ijk8)=gn(ijk8)+2*(f(lr,1,k)*clon(l,8)
    +
    524  & -f(li,1,k)*slon(l,8))
    +
    525  gs(ijk1)=gs(ijk1)+2*(f(lr,2,k)*clon(l,4)
    +
    526  & -f(li,2,k)*slon(l,4))
    +
    527  gs(ijk2)=gs(ijk2)+2*(f(lr,2,k)*clon(l,3)
    +
    528  & -f(li,2,k)*slon(l,3))
    +
    529  gs(ijk3)=gs(ijk3)+2*(f(lr,2,k)*clon(l,2)
    +
    530  & -f(li,2,k)*slon(l,2))
    +
    531  gs(ijk4)=gs(ijk4)+2*(f(lr,2,k)*clon(l,1)
    +
    532  & -f(li,2,k)*slon(l,1))
    +
    533  gs(ijk5)=gs(ijk5)+2*(f(lr,2,k)*clon(l,8)
    +
    534  & -f(li,2,k)*slon(l,8))
    +
    535  gs(ijk6)=gs(ijk6)+2*(f(lr,2,k)*clon(l,7)
    +
    536  & -f(li,2,k)*slon(l,7))
    +
    537  gs(ijk7)=gs(ijk7)+2*(f(lr,2,k)*clon(l,6)
    +
    538  & -f(li,2,k)*slon(l,6))
    +
    539  gs(ijk8)=gs(ijk8)+2*(f(lr,2,k)*clon(l,5)
    +
    540  & -f(li,2,k)*slon(l,5))
    +
    541  ENDDO
    +
    542  ENDDO
    +
    543  ENDIF
    +
    544  ENDDO
    +
    545  ENDDO
    +
    546 
    +
    547  END
    +
    subroutine splegend(I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
    Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
    Definition: splegend.f:45
    +
    subroutine spsynth(I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
    Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
    Definition: spsynth.f:39
    +
    subroutine sptgps(IROMB, MAXWV, KMAX, NPS, KWSKIP, KGSKIP, NISKIP, NJSKIP, TRUE, XMESH, ORIENT, WAVE, GN, GS)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to sca...
    Definition: sptgps.f:81
    +
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgpsd_8f.html b/ver-5.1.0/sptgpsd_8f.html new file mode 100644 index 00000000..951e05dd --- /dev/null +++ b/ver-5.1.0/sptgpsd_8f.html @@ -0,0 +1,282 @@ + + + + + + + +NCEPLIBS-ip: sptgpsd.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptgpsd.f File Reference
    +
    +
    + +

    Transform spectral to polar stereographic gradients. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptgpsd (IROMB, MAXWV, KMAX, NPS, KWSKIP, KGSKIP, NISKIP, NJSKIP, TRUE, XMESH, ORIENT, WAVE, XN, YN, XS, YS)
     This subprogram performs a spherical transform from spectral coefficients of scalar fields to gradient fields on a pair of polar stereographic grids. More...
     
    +

    Detailed Description

    +

    Transform spectral to polar stereographic gradients.

    +

    +Program history log:

    + + + + + + + +
    Date Programmer Comments
    96-02-29 IREDELL Initial.
    1998-12-15 IREDELL OpenMP directives inserted.
    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition in file sptgpsd.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptgpsd()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptgpsd ( IROMB,
     MAXWV,
     KMAX,
     NPS,
     KWSKIP,
     KGSKIP,
     NISKIP,
     NJSKIP,
     TRUE,
     XMESH,
     ORIENT,
    real, dimension(*) WAVE,
    real, dimension(*) XN,
    real, dimension(*) YN,
    real, dimension(*) XS,
    real, dimension(*) YS 
    )
    +
    + +

    This subprogram performs a spherical transform from spectral coefficients of scalar fields to gradient fields on a pair of polar stereographic grids.

    +

    The wave-space can be either triangular or rhomboidal. The wave and grid fields may have general indexing, but each wave field is in sequential 'ibm order', i.e., with zonal wavenumber as the slower index. The two square polar stereographic grids are centered on the respective poles, with the orientation longitude of the southern hemisphere grid 180 degrees opposite that of the northern hemisphere grid. The vectors are automatically rotated to be resolved relative to the respective polar stereographic grids.

    +

    The transform is made efficient by combining points in eight sectors of each polar stereographic grid, numbered as in the following diagram. The pole and the sector boundaries are treated specially in the code. Unfortunately, this approach induces some hairy indexing and code loquacity, for which the developer apologizes.

    +
       \ 4 | 5 /
    +    \  |  /
    +   3 \ | / 6
    +      \|/
    +   ----+----
    +      /|\
    +   2 / | \ 7
    +    /  |  \
    +   / 1 | 8 \

    The transforms are all multiprocessed over sector points. transform several fields at a time to improve vectorization. Subprogram can be called from a multiprocessing environment.

    +
    Parameters
    + + + + + + + + + + + + + + + + + +
    IROMBSpectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVSpectral truncation
    KMAXNumber of fields to transform
    NPSOdd order of the polar stereographic grids
    KWSKIPSkip number between wave fields (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
    KGSKIPSkip number between grid fields (defaults to NPS*NPS if KGSKIP=0)
    NISKIPSkip number between grid i-points (defaults to 1 if NISKIP=0)
    NJSKIPSkip number between grid j-points (defaults to NPS if NJSKIP=0)
    TRUELatitude at which PS grid is true (usually 60.)
    XMESHGrid length at true latitude (M)
    ORIENTLongitude at bottom of northern PS grid (southern PS grid will have opposite orientation.)
    WAVEWave fields
    XNNorthern polar stereographic x-gradients
    YNNorthern polar stereographic y-gradients
    XSSouthern polar stereographic x-gradients
    YSSouthern polar stereographic y-gradients
    +
    +
    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition at line 71 of file sptgpsd.f.

    + +

    References splaplac(), sptgpsv(), and spwget().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgpsd_8f.js b/ver-5.1.0/sptgpsd_8f.js new file mode 100644 index 00000000..1b5e1ff3 --- /dev/null +++ b/ver-5.1.0/sptgpsd_8f.js @@ -0,0 +1,4 @@ +var sptgpsd_8f = +[ + [ "sptgpsd", "sptgpsd_8f.html#ad6d10c3360c47558a8116b2f5666ed30", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptgpsd_8f_source.html b/ver-5.1.0/sptgpsd_8f_source.html new file mode 100644 index 00000000..75c49195 --- /dev/null +++ b/ver-5.1.0/sptgpsd_8f_source.html @@ -0,0 +1,203 @@ + + + + + + + +NCEPLIBS-ip: sptgpsd.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptgpsd.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Transform spectral to polar stereographic gradients
    +
    3 C> ### Program history log:
    +
    4 C> Date | Programmer | Comments
    +
    5 C> -----|------------|----------
    +
    6 C> 96-02-29 | IREDELL | Initial.
    +
    7 C> 1998-12-15 | IREDELL | OpenMP directives inserted.
    +
    8 C> @author IREDELL @date 96-02-29
    +
    9 
    +
    10 C> This subprogram performs a spherical transform
    +
    11 C> from spectral coefficients of scalar fields
    +
    12 C> to gradient fields on a pair of polar stereographic grids.
    +
    13 C> The wave-space can be either triangular or rhomboidal.
    +
    14 C> The wave and grid fields may have general indexing,
    +
    15 C> but each wave field is in sequential 'ibm order',
    +
    16 C> i.e., with zonal wavenumber as the slower index.
    +
    17 C> The two square polar stereographic grids are centered
    +
    18 C> on the respective poles, with the orientation longitude
    +
    19 C> of the southern hemisphere grid 180 degrees opposite
    +
    20 C> that of the northern hemisphere grid.
    +
    21 C> The vectors are automatically rotated to be resolved
    +
    22 C> relative to the respective polar stereographic grids.
    +
    23 C>
    +
    24 C> The transform is made efficient by combining points in eight
    +
    25 C> sectors of each polar stereographic grid, numbered as in the
    +
    26 C> following diagram. The pole and the sector boundaries are
    +
    27 C> treated specially in the code. Unfortunately, this approach
    +
    28 C> induces some hairy indexing and code loquacity, for which
    +
    29 C> the developer apologizes.
    +
    30 C>
    +
    31 C> \verbatim
    +
    32 C> \ 4 | 5 /
    +
    33 C> \ | /
    +
    34 C> 3 \ | / 6
    +
    35 C> \|/
    +
    36 C> ----+----
    +
    37 C> /|\
    +
    38 C> 2 / | \ 7
    +
    39 C> / | \
    +
    40 C> / 1 | 8 \
    +
    41 C> \endverbatim
    +
    42 C>
    +
    43 C> The transforms are all multiprocessed over sector points.
    +
    44 C> transform several fields at a time to improve vectorization.
    +
    45 C> Subprogram can be called from a multiprocessing environment.
    +
    46 C>
    +
    47 C> @param IROMB Spectral domain shape
    +
    48 C> (0 for triangular, 1 for rhomboidal)
    +
    49 C> @param MAXWV Spectral truncation
    +
    50 C> @param KMAX Number of fields to transform
    +
    51 C> @param NPS Odd order of the polar stereographic grids
    +
    52 C> @param KWSKIP Skip number between wave fields
    +
    53 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
    +
    54 C> @param KGSKIP Skip number between grid fields
    +
    55 C> (defaults to NPS*NPS if KGSKIP=0)
    +
    56 C> @param NISKIP Skip number between grid i-points
    +
    57 C> (defaults to 1 if NISKIP=0)
    +
    58 C> @param NJSKIP Skip number between grid j-points
    +
    59 C> (defaults to NPS if NJSKIP=0)
    +
    60 C> @param TRUE Latitude at which PS grid is true (usually 60.)
    +
    61 C> @param XMESH Grid length at true latitude (M)
    +
    62 C> @param ORIENT Longitude at bottom of northern PS grid
    +
    63 C> (southern PS grid will have opposite orientation.)
    +
    64 C> @param WAVE Wave fields
    +
    65 C> @param XN Northern polar stereographic x-gradients
    +
    66 C> @param YN Northern polar stereographic y-gradients
    +
    67 C> @param XS Southern polar stereographic x-gradients
    +
    68 C> @param YS Southern polar stereographic y-gradients
    +
    69 C>
    +
    70 C> @author IREDELL @date 96-02-29
    +
    71  SUBROUTINE sptgpsd(IROMB,MAXWV,KMAX,NPS,
    +
    72  & KWSKIP,KGSKIP,NISKIP,NJSKIP,
    +
    73  & TRUE,XMESH,ORIENT,WAVE,XN,YN,XS,YS)
    +
    74 
    +
    75  REAL WAVE(*),XN(*),YN(*),XS(*),YS(*)
    +
    76  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    77  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    78  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    79  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    80  REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    81  REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    82 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    83 C CALCULATE PRELIMINARY CONSTANTS
    +
    84  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    85  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    86  mdim=2*mx+1
    +
    87  kw=kwskip
    +
    88  IF(kw.EQ.0) kw=2*mx
    +
    89 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    90 C CALCULATE GRADIENTS
    +
    91 C$OMP PARALLEL DO PRIVATE(KWS)
    +
    92  DO k=1,kmax
    +
    93  kws=(k-1)*kw
    +
    94  CALL splaplac(iromb,maxwv,enn1,wave(kws+1),wd(1,k),1)
    +
    95  wz(1:2*mx,k)=0.
    +
    96  ENDDO
    +
    97  CALL sptgpsv(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
    +
    98  & true,xmesh,orient,wd,wz,xn,yn,xs,ys)
    +
    99 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    100  END
    +
    subroutine splaplac(I, M, ENN1, Q, QD2, IDIR)
    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
    Definition: splaplac.f:25
    +
    subroutine sptgpsd(IROMB, MAXWV, KMAX, NPS, KWSKIP, KGSKIP, NISKIP, NJSKIP, TRUE, XMESH, ORIENT, WAVE, XN, YN, XS, YS)
    This subprogram performs a spherical transform from spectral coefficients of scalar fields to gradien...
    Definition: sptgpsd.f:74
    +
    subroutine sptgpsv(IROMB, MAXWV, KMAX, NPS, KWSKIP, KGSKIP, NISKIP, NJSKIP, TRUE, XMESH, ORIENT, WAVED, WAVEZ, UN, VN, US, VS)
    This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
    Definition: sptgpsv.f:83
    +
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgpsv_8f.html b/ver-5.1.0/sptgpsv_8f.html new file mode 100644 index 00000000..fdcaf59b --- /dev/null +++ b/ver-5.1.0/sptgpsv_8f.html @@ -0,0 +1,299 @@ + + + + + + + +NCEPLIBS-ip: sptgpsv.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptgpsv.f File Reference
    +
    +
    + +

    Transform spectral vector to polar stereo. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptgpsv (IROMB, MAXWV, KMAX, NPS, KWSKIP, KGSKIP, NISKIP, NJSKIP, TRUE, XMESH, ORIENT, WAVED, WAVEZ, UN, VN, US, VS)
     This subprogram performs a spherical transform from spectral coefficients of divergences and curls to vector fields on a pair of polar stereographic grids. More...
     
    +

    Detailed Description

    +

    Transform spectral vector to polar stereo.

    +

    +Program History Log

    + + + + + + + +
    Date Programmer Comments
    96-02-29 Iredell Initial.
    1998-12-15 Iredell Openmp directives inserted.
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition in file sptgpsv.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptgpsv()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptgpsv ( IROMB,
     MAXWV,
     KMAX,
     NPS,
     KWSKIP,
     KGSKIP,
     NISKIP,
     NJSKIP,
     TRUE,
     XMESH,
     ORIENT,
    real, dimension(*) WAVED,
    real, dimension(*) WAVEZ,
    real, dimension(*) UN,
    real, dimension(*) VN,
    real, dimension(*) US,
    real, dimension(*) VS 
    )
    +
    + +

    This subprogram performs a spherical transform from spectral coefficients of divergences and curls to vector fields on a pair of polar stereographic grids.

    +

    The wave-space can be either triangular or rhomboidal.

    +

    The wave and grid fields may have general indexing, but each wave field is in sequential 'IBM order', i.e. with zonal wavenumber as the slower index.

    +

    The two square polar stereographic grids are centered on the respective poles, with the orientation longitude of the southern hemisphere grid 180 degrees opposite that of the northern hemisphere grid.

    +

    The vectors are automatically rotated to be resolved relative to the respective polar stereographic grids.

    +

    The transform is made efficient by combining points in eight sectors of each polar stereographic grid,
    + numbered as in the diagram below. The pole and the sector boundaries
    + are treated specially in the code.
    + Unfortunately, this approach induces some hairy indexing and code loquacity, for which the developer apologizes.

    +
    +              \ 4 | 5 /
    +               \  |  /
    +              3 \ | / 6
    +                 |/
    +              ----+----
    +                 /|\
    +              2 / | \ 7
    +               /  |  \
    +              / 1 | 8 \
    + 

    The transforms are all multiprocessed over sector points. transform several fields at a time to improve vectorization. subprogram can be called from a multiprocessing environment.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + +
    IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVspectral truncation
    KMAXnumber of fields to transform.
    NPSodd order of the polar stereographic grids
    KWSKIPskip number between wave fields (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
    KGSKIPskip number between grid fields (defaults to NPS*NPS if KGSKIP=0)
    NISKIPskip number between grid i-points (defaults to 1 if NISKIP=0)
    NJSKIPskip number between grid j-points (defaults to NPS if NJSKIP=0)
    TRUElatitude at which ps grid is true (usually 60.)
    XMESHgrid length at true latitude (m)
    ORIENTlongitude at bottom of northern ps grid (southern ps grid will have opposite orientation.)
    WAVEDwave divergence fields
    WAVEZwave vorticity fields
    UNnorthern polar stereographic u-winds
    VNnorthern polar stereographic v-winds
    USsouthern polar stereographic u-winds
    VSsouthern polar stereographic v-winds
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition at line 80 of file sptgpsv.f.

    + +

    References spdz2uv(), splegend(), spsynth(), and spwget().

    + +

    Referenced by sptgpsd(), and sptrunsv().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgpsv_8f.js b/ver-5.1.0/sptgpsv_8f.js new file mode 100644 index 00000000..ec835636 --- /dev/null +++ b/ver-5.1.0/sptgpsv_8f.js @@ -0,0 +1,4 @@ +var sptgpsv_8f = +[ + [ "sptgpsv", "sptgpsv_8f.html#af2bf2335047ec277730564dbfa859079", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptgpsv_8f_source.html b/ver-5.1.0/sptgpsv_8f_source.html new file mode 100644 index 00000000..3422cb0b --- /dev/null +++ b/ver-5.1.0/sptgpsv_8f_source.html @@ -0,0 +1,1038 @@ + + + + + + + +NCEPLIBS-ip: sptgpsv.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptgpsv.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Transform spectral vector to polar stereo.
    +
    3 C>
    +
    4 C> ### Program History Log
    +
    5 C> Date | Programmer | Comments
    +
    6 C> -----|------------|---------
    +
    7 C> 96-02-29 | Iredell | Initial.
    +
    8 C> 1998-12-15 | Iredell | Openmp directives inserted.
    +
    9 C>
    +
    10 C> @author Iredell @date 96-02-29
    +
    11 
    +
    12 C> This subprogram performs a spherical transform
    +
    13 C> from spectral coefficients of divergences and curls
    +
    14 C> to vector fields on a pair of polar stereographic grids.
    +
    15 C> The wave-space can be either triangular or rhomboidal.
    +
    16 C>
    +
    17 C> The wave and grid fields may have general indexing,
    +
    18 C> but each wave field is in sequential 'IBM order',
    +
    19 C> i.e. with zonal wavenumber as the slower index.
    +
    20 C>
    +
    21 C> The two square polar stereographic grids are centered
    +
    22 C> on the respective poles, with the orientation longitude
    +
    23 C> of the southern hemisphere grid 180 degrees opposite
    +
    24 C> that of the northern hemisphere grid.
    +
    25 C>
    +
    26 C> The vectors are automatically rotated to be resolved
    +
    27 C> relative to the respective polar stereographic grids.
    +
    28 C>
    +
    29 C> The transform is made efficient
    +
    30 C> by combining points in eight sectors
    +
    31 C> of each polar stereographic grid,
    +
    32 C> numbered as in the diagram below.
    +
    33 C> The pole and the sector boundaries
    +
    34 C> are treated specially in the code.
    +
    35 C> Unfortunately, this approach induces
    +
    36 C> some hairy indexing and code loquacity,
    +
    37 C> for which the developer apologizes.
    +
    38 C>
    +
    39 C> <pre>
    +
    40 C> \ 4 | 5 /
    +
    41 C> \ | /
    +
    42 C> 3 \ | / 6
    +
    43 C> \|/
    +
    44 C> ----+----
    +
    45 C> /|\
    +
    46 C> 2 / | \ 7
    +
    47 C> / | \
    +
    48 C> / 1 | 8 \
    +
    49 C> </pre>
    +
    50 C>
    +
    51 C> The transforms are all multiprocessed over sector points.
    +
    52 C> transform several fields at a time to improve vectorization.
    +
    53 C> subprogram can be called from a multiprocessing environment.
    +
    54 C>
    +
    55 C> @param IROMB spectral domain shape
    +
    56 C> (0 for triangular, 1 for rhomboidal)
    +
    57 C> @param MAXWV spectral truncation
    +
    58 C> @param KMAX number of fields to transform.
    +
    59 C> @param NPS odd order of the polar stereographic grids
    +
    60 C> @param KWSKIP skip number between wave fields
    +
    61 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
    +
    62 C> @param KGSKIP skip number between grid fields
    +
    63 C> (defaults to NPS*NPS if KGSKIP=0)
    +
    64 C> @param NISKIP skip number between grid i-points
    +
    65 C> (defaults to 1 if NISKIP=0)
    +
    66 C> @param NJSKIP skip number between grid j-points
    +
    67 C> (defaults to NPS if NJSKIP=0)
    +
    68 C> @param TRUE latitude at which ps grid is true (usually 60.)
    +
    69 C> @param XMESH grid length at true latitude (m)
    +
    70 C> @param ORIENT longitude at bottom of northern ps grid
    +
    71 C> (southern ps grid will have opposite orientation.)
    +
    72 C> @param WAVED wave divergence fields
    +
    73 C> @param WAVEZ wave vorticity fields
    +
    74 C> @param UN northern polar stereographic u-winds
    +
    75 C> @param VN northern polar stereographic v-winds
    +
    76 C> @param US southern polar stereographic u-winds
    +
    77 C> @param VS southern polar stereographic v-winds
    +
    78 C>
    +
    79 C> @author Iredell @date 96-02-29
    +
    80  SUBROUTINE sptgpsv(IROMB,MAXWV,KMAX,NPS,
    +
    81  & KWSKIP,KGSKIP,NISKIP,NJSKIP,
    +
    82  & TRUE,XMESH,ORIENT,WAVED,WAVEZ,UN,VN,US,VS)
    +
    83 
    +
    84  REAL WAVED(*),WAVEZ(*),UN(*),VN(*),US(*),VS(*)
    +
    85  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    86  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    87  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    88  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    89  INTEGER MP(2*KMAX)
    +
    90  REAL SLON(MAXWV,8),CLON(MAXWV,8),SROT(0:3),CROT(0:3)
    +
    91  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,2*KMAX)
    +
    92  REAL WTOP(2*(MAXWV+1),2*KMAX)
    +
    93  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
    +
    94  REAL F(2*MAXWV+3,2,2*KMAX)
    +
    95  DATA srot/0.,1.,0.,-1./,crot/1.,0.,-1.,0./
    +
    96  parameter(rerth=6.3712e6)
    +
    97  parameter(pi=3.14159265358979,dpr=180./pi)
    +
    98 
    +
    99 C CALCULATE PRELIMINARY CONSTANTS
    +
    100  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    101  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    102  mxtop=maxwv+1
    +
    103  mdim=2*mx+1
    +
    104  idim=2*maxwv+3
    +
    105  kw=kwskip
    +
    106  kg=kgskip
    +
    107  ni=niskip
    +
    108  nj=njskip
    +
    109  IF(kw.EQ.0) kw=2*mx
    +
    110  IF(kg.EQ.0) kg=nps*nps
    +
    111  IF(ni.EQ.0) ni=1
    +
    112  IF(nj.EQ.0) nj=nps
    +
    113  mp=1
    +
    114  nph=(nps-1)/2
    +
    115  gq=((1.+sin(true/dpr))*rerth/xmesh)**2
    +
    116  srh=sqrt(0.5)
    +
    117 
    +
    118 C CALCULATE SPECTRAL WINDS
    +
    119 C$OMP PARALLEL DO PRIVATE(KWS)
    +
    120  DO k=1,kmax
    +
    121  kws=(k-1)*kw
    +
    122  CALL spdz2uv(iromb,maxwv,enn1,elonn1,eon,eontop,
    +
    123  & waved(kws+1),wavez(kws+1),
    +
    124  & w(1,k),w(1,kmax+k),wtop(1,k),wtop(1,kmax+k))
    +
    125  ENDDO
    +
    126 
    +
    127 C CALCULATE POLE POINT
    +
    128  i1=nph+1
    +
    129  j1=nph+1
    +
    130  ij1=(i1-1)*ni+(j1-1)*nj+1
    +
    131  slat1=1.
    +
    132  clat1=0.
    +
    133  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
    +
    134  & pln,plntop)
    +
    135  CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
    +
    136  & clat1,pln,plntop,mp,w,wtop,f)
    +
    137  coso=cos(orient/dpr)
    +
    138  sino=sin(orient/dpr)
    +
    139 CDIR$ IVDEP
    +
    140  DO k=1,kmax
    +
    141  ku=k
    +
    142  kv=k+kmax
    +
    143  ijk1=ij1+(k-1)*kg
    +
    144  un(ijk1)=2*( coso*f(3,1,ku)+sino*f(3,1,kv))
    +
    145  vn(ijk1)=2*(-sino*f(3,1,ku)+coso*f(3,1,kv))
    +
    146  us(ijk1)=2*( coso*f(3,2,ku)-sino*f(3,2,kv))
    +
    147  vs(ijk1)=2*( sino*f(3,2,ku)+coso*f(3,2,kv))
    +
    148  ENDDO
    +
    149 
    +
    150 C CALCULATE POINTS ALONG THE ROW AND COLUMN OF THE POLE,
    +
    151 C STARTING AT THE ORIENTATION LONGITUDE AND GOING CLOCKWISE.
    +
    152 C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8)
    +
    153 C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8)
    +
    154 C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8)
    +
    155 C$OMP& PRIVATE(DJ1,DI1,RQ,RR,RADLON,RADLON1,RADLON2,SLAT1,CLAT1)
    +
    156 C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,KU,KV,LR,LI)
    +
    157  DO j1=1,nph
    +
    158  i1=nph+1
    +
    159  radlon=orient/dpr
    +
    160  j3=nps+1-i1
    +
    161  i3=j1
    +
    162  j5=nps+1-j1
    +
    163  i5=nps+1-i1
    +
    164  j7=i1
    +
    165  i7=nps+1-j1
    +
    166  ij1=(i1-1)*ni+(j1-1)*nj+1
    +
    167  ij3=(i3-1)*ni+(j3-1)*nj+1
    +
    168  ij5=(i5-1)*ni+(j5-1)*nj+1
    +
    169  ij7=(i7-1)*ni+(j7-1)*nj+1
    +
    170  di1=i1-nph-1
    +
    171  dj1=j1-nph-1
    +
    172  rq=di1**2+dj1**2
    +
    173  slat1=(gq-rq)/(gq+rq)
    +
    174  clat1=sqrt(1.-slat1**2)
    +
    175  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
    +
    176  & pln,plntop)
    +
    177  CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
    +
    178  & clat1,pln,plntop,mp,w,wtop,f)
    +
    179  DO l=1,maxwv
    +
    180  slon(l,1)=sin(l*radlon)
    +
    181  clon(l,1)=cos(l*radlon)
    +
    182  slon(l,3)=slon(l,1)*crot(mod(1*l,4))
    +
    183  & -clon(l,1)*srot(mod(1*l,4))
    +
    184  clon(l,3)=clon(l,1)*crot(mod(1*l,4))
    +
    185  & +slon(l,1)*srot(mod(1*l,4))
    +
    186  slon(l,5)=slon(l,1)*crot(mod(2*l,4))
    +
    187  & -clon(l,1)*srot(mod(2*l,4))
    +
    188  clon(l,5)=clon(l,1)*crot(mod(2*l,4))
    +
    189  & +slon(l,1)*srot(mod(2*l,4))
    +
    190  slon(l,7)=slon(l,1)*crot(mod(3*l,4))
    +
    191  & -clon(l,1)*srot(mod(3*l,4))
    +
    192  clon(l,7)=clon(l,1)*crot(mod(3*l,4))
    +
    193  & +slon(l,1)*srot(mod(3*l,4))
    +
    194  ENDDO
    +
    195 CDIR$ IVDEP
    +
    196  DO k=1,kmax
    +
    197  ku=k
    +
    198  kv=k+kmax
    +
    199  ijk1=ij1+(k-1)*kg
    +
    200  ijk3=ij3+(k-1)*kg
    +
    201  ijk5=ij5+(k-1)*kg
    +
    202  ijk7=ij7+(k-1)*kg
    +
    203  un(ijk1)= f(1,1,ku)
    +
    204  vn(ijk1)= f(1,1,kv)
    +
    205  un(ijk3)= f(1,1,kv)
    +
    206  vn(ijk3)=-f(1,1,ku)
    +
    207  un(ijk5)=-f(1,1,ku)
    +
    208  vn(ijk5)=-f(1,1,kv)
    +
    209  un(ijk7)=-f(1,1,kv)
    +
    210  vn(ijk7)= f(1,1,ku)
    +
    211  us(ijk1)=-f(1,2,ku)
    +
    212  vs(ijk1)=-f(1,2,kv)
    +
    213  us(ijk3)=-f(1,2,kv)
    +
    214  vs(ijk3)= f(1,2,ku)
    +
    215  us(ijk5)= f(1,2,ku)
    +
    216  vs(ijk5)= f(1,2,kv)
    +
    217  us(ijk7)= f(1,2,kv)
    +
    218  vs(ijk7)=-f(1,2,ku)
    +
    219  ENDDO
    +
    220  IF(kmax.EQ.1) THEN
    +
    221  ku=1
    +
    222  kv=2
    +
    223  DO l=1,maxwv
    +
    224  lr=2*l+1
    +
    225  li=2*l+2
    +
    226  un(ij1)=un(ij1)+2*(f(lr,1,ku)*clon(l,1)
    +
    227  & -f(li,1,ku)*slon(l,1))
    +
    228  vn(ij1)=vn(ij1)+2*(f(lr,1,kv)*clon(l,1)
    +
    229  & -f(li,1,kv)*slon(l,1))
    +
    230  un(ij3)=un(ij3)+2*(f(lr,1,kv)*clon(l,3)
    +
    231  & -f(li,1,kv)*slon(l,3))
    +
    232  vn(ij3)=vn(ij3)-2*(f(lr,1,ku)*clon(l,3)
    +
    233  & -f(li,1,ku)*slon(l,3))
    +
    234  un(ij5)=un(ij5)-2*(f(lr,1,ku)*clon(l,5)
    +
    235  & -f(li,1,ku)*slon(l,5))
    +
    236  vn(ij5)=vn(ij5)-2*(f(lr,1,kv)*clon(l,5)
    +
    237  & -f(li,1,kv)*slon(l,5))
    +
    238  un(ij7)=un(ij7)-2*(f(lr,1,kv)*clon(l,7)
    +
    239  & -f(li,1,kv)*slon(l,7))
    +
    240  vn(ij7)=vn(ij7)+2*(f(lr,1,ku)*clon(l,7)
    +
    241  & -f(li,1,ku)*slon(l,7))
    +
    242  us(ij1)=us(ij1)-2*(f(lr,2,ku)*clon(l,5)
    +
    243  & -f(li,2,ku)*slon(l,5))
    +
    244  vs(ij1)=vs(ij1)-2*(f(lr,2,kv)*clon(l,5)
    +
    245  & -f(li,2,kv)*slon(l,5))
    +
    246  us(ij3)=us(ij3)-2*(f(lr,2,kv)*clon(l,3)
    +
    247  & -f(li,2,kv)*slon(l,3))
    +
    248  vs(ij3)=vs(ij3)+2*(f(lr,2,ku)*clon(l,3)
    +
    249  & -f(li,2,ku)*slon(l,3))
    +
    250  us(ij5)=us(ij5)+2*(f(lr,2,ku)*clon(l,1)
    +
    251  & -f(li,2,ku)*slon(l,1))
    +
    252  vs(ij5)=vs(ij5)+2*(f(lr,2,kv)*clon(l,1)
    +
    253  & -f(li,2,kv)*slon(l,1))
    +
    254  us(ij7)=us(ij7)+2*(f(lr,2,kv)*clon(l,7)
    +
    255  & -f(li,2,kv)*slon(l,7))
    +
    256  vs(ij7)=vs(ij7)-2*(f(lr,2,ku)*clon(l,7)
    +
    257  & -f(li,2,ku)*slon(l,7))
    +
    258  ENDDO
    +
    259  ELSE
    +
    260  DO l=1,maxwv
    +
    261  lr=2*l+1
    +
    262  li=2*l+2
    +
    263 CDIR$ IVDEP
    +
    264  DO k=1,kmax
    +
    265  ku=k
    +
    266  kv=k+kmax
    +
    267  ijk1=ij1+(k-1)*kg
    +
    268  ijk3=ij3+(k-1)*kg
    +
    269  ijk5=ij5+(k-1)*kg
    +
    270  ijk7=ij7+(k-1)*kg
    +
    271  un(ijk1)=un(ijk1)+2*(f(lr,1,ku)*clon(l,1)
    +
    272  & -f(li,1,ku)*slon(l,1))
    +
    273  vn(ijk1)=vn(ijk1)+2*(f(lr,1,kv)*clon(l,1)
    +
    274  & -f(li,1,kv)*slon(l,1))
    +
    275  un(ijk3)=un(ijk3)+2*(f(lr,1,kv)*clon(l,3)
    +
    276  & -f(li,1,kv)*slon(l,3))
    +
    277  vn(ijk3)=vn(ijk3)-2*(f(lr,1,ku)*clon(l,3)
    +
    278  & -f(li,1,ku)*slon(l,3))
    +
    279  un(ijk5)=un(ijk5)-2*(f(lr,1,ku)*clon(l,5)
    +
    280  & -f(li,1,ku)*slon(l,5))
    +
    281  vn(ijk5)=vn(ijk5)-2*(f(lr,1,kv)*clon(l,5)
    +
    282  & -f(li,1,kv)*slon(l,5))
    +
    283  un(ijk7)=un(ijk7)-2*(f(lr,1,kv)*clon(l,7)
    +
    284  & -f(li,1,kv)*slon(l,7))
    +
    285  vn(ijk7)=vn(ijk7)+2*(f(lr,1,ku)*clon(l,7)
    +
    286  & -f(li,1,ku)*slon(l,7))
    +
    287  us(ijk1)=us(ijk1)-2*(f(lr,2,ku)*clon(l,5)
    +
    288  & -f(li,2,ku)*slon(l,5))
    +
    289  vs(ijk1)=vs(ijk1)-2*(f(lr,2,kv)*clon(l,5)
    +
    290  & -f(li,2,kv)*slon(l,5))
    +
    291  us(ijk3)=us(ijk3)-2*(f(lr,2,kv)*clon(l,3)
    +
    292  & -f(li,2,kv)*slon(l,3))
    +
    293  vs(ijk3)=vs(ijk3)+2*(f(lr,2,ku)*clon(l,3)
    +
    294  & -f(li,2,ku)*slon(l,3))
    +
    295  us(ijk5)=us(ijk5)+2*(f(lr,2,ku)*clon(l,1)
    +
    296  & -f(li,2,ku)*slon(l,1))
    +
    297  vs(ijk5)=vs(ijk5)+2*(f(lr,2,kv)*clon(l,1)
    +
    298  & -f(li,2,kv)*slon(l,1))
    +
    299  us(ijk7)=us(ijk7)+2*(f(lr,2,kv)*clon(l,7)
    +
    300  & -f(li,2,kv)*slon(l,7))
    +
    301  vs(ijk7)=vs(ijk7)-2*(f(lr,2,ku)*clon(l,7)
    +
    302  & -f(li,2,ku)*slon(l,7))
    +
    303  ENDDO
    +
    304  ENDDO
    +
    305  ENDIF
    +
    306  ENDDO
    +
    307 
    +
    308 C CALCULATE POINTS ON THE MAIN DIAGONALS THROUGH THE POLE,
    +
    309 C STARTING CLOCKWISE OF THE ORIENTATION LONGITUDE AND GOING CLOCKWISE.
    +
    310 C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8)
    +
    311 C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8)
    +
    312 C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8)
    +
    313 C$OMP& PRIVATE(DJ1,DI1,RQ,RR,RADLON,RADLON1,RADLON2,SLAT1,CLAT1)
    +
    314 C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,KU,KV,LR,LI)
    +
    315  DO j1=1,nph
    +
    316  i1=j1
    +
    317  radlon=(orient-45)/dpr
    +
    318  j3=nps+1-i1
    +
    319  i3=j1
    +
    320  j5=nps+1-j1
    +
    321  i5=nps+1-i1
    +
    322  j7=i1
    +
    323  i7=nps+1-j1
    +
    324  ij1=(i1-1)*ni+(j1-1)*nj+1
    +
    325  ij3=(i3-1)*ni+(j3-1)*nj+1
    +
    326  ij5=(i5-1)*ni+(j5-1)*nj+1
    +
    327  ij7=(i7-1)*ni+(j7-1)*nj+1
    +
    328  di1=i1-nph-1
    +
    329  dj1=j1-nph-1
    +
    330  rq=di1**2+dj1**2
    +
    331  slat1=(gq-rq)/(gq+rq)
    +
    332  clat1=sqrt(1.-slat1**2)
    +
    333  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
    +
    334  & pln,plntop)
    +
    335  CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
    +
    336  & clat1,pln,plntop,mp,w,wtop,f)
    +
    337  DO l=1,maxwv
    +
    338  slon(l,1)=sin(l*radlon)
    +
    339  clon(l,1)=cos(l*radlon)
    +
    340  slon(l,3)=slon(l,1)*crot(mod(1*l,4))
    +
    341  & -clon(l,1)*srot(mod(1*l,4))
    +
    342  clon(l,3)=clon(l,1)*crot(mod(1*l,4))
    +
    343  & +slon(l,1)*srot(mod(1*l,4))
    +
    344  slon(l,5)=slon(l,1)*crot(mod(2*l,4))
    +
    345  & -clon(l,1)*srot(mod(2*l,4))
    +
    346  clon(l,5)=clon(l,1)*crot(mod(2*l,4))
    +
    347  & +slon(l,1)*srot(mod(2*l,4))
    +
    348  slon(l,7)=slon(l,1)*crot(mod(3*l,4))
    +
    349  & -clon(l,1)*srot(mod(3*l,4))
    +
    350  clon(l,7)=clon(l,1)*crot(mod(3*l,4))
    +
    351  & +slon(l,1)*srot(mod(3*l,4))
    +
    352  ENDDO
    +
    353 CDIR$ IVDEP
    +
    354  DO k=1,kmax
    +
    355  ku=k
    +
    356  kv=k+kmax
    +
    357  ijk1=ij1+(k-1)*kg
    +
    358  ijk3=ij3+(k-1)*kg
    +
    359  ijk5=ij5+(k-1)*kg
    +
    360  ijk7=ij7+(k-1)*kg
    +
    361  un(ijk1)=srh*( f(1,1,ku)+f(1,1,kv))
    +
    362  vn(ijk1)=srh*(-f(1,1,ku)+f(1,1,kv))
    +
    363  un(ijk3)=srh*(-f(1,1,ku)+f(1,1,kv))
    +
    364  vn(ijk3)=srh*(-f(1,1,ku)-f(1,1,kv))
    +
    365  un(ijk5)=srh*(-f(1,1,ku)-f(1,1,kv))
    +
    366  vn(ijk5)=srh*( f(1,1,ku)-f(1,1,kv))
    +
    367  un(ijk7)=srh*( f(1,1,ku)-f(1,1,kv))
    +
    368  vn(ijk7)=srh*( f(1,1,ku)+f(1,1,kv))
    +
    369  us(ijk1)=srh*(-f(1,2,ku)-f(1,2,kv))
    +
    370  vs(ijk1)=srh*( f(1,2,ku)-f(1,2,kv))
    +
    371  us(ijk3)=srh*( f(1,2,ku)-f(1,2,kv))
    +
    372  vs(ijk3)=srh*( f(1,2,ku)+f(1,2,kv))
    +
    373  us(ijk5)=srh*( f(1,2,ku)+f(1,2,kv))
    +
    374  vs(ijk5)=srh*(-f(1,2,ku)+f(1,2,kv))
    +
    375  us(ijk7)=srh*(-f(1,2,ku)+f(1,2,kv))
    +
    376  vs(ijk7)=srh*(-f(1,2,ku)-f(1,2,kv))
    +
    377  ENDDO
    +
    378  IF(kmax.EQ.1) THEN
    +
    379  ku=1
    +
    380  kv=2
    +
    381  DO l=1,maxwv
    +
    382  lr=2*l+1
    +
    383  li=2*l+2
    +
    384  un(ij1)=un(ij1)+2*srh*(( f(lr,1,ku)+f(lr,1,kv))
    +
    385  & *clon(l,1)
    +
    386  & -( f(li,1,ku)+f(li,1,kv))
    +
    387  & *slon(l,1))
    +
    388  vn(ij1)=vn(ij1)+2*srh*((-f(lr,1,ku)+f(lr,1,kv))
    +
    389  & *clon(l,1)
    +
    390  & -(-f(li,1,ku)+f(li,1,kv))
    +
    391  & *slon(l,1))
    +
    392  un(ij3)=un(ij3)+2*srh*((-f(lr,1,ku)+f(lr,1,kv))
    +
    393  & *clon(l,3)
    +
    394  & -(-f(li,1,ku)+f(li,1,kv))
    +
    395  & *slon(l,3))
    +
    396  vn(ij3)=vn(ij3)+2*srh*((-f(lr,1,ku)-f(lr,1,kv))
    +
    397  & *clon(l,3)
    +
    398  & -(-f(li,1,ku)-f(li,1,kv))
    +
    399  & *slon(l,3))
    +
    400  un(ij5)=un(ij5)+2*srh*((-f(lr,1,ku)-f(lr,1,kv))
    +
    401  & *clon(l,5)
    +
    402  & -(-f(li,1,ku)-f(li,1,kv))
    +
    403  & *slon(l,5))
    +
    404  vn(ij5)=vn(ij5)+2*srh*(( f(lr,1,ku)-f(lr,1,kv))
    +
    405  & *clon(l,5)
    +
    406  & -( f(li,1,ku)-f(li,1,kv))
    +
    407  & *slon(l,5))
    +
    408  un(ij7)=un(ij7)+2*srh*(( f(lr,1,ku)-f(lr,1,kv))
    +
    409  & *clon(l,7)
    +
    410  & -( f(li,1,ku)-f(li,1,kv))
    +
    411  & *slon(l,7))
    +
    412  vn(ij7)=vn(ij7)+2*srh*(( f(lr,1,ku)+f(lr,1,kv))
    +
    413  & *clon(l,7)
    +
    414  & -( f(li,1,ku)+f(li,1,kv))
    +
    415  & *slon(l,7))
    +
    416  us(ij1)=us(ij1)+2*srh*((-f(lr,2,ku)-f(lr,2,kv))
    +
    417  & *clon(l,3)
    +
    418  & -(-f(li,2,ku)-f(li,2,kv))
    +
    419  & *slon(l,3))
    +
    420  vs(ij1)=vs(ij1)+2*srh*(( f(lr,2,ku)-f(lr,2,kv))
    +
    421  & *clon(l,3)
    +
    422  & -( f(li,2,ku)-f(li,2,kv))
    +
    423  & *slon(l,3))
    +
    424  us(ij3)=us(ij3)+2*srh*(( f(lr,2,ku)-f(lr,2,kv))
    +
    425  & *clon(l,1)
    +
    426  & -( f(li,2,ku)-f(li,2,kv))
    +
    427  & *slon(l,1))
    +
    428  vs(ij3)=vs(ij3)+2*srh*(( f(lr,2,ku)+f(lr,2,kv))
    +
    429  & *clon(l,1)
    +
    430  & -( f(li,2,ku)+f(li,2,kv))
    +
    431  & *slon(l,1))
    +
    432  us(ij5)=us(ij5)+2*srh*(( f(lr,2,ku)+f(lr,2,kv))
    +
    433  & *clon(l,7)
    +
    434  & -( f(li,2,ku)+f(li,2,kv))
    +
    435  & *slon(l,7))
    +
    436  vs(ij5)=vs(ij5)+2*srh*((-f(lr,2,ku)+f(lr,2,kv))
    +
    437  & *clon(l,7)
    +
    438  & -(-f(li,2,ku)+f(li,2,kv))
    +
    439  & *slon(l,7))
    +
    440  us(ij7)=us(ij7)+2*srh*((-f(lr,2,ku)+f(lr,2,kv))
    +
    441  & *clon(l,5)
    +
    442  & -(-f(li,2,ku)+f(li,2,kv))
    +
    443  & *slon(l,5))
    +
    444  vs(ij7)=vs(ij7)+2*srh*((-f(lr,2,ku)-f(lr,2,kv))
    +
    445  & *clon(l,5)
    +
    446  & -(-f(li,2,ku)-f(li,2,kv))
    +
    447  & *slon(l,5))
    +
    448  ENDDO
    +
    449  ELSE
    +
    450  DO l=1,maxwv
    +
    451  lr=2*l+1
    +
    452  li=2*l+2
    +
    453 CDIR$ IVDEP
    +
    454  DO k=1,kmax
    +
    455  ku=k
    +
    456  kv=k+kmax
    +
    457  ijk1=ij1+(k-1)*kg
    +
    458  ijk3=ij3+(k-1)*kg
    +
    459  ijk5=ij5+(k-1)*kg
    +
    460  ijk7=ij7+(k-1)*kg
    +
    461  un(ijk1)=un(ijk1)+2*srh*(( f(lr,1,ku)+f(lr,1,kv))
    +
    462  & *clon(l,1)
    +
    463  & -( f(li,1,ku)+f(li,1,kv))
    +
    464  & *slon(l,1))
    +
    465  vn(ijk1)=vn(ijk1)+2*srh*((-f(lr,1,ku)+f(lr,1,kv))
    +
    466  & *clon(l,1)
    +
    467  & -(-f(li,1,ku)+f(li,1,kv))
    +
    468  & *slon(l,1))
    +
    469  un(ijk3)=un(ijk3)+2*srh*((-f(lr,1,ku)+f(lr,1,kv))
    +
    470  & *clon(l,3)
    +
    471  & -(-f(li,1,ku)+f(li,1,kv))
    +
    472  & *slon(l,3))
    +
    473  vn(ijk3)=vn(ijk3)+2*srh*((-f(lr,1,ku)-f(lr,1,kv))
    +
    474  & *clon(l,3)
    +
    475  & -(-f(li,1,ku)-f(li,1,kv))
    +
    476  & *slon(l,3))
    +
    477  un(ijk5)=un(ijk5)+2*srh*((-f(lr,1,ku)-f(lr,1,kv))
    +
    478  & *clon(l,5)
    +
    479  & -(-f(li,1,ku)-f(li,1,kv))
    +
    480  & *slon(l,5))
    +
    481  vn(ijk5)=vn(ijk5)+2*srh*(( f(lr,1,ku)-f(lr,1,kv))
    +
    482  & *clon(l,5)
    +
    483  & -( f(li,1,ku)-f(li,1,kv))
    +
    484  & *slon(l,5))
    +
    485  un(ijk7)=un(ijk7)+2*srh*(( f(lr,1,ku)-f(lr,1,kv))
    +
    486  & *clon(l,7)
    +
    487  & -( f(li,1,ku)-f(li,1,kv))
    +
    488  & *slon(l,7))
    +
    489  vn(ijk7)=vn(ijk7)+2*srh*(( f(lr,1,ku)+f(lr,1,kv))
    +
    490  & *clon(l,7)
    +
    491  & -( f(li,1,ku)+f(li,1,kv))
    +
    492  & *slon(l,7))
    +
    493  us(ijk1)=us(ijk1)+2*srh*((-f(lr,2,ku)-f(lr,2,kv))
    +
    494  & *clon(l,3)
    +
    495  & -(-f(li,2,ku)-f(li,2,kv))
    +
    496  & *slon(l,3))
    +
    497  vs(ijk1)=vs(ijk1)+2*srh*(( f(lr,2,ku)-f(lr,2,kv))
    +
    498  & *clon(l,3)
    +
    499  & -( f(li,2,ku)-f(li,2,kv))
    +
    500  & *slon(l,3))
    +
    501  us(ijk3)=us(ijk3)+2*srh*(( f(lr,2,ku)-f(lr,2,kv))
    +
    502  & *clon(l,1)
    +
    503  & -( f(li,2,ku)-f(li,2,kv))
    +
    504  & *slon(l,1))
    +
    505  vs(ijk3)=vs(ijk3)+2*srh*(( f(lr,2,ku)+f(lr,2,kv))
    +
    506  & *clon(l,1)
    +
    507  & -( f(li,2,ku)+f(li,2,kv))
    +
    508  & *slon(l,1))
    +
    509  us(ijk5)=us(ijk5)+2*srh*(( f(lr,2,ku)+f(lr,2,kv))
    +
    510  & *clon(l,7)
    +
    511  & -( f(li,2,ku)+f(li,2,kv))
    +
    512  & *slon(l,7))
    +
    513  vs(ijk5)=vs(ijk5)+2*srh*((-f(lr,2,ku)+f(lr,2,kv))
    +
    514  & *clon(l,7)
    +
    515  & -(-f(li,2,ku)+f(li,2,kv))
    +
    516  & *slon(l,7))
    +
    517  us(ijk7)=us(ijk7)+2*srh*((-f(lr,2,ku)+f(lr,2,kv))
    +
    518  & *clon(l,5)
    +
    519  & -(-f(li,2,ku)+f(li,2,kv))
    +
    520  & *slon(l,5))
    +
    521  vs(ijk7)=vs(ijk7)+2*srh*((-f(lr,2,ku)-f(lr,2,kv))
    +
    522  & *clon(l,5)
    +
    523  & -(-f(li,2,ku)-f(li,2,kv))
    +
    524  & *slon(l,5))
    +
    525  ENDDO
    +
    526  ENDDO
    +
    527  ENDIF
    +
    528  ENDDO
    +
    529 
    +
    530 C CALCULATE THE REMAINDER OF THE POLAR STEREOGRAPHIC DOMAIN,
    +
    531 C STARTING AT THE SECTOR JUST CLOCKWISE OF THE ORIENTATION LONGITUDE
    +
    532 C AND GOING CLOCKWISE UNTIL ALL EIGHT SECTORS ARE DONE.
    +
    533 C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8)
    +
    534 C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8)
    +
    535 C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8)
    +
    536 C$OMP& PRIVATE(DJ1,DI1,RQ,RR,RADLON,RADLON1,RADLON2,SLAT1,CLAT1)
    +
    537 C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,KU,KV,LR,LI)
    +
    538  DO j1=1,nph-1
    +
    539  DO i1=j1+1,nph
    +
    540  j2=i1
    +
    541  i2=j1
    +
    542  j3=nps+1-i1
    +
    543  i3=j1
    +
    544  j4=nps+1-j1
    +
    545  i4=i1
    +
    546  j5=nps+1-j1
    +
    547  i5=nps+1-i1
    +
    548  j6=nps+1-i1
    +
    549  i6=nps+1-j1
    +
    550  j7=i1
    +
    551  i7=nps+1-j1
    +
    552  j8=j1
    +
    553  i8=nps+1-i1
    +
    554  ij1=(i1-1)*ni+(j1-1)*nj+1
    +
    555  ij2=(i2-1)*ni+(j2-1)*nj+1
    +
    556  ij3=(i3-1)*ni+(j3-1)*nj+1
    +
    557  ij4=(i4-1)*ni+(j4-1)*nj+1
    +
    558  ij5=(i5-1)*ni+(j5-1)*nj+1
    +
    559  ij6=(i6-1)*ni+(j6-1)*nj+1
    +
    560  ij7=(i7-1)*ni+(j7-1)*nj+1
    +
    561  ij8=(i8-1)*ni+(j8-1)*nj+1
    +
    562  di1=i1-nph-1
    +
    563  dj1=j1-nph-1
    +
    564  rq=di1**2+dj1**2
    +
    565  rr=sqrt(1/rq)
    +
    566  slat1=(gq-rq)/(gq+rq)
    +
    567  clat1=sqrt(1.-slat1**2)
    +
    568  radlon1=orient/dpr+atan(-di1/dj1)
    +
    569  radlon2=(orient-45)/dpr*2-radlon1
    +
    570  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
    +
    571  & pln,plntop)
    +
    572  CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
    +
    573  & clat1,pln,plntop,mp,w,wtop,f)
    +
    574  DO l=1,maxwv
    +
    575  slon(l,1)=sin(l*radlon1)
    +
    576  clon(l,1)=cos(l*radlon1)
    +
    577  slon(l,2)=sin(l*radlon2)
    +
    578  clon(l,2)=cos(l*radlon2)
    +
    579  slon(l,3)=slon(l,1)*crot(mod(1*l,4))
    +
    580  & -clon(l,1)*srot(mod(1*l,4))
    +
    581  clon(l,3)=clon(l,1)*crot(mod(1*l,4))
    +
    582  & +slon(l,1)*srot(mod(1*l,4))
    +
    583  slon(l,4)=slon(l,2)*crot(mod(1*l,4))
    +
    584  & -clon(l,2)*srot(mod(1*l,4))
    +
    585  clon(l,4)=clon(l,2)*crot(mod(1*l,4))
    +
    586  & +slon(l,2)*srot(mod(1*l,4))
    +
    587  slon(l,5)=slon(l,1)*crot(mod(2*l,4))
    +
    588  & -clon(l,1)*srot(mod(2*l,4))
    +
    589  clon(l,5)=clon(l,1)*crot(mod(2*l,4))
    +
    590  & +slon(l,1)*srot(mod(2*l,4))
    +
    591  slon(l,6)=slon(l,2)*crot(mod(2*l,4))
    +
    592  & -clon(l,2)*srot(mod(2*l,4))
    +
    593  clon(l,6)=clon(l,2)*crot(mod(2*l,4))
    +
    594  & +slon(l,2)*srot(mod(2*l,4))
    +
    595  slon(l,7)=slon(l,1)*crot(mod(3*l,4))
    +
    596  & -clon(l,1)*srot(mod(3*l,4))
    +
    597  clon(l,7)=clon(l,1)*crot(mod(3*l,4))
    +
    598  & +slon(l,1)*srot(mod(3*l,4))
    +
    599  slon(l,8)=slon(l,2)*crot(mod(3*l,4))
    +
    600  & -clon(l,2)*srot(mod(3*l,4))
    +
    601  clon(l,8)=clon(l,2)*crot(mod(3*l,4))
    +
    602  & +slon(l,2)*srot(mod(3*l,4))
    +
    603  ENDDO
    +
    604 CDIR$ IVDEP
    +
    605  DO k=1,kmax
    +
    606  ku=k
    +
    607  kv=k+kmax
    +
    608  ijk1=ij1+(k-1)*kg
    +
    609  ijk2=ij2+(k-1)*kg
    +
    610  ijk3=ij3+(k-1)*kg
    +
    611  ijk4=ij4+(k-1)*kg
    +
    612  ijk5=ij5+(k-1)*kg
    +
    613  ijk6=ij6+(k-1)*kg
    +
    614  ijk7=ij7+(k-1)*kg
    +
    615  ijk8=ij8+(k-1)*kg
    +
    616  un(ijk1)=rr*(-dj1*f(1,1,ku)-di1*f(1,1,kv))
    +
    617  vn(ijk1)=rr*( di1*f(1,1,ku)-dj1*f(1,1,kv))
    +
    618  un(ijk2)=rr*(-di1*f(1,1,ku)-dj1*f(1,1,kv))
    +
    619  vn(ijk2)=rr*( dj1*f(1,1,ku)-di1*f(1,1,kv))
    +
    620  un(ijk3)=rr*( di1*f(1,1,ku)-dj1*f(1,1,kv))
    +
    621  vn(ijk3)=rr*( dj1*f(1,1,ku)+di1*f(1,1,kv))
    +
    622  un(ijk4)=rr*( dj1*f(1,1,ku)-di1*f(1,1,kv))
    +
    623  vn(ijk4)=rr*( di1*f(1,1,ku)+dj1*f(1,1,kv))
    +
    624  un(ijk5)=rr*( dj1*f(1,1,ku)+di1*f(1,1,kv))
    +
    625  vn(ijk5)=rr*(-di1*f(1,1,ku)+dj1*f(1,1,kv))
    +
    626  un(ijk6)=rr*( di1*f(1,1,ku)+dj1*f(1,1,kv))
    +
    627  vn(ijk6)=rr*(-dj1*f(1,1,ku)+di1*f(1,1,kv))
    +
    628  un(ijk7)=rr*(-di1*f(1,1,ku)+dj1*f(1,1,kv))
    +
    629  vn(ijk7)=rr*(-dj1*f(1,1,ku)-di1*f(1,1,kv))
    +
    630  un(ijk8)=rr*(-dj1*f(1,1,ku)+di1*f(1,1,kv))
    +
    631  vn(ijk8)=rr*(-di1*f(1,1,ku)-dj1*f(1,1,kv))
    +
    632  us(ijk1)=rr*( dj1*f(1,2,ku)+di1*f(1,2,kv))
    +
    633  vs(ijk1)=rr*(-di1*f(1,2,ku)+dj1*f(1,2,kv))
    +
    634  us(ijk2)=rr*( di1*f(1,2,ku)+dj1*f(1,2,kv))
    +
    635  vs(ijk2)=rr*(-dj1*f(1,2,ku)+di1*f(1,2,kv))
    +
    636  us(ijk3)=rr*(-di1*f(1,2,ku)+dj1*f(1,2,kv))
    +
    637  vs(ijk3)=rr*(-dj1*f(1,2,ku)-di1*f(1,2,kv))
    +
    638  us(ijk4)=rr*(-dj1*f(1,2,ku)+di1*f(1,2,kv))
    +
    639  vs(ijk4)=rr*(-di1*f(1,2,ku)-dj1*f(1,2,kv))
    +
    640  us(ijk5)=rr*(-dj1*f(1,2,ku)-di1*f(1,2,kv))
    +
    641  vs(ijk5)=rr*( di1*f(1,2,ku)-dj1*f(1,2,kv))
    +
    642  us(ijk6)=rr*(-di1*f(1,2,ku)-dj1*f(1,2,kv))
    +
    643  vs(ijk6)=rr*( dj1*f(1,2,ku)-di1*f(1,2,kv))
    +
    644  us(ijk7)=rr*( di1*f(1,2,ku)-dj1*f(1,2,kv))
    +
    645  vs(ijk7)=rr*( dj1*f(1,2,ku)+di1*f(1,2,kv))
    +
    646  us(ijk8)=rr*( dj1*f(1,2,ku)-di1*f(1,2,kv))
    +
    647  vs(ijk8)=rr*( di1*f(1,2,ku)+dj1*f(1,2,kv))
    +
    648  ENDDO
    +
    649  IF(kmax.EQ.1) THEN
    +
    650  ku=1
    +
    651  kv=2
    +
    652  DO l=1,maxwv
    +
    653  lr=2*l+1
    +
    654  li=2*l+2
    +
    655  un(ij1)=un(ij1)+2*rr*((-dj1*f(lr,1,ku)-di1*f(lr,1,kv))
    +
    656  & *clon(l,1)
    +
    657  & -(-dj1*f(li,1,ku)-di1*f(li,1,kv))
    +
    658  & *slon(l,1))
    +
    659  vn(ij1)=vn(ij1)+2*rr*(( di1*f(lr,1,ku)-dj1*f(lr,1,kv))
    +
    660  & *clon(l,1)
    +
    661  & -( di1*f(li,1,ku)-dj1*f(li,1,kv))
    +
    662  & *slon(l,1))
    +
    663  un(ij2)=un(ij2)+2*rr*((-di1*f(lr,1,ku)-dj1*f(lr,1,kv))
    +
    664  & *clon(l,2)
    +
    665  & -(-di1*f(li,1,ku)-dj1*f(li,1,kv))
    +
    666  & *slon(l,2))
    +
    667  vn(ij2)=vn(ij2)+2*rr*(( dj1*f(lr,1,ku)-di1*f(lr,1,kv))
    +
    668  & *clon(l,2)
    +
    669  & -( dj1*f(li,1,ku)-di1*f(li,1,kv))
    +
    670  & *slon(l,2))
    +
    671  un(ij3)=un(ij3)+2*rr*(( di1*f(lr,1,ku)-dj1*f(lr,1,kv))
    +
    672  & *clon(l,3)
    +
    673  & -( di1*f(li,1,ku)-dj1*f(li,1,kv))
    +
    674  & *slon(l,3))
    +
    675  vn(ij3)=vn(ij3)+2*rr*(( dj1*f(lr,1,ku)+di1*f(lr,1,kv))
    +
    676  & *clon(l,3)
    +
    677  & -( dj1*f(li,1,ku)+di1*f(li,1,kv))
    +
    678  & *slon(l,3))
    +
    679  un(ij4)=un(ij4)+2*rr*(( dj1*f(lr,1,ku)-di1*f(lr,1,kv))
    +
    680  & *clon(l,4)
    +
    681  & -( dj1*f(li,1,ku)-di1*f(li,1,kv))
    +
    682  & *slon(l,4))
    +
    683  vn(ij4)=vn(ij4)+2*rr*(( di1*f(lr,1,ku)+dj1*f(lr,1,kv))
    +
    684  & *clon(l,4)
    +
    685  & -( di1*f(li,1,ku)+dj1*f(li,1,kv))
    +
    686  & *slon(l,4))
    +
    687  un(ij5)=un(ij5)+2*rr*(( dj1*f(lr,1,ku)+di1*f(lr,1,kv))
    +
    688  & *clon(l,5)
    +
    689  & -( dj1*f(li,1,ku)+di1*f(li,1,kv))
    +
    690  & *slon(l,5))
    +
    691  vn(ij5)=vn(ij5)+2*rr*((-di1*f(lr,1,ku)+dj1*f(lr,1,kv))
    +
    692  & *clon(l,5)
    +
    693  & -(-di1*f(li,1,ku)+dj1*f(li,1,kv))
    +
    694  & *slon(l,5))
    +
    695  un(ij6)=un(ij6)+2*rr*(( di1*f(lr,1,ku)+dj1*f(lr,1,kv))
    +
    696  & *clon(l,6)
    +
    697  & -( di1*f(li,1,ku)+dj1*f(li,1,kv))
    +
    698  & *slon(l,6))
    +
    699  vn(ij6)=vn(ij6)+2*rr*((-dj1*f(lr,1,ku)+di1*f(lr,1,kv))
    +
    700  & *clon(l,6)
    +
    701  & -(-dj1*f(li,1,ku)+di1*f(li,1,kv))
    +
    702  & *slon(l,6))
    +
    703  un(ij7)=un(ij7)+2*rr*((-di1*f(lr,1,ku)+dj1*f(lr,1,kv))
    +
    704  & *clon(l,7)
    +
    705  & -(-di1*f(li,1,ku)+dj1*f(li,1,kv))
    +
    706  & *slon(l,7))
    +
    707  vn(ij7)=vn(ij7)+2*rr*((-dj1*f(lr,1,ku)-di1*f(lr,1,kv))
    +
    708  & *clon(l,7)
    +
    709  & -(-dj1*f(li,1,ku)-di1*f(li,1,kv))
    +
    710  & *slon(l,7))
    +
    711  un(ij8)=un(ij8)+2*rr*((-dj1*f(lr,1,ku)+di1*f(lr,1,kv))
    +
    712  & *clon(l,8)
    +
    713  & -(-dj1*f(li,1,ku)+di1*f(li,1,kv))
    +
    714  & *slon(l,8))
    +
    715  vn(ij8)=vn(ij8)+2*rr*((-di1*f(lr,1,ku)-dj1*f(lr,1,kv))
    +
    716  & *clon(l,8)
    +
    717  & -(-di1*f(li,1,ku)-dj1*f(li,1,kv))
    +
    718  & *slon(l,8))
    +
    719  us(ij1)=us(ij1)+2*rr*(( dj1*f(lr,2,ku)+di1*f(lr,2,kv))
    +
    720  & *clon(l,4)
    +
    721  & -( dj1*f(li,2,ku)+di1*f(li,2,kv))
    +
    722  & *slon(l,4))
    +
    723  vs(ij1)=vs(ij1)+2*rr*((-di1*f(lr,2,ku)+dj1*f(lr,2,kv))
    +
    724  & *clon(l,4)
    +
    725  & -(-di1*f(li,2,ku)+dj1*f(li,2,kv))
    +
    726  & *slon(l,4))
    +
    727  us(ij2)=us(ij2)+2*rr*(( di1*f(lr,2,ku)+dj1*f(lr,2,kv))
    +
    728  & *clon(l,3)
    +
    729  & -( di1*f(li,2,ku)+dj1*f(li,2,kv))
    +
    730  & *slon(l,3))
    +
    731  vs(ij2)=vs(ij2)+2*rr*((-dj1*f(lr,2,ku)+di1*f(lr,2,kv))
    +
    732  & *clon(l,3)
    +
    733  & -(-dj1*f(li,2,ku)+di1*f(li,2,kv))
    +
    734  & *slon(l,3))
    +
    735  us(ij3)=us(ij3)+2*rr*((-di1*f(lr,2,ku)+dj1*f(lr,2,kv))
    +
    736  & *clon(l,2)
    +
    737  & -(-di1*f(li,2,ku)+dj1*f(li,2,kv))
    +
    738  & *slon(l,2))
    +
    739  vs(ij3)=vs(ij3)+2*rr*((-dj1*f(lr,2,ku)-di1*f(lr,2,kv))
    +
    740  & *clon(l,2)
    +
    741  & -(-dj1*f(li,2,ku)-di1*f(li,2,kv))
    +
    742  & *slon(l,2))
    +
    743  us(ij4)=us(ij4)+2*rr*((-dj1*f(lr,2,ku)+di1*f(lr,2,kv))
    +
    744  & *clon(l,1)
    +
    745  & -(-dj1*f(li,2,ku)+di1*f(li,2,kv))
    +
    746  & *slon(l,1))
    +
    747  vs(ij4)=vs(ij4)+2*rr*((-di1*f(lr,2,ku)-dj1*f(lr,2,kv))
    +
    748  & *clon(l,1)
    +
    749  & -(-di1*f(li,2,ku)-dj1*f(li,2,kv))
    +
    750  & *slon(l,1))
    +
    751  us(ij5)=us(ij5)+2*rr*((-dj1*f(lr,2,ku)-di1*f(lr,2,kv))
    +
    752  & *clon(l,8)
    +
    753  & -(-dj1*f(li,2,ku)-di1*f(li,2,kv))
    +
    754  & *slon(l,8))
    +
    755  vs(ij5)=vs(ij5)+2*rr*(( di1*f(lr,2,ku)-dj1*f(lr,2,kv))
    +
    756  & *clon(l,8)
    +
    757  & -( di1*f(li,2,ku)-dj1*f(li,2,kv))
    +
    758  & *slon(l,8))
    +
    759  us(ij6)=us(ij6)+2*rr*((-di1*f(lr,2,ku)-dj1*f(lr,2,kv))
    +
    760  & *clon(l,7)
    +
    761  & -(-di1*f(li,2,ku)-dj1*f(li,2,kv))
    +
    762  & *slon(l,7))
    +
    763  vs(ij6)=vs(ij6)+2*rr*(( dj1*f(lr,2,ku)-di1*f(lr,2,kv))
    +
    764  & *clon(l,7)
    +
    765  & -( dj1*f(li,2,ku)-di1*f(li,2,kv))
    +
    766  & *slon(l,7))
    +
    767  us(ij7)=us(ij7)+2*rr*(( di1*f(lr,2,ku)-dj1*f(lr,2,kv))
    +
    768  & *clon(l,6)
    +
    769  & -( di1*f(li,2,ku)-dj1*f(li,2,kv))
    +
    770  & *slon(l,6))
    +
    771  vs(ij7)=vs(ij7)+2*rr*(( dj1*f(lr,2,ku)+di1*f(lr,2,kv))
    +
    772  & *clon(l,6)
    +
    773  & -( dj1*f(li,2,ku)+di1*f(li,2,kv))
    +
    774  & *slon(l,6))
    +
    775  us(ij8)=us(ij8)+2*rr*(( dj1*f(lr,2,ku)-di1*f(lr,2,kv))
    +
    776  & *clon(l,5)
    +
    777  & -( dj1*f(li,2,ku)-di1*f(li,2,kv))
    +
    778  & *slon(l,5))
    +
    779  vs(ij8)=vs(ij8)+2*rr*(( di1*f(lr,2,ku)+dj1*f(lr,2,kv))
    +
    780  & *clon(l,5)
    +
    781  & -( di1*f(li,2,ku)+dj1*f(li,2,kv))
    +
    782  & *slon(l,5))
    +
    783  ENDDO
    +
    784  ELSE
    +
    785  DO l=1,maxwv
    +
    786  lr=2*l+1
    +
    787  li=2*l+2
    +
    788 CDIR$ IVDEP
    +
    789  DO k=1,kmax
    +
    790  ku=k
    +
    791  kv=k+kmax
    +
    792  ijk1=ij1+(k-1)*kg
    +
    793  ijk2=ij2+(k-1)*kg
    +
    794  ijk3=ij3+(k-1)*kg
    +
    795  ijk4=ij4+(k-1)*kg
    +
    796  ijk5=ij5+(k-1)*kg
    +
    797  ijk6=ij6+(k-1)*kg
    +
    798  ijk7=ij7+(k-1)*kg
    +
    799  ijk8=ij8+(k-1)*kg
    +
    800  un(ijk1)=un(ijk1)+2*rr*((-dj1*f(lr,1,ku)-di1*f(lr,1,kv))
    +
    801  & *clon(l,1)
    +
    802  & -(-dj1*f(li,1,ku)-di1*f(li,1,kv))
    +
    803  & *slon(l,1))
    +
    804  vn(ijk1)=vn(ijk1)+2*rr*(( di1*f(lr,1,ku)-dj1*f(lr,1,kv))
    +
    805  & *clon(l,1)
    +
    806  & -( di1*f(li,1,ku)-dj1*f(li,1,kv))
    +
    807  & *slon(l,1))
    +
    808  un(ijk2)=un(ijk2)+2*rr*((-di1*f(lr,1,ku)-dj1*f(lr,1,kv))
    +
    809  & *clon(l,2)
    +
    810  & -(-di1*f(li,1,ku)-dj1*f(li,1,kv))
    +
    811  & *slon(l,2))
    +
    812  vn(ijk2)=vn(ijk2)+2*rr*(( dj1*f(lr,1,ku)-di1*f(lr,1,kv))
    +
    813  & *clon(l,2)
    +
    814  & -( dj1*f(li,1,ku)-di1*f(li,1,kv))
    +
    815  & *slon(l,2))
    +
    816  un(ijk3)=un(ijk3)+2*rr*(( di1*f(lr,1,ku)-dj1*f(lr,1,kv))
    +
    817  & *clon(l,3)
    +
    818  & -( di1*f(li,1,ku)-dj1*f(li,1,kv))
    +
    819  & *slon(l,3))
    +
    820  vn(ijk3)=vn(ijk3)+2*rr*(( dj1*f(lr,1,ku)+di1*f(lr,1,kv))
    +
    821  & *clon(l,3)
    +
    822  & -( dj1*f(li,1,ku)+di1*f(li,1,kv))
    +
    823  & *slon(l,3))
    +
    824  un(ijk4)=un(ijk4)+2*rr*(( dj1*f(lr,1,ku)-di1*f(lr,1,kv))
    +
    825  & *clon(l,4)
    +
    826  & -( dj1*f(li,1,ku)-di1*f(li,1,kv))
    +
    827  & *slon(l,4))
    +
    828  vn(ijk4)=vn(ijk4)+2*rr*(( di1*f(lr,1,ku)+dj1*f(lr,1,kv))
    +
    829  & *clon(l,4)
    +
    830  & -( di1*f(li,1,ku)+dj1*f(li,1,kv))
    +
    831  & *slon(l,4))
    +
    832  un(ijk5)=un(ijk5)+2*rr*(( dj1*f(lr,1,ku)+di1*f(lr,1,kv))
    +
    833  & *clon(l,5)
    +
    834  & -( dj1*f(li,1,ku)+di1*f(li,1,kv))
    +
    835  & *slon(l,5))
    +
    836  vn(ijk5)=vn(ijk5)+2*rr*((-di1*f(lr,1,ku)+dj1*f(lr,1,kv))
    +
    837  & *clon(l,5)
    +
    838  & -(-di1*f(li,1,ku)+dj1*f(li,1,kv))
    +
    839  & *slon(l,5))
    +
    840  un(ijk6)=un(ijk6)+2*rr*(( di1*f(lr,1,ku)+dj1*f(lr,1,kv))
    +
    841  & *clon(l,6)
    +
    842  & -( di1*f(li,1,ku)+dj1*f(li,1,kv))
    +
    843  & *slon(l,6))
    +
    844  vn(ijk6)=vn(ijk6)+2*rr*((-dj1*f(lr,1,ku)+di1*f(lr,1,kv))
    +
    845  & *clon(l,6)
    +
    846  & -(-dj1*f(li,1,ku)+di1*f(li,1,kv))
    +
    847  & *slon(l,6))
    +
    848  un(ijk7)=un(ijk7)+2*rr*((-di1*f(lr,1,ku)+dj1*f(lr,1,kv))
    +
    849  & *clon(l,7)
    +
    850  & -(-di1*f(li,1,ku)+dj1*f(li,1,kv))
    +
    851  & *slon(l,7))
    +
    852  vn(ijk7)=vn(ijk7)+2*rr*((-dj1*f(lr,1,ku)-di1*f(lr,1,kv))
    +
    853  & *clon(l,7)
    +
    854  & -(-dj1*f(li,1,ku)-di1*f(li,1,kv))
    +
    855  & *slon(l,7))
    +
    856  un(ijk8)=un(ijk8)+2*rr*((-dj1*f(lr,1,ku)+di1*f(lr,1,kv))
    +
    857  & *clon(l,8)
    +
    858  & -(-dj1*f(li,1,ku)+di1*f(li,1,kv))
    +
    859  & *slon(l,8))
    +
    860  vn(ijk8)=vn(ijk8)+2*rr*((-di1*f(lr,1,ku)-dj1*f(lr,1,kv))
    +
    861  & *clon(l,8)
    +
    862  & -(-di1*f(li,1,ku)-dj1*f(li,1,kv))
    +
    863  & *slon(l,8))
    +
    864  us(ijk1)=us(ijk1)+2*rr*(( dj1*f(lr,2,ku)+di1*f(lr,2,kv))
    +
    865  & *clon(l,4)
    +
    866  & -( dj1*f(li,2,ku)+di1*f(li,2,kv))
    +
    867  & *slon(l,4))
    +
    868  vs(ijk1)=vs(ijk1)+2*rr*((-di1*f(lr,2,ku)+dj1*f(lr,2,kv))
    +
    869  & *clon(l,4)
    +
    870  & -(-di1*f(li,2,ku)+dj1*f(li,2,kv))
    +
    871  & *slon(l,4))
    +
    872  us(ijk2)=us(ijk2)+2*rr*(( di1*f(lr,2,ku)+dj1*f(lr,2,kv))
    +
    873  & *clon(l,3)
    +
    874  & -( di1*f(li,2,ku)+dj1*f(li,2,kv))
    +
    875  & *slon(l,3))
    +
    876  vs(ijk2)=vs(ijk2)+2*rr*((-dj1*f(lr,2,ku)+di1*f(lr,2,kv))
    +
    877  & *clon(l,3)
    +
    878  & -(-dj1*f(li,2,ku)+di1*f(li,2,kv))
    +
    879  & *slon(l,3))
    +
    880  us(ijk3)=us(ijk3)+2*rr*((-di1*f(lr,2,ku)+dj1*f(lr,2,kv))
    +
    881  & *clon(l,2)
    +
    882  & -(-di1*f(li,2,ku)+dj1*f(li,2,kv))
    +
    883  & *slon(l,2))
    +
    884  vs(ijk3)=vs(ijk3)+2*rr*((-dj1*f(lr,2,ku)-di1*f(lr,2,kv))
    +
    885  & *clon(l,2)
    +
    886  & -(-dj1*f(li,2,ku)-di1*f(li,2,kv))
    +
    887  & *slon(l,2))
    +
    888  us(ijk4)=us(ijk4)+2*rr*((-dj1*f(lr,2,ku)+di1*f(lr,2,kv))
    +
    889  & *clon(l,1)
    +
    890  & -(-dj1*f(li,2,ku)+di1*f(li,2,kv))
    +
    891  & *slon(l,1))
    +
    892  vs(ijk4)=vs(ijk4)+2*rr*((-di1*f(lr,2,ku)-dj1*f(lr,2,kv))
    +
    893  & *clon(l,1)
    +
    894  & -(-di1*f(li,2,ku)-dj1*f(li,2,kv))
    +
    895  & *slon(l,1))
    +
    896  us(ijk5)=us(ijk5)+2*rr*((-dj1*f(lr,2,ku)-di1*f(lr,2,kv))
    +
    897  & *clon(l,8)
    +
    898  & -(-dj1*f(li,2,ku)-di1*f(li,2,kv))
    +
    899  & *slon(l,8))
    +
    900  vs(ijk5)=vs(ijk5)+2*rr*(( di1*f(lr,2,ku)-dj1*f(lr,2,kv))
    +
    901  & *clon(l,8)
    +
    902  & -( di1*f(li,2,ku)-dj1*f(li,2,kv))
    +
    903  & *slon(l,8))
    +
    904  us(ijk6)=us(ijk6)+2*rr*((-di1*f(lr,2,ku)-dj1*f(lr,2,kv))
    +
    905  & *clon(l,7)
    +
    906  & -(-di1*f(li,2,ku)-dj1*f(li,2,kv))
    +
    907  & *slon(l,7))
    +
    908  vs(ijk6)=vs(ijk6)+2*rr*(( dj1*f(lr,2,ku)-di1*f(lr,2,kv))
    +
    909  & *clon(l,7)
    +
    910  & -( dj1*f(li,2,ku)-di1*f(li,2,kv))
    +
    911  & *slon(l,7))
    +
    912  us(ijk7)=us(ijk7)+2*rr*(( di1*f(lr,2,ku)-dj1*f(lr,2,kv))
    +
    913  & *clon(l,6)
    +
    914  & -( di1*f(li,2,ku)-dj1*f(li,2,kv))
    +
    915  & *slon(l,6))
    +
    916  vs(ijk7)=vs(ijk7)+2*rr*(( dj1*f(lr,2,ku)+di1*f(lr,2,kv))
    +
    917  & *clon(l,6)
    +
    918  & -( dj1*f(li,2,ku)+di1*f(li,2,kv))
    +
    919  & *slon(l,6))
    +
    920  us(ijk8)=us(ijk8)+2*rr*(( dj1*f(lr,2,ku)-di1*f(lr,2,kv))
    +
    921  & *clon(l,5)
    +
    922  & -( dj1*f(li,2,ku)-di1*f(li,2,kv))
    +
    923  & *slon(l,5))
    +
    924  vs(ijk8)=vs(ijk8)+2*rr*(( di1*f(lr,2,ku)+dj1*f(lr,2,kv))
    +
    925  & *clon(l,5)
    +
    926  & -( di1*f(li,2,ku)+dj1*f(li,2,kv))
    +
    927  & *slon(l,5))
    +
    928  ENDDO
    +
    929  ENDDO
    +
    930  ENDIF
    +
    931  ENDDO
    +
    932  ENDDO
    +
    933 
    +
    934  END
    +
    subroutine spdz2uv(I, M, ENN1, ELONN1, EON, EONTOP, D, Z, U, V, UTOP, VTOP)
    Computes the wind components from divergence and vorticity in spectral space.
    Definition: spdz2uv.f:49
    +
    subroutine splegend(I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
    Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
    Definition: splegend.f:45
    +
    subroutine spsynth(I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
    Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
    Definition: spsynth.f:39
    +
    subroutine sptgpsv(IROMB, MAXWV, KMAX, NPS, KWSKIP, KGSKIP, NISKIP, NJSKIP, TRUE, XMESH, ORIENT, WAVED, WAVEZ, UN, VN, US, VS)
    This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
    Definition: sptgpsv.f:83
    +
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgpt_8f.html b/ver-5.1.0/sptgpt_8f.html new file mode 100644 index 00000000..2d0b850b --- /dev/null +++ b/ver-5.1.0/sptgpt_8f.html @@ -0,0 +1,252 @@ + + + + + + + +NCEPLIBS-ip: sptgpt.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptgpt.f File Reference
    +
    +
    + +

    Transform spectral scalar to station points. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptgpt (IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVE, GP)
     This subprogram performs a spherical transform from spectral coefficients of scalar quantities to specified sets of station points on the globe. More...
     
    +

    Detailed Description

    +

    Transform spectral scalar to station points.

    +

    +Program History Log

    + + + + + + + + + +
    Date Programmer Comments
    96-02-29 Iredell Initial.
    1998-12-15 Iredell Openmp directives inserted.
    2003-06-30 Iredell Use spfftpt().
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition in file sptgpt.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptgpt()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptgpt ( IROMB,
     MAXWV,
     KMAX,
     NMAX,
     KWSKIP,
     KGSKIP,
     NRSKIP,
     NGSKIP,
    real, dimension(*) RLAT,
    real, dimension(*) RLON,
    real, dimension(*) WAVE,
    real, dimension(*) GP 
    )
    +
    + +

    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to specified sets of station points on the globe.

    +

    The wave-space can be either triangular or rhomboidal.

    +

    The wave and point fields may have general indexing, but each wave field is in sequential 'IBM order', i.e. with zonal wavenumber as the slower index.

    +

    The transforms are all multiprocessed over stations.

    +

    Transform several fields at a time to improve vectorization.

    +

    Subprogram can be called from a multiprocessing environment.

    +
    Parameters
    + + + + + + + + + + + + + +
    IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVspectral truncation
    KMAXnumber of fields to transform.
    NMAXnumber of station points to return
    KWSKIPskip number between wave fields (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
    KGSKIPskip number between station point sets (defaults to NMAX if KGSKIP=0)
    NRSKIPskip number between station lats and lons (defaults to 1 if NRSKIP=0)
    NGSKIPskip number between station points (defaults to 1 if NGSKIP=0)
    RLATstation latitudes in degrees
    RLONstation longitudes in degrees
    WAVEwave fields
    GPstation point sets
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition at line 48 of file sptgpt.f.

    + +

    References spfftpt(), splegend(), spsynth(), and spwget().

    + +

    Referenced by sptrung(), and sptrungv().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgpt_8f.js b/ver-5.1.0/sptgpt_8f.js new file mode 100644 index 00000000..708e1051 --- /dev/null +++ b/ver-5.1.0/sptgpt_8f.js @@ -0,0 +1,4 @@ +var sptgpt_8f = +[ + [ "sptgpt", "sptgpt_8f.html#a1b8d333bcc601e5b7e8d3dd1369f54b1", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptgpt_8f_source.html b/ver-5.1.0/sptgpt_8f_source.html new file mode 100644 index 00000000..70741732 --- /dev/null +++ b/ver-5.1.0/sptgpt_8f_source.html @@ -0,0 +1,208 @@ + + + + + + + +NCEPLIBS-ip: sptgpt.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptgpt.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Transform spectral scalar to station points.
    +
    3 C>
    +
    4 C> ### Program History Log
    +
    5 C> Date | Programmer | Comments
    +
    6 C> -----|------------|---------
    +
    7 C> 96-02-29 | Iredell | Initial.
    +
    8 C> 1998-12-15 | Iredell | Openmp directives inserted.
    +
    9 C> 2003-06-30 | Iredell | Use spfftpt().
    +
    10 C>
    +
    11 C> @author Iredell @date 96-02-29
    +
    12 
    +
    13 C> This subprogram performs a spherical transform
    +
    14 c> from spectral coefficients of scalar quantities
    +
    15 c> to specified sets of station points on the globe.
    +
    16 C>
    +
    17 C> The wave-space can be either triangular or rhomboidal.
    +
    18 C>
    +
    19 C> The wave and point fields may have general indexing,
    +
    20 c> but each wave field is in sequential 'IBM order',
    +
    21 c> i.e. with zonal wavenumber as the slower index.
    +
    22 C>
    +
    23 C> The transforms are all multiprocessed over stations.
    +
    24 C>
    +
    25 C> Transform several fields at a time to improve vectorization.
    +
    26 C>
    +
    27 C> Subprogram can be called from a multiprocessing environment.
    +
    28 C>
    +
    29 C> @param IROMB spectral domain shape
    +
    30 C> (0 for triangular, 1 for rhomboidal)
    +
    31 C> @param MAXWV spectral truncation
    +
    32 C> @param KMAX number of fields to transform.
    +
    33 C> @param NMAX number of station points to return
    +
    34 C> @param KWSKIP skip number between wave fields
    +
    35 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
    +
    36 C> @param KGSKIP skip number between station point sets
    +
    37 C> (defaults to NMAX if KGSKIP=0)
    +
    38 C> @param NRSKIP skip number between station lats and lons
    +
    39 C> (defaults to 1 if NRSKIP=0)
    +
    40 C> @param NGSKIP skip number between station points
    +
    41 C> (defaults to 1 if NGSKIP=0)
    +
    42 C> @param RLAT station latitudes in degrees
    +
    43 C> @param RLON station longitudes in degrees
    +
    44 C> @param WAVE wave fields
    +
    45 C> @param GP station point sets
    +
    46 C>
    +
    47 C> @author Iredell @date 96-02-29
    +
    48  SUBROUTINE sptgpt(IROMB,MAXWV,KMAX,NMAX,
    +
    49  & KWSKIP,KGSKIP,NRSKIP,NGSKIP,
    +
    50  & RLAT,RLON,WAVE,GP)
    +
    51 
    +
    52  REAL RLAT(*),RLON(*),WAVE(*),GP(*)
    +
    53  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    54  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    55  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    56  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    57  INTEGER MP(KMAX)
    +
    58  REAL WTOP(2*(MAXWV+1),KMAX)
    +
    59  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
    +
    60  REAL F(2*MAXWV+3,2,KMAX)
    +
    61  parameter(pi=3.14159265358979)
    +
    62 
    +
    63 C CALCULATE PRELIMINARY CONSTANTS
    +
    64  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    65  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    66  mxtop=maxwv+1
    +
    67  idim=2*maxwv+3
    +
    68  kw=kwskip
    +
    69  kg=kgskip
    +
    70  nr=nrskip
    +
    71  ng=ngskip
    +
    72  IF(kw.EQ.0) kw=2*mx
    +
    73  IF(kg.EQ.0) kg=nmax
    +
    74  IF(nr.EQ.0) nr=1
    +
    75  IF(ng.EQ.0) ng=1
    +
    76  mp=0
    +
    77 C$OMP PARALLEL DO
    +
    78  DO k=1,kmax
    +
    79  wtop(1:2*mxtop,k)=0
    +
    80  ENDDO
    +
    81 
    +
    82 C CALCULATE STATION FIELDS
    +
    83 C$OMP PARALLEL DO PRIVATE(RADLAT,SLAT1,CLAT1)
    +
    84 C$OMP& PRIVATE(PLN,PLNTOP,F,NK)
    +
    85  DO n=1,nmax
    +
    86  radlat=pi/180*rlat((n-1)*nr+1)
    +
    87  IF(rlat((n-1)*nr+1).GE.89.9995) THEN
    +
    88  slat1=1.
    +
    89  clat1=0.
    +
    90  ELSEIF(rlat((n-1)*nr+1).LE.-89.9995) THEN
    +
    91  slat1=-1.
    +
    92  clat1=0.
    +
    93  ELSE
    +
    94  slat1=sin(radlat)
    +
    95  clat1=cos(radlat)
    +
    96  ENDIF
    +
    97  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
    +
    98  & pln,plntop)
    +
    99  CALL spsynth(iromb,maxwv,2*maxwv,idim,kw,2*mxtop,kmax,
    +
    100  & clat1,pln,plntop,mp,wave,wtop,f)
    +
    101  CALL spfftpt(maxwv,1,2*maxwv+3,kg,kmax,rlon((n-1)*nr+1),
    +
    102  & f,gp((n-1)*ng+1))
    +
    103  ENDDO
    +
    104  END
    +
    subroutine spfftpt(M, N, INCW, INCG, KMAX, RLON, W, G)
    This subprogram computes a slow Fourier transform from Fourier space to a set of gridpoints.
    Definition: spfftpt.f:23
    +
    subroutine splegend(I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
    Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
    Definition: splegend.f:45
    +
    subroutine spsynth(I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
    Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
    Definition: spsynth.f:39
    +
    subroutine sptgpt(IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVE, GP)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to spe...
    Definition: sptgpt.f:51
    +
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgptd_8f.html b/ver-5.1.0/sptgptd_8f.html new file mode 100644 index 00000000..0888fc77 --- /dev/null +++ b/ver-5.1.0/sptgptd_8f.html @@ -0,0 +1,255 @@ + + + + + + + +NCEPLIBS-ip: sptgptd.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptgptd.f File Reference
    +
    +
    + +

    Transform spectral to station point gradients. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptgptd (IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVE, XP, YP)
     This subprogram performs a spherical transform from spectral coefficients of scalar fields to specified sets of station point gradients on the globe. More...
     
    +

    Detailed Description

    +

    Transform spectral to station point gradients.

    +

    +Program History Log

    + + + + + + + +
    Date Programmer Comments
    96-02-29 Iredell Initial.
    1998-12-15 Iredell Openmp directives inserted.
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition in file sptgptd.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptgptd()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptgptd ( IROMB,
     MAXWV,
     KMAX,
     NMAX,
     KWSKIP,
     KGSKIP,
     NRSKIP,
     NGSKIP,
    real, dimension(*) RLAT,
    real, dimension(*) RLON,
    real, dimension(*) WAVE,
    real, dimension(*) XP,
    real, dimension(*) YP 
    )
    +
    + +

    This subprogram performs a spherical transform from spectral coefficients of scalar fields to specified sets of station point gradients on the globe.

    +

    The wave-space can be either triangular or rhomboidal.

    +

    The wave and point fields may have general indexing, but each wave field is in sequential 'IBM order', i.e. with zonal wavenumber as the slower index.

    +

    The transforms are all multiprocessed over stations.

    +

    Transform several fields at a time to improve vectorization.

    +

    Subprogram can be called from a multiprocessing environment.

    +
    Parameters
    + + + + + + + + + + + + + + +
    IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVspectral truncation
    KMAXnumber of fields to transform.
    NMAXnumber of station points to return
    KWSKIPskip number between wave fields (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
    KGSKIPskip number between station point sets (defaults to NMAX if KGSKIP=0)
    NRSKIPskip number between station lats and lons (defaults to 1 if NRSKIP=0)
    NGSKIPskip number between station points (defaults to 1 if NGSKIP=0)
    RLATstation latitudes in degrees
    RLONstation longitudes in degrees
    WAVEwave fields
    XPstation point x-gradient sets
    YPstation point y-gradient sets
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition at line 48 of file sptgptd.f.

    + +

    References splaplac(), sptgptv(), and spwget().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgptd_8f.js b/ver-5.1.0/sptgptd_8f.js new file mode 100644 index 00000000..437951b8 --- /dev/null +++ b/ver-5.1.0/sptgptd_8f.js @@ -0,0 +1,4 @@ +var sptgptd_8f = +[ + [ "sptgptd", "sptgptd_8f.html#a64d1fe761662182ca3495531152d1cd3", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptgptd_8f_source.html b/ver-5.1.0/sptgptd_8f_source.html new file mode 100644 index 00000000..5d45d7ca --- /dev/null +++ b/ver-5.1.0/sptgptd_8f_source.html @@ -0,0 +1,180 @@ + + + + + + + +NCEPLIBS-ip: sptgptd.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptgptd.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Transform spectral to station point gradients.
    +
    3 C>
    +
    4 C> ### Program History Log
    +
    5 C> Date | Programmer | Comments
    +
    6 C> -----|------------|---------
    +
    7 C> 96-02-29 | Iredell | Initial.
    +
    8 C> 1998-12-15 | Iredell | Openmp directives inserted.
    +
    9 C>
    +
    10 C> @author Iredell @date 96-02-29
    +
    11 
    +
    12 C> This subprogram performs a spherical transform
    +
    13 c> from spectral coefficients of scalar fields
    +
    14 c> to specified sets of station point gradients on the globe.
    +
    15 C>
    +
    16 C> The wave-space can be either triangular or rhomboidal.
    +
    17 C>
    +
    18 C> The wave and point fields may have general indexing,
    +
    19 c> but each wave field is in sequential 'IBM order',
    +
    20 c> i.e. with zonal wavenumber as the slower index.
    +
    21 C>
    +
    22 C> The transforms are all multiprocessed over stations.
    +
    23 C>
    +
    24 C> Transform several fields at a time to improve vectorization.
    +
    25 C>
    +
    26 C> Subprogram can be called from a multiprocessing environment.
    +
    27 C>
    +
    28 C> @param IROMB spectral domain shape
    +
    29 c> (0 for triangular, 1 for rhomboidal)
    +
    30 C> @param MAXWV spectral truncation
    +
    31 C> @param KMAX number of fields to transform.
    +
    32 C> @param NMAX number of station points to return
    +
    33 C> @param KWSKIP skip number between wave fields
    +
    34 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
    +
    35 C> @param KGSKIP skip number between station point sets
    +
    36 C> (defaults to NMAX if KGSKIP=0)
    +
    37 C> @param NRSKIP skip number between station lats and lons
    +
    38 C> (defaults to 1 if NRSKIP=0)
    +
    39 C> @param NGSKIP skip number between station points
    +
    40 c> (defaults to 1 if NGSKIP=0)
    +
    41 C> @param RLAT station latitudes in degrees
    +
    42 C> @param RLON station longitudes in degrees
    +
    43 C> @param WAVE wave fields
    +
    44 C> @param XP station point x-gradient sets
    +
    45 C> @param YP station point y-gradient sets
    +
    46 C>
    +
    47 C> @author Iredell @date 96-02-29
    +
    48  SUBROUTINE sptgptd(IROMB,MAXWV,KMAX,NMAX,
    +
    49  & KWSKIP,KGSKIP,NRSKIP,NGSKIP,
    +
    50  & RLAT,RLON,WAVE,XP,YP)
    +
    51 
    +
    52  REAL RLAT(*),RLON(*),WAVE(*),XP(*),YP(*)
    +
    53  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    54  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    55  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    56  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    57  REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    58  REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    59 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    60 C CALCULATE PRELIMINARY CONSTANTS
    +
    61  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    62  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    63  mdim=2*mx+1
    +
    64  kw=kwskip
    +
    65  IF(kw.EQ.0) kw=2*mx
    +
    66 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    67 C CALCULATE STATION FIELDS
    +
    68 C$OMP PARALLEL DO PRIVATE(KWS)
    +
    69  DO k=1,kmax
    +
    70  kws=(k-1)*kw
    +
    71  CALL splaplac(iromb,maxwv,enn1,wave(kws+1),wd(1,k),1)
    +
    72  wz(1:2*mx,k)=0.
    +
    73  ENDDO
    +
    74  CALL sptgptv(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
    +
    75  & rlat,rlon,wd,wz,xp,yp)
    +
    76 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    77  END
    +
    subroutine splaplac(I, M, ENN1, Q, QD2, IDIR)
    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
    Definition: splaplac.f:25
    +
    subroutine sptgptd(IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVE, XP, YP)
    This subprogram performs a spherical transform from spectral coefficients of scalar fields to specifi...
    Definition: sptgptd.f:51
    +
    subroutine sptgptv(IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVED, WAVEZ, UP, VP)
    This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
    Definition: sptgptv.f:54
    +
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgptsd_8f.html b/ver-5.1.0/sptgptsd_8f.html new file mode 100644 index 00000000..f1b24209 --- /dev/null +++ b/ver-5.1.0/sptgptsd_8f.html @@ -0,0 +1,266 @@ + + + + + + + +NCEPLIBS-ip: sptgptsd.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptgptsd.f File Reference
    +
    +
    + +

    Transform spectral scalar to station points. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptgptsd (IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVE, GP, XP, YP)
     This subprogram performs a spherical transform from spectral coefficients of scalar quantities to specified sets of station point values and their gradients on the globe. More...
     
    +

    Detailed Description

    +

    Transform spectral scalar to station points.

    +
    Author
    Iredell
    +
    Date
    96-02-29
    +

    +Program History Log

    + + + + + + + + + +
    Date Programmer Comments
    96-02-29 Iredell Initial.
    1998-12-15 Iredell Openmp directives inserted.
    1999-08-18 Iredell Openmp directive typo fixed.
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition in file sptgptsd.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptgptsd()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptgptsd ( IROMB,
     MAXWV,
     KMAX,
     NMAX,
     KWSKIP,
     KGSKIP,
     NRSKIP,
     NGSKIP,
    real, dimension(*) RLAT,
    real, dimension(*) RLON,
    real, dimension(*) WAVE,
    real, dimension(*) GP,
    real, dimension(*) XP,
    real, dimension(*) YP 
    )
    +
    + +

    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to specified sets of station point values and their gradients on the globe.

    +

    The wave-space can be either triangular or rhomboidal.

    +

    The wave and point fields may have general indexing, but each wave field is in sequential 'IBM order', i.e. with zonal wavenumber as the slower index.

    +

    The transforms are all multiprocessed over stations.

    +

    Transform several fields at a time to improve vectorization.

    +

    Subprogram can be called from a multiprocessing environment.

    +
    Parameters
    + + + + + + + + + + + + + + + +
    IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVspectral truncation
    KMAXnumber of fields to transform.
    NMAXnumber of station points to return
    KWSKIPskip number between wave fields (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
    KGSKIPskip number between station point sets (defaults to NMAX if KGSKIP=0)
    NRSKIPskip number between station lats and lons (defaults to 1 if NRSKIP=0)
    NGSKIPskip number between station points (defaults to 1 if NGSKIP=0)
    RLATstation latitudes in degrees
    RLONstation longitudes in degrees
    WAVEwave fields
    GPstation point sets
    XPstation point x-gradient sets
    YPstation point y-gradient sets
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition at line 52 of file sptgptsd.f.

    + +

    References spfftpt(), spgradx(), spgrady(), splegend(), spsynth(), and spwget().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgptsd_8f.js b/ver-5.1.0/sptgptsd_8f.js new file mode 100644 index 00000000..ccdb5de0 --- /dev/null +++ b/ver-5.1.0/sptgptsd_8f.js @@ -0,0 +1,4 @@ +var sptgptsd_8f = +[ + [ "sptgptsd", "sptgptsd_8f.html#ad3ab15089a57b493cc74443ea3b3d88f", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptgptsd_8f_source.html b/ver-5.1.0/sptgptsd_8f_source.html new file mode 100644 index 00000000..dc78dd3d --- /dev/null +++ b/ver-5.1.0/sptgptsd_8f_source.html @@ -0,0 +1,236 @@ + + + + + + + +NCEPLIBS-ip: sptgptsd.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptgptsd.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Transform spectral scalar to station points.
    +
    3 C> @author Iredell @date 96-02-29
    +
    4 C>
    +
    5 C> ### Program History Log
    +
    6 C> Date | Programmer | Comments
    +
    7 C> -----|------------|---------
    +
    8 C> 96-02-29 | Iredell | Initial.
    +
    9 C> 1998-12-15 | Iredell | Openmp directives inserted.
    +
    10 C> 1999-08-18 | Iredell | Openmp directive typo fixed.
    +
    11 C>
    +
    12 C> @author Iredell @date 96-02-29
    +
    13 
    +
    14 C> This subprogram performs a spherical transform
    +
    15 C> from spectral coefficients of scalar quantities
    +
    16 C> to specified sets of station point values
    +
    17 C> and their gradients on the globe.
    +
    18 C>
    +
    19 C> The wave-space can be either triangular or rhomboidal.
    +
    20 C>
    +
    21 C> The wave and point fields may have general indexing,
    +
    22 C> but each wave field is in sequential 'IBM order',
    +
    23 C> i.e. with zonal wavenumber as the slower index.
    +
    24 C>
    +
    25 C> The transforms are all multiprocessed over stations.
    +
    26 C>
    +
    27 C> Transform several fields at a time to improve vectorization.
    +
    28 C>
    +
    29 C> Subprogram can be called from a multiprocessing environment.
    +
    30 C>
    +
    31 C> @param IROMB spectral domain shape
    +
    32 C> (0 for triangular, 1 for rhomboidal)
    +
    33 C> @param MAXWV spectral truncation
    +
    34 C> @param KMAX number of fields to transform.
    +
    35 C> @param NMAX number of station points to return
    +
    36 C> @param KWSKIP skip number between wave fields
    +
    37 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
    +
    38 C> @param KGSKIP skip number between station point sets
    +
    39 C> (defaults to NMAX if KGSKIP=0)
    +
    40 C> @param NRSKIP skip number between station lats and lons
    +
    41 C> (defaults to 1 if NRSKIP=0)
    +
    42 C> @param NGSKIP skip number between station points
    +
    43 C> (defaults to 1 if NGSKIP=0)
    +
    44 C> @param RLAT station latitudes in degrees
    +
    45 C> @param RLON station longitudes in degrees
    +
    46 C> @param WAVE wave fields
    +
    47 C> @param GP station point sets
    +
    48 C> @param XP station point x-gradient sets
    +
    49 C> @param YP station point y-gradient sets
    +
    50 C>
    +
    51 C> @author Iredell @date 96-02-29
    +
    52  SUBROUTINE sptgptsd(IROMB,MAXWV,KMAX,NMAX,
    +
    53  & KWSKIP,KGSKIP,NRSKIP,NGSKIP,
    +
    54  & RLAT,RLON,WAVE,GP,XP,YP)
    +
    55 
    +
    56  REAL RLAT(*),RLON(*),WAVE(*)
    +
    57  REAL GP(*),XP(*),YP(*)
    +
    58  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    59  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    60  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    61  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    62  INTEGER MP(2*KMAX)
    +
    63  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2,2*KMAX)
    +
    64  REAL WTOP(2*(MAXWV+1),2*KMAX)
    +
    65  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
    +
    66  REAL F(2*MAXWV+2,2,3*KMAX),G(3*KMAX)
    +
    67  parameter(pi=3.14159265358979)
    +
    68 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    69 C CALCULATE PRELIMINARY CONSTANTS
    +
    70  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    71  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    72  mxtop=maxwv+1
    +
    73  mdim=2*mx
    +
    74  idim=2*maxwv+2
    +
    75  kw=kwskip
    +
    76  kg=kgskip
    +
    77  nr=nrskip
    +
    78  ng=ngskip
    +
    79  IF(kw.EQ.0) kw=2*mx
    +
    80  IF(kg.EQ.0) kg=nmax
    +
    81  IF(nr.EQ.0) nr=1
    +
    82  IF(ng.EQ.0) ng=1
    +
    83  mp(1:kmax)=10
    +
    84  mp(kmax+1:2*kmax)=1
    +
    85 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    86 C CALCULATE SPECTRAL WINDS
    +
    87 C$OMP PARALLEL DO PRIVATE(KWS,KS,KY)
    +
    88  DO k=1,kmax
    +
    89  kws=(k-1)*kw
    +
    90  ks=0*kmax+k
    +
    91  ky=1*kmax+k
    +
    92  DO i=1,2*mx
    +
    93  w(i,ks)=wave(kws+i)
    +
    94  ENDDO
    +
    95  DO i=1,2*mxtop
    +
    96  wtop(i,ks)=0
    +
    97  ENDDO
    +
    98  CALL spgrady(iromb,maxwv,enn1,eon,eontop,
    +
    99  & wave(kws+1),w(1,ky),wtop(1,ky))
    +
    100  ENDDO
    +
    101 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    102 C CALCULATE STATION FIELDS
    +
    103 C$OMP PARALLEL DO PRIVATE(KS,KY,KX,SLAT1,CLAT1)
    +
    104 C$OMP& PRIVATE(PLN,PLNTOP,F,G,NK)
    +
    105  DO n=1,nmax
    +
    106  IF(abs(rlat((n-1)*nr+1)).GE.89.9995) THEN
    +
    107  slat1=sign(1.,rlat((n-1)*nr+1))
    +
    108  clat1=0.
    +
    109  ELSE
    +
    110  slat1=sin(pi/180*rlat((n-1)*nr+1))
    +
    111  clat1=cos(pi/180*rlat((n-1)*nr+1))
    +
    112  ENDIF
    +
    113  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
    +
    114  & pln,plntop)
    +
    115  CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
    +
    116  & clat1,pln,plntop,mp,w,wtop,f)
    +
    117  CALL spgradx(maxwv,idim,kmax,mp,clat1,f(1,1,1),f(1,1,2*kmax+1))
    +
    118  CALL spfftpt(maxwv,1,idim,1,3*kmax,rlon((n-1)*nr+1),f,g)
    +
    119  DO k=1,kmax
    +
    120  ks=0*kmax+k
    +
    121  ky=1*kmax+k
    +
    122  kx=2*kmax+k
    +
    123  nk=(n-1)*ng+(k-1)*kg+1
    +
    124  gp(nk)=g(ks)
    +
    125  xp(nk)=g(kx)
    +
    126  yp(nk)=g(ky)
    +
    127  ENDDO
    +
    128  ENDDO
    +
    129 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    130  END
    +
    subroutine spfftpt(M, N, INCW, INCG, KMAX, RLON, W, G)
    This subprogram computes a slow Fourier transform from Fourier space to a set of gridpoints.
    Definition: spfftpt.f:23
    +
    subroutine spgradx(M, INCW, KMAX, MP, CLAT, W, WX)
    This subprogram computes the x-gradient of fields in complex Fourier space.
    Definition: spgradx.f:38
    +
    subroutine spgrady(I, M, ENN1, EON, EONTOP, Q, QDY, QDYTOP)
    Computes the horizontal vector y-gradient of a scalar field in spectral space.
    Definition: spgrady.f:32
    +
    subroutine splegend(I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
    Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
    Definition: splegend.f:45
    +
    subroutine spsynth(I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
    Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
    Definition: spsynth.f:39
    +
    subroutine sptgptsd(IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVE, GP, XP, YP)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to spe...
    Definition: sptgptsd.f:55
    +
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgptv_8f.html b/ver-5.1.0/sptgptv_8f.html new file mode 100644 index 00000000..ff0ef75b --- /dev/null +++ b/ver-5.1.0/sptgptv_8f.html @@ -0,0 +1,268 @@ + + + + + + + +NCEPLIBS-ip: sptgptv.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptgptv.f File Reference
    +
    +
    + +

    Transform spectral vector to station points. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptgptv (IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVED, WAVEZ, UP, VP)
     This subprogram performs a spherical transform from spectral coefficients of divergences and curls to specified sets of station point vectors on the globe. More...
     
    +

    Detailed Description

    +

    Transform spectral vector to station points.

    +

    +Program History Log

    + + + + + + + + + + + +
    Date Programmer Comments
    96-02-29 IREDELL Initial
    1998-12-15 IREDELL Openmp directives inserted
    1999-08-18 IREDELL Openmp directive typo fixed
    2003-06-30 IREDELL use spfftpt()
    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition in file sptgptv.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptgptv()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptgptv ( IROMB,
     MAXWV,
     KMAX,
     NMAX,
     KWSKIP,
     KGSKIP,
     NRSKIP,
     NGSKIP,
    real, dimension(*) RLAT,
    real, dimension(*) RLON,
    real, dimension(*) WAVED,
    real, dimension(*) WAVEZ,
    real, dimension(*) UP,
    real, dimension(*) VP 
    )
    +
    + +

    This subprogram performs a spherical transform from spectral coefficients of divergences and curls to specified sets of station point vectors on the globe.

    +

    The wave-space can be either triangular or rhomboidal.

    +

    The wave and point fields may have general indexing, but each wave field is in sequential 'IBM order', i.e. with zonal wavenumber as the slower index.

    +

    The transforms are all multiprocessed over stations.

    +

    Transform several fields at a time to improve vectorization.

    +

    Subprogram can be called from a multiprocessing environment.

    +
    Parameters
    + + + + + + + + + + + + + + + +
    IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVspectral truncation
    KMAXnumber of fields to transform.
    NMAXnumber of station points to return
    KWSKIPskip number between wave fields (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0)
    KGSKIPskip number between station point sets (defaults to NMAX IF KGSKIP=0)
    NRSKIPskip number between station lats and lons (defaults to 1 if NRSKIP=0)
    NGSKIPskip number between station points (defaults to 1 if NGSKIP=0)
    RLATstation latitudes in degrees
    RLONstation longitudes in degrees
    WAVEDwave divergence fields
    WAVEZwave vorticity fields
    UPstation point u-wind sets
    VPstation point v-wind sets
    +
    +
    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition at line 51 of file sptgptv.f.

    + +

    References spdz2uv(), spfftpt(), splegend(), spsynth(), and spwget().

    + +

    Referenced by sptgptd(), and sptrungv().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgptv_8f.js b/ver-5.1.0/sptgptv_8f.js new file mode 100644 index 00000000..59a8e5b1 --- /dev/null +++ b/ver-5.1.0/sptgptv_8f.js @@ -0,0 +1,4 @@ +var sptgptv_8f = +[ + [ "sptgptv", "sptgptv_8f.html#a9af8a22564d132a887a5237f30710f13", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptgptv_8f_source.html b/ver-5.1.0/sptgptv_8f_source.html new file mode 100644 index 00000000..fb9575ed --- /dev/null +++ b/ver-5.1.0/sptgptv_8f_source.html @@ -0,0 +1,227 @@ + + + + + + + +NCEPLIBS-ip: sptgptv.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptgptv.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Transform spectral vector to station points.
    +
    3 C>
    +
    4 C> ### Program History Log
    +
    5 C> Date | Programmer | Comments
    +
    6 C> -----|------------|---------
    +
    7 C> 96-02-29 | IREDELL | Initial
    +
    8 C> 1998-12-15 | IREDELL | Openmp directives inserted
    +
    9 C> 1999-08-18 | IREDELL | Openmp directive typo fixed
    +
    10 C> 2003-06-30 | IREDELL | use spfftpt()
    +
    11 C>
    +
    12 C> @author IREDELL @date 96-02-29
    +
    13 
    +
    14 C> This subprogram performs a spherical transform
    +
    15 C> from spectral coefficients of divergences and curls
    +
    16 C> to specified sets of station point vectors on the globe.
    +
    17 C>
    +
    18 C> The wave-space can be either triangular or rhomboidal.
    +
    19 C>
    +
    20 C> The wave and point fields may have general indexing,
    +
    21 C> but each wave field is in sequential 'IBM order',
    +
    22 C> i.e. with zonal wavenumber as the slower index.
    +
    23 C>
    +
    24 C> The transforms are all multiprocessed over stations.
    +
    25 C>
    +
    26 C> Transform several fields at a time to improve vectorization.
    +
    27 C>
    +
    28 C> Subprogram can be called from a multiprocessing environment.
    +
    29 C>
    +
    30 C> @param IROMB spectral domain shape
    +
    31 c> (0 for triangular, 1 for rhomboidal)
    +
    32 C> @param MAXWV spectral truncation
    +
    33 C> @param KMAX number of fields to transform.
    +
    34 C> @param NMAX number of station points to return
    +
    35 C> @param KWSKIP skip number between wave fields
    +
    36 c> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0)
    +
    37 C> @param KGSKIP skip number between station point sets
    +
    38 c> (defaults to NMAX IF KGSKIP=0)
    +
    39 C> @param NRSKIP skip number between station lats and lons
    +
    40 c> (defaults to 1 if NRSKIP=0)
    +
    41 C> @param NGSKIP skip number between station points
    +
    42 c> (defaults to 1 if NGSKIP=0)
    +
    43 C> @param RLAT station latitudes in degrees
    +
    44 C> @param RLON station longitudes in degrees
    +
    45 C> @param WAVED wave divergence fields
    +
    46 C> @param WAVEZ wave vorticity fields
    +
    47 C> @param UP station point u-wind sets
    +
    48 C> @param VP station point v-wind sets
    +
    49 C>
    +
    50 C> @author IREDELL @date 96-02-29
    +
    51  SUBROUTINE sptgptv(IROMB,MAXWV,KMAX,NMAX,
    +
    52  & KWSKIP,KGSKIP,NRSKIP,NGSKIP,
    +
    53  & RLAT,RLON,WAVED,WAVEZ,UP,VP)
    +
    54 
    +
    55  REAL RLAT(*),RLON(*),WAVED(*),WAVEZ(*),UP(*),VP(*)
    +
    56  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    57  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    58  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    59  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    60  INTEGER MP(2*KMAX)
    +
    61  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,2*KMAX)
    +
    62  REAL WTOP(2*(MAXWV+1),2*KMAX)
    +
    63  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
    +
    64  REAL F(2*MAXWV+3,2,2*KMAX)
    +
    65  REAL G(2*KMAX)
    +
    66  parameter(pi=3.14159265358979)
    +
    67 
    +
    68 C CALCULATE PRELIMINARY CONSTANTS
    +
    69  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    70  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    71  mxtop=maxwv+1
    +
    72  mdim=2*mx+1
    +
    73  idim=2*maxwv+3
    +
    74  kw=kwskip
    +
    75  kg=kgskip
    +
    76  nr=nrskip
    +
    77  ng=ngskip
    +
    78  IF(kw.EQ.0) kw=2*mx
    +
    79  IF(kg.EQ.0) kg=nmax
    +
    80  IF(nr.EQ.0) nr=1
    +
    81  IF(ng.EQ.0) ng=1
    +
    82  mp=1
    +
    83 
    +
    84 C CALCULATE SPECTRAL WINDS
    +
    85 C$OMP PARALLEL DO PRIVATE(KWS)
    +
    86  DO k=1,kmax
    +
    87  kws=(k-1)*kw
    +
    88  CALL spdz2uv(iromb,maxwv,enn1,elonn1,eon,eontop,
    +
    89  & waved(kws+1),wavez(kws+1),
    +
    90  & w(1,k),w(1,kmax+k),wtop(1,k),wtop(1,kmax+k))
    +
    91  ENDDO
    +
    92 
    +
    93 C CALCULATE STATION FIELDS
    +
    94 C$OMP PARALLEL DO PRIVATE(KU,KV,RADLAT,SLAT1,CLAT1)
    +
    95 C$OMP& PRIVATE(PLN,PLNTOP,F,G,NK)
    +
    96  DO n=1,nmax
    +
    97  radlat=pi/180*rlat((n-1)*nr+1)
    +
    98  IF(rlat((n-1)*nr+1).GE.89.9995) THEN
    +
    99  slat1=1.
    +
    100  clat1=0.
    +
    101  ELSEIF(rlat((n-1)*nr+1).LE.-89.9995) THEN
    +
    102  slat1=-1.
    +
    103  clat1=0.
    +
    104  ELSE
    +
    105  slat1=sin(radlat)
    +
    106  clat1=cos(radlat)
    +
    107  ENDIF
    +
    108  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
    +
    109  & pln,plntop)
    +
    110  CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,2*kmax,
    +
    111  & clat1,pln,plntop,mp,w,wtop,f)
    +
    112  CALL spfftpt(maxwv,1,2*maxwv+3,1,2*kmax,rlon((n-1)*nr+1),f,g)
    +
    113  DO k=1,kmax
    +
    114  ku=k
    +
    115  kv=k+kmax
    +
    116  nk=(n-1)*ng+(k-1)*kg+1
    +
    117  up(nk)=g(ku)
    +
    118  vp(nk)=g(kv)
    +
    119  ENDDO
    +
    120  ENDDO
    +
    121 
    +
    122  END
    +
    subroutine spdz2uv(I, M, ENN1, ELONN1, EON, EONTOP, D, Z, U, V, UTOP, VTOP)
    Computes the wind components from divergence and vorticity in spectral space.
    Definition: spdz2uv.f:49
    +
    subroutine spfftpt(M, N, INCW, INCG, KMAX, RLON, W, G)
    This subprogram computes a slow Fourier transform from Fourier space to a set of gridpoints.
    Definition: spfftpt.f:23
    +
    subroutine splegend(I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
    Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
    Definition: splegend.f:45
    +
    subroutine spsynth(I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
    Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
    Definition: spsynth.f:39
    +
    subroutine sptgptv(IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVED, WAVEZ, UP, VP)
    This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
    Definition: sptgptv.f:54
    +
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgptvd_8f.html b/ver-5.1.0/sptgptvd_8f.html new file mode 100644 index 00000000..6fb47a35 --- /dev/null +++ b/ver-5.1.0/sptgptvd_8f.html @@ -0,0 +1,313 @@ + + + + + + + +NCEPLIBS-ip: sptgptvd.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptgptvd.f File Reference
    +
    +
    + +

    Transform spectral vector to station points. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptgptvd (IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVED, WAVEZ, DP, ZP, UP, VP, UXP, VXP, UYP, VYP)
     This subprogram performs a spherical transform from spectral coefficients of divergences and curls to specified sets of station point vectors and their gradients on the globe. More...
     
    +

    Detailed Description

    +

    Transform spectral vector to station points.

    +

    +Program History Log

    + + + + + + + + + +
    Date Programmer Comments
    96-02-29 Iredell Initial.
    1998-12-15 Iredell Openmp directives inserted.
    1999-08-18 Iredell Openmp directive typo fixed.
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition in file sptgptvd.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptgptvd()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptgptvd ( IROMB,
     MAXWV,
     KMAX,
     NMAX,
     KWSKIP,
     KGSKIP,
     NRSKIP,
     NGSKIP,
    real, dimension(*) RLAT,
    real, dimension(*) RLON,
    real, dimension(*) WAVED,
    real, dimension(*) WAVEZ,
    real, dimension(*) DP,
    real, dimension(*) ZP,
    real, dimension(*) UP,
    real, dimension(*) VP,
    real, dimension(*) UXP,
    real, dimension(*) VXP,
    real, dimension(*) UYP,
    real, dimension(*) VYP 
    )
    +
    + +

    This subprogram performs a spherical transform from spectral coefficients of divergences and curls to specified sets of station point vectors and their gradients on the globe.

    +
    + DP=(D(UP)/DLON+D(VP*CLAT)/DLAT)/(R*CLAT)
    + ZP=(D(VP)/DLON-D(UP*CLAT)/DLAT)/(R*CLAT)
    + UXP=D(UP*CLAT)/DLON/(R*CLAT)
    + VXP=D(VP*CLAT)/DLON/(R*CLAT)
    + UYP=D(UP*CLAT)/DLAT/R
    + VYP=D(VP*CLAT)/DLAT/R
    + 

    The wave-space can be either triangular or rhomboidal.

    +

    The wave and point fields may have general indexing, but each wave field is in sequential 'IBM order', i.e. with zonal wavenumber as the slower index.

    +

    The transforms are all multiprocessed over stations.

    +

    Transform several fields at a time to improve vectorization.

    +

    Subprogram can be called from a multiprocessing environment.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + +
    IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVspectral truncation
    KMAXnumber of fields to transform.
    NMAXnumber of station points to return
    KWSKIPskip number between wave fields (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0)
    KGSKIPskip number between station point sets (defaults to NMAX if KGSKIP=0)
    NRSKIPskip number between station lats and lons (defaults to 1 if NRSKIP=0)
    NGSKIPskip number between station points (defaults to 1 if NGSKIP=0)
    RLATstation latitudes in degrees
    RLONstation longitudes in degrees
    WAVEDwave divergence fields
    WAVEZwave vorticity fields
    DPstation point divergence sets
    ZPstation point vorticity sets
    UPstation point u-wind sets
    VPstation point v-wind sets
    UXPstation point u-wind x-gradient sets
    VXPstation point v-wind x-gradient sets
    UYPstation point u-wind y-gradient sets
    VYPstation point v-wind y-gradient sets
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition at line 66 of file sptgptvd.f.

    + +

    References spdz2uv(), spfftpt(), spgradx(), splegend(), spsynth(), and spwget().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptgptvd_8f.js b/ver-5.1.0/sptgptvd_8f.js new file mode 100644 index 00000000..9a2bc046 --- /dev/null +++ b/ver-5.1.0/sptgptvd_8f.js @@ -0,0 +1,4 @@ +var sptgptvd_8f = +[ + [ "sptgptvd", "sptgptvd_8f.html#ae03c6c76cad685ae1ed32d74bcba6753", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptgptvd_8f_source.html b/ver-5.1.0/sptgptvd_8f_source.html new file mode 100644 index 00000000..53aeaf77 --- /dev/null +++ b/ver-5.1.0/sptgptvd_8f_source.html @@ -0,0 +1,266 @@ + + + + + + + +NCEPLIBS-ip: sptgptvd.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptgptvd.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Transform spectral vector to station points.
    +
    3 C>
    +
    4 C> ### Program History Log
    +
    5 C> Date | Programmer | Comments
    +
    6 C> -----|------------|---------
    +
    7 C> 96-02-29 | Iredell | Initial.
    +
    8 C> 1998-12-15 | Iredell | Openmp directives inserted.
    +
    9 C> 1999-08-18 | Iredell | Openmp directive typo fixed.
    +
    10 C>
    +
    11 C> @author Iredell @date 96-02-29
    +
    12 
    +
    13 C> This subprogram performs a spherical transform
    +
    14 C> from spectral coefficients of divergences and curls
    +
    15 C> to specified sets of station point vectors and their
    +
    16 C> gradients on the globe.
    +
    17 C>
    +
    18 C> <pre>
    +
    19 C> DP=(D(UP)/DLON+D(VP*CLAT)/DLAT)/(R*CLAT)
    +
    20 C> ZP=(D(VP)/DLON-D(UP*CLAT)/DLAT)/(R*CLAT)
    +
    21 C> UXP=D(UP*CLAT)/DLON/(R*CLAT)
    +
    22 C> VXP=D(VP*CLAT)/DLON/(R*CLAT)
    +
    23 C> UYP=D(UP*CLAT)/DLAT/R
    +
    24 C> VYP=D(VP*CLAT)/DLAT/R
    +
    25 C> </pre>
    +
    26 C>
    +
    27 C> The wave-space can be either triangular or rhomboidal.
    +
    28 C>
    +
    29 C> The wave and point fields may have general indexing,
    +
    30 C> but each wave field is in sequential 'IBM order',
    +
    31 C> i.e. with zonal wavenumber as the slower index.
    +
    32 C>
    +
    33 C> The transforms are all multiprocessed over stations.
    +
    34 C>
    +
    35 C> Transform several fields at a time to improve vectorization.
    +
    36 C>
    +
    37 C> Subprogram can be called from a multiprocessing environment.
    +
    38 C>
    +
    39 C> @param IROMB spectral domain shape
    +
    40 C> (0 for triangular, 1 for rhomboidal)
    +
    41 C> @param MAXWV spectral truncation
    +
    42 C> @param KMAX number of fields to transform.
    +
    43 C> @param NMAX number of station points to return
    +
    44 C> @param KWSKIP skip number between wave fields
    +
    45 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0)
    +
    46 C> @param KGSKIP skip number between station point sets
    +
    47 C> (defaults to NMAX if KGSKIP=0)
    +
    48 C> @param NRSKIP skip number between station lats and lons
    +
    49 C> (defaults to 1 if NRSKIP=0)
    +
    50 C> @param NGSKIP skip number between station points
    +
    51 C> (defaults to 1 if NGSKIP=0)
    +
    52 C> @param RLAT station latitudes in degrees
    +
    53 C> @param RLON station longitudes in degrees
    +
    54 C> @param WAVED wave divergence fields
    +
    55 C> @param WAVEZ wave vorticity fields
    +
    56 C> @param DP station point divergence sets
    +
    57 C> @param ZP station point vorticity sets
    +
    58 C> @param UP station point u-wind sets
    +
    59 C> @param VP station point v-wind sets
    +
    60 C> @param UXP station point u-wind x-gradient sets
    +
    61 C> @param VXP station point v-wind x-gradient sets
    +
    62 C> @param UYP station point u-wind y-gradient sets
    +
    63 C> @param VYP station point v-wind y-gradient sets
    +
    64 C>
    +
    65 C> @author Iredell @date 96-02-29
    +
    66  SUBROUTINE sptgptvd(IROMB,MAXWV,KMAX,NMAX,
    +
    67  & KWSKIP,KGSKIP,NRSKIP,NGSKIP,
    +
    68  & RLAT,RLON,WAVED,WAVEZ,
    +
    69  & DP,ZP,UP,VP,UXP,VXP,UYP,VYP)
    +
    70 
    +
    71  REAL RLAT(*),RLON(*),WAVED(*),WAVEZ(*)
    +
    72  REAL DP(*),ZP(*),UP(*),VP(*),UXP(*),VXP(*),UYP(*),VYP(*)
    +
    73  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    74  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    75  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    76  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    77  INTEGER MP(4*KMAX)
    +
    78  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2,4*KMAX)
    +
    79  REAL WTOP(2*(MAXWV+1),4*KMAX)
    +
    80  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1)
    +
    81  REAL F(2*MAXWV+2,2,6*KMAX),G(6*KMAX)
    +
    82  parameter(pi=3.14159265358979)
    +
    83 
    +
    84 C CALCULATE PRELIMINARY CONSTANTS
    +
    85  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    86  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    87  mxtop=maxwv+1
    +
    88  mdim=2*mx
    +
    89  idim=2*maxwv+2
    +
    90  kw=kwskip
    +
    91  kg=kgskip
    +
    92  nr=nrskip
    +
    93  ng=ngskip
    +
    94  IF(kw.EQ.0) kw=2*mx
    +
    95  IF(kg.EQ.0) kg=nmax
    +
    96  IF(nr.EQ.0) nr=1
    +
    97  IF(ng.EQ.0) ng=1
    +
    98  mp(1:2*kmax)=0
    +
    99  mp(2*kmax+1:4*kmax)=1
    +
    100 
    +
    101 C CALCULATE SPECTRAL WINDS
    +
    102 C$OMP PARALLEL DO PRIVATE(KWS,KD,KZ,KU,KV)
    +
    103  DO k=1,kmax
    +
    104  kws=(k-1)*kw
    +
    105  kd=0*kmax+k
    +
    106  kz=1*kmax+k
    +
    107  ku=2*kmax+k
    +
    108  kv=3*kmax+k
    +
    109  DO i=1,2*mx
    +
    110  w(i,kd)=waved(kws+i)
    +
    111  w(i,kz)=wavez(kws+i)
    +
    112  ENDDO
    +
    113  DO i=1,2*mxtop
    +
    114  wtop(i,kd)=0
    +
    115  wtop(i,kz)=0
    +
    116  ENDDO
    +
    117  CALL spdz2uv(iromb,maxwv,enn1,elonn1,eon,eontop,
    +
    118  & waved(kws+1),wavez(kws+1),
    +
    119  & w(1,ku),w(1,kv),wtop(1,ku),wtop(1,kv))
    +
    120  ENDDO
    +
    121 
    +
    122 C CALCULATE STATION FIELDS
    +
    123 C$OMP PARALLEL DO PRIVATE(KD,KZ,KU,KV,KUX,KVX,SLAT1,CLAT1)
    +
    124 C$OMP& PRIVATE(PLN,PLNTOP,F,G,NK)
    +
    125  DO n=1,nmax
    +
    126  ku=2*kmax+1
    +
    127  kux=4*kmax+1
    +
    128  IF(abs(rlat((n-1)*nr+1)).GE.89.9995) THEN
    +
    129  slat1=sign(1.,rlat((n-1)*nr+1))
    +
    130  clat1=0.
    +
    131  ELSE
    +
    132  slat1=sin(pi/180*rlat((n-1)*nr+1))
    +
    133  clat1=cos(pi/180*rlat((n-1)*nr+1))
    +
    134  ENDIF
    +
    135  CALL splegend(iromb,maxwv,slat1,clat1,eps,epstop,
    +
    136  & pln,plntop)
    +
    137  CALL spsynth(iromb,maxwv,2*maxwv,idim,mdim,2*mxtop,4*kmax,
    +
    138  & clat1,pln,plntop,mp,w,wtop,f)
    +
    139  CALL spgradx(maxwv,idim,2*kmax,mp(2*kmax+1),clat1,
    +
    140  & f(1,1,2*kmax+1),f(1,1,4*kmax+1))
    +
    141  CALL spfftpt(maxwv,1,idim,1,6*kmax,rlon((n-1)*nr+1),f,g)
    +
    142  DO k=1,kmax
    +
    143  kd=0*kmax+k
    +
    144  kz=1*kmax+k
    +
    145  ku=2*kmax+k
    +
    146  kv=3*kmax+k
    +
    147  kux=4*kmax+k
    +
    148  kvx=5*kmax+k
    +
    149  nk=(n-1)*ng+(k-1)*kg+1
    +
    150  dp(nk)=g(kd)
    +
    151  zp(nk)=g(kz)
    +
    152  up(nk)=g(ku)
    +
    153  vp(nk)=g(kv)
    +
    154  uxp(nk)=g(kux)
    +
    155  vxp(nk)=g(kvx)
    +
    156  uyp(nk)=g(kvx)-clat1*g(kz)
    +
    157  vyp(nk)=clat1*g(kd)-g(kux)
    +
    158  ENDDO
    +
    159  ENDDO
    +
    160  END
    +
    subroutine spdz2uv(I, M, ENN1, ELONN1, EON, EONTOP, D, Z, U, V, UTOP, VTOP)
    Computes the wind components from divergence and vorticity in spectral space.
    Definition: spdz2uv.f:49
    +
    subroutine spfftpt(M, N, INCW, INCG, KMAX, RLON, W, G)
    This subprogram computes a slow Fourier transform from Fourier space to a set of gridpoints.
    Definition: spfftpt.f:23
    +
    subroutine spgradx(M, INCW, KMAX, MP, CLAT, W, WX)
    This subprogram computes the x-gradient of fields in complex Fourier space.
    Definition: spgradx.f:38
    +
    subroutine splegend(I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
    Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
    Definition: splegend.f:45
    +
    subroutine spsynth(I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
    Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
    Definition: spsynth.f:39
    +
    subroutine sptgptvd(IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVED, WAVEZ, DP, ZP, UP, VP, UXP, VXP, UYP, VYP)
    This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
    Definition: sptgptvd.f:70
    +
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +
    +
    + + + + diff --git a/ver-5.1.0/sptran_8f.html b/ver-5.1.0/sptran_8f.html new file mode 100644 index 00000000..9fb66fbb --- /dev/null +++ b/ver-5.1.0/sptran_8f.html @@ -0,0 +1,323 @@ + + + + + + + +NCEPLIBS-ip: sptran.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptran.f File Reference
    +
    +
    + +

    Perform a scalar spherical transform. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptran (IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDN, GRIDS, IDIR)
     This subprogram performs a spherical transform between spectral coefficients of scalar quantities and fields on a global cylindrical grid. More...
     
    +

    Detailed Description

    +

    Perform a scalar spherical transform.

    +

    +Program History Log

    + + + + + + + +
    Date Programmer Comments
    96-02-29 IREDELL Initial
    1998-12-15 IREDELL Generic fft used, openmp directives inserted
    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition in file sptran.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptran()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptran ( IROMB,
     MAXWV,
     IDRT,
     IMAX,
     JMAX,
     KMAX,
     IPRIME,
     ISKIP,
     JNSKIP,
     JSSKIP,
     KWSKIP,
     KGSKIP,
     JBEG,
     JEND,
     JCPU,
    real, dimension(*) WAVE,
    real, dimension(*) GRIDN,
    real, dimension(*) GRIDS,
     IDIR 
    )
    +
    + +

    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and fields on a global cylindrical grid.

    +

    The wave-space can be either triangular or rhomboidal.

    +

    The grid-space can be either an equally-spaced grid (with or without pole points) or a Gaussian grid.

    +

    The wave and grid fields may have general indexing, but each wave field is in sequential 'IBM order', i.e. with zonal wavenumber as the slower index.

    +

    Transforms are done in latitude pairs for efficiency; thus grid arrays for each hemisphere must be passed. If so requested, just a subset of the latitude pairs may be transformed in each invocation of the subprogram.

    +

    The transforms are all multiprocessed over latitude except the transform from Fourier to spectral is multiprocessed over zonal wavenumber to ensure reproducibility.

    +

    Transform several fields at a time to improve vectorization. Subprogram can be called from a multiprocessing environment.

    +

    Minimum grid dimensions for unaliased transforms to spectral:

    + + + + + + + + + + + + + + + + +
    DIMENSION LINEAR QUADRATIC
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + +
    IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVspectral truncation
    IDRTgrid identifier
      +
    • IDRT=4 for Gaussian grid,
    • +
    • IDRT=0 for equally-spaced grid including poles,
    • +
    • IDRT=256 for equally-spaced grid excluding poles
    • +
    +
    IMAXeven number of longitudes.
    JMAXnumber of latitudes.
    KMAXnumber of fields to transform.
    IPRIMElongitude index for the prime meridian. (defaults to 1 if IPRIME=0)
    ISKIPskip number between longitudes (defaults to 1 if ISKIP=0)
    JNSKIPskip number between n.h. latitudes from north (defaults to imax if JNSKIP=0)
    JSSKIPskip number between s.h. latitudes from south (defaults to -imax if JSSKIP=0)
    KWSKIPskip number between wave fields (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0)
    KGSKIPskip number between grid fields (defaults to IMAX*JMAX IF KGSKIP=0)
    JBEGlatitude index (from pole) to begin transform (defaults to 1 if JBEG=0) (if JBEG=0 and IDIR<0, wave is zeroed before transform)
    JENDlatitude index (from pole) to end transform (defaults to (JMAX+1)/2 IF JEND=0)
    JCPUnumber of cpus over which to multiprocess
    [out]WAVEwave fields if IDIR>0
    [out]gridnn.h. grid fields (starting at jbeg) if IDIR<0
    [out]gridss.h. grid fields (starting at jbeg) if IDIR<0
    IDIRtransform flag (idir>0 for wave to grid, idir<0 for grid to wave)
    +
    +
    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition at line 84 of file sptran.f.

    + +

    References ncpus(), and sptranf().

    + +

    Referenced by sptrun(), sptrund(), sptrung(), sptrunl(), sptrunm(), sptruns(), and sptrunv().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptran_8f.js b/ver-5.1.0/sptran_8f.js new file mode 100644 index 00000000..ec95a0ac --- /dev/null +++ b/ver-5.1.0/sptran_8f.js @@ -0,0 +1,4 @@ +var sptran_8f = +[ + [ "sptran", "sptran_8f.html#af7610e42f0dcd199b8cf80f851dcfed0", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptran_8f_source.html b/ver-5.1.0/sptran_8f_source.html new file mode 100644 index 00000000..88dedaa8 --- /dev/null +++ b/ver-5.1.0/sptran_8f_source.html @@ -0,0 +1,224 @@ + + + + + + + +NCEPLIBS-ip: sptran.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptran.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Perform a scalar spherical transform.
    +
    3 C>
    +
    4 C> ### Program History Log
    +
    5 C> Date | Programmer | Comments
    +
    6 C> -----|------------|---------
    +
    7 C> 96-02-29 | IREDELL | Initial
    +
    8 C> 1998-12-15 | IREDELL | Generic fft used, openmp directives inserted
    +
    9 C>
    +
    10 C> @author IREDELL @date 96-02-29
    +
    11 
    +
    12 C> This subprogram performs a spherical transform between spectral
    +
    13 C> coefficients of scalar quantities and fields on a global
    +
    14 C> cylindrical grid.
    +
    15 C>
    +
    16 C> The wave-space can be either triangular or
    +
    17 C> rhomboidal.
    +
    18 C>
    +
    19 C> The grid-space can be either an equally-spaced grid
    +
    20 C> (with or without pole points) or a Gaussian grid.
    +
    21 C>
    +
    22 C> The wave and grid fields may have general indexing,
    +
    23 C> but each wave field is in sequential 'IBM order',
    +
    24 C> i.e. with zonal wavenumber as the slower index.
    +
    25 C>
    +
    26 C> Transforms are done in latitude pairs for efficiency;
    +
    27 C> thus grid arrays for each hemisphere must be passed.
    +
    28 C> If so requested, just a subset of the latitude pairs
    +
    29 C> may be transformed in each invocation of the subprogram.
    +
    30 C>
    +
    31 C> The transforms are all multiprocessed over latitude except
    +
    32 C> the transform from Fourier to spectral is multiprocessed
    +
    33 C> over zonal wavenumber to ensure reproducibility.
    +
    34 C>
    +
    35 C> Transform several fields at a time to improve vectorization.
    +
    36 C> Subprogram can be called from a multiprocessing environment.
    +
    37 C>
    +
    38 C> Minimum grid dimensions for unaliased transforms to spectral:
    +
    39 C> DIMENSION |LINEAR |QUADRATIC
    +
    40 C> ----------------------- |--------- |-------------
    +
    41 C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2
    +
    42 C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1
    +
    43 C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1
    +
    44 C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3
    +
    45 C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3
    +
    46 C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1
    +
    47 C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1
    +
    48 C>
    +
    49 C> @param IROMB spectral domain shape
    +
    50 c> (0 for triangular, 1 for rhomboidal)
    +
    51 C> @param MAXWV spectral truncation
    +
    52 C> @param IDRT grid identifier
    +
    53 C> - IDRT=4 for Gaussian grid,
    +
    54 C> - IDRT=0 for equally-spaced grid including poles,
    +
    55 C> - IDRT=256 for equally-spaced grid excluding poles
    +
    56 C> @param IMAX even number of longitudes.
    +
    57 C> @param JMAX number of latitudes.
    +
    58 C> @param KMAX number of fields to transform.
    +
    59 C> @param IPRIME longitude index for the prime meridian.
    +
    60 C> (defaults to 1 if IPRIME=0)
    +
    61 C> @param ISKIP skip number between longitudes
    +
    62 C> (defaults to 1 if ISKIP=0)
    +
    63 C> @param JNSKIP skip number between n.h. latitudes from north
    +
    64 C> (defaults to imax if JNSKIP=0)
    +
    65 C> @param JSSKIP skip number between s.h. latitudes from south
    +
    66 c> (defaults to -imax if JSSKIP=0)
    +
    67 C> @param KWSKIP skip number between wave fields
    +
    68 c> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0)
    +
    69 C> @param KGSKIP skip number between grid fields
    +
    70 c> (defaults to IMAX*JMAX IF KGSKIP=0)
    +
    71 C> @param JBEG latitude index (from pole) to begin transform
    +
    72 c> (defaults to 1 if JBEG=0)
    +
    73 C> (if JBEG=0 and IDIR<0, wave is zeroed before transform)
    +
    74 C> @param JEND latitude index (from pole) to end transform
    +
    75 c> (defaults to (JMAX+1)/2 IF JEND=0)
    +
    76 C> @param JCPU number of cpus over which to multiprocess
    +
    77 C> @param[out] WAVE wave fields if IDIR>0
    +
    78 C> @param[out] gridn n.h. grid fields (starting at jbeg) if IDIR<0
    +
    79 C> @param[out] grids s.h. grid fields (starting at jbeg) if IDIR<0
    +
    80 C> @param IDIR transform flag
    +
    81 C> (idir>0 for wave to grid, idir<0 for grid to wave)
    +
    82 C>
    +
    83 C> @author IREDELL @date 96-02-29
    +
    84  SUBROUTINE sptran(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
    +
    85  & IPRIME,ISKIP,JNSKIP,JSSKIP,KWSKIP,KGSKIP,
    +
    86  & JBEG,JEND,JCPU,
    +
    87  & WAVE,GRIDN,GRIDS,IDIR)
    +
    88 
    +
    89  REAL WAVE(*),GRIDN(*),GRIDS(*)
    +
    90 
    +
    91  MX=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    92  ip=iprime
    +
    93  is=iskip
    +
    94  jn=jnskip
    +
    95  js=jsskip
    +
    96  kw=kwskip
    +
    97  kg=kgskip
    +
    98  jb=jbeg
    +
    99  je=jend
    +
    100  jc=jcpu
    +
    101  IF(ip.EQ.0) ip=1
    +
    102  IF(is.EQ.0) is=1
    +
    103  IF(jn.EQ.0) jn=imax
    +
    104  IF(js.EQ.0) js=-jn
    +
    105  IF(kw.EQ.0) kw=2*mx
    +
    106  IF(kg.EQ.0) kg=imax*jmax
    +
    107  IF(jb.EQ.0) jb=1
    +
    108  IF(je.EQ.0) je=(jmax+1)/2
    +
    109  IF(jc.EQ.0) jc=ncpus()
    +
    110 
    +
    111  IF(idir.LT.0.AND.jbeg.EQ.0) THEN
    +
    112  DO k=1,kmax
    +
    113  kws=(k-1)*kw
    +
    114  wave(kws+1:kws+2*mx)=0
    +
    115  ENDDO
    +
    116  ENDIF
    +
    117 
    +
    118  CALL sptranf(iromb,maxwv,idrt,imax,jmax,kmax,
    +
    119  & ip,is,jn,js,kw,kg,jb,je,jc,
    +
    120  & wave,gridn,grids,idir)
    +
    121 
    +
    122  END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    +
    subroutine sptran(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDN, GRIDS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition: sptran.f:88
    +
    subroutine sptranf(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IP, IS, JN, JS, KW, KG, JB, JE, JC, WAVE, GRIDN, GRIDS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition: sptranf.f:77
    +
    +
    + + + + diff --git a/ver-5.1.0/sptrand_8f.html b/ver-5.1.0/sptrand_8f.html new file mode 100644 index 00000000..d4338b9d --- /dev/null +++ b/ver-5.1.0/sptrand_8f.html @@ -0,0 +1,346 @@ + + + + + + + +NCEPLIBS-ip: sptrand.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptrand.f File Reference
    +
    +
    + +

    Perform a gradient spherical transform. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptrand (IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDMN, GRIDXN, GRIDXS, GRIDYN, GRIDYS, IDIR)
     This subprogram performs a spherical transform between spectral coefficients of scalar fields and their means and gradients on a global cylindrical grid. More...
     
    +

    Detailed Description

    +

    Perform a gradient spherical transform.

    +

    +Program History Log

    + + + + + + + +
    Date Programmer Comments
    96-02-29 IREDELL Initial
    1998-12-15 IREDELL openmp directives inserted
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition in file sptrand.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptrand()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptrand ( IROMB,
     MAXWV,
     IDRT,
     IMAX,
     JMAX,
     KMAX,
     IPRIME,
     ISKIP,
     JNSKIP,
     JSSKIP,
     KWSKIP,
     KGSKIP,
     JBEG,
     JEND,
     JCPU,
    real, dimension(*) WAVE,
    real, dimension(kmax) GRIDMN,
    real, dimension(*) GRIDXN,
    real, dimension(*) GRIDXS,
    real, dimension(*) GRIDYN,
    real, dimension(*) GRIDYS,
     IDIR 
    )
    +
    + +

    This subprogram performs a spherical transform between spectral coefficients of scalar fields and their means and gradients on a global cylindrical grid.

    +

    The wave-space can be either triangular or rhomboidal.

    +

    The grid-space can be either an equally-spaced grid (with or without pole points) or a Gaussian grid.

    +

    The wave and grid fields may have general indexing, but each wave field is in sequential 'IBM order', i.e. with zonal wavenumber as the slower index.

    +

    Transforms are done in latitude pairs for efficiency; thus grid arrays for each hemisphere must be passed. if so requested, just a subset of the latitude pairs may be transformed in each invocation of the subprogram.

    +

    The transforms are all multiprocessed over latitude except the transform from Fourier to spectral is multiprocessed over zonal wavenumber to ensure reproducibility.

    +

    Transform several fields at a time to improve vectorization.

    +

    Subprogram can be called from a multiprocessing environment.

    +

    Minimum grid dimensions for unaliased transforms to spectral:

    + + + + + + + + + + + + + + + + +
    DIMENSION LINEAR QUADRATIC
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + + +
    IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVspectral truncation
    IDRTgrid identifier
      +
    • IDRT=4 for Gaussian grid
    • +
    • IDRT=0 for equally-spaced grid including poles
    • +
    • IDRT=256 for equally-spaced grid excluding poles
    • +
    +
    IMAXeven number of longitudes.
    JMAXnumber of latitudes.
    KMAXnumber of fields to transform.
    IPRIMElongitude index for the prime meridian. (defaults to 1 if IPRIME=0)
    ISKIPskip number between longitudes (defaults to 1 if ISKIP=0)
    JNSKIPskip number between n.h. latitudes from north (defaults to IMAX if JNSKIP=0)
    JSSKIPskip number between s.h. latitudes from south (defaults to -IMAX if JSSKIP=0)
    KWSKIPskip number between wave fields (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
    KGSKIPskip number between grid fields (defaults to IMAX*JMAX if KGSKIP=0)
    JBEGlatitude index (from pole) to begin transform (defaults to 1 if JBEG=0). If JBEG=0 and IDIR<0, wave is zeroed before transform.
    JENDlatitude index (from pole) to end transform (defaults to (JMAX+1)/2 if JEND=0)
    JCPUnumber of cpus over which to multiprocess
    [out]WAVEwave fields if IDIR>0
    [out]GRIDMNglobal means if IDIR<0
    [out]GRIDXNn.h. x-gradients (starting at JBEG) if IDIR<0
    [out]GRIDXSs.h. x-gradients (starting at JBEG) if IDIR<0 [GRIDX=(D(WAVE)/DLAM)/(CLAT*RERTH)]
    +
    [out]GRIDYNn.h. y-gradients (starting at JBEG) if IDIR<0
    [out]GRIDYSs.h. y-gradients (starting at JBEG) if IDIR<0 [GRIDY=(D(WAVE)/DPHI)/RERTH]
    IDIRtransform flag (IDIR>0 for wave to grid, IDIR<0 for grid to wave)
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition at line 88 of file sptrand.f.

    + +

    References splaplac(), sptranv(), and spwget().

    + +

    Referenced by sptezd(), sptezmd(), and sptrund().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptrand_8f.js b/ver-5.1.0/sptrand_8f.js new file mode 100644 index 00000000..c01144d7 --- /dev/null +++ b/ver-5.1.0/sptrand_8f.js @@ -0,0 +1,4 @@ +var sptrand_8f = +[ + [ "sptrand", "sptrand_8f.html#ae810abad32bcbdfb8345a30e50bcc1ef", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptrand_8f_source.html b/ver-5.1.0/sptrand_8f_source.html new file mode 100644 index 00000000..5f90bd36 --- /dev/null +++ b/ver-5.1.0/sptrand_8f_source.html @@ -0,0 +1,253 @@ + + + + + + + +NCEPLIBS-ip: sptrand.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptrand.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Perform a gradient spherical transform.
    +
    3 C>
    +
    4 C> ### Program History Log
    +
    5 C> Date | Programmer | Comments
    +
    6 C> -----|------------|---------
    +
    7 C> 96-02-29 | IREDELL | Initial
    +
    8 C> 1998-12-15 | IREDELL | openmp directives inserted
    +
    9 C>
    +
    10 C> @author Iredell @date 96-02-29
    +
    11 
    +
    12 C> This subprogram performs a spherical transform
    +
    13 C> between spectral coefficients of scalar fields
    +
    14 C> and their means and gradients on a global cylindrical grid.
    +
    15 C>
    +
    16 C> The wave-space can be either triangular or rhomboidal.
    +
    17 C>
    +
    18 C> The grid-space can be either an equally-spaced grid
    +
    19 C> (with or without pole points) or a Gaussian grid.
    +
    20 C>
    +
    21 C> The wave and grid fields may have general indexing,
    +
    22 C> but each wave field is in sequential 'IBM order',
    +
    23 C> i.e. with zonal wavenumber as the slower index.
    +
    24 C>
    +
    25 C> Transforms are done in latitude pairs for efficiency;
    +
    26 C> thus grid arrays for each hemisphere must be passed.
    +
    27 C> if so requested, just a subset of the latitude pairs
    +
    28 C> may be transformed in each invocation of the subprogram.
    +
    29 C>
    +
    30 C> The transforms are all multiprocessed over latitude except
    +
    31 C> the transform from Fourier to spectral is multiprocessed
    +
    32 C> over zonal wavenumber to ensure reproducibility.
    +
    33 C>
    +
    34 C> Transform several fields at a time to improve vectorization.
    +
    35 C>
    +
    36 C> Subprogram can be called from a multiprocessing environment.
    +
    37 C>
    +
    38 C> Minimum grid dimensions for unaliased transforms to spectral:
    +
    39 C> DIMENSION |LINEAR |QUADRATIC
    +
    40 C> ----------------------- |--------- |-------------
    +
    41 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    +
    42 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    +
    43 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    +
    44 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    +
    45 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    +
    46 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    +
    47 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    +
    48 C>
    +
    49 C> @param IROMB spectral domain shape
    +
    50 C> (0 for triangular, 1 for rhomboidal)
    +
    51 C> @param MAXWV spectral truncation
    +
    52 C> @param IDRT grid identifier
    +
    53 C> - IDRT=4 for Gaussian grid
    +
    54 C> - IDRT=0 for equally-spaced grid including poles
    +
    55 C> - IDRT=256 for equally-spaced grid excluding poles
    +
    56 C> @param IMAX even number of longitudes.
    +
    57 C> @param JMAX number of latitudes.
    +
    58 C> @param KMAX number of fields to transform.
    +
    59 C> @param IPRIME longitude index for the prime meridian.
    +
    60 C> (defaults to 1 if IPRIME=0)
    +
    61 C> @param ISKIP skip number between longitudes
    +
    62 C> (defaults to 1 if ISKIP=0)
    +
    63 C> @param JNSKIP skip number between n.h. latitudes from north
    +
    64 C> (defaults to IMAX if JNSKIP=0)
    +
    65 C> @param JSSKIP skip number between s.h. latitudes from south
    +
    66 C> (defaults to -IMAX if JSSKIP=0)
    +
    67 C> @param KWSKIP skip number between wave fields
    +
    68 C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0)
    +
    69 C> @param KGSKIP skip number between grid fields
    +
    70 C> (defaults to IMAX*JMAX if KGSKIP=0)
    +
    71 C> @param JBEG latitude index (from pole) to begin transform
    +
    72 C> (defaults to 1 if JBEG=0). If JBEG=0 and IDIR<0, wave is zeroed before transform.
    +
    73 C> @param JEND latitude index (from pole) to end transform
    +
    74 C> (defaults to (JMAX+1)/2 if JEND=0)
    +
    75 C> @param JCPU number of cpus over which to multiprocess
    +
    76 C> @param[out] WAVE wave fields if IDIR>0
    +
    77 C> @param[out] GRIDMN global means if IDIR<0
    +
    78 C> @param[out] GRIDXN n.h. x-gradients (starting at JBEG) if IDIR<0
    +
    79 C> @param[out] GRIDXS s.h. x-gradients (starting at JBEG) if IDIR<0
    +
    80 C> [GRIDX=(D(WAVE)/DLAM)/(CLAT*RERTH)]
    +
    81 C> @param[out] GRIDYN n.h. y-gradients (starting at JBEG) if IDIR<0
    +
    82 C> @param[out] GRIDYS s.h. y-gradients (starting at JBEG) if IDIR<0
    +
    83 C> [GRIDY=(D(WAVE)/DPHI)/RERTH]
    +
    84 C> @param IDIR transform flag
    +
    85 C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave)
    +
    86 C>
    +
    87 C> @author Iredell @date 96-02-29
    +
    88  SUBROUTINE sptrand(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
    +
    89  & IPRIME,ISKIP,JNSKIP,JSSKIP,KWSKIP,KGSKIP,
    +
    90  & JBEG,JEND,JCPU,
    +
    91  & WAVE,GRIDMN,GRIDXN,GRIDXS,GRIDYN,GRIDYS,IDIR)
    +
    92 
    +
    93  REAL WAVE(*),GRIDMN(KMAX),GRIDXN(*),GRIDXS(*),GRIDYN(*),GRIDYS(*)
    +
    94  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    95  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    96  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    97  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    98  REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    99  REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    100 
    +
    101 C SET PARAMETERS
    +
    102  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    103  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    104  mdim=2*mx+1
    +
    105  kw=kwskip
    +
    106  IF(kw.EQ.0) kw=2*mx
    +
    107 
    +
    108 C TRANSFORM WAVE TO GRID
    +
    109  IF(idir.GT.0) THEN
    +
    110 C$OMP PARALLEL DO PRIVATE(KWS)
    +
    111  DO k=1,kmax
    +
    112  kws=(k-1)*kw
    +
    113  gridmn(k)=wave(kws+1)/sqrt(2.)
    +
    114  CALL splaplac(iromb,maxwv,enn1,wave(kws+1),wd(1,k),1)
    +
    115  wz(1:2*mx,k)=0.
    +
    116  ENDDO
    +
    117  CALL sptranv(iromb,maxwv,idrt,imax,jmax,kmax,
    +
    118  & iprime,iskip,jnskip,jsskip,mdim,kgskip,
    +
    119  & jbeg,jend,jcpu,
    +
    120  & wd,wz,gridxn,gridxs,gridyn,gridys,idir)
    +
    121 
    +
    122 C TRANSFORM GRID TO WAVE
    +
    123  ELSE
    +
    124 C$OMP PARALLEL DO
    +
    125  DO k=1,kmax
    +
    126  wd(1:2*mx,k)=0.
    +
    127  wz(1:2*mx,k)=0.
    +
    128  ENDDO
    +
    129  CALL sptranv(iromb,maxwv,idrt,imax,jmax,kmax,
    +
    130  & iprime,iskip,jnskip,jsskip,mdim,kgskip,
    +
    131  & jbeg,jend,jcpu,
    +
    132  & wd,wz,gridxn,gridxs,gridyn,gridys,idir)
    +
    133  IF(jbeg.EQ.0) THEN
    +
    134 C$OMP PARALLEL DO PRIVATE(KWS)
    +
    135  DO k=1,kmax
    +
    136  kws=(k-1)*kw
    +
    137  CALL splaplac(iromb,maxwv,enn1,wave(kws+1),wd(1,k),-1)
    +
    138  wave(kws+1)=gridmn(k)*sqrt(2.)
    +
    139  ENDDO
    +
    140  ELSE
    +
    141 C$OMP PARALLEL DO PRIVATE(KWS)
    +
    142  DO k=1,kmax
    +
    143  kws=(k-1)*kw
    +
    144  CALL splaplac(iromb,maxwv,enn1,wz(1,k),wd(1,k),-1)
    +
    145  wave(kws+1:kws+2*mx)=wave(kws+1:kws+2*mx)+wz(1:2*mx,k)
    +
    146  wave(kws+1)=gridmn(k)*sqrt(2.)
    +
    147  ENDDO
    +
    148  ENDIF
    +
    149  ENDIF
    +
    150  END
    +
    subroutine splaplac(I, M, ENN1, Q, QD2, IDIR)
    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
    Definition: splaplac.f:25
    +
    subroutine sptrand(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDMN, GRIDXN, GRIDXS, GRIDYN, GRIDYS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar fields and the...
    Definition: sptrand.f:92
    +
    subroutine sptranv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
    Definition: sptranv.f:91
    +
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +
    +
    + + + + diff --git a/ver-5.1.0/sptranf0_8f.html b/ver-5.1.0/sptranf0_8f.html new file mode 100644 index 00000000..cf5dd981 --- /dev/null +++ b/ver-5.1.0/sptranf0_8f.html @@ -0,0 +1,290 @@ + + + + + + + +NCEPLIBS-ip: sptranf0.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptranf0.f File Reference
    +
    +
    + +

    Sptranf spectral initialization. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptranf0 (IROMB, MAXWV, IDRT, IMAX, JMAX, JB, JE, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP, AFFT, CLAT, SLAT, WLAT, PLN, PLNTOP)
     This subprogram performs an initialization for subprogram sptranf(). More...
     
    +

    Detailed Description

    +

    Sptranf spectral initialization.

    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition in file sptranf0.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptranf0()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptranf0 ( IROMB,
     MAXWV,
     IDRT,
     IMAX,
     JMAX,
     JB,
     JE,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2) EPS,
    real, dimension(maxwv+1) EPSTOP,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2) ENN1,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2) ELONN1,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2) EON,
    real, dimension(maxwv+1) EONTOP,
    real(8), dimension(50000+4*imax) AFFT,
    real, dimension(jb:je) CLAT,
    real, dimension(jb:je) SLAT,
    real, dimension(jb:je) WLAT,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2,jb:je) PLN,
    real, dimension(maxwv+1,jb:je) PLNTOP 
    )
    +
    + +

    This subprogram performs an initialization for subprogram sptranf().

    +

    Use this subprogram outside the sptranf() family context at your own risk.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + +
    IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVspectral truncation
    IDRTgrid identifier
      +
    • IDRT=4 for Gaussian grid,
    • +
    • IDRT=0 for equally-spaced grid including poles,
    • +
    • IDRT=256 for equally-spaced grid excluding poles
    • +
    +
    IMAXeven number of longitudes
    JMAXnumber of latitudes
    JBlatitude index (from pole) to begin transform
    JElatitude index (from pole) to end transform
    EPS
    EPSTOP
    ENN1
    ELONN1
    EON
    EONTOP
    AFFTauxiliary array if IDIR=0
    CLATcosines of latitude
    SLATsines of latitude
    WLATGaussian weights
    PLNLegendre polynomials
    PLNTOPLegendre polynomial over top
    +
    +
    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition at line 34 of file sptranf0.f.

    + +

    References spffte(), splat(), splegend(), and spwget().

    + +

    Referenced by sptranf(), and sptranfv().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptranf0_8f.js b/ver-5.1.0/sptranf0_8f.js new file mode 100644 index 00000000..68775895 --- /dev/null +++ b/ver-5.1.0/sptranf0_8f.js @@ -0,0 +1,4 @@ +var sptranf0_8f = +[ + [ "sptranf0", "sptranf0_8f.html#aaf9f9002ccd7074dc04dbc40a5aad9f0", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptranf0_8f_source.html b/ver-5.1.0/sptranf0_8f_source.html new file mode 100644 index 00000000..c145b7d3 --- /dev/null +++ b/ver-5.1.0/sptranf0_8f_source.html @@ -0,0 +1,170 @@ + + + + + + + +NCEPLIBS-ip: sptranf0.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptranf0.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Sptranf spectral initialization.
    +
    3 C> @author IREDELL @date 96-02-29
    +
    4 
    +
    5 C> This subprogram performs an initialization for
    +
    6 C> subprogram sptranf(). Use this subprogram outside
    +
    7 C> the sptranf() family context at your own risk.
    +
    8 C>
    +
    9 C> @param IROMB spectral domain shape
    +
    10 c> (0 for triangular, 1 for rhomboidal)
    +
    11 C> @param MAXWV spectral truncation
    +
    12 C> @param IDRT grid identifier
    +
    13 C> - IDRT=4 for Gaussian grid,
    +
    14 C> - IDRT=0 for equally-spaced grid including poles,
    +
    15 C> - IDRT=256 for equally-spaced grid excluding poles
    +
    16 C> @param IMAX even number of longitudes
    +
    17 C> @param JMAX number of latitudes
    +
    18 C> @param JB latitude index (from pole) to begin transform
    +
    19 C> @param JE latitude index (from pole) to end transform
    +
    20 C> @param EPS
    +
    21 C> @param EPSTOP
    +
    22 C> @param ENN1
    +
    23 C> @param ELONN1
    +
    24 C> @param EON
    +
    25 C> @param EONTOP
    +
    26 C> @param AFFT auxiliary array if IDIR=0
    +
    27 C> @param CLAT cosines of latitude
    +
    28 C> @param SLAT sines of latitude
    +
    29 C> @param WLAT Gaussian weights
    +
    30 C> @param PLN Legendre polynomials
    +
    31 C> @param PLNTOP Legendre polynomial over top
    +
    32 C>
    +
    33 C> @author IREDELL @date 96-02-29
    +
    34  SUBROUTINE sptranf0(IROMB,MAXWV,IDRT,IMAX,JMAX,JB,JE,
    +
    35  & EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP,
    +
    36  & AFFT,CLAT,SLAT,WLAT,PLN,PLNTOP)
    +
    37 
    +
    38  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    39  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    40  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    41  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    42  REAL(8) AFFT(50000+4*IMAX)
    +
    43  REAL CLAT(JB:JE),SLAT(JB:JE),WLAT(JB:JE)
    +
    44  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2,JB:JE)
    +
    45  REAL PLNTOP(MAXWV+1,JB:JE)
    +
    46  REAL SLATX(JMAX),WLATX(JMAX)
    +
    47  REAL W(IMAX+2,2),G(IMAX,2)
    +
    48 
    +
    49  w = 0.0
    +
    50  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    51  CALL spffte(imax,(imax+2)/2,imax,2,w,g,0,afft)
    +
    52  CALL splat(idrt,jmax,slatx,wlatx)
    +
    53  jhe=(jmax+1)/2
    +
    54  IF(jhe.GT.jmax/2) wlatx(jhe)=wlatx(jhe)/2
    +
    55  DO j=jb,je
    +
    56  clat(j)=sqrt(1.-slatx(j)**2)
    +
    57  slat(j)=slatx(j)
    +
    58  wlat(j)=wlatx(j)
    +
    59  ENDDO
    +
    60 C$OMP PARALLEL DO
    +
    61  DO j=jb,je
    +
    62  CALL splegend(iromb,maxwv,slat(j),clat(j),eps,epstop,
    +
    63  & pln(1,j),plntop(1,j))
    +
    64  ENDDO
    +
    65 
    +
    66  END
    +
    subroutine spffte(IMAX, INCW, INCG, KMAX, W, G, IDIR, AFFT)
    This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space...
    Definition: spffte.f:49
    +
    subroutine splat(IDRT, JMAX, SLAT, WLAT)
    Computes cosines of colatitude and Gaussian weights for one of the following specific global sets of ...
    Definition: splat.F:46
    +
    subroutine splegend(I, M, SLAT, CLAT, EPS, EPSTOP, PLN, PLNTOP)
    Evaluates the orthonormal associated Legendre polynomials in the spectral domain at a given latitude.
    Definition: splegend.f:45
    +
    subroutine sptranf0(IROMB, MAXWV, IDRT, IMAX, JMAX, JB, JE, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP, AFFT, CLAT, SLAT, WLAT, PLN, PLNTOP)
    This subprogram performs an initialization for subprogram sptranf().
    Definition: sptranf0.f:37
    +
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +
    +
    + + + + diff --git a/ver-5.1.0/sptranf1_8f.html b/ver-5.1.0/sptranf1_8f.html new file mode 100644 index 00000000..ee94d7e0 --- /dev/null +++ b/ver-5.1.0/sptranf1_8f.html @@ -0,0 +1,325 @@ + + + + + + + +NCEPLIBS-ip: sptranf1.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptranf1.f File Reference
    +
    +
    + +

    Sptranf spectral transform. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptranf1 (IROMB, MAXWV, IDRT, IMAX, JMAX, JB, JE, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP, AFFT, CLAT, SLAT, WLAT, PLN, PLNTOP, MP, W, WTOP, G, IDIR)
     This subprogram performs an single latitude transform for subprogram sptranf(). More...
     
    +

    Detailed Description

    +

    Sptranf spectral transform.

    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition in file sptranf1.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptranf1()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptranf1 ( IROMB,
     MAXWV,
     IDRT,
     IMAX,
     JMAX,
     JB,
     JE,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2) EPS,
    real, dimension(maxwv+1) EPSTOP,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2) ENN1,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2) ELONN1,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2) EON,
    real, dimension(maxwv+1) EONTOP,
    real(8), dimension(50000+4*imax) AFFT,
    real, dimension(jb:je) CLAT,
    real, dimension(jb:je) SLAT,
    real, dimension(jb:je) WLAT,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2,jb:je) PLN,
    real, dimension(maxwv+1,jb:je) PLNTOP,
     MP,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2)) W,
    real, dimension(2*(maxwv+1)) WTOP,
    real, dimension(imax,2,jb:je) G,
     IDIR 
    )
    +
    + +

    This subprogram performs an single latitude transform for subprogram sptranf().

    +

    Use this subprogram outside the sptranf() family context at your own risk.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVspectral truncation
    IDRTgrid identifier
      +
    • IDRT=4 for Gaussian grid,
    • +
    • IDRT=0 for equally-spaced grid including poles,
    • +
    • IDRT=256 for equally-spaced grid excluding poles
    • +
    +
    IMAXeven number of longitudes
    JMAXnumber of latitudes
    JBlatitude index (from pole) to begin transform
    JElatitude index (from pole) to end transform
    EPS
    EPSTOP
    ENN1
    ELONN1
    EON
    EONTOP
    CLATcosines of latitude
    SLATsines of latitude
    WLATGaussian weights
    AFFTauxiliary array if IDIR=0
    PLNLegendre polynomials
    PLNTOPLegendre polynomial over top
    MPidentifier (0 for scalar, 1 for vector)
    [out]Wwave field if IDIR>0
    [out]WTOPwave field over top if IDIR>0
    [out]Ggrid field if IDIR<0
    IDIRtransform flag (IDIR>0 for wave to grid, IDIR<0 for grid to wave)
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition at line 40 of file sptranf1.f.

    + +

    References spanaly(), spffte(), and spsynth().

    + +

    Referenced by sptranf(), and sptranfv().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptranf1_8f.js b/ver-5.1.0/sptranf1_8f.js new file mode 100644 index 00000000..2123eae8 --- /dev/null +++ b/ver-5.1.0/sptranf1_8f.js @@ -0,0 +1,4 @@ +var sptranf1_8f = +[ + [ "sptranf1", "sptranf1_8f.html#ad7cec2fd6729ca84b1fac3436f9730e6", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptranf1_8f_source.html b/ver-5.1.0/sptranf1_8f_source.html new file mode 100644 index 00000000..d836688b --- /dev/null +++ b/ver-5.1.0/sptranf1_8f_source.html @@ -0,0 +1,179 @@ + + + + + + + +NCEPLIBS-ip: sptranf1.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptranf1.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Sptranf spectral transform.
    +
    3 C> @author Iredell @date 96-02-29
    +
    4 
    +
    5 C> This subprogram performs an single latitude transform for
    +
    6 C> subprogram sptranf(). Use this subprogram outside
    +
    7 C> the sptranf() family context at your own risk.
    +
    8 C>
    +
    9 C> @param IROMB spectral domain shape
    +
    10 C> (0 for triangular, 1 for rhomboidal)
    +
    11 C> @param MAXWV spectral truncation
    +
    12 C> @param IDRT grid identifier
    +
    13 C> - IDRT=4 for Gaussian grid,
    +
    14 C> - IDRT=0 for equally-spaced grid including poles,
    +
    15 C> - IDRT=256 for equally-spaced grid excluding poles
    +
    16 C> @param IMAX even number of longitudes
    +
    17 C> @param JMAX number of latitudes
    +
    18 C> @param JB latitude index (from pole) to begin transform
    +
    19 C> @param JE latitude index (from pole) to end transform
    +
    20 C> @param EPS
    +
    21 C> @param EPSTOP
    +
    22 C> @param ENN1
    +
    23 C> @param ELONN1
    +
    24 C> @param EON
    +
    25 C> @param EONTOP
    +
    26 C> @param CLAT cosines of latitude
    +
    27 C> @param SLAT sines of latitude
    +
    28 C> @param WLAT Gaussian weights
    +
    29 C> @param AFFT auxiliary array if IDIR=0
    +
    30 C> @param PLN Legendre polynomials
    +
    31 C> @param PLNTOP Legendre polynomial over top
    +
    32 C> @param MP identifier (0 for scalar, 1 for vector)
    +
    33 C> @param[out] W wave field if IDIR>0
    +
    34 C> @param[out] WTOP wave field over top if IDIR>0
    +
    35 C> @param[out] G grid field if IDIR<0
    +
    36 C> @param IDIR transform flag
    +
    37 C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave)
    +
    38 C>
    +
    39 C> @author Iredell @date 96-02-29
    +
    40  SUBROUTINE sptranf1(IROMB,MAXWV,IDRT,IMAX,JMAX,JB,JE,
    +
    41  & EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP,
    +
    42  & AFFT,CLAT,SLAT,WLAT,PLN,PLNTOP,MP,
    +
    43  & W,WTOP,G,IDIR)
    +
    44 
    +
    45  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    46  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    47  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    48  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    49  REAL(8) AFFT(50000+4*IMAX)
    +
    50  REAL CLAT(JB:JE),SLAT(JB:JE),WLAT(JB:JE)
    +
    51  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2,JB:JE)
    +
    52  REAL PLNTOP(MAXWV+1,JB:JE)
    +
    53  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2))
    +
    54  REAL WTOP(2*(MAXWV+1))
    +
    55  REAL G(IMAX,2,JB:JE)
    +
    56  REAL F(IMAX+2,2)
    +
    57 
    +
    58  kw=(maxwv+1)*((iromb+1)*maxwv+2)
    +
    59  kwtop=2*(maxwv+1)
    +
    60  IF(idir.GT.0) THEN
    +
    61  DO j=jb,je
    +
    62  CALL spsynth(iromb,maxwv,imax,imax+2,kw,kwtop,1,
    +
    63  & clat(j),pln(1,j),plntop(1,j),(/mp/),
    +
    64  & w,wtop,f)
    +
    65  CALL spffte(imax,(imax+2)/2,imax,2,f,g(1,1,j),+1,afft)
    +
    66  ENDDO
    +
    67  ELSE
    +
    68  DO j=jb,je
    +
    69  CALL spffte(imax,(imax+2)/2,imax,2,f,g(1,1,j),-1,afft)
    +
    70  CALL spanaly(iromb,maxwv,imax,imax+2,kw,kwtop,1,
    +
    71  & wlat(j),clat(j),pln(1,j),plntop(1,j),(/mp/),
    +
    72  & f,w,wtop)
    +
    73  ENDDO
    +
    74  ENDIF
    +
    75 
    +
    76  END
    +
    subroutine spanaly(I, M, IM, IX, NC, NCTOP, KM, WGT, CLAT, PLN, PLNTOP, MP, F, SPC, SPCTOP)
    Analyzes spectral coefficients from Fourier coefficients for a latitude pair (Northern and Southern h...
    Definition: spanaly.f:37
    +
    subroutine spffte(IMAX, INCW, INCG, KMAX, W, G, IDIR, AFFT)
    This subprogram performs multiple fast Fourier transforms between complex amplitudes in Fourier space...
    Definition: spffte.f:49
    +
    subroutine spsynth(I, M, IM, IX, NC, NCTOP, KM, CLAT, PLN, PLNTOP, MP, SPC, SPCTOP, F)
    Synthesizes Fourier coefficients from spectral coefficients for a latitude pair (Northern and Souther...
    Definition: spsynth.f:39
    +
    subroutine sptranf1(IROMB, MAXWV, IDRT, IMAX, JMAX, JB, JE, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP, AFFT, CLAT, SLAT, WLAT, PLN, PLNTOP, MP, W, WTOP, G, IDIR)
    This subprogram performs an single latitude transform for subprogram sptranf().
    Definition: sptranf1.f:44
    +
    +
    + + + + diff --git a/ver-5.1.0/sptranf_8f.html b/ver-5.1.0/sptranf_8f.html new file mode 100644 index 00000000..a33379e1 --- /dev/null +++ b/ver-5.1.0/sptranf_8f.html @@ -0,0 +1,324 @@ + + + + + + + +NCEPLIBS-ip: sptranf.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptranf.f File Reference
    +
    +
    + +

    Perform a scalar spherical transform. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptranf (IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IP, IS, JN, JS, KW, KG, JB, JE, JC, WAVE, GRIDN, GRIDS, IDIR)
     This subprogram performs a spherical transform between spectral coefficients of scalar quantities and fields on a global cylindrical grid. More...
     
    +

    Detailed Description

    +

    Perform a scalar spherical transform.

    +

    +Program History Log

    + + + + + + + + + +
    Date Programmer Comments
    96-02-29 Iredell Initial.
    1998-12-15 Iredell Generic fft used, openmp directives inserted
    2013-01-16 Iredell, Mirvis Fixing afft negative sharing effect
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition in file sptranf.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptranf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptranf ( IROMB,
     MAXWV,
     IDRT,
     IMAX,
     JMAX,
     KMAX,
     IP,
     IS,
     JN,
     JS,
     KW,
     KG,
     JB,
     JE,
     JC,
    real, dimension(*) WAVE,
    real, dimension(*) GRIDN,
    real, dimension(*) GRIDS,
     IDIR 
    )
    +
    + +

    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and fields on a global cylindrical grid.

    +

    The wave-space can be either triangular or rhomboidal. The grid-space can be either an equally-spaced grid (with or without pole points) or a Gaussian grid.

    +

    The wave and grid fields may have general indexing, but each wave field is in sequential 'ibm order', i.e. with zonal wavenumber as the slower index.

    +

    Transforms are done in latitude pairs for efficiency; thus grid arrays for each hemisphere must be passed.

    +

    If so requested, just a subset of the latitude pairs may be transformed in each invocation of the subprogram. The transforms are all multiprocessed over latitude except the transform from fourier to spectral is multiprocessed over zonal wavenumber to ensure reproducibility.

    +

    Transform several fields at a time to improve vectorization. Subprogram can be called from a multiprocessing environment.

    +

    Minimum grid dimensions for unaliased transforms to spectral:

    + + + + + + + + + + + + + + + + +
    DIMENSION LINEAR QUADRATIC
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + +
    IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVspectral truncation
    IDRTgrid identifier
      +
    • IDRT=4 for Gaussian grid,
    • +
    • IDRT=0 for equally-spaced grid including poles
    • +
    • IDRT=256 for equally-spaced grid excluding poles
    • +
    +
    IMAXeven number of longitudes.
    JMAXnumber of latitudes.
    KMAXnumber of fields to transform.
    IPlongitude index for the prime meridian
    ISskip number between longitudes
    JNskip number between n.h. latitudes from north
    JSskip number between s.h. latitudes from south
    KWskip number between wave fields
    KGskip number between grid fields
    JBlatitude index (from pole) to begin transform
    JElatitude index (from pole) to end transform
    JCnumber of cpus over which to multiprocess
    [out]WAVEwave fields if IDIR>0
    [out]GRIDNn.h. grid fields (starting at JB) if IDIR<0
    [out]GRIDSs.h. grid fields (starting at JB) if IDIR<0
    IDIRtransform flag (IDIR>0 for wave to grid, IDIR<0 for grid to wave)
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition at line 74 of file sptranf.f.

    + +

    References sptranf0(), and sptranf1().

    + +

    Referenced by sptez(), sptezm(), and sptran().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptranf_8f.js b/ver-5.1.0/sptranf_8f.js new file mode 100644 index 00000000..5f0a52f8 --- /dev/null +++ b/ver-5.1.0/sptranf_8f.js @@ -0,0 +1,4 @@ +var sptranf_8f = +[ + [ "sptranf", "sptranf_8f.html#acf086b5141203e48bdb7250441a16c8c", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptranf_8f_source.html b/ver-5.1.0/sptranf_8f_source.html new file mode 100644 index 00000000..579c9765 --- /dev/null +++ b/ver-5.1.0/sptranf_8f_source.html @@ -0,0 +1,263 @@ + + + + + + + +NCEPLIBS-ip: sptranf.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptranf.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Perform a scalar spherical transform
    +
    3 C>
    +
    4 C> ### Program History Log
    +
    5 C> Date | Programmer | Comments
    +
    6 C> -----|------------|---------
    +
    7 C> 96-02-29 | Iredell | Initial.
    +
    8 C> 1998-12-15 | Iredell | Generic fft used, openmp directives inserted
    +
    9 C> 2013-01-16 | Iredell, Mirvis | Fixing afft negative sharing effect
    +
    10 C>
    +
    11 C> @author Iredell @date 96-02-29
    +
    12 
    +
    13 C> This subprogram performs a spherical transform between spectral
    +
    14 C> coefficients of scalar quantities and fields on a global
    +
    15 C> cylindrical grid.
    +
    16 C>
    +
    17 C> The wave-space can be either triangular or
    +
    18 C> rhomboidal. The grid-space can be either an equally-spaced grid
    +
    19 C> (with or without pole points) or a Gaussian grid.
    +
    20 C>
    +
    21 C> The wave and grid fields may have general indexing,
    +
    22 C> but each wave field is in sequential 'ibm order',
    +
    23 C> i.e. with zonal wavenumber as the slower index.
    +
    24 C>
    +
    25 C> Transforms are done in latitude pairs for efficiency;
    +
    26 C> thus grid arrays for each hemisphere must be passed.
    +
    27 C>
    +
    28 C> If so requested, just a subset of the latitude pairs
    +
    29 C> may be transformed in each invocation of the subprogram.
    +
    30 C> The transforms are all multiprocessed over latitude except
    +
    31 C> the transform from fourier to spectral is multiprocessed
    +
    32 C> over zonal wavenumber to ensure reproducibility.
    +
    33 C>
    +
    34 C> Transform several fields at a time to improve vectorization.
    +
    35 C> Subprogram can be called from a multiprocessing environment.
    +
    36 C>
    +
    37 C> Minimum grid dimensions for unaliased transforms to spectral:
    +
    38 C> DIMENSION |LINEAR |QUADRATIC
    +
    39 C> ----------------------- |--------- |-------------
    +
    40 C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2
    +
    41 C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1
    +
    42 C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1
    +
    43 C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3
    +
    44 C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3
    +
    45 C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1
    +
    46 C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1
    +
    47 C>
    +
    48 C> @param IROMB spectral domain shape
    +
    49 c> (0 for triangular, 1 for rhomboidal)
    +
    50 C> @param MAXWV spectral truncation
    +
    51 C> @param IDRT grid identifier
    +
    52 C> - IDRT=4 for Gaussian grid,
    +
    53 C> - IDRT=0 for equally-spaced grid including poles
    +
    54 C> - IDRT=256 for equally-spaced grid excluding poles
    +
    55 C> @param IMAX even number of longitudes.
    +
    56 C> @param JMAX number of latitudes.
    +
    57 C> @param KMAX number of fields to transform.
    +
    58 C> @param IP longitude index for the prime meridian
    +
    59 C> @param IS skip number between longitudes
    +
    60 C> @param JN skip number between n.h. latitudes from north
    +
    61 C> @param JS skip number between s.h. latitudes from south
    +
    62 C> @param KW skip number between wave fields
    +
    63 C> @param KG skip number between grid fields
    +
    64 C> @param JB latitude index (from pole) to begin transform
    +
    65 C> @param JE latitude index (from pole) to end transform
    +
    66 C> @param JC number of cpus over which to multiprocess
    +
    67 C> @param[out] WAVE wave fields if IDIR>0
    +
    68 C> @param[out] GRIDN n.h. grid fields (starting at JB) if IDIR<0
    +
    69 C> @param[out] GRIDS s.h. grid fields (starting at JB) if IDIR<0
    +
    70 C> @param IDIR transform flag
    +
    71 C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave)
    +
    72 C>
    +
    73 C> @author Iredell @date 96-02-29
    +
    74  SUBROUTINE sptranf(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
    +
    75  & IP,IS,JN,JS,KW,KG,JB,JE,JC,
    +
    76  & WAVE,GRIDN,GRIDS,IDIR)
    +
    77 
    +
    78  REAL WAVE(*),GRIDN(*),GRIDS(*)
    +
    79  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    80  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    81  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    82  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    83  REAL(8) AFFT(50000+4*IMAX), AFFT_TMP(50000+4*IMAX)
    +
    84  REAL CLAT(JB:JE),SLAT(JB:JE),WLAT(JB:JE)
    +
    85  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2,JB:JE)
    +
    86  REAL PLNTOP(MAXWV+1,JB:JE)
    +
    87  REAL WTOP(2*(MAXWV+1))
    +
    88  REAL G(IMAX,2)
    +
    89 ! write(0,*) 'sptranf top'
    +
    90 
    +
    91 C SET PARAMETERS
    +
    92  mp=0
    +
    93  CALL sptranf0(iromb,maxwv,idrt,imax,jmax,jb,je,
    +
    94  & eps,epstop,enn1,elonn1,eon,eontop,
    +
    95  & afft,clat,slat,wlat,pln,plntop)
    +
    96 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    97 C TRANSFORM WAVE TO GRID
    +
    98  IF(idir.GT.0) THEN
    +
    99 C$OMP PARALLEL DO PRIVATE(AFFT_TMP,KWS,WTOP,G,IJKN,IJKS)
    +
    100  DO k=1,kmax
    +
    101  afft_tmp=afft
    +
    102  kws=(k-1)*kw
    +
    103  wtop=0
    +
    104  DO j=jb,je
    +
    105  CALL sptranf1(iromb,maxwv,idrt,imax,jmax,j,j,
    +
    106  & eps,epstop,enn1,elonn1,eon,eontop,
    +
    107  & afft_tmp,clat(j),slat(j),wlat(j),
    +
    108  & pln(1,j),plntop(1,j),mp,
    +
    109  & wave(kws+1),wtop,g,idir)
    +
    110  IF(ip.EQ.1.AND.is.EQ.1) THEN
    +
    111  DO i=1,imax
    +
    112  ijkn=i+(j-jb)*jn+(k-1)*kg
    +
    113  ijks=i+(j-jb)*js+(k-1)*kg
    +
    114  gridn(ijkn)=g(i,1)
    +
    115  grids(ijks)=g(i,2)
    +
    116  ENDDO
    +
    117  ELSE
    +
    118  DO i=1,imax
    +
    119  ijkn=mod(i+ip-2,imax)*is+(j-jb)*jn+(k-1)*kg+1
    +
    120  ijks=mod(i+ip-2,imax)*is+(j-jb)*js+(k-1)*kg+1
    +
    121  gridn(ijkn)=g(i,1)
    +
    122  grids(ijks)=g(i,2)
    +
    123  ENDDO
    +
    124  ENDIF
    +
    125  ENDDO
    +
    126  ENDDO
    +
    127 
    +
    128 C TRANSFORM GRID TO WAVE
    +
    129  ELSE
    +
    130 C$OMP PARALLEL DO PRIVATE(AFFT_TMP,KWS,WTOP,G,IJKN,IJKS)
    +
    131  DO k=1,kmax
    +
    132  afft_tmp=afft
    +
    133  kws=(k-1)*kw
    +
    134  wtop=0
    +
    135  DO j=jb,je
    +
    136  IF(wlat(j).GT.0.) THEN
    +
    137  IF(ip.EQ.1.AND.is.EQ.1) THEN
    +
    138  DO i=1,imax
    +
    139  ijkn=i+(j-jb)*jn+(k-1)*kg
    +
    140  ijks=i+(j-jb)*js+(k-1)*kg
    +
    141  g(i,1)=gridn(ijkn)
    +
    142  g(i,2)=grids(ijks)
    +
    143  ENDDO
    +
    144  ELSE
    +
    145  DO i=1,imax
    +
    146  ijkn=mod(i+ip-2,imax)*is+(j-jb)*jn+(k-1)*kg+1
    +
    147  ijks=mod(i+ip-2,imax)*is+(j-jb)*js+(k-1)*kg+1
    +
    148  g(i,1)=gridn(ijkn)
    +
    149  g(i,2)=grids(ijks)
    +
    150  ENDDO
    +
    151  ENDIF
    +
    152  CALL sptranf1(iromb,maxwv,idrt,imax,jmax,j,j,
    +
    153  & eps,epstop,enn1,elonn1,eon,eontop,
    +
    154  & afft_tmp,clat(j),slat(j),wlat(j),
    +
    155  & pln(1,j),plntop(1,j),mp,
    +
    156  & wave(kws+1),wtop,g,idir)
    +
    157  ENDIF
    +
    158  ENDDO
    +
    159  ENDDO
    +
    160  ENDIF
    +
    161  END
    +
    subroutine sptranf0(IROMB, MAXWV, IDRT, IMAX, JMAX, JB, JE, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP, AFFT, CLAT, SLAT, WLAT, PLN, PLNTOP)
    This subprogram performs an initialization for subprogram sptranf().
    Definition: sptranf0.f:37
    +
    subroutine sptranf1(IROMB, MAXWV, IDRT, IMAX, JMAX, JB, JE, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP, AFFT, CLAT, SLAT, WLAT, PLN, PLNTOP, MP, W, WTOP, G, IDIR)
    This subprogram performs an single latitude transform for subprogram sptranf().
    Definition: sptranf1.f:44
    +
    subroutine sptranf(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IP, IS, JN, JS, KW, KG, JB, JE, JC, WAVE, GRIDN, GRIDS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition: sptranf.f:77
    +
    +
    + + + + diff --git a/ver-5.1.0/sptranfv_8f.html b/ver-5.1.0/sptranfv_8f.html new file mode 100644 index 00000000..46469efd --- /dev/null +++ b/ver-5.1.0/sptranfv_8f.html @@ -0,0 +1,347 @@ + + + + + + + +NCEPLIBS-ip: sptranfv.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptranfv.f File Reference
    +
    +
    + +

    Perform a vector spherical transform. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptranfv (IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IP, IS, JN, JS, KW, KG, JB, JE, JC, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
     This subprogram performs a spherical transform between spectral coefficients of divergences and curls and vector fields on a global cylindrical grid. More...
     
    +

    Detailed Description

    +

    Perform a vector spherical transform.

    +

    +Program History Log

    + + + + + + + + + +
    Date Programmer Comments
    96-02-29 Iredell Initial.
    1998-12-15 Iredell Generic fft used, openmp directives inserted
    2013-01-16 Iredell & MIRVIS Fixing afft negative sharing effect during omp loops
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition in file sptranfv.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptranfv()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptranfv ( IROMB,
     MAXWV,
     IDRT,
     IMAX,
     JMAX,
     KMAX,
     IP,
     IS,
     JN,
     JS,
     KW,
     KG,
     JB,
     JE,
     JC,
    real, dimension(*) WAVED,
    real, dimension(*) WAVEZ,
    real, dimension(*) GRIDUN,
    real, dimension(*) GRIDUS,
    real, dimension(*) GRIDVN,
    real, dimension(*) GRIDVS,
     IDIR 
    )
    +
    + +

    This subprogram performs a spherical transform between spectral coefficients of divergences and curls and vector fields on a global cylindrical grid.

    +

    The wave-space can be either triangular or rhomboidal.

    +

    The grid-space can be either an equally-spaced grid (with or without pole points) or a Gaussian grid.

    +

    The wave and grid fields may have general indexing, but each wave field is in sequential 'ibm order', i.e. with zonal wavenumber as the slower index.

    +

    Transforms are done in latitude pairs for efficiency; thus grid arrays for each hemisphere must be passed. if so requested, just a subset of the latitude pairs may be transformed in each invocation of the subprogram.

    +

    The transforms are all multiprocessed over latitude except the transform from fourier to spectral is multiprocessed over zonal wavenumber to ensure reproducibility.

    +

    Transform several fields at a time to improve vectorization. subprogram can be called from a multiprocessing environment.

    +

    Minimum grid dimensions for unaliased transforms to spectral:

    + + + + + + + + + + + + + + + + +
    DIMENSION LINEAR QUADRATIC
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + + +
    IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVspectral truncation
    IDRTgrid identifier
      +
    • IDRT=4 for Gaussian grid
    • +
    • IDRT=0 for equally-spaced grid including poles
    • +
    • IDRT=256 for equally-spaced grid excluding poles
    • +
    +
    IMAXeven number of longitudes.
    JMAXnumber of latitudes.
    KMAXnumber of fields to transform.
    IPlongitude index for the prime meridian
    ISskip number between longitudes
    JNskip number between n.h. latitudes from north
    JSskip number between s.h. latitudes from south
    KWskip number between wave fields
    KGskip number between grid fields
    JBlatitude index (from pole) to begin transform
    JElatitude index (from pole) to end transform
    JCnumber of cpus over which to multiprocess
    [out]WAVEDwave divergence fields if IDIR>0 [WAVED=(D(GRIDU)/DLAM+D(CLAT*GRIDV)/DPHI)/(CLAT*RERTH)]
    [out]WAVEZwave vorticity fields if IDIR>0 [WAVEZ=(D(GRIDV)/DLAM-D(CLAT*GRIDU)/DPHI)/(CLAT*RERTH)]
    +
    [out]GRIDUNN.H. grid u-winds (starting at jb) if IDIR<0
    [out]GRIDUSS.H. grid u-winds (starting at jb) if IDIR<0
    [out]GRIDVNN.H. grid v-winds (starting at jb) if IDIR<0
    [out]GRIDVSS.H. grid v-winds (starting at jb) if IDIR<0
    IDIRtransform flag (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition at line 80 of file sptranfv.f.

    + +

    References spdz2uv(), sptranf0(), sptranf1(), and spuv2dz().

    + +

    Referenced by sptezmv(), sptezv(), and sptranv().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptranfv_8f.js b/ver-5.1.0/sptranfv_8f.js new file mode 100644 index 00000000..7311d700 --- /dev/null +++ b/ver-5.1.0/sptranfv_8f.js @@ -0,0 +1,4 @@ +var sptranfv_8f = +[ + [ "sptranfv", "sptranfv_8f.html#a1a7aabbd358d4fe984dac6813c98b106", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptranfv_8f_source.html b/ver-5.1.0/sptranfv_8f_source.html new file mode 100644 index 00000000..91e20040 --- /dev/null +++ b/ver-5.1.0/sptranfv_8f_source.html @@ -0,0 +1,300 @@ + + + + + + + +NCEPLIBS-ip: sptranfv.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptranfv.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Perform a vector spherical transform
    +
    3 C>
    +
    4 C> ### Program History Log
    +
    5 C> Date | Programmer | Comments
    +
    6 C> -----|------------|---------
    +
    7 C> 96-02-29 | Iredell | Initial.
    +
    8 C> 1998-12-15 | Iredell | Generic fft used, openmp directives inserted
    +
    9 C> 2013-01-16 | Iredell & MIRVIS | Fixing afft negative sharing effect during omp loops
    +
    10 C>
    +
    11 C> @author Iredell @date 96-02-29
    +
    12 
    +
    13 C> This subprogram performs a spherical transform
    +
    14 C> between spectral coefficients of divergences and curls
    +
    15 C> and vector fields on a global cylindrical grid.
    +
    16 C>
    +
    17 C> The wave-space can be either triangular or rhomboidal.
    +
    18 C>
    +
    19 C> The grid-space can be either an equally-spaced grid
    +
    20 C> (with or without pole points) or a Gaussian grid.
    +
    21 C>
    +
    22 C> The wave and grid fields may have general indexing,
    +
    23 C> but each wave field is in sequential 'ibm order',
    +
    24 C> i.e. with zonal wavenumber as the slower index.
    +
    25 C>
    +
    26 C> Transforms are done in latitude pairs for efficiency;
    +
    27 C> thus grid arrays for each hemisphere must be passed.
    +
    28 C> if so requested, just a subset of the latitude pairs
    +
    29 C> may be transformed in each invocation of the subprogram.
    +
    30 C>
    +
    31 C> The transforms are all multiprocessed over latitude except
    +
    32 C> the transform from fourier to spectral is multiprocessed
    +
    33 C> over zonal wavenumber to ensure reproducibility.
    +
    34 C>
    +
    35 C> Transform several fields at a time to improve vectorization.
    +
    36 C> subprogram can be called from a multiprocessing environment.
    +
    37 C>
    +
    38 C> Minimum grid dimensions for unaliased transforms to spectral:
    +
    39 C> DIMENSION |LINEAR |QUADRATIC
    +
    40 C> ----------------------- |--------- |-------------
    +
    41 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    +
    42 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    +
    43 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    +
    44 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    +
    45 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    +
    46 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    +
    47 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    +
    48 C>
    +
    49 C> @param IROMB spectral domain shape
    +
    50 C> (0 for triangular, 1 for rhomboidal)
    +
    51 C> @param MAXWV spectral truncation
    +
    52 C> @param IDRT grid identifier
    +
    53 C> - IDRT=4 for Gaussian grid
    +
    54 C> - IDRT=0 for equally-spaced grid including poles
    +
    55 C> - IDRT=256 for equally-spaced grid excluding poles
    +
    56 C> @param IMAX even number of longitudes.
    +
    57 C> @param JMAX number of latitudes.
    +
    58 C> @param KMAX number of fields to transform.
    +
    59 C> @param IP longitude index for the prime meridian
    +
    60 C> @param IS skip number between longitudes
    +
    61 C> @param JN skip number between n.h. latitudes from north
    +
    62 C> @param JS skip number between s.h. latitudes from south
    +
    63 C> @param KW skip number between wave fields
    +
    64 C> @param KG skip number between grid fields
    +
    65 C> @param JB latitude index (from pole) to begin transform
    +
    66 C> @param JE latitude index (from pole) to end transform
    +
    67 C> @param JC number of cpus over which to multiprocess
    +
    68 C> @param[out] WAVED wave divergence fields if IDIR>0
    +
    69 C> [WAVED=(D(GRIDU)/DLAM+D(CLAT*GRIDV)/DPHI)/(CLAT*RERTH)]
    +
    70 C> @param[out] WAVEZ wave vorticity fields if IDIR>0
    +
    71 C> [WAVEZ=(D(GRIDV)/DLAM-D(CLAT*GRIDU)/DPHI)/(CLAT*RERTH)]
    +
    72 C> @param[out] GRIDUN N.H. grid u-winds (starting at jb) if IDIR<0
    +
    73 C> @param[out] GRIDUS S.H. grid u-winds (starting at jb) if IDIR<0
    +
    74 C> @param[out] GRIDVN N.H. grid v-winds (starting at jb) if IDIR<0
    +
    75 C> @param[out] GRIDVS S.H. grid v-winds (starting at jb) if IDIR<0
    +
    76 C> @param IDIR transform flag
    +
    77 C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave).
    +
    78 C>
    +
    79 C> @author Iredell @date 96-02-29
    +
    80  SUBROUTINE sptranfv(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
    +
    81  & IP,IS,JN,JS,KW,KG,JB,JE,JC,
    +
    82  & WAVED,WAVEZ,GRIDUN,GRIDUS,GRIDVN,GRIDVS,IDIR)
    +
    83 
    +
    84  REAL WAVED(*),WAVEZ(*),GRIDUN(*),GRIDUS(*),GRIDVN(*),GRIDVS(*)
    +
    85  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    86  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    87  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    88  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    89  REAL(8) AFFT(50000+4*IMAX), AFFT_TMP(50000+4*IMAX)
    +
    90  REAL CLAT(JB:JE),SLAT(JB:JE),WLAT(JB:JE)
    +
    91  REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2,JB:JE)
    +
    92  REAL PLNTOP(MAXWV+1,JB:JE)
    +
    93  INTEGER MP
    +
    94  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2,2)
    +
    95  REAL WTOP(2*(MAXWV+1),2)
    +
    96  REAL G(IMAX,2,2)
    +
    97  REAL WINC((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2,2)
    +
    98 
    +
    99 C SET PARAMETERS
    +
    100  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    101  mp=1
    +
    102  CALL sptranf0(iromb,maxwv,idrt,imax,jmax,jb,je,
    +
    103  & eps,epstop,enn1,elonn1,eon,eontop,
    +
    104  & afft,clat,slat,wlat,pln,plntop)
    +
    105 
    +
    106 C TRANSFORM WAVE TO GRID
    +
    107  IF(idir.GT.0) THEN
    +
    108 C$OMP PARALLEL DO PRIVATE(AFFT_TMP,KWS,W,WTOP,G,IJKN,IJKS)
    +
    109  DO k=1,kmax
    +
    110  afft_tmp=afft
    +
    111  kws=(k-1)*kw
    +
    112  CALL spdz2uv(iromb,maxwv,enn1,elonn1,eon,eontop,
    +
    113  & waved(kws+1),wavez(kws+1),
    +
    114  & w(1,1),w(1,2),wtop(1,1),wtop(1,2))
    +
    115  DO j=jb,je
    +
    116  CALL sptranf1(iromb,maxwv,idrt,imax,jmax,j,j,
    +
    117  & eps,epstop,enn1,elonn1,eon,eontop,
    +
    118  & afft_tmp,clat(j),slat(j),wlat(j),
    +
    119  & pln(1,j),plntop(1,j),mp,
    +
    120  & w(1,1),wtop(1,1),g(1,1,1),idir)
    +
    121  CALL sptranf1(iromb,maxwv,idrt,imax,jmax,j,j,
    +
    122  & eps,epstop,enn1,elonn1,eon,eontop,
    +
    123  & afft_tmp,clat(j),slat(j),wlat(j),
    +
    124  & pln(1,j),plntop(1,j),mp,
    +
    125  & w(1,2),wtop(1,2),g(1,1,2),idir)
    +
    126  IF(ip.EQ.1.AND.is.EQ.1) THEN
    +
    127  DO i=1,imax
    +
    128  ijkn=i+(j-jb)*jn+(k-1)*kg
    +
    129  ijks=i+(j-jb)*js+(k-1)*kg
    +
    130  gridun(ijkn)=g(i,1,1)
    +
    131  gridus(ijks)=g(i,2,1)
    +
    132  gridvn(ijkn)=g(i,1,2)
    +
    133  gridvs(ijks)=g(i,2,2)
    +
    134  ENDDO
    +
    135  ELSE
    +
    136  DO i=1,imax
    +
    137  ijkn=mod(i+ip-2,imax)*is+(j-jb)*jn+(k-1)*kg+1
    +
    138  ijks=mod(i+ip-2,imax)*is+(j-jb)*js+(k-1)*kg+1
    +
    139  gridun(ijkn)=g(i,1,1)
    +
    140  gridus(ijks)=g(i,2,1)
    +
    141  gridvn(ijkn)=g(i,1,2)
    +
    142  gridvs(ijks)=g(i,2,2)
    +
    143  ENDDO
    +
    144  ENDIF
    +
    145  ENDDO
    +
    146  ENDDO
    +
    147 
    +
    148 C TRANSFORM GRID TO WAVE
    +
    149  ELSE
    +
    150 C$OMP PARALLEL DO PRIVATE(AFFT_TMP,KWS,W,WTOP,G,IJKN,IJKS,WINC)
    +
    151  DO k=1,kmax
    +
    152  afft_tmp=afft
    +
    153  kws=(k-1)*kw
    +
    154  w=0
    +
    155  wtop=0
    +
    156  DO j=jb,je
    +
    157  IF(wlat(j).GT.0.) THEN
    +
    158  IF(ip.EQ.1.AND.is.EQ.1) THEN
    +
    159  DO i=1,imax
    +
    160  ijkn=i+(j-jb)*jn+(k-1)*kg
    +
    161  ijks=i+(j-jb)*js+(k-1)*kg
    +
    162  g(i,1,1)=gridun(ijkn)/clat(j)**2
    +
    163  g(i,2,1)=gridus(ijks)/clat(j)**2
    +
    164  g(i,1,2)=gridvn(ijkn)/clat(j)**2
    +
    165  g(i,2,2)=gridvs(ijks)/clat(j)**2
    +
    166  ENDDO
    +
    167  ELSE
    +
    168  DO i=1,imax
    +
    169  ijkn=mod(i+ip-2,imax)*is+(j-jb)*jn+(k-1)*kg+1
    +
    170  ijks=mod(i+ip-2,imax)*is+(j-jb)*js+(k-1)*kg+1
    +
    171  g(i,1,1)=gridun(ijkn)/clat(j)**2
    +
    172  g(i,2,1)=gridus(ijks)/clat(j)**2
    +
    173  g(i,1,2)=gridvn(ijkn)/clat(j)**2
    +
    174  g(i,2,2)=gridvs(ijks)/clat(j)**2
    +
    175  ENDDO
    +
    176  ENDIF
    +
    177  CALL sptranf1(iromb,maxwv,idrt,imax,jmax,j,j,
    +
    178  & eps,epstop,enn1,elonn1,eon,eontop,
    +
    179  & afft_tmp,clat(j),slat(j),wlat(j),
    +
    180  & pln(1,j),plntop(1,j),mp,
    +
    181  & w(1,1),wtop(1,1),g(1,1,1),idir)
    +
    182  CALL sptranf1(iromb,maxwv,idrt,imax,jmax,j,j,
    +
    183  & eps,epstop,enn1,elonn1,eon,eontop,
    +
    184  & afft_tmp,clat(j),slat(j),wlat(j),
    +
    185  & pln(1,j),plntop(1,j),mp,
    +
    186  & w(1,2),wtop(1,2),g(1,1,2),idir)
    +
    187  ENDIF
    +
    188  ENDDO
    +
    189  CALL spuv2dz(iromb,maxwv,enn1,elonn1,eon,eontop,
    +
    190  & w(1,1),w(1,2),wtop(1,1),wtop(1,2),
    +
    191  & winc(1,1),winc(1,2))
    +
    192  waved(kws+1:kws+2*mx)=waved(kws+1:kws+2*mx)+winc(1:2*mx,1)
    +
    193  wavez(kws+1:kws+2*mx)=wavez(kws+1:kws+2*mx)+winc(1:2*mx,2)
    +
    194  ENDDO
    +
    195  ENDIF
    +
    196  END
    +
    subroutine spdz2uv(I, M, ENN1, ELONN1, EON, EONTOP, D, Z, U, V, UTOP, VTOP)
    Computes the wind components from divergence and vorticity in spectral space.
    Definition: spdz2uv.f:49
    +
    subroutine sptranf0(IROMB, MAXWV, IDRT, IMAX, JMAX, JB, JE, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP, AFFT, CLAT, SLAT, WLAT, PLN, PLNTOP)
    This subprogram performs an initialization for subprogram sptranf().
    Definition: sptranf0.f:37
    +
    subroutine sptranf1(IROMB, MAXWV, IDRT, IMAX, JMAX, JB, JE, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP, AFFT, CLAT, SLAT, WLAT, PLN, PLNTOP, MP, W, WTOP, G, IDIR)
    This subprogram performs an single latitude transform for subprogram sptranf().
    Definition: sptranf1.f:44
    +
    subroutine sptranfv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IP, IS, JN, JS, KW, KG, JB, JE, JC, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
    Definition: sptranfv.f:83
    +
    subroutine spuv2dz(I, M, ENN1, ELONN1, EON, EONTOP, U, V, UTOP, VTOP, D, Z)
    Computes the divergence and vorticity from wind components in spectral space.
    Definition: spuv2dz.f:49
    +
    +
    + + + + diff --git a/ver-5.1.0/sptranv_8f.html b/ver-5.1.0/sptranv_8f.html new file mode 100644 index 00000000..c95dd51c --- /dev/null +++ b/ver-5.1.0/sptranv_8f.html @@ -0,0 +1,349 @@ + + + + + + + +NCEPLIBS-ip: sptranv.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptranv.f File Reference
    +
    +
    + +

    Perform a vector spherical transform. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptranv (IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
     This subprogram performs a spherical transform between spectral coefficients of divergences and curls and vector fields on a global cylindrical grid. More...
     
    +

    Detailed Description

    +

    Perform a vector spherical transform.

    +

    +Program History Log

    + + + + + + + +
    Date Programmer Comments
    96-02-29 IREDELL Initial.
    1998-12-15 IREDELL Generic fft used, openmp directives inserted
    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition in file sptranv.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptranv()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptranv ( IROMB,
     MAXWV,
     IDRT,
     IMAX,
     JMAX,
     KMAX,
     IPRIME,
     ISKIP,
     JNSKIP,
     JSSKIP,
     KWSKIP,
     KGSKIP,
     JBEG,
     JEND,
     JCPU,
    real, dimension(*) WAVED,
    real, dimension(*) WAVEZ,
    real, dimension(*) GRIDUN,
    real, dimension(*) GRIDUS,
    real, dimension(*) GRIDVN,
    real, dimension(*) GRIDVS,
     IDIR 
    )
    +
    + +

    This subprogram performs a spherical transform between spectral coefficients of divergences and curls and vector fields on a global cylindrical grid.

    +

    The wave-space can be either triangular or rhomboidal.

    +

    The grid-space can be either an equally-spaced grid (with or without pole points) or a Gaussian grid. the wave and grid fields may have general indexing, but each wave field is in sequential 'ibm order', i.e. with zonal wavenumber as the slower index.

    +

    Transforms are done in latitude pairs for efficiency; thus grid arrays for each hemisphere must be passed. If so requested, just a subset of the latitude pairs may be transformed in each invocation of the subprogram.

    +

    The transforms are all multiprocessed over latitude except the transform from fourier to spectral is multiprocessed over zonal wavenumber to ensure reproducibility.

    +

    Transform several fields at a time to improve vectorization. Subprogram can be called from a multiprocessing environment.

    +

    Minimum grid dimensions for unaliased transforms to spectral:

    + + + + + + + + + + + + + + + + +
    DIMENSION LINEAR QUADRATIC
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + + +
    IROMBSPECTRAL DOMAIN SHAPE (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    MAXWVSPECTRAL TRUNCATION
    IDRTGRID IDENTIFIER
      +
    • IDRT=4 FOR GAUSSIAN GRID,
    • +
    • IDRT=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    • +
    • IDRT=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES
    • +
    +
    IMAXEVEN NUMBER OF LONGITUDES.
    JMAXNUMBER OF LATITUDES.
    KMAXNUMBER OF FIELDS TO TRANSFORM.
    IPRIMELONGITUDE INDEX FOR THE PRIME MERIDIAN. (DEFAULTS TO 1 IF IPRIME=0)
    ISKIPSKIP NUMBER BETWEEN LONGITUDES (DEFAULTS TO 1 IF ISKIP=0)
    JNSKIPSKIP NUMBER BETWEEN N.H. LATITUDES FROM NORTH (DEFAULTS TO IMAX IF JNSKIP=0)
    JSSKIPSKIP NUMBER BETWEEN S.H. LATITUDES FROM SOUTH (DEFAULTS TO -IMAX IF JSSKIP=0)
    KWSKIPSKIP NUMBER BETWEEN WAVE FIELDS (DEFAULTS TO (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0)
    KGSKIPSKIP NUMBER BETWEEN GRID FIELDS (DEFAULTS TO IMAX*JMAX IF KGSKIP=0)
    JBEGLATITUDE INDEX (FROM POLE) TO BEGIN TRANSFORM
      +
    • DEFAULTS TO 1 IF JBEG=0
    • +
    • IF JBEG=0 AND IDIR<0, WAVE IS ZEROED BEFORE TRANSFORM
    • +
    +
    JENDLATITUDE INDEX (FROM POLE) TO END TRANSFORM (DEFAULTS TO (JMAX+1)/2 IF JEND=0)
    JCPUNUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    [out]WAVED(*) WAVE DIVERGENCE FIELDS IF IDIR>0 [WAVED=(D(GRIDU)/DLAM+D(CLAT*GRIDV)/DPHI)/(CLAT*RERTH)]
    [out]WAVEZ(*) WAVE VORTICITY FIELDS IF IDIR>0 [WAVEZ=(D(GRIDV)/DLAM-D(CLAT*GRIDU)/DPHI)/(CLAT*RERTH)]
    [out]GRIDUNN.H. GRID U-WINDS (STARTING AT JBEG) IF IDIR<0
    [out]GRIDUSS.H. GRID U-WINDS (STARTING AT JBEG) IF IDIR<0
    [out]GRIDVNN.H. GRID V-WINDS (STARTING AT JBEG) IF IDIR<0
    [out]GRIDVSS.H. GRID V-WINDS (STARTING AT JBEG) IF IDIR<0
    IDIRTRANSFORM FLAG
      +
    • IDIR>0 FOR WAVE TO GRID,
    • +
    • IDIR<0 FOR GRID TO WAVE
    • +
    +
    +
    +
    + +

    Definition at line 87 of file sptranv.f.

    + +

    References ncpus(), and sptranfv().

    + +

    Referenced by sptrand(), sptrungv(), sptrunmv(), sptrunsv(), and sptrunv().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptranv_8f.js b/ver-5.1.0/sptranv_8f.js new file mode 100644 index 00000000..ef79c537 --- /dev/null +++ b/ver-5.1.0/sptranv_8f.js @@ -0,0 +1,4 @@ +var sptranv_8f = +[ + [ "sptranv", "sptranv_8f.html#a7d6aaa3ed70df1dfaf8dd4443b7190c1", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptranv_8f_source.html b/ver-5.1.0/sptranv_8f_source.html new file mode 100644 index 00000000..1493c46d --- /dev/null +++ b/ver-5.1.0/sptranv_8f_source.html @@ -0,0 +1,228 @@ + + + + + + + +NCEPLIBS-ip: sptranv.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptranv.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Perform a vector spherical transform.
    +
    3 C>
    +
    4 C> ### Program History Log
    +
    5 C> Date | Programmer | Comments
    +
    6 C> -----|------------|---------
    +
    7 C> 96-02-29 | IREDELL | Initial.
    +
    8 C> 1998-12-15 | IREDELL | Generic fft used, openmp directives inserted
    +
    9 C>
    +
    10 C> @author IREDELL @date 96-02-29
    +
    11 
    +
    12 C> This subprogram performs a spherical transform
    +
    13 C> between spectral coefficients of divergences and curls
    +
    14 C> and vector fields on a global cylindrical grid.
    +
    15 C>
    +
    16 C> The wave-space can be either triangular or rhomboidal.
    +
    17 C>
    +
    18 C> The grid-space can be either an equally-spaced grid
    +
    19 C> (with or without pole points) or a Gaussian grid.
    +
    20 C> the wave and grid fields may have general indexing,
    +
    21 C> but each wave field is in sequential 'ibm order',
    +
    22 C> i.e. with zonal wavenumber as the slower index.
    +
    23 C>
    +
    24 C> Transforms are done in latitude pairs for efficiency;
    +
    25 C> thus grid arrays for each hemisphere must be passed.
    +
    26 C> If so requested, just a subset of the latitude pairs
    +
    27 C> may be transformed in each invocation of the subprogram.
    +
    28 C>
    +
    29 C> The transforms are all multiprocessed over latitude except
    +
    30 C> the transform from fourier to spectral is multiprocessed
    +
    31 C> over zonal wavenumber to ensure reproducibility.
    +
    32 C>
    +
    33 C> Transform several fields at a time to improve vectorization.
    +
    34 C> Subprogram can be called from a multiprocessing environment.
    +
    35 C>
    +
    36 C> Minimum grid dimensions for unaliased transforms to spectral:
    +
    37 C> DIMENSION |LINEAR |QUADRATIC
    +
    38 C> ----------------------- |--------- |-------------
    +
    39 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    +
    40 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    +
    41 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    +
    42 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    +
    43 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    +
    44 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    +
    45 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    +
    46 C>
    +
    47 C> @param IROMB SPECTRAL DOMAIN SHAPE
    +
    48 C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    +
    49 C> @param MAXWV SPECTRAL TRUNCATION
    +
    50 C> @param IDRT GRID IDENTIFIER
    +
    51 C> - IDRT=4 FOR GAUSSIAN GRID,
    +
    52 C> - IDRT=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    53 C> - IDRT=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES
    +
    54 C> @param IMAX EVEN NUMBER OF LONGITUDES.
    +
    55 C> @param JMAX NUMBER OF LATITUDES.
    +
    56 C> @param KMAX NUMBER OF FIELDS TO TRANSFORM.
    +
    57 C> @param IPRIME LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    +
    58 C> (DEFAULTS TO 1 IF IPRIME=0)
    +
    59 C> @param ISKIP SKIP NUMBER BETWEEN LONGITUDES
    +
    60 C> (DEFAULTS TO 1 IF ISKIP=0)
    +
    61 C> @param JNSKIP SKIP NUMBER BETWEEN N.H. LATITUDES FROM NORTH
    +
    62 C> (DEFAULTS TO IMAX IF JNSKIP=0)
    +
    63 C> @param JSSKIP SKIP NUMBER BETWEEN S.H. LATITUDES FROM SOUTH
    +
    64 C> (DEFAULTS TO -IMAX IF JSSKIP=0)
    +
    65 C> @param KWSKIP SKIP NUMBER BETWEEN WAVE FIELDS
    +
    66 C> (DEFAULTS TO (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0)
    +
    67 C> @param KGSKIP SKIP NUMBER BETWEEN GRID FIELDS
    +
    68 C> (DEFAULTS TO IMAX*JMAX IF KGSKIP=0)
    +
    69 C> @param JBEG LATITUDE INDEX (FROM POLE) TO BEGIN TRANSFORM
    +
    70 C> - DEFAULTS TO 1 IF JBEG=0
    +
    71 C> - IF JBEG=0 AND IDIR<0, WAVE IS ZEROED BEFORE TRANSFORM
    +
    72 C> @param JEND LATITUDE INDEX (FROM POLE) TO END TRANSFORM
    +
    73 C> (DEFAULTS TO (JMAX+1)/2 IF JEND=0)
    +
    74 C> @param JCPU NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    +
    75 C> @param[out] WAVED (*) WAVE DIVERGENCE FIELDS IF IDIR>0
    +
    76 C> [WAVED=(D(GRIDU)/DLAM+D(CLAT*GRIDV)/DPHI)/(CLAT*RERTH)]
    +
    77 C> @param[out] WAVEZ (*) WAVE VORTICITY FIELDS IF IDIR>0
    +
    78 C> [WAVEZ=(D(GRIDV)/DLAM-D(CLAT*GRIDU)/DPHI)/(CLAT*RERTH)]
    +
    79 C> @param[out] GRIDUN N.H. GRID U-WINDS (STARTING AT JBEG) IF IDIR<0
    +
    80 C> @param[out] GRIDUS S.H. GRID U-WINDS (STARTING AT JBEG) IF IDIR<0
    +
    81 C> @param[out] GRIDVN N.H. GRID V-WINDS (STARTING AT JBEG) IF IDIR<0
    +
    82 C> @param[out] GRIDVS S.H. GRID V-WINDS (STARTING AT JBEG) IF IDIR<0
    +
    83 C> @param IDIR TRANSFORM FLAG
    +
    84 C> - IDIR>0 FOR WAVE TO GRID,
    +
    85 C> - IDIR<0 FOR GRID TO WAVE
    +
    86 C>
    +
    87  SUBROUTINE sptranv(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,
    +
    88  & IPRIME,ISKIP,JNSKIP,JSSKIP,KWSKIP,KGSKIP,
    +
    89  & JBEG,JEND,JCPU,
    +
    90  & WAVED,WAVEZ,GRIDUN,GRIDUS,GRIDVN,GRIDVS,IDIR)
    +
    91 
    +
    92  REAL WAVED(*),WAVEZ(*),GRIDUN(*),GRIDUS(*),GRIDVN(*),GRIDVS(*)
    +
    93 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    94  MX=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    95  ip=iprime
    +
    96  is=iskip
    +
    97  jn=jnskip
    +
    98  js=jsskip
    +
    99  kw=kwskip
    +
    100  kg=kgskip
    +
    101  jb=jbeg
    +
    102  je=jend
    +
    103  jc=jcpu
    +
    104  IF(ip.EQ.0) ip=1
    +
    105  IF(is.EQ.0) is=1
    +
    106  IF(jn.EQ.0) jn=imax
    +
    107  IF(js.EQ.0) js=-jn
    +
    108  IF(kw.EQ.0) kw=2*mx
    +
    109  IF(kg.EQ.0) kg=imax*jmax
    +
    110  IF(jb.EQ.0) jb=1
    +
    111  IF(je.EQ.0) je=(jmax+1)/2
    +
    112  IF(jc.EQ.0) jc=ncpus()
    +
    113 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    114  IF(idir.LT.0.AND.jbeg.EQ.0) THEN
    +
    115  DO k=1,kmax
    +
    116  kws=(k-1)*kw
    +
    117  waved(kws+1:kws+2*mx)=0
    +
    118  wavez(kws+1:kws+2*mx)=0
    +
    119  ENDDO
    +
    120  ENDIF
    +
    121 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    122  CALL sptranfv(iromb,maxwv,idrt,imax,jmax,kmax,
    +
    123  & ip,is,jn,js,kw,kg,jb,je,jc,
    +
    124  & waved,wavez,gridun,gridus,gridvn,gridvs,idir)
    +
    125 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    126  END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    +
    subroutine sptranfv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IP, IS, JN, JS, KW, KG, JB, JE, JC, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
    Definition: sptranfv.f:83
    +
    subroutine sptranv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
    Definition: sptranv.f:91
    +
    +
    + + + + diff --git a/ver-5.1.0/sptrun_8f.html b/ver-5.1.0/sptrun_8f.html new file mode 100644 index 00000000..fcaf1b2b --- /dev/null +++ b/ver-5.1.0/sptrun_8f.html @@ -0,0 +1,317 @@ + + + + + + + +NCEPLIBS-ip: sptrun.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptrun.f File Reference
    +
    +
    + +

    Truncate gridded scalar fields. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptrun (IROMB, MAXWV, IDRTI, IMAXI, JMAXI, IDRTO, IMAXO, JMAXO, KMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, ISKIPO, JSKIPO, KSKIPO, JCPU, GRIDI, GRIDO)
     This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields to a possibly different global cylindrical grid. More...
     
    +

    Detailed Description

    +

    Truncate gridded scalar fields.

    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition in file sptrun.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptrun()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptrun ( IROMB,
     MAXWV,
     IDRTI,
     IMAXI,
     JMAXI,
     IDRTO,
     IMAXO,
     JMAXO,
     KMAX,
     IPRIME,
     ISKIPI,
     JSKIPI,
     KSKIPI,
     ISKIPO,
     JSKIPO,
     KSKIPO,
     JCPU,
    real, dimension(*) GRIDI,
    real, dimension(*) GRIDO 
    )
    +
    + +

    This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields to a possibly different global cylindrical grid.

    +

    The wave-space can be either triangular or rhomboidal. either grid-space can be either an equally-spaced grid (with or without pole points) or a Gaussian grid. the grid fields may have general indexing. the transforms are all multiprocessed. Transform several fields at a time to improve vectorization. Subprogram can be called from a multiprocessing environment.

    +

    Remarks: Minimum grid dimensions for unaliased transforms to spectral:

    + + + + + + + + + + + + + + + + +
    Dimension Linear Quadratic
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + +
    IROMBSpectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVSpectral truncation
    IDRTIInput grid identifier
      +
    • IDRTI=4 for Gaussian grid
    • +
    • IDRTI=0 for equally-spaced grid including poles
    • +
    • IDRTI=256 for equally-spaced grid excluding poles
    • +
    +
    IMAXIEven number of input longitudes
    JMAXINumber of input latitudes
    IDRTOOutput grid identifier
      +
    • IDRTO=4 for Gaussian grid
    • +
    • IDRTO=0 for equally-spaced grid including poles
    • +
    • IDRTO=256 for equally-spaced grid excluding poles
    • +
    +
    IMAXOEven number of output longitudes
    JMAXONumber of output latitudes
    KMAXNumber of fields to transform
    IPRIMEInput longitude index for the prime meridian.
      +
    • Defaults to 1 if IPRIME=0
    • +
    • Output longitude index for prime meridian assumed 1
    • +
    +
    ISKIPISkip number between input longitudes (defaults to 1 if ISKIPI=0)
    JSKIPISkip number between input latitudes from south (defaults to -IMAXI if JSKIPI=0)
    KSKIPISkip number between input grid fields (defaults to IMAXI*JMAXI if KSKIPI=0)
    ISKIPOSkip number between output longitudes (defaults to 1 if ISKIPO=0)
    JSKIPOSkip number between output latitudes from south (defaults to -IMAXO if JSKIPO=0)
    KSKIPOSkip number between output grid fields (defaults to IMAXO*JMAXO if KSKIPO=0)
    JCPUNumber of CPUs over which to multiprocess (defaults to environment NCPUS if JCPU=0)
    GRIDIInput grid fields
    GRIDOOutput grid fields (may overlay input fields if grid shape is appropriate)
    +
    +
    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition at line 55 of file sptrun.f.

    + +

    References ncpus(), and sptran().

    + +

    Referenced by spectral_interp_mod::polates4::polates4_grib1(), and spectral_interp_mod::polates4::polates4_grib2().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptrun_8f.js b/ver-5.1.0/sptrun_8f.js new file mode 100644 index 00000000..0409c09b --- /dev/null +++ b/ver-5.1.0/sptrun_8f.js @@ -0,0 +1,4 @@ +var sptrun_8f = +[ + [ "sptrun", "sptrun_8f.html#a1f04574fbd5018f73b68bd2cd0ffc473", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptrun_8f_source.html b/ver-5.1.0/sptrun_8f_source.html new file mode 100644 index 00000000..3d77bdac --- /dev/null +++ b/ver-5.1.0/sptrun_8f_source.html @@ -0,0 +1,187 @@ + + + + + + + +NCEPLIBS-ip: sptrun.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptrun.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Truncate gridded scalar fields
    +
    3 C> @author IREDELL @date 96-02-29
    +
    4 
    +
    5 C> This subprogram spectrally truncates scalar fields on a global
    +
    6 C> cylindrical grid, returning the fields to a possibly different
    +
    7 C> global cylindrical grid. The wave-space can be either triangular
    +
    8 C> or rhomboidal. either grid-space can be either an equally-spaced
    +
    9 C> grid (with or without pole points) or a Gaussian grid. the grid
    +
    10 C> fields may have general indexing. the transforms are all
    +
    11 C> multiprocessed. Transform several fields at a time to improve
    +
    12 C> vectorization. Subprogram can be called from a multiprocessing
    +
    13 C> environment.
    +
    14 C>
    +
    15 C> Remarks: Minimum grid dimensions for unaliased transforms to spectral:
    +
    16 C> Dimension | Linear | Quadratic
    +
    17 C> ----------------------- | --------- | -------------
    +
    18 C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2
    +
    19 C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1
    +
    20 C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1
    +
    21 C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3
    +
    22 C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3
    +
    23 C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1
    +
    24 C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1
    +
    25 C>
    +
    26 C> @param IROMB Spectral domain shape (0 for triangular, 1 for rhomboidal)
    +
    27 C> @param MAXWV Spectral truncation
    +
    28 C> @param IDRTI Input grid identifier
    +
    29 C> - IDRTI=4 for Gaussian grid
    +
    30 C> - IDRTI=0 for equally-spaced grid including poles
    +
    31 C> - IDRTI=256 for equally-spaced grid excluding poles
    +
    32 C> @param IMAXI Even number of input longitudes
    +
    33 C> @param JMAXI Number of input latitudes
    +
    34 C> @param IDRTO Output grid identifier
    +
    35 C> - IDRTO=4 for Gaussian grid
    +
    36 C> - IDRTO=0 for equally-spaced grid including poles
    +
    37 C> - IDRTO=256 for equally-spaced grid excluding poles
    +
    38 C> @param IMAXO Even number of output longitudes
    +
    39 C> @param JMAXO Number of output latitudes
    +
    40 C> @param KMAX Number of fields to transform
    +
    41 C> @param IPRIME Input longitude index for the prime meridian.
    +
    42 C> - Defaults to 1 if IPRIME=0
    +
    43 C> - Output longitude index for prime meridian assumed 1
    +
    44 C> @param ISKIPI Skip number between input longitudes (defaults to 1 if ISKIPI=0)
    +
    45 C> @param JSKIPI Skip number between input latitudes from south (defaults to -IMAXI if JSKIPI=0)
    +
    46 C> @param KSKIPI Skip number between input grid fields (defaults to IMAXI*JMAXI if KSKIPI=0)
    +
    47 C> @param ISKIPO Skip number between output longitudes (defaults to 1 if ISKIPO=0)
    +
    48 C> @param JSKIPO Skip number between output latitudes from south (defaults to -IMAXO if JSKIPO=0)
    +
    49 C> @param KSKIPO Skip number between output grid fields (defaults to IMAXO*JMAXO if KSKIPO=0)
    +
    50 C> @param JCPU Number of CPUs over which to multiprocess (defaults to environment NCPUS if JCPU=0)
    +
    51 C> @param GRIDI Input grid fields
    +
    52 C> @param GRIDO Output grid fields (may overlay input fields if grid shape is appropriate)
    +
    53 C>
    +
    54 C> @author IREDELL @date 96-02-29
    +
    55  SUBROUTINE sptrun(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,IDRTO,IMAXO,JMAXO,
    +
    56  & KMAX,IPRIME,ISKIPI,JSKIPI,KSKIPI,
    +
    57  & ISKIPO,JSKIPO,KSKIPO,JCPU,GRIDI,GRIDO)
    +
    58  REAL GRIDI(*),GRIDO(*)
    +
    59  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    60 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    61 C TRANSFORM INPUT GRID TO WAVE
    +
    62  jc=jcpu
    +
    63  IF(jc.EQ.0) jc=ncpus()
    +
    64  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    65  mdim=2*mx+1
    +
    66  jn=-jskipi
    +
    67  IF(jn.EQ.0) jn=imaxi
    +
    68  js=-jn
    +
    69  inp=(jmaxi-1)*max(0,-jn)+1
    +
    70  isp=(jmaxi-1)*max(0,-js)+1
    +
    71  CALL sptran(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    +
    72  & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    +
    73  & w,gridi(inp),gridi(isp),-1)
    +
    74 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    75 C TRANSFORM WAVE TO OUTPUT
    +
    76  jn=-jskipo
    +
    77  IF(jn.EQ.0) jn=imaxo
    +
    78  js=-jn
    +
    79  inp=(jmaxo-1)*max(0,-jn)+1
    +
    80  isp=(jmaxo-1)*max(0,-js)+1
    +
    81  CALL sptran(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
    +
    82  & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
    +
    83  & w,grido(inp),grido(isp),1)
    +
    84 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    85  END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    +
    subroutine sptran(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDN, GRIDS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition: sptran.f:88
    +
    subroutine sptrun(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, IDRTO, IMAXO, JMAXO, KMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, ISKIPO, JSKIPO, KSKIPO, JCPU, GRIDI, GRIDO)
    This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields...
    Definition: sptrun.f:58
    +
    +
    + + + + diff --git a/ver-5.1.0/sptrund_8f.html b/ver-5.1.0/sptrund_8f.html new file mode 100644 index 00000000..6fe8896c --- /dev/null +++ b/ver-5.1.0/sptrund_8f.html @@ -0,0 +1,318 @@ + + + + + + + +NCEPLIBS-ip: sptrund.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptrund.f File Reference
    +
    +
    + +

    Spectrally truncate to gradients. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptrund (IROMB, MAXWV, IDRTI, IMAXI, JMAXI, IDRTO, IMAXO, JMAXO, KMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, ISKIPO, JSKIPO, KSKIPO, JCPU, GRID, GRIDMN, GRIDX, GRIDY)
     THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR MEANS AND GRADIENTS TO A POSSIBLY DIFFERENT GLOBAL CYLINDRICAL GRID. More...
     
    +

    Detailed Description

    +

    Spectrally truncate to gradients.

    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition in file sptrund.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptrund()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptrund ( IROMB,
     MAXWV,
     IDRTI,
     IMAXI,
     JMAXI,
     IDRTO,
     IMAXO,
     JMAXO,
     KMAX,
     IPRIME,
     ISKIPI,
     JSKIPI,
     KSKIPI,
     ISKIPO,
     JSKIPO,
     KSKIPO,
     JCPU,
    real, dimension(*) GRID,
    real, dimension(*) GRIDMN,
    real, dimension(*) GRIDX,
    real, dimension(*) GRIDY 
    )
    +
    + +

    THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR MEANS AND GRADIENTS TO A POSSIBLY DIFFERENT GLOBAL CYLINDRICAL GRID.

    +

    THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL. EITHER GRID-SPACE CAN BE EITHER AN EQUALLY-SPACED GRID (WITH OR WITHOUT POLE POINTS) OR A GAUSSIAN GRID. THE GRID FIELDS MAY HAVE GENERAL INDEXING. THE TRANSFORMS ARE ALL MULTIPROCESSED. OVER ZONAL WAVENUMBER TO ENSURE REPRODUCIBILITY. TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION. SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + +
    IROMB- INTEGER SPECTRAL DOMAIN SHAPE (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    MAXWV- INTEGER SPECTRAL TRUNCATION
    IDRTI- INTEGER INPUT GRID IDENTIFIER (IDRTI=4 FOR GAUSSIAN GRID, IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    IMAXI- INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    JMAXI- INTEGER NUMBER OF INPUT LATITUDES.
    IDRTO- INTEGER OUTPUT GRID IDENTIFIER (IDRTO=4 FOR GAUSSIAN GRID, IDRTO=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, IDRTO=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    IMAXO- INTEGER EVEN NUMBER OF OUTPUT LONGITUDES.
    JMAXO- INTEGER NUMBER OF OUTPUT LATITUDES.
    KMAX- INTEGER NUMBER OF FIELDS TO TRANSFORM.
    IPRIME- INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN. (DEFAULTS TO 1 IF IPRIME=0) (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    ISKIPI- INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES (DEFAULTS TO 1 IF ISKIPI=0)
    JSKIPI- INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH (DEFAULTS TO -IMAXI IF JSKIPI=0)
    KSKIPI- INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    ISKIPO- INTEGER SKIP NUMBER BETWEEN OUTPUT LONGITUDES (DEFAULTS TO 1 IF ISKIPO=0)
    JSKIPO- INTEGER SKIP NUMBER BETWEEN OUTPUT LATITUDES FROM SOUTH (DEFAULTS TO -IMAXO IF JSKIPO=0)
    KSKIPO- INTEGER SKIP NUMBER BETWEEN OUTPUT GRID FIELDS (DEFAULTS TO IMAXO*JMAXO IF KSKIPO=0)
    JCPU- INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    GRID- REAL (*) INPUT GRID FIELDS
    GRIDMN- REAL (KMAX) OUTPUT GLOBAL MEANS
    GRIDX- REAL (*) OUTPUT X-GRADIENTS
    GRIDY- REAL (*) OUTPUT Y-GRADIENTS
    +
    +
    +

    SUBPROGRAMS CALLED:

      +
    • SPTRAN PERFORM A SCALAR SPHERICAL TRANSFORM
    • +
    • SPTRAND PERFORM A GRADIENT SPHERICAL TRANSFORM
    • +
    • NCPUS GETS ENVIRONMENT NUMBER OF CPUS
    • +
    +

    REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:

    + + + + + + + + + + + + + + + + +
    DIMENSION LINEAR QUADRATIC
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    + +

    Definition at line 71 of file sptrund.f.

    + +

    References ncpus(), sptran(), and sptrand().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptrund_8f.js b/ver-5.1.0/sptrund_8f.js new file mode 100644 index 00000000..20c45793 --- /dev/null +++ b/ver-5.1.0/sptrund_8f.js @@ -0,0 +1,4 @@ +var sptrund_8f = +[ + [ "sptrund", "sptrund_8f.html#a2636d99e658dfabd4b85f15a76fca480", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptrund_8f_source.html b/ver-5.1.0/sptrund_8f_source.html new file mode 100644 index 00000000..a6b7d3d2 --- /dev/null +++ b/ver-5.1.0/sptrund_8f_source.html @@ -0,0 +1,208 @@ + + + + + + + +NCEPLIBS-ip: sptrund.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptrund.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C>
    +
    3 C> Spectrally truncate to gradients
    +
    4 C> @author IREDELL @date 96-02-29
    +
    5 
    +
    6 C> THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS
    +
    7 C> ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR MEANS AND
    +
    8 C> GRADIENTS TO A POSSIBLY DIFFERENT GLOBAL CYLINDRICAL GRID.
    +
    9 C> THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL.
    +
    10 C> EITHER GRID-SPACE CAN BE EITHER AN EQUALLY-SPACED GRID
    +
    11 C> (WITH OR WITHOUT POLE POINTS) OR A GAUSSIAN GRID.
    +
    12 C> THE GRID FIELDS MAY HAVE GENERAL INDEXING.
    +
    13 C> THE TRANSFORMS ARE ALL MULTIPROCESSED.
    +
    14 C> OVER ZONAL WAVENUMBER TO ENSURE REPRODUCIBILITY.
    +
    15 C> TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION.
    +
    16 C> SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
    +
    17 C>
    +
    18 C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    +
    19 C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    +
    20 C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    +
    21 C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    +
    22 C> (IDRTI=4 FOR GAUSSIAN GRID,
    +
    23 C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    24 C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    +
    25 C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    +
    26 C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    +
    27 C> @param IDRTO - INTEGER OUTPUT GRID IDENTIFIER
    +
    28 C> (IDRTO=4 FOR GAUSSIAN GRID,
    +
    29 C> IDRTO=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    30 C> IDRTO=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    +
    31 C> @param IMAXO - INTEGER EVEN NUMBER OF OUTPUT LONGITUDES.
    +
    32 C> @param JMAXO - INTEGER NUMBER OF OUTPUT LATITUDES.
    +
    33 C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    +
    34 C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    +
    35 C> (DEFAULTS TO 1 IF IPRIME=0)
    +
    36 C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    +
    37 C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    +
    38 C> (DEFAULTS TO 1 IF ISKIPI=0)
    +
    39 C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    +
    40 C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    +
    41 C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    +
    42 C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    +
    43 C> @param ISKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LONGITUDES
    +
    44 C> (DEFAULTS TO 1 IF ISKIPO=0)
    +
    45 C> @param JSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LATITUDES FROM SOUTH
    +
    46 C> (DEFAULTS TO -IMAXO IF JSKIPO=0)
    +
    47 C> @param KSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT GRID FIELDS
    +
    48 C> (DEFAULTS TO IMAXO*JMAXO IF KSKIPO=0)
    +
    49 C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    +
    50 C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    +
    51 C> @param GRID - REAL (*) INPUT GRID FIELDS
    +
    52 C> @param GRIDMN - REAL (KMAX) OUTPUT GLOBAL MEANS
    +
    53 C> @param GRIDX - REAL (*) OUTPUT X-GRADIENTS
    +
    54 C> @param GRIDY - REAL (*) OUTPUT Y-GRADIENTS
    +
    55 C>
    +
    56 C> SUBPROGRAMS CALLED:
    +
    57 C> - SPTRAN PERFORM A SCALAR SPHERICAL TRANSFORM
    +
    58 C> - SPTRAND PERFORM A GRADIENT SPHERICAL TRANSFORM
    +
    59 C> - NCPUS GETS ENVIRONMENT NUMBER OF CPUS
    +
    60 C>
    +
    61 C> REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:
    +
    62 C> DIMENSION |LINEAR |QUADRATIC
    +
    63 C> ----------------------- |--------- |-------------
    +
    64 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    +
    65 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    +
    66 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    +
    67 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    +
    68 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    +
    69 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    +
    70 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    +
    71  SUBROUTINE sptrund(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,
    +
    72  & IDRTO,IMAXO,JMAXO,KMAX,
    +
    73  & IPRIME,ISKIPI,JSKIPI,KSKIPI,
    +
    74  & ISKIPO,JSKIPO,KSKIPO,JCPU,GRID,
    +
    75  & GRIDMN,GRIDX,GRIDY)
    +
    76 
    +
    77  REAL GRID(*),GRIDX(*),GRIDY(*),GRIDMN(*)
    +
    78  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    79 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    80 C TRANSFORM INPUT GRID TO WAVE
    +
    81  jc=jcpu
    +
    82  IF(jc.EQ.0) jc=ncpus()
    +
    83  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    84  mdim=2*mx+1
    +
    85  jn=-jskipi
    +
    86  IF(jn.EQ.0) jn=imaxi
    +
    87  js=-jn
    +
    88  inp=(jmaxi-1)*max(0,-jn)+1
    +
    89  isp=(jmaxi-1)*max(0,-js)+1
    +
    90  CALL sptran(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    +
    91  & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    +
    92  & w,grid(inp),grid(isp),-1)
    +
    93 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    94 C TRANSFORM WAVE TO OUTPUT GRADIENTS
    +
    95  jn=-jskipo
    +
    96  IF(jn.EQ.0) jn=imaxo
    +
    97  js=-jn
    +
    98  inp=(jmaxo-1)*max(0,-jn)+1
    +
    99  isp=(jmaxo-1)*max(0,-js)+1
    +
    100  CALL sptrand(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
    +
    101  & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
    +
    102  & w,gridmn,
    +
    103  & gridx(inp),gridx(isp),gridy(inp),gridy(isp),1)
    +
    104 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    105  END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    +
    subroutine sptran(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDN, GRIDS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition: sptran.f:88
    +
    subroutine sptrand(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDMN, GRIDXN, GRIDXS, GRIDYN, GRIDYS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar fields and the...
    Definition: sptrand.f:92
    +
    subroutine sptrund(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, IDRTO, IMAXO, JMAXO, KMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, ISKIPO, JSKIPO, KSKIPO, JCPU, GRID, GRIDMN, GRIDX, GRIDY)
    THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR MEAN...
    Definition: sptrund.f:76
    +
    +
    + + + + diff --git a/ver-5.1.0/sptrung_8f.html b/ver-5.1.0/sptrung_8f.html new file mode 100644 index 00000000..2332b302 --- /dev/null +++ b/ver-5.1.0/sptrung_8f.html @@ -0,0 +1,306 @@ + + + + + + + +NCEPLIBS-ip: sptrung.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptrung.f File Reference
    +
    +
    + +

    Spectrally interpolate scalars to stations. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptrung (IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NRSKIP, NGSKIP, JCPU, RLAT, RLON, GRIDI, GP)
     This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields to specified sets of station points on the globe. More...
     
    +

    Detailed Description

    +

    Spectrally interpolate scalars to stations.

    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition in file sptrung.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptrung()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptrung ( IROMB,
     MAXWV,
     IDRTI,
     IMAXI,
     JMAXI,
     KMAX,
     NMAX,
     IPRIME,
     ISKIPI,
     JSKIPI,
     KSKIPI,
     KGSKIP,
     NRSKIP,
     NGSKIP,
     JCPU,
    real, dimension(*) RLAT,
    real, dimension(*) RLON,
    real, dimension(*) GRIDI,
    real, dimension(*) GP 
    )
    +
    + +

    This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields to specified sets of station points on the globe.

    +

    The wave-space can be either triangular or rhomboidal. The grid-space can be either an equally-spaced grid (with or without pole points) or a Gaussian grid. The grid and point fields may have general indexing. The transforms are all multiprocessed. Transform several fields at a time to improve vectorization. Subprogram can be called from a multiprocessing environment.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + +
    IROMB- INTEGER SPECTRAL DOMAIN SHAPE (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    MAXWV- INTEGER SPECTRAL TRUNCATION
    IDRTI- INTEGER INPUT GRID IDENTIFIER (IDRTI=4 FOR GAUSSIAN GRID, IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    IMAXI- INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    JMAXI- INTEGER NUMBER OF INPUT LATITUDES.
    KMAX- INTEGER NUMBER OF FIELDS TO TRANSFORM.
    NMAX- INTEGER NUMBER OF STATION POINTS TO RETURN
    IPRIME- INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN. (DEFAULTS TO 1 IF IPRIME=0) (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    ISKIPI- INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES (DEFAULTS TO 1 IF ISKIPI=0)
    JSKIPI- INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH (DEFAULTS TO -IMAXI IF JSKIPI=0)
    KSKIPI- INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    KGSKIP- INTEGER SKIP NUMBER BETWEEN STATION POINT SETS (DEFAULTS TO NMAX IF KGSKIP=0)
    NRSKIP- INTEGER SKIP NUMBER BETWEEN STATION LATS AND LONS (DEFAULTS TO 1 IF NRSKIP=0)
    NGSKIP- INTEGER SKIP NUMBER BETWEEN STATION POINTS (DEFAULTS TO 1 IF NGSKIP=0)
    RLAT- REAL (*) STATION LATITUDES IN DEGREES
    RLON- REAL (*) STATION LONGITUDES IN DEGREES
    JCPU- INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    GRIDI- REAL (*) INPUT GRID FIELDS
    [out]GP- REAL (*) STATION POINT SETS
    +
    +
    +

    SUBPROGRAMS CALLED:

      +
    • sptran() Perform a scalar spherical transform
    • +
    • sptgpt() Transform spectral scalar to station points
    • +
    • ncpus() Gets environment number of cpus
    • +
    +

    Minimum grid dimensions for unaliased transforms to spectral:

    + + + + + + + + + + + + + + + + +
    DIMENSION LINEAR QUADRATIC
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    + +

    Definition at line 65 of file sptrung.f.

    + +

    References ncpus(), sptgpt(), and sptran().

    + +

    Referenced by spectral_interp_mod::polates4::polates4_grib1(), and spectral_interp_mod::polates4::polates4_grib2().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptrung_8f.js b/ver-5.1.0/sptrung_8f.js new file mode 100644 index 00000000..2105f854 --- /dev/null +++ b/ver-5.1.0/sptrung_8f.js @@ -0,0 +1,4 @@ +var sptrung_8f = +[ + [ "sptrung", "sptrung_8f.html#af41b64dad4789617a315515ef885912c", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptrung_8f_source.html b/ver-5.1.0/sptrung_8f_source.html new file mode 100644 index 00000000..a23390f1 --- /dev/null +++ b/ver-5.1.0/sptrung_8f_source.html @@ -0,0 +1,193 @@ + + + + + + + +NCEPLIBS-ip: sptrung.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptrung.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C>
    +
    3 C> Spectrally interpolate scalars to stations
    +
    4 C> @author IREDELL @date 96-02-29
    +
    5 
    +
    6 C> This subprogram spectrally truncates scalar fields on a global
    +
    7 C> cylindrical grid, returning the fields to specified sets of
    +
    8 C> station points on the globe. The wave-space can be either
    +
    9 C> triangular or rhomboidal. The grid-space can be either an
    +
    10 C> equally-spaced grid (with or without pole points) or a Gaussian
    +
    11 C> grid. The grid and point fields may have general indexing. The
    +
    12 C> transforms are all multiprocessed. Transform several fields at a
    +
    13 C> time to improve vectorization. Subprogram can be called from a
    +
    14 C> multiprocessing environment.
    +
    15 C>
    +
    16 C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    +
    17 C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    +
    18 C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    +
    19 C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    +
    20 C> (IDRTI=4 FOR GAUSSIAN GRID,
    +
    21 C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    22 C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    +
    23 C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    +
    24 C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    +
    25 C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    +
    26 C> @param NMAX - INTEGER NUMBER OF STATION POINTS TO RETURN
    +
    27 C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    +
    28 C> (DEFAULTS TO 1 IF IPRIME=0)
    +
    29 C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    +
    30 C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    +
    31 C> (DEFAULTS TO 1 IF ISKIPI=0)
    +
    32 C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    +
    33 C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    +
    34 C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    +
    35 C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    +
    36 C> @param KGSKIP - INTEGER SKIP NUMBER BETWEEN STATION POINT SETS
    +
    37 C> (DEFAULTS TO NMAX IF KGSKIP=0)
    +
    38 C> @param NRSKIP - INTEGER SKIP NUMBER BETWEEN STATION LATS AND LONS
    +
    39 C> (DEFAULTS TO 1 IF NRSKIP=0)
    +
    40 C> @param NGSKIP - INTEGER SKIP NUMBER BETWEEN STATION POINTS
    +
    41 C> (DEFAULTS TO 1 IF NGSKIP=0)
    +
    42 C> @param RLAT - REAL (*) STATION LATITUDES IN DEGREES
    +
    43 C> @param RLON - REAL (*) STATION LONGITUDES IN DEGREES
    +
    44 C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    +
    45 C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    +
    46 C> @param GRIDI - REAL (*) INPUT GRID FIELDS
    +
    47 C> @param[out] GP - REAL (*) STATION POINT SETS
    +
    48 C>
    +
    49 C> SUBPROGRAMS CALLED:
    +
    50 C> - sptran() Perform a scalar spherical transform
    +
    51 C> - sptgpt() Transform spectral scalar to station points
    +
    52 C> - ncpus() Gets environment number of cpus
    +
    53 C>
    +
    54 C> Minimum grid dimensions for unaliased transforms to spectral:
    +
    55 C> DIMENSION |LINEAR |QUADRATIC
    +
    56 C> ----------------------- |--------- |-------------
    +
    57 C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2
    +
    58 C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1
    +
    59 C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1
    +
    60 C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3
    +
    61 C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3
    +
    62 C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1
    +
    63 C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1
    +
    64 C>
    +
    65  SUBROUTINE sptrung(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,NMAX,
    +
    66  & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP,
    +
    67  & NRSKIP,NGSKIP,JCPU,RLAT,RLON,GRIDI,GP)
    +
    68 
    +
    69  REAL RLAT(*),RLON(*),GRIDI(*),GP(*)
    +
    70  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    71 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    72 C TRANSFORM INPUT GRID TO WAVE
    +
    73  jc=jcpu
    +
    74  IF(jc.EQ.0) jc=ncpus()
    +
    75  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    76  mdim=2*mx+1
    +
    77  jn=-jskipi
    +
    78  IF(jn.EQ.0) jn=imaxi
    +
    79  js=-jn
    +
    80  inp=(jmaxi-1)*max(0,-jn)+1
    +
    81  isp=(jmaxi-1)*max(0,-js)+1
    +
    82  CALL sptran(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    +
    83  & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    +
    84  & w,gridi(inp),gridi(isp),-1)
    +
    85 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    86 C TRANSFORM WAVE TO OUTPUT
    +
    87  CALL sptgpt(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
    +
    88  & rlat,rlon,w,gp)
    +
    89 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    90  END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    +
    subroutine sptgpt(IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVE, GP)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to spe...
    Definition: sptgpt.f:51
    +
    subroutine sptran(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDN, GRIDS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition: sptran.f:88
    +
    subroutine sptrung(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NRSKIP, NGSKIP, JCPU, RLAT, RLON, GRIDI, GP)
    This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields...
    Definition: sptrung.f:68
    +
    +
    + + + + diff --git a/ver-5.1.0/sptrungv_8f.html b/ver-5.1.0/sptrungv_8f.html new file mode 100644 index 00000000..43b9cbac --- /dev/null +++ b/ver-5.1.0/sptrungv_8f.html @@ -0,0 +1,376 @@ + + + + + + + +NCEPLIBS-ip: sptrungv.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptrungv.f File Reference
    +
    +
    + +

    Spectrally interpolate vectors to stations. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptrungv (IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NRSKIP, NGSKIP, JCPU, RLAT, RLON, GRIDUI, GRIDVI, LUV, UP, VP, LDZ, DP, ZP, LPS, PP, SP)
     THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTORS FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELDS TO SPECIFIED SETS OF STATION POINTS ON THE GLOBE. More...
     
    +

    Detailed Description

    +

    Spectrally interpolate vectors to stations.

    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition in file sptrungv.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptrungv()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptrungv ( IROMB,
     MAXWV,
     IDRTI,
     IMAXI,
     JMAXI,
     KMAX,
     NMAX,
     IPRIME,
     ISKIPI,
     JSKIPI,
     KSKIPI,
     KGSKIP,
     NRSKIP,
     NGSKIP,
     JCPU,
    real, dimension(*) RLAT,
    real, dimension(*) RLON,
    real, dimension(*) GRIDUI,
    real, dimension(*) GRIDVI,
    logical LUV,
    real, dimension(*) UP,
    real, dimension(*) VP,
    logical LDZ,
    real, dimension(*) DP,
    real, dimension(*) ZP,
    logical LPS,
    real, dimension(*) PP,
    real, dimension(*) SP 
    )
    +
    + +

    THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTORS FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELDS TO SPECIFIED SETS OF STATION POINTS ON THE GLOBE.

    +

    THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL. THE GRID-SPACE CAN BE EITHER AN EQUALLY-SPACED GRID (WITH OR WITHOUT POLE POINTS) OR A GAUSSIAN GRID. THE GRID AND POINT FIELDS MAY HAVE GENERAL INDEXING. THE TRANSFORMS ARE ALL MULTIPROCESSED. TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION. SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.

    +

    PROGRAM HISTORY LOG:

      +
    • 96-02-29 IREDELL
    • +
    • 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED
    • +
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IROMB- INTEGER SPECTRAL DOMAIN SHAPE (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    MAXWV- INTEGER SPECTRAL TRUNCATION
    IDRTI- INTEGER INPUT GRID IDENTIFIER (IDRTI=4 FOR GAUSSIAN GRID, IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    IMAXI- INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    JMAXI- INTEGER NUMBER OF INPUT LATITUDES.
    KMAX- INTEGER NUMBER OF FIELDS TO TRANSFORM.
    NMAX- INTEGER NUMBER OF STATION POINTS TO RETURN
    IPRIME- INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN. (DEFAULTS TO 1 IF IPRIME=0) (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    ISKIPI- INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES (DEFAULTS TO 1 IF ISKIPI=0)
    JSKIPI- INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH (DEFAULTS TO -IMAXI IF JSKIPI=0)
    KSKIPI- INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    KGSKIP- INTEGER SKIP NUMBER BETWEEN STATION POINT SETS (DEFAULTS TO NMAX IF KGSKIP=0)
    NRSKIP- INTEGER SKIP NUMBER BETWEEN STATION LATS AND LONS (DEFAULTS TO 1 IF NRSKIP=0)
    NGSKIP- INTEGER SKIP NUMBER BETWEEN STATION POINTS (DEFAULTS TO 1 IF NGSKIP=0)
    RLAT- REAL (*) STATION LATITUDES IN DEGREES
    RLON- REAL (*) STATION LONGITUDES IN DEGREES
    JCPU- INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    GRIDUI- REAL (*) INPUT GRID U-WINDS
    GRIDVI- REAL (*) INPUT GRID V-WINDS
    LUV- LOGICAL FLAG WHETHER TO RETURN WINDS
    LDZ- LOGICAL FLAG WHETHER TO RETURN DIVERGENCE AND VORTICITY
    LPS- LOGICAL FLAG WHETHER TO RETURN POTENTIAL AND STREAMFCN
    UP- REAL (*) STATION U-WINDS IF LUV
    VP- REAL (*) STATION V-WINDS IF LUV
    DP- REAL (*) STATION DIVERGENCES IF LDZ
    ZP- REAL (*) STATION VORTICITIES IF LDZ
    PP- REAL (*) STATION POTENTIALS IF LPS
    SP- REAL (*) STATION STREAMFCNS IF LPS
    +
    +
    +

    SUBPROGRAMS CALLED:

      +
    • SPWGET GET WAVE-SPACE CONSTANTS
    • +
    • SPLAPLAC COMPUTE LAPLACIAN IN SPECTRAL SPACE
    • +
    • SPTRANV PERFORM A VECTOR SPHERICAL TRANSFORM
    • +
    • SPTGPT TRANSFORM SPECTRAL SCALAR TO STATION POINTS
    • +
    • SPTGPTV TRANSFORM SPECTRAL VECTOR TO STATION POINTS
    • +
    • NCPUS GETS ENVIRONMENT NUMBER OF CPUS
    • +
    +

    REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:

    + + + + + + + + + + + + + + + + +
    DIMENSION LINEAR QUADRATIC
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    + +

    Definition at line 81 of file sptrungv.f.

    + +

    References ncpus(), splaplac(), sptgpt(), sptgptv(), sptranv(), and spwget().

    + +

    Referenced by spectral_interp_mod::polatev4::polatev4_grib1(), and spectral_interp_mod::polatev4::polatev4_grib2().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptrungv_8f.js b/ver-5.1.0/sptrungv_8f.js new file mode 100644 index 00000000..c69c1059 --- /dev/null +++ b/ver-5.1.0/sptrungv_8f.js @@ -0,0 +1,4 @@ +var sptrungv_8f = +[ + [ "sptrungv", "sptrungv_8f.html#ab7bbe6ecde57394b15e5d4925cb07164", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptrungv_8f_source.html b/ver-5.1.0/sptrungv_8f_source.html new file mode 100644 index 00000000..7dab915f --- /dev/null +++ b/ver-5.1.0/sptrungv_8f_source.html @@ -0,0 +1,247 @@ + + + + + + + +NCEPLIBS-ip: sptrungv.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptrungv.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C>
    +
    3 C> Spectrally interpolate vectors to stations
    +
    4 C> @author IREDELL @date 96-02-29
    +
    5 
    +
    6 C> THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTORS FIELDS
    +
    7 C> ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELDS
    +
    8 C> TO SPECIFIED SETS OF STATION POINTS ON THE GLOBE.
    +
    9 C> THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL.
    +
    10 C> THE GRID-SPACE CAN BE EITHER AN EQUALLY-SPACED GRID
    +
    11 C> (WITH OR WITHOUT POLE POINTS) OR A GAUSSIAN GRID.
    +
    12 C> THE GRID AND POINT FIELDS MAY HAVE GENERAL INDEXING.
    +
    13 C> THE TRANSFORMS ARE ALL MULTIPROCESSED.
    +
    14 C> TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION.
    +
    15 C> SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
    +
    16 C>
    +
    17 C> PROGRAM HISTORY LOG:
    +
    18 C> - 96-02-29 IREDELL
    +
    19 C> - 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED
    +
    20 C>
    +
    21 C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    +
    22 C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    +
    23 C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    +
    24 C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    +
    25 C> (IDRTI=4 FOR GAUSSIAN GRID,
    +
    26 C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    27 C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    +
    28 C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    +
    29 C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    +
    30 C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    +
    31 C> @param NMAX - INTEGER NUMBER OF STATION POINTS TO RETURN
    +
    32 C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    +
    33 C> (DEFAULTS TO 1 IF IPRIME=0)
    +
    34 C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    +
    35 C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    +
    36 C> (DEFAULTS TO 1 IF ISKIPI=0)
    +
    37 C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    +
    38 C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    +
    39 C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    +
    40 C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    +
    41 C> @param KGSKIP - INTEGER SKIP NUMBER BETWEEN STATION POINT SETS
    +
    42 C> (DEFAULTS TO NMAX IF KGSKIP=0)
    +
    43 C> @param NRSKIP - INTEGER SKIP NUMBER BETWEEN STATION LATS AND LONS
    +
    44 C> (DEFAULTS TO 1 IF NRSKIP=0)
    +
    45 C> @param NGSKIP - INTEGER SKIP NUMBER BETWEEN STATION POINTS
    +
    46 C> (DEFAULTS TO 1 IF NGSKIP=0)
    +
    47 C> @param RLAT - REAL (*) STATION LATITUDES IN DEGREES
    +
    48 C> @param RLON - REAL (*) STATION LONGITUDES IN DEGREES
    +
    49 C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    +
    50 C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    +
    51 C> @param GRIDUI - REAL (*) INPUT GRID U-WINDS
    +
    52 C> @param GRIDVI - REAL (*) INPUT GRID V-WINDS
    +
    53 C> @param LUV - LOGICAL FLAG WHETHER TO RETURN WINDS
    +
    54 C> @param LDZ - LOGICAL FLAG WHETHER TO RETURN DIVERGENCE AND VORTICITY
    +
    55 C> @param LPS - LOGICAL FLAG WHETHER TO RETURN POTENTIAL AND STREAMFCN
    +
    56 C> @param UP - REAL (*) STATION U-WINDS IF LUV
    +
    57 C> @param VP - REAL (*) STATION V-WINDS IF LUV
    +
    58 C> @param DP - REAL (*) STATION DIVERGENCES IF LDZ
    +
    59 C> @param ZP - REAL (*) STATION VORTICITIES IF LDZ
    +
    60 C> @param PP - REAL (*) STATION POTENTIALS IF LPS
    +
    61 C> @param SP - REAL (*) STATION STREAMFCNS IF LPS
    +
    62 C>
    +
    63 C> SUBPROGRAMS CALLED:
    +
    64 C> - SPWGET GET WAVE-SPACE CONSTANTS
    +
    65 C> - SPLAPLAC COMPUTE LAPLACIAN IN SPECTRAL SPACE
    +
    66 C> - SPTRANV PERFORM A VECTOR SPHERICAL TRANSFORM
    +
    67 C> - SPTGPT TRANSFORM SPECTRAL SCALAR TO STATION POINTS
    +
    68 C> - SPTGPTV TRANSFORM SPECTRAL VECTOR TO STATION POINTS
    +
    69 C> - NCPUS GETS ENVIRONMENT NUMBER OF CPUS
    +
    70 C>
    +
    71 C> REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:
    +
    72 C> DIMENSION |LINEAR |QUADRATIC
    +
    73 C> ----------------------- |--------- |-------------
    +
    74 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    +
    75 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    +
    76 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    +
    77 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    +
    78 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    +
    79 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    +
    80 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    +
    81  SUBROUTINE sptrungv(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,NMAX,
    +
    82  & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP,
    +
    83  & NRSKIP,NGSKIP,JCPU,RLAT,RLON,GRIDUI,GRIDVI,
    +
    84  & LUV,UP,VP,LDZ,DP,ZP,LPS,PP,SP)
    +
    85 
    +
    86  LOGICAL LUV,LDZ,LPS
    +
    87  REAL RLAT(*),RLON(*),GRIDUI(*),GRIDVI(*)
    +
    88  REAL UP(*),VP(*),DP(*),ZP(*),PP(*),SP(*)
    +
    89  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    90  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    91  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    92  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    93  REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    94  REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    95 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    96 C TRANSFORM INPUT GRID TO WAVE
    +
    97  jc=jcpu
    +
    98  IF(jc.EQ.0) jc=ncpus()
    +
    99  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    100  mdim=2*mx+1
    +
    101  jn=-jskipi
    +
    102  IF(jn.EQ.0) jn=imaxi
    +
    103  js=-jn
    +
    104  inp=(jmaxi-1)*max(0,-jn)+1
    +
    105  isp=(jmaxi-1)*max(0,-js)+1
    +
    106  CALL sptranv(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    +
    107  & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    +
    108  & wd,wz,
    +
    109  & gridui(inp),gridui(isp),gridvi(inp),gridvi(isp),-1)
    +
    110 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    111 C TRANSFORM WAVE TO OUTPUT WINDS
    +
    112  IF(luv) THEN
    +
    113  CALL sptgptv(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
    +
    114  & rlat,rlon,wd,wz,up,vp)
    +
    115  ENDIF
    +
    116 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    117 C TRANSFORM WAVE TO OUTPUT DIVERGENCE AND VORTICITY
    +
    118  IF(ldz) THEN
    +
    119  CALL sptgpt(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
    +
    120  & rlat,rlon,wd,dp)
    +
    121  CALL sptgpt(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
    +
    122  & rlat,rlon,wz,zp)
    +
    123  ENDIF
    +
    124 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    125 C TRANSFORM WAVE TO OUTPUT POTENTIAL AND STREAMFUNCTION
    +
    126  IF(lps) THEN
    +
    127  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    128 C$OMP PARALLEL DO
    +
    129  DO k=1,kmax
    +
    130  CALL splaplac(iromb,maxwv,enn1,wd(1,k),wd(1,k),-1)
    +
    131  CALL splaplac(iromb,maxwv,enn1,wz(1,k),wz(1,k),-1)
    +
    132  wd(1:2,k)=0.
    +
    133  wz(1:2,k)=0.
    +
    134  ENDDO
    +
    135  CALL sptgpt(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
    +
    136  & rlat,rlon,wd,pp)
    +
    137  CALL sptgpt(iromb,maxwv,kmax,nmax,mdim,kgskip,nrskip,ngskip,
    +
    138  & rlat,rlon,wz,sp)
    +
    139  ENDIF
    +
    140 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    141  END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    +
    subroutine splaplac(I, M, ENN1, Q, QD2, IDIR)
    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
    Definition: splaplac.f:25
    +
    subroutine sptgpt(IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVE, GP)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to spe...
    Definition: sptgpt.f:51
    +
    subroutine sptgptv(IROMB, MAXWV, KMAX, NMAX, KWSKIP, KGSKIP, NRSKIP, NGSKIP, RLAT, RLON, WAVED, WAVEZ, UP, VP)
    This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
    Definition: sptgptv.f:54
    +
    subroutine sptranv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
    Definition: sptranv.f:91
    +
    subroutine sptrungv(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NRSKIP, NGSKIP, JCPU, RLAT, RLON, GRIDUI, GRIDVI, LUV, UP, VP, LDZ, DP, ZP, LPS, PP, SP)
    THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTORS FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELD...
    Definition: sptrungv.f:85
    +
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +
    +
    + + + + diff --git a/ver-5.1.0/sptrunl_8f.html b/ver-5.1.0/sptrunl_8f.html new file mode 100644 index 00000000..26b7b2c6 --- /dev/null +++ b/ver-5.1.0/sptrunl_8f.html @@ -0,0 +1,316 @@ + + + + + + + +NCEPLIBS-ip: sptrunl.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptrunl.f File Reference
    +
    +
    + +

    Spectrally truncate to laplacian. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptrunl (IROMB, MAXWV, IDRTI, IMAXI, JMAXI, IDRTO, IMAXO, JMAXO, KMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, ISKIPO, JSKIPO, KSKIPO, JCPU, IDIR, GRIDI, GRIDO)
     THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR LAPLACIAN OR INVERSE TO A POSSIBLY DIFFERENT GLOBAL CYLINDRICAL GRID. More...
     
    +

    Detailed Description

    +

    Spectrally truncate to laplacian.

    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition in file sptrunl.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptrunl()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptrunl ( IROMB,
     MAXWV,
     IDRTI,
     IMAXI,
     JMAXI,
     IDRTO,
     IMAXO,
     JMAXO,
     KMAX,
     IPRIME,
     ISKIPI,
     JSKIPI,
     KSKIPI,
     ISKIPO,
     JSKIPO,
     KSKIPO,
     JCPU,
     IDIR,
    real, dimension(*) GRIDI,
    real, dimension(*) GRIDO 
    )
    +
    + +

    THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR LAPLACIAN OR INVERSE TO A POSSIBLY DIFFERENT GLOBAL CYLINDRICAL GRID.

    +

    THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL. EITHER GRID-SPACE CAN BE EITHER AN EQUALLY-SPACED GRID (WITH OR WITHOUT POLE POINTS) OR A GAUSSIAN GRID. THE GRID FIELDS MAY HAVE GENERAL INDEXING. THE TRANSFORMS ARE ALL MULTIPROCESSED. OVER ZONAL WAVENUMBER TO ENSURE REPRODUCIBILITY. TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION. SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.

    +

    PROGRAM HISTORY LOG:

      +
    • 96-02-29 IREDELL
    • +
    • 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED
    • +
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + +
    IROMB- INTEGER SPECTRAL DOMAIN SHAPE (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    MAXWV- INTEGER SPECTRAL TRUNCATION
    IDRTI- INTEGER INPUT GRID IDENTIFIER (IDRTI=4 FOR GAUSSIAN GRID, IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    IMAXI- INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    JMAXI- INTEGER NUMBER OF INPUT LATITUDES.
    IDRTO- INTEGER OUTPUT GRID IDENTIFIER (IDRTO=4 FOR GAUSSIAN GRID, IDRTO=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, IDRTO=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    IMAXO- INTEGER EVEN NUMBER OF OUTPUT LONGITUDES.
    JMAXO- INTEGER NUMBER OF OUTPUT LATITUDES.
    KMAX- INTEGER NUMBER OF FIELDS TO TRANSFORM.
    IPRIME- INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN. (DEFAULTS TO 1 IF IPRIME=0) (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    ISKIPI- INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES (DEFAULTS TO 1 IF ISKIPI=0)
    JSKIPI- INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH (DEFAULTS TO -IMAXI IF JSKIPI=0)
    KSKIPI- INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    ISKIPO- INTEGER SKIP NUMBER BETWEEN OUTPUT LONGITUDES (DEFAULTS TO 1 IF ISKIPO=0)
    JSKIPO- INTEGER SKIP NUMBER BETWEEN OUTPUT LATITUDES FROM SOUTH (DEFAULTS TO -IMAXO IF JSKIPO=0)
    KSKIPO- INTEGER SKIP NUMBER BETWEEN OUTPUT GRID FIELDS (DEFAULTS TO IMAXO*JMAXO IF KSKIPO=0)
    JCPU- INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    IDIR- INTEGER FLAG IDIR > 0 TO TAKE LAPLACIAN IDIR < 0 TO TAKE INVERSE LAPLACIAN
    GRIDI- REAL (*) INPUT GRID FIELDS
    GRIDO- REAL (*) OUTPUT GRID FIELDS (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    +
    +
    +

    SUBPROGRAMS CALLED:

      +
    • SPWGET GET WAVE-SPACE CONSTANTS
    • +
    • SPLAPLAC COMPUTE LAPLACIAN IN SPECTRAL SPACE
    • +
    • SPTRAN PERFORM A SCALAR SPHERICAL TRANSFORM
    • +
    • NCPUS GETS ENVIRONMENT NUMBER OF CPUS
    • +
    +

    REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:

    + + + + + + + + + + + + + + + + +
    DIMENSION LINEAR QUADRATIC
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    + +

    Definition at line 78 of file sptrunl.f.

    + +

    References ncpus(), splaplac(), sptran(), and spwget().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptrunl_8f.js b/ver-5.1.0/sptrunl_8f.js new file mode 100644 index 00000000..892c4e7f --- /dev/null +++ b/ver-5.1.0/sptrunl_8f.js @@ -0,0 +1,4 @@ +var sptrunl_8f = +[ + [ "sptrunl", "sptrunl_8f.html#a52c4250d24e52304e49aa1d82a93bdb8", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptrunl_8f_source.html b/ver-5.1.0/sptrunl_8f_source.html new file mode 100644 index 00000000..fafc43c1 --- /dev/null +++ b/ver-5.1.0/sptrunl_8f_source.html @@ -0,0 +1,219 @@ + + + + + + + +NCEPLIBS-ip: sptrunl.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptrunl.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C>
    +
    3 C> Spectrally truncate to laplacian
    +
    4 C> @author IREDELL @date 96-02-29
    +
    5 
    +
    6 C> THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS
    +
    7 C> ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR LAPLACIAN
    +
    8 C> OR INVERSE TO A POSSIBLY DIFFERENT GLOBAL CYLINDRICAL GRID.
    +
    9 C> THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL.
    +
    10 C> EITHER GRID-SPACE CAN BE EITHER AN EQUALLY-SPACED GRID
    +
    11 C> (WITH OR WITHOUT POLE POINTS) OR A GAUSSIAN GRID.
    +
    12 C> THE GRID FIELDS MAY HAVE GENERAL INDEXING.
    +
    13 C> THE TRANSFORMS ARE ALL MULTIPROCESSED.
    +
    14 C> OVER ZONAL WAVENUMBER TO ENSURE REPRODUCIBILITY.
    +
    15 C> TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION.
    +
    16 C> SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
    +
    17 C>
    +
    18 C> PROGRAM HISTORY LOG:
    +
    19 C> - 96-02-29 IREDELL
    +
    20 C> - 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED
    +
    21 C>
    +
    22 C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    +
    23 C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    +
    24 C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    +
    25 C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    +
    26 C> (IDRTI=4 FOR GAUSSIAN GRID,
    +
    27 C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    28 C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    +
    29 C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    +
    30 C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    +
    31 C> @param IDRTO - INTEGER OUTPUT GRID IDENTIFIER
    +
    32 C> (IDRTO=4 FOR GAUSSIAN GRID,
    +
    33 C> IDRTO=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    34 C> IDRTO=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    +
    35 C> @param IMAXO - INTEGER EVEN NUMBER OF OUTPUT LONGITUDES.
    +
    36 C> @param JMAXO - INTEGER NUMBER OF OUTPUT LATITUDES.
    +
    37 C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    +
    38 C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    +
    39 C> (DEFAULTS TO 1 IF IPRIME=0)
    +
    40 C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    +
    41 C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    +
    42 C> (DEFAULTS TO 1 IF ISKIPI=0)
    +
    43 C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    +
    44 C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    +
    45 C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    +
    46 C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    +
    47 C> @param ISKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LONGITUDES
    +
    48 C> (DEFAULTS TO 1 IF ISKIPO=0)
    +
    49 C> @param JSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LATITUDES FROM SOUTH
    +
    50 C> (DEFAULTS TO -IMAXO IF JSKIPO=0)
    +
    51 C> @param KSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT GRID FIELDS
    +
    52 C> (DEFAULTS TO IMAXO*JMAXO IF KSKIPO=0)
    +
    53 C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    +
    54 C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    +
    55 C> @param IDIR - INTEGER FLAG
    +
    56 C> IDIR > 0 TO TAKE LAPLACIAN
    +
    57 C> IDIR < 0 TO TAKE INVERSE LAPLACIAN
    +
    58 C> @param GRIDI - REAL (*) INPUT GRID FIELDS
    +
    59 C> @param GRIDO - REAL (*) OUTPUT GRID FIELDS
    +
    60 C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    +
    61 C>
    +
    62 C> SUBPROGRAMS CALLED:
    +
    63 C> - SPWGET GET WAVE-SPACE CONSTANTS
    +
    64 C> - SPLAPLAC COMPUTE LAPLACIAN IN SPECTRAL SPACE
    +
    65 C> - SPTRAN PERFORM A SCALAR SPHERICAL TRANSFORM
    +
    66 C> - NCPUS GETS ENVIRONMENT NUMBER OF CPUS
    +
    67 C>
    +
    68 C> REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:
    +
    69 C> DIMENSION |LINEAR |QUADRATIC
    +
    70 C> ----------------------- |--------- |-------------
    +
    71 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    +
    72 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    +
    73 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    +
    74 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    +
    75 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    +
    76 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    +
    77 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    +
    78  SUBROUTINE sptrunl(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,
    +
    79  & IDRTO,IMAXO,JMAXO,KMAX,
    +
    80  & IPRIME,ISKIPI,JSKIPI,KSKIPI,
    +
    81  & ISKIPO,JSKIPO,KSKIPO,JCPU,IDIR,GRIDI,GRIDO)
    +
    82 
    +
    83  REAL GRIDI(*),GRIDO(*)
    +
    84  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    85  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    86  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    87  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    88  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    89 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    90 C TRANSFORM INPUT GRID TO WAVE
    +
    91  jc=jcpu
    +
    92  IF(jc.EQ.0) jc=ncpus()
    +
    93  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    94  mdim=2*mx+1
    +
    95  jn=-jskipi
    +
    96  IF(jn.EQ.0) jn=imaxi
    +
    97  js=-jn
    +
    98  inp=(jmaxi-1)*max(0,-jn)+1
    +
    99  isp=(jmaxi-1)*max(0,-js)+1
    +
    100  CALL sptran(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    +
    101  & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    +
    102  & w,gridi(inp),gridi(isp),-1)
    +
    103 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    104 C TAKE LAPLACIAN AND TRANSFORM WAVE TO OUTPUT GRID
    +
    105  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    106 C$OMP PARALLEL DO
    +
    107  DO k=1,kmax
    +
    108  CALL splaplac(iromb,maxwv,enn1,w(1,k),w(1,k),idir)
    +
    109  w(1:2,k)=0.
    +
    110  ENDDO
    +
    111  CALL sptran(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
    +
    112  & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
    +
    113  & w,grido(inp),grido(isp),1)
    +
    114 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    115  END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    +
    subroutine splaplac(I, M, ENN1, Q, QD2, IDIR)
    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
    Definition: splaplac.f:25
    +
    subroutine sptran(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDN, GRIDS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition: sptran.f:88
    +
    subroutine sptrunl(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, IDRTO, IMAXO, JMAXO, KMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, ISKIPO, JSKIPO, KSKIPO, JCPU, IDIR, GRIDI, GRIDO)
    THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR LAPL...
    Definition: sptrunl.f:82
    +
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +
    +
    + + + + diff --git a/ver-5.1.0/sptrunm_8f.html b/ver-5.1.0/sptrunm_8f.html new file mode 100644 index 00000000..1e62005e --- /dev/null +++ b/ver-5.1.0/sptrunm_8f.html @@ -0,0 +1,327 @@ + + + + + + + +NCEPLIBS-ip: sptrunm.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptrunm.f File Reference
    +
    +
    + +

    Spectrally interpolate scalars to Mercator. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptrunm (IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, MI, MJ, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, RLAT1, RLON1, DLAT, DLON, GRIDI, GM)
     This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields to a Mercator grid. More...
     
    +

    Detailed Description

    +

    Spectrally interpolate scalars to Mercator.

    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition in file sptrunm.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptrunm()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptrunm ( IROMB,
     MAXWV,
     IDRTI,
     IMAXI,
     JMAXI,
     KMAX,
     MI,
     MJ,
     IPRIME,
     ISKIPI,
     JSKIPI,
     KSKIPI,
     KGSKIP,
     NISKIP,
     NJSKIP,
     JCPU,
     RLAT1,
     RLON1,
     DLAT,
     DLON,
    real, dimension(*) GRIDI,
    real, dimension(*) GM 
    )
    +
    + +

    This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields to a Mercator grid.

    +

    The wave-space can be either triangular or rhomboidal. The grid-space can be either an equally-spaced grid (with or without pole points) or a Gaussian grid. The grid fields may have general indexing. The transforms are all multiprocessed. Transform several fields at a time to improve vectorization. Subprogram can be called from a multiprocessing environment.

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + + +
    IROMB- INTEGER SPECTRAL DOMAIN SHAPE (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    MAXWV- INTEGER SPECTRAL TRUNCATION
    IDRTI- INTEGER INPUT GRID IDENTIFIER (IDRTI=4 FOR GAUSSIAN GRID, IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    IMAXI- INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    JMAXI- INTEGER NUMBER OF INPUT LATITUDES.
    KMAX- INTEGER NUMBER OF FIELDS TO TRANSFORM.
    MI- INTEGER NUMBER OF POINTS IN THE FASTER ZONAL DIRECTION
    MJ- INTEGER NUMBER OF POINTS IN THE SLOWER MERID DIRECTION
    IPRIME- INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN. (DEFAULTS TO 1 IF IPRIME=0) (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    ISKIPI- INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES (DEFAULTS TO 1 IF ISKIPI=0)
    JSKIPI- INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH (DEFAULTS TO -IMAXI IF JSKIPI=0)
    KSKIPI- INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    KGSKIP- INTEGER SKIP NUMBER BETWEEN GRID FIELDS (DEFAULTS TO NPS*NPS IF KGSKIP=0)
    NISKIP- INTEGER SKIP NUMBER BETWEEN GRID I-POINTS (DEFAULTS TO 1 IF NISKIP=0)
    NJSKIP- INTEGER SKIP NUMBER BETWEEN GRID J-POINTS (DEFAULTS TO NPS IF NJSKIP=0)
    JCPU- INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    RLAT1- REAL LATITUDE OF THE FIRST GRID POINT IN DEGREES
    RLON1- REAL LONGITUDE OF THE FIRST GRID POINT IN DEGREES
    DLAT- REAL LATITUDE INCREMENT IN DEGREES SUCH THAT D(PHI)/D(J)=DLAT*COS(PHI) WHERE J IS MERIDIONAL INDEX. DLAT IS NEGATIVE FOR GRIDS INDEXED SOUTHWARD. (IN TERMS OF GRID INCREMENT DY VALID AT LATITUDE RLATI, THE LATITUDE INCREMENT DLAT IS DETERMINED AS DLAT=DPR*DY/(RERTH*COS(RLATI/DPR)) WHERE DPR=180/PI AND RERTH IS EARTH'S RADIUS)
    DLON- REAL LONGITUDE INCREMENT IN DEGREES SUCH THAT D(LAMBDA)/D(I)=DLON WHERE I IS ZONAL INDEX. DLON IS NEGATIVE FOR GRIDS INDEXED WESTWARD.
    GRIDI- REAL (*) INPUT GRID FIELDS
    GM- REAL (*) MERCATOR FIELDS
    +
    +
    +

    SUBPROGRAMS CALLED:

      +
    • sptran() Perform a scalar spherical transform
    • +
    • sptgpm() Transform spectral scalar to Mercator
    • +
    • ncpus() Gets environment number of cpus
    • +
    +

    MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:

    + + + + + + + + + + + + + + + + +
    DIMENSION LINEAR QUADRATIC
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    + +

    Definition at line 76 of file sptrunm.f.

    + +

    References ncpus(), sptgpm(), and sptran().

    + +

    Referenced by spectral_interp_mod::polates4::polates4_grib1(), and spectral_interp_mod::polates4::polates4_grib2().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptrunm_8f.js b/ver-5.1.0/sptrunm_8f.js new file mode 100644 index 00000000..285bd268 --- /dev/null +++ b/ver-5.1.0/sptrunm_8f.js @@ -0,0 +1,4 @@ +var sptrunm_8f = +[ + [ "sptrunm", "sptrunm_8f.html#a2a4e579890d3cf7f6a26091f544b6cb6", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptrunm_8f_source.html b/ver-5.1.0/sptrunm_8f_source.html new file mode 100644 index 00000000..860840d6 --- /dev/null +++ b/ver-5.1.0/sptrunm_8f_source.html @@ -0,0 +1,204 @@ + + + + + + + +NCEPLIBS-ip: sptrunm.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptrunm.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C>
    +
    3 C> Spectrally interpolate scalars to Mercator
    +
    4 C> @author IREDELL @date 96-02-29
    +
    5 
    +
    6 C> This subprogram spectrally truncates scalar fields on a global
    +
    7 C> cylindrical grid, returning the fields to a Mercator grid. The
    +
    8 C> wave-space can be either triangular or rhomboidal. The grid-space
    +
    9 C> can be either an equally-spaced grid (with or without pole
    +
    10 C> points) or a Gaussian grid. The grid fields may have general
    +
    11 C> indexing. The transforms are all multiprocessed. Transform
    +
    12 C> several fields at a time to improve vectorization. Subprogram can
    +
    13 C> be called from a multiprocessing environment.
    +
    14 C>
    +
    15 C>
    +
    16 C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    +
    17 C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    +
    18 C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    +
    19 C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    +
    20 C> (IDRTI=4 FOR GAUSSIAN GRID,
    +
    21 C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    22 C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    +
    23 C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    +
    24 C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    +
    25 C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    +
    26 C> @param MI - INTEGER NUMBER OF POINTS IN THE FASTER ZONAL DIRECTION
    +
    27 C> @param MJ - INTEGER NUMBER OF POINTS IN THE SLOWER MERID DIRECTION
    +
    28 C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    +
    29 C> (DEFAULTS TO 1 IF IPRIME=0)
    +
    30 C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    +
    31 C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    +
    32 C> (DEFAULTS TO 1 IF ISKIPI=0)
    +
    33 C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    +
    34 C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    +
    35 C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    +
    36 C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    +
    37 C> @param KGSKIP - INTEGER SKIP NUMBER BETWEEN GRID FIELDS
    +
    38 C> (DEFAULTS TO NPS*NPS IF KGSKIP=0)
    +
    39 C> @param NISKIP - INTEGER SKIP NUMBER BETWEEN GRID I-POINTS
    +
    40 C> (DEFAULTS TO 1 IF NISKIP=0)
    +
    41 C> @param NJSKIP - INTEGER SKIP NUMBER BETWEEN GRID J-POINTS
    +
    42 C> (DEFAULTS TO NPS IF NJSKIP=0)
    +
    43 C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    +
    44 C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    +
    45 C> @param RLAT1 - REAL LATITUDE OF THE FIRST GRID POINT IN DEGREES
    +
    46 C> @param RLON1 - REAL LONGITUDE OF THE FIRST GRID POINT IN DEGREES
    +
    47 C> @param DLAT - REAL LATITUDE INCREMENT IN DEGREES SUCH THAT
    +
    48 C> D(PHI)/D(J)=DLAT*COS(PHI) WHERE J IS MERIDIONAL INDEX.
    +
    49 C> DLAT IS NEGATIVE FOR GRIDS INDEXED SOUTHWARD.
    +
    50 C> (IN TERMS OF GRID INCREMENT DY VALID AT LATITUDE RLATI,
    +
    51 C> THE LATITUDE INCREMENT DLAT IS DETERMINED AS
    +
    52 C> DLAT=DPR*DY/(RERTH*COS(RLATI/DPR))
    +
    53 C> WHERE DPR=180/PI AND RERTH IS EARTH'S RADIUS)
    +
    54 C> @param DLON - REAL LONGITUDE INCREMENT IN DEGREES SUCH THAT
    +
    55 C> D(LAMBDA)/D(I)=DLON WHERE I IS ZONAL INDEX.
    +
    56 C> DLON IS NEGATIVE FOR GRIDS INDEXED WESTWARD.
    +
    57 C> @param GRIDI - REAL (*) INPUT GRID FIELDS
    +
    58 C> @param GM - REAL (*) MERCATOR FIELDS
    +
    59 C>
    +
    60 C> SUBPROGRAMS CALLED:
    +
    61 C> - sptran() Perform a scalar spherical transform
    +
    62 C> - sptgpm() Transform spectral scalar to Mercator
    +
    63 C> - ncpus() Gets environment number of cpus
    +
    64 C>
    +
    65 C> MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:
    +
    66 C> DIMENSION |LINEAR |QUADRATIC
    +
    67 C> ----------------------- |--------- |-------------
    +
    68 C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2
    +
    69 C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1
    +
    70 C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1
    +
    71 C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3
    +
    72 C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3
    +
    73 C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1
    +
    74 C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1
    +
    75 C>
    +
    76  SUBROUTINE sptrunm(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,MI,MJ,
    +
    77  & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP,
    +
    78  & NISKIP,NJSKIP,JCPU,RLAT1,RLON1,DLAT,DLON,
    +
    79  & GRIDI,GM)
    +
    80  REAL GRIDI(*),GM(*)
    +
    81  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    82 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    83 C TRANSFORM INPUT GRID TO WAVE
    +
    84  jc=jcpu
    +
    85  IF(jc.EQ.0) jc=ncpus()
    +
    86  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    87  mdim=2*mx+1
    +
    88  jn=-jskipi
    +
    89  IF(jn.EQ.0) jn=imaxi
    +
    90  js=-jn
    +
    91  inp=(jmaxi-1)*max(0,-jn)+1
    +
    92  isp=(jmaxi-1)*max(0,-js)+1
    +
    93  CALL sptran(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    +
    94  & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    +
    95  & w,gridi(inp),gridi(isp),-1)
    +
    96 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    97 C TRANSFORM WAVE TO OUTPUT
    +
    98  CALL sptgpm(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
    +
    99  & rlat1,rlon1,dlat,dlon,w,gm)
    +
    100 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    101  END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    +
    subroutine sptgpm(IROMB, MAXWV, KMAX, MI, MJ, KWSKIP, KGSKIP, NISKIP, NJSKIP, RLAT1, RLON1, DLAT, DLON, WAVE, GM)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to sca...
    Definition: sptgpm.f:56
    +
    subroutine sptran(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDN, GRIDS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition: sptran.f:88
    +
    subroutine sptrunm(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, MI, MJ, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, RLAT1, RLON1, DLAT, DLON, GRIDI, GM)
    This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields...
    Definition: sptrunm.f:80
    +
    +
    + + + + diff --git a/ver-5.1.0/sptrunmv_8f.html b/ver-5.1.0/sptrunmv_8f.html new file mode 100644 index 00000000..33407bf7 --- /dev/null +++ b/ver-5.1.0/sptrunmv_8f.html @@ -0,0 +1,394 @@ + + + + + + + +NCEPLIBS-ip: sptrunmv.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptrunmv.f File Reference
    +
    +
    + +

    Spectrally interpolate vectors to Mercator. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptrunmv (IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, MI, MJ, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, RLAT1, RLON1, DLAT, DLON, GRIDUI, GRIDVI, LUV, UM, VM, LDZ, DM, ZM, LPS, PM, SM)
     THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTOR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELDS TO A MERCATOR GRID. More...
     
    +

    Detailed Description

    +

    Spectrally interpolate vectors to Mercator.

    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition in file sptrunmv.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptrunmv()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptrunmv ( IROMB,
     MAXWV,
     IDRTI,
     IMAXI,
     JMAXI,
     KMAX,
     MI,
     MJ,
     IPRIME,
     ISKIPI,
     JSKIPI,
     KSKIPI,
     KGSKIP,
     NISKIP,
     NJSKIP,
     JCPU,
     RLAT1,
     RLON1,
     DLAT,
     DLON,
    real, dimension(*) GRIDUI,
    real, dimension(*) GRIDVI,
    logical LUV,
    real, dimension(*) UM,
    real, dimension(*) VM,
    logical LDZ,
    real, dimension(*) DM,
    real, dimension(*) ZM,
    logical LPS,
    real, dimension(*) PM,
    real, dimension(*) SM 
    )
    +
    + +

    THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTOR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELDS TO A MERCATOR GRID.

    +

    THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL. THE GRID-SPACE CAN BE EITHER AN EQUALLY-SPACED GRID (WITH OR WITHOUT POLE POINTS) OR A GAUSSIAN GRID. THE GRID FIELDS MAY HAVE GENERAL INDEXING. THE TRANSFORMS ARE ALL MULTIPROCESSED. TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION. SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.

    +

    PROGRAM HISTORY LOG: 96-02-29 IREDELL 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IROMB- INTEGER SPECTRAL DOMAIN SHAPE (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    MAXWV- INTEGER SPECTRAL TRUNCATION
    IDRTI- INTEGER INPUT GRID IDENTIFIER (IDRTI=4 FOR GAUSSIAN GRID, IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    IMAXI- INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    JMAXI- INTEGER NUMBER OF INPUT LATITUDES.
    KMAX- INTEGER NUMBER OF FIELDS TO TRANSFORM.
    MI- INTEGER NUMBER OF POINTS IN THE FASTER ZONAL DIRECTION
    MJ- INTEGER NUMBER OF POINTS IN THE SLOWER MERID DIRECTION
    IPRIME- INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN. (DEFAULTS TO 1 IF IPRIME=0) (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    ISKIPI- INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES (DEFAULTS TO 1 IF ISKIPI=0)
    JSKIPI- INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH (DEFAULTS TO -IMAXI IF JSKIPI=0)
    KSKIPI- INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    KGSKIP- INTEGER SKIP NUMBER BETWEEN GRID FIELDS (DEFAULTS TO MI*MJ IF KGSKIP=0)
    NISKIP- INTEGER SKIP NUMBER BETWEEN GRID I-POINTS (DEFAULTS TO 1 IF NISKIP=0)
    NJSKIP- INTEGER SKIP NUMBER BETWEEN GRID J-POINTS (DEFAULTS TO MI IF NJSKIP=0)
    JCPU- INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    RLAT1- REAL LATITUDE OF THE FIRST GRID POINT IN DEGREES
    RLON1- REAL LONGITUDE OF THE FIRST GRID POINT IN DEGREES
    DLAT- REAL LATITUDE INCREMENT IN DEGREES SUCH THAT D(PHI)/D(J)=DLAT*COS(PHI) WHERE J IS MERIDIONAL INDEX. DLAT IS NEGATIVE FOR GRIDS INDEXED SOUTHWARD. (IN TERMS OF GRID INCREMENT DY VALID AT LATITUDE RLATI, THE LATITUDE INCREMENT DLAT IS DETERMINED AS DLAT=DPR*DY/(RERTH*COS(RLATI/DPR)) WHERE DPR=180/PI AND RERTH IS EARTH'S RADIUS)
    DLON- REAL LONGITUDE INCREMENT IN DEGREES SUCH THAT D(LAMBDA)/D(I)=DLON WHERE I IS ZONAL INDEX. DLON IS NEGATIVE FOR GRIDS INDEXED WESTWARD.
    GRIDUI- REAL (*) INPUT GRID U-WINDS
    GRIDVI- REAL (*) INPUT GRID V-WINDS
    LUV- LOGICAL FLAG WHETHER TO RETURN WINDS
    LDZ- LOGICAL FLAG WHETHER TO RETURN DIVERGENCE AND VORTICITY
    LPS- LOGICAL FLAG WHETHER TO RETURN POTENTIAL AND STREAMFCN
    UM- REAL (*) MERCATOR U-WINDS IF LUV
    VM- REAL (*) MERCATOR V-WINDS IF LUV
    DM- REAL (*) MERCATOR DIVERGENCES IF LDZ
    ZM- REAL (*) MERCATOR VORTICITIES IF LDZ
    PM- REAL (*) MERCATOR POTENTIALS IF LPS
    SM- REAL (*) MERCATOR STREAMFCNS IF LPS
    +
    +
    +

    SUBPROGRAMS CALLED:

      +
    • SPWGET GET WAVE-SPACE CONSTANTS
    • +
    • SPLAPLAC COMPUTE LAPLACIAN IN SPECTRAL SPACE
    • +
    • SPTRANV PERFORM A VECTOR SPHERICAL TRANSFORM
    • +
    • SPTGPM TRANSFORM SPECTRAL SCALAR TO MERCATOR
    • +
    • SPTGPMV TRANSFORM SPECTRAL VECTOR TO MERCATOR
    • +
    • NCPUS GETS ENVIRONMENT NUMBER OF CPUS
    • +
    +

    REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:

    + + + + + + + + + + + + + + + + +
    DIMENSION LINEAR QUADRATIC
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    + +

    Definition at line 92 of file sptrunmv.f.

    + +

    References ncpus(), splaplac(), sptgpm(), sptgpmv(), sptranv(), and spwget().

    + +

    Referenced by spectral_interp_mod::polatev4::polatev4_grib1(), and spectral_interp_mod::polatev4::polatev4_grib2().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptrunmv_8f.js b/ver-5.1.0/sptrunmv_8f.js new file mode 100644 index 00000000..68c3d828 --- /dev/null +++ b/ver-5.1.0/sptrunmv_8f.js @@ -0,0 +1,4 @@ +var sptrunmv_8f = +[ + [ "sptrunmv", "sptrunmv_8f.html#a8b405d0621112d6852a3bb99602ac2fd", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptrunmv_8f_source.html b/ver-5.1.0/sptrunmv_8f_source.html new file mode 100644 index 00000000..ecd958df --- /dev/null +++ b/ver-5.1.0/sptrunmv_8f_source.html @@ -0,0 +1,258 @@ + + + + + + + +NCEPLIBS-ip: sptrunmv.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptrunmv.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C>
    +
    3 C> Spectrally interpolate vectors to Mercator
    +
    4 C> @author IREDELL @date 96-02-29
    +
    5 
    +
    6 C> THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTOR FIELDS
    +
    7 C> ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELDS
    +
    8 C> TO A MERCATOR GRID.
    +
    9 C> THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL.
    +
    10 C> THE GRID-SPACE CAN BE EITHER AN EQUALLY-SPACED GRID
    +
    11 C> (WITH OR WITHOUT POLE POINTS) OR A GAUSSIAN GRID.
    +
    12 C> THE GRID FIELDS MAY HAVE GENERAL INDEXING.
    +
    13 C> THE TRANSFORMS ARE ALL MULTIPROCESSED.
    +
    14 C> TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION.
    +
    15 C> SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
    +
    16 C>
    +
    17 C> PROGRAM HISTORY LOG:
    +
    18 C> 96-02-29 IREDELL
    +
    19 C> 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED
    +
    20 C>
    +
    21 C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    +
    22 C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    +
    23 C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    +
    24 C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    +
    25 C> (IDRTI=4 FOR GAUSSIAN GRID,
    +
    26 C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    27 C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    +
    28 C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    +
    29 C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    +
    30 C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    +
    31 C> @param MI - INTEGER NUMBER OF POINTS IN THE FASTER ZONAL DIRECTION
    +
    32 C> @param MJ - INTEGER NUMBER OF POINTS IN THE SLOWER MERID DIRECTION
    +
    33 C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    +
    34 C> (DEFAULTS TO 1 IF IPRIME=0)
    +
    35 C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    +
    36 C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    +
    37 C> (DEFAULTS TO 1 IF ISKIPI=0)
    +
    38 C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    +
    39 C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    +
    40 C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    +
    41 C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    +
    42 C> @param KGSKIP - INTEGER SKIP NUMBER BETWEEN GRID FIELDS
    +
    43 C> (DEFAULTS TO MI*MJ IF KGSKIP=0)
    +
    44 C> @param NISKIP - INTEGER SKIP NUMBER BETWEEN GRID I-POINTS
    +
    45 C> (DEFAULTS TO 1 IF NISKIP=0)
    +
    46 C> @param NJSKIP - INTEGER SKIP NUMBER BETWEEN GRID J-POINTS
    +
    47 C> (DEFAULTS TO MI IF NJSKIP=0)
    +
    48 C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    +
    49 C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    +
    50 C> @param RLAT1 - REAL LATITUDE OF THE FIRST GRID POINT IN DEGREES
    +
    51 C> @param RLON1 - REAL LONGITUDE OF THE FIRST GRID POINT IN DEGREES
    +
    52 C> @param DLAT - REAL LATITUDE INCREMENT IN DEGREES SUCH THAT
    +
    53 C> D(PHI)/D(J)=DLAT*COS(PHI) WHERE J IS MERIDIONAL INDEX.
    +
    54 C> DLAT IS NEGATIVE FOR GRIDS INDEXED SOUTHWARD.
    +
    55 C> (IN TERMS OF GRID INCREMENT DY VALID AT LATITUDE RLATI,
    +
    56 C> THE LATITUDE INCREMENT DLAT IS DETERMINED AS
    +
    57 C> DLAT=DPR*DY/(RERTH*COS(RLATI/DPR))
    +
    58 C> WHERE DPR=180/PI AND RERTH IS EARTH'S RADIUS)
    +
    59 C> @param DLON - REAL LONGITUDE INCREMENT IN DEGREES SUCH THAT
    +
    60 C> D(LAMBDA)/D(I)=DLON WHERE I IS ZONAL INDEX.
    +
    61 C> DLON IS NEGATIVE FOR GRIDS INDEXED WESTWARD.
    +
    62 C> @param GRIDUI - REAL (*) INPUT GRID U-WINDS
    +
    63 C> @param GRIDVI - REAL (*) INPUT GRID V-WINDS
    +
    64 C> @param LUV - LOGICAL FLAG WHETHER TO RETURN WINDS
    +
    65 C> @param LDZ - LOGICAL FLAG WHETHER TO RETURN DIVERGENCE AND VORTICITY
    +
    66 C> @param LPS - LOGICAL FLAG WHETHER TO RETURN POTENTIAL AND STREAMFCN
    +
    67 C> @param UM - REAL (*) MERCATOR U-WINDS IF LUV
    +
    68 C> @param VM - REAL (*) MERCATOR V-WINDS IF LUV
    +
    69 C> @param DM - REAL (*) MERCATOR DIVERGENCES IF LDZ
    +
    70 C> @param ZM - REAL (*) MERCATOR VORTICITIES IF LDZ
    +
    71 C> @param PM - REAL (*) MERCATOR POTENTIALS IF LPS
    +
    72 C> @param SM - REAL (*) MERCATOR STREAMFCNS IF LPS
    +
    73 C>
    +
    74 C> SUBPROGRAMS CALLED:
    +
    75 C> - SPWGET GET WAVE-SPACE CONSTANTS
    +
    76 C> - SPLAPLAC COMPUTE LAPLACIAN IN SPECTRAL SPACE
    +
    77 C> - SPTRANV PERFORM A VECTOR SPHERICAL TRANSFORM
    +
    78 C> - SPTGPM TRANSFORM SPECTRAL SCALAR TO MERCATOR
    +
    79 C> - SPTGPMV TRANSFORM SPECTRAL VECTOR TO MERCATOR
    +
    80 C> - NCPUS GETS ENVIRONMENT NUMBER OF CPUS
    +
    81 C>
    +
    82 C> REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:
    +
    83 C> DIMENSION |LINEAR |QUADRATIC
    +
    84 C> ----------------------- |--------- |-------------
    +
    85 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    +
    86 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    +
    87 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    +
    88 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    +
    89 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    +
    90 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    +
    91 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    +
    92  SUBROUTINE sptrunmv(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,MI,MJ,
    +
    93  & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP,
    +
    94  & NISKIP,NJSKIP,JCPU,RLAT1,RLON1,DLAT,DLON,
    +
    95  & GRIDUI,GRIDVI,LUV,UM,VM,LDZ,DM,ZM,LPS,PM,SM)
    +
    96 
    +
    97  LOGICAL LUV,LDZ,LPS
    +
    98  REAL GRIDUI(*),GRIDVI(*)
    +
    99  REAL UM(*),VM(*),DM(*),ZM(*),PM(*),SM(*)
    +
    100  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    101  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    102  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    103  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    104  REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    105  REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    106 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    107 C TRANSFORM INPUT GRID TO WAVE
    +
    108  jc=jcpu
    +
    109  IF(jc.EQ.0) jc=ncpus()
    +
    110  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    111  mdim=2*mx+1
    +
    112  jn=-jskipi
    +
    113  IF(jn.EQ.0) jn=imaxi
    +
    114  js=-jn
    +
    115  inp=(jmaxi-1)*max(0,-jn)+1
    +
    116  isp=(jmaxi-1)*max(0,-js)+1
    +
    117  CALL sptranv(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    +
    118  & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    +
    119  & wd,wz,
    +
    120  & gridui(inp),gridui(isp),gridvi(inp),gridvi(isp),-1)
    +
    121 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    122 C TRANSFORM WAVE TO OUTPUT WINDS
    +
    123  IF(luv) THEN
    +
    124  CALL sptgpmv(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
    +
    125  & rlat1,rlon1,dlat,dlon,wd,wz,um,vm)
    +
    126  ENDIF
    +
    127 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    128 C TRANSFORM WAVE TO OUTPUT DIVERGENCE AND VORTICITY
    +
    129  IF(ldz) THEN
    +
    130  CALL sptgpm(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
    +
    131  & rlat1,rlon1,dlat,dlon,wd,dm)
    +
    132  CALL sptgpm(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
    +
    133  & rlat1,rlon1,dlat,dlon,wz,zm)
    +
    134  ENDIF
    +
    135 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    136 C TRANSFORM WAVE TO OUTPUT POTENTIAL AND STREAMFUNCTION
    +
    137  IF(lps) THEN
    +
    138  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    139 C$OMP PARALLEL DO
    +
    140  DO k=1,kmax
    +
    141  CALL splaplac(iromb,maxwv,enn1,wd(1,k),wd(1,k),-1)
    +
    142  CALL splaplac(iromb,maxwv,enn1,wz(1,k),wz(1,k),-1)
    +
    143  wd(1:2,k)=0.
    +
    144  wz(1:2,k)=0.
    +
    145  ENDDO
    +
    146  CALL sptgpm(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
    +
    147  & rlat1,rlon1,dlat,dlon,wd,pm)
    +
    148  CALL sptgpm(iromb,maxwv,kmax,mi,mj,mdim,kgskip,niskip,njskip,
    +
    149  & rlat1,rlon1,dlat,dlon,wz,sm)
    +
    150  ENDIF
    +
    151 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    152  END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    +
    subroutine splaplac(I, M, ENN1, Q, QD2, IDIR)
    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
    Definition: splaplac.f:25
    +
    subroutine sptgpm(IROMB, MAXWV, KMAX, MI, MJ, KWSKIP, KGSKIP, NISKIP, NJSKIP, RLAT1, RLON1, DLAT, DLON, WAVE, GM)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to sca...
    Definition: sptgpm.f:56
    +
    subroutine sptgpmv(IROMB, MAXWV, KMAX, MI, MJ, KWSKIP, KGSKIP, NISKIP, NJSKIP, RLAT1, RLON1, DLAT, DLON, WAVED, WAVEZ, UM, VM)
    This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
    Definition: sptgpmv.f:63
    +
    subroutine sptranv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
    Definition: sptranv.f:91
    +
    subroutine sptrunmv(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, MI, MJ, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, RLAT1, RLON1, DLAT, DLON, GRIDUI, GRIDVI, LUV, UM, VM, LDZ, DM, ZM, LPS, PM, SM)
    THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTOR FIELDS ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELDS...
    Definition: sptrunmv.f:96
    +
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +
    +
    + + + + diff --git a/ver-5.1.0/sptruns_8f.html b/ver-5.1.0/sptruns_8f.html new file mode 100644 index 00000000..8491dd6d --- /dev/null +++ b/ver-5.1.0/sptruns_8f.html @@ -0,0 +1,321 @@ + + + + + + + +NCEPLIBS-ip: sptruns.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptruns.f File Reference
    +
    +
    + +

    Spectrally interpolate scalars to polar stereo. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptruns (IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NPS, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, TRUE, XMESH, ORIENT, GRIDI, GN, GS)
     This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields to specific pairs of polar stereographic scalar fields. More...
     
    +

    Detailed Description

    +

    Spectrally interpolate scalars to polar stereo.

    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition in file sptruns.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptruns()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptruns ( IROMB,
     MAXWV,
     IDRTI,
     IMAXI,
     JMAXI,
     KMAX,
     NPS,
     IPRIME,
     ISKIPI,
     JSKIPI,
     KSKIPI,
     KGSKIP,
     NISKIP,
     NJSKIP,
     JCPU,
     TRUE,
     XMESH,
     ORIENT,
    real, dimension(*) GRIDI,
    real, dimension(*) GN,
    real, dimension(*) GS 
    )
    +
    + +

    This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields to specific pairs of polar stereographic scalar fields.

    +

    The wave-space can be either triangular or rhomboidal. The grid-space can be either an equally-spaced grid (with or without pole points) or a Gaussian grid. The grid fields may have general indexing. The transforms are all multiprocessed. Transform several fields at a time to improve vectorization. Subprogram can be called from a multiprocessing environment.

    +

    PROGRAM HISTORY LOG: 96-02-29 IREDELL

    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + +
    IROMB- INTEGER SPECTRAL DOMAIN SHAPE (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    MAXWV- INTEGER SPECTRAL TRUNCATION
    IDRTI- INTEGER INPUT GRID IDENTIFIER (IDRTI=4 FOR GAUSSIAN GRID, IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    IMAXI- INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    JMAXI- INTEGER NUMBER OF INPUT LATITUDES.
    KMAX- INTEGER NUMBER OF FIELDS TO TRANSFORM.
    NPS- INTEGER ODD ORDER OF THE POLAR STEREOGRAPHIC GRIDS
    IPRIME- INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN. (DEFAULTS TO 1 IF IPRIME=0) (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    ISKIPI- INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES (DEFAULTS TO 1 IF ISKIPI=0)
    JSKIPI- INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH (DEFAULTS TO -IMAXI IF JSKIPI=0)
    KSKIPI- INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    KGSKIP- INTEGER SKIP NUMBER BETWEEN GRID FIELDS (DEFAULTS TO NPS*NPS IF KGSKIP=0)
    NISKIP- INTEGER SKIP NUMBER BETWEEN GRID I-POINTS (DEFAULTS TO 1 IF NISKIP=0)
    NJSKIP- INTEGER SKIP NUMBER BETWEEN GRID J-POINTS (DEFAULTS TO NPS IF NJSKIP=0)
    JCPU- INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    TRUE- REAL LATITUDE AT WHICH PS GRID IS TRUE (USUALLY 60.)
    XMESH- REAL GRID LENGTH AT TRUE LATITUDE (M)
    ORIENT- REAL LONGITUDE AT BOTTOM OF NORTHERN PS GRID (SOUTHERN PS GRID WILL HAVE OPPOSITE ORIENTATION.)
    GRIDI- REAL (*) INPUT GRID FIELDS
    GN- REAL (*) NORTHERN POLAR STEREOGRAPHIC FIELDS
    GS- REAL (*) SOUTHERN POLAR STEREOGRAPHIC FIELDS
    +
    +
    +

    SUBPROGRAMS CALLED:

      +
    • sptran() Perform a scalar spherical transform
    • +
    • sptgps() Transform spectral scalar to polar stereo.
    • +
    • ncpus() Gets environment number of cpus
    • +
    +

    Minimum grid dimensions for unaliased transforms to spectral:

    + + + + + + + + + + + + + + + + +
    DIMENSION LINEAR QUADRATIC
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    + +

    Definition at line 71 of file sptruns.f.

    + +

    References ncpus(), sptgps(), and sptran().

    + +

    Referenced by spectral_interp_mod::polates4::polates4_grib1(), and spectral_interp_mod::polates4::polates4_grib2().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptruns_8f.js b/ver-5.1.0/sptruns_8f.js new file mode 100644 index 00000000..cc546092 --- /dev/null +++ b/ver-5.1.0/sptruns_8f.js @@ -0,0 +1,4 @@ +var sptruns_8f = +[ + [ "sptruns", "sptruns_8f.html#a34f156e2049105d012e445f8aa215444", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptruns_8f_source.html b/ver-5.1.0/sptruns_8f_source.html new file mode 100644 index 00000000..58997ed2 --- /dev/null +++ b/ver-5.1.0/sptruns_8f_source.html @@ -0,0 +1,199 @@ + + + + + + + +NCEPLIBS-ip: sptruns.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptruns.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C>
    +
    3 C> Spectrally interpolate scalars to polar stereo
    +
    4 C> @author IREDELL @date 96-02-29
    +
    5 
    +
    6 C> This subprogram spectrally truncates scalar fields on a global
    +
    7 C> cylindrical grid, returning the fields to specific pairs of polar
    +
    8 C> stereographic scalar fields. The wave-space can be either
    +
    9 C> triangular or rhomboidal. The grid-space can be either an
    +
    10 C> equally-spaced grid (with or without pole points) or a Gaussian
    +
    11 C> grid. The grid fields may have general indexing. The transforms
    +
    12 C> are all multiprocessed. Transform several fields at a time to
    +
    13 C> improve vectorization. Subprogram can be called from a
    +
    14 C> multiprocessing environment.
    +
    15 C>
    +
    16 C> PROGRAM HISTORY LOG:
    +
    17 C> 96-02-29 IREDELL
    +
    18 C>
    +
    19 C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    +
    20 C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    +
    21 C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    +
    22 C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    +
    23 C> (IDRTI=4 FOR GAUSSIAN GRID,
    +
    24 C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    25 C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    +
    26 C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    +
    27 C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    +
    28 C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    +
    29 C> @param NPS - INTEGER ODD ORDER OF THE POLAR STEREOGRAPHIC GRIDS
    +
    30 C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    +
    31 C> (DEFAULTS TO 1 IF IPRIME=0)
    +
    32 C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    +
    33 C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    +
    34 C> (DEFAULTS TO 1 IF ISKIPI=0)
    +
    35 C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    +
    36 C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    +
    37 C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    +
    38 C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    +
    39 C> @param KGSKIP - INTEGER SKIP NUMBER BETWEEN GRID FIELDS
    +
    40 C> (DEFAULTS TO NPS*NPS IF KGSKIP=0)
    +
    41 C> @param NISKIP - INTEGER SKIP NUMBER BETWEEN GRID I-POINTS
    +
    42 C> (DEFAULTS TO 1 IF NISKIP=0)
    +
    43 C> @param NJSKIP - INTEGER SKIP NUMBER BETWEEN GRID J-POINTS
    +
    44 C> (DEFAULTS TO NPS IF NJSKIP=0)
    +
    45 C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    +
    46 C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    +
    47 C> @param TRUE - REAL LATITUDE AT WHICH PS GRID IS TRUE (USUALLY 60.)
    +
    48 C> @param XMESH - REAL GRID LENGTH AT TRUE LATITUDE (M)
    +
    49 C> @param ORIENT - REAL LONGITUDE AT BOTTOM OF NORTHERN PS GRID
    +
    50 C> (SOUTHERN PS GRID WILL HAVE OPPOSITE ORIENTATION.)
    +
    51 C> @param GRIDI - REAL (*) INPUT GRID FIELDS
    +
    52 C> @param GN - REAL (*) NORTHERN POLAR STEREOGRAPHIC FIELDS
    +
    53 C> @param GS - REAL (*) SOUTHERN POLAR STEREOGRAPHIC FIELDS
    +
    54 C>
    +
    55 C> SUBPROGRAMS CALLED:
    +
    56 C> - sptran() Perform a scalar spherical transform
    +
    57 C> - sptgps() Transform spectral scalar to polar stereo.
    +
    58 C> - ncpus() Gets environment number of cpus
    +
    59 C>
    +
    60 C> Minimum grid dimensions for unaliased transforms to spectral:
    +
    61 C> DIMENSION | LINEAR | QUADRATIC
    +
    62 C> ----------------------- | --------- | -------------
    +
    63 C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2
    +
    64 C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1
    +
    65 C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1
    +
    66 C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3
    +
    67 C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3
    +
    68 C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1
    +
    69 C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1
    +
    70 C>
    +
    71  SUBROUTINE sptruns(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,NPS,
    +
    72  & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP,
    +
    73  & NISKIP,NJSKIP,JCPU,TRUE,XMESH,ORIENT,
    +
    74  & GRIDI,GN,GS)
    +
    75  REAL GRIDI(*),GN(*),GS(*)
    +
    76  REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    77 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    78 C TRANSFORM INPUT GRID TO WAVE
    +
    79  jc=jcpu
    +
    80  IF(jc.EQ.0) jc=ncpus()
    +
    81  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    82  mdim=2*mx+1
    +
    83  jn=-jskipi
    +
    84  IF(jn.EQ.0) jn=imaxi
    +
    85  js=-jn
    +
    86  inp=(jmaxi-1)*max(0,-jn)+1
    +
    87  isp=(jmaxi-1)*max(0,-js)+1
    +
    88  CALL sptran(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    +
    89  & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    +
    90  & w,gridi(inp),gridi(isp),-1)
    +
    91 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    92 C TRANSFORM WAVE TO OUTPUT
    +
    93  CALL sptgps(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
    +
    94  & true,xmesh,orient,w,gn,gs)
    +
    95 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    96  END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    +
    subroutine sptgps(IROMB, MAXWV, KMAX, NPS, KWSKIP, KGSKIP, NISKIP, NJSKIP, TRUE, XMESH, ORIENT, WAVE, GN, GS)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to sca...
    Definition: sptgps.f:81
    +
    subroutine sptran(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDN, GRIDS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition: sptran.f:88
    +
    subroutine sptruns(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NPS, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, TRUE, XMESH, ORIENT, GRIDI, GN, GS)
    This subprogram spectrally truncates scalar fields on a global cylindrical grid, returning the fields...
    Definition: sptruns.f:75
    +
    +
    + + + + diff --git a/ver-5.1.0/sptrunsv_8f.html b/ver-5.1.0/sptrunsv_8f.html new file mode 100644 index 00000000..eada62f8 --- /dev/null +++ b/ver-5.1.0/sptrunsv_8f.html @@ -0,0 +1,426 @@ + + + + + + + +NCEPLIBS-ip: sptrunsv.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptrunsv.f File Reference
    +
    +
    + +

    Spectrally interpolate vectors to polar stereo. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptrunsv (IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NPS, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, TRUE, XMESH, ORIENT, GRIDUI, GRIDVI, LUV, UN, VN, US, VS, LDZ, DN, ZN, DS, ZS, LPS, PN, SN, PS, SS)
     This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields to specific pairs of polar stereographic scalar fields. More...
     
    +

    Detailed Description

    +

    Spectrally interpolate vectors to polar stereo.

    +

    96-02-29 | Iredell | Initial. 1998-12-15 | Iredell | Openmp directives inserted.

    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition in file sptrunsv.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptrunsv()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptrunsv ( IROMB,
     MAXWV,
     IDRTI,
     IMAXI,
     JMAXI,
     KMAX,
     NPS,
     IPRIME,
     ISKIPI,
     JSKIPI,
     KSKIPI,
     KGSKIP,
     NISKIP,
     NJSKIP,
     JCPU,
     TRUE,
     XMESH,
     ORIENT,
    real, dimension(*) GRIDUI,
    real, dimension(*) GRIDVI,
    logical LUV,
    real, dimension(*) UN,
    real, dimension(*) VN,
    real, dimension(*) US,
    real, dimension(*) VS,
    logical LDZ,
    real, dimension(*) DN,
    real, dimension(*) ZN,
    real, dimension(*) DS,
    real, dimension(*) ZS,
    logical LPS,
    real, dimension(*) PN,
    real, dimension(*) SN,
    real, dimension(*) PS,
    real, dimension(*) SS 
    )
    +
    + +

    This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields to specific pairs of polar stereographic scalar fields.

    +

    The wave-space can be either triangular or rhomboidal.

    +

    The grid-space can be either an equally-spaced grid (with or without pole points) or a gaussian grid.

    +

    The grid fields may have general indexing.

    +

    The transforms are all multiprocessed.

    +

    Transform several fields at a time to improve vectorization.

    +

    Subprogram can be called from a multiprocessing environment.

    +

    Minimum grid dimensions for unaliased transforms to spectral:

    + + + + + + + + + + + + + + + + +
    Dimension Linear Quadratic
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IROMBinteger spectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVinteger spectral truncation
    IDRTIinteger input grid identifier
      +
    • IDRTI=4 for Gaussian grid
    • +
    • IDRTI=0 for equally-spaced grid including poles
    • +
    • IDRTI=256 for equally-spaced grid excluding poles
    • +
    +
    IMAXIinteger even number of input longitudes.
    JMAXIinteger number of input latitudes.
    KMAXinteger number of fields to transform.
    NPSinteger odd order of the polar stereographic grids
    IPRIMEinteger input longitude index for the prime meridian. (defaults to 1 if IPRIME=0) (output longitude index for prime meridian assumed 1.)
    ISKIPIinteger skip number between input longitudes (defaults to 1 if ISKIPI=0)
    JSKIPIinteger skip number between input latitudes from south (defaults to -IMAXI if JSKIPI=0)
    KSKIPIinteger skip number between input grid fields (defaults to IMAXI*JMAXI if KSKIPI=0)
    KGSKIPinteger skip number between grid fields (defaults to NPS*NPS if KGSKIP=0)
    NISKIPinteger skip number between grid i-points (defaults to 1 if NISKIP=0)
    NJSKIPinteger skip number between grid j-points (defaults to NPS if NJSKIP=0)
    JCPUinteger number of cpus over which to multiprocess (defaults to environment NCPUS if JCPU=0)
    TRUEreal latitude at which ps grid is true (usually 60.)
    XMESHreal grid length at true latitude (m)
    ORIENTreal longitude at bottom of Northern PS grid (Southern PS grid will have opposite orientation.)
    GRIDUIreal input grid u-winds
    GRIDVIreal input grid v-winds
    LUVlogical flag whether to return winds
    LDZlogical flag whether to return divergence and vorticity
    LPSlogical flag whether to return potential and streamfcn
    UNreal northern ps u-winds if luv
    VNreal northern ps v-winds if luv
    USreal southern ps u-winds if luv
    VSreal southern ps v-winds if luv
    DNreal northern divergences if ldz
    ZNreal northern vorticities if ldz
    DSreal southern divergences if ldz
    ZSreal southern vorticities if ldz
    PNreal northern potentials if lps
    SNreal northern streamfcns if lps
    PSreal southern potentials if lps
    SSreal southern streamfcns if lps
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition at line 88 of file sptrunsv.f.

    + +

    References ncpus(), splaplac(), sptgps(), sptgpsv(), sptranv(), and spwget().

    + +

    Referenced by spectral_interp_mod::polatev4::polatev4_grib1(), and spectral_interp_mod::polatev4::polatev4_grib2().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptrunsv_8f.js b/ver-5.1.0/sptrunsv_8f.js new file mode 100644 index 00000000..af10490c --- /dev/null +++ b/ver-5.1.0/sptrunsv_8f.js @@ -0,0 +1,4 @@ +var sptrunsv_8f = +[ + [ "sptrunsv", "sptrunsv_8f.html#a1373b651b9dea586e33d3033aae68656", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptrunsv_8f_source.html b/ver-5.1.0/sptrunsv_8f_source.html new file mode 100644 index 00000000..c3298aa7 --- /dev/null +++ b/ver-5.1.0/sptrunsv_8f_source.html @@ -0,0 +1,255 @@ + + + + + + + +NCEPLIBS-ip: sptrunsv.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptrunsv.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Spectrally interpolate vectors to polar stereo.
    +
    3 C>
    +
    4 C> 96-02-29 | Iredell | Initial.
    +
    5 C> 1998-12-15 | Iredell | Openmp directives inserted.
    +
    6 C>
    +
    7 C> @author Iredell @date 96-02-29
    +
    8 
    +
    9 C> This subprogram spectrally truncates vector fields
    +
    10 C> on a global cylindrical grid, returning the fields
    +
    11 C> to specific pairs of polar stereographic scalar fields.
    +
    12 C>
    +
    13 C> The wave-space can be either triangular or rhomboidal.
    +
    14 C>
    +
    15 C> The grid-space can be either an equally-spaced grid
    +
    16 C> (with or without pole points) or a gaussian grid.
    +
    17 C>
    +
    18 C> The grid fields may have general indexing.
    +
    19 C>
    +
    20 C> The transforms are all multiprocessed.
    +
    21 C>
    +
    22 C> Transform several fields at a time to improve vectorization.
    +
    23 C>
    +
    24 C> Subprogram can be called from a multiprocessing environment.
    +
    25 C>
    +
    26 C> Minimum grid dimensions for unaliased transforms to spectral:
    +
    27 C> Dimension |Linear |Quadratic
    +
    28 C> ----------------------- |--------- |-------------
    +
    29 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    +
    30 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    +
    31 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    +
    32 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    +
    33 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    +
    34 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    +
    35 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    +
    36 C>
    +
    37 C> @param IROMB integer spectral domain shape
    +
    38 C> (0 for triangular, 1 for rhomboidal)
    +
    39 C> @param MAXWV integer spectral truncation
    +
    40 C> @param IDRTI integer input grid identifier
    +
    41 C> - IDRTI=4 for Gaussian grid
    +
    42 C> - IDRTI=0 for equally-spaced grid including poles
    +
    43 C> - IDRTI=256 for equally-spaced grid excluding poles
    +
    44 C> @param IMAXI integer even number of input longitudes.
    +
    45 C> @param JMAXI integer number of input latitudes.
    +
    46 C> @param KMAX integer number of fields to transform.
    +
    47 C> @param NPS integer odd order of the polar stereographic grids
    +
    48 C> @param IPRIME integer input longitude index for the prime meridian.
    +
    49 C> (defaults to 1 if IPRIME=0)
    +
    50 C> (output longitude index for prime meridian assumed 1.)
    +
    51 C> @param ISKIPI integer skip number between input longitudes
    +
    52 C> (defaults to 1 if ISKIPI=0)
    +
    53 C> @param JSKIPI integer skip number between input latitudes from south
    +
    54 C> (defaults to -IMAXI if JSKIPI=0)
    +
    55 C> @param KSKIPI integer skip number between input grid fields
    +
    56 C> (defaults to IMAXI*JMAXI if KSKIPI=0)
    +
    57 C> @param KGSKIP integer skip number between grid fields
    +
    58 C> (defaults to NPS*NPS if KGSKIP=0)
    +
    59 C> @param NISKIP integer skip number between grid i-points
    +
    60 C> (defaults to 1 if NISKIP=0)
    +
    61 C> @param NJSKIP integer skip number between grid j-points
    +
    62 C> (defaults to NPS if NJSKIP=0)
    +
    63 C> @param JCPU integer number of cpus over which to multiprocess
    +
    64 C> (defaults to environment NCPUS if JCPU=0)
    +
    65 C> @param TRUE real latitude at which ps grid is true (usually 60.)
    +
    66 C> @param XMESH real grid length at true latitude (m)
    +
    67 C> @param ORIENT real longitude at bottom of Northern PS grid
    +
    68 C> (Southern PS grid will have opposite orientation.)
    +
    69 C> @param GRIDUI real input grid u-winds
    +
    70 C> @param GRIDVI real input grid v-winds
    +
    71 C> @param LUV logical flag whether to return winds
    +
    72 C> @param LDZ logical flag whether to return divergence and vorticity
    +
    73 C> @param LPS logical flag whether to return potential and streamfcn
    +
    74 C> @param UN real northern ps u-winds if luv
    +
    75 C> @param VN real northern ps v-winds if luv
    +
    76 C> @param US real southern ps u-winds if luv
    +
    77 C> @param VS real southern ps v-winds if luv
    +
    78 C> @param DN real northern divergences if ldz
    +
    79 C> @param ZN real northern vorticities if ldz
    +
    80 C> @param DS real southern divergences if ldz
    +
    81 C> @param ZS real southern vorticities if ldz
    +
    82 C> @param PN real northern potentials if lps
    +
    83 C> @param SN real northern streamfcns if lps
    +
    84 C> @param PS real southern potentials if lps
    +
    85 C> @param SS real southern streamfcns if lps
    +
    86 C>
    +
    87 C> @author Iredell @date 96-02-29
    +
    88  SUBROUTINE sptrunsv(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,NPS,
    +
    89  & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP,
    +
    90  & NISKIP,NJSKIP,JCPU,TRUE,XMESH,ORIENT,
    +
    91  & GRIDUI,GRIDVI,
    +
    92  & LUV,UN,VN,US,VS,LDZ,DN,ZN,DS,ZS,
    +
    93  & LPS,PN,SN,PS,SS)
    +
    94  LOGICAL LUV,LDZ,LPS
    +
    95  REAL GRIDUI(*),GRIDVI(*)
    +
    96  REAL UN(*),VN(*),US(*),VS(*),DN(*),ZN(*),DS(*),ZS(*)
    +
    97  REAL PN(*),SN(*),PS(*),SS(*)
    +
    98  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    99  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    100  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    101  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    102  REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    103  REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    104 
    +
    105 C TRANSFORM INPUT GRID TO WAVE
    +
    106  jc=jcpu
    +
    107  IF(jc.EQ.0) jc=ncpus()
    +
    108  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    109  mdim=2*mx+1
    +
    110  jn=-jskipi
    +
    111  IF(jn.EQ.0) jn=imaxi
    +
    112  js=-jn
    +
    113  inp=(jmaxi-1)*max(0,-jn)+1
    +
    114  isp=(jmaxi-1)*max(0,-js)+1
    +
    115  CALL sptranv(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    +
    116  & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    +
    117  & wd,wz,
    +
    118  & gridui(inp),gridui(isp),gridvi(inp),gridvi(isp),-1)
    +
    119 
    +
    120 C TRANSFORM WAVE TO OUTPUT WINDS
    +
    121  IF(luv) THEN
    +
    122  CALL sptgpsv(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
    +
    123  & true,xmesh,orient,wd,wz,un,vn,us,vs)
    +
    124  ENDIF
    +
    125 
    +
    126 C TRANSFORM WAVE TO OUTPUT DIVERGENCE AND VORTICITY
    +
    127  IF(ldz) THEN
    +
    128  CALL sptgps(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
    +
    129  & true,xmesh,orient,wd,dn,ds)
    +
    130  CALL sptgps(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
    +
    131  & true,xmesh,orient,wz,zn,zs)
    +
    132  ENDIF
    +
    133 
    +
    134 C TRANSFORM WAVE TO OUTPUT POTENTIAL AND STREAMFUNCTION
    +
    135  IF(lps) THEN
    +
    136  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    137 C$OMP PARALLEL DO
    +
    138  DO k=1,kmax
    +
    139  CALL splaplac(iromb,maxwv,enn1,wd(1,k),wd(1,k),-1)
    +
    140  CALL splaplac(iromb,maxwv,enn1,wz(1,k),wz(1,k),-1)
    +
    141  wd(1:2,k)=0.
    +
    142  wz(1:2,k)=0.
    +
    143  ENDDO
    +
    144  CALL sptgps(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
    +
    145  & true,xmesh,orient,wd,pn,ps)
    +
    146  CALL sptgps(iromb,maxwv,kmax,nps,mdim,kgskip,niskip,njskip,
    +
    147  & true,xmesh,orient,wz,sn,ss)
    +
    148  ENDIF
    +
    149  END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    +
    subroutine splaplac(I, M, ENN1, Q, QD2, IDIR)
    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
    Definition: splaplac.f:25
    +
    subroutine sptgps(IROMB, MAXWV, KMAX, NPS, KWSKIP, KGSKIP, NISKIP, NJSKIP, TRUE, XMESH, ORIENT, WAVE, GN, GS)
    This subprogram performs a spherical transform from spectral coefficients of scalar quantities to sca...
    Definition: sptgps.f:81
    +
    subroutine sptgpsv(IROMB, MAXWV, KMAX, NPS, KWSKIP, KGSKIP, NISKIP, NJSKIP, TRUE, XMESH, ORIENT, WAVED, WAVEZ, UN, VN, US, VS)
    This subprogram performs a spherical transform from spectral coefficients of divergences and curls to...
    Definition: sptgpsv.f:83
    +
    subroutine sptranv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
    Definition: sptranv.f:91
    +
    subroutine sptrunsv(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, KMAX, NPS, IPRIME, ISKIPI, JSKIPI, KSKIPI, KGSKIP, NISKIP, NJSKIP, JCPU, TRUE, XMESH, ORIENT, GRIDUI, GRIDVI, LUV, UN, VN, US, VS, LDZ, DN, ZN, DS, ZS, LPS, PN, SN, PS, SS)
    This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields...
    Definition: sptrunsv.f:94
    +
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +
    +
    + + + + diff --git a/ver-5.1.0/sptrunv_8f.html b/ver-5.1.0/sptrunv_8f.html new file mode 100644 index 00000000..19b8f50e --- /dev/null +++ b/ver-5.1.0/sptrunv_8f.html @@ -0,0 +1,375 @@ + + + + + + + +NCEPLIBS-ip: sptrunv.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    sptrunv.f File Reference
    +
    +
    + +

    Spectrally truncate gridded vector fields. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine sptrunv (IROMB, MAXWV, IDRTI, IMAXI, JMAXI, IDRTO, IMAXO, JMAXO, KMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, ISKIPO, JSKIPO, KSKIPO, JCPU, GRIDUI, GRIDVI, LUV, GRIDUO, GRIDVO, LDZ, GRIDDO, GRIDZO, LPS, GRIDPO, GRIDSO)
     This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields to a possibly different global cylindrical grid. More...
     
    +

    Detailed Description

    +

    Spectrally truncate gridded vector fields.

    +
    Author
    IREDELL
    +
    Date
    96-02-29
    + +

    Definition in file sptrunv.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ sptrunv()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine sptrunv ( IROMB,
     MAXWV,
     IDRTI,
     IMAXI,
     JMAXI,
     IDRTO,
     IMAXO,
     JMAXO,
     KMAX,
     IPRIME,
     ISKIPI,
     JSKIPI,
     KSKIPI,
     ISKIPO,
     JSKIPO,
     KSKIPO,
     JCPU,
    real, dimension(*) GRIDUI,
    real, dimension(*) GRIDVI,
    logical LUV,
    real, dimension(*) GRIDUO,
    real, dimension(*) GRIDVO,
    logical LDZ,
    real, dimension(*) GRIDDO,
    real, dimension(*) GRIDZO,
    logical LPS,
    real, dimension(*) GRIDPO,
    real, dimension(*) GRIDSO 
    )
    +
    + +

    This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields to a possibly different global cylindrical grid.

    +

    The wave-space can be either triangular or rhomboidal. Either grid-space can be either an equally-spaced grid (with or without pole points) or a Gaussian grid. The grid fields may have general indexing. The transforms are all multiprocessed. Over zonal wavenumber to ensure reproducibility. Transform several fields at a time to improve vectorization. Subprogram can be called from a multiprocessing environment.

    +

    PROGRAM HISTORY LOG:

      +
    • 96-02-29 IREDELL
    • +
    • 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED
    • +
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IROMB- INTEGER SPECTRAL DOMAIN SHAPE (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    MAXWV- INTEGER SPECTRAL TRUNCATION
    IDRTI- INTEGER INPUT GRID IDENTIFIER (IDRTI=4 FOR GAUSSIAN GRID, IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    IMAXI- INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    JMAXI- INTEGER NUMBER OF INPUT LATITUDES.
    IDRTO- INTEGER OUTPUT GRID IDENTIFIER (IDRTO=4 FOR GAUSSIAN GRID, IDRTO=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, IDRTO=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    IMAXO- INTEGER EVEN NUMBER OF OUTPUT LONGITUDES.
    JMAXO- INTEGER NUMBER OF OUTPUT LATITUDES.
    KMAX- INTEGER NUMBER OF FIELDS TO TRANSFORM.
    IPRIME- INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN. (DEFAULTS TO 1 IF IPRIME=0) (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    ISKIPI- INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES (DEFAULTS TO 1 IF ISKIPI=0)
    JSKIPI- INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH (DEFAULTS TO -IMAXI IF JSKIPI=0)
    KSKIPI- INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    ISKIPO- INTEGER SKIP NUMBER BETWEEN OUTPUT LONGITUDES (DEFAULTS TO 1 IF ISKIPO=0)
    JSKIPO- INTEGER SKIP NUMBER BETWEEN OUTPUT LATITUDES FROM SOUTH (DEFAULTS TO -IMAXO IF JSKIPO=0)
    KSKIPO- INTEGER SKIP NUMBER BETWEEN OUTPUT GRID FIELDS (DEFAULTS TO IMAXO*JMAXO IF KSKIPO=0)
    JCPU- INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    GRIDUI- REAL (*) INPUT GRID U-WINDS
    GRIDVI- REAL (*) INPUT GRID V-WINDS
    LUV- LOGICAL FLAG WHETHER TO RETURN WINDS
    LDZ- LOGICAL FLAG WHETHER TO RETURN DIVERGENCE AND VORTICITY
    LPS- LOGICAL FLAG WHETHER TO RETURN POTENTIAL AND STREAMFCN
    GRIDUO- REAL (*) OUTPUT U-WINDS IF LUV (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    GRIDVO- REAL (*) OUTPUT V-WINDS IF LUV (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    GRIDDO- REAL (*) OUTPUT DIVERGENCES IF LDZ (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    GRIDZO- REAL (*) OUTPUT VORTICITIES IF LDZ (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    GRIDPO- REAL (*) OUTPUT POTENTIALS IF LPS (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    GRIDSO- REAL (*) OUTPUT STREAMFCNS IF LPS (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    +
    +
    +

    SUBPROGRAMS CALLED:

      +
    • SPWGET() GET WAVE-SPACE CONSTANTS
    • +
    • SPLAPLAC() COMPUTE LAPLACIAN IN SPECTRAL SPACE
    • +
    • SPTRAN() PERFORM A SCALAR SPHERICAL TRANSFORM
    • +
    • SPTRANV() PERFORM A VECTOR SPHERICAL TRANSFORM
    • +
    • NCPUS() GETS ENVIRONMENT NUMBER OF CPUS
    • +
    +

    REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:

    + + + + + + + + + + + + + + + + +
    DIMENSION LINEAR QUADRATIC
    IMAX 2*MAXWV+2 3*MAXWV/2*2+2
    JMAX (IDRT=4,IROMB=0) 1*MAXWV+1 3*MAXWV/2+1
    JMAX (IDRT=4,IROMB=1) 2*MAXWV+1 5*MAXWV/2+1
    JMAX (IDRT=0,IROMB=0) 2*MAXWV+3 3*MAXWV/2*2+3
    JMAX (IDRT=0,IROMB=1) 4*MAXWV+3 5*MAXWV/2*2+3
    JMAX (IDRT=256,IROMB=0) 2*MAXWV+1 3*MAXWV/2*2+1
    JMAX (IDRT=256,IROMB=1) 4*MAXWV+1 5*MAXWV/2*2+1
    + +

    Definition at line 90 of file sptrunv.f.

    + +

    References ncpus(), splaplac(), sptran(), sptranv(), and spwget().

    + +

    Referenced by spectral_interp_mod::polatev4::polatev4_grib1(), and spectral_interp_mod::polatev4::polatev4_grib2().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/sptrunv_8f.js b/ver-5.1.0/sptrunv_8f.js new file mode 100644 index 00000000..ce8c98f1 --- /dev/null +++ b/ver-5.1.0/sptrunv_8f.js @@ -0,0 +1,4 @@ +var sptrunv_8f = +[ + [ "sptrunv", "sptrunv_8f.html#a9aa39c13dd38585b3afb30cb2486817f", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/sptrunv_8f_source.html b/ver-5.1.0/sptrunv_8f_source.html new file mode 100644 index 00000000..9d41d87d --- /dev/null +++ b/ver-5.1.0/sptrunv_8f_source.html @@ -0,0 +1,267 @@ + + + + + + + +NCEPLIBS-ip: sptrunv.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    sptrunv.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C>
    +
    3 C> Spectrally truncate gridded vector fields
    +
    4 C> @author IREDELL @date 96-02-29
    +
    5 
    +
    6 C> This subprogram spectrally truncates vector fields
    +
    7 C> on a global cylindrical grid, returning the fields
    +
    8 C> to a possibly different global cylindrical grid.
    +
    9 C> The wave-space can be either triangular or rhomboidal.
    +
    10 C> Either grid-space can be either an equally-spaced grid
    +
    11 C> (with or without pole points) or a Gaussian grid.
    +
    12 C> The grid fields may have general indexing.
    +
    13 C> The transforms are all multiprocessed.
    +
    14 C> Over zonal wavenumber to ensure reproducibility.
    +
    15 C> Transform several fields at a time to improve vectorization.
    +
    16 C> Subprogram can be called from a multiprocessing environment.
    +
    17 C>
    +
    18 C> PROGRAM HISTORY LOG:
    +
    19 C> - 96-02-29 IREDELL
    +
    20 C> - 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED
    +
    21 C>
    +
    22 C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE
    +
    23 C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL)
    +
    24 C> @param MAXWV - INTEGER SPECTRAL TRUNCATION
    +
    25 C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER
    +
    26 C> (IDRTI=4 FOR GAUSSIAN GRID,
    +
    27 C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    28 C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    +
    29 C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES.
    +
    30 C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES.
    +
    31 C> @param IDRTO - INTEGER OUTPUT GRID IDENTIFIER
    +
    32 C> (IDRTO=4 FOR GAUSSIAN GRID,
    +
    33 C> IDRTO=0 FOR EQUALLY-SPACED GRID INCLUDING POLES,
    +
    34 C> IDRTO=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES)
    +
    35 C> @param IMAXO - INTEGER EVEN NUMBER OF OUTPUT LONGITUDES.
    +
    36 C> @param JMAXO - INTEGER NUMBER OF OUTPUT LATITUDES.
    +
    37 C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM.
    +
    38 C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN.
    +
    39 C> (DEFAULTS TO 1 IF IPRIME=0)
    +
    40 C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.)
    +
    41 C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES
    +
    42 C> (DEFAULTS TO 1 IF ISKIPI=0)
    +
    43 C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH
    +
    44 C> (DEFAULTS TO -IMAXI IF JSKIPI=0)
    +
    45 C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS
    +
    46 C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0)
    +
    47 C> @param ISKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LONGITUDES
    +
    48 C> (DEFAULTS TO 1 IF ISKIPO=0)
    +
    49 C> @param JSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LATITUDES FROM SOUTH
    +
    50 C> (DEFAULTS TO -IMAXO IF JSKIPO=0)
    +
    51 C> @param KSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT GRID FIELDS
    +
    52 C> (DEFAULTS TO IMAXO*JMAXO IF KSKIPO=0)
    +
    53 C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS
    +
    54 C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0)
    +
    55 C> @param GRIDUI - REAL (*) INPUT GRID U-WINDS
    +
    56 C> @param GRIDVI - REAL (*) INPUT GRID V-WINDS
    +
    57 C> @param LUV - LOGICAL FLAG WHETHER TO RETURN WINDS
    +
    58 C> @param LDZ - LOGICAL FLAG WHETHER TO RETURN DIVERGENCE AND VORTICITY
    +
    59 C> @param LPS - LOGICAL FLAG WHETHER TO RETURN POTENTIAL AND STREAMFCN
    +
    60 C> @param GRIDUO - REAL (*) OUTPUT U-WINDS IF LUV
    +
    61 C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    +
    62 C> @param GRIDVO - REAL (*) OUTPUT V-WINDS IF LUV
    +
    63 C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    +
    64 C> @param GRIDDO - REAL (*) OUTPUT DIVERGENCES IF LDZ
    +
    65 C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    +
    66 C> @param GRIDZO - REAL (*) OUTPUT VORTICITIES IF LDZ
    +
    67 C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    +
    68 C> @param GRIDPO - REAL (*) OUTPUT POTENTIALS IF LPS
    +
    69 C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    +
    70 C> @param GRIDSO - REAL (*) OUTPUT STREAMFCNS IF LPS
    +
    71 C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE)
    +
    72 C>
    +
    73 C> SUBPROGRAMS CALLED:
    +
    74 C> - SPWGET() GET WAVE-SPACE CONSTANTS
    +
    75 C> - SPLAPLAC() COMPUTE LAPLACIAN IN SPECTRAL SPACE
    +
    76 C> - SPTRAN() PERFORM A SCALAR SPHERICAL TRANSFORM
    +
    77 C> - SPTRANV() PERFORM A VECTOR SPHERICAL TRANSFORM
    +
    78 C> - NCPUS() GETS ENVIRONMENT NUMBER OF CPUS
    +
    79 C>
    +
    80 C> REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL:
    +
    81 C> DIMENSION |LINEAR |QUADRATIC
    +
    82 C> ----------------------- |--------- |-------------
    +
    83 C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2
    +
    84 C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1
    +
    85 C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1
    +
    86 C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3
    +
    87 C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3
    +
    88 C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1
    +
    89 C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1
    +
    90  SUBROUTINE sptrunv(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,
    +
    91  & IDRTO,IMAXO,JMAXO,KMAX,
    +
    92  & IPRIME,ISKIPI,JSKIPI,KSKIPI,
    +
    93  & ISKIPO,JSKIPO,KSKIPO,JCPU,GRIDUI,GRIDVI,
    +
    94  & LUV,GRIDUO,GRIDVO,LDZ,GRIDDO,GRIDZO,
    +
    95  & LPS,GRIDPO,GRIDSO)
    +
    96  LOGICAL LUV,LDZ,LPS
    +
    97  REAL GRIDUI(*),GRIDVI(*)
    +
    98  REAL GRIDUO(*),GRIDVO(*),GRIDDO(*),GRIDZO(*),GRIDPO(*),GRIDSO(*)
    +
    99  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    100  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    101  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    102  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    103  REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    104  REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX)
    +
    105 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    106 C TRANSFORM INPUT GRID TO WAVE
    +
    107  jc=jcpu
    +
    108  IF(jc.EQ.0) jc=ncpus()
    +
    109  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    110  mdim=2*mx+1
    +
    111  jn=-jskipi
    +
    112  IF(jn.EQ.0) jn=imaxi
    +
    113  js=-jn
    +
    114  inp=(jmaxi-1)*max(0,-jn)+1
    +
    115  isp=(jmaxi-1)*max(0,-js)+1
    +
    116  CALL sptranv(iromb,maxwv,idrti,imaxi,jmaxi,kmax,
    +
    117  & iprime,iskipi,jn,js,mdim,kskipi,0,0,jc,
    +
    118  & wd,wz,
    +
    119  & gridui(inp),gridui(isp),gridvi(inp),gridvi(isp),-1)
    +
    120 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    121 C TRANSFORM WAVE TO OUTPUT WINDS
    +
    122  jn=-jskipo
    +
    123  IF(jn.EQ.0) jn=imaxo
    +
    124  js=-jn
    +
    125  inp=(jmaxo-1)*max(0,-jn)+1
    +
    126  isp=(jmaxo-1)*max(0,-js)+1
    +
    127  IF(luv) THEN
    +
    128  CALL sptranv(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
    +
    129  & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
    +
    130  & wd,wz,
    +
    131  & griduo(inp),griduo(isp),gridvo(inp),gridvo(isp),1)
    +
    132  ENDIF
    +
    133 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    134 C TRANSFORM WAVE TO OUTPUT DIVERGENCE AND VORTICITY
    +
    135  IF(ldz) THEN
    +
    136  CALL sptran(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
    +
    137  & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
    +
    138  & wd,griddo(inp),griddo(isp),1)
    +
    139  CALL sptran(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
    +
    140  & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
    +
    141  & wz,gridzo(inp),gridzo(isp),1)
    +
    142  ENDIF
    +
    143 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    144 C TRANSFORM WAVE TO OUTPUT POTENTIAL AND STREAMFUNCTION
    +
    145  IF(lps) THEN
    +
    146  CALL spwget(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    147 C$OMP PARALLEL DO
    +
    148  DO k=1,kmax
    +
    149  CALL splaplac(iromb,maxwv,enn1,wd(1,k),wd(1,k),-1)
    +
    150  CALL splaplac(iromb,maxwv,enn1,wz(1,k),wz(1,k),-1)
    +
    151  wd(1:2,k)=0.
    +
    152  wz(1:2,k)=0.
    +
    153  ENDDO
    +
    154  CALL sptran(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
    +
    155  & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
    +
    156  & wd,gridpo(inp),gridpo(isp),1)
    +
    157  CALL sptran(iromb,maxwv,idrto,imaxo,jmaxo,kmax,
    +
    158  & 0,iskipo,jn,js,mdim,kskipo,0,0,jc,
    +
    159  & wz,gridso(inp),gridso(isp),1)
    +
    160  ENDIF
    +
    161 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    +
    162  END
    +
    function ncpus()
    Set number of CPUs - the number of processors over which to parallelize.
    Definition: ncpus.F:24
    +
    subroutine splaplac(I, M, ENN1, Q, QD2, IDIR)
    Computes the laplacian or the inverse laplacian of a scalar field in spectral space.
    Definition: splaplac.f:25
    +
    subroutine sptran(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVE, GRIDN, GRIDS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of scalar quantities and...
    Definition: sptran.f:88
    +
    subroutine sptranv(IROMB, MAXWV, IDRT, IMAX, JMAX, KMAX, IPRIME, ISKIP, JNSKIP, JSSKIP, KWSKIP, KGSKIP, JBEG, JEND, JCPU, WAVED, WAVEZ, GRIDUN, GRIDUS, GRIDVN, GRIDVS, IDIR)
    This subprogram performs a spherical transform between spectral coefficients of divergences and curls...
    Definition: sptranv.f:91
    +
    subroutine sptrunv(IROMB, MAXWV, IDRTI, IMAXI, JMAXI, IDRTO, IMAXO, JMAXO, KMAX, IPRIME, ISKIPI, JSKIPI, KSKIPI, ISKIPO, JSKIPO, KSKIPO, JCPU, GRIDUI, GRIDVI, LUV, GRIDUO, GRIDVO, LDZ, GRIDDO, GRIDZO, LPS, GRIDPO, GRIDSO)
    This subprogram spectrally truncates vector fields on a global cylindrical grid, returning the fields...
    Definition: sptrunv.f:96
    +
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +
    +
    + + + + diff --git a/ver-5.1.0/spuv2dz_8f.html b/ver-5.1.0/spuv2dz_8f.html new file mode 100644 index 00000000..2d5eff30 --- /dev/null +++ b/ver-5.1.0/spuv2dz_8f.html @@ -0,0 +1,244 @@ + + + + + + + +NCEPLIBS-ip: spuv2dz.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    spuv2dz.f File Reference
    +
    +
    + +

    Compute divergence and vorticity from winds. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine spuv2dz (I, M, ENN1, ELONN1, EON, EONTOP, U, V, UTOP, VTOP, D, Z)
     Computes the divergence and vorticity from wind components in spectral space. More...
     
    +

    Detailed Description

    +

    Compute divergence and vorticity from winds.

    +
    Author
    Iredell
    +
    Date
    92-10-31
    + +

    Definition in file spuv2dz.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ spuv2dz()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spuv2dz ( I,
     M,
    real, dimension((m+1)*((i+1)*m+2)/2) ENN1,
    real, dimension((m+1)*((i+1)*m+2)/2) ELONN1,
    real, dimension((m+1)*((i+1)*m+2)/2) EON,
    real, dimension(m+1) EONTOP,
    real, dimension((m+1)*((i+1)*m+2)) U,
    real, dimension((m+1)*((i+1)*m+2)) V,
    real, dimension(2*(m+1)) UTOP,
    real, dimension(2*(m+1)) VTOP,
    real, dimension((m+1)*((i+1)*m+2)) D,
    real, dimension((m+1)*((i+1)*m+2)) Z 
    )
    +
    + +

    Computes the divergence and vorticity from wind components in spectral space.

    +

    Subprogram speps() should be called already.

    +

    If L is the zonal wavenumber, N is the total wavenumber, EPS(L,N)=SQRT((N**2-L**2)/(4*N**2-1)) and A is earth radius, then the divergence D is computed as:

    + D(L,N)=I*L*A*U(L,N)
    + +EPS(L,N+1)*N*A*V(L,N+1)-EPS(L,N)*(N+1)*A*V(L,N-1)
    + 

    and the vorticity Z is computed as:

    + Z(L,N)=I*L*A*V(L,N)
    + -EPS(L,N+1)*N*A*U(L,N+1)+EPS(L,N)*(N+1)*A*U(L,N-1)
    + 

    where U is the zonal wind and V is the meridional wind.

    +

    U and V are weighted by the secant of latitude.

    +

    Extra terms are used over top of the spectral domain.

    +

    Advantage is taken of the fact that EPS(L,L)=0 in order to vectorize over the entire spectral domain.

    +
    Parameters
    + + + + + + + + + + + + + +
    Iinteger spectral domain shape (0 for triangular, 1 for rhomboidal)
    MINTEGER spectral truncation
    ENN1((M+1)*((I+1)*M+2)/2) N*(N+1)/A**2
    ELONN1((M+1)*((I+1)*M+2)/2) L/(N*(N+1))*A
    EON((M+1)*((I+1)*M+2)/2) EPSILON/N*A
    EONTOP(M+1) EPSILON/N*A over top
    U((M+1)*((I+1)*M+2)) zonal wind (over coslat)
    V((M+1)*((I+1)*M+2)) merid wind (over coslat)
    UTOP(2*(M+1)) zonal wind (over coslat) over top
    VTOP(2*(M+1)) merid wind (over coslat) over top
    D((M+1)*((I+1)*M+2)) divergence
    Z((M+1)*((I+1)*M+2)) vorticity
    +
    +
    +
    Author
    Iredell
    +
    Date
    92-10-31
    + +

    Definition at line 48 of file spuv2dz.f.

    + +

    Referenced by sptranfv().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/spuv2dz_8f.js b/ver-5.1.0/spuv2dz_8f.js new file mode 100644 index 00000000..fb93c82c --- /dev/null +++ b/ver-5.1.0/spuv2dz_8f.js @@ -0,0 +1,4 @@ +var spuv2dz_8f = +[ + [ "spuv2dz", "spuv2dz_8f.html#a27edc2d10e0a76a45e4aaae58bf018b9", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/spuv2dz_8f_source.html b/ver-5.1.0/spuv2dz_8f_source.html new file mode 100644 index 00000000..f382afec --- /dev/null +++ b/ver-5.1.0/spuv2dz_8f_source.html @@ -0,0 +1,191 @@ + + + + + + + +NCEPLIBS-ip: spuv2dz.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    spuv2dz.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Compute divergence and vorticity from winds.
    +
    3 C> @author Iredell @date 92-10-31
    +
    4 
    +
    5 C> Computes the divergence and vorticity from wind components
    +
    6 C> in spectral space.
    +
    7 C>
    +
    8 C> Subprogram speps() should be called already.
    +
    9 C>
    +
    10 C> If L is the zonal wavenumber, N is the total wavenumber,
    +
    11 C> EPS(L,N)=SQRT((N**2-L**2)/(4*N**2-1)) and A is earth radius,
    +
    12 C> then the divergence D is computed as:
    +
    13 C> <pre>
    +
    14 C> D(L,N)=I*L*A*U(L,N)
    +
    15 C> +EPS(L,N+1)*N*A*V(L,N+1)-EPS(L,N)*(N+1)*A*V(L,N-1)
    +
    16 C> </pre>
    +
    17 C>
    +
    18 C> and the vorticity Z is computed as:
    +
    19 C> <pre>
    +
    20 C> Z(L,N)=I*L*A*V(L,N)
    +
    21 C> -EPS(L,N+1)*N*A*U(L,N+1)+EPS(L,N)*(N+1)*A*U(L,N-1)
    +
    22 C> </pre>
    +
    23 C>
    +
    24 C> where U is the zonal wind and V is the meridional wind.
    +
    25 C>
    +
    26 C> U and V are weighted by the secant of latitude.
    +
    27 C>
    +
    28 C> Extra terms are used over top of the spectral domain.
    +
    29 C>
    +
    30 C> Advantage is taken of the fact that EPS(L,L)=0
    +
    31 C> in order to vectorize over the entire spectral domain.
    +
    32 C>
    +
    33 C> @param I integer spectral domain shape
    +
    34 C> (0 for triangular, 1 for rhomboidal)
    +
    35 C> @param M INTEGER spectral truncation
    +
    36 C> @param ENN1 ((M+1)*((I+1)*M+2)/2) N*(N+1)/A**2
    +
    37 C> @param ELONN1 ((M+1)*((I+1)*M+2)/2) L/(N*(N+1))*A
    +
    38 C> @param EON ((M+1)*((I+1)*M+2)/2) EPSILON/N*A
    +
    39 C> @param EONTOP (M+1) EPSILON/N*A over top
    +
    40 C> @param U ((M+1)*((I+1)*M+2)) zonal wind (over coslat)
    +
    41 C> @param V ((M+1)*((I+1)*M+2)) merid wind (over coslat)
    +
    42 C> @param UTOP (2*(M+1)) zonal wind (over coslat) over top
    +
    43 C> @param VTOP (2*(M+1)) merid wind (over coslat) over top
    +
    44 C> @param D ((M+1)*((I+1)*M+2)) divergence
    +
    45 C> @param Z ((M+1)*((I+1)*M+2)) vorticity
    +
    46 C>
    +
    47 C> @author Iredell @date 92-10-31
    +
    48  SUBROUTINE spuv2dz(I,M,ENN1,ELONN1,EON,EONTOP,U,V,UTOP,VTOP,D,Z)
    +
    49  REAL ENN1((M+1)*((I+1)*M+2)/2),ELONN1((M+1)*((I+1)*M+2)/2)
    +
    50  REAL EON((M+1)*((I+1)*M+2)/2),EONTOP(M+1)
    +
    51  REAL U((M+1)*((I+1)*M+2)),V((M+1)*((I+1)*M+2))
    +
    52  REAL UTOP(2*(M+1)),VTOP(2*(M+1))
    +
    53  REAL D((M+1)*((I+1)*M+2)),Z((M+1)*((I+1)*M+2))
    +
    54 
    +
    55 C COMPUTE TERMS FROM THE SPECTRAL DOMAIN
    +
    56  k=1
    +
    57  d(2*k-1)=0.
    +
    58  d(2*k)=0.
    +
    59  z(2*k-1)=0.
    +
    60  z(2*k)=0.
    +
    61  DO k=2,(m+1)*((i+1)*m+2)/2-1
    +
    62  d(2*k-1)=-elonn1(k)*u(2*k)+eon(k+1)*v(2*k+1)-eon(k)*v(2*k-3)
    +
    63  d(2*k)=elonn1(k)*u(2*k-1)+eon(k+1)*v(2*k+2)-eon(k)*v(2*k-2)
    +
    64  z(2*k-1)=-elonn1(k)*v(2*k)-eon(k+1)*u(2*k+1)+eon(k)*u(2*k-3)
    +
    65  z(2*k)=elonn1(k)*v(2*k-1)-eon(k+1)*u(2*k+2)+eon(k)*u(2*k-2)
    +
    66  ENDDO
    +
    67  k=(m+1)*((i+1)*m+2)/2
    +
    68  d(2*k-1)=-elonn1(k)*u(2*k)-eon(k)*v(2*k-3)
    +
    69  d(2*k)=elonn1(k)*u(2*k-1)-eon(k)*v(2*k-2)
    +
    70  z(2*k-1)=-elonn1(k)*v(2*k)+eon(k)*u(2*k-3)
    +
    71  z(2*k)=elonn1(k)*v(2*k-1)+eon(k)*u(2*k-2)
    +
    72 
    +
    73 C COMPUTE TERMS FROM OVER TOP OF THE SPECTRAL DOMAIN
    +
    74 CDIR$ IVDEP
    +
    75  DO l=0,m
    +
    76  k=l*(2*m+(i-1)*(l-1))/2+i*l+m+1
    +
    77  d(2*k-1)=d(2*k-1)+eontop(l+1)*vtop(2*l+1)
    +
    78  d(2*k)=d(2*k)+eontop(l+1)*vtop(2*l+2)
    +
    79  z(2*k-1)=z(2*k-1)-eontop(l+1)*utop(2*l+1)
    +
    80  z(2*k)=z(2*k)-eontop(l+1)*utop(2*l+2)
    +
    81  ENDDO
    +
    82 
    +
    83 C MULTIPLY BY LAPLACIAN TERM
    +
    84  DO k=2,(m+1)*((i+1)*m+2)/2
    +
    85  d(2*k-1)=d(2*k-1)*enn1(k)
    +
    86  d(2*k)=d(2*k)*enn1(k)
    +
    87  z(2*k-1)=z(2*k-1)*enn1(k)
    +
    88  z(2*k)=z(2*k)*enn1(k)
    +
    89  ENDDO
    +
    90  RETURN
    +
    91  END
    +
    subroutine spuv2dz(I, M, ENN1, ELONN1, EON, EONTOP, U, V, UTOP, VTOP, D, Z)
    Computes the divergence and vorticity from wind components in spectral space.
    Definition: spuv2dz.f:49
    +
    +
    + + + + diff --git a/ver-5.1.0/spvar_8f.html b/ver-5.1.0/spvar_8f.html new file mode 100644 index 00000000..73948c37 --- /dev/null +++ b/ver-5.1.0/spvar_8f.html @@ -0,0 +1,175 @@ + + + + + + + +NCEPLIBS-ip: spvar.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    spvar.f File Reference
    +
    +
    + +

    Compute variance by total wavenumber. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine spvar (I, M, Q, QVAR)
     Computes the variances by total wavenumber of a scalar field in spectral space. More...
     
    +

    Detailed Description

    +

    Compute variance by total wavenumber.

    +
    Author
    Iredell
    +
    Date
    92-10-31
    + +

    Definition in file spvar.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ spvar()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spvar ( I,
     M,
    real, dimension((m+1)*((i+1)*m+2)) Q,
    real, dimension(0:(i+1)*m) QVAR 
    )
    +
    + +

    Computes the variances by total wavenumber of a scalar field in spectral space.

    +
    Parameters
    + + + + + +
    Ispectral domain shape (0 for triangular, 1 for rhomboidal)
    Mspectral truncation
    Q((M+1)*((I+1)*M+2)) scalar field
    QVAR(0:(I+1)*M) variances
    +
    +
    +
    Author
    Iredell
    +
    Date
    92-10-31
    + +

    Definition at line 15 of file spvar.f.

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/spvar_8f.js b/ver-5.1.0/spvar_8f.js new file mode 100644 index 00000000..4cfca763 --- /dev/null +++ b/ver-5.1.0/spvar_8f.js @@ -0,0 +1,4 @@ +var spvar_8f = +[ + [ "spvar", "spvar_8f.html#a840f95e09b8d930b38638a391933bee4", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/spvar_8f_source.html b/ver-5.1.0/spvar_8f_source.html new file mode 100644 index 00000000..9f559d95 --- /dev/null +++ b/ver-5.1.0/spvar_8f_source.html @@ -0,0 +1,135 @@ + + + + + + + +NCEPLIBS-ip: spvar.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    spvar.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Compute variance by total wavenumber.
    +
    3 C> @author Iredell @date 92-10-31
    +
    4 
    +
    5 C> Computes the variances by total wavenumber
    +
    6 C> of a scalar field in spectral space.
    +
    7 C>
    +
    8 C> @param I spectral domain shape
    +
    9 C> (0 for triangular, 1 for rhomboidal)
    +
    10 C> @param M spectral truncation
    +
    11 C> @param Q ((M+1)*((I+1)*M+2)) scalar field
    +
    12 C> @param QVAR (0:(I+1)*M) variances
    +
    13 C>
    +
    14 C> @author Iredell @date 92-10-31
    +
    15  SUBROUTINE spvar(I,M,Q,QVAR)
    +
    16  REAL Q((M+1)*((I+1)*M+2))
    +
    17  REAL QVAR(0:(I+1)*M)
    +
    18 
    +
    19  l=0
    +
    20  DO n=0,m
    +
    21  ks=l*(2*m+(i-1)*(l-1))+2*n
    +
    22  qvar(n)=0.5*q(ks+1)**2
    +
    23  ENDDO
    +
    24  DO n=m+1,(i+1)*m
    +
    25  qvar(n)=0.
    +
    26  ENDDO
    +
    27  DO n=0,(i+1)*m
    +
    28  DO l=max(1,n-m),min(n,m)
    +
    29  ks=l*(2*m+(i-1)*(l-1))+2*n
    +
    30  qvar(n)=qvar(n)+q(ks+1)**2+q(ks+2)**2
    +
    31  ENDDO
    +
    32  ENDDO
    +
    33 
    +
    34  RETURN
    +
    35  END
    +
    subroutine spvar(I, M, Q, QVAR)
    Computes the variances by total wavenumber of a scalar field in spectral space.
    Definition: spvar.f:16
    +
    +
    + + + + diff --git a/ver-5.1.0/spwget_8f.html b/ver-5.1.0/spwget_8f.html new file mode 100644 index 00000000..8d9f2dd3 --- /dev/null +++ b/ver-5.1.0/spwget_8f.html @@ -0,0 +1,208 @@ + + + + + + + +NCEPLIBS-ip: spwget.f File Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    spwget.f File Reference
    +
    +
    + +

    Get wave-space constants. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Functions/Subroutines

    subroutine spwget (IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
     This subprogram gets wave-space constants. More...
     
    +

    Detailed Description

    +

    Get wave-space constants.

    +
    Author
    Iredell
    +
    Date
    96-02-29
    + +

    Definition in file spwget.f.

    +

    Function/Subroutine Documentation

    + +

    ◆ spwget()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    subroutine spwget ( IROMB,
     MAXWV,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2) EPS,
    real, dimension(maxwv+1) EPSTOP,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2) ENN1,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2) ELONN1,
    real, dimension((maxwv+1)*((iromb+1)*maxwv+2)/2) EON,
    real, dimension(maxwv+1) EONTOP 
    )
    +
    + +

    This subprogram gets wave-space constants.

    +
    Parameters
    + + + + + + + + + +
    IROMBspectral domain shape (0 for triangular, 1 for rhomboidal)
    MAXWVspectral truncation
    EPS
    EPSTOP
    ENN1
    ELONN1
    EON
    EONTOP
    +
    +
    +
    Author
    Iredell
    +
    Date
    96-02-29
    +
    + +

    Definition at line 17 of file spwget.f.

    + +

    References speps().

    + +

    Referenced by sptgpm(), sptgpmd(), sptgpmv(), sptgps(), sptgpsd(), sptgpsv(), sptgpt(), sptgptd(), sptgptsd(), sptgptv(), sptgptvd(), sptrand(), sptranf0(), sptrungv(), sptrunl(), sptrunmv(), sptrunsv(), and sptrunv().

    + +
    +
    +
    +
    + + + + diff --git a/ver-5.1.0/spwget_8f.js b/ver-5.1.0/spwget_8f.js new file mode 100644 index 00000000..3fba636e --- /dev/null +++ b/ver-5.1.0/spwget_8f.js @@ -0,0 +1,4 @@ +var spwget_8f = +[ + [ "spwget", "spwget_8f.html#a9b6ce78350f7adf2fed874a18312c7a6", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/spwget_8f_source.html b/ver-5.1.0/spwget_8f_source.html new file mode 100644 index 00000000..2ed57cce --- /dev/null +++ b/ver-5.1.0/spwget_8f_source.html @@ -0,0 +1,127 @@ + + + + + + + +NCEPLIBS-ip: spwget.f Source File + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    spwget.f
    +
    +
    +Go to the documentation of this file.
    1 C> @file
    +
    2 C> @brief Get wave-space constants.
    +
    3 C> @author Iredell @date 96-02-29
    +
    4 
    +
    5 C> This subprogram gets wave-space constants.
    +
    6 C>
    +
    7 C> @param IROMB spectral domain shape (0 for triangular, 1 for rhomboidal)
    +
    8 C> @param MAXWV spectral truncation
    +
    9 C> @param EPS
    +
    10 C> @param EPSTOP
    +
    11 C> @param ENN1
    +
    12 C> @param ELONN1
    +
    13 C> @param EON
    +
    14 C> @param EONTOP
    +
    15 C>
    +
    16 C> @author Iredell @date 96-02-29
    +
    17  SUBROUTINE spwget(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP)
    +
    18  REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1)
    +
    19  REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    20  REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2)
    +
    21  REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1)
    +
    22 
    +
    23  mx=(maxwv+1)*((iromb+1)*maxwv+2)/2
    +
    24  mxtop=maxwv+1
    +
    25  CALL speps(iromb,maxwv,eps,epstop,enn1,elonn1,eon,eontop)
    +
    26  END
    +
    subroutine speps(I, M, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    Computes constant fields indexed in the spectral domain in "IBM ORDER" (Zonal wavenumber is the slowe...
    Definition: speps.f:26
    +
    subroutine spwget(IROMB, MAXWV, EPS, EPSTOP, ENN1, ELONN1, EON, EONTOP)
    This subprogram gets wave-space constants.
    Definition: spwget.f:18
    +
    +
    + + + + diff --git a/ver-5.1.0/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html b/ver-5.1.0/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html new file mode 100644 index 00000000..62d9b4da --- /dev/null +++ b/ver-5.1.0/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html @@ -0,0 +1,843 @@ + + + + + + + +NCEPLIBS-ip: ip_equid_cylind_grid_mod::ip_equid_cylind_grid Type Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_equid_cylind_grid_mod::ip_equid_cylind_grid Type Reference
    +
    +
    +
    +Inheritance diagram for ip_equid_cylind_grid_mod::ip_equid_cylind_grid:
    +
    +
    + + +ip_grid_mod::ip_grid + +
    + + + + + + + + + + + + + + + + + +

    +Private Member Functions

    procedure field_pos
     Field position for a given grid point. More...
     
    procedure gdswzd => gdswzd_equid_cylind
     See gdswzd_equid_cylind(). More...
     
    generic init => init_grib1, init_grib2
     Init subprogram. More...
     
    procedure init_grib1
     Init GRIB1. More...
     
    procedure init_grib2
     Init GRIB2. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Private Attributes

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor. More...
     
    real dlat
     Di — i direction increment. More...
     
    real dlon
     Dj — j direction increment. More...
     
    real eccen_squared
     Eccentricity of the Earth squared (e^2). More...
     
    real hi
     Scan mode in the 'i' direction. More...
     
    integer im
     Number of x points. More...
     
    integer iwrap
     x wraparound increment (0 if no wraparound). More...
     
    integer jm
     Number of y points. More...
     
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound). More...
     
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound). More...
     
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind). More...
     
    integer nm
     Total number of points. More...
     
    integer nscan
     
    integer nscan_field_pos
     nscan for field_pos routine. More...
     
    real rerth
     Radius of the Earth. More...
     
    real rlat1
     Latitude of first grid point. More...
     
    real rlat2
     Latitude of last grid point. More...
     
    real rlon1
     Longitude of first grid point. More...
     
    real rlon2
     Longitude of last grid point. More...
     
    +

    Detailed Description

    +
    +

    Definition at line 26 of file ip_equid_cylind_grid_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ field_pos()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_grid_mod::ip_grid::field_pos
    +
    +privateinherited
    +
    + +

    Field position for a given grid point.

    +
    Returns
    Integer position in grib field to locate grid point.
    + +

    Definition at line 88 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ gdswzd()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_equid_cylind_grid_mod::ip_equid_cylind_grid::gdswzd
    +
    +private
    +
    + +

    See gdswzd_equid_cylind().

    +
    Returns
    N/A
    + +

    Definition at line 37 of file ip_equid_cylind_grid_mod.F90.

    + +
    +
    + +

    ◆ init()

    + +
    +
    + + + + + +
    + + + + +
    generic ip_grid_mod::ip_grid::init
    +
    +privateinherited
    +
    + +

    Init subprogram.

    +
    Returns
    N/A
    + +

    Definition at line 90 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib1()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_equid_cylind_grid_mod::ip_equid_cylind_grid::init_grib1
    +
    +private
    +
    + +

    Init GRIB1.

    +
    Returns
    N/A
    + +

    Definition at line 35 of file ip_equid_cylind_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib2()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_equid_cylind_grid_mod::ip_equid_cylind_grid::init_grib2
    +
    +private
    +
    + +

    Init GRIB2.

    +
    Returns
    N/A
    + +

    Definition at line 36 of file ip_equid_cylind_grid_mod.F90.

    + +
    +
    +

    Field Documentation

    + +

    ◆ descriptor

    + +
    +
    + + + + + +
    + + + + +
    class(ip_grid_descriptor), allocatable ip_grid_mod::ip_grid::descriptor
    +
    +privateinherited
    +
    + +

    Descriptor.

    + +

    Definition at line 59 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ dlat

    + +
    +
    + + + + + +
    + + + + +
    real ip_equid_cylind_grid_mod::ip_equid_cylind_grid::dlat
    +
    +private
    +
    + +

    Di — i direction increment.

    +

    GRIB2, Section 3, octets 64-67.

    + +

    Definition at line 32 of file ip_equid_cylind_grid_mod.F90.

    + +
    +
    + +

    ◆ dlon

    + +
    +
    + + + + + +
    + + + + +
    real ip_equid_cylind_grid_mod::ip_equid_cylind_grid::dlon
    +
    +private
    +
    + +

    Dj — j direction increment.

    +

    GRIB2, Section 3, octets 68-71.

    + +

    Definition at line 33 of file ip_equid_cylind_grid_mod.F90.

    + +
    +
    + +

    ◆ eccen_squared

    + +
    +
    + + + + + +
    + + + + +
    real ip_grid_mod::ip_grid::eccen_squared
    +
    +privateinherited
    +
    + +

    Eccentricity of the Earth squared (e^2).

    + +

    Definition at line 78 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ hi

    + +
    +
    + + + + + +
    + + + + +
    real ip_equid_cylind_grid_mod::ip_equid_cylind_grid::hi
    +
    +private
    +
    + +

    Scan mode in the 'i' direction.

    +

    GRIB2, Section 3, octet 72.

    + +

    Definition at line 27 of file ip_equid_cylind_grid_mod.F90.

    + +
    +
    + +

    ◆ im

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::im
    +
    +privateinherited
    +
    + +

    Number of x points.

    + +

    Definition at line 61 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ iwrap

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::iwrap
    +
    +privateinherited
    +
    + +

    x wraparound increment (0 if no wraparound).

    + +

    Definition at line 74 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jm

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jm
    +
    +privateinherited
    +
    + +

    Number of y points.

    + +

    Definition at line 62 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jwrap1

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jwrap1
    +
    +privateinherited
    +
    + +

    y wraparound lower pivot point (0 if no wraparound).

    + +

    Definition at line 75 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jwrap2

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jwrap2
    +
    +privateinherited
    +
    + +

    y wraparound upper pivot point (0 if no wraparound).

    + +

    Definition at line 76 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ kscan

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::kscan
    +
    +privateinherited
    +
    + +

    Mass/wind flag for staggered diagonal (0 if mass; 1 if wind).

    + +

    Definition at line 70 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nm

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nm
    +
    +privateinherited
    +
    + +

    Total number of points.

    + +

    Definition at line 63 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nscan

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nscan
    +
    +privateinherited
    +
    +
    Parameters
    + + +
    Scanningmode.
      +
    • 0 if x first then y;
    • +
    • 1 if y first then x;
    • +
    • 3 if staggered diagonal like projection 203.
    • +
    +
    +
    +
    + +

    Definition at line 69 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nscan_field_pos

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nscan_field_pos
    +
    +privateinherited
    +
    + +

    nscan for field_pos routine.

    +

    Can be different than nscan due to differences in grib/grib2.

    + +

    Definition at line 72 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ rerth

    + +
    +
    + + + + + +
    + + + + +
    real ip_grid_mod::ip_grid::rerth
    +
    +privateinherited
    +
    + +

    Radius of the Earth.

    + +

    Definition at line 77 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ rlat1

    + +
    +
    + + + + + +
    + + + + +
    real ip_equid_cylind_grid_mod::ip_equid_cylind_grid::rlat1
    +
    +private
    +
    + +

    Latitude of first grid point.

    +

    GRIB2, Section 3, octets 47-50.

    + +

    Definition at line 28 of file ip_equid_cylind_grid_mod.F90.

    + +
    +
    + +

    ◆ rlat2

    + +
    +
    + + + + + +
    + + + + +
    real ip_equid_cylind_grid_mod::ip_equid_cylind_grid::rlat2
    +
    +private
    +
    + +

    Latitude of last grid point.

    +

    GRIB2, Section 3, octets 56-59.

    + +

    Definition at line 30 of file ip_equid_cylind_grid_mod.F90.

    + +
    +
    + +

    ◆ rlon1

    + +
    +
    + + + + + +
    + + + + +
    real ip_equid_cylind_grid_mod::ip_equid_cylind_grid::rlon1
    +
    +private
    +
    + +

    Longitude of first grid point.

    +

    GRIB2, Section 3, octets 51-54.

    + +

    Definition at line 29 of file ip_equid_cylind_grid_mod.F90.

    + +
    +
    + +

    ◆ rlon2

    + +
    +
    + + + + + +
    + + + + +
    real ip_equid_cylind_grid_mod::ip_equid_cylind_grid::rlon2
    +
    +private
    +
    + +

    Longitude of last grid point.

    +

    GRIB2, Section 3, octets 60-63.

    + +

    Definition at line 31 of file ip_equid_cylind_grid_mod.F90.

    + +
    +
    +
    The documentation for this type was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.js b/ver-5.1.0/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.js new file mode 100644 index 00000000..39a1c72a --- /dev/null +++ b/ver-5.1.0/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.js @@ -0,0 +1,27 @@ +var structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid = +[ + [ "field_pos", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#ac071b3d3eca9a5fa88ff5dc211d19179", null ], + [ "gdswzd", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#aa1023c3efed20a990b75f937bbcac6a3", null ], + [ "init", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a1f3fa40acb8c2ae4a65c00db21872d7c", null ], + [ "init_grib1", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a68fb7543888cc76885560709184e7d70", null ], + [ "init_grib2", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a8dd212953e754964770fa1c3d4bcd3db", null ], + [ "descriptor", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a4a2a0dab09f05931d12615b0ac74bc51", null ], + [ "dlat", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a6bd00527219fc596b2c2a7ba47fec719", null ], + [ "dlon", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#ae675dc8c49e64700d941eadc31e8f4e7", null ], + [ "eccen_squared", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a180a5da6c470fac34b8439d4c0a32d2a", null ], + [ "hi", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#afb1ebcfab0d637688bcac84cbc8582fc", null ], + [ "im", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a546a9c3bb8e93ec8e8f7eaf2a14537dc", null ], + [ "iwrap", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#ae179622b9a4c764a5ca90385330941ed", null ], + [ "jm", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a41a2a38288864520d8c50854d1843f87", null ], + [ "jwrap1", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a92976f110dd7e823799991137ac970a1", null ], + [ "jwrap2", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#ae70be8cebcd217a49be4da1cebfc19d2", null ], + [ "kscan", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a084603b1c052e76c3335fea2e887cfce", null ], + [ "nm", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a2ae87fb4e6bdcb75fc6fdc80ad73ee30", null ], + [ "nscan", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a1a15aa48354dbbd0b8debafbfc6e7b18", null ], + [ "nscan_field_pos", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a0640093c52461763f904cc2f12c96b6c", null ], + [ "rerth", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a2bb4d4ec2455c3148313bf7cc54e1cc8", null ], + [ "rlat1", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a493e017343795e89f794bae5229eb6a7", null ], + [ "rlat2", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#acfd62fa8199f9b57b555364bca920e42", null ], + [ "rlon1", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#aa927f5ecca3f2880ad88e60c8d4b8871", null ], + [ "rlon2", "structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.html#a1e5b9f8ab3de743b5e392478694154ea", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.png b/ver-5.1.0/structip__equid__cylind__grid__mod_1_1ip__equid__cylind__grid.png new file mode 100644 index 0000000000000000000000000000000000000000..544294150259a63c73c46f6a26eb3d2c67b4334f GIT binary patch literal 804 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y!~12~w0^W`4L>2EV9+RG` zn7U4?I&<*uobWIIr%zfEU+{2^WQek-{YU+kGpls9PWLTuzWwm+?|uL8*=~CO^ZVt` z>t>qfPnoo&*&^`l$7WLRl3f;axiF8i9q_fSy#X6++>-5TkThzrl(a0 z%%;chXFbck6#ltuU%1yKzDJ+6ulVeCvfZl_zT&7^3`j)9v~1G6Dun~q7D zp4}525?f~QJa^Kq4c>p=U1fXkySab;JNJvu#u_ + + + + + + +NCEPLIBS-ip: ip_gaussian_grid_mod::ip_gaussian_grid Type Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_gaussian_grid_mod::ip_gaussian_grid Type Reference
    +
    +
    +
    +Inheritance diagram for ip_gaussian_grid_mod::ip_gaussian_grid:
    +
    +
    + + +ip_grid_mod::ip_grid + +
    + + + + + + + + + + + + + + + + + +

    +Private Member Functions

    procedure field_pos
     Field position for a given grid point. More...
     
    procedure gdswzd => gdswzd_gaussian
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids. More...
     
    generic init => init_grib1, init_grib2
     Init subprogram. More...
     
    procedure init_grib1
     Initializes a gaussian grid given a grib1_descriptor object. More...
     
    procedure init_grib2
     Initializes a gaussian grid given a grib2_descriptor object. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Private Attributes

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor. More...
     
    real dlon
     "i"-direction increment. More...
     
    real eccen_squared
     Eccentricity of the Earth squared (e^2). More...
     
    real hi
     Scan mode flag in 'i' direction. More...
     
    integer im
     Number of x points. More...
     
    integer iwrap
     x wraparound increment (0 if no wraparound). More...
     
    integer jg
     Number of parallels between the equator and pole times 2. More...
     
    integer jh
     Scan mode flag in 'j' direction. More...
     
    integer jm
     Number of y points. More...
     
    integer jscan
     Scanning mode in the 'j' direction. More...
     
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound). More...
     
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound). More...
     
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind). More...
     
    integer nm
     Total number of points. More...
     
    integer nscan
     
    integer nscan_field_pos
     nscan for field_pos routine. More...
     
    real rerth
     Radius of the Earth. More...
     
    real rlat1
     Latitude of first grid point. More...
     
    real rlon1
     Longitude of first grid point. More...
     
    real rlon2
     Longitude of last grid point. More...
     
    +

    Detailed Description

    +
    +

    Definition at line 25 of file ip_gaussian_grid_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ field_pos()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_grid_mod::ip_grid::field_pos
    +
    +privateinherited
    +
    + +

    Field position for a given grid point.

    +
    Returns
    Integer position in grib field to locate grid point.
    + +

    Definition at line 88 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ gdswzd()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_gaussian_grid_mod::ip_gaussian_grid::gdswzd
    +
    +private
    +
    + +

    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids.

    +
    Returns
    N/A
    + +

    Definition at line 41 of file ip_gaussian_grid_mod.F90.

    + +
    +
    + +

    ◆ init()

    + +
    +
    + + + + + +
    + + + + +
    generic ip_grid_mod::ip_grid::init
    +
    +privateinherited
    +
    + +

    Init subprogram.

    +
    Returns
    N/A
    + +

    Definition at line 90 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib1()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_gaussian_grid_mod::ip_gaussian_grid::init_grib1
    +
    +private
    +
    + +

    Initializes a gaussian grid given a grib1_descriptor object.

    +
    Returns
    N/A
    + +

    Definition at line 36 of file ip_gaussian_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib2()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_gaussian_grid_mod::ip_gaussian_grid::init_grib2
    +
    +private
    +
    + +

    Initializes a gaussian grid given a grib2_descriptor object.

    +
    Returns
    N/A
    + +

    Definition at line 38 of file ip_gaussian_grid_mod.F90.

    + +
    +
    +

    Field Documentation

    + +

    ◆ descriptor

    + +
    +
    + + + + + +
    + + + + +
    class(ip_grid_descriptor), allocatable ip_grid_mod::ip_grid::descriptor
    +
    +privateinherited
    +
    + +

    Descriptor.

    + +

    Definition at line 59 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ dlon

    + +
    +
    + + + + + +
    + + + + +
    real ip_gaussian_grid_mod::ip_gaussian_grid::dlon
    +
    +private
    +
    + +

    "i"-direction increment.

    +

    GRIB2 Section 3, octets 64-67.

    + +

    Definition at line 27 of file ip_gaussian_grid_mod.F90.

    + +
    +
    + +

    ◆ eccen_squared

    + +
    +
    + + + + + +
    + + + + +
    real ip_grid_mod::ip_grid::eccen_squared
    +
    +privateinherited
    +
    + +

    Eccentricity of the Earth squared (e^2).

    + +

    Definition at line 78 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ hi

    + +
    +
    + + + + + +
    + + + + +
    real ip_gaussian_grid_mod::ip_gaussian_grid::hi
    +
    +private
    +
    + +

    Scan mode flag in 'i' direction.

    +

    When '1' points scan from W to E. When "-1" points scan from E to W.

    + +

    Definition at line 31 of file ip_gaussian_grid_mod.F90.

    + +
    +
    + +

    ◆ im

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::im
    +
    +privateinherited
    +
    + +

    Number of x points.

    + +

    Definition at line 61 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ iwrap

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::iwrap
    +
    +privateinherited
    +
    + +

    x wraparound increment (0 if no wraparound).

    + +

    Definition at line 74 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jg

    + +
    +
    + + + + + +
    + + + + +
    integer ip_gaussian_grid_mod::ip_gaussian_grid::jg
    +
    +private
    +
    + +

    Number of parallels between the equator and pole times 2.

    +

    GRIB2 Section 3, octets 68-71.

    + +

    Definition at line 32 of file ip_gaussian_grid_mod.F90.

    + +
    +
    + +

    ◆ jh

    + +
    +
    + + + + + +
    + + + + +
    integer ip_gaussian_grid_mod::ip_gaussian_grid::jh
    +
    +private
    +
    + +

    Scan mode flag in 'j' direction.

    +

    When '1' points scan from N to S. When "-1" points scan from S to N.

    + +

    Definition at line 26 of file ip_gaussian_grid_mod.F90.

    + +
    +
    + +

    ◆ jm

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jm
    +
    +privateinherited
    +
    + +

    Number of y points.

    + +

    Definition at line 62 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jscan

    + +
    +
    + + + + + +
    + + + + +
    integer ip_gaussian_grid_mod::ip_gaussian_grid::jscan
    +
    +private
    +
    + +

    Scanning mode in the 'j' direction.

    +

    GRIB2 Section 3, octet 72.

    + +

    Definition at line 33 of file ip_gaussian_grid_mod.F90.

    + +
    +
    + +

    ◆ jwrap1

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jwrap1
    +
    +privateinherited
    +
    + +

    y wraparound lower pivot point (0 if no wraparound).

    + +

    Definition at line 75 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jwrap2

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jwrap2
    +
    +privateinherited
    +
    + +

    y wraparound upper pivot point (0 if no wraparound).

    + +

    Definition at line 76 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ kscan

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::kscan
    +
    +privateinherited
    +
    + +

    Mass/wind flag for staggered diagonal (0 if mass; 1 if wind).

    + +

    Definition at line 70 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nm

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nm
    +
    +privateinherited
    +
    + +

    Total number of points.

    + +

    Definition at line 63 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nscan

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nscan
    +
    +privateinherited
    +
    +
    Parameters
    + + +
    Scanningmode.
      +
    • 0 if x first then y;
    • +
    • 1 if y first then x;
    • +
    • 3 if staggered diagonal like projection 203.
    • +
    +
    +
    +
    + +

    Definition at line 69 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nscan_field_pos

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nscan_field_pos
    +
    +privateinherited
    +
    + +

    nscan for field_pos routine.

    +

    Can be different than nscan due to differences in grib/grib2.

    + +

    Definition at line 72 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ rerth

    + +
    +
    + + + + + +
    + + + + +
    real ip_grid_mod::ip_grid::rerth
    +
    +privateinherited
    +
    + +

    Radius of the Earth.

    + +

    Definition at line 77 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ rlat1

    + +
    +
    + + + + + +
    + + + + +
    real ip_gaussian_grid_mod::ip_gaussian_grid::rlat1
    +
    +private
    +
    + +

    Latitude of first grid point.

    +

    GRIB2 Section 3, octets 47-50.

    + +

    Definition at line 28 of file ip_gaussian_grid_mod.F90.

    + +
    +
    + +

    ◆ rlon1

    + +
    +
    + + + + + +
    + + + + +
    real ip_gaussian_grid_mod::ip_gaussian_grid::rlon1
    +
    +private
    +
    + +

    Longitude of first grid point.

    +

    GRIB2 Section 3, octets 51-54.

    + +

    Definition at line 29 of file ip_gaussian_grid_mod.F90.

    + +
    +
    + +

    ◆ rlon2

    + +
    +
    + + + + + +
    + + + + +
    real ip_gaussian_grid_mod::ip_gaussian_grid::rlon2
    +
    +private
    +
    + +

    Longitude of last grid point.

    +

    GRIB2 Section 3, octets 60-63.

    + +

    Definition at line 30 of file ip_gaussian_grid_mod.F90.

    + +
    +
    +
    The documentation for this type was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/structip__gaussian__grid__mod_1_1ip__gaussian__grid.js b/ver-5.1.0/structip__gaussian__grid__mod_1_1ip__gaussian__grid.js new file mode 100644 index 00000000..ea089373 --- /dev/null +++ b/ver-5.1.0/structip__gaussian__grid__mod_1_1ip__gaussian__grid.js @@ -0,0 +1,28 @@ +var structip__gaussian__grid__mod_1_1ip__gaussian__grid = +[ + [ "field_pos", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#ac071b3d3eca9a5fa88ff5dc211d19179", null ], + [ "gdswzd", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a7ce52d987d2bd2442053042c03f96885", null ], + [ "init", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a1f3fa40acb8c2ae4a65c00db21872d7c", null ], + [ "init_grib1", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#afd3658924783d5dbbd3fe5f07d5b60a7", null ], + [ "init_grib2", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a378b72a1b6090acb90a36385ab9eda5a", null ], + [ "descriptor", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a4a2a0dab09f05931d12615b0ac74bc51", null ], + [ "dlon", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a35c454d320c59a6c71c4aebb881abcb8", null ], + [ "eccen_squared", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a180a5da6c470fac34b8439d4c0a32d2a", null ], + [ "hi", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#ae71229713fc9322e23140541993459fc", null ], + [ "im", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a546a9c3bb8e93ec8e8f7eaf2a14537dc", null ], + [ "iwrap", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#ae179622b9a4c764a5ca90385330941ed", null ], + [ "jg", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a110f99e158a977a1679133235fa06c34", null ], + [ "jh", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a549ccd3ce1f5c75d99e8e04d4d4341b4", null ], + [ "jm", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a41a2a38288864520d8c50854d1843f87", null ], + [ "jscan", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a3e199827f764b162a14515e837c28903", null ], + [ "jwrap1", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a92976f110dd7e823799991137ac970a1", null ], + [ "jwrap2", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#ae70be8cebcd217a49be4da1cebfc19d2", null ], + [ "kscan", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a084603b1c052e76c3335fea2e887cfce", null ], + [ "nm", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a2ae87fb4e6bdcb75fc6fdc80ad73ee30", null ], + [ "nscan", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a1a15aa48354dbbd0b8debafbfc6e7b18", null ], + [ "nscan_field_pos", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a0640093c52461763f904cc2f12c96b6c", null ], + [ "rerth", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a2bb4d4ec2455c3148313bf7cc54e1cc8", null ], + [ "rlat1", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#acdf76c4b3444d0d85dbf9ee09b5f35fc", null ], + [ "rlon1", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a583517b74d3c1c1b354fefe0d6871c4d", null ], + [ "rlon2", "structip__gaussian__grid__mod_1_1ip__gaussian__grid.html#a3794a22c4866631c6b5bc6a8871e3e44", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/structip__gaussian__grid__mod_1_1ip__gaussian__grid.png b/ver-5.1.0/structip__gaussian__grid__mod_1_1ip__gaussian__grid.png new file mode 100644 index 0000000000000000000000000000000000000000..8937e993e9c6d1a26d0b379607f66f02c8b38ff8 GIT binary patch literal 684 zcmeAS@N?(olHy`uVBq!ia0vp^AAmT3gBeH)Oy}?eQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;Sp(yxQ9swa)~bUdg1+*>eViSo1unX`3&{SKK_ za?V(}CNN@>-N)~Tl35)U*Cy|onYaA&YpeLA*WtgfKYlu?x4>1)bJg%M!B#_`mj`yp4G@D)ry1WkZ46+59A6laMr|wbe<}VQy-Pe{*T2hr4yHxyB zXw_EV@Rv_^%<-D^DsvP6bk~~Lu)`sfLM{bV$ZUG~{;yBBqo>tlCoRuk^Q_%|bj?uN zyEswHQ!7(R$MZio$km03o}12S*zg>_AjnXEh~L5gi`t*hmuD8{A6lFrf9x*jZ!O*g zX>qm1L@$66V69v@-=>R~v&!=NEGM&f{x9#4WKs%5&CVI$2oEyF01j%a5w|oEsYpd6$0J!lv{8;;!j)%X%CejNh$! zc$p)9CI5m4ulxM3OyFXkaU2>TGtGVpIK61Ee + + + + + + +NCEPLIBS-ip: ip_grid_descriptor_mod::grib1_descriptor Type Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_grid_descriptor_mod::grib1_descriptor Type Reference
    +
    +
    + +

    Descriptor representing a grib1 grib descriptor section (GDS) with an integer array. + More...

    +
    +Inheritance diagram for ip_grid_descriptor_mod::grib1_descriptor:
    +
    +
    + + +ip_grid_descriptor_mod::ip_grid_descriptor + +
    + + + + + + + + +

    +Private Member Functions

    procedure is_same_grid
     Test whether two grid descriptors are the same. More...
     
    procedure is_same_grid_grib1
     Test whether two grid descriptors are the same. More...
     
    + + + + + + + +

    +Private Attributes

    integer, dimension(200) gds
     Grib-1 grib descriptor section (GDS) More...
     
    integer grid_num
     Integer representing the grid type (see *_GRID_ID_GRIB1/2 in ip_grid_mod). More...
     
    +

    Detailed Description

    +

    Descriptor representing a grib1 grib descriptor section (GDS) with an integer array.

    +
    Date
    July 2021
    + +

    Definition at line 38 of file ip_grid_descriptor_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ is_same_grid()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_grid_descriptor_mod::ip_grid_descriptor::is_same_grid
    +
    +privateinherited
    +
    + +

    Test whether two grid descriptors are the same.

    +
    Returns
    N/A
    + +

    Definition at line 32 of file ip_grid_descriptor_mod.F90.

    + +
    +
    + +

    ◆ is_same_grid_grib1()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_grid_descriptor_mod::grib1_descriptor::is_same_grid_grib1
    +
    +private
    +
    + +

    Test whether two grid descriptors are the same.

    +
    Returns
    N/A
    + +

    Definition at line 42 of file ip_grid_descriptor_mod.F90.

    + +
    +
    +

    Field Documentation

    + +

    ◆ gds

    + +
    +
    + + + + + +
    + + + + +
    integer, dimension(200) ip_grid_descriptor_mod::grib1_descriptor::gds
    +
    +private
    +
    + +

    Grib-1 grib descriptor section (GDS)

    + +

    Definition at line 39 of file ip_grid_descriptor_mod.F90.

    + +
    +
    + +

    ◆ grid_num

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_descriptor_mod::ip_grid_descriptor::grid_num
    +
    +privateinherited
    +
    + +

    Integer representing the grid type (see *_GRID_ID_GRIB1/2 in ip_grid_mod).

    + +

    Definition at line 29 of file ip_grid_descriptor_mod.F90.

    + +
    +
    +
    The documentation for this type was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/structip__grid__descriptor__mod_1_1grib1__descriptor.js b/ver-5.1.0/structip__grid__descriptor__mod_1_1grib1__descriptor.js new file mode 100644 index 00000000..af5c5429 --- /dev/null +++ b/ver-5.1.0/structip__grid__descriptor__mod_1_1grib1__descriptor.js @@ -0,0 +1,7 @@ +var structip__grid__descriptor__mod_1_1grib1__descriptor = +[ + [ "is_same_grid", "structip__grid__descriptor__mod_1_1grib1__descriptor.html#a9da102dac348a63ffce6556ed5da81b6", null ], + [ "is_same_grid_grib1", "structip__grid__descriptor__mod_1_1grib1__descriptor.html#a33b4fc04d218c73e3c4d061163dcbc95", null ], + [ "gds", "structip__grid__descriptor__mod_1_1grib1__descriptor.html#a08920c194e39d562fbf527939f0ac6c9", null ], + [ "grid_num", "structip__grid__descriptor__mod_1_1grib1__descriptor.html#a6d4598dc4bbf46e059f636715cc390f1", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/structip__grid__descriptor__mod_1_1grib1__descriptor.png b/ver-5.1.0/structip__grid__descriptor__mod_1_1grib1__descriptor.png new file mode 100644 index 0000000000000000000000000000000000000000..1ca1b0c06cf6317c529c584ff50560f2d77e02f2 GIT binary patch literal 774 zcmeAS@N?(olHy`uVBq!ia0vp^|A07vgBeKj#aa9XQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;wUAA4^TV|9S)4nw!%slQn$A z_@^HX`>&_vSGO!h{Zr1rHG9lIXEzr+Tu#uKuAA}WzU$HO`uZTAS#HKT*G{Dw-(-4k z^yAfi=ch~lJlD^E*8jBL^=Zx5*dO_;>*shKzgfO~^Ya6i)!YB*{_YK_vZ{Y6w)gF| zwBonhroFe`U-@of()+)^;%rJpy*HhodE@qqE1#yzC2fno^ettvO0C1?mFEB0wC1n6 zKQnq#)DEK``vW(AQq`1btMTmWQjDLpC~2BK(DPyp`;Ray=p~)5w{d#iuUj7`A6Z}U zbMa^9BS$Cj3y3<~IfU^1WC%2T!t6p&;17@HQW0^Lh7}T@7#Ag-VDI44|Nk~@PtU#Q zu}9Kg-+#31xlQD=?|jcWWY*X1|FbymedV)gsSW2XnL@ul=QQ7JWpn@Zi$9wSdr!PC zjbOf(b9#>9jjgd0&b|xR+cIauWR|E;Z|!ycpWOTtS(*P#{IJXg6Nyi$+*1GYo^A@x z-4!pG5msNH1`pbuS8LeHk40<0kG?9&bp1sAzfar#x%}JCqPM#4>caQy{)MyrI=|0) zuC4p|o4cRp-~6sEZ}(f4g|Fn_CG#rl{b!#^Hj6R z4;I4JX1mmn%72=km-J2k#=IPs9}UZb!)uD4c5{3Q-(M`+Am+z1Kjx?RPliGRSg39O eGbM + + + + + + +NCEPLIBS-ip: ip_grid_descriptor_mod::grib2_descriptor Type Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_grid_descriptor_mod::grib2_descriptor Type Reference
    +
    +
    + +

    Grib-2 descriptor containing a grib2 GDT represented by an integer array. + More...

    +
    +Inheritance diagram for ip_grid_descriptor_mod::grib2_descriptor:
    +
    +
    + + +ip_grid_descriptor_mod::ip_grid_descriptor + +
    + + + + + + + + +

    +Private Member Functions

    procedure is_same_grid
     Test whether two grid descriptors are the same. More...
     
    procedure is_same_grid_grib2
     Test whether two grid descriptors are the same. More...
     
    + + + + + + + + + + + + + +

    +Private Attributes

    integer gdt_len
     Length of the template. More...
     
    integer gdt_num
     Grid number which represents grid type. More...
     
    integer, dimension(:), allocatable gdt_tmpl
     Grib-2 grid definition template. More...
     
    integer grid_num
     Integer representing the grid type (see *_GRID_ID_GRIB1/2 in ip_grid_mod). More...
     
    +

    Detailed Description

    +

    Grib-2 descriptor containing a grib2 GDT represented by an integer array.

    +
    Date
    July 2021
    + +

    Definition at line 47 of file ip_grid_descriptor_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ is_same_grid()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_grid_descriptor_mod::ip_grid_descriptor::is_same_grid
    +
    +privateinherited
    +
    + +

    Test whether two grid descriptors are the same.

    +
    Returns
    N/A
    + +

    Definition at line 32 of file ip_grid_descriptor_mod.F90.

    + +
    +
    + +

    ◆ is_same_grid_grib2()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_grid_descriptor_mod::grib2_descriptor::is_same_grid_grib2
    +
    +private
    +
    + +

    Test whether two grid descriptors are the same.

    +
    Returns
    N/A
    + +

    Definition at line 53 of file ip_grid_descriptor_mod.F90.

    + +
    +
    +

    Field Documentation

    + +

    ◆ gdt_len

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_descriptor_mod::grib2_descriptor::gdt_len
    +
    +private
    +
    + +

    Length of the template.

    + +

    Definition at line 49 of file ip_grid_descriptor_mod.F90.

    + +
    +
    + +

    ◆ gdt_num

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_descriptor_mod::grib2_descriptor::gdt_num
    +
    +private
    +
    + +

    Grid number which represents grid type.

    + +

    Definition at line 48 of file ip_grid_descriptor_mod.F90.

    + +
    +
    + +

    ◆ gdt_tmpl

    + +
    +
    + + + + + +
    + + + + +
    integer, dimension(:), allocatable ip_grid_descriptor_mod::grib2_descriptor::gdt_tmpl
    +
    +private
    +
    + +

    Grib-2 grid definition template.

    + +

    Definition at line 50 of file ip_grid_descriptor_mod.F90.

    + +
    +
    + +

    ◆ grid_num

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_descriptor_mod::ip_grid_descriptor::grid_num
    +
    +privateinherited
    +
    + +

    Integer representing the grid type (see *_GRID_ID_GRIB1/2 in ip_grid_mod).

    + +

    Definition at line 29 of file ip_grid_descriptor_mod.F90.

    + +
    +
    +
    The documentation for this type was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/structip__grid__descriptor__mod_1_1grib2__descriptor.js b/ver-5.1.0/structip__grid__descriptor__mod_1_1grib2__descriptor.js new file mode 100644 index 00000000..23620eb7 --- /dev/null +++ b/ver-5.1.0/structip__grid__descriptor__mod_1_1grib2__descriptor.js @@ -0,0 +1,9 @@ +var structip__grid__descriptor__mod_1_1grib2__descriptor = +[ + [ "is_same_grid", "structip__grid__descriptor__mod_1_1grib2__descriptor.html#a9da102dac348a63ffce6556ed5da81b6", null ], + [ "is_same_grid_grib2", "structip__grid__descriptor__mod_1_1grib2__descriptor.html#ae27b09a835144baf782e2cde0c1ea013", null ], + [ "gdt_len", "structip__grid__descriptor__mod_1_1grib2__descriptor.html#abf8e6d212308608a039e8e97c05c4a06", null ], + [ "gdt_num", "structip__grid__descriptor__mod_1_1grib2__descriptor.html#aa5dd78817926e0246f93819ab7037e19", null ], + [ "gdt_tmpl", "structip__grid__descriptor__mod_1_1grib2__descriptor.html#a3a90e1ef19332a1d8ec1f6a3193c6ebe", null ], + [ "grid_num", "structip__grid__descriptor__mod_1_1grib2__descriptor.html#a6d4598dc4bbf46e059f636715cc390f1", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/structip__grid__descriptor__mod_1_1grib2__descriptor.png b/ver-5.1.0/structip__grid__descriptor__mod_1_1grib2__descriptor.png new file mode 100644 index 0000000000000000000000000000000000000000..8ad07329986a9f3e135b9c2150491096b453cf42 GIT binary patch literal 780 zcmeAS@N?(olHy`uVBq!ia0vp^|A07vgBeKj#aa9XQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;+YukuoVPtU#Qu`b*8 zp4Ha0-~GHd#4mJz?b*$7&u!K(PFiiBxk>Ky@z0-s#vRYKkl5bwO&YeC=01x**HMd7GHo?2}?Y zCL9d^FQ+y4)BOEgX4+5tA0P5-_4`Bh(SJXONS)hfJy)0g+|AifpT98=%6$2!dV5Ch zcC*>p+n3hd|9Q5UU$pxD^zV;Wu8x>gTa}c*IOtS-b;r#-&!3)dp1&Ga1!w=^4Y3Q| zZ@69MYC-CU>nkFDP7>ikc=W{l=aqci4e^f{1;jT#wU=A?_4u^?EBe>i@Az}^C*z}} z6YL#bit-9tZ8Z%mBt9`NA}CPTmN{$Ljszxzwhy1~=N&!$qV}F^O7w5BaNFr8P5$Rx zbEx~pF=u_lc5jKNg#K@Ad}PoSWAylQ(4VR+xQv zeNINK`vSH5e=dLPG?{J3{XWM}_0+wk2PfR$zTnaOuzQ)7pK4iFUA3Pl*}Uo^&$Ax6 zT(im1XVVSpdw-oe9(L9Ffz;3Q@wcw!pSGXyUb!Ih>uJ8fvOiOAzgE0Z_wDY>9LuV6 z_jK&j?bpq*l|Em`+$cP^{=M|t-s@?_z1yd}xBhSUeD!~?Cwl+=Nris*_h%dkS#(u*56qX;r@D8piecH{jC47IOXoHkhlXdt%|DOzn22Yq>j!xhg h5bgd044w@?*cUmPJiV#b;sZ>&44$rjF6*2UngB<4gGK-V literal 0 HcmV?d00001 diff --git a/ver-5.1.0/structip__grid__descriptor__mod_1_1ip__grid__descriptor.html b/ver-5.1.0/structip__grid__descriptor__mod_1_1ip__grid__descriptor.html new file mode 100644 index 00000000..d7f674e8 --- /dev/null +++ b/ver-5.1.0/structip__grid__descriptor__mod_1_1ip__grid__descriptor.html @@ -0,0 +1,191 @@ + + + + + + + +NCEPLIBS-ip: ip_grid_descriptor_mod::ip_grid_descriptor Type Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_grid_descriptor_mod::ip_grid_descriptor Type Reference
    +
    +
    + +

    Abstract descriptor object which represents a grib1 or grib2 descriptor. + More...

    +
    +Inheritance diagram for ip_grid_descriptor_mod::ip_grid_descriptor:
    +
    +
    + + +ip_grid_descriptor_mod::grib1_descriptor +ip_grid_descriptor_mod::grib2_descriptor + +
    + + + + + +

    +Private Member Functions

    procedure is_same_grid
     Test whether two grid descriptors are the same. More...
     
    + + + + +

    +Private Attributes

    integer grid_num
     Integer representing the grid type (see *_GRID_ID_GRIB1/2 in ip_grid_mod). More...
     
    +

    Detailed Description

    +

    Abstract descriptor object which represents a grib1 or grib2 descriptor.

    +
    Date
    July 2021
    + +

    Definition at line 28 of file ip_grid_descriptor_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ is_same_grid()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_grid_descriptor_mod::ip_grid_descriptor::is_same_grid
    +
    +private
    +
    + +

    Test whether two grid descriptors are the same.

    +
    Returns
    N/A
    + +

    Definition at line 32 of file ip_grid_descriptor_mod.F90.

    + +
    +
    +

    Field Documentation

    + +

    ◆ grid_num

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_descriptor_mod::ip_grid_descriptor::grid_num
    +
    +private
    +
    + +

    Integer representing the grid type (see *_GRID_ID_GRIB1/2 in ip_grid_mod).

    + +

    Definition at line 29 of file ip_grid_descriptor_mod.F90.

    + +
    +
    +
    The documentation for this type was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/structip__grid__descriptor__mod_1_1ip__grid__descriptor.js b/ver-5.1.0/structip__grid__descriptor__mod_1_1ip__grid__descriptor.js new file mode 100644 index 00000000..20582279 --- /dev/null +++ b/ver-5.1.0/structip__grid__descriptor__mod_1_1ip__grid__descriptor.js @@ -0,0 +1,5 @@ +var structip__grid__descriptor__mod_1_1ip__grid__descriptor = +[ + [ "is_same_grid", "structip__grid__descriptor__mod_1_1ip__grid__descriptor.html#a9da102dac348a63ffce6556ed5da81b6", null ], + [ "grid_num", "structip__grid__descriptor__mod_1_1ip__grid__descriptor.html#a6d4598dc4bbf46e059f636715cc390f1", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/structip__grid__descriptor__mod_1_1ip__grid__descriptor.png b/ver-5.1.0/structip__grid__descriptor__mod_1_1ip__grid__descriptor.png new file mode 100644 index 0000000000000000000000000000000000000000..9e35e4973250b4f814588271d5339107c6daee11 GIT binary patch literal 1069 zcmeAS@N?(olHy`uVBq!ia0y~yU}6KZ12~w0WavuYKp-U%;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|z`V!P#WAFU@$KA;LW>o6T>BG`{r~?Y zcWZ{jt6Pt<(u=L{SqXJKtZE2vxNXXFSRkC?k}z|_3L&;4Cy5iBzH$ZA4H!7|6Bz{J z^wrCFGr!%G-gvA}dheG#8$=R6v>(f zo#X!G|4%di8Jm4`^)~D&c@>!QVfVq%r5w#{Y(FpmXuC5@-hA)%589D(7kGB~Z(nfX zMSZB|p#@u|uc)sKHhz(pT_XH>=AWkZMpJelGzIDkHmLab>CrC9=Jj5JZ0T>=j((^v zZ$9rW$i~Zai@m6@O5Sop_m4!LYj4D-De*+@ZY(Z0TEC&VZcWqYjz9MIyK*k8M=+bR z=^bWxw`-Y5VnE`BFH4Ru)oWj`dpu492R3@pHa>sZIm`iMbc zTMJ`DivlzlK{{F(9V$4P8$JlJF+5b|VL0S1!O#K?=YrM83T2ia=T}&_Md)esGJScI z+Mf$vGXKM(R3HwQS=aB{EtztuS1Q=+rQON)>HH_p=&Z6~OG^t>&^q8w)K3U zb+9pdPo?JS86N43)w>U_{~cga*u?+!%U`}Z(nZ;IcfQ0Omb|+4yV--Tc%6(d`uFx& zT-E!&nyJk2N1;3ym*0oP&0McGA6Y3`VqRW$)o}jGis+dKbtitCt&AWFq@Ne; z|324$TzdM;e%%KtJnOzJw2}7z@Ni0K0MGtp(VEZ$KY_{3PGqvh(e~u@q{1v&%Sl~7 z9==?E^R@Z&Ou{wBI%zx1C?{FVRh&$HYAwfeQ}=$SV&s*Zi@vzzpYmyNMD!>@kP*}{yp*HfF* z(&_^@Utaj}toi(q1BE<~er(v!#kcS1nKeuM4$jTDt2F=dzIMg3{4_E5_l5?>-O7my ph + + + + + + +NCEPLIBS-ip: ip_grid_mod::ip_grid Type Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_grid_mod::ip_grid Type Reference
    +
    +
    + +

    Abstract grid that holds fields and methods common to all grids. + More...

    +
    +Inheritance diagram for ip_grid_mod::ip_grid:
    +
    +
    + + +ip_equid_cylind_grid_mod::ip_equid_cylind_grid +ip_gaussian_grid_mod::ip_gaussian_grid +ip_lambert_conf_grid_mod::ip_lambert_conf_grid +ip_mercator_grid_mod::ip_mercator_grid +ip_polar_stereo_grid_mod::ip_polar_stereo_grid +ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid +ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid +ip_station_points_grid_mod::ip_station_points_grid + +
    + + + + + + + + + + + + + + + + + +

    +Private Member Functions

    procedure field_pos
     Field position for a given grid point. More...
     
    procedure(gdswzd_interface), deferred gdswzd
     Coordinate transformations for the grid. More...
     
    generic init => init_grib1, init_grib2
     Init subprogram. More...
     
    procedure(init_grib1_interface), deferred init_grib1
     Initializer for grib1 input descriptor. More...
     
    procedure(init_grib2_interface), deferred init_grib2
     Initializer for grib2 input descriptor. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Private Attributes

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor. More...
     
    real eccen_squared
     Eccentricity of the Earth squared (e^2). More...
     
    integer im
     Number of x points. More...
     
    integer iwrap
     x wraparound increment (0 if no wraparound). More...
     
    integer jm
     Number of y points. More...
     
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound). More...
     
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound). More...
     
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind). More...
     
    integer nm
     Total number of points. More...
     
    integer nscan
     
    integer nscan_field_pos
     nscan for field_pos routine. More...
     
    real rerth
     Radius of the Earth. More...
     
    +

    Detailed Description

    +

    Abstract grid that holds fields and methods common to all grids.

    +

    ip_grid is meant to be subclassed when implementing a new grid.

    +

    There are three methods that must be implemented:

    +

    The init methods are responsible for setting up the grid using GRIB1/GRIB2 descriptors.

    +

    gdswzd() performs transformations to and from Earth coordinates and grid coordinates.

    +

    A good reference for all the map projection equations used by NCEPLIBS-ip can be found here: https://doi.org/10.3133/pp1395.

    +
    Author
    Kyle Gerheiser
    +
    Date
    July 2021
    + +

    Definition at line 58 of file ip_grid_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ field_pos()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_grid_mod::ip_grid::field_pos
    +
    +private
    +
    + +

    Field position for a given grid point.

    +
    Returns
    Integer position in grib field to locate grid point.
    + +

    Definition at line 88 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ gdswzd()

    + +
    +
    + + + + + +
    + + + + +
    procedure(gdswzd_interface), deferred ip_grid_mod::ip_grid::gdswzd
    +
    +private
    +
    + +

    Coordinate transformations for the grid.

    +
    Returns
    N/A
    + +

    Definition at line 85 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ init()

    + +
    +
    + + + + + +
    + + + + +
    generic ip_grid_mod::ip_grid::init
    +
    +private
    +
    + +

    Init subprogram.

    +
    Returns
    N/A
    + +

    Definition at line 90 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib1()

    + +
    +
    + + + + + +
    + + + + +
    procedure(init_grib1_interface), deferred ip_grid_mod::ip_grid::init_grib1
    +
    +private
    +
    + +

    Initializer for grib1 input descriptor.

    +
    Returns
    N/A
    + +

    Definition at line 81 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib2()

    + +
    +
    + + + + + +
    + + + + +
    procedure(init_grib2_interface), deferred ip_grid_mod::ip_grid::init_grib2
    +
    +private
    +
    + +

    Initializer for grib2 input descriptor.

    +
    Returns
    N/A
    + +

    Definition at line 83 of file ip_grid_mod.F90.

    + +
    +
    +

    Field Documentation

    + +

    ◆ descriptor

    + +
    +
    + + + + + +
    + + + + +
    class(ip_grid_descriptor), allocatable ip_grid_mod::ip_grid::descriptor
    +
    +private
    +
    + +

    Descriptor.

    + +

    Definition at line 59 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ eccen_squared

    + +
    +
    + + + + + +
    + + + + +
    real ip_grid_mod::ip_grid::eccen_squared
    +
    +private
    +
    + +

    Eccentricity of the Earth squared (e^2).

    + +

    Definition at line 78 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ im

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::im
    +
    +private
    +
    + +

    Number of x points.

    + +

    Definition at line 61 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ iwrap

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::iwrap
    +
    +private
    +
    + +

    x wraparound increment (0 if no wraparound).

    + +

    Definition at line 74 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jm

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jm
    +
    +private
    +
    + +

    Number of y points.

    + +

    Definition at line 62 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jwrap1

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jwrap1
    +
    +private
    +
    + +

    y wraparound lower pivot point (0 if no wraparound).

    + +

    Definition at line 75 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jwrap2

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jwrap2
    +
    +private
    +
    + +

    y wraparound upper pivot point (0 if no wraparound).

    + +

    Definition at line 76 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ kscan

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::kscan
    +
    +private
    +
    + +

    Mass/wind flag for staggered diagonal (0 if mass; 1 if wind).

    + +

    Definition at line 70 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nm

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nm
    +
    +private
    +
    + +

    Total number of points.

    + +

    Definition at line 63 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nscan

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nscan
    +
    +private
    +
    +
    Parameters
    + + +
    Scanningmode.
      +
    • 0 if x first then y;
    • +
    • 1 if y first then x;
    • +
    • 3 if staggered diagonal like projection 203.
    • +
    +
    +
    +
    + +

    Definition at line 69 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nscan_field_pos

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nscan_field_pos
    +
    +private
    +
    + +

    nscan for field_pos routine.

    +

    Can be different than nscan due to differences in grib/grib2.

    + +

    Definition at line 72 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ rerth

    + +
    +
    + + + + + +
    + + + + +
    real ip_grid_mod::ip_grid::rerth
    +
    +private
    +
    + +

    Radius of the Earth.

    + +

    Definition at line 77 of file ip_grid_mod.F90.

    + +
    +
    +
    The documentation for this type was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/structip__grid__mod_1_1ip__grid.js b/ver-5.1.0/structip__grid__mod_1_1ip__grid.js new file mode 100644 index 00000000..d4a1fd30 --- /dev/null +++ b/ver-5.1.0/structip__grid__mod_1_1ip__grid.js @@ -0,0 +1,20 @@ +var structip__grid__mod_1_1ip__grid = +[ + [ "field_pos", "structip__grid__mod_1_1ip__grid.html#ac071b3d3eca9a5fa88ff5dc211d19179", null ], + [ "gdswzd", "structip__grid__mod_1_1ip__grid.html#a5fb366fb577a90cc09f21269b90ac080", null ], + [ "init", "structip__grid__mod_1_1ip__grid.html#a1f3fa40acb8c2ae4a65c00db21872d7c", null ], + [ "init_grib1", "structip__grid__mod_1_1ip__grid.html#a5a2c16279eb73a0c54ae0a1586d5b806", null ], + [ "init_grib2", "structip__grid__mod_1_1ip__grid.html#ad13e0ad8d616e1839ced388826fefee9", null ], + [ "descriptor", "structip__grid__mod_1_1ip__grid.html#a4a2a0dab09f05931d12615b0ac74bc51", null ], + [ "eccen_squared", "structip__grid__mod_1_1ip__grid.html#a180a5da6c470fac34b8439d4c0a32d2a", null ], + [ "im", "structip__grid__mod_1_1ip__grid.html#a546a9c3bb8e93ec8e8f7eaf2a14537dc", null ], + [ "iwrap", "structip__grid__mod_1_1ip__grid.html#ae179622b9a4c764a5ca90385330941ed", null ], + [ "jm", "structip__grid__mod_1_1ip__grid.html#a41a2a38288864520d8c50854d1843f87", null ], + [ "jwrap1", "structip__grid__mod_1_1ip__grid.html#a92976f110dd7e823799991137ac970a1", null ], + [ "jwrap2", "structip__grid__mod_1_1ip__grid.html#ae70be8cebcd217a49be4da1cebfc19d2", null ], + [ "kscan", "structip__grid__mod_1_1ip__grid.html#a084603b1c052e76c3335fea2e887cfce", null ], + [ "nm", "structip__grid__mod_1_1ip__grid.html#a2ae87fb4e6bdcb75fc6fdc80ad73ee30", null ], + [ "nscan", "structip__grid__mod_1_1ip__grid.html#a1a15aa48354dbbd0b8debafbfc6e7b18", null ], + [ "nscan_field_pos", "structip__grid__mod_1_1ip__grid.html#a0640093c52461763f904cc2f12c96b6c", null ], + [ "rerth", "structip__grid__mod_1_1ip__grid.html#a2bb4d4ec2455c3148313bf7cc54e1cc8", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/structip__grid__mod_1_1ip__grid.png b/ver-5.1.0/structip__grid__mod_1_1ip__grid.png new file mode 100644 index 0000000000000000000000000000000000000000..81595cd45710d1fe6f014aaff336a9cf519293d4 GIT binary patch literal 5524 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 Pdf|VU@L9ue_kQ)Cv9;_d literal 0 HcmV?d00001 diff --git a/ver-5.1.0/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html b/ver-5.1.0/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html new file mode 100644 index 00000000..d99f1331 --- /dev/null +++ b/ver-5.1.0/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html @@ -0,0 +1,903 @@ + + + + + + + +NCEPLIBS-ip: ip_lambert_conf_grid_mod::ip_lambert_conf_grid Type Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_lambert_conf_grid_mod::ip_lambert_conf_grid Type Reference
    +
    +
    +
    +Inheritance diagram for ip_lambert_conf_grid_mod::ip_lambert_conf_grid:
    +
    +
    + + +ip_grid_mod::ip_grid + +
    + + + + + + + + + + + + + + + + + +

    +Private Member Functions

    procedure field_pos
     Field position for a given grid point. More...
     
    procedure gdswzd => gdswzd_lambert_conf
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids. More...
     
    generic init => init_grib1, init_grib2
     Init subprogram. More...
     
    procedure init_grib1
     Initializes a gaussian grid given a grib1_descriptor object. More...
     
    procedure init_grib2
     Initializes a gaussian grid given a grib2_descriptor object. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Private Attributes

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor. More...
     
    real dxs
     x-direction grid length adjusted for scan mode. More...
     
    real dys
     y-direction grid length adjusted for scan model. More...
     
    real eccen_squared
     Eccentricity of the Earth squared (e^2). More...
     
    real h
     Hemisphere flag. More...
     
    integer im
     Number of x points. More...
     
    integer irot
     vector rotation flag. More...
     
    integer iwrap
     x wraparound increment (0 if no wraparound). More...
     
    integer jm
     Number of y points. More...
     
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound). More...
     
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound). More...
     
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind). More...
     
    integer nm
     Total number of points. More...
     
    integer nscan
     
    integer nscan_field_pos
     nscan for field_pos routine. More...
     
    real orient
     Longitude of meridian parallel to y-axis along which latitude increases at the latitude increases. More...
     
    real rerth
     Radius of the Earth. More...
     
    real rlat1
     La1― latitude of first grid point. More...
     
    real rlati1
     First latitude from the pole at which the secant cone cuts the sphere. More...
     
    real rlati2
     Second latitude from the pole at which the scant cone cuts the sphere. More...
     
    real rlon1
     Lo1― longitude of first grid point. More...
     
    +

    Detailed Description

    +
    +

    Definition at line 24 of file ip_lambert_conf_grid_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ field_pos()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_grid_mod::ip_grid::field_pos
    +
    +privateinherited
    +
    + +

    Field position for a given grid point.

    +
    Returns
    Integer position in grib field to locate grid point.
    + +

    Definition at line 88 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ gdswzd()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_lambert_conf_grid_mod::ip_lambert_conf_grid::gdswzd
    +
    +private
    +
    + +

    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids.

    +
    Returns
    N/A
    + +

    Definition at line 41 of file ip_lambert_conf_grid_mod.F90.

    + +
    +
    + +

    ◆ init()

    + +
    +
    + + + + + +
    + + + + +
    generic ip_grid_mod::ip_grid::init
    +
    +privateinherited
    +
    + +

    Init subprogram.

    +
    Returns
    N/A
    + +

    Definition at line 90 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib1()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_lambert_conf_grid_mod::ip_lambert_conf_grid::init_grib1
    +
    +private
    +
    + +

    Initializes a gaussian grid given a grib1_descriptor object.

    +
    Returns
    N/A
    + +

    Definition at line 36 of file ip_lambert_conf_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib2()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_lambert_conf_grid_mod::ip_lambert_conf_grid::init_grib2
    +
    +private
    +
    + +

    Initializes a gaussian grid given a grib2_descriptor object.

    +
    Returns
    N/A
    + +

    Definition at line 38 of file ip_lambert_conf_grid_mod.F90.

    + +
    +
    +

    Field Documentation

    + +

    ◆ descriptor

    + +
    +
    + + + + + +
    + + + + +
    class(ip_grid_descriptor), allocatable ip_grid_mod::ip_grid::descriptor
    +
    +privateinherited
    +
    + +

    Descriptor.

    + +

    Definition at line 59 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ dxs

    + +
    +
    + + + + + +
    + + + + +
    real ip_lambert_conf_grid_mod::ip_lambert_conf_grid::dxs
    +
    +private
    +
    + +

    x-direction grid length adjusted for scan mode.

    +

    GRIB2, Section 3, octets 56-59.

    + +

    Definition at line 30 of file ip_lambert_conf_grid_mod.F90.

    + +
    +
    + +

    ◆ dys

    + +
    +
    + + + + + +
    + + + + +
    real ip_lambert_conf_grid_mod::ip_lambert_conf_grid::dys
    +
    +private
    +
    + +

    y-direction grid length adjusted for scan model.

    +

    GRIB2, Section 3, octets 60-63.

    + +

    Definition at line 31 of file ip_lambert_conf_grid_mod.F90.

    + +
    +
    + +

    ◆ eccen_squared

    + +
    +
    + + + + + +
    + + + + +
    real ip_grid_mod::ip_grid::eccen_squared
    +
    +privateinherited
    +
    + +

    Eccentricity of the Earth squared (e^2).

    + +

    Definition at line 78 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ h

    + +
    +
    + + + + + +
    + + + + +
    real ip_lambert_conf_grid_mod::ip_lambert_conf_grid::h
    +
    +private
    +
    + +

    Hemisphere flag.

    +

    1-NH, minus 1-SH.

    + +

    Definition at line 32 of file ip_lambert_conf_grid_mod.F90.

    + +
    +
    + +

    ◆ im

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::im
    +
    +privateinherited
    +
    + +

    Number of x points.

    + +

    Definition at line 61 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ irot

    + +
    +
    + + + + + +
    + + + + +
    integer ip_lambert_conf_grid_mod::ip_lambert_conf_grid::irot
    +
    +private
    +
    + +

    vector rotation flag.

    +

    When "1", vectors are grid relative. When "0", vectors are earth relative. GRIB2, Section 3, octet 55.

    + +

    Definition at line 33 of file ip_lambert_conf_grid_mod.F90.

    + +
    +
    + +

    ◆ iwrap

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::iwrap
    +
    +privateinherited
    +
    + +

    x wraparound increment (0 if no wraparound).

    + +

    Definition at line 74 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jm

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jm
    +
    +privateinherited
    +
    + +

    Number of y points.

    + +

    Definition at line 62 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jwrap1

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jwrap1
    +
    +privateinherited
    +
    + +

    y wraparound lower pivot point (0 if no wraparound).

    + +

    Definition at line 75 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jwrap2

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jwrap2
    +
    +privateinherited
    +
    + +

    y wraparound upper pivot point (0 if no wraparound).

    + +

    Definition at line 76 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ kscan

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::kscan
    +
    +privateinherited
    +
    + +

    Mass/wind flag for staggered diagonal (0 if mass; 1 if wind).

    + +

    Definition at line 70 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nm

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nm
    +
    +privateinherited
    +
    + +

    Total number of points.

    + +

    Definition at line 63 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nscan

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nscan
    +
    +privateinherited
    +
    +
    Parameters
    + + +
    Scanningmode.
      +
    • 0 if x first then y;
    • +
    • 1 if y first then x;
    • +
    • 3 if staggered diagonal like projection 203.
    • +
    +
    +
    +
    + +

    Definition at line 69 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nscan_field_pos

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nscan_field_pos
    +
    +privateinherited
    +
    + +

    nscan for field_pos routine.

    +

    Can be different than nscan due to differences in grib/grib2.

    + +

    Definition at line 72 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ orient

    + +
    +
    + + + + + +
    + + + + +
    real ip_lambert_conf_grid_mod::ip_lambert_conf_grid::orient
    +
    +private
    +
    + +

    Longitude of meridian parallel to y-axis along which latitude increases at the latitude increases.

    +

    GRIB2, Section 3, octets 52-55.

    + +

    Definition at line 29 of file ip_lambert_conf_grid_mod.F90.

    + +
    +
    + +

    ◆ rerth

    + +
    +
    + + + + + +
    + + + + +
    real ip_grid_mod::ip_grid::rerth
    +
    +privateinherited
    +
    + +

    Radius of the Earth.

    + +

    Definition at line 77 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ rlat1

    + +
    +
    + + + + + +
    + + + + +
    real ip_lambert_conf_grid_mod::ip_lambert_conf_grid::rlat1
    +
    +private
    +
    + +

    La1― latitude of first grid point.

    +

    GRIB2, Section 3.30, octet 39-42.

    + +

    Definition at line 25 of file ip_lambert_conf_grid_mod.F90.

    + +
    +
    + +

    ◆ rlati1

    + +
    +
    + + + + + +
    + + + + +
    real ip_lambert_conf_grid_mod::ip_lambert_conf_grid::rlati1
    +
    +private
    +
    + +

    First latitude from the pole at which the secant cone cuts the sphere.

    +

    GRIB2, Section 3, octets 66-69.

    + +

    Definition at line 27 of file ip_lambert_conf_grid_mod.F90.

    + +
    +
    + +

    ◆ rlati2

    + +
    +
    + + + + + +
    + + + + +
    real ip_lambert_conf_grid_mod::ip_lambert_conf_grid::rlati2
    +
    +private
    +
    + +

    Second latitude from the pole at which the scant cone cuts the sphere.

    +

    GRIB2, Section 3, octets 70-73.

    + +

    Definition at line 28 of file ip_lambert_conf_grid_mod.F90.

    + +
    +
    + +

    ◆ rlon1

    + +
    +
    + + + + + +
    + + + + +
    real ip_lambert_conf_grid_mod::ip_lambert_conf_grid::rlon1
    +
    +private
    +
    + +

    Lo1― longitude of first grid point.

    +

    GRIB2, Section 3.30, octet 43-46.

    + +

    Definition at line 26 of file ip_lambert_conf_grid_mod.F90.

    + +
    +
    +
    The documentation for this type was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.js b/ver-5.1.0/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.js new file mode 100644 index 00000000..68099979 --- /dev/null +++ b/ver-5.1.0/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.js @@ -0,0 +1,29 @@ +var structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid = +[ + [ "field_pos", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#ac071b3d3eca9a5fa88ff5dc211d19179", null ], + [ "gdswzd", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#aa69861340bc268b91a1076048ed489fc", null ], + [ "init", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a1f3fa40acb8c2ae4a65c00db21872d7c", null ], + [ "init_grib1", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a35dd86b4a9017f5b03a0a6a01eb4d370", null ], + [ "init_grib2", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a64129413df8ea478ab1360fd1a274e9a", null ], + [ "descriptor", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a4a2a0dab09f05931d12615b0ac74bc51", null ], + [ "dxs", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#aa3288a7fbf2db34946116c771e5bc7dc", null ], + [ "dys", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a46fa89562e4dd23c765029d2d6c087bc", null ], + [ "eccen_squared", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a180a5da6c470fac34b8439d4c0a32d2a", null ], + [ "h", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a733c8a9b6ed498aeec73fa8f11283c03", null ], + [ "im", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a546a9c3bb8e93ec8e8f7eaf2a14537dc", null ], + [ "irot", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a0d90490fa5eb04604fc0e01bea2cf3cf", null ], + [ "iwrap", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#ae179622b9a4c764a5ca90385330941ed", null ], + [ "jm", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a41a2a38288864520d8c50854d1843f87", null ], + [ "jwrap1", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a92976f110dd7e823799991137ac970a1", null ], + [ "jwrap2", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#ae70be8cebcd217a49be4da1cebfc19d2", null ], + [ "kscan", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a084603b1c052e76c3335fea2e887cfce", null ], + [ "nm", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a2ae87fb4e6bdcb75fc6fdc80ad73ee30", null ], + [ "nscan", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a1a15aa48354dbbd0b8debafbfc6e7b18", null ], + [ "nscan_field_pos", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a0640093c52461763f904cc2f12c96b6c", null ], + [ "orient", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a0614cfdb69e59e3c3e2937f3319fe34a", null ], + [ "rerth", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a2bb4d4ec2455c3148313bf7cc54e1cc8", null ], + [ "rlat1", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a618bb61b83c39dd344264933e51fa932", null ], + [ "rlati1", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#a7dcfaef2adc076604ad32d1ecd1f1cb4", null ], + [ "rlati2", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#ae8b2c54b8d00685e179fec7786422f3b", null ], + [ "rlon1", "structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.html#ab7e9e396d5eeb63c8079a901c2c8743f", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.png b/ver-5.1.0/structip__lambert__conf__grid__mod_1_1ip__lambert__conf__grid.png new file mode 100644 index 0000000000000000000000000000000000000000..a7f309bc4104a6e901fbe30c915444dbed6cba45 GIT binary patch literal 825 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y&012~w0|`&vWIus;Zgs&(9zK{yAIruf+e1xP7x;RVq(WnR{$$ z)ivGgyxFgRMSa_?skQg)g=V03lXYw7-JO@U>)hLyRrk47J(nliP7+B1;-bShFVE52 zIPcQ$I1Nv$UhBMdt>2#Ax^u-m{HqKfP+j57d5H)AR|u=OOdE$(o|>wYgS?bI7}ypZN3kL0^5saW4C`ww zQ_`(|GnTnzGd;aomG7gwZeDPag$Ba{<#&H$vP!@D>|bs9`TWmE@yB%R<(TK4?Z2LN z?AESxGu2HQ=VzatfBr^j+if9LuVCBqrPp3W2J3jPeS4nsbi>k}^7qf(EW4u<@YUq! zdheXTRfXS|UJE;Kmv(Y%XMC7U-+kWP;ydgw!(RgJe7kjCdTW`bPHXk*dFPjW3-S+r zx%fc&tDgZ`?dRtGv*6I$ar^!Y`- + + + + + + +NCEPLIBS-ip: ip_mercator_grid_mod::ip_mercator_grid Type Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_mercator_grid_mod::ip_mercator_grid Type Reference
    +
    +
    +
    +Inheritance diagram for ip_mercator_grid_mod::ip_mercator_grid:
    +
    +
    + + +ip_grid_mod::ip_grid + +
    + + + + + + + + + + + + + + + + + +

    +Private Member Functions

    procedure field_pos
     Field position for a given grid point. More...
     
    procedure gdswzd => gdswzd_mercator
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids. More...
     
    generic init => init_grib1, init_grib2
     Init subprogram. More...
     
    procedure init_grib1
     Initializes a gaussian grid given a grib1_descriptor object. More...
     
    procedure init_grib2
     Initializes a gaussian grid given a grib2_descriptor object. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Private Attributes

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor. More...
     
    real dlon
     Longitudinal direction grid length. More...
     
    real dphi
     Latitudinal direction grid length. More...
     
    real eccen_squared
     Eccentricity of the Earth squared (e^2). More...
     
    real hi
     Scan mode in the 'i' direction. More...
     
    integer im
     Number of x points. More...
     
    integer iwrap
     x wraparound increment (0 if no wraparound). More...
     
    integer jm
     Number of y points. More...
     
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound). More...
     
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound). More...
     
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind). More...
     
    integer nm
     Total number of points. More...
     
    integer nscan
     
    integer nscan_field_pos
     nscan for field_pos routine. More...
     
    real rerth
     Radius of the Earth. More...
     
    real rlat1
     Latitude of first grid point. More...
     
    real rlati
     Latitude at which the Mercator projection intersects the Earth. More...
     
    real rlon1
     Longitude of first grid point. More...
     
    real rlon2
     Longitude of last grid point. More...
     
    +

    Detailed Description

    +
    +

    Definition at line 22 of file ip_mercator_grid_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ field_pos()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_grid_mod::ip_grid::field_pos
    +
    +privateinherited
    +
    + +

    Field position for a given grid point.

    +
    Returns
    Integer position in grib field to locate grid point.
    + +

    Definition at line 88 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ gdswzd()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_mercator_grid_mod::ip_mercator_grid::gdswzd
    +
    +private
    +
    + +

    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids.

    +
    Returns
    N/A gdswzd()
    +
    +N/A
    + +

    Definition at line 37 of file ip_mercator_grid_mod.F90.

    + +
    +
    + +

    ◆ init()

    + +
    +
    + + + + + +
    + + + + +
    generic ip_grid_mod::ip_grid::init
    +
    +privateinherited
    +
    + +

    Init subprogram.

    +
    Returns
    N/A
    + +

    Definition at line 90 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib1()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_mercator_grid_mod::ip_mercator_grid::init_grib1
    +
    +private
    +
    + +

    Initializes a gaussian grid given a grib1_descriptor object.

    +
    Returns
    N/A
    + +

    Definition at line 32 of file ip_mercator_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib2()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_mercator_grid_mod::ip_mercator_grid::init_grib2
    +
    +private
    +
    + +

    Initializes a gaussian grid given a grib2_descriptor object.

    +
    Returns
    N/A
    + +

    Definition at line 34 of file ip_mercator_grid_mod.F90.

    + +
    +
    +

    Field Documentation

    + +

    ◆ descriptor

    + +
    +
    + + + + + +
    + + + + +
    class(ip_grid_descriptor), allocatable ip_grid_mod::ip_grid::descriptor
    +
    +privateinherited
    +
    + +

    Descriptor.

    + +

    Definition at line 59 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ dlon

    + +
    +
    + + + + + +
    + + + + +
    real ip_mercator_grid_mod::ip_mercator_grid::dlon
    +
    +private
    +
    + +

    Longitudinal direction grid length.

    +

    Section 3, octets 65-68.

    + +

    Definition at line 28 of file ip_mercator_grid_mod.F90.

    + +
    +
    + +

    ◆ dphi

    + +
    +
    + + + + + +
    + + + + +
    real ip_mercator_grid_mod::ip_mercator_grid::dphi
    +
    +private
    +
    + +

    Latitudinal direction grid length.

    +

    Section 3, octets 69-72.

    + +

    Definition at line 29 of file ip_mercator_grid_mod.F90.

    + +
    +
    + +

    ◆ eccen_squared

    + +
    +
    + + + + + +
    + + + + +
    real ip_grid_mod::ip_grid::eccen_squared
    +
    +privateinherited
    +
    + +

    Eccentricity of the Earth squared (e^2).

    + +

    Definition at line 78 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ hi

    + +
    +
    + + + + + +
    + + + + +
    real ip_mercator_grid_mod::ip_mercator_grid::hi
    +
    +private
    +
    + +

    Scan mode in the 'i' direction.

    +

    Section 3, octet 60.

    + +

    Definition at line 27 of file ip_mercator_grid_mod.F90.

    + +
    +
    + +

    ◆ im

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::im
    +
    +privateinherited
    +
    + +

    Number of x points.

    + +

    Definition at line 61 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ iwrap

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::iwrap
    +
    +privateinherited
    +
    + +

    x wraparound increment (0 if no wraparound).

    + +

    Definition at line 74 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jm

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jm
    +
    +privateinherited
    +
    + +

    Number of y points.

    + +

    Definition at line 62 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jwrap1

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jwrap1
    +
    +privateinherited
    +
    + +

    y wraparound lower pivot point (0 if no wraparound).

    + +

    Definition at line 75 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jwrap2

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jwrap2
    +
    +privateinherited
    +
    + +

    y wraparound upper pivot point (0 if no wraparound).

    + +

    Definition at line 76 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ kscan

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::kscan
    +
    +privateinherited
    +
    + +

    Mass/wind flag for staggered diagonal (0 if mass; 1 if wind).

    + +

    Definition at line 70 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nm

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nm
    +
    +privateinherited
    +
    + +

    Total number of points.

    + +

    Definition at line 63 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nscan

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nscan
    +
    +privateinherited
    +
    +
    Parameters
    + + +
    Scanningmode.
      +
    • 0 if x first then y;
    • +
    • 1 if y first then x;
    • +
    • 3 if staggered diagonal like projection 203.
    • +
    +
    +
    +
    + +

    Definition at line 69 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nscan_field_pos

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nscan_field_pos
    +
    +privateinherited
    +
    + +

    nscan for field_pos routine.

    +

    Can be different than nscan due to differences in grib/grib2.

    + +

    Definition at line 72 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ rerth

    + +
    +
    + + + + + +
    + + + + +
    real ip_grid_mod::ip_grid::rerth
    +
    +privateinherited
    +
    + +

    Radius of the Earth.

    + +

    Definition at line 77 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ rlat1

    + +
    +
    + + + + + +
    + + + + +
    real ip_mercator_grid_mod::ip_mercator_grid::rlat1
    +
    +private
    +
    + +

    Latitude of first grid point.

    +

    Section 3, octets 39-42.

    + +

    Definition at line 23 of file ip_mercator_grid_mod.F90.

    + +
    +
    + +

    ◆ rlati

    + +
    +
    + + + + + +
    + + + + +
    real ip_mercator_grid_mod::ip_mercator_grid::rlati
    +
    +private
    +
    + +

    Latitude at which the Mercator projection intersects the Earth.

    +

    Section 3, octets 48-51.

    + +

    Definition at line 26 of file ip_mercator_grid_mod.F90.

    + +
    +
    + +

    ◆ rlon1

    + +
    +
    + + + + + +
    + + + + +
    real ip_mercator_grid_mod::ip_mercator_grid::rlon1
    +
    +private
    +
    + +

    Longitude of first grid point.

    +

    Section 3, octets 43-46.

    + +

    Definition at line 24 of file ip_mercator_grid_mod.F90.

    + +
    +
    + +

    ◆ rlon2

    + +
    +
    + + + + + +
    + + + + +
    real ip_mercator_grid_mod::ip_mercator_grid::rlon2
    +
    +private
    +
    + +

    Longitude of last grid point.

    +

    Section 3, octets 56-59.

    + +

    Definition at line 25 of file ip_mercator_grid_mod.F90.

    + +
    +
    +
    The documentation for this type was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/structip__mercator__grid__mod_1_1ip__mercator__grid.js b/ver-5.1.0/structip__mercator__grid__mod_1_1ip__mercator__grid.js new file mode 100644 index 00000000..8852aa25 --- /dev/null +++ b/ver-5.1.0/structip__mercator__grid__mod_1_1ip__mercator__grid.js @@ -0,0 +1,27 @@ +var structip__mercator__grid__mod_1_1ip__mercator__grid = +[ + [ "field_pos", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#ac071b3d3eca9a5fa88ff5dc211d19179", null ], + [ "gdswzd", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a940420aa99e0fbe51a976f9d0c343f1a", null ], + [ "init", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a1f3fa40acb8c2ae4a65c00db21872d7c", null ], + [ "init_grib1", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a3ae3bbb47f4c03c36404a2b35014d65c", null ], + [ "init_grib2", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a505b0114c7ff5fbb58c4e7ce5ccde3f0", null ], + [ "descriptor", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a4a2a0dab09f05931d12615b0ac74bc51", null ], + [ "dlon", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a455057778c7f2ad677956bdef2d754ee", null ], + [ "dphi", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a39168528a2c207b2e2c5373487d705c5", null ], + [ "eccen_squared", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a180a5da6c470fac34b8439d4c0a32d2a", null ], + [ "hi", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a91b223ca51a556fa11b76b0c05e0d3f2", null ], + [ "im", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a546a9c3bb8e93ec8e8f7eaf2a14537dc", null ], + [ "iwrap", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#ae179622b9a4c764a5ca90385330941ed", null ], + [ "jm", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a41a2a38288864520d8c50854d1843f87", null ], + [ "jwrap1", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a92976f110dd7e823799991137ac970a1", null ], + [ "jwrap2", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#ae70be8cebcd217a49be4da1cebfc19d2", null ], + [ "kscan", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a084603b1c052e76c3335fea2e887cfce", null ], + [ "nm", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a2ae87fb4e6bdcb75fc6fdc80ad73ee30", null ], + [ "nscan", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a1a15aa48354dbbd0b8debafbfc6e7b18", null ], + [ "nscan_field_pos", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a0640093c52461763f904cc2f12c96b6c", null ], + [ "rerth", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a2bb4d4ec2455c3148313bf7cc54e1cc8", null ], + [ "rlat1", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a1f98e5046c7c1eda30735e5919b79cc7", null ], + [ "rlati", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a3826e3e6b4f3264932c890a3c9804cef", null ], + [ "rlon1", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#adb673d1f9dbc7d7ee6f87513a2eed723", null ], + [ "rlon2", "structip__mercator__grid__mod_1_1ip__mercator__grid.html#a0b9bfef606985f5e682f4ddb84c99d2c", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/structip__mercator__grid__mod_1_1ip__mercator__grid.png b/ver-5.1.0/structip__mercator__grid__mod_1_1ip__mercator__grid.png new file mode 100644 index 0000000000000000000000000000000000000000..942758ef6eadebc68ec7533124a31dbd219e687f GIT binary patch literal 689 zcmeAS@N?(olHy`uVBq!ia0vp^AAmT3gBeH)Oy}?eQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;PdTF}^dwYtpTqZWdlo)F0if z*de9z(ljb2Y9>f9qs=_@*_)=9ySuk7owTG3XvwS>K|d-Uimv{$_k&cfx2oscJGYjK zpVFI~^I30h?do99AnWOS+P}Nj#9V7#sgilV_0Z!fzVjbX6>FYU;^wO5`D>1K+736L zNqsvErmDQ%=@K#NpE%s>eE=0!dFa2VUOsrL zjqCgs4_8aBlZ(>ix!{$}`;({t_stKMM)Lmp>r0Yu&NqAQ|MR%+`&}=~?}=@Uy{7Za zg}1ff%)GWG(t6F0{_Q&19C`ER*N-18URT|I^kARVDM`J&ZKuQS9DXN!dy_IJU3ZcH zl>lX%S~JUfKU?7&<2;Mq&9 zW`^`Tk%x1Q{{*h|zdC`NdB$;Q0L;91N3rDs|9^%vZ;hpwwLF^!OkWJ1u6{1-oD!M< DhnzrB literal 0 HcmV?d00001 diff --git a/ver-5.1.0/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html b/ver-5.1.0/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html new file mode 100644 index 00000000..e96e0fc3 --- /dev/null +++ b/ver-5.1.0/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html @@ -0,0 +1,896 @@ + + + + + + + +NCEPLIBS-ip: ip_polar_stereo_grid_mod::ip_polar_stereo_grid Type Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_polar_stereo_grid_mod::ip_polar_stereo_grid Type Reference
    +
    +
    +
    +Inheritance diagram for ip_polar_stereo_grid_mod::ip_polar_stereo_grid:
    +
    +
    + + +ip_grid_mod::ip_grid + +
    + + + + + + + + + + + + + + + + + +

    +Private Member Functions

    procedure field_pos
     Field position for a given grid point. More...
     
    procedure gdswzd => gdswzd_polar_stereo
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1). More...
     
    generic init => init_grib1, init_grib2
     Init subprogram. More...
     
    procedure init_grib1
     Initializes a grid given a grib1_descriptor object. More...
     
    procedure init_grib2
     Initializes a grid given a grib2_descriptor object. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Private Attributes

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor. More...
     
    real dxs
     'x'-direction grid length, adjusted by the scanning mode. More...
     
    real dys
     'y'-direction grid length, adjusted by the scanning mode. More...
     
    real eccen_squared
     Eccentricity of the Earth squared (e^2). More...
     
    logical elliptical
     When true/false, computations are based on an elliptical/spherical earth. More...
     
    real h
     Hemisphere flag. More...
     
    integer im
     Number of x points. More...
     
    integer irot
     Rotation flag. More...
     
    integer iwrap
     x wraparound increment (0 if no wraparound). More...
     
    integer jm
     Number of y points. More...
     
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound). More...
     
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound). More...
     
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind). More...
     
    integer nm
     Total number of points. More...
     
    integer nscan
     
    integer nscan_field_pos
     nscan for field_pos routine. More...
     
    real orient
     Orientation longitude. More...
     
    real rerth
     Radius of the Earth. More...
     
    real rlat1
     Latitude of the first grid point. More...
     
    real rlon1
     Longitude of the first grid point. More...
     
    real slatr
     Standard latitude of grid in radians. More...
     
    +

    Detailed Description

    +
    +

    Definition at line 23 of file ip_polar_stereo_grid_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ field_pos()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_grid_mod::ip_grid::field_pos
    +
    +privateinherited
    +
    + +

    Field position for a given grid point.

    +
    Returns
    Integer position in grib field to locate grid point.
    + +

    Definition at line 88 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ gdswzd()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_polar_stereo_grid_mod::ip_polar_stereo_grid::gdswzd
    +
    +private
    +
    + +

    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1).

    +
    Returns
    N/A
    + +

    Definition at line 41 of file ip_polar_stereo_grid_mod.F90.

    + +
    +
    + +

    ◆ init()

    + +
    +
    + + + + + +
    + + + + +
    generic ip_grid_mod::ip_grid::init
    +
    +privateinherited
    +
    + +

    Init subprogram.

    +
    Returns
    N/A
    + +

    Definition at line 90 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib1()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_polar_stereo_grid_mod::ip_polar_stereo_grid::init_grib1
    +
    +private
    +
    + +

    Initializes a grid given a grib1_descriptor object.

    +
    Returns
    N/A
    + +

    Definition at line 37 of file ip_polar_stereo_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib2()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_polar_stereo_grid_mod::ip_polar_stereo_grid::init_grib2
    +
    +private
    +
    + +

    Initializes a grid given a grib2_descriptor object.

    +
    Returns
    N/A
    + +

    Definition at line 38 of file ip_polar_stereo_grid_mod.F90.

    + +
    +
    +

    Field Documentation

    + +

    ◆ descriptor

    + +
    +
    + + + + + +
    + + + + +
    class(ip_grid_descriptor), allocatable ip_grid_mod::ip_grid::descriptor
    +
    +privateinherited
    +
    + +

    Descriptor.

    + +

    Definition at line 59 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ dxs

    + +
    +
    + + + + + +
    + + + + +
    real ip_polar_stereo_grid_mod::ip_polar_stereo_grid::dxs
    +
    +private
    +
    + +

    'x'-direction grid length, adjusted by the scanning mode.

    + +

    Definition at line 29 of file ip_polar_stereo_grid_mod.F90.

    + +
    +
    + +

    ◆ dys

    + +
    +
    + + + + + +
    + + + + +
    real ip_polar_stereo_grid_mod::ip_polar_stereo_grid::dys
    +
    +private
    +
    + +

    'y'-direction grid length, adjusted by the scanning mode.

    + +

    Definition at line 30 of file ip_polar_stereo_grid_mod.F90.

    + +
    +
    + +

    ◆ eccen_squared

    + +
    +
    + + + + + +
    + + + + +
    real ip_grid_mod::ip_grid::eccen_squared
    +
    +privateinherited
    +
    + +

    Eccentricity of the Earth squared (e^2).

    + +

    Definition at line 78 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ elliptical

    + +
    +
    + + + + + +
    + + + + +
    logical ip_polar_stereo_grid_mod::ip_polar_stereo_grid::elliptical
    +
    +private
    +
    + +

    When true/false, computations are based on an elliptical/spherical earth.

    + +

    Definition at line 24 of file ip_polar_stereo_grid_mod.F90.

    + +
    +
    + +

    ◆ h

    + +
    +
    + + + + + +
    + + + + +
    real ip_polar_stereo_grid_mod::ip_polar_stereo_grid::h
    +
    +private
    +
    + +

    Hemisphere flag.

    +

    0 - NH; 1 - SH.

    + +

    Definition at line 28 of file ip_polar_stereo_grid_mod.F90.

    + +
    +
    + +

    ◆ im

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::im
    +
    +privateinherited
    +
    + +

    Number of x points.

    + +

    Definition at line 61 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ irot

    + +
    +
    + + + + + +
    + + + + +
    integer ip_polar_stereo_grid_mod::ip_polar_stereo_grid::irot
    +
    +private
    +
    + +

    Rotation flag.

    +

    When '0' the u/v vector components are relative to north/east. When '1' the u/v vector components are grid relative.

    + +

    Definition at line 35 of file ip_polar_stereo_grid_mod.F90.

    + +
    +
    + +

    ◆ iwrap

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::iwrap
    +
    +privateinherited
    +
    + +

    x wraparound increment (0 if no wraparound).

    + +

    Definition at line 74 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jm

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jm
    +
    +privateinherited
    +
    + +

    Number of y points.

    + +

    Definition at line 62 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jwrap1

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jwrap1
    +
    +privateinherited
    +
    + +

    y wraparound lower pivot point (0 if no wraparound).

    + +

    Definition at line 75 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jwrap2

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jwrap2
    +
    +privateinherited
    +
    + +

    y wraparound upper pivot point (0 if no wraparound).

    + +

    Definition at line 76 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ kscan

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::kscan
    +
    +privateinherited
    +
    + +

    Mass/wind flag for staggered diagonal (0 if mass; 1 if wind).

    + +

    Definition at line 70 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nm

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nm
    +
    +privateinherited
    +
    + +

    Total number of points.

    + +

    Definition at line 63 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nscan

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nscan
    +
    +privateinherited
    +
    +
    Parameters
    + + +
    Scanningmode.
      +
    • 0 if x first then y;
    • +
    • 1 if y first then x;
    • +
    • 3 if staggered diagonal like projection 203.
    • +
    +
    +
    +
    + +

    Definition at line 69 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nscan_field_pos

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nscan_field_pos
    +
    +privateinherited
    +
    + +

    nscan for field_pos routine.

    +

    Can be different than nscan due to differences in grib/grib2.

    + +

    Definition at line 72 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ orient

    + +
    +
    + + + + + +
    + + + + +
    real ip_polar_stereo_grid_mod::ip_polar_stereo_grid::orient
    +
    +private
    +
    + +

    Orientation longitude.

    + +

    Definition at line 27 of file ip_polar_stereo_grid_mod.F90.

    + +
    +
    + +

    ◆ rerth

    + +
    +
    + + + + + +
    + + + + +
    real ip_grid_mod::ip_grid::rerth
    +
    +privateinherited
    +
    + +

    Radius of the Earth.

    + +

    Definition at line 77 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ rlat1

    + +
    +
    + + + + + +
    + + + + +
    real ip_polar_stereo_grid_mod::ip_polar_stereo_grid::rlat1
    +
    +private
    +
    + +

    Latitude of the first grid point.

    + +

    Definition at line 25 of file ip_polar_stereo_grid_mod.F90.

    + +
    +
    + +

    ◆ rlon1

    + +
    +
    + + + + + +
    + + + + +
    real ip_polar_stereo_grid_mod::ip_polar_stereo_grid::rlon1
    +
    +private
    +
    + +

    Longitude of the first grid point.

    + +

    Definition at line 26 of file ip_polar_stereo_grid_mod.F90.

    + +
    +
    + +

    ◆ slatr

    + +
    +
    + + + + + +
    + + + + +
    real ip_polar_stereo_grid_mod::ip_polar_stereo_grid::slatr
    +
    +private
    +
    + +

    Standard latitude of grid in radians.

    + +

    Definition at line 31 of file ip_polar_stereo_grid_mod.F90.

    + +
    +
    +
    The documentation for this type was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.js b/ver-5.1.0/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.js new file mode 100644 index 00000000..32b6b141 --- /dev/null +++ b/ver-5.1.0/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.js @@ -0,0 +1,29 @@ +var structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid = +[ + [ "field_pos", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#ac071b3d3eca9a5fa88ff5dc211d19179", null ], + [ "gdswzd", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a9e97b7352e67dd629f622f292cf0ca21", null ], + [ "init", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a1f3fa40acb8c2ae4a65c00db21872d7c", null ], + [ "init_grib1", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#ae2a5a7c08e4578f3d0ff6b85e5a14cce", null ], + [ "init_grib2", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a9622ce9892084b52303f27722572b87c", null ], + [ "descriptor", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a4a2a0dab09f05931d12615b0ac74bc51", null ], + [ "dxs", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#ac009bce0c0c14b3e0970da6c032a11b1", null ], + [ "dys", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a95e155383895ad3f56a3876877b5896b", null ], + [ "eccen_squared", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a180a5da6c470fac34b8439d4c0a32d2a", null ], + [ "elliptical", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a1bac1023f8d8cd631760403b222a8c3f", null ], + [ "h", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a6df619b3050279d9d560e72a3e87168f", null ], + [ "im", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a546a9c3bb8e93ec8e8f7eaf2a14537dc", null ], + [ "irot", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a13f3f267f5a26602eb93b6525f494a10", null ], + [ "iwrap", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#ae179622b9a4c764a5ca90385330941ed", null ], + [ "jm", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a41a2a38288864520d8c50854d1843f87", null ], + [ "jwrap1", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a92976f110dd7e823799991137ac970a1", null ], + [ "jwrap2", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#ae70be8cebcd217a49be4da1cebfc19d2", null ], + [ "kscan", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a084603b1c052e76c3335fea2e887cfce", null ], + [ "nm", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a2ae87fb4e6bdcb75fc6fdc80ad73ee30", null ], + [ "nscan", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a1a15aa48354dbbd0b8debafbfc6e7b18", null ], + [ "nscan_field_pos", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a0640093c52461763f904cc2f12c96b6c", null ], + [ "orient", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#aeaeb6d72861b9b62de5bcd435bc96ea4", null ], + [ "rerth", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a2bb4d4ec2455c3148313bf7cc54e1cc8", null ], + [ "rlat1", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a00565fd51d334324e9d68d1fc8c52640", null ], + [ "rlon1", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#a61650c9ce1a2ce44243bf491e5d93728", null ], + [ "slatr", "structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.html#aae4f801c95b7b61e2e6b1dd824d3688b", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.png b/ver-5.1.0/structip__polar__stereo__grid__mod_1_1ip__polar__stereo__grid.png new file mode 100644 index 0000000000000000000000000000000000000000..b5c2a91e3b1113ff41d78ddf52416d3a6d52a9e6 GIT binary patch literal 819 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y!~12~w0+RlX>ZmteY^~Z|?Y%+SYZqRNdLE#v=@I0A#bc6cmdZ&X(@80vQl6V+ zmMrtQWIgX-fAX>y|NT`x;|mh6uL)81-2c&hrDT?_R_@WmXWxGN_Wti5i{8cWAHVOP zzkFS`*^)_1=2`@t{ju|H^T(GJ*0ry_&x^cmTj!(dXW$*)6UNWVgo(~H4(p)$t=ve>*lY>8sp?j|UNqP}nvHDJ^@xDdVMYnCs{=j_>?`=S3~|LSwk-k$thC@sDIcFy*R{Wj-|r$05UHg*->yJmym z*@y>I{#ce)U!C@oYsz)^73N zIqy%;_6G`zw&n&Jn>f&kP0M=M9r}GS)0duP2D{5?(LM3ApM5!W?(M8nR%V@@%Ql?1XF6by8p=FbUYe>? ef=>1PXJ~zC!}u_0W-Ks;GkCiCxvX + + + + + + +NCEPLIBS-ip: ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid Type Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid Type Reference
    +
    +
    +
    +Inheritance diagram for ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid:
    +
    +
    + + +ip_grid_mod::ip_grid + +
    + + + + + + + + + + + + + + + + + +

    +Private Member Functions

    procedure field_pos
     Field position for a given grid point. More...
     
    procedure gdswzd => gdswzd_rot_equid_cylind_egrid
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1). More...
     
    generic init => init_grib1, init_grib2
     Init subprogram. More...
     
    procedure init_grib1
     Initializes a rotated equidistant cylindrical grid given a grib1_descriptor object. More...
     
    procedure init_grib2
     Initializes a rotated equidistant cylindrical grid given a grib2_descriptor object. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Private Attributes

    real(kdclat0
     Cosine of the latitude of the southern pole of projection. More...
     
    class(ip_grid_descriptor), allocatable descriptor
     Descriptor. More...
     
    real(kddlats
     'J'-direction grid increment. More...
     
    real(kddlons
     'I'-direction grid increment. More...
     
    real eccen_squared
     Eccentricity of the Earth squared (e^2). More...
     
    real(kdhi
     Scan mode in the 'i' direction. More...
     
    integer im
     Number of x points. More...
     
    integer irot
     Rotation flag. More...
     
    integer iwrap
     x wraparound increment (0 if no wraparound). More...
     
    integer jm
     Number of y points. More...
     
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound). More...
     
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound). More...
     
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind). More...
     
    integer nm
     Total number of points. More...
     
    integer nscan
     
    integer nscan_field_pos
     nscan for field_pos routine. More...
     
    real rerth
     Radius of the Earth. More...
     
    real(kdrlat1
     Latitude of first grid point. More...
     
    real(kdrlon0
     Longitude of southern pole of projection. More...
     
    real(kdrlon1
     Longitude of first grid point. More...
     
    real(kdslat0
     Sine of the latitude of the southern pole of projection. More...
     
    +

    Detailed Description

    +
    +

    Definition at line 37 of file ip_rot_equid_cylind_egrid_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ field_pos()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_grid_mod::ip_grid::field_pos
    +
    +privateinherited
    +
    + +

    Field position for a given grid point.

    +
    Returns
    Integer position in grib field to locate grid point.
    + +

    Definition at line 88 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ gdswzd()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::gdswzd
    +
    +private
    +
    + +

    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1).

    +
    Returns
    N/A
    + +

    Definition at line 59 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +
    +
    + +

    ◆ init()

    + +
    +
    + + + + + +
    + + + + +
    generic ip_grid_mod::ip_grid::init
    +
    +privateinherited
    +
    + +

    Init subprogram.

    +
    Returns
    N/A
    + +

    Definition at line 90 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib1()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::init_grib1
    +
    +private
    +
    + +

    Initializes a rotated equidistant cylindrical grid given a grib1_descriptor object.

    +
    Returns
    N/A
    + +

    Definition at line 53 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +
    +
    + +

    ◆ init_grib2()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::init_grib2
    +
    +private
    +
    + +

    Initializes a rotated equidistant cylindrical grid given a grib2_descriptor object.

    +
    Returns
    N/A
    + +

    Definition at line 56 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +
    +
    +

    Field Documentation

    + +

    ◆ clat0

    + +
    +
    + + + + + +
    + + + + +
    real(kd) ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::clat0
    +
    +private
    +
    + +

    Cosine of the latitude of the southern pole of projection.

    + +

    Definition at line 41 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +
    +
    + +

    ◆ descriptor

    + +
    +
    + + + + + +
    + + + + +
    class(ip_grid_descriptor), allocatable ip_grid_mod::ip_grid::descriptor
    +
    +privateinherited
    +
    + +

    Descriptor.

    + +

    Definition at line 59 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ dlats

    + +
    +
    + + + + + +
    + + + + +
    real(kd) ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::dlats
    +
    +private
    +
    + +

    'J'-direction grid increment.

    + +

    Definition at line 43 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +
    +
    + +

    ◆ dlons

    + +
    +
    + + + + + +
    + + + + +
    real(kd) ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::dlons
    +
    +private
    +
    + +

    'I'-direction grid increment.

    + +

    Definition at line 44 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +
    +
    + +

    ◆ eccen_squared

    + +
    +
    + + + + + +
    + + + + +
    real ip_grid_mod::ip_grid::eccen_squared
    +
    +privateinherited
    +
    + +

    Eccentricity of the Earth squared (e^2).

    + +

    Definition at line 78 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ hi

    + +
    +
    + + + + + +
    + + + + +
    real(kd) ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::hi
    +
    +private
    +
    + +

    Scan mode in the 'i' direction.

    + +

    Definition at line 45 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +
    +
    + +

    ◆ im

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::im
    +
    +privateinherited
    +
    + +

    Number of x points.

    + +

    Definition at line 61 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ irot

    + +
    +
    + + + + + +
    + + + + +
    integer ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::irot
    +
    +private
    +
    + +

    Rotation flag.

    +

    When '0' the u/v vector components are relative to north/east. When '1' the u/v vector components are grid relative.

    + +

    Definition at line 49 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +
    +
    + +

    ◆ iwrap

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::iwrap
    +
    +privateinherited
    +
    + +

    x wraparound increment (0 if no wraparound).

    + +

    Definition at line 74 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jm

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jm
    +
    +privateinherited
    +
    + +

    Number of y points.

    + +

    Definition at line 62 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jwrap1

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jwrap1
    +
    +privateinherited
    +
    + +

    y wraparound lower pivot point (0 if no wraparound).

    + +

    Definition at line 75 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jwrap2

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jwrap2
    +
    +privateinherited
    +
    + +

    y wraparound upper pivot point (0 if no wraparound).

    + +

    Definition at line 76 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ kscan

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::kscan
    +
    +privateinherited
    +
    + +

    Mass/wind flag for staggered diagonal (0 if mass; 1 if wind).

    + +

    Definition at line 70 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nm

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nm
    +
    +privateinherited
    +
    + +

    Total number of points.

    + +

    Definition at line 63 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nscan

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nscan
    +
    +privateinherited
    +
    +
    Parameters
    + + +
    Scanningmode.
      +
    • 0 if x first then y;
    • +
    • 1 if y first then x;
    • +
    • 3 if staggered diagonal like projection 203.
    • +
    +
    +
    +
    + +

    Definition at line 69 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nscan_field_pos

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nscan_field_pos
    +
    +privateinherited
    +
    + +

    nscan for field_pos routine.

    +

    Can be different than nscan due to differences in grib/grib2.

    + +

    Definition at line 72 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ rerth

    + +
    +
    + + + + + +
    + + + + +
    real ip_grid_mod::ip_grid::rerth
    +
    +privateinherited
    +
    + +

    Radius of the Earth.

    + +

    Definition at line 77 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ rlat1

    + +
    +
    + + + + + +
    + + + + +
    real(kd) ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::rlat1
    +
    +private
    +
    + +

    Latitude of first grid point.

    + +

    Definition at line 40 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +
    +
    + +

    ◆ rlon0

    + +
    +
    + + + + + +
    + + + + +
    real(kd) ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::rlon0
    +
    +private
    +
    + +

    Longitude of southern pole of projection.

    + +

    Definition at line 38 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +
    +
    + +

    ◆ rlon1

    + +
    +
    + + + + + +
    + + + + +
    real(kd) ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::rlon1
    +
    +private
    +
    + +

    Longitude of first grid point.

    + +

    Definition at line 39 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +
    +
    + +

    ◆ slat0

    + +
    +
    + + + + + +
    + + + + +
    real(kd) ip_rot_equid_cylind_egrid_mod::ip_rot_equid_cylind_egrid::slat0
    +
    +private
    +
    + +

    Sine of the latitude of the southern pole of projection.

    + +

    Definition at line 42 of file ip_rot_equid_cylind_egrid_mod.F90.

    + +
    +
    +
    The documentation for this type was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.js b/ver-5.1.0/structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.js new file mode 100644 index 00000000..fa593342 --- /dev/null +++ b/ver-5.1.0/structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.js @@ -0,0 +1,29 @@ +var structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid = +[ + [ "field_pos", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#ac071b3d3eca9a5fa88ff5dc211d19179", null ], + [ "gdswzd", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a62c8147f8845d75e8f52c7524a74c780", null ], + [ "init", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a1f3fa40acb8c2ae4a65c00db21872d7c", null ], + [ "init_grib1", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#ab9a85830bfd06183a8df73726f62217a", null ], + [ "init_grib2", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#adda32463a76ad97ac35b01f1ac693fa4", null ], + [ "clat0", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a7a1b97e05b77bb7563165bf3f3e97dda", null ], + [ "descriptor", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a4a2a0dab09f05931d12615b0ac74bc51", null ], + [ "dlats", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a00d41c3d43370d3f02bb92d59f66866c", null ], + [ "dlons", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a23a172ccd2e026746925e2029c0a9206", null ], + [ "eccen_squared", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a180a5da6c470fac34b8439d4c0a32d2a", null ], + [ "hi", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a970c2655cb03ad0927e03c1d550e3fe5", null ], + [ "im", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a546a9c3bb8e93ec8e8f7eaf2a14537dc", null ], + [ "irot", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a558e99f37191cb2ea7398ac2a05ef29e", null ], + [ "iwrap", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#ae179622b9a4c764a5ca90385330941ed", null ], + [ "jm", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a41a2a38288864520d8c50854d1843f87", null ], + [ "jwrap1", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a92976f110dd7e823799991137ac970a1", null ], + [ "jwrap2", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#ae70be8cebcd217a49be4da1cebfc19d2", null ], + [ "kscan", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a084603b1c052e76c3335fea2e887cfce", null ], + [ "nm", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a2ae87fb4e6bdcb75fc6fdc80ad73ee30", null ], + [ "nscan", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a1a15aa48354dbbd0b8debafbfc6e7b18", null ], + [ "nscan_field_pos", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a0640093c52461763f904cc2f12c96b6c", null ], + [ "rerth", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a2bb4d4ec2455c3148313bf7cc54e1cc8", null ], + [ "rlat1", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a884837892bf520ea7950f95d8c562a08", null ], + [ "rlon0", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a65579b8557bffeedb99f384048dea14e", null ], + [ "rlon1", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#a3684458139a165cd719b054637a7d121", null ], + [ "slat0", "structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.html#aca4b0ae69f756ef4854369bf88423d66", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.png b/ver-5.1.0/structip__rot__equid__cylind__egrid__mod_1_1ip__rot__equid__cylind__egrid.png new file mode 100644 index 0000000000000000000000000000000000000000..4a47e89af38706d2c8ea370a3259e6dac691515a GIT binary patch literal 863 zcmeAS@N?(olHy`uVBq!ia0y~yURUjo1;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|!1T`3#WAFU@$KB#lQwG!xQfqSwdcQb z{jm%deV&;&7oW47Tcj#@Ygw$)AJyk`n&%XMbDXxsVNy&>h^LWokm^YvkEtrgilLLv z#3-72UJ?vWH%@!`w^GZqsQCKKTbiMh_C5NqSi0l%l8}3^3qIM@*7fgSKi{&dM}GG5 z`B}^ACU{Lc_dsjq<`tU~^XB@Cd*^TT&KJEk6C}E6<}RbaO)qQYXWu&?Ikk;7U+i!Zd?(B}3Z1pxJr1AMHP3u;qHJt#fH_#r0Lc)3UDTLTm6xy1Ua)Jo;E!GN@6Pym>{SWpw8wR!*NwO8t(VJ4f0Fel z^uo89@+@M#?uN%D-$i~s9yEXczfWd@s}C66&iAt2{_6diE9Jk%pT2e7qIUfKxhuk} z^VY6>E1ntkLaO_mV`cBvmkQ4;4%@EId-v~j-;VwL)2vV2`)09pMfieecDsawW8!%C z-dm6#@^w{BL!8wi`x8GNKDfW{L(i)1LB~^fRQ+IId%NZJg2S)E8ds-&EO2Sy{l4ng z_4KUzeR7oy)ps_$%3907!BFRh8ZT!QOqWh+ni90>BY*i!k6_U^a)*Gqfx*+&&t;uc GLK6U5pN{ze literal 0 HcmV?d00001 diff --git a/ver-5.1.0/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html b/ver-5.1.0/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html new file mode 100644 index 00000000..6a372b93 --- /dev/null +++ b/ver-5.1.0/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html @@ -0,0 +1,866 @@ + + + + + + + +NCEPLIBS-ip: ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid Type Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid Type Reference
    +
    +
    +
    +Inheritance diagram for ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid:
    +
    +
    + + +ip_grid_mod::ip_grid + +
    + + + + + + + + + + + + + + + + + +

    +Private Member Functions

    procedure field_pos
     Field position for a given grid point. More...
     
    procedure gdswzd => gdswzd_rot_equid_cylind
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids. More...
     
    generic init => init_grib1, init_grib2
     Init subprogram. More...
     
    procedure init_grib1
     Initializes a Rotated equidistant cylindrical grid given a grib1_descriptor object. More...
     
    procedure init_grib2
     Initializes a Rotated equidistant cylindrical given a grib2_descriptor object. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Private Attributes

    real(kdclat0
     Cosine of the latitude of the southern pole of projection. More...
     
    class(ip_grid_descriptor), allocatable descriptor
     Descriptor. More...
     
    real(kddlats
     'J'-direction grid increment. More...
     
    real(kddlons
     'I'-direction grid increment. More...
     
    real eccen_squared
     Eccentricity of the Earth squared (e^2). More...
     
    integer im
     Number of x points. More...
     
    integer irot
     Rotation flag. More...
     
    integer iwrap
     x wraparound increment (0 if no wraparound). More...
     
    integer jm
     Number of y points. More...
     
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound). More...
     
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound). More...
     
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind). More...
     
    integer nm
     Total number of points. More...
     
    integer nscan
     
    integer nscan_field_pos
     nscan for field_pos routine. More...
     
    real rerth
     Radius of the Earth. More...
     
    real(kdrlon0
     Longitude of southern pole of projection. More...
     
    real(kdsbd
     Latitude of the southern boundary of the grid before rotation. More...
     
    real(kdslat0
     Sine of the latitude of the southern pole of projection. More...
     
    real(kdwbd
     Longitude of the western boundary of the grid before rotation. More...
     
    +

    Detailed Description

    +
    +

    Definition at line 32 of file ip_rot_equid_cylind_grid_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ field_pos()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_grid_mod::ip_grid::field_pos
    +
    +privateinherited
    +
    + +

    Field position for a given grid point.

    +
    Returns
    Integer position in grib field to locate grid point.
    + +

    Definition at line 88 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ gdswzd()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::gdswzd
    +
    +private
    +
    + +

    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for Gaussian grids.

    +
    Returns
    N/A
    + +

    Definition at line 53 of file ip_rot_equid_cylind_grid_mod.F90.

    + +
    +
    + +

    ◆ init()

    + +
    +
    + + + + + +
    + + + + +
    generic ip_grid_mod::ip_grid::init
    +
    +privateinherited
    +
    + +

    Init subprogram.

    +
    Returns
    N/A
    + +

    Definition at line 90 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib1()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::init_grib1
    +
    +private
    +
    + +

    Initializes a Rotated equidistant cylindrical grid given a grib1_descriptor object.

    +
    Returns
    N/A
    + +

    Definition at line 47 of file ip_rot_equid_cylind_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib2()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::init_grib2
    +
    +private
    +
    + +

    Initializes a Rotated equidistant cylindrical given a grib2_descriptor object.

    +
    Returns
    N/A
    + +

    Definition at line 50 of file ip_rot_equid_cylind_grid_mod.F90.

    + +
    +
    +

    Field Documentation

    + +

    ◆ clat0

    + +
    +
    + + + + + +
    + + + + +
    real(kd) ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::clat0
    +
    +private
    +
    + +

    Cosine of the latitude of the southern pole of projection.

    + +

    Definition at line 33 of file ip_rot_equid_cylind_grid_mod.F90.

    + +
    +
    + +

    ◆ descriptor

    + +
    +
    + + + + + +
    + + + + +
    class(ip_grid_descriptor), allocatable ip_grid_mod::ip_grid::descriptor
    +
    +privateinherited
    +
    + +

    Descriptor.

    + +

    Definition at line 59 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ dlats

    + +
    +
    + + + + + +
    + + + + +
    real(kd) ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::dlats
    +
    +private
    +
    + +

    'J'-direction grid increment.

    + +

    Definition at line 34 of file ip_rot_equid_cylind_grid_mod.F90.

    + +
    +
    + +

    ◆ dlons

    + +
    +
    + + + + + +
    + + + + +
    real(kd) ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::dlons
    +
    +private
    +
    + +

    'I'-direction grid increment.

    + +

    Definition at line 35 of file ip_rot_equid_cylind_grid_mod.F90.

    + +
    +
    + +

    ◆ eccen_squared

    + +
    +
    + + + + + +
    + + + + +
    real ip_grid_mod::ip_grid::eccen_squared
    +
    +privateinherited
    +
    + +

    Eccentricity of the Earth squared (e^2).

    + +

    Definition at line 78 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ im

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::im
    +
    +privateinherited
    +
    + +

    Number of x points.

    + +

    Definition at line 61 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ irot

    + +
    +
    + + + + + +
    + + + + +
    integer ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::irot
    +
    +private
    +
    + +

    Rotation flag.

    +

    When '0' the u/v vector components are relative to north/east. When '1' the u/v vector components are grid relative.

    + +

    Definition at line 43 of file ip_rot_equid_cylind_grid_mod.F90.

    + +
    +
    + +

    ◆ iwrap

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::iwrap
    +
    +privateinherited
    +
    + +

    x wraparound increment (0 if no wraparound).

    + +

    Definition at line 74 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jm

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jm
    +
    +privateinherited
    +
    + +

    Number of y points.

    + +

    Definition at line 62 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jwrap1

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jwrap1
    +
    +privateinherited
    +
    + +

    y wraparound lower pivot point (0 if no wraparound).

    + +

    Definition at line 75 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jwrap2

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jwrap2
    +
    +privateinherited
    +
    + +

    y wraparound upper pivot point (0 if no wraparound).

    + +

    Definition at line 76 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ kscan

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::kscan
    +
    +privateinherited
    +
    + +

    Mass/wind flag for staggered diagonal (0 if mass; 1 if wind).

    + +

    Definition at line 70 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nm

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nm
    +
    +privateinherited
    +
    + +

    Total number of points.

    + +

    Definition at line 63 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nscan

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nscan
    +
    +privateinherited
    +
    +
    Parameters
    + + +
    Scanningmode.
      +
    • 0 if x first then y;
    • +
    • 1 if y first then x;
    • +
    • 3 if staggered diagonal like projection 203.
    • +
    +
    +
    +
    + +

    Definition at line 69 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nscan_field_pos

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nscan_field_pos
    +
    +privateinherited
    +
    + +

    nscan for field_pos routine.

    +

    Can be different than nscan due to differences in grib/grib2.

    + +

    Definition at line 72 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ rerth

    + +
    +
    + + + + + +
    + + + + +
    real ip_grid_mod::ip_grid::rerth
    +
    +privateinherited
    +
    + +

    Radius of the Earth.

    + +

    Definition at line 77 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ rlon0

    + +
    +
    + + + + + +
    + + + + +
    real(kd) ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::rlon0
    +
    +private
    +
    + +

    Longitude of southern pole of projection.

    + +

    Definition at line 36 of file ip_rot_equid_cylind_grid_mod.F90.

    + +
    +
    + +

    ◆ sbd

    + +
    +
    + + + + + +
    + + + + +
    real(kd) ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::sbd
    +
    +private
    +
    + +

    Latitude of the southern boundary of the grid before rotation.

    + +

    Definition at line 39 of file ip_rot_equid_cylind_grid_mod.F90.

    + +
    +
    + +

    ◆ slat0

    + +
    +
    + + + + + +
    + + + + +
    real(kd) ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::slat0
    +
    +private
    +
    + +

    Sine of the latitude of the southern pole of projection.

    + +

    Definition at line 37 of file ip_rot_equid_cylind_grid_mod.F90.

    + +
    +
    + +

    ◆ wbd

    + +
    +
    + + + + + +
    + + + + +
    real(kd) ip_rot_equid_cylind_grid_mod::ip_rot_equid_cylind_grid::wbd
    +
    +private
    +
    + +

    Longitude of the western boundary of the grid before rotation.

    + +

    Definition at line 38 of file ip_rot_equid_cylind_grid_mod.F90.

    + +
    +
    +
    The documentation for this type was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.js b/ver-5.1.0/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.js new file mode 100644 index 00000000..696035bb --- /dev/null +++ b/ver-5.1.0/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.js @@ -0,0 +1,28 @@ +var structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid = +[ + [ "field_pos", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#ac071b3d3eca9a5fa88ff5dc211d19179", null ], + [ "gdswzd", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a0f14a253b51bcb0633cd00d32d5130a4", null ], + [ "init", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a1f3fa40acb8c2ae4a65c00db21872d7c", null ], + [ "init_grib1", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a9942c787bda2e118f1355476670edfca", null ], + [ "init_grib2", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a30ae580d169972e8d68c3d97ab3b2634", null ], + [ "clat0", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a49835868e8c8b96e243a5992daee6ea5", null ], + [ "descriptor", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a4a2a0dab09f05931d12615b0ac74bc51", null ], + [ "dlats", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#affd9cfc7a0e1d8e74735eac35b2e03c6", null ], + [ "dlons", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a76222910f6c9fa0c5374bed672904c85", null ], + [ "eccen_squared", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a180a5da6c470fac34b8439d4c0a32d2a", null ], + [ "im", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a546a9c3bb8e93ec8e8f7eaf2a14537dc", null ], + [ "irot", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#ae4c44c4cf8d1376b24861534edbf514f", null ], + [ "iwrap", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#ae179622b9a4c764a5ca90385330941ed", null ], + [ "jm", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a41a2a38288864520d8c50854d1843f87", null ], + [ "jwrap1", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a92976f110dd7e823799991137ac970a1", null ], + [ "jwrap2", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#ae70be8cebcd217a49be4da1cebfc19d2", null ], + [ "kscan", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a084603b1c052e76c3335fea2e887cfce", null ], + [ "nm", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a2ae87fb4e6bdcb75fc6fdc80ad73ee30", null ], + [ "nscan", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a1a15aa48354dbbd0b8debafbfc6e7b18", null ], + [ "nscan_field_pos", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a0640093c52461763f904cc2f12c96b6c", null ], + [ "rerth", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a2bb4d4ec2455c3148313bf7cc54e1cc8", null ], + [ "rlon0", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a7b111301b2fc41270869ee182512f13c", null ], + [ "sbd", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a246ec0afc422f6cfcc3758ff62c6017f", null ], + [ "slat0", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a8a02c6fc1ad38174e15679e69b5cbfdc", null ], + [ "wbd", "structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.html#a33ae1763c4f1267091bee36a9c92e46a", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.png b/ver-5.1.0/structip__rot__equid__cylind__grid__mod_1_1ip__rot__equid__cylind__grid.png new file mode 100644 index 0000000000000000000000000000000000000000..9dd76b75540a54a94526e536dc8a65713a93c35b GIT binary patch literal 854 zcmeAS@N?(olHy`uVBq!ia0y~yU~~hr12~w0WY9;Q4?s#Hz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-op6p0jjU@SZer$@h(Jo?OYjlSGb5scQC^dIil0 zHdXVymCPmgOy^=n_@pm}dgjvBre2r)|Ah7)E>>Oo>1A8@@27vOZS4Juzs;~W^Ix82 zw(r7JmD;J7P0wYWYTH@5FJ_NTsNO}bt(&zye`!5Gf9&e!={Zg3lZ9*7f&{K@>k0b7cJN8dj}Gkvufi{_v+t?_BW=gwEmFo zJ^W=?{VnYqGE(B>2bEn>QAFPl~G9pzX<3xXsP;S98Q-l~!aAompTA_A5KX z4l8p8W`ToJjEnB%ed7=~0%Y)ry%khwGi9n_@Mhsi?qx_^BdE}0%G9#at-;_Lhrlr@ z#zPUx4iedvNPf1@@X=JA9ONbF!NB&Q7S)DlD?eU%w(*sGmBg*r0oEIr_o-HGEc%_6 ze7(nZ1-C}u4yFd?bNbuo^d5fyX`11bcfOCW-}&{!w#GhhZrr_!yIaKrR@|vFyH_U^RQ`}zNNnMtN++pN4(p7wb2-}YTmlKTy$&ue_o z$hG-5-RJeSgGrl%!?QQunY z7p|x4Ua`Gcs=RmkadG$B-^bQZ+kMqy-Kne9_cHI6?eM#$o9!2)o4?zcF=vOz&iMJg zw(s{li#v2{PmTWjm67MbYSf?yM&!~dK3Cb`4KGA@CTO2^c(G{an^LB{Ts5 Dzt4p5 literal 0 HcmV?d00001 diff --git a/ver-5.1.0/structip__station__points__grid__mod_1_1ip__station__points__grid.html b/ver-5.1.0/structip__station__points__grid__mod_1_1ip__station__points__grid.html new file mode 100644 index 00000000..3082ed30 --- /dev/null +++ b/ver-5.1.0/structip__station__points__grid__mod_1_1ip__station__points__grid.html @@ -0,0 +1,633 @@ + + + + + + + +NCEPLIBS-ip: ip_station_points_grid_mod::ip_station_points_grid Type Reference + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    NCEPLIBS-ip +  5.1.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ip_station_points_grid_mod::ip_station_points_grid Type Reference
    +
    +
    +
    +Inheritance diagram for ip_station_points_grid_mod::ip_station_points_grid:
    +
    +
    + + +ip_grid_mod::ip_grid + +
    + + + + + + + + + + + + + + + + + +

    +Private Member Functions

    procedure field_pos
     Field position for a given grid point. More...
     
    procedure gdswzd => gdswzd_station_points
     Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for IP Station Point grids. More...
     
    generic init => init_grib1, init_grib2
     Init subprogram. More...
     
    procedure init_grib1
     Initializes a gaussian grid given a grib1_descriptor object. More...
     
    procedure init_grib2
     Initializes a gaussian grid given a grib2_descriptor object. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Private Attributes

    class(ip_grid_descriptor), allocatable descriptor
     Descriptor. More...
     
    real eccen_squared
     Eccentricity of the Earth squared (e^2). More...
     
    integer im
     Number of x points. More...
     
    integer iwrap
     x wraparound increment (0 if no wraparound). More...
     
    integer jm
     Number of y points. More...
     
    integer jwrap1
     y wraparound lower pivot point (0 if no wraparound). More...
     
    integer jwrap2
     y wraparound upper pivot point (0 if no wraparound). More...
     
    integer kscan
     Mass/wind flag for staggered diagonal (0 if mass; 1 if wind). More...
     
    integer nm
     Total number of points. More...
     
    integer nscan
     
    integer nscan_field_pos
     nscan for field_pos routine. More...
     
    real rerth
     Radius of the Earth. More...
     
    +

    Detailed Description

    +
    +

    Definition at line 18 of file ip_station_points_grid_mod.F90.

    +

    Member Function/Subroutine Documentation

    + +

    ◆ field_pos()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_grid_mod::ip_grid::field_pos
    +
    +privateinherited
    +
    + +

    Field position for a given grid point.

    +
    Returns
    Integer position in grib field to locate grid point.
    + +

    Definition at line 88 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ gdswzd()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_station_points_grid_mod::ip_station_points_grid::gdswzd
    +
    +private
    +
    + +

    Calculates Earth coordinates (iopt = 1) or grid coorindates (iopt = -1) for IP Station Point grids.

    +
    Returns
    N/A
    + +

    Definition at line 26 of file ip_station_points_grid_mod.F90.

    + +
    +
    + +

    ◆ init()

    + +
    +
    + + + + + +
    + + + + +
    generic ip_grid_mod::ip_grid::init
    +
    +privateinherited
    +
    + +

    Init subprogram.

    +
    Returns
    N/A
    + +

    Definition at line 90 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib1()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_station_points_grid_mod::ip_station_points_grid::init_grib1
    +
    +private
    +
    + +

    Initializes a gaussian grid given a grib1_descriptor object.

    +
    Returns
    N/A
    + +

    Definition at line 21 of file ip_station_points_grid_mod.F90.

    + +
    +
    + +

    ◆ init_grib2()

    + +
    +
    + + + + + +
    + + + + +
    procedure ip_station_points_grid_mod::ip_station_points_grid::init_grib2
    +
    +private
    +
    + +

    Initializes a gaussian grid given a grib2_descriptor object.

    +
    Returns
    N/A
    + +

    Definition at line 23 of file ip_station_points_grid_mod.F90.

    + +
    +
    +

    Field Documentation

    + +

    ◆ descriptor

    + +
    +
    + + + + + +
    + + + + +
    class(ip_grid_descriptor), allocatable ip_grid_mod::ip_grid::descriptor
    +
    +privateinherited
    +
    + +

    Descriptor.

    + +

    Definition at line 59 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ eccen_squared

    + +
    +
    + + + + + +
    + + + + +
    real ip_grid_mod::ip_grid::eccen_squared
    +
    +privateinherited
    +
    + +

    Eccentricity of the Earth squared (e^2).

    + +

    Definition at line 78 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ im

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::im
    +
    +privateinherited
    +
    + +

    Number of x points.

    + +

    Definition at line 61 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ iwrap

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::iwrap
    +
    +privateinherited
    +
    + +

    x wraparound increment (0 if no wraparound).

    + +

    Definition at line 74 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jm

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jm
    +
    +privateinherited
    +
    + +

    Number of y points.

    + +

    Definition at line 62 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jwrap1

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jwrap1
    +
    +privateinherited
    +
    + +

    y wraparound lower pivot point (0 if no wraparound).

    + +

    Definition at line 75 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ jwrap2

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::jwrap2
    +
    +privateinherited
    +
    + +

    y wraparound upper pivot point (0 if no wraparound).

    + +

    Definition at line 76 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ kscan

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::kscan
    +
    +privateinherited
    +
    + +

    Mass/wind flag for staggered diagonal (0 if mass; 1 if wind).

    + +

    Definition at line 70 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nm

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nm
    +
    +privateinherited
    +
    + +

    Total number of points.

    + +

    Definition at line 63 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nscan

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nscan
    +
    +privateinherited
    +
    +
    Parameters
    + + +
    Scanningmode.
      +
    • 0 if x first then y;
    • +
    • 1 if y first then x;
    • +
    • 3 if staggered diagonal like projection 203.
    • +
    +
    +
    +
    + +

    Definition at line 69 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ nscan_field_pos

    + +
    +
    + + + + + +
    + + + + +
    integer ip_grid_mod::ip_grid::nscan_field_pos
    +
    +privateinherited
    +
    + +

    nscan for field_pos routine.

    +

    Can be different than nscan due to differences in grib/grib2.

    + +

    Definition at line 72 of file ip_grid_mod.F90.

    + +
    +
    + +

    ◆ rerth

    + +
    +
    + + + + + +
    + + + + +
    real ip_grid_mod::ip_grid::rerth
    +
    +privateinherited
    +
    + +

    Radius of the Earth.

    + +

    Definition at line 77 of file ip_grid_mod.F90.

    + +
    +
    +
    The documentation for this type was generated from the following file: +
    +
    + + + + diff --git a/ver-5.1.0/structip__station__points__grid__mod_1_1ip__station__points__grid.js b/ver-5.1.0/structip__station__points__grid__mod_1_1ip__station__points__grid.js new file mode 100644 index 00000000..f8d6a0a4 --- /dev/null +++ b/ver-5.1.0/structip__station__points__grid__mod_1_1ip__station__points__grid.js @@ -0,0 +1,20 @@ +var structip__station__points__grid__mod_1_1ip__station__points__grid = +[ + [ "field_pos", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#ac071b3d3eca9a5fa88ff5dc211d19179", null ], + [ "gdswzd", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a9fff8b24553d11177b8c1ee38bfbd91f", null ], + [ "init", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a1f3fa40acb8c2ae4a65c00db21872d7c", null ], + [ "init_grib1", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#aa5ec2cbc9bf0dadf20a226e0afeb3d32", null ], + [ "init_grib2", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a69fac68e7a40d5c3106a47bf1851891e", null ], + [ "descriptor", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a4a2a0dab09f05931d12615b0ac74bc51", null ], + [ "eccen_squared", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a180a5da6c470fac34b8439d4c0a32d2a", null ], + [ "im", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a546a9c3bb8e93ec8e8f7eaf2a14537dc", null ], + [ "iwrap", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#ae179622b9a4c764a5ca90385330941ed", null ], + [ "jm", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a41a2a38288864520d8c50854d1843f87", null ], + [ "jwrap1", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a92976f110dd7e823799991137ac970a1", null ], + [ "jwrap2", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#ae70be8cebcd217a49be4da1cebfc19d2", null ], + [ "kscan", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a084603b1c052e76c3335fea2e887cfce", null ], + [ "nm", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a2ae87fb4e6bdcb75fc6fdc80ad73ee30", null ], + [ "nscan", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a1a15aa48354dbbd0b8debafbfc6e7b18", null ], + [ "nscan_field_pos", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a0640093c52461763f904cc2f12c96b6c", null ], + [ "rerth", "structip__station__points__grid__mod_1_1ip__station__points__grid.html#a2bb4d4ec2455c3148313bf7cc54e1cc8", null ] +]; \ No newline at end of file diff --git a/ver-5.1.0/structip__station__points__grid__mod_1_1ip__station__points__grid.png b/ver-5.1.0/structip__station__points__grid__mod_1_1ip__station__points__grid.png new file mode 100644 index 0000000000000000000000000000000000000000..2419f86307327b8139cef09c3368c688cece859f GIT binary patch literal 825 zcmeAS@N?(olHy`uVBq!ia0y~yU{nFJ12~w0Wc%YEdx4ZhfKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+1Jeml7srqa#?z&hJG^xpr8 z_LD0Z^?TBK-(4%;_C|uGePKCM{YlI8$;IbxPf$JSaY<~NiYFs7zCUG(N@n-I&6a7e z{#I&u{+hB|J9D{;XV;I}lXk6{95l1~dWG5i`RjlGHtVVDt+#!bAF3+Lq3W6bDcAGx zq0{V#FE6xQTP0%pHO#rZZPF6spH-@7!@@SbkXi5geq+F-5;d4z-`{v%UAI{`^Odcb z*Q9e#mR(-E-0rTM^V64MF}s~TFU_n8zVyof!Q-WKB)lf|6?86HXELw;we|4}nx494 zEt8hy7v!qGov7%U4VM3q>N)Al_l+u^TpN(^3zesHHlMV7?#oao$%2hIkFlrBi&oG;^Jq3>cy#gd7@F8CjrI&m^-L z-~QeCziYzQGpxBZuT1X2y*G=zZix#gw92l3Ggmg@r0dP8Q?JzO$Jdwzef{{R)-=tz z{n~}=_Al)y?w7^;57J3Y2wSMT!!8&>Q=hyZZU@ zh&S4&*ZFUMv`cq)4%VaU_VHvO?!^7nJ){$=JN xm(D$9)Y)OUJHq5ZeIFt`fWhLR4h^nP{MO&>j1S8m=>ev522WQ%mvv4FO#mtjVx0g0 literal 0 HcmV?d00001 diff --git a/ver-5.1.0/sync_off.png b/ver-5.1.0/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/ver-5.1.0/sync_on.png b/ver-5.1.0/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/ver-5.1.0/tab_a.png b/ver-5.1.0/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/ver-5.1.0/tab_b.png b/ver-5.1.0/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/ver-5.1.0/tabs.css b/ver-5.1.0/tabs.css new file mode 100644 index 00000000..7d45d36c --- /dev/null +++ b/ver-5.1.0/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283A5D transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}}