Skip to content
Snippets Groups Projects
Commit 0206dd9c authored by Robert Speck's avatar Robert Speck
Browse files

Fixed vortex example

parent 6a285592
No related branches found
No related tags found
No related merge requests found
...@@ -407,7 +407,6 @@ class fenics_heat_mass(fenics_heat): ...@@ -407,7 +407,6 @@ class fenics_heat_mass(fenics_heat):
b = self.dtype_u(rhs) b = self.dtype_u(rhs)
self.bc.apply(T, b.values.vector()) self.bc.apply(T, b.values.vector())
self.bc.apply(b.values.vector())
df.solve(T, u.values.vector(), b.values.vector()) df.solve(T, u.values.vector(), b.values.vector())
......
...@@ -3,7 +3,6 @@ import logging ...@@ -3,7 +3,6 @@ import logging
import dolfin as df import dolfin as df
import numpy as np import numpy as np
from pySDC.core.Errors import ParameterError
from pySDC.core.Problem import ptype from pySDC.core.Problem import ptype
from pySDC.implementations.datatype_classes.fenics_mesh import fenics_mesh, rhs_fenics_mesh from pySDC.implementations.datatype_classes.fenics_mesh import fenics_mesh, rhs_fenics_mesh
...@@ -78,7 +77,7 @@ class fenics_vortex_2d(ptype): ...@@ -78,7 +77,7 @@ class fenics_vortex_2d(ptype):
c_nvars = [(32, 32)] c_nvars = [(32, 32)]
if refinements is None: if refinements is None:
refinements = [1, 0] refinements = 1
# Subdomain for Periodic boundary condition # Subdomain for Periodic boundary condition
class PeriodicBoundary(df.SubDomain): class PeriodicBoundary(df.SubDomain):
...@@ -103,8 +102,8 @@ class fenics_vortex_2d(ptype): ...@@ -103,8 +102,8 @@ class fenics_vortex_2d(ptype):
y[1] = x[1] - 1.0 y[1] = x[1] - 1.0
# set logger level for FFC and dolfin # set logger level for FFC and dolfin
df.set_log_level(df.WARNING)
logging.getLogger('FFC').setLevel(logging.WARNING) logging.getLogger('FFC').setLevel(logging.WARNING)
logging.getLogger('UFL').setLevel(logging.WARNING)
# set solver and form parameters # set solver and form parameters
df.parameters["form_compiler"]["optimize"] = True df.parameters["form_compiler"]["optimize"] = True
...@@ -120,7 +119,8 @@ class fenics_vortex_2d(ptype): ...@@ -120,7 +119,8 @@ class fenics_vortex_2d(ptype):
# define function space for future reference # define function space for future reference
self.V = df.FunctionSpace(mesh, family, order, constrained_domain=PeriodicBoundary()) self.V = df.FunctionSpace(mesh, family, order, constrained_domain=PeriodicBoundary())
tmp = df.Function(self.V) tmp = df.Function(self.V)
print('DoFs on this level:', len(tmp.vector().vector()[:])) print('DoFs on this level:', len(tmp.vector()[:]))
self.fix_bc_for_residual = False
# invoke super init, passing number of dofs, dtype_u and dtype_f # invoke super init, passing number of dofs, dtype_u and dtype_f
super(fenics_vortex_2d, self).__init__(self.V) super(fenics_vortex_2d, self).__init__(self.V)
...@@ -162,7 +162,8 @@ class fenics_vortex_2d(ptype): ...@@ -162,7 +162,8 @@ class fenics_vortex_2d(ptype):
""" """
A = self.M + self.nu * factor * self.K A = self.M + self.nu * factor * self.K
b = self.__apply_mass_matrix(rhs) # b = self.apply_mass_matrix(rhs)
b = self.dtype_u(rhs)
u = self.dtype_u(u0) u = self.dtype_u(u0)
df.solve(A, u.values.vector(), b.values.vector()) df.solve(A, u.values.vector(), b.values.vector())
...@@ -186,8 +187,9 @@ class fenics_vortex_2d(ptype): ...@@ -186,8 +187,9 @@ class fenics_vortex_2d(ptype):
Explicit part of the right-hand side. Explicit part of the right-hand side.
""" """
A = 1.0 * self.K A = self.K
b = self.__apply_mass_matrix(u) b = self.apply_mass_matrix(u)
# b = self.dtype_u(u)
psi = self.dtype_u(self.V) psi = self.dtype_u(self.V)
df.solve(A, psi.values.vector(), b.values.vector()) df.solve(A, psi.values.vector(), b.values.vector())
...@@ -195,6 +197,7 @@ class fenics_vortex_2d(ptype): ...@@ -195,6 +197,7 @@ class fenics_vortex_2d(ptype):
fexpl.values = df.project( fexpl.values = df.project(
df.Dx(psi.values, 1) * df.Dx(u.values, 0) - df.Dx(psi.values, 0) * df.Dx(u.values, 1), self.V df.Dx(psi.values, 1) * df.Dx(u.values, 0) - df.Dx(psi.values, 0) * df.Dx(u.values, 1), self.V
) )
fexpl = self.apply_mass_matrix(fexpl)
return fexpl return fexpl
...@@ -215,9 +218,10 @@ class fenics_vortex_2d(ptype): ...@@ -215,9 +218,10 @@ class fenics_vortex_2d(ptype):
Implicit part of the right-hand side. Implicit part of the right-hand side.
""" """
tmp = self.dtype_u(self.V) A = -self.nu * self.K
tmp.values = df.Function(self.V, -1.0 * self.nu * self.K * u.values.vector()) fimpl = self.dtype_u(self.V)
fimpl = self.__invert_mass_matrix(tmp) A.mult(u.values.vector(), fimpl.values.vector())
# fimpl = self.__invert_mass_matrix(fimpl)
return fimpl return fimpl
...@@ -243,7 +247,7 @@ class fenics_vortex_2d(ptype): ...@@ -243,7 +247,7 @@ class fenics_vortex_2d(ptype):
f.expl = self.__eval_fexpl(u, t) f.expl = self.__eval_fexpl(u, t)
return f return f
def __apply_mass_matrix(self, u): def apply_mass_matrix(self, u):
r""" r"""
Routine to apply mass matrix. Routine to apply mass matrix.
...@@ -258,7 +262,7 @@ class fenics_vortex_2d(ptype): ...@@ -258,7 +262,7 @@ class fenics_vortex_2d(ptype):
""" """
me = self.dtype_u(self.V) me = self.dtype_u(self.V)
me.values = df.Function(self.V, self.M * u.values.vector()) self.M.mult(u.values.vector(), me.values.vector())
return me return me
...@@ -278,12 +282,7 @@ class fenics_vortex_2d(ptype): ...@@ -278,12 +282,7 @@ class fenics_vortex_2d(ptype):
""" """
me = self.dtype_u(self.V) me = self.dtype_u(self.V)
df.solve(self.M, me.values.vector(), u.values.vector())
A = 1.0 * self.M
b = self.dtype_u(u)
df.solve(A, me.values.vector(), b.values.vector())
return me return me
def u_exact(self, t): def u_exact(self, t):
......
from pySDC.implementations.controller_classes.controller_nonMPI import controller_nonMPI from pySDC.implementations.controller_classes.controller_nonMPI import controller_nonMPI
from pySDC.implementations.problem_classes.VorticityVelocity_2D_FEniCS_periodic import fenics_vortex_2d from pySDC.implementations.problem_classes.VorticityVelocity_2D_FEniCS_periodic import fenics_vortex_2d
from pySDC.implementations.sweeper_classes.generic_implicit import generic_implicit from pySDC.implementations.sweeper_classes.imex_1st_order_mass import imex_1st_order_mass
from pySDC.implementations.sweeper_classes.imex_1st_order import imex_1st_order
from pySDC.implementations.transfer_classes.TransferFenicsMesh import mesh_to_mesh_fenics from pySDC.implementations.transfer_classes.TransferFenicsMesh import mesh_to_mesh_fenics
if __name__ == "__main__": def setup_and_run(variant='mass'):
num_procs = 1 num_procs = 1
t0 = 0 t0 = 0
...@@ -12,7 +14,12 @@ if __name__ == "__main__": ...@@ -12,7 +14,12 @@ if __name__ == "__main__":
# initialize level parameters # initialize level parameters
level_params = dict() level_params = dict()
if variant == 'mass':
level_params['restol'] = 5e-09 / 500
elif variant == 'mass_inv':
level_params['restol'] = 5e-09 level_params['restol'] = 5e-09
else:
raise NotImplementedError('variant unknown')
level_params['dt'] = dt level_params['dt'] = dt
# initialize step parameters # initialize step parameters
...@@ -27,7 +34,8 @@ if __name__ == "__main__": ...@@ -27,7 +34,8 @@ if __name__ == "__main__":
sweeper_params = dict() sweeper_params = dict()
sweeper_params['quad_type'] = 'RADAU-RIGHT' sweeper_params['quad_type'] = 'RADAU-RIGHT'
sweeper_params['num_nodes'] = [3] sweeper_params['num_nodes'] = [3]
sweeper_params['QI'] = 'LU' sweeper_params['QI'] = 'MIN-SR-S'
sweeper_params['QE'] = 'PIC'
problem_params = dict() problem_params = dict()
problem_params['nu'] = 0.01 problem_params['nu'] = 0.01
...@@ -36,7 +44,7 @@ if __name__ == "__main__": ...@@ -36,7 +44,7 @@ if __name__ == "__main__":
problem_params['c_nvars'] = [(32, 32)] problem_params['c_nvars'] = [(32, 32)]
problem_params['family'] = 'CG' problem_params['family'] = 'CG'
problem_params['order'] = [4] problem_params['order'] = [4]
problem_params['refinements'] = [1, 0] problem_params['refinements'] = [1]
# initialize controller parameters # initialize controller parameters
controller_params = dict() controller_params = dict()
...@@ -46,7 +54,12 @@ if __name__ == "__main__": ...@@ -46,7 +54,12 @@ if __name__ == "__main__":
description = dict() description = dict()
description['problem_class'] = fenics_vortex_2d description['problem_class'] = fenics_vortex_2d
description['problem_params'] = problem_params description['problem_params'] = problem_params
description['sweeper_class'] = generic_implicit if variant == 'mass_inv':
description['sweeper_class'] = imex_1st_order
elif variant == 'mass':
description['sweeper_class'] = imex_1st_order_mass
else:
raise NotImplementedError('variant unknown')
description['sweeper_params'] = sweeper_params description['sweeper_params'] = sweeper_params
description['level_params'] = level_params description['level_params'] = level_params
description['step_params'] = step_params description['step_params'] = step_params
...@@ -63,7 +76,11 @@ if __name__ == "__main__": ...@@ -63,7 +76,11 @@ if __name__ == "__main__":
# call main function to get things done... # call main function to get things done...
uend, stats = controller.run(u0=uinit, t0=t0, Tend=Tend) uend, stats = controller.run(u0=uinit, t0=t0, Tend=Tend)
# compute exact solution and compare # # compute exact solution and compare
uex = P.u_exact(Tend) # uex = P.u_exact(Tend)
#
# print('(classical) error at time %s: %s' % (Tend, abs(uex - uend) / abs(uex)))
print('(classical) error at time %s: %s' % (Tend, abs(uex - uend) / abs(uex))) if __name__ == "__main__":
setup_and_run(variant='mass')
# setup_and_run(variant='mass_inv')
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment