-
Notifications
You must be signed in to change notification settings - Fork 0
Property evaluation for general CI expansions
License
MBI-Theory/superdyson
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
exit 1 Last updated: Sept. 24, 2024 ============ IMPORTANT: IMPORTANT: PLEASE READ THIS ENTIRE FILE BEFORE USING SUPERDYSON, OR IMPORTANT: ASKING ANY QUESTIONS ABOUT ITS INSTALLATION OR USE. IMPORTANT: Property evaluation for general CI expansions. All the quantum chemistry data (orbitals and CI coefficients - we can do our own 1-electron integrals now) are taken from GAMESS-US. Unfortunately, the GAMESS interface is not fully automated - it is a sequence of scripts. Please note that (a simple) GAMESS source code modification is required to obtain reliable results (see below). At the moment, we support: - overlap integrals, including displaced geometries - transition dipoles - many other property operators (see braket_operator in sd_core.f90 for the complete list). - transition density matrices - Dyson orbitals and "exchange"/"cradle" corrections Contents: --------- 1. GAMESS-US source code modifications 2. Installation of superdyson 3. Examples and test cases 4. Input description 5. Using GAMESS-US for preparing superdyson inputs. 6. Simplified input 7. Caveats 1. GAMESS-US source code modifications GAMESS-US is very fond of adjusting the phases of the molecular orbitals. This happens in many places, and the adjustments are triggered by many different scenarios. Unfortunately, this means that the CI expansions printed in the output are sometimes (but not always) for the determinants constructed from the orbitals <i>different</i> from those printed in the output or punched in the .dat file. This is very bad news for any code which needs to use GAMESS-US wavefunctions to calculate properties. The only reliable solution I am aware of is to punch the MOs right at the point where GAMESS starts the CI calculation; unfortunately, this requires a (very simple) modification of the GAMESS-US source. What to do: 1a. Copy "ps_savemos.src" from the superdyson home directory to the GAMESS-US source directory (e.g. ~/gamess/source). 1b. Edit "gamess.src" to insert a call to ps_savemos right before the CI packages are called. The exact location will depend on the version of GAMESS; in 05DEC2014R1 it is: 2967 C 2968 500 CONTINUE 2969 C 2970 CALL PS_SAVEMOS('Orbitals at the entry to CI calculation') <- THIS IS THE LINE TO ADD 2971 C 2972 C ===== EXECUTE THE DESIRED CI PACKAGE ===== 2973 C THE CI COMPUTATION IS EXPECTED TO PRODUCE A DENSITY MATRIX FOR 2974 C SOME SPECIFIC STATE, AND FALL INTO PROPERTY EVALUATION BELOW. 1c. (optional) Increase the number of significant digits in the CI coefficient printout. Usually, GAMESS-US only prints 7 digits after the decimal for the CI coefficients; this will limit the accuracy of the results you can get from superdyson. The print statements you are looking for are in aldeci.src, algnci.src, and ormas1.src. They look something like this: IF(MASWRK) WRITE(IW,'(4A,F10.7)') CONA(1:NACT+2),'|', * CONB(1:NACT+2),'| ',CI(IPOS) Replace "F10.7" with "F17.14". Please note that this modification will change the main GAMESS output. If you have any tools or visualization programs parsing this output, they may fail to work with the modified version. If you are not the only user of GAMESS-US on your system, you may want to keep the modified version separate. 1d. Change GAMESS-US build scripts to include the additional file. In compall, you will need to add something like this: 616 endif 617 # 618 ./comp ps_savemos # <- This is the new line 619 # 620 unset echo 621 echo ------------------- done with all compilations -------------------- In lked, something like this should work: 1370 # 1371 $LDR $EXTRA_LINK_FLAGS:q -o $GMS_BUILD_DIR/$EXE.$VERNO.x $LDOPTS \ 1372 gamess.o unport.o ps_savemos.o $BLAS $LAPACK $VECTOR $QUICHE \ ^^^^^^^^^^^^ This is the extra bit 1373 $STANDARD_GAMESS_OBJ1 \ 1374 $STANDARD_GAMESS_OBJ2 \ 1375 $STANDARD_GAMESS_OBJ3 \ 1376 $QMMMOBJ $VBOBJ $NEOOBJ $NBOOBJ \ 1377 $GMS_EXTRA_OBJS \ 1378 $CCHEM_LIBS \ 1379 $MPQCOBJ $MPQCLIBS $LIBINT \ 1380 $MSG_LIBRARIES $LIBRARIES $EXTRA_MPI_LIB_FLAGS:q 1381 # 1e. Compile and link GAMESS-US as described in GAMESS documentation. 2. Installation of superdyson You will need a working Fortran compiler, BLAS, and LAPACK. If you would like to run superdyson on multiple cores, your compiler and libraries must support OpenMP. The libraries must be configured for single-threaded execution (they will be called from a parallel region). 2a. Edit the Makefile to choose your compiler and libraries. There are sample command lines for gfortran (recommended) and Intel Fortran (likely to produce slower OpenMP code); however, these will likely need some adjustments. 2b. Run "make". If everything goes right, at the end you should have an executable binary, "sd_v2.x" in the current directory. If things go wrong, you should seek help from your local computer support. Unless you have a running executable already, there is very little the author of the code can help you with. 3. Examples and test cases Successful compilation does not guarantee the <i>correct</i> compilation (this is especially true for the Intel compiler; dodgy BLAS and LAPACK libraries have also been known to pop up in some Linux distributions). The next step is to run the test set. It is found in the "test" subdirectory. In order to run all tests, switch to the test subdirectory, and execute the command: ./run-all.sh Depending on the speed of your computer, the test set may take several hours to complete. The test script will also verify some key output from the code. If it reports "OK:", the test is likely completed successfully. Some false negatives are possible for very small results. For example, the test case "n2-lowdin_prop_nosym.inp" will be frequently reported as "NOTOK:". The exact result in this case is zero; however due to small round-off errors very small non-zero values may be computed, triggering test failure. If this happens, you will need to compare the output with the reference output included with the test set. For example (assuming you have vimdiff installed): vimdiff n2-lowdin_prop_nosym.out n2-lowdin_prop_nosym.out_ref Finally, if you need to re-run some or all tests (e.g. after recompiling or modifying the code), you will need to remove all .out files from the test directory. Otherwise, the run-all.sh script will simply try to compare the existing outputs to the reference without re-running the calculations. 4. Input description This section describes the "V2" input for superdyson. There is also the legacy "V1" input, implemented as separate codes (superdyson.f90 and tr_1rdm.f90). Unless you know what and why you are doing, stay away from these two. Superdyson expects a Fortran NAMELIST "SD_V2" on the standard input. All secondary input is controlled from this namelist. All output is to the standard output. The following keywords can appear in the namelist. The default value is given after the equals sign. TASK = 'braket' Task to perform. Can be one of: 'braket' - Evaluate integrals of the form <bra|ket> and <bra|op|ket>. If the bra and ket wavefunctions have the same number of electrons, these become overlap and 1-electron property integrals. If the ket wavefunction has one electron less than the bra wavefunction, <bra|ket> is the Dyson orbital. In the <bra|op|ket> integral, the property operator is taken as a sum over all coordinates of the ket wavefunction. If op = 'dipole', <bra|op|ket> is the "craddle" orbital of [PRA 80, 063411 (2009)]. '1-rdm' - Calculates McWeeny's 1-particle reduced density matrix between the bra and the ket wavefunctions. The 1-rdm is represented by its singular value decomposition. When bra and ket coincide, the decomposition is identical to the natural orbitals and their occupation numbers. '1-srdm' - Similar to '1-rdm', but calculates spin-resolved density matrix, which is represented by four spin blocks (AA, AB, BA, and BB). The '1-rdm' result is equivalent to the sum of the "AA" and "BB" blocks of '1-srdm', but keep in mind that the singular vectors may well be different! BRAKET_OPERATOR = 'dipole' Definition of the operator for TASK='braket'. Can be one of: 'none' - No property matrix elements will be computed. Property evaluation can be expensive, especially if Lowdin rules must be used. 'kinetic' - Kinetic energy operator [0.5 * (d^2/dx^2 + d^2/dy^2 + d^2/dz^2)] 'dipole' - Coordinate expectation [(x,y,z)]. This is a 3-component vector. If the true dipole is needed, please do not forget to multiply by the electron charge! 'velocity' - Velocity operator [(d/dx,d/dy,d/dz)]. This is a 3-component vector. 'r-d/dr' - Mixed coordinate expectation - coordinate derivative operator. [r_i (d/d r_j)]. The i index runs fast. This is a 3x3 matrix. Angular momentum operator is the anti-covariant part of this operator. '1/r' - Coulomb nuclear attraction [|r-R|^-1]. The probe postion R must be specified as OP_CENTRE. 'r' - Linear attraction [|r-R|]. The probe position R must be specified as OP_CENTRE. 'r**2' - Harmonic attraction [|r-R|^2]. The probe position R must be specified as OP_CENTRE. 'gauss' - Gaussian attraction [Exp[-alpha*|r-R|^2]. The probe postion R as in OP_CENTRE. The Gaussian exponent is in OP_GAUSS. 'gauss r' - Gaussian-damped linear attraction [|r-R|*Exp[-alpha*|r-R|^2]. The probe postion and exponent are in OP_CENTRE and OP_GAUSS. Many other operators are available in the integral package, but are not currently accessible through the BRACKET_OPERATOR input. See import_gamess.f90 for the complete list of operators implemented. OP_CENTRE = 0.0, 0.0, 0.0 Operator position. See BRACKET_OPERATOR above. OP_GAUSS = 1.0 Operator exponent. See BRACKET_OPERATOR above. COMMENT = ' ' Arbitrary string. It will be included in the output, but is not otherwise used in any way. NMOBRA = 0 Number of single-particle orbitals (not electrons!) which appear in the bra wavefunction. In the GAMESS CI terms, this is the sum of the number of frozen, core, and active MOs. NMOKET = 0 Number of single-particle orbitals in the ket wavefunction. NDETBRA = 0 Number of determinants in the bra wavefunction. NDETKET = 0 Number of determinants in the ket wavefunction. EPS_CDET = 1e-5_rk Cut-off for the product of determinant amplitudes. The default cut-off is propably too loose for most quantitative calculations. DONT_CHECK_S2 = .false. Disable calculation of the norm and S^2 expectation values for the input wavefunctions. The algorithm we use for calculating <S^2> is rather naive (and therefore slow). For simple overlaps, <S^2> may dominate the overall calculation. If you are sure that all inputs are correct, this is a simple way of speeding up things a bit. FILE_CBRA = ' ' Name of the file containing molecular geometry, basis set, and MO coefficient specification. Superdyson accepts a subset of GAMESS-US punch files. Spefically: 1. The $DATA section must be in C1 symmetry. The basis set must be specified explicitly (list of the exponents/contractions, rather than names. 'L' shells are however not supported). 2. No $ECP section is allowed 3. Only one $VEC section may be present. At least NMOBRA orbitals must be present in the $VEC section. Section 5 below gives an example of how this file may be prepared. FILE_CKET = ' ' Name of the MO file for the ket wavefunction (see FILE_CBRA). Some or all of the geometry, basis set, and the MO coefficients can differ from those used for the bra wavefunction. However, if the single-particle orbitals of the ket coincide with the orbitals used by the bra, the more numerically efficient Slater rules will be used. FILE_DETBRA = ' ' Name of the file containing the determinant list. The file must contain at least NDETBRA determinants, with each determinant described by the amplitude (a real number), followed by NMOBRA integers. The integers give the occupation of the single-particle orbitals in this determinant (+1: alpha-spin electron; -1: beta-spin electron; 2: both alpha- and beta-spin electrons). All determinants must have the same number of electrons. The sign of the amplitude assumes the alpha/beta string ordering for the spin-orbitals in the determinant (all alpha-spin occupied spin-orbitals before all beta-spin occupied spin-orbitals). This is the same convention used internally in GAMESS. Section 5 below gives an example of how this file may be prepared. FILE_DETKET = ' ' Similar to FILE_DETBRA, but for the ket wavefunction. EPS_INTEGRAL = 1e-10 Tolerance used to locate non-zero blocks of the overlap and property matrices. Has no effect if USE_SYMMETRY=.false. USE_SYMMETRY = .true. When .true., superdyson will use block structure of the overlap and property matrices to speed up calculations. The effects can be quite dramatic, especially for calculations of the reduced density matric. I am not aware of any cases where USE_SYMMETRY=.T. slows the calculation down or produces an incorrect result, so there is no reason (other than debugging) to turn it off. DETAIL_TIMERS = .false. Produce a very detailed timing report from low-level routines. The overhead of DETAIL_TIMERS=.T. is severe. SIGN_BRA = 1.0 The bra wavefunction is multiplied by the factor SIGN_BRA (which does not have to be a unity). This is useful for producing globally-consistent property surfaces without modifying the actual wavefunctions. SIGN_KET = 1.0 As SIGN_BRA, but for the ket wavefunction. 5. Using GAMESS-US for preparing superdyson inputs. Several example input files, covering all major classes of calculations in superdyson, are available in the test subdirectory. Preparing these inputs with the modified version of GAMESS-US (see section 1 above) is simple, but requires several steps. Here, we will go through those steps using an example of a Dyson orbital calculation for a CO (X^1\Sigma^+) -> CO+ (X^2\Sigma^+) ionization. All GAMESS-US inputs and reference outputs are in the gamess-example/ subdirectory. The reference outputs and data files are in gamess-example/ref_out 5a. We begin with a closed-shell Hartree-Fock calculation for the neutral, to prepare starting orbitals for CASSCF calculations in the later steps. The input file is "co-rhf.inp". Some key input keywords here: ITOL=40 ICUT=20 <- Requests high-accuracy integrals. The defaults are not sufficiently accurate in the asymptotic region. EXTFIL=.TRUE. <- Requests that the basis should be read from an external file (specified by the EXTBAS environment variable; see gms-files.csh in the GAMESS-US installation directory). Even if you want to use one of the basis sets GAMESS knows about, you MUST nonetheless read it from an external file to make sure that superdyson can parse GAMESS output files. You can use http://bse.pnl.gov/ to generate the basis set files. GBASIS=APVDZ <- Refers to a basis set in the "basis" file. This is the aug-cc-pVDZ basis. It is likely too small for any production work, but it makes everything fast ... Feel free to look up the rest of the keywords in the GAMESS-US manual. In addition to the GAMESS-US output, we will also need the PUNCH (.dat) file. It is usually found in ~/scr/ directory. 5b. Next, we perform a CASSCF calculation for the CO(1+) cation. The input file is "cop-cas.inp". Again, some key parts of the input: GUESS=MOREAD <- Fetch guess MOS from the $VEC section. We have copied these orbitals from the .dat file produces by the RHF calculation in step 5a above. NORB=46 <- Number of the MOs. Taken from the RHF output file CISTEP=GMCCI <- We are using the GMCCI CI program, which allows us to average over multiple irreps (so that we can still benefit from the molecular symmetry in CASSCF). It is however perfectly fine to use any CI program in this step. KSTATE(1)=1,1,1,1,1,1,1 <- We are averaging our solutions over several state of the cation (X^2\Sigma^+, A^2\Pi, B^2\Sigma^+, D^2\Pi, and C^2\Sigma^+ in our case). Since we are only interested in the X state here, this is not really necessary. Again, in addition to the output we will need the punch (.dat) file from ~/scr/ 5c. Then, we perform a MR-CI calculation for the ground state of the CO(1+) cation. The input file is cop-cas-ci_a1.inp. Some key parts of the input: CITYP=ORMAS <- We will use ORMAS CI program. You must choose either ALDET, GENCI, or ORMAS here. It is likely that other CI programs in GAMESS may also work, our conversion script does not now how to handle the output. PURIFY=.FALSE. <- We need to disable parts of GAMESS which modify input MOs and may trigger a phase adjustment TOLE=0.0 <- ... and another possible orbital modification TOLZ=0.0 <- ... and another ... IPURFY=0 <- ... and another ... CUTTRF=1E-12 <- The default cut-off for direct integral transformation is too loose when diffuse orbitals are present. PRTTOL=-1 <- We need a complete determonant list, not just the bits with large amplitudes. $VEC <- Please note that we have replaced the $VEC section with the optimized CASSCF orbitals from step 5b above. In principle, one case use any other set of single-particle orbitals here, not necessarily the set coming from an MCSCF calculation. This will affect the accuracy of the results, but the proceduce for preparing superdyson inputs remains the same. Although we are using the ORMAS program here, the active space we specify is actually the same CAS used in the CASSCF step. Therefore, the state energies must match the CASSCF output (check!). As usual, we need both the output file and the .dat file from ~/scr/ Note that the main output (which now contains the complete determinant list) may be rather large. 5d. We can now prepare the .mos and .dets files for the superdyson ket wavefunction. For the .mos file: 5d1. Edit the $DATA section to switch to the C1 symmetry (see GAMESS manual for the $DATA section if you are not sure how). 5d2. Make sure that the $VEC section immediately following the $DATA section has a commend line "ALPHA MOS: Orbitals at the entry to CI calculation" 5d3. Delete everything after the $END matching the $VEC. 5d4. You should now have something looking like ref_out/cop-cas-ci_a1.mos 5d5. To construct the determinant list, you can use the command: ../det_conv.awk state=1 cop-cas-ci_a1.out > cop-cas-ci_a1.dets Parameter "state=1" requests the first state in the CI output. Please keep in mind that the determinant list may be rather large! 5e. Next, we need to calculate the wavefunction for the neutral state. The steps are the same as in 5b, 5c, and 5d above. The inputs are: con-cas.inp <- CASCF input con-cas-ci_a1.inp <- MR-CI input 5f. You now have everything you need to calculate the Dyson orbital. The example input file for superdyson is in "co_dyson.inp" 6. Simplified input In many cases, the full superdyson interface described above may be unneccessary (not to mention cumbersome and error-prone). A simplified interface is provided by the "overlap.sh" script. The calling sequence is: overlap.sh left_out left_state right_out right_state [task] [operator] {left,right}_out should specify GAMESS .dat file containing the orbitals and optionally the matching .out and/or .inp files {left,right}_state may be an integer state index, in which case GAMESS .out specofoed by {left,right}_out must exist. Alternatively, it may also give a determinant list in the internal superdyson format. Optional task and operator are as defined in superdyson; see above All files may be compressed with bzip2. The script is able to handle inputs in the c1, d2, cs, c2v, c2h, and d2h point groups, provided that the default setting is used. It will recognize ALDET, GENCI, and ORMAS wavefunctions. 7. Caveats There is very little error and consistency checking in superdyson. It basically assumes that you know what you are doing. If you don't, the results may be disastrously wrong! CIS wavefunctions are not currently supported.
About
Property evaluation for general CI expansions
Topics
Resources
License
Stars
Watchers
Forks
Packages 0
No packages published