\(\newcommand{\AA}{\unicode{x212B}}\)

\(\Delta\)SCF Post-Processing (1D)#

Now that the LumiWork is complete, it is time to analyze the results. This first section shows how to do this with the so-called “single effective phonon mode model” or “one-dimensional configuration coordinate model” (1D-CCM). Recall that this model assumes the existence of a fictitious effective phonon mode whose eigenvector exactly follows the atomic relaxation from the ground state to the excited state, with an eigenfrequency computed with equation (48). For this analysis, we use the \(\Delta\)SCF calculations shown in the previous tutorial to instantiate a DeltaSCF object:

import warnings
warnings.filterwarnings('ignore')

from abipy.lumi.deltaSCF import DeltaSCF
scf_files=[
    "../workflows_data/flow_deltaSCF/w0/t2/outdata/out_GSR.nc",
    "../workflows_data/flow_deltaSCF/w0/t3/outdata/out_GSR.nc",
    "../workflows_data/flow_deltaSCF/w0/t4/outdata/out_GSR.nc",
    "../workflows_data/flow_deltaSCF/w0/t5/outdata/out_GSR.nc",
]

results = DeltaSCF.from_four_points_file(scf_files)

# or
#
# results = DeltaSCF.from_json_file("../workflows_data/flow_deltaSCF/w0/outdata/lumi.json")
#
# or only two relaxations
#
# results = DeltaSCF.from_relax_file(["../workflows_data/flow_deltaSCF/w0/t0/outdata/out_GSR.nc",
#                                     "../workflows_data/flow_deltaSCF/w0/t1/outdata/out_GSR.nc"])

Note

Energies are given in eV and distances in \(\AA\).

Total energies and electronic levels#

The energies of the four relevant states are accessible with:

print(results.ag_energy, results.ag_star_energy, results.ae_star_energy, results.ae_energy)
-12934.332201652453 eV -12932.701536166687 eV -12932.770270017414 eV -12934.277595698035 eV

If the electronic eigenenergies have been computed at a single \(k\)-point (typically \(\Gamma\)), they can be plotted with (spin up in black, spin down in red):

results.plot_eigen_energies(scf_files);
../../_images/8166f3edcbe696c78ff7252ace76ad65fc31d7e7d4f2bf76caa0a01ef920c8e2.png

In the ground state, notice the 7 Eu\(_{4f}\) states located in the gap. In the excited state (simulated with constrained occupations, as shown by the (un)filled markers), the 4f hole lowers the energy of an occupied 5d state, which is now located at the top of the gap, while the 6 remaining occupied 4f states are pushed down into the VB. If you have computed the four band structures associated with each point, you can use results.plot_four_BandStructures(nscf_files), where nscf_files is the list of the four band structure .nc files.

nscf_files = [
    "../workflows_data/flow_deltaSCF/w0/t6/outdata/out_GSR.nc",
    "../workflows_data/flow_deltaSCF/w0/t7/outdata/out_GSR.nc",
    "../workflows_data/flow_deltaSCF/w0/t8/outdata/out_GSR.nc",
    "../workflows_data/flow_deltaSCF/w0/t9/outdata/out_GSR.nc",
]

results.plot_four_BandStructures(nscf_files);
../../_images/9ebfd2d93e430b2b3879ed3a8a9cbe0eee6e0e696e575220b967e95609dde247.png

Notice the strong dispersion of the bands close to the CB bottom, due to the interaction between the Eu\(_{5d}\) replicas. Increasing the supercell size reduces this dispersion.

Atomic relaxation#

The ground- and excited-state structures are accessible with:

results.structure_gs()
#results.structures_ex()
Structure Summary
Lattice
    abc : 8.004850964704389 8.004850964704389 6.399859775548332
 angles : 90.0 90.0 90.0
 volume : 410.08790413783584
      A : 8.004850964704389 0.0 0.0
      B : 0.0 8.004850964704389 0.0
      C : 0.0 0.0 6.399859775548332
    pbc : True True True
