7.3. The path finder

The path finder is the tool that digs through the atoms list in the feff.inp file and determines all possible scattering geometries. This has been reimplemented in DEMETER to add some important features that are missing in FEFF's path finder. Continuing with the example from the previous section, we can use an instrumented Feff object to compute potentials. It is not essential to run the potentials calculation (line 6) before the path finder (line 7), however both must be run before anything else (plotting, fitting) is done with the FEFF calculation.

1
2
3
4
5
6
7
8
9
 #!/usr/bin/perl
 use Demeter;

 my $feff = Demeter::Feff -> new(file => "feff/feff.inp");
 $feff -> set(workspace => "feff/", screen => 0,);
 $feff -> potph
 $feff -> pathfinder;

 $feff -> freeze("feff/feff.yaml");

At line 9, the attributes of the Feff object, including results of the path finder, are written to a save file. This save file is in the YAML format, which is a simple, textual serialization format for data structures. As you will see in subsequent sections, these YAML files (along with the phase.bin) can be used to restore a FEFF calculation for future use.

This can be made a little more efficient. run at line 6 below is a thin wrapper around the potph and pathfinder method calls.

1
2
3
4
5
6
 #!/usr/bin/perl
 use Demeter;

 my $feff = Demeter::Feff -> new(file => "feff/feff.inp");
 $feff -> set(workspace => "feff/", screen => 0,);
 $feff -> run

The rest of this chapter will cover ways of finding out information about the FEFF calculation. The next chapter will cover in detail how information from the FEFF calculation is used to create Path object and how those Path objects can be plotted and used in a fitting model.

7.3.1. Comparing Pathfinders

DEMETER's path finder has two huge advantages over FEFF's:

  1. User configurable fuzzy degeneracy (explained in detail below). FEFF considers paths that differ in length by 0.00001 Å to be non-degenerate.
  2. The scattering geometries of the degenerate paths are stored and are available for use and examination. FEFF discards the details of the degenerate paths.

FEFF's path finder, however, has its advantages over DEMETER's.

  1. As it is written in a compiled language, it is considerably faster. Fortunately, the path finder does not need to be called very often.
  2. FEFF uses its fast plane wave calculation to approximate the importance of path. Low importance paths can be removed from consideration, as can all higher order paths built from that path. DEMETER does not have access to the plane wave calculation, so it must consider many more paths that FEFF's and relies instead on some simple heuristics to trim the tree of paths.
  3. FEFF path finder considers up to seven-legged paths. DEMETER currently defaults to four-legged paths. Five- and six-legged paths are possible, but time-consuming.

7.3.2. Fuzzy degeneracy

As the path finder organizes all the scattering geometries it finds among the atoms in the input atoms list, it will make a fuzzy comparison to sort the paths into nearly-degenerate bins. That is, all paths whose lengths are within a small margin will be considered degenerate. The width of this bin is set by the ♦Pathfinder→fuzz preference. Consider this feff.inp file:

TITLE magnetoplumbite  PbFe_12O_19
HOLE 4   1.0   *  Pb L3 edge  (13035.0 eV), second number is S0^2

*         mphase,mpath,mfeff,mchi
CONTROL   1      1     1     1
PRINT     1      0     0     0

RMAX        5.0

POTENTIALS
*    ipot   Z  element
       0   82   Pb
       1   82   Pb
       2   26   Fe
       3    8   O

ATOMS                          * this list contains 39 atoms
*   x          y          z      ipot  tag              distance
   0.00000    0.00000    0.00000  0 Pb1             0.00000
   1.65468    0.00003    2.30070  3 O_1             2.83393
  -0.82737   -1.43298    2.30070  3 O_1             2.83394
   1.65468    0.00003   -2.30070  3 O_1             2.83393
  -0.82737   -1.43298   -2.30070  3 O_1             2.83394
  -0.82737    1.43304    2.30070  3 O_2             2.83397
  -0.82737    1.43304   -2.30070  3 O_2             2.83397
   2.63123   -1.31552    0.00000  3 O_3             2.94176
  -0.17634   -2.93647    0.00000  3 O_3             2.94176
   2.63123    1.31558    0.00000  3 O_4             2.94179
  -2.45494   -1.62092    0.00000  3 O_4             2.94179
  -2.45494    1.62098    0.00000  3 O_5             2.94182
  -0.17634    2.93653    0.00000  3 O_5             2.94182
   1.69537   -2.93647    0.00000  2 Fe2_1           3.39074
  -3.39080    0.00003    0.00000  2 Fe2_2           3.39080
   1.69537    2.93653    0.00000  2 Fe2_2           3.39079
   0.83581   -1.44767    3.24399  2 Fe5_1           3.64936
   0.83581   -1.44767   -3.24399  2 Fe5_1           3.64936
  -1.67167    0.00003    3.24399  2 Fe5_2           3.64938
   0.83581    1.44772    3.24399  2 Fe5_2           3.64938
  -1.67167    0.00003   -3.24399  2 Fe5_2           3.64938
   0.83581    1.44772   -3.24399  2 Fe5_2           3.64938
   3.39074    0.00006    1.38042  2 Fe4_1           3.66097
  -1.69542   -2.93644    1.38042  2 Fe4_1           3.66097
   3.39074    0.00006   -1.38042  2 Fe4_1           3.66097
  -1.69542   -2.93644   -1.38042  2 Fe4_1           3.66097
  -1.69542    2.93656    1.38042  2 Fe4_2           3.66106
  -1.69542    2.93656   -1.38042  2 Fe4_2           3.66106
END

Using the default ♦Pathfinder→fuzz parameter of 0.03 Å, will give these paths. Note that the Fe4 and Fe5 scatterers, which differ by about 0.11 Å, get merged into a single scattering path with an Reff value that is the average of the constituent paths.

#     degen   Reff       scattering path                       I legs   type
 0001   6    2.834  ----  <+> O_1    <+>                       2  2 single scattering
 0002   6    2.942  ----  <+> O_3    <+>                       2  2 single scattering
 0003   3    3.391  ----  <+> Fe2_1  <+>                       2  2 single scattering
 0004  12    3.655  ----  <+> Fe5_1  <+>                       2  2 single scattering

Resetting the ♦Pathfinder→fuzz to 0.01 separates those two nearly degenerate paths into separate scattering paths.

$any_object -> co -> set_default('pathfinder', 'fuzz', 0.01);
#     degen   Reff       scattering path                       I legs   type
 0001   6    2.834  ----  <+> O_1    <+>                       2  2 single scattering
 0002   6    2.942  ----  <+> O_3    <+>                       2  2 single scattering
 0003   3    3.391  ----  <+> Fe2_1  <+>                       2  2 single scattering
 0004   6    3.649  ----  <+> Fe5_1  <+>                       2  2 single scattering
 0005   6    3.661  ----  <+> Fe4_1  <+>                       2  2 single scattering



DEMETER is copyright © 2009-2016 Bruce Ravel – This document is copyright © 2016 Bruce Ravel

This document is licensed under The Creative Commons Attribution-ShareAlike License.

If DEMETER and this document are useful to you, please consider supporting The Creative Commons.