Flow boundary conditions
Supported boundary conditions:
Free slip
at the boundary No slip
at the boundary
Defining the boundary conditions
We have two ways of defining the boundary condition formulations: - VelocityBoundaryConditions
, and - DisplacementBoundaryConditions
. The first one is used for the velocity-pressure formulation, and the second one is used for the displacement-pressure formulation. The flow boundary conditions can be switched on and off by setting them as true
or false
at the appropriate boundaries. Valid boundary names are left
and right
, top
and bot
, and for the 3D case, front
and back
.
For example, if we want to have free free-slip in every single boundary in a 2D simulation, we need to instantiate VelocityBoundaryConditions
or DisplacementBoundaryConditions
as:
bcs = VelocityBoundaryConditions(;
no_slip = (left=false, right=false, top=false, bot=false),
free_slip = (left=true, right=true, top=true, bot=true),
)
bcs = DisplacementBoundaryConditions(;
no_slip = (left=false, right=false, top=false, bot=false),
free_slip = (left=true, right=true, top=true, bot=true),
)
The equivalent for the 3D case would be:
bcs = VelocityBoundaryConditions(;
no_slip = (left=false, right=false, top=false, bot=false, front=false, back=false),
free_slip = (left=true, right=true, top=true, bot=true, front=true, back=true),
)
bcs = DisplacementBoundaryConditions(;
no_slip = (left=false, right=false, top=false, bot=false, front=false, back=false),
free_slip = (left=true, right=true, top=true, bot=true, front=true, back=true),
)
Prescribing the velocity/displacement boundary conditions
Normally, one would prescribe the velocity/displacement boundary conditions by setting the velocity/displacement field at the boundary through the application of a background strain rate εbg
. Depending on the formulation, the velocity/displacement field is set as follows for the 2D case:
Velocity formulation
stokes.V.Vx .= PTArray(backend)([ x*εbg for x in xvi[1], _ in 1:ny+2]) # Velocity in x direction
stokes.V.Vy .= PTArray(backend)([-y*εbg for _ in 1:nx+2, y in xvi[2]]) # Velocity in y direction
Make sure to apply the set velocity to the boundary conditions. You do this by calling the flow_bcs!
function,
flow_bcs!(stokes, flow_bcs)
and then applying the velocities to the halo
update_halo!(@velocity(stokes)...)
Displacement formulation
stokes.U.Ux .= PTArray(backend)([ x*εbg*lx*dt for x in xvi[1], _ in 1:ny+2]) # Displacement in x direction
stokes.U.Uy .= PTArray(backend)([-y*εbg*ly*dt for _ in 1:nx+2, y in xvi[2]]) # Displacement in y direction
flow_bcs!(stokes, flow_bcs)
Make sure to initialize the displacement according to the extent of your domain. Here, lx and ly are the domain lengths in the x and y directions, respectively. Also for the displacement formulation it is important that the displacement is converted to velocity before updating the halo. This can be done by calling the displacement2velocity!
function.
displacement2velocity!(stokes, dt) # convert displacement to velocity
update_halo!(@velocity(stokes)...)
Thermal boundary conditions
Supported boundary conditions:
No flux
at the boundary Dirichlet $T = f(x_i) $ at a given point of the domain
Defining the boundary conditions
Thermal boundary conditions can be defined using the ThermalBoundaryConditions
struct. As with the flow boundary conditions, they can be switched on and off by setting them as true
or false
at the appropriate boundaries. `.
For example, if we want to have a zero-flux boundary condition at the left and right boundaries, and a Dirichlet boundary condition at the top and bottom boundaries in a 2D simulation, we need to instantiate ThermalBoundaryConditions
as:
bcs = ThermalBoundaryConditions(;
no_flux = (left=true, right=true, top=false, bot=false),
)
Unspecified boundaries will be set to a Dirichlet boundary condition by default.