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

Subsections


BP_ANG

Introduction

Once radial functions have been determined that simultaneously represent several LS terms, providing a basis for a Breit-Pauli expansion of LSJ wave functions, a configuration interaction calculation may be performed for determining selected eigenvalues and wave functions expansions or eigenvectors. In the present design the Breit-Pauli Hamiltonian is represented as a sum of the non-relativistic Hamiltonian, $H_{NR}$, and the relativistic contribution, ${H_R}$:

\begin{displaymath}
H = H_{NR} + H_R
\end{displaymath} (6)

The relativistic part, ${H_R}$ is a sum of the contributions of:

\begin{displaymath}
H_R = H_{mass} + H_{Darwin} + H_{ssc} + H_{oo} +
+ H_{so} + H_{ss} + H_{soo}
\end{displaymath} (7)

where the first four terms, mass, Darwin, spin-spin contact, and orbit-orbit, give a non-fine structure contributions, which are not J dependent. The last three, spin-orbit, spin-spin, and spin-other orbit define fine structure splitting.

Program Structure

bp_ang performs computing and saving angular data in files for consquent use by bp_mat.

Figure 6.21: bp_ang() program structure.
\begin{figure}\begin{center}
\centerline{\psfig{figure=tex/fig/bp_ang_main.epsi}}\end{center}\end{figure}

The initial data, which the user interactively enters is processed by inp_atom(), brevala(), the user have the choice to select options about the calculation:

  1. Relativistic or nonrelativistic calculation
  2. Gradient or Slater integral form
  3. Selection of operators, SO, SOO, SS, OO.
  4. Default Rydberg constant
  5. All interactions. This option can be used upon discretion of the user to select relativistic calculation only for desired range of the configuration list.

All angular data is generated in brevala(), which first requests from the user data about the operators to be included, and sets ISPORB,ISOORB,ISPSPN,IORBORB,ICOLOM to true if the corresponding operators if requested.

Figure 6.22: brevala() processes the list of configurations in breitgg() after collecting from the user more information about the type of calculation which includes type of operators and interactions to be considered.
\begin{figure}\begin{center}
\centerline{\psfig{figure=tex/fig/bp_ang_brevala.epsi}}\end{center}\end{figure}

Then, initial data about the type and the number of integrals is generated in genintbr():

Figure 6.23: genitbr() computes integrals.
\begin{figure}\begin{center}
\centerline{\psfig{figure=tex/fig/bp_ang_genintbr.epsi}}\end{center}\end{figure}

genitbr() is an interface to comp_genitbr(), which performs the calculation of the integrals. comp_genitbr() is called twice, the first time, it only sweeps over all possible integrals without computing them, and the total number of integrals are determined. The total number of integrals is then used to allocate memory for intptr, value, which are correspondingly the arrays containing the integral and pointer data. In the next phase comp_genitbr() computes the integral data for all orbitals.

The main loop is over the entire configuration list and the data for matrix elements are generated by column. The interaction matrix is symmetric and only the lower or upper part needs to be evaluated. breitgg() generates the nonrelativistic hamiltonian assuming orthogonal orbitals. Thus the computational sequence is:

 For column = 1 to ncfg
    For row = column to ncfg

For each column, data is written to a set of files, described in  13.16, and further below:

      DO jb = 1, ncfg
         if(mod(jb,100).eq.0) write(ISCW,'(A,I5)') '   jb = ',jb
         if(jb == ncfg) write(ISCW,'(A,I5)') '   jb = ',jb
         CALL SHELLSJB(JB)
         call BreitGG(NEW,NZERO,IFIRST,idg,skip,nze)
         write(11) nih, (jan(i),i=1,nih);
         write(12) nih, (ico(i),i=1,nih);
         mycol = mycol + 1
         jptr(mycol) = nij
      end do

Figure  6.24 shows the steps of processing each configuration. All routines are from the angular library libang.a.

Figure 6.24: Subroutines breitgg().
\begin{figure}\begin{center}
\centerline{\psfig{figure=tex/fig/bp_ang_breitgg.epsi,height=15cm}}\end{center}\end{figure}

File IO

Provided with the list of configurations, bp_ang generates lists with angular data, including selected or all relativistic effects. The angular data is Z independent and need to be generated only ones for a given configuration list, or a sequence. The data files are consequently used by bp_mat to generate the potential contributions to the interaction matrix, Figure  6.25

Figure 6.25: Serial version. The angular data are stored in files.
\begin{figure}\centerline{\psfig{file=tex/fig/bp_ang_io.eps}}\end{figure}

The only input file required is the configuration list, which needs to have a .c suffix. This file has the configurations for all terms that mix in the BP calculation. The list is obtained by concatenating the relevant configuration lists of each term. bp_ang reads cfg.inp until the first occurrences of an . Since each configuration list contains two header lines and an asterisk at the end, after concatenating the files, all header lines and asterisks in intermediate position need to be erased.

After a bp_ang calucaltion the user will find four binary files which contain the angular data and general information relevant to the number and type of orbitals, number of configurations:

  1. cint.lst.s This file is created by bp_ang and it contains general information: the number of closed shells, and other orbitals, the highest orbital, the number of configuration's the buffer size, lsdim, number include are also column pointer data, number of terms and electron parameters.
  2. c.lst.s coefficients and integrals required for deriving the energy expression.
  3. ih.lst.s Row indices of the matrix elements.
  4. ico.lst.s Column pointers, each pointer defines the end of a matrix element.

MPI implementation bp_ang_mpi

The most CPU intensive task is generating the angular data which occurs in the brevala(). Each column is processed independently of the other columns. Therefore, each column can be processed by a separate process, which can be assigned to a free processor. Thus, the main loop assigns to each node each configuration, with order, which is multiple of myid + nprocs, where myid is the id number of the node, and nprocs is the total number available node:

      DO jb = myid + 1, ncfg, nprocs
         if(mod(jb,1000).eq.0) write(ISCW,'(A,I5)') '   jb = ',jb
         if(jb == ncfg) write(ISCW,'(A,I5)') '   jb = ',jb
         CALL SHELLSJB(JB)
         call BreitGG(NEW,NZERO,IFIRST,idg,skip,nze)
         write(11) nih, (jan(i),i=1,nih);
         write(12) nih, (ico(i),i=1,nih);
         mycol = mycol + 1
         jptr(mycol) = nij
      end do

Each node records the angular data in a separate file, and this is an important factor for accomplishing high efficiency of the parallel program. add data Note, that the each file has 4 digits for the processor ID, while nonh uses three digits.

Figure 6.26: MPI files. Each node processes the input configuration list and writes the angular files.
\begin{figure}\centerline{\psfig{file=tex/fig/mpi_io_bp_ang.eps}}\end{figure}


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