Installing LAMMPS (and MEAM) on a 64-bit AMD Opteron Cluster running CentOS 5 Linux

LAMMPS (Large-scale Atomic/Molecular Massively Parallel Simulator) is used to model atoms or as a parallel particle simulator at the atomic, meso, or continuum scale. It has potentials for soft materials (biomolecules, polymers) and solid-state materials (metals, semiconductors) and coarse-grained or mesoscopic systems.

I'm surprised I haven't documented this in the past, because I've installed it plenty of times. Nevertheless here's how it goes.

Download the source code and extract (tar xvf lammps-11Jan10.tar.gz). Note the directory name. Rename it to something that make sense for display on a computer (e.g., mv lammps-11Jan10 lammps-100111).

Load the modules required for installation i.e., module load openmpi-pgi fftw/2.1.5-pgi acml. Note the documentation Building LAMMPS can be non-trivial. You will likely need to edit a makefile, there are compiler options, additional libraries can be used (MPI, FFTW), etc., and they mean it. Fortunately we have a Makefile which we built previously - nice! cp Makefile.xxxx lammps-100111/src/MAKE/ (see below).

First install the optional packages MEAM (modified embedded atom method potential) with make yes-meam in the src directory. Check it with make package-status. Note that make yes-all will cause things to break; don't do it.

Here's what our Makefile looks like

# vpac = Portland Group compiler, OpenMPI, FFTW, ACML

SHELL = /bin/sh

# System-specific settings

CC = mpicxx -fastsse -tp k8-64,barcelona-64
LINK = mpicxx
LINKFLAGS = -L/usr/local/lib
USRLIB = -lfftw
SIZE = size

# Link target

$(EXE): $(OBJ)
$(SIZE) $(EXE)

# Library target

lib: $(OBJ)

# Compilation rules

$(CC) $(CCFLAGS) -c $


# Individual dependencies

DEPENDS = $(OBJ:.o=.d)
include $(DEPENDS)

Then install lammps with the packages (e.g., make vpac)... and it doesn't work. What could be wrong? Well, there's a whole lot of extra linking that has to be done. Look at this:

