From 822fbd461d4905996acd0051f3776c090d5c81c0 Mon Sep 17 00:00:00 2001
From: Florian Atteneder <florian.atteneder@uni-jena.de>
Date: Wed, 14 Aug 2024 16:12:50 +0000
Subject: [PATCH] ScalarEq: Implement modal Bernstein DG evolution
 (https://git.tpi.uni-jena.de/dg/dg1d.jl/-/merge_requests/207)

MWE to check consistency of operators.

This is not intended to work with any HRSC schemes or 2d etc.
---
 src/ScalarEq/ScalarEq.jl                      |   1 +
 src/ScalarEq/rhs.jl                           |  41 +++++++++++++++++-
 src/ScalarEq/setup.jl                         |   6 +++
 src/dgelement.jl                              |   6 +--
 src/parameters.jl                             |   8 ++--
 .../interpolate.h5                            | Bin 0 -> 9424 bytes
 .../modal_bernstein_advection_sine.toml       |  24 ++++++++++
 .../output1d.h5                               | Bin 0 -> 18632 bytes
 .../substep_output.h5                         | Bin 0 -> 51096 bytes
 test/IntegrationTests/refs/testconfig.toml    |   3 ++
 test/UnitTests/src/test_dgelement.jl          |   2 +-
 11 files changed, 83 insertions(+), 8 deletions(-)
 create mode 100644 test/IntegrationTests/refs/modal_bernstein_advection_sine/interpolate.h5
 create mode 100644 test/IntegrationTests/refs/modal_bernstein_advection_sine/modal_bernstein_advection_sine.toml
 create mode 100644 test/IntegrationTests/refs/modal_bernstein_advection_sine/output1d.h5
 create mode 100644 test/IntegrationTests/refs/modal_bernstein_advection_sine/substep_output.h5

diff --git a/src/ScalarEq/ScalarEq.jl b/src/ScalarEq/ScalarEq.jl
index 528b764d..5557e6eb 100644
--- a/src/ScalarEq/ScalarEq.jl
+++ b/src/ScalarEq/ScalarEq.jl
@@ -3,6 +3,7 @@ module ScalarEq
 
 
 using dg1d
+using LinearAlgebra
 using LoopVectorization
 
 
diff --git a/src/ScalarEq/rhs.jl b/src/ScalarEq/rhs.jl
index 75100c42..0e07391b 100644
--- a/src/ScalarEq/rhs.jl
+++ b/src/ScalarEq/rhs.jl
@@ -267,7 +267,18 @@ end
 #######################################################################
 
 
-function rhs!(env, mesh::Mesh1d, P::Project, hrsc::Nothing)
+function rhs!(env, mesh::Mesh1d{DGElement}, P::Project, hrsc::Nothing)
+  if mesh.element.kind === :nodal_lagrange
+    nodal_lagrange_rhs!(env, mesh, P, hrsc)
+  elseif mesh.element.kind === :modal_bernstein
+    modal_bernstein_rhs!(env, mesh, P, hrsc)
+  else
+    TODO(mesh.element.kind)
+  end
+end
+
+
+function nodal_lagrange_rhs!(env, mesh::Mesh1d, P::Project, hrsc::Nothing)
 
   @unpack cache, mesh = env
   @unpack equation = P
@@ -288,6 +299,34 @@ function rhs!(env, mesh::Mesh1d, P::Project, hrsc::Nothing)
 end
 
 
+function modal_bernstein_rhs!(env, mesh::Mesh1d, P::Project, hrsc::Nothing)
+
+  @unpack cache, mesh = env
+  @unpack equation = P
+
+  @unpack u_modal, flx_u, src_u = get_static_variables(cache)
+  @unpack u                     = get_dynamic_variables(cache)
+  @unpack rhs_u                 = get_rhs_variables(cache)
+  @unpack nflx_u, bdry_u        = get_bdry_variables(cache)
+
+  u_modal .= u
+  for (v_u, v_u_modal) in zip(eachcell(mesh,u),eachcell(mesh,u_modal))
+    mul!(v_u, P.prms.V_bernstein, v_u_modal)
+  end
+
+  dg1d.interpolate_face_data!(mesh, u, bdry_u)
+  broadcast_volume!(flux_source, equation, mesh)
+  broadcast_faces!(llf_1d, equation, mesh)
+  # broadcast_bdry!(bdryllf_1d, equation, P.bdrycond, mesh)
+
+  compute_rhs_weak_form!(rhs_u, flx_u, src_u, nflx_u, mesh)
+
+  u .= u_modal
+
+  return
+end
+
+
 function rhs!(env, mesh::Mesh2d, P::Project, hrsc::Nothing)
 
   @unpack cache = env
diff --git a/src/ScalarEq/setup.jl b/src/ScalarEq/setup.jl
index f92c621e..f8bc0adf 100644
--- a/src/ScalarEq/setup.jl
+++ b/src/ScalarEq/setup.jl
@@ -13,9 +13,11 @@ function Project(env::Environment, mesh::Mesh1d, prms)
   bernstein = BernsteinReconstruction(mesh)
   analyze_error = prms["ScalarEq"]["analyze_error"]
   analyze_error_norm = prms["ScalarEq"]["analyze_error_norm"]
+  V_bernstein = dg1d.Bernstein.vandermonde_matrix(mesh.element.z)
   fixedprms = (; bernstein, av_derivative_scheme, av_drag, hrsc, muscl_omega,
                  slope_limiter_method, slope_limiter_tvb_M,
                  av_recompute_substeps,
+                 V_bernstein,
                  analyze_error, analyze_error_norm)
 
   # construct Project
@@ -123,6 +125,10 @@ function register_equation!(mesh::Mesh1d, P::Project)
     else
       TODO(P.prms.hrsc)
     end
+  elseif mesh.element isa DGElement
+    if mesh.element.kind === :modal_bernstein
+      register_variables!(mesh.cache, static_variablenames=(:u_modal,))
+    end
   end
 end
 function register_equation!(mesh::Mesh2d, P::Project)
diff --git a/src/dgelement.jl b/src/dgelement.jl
index f9de0ac9..dcb1914e 100644
--- a/src/dgelement.jl
+++ b/src/dgelement.jl
@@ -6,7 +6,7 @@ struct DGElement
   # quadrature rule
   # quadr_w are such that data sampled on `z` can be directly passed to the integrate
   # functions below. In particular, any interpolation from `z` onto `quadr_z`
-  # (need kind === :nodal_bernstein) is already accounted for.
+  # (need kind === :modal_bernstein) is already accounted for.
   quadr::Symbol             # :lgl, :lgl_mass_lumped, :glgl
   quadr_z::Vector{Float64}  # quadrature points
   quadr_w::Vector{Float64}  # quadrature weights
@@ -61,7 +61,7 @@ struct DGElement
       l_rhs = zeros(Float64, N+1)
       l_lhs[1]   = 1.0
       l_rhs[end] = 1.0
-    elseif kind === :nodal_bernstein
+    elseif kind === :modal_bernstein
       if quadr === :lgl || quadr === :lgl_lumped
         quadr_z, quadr_w = LGL.rule(Npts)
       elseif quadr === :glgl
@@ -82,7 +82,7 @@ struct DGElement
       l_lhs[1]   = 1.0
       l_rhs[end] = 1.0
     else
-      error("Invalid quadrature rule specified")
+      error("Invalid DG formulation specified: $kind. Use on of nodal_lagrange, modal_bernstein.")
     end
 
     MDM    = invM * transpose(S)
diff --git a/src/parameters.jl b/src/parameters.jl
index c13ec135..31b2078f 100644
--- a/src/parameters.jl
+++ b/src/parameters.jl
@@ -510,12 +510,14 @@ end
   - `nodal_lagrange` ... Nodal approximation using Lagrange polynomials collocated with
     the quadrature nodes provided by `basis`. This is the standard method discussed
     in Hesthaven, Warburton, 2007.
-  - `nodal_bernstein` ... (Quasi-)Nodal approximation using Bernstein polynomials.
-    The coefficients correspond to the nodal values sampled on an equidistant grid.
+  - `modal_bernstein` ... A modal approximation using Bernstein polynomials.
+    The coefficients correspond to the nodal values sampled on an equidistant grid,
+    but the Bernstein polynomials are not interpolating.
+    Hence, this Ansatz is also refered to as quasi-nodal.
     See Beisiegel, Behrens, Environ Earth Sci (2015) 74:7275–7284.
   """
   dg_kind = "nodal_lagrange"
-  @check scheme in [ "nodal_lagrange", "nodal_bernstein" ]
+  @check scheme in [ "nodal_lagrange", "modal_bernstein" ]
 
   """
   Periodicity in cartesian directions `x,y`
diff --git a/test/IntegrationTests/refs/modal_bernstein_advection_sine/interpolate.h5 b/test/IntegrationTests/refs/modal_bernstein_advection_sine/interpolate.h5
new file mode 100644
index 0000000000000000000000000000000000000000..bf79b76dcc1db77644baf904aa72eeb8aa845e5f
GIT binary patch
literal 9424
zcmeD5aB<`1lHy_j0S*oZ76t(ZMlc6L{D*=IDyV#zk_0FNrl$kSU%>=nFf#Cf&69wN
z3joarfd{M*0S^ep5EA6-3Sz?SgV9jwQEG&TfQPGN04N9|py9v)rB6W98I%i8yI{pI
zK?-O_V2%K#ZS?eO!45HWH2qQ#xFbj_uJqdhEeByi0V_wTm42DvDHm3v!f1$%TnrrW
zJOdJemCp{48iBz8>M%wIHi$Z?0~w*_GBQF0pvoCwG&4{hBqOL`53~UU92iWv8BG2&
zgE<VWP<xq}n7{^bK+R)jRN#iFKn(#Qs3{=DT_^XXF)&m>lnoF`YPhmN>peyRM#c&a
zHn^)9fgu6%6MFel01e0lsLIj$5guft3@jmlt9*IEiK-Z!*?>Z*xeHYdDLhztp&<a#
z1uHLL;tpb{;*{i@k^*Sa05lRgKb1D{z?}@sPYzHKY~>p$3^D{E3M`=NP|RBZm4wQH
zD4FAhK(xmmLZ7h@1%s<l{vG=wu*5^C_)~k!zQ-1Qk6%FL-`GQp`e2V)jzUUDSiF#5
zZWahb?0~h5AUw=+vjZYANJz}^fRu#PuU9Id;e(p;F~etI>y^=Revl;0LFx=#<@^PH
zR0qS#6V%j>s)iIEtUNy<4bcTF=aI`zqYJRs9|N#WgWg`GRylWKNS1Si>OJIeEQt_+
zM-65;(yDyCFeJ)HSa?7}0nuM+5QhYr2Q=hx<&z&m@Sp`VsGUzxO()C?=WGbtKJkhD
zw~i}4-OcaqAKLQ2sM_}0-q-kd@ruV+?L8s%{(BJd{XZb;_Qyc<?Pre>F;-i)agQ+=
zT(*C6^9}c(jCcE4-imVTZhX6c)r#pCoW9)MZ};l%bCDCL?9Z`iZccT4X>a`Umh0!g
z@9mrSFwHr5^tpYS{`(WHs}9<;e|gRRk@?~NRR?%~{RWydS|1UP!;!24x!f{rfDVcQ
z0|Z&zcmpES!SXL;FacCgP^(^0kb%Sl#5`D>V7Bi%U{ZsECR8tA>%V{;egj$n!s=nn
zaHUl}p#cqN)RqNiI9Cj4_#&sjk^*Qa6zC#k@zN8}N&_ek3qSOFr9&3t4OqQ0S{@E)
zv<`a9akV=NpzUUu2dLfdKuXsvxv9k&3ea&@BymO)4oR5xMAMLV#bf)3>HcTjc096w
z->}C*p?%Z-RYw&Tt@U`epL2ET>0fu=@0Yp$Y(;79tNmZ*-S`#NaB;sR!|xSl=C|x0
zia79nJn_apC~D&GD8cvk)9k+6y93RE<u~fr0~OGj%8^kIJdlG#CH?Dx252}Bp?aVK
zT6F<~3^`wvUVs+zMCXc8g`*)b8UmvsFd72nhQO?uAn?-u!h5F8NqO(=_u3s@)V1oZ
z{U^ie&Wcy>+M67m^?{l9^!^JjN=0TqFZU-dzNF;)_x=8__un|Y-}!uh=`MBtLn#OM
T7r*%Hb6@D8{SIG~g&=bP-98)n

literal 0
HcmV?d00001

diff --git a/test/IntegrationTests/refs/modal_bernstein_advection_sine/modal_bernstein_advection_sine.toml b/test/IntegrationTests/refs/modal_bernstein_advection_sine/modal_bernstein_advection_sine.toml
new file mode 100644
index 00000000..6b41c05f
--- /dev/null
+++ b/test/IntegrationTests/refs/modal_bernstein_advection_sine/modal_bernstein_advection_sine.toml
@@ -0,0 +1,24 @@
+[Evolution]
+cfl = 0.5
+tend = 2.2
+
+[ScalarEq]
+analyze_error = false
+equation = "advection"
+id = "sine"
+
+[Output]
+substep_every_iteration = 200
+interpolate_variables = ["u"]
+substep_variables = ["u"]
+interpolate_aligned_ts = [0.3, 0.6, 0.8]
+aligned_ts = [0.05, 0.1, 0.15, 0.2]
+interpolate_nodes = "$(collect(range(0.0,1.0,length=10)))"
+variables1d = ["u"]
+
+[Mesh]
+dg_kind = "modal_bernstein"
+range = [0.0, 1.0]
+k = 40
+basis = "lgl"
+n = 4
diff --git a/test/IntegrationTests/refs/modal_bernstein_advection_sine/output1d.h5 b/test/IntegrationTests/refs/modal_bernstein_advection_sine/output1d.h5
new file mode 100644
index 0000000000000000000000000000000000000000..6515693b408270ee7095a7d995b1b9d80881ac4e
GIT binary patch
literal 18632
zcmeI(d0fre{|E5fMv9b@1{pE3#aKcL?@(lBY%OZCPDo_3CPwx_)<H~>rG-lNsj)V_
zsnEWNx=PxY+j4JZpV05z`#$$(w#RSznt9Cp#{I*qKKI;nKIeSS^Yi(fPuC6`t8r~K
zI%)`{FLiZ+sz6(yB>RQ_Y2vR0n_vDeFEWS!ApeXH|2<rpeozu<$?7xU+qGH!(pRAx
zZQ#`k>}{>BrCa3f$&*Tb`1jvF0yfs8r%1=Zi4TN2&jdct_^*n&D=RGD_#dPa6Cs`3
zzn;HlEveEE^Y=d(+<(zW|7iaD@bjR2DCFnS_cec&6*E_UMwKVEs3A~Sn2~OgpPw!1
ziXa%kcT7ppg39q7RO0n2Dba=mUQV7W?0xAwI$eRaAbnX1Of?0jO)9cq1ZuopWo2bq
z1?s#$6{W74RKl_aCH>ou*CH*vGcnp#AXxqG+kg4b|J!kG!LNHt+Db~Rdo_1WiH(G`
zPrp9DEal@rhxhEm_3<x1#Q&%U|LFWu+3J_wkYQt+-q-m>e!ei!r*`D$3;A~KUccP_
zpSW2$M@P|_cRhJ7ZKv2S_hiYp{NDLZItET1sDK$S_lx@W@i+N<(l~Nh`dR~&JHT|X
z^ySNcKdeX^-$4F;2rO`wzC!u?rxlr+B7L0&YT_c_ehFmN4vti$tXN7E$f|L@%*$Wp
z<*zA{_U8srz0tgU3@?9Ek@Wse{<&Lx|6=+6#wn7n5^+H7$Ahf<hi~(G?<kV?_b#tL
zfw!N)>rYf9jYATzKN)D8QXq{QP$adJ%Ii<#<B-nl&rl?dM+R>%gV&qM+iOl5-+R2i
zd%QpQV32IbvlL0kHH+7OpO?SS>u*jP=Lfu<2fTbXFW;Qht!%#kIlO!hFE3Oi^+U+p
z5%PXK<mH=_`jN}q$>sgX<@=wfNa{x(um2G*|A^P$oYaqe-cCL*|CpC=PU^>F-j4!a
zzJQl6R3y!VLjL(eK3@v?el{l^_affUB0m3$c)iU@^R$T9U(DMt=Jhux&6i@{PBGBD
zE#~7<qDY#5CA^&yJ{~2!{!&F!KT3H!rMw@dy#D5-ew6Wkl<|I)@%o#S`ccN~FX#Oz
z=k+%y^`o4(Q_lNQ&iB7Uk<^b0-cAMYM+L9HQjye;O5RQ-??)xCzd5NNBHj-X?}v!j
z-<;GB5wE|B_oIr}-<;HsD&9^N??)Bi|7t~2KdN~<)x00oy#5+RQa@^VJ2ku?HN5`j
zq<+-$e$?`Q)bje9lloE1>lgEWh<W|ZN&OJ>cEr3NV!r<pMN&T`yd4SehlJN($If%V
zzHg?xVcK7T;QxM~Jm(`iCs2L#vq13M`(z*aTYroE?Re0g@B3dzxbgA%d#@ut+}Hmt
zrsdyuC;sTZ{$~4M?y~%R^1kou{rgcnzrL?`8~)4fzjgh-&U4`(Q%nD>^W1;8&Utse
zvC@Vwo>)hJJC1+W`SBtj*T47qQ9d5Oem*j#H_Zwg3c(*asg!?^mwVq%c(woIcu}}2
z^U+5qVZz?wgUZ@R!7KOflf?Ql;At1WK(j@>B3p+p9C7t!0;Dt^Jhh`J6_!1Wi5ovV
z6DEs39VWSxrAT$XPkSX8XT#jn=R=Fv31Nha*-+c$To63A>f2w7-PiL>Y1^UY0qX)d
z+W%SQq^pIH;C6nv#oZ#9<?N~2J-t|wk#G7L9#1a;u~;x}d_pOF-`3VK`f3@ZSZr`T
z9?0%bc`Dy=tlqz&0`w#!OGi0W!le$SFQ*uZApEIcfLBR#1_x>Nb`7WkP&?J)zD+f(
zJEV@@)zz@rWTau&Ej5bVFy@){=C-vkZqJ}}_kFd{_Ck;B(`xL#%ic;?Ye{p89_*>{
zND)JNrx#np3?*=J#*1`67YWQL{q*1`0nItPuJ^`acO`IPj&Xl1mw;bvW8Vv}n(xc#
zfYm9s%gf0>H=WlfPkB4?cB}Y)C^^vn$y1B(x4a*lc)z~p{gtPD97gkTImyTA*W(w-
z$5oe)vl1WoRDK-fd6*w32|sR^_;H-gkFPxC$Nd<e2U&bxXz+O=&*6L?&FAw<i_f#E
zeE!LE37?l4e4cjT^L7oN&+^n>O!M59&-+U5pydp`!N#FMBjkCTwqsW+hXv#VzoPmS
z*@fD{9BLPr(|(`>?VlnwXut6*>IV*?e&LIJnGZ!K&^Vw!jSI$-51dBhr%3Jt>u8+O
zkH#Ij3q=a(IH5KjH@rZ{5rfHxBE#vp;~1I;xRHDy_o2v*G>_1Vd?24^$bBfXg61Wr
zk`FvjKG2!wvm*ICM?UY7`#|nOk@D>q$q~vwH<Q;V&kMYrG~R9{-wy%#KzVZ4XwCb<
zeV_;VP~;{)4rBSaMDTGs&&N-m{Jewh_&BTbaZe*3C{KPK!v=obek330%8#!+<;OjM
z&x5;sUZ|1}l&1xsM;?4$Y4dqz$LF6sH}ZK|%IB#$pSQ>Oe3mD_4xj~}_vS^i>jaXE
zOVRXP=QPYd=&k$7Pg(eQy5o@c^D;3iBjn(<f>hLVwXSO~Nx-EaJ5HMLG7fz*y_ep3
z5r>st1{>`L#9;5>)fZErN8;x{7T9LihTxPZuC2Bn{uIpT2|e5f4}@<o72uP+5U3IE
z)W0}63f?T);?n2S7}z}jlvQcVczEVx7aXS^4<}31@^i`)V6o1R!R<8DK;ue}elhbi
zp;LB$o%HxD*r4yCW_vpe4(LaZ$?u#E=bt=KTIDZ<^fTt;Ti(lsuG+$EtycNaFtav0
zh^5t=w~{LJ0&w&*9AlDD2uV?W8crk?!Sh4fmEDtzp?9n3<11L2G%2^%N-BZCu{S5!
z=a#~W^q9Q%(Pc2l)}+;hfO4paded~2W#rZ|^DEa>z>BvR6I(5;gvqH7`tJNh1iCww
zkJdgCf$`nQTVwM@pb=(KaOY4JbRRWVqi|+5j5bS|v`JhIm-l@axpQp|3_aUHRLJs~
zLF?1n8ntjvYpk_tXf0f5co6NXE{0u0?Ajc26~oZ!)`RO=zN-6d;>5dRD00p35;9l<
zt=wIc8|O*DaQr8|+8mI8?qnU4nJllYX*+CNtOUM&DR!LuS^~3t*7Z5lC;|JH)!u8L
zOJI11Wv;hb=43BU-StcY4pUUtZ(;9ineA_iNsz#@D@iXs_Di7k8Nu_5EW=*KF6%s7
z0_#8Pqt|Mn1RCAdCag{sgR0Xl-+A-J5FB<v^%%>0XAInHl*KU1Y53B*pjt>WjDOxj
zyB0Qkd=rFgYT($IFT2&U9MRo(_g+yo^b4??*v6?E`l}>}T-f#7Fn$mO<ceV9DU(al
zEMHZc_Zihy1onda4^zIX1k(#EGFq_vfeX(^sIK=fhXKXw4<2B-%;Va{UF`m0T!rr4
z+{{wg(%Z*(Z(0c`b?cv9f43M8ePf{Vie+QWz1muKKhiGuGygL&g&^$Z@98zB017RC
zC{|U@hjqKZ>hw}6AAA?L+U}W_3trbVOdf9$!oY_ePv7pA4Z&CDpZWZ!EN~_tAS55K
zg?xZA`GD!<1H8xwgpdy~As;Y`e88hpnGbYxkomw)<O8G02MWmtE+HRSOg?Zm`M_P|
z0|n#*JChIeCLef}eBf5{fm!4OJCP3*kq?|kKG2+eU^e-{dh&sN$OrZy9~e$PFo=90
z_koq<1Gx_rkq<N@AE-(`upRlprcjv=Y(qY<FZsYQ@_~cM2j-CvOe7x|Kt6CA`9Ndx
zfeqvX3&;m5lMgf?AJ~?B;3e{bzT^XElMkFsKG2eU;AQfG-sA(H43qi5mE;4p$OoPv
zA9$2};1lwJD&zxCk`KH~KG2(dU@G}QU-E%x$p@N}540m6IDmX$ck+ST$OpC;$$a2I
z@_}aL1H;J&nvf5)B_BAKe4r=!z&7Lq50eiRpv(vAk`KH?KJXFwz$N4ZxexRpAJ~t4
zU?BOx56_$a$4j+;Wx;o!OAOq|zvRS5;@$0o1DhAs^7T1=IYj#W;(a~$spC(c{(n99
z`MtkKOD9@*ADV9R=WM?n*FWny&`UnffA8l&@6NxKmc3}O*uU>?_w?rvh1hoa_{nFg
z{QC$tL+GRO=SCmShl-*6@Wbznz#lzVwB%~!A9>%;72lcHs$b7v;ntOZZ|<G#N~S`7
z(qKFBNAo@0oc2&Y-)S9r4OB#VOZVO>M&qN(2VUMS!lpwDPTjv=i0yNN&%2H;z=#v;
zd$wzOgpT9CO8A&%8^^@B=%ifCTa(!+-XO$_i|m~bcg@D=u)_)Cu4mzO4Z$X7mV1+}
zADx<!i7m~PhVEqR(yK#uga=h7px2Hi6Gk`0;fB&vbt_o9M0FV9r5c0NmKaV>SBt{^
z_F!Y05`xc<pSKyk#{xDNj}BDTvw)0gEp=~AJP9$6$|KJXi~<L9kD8TZW8h%KoG7n0
z@sP4g^VlGkAqL0V7`94;e6{#6@zYd@vW?09&OH;XdRV5-xtj&9S8@u>Szg|9?Y8%T
zY%mn3g&FJ=!b!L}VTCXklE$hmaMH|&MI&FR4q$1d9C&8elmZyNRI}e!ECgd~yJD@h
zBG|veXr5t8F(lOOTdmHrz24ruBM(Zz&~3M)dqydke&?(oj%Cn3%vVq6XgPGxbZls3
z>r(qX9bx6x3P@XQvfOZ1B^W<?-LH2q5&V4N)`SggJ(@AO-Ks?_MG;jKB|%lN;hUMg
zhS*la#7XMb`VG}EGu8R)VzwSF@Y(2|#xn3+-=%u`wP5F?G+*yXEez9C)6LTq!(OZY
z5m(uI)IfXu%Tp}7m9M#2cux#7uHZT6o)UnOS~rHfv2|rP!Ozuf{n#+Jv`rq%f?Y17
z=A=rX*P=dgP$z-2!CF?w-%22{gT%fITaPZ9{Mq5QEQ9jq>9{pXVB?16pJhrUFn^QT
z8T(`j;G+KBg!?2=wxi%lGRtA<>yn}uNT6=nvql|b38=Izv<OTWL*c$@xBcdcVXL<B
zvb`)fmULO&Q9}&LH#;17<yQ;wg$E8t>eRyZXJgB6t*(K-Pn$w-uv{5@RMSvW4gNQB
zRy$0t2HPG1=XV^f0;fqwvX?&;L2zM6))JO(!ZmstY`xz)$y;TYb0w?@9ON0u)}`l-
zE}0MVD~DnO)$P(8_0g#g>#mo<i<TwlMx>O&u%SOp_G9bP&JkU6cHSulCGr8C$p@%^
zFY^JK<O9x<5136ppd<N!6!HN#$Ol{}A8><wz$)?q`s4%7kPqNKU=#TOOY#B1<O8b6
z2bjCad|;nYnGZ~Jkomw%<O5B~2ks#sc$a)&1o^;jEo46M68XT1<O4m(2Zoam>`6W_
zfP7#o`M|m41Lu$r)FmG{jC|mB@_|2*59~=kko&-)<O4Oy2O5wMoI*bEEcw9B<O3_n
z2O{~v+vEd%$OjH4A81ED@B#V2?c@V($Ol@G5A-1)*ou6hKKZ~&<O5B~2ilSkEF&MN
zv0LT?D;COp;5G7rx5x+1CLg$xd|&|iz}e&jW61~Bkq>N5KG0~n%m-Grkomx;<O2_o
z5A-D;_>z3!L-K)1<O7G14_rn*@GSX2EAoNd2c97x=tMrS6Zybp<O3tg2iB4g97sN}
zk$m7_@_~lr1LfD7_kZ7SHiE8L|Bn0qz@gOJzy7}8l8^I0=)T{~lm?6a`|f>^=RST@
z&$fTKpH~dghaY}t1perLUYmcPMgEaL@qS)uPzL|c9jvi;=kbt)=0(MycYfVChWhyL
zIKK+`S?;etzxwcT{s*03{hJZIJ1;%!_##q{gC%`0Hx7a;49_hRig4gEQ(;gy5pG>&
zvLNfrN^DiQu-mxx6?p7v;=sB?<(RjA*$gqu()uzrlWS!-)abIAZgMFWV}ZDBY6(6K
z`3BqHF2-R~Pma`Ox!-8}i#vCUup)Y4gypqDT<omdL1$C}mTY%0zu))>_mtSYNoBb<
zrrXZ2gj{UBWn_Vxw-9><ZLilc%*LA*x_c5YXQ9=PuSUkQ%=PGn)y|n1)H&m|Yj!Hm
zSe$=pdQk%Inh`hXX;mDW#0I34uoOB>zir&~6ZY=m+t#^05=VwRjeK!F1P%MAC`~o9
zhF6h(F&#d$23xlcY7+aCuy^6e<n-}TFz;<lapKe%Fcl{06zIi6b)8mXJ<GH4?bZr3
z62UCC=*#_rG}vtv+VQnVCLFeleDfkH3)a34_+BYF3zkK+3-@B{(wlKb6>atjVg6JX
zK~P>UZ1>RejAq~CF?Ng5y2CQzY4*dmY+ZVwqy4M(v4s%cWBPLM^deaMVq2dxsm0*G
zdE>(iEJIsA?9!dBOQ*W1@12@e3Z7Z$TynDvMs#XOTY9V<cDQUG<H=GvWvaP3TbE8h
zW|fjZrxHB3EuGt^w+LGO^mJ1AV-c*JtnYr7Wn<s_owV4x^rA=iNip`-@JXYoehyog
z{&2?N>s0R=2y=eiA(LgjzRi#p?b$l6V6*eIqqWe*Xzk5ut;MkOfl=P<1!8bf@p$9H
zvaZ))y|bBOxTTyhY<zDCxNjaf{A;!@{rUKqQJ=HFlQuoIi=W6+?U+t(>l6trocZ!*
zQoRJe*l#n*hpkIzx;5GjX6w-bvqb%du$->#Zu$0&1ipOTN4cJ@Uo9M;CqGM)K;ixf
z$6&S|6-Fhl31J!2-Otn7mDRVY!4cWI^!|W8i9e@_LG;w&TLZQpjrQ79Ax&4);rYke
z-+3o%?4LNmzZUdH*o7vuzn8|osh#rLs|I{-Mm03Dv@JTcCA790Od68R_1L<!e~q|q
z9{YQ##*>9f?m`iSkq^)(9}r1CpuRxn1476L<dP2%kq_ukKA@a@Kppvjq2vP&k`Kry
zAK*?tKtw*^DEWXL<O8(G2lOBx5Jx_M`+$4o12&Nlm`*-mEBSz)<O4R652z#`@Dcfd
z;hkhY&?rde1CK0_`M^5zfpf_Rjw2uVntWg&`M__;2YQna+($le3HiXC<O5fb5A+}(
zxPpA30r|i<@`1kO1CNpq^duh`KtAvQ`M?F_180#B97sNJE&0GV$ub`}jC|lC@_~|Q
znGc*nKCqsA;4$)noyiBDBOiEzd|(6lz)<pmdgKF_kPjR~KJYR5z$Eg4Gsy>XA1HVx
z^MR#DWj^o#`M?3>1HU96*q?l$9r?g<<O9c&56mSWm`gq|jC|lp@__~91J$3&d|(y%
zKwt8KQ^^PRBp;YcKG2VRAoqcN$p>~PAJ~$7AU%&vgqq#)cDv__aqG&SEp*hy7#rr^
zak*bDCRv*w(bcZSdnZnq4DhN!N3}^ErRiXoW0hW0jhk*;P5)?8HAcUB_S5nsRT!~6
z>Bzhs5#E@obV!<C=^S3a%}9hjo<^t#J5?ey+2F_PDp1Mt(Xyz6<?QdMH&;v3B4F39
ztSe=R*SZ(}kXVYb5#s}*lS|Om-G9irxMHj;eq$re6(=9(48L838Z9zZuU{#|t3jn!
zMivFw)?U^A#>+=&FU&t6P1PBxdxzc5MWwgZLvghb>+LstRezL?8cQcRdq-wr#~Be9
zq`7_WgC8s$Gx4sK3hYZy#o7y-dnD#2;H)>fSshE`Fn9CZuud#<!oUAKPVy6ep}nqt
zNl7HmKUd{4;$R56HOxrz?(qc}j5!#(^^-4PS{F|r^OYxIX27in#~q@eo37P-&Dk;F
ztJLGGs7~>4;NIFVB3ZWHGq-=7P9j8qACV3%)4+0F%FzMKGeK+C<$j~nvcR}aOMgq2
z$~e>0%rqN}o78s?_7%cCwVEZT9_Pa1Rn@D~b@E}~%Y6^iSPq>tVY$Cu0qn2K(v!p$
z!V5pEF8LWnU^uL@q%He?sh6FDuQa=+?(KIoy9A!P?JGWXzZ7QIUrzogwhTfSc7GXm
zyd0(`goa5|>ASlHr?ypqL*%@fV)p%#3-$Y-_U|JCpJh8nMHI0Auk>}7y3;JXXUETl
z;3^n??DG7B4%IN-N-#6zNi`hnWSr=`t_F^)-dHb9r&W#t&)9Vd65sq#!>&uNZdN~*
zvFnnBo6W5<c0HQq^n<rFT|S=@X~&+I{+zwS@CdsumCVhac7t7)1Sh;)_OR<we2r@l
zX+EEFV!s=^E;-$|=`Cc}CELw&!hP9wsqea}?FUG&NBZN7K4ob-%_>ckZ9imr)c-2G
zE=3${=orJUOK%GgC4I@RN1tUp43y^Z-JgG}%C1Y!b%q<qu<KIa41>j+*mWszaNp(3
z1tgIVSWQ0Q5cz=9<O8C~2UwC1;67jj`G6bb1I~~Sh$kN~fqcL;@&TWc56~hXaG!j@
z81exb<O8@5a3dd3Pd>nne1H-8fFH>RbRi$$LO!4c`GA(>1Iow;2*?MtCLb`Dd_XGs
zfCuCQrjZZGAs^7<w9E%AA|FsrKA=mM%m*$ql=(nULzxdOB_Ej9PUZvs$p;=HA81ED
za1HsuFUSYBA|Gf-K2U>vV9r~a4@@H;=tMqnJ^8?X<OBDS4^;7&`M|E^1HU03Xhl9S
zl6>HN@`3xw2M!@0Sg}{;1E-M>^dld*gnZz~<O4Oy2ev04=s-U3JMw`(<O9c(4>Tel
zXiGk@ANfFQ@`2xw4=f=cSWP~#>A1`X#*q)yo+|T!<H!d(kq_)jKJZKOfprct9~etM
c@G$v6l_HrBoJ>BD`@jw41FgviBKg4o0*ItfqW}N^

literal 0
HcmV?d00001

diff --git a/test/IntegrationTests/refs/modal_bernstein_advection_sine/substep_output.h5 b/test/IntegrationTests/refs/modal_bernstein_advection_sine/substep_output.h5
new file mode 100644
index 0000000000000000000000000000000000000000..f67e822f1758cd4bd521039a5362ae5668e170a4
GIT binary patch
literal 51096
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
E18qVF82|tP

literal 0
HcmV?d00001

diff --git a/test/IntegrationTests/refs/testconfig.toml b/test/IntegrationTests/refs/testconfig.toml
index 5b254ec5..b5cdbccf 100644
--- a/test/IntegrationTests/refs/testconfig.toml
+++ b/test/IntegrationTests/refs/testconfig.toml
@@ -7,6 +7,9 @@ default_abstol1d = 1e-8
 [advection_sine]
 variables1d = [ "u", "u_err" ]
 
+[modal_bernstein_advection_sine]
+variables1d = [ "u" ]
+
 [advection_sine_analysis]
 variables0d = [ "u_err_norm", "u_norm2" ]
 variables1d = [ "u" ]
diff --git a/test/UnitTests/src/test_dgelement.jl b/test/UnitTests/src/test_dgelement.jl
index cf43f55b..028a9d33 100644
--- a/test/UnitTests/src/test_dgelement.jl
+++ b/test/UnitTests/src/test_dgelement.jl
@@ -209,7 +209,7 @@ end
     @test all(MD.≈S)
   end
 
-  el = dg1d.DGElement(N, :lgl, :nodal_bernstein)
+  el = dg1d.DGElement(N, :lgl, :modal_bernstein)
   T, invT = dg1d.Bernstein.bernstein_legendre_transformation(el.Npts)
   M_legendre = dg1d.Legendre.mass_matrix(el.Npts)
   TMT = T*M_legendre*transpose(T) |> dg1d.purge_zeros
-- 
GitLab