PeriodicSite: Eu (4.002, 0.0, 1.6) [0.5, 0.0, 0.25]
PeriodicSite: Sr (4.002, 0.0, 4.8) [0.5, 0.0, 0.75]
PeriodicSite: Sr (0.0, 4.002, 0.0006355) [0.0, 0.5, 9.93e-05]
PeriodicSite: Sr (0.0, 4.002, 3.199) [0.0, 0.5, 0.4999]
PeriodicSite: Li (1.006, 6.616, 1.6) [0.1257, 0.8265, 0.25]
PeriodicSite: Li (1.003, 6.614, 4.8) [0.1253, 0.8263, 0.75]
PeriodicSite: Li (6.999, 1.389, 1.6) [0.8743, 0.1735, 0.25]
PeriodicSite: Li (7.001, 1.391, 4.8) [0.8747, 0.1737, 0.75]
PeriodicSite: Li (1.389, 1.006, 0.0007597) [0.1735, 0.1257, 0.0001187]
PeriodicSite: Li (1.389, 1.006, 3.199) [0.1735, 0.1257, 0.4999]
PeriodicSite: Li (6.616, 6.999, 0.0007597) [0.8265, 0.8743, 0.0001187]
PeriodicSite: Li (6.616, 6.999, 3.199) [0.8265, 0.8743, 0.4999]
PeriodicSite: Al (2.808, 5.463, 0.0008531) [0.3508, 0.6824, 0.0001333]
PeriodicSite: Al (2.808, 5.463, 3.199) [0.3508, 0.6824, 0.4999]
PeriodicSite: Al (5.196, 2.542, 0.0008531) [0.6492, 0.3176, 0.0001333]
PeriodicSite: Al (5.196, 2.542, 3.199) [0.6492, 0.3176, 0.4999]
PeriodicSite: Al (2.544, 2.806, 1.6) [0.3178, 0.3505, 0.25]
PeriodicSite: Al (2.544, 2.808, 4.8) [0.3178, 0.3508, 0.75]
PeriodicSite: Al (5.461, 5.199, 1.6) [0.6822, 0.6495, 0.25]
PeriodicSite: Al (5.461, 5.197, 4.8) [0.6822, 0.6492, 0.75]
PeriodicSite: N (4.669, 5.856, -0.001125) [0.5833, 0.7316, -0.0001758]
PeriodicSite: N (4.669, 5.856, 3.201) [0.5833, 0.7316, 0.5002]
PeriodicSite: N (3.336, 2.149, -0.001125) [0.4167, 0.2684, -0.0001758]
PeriodicSite: N (3.336, 2.149, 3.201) [0.4167, 0.2684, 0.5002]
PeriodicSite: N (2.155, 4.669, 1.6) [0.2692, 0.5832, 0.25]
PeriodicSite: N (2.156, 4.67, 4.8) [0.2693, 0.5835, 0.75]
PeriodicSite: N (5.85, 3.336, 1.6) [0.7308, 0.4168, 0.25]
PeriodicSite: N (5.849, 3.334, 4.8) [0.7307, 0.4165, 0.75]
PeriodicSite: O (1.993, 7.104, -0.001526) [0.249, 0.8874, -0.0002385]
PeriodicSite: O (1.993, 7.104, 3.201) [0.249, 0.8874, 0.5002]
PeriodicSite: O (6.011, 0.9013, -0.001526) [0.751, 0.1126, -0.0002385]
PeriodicSite: O (6.011, 0.9013, 3.201) [0.751, 0.1126, 0.5002]
PeriodicSite: O (0.8989, 2.0, 1.6) [0.1123, 0.2499, 0.25]
PeriodicSite: O (0.8984, 2.003, 4.8) [0.1122, 0.2503, 0.75]
PeriodicSite: O (7.106, 6.004, 1.6) [0.8877, 0.7501, 0.25]
PeriodicSite: O (7.106, 6.002, 4.8) [0.8878, 0.7497, 0.75]

It is sometimes useful to decompose the gs-ex displacements by species:

results.get_dataframe_species()
symbol mass $\Delta R^2$ $\Delta Q^2$
0 Sr 87.620000 2.492076e-07 0.000022
1 Li 6.941000 1.707388e-03 0.011851
2 Eu 151.964000 0.000000e+00 0.000000
3 Al 26.981539 2.010499e-03 0.054246
4 N 14.006700 8.944237e-03 0.125279
5 O 15.999400 5.898415e-03 0.094371