grep ftn_strcmp /usr/local/pgi/linux86-64/9.0/libso/*.so
grep __fio_eq_str /usr/local/pgi/linux86-64/9.0/libso/*.so
grep pghpf_0c_ /usr/local/pgi/linux86-64/9.0/libso/*.so
grep __hpf_erecv /usr/local/pgi/linux86-64/9.0/libso/*.so
grep __hpf_abortx /usr/local/pgi/linux86-64/9.0/libso/*.so
grep __hpf_sethand /usr/local/pgi/linux86-64/9.0/libso/*.so
grep aio_suspend /usr/local/pgi/linux86-64/9.0/libso/*.so
grep aio_suspend /usr/lib/*.so

.. and finally you get something like this. Ugh.

mpicxx -L/usr/local/lib angle_charmm.o angle_cosine.o angle_cosine_delta.o angle_cosine_squared.o angle.o angle_harmonic.o angle_hybrid.o angle_table.o atom.o atom_vec_angle.o atom_vec_atomic.o atom_vec_bond.o atom_vec_charge.o atom_vec.o atom_vec_full.o atom_vec_hybrid.o atom_vec_molecular.o bond.o bond_fene.o bond_fene_expand.o bond_harmonic.o bond_hybrid.o bond_morse.o bond_nonlinear.o bond_quartic.o bond_table.o change_box.o comm.o compute_angle_local.o compute_bond_local.o compute_centro_atom.o compute_cna_atom.o compute_com.o compute_com_molecule.o compute_coord_atom.o compute.o compute_dihedral_local.o compute_displace_atom.o compute_erotate_sphere.o compute_group_group.o compute_gyration.o compute_gyration_molecule.o compute_heat_flux.o compute_improper_local.o compute_ke_atom.o compute_ke.o compute_msd.o compute_msd_molecule.o compute_pair_local.o compute_pe_atom.o compute_pe.o compute_pressure.o compute_property_atom.o compute_property_local.o compute_property_molecule.o compute_rdf.o compute_reduce.o compute_reduce_region.o compute_stress_atom.o compute_temp_com.o compute_temp.o compute_temp_deform.o compute_temp_partial.o compute_temp_profile.o compute_temp_ramp.o compute_temp_region.o compute_temp_sphere.o create_atoms.o create_box.o delete_atoms.o delete_bonds.o dihedral_charmm.o dihedral.o dihedral_harmonic.o dihedral_helix.o dihedral_hybrid.o dihedral_multi_harmonic.o dihedral_opls.o displace_atoms.o displace_box.o domain.o dump_atom.o dump_cfg.o dump.o dump_custom.o dump_dcd.o dump_local.o dump_xyz.o error.o ewald.o fft3d.o fft3d_wrap.o finish.o fix_addforce.o fix_ave_atom.o fix_aveforce.o fix_ave_histo.o fix_ave_spatial.o fix_ave_time.o fix_bond_break.o fix_bond_create.o fix_bond_swap.o fix_box_relax.o fix.o fix_deform.o fix_deposit.o fix_drag.o fix_dt_reset.o fix_efield.o fix_enforce2d.o fix_evaporate.o fix_gravity.o fix_heat.o fix_indent.o fix_langevin.o fix_lineforce.o fix_minimize.o fix_momentum.o fix_move.o fix_nph.o fix_npt.o fix_npt_sphere.o fix_nve.o fix_nve_limit.o fix_nve_noforce.o fix_nve_sphere.o fix_nvt.o fix_nvt_sllod.o fix_nvt_sphere.o fix_orient_fcc.o fix_planeforce.o fix_press_berendsen.o fix_print.o fix_recenter.o fix_respa.o fix_rigid.o fix_set_force.o fix_shake.o fix_shear_history.o fix_spring.o fix_spring_rg.o fix_spring_self.o fix_store_coord.o fix_store_force.o fix_temp_berendsen.o fix_temp_rescale.o fix_thermal_conductivity.o fix_tmd.o fix_ttm.o fix_viscosity.o fix_viscous.o fix_wall.o fix_wall_harmonic.o fix_wall_lj126.o fix_wall_lj93.o fix_wall_reflect.o fix_wall_region.o force.o group.o improper.o improper_cvff.o improper_harmonic.o improper_hybrid.o input.o integrate.o kspace.o lammps.o lattice.o library.o main.o memory.o min_cg.o min.o min_hftn.o minimize.o min_linesearch.o min_sd.o modify.o neigh_bond.o neighbor.o neigh_derive.o neigh_full.o neigh_gran.o neigh_half_bin.o neigh_half_multi.o neigh_half_nsq.o neigh_list.o neigh_request.o neigh_respa.o neigh_stencil.o output.o pack.o pair_airebo.o pair_born_coul_long.o pair_buck_coul_cut.o pair_buck_coul_long.o pair_buck.o pair_coul_cut.o pair_coul_debye.o pair_coul_long.o pair.o pair_dpd.o pair_eam_alloy.o pair_eam.o pair_eam_fs.o pair_hybrid.o pair_hybrid_overlay.o pair_lj96_cut.o pair_lj_charmm_coul_charmm.o pair_lj_charmm_coul_charmm_implicit.o pair_lj_charmm_coul_long.o pair_lj_cut_coul_cut.o pair_lj_cut_coul_debye.o pair_lj_cut_coul_long.o pair_lj_cut_coul_long_tip4p.o pair_lj_cut.o pair_lj_expand.o pair_lj_gromacs_coul_gromacs.o pair_lj_gromacs.o pair_lj_smooth.o pair_meam.o pair_morse.o pair_soft.o pair_sw.o pair_table.o pair_tersoff.o pair_tersoff_zbl.o pair_yukawa.o pppm.o pppm_tip4p.o random_mars.o random_park.o read_data.o read_restart.o region_block.o region_cone.o region.o region_cylinder.o region_intersect.o region_plane.o region_prism.o region_sphere.o region_union.o remap.o remap_wrap.o replicate.o respa.o run.o set.o shell.o special.o temper.o thermo.o timer.o universe.o update.o variable.o velocity.o verlet.o write_restart.o -lfftw ../../lib/meam/libmeam.a -o ../lmp_vpac -lpgf90rtl -lpgf90 -lpgftnrtl -lpgf902 -lpghpf -lpgf90_rpm1 -lpghpf2 -lrt

ldd ../lmp_xxxx

Copy the binary lmp_xxxx to a new directory (mkdir /usr/local/lammps/lammps-100111, cp lmp_xxxx /usr/local/lammps/lammps-100111) and create the appropriate module file for it (cp lammps-080122-xxxx lammps-100111-xxxx, nano lammps-100111-xxxx, change set version).