MPQC(1)
π MPQC β the Massively Parallel Quantum Chemistry program π
okay bestie, sit DOWN, because we're about to talk about mpqc, aka the Massively Parallel Quantum Chemistry program, and she is that girl. this is the General Commands Manual entry, section 1, and yes we're doing the whole thing. grab a boba. π§
β¨ NAME β¨
mpqc β The Massively Parallel Quantum Chemistry program (MPQC) π¦
β¨ SYNOPSIS β¨
mpqc [options] [filename]
β¨ DESCRIPTION β¨
so like, MPQC computes the properties of molecules, ab initio, on a wide variety of computer architectures. like, she gets around. no cap. π
she can compute closed shell and general restricted openshell HartreeFock energies and gradients, second order openshell perturbation theory (OPT2[2]) and Zaveraged perturbation theory (ZAPT2) energies, and second order closed shell MoellerPlesset perturbation theory energies and gradients. and she also includes methods for optimizing molecules in either Cartesian or internal coordinates. literally so versatile.
MPQC is designed using objectoriented programming techniques and implemented in the C++ programming language. she's giving very much structured, very much class hierarchy, very much slay. π
β¨ OPTIONS β¨
MPQC can be given options followed by an optional input file name. if you don't give her an input file name, it just defaults to 'mpqc.in' like "fine, i'll pick for us." π
these are the command line options she recognizes:
-oβ gives the name of the output file. the default is the console. (yes she will just scream into the terminal, and honestly? iconic.)-iβ converts a simple input file to an object oriented input file and writes the result to the output. no calculations are done β it's a glow-up, not a science experiment. β¨-messagegrpβ a ParsedKeyVal specification of aMessageGrpobject. the default depends on how MPQC was compiled. (iykyk.)-memorygrpβ a ParsedKeyVal specification of aMemoryGrpobject. the default depends on how MPQC was compiled.-threadgrpβ a ParsedKeyVal specification of aThreadGrpobject. the default depends on how MPQC was compiled.-lβ sets a limit on the number of basis functions. the default is zero, which means an unlimited number of basis functions. go off, honestly.-Wβ sets the working directory. the default is the current directory.-cβ check the input and exit. just a little vibe check. π-vβ print the version number. π-wβ print the warranty information. and bestieβ¦ there is no warranty. π-dβ if a debugger object was given in the input, start the debugger running as soon as MPQC is started. straight into it. no hesitation. π-hβ print a list of options. your little menu, your little helper. π«Ά-fβ the name of an object-oriented input file. the default ismpqc.in. this cannot be used if another input file is specified.
β οΈ heads up: this option is deprecated, because both input file formats can be read by giving the input file name on the command line without any option flags. so likeβ¦ just do that. periodt.
also, real talk: some MPI environments do not pass the command line to slave programs, but supply it when MPI_Init is called. to make MPQC call MPI_Init on start-up, instead of when an MPIMessageGrp is created, name the executable mpqc-mpi. cute little trick, very main character. π
β¨ ENVIRONMENTAL VARIABLES β¨
MPQC looks at four environmental variables to set up communication and find library files. machine specific libraries and utilities to run programs in parallel might look at other environment variables as well. but the four that apply on all platforms are:
SCLIBDIRβ the name of the library directory.MESSAGEGRPβ a ParsedKeyVal specification of aMessageGrpobject. the default depends on how MPQC was compiled. see theMessageGrpclass documentation for more information.MEMORYGRPβ a ParsedKeyVal specification of aMemoryGrpobject. the default depends on how MPQC was compiled and theMessageGrpin use.THREADGRPβ a ParsedKeyVal specification of aThreadGrpobject. the default depends on how MPQC was compiled.
by default, MPQC tries to find library files first in the lib sub-directory of the installation directory and then the source code directory. if the library files cannot be found, MPQC must be notified of the new location with the environmental variable SCLIBDIR. ποΈ
the other three keywords specify objects. this is done by giving a mini ParsedKeyVal input in a string. the object is anonymous, that is, no keyword is associated with it. here's an example, bestie:
setenv MESSAGEGRP '<ShmMessageGrp>:(n = 4)'
β¨ SHARED MEMORY MULTIPROCESSOR WITH SYSV IPC β¨
by default, MPQC will run on only one CPU. to specify more, you can give a ShmMessageGrp object on the command line. the following would run mpqc in four processes:
mpqc -messagegrp '<ShmMessageGrp>:(n = 4)' input_file
alternately, the ShmMessageGrp object can be given as an environmental variable:
setenv MESSAGEGRP '<ShmMessageGrp>:(n = 4)'
mpqc input_file
π DANGER ZONE: if MPQC should unexpectedly die, shared memory segments and semaphores will be left on the machine. these should be promptly cleaned up or other jobs may be prevented from running successfully. like, she leaves her stuff everywhere and the next girl can't get ready. rude.
to see if you have any of these resources allocated, use the ipcs command. the output will look something like:
IPC status from /dev/kmem as of Wed Mar 13 14:42:18 1996
T ID KEY MODE OWNER GROUP
Message Queues:
Shared Memory:
m 288800 0x00000000 --rw------- cljanss user
Semaphores:
s 390 0x00000000 --ra------- cljanss user
s 391 0x00000000 --ra------- cljanss user
to remove the IPC resources used by cljanss in the above example on IRIX, type:
ipcrm -m 288800
ipcrm -s 390
ipcrm -s 391
and on Linux, type:
ipcrm shm 288800
ipcrm sem 390
ipcrm sem 391
(notice the syntax is different on the two, bestie β that's not a typo, that's just how it is. π« )
β¨ SHARED MEMORY MULTIPROCESSOR WITH POSIX THREADS β¨
by default, MPQC will run with only one thread. to specify more, you can give a PthreadThreadGrp object on the command line.
real talk: MPQC is not parallelized to as large an extent with threads as it is with the more conventional distributed memory model, so you might not get the best performance using this technique. on the other hand, the memory overhead is lower and no interprocess communication is needed. trade-offs, bestie, trade-offs. βοΈ
the following would run MPQC in four threads:
mpqc -threadgrp '<PthreadThreadGrp>:(num_threads = 4)' input_file
alternately, the PthreadThreadGrp object can be given as an environmental variable:
setenv THREADGRP '<PthreadThreadGrp>:(n = 4)'
mpqc input_file
β¨ SHARED OR DISTRIBUTED MEMORY MULTIPROCESSOR WITH MPI β¨
a MPIMessageGrp object is used to run using MPI. the number of nodes used is determined by the MPI run-time and is not specified as input data to MPIMessageGrp. so don't even try to hand her that number, she doesn't want it. π
ββοΈ
mpqc -messagegrp '<MPIMessageGrp>:()' input_file
alternately, the MPIMessageGrp object can be given as an environmental variable:
setenv MESSAGEGRP '<MPIMessageGrp>:()'
mpqc input_file
usually, a special command is needed to start MPI jobs; typically it is named mpirun. π
β¨ INPUT β¨
MPQC supports two input formats.
- the primary input is an object oriented format which gives users access to all of MPQCs options. the full menu. the deluxe. π
- the second format allows access to a subset of MPQCs capabilities, but is more intuitive and easier to learn. honestly? a great starter pack.
new users are advised to start with the simplified format. π and here's the slay part β MPQC can be used to convert the simplified format to the full object-oriented format with the -i option. glow-up unlocked. β¨
β¨ Simple Input β¨
Okay bestie, so the simple input format is literally just keywords followed by a : and then a value. The keywords are case sensitive β no cap. And the values might get modified by options that live in parentheses. For example, this iconic input does an optimization of water using density functional theory with the B3LYP exchange-correlation functional:
% B3LYP optimization of water
optimize: yes
method: KS (xc = B3LYP)
basis: 3-21G*
molecule:
O 0.172 0.000 0.000
H 0.745 0.000 0.754
H 0.745 0.000 -0.754
Comments start with a % and go all the way to the end of the line. Basis set names containing special characters, such as a space or parentheses, must be quoted inside a pair of double quotes. The accepted keywords are:
moleculeβ gives the atom types and coordinates. The following options can be used:bohrβ the coordinates are given in Bohr.angstromβ the coordinates are given in Angstroms.chargeβ this option can be given after anelement x y zquadruple. This will override the charge on the atom. For example,(charge = 0)can be given for the ghost atoms in a counterpoise correction calculation.multiplicityβ gives the multiplicity of the molecule. The default is1.
optimizeβ ifyes, then an optimization will be performed. The default isno. The following options can be given:cartesianβ use Cartesian coordinates.internalβ use internal coordinates.redundantβ use redundant internal coordinates.
gradientβ ifyes, then a gradient calculation will be performed. The default isno.frequenciesβ ifyes, then the frequencies will be obtained. The default isno.chargeβ specifies the charge on the molecule. The default is0.methodβ specifies the method. There is no default and the possible values are:HFβ Hartree-Fock. Unrestricted HF is used if multiplicity > 1.RHFβ Restricted Hartree-Fock.UHFβ Unrestricted Hartree-Fock.KSβ Kohn-Sham. Unrestricted KS is used if multiplicity > 1.RKSβ Restricted Kohn-Sham.UKSβ Unrestricted Kohn-Sham.MP2β Second order Moeller-Plesset perturbation theory. Only available for multiplicity = 1.ZAPT2β Z-averaged perturbation theory. Only available for multiplicity > 1. No gradient, optimization, or frequencies are possible.
- The following options are valid with the
KS,RKS, andUKSmethods:gridβ specifies the grid to be used for numerical integrations. The following values can be given:xcoarsecoarsemediumfinexfineultrafine
xcβ specifies the exchange-correlation functional. There is no default. See the table in theStdDenFunctionalclass documentation for the possible values.basisβ specifies the basis set. There is no default. See the table in theGaussianBasisSetclass documentation for the available basis sets.
restartβ set toyesto restart an optimization. The default isno.checkpointβ set tonoto not save checkpoint files during an optimization. The default isyes.symmetryβ specifies the Schoenflies symbol of the point group of the molecule. The default isauto, which will cause the program to find the highest order Abelian subgroup of the molecule.doccβ gives the number of doubly occupied orbitals in each irreducible representation in a parenthesized list. The symmetry must be specified and not beauto. The method must be restricted.soccβ gives the number of single occupied orbitals in each irreducible representation in a parenthesized list. The symmetry must be specified and not beauto. The method must be restricted.alphaβ gives the number of alpha occupied orbitals in each irreducible representation in a parenthesized list. The symmetry must be specified and not beauto. The method must be unrestricted.betaβ gives the number of beta occupied orbitals in each irreducible representation in a parenthesized list. The symmetry must be specified and not beauto. The method must be unrestricted.frozen_doccβ gives the number of frozen core orbitals. Can be either a single integer or a parenthesized list giving the frozen core orbitals in each irreducible representation. In the latter case the symmetry must be given and not beauto.frozen_uoccβ gives the number of frozen virtual orbitals. Can be either a single integer or a parenthesized list giving the frozen virtual orbitals in each irreducible representation. In the latter case the symmetry must be given and not beauto.
π¦ Object-Oriented Input π¦
MPQC is an object-oriented program that directly allows the user to specify objects that MPQC then manipulates to obtain energies, properties, etc. This makes the input very flexible, but very complex. However, most calculations should be quite similar to the one of the examples given later in this chapter. The best way to get started is to use one of the example input files and modify it to meet your needs.
MPQC starts off by creating a ParsedKeyVal object that parses the input file specified on the command line. The format of the input file is documented in . It is basically a free format input that associates keywords and logical groupings of keywords with values. The values can be scalars, arrays, or objects.
The keywords recognized by MPQC begin with the mpqc prefix. That is, they must be nested between an mpqc:( and a ). Alternately, each keyword can be individually prefixed by mpqc:. The primary keywords are given below. Some of the keywords specify objects, in which case the object will require more ParsedKeyVal input. These objects are created from the input by using their ParsedKeyVal constructors. These constructors are documented with the source code documentation for the class.
moleβ This is the most important keyword for MPQC. It specifies theMolecularEnergyobject. This is an object that knows how to compute the energy of a molecule. The specializations ofMolecularEnergythat are most commonly used areCLKS,HSOSKS,UKS,CLHF,HSOSHF,UHF, andMBPT2.optβ This keyword must be specified for optimizations. It specifies anOptimizeobject. Usually,QNewtonOptis best for finding minima andEFCOptis best for transition states.freqβ This keyword must be specified to compute frequencies. It specifies aMolecularFrequenciesobject.threadβ This specifies an object of typeThreadGrpthat can be used to advantage on shared-memory multiprocessor machines for certain types of calculations. This keyword can be overridden by giving theThreadGrpin the environment or command line. See the section on running MPQC for more information.checkpointβ The value of this keyword is Boolean. If true, then optimizations will be checkpointed after each iteration. The checkpoint file suffix is.ckpt. The default is to checkpoint.savestateβ The value of this keyword is Boolean. If true, then the states of the optimizer and wavefunction objects will be saved after the calculation completes. The output file suffix is.wfn. The default is to save state.restartβ The value of this keyword is Boolean. If true,mpqcwill attempt to restart the calculation. If the checkpoint file is not found, the calculation will continue as if the value were false. The default is true.restart_fileβ This gives the name of a file from which restart information is read. If the file name ends in.wfntheMolecularEnergyobject will be restored. Otherwise, theOptimizeobject will be restored. The default file name is formed by appending.ckptto the input file name with the extension removed.do_energyβ The value of this keyword is Boolean. If true a single point energy calculation will be done for theMolecularEnergyobject given with themolekeyword. The default is true.do_gradientβ The value of this keyword is Boolean. If true a single point gradient calculation will be done for theMolecularEnergyobject given with themolekeyword. The default is false.optimizeβ The value of this keyword is Boolean. If true and theoptkeyword was set to a valid value, then an optimization will be performed. The default is true.write_pdbβ The value of this keyword is Boolean. If true a PDB file with the molecular coordinates will be written.filenameβ The value of this keyword is a string that gives a name from which checkpoint and other filenames are constructed. The default is the basename of the input file.print_timingsβ If this is true, timing information is printed at the end of the run. The default is true.
There are also some utility keywords that tell mpqc some technical details about how to do the calculation:
debugβ This optional keyword gives aDebuggerobject which can be used to help find the problem if MPQC encounters a catastrophic error.matrixkitβ This optional keyword gives aSCMatrixKitspecialization which is used to produce matrices of the desired type. The default is aReplSCMatrixKitwhich replicates matrices on all of the nodes. Other choices are not thoroughly tested.
β¨ EXAMPLES β¨
Okay bestie, real talk β this is the part where it all comes together π«Ά. Let's do a Hartree-Fock calculation on water, and I'm gonna walk you through every single line because you deserve to actually get it, not just copy-paste and pray π. First, the whole input, then the breakdown with descriptions, mwah π.
% This input does a Hartree-Fock calculation on water.
molecule<Molecule>: (
symmetry = C2V
unit = angstrom
{ atoms geometry } = {
O [ 0.00000000 0.00000000 0.37000000 ]
H [ 0.78000000 0.00000000 -0.18000000 ]
H [ -0.78000000 0.00000000 -0.18000000 ]
}
)
basis<GaussianBasisSet>: (
name = 'STO-3G'
molecule = $:molecule
)
mpqc: (
mole<CLHF>: (
molecule = $:molecule
basis = $:basis
)
)
We start with a descriptive comment. Comments begin with a %. Everything from the % to the end of the line is ignored. Literally, the computer does not care. It's just for us π
.
% This input does a Hartree-Fock calculation on water.
Now lets set up a Molecule object. The name of the object comes first β it is molecule. Then, in angle brackets, comes the type of the molecule, which is the class Molecule. The keyword and class name are followed by a : and then several pieces of input grouped between a pair of matching parentheses. These parentheses contain the information that will be given to Molecule KeyVal constructor. So it's like, "hey bestie, here's everything you need to know about me" π.
molecule<Molecule>: (
The point group of the molecule is needed. This is done by assigning symmetry to a case insensitive Schoenflies symbol that is used to initialize a PointGroup object. An Abelian point group should be used. Noted π.
symmetry = C2V
The default unit for the Cartesian coordinates is Bohr. You can specify other units by assigned unit to a string that will be used to initialize a Units object. Iconic of us to give options β¨.
unit = angstrom
Finally, the atoms and coordinates are given. This can be given in the shorthand table syntax shown below. The headings of the table are the keywords between the first pair of brackets. These are followed by an = and another pair of brackets that contain the data. The first datum is assigned to the first element of the array that corresponds to the first heading, atom. The second datum is assigned to the first element of the array associated with the second heading, geometry, and so on. Here the second datum is actually a vector: the x, y and z coordinates of the first atom. Okay this part is giving spreadsheet energy but make it quantum π§.
{ atoms geometry } = {
O [ 0.00000000 0.00000000 0.37000000 ]
H [ 0.78000000 0.00000000 -0.18000000 ]
H [ -0.78000000 0.00000000 -0.18000000 ]
}
)
Next, a basis set object is given.
basis<GaussianBasisSet>: (
name = 'STO-3G'
molecule = $:molecule
)
Now we will give the main body of input. All the subsequent keywords will be grouped in the mpqc section of the input (that is, each keyword will be prefixed with mpqc:). Lowkey the mpqc: block is the main character of this whole file π.
mpqc: (
Next we give the mole keyword which provides a specialization of the MolecularEnergy class. In this case we will do a closed-shell Hartree-Fock calculation. That is done with an object of type CLHF. The keywords that CLHF accepts are given with the documentation for the CLHF class, usually in the description of the const RefKeyVal& constructor for the class. Also with the CLHF documentation is a list of parent classes. Each of the parent classes may also have input. This input is included with the rest of the input for the child class. It's giving inheritance, and honestly, obsessed π.
mole<CLHF>: (
The next line specifies the molecule to be used. There are two things to note, first that this is actually a reference to complete molecule specification elsewhere in the input file. The $ indicates that this is a reference and the keyword following the $ is the actual location of the molecule. The : in front of the keyword means that the keyword is not relative to the current location in the input, but rather relative to the root of the tree of keywords. Thus, this line grabs the molecule that was specified above. The molecule object could have been placed here, but frequently it is necessary that several objects refer to the exact same object and this can only be done using references. It's like tagging someone in a group chat instead of retyping their whole bio π«Ά.
The second point is that if you look at the documentation for CLHF, you will see that it doesn't read molecule keyword. However, if you follow its parent classes up to MolecularEnergy, you'll find that molecule is indeed read. No cap β always check the parents π.
molecule = $:molecule
Just as we gave molecule, specify the basis set with the basis keyword as follows:
basis = $:basis
Now we close off the parentheses we opened above and we are finished. Periodt π .
)
)
πΈ Sample Object-Oriented Input Files πΈ
The easiest way to get started with mpqc is to start with one of sample inputs that most nearly matches your problem. All of the samples inputs shown here can be found in the directory src/bin/mpqc/samples. Go forth and steal shamelessly, bestie π.
π Hartree-Fock Energy π
The following input will compute the Hartree-Fock energy of water.
% emacs should use -*- KeyVal -*- mode
% molecule specification
molecule<Molecule>: (
symmetry = C2V
unit = angstrom
{ atoms geometry } = {
O [ 0.00000000 0.00000000 0.37000000 ]
H [ 0.78000000 0.00000000 -0.18000000 ]
H [ -0.78000000 0.00000000 -0.18000000 ]
}
)
% basis set specification
basis<GaussianBasisSet>: (
name = 'STO-3G'
molecule = $:molecule
)
mpqc: (
checkpoint = no
savestate = no
% method for computing the molecule's energy
mole<CLHF>: (
molecule = $:molecule
basis = $:basis
memory = 16000000
)
)
π MP2 Energy π
The following input will compute the MP2 energy of water.
% emacs should use -*- KeyVal -*- mode
% molecule specification
molecule<Molecule>: (
symmetry = C2V
unit = angstrom
{ atoms geometry } = {
O [ 0.00000000 0.00000000 0.37000000 ]
H [ 0.78000000 0.00000000 -0.18000000 ]
H [ -0.78000000 0.00000000 -0.18000000 ]
}
)
% basis set specification
basis<GaussianBasisSet>: (
name = 'STO-3G'
molecule = $:molecule
)
mpqc: (
checkpoint = no
savestate = no
% method for computing the molecule's energy
mole<MBPT2>: (
molecule = $:molecule
basis = $:basis
memory = 16000000
% reference wavefunction
reference<CLHF>: (
molecule = $:molecule
basis = $:basis
memory = 16000000
)
)
)
π¦ Hartree-Fock Optimization π¦
The following input will optimize the geometry of water using the quasi-Newton method.
% emacs should use -*- KeyVal -*- mode
% molecule specification
molecule<Molecule>: (
symmetry = C2V
unit = angstrom
{ atoms geometry } = {
O [ 0.00000000 0.00000000 0.37000000 ]
H [ 0.78000000 0.00000000 -0.18000000 ]
H [ -0.78000000 0.00000000 -0.18000000 ]
}
)
% basis set specification
basis<GaussianBasisSet>: (
name = '6-31G*'
molecule = $:molecule
)
mpqc: (
checkpoint = no
savestate = no
% molecular coordinates for optimization
coor<SymmMolecularCoor>: (
molecule = $:molecule
generator<IntCoorGen>: (
molecule = $:molecule
)
)
% method for computing the molecule's energy
mole<CLHF>: (
molecule = $:molecule
basis = $:basis
coor = $..:coor
memory = 16000000
)
% optimizer object for the molecular geometry
opt<QNewtonOpt>: (
function = $..:mole
update<BFGSUpdate>: ()
convergence<MolEnergyConvergence>: (
cartesian = yes
energy = $..:..:mole
)
)
)
β¨ Optimization with a Computed Guess Hessian β¨
The following input will optimize the geometry of water using the quasi-Newton method. The guess Hessian will be computed at a lower level of theory. It's giving "do the cheap version first, then glow up" π .
% emacs should use -*- KeyVal -*- mode
% molecule specification
molecule<Molecule>: (
symmetry = C2V
unit = angstrom
{ atoms geometry } = {
O [ 0.00000000 0.00000000 0.37000000 ]
H [ 0.78000000 0.00000000 -0.18000000 ]
H [ -0.78000000 0.00000000 -0.18000000 ]
}
)
% basis set specification
basis<GaussianBasisSet>: (
name = '6-31G*'
molecule = $:molecule
)
mpqc: (
checkpoint = no
savestate = no
% molecular coordinates for optimization
coor<SymmMolecularCoor>: (
molecule = $:molecule
generator<IntCoorGen>: (
molecule = $:molecule
)
)
% method for computing the molecule's energy
mole<CLHF>: (
molecule = $:molecule
basis = $:basis
coor = $..:coor
memory = 16000000
guess_hessian<FinDispMolecularHessian>: (
molecule = $:molecule
only_totally_symmetric = yes
eliminate_cubic_terms = no
checkpoint = no
energy<CLHF>: (
molecule = $:molecule
memory = 16000000
basis<GaussianBasisSet>: (
name = '3-21G'
molecule = $:molecule
)
)
)
)
% optimizer object for the molecular geometry
opt<QNewtonOpt>: (
function = $..:mole
update<BFGSUpdate>: ()
convergence<MolEnergyConvergence>: (
cartesian = yes
energy = $..:..:mole
)
)
)
π₯ Optimization Using Newton's Method π₯
The following input will optimize the geometry of water using the Newton's method. The Hessian will be computed at each step in the optimization. However, Hessian recomputation is usually not worth the cost; try using the computed Hessian as a guess Hessian for a quasi-Newton method before resorting to a Newton optimization.
Okay so this is the "expensive but thorough" option β the manpage itself is telling you it's usually not worth the cost, so listen to it before you tank your runtime bestie π.
okay so we're mid-flow through the example files, no big deal, just sliding right in like we never left π
% Emacs should use -*- KeyVal -*- mode
% molecule specification
molecule<Molecule>: (
symmetry = c2v
unit = angstrom
{ atoms geometry } = {
O [ 0.00000000 0.00000000 0.36937294 ]
H [ 0.78397590 0.00000000 -0.18468647 ]
H [ -0.78397590 0.00000000 -0.18468647 ]
}
)
% basis set specification
basis<GaussianBasisSet>: (
name = '3-21G'
molecule = $:molecule
)
mpqc: (
checkpoint = no
savestate = no
restart = no
% molecular coordinates for optimization
coor<SymmMolecularCoor>: (
molecule = $:molecule
generator<IntCoorGen>: (
molecule = $:molecule
)
)
do_energy = no
do_gradient = no
% method for computing the molecule's energy
mole<CLHF>: (
molecule = $:molecule
basis = $:basis
memory = 16000000
coor = $..:coor
guess_wavefunction<CLHF>: (
molecule = $:molecule
total_charge = 0
basis<GaussianBasisSet>: (
molecule = $:molecule
name = 'STO-3G'
)
memory = 16000000
)
hessian<FinDispMolecularHessian>: (
only_totally_symmetric = yes
eliminate_cubic_terms = no
checkpoint = no
)
)
optimize = yes
% optimizer object for the molecular geometry
opt<NewtonOpt>: (
print_hessian = yes
max_iterations = 20
function = $..:mole
convergence<MolEnergyConvergence>: (
cartesian = yes
energy = $..:..:mole
)
)
)
π¦ Hartree-Fock Frequencies π¦
okay so this next input file? it computes Hartree-Fock frequencies via finite displacements. bestie it also runs a thermodynamic analysis for you, because why not β¨ And here's the tea: if you also hand it optimization input, it'll run the optimization first, and then do the frequencies. Order matters, no cap.
% emacs should use -*- KeyVal -*- mode
% molecule specification
molecule<Molecule>: (
symmetry = C1
{ atoms geometry } = {
O [ 0.0000000000 0.0000000000 0.8072934188 ]
H [ 1.4325589285 0.0000000000 -0.3941980761 ]
H [ -1.4325589285 0.0000000000 -0.3941980761 ]
}
)
% basis set specification
basis<GaussianBasisSet>: (
name = 'STO-3G'
molecule = $:molecule
)
mpqc: (
checkpoint = no
savestate = no
% method for computing the molecule's energy
mole<CLHF>: (
molecule = $:molecule
basis = $:basis
memory = 16000000
)
% vibrational frequency input
freq<MolecularFrequencies>: (
molecule = $:molecule
)
)
π Giving Coordinates and a Guess Hessian π
so this example is literally serving several features that are really independent all at once. iconic. let's break it down:
- the variable coordinates are explicitly given instead of being generated automatically for you. that's highkey useful when you're handing over a guess Hessian, which is exactly what's happening here π
- that Hessian, as given by the user, is not complete β and
QNewtonOptwill fill in the missing values using a guess the Hessian provided by theMolecularEnergyobject. so don't stress about blanks, she's got it π«Ά - also, fixed coordinates are given in this sample input. yes bestie, both at once. multitasking queen.
% emacs should use -*- KeyVal -*- mode
% molecule specification
molecule<Molecule>: (
symmetry = C1
{ atoms geometry } = {
H [ 0.088 2.006 1.438 ]
O [ 0.123 3.193 0.000 ]
H [ 0.088 2.006 -1.438 ]
O [ 4.502 5.955 -0.000 ]
H [ 2.917 4.963 -0.000 ]
H [ 3.812 7.691 -0.000 ]
}
)
% basis set specification
basis<GaussianBasisSet>: (
name = 'STO-3G'
molecule = $:molecule
)
mpqc: (
checkpoint = no
savestate = no
% method for computing the molecule's energy
mole<CLHF>: (
molecule = $:molecule
basis = $:basis
coor = $..:coor
memory = 16000000
)
% molecular coordinates for optimization
coor<SymmMolecularCoor>: (
molecule = $:molecule
generator<IntCoorGen>: (
molecule = $:molecule
extra_bonds = [ 2 5 ]
)
% use these instead of generated coordinates
variable<SetIntCoor>: [
<StreSimpleCo>:( atoms = [ 2 5 ] )
<BendSimpleCo>:( atoms = [ 2 5 4 ] )
<OutSimpleCo>: ( atoms = [ 5 2 1 3 ] )
<SumIntCoor>: (
coor: [
<StreSimpleCo>:( atoms = [ 1 2 ] )
<StreSimpleCo>:( atoms = [ 2 3 ] )
]
coef = [ 1.0 1.0 ]
)
<SumIntCoor>: (
coor: [
<StreSimpleCo>:( atoms = [ 4 5 ] )
<StreSimpleCo>:( atoms = [ 4 6 ] )
]
coef = [ 1.0 1.0 ]
)
<BendSimpleCo>:( atoms = [ 1 2 3 ] )
<BendSimpleCo>:( atoms = [ 5 4 6 ] )
]
% these are fixed by symmetry anyway,
fixed<SetIntCoor>: [
<SumIntCoor>: (
coor: [
<StreSimpleCo>:( atoms = [ 1 2 ] )
<StreSimpleCo>:( atoms = [ 2 3 ] )
]
coef = [ 1.0 -1.0 ]
)
<SumIntCoor>: (
coor: [
<StreSimpleCo>:( atoms = [ 4 5 ] )
<StreSimpleCo>:( atoms = [ 4 6 ] )
]
coef = [ 1.0 -1.0 ]
)
<TorsSimpleCo>:( atoms = [ 2 5 4 6] )
<OutSimpleCo>:( atoms = [ 3 2 6 4 ] )
<OutSimpleCo>:( atoms = [ 1 2 6 4 ] )
]
)
% optimizer object for the molecular geometry
opt<QNewtonOpt>: (
function = $..:mole
update<BFGSUpdate>: ()
convergence<MolEnergyConvergence>: (
cartesian = yes
energy = $..:..:mole
)
% give a partial guess hessian in internal coordinates
% the missing elements will be filled in automatically
hessian = [
[ 0.0109261670 ]
[ -0.0004214845 0.0102746106 ]
[ -0.0008600592 0.0030051330 0.0043149957 ]
[ 0.0 0.0 0.0 ]
[ 0.0 0.0 0.0 ]
[ 0.0 0.0 0.0 ]
[ 0.0 0.0 0.0 ]
]
)
)
πΈ Optimization with a Hydrogen Bond πΈ
okay important heads-up bestie: the automatic internal coordinate generator will literally fail if it can't find enough redundant internal coordinates. it's giving picky. π
so what do you do? you explicitly create the internal coordinate generator in the input and hand it the extra connectivity info it's missing, like so π
% emacs should use -*- KeyVal -*- mode
% molecule specification
molecule<Molecule>: (
symmetry = C1
{ atoms geometry } = {
H [ 0.088 2.006 1.438 ]
O [ 0.123 3.193 0.000 ]
H [ 0.088 2.006 -1.438 ]
O [ 4.502 5.955 -0.000 ]
H [ 2.917 4.963 -0.000 ]
H [ 3.812 7.691 -0.000 ]
}
)
% basis set specification
basis<GaussianBasisSet>: (
name = 'STO-3G'
molecule = $:molecule
)
mpqc: (
checkpoint = no
savestate = no
% method for computing the molecule's energy
mole<CLHF>: (
molecule = $:molecule
basis = $:basis
coor = $..:coor
memory = 16000000
)
% molecular coordinates for optimization
coor<SymmMolecularCoor>: (
molecule = $:molecule
% give an internal coordinate generator that knows about the
% hydrogen bond between atoms 2 and 5
generator<IntCoorGen>: (
molecule = $:molecule
extra_bonds = [ 2 5 ]
)
)
% optimizer object for the molecular geometry
opt<QNewtonOpt>: (
function = $..:mole
update<BFGSUpdate>: ()
convergence<MolEnergyConvergence>: (
cartesian = yes
energy = $..:..:mole
)
)
)
π Fixed Coordinate Optimization π
this one shows you how to selectively fix internal coordinates in an optimization. you can give any number of linearly independent coordinates β but plot twist, they have to stay linearly independent the whole way through the optimization. and that condition might not hold, because the coordinates can be nonlinear. so like. be aware π«
by default, the initial fixed coordinates' values are taken from the cartesian geometry given by the Molecule object. however, the molecule will be displaced to the internal coordinate values given with the fixed internal coordinates if the have_fixed_values keyword is set to true β which is exactly what this example does β¨
in that case, the initial Cartesian geometry should be reasonably close to the desired initial geometry, and all of the variable coordinates will be frozen to their original values during the initial displacement. noted, bestie π
% emacs should use -*- KeyVal -*- mode
% molecule specification
molecule<Molecule>: (
symmetry = CS
{ atoms geometry } = {
H [ 3.04 -0.69 -1.59 ]
H [ 3.04 -0.69 1.59 ]
N [ 2.09 -0.48 -0.00 ]
C [ -0.58 -0.15 0.00 ]
H [ -1.17 1.82 0.00 ]
H [ -1.41 -1.04 -1.64 ]
H [ -1.41 -1.04 1.64 ]
}
)
% basis set specification
basis<GaussianBasisSet>: (
name = '4-31G*'
molecule = $:molecule
)
mpqc: (
checkpoint = no
savestate = no
% molecular coordinates for optimization
coor<SymmMolecularCoor>: (
molecule = $:molecule
generator<IntCoorGen>: (
molecule = $:molecule
)
have_fixed_values = yes
fixed<SetIntCoor>: [
<OutSimpleCo>: ( value = -0.1
label = 'N-inversion'
atoms = [4 3 2 1] )
]
)
% method for computing the molecule's energy
mole<CLHF>: (
molecule = $:molecule
basis = $:basis
coor = $..:coor
memory = 16000000
)
% optimizer object for the molecular geometry
opt<QNewtonOpt>: (
max_iterations = 20
function = $..:mole
update<BFGSUpdate>: ()
convergence<MolEnergyConvergence>: (
cartesian = yes
energy = $..:..:mole
)
)
)
π Transition State Optimization π
this example shows a transition state optimization of the N-inversion in using mode following. the initial geometry was obtained by doing a few fixed coordinate optimizations along the inversion coordinate.
% emacs should use -*- KeyVal -*- mode
% molecule specification
molecule<Molecule>: (
symmetry = CS
{ atoms geometry } = {
H [ 3.045436 -0.697438 -1.596748 ]
H [ 3.045436 -0.697438 1.596748 ]
N [ 2.098157 -0.482779 -0.000000 ]
C [ -0.582616 -0.151798 0.000000 ]
H [ -1.171620 1.822306 0.000000 ]
H [ -1.417337 -1.042238 -1.647529 ]
H [ -1.417337 -1.042238 1.647529 ]
}
)
% basis set specification
basis<GaussianBasisSet>: (
name = '4-31G*'
molecule = $:molecule
)
mpqc: (
checkpoint = no
savestate = no
% molecular coordinates for optimization
coor<SymmMolecularCoor>: (
molecule = $:molecule
generator<IntCoorGen>: (
molecule = $:molecule
)
followed<OutSimpleCo> = [ 'N-inversion' 4 3 2 1 ]
)
% method for computing the molecule's energy
mole<CLHF>: (
molecule = $:molecule
basis = $:basis
coor = $..:coor
memory = 16000000
)
% optimizer object for the molecular geometry
opt<EFCOpt>: (
transition_state = yes
mode_following = yes
max_iterations = 20
function = $..:mole
update<PowellUpdate>: ()
convergence<MolEnergyConvergence>: (
cartesian = yes
energy = $..:..:mole
)
)
)
πΈ Transition State Optimization with a Computed Guess Hessian πΈ
okay so this next one is the glow-up version of that same vibe. π
It's a transition state optimization of the N-inversion, and it's still doing the mode following thing. The starting geometry? Got it by running a few fixed coordinate optimizations along the inversion coordinate β like, they walked it in first, no cap. πΆββοΈβ¨
Then the magic: an approximate guess Hessian gets computed, and that is what makes the optimization converge so much faster in this case. it's giving "do a little prep work, save a whole lot of time," fr fr. π¦
% emacs should use -*- KeyVal -*- mode
% molecule specification
molecule<Molecule>: (
symmetry = CS
{ atoms geometry } = {
H [ 3.045436 -0.697438 -1.596748 ]
H [ 3.045436 -0.697438 1.596748 ]
N [ 2.098157 -0.482779 -0.000000 ]
C [ -0.582616 -0.151798 0.000000 ]
H [ -1.171620 1.822306 0.000000 ]
H [ -1.417337 -1.042238 -1.647529 ]
H [ -1.417337 -1.042238 1.647529 ]
}
)
% basis set specification
basis<GaussianBasisSet>: (
name = '4-31G*'
molecule = $:molecule
)
mpqc: (
checkpoint = no
savestate = no
% molecular coordinates for optimization
coor<SymmMolecularCoor>: (
molecule = $:molecule
generator<IntCoorGen>: (
molecule = $:molecule
)
followed<OutSimpleCo> = [ 'N-inversion' 4 3 2 1 ]
)
% method for computing the molecule's energy
mole<CLHF>: (
molecule = $:molecule
basis = $:basis
coor = $..:coor
memory = 16000000
guess_hessian<FinDispMolecularHessian>: (
molecule = $:molecule
only_totally_symmetric = yes
eliminate_cubic_terms = no
checkpoint = no
energy<CLHF>: (
molecule = $:molecule
memory = 16000000
basis<GaussianBasisSet>: (
name = '3-21G'
molecule = $:molecule
)
)
)
)
% optimizer object for the molecular geometry
opt<EFCOpt>: (
transition_state = yes
mode_following = yes
max_iterations = 20
function = $..:mole
update<PowellUpdate>: ()
convergence<MolEnergyConvergence>: (
cartesian = yes
energy = $..:..:mole
)
)
)
π note bestie: that innerenergy<CLHF>block is running on a whole different basis ('3-21G', not the'4-31G*'from the outer one) β that's intentional, it's the cheap little scout run for the guess Hessian. copy it exactly, don't get cute and "unify" them. π
and that's the whole page, bestie!! πβ¨ you just read every last option, every environment variable, every shared-memory and MPI setup, every input flavor, and all the example files β like, actually all of them. you ate that. π
This one is Version 2, dated 15 Feb 2008, and it lives under the name MPQC(1) β so if you're citing it or looking it up, that's your tag. π«Ά go forth and compute, you gorgeous genius. πΈπ¦π
π¦ where this page comes from
- debian bookworm: mpqc 2.3.1-22
- ubuntu jammy: mpqc 2.3.1-21
- ubuntu noble: mpqc 2.3.1-22build2
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms