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.

position
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
  1. values ← [0.0, 10.0, 25.0, 45.0]

    7values = [0.0, 10.0, 25.0, 45.0]8position = 1
    values this step[0.0, 10.0, 25.0, 45.0]values
  2. position ← 1

    7values = [0.0, 10.0, 25.0, 45.0]8position = 19if (position == 1) then
    values this step1position
  3. if (position == 1) then

    8position = 19if (position == 1) then10    slope = values(2) - values(1)
    values this step.true.position == 1
  4. slope ← 10.0

    9if (position == 1) then10    slope = values(2) - values(1)11else if (position == 4) then
    values this step10.0slope10.0values(2) - values(1)
  5. print '(I0, 1X, F0.1)', position, slope

    15    end if16    print '(I0, 1X, F0.1)', position, slope17end program edge_stencil_demo
    output1 10.0
    values this step1position10.0slope
  1. values ← [0.0, 10.0, 25.0, 45.0]

    7values = [0.0, 10.0, 25.0, 45.0]8position = 2
    values this step[0.0, 10.0, 25.0, 45.0]values
  2. position ← 2

    7values = [0.0, 10.0, 25.0, 45.0]8position = 29if (position == 1) then
    values this step2position
  3. if (position == 1) then

    8position = 29if (position == 1) then10    slope = values(2) - values(1)
    values this step.false.position == 1
  4. else 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 == 4
  5. slope ← 12.5

    13else14    slope = (values(position + 1) - values(position - 1)) / 2.015end if
    values this step12.5slope25.0values(position + 1) - values(position - 1)
  6. print '(I0, 1X, F0.1)', position, slope

    15    end if16    print '(I0, 1X, F0.1)', position, slope17end program edge_stencil_demo
    output2 12.5
    values this step2position12.5slope
  1. values ← [0.0, 10.0, 25.0, 45.0]

    7values = [0.0, 10.0, 25.0, 45.0]8position = 4
    values this step[0.0, 10.0, 25.0, 45.0]values
  2. position ← 4

    7values = [0.0, 10.0, 25.0, 45.0]8position = 49if (position == 1) then
    values this step4position
  3. if (position == 1) then

    8position = 49if (position == 1) then10    slope = values(2) - values(1)
    values this step.false.position == 1
  4. else 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 == 4
  5. slope ← 20.0

    11else if (position == 4) then12    slope = values(4) - values(3)13else
    values this step20.0slope20.0values(4) - values(3)
  6. print '(I0, 1X, F0.1)', position, slope

    15    end if16    print '(I0, 1X, F0.1)', position, slope17end program edge_stencil_demo
    output4 20.0
    values 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.