From 3cbf6722099ec129b2395bc4266d670eedfc7cd3 Mon Sep 17 00:00:00 2001 From: a-urq Date: Wed, 13 Sep 2023 04:02:04 -0500 Subject: [PATCH] Added IGRA2 integration, SPC experimental sounding page integration, and ILCAPE. GUI and CLI to be written soon. --- .../SoundingFrame$SoundingGraphics.class | Bin 53876 -> 54492 bytes .../SoundingFrame$SoundingKeyListener.class | Bin 2796 -> 2796 bytes .../soundingViewer/SoundingFrame.class | Bin 43548 -> 43548 bytes .../soundingViewer/test/SoundingTest.class | Bin 3801 -> 3709 bytes .../test/soundingData_2020102700-OUN.txt | 175 +++++ .../test/soundingData_2023013012-OUN.txt | 97 +++ .../unixTool/RadiosondeSite.class | Bin 0 -> 10754 bytes .../unixTool/RadiosondeWrapper.class | Bin 0 -> 18052 bytes .../unixTool/res/caProvinces.txt | 13 + .../unixTool/res/fourLetterCodes.txt | 67 ++ .../soundingViewer/SoundingFrame.java | 406 +++++------ .../soundingViewer/test/SoundingTest.java | 6 +- .../test/soundingData_2020102700-OUN.txt | 175 +++++ .../test/soundingData_2023013012-OUN.txt | 97 +++ .../unixTool/RadiosondeSite.java | 366 ++++++++++ .../unixTool/RadiosondeWrapper.java | 653 ++++++++++++++++++ .../unixTool/res/caProvinces.txt | 13 + .../unixTool/res/fourLetterCodes.txt | 67 ++ 18 files changed, 1930 insertions(+), 205 deletions(-) create mode 100644 bin/com/ameliaWx/soundingViewer/test/soundingData_2020102700-OUN.txt create mode 100644 bin/com/ameliaWx/soundingViewer/test/soundingData_2023013012-OUN.txt create mode 100644 bin/com/ameliaWx/soundingViewer/unixTool/RadiosondeSite.class create mode 100644 bin/com/ameliaWx/soundingViewer/unixTool/RadiosondeWrapper.class create mode 100644 bin/com/ameliaWx/soundingViewer/unixTool/res/caProvinces.txt create mode 100644 bin/com/ameliaWx/soundingViewer/unixTool/res/fourLetterCodes.txt create mode 100644 src/com/ameliaWx/soundingViewer/test/soundingData_2020102700-OUN.txt create mode 100644 src/com/ameliaWx/soundingViewer/test/soundingData_2023013012-OUN.txt create mode 100644 src/com/ameliaWx/soundingViewer/unixTool/RadiosondeSite.java create mode 100644 src/com/ameliaWx/soundingViewer/unixTool/RadiosondeWrapper.java create mode 100644 src/com/ameliaWx/soundingViewer/unixTool/res/caProvinces.txt create mode 100644 src/com/ameliaWx/soundingViewer/unixTool/res/fourLetterCodes.txt diff --git a/bin/com/ameliaWx/soundingViewer/SoundingFrame$SoundingGraphics.class b/bin/com/ameliaWx/soundingViewer/SoundingFrame$SoundingGraphics.class index 389b4c6f9debedd03f5df1bfc87cbb29620cd9ed..5215eb78e517646505ad46c77be78c0da0469fcd 100644 GIT binary patch literal 54492 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 bdD4!*=mI;|kmihb#vn{WZVrsju}u6IeLghK literal 53876 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 P{t9QHG{;a}#>C$N?1`_5 diff --git a/bin/com/ameliaWx/soundingViewer/SoundingFrame$SoundingKeyListener.class b/bin/com/ameliaWx/soundingViewer/SoundingFrame$SoundingKeyListener.class index d2d32d36f752e3c6555c2370867b7ae0977e9ef2..5c44f57825cf5335c92aa33c246b2bbdc2de0df0 100644 GIT binary patch delta 168 zcmV;Z09XI)73>wTsRsewld1>i|dz?Eq2}iY3jq}h3;`Gl4goF-4*@s|5CJ<15&=RA69G&L6ah~P76DcY7Xe@j8UPXi W001D91PXNlACr0tM*-cF!U`&TwJT`= delta 168 zcmV;Z09XI)73>wTsRseqld1TX6 z>i~TT?Er@f?*NJk@c@(w@&KX<^8l&|^#H#K_W;QW`2frb`vBGn`~c(${Q&F<{{aCC z0RamN0|5>S1pyTb1_2lf2mvk%2?00?3IRI`3;{w44FOCF4gpUJ5CK*S5dmNd6aW$c W001D91PXNl8IyVnM*-K9!U`&SaxRkq diff --git a/bin/com/ameliaWx/soundingViewer/SoundingFrame.class b/bin/com/ameliaWx/soundingViewer/SoundingFrame.class index 67e51ba59d75b47493c745317c8e0482fe162773..bc84b588a299e842b7680c9f7ac73cf87277e374 100644 GIT binary patch delta 17575 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 O09C>85A-f~cl{rf!8^bJ delta 17314 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 Uqz8PNN_rQH0^twaE_HSNAM8fspa1{> diff --git a/bin/com/ameliaWx/soundingViewer/test/SoundingTest.class b/bin/com/ameliaWx/soundingViewer/test/SoundingTest.class index 764288144c443619bfd4559c5774f8e0298059eb..d41630a5a0df3df1f679c98a0188e94c6cf67dbe 100644 GIT binary patch delta 740 zcmY+AO-NKx6vuy8=e_&p&E!`$`D(HhMMuaYqQZz;xTr-?QIQEzyW9vZ(oAcz57R+X zds%5^U)qP2IciNgW!bmUGJ+OSi=a&qvo5s3Th)$|_0=eWk?~)zo^>*{O&~ zEy($|((+9F&T2i@sArGKZl_F72yI}m)2yes>S&xO+V2eLY1#orn)GzsMua-#*v2AP z6UQc=9Vge=s9Ky(BUznv-pYB}`6=hwo_Mo8L~AqYaE9FVZXYg^Kz;1VwJMZ9bcxkL ztgXjbwq|SnT49E*#aJ2l*}k^HQZZI~FF6;-zxGj`FA0Wi+Pdws-9c)ytUl`UBh7ER zH`WO4W>=7XSz&!NMIE#)J1m;R(HsfV96%Gx4BQ-_x=&2qr@%Y;a7I!r367BIEc68Y zHLO)f$yKeaR{`?WARE*N@(B~&%Sf0|Pb+OwVM*mV&ZC&62DrdQp?NCEB`y;}n(E>T z?Sx9NMy}E!+4;)PH6fkNs*>wMhJ0TcB|;`!R53UFf-b7nCT&7j_{?p( zL`VzoxFh6|p~D1(rb%``-9q8?(j%*j2%gHYyFy;xh~Rrdk-W!|j37~bp^5uK(fpv2 z2SPIx_iDC{b0(-%d&u-%=Qm z@s_wZoo753(J#a?k2v(#mqGF6r9`rEtu%?(#z-_LcItAIbl14d2{Re`8~?M*si- diff --git a/bin/com/ameliaWx/soundingViewer/test/soundingData_2020102700-OUN.txt b/bin/com/ameliaWx/soundingViewer/test/soundingData_2020102700-OUN.txt new file mode 100644 index 0000000..1ca571e --- /dev/null +++ b/bin/com/ameliaWx/soundingViewer/test/soundingData_2020102700-OUN.txt @@ -0,0 +1,175 @@ +#USM00072357 2020 10 27 00 2309 218 ncdc-nws ncdc-gts 351808 -974378 +21 0 98274B 345 -6B 970 4 10 31 +20 49 95077 609B -31B 935 9 10 104 +20 100 94393 665B -35B 940 8 10 119 +10 131 92500 825B -45B 953 6 25 127 +20 147 91461 914B -50B 952 6 32 134 +20 155 90986 955B -51B 955 6 35 138 +20 200 90745 976B -47B 958 6 37 141 +20 214 89981 1042B -42B 955 6 40 129 +20 231 89096 1121B -14B 926 10 44 115 +20 251 88006 1219B -6B 939 9 50 99 +20 300 87564 1259B -3B 941 8 53 92 +20 302 87447 1270B 0B 938 9 54 91 +20 308 87126 1299B 4B 933 9 57 84 +10 349 85000 1498B 10B 953 7 96 55 +20 355 84726 1524B 9B 957 6 104 54 +20 400 84466 1549B 8B 962 5 111 54 +20 453 81598 1828B 28B 961 6 170 31 +20 500 81239 1864B 31B 960 6 181 32 +20 551 78594 2133B 46B 949 7 224 79 +20 600 78024 2192B 48B 956 6 226 89 +20 632 76426 2362B 54B 961 6 231 159 +20 647 75720 2438B 71B 945 8 232 193 +20 659 75085 2507B 77B 946 8 233 218 +20 700 75023 2514B 77B 947 8 233 220 +20 745 72971 2743B 65B 983 3 234 223 +20 800 72297 2819B 61B 988 2 235 225 +20 808 71915 2863B 56B 994 1 234 224 +10 855 70000 3083B 40B 992 1 230 218 +20 900 69805 3106B 38B 984 2 230 217 +20 1000 67198 3415B 18B 950 7 228 212 +20 1046 65200 3658B 4B 929 10 227 225 +20 1057 64709 3719B 0B 915 12 227 228 +20 1100 64605 3732B 0B 918 12 227 229 +20 1200 62154 4041B -19B 934 9 225 234 +20 1213 61488 4126B -24B 932 9 225 231 +20 1237 60405 4267B -38B 874 18 224 226 +20 1300 59483 4388B -51B 839 23 224 221 +20 1319 58718 4490B -58B 827 25 226 228 +20 1400 57009 4720B -84B 611 62 230 246 +20 1408 56707 4761B -85B 571 70 231 254 +20 1431 55868 4877B -74B 848 21 232 277 +20 1437 55615 4912B -72B 855 20 233 283 +20 1500 54708 5040B -83B 784 31 234 307 +20 1541 53315 5240B -101B 674 49 235 318 +20 1600 52576 5347B -109B 696 45 236 323 +20 1640 50897 5596B -129B 721 40 238 305 +20 1700 50109 5714B -141B 200 181 239 296 +10 1703 50000 5731B -142B 202 180 239 293 +20 1715 49481 5810B -144B 144 214 237 278 +20 1800 47777 6075B -154B 110 239 229 226 +20 1803 47646 6096B -155B 106 242 229 226 +20 1900 45662 6415B -176B 82 262 226 236 +20 2000 43513 6775B -193B 71 272 226 282 +20 2045 41863 7061B -214B 48 301 231 296 +20 2100 41341 7153B -221B 58 283 232 301 +20 2129 40383 7325B -236B 58 280 235 309 +20 2133 40242 7351B -234B 51 291 235 310 +10 2141 40000 7395B -240B 65 269 236 312 +20 2200 39370 7510B -249B 65 266 238 318 +20 2220 38781 7620B -257B 68 260 237 326 +20 2300 37531 7857B -268B 53 279 236 344 +20 2323 36728 8012B -280B 39 301 236 356 +20 2400 35681 8219B -298B 54 271 236 376 +20 2500 33943 8573B -315B 60 259 234 452 +20 2600 32230 8938B -343B 102 209 234 452 +20 2634 31290 9144B -362B 126 188 236 450 +20 2700 30600 9298B -373B 172 160 238 449 +10 2721 30000 9435B -382B 188 152 238 452 +20 2747 29347 9586B -392B 199 146 239 457 +20 2800 29018 9663B -397B 191 148 239 460 +20 2900 27534 10020B -422B 128 177 241 475 +20 3000 26026 10398B -445B 102 190 237 537 +10 3041 25000 10667B -464B 86 198 237 553 +20 3042 24995 10668B -464B 86 198 237 554 +20 3100 24618 10769B -473B 92 191 237 561 +20 3132 23900 10964B -490B 100 182 238 568 +20 3200 23260 11141B -499B 109 174 238 575 +20 3300 22054 11487B -524B 106 171 238 610 +20 3400 20950 11819B -533B 161 141 238 663 +10 3459 20000 12116B -556B 150 142 238 688 +20 3500 19974 12124B -556B 152 141 238 689 +20 3553 19228 12366B -574B 218 113 240 671 +20 3600 19121 12401B -575B 217 113 240 669 +20 3700 18266 12689B -583B 156 134 241 658 +20 3800 17270 13041B -597B 110 152 238 657 +20 3900 16429 13351B -619B 90 158 238 643 +20 3957 15668 13643B -640B 97 148 241 649 +20 4000 15630 13658B -640B 100 147 241 650 +10 4047 15000 13910B -644B 109 141 244 611 +20 4100 14789 13996B -646B 102 144 245 601 +20 4200 13944 14355B -638B 93 151 246 481 +20 4300 13262 14662B -637B 80 159 244 430 +20 4326 12977 14796B -637B 73 163 242 423 +20 4400 12553 14998B -649B 67 163 239 416 +20 4444 12065 15240B -669B 74 151 240 422 +20 4500 11898 15323B -676B 70 151 240 425 +20 4524 11659 15446B -678B 74 147 242 420 +20 4553 11281 15645B -654B 64 164 245 416 +20 4600 11211 15682B -656B 66 162 246 415 +20 4700 10620 16010B -673B 71 151 246 394 +20 4800 10097 16313B -695B 81 137 245 370 +10 4813 10000 16371B -690B 77 141 246 369 +20 4900 9604 16611B -698B 78 137 248 364 +20 4926 9380 16752B -703B 81 133 253 324 +20 5000 8963 17025B -668B 63 158 262 276 +20 5011 8862 17094B -658B 63 162 263 260 +20 5100 8492 17351B -676B 78 146 270 190 +20 5200 8075 17654B -689B 79 140 260 158 +20 5300 7661 17967B -705B 80 132 259 201 +20 5320 7519 18079B -708B 78 132 255 180 +20 5354 7259 18288B -694B 65 145 245 147 +20 5400 7218 18321B -694B 66 145 243 142 +10 5436 7000 18504B -705B 80 132 234 151 +20 5500 6854 18628B -712B 83 128 228 159 +20 5513 6784 18689B -715B 83 127 234 156 +20 5600 6533 18914B -677B 63 154 256 160 +20 5632 6343 19094B -646B 54 174 251 133 +20 5700 6171 19261B -656B 60 165 244 111 +20 5800 5848 19588B -648B 65 165 221 131 +20 5900 5571 19884B -650B 66 164 237 148 +20 6000 5318 20167B -653B 66 162 244 134 +20 6100 5053 20478B -655B 64 164 252 157 +10 6112 5000 20543B -656B 65 162 255 153 +20 6120 4964 20587B -656B 65 162 258 150 +20 6200 4789 20805B -640B 54 176 271 142 +20 6300 4558 21109B -621B 48 190 282 124 +20 6346 4394 21336B -606B 50 193 247 94 +20 6355 4364 21380B -600B 51 195 238 94 +20 6400 4347 21403B -601B 52 193 233 95 +20 6500 4122 21734B -603B 61 184 239 132 +20 6600 3897 22084B -592B 53 195 260 145 +20 6700 3707 22398B -585B 47 204 257 95 +20 6800 3531 22703B -569B 47 209 237 133 +20 6900 3354 23030B -560B 56 202 231 145 +20 7000 3176 23376B -556B 56 204 252 165 +20 7100 3004 23731B -553B 63 197 242 155 +10 7101 3000 23740B -553B 64 197 243 156 +20 7200 2845 24077B -549B 52 210 267 206 +20 7246 2729 24345B -552B 49 213 268 194 +20 7300 2694 24426B -537B 50 216 268 190 +20 7400 2555 24767B -525B 56 212 251 194 +20 7500 2423 25111B -504B 53 221 250 243 +20 7521 2368 25263B -495B 45 234 247 252 +20 7600 2279 25512B -512B 49 224 242 270 +20 7700 2153 25881B -518B 43 231 245 264 +20 7800 2034 26247B -523B 54 214 253 236 +10 7818 2000 26359B -519B 57 213 252 246 +20 7900 1917 26631B -512B 58 213 249 269 +20 8000 1801 27036B -523B 62 206 255 275 +20 8031 1741 27257B -533B 64 202 256 275 +20 8056 1694 27432B -521B 61 208 257 275 +20 8100 1688 27455B -521B 60 209 257 275 +20 8200 1588 27851B -517B 59 210 259 286 +20 8219 1559 27970B -523B 57 211 258 283 +20 8300 1505 28202B -503B 47 229 256 277 +20 8355 1433 28525B -457B 51 236 258 279 +20 8400 1426 28555B -457B 51 236 258 280 +20 8500 1351 28915B -468B 56 227 257 274 +20 8600 1275 29296B -486B 59 219 257 268 +20 8700 1208 29652B -509B 58 214 258 293 +20 8710 1197 29713B -511B 57 215 258 297 +20 8800 1144 30008B -502B 53 222 257 317 +20 8847 1093 30306B -475B 44 242 255 315 +20 8900 1079 30389B -480B 47 236 254 314 +20 8914 1065 30480B -479B 49 233 252 315 +20 9000 1017 30778B -486B 49 232 247 318 +10 9018 1000 30892B -485B 48 232 248 327 +20 9100 960 31158B -486B 50 230 250 348 +20 9151 917 31463B -484B 52 227 256 359 +20 9200 909 31515B -477B 53 229 257 361 +20 9300 861 31881B -426B 66 226 263 385 +20 9312 851 31958B -415B 67 227 264 384 +20 9400 811 32284B -418B 60 234 270 383 +20 9500 770 32636B -433B 63 227 258 387 \ No newline at end of file diff --git a/bin/com/ameliaWx/soundingViewer/test/soundingData_2023013012-OUN.txt b/bin/com/ameliaWx/soundingViewer/test/soundingData_2023013012-OUN.txt new file mode 100644 index 0000000..af456f9 --- /dev/null +++ b/bin/com/ameliaWx/soundingViewer/test/soundingData_2023013012-OUN.txt @@ -0,0 +1,97 @@ +#USM00072363 2023 01 30 12 1104 144 ncdc-nws ncdc-gts 352331 -1017092 +21 0 89740B 1095 -131B 860 16 26 47 +20 7 89282B 1134B -141B 713 36 14 68 +20 20 88540 1196B -148B 759 30 11 73 +20 45 86964 1332B -160B 823 21 6 70 +20 100 86051 1412B -165B 837 19 7 71 +10 117 85000 1504B -146B 894 12 13 86 +20 205 82407 1741B -113B 912 10 349 81 +20 216 81782 1800B -89B 935 8 324 69 +20 306 79119 2060B -7B 937 9 237 165 +20 314 78743 2098B 18B 952 7 232 192 +20 325 78186 2155B 28B 923 11 226 234 +20 436 74693 2525B 30B 271 170 237 241 +20 446 74224 2576B 27B 255 177 238 244 +20 604 70754 2961B 0B 340 139 232 263 +20 606 70630 2975B -1B 343 138 232 263 +10 620 70000 3047B -6B 316 147 233 261 +20 741 66201 3490B -28B 70 309 241 293 +20 822 64438 3704B -49B 266 162 240 299 +20 947 60467 4200B -81B 66 301 234 303 +20 1329 51820 5374B -176B 34 314 240 332 +10 1421 50000 5641B -187B 49 282 244 324 +20 1745 44376 6517B -254B 80 228 251 344 +20 1825 43399 6678B -266B 122 192 249 332 +20 1945 41348 7026B -288B 65 239 249 316 +10 2038 40000 7262B -308B 92 208 249 324 +10 2837 30000 9253B -425B 32 263 243 412 +22 3152 26292 10131B -483B 60 210 245 441 +10 3311 25000 10464B -470B 16 299 244 497 +20 3326 24777 10524B -469B 11 323 245 503 +20 3425 23805 10789B -474B 10 323 243 548 +20 3525 22862 11055B -479B 10 322 244 508 +20 3645 21476 11465B -500B 10 317 239 561 +20 3805 20313 11828B -504B 10 317 244 533 +10 3828 20000 11930B -502B 10 317 243 524 +20 3905 19519 12088B -507B 10 314 243 506 +20 4305 16667 13111B -540B 11 305 243 594 +20 4329 16397 13216B -542B 10 306 242 571 +20 4345 16218 13286B -541B 10 306 241 561 +10 4536 15000 13784B -565B 11 299 242 660 +20 4545 14897 13827B -566B 11 299 243 664 +20 4905 12841 14765B -592B 11 291 243 494 +20 4945 12477 14944B -599B 11 290 239 528 +20 5225 10972 15738B -644B 11 277 242 440 +20 5345 10280 16136B -651B 11 275 244 471 +10 5420 10000 16304B -658B 11 273 247 433 +22 5427 9949 16335B -659B 11 272 247 424 +20 5440 9842 16400B -660B 11 274 246 397 +20 5505 9646 16523B -657B 10 276 242 407 +20 5628 9002 16945B -628B 10 284 247 308 +20 6045 7215 18293B -676B 12 266 268 168 +10 6121 7000 18474B -682B 11 265 262 168 +20 6122 6990 18483B -683B 11 265 261 166 +20 6225 6625 18805B -662B 10 279 228 142 +20 6242 6530 18894B -647B 9 284 239 118 +20 6325 6303 19111B -618B 10 289 287 23 +20 6345 6201 19212B -619B 10 286 203 7 +20 6405 6099 19314B -623B 11 283 162 34 +20 6445 5898 19521B -624B 11 283 171 91 +20 6625 5422 20041B -610B 10 289 238 83 +10 6800 5000 20546B -601B 11 289 200 43 +20 6825 4895 20677B -603B 11 289 198 37 +20 6905 4731 20890B -599B 10 291 326 11 +20 6925 4652 20996B -598B 11 289 121 18 +20 6926 4647 21002B -598B 11 289 122 18 +20 7025 4417 21318B -608B 11 285 174 10 +20 7033 4384 21365B -609B 11 284 56 17 +20 7045 4337 21431B -608B 11 285 28 27 +20 7145 4117 21756B -601B 10 290 71 37 +20 7225 3975 21975B -595B 10 292 35 44 +20 7305 3838 22194B -587B 10 296 68 85 +20 7345 3710 22407B -581B 10 296 48 90 +20 7405 3644 22520B -580B 11 295 58 191 +20 7445 3518 22743B -579B 11 295 39 14 +20 7503 3465 22839B -578B 11 295 50 78 +20 7623 3233 23273B -591B 11 290 63 94 +10 7747 3000 23744B -575B 10 298 68 136 +20 7945 2700 24411B -562B 10 300 84 164 +20 8145 2432 25079B -548B 11 303 69 130 +20 8245 2299 25438B -552B 11 301 68 194 +20 8345 2170 25805B -547B 10 304 74 161 +10 8513 2000 26328B -543B 11 304 84 211 +20 8605 1905 26640B -540B 11 305 86 219 +20 8905 1603 27749B -511B 10 318 70 284 +20 9345 1237 29442B -497B 10 318 77 331 +20 9625 1061 30454B -463B 10 330 105 271 +10 9732 1000 30846B -465B 10 328 101 273 +20 9805 971 31042B -461B 10 329 96 256 +20 9928 900 31545B -450B 10 332 82 311 +20 10025 852 31909B -456B 11 327 87 320 +20 10129 802 32313B -462B 11 325 75 291 +20 10305 737 32877B -445B 10 336 72 275 +10 10401 700 33223B -435B 10 338 85 241 +20 10423 686 33360B -435B 10 336 87 247 +20 10425 685 33374B -435B 10 336 87 248 +20 10525 646 33758B -436B 10 337 86 325 +20 10558 632 33946B -437B 11 332 92 305 \ No newline at end of file diff --git a/bin/com/ameliaWx/soundingViewer/unixTool/RadiosondeSite.class b/bin/com/ameliaWx/soundingViewer/unixTool/RadiosondeSite.class new file mode 100644 index 0000000000000000000000000000000000000000..987d7b6f72efcdd0fdb7aa0927f795d24ac10fdf GIT binary patch literal 10754 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 ZmQY_Ow1$kU+brqM$A`K10Sl$>|9|gjVAcQt literal 0 HcmV?d00001 diff --git a/bin/com/ameliaWx/soundingViewer/unixTool/res/caProvinces.txt b/bin/com/ameliaWx/soundingViewer/unixTool/res/caProvinces.txt new file mode 100644 index 0000000..b472f6a --- /dev/null +++ b/bin/com/ameliaWx/soundingViewer/unixTool/res/caProvinces.txt @@ -0,0 +1,13 @@ +AB ALBERTA +BC BRITISH COLUMBIA +MB MANITOBA +NB NEW BRUNSWICK +NL NEWFOUNDLAND & LABRADOR +NT NORTHWEST TERRITORIES +NS NOVA SCOTIA +NU NUNAVUT +ON ONTARIO +PE PRINCE EDWARD ISLAND +QC QUEBEC +SK SASKATCHEWAN +YT YUKON diff --git a/bin/com/ameliaWx/soundingViewer/unixTool/res/fourLetterCodes.txt b/bin/com/ameliaWx/soundingViewer/unixTool/res/fourLetterCodes.txt new file mode 100644 index 0000000..4f79a0c --- /dev/null +++ b/bin/com/ameliaWx/soundingViewer/unixTool/res/fourLetterCodes.txt @@ -0,0 +1,67 @@ +USM00072201 KKEY +USM00072202 KMFL +USM00072206 KJAX +USM00072214 KTLH +USM00072230 KBMX +USM00072240 KLCH +USM00072248 KSHV +USM00072249 KFWD +USM00072250 KBRO +USM00072251 KCRP +USM00072261 KDRT +USM00072265 KMAF +USM00072274 KTUS +USM00072293 KNKX +USM00072305 KMHX +USM00072317 KGSO +USM00072318 KRNK +USM00072327 KBNA +USM00072340 KLZK +USM00072357 KOUN +USM00072363 KAMA +USM00072364 KEPZ +USM00072365 KABQ +USM00072376 KFGZ +USM00072388 KVEF +USM00072393 KVBG +USM00072402 KWAL +USM00072403 KIAD +USM00072426 KILN +USM00072440 KSGF +USM00072451 KDDC +USM00072456 KTOP +USM00072476 KGJT +USM00072489 KREV +USM00072493 KOAK +USM00072501 KOKX +USM00072520 KPIT +USM00072528 KBUF +USM00072558 KOAX +USM00072562 KLBF +USM00072572 KSLC +USM00072582 KLKN +USM00072597 KMFR +USM00072632 KDTX +USM00072634 KAPX +USM00072645 KGRB +USM00072649 KMPX +USM00072659 KABR +USM00072662 KUNR +USM00072672 KRIW +USM00072681 KBOI +USM00072694 KSLE +USM00072712 KCAR +USM00072747 KINL +USM00072764 KBIS +USM00072768 KGGW +USM00072776 KTFX +USM00072786 KOTX +USM00072797 KUIL +USM00074004 K1Y7 +USM00074389 KGYX +USM00074455 KDVN +USM00074560 KILX +USM00074626 KPHX +USM00074646 KLMN +USM00074794 KXMR + diff --git a/src/com/ameliaWx/soundingViewer/SoundingFrame.java b/src/com/ameliaWx/soundingViewer/SoundingFrame.java index e62fbc2..bfe725e 100644 --- a/src/com/ameliaWx/soundingViewer/SoundingFrame.java +++ b/src/com/ameliaWx/soundingViewer/SoundingFrame.java @@ -64,7 +64,7 @@ public class SoundingFrame extends JFrame { private double windOffsetAngle; // corrects for U and V not matching up with east and north, radians - private ParcelPath pathType = ParcelPath.MIXED_LAYER_100MB; + private ParcelPath pathType = ParcelPath.INFLOW_LAYER; private boolean showEntrainment = false; @@ -72,20 +72,20 @@ public class SoundingFrame extends JFrame { @SuppressWarnings("unchecked") private ArrayList[] parcelPathSurfaceBased = new ArrayList[3]; @SuppressWarnings("unchecked") - private ArrayList[] parcelPathMixedLayer50Mb = new ArrayList[3]; - @SuppressWarnings("unchecked") - private ArrayList[] parcelPathMixedLayer100Mb = new ArrayList[3]; + private ArrayList[] parcelPathMixedLayer = new ArrayList[3]; @SuppressWarnings("unchecked") private ArrayList[] parcelPathMostUnstable = new ArrayList[3]; + @SuppressWarnings("unchecked") + private ArrayList[] parcelPathInflowLayer = new ArrayList[3]; @SuppressWarnings("unchecked") private ArrayList[] parcelPathSurfaceBasedEntr = new ArrayList[3]; @SuppressWarnings("unchecked") - private ArrayList[] parcelPathMixedLayer50MbEntr = new ArrayList[3]; - @SuppressWarnings("unchecked") - private ArrayList[] parcelPathMixedLayer100MbEntr = new ArrayList[3]; + private ArrayList[] parcelPathMixedLayerEntr = new ArrayList[3]; @SuppressWarnings("unchecked") private ArrayList[] parcelPathMostUnstableEntr = new ArrayList[3]; + @SuppressWarnings("unchecked") + private ArrayList[] parcelPathInflowLayerEntr = new ArrayList[3]; @SuppressWarnings("unchecked") private ArrayList[] parcelPathDowndraft = new ArrayList[3]; @@ -93,64 +93,64 @@ public class SoundingFrame extends JFrame { // readout parameters (write once read many) (0=sounding0, 1=soundingM, // 2=sounding1) private double[] sbcape = new double[3]; - private double[] ml50cape = new double[3]; - private double[] ml100cape = new double[3]; + private double[] ilcape = new double[3]; + private double[] mlcape = new double[3]; private double[] mucape = new double[3]; private double[] sbcinh = new double[3]; - private double[] ml50cinh = new double[3]; - private double[] ml100cinh = new double[3]; + private double[] mlcinh = new double[3]; private double[] mucinh = new double[3]; + private double[] ilcinh = new double[3]; private double[] sbLcl = new double[3]; - private double[] ml50Lcl = new double[3]; - private double[] ml100Lcl = new double[3]; + private double[] mlLcl = new double[3]; private double[] muLcl = new double[3]; + private double[] ilLcl = new double[3]; private double[] sbCcl = new double[3]; - private double[] ml50Ccl = new double[3]; - private double[] ml100Ccl = new double[3]; + private double[] mlCcl = new double[3]; private double[] muCcl = new double[3]; + private double[] ilCcl = new double[3]; private double[] sbLfc = new double[3]; - private double[] ml50Lfc = new double[3]; - private double[] ml100Lfc = new double[3]; + private double[] mlLfc = new double[3]; private double[] muLfc = new double[3]; + private double[] ilLfc = new double[3]; private double[] sbEl = new double[3]; - private double[] ml50El = new double[3]; - private double[] ml100El = new double[3]; + private double[] mlEl = new double[3]; private double[] muEl = new double[3]; + private double[] ilEl = new double[3]; private double[] sbecape = new double[3]; - private double[] ml50ecape = new double[3]; - private double[] ml100ecape = new double[3]; + private double[] mlecape = new double[3]; private double[] muecape = new double[3]; + private double[] ilecape = new double[3]; private double[] sbecinh = new double[3]; - private double[] ml50ecinh = new double[3]; - private double[] ml100ecinh = new double[3]; + private double[] mlecinh = new double[3]; private double[] muecinh = new double[3]; + private double[] ilecinh = new double[3]; private double[] sbELcl = new double[3]; - private double[] ml50ELcl = new double[3]; - private double[] ml100ELcl = new double[3]; + private double[] mlELcl = new double[3]; private double[] muELcl = new double[3]; + private double[] ilELcl = new double[3]; private double[] sbECcl = new double[3]; - private double[] ml50ECcl = new double[3]; - private double[] ml100ECcl = new double[3]; + private double[] mlECcl = new double[3]; private double[] muECcl = new double[3]; + private double[] ilECcl = new double[3]; private double[] sbELfc = new double[3]; - private double[] ml50ELfc = new double[3]; - private double[] ml100ELfc = new double[3]; + private double[] mlELfc = new double[3]; private double[] muELfc = new double[3]; + private double[] ilELfc = new double[3]; private double[] sbEEl = new double[3]; - private double[] ml50EEl = new double[3]; - private double[] ml100EEl = new double[3]; + private double[] mlEEl = new double[3]; private double[] muEEl = new double[3]; + private double[] ilEEl = new double[3]; private double[] muLpl = new double[3]; @@ -280,6 +280,7 @@ public SoundingFrame(String soundingSource, Sounding sounding0, DateTime time0, this.setSize(1750, 900); this.setLocationRelativeTo(null); + this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); this.setTitle(generateTitle(this.timeM)); @@ -334,25 +335,27 @@ public SoundingFrame(String soundingSource, Sounding sounding0, DateTime time0, parcelPathSurfaceBased[i] = WeatherUtils.computeParcelPath(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), ParcelPath.SURFACE_BASED, false); - parcelPathMixedLayer50Mb[i] = WeatherUtils.computeParcelPath(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), ParcelPath.MIXED_LAYER_50MB, - false); - parcelPathMixedLayer100Mb[i] = WeatherUtils.computeParcelPath(activeSounding.getPressureLevels(), + parcelPathMixedLayer[i] = WeatherUtils.computeParcelPath(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), ParcelPath.MIXED_LAYER_100MB, false); parcelPathMostUnstable[i] = WeatherUtils.computeParcelPath(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), ParcelPath.MOST_UNSTABLE, false); + parcelPathInflowLayer[i] = WeatherUtils.computeInflowLayerParcelPath(activeSounding.getPressureLevels(), + activeSounding.getHeight(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), + false); parcelPathSurfaceBasedEntr[i] = WeatherUtils.computeParcelPath(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), ParcelPath.SURFACE_BASED, true); - parcelPathMixedLayer50MbEntr[i] = WeatherUtils.computeParcelPath(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), ParcelPath.MIXED_LAYER_50MB, - true); - parcelPathMixedLayer100MbEntr[i] = WeatherUtils.computeParcelPath(activeSounding.getPressureLevels(), + parcelPathMixedLayerEntr[i] = WeatherUtils.computeParcelPath(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), ParcelPath.MIXED_LAYER_100MB, true); parcelPathMostUnstableEntr[i] = WeatherUtils.computeParcelPath(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), ParcelPath.MOST_UNSTABLE, true); + parcelPathInflowLayerEntr[i] = WeatherUtils.computeInflowLayerParcelPath(activeSounding.getPressureLevels(), + activeSounding.getHeight(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), + true); parcelPathDowndraft[i] = WeatherUtils.computeDcapeParcelPath(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint()); @@ -373,101 +376,101 @@ public SoundingFrame(String soundingSource, Sounding sounding0, DateTime time0, sbcape[i] = WeatherUtils.computeCape(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathSurfaceBased[i]); - ml50cape[i] = WeatherUtils.computeCape(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer50Mb[i]); - ml100cape[i] = WeatherUtils.computeCape(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer100Mb[i]); + mlcape[i] = WeatherUtils.computeCape(activeSounding.getPressureLevels(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer[i]); mucape[i] = WeatherUtils.computeCape(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMostUnstable[i]); + ilcape[i] = WeatherUtils.computeCape(activeSounding.getPressureLevels(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathInflowLayer[i]); sbcinh[i] = WeatherUtils.computeCinh(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathSurfaceBased[i]); - ml50cinh[i] = WeatherUtils.computeCinh(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer50Mb[i]); - ml100cinh[i] = WeatherUtils.computeCinh(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer100Mb[i]); + mlcinh[i] = WeatherUtils.computeCinh(activeSounding.getPressureLevels(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer[i]); mucinh[i] = WeatherUtils.computeCinh(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMostUnstable[i]); + ilcinh[i] = WeatherUtils.computeCinh(activeSounding.getPressureLevels(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathInflowLayer[i]); sbLcl[i] = WeatherUtils.liftedCondensationLevel(surfacePressure, parcelPathSurfaceBased[i]); - ml50Lcl[i] = WeatherUtils.liftedCondensationLevel(surfacePressure, parcelPathMixedLayer50Mb[i]); - ml100Lcl[i] = WeatherUtils.liftedCondensationLevel(surfacePressure, parcelPathMixedLayer100Mb[i]); + ilLcl[i] = WeatherUtils.liftedCondensationLevel(surfacePressure, parcelPathInflowLayer[i]); + mlLcl[i] = WeatherUtils.liftedCondensationLevel(surfacePressure, parcelPathMixedLayer[i]); muLcl[i] = WeatherUtils.liftedCondensationLevel(surfacePressure, parcelPathMostUnstable[i]); sbCcl[i] = WeatherUtils.convectiveCondensationLevel(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathSurfaceBased[i]); - ml50Ccl[i] = WeatherUtils.convectiveCondensationLevel(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer50Mb[i]); - ml100Ccl[i] = WeatherUtils.convectiveCondensationLevel(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer100Mb[i]); + ilCcl[i] = WeatherUtils.convectiveCondensationLevel(activeSounding.getPressureLevels(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathInflowLayer[i]); + mlCcl[i] = WeatherUtils.convectiveCondensationLevel(activeSounding.getPressureLevels(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer[i]); muCcl[i] = WeatherUtils.convectiveCondensationLevel(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMostUnstable[i]); sbLfc[i] = WeatherUtils.levelOfFreeConvection(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathSurfaceBased[i]); - ml50Lfc[i] = WeatherUtils.levelOfFreeConvection(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer50Mb[i]); - ml100Lfc[i] = WeatherUtils.levelOfFreeConvection(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer100Mb[i]); + mlLfc[i] = WeatherUtils.levelOfFreeConvection(activeSounding.getPressureLevels(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer[i]); muLfc[i] = WeatherUtils.levelOfFreeConvection(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMostUnstable[i]); + ilLfc[i] = WeatherUtils.levelOfFreeConvection(activeSounding.getPressureLevels(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathInflowLayer[i]); sbEl[i] = WeatherUtils.equilibriumLevel(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathSurfaceBased[i]); - ml50El[i] = WeatherUtils.equilibriumLevel(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer50Mb[i]); - ml100El[i] = WeatherUtils.equilibriumLevel(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer100Mb[i]); + ilEl[i] = WeatherUtils.equilibriumLevel(activeSounding.getPressureLevels(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathInflowLayer[i]); + mlEl[i] = WeatherUtils.equilibriumLevel(activeSounding.getPressureLevels(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer[i]); muEl[i] = WeatherUtils.equilibriumLevel(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMostUnstable[i]); sbecape[i] = WeatherUtils.computeCape(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathSurfaceBasedEntr[i]); - ml50ecape[i] = WeatherUtils.computeCape(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer50MbEntr[i]); - ml100ecape[i] = WeatherUtils.computeCape(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer100MbEntr[i]); + ilecape[i] = WeatherUtils.computeCape(activeSounding.getPressureLevels(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathInflowLayerEntr[i]); + mlecape[i] = WeatherUtils.computeCape(activeSounding.getPressureLevels(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayerEntr[i]); muecape[i] = WeatherUtils.computeCape(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMostUnstableEntr[i]); sbecinh[i] = WeatherUtils.computeCinh(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathSurfaceBasedEntr[i]); - ml50ecinh[i] = WeatherUtils.computeCinh(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer50MbEntr[i]); - ml100ecinh[i] = WeatherUtils.computeCinh(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer100MbEntr[i]); + ilecinh[i] = WeatherUtils.computeCinh(activeSounding.getPressureLevels(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathInflowLayerEntr[i]); + mlecinh[i] = WeatherUtils.computeCinh(activeSounding.getPressureLevels(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayerEntr[i]); muecinh[i] = WeatherUtils.computeCinh(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMostUnstableEntr[i]); sbELcl[i] = WeatherUtils.liftedCondensationLevel(surfacePressure, parcelPathSurfaceBasedEntr[i]); - ml50ELcl[i] = WeatherUtils.liftedCondensationLevel(surfacePressure, parcelPathMixedLayer50MbEntr[i]); - ml100ELcl[i] = WeatherUtils.liftedCondensationLevel(surfacePressure, parcelPathMixedLayer100MbEntr[i]); + ilELcl[i] = WeatherUtils.liftedCondensationLevel(surfacePressure, parcelPathInflowLayerEntr[i]); + mlELcl[i] = WeatherUtils.liftedCondensationLevel(surfacePressure, parcelPathMixedLayerEntr[i]); muELcl[i] = WeatherUtils.liftedCondensationLevel(surfacePressure, parcelPathMostUnstableEntr[i]); sbECcl[i] = WeatherUtils.convectiveCondensationLevel(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathSurfaceBasedEntr[i]); - ml50ECcl[i] = WeatherUtils.convectiveCondensationLevel(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer50MbEntr[i]); - ml100ECcl[i] = WeatherUtils.convectiveCondensationLevel(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer100MbEntr[i]); + ilECcl[i] = WeatherUtils.convectiveCondensationLevel(activeSounding.getPressureLevels(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathInflowLayerEntr[i]); + mlECcl[i] = WeatherUtils.convectiveCondensationLevel(activeSounding.getPressureLevels(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayerEntr[i]); muECcl[i] = WeatherUtils.convectiveCondensationLevel(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMostUnstableEntr[i]); sbELfc[i] = WeatherUtils.levelOfFreeConvection(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathSurfaceBasedEntr[i]); - ml50ELfc[i] = WeatherUtils.levelOfFreeConvection(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer50MbEntr[i]); - ml100ELfc[i] = WeatherUtils.levelOfFreeConvection(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer100MbEntr[i]); + ilELfc[i] = WeatherUtils.levelOfFreeConvection(activeSounding.getPressureLevels(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathInflowLayerEntr[i]); + mlELfc[i] = WeatherUtils.levelOfFreeConvection(activeSounding.getPressureLevels(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayerEntr[i]); muELfc[i] = WeatherUtils.levelOfFreeConvection(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMostUnstableEntr[i]); sbEEl[i] = WeatherUtils.equilibriumLevel(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathSurfaceBasedEntr[i]); - ml50EEl[i] = WeatherUtils.equilibriumLevel(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer50MbEntr[i]); - ml100EEl[i] = WeatherUtils.equilibriumLevel(activeSounding.getPressureLevels(), - activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayer100MbEntr[i]); + ilEEl[i] = WeatherUtils.equilibriumLevel(activeSounding.getPressureLevels(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathInflowLayerEntr[i]); + mlEEl[i] = WeatherUtils.equilibriumLevel(activeSounding.getPressureLevels(), + activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMixedLayerEntr[i]); muEEl[i] = WeatherUtils.equilibriumLevel(activeSounding.getPressureLevels(), activeSounding.getTemperature(), activeSounding.getDewpoint(), parcelPathMostUnstableEntr[i]); @@ -579,7 +582,7 @@ public SoundingFrame(String soundingSource, Sounding sounding0, DateTime time0, omega0_3[i] = WeatherUtils.averageParameterOverLayer(activeSounding.getHeight(), activeSounding.getWWind(), 0, 3000); omegaCap[i] = WeatherUtils.averageParameterOverLayer(activeSounding.getHeight(), - activeSounding.getWWind(), 0, ml100Lfc[i]); + activeSounding.getWWind(), 0, mlLfc[i]); omegaInflow[i] = WeatherUtils.averageParameterOverLayer(activeSounding.getHeight(), activeSounding.getWWind(), inflowLayer[i][0], inflowLayer[i][1]); @@ -826,6 +829,7 @@ private BufferedImage drawSkewT(double scale) { return drawSkewT(scale, pathType); } + private static final double SKEW_AMOUNT = 0.75; private BufferedImage drawSkewT(double scale, ParcelPath pathType) { BufferedImage skewT = new BufferedImage((int) (800 * scale), (int) (800 * scale), BufferedImage.TYPE_4BYTE_ABGR); @@ -897,8 +901,8 @@ private BufferedImage drawSkewT(double scale, ParcelPath pathType) { double y1D = linScale(Math.log(10000), Math.log(110000), 0, 800, Math.log(parcelPres)); double y2D = linScale(Math.log(10000), Math.log(110000), 0, 800, Math.log(parcelPresNew)); - double skew1 = linScale(0, 800, 400, 0, y1D); - double skew2 = linScale(0, 800, 400, 0, y2D); + double skew1 = linScale(0, 800, 800 * SKEW_AMOUNT, 0, y1D); + double skew2 = linScale(0, 800, 800 * SKEW_AMOUNT, 0, y2D); double x1D = linScale(223.15, 323.15, 0, 800, parcelTemp); double x2D = linScale(223.15, 323.15, 0, 800, parcelTempNew); @@ -931,8 +935,8 @@ private BufferedImage drawSkewT(double scale, ParcelPath pathType) { double y1D = linScale(Math.log(10000), Math.log(110000), 0, 800, Math.log(parcelPres)); double y2D = linScale(Math.log(10000), Math.log(110000), 0, 800, Math.log(parcelPresNew)); - double skew1 = linScale(0, 800, 400, 0, y1D); - double skew2 = linScale(0, 800, 400, 0, y2D); + double skew1 = linScale(0, 800, 800 * SKEW_AMOUNT, 0, y1D); + double skew2 = linScale(0, 800, 800 * SKEW_AMOUNT, 0, y2D); double x1D = linScale(223.15, 323.15, 0, 800, parcelTemp); double x2D = linScale(223.15, 323.15, 0, 800, parcelTempNew); @@ -955,9 +959,9 @@ private BufferedImage drawSkewT(double scale, ParcelPath pathType) { // temperature lines g.setColor(new Color(64, 64, 64)); - for (int i = -100; i < 50; i += 10) { + for (int i = -150; i < 50; i += 10) { int x = (int) linScale(-50, 50, 0, 800 * scale, i); - g.drawLine((int) (x + 400 * scale), 0, x, (int) (800 * scale)); + g.drawLine((int) (x + (800 * SKEW_AMOUNT) * scale), 0, x, (int) (800 * scale)); } if (parcelPathVisible) { @@ -979,8 +983,8 @@ private BufferedImage drawSkewT(double scale, ParcelPath pathType) { double y1 = linScale(Math.log(10000), Math.log(110000), 0, 800, Math.log(parcelPressure[i])); double y2 = linScale(Math.log(10000), Math.log(110000), 0, 800, Math.log(parcelPressure[i + 1])); - double skew1 = linScale(0, 800, 400, 0, y1); - double skew2 = linScale(0, 800, 400, 0, y2); + double skew1 = linScale(0, 800, 800 * SKEW_AMOUNT, 0, y1); + double skew2 = linScale(0, 800, 800 * SKEW_AMOUNT, 0, y2); double x1V = linScale(223.15, 323.15, 0, 800, parcelTemperature[i]); double x2V = linScale(223.15, 323.15, 0, 800, parcelTemperature[i + 1]); @@ -995,7 +999,7 @@ private BufferedImage drawSkewT(double scale, ParcelPath pathType) { g.setColor(new Color(127, 127, 255)); { int x = (int) linScale(-50, 50, 0, 800 * scale, 0); - g.drawLine((int) (x + 400 * scale), 0, x, (int) (800 * scale)); + g.drawLine((int) (x + (800 * SKEW_AMOUNT) * scale), 0, x, (int) (800 * scale)); } g.setStroke(thickStroke); @@ -1005,8 +1009,8 @@ private BufferedImage drawSkewT(double scale, ParcelPath pathType) { double y1 = linScale(Math.log(10000), Math.log(110000), 0, 800, Math.log(pressure[i])); double y2 = linScale(Math.log(10000), Math.log(110000), 0, 800, Math.log(pressure[i + 1])); - double skew1 = linScale(0, 800, 400, 0, y1); - double skew2 = linScale(0, 800, 400, 0, y2); + double skew1 = linScale(0, 800, 800 * SKEW_AMOUNT, 0, y1); + double skew2 = linScale(0, 800, 800 * SKEW_AMOUNT, 0, y2); if (drawDpt) { g.setStroke(thinStroke); @@ -1091,18 +1095,18 @@ private BufferedImage drawSkewT(double scale, ParcelPath pathType) { parcelPath = parcelPathSurfaceBased[activeReadoutSet]; parcelPathEntr = parcelPathSurfaceBasedEntr[activeReadoutSet]; break; - case MIXED_LAYER_50MB: - parcelPath = parcelPathMixedLayer50Mb[activeReadoutSet]; - parcelPathEntr = parcelPathMixedLayer50MbEntr[activeReadoutSet]; - break; case MIXED_LAYER_100MB: - parcelPath = parcelPathMixedLayer100Mb[activeReadoutSet]; - parcelPathEntr = parcelPathMixedLayer100MbEntr[activeReadoutSet]; + parcelPath = parcelPathMixedLayer[activeReadoutSet]; + parcelPathEntr = parcelPathMixedLayerEntr[activeReadoutSet]; break; case MOST_UNSTABLE: parcelPath = parcelPathMostUnstable[activeReadoutSet]; parcelPathEntr = parcelPathMostUnstableEntr[activeReadoutSet]; break; + case INFLOW_LAYER: + parcelPath = parcelPathInflowLayer[activeReadoutSet]; + parcelPathEntr = parcelPathInflowLayerEntr[activeReadoutSet]; + break; } // a little gross but gets the job done @@ -1123,8 +1127,8 @@ private BufferedImage drawSkewT(double scale, ParcelPath pathType) { double[] parcelDewpoint = new double[parcelPath.size()]; double[] parcelVirtualTemperature = new double[parcelPath.size()]; - System.out.println(parcelPath.size()); - System.out.println(parcelPathEntr.size()); +// System.out.println(parcelPath.size()); +// System.out.println(parcelPathEntr.size()); for (int i = 0; i < parcelPressureEntr.length; i++) { parcelPressureEntr[i] = parcelPathEntr.get(i).getPressure(); @@ -1146,56 +1150,58 @@ private BufferedImage drawSkewT(double scale, ParcelPath pathType) { double accumuLengthVirtTemp = 0.0; g.setStroke(thinStroke); - // for some reason min function required here - for (int i = 0; i < Integer.min(parcelPressureEntr.length - 1, parcelPressure.length - 1); i++) { + for (int i = 0; i < parcelPressureEntr.length - 1; i++) { double y1 = linScale(Math.log(10000), Math.log(110000), 0, 800, Math.log(parcelPressureEntr[i])); double y2 = linScale(Math.log(10000), Math.log(110000), 0, 800, Math.log(parcelPressureEntr[i + 1])); - double skew1 = linScale(0, 800, 400, 0, y1); - double skew2 = linScale(0, 800, 400, 0, y2); + double skew1 = linScale(0, 800, 800 * SKEW_AMOUNT, 0, y1); + double skew2 = linScale(0, 800, 800 * SKEW_AMOUNT, 0, y2); - { - double x1V = linScale(223.15, 323.15, 0, 800, parcelVirtualTemperatureEntr[i]); - double x2V = linScale(223.15, 323.15, 0, 800, parcelVirtualTemperatureEntr[i + 1]); - - double lengthVirtTempSegment = Math.hypot(((x1V + skew1) * scale) - ((x2V + skew2) * scale), - (y1 * scale) - (y2 * scale)); - accumuLengthVirtTempEntr += lengthVirtTempSegment; - - if (accumuLengthVirtTempEntr % 8 < 4) { - g.setColor(new Color(150, 96, 32)); - g.drawLine((int) ((x1V + skew1) * scale), (int) (y1 * scale), (int) ((x2V + skew2) * scale), - (int) (y2 * scale)); - } - - double x1T = linScale(223.15, 323.15, 0, 800, parcelTemperatureEntr[i]); - double x2T = linScale(223.15, 323.15, 0, 800, parcelTemperatureEntr[i + 1]); - + double x1V = linScale(223.15, 323.15, 0, 800, parcelVirtualTemperatureEntr[i]); + double x2V = linScale(223.15, 323.15, 0, 800, parcelVirtualTemperatureEntr[i + 1]); + + double lengthVirtTempSegment = Math.hypot(((x1V + skew1) * scale) - ((x2V + skew2) * scale), + (y1 * scale) - (y2 * scale)); + accumuLengthVirtTempEntr += lengthVirtTempSegment; + + if (accumuLengthVirtTempEntr % 8 < 4) { g.setColor(new Color(150, 96, 32)); - g.drawLine((int) ((x1T + skew1) * scale), (int) (y1 * scale), (int) ((x2T + skew2) * scale), + g.drawLine((int) ((x1V + skew1) * scale), (int) (y1 * scale), (int) ((x2V + skew2) * scale), (int) (y2 * scale)); } - - { - double x1V = linScale(223.15, 323.15, 0, 800, parcelVirtualTemperature[i]); - double x2V = linScale(223.15, 323.15, 0, 800, parcelVirtualTemperature[i + 1]); - double lengthVirtTempSegment = Math.hypot(((x1V + skew1) * scale) - ((x2V + skew2) * scale), - (y1 * scale) - (y2 * scale)); - accumuLengthVirtTemp += lengthVirtTempSegment; + double x1T = linScale(223.15, 323.15, 0, 800, parcelTemperatureEntr[i]); + double x2T = linScale(223.15, 323.15, 0, 800, parcelTemperatureEntr[i + 1]); - if (accumuLengthVirtTemp % 8 < 4) { - g.setColor(new Color(255, 255, 255)); - g.drawLine((int) ((x1V + skew1) * scale), (int) (y1 * scale), (int) ((x2V + skew2) * scale), - (int) (y2 * scale)); - } + g.setColor(new Color(150, 96, 32)); + g.drawLine((int) ((x1T + skew1) * scale), (int) (y1 * scale), (int) ((x2T + skew2) * scale), + (int) (y2 * scale)); + } + + for (int i = 0; i < parcelPressure.length - 1; i++) { + double y1 = linScale(Math.log(10000), Math.log(110000), 0, 800, Math.log(parcelPressure[i])); + double y2 = linScale(Math.log(10000), Math.log(110000), 0, 800, Math.log(parcelPressure[i + 1])); + double skew1 = linScale(0, 800, 800 * SKEW_AMOUNT, 0, y1); + double skew2 = linScale(0, 800, 800 * SKEW_AMOUNT, 0, y2); + + double x1V = linScale(223.15, 323.15, 0, 800, parcelVirtualTemperature[i]); + double x2V = linScale(223.15, 323.15, 0, 800, parcelVirtualTemperature[i + 1]); - double x1T = linScale(223.15, 323.15, 0, 800, parcelTemperature[i]); - double x2T = linScale(223.15, 323.15, 0, 800, parcelTemperature[i + 1]); + double lengthVirtTempSegment = Math.hypot(((x1V + skew1) * scale) - ((x2V + skew2) * scale), + (y1 * scale) - (y2 * scale)); + accumuLengthVirtTemp += lengthVirtTempSegment; + if (accumuLengthVirtTemp % 8 < 4) { g.setColor(new Color(255, 255, 255)); - g.drawLine((int) ((x1T + skew1) * scale), (int) (y1 * scale), (int) ((x2T + skew2) * scale), + g.drawLine((int) ((x1V + skew1) * scale), (int) (y1 * scale), (int) ((x2V + skew2) * scale), (int) (y2 * scale)); } + + double x1T = linScale(223.15, 323.15, 0, 800, parcelTemperature[i]); + double x2T = linScale(223.15, 323.15, 0, 800, parcelTemperature[i + 1]); + + g.setColor(new Color(255, 255, 255)); + g.drawLine((int) ((x1T + skew1) * scale), (int) (y1 * scale), (int) ((x2T + skew2) * scale), + (int) (y2 * scale)); } } @@ -1630,128 +1636,128 @@ private BufferedImage drawSevereReadouts(double scale) { // System.out.println("MU-LPL: " + muLpl[activeReadoutSet]); if(showEntrainment) { - g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "", "SB", "ML-50MB", "ML-100MB", "MU"), + g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "", "SB", "ML", "MU", "IL"), (int) (45 * scale), (int) (15 * scale)); g.drawString(String.format("%-9s%-9d%-9d%-9d%-9d", "ECAPE", (int) sbecape[activeReadoutSet], - (int) ml50ecape[activeReadoutSet], (int) ml100ecape[activeReadoutSet], - (int) muecape[activeReadoutSet]), (int) (45 * scale), (int) (30 * scale)); + (int) mlecape[activeReadoutSet], + (int) muecape[activeReadoutSet], (int) ilecape[activeReadoutSet]), (int) (45 * scale), (int) (30 * scale)); String sbcinh_ = (sbecape[activeReadoutSet] > 0) ? String.valueOf((int) sbecinh[activeReadoutSet]) : "-"; - String ml50cinh_ = (ml50ecape[activeReadoutSet] > 0) ? String.valueOf((int) ml50ecinh[activeReadoutSet]) + String ilcinh_ = (ilecape[activeReadoutSet] > 0 && inflowLayer[activeReadoutSet][0] > -999) ? String.valueOf((int) ilecinh[activeReadoutSet]) : "-"; - String ml100cinh_ = (ml100ecape[activeReadoutSet] > 0) ? String.valueOf((int) ml100ecinh[activeReadoutSet]) + String mlcinh_ = (mlecape[activeReadoutSet] > 0) ? String.valueOf((int) mlecinh[activeReadoutSet]) : "-"; String mucinh_ = (muecape[activeReadoutSet] > 0) ? String.valueOf((int) muecinh[activeReadoutSet]) : "-"; - g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "ECINH", sbcinh_, ml50cinh_, ml100cinh_, mucinh_), + g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "ECINH", sbcinh_, mlcinh_, mucinh_, ilcinh_), (int) (45 * scale), (int) (45 * scale)); String sbLcl_ = String.format("%5.2f", sbELcl[activeReadoutSet] / 1000.0); - String ml50Lcl_ = String.format("%5.2f", ml50ELcl[activeReadoutSet] / 1000.0); - String ml100Lcl_ = String.format("%5.2f", ml100ELcl[activeReadoutSet] / 1000.0); + String ilLcl_ = (inflowLayer[activeReadoutSet][0] > -999) ? String.format("%5.2f", (ilELcl[activeReadoutSet] + inflowLayer[activeReadoutSet][0]) / 1000.0) : "-"; + String mlLcl_ = String.format("%5.2f", mlELcl[activeReadoutSet] / 1000.0); String muLcl_ = String.format("%5.2f", (muELcl[activeReadoutSet] + muLpl[activeReadoutSet]) / 1000.0); - g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "LCL [km]", sbLcl_, ml50Lcl_, ml100Lcl_, muLcl_), + g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "LCL [km]", sbLcl_, mlLcl_, muLcl_, ilLcl_), (int) (45 * scale), (int) (60 * scale)); String sbCcl_ = String.format("%5.2f", sbECcl[activeReadoutSet] / 1000.0); - String ml50Ccl_ = String.format("%5.2f", ml50ECcl[activeReadoutSet] / 1000.0); - String ml100Ccl_ = String.format("%5.2f", ml100ECcl[activeReadoutSet] / 1000.0); + String ilCcl_ = (inflowLayer[activeReadoutSet][0] > -999) ? String.format("%5.2f", (ilECcl[activeReadoutSet] + inflowLayer[activeReadoutSet][0]) / 1000.0) : "-"; + String mlCcl_ = String.format("%5.2f", mlECcl[activeReadoutSet] / 1000.0); String muCcl_ = String.format("%5.2f", (muECcl[activeReadoutSet] + muLpl[activeReadoutSet]) / 1000.0); - g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "CCL [km]", sbCcl_, ml50Ccl_, ml100Ccl_, muCcl_), + g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "CCL [km]", sbCcl_, mlCcl_, muCcl_, ilCcl_), (int) (45 * scale), (int) (75 * scale)); String sbLfc_ = (sbecape[activeReadoutSet] > 0) ? String.format("%5.2f", sbELfc[activeReadoutSet] / 1000.0) : "-"; - String ml50Lfc_ = (ml50ecape[activeReadoutSet] > 0) - ? String.format("%5.2f", ml50ELfc[activeReadoutSet] / 1000.0) + String ilLfc_ = (ilecape[activeReadoutSet] > 0) + ? String.format("%5.2f", (ilELfc[activeReadoutSet] + inflowLayer[activeReadoutSet][0]) / 1000.0) : "-"; - String ml100Lfc_ = (ml100ecape[activeReadoutSet] > 0) - ? String.format("%5.2f", ml100ELfc[activeReadoutSet] / 1000.0) + String mlLfc_ = (mlecape[activeReadoutSet] > 0) + ? String.format("%5.2f", mlELfc[activeReadoutSet] / 1000.0) : "-"; String muLfc_ = (muecape[activeReadoutSet] > 0) ? String.format("%5.2f", (muELfc[activeReadoutSet] + muLpl[activeReadoutSet]) / 1000.0) : "-"; - g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "LFC [km]", sbLfc_, ml50Lfc_, ml100Lfc_, muLfc_), + g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "LFC [km]", sbLfc_, mlLfc_, muLfc_, ilLfc_), (int) (45 * scale), (int) (90 * scale)); String sbEl_ = (sbecape[activeReadoutSet] > 0) ? String.format("%5.2f", sbEEl[activeReadoutSet] / 1000.0) : "-"; - String ml50El_ = (ml50ecape[activeReadoutSet] > 0) - ? String.format("%5.2f", ml50EEl[activeReadoutSet] / 1000.0) + String ilEl_ = (ilecape[activeReadoutSet] > 0) + ? String.format("%5.2f", (ilEEl[activeReadoutSet] + inflowLayer[activeReadoutSet][0]) / 1000.0) : "-"; - String ml100El_ = (ml100ecape[activeReadoutSet] > 0) - ? String.format("%5.2f", ml100EEl[activeReadoutSet] / 1000.0) + String mlEl_ = (mlecape[activeReadoutSet] > 0) + ? String.format("%5.2f", mlEEl[activeReadoutSet] / 1000.0) : "-"; String muEl_ = (muecape[activeReadoutSet] > 0) ? String.format("%5.2f", (muEEl[activeReadoutSet] + muLpl[activeReadoutSet]) / 1000.0) : "-"; - g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "EL [km]", sbEl_, ml50El_, ml100El_, muEl_), + g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "EL [km]", sbEl_, mlEl_, muEl_, ilEl_), (int) (45 * scale), (int) (105 * scale)); } else { - g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "", "SB", "ML-50MB", "ML-100MB", "MU"), + g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "", "SB", "ML", "MU", "IL"), (int) (45 * scale), (int) (15 * scale)); g.drawString(String.format("%-9s%-9d%-9d%-9d%-9d", "CAPE", (int) sbcape[activeReadoutSet], - (int) ml50cape[activeReadoutSet], (int) ml100cape[activeReadoutSet], - (int) mucape[activeReadoutSet]), (int) (45 * scale), (int) (30 * scale)); + (int) mlcape[activeReadoutSet], + (int) mucape[activeReadoutSet], (int) ilcape[activeReadoutSet]), (int) (45 * scale), (int) (30 * scale)); String sbcinh_ = (sbcape[activeReadoutSet] > 0) ? String.valueOf((int) sbcinh[activeReadoutSet]) : "-"; - String ml50cinh_ = (ml50cape[activeReadoutSet] > 0) ? String.valueOf((int) ml50cinh[activeReadoutSet]) + String ilcinh_ = (ilcape[activeReadoutSet] > 0 && inflowLayer[activeReadoutSet][0] > -999) ? String.valueOf((int) ilcinh[activeReadoutSet]) : "-"; - String ml100cinh_ = (ml100cape[activeReadoutSet] > 0) ? String.valueOf((int) ml100cinh[activeReadoutSet]) + String mlcinh_ = (mlcape[activeReadoutSet] > 0) ? String.valueOf((int) mlcinh[activeReadoutSet]) : "-"; String mucinh_ = (mucape[activeReadoutSet] > 0) ? String.valueOf((int) mucinh[activeReadoutSet]) : "-"; - g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "CINH", sbcinh_, ml50cinh_, ml100cinh_, mucinh_), + g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "CINH", sbcinh_, mlcinh_, mucinh_, ilcinh_), (int) (45 * scale), (int) (45 * scale)); String sbLcl_ = String.format("%5.2f", sbLcl[activeReadoutSet] / 1000.0); - String ml50Lcl_ = String.format("%5.2f", ml50Lcl[activeReadoutSet] / 1000.0); - String ml100Lcl_ = String.format("%5.2f", ml100Lcl[activeReadoutSet] / 1000.0); + String ilLcl_ = (inflowLayer[activeReadoutSet][0] > -999) ? String.format("%5.2f", (ilLcl[activeReadoutSet] + inflowLayer[activeReadoutSet][0]) / 1000.0) : "-"; + String mlLcl_ = String.format("%5.2f", mlLcl[activeReadoutSet] / 1000.0); String muLcl_ = String.format("%5.2f", (muLcl[activeReadoutSet] + muLpl[activeReadoutSet]) / 1000.0); - g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "LCL [km]", sbLcl_, ml50Lcl_, ml100Lcl_, muLcl_), + g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "LCL [km]", sbLcl_, mlLcl_, muLcl_, ilLcl_), (int) (45 * scale), (int) (60 * scale)); String sbCcl_ = String.format("%5.2f", sbCcl[activeReadoutSet] / 1000.0); - String ml50Ccl_ = String.format("%5.2f", ml50Ccl[activeReadoutSet] / 1000.0); - String ml100Ccl_ = String.format("%5.2f", ml100Ccl[activeReadoutSet] / 1000.0); + String ilCcl_ = (inflowLayer[activeReadoutSet][0] > -999) ? String.format("%5.2f", (ilCcl[activeReadoutSet] + inflowLayer[activeReadoutSet][0]) / 1000.0) : "-"; + String mlCcl_ = String.format("%5.2f", mlCcl[activeReadoutSet] / 1000.0); String muCcl_ = String.format("%5.2f", (muCcl[activeReadoutSet] + muLpl[activeReadoutSet]) / 1000.0); - g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "CCL [km]", sbCcl_, ml50Ccl_, ml100Ccl_, muCcl_), + g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "CCL [km]", sbCcl_, mlCcl_, muCcl_, ilCcl_), (int) (45 * scale), (int) (75 * scale)); String sbLfc_ = (sbcape[activeReadoutSet] > 0) ? String.format("%5.2f", sbLfc[activeReadoutSet] / 1000.0) : "-"; - String ml50Lfc_ = (ml50cape[activeReadoutSet] > 0) - ? String.format("%5.2f", ml50Lfc[activeReadoutSet] / 1000.0) + String ilLfc_ = (ilcape[activeReadoutSet] > 0) + ? String.format("%5.2f", (ilLfc[activeReadoutSet] + inflowLayer[activeReadoutSet][0]) / 1000.0) : "-"; - String ml100Lfc_ = (ml100cape[activeReadoutSet] > 0) - ? String.format("%5.2f", ml100Lfc[activeReadoutSet] / 1000.0) + String mlLfc_ = (mlcape[activeReadoutSet] > 0) + ? String.format("%5.2f", mlLfc[activeReadoutSet] / 1000.0) : "-"; String muLfc_ = (mucape[activeReadoutSet] > 0) ? String.format("%5.2f", (muLfc[activeReadoutSet] + muLpl[activeReadoutSet]) / 1000.0) : "-"; - g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "LFC [km]", sbLfc_, ml50Lfc_, ml100Lfc_, muLfc_), + g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "LFC [km]", sbLfc_, mlLfc_, muLfc_, ilLfc_), (int) (45 * scale), (int) (90 * scale)); String sbEl_ = (sbcape[activeReadoutSet] > 0) ? String.format("%5.2f", sbEl[activeReadoutSet] / 1000.0) : "-"; - String ml50El_ = (ml50cape[activeReadoutSet] > 0) - ? String.format("%5.2f", ml50El[activeReadoutSet] / 1000.0) + String ilEl_ = (ilcape[activeReadoutSet] > 0) + ? String.format("%5.2f", (ilEl[activeReadoutSet] + inflowLayer[activeReadoutSet][0]) / 1000.0) : "-"; - String ml100El_ = (ml100cape[activeReadoutSet] > 0) - ? String.format("%5.2f", ml100El[activeReadoutSet] / 1000.0) + String mlEl_ = (mlcape[activeReadoutSet] > 0) + ? String.format("%5.2f", mlEl[activeReadoutSet] / 1000.0) : "-"; String muEl_ = (mucape[activeReadoutSet] > 0) ? String.format("%5.2f", (muEl[activeReadoutSet] + muLpl[activeReadoutSet]) / 1000.0) : "-"; - g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "EL [km]", sbEl_, ml50El_, ml100El_, muEl_), + g.drawString(String.format("%-9s%-9s%-9s%-9s%-9s", "EL [km]", sbEl_, mlEl_, muEl_, ilEl_), (int) (45 * scale), (int) (105 * scale)); } @@ -1894,7 +1900,7 @@ private BufferedImage drawSevereReadouts(double scale) { g.drawString(String.format("%-9s%-9s", "0-3 km", omega0_3_), (int) (245 * scale), (int) (330 * scale)); - String omegaCap_ = (activeSounding.getWWind().length > 0 && ml100cape[activeReadoutSet] > 0) + String omegaCap_ = (activeSounding.getWWind().length > 0 && mlcape[activeReadoutSet] > 0) ? String.format("%4.2f", omegaCap[activeReadoutSet]) : "-"; @@ -1983,8 +1989,8 @@ private BufferedImage drawWinterReadouts(double scale) { // System.out.println(bgRevised); // System.out.println(bgRevExt); -// g.setColor(new Color(192, 192, 192)); -// g.setFont(new Font(Font.MONOSPACED, Font.BOLD, (int) (9 * scale))); + g.setColor(new Color(192, 192, 192)); + g.setFont(new Font(Font.MONOSPACED, Font.BOLD, (int) (9 * scale))); // double surfacePressure = activeSounding.getPressureLevels()[activeSounding.getPressureLevels().length - 1]; // double surfaceHeight = activeSounding.getHeight()[activeSounding.getHeight().length - 1]; // double meltingEnergy = PtypeAlgorithms.meltingEnergy(activeSounding.getPressureLevels(), @@ -2585,8 +2591,8 @@ public void keyReleased(KeyEvent e) { } } - private static final String[] parcelPathOptions = { "None", "Surface Based", "Mixed Layer (50 mb)", - "Mixed Layer (100 mb)", "Most Unstable" }; + private static final String[] parcelPathOptions = { "None", "Surface Based", "Mixed Layer", + "Most Unstable", "Inflow Layer" }; private void selectParcelPathType() { String fieldChoice = (String) JOptionPane.showInputDialog(null, "What type of parcel path would you like?", @@ -2826,20 +2832,20 @@ private HazType determineHazType() { 3000, 12000); double mw3_12 = Math.hypot(mw3_12Vec[0], mw3_12Vec[1]); - double wndg_mlcapeTerm = ml100cape[activeReadoutSet] / 2000; + double wndg_mlcapeTerm = mlcape[activeReadoutSet] / 2000; double wndg_lr0_3Term = lapseRate0_3km / 0.009; double wndg_mwTerm = mw1000_3500 / 15; - double wndg_mlcinhTerm = (50 + ml100cinh[activeReadoutSet]) / 40; + double wndg_mlcinhTerm = (50 + mlcinh[activeReadoutSet]) / 40; double lowRH = WeatherUtils.averageParameterOverLayer(height, relativeHumidity, 0, 3000); double midRH = WeatherUtils.averageParameterOverLayer(height, relativeHumidity, 3000, 8000); if (lapseRate0_3km < 0.007) wndg_lr0_3Term = 0; - if (ml100cinh[activeReadoutSet] < -50) + if (mlcinh[activeReadoutSet] < -50) wndg_mlcinhTerm = 0; - double sigSvr = ml100cape[activeReadoutSet] * bwd0_6; + double sigSvr = mlcape[activeReadoutSet] * bwd0_6; double mmp = 0; if (mucape[activeReadoutSet] >= 100) { @@ -2857,14 +2863,14 @@ private HazType determineHazType() { if (stpE[activeReadoutSet] >= 3 && stpF[activeReadoutSet] >= 3 && srh0_1[activeReadoutSet] >= 200 && srhInflow[activeReadoutSet] >= 200 && srw4_6 >= 15 * 0.5144444 && bwd0_8 >= 45 * 0.5144444 - && sbLcl[activeReadoutSet] < 1000 && ml100Lcl[activeReadoutSet] < 1200 && lapseRate0_1km >= 0.005 - && ml100cinh[activeReadoutSet] >= -50 && inflowLayer[activeReadoutSet][0] >= 0) { + && sbLcl[activeReadoutSet] < 1000 && mlLcl[activeReadoutSet] < 1200 && lapseRate0_1km >= 0.005 + && mlcinh[activeReadoutSet] >= -50 && inflowLayer[activeReadoutSet][0] >= 0) { if (Math.abs(devtor[activeReadoutSet]) >= 0.5) { return PDS_DEV_TOR; } else { return PDS_TOR; } - } else if ((stpE[activeReadoutSet] >= 3 || stpF[activeReadoutSet] >= 4) && ml100cinh[activeReadoutSet] >= -125 + } else if ((stpE[activeReadoutSet] >= 3 || stpF[activeReadoutSet] >= 4) && mlcinh[activeReadoutSet] >= -125 && inflowLayer[activeReadoutSet][0] >= 0) { if (Math.abs(devtor[activeReadoutSet]) >= 0.5) { return DEV_TOR; @@ -2872,7 +2878,7 @@ private HazType determineHazType() { return TOR; } } else if ((stpE[activeReadoutSet] >= 1 || stpF[activeReadoutSet] >= 1) - && (srw4_6 >= 15 * 0.5144444 || bwd0_8 >= 40 * 0.5144444) && ml100cinh[activeReadoutSet] >= -50 + && (srw4_6 >= 15 * 0.5144444 || bwd0_8 >= 40 * 0.5144444) && mlcinh[activeReadoutSet] >= -50 && inflowLayer[activeReadoutSet][0] >= 0) { if (Math.abs(devtor[activeReadoutSet]) >= 0.5) { return DEV_TOR; @@ -2880,19 +2886,19 @@ private HazType determineHazType() { return TOR; } } else if ((stpE[activeReadoutSet] >= 1 || stpF[activeReadoutSet] >= 1) && (lowRH + midRH) / 2 >= 0.6 - && lapseRate0_1km >= 0.005 && ml100cinh[activeReadoutSet] >= -50 + && lapseRate0_1km >= 0.005 && mlcinh[activeReadoutSet] >= -50 && inflowLayer[activeReadoutSet][0] >= 0) { if (Math.abs(devtor[activeReadoutSet]) >= 0.5) { return DEV_TOR; } else { return TOR; } - } else if ((stpE[activeReadoutSet] >= 1 || stpF[activeReadoutSet] >= 1) && ml100cinh[activeReadoutSet] >= -150 + } else if ((stpE[activeReadoutSet] >= 1 || stpF[activeReadoutSet] >= 1) && mlcinh[activeReadoutSet] >= -150 && inflowLayer[activeReadoutSet][0] >= 0) { return MRGL_TOR; } else if ((stpE[activeReadoutSet] >= 1 && srhInflow[activeReadoutSet] >= 150) || (stpF[activeReadoutSet] >= 0.5 && srh0_1[activeReadoutSet] >= 150) - && ml100cinh[activeReadoutSet] >= -50 && inflowLayer[activeReadoutSet][0] >= 0) { + && mlcinh[activeReadoutSet] >= -50 && inflowLayer[activeReadoutSet][0] >= 0) { return MRGL_TOR; } else if ((stpF[activeReadoutSet] >= 1 || mesocycloneSign * scp[activeReadoutSet] >= 4 || stpE[activeReadoutSet] >= 1) && mucinh[activeReadoutSet] >= -50) { diff --git a/src/com/ameliaWx/soundingViewer/test/SoundingTest.java b/src/com/ameliaWx/soundingViewer/test/SoundingTest.java index d4a2089..0e1d278 100644 --- a/src/com/ameliaWx/soundingViewer/test/SoundingTest.java +++ b/src/com/ameliaWx/soundingViewer/test/SoundingTest.java @@ -77,13 +77,9 @@ public static void main(String[] args) throws FileNotFoundException { // System.out.printf("%6.1f\t%5.0f\t%5.1f\t%5.1f\t%4.1f\t%4.1f\n", pressure[i], height[i], temperature[i], dewpoint[i], uWind[i], vWind[i]); } - - for(int i = 0; i < lines.size(); i++) { - height[i] = WeatherUtils.heightAtPressure(pressure[pressure.length - 1], pressure[i]); - } Sounding soundingObj = new Sounding(pressure, temperature, dewpoint, height, uWind, vWind); - DateTime time = new DateTime(2023, 02, 27, 3, 0, DateTimeZone.UTC); + DateTime time = new DateTime(2023, 2, 27, 3, 0, DateTimeZone.UTC); new SoundingFrame("Norman OK Weather Balloon", soundingObj, time, 35.1808, -97.4378); } diff --git a/src/com/ameliaWx/soundingViewer/test/soundingData_2020102700-OUN.txt b/src/com/ameliaWx/soundingViewer/test/soundingData_2020102700-OUN.txt new file mode 100644 index 0000000..1ca571e --- /dev/null +++ b/src/com/ameliaWx/soundingViewer/test/soundingData_2020102700-OUN.txt @@ -0,0 +1,175 @@ +#USM00072357 2020 10 27 00 2309 218 ncdc-nws ncdc-gts 351808 -974378 +21 0 98274B 345 -6B 970 4 10 31 +20 49 95077 609B -31B 935 9 10 104 +20 100 94393 665B -35B 940 8 10 119 +10 131 92500 825B -45B 953 6 25 127 +20 147 91461 914B -50B 952 6 32 134 +20 155 90986 955B -51B 955 6 35 138 +20 200 90745 976B -47B 958 6 37 141 +20 214 89981 1042B -42B 955 6 40 129 +20 231 89096 1121B -14B 926 10 44 115 +20 251 88006 1219B -6B 939 9 50 99 +20 300 87564 1259B -3B 941 8 53 92 +20 302 87447 1270B 0B 938 9 54 91 +20 308 87126 1299B 4B 933 9 57 84 +10 349 85000 1498B 10B 953 7 96 55 +20 355 84726 1524B 9B 957 6 104 54 +20 400 84466 1549B 8B 962 5 111 54 +20 453 81598 1828B 28B 961 6 170 31 +20 500 81239 1864B 31B 960 6 181 32 +20 551 78594 2133B 46B 949 7 224 79 +20 600 78024 2192B 48B 956 6 226 89 +20 632 76426 2362B 54B 961 6 231 159 +20 647 75720 2438B 71B 945 8 232 193 +20 659 75085 2507B 77B 946 8 233 218 +20 700 75023 2514B 77B 947 8 233 220 +20 745 72971 2743B 65B 983 3 234 223 +20 800 72297 2819B 61B 988 2 235 225 +20 808 71915 2863B 56B 994 1 234 224 +10 855 70000 3083B 40B 992 1 230 218 +20 900 69805 3106B 38B 984 2 230 217 +20 1000 67198 3415B 18B 950 7 228 212 +20 1046 65200 3658B 4B 929 10 227 225 +20 1057 64709 3719B 0B 915 12 227 228 +20 1100 64605 3732B 0B 918 12 227 229 +20 1200 62154 4041B -19B 934 9 225 234 +20 1213 61488 4126B -24B 932 9 225 231 +20 1237 60405 4267B -38B 874 18 224 226 +20 1300 59483 4388B -51B 839 23 224 221 +20 1319 58718 4490B -58B 827 25 226 228 +20 1400 57009 4720B -84B 611 62 230 246 +20 1408 56707 4761B -85B 571 70 231 254 +20 1431 55868 4877B -74B 848 21 232 277 +20 1437 55615 4912B -72B 855 20 233 283 +20 1500 54708 5040B -83B 784 31 234 307 +20 1541 53315 5240B -101B 674 49 235 318 +20 1600 52576 5347B -109B 696 45 236 323 +20 1640 50897 5596B -129B 721 40 238 305 +20 1700 50109 5714B -141B 200 181 239 296 +10 1703 50000 5731B -142B 202 180 239 293 +20 1715 49481 5810B -144B 144 214 237 278 +20 1800 47777 6075B -154B 110 239 229 226 +20 1803 47646 6096B -155B 106 242 229 226 +20 1900 45662 6415B -176B 82 262 226 236 +20 2000 43513 6775B -193B 71 272 226 282 +20 2045 41863 7061B -214B 48 301 231 296 +20 2100 41341 7153B -221B 58 283 232 301 +20 2129 40383 7325B -236B 58 280 235 309 +20 2133 40242 7351B -234B 51 291 235 310 +10 2141 40000 7395B -240B 65 269 236 312 +20 2200 39370 7510B -249B 65 266 238 318 +20 2220 38781 7620B -257B 68 260 237 326 +20 2300 37531 7857B -268B 53 279 236 344 +20 2323 36728 8012B -280B 39 301 236 356 +20 2400 35681 8219B -298B 54 271 236 376 +20 2500 33943 8573B -315B 60 259 234 452 +20 2600 32230 8938B -343B 102 209 234 452 +20 2634 31290 9144B -362B 126 188 236 450 +20 2700 30600 9298B -373B 172 160 238 449 +10 2721 30000 9435B -382B 188 152 238 452 +20 2747 29347 9586B -392B 199 146 239 457 +20 2800 29018 9663B -397B 191 148 239 460 +20 2900 27534 10020B -422B 128 177 241 475 +20 3000 26026 10398B -445B 102 190 237 537 +10 3041 25000 10667B -464B 86 198 237 553 +20 3042 24995 10668B -464B 86 198 237 554 +20 3100 24618 10769B -473B 92 191 237 561 +20 3132 23900 10964B -490B 100 182 238 568 +20 3200 23260 11141B -499B 109 174 238 575 +20 3300 22054 11487B -524B 106 171 238 610 +20 3400 20950 11819B -533B 161 141 238 663 +10 3459 20000 12116B -556B 150 142 238 688 +20 3500 19974 12124B -556B 152 141 238 689 +20 3553 19228 12366B -574B 218 113 240 671 +20 3600 19121 12401B -575B 217 113 240 669 +20 3700 18266 12689B -583B 156 134 241 658 +20 3800 17270 13041B -597B 110 152 238 657 +20 3900 16429 13351B -619B 90 158 238 643 +20 3957 15668 13643B -640B 97 148 241 649 +20 4000 15630 13658B -640B 100 147 241 650 +10 4047 15000 13910B -644B 109 141 244 611 +20 4100 14789 13996B -646B 102 144 245 601 +20 4200 13944 14355B -638B 93 151 246 481 +20 4300 13262 14662B -637B 80 159 244 430 +20 4326 12977 14796B -637B 73 163 242 423 +20 4400 12553 14998B -649B 67 163 239 416 +20 4444 12065 15240B -669B 74 151 240 422 +20 4500 11898 15323B -676B 70 151 240 425 +20 4524 11659 15446B -678B 74 147 242 420 +20 4553 11281 15645B -654B 64 164 245 416 +20 4600 11211 15682B -656B 66 162 246 415 +20 4700 10620 16010B -673B 71 151 246 394 +20 4800 10097 16313B -695B 81 137 245 370 +10 4813 10000 16371B -690B 77 141 246 369 +20 4900 9604 16611B -698B 78 137 248 364 +20 4926 9380 16752B -703B 81 133 253 324 +20 5000 8963 17025B -668B 63 158 262 276 +20 5011 8862 17094B -658B 63 162 263 260 +20 5100 8492 17351B -676B 78 146 270 190 +20 5200 8075 17654B -689B 79 140 260 158 +20 5300 7661 17967B -705B 80 132 259 201 +20 5320 7519 18079B -708B 78 132 255 180 +20 5354 7259 18288B -694B 65 145 245 147 +20 5400 7218 18321B -694B 66 145 243 142 +10 5436 7000 18504B -705B 80 132 234 151 +20 5500 6854 18628B -712B 83 128 228 159 +20 5513 6784 18689B -715B 83 127 234 156 +20 5600 6533 18914B -677B 63 154 256 160 +20 5632 6343 19094B -646B 54 174 251 133 +20 5700 6171 19261B -656B 60 165 244 111 +20 5800 5848 19588B -648B 65 165 221 131 +20 5900 5571 19884B -650B 66 164 237 148 +20 6000 5318 20167B -653B 66 162 244 134 +20 6100 5053 20478B -655B 64 164 252 157 +10 6112 5000 20543B -656B 65 162 255 153 +20 6120 4964 20587B -656B 65 162 258 150 +20 6200 4789 20805B -640B 54 176 271 142 +20 6300 4558 21109B -621B 48 190 282 124 +20 6346 4394 21336B -606B 50 193 247 94 +20 6355 4364 21380B -600B 51 195 238 94 +20 6400 4347 21403B -601B 52 193 233 95 +20 6500 4122 21734B -603B 61 184 239 132 +20 6600 3897 22084B -592B 53 195 260 145 +20 6700 3707 22398B -585B 47 204 257 95 +20 6800 3531 22703B -569B 47 209 237 133 +20 6900 3354 23030B -560B 56 202 231 145 +20 7000 3176 23376B -556B 56 204 252 165 +20 7100 3004 23731B -553B 63 197 242 155 +10 7101 3000 23740B -553B 64 197 243 156 +20 7200 2845 24077B -549B 52 210 267 206 +20 7246 2729 24345B -552B 49 213 268 194 +20 7300 2694 24426B -537B 50 216 268 190 +20 7400 2555 24767B -525B 56 212 251 194 +20 7500 2423 25111B -504B 53 221 250 243 +20 7521 2368 25263B -495B 45 234 247 252 +20 7600 2279 25512B -512B 49 224 242 270 +20 7700 2153 25881B -518B 43 231 245 264 +20 7800 2034 26247B -523B 54 214 253 236 +10 7818 2000 26359B -519B 57 213 252 246 +20 7900 1917 26631B -512B 58 213 249 269 +20 8000 1801 27036B -523B 62 206 255 275 +20 8031 1741 27257B -533B 64 202 256 275 +20 8056 1694 27432B -521B 61 208 257 275 +20 8100 1688 27455B -521B 60 209 257 275 +20 8200 1588 27851B -517B 59 210 259 286 +20 8219 1559 27970B -523B 57 211 258 283 +20 8300 1505 28202B -503B 47 229 256 277 +20 8355 1433 28525B -457B 51 236 258 279 +20 8400 1426 28555B -457B 51 236 258 280 +20 8500 1351 28915B -468B 56 227 257 274 +20 8600 1275 29296B -486B 59 219 257 268 +20 8700 1208 29652B -509B 58 214 258 293 +20 8710 1197 29713B -511B 57 215 258 297 +20 8800 1144 30008B -502B 53 222 257 317 +20 8847 1093 30306B -475B 44 242 255 315 +20 8900 1079 30389B -480B 47 236 254 314 +20 8914 1065 30480B -479B 49 233 252 315 +20 9000 1017 30778B -486B 49 232 247 318 +10 9018 1000 30892B -485B 48 232 248 327 +20 9100 960 31158B -486B 50 230 250 348 +20 9151 917 31463B -484B 52 227 256 359 +20 9200 909 31515B -477B 53 229 257 361 +20 9300 861 31881B -426B 66 226 263 385 +20 9312 851 31958B -415B 67 227 264 384 +20 9400 811 32284B -418B 60 234 270 383 +20 9500 770 32636B -433B 63 227 258 387 \ No newline at end of file diff --git a/src/com/ameliaWx/soundingViewer/test/soundingData_2023013012-OUN.txt b/src/com/ameliaWx/soundingViewer/test/soundingData_2023013012-OUN.txt new file mode 100644 index 0000000..af456f9 --- /dev/null +++ b/src/com/ameliaWx/soundingViewer/test/soundingData_2023013012-OUN.txt @@ -0,0 +1,97 @@ +#USM00072363 2023 01 30 12 1104 144 ncdc-nws ncdc-gts 352331 -1017092 +21 0 89740B 1095 -131B 860 16 26 47 +20 7 89282B 1134B -141B 713 36 14 68 +20 20 88540 1196B -148B 759 30 11 73 +20 45 86964 1332B -160B 823 21 6 70 +20 100 86051 1412B -165B 837 19 7 71 +10 117 85000 1504B -146B 894 12 13 86 +20 205 82407 1741B -113B 912 10 349 81 +20 216 81782 1800B -89B 935 8 324 69 +20 306 79119 2060B -7B 937 9 237 165 +20 314 78743 2098B 18B 952 7 232 192 +20 325 78186 2155B 28B 923 11 226 234 +20 436 74693 2525B 30B 271 170 237 241 +20 446 74224 2576B 27B 255 177 238 244 +20 604 70754 2961B 0B 340 139 232 263 +20 606 70630 2975B -1B 343 138 232 263 +10 620 70000 3047B -6B 316 147 233 261 +20 741 66201 3490B -28B 70 309 241 293 +20 822 64438 3704B -49B 266 162 240 299 +20 947 60467 4200B -81B 66 301 234 303 +20 1329 51820 5374B -176B 34 314 240 332 +10 1421 50000 5641B -187B 49 282 244 324 +20 1745 44376 6517B -254B 80 228 251 344 +20 1825 43399 6678B -266B 122 192 249 332 +20 1945 41348 7026B -288B 65 239 249 316 +10 2038 40000 7262B -308B 92 208 249 324 +10 2837 30000 9253B -425B 32 263 243 412 +22 3152 26292 10131B -483B 60 210 245 441 +10 3311 25000 10464B -470B 16 299 244 497 +20 3326 24777 10524B -469B 11 323 245 503 +20 3425 23805 10789B -474B 10 323 243 548 +20 3525 22862 11055B -479B 10 322 244 508 +20 3645 21476 11465B -500B 10 317 239 561 +20 3805 20313 11828B -504B 10 317 244 533 +10 3828 20000 11930B -502B 10 317 243 524 +20 3905 19519 12088B -507B 10 314 243 506 +20 4305 16667 13111B -540B 11 305 243 594 +20 4329 16397 13216B -542B 10 306 242 571 +20 4345 16218 13286B -541B 10 306 241 561 +10 4536 15000 13784B -565B 11 299 242 660 +20 4545 14897 13827B -566B 11 299 243 664 +20 4905 12841 14765B -592B 11 291 243 494 +20 4945 12477 14944B -599B 11 290 239 528 +20 5225 10972 15738B -644B 11 277 242 440 +20 5345 10280 16136B -651B 11 275 244 471 +10 5420 10000 16304B -658B 11 273 247 433 +22 5427 9949 16335B -659B 11 272 247 424 +20 5440 9842 16400B -660B 11 274 246 397 +20 5505 9646 16523B -657B 10 276 242 407 +20 5628 9002 16945B -628B 10 284 247 308 +20 6045 7215 18293B -676B 12 266 268 168 +10 6121 7000 18474B -682B 11 265 262 168 +20 6122 6990 18483B -683B 11 265 261 166 +20 6225 6625 18805B -662B 10 279 228 142 +20 6242 6530 18894B -647B 9 284 239 118 +20 6325 6303 19111B -618B 10 289 287 23 +20 6345 6201 19212B -619B 10 286 203 7 +20 6405 6099 19314B -623B 11 283 162 34 +20 6445 5898 19521B -624B 11 283 171 91 +20 6625 5422 20041B -610B 10 289 238 83 +10 6800 5000 20546B -601B 11 289 200 43 +20 6825 4895 20677B -603B 11 289 198 37 +20 6905 4731 20890B -599B 10 291 326 11 +20 6925 4652 20996B -598B 11 289 121 18 +20 6926 4647 21002B -598B 11 289 122 18 +20 7025 4417 21318B -608B 11 285 174 10 +20 7033 4384 21365B -609B 11 284 56 17 +20 7045 4337 21431B -608B 11 285 28 27 +20 7145 4117 21756B -601B 10 290 71 37 +20 7225 3975 21975B -595B 10 292 35 44 +20 7305 3838 22194B -587B 10 296 68 85 +20 7345 3710 22407B -581B 10 296 48 90 +20 7405 3644 22520B -580B 11 295 58 191 +20 7445 3518 22743B -579B 11 295 39 14 +20 7503 3465 22839B -578B 11 295 50 78 +20 7623 3233 23273B -591B 11 290 63 94 +10 7747 3000 23744B -575B 10 298 68 136 +20 7945 2700 24411B -562B 10 300 84 164 +20 8145 2432 25079B -548B 11 303 69 130 +20 8245 2299 25438B -552B 11 301 68 194 +20 8345 2170 25805B -547B 10 304 74 161 +10 8513 2000 26328B -543B 11 304 84 211 +20 8605 1905 26640B -540B 11 305 86 219 +20 8905 1603 27749B -511B 10 318 70 284 +20 9345 1237 29442B -497B 10 318 77 331 +20 9625 1061 30454B -463B 10 330 105 271 +10 9732 1000 30846B -465B 10 328 101 273 +20 9805 971 31042B -461B 10 329 96 256 +20 9928 900 31545B -450B 10 332 82 311 +20 10025 852 31909B -456B 11 327 87 320 +20 10129 802 32313B -462B 11 325 75 291 +20 10305 737 32877B -445B 10 336 72 275 +10 10401 700 33223B -435B 10 338 85 241 +20 10423 686 33360B -435B 10 336 87 247 +20 10425 685 33374B -435B 10 336 87 248 +20 10525 646 33758B -436B 10 337 86 325 +20 10558 632 33946B -437B 11 332 92 305 \ No newline at end of file diff --git a/src/com/ameliaWx/soundingViewer/unixTool/RadiosondeSite.java b/src/com/ameliaWx/soundingViewer/unixTool/RadiosondeSite.java new file mode 100644 index 0000000..108c775 --- /dev/null +++ b/src/com/ameliaWx/soundingViewer/unixTool/RadiosondeSite.java @@ -0,0 +1,366 @@ +package com.ameliaWx.soundingViewer.unixTool; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; +import java.text.Collator; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Locale; +import java.util.Scanner; + +import org.apache.commons.io.FileUtils; + +public class RadiosondeSite implements Comparable { + public static String dataFolder = System.getProperty("user.home") + "/Documents/SoundingViewer/data/"; + + public static ArrayList sites = new ArrayList<>(); + + private String internationalCode; + private String fourLetterCode; + private double latitude; + private double longitude; + private double elevation; + private String country; + private String state; // also province for canadian stations + private String city; + private int startYear; + private int endYear; + private int numRecords; + + public RadiosondeSite(String internationalCode, String fourLetterCode, double latitude, double longitude, + double elevation, String country, String state, String city, int startYear, int endYear, int numRecords) { + this.internationalCode = internationalCode; + this.fourLetterCode = fourLetterCode; + this.latitude = latitude; + this.longitude = longitude; + this.elevation = elevation; + this.country = country; + this.state = state; + this.city = city; + this.startYear = startYear; + this.endYear = endYear; + this.numRecords = numRecords; + } + + static { + initializeSites(); + } + + public static void main(String[] args) { +// for(int i = 0; i < sites.size(); i++) { +// if(sites.get(i).getEndYear() == 2023) { +// System.out.println(sites.get(i)); +// } +// } + + System.out.println(findSite("KOUN")); + } + + private static void initializeSites() { + try { + File stationList = downloadFile( + "https://www.ncei.noaa.gov/data/integrated-global-radiosonde-archive/doc/igra2-station-list.txt", + "igra2-station-list.txt"); + File countryList = downloadFile( + "https://www.ncei.noaa.gov/data/integrated-global-radiosonde-archive/doc/igra2-country-list.txt", + "igra2-country-list.txt"); + File usStatesList = downloadFile( + "https://www.ncei.noaa.gov/data/integrated-global-radiosonde-archive/doc/igra2-us-states.txt", + "igra2-us-states.txt"); + + File caProvinces = loadResourceAsFile("res/caProvinces.txt"); + File fourLetterCodes = loadResourceAsFile("res/fourLetterCodes.txt"); + + String[][] stationListArr = parseFixedWidth(stationList, 11, 9, 10, 7, 4, 30, 5, 6, 5); + String[][] usStatesArr = parseFixedWidth(usStatesList, 2, 40); + String[][] countryListArr = parseFixedWidth(countryList, 2, 40); + String[][] fourLetterCodesArr = parseFixedWidth(fourLetterCodes, 11, 40); + + HashMap usStatesMap = arrToHashMap(usStatesArr); + HashMap countryListMap = arrToHashMap(countryListArr); + HashMap fourLetterCodesMap = arrToHashMap(fourLetterCodesArr); + + for (String[] line : stationListArr) { +// System.out.println(Arrays.toString(line)); + + String internationalCode = line[0]; + double latitude = Double.valueOf(line[1]); + double longitude = Double.valueOf(line[2]); + double elevation = Double.valueOf(line[3]); + String state = usStatesMap.get(line[4]); + String country = countryListMap.get(line[0].substring(0, 2)); + String city = line[5]; + int startYear = Integer.valueOf(line[6]); + int endYear = Integer.valueOf(line[7]); + int numRecords = Integer.valueOf(line[8]); + + if(state == null) { + state = ""; + } + + if ("Canada".equals(country)) { + // province assignments + } + + String fourLetterCode = ""; + if ("United States".equals(country)) { + if(fourLetterCodesMap.containsKey(internationalCode)) { + fourLetterCode = fourLetterCodesMap.get(internationalCode); + } + } + + RadiosondeSite site = new RadiosondeSite(internationalCode, fourLetterCode, latitude, longitude, elevation, country, state, + city, startYear, endYear, numRecords); + + sites.add(site); + } + + Collections.sort(sites); + + stationList.delete(); + countryList.delete(); + usStatesList.delete(); + } catch (IOException e) { + System.err.println("Unable to download files from IGRA-2 archive."); + e.printStackTrace(); + } + } + + public static RadiosondeSite findSite(String code) { + if(code.length() == 4) { + for(int i = 0; i < sites.size(); i++) { + if("United States".equals(sites.get(i).getCountry())) { + if(code.equals(sites.get(i).getFourLetterCode())) { + return sites.get(i); + } + } + } + } else { + for(int i = 0; i < sites.size(); i++) { + if(code.equals(sites.get(i).getInternationalCode())) { + return sites.get(i); + } + } + } + + return null; + } + + public static ArrayList fourLetterCodeList() { + ArrayList list = new ArrayList<>(); + + for(int i = 0; i < sites.size(); i++) { + RadiosondeSite site = sites.get(i); + + if(site.getFourLetterCode().length() > 0) { + list.add(site.locationString()); + } + } + + return list; + } + + private static String[][] parseFixedWidth(File file, int... widths) { + try { + Scanner sc = new Scanner(file); + + ArrayList lines = new ArrayList<>(); + + while (sc.hasNextLine()) { + lines.add(sc.nextLine()); + } + + sc.close(); + + String[][] tokens = new String[lines.size()][widths.length]; + + for (int i = 0; i < lines.size(); i++) { + String line = lines.get(i); + + int startPoint = 0; + + for (int j = 0; j < widths.length; j++) { + int endPoint = startPoint + widths[j]; + + if (endPoint > line.length()) + endPoint = line.length(); + + tokens[i][j] = line.substring(startPoint, endPoint).trim(); + + startPoint = endPoint; + } + } + + return tokens; + } catch (FileNotFoundException e) { + e.printStackTrace(); + return new String[0][0]; + } + } + + private static HashMap arrToHashMap(String[][] arr) { + HashMap ret = new HashMap<>(); + + for (String[] line : arr) { + ret.put(line[0], line[1]); + } + + return ret; + } + + public String getInternationalCode() { + return internationalCode; + } + + public String getFourLetterCode() { + return fourLetterCode; + } + + public double getLatitude() { + return latitude; + } + + public double getLongitude() { + return longitude; + } + + public double getElevation() { + return elevation; + } + + public String getCountry() { + return country; + } + + public String getState() { + return state; + } + + public String getCity() { + return city; + } + + public int getStartYear() { + return startYear; + } + + public int getEndYear() { + return endYear; + } + + public int getNumRecords() { + return numRecords; + } + + public static File loadResourceAsFile(String urlStr) { +// System.out.println(urlStr); + URL url = RadiosondeSite.class.getResource(urlStr); + InputStream is = RadiosondeSite.class.getResourceAsStream(urlStr); +// System.out.println(url); +// System.out.println(is); + URL tilesObj = url; + + // System.out.println("Temp-file created."); + + File file = new File(RadiosondeSite.dataFolder + "temp/" + urlStr + ""); + file.deleteOnExit(); + + if (tilesObj == null) { + System.out.println("Loading failed to start."); + return null; + } + + // System.out.println("Loading successfully started."); + + try { + FileUtils.copyURLToFile(tilesObj, file); + } catch (Exception e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + return null; + } + + try { + is.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return file; + } + + private static File downloadFile(String url, String fileName) throws IOException { + URL dataURL = new URL(url); + + File dataDir = new File(dataFolder); + dataDir.mkdirs(); + InputStream is = dataURL.openStream(); + + OutputStream os = new FileOutputStream(dataFolder + fileName); + byte[] buffer = new byte[16 * 1024]; + int transferredBytes = is.read(buffer); + while (transferredBytes > -1) { + os.write(buffer, 0, transferredBytes); + transferredBytes = is.read(buffer); + } + is.close(); + os.close(); + + return new File(dataFolder + fileName); + } + + public String locationString() { + if(state.length() > 0) { + if(fourLetterCode.length() > 0) { + return fourLetterCode + " - " + city.toUpperCase() + ", " + state.toUpperCase() + ", " + country.toUpperCase(); + } else { + return city.toUpperCase() + ", " + state.toUpperCase() + ", " + country.toUpperCase(); + } + } else { + return city.toUpperCase() + ", " + country.toUpperCase(); + } + } + + @Override + public String toString() { + if(state.length() > 0) { + return internationalCode + ": " + city + ", " + state + ", " + country + " - " + fourLetterCode; + } else { + return internationalCode + ": " + city + ", " + country; + } +// +// return "internationalCode: " + internationalCode + ", " + +// "fourLetterCode: " + fourLetterCode + ", " + +// "latitude: " + latitude + ", " + +// "longitude: " + longitude + ", " + +// "elevation: " + elevation + ", " + +// "country: " + country + ", " + +// "state: " + state + ", " + +// "city: " + city + ", " + +// "startYear: " + startYear + ", " + +// "endYear: " + endYear + ", " + +// "numRecords: " + numRecords;15 + } + + @Override + public int compareTo(RadiosondeSite o) { + Collator usCollator = Collator.getInstance(Locale.US); + usCollator.setStrength(Collator.PRIMARY); + + int countryCompare = 4 * usCollator.compare(country, o.country); + int stateCompare = 2 * usCollator.compare(state, o.state); + int cityCompare = 1 * usCollator.compare(city, o.city); + + int totalCompare = countryCompare + stateCompare + cityCompare; + + return totalCompare; + } +} diff --git a/src/com/ameliaWx/soundingViewer/unixTool/RadiosondeWrapper.java b/src/com/ameliaWx/soundingViewer/unixTool/RadiosondeWrapper.java new file mode 100644 index 0000000..fdab7c8 --- /dev/null +++ b/src/com/ameliaWx/soundingViewer/unixTool/RadiosondeWrapper.java @@ -0,0 +1,653 @@ +package com.ameliaWx.soundingViewer.unixTool; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import javax.swing.JFrame; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; + +import com.ameliaWx.soundingViewer.Sounding; +import com.ameliaWx.soundingViewer.SoundingFrame; +import com.ameliaWx.weatherUtils.WeatherUtils; + +public class RadiosondeWrapper { + private static int startOfCurrentData; + + static { + try { + startOfCurrentData = determineStartOfCurrentData(); + + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + } catch (IOException e) { + e.printStackTrace(); + startOfCurrentData = -1024; + } + } + + public static void main(String[] args) { +// try { +// downloadFile(, "USM00072357-data.txt.zip"); +// } catch (IOException e) { +// e.printStackTrace(); +// } + +// displaySounding(RadiosondeSite.findSite("KFWD"), 2019, 10, 21, 0); +// displaySounding(RadiosondeSite.findSite("KFWD"), 2016, 04, 12, 0); +// displaySounding(RadiosondeSite.findSite("KOUN"), 1999, 5, 4, 0); +// displaySounding(RadiosondeSite.findSite("KOUN"), 2021, 2, 16, 0); +// displaySounding(RadiosondeSite.findSite("KFWD"), 2023, 6, 21, 0); +// displaySounding(RadiosondeSite.findSite("KOUN"), 2021, 2, 16, 0); +// displaySounding(RadiosondeSite.findSite("KDDC"), 2023, 7, 7, 0); +// displaySounding(RadiosondeSite.findSite("KMAF"), 2023, 5, 24, 19); +// displaySounding(RadiosondeSite.findSite("KOUN"), 2023, 9, 7, 0); +// displaySounding(RadiosondeSite.findSite("KOUN"), 2023, 2, 27, 3); + + displayCurrentSounding(RadiosondeSite.findSite("KFWD")); + + if (args.length == 0) { + doGui(); + } else { + doCli(); + } + } + + private static void doGui() { + + } + + private static void doCli() { + + } + + public static void displayCurrentSounding(RadiosondeSite site) { + JFrame loading = new JFrame("Loading radiosonde, this may take a little while..."); + + loading.setSize(500, 0); + loading.setLocationRelativeTo(null); + loading.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + loading.setVisible(true); + + displaySpcExperSounding(site); + loading.setVisible(false); + } + + public static void displaySounding(RadiosondeSite site, int year, int month, int day, int hour) { + JFrame loading = new JFrame((year >= startOfCurrentData) ? + "Loading radiosonde, this may take a little while..." : + "Loading radiosonde, this may take a minute or two..."); + + loading.setSize(500, 0); + loading.setLocationRelativeTo(null); + loading.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + loading.setVisible(true); + + DateTime d = new DateTime(year, month, day, hour, 0, DateTimeZone.UTC); + + displaySounding(site, d); + loading.setVisible(false); + } + + public static void displaySpcExperSounding(RadiosondeSite site) { + try { + Object[] soundingRet = getSoundingSPCExper(site); + Sounding sounding = (Sounding) soundingRet[0]; + DateTime d = (DateTime) soundingRet[1]; + + new SoundingFrame(site.locationString() + " Radiosonde", sounding, d, site.getLatitude(), + site.getLongitude()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void displaySounding(RadiosondeSite site, DateTime d) { + try { + Object[] soundingRet = getSounding(site, d); + Sounding sounding = (Sounding) soundingRet[0]; + d = (DateTime) soundingRet[1]; + + new SoundingFrame(site.locationString() + " Radiosonde", sounding, d, site.getLatitude(), + site.getLongitude()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static Object[] getSounding(RadiosondeSite site, DateTime d) throws IOException { + Object[] soundingTextRet = getSoundingText(site, d); // { String, DateTime } a little gross but best i can think + // of + + String soundingText = (String) soundingTextRet[0]; + d = (DateTime) soundingTextRet[1]; + +// System.out.println(d); +// System.out.println(soundingText); + + String[] linesRaw = soundingText.split("\\n"); + + ArrayList lines = new ArrayList(); + for (int i = 0; i < linesRaw.length; i++) { + String line = linesRaw[linesRaw.length - 1 - i]; + + String pressureStr = line.substring(9, 15); +// String heightStr = line.substring(16, 21); + String temperatureStr = line.substring(22, 27); + String relativeHumidityStr = line.substring(28, 33); + String windDirectionStr = line.substring(40, 45); + String windSpeedStr = line.substring(46, 51); + + double pressure_ = Double.valueOf(pressureStr); +// double height_ = Double.valueOf(heightStr); + double temperature_ = Double.valueOf(temperatureStr) / 10.0 + 273.15; + double relativeHumidity_ = Double.valueOf(relativeHumidityStr) / 1000.0; + double windDirection_ = Double.valueOf(windDirectionStr) + 180.0; + double windSpeed_ = Double.valueOf(windSpeedStr) / 10.0; + + if (pressure_ < -10 || temperature_ < 130 || relativeHumidity_ < -1 || windDirection_ < -10 + || windSpeed_ < -10) { + continue; + } + + lines.add(line); + } + + double[] pressure = new double[lines.size()]; + double[] height = new double[lines.size()]; + double[] temperature = new double[lines.size()]; + double[] dewpoint = new double[lines.size()]; + double[] uWind = new double[lines.size()]; + double[] vWind = new double[lines.size()]; + + for (int i = 0; i < lines.size(); i++) { + String line = lines.get(i); +// System.out.println(line); + + String pressureStr = line.substring(9, 15); + String heightStr = line.substring(16, 21); + String temperatureStr = line.substring(23, 27); + String relativeHumidityStr = line.substring(29, 33); + String windDirectionStr = line.substring(41, 45); + String windSpeedStr = line.substring(47, 51); + + double pressure_ = Double.valueOf(pressureStr); + double height_ = Double.valueOf(heightStr); + double temperature_ = Double.valueOf(temperatureStr) / 10.0 + 273.15; + double relativeHumidity_ = Double.valueOf(relativeHumidityStr) / 1000.0; + double windDirection_ = Double.valueOf(windDirectionStr) + 180.0; + double windSpeed_ = Double.valueOf(windSpeedStr) / 10.0; + + double dewpoint_ = WeatherUtils.dewpoint(temperature_, relativeHumidity_); + + double uWind_ = Math.sin(Math.toRadians(windDirection_)) * windSpeed_; + double vWind_ = Math.cos(Math.toRadians(windDirection_)) * windSpeed_; + + pressure[i] = pressure_; + height[i] = height_; + temperature[i] = temperature_; + dewpoint[i] = dewpoint_; + uWind[i] = uWind_; + vWind[i] = vWind_; + +// System.out.printf("%6.1f\t%5.0f\t%5.1f\t%5.1f\t%4.1f\t%4.1f\n", pressure[i], height[i], temperature[i], dewpoint[i], uWind[i], vWind[i]); + } + + for (int i = 0; i < lines.size(); i++) { + if (height[i] == -8888) { + height[i] = height[i - 1] + WeatherUtils.heightAtPressure(pressure[i - 1], pressure[i], + (temperature[i] + temperature[i - 1]) / 2); + } + } + + Sounding soundingObj = new Sounding(pressure, temperature, dewpoint, height, uWind, vWind); + + return new Object[] { soundingObj, d }; + } + + private static Object[] getSoundingText(RadiosondeSite site, DateTime d) throws IOException { + boolean archiveNeeded = (d.getYear() < startOfCurrentData); + + File soundingFileZip = null; + + if (archiveNeeded) { + soundingFileZip = downloadFile( + "ftp://ftp.ncei.noaa.gov/pub/data/igra/data/data-por/" + site.getInternationalCode() + + "-data.txt.zip", + "sounding-" + site.getInternationalCode() + "-" + d.toString() + ".txt.zip"); + } else { + soundingFileZip = downloadFile( + "https://www.ncei.noaa.gov/data/integrated-global-radiosonde-archive/access/data-y2d/" + + site.getInternationalCode() + "-data-beg2021.txt.zip", + "sounding-" + site.getInternationalCode() + "-" + d.toString() + ".txt.zip"); + } + + readUsingZipFile(soundingFileZip.getAbsolutePath(), + SoundingFrame.dataFolder + "sounding" + site.getInternationalCode() + "-" + d.toString() + "/"); + + File soundingFile = new File(SoundingFrame.dataFolder + "sounding" + site.getInternationalCode() + "-" + + d.toString() + "/" + site.getInternationalCode() + "-data.txt"); + + soundingFileZip.delete(); + + HashMap soundingTexts = new HashMap<>(); + Scanner sc = new Scanner(soundingFile); + + String line = ""; + while (sc.hasNextLine()) { + if (line.length() == 0) { + line = sc.nextLine(); + } + + if ('#' == line.charAt(0)) { + int year = Integer.valueOf(line.substring(13, 17)); + int month = Integer.valueOf(line.substring(18, 20)); + int day = Integer.valueOf(line.substring(21, 23)); + int hour = Integer.valueOf(line.substring(24, 26)); + + if (hour < 0 || hour > 24) + hour = 0; + if (day < 1 || day > 31) + day = 1; + if (month < 1 || month > 12) + hour = 1; + if (year < 1900) + year = 1900; + + DateTime testD = new DateTime(year, month, day, hour, 0, DateTimeZone.UTC); + + if (Math.abs(testD.getMillis() - d.getMillis()) < 86400000) { + String soundingText = ""; + + while (sc.hasNextLine()) { + line = sc.nextLine(); + + if ('#' == line.charAt(0)) { + break; + } + + soundingText += line + "\n"; + } + + if (testD.getMillis() - d.getMillis() == 0) { + sc.close(); + soundingFile.delete(); + new File(SoundingFrame.dataFolder + "sounding" + site.getInternationalCode() + "-" + + d.toString() + "/").delete(); + + return new Object[] { soundingText, testD }; + } + + soundingTexts.put(testD, soundingText); + } else { + while (sc.hasNextLine()) { + line = sc.nextLine(); + + if ('#' == line.charAt(0)) { + break; + } + } + } + } + } + + sc.close(); + soundingFile.delete(); + System.out.println( + SoundingFrame.dataFolder + "sounding" + site.getInternationalCode() + "-" + d.toString() + "/"); + new File(SoundingFrame.dataFolder + "sounding" + site.getInternationalCode() + "-" + d.toString() + "/") + .delete(); + + DateTime closestD = null; + long closestMillis = Long.MAX_VALUE; + + for (DateTime testD : soundingTexts.keySet()) { + if (Math.abs(testD.getMillis() - d.getMillis()) < closestMillis) { + closestMillis = testD.getMillis() - d.getMillis(); + closestD = testD; + } + } + + return new Object[] { soundingTexts.get(closestD), closestD }; + } + + private static Object[] getSoundingSPCExper(RadiosondeSite site) throws IOException { + Object[] soundingTextRet = getSoundingTextSPCExper(site); // { String, DateTime } a little gross but best i can + // think of + + String soundingText = (String) soundingTextRet[0]; + DateTime d = (DateTime) soundingTextRet[1]; + +// System.out.println(d); +// System.out.println(soundingText); + + String[] linesRaw = soundingText.split("\\n"); + + ArrayList lines = new ArrayList(); + for (int i = 0; i < linesRaw.length; i++) { + String line = linesRaw[linesRaw.length - 1 - i]; +// System.out.println(line); + +// String pressureStr = line.substring(0, 8); +// String heightStr = line.substring(9, 19); + String temperatureStr = line.substring(20, 30); +// String relativeHumidityStr = line.substring(31, 41); + String windDirectionStr = line.substring(42, 52); +// String windSpeedStr = line.substring(53, 63); + +// double pressure_ = Double.valueOf(pressureStr) * 100; +// double height_ = Double.valueOf(heightStr); + double temperature_ = Double.valueOf(temperatureStr) / 10.0 + 273.15; +// double relativeHumidity_ = Double.valueOf(relativeHumidityStr)/1000.0; + double windDirection_ = Double.valueOf(windDirectionStr) + 180.0; +// double windSpeed_ = Double.valueOf(windSpeedStr)/10.0; + + if (temperature_ < 130 && windDirection_ < -10) { + continue; + } + + lines.add(line); + } + + double[] pressure = new double[lines.size()]; + double[] height = new double[lines.size()]; + double[] temperature = new double[lines.size()]; + double[] dewpoint = new double[lines.size()]; + double[] uWind = new double[lines.size()]; + double[] vWind = new double[lines.size()]; + + ArrayList indicesWithWindData = new ArrayList<>(); + for (int i = 0; i < lines.size(); i++) { + String line = lines.get(i); +// System.out.println(line); + + String pressureStr = line.substring(0, 8); + String heightStr = line.substring(9, 19); + String temperatureStr = line.substring(20, 30); + String relativeHumidityStr = line.substring(31, 41); + String windDirectionStr = line.substring(42, 52); + String windSpeedStr = line.substring(53, 63); + + double pressure_ = Double.valueOf(pressureStr) * 100; + double height_ = Double.valueOf(heightStr); + double temperature_ = Double.valueOf(temperatureStr) + 273.15; + double dewpoint_ = Double.valueOf(relativeHumidityStr) + 273.15; + double windDirection_ = Double.valueOf(windDirectionStr) + 180.0; + double windSpeed_ = Double.valueOf(windSpeedStr) * 0.5144444; + + double uWind_ = Math.sin(Math.toRadians(windDirection_)) * windSpeed_; + double vWind_ = Math.cos(Math.toRadians(windDirection_)) * windSpeed_; + + pressure[i] = pressure_; + height[i] = height_; + temperature[i] = temperature_; + dewpoint[i] = dewpoint_; + uWind[i] = uWind_; + vWind[i] = vWind_; + + if(windSpeed_ > -10) { + indicesWithWindData.add(i); + } + +// System.out.printf("%6.1f\t%5.0f\t%5.1f\t%5.1f\t%4.1f\t%4.1f\n", pressure[i], height[i], temperature[i], +// dewpoint[i], uWind[i], vWind[i]); + } + + for(int i = 0; i < uWind.length; i++) { + if(Math.hypot(uWind[i], vWind[i]) > 5000) { + int indBefore = -1; + int indAfter = -1; + + for(int j = 0; j < indicesWithWindData.size(); j++) { + if(indicesWithWindData.get(j) < i) { + indBefore = indicesWithWindData.get(j); + } + } + + for(int j = indicesWithWindData.size() - 1; j >= 0; j--) { + if(indicesWithWindData.get(j) > i) { + indAfter = indicesWithWindData.get(j); + } + } + + if(indBefore == -1) { + uWind[i] = uWind[indAfter]; + vWind[i] = vWind[indAfter]; + } else if(indAfter == -1) { + uWind[i] = uWind[indBefore]; + vWind[i] = vWind[indBefore]; + } else { + double weight1 = (double) (indAfter - i)/(indAfter - indBefore); + double weight2 = (double) (i - indBefore)/(indAfter - indBefore); + + uWind[i] = weight1 * uWind[indBefore] + weight2 * uWind[indBefore]; + vWind[i] = weight1 * vWind[indBefore] + weight2 * vWind[indBefore]; + } + } + } + + for (int i = 0; i < lines.size(); i++) { + if (height[i] == -8888) { + height[i] = height[i - 1] + WeatherUtils.heightAtPressure(pressure[i - 1], pressure[i], + (temperature[i] + temperature[i - 1]) / 2); + } + } + + Sounding soundingObj = new Sounding(pressure, temperature, dewpoint, height, uWind, vWind); + + return new Object[] { soundingObj, d }; + } + + private static Object[] getSoundingTextSPCExper(RadiosondeSite site) throws IOException { + DateTime d = DateTime.now(DateTimeZone.UTC); + + d = d.minusMinutes(d.getMinuteOfHour()); + + File soundingFile = null; + + boolean bidailyPresent = false; + try { + DateTime dd = d.minusHours(d.getHourOfDay() % 12); + + String spcExperFile = String.format("https://www.spc.noaa.gov/exper/soundings/%02d%02d%02d%02d_OBS/%s.txt", + dd.getYearOfCentury(), dd.getMonthOfYear(), dd.getDayOfMonth(), dd.getHourOfDay(), + site.getFourLetterCode().substring(1)); + soundingFile = downloadFile(spcExperFile, "sounding-" + site.getFourLetterCode() + ".txt"); + bidailyPresent = true; + + d = dd; + } catch (FileNotFoundException e) { + try { + DateTime dd = d.minusHours(d.getHourOfDay() % 12).minusHours(12); + + String spcExperFile = String.format("https://www.spc.noaa.gov/exper/soundings/%02d%02d%02d%02d_OBS/%s.txt", + dd.getYearOfCentury(), dd.getMonthOfYear(), dd.getDayOfMonth(), dd.getHourOfDay(), + site.getFourLetterCode().substring(1)); + soundingFile = downloadFile(spcExperFile, "sounding-" + site.getFourLetterCode() + ".txt"); + bidailyPresent = true; + + d = dd; + } catch (FileNotFoundException e1) { + d = d.minusHours(1); + System.out.println(d); + } + } + + if(!bidailyPresent) { + for(int i = 0; i < 72; i++) { + try { + String spcExperFile = String.format("https://www.spc.noaa.gov/exper/soundings/%02d%02d%02d%02d_OBS/%s.txt", + d.getYearOfCentury(), d.getMonthOfYear(), d.getDayOfMonth(), d.getHourOfDay(), + site.getFourLetterCode().substring(1)); + soundingFile = downloadFile(spcExperFile, "sounding-" + site.getFourLetterCode() + ".txt"); + } catch (FileNotFoundException e) { + d = d.minusHours(1); + System.out.println(d); + } + } + } +// System.out.println(spcExperFile); + + HashMap soundingTexts = new HashMap<>(); + Scanner sc = new Scanner(soundingFile); + + String soundingText = ""; + boolean soundingData = false; + while (sc.hasNextLine()) { + String line = sc.nextLine(); + + if (line.contains("%END%")) { + soundingData = false; + } + + if (soundingData) { + soundingText += line + "\n"; + soundingTexts.put(d, soundingText); + } + + if (line.contains("%RAW%")) { + soundingData = true; + } + } + + sc.close(); + soundingFile.delete(); + + return new Object[] { soundingText, d }; + } + + private static int determineStartOfCurrentData() throws IOException { + List archiveFolder = listFilesInWebFolder( + "https://www.ncei.noaa.gov/data/integrated-global-radiosonde-archive/access/data-y2d/", 2); + + return Integer.valueOf(archiveFolder.get(0).substring(20, 24)); + } + + private static List listFilesInWebFolder(String url, int amt) throws IOException { + File index = downloadFile(url, "index.html"); + + ArrayList files = new ArrayList(); + + Pattern p = Pattern.compile(""); + Matcher m = p.matcher(usingBufferedReader(index)); + + while (m.find()) { + String group = m.group(); + String filename = group.substring(13, m.group().length() - 2); + + if (filename.endsWith(".zip")) { + files.add(filename); + } + + if (files.size() >= amt && amt != -1) { + break; + } + } + + index.delete(); + + return files; + } + + /* + * Example of reading Zip archive using ZipFile class + */ + + private static void readUsingZipFile(String fileName, String outputDir) throws IOException { + new File(outputDir).mkdirs(); + final ZipFile file = new ZipFile(fileName); + // System.out.println("Iterating over zip file : " + fileName); + + try { + final Enumeration entries = file.entries(); + while (entries.hasMoreElements()) { + final ZipEntry entry = entries.nextElement(); + extractEntry(entry, file.getInputStream(entry), outputDir); + } + // System.out.printf("Zip file %s extracted successfully in %s", + // fileName, outputDir); + } finally { + file.close(); + } + } + + /* + * Utility method to read data from InputStream + */ + + private static void extractEntry(final ZipEntry entry, InputStream is, String outputDir) throws IOException { + String exractedFile = outputDir + entry.getName(); + FileOutputStream fos = null; + + try { + fos = new FileOutputStream(exractedFile); + final byte[] buf = new byte[8192]; + int length; + + while ((length = is.read(buf, 0, buf.length)) >= 0) { + fos.write(buf, 0, length); + } + + } catch (IOException ioex) { + fos.close(); + } + + } + + private static String usingBufferedReader(File filePath) { + StringBuilder contentBuilder = new StringBuilder(); + try (BufferedReader br = new BufferedReader(new FileReader(filePath))) { + + String sCurrentLine; + while ((sCurrentLine = br.readLine()) != null) { + contentBuilder.append(sCurrentLine).append(" "); + } + } catch (IOException e) { + e.printStackTrace(); + } + return contentBuilder.toString(); + } + + private static File downloadFile(String url, String fileName) throws IOException { + URL dataURL = new URL(url); + + File dataDir = new File(SoundingFrame.dataFolder); + dataDir.mkdirs(); + InputStream is = dataURL.openStream(); + + OutputStream os = new FileOutputStream(SoundingFrame.dataFolder + fileName); + byte[] buffer = new byte[16 * 1024]; + int transferredBytes = is.read(buffer); + while (transferredBytes > -1) { + os.write(buffer, 0, transferredBytes); + transferredBytes = is.read(buffer); + } + is.close(); + os.close(); + + return new File(SoundingFrame.dataFolder + fileName); + } +} diff --git a/src/com/ameliaWx/soundingViewer/unixTool/res/caProvinces.txt b/src/com/ameliaWx/soundingViewer/unixTool/res/caProvinces.txt new file mode 100644 index 0000000..b472f6a --- /dev/null +++ b/src/com/ameliaWx/soundingViewer/unixTool/res/caProvinces.txt @@ -0,0 +1,13 @@ +AB ALBERTA +BC BRITISH COLUMBIA +MB MANITOBA +NB NEW BRUNSWICK +NL NEWFOUNDLAND & LABRADOR +NT NORTHWEST TERRITORIES +NS NOVA SCOTIA +NU NUNAVUT +ON ONTARIO +PE PRINCE EDWARD ISLAND +QC QUEBEC +SK SASKATCHEWAN +YT YUKON diff --git a/src/com/ameliaWx/soundingViewer/unixTool/res/fourLetterCodes.txt b/src/com/ameliaWx/soundingViewer/unixTool/res/fourLetterCodes.txt new file mode 100644 index 0000000..4f79a0c --- /dev/null +++ b/src/com/ameliaWx/soundingViewer/unixTool/res/fourLetterCodes.txt @@ -0,0 +1,67 @@ +USM00072201 KKEY +USM00072202 KMFL +USM00072206 KJAX +USM00072214 KTLH +USM00072230 KBMX +USM00072240 KLCH +USM00072248 KSHV +USM00072249 KFWD +USM00072250 KBRO +USM00072251 KCRP +USM00072261 KDRT +USM00072265 KMAF +USM00072274 KTUS +USM00072293 KNKX +USM00072305 KMHX +USM00072317 KGSO +USM00072318 KRNK +USM00072327 KBNA +USM00072340 KLZK +USM00072357 KOUN +USM00072363 KAMA +USM00072364 KEPZ +USM00072365 KABQ +USM00072376 KFGZ +USM00072388 KVEF +USM00072393 KVBG +USM00072402 KWAL +USM00072403 KIAD +USM00072426 KILN +USM00072440 KSGF +USM00072451 KDDC +USM00072456 KTOP +USM00072476 KGJT +USM00072489 KREV +USM00072493 KOAK +USM00072501 KOKX +USM00072520 KPIT +USM00072528 KBUF +USM00072558 KOAX +USM00072562 KLBF +USM00072572 KSLC +USM00072582 KLKN +USM00072597 KMFR +USM00072632 KDTX +USM00072634 KAPX +USM00072645 KGRB +USM00072649 KMPX +USM00072659 KABR +USM00072662 KUNR +USM00072672 KRIW +USM00072681 KBOI +USM00072694 KSLE +USM00072712 KCAR +USM00072747 KINL +USM00072764 KBIS +USM00072768 KGGW +USM00072776 KTFX +USM00072786 KOTX +USM00072797 KUIL +USM00074004 K1Y7 +USM00074389 KGYX +USM00074455 KDVN +USM00074560 KILX +USM00074626 KPHX +USM00074646 KLMN +USM00074794 KXMR +