or by atom:

results.get_dataframe_atoms(defect_symbol="Eu")
symbol mass $\Delta R$ $\Delta Q^2$ $\Delta F$ dist. from defect
0 Eu 151.964000 0.000000 0.000000 3.021136e-18 0.000000
1 Sr 87.620000 0.000000 0.000000 3.021136e-18 3.199930
2 Sr 87.620000 0.000353 0.000011 2.404364e-02 5.881894
3 Sr 87.620000 0.000353 0.000011 2.404364e-02 5.881894
4 Li 6.941000 0.022438 0.003495 3.219426e-02 3.302428
5 Li 6.941000 0.006908 0.000331 1.195830e-02 4.600811
6 Li 6.941000 0.022438 0.003495 3.219426e-02 3.302428
7 Li 6.941000 0.006908 0.000331 1.195830e-02 4.600811
8 Li 6.941000 0.012298 0.001050 3.689746e-02 3.224950
9 Li 6.941000 0.012298 0.001050 3.689746e-02 3.224950
10 Li 6.941000 0.012298 0.001050 3.689746e-02 3.224950
11 Li 6.941000 0.012298 0.001050 3.689746e-02 3.224950
12 Al 26.981539 0.011001 0.003266 6.143308e-02 3.231813
13 Al 26.981539 0.011001 0.003266 6.143308e-02 3.231813
14 Al 26.981539 0.011001 0.003266 6.143308e-02 3.231813
15 Al 26.981539 0.011001 0.003266 6.143308e-02 3.231813
16 Al 26.981539 0.010330 0.002879 7.510210e-02 3.162003
17 Al 26.981539 0.025622 0.017713 1.495512e-01 4.500308
18 Al 26.981539 0.010330 0.002879 7.510210e-02 3.162003
19 Al 26.981539 0.025622 0.017713 1.495512e-01 4.500308
20 N 14.006700 0.038935 0.021233 4.005216e-01 2.761134
21 N 14.006700 0.038935 0.021233 4.005216e-01 2.761134
22 N 14.006700 0.038935 0.021233 4.005216e-01 2.761134
23 N 14.006700 0.038935 0.021233 4.005216e-01 2.761134
24 N 14.006700 0.028770 0.011594 1.530554e-01 3.813568
25 N 14.006700 0.024751 0.008580 1.248930e-02 4.976787
26 N 14.006700 0.028770 0.011594 1.530554e-01 3.813568
27 N 14.006700 0.024751 0.008580 1.248930e-02 4.976787
28 O 15.999400 0.037741 0.022789 3.681187e-01 2.722718
29 O 15.999400 0.037741 0.022789 3.681187e-01 2.722718
30 O 15.999400 0.037741 0.022789 3.681187e-01 2.722718
31 O 15.999400 0.037741 0.022789 3.681187e-01 2.722718
32 O 15.999400 0.002985 0.000143 1.467203e-01 3.692334
33 O 15.999400 0.009567 0.001464 9.676330e-02 4.887502
34 O 15.999400 0.002985 0.000143 1.467203e-01 3.692334
35 O 15.999400 0.009567 0.001464 9.676330e-02 4.887502

You can plot these displacements (or the ground-state forces at the excited-state atomic positions) as a function of the distance from the defect. This allows you to check the convergence of your calculation with respect to the supercell size. In our toy example, the results are not converged: the displacements are underestimated because of cancellation errors due to the periodic replicas of the defect. Note that the forces decay faster with distance (this will be important in later tutorials).

results.plot_delta_R_distance(defect_symbol="Eu");
../../_images/a210d00e8803d2fe814245d129b8563dcf16455b1b05fb14491ed322a5162d55.png
results.plot_delta_F_distance(defect_symbol="Eu");
../../_images/b36cabc40a8db2cafcff9d4b225c03073e1d33933718f5358a8cb58eb047bc6f.png

To visualize these displacements on a VESTA structure, follow these steps:

(1) Create a CIF file with the ground-state structure. (2) Open the structure with VESTA and save it in .vesta format (this must be done manually). (3) Use the draw_displacements_vesta() method.

