Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -4145,500 +4145,5 @@ initialize_data()
|
|
| 4145 |
demo = create_interface()
|
| 4146 |
|
| 4147 |
if __name__ == "__main__":
|
| 4148 |
-
demo.launch(share=True)
|
| 4149 |
-
'lon': current_lon,
|
| 4150 |
-
'intensity_kt': current_intensity,
|
| 4151 |
-
'category': categorize_typhoon_enhanced(current_intensity),
|
| 4152 |
-
'confidence': confidence,
|
| 4153 |
-
'development_stage': stage,
|
| 4154 |
-
'forward_speed_kmh': base_speed * 111, # Convert to km/h
|
| 4155 |
-
'pressure_hpa': max(900, 1013 - (current_intensity - 25) * 0.9),
|
| 4156 |
-
'environmental_limit': environmental_limit,
|
| 4157 |
-
'sst_celsius': current_sst,
|
| 4158 |
-
'slp_hpa': current_slp,
|
| 4159 |
-
'intensity_tendency': intensity_tendency
|
| 4160 |
-
})
|
| 4161 |
-
|
| 4162 |
-
results['route_forecast'] = route_points
|
| 4163 |
-
|
| 4164 |
-
# Enhanced confidence scores with environmental factors
|
| 4165 |
-
base_confidence = 0.90 if use_real_data else 0.75
|
| 4166 |
-
|
| 4167 |
-
results['confidence_scores'] = {
|
| 4168 |
-
'genesis': base_confidence,
|
| 4169 |
-
'early_development': base_confidence - 0.05,
|
| 4170 |
-
'position_24h': base_confidence - 0.08,
|
| 4171 |
-
'position_48h': base_confidence - 0.15,
|
| 4172 |
-
'position_72h': base_confidence - 0.25,
|
| 4173 |
-
'intensity_24h': (base_confidence - 0.10) if use_real_data else 0.65,
|
| 4174 |
-
'intensity_48h': (base_confidence - 0.20) if use_real_data else 0.55,
|
| 4175 |
-
'intensity_72h': (base_confidence - 0.30) if use_real_data else 0.45,
|
| 4176 |
-
'environmental_coupling': 0.85 if use_real_data else 0.60
|
| 4177 |
-
}
|
| 4178 |
-
|
| 4179 |
-
# Enhanced model information
|
| 4180 |
-
data_sources = []
|
| 4181 |
-
if sst_data and sst_data['success']:
|
| 4182 |
-
data_sources.append("NOAA OISST v2")
|
| 4183 |
-
if slp_data and slp_data['success']:
|
| 4184 |
-
data_sources.append("NCEP/NCAR Reanalysis")
|
| 4185 |
-
|
| 4186 |
-
if data_sources:
|
| 4187 |
-
results['model_info'] = f"Enhanced Oceanic Model using {', '.join(data_sources)}"
|
| 4188 |
-
else:
|
| 4189 |
-
results['model_info'] = "Enhanced Climatological Model"
|
| 4190 |
-
|
| 4191 |
-
logging.info(f"Enhanced prediction complete: {len(route_points)} forecast points")
|
| 4192 |
-
return results
|
| 4193 |
-
|
| 4194 |
-
except Exception as e:
|
| 4195 |
-
logging.error(f"Error in enhanced oceanic prediction: {e}")
|
| 4196 |
-
import traceback
|
| 4197 |
-
traceback.print_exc()
|
| 4198 |
-
|
| 4199 |
-
# Fallback to basic prediction
|
| 4200 |
-
return predict_storm_route_and_intensity_realistic(
|
| 4201 |
-
genesis_region, month, oni_value, models, forecast_hours, True
|
| 4202 |
-
)
|
| 4203 |
-
|
| 4204 |
-
def calculate_environmental_steering_speed(lat, lon, month, oni_value, slp_data):
|
| 4205 |
-
"""Calculate storm forward speed based on environmental steering"""
|
| 4206 |
-
base_speed = 0.15 # Default speed in degrees/hour
|
| 4207 |
-
|
| 4208 |
-
# Latitude effects
|
| 4209 |
-
if lat < 20:
|
| 4210 |
-
speed_factor = 0.8 # Slower in tropics
|
| 4211 |
-
elif lat < 30:
|
| 4212 |
-
speed_factor = 1.2 # Faster in subtropics
|
| 4213 |
-
else:
|
| 4214 |
-
speed_factor = 1.5 # Fast in mid-latitudes
|
| 4215 |
-
|
| 4216 |
-
# Pressure gradient effects (if SLP data available)
|
| 4217 |
-
if slp_data and slp_data['success']:
|
| 4218 |
-
try:
|
| 4219 |
-
# Calculate approximate pressure gradient (simplified)
|
| 4220 |
-
slp_value = oceanic_manager.interpolate_data_to_point(slp_data, lat, lon, 'slp')
|
| 4221 |
-
if not np.isnan(slp_value):
|
| 4222 |
-
slp_hpa = slp_value if slp_value > 500 else slp_value / 100
|
| 4223 |
-
if slp_hpa < 1008: # Low pressure - faster motion
|
| 4224 |
-
speed_factor *= 1.2
|
| 4225 |
-
elif slp_hpa > 1015: # High pressure - slower motion
|
| 4226 |
-
speed_factor *= 0.8
|
| 4227 |
-
except:
|
| 4228 |
-
pass
|
| 4229 |
-
|
| 4230 |
-
return base_speed * speed_factor
|
| 4231 |
-
|
| 4232 |
-
def calculate_motion_tendency(lat, lon, month, oni_value, hour, slp_data):
|
| 4233 |
-
"""Calculate motion tendency with environmental steering"""
|
| 4234 |
-
# Base climatological motion
|
| 4235 |
-
ridge_position = 32 + 4 * np.sin(2 * np.pi * (month - 6) / 4)
|
| 4236 |
-
|
| 4237 |
-
if lat < ridge_position - 10:
|
| 4238 |
-
base_lat_tendency = 0.05 # Poleward
|
| 4239 |
-
base_lon_tendency = -0.12 # Westward
|
| 4240 |
-
elif lat > ridge_position - 3:
|
| 4241 |
-
base_lat_tendency = 0.15 # Strong poleward (recurvature)
|
| 4242 |
-
base_lon_tendency = 0.08 # Eastward
|
| 4243 |
-
else:
|
| 4244 |
-
base_lat_tendency = 0.08 # Moderate poleward
|
| 4245 |
-
base_lon_tendency = -0.06 # Moderate westward
|
| 4246 |
-
|
| 4247 |
-
# ENSO steering effects
|
| 4248 |
-
if oni_value > 0.5: # El Niño
|
| 4249 |
-
base_lon_tendency += 0.03 # More eastward
|
| 4250 |
-
base_lat_tendency += 0.01 # Slightly more poleward
|
| 4251 |
-
elif oni_value < -0.5: # La Niña
|
| 4252 |
-
base_lon_tendency -= 0.04 # More westward
|
| 4253 |
-
|
| 4254 |
-
# Add realistic motion uncertainty
|
| 4255 |
-
motion_uncertainty = 0.02 + (hour / 120) * 0.03
|
| 4256 |
-
lat_noise = np.random.normal(0, motion_uncertainty)
|
| 4257 |
-
lon_noise = np.random.normal(0, motion_uncertainty)
|
| 4258 |
-
|
| 4259 |
-
return base_lat_tendency + lat_noise, base_lon_tendency + lon_noise
|
| 4260 |
-
|
| 4261 |
-
def calculate_environmental_intensity_change(
|
| 4262 |
-
current_intensity, environmental_limit, hour, lat, lon, month, oni_value, sst_data
|
| 4263 |
-
):
|
| 4264 |
-
"""Calculate intensity change based on environmental conditions"""
|
| 4265 |
-
|
| 4266 |
-
# Base intensity tendency based on development stage
|
| 4267 |
-
if hour <= 48: # Development phase
|
| 4268 |
-
if current_intensity < environmental_limit * 0.6:
|
| 4269 |
-
base_tendency = 3.5 # Rapid development possible
|
| 4270 |
-
elif current_intensity < environmental_limit * 0.8:
|
| 4271 |
-
base_tendency = 2.0 # Moderate development
|
| 4272 |
-
else:
|
| 4273 |
-
base_tendency = 0.5 # Near limit
|
| 4274 |
-
elif hour <= 120: # Mature phase
|
| 4275 |
-
if current_intensity < environmental_limit:
|
| 4276 |
-
base_tendency = 1.0 # Slow intensification
|
| 4277 |
-
else:
|
| 4278 |
-
base_tendency = -0.5 # Slight weakening
|
| 4279 |
-
else: # Extended phase
|
| 4280 |
-
base_tendency = -2.0 # General weakening trend
|
| 4281 |
-
|
| 4282 |
-
# Environmental limit constraint
|
| 4283 |
-
if current_intensity >= environmental_limit:
|
| 4284 |
-
base_tendency = min(base_tendency, -1.0) # Force weakening if over limit
|
| 4285 |
-
|
| 4286 |
-
# SST effects on development rate
|
| 4287 |
-
if sst_data and sst_data['success']:
|
| 4288 |
-
try:
|
| 4289 |
-
sst_value = oceanic_manager.interpolate_data_to_point(sst_data, lat, lon, 'sst')
|
| 4290 |
-
if not np.isnan(sst_value):
|
| 4291 |
-
sst_celsius = sst_value if sst_value < 50 else sst_value - 273.15
|
| 4292 |
-
if sst_celsius >= 29.5: # Very warm - enhanced development
|
| 4293 |
-
base_tendency += 1.5
|
| 4294 |
-
elif sst_celsius >= 28.0: # Warm - normal development
|
| 4295 |
-
base_tendency += 0.5
|
| 4296 |
-
elif sst_celsius < 26.5: # Cool - inhibited development
|
| 4297 |
-
base_tendency -= 2.0
|
| 4298 |
-
except:
|
| 4299 |
-
pass
|
| 4300 |
-
|
| 4301 |
-
# Land interaction
|
| 4302 |
-
if lon < 110 or (120 < lon < 125 and lat > 20): # Near land masses
|
| 4303 |
-
base_tendency -= 8.0
|
| 4304 |
-
|
| 4305 |
-
# High latitude weakening
|
| 4306 |
-
if lat > 35:
|
| 4307 |
-
base_tendency -= 10.0
|
| 4308 |
-
elif lat > 30:
|
| 4309 |
-
base_tendency -= 4.0
|
| 4310 |
-
|
| 4311 |
-
# Add realistic intensity uncertainty
|
| 4312 |
-
intensity_noise = np.random.normal(0, 1.0)
|
| 4313 |
-
|
| 4314 |
-
return base_tendency + intensity_noise
|
| 4315 |
-
|
| 4316 |
-
def calculate_dynamic_confidence(hour, lat, lon, use_real_data, sst_success, slp_success):
|
| 4317 |
-
"""Calculate dynamic confidence based on data availability and conditions"""
|
| 4318 |
-
base_confidence = 0.92
|
| 4319 |
-
|
| 4320 |
-
# Time penalty
|
| 4321 |
-
time_penalty = (hour / 120) * 0.35
|
| 4322 |
-
|
| 4323 |
-
# Data quality bonus
|
| 4324 |
-
data_bonus = 0.0
|
| 4325 |
-
if use_real_data:
|
| 4326 |
-
if sst_success:
|
| 4327 |
-
data_bonus += 0.08
|
| 4328 |
-
if slp_success:
|
| 4329 |
-
data_bonus += 0.05
|
| 4330 |
-
|
| 4331 |
-
# Environmental uncertainty
|
| 4332 |
-
environment_penalty = 0.0
|
| 4333 |
-
if lat > 30 or lon < 115: # Challenging forecast regions
|
| 4334 |
-
environment_penalty = 0.12
|
| 4335 |
-
elif lat > 25:
|
| 4336 |
-
environment_penalty = 0.06
|
| 4337 |
-
|
| 4338 |
-
final_confidence = base_confidence + data_bonus - time_penalty - environment_penalty
|
| 4339 |
-
return max(0.25, min(0.95, final_confidence))
|
| 4340 |
-
|
| 4341 |
-
def get_environmental_development_stage(hour, intensity, environmental_limit):
|
| 4342 |
-
"""Determine development stage based on time and environmental context"""
|
| 4343 |
-
intensity_fraction = intensity / max(environmental_limit, 50)
|
| 4344 |
-
|
| 4345 |
-
if hour <= 24:
|
| 4346 |
-
return 'Genesis'
|
| 4347 |
-
elif hour <= 72:
|
| 4348 |
-
if intensity_fraction < 0.3:
|
| 4349 |
-
return 'Early Development'
|
| 4350 |
-
elif intensity_fraction < 0.6:
|
| 4351 |
-
return 'Active Development'
|
| 4352 |
-
else:
|
| 4353 |
-
return 'Rapid Development'
|
| 4354 |
-
elif hour <= 120:
|
| 4355 |
-
if intensity_fraction > 0.8:
|
| 4356 |
-
return 'Peak Intensity'
|
| 4357 |
-
else:
|
| 4358 |
-
return 'Mature Stage'
|
| 4359 |
-
else:
|
| 4360 |
-
return 'Extended Forecast'
|
| 4361 |
-
|
| 4362 |
-
def predict_storm_route_and_intensity_realistic(genesis_region, month, oni_value, models=None, forecast_hours=72, use_advanced_physics=True):
|
| 4363 |
-
"""Realistic prediction with proper typhoon speeds and development"""
|
| 4364 |
-
try:
|
| 4365 |
-
genesis_locations = get_realistic_genesis_locations()
|
| 4366 |
-
|
| 4367 |
-
if genesis_region not in genesis_locations:
|
| 4368 |
-
genesis_region = "Western Pacific Main Development Region" # Default
|
| 4369 |
-
|
| 4370 |
-
genesis_info = genesis_locations[genesis_region]
|
| 4371 |
-
lat = genesis_info["lat"]
|
| 4372 |
-
lon = genesis_info["lon"]
|
| 4373 |
-
|
| 4374 |
-
results = {
|
| 4375 |
-
'current_prediction': {},
|
| 4376 |
-
'route_forecast': [],
|
| 4377 |
-
'confidence_scores': {},
|
| 4378 |
-
'model_info': 'Realistic Genesis Model',
|
| 4379 |
-
'genesis_info': genesis_info
|
| 4380 |
-
}
|
| 4381 |
-
|
| 4382 |
-
# REALISTIC starting intensity - Tropical Depression level
|
| 4383 |
-
base_intensity = 30 # Start at TD level (25-35 kt)
|
| 4384 |
-
|
| 4385 |
-
# Environmental factors for genesis
|
| 4386 |
-
if oni_value > 1.0: # Strong El Niño - suppressed development
|
| 4387 |
-
intensity_modifier = -6
|
| 4388 |
-
elif oni_value > 0.5: # Moderate El Niño
|
| 4389 |
-
intensity_modifier = -3
|
| 4390 |
-
elif oni_value < -1.0: # Strong La Niña - enhanced development
|
| 4391 |
-
intensity_modifier = +8
|
| 4392 |
-
elif oni_value < -0.5: # Moderate La Niña
|
| 4393 |
-
intensity_modifier = +5
|
| 4394 |
-
else: # Neutral
|
| 4395 |
-
intensity_modifier = oni_value * 2
|
| 4396 |
-
|
| 4397 |
-
# Seasonal genesis effects
|
| 4398 |
-
seasonal_factors = {
|
| 4399 |
-
1: -8, 2: -6, 3: -4, 4: -2, 5: 2, 6: 6,
|
| 4400 |
-
7: 10, 8: 12, 9: 15, 10: 10, 11: 4, 12: -5
|
| 4401 |
-
}
|
| 4402 |
-
seasonal_modifier = seasonal_factors.get(month, 0)
|
| 4403 |
-
|
| 4404 |
-
# Genesis region favorability
|
| 4405 |
-
region_factors = {
|
| 4406 |
-
"Western Pacific Main Development Region": 8,
|
| 4407 |
-
"South China Sea": 4,
|
| 4408 |
-
"Philippine Sea": 5,
|
| 4409 |
-
"Marshall Islands": 7,
|
| 4410 |
-
"Monsoon Trough": 6,
|
| 4411 |
-
"ITCZ Region": 3,
|
| 4412 |
-
"Subtropical Region": 2,
|
| 4413 |
-
"Bay of Bengal": 4,
|
| 4414 |
-
"Eastern Pacific": 6,
|
| 4415 |
-
"Atlantic MDR": 5
|
| 4416 |
-
}
|
| 4417 |
-
region_modifier = region_factors.get(genesis_region, 0)
|
| 4418 |
-
|
| 4419 |
-
# Calculate realistic starting intensity (TD level)
|
| 4420 |
-
predicted_intensity = base_intensity + intensity_modifier + seasonal_modifier + region_modifier
|
| 4421 |
-
predicted_intensity = max(25, min(40, predicted_intensity)) # Keep in TD-weak TS range
|
| 4422 |
-
|
| 4423 |
-
# Add realistic uncertainty for genesis
|
| 4424 |
-
intensity_uncertainty = np.random.normal(0, 2)
|
| 4425 |
-
predicted_intensity += intensity_uncertainty
|
| 4426 |
-
predicted_intensity = max(25, min(38, predicted_intensity)) # TD range
|
| 4427 |
|
| 4428 |
-
results['current_prediction'] = {
|
| 4429 |
-
'intensity_kt': predicted_intensity,
|
| 4430 |
-
'pressure_hpa': 1008 - (predicted_intensity - 25) * 0.6, # Realistic TD pressure
|
| 4431 |
-
'category': categorize_typhoon_enhanced(predicted_intensity),
|
| 4432 |
-
'genesis_region': genesis_region
|
| 4433 |
-
}
|
| 4434 |
-
|
| 4435 |
-
# REALISTIC route prediction with proper typhoon speeds
|
| 4436 |
-
current_lat = lat
|
| 4437 |
-
current_lon = lon
|
| 4438 |
-
current_intensity = predicted_intensity
|
| 4439 |
-
|
| 4440 |
-
route_points = []
|
| 4441 |
-
|
| 4442 |
-
# Track storm development over time with REALISTIC SPEEDS
|
| 4443 |
-
for hour in range(0, forecast_hours + 6, 6):
|
| 4444 |
-
|
| 4445 |
-
# REALISTIC typhoon motion - much faster speeds
|
| 4446 |
-
# Typical typhoon forward speed: 15-25 km/h (0.14-0.23°/hour)
|
| 4447 |
-
|
| 4448 |
-
# Base forward speed depends on latitude and storm intensity
|
| 4449 |
-
if current_lat < 20: # Low latitude - slower
|
| 4450 |
-
base_speed = 0.12 # ~13 km/h
|
| 4451 |
-
elif current_lat < 30: # Mid latitude - moderate
|
| 4452 |
-
base_speed = 0.18 # ~20 km/h
|
| 4453 |
-
else: # High latitude - faster
|
| 4454 |
-
base_speed = 0.25 # ~28 km/h
|
| 4455 |
-
|
| 4456 |
-
# Intensity affects speed (stronger storms can move faster)
|
| 4457 |
-
intensity_speed_factor = 1.0 + (current_intensity - 50) / 200
|
| 4458 |
-
base_speed *= max(0.8, min(1.4, intensity_speed_factor))
|
| 4459 |
-
|
| 4460 |
-
# Beta drift (Coriolis effect) - realistic values
|
| 4461 |
-
beta_drift_lat = 0.02 * np.sin(np.radians(current_lat))
|
| 4462 |
-
beta_drift_lon = -0.05 * np.cos(np.radians(current_lat))
|
| 4463 |
-
|
| 4464 |
-
# Seasonal steering patterns with realistic speeds
|
| 4465 |
-
if month in [6, 7, 8, 9]: # Peak season
|
| 4466 |
-
ridge_strength = 1.2
|
| 4467 |
-
ridge_position = 32 + 4 * np.sin(2 * np.pi * (month - 6) / 4)
|
| 4468 |
-
else: # Off season
|
| 4469 |
-
ridge_strength = 0.9
|
| 4470 |
-
ridge_position = 28
|
| 4471 |
-
|
| 4472 |
-
# REALISTIC motion based on position relative to subtropical ridge
|
| 4473 |
-
if current_lat < ridge_position - 10: # Well south of ridge - westward movement
|
| 4474 |
-
lat_tendency = base_speed * 0.3 + beta_drift_lat # Slight poleward
|
| 4475 |
-
lon_tendency = -base_speed * 0.9 + beta_drift_lon # Strong westward
|
| 4476 |
-
elif current_lat > ridge_position - 3: # Near ridge - recurvature
|
| 4477 |
-
lat_tendency = base_speed * 0.8 + beta_drift_lat # Strong poleward
|
| 4478 |
-
lon_tendency = base_speed * 0.4 + beta_drift_lon # Eastward
|
| 4479 |
-
else: # In between - normal WNW motion
|
| 4480 |
-
lat_tendency = base_speed * 0.4 + beta_drift_lat # Moderate poleward
|
| 4481 |
-
lon_tendency = -base_speed * 0.7 + beta_drift_lon # Moderate westward
|
| 4482 |
-
|
| 4483 |
-
# ENSO steering modulation (realistic effects)
|
| 4484 |
-
if oni_value > 0.5: # El Niño - more eastward/poleward motion
|
| 4485 |
-
lon_tendency += 0.05
|
| 4486 |
-
lat_tendency += 0.02
|
| 4487 |
-
elif oni_value < -0.5: # La Niña - more westward motion
|
| 4488 |
-
lon_tendency -= 0.08
|
| 4489 |
-
lat_tendency -= 0.01
|
| 4490 |
-
|
| 4491 |
-
# Add motion uncertainty that grows with time (realistic error growth)
|
| 4492 |
-
motion_uncertainty = 0.02 + (hour / 120) * 0.04
|
| 4493 |
-
lat_noise = np.random.normal(0, motion_uncertainty)
|
| 4494 |
-
lon_noise = np.random.normal(0, motion_uncertainty)
|
| 4495 |
-
|
| 4496 |
-
# Update position with realistic speeds
|
| 4497 |
-
current_lat += lat_tendency + lat_noise
|
| 4498 |
-
current_lon += lon_tendency + lon_noise
|
| 4499 |
-
|
| 4500 |
-
# REALISTIC intensity evolution with proper development cycles
|
| 4501 |
-
|
| 4502 |
-
# Development phase (first 48-72 hours) - realistic intensification
|
| 4503 |
-
if hour <= 48:
|
| 4504 |
-
if current_intensity < 50: # Still weak - rapid development possible
|
| 4505 |
-
if 10 <= current_lat <= 25 and 115 <= current_lon <= 165: # Favorable environment
|
| 4506 |
-
intensity_tendency = 4.5 if current_intensity < 35 else 3.0
|
| 4507 |
-
elif 120 <= current_lon <= 155 and 15 <= current_lat <= 20: # Best environment
|
| 4508 |
-
intensity_tendency = 6.0 if current_intensity < 40 else 4.0
|
| 4509 |
-
else:
|
| 4510 |
-
intensity_tendency = 2.0
|
| 4511 |
-
elif current_intensity < 80: # Moderate intensity
|
| 4512 |
-
intensity_tendency = 2.5 if (120 <= current_lon <= 155 and 10 <= current_lat <= 25) else 1.0
|
| 4513 |
-
else: # Already strong
|
| 4514 |
-
intensity_tendency = 1.0
|
| 4515 |
-
|
| 4516 |
-
# Mature phase (48-120 hours) - peak intensity maintenance
|
| 4517 |
-
elif hour <= 120:
|
| 4518 |
-
if current_lat < 25 and current_lon > 120: # Still in favorable waters
|
| 4519 |
-
if current_intensity < 120:
|
| 4520 |
-
intensity_tendency = 1.5
|
| 4521 |
-
else:
|
| 4522 |
-
intensity_tendency = 0.0 # Maintain intensity
|
| 4523 |
-
else:
|
| 4524 |
-
intensity_tendency = -1.5
|
| 4525 |
-
|
| 4526 |
-
# Extended phase (120+ hours) - gradual weakening
|
| 4527 |
-
else:
|
| 4528 |
-
if current_lat < 30 and current_lon > 115:
|
| 4529 |
-
intensity_tendency = -2.0 # Slow weakening
|
| 4530 |
-
else:
|
| 4531 |
-
intensity_tendency = -3.5 # Faster weakening
|
| 4532 |
-
|
| 4533 |
-
# Environmental modulation (realistic effects)
|
| 4534 |
-
if current_lat > 35: # High latitude - rapid weakening
|
| 4535 |
-
intensity_tendency -= 12
|
| 4536 |
-
elif current_lat > 30: # Moderate latitude
|
| 4537 |
-
intensity_tendency -= 5
|
| 4538 |
-
elif current_lon < 110: # Land interaction
|
| 4539 |
-
intensity_tendency -= 15
|
| 4540 |
-
elif 125 <= current_lon <= 155 and 10 <= current_lat <= 25: # Warm pool
|
| 4541 |
-
intensity_tendency += 2
|
| 4542 |
-
elif 160 <= current_lon <= 180 and 15 <= current_lat <= 30: # Still warm
|
| 4543 |
-
intensity_tendency += 1
|
| 4544 |
-
|
| 4545 |
-
# SST effects (realistic temperature impact)
|
| 4546 |
-
if current_lat < 8: # Very warm but weak Coriolis
|
| 4547 |
-
intensity_tendency += 0.5
|
| 4548 |
-
elif 8 <= current_lat <= 20: # Sweet spot for development
|
| 4549 |
-
intensity_tendency += 2.0
|
| 4550 |
-
elif 20 < current_lat <= 30: # Marginal
|
| 4551 |
-
intensity_tendency -= 1.0
|
| 4552 |
-
elif current_lat > 30: # Cool waters
|
| 4553 |
-
intensity_tendency -= 4.0
|
| 4554 |
-
|
| 4555 |
-
# Shear effects (simplified but realistic)
|
| 4556 |
-
if month in [12, 1, 2, 3]: # High shear season
|
| 4557 |
-
intensity_tendency -= 2.0
|
| 4558 |
-
elif month in [7, 8, 9]: # Low shear season
|
| 4559 |
-
intensity_tendency += 1.0
|
| 4560 |
-
|
| 4561 |
-
# Update intensity with realistic bounds and variability
|
| 4562 |
-
intensity_noise = np.random.normal(0, 1.5) # Small random fluctuations
|
| 4563 |
-
current_intensity += intensity_tendency + intensity_noise
|
| 4564 |
-
current_intensity = max(20, min(185, current_intensity)) # Realistic range
|
| 4565 |
-
|
| 4566 |
-
# Calculate confidence based on forecast time and environment
|
| 4567 |
-
base_confidence = 0.92
|
| 4568 |
-
time_penalty = (hour / 120) * 0.45
|
| 4569 |
-
environment_penalty = 0.15 if current_lat > 30 or current_lon < 115 else 0
|
| 4570 |
-
confidence = max(0.25, base_confidence - time_penalty - environment_penalty)
|
| 4571 |
-
|
| 4572 |
-
# Determine development stage
|
| 4573 |
-
if hour <= 24:
|
| 4574 |
-
stage = 'Genesis'
|
| 4575 |
-
elif hour <= 72:
|
| 4576 |
-
stage = 'Development'
|
| 4577 |
-
elif hour <= 120:
|
| 4578 |
-
stage = 'Mature'
|
| 4579 |
-
elif hour <= 240:
|
| 4580 |
-
stage = 'Extended'
|
| 4581 |
-
else:
|
| 4582 |
-
stage = 'Long-term'
|
| 4583 |
-
|
| 4584 |
-
route_points.append({
|
| 4585 |
-
'hour': hour,
|
| 4586 |
-
'lat': current_lat,
|
| 4587 |
-
'lon': current_lon,
|
| 4588 |
-
'intensity_kt': current_intensity,
|
| 4589 |
-
'category': categorize_typhoon_enhanced(current_intensity),
|
| 4590 |
-
'confidence': confidence,
|
| 4591 |
-
'development_stage': stage,
|
| 4592 |
-
'forward_speed_kmh': base_speed * 111, # Convert to km/h
|
| 4593 |
-
'pressure_hpa': max(900, 1013 - (current_intensity - 25) * 0.9)
|
| 4594 |
-
})
|
| 4595 |
-
|
| 4596 |
-
results['route_forecast'] = route_points
|
| 4597 |
-
|
| 4598 |
-
# Realistic confidence scores
|
| 4599 |
-
results['confidence_scores'] = {
|
| 4600 |
-
'genesis': 0.88,
|
| 4601 |
-
'early_development': 0.82,
|
| 4602 |
-
'position_24h': 0.85,
|
| 4603 |
-
'position_48h': 0.78,
|
| 4604 |
-
'position_72h': 0.68,
|
| 4605 |
-
'intensity_24h': 0.75,
|
| 4606 |
-
'intensity_48h': 0.65,
|
| 4607 |
-
'intensity_72h': 0.55,
|
| 4608 |
-
'long_term': max(0.3, 0.8 - (forecast_hours / 240) * 0.5)
|
| 4609 |
-
}
|
| 4610 |
-
|
| 4611 |
-
# Model information
|
| 4612 |
-
results['model_info'] = f"Enhanced Realistic Model - {genesis_region}"
|
| 4613 |
-
|
| 4614 |
-
return results
|
| 4615 |
-
|
| 4616 |
-
except Exception as e:
|
| 4617 |
-
logging.error(f"Realistic prediction error: {str(e)}")
|
| 4618 |
-
return {
|
| 4619 |
-
'error': f"Prediction error: {str(e)}",
|
| 4620 |
-
'current_prediction': {'intensity_kt': 30, 'category': 'Tropical Depression'},
|
| 4621 |
-
'route_forecast': [],
|
| 4622 |
-
'confidence_scores': {},
|
| 4623 |
-
'model_info': 'Error in prediction'
|
| 4624 |
-
}
|
| 4625 |
-
|
| 4626 |
-
# Update the existing predict_storm_route_and_intensity_realistic function to use oceanic data
|
| 4627 |
-
def predict_storm_route_and_intensity_realistic_enhanced(
|
| 4628 |
-
genesis_region, month, oni_value, models=None,
|
| 4629 |
-
forecast_hours=72, use_advanced_physics=True
|
| 4630 |
-
):
|
| 4631 |
-
"""Enhanced wrapper that uses oceanic data when available"""
|
| 4632 |
-
return predict_storm_route_and_intensity_with_oceanic_data(
|
| 4633 |
-
genesis_region, month, oni_value, forecast_hours,
|
| 4634 |
-
use_real_data=True, models=models, enable_animation=True
|
| 4635 |
-
)
|
| 4636 |
-
|
| 4637 |
-
# Initialize data
|
| 4638 |
-
initialize_data()
|
| 4639 |
-
|
| 4640 |
-
# Create and launch the interface
|
| 4641 |
-
demo = create_interface()
|
| 4642 |
-
|
| 4643 |
-
if __name__ == "__main__":
|
| 4644 |
-
demo.launch(share=True) # Enable sharing with public link
|
|
|
|
| 4145 |
demo = create_interface()
|
| 4146 |
|
| 4147 |
if __name__ == "__main__":
|
| 4148 |
+
demo.launch(share=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4149 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|