Skip to content

Commit 53b7703

Browse files
committed
more playing around
1 parent 5795e36 commit 53b7703

File tree

4 files changed

+167
-27
lines changed

4 files changed

+167
-27
lines changed

pySDC/implementations/problem_classes/AllenCahn_1D_FD.py

Lines changed: 137 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from pySDC.core.Errors import ParameterError, ProblemError
77
from pySDC.core.Problem import ptype
8-
from pySDC.implementations.datatype_classes.mesh import mesh, rhs_imex_mesh
8+
from pySDC.implementations.datatype_classes.mesh import mesh, rhs_imex_mesh, rhs_comp2_mesh
99

1010

1111
class allencahn_front_fullyimplicit(ptype):
@@ -580,7 +580,7 @@ def __init__(self, problem_params, dtype_u=mesh, dtype_f=rhs_imex_mesh):
580580
# invoke super init, passing number of dofs, dtype_u and dtype_f
581581
super(allencahn_periodic_semiimplicit, self).__init__(problem_params, dtype_u, dtype_f)
582582

583-
self.A -= sp.eye(self.init) * 2.0 / self.params.eps ** 2
583+
self.A -= sp.eye(self.init) * 0.0 / self.params.eps ** 2
584584

585585
def solve_system(self, rhs, factor, u0, t):
586586
"""
@@ -613,6 +613,139 @@ def eval_f(self, u, t):
613613
"""
614614
f = self.dtype_f(self.init)
615615
f.impl.values = self.A.dot(u.values)
616-
f.expl.values = -2.0 / self.params.eps ** 2 * u.values * (1.0 - u.values) * (1.0 - 2 * u.values) - \
617-
6.0 * self.params.dw * u.values * (1.0 - u.values) + 2.0 / self.params.eps ** 2 * u.values
616+
f.expl.values = -2.0 / self.params.eps ** 2 * u.values * (1.0 - u.values) * (1.0 - 2.0 * u.values) - \
617+
6.0 * self.params.dw * u.values * (1.0 - u.values) + 0.0 / self.params.eps ** 2 * u.values
618618
return f
619+
620+
621+
class allencahn_periodic_multiimplicit(allencahn_periodic_fullyimplicit):
622+
"""
623+
Example implementing the Allen-Cahn equation in 1D with finite differences and periodic BC,
624+
with driving force, 0-1 formulation (Bayreuth example)
625+
"""
626+
627+
def __init__(self, problem_params, dtype_u=mesh, dtype_f=rhs_comp2_mesh):
628+
"""
629+
Initialization routine
630+
631+
Args:
632+
problem_params (dict): custom parameters for the example
633+
dtype_u: mesh data type (will be passed parent class)
634+
dtype_f: mesh data type (will be passed parent class)
635+
"""
636+
637+
# these parameters will be used later, so assert their existence
638+
essential_keys = ['nvars', 'dw', 'eps', 'newton_maxiter', 'newton_tol', 'interval', 'radius']
639+
for key in essential_keys:
640+
if key not in problem_params:
641+
msg = 'need %s to instantiate problem, only got %s' % (key, str(problem_params.keys()))
642+
raise ParameterError(msg)
643+
644+
# we assert that nvars looks very particular here.. this will be necessary for coarsening in space later on
645+
if (problem_params['nvars']) % 2 != 0:
646+
raise ProblemError('setup requires nvars = 2^p')
647+
648+
if 'stop_at_nan' not in problem_params:
649+
problem_params['stop_at_nan'] = True
650+
651+
# invoke super init, passing number of dofs, dtype_u and dtype_f
652+
super(allencahn_periodic_multiimplicit, self).__init__(problem_params, dtype_u, dtype_f)
653+
654+
self.A -= sp.eye(self.init) * 0.0 / self.params.eps ** 2
655+
656+
def solve_system_1(self, rhs, factor, u0, t):
657+
"""
658+
Simple linear solver for (I-factor*A)u = rhs
659+
660+
Args:
661+
rhs (dtype_f): right-hand side for the linear system
662+
factor (float): abbrev. for the local stepsize (or any other factor required)
663+
u0 (dtype_u): initial guess for the iterative solver
664+
t (float): current time (e.g. for time-dependent BCs)
665+
666+
Returns:
667+
dtype_u: solution as mesh
668+
"""
669+
670+
me = self.dtype_u(u0)
671+
me.values = spsolve(sp.eye(self.params.nvars, format='csc') - factor * self.A, rhs.values)
672+
return me
673+
674+
def eval_f(self, u, t):
675+
"""
676+
Routine to evaluate the RHS
677+
678+
Args:
679+
u (dtype_u): current values
680+
t (float): current time
681+
682+
Returns:
683+
dtype_f: the RHS
684+
"""
685+
f = self.dtype_f(self.init)
686+
f.comp1.values = self.A.dot(u.values)
687+
f.comp2.values = -2.0 / self.params.eps ** 2 * u.values * (1.0 - u.values) * (1.0 - 2.0 * u.values) - \
688+
6.0 * self.params.dw * u.values * (1.0 - u.values) + 0.0 / self.params.eps ** 2 * u.values
689+
return f
690+
691+
def solve_system_2(self, rhs, factor, u0, t):
692+
"""
693+
Simple linear solver for (I-factor*A)u = rhs
694+
695+
Args:
696+
rhs (dtype_f): right-hand side for the linear system
697+
factor (float): abbrev. for the local stepsize (or any other factor required)
698+
u0 (dtype_u): initial guess for the iterative solver
699+
t (float): current time (e.g. for time-dependent BCs)
700+
701+
Returns:
702+
dtype_u: solution as mesh
703+
"""
704+
705+
u = self.dtype_u(u0).values
706+
eps2 = self.params.eps ** 2
707+
dw = self.params.dw
708+
709+
Id = sp.eye(self.params.nvars)
710+
711+
# start newton iteration
712+
n = 0
713+
res = 99
714+
while n < self.params.newton_maxiter:
715+
# print(n)
716+
# form the function g with g(u) = 0
717+
g = u - rhs.values - factor * (- 2.0 / eps2 * u * (1.0 - u) * (1.0 - 2.0 * u) -
718+
6.0 * dw * u * (1.0 - u) + 0.0 / self.params.eps ** 2 * u)
719+
720+
# if g is close to 0, then we are done
721+
res = np.linalg.norm(g, np.inf)
722+
723+
if res < self.params.newton_tol:
724+
break
725+
726+
# assemble dg
727+
dg = Id - factor * (- 2.0 / eps2 * sp.diags(
728+
(1.0 - u) * (1.0 - 2.0 * u) - u * ((1.0 - 2.0 * u) + 2.0 * (1.0 - u)), offsets=0) - 6.0 * dw * sp.diags(
729+
(1.0 - u) - u, offsets=0) + 0.0 / self.params.eps ** 2 * Id)
730+
731+
# newton update: u1 = u0 - g/dg
732+
u -= spsolve(dg, g)
733+
# u -= gmres(dg, g, x0=z, tol=self.params.lin_tol)[0]
734+
# increase iteration count
735+
n += 1
736+
737+
if np.isnan(res) and self.params.stop_at_nan:
738+
raise ProblemError('Newton got nan after %i iterations, aborting...' % n)
739+
elif np.isnan(res):
740+
self.logger.warning('Newton got nan after %i iterations...' % n)
741+
742+
if n == self.params.newton_maxiter:
743+
self.logger.warning('Newton did not converge after %i iterations, error is %s' % (n, res))
744+
745+
self.newton_ncalls += 1
746+
self.newton_itercount += n
747+
748+
me = self.dtype_u(self.init)
749+
me.values = u
750+
751+
return me

