1
1
# Import required libs
2
2
from fenics import Constant , Function , AutoSubDomain , RectangleMesh , VectorFunctionSpace , interpolate , \
3
3
TrialFunction , TestFunction , Point , Expression , DirichletBC , nabla_grad , \
4
- Identity , inner , dx , sym , grad , lhs , rhs , File , solve , assemble_system , project , div
4
+ Identity , inner , dx , sym , grad , lhs , rhs , File , solve , assemble_system , div
5
5
6
6
import numpy as np
7
7
from fenicsprecice import Adapter
@@ -93,10 +93,10 @@ def remaining_boundary(x, on_boundary):
93
93
dt = Constant (np .min ([precice_dt , fenics_dt ]))
94
94
95
95
# alpha method parameters
96
- # alpha_m = Constant(0.2)
97
- # alpha_f = Constant(0.4)
98
- alpha_m = Constant (0 )
99
- alpha_f = Constant (0 )
96
+ alpha_m = Constant (0.2 )
97
+ alpha_f = Constant (0.4 )
98
+ # alpha_m = Constant(0)
99
+ # alpha_f = Constant(0)
100
100
101
101
"""
102
102
Check requirements for alpha_m and alpha_f from
@@ -133,7 +133,7 @@ def k(u, v):
133
133
return inner (sigma (u ), sym (grad (v ))) * dx
134
134
135
135
136
- def update_acceleration (u , u_old , v_old , a_old , ufl = True ):
136
+ def update_a (u , u_old , v_old , a_old , ufl = True ):
137
137
if ufl :
138
138
dt_ = dt
139
139
beta_ = beta
@@ -144,7 +144,7 @@ def update_acceleration(u, u_old, v_old, a_old, ufl=True):
144
144
return (u - u_old - dt_ * v_old ) / beta / dt_ ** 2 - .5 * (1 - 2 * beta_ ) / beta_ * a_old
145
145
146
146
147
- def update_velocity (a , u_old , v_old , a_old , ufl = True ):
147
+ def update_v (a , u_old , v_old , a_old , ufl = True ):
148
148
if ufl :
149
149
dt_ = dt
150
150
gamma_ = gamma
@@ -157,24 +157,25 @@ def update_velocity(a, u_old, v_old, a_old, ufl=True):
157
157
158
158
def update_fields (u , u_old , v_old , a_old ):
159
159
"""Update all fields at the end of a timestep."""
160
+ u_vec , u0_vec = u .vector (), u_old .vector ()
161
+ v0_vec , a0_vec = v_old .vector (), a_old .vector ()
160
162
161
163
# call update functions
162
- a_new = update_acceleration ( u , u_old , v_old , a_old )
163
- v_new = update_velocity ( a_new , u_old , v_old , a_old )
164
+ a_vec = update_a ( u_vec , u0_vec , v0_vec , a0_vec , ufl = False )
165
+ v_vec = update_v ( a_vec , u0_vec , v0_vec , a0_vec , ufl = False )
164
166
165
167
# assign u->u_old
166
- a_old .assign (project (a_new , V ))
167
- v_old .assign (project (v_new , V ))
168
- u_old .assign (u )
168
+ v_old .vector ()[:], a_old .vector ()[:] = v_vec , a_vec
169
+ u_old .vector ()[:] = u .vector ()
169
170
170
171
171
172
def avg (x_old , x_new , alpha ):
172
173
return alpha * x_old + (1 - alpha ) * x_new
173
174
174
175
175
176
# residual
176
- a_np1 = update_acceleration (du , u_n , v_n , a_n , ufl = True )
177
- v_np1 = update_velocity (a_np1 , u_n , v_n , a_n , ufl = True )
177
+ a_np1 = update_a (du , u_n , v_n , a_n , ufl = True )
178
+ v_np1 = update_v (a_np1 , u_n , v_n , a_n , ufl = True )
178
179
179
180
res = m (avg (a_n , a_np1 , alpha_m ), v ) + k (avg (u_n , du , alpha_f ), v )
180
181
@@ -238,6 +239,7 @@ def avg(x_old, x_new, alpha):
238
239
n = n_cp
239
240
else :
240
241
update_fields (u_np1 , u_n , v_n , a_n )
242
+ u_n .assign (u_np1 )
241
243
t += float (dt )
242
244
n += 1
243
245
0 commit comments