From 564810d96ca0908481a6be485d1204b49748320e Mon Sep 17 00:00:00 2001 From: Timothy Andrews <75810156+ta440@users.noreply.github.com> Date: Wed, 4 Dec 2024 05:35:49 -0500 Subject: [PATCH] Implement simultaneous transport with SIQN (#581) --- gusto/equations/prognostic_equations.py | 7 +- .../time_discretisation.py | 84 ++++-- .../semi_implicit_quasi_newton.py | 95 ++++--- .../data/simult_SIQN_order0_chkpt.h5 | Bin 0 -> 307842 bytes .../data/simult_SIQN_order1_chkpt.h5 | Bin 0 -> 277122 bytes .../model/test_simultaneous_SIQN.py | 263 ++++++++++++++++++ 6 files changed, 395 insertions(+), 54 deletions(-) create mode 100644 integration-tests/data/simult_SIQN_order0_chkpt.h5 create mode 100644 integration-tests/data/simult_SIQN_order1_chkpt.h5 create mode 100644 integration-tests/model/test_simultaneous_SIQN.py diff --git a/gusto/equations/prognostic_equations.py b/gusto/equations/prognostic_equations.py index 7369f5ee2..b2df68e2c 100644 --- a/gusto/equations/prognostic_equations.py +++ b/gusto/equations/prognostic_equations.py @@ -305,12 +305,13 @@ def add_tracers_to_prognostics(self, domain, active_tracers): name of the active tracer. """ - # Check if there are any conservatively transported tracers. - # If so, ensure that the reference density is indexed before this tracer. + # If there are any conservatively transported tracers, ensure + # that the reference density, if it is also an active tracer, + # is indexed earlier. for i in range(len(active_tracers) - 1): tracer = active_tracers[i] if tracer.transport_eqn == TransportEquationType.tracer_conservative: - ref_density = next(x for x in active_tracers if x.name == tracer.density_name) + ref_density = next((x for x in active_tracers if x.name == tracer.density_name), tracer) j = active_tracers.index(ref_density) if j > i: # Swap the indices of the tracer and the reference density diff --git a/gusto/time_discretisation/time_discretisation.py b/gusto/time_discretisation/time_discretisation.py index df108a615..4f72af317 100644 --- a/gusto/time_discretisation/time_discretisation.py +++ b/gusto/time_discretisation/time_discretisation.py @@ -132,26 +132,58 @@ def setup(self, equation, apply_bcs=True, *active_labels): self.residual = equation.residual if self.field_name is not None and hasattr(equation, "field_names"): - self.idx = equation.field_names.index(self.field_name) - self.fs = equation.spaces[self.idx] - self.residual = self.residual.label_map( - lambda t: t.get(prognostic) == self.field_name, - lambda t: Term( - split_form(t.form)[self.idx].form, - t.labels), - drop) + if isinstance(self.field_name, list): + # Multiple fields are being solved for simultaneously. + # This enables conservative transport to be implemented with SIQN. + # Use the full mixed space for self.fs, with the + # field_name, residual, and BCs being set up later. + self.fs = equation.function_space + self.idx = None + else: + self.idx = equation.field_names.index(self.field_name) + self.fs = equation.spaces[self.idx] + self.residual = self.residual.label_map( + lambda t: t.get(prognostic) == self.field_name, + lambda t: Term( + split_form(t.form)[self.idx].form, + t.labels), + drop) else: self.field_name = equation.field_name self.fs = equation.function_space self.idx = None - bcs = equation.bcs[self.field_name] - if len(active_labels) > 0: - self.residual = self.residual.label_map( - lambda t: any(t.has_label(time_derivative, *active_labels)), - map_if_false=drop) + if isinstance(self.field_name, list): + # Multiple fields are being solved for simultaneously. + # Keep all time derivative terms: + residual = self.residual.label_map( + lambda t: t.has_label(time_derivative), + map_if_false=drop) + + # Only keep active labels for prognostics in the list + # of simultaneously transported variables: + for subname in self.field_name: + field_residual = self.residual.label_map( + lambda t: t.get(prognostic) == subname, + map_if_false=drop) + + residual += field_residual.label_map( + lambda t: t.has_label(*active_labels), + map_if_false=drop) + + self.residual = residual + else: + self.residual = self.residual.label_map( + lambda t: any(t.has_label(time_derivative, *active_labels)), + map_if_false=drop) + + # Set the field name if using simultaneous transport. + if isinstance(self.field_name, list): + self.field_name = equation.field_name + + bcs = equation.bcs[self.field_name] self.evaluate_source = [] self.physics_names = [] @@ -175,7 +207,10 @@ def setup(self, equation, apply_bcs=True, *active_labels): # timestepper should be used instead. if len(field_terms.label_map(lambda t: t.has_label(mass_weighted), map_if_false=drop)) > 0: if len(field_terms.label_map(lambda t: not t.has_label(mass_weighted), map_if_false=drop)) > 0: - raise ValueError(f"Mass-weighted and non-mass-weighted terms are present in a timestepping equation for {field}. As these terms cannot be solved for simultaneously, a split timestepping method should be used instead.") + raise ValueError('Mass-weighted and non-mass-weighted terms are present in a ' + + f'timestepping equation for {field}. As these terms cannot ' + + 'be solved for simultaneously, a split timestepping method ' + + 'should be used instead.') else: # Replace the terms with a mass_weighted label with the # mass_weighted form. It is important that the labels from @@ -199,10 +234,11 @@ def setup(self, equation, apply_bcs=True, *active_labels): for field, subwrapper in self.wrapper.subwrappers.items(): if field not in equation.field_names: - raise ValueError(f"The option defined for {field} is for a field that does not exist in the equation set") + raise ValueError(f'The option defined for {field} is for a field ' + + 'that does not exist in the equation set.') field_idx = equation.field_names.index(field) - subwrapper.setup(equation.spaces[field_idx], wrapper_bcs) + subwrapper.setup(equation.spaces[field_idx], equation.bcs[field]) # Update the function space to that needed by the wrapper self.wrapper.wrapper_spaces[field_idx] = subwrapper.function_space @@ -244,9 +280,19 @@ def setup(self, equation, apply_bcs=True, *active_labels): if not apply_bcs: self.bcs = None elif self.wrapper is not None: - # Transfer boundary conditions onto test function space - self.bcs = [DirichletBC(self.fs, bc.function_arg, bc.sub_domain) - for bc in bcs] + if self.wrapper_name == 'mixed_options': + # Define new Dirichlet BCs on the wrapper-modified + # mixed function space. + self.bcs = [] + for idx, field_name in enumerate(self.equation.field_names): + for bc in equation.bcs[field_name]: + self.bcs.append(DirichletBC(self.fs.sub(idx), + bc.function_arg, + bc.sub_domain)) + else: + # Transfer boundary conditions onto test function space + self.bcs = [DirichletBC(self.fs, bc.function_arg, bc.sub_domain) + for bc in bcs] else: self.bcs = bcs diff --git a/gusto/timestepping/semi_implicit_quasi_newton.py b/gusto/timestepping/semi_implicit_quasi_newton.py index 76c517a7f..7c4de236b 100644 --- a/gusto/timestepping/semi_implicit_quasi_newton.py +++ b/gusto/timestepping/semi_implicit_quasi_newton.py @@ -115,6 +115,9 @@ def __init__(self, equation_set, io, transport_schemes, spatial_methods, self.reference_update_freq = reference_update_freq self.to_update_ref_profile = False + # Flag for if we have simultaneous transport + self.simult = False + # default is to not offcentre transporting velocity but if it # is offcentred then use the same value as alpha self.alpha_u = Constant(alpha) if off_centred_u else Constant(0.5) @@ -148,15 +151,30 @@ def __init__(self, equation_set, io, transport_schemes, spatial_methods, self.transported_fields = [] for scheme in transport_schemes: assert scheme.nlevels == 1, "multilevel schemes not supported as part of this timestepping loop" - assert scheme.field_name in equation_set.field_names - self.active_transport.append((scheme.field_name, scheme)) - self.transported_fields.append(scheme.field_name) - # Check that there is a corresponding transport method - method_found = False - for method in spatial_methods: - if scheme.field_name == method.variable and method.term_label == transport: - method_found = True - assert method_found, f'No transport method found for variable {scheme.field_name}' + if isinstance(scheme.field_name, list): + # This means that multiple fields are being transported simultaneously + self.simult = True + for subfield in scheme.field_name: + assert subfield in equation_set.field_names + + # Check that there is a corresponding transport method for + # each field in the list + method_found = False + for method in spatial_methods: + if subfield == method.variable and method.term_label == transport: + method_found = True + assert method_found, f'No transport method found for variable {scheme.field_name}' + self.active_transport.append((scheme.field_name, scheme)) + else: + assert scheme.field_name in equation_set.field_names + + # Check that there is a corresponding transport method + method_found = False + for method in spatial_methods: + if scheme.field_name == method.variable and method.term_label == transport: + method_found = True + self.active_transport.append((scheme.field_name, scheme)) + assert method_found, f'No transport method found for variable {scheme.field_name}' self.diffusion_schemes = [] if diffusion_schemes is not None: @@ -240,7 +258,11 @@ def transporting_velocity(self): def setup_fields(self): """Sets up time levels n, star, p and np1""" self.x = TimeLevelFields(self.equation, 1) - self.x.add_fields(self.equation, levels=("star", "p", "after_slow", "after_fast")) + if self.simult is True: + # If there is any simultaneous transport, add an extra 'simult' field: + self.x.add_fields(self.equation, levels=("star", "p", "simult", "after_slow", "after_fast")) + else: + self.x.add_fields(self.equation, levels=("star", "p", "after_slow", "after_fast")) for aux_eqn, _ in self.auxiliary_equations_and_schemes: self.x.add_fields(aux_eqn) # Prescribed fields for auxiliary eqns should come from prognostics of @@ -282,32 +304,44 @@ def copy_active_tracers(self, x_in, x_out): for name in self.tracers_to_copy: x_out(name).assign(x_in(name)) - def transport_field(self, name, scheme, xstar, xp): + def transport_fields(self, outer, xstar, xp): """ - Performs the transport of a field in xstar, placing the result in xp. + Transports all fields in xstar with a transport scheme + and places the result in xp. Args: - name (str): the name of the field to be transported. - scheme (:class:`TimeDiscretisation`): the time discretisation used - for the transport. + outer (int): the outer loop iteration number xstar (:class:`Fields`): the collection of state fields to be transported. xp (:class:`Fields`): the collection of state fields resulting from the transport. """ - - if name == self.predictor: - # Pre-multiply this variable by (1 - dt*beta*div(u)) - V = xstar(name).function_space() - field_out = Function(V) - self.predictor_interpolator.interpolate() - scheme.apply(field_out, self.predictor_field_in) - - # xp is xstar plus the increment from the transported predictor - xp(name).assign(xstar(name) + field_out - self.predictor_field_in) - else: - # Standard transport - scheme.apply(xp(name), xstar(name)) + for name, scheme in self.active_transport: + if isinstance(name, list): + # Transport multiple fields from xstar simultaneously. + # We transport the mixed function space from xstar to xsimult, then + # extract the updated fields and pass them to xp; this avoids overwriting + # any previously transported fields. + logger.info(f'Semi-implicit Quasi Newton: Transport {outer}: ' + + f'Simultaneous transport of {name}') + scheme.apply(self.x.simult(self.field_name), xstar(self.field_name)) + for field_name in name: + xp(field_name).assign(self.x.simult(field_name)) + else: + logger.info(f'Semi-implicit Quasi Newton: Transport {outer}: {name}') + # transports a single field from xstar and puts the result in xp + if name == self.predictor: + # Pre-multiply this variable by (1 - dt*beta*div(u)) + V = xstar(name).function_space() + field_out = Function(V) + self.predictor_interpolator.interpolate() + scheme.apply(field_out, self.predictor_field_in) + + # xp is xstar plus the increment from the transported predictor + xp(name).assign(xstar(name) + field_out - self.predictor_field_in) + else: + # Standard transport + scheme.apply(xp(name), xstar(name)) def update_reference_profiles(self): """ @@ -367,10 +401,7 @@ def timestep(self): with timed_stage("Transport"): self.io.log_courant(self.fields, 'transporting_velocity', message=f'transporting velocity, outer iteration {outer}') - for name, scheme in self.active_transport: - logger.info(f'Semi-implicit Quasi Newton: Transport {outer}: {name}') - # transports a field from xstar and puts result in xp - self.transport_field(name, scheme, xstar, xp) + self.transport_fields(outer, xstar, xp) # Fast physics ----------------------------------------------------- x_after_fast(self.field_name).assign(xp(self.field_name)) diff --git a/integration-tests/data/simult_SIQN_order0_chkpt.h5 b/integration-tests/data/simult_SIQN_order0_chkpt.h5 new file mode 100644 index 0000000000000000000000000000000000000000..0d1367606ad1481a40d71aecc0cd67eaa33f8781 GIT binary patch literal 307842 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 literal 0 HcmV?d00001 diff --git a/integration-tests/data/simult_SIQN_order1_chkpt.h5 b/integration-tests/data/simult_SIQN_order1_chkpt.h5 new file mode 100644 index 0000000000000000000000000000000000000000..0309870ea10bbc0bf912ec3f045301334aa8f98b GIT binary patch literal 277122 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

nzBDWpW6=EAHhh)9+dsj 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 literal 0 HcmV?d00001 diff --git a/integration-tests/model/test_simultaneous_SIQN.py b/integration-tests/model/test_simultaneous_SIQN.py new file mode 100644 index 000000000..ea3a12327 --- /dev/null +++ b/integration-tests/model/test_simultaneous_SIQN.py @@ -0,0 +1,263 @@ +""" +This tests the use of simultaneous transport with the SIQN +timestepping method. A few timesteps are taken with the Bryan-Fritsch +bubble test case, which solves the Compressible Euler Equations. +The two tracers of water vapour and cloud water are being tranpsported +conservatively, which means they need to be transported simultaneously +with the density. +Degree 0 and 1 configurations are tested to ensure that the simultaneous +transport is working with the different wrappers. +""" + +from os.path import join, abspath, dirname +from firedrake import ( + PeriodicIntervalMesh, ExtrudedMesh, SpatialCoordinate, conditional, cos, pi, + sqrt, NonlinearVariationalProblem, NonlinearVariationalSolver, TestFunction, + dx, TrialFunction, Function, as_vector, LinearVariationalProblem, + LinearVariationalSolver, Constant, BrokenElement +) +from gusto import * +import pytest + + +def run_simult_SIQN(tmpdir, order): + + if order == 0: + ncolumns = 20 + nlayers = 20 + u_eqn_type = "vector_advection_form" + else: + ncolumns = 10 + nlayers = 10 + u_eqn_type = "vector_invariant_form" + + dt = 2.0 + tmax = 10.0 + + domain_width = 10000. # domain width, in m + domain_height = 10000. # domain height, in m + zc = 2000. # vertical centre of bubble, in m + rc = 2000. # radius of bubble, in m + Tdash = 2.0 # strength of temperature perturbation, in K + Tsurf = 320.0 # background theta_e value, in K + total_water = 0.02 # total moisture mixing ratio, in kg/kg + + # Domain + mesh_name = 'bryan_fritsch_mesh' + base_mesh = PeriodicIntervalMesh(ncolumns, domain_width) + mesh = ExtrudedMesh( + base_mesh, layers=nlayers, layer_height=domain_height/nlayers, name=mesh_name + ) + domain = Domain(mesh, dt, 'CG', order) + + # Set up the tracers and their transport schemes + V_rho = domain.spaces('DG') + V_theta = domain.spaces('theta') + + tracers = [WaterVapour(space='theta', + transport_eqn=TransportEquationType.tracer_conservative, + density_name='rho'), + CloudWater(space='theta', + transport_eqn=TransportEquationType.tracer_conservative, + density_name='rho')] + + # Equation + params = CompressibleParameters() + eqns = CompressibleEulerEquations( + domain, params, active_tracers=tracers, u_transport_option=u_eqn_type + ) + + # I/O + output_dirname = tmpdir+"/simult_SIQN_order"+str(order) + + output = OutputParameters( + dirname=output_dirname, dumpfreq=5, chkptfreq=5, checkpoint=True + ) + io = IO(domain, output) + + # Set up transport schemes + if order == 0: + VDG1 = domain.spaces("DG1_equispaced") + VCG1 = FunctionSpace(mesh, "CG", 1) + Vu_DG1 = VectorFunctionSpace(mesh, VDG1.ufl_element()) + Vu_CG1 = VectorFunctionSpace(mesh, "CG", 1) + + u_opts = RecoveryOptions(embedding_space=Vu_DG1, + recovered_space=Vu_CG1, + boundary_method=BoundaryMethod.taylor) + theta_opts = RecoveryOptions(embedding_space=VDG1, + recovered_space=VCG1) + + suboptions = {'rho': RecoveryOptions(embedding_space=VDG1, + recovered_space=VCG1, + boundary_method=BoundaryMethod.taylor), + 'water_vapour': ConservativeRecoveryOptions(embedding_space=VDG1, + recovered_space=VCG1, + rho_name="rho", + orig_rho_space=V_rho), + 'cloud_water': ConservativeRecoveryOptions(embedding_space=VDG1, + recovered_space=VCG1, + rho_name="rho", + orig_rho_space=V_rho)} + else: + theta_opts = EmbeddedDGOptions() + Vt_brok = FunctionSpace(mesh, BrokenElement(V_theta.ufl_element())) + suboptions = {'rho': EmbeddedDGOptions(embedding_space=Vt_brok), + 'water_vapour': ConservativeEmbeddedDGOptions(embedding_space=Vt_brok, + rho_name="rho", + orig_rho_space=V_rho), + 'cloud_water': ConservativeEmbeddedDGOptions(embedding_space=Vt_brok, + rho_name="rho", + orig_rho_space=V_rho)} + + transported_fields = [SSPRK3(domain, "theta", options=theta_opts)] + + mixed_opts = MixedFSOptions(suboptions=suboptions) + transported_fields.append(SSPRK3(domain, ["rho", "water_vapour", "cloud_water"], options=mixed_opts, rk_formulation=RungeKuttaFormulation.predictor)) + + if order == 0: + transported_fields.append(SSPRK3(domain, 'u', options=u_opts)) + else: + transported_fields.append(TrapeziumRule(domain, 'u')) + + transport_methods = [ + DGUpwind(eqns, field) for field in + ["u", "rho", "theta", "water_vapour", "cloud_water"] + ] + + # Linear solver + linear_solver = CompressibleSolver(eqns) + + # Physics schemes (condensation/evaporation) + physics_schemes = [(SaturationAdjustment(eqns), ForwardEuler(domain))] + + # Time stepper + stepper = SemiImplicitQuasiNewton( + eqns, io, transported_fields, transport_methods, + linear_solver=linear_solver, physics_schemes=physics_schemes + ) + + # ------------------------------------------------------------------------ # + # Initial conditions + # ------------------------------------------------------------------------ # + + u0 = stepper.fields("u") + rho0 = stepper.fields("rho") + theta0 = stepper.fields("theta") + water_v0 = stepper.fields("water_vapour") + water_c0 = stepper.fields("cloud_water") + + # spaces + Vt = domain.spaces("theta") + Vr = domain.spaces("DG") + x, z = SpatialCoordinate(mesh) + quadrature_degree = (4, 4) + dxp = dx(degree=(quadrature_degree)) + + # Define constant theta_e and water_t + theta_e = Function(Vt).assign(Tsurf) + water_t = Function(Vt).assign(total_water) + + # Calculate hydrostatic fields + saturated_hydrostatic_balance(eqns, stepper.fields, theta_e, water_t) + + # make mean fields + theta_b = Function(Vt).assign(theta0) + rho_b = Function(Vr).assign(rho0) + water_vb = Function(Vt).assign(water_v0) + water_cb = Function(Vt).assign(water_t - water_vb) + + # define perturbation + xc = domain_width / 2 + r = sqrt((x - xc) ** 2 + (z - zc) ** 2) + theta_pert = Function(Vt).interpolate( + conditional( + r > rc, + 0.0, + Tdash * (cos(pi * r / (2.0 * rc))) ** 2 + ) + ) + + # define initial theta + theta0.interpolate(theta_b * (theta_pert / 300.0 + 1.0)) + + # find perturbed rho + gamma = TestFunction(Vr) + rho_trial = TrialFunction(Vr) + a = gamma * rho_trial * dxp + L = gamma * (rho_b * theta_b / theta0) * dxp + rho_problem = LinearVariationalProblem(a, L, rho0) + rho_solver = LinearVariationalSolver(rho_problem) + rho_solver.solve() + + # find perturbed water_v + w_v = Function(Vt) + phi = TestFunction(Vt) + rho_averaged = Function(Vt) + rho_recoverer = Recoverer(rho0, rho_averaged) + rho_recoverer.project() + + exner = thermodynamics.exner_pressure(eqns.parameters, rho_averaged, theta0) + p = thermodynamics.p(eqns.parameters, exner) + T = thermodynamics.T(eqns.parameters, theta0, exner, r_v=w_v) + w_sat = thermodynamics.r_sat(eqns.parameters, T, p) + + w_functional = (phi * w_v * dxp - phi * w_sat * dxp) + w_problem = NonlinearVariationalProblem(w_functional, w_v) + w_solver = NonlinearVariationalSolver(w_problem) + w_solver.solve() + + water_v0.assign(w_v) + water_c0.assign(water_t - water_v0) + + # wind initially zero + u0.project(as_vector( + [Constant(0.0, domain=mesh), Constant(0.0, domain=mesh)] + )) + + stepper.set_reference_profiles( + [ + ('rho', rho_b), + ('theta', theta_b), + ('water_vapour', water_vb), + ('cloud_water', water_cb) + ] + ) + + # --------------------------------------------------------------------- # + # Run + # --------------------------------------------------------------------- # + + stepper.run(t=0, tmax=tmax) + + # State for checking checkpoints + checkpoint_name = 'simult_SIQN_order'+str(order)+'_chkpt.h5' + new_path = join(abspath(dirname(__file__)), '..', f'data/{checkpoint_name}') + check_output = OutputParameters(dirname=output_dirname, + checkpoint_pickup_filename=new_path, + checkpoint=True) + check_mesh = pick_up_mesh(check_output, mesh_name) + check_domain = Domain(check_mesh, dt, "CG", order) + check_eqn = CompressibleEulerEquations(check_domain, params, active_tracers=tracers, u_transport_option=u_eqn_type) + check_io = IO(check_domain, check_output) + check_stepper = SemiImplicitQuasiNewton(check_eqn, check_io, [], []) + check_stepper.io.pick_up_from_checkpoint(check_stepper.fields) + + return stepper, check_stepper + + +@pytest.mark.parametrize("order", [0, 1]) +def test_simult_SIQN(tmpdir, order): + + dirname = str(tmpdir) + stepper, check_stepper = run_simult_SIQN(dirname, order) + + for variable in ['u', 'rho', 'theta', 'water_vapour', 'cloud_water']: + new_variable = stepper.fields(variable) + check_variable = check_stepper.fields(variable) + diff_array = new_variable.dat.data - check_variable.dat.data + error = np.linalg.norm(diff_array) / np.linalg.norm(check_variable.dat.data) + + # Slack values chosen to be robust to different platforms + assert error < 1e-10, f'Values for {variable} in the ' + \ + f'order {order} elements test do not match KGO values'