pySDC/playgrounds/Allen_Cahn/AllenCahn_Bayreuth_periodic_1D.py

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,12 @@
88
from pySDC.helpers.stats_helper import filter_stats, sort_stats
99
from pySDC.implementations.collocation_classes.gauss_radau_right import CollGaussRadau_Right
1010
from pySDC.implementations.controller_classes.controller_nonMPI import controller_nonMPI
11-
from pySDC.implementations.problem_classes.AllenCahn_1D_FD import allencahn_periodic_fullyimplicit, allencahn_periodic_semiimplicit
11+
from pySDC.implementations.problem_classes.AllenCahn_1D_FD import allencahn_periodic_fullyimplicit, allencahn_periodic_semiimplicit, allencahn_periodic_multiimplicit
1212
from pySDC.implementations.sweeper_classes.generic_implicit import generic_implicit
1313
from pySDC.implementations.sweeper_classes.imex_1st_order import imex_1st_order
14+
from pySDC.implementations.sweeper_classes.multi_implicit import multi_implicit
15+
from pySDC.implementations.transfer_classes.TransferMesh import mesh_to_mesh
16+
from pySDC.implementations.transfer_classes.TransferMesh_FFT import mesh_to_mesh_fft
1417
from pySDC.playgrounds.Allen_Cahn.AllenCahn_monitor_Bayreuth import monitor
1518

1619

@@ -29,24 +32,24 @@ def setup_parameters():
2932
level_params = dict()
3033
level_params['restol'] = 1E-08
3134
level_params['dt'] = 2E-02
32-
level_params['nsweeps'] = 1
35+
level_params['nsweeps'] = [1]
3336

3437
# initialize sweeper parameters
3538
sweeper_params = dict()
3639
sweeper_params['collocation_class'] = CollGaussRadau_Right
37-
sweeper_params['num_nodes'] = [5]
40+
sweeper_params['num_nodes'] = [3]
3841
sweeper_params['Q1'] = ['LU']
3942
sweeper_params['Q2'] = ['LU']
4043
sweeper_params['QI'] = ['LU']
4144
sweeper_params['QE'] = ['EE']
42-
sweeper_params['spread'] = False
45+
sweeper_params['spread'] = True
4346

