@@ -50,7 +50,7 @@ convergence_rate(err, Δh) =
5050 mesh = Meshes. IntervalMesh (domain, stretch_fn, nelems = n)
5151
5252 cs = Spaces. CenterFiniteDifferenceSpace (device, mesh)
53- fs = Spaces. FaceFiniteDifferenceSpace (cs)
53+ fs = Spaces. face_space (cs)
5454
5555 cent_field_exact = zeros (FT, cs)
5656 face_field = zeros (FT, fs)
9898 mesh = Meshes. IntervalMesh (domain, stretch_fn, nelems = n)
9999
100100 cs = Spaces. CenterFiniteDifferenceSpace (device, mesh)
101- fs = Spaces. FaceFiniteDifferenceSpace (cs)
101+ fs = Spaces. face_space (cs)
102102
103103 face_field_exact = zeros (FT, fs)
104104 cent_field = zeros (FT, cs)
150150 mesh = Meshes. IntervalMesh (domain, stretch_fn, nelems = n)
151151
152152 cs = Spaces. CenterFiniteDifferenceSpace (device, mesh)
153- fs = Spaces. FaceFiniteDifferenceSpace (cs)
153+ fs = Spaces. face_space (cs)
154154
155155 face_field_exact = Geometry. Covariant3Vector .(zeros (FT, fs))
156156 cent_field = zeros (FT, cs)
202202 mesh = Meshes. IntervalMesh (domain, stretch_fn, nelems = n)
203203
204204 cs = Spaces. CenterFiniteDifferenceSpace (device, mesh)
205- fs = Spaces. FaceFiniteDifferenceSpace (cs)
205+ fs = Spaces. face_space (cs)
206206
207207 cent_field_exact = Geometry. Covariant3Vector .(zeros (FT, cs))
208208 cent_field = Geometry. Covariant3Vector .(zeros (FT, cs))
258258 mesh = Meshes. IntervalMesh (domain; nelems = n)
259259
260260 cs = Spaces. CenterFiniteDifferenceSpace (device, mesh)
261- fs = Spaces. FaceFiniteDifferenceSpace (cs)
261+ fs = Spaces. face_space (cs)
262262
263263 centers = getproperty (Fields. coordinate_field (cs), :z )
264264 faces = getproperty (Fields. coordinate_field (fs), :z )
409409 @test conv_curl_sin_f[1 ] ≤ conv_curl_sin_f[2 ] ≤ conv_curl_sin_f[3 ]
410410end
411411
412+ @testset " UpwindBiasedGradient on (uniform) periodic mesh, random w" begin
413+ FT = Float64
414+ device = ClimaComms. device ()
415+
416+ n_elems_seq = 2 .^ (5 , 6 , 7 , 8 )
417+ center_errors = zeros (FT, length (n_elems_seq))
418+ face_errors = zeros (FT, length (n_elems_seq))
419+ Δh = zeros (FT, length (n_elems_seq))
420+
421+ for (k, n) in enumerate (n_elems_seq)
422+ domain = Domains. IntervalDomain (
423+ Geometry. ZPoint {FT} (- pi ),
424+ Geometry. ZPoint {FT} (pi );
425+ periodic = true ,
426+ )
427+ mesh = Meshes. IntervalMesh (domain; nelems = n)
428+
429+ center_space = Spaces. CenterFiniteDifferenceSpace (device, mesh)
430+ face_space = Spaces. face_space (center_space)
431+
432+ ᶜw = Geometry. WVector .(map (_ -> 2 * rand () - 1 , ones (center_space)))
433+ ᶠw = Geometry. WVector .(map (_ -> 2 * rand () - 1 , ones (face_space)))
434+
435+ ᶜz = Fields. coordinate_field (center_space). z
436+ ᶠz = Fields. coordinate_field (face_space). z
437+
438+ upwind_biased_grad = Operators. UpwindBiasedGradient ()
439+ ᶜ∇sinz = Geometry. WVector .(upwind_biased_grad .(ᶜw, sin .(ᶜz)))
440+ ᶠ∇sinz = Geometry. WVector .(upwind_biased_grad .(ᶠw, sin .(ᶠz)))
441+
442+ center_errors[k] = norm (ᶜ∇sinz .- Geometry. WVector .(cos .(ᶜz)))
443+ face_errors[k] = norm (ᶠ∇sinz .- Geometry. WVector .(cos .(ᶠz)))
444+ Δh[k] = Spaces. local_geometry_data (face_space). J[vindex (1 )]
445+ end
446+
447+ @test all (error -> error < 0.1 , center_errors)
448+ @test all (error -> error < 0.1 , face_errors)
449+
450+ center_convergence_rates = convergence_rate (center_errors, Δh)
451+ face_convergence_rates = convergence_rate (face_errors, Δh)
452+ @test all (rate -> isapprox (rate, 1 ; atol = 0.01 ), center_convergence_rates)
453+ @test all (rate -> isapprox (rate, 1 ; atol = 0.01 ), face_convergence_rates)
454+ end
412455
413456@testset " Upwind3rdOrderBiasedProductC2F + DivergenceF2C on (uniform) periodic mesh, constant w" begin
414457 FT = Float64
428471 mesh = Meshes. IntervalMesh (domain; nelems = n)
429472
430473 cs = Spaces. CenterFiniteDifferenceSpace (device, mesh)
431- fs = Spaces. FaceFiniteDifferenceSpace (cs)
474+ fs = Spaces. face_space (cs)
432475
433476 centers = getproperty (Fields. coordinate_field (cs), :z )
434477
479522 mesh = Meshes. IntervalMesh (domain; nelems = n)
480523
481524 cs = Spaces. CenterFiniteDifferenceSpace (device, mesh)
482- fs = Spaces. FaceFiniteDifferenceSpace (cs)
525+ fs = Spaces. face_space (cs)
483526
484527 centers = getproperty (Fields. coordinate_field (cs), :z )
485528 faces = getproperty (Fields. coordinate_field (fs), :z )
531574 mesh = Meshes. IntervalMesh (domain, stretch_fn; nelems = n)
532575
533576 cs = Spaces. CenterFiniteDifferenceSpace (device, mesh)
534- fs = Spaces. FaceFiniteDifferenceSpace (cs)
577+ fs = Spaces. face_space (cs)
535578
536579 centers = getproperty (Fields. coordinate_field (cs), :z )
537580
593636 mesh = Meshes. IntervalMesh (domain; nelems = n)
594637
595638 cs = Spaces. CenterFiniteDifferenceSpace (device, mesh)
596- fs = Spaces. FaceFiniteDifferenceSpace (cs)
639+ fs = Spaces. face_space (cs)
597640
598641 centers = getproperty (Fields. coordinate_field (cs), :z )
599642 faces = getproperty (Fields. coordinate_field (fs), :z )
650693 mesh = Meshes. IntervalMesh (domain; nelems = n)
651694
652695 cs = Spaces. CenterFiniteDifferenceSpace (device, mesh)
653- fs = Spaces. FaceFiniteDifferenceSpace (cs)
696+ fs = Spaces. face_space (cs)
654697
655698 centers = getproperty (Fields. coordinate_field (cs), :z )
656699 C = FT (1.0 ) # flux-correction coefficient (falling back to third-order upwinding)
706749 mesh = Meshes. IntervalMesh (domain; nelems = n)
707750
708751 cs = Spaces. CenterFiniteDifferenceSpace (device, mesh)
709- fs = Spaces. FaceFiniteDifferenceSpace (cs)
752+ fs = Spaces. face_space (cs)
710753
711754 centers = getproperty (Fields. coordinate_field (cs), :z )
712755
761804 mesh = Meshes. IntervalMesh (domain; nelems = n)
762805
763806 cs = Spaces. CenterFiniteDifferenceSpace (device, mesh)
764- fs = Spaces. FaceFiniteDifferenceSpace (cs)
807+ fs = Spaces. face_space (cs)
765808
766809 centers = getproperty (Fields. coordinate_field (cs), :z )
767810 C = FT (1.0 ) # flux-correction coefficient (falling back to third-order upwinding)
817860 mesh = Meshes. IntervalMesh (domain; nelems = n)
818861
819862 cs = Spaces. CenterFiniteDifferenceSpace (device, mesh)
820- fs = Spaces. FaceFiniteDifferenceSpace (cs)
863+ fs = Spaces. face_space (cs)
821864
822865 centers = getproperty (Fields. coordinate_field (cs), :z )
823866 C = FT (1.0 ) # flux-correction coefficient (falling back to third-order upwinding)
873916 mesh = Meshes. IntervalMesh (domain, stretch_fn; nelems = n)
874917
875918 cs = Spaces. CenterFiniteDifferenceSpace (device, mesh)
876- fs = Spaces. FaceFiniteDifferenceSpace (cs)
919+ fs = Spaces. face_space (cs)
877920
878921 centers = getproperty (Fields. coordinate_field (cs), :z )
879922 C = FT (1.0 ) # flux-correction coefficient (falling back to third-order upwinding)
944987 mesh = Meshes. IntervalMesh (domain; nelems = n)
945988
946989 cs = Spaces. CenterFiniteDifferenceSpace (device, mesh)
947- fs = Spaces. FaceFiniteDifferenceSpace (cs)
990+ fs = Spaces. face_space (cs)
948991
949992 centers = getproperty (Fields. coordinate_field (cs), :z )
950993 C = FT (1.0 ) # flux-correction coefficient (falling back to third-order upwinding)
@@ -1016,7 +1059,7 @@ end
10161059 mesh = Meshes. IntervalMesh (domain; nelems = n)
10171060
10181061 cs = Spaces. CenterFiniteDifferenceSpace (device, mesh)
1019- fs = Spaces. FaceFiniteDifferenceSpace (cs)
1062+ fs = Spaces. face_space (cs)
10201063
10211064 # advective velocity
10221065 c = Geometry. WVector .(ones (Float64, fs),)
0 commit comments