| @ -0,0 +1,81 @@ | |||||
| ```python | |||||
| from fenics import * | |||||
| from dolfin import * | |||||
| import mshr | |||||
| import matplotlib.pyplot as plt | |||||
| import numpy as np | |||||
| ``` | |||||
| ```python | |||||
| T = 60*60*5 #final step | |||||
| num_steps = 50 | |||||
| dt = T/num_steps #step size | |||||
| ``` | |||||
| ```python | |||||
| #2 Create mesh and define function space | |||||
| domain = mshr.Circle(Point(0.,0.),1.0,60) | |||||
| mesh = mshr.generate_mesh(domain, 25) | |||||
| V = FunctionSpace(mesh, 'Lagrange', 1) #Lagrange are triangular elements | |||||
| plot(mesh) | |||||
| plt.show() | |||||
| ``` | |||||
|  | |||||
| ```python | |||||
| #3 Defining boundary conditions (Dirichlet) | |||||
| D = 1.4E-7 #cm^2/s | |||||
| u_D = Constant(0.1) | |||||
| def Dirichlet_boundary(x, on_boundary): | |||||
| return on_boundary | |||||
| bc = DirichletBC(V, Constant(1), Dirichlet_boundary) | |||||
| ``` | |||||
| ```python | |||||
| #Defining initial values and variational problem | |||||
| u_n = interpolate(u_D,V) | |||||
| u = TrialFunction(V) | |||||
| v = TestFunction(V) | |||||
| f = Constant(0) | |||||
| F = u*v*dx+D*dt*dot(grad(u), grad(v))*dx-(u_n+dt*f)*v*dx | |||||
| a, L = lhs(F), rhs(F) | |||||
| ``` | |||||
| ```python | |||||
| #Resolution on time steps | |||||
| u = Function(V) | |||||
| t = 0 | |||||
| vtkfile = File('sol/solution.pvd') | |||||
| for n in range(num_steps): | |||||
| #update current time | |||||
| t += dt | |||||
| u_D.t = t | |||||
| #compute solution | |||||
| solve(a==L, u, bc) | |||||
| #vtkfile << (u,t) | |||||
| plot(u) | |||||
| plt.show() | |||||
| #update previous solution | |||||
| u_n.assign(u) | |||||
| ``` | |||||
|  | |||||
|  | |||||