001 /* 002 * This file is part of McIDAS-V 003 * 004 * Copyright 2007-2013 005 * Space Science and Engineering Center (SSEC) 006 * University of Wisconsin - Madison 007 * 1225 W. Dayton Street, Madison, WI 53706, USA 008 * https://www.ssec.wisc.edu/mcidas 009 * 010 * All Rights Reserved 011 * 012 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and 013 * some McIDAS-V source code is based on IDV and VisAD source code. 014 * 015 * McIDAS-V is free software; you can redistribute it and/or modify 016 * it under the terms of the GNU Lesser Public License as published by 017 * the Free Software Foundation; either version 3 of the License, or 018 * (at your option) any later version. 019 * 020 * McIDAS-V is distributed in the hope that it will be useful, 021 * but WITHOUT ANY WARRANTY; without even the implied warranty of 022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 023 * GNU Lesser Public License for more details. 024 * 025 * You should have received a copy of the GNU Lesser Public License 026 * along with this program. If not, see http://www.gnu.org/licenses. 027 */ 028 029 package edu.wisc.ssec.mcidasv.control.cyclone; 030 031 import java.util.List; 032 033 /** 034 * Created by IntelliJ IDEA. User: yuanho Date: Feb 20, 2009 Time: 3:09:14 PM To 035 * change this template use File | Settings | File Templates. 036 */ 037 038 public class StormAODT { 039 040 /** _more_ */ 041 StormAODTInfo.IRData odtcurrent_v72IR; 042 043 /** _more_ */ 044 StormAODTInfo.DataGrid areadata_v72; 045 046 /** _more_ */ 047 boolean lauto = false; 048 049 /** _more_ */ 050 int idomain_v72, ixdomain_v72, ifixtype_v72, rmwsizeman_v72; 051 052 /** _more_ */ 053 int oland_v72; 054 055 /** _more_ */ 056 boolean osearch_v72; 057 058 /** _more_ */ 059 int ostartstr_v72; 060 061 /** _more_ */ 062 float osstr_v72; 063 064 /** 065 * _more_ 066 * 067 * @param curdate 068 * _more_ 069 * @param curtime 070 * _more_ 071 * @param cursat 072 * _more_ 073 * @param cenlat 074 * _more_ 075 * @param cenlon 076 * _more_ 077 * @param posm 078 * _more_ 079 * @param g_domain 080 * _more_ 081 * 082 * @return _more_ 083 */ 084 int aodtv72_drive(int curdate, int curtime, int cursat, float cenlat, 085 float cenlon, int posm, String g_domain) { 086 087 int idomain = 0; 088 089 /* 090 * Set miscoptions flags in AODT 091 */ 092 093 int eyeSize = -99; 094 oland_v72 = 0; /* allow AODT operation over land */ 095 osearch_v72 = false; /* search for maximum curved band position */ 096 rmwsizeman_v72 = eyeSize; /* eye size parameter */ 097 098 /* 099 * Set initial classification flag and value in AODT 100 */ 101 102 ostartstr_v72 = 0; /* user defined initial classification flag */ 103 osstr_v72 = 0.0f; /* starting initial classification value */ 104 105 /* 106 * Set image date/time info in AODT 107 */ 108 109 int iaodt = aodtv72_setIRimageinfo(curdate, curtime, cursat); 110 111 /* 112 * Get storm center lat/lon 113 */ 114 if (lauto == true) { 115 // aodtv72_runautomode( nauto, fauto, imagefile, &cenlat, &cenlon, 116 // &posm ); 117 } 118 119 /* 120 * Set center location in AODT 121 */ 122 iaodt = aodtv72_setlocation(cenlat, cenlon, posm); 123 124 /* 125 * Set domain FLAG in AODT 126 */ 127 if (g_domain.equalsIgnoreCase("AUTO")) { 128 idomain = 0; 129 } 130 if (g_domain.equalsIgnoreCase("ATL")) { 131 idomain = 1; 132 } 133 if (g_domain.equalsIgnoreCase("PAC")) { 134 idomain = 2; 135 } 136 if (g_domain.equalsIgnoreCase("IND")) { 137 idomain = 2; 138 } 139 140 iaodt = aodtv72_setdomain(idomain); 141 142 /* 143 * Retrieve temperatures from image. This to be done in IDV 144 */ 145 146 float[][] temps = null; 147 float[][] lons = null; 148 float[][] lats = null; 149 int numx = 0; 150 int numy = 0; 151 152 /* 153 * Load the IR imge information in AODT init areadata_v72 154 */ 155 156 iaodt = aodtv72_loadIRimage(temps, lats, lons, numx, numy); 157 158 /* 159 * Set eye and cloud temperature values in AODT, return position for IR 160 * image data read 161 */ 162 163 odtcurrent_v72IR = aodtv72_seteyecloudtemp(StormAODTInfo.keyerM_v72, 164 areadata_v72); 165 166 /* 167 * Determine scene type Set scene type 168 */ 169 170 float[] oscen = StormAODTSceneType.aodtv72_calcscene(odtcurrent_v72IR, 171 rmwsizeman_v72, areadata_v72, osstr_v72, osearch_v72); 172 173 odtcurrent_v72IR.eyescene = (int) oscen[0]; 174 odtcurrent_v72IR.cloudscene = (int) oscen[1]; 175 odtcurrent_v72IR.eyesceneold = -1; 176 odtcurrent_v72IR.cloudsceneold = -1; 177 odtcurrent_v72IR.eyecdosize = oscen[2]; 178 odtcurrent_v72IR.ringcb = (int) oscen[3]; 179 odtcurrent_v72IR.ringcbval = (int) oscen[4]; 180 odtcurrent_v72IR.ringcbvalmax = (int) oscen[5]; 181 odtcurrent_v72IR.ringcblatmax = oscen[6]; 182 odtcurrent_v72IR.ringcblonmax = oscen[7]; 183 odtcurrent_v72IR.rmw = oscen[8]; 184 odtcurrent_v72IR.cloudt = oscen[9]; 185 odtcurrent_v72IR.cloudt2 = oscen[10]; 186 odtcurrent_v72IR.eyestdv = oscen[11]; 187 odtcurrent_v72IR.cloudsymave = oscen[12]; 188 odtcurrent_v72IR.eyefft = (int) oscen[13]; 189 odtcurrent_v72IR.cloudfft = (int) oscen[14]; 190 191 /* 192 * Determine intensity 193 */ 194 195 iaodt = aodtv72_calcintensity(idomain_v72); 196 if (iaodt == 71) { 197 throw new IllegalStateException("center location is over land"); 198 } 199 200 /* 201 * Print out all diagnostic messages to screen 202 */ 203 List result = StormAODTUtil.aodtv72_textscreenoutput(odtcurrent_v72IR, 204 idomain_v72); 205 206 return 0; 207 208 } 209 210 /** 211 * Routine to search for, identify, and set the eye and cloud temperature 212 * values for the AODT library. Temperatures are set within AODT library. 213 * Inputs : none Outputs: none Return : -51 : eye, CWcloud, or warmest 214 * temperature <-100C or >+40C 0 : o.k. 215 * 216 * @param keyerM_v72 217 * _more_ 218 * @param areadata 219 * _more_ 220 * 221 * @return _more_ 222 */ 223 224 StormAODTInfo.IRData aodtv72_seteyecloudtemp(int keyerM_v72, 225 StormAODTInfo.DataGrid areadata) 226 227 { 228 StormAODTInfo.IRData ird = StormAODTSceneType.aodtv72_gettemps( 229 keyerM_v72, areadata); 230 if (ird == null) { 231 throw new IllegalStateException( 232 "eye, CWcloud, or warmest temperature <-100C or >+40C"); 233 } 234 235 return ird; 236 } 237 238 /** 239 * _more_ 240 * 241 * @param temps 242 * _more_ 243 * @param lats 244 * _more_ 245 * @param lons 246 * _more_ 247 * @param numx 248 * _more_ 249 * @param numy 250 * _more_ 251 * 252 * @return _more_ 253 */ 254 int aodtv72_loadIRimage(float[][] temps, float[][] lats, float[][] lons, 255 int numx, int numy) 256 /* 257 * Subroutine to load IR image data grid values (temperatures and positions) 258 * into data structure for AODT library Inputs : temperature, latitude, and 259 * longitude arrays centered on storm position location along with number of 260 * columns (x) and rows (y) in grid Outputs: none (areadata_v72 structure 261 * passed via global variable) Return : 0 : o.k. 262 */ 263 { 264 StormAODTInfo sinfo = new StormAODTInfo(); 265 /* allocate space for data */ 266 267 areadata_v72 = sinfo.new DataGrid(temps, lats, lons, numx, numy); 268 269 return 0; 270 } 271 272 /** 273 * _more_ 274 * 275 * @param indomain 276 * _more_ 277 * 278 * @return _more_ 279 */ 280 int aodtv72_setdomain(int indomain) 281 /* 282 * set current ocean domain variable within AODT library memory Inputs : 283 * domain flag value from input Outputs: none Return : -81 : error 284 * deterimining storm basin 285 */ 286 { 287 int domain; 288 float xlon; 289 290 /* obtain current storm center longitude */ 291 xlon = odtcurrent_v72IR.longitude; 292 if ((xlon < -180.0) || (xlon > 180.0)) { 293 return -81; 294 } 295 296 ixdomain_v72 = indomain; 297 /* determine oceanic domain */ 298 if (indomain == 0) { 299 /* automatically determined storm basin */ 300 if (xlon >= 0.0) { 301 domain = 0; /* atlantic and east pacific to 180W/dateline */ 302 } else { 303 domain = 1; /* west pacific and other regions */ 304 } 305 } else { 306 /* manually determined storm basin */ 307 domain = indomain - 1; 308 } 309 310 /* assign ocean domain flag value to AODT library variable */ 311 idomain_v72 = domain; 312 313 return 0; 314 } 315 316 /** 317 * _more_ 318 * 319 * @param ilat 320 * _more_ 321 * @param ilon 322 * _more_ 323 * @param ipos 324 * _more_ 325 * 326 * @return _more_ 327 */ 328 int aodtv72_setlocation(float ilat, float ilon, int ipos) 329 /* 330 * set current storm center location within from AODT library memory Inputs 331 * : AODT library current storm center latitude and longitude values and 332 * location positioning method : 1-forecast interpolation 2-laplacian 333 * technique 3-warm spot 4-extrapolation Outputs: none Return : -21 : 334 * invalid storm center position 21 : user selected storm center position 22 335 * : auto selected storm center position 336 */ 337 { 338 int iret; 339 340 /* assign current storm center latitude value to AODT library variable */ 341 odtcurrent_v72IR.latitude = ilat; 342 /* assign current storm center longitude value to AODT library variable */ 343 odtcurrent_v72IR.longitude = ilon; 344 /* assign current storm center positioning flag to AODT library variable */ 345 odtcurrent_v72IR.autopos = ipos; 346 if ((odtcurrent_v72IR.longitude < -180.) 347 || (odtcurrent_v72IR.longitude > 180.)) { 348 iret = -21; 349 } 350 if ((odtcurrent_v72IR.latitude < -90.) 351 || (odtcurrent_v72IR.latitude > 90.)) { 352 iret = -21; 353 } 354 355 iret = 21; /* user selected image location */ 356 if (ipos >= 1) { 357 iret = 22; 358 } 359 360 return iret; 361 } 362 363 /** 364 * _more_ 365 * 366 * @param date 367 * _more_ 368 * @param time 369 * _more_ 370 * @param sat 371 * _more_ 372 * 373 * @return _more_ 374 */ 375 int aodtv72_setIRimageinfo(int date, int time, int sat) 376 /* 377 * set IR image date/time within AODT library memory Inputs : AODT library 378 * IR image date/time/satellite information Outputs: none Return : 0 : o.k. 379 */ 380 { 381 /* assign IR image date to AODT library variable */ 382 odtcurrent_v72IR.date = date; 383 /* assign IR image time to AODT library variable */ 384 odtcurrent_v72IR.time = time; 385 /* assign IR image satellite type to AODT library variable */ 386 odtcurrent_v72IR.sattype = sat; 387 388 return 0; 389 } 390 391 /** 392 * _more_ 393 * 394 * @param idomain 395 * _more_ 396 * 397 * @return _more_ 398 */ 399 public int aodtv72_calcintensity(int idomain) 400 /* 401 * Compute intensity values CI, Final T#, and Raw T#. Inputs : global 402 * structure odtcurrent_v72 containing current analysis Outputs : none 403 * Return : 71 : storm is over land 0 : o.k. 404 */ 405 { 406 407 int iret; 408 int strength; 409 410 if ((odtcurrent_v72IR.land == 1)) { 411 aodtv72_initcurrent(true, odtcurrent_v72IR); 412 iret = 71; 413 } else { 414 /* calculate current Raw T# value */ 415 odtcurrent_v72IR.Traw = aodtv72_Tnoraw(odtcurrent_v72IR, idomain); 416 odtcurrent_v72IR.TrawO = odtcurrent_v72IR.Traw; 417 /* check for spot analysis or full analysis using history file */ 418 /* if(hfile_v72==(char *)NULL) { */ 419 if (true) { 420 /* perform spot analysis (only Traw) */ 421 odtcurrent_v72IR.Tfinal = odtcurrent_v72IR.Traw; 422 odtcurrent_v72IR.Tfinal3 = odtcurrent_v72IR.Traw; 423 odtcurrent_v72IR.CI = odtcurrent_v72IR.Traw; 424 odtcurrent_v72IR.CIadjp = aodtv72_latbias(odtcurrent_v72IR.CI, 425 odtcurrent_v72IR.latitude, odtcurrent_v72IR.longitude, 426 odtcurrent_v72IR); 427 /* 428 * printf("%f %f %f %f\n",odtcurrent_v72IR.CI,odtcurrent_v72IR. 429 * latitude 430 * ,odtcurrent_v72->IR.longitude,odtcurrent_v72->IR.CIadjp); 431 */ 432 odtcurrent_v72IR.rule9 = 0; 433 /* odtcurrent_v72->IR.TIEraw=aodtv72_TIEmodel(); */ 434 /* odtcurrent_v72->IR.TIEavg=odtcurrent_v72->IR.TIEraw; */ 435 /* odtcurrent_v72->IR.TIEflag=aodtv72_tieflag(); */ 436 } 437 438 iret = 0; 439 } 440 441 return iret; 442 } 443 444 /** 445 * _more_ 446 * 447 * @param initval 448 * _more_ 449 * @param latitude 450 * _more_ 451 * @param longitude 452 * _more_ 453 * @param odtcurrent_v72IR 454 * _more_ 455 * 456 * @return _more_ 457 */ 458 float aodtv72_latbias(float initval, float latitude, float longitude, 459 StormAODTInfo.IRData odtcurrent_v72IR) 460 /* 461 * Apply Latitude Bias Adjustment to CI value Inputs : initval - initial CI 462 * value latitude - current latitude of storm Outputs : adjusted MSLP value 463 * as return value 464 */ 465 { 466 float initvalp; 467 float value; /* lat bias adjustement amount (0.00-1.00) */ 468 int sceneflag; /* 469 * contains lat bias adjustment flag 0=no adjustment 470 * 1=intermediate adjustment (6 hours) 2=full adjustment 471 */ 472 473 sceneflag = aodtv72_scenesearch(0); /* 474 * 0 means search for EIR based 475 * parameters... cdo, etc 476 */ 477 value = 1.0f; /* this value should be return from scenesearch() */ 478 /* printf("sceneflag=%d value=%f\n",sceneflag,value); */ 479 odtcurrent_v72IR.LBflag = sceneflag; 480 /* initvalp=aodtv72_getpwval(0,initval); TLO */ 481 initvalp = 0.0f; 482 if (sceneflag >= 2) { 483 /* EIR scene */ 484 if ((latitude >= 0.0) 485 && ((longitude >= -100.0) && (longitude <= -40.0))) { 486 /* do not make adjustment in N Indian Ocean */ 487 return initvalp; 488 } 489 /* apply bias adjustment to pressure */ 490 /* initvalp=-1.0*value*(-20.60822+(0.88463*A_ABS(latitude))); */ 491 initvalp = value * (7.325f - (0.302f * Math.abs(latitude))); 492 } 493 494 return initvalp; 495 } 496 497 /** 498 * _more_ 499 * 500 * @param type 501 * _more_ 502 * 503 * @return _more_ 504 */ 505 int aodtv72_scenesearch(int type) { 506 int curflag = 1, flag; 507 double curtime, xtime, curtimem6, mergetimefirst, mergetimelast, firsttime = -9999.0; 508 509 /* 510 * if(((odthistoryfirst_v72==0)&&(ostartstr_v72==TRUE))&&(hfile_v72!=(char 511 * *)NULL)) { 512 */ 513 514 if (true) { 515 flag = 2; 516 } 517 return flag; 518 } 519 520 /** 521 * _more_ 522 * 523 * @param redo 524 * _more_ 525 * @param odtcurrent_v72IR 526 * _more_ 527 * 528 * @return _more_ 529 */ 530 int aodtv72_initcurrent(boolean redo, StormAODTInfo.IRData odtcurrent_v72IR) 531 /* 532 * initialize odtcurrent_v72 array or reset values for land interaction 533 * situations 534 */ 535 { 536 537 if (!redo) { 538 // odtcurrent_v72=(struct odtdata *)malloc(sizeof(struct odtdata)); 539 odtcurrent_v72IR.latitude = 999.99f; 540 odtcurrent_v72IR.longitude = 999.99f; 541 odtcurrent_v72IR.land = 0; 542 odtcurrent_v72IR.autopos = 0; 543 // strcpy(odtcurrent_v72IR.comment,comm); 544 // diagnostics_v72=(char *)calloc((size_t)50000,sizeof(char)); 545 // hfile_v72=(char *)calloc((size_t)200,sizeof(char)); 546 // fixfile_v72=(char *)calloc((size_t)200,sizeof(char)); 547 548 // b=sizeof(float); 549 // bb=sizeof(double); 550 // fcstlat_v72=(float *)calloc((size_t)5,b); 551 // fcstlon_v72=(float *)calloc((size_t)5,b); 552 // fcsttime_v72=(double *)calloc((size_t)5,bb); 553 } 554 555 odtcurrent_v72IR.Traw = 0.0f; 556 odtcurrent_v72IR.TrawO = 0.0f; 557 odtcurrent_v72IR.Tfinal = 0.0f; 558 odtcurrent_v72IR.Tfinal3 = 0.0f; 559 odtcurrent_v72IR.CI = 0.0f; 560 odtcurrent_v72IR.eyet = 99.99f; 561 odtcurrent_v72IR.warmt = 99.99f; 562 odtcurrent_v72IR.cloudt = 99.99f; 563 odtcurrent_v72IR.cloudt2 = 99.99f; 564 odtcurrent_v72IR.cwcloudt = 99.99f; 565 odtcurrent_v72IR.warmlatitude = 999.99f; 566 odtcurrent_v72IR.warmlongitude = 999.99f; 567 odtcurrent_v72IR.eyecdosize = 0.0f; 568 odtcurrent_v72IR.eyestdv = 0.0f; 569 odtcurrent_v72IR.cloudsymave = 0.0f; 570 odtcurrent_v72IR.eyescene = 0; 571 odtcurrent_v72IR.cloudscene = 0; 572 odtcurrent_v72IR.eyesceneold = -1; 573 odtcurrent_v72IR.cloudsceneold = -1; 574 odtcurrent_v72IR.rule9 = 0; 575 odtcurrent_v72IR.rule8 = 0; 576 odtcurrent_v72IR.LBflag = 0; 577 odtcurrent_v72IR.rapiddiss = 0; 578 odtcurrent_v72IR.eyefft = 0; 579 odtcurrent_v72IR.cloudfft = 0; 580 odtcurrent_v72IR.cwring = 0; 581 odtcurrent_v72IR.ringcb = 0; 582 odtcurrent_v72IR.ringcbval = 0; 583 odtcurrent_v72IR.ringcbvalmax = 0; 584 odtcurrent_v72IR.CIadjp = 0.0f; 585 odtcurrent_v72IR.rmw = -99.9f; 586 /* odtcurrent_v72->IR.TIEflag=0; */ 587 /* odtcurrent_v72->IR.TIEraw=0.0; */ 588 /* odtcurrent_v72->IR.TIEavg=0.0; */ 589 /* odtcurrent_v72->IR.sst=-99.9; */ 590 // if(!redo) odtcurrent_v72->nextrec=NULL; /* added by CDB */ 591 592 return 0; 593 } 594 595 /** 596 * Compute initial Raw T-Number value using original Dvorak rules 597 * 598 * @param odtcurrent 599 * @param idomain_v72 600 * @return return value is Raw T# 601 */ 602 603 float aodtv72_Tnoraw(StormAODTInfo.IRData odtcurrent, int idomain_v72) 604 /* 605 * Compute initial Raw T-Number value using original Dvorak rules Inputs : 606 * global structure odtcurrent_v72 containing current analysis Outputs : 607 * return value is Raw T# 608 * 609 * ODT SCENE/TEMPERATURE TABLE BD | WMG OW DG MG LG B W CMG CDG | TEMP |30.0 610 * 0.0 -30.0 -42.0 -54.0 -64.0 -70.0 -76.0 -80.0+| 611 * ---------------------------------------------------------------| Atl EYE 612 * | 3.5 4.0 4.5 4.5 5.0 5.5 6.0 6.5 7.0 | EMBC | 3.5 3.5 4.0 4.0 4.5 4.5 613 * 5.0 5.0 5.0 | CDO | 3.0 3.0 3.5 4.0 4.5 4.5 4.5 5.0 5.0 | 614 * ---------------------------------------------------------------| Pac EYE 615 * | 4.0 4.0 4.0 4.5 4.5 5.0 5.5 6.0 6.5 | EMBC | 3.5 3.5 4.0 4.0 4.5 4.5 616 * 5.0 5.0 5.0 | CDO | 3.0 3.5 3.5 4.0 4.5 4.5 4.5 4.5 5.0 | 617 * ---------------------------------------------------------------| Cat diff 618 * | 0 1 2 3 4 5 6 7 8 | add | 0.0 0.0 0.0 0.0 0.0-->0.5 0.5-->1.0 1.5 | 619 * (old) add |-0.5 -0.5 0.0 0.0-->0.5 0.5 0.5-->1.0 1.0 | (new) 620 * ---------------------------------------------------------------| 621 */ 622 { 623 624 double eno[][] = { 625 { 1.00, 2.00, 3.25, 4.00, 4.75, 5.50, 5.90, 6.50, 7.00, 7.50, 626 8.00 }, /* original plus adjusted > CDG+ */ 627 { 1.50, 2.25, 3.30, 3.85, 4.50, 5.00, 5.40, 5.75, 6.25, 6.50, 628 7.00 } }; /* adjusted based */ 629 double cdo[][] = { 630 { 2.00, 2.40, 3.25, 3.50, 3.75, 4.00, 4.10, 4.20, 4.30, 4.40, 631 4.70 }, 632 { 2.05, 2.40, 3.00, 3.20, 3.40, 3.55, 3.65, 3.75, 3.80, 3.90, 633 4.10 } }; 634 double curbnd[] = { 1.0, 1.5, 2.5, 3.0, 3.5, 4.0, 4.5 }; 635 double shrdst[] = { 0.0, 35.0, 50.0, 80.0, 110.0, 140.0 }; 636 double shrcat[] = { 3.5, 3.0, 2.5, 2.25, 2.0, 1.5 }; 637 638 double diffchk[][] = { 639 { 0.0, 0.5, 1.2, 1.7, 2.2, 2.7, 0.0, 0.0, 0.1, 0.5 }, /* 640 * shear 641 * scene 642 * types... 643 * original 644 * Rule 8 645 * rules 646 */ 647 { 0.0, 0.5, 1.7, 2.2, 2.7, 3.2, 0.0, 0.0, 0.1, 0.5 }, /* 648 * eye scene 649 * types... 650 * add 0.5 651 * to Rule 8 652 * rules 653 */ 654 { 0.0, 0.5, 0.7, 1.2, 1.7, 2.2, 0.0, 0.0, 0.1, 0.5 } }; /* 655 * other 656 * scene 657 * types 658 * ... 659 * subtract 660 * 0.5 661 * from 662 * Rule 663 * 8 664 * rules 665 */ 666 double eyeadjfacEYE[] = { 0.011, 0.015 }; /* 667 * modified wpac value to be 668 * closer to atlantic 669 */ 670 double symadjfacEYE[] = { -0.015, -0.015 }; 671 double dgraysizefacCLD[] = { 0.002, 0.001 }; 672 double symadjfacCLD[] = { -0.030, -0.015 }; 673 674 int diffchkcat; 675 int ixx, cloudcat, eyecat, diffcat, rp, xrp, rb; 676 float incval, lastci, lasttno, lastr9, lastraw; 677 float xpart, xparteye, xaddtno, eyeadj, spart, ddvor, dvorchart, ciadj; 678 float sdist, cloudtemp, eyetemp, fftcloud; 679 float t1val, t6val, t12val, t18val, t24val, delt1, delt6, delt12, delt18, delt24; 680 float t1valraw, t1valrawx, txvalmin, txvalmax; 681 double curtime, xtime, firsttime, firstlandtime; 682 double ttime1, ttime6, ttime12, ttime18, ttime24, t1valrawxtime; 683 StormAODTInfo.IRData odthistory, prevrec; 684 boolean oceancheck, adjustshear, firstland; 685 boolean t1found = false, t6found = false, t12found = false, t18found = false, t24found = false; 686 boolean first6hrs = false; 687 float symadj, dgraysizeadj, deltaT; 688 689 cloudtemp = odtcurrent.cloudt; 690 eyetemp = odtcurrent.eyet; 691 cloudcat = 0; 692 eyecat = 0; 693 lastci = 4.0f; 694 xpart = 0.0f; 695 696 for (ixx = 0; ixx < 10; ixx++) { 697 /* compute cloud category */ 698 if ((cloudtemp <= StormAODTInfo.ebd_v72[ixx]) 699 && (cloudtemp > StormAODTInfo.ebd_v72[ixx + 1])) { 700 cloudcat = ixx; 701 xpart = (float) (cloudtemp - StormAODTInfo.ebd_v72[cloudcat]) 702 / (float) (StormAODTInfo.ebd_v72[cloudcat + 1] - StormAODTInfo.ebd_v72[cloudcat]); 703 } 704 /* compute eye category for eye adjustment */ 705 if ((eyetemp <= StormAODTInfo.ebd_v72[ixx]) 706 && (eyetemp > StormAODTInfo.ebd_v72[ixx + 1])) { 707 eyecat = ixx; 708 } 709 /* eyetemp=Math.min(0.0,eyetemp); */ 710 } 711 if (odtcurrent.eyescene == 1) { 712 /* for pinhole eye, determine what storm should be seeing */ 713 /* 714 * eyetemp=pinhole(odtcurrent_v72->IR.latitude,odtcurrent_v72->IR.longitude 715 * ,eyetemp); 716 */ 717 /* 718 * eyetemp=(9.0-eyetemp)/2.0; / this matches DT used at NHC (jack 719 * beven) 720 */ 721 eyetemp = (float) (eyetemp - 9.0) / 2.0f; /* 722 * between +9C (beven) and 723 * measured eye temp (turk) 724 */ 725 odtcurrent.eyet = eyetemp; 726 } 727 728 /* category difference between eye and cloud region */ 729 diffcat = Math.max(0, cloudcat - eyecat); 730 731 /* if scenetype is EYE */ 732 rp = odtcurrent.ringcbval; 733 rb = odtcurrent.ringcb; 734 fftcloud = odtcurrent.cloudfft; 735 736 if (odtcurrent.cloudscene == 3) { 737 /* CURVED BAND */ 738 rp = Math.min(30, rp + 1); /* added 1 for testing */ 739 xrp = rp / 5; 740 incval = 0.1f; 741 if (xrp == 1) { 742 incval = 0.2f; 743 } 744 ddvor = (float) curbnd[xrp]; 745 xaddtno = incval * (float) (rp - (xrp * 5)); 746 /* 747 * printf("rp=%d xrp=%d rb=%d ddvor=%f xaddtno=%f\n",rp,xrp,rb,ddvor 748 * ,xaddtno); 749 */ 750 ddvor = ddvor + xaddtno; 751 if (rb == 5) { 752 ddvor = Math.min(4.0f, ddvor + 0.5f); 753 } 754 if (rb == 6) { 755 ddvor = Math.min(4.5f, ddvor + 1.0f); 756 } 757 diffchkcat = 2; /* added for test - non-eye/shear cases */ 758 } else if (odtcurrent.cloudscene == 4) { 759 /* POSSIBLE SHEAR -- new definition from NHC */ 760 ixx = 0; 761 ddvor = 1.0f; 762 sdist = odtcurrent.eyecdosize; /* shear distance */ 763 while (ixx < 5) { 764 if ((sdist >= shrdst[ixx]) && (sdist < shrdst[ixx + 1])) { 765 spart = (float) ((sdist - shrdst[ixx]) / (shrdst[ixx + 1] - shrdst[ixx])); 766 xaddtno = (float) ((spart * (shrcat[ixx + 1] - shrcat[ixx]))); 767 ddvor = (float) (shrcat[ixx] + xaddtno); 768 ixx = 5; 769 } else { 770 ixx++; 771 } 772 } 773 diffchkcat = 0; /* added for test - shear cases */ 774 } else { 775 /* EYE or NO EYE */ 776 if (odtcurrent.eyescene <= 2) { 777 /* EYE */ 778 xaddtno = (float) (xpart * (eno[idomain_v72][cloudcat + 1] - eno[idomain_v72][cloudcat])); 779 /* 780 * cloud category must be white (-70C) or below for full 781 * adjustment; value will be merged in starting at black (-64C) 782 * / if(cloudcat<5) { / gray shades / xparteye=0.00; } else 783 * if(cloudcat==5) { / black / xparteye=xpart; } else { / white 784 * and colder / xparteye=1.00; } 785 */ 786 eyeadj = (float) eyeadjfacEYE[idomain_v72] 787 * (eyetemp - cloudtemp); 788 /* symadj=-0.02*(odtcurrent_v72->IR.cloudsymave); */ 789 symadj = (float) symadjfacEYE[idomain_v72] 790 * (odtcurrent.cloudsymave); 791 /* 792 * printf("EYE : cloudsymave=%f symadj=%f\n",odtcurrent_v72->IR. 793 * cloudsymave,symadj); 794 */ 795 ddvor = (float) eno[idomain_v72][cloudcat] + xaddtno + eyeadj 796 + symadj; 797 /* 798 * printf("EYE : xaddtno=%f eyeadj=%f symadj=%f ddvor=%f\n",xaddtno 799 * ,eyeadj,symadj,ddvor); 800 */ 801 ddvor = Math.min(ddvor, 9.0f); 802 /* printf("ddvor=%f\n",ddvor); */ 803 if (odtcurrent.eyescene == 2) { 804 ddvor = Math.min(ddvor - 0.5f, 6.5f); /* LARGE EYE adjustment */ 805 } 806 /* 807 * if(odtcurrent_v72->IR.eyescene==3) 808 * ddvor=Math.min(ddvor-0.5,6.0); / LARGE RAGGED EYE adjustment 809 */ 810 diffchkcat = 1; /* added for test - eye cases */ 811 /* printf("ddvor=%f\n",ddvor); */ 812 } else { 813 /* NO EYE */ 814 /* CDO */ 815 xaddtno = (float) (xpart * (cdo[idomain_v72][cloudcat + 1] - cdo[idomain_v72][cloudcat])); 816 /* dgraysizeadj=0.002*odtcurrent_v72->IR.eyecdosize; */ 817 dgraysizeadj = (float) dgraysizefacCLD[idomain_v72] 818 * odtcurrent.eyecdosize; 819 /* 820 * printf("CDO : dgraysize=%f symadj=%f\n",odtcurrent_v72->IR.eyecdosize 821 * ,dgraysizeadj); 822 */ 823 /* symadj=-0.03*(odtcurrent_v72->IR.cloudsymave); */ 824 symadj = (float) symadjfacCLD[idomain_v72] 825 * (odtcurrent.cloudsymave); 826 /* 827 * printf("CDO : cloudsymave=%f symadj=%f\n",odtcurrent_v72->IR. 828 * cloudsymave,symadj); 829 */ 830 ddvor = (float) cdo[idomain_v72][cloudcat] + xaddtno 831 + dgraysizeadj + symadj; 832 ddvor = ddvor - 0.1f; /* bias adjustment */ 833 /* 834 * printf("CDO : xaddtno=%f dgraysizeadj=%f symadj=%f ddvor=%f\n" 835 * ,xaddtno,dgraysizeadj,symadj,ddvor); 836 */ 837 ciadj = 0.0f; 838 if (odtcurrent.cloudscene == 0) { /* CDO */ 839 if (lastci >= 4.5) { 840 ciadj = Math.max(0.0f, Math.min(1.0f, lastci - 4.5f)); 841 } 842 if (lastci <= 3.0) { 843 ciadj = Math.min(0.0f, Math.max(-1.0f, lastci - 3.0f)); 844 } 845 /* printf("CDO : lastci=%f xaddtno=%f\n",lastci,ciadj); */ 846 ddvor = ddvor + ciadj; 847 } 848 if (odtcurrent.cloudscene == 1) { /* EMBEDDED CENTER */ 849 ciadj = Math.max(0.0f, Math.min(1.5f, lastci - 4.0f)); 850 /* printf("EMBC : lastci=%f xaddtno=%f\n",lastci,ciadj); */ 851 ddvor = ddvor + ciadj; /* changed from 0.5 */ 852 } 853 if (odtcurrent.cloudscene == 2) { /* IRREGULAR CDO (PT=3.5) */ 854 ddvor = ddvor + 0.3f; /* additional IrrCDO bias adjustment */ 855 ddvor = Math.min(3.5f, Math.max(2.5f, ddvor)); 856 } 857 diffchkcat = 2; /* added for test - non-eye/shear cases */ 858 } 859 } 860 861 dvorchart = ((float) (int) (ddvor * 10.0f)) / 10.0f; 862 // odtcurrent_v72IR.TrawO=dvorchart; 863 864 return dvorchart; 865 866 } 867 868 }