Using data from GEOS-FP
This example demonstrates how to use the GEOS-FP data loader in the EarthSciML ecosystem. The GEOS-FP data loader is used to load data from the GEOS-FP dataset.
First, let's initialize some packages and set up the GEOS-FP equation system.
using EarthSciData, EarthSciMLBase
using ModelingToolkit, DifferentialEquations
using ModelingToolkit: t, D
using Dates, Plots, DataFrames
using DynamicQuantities
using DynamicQuantities: dimension
# Set up system
domain = DomainInfo(DateTime(2022, 1, 1), DateTime(2022, 1, 3);
latrange = deg2rad(-85.0f0):deg2rad(2):deg2rad(85.0f0),
lonrange = deg2rad(-180.0f0):deg2rad(2.5):deg2rad(175.0f0),
levrange = 1:11,
u_proto = zeros(Float32, 1, 1, 1, 1)
)
geosfp = GEOSFP("4x5", domain)
\[ \begin{align} \mathtt{A3dyn.DTRAIN}\left( t \right) &= \mathtt{A3dyn.DTRAIN\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{A3dyn.OMEGA}\left( t \right) &= \mathtt{A3dyn.OMEGA\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{A3dyn.RH}\left( t \right) &= \mathtt{A3dyn.RH\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{A3dyn.U}\left( t \right) &= \mathtt{A3dyn.U\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{A3dyn.V}\left( t \right) &= \mathtt{A3dyn.V\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{A3cld.CLOUD}\left( t \right) &= \mathtt{A3cld.CLOUD\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{A3cld.OPTDEPTH}\left( t \right) &= \mathtt{A3cld.OPTDEPTH\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{A3cld.QCCU}\left( t \right) &= \mathtt{A3cld.QCCU\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{A3cld.QI}\left( t \right) &= \mathtt{A3cld.QI\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{A3cld.QL}\left( t \right) &= \mathtt{A3cld.QL\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{A3cld.TAUCLI}\left( t \right) &= \mathtt{A3cld.TAUCLI\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{A3cld.TAUCLW}\left( t \right) &= \mathtt{A3cld.TAUCLW\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{I3.PS}\left( t \right) &= \mathtt{I3.PS\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{I3.PV}\left( t \right) &= \mathtt{I3.PV\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{I3.QV}\left( t \right) &= \mathtt{I3.QV\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{I3.T}\left( t \right) &= \mathtt{I3.T\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{A3mstE.CMFMC}\left( t \right) &= \mathtt{A3mstE.CMFMC\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{A3mstE.PFICU}\left( t \right) &= \mathtt{A3mstE.PFICU\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{A3mstE.PFILSAN}\left( t \right) &= \mathtt{A3mstE.PFILSAN\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{A3mstE.PFLCU}\left( t \right) &= \mathtt{A3mstE.PFLCU\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{A3mstE.PFLLSAN}\left( t \right) &= \mathtt{A3mstE.PFLLSAN\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{A1.ALBEDO}\left( t \right) &= \mathtt{A1.ALBEDO\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.CLDTOT}\left( t \right) &= \mathtt{A1.CLDTOT\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.EFLUX}\left( t \right) &= \mathtt{A1.EFLUX\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.EVAP}\left( t \right) &= \mathtt{A1.EVAP\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.FRSEAICE}\left( t \right) &= \mathtt{A1.FRSEAICE\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.FRSNO}\left( t \right) &= \mathtt{A1.FRSNO\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.GRN}\left( t \right) &= \mathtt{A1.GRN\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.GWETROOT}\left( t \right) &= \mathtt{A1.GWETROOT\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.GWETTOP}\left( t \right) &= \mathtt{A1.GWETTOP\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.HFLUX}\left( t \right) &= \mathtt{A1.HFLUX\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.LAI}\left( t \right) &= \mathtt{A1.LAI\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.LWI}\left( t \right) &= \mathtt{A1.LWI\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.LWGNT}\left( t \right) &= \mathtt{A1.LWGNT\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.LWTUP}\left( t \right) &= \mathtt{A1.LWTUP\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.PARDF}\left( t \right) &= \mathtt{A1.PARDF\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.PARDR}\left( t \right) &= \mathtt{A1.PARDR\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.PBLH}\left( t \right) &= \mathtt{A1.PBLH\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.PRECANV}\left( t \right) &= \mathtt{A1.PRECANV\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.PRECCON}\left( t \right) &= \mathtt{A1.PRECCON\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.PRECLSC}\left( t \right) &= \mathtt{A1.PRECLSC\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.PRECSNO}\left( t \right) &= \mathtt{A1.PRECSNO\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.PRECTOT}\left( t \right) &= \mathtt{A1.PRECTOT\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.QV2M}\left( t \right) &= \mathtt{A1.QV2M\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.SEAICE00}\left( t \right) &= \mathtt{A1.SEAICE00\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.SEAICE10}\left( t \right) &= \mathtt{A1.SEAICE10\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.SEAICE20}\left( t \right) &= \mathtt{A1.SEAICE20\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.SEAICE30}\left( t \right) &= \mathtt{A1.SEAICE30\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.SEAICE40}\left( t \right) &= \mathtt{A1.SEAICE40\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.SEAICE50}\left( t \right) &= \mathtt{A1.SEAICE50\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.SEAICE60}\left( t \right) &= \mathtt{A1.SEAICE60\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.SEAICE70}\left( t \right) &= \mathtt{A1.SEAICE70\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.SEAICE80}\left( t \right) &= \mathtt{A1.SEAICE80\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.SEAICE90}\left( t \right) &= \mathtt{A1.SEAICE90\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.SLP}\left( t \right) &= \mathtt{A1.SLP\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.SNODP}\left( t \right) &= \mathtt{A1.SNODP\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.SNOMAS}\left( t \right) &= \mathtt{A1.SNOMAS\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.SWGDN}\left( t \right) &= \mathtt{A1.SWGDN\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.TO3}\left( t \right) &= \mathtt{A1.TO3\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.TROPPT}\left( t \right) &= \mathtt{A1.TROPPT\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.TS}\left( t \right) &= \mathtt{A1.TS\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.T2M}\left( t \right) &= \mathtt{A1.T2M\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.U10M}\left( t \right) &= \mathtt{A1.U10M\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.USTAR}\left( t \right) &= \mathtt{A1.USTAR\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.V10M}\left( t \right) &= \mathtt{A1.V10M\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.Z0M}\left( t \right) &= \mathtt{A1.Z0M\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.T10M}\left( t \right) &= \mathtt{A1.T10M\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A1.Q850}\left( t \right) &= \mathtt{A1.Q850\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{A3mstC.DQRCU}\left( t \right) &= \mathtt{A3mstC.DQRCU\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{A3mstC.DQRLSAN}\left( t \right) &= \mathtt{A3mstC.DQRLSAN\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{A3mstC.REEVAPCN}\left( t \right) &= \mathtt{A3mstC.REEVAPCN\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{A3mstC.REEVAPLS}\left( t \right) &= \mathtt{A3mstC.REEVAPLS\_itp}\left( t + \mathtt{t\_ref}, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ P\left( t \right) &= \mathtt{P\_unit} DataInterpolations.LinearInterpolation{Vector{Float64}, UnitRange{Int64}, Vector{Float64}, Vector{Float64}, Float64}([0.0, 4.804826, 659.3752000000001, 1313.48, 1961.311, 2609.201, 3257.081, 3898.201, 4533.901, 5169.611, 5805.321, 6436.264, 7062.197999999999, 7883.4220000000005, 8909.992, 9936.521, 10918.17, 11895.86, 12869.59, 14291.0, 15626.0, 16960.9, 18161.9, 19309.7, 20325.899999999998, 21215.0, 21877.600000000002, 22389.8, 22436.3, 21686.5, 20119.2, 17693.0, 15039.3, 12783.7, 10866.3, 9236.572, 7851.231, 6660.340999999999, 5638.791, 4764.391, 4017.541, 3381.0009999999997, 2836.781, 2373.0409999999997, 1979.1599999999999, 1645.71, 1364.34, 1127.69, 929.2942, 761.9842, 621.6801, 504.68010000000004, 407.6571, 327.6431, 262.0211, 208.497, 165.079, 130.05100000000002, 101.94399999999999, 79.51341, 61.677910000000004, 47.58061, 36.50411, 27.85261, 21.134900000000002, 15.9495, 11.9703, 8.934502, 6.600001, 4.758501, 3.27, 2.0, 1.0], 1:73, Float64[], DataInterpolations.LinearParameterCache{Vector{Float64}}(Float64[]), DataInterpolations.ExtrapolationType.None, DataInterpolations.ExtrapolationType.None, FindFirstFunctions.Guesser{UnitRange{Int64}}(1:73, Base.RefValue{Int64}(1), true), false, true)\left( \mathtt{lev} \right) + \mathtt{I3.PS}\left( t \right) DataInterpolations.LinearInterpolation{Vector{Float64}, UnitRange{Int64}, Vector{Float64}, Vector{Float64}, Float64}([1.0, 0.984952, 0.963406, 0.941865, 0.920387, 0.898908, 0.877429, 0.856018, 0.8346609, 0.8133039, 0.7919469, 0.7706375, 0.7493782, 0.721166, 0.6858999, 0.6506349, 0.6158184, 0.5810415, 0.5463042, 0.4945902, 0.4437402, 0.3928911, 0.3433811, 0.2944031, 0.2467411, 0.2003501, 0.1562241, 0.1136021, 0.06372006, 0.02801004, 0.006960025, 8.175413e-9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 1:73, Float64[], DataInterpolations.LinearParameterCache{Vector{Float64}}(Float64[]), DataInterpolations.ExtrapolationType.None, DataInterpolations.ExtrapolationType.None, FindFirstFunctions.Guesser{UnitRange{Int64}}(1:73, Base.RefValue{Int64}(1), true), false, true)\left( \mathtt{lev} \right) \\ \mathtt{Tv}\left( t \right) &= \left( 1 + 0.61 \mathtt{I3.QV}\left( t \right) \right) \mathtt{I3.T}\left( t \right) \\ \mathtt{Tv\_sfc}\left( t \right) &= \left( 1 + 0.61 \mathtt{A1.QV2M}\left( t \right) \right) \mathtt{A1.T2M}\left( t \right) \\ \mathtt{T\bar{v}}\left( t \right) &= 0.5 \left( \mathtt{Tv\_sfc}\left( t \right) + \mathtt{Tv}\left( t \right) \right) \\ \mathtt{Z\_agl}\left( t \right) &= \frac{\mathtt{Rd} \mathtt{T\bar{v}}\left( t \right) \log\left( \frac{\mathtt{I3.PS}\left( t \right)}{\mathtt{P\_unit} DataInterpolations.LinearInterpolation{Vector{Float64}, UnitRange{Int64}, Vector{Float64}, Vector{Float64}, Float64}([0.0, 4.804826, 659.3752000000001, 1313.48, 1961.311, 2609.201, 3257.081, 3898.201, 4533.901, 5169.611, 5805.321, 6436.264, 7062.197999999999, 7883.4220000000005, 8909.992, 9936.521, 10918.17, 11895.86, 12869.59, 14291.0, 15626.0, 16960.9, 18161.9, 19309.7, 20325.899999999998, 21215.0, 21877.600000000002, 22389.8, 22436.3, 21686.5, 20119.2, 17693.0, 15039.3, 12783.7, 10866.3, 9236.572, 7851.231, 6660.340999999999, 5638.791, 4764.391, 4017.541, 3381.0009999999997, 2836.781, 2373.0409999999997, 1979.1599999999999, 1645.71, 1364.34, 1127.69, 929.2942, 761.9842, 621.6801, 504.68010000000004, 407.6571, 327.6431, 262.0211, 208.497, 165.079, 130.05100000000002, 101.94399999999999, 79.51341, 61.677910000000004, 47.58061, 36.50411, 27.85261, 21.134900000000002, 15.9495, 11.9703, 8.934502, 6.600001, 4.758501, 3.27, 2.0, 1.0], 1:73, Float64[], DataInterpolations.LinearParameterCache{Vector{Float64}}(Float64[]), DataInterpolations.ExtrapolationType.None, DataInterpolations.ExtrapolationType.None, FindFirstFunctions.Guesser{UnitRange{Int64}}(1:73, Base.RefValue{Int64}(1), true), false, true)\left( 0.5 + \mathtt{lev} \right) + \mathtt{I3.PS}\left( t \right) DataInterpolations.LinearInterpolation{Vector{Float64}, UnitRange{Int64}, Vector{Float64}, Vector{Float64}, Float64}([1.0, 0.984952, 0.963406, 0.941865, 0.920387, 0.898908, 0.877429, 0.856018, 0.8346609, 0.8133039, 0.7919469, 0.7706375, 0.7493782, 0.721166, 0.6858999, 0.6506349, 0.6158184, 0.5810415, 0.5463042, 0.4945902, 0.4437402, 0.3928911, 0.3433811, 0.2944031, 0.2467411, 0.2003501, 0.1562241, 0.1136021, 0.06372006, 0.02801004, 0.006960025, 8.175413e-9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 1:73, Float64[], DataInterpolations.LinearParameterCache{Vector{Float64}}(Float64[]), DataInterpolations.ExtrapolationType.None, DataInterpolations.ExtrapolationType.None, FindFirstFunctions.Guesser{UnitRange{Int64}}(1:73, Base.RefValue{Int64}(1), true), false, true)\left( 0.5 + \mathtt{lev} \right)} \right)}{g} \\ \mathtt{{\delta}x{\delta}lon}\left( t \right) &= \mathtt{lon2m} \cos\left( \mathtt{lat} \right) \\ \mathtt{{\delta}y{\delta}lat}\left( t \right) &= \mathtt{lat2meters} \\ \mathtt{{\delta}P{\delta}lev}\left( t \right) &= \mathtt{P\_unit} derivative\left( Interpolation\_interp, \mathtt{lev}, 1 \right) + \mathtt{I3.PS}\left( t \right) derivative\left( Interpolation\_interp, \mathtt{lev}, 1 \right) \end{align} \]
Note that the GEOSFP
function returns to things, an equation system and an object that can used to update the time in the underlying data loaders. We can see above the different variables that are available in the GEOS-FP dataset. But also, here they are in table form:
vars = unknowns(geosfp)
DataFrame(
:Name => [string(Symbolics.tosymbol(v, escape = false)) for v in vars],
:Units => [dimension(ModelingToolkit.get_unit(v)) for v in vars],
:Description => [ModelingToolkit.getdescription(v) for v in vars]
)
Row | Name | Units | Description |
---|---|---|---|
String | Dimensio… | String | |
1 | A3dyn₊DTRAIN | m⁻² kg s⁻² | Detrainment cloud mass flux |
2 | A3dyn₊OMEGA | m⁻¹ kg s⁻³ | Vertical pressure velocity |
3 | A3dyn₊RH | Relative humidity | |
4 | A3dyn₊U | m s⁻¹ | Eastward component of wind |
5 | A3dyn₊V | m s⁻¹ | Northward component of wind |
6 | A3cld₊CLOUD | Total cloud fraction in grid box | |
7 | A3cld₊OPTDEPTH | Total in-cloud optical thickness (visible band) | |
8 | A3cld₊QCCU | Cloud condensate mixing ratio, convective updraft | |
9 | A3cld₊QI | Cloud ice water mixing ratio | |
10 | A3cld₊QL | Cloud liquid water mixing ratio | |
11 | A3cld₊TAUCLI | In-cloud ice optical thickness (visible band) | |
12 | A3cld₊TAUCLW | In-cloud water optical thickness (visible band) | |
13 | I3₊PS | m⁻¹ kg s⁻² | Surface pressure |
14 | I3₊PV | m⁻² kg⁻¹ s⁻¹ K | Ertel potential vorticity |
15 | I3₊QV | Specific humidity | |
16 | I3₊T | K | Temperature |
17 | A3mstE₊CMFMC | m⁻² kg s⁻² | Upward moist convective mass flux |
18 | A3mstE₊PFICU | m⁻² kg s⁻¹ | Downward flux of ice precipitation (convective) |
19 | A3mstE₊PFILSAN | m⁻² kg s⁻¹ | Downward flux of ice precipitation (large scale + anvil) |
20 | A3mstE₊PFLCU | m⁻² kg s⁻¹ | Downward flux of liquid precipitation (convective) |
21 | A3mstE₊PFLLSAN | m⁻² kg s⁻¹ | Downward flux of liquid precipitation (large scale + anvil) |
22 | A1₊ALBEDO | Surface albedo | |
23 | A1₊CLDTOT | Total cloud fraction | |
24 | A1₊EFLUX | kg s⁻³ | Latent heat flux (positive upward) |
25 | A1₊EVAP | m⁻² kg s⁻² | Surface evaporation |
26 | A1₊FRSEAICE | Fraction of sea ice on surface | |
27 | A1₊FRSNO | Fractional snow-covered area | |
28 | A1₊GRN | Vegetation greenness fraction | |
29 | A1₊GWETROOT | Root zone soil wetness | |
30 | A1₊GWETTOP | Top soil wetness | |
31 | A1₊HFLUX | kg s⁻³ | Sensible heat flux (positive upward) |
32 | A1₊LAI | Leaf area index | |
33 | A1₊LWI | Land/water/ice flags | |
34 | A1₊LWGNT | kg s⁻³ | Net longwave flux at the ground |
35 | A1₊LWTUP | kg s⁻³ | Upward longwave flux at top of atmosphere (TOA) |
36 | A1₊PARDF | kg s⁻³ | Surface downward PAR diffuse flux |
37 | A1₊PARDR | kg s⁻³ | Surface downward PAR beam flux |
38 | A1₊PBLH | m | Planetary boundary layer height above surface |
39 | A1₊PRECANV | m⁻² kg s⁻¹ | Surface precipitation flux from anvils |
40 | A1₊PRECCON | m⁻² kg s⁻¹ | Surface precipitation flux from convection |
41 | A1₊PRECLSC | m⁻² kg s⁻¹ | Surface precipitation flux from large-scale |
42 | A1₊PRECSNO | m⁻² kg s⁻¹ | Surface precipitation flux from snow |
43 | A1₊PRECTOT | m⁻² kg s⁻¹ | Total surface precipitation flux |
44 | A1₊QV2M | Specific humidity at 2m above the displacement height | |
45 | A1₊SEAICE00 | Fraction of grid box that has 0-10% sea ice coverage | |
46 | A1₊SEAICE10 | Fraction of grid box that has 10-20% sea ice coverage | |
47 | A1₊SEAICE20 | Fraction of grid box that has 20-30% sea ice coverage | |
48 | A1₊SEAICE30 | Fraction of grid box that has 30-40% sea ice coverage | |
49 | A1₊SEAICE40 | Fraction of grid box that has 40-50% sea ice coverage | |
50 | A1₊SEAICE50 | Fraction of grid box that has 50-60% sea ice coverage | |
51 | A1₊SEAICE60 | Fraction of grid box that has 60-70% sea ice coverage | |
52 | A1₊SEAICE70 | Fraction of grid box that has 70-80% sea ice coverage | |
53 | A1₊SEAICE80 | Fraction of grid box that has 80-90% sea ice coverage | |
54 | A1₊SEAICE90 | Fraction of grid box that has 90-100% sea ice coverage | |
55 | A1₊SLP | m⁻¹ kg s⁻² | Sea level pressure |
56 | A1₊SNODP | m | Snow depth |
57 | A1₊SNOMAS | m⁻² kg | Snow mass |
58 | A1₊SWGDN | kg s⁻³ | Surface incident shortwave flux |
59 | A1₊TO3 | m⁻² mol | Total column ozone |
60 | A1₊TROPPT | m⁻¹ kg s⁻² | Temperature-based tropopause pressure |
61 | A1₊TS | K | Surface skin temperature |
62 | A1₊T2M | K | Temperature 2m above displacement height |
63 | A1₊U10M | m s⁻¹ | Eastward wind 10m above displacement height |
64 | A1₊USTAR | m s⁻¹ | Friction velocity |
65 | A1₊V10M | m s⁻¹ | Northward wind 10m above displacement height |
66 | A1₊Z0M | m | Roughness length, momentum |
67 | A1₊T10M | K | Temperature at 10 m above the displacement height |
68 | A1₊Q850 | Specific humidity at 850 hPa | |
69 | A3mstC₊DQRCU | s⁻¹ | Precipitation production rate -- convective |
70 | A3mstC₊DQRLSAN | s⁻¹ | Precipitation production rate -- large scale + anvil |
71 | A3mstC₊REEVAPCN | s⁻¹ | Evaporation of precipitating convective condensate |
72 | A3mstC₊REEVAPLS | Evaporation of precipitating large-scale & anvil condensate | |
73 | P | m⁻¹ kg s⁻² | Pressure |
74 | Tv | K | Virtual temperature |
75 | Tv_sfc | K | Virtual temperature at 2 m (near-surface) |
76 | Tv̄ | K | Layer-mean virtual temperature |
77 | Z_agl | m | Geopotential height above ground level |
78 | δxδlon | m | X gradient with respect to longitude |
79 | δyδlat | m | Y gradient with respect to latitude |
80 | δPδlev | m⁻¹ kg s⁻² | Pressure gradient with respect to hybrid grid level |
The GEOS-FP equation system isn't an ordinary differential equation (ODE) system, so we can't run it by itself. To fix this, we create another equation system that is an ODE. (We don't actually end up using this system for anything, it's just necessary to get the system to compile.)
struct ExampleCoupler
sys::Any
end
function Example()
@parameters lat=0.0 [unit=u"rad"]
@parameters lon=0.0 [unit=u"rad"]
@variables c(t) = 5.0 [unit=u"s"]
System(
[D(c) ~ sin(lat * 6) + sin(lon * 6)],
t,
name = :ExampleSys,
metadata = Dict(CoupleType => ExampleCoupler)
)
end
function EarthSciMLBase.couple2(e::ExampleCoupler, g::EarthSciData.GEOSFPCoupler)
e, g = e.sys, g.sys
e = param_to_var(e, :lat, :lon)
ConnectorSystem([e.lat ~ g.lat, e.lon ~ g.lon], e, g)
end
examplesys = Example()
\[ \begin{align} \frac{\mathrm{d} c\left( t \right)}{\mathrm{d}t} &= \sin\left( 6 \mathtt{lon} \right) + \sin\left( 6 \mathtt{lat} \right) \end{align} \]
Now, let's couple these two systems together, and also add in advection and some information about the domain:
composed_sys = couple(examplesys, domain, geosfp)
pde_sys = convert(PDESystem, composed_sys)
\[ \begin{align} \mathtt{{\delta}GEOSFP.lon\_transform}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \frac{1}{\mathtt{lon2m} \cos\left( \mathtt{lat} \right)} \\ \mathtt{{\delta}GEOSFP.lat\_transform}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \frac{1}{\mathtt{lat2meters}} \\ \mathtt{{\delta}GEOSFP.lev\_transform}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= 1 \\ \mathtt{ExampleSys.lat}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{lat} \\ \mathtt{ExampleSys.lon}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{lon} \\ \frac{\mathrm{d}}{\mathrm{d}t} \mathtt{ExampleSys.c}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \sin\left( 6 \mathtt{ExampleSys.lat}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \right) + \sin\left( 6 \mathtt{ExampleSys.lon}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \right) \\ \mathtt{GEOSFP.A3dyn.DTRAIN}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3dyn.DTRAIN\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.A3dyn.OMEGA}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3dyn.OMEGA\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.A3dyn.RH}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3dyn.RH\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.A3dyn.U}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3dyn.U\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.A3dyn.V}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3dyn.V\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.A3cld.CLOUD}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3cld.CLOUD\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.A3cld.OPTDEPTH}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3cld.OPTDEPTH\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.A3cld.QCCU}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3cld.QCCU\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.A3cld.QI}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3cld.QI\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.A3cld.QL}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3cld.QL\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.A3cld.TAUCLI}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3cld.TAUCLI\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.A3cld.TAUCLW}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3cld.TAUCLW\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.I3.PS}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.I3.PS\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.I3.PV}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.I3.PV\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.I3.QV}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.I3.QV\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.I3.T}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.I3.T\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.A3mstE.CMFMC}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3mstE.CMFMC\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.A3mstE.PFICU}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3mstE.PFICU\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.A3mstE.PFILSAN}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3mstE.PFILSAN\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.A3mstE.PFLCU}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3mstE.PFLCU\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.A3mstE.PFLLSAN}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3mstE.PFLLSAN\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.A1.ALBEDO}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.ALBEDO\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.CLDTOT}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.CLDTOT\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.EFLUX}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.EFLUX\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.EVAP}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.EVAP\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.FRSEAICE}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.FRSEAICE\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.FRSNO}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.FRSNO\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.GRN}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.GRN\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.GWETROOT}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.GWETROOT\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.GWETTOP}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.GWETTOP\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.HFLUX}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.HFLUX\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.LAI}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.LAI\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.LWI}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.LWI\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.LWGNT}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.LWGNT\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.LWTUP}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.LWTUP\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.PARDF}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.PARDF\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.PARDR}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.PARDR\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.PBLH}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.PBLH\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.PRECANV}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.PRECANV\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.PRECCON}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.PRECCON\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.PRECLSC}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.PRECLSC\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.PRECSNO}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.PRECSNO\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.PRECTOT}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.PRECTOT\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.QV2M}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.QV2M\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.SEAICE00}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.SEAICE00\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.SEAICE10}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.SEAICE10\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.SEAICE20}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.SEAICE20\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.SEAICE30}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.SEAICE30\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.SEAICE40}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.SEAICE40\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.SEAICE50}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.SEAICE50\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.SEAICE60}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.SEAICE60\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.SEAICE70}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.SEAICE70\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.SEAICE80}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.SEAICE80\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.SEAICE90}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.SEAICE90\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.SLP}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.SLP\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.SNODP}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.SNODP\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.SNOMAS}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.SNOMAS\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.SWGDN}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.SWGDN\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.TO3}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.TO3\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.TROPPT}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.TROPPT\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.TS}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.TS\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.T2M}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.T2M\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.U10M}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.U10M\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.USTAR}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.USTAR\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.V10M}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.V10M\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.Z0M}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.Z0M\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.T10M}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.T10M\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A1.Q850}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.Q850\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat} \right) \\ \mathtt{GEOSFP.A3mstC.DQRCU}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3mstC.DQRCU\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.A3mstC.DQRLSAN}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3mstC.DQRLSAN\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.A3mstC.REEVAPCN}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3mstC.REEVAPCN\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.A3mstC.REEVAPLS}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A3mstC.REEVAPLS\_itp}\left( \mathtt{GEOSFP.t\_ref} + t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.P}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.P\_unit} DataInterpolations.LinearInterpolation{Vector{Float64}, UnitRange{Int64}, Vector{Float64}, Vector{Float64}, Float64}([0.0, 4.804826, 659.3752000000001, 1313.48, 1961.311, 2609.201, 3257.081, 3898.201, 4533.901, 5169.611, 5805.321, 6436.264, 7062.197999999999, 7883.4220000000005, 8909.992, 9936.521, 10918.17, 11895.86, 12869.59, 14291.0, 15626.0, 16960.9, 18161.9, 19309.7, 20325.899999999998, 21215.0, 21877.600000000002, 22389.8, 22436.3, 21686.5, 20119.2, 17693.0, 15039.3, 12783.7, 10866.3, 9236.572, 7851.231, 6660.340999999999, 5638.791, 4764.391, 4017.541, 3381.0009999999997, 2836.781, 2373.0409999999997, 1979.1599999999999, 1645.71, 1364.34, 1127.69, 929.2942, 761.9842, 621.6801, 504.68010000000004, 407.6571, 327.6431, 262.0211, 208.497, 165.079, 130.05100000000002, 101.94399999999999, 79.51341, 61.677910000000004, 47.58061, 36.50411, 27.85261, 21.134900000000002, 15.9495, 11.9703, 8.934502, 6.600001, 4.758501, 3.27, 2.0, 1.0], 1:73, Float64[], DataInterpolations.LinearParameterCache{Vector{Float64}}(Float64[]), DataInterpolations.ExtrapolationType.None, DataInterpolations.ExtrapolationType.None, FindFirstFunctions.Guesser{UnitRange{Int64}}(1:73, Base.RefValue{Int64}(1), true), false, true)\left( \mathtt{lev} \right) + \mathtt{GEOSFP.I3.PS}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) DataInterpolations.LinearInterpolation{Vector{Float64}, UnitRange{Int64}, Vector{Float64}, Vector{Float64}, Float64}([1.0, 0.984952, 0.963406, 0.941865, 0.920387, 0.898908, 0.877429, 0.856018, 0.8346609, 0.8133039, 0.7919469, 0.7706375, 0.7493782, 0.721166, 0.6858999, 0.6506349, 0.6158184, 0.5810415, 0.5463042, 0.4945902, 0.4437402, 0.3928911, 0.3433811, 0.2944031, 0.2467411, 0.2003501, 0.1562241, 0.1136021, 0.06372006, 0.02801004, 0.006960025, 8.175413e-9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 1:73, Float64[], DataInterpolations.LinearParameterCache{Vector{Float64}}(Float64[]), DataInterpolations.ExtrapolationType.None, DataInterpolations.ExtrapolationType.None, FindFirstFunctions.Guesser{UnitRange{Int64}}(1:73, Base.RefValue{Int64}(1), true), false, true)\left( \mathtt{lev} \right) \\ \mathtt{GEOSFP.Tv}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.I3.T}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \left( 1 + 0.61 \mathtt{GEOSFP.I3.QV}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \right) \\ \mathtt{GEOSFP.Tv\_sfc}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.A1.T2M}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \left( 1 + 0.61 \mathtt{GEOSFP.A1.QV2M}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \right) \\ \mathtt{GEOSFP.T\bar{v}}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= 0.5 \left( \mathtt{GEOSFP.Tv}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) + \mathtt{GEOSFP.Tv\_sfc}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \right) \\ \mathtt{GEOSFP.Z\_agl}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \frac{\mathtt{GEOSFP.Rd} \log\left( \frac{\mathtt{GEOSFP.I3.PS}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right)}{\mathtt{GEOSFP.P\_unit} DataInterpolations.LinearInterpolation{Vector{Float64}, UnitRange{Int64}, Vector{Float64}, Vector{Float64}, Float64}([0.0, 4.804826, 659.3752000000001, 1313.48, 1961.311, 2609.201, 3257.081, 3898.201, 4533.901, 5169.611, 5805.321, 6436.264, 7062.197999999999, 7883.4220000000005, 8909.992, 9936.521, 10918.17, 11895.86, 12869.59, 14291.0, 15626.0, 16960.9, 18161.9, 19309.7, 20325.899999999998, 21215.0, 21877.600000000002, 22389.8, 22436.3, 21686.5, 20119.2, 17693.0, 15039.3, 12783.7, 10866.3, 9236.572, 7851.231, 6660.340999999999, 5638.791, 4764.391, 4017.541, 3381.0009999999997, 2836.781, 2373.0409999999997, 1979.1599999999999, 1645.71, 1364.34, 1127.69, 929.2942, 761.9842, 621.6801, 504.68010000000004, 407.6571, 327.6431, 262.0211, 208.497, 165.079, 130.05100000000002, 101.94399999999999, 79.51341, 61.677910000000004, 47.58061, 36.50411, 27.85261, 21.134900000000002, 15.9495, 11.9703, 8.934502, 6.600001, 4.758501, 3.27, 2.0, 1.0], 1:73, Float64[], DataInterpolations.LinearParameterCache{Vector{Float64}}(Float64[]), DataInterpolations.ExtrapolationType.None, DataInterpolations.ExtrapolationType.None, FindFirstFunctions.Guesser{UnitRange{Int64}}(1:73, Base.RefValue{Int64}(1), true), false, true)\left( 0.5 + \mathtt{lev} \right) + \mathtt{GEOSFP.I3.PS}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) DataInterpolations.LinearInterpolation{Vector{Float64}, UnitRange{Int64}, Vector{Float64}, Vector{Float64}, Float64}([1.0, 0.984952, 0.963406, 0.941865, 0.920387, 0.898908, 0.877429, 0.856018, 0.8346609, 0.8133039, 0.7919469, 0.7706375, 0.7493782, 0.721166, 0.6858999, 0.6506349, 0.6158184, 0.5810415, 0.5463042, 0.4945902, 0.4437402, 0.3928911, 0.3433811, 0.2944031, 0.2467411, 0.2003501, 0.1562241, 0.1136021, 0.06372006, 0.02801004, 0.006960025, 8.175413e-9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 1:73, Float64[], DataInterpolations.LinearParameterCache{Vector{Float64}}(Float64[]), DataInterpolations.ExtrapolationType.None, DataInterpolations.ExtrapolationType.None, FindFirstFunctions.Guesser{UnitRange{Int64}}(1:73, Base.RefValue{Int64}(1), true), false, true)\left( 0.5 + \mathtt{lev} \right)} \right) \mathtt{GEOSFP.T\bar{v}}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right)}{\mathtt{GEOSFP.g}} \\ \mathtt{GEOSFP.{\delta}x{\delta}lon}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.lon2m} \cos\left( \mathtt{lat} \right) \\ \mathtt{GEOSFP.{\delta}y{\delta}lat}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.lat2meters} \\ \mathtt{GEOSFP.{\delta}P{\delta}lev}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \mathtt{GEOSFP.P\_unit} derivative\left( Interpolation\_interp, \mathtt{lev}, 1 \right) + \mathtt{GEOSFP.I3.PS}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) derivative\left( Interpolation\_interp, \mathtt{lev}, 1 \right) \end{align} \]
Now, finally, we can run the simulation and plot the GEOS-FP wind fields in the result:
(The code below is commented out because it is very slow right now. A faster solution is coming soon!)
# discretization = MOLFiniteDifference([lat => 10, lon => 10, lev => 10], t, approx_order=2)
# @time pdeprob = discretize(pde_sys, discretization)
# pdesol = solve(pdeprob, Tsit5(), saveat=3600.0)
# discrete_lon = pdesol[lon]
# discrete_lat = pdesol[lat]
# discrete_lev = pdesol[lev]
# discrete_t = pdesol[t]
# @variables meanwind₊u(..) meanwind₊v(..) examplesys₊c(..)
# sol_u = pdesol[meanwind₊u(t, lat, lon, lev)]
# sol_v = pdesol[meanwind₊v(t, lat, lon, lev)]
# sol_c = pdesol[examplesys₊c(t, lat, lon, lev)]
# anim = @animate for k in 1:length(discrete_t)
# p1 = heatmap(discrete_lon, discrete_lat, sol_c[k, 1:end, 1:end, 2], clim=(minimum(sol_c[:, :, :, 2]), maximum(sol_c[:, :, :, 2])),
# xlabel="Longitude", ylabel="Latitude", title="examplesys.c: $(Dates.unix2datetime(discrete_t[k]))")
# p2 = heatmap(discrete_lon, discrete_lat, sol_u[k, 1:end, 1:end, 2], clim=(minimum(sol_u[:, :, :, 2]), maximum(sol_u[:, :, :, 2])),
# title="U")
# p3 = heatmap(discrete_lon, discrete_lat, sol_v[k, 1:end, 1:end, 2], clim=(minimum(sol_v[:, :, :, 2]), maximum(sol_v[:, :, :, 2])),
# title="V")
# plot(p1, p2, p3, size=(800, 500))
# end
# gif(anim, "animation.gif", fps = 8)