Boundary Conditions
Edge Stencil
One-Sided Boundary Math
A stencil can use one-sided formulas at the array edges and a centered formula in the interior.
Program
Play the program to choose an edge or interior position and compare the selected formula.
edge_stencil.f90
Replay: real traced execution (multi-file project)
program edge_stencil_demo
implicit none
real :: values(4)
integer :: position
real :: slope
values = [0.0, 10.0, 25.0, 45.0]
position = 1
if (position == 1) then
slope = values(2) - values(1)
else if (position == 4) then
slope = values(4) - values(3)
else
slope = (values(position + 1) - values(position - 1)) / 2.0
end if
print '(I0, 1X, F0.1)', position, slope
end program edge_stencil_demo
program edge_stencil_demo
implicit none
real :: values(4)
integer :: position
real :: slope
values = [0.0, 10.0, 25.0, 45.0]
position = 2
if (position == 1) then
slope = values(2) - values(1)
else if (position == 4) then
slope = values(4) - values(3)
else
slope = (values(position + 1) - values(position - 1)) / 2.0
end if
print '(I0, 1X, F0.1)', position, slope
end program edge_stencil_demo
program edge_stencil_demo
implicit none
real :: values(4)
integer :: position
real :: slope
values = [0.0, 10.0, 25.0, 45.0]
position = 4
if (position == 1) then
slope = values(2) - values(1)
else if (position == 4) then
slope = values(4) - values(3)
else
slope = (values(position + 1) - values(position - 1)) / 2.0
end if
print '(I0, 1X, F0.1)', position, slope
end program edge_stencil_demo
values ← [0.0, 10.0, 25.0, 45.0]
7values = [0.0, 10.0, 25.0, 45.0]8position = 1values this step[0.0, 10.0, 25.0, 45.0]valuesposition ← 1
7values = [0.0, 10.0, 25.0, 45.0]8position = 19if (position == 1) thenvalues this step1positionif (position == 1) then
8position = 19if (position == 1) then10 slope = values(2) - values(1)values this step.true.position == 1slope ← 10.0
9if (position == 1) then10 slope = values(2) - values(1)11else if (position == 4) thenvalues this step10.0slope10.0values(2) - values(1)print '(I0, 1X, F0.1)', position, slope
15 end if16 print '(I0, 1X, F0.1)', position, slope17end program edge_stencil_demooutput1 10.0values this step1position10.0slope
values ← [0.0, 10.0, 25.0, 45.0]
7values = [0.0, 10.0, 25.0, 45.0]8position = 2values this step[0.0, 10.0, 25.0, 45.0]valuesposition ← 2
7values = [0.0, 10.0, 25.0, 45.0]8position = 29if (position == 1) thenvalues this step2positionif (position == 1) then
8position = 29if (position == 1) then10 slope = values(2) - values(1)values this step.false.position == 1else if (position == 4) then
10 slope = values(2) - values(1)11else if (position == 4) then12 slope = values(4) - values(3)values this step.false.position == 4slope ← 12.5
13else14 slope = (values(position + 1) - values(position - 1)) / 2.015end ifvalues this step12.5slope25.0values(position + 1) - values(position - 1)print '(I0, 1X, F0.1)', position, slope
15 end if16 print '(I0, 1X, F0.1)', position, slope17end program edge_stencil_demooutput2 12.5values this step2position12.5slope
values ← [0.0, 10.0, 25.0, 45.0]
7values = [0.0, 10.0, 25.0, 45.0]8position = 4values this step[0.0, 10.0, 25.0, 45.0]valuesposition ← 4
7values = [0.0, 10.0, 25.0, 45.0]8position = 49if (position == 1) thenvalues this step4positionif (position == 1) then
8position = 49if (position == 1) then10 slope = values(2) - values(1)values this step.false.position == 1else if (position == 4) then
10 slope = values(2) - values(1)11else if (position == 4) then12 slope = values(4) - values(3)values this step.true.position == 4slope ← 20.0
11else if (position == 4) then12 slope = values(4) - values(3)13elsevalues this step20.0slope20.0values(4) - values(3)print '(I0, 1X, F0.1)', position, slope
15 end if16 print '(I0, 1X, F0.1)', position, slope17end program edge_stencil_demooutput4 20.0values this step4position20.0slope
edge case
The first and last positions cannot read on both sides.
one-sided stencil
Edge positions subtract the nearest neighbor on the inside.
centered stencil
Interior positions can use values on both sides.