diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 236e15fb9a..90a6e8237a 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -25,13 +25,13 @@ steps: - "julia --project=.buildkite -e 'using Pkg; Pkg.develop(;path=\".\"); Pkg.instantiate(;verbose=true)'" - "julia --project=.buildkite -e 'using Pkg; Pkg.status()'" - - echo "--- Instantiate test" - - "julia --project=test -e 'using Pkg; Pkg.develop(;path=\".\"); Pkg.instantiate(;verbose=true)'" - - "julia --project=test -e 'using Pkg; Pkg.status()'" + # - echo "--- Instantiate test" + # - "julia --project=test -e 'using Pkg; Pkg.develop(;path=\".\"); Pkg.instantiate(;verbose=true)'" + # - "julia --project=test -e 'using Pkg; Pkg.status()'" - - echo "--- Instantiate lib/ClimaLandSimulations" - - "julia --project=lib/ClimaLandSimulations -e 'using Pkg; Pkg.develop(;path=\".\"); Pkg.instantiate(;verbose=true)'" - - "julia --project=lib/ClimaLandSimulations -e 'using Pkg; Pkg.status()'" + # - echo "--- Instantiate lib/ClimaLandSimulations" + # - "julia --project=lib/ClimaLandSimulations -e 'using Pkg; Pkg.develop(;path=\".\"); Pkg.instantiate(;verbose=true)'" + # - "julia --project=lib/ClimaLandSimulations -e 'using Pkg; Pkg.status()'" agents: slurm_gpus: 1 @@ -41,177 +41,184 @@ steps: - wait - - group: "Experiments" - steps: - - label: "Snow Col de Porte" - command: "julia --color=yes --project=.buildkite experiments/standalone/Snow/snowmip_simulation.jl cdp" - artifact_paths: "experiments/standalone/Snow/*png" - - - label: "Varying LAI, no stem compartment" - command: "julia --color=yes --project=.buildkite experiments/standalone/Vegetation/varying_lai.jl" - artifact_paths: "experiments/standalone/Vegetation/varying_lai_no_stem*png" - - - label: "Varying LAI, with stem compartment" - command: "julia --color=yes --project=.buildkite experiments/standalone/Vegetation/varying_lai_with_stem.jl" - artifact_paths: "experiments/standalone/Vegetation/varying_lai_with_stem*png" - - - label: "zero LAI, zero SAI" - command: "julia --color=yes --project=.buildkite experiments/standalone/Vegetation/no_vegetation.jl" - artifact_paths: "experiments/standalone/Vegetation/no_veg*png" - - - label: "Richards comparison to Bonan" - command: "julia --color=yes --project=.buildkite experiments/standalone/Soil/richards_comparison.jl" - artifact_paths: "experiments/standalone/Soil/cpu/comparison*png" - - - label: "Richards comparison to Bonan: GPU" - command: "julia --color=yes --project=.buildkite experiments/standalone/Soil/richards_comparison.jl" - artifact_paths: "experiments/standalone/Soil/gpu/comparison*png" - agents: - slurm_ntasks: 1 - slurm_gres: "gpu:1" - env: - CLIMACOMMS_DEVICE: "CUDA" - - - label: "vaira_test" - command: "julia --color=yes --project=.buildkite experiments/integrated/fluxnet/run_fluxnet.jl US-Var" - artifact_paths: "experiments/integrated/fluxnet/US-Var/out/*png" - - - label: "ozark_test" - command: "julia --color=yes --project=.buildkite experiments/integrated/fluxnet/run_fluxnet.jl US-MOz" - artifact_paths: "experiments/integrated/fluxnet/US-MOz/out/*png" - - - label: "niwot_test" - command: "julia --color=yes --project=.buildkite experiments/integrated/fluxnet/run_fluxnet.jl US-NR1" - artifact_paths: "experiments/integrated/fluxnet/US-NR1/out/*png" - - - label: "harvard_test" - command: "julia --color=yes --project=.buildkite experiments/integrated/fluxnet/run_fluxnet.jl US-Ha1" - artifact_paths: "experiments/integrated/fluxnet/US-Ha1/out/*png" - - - label: "ozark_pft" - command: "julia --color=yes --project=.buildkite experiments/integrated/fluxnet/ozark_pft.jl" - artifact_paths: "experiments/integrated/fluxnet/US-MOz/out/pft/*png" - - - label: "ozark_conservation" - command: "julia --color=yes --project=.buildkite experiments/integrated/performance/conservation/ozark_conservation.jl" - artifact_paths: "experiments/integrated/performance/conservation/*png" - - - label: "soil/canopy lsm performance" - command: "julia --color=yes --project=.buildkite experiments/integrated/performance/profile_allocations.jl" - artifact_paths: "experiments/integrated/performance/*cpu*html" - - - label: "Soilbiogeochem" - command: "julia --color=yes --project=.buildkite experiments/standalone/Biogeochemistry/experiment.jl" - - - label: "Water conservation" - command: "julia --color=yes --project=.buildkite experiments/standalone/Soil/water_conservation.jl" - artifact_paths: "experiments/standalone/Soil/water_conservation*png" - - - label: "Water conservation in Full Soil Model" - command: "julia --color=yes --project=.buildkite experiments/standalone/Soil/water_energy_conservation.jl" - artifact_paths: "experiments/standalone/Soil/*full_soil_*png" - - - label: "Richards Runoff CPU" - command: "julia --color=yes --project=.buildkite experiments/standalone/Soil/richards_runoff.jl" - artifact_paths: "experiments/standalone/Soil/artifacts/cpu/*png" - agents: - slurm_mem: 16G - - - label: "Global Run CPU" - command: "julia --color=yes --project=.buildkite experiments/integrated/global/global_soil_canopy.jl" - artifact_paths: "experiments/integrated/global/plots/*png" - agents: - slurm_mem: 16G - - - group: "Experiments on GPU" - steps: - - label: "Richards Runoff GPU" - command: "julia --color=yes --project=.buildkite experiments/standalone/Soil/richards_runoff.jl" - artifact_paths: "experiments/standalone/Soil/artifacts/gpu/*png" - agents: - slurm_ntasks: 1 - slurm_gres: "gpu:1" - env: - CLIMACOMMS_DEVICE: "CUDA" - - - group: "ClimaLandSimulations" - steps: - - label: "Ozark figures Makie" - command: "julia --color=yes --project=lib/ClimaLandSimulations lib/ClimaLandSimulations/experiments/ozark.jl" - artifact_paths: "figures/*pdf" + # - group: "Experiments" + # steps: + # - label: "Snow Col de Porte" + # command: "julia --color=yes --project=.buildkite experiments/standalone/Snow/snowmip_simulation.jl cdp" + # artifact_paths: "experiments/standalone/Snow/*png" + + # - label: "Varying LAI, no stem compartment" + # command: "julia --color=yes --project=.buildkite experiments/standalone/Vegetation/varying_lai.jl" + # artifact_paths: "experiments/standalone/Vegetation/varying_lai_no_stem*png" + + # - label: "Varying LAI, with stem compartment" + # command: "julia --color=yes --project=.buildkite experiments/standalone/Vegetation/varying_lai_with_stem.jl" + # artifact_paths: "experiments/standalone/Vegetation/varying_lai_with_stem*png" + + # - label: "zero LAI, zero SAI" + # command: "julia --color=yes --project=.buildkite experiments/standalone/Vegetation/no_vegetation.jl" + # artifact_paths: "experiments/standalone/Vegetation/no_veg*png" + + # - label: "Richards comparison to Bonan" + # command: "julia --color=yes --project=.buildkite experiments/standalone/Soil/richards_comparison.jl" + # artifact_paths: "experiments/standalone/Soil/cpu/comparison*png" + + # - label: "Richards comparison to Bonan: GPU" + # command: "julia --color=yes --project=.buildkite experiments/standalone/Soil/richards_comparison.jl" + # artifact_paths: "experiments/standalone/Soil/gpu/comparison*png" + # agents: + # slurm_ntasks: 1 + # slurm_gres: "gpu:1" + # env: + # CLIMACOMMS_DEVICE: "CUDA" + + # - label: "vaira_test" + # command: "julia --color=yes --project=.buildkite experiments/integrated/fluxnet/run_fluxnet.jl US-Var" + # artifact_paths: "experiments/integrated/fluxnet/US-Var/out/*png" + + # - label: "ozark_test" + # command: "julia --color=yes --project=.buildkite experiments/integrated/fluxnet/run_fluxnet.jl US-MOz" + # artifact_paths: "experiments/integrated/fluxnet/US-MOz/out/*png" + + # - label: "niwot_test" + # command: "julia --color=yes --project=.buildkite experiments/integrated/fluxnet/run_fluxnet.jl US-NR1" + # artifact_paths: "experiments/integrated/fluxnet/US-NR1/out/*png" + + # - label: "harvard_test" + # command: "julia --color=yes --project=.buildkite experiments/integrated/fluxnet/run_fluxnet.jl US-Ha1" + # artifact_paths: "experiments/integrated/fluxnet/US-Ha1/out/*png" + + # - label: "ozark_pft" + # command: "julia --color=yes --project=.buildkite experiments/integrated/fluxnet/ozark_pft.jl" + # artifact_paths: "experiments/integrated/fluxnet/US-MOz/out/pft/*png" + + # - label: "ozark_conservation" + # command: "julia --color=yes --project=.buildkite experiments/integrated/performance/conservation/ozark_conservation.jl" + # artifact_paths: "experiments/integrated/performance/conservation/*png" + + # - label: "soil/canopy lsm performance" + # command: "julia --color=yes --project=.buildkite experiments/integrated/performance/profile_allocations.jl" + # artifact_paths: "experiments/integrated/performance/*cpu*html" + + # - label: "Soilbiogeochem" + # command: "julia --color=yes --project=.buildkite experiments/standalone/Biogeochemistry/experiment.jl" + + # - label: "Water conservation" + # command: "julia --color=yes --project=.buildkite experiments/standalone/Soil/water_conservation.jl" + # artifact_paths: "experiments/standalone/Soil/water_conservation*png" + + # - label: "Water conservation in Full Soil Model" + # command: "julia --color=yes --project=.buildkite experiments/standalone/Soil/water_energy_conservation.jl" + # artifact_paths: "experiments/standalone/Soil/*full_soil_*png" + + # - label: "Richards Runoff CPU" + # command: "julia --color=yes --project=.buildkite experiments/standalone/Soil/richards_runoff.jl" + # artifact_paths: "experiments/standalone/Soil/artifacts/cpu/*png" + # agents: + # slurm_mem: 16G + + # - label: "Global Run CPU" + # command: "julia --color=yes --project=.buildkite experiments/integrated/global/global_soil_canopy.jl" + # artifact_paths: "experiments/integrated/global/plots/*png" + # agents: + # slurm_mem: 16G + + # - group: "Experiments on GPU" + # steps: + # - label: "Richards Runoff GPU" + # command: "julia --color=yes --project=.buildkite experiments/standalone/Soil/richards_runoff.jl" + # artifact_paths: "experiments/standalone/Soil/artifacts/gpu/*png" + # agents: + # slurm_ntasks: 1 + # slurm_gres: "gpu:1" + # env: + # CLIMACOMMS_DEVICE: "CUDA" + + # - group: "ClimaLandSimulations" + # steps: + # - label: "Ozark figures Makie" + # command: "julia --color=yes --project=lib/ClimaLandSimulations lib/ClimaLandSimulations/experiments/ozark.jl" + # artifact_paths: "figures/*pdf" - group: "CPU: global bucket" steps: - - label: "Global Bucket on CPU (functional albedo)" - key: "global_bucket_function_cpu" - command: "julia --color=yes --project=.buildkite experiments/standalone/Bucket/global_bucket_function.jl" - artifact_paths: - - "experiments/standalone/Bucket/artifacts/*cpu*" - - "experiments/global_bucket_function/output_active/*.png" - - - label: "Global Bucket on CPU (static map albedo)" - key: "global_bucket_staticmap_cpu" - command: "julia --color=yes --project=.buildkite experiments/standalone/Bucket/global_bucket_staticmap.jl" - artifact_paths: "experiments/standalone/Bucket/artifacts_staticmap/*cpu*" - - - label: "Global Bucket on CPU (temporal map albedo)" - key: "global_bucket_temporalmap_cpu" - command: "julia --color=yes --project=.buildkite experiments/standalone/Bucket/global_bucket_temporalmap.jl" - artifact_paths: "experiments/standalone/Bucket/artifacts_temporalmap/*cpu*" - - - group: "GPU: unit tests and global bucket" - steps: - - label: "GPU runtests" - command: "julia --color=yes --project=test test/runtests.jl" - agents: - slurm_ntasks: 1 - slurm_gres: "gpu:p100:1" - - - label: "soil/canopy lsm performance on GPU" - command: "julia --color=yes --project=.buildkite experiments/integrated/performance/profile_allocations.jl" - agents: - slurm_ntasks: 1 - slurm_gres: "gpu:p100:1" - artifact_paths: "experiments/integrated/performance/*gpu*html" - - - label: "Global Bucket on GPU (functional albedo)" - key: "global_bucket_function_gpu" - command: "julia --color=yes --project=.buildkite experiments/standalone/Bucket/global_bucket_function.jl" - agents: - slurm_ntasks: 1 - slurm_gres: "gpu:p100:1" - env: - CLIMACOMMS_DEVICE: "CUDA" - artifact_paths: "experiments/standalone/Bucket/artifacts/*gpu*" - - - label: "Global Bucket on GPU (static map albedo)" - key: "global_bucket_staticmap_gpu" + # - label: "Global Bucket on CPU (functional albedo)" + # key: "global_bucket_function_cpu" + # command: "julia --color=yes --project=.buildkite experiments/standalone/Bucket/global_bucket_function.jl" + # artifact_paths: + # - "experiments/standalone/Bucket/artifacts/*cpu*" + # - "experiments/global_bucket_function/output_active/*.png" + + # - label: "Global Bucket on CPU (static map albedo)" + # key: "global_bucket_staticmap_cpu" + # command: "julia --color=yes --project=.buildkite experiments/standalone/Bucket/global_bucket_staticmap.jl" + # artifact_paths: "experiments/standalone/Bucket/artifacts_staticmap/*cpu*" + + - label: "Regional Bucket on CPU (static map albedo)" + key: "regional_bucket_staticmap_cpu" command: "julia --color=yes --project=.buildkite experiments/standalone/Bucket/global_bucket_staticmap.jl" - agents: - slurm_ntasks: 1 - slurm_gres: "gpu:p100:1" + artifact_paths: "experiments/standalone/Bucket/artifacts_staticmap_regional/*cpu*" env: - CLIMACOMMS_DEVICE: "CUDA" - artifact_paths: "experiments/standalone/Bucket/artifacts_staticmap/*gpu*" - - - label: "Global Bucket on GPU (temporal map albedo)" - key: "global_bucket_temporalmap_gpu" - command: "julia --color=yes --project=.buildkite experiments/standalone/Bucket/global_bucket_temporalmap.jl" - agents: - slurm_ntasks: 1 - slurm_gres: "gpu:p100:1" - env: - CLIMACOMMS_DEVICE: "CUDA" - artifact_paths: "experiments/standalone/Bucket/artifacts_temporalmap/*gpu*" - - - group: "CPU/GPU comparisons" - steps: - - label: "Compare GPU bucket with CPU bucket" - command: "julia --color=yes --project=.buildkite experiments/standalone/Bucket/compare_gpu_cpu_output.jl" - depends_on: - - "global_bucket_function_cpu" - - "global_bucket_function_gpu" - - "global_bucket_staticmap_cpu" - - "global_bucket_staticmap_gpu" - - "global_bucket_temporalmap_cpu" - - "global_bucket_temporalmap_gpu" + CLIMALAND_CI_REGIONAL_BUCKET: true + + # - label: "Global Bucket on CPU (temporal map albedo)" + # key: "global_bucket_temporalmap_cpu" + # command: "julia --color=yes --project=.buildkite experiments/standalone/Bucket/global_bucket_temporalmap.jl" + # artifact_paths: "experiments/standalone/Bucket/artifacts_temporalmap/*cpu*" + + # - group: "GPU: unit tests and global bucket" + # steps: + # - label: "GPU runtests" + # command: "julia --color=yes --project=test test/runtests.jl" + # agents: + # slurm_ntasks: 1 + # slurm_gres: "gpu:p100:1" + + # - label: "soil/canopy lsm performance on GPU" + # command: "julia --color=yes --project=.buildkite experiments/integrated/performance/profile_allocations.jl" + # agents: + # slurm_ntasks: 1 + # slurm_gres: "gpu:p100:1" + # artifact_paths: "experiments/integrated/performance/*gpu*html" + + # - label: "Global Bucket on GPU (functional albedo)" + # key: "global_bucket_function_gpu" + # command: "julia --color=yes --project=.buildkite experiments/standalone/Bucket/global_bucket_function.jl" + # agents: + # slurm_ntasks: 1 + # slurm_gres: "gpu:p100:1" + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # artifact_paths: "experiments/standalone/Bucket/artifacts/*gpu*" + + # - label: "Global Bucket on GPU (static map albedo)" + # key: "global_bucket_staticmap_gpu" + # command: "julia --color=yes --project=.buildkite experiments/standalone/Bucket/global_bucket_staticmap.jl" + # agents: + # slurm_ntasks: 1 + # slurm_gres: "gpu:p100:1" + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # artifact_paths: "experiments/standalone/Bucket/artifacts_staticmap/*gpu*" + + # - label: "Global Bucket on GPU (temporal map albedo)" + # key: "global_bucket_temporalmap_gpu" + # command: "julia --color=yes --project=.buildkite experiments/standalone/Bucket/global_bucket_temporalmap.jl" + # agents: + # slurm_ntasks: 1 + # slurm_gres: "gpu:p100:1" + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # artifact_paths: "experiments/standalone/Bucket/artifacts_temporalmap/*gpu*" + + # - group: "CPU/GPU comparisons" + # steps: + # - label: "Compare GPU bucket with CPU bucket" + # command: "julia --color=yes --project=.buildkite experiments/standalone/Bucket/compare_gpu_cpu_output.jl" + # depends_on: + # - "global_bucket_function_cpu" + # - "global_bucket_function_gpu" + # - "global_bucket_staticmap_cpu" + # - "global_bucket_staticmap_gpu" + # - "global_bucket_temporalmap_cpu" + # - "global_bucket_temporalmap_gpu" diff --git a/experiments/standalone/Bucket/global_bucket_staticmap.jl b/experiments/standalone/Bucket/global_bucket_staticmap.jl index 924f948425..edcbcf814f 100644 --- a/experiments/standalone/Bucket/global_bucket_staticmap.jl +++ b/experiments/standalone/Bucket/global_bucket_staticmap.jl @@ -1,7 +1,7 @@ # # Global bucket run using spatial map albedo # The code sets up and runs the bucket for 7 days using albedo read in from -# a file containing static data over the globe, and analytic atmospheric and +# a file containing static data over the globe or on a region, and analytic atmospheric and # radiative forcings. # Moving forward, this driver will serve as our more complex global bucket run, # eventually running for a longer time period (1+ year) and using temporally @@ -63,26 +63,43 @@ function compute_clims(v) return (minimum(means) - maximum(sigmas), maximum(means) + maximum(sigmas)) end -anim_plots = true +anim_plots = false +regional_simulation = haskey(ENV, "CLIMALAND_CI_REGIONAL_BUCKET") +regional_str = regional_simulation ? "_regional" : "" regridder_type = :InterpolationsRegridder FT = Float64; context = ClimaComms.context() earth_param_set = LP.LandParameters(FT); outdir = joinpath( pkgdir(ClimaLand), - "experiments/standalone/Bucket/artifacts_staticmap", + "experiments/standalone/Bucket/artifacts_staticmap$(regional_str)", ) !ispath(outdir) && mkpath(outdir) # Set up simulation domain soil_depth = FT(3.5); -bucket_domain = ClimaLand.Domains.SphericalShell(; - radius = FT(6.3781e6), - depth = soil_depth, - nelements = (30, 10), - npolynomial = 1, - dz_tuple = FT.((1.0, 0.05)), -); +if regional_simulation + @info "Running regional simulation" + center_long, center_lat = FT(-118.14452), FT(34.14778) + # Half size of the grid in meters + delta_m = FT(50_000) + bucket_domain = ClimaLand.Domains.HybridBox(; + xlim = (delta_m, delta_m), + ylim = (delta_m, delta_m), + zlim = (-soil_depth, FT(0.0)), + longlat = (center_long, center_lat), + nelements = (30, 30, 10), + npolynomial = 1, + ) +else + bucket_domain = ClimaLand.Domains.SphericalShell(; + radius = FT(6.3781e6), + depth = soil_depth, + nelements = (30, 10), + npolynomial = 1, + dz_tuple = FT.((1.0, 0.05)), + ) +end ref_time = DateTime(2021); # Set up parameters @@ -258,8 +275,14 @@ sol = ClimaComms.@time ClimaComms.device() SciMLBase.solve( # Interpolate to grid space = axes(coords.surface) -longpts = range(-180.0, 180.0, 21) -latpts = range(-90.0, 90.0, 21) +num_pts = 21 +if regional_simulation + longpts = range(bucket_domain.surface.xlim..., num_pts) + latpts = range(bucket_domain.surface.ylim..., num_pts) +else + longpts = range(-180.0, 180.0, num_pts) + latpts = range(-90.0, 90.0, num_pts) +end hcoords = [Geometry.LatLongPoint(lat, long) for long in longpts, lat in latpts] remapper = Remapping.Remapper(space, hcoords) diff --git a/test/shared_utilities/domains.jl b/test/shared_utilities/domains.jl index eea62d162f..d4c343ffb4 100644 --- a/test/shared_utilities/domains.jl +++ b/test/shared_utilities/domains.jl @@ -128,6 +128,7 @@ FT = Float32 @test obtain_surface_domain(box) == Plane{FT}( xlim, ylim, + nothing, nelements[1:2], (true, true), 0, @@ -169,24 +170,82 @@ FT = Float32 ClimaCore.Spaces.SpectralElementSpace2D # Plane latlong + dxlim = (FT(-50_000), FT(80_000)) + dylim = (FT(-30_000), FT(40_000)) + longlat = (FT(-118.14452), FT(34.14778)) + radius_earth = FT(6.378e6) + xlim_longlat = ( + longlat[1] - dxlim[1] / 2radius_earth, + longlat[1] + dxlim[2] / 2radius_earth, + ) + ylim_longlat = ( + longlat[2] - dylim[1] / 2radius_earth, + longlat[2] + dylim[2] / (2radius_earth), + ) + longlat_plane = Plane(; - xlim = xlim, - ylim = ylim, - longlat = (FT(-118.14452), FT(34.14778)), + xlim = dxlim, + ylim = dylim, + longlat, nelements = nelements[1:2], npolynomial = 0, ) plane_coords = coordinates(longlat_plane).surface - @test eltype(plane_coords) == ClimaCore.Geometry.LongLatPoint{FT} + @test eltype(plane_coords) == ClimaCore.Geometry.LatLongPoint{FT} @test typeof(plane_coords) <: ClimaCore.Fields.Field - @test xy_plane.xlim == FT.(xlim) - @test xy_plane.ylim == FT.(ylim) - @test xy_plane.nelements == nelements[1:2] - @test xy_plane.npolynomial == 0 - @test xy_plane.periodic == (false, false) - @test typeof(xy_plane.space.surface) <: + @test longlat_plane.xlim == FT.(xlim_longlat) + @test longlat_plane.ylim == FT.(ylim_longlat) + @test longlat_plane.nelements == nelements[1:2] + @test longlat_plane.npolynomial == 0 + @test longlat_plane.periodic == (false, false) + @test typeof(longlat_plane.space.surface) <: ClimaCore.Spaces.SpectralElementSpace2D + # Box latlong + longlat_box = HybridBox(; + xlim = dxlim, + ylim = dylim, + zlim = zlim, + longlat, + nelements = nelements, + npolynomial = 0, + ) + @test longlat_box.fields.z == + ClimaCore.Fields.coordinate_field(longlat_box.space.subsurface).z + face_space = obtain_face_space(longlat_box.space.subsurface) + z_face = ClimaCore.Fields.coordinate_field(face_space).z + @test longlat_box.fields.z_sfc == + top_face_to_surface(z_face, longlat_box.space.surface) + Δz_top, Δz_bottom = get_Δz(longlat_box.fields.z) + @test longlat_box.fields.Δz_top == Δz_top + @test longlat_box.fields.Δz_bottom == Δz_bottom + longlat_box_coords = coordinates(longlat_box).subsurface + @test eltype(longlat_box_coords) == ClimaCore.Geometry.LatLongZPoint{FT} + @test typeof(longlat_box_coords) <: ClimaCore.Fields.Field + @test longlat_box.xlim == FT.(xlim_longlat) + @test longlat_box.ylim == FT.(ylim_longlat) + @test longlat_box.zlim == FT.(zlim) + @test longlat_box.nelements == nelements + @test longlat_box.npolynomial == 0 + @test longlat_box.periodic == (false, false) + @test typeof( + ClimaCore.Spaces.horizontal_space(longlat_box.space.subsurface), + ) <: ClimaCore.Spaces.SpectralElementSpace2D + @test typeof(longlat_box.space.subsurface) <: + ClimaCore.Spaces.CenterExtrudedFiniteDifferenceSpace + @test typeof(longlat_box.space.surface) <: + ClimaCore.Spaces.SpectralElementSpace2D + @test obtain_surface_space(longlat_box.space.subsurface) == + longlat_box.space.surface + @test obtain_surface_domain(longlat_box) == Plane{FT}( + xlim_longlat, + ylim_longlat, + longlat, + nelements[1:2], + (false, false), + 0, + (; surface = longlat_box.space.surface), + ) # Column