v = TestFunction(V) F = u * v / dt * dx + alpha * dot(grad(u), grad(v)) * dx - u_n * v / dt * dx # apply constant Dirichlet boundary condition at bottom edge # apply Dirichlet boundary condition on coupling interface bcs = [ DirichletBC(V, coupling_expression, coupling_boundary), DirichletBC(V, u_D, bottom_boundary) ] a, L = lhs(F), rhs(F) # Time-stepping u_np1 = Function(V) t = 0 u_D.t = t + dt # mark mesh w.r.t ranks ranks = File("output/ranks%s.pvd.pvd" % precice.get_participant_name()) mesh_rank = MeshFunction("size_t", mesh, mesh.topology().dim()) mesh_rank.set_all(MPI.rank(MPI.comm_world)) mesh_rank.rename("myRank", "") ranks << mesh_rank # Create output file file_out = File("output/%s.pvd" % precice.get_participant_name()) file_out << u_n print("output vtk for time = {}".format(float(t))) n = 0
# Define variational problem u = TrialFunction(V) v = TestFunction(V) F = u * v / dt * dx + alpha * dot(grad(u), grad(v)) * dx - u_n * v / dt * dx # apply Dirichlet boundary condition on coupling interface bcs.append(precice.create_coupling_dirichlet_boundary_condition(V)) a, L = lhs(F), rhs(F) # Time-stepping u_np1 = Function(V) F_known_u = u_np1 * v / dt * dx + alpha * dot(grad(u_np1), grad(v)) * dx - u_n * v / dt * dx t = 0 u_D.t = t + dt file_out = File("Solid/VTK/%s.pvd" % precice._solver_name) n=0 while precice.is_coupling_ongoing(): # Compute solution solve(a == L, u_np1, bcs) # Dirichlet problem obtains flux from solution and sends flux on boundary to Neumann problem fluxes = fluxes_from_temperature_full_domain(F_known_u, V, k) t, n, precice_timestep_is_complete, precice_dt = precice.advance(fluxes, u_np1, u_n, t, dt, n) dt = np.min([fenics_dt, precice_dt]) # todo we could also consider deciding on time stepping size inside the adapter
# Define variational problem u = TrialFunction(V) v = TestFunction(V) F = u * v / dt * dx + alpha * dot(grad(u), grad(v)) * dx - u_n * v / dt * dx # apply constant Dirichlet boundary condition at bottom edge # apply Dirichlet boundary condition on coupling interface bcs = [DirichletBC(V, coupling_expression, coupling_boundary), DirichletBC(V, u_D, bottom_boundary)] a, L = lhs(F), rhs(F) # Time-stepping u_np1 = Function(V) F_known_u = u_np1 * v / dt * dx + alpha * dot(grad(u_np1), grad(v)) * dx - u_n * v / dt * dx t = 0 u_D.t = t + dt file_out = File("Solid/VTK/%s.pvd" % precice.get_participant_name()) n = 0 while precice.is_coupling_ongoing(): if precice.is_action_required(precice.action_write_iteration_checkpoint()): # write checkpoint precice.store_checkpoint(u_n, t, n) read_data = precice.read_data() # Update the coupling expression with the new read data precice.update_coupling_expression(coupling_expression, read_data) dt.assign(np.min([fenics_dt, precice_dt]))
u = TrialFunction(V) v = TestFunction(V) F = u * v / dt * dx + alpha * dot(grad(u), grad(v)) * dx - u_n * v / dt * dx # apply Dirichlet boundary condition on coupling interface bcs.append(precice.create_coupling_dirichlet_boundary_condition(V)) a, L = lhs(F), rhs(F) # Time-stepping u_np1 = Function(V) F_known_u = u_np1 * v / dt * dx + alpha * dot(grad(u_np1), grad(v)) * dx - u_n * v / dt * dx u_np1.rename("T", "") t = 0 u_D.t = t + precice._precice_tau assert (dt == precice._precice_tau) file_out = File("Solid/VTK/%s.pvd" % solver_name) while precice.is_coupling_ongoing(): # Compute solution solve(a == L, u_np1, bcs) # Dirichlet problem obtains flux from solution and sends flux on boundary to Neumann problem fluxes = fluxes_from_temperature_full_domain(F_known_u, V, k) is_converged = precice.advance(fluxes, dt) if is_converged: # Update previous solution