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) &= \mathtt{I3.T}\left( t \right) ~ \left( 1 + 0.61 ~ \mathtt{I3.QV}\left( t \right) \right) \\ \mathtt{Tv\_sfc}\left( t \right) &= \mathtt{A1.T2M}\left( t \right) ~ \left( 1 + 0.61 ~ \mathtt{A1.QV2M}\left( t \right) \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) + 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) ~ \mathtt{I3.PS}\left( t \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) + derivative\left( Interpolation\_interp, \mathtt{lev}, 1 \right) ~ \mathtt{I3.PS}\left( t \right) \\ \mathtt{{\delta}Z{\delta}lev}\left( t \right) &= \frac{\left( - \mathtt{P\_unit} ~ derivative\left( Interpolation\_interp, 0.5 + \mathtt{lev}, 1 \right) - derivative\left( Interpolation\_interp, 0.5 + \mathtt{lev}, 1 \right) ~ \mathtt{I3.PS}\left( t \right) \right) ~ \mathtt{Rd} ~ \mathtt{T\bar{v}}\left( t \right)}{\left( \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) + 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) ~ \mathtt{I3.PS}\left( t \right) \right) ~ g} \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]
)
81×3 DataFrame
RowNameUnitsDescription
StringDimensio…String
1A3dyn₊DTRAINm⁻² kg s⁻²Detrainment cloud mass flux
2A3dyn₊OMEGAm⁻¹ kg s⁻³Vertical pressure velocity
3A3dyn₊RHRelative humidity
4A3dyn₊Um s⁻¹Eastward component of wind
5A3dyn₊Vm s⁻¹Northward component of wind
6A3cld₊CLOUDTotal cloud fraction in grid box
7A3cld₊OPTDEPTHTotal in-cloud optical thickness (visible band)
8A3cld₊QCCUCloud condensate mixing ratio, convective updraft
9A3cld₊QICloud ice water mixing ratio
10A3cld₊QLCloud liquid water mixing ratio
11A3cld₊TAUCLIIn-cloud ice optical thickness (visible band)
12A3cld₊TAUCLWIn-cloud water optical thickness (visible band)
13I3₊PSm⁻¹ kg s⁻²Surface pressure
14I3₊PVm⁻² kg⁻¹ s⁻¹ KErtel potential vorticity
15I3₊QVSpecific humidity
16I3₊TKTemperature
17A3mstE₊CMFMCm⁻² kg s⁻²Upward moist convective mass flux
18A3mstE₊PFICUm⁻² kg s⁻¹Downward flux of ice precipitation (convective)
19A3mstE₊PFILSANm⁻² kg s⁻¹Downward flux of ice precipitation (large scale + anvil)
20A3mstE₊PFLCUm⁻² kg s⁻¹Downward flux of liquid precipitation (convective)
21A3mstE₊PFLLSANm⁻² kg s⁻¹Downward flux of liquid precipitation (large scale + anvil)
22A1₊ALBEDOSurface albedo
23A1₊CLDTOTTotal cloud fraction
24A1₊EFLUXkg s⁻³Latent heat flux (positive upward)
25A1₊EVAPm⁻² kg s⁻²Surface evaporation
26A1₊FRSEAICEFraction of sea ice on surface
27A1₊FRSNOFractional snow-covered area
28A1₊GRNVegetation greenness fraction
29A1₊GWETROOTRoot zone soil wetness
30A1₊GWETTOPTop soil wetness
31A1₊HFLUXkg s⁻³Sensible heat flux (positive upward)
32A1₊LAILeaf area index
33A1₊LWILand/water/ice flags
34A1₊LWGNTkg s⁻³Net longwave flux at the ground
35A1₊LWTUPkg s⁻³Upward longwave flux at top of atmosphere (TOA)
36A1₊PARDFkg s⁻³Surface downward PAR diffuse flux
37A1₊PARDRkg s⁻³Surface downward PAR beam flux
38A1₊PBLHmPlanetary boundary layer height above surface
39A1₊PRECANVm⁻² kg s⁻¹Surface precipitation flux from anvils
40A1₊PRECCONm⁻² kg s⁻¹Surface precipitation flux from convection
41A1₊PRECLSCm⁻² kg s⁻¹Surface precipitation flux from large-scale
42A1₊PRECSNOm⁻² kg s⁻¹Surface precipitation flux from snow
43A1₊PRECTOTm⁻² kg s⁻¹Total surface precipitation flux
44A1₊QV2MSpecific humidity at 2m above the displacement height
45A1₊SEAICE00Fraction of grid box that has 0-10% sea ice coverage
46A1₊SEAICE10Fraction of grid box that has 10-20% sea ice coverage
47A1₊SEAICE20Fraction of grid box that has 20-30% sea ice coverage
48A1₊SEAICE30Fraction of grid box that has 30-40% sea ice coverage
49A1₊SEAICE40Fraction of grid box that has 40-50% sea ice coverage
50A1₊SEAICE50Fraction of grid box that has 50-60% sea ice coverage
51A1₊SEAICE60Fraction of grid box that has 60-70% sea ice coverage
52A1₊SEAICE70Fraction of grid box that has 70-80% sea ice coverage
53A1₊SEAICE80Fraction of grid box that has 80-90% sea ice coverage
54A1₊SEAICE90Fraction of grid box that has 90-100% sea ice coverage
55A1₊SLPm⁻¹ kg s⁻²Sea level pressure
56A1₊SNODPmSnow depth
57A1₊SNOMASm⁻² kgSnow mass
58A1₊SWGDNkg s⁻³Surface incident shortwave flux
59A1₊TO3m⁻² molTotal column ozone
60A1₊TROPPTm⁻¹ kg s⁻²Temperature-based tropopause pressure
61A1₊TSKSurface skin temperature
62A1₊T2MKTemperature 2m above displacement height
63A1₊U10Mm s⁻¹Eastward wind 10m above displacement height
64A1₊USTARm s⁻¹Friction velocity
65A1₊V10Mm s⁻¹Northward wind 10m above displacement height
66A1₊Z0MmRoughness length, momentum
67A1₊T10MKTemperature at 10 m above the displacement height
68A1₊Q850Specific humidity at 850 hPa
69A3mstC₊DQRCUs⁻¹Precipitation production rate -- convective
70A3mstC₊DQRLSANs⁻¹Precipitation production rate -- large scale + anvil
71A3mstC₊REEVAPCNs⁻¹Evaporation of precipitating convective condensate
72A3mstC₊REEVAPLSEvaporation of precipitating large-scale & anvil condensate
73Pm⁻¹ kg s⁻²Pressure
74TvKVirtual temperature
75Tv_sfcKVirtual temperature at 2 m (near-surface)
76Tv̄KLayer-mean virtual temperature
77Z_aglmGeopotential height above ground level
78δxδlonmX gradient with respect to longitude
79δyδlatmY gradient with respect to latitude
80δPδlevm⁻¹ kg s⁻²Pressure gradient with respect to hybrid grid level
81δZδlevm∂Z_agl/∂lev

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{lat} \right) + \sin\left( 6 ~ \mathtt{lon} \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) + 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.I3.PS}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.Tv}\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.I3.T}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \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\_sfc}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) + \mathtt{GEOSFP.Tv}\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) + 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) ~ \mathtt{GEOSFP.I3.PS}\left( t, \mathtt{lon}, \mathtt{lat}, \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) + derivative\left( Interpolation\_interp, \mathtt{lev}, 1 \right) ~ \mathtt{GEOSFP.I3.PS}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \\ \mathtt{GEOSFP.{\delta}Z{\delta}lev}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) &= \frac{\left( - \mathtt{GEOSFP.P\_unit} ~ derivative\left( Interpolation\_interp, 0.5 + \mathtt{lev}, 1 \right) - derivative\left( Interpolation\_interp, 0.5 + \mathtt{lev}, 1 \right) ~ \mathtt{GEOSFP.I3.PS}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \right) ~ \mathtt{GEOSFP.Rd} ~ \mathtt{GEOSFP.T\bar{v}}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right)}{\left( \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) + 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) ~ \mathtt{GEOSFP.I3.PS}\left( t, \mathtt{lon}, \mathtt{lat}, \mathtt{lev} \right) \right) ~ \mathtt{GEOSFP.g}} \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)