Add time stepping naked planet model
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
# %%
|
||||
|
||||
|
||||
# %%
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
# Set up constants as given:
|
||||
timeStep_years = 100 # years
|
||||
waterDepth = 4000 # meters
|
||||
L = 1350 # W/m²
|
||||
albedo = 0.3
|
||||
epsilon = 1
|
||||
sigma = 5.67e-8 # W/m² K^4
|
||||
|
||||
# The incoming solar flux is constant:
|
||||
incoming_flux = L * (1 - albedo) / 4 # W/m²
|
||||
|
||||
# Calculate the heat capacity (J/m² K)
|
||||
# (water density = 1000 kg/m³, specific heat = 4184 J/(kg·K))
|
||||
heat_capacity = waterDepth * 1000 * 4184
|
||||
|
||||
# Read the number of time steps from stdin
|
||||
nSteps = int(input(""))
|
||||
|
||||
# Set the initial conditions.
|
||||
# (Initial temperature is chosen in Kelvins; 0 K is allowed though not physical.)
|
||||
initial_temperature = 0.0 # Kelvin
|
||||
heatContent = initial_temperature * heat_capacity # in J/m²
|
||||
|
||||
# Prepare lists for time and temperature (for plotting, if desired)
|
||||
time_list = [0]
|
||||
temperature_list = [initial_temperature]
|
||||
|
||||
# Convert the time step to seconds.
|
||||
dt = timeStep_years * 365 * 24 * 3600
|
||||
|
||||
# Integration loop: update heat content and temperature each step.
|
||||
for i in range(nSteps):
|
||||
# Current temperature in Kelvin:
|
||||
T = heatContent / heat_capacity
|
||||
|
||||
# Differential equation: dHeat/dt = incoming_flux - ε·σ·(T)⁴
|
||||
dH_dt = incoming_flux - epsilon * sigma * (T**4)
|
||||
|
||||
# Update the heat content over the time step:
|
||||
heatContent = heatContent + dH_dt * dt
|
||||
|
||||
# Append new time and temperature to lists:
|
||||
time_list.append((i+1) * timeStep_years)
|
||||
temperature_list.append(heatContent / heat_capacity)
|
||||
|
||||
# Compute the final temperature (in Kelvin) and the corresponding outgoing heat flux.
|
||||
final_temperature = heatContent / heat_capacity
|
||||
final_heat_flux = epsilon * sigma * (final_temperature**4)
|
||||
|
||||
# Output only the final temperature and heat flux.
|
||||
print(final_temperature, final_heat_flux)
|
||||
|
||||
# Plotting code
|
||||
plt.plot(time_list, temperature_list)
|
||||
plt.show()
|
||||
|
||||
|
||||
# %%
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user