4447
# This comes as read-in for the problem class
4548
problem_params = dict()
46-
problem_params['nvars'] = 128 * 8
47-
problem_params['dw'] = -0.04
48-
problem_params['eps'] = 0.04
49-
problem_params['newton_maxiter'] = 100
49+
problem_params['nvars'] = [128 * 8]#, 128 * 4]
50+
problem_params['dw'] = [-0.04]
51+
problem_params['eps'] = [0.04]
52+
problem_params['newton_maxiter'] = 200
5053
problem_params['newton_tol'] = 1E-08
5154
problem_params['lin_tol'] = 1E-08
5255
problem_params['lin_maxiter'] = 100
@@ -55,7 +58,12 @@ def setup_parameters():
5558

5659
# initialize step parameters
5760
step_params = dict()
58-
step_params['maxiter'] = 50
61+
step_params['maxiter'] = 20
62+
63+
# initialize space transfer parameters
64+
space_transfer_params = dict()
65+
space_transfer_params['rorder'] = 2
66+
space_transfer_params['iorder'] = 6
5967

6068
# initialize controller parameters
6169
controller_params = dict()
@@ -70,6 +78,8 @@ def setup_parameters():
7078
description['sweeper_params'] = sweeper_params # pass sweeper parameters
7179
description['level_params'] = level_params # pass level parameters
7280
description['step_params'] = step_params # pass step parameters
81+
# description['space_transfer_class'] = mesh_to_mesh_fft # pass spatial transfer class
82+
# description['space_transfer_params'] = space_transfer_params # pass paramters for spatial transfer
7383

7484
return description, controller_params
7585

@@ -101,12 +111,12 @@ def run_SDC_variant(variant=None, inexact=False):
101111
description['sweeper_class'] = imex_1st_order
102112
if inexact:
103113
description['problem_params']['lin_maxiter'] = 10
104-
# elif variant == 'multi-implicit':
105-
# description['problem_class'] = allencahn_multiimplicit
106-
# description['sweeper_class'] = multi_implicit
107-
# if inexact:
108-
# description['problem_params']['newton_maxiter'] = 1
109-
# description['problem_params']['lin_maxiter'] = 10
114+
elif variant == 'multi-implicit':
115+
description['problem_class'] = allencahn_periodic_multiimplicit
116+
description['sweeper_class'] = multi_implicit
117+
if inexact:
118+
description['problem_params']['newton_maxiter'] = 1
119+
description['problem_params']['lin_maxiter'] = 10
110120
# elif variant == 'multi-implicit_v2':
111121
# description['problem_class'] = allencahn_multiimplicit_v2
112122
# description['sweeper_class'] = multi_implicit
@@ -123,7 +133,7 @@ def run_SDC_variant(variant=None, inexact=False):
123133

124134
# setup parameters "in time"
125135
t0 = 0
126-
Tend = 1.0# * description['level_params']['dt']
136+
Tend = description['level_params']['dt']
127137

128138
# instantiate controller
129139
controller = controller_nonMPI(num_procs=1, controller_params=controller_params, description=description)
@@ -315,8 +325,9 @@ def main(cwd=''):
315325
# Loop over variants, exact and inexact solves
316326
results = {}
317327
# for variant in ['multi-implicit', 'semi-implicit', 'fully-implicit', 'semi-implicit_v2', 'multi-implicit_v2']:
318-
for variant in ['fully-implicit']:
328+
# for variant in ['fully-implicit']:
319329
# for variant in ['semi-implicit']:
330+
for variant in ['multi-implicit']:
320331

321332
results[(variant, 'exact')] = run_SDC_variant(variant=variant, inexact=False)
322333
# results[(variant, 'inexact')] = run_SDC_variant(variant=variant, inexact=True)

pySDC/playgrounds/parallel/AllenCahn_contracting_circle_FFT.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def setup_parameters():
3232
# initialize level parameters
3333
level_params = dict()
3434
level_params['restol'] = 1E-08
35-
level_params['dt'] = 1E-03
35+
level_params['dt'] = 1E-02
3636
level_params['nsweeps'] = [3, 1]
3737

3838
# initialize sweeper parameters
@@ -184,7 +184,7 @@ def main(cwd=''):
184184

185185
# Loop over variants, exact and inexact solves
186186
results = {}
187-
for variant in ['semi-implicit']:
187+
for variant in ['semi-implicit-stab']:
188188

189189
results[(variant, 'exact')] = run_SDC_variant(variant=variant)
190190

requirements-optional.txt

Lines changed: 0 additions & 4 deletions
This file was deleted.

0 commit comments

Comments
 (0)