results.structure_gs().to(filename="gs_stru.cif")
# then open this cif with vesta, save it as .vesta file format
"# generated using pymatgen\ndata_Sr3Li8EuAl8(NO)8\n_symmetry_space_group_name_H-M   'P 1'\n_cell_length_a   8.00485096\n_cell_length_b   8.00485096\n_cell_length_c   6.39985978\n_cell_angle_alpha   90.00000000\n_cell_angle_beta   90.00000000\n_cell_angle_gamma   90.00000000\n_symmetry_Int_Tables_number   1\n_chemical_formula_structural   Sr3Li8EuAl8(NO)8\n_chemical_formula_sum   'Sr3 Li8 Eu1 Al8 N8 O8'\n_cell_volume   410.08790414\n_cell_formula_units_Z   1\nloop_\n _symmetry_equiv_pos_site_id\n _symmetry_equiv_pos_as_xyz\n  1  'x, y, z'\nloop_\n _atom_site_type_symbol\n _atom_site_label\n _atom_site_symmetry_multiplicity\n _atom_site_fract_x\n _atom_site_fract_y\n _atom_site_fract_z\n _atom_site_occupancy\n  Eu  Eu0  1  0.50000000  0.00000000  0.25000000  1\n  Sr  Sr1  1  0.50000000  0.00000000  0.75000000  1\n  Sr  Sr2  1  0.00000000  0.50000000  0.00009930  1\n  Sr  Sr3  1  0.00000000  0.50000000  0.49990070  1\n  Li  Li4  1  0.12568471  0.82654005  0.25000000  1\n  Li  Li5  1  0.12534406  0.82629134  0.75000000  1\n  Li  Li6  1  0.87431529  0.17345995  0.25000000  1\n  Li  Li7  1  0.87465594  0.17370866  0.75000000  1\n  Li  Li8  1  0.17351474  0.12571140  0.00011871  1\n  Li  Li9  1  0.17351474  0.12571140  0.49988129  1\n  Li  Li10  1  0.82648526  0.87428860  0.00011871  1\n  Li  Li11  1  0.82648526  0.87428860  0.49988129  1\n  Al  Al12  1  0.35084176  0.68244058  0.00013330  1\n  Al  Al13  1  0.35084176  0.68244058  0.49986670  1\n  Al  Al14  1  0.64915824  0.31755942  0.00013330  1\n  Al  Al15  1  0.64915824  0.31755942  0.49986670  1\n  Al  Al16  1  0.31784161  0.35050234  0.25000000  1\n  Al  Al17  1  0.31781068  0.35081909  0.75000000  1\n  Al  Al18  1  0.68215839  0.64949766  0.25000000  1\n  Al  Al19  1  0.68218932  0.64918091  0.75000000  1\n  N  N20  1  0.58325401  0.73159491  -0.00017577  1\n  N  N21  1  0.58325401  0.73159491  0.50017577  1\n  N  N22  1  0.41674599  0.26840509  -0.00017577  1\n  N  N23  1  0.41674599  0.26840509  0.50017577  1\n  N  N24  1  0.26919588  0.58323483  0.25000000  1\n  N  N25  1  0.26928648  0.58345522  0.75000000  1\n  N  N26  1  0.73080412  0.41676517  0.25000000  1\n  N  N27  1  0.73071352  0.41654478  0.75000000  1\n  O  O28  1  0.24902582  0.88740903  -0.00023850  1\n  O  O29  1  0.24902582  0.88740903  0.50023850  1\n  O  O30  1  0.75097418  0.11259097  -0.00023850  1\n  O  O31  1  0.75097418  0.11259097  0.50023850  1\n  O  O32  1  0.11229476  0.24989457  0.25000000  1\n  O  O33  1  0.11223134  0.25025797  0.75000000  1\n  O  O34  1  0.88770524  0.75010543  0.25000000  1\n  O  O35  1  0.88776866  0.74974203  0.75000000  1\n"
results.draw_displacements_vesta(in_path="gs_stru.vesta",color_vector=[0, 0, 0])
Vesta files created and stored in: 
 /home/runner/work/abipy_book/abipy_book/abipy_book/lumabi/post_process_1D/VESTA_FILES

