diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index 441e9cc8f03a6897117f22463229febe348489ec..cd8750bd84cdbb973fa55dbb6d7cda4572957406 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -1,7 +1,7 @@ <!-- HTML_ONLY --> <HEAD> <TITLE>LAMMPS Users Manual</TITLE> -<META NAME="docnumber" CONTENT="21 Sep 2016 version"> +<META NAME="docnumber" CONTENT="26 Sep 2016 version"> <META NAME="author" CONTENT="http://lammps.sandia.gov - Sandia National Laboratories"> <META NAME="copyright" CONTENT="Copyright (2003) Sandia Corporation. This software and manual is distributed under the GNU General Public License."> </HEAD> @@ -21,7 +21,7 @@ <H1></H1> LAMMPS Documentation :c,h3 -21 Sep 2016 version :c,h4 +26 Sep 2016 version :c,h4 Version info: :h4 diff --git a/doc/src/Section_commands.txt b/doc/src/Section_commands.txt index 3e18037a8343451ab359c825f175fc7cf24076af..91ec6793601d840491bc2ae5a7a3eb49a3144471 100644 --- a/doc/src/Section_commands.txt +++ b/doc/src/Section_commands.txt @@ -501,6 +501,7 @@ USER-INTEL, k = KOKKOS, o = USER-OMP, t = OPT. "bond/create"_fix_bond_create.html, "bond/swap"_fix_bond_swap.html, "box/relax"_fix_box_relax.html, +"cmap"_fix_cmap.html, "controller"_fix_controller.html, "deform (k)"_fix_deform.html, "deposit"_fix_deposit.html, diff --git a/doc/src/Section_tools.txt b/doc/src/Section_tools.txt index 3527d228de57603f55d5a2e697b93ea7aa4cde29..983be30f19791dc6551cd51858d932372c91bbfd 100644 --- a/doc/src/Section_tools.txt +++ b/doc/src/Section_tools.txt @@ -107,9 +107,10 @@ The ch2lmp sub-directory contains tools for converting files back-and-forth between the CHARMM MD code and LAMMPS. They are intended to make it easy to use CHARMM as a builder and as a -post-processor for LAMMPS. Using charmm2lammps.pl, you can convert an -ensemble built in CHARMM into its LAMMPS equivalent. Using -lammps2pdb.pl you can convert LAMMPS atom dumps into pdb files. +post-processor for LAMMPS. Using charmm2lammps.pl, you can convert a +PDB file with associated CHARMM info, including CHARMM force field +data, into its LAMMPS equivalent. Using lammps2pdb.pl you can convert +LAMMPS atom dumps into PDB files. See the README file in the ch2lmp sub-directory for more information. diff --git a/doc/src/fix_cmap.txt b/doc/src/fix_cmap.txt new file mode 100644 index 0000000000000000000000000000000000000000..924e6f5022364219795c3237d4011c06e6cb9b37 --- /dev/null +++ b/doc/src/fix_cmap.txt @@ -0,0 +1,132 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +fix cmap command :h3 + +[Syntax:] + +fix ID group-ID cmap filename :pre + +ID, group-ID are documented in "fix"_fix.html command +cmap = style name of this fix command +filename = force-field file with CMAP coefficients :ul + +[Examples:] + +fix myCMAP all cmap ../potentials/cmap36.data +read_data proteinX.data fix myCMAP crossterm CMAP +fix_modify myCMAP energy yes :pre + +[Description:] + +This command enables CMAP crossterms to be added to simulations which +use the CHARMM force field. These are relevant for any CHARMM model +of a peptide or protein sequences that is 3 or more amino-acid +residues long; see "(Buck)"_#Buck and "(Brooks)"_#Brooks for details, +including the analytic energy expressions for CMAP interactions. The +CMAP crossterms add additional potential energy contributions to pairs +of overlapping phi-psi dihedrals of amino-acids, which are important +to properly represent their conformational behavior. + +The examples/cmap directory has a sample input script and data file +for a small peptide, that illustrates use of the fix cmap command. + +As in the example above, this fix should be used before reading a data +file that contains a listing of CMAP interactions. The {filename} +specified should contain the CMAP parameters for a particular version +of the CHARMM force field. Two such files are including in the +lammps/potentials directory: charmm22.cmap and charmm36.cmap. + +The data file read by the "read_data" must contain the topology of all +the CMAP interactions, similar to the topology data for bonds, angles, +dihedrals, etc. Specically it should have a line like this +in its header section: + +N crossterms :pre + +where N is the number of CMAP crossterms. It should also have a section +in the body of the data file like this with N lines: + +CMAP :pre + + 1 1 8 10 12 18 20 + 2 5 18 20 22 25 27 + ... + N 3 314 315 317 318 330 :pre + +The first column is an index from 1 to N to enumerate the CMAP terms; +it is ignored by LAMMPS. The 2nd column is the "type" of the +interaction; it is an index into the CMAP force field file. The +remaining 5 columns are the atom IDs of the atoms in the two 4-atom +dihedrals that overlap to create the CMAP 5-body interaction. Note +that the "crossterm" and "CMAP" keywords for the header and body +sections match those specified in the read_data command following the +data file name; see the "read_data"_doc/read_data.html doc page for +more details. + +A data file containing CMAP crossterms can be generated from a PDB +file using the charmm2lammps.pl script in the tools/ch2lmp directory +of the LAMMPS distribution. The script must be invoked with the +optional "-cmap" flag to do this; see the tools/ch2lmp/README file for +more information. + +The potential energy associated with CMAP interactions can be output +as described below. It can also be included in the total potential +energy of the system, as output by the +"thermo_style"_thermo_style.html command, if the "fix_modify +energy"_fix_modify.html command is used, as in the example above. See +the note below about how to include the CMAP energy when performing an +"energy minimization"_minimize.html. + +:line + +[Restart, fix_modify, output, run start/stop, minimize info:] + +No information about this fix is written to "binary restart +files"_restart.html. + +The "fix_modify"_fix_modify.html {energy} option is supported by this +fix to add the potential "energy" of the CMAP interactions system's +potential energy as part of "thermodynamic output"_thermo_style.html. + +This fix computes a global scalar which can be accessed by various +"output commands"_Section_howto.html#howto_15. The scalar is the +potential energy discussed above. The scalar value calculated by this +fix is "extensive". + +No parameter of this fix can be used with the {start/stop} keywords of +the "run"_run.html command. + +The forces due to this fix are imposed during an energy minimization, +invoked by the "minimize"_minimize.html command. + +NOTE: If you want the potential energy associated with the CMAP terms +forces to be included in the total potential energy of the system (the +quantity being minimized), you MUST enable the +"fix_modify"_fix_modify.html {energy} option for this fix. + +[Restrictions:] + +This fix can only be used if LAMMPS was built with the MOLECULE +package (which it is by default). See the "Making +LAMMPS"_Section_start.html#start_3 section for more info on packages. + +[Related commands:] + +"fix_modify"_fix_modify.html, "read_data"_read_data.html + +[Default:] none + +:line + +(Buck) +Buck, Bouguet-Bonnet, Pastor, MacKerell Jr., Biophys J, 90, L36 +(2006). + +(Brooks) +Brooks, Brooks, MacKerell Jr., J Comput Chem, 30, 1545 (2009). diff --git a/examples/README b/examples/README index 400d69aa2d17c9f679b2d8715193851c1b18acdc..462fa93e12f8bfa717687bbf28029c7689601097 100644 --- a/examples/README +++ b/examples/README @@ -61,6 +61,7 @@ sub-directories: accelerate: use of all the various accelerator packages balance: dynamic load balancing, 2d system body: body particles, 2d system +cmap: CMAP 5-body contributions to CHARMM force field colloid: big colloid particles in a small particle solvent, 2d system coreshell: adiabatic core/shell model comb: models using the COMB potential diff --git a/examples/cmap/charmm22.cmap b/examples/cmap/charmm22.cmap new file mode 100644 index 0000000000000000000000000000000000000000..782dcc5dbf08a46d5b77a7d8fc0420e149e491a9 --- /dev/null +++ b/examples/cmap/charmm22.cmap @@ -0,0 +1,1022 @@ +# Title: charmm correction map + +# alanine map, type 1 + +# -180 +0.126790 0.768700 0.971260 1.250970 2.121010 +2.695430 2.064440 1.764790 0.755870 -0.713470 +0.976130 -2.475520 -5.455650 -5.096450 -5.305850 +-3.975630 -3.088580 -2.784200 -2.677120 -2.646060 +-2.335350 -2.010440 -1.608040 -0.482250 + +# -165 +-0.802290 1.377090 1.577020 1.872290 2.398990 +2.461630 2.333840 1.904070 1.061460 0.518400 +-0.116320 -3.575440 -5.284480 -5.160310 -4.196010 +-3.276210 -2.715340 -1.806200 -1.101780 -1.210320 +-1.008810 -0.637100 -1.603360 -1.776870 + +# -150 +-0.634810 1.156210 1.624350 2.047200 2.653910 +2.691410 2.296420 1.960450 1.324930 2.038290 +-1.151510 -3.148610 -4.058280 -4.531850 -3.796370 +-2.572090 -1.727250 -0.961410 -0.282910 -0.479120 +-1.039340 -1.618060 -1.725460 -1.376360 + +# -135 +0.214000 1.521370 1.977440 2.377950 2.929470 +2.893410 2.435810 2.162970 1.761500 1.190090 +-1.218610 -2.108900 -2.976100 -3.405340 -2.768440 +-1.836030 -0.957950 0.021790 -0.032760 -0.665880 +-1.321170 -1.212320 -0.893170 -0.897040 + +# -120 +0.873950 1.959160 2.508990 2.841100 3.698960 +3.309330 2.614300 2.481720 2.694660 1.082440 +-0.398320 -1.761800 -2.945110 -3.294690 -2.308300 +-0.855480 -0.087320 0.439040 0.691880 -0.586330 +-1.027210 -0.976640 -0.467580 0.104020 + +# -105 +1.767380 2.286650 2.818030 3.065500 3.370620 +3.397440 2.730310 2.878790 2.542010 1.545240 +-0.092150 -1.694440 -2.812310 -2.802430 -1.856360 +-0.306240 -0.122440 0.444680 0.810150 -0.058630 +-0.270290 -0.178830 0.202360 0.493810 + +# -90 +1.456010 2.743180 2.589450 3.046230 3.451510 +3.319160 3.052900 3.873720 2.420650 0.949100 +0.008370 -1.382980 -2.138930 -2.087380 -1.268300 +-0.494370 0.267580 0.908250 0.537520 0.306260 +0.069540 0.097460 0.263060 0.603220 + +# -75 +1.396790 3.349090 2.180920 2.942960 3.814070 +3.675800 3.555310 3.887290 2.101260 -0.190940 +-0.732240 -1.382040 -0.673880 -0.817390 -0.826980 +-0.111800 0.053710 0.296400 0.692240 0.428960 +-0.036100 -0.033820 -0.194300 0.400210 + +# -60 +0.246650 1.229980 1.716960 3.168570 4.208190 +4.366860 4.251080 3.348110 0.997540 -1.287540 +-1.179900 -0.684300 -0.853660 -1.158760 -0.347550 +0.114810 0.242800 0.322420 0.370140 -0.374950 +-0.676940 -1.323430 -1.366650 -0.218770 + +# -45 +-1.196730 0.078060 2.347410 4.211350 5.376000 +5.364940 4.355200 2.436510 0.408470 -0.590840 +-0.435960 -0.501210 -0.822230 -0.607210 0.057910 +0.246580 -0.070570 0.379430 0.247770 -0.571680 +-1.282910 -1.715770 -1.839820 -1.987110 + +# -30 +-1.174720 1.067030 4.180460 6.741610 6.070770 +4.781470 2.758340 1.295810 0.571150 -0.196480 +0.251860 -0.732140 1.289360 1.497590 1.890550 +2.198490 0.169290 0.534000 0.331780 -1.276320 +-2.550070 -3.312150 -3.136670 -2.642260 + +# -15 +0.293590 5.588070 3.732620 3.217620 3.272450 +2.492320 1.563700 1.356760 0.831410 0.630170 +1.591970 0.821920 0.486070 0.715760 0.996020 +1.591580 -0.367400 0.181770 -0.613920 -2.267900 +-3.516460 -3.597700 -3.043340 -1.765020 + +# 0 +2.832310 0.787990 0.323280 0.479230 0.628600 +0.976330 1.238750 1.671950 1.645480 2.520340 +1.606970 0.776350 0.119780 0.070390 0.121170 +-1.569230 -1.213010 -1.846360 -2.744510 -3.792530 +-3.934880 -3.615930 -2.675750 -0.924170 + +# 15 +-0.778340 -1.912680 -2.052140 -1.846280 -1.047430 +0.183400 1.682950 2.223500 1.358370 2.448660 +1.436920 0.678570 -0.237060 -0.535320 -0.790380 +-2.182580 -3.251140 -4.195110 -4.269270 -3.908210 +-3.455620 -2.773970 1.755370 0.313410 + +# 30 +-2.963810 -3.483730 -3.517080 -2.724860 -1.405510 +0.336200 1.428450 1.394630 0.970370 2.462720 +1.522430 0.553620 -0.407380 -1.482950 -3.613920 +-4.159810 -4.945580 -4.784040 -3.764540 -2.959140 +-1.963850 -1.071260 -1.599580 -2.445320 + +# 45 +-4.029070 -3.932660 -3.558480 -2.513980 -1.037320 +0.362000 0.814380 0.754110 0.502370 1.903420 +0.770220 -0.416420 -3.286310 -3.875270 -4.907800 +-5.704430 -5.645660 -4.396040 -2.865450 -2.368170 +-2.860490 -3.416560 -3.666490 -3.859070 + +# 60 +-3.338270 -2.960220 -2.311700 -1.272890 -0.246470 +0.722610 0.668070 0.438130 2.395330 1.632470 +-2.041450 -3.218100 -3.915080 -4.852510 -5.696500 +-6.314370 -5.683690 -4.170620 -3.141000 -3.508820 +-3.756430 -3.640810 -3.640430 -3.550690 + +# 75 +-2.244860 -1.632100 -1.000640 -0.170440 0.526440 +0.823710 0.517140 -0.013120 -0.370910 -1.213720 +-2.305650 -3.420580 -4.484960 -5.693140 -6.199150 +-6.253870 -5.211310 -4.174380 -3.685150 -4.151360 +-4.161970 -3.725150 -3.715310 -2.606760 + +# 90 +-1.720840 -1.177830 -0.428430 0.277730 0.807900 +0.803260 0.482510 -0.336900 -0.786270 -1.774070 +-2.793220 -3.828560 -5.211800 -6.636850 -6.989940 +-6.108800 -5.452410 -3.911450 -4.321000 -4.587240 +-4.102610 -3.772820 -3.157300 -2.648390 + +# 105 +-1.850640 -1.092420 -0.445020 0.128490 1.005520 +0.884820 0.485850 -0.218470 -0.857670 -1.682330 +-3.014400 -4.481110 -6.053510 -6.865400 -6.871130 +-5.728240 -3.912230 -4.802110 -5.034640 -4.715990 +-4.601080 -4.086220 -3.274630 -2.410940 + +# 120 +-1.969230 -1.116650 -0.540250 -0.150330 0.763520 +1.038890 0.758480 0.313530 -0.333050 -1.872770 +-3.366270 -5.008260 -6.124810 -7.034830 -6.724320 +-3.700200 -4.510620 -5.185650 -5.361620 -4.847490 +-4.444320 -4.004260 -3.415720 -2.751230 + +# 135 +-2.111250 -1.168960 -0.322790 -0.006920 0.316660 +1.086270 0.939170 0.625340 -0.166360 -1.830310 +-3.469470 -4.946030 -6.112560 -1.915580 -4.047310 +-4.996740 -4.996730 -4.842690 -4.886620 -4.300540 +-4.494620 -4.442210 -4.163570 -3.183510 + +# 150 +-1.757590 -0.403620 0.023920 0.362390 0.634520 +1.264920 1.361360 0.948420 -0.073680 -1.483560 +-3.152820 1.835120 -1.762860 -5.093660 -5.744830 +-5.390070 -4.783930 -4.190630 -4.115420 -4.042280 +-4.125570 -4.028550 -4.026100 -2.937910 + +# 165 +-0.810590 -0.071500 0.378890 0.543310 1.277880 +1.641310 1.698840 1.519950 0.631950 -1.088670 +-2.736530 -0.735240 -4.563830 -6.408350 -5.889450 +-5.141750 -4.194970 -3.666490 -3.843450 -3.818830 +-3.826180 -3.596820 -2.994790 -2.231020 + +# alanine before proline map, type 2 + +# -180 +0.126790 0.768700 0.971260 1.250970 2.121010 +2.695430 2.064440 1.764790 0.755870 -0.713470 +0.976130 -2.475520 -5.455650 -5.096450 -5.305850 +-3.975630 -3.088580 -2.784200 -2.677120 -2.646060 +-2.335350 -2.010440 -1.608040 -0.482250 + +# -165 +-0.802290 1.377090 1.577020 1.872290 2.398990 +2.461630 2.333840 1.904070 1.061460 0.518400 +-0.116320 -3.575440 -5.284480 -5.160310 -4.196010 +-3.276210 -2.715340 -1.806200 -1.101780 -1.210320 +-1.008810 -0.637100 -1.603360 -1.776870 + +# -150 +-0.634810 1.156210 1.624350 2.047200 2.653910 +2.691410 2.296420 1.960450 1.324930 2.038290 +-1.151510 -3.148610 -4.058280 -4.531850 -3.796370 +-2.572090 -1.727250 -0.961410 -0.282910 -0.479120 +-1.039340 -1.618060 -1.725460 -1.376360 + +# -135 +0.214000 1.521370 1.977440 2.377950 2.929470 +2.893410 2.435810 2.162970 1.761500 1.190090 +-1.218610 -2.108900 -2.976100 -3.405340 -2.768440 +-1.836030 -0.957950 0.021790 -0.032760 -0.665880 +-1.321170 -1.212320 -0.893170 -0.897040 + +# -120 +0.873950 1.959160 2.508990 2.841100 3.698960 +3.309330 2.614300 2.481720 2.694660 1.082440 +-0.398320 -1.761800 -2.945110 -3.294690 -2.308300 +-0.855480 -0.087320 0.439040 0.691880 -0.586330 +-1.027210 -0.976640 -0.467580 0.104020 + +# -105 +1.767380 2.286650 2.818030 3.065500 3.370620 +3.397440 2.730310 2.878790 2.542010 1.545240 +-0.092150 -1.694440 -2.812310 -2.802430 -1.856360 +-0.306240 -0.122440 0.444680 0.810150 -0.058630 +-0.270290 -0.178830 0.202360 0.493810 + +# -90 +1.456010 2.743180 2.589450 3.046230 3.451510 +3.319160 3.052900 3.873720 2.420650 0.949100 +0.008370 -1.382980 -2.138930 -2.087380 -1.268300 +-0.494370 0.267580 0.908250 0.537520 0.306260 +0.069540 0.097460 0.263060 0.603220 + +# -75 +1.396790 3.349090 2.180920 2.942960 3.814070 +3.675800 3.555310 3.887290 2.101260 -0.190940 +-0.732240 -1.382040 -0.673880 -0.817390 -0.826980 +-0.111800 0.053710 0.296400 0.692240 0.428960 +-0.036100 -0.033820 -0.194300 0.400210 + +# -60 +0.246650 1.229980 1.716960 3.168570 4.208190 +4.366860 4.251080 3.348110 0.997540 -1.287540 +-1.179900 -0.684300 -0.853660 -1.158760 -0.347550 +0.114810 0.242800 0.322420 0.370140 -0.374950 +-0.676940 -1.323430 -1.366650 -0.218770 + +# -45 +-1.196730 0.078060 2.347410 4.211350 5.376000 +5.364940 4.355200 2.436510 0.408470 -0.590840 +-0.435960 -0.501210 -0.822230 -0.607210 0.057910 +0.246580 -0.070570 0.379430 0.247770 -0.571680 +-1.282910 -1.715770 -1.839820 -1.987110 + +# -30 +-1.174720 1.067030 4.180460 6.741610 6.070770 +4.781470 2.758340 1.295810 0.571150 -0.196480 +0.251860 -0.732140 1.289360 1.497590 1.890550 +2.198490 0.169290 0.534000 0.331780 -1.276320 +-2.550070 -3.312150 -3.136670 -2.642260 + +# -15 +0.293590 5.588070 3.732620 3.217620 3.272450 +2.492320 1.563700 1.356760 0.831410 0.630170 +1.591970 0.821920 0.486070 0.715760 0.996020 +1.591580 -0.367400 0.181770 -0.613920 -2.267900 +-3.516460 -3.597700 -3.043340 -1.765020 + +# 0 +2.832310 0.787990 0.323280 0.479230 0.628600 +0.976330 1.238750 1.671950 1.645480 2.520340 +1.606970 0.776350 0.119780 0.070390 0.121170 +-1.569230 -1.213010 -1.846360 -2.744510 -3.792530 +-3.934880 -3.615930 -2.675750 -0.924170 + +# 15 +-0.778340 -1.912680 -2.052140 -1.846280 -1.047430 +0.183400 1.682950 2.223500 1.358370 2.448660 +1.436920 0.678570 -0.237060 -0.535320 -0.790380 +-2.182580 -3.251140 -4.195110 -4.269270 -3.908210 +-3.455620 -2.773970 1.755370 0.313410 + +# 30 +-2.963810 -3.483730 -3.517080 -2.724860 -1.405510 +0.336200 1.428450 1.394630 0.970370 2.462720 +1.522430 0.553620 -0.407380 -1.482950 -3.613920 +-4.159810 -4.945580 -4.784040 -3.764540 -2.959140 +-1.963850 -1.071260 -1.599580 -2.445320 + +# 45 +-4.029070 -3.932660 -3.558480 -2.513980 -1.037320 +0.362000 0.814380 0.754110 0.502370 1.903420 +0.770220 -0.416420 -3.286310 -3.875270 -4.907800 +-5.704430 -5.645660 -4.396040 -2.865450 -2.368170 +-2.860490 -3.416560 -3.666490 -3.859070 + +# 60 +-3.338270 -2.960220 -2.311700 -1.272890 -0.246470 +0.722610 0.668070 0.438130 2.395330 1.632470 +-2.041450 -3.218100 -3.915080 -4.852510 -5.696500 +-6.314370 -5.683690 -4.170620 -3.141000 -3.508820 +-3.756430 -3.640810 -3.640430 -3.550690 + +# 75 +-2.244860 -1.632100 -1.000640 -0.170440 0.526440 +0.823710 0.517140 -0.013120 -0.370910 -1.213720 +-2.305650 -3.420580 -4.484960 -5.693140 -6.199150 +-6.253870 -5.211310 -4.174380 -3.685150 -4.151360 +-4.161970 -3.725150 -3.715310 -2.606760 + +# 90 +-1.720840 -1.177830 -0.428430 0.277730 0.807900 +0.803260 0.482510 -0.336900 -0.786270 -1.774070 +-2.793220 -3.828560 -5.211800 -6.636850 -6.989940 +-6.108800 -5.452410 -3.911450 -4.321000 -4.587240 +-4.102610 -3.772820 -3.157300 -2.648390 + +# 105 +-1.850640 -1.092420 -0.445020 0.128490 1.005520 +0.884820 0.485850 -0.218470 -0.857670 -1.682330 +-3.014400 -4.481110 -6.053510 -6.865400 -6.871130 +-5.728240 -3.912230 -4.802110 -5.034640 -4.715990 +-4.601080 -4.086220 -3.274630 -2.410940 + +# 120 +-1.969230 -1.116650 -0.540250 -0.150330 0.763520 +1.038890 0.758480 0.313530 -0.333050 -1.872770 +-3.366270 -5.008260 -6.124810 -7.034830 -6.724320 +-3.700200 -4.510620 -5.185650 -5.361620 -4.847490 +-4.444320 -4.004260 -3.415720 -2.751230 + +# 135 +-2.111250 -1.168960 -0.322790 -0.006920 0.316660 +1.086270 0.939170 0.625340 -0.166360 -1.830310 +-3.469470 -4.946030 -6.112560 -1.915580 -4.047310 +-4.996740 -4.996730 -4.842690 -4.886620 -4.300540 +-4.494620 -4.442210 -4.163570 -3.183510 + +# 150 +-1.757590 -0.403620 0.023920 0.362390 0.634520 +1.264920 1.361360 0.948420 -0.073680 -1.483560 +-3.152820 1.835120 -1.762860 -5.093660 -5.744830 +-5.390070 -4.783930 -4.190630 -4.115420 -4.042280 +-4.125570 -4.028550 -4.026100 -2.937910 + +# 165 +-0.810590 -0.071500 0.378890 0.543310 1.277880 +1.641310 1.698840 1.519950 0.631950 -1.088670 +-2.736530 -0.735240 -4.563830 -6.408350 -5.889450 +-5.141750 -4.194970 -3.666490 -3.843450 -3.818830 +-3.826180 -3.596820 -2.994790 -2.231020 + +# proline, type 3 + +# -180.00 +-4.60660 -4.28920 -4.51420 -5.49210 -6.65460 +-7.18530 -7.63320 -8.41920 -9.12510 -8.97830 +-9.02750 -8.88890 -8.61060 -8.10240 -7.96680 +-7.98860 -7.96190 -7.56330 -7.73950 -8.31580 +-9.33380 -9.61880 -7.91860 -6.00570 + +# -165.00 +-3.21030 -2.90350 -3.04340 -3.83720 -4.92360 +-5.41790 -5.78320 -6.62490 -7.17820 -7.59500 +-7.60980 -7.39440 -6.68190 -6.24950 -5.83810 +-5.90510 -5.57900 -4.89950 -5.18840 -6.13180 +-6.93510 -7.49160 -5.84410 -4.48890 + +# -150.00 +-2.23750 -2.26520 -2.55120 -3.67610 -4.61620 +-5.01560 -5.36920 -5.93110 -6.16820 -6.48830 +-6.54220 -6.14310 -5.33350 -4.85090 -4.50790 +-4.44050 -4.34380 -4.13820 -4.35620 -5.24880 +-6.05280 -6.18610 -4.80390 -3.41730 + +# -135.00 +-2.12830 -2.02010 -2.90220 -3.88240 -4.63610 +-5.02000 -5.46090 -5.79830 -5.63220 -6.41490 +-6.20330 -5.57550 -4.58160 -4.15850 -4.00710 +-3.95020 -3.76880 -4.09690 -4.52680 -5.33410 +-5.97380 -5.68710 -4.70040 -3.33790 + +# -120.00 +-2.20610 -2.22370 -2.85110 -3.55370 -4.33320 +-4.57860 -4.95030 -5.23950 -5.37730 -6.14740 +-5.98660 -5.17760 -4.16090 -3.78450 -3.83210 +-3.86590 -4.21340 -4.26250 -4.16200 -4.62160 +-5.47440 -5.38280 -4.39100 -3.16760 + +# -105.00 +-1.32980 -1.44660 -2.00420 -2.84440 -3.31580 +-3.15410 -2.83060 -3.04980 -4.04810 -5.02030 +-4.84090 -3.88520 -2.79540 -2.49190 -2.65990 +-3.34670 -3.60580 -3.76970 -4.07430 -4.21930 +-4.66740 -4.23940 -3.37160 -2.10050 + +# -90.00 +-0.27400 -0.41780 -0.92340 -1.48470 -1.84370 +-1.42480 -1.14210 -1.83280 -2.97900 -3.57000 +-3.33310 -2.24200 -1.31350 -0.96640 0.38300 +-0.57540 -0.74080 -0.59130 -0.41960 -2.64120 +-3.25380 -2.85540 -2.09970 -0.95660 + +# -75.00 + 0.26880 0.18190 0.00300 -0.45390 -0.24210 + 0.21240 0.33320 -0.95520 -2.17670 -2.66490 +-2.24910 -1.35480 -0.35030 1.84000 0.81880 + 0.41530 0.58460 0.65350 0.54960 0.41300 + 0.23350 -2.13490 -1.54900 -0.38340 + +# -60.00 +-0.48820 -0.40730 -0.25210 -0.20490 0.53370 + 1.05990 0.72540 -0.68300 -2.10190 -2.83530 +-2.55500 -1.33940 -0.24710 1.63190 1.10600 + 1.16350 1.30720 1.49310 1.16160 0.99320 +-2.33360 -2.59380 -2.01110 -1.46840 + +# -45.00 +-2.41010 -1.30740 -0.85960 -0.06830 0.20500 + 0.00650 -0.59750 -2.39820 -3.98270 -4.46610 +-3.51230 -1.99330 0.96050 0.80870 0.64450 + 0.82590 1.00550 1.28110 0.96670 -2.71140 +-4.18330 -4.83370 -4.49950 -3.47920 + +# -30.00 +-3.46300 -2.06680 -0.84260 -0.70440 -1.85140 +-2.59990 -3.62600 -5.08050 -6.35480 -6.08340 +-4.78650 -1.24210 -0.81660 -0.60170 -0.50040 +-0.41020 -0.28450 -0.14620 -3.14950 -5.16280 +-6.81940 -7.52060 -7.12480 -5.49420 + +# -15.00 +-2.70550 -1.11410 -0.82120 -3.80470 -4.50780 +-4.64960 -5.78530 -7.04450 -7.30810 -6.56450 +-3.47860 -2.68630 -1.78120 -1.48400 -1.45930 +-1.43060 -5.75320 -2.72500 -6.45790 -8.16530 +-9.86330 -9.80710 -8.62670 -6.49690 + +# 0.00 +-2.73190 -3.83060 -5.26960 -5.91610 -6.71690 +-7.05420 -7.77520 -7.81220 -7.54160 -4.98400 +-5.05070 -4.28910 -3.78740 -3.64600 -3.91990 +-3.55740 -3.03470 -5.78910 -7.02720 -8.04090 +-8.60950 -8.27740 -7.10120 -5.12040 + +# 15.00 +-3.17420 -4.66830 -6.17790 -7.26760 -8.22560 +-8.32120 -7.64880 -7.00240 -4.77210 -5.65380 +-5.36790 -4.43640 -4.37720 -4.45280 -4.47980 +-4.07260 -6.75420 -7.56910 -7.95830 -7.87760 +-7.88160 -7.29010 -7.15600 -5.19260 + +# 30.00 +-2.96240 -4.87720 -6.64930 -7.95180 -8.47610 +-7.49950 -6.26260 -6.35040 -4.34190 -4.49790 +-4.27480 -1.75620 -3.89990 -3.81400 -3.99610 +-6.66430 -7.66400 -7.80660 -7.21980 -6.83750 +-6.88220 -7.10200 -5.10200 -2.38920 + +# 45 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 + +# 60 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 + +# 75 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 + +# 90 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 + +# 105 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 + +# 120 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 + +# 135 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 + +# 150 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 + +# 165 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 + +# 2 adjacent prolines, type 4 + +# -180.00 +-4.60660 -4.28920 -4.51420 -5.49210 -6.65460 +-7.18530 -7.63320 -8.41920 -9.12510 -8.97830 +-9.02750 -8.88890 -8.61060 -8.10240 -7.96680 +-7.98860 -7.96190 -7.56330 -7.73950 -8.31580 +-9.33380 -9.61880 -7.91860 -6.00570 + +# -165.00 +-3.21030 -2.90350 -3.04340 -3.83720 -4.92360 +-5.41790 -5.78320 -6.62490 -7.17820 -7.59500 +-7.60980 -7.39440 -6.68190 -6.24950 -5.83810 +-5.90510 -5.57900 -4.89950 -5.18840 -6.13180 +-6.93510 -7.49160 -5.84410 -4.48890 + +# -150.00 +-2.23750 -2.26520 -2.55120 -3.67610 -4.61620 +-5.01560 -5.36920 -5.93110 -6.16820 -6.48830 +-6.54220 -6.14310 -5.33350 -4.85090 -4.50790 +-4.44050 -4.34380 -4.13820 -4.35620 -5.24880 +-6.05280 -6.18610 -4.80390 -3.41730 + +# -135.00 +-2.12830 -2.02010 -2.90220 -3.88240 -4.63610 +-5.02000 -5.46090 -5.79830 -5.63220 -6.41490 +-6.20330 -5.57550 -4.58160 -4.15850 -4.00710 +-3.95020 -3.76880 -4.09690 -4.52680 -5.33410 +-5.97380 -5.68710 -4.70040 -3.33790 + +# -120.00 +-2.20610 -2.22370 -2.85110 -3.55370 -4.33320 +-4.57860 -4.95030 -5.23950 -5.37730 -6.14740 +-5.98660 -5.17760 -4.16090 -3.78450 -3.83210 +-3.86590 -4.21340 -4.26250 -4.16200 -4.62160 +-5.47440 -5.38280 -4.39100 -3.16760 + +# -105.00 +-1.32980 -1.44660 -2.00420 -2.84440 -3.31580 +-3.15410 -2.83060 -3.04980 -4.04810 -5.02030 +-4.84090 -3.88520 -2.79540 -2.49190 -2.65990 +-3.34670 -3.60580 -3.76970 -4.07430 -4.21930 +-4.66740 -4.23940 -3.37160 -2.10050 + +# -90.00 +-0.27400 -0.41780 -0.92340 -1.48470 -1.84370 +-1.42480 -1.14210 -1.83280 -2.97900 -3.57000 +-3.33310 -2.24200 -1.31350 -0.96640 0.38300 +-0.57540 -0.74080 -0.59130 -0.41960 -2.64120 +-3.25380 -2.85540 -2.09970 -0.95660 + +# -75.00 + 0.26880 0.18190 0.00300 -0.45390 -0.24210 + 0.21240 0.33320 -0.95520 -2.17670 -2.66490 +-2.24910 -1.35480 -0.35030 1.84000 0.81880 + 0.41530 0.58460 0.65350 0.54960 0.41300 + 0.23350 -2.13490 -1.54900 -0.38340 + +# -60.00 +-0.48820 -0.40730 -0.25210 -0.20490 0.53370 + 1.05990 0.72540 -0.68300 -2.10190 -2.83530 +-2.55500 -1.33940 -0.24710 1.63190 1.10600 + 1.16350 1.30720 1.49310 1.16160 0.99320 +-2.33360 -2.59380 -2.01110 -1.46840 + +# -45.00 +-2.41010 -1.30740 -0.85960 -0.06830 0.20500 + 0.00650 -0.59750 -2.39820 -3.98270 -4.46610 +-3.51230 -1.99330 0.96050 0.80870 0.64450 + 0.82590 1.00550 1.28110 0.96670 -2.71140 +-4.18330 -4.83370 -4.49950 -3.47920 + +# -30.00 +-3.46300 -2.06680 -0.84260 -0.70440 -1.85140 +-2.59990 -3.62600 -5.08050 -6.35480 -6.08340 +-4.78650 -1.24210 -0.81660 -0.60170 -0.50040 +-0.41020 -0.28450 -0.14620 -3.14950 -5.16280 +-6.81940 -7.52060 -7.12480 -5.49420 + +# -15.00 +-2.70550 -1.11410 -0.82120 -3.80470 -4.50780 +-4.64960 -5.78530 -7.04450 -7.30810 -6.56450 +-3.47860 -2.68630 -1.78120 -1.48400 -1.45930 +-1.43060 -5.75320 -2.72500 -6.45790 -8.16530 +-9.86330 -9.80710 -8.62670 -6.49690 + +# 0.00 +-2.73190 -3.83060 -5.26960 -5.91610 -6.71690 +-7.05420 -7.77520 -7.81220 -7.54160 -4.98400 +-5.05070 -4.28910 -3.78740 -3.64600 -3.91990 +-3.55740 -3.03470 -5.78910 -7.02720 -8.04090 +-8.60950 -8.27740 -7.10120 -5.12040 + +# 15.00 +-3.17420 -4.66830 -6.17790 -7.26760 -8.22560 +-8.32120 -7.64880 -7.00240 -4.77210 -5.65380 +-5.36790 -4.43640 -4.37720 -4.45280 -4.47980 +-4.07260 -6.75420 -7.56910 -7.95830 -7.87760 +-7.88160 -7.29010 -7.15600 -5.19260 + +# 30.00 +-2.96240 -4.87720 -6.64930 -7.95180 -8.47610 +-7.49950 -6.26260 -6.35040 -4.34190 -4.49790 +-4.27480 -1.75620 -3.89990 -3.81400 -3.99610 +-6.66430 -7.66400 -7.80660 -7.21980 -6.83750 +-6.88220 -7.10200 -5.10200 -2.38920 + +# 45 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 + +# 60 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 + +# 75 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 + +# 90 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 + +# 105 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 + +# 120 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 + +# 135 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 + +# 150 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 + +# 165 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 0.000000 +0.000000 0.000000 0.000000 0.000000 + +# glycine map, type 5 + +# -180 +-0.549160 -0.535500 -0.588110 -0.754620 -0.679290 +-0.038150 0.298460 0.326040 -0.375610 -1.704360 +-3.061280 -3.956460 -3.576280 -1.038930 2.012450 +-1.714610 -0.377660 0.317310 0.294580 -0.042920 +-0.676620 -0.744600 -0.586590 -0.554770 + +# -165 +-0.709450 -0.896700 -0.990850 -1.319240 -0.940260 +-0.126160 0.329180 0.258100 -0.534910 -1.715700 +-2.780320 -3.153350 -1.636020 1.822690 -2.675640 +-1.810120 -0.410680 0.180860 0.196710 -0.000430 +-0.271890 -0.462500 -0.348750 -0.477660 + +# -150 +-1.224850 -1.482430 -1.665900 -1.656770 -1.119780 +-1.642540 -0.054220 -0.290670 -0.887080 -1.626260 +-2.165440 -1.546500 0.753400 -2.949180 -2.225630 +-1.664160 -0.628990 0.000490 0.033160 -0.092820 +-0.339050 -0.563330 -0.794980 -0.710760 + +# -135 +-1.787640 -2.117750 -2.143020 -1.803720 -1.567160 +-0.886880 -0.801350 -0.851590 -1.020630 -1.337360 +-1.062570 0.338010 -4.372310 -2.435890 -2.220710 +-1.718060 -0.758950 -0.207560 0.100910 -0.055650 +-0.288370 -0.880610 -1.267450 -1.465530 + +# -120 +-2.348270 -2.593790 -2.596140 -2.364070 -1.970070 +-1.705860 -1.435540 -1.289220 -1.358170 -0.975570 +-3.514390 -4.283210 -3.975820 -3.215190 -2.394430 +-1.455320 -0.553910 -0.158900 -0.173830 -0.297950 +-0.661220 -1.068330 -1.601800 -1.914850 + +# -105 +-2.788800 -3.079570 -3.178150 -3.013710 -2.626630 +-2.266680 -1.951490 -1.681850 -1.195390 -2.567680 +-3.632800 -4.748210 -4.662850 -4.255190 -2.776760 +-1.695490 -0.893140 -0.633810 -0.467320 -0.540540 +-0.950190 -1.401500 -1.959970 -2.412680 + +# -90 +-3.857170 -3.713610 -3.902110 -3.611370 -3.040850 +-2.406460 -1.975250 -1.452040 -0.971860 -2.808170 +-4.181160 -4.981430 -5.446890 -4.359900 -2.864390 +-1.898510 -1.139090 -0.971340 -1.065550 -1.020680 +-1.141350 -1.794480 -2.420970 -2.939990 + +# -75 +-4.987770 -4.995210 -4.485310 -3.892550 -3.228630 +-2.345360 -1.664160 -1.105500 -1.945510 -3.715530 +-4.492140 -5.536170 -5.708500 -3.675410 -2.986660 +-1.859410 -0.756620 -1.269930 -1.312730 -1.607440 +-1.892510 -2.659400 -3.347950 -3.970600 + +# -60 +-6.183650 -5.456080 -4.878940 -4.000820 -2.683230 +-2.067520 -1.094850 -1.119790 -2.962910 -3.687830 +-4.993340 -4.666260 -3.796280 -3.374140 -2.495430 +-1.453990 -0.877560 -1.002930 -1.337310 -2.431360 +-2.948140 -4.008100 -4.821040 -5.565810 + +# -45 +-6.755760 -5.850030 -4.362190 -2.714090 -1.708710 +-0.526660 -0.536700 -2.037170 -3.892650 -4.558570 +-4.237410 -3.735160 -3.688580 -3.009910 -2.112940 +-1.455400 -0.925490 -1.121840 -1.561900 -2.751370 +-4.094860 -5.207530 -6.128530 -6.613030 + +# -30 +-5.716250 -4.434060 -2.788600 -0.974400 -0.729200 +-0.904940 -1.833540 -3.017700 -3.313450 -3.336010 +-3.181640 -3.594720 -1.231370 -0.603790 0.128810 +-1.222610 -0.909150 -0.837700 -1.346820 -3.040880 +-4.731110 -5.844860 -6.428460 -6.424880 + +# -15 +-3.991110 -2.046000 0.082550 -2.676110 -2.828500 +-2.596640 -2.843330 -3.011480 -2.312640 -2.405980 +-3.086210 -1.164620 -1.231660 -0.871900 -0.348980 +-1.735900 -0.914150 -0.484520 -1.818040 -3.602550 +-5.330320 -5.992270 -5.588080 -5.408360 + +# 0 +-1.147060 -3.317730 -4.305100 -4.615200 -4.533780 +-3.622950 -2.832800 -1.872810 -1.144300 -1.994070 +-0.741980 -1.115010 -1.229250 -1.103680 -0.742430 +-1.973970 -1.070020 -1.802220 -2.712770 -3.624130 +-4.537100 -4.619970 -4.310890 -3.318290 + +# 15 +-3.997710 -5.408360 -5.588080 -5.992270 -5.330320 +-3.602550 -1.818040 -0.484520 -0.914150 -1.735900 +-0.348980 -0.871900 -1.231660 -1.164620 -3.086210 +-2.405980 -2.312640 -3.011480 -2.843330 -2.596640 +-2.828500 -2.676110 0.082550 -2.046000 + +# 30 +-5.710850 -6.424880 -6.428460 -5.844860 -4.731110 +-3.040880 -1.346820 -0.837700 -0.909150 -1.222610 +0.128810 -0.603790 -1.231370 -3.594720 -3.181640 +-3.336010 -3.313450 -3.017700 -1.833540 -0.904940 +-0.729200 -0.974400 -2.788600 -4.434060 + +# 45 +-6.754940 -6.613030 -6.128530 -5.207530 -4.094860 +-2.751370 -1.561900 -1.121840 -0.925490 -1.455400 +-2.112940 -3.009910 -3.688580 -3.735160 -4.237410 +-4.558570 -3.892650 -2.037170 -0.536700 -0.526660 +-1.708710 -2.714090 -4.362190 -5.850030 + +# 60 +-6.188070 -5.565810 -4.821040 -4.008100 -2.948140 +-2.431360 -1.337310 -1.002930 -0.877560 -1.453990 +-2.495430 -3.374140 -3.796280 -4.666260 -4.993340 +-3.687830 -2.962910 -1.119790 -1.094850 -2.067520 +-2.683230 -4.000820 -4.878940 -5.456080 + +# 75 +-4.986080 -3.970600 -3.347950 -2.659400 -1.892510 +-1.607440 -1.312730 -1.269930 -0.756620 -1.859410 +-2.986660 -3.675410 -5.708500 -5.536170 -4.492140 +-3.715530 -1.945510 -1.105500 -1.664160 -2.345360 +-3.228630 -3.892550 -4.485310 -4.995210 + +# 90 +-3.879190 -2.939990 -2.420970 -1.794480 -1.141350 +-1.020680 -1.065550 -0.971340 -1.139090 -1.898510 +-2.864390 -4.359900 -5.446890 -4.981430 -4.181160 +-2.808170 -0.971860 -1.452040 -1.975250 -2.406460 +-3.040850 -3.611370 -3.902110 -3.713610 + +# 105 +-2.793280 -2.412680 -1.959970 -1.401500 -0.950190 +-0.540540 -0.467320 -0.633810 -0.893140 -1.695490 +-2.776760 -4.255190 -4.662850 -4.448210 -3.332800 +-2.567680 -1.195390 -1.681850 -1.951490 -2.266680 +-2.626630 -3.013710 -3.178150 -3.079570 + +# 120 +-2.330190 -1.914850 -1.601800 -1.068330 -0.661220 +-0.297950 -0.173830 -0.158900 -0.553910 -1.455320 +-2.394430 -3.215190 -3.975820 -3.783210 -3.014390 +-0.975570 -1.358170 -1.289220 -1.435540 -1.705860 +-1.970070 -2.364070 -2.596140 -2.593790 + +# 135 +-1.796120 -1.465530 -1.267450 -0.880610 -0.288370 +-0.055650 0.100910 -0.207560 -0.758950 -1.718060 +-2.220710 -2.435890 -4.372310 0.338010 -1.062570 +-1.337360 -1.020630 -0.851590 -0.801350 -0.886880 +-1.567160 -1.803720 -2.143020 -2.117750 + +# 150 +-1.263610 -0.710760 -0.794980 -0.563330 -0.339050 +-0.092820 0.033160 0.000490 -0.628990 -1.664160 +-2.225630 -2.949180 0.753400 -1.546500 -2.165440 +-1.626260 -0.887080 -0.290670 -0.054220 -1.642540 +-1.119780 -1.656770 -1.665900 -1.482430 + +# 165 +-0.684660 -0.477660 -0.348750 -0.462500 -0.271890 +-0.000430 0.196710 0.180860 -0.410680 -1.810120 +-2.675640 1.822690 -1.636020 -3.153350 -2.780320 +-1.715700 -0.534910 0.258100 0.329180 -0.126160 +-0.940260 -1.319240 -0.990850 -0.896700 + +# glycine before proline map, type 6 + +# -180 +-0.549160 -0.535500 -0.588110 -0.754620 -0.679290 +-0.038150 0.298460 0.326040 -0.375610 -1.704360 +-3.061280 -3.956460 -3.576280 -1.038930 2.012450 +-1.714610 -0.377660 0.317310 0.294580 -0.042920 +-0.676620 -0.744600 -0.586590 -0.554770 + +# -165 +-0.709450 -0.896700 -0.990850 -1.319240 -0.940260 +-0.126160 0.329180 0.258100 -0.534910 -1.715700 +-2.780320 -3.153350 -1.636020 1.822690 -2.675640 +-1.810120 -0.410680 0.180860 0.196710 -0.000430 +-0.271890 -0.462500 -0.348750 -0.477660 + +# -150 +-1.224850 -1.482430 -1.665900 -1.656770 -1.119780 +-1.642540 -0.054220 -0.290670 -0.887080 -1.626260 +-2.165440 -1.546500 0.753400 -2.949180 -2.225630 +-1.664160 -0.628990 0.000490 0.033160 -0.092820 +-0.339050 -0.563330 -0.794980 -0.710760 + +# -135 +-1.787640 -2.117750 -2.143020 -1.803720 -1.567160 +-0.886880 -0.801350 -0.851590 -1.020630 -1.337360 +-1.062570 0.338010 -4.372310 -2.435890 -2.220710 +-1.718060 -0.758950 -0.207560 0.100910 -0.055650 +-0.288370 -0.880610 -1.267450 -1.465530 + +# -120 +-2.348270 -2.593790 -2.596140 -2.364070 -1.970070 +-1.705860 -1.435540 -1.289220 -1.358170 -0.975570 +-3.514390 -4.283210 -3.975820 -3.215190 -2.394430 +-1.455320 -0.553910 -0.158900 -0.173830 -0.297950 +-0.661220 -1.068330 -1.601800 -1.914850 + +# -105 +-2.788800 -3.079570 -3.178150 -3.013710 -2.626630 +-2.266680 -1.951490 -1.681850 -1.195390 -2.567680 +-3.632800 -4.748210 -4.662850 -4.255190 -2.776760 +-1.695490 -0.893140 -0.633810 -0.467320 -0.540540 +-0.950190 -1.401500 -1.959970 -2.412680 + +# -90 +-3.857170 -3.713610 -3.902110 -3.611370 -3.040850 +-2.406460 -1.975250 -1.452040 -0.971860 -2.808170 +-4.181160 -4.981430 -5.446890 -4.359900 -2.864390 +-1.898510 -1.139090 -0.971340 -1.065550 -1.020680 +-1.141350 -1.794480 -2.420970 -2.939990 + +# -75 +-4.987770 -4.995210 -4.485310 -3.892550 -3.228630 +-2.345360 -1.664160 -1.105500 -1.945510 -3.715530 +-4.492140 -5.536170 -5.708500 -3.675410 -2.986660 +-1.859410 -0.756620 -1.269930 -1.312730 -1.607440 +-1.892510 -2.659400 -3.347950 -3.970600 + +# -60 +-6.183650 -5.456080 -4.878940 -4.000820 -2.683230 +-2.067520 -1.094850 -1.119790 -2.962910 -3.687830 +-4.993340 -4.666260 -3.796280 -3.374140 -2.495430 +-1.453990 -0.877560 -1.002930 -1.337310 -2.431360 +-2.948140 -4.008100 -4.821040 -5.565810 + +# -45 +-6.755760 -5.850030 -4.362190 -2.714090 -1.708710 +-0.526660 -0.536700 -2.037170 -3.892650 -4.558570 +-4.237410 -3.735160 -3.688580 -3.009910 -2.112940 +-1.455400 -0.925490 -1.121840 -1.561900 -2.751370 +-4.094860 -5.207530 -6.128530 -6.613030 + +# -30 +-5.716250 -4.434060 -2.788600 -0.974400 -0.729200 +-0.904940 -1.833540 -3.017700 -3.313450 -3.336010 +-3.181640 -3.594720 -1.231370 -0.603790 0.128810 +-1.222610 -0.909150 -0.837700 -1.346820 -3.040880 +-4.731110 -5.844860 -6.428460 -6.424880 + +# -15 +-3.991110 -2.046000 0.082550 -2.676110 -2.828500 +-2.596640 -2.843330 -3.011480 -2.312640 -2.405980 +-3.086210 -1.164620 -1.231660 -0.871900 -0.348980 +-1.735900 -0.914150 -0.484520 -1.818040 -3.602550 +-5.330320 -5.992270 -5.588080 -5.408360 + +# 0 +-1.147060 -3.317730 -4.305100 -4.615200 -4.533780 +-3.622950 -2.832800 -1.872810 -1.144300 -1.994070 +-0.741980 -1.115010 -1.229250 -1.103680 -0.742430 +-1.973970 -1.070020 -1.802220 -2.712770 -3.624130 +-4.537100 -4.619970 -4.310890 -3.318290 + +# 15 +-3.997710 -5.408360 -5.588080 -5.992270 -5.330320 +-3.602550 -1.818040 -0.484520 -0.914150 -1.735900 +-0.348980 -0.871900 -1.231660 -1.164620 -3.086210 +-2.405980 -2.312640 -3.011480 -2.843330 -2.596640 +-2.828500 -2.676110 0.082550 -2.046000 + +# 30 +-5.710850 -6.424880 -6.428460 -5.844860 -4.731110 +-3.040880 -1.346820 -0.837700 -0.909150 -1.222610 +0.128810 -0.603790 -1.231370 -3.594720 -3.181640 +-3.336010 -3.313450 -3.017700 -1.833540 -0.904940 +-0.729200 -0.974400 -2.788600 -4.434060 + +# 45 +-6.754940 -6.613030 -6.128530 -5.207530 -4.094860 +-2.751370 -1.561900 -1.121840 -0.925490 -1.455400 +-2.112940 -3.009910 -3.688580 -3.735160 -4.237410 +-4.558570 -3.892650 -2.037170 -0.536700 -0.526660 +-1.708710 -2.714090 -4.362190 -5.850030 + +# 60 +-6.188070 -5.565810 -4.821040 -4.008100 -2.948140 +-2.431360 -1.337310 -1.002930 -0.877560 -1.453990 +-2.495430 -3.374140 -3.796280 -4.666260 -4.993340 +-3.687830 -2.962910 -1.119790 -1.094850 -2.067520 +-2.683230 -4.000820 -4.878940 -5.456080 + +# 75 +-4.986080 -3.970600 -3.347950 -2.659400 -1.892510 +-1.607440 -1.312730 -1.269930 -0.756620 -1.859410 +-2.986660 -3.675410 -5.708500 -5.536170 -4.492140 +-3.715530 -1.945510 -1.105500 -1.664160 -2.345360 +-3.228630 -3.892550 -4.485310 -4.995210 + +# 90 +-3.879190 -2.939990 -2.420970 -1.794480 -1.141350 +-1.020680 -1.065550 -0.971340 -1.139090 -1.898510 +-2.864390 -4.359900 -5.446890 -4.981430 -4.181160 +-2.808170 -0.971860 -1.452040 -1.975250 -2.406460 +-3.040850 -3.611370 -3.902110 -3.713610 + +# 105 +-2.793280 -2.412680 -1.959970 -1.401500 -0.950190 +-0.540540 -0.467320 -0.633810 -0.893140 -1.695490 +-2.776760 -4.255190 -4.662850 -4.448210 -3.332800 +-2.567680 -1.195390 -1.681850 -1.951490 -2.266680 +-2.626630 -3.013710 -3.178150 -3.079570 + +# 120 +-2.330190 -1.914850 -1.601800 -1.068330 -0.661220 +-0.297950 -0.173830 -0.158900 -0.553910 -1.455320 +-2.394430 -3.215190 -3.975820 -3.783210 -3.014390 +-0.975570 -1.358170 -1.289220 -1.435540 -1.705860 +-1.970070 -2.364070 -2.596140 -2.593790 + +# 135 +-1.796120 -1.465530 -1.267450 -0.880610 -0.288370 +-0.055650 0.100910 -0.207560 -0.758950 -1.718060 +-2.220710 -2.435890 -4.372310 0.338010 -1.062570 +-1.337360 -1.020630 -0.851590 -0.801350 -0.886880 +-1.567160 -1.803720 -2.143020 -2.117750 + +# 150 +-1.263610 -0.710760 -0.794980 -0.563330 -0.339050 +-0.092820 0.033160 0.000490 -0.628990 -1.664160 +-2.225630 -2.949180 0.753400 -1.546500 -2.165440 +-1.626260 -0.887080 -0.290670 -0.054220 -1.642540 +-1.119780 -1.656770 -1.665900 -1.482430 + +# 165 +-0.684660 -0.477660 -0.348750 -0.462500 -0.271890 +-0.000430 0.196710 0.180860 -0.410680 -1.810120 +-2.675640 1.822690 -1.636020 -3.153350 -2.780320 +-1.715700 -0.534910 0.258100 0.329180 -0.126160 +-0.940260 -1.319240 -0.990850 -0.896700 + diff --git a/examples/cmap/gagg.data b/examples/cmap/gagg.data new file mode 100644 index 0000000000000000000000000000000000000000..fd2aa193c4450f998cc7e265621cb1688c967eb7 --- /dev/null +++ b/examples/cmap/gagg.data @@ -0,0 +1,380 @@ +Created by charmm2lammps v1.8.2.6 beta on Sun Mar 20 00:26:35 EDT 2016 + + 34 atoms + 33 bonds + 57 angles + 75 dihedrals + 7 impropers + 2 crossterms + + 13 atom types + 15 bond types + 30 angle types + 42 dihedral types + 5 improper types + + -34.414709 45.585291 xlo xhi + -36.134827 43.865173 ylo yhi + -39.349142 40.650858 zlo zhi + +Masses + + 1 1.008 # H + 2 1.008 # HC + 3 1.008 # HA + 4 1.008 # HB + 5 12.011 # C + 6 12.011 # CT1 + 7 12.011 # CT2 + 8 12.011 # CT3 + 9 12.011 # CC + 10 14.007 # NH1 + 11 14.007 # NH3 + 12 15.999 # O + 13 15.999 # OC + +Pair Coeffs + + 1 0.046 0.400013524445 0.046 0.400013524445 # H + 2 0.046 0.400013524445 0.046 0.400013524445 # HC + 3 0.022 2.35197261589 0.022 2.35197261589 # HA + 4 0.022 2.35197261589 0.022 2.35197261589 # HB + 5 0.11 3.56359487256 0.11 3.56359487256 # C + 6 0.02 4.05358916754 0.01 3.38541512893 # CT1 + 7 0.055 3.87540942391 0.01 3.38541512893 # CT2 + 8 0.08 3.67050271874 0.01 3.38541512893 # CT3 + 9 0.07 3.56359487256 0.07 3.56359487256 # CC + 10 0.2 3.29632525712 0.2 2.76178602624 # NH1 + 11 0.2 3.29632525712 0.2 3.29632525712 # NH3 + 12 0.12 3.02905564168 0.12 2.49451641079 # O + 13 0.12 3.02905564168 0.12 3.02905564168 # OC + +Atoms + + 1 1 11 -0.3 0.0088076654 -0.0395361015 -0.0125765907 # NH3 + 2 1 2 0.33 -0.3781208354 -1.0038773849 -0.01724272 # HC + 3 1 2 0.33 -0.3448285543 0.4901827566 -0.8403800387 # HC + 4 1 2 0.33 -0.3306420078 0.4732826156 0.8294424358 # HC + 5 1 7 0.13 1.526230489 -0.0164860529 -0.0402820599 # CT2 + 6 1 4 0.09 1.8596639218 -0.5263587482 -0.9333647137 # HB + 7 1 4 0.09 1.8904342902 -0.4510777655 0.8809945249 # HB + 8 1 5 0.51 2.0135471936 1.4020233344 -0.1137107587 # C + 9 1 12 -0.51 1.1818164992 2.2781068718 -0.313197467 # O + 10 2 10 -0.47 3.3194424268 1.666672014 0.0713249543 # NH1 + 11 2 1 0.31 4.0409429153 0.9783582555 0.1693897169 # H + 12 2 6 0.07 3.8529467728 3.0161771739 0.0690818527 # CT1 + 13 2 4 0.09 3.5315723829 3.5134434764 -0.8378950509 # HB + 14 2 8 -0.27 3.3981217437 3.8178727883 1.3071600161 # CT3 + 15 2 3 0.09 2.2921877645 3.9163330652 1.3111957959 # HA + 16 2 3 0.09 3.7142964083 3.3104118688 2.2424399743 # HA + 17 2 3 0.09 3.8238672849 4.8446179852 1.2978564897 # HA + 18 2 5 0.51 5.3731873136 2.946062408 0.0042414688 # C + 19 2 12 -0.51 5.9268816775 1.8488403755 0.0011766847 # O + 20 3 10 -0.47 6.0445386951 4.1111769168 -0.0636349698 # NH1 + 21 3 1 0.31 5.5768514013 4.9972489389 -0.0653583036 # H + 22 3 7 -0.02 7.4911642129 4.2772062416 -0.0346088891 # CT2 + 23 3 4 0.09 7.9218377956 3.8786283786 -0.9407244447 # HB + 24 3 4 0.09 7.8877470687 3.8607990619 0.8803359097 # HB + 25 3 5 0.51 7.7351287723 5.7597169026 -0.0088736611 # C + 26 3 12 -0.51 6.7657462979 6.5189223559 0.005150418 # O + 27 4 10 -0.47 9.0014031015 6.1940849758 -0.0045995102 # NH1 + 28 4 1 0.31 9.8272711181 5.6225413025 -0.008448093 # H + 29 4 7 -0.02 9.4067557288 7.5845263022 0.0016383819 # CT2 + 30 4 4 0.09 9.0736276253 8.0578903151 0.9119901724 # HB + 31 4 4 0.09 9.0736165596 8.064051906 -0.9055419386 # HB + 32 4 9 0.34 10.9382207556 7.612479283 0.0008762597 # CC + 33 4 13 -0.67 11.5487033003 6.5062943609 -0.0007524693 # OC + 34 4 13 -0.67 11.5055524841 8.734223435 0.0013684148 # OC + +Bond Coeffs + + 1 250 1.49 # C CT1 + 2 250 1.49 # C CT2 + 3 370 1.345 # C NH1 + 4 620 1.23 # C O + 5 200 1.522 # CC CT2 + 6 525 1.26 # CC OC + 7 222.5 1.538 # CT1 CT3 + 8 330 1.08 # CT1 HB + 9 320 1.43 # CT1 NH1 + 10 330 1.08 # CT2 HB + 11 320 1.43 # CT2 NH1 + 12 200 1.48 # CT2 NH3 + 13 322 1.111 # CT3 HA + 14 440 0.997 # H NH1 + 15 403 1.04 # HC NH3 + +Bonds + + 1 15 2 1 # HC NH3 + 2 15 3 1 # HC NH3 + 3 15 4 1 # HC NH3 + 4 12 1 5 # CT2 NH3 + 5 2 8 5 # C CT2 + 6 3 8 10 # C NH1 + 7 10 5 6 # CT2 HB + 8 10 5 7 # CT2 HB + 9 4 9 8 # C O + 10 7 14 12 # CT1 CT3 + 11 14 10 11 # H NH1 + 12 9 10 12 # CT1 NH1 + 13 1 18 12 # C CT1 + 14 3 18 20 # C NH1 + 15 8 12 13 # CT1 HB + 16 13 14 15 # CT3 HA + 17 13 14 16 # CT3 HA + 18 13 14 17 # CT3 HA + 19 4 19 18 # C O + 20 14 20 21 # H NH1 + 21 11 20 22 # CT2 NH1 + 22 2 25 22 # C CT2 + 23 3 25 27 # C NH1 + 24 10 22 23 # CT2 HB + 25 10 22 24 # CT2 HB + 26 4 26 25 # C O + 27 14 27 28 # H NH1 + 28 11 27 29 # CT2 NH1 + 29 5 32 29 # CC CT2 + 30 10 29 30 # CT2 HB + 31 10 29 31 # CT2 HB + 32 6 32 34 # CC OC + 33 6 32 33 # CC OC + +Angle Coeffs + + 1 52 108 0 0 # C CT1 CT3 + 2 50 109.5 0 0 # C CT1 HB + 3 50 107 0 0 # C CT1 NH1 + 4 50 109.5 0 0 # C CT2 HB + 5 50 107 0 0 # C CT2 NH1 + 6 43.7 110 0 0 # C CT2 NH3 + 7 50 120 0 0 # C NH1 CT1 + 8 50 120 0 0 # C NH1 CT2 + 9 34 123 0 0 # C NH1 H + 10 50 109.5 0 0 # CC CT2 HB + 11 50 107 0 0 # CC CT2 NH1 + 12 80 116.5 0 0 # CT1 C NH1 + 13 80 121 0 0 # CT1 C O + 14 33.43 110.1 22.53 2.179 # CT1 CT3 HA + 15 35 117 0 0 # CT1 NH1 H + 16 80 116.5 0 0 # CT2 C NH1 + 17 80 121 0 0 # CT2 C O + 18 40 118 50 2.388 # CT2 CC OC + 19 35 117 0 0 # CT2 NH1 H + 20 30 109.5 20 2.074 # CT2 NH3 HC + 21 35 111 0 0 # CT3 CT1 HB + 22 70 113.5 0 0 # CT3 CT1 NH1 + 23 35.5 108.4 5.4 1.802 # HA CT3 HA + 24 48 108 0 0 # HB CT1 NH1 + 25 36 115 0 0 # HB CT2 HB + 26 48 108 0 0 # HB CT2 NH1 + 27 51.5 107.5 0 0 # HB CT2 NH3 + 28 44 109.5 0 0 # HC NH3 HC + 29 80 122.5 0 0 # NH1 C O + 30 100 124 70 2.225 # OC CC OC + +Angles + + 1 28 2 1 3 # HC NH3 HC + 2 28 2 1 4 # HC NH3 HC + 3 20 2 1 5 # CT2 NH3 HC + 4 28 3 1 4 # HC NH3 HC + 5 20 3 1 5 # CT2 NH3 HC + 6 20 4 1 5 # CT2 NH3 HC + 7 27 1 5 6 # HB CT2 NH3 + 8 27 1 5 7 # HB CT2 NH3 + 9 6 1 5 8 # C CT2 NH3 + 10 25 6 5 7 # HB CT2 HB + 11 4 6 5 8 # C CT2 HB + 12 4 7 5 8 # C CT2 HB + 13 17 5 8 9 # CT2 C O + 14 16 5 8 10 # CT2 C NH1 + 15 29 9 8 10 # NH1 C O + 16 9 8 10 11 # C NH1 H + 17 7 8 10 12 # C NH1 CT1 + 18 15 11 10 12 # CT1 NH1 H + 19 24 10 12 13 # HB CT1 NH1 + 20 22 10 12 14 # CT3 CT1 NH1 + 21 3 10 12 18 # C CT1 NH1 + 22 21 13 12 14 # CT3 CT1 HB + 23 2 13 12 18 # C CT1 HB + 24 1 14 12 18 # C CT1 CT3 + 25 14 12 14 15 # CT1 CT3 HA + 26 14 12 14 16 # CT1 CT3 HA + 27 14 12 14 17 # CT1 CT3 HA + 28 23 15 14 16 # HA CT3 HA + 29 23 15 14 17 # HA CT3 HA + 30 23 16 14 17 # HA CT3 HA + 31 13 12 18 19 # CT1 C O + 32 12 12 18 20 # CT1 C NH1 + 33 29 19 18 20 # NH1 C O + 34 9 18 20 21 # C NH1 H + 35 8 18 20 22 # C NH1 CT2 + 36 19 21 20 22 # CT2 NH1 H + 37 26 20 22 23 # HB CT2 NH1 + 38 26 20 22 24 # HB CT2 NH1 + 39 5 20 22 25 # C CT2 NH1 + 40 25 23 22 24 # HB CT2 HB + 41 4 23 22 25 # C CT2 HB + 42 4 24 22 25 # C CT2 HB + 43 17 22 25 26 # CT2 C O + 44 16 22 25 27 # CT2 C NH1 + 45 29 26 25 27 # NH1 C O + 46 9 25 27 28 # C NH1 H + 47 8 25 27 29 # C NH1 CT2 + 48 19 28 27 29 # CT2 NH1 H + 49 26 27 29 30 # HB CT2 NH1 + 50 26 27 29 31 # HB CT2 NH1 + 51 11 27 29 32 # CC CT2 NH1 + 52 25 30 29 31 # HB CT2 HB + 53 10 30 29 32 # CC CT2 HB + 54 10 31 29 32 # CC CT2 HB + 55 18 29 32 33 # CT2 CC OC + 56 18 29 32 34 # CT2 CC OC + 57 30 33 32 34 # OC CC OC + +Dihedral Coeffs + + 1 0.2 3 0 1 # C CT1 CT3 HA + 2 0.2 1 180 1 # C CT1 NH1 C + 3 0 1 0 1 # C CT1 NH1 H + 4 0.2 1 180 1 # C CT2 NH1 C + 5 0 1 0 1 # C CT2 NH1 H + 6 0.1 3 0 1 # C CT2 NH3 HC + 7 1.8 1 0 1 # C NH1 CT1 CT3 + 8 0 1 0 1 # C NH1 CT1 HB + 9 0.2 1 180 1 # C NH1 CT2 CC + 10 0 1 0 1 # C NH1 CT2 HB + 11 0 1 0 1 # CC CT2 NH1 H + 12 1.6 1 0 1 # CT1 C NH1 CT2 + 13 2.5 2 180 0 # CT1 C NH1 CT2 + 14 2.5 2 180 1 # CT1 C NH1 H + 15 1.6 1 0 1 # CT1 NH1 C CT2 + 16 2.5 2 180 0 # CT1 NH1 C CT2 + 17 2.5 2 180 1 # CT1 NH1 C O + 18 1.6 1 0 1 # CT2 C NH1 CT2 + 19 2.5 2 180 0 # CT2 C NH1 CT2 + 20 2.5 2 180 1 # CT2 C NH1 H + 21 2.5 2 180 1 # CT2 NH1 C O + 22 0 1 0 1 # CT3 CT1 C NH1 + 23 1.4 1 0 1 # CT3 CT1 C O + 24 0 1 0 1 # CT3 CT1 NH1 H + 25 2.5 2 180 1 # H NH1 C O + 26 0 1 0 1 # H NH1 CT1 HB + 27 0 1 0 1 # H NH1 CT2 HB + 28 0.2 3 0 1 # HA CT3 CT1 HB + 29 0.2 3 0 1 # HA CT3 CT1 NH1 + 30 0 1 0 1 # HB CT1 C NH1 + 31 0 1 0 1 # HB CT1 C O + 32 0 1 0 1 # HB CT2 C NH1 + 33 0 1 0 1 # HB CT2 C O + 34 0.05 6 180 1 # HB CT2 CC OC + 35 0.1 3 0 1 # HB CT2 NH3 HC + 36 0.6 1 0 1 # NH1 C CT1 NH1 + 37 0.6 1 0 1 # NH1 C CT2 NH1 + 38 0.4 1 0 1 # NH1 C CT2 NH3 + 39 0 1 0 1 # NH1 CT1 C O + 40 0 1 0 1 # NH1 CT2 C O + 41 0.05 6 180 1 # NH1 CT2 CC OC + 42 0 1 0 1 # NH3 CT2 C O + +Dihedrals + + 1 42 1 5 8 9 # NH3 CT2 C O + 2 38 1 5 8 10 # NH1 C CT2 NH3 + 3 35 2 1 5 6 # HB CT2 NH3 HC + 4 35 2 1 5 7 # HB CT2 NH3 HC + 5 6 2 1 5 8 # C CT2 NH3 HC + 6 35 3 1 5 6 # HB CT2 NH3 HC + 7 35 3 1 5 7 # HB CT2 NH3 HC + 8 6 3 1 5 8 # C CT2 NH3 HC + 9 35 4 1 5 6 # HB CT2 NH3 HC + 10 35 4 1 5 7 # HB CT2 NH3 HC + 11 6 4 1 5 8 # C CT2 NH3 HC + 12 20 5 8 10 11 # CT2 C NH1 H + 13 15 5 8 10 12 # CT1 NH1 C CT2 + 14 16 5 8 10 12 # CT1 NH1 C CT2 + 15 33 6 5 8 9 # HB CT2 C O + 16 32 6 5 8 10 # HB CT2 C NH1 + 17 33 7 5 8 9 # HB CT2 C O + 18 32 7 5 8 10 # HB CT2 C NH1 + 19 8 8 10 12 13 # C NH1 CT1 HB + 20 7 8 10 12 14 # C NH1 CT1 CT3 + 21 2 8 10 12 18 # C CT1 NH1 C + 22 25 9 8 10 11 # H NH1 C O + 23 17 9 8 10 12 # CT1 NH1 C O + 24 29 10 12 14 15 # HA CT3 CT1 NH1 + 25 29 10 12 14 16 # HA CT3 CT1 NH1 + 26 29 10 12 14 17 # HA CT3 CT1 NH1 + 27 39 10 12 18 19 # NH1 CT1 C O + 28 36 10 12 18 20 # NH1 C CT1 NH1 + 29 26 11 10 12 13 # H NH1 CT1 HB + 30 24 11 10 12 14 # CT3 CT1 NH1 H + 31 3 11 10 12 18 # C CT1 NH1 H + 32 14 12 18 20 21 # CT1 C NH1 H + 33 12 12 18 20 22 # CT1 C NH1 CT2 + 34 13 12 18 20 22 # CT1 C NH1 CT2 + 35 28 13 12 14 15 # HA CT3 CT1 HB + 36 28 13 12 14 16 # HA CT3 CT1 HB + 37 28 13 12 14 17 # HA CT3 CT1 HB + 38 31 13 12 18 19 # HB CT1 C O + 39 30 13 12 18 20 # HB CT1 C NH1 + 40 23 14 12 18 19 # CT3 CT1 C O + 41 22 14 12 18 20 # CT3 CT1 C NH1 + 42 1 15 14 12 18 # C CT1 CT3 HA + 43 1 16 14 12 18 # C CT1 CT3 HA + 44 1 17 14 12 18 # C CT1 CT3 HA + 45 10 18 20 22 23 # C NH1 CT2 HB + 46 10 18 20 22 24 # C NH1 CT2 HB + 47 4 18 20 22 25 # C CT2 NH1 C + 48 25 19 18 20 21 # H NH1 C O + 49 21 19 18 20 22 # CT2 NH1 C O + 50 40 20 22 25 26 # NH1 CT2 C O + 51 37 20 22 25 27 # NH1 C CT2 NH1 + 52 27 21 20 22 23 # H NH1 CT2 HB + 53 27 21 20 22 24 # H NH1 CT2 HB + 54 5 21 20 22 25 # C CT2 NH1 H + 55 20 22 25 27 28 # CT2 C NH1 H + 56 18 22 25 27 29 # CT2 C NH1 CT2 + 57 19 22 25 27 29 # CT2 C NH1 CT2 + 58 33 23 22 25 26 # HB CT2 C O + 59 32 23 22 25 27 # HB CT2 C NH1 + 60 33 24 22 25 26 # HB CT2 C O + 61 32 24 22 25 27 # HB CT2 C NH1 + 62 10 25 27 29 30 # C NH1 CT2 HB + 63 10 25 27 29 31 # C NH1 CT2 HB + 64 9 25 27 29 32 # C NH1 CT2 CC + 65 25 26 25 27 28 # H NH1 C O + 66 21 26 25 27 29 # CT2 NH1 C O + 67 41 27 29 32 33 # NH1 CT2 CC OC + 68 41 27 29 32 34 # NH1 CT2 CC OC + 69 27 28 27 29 30 # H NH1 CT2 HB + 70 27 28 27 29 31 # H NH1 CT2 HB + 71 11 28 27 29 32 # CC CT2 NH1 H + 72 34 30 29 32 33 # HB CT2 CC OC + 73 34 30 29 32 34 # HB CT2 CC OC + 74 34 31 29 32 33 # HB CT2 CC OC + 75 34 31 29 32 34 # HB CT2 CC OC + +Improper Coeffs + + 1 120 0 # C CT1 NH1 O + 2 120 0 # C CT2 NH1 O + 3 96 0 # CC CT2 OC OC + 4 20 0 # H CT1 C NH1 + 5 20 0 # H CT2 C NH1 + +Impropers + + 1 2 8 5 10 9 # C CT2 NH1 O + 2 4 10 8 12 11 # H CT1 C NH1 + 3 1 18 12 20 19 # C CT1 NH1 O + 4 5 20 18 22 21 # H CT2 C NH1 + 5 2 25 22 27 26 # C CT2 NH1 O + 6 5 27 25 29 28 # H CT2 C NH1 + 7 3 32 29 34 33 # CC CT2 OC OC + +CMAP + + 1 1 8 10 12 18 20 + 2 5 18 20 22 25 27 diff --git a/examples/cmap/in.cmap b/examples/cmap/in.cmap new file mode 100644 index 0000000000000000000000000000000000000000..d2b2714b826fc2f25abc00b2ec0c265726dc3e87 --- /dev/null +++ b/examples/cmap/in.cmap @@ -0,0 +1,36 @@ +# Created by charmm2lammps v1.8.2.6 beta on Thu Mar 3 20:56:57 EST 2016 + +units real +neigh_modify delay 2 every 1 +#newton off + +boundary p p p + +atom_style full +bond_style harmonic +angle_style charmm +dihedral_style charmm +improper_style harmonic + +pair_style lj/charmm/coul/charmm 8 12 +#pair_style lj/charmmfsw/coul/charmmfsh 8 12 +pair_modify mix arithmetic + +fix cmap all cmap charmm22.cmap +fix_modify cmap energy yes + +read_data gagg.data fix cmap crossterm CMAP + +special_bonds charmm +fix 1 all nve + +#fix 1 all nvt temp 300 300 100.0 +#fix 2 all shake 1e-9 500 0 m 1.0 + +velocity all create 0.0 12345678 dist uniform + +thermo 1000 +thermo_style custom step ecoul evdwl ebond eangle edihed f_cmap eimp +timestep 2.0 + +run 100000 diff --git a/examples/cmap/log.23Sep16.cmap.g++.1 b/examples/cmap/log.23Sep16.cmap.g++.1 new file mode 100644 index 0000000000000000000000000000000000000000..fe6caed913654df89fda147406a032e217fab0b1 --- /dev/null +++ b/examples/cmap/log.23Sep16.cmap.g++.1 @@ -0,0 +1,200 @@ +LAMMPS (21 Sep 2016) +# Created by charmm2lammps v1.8.2.6 beta on Thu Mar 3 20:56:57 EST 2016 + +units real +neigh_modify delay 2 every 1 +#newton off + +boundary p p p + +atom_style full +bond_style harmonic +angle_style charmm +dihedral_style charmm +improper_style harmonic + +pair_style lj/charmm/coul/charmm 8 12 +#pair_style lj/charmmfsw/coul/charmmfsh 8 12 +pair_modify mix arithmetic + +fix cmap all cmap charmm22.cmap +fix_modify cmap energy yes + +read_data gagg.data fix cmap crossterm CMAP + orthogonal box = (-34.4147 -36.1348 -39.3491) to (45.5853 43.8652 40.6509) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 34 atoms + scanning bonds ... + 4 = max bonds/atom + scanning angles ... + 6 = max angles/atom + scanning dihedrals ... + 12 = max dihedrals/atom + scanning impropers ... + 1 = max impropers/atom + reading bonds ... + 33 bonds + reading angles ... + 57 angles + reading dihedrals ... + 75 dihedrals + reading impropers ... + 7 impropers + 4 = max # of 1-2 neighbors + 7 = max # of 1-3 neighbors + 13 = max # of 1-4 neighbors + 16 = max # of special neighbors + +special_bonds charmm +fix 1 all nve + +#fix 1 all nvt temp 300 300 100.0 +#fix 2 all shake 1e-9 500 0 m 1.0 + +velocity all create 0.0 12345678 dist uniform + +thermo 1000 +thermo_style custom step ecoul evdwl ebond eangle edihed f_cmap eimp +timestep 2.0 + +run 100000 +Neighbor list info ... + 1 neighbor list requests + update every 1 steps, delay 2 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 14 + ghost atom cutoff = 14 + binsize = 7 -> bins = 12 12 12 +Memory usage per processor = 14.6355 Mbytes +Step E_coul E_vdwl E_bond E_angle E_dihed f_cmap E_impro + 0 26.542777 -0.93822087 1.2470497 4.8441789 4.5432816 -1.473352 0.10453023 + 1000 28.673005 -0.47724367 0.80029132 3.151679 4.4684446 -2.3928648 0.18604953 + 2000 27.67955 -1.170342 0.72018905 4.0400131 4.4713764 -2.5490207 0.21834436 + 3000 29.256656 -0.35856055 0.73303546 3.7411606 4.4710568 -2.8939692 0.37728884 + 4000 30.097549 -1.1353905 0.79007053 3.0688444 4.4091469 -2.3383587 0.20743631 + 5000 28.357525 -1.0723742 0.9180297 3.6579424 4.8792664 -2.3185572 0.088366962 + 6000 29.214175 -0.95299225 0.81926009 3.6805429 4.6742897 -2.9343577 0.26697813 + 7000 27.018614 -0.52423475 0.72502764 3.8840137 4.7780956 -2.3916009 0.24952584 + 8000 29.682167 -1.0939711 0.76111486 3.1090116 4.9359719 -2.5662984 0.1411154 + 9000 27.909695 -0.80905986 0.78952533 4.203187 4.1301204 -2.000402 0.088859259 + 10000 27.480298 -0.86273377 1.1293962 4.3857421 4.899282 -3.3895621 0.12126215 + 11000 28.303203 -1.0221152 0.62762348 4.055414 4.5863024 -2.5842816 0.17996907 + 12000 28.311127 -0.94227367 0.91859012 3.6673926 4.7018632 -3.902715 0.30065704 + 13000 30.818607 -1.5220116 0.95710386 3.3364371 4.543427 -3.0423067 0.16712905 + 14000 27.643736 -1.0144117 0.95806952 4.1046912 4.800236 -4.0534389 0.29293405 + 15000 27.660491 -1.0390086 0.78061056 4.1139174 4.7197202 -2.3670379 0.22126985 + 16000 27.845157 -0.63654502 0.78007478 3.9365994 4.949418 -3.1470214 0.22335355 + 17000 28.44772 -1.0255112 0.70402007 4.0573343 4.2887527 -2.2099596 0.048050962 + 18000 27.128323 -0.96218536 1.1327159 4.3222585 4.326607 -2.2881766 0.13491257 + 19000 27.337633 -0.78999574 0.80152298 4.2239689 4.7073478 -2.2924164 0.12710292 + 20000 27.780537 -0.46458072 0.79707671 3.7232618 4.943417 -2.5290628 0.26191223 + 21000 26.435484 -0.7803224 1.0753217 4.4196051 5.9945933 -2.3340925 0.16448475 + 22000 28.619429 -1.1623149 0.9401731 3.8508844 5.1636737 -2.5551846 0.25318434 + 23000 28.399338 -0.79700962 0.85575503 4.488526 4.5975422 -2.5663549 0.13601693 + 24000 29.645532 -1.158744 0.83180313 3.8193399 4.60319 -2.6847864 0.24260466 + 25000 28.695339 -1.4802204 0.76583757 3.6786272 4.8959496 -2.3627896 0.080867326 + 26000 28.149711 -1.029689 0.79383806 3.7885067 4.3345813 -2.1041553 0.14598209 + 27000 29.580373 -1.0525813 1.0262723 3.7767318 4.6119758 -2.2802386 0.088556038 + 28000 28.44308 -0.93411225 0.8794395 3.948079 4.780246 -2.1814583 0.14340149 + 29000 29.335621 -1.6087988 0.71803091 3.7819186 4.6688385 -2.4282242 0.16061111 + 30000 28.706138 -1.3938241 0.67713818 4.031275 4.4756505 -2.1807056 0.11461356 + 31000 27.451944 0.010297225 0.65064883 3.6402029 4.3607811 -2.5511516 0.12637237 + 32000 27.070878 -1.103158 1.1932199 5.1329709 4.5201653 -2.2224479 0.11215427 + 33000 29.889976 -1.6228316 0.69407996 3.5361991 4.3502767 -1.9847454 0.09089949 + 34000 28.223151 -0.927208 1.043253 3.4650939 5.1028142 -2.8127219 0.10648823 + 35000 27.985986 -0.48153861 0.63878449 3.3724641 4.9551679 -2.6565919 0.12123115 + 36000 28.580688 -1.4500694 1.055762 4.0490064 4.423782 -2.3103578 0.072747638 + 37000 29.192947 -0.49678176 1.1146731 2.9233947 4.5738603 -2.4376144 0.22874047 + 38000 26.954594 -0.53812359 0.79230685 4.3356989 5.0284656 -2.3791255 0.0486081 + 39000 27.567555 -0.57870028 0.73614374 4.191991 4.9209556 -2.6122044 0.08635571 + 40000 28.494172 -0.79057135 0.79072816 4.1893209 4.4826919 -2.4179635 0.14612898 + 41000 28.44904 -1.1002948 0.93405654 4.3586358 4.4338415 -2.2950944 0.15705834 + 42000 28.95725 -1.0297067 1.1632348 4.274711 4.9979487 -2.7611464 0.15944725 + 43000 28.640394 -0.70938882 0.68100893 3.1844315 5.1817454 -2.2837487 0.14189233 + 44000 27.997558 -1.0115099 0.59125208 4.0883422 4.6033907 -2.2775964 0.094273258 + 45000 27.67163 -0.67992747 1.1225552 3.9020703 4.8171056 -2.1952679 0.041418433 + 46000 28.822607 -0.6687953 0.74160059 3.3193715 4.5546965 -2.3024572 0.047569065 + 47000 29.20147 -1.4456785 0.79223353 3.8288813 4.5811826 -2.5154936 0.061230141 + 48000 27.843026 -1.0222301 0.87322137 4.3432743 4.4266307 -2.1414153 0.06802794 + 49000 28.199573 -1.1887794 1.2781088 4.0779644 4.5881353 -2.319775 0.094803547 + 50000 28.759212 -1.354416 0.68534569 3.8394841 4.2308134 -2.1281844 0.1395951 + 51000 27.876455 -1.5705462 0.76557156 4.5335223 4.523708 -2.203702 0.14679803 + 52000 27.930587 -1.2277489 0.96071516 3.960953 5.1152188 -2.4101451 0.060949521 + 53000 27.031236 -1.4746477 1.2341141 5.0540975 4.3656865 -2.1288513 0.092725656 + 54000 28.809394 -1.1162427 0.94350207 3.4013958 4.4755547 -2.3342811 0.18855912 + 55000 28.948415 -1.1560418 0.6260139 3.5386373 4.5244978 -2.340212 0.17474657 + 56000 28.048368 -0.95784532 0.76432571 4.1404665 4.4570033 -2.0899628 0.045693628 + 57000 28.707642 -1.366574 0.9907873 3.729903 4.3131997 -2.2777698 0.065420213 + 58000 26.361663 -1.0424403 1.0452563 5.0977108 4.7035231 -2.3101244 0.13671642 + 59000 29.218218 -1.2210564 0.62435875 3.4236327 4.5481681 -2.1575943 0.037984042 + 60000 27.655546 -1.1053224 0.86323501 3.7641375 4.8946898 -2.2422249 0.077725979 + 61000 27.252108 -1.3744824 1.1150806 5.0444848 4.4878135 -2.2743829 0.058331257 + 62000 27.163469 -1.1715781 0.72099321 4.5295501 4.9509918 -2.2993961 0.050401105 + 63000 29.581575 -1.2238537 0.86303245 3.1194038 5.2218965 -2.5002427 0.055032632 + 64000 27.897822 -1.1011516 0.74540883 4.2869228 4.3394269 -2.2552393 0.1403321 + 65000 27.083245 -1.0633392 0.92771724 5.0805224 4.2747962 -2.2388039 0.064196692 + 66000 29.072723 -1.5514209 0.89798805 4.2600224 4.4261812 -2.3524752 0.15067414 + 67000 27.308181 -0.72224802 0.97109517 4.5074578 4.4559352 -2.1381121 0.089297603 + 68000 27.505686 -0.43855431 0.80785812 4.1917251 5.0157721 -2.3382145 0.11105164 + 69000 29.041681 -0.64735378 0.89874684 3.3891579 4.3753361 -2.2320941 0.14716747 + 70000 29.735756 -1.7061457 0.9206878 3.5767878 4.3851664 -2.2516304 0.097196062 + 71000 28.224352 -0.92217702 0.86093586 3.9507157 4.5596589 -2.2173397 0.089116669 + 72000 29.282336 -1.056142 0.65185725 3.8735742 4.4839333 -2.4314756 0.071909704 + 73000 26.257283 -0.64273826 0.98300685 5.063943 5.045958 -2.5544375 0.2180275 + 74000 28.825119 -0.97736616 0.87201848 3.55875 4.3653309 -2.2303567 0.098963875 + 75000 29.239507 -0.96508809 0.74517323 3.4306236 4.7651921 -2.6077732 0.17883654 + 76000 27.349841 -0.50990238 1.1183613 4.4252451 4.4097775 -2.4125794 0.18483606 + 77000 28.130197 -1.4081219 0.94921357 4.2572132 4.5162849 -2.4013797 0.073744606 + 78000 28.235774 -0.9214321 0.6324981 3.8697686 4.8092154 -2.2272847 0.092108346 + 79000 26.732846 -0.55949486 1.0989617 5.0088609 4.4930687 -2.277945 0.03855146 + 80000 28.529208 -0.94244671 0.79407482 3.961106 4.3930011 -2.3127726 0.091124948 + 81000 29.603852 -1.6116062 1.060847 3.7824932 4.151001 -1.9139868 0.19875986 + 82000 28.232876 -1.1833011 1.0182713 3.4195758 5.1394333 -2.4632697 0.28501012 + 83000 29.565482 -1.3479552 0.99056973 3.7851802 4.4781011 -2.7872481 0.2031991 + 84000 28.780274 -1.3073882 1.0512637 4.004638 4.502282 -2.3789146 0.015656202 + 85000 27.262312 -1.1305346 1.203524 4.7938623 4.1747105 -2.0952844 0.054240361 + 86000 28.157348 -1.0662817 0.81163796 3.9912709 4.8320213 -2.255237 0.14698333 + 87000 28.445543 -1.3365026 0.78156195 4.4767689 4.4457575 -2.5008786 0.13879386 + 88000 27.656717 -1.1490599 0.87974869 4.4629952 4.7023033 -2.3258145 0.081904139 + 89000 28.838821 -1.020709 0.85587929 3.7110705 4.4938307 -2.4914483 0.11447952 + 90000 27.356497 -0.59107077 0.81879666 4.5209332 4.4703836 -2.3806717 0.071307775 + 91000 27.780445 -0.80564513 0.94752313 3.8468943 4.2924253 -2.1011134 0.1118672 + 92000 28.555276 -1.3514732 0.80826674 3.9590742 4.5775954 -2.4891232 0.054254978 + 93000 28.747267 -1.2133243 0.75507246 4.1319789 4.9048611 -2.4913887 0.13045693 + 94000 27.479343 -0.69973695 0.99696121 3.5966229 4.549025 -2.4155312 0.41745762 + 95000 27.726945 -1.1905026 1.1120842 4.7433275 4.5386861 -2.7947142 0.33671682 + 96000 28.021114 -1.0341645 0.6663033 4.2397505 4.6203984 -1.9904034 0.10972565 + 97000 28.382022 -1.3916008 1.180588 4.0729621 4.6741792 -2.554927 0.13462346 + 98000 27.895969 -0.7496449 1.3072185 4.2611888 4.3726077 -2.1320701 0.15376665 + 99000 28.517889 -1.2183957 1.279778 3.957647 4.2638434 -2.2888407 0.042705003 + 100000 28.109211 -1.2538948 0.83671785 4.3734766 4.544545 -2.3076497 0.042189096 +Loop time of 2.96683 on 1 procs for 100000 steps with 34 atoms + +Performance: 5824.390 ns/day, 0.004 hours/ns, 33705.963 timesteps/s +100.0% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.98759 | 0.98759 | 0.98759 | 0.0 | 33.29 +Bond | 1.6463 | 1.6463 | 1.6463 | 0.0 | 55.49 +Neigh | 0.007688 | 0.007688 | 0.007688 | 0.0 | 0.26 +Comm | 0.012214 | 0.012214 | 0.012214 | 0.0 | 0.41 +Output | 0.0010295 | 0.0010295 | 0.0010295 | 0.0 | 0.03 +Modify | 0.25684 | 0.25684 | 0.25684 | 0.0 | 8.66 +Other | | 0.05519 | | | 1.86 + +Nlocal: 34 ave 34 max 34 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 395 ave 395 max 395 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 395 +Ave neighs/atom = 11.6176 +Ave special neighs/atom = 9.52941 +Neighbor list builds = 237 +Dangerous builds = 0 +Total wall time: 0:00:02 diff --git a/examples/cmap/log.23Sep16.cmap.g++.4 b/examples/cmap/log.23Sep16.cmap.g++.4 new file mode 100644 index 0000000000000000000000000000000000000000..2d3efa66c6b156ada65d04c675a8ab80c2658066 --- /dev/null +++ b/examples/cmap/log.23Sep16.cmap.g++.4 @@ -0,0 +1,200 @@ +LAMMPS (21 Sep 2016) +# Created by charmm2lammps v1.8.2.6 beta on Thu Mar 3 20:56:57 EST 2016 + +units real +neigh_modify delay 2 every 1 +#newton off + +boundary p p p + +atom_style full +bond_style harmonic +angle_style charmm +dihedral_style charmm +improper_style harmonic + +pair_style lj/charmm/coul/charmm 8 12 +#pair_style lj/charmmfsw/coul/charmmfsh 8 12 +pair_modify mix arithmetic + +fix cmap all cmap charmm22.cmap +fix_modify cmap energy yes + +read_data gagg.data fix cmap crossterm CMAP + orthogonal box = (-34.4147 -36.1348 -39.3491) to (45.5853 43.8652 40.6509) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 34 atoms + scanning bonds ... + 4 = max bonds/atom + scanning angles ... + 6 = max angles/atom + scanning dihedrals ... + 12 = max dihedrals/atom + scanning impropers ... + 1 = max impropers/atom + reading bonds ... + 33 bonds + reading angles ... + 57 angles + reading dihedrals ... + 75 dihedrals + reading impropers ... + 7 impropers + 4 = max # of 1-2 neighbors + 7 = max # of 1-3 neighbors + 13 = max # of 1-4 neighbors + 16 = max # of special neighbors + +special_bonds charmm +fix 1 all nve + +#fix 1 all nvt temp 300 300 100.0 +#fix 2 all shake 1e-9 500 0 m 1.0 + +velocity all create 0.0 12345678 dist uniform + +thermo 1000 +thermo_style custom step ecoul evdwl ebond eangle edihed f_cmap eimp +timestep 2.0 + +run 100000 +Neighbor list info ... + 1 neighbor list requests + update every 1 steps, delay 2 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 14 + ghost atom cutoff = 14 + binsize = 7 -> bins = 12 12 12 +Memory usage per processor = 15.9307 Mbytes +Step E_coul E_vdwl E_bond E_angle E_dihed f_cmap E_impro + 0 26.542777 -0.93822087 1.2470497 4.8441789 4.5432816 -1.473352 0.10453023 + 1000 28.673005 -0.47724367 0.80029132 3.151679 4.4684446 -2.3928648 0.18604953 + 2000 27.67955 -1.170342 0.72018905 4.0400131 4.4713764 -2.5490207 0.21834436 + 3000 29.256656 -0.35856055 0.73303546 3.7411606 4.4710568 -2.8939692 0.37728884 + 4000 30.097549 -1.1353905 0.79007053 3.0688444 4.4091469 -2.3383587 0.20743631 + 5000 28.357525 -1.0723742 0.9180297 3.6579424 4.8792663 -2.3185572 0.088366962 + 6000 29.214175 -0.95299239 0.81926011 3.6805428 4.6742897 -2.9343578 0.26697816 + 7000 27.018614 -0.52423469 0.72502751 3.8840141 4.7780958 -2.3916014 0.24952572 + 8000 29.682494 -1.0940368 0.76113051 3.1089345 4.9357863 -2.5662256 0.14112613 + 9000 27.853918 -0.7913741 0.79503268 4.2177256 4.146792 -2.00475 0.090585666 + 10000 27.13754 -0.80551128 1.1325023 4.4718283 5.2460631 -3.4947725 0.11893125 + 11000 28.277434 -1.4897448 0.90075953 4.1895717 4.3594269 -1.9553119 0.090222212 + 12000 28.630973 -1.222206 0.67796385 3.3905661 4.9691334 -2.9052721 0.13897658 + 13000 28.593007 -0.95684026 0.75585196 3.7242568 4.7417932 -2.3893117 0.2074121 + 14000 26.147115 -0.6026921 0.93591488 5.1292829 4.9821952 -2.2571835 0.11872421 + 15000 26.29432 -0.82424162 1.048979 4.5569495 5.1189308 -2.9750422 0.16195676 + 16000 29.189992 -0.80998247 0.74093508 3.8299275 4.4536688 -2.5497538 0.19155639 + 17000 25.878012 -0.3519646 1.0988924 4.7359591 5.3923098 -2.7211029 0.13405223 + 18000 27.726135 -0.28229987 0.63072344 4.1777888 4.7237271 -2.2177157 0.15939372 + 19000 27.153504 -0.66477422 0.77910129 4.2036117 5.113851 -2.3494315 0.094793307 + 20000 28.044833 -1.2835827 0.88745367 3.9955526 4.5077788 -3.0116467 0.17197859 + 21000 27.205696 -0.74090037 1.0023251 4.3421733 4.912671 -2.3473271 0.26089356 + 22000 27.385785 -0.93740972 0.84554838 4.562743 4.883866 -2.2110955 0.11573301 + 23000 27.05534 -0.95605442 0.96719024 3.9277618 5.0359014 -2.6135949 0.21368061 + 24000 28.273378 -0.97543103 0.8983443 4.2067985 4.4782971 -2.4230505 0.30311692 + 25000 27.477789 -0.20383849 0.8380706 3.8037992 4.8312504 -2.5831791 0.093843746 + 26000 30.344199 -1.9773473 0.92882437 3.7821405 4.5176677 -2.3020968 0.2194307 + 27000 27.32767 -0.9803839 0.92988865 3.7611603 5.0328211 -2.4647656 0.18213622 + 28000 27.34208 -1.037938 0.74488346 4.1727342 4.7056812 -2.2718346 0.17741362 + 29000 27.682777 -0.51006495 0.57074224 4.7332237 4.7080462 -2.0491512 0.2130517 + 30000 24.925731 0.13670248 0.84976065 4.4143762 6.0677158 -3.5479173 0.28059419 + 31000 28.623419 -0.90725708 1.0710501 3.6930688 4.6639301 -2.2225373 0.20988139 + 32000 27.732286 -1.1948367 0.89230134 4.4398373 4.8923907 -3.5849327 0.49167488 + 33000 28.800772 -1.5319589 0.93455495 4.1634728 4.6107706 -2.3503486 0.22636535 + 34000 27.374398 -1.0957453 0.89450276 3.9829508 4.991786 -2.3548834 0.15869465 + 35000 28.38753 -0.89261166 0.90000776 3.536864 4.4293294 -2.4218118 0.10640557 + 36000 27.713974 0.088038031 0.85190574 3.8969601 4.6256355 -2.7935475 0.34671662 + 37000 29.13007 -1.378597 0.74412556 3.131538 4.6458653 -2.9373734 0.38035616 + 38000 28.556573 -1.4055344 1.139984 4.0035753 4.2938358 -2.489329 0.25338326 + 39000 26.447036 -1.1829705 0.87032438 5.0804461 4.5772023 -2.7346466 0.32165802 + 40000 27.991454 -0.64295679 0.61020872 4.165871 4.4623087 -2.2244194 0.13826991 + 41000 29.483296 -1.2400745 0.66926627 3.3473666 4.5766617 -2.3051145 0.12171554 + 42000 26.948627 -1.2162288 1.1440628 4.3993073 5.1176533 -2.4734485 0.15497709 + 43000 28.04459 -0.26543193 0.83647367 3.5160747 4.6964397 -2.2805068 0.12618821 + 44000 28.213608 -1.216128 0.9132792 4.0206483 4.9483599 -2.3387049 0.10132022 + 45000 28.283506 -1.0390766 0.86113772 4.504509 4.7209088 -2.3043085 0.14588362 + 46000 27.433853 -0.57912107 0.78448334 4.5998579 5.1181394 -2.6165094 0.18722528 + 47000 27.552939 -1.1128925 0.80087638 4.3448001 4.8062869 -2.4296883 0.2702479 + 48000 28.874034 -1.3242519 0.71770727 3.5648565 4.4671824 -2.2608958 0.16115978 + 49000 29.216186 -1.2210307 0.76937497 3.9260628 4.7550577 -2.7316081 0.085505664 + 50000 28.065856 -1.1545547 0.86953819 4.4137666 4.732157 -2.4450867 0.23320539 + 51000 26.308975 -0.99728352 0.90408444 4.2400186 5.6340425 -2.2090554 0.079882158 + 52000 28.517571 -1.5027398 0.83520278 3.8176552 4.3001251 -2.0731682 0.1665375 + 53000 28.77579 -1.3564268 0.97253881 3.6866407 4.8532347 -2.5330776 0.17668411 + 54000 29.135315 -1.0994106 0.67605671 3.6819254 4.3134408 -1.9796929 0.076951331 + 55000 26.168938 -0.76247492 0.88784685 4.6533473 6.0484793 -2.1334561 0.036876985 + 56000 27.471775 -0.68648837 1.0576168 4.0354311 4.4767052 -2.2368959 0.24950568 + 57000 29.787083 -1.4914384 1.0702944 3.5388133 4.5173097 -2.6694464 0.27937092 + 58000 28.705448 -1.3016617 0.63337853 3.9552713 4.4119825 -1.8774657 0.17540021 + 59000 29.130155 -0.91647363 0.84384883 3.1076903 4.5346348 -2.3457338 0.16674486 + 60000 26.874199 -0.81598034 1.3432151 5.1322624 4.9545484 -2.9566615 0.25950486 + 61000 27.401306 -0.82895856 1.1636949 4.020154 4.5745928 -2.601466 0.18061051 + 62000 28.930313 -1.5231967 0.85173243 4.3517328 4.4878662 -2.5859205 0.1755493 + 63000 26.56874 0.026147233 0.60836216 4.4231618 4.4390677 -2.1721849 0.08594237 + 64000 26.729023 -0.76953985 0.76734633 4.5104288 5.0886456 -2.2118551 0.11339216 + 65000 28.900471 -1.3901477 0.86194657 4.2774976 4.498325 -2.3672362 0.20668335 + 66000 26.884253 -0.21198879 0.98509625 4.0843117 4.4344172 -2.3289416 0.23631017 + 67000 27.210888 -0.84075559 1.0396559 4.7253607 4.4314589 -2.2985702 0.19326507 + 68000 28.042102 -1.1898715 1.053534 3.8748712 4.4358449 -2.3998723 0.2431659 + 69000 28.939141 -1.6968936 0.98155912 4.0460838 5.0075204 -2.5547087 0.28645131 + 70000 27.15577 -0.85202797 1.1469079 4.7645212 4.6133209 -2.3410451 0.086576572 + 71000 25.507417 -0.27780727 0.95157881 4.8759406 4.853401 -2.9598705 0.41011008 + 72000 29.804703 -1.4847015 0.96345767 3.6797304 4.3678377 -2.4594626 0.14480206 + 73000 28.602798 -1.4906143 0.72497266 4.2442974 4.5360598 -2.3621638 0.14385651 + 74000 28.4928 -0.91319873 1.0377472 3.8033127 4.3991601 -2.4051911 0.095567428 + 75000 26.38168 -0.70733237 1.1557817 5.697939 4.5935618 -2.4285007 0.058980519 + 76000 27.16626 -0.83631031 0.84844246 4.7460887 4.5801472 -2.1260014 0.12845946 + 77000 29.040661 -1.3089499 0.80285084 4.664804 4.5215895 -2.6861939 0.13215598 + 78000 27.477871 -1.0600977 0.88595045 4.6264017 5.4095605 -2.474411 0.10987174 + 79000 26.151797 -0.55779685 0.91382436 4.99964 4.9184022 -2.2547241 0.22854038 + 80000 28.14523 -0.54460026 0.8982411 3.5374555 4.3785673 -2.3196807 0.088567964 + 81000 29.029941 -1.6467789 0.79042284 3.7269899 4.7407998 -2.3795824 0.1408727 + 82000 27.920287 -0.72798032 1.0076975 3.4449461 4.5621371 -2.8239074 0.25103454 + 83000 29.131054 -1.114367 0.76887285 3.459639 4.5163922 -2.607825 0.19991648 + 84000 28.249768 -0.69944068 1.0510846 4.0436296 4.6430538 -2.4213355 0.077299966 + 85000 28.06888 -0.62132922 0.91829312 4.1294147 4.3099557 -2.354063 0.15866186 + 86000 28.664264 -1.1022906 0.87831695 4.5773522 4.6045802 -2.9206875 0.33950063 + 87000 27.960967 -1.2852756 0.77694253 3.9011301 4.9114139 -3.2374868 0.3068138 + 88000 27.190678 -1.2803268 1.1545301 4.5769709 5.2404761 -2.3825838 0.10356039 + 89000 26.792931 -0.44516641 1.0236244 4.2007253 4.7098685 -2.3608551 0.034447062 + 90000 27.173991 -0.87185611 1.065719 4.1953618 4.6856408 -2.6539232 0.16957757 + 91000 28.626528 -1.239257 0.89524651 4.7048012 4.6344201 -2.7367901 0.43534143 + 92000 27.661812 -1.109044 0.92817391 5.0294489 4.3890711 -2.4108669 0.12570139 + 93000 28.156793 -1.0820907 0.92812693 4.938385 4.4901426 -2.4023366 0.30135781 + 94000 28.842149 -1.3524969 1.1451109 4.3125908 4.6959035 -2.6747199 0.2254607 + 95000 27.862247 -1.2119045 1.0218976 4.2614082 4.4931316 -2.6902934 0.16345201 + 96000 27.084973 -0.93738328 1.3984324 4.5647189 4.4232205 -2.2834097 0.11217888 + 97000 27.587078 -0.89397255 0.78218462 3.8944421 4.3981479 -2.4205318 0.16570942 + 98000 27.981746 -1.2380545 0.84847869 4.311441 4.7340377 -2.4270441 0.023565612 + 99000 27.476625 -0.8569146 0.82550381 4.1656963 4.4064921 -2.4169708 0.160814 + 100000 26.121325 -0.63610855 1.0803389 4.9257118 4.7073263 -2.4010334 0.066303044 +Loop time of 2.60487 on 4 procs for 100000 steps with 34 atoms + +Performance: 6633.735 ns/day, 0.004 hours/ns, 38389.667 timesteps/s +99.1% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.066848 | 0.26055 | 0.6843 | 48.6 | 10.00 +Bond | 0.067332 | 0.45486 | 0.93545 | 55.1 | 17.46 +Neigh | 0.0078266 | 0.007863 | 0.0078835 | 0.0 | 0.30 +Comm | 0.41829 | 1.3207 | 1.8951 | 50.8 | 50.70 +Output | 0.0033038 | 0.0036355 | 0.0040481 | 0.4 | 0.14 +Modify | 0.040861 | 0.15162 | 0.27091 | 27.3 | 5.82 +Other | | 0.4057 | | | 15.57 + +Nlocal: 8.5 ave 15 max 2 min +Histogram: 1 1 0 0 0 0 0 0 1 1 +Nghost: 25.5 ave 32 max 19 min +Histogram: 1 1 0 0 0 0 0 0 1 1 +Neighs: 98.75 ave 257 max 18 min +Histogram: 1 1 1 0 0 0 0 0 0 1 + +Total # of neighbors = 395 +Ave neighs/atom = 11.6176 +Ave special neighs/atom = 9.52941 +Neighbor list builds = 294 +Dangerous builds = 0 +Total wall time: 0:00:02 diff --git a/src/MOLECULE/fix_cmap.cpp b/src/MOLECULE/fix_cmap.cpp new file mode 100644 index 0000000000000000000000000000000000000000..39081168d8103eecb22d42868cf6afe37286dfba --- /dev/null +++ b/src/MOLECULE/fix_cmap.cpp @@ -0,0 +1,1432 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Implementation of the CHARMM CMAP; adds an extra energy term for the + peptide backbone dihedrals. The tools/ch2lmp.pl conversion script, which + generates an extra section in the LAMMPS data file, is needed in order to + generate the info used by this fix style. + + Contributing authors: + Xiaohu Hu, CMB/ORNL (hux2@ornl.gov) + David Hyde-Volpe, Tigran Abramyan, and Robert A. Latour (Clemson University) + Chris Lorenz (Kings College-London) + + References: + - MacKerell et al., J. Am. Chem. Soc. 126(2004):698-699. + - MacKerell et al., J. Comput. Chem. 25(2004):1400-1415. + -------------------------------------------------------------------------*/ + +#include "mpi.h" +#include "math.h" +#include "stdlib.h" +#include "string.h" +#include "stdio.h" +#include "fix_cmap.h" +#include "atom.h" +#include "atom_vec.h" +#include "update.h" +#include "respa.h" +#include "modify.h" +#include "domain.h" +#include "force.h" +#include "group.h" +#include "comm.h" +#include "math_const.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace FixConst; +using namespace MathConst; + +#define MAXLINE 256 +#define LISTDELTA 10000 +#define LB_FACTOR 1.5 + +#define CMAPMAX 6 // max # of CMAP terms stored by one atom +#define CMAPDIM 24 // grid map dimension is 24 x 24 +#define CMAPXMIN -360.0 +#define CMAPXMIN2 -180.0 +#define CMAPDX 15.0 // 360/CMAPDIM + +/* ---------------------------------------------------------------------- */ + +FixCMAP::FixCMAP(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg) +{ + if (narg != 4) error->all(FLERR,"Illegal fix cmap command"); + + restart_global = 1; + restart_peratom = 1; + peatom_flag = 1; + virial_flag = 1; + peratom_freq = 1; + scalar_flag = 1; + global_freq = 1; + extscalar = 1; + extvector = 1; + wd_header = 1; + wd_section = 1; + + MPI_Comm_rank(world,&me); + MPI_Comm_size(world,&nprocs); + + // allocate memory for CMAP data + + memory->create(g_axis,CMAPDIM,"cmap:g_axis"); + memory->create(cmapgrid,6,CMAPDIM,CMAPDIM,"cmap:grid"); + memory->create(d1cmapgrid,6,CMAPDIM,CMAPDIM,"cmap:d1grid"); + memory->create(d2cmapgrid,6,CMAPDIM,CMAPDIM,"cmap:d2grid"); + memory->create(d12cmapgrid,6,CMAPDIM,CMAPDIM,"cmap:d12grid"); + + // read, initialize, broadcast cmapgrid + + if (me == 0) read_grid_map(arg[3]); + MPI_Bcast(&cmapgrid[0][0][0],6*CMAPDIM*CMAPDIM,MPI_DOUBLE,0,world); + + // perform initial allocation of atom-based arrays + // register with Atom class + + num_crossterm = NULL; + crossterm_type = NULL; + crossterm_atom1 = NULL; + crossterm_atom2 = NULL; + crossterm_atom3 = NULL; + crossterm_atom4 = NULL; + crossterm_atom5 = NULL; + + nmax_previous = 0; + grow_arrays(atom->nmax); + atom->add_callback(0); + atom->add_callback(1); + + // local list of crossterms + + ncmap = 0; + maxcrossterm = 0; + crosstermlist = NULL; +} + +/* --------------------------------------------------------------------- */ + +FixCMAP::~FixCMAP() +{ + // unregister callbacks to this fix from Atom class + + atom->delete_callback(id,0); + atom->delete_callback(id,1); + + memory->destroy(g_axis); + memory->destroy(cmapgrid); + memory->destroy(d1cmapgrid); + memory->destroy(d2cmapgrid); + memory->destroy(d12cmapgrid); + + memory->destroy(crosstermlist); + + memory->destroy(num_crossterm); + memory->destroy(crossterm_type); + memory->destroy(crossterm_atom1); + memory->destroy(crossterm_atom2); + memory->destroy(crossterm_atom3); + memory->destroy(crossterm_atom4); + memory->destroy(crossterm_atom5); +} + +/* ---------------------------------------------------------------------- */ + +int FixCMAP::setmask() +{ + int mask = 0; + mask |= PRE_NEIGHBOR; + mask |= PRE_REVERSE; + mask |= POST_FORCE; + mask |= THERMO_ENERGY; + mask |= POST_FORCE_RESPA; + mask |= MIN_POST_FORCE; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixCMAP::init() +{ + int i; + double angle; + + i = 0; + angle = -180.0; + while (angle < 180.0) { + g_axis[i] = angle; + angle += CMAPDX; + i++; + } + + // pre-compute the derivatives of the maps + + for (i = 0; i < 6; i++) + set_map_derivatives(cmapgrid[i],d1cmapgrid[i],d2cmapgrid[i],d12cmapgrid[i]); + + // define newton_bond here in case restart file was read (not data file) + + newton_bond = force->newton_bond; +} + +/* --------------------------------------------------------------------- */ + +void FixCMAP::setup(int vflag) +{ + pre_neighbor(); + + if (strstr(update->integrate_style,"verlet")) + post_force(vflag); + else { + ((Respa *) update->integrate)->copy_flevel_f(nlevels_respa-1); + post_force_respa(vflag,nlevels_respa-1,0); + ((Respa *) update->integrate)->copy_f_flevel(nlevels_respa-1); + } +} + +/* --------------------------------------------------------------------- */ + +void FixCMAP::setup_pre_neighbor() +{ + pre_neighbor(); +} + +/* --------------------------------------------------------------------- */ + +void FixCMAP::min_setup(int vflag) +{ + pre_neighbor(); + post_force(vflag); +} + +/* ---------------------------------------------------------------------- + store local neighbor list as if newton_bond = OFF, even if actually ON +------------------------------------------------------------------------- */ + +void FixCMAP::pre_neighbor() +{ + int i,m,itype,atom1,atom2,atom3,atom4,atom5; + + // guesstimate initial length of local crossterm list + // if ncmap was not set (due to read_restart, no read_data), + // then list will grow by LISTDELTA chunks + + if (maxcrossterm == 0) { + if (nprocs == 1) maxcrossterm = ncmap; + else maxcrossterm = static_cast<int> (LB_FACTOR*ncmap/nprocs); + memory->create(crosstermlist,maxcrossterm,6,"cmap:crosstermlist"); + } + + int nlocal = atom->nlocal; + + ncrosstermlist = 0; + + for (i = 0; i < nlocal; i++) { + for (m = 0; m < num_crossterm[i]; m++) { + atom1 = atom->map(crossterm_atom1[i][m]); + atom2 = atom->map(crossterm_atom2[i][m]); + atom3 = atom->map(crossterm_atom3[i][m]); + atom4 = atom->map(crossterm_atom4[i][m]); + atom5 = atom->map(crossterm_atom5[i][m]); + + if (atom1 == -1 || atom2 == -1 || atom3 == -1 || + atom4 == -1 || atom5 == -1) { + char str[128]; + sprintf(str,"CMAP atoms " + TAGINT_FORMAT " " TAGINT_FORMAT " " TAGINT_FORMAT " " + TAGINT_FORMAT " " TAGINT_FORMAT + " missing on proc %d at step " BIGINT_FORMAT, + crossterm_atom1[i][m],crossterm_atom2[i][m], + crossterm_atom3[i][m],crossterm_atom4[i][m], + crossterm_atom5[i][m],me,update->ntimestep); + error->one(FLERR,str); + } + atom1 = domain->closest_image(i,atom1); + atom2 = domain->closest_image(i,atom2); + atom3 = domain->closest_image(i,atom3); + atom4 = domain->closest_image(i,atom4); + atom5 = domain->closest_image(i,atom5); + + if (i <= atom1 && i <= atom2 && i <= atom3 && + i <= atom4 && i <= atom5) { + if (ncrosstermlist == maxcrossterm) { + maxcrossterm += LISTDELTA; + memory->grow(crosstermlist,maxcrossterm,6,"cmap:crosstermlist"); + } + crosstermlist[ncrosstermlist][0] = atom1; + crosstermlist[ncrosstermlist][1] = atom2; + crosstermlist[ncrosstermlist][2] = atom3; + crosstermlist[ncrosstermlist][3] = atom4; + crosstermlist[ncrosstermlist][4] = atom5; + crosstermlist[ncrosstermlist][5] = crossterm_type[i][m]; + ncrosstermlist++; + } + } + } +} + +/* ---------------------------------------------------------------------- + store eflag, so can use it in post_force to tally per-atom energies +------------------------------------------------------------------------- */ + +void FixCMAP::pre_reverse(int eflag, int vflag) +{ + eflag_caller = eflag; +} + +/* ---------------------------------------------------------------------- + compute CMAP terms as if newton_bond = OFF, even if actually ON +------------------------------------------------------------------------- */ + +void FixCMAP::post_force(int vflag) +{ + int n,i1,i2,i3,i4,i5,type,nlist; + int li1, li2, mli1,mli2,mli11,mli21,t1,li3,li4,mli3,mli4,mli31,mli41; + int list[5]; + // vectors needed to calculate the cross-term dihedral angles + double vb21x,vb21y,vb21z,vb32x,vb32y,vb32z,vb34x,vb34y,vb34z; + double vb23x,vb23y,vb23z; + double vb43x,vb43y,vb43z,vb45x,vb45y,vb45z,a1x,a1y,a1z,b1x,b1y,b1z; + double a2x,a2y,a2z,b2x,b2y,b2z,r32,a1sq,b1sq,a2sq,b2sq,dpr21r32,dpr34r32; + double dpr32r43,dpr45r43,r43,vb12x,vb12y,vb12z,vb54x,vb54y,vb54z; + // cross-term dihedral angles + double phi,psi,phi1,psi1; + double f1[3],f2[3],f3[3],f4[3],f5[3],vcmap[6]; + double gs[4],d1gs[4],d2gs[4],d12gs[4]; + double engfraction; + // vectors needed for the gradient/force calculation + double dphidr1x,dphidr1y,dphidr1z,dphidr2x,dphidr2y,dphidr2z; + double dphidr3x,dphidr3y,dphidr3z,dphidr4x,dphidr4y,dphidr4z; + double dpsidr1x,dpsidr1y,dpsidr1z,dpsidr2x,dpsidr2y,dpsidr2z; + double dpsidr3x,dpsidr3y,dpsidr3z,dpsidr4x,dpsidr4y,dpsidr4z; + + // Definition of cross-term dihedrals + + // phi dihedral + // |--------------------| + // a1-----a2-----a3-----a4-----a5 cross-term atoms + // C N CA C N cross-term atom types + // |--------------------| + // psi dihedral + + double **x = atom->x; + double **f = atom->f; + int nlocal = atom->nlocal; + + ecmap = 0.0; + int eflag = eflag_caller; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = 0; + + for (n = 0; n < ncrosstermlist; n++) { + i1 = crosstermlist[n][0]; + i2 = crosstermlist[n][1]; + i3 = crosstermlist[n][2]; + i4 = crosstermlist[n][3]; + i5 = crosstermlist[n][4]; + + type = crosstermlist[n][5]; + if (type == 0) continue; + + // calculate bond vectors for both dihedrals + + // phi + // vb21 = r2 - r1 + + vb21x = x[i2][0] - x[i1][0]; + vb21y = x[i2][1] - x[i1][1]; + vb21z = x[i2][2] - x[i1][2]; + vb12x = -1.0*vb21x; + vb12y = -1.0*vb21y; + vb12z = -1.0*vb21z; + vb32x = x[i3][0] - x[i2][0]; + vb32y = x[i3][1] - x[i2][1]; + vb32z = x[i3][2] - x[i2][2]; + vb23x = -1.0*vb32x; + vb23y = -1.0*vb32y; + vb23z = -1.0*vb32z; + + vb34x = x[i3][0] - x[i4][0]; + vb34y = x[i3][1] - x[i4][1]; + vb34z = x[i3][2] - x[i4][2]; + + // psi + // bond vectors same as for phi: vb32 + + vb43x = -1.0*vb34x; + vb43y = -1.0*vb34y; + vb43z = -1.0*vb34z; + + vb45x = x[i4][0] - x[i5][0]; + vb45y = x[i4][1] - x[i5][1]; + vb45z = x[i4][2] - x[i5][2]; + vb54x = -1.0*vb45x; + vb54y = -1.0*vb45y; + vb54z = -1.0*vb45z; + + // calculate normal vectors for planes that define the dihedral angles + + a1x = vb12y*vb23z - vb12z*vb23y; + a1y = vb12z*vb23x - vb12x*vb23z; + a1z = vb12x*vb23y - vb12y*vb23x; + + b1x = vb43y*vb23z - vb43z*vb23y; + b1y = vb43z*vb23x - vb43x*vb23z; + b1z = vb43x*vb23y - vb43y*vb23x; + + a2x = vb23y*vb34z - vb23z*vb34y; + a2y = vb23z*vb34x - vb23x*vb34z; + a2z = vb23x*vb34y - vb23y*vb34x; + + b2x = vb45y*vb43z - vb45z*vb43y; + b2y = vb45z*vb43x - vb45x*vb43z; + b2z = vb45x*vb43y - vb45y*vb43x; + + // calculate terms used later in calculations + + r32 = sqrt(vb32x*vb32x + vb32y*vb32y + vb32z*vb32z); + a1sq = a1x*a1x + a1y*a1y + a1z*a1z; + b1sq = b1x*b1x + b1y*b1y + b1z*b1z; + + r43 = sqrt(vb43x*vb43x + vb43y*vb43y + vb43z*vb43z); + a2sq = a2x*a2x + a2y*a2y + a2z*a2z; + b2sq = b2x*b2x + b2y*b2y + b2z*b2z; + //if (a1sq<0.0001 || b1sq<0.0001 || a2sq<0.0001 || b2sq<0.0001) + // printf("a1sq b1sq a2sq b2sq: %f %f %f %f \n",a1sq,b1sq,a2sq,b2sq); + if (a1sq<0.0001 || b1sq<0.0001 || a2sq<0.0001 || b2sq<0.0001) continue; + dpr21r32 = vb21x*vb32x + vb21y*vb32y + vb21z*vb32z; + dpr34r32 = vb34x*vb32x + vb34y*vb32y + vb34z*vb32z; + dpr32r43 = vb32x*vb43x + vb32y*vb43y + vb32z*vb43z; + dpr45r43 = vb45x*vb43x + vb45y*vb43y + vb45z*vb43z; + + // calculate the backbone dihedral angles as VMD and GROMACS + + phi = dihedral_angle_atan2(vb21x,vb21y,vb21z,a1x,a1y,a1z,b1x,b1y,b1z,r32); + psi = dihedral_angle_atan2(vb32x,vb32y,vb32z,a2x,a2y,a2z,b2x,b2y,b2z,r43); + + if (phi == 180.0) phi= -180.0; + if (psi == 180.0) psi= -180.0; + + phi1 = phi; + if (phi1 < 0.0) phi1 += 360.0; + psi1 = psi; + if (psi1 < 0.0) psi1 += 360.0; + + // find the neighbor grid point index + + li1 = int(((phi1+CMAPXMIN2)/CMAPDX)+((CMAPDIM*1.0)/2.0)); + li2 = int(((psi1+CMAPXMIN2)/CMAPDX)+((CMAPDIM*1.0)/2.0)); + + li3 = int((phi-CMAPXMIN2)/CMAPDX); + li4 = int((psi-CMAPXMIN2)/CMAPDX); + mli3 = li3 % CMAPDIM; + mli4 = li4 % CMAPDIM; + mli31 = (li3+1) % CMAPDIM; + mli41 = (li4+1) %CMAPDIM; + mli1 = li1 % CMAPDIM; + mli2 = li2 % CMAPDIM; + mli11 = (li1+1) % CMAPDIM; + mli21 = (li2+1) %CMAPDIM; + t1 = type-1; + if (t1 < 0 || t1 > 5) error->all(FLERR,"Invalid CMAP crossterm_type"); + + // determine the values and derivatives for the grid square points + + gs[0] = cmapgrid[t1][mli3][mli4]; + gs[1] = cmapgrid[t1][mli31][mli4]; + gs[2] = cmapgrid[t1][mli31][mli41]; + gs[3] = cmapgrid[t1][mli3][mli41]; + d1gs[0] = d1cmapgrid[t1][mli1][mli2]; + d1gs[1] = d1cmapgrid[t1][mli11][mli2]; + d1gs[2] = d1cmapgrid[t1][mli11][mli21]; + d1gs[3] = d1cmapgrid[t1][mli1][mli21]; + + d2gs[0] = d2cmapgrid[t1][mli1][mli2]; + d2gs[1] = d2cmapgrid[t1][mli11][mli2]; + d2gs[2] = d2cmapgrid[t1][mli11][mli21]; + d2gs[3] = d2cmapgrid[t1][mli1][mli21]; + + d12gs[0] = d12cmapgrid[t1][mli1][mli2]; + d12gs[1] = d12cmapgrid[t1][mli11][mli2]; + d12gs[2] = d12cmapgrid[t1][mli11][mli21]; + d12gs[3] = d12cmapgrid[t1][mli1][mli21]; + + // calculate the cmap energy and the gradient (dE/dphi,dE/dpsi) + + bc_interpol(phi,psi,li3,li4,gs,d1gs,d2gs,d12gs); + + // sum up cmap energy contributions + + engfraction = 0.2 * E; + if (i1 < nlocal) ecmap += engfraction; + if (i2 < nlocal) ecmap += engfraction; + if (i3 < nlocal) ecmap += engfraction; + if (i4 < nlocal) ecmap += engfraction; + if (i5 < nlocal) ecmap += engfraction; + + // calculate the derivatives dphi/dr_i + + dphidr1x = 1.0*r32/a1sq*a1x; + dphidr1y = 1.0*r32/a1sq*a1y; + dphidr1z = 1.0*r32/a1sq*a1z; + + dphidr2x = -1.0*r32/a1sq*a1x - dpr21r32/a1sq/r32*a1x + + dpr34r32/b1sq/r32*b1x; + dphidr2y = -1.0*r32/a1sq*a1y - dpr21r32/a1sq/r32*a1y + + dpr34r32/b1sq/r32*b1y; + dphidr2z = -1.0*r32/a1sq*a1z - dpr21r32/a1sq/r32*a1z + + dpr34r32/b1sq/r32*b1z; + + dphidr3x = dpr34r32/b1sq/r32*b1x - dpr21r32/a1sq/r32*a1x - r32/b1sq*b1x; + dphidr3y = dpr34r32/b1sq/r32*b1y - dpr21r32/a1sq/r32*a1y - r32/b1sq*b1y; + dphidr3z = dpr34r32/b1sq/r32*b1z - dpr21r32/a1sq/r32*a1z - r32/b1sq*b1z; + + dphidr4x = r32/b1sq*b1x; + dphidr4y = r32/b1sq*b1y; + dphidr4z = r32/b1sq*b1z; + + // calculate the derivatives dpsi/dr_i + + dpsidr1x = 1.0*r43/a2sq*a2x; + dpsidr1y = 1.0*r43/a2sq*a2y; + dpsidr1z = 1.0*r43/a2sq*a2z; + + dpsidr2x = r43/a2sq*a2x + dpr32r43/a2sq/r43*a2x - dpr45r43/b2sq/r43*b2x; + dpsidr2y = r43/a2sq*a2y + dpr32r43/a2sq/r43*a2y - dpr45r43/b2sq/r43*b2y; + dpsidr2z = r43/a2sq*a2z + dpr32r43/a2sq/r43*a2z - dpr45r43/b2sq/r43*b2z; + + dpsidr3x = dpr45r43/b2sq/r43*b2x - dpr32r43/a2sq/r43*a2x - r43/b2sq*b2x; + dpsidr3y = dpr45r43/b2sq/r43*b2y - dpr32r43/a2sq/r43*a2y - r43/b2sq*b2y; + dpsidr3z = dpr45r43/b2sq/r43*b2z - dpr32r43/a2sq/r43*a2z - r43/b2sq*b2z; + + dpsidr4x = r43/b2sq*b2x; + dpsidr4y = r43/b2sq*b2y; + dpsidr4z = r43/b2sq*b2z; + + // calculate forces on cross-term atoms: F = -(dE/dPhi)*(dPhi/dr) + + f1[0] = dEdPhi*dphidr1x; + f1[1] = dEdPhi*dphidr1y; + f1[2] = dEdPhi*dphidr1z; + f2[0] = dEdPhi*dphidr2x + dEdPsi*dpsidr1x; + f2[1] = dEdPhi*dphidr2y + dEdPsi*dpsidr1y; + f2[2] = dEdPhi*dphidr2z + dEdPsi*dpsidr1z; + f3[0] = -dEdPhi*dphidr3x - dEdPsi*dpsidr2x; + f3[1] = -dEdPhi*dphidr3y - dEdPsi*dpsidr2y; + f3[2] = -dEdPhi*dphidr3z - dEdPsi*dpsidr2z; + f4[0] = -dEdPhi*dphidr4x - dEdPsi*dpsidr3x; + f4[1] = -dEdPhi*dphidr4y - dEdPsi*dpsidr3y; + f4[2] = -dEdPhi*dphidr4z - dEdPsi*dpsidr3z; + f5[0] = -dEdPsi*dpsidr4x; + f5[1] = -dEdPsi*dpsidr4y; + f5[2] = -dEdPsi*dpsidr4z; + + // apply force to each of the 5 atoms + + if (i1 < nlocal) { + f[i1][0] += f1[0]; + f[i1][1] += f1[1]; + f[i1][2] += f1[2]; + } + if (i2 < nlocal) { + f[i2][0] += f2[0]; + f[i2][1] += f2[1]; + f[i2][2] += f2[2]; + } + if (i3 < nlocal) { + f[i3][0] += f3[0]; + f[i3][1] += f3[1]; + f[i3][2] += f3[2]; + } + if (i4 < nlocal) { + f[i4][0] += f4[0]; + f[i4][1] += f4[1]; + f[i4][2] += f4[2]; + } + if (i5 < nlocal) { + f[i5][0] += f5[0]; + f[i5][1] += f5[1]; + f[i5][2] += f5[2]; + } + + // tally energy and/or virial + + if (evflag) { + nlist = 0; + if (i1 < nlocal) list[nlist++] = i1; + if (i2 < nlocal) list[nlist++] = i2; + if (i3 < nlocal) list[nlist++] = i3; + if (i4 < nlocal) list[nlist++] = i4; + if (i5 < nlocal) list[nlist++] = i5; + vcmap[0] = (vb12x*f1[0])+(vb32x*f3[0])+((vb43x+vb32x)*f4[0])+ + ((vb54x+vb43x+vb32x)*f5[0]); + vcmap[1] = (vb12y*f1[1])+(vb32y*f3[1])+((vb43y+vb32y)*f4[1])+ + ((vb54y+vb43y+vb32y)*f5[1]); + vcmap[2] = (vb12z*f1[2])+(vb32z*f3[2])+((vb43z+vb32z)*f4[2])+ + ((vb54z+vb43z+vb32z)*f5[2]); + vcmap[3] = (vb12x*f1[1])+(vb32x*f3[1])+((vb43x+vb32x)*f4[1])+ + ((vb54x+vb43x+vb32x)*f5[1]); + vcmap[4] = (vb12x*f1[2])+(vb32x*f3[2])+((vb43x+vb32x)*f4[2])+ + ((vb54x+vb43x+vb32x)*f5[2]); + vcmap[5] = (vb12y*f1[2])+(vb32y*f3[2])+((vb43y+vb32y)*f4[2])+ + ((vb54y+vb43y+vb32y)*f5[2]); + ev_tally(nlist,list,5.0,E,vcmap); + //ev_tally(5,list,nlocal,newton_bond,E,vcmap); + } + } +} + +/* ---------------------------------------------------------------------- */ + +void FixCMAP::post_force_respa(int vflag, int ilevel, int iloop) +{ + if (ilevel == nlevels_respa-1) post_force(vflag); +} + +/* ---------------------------------------------------------------------- */ + +void FixCMAP::min_post_force(int vflag) +{ + post_force(vflag); +} + +/* ---------------------------------------------------------------------- + energy of CMAP term +------------------------------------------------------------------------- */ + +double FixCMAP::compute_scalar() +{ + double all; + MPI_Allreduce(&ecmap,&all,1,MPI_DOUBLE,MPI_SUM,world); + return all; +} + +// ---------------------------------------------------------------------- +// ---------------------------------------------------------------------- +// methods to read CMAP potential file, perform interpolation +// ---------------------------------------------------------------------- +// ---------------------------------------------------------------------- + +void FixCMAP::read_grid_map(char *cmapfile) +{ + char line[MAXLINE]; + char *chunk; + int i1, i2, i3, i4, i5, i6, j1, j2, j3, j4, j5, j6, counter; + + FILE *fp = fopen(cmapfile,"r"); + if (fp == NULL) { + char str[128]; + sprintf(str,"Cannot open fix cmap file %s",cmapfile); + error->one(FLERR,str); + } + + for (int ix1 = 0; ix1 < 6; ix1++) + for (int ix2 = 0; ix2 < CMAPDIM; ix2++) + for (int ix3 = 0; ix3 < CMAPDIM; ix3++) + cmapgrid[ix1][ix2][ix3] = 0.0; + + counter = 0; + i1 = i2 = i3 = i4 = i5 = i6 = 0; + j1 = j2 = j3 = j4 = j5 = j6 = 0; + + while (fgets(line,MAXLINE,fp) != NULL) { + if (line == "" || line[0] == '#') { ;; } + + // read in the cmap grid point values + // NOTE: The order to read the 6 grid maps is HARD-CODED, thus errors + // will occur if content of the file "cmap.data" is altered + // + // Reading order of the maps: + // 1. Alanine map + // 2. Alanine before proline map + // 3. Proline map + // 4. Two adjacent prolines map + // 5. Glycine map + // 6. Glycine before proline map + + else { + chunk = strtok(line, " \r\n"); + while (chunk != NULL) { + + // alanine map + + if (counter < CMAPDIM*CMAPDIM) { + cmapgrid[0][i1][j1] = atof(chunk); + chunk = strtok(NULL, " \r\n"); + j1++; + if (j1 == CMAPDIM) { + j1 = 0; + i1++; + } + counter++; + } + + // alanine-proline map + + else if (counter >= CMAPDIM*CMAPDIM && + counter < 2*CMAPDIM*CMAPDIM) { + cmapgrid[1][i2][j2]= atof(chunk); + chunk = strtok(NULL, " \r\n"); + j2++; + if (j2 == CMAPDIM) { + j2 = 0; + i2++; + } + counter++; + } + + // proline map + + else if (counter >= 2*CMAPDIM*CMAPDIM && + counter < 3*CMAPDIM*CMAPDIM) { + cmapgrid[2][i3][j3] = atof(chunk); + chunk = strtok(NULL, " \r\n"); + j3++; + if (j3 == CMAPDIM) { + j3 = 0; + i3++; + } + counter++; + } + + // 2 adjacent prolines map + + else if (counter >= 3*CMAPDIM*CMAPDIM && + counter < 4*CMAPDIM*CMAPDIM) { + cmapgrid[3][i4][j4] = atof(chunk); + chunk = strtok(NULL, " \r\n"); + j4++; + if (j4 == CMAPDIM) { + j4 = 0; + i4++; + } + counter++; + } + + // glycine map + + else if (counter >= 4*CMAPDIM*CMAPDIM && + counter < 5*CMAPDIM*CMAPDIM) { + cmapgrid[4][i5][j5] = atof(chunk); + chunk = strtok(NULL, " \r\n"); + j5++; + if (j5 == CMAPDIM) { + j5 = 0; + i5++; + } + counter++; + } + + // glycine-proline map + + else if (counter >= 5*CMAPDIM*CMAPDIM && + counter < 6*CMAPDIM*CMAPDIM) { + cmapgrid[5][i6][j6] = atof(chunk); + chunk = strtok(NULL, " \r\n"); + j6++; + if (j6 == CMAPDIM) { + j6 = 0; + i6++; + } + counter++; + } + + else break; + } + } + } + + fclose(fp); +} + +/* ---------------------------------------------------------------------- */ + +void FixCMAP::spline(double *y, double *ddy, int n) +{ + // create the 2nd dervatives of a taublated function y_i(x_i) + // at the tabulated points + + int i, j; + double p, *u; + + memory->create(u,n-1,"cmap:u"); + + ddy[0] = u[0] = 0.0; + + for (i = 1; i <= n-2; i++) { + p = 1.0/(ddy[i-1]+4.0); + ddy[i] = -p; + u[i] = ((((6.0*y[i+1])-(12.0*y[i])+(6.0*y[i-1]))/(CMAPDX*CMAPDX))-u[i-1])*p; + } + + ddy[n-1] = 0.0; + + for (j = n-2; j >= 0; j--) + ddy[j] = ddy[j]*ddy[j+1] + u[j]; + + memory->destroy(u); +} + +/* ---------------------------------------------------------------------- */ + +void FixCMAP::spl_interpolate(double x, double *y, double *ddy, double &yo, + double &dyo) +{ + // perform a 1D cubic spline interpolation + + int ix; + double a,b,a1,b1,a2,b2; + + ix = int((x-CMAPXMIN)/CMAPDX-(1./2.)); + + a = (CMAPXMIN+(ix*1.0)*CMAPDX-x)/CMAPDX; + b = (x-CMAPXMIN-(((ix-1)*1.0)*CMAPDX))/CMAPDX; + + a1 = a*a*a-a; + b1 = b*b*b-b; + + a2 = 3.0*a*a-1.0; + b2 = 3.0*b*b-1.0; + yo = a*y[ix]+b*y[ix+1]+(a1*ddy[ix]+b1*ddy[ix+1])*(CMAPDX*CMAPDX)/6.0; + dyo = (y[ix+1]-y[ix])/CMAPDX-a2/6.0*CMAPDX*ddy[ix]+b2/6.0*CMAPDX*ddy[ix+1]; +} + +/* ---------------------------------------------------------------------- */ + +void FixCMAP::set_map_derivatives(double **map, double **d1yo, double **d2yo, + double **d12yo) +{ + // precompute the gradient and cross-derivatives of the map grid points. + // use the bicubic spline to calculate the derivatives + + int i, j, k, ii, jj, xm, p; + double phi, psi, y, d1y, d2y, d12y, tyyk,tdyk; + double *tmp_y, *tmp_dy, *tmp_ddy, **tmap, **tddmap; + int ix; + double a,b,a1,b1,a2,b2; + + xm = CMAPDIM/2; + p = CMAPDIM; + + y = 0.; + d1y = 0.; + d2y = 0.; + d12y = 0.; + + memory->create(tmp_y,CMAPDIM*2,"cmap:tmp_y"); + memory->create(tmp_dy,CMAPDIM*2,"cmap:tmp_dy"); + memory->create(tmp_ddy,CMAPDIM*2,"cmap:tmp_ddy"); + memory->create(tmap,CMAPDIM*2,CMAPDIM*2,"cmap:tmap"); + memory->create(tddmap,CMAPDIM*2,CMAPDIM*2,"cmap:tddmap"); + + // periodically expand the original map + // use the expanded map for bicubic spline interpolation, + // which is used to obtain the derivatives + // actual interpolation is done with bicubic interpolation + + for (i = 0; i < CMAPDIM*2; i++) { + ii = ((i+CMAPDIM-xm)%CMAPDIM); + for (j = 0; j < CMAPDIM*2; j++) { + jj = ((j+CMAPDIM-xm)%CMAPDIM); + tmap[i][j] = map[ii][jj]; + } + } + + for (i = 0; i < CMAPDIM*2; i++) + spline(tmap[i], tddmap[i], CMAPDIM*2); + + for (i = xm; i < CMAPDIM+xm; i++) { + phi = (i-xm)*CMAPDX-180.0; + for (j = xm; j < CMAPDIM+xm; j++) { + psi = (j-xm)*CMAPDX-180.0; + ix = int((psi-CMAPXMIN)/CMAPDX); + a = (CMAPXMIN+((ix+1)*1.0)*CMAPDX-psi)/CMAPDX; + b = (psi-CMAPXMIN-((ix)*1.0)*CMAPDX)/CMAPDX; + a1 = a*a*a-a; + b1 = b*b*b-b; + a2 = 3.0*a*a-1.0; + b2 = 3.0*b*b-1.0; + for (k = 0; k < CMAPDIM*2; k++) { + tyyk = tmp_y[k]; + tdyk = tmp_dy[k]; + tyyk = a*tmap[k][ix]+b*tmap[k][ix+1]+ + (a1*tddmap[k][ix]+b1*tddmap[k][ix+1])*(CMAPDX*CMAPDX)/6.0; + tdyk = (tmap[k][ix+1]-tmap[k][ix])/CMAPDX- + (a2/6.0*CMAPDX*tddmap[k][ix])+(b2/6.0*CMAPDX*tddmap[k][ix+1]); + tmp_y[k] = tyyk; + tmp_dy[k] = tdyk; + } + + spline(tmp_y,tmp_ddy,CMAPDIM+xm+xm); + ix = int((phi-CMAPXMIN)/CMAPDX); + a = (CMAPXMIN+((ix+1)*1.0)*CMAPDX-phi)/CMAPDX; + b = (phi-CMAPXMIN-(ix*1.0)*CMAPDX)/CMAPDX; + a1 = a*a*a-a; + b1 = b*b*b-b; + a2 = 3.0*a*a-1.0; + b2 = 3.0*b*b-1.0; + y = a*tmp_y[ix]+b*tmp_y[ix+1]+ + (a1*tmp_ddy[ix]+b1*tmp_ddy[ix+1])*(CMAPDX*CMAPDX)/6.0; + d1y = (tmp_y[ix+1]-tmp_y[ix])/CMAPDX- + a2/6.0*CMAPDX*tmp_ddy[ix]+b2/6.0*CMAPDX*tmp_ddy[ix+1]; + spline(tmp_dy,tmp_ddy,CMAPDIM+xm+xm); + ix = int((phi-CMAPXMIN)/CMAPDX); + a = (CMAPXMIN+((ix+1)*1.0)*CMAPDX-phi)/CMAPDX; + b = (phi-CMAPXMIN-(ix*1.0)*CMAPDX)/CMAPDX; + a1 = a*a*a-a; + b1 = b*b*b-b; + a2 = 3.0*a*a-1.0; + b2 = 3.0*b*b-1.0; + d2y = a*tmp_dy[ix]+b*tmp_dy[ix+1]+ + (a1*tmp_ddy[ix]+b1*tmp_ddy[ix+1])*(CMAPDX*CMAPDX)/6.0; + d12y = (tmp_dy[ix+1]-tmp_dy[ix])/CMAPDX- + a2/6.0*CMAPDX*tmp_ddy[ix]+b2/6.0*CMAPDX*tmp_ddy[ix+1]; + d1yo[i%p][j%p] = d1y; + d2yo[i%p][j%p] = d2y; + d12yo[i%p][j%p] = d12y; + } + } + + memory->destroy(tmp_y); + memory->destroy(tmp_dy); + memory->destroy(tmp_ddy); + memory->destroy(tmap); + memory->destroy(tddmap); +} + +/* ---------------------------------------------------------------------- */ + +double FixCMAP::dihedral_angle_atan2(double fx, double fy, double fz, + double ax, double ay, double az, + double bx, double by, double bz, + double absg) +{ + // calculate the dihedral angle + + double angle, arg1, arg2; + + arg1 = absg*(fx*bx+fy*by+fz*bz); + arg2 = ax*bx+ay*by+az*bz; + + if (arg1 == 0 && arg2 == 0) + error->all(FLERR,"CMAP: atan2 function cannot take 2 zero arguments"); + else { + angle = atan2(arg1,arg2); + angle = angle*180.0/MY_PI; + } + + return angle; +} + +/* ---------------------------------------------------------------------- */ + +void FixCMAP::bc_coeff(double *gs, double *d1gs, double *d2gs, double *d12gs) +{ + // calculate the bicubic interpolation coefficients c_ij + + static int wt[16][16] = + { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 3, 0, 0, 0, 0,-2, 0, 0,-1, 0, 0, 0, 0, + 2, 0, 0,-2, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0,-3, 0, 0, 3, 0, 0, 0, 0,-2, 0, 0,-1, + 0, 0, 0, 0, 2, 0, 0,-2, 0, 0, 0, 0, 1, 0, 0, 1, + -3, 3, 0, 0,-2,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,-3, 3, 0, 0,-2,-1, 0, 0, + 9,-9, 9,-9, 6, 3,-3,-6, 6,-6,-3, 3, 4, 2, 1, 2, + -6, 6,-6, 6,-4,-2, 2, 4,-3, 3, 3,-3,-2,-1,-1,-2, + 2,-2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2,-2, 0, 0, 1, 1, 0, 0, + -6, 6,-6, 6,-3,-3, 3, 3,-4, 4, 2,-2,-2,-2,-1,-1, + 4,-4, 4,-4, 2, 2,-2,-2, 2,-2,-2, 2, 1, 1, 1, 1 + }; + + int i, j, k, l, in; + double xx, x[16]; + + for (i = 0; i < 4; i++) { + x[i] = gs[i]; + x[i+4] = d1gs[i]*CMAPDX; + x[i+8] = d2gs[i]*CMAPDX; + x[i+12] = d12gs[i]*CMAPDX*CMAPDX; + } + + in = 0; + for (i = 0; i < 4; i++) { + for (j = 0; j < 4; j++) { + xx = 0.0; + for (k = 0; k < 16; k++) xx += wt[in][k]*x[k]; + in++; + cij[i][j] = xx; + } + } +} + +/* ---------------------------------------------------------------------- */ + +void FixCMAP::bc_interpol(double x1, double x2, int low1, int low2, double *gs, + double *d1gs, double *d2gs, double *d12gs) +{ + // for a given point of interest and its corresponding grid square values, + // gradients and cross-derivatives + // calculate the interpolated value of the point of interest (POI) + + int i, p=12; + double t, u, fac, gs1l, gs2l, gs1u, gs2u; + + // set the interpolation coefficients + + bc_coeff(gs,d1gs,d2gs,d12gs); + + gs1l = g_axis[low1]; + gs2l = g_axis[low2]; + + t = (x1-gs1l)/CMAPDX; + u = (x2-gs2l)/CMAPDX; + + E = dEdPhi = dEdPsi = 0.0; + + for (i = 3; i >= 0; i--) { + E = t*E + ((cij[i][3]*u+cij[i][2])*u+cij[i][1])*u+cij[i][0]; + dEdPhi = u*dEdPhi + (3.0*cij[3][i]*t+2.0*cij[2][i])*t+cij[1][i]; + dEdPsi = t*dEdPsi + (3.0*cij[i][3]*u+2.0*cij[i][2])*u+cij[i][1]; + } + + dEdPhi *= (180.0/MY_PI/CMAPDX); + dEdPsi *= (180.0/MY_PI/CMAPDX); +} + +// ---------------------------------------------------------------------- +// ---------------------------------------------------------------------- +// methods to read and write data file +// ---------------------------------------------------------------------- +// ---------------------------------------------------------------------- + +void FixCMAP::read_data_header(char *line) +{ + if (strstr(line,"crossterms")) { + sscanf(line,BIGINT_FORMAT,&ncmap); + } else error->all(FLERR,"Invalid read data header line for fix cmap"); + + // didn't set in constructor b/c this fix could be defined + // before newton command + + newton_bond = force->newton_bond; +} + +/* ---------------------------------------------------------------------- + unpack N lines in buf from section of data file labeled by keyword + id_offset is applied to atomID fields if multiple data files are read + store CMAP interactions as if newton_bond = OFF, even if actually ON +------------------------------------------------------------------------- */ + +void FixCMAP::read_data_section(char *keyword, int n, char *buf, + tagint id_offset) +{ + int m,tmp,itype; + tagint atom1,atom2,atom3,atom4,atom5; + char *next; + + next = strchr(buf,'\n'); + *next = '\0'; + int nwords = atom->count_words(buf); + *next = '\n'; + + if (nwords != 7) { + char str[128]; + sprintf(str,"Incorrect %s format in data file",keyword); + error->all(FLERR,str); + } + + // loop over lines of CMAP crossterms + // tokenize the line into values + // add crossterm to one of my atoms, depending on newton_bond + + for (int i = 0; i < n; i++) { + next = strchr(buf,'\n'); + *next = '\0'; + sscanf(buf,"%d %d " TAGINT_FORMAT " " TAGINT_FORMAT " " TAGINT_FORMAT + " " TAGINT_FORMAT " " TAGINT_FORMAT, + &tmp,&itype,&atom1,&atom2,&atom3,&atom4,&atom5); + + atom1 += id_offset; + atom2 += id_offset; + atom3 += id_offset; + atom4 += id_offset; + atom5 += id_offset; + + if ((m = atom->map(atom1)) >= 0) { + if (num_crossterm[m] == CMAPMAX) + error->one(FLERR,"Too many CMAP crossterms for one atom"); + crossterm_type[m][num_crossterm[m]] = itype; + crossterm_atom1[m][num_crossterm[m]] = atom1; + crossterm_atom2[m][num_crossterm[m]] = atom2; + crossterm_atom3[m][num_crossterm[m]] = atom3; + crossterm_atom4[m][num_crossterm[m]] = atom4; + crossterm_atom5[m][num_crossterm[m]] = atom5; + num_crossterm[m]++; + } + + if ((m = atom->map(atom2)) >= 0) { + if (num_crossterm[m] == CMAPMAX) + error->one(FLERR,"Too many CMAP crossterms for one atom"); + crossterm_type[m][num_crossterm[m]] = itype; + crossterm_atom1[m][num_crossterm[m]] = atom1; + crossterm_atom2[m][num_crossterm[m]] = atom2; + crossterm_atom3[m][num_crossterm[m]] = atom3; + crossterm_atom4[m][num_crossterm[m]] = atom4; + crossterm_atom5[m][num_crossterm[m]] = atom5; + num_crossterm[m]++; + } + + if ((m = atom->map(atom3)) >= 0) { + if (num_crossterm[m] == CMAPMAX) + error->one(FLERR,"Too many CMAP crossterms for one atom"); + crossterm_type[m][num_crossterm[m]] = itype; + crossterm_atom1[m][num_crossterm[m]] = atom1; + crossterm_atom2[m][num_crossterm[m]] = atom2; + crossterm_atom3[m][num_crossterm[m]] = atom3; + crossterm_atom4[m][num_crossterm[m]] = atom4; + crossterm_atom5[m][num_crossterm[m]] = atom5; + num_crossterm[m]++; + } + + if ((m = atom->map(atom4)) >= 0) { + if (num_crossterm[m] == CMAPMAX) + error->one(FLERR,"Too many CMAP crossterms for one atom"); + crossterm_type[m][num_crossterm[m]] = itype; + crossterm_atom1[m][num_crossterm[m]] = atom1; + crossterm_atom2[m][num_crossterm[m]] = atom2; + crossterm_atom3[m][num_crossterm[m]] = atom3; + crossterm_atom4[m][num_crossterm[m]] = atom4; + crossterm_atom5[m][num_crossterm[m]] = atom5; + num_crossterm[m]++; + } + + if ((m = atom->map(atom5)) >= 0) { + if (num_crossterm[m] == CMAPMAX) + error->one(FLERR,"Too many CMAP crossterms for one atom"); + crossterm_type[m][num_crossterm[m]] = itype; + crossterm_atom1[m][num_crossterm[m]] = atom1; + crossterm_atom2[m][num_crossterm[m]] = atom2; + crossterm_atom3[m][num_crossterm[m]] = atom3; + crossterm_atom4[m][num_crossterm[m]] = atom4; + crossterm_atom5[m][num_crossterm[m]] = atom5; + num_crossterm[m]++; + } + + buf = next + 1; + } +} + +/* ---------------------------------------------------------------------- */ + +bigint FixCMAP::read_data_skip_lines(char *keyword) +{ + return ncmap; +} + +/* ---------------------------------------------------------------------- + write Mth header line to file + only called by proc 0 +------------------------------------------------------------------------- */ + +void FixCMAP::write_data_header(FILE *fp, int mth) +{ + fprintf(fp,BIGINT_FORMAT " cmap crossterms\n",ncmap); +} + +/* ---------------------------------------------------------------------- + return size I own for Mth data section + # of data sections = 1 for this fix + nx = # of crossterms owned by my local atoms + if newton_bond off, atom only owns crossterm if it is atom3 + ny = columns = type + 5 atom IDs +------------------------------------------------------------------------- */ + +void FixCMAP::write_data_section_size(int mth, int &nx, int &ny) +{ + int i,m; + + tagint *tag = atom->tag; + int nlocal = atom->nlocal; + + nx = 0; + for (i = 0; i < nlocal; i++) + for (m = 0; m < num_crossterm[i]; m++) + if (crossterm_atom3[i][m] == tag[i]) nx++; + + ny = 6; +} + +/* ---------------------------------------------------------------------- + pack values for Mth data section into 2d buf + buf allocated by caller as owned crossterms by 6 +------------------------------------------------------------------------- */ + +void FixCMAP::write_data_section_pack(int mth, double **buf) +{ + int i,m; + + // 1st column = CMAP type + // 2nd-6th columns = 5 atom IDs + + tagint *tag = atom->tag; + int nlocal = atom->nlocal; + + int n = 0; + for (i = 0; i < nlocal; i++) { + for (m = 0; m < num_crossterm[i]; m++) { + if (crossterm_atom3[i][m] != tag[i]) continue; + buf[n][0] = ubuf(crossterm_type[i][m]).d; + buf[n][1] = ubuf(crossterm_atom1[i][m]).d; + buf[n][2] = ubuf(crossterm_atom2[i][m]).d; + buf[n][3] = ubuf(crossterm_atom3[i][m]).d; + buf[n][4] = ubuf(crossterm_atom4[i][m]).d; + buf[n][5] = ubuf(crossterm_atom5[i][m]).d; + n++; + } + } +} + +/* ---------------------------------------------------------------------- + write section keyword for Mth data section to file + use Molecules or Charges if that is only field, else use fix ID + only called by proc 0 +------------------------------------------------------------------------- */ + +void FixCMAP::write_data_section_keyword(int mth, FILE *fp) +{ + fprintf(fp,"\nCMAP\n\n"); +} + +/* ---------------------------------------------------------------------- + write N lines from buf to file + convert buf fields to int or double depending on styles + index can be used to prepend global numbering + only called by proc 0 +------------------------------------------------------------------------- */ + +void FixCMAP::write_data_section(int mth, FILE *fp, + int n, double **buf, int index) +{ + for (int i = 0; i < n; i++) + fprintf(fp,"%d %d " TAGINT_FORMAT " " TAGINT_FORMAT + " " TAGINT_FORMAT " " TAGINT_FORMAT " " TAGINT_FORMAT "\n", + index+i,(int) ubuf(buf[i][0]).i,(tagint) ubuf(buf[i][1]).i, + (tagint) ubuf(buf[i][2]).i,(tagint) ubuf(buf[i][3]).i, + (tagint) ubuf(buf[i][4]).i,(tagint) ubuf(buf[i][5]).i); +} + +// ---------------------------------------------------------------------- +// ---------------------------------------------------------------------- +// methods for restart and communication +// ---------------------------------------------------------------------- +// ---------------------------------------------------------------------- + +/* ---------------------------------------------------------------------- + pack entire state of Fix into one write +------------------------------------------------------------------------- */ + +void FixCMAP::write_restart(FILE *fp) +{ + if (comm->me == 0) { + int size = sizeof(bigint); + fwrite(&size,sizeof(int),1,fp); + fwrite(&ncmap,sizeof(bigint),1,fp); + } +} + +/* ---------------------------------------------------------------------- + use state info from restart file to restart the Fix +------------------------------------------------------------------------- */ + +void FixCMAP::restart(char *buf) +{ + ncmap = *((bigint *) buf); +} + +/* ---------------------------------------------------------------------- + pack values in local atom-based arrays for restart file +------------------------------------------------------------------------- */ + +int FixCMAP::pack_restart(int i, double *buf) +{ + int n = 1; + for (int m = 0; m < num_crossterm[i]; m++) { + buf[n++] = ubuf(MAX(crossterm_type[i][m],-crossterm_type[i][m])).d; + buf[n++] = ubuf(crossterm_atom1[i][m]).d; + buf[n++] = ubuf(crossterm_atom2[i][m]).d; + buf[n++] = ubuf(crossterm_atom3[i][m]).d; + buf[n++] = ubuf(crossterm_atom4[i][m]).d; + buf[n++] = ubuf(crossterm_atom5[i][m]).d; + } + buf[0] = n; + + return n; +} + +/* ---------------------------------------------------------------------- + unpack values from atom->extra array to restart the fix +------------------------------------------------------------------------- */ + +void FixCMAP::unpack_restart(int nlocal, int nth) +{ + double **extra = atom->extra; + + // skip to Nth set of extra values + + int n = 0; + for (int i = 0; i < nth; i++) n += static_cast<int> (extra[nlocal][n]); + + int count = static_cast<int> (extra[nlocal][n++]); + num_crossterm[nlocal] = (count-1)/6; + + for (int m = 0; m < num_crossterm[nlocal]; m++) { + crossterm_type[nlocal][m] = (int) ubuf(extra[nlocal][n++]).i; + crossterm_atom1[nlocal][m] = (tagint) ubuf(extra[nlocal][n++]).i; + crossterm_atom2[nlocal][m] = (tagint) ubuf(extra[nlocal][n++]).i; + crossterm_atom3[nlocal][m] = (tagint) ubuf(extra[nlocal][n++]).i; + crossterm_atom4[nlocal][m] = (tagint) ubuf(extra[nlocal][n++]).i; + crossterm_atom5[nlocal][m] = (tagint) ubuf(extra[nlocal][n++]).i; + } +} + +/* ---------------------------------------------------------------------- + maxsize of any atom's restart data +------------------------------------------------------------------------- */ + +int FixCMAP::maxsize_restart() +{ + return 1 + CMAPMAX*6; +} + +/* ---------------------------------------------------------------------- + size of atom nlocal's restart data +------------------------------------------------------------------------- */ + +int FixCMAP::size_restart(int nlocal) +{ + return 1 + num_crossterm[nlocal]*6; +} + +/* ---------------------------------------------------------------------- + allocate atom-based array +------------------------------------------------------------------------- */ + +void FixCMAP::grow_arrays(int nmax) +{ + num_crossterm = memory->grow(num_crossterm,nmax,"cmap:num_crossterm"); + crossterm_type = memory->grow(crossterm_type,nmax,CMAPMAX, + "cmap:crossterm_type"); + crossterm_atom1 = memory->grow(crossterm_atom1,nmax,CMAPMAX, + "cmap:crossterm_atom1"); + crossterm_atom2 = memory->grow(crossterm_atom2,nmax,CMAPMAX, + "cmap:crossterm_atom2"); + crossterm_atom3 = memory->grow(crossterm_atom3,nmax,CMAPMAX, + "cmap:crossterm_atom3"); + crossterm_atom4 = memory->grow(crossterm_atom4,nmax,CMAPMAX, + "cmap:crossterm_atom4"); + crossterm_atom5 = memory->grow(crossterm_atom5,nmax,CMAPMAX, + "cmap:crossterm_atom5"); + + // must initialize num_crossterm to 0 for added atoms + // may never be set for some atoms when data file is read + + for (int i = nmax_previous; i < nmax; i++) num_crossterm[i] = 0; + nmax_previous = nmax; +} + +/* ---------------------------------------------------------------------- + copy values within local atom-based array +------------------------------------------------------------------------- */ + +void FixCMAP::copy_arrays(int i, int j, int delflag) +{ + num_crossterm[j] = num_crossterm[i]; + + for (int k = 0; k < num_crossterm[j]; k++){ + crossterm_type[j][k] = crossterm_type[i][k]; + crossterm_atom1[j][k] = crossterm_atom1[i][k]; + crossterm_atom2[j][k] = crossterm_atom2[i][k]; + crossterm_atom3[j][k] = crossterm_atom3[i][k]; + crossterm_atom4[j][k] = crossterm_atom4[i][k]; + crossterm_atom5[j][k] = crossterm_atom5[i][k]; + } +} + +/* ---------------------------------------------------------------------- + initialize one atom's array values, called when atom is created +------------------------------------------------------------------------- */ + +void FixCMAP::set_arrays(int i) +{ + num_crossterm[i] = 0; +} + +/* ---------------------------------------------------------------------- + pack values in local atom-based array for exchange with another proc +------------------------------------------------------------------------- */ + +int FixCMAP::pack_exchange(int i, double *buf) +{ + int n = 0; + buf[n++] = ubuf(num_crossterm[i]).d; + for (int m = 0; m < num_crossterm[i]; m++) { + buf[n++] = ubuf(crossterm_type[i][m]).d; + buf[n++] = ubuf(crossterm_atom1[i][m]).d; + buf[n++] = ubuf(crossterm_atom2[i][m]).d; + buf[n++] = ubuf(crossterm_atom3[i][m]).d; + buf[n++] = ubuf(crossterm_atom4[i][m]).d; + buf[n++] = ubuf(crossterm_atom5[i][m]).d; + } + return n; +} + +/* ---------------------------------------------------------------------- + unpack values in local atom-based array from exchange with another proc +------------------------------------------------------------------------- */ + +int FixCMAP::unpack_exchange(int nlocal, double *buf) +{ + int n = 0; + num_crossterm[nlocal] = (int) ubuf(buf[n++]).i; + for (int m = 0; m < num_crossterm[nlocal]; m++) { + crossterm_type[nlocal][m] = (int) ubuf(buf[n++]).i; + crossterm_atom1[nlocal][m] = (tagint) ubuf(buf[n++]).i; + crossterm_atom2[nlocal][m] = (tagint) ubuf(buf[n++]).i; + crossterm_atom3[nlocal][m] = (tagint) ubuf(buf[n++]).i; + crossterm_atom4[nlocal][m] = (tagint) ubuf(buf[n++]).i; + crossterm_atom5[nlocal][m] = (tagint) ubuf(buf[n++]).i; + } + return n; +} + +/* ---------------------------------------------------------------------- + memory usage of local atom-based arrays +------------------------------------------------------------------------- */ + +double FixCMAP::memory_usage() +{ + int nmax = atom->nmax; + double bytes = nmax * sizeof(int); // num_crossterm + bytes += nmax*CMAPMAX * sizeof(int); // crossterm_type + bytes += 5*nmax*CMAPMAX * sizeof(int); // crossterm_atom 12345 + bytes += maxcrossterm*6 * sizeof(int); // crosstermlist + return bytes; +} diff --git a/src/MOLECULE/fix_cmap.h b/src/MOLECULE/fix_cmap.h new file mode 100644 index 0000000000000000000000000000000000000000..213d881e23c599e29165a8193f4f8d4efb31d87a --- /dev/null +++ b/src/MOLECULE/fix_cmap.h @@ -0,0 +1,129 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS + +FixStyle(cmap,FixCMAP) + +#else + +#ifndef LMP_FIX_CMAP_H +#define LMP_FIX_CMAP_H + +#include "fix.h" +namespace LAMMPS_NS { + +class FixCMAP : public Fix { + public: + FixCMAP(class LAMMPS *, int, char **); + ~FixCMAP(); + int setmask(); + void init(); + void setup(int); + void setup_pre_neighbor(); + void min_setup(int); + void pre_neighbor(); + void pre_reverse(int, int); + void post_force(int); + void post_force_respa(int, int, int); + void min_post_force(int); + double compute_scalar(); + + void read_data_header(char *); + void read_data_section(char *, int, char *, tagint); + bigint read_data_skip_lines(char *); + void write_data_header(FILE *, int); + void write_data_section_size(int, int &, int &); + void write_data_section_pack(int, double **); + void write_data_section_keyword(int, FILE *); + void write_data_section(int, FILE *, int, double **, int); + + void write_restart(FILE *); + void restart(char *); + int pack_restart(int, double *); + void unpack_restart(int, int); + int size_restart(int); + int maxsize_restart(); + + void grow_arrays(int); + void copy_arrays(int, int, int); + void set_arrays(int); + int pack_exchange(int, double *); + int unpack_exchange(int, double *); + + double memory_usage(); + + private: + int nprocs,me; + int newton_bond,eflag_caller; + int ctype,nlevels_respa; + int ncrosstermtypes,crossterm_per_atom,maxcrossterm; + int ncrosstermlist; + bigint ncmap; + + int **crosstermlist; + + int nmax_previous; + int *num_crossterm; + int **crossterm_type; + tagint **crossterm_atom1,**crossterm_atom2,**crossterm_atom3; + tagint **crossterm_atom4,**crossterm_atom5; + + double E,dEdPhi,dEdPsi; + double ecmap; + double fcmap[4],cij[4][4]; + double *g_axis; + + // CMAP grid points obtained from external file + + double ***cmapgrid; + + // partial derivatives and cross-derivatives of the grid data + + double ***d1cmapgrid,***d2cmapgrid,***d12cmapgrid; + + // read map grid data + + void read_grid_map(char *); + + // read in CMAP cross terms from LAMMPS data file + + void read_cmap_data(int, char *); + + // pre-compute the partial and cross-derivatives of map grid points + + void set_map_derivatives(double **, double **, double **, double **); + + // cubic spline interpolation functions for derivatives of map grid points + + void spline(double *, double *, int); + void spl_interpolate(double, double *, double *, double &, double &); + + // calculate dihedral angles + + double dihedral_angle_atan2(double, double, double, double, double, double, + double, double, double, double); + + // calculate bicubic interpolation coefficient matrix c_ij + + void bc_coeff(double *, double *, double *, double *); + + // perform bicubic interpolation at point of interest + + void bc_interpol(double, double, int, int, double *, double *, double *, + double *); +}; +} + +#endif +#endif diff --git a/src/version.h b/src/version.h index 3f90b4fc5bf56d29015582430bea194cbd8d6442..35c0f59e694ea868300abf5570bf3aef3e99ec10 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define LAMMPS_VERSION "21 Sep 2016" +#define LAMMPS_VERSION "26 Sep 2016" diff --git a/tools/ch2lmp/README b/tools/ch2lmp/README index eb994ccb6fda4277c11b2ddef8609df05d08bc12..fa031bd7579a0e5a26ecf961735c2060fc252128 100755 --- a/tools/ch2lmp/README +++ b/tools/ch2lmp/README @@ -11,35 +11,40 @@ In this directory, you should find: 3) An "example" folder containing an example of how to use these tools. 4) An "other" folder containing other potentially useful tools. -In addition, you will need to provide the following input for +In addition, you will need to provide the following input for charmm2lammps.pl: + 1) a CHARMM parameter file (par_<forcefield>.prm) 2) a CHARMM topology file (top_<forcefield>.rtf) 3) a CHARMM coordinates file or pdb file (<project>.crd or <project>.pdb) + (NOTE: a .pdb file is required if the -cmap option is used) 4) a CHARMM psf file (<project>.psf) To use the charmm2lammps.pl script, type: "perl charmm2lammps.pl -[-option[=#]] <forcefield> <project>" where <forcefield> is the name -of the CHARMM FF you are using, (i.e. all22_prot), and <project> is -the common name of your *.crd and *.psf files. The options for the -script are listed below. If the option requires a parameter, the -syntax must be [-option[=#]], (i.e. -border=5). - --help "display available options", --charmm "add charmm types to LAMMPS data file", --water "add TIP3P water [default: 1 g/cc]", --ions "add (counter)ions using Na+ and Cl- [default: 0 mol/l]", --center "recenter atoms", --quiet "do not print info", --pdb_ctrl "output project_ctrl.pdb", --l "set x-, y-, and z-dimensions simultaneously", --lx "x-dimension of simulation box", --ly "y-dimension of simulation box", --lz "z-dimension of simulation box", --border "add border to all sides of simulation box [default: 0 A]", --ax "rotation around x-axis", --ay "rotation around y-axis", --az "rotation around z-axis" +<forcefield> <project> [-option=value ...]" where <forcefield> is the +name of the CHARMM FF you are using, (i.e. all22_prot), and <project> +is the common name of your *.crd and *.psf files. Possible options +are listed next. If the option requires a parameter, the syntax +should be -option=value (e.g. -border=5). + +-help display available options +-charmm add charmm types to LAMMPS data file +-water add TIP3P water [default: 1 g/cc] +-ions add (counter)ions using Na+ and Cl- [default: 0 mol/l] +-center recenter atoms +-quiet do not print info +-pdb_ctrl output project_ctrl.pdb +-l set x-, y-, and z-dimensions simultaneously +-lx x-dimension of simulation box +-ly y-dimension of simulation box +-lz z-dimension of simulation box +-border add border to all sides of simulation box [default: 0 A] +-ax rotation around x-axis +-ay rotation around y-axis +-az rotation around z-axis +-cd correction for dihedral for carbohydrate systems +-cmap add CMAP section to data file and fix cmap command lines in + input script" (NOTE: requires use of *.pdb file) In the "example" folder, you will find example files that were created by following the steps below. These steps describe how to take a @@ -100,7 +105,22 @@ molecule. The -pdb_ctrl option produces the 1ac7_ctrl.pdb file that can be visualized in a standard visualization package such as VMD. The -charmm option put comments into the LAMMPS data file (everything after the # sign is a comment) for user convenience in tracking atom -types etc. according to CHARMM nomenclature. +types etc. according to CHARMM nomenclature. + +The example molecule provided above (i.e., 1ac7) is a DNA fragment. +If instead, a peptide longer than 2 amino acid residues or a protein +is to be modeled, the '-cmap' option should be used. This will add a +section at the end of the data file with the heading of 'CMAP' that +will contain cmap crossterm corrections for the phi-psi dihedrals for +the amino acid residues. You will then need to also copy the +appropriate file for the cmap crossterms into your directory and be +sure that you are using the appropriate cmap crossterms that go with +the respective version of the charmm force field that is being used +(e.g, cmap22.data or cmap36.data). This is necessary to account for +the fact that the CHARMM group has provided updated cmap correction +terms for use with the c36 and more recent version of the charmm +protein force field. Copies of cmap22.data and cmap36.data are +provided in the tools/ch2lmp directory. The default timestep in the LAMMPS *.in file is set to 0.5 fs, which can typically be increased to 2 fs after equilibration if the bonds @@ -109,9 +129,9 @@ delay on neigh_modify can probably increased to 5 or so to improve speed. The -ions option allows the user to neutralize the simulation cell -with Na+ or Cl- counterions if the molecule has a net -charge. Additional salt can be added by increasing the default -concentration (i.e. -ions=0.5). +with Na+ or Cl- counterions if the molecule has a net charge +Additional salt can be added by increasing the default concentration +(e.g. -ions=0.5). ** In the "other" file folder, you will find: @@ -126,5 +146,3 @@ concentration (i.e. -ions=0.5). 3) A 3rd party perl script called "crd2pdb.pl" 4) A 3rd party fortran code called "pdb_to_crd.f" - - diff --git a/tools/ch2lmp/charmm2lammps.pl b/tools/ch2lmp/charmm2lammps.pl index 8e43a06cabd2d4807344cabe8395bc4988f84a51..0e39f589da06f0c098f45e34389804e3eecca241 100644 --- a/tools/ch2lmp/charmm2lammps.pl +++ b/tools/ch2lmp/charmm2lammps.pl @@ -28,22 +28,43 @@ # 20050630 Fixed symbol issues arising from salt addition # 20060818 Changed reading of pdb format to read exact columns # 20070109 Changed AddMass() to use $max_id correctly -# 20160114 Added compatibility for parameter files that use IMPROPERS instead of IMPROPER -# Print warning when not all parameters are detected. Set correct number of atom types. -# 20160613 Fix off-by-one issue in atom type validation check -# Replace -charmm command line flag with -nohints flag -# and enable type hints in data file by default. -# Add hints also to section headers -# Add a brief minimization to example input template. +# 20130508 Added 'CMAP crossterms' section at the end of the data file +# 20131001 Added instructions in CMAP section to fix problem if 'ter' +# is not designated in .pdb file to identify last amino acid # # General Many thanks to Paul S. Crozier for checking script validity # against his projects. +# +# ------------------------------------------------------------------------------ +# NOTE: This current version was modified by Xiaohu Hu (hux2@ornl.gov) +# DATE: April, May 2009 +# Then finalized to complete addition of CMAP terms to data file +# by Robert A. Latour, Clemson University (latourr@clemson.edu) +# and Chris Lorenz, King's College (chris.lorenz@kcl.ac.uk) +# DATE: May, 2013 +# +# The original code of charmm2lammps.pl is modified +# +# 1. to fix the double-counting problem in 1-4 interaction associated +# with the carbon-hydrate 6-rings containing systems. (See subroutine +# DihedralCorrect6Ring, activated with the option "-cd") +# +# 2. to add a new section "CMAP" which is a list of the peptide +# backbone dihedrals cross terms. A modifed LAMMPS version will be +# needed to be able to use this feature. (See subroutine CharmmCmap, +# activated with the option "-cmap") +# +# These subroutines are independent from the original charmm2lammps.pl, i.e. +# the original code of charmm2lammps.pl is unchanged. The new routines only +# evaluate and modify the output generated by the original charmm2lammps.pl. +# ----------------------------------------------------------------------------- + # Initialization sub Test { - my $name = shift(@_); + my $name = shift(@_); # "@_" = argument passed to the subroutine printf("Error: file %s not found\n", $name) if (!scalar(stat($name))); return !scalar(stat($name)); @@ -54,11 +75,13 @@ { my $k = 0; my @dir = ("x", "y", "z"); - my @options = ("-help", "-nohints", "-water", "-ions", "-center", + + # Modified by Xiaohu Hu, May 2009. Options "-cmap" and "-cdihedral" added + my @options = ("-help", "-charmm", "-water", "-ions", "-center", "-quiet", "-pdb_ctrl", "-l", "-lx", "-ly", "-lz", - "-border", "-ax", "-ay", "-az"); - my @remarks = ("display this message", - "do not print type and style hints in data file", + "-border", "-ax", "-ay", "-az", "-cd", "-cmap"); + my @remarks = ("display this message", + "add charmm types to LAMMPS data file", "add TIP3P water [default: 1 g/cc]", "add (counter)ions using Na+ and Cl- [default: 0 mol/l]", "recenter atoms", @@ -71,14 +94,20 @@ "add border to all sides of simulation box [default: 0 A]", "rotation around x-axis", "rotation around y-axis", - "rotation around z-axis" + "rotation around z-axis", + "use the 6-ring dihedral correction", + "generate the CMAP section" ); my $notes; $program = "charmm2lammps"; - $version = "1.8.3"; - $year = "2016"; - $add = 1; +# $version = "1.8.2.5 beta"; # Modified by Xiaohu Hu, Dec 2009 + $version = "1.8.2.6 beta"; # Modified by Robert Latour & Chris Lorenz, May 2013 +# $year = "2009"; # Modified by Xiaohu Hu, April 2009 + $year = "2013"; # Modified by Robert Latour & Chris Lorenz, May 2013 + $cmap = 0; # Added by Xiaohu Hu, May 2009 + $cdihedral = 0; # Added by Xiaohu Hu, May 2009 + $add = 0; $water_dens = 0; $ions = 0; $info = 1; @@ -112,7 +141,7 @@ foreach (@ARGV) { - if (substr($_, 0, 1) eq "-") + if (substr($_, 0, 1) eq "-") # if the first letter of the aguement is "-" = an option { my $k = 0; my @tmp = split("="); @@ -123,23 +152,24 @@ last if ($tmp[0] eq substr($_, 0 , length($tmp[0]))); ++$k; } - $help = 1 if (!$k--); # -help - $add = 0 if (!$k--); # -nohints - $water_dens = ($tmp[1] ne "" ? $tmp[1] : 1) if (!$k--); # -water - $ion_molar = abs($tmp[1]) if (!$k); # -ions - $ions = 1 if (!$k--); # ... - $center = 1 if (!$k--); # -center - $info = 0 if (!$k--); # -quiet - $pdb_ctrl = $switch if (!$k--); # -pdb_ctrl - my $flag = $k--; # -l - $L[0] = abs($tmp[1]) if (!($flag && $k--)); # -lx - $L[1] = abs($tmp[1]) if (!($flag && $k--)); # -ly - $L[2] = abs($tmp[1]) if (!($flag && $k--)); # -lz - $border = abs($tmp[1]) if (!$k--); # -border - @R = M_Dot(M_Rotate(0, $tmp[1]), @R) if (!$k--);# -ax - @R = M_Dot(M_Rotate(1, $tmp[1]), @R) if (!$k--);# -ay - @R = M_Dot(M_Rotate(2, $tmp[1]), @R) if (!$k--);# -az - print("Warning: ignoring unknown command line flag: $tmp[0]\n"); + $help = 1 if (!$k--); + $add = 1 if (!$k--); + $water_dens = ($tmp[1] ne "" ? $tmp[1] : 1) if (!$k--); + $ion_molar = abs($tmp[1]) if (!$k); + $ions = 1 if (!$k--); + $center = 1 if (!$k--); + $info = 0 if (!$k--); + $pdb_ctrl = $switch if (!$k--); + my $flag = $k--; + $L[0] = abs($tmp[1]) if (!($flag && $k--)); + $L[1] = abs($tmp[1]) if (!($flag && $k--)); + $L[2] = abs($tmp[1]) if (!($flag && $k--)); + $border = abs($tmp[1]) if (!$k--); + @R = M_Dot(M_Rotate(0, $tmp[1]), @R) if (!$k--); + @R = M_Dot(M_Rotate(1, $tmp[1]), @R) if (!$k--); + @R = M_Dot(M_Rotate(2, $tmp[1]), @R) if (!$k--); + $cdihedral = 1 if (!$k--); # Added by Xiaohu Hu, May 2009 + $cmap = 1 if (!$k--); # Added by Xiaohu Hu, May 2009 } else { @@ -150,7 +180,7 @@ $water_dens = 1 if ($ions && !$water_dens); if (($k<2)||$help) { - printf("\n%s v%s (c)%s by Pieter J. in \'t Veld for SNL\n\n", + printf("\n%s v%s (c)%s by Pieter J. in \'t Veld for SNL\nwith 6-ring dihedral correction and CMAP added by X. Hu, 2009\n\n", $program, $version, $year); printf("Usage:\n %s.pl [-option[=#] ..] forcefield project\n\n",$program); printf("Options:\n"); @@ -161,7 +191,7 @@ printf("\nNotes:\n%s\n", $notes); exit(-1); } - else { printf("\n%s v%s (c)%s\n\n", $program, $version, $year) if ($info); } + else { printf("%s v%s (c)%s\n\n", $program, $version, $year) if ($info); } my $flag = Test($Parameters = "par_$forcefield.prm"); $flag |= Test($Topology = "top_$forcefield.rtf"); $flag |= Test($Pdb = "$project.pdb") @@ -300,7 +330,7 @@ sub PSFConnectivity { - my $n = PSFGoto(bonds); + my $n = PSFGoto(bonds); # $n = the total number of bonds return if (scalar(@nconnect)); printf("Info: creating connectivity\n") if ($info); @@ -312,7 +342,6 @@ } } - sub PSFDihedrals # hack to accomodate { # LAMMPS' way of calc $idihedral = 0; # LJ 1-4 interactions @@ -343,7 +372,6 @@ return $ndihedral; } - sub CreatePSFIndex # make an index of id { # locations my @psf_ids = ("!NATOM","!NBOND:","!NTHETA:","!NPHI:","!NIMPHI:"); @@ -363,26 +391,24 @@ } } - - sub PSFGoto # goto $ident in <PSF> + sub PSFGoto # goto $ident in <PSF> and return the total number of $ident { CreatePSFIndex() if (!scalar(%PSFIndex)); my $id = shift(@_); - my @n = split(" ", $PSFIndex{$id}); + my @n = split(" ", $PSFIndex{$id}); # = 1 if the $ident is found @PSFBuffer = (); # return PSFDihedrals() if ($id eq "dihedrals"); if (!scalar(@n)) { printf("Warning: PSF index for $id not found\n"); - seek(PSF, 0, SEEK_END); + seek(PSF, 0, SEEK_END); # set file-handle position to the EOF return -1; } seek(PSF, $n[0], SEEK_SET); return $n[1]; } - sub PSFGet { if ($dihedral_flag) @@ -400,7 +426,7 @@ } - sub PSFWrite + sub PSFWrite { my $items = shift(@_); my $n = $items; @@ -516,14 +542,11 @@ sub Markers { - my %markers = ( - NONBONDED => '0', - BONDS => '1', - ANGLES => '2', - DIHEDRALS => '3', - IMPROPERS => '4', - IMPROPER => '4' - ); + my %markers; + my $n = 0; + + foreach ("NONBONDED", "BONDS", "ANGLES", "DIHEDRALS", "IMPROPER") { + $markers{$_} = $n++; } return %markers; } @@ -613,7 +636,7 @@ { # <PARAMETERS> my $mode = shift(@_); # bonded mode return if (($mode>3)||($mode<0)); - + my $items = (2, 3, 4, 4)[$mode]; # items per entry my $name = ("bond", "angle", "dihedral", "improper")[$mode]; my $read = 0; @@ -688,7 +711,7 @@ sub SetScreeningFactor # set screening factor { - my $id = shift(@_); + my $id = shift(@_); # @_ has the form: ($variable, float no.) my $value = shift(@_); my $new = ""; @@ -702,7 +725,6 @@ $parms[$id] = $new; } - sub CorrectDihedralParameters { my $n = PSFGoto(dihedrals); @@ -713,15 +735,20 @@ my $first; my $last; - for (my $i=0; $i<$n; ++$i) + for (my $i=0; $i<$n; ++$i) # loop over all dihedrals { - my @bonded = PSFGet(4); + my @bonded = PSFGet(4); my @tmp = (); foreach (@bonded) { push(@tmp, $ids{$atom_types[$_]}); } $id1 = $link{CreateID(@tmp)}-1; $first = $bonded[0]; $last = $bonded[3]; + if ($first>$last) { my $tmp = $first; $first = $last; $last = $tmp; } + + # if the condition "$id2 = $hash{$hash_id = $first." ".$last}" is false, which means + # the id isn't in the hash, then it will be added, otherwise means this condition is + # true and the if (($id2 = $hash{$hash_id = $first." ".$last}) eq "") { $hash{$hash_id} = $id1; # add id to hash @@ -1010,7 +1037,7 @@ sub WriteLAMMPSHeader # print lammps header { - printf(LAMMPS "LAMMPS data file. CGCMM style. atom_style full. Created by $program v$version on %s\n", `date`); + printf(LAMMPS "Created by $program v$version on %s\n", `date`); printf(LAMMPS "%12d atoms\n", $natoms); printf(LAMMPS "%12d bonds\n", $nbonds); printf(LAMMPS "%12d angles\n", $nangles); @@ -1114,7 +1141,7 @@ { my @xyz = V_Add(@p, @p_water[$i,$i+1,$i+2]); @xyz = V_Add(@xyz, @Center) if (!$center); - printf(LAMMPS "%8d %7d %5d %9.6g %11.8g %11.8g %11.8g%s\n", + printf(LAMMPS "%8d %7d %5d %9.6g %16.12g %16.12g %16.12g%s\n", ++$k, $res, $par[$j], $charge[$j], $xyz[0], $xyz[1], $xyz[2], $add ? " # ".$types[$par[$j]-1] : ""); printf(PDB_CTRL "ATOM %6.6s %-4.4s %-3.3s %5.5s %3.3s ". @@ -1164,7 +1191,7 @@ CRDGoto(atoms); $net_charge = 0; - printf(LAMMPS "Atoms # full\n\n") if ($n>0); + printf(LAMMPS "Atoms\n\n") if ($n>0); for (my $i=0; $i<$n; ++$i) { my @crd = $pdb ? NextPDB2CRD() : split(" ", <CRD>); @@ -1172,7 +1199,7 @@ my @xyz = MV_Dot(@R, @crd[-6, -5, -4]); @xyz = V_Subtr(@xyz, @Center) if ($center); if ($crd[-2]!=$res[1]) { ++$res[0]; $res[1] = $crd[-2]; } - printf(LAMMPS "%8d %7d %5d %9.6g %11.7g %11.7g %11.7g%s\n", ++$k, + printf(LAMMPS "%8d %7d %5d %9.6g %16.12g %16.12g %16.12g%s\n", ++$k, $res[0], $link{$atom_types[$k]}, $psf[6], $xyz[0], $xyz[1], $xyz[2], $add ? " # ".$types[$link{$atom_types[$k]}-1] : ""); printf(PDB_CTRL "ATOM %6.6s %-4.4s %-4.4s %4.4s %3.3s ". @@ -1198,7 +1225,6 @@ { my $mode = shift(@_)+1; my $header = ("Pair","Bond","Angle","Dihedral","Improper")[$mode]; - my $hint = ("lj/charmm/coul/long", "harmonic", "charmm", "charmm", "harmonic")[$mode]; my $n = (4, 2, 4, 4, 2)[$mode]; my $k = 0; @@ -1212,7 +1238,7 @@ @parms = Delete(1, @parms) if ($mode==3); } return 0 if (!scalar(@parms)); - printf(LAMMPS "%s Coeffs # %s\n\n", $header, $hint); + printf(LAMMPS "%s Coeffs\n\n", $header); for (my $i=0; $i<scalar(@parms); ++$i) { if ($parms[$i] ne "") @@ -1222,7 +1248,7 @@ my @tmp = split(" "); printf(LAMMPS "%8d", ++$k); for (my $j=0; $j<$n; ++$j) { - printf(LAMMPS " %10.7g", $j<scalar(@tmp) ? $tmp[$j] : 0); } + printf(LAMMPS " %16.12g", $j<scalar(@tmp) ? $tmp[$j] : 0); } printf(LAMMPS "%s\n", $add ? " # ".$types[$i] : ""); } } else { ++$k; } @@ -1392,11 +1418,6 @@ CreateCorrectedPairCoefficients(); for (my $i=0; $i<scalar(@types); ++$i) { $types[$i] = $ids{$types[$i]}; } $natom_types = WriteParameters(-1); # pairs - if ($#types+1 > $natom_types) { - print "Warning: $#types atom types present, but only $natom_types pair coeffs found\n"; - # reset to what is found while determining the number of atom types. - $natom_types = $#types+1; - } $natoms = WriteAtoms(); $nbond_types = WriteParameters(0); # bonds $nbonds = WriteBonded(0); @@ -1428,15 +1449,29 @@ printf(LAMMPS "# Created by $program v$version on %s\n", `date`); printf(LAMMPS "units real\n"); # general printf(LAMMPS "neigh_modify delay 2 every 1\n\n"); + + printf(LAMMPS "boundary p p p\n\n"); printf(LAMMPS "atom_style full\n"); # styles printf(LAMMPS "bond_style harmonic\n") if ($nbond_types); printf(LAMMPS "angle_style charmm\n") if ($nangle_types); printf(LAMMPS "dihedral_style charmm\n") if ($ndihedral_types); printf(LAMMPS "improper_style harmonic\n\n") if ($nimproper_types); - printf(LAMMPS "pair_style lj/charmm/coul/long 8 10\n"); + printf(LAMMPS "# if cutoffs to be used for electrostatics, use pair_style lj/charmmfsw/coul/charmmfsh\n"); + printf(LAMMPS "# and delete or comment out kspace_style\n"); + printf(LAMMPS "pair_style lj/charmm/coul/long 8 12\n"); printf(LAMMPS "pair_modify mix arithmetic\n"); printf(LAMMPS "kspace_style pppm 1e-4\n\n"); - printf(LAMMPS "read_data $project.data\n\n"); # read data + + if ($cmap) { + printf(LAMMPS "# Modify following lines to provide directory path cmap.data and 'project'.data files\n"); + printf(LAMMPS "fix cmap all cmap /directoryPath/.../cmap36.data\n"); + printf(LAMMPS "fix_modify cmap energy yes\n"); + printf(LAMMPS "read_data /directoryPath/.../$project.data fix cmap crossterm CMAP\n\n"); + }else{ + printf(LAMMPS "# Modify following line to provide directory path for 'project'.data file\n"); + printf(LAMMPS "read_data /directoryPath/.../$project.data\n\n"); # read data + } + if ($coefficients ne "") # corrected coeffs { foreach (split(":", $coefficients)) @@ -1446,16 +1481,15 @@ printf(LAMMPS "\n"); } printf(LAMMPS "special_bonds charmm\n"); # invoke charmm - printf(LAMMPS "thermo 1\n"); # set thermo style - printf(LAMMPS "thermo_style multi\n"); - printf(LAMMPS "timestep 0.5\n\n"); # 0.5 ps time step - printf(LAMMPS "minimize 0.0 0.0 1000 10000\n\n"); # take off the edge printf(LAMMPS "fix 1 all nve\n"); printf(LAMMPS "fix 2 all shake 1e-6 500 0 m 1.0\n") if ($shake eq ""); # shake all H-bonds printf(LAMMPS "fix 2 all shake 1e-6 500 0 m 1.0 a %s\n",$shake) if ($shake ne ""); # add water if present printf(LAMMPS "velocity all create 0.0 12345678 dist uniform\n\n"); + printf(LAMMPS "thermo 1\n"); # set thermo style + printf(LAMMPS "thermo_style multi\n"); + printf(LAMMPS "timestep 0.5\n\n"); # 0.5 ps time step printf(LAMMPS "restart 10 $project.restart1 $project.restart2\n"); printf(LAMMPS "dump 1 all atom 10 $project.dump\n"); printf(LAMMPS "dump_modify 1 image yes scale yes\n\n"); @@ -1463,6 +1497,972 @@ close(LAMMPS); } + # ------------------ DESCRIPTION: sub DihedralCorrect6Ring ------------------ # + # # + # This subroutine is a subsequent correction of the dihedral 1-4 non-bonded # + # interaction scaling factor in the LAMMPS data file. The problem occurs in # + # dealing with carbohydrate systems, when some dihedrals outside of a 6-ring # + # are incorrectly assigned to the same dihedral type as dihedrals within a # + # 6-ring. Thus, those dihedrals outside of a 6-ring will be treated with a # + # 1-4 non-bonded interaction scaling factor of 0.5 instead of 1. # + # # + # By: Xiaohu Hu (hux2@ornl.gov) # + # # + # April 2009 # + # # + # --------------------------------------------------------------------------- # + +sub DihedralCorrect6Ring +{ + print "\nINITIATE DIHEDRAL CORRECTION...\n\n"; + ## Variables for general data + # arrays + my @temp_data1; + my @temp_data2; + my @dihedral_coeffs; + my @dihedral_list; + my @raw_data; + my @temp1; + my @temp2; + my @temp3; + my @ring_dihe_list; + my @ring_dihetype_list; + + # integers + my $counter1 = 0; + my $counter2 = 0; + my $net_ndihedral = 0; + my $net_ndihedral_types = 0; + my $splice_onset_dihe = 0; + my $splice_onset_dihe_coeff = 0; + my $n; + my $ntyp; + + # matrix + my @dihedral_matrix; + my @dihedral_coeff_matrix; + my @new_dihedral_coeff_matrix; + my @new_dihedral_matrix; + + ## Variables for dihedral matrix data + # "Dihedral Coeffs" + my $dihedral_type_c; + my $amp; + my $period; + my $equ_val; + my $scaling; + + # "Dihedrals" + my $dihedral_no; + my $dihedral_type_l; + my $atom_1_no; + my $atom_2_no; + my $atom_3_no; + my $atom_4_no; + +# ------------- Reread the previously generated LAMMPS data file -------------------- + + open(LAMMPS, "< $project.data") or + die "\"sub DihedralCorrect6Ring\" cannot open \"$project.data!\n"; + print "Analysing \"$project.data\"...\n\n"; + @raw_data = <LAMMPS>; + close(LAMMPS); + + # Find the number of dihedrals and dihedral types and the sections "Dihedrals" + # and "Dihedral Coeffs" in LAMMPS data file + foreach $line (@raw_data) { + $counter1++; + chomp($line); + if ($line =~ m/dihedrals/) { + ($n,$string) = split(" ",$line); + print "$n dihedrals\n"; + } + if ($line =~ m/dihedral types/) { + ($ntyp,$string) = split(" ",$line); + print "$ntyp dihedral types\n"; + } + if ($line =~ m/Dihedral Coeffs/) { + print "Section \"Dihedrals\" found\n"; + $splice_onset_dihe_coeff = $counter1; + } + if ($line =~ m/Dihedrals/) { + print "Section \"Dihedral Coeffs\" found\n"; + $splice_onset_dihe = $counter1; + } + } + if ($splice_onset_dihe_coeff == 0 and $splice_onset_dihe == 0) { + print "\nNo dihedral data in \"$project.data\", no dihedral correction necessary\n"; + return; + } + elsif ($splice_onset_dihe_coeff == 0 or $splice_onset_dihe == 0) { + print "\nDihedral data incomplete! Dihedral correction impossible\n"; + return; + } + + +# --------------- Transform the raw data into matrices ----------------------- + + @temp_data1 = @temp_data2 = @raw_data; + + #Store the section "Dihedral Coeffs" into a new list + @dihedral_coeffs = splice(@temp_data1,$splice_onset_dihe_coeff,$ntyp+1); + + # Transfer the data from "@dihedral_coeffs" (an array of strings) + # into "@dihedral_coeff_matrix" (a 6 x $n matrix of integers) + for (@dihedral_coeffs) { + ($dihedral_type_c, + $amp, + $period, + $equ_val, + $scaling) = split(" "); + + push(@dihedral_coeff_matrix, + [$dihedral_type_c, + $amp, + $period, + $equ_val, + $scaling]); + } + + # Store the section "Dihedrals" into a new list + @dihedral_list = splice(@temp_data2,$splice_onset_dihe,$n+1); + + # Transfer the data from "@dihedral_list" (an array of strings) + # into "@dihedral_matrix" (a 6 x $n matrix of integers) + for (@dihedral_list) { + ($dihedral_no, + $dihedral_type_l, + $atom_no_1, + $atom_no_2, + $atom_no_3, + $atom_no_4) = split(" "); + + push(@dihedral_matrix, + [$dihedral_no, + $dihedral_type_l, + $atom_no_1, + $atom_no_2, + $atom_no_3, + $atom_no_4]); + } + + for (my $i = 1; $i < $n; $i++) { + my $cur_type = ${$dihedral_matrix[$i]}[1]; + if ($cur_type == 1 or + $cur_type == 16 or + $cur_type == 34 or + $cur_type == 46 or + $cur_type == 58 or + $cur_type == 64) { + push(@list,$cur_type); + } + } + @list = sort {$a <=> $b} @list; + #print "@list\n"; + #print "Total: $#list\n"; + +# ------------------ Reformat the matrices ------------------------------- + + # Loop the dihedral coefficient matrix and throw away all elements + # with a zero scaling factor (= entries with periodicity != 1) + for (my $i = 1; $i < $ntyp; $i++) { + my $current_sf = ${$dihedral_coeff_matrix[$i]}[4]; + if ($current_sf != 0) { + push(@new_dihedral_coeff_matrix, + [${$dihedral_coeff_matrix[$i]}[0], + ${$dihedral_coeff_matrix[$i]}[1], + ${$dihedral_coeff_matrix[$i]}[2], + ${$dihedral_coeff_matrix[$i]}[3], + ${$dihedral_coeff_matrix[$i]}[4]]); + $net_ndihedral_types++; + } + } + + # Remove the duplicated dihedrals from the @dihedral_matrix and save + # results into @new_dihedral_matrix + push(@new_dihedral_matrix, + [${$dihedral_matrix[1]}[0], + ${$dihedral_matrix[1]}[1], + ${$dihedral_matrix[1]}[2], + ${$dihedral_matrix[1]}[3], + ${$dihedral_matrix[1]}[4], + ${$dihedral_matrix[1]}[5]]); + $net_ndihedral = 1; + for (my $i = 2; $i < $n; $i++) { + if (${$dihedral_matrix[$i]}[2] != ${$dihedral_matrix[$i-1]}[2] or + ${$dihedral_matrix[$i]}[3] != ${$dihedral_matrix[$i-1]}[3] or + ${$dihedral_matrix[$i]}[4] != ${$dihedral_matrix[$i-1]}[4] or + ${$dihedral_matrix[$i]}[5] != ${$dihedral_matrix[$i-1]}[5]) { + push(@new_dihedral_matrix, + [${$dihedral_matrix[$i]}[0], + ${$dihedral_matrix[$i]}[1], + ${$dihedral_matrix[$i]}[2], + ${$dihedral_matrix[$i]}[3], + ${$dihedral_matrix[$i]}[4], + ${$dihedral_matrix[$i]}[5]]); + $net_ndihedral++; + } + } + + # Print out the matrix + # my $ref_line; + # my $column; + # print "New dihedral list:\n"; + # foreach $ref_line (@new_dihedral_matrix) { + # foreach $column (@$ref_line) { + # print "$column " + # } + # print "\n"; + # } + +# --------------- Seach for the wrong scaling factors ---------------------------- + + # Loop through the dihedral matrix to determine the dihedrals within + # a 6-ring. Note there is some duplication in this approach due to + # processing already processed dihedrals. This will be taken care of + # later. + # + # NOTE: @ringlist contains the dihedrals types which corresponds to + # dihedrals within a 6-ring system. + # + my $n6ring = 0; + for (my $i = 1; $i < $net_ndihedral; $i++) { + my $current_i = ${$new_dihedral_matrix[$i]}[2]; + my $current_l = ${$new_dihedral_matrix[$i]}[5]; + for (my $j = $i + 1; $j < $net_ndihedral; $j++) { + if ( ($current_i == ${$new_dihedral_matrix[$j]}[2] and + $current_l == ${$new_dihedral_matrix[$j]}[5]) or + ($current_i == ${$new_dihedral_matrix[$j]}[5] and + $current_l == ${$new_dihedral_matrix[$j]}[2]) ) { + push(@temp2,${$new_dihedral_matrix[$i]}[0]); + push(@temp2,${$new_dihedral_matrix[$j]}[0]); + push(@temp3,${$new_dihedral_matrix[$i]}[1]); + push(@temp3,${$new_dihedral_matrix[$j]}[1]); + $n6ring++; + } + } + } + + if ($n6ring == 0) { + print "\nNo dihedrals within 6-ring structure found. No correction necessary.\n"; + return; + } + + # Sort the lists according to the numerical order + @ring_dihe_list = sort {$a <=> $b} @temp2; + @ring_dihetype_list = sort {$a <=> $b} @temp3; + + # Remove the dups + my %seen1; + for (my $i = 0; $i <= $#ring_dihe_list;) { + splice @ring_dihe_list, --$i, 1 + if $seen1 {$ring_dihe_list[$i++]}++; + } + + my %seen2; + for (my $i = 0; $i <= $#ring_dihetype_list;) { + splice @ring_dihetype_list, --$i, 1 + if $seen1 {$ring_dihetype_list[$i++]}++; + } + + print "6-ring dihedral types:\n"; + print "@ring_dihetype_list\n"; + print "6-ring dihedrals:\n"; + print "@ring_dihe_list\n"; + + # Locate the wrong dihedrals in the dihedral list. Criteria to be wrong: + # if the type of the dihedral is equal to one from the list @ring_dihetype_list + # but not one from the @ring_dihe_list + my @errorlist; + my @errortypes; + my @raw_errortypes; + my $dihe_flag = 0; + + for (my $i = 1; $i < $n; $i++) { + my $cur_dihe = ${dihedral_matrix[$i]}[0]; + my $cur_type = ${dihedral_matrix[$i]}[1]; + + for (my $j = 0; $j <= $#ring_dihetype_list; $j++) { + if ($cur_type == $ring_dihetype_list[$j]) { + for (my $k = 0; $k <= $#ring_dihe_list; $k++) { + if ($cur_dihe == $ring_dihe_list[$k]) { + $dihe_flag++; + } + } + } + } + + if ($dihe_flag == 0) { + for (my $j = 0; $j <= $#ring_dihetype_list; $j++) { + if ($cur_type == $ring_dihetype_list[$j]) { + push(@errorlist,$cur_dihe); + push(@raw_errortypes,$cur_type); + $counter2++; + } + } + } + + $dihe_flag = 0; + } + + if ($counter2 == 0) { + print "\nNo mis-assigned dihedrals found. No correction necessary.\n"; + return; + } + + print "mis-assigned dihedral/s found: $counter2\n"; + print "@errorlist\n"; + # print "@raw_errortypes\n"; + + # Sort the @errortypes and remove dups + @errortypes = sort {$a <=> $b} @raw_errortypes; + my %seen4; + for (my $i = 0; $i <= $#errortypes;) { + splice @errortypes, --$i, 1 + if $seen4 {$errortypes[$i++]}++; + } + + print "associated dihedral type/s\n"; + print "@errortypes\n"; + +# ------------ Add new dihedral types for the mis-assigned dihedrals ----------- + + print "\nWriting \"corrected_$project.data\"...\n\n"; + open(REWRITE,"> corrected_$project.data") + or die "Can not write file \"corrected_$project.data\"!\n"; + + my $counter3 = 0; + my $fix_start = $splice_onset_dihe_coeff + $ntyp + 1; + my $new_ntyp = $ntyp + $#errortypes +1; + + foreach $line (@raw_data) { + # update header information + if ($line =~ m/dihedral types/) { + $line =~ s/$ntyp/$new_ntyp/; + } + + $counter3++; + printf(REWRITE "$line\n"); + if ($counter3 == $fix_start) { last } + } + + my @newtypes; + for (my $i = 0; $i <= $#errortypes; $i++) { + $ntyp++; + printf(REWRITE "%8d %10.7g %10d %10d 1\n", + $ntyp, + ${$dihedral_coeff_matrix[$errortypes[$i]]}[1], + ${$dihedral_coeff_matrix[$errortypes[$i]]}[2], + ${$dihedral_coeff_matrix[$errortypes[$i]]}[3]); + print "New dihedral type $ntyp added\n"; + push(@newtypes,$ntyp); + } + +# ------------ Assign the wrong dihedrals with the new types ---------------- + + print "\nCorrecting the mis-assigned dihedrals...\n\n"; + + printf(REWRITE "$raw_data[$splice_onset_dihe - 2]\n"); + printf(REWRITE "$raw_data[$splice_onset_dihe - 1]\n"); + + # Overwrite the wrong dihedrals in the dihedral list (section "Dihedrals") + my $counter3 = -1; + my $write_flag = 0; + my @temp_line; + + for ($j = $splice_onset_dihe; $j <= $#raw_data; $j++) { + $counter3++; + for (my $i = 0; $i <= $#errorlist; $i++) { + if ($counter3 == $errorlist[$i]) { + @temp_line = split(" ",$raw_data[$j]); + for (my $k = 0; $k <= $#errortypes; $k++) { + if ($temp_line[1] == $errortypes[$k]) { + printf(REWRITE "%8d %7d %7d %7d %7d %7d\n", + ${$dihedral_matrix[$errorlist[$i]]}[0], + $newtypes[$k], + ${$dihedral_matrix[$errorlist[$i]]}[2], + ${$dihedral_matrix[$errorlist[$i]]}[3], + ${$dihedral_matrix[$errorlist[$i]]}[4], + ${$dihedral_matrix[$errorlist[$i]]}[5]); + print "Dihedral No. ${$dihedral_matrix[$errorlist[$i]]}[0] corrected\n"; + $write_flag = 1; + } + } + } + } + if ($write_flag == 0) { printf(REWRITE "$raw_data[$j]\n");} + $write_flag = 0; + } + + print "\nDONE!\n"; + + close(REWRITE); + +# End of the subroutine +} + +# ----------------------- DESCRIPTION: sub CharmmCmap ------------------------ # +# This subroutine add a new section "CMAP" to the LAMMPS data file, which # +# a part of the implementation of "CHARMM CMAP" (see references) in LAMMPS. # +# The section "CMAP" contains a list of dihedral ID pairs from adjecent # +# peptide backtone dihedrals whose dihedral angles are corrresponding to PHI # +# and PSI. (PHI: C--N--C_aphla_C and PSI: N--C_alpha--C--N) # +# # +# By: Xiaohu Hu (hux2@ornl.gov) # +# May 2009 # +# # +# Modified May 2013 by: Robert Latour (latourr@clemson.edu) and # +# Chris Lorenz (chris.lorenz@kcl.ac.uk # +# # +# References: # +# - MacKerell, A.D., Jr., Feig, M., Brooks, C.L., III, Improved Treatment of # +# Protein Backbone Conformational in Empirical Force Fields, J. Am. Chem. # +# Soc. 126(2004): 698-699. # +# - MacKerell, A.D., Jr., Feig, M., Brooks, C.L., III, Extending the Treatment # +# of Backbone Energetics in Protein Force Fields: Limitations of Gas-Phase # +# Quantum Mechnacis in Reproducing Protein Conformational Distributions in # +# Molecular Dynamics Simulations, J. Comput. Chem. 25(2004): 1400-1415. # +# ---------------------------------------------------------------------------- # + +sub CharmmCmap +{ + print "\nINITIATING CHARMM CMAP SUBROUTINE...\n\n"; + + # Reread and analyse $project.data + my @raw_data; + open(LAMMPS, "< $project.data") or + die "\"sub CharmmCmap()\" cannot open \"$project.data!\n"; + print "Analyzing \"$project.data\"...\n\n"; + @raw_data = <LAMMPS>; + close(LAMMPS); + + # Locate and extract the sections "Masses" and "Atoms" + my $line_number = 0; + # Header infos, 0 by default + my $natom_types = 0; + my $natom_number = 0; + my $ndihedral_number = 0; + my $temp_string; + # splice points, 0 by default + my $splice_onset_masses = 0; + my $splice_onset_atoms = 0; + my $splice_onset_dihedrals = 0; + + foreach my $line (@raw_data) { + $line_number++; + chomp($line); + # Extract useful informations from the header + if ($line =~ m/atom types/) { + ($natom_types,$temp_string) = split(" ",$line); + if ($natom_types == 0) { + die "\nError: Number of atom types is 0!\n"; + } + print "Total atom types: $natom_types\n"; + } + if ($line =~ m/atoms/) { + ($natom_number,$temp_string) = split(" ",$line); + if ($natom_number == 0) { + die "\nError: Number of atoms is 0!\n"; + } + print "Total atoms: $natom_number\n"; + } + if ($line =~ m/dihedrals/) { + ($ndihedral_number,$temp_string) = split(" ",$line); + if ($ndihedral_number == 0) { + die "\nError: Number of dihedrals is 0\n"; + } + print "Total dihedrals: $ndihedral_number\n"; + } + # Locate and data from sections "Masses", "Atoms" and "Dihedrals" + if ($line =~ m/Masses/) { + $splice_onset_masses = $line_number + 1; + if ($splice_onset_masses-1 == 0) { + die "\nError: Can not find the section \"Masses\"\n"; + } + print "Section \"Masses\" found: line $splice_onset_masses\n"; + } + if ($line =~ m/Atoms/) { + $splice_onset_atoms = $line_number +1; + if ($splice_onset_atoms-1 == 0) { + die "\nError: Can not find the section \"Atoms\"\n"; + } + print "Section \"Atoms\" found: line $splice_onset_atoms\n"; + } + if ($line =~ m/Dihedrals/) { + $splice_onset_dihedrals = $line_number + 1; + if ($splice_onset_dihedrals-1 == 0) { + die "\nError: Can not find the section \"Dihedrals\"\n"; + } + print "Section \"Dihedrals\" found: line $splice_onset_dihedrals\n"; + } + } + + print "\nGenerating PHI/PSI dihedral pair list...\n\n"; + + my @temp1 = @raw_data; + my @temp2 = @raw_data; + my @temp3 = @raw_data; + + # Extract the section "Masses", "Atoms" and "Dihedrals" + my @temp_masses_data = splice(@temp1,$splice_onset_masses,$natom_types); + my @temp_atoms_data = splice(@temp2,$splice_onset_atoms,$natom_number); + my @temp_dihedrals_data = splice(@temp3,$splice_onset_dihedrals,$ndihedral_number); + + # Store @temp_masses_dat into a matrix + my @masses_matrix; + my $atom_type; + my $mass; + for (@temp_masses_data) { + ($atom_type, $mass) = split(" "); + push(@masses_matrix,[$atom_type,$mass]); + } + + # Store @temp_atoms_data into a matrix + my @atoms_matrix; + my $atom_ID; + my $molecule_ID; + my $atype; + my $charge; + my $atom_x_coor; + my $atom_y_coor; + my $atom_z_coor; + for (@temp_atoms_data) { + ($atom_ID,$molecule_ID,$atype,$charge,$atom_x_coor,$atom_y_coor,$atom_z_coor) = split(" "); + push(@atoms_matrix, + [$atom_ID,$molecule_ID,$atype,$charge,$atom_x_coor,$atom_y_coor,$atom_z_coor]); + } + + # Store @temp_dihedrals_data into a matrix + my @dihedrals_matrix; + my $dihedral_ID; + my $dihedtal_type; + my $dihe_atom1; + my $dihe_atom2; + my $dihe_atom3; + my $dihe_atom4; + for (@temp_dihedrals_data) { + ($dihedral_ID,$dihedral_type,$dihe_atom1,$dihe_atom2,$dihe_atom3,$dihe_atom4) = split(" "); + push(@dihedrals_matrix, + [$dihedral_ID,$dihedral_type,$dihe_atom1,$dihe_atom2,$dihe_atom3,$dihe_atom4]); + } + + # Find out and extract the peptide backbone dihedrals + # + # Definitions of peptide backbone dihedrals + # + # For dihedral angle PHI: C--N--CA--C + # For dihedral angle PSI: N--CA--C--N + # + # --------------------------------------------------------- + # atom | mass |partial charge| amino-acid + # --------------------------------------------------------- + # C | 12.011 | 0.51 | all except GLY and PRO + # N | 14.007 | -0.29 | PRO + # N | 14.007 | -0.47 | all except PRO + # CA | 12.011 | 0.07 | all except GLY and PRO + # CA | 12.011 | -0.02 | GLY + # CA | 12.011 | 0.02 | PRO + # --------------------------------------------------------- + # + # Peptide backbone + # ... + # / + # O=C + # \ + # N-H + # / -----> PHI (C-N-CA-C) + # H-CA-R + # \ -----> PSI (N-CA-C-N) + # C=O + # / + # H-N + # \ + # ... + # + # Criteria to be a PHI/PSI dihedral pair: + # 1. Atoms have to match with the mass/charge constellations as + # defined above. + # 2. The atoms N--CA--C needs to be covalently bonded with each + # other. + + # Find which types do C, N and CA correspond to and store them + # in lists + my $mass_carbon = 12.011; + my $mass_nitrogen = 14.007; + + my @carbon_list; + my @nitrogen_list; + my $carbon_counter = 0; + my $nitrogen_counter = 0; + + for (my $i = 0; $i < $natom_types; $i++) { + if (${$masses_matrix[$i]}[1] == $mass_carbon) { + push(@carbon_list,${$masses_matrix[$i]}[0]); + $carbon_counter++; + } + if (${$masses_matrix[$i]}[1] == $mass_nitrogen) { + push(@nitrogen_list,${$masses_matrix[$i]}[0]); + $nitrogen_counter++; + } + } + # Quit if no carbons or nitrogens + if ($carbon_counter == 0 or $nitrogen_counter == 0) { + if ($carbon_counter == 0) { + print "No carbon atoms exist in the system\n"; + } + if ($nitrogen_counter == 0) { + print "No nitrogen atoms exist in the system\n"; + } + print "CMAP usage impossible\n"; + return; + } + + print "Carbon atom type/s: @carbon_list\n"; + print "Nitrogen atom type/s: @nitrogen_list\n"; + + # Determine the atom types of C, CA and N + + # Charges of the backbone atoms + my $charge_C = 0.51; + my $charge_CA = 0.07; + my $charge_N = -0.47; + + # Special setting for PRO + my $charge_N_PRO = -0.29; + my $charge_CA_PRO = 0.02; + + # Special setting for GLY + my $charge_CA_GLY = -0.02; + + # Peptide backbone atom types + my $C_type; + my $CA_type; + my $CA_GLY_type; + my $CA_PRO_type; + my $N_type; + my $N_PRO_type; + + my $C_counter = 0; + my $CA_counter = 0; + my $CA_GLY_counter = 0; + my $CA_PRO_counter = 0; + my $N_counter = 0; + my $N_PRO_counter = 0; + + my $C_flag = 0; + + for (my $i = 0; $i <= $natom_number; $i++) { + my $cur_type = ${$atoms_matrix[$i]}[2]; + my $cur_charge = ${$atoms_matrix[$i]}[3]; + for (my $j = 0; $j <= $#carbon_list; $j++) { + if ($cur_type == $carbon_list[$j]) { + $C_flag = 1; + if ($cur_charge == $charge_C) { + $C_type = $cur_type; + $C_counter++; + } + if ($cur_charge == $charge_CA) { + $CA_type = $cur_type; + $CA_counter++; + } + if ($cur_charge == $charge_CA_GLY) { + $CA_GLY_type = $cur_type; + $CA_GLY_counter++; + } + if ($cur_charge == $charge_CA_PRO) { + $CA_PRO_type = $cur_type; + $CA_PRO_counter++; + } + } + } + if ($C_flag == 0) { + for (my $k = 0; $k <= $#nitrogen_list; $k++) { + if ($cur_type == $nitrogen_list[$k]) { + if ($cur_charge == $charge_N) { + $N_type = $cur_type; + $N_counter++; + } + if ($cur_charge == $charge_N_PRO) { + $N_PRO_type = $cur_type; + $N_PRO_counter++; + } + } + } + } + $C_flag = 0; + } + + # Quit if one of the atom types dosen't exist + if ( $C_counter == 0 or + ($CA_counter == 0 and $CA_GLY_counter == 0 and $CA_PRO_counter == 0) or + ($N_counter == 0 and $N_PRO_counter == 0) ) { + if ($C_counter == 0) { + print "\nCannot find the peptide backbone C atom type\n"; + } + if ($CA_counter == 0 and $CA_GLY_counter == 0 and $CA_PRO_counter == 0) { + print "\nCannot find the peptide backbone C-alpha atom type\n"; + } + if ($N_counter == 0 and $N_PRO_counter == 0) { + print "\nCannot find the peptide backbone N atom type\n"; + } + print "CMAP usage impossible\n"; + return; + } + + print "Peptide backbone carbon type: $C_type\n"; + print "Alpha-carbon type: $CA_type\n" if ($CA_counter > 0); + print "Alpha-carbon type (GLY): $CA_GLY_type\n" if ($CA_GLY_counter > 0); + print "Alpha-carbon type (PRO): $CA_PRO_type\n" if ($CA_PRO_counter > 0); + print "Peptide backbone nitrogen type: $N_type\n" if ($N_counter >0); + print "Peptide backbone nitrogen type (PRO): $N_PRO_type\n" if ($N_PRO_counter > 0); + + # Loop through the dihedral list to find the PHI- and PSI-dihedrals + my @PHI_dihedrals; + my @PSI_dihedrals; + my $PHI_counter = 0; + my $PSI_counter = 0; + + for (my $i = 0; $i < $ndihedral_number; $i++) { + my $cur_dihe_ID = ${dihedrals_matrix[$i]}[0]; + my $cur_atom1_type = ${atoms_matrix[${dihedrals_matrix[$i]}[2]-1]}[2]; + my $cur_atom2_type = ${atoms_matrix[${dihedrals_matrix[$i]}[3]-1]}[2]; + my $cur_atom3_type = ${atoms_matrix[${dihedrals_matrix[$i]}[4]-1]}[2]; + my $cur_atom4_type = ${atoms_matrix[${dihedrals_matrix[$i]}[5]-1]}[2]; + + next if (${dihedrals_matrix[$i]}[2] == ${dihedrals_matrix[$i-1]}[2] and + ${dihedrals_matrix[$i]}[3] == ${dihedrals_matrix[$i-1]}[3] and + ${dihedrals_matrix[$i]}[4] == ${dihedrals_matrix[$i-1]}[4] and + ${dihedrals_matrix[$i]}[5] == ${dihedrals_matrix[$i-1]}[5]); + + # Determine PHI-dihedrals; If C-CA-N-C or C-N-CA-C, then save it in a list + if ($cur_atom1_type == $C_type and $cur_atom4_type == $C_type) { + if ( ( ($cur_atom2_type == $CA_type or + $cur_atom2_type == $CA_GLY_type or + $cur_atom2_type == $CA_PRO_type) and + ($cur_atom3_type == $N_type or + $cur_atom3_type == $N_PRO_type) ) or + ( ($cur_atom3_type == $CA_type or + $cur_atom3_type == $CA_GLY_type or + $cur_atom3_type == $CA_PRO_type) and + ($cur_atom2_type == $N_type or + $cur_atom2_type == $N_PRO_type) ) ) { + push (@PHI_dihedrals,$cur_dihe_ID); + $PHI_counter++; + } + } + + # Determin PSI-dihedrals; If N-CA-C-N or N-C-CA-N (N can be both normal N or N proline), + # then save it in a list + if ( ($cur_atom1_type == $N_type and $cur_atom4_type == $N_type) or + ($cur_atom4_type == $N_PRO_type and $cur_atom1_type == $N_PRO_type) or + ($cur_atom1_type == $N_type and $cur_atom4_type == $N_PRO_type) or + ($cur_atom4_type == $N_type and $cur_atom1_type == $N_PRO_type) ) { + if ( ( ($cur_atom2_type == $CA_type or + $cur_atom2_type == $CA_GLY_type or + $cur_atom2_type == $CA_PRO_type) and + $cur_atom3_type == $C_type) or + ( ($cur_atom3_type == $CA_type or + $cur_atom3_type == $CA_GLY_type or + $cur_atom3_type == $CA_PRO_type) and + $cur_atom2_type == $C_type) ) { + push (@PSI_dihedrals,$cur_dihe_ID); + $PSI_counter++; + } + } + } + + # Quit if no PHI or PSI dihedrals + if ($PHI_counter == 0 or $PSI_counter ==0) { + if ($PHI_counter == 0) { + print "Can not find the PHI backbone dihedrals\n"; + } + if ($PSI_counter ==0) { + print "Can not find the PSI backbone dihedrals\n"; + } + print "CMAP usage impossible\n"; + return; + } + + # Construct the PHI/PSI diheral pair list + # + # The algorithm: + # _____ + # | | + # 1--2--3--4 PHI-dihedral + # 4--3--2--1 + # --C--N-CA--C--N-- Peptide backbone + # 1--2--3--4 + # 4--3--2--1 PSI-dihedral + # |_____| + # + # For a certain PHI dihedral, following conditions have to be met: + # + # PHI PSI + # If (2--3--4) = (1--2--3) + # or + # if (2--3--4) = (4--3--2) + # or + # if (3--2--1) = (1--2--3) + # or + # if (3--2--1) = (4--3--2), + # + # then these 2 dihedrals are a PHI/PSI pair. If a pair is found, the + # dihedral IDs will be stored in "@PHI_PSI_matrix". + + my @PHI_PSI_matrix; + my $crossterm_CA_charge; + my $crossterm_type; + my $crossterm_counter = 0; + my $crossterm_type1_flag = 0; + my $crossterm_type2_flag = 0; + my $crossterm_type3_flag = 0; + my $crossterm_type4_flag = 0; + my $crossterm_type5_flag = 0; + my $crossterm_type6_flag = 0; + + for (my $i = 0; $i <= $#PHI_dihedrals; $i++) { + my $cur_PHI_dihe = ${dihedrals_matrix[$PHI_dihedrals[$i]-1]}[0]; + my $phi1 = ${dihedrals_matrix[$PHI_dihedrals[$i]-1]}[2]; + my $phi2 = ${dihedrals_matrix[$PHI_dihedrals[$i]-1]}[3]; + my $phi3 = ${dihedrals_matrix[$PHI_dihedrals[$i]-1]}[4]; + my $phi4 = ${dihedrals_matrix[$PHI_dihedrals[$i]-1]}[5]; + for (my $j = 0; $j <= $#PSI_dihedrals; $j++) { + my $cur_PSI_dihe = ${dihedrals_matrix[$PSI_dihedrals[$j]-1]}[0]; + my $psi1 = ${dihedrals_matrix[$PSI_dihedrals[$j]-1]}[2]; + my $psi2 = ${dihedrals_matrix[$PSI_dihedrals[$j]-1]}[3]; + my $psi3 = ${dihedrals_matrix[$PSI_dihedrals[$j]-1]}[4]; + my $psi4 = ${dihedrals_matrix[$PSI_dihedrals[$j]-1]}[5]; + if ( ($phi2 == $psi1 and $phi3 == $psi2 and $phi4 == $psi3) or + ($phi2 == $psi4 and $phi3 == $psi3 and $phi4 == $psi2) or + ($phi3 == $psi1 and $phi2 == $psi2 and $phi1 == $psi3) or + ($phi3 == $psi4 and $phi2 == $psi3 and $phi1 == $psi2) ) { + + # Find out to which amino acid the cross-term belongs + + if ($phi3 == $psi2 or $phi3 == $psi3) { + $crossterm_CA_charge = ${atoms_matrix[${dihedrals_matrix[$PHI_dihedrals[$i]-1]}[4]-1]}[3]; + } + if ($phi2 == $psi2 or $phi2 == $psi3) { + $crossterm_CA_charge = ${atoms_matrix[${dihedrals_matrix[$PHI_dihedrals[$i]-1]}[3]-1]}[3]; + } + + # Def. the type of the crossterm per cmap.data file; If C_alpha of the crossterm is + # - ALA type, then $crossterm_type = 1; + # - ALA-PRO (ALA is the current AA), then $crossterm_type = 2; + # - PRO type, then $crossterm_type = 3; + # - PRO-PRO (First PRO is the current AA), then $crossterm_type = 4; + # - GLY type, then $crossterm_type = 5; + # - GLY-PRO (GLY is the current AA), then $crossterm_type = 6; + + if ($crossterm_CA_charge == $charge_CA) { $crossterm_type = 1; $crossterm_type1_flag = 1; } + if ($crossterm_CA_charge == $charge_CA_GLY) { $crossterm_type = 5; $crossterm_type5_flag = 1; } + if ($crossterm_CA_charge == $charge_CA_PRO) { + $crossterm_type = 3; $crossterm_type3_flag = 1; + # Checking the last crossterm, re-assign the last crossterm type if needed + if ($crossterm_counter-1 >= 0 and $PHI_PSI_matrix[$crossterm_counter-1][0] == 1) { + $PHI_PSI_matrix[$crossterm_counter-1][0] = 2; + $crossterm_type2_flag = 1; + } + if ($crossterm_counter-1 >= 0 and $PHI_PSI_matrix[$crossterm_counter-1][0] == 3) { + $PHI_PSI_matrix[$crossterm_counter-1][0] = 4; + $crossterm_type4_flag = 1; + } + if ($crossterm_counter-1 >= 0 and $PHI_PSI_matrix[$crossterm_counter-1][0] == 5) { + $PHI_PSI_matrix[$crossterm_counter-1][0] = 6; + $crossterm_type6_flag = 1; + } + } + push(@PHI_PSI_matrix,[$crossterm_type,$phi1,$phi2,$phi3,$phi4,$psi4]); + $crossterm_counter++; + + $crossterm_CA_charge = 0; + $crossterm_type = 0; + } + } + } + + # Check whether the amino acid at the C-terminus is a PRO or not. If yes, the type of the last crossterm + # should be set to its X-PRO form instead of X, where X is ALA, PRO, or GLY. X-PRO form = X type + 1. + + my @pdb_data; + open(PDB,"< $project.pdb") + or die "WARNING: Cannot open file \"$project.pdb\"! (required if the -cmap option is used)\n"; + @pdb_data = <PDB>; + close(PDB); + + my @ter_line; + my $ter_AA_type = 0; + my $ter_flag = 0; + foreach $line (@pdb_data) { + if ($line =~ m/TER/) { + @ter_line = split(" ",$line); + $ter_AA_type = $ter_line[2]; + print "Terminal amino acid type is: $ter_AA_type\n"; + $ter_flag = 1; + } + } + if ($ter_flag == 0) { + print "\n*** ERROR IN THE PDB FILE: ***\n"; + print "In order for the CMAP section to be generated, the pdb file must \n"; + print "identify the C-terminus amino acid in the file with 'TER'. \n"; + print "This line is missing from the pdb file that was used.\n"; + print "To correct this problem, open the pdb file in an editor,\n"; + print "find the last atom of the last amino acid residue in the peptide\n"; + print "chain and insert the following line immediately after that atom:\n"; + print " 'TER <#1> <RES> <#2>' \n"; + print "where '<#1> is the next atom number, <RES> is the three letter amino\n"; + print "acid abbreviation for that amino acid, and <#2> is the molecule number\n"; + print "of the terminal amino acid residue.\n\n"; + print "For example, if the last atom of the last amino acid in the peptide\n"; + print "sequence is listed in the pdb file as:\n\n"; + print " 'ATOM 853 O GLU P 56 12.089 -1.695 -6.543 1.00 1.03 PROA'\n\n"; + print "you would insert the following line after it:\n\n"; + print " 'TER 854 GLU 56'\n\n"; + print "If any additional atoms are listed in the pdb file (e.g., water, ions)\n"; + print "after this terminal amino acid residue, their atom numbers and\n"; + print "molecule numbers must be incremented by 1 to account for the new line\n"; + print "that was inserted.\n\n"; + die "Error: No terminating atom designated in pdb file! See above note to correct problem.\n\n"; + } + + if ($ter_AA_type eq PRO) { + $PHI_PSI_matrix[$crossterm_counter-1][0] = $PHI_PSI_matrix[$crossterm_counter-1][0]+1; + } + + # Print out PHI/PSI diheral pair list + my $pair_counter = 0; + # Don't presently use $ncrosstermtypes but have this available if wish to print it out + my $ncrosstermtypes = $crossterm_type1_flag + $crossterm_type2_flag + $crossterm_type3_flag + + $crossterm_type4_flag + $crossterm_type5_flag + $crossterm_type6_flag; + print "\nWriting \"$project.data\" with section \"CMAP crossterms\" added at the end.\n"; + + # Writing the new lammps data file + open(REWRITE,"> $project.data") + or die "Cannot write file \"$project.data\"!\n"; + foreach $line (@raw_data) { + printf(REWRITE "$line\n"); + if ($line =~ m/impropers/) { + printf(REWRITE "%12d crossterms\n", $crossterm_counter); + } + } + printf(REWRITE "CMAP\n\n"); + + my $ref_line; + my $column; + foreach $ref_line (@PHI_PSI_matrix) { + $pair_counter++; + printf(REWRITE "%8d",$pair_counter); + foreach $column (@$ref_line) { + printf(REWRITE " %7d",$column); + } + printf(REWRITE "\n"); + } + close(REWRITE); + + print "\nDone!\n\n"; + +# End of the CharmmCmap subroutine +} # main @@ -1470,4 +2470,6 @@ WriteData(); WriteLAMMPSInput(); printf("Info: conversion complete\n\n") if ($info); + DihedralCorrect6Ring() if ($cdihedral); + CharmmCmap() if ($cmap);