From bb11e7ae32284c682bcf93e65466ea10418b4bda Mon Sep 17 00:00:00 2001 From: Tim Andrews Date: Tue, 12 Dec 2023 04:10:29 +0000 Subject: [PATCH 01/21] begun tracer_conservative transport --- gusto/active_tracers.py | 7 ++- gusto/common_forms.py | 25 +++++++- gusto/configuration.py | 2 + gusto/equations.py | 117 ++++++++++++++++++++++++++++++++++++- gusto/transport_methods.py | 12 ++++ 5 files changed, 160 insertions(+), 3 deletions(-) diff --git a/gusto/active_tracers.py b/gusto/active_tracers.py index ab0d59b28..1959deedb 100644 --- a/gusto/active_tracers.py +++ b/gusto/active_tracers.py @@ -53,6 +53,7 @@ class ActiveTracer(object): """ def __init__(self, name, space, variable_type, transport_eqn=TransportEquationType.advective, + density_name=None, phase=Phases.gas, chemical=None): """ Args: @@ -62,7 +63,10 @@ def __init__(self, name, space, variable_type, the type of tracer variable (e.g. mixing ratio or density). transport_eqn (:class:`TransportEquationType`, optional): enumerator indicating the type of transport equation to be solved (e.g. - advective). Defaults to `TransportEquationType.advective`. + advective). Defaults to `TransportEquationType.advective`.# + density_name (str): the name of the associated density for a mixing + ratio when using the tracer_conservative transport. + Defaults to None. phase (:class:`Phases`, optional): enumerator indicating the phase of the tracer variable. Defaults to `Phases.gas`. chemical (str, optional): string to describe the chemical that this @@ -75,6 +79,7 @@ def __init__(self, name, space, variable_type, self.name = name self.space = space self.transport_eqn = transport_eqn + self.density_name = density_name self.variable_type = variable_type self.phase = phase self.chemical = chemical diff --git a/gusto/common_forms.py b/gusto/common_forms.py index 67e3b1e96..d1355a44a 100644 --- a/gusto/common_forms.py +++ b/gusto/common_forms.py @@ -12,7 +12,7 @@ __all__ = ["advection_form", "continuity_form", "vector_invariant_form", "kinetic_energy_form", "advection_equation_circulation_form", "diffusion_form", "linear_advection_form", "linear_continuity_form", - "split_continuity_form"] + "split_continuity_form", "tracer_conservative_form"] def advection_form(test, q, ubar): @@ -262,3 +262,26 @@ def split_continuity_form(equation): map_if_true=drop) return equation + +def tracer_conservative_form(test, q, ubar): + u""" + The form corresponding to the continuity transport operator. + + This describes ∇.(u*q) for transporting velocity u and a + transported tracer, q. + + Args: + test (:class:`TestFunction`): the test function. + q (:class:`ufl.Expr`): the tracer to be transported. If this + is a mixing ratio, q = m*rho. If it is a density, q = rho. + ubar (:class:`ufl.Expr`): the transporting velocity. + + Returns: + class:`LabelledForm`: a labelled transport form. + """ + + L = inner(test, div(outer(q, ubar)))*dx + form = transporting_velocity(L, ubar) + + return transport(form, TransportEquationType.tracer_conservative) + diff --git a/gusto/configuration.py b/gusto/configuration.py index 3694ae9ea..b013c2a7c 100644 --- a/gusto/configuration.py +++ b/gusto/configuration.py @@ -31,6 +31,7 @@ class TransportEquationType(Enum): conservative: ∂q/∂t + ∇.(u*q) = 0 \n vector_invariant: ∂q/∂t + (∇×q)×u + (1/2)∇(q.u) + (1/2)[(∇q).u -(∇u).q)] = 0 circulation: ∂q/∂t + (∇×q)×u + non-transport terms = 0 + tracer_conservative: to fill in. """ no_transport = 702 @@ -38,6 +39,7 @@ class TransportEquationType(Enum): conservative = 291 vector_invariant = 9081 circulation = 512 + tracer_conservative = 296 class Configuration(object): diff --git a/gusto/equations.py b/gusto/equations.py index bd61e795b..1cb42228b 100644 --- a/gusto/equations.py +++ b/gusto/equations.py @@ -20,7 +20,8 @@ from gusto.common_forms import ( advection_form, continuity_form, vector_invariant_form, kinetic_energy_form, advection_equation_circulation_form, - diffusion_form, linear_continuity_form, linear_advection_form + diffusion_form, linear_continuity_form, linear_advection_form, + tracer_conservative_form ) from gusto.active_tracers import ActiveTracer, Phases, TracerVariableType from gusto.configuration import TransportEquationType @@ -429,6 +430,42 @@ def add_tracers_to_prognostics(self, domain, active_tracers): else: raise TypeError(f'Tracers must be ActiveTracer objects, not {type(tracer)}') + def generate_tracer_mass_terms(self): + """ + Builds the weak time derivative terms for the equation set. + + Generates the weak time derivative terms ("mass terms") for all the + prognostic variables of the equation set. + + The mass terms can differ depending on the tracer type. A mixing ratio + that is being transported conservatively will need its mass form multiplied + + + Returns: + :class:`LabelledForm`: a labelled form containing the mass terms. + """ + + for _, tracer in enumerate(active_tracers): + idx = self.field_names.index(tracer.name) + tracer_prog = split(self.X)[idx] + tracer_test = self.tests[idx] + if tracer.transport_eqn == TransportEquationType.tracer_conservative: + if tracer.variable_type == TracerVariableType.density: + mass = subject(prognostic(inner(prog, test)*dx, field_name), self.X) + elif tracer.variable_type == TracerVariableType.mixing_ratio: + ref_density_idx = self.field_names.index(tracer.density_name) + ref_density = split(self.X)[ref_density_idx] + q = tracer_prog*ref_density + mass = subject(prognostic(inner(q, test)*dx, field_name), self.X) + else: + ValueError(f'Tracer type {tracer.tracer_type} is not currently implemented with tracer_conservative transport') + if i == 0: + mass_form = time_derivative(mass) + else: + mass_form += time_derivative(mass) + + return mass_form + def generate_tracer_transport_terms(self, active_tracers): """ Adds the transport forms for the active tracers to the equation set. @@ -472,6 +509,21 @@ def generate_tracer_transport_terms(self, active_tracers): tracer_adv = prognostic( continuity_form(tracer_test, tracer_prog, u), tracer.name) + elif tracer.transport_eqn == TransportEquationType.tracer_conservative: + if tracer.variable_type == TracerVariableType.density: + tracer_adv = prognostic( + tracer_conservative_form(tracer_test, tracer_prog, u), + tracer.name) + elif tracer.variable_type == TracerVariableType.mixing_ratio: + ref_density_idx = self.field_names.index(tracer.density_name) + ref_density = split(self.X)[ref_density_idx] + q = tracer_prog*ref_density + tracer_adv = prognostic( + tracer_conservative_form(tracer_test, q, u), + tracer.name) + else: + ValueError(f'Tracer type {tracer.tracer_type} is not currently implemented with tracer_conservative transport') + else: raise ValueError(f'Transport eqn {tracer.transport_eqn} not recognised') @@ -567,6 +619,69 @@ def __init__(self, domain, active_tracers, Vu=None): # Add transport of tracers self.residual += self.generate_tracer_transport_terms(active_tracers) + +class ConservativeCoupledTransportEquation(PrognosticEquationSet): + u""" + Discretises the transport equation, \n + ∂q/∂t + (u.∇)q = F, + with the application of active tracers. + As there are multiple tracers or species that are + interacting, q and F are vectors. + This equation can be enhanced through the addition of + sources or sinks (F) by applying it with physics schemes. + This takes in tracers that might obey different forms + of the transport equation (i.e. advective, conservative) + but will evolve all the fields in a conservative manner. + """ + def __init__(self, domain, active_tracers, Vu=None): + """ + Args: + domain (:class:`Domain`): the model's domain object, containing the + mesh and the compatible function spaces. + active_tracers (list): a list of `ActiveTracer` objects + that encode the metadata for any active tracers to be included + in the equations. This is required for using this class; if there + is only a field to be advected, use the AdvectionEquation + instead. + Vu (:class:`FunctionSpace`, optional): the function space for the + velocity field. If this is not specified, uses the HDiv spaces + set up by the domain. Defaults to None. + """ + + self.active_tracers = active_tracers + self.terms_to_linearise = {} + self.field_names = [] + self.space_names = {} + + # Build finite element spaces + self.spaces = [] + + # Add active tracers to the list of prognostics + if active_tracers is None: + active_tracers = [] + self.add_tracers_to_prognostics(domain, active_tracers) + + # Make the full mixed function space + W = MixedFunctionSpace(self.spaces) + + full_field_name = "_".join(self.field_names) + PrognosticEquation.__init__(self, domain, W, full_field_name) + + if Vu is not None: + domain.spaces.add_space("HDiv", Vu, overwrite_space=True) + V = domain.spaces("HDiv") + _ = self.prescribed_fields("u", V) + + self.tests = TestFunctions(W) + self.X = Function(W) + + mass_form = self.generate_tracer_mass_terms() + + self.residual = subject(mass_form, self.X) + + # Add transport of tracers + self.residual += self.generate_tracer_transport_terms(active_tracers) + # ============================================================================ # diff --git a/gusto/transport_methods.py b/gusto/transport_methods.py index 4fc951b6d..c646893d1 100644 --- a/gusto/transport_methods.py +++ b/gusto/transport_methods.py @@ -174,6 +174,18 @@ def __init__(self, equation, variable, ibp=IntegrateByParts.ONCE, raise NotImplementedError('Outflow not implemented for upwind vector invariant') form = upwind_vector_invariant_form(self.domain, self.test, self.field, ibp=ibp) + elif self.transport_equation_type == TransportEquationType.tracer_conservative: + # Can use the conservative equation, but ensuring the correct field + # for a mixing ratio. + if self.field.variable_type == TracerVariableType.density: + form = upwind_conservative_form(self.domain, self.test, self.field, ibp=ibp) + elif self.field.variable_type == TracerVariableType.mixing_ratio: + ref_density_idx = self.eqn.field_names.index(tracer.density_name) + ref_density = split(self.X)[ref_density_idx] + q = self.field*ref_density + form = upwind_conservative_form(self.domain, self.test, q, ibp=ibp) + + form = upwind_conservative_form(self.domain, self.test, self.field, ibp=ibp) else: raise NotImplementedError('Upwind transport scheme has not been ' + 'implemented for this transport equation type') From e6bb82741183899b6b576a329e94d94c10a7bc94 Mon Sep 17 00:00:00 2001 From: Tim Andrews Date: Tue, 12 Dec 2023 21:58:36 +0000 Subject: [PATCH 02/21] DGUpwind for tracer_conservative --- gusto/active_tracers.py | 3 +++ gusto/configuration.py | 3 ++- gusto/equations.py | 33 +++++++++++---------------------- gusto/transport_methods.py | 29 +++++++++++++++++------------ 4 files changed, 33 insertions(+), 35 deletions(-) diff --git a/gusto/active_tracers.py b/gusto/active_tracers.py index 1959deedb..93d0a1e73 100644 --- a/gusto/active_tracers.py +++ b/gusto/active_tracers.py @@ -87,6 +87,9 @@ def __init__(self, name, space, variable_type, if (variable_type == TracerVariableType.density and transport_eqn == TransportEquationType.advective): logger.warning('Active tracer initialised which describes a ' + 'density but solving the advective transport eqn') + + if (transport_eqn == TransportEquationType.tracer_conservative and density_name == None): + raise ValueError(f'Active tracer {name} using tracer conservative transport needs an associated density.') class WaterVapour(ActiveTracer): diff --git a/gusto/configuration.py b/gusto/configuration.py index b013c2a7c..b2a3acfa0 100644 --- a/gusto/configuration.py +++ b/gusto/configuration.py @@ -31,7 +31,8 @@ class TransportEquationType(Enum): conservative: ∂q/∂t + ∇.(u*q) = 0 \n vector_invariant: ∂q/∂t + (∇×q)×u + (1/2)∇(q.u) + (1/2)[(∇q).u -(∇u).q)] = 0 circulation: ∂q/∂t + (∇×q)×u + non-transport terms = 0 - tracer_conservative: to fill in. + tracer_conservative: to fill in. for transporting a tracer that obeys an + advection equation in a conservative manner. """ no_transport = 702 diff --git a/gusto/equations.py b/gusto/equations.py index 1cb42228b..ab39733cd 100644 --- a/gusto/equations.py +++ b/gusto/equations.py @@ -450,15 +450,11 @@ def generate_tracer_mass_terms(self): tracer_prog = split(self.X)[idx] tracer_test = self.tests[idx] if tracer.transport_eqn == TransportEquationType.tracer_conservative: - if tracer.variable_type == TracerVariableType.density: - mass = subject(prognostic(inner(prog, test)*dx, field_name), self.X) - elif tracer.variable_type == TracerVariableType.mixing_ratio: - ref_density_idx = self.field_names.index(tracer.density_name) - ref_density = split(self.X)[ref_density_idx] - q = tracer_prog*ref_density - mass = subject(prognostic(inner(q, test)*dx, field_name), self.X) - else: - ValueError(f'Tracer type {tracer.tracer_type} is not currently implemented with tracer_conservative transport') + ref_density_idx = self.field_names.index(tracer.density_name) + ref_density = split(self.X)[ref_density_idx] + q = tracer_prog*ref_density + mass = subject(prognostic(inner(q, test)*dx, field_name), self.X) + if i == 0: mass_form = time_derivative(mass) else: @@ -510,19 +506,12 @@ def generate_tracer_transport_terms(self, active_tracers): continuity_form(tracer_test, tracer_prog, u), tracer.name) elif tracer.transport_eqn == TransportEquationType.tracer_conservative: - if tracer.variable_type == TracerVariableType.density: - tracer_adv = prognostic( - tracer_conservative_form(tracer_test, tracer_prog, u), - tracer.name) - elif tracer.variable_type == TracerVariableType.mixing_ratio: - ref_density_idx = self.field_names.index(tracer.density_name) - ref_density = split(self.X)[ref_density_idx] - q = tracer_prog*ref_density - tracer_adv = prognostic( - tracer_conservative_form(tracer_test, q, u), - tracer.name) - else: - ValueError(f'Tracer type {tracer.tracer_type} is not currently implemented with tracer_conservative transport') + ref_density_idx = self.field_names.index(tracer.density_name) + ref_density = split(self.X)[ref_density_idx] + q = tracer_prog*ref_density + tracer_adv = prognostic( + tracer_conservative_form(tracer_test, q, u), + tracer.name) else: raise ValueError(f'Transport eqn {tracer.transport_eqn} not recognised') diff --git a/gusto/transport_methods.py b/gusto/transport_methods.py index c646893d1..c890bd261 100644 --- a/gusto/transport_methods.py +++ b/gusto/transport_methods.py @@ -4,7 +4,7 @@ from firedrake import ( dx, dS, dS_v, dS_h, ds_t, ds_b, ds_v, dot, inner, outer, jump, - grad, div, FacetNormal, Function, sign, avg, cross, curl + grad, div, FacetNormal, Function, sign, avg, cross, curl, split ) from firedrake.fml import Term, keep, drop from gusto.configuration import IntegrateByParts, TransportEquationType @@ -35,6 +35,16 @@ def __init__(self, equation, variable): super().__init__(equation, variable, transport) self.transport_equation_type = self.original_form.terms[0].get(transport) + + if self.transport_equation_type == TransportEquationType.tracer_conservative: + # Extract associated density variable: + tracer_idx = self.equation.field_names.index(variable) + print(tracer_idx) + tracer = self.equation.active_tracers[tracer_idx] + density_idx = self.equation.field_names.index(tracer.density_name) + print(density_idx) + X = self.equation.X + self.conservative_density = split(self.equation.X)[density_idx] def replace_form(self, equation): """ @@ -175,17 +185,12 @@ def __init__(self, equation, variable, ibp=IntegrateByParts.ONCE, form = upwind_vector_invariant_form(self.domain, self.test, self.field, ibp=ibp) elif self.transport_equation_type == TransportEquationType.tracer_conservative: - # Can use the conservative equation, but ensuring the correct field - # for a mixing ratio. - if self.field.variable_type == TracerVariableType.density: - form = upwind_conservative_form(self.domain, self.test, self.field, ibp=ibp) - elif self.field.variable_type == TracerVariableType.mixing_ratio: - ref_density_idx = self.eqn.field_names.index(tracer.density_name) - ref_density = split(self.X)[ref_density_idx] - q = self.field*ref_density - form = upwind_conservative_form(self.domain, self.test, q, ibp=ibp) - - form = upwind_conservative_form(self.domain, self.test, self.field, ibp=ibp) + # Can use the conservative equation for the tracer multiplied + # by the associated density + #ref_density_idx = self.equation.field_names.index(variable.density_name) + #ref_density = split(self.X)[self.density_idx] + q = self.field*self.conservative_density + form = upwind_continuity_form(self.domain, self.test, q, ibp=ibp) else: raise NotImplementedError('Upwind transport scheme has not been ' + 'implemented for this transport equation type') From 649d35e581d1e72b65a385fdd98a2d27233f720b Mon Sep 17 00:00:00 2001 From: Tim Andrews Date: Wed, 13 Dec 2023 03:32:49 +0000 Subject: [PATCH 03/21] more changes --- gusto/common_forms.py | 11 +++++----- gusto/equations.py | 42 +++++++++++++++++++++++++++++++------- gusto/transport_methods.py | 5 ++--- 3 files changed, 43 insertions(+), 15 deletions(-) diff --git a/gusto/common_forms.py b/gusto/common_forms.py index d1355a44a..90073fad5 100644 --- a/gusto/common_forms.py +++ b/gusto/common_forms.py @@ -263,7 +263,7 @@ def split_continuity_form(equation): return equation -def tracer_conservative_form(test, q, ubar): +def tracer_conservative_form(test, q, rho, ubar): u""" The form corresponding to the continuity transport operator. @@ -272,15 +272,16 @@ def tracer_conservative_form(test, q, ubar): Args: test (:class:`TestFunction`): the test function. - q (:class:`ufl.Expr`): the tracer to be transported. If this - is a mixing ratio, q = m*rho. If it is a density, q = rho. + q (:class:`ufl.Expr`): the tracer to be transported. + rho (:class:`ufl.Expr`): the reference density that is to + be multiplied by q before taking the divergence ubar (:class:`ufl.Expr`): the transporting velocity. Returns: class:`LabelledForm`: a labelled transport form. """ - - L = inner(test, div(outer(q, ubar)))*dx + q_rho = q*rho + L = inner(test, div(outer(q_rho, ubar)))*dx form = transporting_velocity(L, ubar) return transport(form, TransportEquationType.tracer_conservative) diff --git a/gusto/equations.py b/gusto/equations.py index ab39733cd..297fefa5b 100644 --- a/gusto/equations.py +++ b/gusto/equations.py @@ -271,7 +271,29 @@ def generate_mass_terms(self): for i, (test, field_name) in enumerate(zip(self.tests, self.field_names)): prog = split(self.X)[i] + + # Hack for now + # I can't be sure that the index of active tracers is the same, + # so I need to search for the active_tracer.name == prog + #if self.active_tracers[i].transport_eqn == TransportEquationType.tracer_conservative: + # tracer = self.active_tracers[i] + # print(tracer.name) + # ref_density_idx = self.field_names.index(tracer.density_name) + # ref_density = split(self.X)[ref_density_idx] + # q = prog*ref_density + # mass = subject(prognostic(inner(q, test)*dx, field_name), self.X) + #print(self.active_tracers[i]) + + #if self.active_tracers.name + + #if prog.transport_eqn == TransportEquationType.tracer_conservative: + # print('yo') + + #else: + # mass = subject(prognostic(inner(prog, test)*dx, field_name), self.X) + mass = subject(prognostic(inner(prog, test)*dx, field_name), self.X) + if i == 0: mass_form = time_derivative(mass) else: @@ -430,7 +452,7 @@ def add_tracers_to_prognostics(self, domain, active_tracers): else: raise TypeError(f'Tracers must be ActiveTracer objects, not {type(tracer)}') - def generate_tracer_mass_terms(self): + def generate_tracer_mass_terms(self, active_tracers): """ Builds the weak time derivative terms for the equation set. @@ -445,16 +467,20 @@ def generate_tracer_mass_terms(self): :class:`LabelledForm`: a labelled form containing the mass terms. """ - for _, tracer in enumerate(active_tracers): + for i, tracer in enumerate(active_tracers): idx = self.field_names.index(tracer.name) + #print(idx) tracer_prog = split(self.X)[idx] tracer_test = self.tests[idx] if tracer.transport_eqn == TransportEquationType.tracer_conservative: ref_density_idx = self.field_names.index(tracer.density_name) ref_density = split(self.X)[ref_density_idx] + #print(i) + #print(ref_density_idx) q = tracer_prog*ref_density - mass = subject(prognostic(inner(q, test)*dx, field_name), self.X) - + mass = subject(prognostic(inner(q, tracer_test)*dx, self.field_name), self.X) + else: + mass = subject(prognostic(inner(tracer_prog, tracer_test)*dx, self.field_name), self.X) if i == 0: mass_form = time_derivative(mass) else: @@ -508,9 +534,9 @@ def generate_tracer_transport_terms(self, active_tracers): elif tracer.transport_eqn == TransportEquationType.tracer_conservative: ref_density_idx = self.field_names.index(tracer.density_name) ref_density = split(self.X)[ref_density_idx] - q = tracer_prog*ref_density + #q = tracer_prog*ref_density tracer_adv = prognostic( - tracer_conservative_form(tracer_test, q, u), + tracer_conservative_form(tracer_test, tracer_prog, ref_density, u), tracer.name) else: @@ -664,7 +690,9 @@ def __init__(self, domain, active_tracers, Vu=None): self.tests = TestFunctions(W) self.X = Function(W) - mass_form = self.generate_tracer_mass_terms() + print(full_field_name) + + mass_form = self.generate_tracer_mass_terms(active_tracers) self.residual = subject(mass_form, self.X) diff --git a/gusto/transport_methods.py b/gusto/transport_methods.py index c890bd261..b5569168d 100644 --- a/gusto/transport_methods.py +++ b/gusto/transport_methods.py @@ -39,11 +39,10 @@ def __init__(self, equation, variable): if self.transport_equation_type == TransportEquationType.tracer_conservative: # Extract associated density variable: tracer_idx = self.equation.field_names.index(variable) - print(tracer_idx) + #print(tracer_idx) tracer = self.equation.active_tracers[tracer_idx] density_idx = self.equation.field_names.index(tracer.density_name) - print(density_idx) - X = self.equation.X + #print(density_idx) self.conservative_density = split(self.equation.X)[density_idx] def replace_form(self, equation): From f94df7c7a9a5a69d6fdad8e8f36bb24254861041 Mon Sep 17 00:00:00 2001 From: Tim Andrews Date: Wed, 13 Dec 2023 21:57:07 +0000 Subject: [PATCH 04/21] DGUpwind scheme for tracer_conservative --- gusto/equations.py | 30 ++++++++++++------ gusto/transport_methods.py | 64 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 83 insertions(+), 11 deletions(-) diff --git a/gusto/equations.py b/gusto/equations.py index 297fefa5b..a21c1a34d 100644 --- a/gusto/equations.py +++ b/gusto/equations.py @@ -271,7 +271,7 @@ def generate_mass_terms(self): for i, (test, field_name) in enumerate(zip(self.tests, self.field_names)): prog = split(self.X)[i] - + print(i) # Hack for now # I can't be sure that the index of active tracers is the same, # so I need to search for the active_tracer.name == prog @@ -294,10 +294,14 @@ def generate_mass_terms(self): mass = subject(prognostic(inner(prog, test)*dx, field_name), self.X) + print(mass) + if i == 0: mass_form = time_derivative(mass) else: mass_form += time_derivative(mass) + + print(mass_form) return mass_form @@ -469,23 +473,32 @@ def generate_tracer_mass_terms(self, active_tracers): for i, tracer in enumerate(active_tracers): idx = self.field_names.index(tracer.name) - #print(idx) + print(idx) tracer_prog = split(self.X)[idx] tracer_test = self.tests[idx] + print(self.field_names[idx]) if tracer.transport_eqn == TransportEquationType.tracer_conservative: ref_density_idx = self.field_names.index(tracer.density_name) ref_density = split(self.X)[ref_density_idx] #print(i) #print(ref_density_idx) q = tracer_prog*ref_density - mass = subject(prognostic(inner(q, tracer_test)*dx, self.field_name), self.X) + mass = subject(prognostic(inner(q, tracer_test)*dx, self.field_names[idx]), self.X) + #mass = subject(inner(ref_density, prognostic(inner(tracer_prog, tracer_test), self.field_names[idx]))*dx, self.X) + #mass = subject(inner(ref_density, prognostic(inner(tracer_prog, tracer_test), tracer.name))*dx, self.X) + #mass = subject(prognostic(inner(tracer_prog, tracer_test)*dx, self.field_names[idx]), self.X) + #mass = prognostic(inner(q, tracer_test)*dx, tracer.name) else: - mass = subject(prognostic(inner(tracer_prog, tracer_test)*dx, self.field_name), self.X) + mass = subject(prognostic(inner(tracer_prog, tracer_test)*dx, self.field_names[idx]), self.X) + #mass = prognostic(inner(tracer_prog, tracer_test)*dx, tracer.name) + print(mass) if i == 0: mass_form = time_derivative(mass) else: mass_form += time_derivative(mass) + print(mass_form) + return mass_form def generate_tracer_transport_terms(self, active_tracers): @@ -628,9 +641,10 @@ def __init__(self, domain, active_tracers, Vu=None): self.tests = TestFunctions(W) self.X = Function(W) - mass_form = self.generate_mass_terms() + #mass_form = self.generate_mass_terms() - self.residual = subject(mass_form, self.X) + #self.residual = subject(mass_form, self.X) + self.residual = self.generate_mass_terms() # Add transport of tracers self.residual += self.generate_tracer_transport_terms(active_tracers) @@ -691,10 +705,8 @@ def __init__(self, domain, active_tracers, Vu=None): self.X = Function(W) print(full_field_name) - - mass_form = self.generate_tracer_mass_terms(active_tracers) - self.residual = subject(mass_form, self.X) + self.residual = self.generate_tracer_mass_terms(active_tracers) # Add transport of tracers self.residual += self.generate_tracer_transport_terms(active_tracers) diff --git a/gusto/transport_methods.py b/gusto/transport_methods.py index b5569168d..9818015b8 100644 --- a/gusto/transport_methods.py +++ b/gusto/transport_methods.py @@ -188,8 +188,8 @@ def __init__(self, equation, variable, ibp=IntegrateByParts.ONCE, # by the associated density #ref_density_idx = self.equation.field_names.index(variable.density_name) #ref_density = split(self.X)[self.density_idx] - q = self.field*self.conservative_density - form = upwind_continuity_form(self.domain, self.test, q, ibp=ibp) + #q = self.field*self.conservative_density + form = upwind_tracer_conservative_form(self.domain, self.test, self.field, self.conservative_density, ibp=ibp) else: raise NotImplementedError('Upwind transport scheme has not been ' + 'implemented for this transport equation type') @@ -314,6 +314,66 @@ def upwind_continuity_form(domain, test, q, ibp=IntegrateByParts.ONCE, outflow=F form = transporting_velocity(L, ubar) return ibp_label(transport(form, TransportEquationType.conservative), ibp) + +def upwind_tracer_conservative_form(domain, test, q, rho, ibp=IntegrateByParts.ONCE, outflow=False): + u""" + The form corresponding to the DG upwind continuity transport operator. + + This discretises ∇.(u*q*rho), for transporting velocity u, transported + variable q, and its reference density, rho. Although the tracer q obeys an advection + equation, the transport term is in a conservative form. + + Args: + domain (:class:`Domain`): the model's domain object, containing the + mesh and the compatible function spaces. + test (:class:`TestFunction`): the test function. + q (:class:`ufl.Expr`): the variable to be transported. + rho (:class:`ufl.Expr`): the reference density for the tracer. + ibp (:class:`IntegrateByParts`, optional): an enumerator representing + the number of times to integrate by parts. Defaults to + `IntegrateByParts.ONCE`. + outflow (bool, optional): whether to include outflow at the domain + boundaries, through exterior facet terms. Defaults to False. + + Raises: + ValueError: Can only use outflow option when the integration by parts + option is not "never". + + Returns: + class:`LabelledForm`: a labelled transport form. + """ + + if outflow and ibp == IntegrateByParts.NEVER: + raise ValueError("outflow is True and ibp is None are incompatible options") + Vu = domain.spaces("HDiv") + dS_ = (dS_v + dS_h) if Vu.extruded else dS + ubar = Function(Vu) + + if ibp == IntegrateByParts.ONCE: + L = -inner(grad(test), outer(inner(q,rho), ubar))*dx + else: + L = inner(test, div(outer(inner(q,rho), ubar)))*dx + + if ibp != IntegrateByParts.NEVER: + n = FacetNormal(domain.mesh) + un = 0.5*(dot(ubar, n) + abs(dot(ubar, n))) + + L += dot(jump(test), (un('+')*q('+')*rho('+') - un('-')*q('-')*rho('-')))*dS_ + + if ibp == IntegrateByParts.TWICE: + L -= (inner(test('+'), dot(ubar('+'), n('+'))*q('+')*rho('+')) + + inner(test('-'), dot(ubar('-'), n('-'))*q('-')*rho('-')))*dS_ + + if outflow: + n = FacetNormal(domain.mesh) + un = 0.5*(dot(ubar, n) + abs(dot(ubar, n))) + L += test*un*q*rho*(ds_v + ds_t + ds_b) + + form = transporting_velocity(L, ubar) + + print('DGUpwind with tracer conservative, called') + + return ibp_label(transport(form, TransportEquationType.tracer_conservative), ibp) def vector_manifold_advection_form(domain, test, q, ibp=IntegrateByParts.ONCE, outflow=False): From 9ca039527266483b8df5772d35dae1e420f55942 Mon Sep 17 00:00:00 2001 From: Tim Andrews Date: Tue, 19 Dec 2023 02:41:31 +0000 Subject: [PATCH 05/21] tidy up descriptions --- gusto/active_tracers.py | 7 ++--- gusto/common_forms.py | 10 +++---- gusto/configuration.py | 4 +-- gusto/equations.py | 54 ++++++++++++++------------------------ gusto/transport_methods.py | 8 +----- 5 files changed, 31 insertions(+), 52 deletions(-) diff --git a/gusto/active_tracers.py b/gusto/active_tracers.py index 93d0a1e73..3bc187a94 100644 --- a/gusto/active_tracers.py +++ b/gusto/active_tracers.py @@ -63,10 +63,11 @@ def __init__(self, name, space, variable_type, the type of tracer variable (e.g. mixing ratio or density). transport_eqn (:class:`TransportEquationType`, optional): enumerator indicating the type of transport equation to be solved (e.g. - advective). Defaults to `TransportEquationType.advective`.# + advective). Defaults to `TransportEquationType.advective`. density_name (str): the name of the associated density for a mixing - ratio when using the tracer_conservative transport. - Defaults to None. + ratio when using the tracer_conservative transport. Defaults to None, + but raises an error if tracer_conservative transport is used without + a specified density. phase (:class:`Phases`, optional): enumerator indicating the phase of the tracer variable. Defaults to `Phases.gas`. chemical (str, optional): string to describe the chemical that this diff --git a/gusto/common_forms.py b/gusto/common_forms.py index 90073fad5..6032f4a8a 100644 --- a/gusto/common_forms.py +++ b/gusto/common_forms.py @@ -267,14 +267,14 @@ def tracer_conservative_form(test, q, rho, ubar): u""" The form corresponding to the continuity transport operator. - This describes ∇.(u*q) for transporting velocity u and a - transported tracer, q. + This describes ∇.(u*q*rho) for transporting velocity u and a + transported tracer (mixing ratio), q, with an associated density, rho. Args: test (:class:`TestFunction`): the test function. - q (:class:`ufl.Expr`): the tracer to be transported. - rho (:class:`ufl.Expr`): the reference density that is to - be multiplied by q before taking the divergence + q (:class:`ufl.Expr`): the tracer to be transported. + rho (:class:`ufl.Expr`): the reference density that will + mulitply with q before taking the divergence. ubar (:class:`ufl.Expr`): the transporting velocity. Returns: diff --git a/gusto/configuration.py b/gusto/configuration.py index b2a3acfa0..0cd904509 100644 --- a/gusto/configuration.py +++ b/gusto/configuration.py @@ -31,8 +31,8 @@ class TransportEquationType(Enum): conservative: ∂q/∂t + ∇.(u*q) = 0 \n vector_invariant: ∂q/∂t + (∇×q)×u + (1/2)∇(q.u) + (1/2)[(∇q).u -(∇u).q)] = 0 circulation: ∂q/∂t + (∇×q)×u + non-transport terms = 0 - tracer_conservative: to fill in. for transporting a tracer that obeys an - advection equation in a conservative manner. + tracer_conservative: ∂(q*rho)/∂t + ∇.(u*q*rho) = 0, for a reference density of rho + for the tracer, q. """ no_transport = 702 diff --git a/gusto/equations.py b/gusto/equations.py index a21c1a34d..709a1fcaa 100644 --- a/gusto/equations.py +++ b/gusto/equations.py @@ -271,31 +271,7 @@ def generate_mass_terms(self): for i, (test, field_name) in enumerate(zip(self.tests, self.field_names)): prog = split(self.X)[i] - print(i) - # Hack for now - # I can't be sure that the index of active tracers is the same, - # so I need to search for the active_tracer.name == prog - #if self.active_tracers[i].transport_eqn == TransportEquationType.tracer_conservative: - # tracer = self.active_tracers[i] - # print(tracer.name) - # ref_density_idx = self.field_names.index(tracer.density_name) - # ref_density = split(self.X)[ref_density_idx] - # q = prog*ref_density - # mass = subject(prognostic(inner(q, test)*dx, field_name), self.X) - #print(self.active_tracers[i]) - - #if self.active_tracers.name - - #if prog.transport_eqn == TransportEquationType.tracer_conservative: - # print('yo') - - #else: - # mass = subject(prognostic(inner(prog, test)*dx, field_name), self.X) - mass = subject(prognostic(inner(prog, test)*dx, field_name), self.X) - - print(mass) - if i == 0: mass_form = time_derivative(mass) else: @@ -465,6 +441,7 @@ def generate_tracer_mass_terms(self, active_tracers): The mass terms can differ depending on the tracer type. A mixing ratio that is being transported conservatively will need its mass form multiplied + by a reference density. Returns: @@ -480,18 +457,23 @@ def generate_tracer_mass_terms(self, active_tracers): if tracer.transport_eqn == TransportEquationType.tracer_conservative: ref_density_idx = self.field_names.index(tracer.density_name) ref_density = split(self.X)[ref_density_idx] - #print(i) - #print(ref_density_idx) q = tracer_prog*ref_density mass = subject(prognostic(inner(q, tracer_test)*dx, self.field_names[idx]), self.X) - #mass = subject(inner(ref_density, prognostic(inner(tracer_prog, tracer_test), self.field_names[idx]))*dx, self.X) - #mass = subject(inner(ref_density, prognostic(inner(tracer_prog, tracer_test), tracer.name))*dx, self.X) - #mass = subject(prognostic(inner(tracer_prog, tracer_test)*dx, self.field_names[idx]), self.X) - #mass = prognostic(inner(q, tracer_test)*dx, tracer.name) + #term1 = ref_density*time_derivative(inner(tracer_prog, tracer_test)) + #term2 = tracer_prog*time_derivative(inner(ref_density, tracer_test)) + #mass_1 = subject(prognostic(term1*dx, self.field_names[idx]), self.X) + #mass_2 = subject(prognostic(term2*dx, self.field_names[idx]), self.X) + #if i == 0: + # mass_form = mass_1 + # mass_form += mass_2 + #else: + # mass_form += mass_1 + # mass_form += mass_2 + else: mass = subject(prognostic(inner(tracer_prog, tracer_test)*dx, self.field_names[idx]), self.X) #mass = prognostic(inner(tracer_prog, tracer_test)*dx, tracer.name) - print(mass) + if i == 0: mass_form = time_derivative(mass) else: @@ -641,9 +623,6 @@ def __init__(self, domain, active_tracers, Vu=None): self.tests = TestFunctions(W) self.X = Function(W) - #mass_form = self.generate_mass_terms() - - #self.residual = subject(mass_form, self.X) self.residual = self.generate_mass_terms() # Add transport of tracers @@ -709,7 +688,12 @@ def __init__(self, domain, active_tracers, Vu=None): self.residual = self.generate_tracer_mass_terms(active_tracers) # Add transport of tracers - self.residual += self.generate_tracer_transport_terms(active_tracers) + self.residual += self.generate_tracer_transport_terms(active_tracers) + + #self.residual = subject(self.generate_tracer_mass_terms(active_tracers),self.X) + + # Add transport of tracers + #self.residual += subject(self.generate_tracer_transport_terms(active_tracers),self.X) diff --git a/gusto/transport_methods.py b/gusto/transport_methods.py index 9818015b8..a4424acda 100644 --- a/gusto/transport_methods.py +++ b/gusto/transport_methods.py @@ -38,11 +38,10 @@ def __init__(self, equation, variable): if self.transport_equation_type == TransportEquationType.tracer_conservative: # Extract associated density variable: + # This does assume the same ordering of tracers and fields... tracer_idx = self.equation.field_names.index(variable) - #print(tracer_idx) tracer = self.equation.active_tracers[tracer_idx] density_idx = self.equation.field_names.index(tracer.density_name) - #print(density_idx) self.conservative_density = split(self.equation.X)[density_idx] def replace_form(self, equation): @@ -184,11 +183,6 @@ def __init__(self, equation, variable, ibp=IntegrateByParts.ONCE, form = upwind_vector_invariant_form(self.domain, self.test, self.field, ibp=ibp) elif self.transport_equation_type == TransportEquationType.tracer_conservative: - # Can use the conservative equation for the tracer multiplied - # by the associated density - #ref_density_idx = self.equation.field_names.index(variable.density_name) - #ref_density = split(self.X)[self.density_idx] - #q = self.field*self.conservative_density form = upwind_tracer_conservative_form(self.domain, self.test, self.field, self.conservative_density, ibp=ibp) else: raise NotImplementedError('Upwind transport scheme has not been ' From b14f4a07c6ff79aaa93abdcad66eb22e6c618289 Mon Sep 17 00:00:00 2001 From: Tom Bendall Date: Thu, 21 Dec 2023 18:15:49 +0000 Subject: [PATCH 06/21] add mass weighted label to time derivative and debugging statements. Almost working (but we don't have consistency!) --- gusto/equations.py | 26 +++++++------- gusto/labels.py | 1 + gusto/time_discretisation.py | 68 ++++++++++++++++++++++++++++++++++-- 3 files changed, 80 insertions(+), 15 deletions(-) diff --git a/gusto/equations.py b/gusto/equations.py index 709a1fcaa..ee3f0b530 100644 --- a/gusto/equations.py +++ b/gusto/equations.py @@ -14,7 +14,7 @@ from gusto.fields import PrescribedFields from gusto.labels import ( time_derivative, transport, prognostic, hydrostatic, linearisation, - pressure_gradient, coriolis + pressure_gradient, coriolis, mass_weighted ) from gusto.thermodynamics import exner_pressure from gusto.common_forms import ( @@ -276,7 +276,7 @@ def generate_mass_terms(self): mass_form = time_derivative(mass) else: mass_form += time_derivative(mass) - + print(mass_form) return mass_form @@ -438,11 +438,11 @@ def generate_tracer_mass_terms(self, active_tracers): Generates the weak time derivative terms ("mass terms") for all the prognostic variables of the equation set. - + The mass terms can differ depending on the tracer type. A mixing ratio that is being transported conservatively will need its mass form multiplied by a reference density. - + Returns: :class:`LabelledForm`: a labelled form containing the mass terms. @@ -458,7 +458,9 @@ def generate_tracer_mass_terms(self, active_tracers): ref_density_idx = self.field_names.index(tracer.density_name) ref_density = split(self.X)[ref_density_idx] q = tracer_prog*ref_density - mass = subject(prognostic(inner(q, tracer_test)*dx, self.field_names[idx]), self.X) + mass = mass_weighted( + subject(prognostic(inner(q, tracer_test)*dx, self.field_names[idx]), + self.X), (ref_density_idx, inner(tracer_prog, tracer_test)*dx)) #term1 = ref_density*time_derivative(inner(tracer_prog, tracer_test)) #term2 = tracer_prog*time_derivative(inner(ref_density, tracer_test)) #mass_1 = subject(prognostic(term1*dx, self.field_names[idx]), self.X) @@ -473,7 +475,7 @@ def generate_tracer_mass_terms(self, active_tracers): else: mass = subject(prognostic(inner(tracer_prog, tracer_test)*dx, self.field_names[idx]), self.X) #mass = prognostic(inner(tracer_prog, tracer_test)*dx, tracer.name) - + if i == 0: mass_form = time_derivative(mass) else: @@ -533,7 +535,7 @@ def generate_tracer_transport_terms(self, active_tracers): tracer_adv = prognostic( tracer_conservative_form(tracer_test, tracer_prog, ref_density, u), tracer.name) - + else: raise ValueError(f'Transport eqn {tracer.transport_eqn} not recognised') @@ -627,7 +629,7 @@ def __init__(self, domain, active_tracers, Vu=None): # Add transport of tracers self.residual += self.generate_tracer_transport_terms(active_tracers) - + class ConservativeCoupledTransportEquation(PrognosticEquationSet): u""" Discretises the transport equation, \n @@ -682,18 +684,18 @@ def __init__(self, domain, active_tracers, Vu=None): self.tests = TestFunctions(W) self.X = Function(W) - + print(full_field_name) self.residual = self.generate_tracer_mass_terms(active_tracers) # Add transport of tracers - self.residual += self.generate_tracer_transport_terms(active_tracers) - + self.residual += self.generate_tracer_transport_terms(active_tracers) + #self.residual = subject(self.generate_tracer_mass_terms(active_tracers),self.X) # Add transport of tracers - #self.residual += subject(self.generate_tracer_transport_terms(active_tracers),self.X) + #self.residual += subject(self.generate_tracer_transport_terms(active_tracers),self.X) diff --git a/gusto/labels.py b/gusto/labels.py index ec0fb4af4..8bdb1eb9e 100644 --- a/gusto/labels.py +++ b/gusto/labels.py @@ -90,6 +90,7 @@ def __call__(self, target, value=None): # ---------------------------------------------------------------------------- # time_derivative = Label("time_derivative") +mass_weighted = Label("mass_weighted", validator=lambda value: type(value) == tuple) implicit = Label("implicit") explicit = Label("explicit") transport = Label("transport", validator=lambda value: type(value) == TransportEquationType) diff --git a/gusto/time_discretisation.py b/gusto/time_discretisation.py index 79c8af94e..8419e3987 100644 --- a/gusto/time_discretisation.py +++ b/gusto/time_discretisation.py @@ -14,14 +14,14 @@ NonlinearVariationalSolver, DirichletBC, split, Constant ) from firedrake.fml import ( - replace_subject, replace_test_function, Term, all_terms, drop + replace_subject, replace_test_function, Term, all_terms, drop, keep ) from firedrake.formmanipulation import split_form from firedrake.utils import cached_property from gusto.configuration import EmbeddedDGOptions, RecoveryOptions from gusto.labels import (time_derivative, prognostic, physics_label, - implicit, explicit) + implicit, explicit, mass_weighted) from gusto.logging import logger, DEBUG, logging_ksp_monitor_true_residual from gusto.wrappers import * @@ -519,6 +519,17 @@ def setup(self, equation, apply_bcs=True, *active_labels): self.x0 = Function(self.fs) self.x1 = Function(self.fs) + # Work out if any sub-functions need special mass weighted handling + self.mass_weighted_idxs = [] + self.density_idxs = [] + for t in self.residual.terms: + if t.has_label(mass_weighted): + # Get the index in the mixed function space of this term, + # from the prognostic field name + idx = self.equation.field_names.index(t.get(prognostic)) + self.mass_weighted_idxs.append(idx) + self.density_idxs.append(t.get(mass_weighted)[0]) + @cached_property def lhs(self): """Set up the discretisation's left hand side (the time derivative).""" @@ -807,7 +818,23 @@ def setup(self, equation, apply_bcs=True, *active_labels): @cached_property def lhs(self): """Set up the discretisation's left hand side (the time derivative).""" - return super(ExplicitMultistage, self).lhs + + # Special handling for mass weighted time derivatives + # Explicit multi-stage solves for "k", which should be linear increment + # in the prognostic variables -- so we need to drop the mass weighted + # part to make the LHS linear. The non-mass weighted time derivative is + # (for now) stored in the mass weighted label + self.residual = self.residual.label_map( + lambda t: t.has_label(mass_weighted), + map_if_true=lambda t: Term(t.get(mass_weighted)[1], t.labels), + map_if_false=keep) + + l = self.residual.label_map( + lambda t: t.has_label(time_derivative), + map_if_true=replace_subject(self.x_out, self.idx), + map_if_false=drop) + + return l.form @cached_property def rhs(self): @@ -835,8 +862,19 @@ def rhs(self): return r.form + def print_stats(self, mixed_field, message): + min1 = np.min(mixed_field.dat[0].data) + max1 = np.max(mixed_field.dat[0].data) + min2 = np.min(mixed_field.dat[1].data) + max2 = np.max(mixed_field.dat[1].data) + logger.info(f'{message}: {min1} {max1} {min2} {max2}') + def solve_stage(self, x0, stage): self.x1.assign(x0) + + # Use x0 as a first guess (otherwise may not converge) + self.x_out.assign(x0) + for i in range(stage): self.x1.assign(self.x1 + self.dt*self.butcher_matrix[stage-1, i]*self.k[i]) for evaluate in self.evaluate_source: @@ -844,6 +882,28 @@ def solve_stage(self, x0, stage): if self.limiter is not None: self.limiter.apply(self.x1) self.solver.solve() + + self.print_stats(self.x1, f'x1 {stage}') + + self.print_stats(self.x_out, 'x_out before') + + # Need to divide by the updated density field if the LHS has a mass + # weighted time derivative + if len(self.mass_weighted_idxs) > 0: + # Loop through mixing ratios and the corresponding densities + for rho_idx, m_idx in zip(self.density_idxs, self.mass_weighted_idxs): + # Calculate updated density + rho = Function(self.fs[rho_idx]) + rho.assign(x0.subfunctions[rho_idx]) + for i in range(stage): + rho.assign(rho + self.dt*self.butcher_matrix[stage, i]*self.k[i].subfunctions[rho_idx]) + rho.assign(rho + self.dt*self.butcher_matrix[stage, stage]*self.x_out.subfunctions[rho_idx]) + logger.info(f'rho updated: {np.min(rho.dat.data)} {np.max(rho.dat.data)}') + # Divide mixing ratio increment by updated density + k_m = self.x_out.subfunctions[m_idx] + k_m.interpolate(k_m / rho) + self.print_stats(self.x_out, 'x_out_after') + self.k[stage].assign(self.x_out) if (stage == self.nStages - 1): @@ -855,6 +915,8 @@ def solve_stage(self, x0, stage): if self.limiter is not None: self.limiter.apply(self.x1) + self.print_stats(self.x1, f'x1 end') + def apply_cycle(self, x_out, x_in): """ Apply the time discretisation through a single sub-step. From f3064c3b376388b62e8cbe0bfff438add35808fd Mon Sep 17 00:00:00 2001 From: Tom Bendall Date: Sun, 21 Jan 2024 15:38:49 +0000 Subject: [PATCH 07/21] implement new way of writing explicit RK schemes --- gusto/equations.py | 36 +-- gusto/labels.py | 2 +- gusto/time_discretisation.py | 262 +++++++++++------- gusto/transport_methods.py | 8 +- .../model/test_time_discretisation.py | 12 +- 5 files changed, 181 insertions(+), 139 deletions(-) diff --git a/gusto/equations.py b/gusto/equations.py index ee3f0b530..8b64baf6a 100644 --- a/gusto/equations.py +++ b/gusto/equations.py @@ -14,7 +14,7 @@ from gusto.fields import PrescribedFields from gusto.labels import ( time_derivative, transport, prognostic, hydrostatic, linearisation, - pressure_gradient, coriolis, mass_weighted + pressure_gradient, coriolis ) from gusto.thermodynamics import exner_pressure from gusto.common_forms import ( @@ -277,8 +277,6 @@ def generate_mass_terms(self): else: mass_form += time_derivative(mass) - print(mass_form) - return mass_form # ======================================================================== # @@ -450,39 +448,24 @@ def generate_tracer_mass_terms(self, active_tracers): for i, tracer in enumerate(active_tracers): idx = self.field_names.index(tracer.name) - print(idx) tracer_prog = split(self.X)[idx] tracer_test = self.tests[idx] - print(self.field_names[idx]) + if tracer.transport_eqn == TransportEquationType.tracer_conservative: ref_density_idx = self.field_names.index(tracer.density_name) ref_density = split(self.X)[ref_density_idx] q = tracer_prog*ref_density - mass = mass_weighted( - subject(prognostic(inner(q, tracer_test)*dx, self.field_names[idx]), - self.X), (ref_density_idx, inner(tracer_prog, tracer_test)*dx)) - #term1 = ref_density*time_derivative(inner(tracer_prog, tracer_test)) - #term2 = tracer_prog*time_derivative(inner(ref_density, tracer_test)) - #mass_1 = subject(prognostic(term1*dx, self.field_names[idx]), self.X) - #mass_2 = subject(prognostic(term2*dx, self.field_names[idx]), self.X) - #if i == 0: - # mass_form = mass_1 - # mass_form += mass_2 - #else: - # mass_form += mass_1 - # mass_form += mass_2 - + mass = subject(prognostic(inner(q, tracer_test)*dx, + self.field_names[idx]), self.X) else: - mass = subject(prognostic(inner(tracer_prog, tracer_test)*dx, self.field_names[idx]), self.X) - #mass = prognostic(inner(tracer_prog, tracer_test)*dx, tracer.name) + mass = subject(prognostic(inner(tracer_prog, tracer_test)*dx, + self.field_names[idx]), self.X) if i == 0: mass_form = time_derivative(mass) else: mass_form += time_derivative(mass) - print(mass_form) - return mass_form def generate_tracer_transport_terms(self, active_tracers): @@ -685,18 +668,11 @@ def __init__(self, domain, active_tracers, Vu=None): self.tests = TestFunctions(W) self.X = Function(W) - print(full_field_name) - self.residual = self.generate_tracer_mass_terms(active_tracers) # Add transport of tracers self.residual += self.generate_tracer_transport_terms(active_tracers) - #self.residual = subject(self.generate_tracer_mass_terms(active_tracers),self.X) - - # Add transport of tracers - #self.residual += subject(self.generate_tracer_transport_terms(active_tracers),self.X) - # ============================================================================ # diff --git a/gusto/labels.py b/gusto/labels.py index 8bdb1eb9e..129184056 100644 --- a/gusto/labels.py +++ b/gusto/labels.py @@ -90,7 +90,7 @@ def __call__(self, target, value=None): # ---------------------------------------------------------------------------- # time_derivative = Label("time_derivative") -mass_weighted = Label("mass_weighted", validator=lambda value: type(value) == tuple) +mass_weighted = Label("mass_weighted", validator=lambda value: type(value) == str) implicit = Label("implicit") explicit = Label("explicit") transport = Label("transport", validator=lambda value: type(value) == TransportEquationType) diff --git a/gusto/time_discretisation.py b/gusto/time_discretisation.py index 8419e3987..c9c25cf06 100644 --- a/gusto/time_discretisation.py +++ b/gusto/time_discretisation.py @@ -21,7 +21,7 @@ from gusto.configuration import EmbeddedDGOptions, RecoveryOptions from gusto.labels import (time_derivative, prognostic, physics_label, - implicit, explicit, mass_weighted) + implicit, explicit) from gusto.logging import logger, DEBUG, logging_ksp_monitor_true_residual from gusto.wrappers import * @@ -519,17 +519,6 @@ def setup(self, equation, apply_bcs=True, *active_labels): self.x0 = Function(self.fs) self.x1 = Function(self.fs) - # Work out if any sub-functions need special mass weighted handling - self.mass_weighted_idxs = [] - self.density_idxs = [] - for t in self.residual.terms: - if t.has_label(mass_weighted): - # Get the index in the mixed function space of this term, - # from the prognostic field name - idx = self.equation.field_names.index(t.get(prognostic)) - self.mass_weighted_idxs.append(idx) - self.density_idxs.append(t.get(mass_weighted)[0]) - @cached_property def lhs(self): """Set up the discretisation's left hand side (the time derivative).""" @@ -761,8 +750,9 @@ class ExplicitMultistage(ExplicitTimeDiscretisation): # [ b_0 b_1 . b_s] # --------------------------------------------------------------------------- - def __init__(self, domain, butcher_matrix, field_name=None, fixed_subcycles=None, - subcycle_by_courant=None, solver_parameters=None, + def __init__(self, domain, butcher_matrix, field_name=None, + fixed_subcycles=None, subcycle_by_courant=None, + increment_form=True, solver_parameters=None, limiter=None, options=None): """ Args: @@ -781,6 +771,9 @@ def __init__(self, domain, butcher_matrix, field_name=None, fixed_subcycles=None for one sub-cycle. Defaults to None, in which case adaptive sub-cycling is not used. This option cannot be specified with the `fixed_subcycles` argument. + increment_form (bool, optional): whether to write the RK scheme in + "increment form", solving for increments rather than updated + fields. Defaults to True. solver_parameters (dict, optional): dictionary of parameters to pass to the underlying solver. Defaults to None. limiter (:class:`Limiter` object, optional): a limiter to apply to @@ -797,6 +790,7 @@ def __init__(self, domain, butcher_matrix, field_name=None, fixed_subcycles=None limiter=limiter, options=options) self.butcher_matrix = butcher_matrix self.nbutcher = int(np.shape(self.butcher_matrix)[0]) + self.increment_form = increment_form @property def nStages(self): @@ -813,109 +807,162 @@ def setup(self, equation, apply_bcs=True, *active_labels): """ super().setup(equation, apply_bcs, *active_labels) - self.k = [Function(self.fs) for i in range(self.nStages)] + if not self.increment_form: + self.field_i = [Function(self.fs) for i in range(self.nStages+1)] + else: + self.k = [Function(self.fs) for i in range(self.nStages)] + + @cached_property + def solver(self): + if self.increment_form: + return super().solver + else: + # In this case, don't set snes_type to ksp only, as we do want the + # outer Newton iteration + solver_list = [] + + for stage in range(self.nStages): + # setup linear solver using lhs and rhs defined in derived class + problem = NonlinearVariationalProblem(self.lhs[stage].form - self.rhs[stage].form, self.field_i[stage+1], bcs=self.bcs) + solver_name = self.field_name+self.__class__.__name__+str(stage) + solver = NonlinearVariationalSolver(problem, solver_parameters=self.solver_parameters, + options_prefix=solver_name) + solver_list.append(solver) + return solver_list + @cached_property def lhs(self): """Set up the discretisation's left hand side (the time derivative).""" - # Special handling for mass weighted time derivatives - # Explicit multi-stage solves for "k", which should be linear increment - # in the prognostic variables -- so we need to drop the mass weighted - # part to make the LHS linear. The non-mass weighted time derivative is - # (for now) stored in the mass weighted label - self.residual = self.residual.label_map( - lambda t: t.has_label(mass_weighted), - map_if_true=lambda t: Term(t.get(mass_weighted)[1], t.labels), - map_if_false=keep) + if self.increment_form: + l = self.residual.label_map( + lambda t: t.has_label(time_derivative), + map_if_true=replace_subject(self.x_out, self.idx), + map_if_false=drop) - l = self.residual.label_map( - lambda t: t.has_label(time_derivative), - map_if_true=replace_subject(self.x_out, self.idx), - map_if_false=drop) + return l.form + + else: + lhs_list = [] + for stage in range(self.nStages): + l = self.residual.label_map( + lambda t: t.has_label(time_derivative), + map_if_true=replace_subject(self.field_i[stage+1], self.idx), + map_if_false=drop) + lhs_list.append(l) + + return lhs_list - return l.form @cached_property def rhs(self): """Set up the time discretisation's right hand side.""" - r = self.residual.label_map( - all_terms, - map_if_true=replace_subject(self.x1, old_idx=self.idx)) - r = r.label_map( - lambda t: t.has_label(time_derivative), - map_if_true=drop, - map_if_false=lambda t: -1*t) - - # If there are no active labels, we may have no terms at this point - # So that we can still do xnp1 = xn, put in a zero term here - if len(r.terms) == 0: - logger.warning('No terms detected for RHS of explicit problem. ' - + 'Adding a zero term to avoid failure.') - null_term = Constant(0.0)*self.residual.label_map( + if self.increment_form: + r = self.residual.label_map( + all_terms, + map_if_true=replace_subject(self.x1, old_idx=self.idx)) + + r = r.label_map( lambda t: t.has_label(time_derivative), - # Drop label from this - map_if_true=lambda t: time_derivative.remove(t), - map_if_false=drop) - r += null_term + map_if_true=drop, + map_if_false=lambda t: -1*t) + + # If there are no active labels, we may have no terms at this point + # So that we can still do xnp1 = xn, put in a zero term here + if self.increment_form and len(r.terms) == 0: + logger.warning('No terms detected for RHS of explicit problem. ' + + 'Adding a zero term to avoid failure.') + null_term = Constant(0.0)*self.residual.label_map( + lambda t: t.has_label(time_derivative), + # Drop label from this + map_if_true=lambda t: time_derivative.remove(t), + map_if_false=drop) + r += null_term + + return r.form - return r.form + else: + rhs_list = [] - def print_stats(self, mixed_field, message): - min1 = np.min(mixed_field.dat[0].data) - max1 = np.max(mixed_field.dat[0].data) - min2 = np.min(mixed_field.dat[1].data) - max2 = np.max(mixed_field.dat[1].data) - logger.info(f'{message}: {min1} {max1} {min2} {max2}') + for stage in range(self.nStages): + r = self.residual.label_map( + lambda t: t.has_label(time_derivative), + map_if_true=replace_subject(self.field_i[0], old_idx=self.idx), + map_if_false=replace_subject(self.field_i[0], old_idx=self.idx)) - def solve_stage(self, x0, stage): - self.x1.assign(x0) + r = r.label_map( + lambda t: t.has_label(time_derivative), + map_if_true=keep, + map_if_false=lambda t: -self.butcher_matrix[stage, 0]*self.dt*t) - # Use x0 as a first guess (otherwise may not converge) - self.x_out.assign(x0) + for i in range(1, stage+1): + r_i = self.residual.label_map( + lambda t: t.has_label(time_derivative), + map_if_true=drop, + map_if_false=replace_subject(self.field_i[i], old_idx=self.idx) + ) - for i in range(stage): - self.x1.assign(self.x1 + self.dt*self.butcher_matrix[stage-1, i]*self.k[i]) - for evaluate in self.evaluate_source: - evaluate(self.x1, self.dt) - if self.limiter is not None: - self.limiter.apply(self.x1) - self.solver.solve() + r -= self.butcher_matrix[stage, i]*self.dt*r_i - self.print_stats(self.x1, f'x1 {stage}') - - self.print_stats(self.x_out, 'x_out before') - - # Need to divide by the updated density field if the LHS has a mass - # weighted time derivative - if len(self.mass_weighted_idxs) > 0: - # Loop through mixing ratios and the corresponding densities - for rho_idx, m_idx in zip(self.density_idxs, self.mass_weighted_idxs): - # Calculate updated density - rho = Function(self.fs[rho_idx]) - rho.assign(x0.subfunctions[rho_idx]) - for i in range(stage): - rho.assign(rho + self.dt*self.butcher_matrix[stage, i]*self.k[i].subfunctions[rho_idx]) - rho.assign(rho + self.dt*self.butcher_matrix[stage, stage]*self.x_out.subfunctions[rho_idx]) - logger.info(f'rho updated: {np.min(rho.dat.data)} {np.max(rho.dat.data)}') - # Divide mixing ratio increment by updated density - k_m = self.x_out.subfunctions[m_idx] - k_m.interpolate(k_m / rho) - self.print_stats(self.x_out, 'x_out_after') + rhs_list.append(r) - self.k[stage].assign(self.x_out) + return rhs_list + + def solve_stage(self, x0, stage): - if (stage == self.nStages - 1): + if self.increment_form: self.x1.assign(x0) - for i in range(self.nStages): - self.x1.assign(self.x1 + self.dt*self.butcher_matrix[stage, i]*self.k[i]) - self.x1.assign(self.x1) + # Use x0 as a first guess (otherwise may not converge) + self.x_out.assign(x0) + + for i in range(stage): + self.x1.assign(self.x1 + self.dt*self.butcher_matrix[stage-1, i]*self.k[i]) + for evaluate in self.evaluate_source: + evaluate(self.x1, self.dt) if self.limiter is not None: self.limiter.apply(self.x1) + self.solver.solve() + + self.k[stage].assign(self.x_out) + + if (stage == self.nStages - 1): + self.x1.assign(x0) + for i in range(self.nStages): + self.x1.assign(self.x1 + self.dt*self.butcher_matrix[stage, i]*self.k[i]) + self.x1.assign(self.x1) + + if self.limiter is not None: + self.limiter.apply(self.x1) + + else: + # Set initial field + if stage == 0: + self.field_i[0].assign(x0) + + # Use x0 as a first guess (otherwise may not converge) + self.field_i[stage+1].assign(x0) + + # Update field_i for physics / limiters + for evaluate in self.evaluate_source: + # TODO: not implemented! Here we need to evaluate the m-th term + # in the i-th RHS with field_m + raise NotImplementedError( + 'Physics not implemented with RK schemes that do not use ' + + 'the increment form') + if self.limiter is not None: + self.limiter.apply(self.field_i[stage]) + + # Obtain field_ip1 = field_n - dt* sum_m{c_im*F[field_m]} + self.solver[stage].solve() + + if (stage == self.nStages - 1): + self.x1.assign(self.field_i[stage+1]) + if self.limiter is not None: + self.limiter.apply(self.x1) - self.print_stats(self.x1, f'x1 end') def apply_cycle(self, x_out, x_in): """ @@ -944,8 +991,8 @@ class ForwardEuler(ExplicitMultistage): y^(n+1) = y^n + dt*k0 \n """ def __init__(self, domain, field_name=None, fixed_subcycles=None, - subcycle_by_courant=None, solver_parameters=None, - limiter=None, options=None): + subcycle_by_courant=None, increment_form=True, + solver_parameters=None, limiter=None, options=None): """ Args: domain (:class:`Domain`): the model's domain object, containing the @@ -961,6 +1008,9 @@ def __init__(self, domain, field_name=None, fixed_subcycles=None, for one sub-cycle. Defaults to None, in which case adaptive sub-cycling is not used. This option cannot be specified with the `fixed_subcycles` argument. + increment_form (bool, optional): whether to write the RK scheme in + "increment form", solving for increments rather than updated + fields. Defaults to True. solver_parameters (dict, optional): dictionary of parameters to pass to the underlying solver. Defaults to None. limiter (:class:`Limiter` object, optional): a limiter to apply to @@ -974,6 +1024,7 @@ def __init__(self, domain, field_name=None, fixed_subcycles=None, super().__init__(domain, butcher_matrix, field_name=field_name, fixed_subcycles=fixed_subcycles, subcycle_by_courant=subcycle_by_courant, + increment_form=increment_form, solver_parameters=solver_parameters, limiter=limiter, options=options) @@ -989,8 +1040,8 @@ class SSPRK3(ExplicitMultistage): y^(n+1) = y^n + (1/6)*dt*(k0 + k1 + 4*k2) \n """ def __init__(self, domain, field_name=None, fixed_subcycles=None, - subcycle_by_courant=None, solver_parameters=None, - limiter=None, options=None): + subcycle_by_courant=None, increment_form=True, + solver_parameters=None, limiter=None, options=None): """ Args: domain (:class:`Domain`): the model's domain object, containing the @@ -1006,6 +1057,9 @@ def __init__(self, domain, field_name=None, fixed_subcycles=None, for one sub-cycle. Defaults to None, in which case adaptive sub-cycling is not used. This option cannot be specified with the `fixed_subcycles` argument. + increment_form (bool, optional): whether to write the RK scheme in + "increment form", solving for increments rather than updated + fields. Defaults to True. solver_parameters (dict, optional): dictionary of parameters to pass to the underlying solver. Defaults to None. limiter (:class:`Limiter` object, optional): a limiter to apply to @@ -1016,9 +1070,11 @@ def __init__(self, domain, field_name=None, fixed_subcycles=None, recovery method. Defaults to None. """ butcher_matrix = np.array([[1., 0., 0.], [1./4., 1./4., 0.], [1./6., 1./6., 2./3.]]) + super().__init__(domain, butcher_matrix, field_name=field_name, fixed_subcycles=fixed_subcycles, subcycle_by_courant=subcycle_by_courant, + increment_form=increment_form, solver_parameters=solver_parameters, limiter=limiter, options=options) @@ -1039,7 +1095,8 @@ class RK4(ExplicitMultistage): where superscripts indicate the time-level. \n """ def __init__(self, domain, field_name=None, fixed_subcycles=None, - subcycle_by_courant=None, solver_parameters=None, + subcycle_by_courant=None, increment_form=True, + solver_parameters=None, limiter=None, options=None): """ Args: @@ -1056,6 +1113,9 @@ def __init__(self, domain, field_name=None, fixed_subcycles=None, for one sub-cycle. Defaults to None, in which case adaptive sub-cycling is not used. This option cannot be specified with the `fixed_subcycles` argument. + increment_form (bool, optional): whether to write the RK scheme in + "increment form", solving for increments rather than updated + fields. Defaults to True. solver_parameters (dict, optional): dictionary of parameters to pass to the underlying solver. Defaults to None. limiter (:class:`Limiter` object, optional): a limiter to apply to @@ -1069,6 +1129,7 @@ def __init__(self, domain, field_name=None, fixed_subcycles=None, super().__init__(domain, butcher_matrix, field_name=field_name, fixed_subcycles=fixed_subcycles, subcycle_by_courant=subcycle_by_courant, + increment_form=increment_form, solver_parameters=solver_parameters, limiter=limiter, options=options) @@ -1087,8 +1148,8 @@ class Heun(ExplicitMultistage): number. """ def __init__(self, domain, field_name=None, fixed_subcycles=None, - subcycle_by_courant=None, solver_parameters=None, - limiter=None, options=None): + subcycle_by_courant=None, increment_form=True, + solver_parameters=None, limiter=None, options=None): """ Args: domain (:class:`Domain`): the model's domain object, containing the @@ -1104,6 +1165,9 @@ def __init__(self, domain, field_name=None, fixed_subcycles=None, for one sub-cycle. Defaults to None, in which case adaptive sub-cycling is not used. This option cannot be specified with the `fixed_subcycles` argument. + increment_form (bool, optional): whether to write the RK scheme in + "increment form", solving for increments rather than updated + fields. Defaults to True. solver_parameters (dict, optional): dictionary of parameters to pass to the underlying solver. Defaults to None. limiter (:class:`Limiter` object, optional): a limiter to apply to @@ -1117,6 +1181,7 @@ def __init__(self, domain, field_name=None, fixed_subcycles=None, super().__init__(domain, butcher_matrix, field_name=field_name, fixed_subcycles=fixed_subcycles, subcycle_by_courant=subcycle_by_courant, + increment_form=increment_form, solver_parameters=solver_parameters, limiter=limiter, options=options) @@ -1919,7 +1984,6 @@ def apply(self, x_out, *x_in): """ if self.initial_timesteps < self.nlevels-1: self.initial_timesteps += 1 - print(self.initial_timesteps) solver = self.solver0 else: solver = self.solver diff --git a/gusto/transport_methods.py b/gusto/transport_methods.py index a4424acda..274ba326b 100644 --- a/gusto/transport_methods.py +++ b/gusto/transport_methods.py @@ -35,7 +35,7 @@ def __init__(self, equation, variable): super().__init__(equation, variable, transport) self.transport_equation_type = self.original_form.terms[0].get(transport) - + if self.transport_equation_type == TransportEquationType.tracer_conservative: # Extract associated density variable: # This does assume the same ordering of tracers and fields... @@ -308,14 +308,14 @@ def upwind_continuity_form(domain, test, q, ibp=IntegrateByParts.ONCE, outflow=F form = transporting_velocity(L, ubar) return ibp_label(transport(form, TransportEquationType.conservative), ibp) - + def upwind_tracer_conservative_form(domain, test, q, rho, ibp=IntegrateByParts.ONCE, outflow=False): u""" The form corresponding to the DG upwind continuity transport operator. This discretises ∇.(u*q*rho), for transporting velocity u, transported variable q, and its reference density, rho. Although the tracer q obeys an advection - equation, the transport term is in a conservative form. + equation, the transport term is in a conservative form. Args: domain (:class:`Domain`): the model's domain object, containing the @@ -364,8 +364,6 @@ def upwind_tracer_conservative_form(domain, test, q, rho, ibp=IntegrateByParts.O L += test*un*q*rho*(ds_v + ds_t + ds_b) form = transporting_velocity(L, ubar) - - print('DGUpwind with tracer conservative, called') return ibp_label(transport(form, TransportEquationType.tracer_conservative), ibp) diff --git a/integration-tests/model/test_time_discretisation.py b/integration-tests/model/test_time_discretisation.py index 6f114fe90..f4d9ddf2f 100644 --- a/integration-tests/model/test_time_discretisation.py +++ b/integration-tests/model/test_time_discretisation.py @@ -8,8 +8,10 @@ def run(timestepper, tmax, f_end): return norm(timestepper.fields("f") - f_end) / norm(f_end) -@pytest.mark.parametrize("scheme", ["ssprk", "TrapeziumRule", "ImplicitMidpoint", "QinZhang", - "RK4", "Heun", "BDF2", "TR_BDF2", "AdamsBashforth", "Leapfrog", "AdamsMoulton"]) +@pytest.mark.parametrize("scheme", + ["ssprk3_increment", "TrapeziumRule", "ImplicitMidpoint", "QinZhang", "RK4", + "Heun", "BDF2", "TR_BDF2", "AdamsBashforth", "Leapfrog", "AdamsMoulton", + "ssprk3_predictor"]) def test_time_discretisation(tmpdir, scheme, tracer_setup): if (scheme == "AdamsBashforth"): # Tighter stability constraints @@ -25,8 +27,10 @@ def test_time_discretisation(tmpdir, scheme, tracer_setup): V = domain.spaces("DG") eqn = AdvectionEquation(domain, V, "f") - if scheme == "ssprk": - transport_scheme = SSPRK3(domain) + if scheme == "ssprk3_increment": + transport_scheme = SSPRK3(domain, increment_form=True) + elif scheme == "ssprk3_predictor": + transport_scheme = SSPRK3(domain, increment_form=False) elif scheme == "TrapeziumRule": transport_scheme = TrapeziumRule(domain) elif scheme == "ImplicitMidpoint": From ef4582ff4cf910223e8fa7a70864189033ce72b3 Mon Sep 17 00:00:00 2001 From: Tom Bendall Date: Sun, 21 Jan 2024 15:50:23 +0000 Subject: [PATCH 08/21] remove mass weighted label --- gusto/labels.py | 1 - 1 file changed, 1 deletion(-) diff --git a/gusto/labels.py b/gusto/labels.py index 129184056..ec0fb4af4 100644 --- a/gusto/labels.py +++ b/gusto/labels.py @@ -90,7 +90,6 @@ def __call__(self, target, value=None): # ---------------------------------------------------------------------------- # time_derivative = Label("time_derivative") -mass_weighted = Label("mass_weighted", validator=lambda value: type(value) == str) implicit = Label("implicit") explicit = Label("explicit") transport = Label("transport", validator=lambda value: type(value) == TransportEquationType) From 738b9513738edeaecfef42421d5fd0394f68f1c8 Mon Sep 17 00:00:00 2001 From: Tom Bendall Date: Sun, 21 Jan 2024 16:02:59 +0000 Subject: [PATCH 09/21] lint fixes --- gusto/active_tracers.py | 11 +++++--- gusto/common_forms.py | 9 ++++--- gusto/equations.py | 26 ++++++++----------- gusto/time_discretisation.py | 14 +++++----- gusto/transport_methods.py | 8 +++--- .../model/test_time_discretisation.py | 8 +++--- 6 files changed, 39 insertions(+), 37 deletions(-) diff --git a/gusto/active_tracers.py b/gusto/active_tracers.py index 3bc187a94..60329e5fb 100644 --- a/gusto/active_tracers.py +++ b/gusto/active_tracers.py @@ -85,12 +85,15 @@ def __init__(self, name, space, variable_type, self.phase = phase self.chemical = chemical - if (variable_type == TracerVariableType.density and transport_eqn == TransportEquationType.advective): + if (variable_type == TracerVariableType.density + and transport_eqn == TransportEquationType.advective): logger.warning('Active tracer initialised which describes a ' + 'density but solving the advective transport eqn') - - if (transport_eqn == TransportEquationType.tracer_conservative and density_name == None): - raise ValueError(f'Active tracer {name} using tracer conservative transport needs an associated density.') + + if (transport_eqn == TransportEquationType.tracer_conservative + and density_name is None): + raise ValueError(f'Active tracer {name} using tracer conservative ' + + 'transport needs an associated density.') class WaterVapour(ActiveTracer): diff --git a/gusto/common_forms.py b/gusto/common_forms.py index 6032f4a8a..83dad21ff 100644 --- a/gusto/common_forms.py +++ b/gusto/common_forms.py @@ -262,12 +262,13 @@ def split_continuity_form(equation): map_if_true=drop) return equation - + + def tracer_conservative_form(test, q, rho, ubar): u""" The form corresponding to the continuity transport operator. - This describes ∇.(u*q*rho) for transporting velocity u and a + This describes ∇.(u*q*rho) for transporting velocity u and a transported tracer (mixing ratio), q, with an associated density, rho. Args: @@ -280,9 +281,9 @@ def tracer_conservative_form(test, q, rho, ubar): Returns: class:`LabelledForm`: a labelled transport form. """ + q_rho = q*rho L = inner(test, div(outer(q_rho, ubar)))*dx form = transporting_velocity(L, ubar) - + return transport(form, TransportEquationType.tracer_conservative) - diff --git a/gusto/equations.py b/gusto/equations.py index 8b64baf6a..7fa0eb071 100644 --- a/gusto/equations.py +++ b/gusto/equations.py @@ -514,10 +514,9 @@ def generate_tracer_transport_terms(self, active_tracers): elif tracer.transport_eqn == TransportEquationType.tracer_conservative: ref_density_idx = self.field_names.index(tracer.density_name) ref_density = split(self.X)[ref_density_idx] - #q = tracer_prog*ref_density tracer_adv = prognostic( - tracer_conservative_form(tracer_test, tracer_prog, ref_density, u), - tracer.name) + tracer_conservative_form(tracer_test, tracer_prog, + ref_density, u), tracer.name) else: raise ValueError(f'Transport eqn {tracer.transport_eqn} not recognised') @@ -613,18 +612,17 @@ def __init__(self, domain, active_tracers, Vu=None): # Add transport of tracers self.residual += self.generate_tracer_transport_terms(active_tracers) + class ConservativeCoupledTransportEquation(PrognosticEquationSet): u""" - Discretises the transport equation, \n - ∂q/∂t + (u.∇)q = F, - with the application of active tracers. - As there are multiple tracers or species that are - interacting, q and F are vectors. - This equation can be enhanced through the addition of - sources or sinks (F) by applying it with physics schemes. - This takes in tracers that might obey different forms - of the transport equation (i.e. advective, conservative) - but will evolve all the fields in a conservative manner. + Discretises the transport equation, \n + ∂q/∂t + (u.∇)q = F, \n + with the application of active tracers. As there are multiple tracers or + species that are interacting, q and F are vectors. This equation can be + enhanced through the addition of sources or sinks (F) by applying it with + physics schemes. This takes in tracers that might obey different forms of + the transport equation (i.e. advective, conservative) but will evolve all + the fields in a conservative manner. """ def __init__(self, domain, active_tracers, Vu=None): """ @@ -674,12 +672,10 @@ def __init__(self, domain, active_tracers, Vu=None): self.residual += self.generate_tracer_transport_terms(active_tracers) - # ============================================================================ # # Specified Equation Sets # ============================================================================ # - class ShallowWaterEquations(PrognosticEquationSet): u""" Class for the (rotating) shallow-water equations, which evolve the velocity diff --git a/gusto/time_discretisation.py b/gusto/time_discretisation.py index c9c25cf06..e93c2226d 100644 --- a/gusto/time_discretisation.py +++ b/gusto/time_discretisation.py @@ -823,14 +823,16 @@ def solver(self): for stage in range(self.nStages): # setup linear solver using lhs and rhs defined in derived class - problem = NonlinearVariationalProblem(self.lhs[stage].form - self.rhs[stage].form, self.field_i[stage+1], bcs=self.bcs) + problem = NonlinearVariationalProblem( + self.lhs[stage].form - self.rhs[stage].form, + self.field_i[stage+1], bcs=self.bcs) solver_name = self.field_name+self.__class__.__name__+str(stage) - solver = NonlinearVariationalSolver(problem, solver_parameters=self.solver_parameters, - options_prefix=solver_name) + solver = NonlinearVariationalSolver( + problem, solver_parameters=self.solver_parameters, + options_prefix=solver_name) solver_list.append(solver) return solver_list - @cached_property def lhs(self): """Set up the discretisation's left hand side (the time derivative).""" @@ -854,7 +856,6 @@ def lhs(self): return lhs_list - @cached_property def rhs(self): """Set up the time discretisation's right hand side.""" @@ -873,7 +874,7 @@ def rhs(self): # So that we can still do xnp1 = xn, put in a zero term here if self.increment_form and len(r.terms) == 0: logger.warning('No terms detected for RHS of explicit problem. ' - + 'Adding a zero term to avoid failure.') + + 'Adding a zero term to avoid failure.') null_term = Constant(0.0)*self.residual.label_map( lambda t: t.has_label(time_derivative), # Drop label from this @@ -963,7 +964,6 @@ def solve_stage(self, x0, stage): if self.limiter is not None: self.limiter.apply(self.x1) - def apply_cycle(self, x_out, x_in): """ Apply the time discretisation through a single sub-step. diff --git a/gusto/transport_methods.py b/gusto/transport_methods.py index 274ba326b..cd43b921f 100644 --- a/gusto/transport_methods.py +++ b/gusto/transport_methods.py @@ -309,7 +309,9 @@ def upwind_continuity_form(domain, test, q, ibp=IntegrateByParts.ONCE, outflow=F return ibp_label(transport(form, TransportEquationType.conservative), ibp) -def upwind_tracer_conservative_form(domain, test, q, rho, ibp=IntegrateByParts.ONCE, outflow=False): + +def upwind_tracer_conservative_form(domain, test, q, rho, + ibp=IntegrateByParts.ONCE, outflow=False): u""" The form corresponding to the DG upwind continuity transport operator. @@ -344,9 +346,9 @@ def upwind_tracer_conservative_form(domain, test, q, rho, ibp=IntegrateByParts.O ubar = Function(Vu) if ibp == IntegrateByParts.ONCE: - L = -inner(grad(test), outer(inner(q,rho), ubar))*dx + L = -inner(grad(test), outer(inner(q, rho), ubar))*dx else: - L = inner(test, div(outer(inner(q,rho), ubar)))*dx + L = inner(test, div(outer(inner(q, rho), ubar)))*dx if ibp != IntegrateByParts.NEVER: n = FacetNormal(domain.mesh) diff --git a/integration-tests/model/test_time_discretisation.py b/integration-tests/model/test_time_discretisation.py index f4d9ddf2f..9523ef75e 100644 --- a/integration-tests/model/test_time_discretisation.py +++ b/integration-tests/model/test_time_discretisation.py @@ -8,10 +8,10 @@ def run(timestepper, tmax, f_end): return norm(timestepper.fields("f") - f_end) / norm(f_end) -@pytest.mark.parametrize("scheme", - ["ssprk3_increment", "TrapeziumRule", "ImplicitMidpoint", "QinZhang", "RK4", - "Heun", "BDF2", "TR_BDF2", "AdamsBashforth", "Leapfrog", "AdamsMoulton", - "ssprk3_predictor"]) +@pytest.mark.parametrize( + "scheme", ["ssprk3_increment", "TrapeziumRule", "ImplicitMidpoint", + "QinZhang", "RK4", "Heun", "BDF2", "TR_BDF2", "AdamsBashforth", + "Leapfrog", "AdamsMoulton", "AdamsMoulton", "ssprk3_predictor"]) def test_time_discretisation(tmpdir, scheme, tracer_setup): if (scheme == "AdamsBashforth"): # Tighter stability constraints From 94643230d10689e1fa27ee05f3002af4cf9a95bf Mon Sep 17 00:00:00 2001 From: Tim Andrews Date: Thu, 14 Mar 2024 18:28:18 +0000 Subject: [PATCH 10/21] added a ConservativeCoupledTransportEquation test --- .../test_conservative_coupled_transport.py | 67 +++++++++++++++++++ unit-tests/test_active_tracer.py | 3 +- 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 integration-tests/equations/test_conservative_coupled_transport.py diff --git a/integration-tests/equations/test_conservative_coupled_transport.py b/integration-tests/equations/test_conservative_coupled_transport.py new file mode 100644 index 000000000..df10cd73c --- /dev/null +++ b/integration-tests/equations/test_conservative_coupled_transport.py @@ -0,0 +1,67 @@ +""" +Tests the CoupledTransportEquation class. +Two tracers are transported using combinations of advective and +conservative forms. The tracers are set to be a mixing ratio when +using the advective form and a density for the conservative form. + +""" + +from firedrake import norm, BrokenElement +from gusto import * +import pytest + + +def run(timestepper, tmax, f_end): + timestepper.run(0, tmax) + norm1 = norm(timestepper.fields("rho_d") - f_end) / norm(f_end) + norm2 = norm(timestepper.fields("m_X") - f_end) / norm(f_end) + return norm1, norm2 + +@pytest.mark.parametrize("m_X_space", ['DG', 'theta']) +def test_coupled_transport_scalar(tmpdir, m_X_space, tracer_setup): + + setup = tracer_setup(tmpdir, "slice") + domain = setup.domain + mesh = domain.mesh + + rho_d = ActiveTracer(name='rho_d', space='DG', + variable_type=TracerVariableType.density, + transport_eqn=TransportEquationType.conservative) + + m_X = ActiveTracer(name='m_X', space=m_X_space, + variable_type=TracerVariableType.mixing_ratio, + transport_eqn=TransportEquationType.tracer_conservative, + density_name='rho_d') + + tracers = [rho_d, m_X] + + V = domain.spaces("HDiv") + eqn = ConservativeCoupledTransportEquation(domain, active_tracers=tracers, Vu=V) + + if m_X_space == 'theta': + V_m_X = domain.spaces(m_X_space) + Vt_brok = FunctionSpace(mesh, BrokenElement(V_m_X.ufl_element())) + suboptions = {'rho_d':RecoveryOptions(embedding_space=Vt_brok, + recovered_space=V_m_X, + project_low_method='recover'), + 'm_X': EmbeddedDGOptions()} + opts = MixedFSOptions(suboptions=suboptions) + + transport_scheme = SSPRK3(domain, options = opts, increment_form=False) + + transport_scheme = SSPRK3(domain, increment_form=False) + + transport_method = [DGUpwind(eqn, 'rho_d'), DGUpwind(eqn, 'm_X')] + + timestepper = PrescribedTransport(eqn, transport_scheme, setup.io, transport_method) + + # Initial conditions + timestepper.fields("rho_d").interpolate(setup.f_init) + timestepper.fields("m_X").interpolate(setup.f_init) + timestepper.fields("u").project(setup.uexpr) + + error1, error2 = run(timestepper, setup.tmax, setup.f_end) + assert error1 < setup.tol, \ + 'The transport error for rho_d is greater than the permitted tolerance' + assert error2 < setup.tol, \ + 'The transport error for m_X is greater than the permitted tolerance' diff --git a/unit-tests/test_active_tracer.py b/unit-tests/test_active_tracer.py index 8c7907c43..65c8ff56b 100644 --- a/unit-tests/test_active_tracer.py +++ b/unit-tests/test_active_tracer.py @@ -11,7 +11,8 @@ def test_tracer_classes(): names = ['mr_v', 'big_blob'] spaces = ['V', 'U'] transport_eqns = [TransportEquationType.advective, - TransportEquationType.no_transport] + TransportEquationType.no_transport, + TransportEquationType.tracer_conservative] variable_types = [TracerVariableType.mixing_ratio] for name, space, transport_eqn in zip(names, spaces, transport_eqns): From 0525eb1e16af092960ad783d631eeefd19126362 Mon Sep 17 00:00:00 2001 From: Tim Andrews Date: Thu, 14 Mar 2024 18:30:22 +0000 Subject: [PATCH 11/21] lint --- .../test_conservative_coupled_transport.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/integration-tests/equations/test_conservative_coupled_transport.py b/integration-tests/equations/test_conservative_coupled_transport.py index df10cd73c..6ab46fd25 100644 --- a/integration-tests/equations/test_conservative_coupled_transport.py +++ b/integration-tests/equations/test_conservative_coupled_transport.py @@ -17,6 +17,7 @@ def run(timestepper, tmax, f_end): norm2 = norm(timestepper.fields("m_X") - f_end) / norm(f_end) return norm1, norm2 + @pytest.mark.parametrize("m_X_space", ['DG', 'theta']) def test_coupled_transport_scalar(tmpdir, m_X_space, tracer_setup): @@ -29,9 +30,9 @@ def test_coupled_transport_scalar(tmpdir, m_X_space, tracer_setup): transport_eqn=TransportEquationType.conservative) m_X = ActiveTracer(name='m_X', space=m_X_space, - variable_type=TracerVariableType.mixing_ratio, - transport_eqn=TransportEquationType.tracer_conservative, - density_name='rho_d') + variable_type=TracerVariableType.mixing_ratio, + transport_eqn=TransportEquationType.tracer_conservative, + density_name='rho_d') tracers = [rho_d, m_X] @@ -41,13 +42,13 @@ def test_coupled_transport_scalar(tmpdir, m_X_space, tracer_setup): if m_X_space == 'theta': V_m_X = domain.spaces(m_X_space) Vt_brok = FunctionSpace(mesh, BrokenElement(V_m_X.ufl_element())) - suboptions = {'rho_d':RecoveryOptions(embedding_space=Vt_brok, - recovered_space=V_m_X, - project_low_method='recover'), + suboptions = {'rho_d': RecoveryOptions(embedding_space=Vt_brok, + recovered_space=V_m_X, + project_low_method='recover'), 'm_X': EmbeddedDGOptions()} opts = MixedFSOptions(suboptions=suboptions) - transport_scheme = SSPRK3(domain, options = opts, increment_form=False) + transport_scheme = SSPRK3(domain, options=opts, increment_form=False) transport_scheme = SSPRK3(domain, increment_form=False) From 2819c7a47d6ccbce37235a8094dde12cf06252ab Mon Sep 17 00:00:00 2001 From: Tim Andrews Date: Fri, 15 Mar 2024 09:21:37 +0000 Subject: [PATCH 12/21] integrate ConservativeCoupledTransportEquation into CoupledTransportEquation --- gusto/equations.py | 64 +---------------- .../test_conservative_coupled_transport.py | 68 ------------------- .../equations/test_coupled_transport.py | 52 +++++++++++++- 3 files changed, 54 insertions(+), 130 deletions(-) delete mode 100644 integration-tests/equations/test_conservative_coupled_transport.py diff --git a/gusto/equations.py b/gusto/equations.py index c7b9bfbf0..fc7db41a7 100644 --- a/gusto/equations.py +++ b/gusto/equations.py @@ -607,71 +607,13 @@ def __init__(self, domain, active_tracers, Vu=None): self.tests = TestFunctions(W) self.X = Function(W) - self.residual = self.generate_mass_terms() - - # Add transport of tracers - self.residual += self.generate_tracer_transport_terms(active_tracers) - - -class ConservativeCoupledTransportEquation(PrognosticEquationSet): - u""" - Discretises the transport equation, \n - ∂q/∂t + (u.∇)q = F, \n - with the application of active tracers. As there are multiple tracers or - species that are interacting, q and F are vectors. This equation can be - enhanced through the addition of sources or sinks (F) by applying it with - physics schemes. This takes in tracers that might obey different forms of - the transport equation (i.e. advective, conservative) but will evolve all - the fields in a conservative manner. - """ - def __init__(self, domain, active_tracers, Vu=None): - """ - Args: - domain (:class:`Domain`): the model's domain object, containing the - mesh and the compatible function spaces. - active_tracers (list): a list of `ActiveTracer` objects - that encode the metadata for any active tracers to be included - in the equations. This is required for using this class; if there - is only a field to be advected, use the AdvectionEquation - instead. - Vu (:class:`FunctionSpace`, optional): the function space for the - velocity field. If this is not specified, uses the HDiv spaces - set up by the domain. Defaults to None. - """ - - self.active_tracers = active_tracers - self.terms_to_linearise = {} - self.field_names = [] - self.space_names = {} - - # Build finite element spaces - self.spaces = [] - - # Add active tracers to the list of prognostics - if active_tracers is None: - active_tracers = [] - self.add_tracers_to_prognostics(domain, active_tracers) - - # Make the full mixed function space - W = MixedFunctionSpace(self.spaces) - - full_field_name = "_".join(self.field_names) - PrognosticEquation.__init__(self, domain, W, full_field_name) - - if Vu is not None: - domain.spaces.add_space("HDiv", Vu, overwrite_space=True) - V = domain.spaces("HDiv") - _ = self.prescribed_fields("u", V) - - self.tests = TestFunctions(W) - self.X = Function(W) - + # Add mass forms for the tracers, which will use + # mass*density for any tracer_conservative terms self.residual = self.generate_tracer_mass_terms(active_tracers) - + # Add transport of tracers self.residual += self.generate_tracer_transport_terms(active_tracers) - # ============================================================================ # # Specified Equation Sets # ============================================================================ # diff --git a/integration-tests/equations/test_conservative_coupled_transport.py b/integration-tests/equations/test_conservative_coupled_transport.py deleted file mode 100644 index 6ab46fd25..000000000 --- a/integration-tests/equations/test_conservative_coupled_transport.py +++ /dev/null @@ -1,68 +0,0 @@ -""" -Tests the CoupledTransportEquation class. -Two tracers are transported using combinations of advective and -conservative forms. The tracers are set to be a mixing ratio when -using the advective form and a density for the conservative form. - -""" - -from firedrake import norm, BrokenElement -from gusto import * -import pytest - - -def run(timestepper, tmax, f_end): - timestepper.run(0, tmax) - norm1 = norm(timestepper.fields("rho_d") - f_end) / norm(f_end) - norm2 = norm(timestepper.fields("m_X") - f_end) / norm(f_end) - return norm1, norm2 - - -@pytest.mark.parametrize("m_X_space", ['DG', 'theta']) -def test_coupled_transport_scalar(tmpdir, m_X_space, tracer_setup): - - setup = tracer_setup(tmpdir, "slice") - domain = setup.domain - mesh = domain.mesh - - rho_d = ActiveTracer(name='rho_d', space='DG', - variable_type=TracerVariableType.density, - transport_eqn=TransportEquationType.conservative) - - m_X = ActiveTracer(name='m_X', space=m_X_space, - variable_type=TracerVariableType.mixing_ratio, - transport_eqn=TransportEquationType.tracer_conservative, - density_name='rho_d') - - tracers = [rho_d, m_X] - - V = domain.spaces("HDiv") - eqn = ConservativeCoupledTransportEquation(domain, active_tracers=tracers, Vu=V) - - if m_X_space == 'theta': - V_m_X = domain.spaces(m_X_space) - Vt_brok = FunctionSpace(mesh, BrokenElement(V_m_X.ufl_element())) - suboptions = {'rho_d': RecoveryOptions(embedding_space=Vt_brok, - recovered_space=V_m_X, - project_low_method='recover'), - 'm_X': EmbeddedDGOptions()} - opts = MixedFSOptions(suboptions=suboptions) - - transport_scheme = SSPRK3(domain, options=opts, increment_form=False) - - transport_scheme = SSPRK3(domain, increment_form=False) - - transport_method = [DGUpwind(eqn, 'rho_d'), DGUpwind(eqn, 'm_X')] - - timestepper = PrescribedTransport(eqn, transport_scheme, setup.io, transport_method) - - # Initial conditions - timestepper.fields("rho_d").interpolate(setup.f_init) - timestepper.fields("m_X").interpolate(setup.f_init) - timestepper.fields("u").project(setup.uexpr) - - error1, error2 = run(timestepper, setup.tmax, setup.f_end) - assert error1 < setup.tol, \ - 'The transport error for rho_d is greater than the permitted tolerance' - assert error2 < setup.tol, \ - 'The transport error for m_X is greater than the permitted tolerance' diff --git a/integration-tests/equations/test_coupled_transport.py b/integration-tests/equations/test_coupled_transport.py index e22bbd81d..add9cc35a 100644 --- a/integration-tests/equations/test_coupled_transport.py +++ b/integration-tests/equations/test_coupled_transport.py @@ -6,7 +6,7 @@ """ -from firedrake import norm +from firedrake import norm, BrokenElement from gusto import * import pytest @@ -63,3 +63,53 @@ def test_coupled_transport_scalar(tmpdir, geometry, equation_form1, equation_for 'The transport error for tracer 1 is greater than the permitted tolerance' assert error2 < setup.tol, \ 'The transport error for tracer 2 is greater than the permitted tolerance' + + +@pytest.mark.parametrize("m_X_space", ['DG', 'theta']) +def test_conservative_coupled_transport(tmpdir, m_X_space, tracer_setup): + + setup = tracer_setup(tmpdir, "slice") + domain = setup.domain + mesh = domain.mesh + + rho_d = ActiveTracer(name='f1', space='DG', + variable_type=TracerVariableType.density, + transport_eqn=TransportEquationType.conservative) + + m_X = ActiveTracer(name='f2', space=m_X_space, + variable_type=TracerVariableType.mixing_ratio, + transport_eqn=TransportEquationType.tracer_conservative, + density_name='f1') + + tracers = [rho_d, m_X] + + V = domain.spaces("HDiv") + eqn = CoupledTransportEquation(domain, active_tracers=tracers, Vu=V) + + if m_X_space == 'theta': + V_m_X = domain.spaces(m_X_space) + Vt_brok = FunctionSpace(mesh, BrokenElement(V_m_X.ufl_element())) + suboptions = {'f1': RecoveryOptions(embedding_space=Vt_brok, + recovered_space=V_m_X, + project_low_method='recover'), + 'f2': EmbeddedDGOptions()} + opts = MixedFSOptions(suboptions=suboptions) + + transport_scheme = SSPRK3(domain, options=opts, increment_form=False) + + transport_scheme = SSPRK3(domain, increment_form=False) + + transport_method = [DGUpwind(eqn, 'f1'), DGUpwind(eqn, 'f2')] + + timestepper = PrescribedTransport(eqn, transport_scheme, setup.io, transport_method) + + # Initial conditions + timestepper.fields("f1").interpolate(setup.f_init) + timestepper.fields("f2").interpolate(setup.f_init) + timestepper.fields("u").project(setup.uexpr) + + error1, error2 = run(timestepper, setup.tmax, setup.f_end) + assert error1 < setup.tol, \ + 'The transport error for rho_d is greater than the permitted tolerance' + assert error2 < setup.tol, \ + 'The transport error for m_X is greater than the permitted tolerance' \ No newline at end of file From 6b695b21ab342a36bf324b6fd44d5483ccc31f9e Mon Sep 17 00:00:00 2001 From: Tim Andrews Date: Fri, 15 Mar 2024 09:26:47 +0000 Subject: [PATCH 13/21] lint --- gusto/equations.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gusto/equations.py b/gusto/equations.py index 15baf9f18..5e95af6b1 100644 --- a/gusto/equations.py +++ b/gusto/equations.py @@ -376,8 +376,7 @@ def set_no_normal_flow_bcs(self, domain, no_normal_flow_bc_ids): + 'when there is a variable called "u" and none was found') Vu = domain.spaces("HDiv") - # we only apply no normal-flow BCs when extruded mesh is non periodic - if Vu.extruded and not Vu.ufl_domain().topology.extruded_periodic: + if Vu.extruded: self.bcs['u'].append(DirichletBC(Vu, 0.0, "bottom")) self.bcs['u'].append(DirichletBC(Vu, 0.0, "top")) for id in no_normal_flow_bc_ids: @@ -611,10 +610,11 @@ def __init__(self, domain, active_tracers, Vu=None): # Add mass forms for the tracers, which will use # mass*density for any tracer_conservative terms self.residual = self.generate_tracer_mass_terms(active_tracers) - + # Add transport of tracers self.residual += self.generate_tracer_transport_terms(active_tracers) + # ============================================================================ # # Specified Equation Sets # ============================================================================ # From f6c886ab914fc6c089cbdae227aafd204ec7a29d Mon Sep 17 00:00:00 2001 From: Tim Andrews Date: Fri, 15 Mar 2024 09:29:18 +0000 Subject: [PATCH 14/21] lint --- integration-tests/equations/test_coupled_transport.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/integration-tests/equations/test_coupled_transport.py b/integration-tests/equations/test_coupled_transport.py index add9cc35a..b314a3236 100644 --- a/integration-tests/equations/test_coupled_transport.py +++ b/integration-tests/equations/test_coupled_transport.py @@ -90,8 +90,8 @@ def test_conservative_coupled_transport(tmpdir, m_X_space, tracer_setup): V_m_X = domain.spaces(m_X_space) Vt_brok = FunctionSpace(mesh, BrokenElement(V_m_X.ufl_element())) suboptions = {'f1': RecoveryOptions(embedding_space=Vt_brok, - recovered_space=V_m_X, - project_low_method='recover'), + recovered_space=V_m_X, + project_low_method='recover'), 'f2': EmbeddedDGOptions()} opts = MixedFSOptions(suboptions=suboptions) @@ -112,4 +112,4 @@ def test_conservative_coupled_transport(tmpdir, m_X_space, tracer_setup): assert error1 < setup.tol, \ 'The transport error for rho_d is greater than the permitted tolerance' assert error2 < setup.tol, \ - 'The transport error for m_X is greater than the permitted tolerance' \ No newline at end of file + 'The transport error for m_X is greater than the permitted tolerance' From 301c7ffb7006e97a0a07005bd265f0b709f8069e Mon Sep 17 00:00:00 2001 From: Tim Andrews Date: Fri, 15 Mar 2024 09:33:57 +0000 Subject: [PATCH 15/21] Update comments for the generate_tracer_mass_terms routine --- gusto/equations.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/gusto/equations.py b/gusto/equations.py index 5e95af6b1..e0c67f140 100644 --- a/gusto/equations.py +++ b/gusto/equations.py @@ -432,18 +432,17 @@ def add_tracers_to_prognostics(self, domain, active_tracers): def generate_tracer_mass_terms(self, active_tracers): """ - Builds the weak time derivative terms for the equation set. - - Generates the weak time derivative terms ("mass terms") for all the - prognostic variables of the equation set. - - The mass terms can differ depending on the tracer type. A mixing ratio - that is being transported conservatively will need its mass form multiplied - by a reference density. + Adds the mass forms for the active tracers to the equation set. + Args: + active_tracers (list): A list of :class:`ActiveTracer` objects that + encode the metadata for the active tracers. Returns: - :class:`LabelledForm`: a labelled form containing the mass terms. + :class:`LabelledForm`: a labelled form containing the mass + terms for the active tracers. This is the usual mass form + unless using tracer_conservative, where it is multiplied + by the reference density. """ for i, tracer in enumerate(active_tracers): From a0f92a0638f03e3300208fd3dc8e654cec78e4f0 Mon Sep 17 00:00:00 2001 From: Tim Andrews Date: Fri, 15 Mar 2024 16:34:21 +0000 Subject: [PATCH 16/21] slacken suppress_vertical_wind test and update linear_sw_wave KGO --- .../data/linear_sw_wave_chkpt.h5 | Bin 573668 -> 580789 bytes .../equations/test_coupled_transport.py | 6 +++--- .../physics/test_suppress_vertical_wind.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/integration-tests/data/linear_sw_wave_chkpt.h5 b/integration-tests/data/linear_sw_wave_chkpt.h5 index 11420f7c782216a786e9b4b397b8375b9ba3e1f9..03400f12cbae62e62459d63ee14f95ccf31a348a 100644 GIT binary patch delta 125368 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 P!OnjggJ8n~j=TR0ibP2Z delta 122302 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 diff --git a/integration-tests/equations/test_coupled_transport.py b/integration-tests/equations/test_coupled_transport.py index b314a3236..b64498d32 100644 --- a/integration-tests/equations/test_coupled_transport.py +++ b/integration-tests/equations/test_coupled_transport.py @@ -94,10 +94,10 @@ def test_conservative_coupled_transport(tmpdir, m_X_space, tracer_setup): project_low_method='recover'), 'f2': EmbeddedDGOptions()} opts = MixedFSOptions(suboptions=suboptions) - + transport_scheme = SSPRK3(domain, options=opts, increment_form=False) - - transport_scheme = SSPRK3(domain, increment_form=False) + else: + transport_scheme = SSPRK3(domain, increment_form=False) transport_method = [DGUpwind(eqn, 'f1'), DGUpwind(eqn, 'f2')] diff --git a/integration-tests/physics/test_suppress_vertical_wind.py b/integration-tests/physics/test_suppress_vertical_wind.py index 44f1e05ae..cab6efc76 100644 --- a/integration-tests/physics/test_suppress_vertical_wind.py +++ b/integration-tests/physics/test_suppress_vertical_wind.py @@ -92,5 +92,5 @@ def test_suppress_vertical_wind(tmpdir): vertical_wind = Function(domain.spaces('theta')) vertical_wind.interpolate(dot(u, domain.k)) - tol = 1e-12 + tol = 1e-10 assert norm(vertical_wind) < tol From 498034a407eaf49458460103bd734fa66043974e Mon Sep 17 00:00:00 2001 From: Tim Andrews Date: Fri, 15 Mar 2024 16:36:24 +0000 Subject: [PATCH 17/21] lint --- integration-tests/equations/test_coupled_transport.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration-tests/equations/test_coupled_transport.py b/integration-tests/equations/test_coupled_transport.py index b64498d32..da474bb4f 100644 --- a/integration-tests/equations/test_coupled_transport.py +++ b/integration-tests/equations/test_coupled_transport.py @@ -94,7 +94,7 @@ def test_conservative_coupled_transport(tmpdir, m_X_space, tracer_setup): project_low_method='recover'), 'f2': EmbeddedDGOptions()} opts = MixedFSOptions(suboptions=suboptions) - + transport_scheme = SSPRK3(domain, options=opts, increment_form=False) else: transport_scheme = SSPRK3(domain, increment_form=False) From 4ffee21e1d21c5da8447a0008b7ae4820a4f2046 Mon Sep 17 00:00:00 2001 From: Timothy Andrews <75810156+ta440@users.noreply.github.com> Date: Mon, 18 Mar 2024 10:07:39 +0000 Subject: [PATCH 18/21] Update gusto/equations.py to add back in non-periodic check in no normal flow BCs Co-authored-by: Thomas Bendall --- gusto/equations.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gusto/equations.py b/gusto/equations.py index e0c67f140..b98181d30 100644 --- a/gusto/equations.py +++ b/gusto/equations.py @@ -376,7 +376,8 @@ def set_no_normal_flow_bcs(self, domain, no_normal_flow_bc_ids): + 'when there is a variable called "u" and none was found') Vu = domain.spaces("HDiv") - if Vu.extruded: + # we only apply no normal-flow BCs when extruded mesh is non periodic + if Vu.extruded and not Vu.ufl_domain().topology.extruded_periodic: self.bcs['u'].append(DirichletBC(Vu, 0.0, "bottom")) self.bcs['u'].append(DirichletBC(Vu, 0.0, "top")) for id in no_normal_flow_bc_ids: From ed99b80563a982ba03821d3a02dac4c65c420cca Mon Sep 17 00:00:00 2001 From: Tim Andrews Date: Mon, 18 Mar 2024 12:25:20 +0000 Subject: [PATCH 19/21] better extraction of reference density for tracer_conservative transport --- gusto/transport_methods.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/gusto/transport_methods.py b/gusto/transport_methods.py index cd43b921f..93be2c158 100644 --- a/gusto/transport_methods.py +++ b/gusto/transport_methods.py @@ -37,13 +37,12 @@ def __init__(self, equation, variable): self.transport_equation_type = self.original_form.terms[0].get(transport) if self.transport_equation_type == TransportEquationType.tracer_conservative: - # Extract associated density variable: - # This does assume the same ordering of tracers and fields... - tracer_idx = self.equation.field_names.index(variable) - tracer = self.equation.active_tracers[tracer_idx] + # Extract associated density of the variable + tracer = next(x for x in self.equation.active_tracers if x.name == variable) density_idx = self.equation.field_names.index(tracer.density_name) self.conservative_density = split(self.equation.X)[density_idx] + def replace_form(self, equation): """ Replaces the form for the transport term in the equation with the From 0f89ae8733b7dec813955205c2e05f0fa97da07d Mon Sep 17 00:00:00 2001 From: Tim Andrews Date: Mon, 18 Mar 2024 12:27:14 +0000 Subject: [PATCH 20/21] lint --- gusto/transport_methods.py | 1 - 1 file changed, 1 deletion(-) diff --git a/gusto/transport_methods.py b/gusto/transport_methods.py index 93be2c158..2329015ef 100644 --- a/gusto/transport_methods.py +++ b/gusto/transport_methods.py @@ -42,7 +42,6 @@ def __init__(self, equation, variable): density_idx = self.equation.field_names.index(tracer.density_name) self.conservative_density = split(self.equation.X)[density_idx] - def replace_form(self, equation): """ Replaces the form for the transport term in the equation with the From 52f444df0da8bef1985fe67e7697befc723d0684 Mon Sep 17 00:00:00 2001 From: Tim Andrews Date: Tue, 19 Mar 2024 16:06:10 +0000 Subject: [PATCH 21/21] made changes suggested by Alex --- gusto/time_discretisation.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/gusto/time_discretisation.py b/gusto/time_discretisation.py index c641a4b5f..a1221c6b9 100644 --- a/gusto/time_discretisation.py +++ b/gusto/time_discretisation.py @@ -933,9 +933,8 @@ def rhs(self): for stage in range(self.nStages): r = self.residual.label_map( - lambda t: t.has_label(time_derivative), - map_if_true=replace_subject(self.field_i[0], old_idx=self.idx), - map_if_false=replace_subject(self.field_i[0], old_idx=self.idx)) + all_terms, + map_if_true=replace_subject(self.field_i[0], old_idx=self.idx)) r = r.label_map( lambda t: t.has_label(time_derivative), @@ -1000,7 +999,7 @@ def solve_stage(self, x0, stage): if self.limiter is not None: self.limiter.apply(self.field_i[stage]) - # Obtain field_ip1 = field_n - dt* sum_m{c_im*F[field_m]} + # Obtain field_ip1 = field_n - dt* sum_m{a_im*F[field_m]} self.solver[stage].solve() if (stage == self.nStages - 1):