The resulting VESTA file should look like this:

../../_images/draw_displacements_vesta.png

You can modify how the vectors are drawn by changing the default arguments:

help(results.draw_displacements_vesta)
Help on method draw_displacements_vesta in module abipy.lumi.deltaSCF:

draw_displacements_vesta(
    in_path,
    mass_weighted=False,
    scale_vector=20,
    width_vector=0.3,
    color_vector=(255, 0, 0),
    centered=True,
    factor_keep_vectors=0.1,
    out_path='VESTA_FILES',
    out_filename='gs_ex_relaxation'
) method of abipy.lumi.deltaSCF.DeltaSCF instance
    Draw the ground state to excited state atomic relaxation on a vesta structure.

    Args:
        in_path: path where the initial .vesta structure in stored, should correspond to the ground state relaxed structure.
        mass_weighted: If True, weight the displacements by the atomic masses. Draw the \Delta Q in that case.
        scale_vector: scaling factor of the vector modulus
        width_vector: vector width
        color_vector: color in rgb format
        centered: center the vesta structure around [0,0,0]
        factor_keep_vectors: draw only the eigenvectors with magnitude > factor_keep_vectors * max(magnitude)
        out_path: path where .vesta files with vector are stored

Luminescent properties following the 1D-CCM#

One can visualize the 1D-CCM and the associated displaced parabolas with

results.draw_displaced_parabolas();
../../_images/75ec11103252e4cba093eb29c5f23d0ca34eb7c8257d24585986c17e0727f97c.png

or get a dataframe (or dictionary) with the main 1D-CCM parameters:

results.get_dataframe()
#results.get_dict_results()
E_em E_abs E_zpl E_fc_gs E_fc_ex Delta_S Delta_R Delta_Q Eff_freq_gs Eff_freq_ex S_em S_abs
None 1.507326 1.630665 1.561932 0.054606 0.068734 0.12334 0.136238 0.534574 0.039969 0.044842 1.366207 1.532787

Finally, one can plot the luminescence lineshape at 0 K:

results.plot_lineshape_1D_zero_temp(energy_range=[1,2]);
help(results.plot_lineshape_1D_zero_temp)
../../_images/b3d985b6dbedcfb46b4fb330740e93d6a66a54973c024395734c77dd5a8a5455.png
Help on method plot_lineshape_1D_zero_temp in module abipy.lumi.deltaSCF:

plot_lineshape_1D_zero_temp(
    energy_range=[0.5, 5],
    max_m=25,
    phonon_width=0.01,
    with_omega_cube='True',
    normalized='Area',
    ax=None,
    **kwargs
) -> Figure method of abipy.lumi.deltaSCF.DeltaSCF instance
    Plot the the emission lineshape following the effective phonon 1D-CCM at T=0K.
    NOT based on the generating function.

    Args:
        ax: |matplotlib-Axes| or None if a new figure should be created.
        energy_range:  Energy range at which the intensities are computed, ex: [0.5,5]
        max_m: Maximal vibrational state m considered
        phonon_width: fwhm of each phonon peak, in eV
        with_omega_cube: Considered or not the omega^3 dependence of the intensity
        normalized: Normalisation procedure. 'Area' if Area under the curve = 1. 'Sum' if maximum of the curve = 1.

    Returns: |matplotlib-Figure|




            Keyword arguments controlling the display of the figure:

            ================  =======================================================
            kwargs            Meaning
            ================  =======================================================
            title             Title of the plot. Default: None.
            show              True to show the figure. Default: True.
            savefig           "abc.png" or "abc.svg" to save the figure to a file.
            size_kwargs       Dictionary with options passed to fig.set_size_inches
                              e.g. size_kwargs=dict(w=3, h=4).
            tight_layout      True to call fig.tight_layout. Default: False.
            ax_grid           True (False) to add (remove) grid from all axes in fig.
                              Default: None i.e. fig is left unchanged.
            ax_annotate       Add labels to subplots e.g. (a), (b). Default: False
            fig_close         Close figure. Default: False.
            plotly            Try to convert mpl figure to plotly: Default: False
            ================  =======================================================