next up previous contents
Next: BIOTR Up: ATSP2K manual Previous: BP_MAT   Contents

Subsections


BP_EIV

Introduction

bp_eiv computes a set of eigenvalues using the matrix data, which is supplied by bp_mat in the form of three files:

  1. hnr.lst the non-relativistic, J-independent contributions.
  2. hzeta.lst the spin-orbit and spin-other-orbit contributions that need to be multiplied by $(-1)^{L+S^\prime-J}W(L^\prime S^\prime LS; J1)$.
  3. hspin.lst the spin-spin contributions that need to be multiplied by $(-1)^{L+S^\prime-J}W(L^\prime S^\prime LS; J2)$.
where, $W(L^\prime S^\prime LS; Jk)$ is a Racah coefficient.

Selected set of J values and eigenvalues can be requested, and for each term the program can apply energy corrections. For each specified eigenvalues, the output file contains the dominant configuration and its energy, the eigenvector, and information identifying the case, such as J value, number of electrons, the atomic number and the Zeeman factor.  13.16

Program Structure

The program starts with initializing basic constants in inita(), initr(). inp_case() prompts the user to supply the name of the case, type of calculation, relativistic or non-relativistic, and if the mass correction will be included. Then, the maximum and minimum eigenvalue to be computed need to be specified as a 2*J number, followed by a request for indices to be computed within each J. This data must be entered using the following format.

>Enter ATOM, relativistic (Y/N) with mass correction (Y/N)
A,y,y
>Gradient or Slater form? (G/S):
g
> Enter Maximum and minimum values of 2*J
4,2
>Enter eigenvalues: one line per term, eigenvalues separated by commas
2*J =  4
2,3,4
2*J =  2
1,2
.......

Figure 8.31: bp_eiv program structure.
\begin{figure}\begin{center}
\centerline{\psfig{figure=tex/fig/bp_eiv_main.epsi}}\end{center}\end{figure}

To compute the number of matrix elements, and respectively to allocate memory, alcmat() and alctab() rely on a call to jmem(), which in effect reads hnr.lst, hzeta.lst, hspin.lst and computes the number of nonzero elements in the interaction matrix. If the requested memory is larger than the what is available, the program continues the calculation, by allocating memory for the largest column. In this case the dvdson() performs matrix-vector multiplication (in dssbmv), keeping in memory only a single column.

The matrix elements are assembled in (hmx_lsj()), then the interaction matrix is diagonalized (lsjmat()). Next, dvdson() finds the requested eigenvalues. Finally, brci_zeeman(), computes the Zeman factor. The requested eigenvectors are saved in a <name>.j file.

Figure 8.32: Subroutine lsjmat().
\begin{figure}\begin{center}
\centerline{\psfig{figure=tex/fig/bp_eiv_lsjmat.epsi}}\end{center}\end{figure}

Energy corrections

bp_mat can adjust the final energies of a given LS term, by shifting the diagonal matrix elements by an amount specified by the user. For each term, the program asks the users for shifts (in cm$^{-1}$) which lower the level relative to the lowest by the specified amount. The results are now written to a file called <name>.new. Usually, this program is run first without considering adjustments. The tables program may then be used to find the spectrum from the energies in a <name>.j file (this file may be a concatenated file from separate bp_eiv runs). By comparing with observation, a shift can be determined, it is usually equal to the difference computed - observed in cm$^{-1}$. When interactions are not strong, this procedure needs to be applied only once to bring energy levels into agreement with observation, but for strong mixing, several iterations may be needed. This adjustment process has not been automated.

Each state is labeled according to the term of the largest component in the eigenvector. This scheme will not produce unique labels when three or more CSFs interact strongly. In such cases, the user will need to edit the file and determine a suitable, unique sets of labels. Also included for each state, the g_J parameter for the Breit-Pauli expansion [#!PJ-gj!#], and the g_J for an LS approximation. This file is formatted. Expansion coefficients are presented to 8 decimal places.

Figure 8.33: IO files for the serial version.
\begin{figure}\begin{center}
\centerline{\psfig{figure=tex/fig/io_bp_eiv.eps}}\end{center}\end{figure}

MPI Implementation

Unlike bp_ang and bp_mat, which do not have communication overhead other than initializing a finalizing the MPI calculation, this program performs a number of MPI_Allreduce() steps, in which the quantities computed by each processor are summed at node = 0. The elements of the interaction matrix are calculated by columns in hmx_lsj(), additionally, the the diagonals are adjusted if the user provided desired energy. corrections. Each node assembles only columns which are multiples on myid + 1. After processing all ncfg columns, the information is exchanged between the nodes using a global summation over all nodes.

         do j = myid+1,ncfg,nprocs
           call hmx_lsj(ncfg,j,nze,ind_jj,nij,istart,shift,
     :                  mycol,pflsj,njv)
         end do
*       ..gather all diagonals from processors.
        call mpi_allr_dp(hii,ncfg) !gdsummpi(hii,ncfg,tm)
      end if

node 0 reads the configuration list and the wave function, and broadcasts the data to the other nodes. Each node of bp_eiv reads the corresponding data files, hnr.lst.nnnn, hzeta.lst.nnnn, hspin.lst.nnnn, Figure  8.34

Figure 8.34: IO files for the MPI version.
\begin{figure}\begin{center}
\centerline{\psfig{figure=tex/fig/mpi_io_bp_eiv.eps}}\end{center}\end{figure}


next up previous contents
Next: BIOTR Up: ATSP2K manual Previous: BP_MAT   Contents
2001-10-11