====== Orbital merging ======
Orbitals can be manipulated using the ''MERGE'' facility. For instance, this allows the construction of molecular orbitals from atomic orbitals, to merge and orthogonalize different orbital sets, or to perform $2 \times 2$ rotations between individual orbitals. Other orbital manipulations can be performed using the ''LOCALI'' program (see section [[orbital localization]]) or the ''MATROP'' program (section [[matrix operations]]).
The merge program is called using
''MERGE'' [,//namout.file//]
All subcommands described in the following sections may be abbreviated by three characters. //namout.file// specifies the output data set (see also ''SAVE'' command). If //namout.file// is omitted and no ''SAVE'' card is present, the new orbitals are not saved. All output orbitals must be supplied via ''ORBITAL'' and ''ADD'', ''MOVE'', ''REPLACE'', ''EXTRA'', or ''%% PROJECT%%'' directives before they can be saved.
===== Defining the input orbitals (ORBITAL) =====
''ORBITAL'',//namin.file//,//specifications//
Reads an input orbital set from a dump record. //specifications// can be used to select specific orbital sets, as described in section [[general program structure#selecting orbitals and density matrices (ORBITAL, DENSITY)|selecting orbitals and density matrices (ORBITAL, DENSITY)]]. Subsets of these orbitals can be added to the output set by the ''ADD'', ''MOVE'', or ''EXTRA'' commands.
===== Moving orbitals to the output set (MOVE) =====
''MOVE'',//orb1.sym1,orb2.sym2,orb3.sym3,ioff,fac,istart,iend//
Moves orbitals //orb1.sym1// to //orb2.sym2// from the input set to the first vector of symmetry //sym3// in the output set which is undefined so far. The first //orb3-1// vectors in the output set are skipped regardless of whether they have been defined before or not. If //sym2 $>$ sym1//, //sym3// will run from //sym1// to //sym2// and the input for //sym3// has no effect. If //orb1.sym1// is negative, abs(//orb1//) is the maximum number of orbitals to be moved, starting with orbital //1.sym1//, up to //orb2.sym2//. If //orb2.sym2// is negative, abs(//orb2//) is the maximum number of vectors to be moved, starting at //orb1.isym1// up to the last orbital in symmetry //sym2//.
Orbitals from the input set which have already been moved or added to the output set are generally skipped. If //orb1// and //orb2// are zero, the whole input set is moved to the output set. In this case the input and output dimensions must be identical. If //orb1// is nonzero but //orb2// is zero, //orb2// is set to the last orbital in symmetry //sym2//. If //sym2=0//, //sym2// is set to //sym1//. //ioff// is an offset in the output vector, relative to the global offset set by ''OFFSET'' directive. //fac// has no effect for move. The elements //istart// to //iend// of the input vector are moved. If //istart=0// and //iend=0//, the whole input vector is moved.
The usage of the ''MOVE'' directive is most easily understood by looking at the examples given below. See also ''ADD'' and ''EXTRA'' commands.
===== Adding or replacing orbitals in the output set (ADD,REPLACE) =====
''ADD'',//orb1.sym1,orb2.sym2,orb3.sym3,ioff,fac,istart,iend//
This adds orbitals //orb1.sym1// to //orb2.sym2// to the output vectors, starting at //orb3.sym3//. The input vectors are scaled by the factor //fac//. If //fac=0//, //fac// is set to 1.0. For other details see ''MOVE'' command. Note, however, that the output vectors which have already been defined are not skipped as for ''MOVE''.
''REPLACE'',//orb1.sym1,orb2.sym2,orb3.sym3,ioff,,iustart,iend// Replaces orbitals in the outputs set. If the output orbitals already exists, they are set to zero and then replaced by the given input orbitals. Otherwise as ''ADD''.
See also ''MOVE'' and ''EXTRA'' commands.
===== Defining extra symmetries (EXTRA) =====
''EXTRA'',//exsym,orb1.sym1,orb2.sym2,orb3.sym3,ioff,fac,istart,iend//
Works exactly as ''MOVE'', but only input vectors with extra symmetry //exsym// are considered. If //orb1.sym1// and //orb2.sym2// are zero, all input vectors are moved to the output set ordered according to increasing extra symmetries.
Examples:
* **''%%EXTRA,1,-4.1%%''** will move the next 4 orbitals in symmetry 1 which have extra symmetry 1. Orbitals which have been moved before are skipped.
* **''%%EXTRA,2,1.1%%''** will move all orbitals of symmetry 1 which have extra symmetry 2. Orbitals which have been moved before are skipped.
* **''EXTRA''** will move all orbitals (all symmetries) and order them according to extra symmetries.
* **''%%EXTRA,3,1.1,0.8%%''** Will move all orbitals which have extra symmetry 3 in all symmetries. Orbitals which have been moved before are skipped.
See also ''ADD'' and ''MOVE'' commands.
===== Defining offsets in the output set (OFFSET) =====
''OFFSET'',//iof$_1$,iof$_2$,$\ldots$,iof$_8$//;
Sets offsets in the output vector for symmetries 1 to 8. In subsequent ''MOVE'' or ''ADD'' commands, the input vectors are moved to the locations //iof$_i$+1// in the output vectors. The offset for individual ''ADD'' or ''MOVE'' commands can be modified by the parameter //ioff// on these cards. This card should immediately follow the orbital directive to which it applies. Generally, this card is only needed if the dimensions of input and output vectors are not identical.
If the dimensions of the input orbital sets are smaller than the current basis dimension, the offsets are determined automatically in the following way: each time an orbital set is read in, the previous input orbital dimensions are added to the offsets. Hence, this works correctly if the orbital sets are given in the correct order and if the individual dimensions add up to the current total dimension. If this is not the case, the offsets should be specified on an ''OFFSET'' card which must follow the orbital directive.
===== Projecting orbitals (PROJECT) =====
''PROJECT'',//namin.file//
This command will read vectors from record //namin.file//. These vectors must have the same dimension as those of the current calculation. All orbitals defined so far by the ''ORBITAL'', ''MOVE'', and ''ADD'' directives are projected out of the input set. The projected orbitals are then orthonormalized and moved to the undefined output vectors. This should always yield a complete set of vectors.
===== Symmetric orthonormalization (ORTH) =====
''ORTH'',$n_1,n_2,\ldots,n_8$
Symmetrically orthonormalizes the first $n_i$ vectors in each symmetry $i$. These vectors must be supplied before by ''ORBITAL'' and ''MOVE'' or ''ADD'' directives.
===== Schmidt orthonormalization (SCHMIDT) =====
''SCHMIDT'',$n_1,n_2,\ldots,n_8$
Schmidt orthonormalizes the first $n_i$ vectors in each symmetry $i$. These vectors must be supplied before by ''ORBITAL'' and ''MOVE'' or ''ADD'' directives.
===== Rotating orbitals (ROTATE) =====
''ROTATE'',//iorb1.sym,iorb2,angle//
Will perform $2 \times 2$ rotation of orbitals //iorb1// and //iorb2// in symmetry //sym// by the specified //angle// (in degree). //angle=0// means to swap the orbitals (equivalent to //angle=90//) These vectors must be supplied before by ''ORBITAL'' and ''MOVE'' or ''ADD'' directives.
===== Initialization of a new output set (INIT) =====
''INIT'',//namout.file//
Will initialize a new output set. All previous vectors in the output set are lost unless they have been saved by a ''SAVE'' directive!
===== Saving the merged orbitals =====
''SAVE'',//namout.file//
Saves the current output set to record //namout.file//. The current output set must be complete and will be Schmidt orthonormalized before it is saved. If the ''SAVE'' directive is not supplied, the output vectors will be saved after all valid commands have been processed to the record specified on the ''MERGE'' card.
===== Printing options (PRINT) =====
''PRINT'',//iprint,ideb//
Specifies print options.
* **$iprint = 0$** no print
* **$iprint \ge 1$:** orthonormalized orbitals specified on ''ORTH'' card are printed.
* **$iprint \ge 2$:** orbitals are also printed before this orthonormalization.
* **$iprint \ge 3$:** all final vectors are printed.
* **$ideb \ne 0$:** the overlap matrices are printed at various stages.
===== Examples =====
==== H2F ====
This example merges the orbitals of H$_2$ and F
***,example for merge
print,orbitals,basis
rh2=1.4
rhf=300.
basis=vdz
symmetry,x,y !use C2v symmetry
geometry={F}
text,F
{rhf;wf,9,1,1;occ,3,1,1;orbital,2130.2} !rhf for f-atom
text,H2
symmetry,x,y !use C2v symmetry
geometry={
H1,
H2,H1,rh2}
{hf;orbital,2100.2} !scf for h2
{multi;occ,2;orbital,2101.2} !mcscf for h2
text,FH2
geometry={F; !linear geometry for F+H2
H1,F,rhf
H2,H1,rh2,F,180}
int
{merge
orbital,2130.2 !rhf orbitals for F-atom
move,1.1,2.1,1.1 !move orbitals 1.1, 2.1
move,3.1,0.4,4.1; !move all remaining, starting at 4.1
orbital,2100.2 !hf orbitals for H2
move,1.1,0.4 !move these to free positions
save,2131.2} !save merged orbitals
{rhf;occ,4,1,1;start,2131.2 !rhf for F+H2
orbital,2132.2}
{merge
orbital,2130.2 !rhf orbitals for F-atom
move,1.1,2.1,1.1 !move orbitals 1.1, 2.1
move,3.1,3.1,4.1; !move orbital 3.1 to 4.1
move,4.1,0.4,6.1 !move all remaining, starting at 6.1
orbital,2101.2 !mcscf orbitals for H2
move,1.1,0.4 !move these to free positions
save,2141.2} !save merged orbitals
{multi;occ,5,1,1;start,2141.2} !casscf for F+H2 using valence space
==== NO ====
This example merges the SCF orbitals of N and O to get a full valence space for NO. In the simplest case the atomic calculations are performed in the individual separate basis sets, but using the same symmetry (C$_{2v}$) as the molecular calculation.
***,NO merge
r=2.1
symmetry,x,y
geometry={n} !N-atom, c2v symmetry
{rhf;occ,3,1,1; !rhf nitrogen
wf,7,4,3; !4S state
orbital,2110.2} !save orbitals to record 2110 on file 2
symmetry,x,y
geometry={o}
{rhf;occ,3,1,1; !rhf for oxygen
wf,8,4,2 !3P state
orbital,2120.2} !save orbitals to record 2120 on file 2
geometry={n;o,n,r} ! NO molecule, c2v symmetry
int
{MERGE
ORBITAL,2110.2 ! read orbitals of N atom
MOVE,1.1,1.1 ! move 1s orbital to output vector 1.1
MOVE,2.1,2.1,3.1 ! move 2s orbital to output vector 3.1
MOVE,3.1,3.1,5.1 ! move 2pz orbital to output vector 5.1
MOVE,1.2,1.2 ! move 2px orbital to output vector 1.2
MOVE,1.3,1.3 ! move 2py orbital to output vector 1.3
MOVE,4.1,,7.1 ! move virtual orbitals of symmetry 1
MOVE,2.2,,3.2 ! move virtual orbitals of symmetry 2
MOVE,2.3,,3.3 ! move virtual orbitals of symmetry 2
MOVE,1.4 ! move virtual orbitals of symmetry 2
ORBITAL,2120.2 ! read orbitals of O atom
MOVE,1.1,0.4 ! move all oxygen orbitals into place
ROT,3.1,4.1,45; ! rotate 2s orbitals to make bonding and antibonding
! linear combinations
ROT,5.1,6.1,-45; ! rotate 2pz orbitals to make bonding and antibonding
! linear combinations
PRINT,1 ! set print option
ORTH,6,2,2 ! symmetrically orthonormalize the valence orbitals
! the resulting orbitals are printed
save,2150.2} ! save merged orbitals to record 2150.2
{multi;occ,6,2,2 ! perform full valence casscf for NO
wf,15,2,1 ! 2Pix state
wf,15,3,1 ! 2Piy state
start,2150.2} ! start with merged orbitals
One can also do the atomic calculations in the total basis set, using dummy cards. In this case the procedure is more complicated, since the union of the two orbital spaces is over-complete. The calculation can be done as follows:
a) SCF for the total molecule, orbitals saved to 2100.2
b) SCF for the N atom with dummy basis on the O atom, orbitals saved on 2110.2
c) SCF for the O atom with dummy basis on the N atom, orbitals saved on 2120.2
d) Merge the atomic SCF orbitals. Finally, obtain the virtual orbitals by projecting the merge orbitals out of the SCF orbitals for NO.
***,NO merge
geometry={n;o,n,r}
r=2.1
{rhf;occ,5,2,1 !rhf for NO
wf,15,2,1 !2Pi state
orbital,2100.2} !save orbitals to record 2100 on file 2
dummy,o !oxygen is dummy
{rhf;occ,3,1,1; !rhf nitrogen
wf,7,4,3; !4S state
orbital,2110.2} !save orbitals to record 2110 on file 2
dummy,n !nitrogen is dummy
{rhf;occ,3,1,1; !rhf for oxygen
wf,8,4,2 !3P state
orbital,2120.2} !save orbitals to record 2120 on file 2
dummy ! remove dummies
{MERGE !call merge program
ORBITAL,2110.2 ! read orbitals of N atom
MOVE,1.1,1.1 ! move input vector 1.1 to output vector 1.1
MOVE,2.1,3.1,3.1 ! move input vectors 2.1,3.1 to output vectors
! 3.1 and 4.1
MOVE,1.2,1.2 ! move input vector 1.2 to output vector 1.2
MOVE,1.3,1.3 ! move input vector 1.3 to output vector 1.3
ORBITAL,2120.2 ! read orbitals of O atom
MOVE,1.1,3.1 ! move input vectors 1.1 to 3.1 to output vectors
! 2.1, 5.1, 6.1
MOVE,1.2,1.2 ! move input vector 1.2 to output vector 2.2
MOVE,1.3,1.3 ! move input vector 1.3 to output vector 2.3
ROT,3.1,5.1,45; ! rotate 2s orbitals to make bonding and antibonding
! linear combinations
ROT,4.1,6.1,-45; ! rotate 2pz orbitals to make bonding and antibonding
! linear combinations
PRINT,1 ! set print option
ORTH,6,2,2 ! symmetrically orthonormalize the valence orbitals
! the resulting orbitals are printed
PROJ,2100.2 ! Project valence orbitals out of scf orbitals of the
! molecule and add virtual orbital set.
SAVE,2150.2 ! save merged orbitals to record 2150 on file 2
}
{multi;occ,6,2,2 ! perform full valence casscf for NO
wf,15,2,1 ! 2Pi state
wf,15,3,1 ! 2Pi state
start,2150.2} ! start with merged orbitals