From ee6cac826e656d6280c1dff1478a5c4040ce7010 Mon Sep 17 00:00:00 2001 From: Giacomo Fiorin Date: Wed, 19 Jul 2017 14:10:43 -0400 Subject: [PATCH] Update Colvars to version 2017-07-15 and support automated builds for it --- doc/src/PDF/colvars-refman-lammps.pdf | Bin 566757 -> 570332 bytes lib/colvars/Install.py | 104 ++- lib/colvars/Makefile.colvars | 119 --- lib/colvars/Makefile.common | 65 ++ lib/colvars/Makefile.deps | 78 ++ lib/colvars/Makefile.fermi | 120 --- lib/colvars/Makefile.g++ | 118 +-- lib/colvars/Makefile.g++-debug | 5 + lib/colvars/Makefile.lammps | 5 + lib/colvars/Makefile.lammps.debug | 2 +- lib/colvars/Makefile.lammps.empty | 2 +- lib/colvars/Makefile.mingw32-cross | 124 +-- lib/colvars/Makefile.mingw64-cross | 124 +-- lib/colvars/README | 105 ++- lib/colvars/colvar.cpp | 432 +++++++-- lib/colvars/colvar.h | 47 +- lib/colvars/colvaratoms.cpp | 216 +++-- lib/colvars/colvaratoms.h | 39 +- lib/colvars/colvarbias.cpp | 24 +- lib/colvars/colvarbias.h | 2 +- lib/colvars/colvarbias_abf.cpp | 130 +-- lib/colvars/colvarbias_alb.cpp | 60 +- lib/colvars/colvarbias_histogram.cpp | 28 +- lib/colvars/colvarbias_meta.cpp | 149 +-- lib/colvars/colvarbias_meta.h | 7 +- lib/colvars/colvarbias_restraint.cpp | 54 +- lib/colvars/colvarcomp.cpp | 238 ++--- lib/colvars/colvarcomp.h | 75 +- lib/colvars/colvarcomp_angles.cpp | 203 +++- lib/colvars/colvarcomp_coordnums.cpp | 47 +- lib/colvars/colvarcomp_distances.cpp | 101 +- lib/colvars/colvarcomp_protein.cpp | 84 +- lib/colvars/colvarcomp_rotations.cpp | 14 +- lib/colvars/colvardeps.cpp | 347 +++++-- lib/colvars/colvardeps.h | 124 ++- lib/colvars/colvargrid.cpp | 3 +- lib/colvars/colvargrid.h | 6 +- lib/colvars/colvarmodule.cpp | 178 ++-- lib/colvars/colvarmodule.h | 66 +- lib/colvars/colvarparse.cpp | 53 +- lib/colvars/colvarparse.h | 25 +- lib/colvars/colvarproxy.cpp | 492 ++++++++++ lib/colvars/colvarproxy.h | 868 ++++++++---------- lib/colvars/colvars_version.h | 8 + lib/colvars/colvarscript.cpp | 150 +-- lib/colvars/colvarscript.h | 20 +- lib/colvars/colvartypes.h | 5 + lib/colvars/colvarvalue.cpp | 275 ++++++ lib/colvars/colvarvalue.h | 324 +------ src/USER-COLVARS/colvarproxy_lammps.cpp | 4 - src/USER-COLVARS/colvarproxy_lammps.h | 7 +- src/USER-COLVARS/colvarproxy_lammps_version.h | 10 + 52 files changed, 3473 insertions(+), 2413 deletions(-) delete mode 100644 lib/colvars/Makefile.colvars create mode 100644 lib/colvars/Makefile.common create mode 100644 lib/colvars/Makefile.deps delete mode 100644 lib/colvars/Makefile.fermi create mode 100644 lib/colvars/Makefile.g++-debug create mode 100644 lib/colvars/Makefile.lammps create mode 100644 lib/colvars/colvarproxy.cpp create mode 100644 lib/colvars/colvars_version.h create mode 100644 src/USER-COLVARS/colvarproxy_lammps_version.h diff --git a/doc/src/PDF/colvars-refman-lammps.pdf b/doc/src/PDF/colvars-refman-lammps.pdf index 37201275fe4b4efa0da77afbb72e6c55a127c042..a14d93cd69e7a2aced22919a7755d66714405d47 100644 GIT binary patch delta 185481 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�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 z

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

{&Ph{?q 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]{thFb?^4B~Irk{z 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 delta 182418 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 a*xA+7+1vtwlZ%~=ixYv0NC diff --git a/lib/colvars/Install.py b/lib/colvars/Install.py index 18b426f928..a367b8eeed 100644 --- a/lib/colvars/Install.py +++ b/lib/colvars/Install.py @@ -1,27 +1,34 @@ #!/usr/bin/env python -# install.py tool to do a generic build of a library -# soft linked to by many of the lib/Install.py files -# used to automate the steps described in the corresponding lib/README +# Install.py tool to do automate build of Colvars -import sys,commands,os +from __future__ import print_function +import sys,os,subprocess # help message help = """ -Syntax: python Install.py -m machine -e suffix - specify -m and optionally -e, order does not matter +Syntax from src dir: make lib-colvars args="-m machine -e suffix" +Syntax from lib/colvars dir: python Install.py -m machine -e suffix + +specify -m and optionally -e, order does not matter + -m = peform a clean followed by "make -f Makefile.machine" - machine = suffix of a lib/Makefile.* file + machine = suffix of a lib/colvars/Makefile.* or of a + src/MAKE/MACHINES/Makefile.* file -e = set EXTRAMAKE variable in Makefile.machine to Makefile.lammps.suffix does not alter existing Makefile.machine + +Examples: + +make lib-colvars args="-m g++" # build COLVARS lib with GNU g++ compiler """ # print error message or help def error(str=None): - if not str: print help - else: print "ERROR",str + if not str: print(help) + else: print("ERROR"),str sys.exit() # parse args @@ -31,17 +38,17 @@ nargs = len(args) if nargs == 0: error() machine = None -extraflag = 0 +extraflag = False iarg = 0 while iarg < nargs: if args[iarg] == "-m": - if iarg+2 > nargs: error() + if iarg+2 > len(args): error() machine = args[iarg+1] iarg += 2 elif args[iarg] == "-e": - if iarg+2 > nargs: error() - extraflag = 1 + if iarg+2 > len(args): error() + extraflag = True suffix = args[iarg+1] iarg += 2 else: error() @@ -51,32 +58,79 @@ while iarg < nargs: cwd = os.getcwd() lib = os.path.basename(cwd) -# create Makefile.auto as copy of Makefile.machine -# reset EXTRAMAKE if requested - +def get_lammps_machine_flags(machine): + """Parse Makefile.machine from LAMMPS, return dictionary of compiler flags""" + if not os.path.exists("../../src/MAKE/MACHINES/Makefile.%s" % machine): + error("Cannot locate src/MAKE/MACHINES/Makefile.%s" % machine) + lines = open("../../src/MAKE/MACHINES/Makefile.%s" % machine, + 'r').readlines() + machine_flags = {} + for line in lines: + line = line.partition('#')[0] + line = line.rstrip() + words = line.split() + if (len(words) > 2): + if ((words[0] == 'CC') or (words[0] == 'CCFLAGS') or + (words[0] == 'SHFLAGS') or (words[0] == 'ARCHIVE') or + (words[0] == 'ARFLAGS') or (words[0] == 'SHELL')): + machine_flags[words[0]] = ' '.join(words[2:]) + return machine_flags + +def gen_colvars_makefile_machine(machine, machine_flags): + """Generate Makefile.machine for Colvars given the compiler flags""" + machine_makefile = open("Makefile.%s" % machine, 'w') + machine_makefile.write('''# -*- makefile -*- to build Colvars module with %s + +COLVARS_LIB = libcolvars.a +COLVARS_OBJ_DIR = + +CXX = %s +CXXFLAGS = %s %s +AR = %s +ARFLAGS = %s +SHELL = %s + +include Makefile.common + +.PHONY: default clean + +default: $(COLVARS_LIB) Makefile.lammps + +clean: + -rm -f $(COLVARS_OBJS) $(COLVARS_LIB) +''' % (machine, machine_flags['CC'], + machine_flags['CCFLAGS'], machine_flags['SHFLAGS'] , + machine_flags['ARCHIVE'], machine_flags['ARFLAGS'], + machine_flags['SHELL'])) + +if not os.path.exists("Makefile.%s" % machine): + machine_flags = get_lammps_machine_flags(machine) + gen_colvars_makefile_machine(machine, machine_flags) if not os.path.exists("Makefile.%s" % machine): error("lib/%s/Makefile.%s does not exist" % (lib,machine)) +# create Makefile.auto as copy of Makefile.machine +# reset EXTRAMAKE if requested + lines = open("Makefile.%s" % machine,'r').readlines() fp = open("Makefile.auto",'w') - for line in lines: words = line.split() if len(words) == 3 and extraflag and \ words[0] == "EXTRAMAKE" and words[1] == '=': line = line.replace(words[2],"Makefile.lammps.%s" % suffix) - print >>fp,line, - + fp.write(line) fp.close() # make the library via Makefile.auto -print "Building lib%s.a ..." % lib -cmd = "make -f Makefile.auto clean; make -f Makefile.auto" -txt = commands.getoutput(cmd) -print txt +print("Building lib%s.a ..." % lib) +cmd = ["make -f Makefile.auto clean"] +print(subprocess.check_output(cmd, shell=True)) +cmd = ["make -f Makefile.auto -j12"] +print(subprocess.check_output(cmd, shell=True)) -if os.path.exists("lib%s.a" % lib): print "Build was successful" +if os.path.exists("lib%s.a" % lib): print("Build was successful") else: error("Build of lib/%s/lib%s.a was NOT successful" % (lib,lib)) if not os.path.exists("Makefile.lammps"): - print "lib/%s/Makefile.lammps was NOT created" % lib + print("lib/%s/Makefile.lammps was NOT created" % lib) diff --git a/lib/colvars/Makefile.colvars b/lib/colvars/Makefile.colvars deleted file mode 100644 index d1a2044038..0000000000 --- a/lib/colvars/Makefile.colvars +++ /dev/null @@ -1,119 +0,0 @@ -# library build -*- makefile -*- for colvars module - -# which file will be copied to Makefile.lammps - -EXTRAMAKE = Makefile.lammps.empty - -# ------ SETTINGS ------ - -CXX = g++ -CXXFLAGS = -O2 -g -Wall -fPIC -funroll-loops # -DCOLVARS_DEBUG -ARCHIVE = ar -ARCHFLAG = -rscv -SHELL = /bin/sh - -# ------ DEFINITIONS ------ - -SRC = colvaratoms.cpp colvarbias_abf.cpp colvarbias_alb.cpp colvarbias.cpp \ - colvarbias_histogram.cpp colvarbias_meta.cpp colvarbias_restraint.cpp \ - colvarcomp_angles.cpp colvarcomp_coordnums.cpp colvarcomp.cpp \ - colvarcomp_distances.cpp colvarcomp_protein.cpp colvarcomp_rotations.cpp \ - colvardeps.cpp colvar.cpp colvargrid.cpp colvarmodule.cpp colvarparse.cpp \ - colvarscript.cpp colvartypes.cpp colvarvalue.cpp - -LIB = libcolvars.a -OBJ = $(SRC:.cpp=.o) -EXE = #colvars_standalone - -# ------ MAKE PROCEDURE ------ - -default: $(LIB) $(EXE) Makefile.lammps - -Makefile.lammps: - @cp $(EXTRAMAKE) Makefile.lammps - -$(LIB): $(OBJ) - $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) - -colvars_standalone: colvars_main.o colvarproxy_standalone.o $(LIB) - $(CXX) -o $@ $(CXXFLAGS) $^ - -# ------ MAKE FLAGS ------ - -.SUFFIXES: -.SUFFIXES: .cpp .o - -.PHONY: default clean - -# ------ COMPILE RULES ------ - -.cpp.o: - $(CXX) $(CXXFLAGS) -c $< - -# ------ DEPENDENCIES ------ -# -colvaratoms.o: colvaratoms.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h colvaratoms.h -colvarbias_abf.o: colvarbias_abf.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvar.h colvarparse.h colvardeps.h \ - colvarbias_abf.h colvarbias.h colvargrid.h -colvarbias_alb.o: colvarbias_alb.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarbias_alb.h colvar.h colvarparse.h \ - colvardeps.h colvarbias_restraint.h colvarbias.h -colvarbias.o: colvarbias.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarbias.h colvar.h colvarparse.h colvardeps.h -colvarbias_histogram.o: colvarbias_histogram.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvar.h colvarparse.h \ - colvardeps.h colvarbias_histogram.h colvarbias.h colvargrid.h -colvarbias_meta.o: colvarbias_meta.cpp colvar.h colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ - colvarbias_meta.h colvarbias.h colvargrid.h -colvarbias_restraint.o: colvarbias_restraint.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarbias_restraint.h \ - colvarbias.h colvar.h colvarparse.h colvardeps.h -colvarcomp_angles.o: colvarcomp_angles.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvar.h colvarparse.h colvardeps.h \ - colvarcomp.h colvaratoms.h -colvarcomp_coordnums.o: colvarcomp_coordnums.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ - colvaratoms.h colvar.h colvarcomp.h -colvarcomp.o: colvarcomp.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvar.h colvarparse.h colvardeps.h colvarcomp.h \ - colvaratoms.h -colvarcomp_distances.o: colvarcomp_distances.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ - colvar.h colvarcomp.h colvaratoms.h -colvarcomp_protein.o: colvarcomp_protein.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h colvar.h \ - colvarcomp.h colvaratoms.h -colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ - colvar.h colvarcomp.h colvaratoms.h -colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ - colvaratoms.h colvarscript.h colvarbias.h -colvardeps.o: colvardeps.cpp colvardeps.h colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h -colvargrid.o: colvargrid.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ - colvaratoms.h colvargrid.h -colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h colvar.h \ - colvarbias.h colvarbias_abf.h colvargrid.h colvarbias_alb.h \ - colvarbias_restraint.h colvarbias_histogram.h colvarbias_meta.h \ - colvarscript.h -colvarparse.o: colvarparse.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h -colvarscript.o: colvarscript.cpp colvarscript.h colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarbias.h colvar.h \ - colvarparse.h colvardeps.h -colvartypes.o: colvartypes.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h -colvarvalue.o: colvarvalue.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h - -# ------ CLEAN ------ - -clean: - -rm *.o *~ $(LIB) - diff --git a/lib/colvars/Makefile.common b/lib/colvars/Makefile.common new file mode 100644 index 0000000000..818373abe1 --- /dev/null +++ b/lib/colvars/Makefile.common @@ -0,0 +1,65 @@ +# Shared -*- makefile -*- for multiple architectures + +# Detect settings from PYTHON package (if defined) +include ../../src/Makefile.package.settings +ifeq ($(python_SYSINC),) +COLVARS_PYTHON_INCFLAGS = +else +COLVARS_PYTHON_INCFLAGS = -DCOLVARS_PYTHON $(python_SYSINC) +endif + +# Detect debug settings +ifeq ($(COLVARS_DEBUG),) +COLVARS_DEBUG_INCFLAGS = +else +COLVARS_DEBUG_INCFLAGS= -DCOLVARS_DEBUG +endif + +COLVARS_INCFLAGS = $(COLVARS_DEBUG_INCFLAGS) $(COLVARS_PYTHON_INCFLAGS) + + +.SUFFIXES: +.SUFFIXES: .cpp .o + +COLVARS_SRCS = \ + colvaratoms.cpp \ + colvarbias_abf.cpp \ + colvarbias_alb.cpp \ + colvarbias.cpp \ + colvarbias_histogram.cpp \ + colvarbias_meta.cpp \ + colvarbias_restraint.cpp \ + colvarcomp_angles.cpp \ + colvarcomp_coordnums.cpp \ + colvarcomp.cpp \ + colvarcomp_distances.cpp \ + colvarcomp_protein.cpp \ + colvarcomp_rotations.cpp \ + colvar.cpp \ + colvardeps.cpp \ + colvargrid.cpp \ + colvarmodule.cpp \ + colvarparse.cpp \ + colvarproxy.cpp \ + colvarscript.cpp \ + colvartypes.cpp \ + colvarvalue.cpp + +COLVARS_OBJS = $(COLVARS_SRCS:.cpp=.o) + +.cpp.o: + $(CXX) $(CXXFLAGS) $(COLVARS_INCFLAGS) -c $< + +$(COLVARS_LIB): Makefile.deps $(COLVARS_OBJS) + $(AR) $(ARFLAGS) $(COLVARS_LIB) $(COLVARS_OBJS) + + +Makefile.deps: $(COLVARS_SRCS) + @echo > $@ + @for src in $^ ; do \ + obj=`basename $$src .cpp`.o ; \ + $(CXX) -MM $(COLVARS_INCFLAGS) \ + -MT '$$(COLVARS_OBJ_DIR)'$$obj $$src >> $@ ; \ + done + +include Makefile.deps diff --git a/lib/colvars/Makefile.deps b/lib/colvars/Makefile.deps new file mode 100644 index 0000000000..f463da5f86 --- /dev/null +++ b/lib/colvars/Makefile.deps @@ -0,0 +1,78 @@ + +$(COLVARS_OBJ_DIR)colvaratoms.o: colvaratoms.cpp colvarmodule.h \ + colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ + colvarparse.h colvaratoms.h colvardeps.h +$(COLVARS_OBJ_DIR)colvarbias_abf.o: colvarbias_abf.cpp colvarmodule.h \ + colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h colvar.h \ + colvarparse.h colvardeps.h colvarbias_abf.h colvarbias.h colvargrid.h +$(COLVARS_OBJ_DIR)colvarbias_alb.o: colvarbias_alb.cpp colvarmodule.h \ + colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ + colvarbias_alb.h colvar.h colvarparse.h colvardeps.h colvarbias.h +$(COLVARS_OBJ_DIR)colvarbias.o: colvarbias.cpp colvarmodule.h \ + colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h colvarbias.h \ + colvar.h colvarparse.h colvardeps.h +$(COLVARS_OBJ_DIR)colvarbias_histogram.o: colvarbias_histogram.cpp \ + colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvar.h colvarparse.h colvardeps.h colvarbias_histogram.h \ + colvarbias.h colvargrid.h +$(COLVARS_OBJ_DIR)colvarbias_meta.o: colvarbias_meta.cpp colvar.h \ + colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvarparse.h colvardeps.h colvarbias_meta.h colvarbias.h \ + colvargrid.h +$(COLVARS_OBJ_DIR)colvarbias_restraint.o: colvarbias_restraint.cpp \ + colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvarbias_restraint.h colvarbias.h colvar.h colvarparse.h \ + colvardeps.h +$(COLVARS_OBJ_DIR)colvarcomp_angles.o: colvarcomp_angles.cpp \ + colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvar.h colvarparse.h colvardeps.h colvarcomp.h \ + colvaratoms.h +$(COLVARS_OBJ_DIR)colvarcomp_coordnums.o: colvarcomp_coordnums.cpp \ + colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvarparse.h colvaratoms.h colvardeps.h colvar.h \ + colvarcomp.h +$(COLVARS_OBJ_DIR)colvarcomp.o: colvarcomp.cpp colvarmodule.h \ + colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h colvar.h \ + colvarparse.h colvardeps.h colvarcomp.h colvaratoms.h +$(COLVARS_OBJ_DIR)colvarcomp_distances.o: colvarcomp_distances.cpp \ + colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvarparse.h colvar.h colvardeps.h colvarcomp.h \ + colvaratoms.h +$(COLVARS_OBJ_DIR)colvarcomp_protein.o: colvarcomp_protein.cpp \ + colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvarparse.h colvar.h colvardeps.h colvarcomp.h \ + colvaratoms.h +$(COLVARS_OBJ_DIR)colvarcomp_rotations.o: colvarcomp_rotations.cpp \ + colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvarparse.h colvar.h colvardeps.h colvarcomp.h \ + colvaratoms.h +$(COLVARS_OBJ_DIR)colvar.o: colvar.cpp colvarmodule.h colvars_version.h \ + colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ + colvardeps.h colvarcomp.h colvaratoms.h colvarscript.h colvarbias.h +$(COLVARS_OBJ_DIR)colvardeps.o: colvardeps.cpp colvardeps.h \ + colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvarparse.h +$(COLVARS_OBJ_DIR)colvargrid.o: colvargrid.cpp colvarmodule.h \ + colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ + colvarparse.h colvar.h colvardeps.h colvarcomp.h colvaratoms.h \ + colvargrid.h +$(COLVARS_OBJ_DIR)colvarmodule.o: colvarmodule.cpp colvarmodule.h \ + colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ + colvarparse.h colvar.h colvardeps.h colvarbias.h colvarbias_abf.h \ + colvargrid.h colvarbias_alb.h colvarbias_histogram.h colvarbias_meta.h \ + colvarbias_restraint.h colvarscript.h colvaratoms.h +$(COLVARS_OBJ_DIR)colvarparse.o: colvarparse.cpp colvarmodule.h \ + colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ + colvarparse.h +$(COLVARS_OBJ_DIR)colvarproxy.o: colvarproxy.cpp colvarmodule.h \ + colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ + colvarscript.h colvarbias.h colvar.h colvarparse.h colvardeps.h \ + colvaratoms.h +$(COLVARS_OBJ_DIR)colvarscript.o: colvarscript.cpp colvarscript.h \ + colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvarbias.h colvar.h colvarparse.h colvardeps.h +$(COLVARS_OBJ_DIR)colvartypes.o: colvartypes.cpp colvarmodule.h \ + colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ + colvarparse.h +$(COLVARS_OBJ_DIR)colvarvalue.o: colvarvalue.cpp colvarmodule.h \ + colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h diff --git a/lib/colvars/Makefile.fermi b/lib/colvars/Makefile.fermi deleted file mode 100644 index 906675ae12..0000000000 --- a/lib/colvars/Makefile.fermi +++ /dev/null @@ -1,120 +0,0 @@ -# library build -*- makefile -*- for colvars module - -# which file will be copied to Makefile.lammps - -EXTRAMAKE = Makefile.lammps.empty - -# ------ SETTINGS ------ - -CXX = g++ -CXXFLAGS = -O2 -mpc64 -g -fPIC \ - -Wall -Wno-sign-compare # -DCOLVARS_DEBUG -ARCHIVE = ar -ARCHFLAG = -rscv -SHELL = /bin/sh - -# ------ DEFINITIONS ------ - -SRC = colvaratoms.cpp colvarbias_abf.cpp colvarbias_alb.cpp colvarbias.cpp \ - colvarbias_histogram.cpp colvarbias_meta.cpp colvarbias_restraint.cpp \ - colvarcomp_angles.cpp colvarcomp_coordnums.cpp colvarcomp.cpp \ - colvarcomp_distances.cpp colvarcomp_protein.cpp colvarcomp_rotations.cpp \ - colvardeps.cpp colvar.cpp colvargrid.cpp colvarmodule.cpp colvarparse.cpp \ - colvarscript.cpp colvartypes.cpp colvarvalue.cpp - -LIB = libcolvars.a -OBJ = $(SRC:.cpp=.o) -EXE = #colvars_standalone - -# ------ MAKE PROCEDURE ------ - -default: $(LIB) $(EXE) Makefile.lammps - -Makefile.lammps: - @cp $(EXTRAMAKE) Makefile.lammps - -$(LIB): $(OBJ) - $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) - -colvars_standalone: colvars_main.o colvarproxy_standalone.o $(LIB) - $(CXX) -o $@ $(CXXFLAGS) $^ - -# ------ MAKE FLAGS ------ - -.SUFFIXES: -.SUFFIXES: .cpp .o - -.PHONY: default clean - -# ------ COMPILE RULES ------ - -.cpp.o: - $(CXX) $(CXXFLAGS) -c $< - -# ------ DEPENDENCIES ------ -# -colvaratoms.o: colvaratoms.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h colvaratoms.h -colvarbias_abf.o: colvarbias_abf.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvar.h colvarparse.h colvardeps.h \ - colvarbias_abf.h colvarbias.h colvargrid.h -colvarbias_alb.o: colvarbias_alb.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarbias_alb.h colvar.h colvarparse.h \ - colvardeps.h colvarbias_restraint.h colvarbias.h -colvarbias.o: colvarbias.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarbias.h colvar.h colvarparse.h colvardeps.h -colvarbias_histogram.o: colvarbias_histogram.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvar.h colvarparse.h \ - colvardeps.h colvarbias_histogram.h colvarbias.h colvargrid.h -colvarbias_meta.o: colvarbias_meta.cpp colvar.h colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ - colvarbias_meta.h colvarbias.h colvargrid.h -colvarbias_restraint.o: colvarbias_restraint.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarbias_restraint.h \ - colvarbias.h colvar.h colvarparse.h colvardeps.h -colvarcomp_angles.o: colvarcomp_angles.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvar.h colvarparse.h colvardeps.h \ - colvarcomp.h colvaratoms.h -colvarcomp_coordnums.o: colvarcomp_coordnums.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ - colvaratoms.h colvar.h colvarcomp.h -colvarcomp.o: colvarcomp.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvar.h colvarparse.h colvardeps.h colvarcomp.h \ - colvaratoms.h -colvarcomp_distances.o: colvarcomp_distances.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ - colvar.h colvarcomp.h colvaratoms.h -colvarcomp_protein.o: colvarcomp_protein.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h colvar.h \ - colvarcomp.h colvaratoms.h -colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ - colvar.h colvarcomp.h colvaratoms.h -colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ - colvaratoms.h colvarscript.h colvarbias.h -colvardeps.o: colvardeps.cpp colvardeps.h colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h -colvargrid.o: colvargrid.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ - colvaratoms.h colvargrid.h -colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h colvar.h \ - colvarbias.h colvarbias_abf.h colvargrid.h colvarbias_alb.h \ - colvarbias_restraint.h colvarbias_histogram.h colvarbias_meta.h \ - colvarscript.h -colvarparse.o: colvarparse.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h -colvarscript.o: colvarscript.cpp colvarscript.h colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarbias.h colvar.h \ - colvarparse.h colvardeps.h -colvartypes.o: colvartypes.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h -colvarvalue.o: colvarvalue.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h - -# ------ CLEAN ------ - -clean: - -rm *.o *~ $(LIB) - diff --git a/lib/colvars/Makefile.g++ b/lib/colvars/Makefile.g++ index c80fa1065e..cd7f72a833 100644 --- a/lib/colvars/Makefile.g++ +++ b/lib/colvars/Makefile.g++ @@ -1,119 +1,25 @@ -# library build -*- makefile -*- for colvars module - -# which file will be copied to Makefile.lammps +# -*- makefile -*- to build Colvars module with GNU compiler EXTRAMAKE = Makefile.lammps.empty -# ------ SETTINGS ------ +COLVARS_LIB = libcolvars.a +COLVARS_OBJ_DIR = CXX = g++ -CXXFLAGS = -O2 -g -fPIC -funroll-loops # -DCOLVARS_DEBUG -ARCHIVE = ar -ARCHFLAG = -rscv +CXXFLAGS = -O2 -g -Wall -fPIC -funroll-loops +AR = ar +ARFLAGS = -rscv SHELL = /bin/sh -# ------ DEFINITIONS ------ - -SRC = colvaratoms.cpp colvarbias_abf.cpp colvarbias_alb.cpp colvarbias.cpp \ - colvarbias_histogram.cpp colvarbias_meta.cpp colvarbias_restraint.cpp \ - colvarcomp_angles.cpp colvarcomp_coordnums.cpp colvarcomp.cpp \ - colvarcomp_distances.cpp colvarcomp_protein.cpp colvarcomp_rotations.cpp \ - colvardeps.cpp colvar.cpp colvargrid.cpp colvarmodule.cpp colvarparse.cpp \ - colvarscript.cpp colvartypes.cpp colvarvalue.cpp - -LIB = libcolvars.a -OBJ = $(SRC:.cpp=.o) -EXE = #colvars_standalone - -# ------ MAKE PROCEDURE ------ - -default: $(LIB) $(EXE) Makefile.lammps - -Makefile.lammps: - @cp $(EXTRAMAKE) Makefile.lammps - -$(LIB): $(OBJ) - $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) - -colvars_standalone: colvars_main.o colvarproxy_standalone.o $(LIB) - $(CXX) -o $@ $(CXXFLAGS) $^ - -# ------ MAKE FLAGS ------ - -.SUFFIXES: -.SUFFIXES: .cpp .o +include Makefile.common .PHONY: default clean -# ------ COMPILE RULES ------ - -.cpp.o: - $(CXX) $(CXXFLAGS) -c $< - -# ------ DEPENDENCIES ------ -# -colvaratoms.o: colvaratoms.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h colvaratoms.h -colvarbias_abf.o: colvarbias_abf.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvar.h colvarparse.h colvardeps.h \ - colvarbias_abf.h colvarbias.h colvargrid.h -colvarbias_alb.o: colvarbias_alb.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarbias_alb.h colvar.h colvarparse.h \ - colvardeps.h colvarbias_restraint.h colvarbias.h -colvarbias.o: colvarbias.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarbias.h colvar.h colvarparse.h colvardeps.h -colvarbias_histogram.o: colvarbias_histogram.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvar.h colvarparse.h \ - colvardeps.h colvarbias_histogram.h colvarbias.h colvargrid.h -colvarbias_meta.o: colvarbias_meta.cpp colvar.h colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ - colvarbias_meta.h colvarbias.h colvargrid.h -colvarbias_restraint.o: colvarbias_restraint.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarbias_restraint.h \ - colvarbias.h colvar.h colvarparse.h colvardeps.h -colvarcomp_angles.o: colvarcomp_angles.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvar.h colvarparse.h colvardeps.h \ - colvarcomp.h colvaratoms.h -colvarcomp_coordnums.o: colvarcomp_coordnums.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ - colvaratoms.h colvar.h colvarcomp.h -colvarcomp.o: colvarcomp.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvar.h colvarparse.h colvardeps.h colvarcomp.h \ - colvaratoms.h -colvarcomp_distances.o: colvarcomp_distances.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ - colvar.h colvarcomp.h colvaratoms.h -colvarcomp_protein.o: colvarcomp_protein.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h colvar.h \ - colvarcomp.h colvaratoms.h -colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ - colvar.h colvarcomp.h colvaratoms.h -colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ - colvaratoms.h colvarscript.h colvarbias.h -colvardeps.o: colvardeps.cpp colvardeps.h colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h -colvargrid.o: colvargrid.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ - colvaratoms.h colvargrid.h -colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h colvar.h \ - colvarbias.h colvarbias_abf.h colvargrid.h colvarbias_alb.h \ - colvarbias_restraint.h colvarbias_histogram.h colvarbias_meta.h \ - colvarscript.h -colvarparse.o: colvarparse.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h -colvarscript.o: colvarscript.cpp colvarscript.h colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarbias.h colvar.h \ - colvarparse.h colvardeps.h -colvartypes.o: colvartypes.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h -colvarvalue.o: colvarvalue.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h - -# ------ CLEAN ------ +default: $(COLVARS_LIB) Makefile.lammps clean: - -rm *.o *~ $(LIB) + -rm -f $(COLVARS_OBJS) $(COLVARS_LIB) + +Makefile.lammps: + -cp $(EXTRAMAKE) Makefile.lammps diff --git a/lib/colvars/Makefile.g++-debug b/lib/colvars/Makefile.g++-debug new file mode 100644 index 0000000000..a6ca2f8124 --- /dev/null +++ b/lib/colvars/Makefile.g++-debug @@ -0,0 +1,5 @@ +# -*- makefile -*- to build Colvars module with GNU compiler + +COLVARS_DEBUG = "YES" + +include Makefile.g++ diff --git a/lib/colvars/Makefile.lammps b/lib/colvars/Makefile.lammps new file mode 100644 index 0000000000..99f57b050b --- /dev/null +++ b/lib/colvars/Makefile.lammps @@ -0,0 +1,5 @@ +# Settings that the LAMMPS build will import when this package library is used + +colvars_SYSINC = +colvars_SYSLIB = +colvars_SYSPATH = diff --git a/lib/colvars/Makefile.lammps.debug b/lib/colvars/Makefile.lammps.debug index 1ef229d58a..1c4399a2cd 100644 --- a/lib/colvars/Makefile.lammps.debug +++ b/lib/colvars/Makefile.lammps.debug @@ -1,5 +1,5 @@ # Settings that the LAMMPS build will import when this package library is used -colvars_SYSINC = # -DCOLVARS_DEBUG +colvars_SYSINC = -DCOLVARS_DEBUG colvars_SYSLIB = colvars_SYSPATH = diff --git a/lib/colvars/Makefile.lammps.empty b/lib/colvars/Makefile.lammps.empty index 1ef229d58a..99f57b050b 100644 --- a/lib/colvars/Makefile.lammps.empty +++ b/lib/colvars/Makefile.lammps.empty @@ -1,5 +1,5 @@ # Settings that the LAMMPS build will import when this package library is used -colvars_SYSINC = # -DCOLVARS_DEBUG +colvars_SYSINC = colvars_SYSLIB = colvars_SYSPATH = diff --git a/lib/colvars/Makefile.mingw32-cross b/lib/colvars/Makefile.mingw32-cross index eba83c555f..e2873ecdad 100644 --- a/lib/colvars/Makefile.mingw32-cross +++ b/lib/colvars/Makefile.mingw32-cross @@ -1,127 +1,31 @@ -# library build -*- makefile -*- for colvars module - -# which file will be copied to Makefile.lammps +# -*- makefile -*- to build Colvars module with MinGW 32-bit EXTRAMAKE = Makefile.lammps.empty -# ------ SETTINGS ------ +COLVARS_LIB = libcolvars.a +COLVARS_OBJ_DIR = Obj_mingw64/ CXX = i686-w64-mingw32-g++ CXXFLAGS = -O2 -march=i686 -mtune=generic -mfpmath=387 -mpc64 \ -fno-rtti -fno-exceptions -finline-functions \ -ffast-math -funroll-loops -fstrict-aliasing \ -Wall -W -Wno-uninitialized -ARCHIVE = i686-w64-mingw32-ar -ARCHFLAG = -rscv +AR = i686-w64-mingw32-ar +ARFLAGS = -rscv SHELL = /bin/sh -# ------ DEFINITIONS ------ - -SRC = colvaratoms.cpp colvarbias_abf.cpp colvarbias_alb.cpp colvarbias.cpp \ - colvarbias_histogram.cpp colvarbias_meta.cpp colvarbias_restraint.cpp \ - colvarcomp_angles.cpp colvarcomp_coordnums.cpp colvarcomp.cpp \ - colvarcomp_distances.cpp colvarcomp_protein.cpp colvarcomp_rotations.cpp \ - colvardeps.cpp colvar.cpp colvargrid.cpp colvarmodule.cpp colvarparse.cpp \ - colvarscript.cpp colvartypes.cpp colvarvalue.cpp - -DIR = Obj_mingw32/ -LIB = $(DIR)libcolvars.a -OBJ = $(SRC:%.cpp=$(DIR)%.o) -EXE = #colvars_standalone - -# ------ MAKE PROCEDURE ------ - -default: $(DIR) $(LIB) $(EXE) Makefile.lammps - -$(DIR): - mkdir $(DIR) - -Makefile.lammps: - @cp $(EXTRAMAKE) Makefile.lammps - -$(LIB): $(DIR) $(OBJ) - $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) - @cp $(EXTRAMAKE) Makefile.lammps - -$(DIR)colvars_standalone: colvars_main.o colvarproxy_standalone.o $(LIB) - $(CXX) -o $@ $(CXXFLAGS) $^ - -# ------ MAKE FLAGS ------ - -.SUFFIXES: -.SUFFIXES: .cpp .o +include Makefile.common .PHONY: default clean -# ------ COMPILE RULES ------ +default: $(COLVARS_OBJ_DIR) $(COLVARS_LIB) Makefile.lammps -$(DIR)%.o: %.cpp - $(CXX) $(CXXFLAGS) -c $< -o $@ - -# ------ DEPENDENCIES ------ -# -$(DIR)colvaratoms.o: colvaratoms.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h colvaratoms.h -$(DIR)colvarbias_abf.o: colvarbias_abf.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvar.h colvarparse.h colvardeps.h \ - colvarbias_abf.h colvarbias.h colvargrid.h -$(DIR)colvarbias_alb.o: colvarbias_alb.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarbias_alb.h colvar.h colvarparse.h \ - colvardeps.h colvarbias_restraint.h colvarbias.h -$(DIR)colvarbias.o: colvarbias.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarbias.h colvar.h colvarparse.h colvardeps.h -$(DIR)colvarbias_histogram.o: colvarbias_histogram.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvar.h colvarparse.h \ - colvardeps.h colvarbias_histogram.h colvarbias.h colvargrid.h -$(DIR)colvarbias_meta.o: colvarbias_meta.cpp colvar.h colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ - colvarbias_meta.h colvarbias.h colvargrid.h -$(DIR)colvarbias_restraint.o: colvarbias_restraint.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarbias_restraint.h \ - colvarbias.h colvar.h colvarparse.h colvardeps.h -$(DIR)colvarcomp_angles.o: colvarcomp_angles.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvar.h colvarparse.h colvardeps.h \ - colvarcomp.h colvaratoms.h -$(DIR)colvarcomp_coordnums.o: colvarcomp_coordnums.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ - colvaratoms.h colvar.h colvarcomp.h -$(DIR)colvarcomp.o: colvarcomp.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvar.h colvarparse.h colvardeps.h colvarcomp.h \ - colvaratoms.h -$(DIR)colvarcomp_distances.o: colvarcomp_distances.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ - colvar.h colvarcomp.h colvaratoms.h -$(DIR)colvarcomp_protein.o: colvarcomp_protein.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h colvar.h \ - colvarcomp.h colvaratoms.h -$(DIR)colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ - colvar.h colvarcomp.h colvaratoms.h -$(DIR)colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ - colvaratoms.h colvarscript.h colvarbias.h -$(DIR)colvardeps.o: colvardeps.cpp colvardeps.h colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h -$(DIR)colvargrid.o: colvargrid.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ - colvaratoms.h colvargrid.h -$(DIR)colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h colvar.h \ - colvarbias.h colvarbias_abf.h colvargrid.h colvarbias_alb.h \ - colvarbias_restraint.h colvarbias_histogram.h colvarbias_meta.h \ - colvarscript.h -$(DIR)colvarparse.o: colvarparse.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h -$(DIR)colvarscript.o: colvarscript.cpp colvarscript.h colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarbias.h colvar.h \ - colvarparse.h colvardeps.h -$(DIR)colvartypes.o: colvartypes.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h -$(DIR)colvarvalue.o: colvarvalue.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h - -# ------ CLEAN ------ +$(COLVARS_OBJ_DIR): + mkdir $(COLVARS_OBJ_DIR) clean: - -rm $(DIR)*.o *~ $(LIB) - -rmdir $(DIR) + -rm -f $(COLVARS_OBJS) $(COLVARS_LIB) + -rmdir $(COLVARS_OBJ_DIR) + +Makefile.lammps: + -cp $(EXTRAMAKE) Makefile.lammps diff --git a/lib/colvars/Makefile.mingw64-cross b/lib/colvars/Makefile.mingw64-cross index 1d83b6a0a8..09d6bd4fa9 100644 --- a/lib/colvars/Makefile.mingw64-cross +++ b/lib/colvars/Makefile.mingw64-cross @@ -1,127 +1,31 @@ -# library build -*- makefile -*- for colvars module - -# which file will be copied to Makefile.lammps +# -*- makefile -*- to build Colvars module with MinGW 32-bit EXTRAMAKE = Makefile.lammps.empty -# ------ SETTINGS ------ +COLVARS_LIB = libcolvars.a +COLVARS_OBJ_DIR = Obj_mingw32/ CXX = x86_64-w64-mingw32-g++ CXXFLAGS = -O2 -march=core2 -mtune=core2 -mpc64 -msse2 \ -fno-rtti -fno-exceptions -finline-functions \ -ffast-math -funroll-loops -fstrict-aliasing \ -Wall -W -Wno-uninitialized -ARCHIVE = x86_64-w64-mingw32-ar -ARCHFLAG = -rscv +AR = x86_64-w64-mingw32-ar +ARFLAGS = -rscv SHELL = /bin/sh -# ------ DEFINITIONS ------ - -SRC = colvaratoms.cpp colvarbias_abf.cpp colvarbias_alb.cpp colvarbias.cpp \ - colvarbias_histogram.cpp colvarbias_meta.cpp colvarbias_restraint.cpp \ - colvarcomp_angles.cpp colvarcomp_coordnums.cpp colvarcomp.cpp \ - colvarcomp_distances.cpp colvarcomp_protein.cpp colvarcomp_rotations.cpp \ - colvardeps.cpp colvar.cpp colvargrid.cpp colvarmodule.cpp colvarparse.cpp \ - colvarscript.cpp colvartypes.cpp colvarvalue.cpp - -DIR = Obj_mingw64/ -LIB = $(DIR)libcolvars.a -OBJ = $(SRC:%.cpp=$(DIR)%.o) -EXE = #colvars_standalone - -# ------ MAKE PROCEDURE ------ - -default: $(DIR) $(LIB) $(EXE) Makefile.lammps - -$(DIR): - mkdir $(DIR) - -Makefile.lammps: - @cp $(EXTRAMAKE) Makefile.lammps - -$(LIB): $(DIR) $(OBJ) - $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) - @cp $(EXTRAMAKE) Makefile.lammps - -$(DIR)colvars_standalone: colvars_main.o colvarproxy_standalone.o $(LIB) - $(CXX) -o $@ $(CXXFLAGS) $^ - -# ------ MAKE FLAGS ------ - -.SUFFIXES: -.SUFFIXES: .cpp .o +include Makefile.common .PHONY: default clean -# ------ COMPILE RULES ------ +default: $(COLVARS_OBJ_DIR) $(COLVARS_LIB) Makefile.lammps -$(DIR)%.o: %.cpp - $(CXX) $(CXXFLAGS) -c $< -o $@ - -# ------ DEPENDENCIES ------ -# -$(DIR)colvaratoms.o: colvaratoms.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h colvaratoms.h -$(DIR)colvarbias_abf.o: colvarbias_abf.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvar.h colvarparse.h colvardeps.h \ - colvarbias_abf.h colvarbias.h colvargrid.h -$(DIR)colvarbias_alb.o: colvarbias_alb.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarbias_alb.h colvar.h colvarparse.h \ - colvardeps.h colvarbias_restraint.h colvarbias.h -$(DIR)colvarbias.o: colvarbias.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarbias.h colvar.h colvarparse.h colvardeps.h -$(DIR)colvarbias_histogram.o: colvarbias_histogram.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvar.h colvarparse.h \ - colvardeps.h colvarbias_histogram.h colvarbias.h colvargrid.h -$(DIR)colvarbias_meta.o: colvarbias_meta.cpp colvar.h colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ - colvarbias_meta.h colvarbias.h colvargrid.h -$(DIR)colvarbias_restraint.o: colvarbias_restraint.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarbias_restraint.h \ - colvarbias.h colvar.h colvarparse.h colvardeps.h -$(DIR)colvarcomp_angles.o: colvarcomp_angles.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvar.h colvarparse.h colvardeps.h \ - colvarcomp.h colvaratoms.h -$(DIR)colvarcomp_coordnums.o: colvarcomp_coordnums.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ - colvaratoms.h colvar.h colvarcomp.h -$(DIR)colvarcomp.o: colvarcomp.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvar.h colvarparse.h colvardeps.h colvarcomp.h \ - colvaratoms.h -$(DIR)colvarcomp_distances.o: colvarcomp_distances.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ - colvar.h colvarcomp.h colvaratoms.h -$(DIR)colvarcomp_protein.o: colvarcomp_protein.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h colvar.h \ - colvarcomp.h colvaratoms.h -$(DIR)colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h \ - colvar.h colvarcomp.h colvaratoms.h -$(DIR)colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ - colvaratoms.h colvarscript.h colvarbias.h -$(DIR)colvardeps.o: colvardeps.cpp colvardeps.h colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h -$(DIR)colvargrid.o: colvargrid.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h colvar.h colvarcomp.h \ - colvaratoms.h colvargrid.h -$(DIR)colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h \ - colvarproxy.h colvarvalue.h colvarparse.h colvardeps.h colvar.h \ - colvarbias.h colvarbias_abf.h colvargrid.h colvarbias_alb.h \ - colvarbias_restraint.h colvarbias_histogram.h colvarbias_meta.h \ - colvarscript.h -$(DIR)colvarparse.o: colvarparse.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h -$(DIR)colvarscript.o: colvarscript.cpp colvarscript.h colvarmodule.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarbias.h colvar.h \ - colvarparse.h colvardeps.h -$(DIR)colvartypes.o: colvartypes.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h -$(DIR)colvarvalue.o: colvarvalue.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h - -# ------ CLEAN ------ +$(COLVARS_OBJ_DIR): + mkdir $(COLVARS_OBJ_DIR) clean: - -rm $(DIR)*.o *~ $(LIB) - -rmdir $(DIR) + -rm -f $(COLVARS_OBJS) $(COLVARS_LIB) + -rmdir $(COLVARS_OBJ_DIR) + +Makefile.lammps: + -cp $(EXTRAMAKE) Makefile.lammps diff --git a/lib/colvars/README b/lib/colvars/README index a5e5938b20..a4f04221b3 100644 --- a/lib/colvars/README +++ b/lib/colvars/README @@ -1,49 +1,35 @@ -This library is the portable "colvars" module, originally interfaced -with the NAMD MD code, to provide an extensible software framework, -that allows enhanced sampling in molecular dynamics simulations. -The module is written to maximize performance, portability, -flexibility of usage for the user, and extensibility for the developer. +## Collective variables module (Colvars) -The development of the colvars library is now hosted on github at: -http://colvars.github.io/ -You can use this site to get access to the latest development sources -and the up-to-date documentation. +A software module for molecular simulation and analysis that provides a +high-performance implementation of sampling algorithms defined on a reduced +space of continuously differentiable functions (aka collective variables). -Copy of the specific documentation is also in - doc/PDF/colvars-refman-lammps.pdf +The module itself implements a variety of functions and algorithms, including +free-energy estimators based on thermodynamic forces, non-equilibrium work and +probability distributions. -Please report bugs and request new features at: -https://github.com/colvars/colvars/issues +For a brief description see: + http://colvars.github.io/ + https://github.com/colvars/colvars/ -The following publications describe the principles of -the implementation of this library: - Using collective variables to drive molecular dynamics simulations, - Giacomo Fiorin , Michael L. Klein & Jérôme Hénin (2013): - Molecular Physics DOI:10.1080/00268976.2013.813594 - - Exploring Multidimensional Free Energy Landscapes Using - Time-Dependent Biases on Collective Variables, - J. Hénin, G. Fiorin, C. Chipot, and M. L. Klein, - J. Chem. Theory Comput., 6, 35-47 (2010). - -------------------------------------------------- +## How to build This directory has source files to build a library that LAMMPS links against when using the USER-COLVARS package. -This library must be built with a C++ compiler, before LAMMPS is -built, so LAMMPS can link against it. +This library must be built with a C++ compiler, *before* LAMMPS is built, so +that LAMMPS can link against it. You can use the provided Makefile.* files or +create your own, specific to your compiler and system. For example: -You can type "make lib-colvars" from the src directory to see help on -how to build this library via make commands, or you can do the same -thing by typing "python Install.py" from within this directory, or you -can do it manually by following the instructions below. + make -f Makefile.g++ -Build the library using one of the provided Makefile.* files or create -your own, specific to your compiler and system. For example: +will use the GNU C++ compiler and is a good template to start. -make -f Makefile.g++ +**Optional**: if you use the Install.py script provided in this folder, you +can give the machine name as the '-m' argument. This can be the suffix of one +of the files from either this folder, or from src/MAKE. +*This is only supported by the Install.py within the lib/colvars folder*. When you are done building this library, two files should exist in this directory: @@ -51,23 +37,42 @@ exist in this directory: libcolvars.a the library LAMMPS will link against Makefile.lammps settings the LAMMPS Makefile will import -Makefile.lammps is created by the make command, by copying one of the -Makefile.lammps.* files. See the EXTRAMAKE setting at the top of the -Makefile.* files. - IMPORTANT: You must examine the final Makefile.lammps to insure it is correct for your system, else the LAMMPS build will likely fail. -Makefile.lammps has settings for 3 variables: - -user-colvars_SYSINC = leave blank for this package unless debugging -user-colvars_SYSLIB = leave blank for this package -user-colvars_SYSPATH = leave blank for this package - -You have several choices for these settings: - -Since they do not normally need to be set, the settings in -Makefile.lammps.empty should work. - If you want to set a debug flag recognized by the library, the -settings in Makefile.lammps.debug should work. +settings in Makefile.common should work. + + +## Documentation + +For the reference manual see: + http://colvars.github.io/colvars-refman-lammps + +A copy of reference manual is also in: + doc/PDF/colvars-refman-lammps.pdf + +Also included is a Doxygen-based developer documentation: + http://colvars.github.io/doxygen/html/ + +The reference article is: + G. Fiorin, M. L. Klein, and J. Henin, + Molecular Physics 111, 3345 (2013). + http://dx.doi.org/10.1080/00268976.2013.813594 + + +## Updating to the latest version + +To recompile LAMMPS with the most recent version of this module, the `master` +branch of this repository from GitHub, or clone it via git: + + git clone https://github.com/colvars/colvars.git + +and run the provided `update-colvars-code.sh` script against the unpacked +LAMMPS source tree: + + ./update-colvars-code.sh /path/to/lammps/folder + +Please report bugs and request new features at: +https://github.com/colvars/colvars/issues + diff --git a/lib/colvars/colvar.cpp b/lib/colvars/colvar.cpp index e8c7e88324..d23bd852aa 100644 --- a/lib/colvars/colvar.cpp +++ b/lib/colvars/colvar.cpp @@ -1,5 +1,5 @@ - // -*- c++ -*- + // This file is part of the Collective Variables module (Colvars). // The original version of Colvars and its updates are located at: // https://github.com/colvars/colvars @@ -7,13 +7,14 @@ // If you wish to distribute your changes, please submit them to the // Colvars repository at GitHub. - #include "colvarmodule.h" #include "colvarvalue.h" #include "colvarparse.h" #include "colvar.h" #include "colvarcomp.h" #include "colvarscript.h" + +// used in build_atom_list() #include @@ -25,8 +26,10 @@ bool compare(colvar::cvc *i, colvar::cvc *j) { colvar::colvar() + : prev_timestep(-1) { // Initialize static array once and for all + runave_os = NULL; init_cv_requires(); } @@ -66,6 +69,13 @@ int colvar::init(std::string const &conf) size_t i; +#ifdef LEPTON + error_code |= init_custom_function(conf); + if (error_code != COLVARS_OK) { + return cvm::get_error(); + } +#endif + // Setup colvar as scripted function of components if (get_keyval(conf, "scriptedFunction", scripted_function, "", colvarparse::parse_silent)) { @@ -122,7 +132,7 @@ int colvar::init(std::string const &conf) } } - if (!is_enabled(f_cv_scripted)) { + if (!(is_enabled(f_cv_scripted) || is_enabled(f_cv_custom_function))) { colvarvalue const &cvc_value = (cvcs[0])->value(); if (cvm::debug()) cvm::log ("This collective variable is a "+ @@ -141,7 +151,7 @@ int colvar::init(std::string const &conf) // check for linear combinations { - bool lin = !is_enabled(f_cv_scripted); + bool lin = !(is_enabled(f_cv_scripted) || is_enabled(f_cv_custom_function)); for (i = 0; i < cvcs.size(); i++) { // FIXME this is a reverse dependency, ie. cv feature depends on cvc flag @@ -206,7 +216,7 @@ int colvar::init(std::string const &conf) for (i = 0; i < cvcs.size(); i++) { // components may have different types only for scripted functions - if (!is_enabled(f_cv_scripted) && (colvarvalue::check_types(cvcs[i]->value(), + if (!(is_enabled(f_cv_scripted) || is_enabled(f_cv_custom_function)) && (colvarvalue::check_types(cvcs[i]->value(), cvcs[0]->value())) ) { cvm::error("ERROR: you are definining this collective variable " "by using components of different types. " @@ -223,7 +233,6 @@ int colvar::init(std::string const &conf) // at this point, the colvar's type is defined f.type(value()); - f_accumulated.type(value()); x_old.type(value()); v_fdiff.type(value()); @@ -239,18 +248,23 @@ int colvar::init(std::string const &conf) reset_bias_force(); + get_keyval(conf, "timeStepFactor", time_step_factor, 1); + if (time_step_factor < 0) { + cvm::error("Error: timeStepFactor must be positive.\n"); + return COLVARS_ERROR; + } + if (time_step_factor != 1) { + enable(f_cv_multiple_ts); + } + // TODO use here information from the CVCs' own natural boundaries error_code |= init_grid_parameters(conf); - get_keyval(conf, "timeStepFactor", time_step_factor, 1); - error_code |= init_extended_Lagrangian(conf); error_code |= init_output_flags(conf); - // Start in active state by default + // Now that the children are defined we can solve dependencies enable(f_cv_active); - // Make sure dependency side-effects are correct - refresh_deps(); if (cvm::b_analysis) parse_analysis(conf); @@ -262,6 +276,158 @@ int colvar::init(std::string const &conf) } +#ifdef LEPTON +int colvar::init_custom_function(std::string const &conf) +{ + std::string expr; + std::vector pexprs; + Lepton::ParsedExpression pexpr; + size_t pos = 0; // current position in config string + double *ref; + + if (!key_lookup(conf, "customFunction", &expr, &pos)) { + return COLVARS_OK; + } + + enable(f_cv_custom_function); + cvm::log("This colvar uses a custom function.\n"); + + do { + if (cvm::debug()) + cvm::log("Parsing expression \"" + expr + "\".\n"); + try { + pexpr = Lepton::Parser::parse(expr); + pexprs.push_back(pexpr); + } + catch (...) { + cvm::error("Error parsing expression \"" + expr + "\".\n", INPUT_ERROR); + return INPUT_ERROR; + } + + try { + value_evaluators.push_back( + new Lepton::CompiledExpression(pexpr.createCompiledExpression())); + // Define variables for cvc values + // Stored in order: expr1, cvc1, cvc2, expr2, cvc1... + for (size_t i = 0; i < cvcs.size(); i++) { + for (size_t j = 0; j < cvcs[i]->value().size(); j++) { + std::string vn = cvcs[i]->name + + (cvcs[i]->value().size() > 1 ? cvm::to_str(j+1) : ""); + try { + ref =&value_evaluators.back()->getVariableReference(vn); + } + catch (...) { // Variable is absent from expression + // To keep the same workflow, we use a pointer to a double here + // that will receive CVC values - even though none was allocated by Lepton + ref = &dev_null; + if (cvm::debug()) + cvm::log("Variable " + vn + " is absent from expression \"" + expr + "\".\n"); + } + value_eval_var_refs.push_back(ref); + } + } + } + catch (...) { + cvm::error("Error compiling expression \"" + expr + "\".\n", INPUT_ERROR); + return INPUT_ERROR; + } + } while (key_lookup(conf, "customFunction", &expr, &pos)); + + + // Now define derivative with respect to each scalar sub-component + for (size_t i = 0; i < cvcs.size(); i++) { + for (size_t j = 0; j < cvcs[i]->value().size(); j++) { + std::string vn = cvcs[i]->name + + (cvcs[i]->value().size() > 1 ? cvm::to_str(j+1) : ""); + // Element ordering: we want the + // gradient vector of derivatives of all elements of the colvar + // wrt to a given element of a cvc ([i][j]) + for (size_t c = 0; c < pexprs.size(); c++) { + gradient_evaluators.push_back( + new Lepton::CompiledExpression(pexprs[c].differentiate(vn).createCompiledExpression())); + // and record the refs to each variable in those expressions + for (size_t k = 0; k < cvcs.size(); k++) { + for (size_t l = 0; l < cvcs[k]->value().size(); l++) { + std::string vvn = cvcs[k]->name + + (cvcs[k]->value().size() > 1 ? cvm::to_str(l+1) : ""); + try { + ref = &gradient_evaluators.back()->getVariableReference(vvn); + } + catch (...) { // Variable is absent from derivative + // To keep the same workflow, we use a pointer to a double here + // that will receive CVC values - even though none was allocated by Lepton + if (cvm::debug()) + cvm::log("Variable " + vvn + " is absent from derivative of \"" + expr + "\" wrt " + vn + ".\n"); + ref = &dev_null; + } + grad_eval_var_refs.push_back(ref); + } + } + } + } + } + + + if (value_evaluators.size() == 0) { + cvm::error("Error: no custom function defined.\n", INPUT_ERROR); + return INPUT_ERROR; + } + + std::string type_str; + bool b_type_specified = get_keyval(conf, "customFunctionType", + type_str, "scalar", parse_silent); + x.type(colvarvalue::type_notset); + int t; + for (t = 0; t < colvarvalue::type_all; t++) { + if (type_str == colvarvalue::type_keyword(colvarvalue::Type(t))) { + x.type(colvarvalue::Type(t)); + break; + } + } + if (x.type() == colvarvalue::type_notset) { + cvm::error("Could not parse custom colvar type.", INPUT_ERROR); + return INPUT_ERROR; + } + + // Guess type based on number of expressions + if (!b_type_specified) { + if (value_evaluators.size() == 1) { + x.type(colvarvalue::type_scalar); + } else { + x.type(colvarvalue::type_vector); + } + } + + if (x.type() == colvarvalue::type_vector) { + x.vector1d_value.resize(value_evaluators.size()); + } + + x_reported.type(x); + cvm::log(std::string("Expecting colvar value of type ") + + colvarvalue::type_desc(x.type()) + + (x.type()==colvarvalue::type_vector ? " of size " + cvm::to_str(x.size()) : "") + + ".\n"); + + if (x.size() != value_evaluators.size()) { + cvm::error("Error: based on custom function type, expected " + + cvm::to_str(x.size()) + " scalar expressions, but " + + cvm::to_str(value_evaluators.size() + " were found.\n")); + return INPUT_ERROR; + } + + return COLVARS_OK; +} + +#else + +int colvar::init_custom_function(std::string const &conf) +{ + return COLVARS_OK; +} + +#endif // #ifdef LEPTON + + int colvar::init_grid_parameters(std::string const &conf) { colvarmodule *cv = cvm::main(); @@ -326,7 +492,8 @@ int colvar::init_grid_parameters(std::string const &conf) std::string const walls_conf("\n\ harmonicWalls {\n\ name "+this->name+"w\n\ - colvars "+this->name+"\n"+lw_conf+uw_conf+ + colvars "+this->name+"\n"+lw_conf+uw_conf+"\ + timeStepFactor "+cvm::to_str(time_step_factor)+"\n"+ "}\n"); cv->append_new_config(walls_conf); } @@ -372,17 +539,14 @@ harmonicWalls {\n\ int colvar::init_extended_Lagrangian(std::string const &conf) { - bool b_extended_Lagrangian; - get_keyval(conf, "extendedLagrangian", b_extended_Lagrangian, false); + get_keyval_feature(this, conf, "extendedLagrangian", f_cv_extended_Lagrangian, false); - if (b_extended_Lagrangian) { + if (is_enabled(f_cv_extended_Lagrangian)) { cvm::real temp, tolerance, period; cvm::log("Enabling the extended Lagrangian term for colvar \""+ this->name+"\".\n"); - enable(f_cv_extended_Lagrangian); - xr.type(value()); vr.type(value()); fr.type(value()); @@ -404,7 +568,7 @@ int colvar::init_extended_Lagrangian(std::string const &conf) return INPUT_ERROR; } ext_force_k = cvm::boltzmann() * temp / (tolerance * tolerance); - cvm::log("Computed extended system force constant: " + cvm::to_str(ext_force_k) + " kcal/mol/U^2"); + cvm::log("Computed extended system force constant: " + cvm::to_str(ext_force_k) + " [E]/U^2"); get_keyval(conf, "extendedTimeConstant", period, 200.0); if (period <= 0.0) { @@ -412,7 +576,7 @@ int colvar::init_extended_Lagrangian(std::string const &conf) } ext_mass = (cvm::boltzmann() * temp * period * period) / (4.0 * PI * PI * tolerance * tolerance); - cvm::log("Computed fictitious mass: " + cvm::to_str(ext_mass) + " kcal/mol/(U/fs)^2 (U: colvar unit)"); + cvm::log("Computed fictitious mass: " + cvm::to_str(ext_mass) + " [E]/(U/fs)^2 (U: colvar unit)"); { bool b_output_energy; @@ -429,8 +593,9 @@ int colvar::init_extended_Lagrangian(std::string const &conf) } if (ext_gamma != 0.0) { enable(f_cv_Langevin); - ext_gamma *= 1.0e-3; // convert from ps-1 to fs-1 - ext_sigma = std::sqrt(2.0 * cvm::boltzmann() * temp * ext_gamma * ext_mass / cvm::dt()); + ext_gamma *= 1.0e-3; // correct as long as input is required in ps-1 and cvm::dt() is in fs + // Adjust Langevin sigma for slow time step if time_step_factor != 1 + ext_sigma = std::sqrt(2.0 * cvm::boltzmann() * temp * ext_gamma * ext_mass / (cvm::dt() * cvm::real(time_step_factor))); } } @@ -486,8 +651,8 @@ template int colvar::init_components_type(std::string c size_t pos = 0; while ( this->key_lookup(conf, def_config_key, - def_conf, - pos) ) { + &def_conf, + &pos) ) { if (!def_conf.size()) continue; cvm::log("Initializing " "a new \""+std::string(def_config_key)+"\" component"+ @@ -514,6 +679,7 @@ template int colvar::init_components_type(std::string c if ( (cvcp->period != 0.0) || (cvcp->wrap_center != 0.0) ) { if ( (cvcp->function_type != std::string("distance_z")) && (cvcp->function_type != std::string("dihedral")) && + (cvcp->function_type != std::string("polar_phi")) && (cvcp->function_type != std::string("spin_angle")) ) { cvm::error("Error: invalid use of period and/or " "wrapAround in a \""+ @@ -566,6 +732,10 @@ int colvar::init_components(std::string const &conf) "on an axis", "distanceZ"); error_code |= init_components_type(conf, "distance projection " "on a plane", "distanceXY"); + error_code |= init_components_type(conf, "spherical polar angle theta", + "polarTheta"); + error_code |= init_components_type(conf, "spherical azimuthal angle phi", + "polarPhi"); error_code |= init_components_type(conf, "average distance " "weighted by inverse power", "distanceInv"); error_code |= init_components_type(conf, "N1xN2-long vector " @@ -618,16 +788,18 @@ int colvar::init_components(std::string const &conf) } -int colvar::refresh_deps() +void colvar::do_feature_side_effects(int id) { - // If enabled features are changed upstream, the features below should be refreshed - if (is_enabled(f_cv_total_force_calc)) { - cvm::request_total_force(); + switch (id) { + case f_cv_total_force_calc: + cvm::request_total_force(); + break; + case f_cv_collect_gradient: + if (atom_ids.size() == 0) { + build_atom_list(); + } + break; } - if (is_enabled(f_cv_collect_gradient) && atom_ids.size() == 0) { - build_atom_list(); - } - return COLVARS_OK; } @@ -688,20 +860,19 @@ int colvar::parse_analysis(std::string const &conf) cvm::error("Error: runAveStride must be commensurate with the restart frequency.\n", INPUT_ERROR); } - std::string runave_outfile; get_keyval(conf, "runAveOutputFile", runave_outfile, std::string(cvm::output_prefix()+"."+ this->name+".runave.traj")); size_t const this_cv_width = x.output_width(cvm::cv_width); - cvm::backup_file(runave_outfile.c_str()); - runave_os.open(runave_outfile.c_str()); - runave_os << "# " << cvm::wrap_string("step", cvm::it_width-2) - << " " - << cvm::wrap_string("running average", this_cv_width) - << " " - << cvm::wrap_string("running stddev", this_cv_width) - << "\n"; + cvm::proxy->backup_file(runave_outfile); + runave_os = cvm::proxy->output_stream(runave_outfile); + *runave_os << "# " << cvm::wrap_string("step", cvm::it_width-2) + << " " + << cvm::wrap_string("running average", this_cv_width) + << " " + << cvm::wrap_string("running stddev", this_cv_width) + << "\n"; } acf_length = 0; @@ -768,6 +939,10 @@ void colvar::setup() { colvar::~colvar() { + // There is no need to call free_children_deps() here + // because the children are cvcs and will be deleted + // just below + // Clear references to this colvar's cvcs as children // for dependency purposes remove_all_children(); @@ -792,6 +967,22 @@ colvar::~colvar() break; } } + +#ifdef LEPTON + for (std::vector::iterator cei = value_evaluators.begin(); + cei != value_evaluators.end(); + ++cei) { + if (*cei != NULL) delete (*cei); + } + value_evaluators.clear(); + + for (std::vector::iterator gei = gradient_evaluators.begin(); + gei != gradient_evaluators.end(); + ++gei) { + if (*gei != NULL) delete (*gei); + } + gradient_evaluators.clear(); +#endif } @@ -911,7 +1102,6 @@ int colvar::calc_cvc_values(int first_cvc, size_t num_cvcs) int colvar::collect_cvc_values() { x.reset(); - size_t i; // combine them appropriately, using either a scripted function or a polynomial if (is_enabled(f_cv_scripted)) { @@ -925,9 +1115,26 @@ int colvar::collect_cvc_values() cvm::error("Error running scripted colvar"); return COLVARS_OK; } + +#ifdef LEPTON + } else if (is_enabled(f_cv_custom_function)) { + + size_t l = 0; // index in the vector of variable references + + for (size_t i = 0; i < x.size(); i++) { + // Fill Lepton evaluator variables with CVC values, serialized into scalars + for (size_t j = 0; j < cvcs.size(); j++) { + for (size_t k = 0; k < cvcs[j]->value().size(); k++) { + *(value_eval_var_refs[l++]) = cvcs[j]->value()[k]; + } + } + x[i] = value_evaluators[i]->evaluate(); + } +#endif + } else if (x.type() == colvarvalue::type_scalar) { // polynomial combination allowed - for (i = 0; i < cvcs.size(); i++) { + for (size_t i = 0; i < cvcs.size(); i++) { if (!cvcs[i]->is_enabled()) continue; x += (cvcs[i])->sup_coeff * ( ((cvcs[i])->sup_np != 1) ? @@ -935,7 +1142,7 @@ int colvar::collect_cvc_values() (cvcs[i])->value().real_value ); } } else { - for (i = 0; i < cvcs.size(); i++) { + for (size_t i = 0; i < cvcs.size(); i++) { if (!cvcs[i]->is_enabled()) continue; x += (cvcs[i])->sup_coeff * (cvcs[i])->value(); } @@ -984,16 +1191,9 @@ int colvar::calc_cvc_gradients(int first_cvc, size_t num_cvcs) (cvcs[i])->calc_gradients(); // if requested, propagate (via chain rule) the gradients above // to the atoms used to define the roto-translation - // This could be integrated in the CVC base class - for (size_t ig = 0; ig < cvcs[i]->atom_groups.size(); ig++) { - if (cvcs[i]->atom_groups[ig]->b_fit_gradients) - cvcs[i]->atom_groups[ig]->calc_fit_gradients(); - - if (cvcs[i]->is_enabled(f_cvc_debug_gradient)) { - cvm::log("Debugging gradients for " + cvcs[i]->description); - cvcs[i]->debug_gradients(cvcs[i]->atom_groups[ig]); - } - } + (cvcs[i])->calc_fit_gradients(); + if ((cvcs[i])->is_enabled(f_cvc_debug_gradient)) + (cvcs[i])->debug_gradients(); } cvm::decrease_depth(); @@ -1011,13 +1211,6 @@ int colvar::collect_cvc_gradients() size_t i; if (is_enabled(f_cv_collect_gradient)) { - - if (is_enabled(f_cv_scripted)) { - cvm::error("Collecting atomic gradients is not implemented for " - "scripted colvars.", COLVARS_NOT_IMPLEMENTED); - return COLVARS_NOT_IMPLEMENTED; - } - // Collect the atomic gradients inside colvar object for (unsigned int a = 0; a < atomic_gradients.size(); a++) { atomic_gradients[a].reset(); @@ -1214,6 +1407,11 @@ cvm::real colvar::update_forces_energy() // set to zero the applied force f.type(value()); f.reset(); + fr.reset(); + + // If we are not active at this timestep, that's all we have to do + // return with energy == zero + if (!is_enabled(f_cv_active)) return 0.; // add the biases' force, which at this point should already have // been summed over each bias using this colvar @@ -1236,7 +1434,24 @@ cvm::real colvar::update_forces_energy() cvm::log("Updating extended-Lagrangian degree of freedom.\n"); } - cvm::real dt = cvm::dt(); + if (prev_timestep > -1) { + // Keep track of slow timestep to integrate MTS colvars + // the colvar checks the interval after waking up twice + int n_timesteps = cvm::step_relative() - prev_timestep; + if (n_timesteps != 0 && n_timesteps != time_step_factor) { + cvm::error("Error: extended-Lagrangian " + description + " has timeStepFactor " + + cvm::to_str(time_step_factor) + ", but was activated after " + cvm::to_str(n_timesteps) + + " steps at timestep " + cvm::to_str(cvm::step_absolute()) + " (relative step: " + + cvm::to_str(cvm::step_relative()) + ").\n" + + "Make sure that this colvar is requested by biases at multiples of timeStepFactor.\n"); + return 0.; + } + } + prev_timestep = cvm::step_relative(); + + // Integrate with slow timestep (if time_step_factor != 1) + cvm::real dt = cvm::dt() * cvm::real(time_step_factor); + colvarvalue f_ext(fr.type()); // force acting on the extended variable f_ext.reset(); @@ -1248,18 +1463,17 @@ cvm::real colvar::update_forces_energy() // - after this code block, colvar force to be applied to atomic coordinates // ie. spring force (fb_actual will be added just below) fr = f; - f_ext = f + (-0.5 * ext_force_k) * this->dist2_lgrad(xr, x); - f = (-0.5 * ext_force_k) * this->dist2_rgrad(xr, x); + // External force has been scaled for a 1-timestep impulse, scale it back because we will + // integrate it with the colvar's own timestep factor + f_ext = f / cvm::real(time_step_factor); + f_ext += (-0.5 * ext_force_k) * this->dist2_lgrad(xr, x); + f = (-0.5 * ext_force_k) * this->dist2_rgrad(xr, x); + // Coupling force is a slow force, to be applied to atomic coords impulse-style + f *= cvm::real(time_step_factor); - if (is_enabled(f_cv_subtract_applied_force)) { - // Report a "system" force without the biases on this colvar - // that is, just the spring force - ft_reported = (-0.5 * ext_force_k) * this->dist2_lgrad(xr, x); - } else { - // The total force acting on the extended variable is f_ext - // This will be used in the next timestep - ft_reported = f_ext; - } + // The total force acting on the extended variable is f_ext + // This will be used in the next timestep + ft_reported = f_ext; // leapfrog: starting from x_i, f_i, v_(i-1/2) vr += (0.5 * dt) * f_ext / ext_mass; @@ -1279,13 +1493,10 @@ cvm::real colvar::update_forces_energy() if (this->is_enabled(f_cv_periodic)) this->wrap(xr); } - // Now adding the force on the actual colvar (for those biases who + // Now adding the force on the actual colvar (for those biases that // bypass the extended Lagrangian mass) f += fb_actual; - // Store force to be applied, possibly summed over several timesteps - f_accumulated += f; - if (is_enabled(f_cv_fdiff_velocity)) { // set it for the next step x_old = x; @@ -1306,7 +1517,7 @@ void colvar::communicate_forces() size_t i; if (cvm::debug()) { cvm::log("Communicating forces from colvar \""+this->name+"\".\n"); - cvm::log("Force to be applied: " + cvm::to_str(f_accumulated) + "\n"); + cvm::log("Force to be applied: " + cvm::to_str(f) + "\n"); } if (is_enabled(f_cv_scripted)) { @@ -1333,14 +1544,42 @@ void colvar::communicate_forces() if (!cvcs[i]->is_enabled()) continue; // cvc force is colvar force times colvar/cvc Jacobian // (vector-matrix product) - (cvcs[i])->apply_force(colvarvalue(f_accumulated.as_vector() * func_grads[grad_index++], + (cvcs[i])->apply_force(colvarvalue(f.as_vector() * func_grads[grad_index++], cvcs[i]->value().type())); } + +#ifdef LEPTON + } else if (is_enabled(f_cv_custom_function)) { + + size_t r = 0; // index in the vector of variable references + size_t e = 0; // index of the gradient evaluator + + for (size_t i = 0; i < cvcs.size(); i++) { // gradient with respect to cvc i + cvm::matrix2d jacobian (x.size(), cvcs[i]->value().size()); + for (size_t j = 0; j < cvcs[i]->value().size(); j++) { // j-th element + for (size_t c = 0; c < x.size(); c++) { // derivative of scalar element c of the colvarvalue + + // Feed cvc values to the evaluator + for (size_t k = 0; k < cvcs.size(); k++) { // + for (size_t l = 0; l < cvcs[k]->value().size(); l++) { + *(grad_eval_var_refs[r++]) = cvcs[k]->value()[l]; + } + } + jacobian[c][j] = gradient_evaluators[e++]->evaluate(); + } + } + // cvc force is colvar force times colvar/cvc Jacobian + // (vector-matrix product) + (cvcs[i])->apply_force(colvarvalue(f.as_vector() * jacobian, + cvcs[i]->value().type())); + } +#endif + } else if (x.type() == colvarvalue::type_scalar) { for (i = 0; i < cvcs.size(); i++) { if (!cvcs[i]->is_enabled()) continue; - (cvcs[i])->apply_force(f_accumulated * (cvcs[i])->sup_coeff * + (cvcs[i])->apply_force(f * (cvcs[i])->sup_coeff * cvm::real((cvcs[i])->sup_np) * (std::pow((cvcs[i])->value().real_value, (cvcs[i])->sup_np-1)) ); @@ -1350,14 +1589,10 @@ void colvar::communicate_forces() for (i = 0; i < cvcs.size(); i++) { if (!cvcs[i]->is_enabled()) continue; - (cvcs[i])->apply_force(f_accumulated * (cvcs[i])->sup_coeff); + (cvcs[i])->apply_force(f * (cvcs[i])->sup_coeff); } } - // Accumulated forces have been applied, impulse-style - // Reset to start accumulating again - f_accumulated.reset(); - if (cvm::debug()) cvm::log("Done communicating forces from colvar \""+this->name+"\".\n"); } @@ -1394,7 +1629,7 @@ int colvar::update_cvc_flags() cvm::error("ERROR: All CVCs are disabled for colvar " + this->name +"\n"); return COLVARS_ERROR; } - cvc_flags.resize(0); + cvc_flags.clear(); } return COLVARS_OK; @@ -1744,16 +1979,15 @@ int colvar::write_output_files() cvm::log("Writing acf to file \""+acf_outfile+"\".\n"); cvm::backup_file(acf_outfile.c_str()); - cvm::ofstream acf_os(acf_outfile.c_str()); - if (! acf_os.is_open()) { - cvm::error("Cannot open file \""+acf_outfile+"\".\n", FILE_ERROR); - } - write_acf(acf_os); - acf_os.close(); + std::ostream *acf_os = cvm::proxy->output_stream(acf_outfile); + if (!acf_os) return cvm::get_error(); + write_acf(*acf_os); + cvm::proxy->close_output_stream(acf_outfile); } - if (runave_os.is_open()) { - runave_os.close(); + if (runave_os) { + cvm::proxy->close_output_stream(runave_outfile); + runave_os = NULL; } } return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); @@ -2031,12 +2265,12 @@ void colvar::calc_runave() } runave_variance *= 1.0 / cvm::real(runave_length-1); - runave_os << std::setw(cvm::it_width) << cvm::step_relative() - << " " - << std::setprecision(cvm::cv_prec) << std::setw(cvm::cv_width) - << runave << " " - << std::setprecision(cvm::cv_prec) << std::setw(cvm::cv_width) - << std::sqrt(runave_variance) << "\n"; + *runave_os << std::setw(cvm::it_width) << cvm::step_relative() + << " " + << std::setprecision(cvm::cv_prec) << std::setw(cvm::cv_width) + << runave << " " + << std::setprecision(cvm::cv_prec) << std::setw(cvm::cv_width) + << std::sqrt(runave_variance) << "\n"; } history_add_value(runave_length, *x_history_p, x); diff --git a/lib/colvars/colvar.h b/lib/colvars/colvar.h index 0cbda450b8..6113e1678b 100644 --- a/lib/colvars/colvar.h +++ b/lib/colvars/colvar.h @@ -19,6 +19,9 @@ #include "colvarparse.h" #include "colvardeps.h" +#ifdef LEPTON +#include "Lepton.h" // for runtime custom expressions +#endif /// \brief A collective variable (main class); to be defined, it needs /// at least one object of a derived class of colvar::cvc; it @@ -89,7 +92,10 @@ public: return cv_features; } - int refresh_deps(); + /// Implements possible actions to be carried out + /// when a given feature is enabled + /// This overloads the base function in colvardeps + void do_feature_side_effects(int id); /// List of biases that depend on this colvar std::vector biases; @@ -235,6 +241,9 @@ public: /// Parse the CVC configuration and allocate their data int init_components(std::string const &conf); + /// Parse parameters for custom function with Lepton + int init_custom_function(std::string const &conf); + /// Init defaults for grid options int init_grid_parameters(std::string const &conf); @@ -334,24 +343,13 @@ protected: /// Sum of square coefficients for active cvcs cvm::real active_cvc_square_norm; - /// Time step multiplier (for coarse-time-step colvars) - /// Colvar will only be calculated at those times; biases may ignore the information and - /// always update their own forces (which is typically inexpensive) especially if - /// they rely on other colvars. In this case, the colvar will accumulate forces applied between - /// colvar updates. Alternately they may use it to calculate "impulse" biasing - /// forces at longer intervals. Impulse forces must be multiplied by the timestep factor. - int time_step_factor; - - /// Biasing force collected between updates, to be applied at next update for coarse-time-step colvars - colvarvalue f_accumulated; + /// \brief Absolute timestep number when this colvar was last updated + int prev_timestep; public: /// \brief Return the number of CVC objects with an active flag (as set by update_cvc_flags) inline size_t num_active_cvcs() const { return n_active_cvcs; } - /// \brief returns time_step_factor - inline int get_time_step_factor() const {return time_step_factor;} - /// \brief Use the internal metrics (as from \link cvc /// \endlink objects) to calculate square distances and gradients /// @@ -484,7 +482,9 @@ protected: /// Timesteps to skip between two values in the running average series size_t runave_stride; /// Name of the file to write the running average - cvm::ofstream runave_os; + std::string runave_outfile; + /// File to write the running average + std::ostream *runave_os; /// Current value of the running average colvarvalue runave; /// Current value of the square deviation from the running average @@ -508,6 +508,8 @@ public: class distance; class distance_z; class distance_xy; + class polar_theta; + class polar_phi; class distance_inv; class distance_pairs; class angle; @@ -556,6 +558,21 @@ private: /// when using scriptedFunction std::vector sorted_cvc_values; +#ifdef LEPTON + /// Vector of evaluators for custom functions using Lepton + std::vector value_evaluators; + + /// Vector of evaluators for gradients of custom functions + std::vector gradient_evaluators; + + /// Vector of references to cvc values to be passed to Lepton evaluators + std::vector value_eval_var_refs; + std::vector grad_eval_var_refs; + + /// Unused value that is written to when a variable simplifies out of a Lepton expression + double dev_null; +#endif + public: /// \brief Sorted array of (zero-based) IDs for all atoms involved std::vector atom_ids; diff --git a/lib/colvars/colvaratoms.cpp b/lib/colvars/colvaratoms.cpp index 32cfadf3b6..9b4a922e3f 100644 --- a/lib/colvars/colvaratoms.cpp +++ b/lib/colvars/colvaratoms.cpp @@ -67,18 +67,16 @@ cvm::atom::~atom() -// TODO change this arrangement -// Note: "conf" is the configuration of the cvc who is using this atom group; -// "key" is the name of the atom group (e.g. "atoms", "group1", "group2", ...) -cvm::atom_group::atom_group(std::string const &conf, - char const *key_in) +cvm::atom_group::atom_group() +{ + init(); +} + + +cvm::atom_group::atom_group(char const *key_in) { key = key_in; - cvm::log("Defining atom group \"" + key + "\".\n"); init(); - // real work is done by parse - parse(conf); - setup(); } @@ -90,12 +88,6 @@ cvm::atom_group::atom_group(std::vector const &atoms_in) } -cvm::atom_group::atom_group() -{ - init(); -} - - cvm::atom_group::~atom_group() { if (is_enabled(f_ag_scalable) && !b_dummy) { @@ -180,7 +172,7 @@ int cvm::atom_group::init() { if (!key.size()) key = "unnamed"; description = "atom group " + key; - // These will be overwritten by parse(), if initializing from a config string + // These may be overwritten by parse(), if a name is provided atoms.clear(); @@ -193,7 +185,6 @@ int cvm::atom_group::init() b_center = false; b_rotate = false; b_user_defined_fit = false; - b_fit_gradients = false; fitting_group = NULL; noforce = false; @@ -265,34 +256,10 @@ void cvm::atom_group::update_total_charge() } -int cvm::atom_group::parse(std::string const &conf) +int cvm::atom_group::parse(std::string const &group_conf) { - std::string group_conf; - - // TODO move this to the cvc class constructor/init - - // save_delimiters is set to false for this call, because "conf" is - // not the config string of this group, but of its parent object - // (which has already taken care of the delimiters) - save_delimiters = false; - key_lookup(conf, key.c_str(), group_conf, dummy_pos); - // restoring the normal value, because we do want keywords checked - // inside "group_conf" - save_delimiters = true; - - if (group_conf.size() == 0) { - cvm::error("Error: atom group \""+key+ - "\" is set, but has no definition.\n", - INPUT_ERROR); - return COLVARS_ERROR; - } - - cvm::increase_depth(); - cvm::log("Initializing atom group \""+key+"\".\n"); - description = "atom group " + key; - // whether or not to include messages in the log // colvarparse::Parse_Mode mode = parse_silent; // { @@ -304,10 +271,53 @@ int cvm::atom_group::parse(std::string const &conf) int parse_error = COLVARS_OK; + // Optional group name will let other groups reuse atom definition + if (get_keyval(group_conf, "name", name)) { + if ((cvm::atom_group_by_name(this->name) != NULL) && + (cvm::atom_group_by_name(this->name) != this)) { + cvm::error("Error: this atom group cannot have the same name, \""+this->name+ + "\", as another atom group.\n", + INPUT_ERROR); + return INPUT_ERROR; + } + cvm::main()->register_named_atom_group(this); + description = "atom group " + name; + } + + // We need to know about fitting to decide whether the group is scalable + // and we need to know about scalability before adding atoms + bool b_defined_center = get_keyval(group_conf, "centerReference", b_center, false); + bool b_defined_rotate = get_keyval(group_conf, "rotateReference", b_rotate, false); + // is the user setting explicit options? + b_user_defined_fit = b_defined_center || b_defined_rotate; + + if (is_available(f_ag_scalable_com) && !b_rotate && !b_center) { + enable(f_ag_scalable_com); + enable(f_ag_scalable); + } + + { + std::string atoms_of = ""; + if (get_keyval(group_conf, "atomsOfGroup", atoms_of)) { + atom_group * ag = atom_group_by_name(atoms_of); + if (ag == NULL) { + cvm::error("Error: cannot find atom group with name " + atoms_of + ".\n"); + return COLVARS_ERROR; + } + parse_error |= add_atoms_of_group(ag); + } + } + +// if (get_keyval(group_conf, "copyOfGroup", source)) { +// // Goal: Initialize this as a full copy +// // for this we'll need an atom_group copy constructor +// return COLVARS_OK; +// } + { std::string numbers_conf = ""; size_t pos = 0; - while (key_lookup(group_conf, "atomNumbers", numbers_conf, pos)) { + while (key_lookup(group_conf, "atomNumbers", &numbers_conf, &pos)) { parse_error |= add_atom_numbers(numbers_conf); numbers_conf = ""; } @@ -325,7 +335,7 @@ int cvm::atom_group::parse(std::string const &conf) std::string range_conf = ""; size_t pos = 0; while (key_lookup(group_conf, "atomNumbersRange", - range_conf, pos)) { + &range_conf, &pos)) { parse_error |= add_atom_numbers_range(range_conf); range_conf = ""; } @@ -347,7 +357,7 @@ int cvm::atom_group::parse(std::string const &conf) size_t range_count = 0; psii = psf_segids.begin(); while (key_lookup(group_conf, "atomNameResidueRange", - range_conf, pos)) { + &range_conf, &pos)) { range_count++; if (psf_segids.size() && (range_count > psf_segids.size())) { cvm::error("Error: more instances of \"atomNameResidueRange\" than " @@ -415,14 +425,9 @@ int cvm::atom_group::parse(std::string const &conf) } } - // We need to know the fitting options to decide whether the group is scalable + // Now that atoms are defined we can parse the detailed fitting options parse_error |= parse_fitting_options(group_conf); - if (is_available(f_ag_scalable_com) && !b_rotate && !b_center) { - enable(f_ag_scalable_com); - enable(f_ag_scalable); - } - if (is_enabled(f_ag_scalable) && !b_dummy) { cvm::log("Enabling scalable calculation for group \""+this->key+"\".\n"); index = (cvm::proxy)->init_atom_group(atoms_ids); @@ -431,13 +436,6 @@ int cvm::atom_group::parse(std::string const &conf) bool b_print_atom_ids = false; get_keyval(group_conf, "printAtomIDs", b_print_atom_ids, false, colvarparse::parse_silent); - // TODO move this to colvarparse object - check_keywords(group_conf, key.c_str()); - if (cvm::get_error()) { - cvm::error("Error setting up atom group \""+key+"\"."); - return COLVARS_ERROR; - } - // Calculate all required properties (such as total mass) setup(); @@ -446,7 +444,7 @@ int cvm::atom_group::parse(std::string const &conf) cvm::log("Atom group \""+key+"\" defined, "+ cvm::to_str(atoms_ids.size())+" atoms initialized: total mass = "+ - cvm::to_str(total_mass)+", total charge = "+ + cvm::to_str(total_mass)+", total charge = "+ cvm::to_str(total_charge)+".\n"); if (b_print_atom_ids) { @@ -454,12 +452,41 @@ int cvm::atom_group::parse(std::string const &conf) cvm::log(print_atom_ids()); } - cvm::decrease_depth(); - return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } +int cvm::atom_group::add_atoms_of_group(atom_group const * ag) +{ + std::vector const &source_ids = ag->atoms_ids; + + if (source_ids.size()) { + atoms_ids.reserve(atoms_ids.size()+source_ids.size()); + + if (is_enabled(f_ag_scalable)) { + for (size_t i = 0; i < source_ids.size(); i++) { + add_atom_id(source_ids[i]); + } + } else { + atoms.reserve(atoms.size()+source_ids.size()); + for (size_t i = 0; i < source_ids.size(); i++) { + // We could use the atom copy constructor, but only if the source + // group is not scalable - whereas this works in both cases + // atom constructor expects 1-based atom number + add_atom(cvm::atom(source_ids[i] + 1)); + } + } + + if (cvm::get_error()) return COLVARS_ERROR; + } else { + cvm::error("Error: source atom group contains no atoms\".\n", INPUT_ERROR); + return COLVARS_ERROR; + } + + return COLVARS_OK; +} + + int cvm::atom_group::add_atom_numbers(std::string const &numbers_conf) { std::vector atom_indexes; @@ -629,13 +656,6 @@ std::string const cvm::atom_group::print_atom_ids() const int cvm::atom_group::parse_fitting_options(std::string const &group_conf) { - bool b_defined_center = get_keyval(group_conf, "centerReference", b_center, false); - bool b_defined_rotate = get_keyval(group_conf, "rotateReference", b_rotate, false); - // is the user setting explicit options? - b_user_defined_fit = b_defined_center || b_defined_rotate; - - get_keyval(group_conf, "enableFitGradients", b_fit_gradients, true); - if (b_center || b_rotate) { if (b_dummy) @@ -643,27 +663,31 @@ int cvm::atom_group::parse_fitting_options(std::string const &group_conf) "cannot be defined for a dummy atom.\n"); bool b_ref_pos_group = false; - if (key_lookup(group_conf, "refPositionsGroup")) { + std::string fitting_group_conf; + if (key_lookup(group_conf, "refPositionsGroup", &fitting_group_conf)) { b_ref_pos_group = true; cvm::log("Warning: keyword \"refPositionsGroup\" is deprecated: please use \"fittingGroup\" instead.\n"); } - if (b_ref_pos_group || key_lookup(group_conf, "fittingGroup")) { + if (b_ref_pos_group || key_lookup(group_conf, "fittingGroup", &fitting_group_conf)) { // instead of this group, define another group to compute the fit if (fitting_group) { cvm::error("Error: the atom group \""+ key+"\" has already a reference group " "for the rototranslational fit, which was communicated by the " "colvar component. You should not use fittingGroup " - "in this case.\n"); + "in this case.\n", INPUT_ERROR); + return INPUT_ERROR; } cvm::log("Within atom group \""+key+"\":\n"); - fitting_group = b_ref_pos_group ? - new atom_group(group_conf, "refPositionsGroup") : - new atom_group(group_conf, "fittingGroup"); - - // regardless of the configuration, fit gradients must be calculated by fittingGroup - fitting_group->b_fit_gradients = this->b_fit_gradients; + fitting_group = new atom_group("fittingGroup"); + if (fitting_group->parse(fitting_group_conf) == COLVARS_OK) { + fitting_group->check_keywords(fitting_group_conf, "fittingGroup"); + if (cvm::get_error()) { + cvm::error("Error setting up atom group \"fittingGroup\".", INPUT_ERROR); + return INPUT_ERROR; + } + } } atom_group *group_for_fit = fitting_group ? fitting_group : this; @@ -720,11 +744,6 @@ int cvm::atom_group::parse_fitting_options(std::string const &group_conf) return COLVARS_ERROR; } - if (b_fit_gradients) { - group_for_fit->fit_gradients.assign(group_for_fit->size(), cvm::atom_pos(0.0, 0.0, 0.0)); - rot.request_group1_gradients(group_for_fit->size()); - } - if (b_rotate && !noforce) { cvm::log("Warning: atom group \""+key+ "\" will be aligned to a fixed orientation given by the reference positions provided. " @@ -737,10 +756,37 @@ int cvm::atom_group::parse_fitting_options(std::string const &group_conf) } } + // Enable fit gradient calculation only if necessary, and not disabled by the user + // This must happen after fitting group is defined so that side-effects are performed + // properly (ie. allocating fitting group gradients) + { + bool b_fit_gradients; + get_keyval(group_conf, "enableFitGradients", b_fit_gradients, true); + + if (b_fit_gradients && (b_center || b_rotate)) { + enable(f_ag_fit_gradients); + } + } + return COLVARS_OK; } +void cvm::atom_group::do_feature_side_effects(int id) +{ + // If enabled features are changed upstream, the features below should be refreshed + switch (id) { + case f_ag_fit_gradients: + if (b_center || b_rotate) { + atom_group *group_for_fit = fitting_group ? fitting_group : this; + group_for_fit->fit_gradients.assign(group_for_fit->size(), cvm::atom_pos(0.0, 0.0, 0.0)); + rot.request_group1_gradients(group_for_fit->size()); + } + break; + } +} + + int cvm::atom_group::create_sorted_ids(void) { // Only do the work if the vector is not yet populated @@ -1000,12 +1046,12 @@ void cvm::atom_group::set_weighted_gradient(cvm::rvector const &grad) void cvm::atom_group::calc_fit_gradients() { - if (b_dummy) return; + if (b_dummy || ! is_enabled(f_ag_fit_gradients)) return; if (cvm::debug()) cvm::log("Calculating fit gradients.\n"); - atom_group *group_for_fit = fitting_group ? fitting_group : this; + cvm::atom_group *group_for_fit = fitting_group ? fitting_group : this; if (b_center) { // add the center of geometry contribution to the gradients @@ -1190,7 +1236,7 @@ void cvm::atom_group::apply_colvar_force(cvm::real const &force) } } - if ((b_center || b_rotate) && b_fit_gradients) { + if ((b_center || b_rotate) && is_enabled(f_ag_fit_gradients)) { atom_group *group_for_fit = fitting_group ? fitting_group : this; diff --git a/lib/colvars/colvaratoms.h b/lib/colvars/colvaratoms.h index 85f6212951..dba2890abc 100644 --- a/lib/colvars/colvaratoms.h +++ b/lib/colvars/colvaratoms.h @@ -150,12 +150,21 @@ class colvarmodule::atom_group { public: - /// \brief Initialize the group by looking up its configuration - /// string in conf and parsing it; this is actually done by parse(), - /// which is a member function so that a group can be initialized - /// also after construction - atom_group(std::string const &conf, - char const *key); + + /// \brief Default constructor + atom_group(); + + /// \brief Create a group object, assign a name to it + atom_group(char const *key); + + /// \brief Initialize the group after a (temporary) vector of atoms + atom_group(std::vector const &atoms_in); + + /// \brief Destructor + ~atom_group(); + + /// \brief Optional name to reuse properties of this in other groups + std::string name; /// \brief Keyword used to define the group // TODO Make this field part of the data structures that link a group to a CVC @@ -172,15 +181,13 @@ public: int parse(std::string const &conf); int add_atom_numbers(std::string const &numbers_conf); + int add_atoms_of_group(atom_group const * ag); int add_index_group(std::string const &index_group_name); int add_atom_numbers_range(std::string const &range_conf); int add_atom_name_residue_range(std::string const &psf_segid, std::string const &range_conf); int parse_fitting_options(std::string const &group_conf); - /// \brief Initialize the group after a (temporary) vector of atoms - atom_group(std::vector const &atoms_in); - /// \brief Add an atom object to this group int add_atom(cvm::atom const &a); @@ -203,12 +210,6 @@ public: return ag_features; } - /// \brief Default constructor - atom_group(); - - /// \brief Destructor - ~atom_group(); - protected: /// \brief Array of atom objects @@ -294,10 +295,6 @@ public: /// cvc's (eg rmsd, eigenvector) will not override the user's choice bool b_user_defined_fit; - /// \brief Whether or not the derivatives of the roto-translation - /// should be included when calculating the colvar's gradients (default: yes) - bool b_fit_gradients; - /// \brief use reference coordinates for b_center or b_rotate std::vector ref_pos; @@ -464,6 +461,10 @@ public: /// apply_colvar_force() once that is implemented for non-scalar values void apply_force(cvm::rvector const &force); + /// Implements possible actions to be carried out + /// when a given feature is enabled + /// This overloads the base function in colvardeps + void do_feature_side_effects(int id); }; diff --git a/lib/colvars/colvarbias.cpp b/lib/colvars/colvarbias.cpp index 3779c82aa3..e437466be9 100644 --- a/lib/colvars/colvarbias.cpp +++ b/lib/colvars/colvarbias.cpp @@ -23,9 +23,7 @@ colvarbias::colvarbias(char const *key) b_output_energy = false; reset(); state_file_step = 0; - - // Start in active state by default - enable(f_cvb_active); + description = "uninitialized " + cvm::to_str(key) + " bias"; } @@ -74,7 +72,6 @@ int colvarbias::init(std::string const &conf) cvm::error("Error: no collective variables specified.\n", INPUT_ERROR); return INPUT_ERROR; } - } else { cvm::log("Reinitializing bias \""+name+"\".\n"); } @@ -83,6 +80,16 @@ int colvarbias::init(std::string const &conf) get_keyval(conf, "outputEnergy", b_output_energy, b_output_energy); + get_keyval(conf, "timeStepFactor", time_step_factor, 1); + if (time_step_factor < 1) { + cvm::error("Error: timeStepFactor must be 1 or greater.\n"); + return COLVARS_ERROR; + } + + // Now that children are defined, we can solve dependencies + enable(f_cvb_active); + if (cvm::debug()) print_state(); + return COLVARS_OK; } @@ -110,6 +117,8 @@ colvarbias::~colvarbias() int colvarbias::clear() { + free_children_deps(); + // Remove references to this bias from colvars for (std::vector::iterator cvi = colvars.begin(); cvi != colvars.end(); @@ -200,7 +209,12 @@ void colvarbias::communicate_forces() cvm::log("Communicating a force to colvar \""+ variables(i)->name+"\".\n"); } - variables(i)->add_bias_force(colvar_forces[i]); + // Impulse-style multiple timestep + // Note that biases with different values of time_step_factor + // may send forces to the same colvar + // which is why rescaling has to happen now: the colvar is not + // aware of this bias' time_step_factor + variables(i)->add_bias_force(cvm::real(time_step_factor) * colvar_forces[i]); } } diff --git a/lib/colvars/colvarbias.h b/lib/colvars/colvarbias.h index 6d5776d3db..205e761cfc 100644 --- a/lib/colvars/colvarbias.h +++ b/lib/colvars/colvarbias.h @@ -56,7 +56,7 @@ public: /// \brief Compute the energy of the bias with alternative values of the /// collective variables (suitable for bias exchange) - virtual int calc_energy(std::vector const &values = + virtual int calc_energy(std::vector const &values = std::vector(0)) { cvm::error("Error: calc_energy() not implemented.\n", COLVARS_NOT_IMPLEMENTED); diff --git a/lib/colvars/colvarbias_abf.cpp b/lib/colvars/colvarbias_abf.cpp index d039004f09..a96fc21d64 100644 --- a/lib/colvars/colvarbias_abf.cpp +++ b/lib/colvars/colvarbias_abf.cpp @@ -71,10 +71,17 @@ int colvarbias_abf::init(std::string const &conf) // shared ABF get_keyval(conf, "shared", shared_on, false); if (shared_on) { - if (!cvm::replica_enabled() || cvm::replica_num() <= 1) + if (!cvm::replica_enabled() || cvm::replica_num() <= 1) { cvm::error("Error: shared ABF requires more than one replica."); - else - cvm::log("shared ABF will be applied among "+ cvm::to_str(cvm::replica_num()) + " replicas.\n"); + return COLVARS_ERROR; + } + cvm::log("shared ABF will be applied among "+ cvm::to_str(cvm::replica_num()) + " replicas.\n"); + if (cvm::proxy->smp_enabled() == COLVARS_OK) { + cvm::error("Error: shared ABF is currently not available with SMP parallelism; " + "please set \"SMP off\" at the top of the Colvars configuration file.\n", + COLVARS_NOT_IMPLEMENTED); + return COLVARS_NOT_IMPLEMENTED; + } // If shared_freq is not set, we default to output_freq get_keyval(conf, "sharedFreq", shared_freq, output_freq); @@ -84,11 +91,11 @@ int colvarbias_abf::init(std::string const &conf) if (colvars.size() == 0) { cvm::error("Error: no collective variables specified for the ABF bias.\n"); + return COLVARS_ERROR; } if (update_bias) { - // Request calculation of total force (which also checks for availability) - // TODO - change this to a dependency - needs ABF-specific features + // Request calculation of total force if(enable(f_cvb_get_total_force)) return cvm::get_error(); } @@ -108,6 +115,16 @@ int colvarbias_abf::init(std::string const &conf) if (colvars[i]->is_enabled(f_cv_extended_Lagrangian)) b_extended = true; + // Cannot mix and match coarse time steps with ABF because it gives + // wrong total force averages - total force needs to be averaged over + // every time step + if (colvars[i]->get_time_step_factor() != time_step_factor) { + cvm::error("Error: " + colvars[i]->description + " has a value of timeStepFactor (" + + cvm::to_str(colvars[i]->get_time_step_factor()) + ") different from that of " + + description + " (" + cvm::to_str(time_step_factor) + ").\n"); + return COLVARS_ERROR; + } + // Here we could check for orthogonality of the Cartesian coordinates // and make it just a warning if some parameter is set? } @@ -282,12 +299,12 @@ int colvarbias_abf::update() // Compute and apply the new bias, if applicable if (is_enabled(f_cvb_apply_force) && samples->index_ok(bin)) { - size_t count = samples->value(bin); - cvm::real fact = 1.0; + size_t count = samples->value(bin); + cvm::real fact = 1.0; // Factor that ensures smooth introduction of the force if ( count < full_samples ) { - fact = ( count < min_samples) ? 0.0 : + fact = (count < min_samples) ? 0.0 : (cvm::real(count - min_samples)) / (cvm::real(full_samples - min_samples)); } @@ -434,62 +451,57 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app std::string gradients_out_name = prefix + ".grad"; std::ios::openmode mode = (append ? std::ios::app : std::ios::out); - cvm::ofstream samples_os; - cvm::ofstream gradients_os; - - if (!append) cvm::backup_file(samples_out_name.c_str()); - samples_os.open(samples_out_name.c_str(), mode); - if (!samples_os.is_open()) { + std::ostream *samples_os = + cvm::proxy->output_stream(samples_out_name, mode); + if (!samples_os) { cvm::error("Error opening ABF samples file " + samples_out_name + " for writing"); } - samples->write_multicol(samples_os); - samples_os.close(); + samples->write_multicol(*samples_os); + cvm::proxy->close_output_stream(samples_out_name); - if (!append) cvm::backup_file(gradients_out_name.c_str()); - gradients_os.open(gradients_out_name.c_str(), mode); - if (!gradients_os.is_open()) { + std::ostream *gradients_os = + cvm::proxy->output_stream(gradients_out_name, mode); + if (!gradients_os) { cvm::error("Error opening ABF gradient file " + gradients_out_name + " for writing"); } - gradients->write_multicol(gradients_os); - gradients_os.close(); + gradients->write_multicol(*gradients_os); + cvm::proxy->close_output_stream(gradients_out_name); if (colvars.size() == 1) { - std::string pmf_out_name = prefix + ".pmf"; - if (!append) cvm::backup_file(pmf_out_name.c_str()); - cvm::ofstream pmf_os; // Do numerical integration and output a PMF - pmf_os.open(pmf_out_name.c_str(), mode); - if (!pmf_os.is_open()) cvm::error("Error opening pmf file " + pmf_out_name + " for writing"); - gradients->write_1D_integral(pmf_os); - pmf_os << std::endl; - pmf_os.close(); + std::string pmf_out_name = prefix + ".pmf"; + std::ostream *pmf_os = cvm::proxy->output_stream(pmf_out_name, mode); + if (!pmf_os) { + cvm::error("Error opening pmf file " + pmf_out_name + " for writing"); + } + gradients->write_1D_integral(*pmf_os); + *pmf_os << std::endl; + cvm::proxy->close_output_stream(pmf_out_name); } if (z_gradients) { // Write eABF-related quantities std::string z_samples_out_name = prefix + ".zcount"; - cvm::ofstream z_samples_os; - if (!append) cvm::backup_file(z_samples_out_name.c_str()); - z_samples_os.open(z_samples_out_name.c_str(), mode); - if (!z_samples_os.is_open()) { + std::ostream *z_samples_os = + cvm::proxy->output_stream(z_samples_out_name, mode); + if (!z_samples_os) { cvm::error("Error opening eABF z-histogram file " + z_samples_out_name + " for writing"); } - z_samples->write_multicol(z_samples_os); - z_samples_os.close(); + z_samples->write_multicol(*z_samples_os); + cvm::proxy->close_output_stream(z_samples_out_name); if (b_czar_window_file) { std::string z_gradients_out_name = prefix + ".zgrad"; - cvm::ofstream z_gradients_os; - if (!append) cvm::backup_file(z_gradients_out_name.c_str()); - z_gradients_os.open(z_gradients_out_name.c_str(), mode); - if (!z_gradients_os.is_open()) { + std::ostream *z_gradients_os = + cvm::proxy->output_stream(z_gradients_out_name, mode); + if (!z_gradients_os) { cvm::error("Error opening eABF z-gradient file " + z_gradients_out_name + " for writing"); } - z_gradients->write_multicol(z_gradients_os); - z_gradients_os.close(); + z_gradients->write_multicol(*z_gradients_os); + cvm::proxy->close_output_stream(z_gradients_out_name); } // Calculate CZAR estimator of gradients @@ -503,26 +515,24 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app } std::string czar_gradients_out_name = prefix + ".czar.grad"; - cvm::ofstream czar_gradients_os; - if (!append) cvm::backup_file(czar_gradients_out_name.c_str()); - czar_gradients_os.open(czar_gradients_out_name.c_str(), mode); - if (!czar_gradients_os.is_open()) { + std::ostream *czar_gradients_os = + cvm::proxy->output_stream(czar_gradients_out_name, mode); + if (!czar_gradients_os) { cvm::error("Error opening CZAR gradient file " + czar_gradients_out_name + " for writing"); } - czar_gradients->write_multicol(czar_gradients_os); - czar_gradients_os.close(); + czar_gradients->write_multicol(*czar_gradients_os); + cvm::proxy->close_output_stream(czar_gradients_out_name); if (colvars.size() == 1) { - std::string czar_pmf_out_name = prefix + ".czar.pmf"; - if (!append) cvm::backup_file(czar_pmf_out_name.c_str()); - cvm::ofstream czar_pmf_os; // Do numerical integration and output a PMF - czar_pmf_os.open(czar_pmf_out_name.c_str(), mode); - if (!czar_pmf_os.is_open()) cvm::error("Error opening CZAR pmf file " + czar_pmf_out_name + " for writing"); - czar_gradients->write_1D_integral(czar_pmf_os); - czar_pmf_os << std::endl; - czar_pmf_os.close(); + std::string czar_pmf_out_name = prefix + ".czar.pmf"; + std::ostream *czar_pmf_os = + cvm::proxy->output_stream(czar_pmf_out_name, mode); + if (!czar_pmf_os) cvm::error("Error opening CZAR pmf file " + czar_pmf_out_name + " for writing"); + czar_gradients->write_1D_integral(*czar_pmf_os); + *czar_pmf_os << std::endl; + cvm::proxy->close_output_stream(czar_pmf_out_name); } } return; @@ -570,9 +580,13 @@ void colvarbias_abf::read_gradients_samples() is.clear(); is.open(gradients_in_name.c_str()); - if (!is.is_open()) cvm::error("Error opening ABF gradient file " + gradients_in_name + " for reading"); - gradients->read_multicol(is, true); - is.close(); + if (!is.is_open()) { + cvm::error("Error opening ABF gradient file " + + gradients_in_name + " for reading", INPUT_ERROR); + } else { + gradients->read_multicol(is, true); + is.close(); + } if (z_gradients) { // Read eABF z-averaged data for CZAR diff --git a/lib/colvars/colvarbias_alb.cpp b/lib/colvars/colvarbias_alb.cpp index d096ac3daf..124a15c5da 100644 --- a/lib/colvars/colvarbias_alb.cpp +++ b/lib/colvars/colvarbias_alb.cpp @@ -156,8 +156,8 @@ int colvarbias_alb::update() colvars[i], colvar_centers[i]); bias_energy += restraint_potential(restraint_convert_k(current_coupling[i], colvars[i]->width), - colvars[i], - colvar_centers[i]); + colvars[i], + colvar_centers[i]); if (!b_equilibration) { //Welford, West, and Hanso online variance method @@ -169,26 +169,26 @@ int colvarbias_alb::update() } else { //check if we've reached the setpoint if (coupling_rate[i] == 0 || pow(current_coupling[i] - set_coupling[i],2) < pow(coupling_rate[i],2)) { - finished_equil_flag &= 1; //we continue equilibrating as long as we haven't reached all the set points + finished_equil_flag &= 1; //we continue equilibrating as long as we haven't reached all the set points } else { - current_coupling[i] += coupling_rate[i]; - finished_equil_flag = 0; + current_coupling[i] += coupling_rate[i]; + finished_equil_flag = 0; } //update max_coupling_range if (!b_hard_coupling_range && fabs(current_coupling[i]) > max_coupling_range[i]) { - std::ostringstream logStream; - logStream << "Coupling constant for " - << colvars[i]->name - << " has exceeded coupling range of " - << max_coupling_range[i] - << ".\n"; + std::ostringstream logStream; + logStream << "Coupling constant for " + << colvars[i]->name + << " has exceeded coupling range of " + << max_coupling_range[i] + << ".\n"; - max_coupling_range[i] *= 1.25; - logStream << "Expanding coupling range to " << max_coupling_range[i] << ".\n"; - cvm::log(logStream.str()); + max_coupling_range[i] *= 1.25; + logStream << "Expanding coupling range to " << max_coupling_range[i] << ".\n"; + cvm::log(logStream.str()); } @@ -214,23 +214,23 @@ int colvarbias_alb::update() temp = 2. * (means[i] / (static_cast (colvar_centers[i])) - 1) * ssd[i] / (update_calls - 1); if (cvm::temperature() > 0) - step_size = temp / (cvm::temperature() * cvm::boltzmann()); + step_size = temp / (cvm::temperature() * cvm::boltzmann()); else - step_size = temp / cvm::boltzmann(); + step_size = temp / cvm::boltzmann(); means[i] = 0; ssd[i] = 0; //stochastic if we do that update or not if (colvars.size() == 1 || rand() < RAND_MAX / ((int) colvars.size())) { - coupling_accum[i] += step_size * step_size; - current_coupling[i] = set_coupling[i]; - set_coupling[i] += max_coupling_range[i] / sqrt(coupling_accum[i]) * step_size; - coupling_rate[i] = (set_coupling[i] - current_coupling[i]) / update_freq; - //set to the minimum rate and then put the sign back on it - coupling_rate[i] = copysign(fmin(fabs(coupling_rate[i]), max_coupling_rate[i]), coupling_rate[i]); + coupling_accum[i] += step_size * step_size; + current_coupling[i] = set_coupling[i]; + set_coupling[i] += max_coupling_range[i] / sqrt(coupling_accum[i]) * step_size; + coupling_rate[i] = (set_coupling[i] - current_coupling[i]) / update_freq; + //set to the minimum rate and then put the sign back on it + coupling_rate[i] = copysign(fmin(fabs(coupling_rate[i]), max_coupling_rate[i]), coupling_rate[i]); } else { - coupling_rate[i] = 0; + coupling_rate[i] = 0; } } @@ -339,14 +339,14 @@ std::ostream & colvarbias_alb::write_traj_label(std::ostream &os) if (b_output_coupling) for (size_t i = 0; i < current_coupling.size(); i++) { os << " ForceConst_" << i - <name, cvm::cv_width - 4); + << cvm::wrap_string(colvars[i]->name, cvm::cv_width - 4); } if (b_output_centers) @@ -372,8 +372,8 @@ std::ostream & colvarbias_alb::write_traj(std::ostream &os) if (b_output_coupling) for (size_t i = 0; i < current_coupling.size(); i++) { os << " " - << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) - << current_coupling[i]; + << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) + << current_coupling[i]; } @@ -387,8 +387,8 @@ std::ostream & colvarbias_alb::write_traj(std::ostream &os) if (b_output_grad) for (size_t i = 0; i < means.size(); i++) { os << " " - << std::setprecision(cvm::cv_prec) << std::setw(cvm::cv_width) - << -2. * (means[i] / (static_cast (colvar_centers[i])) - 1) * ssd[i] / (fmax(update_calls,2) - 1); + << std::setprecision(cvm::cv_prec) << std::setw(cvm::cv_width) + << -2. * (means[i] / (static_cast (colvar_centers[i])) - 1) * ssd[i] / (fmax(update_calls,2) - 1); } diff --git a/lib/colvars/colvarbias_histogram.cpp b/lib/colvars/colvarbias_histogram.cpp index 502a7455b1..0722e6384d 100644 --- a/lib/colvars/colvarbias_histogram.cpp +++ b/lib/colvars/colvarbias_histogram.cpp @@ -86,8 +86,9 @@ int colvarbias_histogram::init(std::string const &conf) { std::string grid_conf; - if (key_lookup(conf, "histogramGrid", grid_conf)) { + if (key_lookup(conf, "histogramGrid", &grid_conf)) { grid->parse_params(grid_conf); + grid->check_keywords(grid_conf, "histogramGrid"); } } @@ -176,26 +177,27 @@ int colvarbias_histogram::write_output_files() if (out_name.size()) { cvm::log("Writing the histogram file \""+out_name+"\".\n"); cvm::backup_file(out_name.c_str()); - cvm::ofstream grid_os(out_name.c_str()); - if (!grid_os.is_open()) { - cvm::error("Error opening histogram file " + out_name + " for writing.\n", FILE_ERROR); + std::ostream *grid_os = cvm::proxy->output_stream(out_name); + if (!grid_os) { + return cvm::error("Error opening histogram file "+out_name+ + " for writing.\n", FILE_ERROR); } - // TODO add return code here - grid->write_multicol(grid_os); - grid_os.close(); + grid->write_multicol(*grid_os); + cvm::proxy->close_output_stream(out_name); } if (out_name_dx.size()) { cvm::log("Writing the histogram file \""+out_name_dx+"\".\n"); cvm::backup_file(out_name_dx.c_str()); - cvm::ofstream grid_os(out_name_dx.c_str()); - if (!grid_os.is_open()) { - cvm::error("Error opening histogram file " + out_name_dx + " for writing.\n", FILE_ERROR); + std::ostream *grid_os = cvm::proxy->output_stream(out_name_dx); + if (!grid_os) { + return cvm::error("Error opening histogram file "+out_name_dx+ + " for writing.\n", FILE_ERROR); } - // TODO add return code here - grid->write_opendx(grid_os); - grid_os.close(); + grid->write_opendx(*grid_os); + cvm::proxy->close_output_stream(out_name_dx); } + return COLVARS_OK; } diff --git a/lib/colvars/colvarbias_meta.cpp b/lib/colvars/colvarbias_meta.cpp index b0acfe974a..66806fc9fc 100644 --- a/lib/colvars/colvarbias_meta.cpp +++ b/lib/colvars/colvarbias_meta.cpp @@ -36,6 +36,8 @@ colvarbias_meta::colvarbias_meta(char const *key) : colvarbias(key) { new_hills_begin = hills.end(); + hills_traj_os = NULL; + replica_hills_os = NULL; } @@ -163,7 +165,6 @@ int colvarbias_meta::init(std::string const &conf) cvm::log("Done initializing the metadynamics bias \""+this->name+"\""+ ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+".\n"); - save_delimiters = false; return COLVARS_OK; } @@ -239,11 +240,15 @@ colvarbias_meta::~colvarbias_meta() hills_energy_gradients = NULL; } - if (replica_hills_os.is_open()) - replica_hills_os.close(); + if (replica_hills_os) { + cvm::proxy->close_output_stream(replica_hills_file); + replica_hills_os = NULL; + } - if (hills_traj_os.is_open()) - hills_traj_os.close(); + if (hills_traj_os) { + cvm::proxy->close_output_stream(hills_traj_file_name()); + hills_traj_os = NULL; + } if(target_dist) { delete target_dist; @@ -280,9 +285,9 @@ colvarbias_meta::create_hill(colvarbias_meta::hill const &h) } // output to trajectory (if specified) - if (hills_traj_os.is_open()) { - hills_traj_os << (hills.back()).output_traj(); - hills_traj_os.flush(); + if (hills_traj_os) { + *hills_traj_os << (hills.back()).output_traj(); + cvm::proxy->flush_output_stream(hills_traj_os); } has_data = true; @@ -312,12 +317,12 @@ colvarbias_meta::delete_hill(hill_iter &h) } } - if (hills_traj_os.is_open()) { + if (hills_traj_os) { // output to the trajectory - hills_traj_os << "# DELETED this hill: " - << (hills.back()).output_traj() - << "\n"; - hills_traj_os.flush(); + *hills_traj_os << "# DELETED this hill: " + << (hills.back()).output_traj() + << "\n"; + cvm::proxy->flush_output_stream(hills_traj_os); } return hills.erase(h); @@ -501,12 +506,12 @@ int colvarbias_meta::update_bias() case multiple_replicas: create_hill(hill(hill_weight*hills_scale, colvars, hill_width, replica_id)); - if (replica_hills_os.is_open()) { - replica_hills_os << hills.back(); + if (replica_hills_os) { + *replica_hills_os << hills.back(); } else { - cvm::fatal_error("Error: in metadynamics bias \""+this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ - " while writing hills for the other replicas.\n"); + return cvm::error("Error: in metadynamics bias \""+this->name+"\""+ + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ + " while writing hills for the other replicas.\n", FILE_ERROR); } break; } @@ -904,8 +909,9 @@ int colvarbias_meta::replica_share() // reread the replicas registry update_replicas_registry(); // empty the output buffer - if (replica_hills_os.is_open()) - replica_hills_os.flush(); + if (replica_hills_os) { + cvm::proxy->flush_output_stream(replica_hills_os); + } read_replica_files(); } return COLVARS_OK; @@ -1421,7 +1427,7 @@ std::istream & colvarbias_meta::read_hill(std::istream &is) // it is safer to read colvarvalue objects one at a time; // TODO: change this it later std::string centers_input; - key_lookup(data, "centers", centers_input); + key_lookup(data, "centers", ¢ers_input); std::istringstream centers_is(centers_input); for (size_t i = 0; i < num_variables(); i++) { centers_is >> h_centers[i]; @@ -1521,13 +1527,11 @@ int colvarbias_meta::setup_output() // for the others to read // open the "hills" buffer file - if (!replica_hills_os.is_open()) { - cvm::backup_file(replica_hills_file.c_str()); - replica_hills_os.open(replica_hills_file.c_str()); - if (!replica_hills_os.is_open()) - cvm::error("Error: in opening file \""+ - replica_hills_file+"\" for writing.\n", FILE_ERROR); - replica_hills_os.setf(std::ios::scientific, std::ios::floatfield); + if (!replica_hills_os) { + cvm::proxy->backup_file(replica_hills_file); + replica_hills_os = cvm::proxy->output_stream(replica_hills_file); + if (!replica_hills_os) return cvm::get_error(); + replica_hills_os->setf(std::ios::scientific, std::ios::floatfield); } // write the state file (so that there is always one available) @@ -1539,46 +1543,52 @@ int colvarbias_meta::setup_output() // if we're running without grids, use a growing list of "hills" files // otherwise, just one state file and one "hills" file as buffer - std::ofstream list_os(replica_list_file.c_str(), - (use_grids ? std::ios::trunc : std::ios::app)); - if (! list_os.is_open()) - cvm::fatal_error("Error: in opening file \""+ - replica_list_file+"\" for writing.\n"); - list_os << "stateFile " << replica_state_file << "\n"; - list_os << "hillsFile " << replica_hills_file << "\n"; - list_os.close(); + std::ostream *list_os = + cvm::proxy->output_stream(replica_list_file, + (use_grids ? std::ios_base::trunc : + std::ios_base::app)); + if (!list_os) { + return cvm::get_error(); + } + *list_os << "stateFile " << replica_state_file << "\n"; + *list_os << "hillsFile " << replica_hills_file << "\n"; + cvm::proxy->close_output_stream(replica_list_file); - // finally, if add a new record for this replica to the registry + // finally, add a new record for this replica to the registry if (! registered_replica) { - std::ofstream reg_os(replicas_registry_file.c_str(), std::ios::app); - if (! reg_os.is_open()) - cvm::error("Error: in opening file \""+ - replicas_registry_file+"\" for writing.\n", FILE_ERROR); - reg_os << replica_id << " " << replica_list_file << "\n"; - reg_os.close(); + std::ostream *reg_os = + cvm::proxy->output_stream(replicas_registry_file, + std::ios::app); + if (!reg_os) { + return cvm::get_error(); + } + *reg_os << replica_id << " " << replica_list_file << "\n"; + cvm::proxy->close_output_stream(replicas_registry_file); } } if (b_hills_traj) { - std::string const traj_file_name(cvm::output_prefix()+ - ".colvars."+this->name+ - ( (comm != single_replica) ? - ("."+replica_id) : - ("") )+ - ".hills.traj"); - if (!hills_traj_os.is_open()) { - cvm::backup_file(traj_file_name.c_str()); - hills_traj_os.open(traj_file_name.c_str()); + if (!hills_traj_os) { + hills_traj_os = cvm::proxy->output_stream(hills_traj_file_name()); + if (!hills_traj_os) return cvm::get_error(); } - if (!hills_traj_os.is_open()) - cvm::error("Error: in opening hills output file \"" + - traj_file_name+"\".\n", FILE_ERROR); } return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } +std::string const colvarbias_meta::hills_traj_file_name() const +{ + return std::string(cvm::output_prefix()+ + ".colvars."+this->name+ + ( (comm != single_replica) ? + ("."+replica_id) : + ("") )+ + ".hills.traj"); +} + + std::string const colvarbias_meta::get_state_params() const { std::ostringstream os; @@ -1671,12 +1681,13 @@ void colvarbias_meta::write_pmf() (dump_fes_save ? "."+cvm::to_str(cvm::step_absolute()) : "") + ".pmf"); - cvm::backup_file(fes_file_name.c_str()); - cvm::ofstream fes_os(fes_file_name.c_str()); - pmf->write_multicol(fes_os); - fes_os.close(); + cvm::proxy->backup_file(fes_file_name); + std::ostream *fes_os = cvm::proxy->output_stream(fes_file_name); + pmf->write_multicol(*fes_os); + cvm::proxy->close_output_stream(fes_file_name); } } + if (comm != single_replica) { // output the combined PMF from all replicas pmf->reset(); @@ -1695,10 +1706,10 @@ void colvarbias_meta::write_pmf() (dump_fes_save ? "."+cvm::to_str(cvm::step_absolute()) : "") + ".pmf"); - cvm::backup_file(fes_file_name.c_str()); - cvm::ofstream fes_os(fes_file_name.c_str()); - pmf->write_multicol(fes_os); - fes_os.close(); + cvm::proxy->backup_file(fes_file_name); + std::ostream *fes_os = cvm::proxy->output_stream(fes_file_name); + pmf->write_multicol(*fes_os); + cvm::proxy->close_output_stream(fes_file_name); } delete pmf; @@ -1769,13 +1780,11 @@ int colvarbias_meta::write_replica_state_file() // rep_state_os.close(); // reopen the hills file - replica_hills_os.close(); - cvm::backup_file(replica_hills_file.c_str()); - replica_hills_os.open(replica_hills_file.c_str()); - if (!replica_hills_os.is_open()) - cvm::fatal_error("Error: in opening file \""+ - replica_hills_file+"\" for writing.\n"); - replica_hills_os.setf(std::ios::scientific, std::ios::floatfield); + cvm::proxy->close_output_stream(replica_hills_file); + cvm::proxy->backup_file(replica_hills_file); + replica_hills_os = cvm::proxy->output_stream(replica_hills_file); + if (!replica_hills_os) return cvm::get_error(); + replica_hills_os->setf(std::ios::scientific, std::ios::floatfield); return COLVARS_OK; } diff --git a/lib/colvars/colvarbias_meta.h b/lib/colvars/colvarbias_meta.h index 01921eaf64..249f7342bc 100644 --- a/lib/colvars/colvarbias_meta.h +++ b/lib/colvars/colvarbias_meta.h @@ -78,7 +78,10 @@ protected: /// Write the hill logfile bool b_hills_traj; /// Logfile of hill management (creation and deletion) - cvm::ofstream hills_traj_os; + std::ostream *hills_traj_os; + + /// Name of the hill logfile + std::string const hills_traj_file_name() const; /// \brief List of hills used on this bias (total); if a grid is /// employed, these don't need to be updated at every time step @@ -241,7 +244,7 @@ protected: std::string replica_hills_file; /// \brief Output stream corresponding to replica_hills_file - cvm::ofstream replica_hills_os; + std::ostream *replica_hills_os; /// Position within replica_hills_file (when reading it) int replica_hills_file_pos; diff --git a/lib/colvars/colvarbias_restraint.cpp b/lib/colvars/colvarbias_restraint.cpp index 159d9eae64..bb6d6164e5 100644 --- a/lib/colvars/colvarbias_restraint.cpp +++ b/lib/colvars/colvarbias_restraint.cpp @@ -853,6 +853,21 @@ int colvarbias_restraint_harmonic_walls::init(std::string const &conf) get_keyval(conf, "upperWallConstant", upper_wall_k, (upper_wall_k > 0.0) ? upper_wall_k : force_k); + if (lower_wall_k * upper_wall_k > 0.0) { + for (size_t i = 0; i < num_variables(); i++) { + if (variables(i)->width != 1.0) + cvm::log("The lower and upper wall force constants for colvar \""+ + variables(i)->name+ + "\" will be rescaled to "+ + cvm::to_str(lower_wall_k / + (variables(i)->width * variables(i)->width))+ + " and "+ + cvm::to_str(upper_wall_k / + (variables(i)->width * variables(i)->width))+ + " according to the specified width.\n"); + } + } + enable(f_cvb_scalar_variables); size_t i; @@ -869,7 +884,7 @@ int colvarbias_restraint_harmonic_walls::init(std::string const &conf) if (!get_keyval(conf, "lowerWalls", lower_walls, lower_walls) && b_null_lower_walls) { cvm::log("Lower walls were not provided.\n"); - lower_walls.resize(0); + lower_walls.clear(); } bool b_null_upper_walls = false; @@ -884,7 +899,7 @@ int colvarbias_restraint_harmonic_walls::init(std::string const &conf) if (!get_keyval(conf, "upperWalls", upper_walls, upper_walls) && b_null_upper_walls) { cvm::log("Upper walls were not provided.\n"); - upper_walls.resize(0); + upper_walls.clear(); } if ((lower_walls.size() == 0) && (upper_walls.size() == 0)) { @@ -954,7 +969,8 @@ void colvarbias_restraint_harmonic_walls::communicate_forces() cvm::log("Communicating a force to colvar \""+ variables(i)->name+"\".\n"); } - variables(i)->add_bias_force_actual_value(colvar_forces[i]); + // Impulse-style multiple timestep + variables(i)->add_bias_force_actual_value(cvm::real(time_step_factor) * colvar_forces[i]); } } @@ -1282,9 +1298,9 @@ int colvarbias_restraint_histogram::init(std::string const &conf) colvarbias_restraint_histogram::~colvarbias_restraint_histogram() { - p.resize(0); - ref_p.resize(0); - p_diff.resize(0); + p.clear(); + ref_p.clear(); + p_diff.clear(); } @@ -1382,23 +1398,23 @@ std::ostream & colvarbias_restraint_histogram::write_restart(std::ostream &os) { if (b_write_histogram) { std::string file_name(cvm::output_prefix()+"."+this->name+".hist.dat"); - std::ofstream os(file_name.c_str()); - os << "# " << cvm::wrap_string(variables(0)->name, cvm::cv_width) - << " " << "p(" << cvm::wrap_string(variables(0)->name, cvm::cv_width-3) - << ")\n"; + std::ostream *os = cvm::proxy->output_stream(file_name); + *os << "# " << cvm::wrap_string(variables(0)->name, cvm::cv_width) + << " " << "p(" << cvm::wrap_string(variables(0)->name, cvm::cv_width-3) + << ")\n"; size_t igrid; for (igrid = 0; igrid < p.size(); igrid++) { cvm::real const x_grid = (lower_boundary + (igrid+1)*width); - os << " " - << std::setprecision(cvm::cv_prec) - << std::setw(cvm::cv_width) - << x_grid - << " " - << std::setprecision(cvm::cv_prec) - << std::setw(cvm::cv_width) - << p[igrid] << "\n"; + *os << " " + << std::setprecision(cvm::cv_prec) + << std::setw(cvm::cv_width) + << x_grid + << " " + << std::setprecision(cvm::cv_prec) + << std::setw(cvm::cv_width) + << p[igrid] << "\n"; } - os.close(); + cvm::proxy->close_output_stream(file_name); } return os; } diff --git a/lib/colvars/colvarcomp.cpp b/lib/colvars/colvarcomp.cpp index 786bc032d2..589de1d32a 100644 --- a/lib/colvars/colvarcomp.cpp +++ b/lib/colvars/colvarcomp.cpp @@ -51,6 +51,17 @@ colvar::cvc::cvc(std::string const &conf) get_keyval_feature((colvarparse *)this, conf, "debugGradients", f_cvc_debug_gradient, false, parse_silent); + { + bool b_no_PBC = false; + get_keyval(conf, "forceNoPBC", b_no_PBC, false); + if (b_no_PBC) { + disable(f_cvc_pbc_minimum_image); + } else { + enable(f_cvc_pbc_minimum_image); + } + // this does not use get_keyval_feature() only for backward compatibility + } + // Attempt scalable calculations when in parallel? (By default yes, if available) get_keyval(conf, "scalable", b_try_scalable, true); @@ -94,13 +105,15 @@ cvm::atom_group *colvar::cvc::parse_group(std::string const &conf, bool optional) { cvm::atom_group *group = NULL; + std::string group_conf; - if (key_lookup(conf, group_key)) { - group = new cvm::atom_group; - group->key = group_key; + if (key_lookup(conf, group_key, &group_conf)) { + group = new cvm::atom_group(group_key); if (b_try_scalable) { - if (is_available(f_cvc_scalable_com) && is_enabled(f_cvc_com_based)) { + if (is_available(f_cvc_scalable_com) + && is_enabled(f_cvc_com_based) + && !is_enabled(f_cvc_debug_gradient)) { enable(f_cvc_scalable_com); enable(f_cvc_scalable); // The CVC makes the feature available; @@ -111,44 +124,51 @@ cvm::atom_group *colvar::cvc::parse_group(std::string const &conf, // TODO check for other types of parallelism here } - if (group->parse(conf) == COLVARS_OK) { - atom_groups.push_back(group); - } else { - cvm::error("Error parsing definition for atom group \""+ - std::string(group_key)+"\".\n"); + if (group_conf.size() == 0) { + cvm::error("Error: atom group \""+group->key+ + "\" is set, but has no definition.\n", + INPUT_ERROR); + return group; } + + cvm::increase_depth(); + if (group->parse(group_conf) == COLVARS_OK) { + register_atom_group(group); + } + group->check_keywords(group_conf, group_key); + if (cvm::get_error()) { + cvm::error("Error parsing definition for atom group \""+ + std::string(group_key)+"\"\n.", INPUT_ERROR); + } + cvm::decrease_depth(); + } else { if (! optional) { cvm::error("Error: definition for atom group \""+ - std::string(group_key)+"\" not found.\n"); + std::string(group_key)+"\" not found.\n"); } } + return group; } int colvar::cvc::setup() { - size_t i; description = "cvc " + name; - - for (i = 0; i < atom_groups.size(); i++) { - add_child((colvardeps *) atom_groups[i]); - } - return COLVARS_OK; } colvar::cvc::~cvc() { + free_children_deps(); remove_all_children(); for (size_t i = 0; i < atom_groups.size(); i++) { if (atom_groups[i] != NULL) delete atom_groups[i]; } } - void colvar::cvc::read_data() { size_t ig; @@ -187,117 +207,129 @@ void colvar::cvc::calc_Jacobian_derivative() } -void colvar::cvc::debug_gradients(cvm::atom_group *group) +void colvar::cvc::calc_fit_gradients() { - // this function should work for any scalar variable: + for (size_t ig = 0; ig < atom_groups.size(); ig++) { + atom_groups[ig]->calc_fit_gradients(); + } +} + + +void colvar::cvc::debug_gradients() +{ + // this function should work for any scalar cvc: // the only difference will be the name of the atom group (here, "group") // NOTE: this assumes that groups for this cvc are non-overlapping, // since atom coordinates are modified only within the current group - if (group->b_dummy) return; + cvm::log("Debugging gradients for " + description); - cvm::rotation const rot_0 = group->rot; - cvm::rotation const rot_inv = group->rot.inverse(); + for (size_t ig = 0; ig < atom_groups.size(); ig++) { + cvm::atom_group *group = atom_groups[ig]; + if (group->b_dummy) continue; - cvm::real x_0 = x.real_value; - if ((x.type() == colvarvalue::type_vector) && (x.size() == 1)) x_0 = x[0]; + cvm::rotation const rot_0 = group->rot; + cvm::rotation const rot_inv = group->rot.inverse(); - // cvm::log("gradients = "+cvm::to_str (gradients)+"\n"); + cvm::real x_0 = x.real_value; + if ((x.type() == colvarvalue::type_vector) && (x.size() == 1)) x_0 = x[0]; - cvm::atom_group *group_for_fit = group->fitting_group ? group->fitting_group : group; - cvm::atom_pos fit_gradient_sum, gradient_sum; + // cvm::log("gradients = "+cvm::to_str (gradients)+"\n"); - // print the values of the fit gradients - if (group->b_rotate || group->b_center) { - if (group->b_fit_gradients) { - size_t j; + cvm::atom_group *group_for_fit = group->fitting_group ? group->fitting_group : group; + cvm::atom_pos fit_gradient_sum, gradient_sum; - // fit_gradients are in the simulation frame: we should print them in the rotated frame - cvm::log("Fit gradients:\n"); - for (j = 0; j < group_for_fit->fit_gradients.size(); j++) { - cvm::log((group->fitting_group ? std::string("refPosGroup") : group->key) + - "[" + cvm::to_str(j) + "] = " + - (group->b_rotate ? - cvm::to_str(rot_0.rotate(group_for_fit->fit_gradients[j])) : - cvm::to_str(group_for_fit->fit_gradients[j]))); + // print the values of the fit gradients + if (group->b_rotate || group->b_center) { + if (group->is_enabled(f_ag_fit_gradients)) { + size_t j; + + // fit_gradients are in the simulation frame: we should print them in the rotated frame + cvm::log("Fit gradients:\n"); + for (j = 0; j < group_for_fit->fit_gradients.size(); j++) { + cvm::log((group->fitting_group ? std::string("refPosGroup") : group->key) + + "[" + cvm::to_str(j) + "] = " + + (group->b_rotate ? + cvm::to_str(rot_0.rotate(group_for_fit->fit_gradients[j])) : + cvm::to_str(group_for_fit->fit_gradients[j]))); + } } } - } - // debug the gradients - for (size_t ia = 0; ia < group->size(); ia++) { + // debug the gradients + for (size_t ia = 0; ia < group->size(); ia++) { - // tests are best conducted in the unrotated (simulation) frame - cvm::rvector const atom_grad = (group->b_rotate ? - rot_inv.rotate((*group)[ia].grad) : - (*group)[ia].grad); - gradient_sum += atom_grad; - - for (size_t id = 0; id < 3; id++) { - // (re)read original positions - group->read_positions(); - // change one coordinate - (*group)[ia].pos[id] += cvm::debug_gradients_step_size; - group->calc_required_properties(); - calc_value(); - cvm::real x_1 = x.real_value; - if ((x.type() == colvarvalue::type_vector) && (x.size() == 1)) x_1 = x[0]; - cvm::log("Atom "+cvm::to_str(ia)+", component "+cvm::to_str(id)+":\n"); - cvm::log("dx(actual) = "+cvm::to_str(x_1 - x_0, - 21, 14)+"\n"); - cvm::real const dx_pred = (group->fit_gradients.size()) ? - (cvm::debug_gradients_step_size * (atom_grad[id] + group->fit_gradients[ia][id])) : - (cvm::debug_gradients_step_size * atom_grad[id]); - cvm::log("dx(interp) = "+cvm::to_str(dx_pred, - 21, 14)+"\n"); - cvm::log("|dx(actual) - dx(interp)|/|dx(actual)| = "+ - cvm::to_str(std::fabs(x_1 - x_0 - dx_pred) / - std::fabs(x_1 - x_0), 12, 5)+"\n"); - } - } - - if ((group->b_fit_gradients) && (group->fitting_group != NULL)) { - cvm::atom_group *ref_group = group->fitting_group; - group->read_positions(); - group->calc_required_properties(); - - for (size_t ia = 0; ia < ref_group->size(); ia++) { - - // fit gradients are in the unrotated (simulation) frame - cvm::rvector const atom_grad = ref_group->fit_gradients[ia]; - fit_gradient_sum += atom_grad; + // tests are best conducted in the unrotated (simulation) frame + cvm::rvector const atom_grad = (group->b_rotate ? + rot_inv.rotate((*group)[ia].grad) : + (*group)[ia].grad); + gradient_sum += atom_grad; for (size_t id = 0; id < 3; id++) { // (re)read original positions group->read_positions(); - ref_group->read_positions(); // change one coordinate - (*ref_group)[ia].pos[id] += cvm::debug_gradients_step_size; + (*group)[ia].pos[id] += cvm::debug_gradients_step_size; group->calc_required_properties(); calc_value(); - - cvm::real const x_1 = x.real_value; - cvm::log("refPosGroup atom "+cvm::to_str(ia)+", component "+cvm::to_str (id)+":\n"); - cvm::log("dx(actual) = "+cvm::to_str (x_1 - x_0, - 21, 14)+"\n"); - - cvm::real const dx_pred = cvm::debug_gradients_step_size * atom_grad[id]; - - cvm::log("dx(interp) = "+cvm::to_str (dx_pred, - 21, 14)+"\n"); - cvm::log ("|dx(actual) - dx(interp)|/|dx(actual)| = "+ - cvm::to_str(std::fabs (x_1 - x_0 - dx_pred) / - std::fabs (x_1 - x_0), - 12, 5)+ - ".\n"); + cvm::real x_1 = x.real_value; + if ((x.type() == colvarvalue::type_vector) && (x.size() == 1)) x_1 = x[0]; + cvm::log("Atom "+cvm::to_str(ia)+", component "+cvm::to_str(id)+":\n"); + cvm::log("dx(actual) = "+cvm::to_str(x_1 - x_0, + 21, 14)+"\n"); + cvm::real const dx_pred = (group->fit_gradients.size()) ? + (cvm::debug_gradients_step_size * (atom_grad[id] + group->fit_gradients[ia][id])) : + (cvm::debug_gradients_step_size * atom_grad[id]); + cvm::log("dx(interp) = "+cvm::to_str(dx_pred, + 21, 14)+"\n"); + cvm::log("|dx(actual) - dx(interp)|/|dx(actual)| = "+ + cvm::to_str(std::fabs(x_1 - x_0 - dx_pred) / + std::fabs(x_1 - x_0), 12, 5)+"\n"); } } + + if ((group->is_enabled(f_ag_fit_gradients)) && (group->fitting_group != NULL)) { + cvm::atom_group *ref_group = group->fitting_group; + group->read_positions(); + group->calc_required_properties(); + + for (size_t ia = 0; ia < ref_group->size(); ia++) { + + // fit gradients are in the unrotated (simulation) frame + cvm::rvector const atom_grad = ref_group->fit_gradients[ia]; + fit_gradient_sum += atom_grad; + + for (size_t id = 0; id < 3; id++) { + // (re)read original positions + group->read_positions(); + ref_group->read_positions(); + // change one coordinate + (*ref_group)[ia].pos[id] += cvm::debug_gradients_step_size; + group->calc_required_properties(); + calc_value(); + + cvm::real const x_1 = x.real_value; + cvm::log("refPosGroup atom "+cvm::to_str(ia)+", component "+cvm::to_str (id)+":\n"); + cvm::log("dx(actual) = "+cvm::to_str (x_1 - x_0, + 21, 14)+"\n"); + + cvm::real const dx_pred = cvm::debug_gradients_step_size * atom_grad[id]; + + cvm::log("dx(interp) = "+cvm::to_str (dx_pred, + 21, 14)+"\n"); + cvm::log ("|dx(actual) - dx(interp)|/|dx(actual)| = "+ + cvm::to_str(std::fabs (x_1 - x_0 - dx_pred) / + std::fabs (x_1 - x_0), + 12, 5)+ + ".\n"); + } + } + } + + cvm::log("Gradient sum: " + cvm::to_str(gradient_sum) + + " Fit gradient sum: " + cvm::to_str(fit_gradient_sum) + + " Total " + cvm::to_str(gradient_sum + fit_gradient_sum)); } - - cvm::log("Gradient sum: " + cvm::to_str(gradient_sum) + - " Fit gradient sum: " + cvm::to_str(fit_gradient_sum) + - " Total " + cvm::to_str(gradient_sum + fit_gradient_sum)); - return; } diff --git a/lib/colvars/colvarcomp.h b/lib/colvars/colvarcomp.h index ec215cbad1..2c865a166b 100644 --- a/lib/colvars/colvarcomp.h +++ b/lib/colvars/colvarcomp.h @@ -146,8 +146,11 @@ public: /// order to apply forces virtual void calc_gradients() = 0; + /// \brief Calculate the atomic fit gradients + void calc_fit_gradients(); + /// \brief Calculate finite-difference gradients alongside the analytical ones, for each Cartesian component - virtual void debug_gradients(cvm::atom_group *group); + virtual void debug_gradients(); /// \brief Calculate the total force from the system using the /// inverse atomic gradients @@ -228,6 +231,12 @@ public: /// e.g. atomic gradients std::vector atom_groups; + /// \brief Store a pointer to new atom group, and list as child for dependencies + inline void register_atom_group(cvm::atom_group *ag) { + atom_groups.push_back(ag); + add_child((colvardeps *) ag); + } + /// \brief Whether or not this CVC will be computed in parallel whenever possible bool b_try_scalable; @@ -427,15 +436,77 @@ public: }; +/// \brief Colvar component: polar coordinate phi of a group +/// (colvarvalue::type_scalar type, range [-180:180]) +class colvar::polar_phi + : public colvar::cvc +{ +public: + polar_phi(std::string const &conf); + polar_phi(); + virtual ~polar_phi() {} +protected: + cvm::atom_group *atoms; + cvm::real r, theta, phi; +public: + virtual void calc_value(); + virtual void calc_gradients(); + virtual void apply_force(colvarvalue const &force); + /// Redefined to handle the 2*PI periodicity + virtual cvm::real dist2(colvarvalue const &x1, + colvarvalue const &x2) const; + /// Redefined to handle the 2*PI periodicity + virtual colvarvalue dist2_lgrad(colvarvalue const &x1, + colvarvalue const &x2) const; + /// Redefined to handle the 2*PI periodicity + virtual colvarvalue dist2_rgrad(colvarvalue const &x1, + colvarvalue const &x2) const; + /// Redefined to handle the 2*PI periodicity + virtual void wrap(colvarvalue &x) const; +}; + + +/// \brief Colvar component: polar coordinate theta of a group +/// (colvarvalue::type_scalar type, range [0:180]) +class colvar::polar_theta + : public colvar::cvc +{ +public: + polar_theta(std::string const &conf); + polar_theta(); + virtual ~polar_theta() {} +protected: + cvm::atom_group *atoms; + cvm::real r, theta, phi; +public: + virtual void calc_value(); + virtual void calc_gradients(); + virtual void apply_force(colvarvalue const &force); + /// Redefined to override the distance ones + virtual cvm::real dist2(colvarvalue const &x1, + colvarvalue const &x2) const; + /// Redefined to override the distance ones + virtual colvarvalue dist2_lgrad(colvarvalue const &x1, + colvarvalue const &x2) const; + /// Redefined to override the distance ones + virtual colvarvalue dist2_rgrad(colvarvalue const &x1, + colvarvalue const &x2) const; +}; /// \brief Colvar component: average distance between two groups of atoms, weighted as the sixth power, /// as in NMR refinements(colvarvalue::type_scalar type, range (0:*)) class colvar::distance_inv - : public colvar::distance + : public colvar::cvc { protected: + /// First atom group + cvm::atom_group *group1; + /// Second atom group + cvm::atom_group *group2; /// Components of the distance vector orthogonal to the axis int exponent; + /// Use absolute positions, ignoring PBCs when present + bool b_no_PBC; public: distance_inv(std::string const &conf); distance_inv(); diff --git a/lib/colvars/colvarcomp_angles.cpp b/lib/colvars/colvarcomp_angles.cpp index 0204f3b4b1..9f879a4c41 100644 --- a/lib/colvars/colvarcomp_angles.cpp +++ b/lib/colvars/colvarcomp_angles.cpp @@ -45,9 +45,9 @@ colvar::angle::angle(cvm::atom const &a1, group1 = new cvm::atom_group(std::vector(1, a1)); group2 = new cvm::atom_group(std::vector(1, a2)); group3 = new cvm::atom_group(std::vector(1, a3)); - atom_groups.push_back(group1); - atom_groups.push_back(group2); - atom_groups.push_back(group3); + register_atom_group(group1); + register_atom_group(group2); + register_atom_group(group3); x.type(colvarvalue::type_scalar); } @@ -66,12 +66,16 @@ void colvar::angle::calc_value() cvm::atom_pos const g2_pos = group2->center_of_mass(); cvm::atom_pos const g3_pos = group3->center_of_mass(); - r21 = cvm::position_distance(g2_pos, g1_pos); + r21 = is_enabled(f_cvc_pbc_minimum_image) ? + cvm::position_distance(g2_pos, g1_pos) : + g1_pos - g2_pos; r21l = r21.norm(); - r23 = cvm::position_distance(g2_pos, g3_pos); + r23 = is_enabled(f_cvc_pbc_minimum_image) ? + cvm::position_distance(g2_pos, g3_pos) : + g3_pos - g2_pos; r23l = r23.norm(); - cvm::real const cos_theta = (r21*r23)/(r21l*r23l); + cvm::real const cos_theta = (r21*r23)/(r21l*r23l); x.real_value = (180.0/PI) * std::acos(cos_theta); } @@ -166,9 +170,9 @@ colvar::dipole_angle::dipole_angle(cvm::atom const &a1, group1 = new cvm::atom_group(std::vector(1, a1)); group2 = new cvm::atom_group(std::vector(1, a2)); group3 = new cvm::atom_group(std::vector(1, a3)); - atom_groups.push_back(group1); - atom_groups.push_back(group2); - atom_groups.push_back(group3); + register_atom_group(group1); + register_atom_group(group2); + register_atom_group(group3); x.type(colvarvalue::type_scalar); } @@ -191,10 +195,12 @@ void colvar::dipole_angle::calc_value() r21 = group1->dipole(); r21l = r21.norm(); - r23 = cvm::position_distance(g2_pos, g3_pos); + r23 = is_enabled(f_cvc_pbc_minimum_image) ? + cvm::position_distance(g2_pos, g3_pos) : + g3_pos - g2_pos; r23l = r23.norm(); - cvm::real const cos_theta = (r21*r23)/(r21l*r23l); + cvm::real const cos_theta = (r21*r23)/(r21l*r23l); x.real_value = (180.0/PI) * std::acos(cos_theta); } @@ -293,10 +299,10 @@ colvar::dihedral::dihedral(cvm::atom const &a1, group2 = new cvm::atom_group(std::vector(1, a2)); group3 = new cvm::atom_group(std::vector(1, a3)); group4 = new cvm::atom_group(std::vector(1, a4)); - atom_groups.push_back(group1); - atom_groups.push_back(group2); - atom_groups.push_back(group3); - atom_groups.push_back(group4); + register_atom_group(group1); + register_atom_group(group2); + register_atom_group(group3); + register_atom_group(group4); x.type(colvarvalue::type_scalar); @@ -324,9 +330,15 @@ void colvar::dihedral::calc_value() cvm::atom_pos const g4_pos = group4->center_of_mass(); // Usual sign convention: r12 = r2 - r1 - r12 = cvm::position_distance(g1_pos, g2_pos); - r23 = cvm::position_distance(g2_pos, g3_pos); - r34 = cvm::position_distance(g3_pos, g4_pos); + r12 = is_enabled(f_cvc_pbc_minimum_image) ? + cvm::position_distance(g1_pos, g2_pos) : + g2_pos - g1_pos; + r23 = is_enabled(f_cvc_pbc_minimum_image) ? + cvm::position_distance(g2_pos, g3_pos) : + g3_pos - g2_pos; + r34 = is_enabled(f_cvc_pbc_minimum_image) ? + cvm::position_distance(g3_pos, g4_pos) : + g4_pos - g3_pos; cvm::rvector const n1 = cvm::rvector::outer(r12, r23); cvm::rvector const n2 = cvm::rvector::outer(r23, r34); @@ -365,10 +377,10 @@ void colvar::dihedral::calc_gradients() cvm::real const K = (1.0/sin_phi) * (180.0/PI); - f1 = K * cvm::rvector::outer(r23, dcosdA); - f3 = K * cvm::rvector::outer(dcosdB, r23); - f2 = K * (cvm::rvector::outer(dcosdA, r12) - + cvm::rvector::outer(r34, dcosdB)); + f1 = K * cvm::rvector::outer(r23, dcosdA); + f3 = K * cvm::rvector::outer(dcosdB, r23); + f2 = K * (cvm::rvector::outer(dcosdA, r12) + + cvm::rvector::outer(r34, dcosdB)); } else { rC = 1.0/rC; @@ -439,7 +451,7 @@ void colvar::dihedral::calc_force_invgrads() // Default case: use groups 1 and 4 group4->read_total_forces(); ft.real_value = PI/180.0 * 0.5 * (fact1 * (cross1 * group1->total_force()) - + fact4 * (cross4 * group4->total_force())); + + fact4 * (cross4 * group4->total_force())); } } @@ -510,3 +522,148 @@ void colvar::dihedral::wrap(colvarvalue &x) const return; } + + +colvar::polar_theta::polar_theta(std::string const &conf) + : cvc(conf) +{ + function_type = "polar_theta"; + enable(f_cvc_com_based); + + atoms = parse_group(conf, "atoms"); + init_total_force_params(conf); + x.type(colvarvalue::type_scalar); +} + + +colvar::polar_theta::polar_theta() +{ + function_type = "polar_theta"; + x.type(colvarvalue::type_scalar); +} + + +void colvar::polar_theta::calc_value() +{ + cvm::rvector pos = atoms->center_of_mass(); + r = atoms->center_of_mass().norm(); + // Internal values of theta and phi are radians + theta = (r > 0.) ? std::acos(pos.z / r) : 0.; + phi = std::atan2(pos.y, pos.x); + x.real_value = (180.0/PI) * theta; +} + + +void colvar::polar_theta::calc_gradients() +{ + if (r == 0.) + atoms->set_weighted_gradient(cvm::rvector(0., 0., 0.)); + else + atoms->set_weighted_gradient(cvm::rvector( + (180.0/PI) * std::cos(theta) * std::cos(phi) / r, + (180.0/PI) * std::cos(theta) * std::sin(phi) / r, + (180.0/PI) * -std::sin(theta) / r)); +} + + +void colvar::polar_theta::apply_force(colvarvalue const &force) +{ + if (!atoms->noforce) + atoms->apply_colvar_force(force.real_value); +} + + +simple_scalar_dist_functions(polar_theta) + + +colvar::polar_phi::polar_phi(std::string const &conf) + : cvc(conf) +{ + function_type = "polar_phi"; + period = 360.0; + enable(f_cvc_com_based); + + atoms = parse_group(conf, "atoms"); + init_total_force_params(conf); + x.type(colvarvalue::type_scalar); +} + + +colvar::polar_phi::polar_phi() +{ + function_type = "polar_phi"; + period = 360.0; + x.type(colvarvalue::type_scalar); +} + + +void colvar::polar_phi::calc_value() +{ + cvm::rvector pos = atoms->center_of_mass(); + r = atoms->center_of_mass().norm(); + // Internal values of theta and phi are radians + theta = (r > 0.) ? std::acos(pos.z / r) : 0.; + phi = std::atan2(pos.y, pos.x); + x.real_value = (180.0/PI) * phi; +} + + +void colvar::polar_phi::calc_gradients() +{ + atoms->set_weighted_gradient(cvm::rvector( + (180.0/PI) * -std::sin(phi) / (r*std::sin(theta)), + (180.0/PI) * std::cos(phi) / (r*std::sin(theta)), + 0.)); +} + + +void colvar::polar_phi::apply_force(colvarvalue const &force) +{ + if (!atoms->noforce) + atoms->apply_colvar_force(force.real_value); +} + + +// Same as dihedral, for polar_phi + +cvm::real colvar::polar_phi::dist2(colvarvalue const &x1, + colvarvalue const &x2) const +{ + cvm::real diff = x1.real_value - x2.real_value; + diff = (diff < -180.0 ? diff + 360.0 : (diff > 180.0 ? diff - 360.0 : diff)); + return diff * diff; +} + + +colvarvalue colvar::polar_phi::dist2_lgrad(colvarvalue const &x1, + colvarvalue const &x2) const +{ + cvm::real diff = x1.real_value - x2.real_value; + diff = (diff < -180.0 ? diff + 360.0 : (diff > 180.0 ? diff - 360.0 : diff)); + return 2.0 * diff; +} + + +colvarvalue colvar::polar_phi::dist2_rgrad(colvarvalue const &x1, + colvarvalue const &x2) const +{ + cvm::real diff = x1.real_value - x2.real_value; + diff = (diff < -180.0 ? diff + 360.0 : (diff > 180.0 ? diff - 360.0 : diff)); + return (-2.0) * diff; +} + + +void colvar::polar_phi::wrap(colvarvalue &x) const +{ + if ((x.real_value - wrap_center) >= 180.0) { + x.real_value -= 360.0; + return; + } + + if ((x.real_value - wrap_center) < -180.0) { + x.real_value += 360.0; + return; + } + + return; +} diff --git a/lib/colvars/colvarcomp_coordnums.cpp b/lib/colvars/colvarcomp_coordnums.cpp index 987a16a816..369d489e27 100644 --- a/lib/colvars/colvarcomp_coordnums.cpp +++ b/lib/colvars/colvarcomp_coordnums.cpp @@ -87,8 +87,10 @@ colvar::coordnum::coordnum(std::string const &conf) group1 = parse_group(conf, "group1"); group2 = parse_group(conf, "group2"); - if (group1->b_dummy) - cvm::fatal_error("Error: only group2 is allowed to be a dummy atom\n"); + if (group1->b_dummy) { + cvm::error("Error: only group2 is allowed to be a dummy atom\n"); + return; + } bool const b_isotropic = get_keyval(conf, "cutoff", r0, cvm::real(4.0 * cvm::unit_angstrom())); @@ -99,6 +101,7 @@ colvar::coordnum::coordnum(std::string const &conf) if (b_isotropic) { cvm::error("Error: cannot specify \"cutoff\" and \"cutoff3\" at the same time.\n", INPUT_ERROR); + return; } b_anisotropic = true; @@ -115,6 +118,10 @@ colvar::coordnum::coordnum(std::string const &conf) cvm::error("Error: odd exponents provided, can only use even ones.\n", INPUT_ERROR); } + if (!is_enabled(f_cvc_pbc_minimum_image)) { + cvm::log("Warning: only minimum-image distances are used by this variable.\n"); + } + get_keyval(conf, "group2CenterOnly", b_group2_center_only, group2->b_dummy); } @@ -228,12 +235,13 @@ colvar::h_bond::h_bond(std::string const &conf) get_keyval(conf, "donor", d_num, -1); if ( (a_num == -1) || (d_num == -1) ) { - cvm::fatal_error("Error: either acceptor or donor undefined.\n"); + cvm::error("Error: either acceptor or donor undefined.\n"); + return; } cvm::atom acceptor = cvm::atom(a_num); cvm::atom donor = cvm::atom(d_num); - atom_groups.push_back(new cvm::atom_group); + register_atom_group(new cvm::atom_group); atom_groups[0]->add_atom(acceptor); atom_groups[0]->add_atom(donor); @@ -242,7 +250,8 @@ colvar::h_bond::h_bond(std::string const &conf) get_keyval(conf, "expDenom", ed, 8); if ( (en%2) || (ed%2) ) { - cvm::fatal_error("Error: odd exponents provided, can only use even ones.\n"); + cvm::error("Error: odd exponents provided, can only use even ones.\n"); + return; } if (cvm::debug()) @@ -258,7 +267,7 @@ colvar::h_bond::h_bond(cvm::atom const &acceptor, function_type = "h_bond"; x.type(colvarvalue::type_scalar); - atom_groups.push_back(new cvm::atom_group); + register_atom_group(new cvm::atom_group); atom_groups[0]->add_atom(acceptor); atom_groups[0]->add_atom(donor); } @@ -313,7 +322,12 @@ colvar::selfcoordnum::selfcoordnum(std::string const &conf) get_keyval(conf, "expDenom", ed, int(12)); if ( (en%2) || (ed%2) ) { - cvm::fatal_error("Error: odd exponents provided, can only use even ones.\n"); + cvm::error("Error: odd exponents provided, can only use even ones.\n"); + return; + } + + if (!is_enabled(f_cvc_pbc_minimum_image)) { + cvm::log("Warning: only minimum-image distances are used by this variable.\n"); } } @@ -364,8 +378,10 @@ colvar::groupcoordnum::groupcoordnum(std::string const &conf) x.type(colvarvalue::type_scalar); // group1 and group2 are already initialized by distance() - if (group1->b_dummy || group2->b_dummy) - cvm::fatal_error("Error: neither group can be a dummy atom\n"); + if (group1->b_dummy || group2->b_dummy) { + cvm::error("Error: neither group can be a dummy atom\n"); + return; + } bool const b_scale = get_keyval(conf, "cutoff", r0, cvm::real(4.0 * cvm::unit_angstrom())); @@ -373,9 +389,11 @@ colvar::groupcoordnum::groupcoordnum(std::string const &conf) if (get_keyval(conf, "cutoff3", r0_vec, cvm::rvector(4.0, 4.0, 4.0), parse_silent)) { - if (b_scale) - cvm::fatal_error("Error: cannot specify \"scale\" and " + if (b_scale) { + cvm::error("Error: cannot specify \"scale\" and " "\"scale3\" at the same time.\n"); + return; + } b_anisotropic = true; // remove meaningless negative signs if (r0_vec.x < 0.0) r0_vec.x *= -1.0; @@ -387,7 +405,12 @@ colvar::groupcoordnum::groupcoordnum(std::string const &conf) get_keyval(conf, "expDenom", ed, int(12)); if ( (en%2) || (ed%2) ) { - cvm::fatal_error("Error: odd exponents provided, can only use even ones.\n"); + cvm::error("Error: odd exponents provided, can only use even ones.\n"); + return; + } + + if (!is_enabled(f_cvc_pbc_minimum_image)) { + cvm::log("Warning: only minimum-image distances are used by this variable.\n"); } } diff --git a/lib/colvars/colvarcomp_distances.cpp b/lib/colvars/colvarcomp_distances.cpp index f46270246f..18d154515a 100644 --- a/lib/colvars/colvarcomp_distances.cpp +++ b/lib/colvars/colvarcomp_distances.cpp @@ -28,10 +28,6 @@ colvar::distance::distance(std::string const &conf) group1 = parse_group(conf, "group1"); group2 = parse_group(conf, "group2"); - if (get_keyval(conf, "forceNoPBC", b_no_PBC, false)) { - cvm::log("Computing distance using absolute positions (not minimal-image)"); - } - init_total_force_params(conf); x.type(colvarvalue::type_scalar); @@ -45,18 +41,17 @@ colvar::distance::distance() provide(f_cvc_inv_gradient); provide(f_cvc_Jacobian); enable(f_cvc_com_based); - b_no_PBC = false; x.type(colvarvalue::type_scalar); } void colvar::distance::calc_value() { - if (b_no_PBC) { + if (!is_enabled(f_cvc_pbc_minimum_image)) { dist_v = group2->center_of_mass() - group1->center_of_mass(); } else { dist_v = cvm::position_distance(group1->center_of_mass(), - group2->center_of_mass()); + group2->center_of_mass()); } x.real_value = dist_v.norm(); } @@ -107,6 +102,7 @@ colvar::distance_vec::distance_vec(std::string const &conf) { function_type = "distance_vec"; enable(f_cvc_com_based); + enable(f_cvc_implicit_gradient); x.type(colvarvalue::type_3vector); } @@ -116,17 +112,18 @@ colvar::distance_vec::distance_vec() { function_type = "distance_vec"; enable(f_cvc_com_based); + enable(f_cvc_implicit_gradient); x.type(colvarvalue::type_3vector); } void colvar::distance_vec::calc_value() { - if (b_no_PBC) { + if (!is_enabled(f_cvc_pbc_minimum_image)) { x.rvector_value = group2->center_of_mass() - group1->center_of_mass(); } else { x.rvector_value = cvm::position_distance(group1->center_of_mass(), - group2->center_of_mass()); + group2->center_of_mass()); } } @@ -214,10 +211,6 @@ colvar::distance_z::distance_z(std::string const &conf) fixed_axis = true; } - if (get_keyval(conf, "forceNoPBC", b_no_PBC, false)) { - cvm::log("Computing distance using absolute positions (not minimal-image)"); - } - init_total_force_params(conf); } @@ -236,22 +229,24 @@ colvar::distance_z::distance_z() void colvar::distance_z::calc_value() { if (fixed_axis) { - if (b_no_PBC) { + if (!is_enabled(f_cvc_pbc_minimum_image)) { dist_v = main->center_of_mass() - ref1->center_of_mass(); } else { dist_v = cvm::position_distance(ref1->center_of_mass(), - main->center_of_mass()); + main->center_of_mass()); } } else { - if (b_no_PBC) { + if (!is_enabled(f_cvc_pbc_minimum_image)) { dist_v = main->center_of_mass() - (0.5 * (ref1->center_of_mass() + ref2->center_of_mass())); axis = ref2->center_of_mass() - ref1->center_of_mass(); } else { dist_v = cvm::position_distance(0.5 * (ref1->center_of_mass() + - ref2->center_of_mass()), main->center_of_mass()); - axis = cvm::position_distance(ref1->center_of_mass(), ref2->center_of_mass()); + ref2->center_of_mass()), + main->center_of_mass()); + axis = cvm::position_distance(ref1->center_of_mass(), + ref2->center_of_mass()); } axis_norm = axis.norm(); axis = axis.unit(); @@ -268,16 +263,20 @@ void colvar::distance_z::calc_gradients() if (fixed_axis) { ref1->set_weighted_gradient(-1.0 * axis); } else { - if (b_no_PBC) { - ref1->set_weighted_gradient( 1.0 / axis_norm * (main->center_of_mass() - ref2->center_of_mass() - + if (!is_enabled(f_cvc_pbc_minimum_image)) { + ref1->set_weighted_gradient( 1.0 / axis_norm * + (main->center_of_mass() - ref2->center_of_mass() - x.real_value * axis )); - ref2->set_weighted_gradient( 1.0 / axis_norm * (ref1->center_of_mass() - main->center_of_mass() + + ref2->set_weighted_gradient( 1.0 / axis_norm * + (ref1->center_of_mass() - main->center_of_mass() + x.real_value * axis )); } else { ref1->set_weighted_gradient( 1.0 / axis_norm * ( - cvm::position_distance(ref2->center_of_mass(), main->center_of_mass()) - x.real_value * axis )); + cvm::position_distance(ref2->center_of_mass(), + main->center_of_mass()) - x.real_value * axis )); ref2->set_weighted_gradient( 1.0 / axis_norm * ( - cvm::position_distance(main->center_of_mass(), ref1->center_of_mass()) + x.real_value * axis )); + cvm::position_distance(main->center_of_mass(), + ref1->center_of_mass()) + x.real_value * axis )); } } } @@ -390,17 +389,18 @@ colvar::distance_xy::distance_xy() void colvar::distance_xy::calc_value() { - if (b_no_PBC) { + if (!is_enabled(f_cvc_pbc_minimum_image)) { dist_v = main->center_of_mass() - ref1->center_of_mass(); } else { dist_v = cvm::position_distance(ref1->center_of_mass(), - main->center_of_mass()); + main->center_of_mass()); } if (!fixed_axis) { - if (b_no_PBC) { + if (!is_enabled(f_cvc_pbc_minimum_image)) { v12 = ref2->center_of_mass() - ref1->center_of_mass(); } else { - v12 = cvm::position_distance(ref1->center_of_mass(), ref2->center_of_mass()); + v12 = cvm::position_distance(ref1->center_of_mass(), + ref2->center_of_mass()); } axis_norm = v12.norm(); axis = v12.unit(); @@ -425,10 +425,11 @@ void colvar::distance_xy::calc_gradients() ref1->set_weighted_gradient(-1.0 * x_inv * dist_v_ortho); main->set_weighted_gradient( x_inv * dist_v_ortho); } else { - if (b_no_PBC) { + if (!is_enabled(f_cvc_pbc_minimum_image)) { v13 = main->center_of_mass() - ref1->center_of_mass(); } else { - v13 = cvm::position_distance(ref1->center_of_mass(), main->center_of_mass()); + v13 = cvm::position_distance(ref1->center_of_mass(), + main->center_of_mass()); } A = (dist_v * axis) / axis_norm; @@ -480,6 +481,7 @@ colvar::distance_dir::distance_dir(std::string const &conf) { function_type = "distance_dir"; enable(f_cvc_com_based); + enable(f_cvc_implicit_gradient); x.type(colvarvalue::type_unit3vector); } @@ -489,13 +491,14 @@ colvar::distance_dir::distance_dir() { function_type = "distance_dir"; enable(f_cvc_com_based); + enable(f_cvc_implicit_gradient); x.type(colvarvalue::type_unit3vector); } void colvar::distance_dir::calc_value() { - if (b_no_PBC) { + if (!is_enabled(f_cvc_pbc_minimum_image)) { dist_v = group2->center_of_mass() - group1->center_of_mass(); } else { dist_v = cvm::position_distance(group1->center_of_mass(), @@ -539,22 +542,26 @@ cvm::real colvar::distance_dir::dist2(colvarvalue const &x1, colvarvalue colvar::distance_dir::dist2_lgrad(colvarvalue const &x1, colvarvalue const &x2) const { - return colvarvalue((x1.rvector_value - x2.rvector_value), colvarvalue::type_unit3vector); + return colvarvalue((x1.rvector_value - x2.rvector_value), colvarvalue::type_unit3vectorderiv); } colvarvalue colvar::distance_dir::dist2_rgrad(colvarvalue const &x1, colvarvalue const &x2) const { - return colvarvalue((x2.rvector_value - x1.rvector_value), colvarvalue::type_unit3vector); + return colvarvalue((x2.rvector_value - x1.rvector_value), colvarvalue::type_unit3vectorderiv); } colvar::distance_inv::distance_inv(std::string const &conf) - : distance(conf) + : cvc(conf) { function_type = "distance_inv"; + + group1 = parse_group(conf, "group1"); + group2 = parse_group(conf, "group2"); + get_keyval(conf, "exponent", exponent, 6); if (exponent%2) { cvm::error("Error: odd exponent provided, can only use even ones.\n"); @@ -589,7 +596,7 @@ colvar::distance_inv::distance_inv() void colvar::distance_inv::calc_value() { x.real_value = 0.0; - if (b_no_PBC) { + if (!is_enabled(f_cvc_pbc_minimum_image)) { for (cvm::atom_iter ai1 = group1->begin(); ai1 != group1->end(); ai1++) { for (cvm::atom_iter ai2 = group2->begin(); ai2 != group2->end(); ai2++) { cvm::rvector const dv = ai2->pos - ai1->pos; @@ -655,14 +662,11 @@ colvar::distance_pairs::distance_pairs(std::string const &conf) { function_type = "distance_pairs"; - if (get_keyval(conf, "forceNoPBC", b_no_PBC, false)) { - cvm::log("Computing distance using absolute positions (not minimal-image)"); - } - group1 = parse_group(conf, "group1"); group2 = parse_group(conf, "group2"); x.type(colvarvalue::type_vector); + enable(f_cvc_implicit_gradient); x.vector1d_value.resize(group1->size() * group2->size()); } @@ -670,6 +674,7 @@ colvar::distance_pairs::distance_pairs(std::string const &conf) colvar::distance_pairs::distance_pairs() { function_type = "distance_pairs"; + enable(f_cvc_implicit_gradient); x.type(colvarvalue::type_vector); } @@ -678,7 +683,7 @@ void colvar::distance_pairs::calc_value() { x.vector1d_value.resize(group1->size() * group2->size()); - if (b_no_PBC) { + if (!is_enabled(f_cvc_pbc_minimum_image)) { size_t i1, i2; for (i1 = 0; i1 < group1->size(); i1++) { for (i2 = 0; i2 < group2->size(); i2++) { @@ -693,7 +698,8 @@ void colvar::distance_pairs::calc_value() size_t i1, i2; for (i1 = 0; i1 < group1->size(); i1++) { for (i2 = 0; i2 < group2->size(); i2++) { - cvm::rvector const dv = cvm::position_distance((*group1)[i1].pos, (*group2)[i2].pos); + cvm::rvector const dv = cvm::position_distance((*group1)[i1].pos, + (*group2)[i2].pos); cvm::real const d = dv.norm(); x.vector1d_value[i1*group2->size() + i2] = d; (*group1)[i1].grad = -1.0 * dv.unit(); @@ -712,7 +718,7 @@ void colvar::distance_pairs::calc_gradients() void colvar::distance_pairs::apply_force(colvarvalue const &force) { - if (b_no_PBC) { + if (!is_enabled(f_cvc_pbc_minimum_image)) { size_t i1, i2; for (i1 = 0; i1 < group1->size(); i1++) { for (i2 = 0; i2 < group2->size(); i2++) { @@ -725,7 +731,8 @@ void colvar::distance_pairs::apply_force(colvarvalue const &force) size_t i1, i2; for (i1 = 0; i1 < group1->size(); i1++) { for (i2 = 0; i2 < group2->size(); i2++) { - cvm::rvector const dv = cvm::position_distance((*group1)[i1].pos, (*group2)[i2].pos); + cvm::rvector const dv = cvm::position_distance((*group1)[i1].pos, + (*group2)[i2].pos); (*group1)[i1].apply_force(force[i1*group2->size() + i2] * (-1.0) * dv.unit()); (*group2)[i2].apply_force(force[i1*group2->size() + i2] * dv.unit()); } @@ -999,7 +1006,7 @@ colvar::rmsd::rmsd(std::string const &conf) cvm::log("This is a standard minimum RMSD, derivatives of the optimal rotation " "will not be computed as they cancel out in the gradients."); - atoms->b_fit_gradients = false; + atoms->disable(f_ag_fit_gradients); // request the calculation of the derivatives of the rotation defined by the atom group atoms->rot.request_group1_gradients(atoms->size()); @@ -1191,8 +1198,8 @@ colvar::eigenvector::eigenvector(std::string const &conf) atoms->b_rotate = true; atoms->ref_pos = ref_pos; atoms->center_ref_pos(); - atoms->b_fit_gradients = false; // cancel out if group is fitted on itself - // and cvc is translationally invariant + atoms->disable(f_ag_fit_gradients); // cancel out if group is fitted on itself + // and cvc is translationally invariant // request the calculation of the derivatives of the rotation defined by the atom group atoms->rot.request_group1_gradients(atoms->size()); @@ -1207,8 +1214,9 @@ colvar::eigenvector::eigenvector(std::string const &conf) if (b_inline) { cvm::log("Using vector components from input file.\n"); if (eigenvec.size() != atoms->size()) { - cvm::fatal_error("Error: vector components do not " + cvm::error("Error: vector components do not " "match the number of requested atoms->\n"); + return; } } @@ -1422,6 +1430,7 @@ colvar::cartesian::cartesian(std::string const &conf) } x.type(colvarvalue::type_vector); + enable(f_cvc_implicit_gradient); x.vector1d_value.resize(atoms->size() * axes.size()); } diff --git a/lib/colvars/colvarcomp_protein.cpp b/lib/colvars/colvarcomp_protein.cpp index 393c7dcf9a..b8fc96cfad 100644 --- a/lib/colvars/colvarcomp_protein.cpp +++ b/lib/colvars/colvarcomp_protein.cpp @@ -20,15 +20,6 @@ // alpha component ////////////////////////////////////////////////////////////////////// - // FIXME: this will not make collect_gradients work - // because gradients in individual atom groups - // are those of the sub-cvcs (angle, hb), not those - // of this cvc (alpha) - // This is true of all cvcs with sub-cvcs, and those - // that do not calculate explicit gradients - // SO: we need a flag giving the availability of - // atomic gradients - colvar::alpha_angles::alpha_angles(std::string const &conf) : cvc(conf) { @@ -36,6 +27,7 @@ colvar::alpha_angles::alpha_angles(std::string const &conf) cvm::log("Initializing alpha_angles object.\n"); function_type = "alpha_angles"; + enable(f_cvc_implicit_gradient); x.type(colvarvalue::type_scalar); std::string segment_id; @@ -44,7 +36,7 @@ colvar::alpha_angles::alpha_angles(std::string const &conf) std::vector residues; { std::string residues_conf = ""; - key_lookup(conf, "residueRange", residues_conf); + key_lookup(conf, "residueRange", &residues_conf); if (residues_conf.size()) { std::istringstream is(residues_conf); int initial, final; @@ -57,12 +49,14 @@ colvar::alpha_angles::alpha_angles(std::string const &conf) } } } else { - cvm::fatal_error("Error: no residues defined in \"residueRange\".\n"); + cvm::error("Error: no residues defined in \"residueRange\".\n"); + return; } } if (residues.size() < 5) { - cvm::fatal_error("Error: not enough residues defined in \"residueRange\".\n"); + cvm::error("Error: not enough residues defined in \"residueRange\".\n"); + return; } std::string const &sid = segment_id; @@ -71,7 +65,8 @@ colvar::alpha_angles::alpha_angles(std::string const &conf) get_keyval(conf, "hBondCoeff", hb_coeff, 0.5); if ( (hb_coeff < 0.0) || (hb_coeff > 1.0) ) { - cvm::fatal_error("Error: hBondCoeff must be defined between 0 and 1.\n"); + cvm::error("Error: hBondCoeff must be defined between 0 and 1.\n"); + return; } @@ -84,9 +79,9 @@ colvar::alpha_angles::alpha_angles(std::string const &conf) theta.push_back(new colvar::angle(cvm::atom(r[i ], "CA", sid), cvm::atom(r[i+1], "CA", sid), cvm::atom(r[i+2], "CA", sid))); - atom_groups.push_back(theta.back()->atom_groups[0]); - atom_groups.push_back(theta.back()->atom_groups[1]); - atom_groups.push_back(theta.back()->atom_groups[2]); + register_atom_group(theta.back()->atom_groups[0]); + register_atom_group(theta.back()->atom_groups[1]); + register_atom_group(theta.back()->atom_groups[2]); } } else { @@ -106,7 +101,7 @@ colvar::alpha_angles::alpha_angles(std::string const &conf) hb.push_back(new colvar::h_bond(cvm::atom(r[i ], "O", sid), cvm::atom(r[i+4], "N", sid), r0, en, ed)); - atom_groups.push_back(hb.back()->atom_groups[0]); + register_atom_group(hb.back()->atom_groups[0]); } } else { @@ -123,6 +118,7 @@ colvar::alpha_angles::alpha_angles() : cvc() { function_type = "alpha_angles"; + enable(f_cvc_implicit_gradient); x.type(colvarvalue::type_scalar); } @@ -239,15 +235,6 @@ simple_scalar_dist_functions(alpha_angles) // dihedral principal component ////////////////////////////////////////////////////////////////////// - // FIXME: this will not make collect_gradients work - // because gradients in individual atom groups - // are those of the sub-cvcs (dihedral), not those - // of this cvc - // This is true of all cvcs with sub-cvcs, and those - // that do not calculate explicit gradients - // SO: we need a flag giving the availability of - // atomic gradients - colvar::dihedPC::dihedPC(std::string const &conf) : cvc(conf) { @@ -255,6 +242,7 @@ colvar::dihedPC::dihedPC(std::string const &conf) cvm::log("Initializing dihedral PC object.\n"); function_type = "dihedPC"; + enable(f_cvc_implicit_gradient); x.type(colvarvalue::type_scalar); std::string segment_id; @@ -263,7 +251,7 @@ colvar::dihedPC::dihedPC(std::string const &conf) std::vector residues; { std::string residues_conf = ""; - key_lookup(conf, "residueRange", residues_conf); + key_lookup(conf, "residueRange", &residues_conf); if (residues_conf.size()) { std::istringstream is(residues_conf); int initial, final; @@ -276,12 +264,14 @@ colvar::dihedPC::dihedPC(std::string const &conf) } } } else { - cvm::fatal_error("Error: no residues defined in \"residueRange\".\n"); + cvm::error("Error: no residues defined in \"residueRange\".\n"); + return; } } if (residues.size() < 2) { - cvm::fatal_error("Error: dihedralPC requires at least two residues.\n"); + cvm::error("Error: dihedralPC requires at least two residues.\n"); + return; } std::string const &sid = segment_id; @@ -291,13 +281,16 @@ colvar::dihedPC::dihedPC(std::string const &conf) int vecNumber; if (get_keyval(conf, "vectorFile", vecFileName, vecFileName)) { get_keyval(conf, "vectorNumber", vecNumber, 0); - if (vecNumber < 1) - cvm::fatal_error("A positive value of vectorNumber is required."); + if (vecNumber < 1) { + cvm::error("A positive value of vectorNumber is required."); + return; + } std::ifstream vecFile; vecFile.open(vecFileName.c_str()); - if (!vecFile.good()) - cvm::fatal_error("Error opening dihedral PCA vector file " + vecFileName + " for reading"); + if (!vecFile.good()) { + cvm::error("Error opening dihedral PCA vector file " + vecFileName + " for reading"); + } // TODO: adapt to different formats by setting this flag bool eigenvectors_as_columns = true; @@ -321,8 +314,9 @@ colvar::dihedPC::dihedPC(std::string const &conf) for (int i = 1; iatom_groups[0]); - atom_groups.push_back(theta.back()->atom_groups[1]); - atom_groups.push_back(theta.back()->atom_groups[2]); - atom_groups.push_back(theta.back()->atom_groups[3]); + register_atom_group(theta.back()->atom_groups[0]); + register_atom_group(theta.back()->atom_groups[1]); + register_atom_group(theta.back()->atom_groups[2]); + register_atom_group(theta.back()->atom_groups[3]); // Phi (next res) theta.push_back(new colvar::dihedral(cvm::atom(r[i ], "C", sid), cvm::atom(r[i+1], "N", sid), cvm::atom(r[i+1], "CA", sid), cvm::atom(r[i+1], "C", sid))); - atom_groups.push_back(theta.back()->atom_groups[0]); - atom_groups.push_back(theta.back()->atom_groups[1]); - atom_groups.push_back(theta.back()->atom_groups[2]); - atom_groups.push_back(theta.back()->atom_groups[3]); + register_atom_group(theta.back()->atom_groups[0]); + register_atom_group(theta.back()->atom_groups[1]); + register_atom_group(theta.back()->atom_groups[2]); + register_atom_group(theta.back()->atom_groups[3]); } if (cvm::debug()) @@ -377,6 +372,7 @@ colvar::dihedPC::dihedPC() : cvc() { function_type = "dihedPC"; + enable(f_cvc_implicit_gradient); x.type(colvarvalue::type_scalar); } diff --git a/lib/colvars/colvarcomp_rotations.cpp b/lib/colvars/colvarcomp_rotations.cpp index 936e770169..2650a9fe18 100644 --- a/lib/colvars/colvarcomp_rotations.cpp +++ b/lib/colvars/colvarcomp_rotations.cpp @@ -22,6 +22,7 @@ colvar::orientation::orientation(std::string const &conf) { function_type = "orientation"; atoms = parse_group(conf, "atoms"); + enable(f_cvc_implicit_gradient); x.type(colvarvalue::type_quaternion); ref_pos.reserve(atoms->size()); @@ -29,8 +30,9 @@ colvar::orientation::orientation(std::string const &conf) if (get_keyval(conf, "refPositions", ref_pos, ref_pos)) { cvm::log("Using reference positions from input file.\n"); if (ref_pos.size() != atoms->size()) { - cvm::fatal_error("Error: reference positions do not " + cvm::error("Error: reference positions do not " "match the number of requested atoms.\n"); + return; } } @@ -43,9 +45,11 @@ colvar::orientation::orientation(std::string const &conf) if (get_keyval(conf, "refPositionsCol", file_col, std::string(""))) { // use PDB flags if column is provided bool found = get_keyval(conf, "refPositionsColValue", file_col_value, 0.0); - if (found && file_col_value==0.0) - cvm::fatal_error("Error: refPositionsColValue, " + if (found && file_col_value==0.0) { + cvm::error("Error: refPositionsColValue, " "if provided, must be non-zero.\n"); + return; + } } else { // if not, use atom indices atoms->create_sorted_ids(); @@ -56,8 +60,9 @@ colvar::orientation::orientation(std::string const &conf) } if (!ref_pos.size()) { - cvm::fatal_error("Error: must define a set of " + cvm::error("Error: must define a set of " "reference coordinates.\n"); + return; } @@ -88,6 +93,7 @@ colvar::orientation::orientation() : cvc() { function_type = "orientation"; + enable(f_cvc_implicit_gradient); x.type(colvarvalue::type_quaternion); } diff --git a/lib/colvars/colvardeps.cpp b/lib/colvars/colvardeps.cpp index 8252f77e62..5402836f53 100644 --- a/lib/colvars/colvardeps.cpp +++ b/lib/colvars/colvardeps.cpp @@ -10,24 +10,77 @@ #include "colvardeps.h" +colvardeps::colvardeps() + : time_step_factor (1) {} colvardeps::~colvardeps() { size_t i; - // Do not delete features if it's static -// for (i=0; idescription); } } + + // Do not delete features if it's a static object + // may change in the future though +// for (i=0; irequires_children.size(); i++) { + int g = features()[fid]->requires_children[i]; + for (j=0; jfeatures()[g]->description); + children[j]->decr_ref_count(g); + } + } + } + } + cvm::decrease_depth(); +} + + +// re-enable children features (and increase ref count accordingly) +// So free_children_deps() can be called whenever an object becomes inactive +void colvardeps::restore_children_deps() { + size_t i,j,fid; + + cvm::increase_depth(); + for (fid = 0; fid < feature_states.size(); fid++) { + if (is_enabled(fid)) { + for (i=0; irequires_children.size(); i++) { + int g = features()[fid]->requires_children[i]; + for (j=0; jfeatures()[g]->description); + children[j]->enable(g, false, false); + } + } + } + } + cvm::decrease_depth(); } @@ -37,15 +90,10 @@ void colvardeps::provide(int feature_id, bool truefalse) { void colvardeps::set_enabled(int feature_id, bool truefalse) { -// if (!is_static(feature_id)) { -// cvm::error("Cannot set feature " + features()[feature_id]->description + " statically in " + description + ".\n"); -// return; -// } if (truefalse) { - // Resolve dependencies too enable(feature_id); } else { - feature_states[feature_id].enabled = false; + disable(feature_id); } } @@ -56,7 +104,7 @@ bool colvardeps::get_keyval_feature(colvarparse *cvp, colvarparse::Parse_Mode const parse_mode) { if (!is_user(feature_id)) { - cvm::error("Cannot set feature " + features()[feature_id]->description + " from user input in " + description + ".\n"); + cvm::error("Cannot set feature \"" + features()[feature_id]->description + "\" from user input in \"" + description + "\".\n"); return false; } bool value; @@ -83,21 +131,34 @@ int colvardeps::enable(int feature_id, if (cvm::debug()) { cvm::log("DEPS: " + description + - (dry_run ? " testing " : " requiring ") + + (dry_run ? " testing " : " enabling ") + "\"" + f->description +"\""); } if (fs->enabled) { - // Do not try to solve deps if already enabled + if (!(dry_run || toplevel)) { + // This is a dependency + // Prevent disabling this feature as long + // as requirement is enabled + fs->ref_count++; + if (cvm::debug()) + cvm::log("DEPS: bumping ref_count to " + cvm::to_str(fs->ref_count)); + } + // Do not try to further resolve deps return COLVARS_OK; } + std::string feature_type_descr = is_static(feature_id) ? "Static" : + (is_dynamic(feature_id) ? "Dynamic" : "User-controlled"); + if (!fs->available) { if (!dry_run) { if (toplevel) { - cvm::error("Error: Feature unavailable: \"" + f->description + "\" in " + description + "."); + cvm::error("Error: " + feature_type_descr + " feature unavailable: \"" + + f->description + "\" in " + description + "."); } else { - cvm::log("Feature unavailable: \"" + f->description + "\" in " + description); + cvm::log(feature_type_descr + " feature unavailable: \"" + + f->description + "\" in " + description + "."); } } return COLVARS_ERROR; @@ -105,21 +166,22 @@ int colvardeps::enable(int feature_id, if (!toplevel && !is_dynamic(feature_id)) { if (!dry_run) { - cvm::log("Non-dynamic feature : \"" + f->description - + "\" in " + description + " may not be enabled as a dependency.\n"); + cvm::log(feature_type_descr + " feature \"" + f->description + + "\" may not be enabled as a dependency in " + description + ".\n"); } return COLVARS_ERROR; } // 1) enforce exclusions + // reminder: exclusions must be mutual for this to work for (i=0; irequires_exclude.size(); i++) { feature *g = features()[f->requires_exclude[i]]; if (cvm::debug()) cvm::log(f->description + " requires exclude " + g->description); if (is_enabled(f->requires_exclude[i])) { if (!dry_run) { - cvm::log("Features \"" + f->description + "\" is incompatible with \"" - + g->description + "\" in " + description); + cvm::log("Feature \"" + f->description + "\" is incompatible with \"" + + g->description + "\" in " + description + "."); if (toplevel) { cvm::error("Error: Failed dependency in " + description + "."); } @@ -156,23 +218,27 @@ int colvardeps::enable(int feature_id, res = enable(g, true, false); // see if available if (res == COLVARS_OK) { ok = true; - if (!dry_run) enable(g, false, false); // Require again, for real + if (!dry_run) { + enable(g, false, false); // Require again, for real + fs->alternate_refs.push_back(g); // We remember we enabled this + // so we can free it if this feature gets disabled + } break; } } if (!ok) { if (!dry_run) { - cvm::log("No dependency satisfied among alternates:"); - cvm::log("-----------------------------------------"); + cvm::log("\"" + f->description + "\" in " + description + + " requires one of the following features, none of which can be enabled:\n"); + cvm::log("-----------------------------------------\n"); + cvm::increase_depth(); for (j=0; jrequires_alt[i].size(); j++) { int g = f->requires_alt[i][j]; cvm::log(cvm::to_str(j+1) + ". " + features()[g]->description); - cvm::increase_depth(); enable(g, false, false); // Just for printing error output - cvm::decrease_depth(); } + cvm::decrease_depth(); cvm::log("-----------------------------------------"); - cvm::log("for \"" + f->description + "\" in " + description); if (toplevel) { cvm::error("Error: Failed dependency in " + description + "."); } @@ -182,12 +248,13 @@ int colvardeps::enable(int feature_id, } // 4) solve deps in children + // if the object is inactive, we solve but do not enable: will be enabled + // when the object becomes active + cvm::increase_depth(); for (i=0; irequires_children.size(); i++) { int g = f->requires_children[i]; for (j=0; jenable(g, dry_run, false); - cvm::decrease_depth(); + res = children[j]->enable(g, dry_run || !is_enabled(), false); if (res != COLVARS_OK) { if (!dry_run) { cvm::log("...required by \"" + f->description + "\" in " + description); @@ -198,25 +265,114 @@ int colvardeps::enable(int feature_id, return res; } } - // If we've just touched the features of child objects, refresh them - if (!dry_run && f->requires_children.size() != 0) { - for (j=0; jrefresh_deps(); - } - } } + cvm::decrease_depth(); // Actually enable feature only once everything checks out - if (!dry_run) fs->enabled = true; + if (!dry_run) { + fs->enabled = true; + // This should be the only reference + if (!toplevel) fs->ref_count = 1; + if (feature_id == 0) { + // Waking up this object, enable all deps in children + restore_children_deps(); + } + do_feature_side_effects(feature_id); + if (cvm::debug()) + cvm::log("DEPS: feature \"" + f->description + "\" in " + + description + " enabled, ref_count = 1."); + } return COLVARS_OK; } -// disable() { -// -// // we need refs to parents to walk up the deps tree! -// // or refresh -// } +int colvardeps::disable(int feature_id) { + size_t i, j; + feature *f = features()[feature_id]; + feature_state *fs = &feature_states[feature_id]; + + if (cvm::debug()) cvm::log("DEPS: disabling feature \"" + + f->description + "\" in " + description); + + if (fs->enabled == false) { + return COLVARS_OK; + } + + if (fs->ref_count > 1) { + cvm::error("Error: cannot disable feature \"" + f->description + + "\" in " + description + " because of " + cvm::to_str(fs->ref_count-1) + + " remaining references.\n" ); + return COLVARS_ERROR; + } + + // internal deps (self) + for (i=0; irequires_self.size(); i++) { + if (cvm::debug()) cvm::log("DEPS: dereferencing self " + + features()[f->requires_self[i]]->description); + decr_ref_count(f->requires_self[i]); + } + + // alternates + for (i=0; ialternate_refs.size(); i++) { + if (cvm::debug()) cvm::log("DEPS: dereferencing alt " + + features()[fs->alternate_refs[i]]->description); + decr_ref_count(fs->alternate_refs[i]); + } + // Forget these, now that they are dereferenced + fs->alternate_refs.clear(); + + // deps in children + // except if the object is inactive, then children dependencies + // have already been dereferenced by this function + // (or never referenced if feature was enabled while the object + // was inactive) + if (is_enabled()) { + cvm::increase_depth(); + for (i=0; irequires_children.size(); i++) { + int g = f->requires_children[i]; + for (j=0; jfeatures()[g]->description); + children[j]->decr_ref_count(g); + } + } + cvm::decrease_depth(); + } + + fs->enabled = false; + fs->ref_count = 0; + if (feature_id == 0) { + // Putting this object to sleep + free_children_deps(); + } + return COLVARS_OK; +} + +int colvardeps::decr_ref_count(int feature_id) { + int &rc = feature_states[feature_id].ref_count; + feature *f = features()[feature_id]; + + if (cvm::debug()) + cvm::log("DEPS: decreasing reference count of \"" + f->description + + "\" in " + description + ".\n"); + + if (rc <= 0) { + cvm::error("Error: cannot decrease reference count of feature \"" + f->description + + "\" in " + description + ", which is " + cvm::to_str(rc) + ".\n"); + return COLVARS_ERROR; + } + + rc--; + if (rc == 0 && f->is_dynamic()) { + // we can auto-disable this feature + if (cvm::debug()) + cvm::log("DEPS will now auto-disable dynamic feature \"" + f->description + + "\" in " + description + ".\n"); + disable(feature_id); + } + return COLVARS_OK; +} + void colvardeps::init_feature(int feature_id, const char *description, feature_type type) { features()[feature_id]->description = description; features()[feature_id]->type = type; @@ -235,6 +391,11 @@ void colvardeps::init_feature(int feature_id, const char *description, feature_t features()[f]->requires_alt.back()[0] = g; \ features()[f]->requires_alt.back()[1] = h; \ features()[f]->requires_alt.back()[2] = i +#define f_req_alt4(f, g, h, i, j) features()[f]->requires_alt.push_back(std::vector(4));\ + features()[f]->requires_alt.back()[0] = g; \ + features()[f]->requires_alt.back()[1] = h; \ + features()[f]->requires_alt.back()[2] = i; \ + features()[f]->requires_alt.back()[3] = j void colvardeps::init_cvb_requires() { int i; @@ -246,6 +407,9 @@ void colvardeps::init_cvb_requires() { init_feature(f_cvb_active, "active", f_type_dynamic); f_req_children(f_cvb_active, f_cv_active); + init_feature(f_cvb_awake, "awake", f_type_static); + f_req_self(f_cvb_awake, f_cvb_active); + init_feature(f_cvb_apply_force, "apply force", f_type_user); f_req_children(f_cvb_apply_force, f_cv_gradient); @@ -278,9 +442,12 @@ void colvardeps::init_cv_requires() { } init_feature(f_cv_active, "active", f_type_dynamic); - f_req_children(f_cv_active, f_cvc_active); - // Colvars must be either a linear combination, or scalar (and polynomial) or scripted - f_req_alt3(f_cv_active, f_cv_scalar, f_cv_linear, f_cv_scripted); + // Do not require f_cvc_active in children, as some components may be disabled + // Colvars must be either a linear combination, or scalar (and polynomial) or scripted/custom + f_req_alt4(f_cv_active, f_cv_scalar, f_cv_linear, f_cv_scripted, f_cv_custom_function); + + init_feature(f_cv_awake, "awake", f_type_static); + f_req_self(f_cv_awake, f_cv_active); init_feature(f_cv_gradient, "gradient", f_type_dynamic); f_req_children(f_cv_gradient, f_cvc_gradient); @@ -288,8 +455,10 @@ void colvardeps::init_cv_requires() { init_feature(f_cv_collect_gradient, "collect gradient", f_type_dynamic); f_req_self(f_cv_collect_gradient, f_cv_gradient); f_req_self(f_cv_collect_gradient, f_cv_scalar); + // The following exlusion could be lifted by implementing the feature + f_req_exclude(f_cv_collect_gradient, f_cv_scripted); - init_feature(f_cv_fdiff_velocity, "fdiff_velocity", f_type_dynamic); + init_feature(f_cv_fdiff_velocity, "velocity from finite differences", f_type_dynamic); // System force: either trivial (spring force); through extended Lagrangian, or calculated explicitly init_feature(f_cv_total_force, "total force", f_type_dynamic); @@ -335,6 +504,9 @@ void colvardeps::init_cv_requires() { init_feature(f_cv_subtract_applied_force, "subtract applied force from total force", f_type_user); f_req_self(f_cv_subtract_applied_force, f_cv_total_force); + // There is no well-defined way to implement f_cv_subtract_applied_force + // in the case of extended-Lagrangian colvars + f_req_exclude(f_cv_subtract_applied_force, f_cv_extended_Lagrangian); init_feature(f_cv_lower_boundary, "lower boundary", f_type_user); f_req_self(f_cv_lower_boundary, f_cv_scalar); @@ -350,12 +522,21 @@ void colvardeps::init_cv_requires() { init_feature(f_cv_corrfunc, "correlation function", f_type_user); - init_feature(f_cv_scripted, "scripted", f_type_static); + init_feature(f_cv_scripted, "scripted", f_type_user); + + init_feature(f_cv_custom_function, "custom function", f_type_user); + f_req_exclude(f_cv_custom_function, f_cv_scripted); + init_feature(f_cv_periodic, "periodic", f_type_static); f_req_self(f_cv_periodic, f_cv_homogeneous); init_feature(f_cv_scalar, "scalar", f_type_static); init_feature(f_cv_linear, "linear", f_type_static); init_feature(f_cv_homogeneous, "homogeneous", f_type_static); + + // because total forces are obtained from the previous time step, + // we cannot (currently) have colvar values and total forces for the same timestep + init_feature(f_cv_multiple_ts, "multiple timestep colvar"); + f_req_exclude(f_cv_multiple_ts, f_cv_total_force_calc); } // Initialize feature_states for each instance @@ -365,23 +546,6 @@ void colvardeps::init_cv_requires() { // Most features are available, so we set them so // and list exceptions below } - -// // properties that may NOT be enabled as a dependency -// // This will be deprecated by feature types -// int unavailable_deps[] = { -// f_cv_lower_boundary, -// f_cv_upper_boundary, -// f_cv_extended_Lagrangian, -// f_cv_Langevin, -// f_cv_scripted, -// f_cv_periodic, -// f_cv_scalar, -// f_cv_linear, -// f_cv_homogeneous -// }; -// for (i = 0; i < sizeof(unavailable_deps) / sizeof(unavailable_deps[0]); i++) { -// feature_states[unavailable_deps[i]].available = false; -// } } @@ -401,20 +565,26 @@ void colvardeps::init_cvc_requires() { init_feature(f_cvc_gradient, "gradient", f_type_dynamic); + init_feature(f_cvc_implicit_gradient, "implicit gradient", f_type_static); + f_req_children(f_cvc_implicit_gradient, f_ag_implicit_gradient); + init_feature(f_cvc_inv_gradient, "inverse gradient", f_type_dynamic); f_req_self(f_cvc_inv_gradient, f_cvc_gradient); init_feature(f_cvc_debug_gradient, "debug gradient", f_type_user); f_req_self(f_cvc_debug_gradient, f_cvc_gradient); + f_req_exclude(f_cvc_debug_gradient, f_cvc_implicit_gradient); init_feature(f_cvc_Jacobian, "Jacobian derivative", f_type_dynamic); f_req_self(f_cvc_Jacobian, f_cvc_inv_gradient); init_feature(f_cvc_com_based, "depends on group centers of mass", f_type_static); + // init_feature(f_cvc_pbc_minimum_image, "use minimum-image distances with PBCs", f_type_user); + // Compute total force on first site only to avoid unwanted // coupling to other colvars (see e.g. Ciccotti et al., 2005) - init_feature(f_cvc_one_site_total_force, "compute total collective force only from one group center", f_type_user); + init_feature(f_cvc_one_site_total_force, "compute total force from one group", f_type_user); f_req_self(f_cvc_one_site_total_force, f_cvc_com_based); init_feature(f_cvc_scalable, "scalable calculation", f_type_static); @@ -438,11 +608,17 @@ void colvardeps::init_cvc_requires() { feature_states.push_back(feature_state(avail, false)); } + // CVCs are enabled from the start - get disabled based on flags + feature_states[f_cvc_active].enabled = true; + // Features that are implemented by all cvcs by default // Each cvc specifies what other features are available feature_states[f_cvc_active].available = true; feature_states[f_cvc_gradient].available = true; + // Use minimum-image distances by default + feature_states[f_cvc_pbc_minimum_image].enabled = true; + // Features that are implemented by default if their requirements are feature_states[f_cvc_one_site_total_force].available = true; @@ -464,8 +640,10 @@ void colvardeps::init_ag_requires() { init_feature(f_ag_center, "translational fit", f_type_static); init_feature(f_ag_rotate, "rotational fit", f_type_static); init_feature(f_ag_fitting_group, "reference positions group", f_type_static); - init_feature(f_ag_fit_gradient_group, "fit gradient for main group", f_type_static); - init_feature(f_ag_fit_gradient_ref, "fit gradient for reference group", f_type_static); + init_feature(f_ag_implicit_gradient, "implicit atom gradient", f_type_dynamic); + init_feature(f_ag_fit_gradients, "fit gradients", f_type_user); + f_req_exclude(f_ag_fit_gradients, f_ag_implicit_gradient); + init_feature(f_ag_atom_forces, "atomic forces", f_type_dynamic); // parallel calculation implies that we have at least a scalable center of mass, @@ -493,29 +671,50 @@ void colvardeps::init_ag_requires() { feature_states[f_ag_scalable_com].available = false; // TODO make f_ag_scalable depend on f_ag_scalable_com (or something else) feature_states[f_ag_scalable].available = true; + feature_states[f_ag_fit_gradients].available = true; + feature_states[f_ag_implicit_gradient].available = true; } void colvardeps::print_state() { size_t i; - cvm::log("Enabled features of " + description); + cvm::log("Enabled features of \"" + description + "\" (with reference count)"); for (i = 0; i < feature_states.size(); i++) { - if (feature_states[i].enabled) - cvm::log("- " + features()[i]->description); + if (is_enabled(i)) + cvm::log("- " + features()[i]->description + " (" + + cvm::to_str(feature_states[i].ref_count) + ")"); } + cvm::increase_depth(); for (i=0; iprint_state(); - cvm::decrease_depth(); } + cvm::decrease_depth(); } void colvardeps::add_child(colvardeps *child) { + children.push_back(child); child->parents.push_back((colvardeps *)this); + + // Solve dependencies of already enabled parent features + // in the new child + + size_t i, fid; + cvm::increase_depth(); + for (fid = 0; fid < feature_states.size(); fid++) { + if (is_enabled(fid)) { + for (i=0; irequires_children.size(); i++) { + int g = features()[fid]->requires_children[i]; + if (cvm::debug()) cvm::log("DEPS: re-enabling children's " + + child->features()[g]->description); + child->enable(g, false, false); + } + } + } + cvm::decrease_depth(); } diff --git a/lib/colvars/colvardeps.h b/lib/colvars/colvardeps.h index fd07cb6457..b810a5fca1 100644 --- a/lib/colvars/colvardeps.h +++ b/lib/colvars/colvardeps.h @@ -23,10 +23,14 @@ /// 3. Static features are static properties of the object, determined /// programatically at initialization time. /// +/// In all classes, feature 0 is active. When an object is inactivated +/// all its children dependencies are dereferenced (free_children_deps) +/// While the object is inactive, no dependency solving is done on children +/// it is done when the object is activated back (restore_children_deps) class colvardeps { public: - colvardeps() {} + colvardeps(); virtual ~colvardeps(); // Subclasses should initialize the following members: @@ -34,9 +38,10 @@ public: std::string description; // reference to object name (cv, cvc etc.) /// This contains the current state of each feature for each object + // since the feature class only contains static properties struct feature_state { feature_state(bool a, bool e) - : available(a), enabled(e) {} + : available(a), enabled(e), ref_count(0) {} /// Feature may be enabled, subject to possible dependencies bool available; @@ -44,9 +49,28 @@ public: /// TODO consider implications for dependency solving: anyone who disables /// it should trigger a refresh of parent objects bool enabled; // see if this should be private depending on implementation + // bool enabledOnce; // this should trigger an update when object is evaluated + + /// Number of features requiring this one as a dependency + /// When it falls to zero: + /// - a dynamic feature is disabled automatically + /// - other features may be disabled statically + int ref_count; + /// List of features that were enabled by this one + /// as part of an alternate requirement (for ref counting purposes) + /// This is necessary because we don't know which feature in the list + /// we enabled, otherwise + std::vector alternate_refs; }; +protected: + /// Time step multiplier (for coarse-timestep biases & colvars) + /// Biases and colvars will only be calculated at those times + /// (f_cvb_awake and f_cv_awake); a + /// Biases use this to apply "impulse" biasing forces at the outer timestep + /// Unused by lower-level objects (cvcs and atom groups) + int time_step_factor; private: /// List of the states of all features @@ -61,10 +85,13 @@ private: }; public: + /// \brief returns time_step_factor + inline int get_time_step_factor() const {return time_step_factor;} + /// Pair a numerical feature ID with a description and type void init_feature(int feature_id, const char *description, feature_type type = f_type_not_set); - /// Describes a feature and its dependecies + /// Describes a feature and its dependencies /// used in a static array within each subclass class feature { @@ -120,30 +147,16 @@ public: private: - // pointers to objects this object depends on - // list should be maintained by any code that modifies the object - // this could be secured by making lists of colvars / cvcs / atom groups private and modified through accessor functions + /// pointers to objects this object depends on + /// list should be maintained by any code that modifies the object + /// this could be secured by making lists of colvars / cvcs / atom groups private and modified through accessor functions std::vector children; - // pointers to objects that depend on this object - // the size of this array is in effect a reference counter + /// pointers to objects that depend on this object + /// the size of this array is in effect a reference counter std::vector parents; public: - // disabling a feature f: - // if parents depend on f, tell them to refresh / check that they are ok? - // if children provide features to satisfy f ONLY, disable that - - // When the state of this object has changed, recursively tell parents - // to enforce their dependencies -// void refresh_parents() { -// -// } - - // std::vector parents; // Needed to trigger a refresh if capabilities of this object change - - // End of members to be initialized by subclasses - // Checks whether given feature is enabled // Defaults to querying f_*_active inline bool is_enabled(int f = f_cv_active) const { @@ -161,9 +174,7 @@ public: /// dependencies will be checked by enable() void provide(int feature_id, bool truefalse = true); - /// Set the feature's enabled flag, without dependency check or resolution - /// To be used for static properties only - /// Checking for availability is up to the caller + /// Enable or disable, depending on flag value void set_enabled(int feature_id, bool truefalse = true); protected: @@ -178,31 +189,57 @@ protected: public: - int enable(int f, bool dry_run = false, bool toplevel = true); // enable a feature and recursively solve its dependencies - // dry_run is set to true to recursively test if a feature is available, without enabling it -// int disable(int f); + /// enable a feature and recursively solve its dependencies + /// for proper reference counting, one should not add + /// spurious calls to enable() + /// dry_run is set to true to recursively test if a feature is available, without enabling it + int enable(int f, bool dry_run = false, bool toplevel = true); + /// Disable a feature, decrease the reference count of its dependencies + /// and recursively disable them as applicable + int disable(int f); - /// This function is called whenever feature states are changed outside - /// of the object's control, that is, by parents - /// Eventually it may also be used when properties of children change - virtual int refresh_deps() { return COLVARS_OK; } + /// disable all enabled features to free their dependencies + /// to be done when deleting the object + /// Cannot be in the base class destructor because it needs the derived class features() + void free_children_deps(); + + /// re-enable children features (to be used when object becomes active) + void restore_children_deps(); + + /// Decrement the reference count of a feature + /// disabling it if it's dynamic and count reaches zero + int decr_ref_count(int f); + + /// Implements possible actions to be carried out + /// when a given feature is enabled + /// Base function does nothing, can be overloaded + virtual void do_feature_side_effects(int id) {} // NOTE that all feature enums should start with f_*_active enum features_biases { /// \brief Bias is active f_cvb_active, - f_cvb_apply_force, // will apply forces - f_cvb_get_total_force, // requires total forces - f_cvb_history_dependent, // depends on simulation history - f_cvb_scalar_variables, // requires scalar colvars - f_cvb_calc_pmf, // whether this bias will compute a PMF + /// \brief Bias is awake (active on its own accord) this timestep + f_cvb_awake, + /// \brief will apply forces + f_cvb_apply_force, + /// \brief requires total forces + f_cvb_get_total_force, + /// \brief depends on simulation history + f_cvb_history_dependent, + /// \brief requires scalar colvars + f_cvb_scalar_variables, + /// \brief whether this bias will compute a PMF + f_cvb_calc_pmf, f_cvb_ntot }; enum features_colvar { /// \brief Calculate colvar f_cv_active, + /// \brief Colvar is awake (active on its own accord) this timestep + f_cv_awake, /// \brief Gradients are calculated and temporarily stored, so /// that external forces can be applied f_cv_gradient, @@ -254,12 +291,16 @@ public: f_cv_corrfunc, /// \brief Value and gradient computed by user script f_cv_scripted, + /// \brief Value and gradient computed by user function through Lepton + f_cv_custom_function, /// \brief Colvar is periodic f_cv_periodic, /// \brief is scalar f_cv_scalar, f_cv_linear, f_cv_homogeneous, + /// \brief multiple timestep through time_step_factor + f_cv_multiple_ts, /// \brief Number of colvar features f_cv_ntot }; @@ -268,10 +309,13 @@ public: f_cvc_active, f_cvc_scalar, f_cvc_gradient, + /// \brief CVC doesn't calculate and store explicit atom gradients + f_cvc_implicit_gradient, f_cvc_inv_gradient, /// \brief If enabled, calc_gradients() will call debug_gradients() for every group needed f_cvc_debug_gradient, f_cvc_Jacobian, + f_cvc_pbc_minimum_image, f_cvc_one_site_total_force, f_cvc_com_based, f_cvc_scalable, @@ -287,9 +331,9 @@ public: /// Perform a standard minimum msd fit for given atoms /// ie. not using refpositionsgroup // f_ag_min_msd_fit, - f_ag_fit_gradient_group,// TODO check that these are sometimes needed separately - // maybe for minimum RMSD? - f_ag_fit_gradient_ref, + /// \brief Does not have explicit atom gradients from parent CVC + f_ag_implicit_gradient, + f_ag_fit_gradients, f_ag_atom_forces, f_ag_scalable, f_ag_scalable_com, diff --git a/lib/colvars/colvargrid.cpp b/lib/colvars/colvargrid.cpp index 3b25acd2ef..9016e2c23a 100644 --- a/lib/colvars/colvargrid.cpp +++ b/lib/colvars/colvargrid.cpp @@ -144,7 +144,8 @@ void colvar_grid_gradient::write_1D_integral(std::ostream &os) os << "# xi A(xi)\n"; if ( cv.size() != 1 ) { - cvm::fatal_error("Cannot write integral for multi-dimensional gradient grids."); + cvm::error("Cannot write integral for multi-dimensional gradient grids."); + return; } integral = 0.0; diff --git a/lib/colvars/colvargrid.h b/lib/colvars/colvargrid.h index d4b9295c6e..6f06cb1066 100644 --- a/lib/colvars/colvargrid.h +++ b/lib/colvars/colvargrid.h @@ -198,7 +198,6 @@ public: /// Default constructor colvar_grid() : has_data(false) { - save_delimiters = false; nd = nt = 0; mult = 1; this->setup(); @@ -225,7 +224,6 @@ public: widths(g.widths), has_data(false) { - save_delimiters = false; } /// \brief Constructor from explicit grid sizes \param nx_i Number @@ -237,7 +235,6 @@ public: size_t mult_i = 1) : has_data(false) { - save_delimiters = false; this->setup(nx_i, t, mult_i); } @@ -248,7 +245,6 @@ public: bool margin = false) : has_data(false) { - save_delimiters = false; this->init_from_colvars(colvars, t, mult_i, margin); } @@ -840,7 +836,7 @@ public: // reallocate the array in case the grid params have just changed if (new_params) { init_from_boundaries(); - // data.resize(0); // no longer needed: setup calls clear() + // data.clear(); // no longer needed: setup calls clear() return this->setup(nx, T(), mult); } diff --git a/lib/colvars/colvarmodule.cpp b/lib/colvars/colvarmodule.cpp index 10cd3c0e47..780dc28afa 100644 --- a/lib/colvars/colvarmodule.cpp +++ b/lib/colvars/colvarmodule.cpp @@ -21,10 +21,14 @@ #include "colvarbias_meta.h" #include "colvarbias_restraint.h" #include "colvarscript.h" +#include "colvaratoms.h" colvarmodule::colvarmodule(colvarproxy *proxy_in) { + depth_s = 0; + cv_traj_os = NULL; + // pointer to the proxy object if (proxy == NULL) { proxy = proxy_in; @@ -33,12 +37,10 @@ colvarmodule::colvarmodule(colvarproxy *proxy_in) // TODO relax this error to handle multiple molecules in VMD // once the module is not static anymore cvm::error("Error: trying to allocate the collective " - "variable module twice.\n"); + "variable module twice.\n", BUG_ERROR); return; } - depth_s = 0; - cvm::log(cvm::line_marker); cvm::log("Initializing the collective variables module, version "+ cvm::to_str(COLVARS_VERSION)+".\n"); @@ -222,9 +224,9 @@ int colvarmodule::parse_config(std::string &conf) // update any necessary proxy data proxy->setup(); - if (cv_traj_os.is_open()) { + if (cv_traj_os != NULL) { // configuration might have changed, better redo the labels - write_traj_label(cv_traj_os); + write_traj_label(*cv_traj_os); } return get_error(); @@ -295,7 +297,7 @@ int colvarmodule::parse_colvars(std::string const &conf) std::string colvar_conf = ""; size_t pos = 0; - while (parse->key_lookup(conf, "colvar", colvar_conf, pos)) { + while (parse->key_lookup(conf, "colvar", &colvar_conf, &pos)) { if (colvar_conf.size()) { cvm::log(cvm::line_marker); @@ -350,7 +352,7 @@ int colvarmodule::parse_biases_type(std::string const &conf, { std::string bias_conf = ""; size_t conf_saved_pos = 0; - while (parse->key_lookup(conf, keyword, bias_conf, conf_saved_pos)) { + while (parse->key_lookup(conf, keyword, &bias_conf, &conf_saved_pos)) { if (bias_conf.size()) { cvm::log(cvm::line_marker); cvm::increase_depth(); @@ -409,12 +411,6 @@ int colvarmodule::parse_biases(std::string const &conf) size_t i; - for (i = 0; i < biases.size(); i++) { - biases[i]->enable(colvardeps::f_cvb_active); - if (cvm::debug()) - biases[i]->print_state(); - } - size_t n_hist_dep_biases = 0; std::vector hist_dep_biases_names; for (i = 0; i < biases.size(); i++) { @@ -487,7 +483,8 @@ int colvarmodule::catch_input_errors(int result) } -colvarbias * colvarmodule::bias_by_name(std::string const &name) { +colvarbias * colvarmodule::bias_by_name(std::string const &name) +{ colvarmodule *cv = cvm::main(); for (std::vector::iterator bi = cv->biases.begin(); bi != cv->biases.end(); @@ -500,7 +497,8 @@ colvarbias * colvarmodule::bias_by_name(std::string const &name) { } -colvar *colvarmodule::colvar_by_name(std::string const &name) { +colvar *colvarmodule::colvar_by_name(std::string const &name) +{ colvarmodule *cv = cvm::main(); for (std::vector::iterator cvi = cv->colvars.begin(); cvi != cv->colvars.end(); @@ -513,6 +511,20 @@ colvar *colvarmodule::colvar_by_name(std::string const &name) { } +cvm::atom_group *colvarmodule::atom_group_by_name(std::string const &name) +{ + colvarmodule *cv = cvm::main(); + for (std::vector::iterator agi = cv->named_atom_groups.begin(); + agi != cv->named_atom_groups.end(); + agi++) { + if ((*agi)->name == name) { + return (*agi); + } + } + return NULL; +} + + int colvarmodule::change_configuration(std::string const &bias_name, std::string const &conf) { @@ -521,7 +533,10 @@ int colvarmodule::change_configuration(std::string const &bias_name, cvm::increase_depth(); colvarbias *b; b = bias_by_name(bias_name); - if (b == NULL) { cvm::error("Error: bias not found: " + bias_name); } + if (b == NULL) { + cvm::error("Error: bias not found: " + bias_name); + return COLVARS_ERROR; + } b->change_configuration(conf); cvm::decrease_depth(); return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); @@ -534,7 +549,10 @@ std::string colvarmodule::read_colvar(std::string const &name) colvar *c; std::stringstream ss; c = colvar_by_name(name); - if (c == NULL) { cvm::fatal_error("Error: colvar not found: " + name); } + if (c == NULL) { + cvm::error("Error: colvar not found: " + name); + return std::string(); + } ss << c->value(); cvm::decrease_depth(); return ss.str(); @@ -547,7 +565,10 @@ cvm::real colvarmodule::energy_difference(std::string const &bias_name, colvarbias *b; cvm::real energy_diff = 0.; b = bias_by_name(bias_name); - if (b == NULL) { cvm::fatal_error("Error: bias not found: " + bias_name); } + if (b == NULL) { + cvm::error("Error: bias not found: " + bias_name); + return 0.; + } energy_diff = b->energy_difference(conf); cvm::decrease_depth(); return energy_diff; @@ -666,18 +687,36 @@ int colvarmodule::calc_colvars() cvm::log("Calculating collective variables.\n"); // calculate collective variables and their gradients + // First, we need to decide which biases are awake + // so they can activate colvars as needed + std::vector::iterator bi; + for (bi = biases.begin(); bi != biases.end(); bi++) { + int tsf = (*bi)->get_time_step_factor(); + if (tsf > 0 && (step_absolute() % tsf == 0)) { + (*bi)->enable(colvardeps::f_cvb_awake); + } else { + (*bi)->disable(colvardeps::f_cvb_awake); + } + } + int error_code = COLVARS_OK; std::vector::iterator cvi; // Determine which colvars are active at this iteration - variables_active()->resize(0); + variables_active()->clear(); variables_active()->reserve(variables()->size()); for (cvi = variables()->begin(); cvi != variables()->end(); cvi++) { - // This is a dynamic feature - the next call should be to enable() - // or disable() when dynamic dependency resolution is fully implemented - (*cvi)->set_enabled(colvardeps::f_cv_active, - step_absolute() % (*cvi)->get_time_step_factor() == 0); - variables_active()->push_back(*cvi); + // Wake up or put to sleep variables + int tsf = (*cvi)->get_time_step_factor(); + if (tsf > 0 && (step_absolute() % tsf == 0)) { + (*cvi)->enable(colvardeps::f_cv_awake); + } else { + (*cvi)->disable(colvardeps::f_cv_awake); + } + + if ((*cvi)->is_enabled()) { + variables_active()->push_back(*cvi); + } } // if SMP support is available, split up the work @@ -685,8 +724,8 @@ int colvarmodule::calc_colvars() // first, calculate how much work (currently, how many active CVCs) each colvar has - variables_active_smp()->resize(0); - variables_active_smp_items()->resize(0); + variables_active_smp()->clear(); + variables_active_smp_items()->clear(); variables_active_smp()->reserve(variables_active()->size()); variables_active_smp_items()->reserve(variables_active()->size()); @@ -748,7 +787,8 @@ int colvarmodule::calc_biases() total_bias_energy = 0.0; // update the list of active biases - biases_active()->resize(0); + // which may have changed based on f_cvb_awake in calc_colvars() + biases_active()->clear(); biases_active()->reserve(biases.size()); for (bi = biases.begin(); bi != biases.end(); bi++) { if ((*bi)->is_enabled()) { @@ -828,8 +868,7 @@ int colvarmodule::update_colvar_forces() "of colvars (if they have any).\n"); cvm::increase_depth(); for (cvi = variables()->begin(); cvi != variables()->end(); cvi++) { - // Here we call even inactive colvars, so they accumulate biasing forces - // as well as update their extended-system dynamics + // Inactive colvars will only reset their forces and return 0 energy total_colvar_energy += (*cvi)->update_forces_energy(); if (cvm::get_error()) { return COLVARS_ERROR; @@ -883,11 +922,13 @@ int colvarmodule::write_restart_files() ((cvm::step_absolute() % restart_out_freq) == 0) ) { cvm::log("Writing the state file \""+ restart_out_name+"\".\n"); - proxy->backup_file(restart_out_name.c_str()); - restart_out_os.open(restart_out_name.c_str()); - if (!restart_out_os.is_open() || !write_restart(restart_out_os)) - cvm::error("Error: in writing restart file.\n"); - restart_out_os.close(); + proxy->backup_file(restart_out_name); + std::ostream *restart_out_os = proxy->output_stream(restart_out_name); + if (!restart_out_os) return cvm::get_error(); + if (!write_restart(*restart_out_os)) { + return cvm::error("Error: in writing restart file.\n", FILE_ERROR); + } + proxy->close_output_stream(restart_out_name); } return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); @@ -896,26 +937,26 @@ int colvarmodule::write_restart_files() int colvarmodule::write_traj_files() { - if (!cv_traj_os.is_open()) { + if (cv_traj_os == NULL) { open_traj_file(cv_traj_name); } // write labels in the traj file every 1000 lines and at first timestep if ((cvm::step_absolute() % (cv_traj_freq * 1000)) == 0 || cvm::step_relative() == 0) { - write_traj_label(cv_traj_os); + write_traj_label(*cv_traj_os); } if ((cvm::step_absolute() % cv_traj_freq) == 0) { - write_traj(cv_traj_os); + write_traj(*cv_traj_os); } - if (restart_out_freq && cv_traj_os.is_open()) { + if (restart_out_freq && (cv_traj_os != NULL)) { // flush the trajectory file if we are at the restart frequency if ( (cvm::step_relative() > 0) && ((cvm::step_absolute() % restart_out_freq) == 0) ) { cvm::log("Synchronizing (emptying the buffer of) trajectory file \""+ cv_traj_name+"\".\n"); - cv_traj_os.flush(); + proxy->flush_output_stream(cv_traj_os); } } @@ -1003,9 +1044,11 @@ int colvarmodule::reset() index_groups.clear(); index_group_names.clear(); - if (cv_traj_os.is_open()) { + proxy->reset(); + + if (cv_traj_os != NULL) { // Do not close file here, as we might not be done with it yet. - cv_traj_os.flush(); + proxy->flush_output_stream(cv_traj_os); } return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); @@ -1264,9 +1307,9 @@ int colvarmodule::write_output_files() } cvm::decrease_depth(); - if (cv_traj_os.is_open()) { - // do not close to avoid problems with multiple NAMD runs - cv_traj_os.flush(); + if (cv_traj_os != NULL) { + // do not close, there may be another run command + proxy->flush_output_stream(cv_traj_os); } return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); @@ -1380,9 +1423,10 @@ std::ostream & colvarmodule::write_restart(std::ostream &os) return os; } + int colvarmodule::open_traj_file(std::string const &file_name) { - if (cv_traj_os.is_open()) { + if (cv_traj_os != NULL) { return COLVARS_OK; } @@ -1390,36 +1434,35 @@ int colvarmodule::open_traj_file(std::string const &file_name) if (cv_traj_append) { cvm::log("Appending to colvar trajectory file \""+file_name+ "\".\n"); - cv_traj_os.open(file_name.c_str(), std::ios::app); + cv_traj_os = (cvm::proxy)->output_stream(file_name, std::ios::app); } else { cvm::log("Writing to colvar trajectory file \""+file_name+ "\".\n"); proxy->backup_file(file_name.c_str()); - cv_traj_os.open(file_name.c_str()); + cv_traj_os = (cvm::proxy)->output_stream(file_name); } - if (!cv_traj_os.is_open()) { + if (cv_traj_os == NULL) { cvm::error("Error: cannot write to file \""+file_name+"\".\n", FILE_ERROR); } - return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); + return cvm::get_error(); } + int colvarmodule::close_traj_file() { - if (cv_traj_os.is_open()) { - cv_traj_os.close(); + if (cv_traj_os != NULL) { + proxy->close_output_stream(cv_traj_name); + cv_traj_os = NULL; } - return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); + return cvm::get_error(); } + std::ostream & colvarmodule::write_traj_label(std::ostream &os) { - if (!os.good()) { - cvm::error("Cannot write to trajectory file."); - return os; - } os.setf(std::ios::scientific, std::ios::floatfield); os << "# " << cvm::wrap_string("step", cvm::it_width-2) @@ -1437,13 +1480,16 @@ std::ostream & colvarmodule::write_traj_label(std::ostream &os) (*bi)->write_traj_label(os); } os << "\n"; + if (cvm::debug()) { - os.flush(); + proxy->flush_output_stream(&os); } + cvm::decrease_depth(); return os; } + std::ostream & colvarmodule::write_traj(std::ostream &os) { os.setf(std::ios::scientific, std::ios::floatfield); @@ -1463,9 +1509,11 @@ std::ostream & colvarmodule::write_traj(std::ostream &os) (*bi)->write_traj(os); } os << "\n"; + if (cvm::debug()) { - os.flush(); + proxy->flush_output_stream(&os); } + cvm::decrease_depth(); return os; } @@ -1540,25 +1588,19 @@ void colvarmodule::clear_error() } -void cvm::error(std::string const &message, int code) +int colvarmodule::error(std::string const &message, int code) { set_error_bits(code); proxy->error(message); + return get_error(); } -void cvm::fatal_error(std::string const &message) +int colvarmodule::fatal_error(std::string const &message) { - // TODO once all non-fatal errors have been set to be handled by error(), - // set DELETE_COLVARS here for VMD to handle it set_error_bits(FATAL_ERROR); proxy->fatal_error(message); -} - - -void cvm::exit(std::string const &message) -{ - proxy->exit(message); + return get_error(); } diff --git a/lib/colvars/colvarmodule.h b/lib/colvars/colvarmodule.h index b4f80e0b5e..0f6efd14c4 100644 --- a/lib/colvars/colvarmodule.h +++ b/lib/colvars/colvarmodule.h @@ -10,9 +10,7 @@ #ifndef COLVARMODULE_H #define COLVARMODULE_H -#ifndef COLVARS_VERSION -#define COLVARS_VERSION "2017-03-09" -#endif +#include "colvars_version.h" #ifndef COLVARS_DEBUG #define COLVARS_DEBUG false @@ -54,11 +52,6 @@ You can browse the class hierarchy or the list of source files. #include #include -#ifdef NAMD_VERSION -// use Lustre-friendly wrapper to POSIX write() -#include "fstream_namd.h" -#endif - class colvarparse; class colvar; class colvarbias; @@ -188,7 +181,13 @@ private: /// Indexes of the items to calculate for each colvar std::vector colvars_smp_items; + /// Array of named atom groups + std::vector named_atom_groups; public: + /// Register a named atom group into named_atom_groups + inline void register_named_atom_group(atom_group * ag) { + named_atom_groups.push_back(ag); + } /// Array of collective variables std::vector *variables(); @@ -319,12 +318,6 @@ public: /// (Re)initialize the output trajectory and state file (does not write it yet) int setup_output(); -#ifdef NAMD_VERSION - typedef ofstream_namd ofstream; -#else - typedef std::ofstream ofstream; -#endif - /// Read the input restart file std::istream & read_restart(std::istream &is); /// Write the output restart file @@ -332,7 +325,7 @@ public: /// Open a trajectory file if requested (and leave it open) int open_traj_file(std::string const &file_name); - /// Close it + /// Close it (note: currently unused) int close_traj_file(); /// Write in the trajectory file std::ostream & write_traj(std::ostream &os); @@ -354,6 +347,9 @@ public: /// Look up a colvar by name; returns NULL if not found static colvar * colvar_by_name(std::string const &name); + /// Look up a named atom group by name; returns NULL if not found + static atom_group * atom_group_by_name(std::string const &name); + /// Load new configuration for the given bias - /// currently works for harmonic (force constant and/or centers) int change_configuration(std::string const &bias_name, std::string const &conf); @@ -452,10 +448,10 @@ public: static void log(std::string const &message); /// Print a message to the main log and exit with error code - static void fatal_error(std::string const &message); + static int fatal_error(std::string const &message); /// Print a message to the main log and set global error code - static void error(std::string const &message, int code = COLVARS_ERROR); + static int error(std::string const &message, int code = COLVARS_ERROR); /// Print a message to the main log and exit normally static void exit(std::string const &message); @@ -471,8 +467,7 @@ public: /// \brief Get the distance between two atomic positions with pbcs handled /// correctly static rvector position_distance(atom_pos const &pos1, - atom_pos const &pos2); - + atom_pos const &pos2); /// \brief Get the square distance between two positions (with /// periodic boundary conditions handled transparently) @@ -481,21 +476,7 @@ public: /// an analytical square distance (while taking the square of /// position_distance() would produce leads to a cusp) static real position_dist2(atom_pos const &pos1, - atom_pos const &pos2); - - /// \brief Get the closest periodic image to a reference position - /// \param pos The position to look for the closest periodic image - /// \param ref_pos (optional) The reference position - static void select_closest_image(atom_pos &pos, - atom_pos const &ref_pos); - - /// \brief Perform select_closest_image() on a set of atomic positions - /// - /// After that, distance vectors can then be calculated directly, - /// without using position_distance() - static void select_closest_images(std::vector &pos, - atom_pos const &ref_pos); - + atom_pos const &pos2); /// \brief Names of groups from a Gromacs .ndx file to be read at startup std::list index_group_names; @@ -556,14 +537,11 @@ protected: std::string cv_traj_name; /// Collective variables output trajectory file - colvarmodule::ofstream cv_traj_os; + std::ostream *cv_traj_os; /// Appending to the existing trajectory file? bool cv_traj_append; - /// Output restart file - colvarmodule::ofstream restart_out_os; - private: /// Counter for the current depth in the object hierarchy (useg e.g. in output) @@ -704,18 +682,6 @@ inline void cvm::request_total_force() proxy->request_total_force(true); } -inline void cvm::select_closest_image(atom_pos &pos, - atom_pos const &ref_pos) -{ - proxy->select_closest_image(pos, ref_pos); -} - -inline void cvm::select_closest_images(std::vector &pos, - atom_pos const &ref_pos) -{ - proxy->select_closest_images(pos, ref_pos); -} - inline cvm::rvector cvm::position_distance(atom_pos const &pos1, atom_pos const &pos2) { diff --git a/lib/colvars/colvarparse.cpp b/lib/colvars/colvarparse.cpp index 8055d925db..9f333b7b76 100644 --- a/lib/colvars/colvarparse.cpp +++ b/lib/colvars/colvarparse.cpp @@ -17,10 +17,7 @@ // space & tab -std::string const colvarparse::white_space = " \t"; - -std::string colvarparse::dummy_string = ""; -size_t colvarparse::dummy_pos = 0; +char const * const colvarparse::white_space = " \t"; // definition of single-value keyword parsers @@ -37,7 +34,7 @@ template bool colvarparse::_get_keyval_scalar_(std::string const do { std::string data_this = ""; - b_found = key_lookup(conf, key, data_this, save_pos); + b_found = key_lookup(conf, key, &data_this, &save_pos); if (b_found) { if (!b_found_any) b_found_any = true; @@ -92,7 +89,7 @@ bool colvarparse::_get_keyval_scalar_string_(std::string const &conf, do { std::string data_this = ""; - b_found = key_lookup(conf, key, data_this, save_pos); + b_found = key_lookup(conf, key, &data_this, &save_pos); if (b_found) { if (!b_found_any) b_found_any = true; @@ -156,7 +153,7 @@ template bool colvarparse::_get_keyval_vector_(std::string const do { std::string data_this = ""; - b_found = key_lookup(conf, key, data_this, save_pos); + b_found = key_lookup(conf, key, &data_this, &save_pos); if (b_found) { if (!b_found_any) b_found_any = true; @@ -313,7 +310,7 @@ bool colvarparse::get_keyval(std::string const &conf, do { std::string data_this = ""; - b_found = key_lookup(conf, key, data_this, save_pos); + b_found = key_lookup(conf, key, &data_this, &save_pos); if (b_found) { if (!b_found_any) b_found_any = true; @@ -552,8 +549,8 @@ std::istream & colvarparse::getline_nocomments(std::istream &is, bool colvarparse::key_lookup(std::string const &conf, char const *key_in, - std::string &data, - size_t &save_pos) + std::string *data, + size_t *save_pos) { if (cvm::debug()) { cvm::log("Looking for the keyword \""+std::string(key_in)+"\" and its value.\n"); @@ -570,14 +567,12 @@ bool colvarparse::key_lookup(std::string const &conf, std::string const conf_lower(to_lower_cppstr(conf)); // by default, there is no value, unless we found one - data = ""; - - // when the function is invoked without save_pos, ensure that we - // start from zero - colvarparse::dummy_pos = 0; + if (data != NULL) { + data->clear(); + } // start from the first occurrence of key - size_t pos = conf_lower.find(key, save_pos); + size_t pos = conf_lower.find(key, (save_pos != NULL) ? *save_pos : 0); // iterate over all instances of the substring until it finds it as isolated keyword while (true) { @@ -593,7 +588,7 @@ bool colvarparse::key_lookup(std::string const &conf, bool b_isolated_left = true, b_isolated_right = true; if (pos > 0) { - if ( std::string("\n"+white_space+ + if ( std::string("\n"+std::string(white_space)+ "}").find(conf[pos-1]) == std::string::npos ) { // none of the valid delimiting characters is on the left of key @@ -602,7 +597,7 @@ bool colvarparse::key_lookup(std::string const &conf, } if (pos < conf.size()-key.size()-1) { - if ( std::string("\n"+white_space+ + if ( std::string("\n"+std::string(white_space)+ "{").find(conf[pos+key.size()]) == std::string::npos ) { // none of the valid delimiting characters is on the right of key @@ -625,9 +620,11 @@ bool colvarparse::key_lookup(std::string const &conf, } } + if (save_pos != NULL) { // save the pointer for a future call (when iterating over multiple // valid instances of the same keyword) - save_pos = pos + key.size(); + *save_pos = pos + key.size(); + } // get the remainder of the line size_t pl = conf.rfind("\n", pos); @@ -716,19 +713,21 @@ bool colvarparse::key_lookup(std::string const &conf, data_end) + 1; } - data.append(line, data_begin, (data_end-data_begin)); + if (data != NULL) { + data->append(line, data_begin, (data_end-data_begin)); - if (cvm::debug()) { - cvm::log("Keyword value = \""+data+"\".\n"); - } + if (cvm::debug()) { + cvm::log("Keyword value = \""+*data+"\".\n"); + } - if (data.size() && save_delimiters) { - data_begin_pos.push_back(conf.find(data, pos+key.size())); - data_end_pos.push_back(data_begin_pos.back()+data.size()); + if (data->size()) { + data_begin_pos.push_back(conf.find(*data, pos+key.size())); + data_end_pos.push_back(data_begin_pos.back()+data->size()); + } } } - save_pos = line_end; + if (save_pos != NULL) *save_pos = line_end; return true; } diff --git a/lib/colvars/colvarparse.h b/lib/colvars/colvarparse.h index 9f116caafd..9389bc49da 100644 --- a/lib/colvars/colvarparse.h +++ b/lib/colvars/colvarparse.h @@ -24,7 +24,7 @@ /// need to parse input inherit from this class colvarparse { -protected: +private: /// \brief List of legal keywords for this object: this is updated /// by each call to colvarparse::get_keyval() or @@ -41,14 +41,6 @@ protected: /// values before the keyword check is performed std::list data_end_pos; - /// \brief Whether or not to accumulate data_begin_pos and - /// data_end_pos in key_lookup(); it may be useful to disable - /// this after the constructor is called, because other files may be - /// read (e.g. restart) that would mess up the registry; in any - /// case, nothing serious happens until check_keywords() is invoked - /// (which should happen only right after construction) - bool save_delimiters; - /// \brief Add a new valid keyword to the list void add_keyword(char const *key); @@ -62,14 +54,12 @@ public: inline colvarparse() - : save_delimiters(true) { init(); } /// Constructor that stores the object's config string inline colvarparse(const std::string& conf) - : save_delimiters(true) { init(conf); } @@ -115,8 +105,6 @@ public: /// \brief Use this after parsing a config string (note that check_keywords() calls it already) void clear_keyword_registry(); -public: - /// \fn get_keyval bool const get_keyval (std::string const &conf, /// char const *key, _type_ &value, _type_ const &def_value, /// Parse_Mode const parse_mode) \brief Helper function to parse @@ -282,7 +270,7 @@ public: /// Accepted white space delimiters, used in key_lookup() - static std::string const white_space; + static const char * const white_space; /// \brief Low-level function for parsing configuration strings; /// automatically adds the requested keyword to the list of valid @@ -293,13 +281,8 @@ public: /// within "conf", useful when doing multiple calls bool key_lookup(std::string const &conf, char const *key, - std::string &data = dummy_string, - size_t &save_pos = dummy_pos); - - /// Used as a default argument by key_lookup - static std::string dummy_string; - /// Used as a default argument by key_lookup - static size_t dummy_pos; + std::string *data = NULL, + size_t *save_pos = NULL); /// \brief Works as std::getline() but also removes everything /// between a comment character and the following newline diff --git a/lib/colvars/colvarproxy.cpp b/lib/colvars/colvarproxy.cpp new file mode 100644 index 0000000000..fa24091d52 --- /dev/null +++ b/lib/colvars/colvarproxy.cpp @@ -0,0 +1,492 @@ +// -*- c++ -*- + +// This file is part of the Collective Variables module (Colvars). +// The original version of Colvars and its updates are located at: +// https://github.com/colvars/colvars +// Please update all Colvars source files before making any changes. +// If you wish to distribute your changes, please submit them to the +// Colvars repository at GitHub. + +#include +#include + +#include "colvarmodule.h" +#include "colvarproxy.h" +#include "colvarscript.h" +#include "colvaratoms.h" + + + +colvarproxy_system::colvarproxy_system() {} + + +colvarproxy_system::~colvarproxy_system() {} + + +void colvarproxy_system::add_energy(cvm::real energy) {} + + +void colvarproxy_system::request_total_force(bool yesno) +{ + if (yesno == true) + cvm::error("Error: total forces are currently not implemented.\n", + COLVARS_NOT_IMPLEMENTED); +} + + +bool colvarproxy_system::total_forces_enabled() const +{ + return false; +} + + +cvm::real colvarproxy_system::position_dist2(cvm::atom_pos const &pos1, + cvm::atom_pos const &pos2) +{ + return (position_distance(pos1, pos2)).norm2(); +} + + + +colvarproxy_atoms::colvarproxy_atoms() {} + + +colvarproxy_atoms::~colvarproxy_atoms() +{ + reset(); +} + + +int colvarproxy_atoms::reset() +{ + atoms_ids.clear(); + atoms_ncopies.clear(); + atoms_masses.clear(); + atoms_charges.clear(); + atoms_positions.clear(); + atoms_total_forces.clear(); + atoms_new_colvar_forces.clear(); + return COLVARS_OK; +} + + +int colvarproxy_atoms::add_atom_slot(int atom_id) +{ + atoms_ids.push_back(atom_id); + atoms_ncopies.push_back(1); + atoms_masses.push_back(1.0); + atoms_charges.push_back(0.0); + atoms_positions.push_back(cvm::rvector(0.0, 0.0, 0.0)); + atoms_total_forces.push_back(cvm::rvector(0.0, 0.0, 0.0)); + atoms_new_colvar_forces.push_back(cvm::rvector(0.0, 0.0, 0.0)); + return (atoms_ids.size() - 1); +} + + +int colvarproxy_atoms::init_atom(cvm::residue_id const &residue, + std::string const &atom_name, + std::string const &segment_id) +{ + cvm::error("Error: initializing an atom by name and residue number is currently not supported.\n", + COLVARS_NOT_IMPLEMENTED); + return COLVARS_NOT_IMPLEMENTED; +} + + +int colvarproxy_atoms::check_atom_id(cvm::residue_id const &residue, + std::string const &atom_name, + std::string const &segment_id) +{ + colvarproxy_atoms::init_atom(residue, atom_name, segment_id); + return COLVARS_NOT_IMPLEMENTED; +} + + +void colvarproxy_atoms::clear_atom(int index) +{ + if (((size_t) index) >= atoms_ids.size()) { + cvm::error("Error: trying to disable an atom that was not previously requested.\n", + INPUT_ERROR); + } + if (atoms_ncopies[index] > 0) { + atoms_ncopies[index] -= 1; + } +} + + +int colvarproxy_atoms::load_atoms(char const *filename, + cvm::atom_group &atoms, + std::string const &pdb_field, + double const) +{ + return cvm::error("Error: loading atom identifiers from a file " + "is currently not implemented.\n", + COLVARS_NOT_IMPLEMENTED); +} + + +int colvarproxy_atoms::load_coords(char const *filename, + std::vector &pos, + const std::vector &indices, + std::string const &pdb_field, + double const) +{ + return cvm::error("Error: loading atomic coordinates from a file " + "is currently not implemented.\n", + COLVARS_NOT_IMPLEMENTED); +} + + + +colvarproxy_atom_groups::colvarproxy_atom_groups() {} + + +colvarproxy_atom_groups::~colvarproxy_atom_groups() +{ + reset(); +} + + +int colvarproxy_atom_groups::reset() +{ + atom_groups_ids.clear(); + atom_groups_ncopies.clear(); + atom_groups_masses.clear(); + atom_groups_charges.clear(); + atom_groups_coms.clear(); + atom_groups_total_forces.clear(); + atom_groups_new_colvar_forces.clear(); + return COLVARS_OK; +} + + +int colvarproxy_atom_groups::add_atom_group_slot(int atom_group_id) +{ + atom_groups_ids.push_back(atom_group_id); + atom_groups_ncopies.push_back(1); + atom_groups_masses.push_back(1.0); + atom_groups_charges.push_back(0.0); + atom_groups_coms.push_back(cvm::rvector(0.0, 0.0, 0.0)); + atom_groups_total_forces.push_back(cvm::rvector(0.0, 0.0, 0.0)); + atom_groups_new_colvar_forces.push_back(cvm::rvector(0.0, 0.0, 0.0)); + return (atom_groups_ids.size() - 1); +} + + +int colvarproxy_atom_groups::scalable_group_coms() +{ + return COLVARS_NOT_IMPLEMENTED; +} + + +int colvarproxy_atom_groups::init_atom_group(std::vector const &atoms_ids) +{ + cvm::error("Error: initializing a group outside of the Colvars module " + "is currently not supported.\n", + COLVARS_NOT_IMPLEMENTED); + return COLVARS_NOT_IMPLEMENTED; +} + + +void colvarproxy_atom_groups::clear_atom_group(int index) +{ + if (((size_t) index) >= atom_groups_ids.size()) { + cvm::error("Error: trying to disable an atom group " + "that was not previously requested.\n", + INPUT_ERROR); + } + if (atom_groups_ncopies[index] > 0) { + atom_groups_ncopies[index] -= 1; + } +} + + + +colvarproxy_smp::colvarproxy_smp() +{ + b_smp_active = true; +} + + +colvarproxy_smp::~colvarproxy_smp() {} + + +int colvarproxy_smp::smp_enabled() +{ + return COLVARS_NOT_IMPLEMENTED; +} + + +int colvarproxy_smp::smp_colvars_loop() +{ + return COLVARS_NOT_IMPLEMENTED; +} + + +int colvarproxy_smp::smp_biases_loop() +{ + return COLVARS_NOT_IMPLEMENTED; +} + + +int colvarproxy_smp::smp_biases_script_loop() +{ + return COLVARS_NOT_IMPLEMENTED; +} + + +int colvarproxy_smp::smp_thread_id() +{ + return COLVARS_NOT_IMPLEMENTED; +} + + +int colvarproxy_smp::smp_num_threads() +{ + return COLVARS_NOT_IMPLEMENTED; +} + + +int colvarproxy_smp::smp_lock() +{ + return COLVARS_OK; +} + + +int colvarproxy_smp::smp_trylock() +{ + return COLVARS_OK; +} + + +int colvarproxy_smp::smp_unlock() +{ + return COLVARS_OK; +} + + + + +colvarproxy_replicas::colvarproxy_replicas() {} + + +colvarproxy_replicas::~colvarproxy_replicas() {} + + +bool colvarproxy_replicas::replica_enabled() +{ + return false; +} + + +int colvarproxy_replicas::replica_index() +{ + return 0; +} + + +int colvarproxy_replicas::replica_num() +{ + return 1; +} + + +void colvarproxy_replicas::replica_comm_barrier() {} + + +int colvarproxy_replicas::replica_comm_recv(char* msg_data, + int buf_len, + int src_rep) +{ + return COLVARS_NOT_IMPLEMENTED; +} + + +int colvarproxy_replicas::replica_comm_send(char* msg_data, + int msg_len, + int dest_rep) +{ + return COLVARS_NOT_IMPLEMENTED; +} + + + + +colvarproxy_script::colvarproxy_script() +{ + script = NULL; +} + + +colvarproxy_script::~colvarproxy_script() {} + + +char *colvarproxy_script::script_obj_to_str(unsigned char *obj) +{ + return reinterpret_cast(obj); +} + + +int colvarproxy_script::run_force_callback() +{ + return COLVARS_NOT_IMPLEMENTED; +} + + +int colvarproxy_script::run_colvar_callback( + std::string const &name, + std::vector const &cvcs, + colvarvalue &value) +{ + return COLVARS_NOT_IMPLEMENTED; +} + + +int colvarproxy_script::run_colvar_gradient_callback( + std::string const &name, + std::vector const &cvcs, + std::vector > &gradient) +{ + return COLVARS_NOT_IMPLEMENTED; +} + + + + +colvarproxy_io::colvarproxy_io() {} + + +colvarproxy_io::~colvarproxy_io() {} + + +int colvarproxy_io::get_frame(long int&) +{ + return COLVARS_NOT_IMPLEMENTED; +} + + +int colvarproxy_io::set_frame(long int) +{ + return COLVARS_NOT_IMPLEMENTED; +} + + +std::ostream * colvarproxy_io::output_stream(std::string const &output_name, + std::ios_base::openmode mode) +{ + if (cvm::debug()) { + cvm::log("Using colvarproxy::output_stream()\n"); + } + std::list::iterator osi = output_files.begin(); + std::list::iterator osni = output_stream_names.begin(); + for ( ; osi != output_files.end(); osi++, osni++) { + if (*osni == output_name) { + return *osi; + } + } + if (!(mode & (std::ios_base::app | std::ios_base::ate))) { + backup_file(output_name); + } + std::ofstream *os = new std::ofstream(output_name.c_str(), mode); + if (!os->is_open()) { + cvm::error("Error: cannot write to file/channel \""+output_name+"\".\n", + FILE_ERROR); + return NULL; + } + output_stream_names.push_back(output_name); + output_files.push_back(os); + return os; +} + + +int colvarproxy_io::flush_output_stream(std::ostream *os) +{ + std::list::iterator osi = output_files.begin(); + std::list::iterator osni = output_stream_names.begin(); + for ( ; osi != output_files.end(); osi++, osni++) { + if (*osi == os) { + ((std::ofstream *) (*osi))->flush(); + return COLVARS_OK; + } + } + return cvm::error("Error: trying to flush an output file/channel " + "that wasn't open.\n", BUG_ERROR); +} + + +int colvarproxy_io::close_output_stream(std::string const &output_name) +{ + std::list::iterator osi = output_files.begin(); + std::list::iterator osni = output_stream_names.begin(); + for ( ; osi != output_files.end(); osi++, osni++) { + if (*osni == output_name) { + ((std::ofstream *) (*osi))->close(); + output_files.erase(osi); + output_stream_names.erase(osni); + return COLVARS_OK; + } + } + return cvm::error("Error: trying to close an output file/channel " + "that wasn't open.\n", BUG_ERROR); +} + + +int colvarproxy_io::backup_file(char const *filename) +{ + return COLVARS_NOT_IMPLEMENTED; +} + + + +colvarproxy::colvarproxy() +{ + colvars = NULL; + b_simulation_running = true; +} + + +colvarproxy::~colvarproxy() {} + + +int colvarproxy::reset() +{ + int error_code = COLVARS_OK; + error_code |= colvarproxy_atoms::reset(); + error_code |= colvarproxy_atom_groups::reset(); + return error_code; +} + + +int colvarproxy::setup() +{ + return COLVARS_OK; +} + + +int colvarproxy::update_input() +{ + return COLVARS_OK; +} + + +int colvarproxy::update_output() +{ + return COLVARS_OK; +} + + +size_t colvarproxy::restart_frequency() +{ + return 0; +} + + + + + + + + + + + diff --git a/lib/colvars/colvarproxy.h b/lib/colvars/colvarproxy.h index 5b216c9d41..95d13cd7e0 100644 --- a/lib/colvars/colvarproxy.h +++ b/lib/colvars/colvarproxy.h @@ -16,55 +16,36 @@ #include "colvarmodule.h" #include "colvarvalue.h" + +/// \file colvarproxy.h +/// \brief Colvars proxy classes +/// +/// This file declares the class for the object responsible for interfacing +/// Colvars with other codes (MD engines, VMD, Python). The \link colvarproxy +/// \endlink class is a derivative of multiple classes, each devoted to a +/// specific task (e.g. \link colvarproxy_atoms \endlink to access data for +/// individual atoms). +/// +/// To interface to a new MD engine, the simplest solution is to derive a new +/// class from \link colvarproxy \endlink. Currently implemented are: \link +/// colvarproxy_lammps, \endlink, \link colvarproxy_namd, \endlink, \link +/// colvarproxy_vmd, \endlink. + + // forward declarations class colvarscript; -/// \brief Interface between the collective variables module and -/// the simulation or analysis program (NAMD, VMD, LAMMPS...). -/// This is the base class: each interfaced program is supported by a derived class. -/// Only pure virtual functions ("= 0") must be reimplemented to ensure baseline functionality. -class colvarproxy { +/// Methods for accessing the simulation system (PBCs, integrator, etc) +class colvarproxy_system { public: - /// Pointer to the main object - colvarmodule *colvars; - /// Constructor - colvarproxy() - { - colvars = NULL; - b_simulation_running = true; - b_smp_active = true; - script = NULL; - } + colvarproxy_system(); /// Destructor - virtual ~colvarproxy() - {} - - /// (Re)initialize required member data after construction - virtual int setup() - { - return COLVARS_OK; - } - - /// \brief Update data required by the colvars module (e.g. cache atom positions) - /// - /// TODO Break up colvarproxy_namd and colvarproxy_lammps function into these - virtual int update_input() - { - return COLVARS_OK; - } - - /// \brief Update data based from the results of a module update (e.g. send forces) - virtual int update_output() - { - return COLVARS_OK; - } - - // **************** SIMULATION PARAMETERS **************** + virtual ~colvarproxy_system(); /// \brief Value of the unit for atomic coordinates with respect to /// angstroms (used by some variables for hard-coded default values) @@ -73,7 +54,7 @@ public: /// \brief Boltzmann constant virtual cvm::real boltzmann() = 0; - /// \brief Temperature of the simulation (K) + /// \brief Target temperature of the simulation (K units) virtual cvm::real temperature() = 0; /// \brief Time step of the simulation (fs) @@ -82,263 +63,9 @@ public: /// \brief Pseudo-random number with Gaussian distribution virtual cvm::real rand_gaussian(void) = 0; - /// \brief Get the current frame number - // Returns error code - virtual int get_frame(long int&) { return COLVARS_NOT_IMPLEMENTED; } - - /// \brief Set the current frame number (as well as colvarmodule::it) - // Returns error code - virtual int set_frame(long int) { return COLVARS_NOT_IMPLEMENTED; } - - /// \brief Prefix to be used for input files (restarts, not - /// configuration) - std::string input_prefix_str, output_prefix_str, restart_output_prefix_str; - - inline std::string & input_prefix() - { - return input_prefix_str; - } - - /// \brief Prefix to be used for output restart files - inline std::string restart_output_prefix() - { - return restart_output_prefix_str; - } - - /// \brief Prefix to be used for output files (final system - /// configuration) - inline std::string output_prefix() - { - return output_prefix_str; - } - - /// \brief Restarts will be written each time this number of steps has passed - virtual size_t restart_frequency() - { - return 0; - } - -protected: - - /// Whether a simulation is running (and try to prevent irrecovarable errors) - bool b_simulation_running; - -public: - - /// Whether a simulation is running (and try to prevent irrecovarable errors) - virtual bool simulation_running() const - { - return b_simulation_running; - } - -protected: - - /// \brief Currently opened output files: by default, these are ofstream objects. - /// Allows redefinition to implement different output mechanisms - std::list output_files; - /// \brief Identifiers for output_stream objects: by default, these are the names of the files - std::list output_stream_names; - -public: - - // ***************** SHARED-MEMORY PARALLELIZATION ***************** - - /// Whether threaded parallelization is available (TODO: make this a cvm::deps feature) - virtual int smp_enabled() - { - return COLVARS_NOT_IMPLEMENTED; - } - - /// Whether threaded parallelization should be used (TODO: make this a cvm::deps feature) - bool b_smp_active; - - /// Distribute calculation of colvars (and their components) across threads - virtual int smp_colvars_loop() - { - return COLVARS_NOT_IMPLEMENTED; - } - - /// Distribute calculation of biases across threads - virtual int smp_biases_loop() - { - return COLVARS_NOT_IMPLEMENTED; - } - - /// Distribute calculation of biases across threads 2nd through last, with all scripted biased on 1st thread - virtual int smp_biases_script_loop() - { - return COLVARS_NOT_IMPLEMENTED; - } - - /// Index of this thread - virtual int smp_thread_id() - { - return COLVARS_NOT_IMPLEMENTED; - } - - /// Number of threads sharing this address space - virtual int smp_num_threads() - { - return COLVARS_NOT_IMPLEMENTED; - } - - /// Lock the proxy's shared data for access by a thread, if threads are implemented; if not implemented, does nothing - virtual int smp_lock() - { - return COLVARS_OK; - } - - /// Attempt to lock the proxy's shared data - virtual int smp_trylock() - { - return COLVARS_OK; - } - - /// Release the lock - virtual int smp_unlock() - { - return COLVARS_OK; - } - - // **************** MULTIPLE REPLICAS COMMUNICATION **************** - - // Replica exchange commands: - - /// \brief Indicate if multi-replica support is available and active - virtual bool replica_enabled() { return false; } - - /// \brief Index of this replica - virtual int replica_index() { return 0; } - - /// \brief Total number of replica - virtual int replica_num() { return 1; } - - /// \brief Synchronize replica - virtual void replica_comm_barrier() {} - - /// \brief Receive data from other replica - virtual int replica_comm_recv(char* msg_data, int buf_len, int src_rep) { - return COLVARS_NOT_IMPLEMENTED; - } - - /// \brief Send data to other replica - virtual int replica_comm_send(char* msg_data, int msg_len, int dest_rep) { - return COLVARS_NOT_IMPLEMENTED; - } - - - // **************** SCRIPTING INTERFACE **************** - - /// Pointer to the scripting interface object - /// (does not need to be allocated in a new interface) - colvarscript *script; - - /// is a user force script defined? - bool force_script_defined; - - /// Do we have a scripting interface? - bool have_scripts; - - /// Run a user-defined colvar forces script - virtual int run_force_callback() { return COLVARS_NOT_IMPLEMENTED; } - - virtual int run_colvar_callback(std::string const &name, - std::vector const &cvcs, - colvarvalue &value) - { return COLVARS_NOT_IMPLEMENTED; } - - virtual int run_colvar_gradient_callback(std::string const &name, - std::vector const &cvcs, - std::vector > &gradient) - { return COLVARS_NOT_IMPLEMENTED; } - - - // **************** INPUT/OUTPUT **************** - - /// Print a message to the main log - virtual void log(std::string const &message) = 0; - - /// Print a message to the main log and let the rest of the program handle the error - virtual void error(std::string const &message) = 0; - - /// Print a message to the main log and exit with error code - virtual void fatal_error(std::string const &message) = 0; - - /// Print a message to the main log and exit normally - virtual void exit(std::string const &message) - { - cvm::error("Error: exiting without error is not implemented, returning error code.\n", - COLVARS_NOT_IMPLEMENTED); - } - - // TODO the following definitions may be moved to a .cpp file - - /// \brief Returns a reference to the given output channel; - /// if this is not open already, then open it - virtual std::ostream * output_stream(std::string const &output_name) - { - std::list::iterator osi = output_files.begin(); - std::list::iterator osni = output_stream_names.begin(); - for ( ; osi != output_files.end(); osi++, osni++) { - if (*osni == output_name) { - return *osi; - } - } - output_stream_names.push_back(output_name); - std::ofstream * os = new std::ofstream(output_name.c_str()); - if (!os->is_open()) { - cvm::error("Error: cannot write to file \""+output_name+"\".\n", - FILE_ERROR); - } - output_files.push_back(os); - return os; - } - - /// \brief Closes the given output channel - virtual int close_output_stream(std::string const &output_name) - { - std::list::iterator osi = output_files.begin(); - std::list::iterator osni = output_stream_names.begin(); - for ( ; osi != output_files.end(); osi++, osni++) { - if (*osni == output_name) { - ((std::ofstream *) (*osi))->close(); - output_files.erase(osi); - output_stream_names.erase(osni); - return COLVARS_OK; - } - } - cvm::error("Error: trying to close an output file or stream that wasn't open.\n", - BUG_ERROR); - return COLVARS_ERROR; - } - - /// \brief Rename the given file, before overwriting it - virtual int backup_file(char const *filename) - { - return COLVARS_NOT_IMPLEMENTED; - } - - - - // **************** ACCESS SYSTEM DATA **************** - /// Pass restraint energy value for current timestep to MD engine virtual void add_energy(cvm::real energy) = 0; - /// Tell the proxy whether total forces are needed (may not always be available) - virtual void request_total_force(bool yesno) - { - if (yesno == true) - cvm::error("Error: total forces are currently not implemented.\n", - COLVARS_NOT_IMPLEMENTED); - } - - /// Are total forces being used? - virtual bool total_forces_enabled() const - { - return false; - } - /// \brief Get the PBC-aware distance vector between two positions virtual cvm::rvector position_distance(cvm::atom_pos const &pos1, cvm::atom_pos const &pos2) = 0; @@ -346,107 +73,72 @@ public: /// \brief Get the PBC-aware square distance between two positions; /// may need to be reimplemented independently from position_distance() for optimization purposes virtual cvm::real position_dist2(cvm::atom_pos const &pos1, - cvm::atom_pos const &pos2) - { - return (position_distance(pos1, pos2)).norm2(); - } + cvm::atom_pos const &pos2); - /// \brief Get the closest periodic image to a reference position - /// \param pos The position to look for the closest periodic image - /// \param ref_pos The reference position - virtual void select_closest_image(cvm::atom_pos &pos, - cvm::atom_pos const &ref_pos) - { - pos = position_distance(ref_pos, pos) + ref_pos; - } + /// Tell the proxy whether total forces are needed (may not always be available) + virtual void request_total_force(bool yesno); - /// \brief Perform select_closest_image() on a set of atomic positions - /// - /// After that, distance vectors can then be calculated directly, - /// without using position_distance() - void select_closest_images(std::vector &pos, - cvm::atom_pos const &ref_pos) - { - for (std::vector::iterator pi = pos.begin(); - pi != pos.end(); ++pi) { - select_closest_image(*pi, ref_pos); - } - } + /// Are total forces being used? + virtual bool total_forces_enabled() const; +}; - // **************** ACCESS ATOMIC DATA **************** -protected: - - /// \brief Array of 0-based integers used to uniquely associate atoms - /// within the host program - std::vector atoms_ids; - /// \brief Keep track of how many times each atom is used by a separate colvar object - std::vector atoms_ncopies; - /// \brief Masses of the atoms (allow redefinition during a run, as done e.g. in LAMMPS) - std::vector atoms_masses; - /// \brief Charges of the atoms (allow redefinition during a run, as done e.g. in LAMMPS) - std::vector atoms_charges; - /// \brief Current three-dimensional positions of the atoms - std::vector atoms_positions; - /// \brief Most recent total forces on each atom - std::vector atoms_total_forces; - /// \brief Forces applied from colvars, to be communicated to the MD integrator - std::vector atoms_new_colvar_forces; - - /// Used by all init_atom() functions: create a slot for an atom not requested yet - inline int add_atom_slot(int atom_id) - { - atoms_ids.push_back(atom_id); - atoms_ncopies.push_back(1); - atoms_masses.push_back(1.0); - atoms_charges.push_back(0.0); - atoms_positions.push_back(cvm::rvector(0.0, 0.0, 0.0)); - atoms_total_forces.push_back(cvm::rvector(0.0, 0.0, 0.0)); - atoms_new_colvar_forces.push_back(cvm::rvector(0.0, 0.0, 0.0)); - return (atoms_ids.size() - 1); - } +/// \brief Container of atomic data for processing by Colvars +class colvarproxy_atoms { public: - /// Prepare this atom for collective variables calculation, selecting it by numeric index (1-based) + /// Constructor + colvarproxy_atoms(); + + /// Destructor + virtual ~colvarproxy_atoms(); + + /// Prepare this atom for collective variables calculation, selecting it by + /// numeric index (1-based) virtual int init_atom(int atom_number) = 0; - /// Check that this atom number is valid, but do not initialize the corresponding atom yet + /// Check that this atom number is valid, but do not initialize the + /// corresponding atom yet virtual int check_atom_id(int atom_number) = 0; - /// Select this atom for collective variables calculation, using name and residue number. - /// Not all programs support this: leave this function as is in those cases. + /// Select this atom for collective variables calculation, using name and + /// residue number. Not all programs support this: leave this function as + /// is in those cases. virtual int init_atom(cvm::residue_id const &residue, std::string const &atom_name, - std::string const &segment_id) - { - cvm::error("Error: initializing an atom by name and residue number is currently not supported.\n", - COLVARS_NOT_IMPLEMENTED); - return COLVARS_NOT_IMPLEMENTED; - } + std::string const &segment_id); /// Check that this atom is valid, but do not initialize it yet virtual int check_atom_id(cvm::residue_id const &residue, std::string const &atom_name, - std::string const &segment_id) - { - cvm::error("Error: initializing an atom by name and residue number is currently not supported.\n", - COLVARS_NOT_IMPLEMENTED); - return COLVARS_NOT_IMPLEMENTED; - } + std::string const &segment_id); /// \brief Used by the atom class destructor: rather than deleting the array slot /// (costly) set the corresponding atoms_ncopies to zero - virtual void clear_atom(int index) - { - if (((size_t) index) >= atoms_ids.size()) { - cvm::error("Error: trying to disable an atom that was not previously requested.\n", - INPUT_ERROR); - } - if (atoms_ncopies[index] > 0) { - atoms_ncopies[index] -= 1; - } - } + virtual void clear_atom(int index); + + /// \brief Read atom identifiers from a file \param filename name of + /// the file (usually a PDB) \param atoms array to which atoms read + /// from "filename" will be appended \param pdb_field (optiona) if + /// "filename" is a PDB file, use this field to determine which are + /// the atoms to be set + virtual int load_atoms(char const *filename, + cvm::atom_group &atoms, + std::string const &pdb_field, + double const pdb_field_value = 0.0); + + /// \brief Load the coordinates for a group of atoms from a file + /// (usually a PDB); if "pos" is already allocated, the number of its + /// elements must match the number of atoms in "filename" + virtual int load_coords(char const *filename, + std::vector &pos, + const std::vector &indices, + std::string const &pdb_field, + double const pdb_field_value = 0.0); + + /// Clear atomic data + int reset(); /// Get the numeric ID of the given atom (for the program) inline int get_atom_id(int index) const @@ -485,120 +177,95 @@ public: } /// Read the current velocity of the given atom - virtual cvm::rvector get_atom_velocity(int index) + inline cvm::rvector get_atom_velocity(int index) { - cvm::error("Error: reading the current velocity of an atom is not yet implemented.\n", + cvm::error("Error: reading the current velocity of an atom " + "is not yet implemented.\n", COLVARS_NOT_IMPLEMENTED); return cvm::rvector(0.0); } - // useful functions for data management outside this class - inline std::vector *modify_atom_ids() { return &atoms_ids; } - inline std::vector *modify_atom_masses() { return &atoms_masses; } - inline std::vector *modify_atom_charges() { return &atoms_charges; } - inline std::vector *modify_atom_positions() { return &atoms_positions; } - inline std::vector *modify_atom_total_forces() { return &atoms_total_forces; } - inline std::vector *modify_atom_new_colvar_forces() { return &atoms_new_colvar_forces; } - - /// \brief Read atom identifiers from a file \param filename name of - /// the file (usually a PDB) \param atoms array to which atoms read - /// from "filename" will be appended \param pdb_field (optiona) if - /// "filename" is a PDB file, use this field to determine which are - /// the atoms to be set - virtual int load_atoms(char const *filename, - cvm::atom_group &atoms, - std::string const &pdb_field, - double const pdb_field_value = 0.0) + inline std::vector *modify_atom_ids() { - cvm::error("Error: loading atom identifiers from a file is currently not implemented.\n", - COLVARS_NOT_IMPLEMENTED); - return COLVARS_NOT_IMPLEMENTED; + return &atoms_ids; } - /// \brief Load the coordinates for a group of atoms from a file - /// (usually a PDB); if "pos" is already allocated, the number of its - /// elements must match the number of atoms in "filename" - virtual int load_coords(char const *filename, - std::vector &pos, - const std::vector &indices, - std::string const &pdb_field, - double const pdb_field_value = 0.0) + inline std::vector *modify_atom_masses() { - cvm::error("Error: loading atomic coordinates from a file is currently not implemented.\n"); - return COLVARS_NOT_IMPLEMENTED; + return &atoms_masses; } - // **************** ACCESS GROUP DATA **************** + inline std::vector *modify_atom_charges() + { + return &atoms_charges; + } + + inline std::vector *modify_atom_positions() + { + return &atoms_positions; + } + + inline std::vector *modify_atom_total_forces() + { + return &atoms_total_forces; + } + + inline std::vector *modify_atom_new_colvar_forces() + { + return &atoms_new_colvar_forces; + } protected: - /// \brief Array of 0-based integers used to uniquely associate atom groups + /// \brief Array of 0-based integers used to uniquely associate atoms /// within the host program - std::vector atom_groups_ids; - /// \brief Keep track of how many times each group is used by a separate cvc - std::vector atom_groups_ncopies; - /// \brief Total masses of the atom groups - std::vector atom_groups_masses; - /// \brief Total charges of the atom groups (allow redefinition during a run, as done e.g. in LAMMPS) - std::vector atom_groups_charges; - /// \brief Current centers of mass of the atom groups - std::vector atom_groups_coms; - /// \brief Most recently updated total forces on the com of each group - std::vector atom_groups_total_forces; + std::vector atoms_ids; + /// \brief Keep track of how many times each atom is used by a separate colvar object + std::vector atoms_ncopies; + /// \brief Masses of the atoms (allow redefinition during a run, as done e.g. in LAMMPS) + std::vector atoms_masses; + /// \brief Charges of the atoms (allow redefinition during a run, as done e.g. in LAMMPS) + std::vector atoms_charges; + /// \brief Current three-dimensional positions of the atoms + std::vector atoms_positions; + /// \brief Most recent total forces on each atom + std::vector atoms_total_forces; /// \brief Forces applied from colvars, to be communicated to the MD integrator - std::vector atom_groups_new_colvar_forces; + std::vector atoms_new_colvar_forces; - /// TODO Add here containers of handles to cvc objects that are computed in parallel + /// Used by all init_atom() functions: create a slot for an atom not + /// requested yet; returns the index in the arrays + int add_atom_slot(int atom_id); + +}; + + +/// \brief Container of atom group data (allow collection of aggregated atomic +/// data) +class colvarproxy_atom_groups { public: - /// \brief Whether this proxy implementation has capability for scalable groups - virtual int scalable_group_coms() - { - return COLVARS_NOT_IMPLEMENTED; - } + /// Contructor + colvarproxy_atom_groups(); - /// Used by all init_atom_group() functions: create a slot for an atom group not requested yet - // TODO Add a handle to cvc objects - inline int add_atom_group_slot(int atom_group_id) - { - atom_groups_ids.push_back(atom_group_id); - atom_groups_ncopies.push_back(1); - atom_groups_masses.push_back(1.0); - atom_groups_charges.push_back(0.0); - atom_groups_coms.push_back(cvm::rvector(0.0, 0.0, 0.0)); - atom_groups_total_forces.push_back(cvm::rvector(0.0, 0.0, 0.0)); - atom_groups_new_colvar_forces.push_back(cvm::rvector(0.0, 0.0, 0.0)); - return (atom_groups_ids.size() - 1); - } + /// Destructor + virtual ~colvarproxy_atom_groups(); + + /// Clear atom group data + int reset(); + + /// \brief Whether this proxy implementation has capability for scalable groups + virtual int scalable_group_coms(); /// Prepare this group for collective variables calculation, selecting atoms by internal ids (0-based) - virtual int init_atom_group(std::vector const &atoms_ids) // TODO Add a handle to cvc objects - { - cvm::error("Error: initializing a group outside of the colvars module is currently not supported.\n", - COLVARS_NOT_IMPLEMENTED); - return COLVARS_NOT_IMPLEMENTED; - } + virtual int init_atom_group(std::vector const &atoms_ids); /// \brief Used by the atom_group class destructor - virtual void clear_atom_group(int index) - { - if (cvm::debug()) { - log("Trying to remove/disable atom group number "+cvm::to_str(index)+"\n"); - } - - if (((size_t) index) >= atom_groups_ids.size()) { - cvm::error("Error: trying to disable an atom group that was not previously requested.\n", - INPUT_ERROR); - } - - if (atom_groups_ncopies[index] > 0) { - atom_groups_ncopies[index] -= 1; - } - } + virtual void clear_atom_group(int index); /// Get the numeric ID of the given atom group (for the MD program) - inline cvm::real get_atom_group_id(int index) const + inline int get_atom_group_id(int index) const { return atom_groups_ids[index]; } @@ -634,13 +301,288 @@ public: } /// Read the current velocity of the given atom group - virtual cvm::rvector get_atom_group_velocity(int index) + inline cvm::rvector get_atom_group_velocity(int index) { cvm::error("Error: reading the current velocity of an atom group is not yet implemented.\n", COLVARS_NOT_IMPLEMENTED); return cvm::rvector(0.0); } +protected: + + /// \brief Array of 0-based integers used to uniquely associate atom groups + /// within the host program + std::vector atom_groups_ids; + /// \brief Keep track of how many times each group is used by a separate cvc + std::vector atom_groups_ncopies; + /// \brief Total masses of the atom groups + std::vector atom_groups_masses; + /// \brief Total charges of the atom groups (allow redefinition during a run, as done e.g. in LAMMPS) + std::vector atom_groups_charges; + /// \brief Current centers of mass of the atom groups + std::vector atom_groups_coms; + /// \brief Most recently updated total forces on the com of each group + std::vector atom_groups_total_forces; + /// \brief Forces applied from colvars, to be communicated to the MD integrator + std::vector atom_groups_new_colvar_forces; + + /// Used by all init_atom_group() functions: create a slot for an atom group not requested yet + int add_atom_group_slot(int atom_group_id); +}; + + +/// \brief Methods for SMP parallelization +class colvarproxy_smp { + +public: + + /// Constructor + colvarproxy_smp(); + + /// Destructor + virtual ~colvarproxy_smp(); + + /// Whether threaded parallelization should be used (TODO: make this a + /// cvm::deps feature) + bool b_smp_active; + + /// Whether threaded parallelization is available (TODO: make this a cvm::deps feature) + virtual int smp_enabled(); + + /// Distribute calculation of colvars (and their components) across threads + virtual int smp_colvars_loop(); + + /// Distribute calculation of biases across threads + virtual int smp_biases_loop(); + + /// Distribute calculation of biases across threads 2nd through last, with all scripted biased on 1st thread + virtual int smp_biases_script_loop(); + + /// Index of this thread + virtual int smp_thread_id(); + + /// Number of threads sharing this address space + virtual int smp_num_threads(); + + /// Lock the proxy's shared data for access by a thread, if threads are implemented; if not implemented, does nothing + virtual int smp_lock(); + + /// Attempt to lock the proxy's shared data + virtual int smp_trylock(); + + /// Release the lock + virtual int smp_unlock(); +}; + + +/// \brief Methods for multiple-replica communication +class colvarproxy_replicas { + +public: + + /// Constructor + colvarproxy_replicas(); + + /// Destructor + virtual ~colvarproxy_replicas(); + + /// \brief Indicate if multi-replica support is available and active + virtual bool replica_enabled(); + + /// \brief Index of this replica + virtual int replica_index(); + + /// \brief Total number of replica + virtual int replica_num(); + + /// \brief Synchronize replica + virtual void replica_comm_barrier(); + + /// \brief Receive data from other replica + virtual int replica_comm_recv(char* msg_data, int buf_len, int src_rep); + + /// \brief Send data to other replica + virtual int replica_comm_send(char* msg_data, int msg_len, int dest_rep); + +}; + + +/// Method for scripting language interface (Tcl or Python) +class colvarproxy_script { + +public: + + /// Constructor + colvarproxy_script(); + + /// Destructor + virtual ~colvarproxy_script(); + + /// Convert a script object (Tcl or Python call argument) to a C string + virtual char *script_obj_to_str(unsigned char *obj); + + /// Pointer to the scripting interface object + /// (does not need to be allocated in a new interface) + colvarscript *script; + + /// is a user force script defined? + bool force_script_defined; + + /// Do we have a scripting interface? + bool have_scripts; + + /// Run a user-defined colvar forces script + virtual int run_force_callback(); + + virtual int run_colvar_callback( + std::string const &name, + std::vector const &cvcs, + colvarvalue &value); + + virtual int run_colvar_gradient_callback( + std::string const &name, + std::vector const &cvcs, + std::vector > &gradient); +}; + + +/// Methods for data input/output +class colvarproxy_io { + +public: + + /// Constructor + colvarproxy_io(); + + /// Destructor + virtual ~colvarproxy_io(); + + /// \brief Save the current frame number in the argument given + // Returns error code + virtual int get_frame(long int &); + + /// \brief Set the current frame number (as well as colvarmodule::it) + // Returns error code + virtual int set_frame(long int); + + /// \brief Returns a reference to the given output channel; + /// if this is not open already, then open it + virtual std::ostream *output_stream(std::string const &output_name, + std::ios_base::openmode mode = + std::ios_base::out); + + /// \brief Flushes the given output channel + virtual int flush_output_stream(std::ostream *os); + + /// \brief Closes the given output channel + virtual int close_output_stream(std::string const &output_name); + + /// \brief Rename the given file, before overwriting it + virtual int backup_file(char const *filename); + + /// \brief Rename the given file, before overwriting it + inline int backup_file(std::string const &filename) + { + return backup_file(filename.c_str()); + } + + /// \brief Prefix of the input state file + inline std::string & input_prefix() + { + return input_prefix_str; + } + + /// \brief Prefix to be used for output restart files + inline std::string & restart_output_prefix() + { + return restart_output_prefix_str; + } + + /// \brief Prefix to be used for output files (final system + /// configuration) + inline std::string & output_prefix() + { + return output_prefix_str; + } + +protected: + + /// \brief Prefix to be used for input files (restarts, not + /// configuration) + std::string input_prefix_str, output_prefix_str, restart_output_prefix_str; + + /// \brief Currently opened output files: by default, these are ofstream objects. + /// Allows redefinition to implement different output mechanisms + std::list output_files; + /// \brief Identifiers for output_stream objects: by default, these are the names of the files + std::list output_stream_names; + +}; + + + +/// \brief Interface between the collective variables module and +/// the simulation or analysis program (NAMD, VMD, LAMMPS...). +/// This is the base class: each interfaced program is supported by a derived class. +/// Only pure virtual functions ("= 0") must be reimplemented to ensure baseline functionality. +class colvarproxy + : public colvarproxy_system, + public colvarproxy_atoms, + public colvarproxy_atom_groups, + public colvarproxy_smp, + public colvarproxy_replicas, + public colvarproxy_script, + public colvarproxy_io +{ + +public: + + /// Pointer to the main object + colvarmodule *colvars; + + /// Constructor + colvarproxy(); + + /// Destructor + virtual ~colvarproxy(); + + /// \brief Reset proxy state, e.g. requested atoms + virtual int reset(); + + /// (Re)initialize required member data after construction + virtual int setup(); + + /// \brief Update data required by the colvars module (e.g. cache atom positions) + /// + /// TODO Break up colvarproxy_namd and colvarproxy_lammps function into these + virtual int update_input(); + + /// \brief Update data based from the results of a module update (e.g. send forces) + virtual int update_output(); + + /// Print a message to the main log + virtual void log(std::string const &message) = 0; + + /// Print a message to the main log and let the rest of the program handle the error + virtual void error(std::string const &message) = 0; + + /// Print a message to the main log and exit with error code + virtual void fatal_error(std::string const &message) = 0; + + /// \brief Restarts will be written each time this number of steps has passed + virtual size_t restart_frequency(); + + /// Whether a simulation is running (warn against irrecovarable errors) + inline bool simulation_running() const + { + return b_simulation_running; + } + +protected: + + /// Whether a simulation is running (warn against irrecovarable errors) + bool b_simulation_running; + }; diff --git a/lib/colvars/colvars_version.h b/lib/colvars/colvars_version.h new file mode 100644 index 0000000000..e544756428 --- /dev/null +++ b/lib/colvars/colvars_version.h @@ -0,0 +1,8 @@ +#define COLVARS_VERSION "2017-07-15" +// This file is part of the Collective Variables module (Colvars). +// The original version of Colvars and its updates are located at: +// https://github.com/colvars/colvars +// Please update all Colvars source files before making any changes. +// If you wish to distribute your changes, please submit them to the +// Colvars repository at GitHub. + diff --git a/lib/colvars/colvarscript.cpp b/lib/colvars/colvarscript.cpp index f192dcb7c0..5bb2faae24 100644 --- a/lib/colvars/colvarscript.cpp +++ b/lib/colvars/colvarscript.cpp @@ -12,6 +12,7 @@ #include #include "colvarscript.h" +#include "colvarproxy.h" #include "colvardeps.h" @@ -27,7 +28,7 @@ extern "C" { // Generic hooks; NAMD and VMD have Tcl-specific versions in the respective proxies - int run_colvarscript_command(int argc, const char **argv) + int run_colvarscript_command(int objc, unsigned char *const objv[]) { colvarproxy *cvp = cvm::proxy; if (!cvp) { @@ -37,7 +38,7 @@ extern "C" { cvm::error("Called run_colvarscript_command without a script object initialized.\n"); return -1; } - return cvp->script->run(argc, argv); + return cvp->script->run(objc, objv); } const char * get_colvarscript_result() @@ -53,30 +54,52 @@ extern "C" { /// Run method based on given arguments -int colvarscript::run(int argc, char const *argv[]) { - - result = ""; +int colvarscript::run(int objc, unsigned char *const objv[]) +{ + result.clear(); if (cvm::debug()) { - cvm::log("Called script run with " + cvm::to_str(argc) + " args"); - for (int i = 0; i < argc; i++) { cvm::log(argv[i]); } + cvm::log("Called script run with " + cvm::to_str(objc) + " args:"); + for (int i = 0; i < objc; i++) { + cvm::log(obj_to_str(objv[i])); + } } - if (argc < 2) { + if (objc < 2) { result = help_string(); return COLVARS_OK; } - std::string cmd = argv[1]; + std::string const cmd(obj_to_str(objv[1])); int error_code = COLVARS_OK; if (cmd == "colvar") { - return proc_colvar(argc-1, &(argv[1])); + if (objc < 3) { + result = "Missing parameters\n" + help_string(); + return COLVARSCRIPT_ERROR; + } + std::string const name(obj_to_str(objv[2])); + colvar *cv = cvm::colvar_by_name(name); + if (cv == NULL) { + result = "Colvar not found: " + name; + return COLVARSCRIPT_ERROR; + } + return proc_colvar(cv, objc-1, &(objv[1])); } if (cmd == "bias") { - return proc_bias(argc-1, &(argv[1])); + if (objc < 3) { + result = "Missing parameters\n" + help_string(); + return COLVARSCRIPT_ERROR; + } + std::string const name(obj_to_str(objv[2])); + colvarbias *b = cvm::bias_by_name(name); + if (b == NULL) { + result = "Bias not found: " + name; + return COLVARSCRIPT_ERROR; + } + return proc_bias(b, objc-1, &(objv[1])); } if (cmd == "version") { @@ -102,20 +125,20 @@ int colvarscript::run(int argc, char const *argv[]) { error_code |= colvars->calc(); error_code |= proxy->update_output(); if (error_code) { - result += "Error updating the colvars module.\n"; + result += "Error updating the Colvars module.\n"; } return error_code; } if (cmd == "list") { - if (argc == 2) { + if (objc == 2) { for (std::vector::iterator cvi = colvars->colvars.begin(); cvi != colvars->colvars.end(); ++cvi) { result += (cvi == colvars->colvars.begin() ? "" : " ") + (*cvi)->name; } return COLVARS_OK; - } else if (argc == 3 && !strcmp(argv[2], "biases")) { + } else if (objc == 3 && !strcmp(obj_to_str(objv[2]), "biases")) { for (std::vector::iterator bi = colvars->biases.begin(); bi != colvars->biases.end(); ++bi) { @@ -130,11 +153,11 @@ int colvarscript::run(int argc, char const *argv[]) { /// Parse config from file if (cmd == "configfile") { - if (argc < 3) { + if (objc < 3) { result = "Missing arguments\n" + help_string(); return COLVARSCRIPT_ERROR; } - if (colvars->read_config_file(argv[2]) == COLVARS_OK) { + if (colvars->read_config_file(obj_to_str(objv[2])) == COLVARS_OK) { return COLVARS_OK; } else { result = "Error parsing configuration file"; @@ -144,11 +167,11 @@ int colvarscript::run(int argc, char const *argv[]) { /// Parse config from string if (cmd == "config") { - if (argc < 3) { + if (objc < 3) { result = "Missing arguments\n" + help_string(); return COLVARSCRIPT_ERROR; } - std::string conf = argv[2]; + std::string const conf(obj_to_str(objv[2])); if (colvars->read_config_string(conf) == COLVARS_OK) { return COLVARS_OK; } else { @@ -159,11 +182,11 @@ int colvarscript::run(int argc, char const *argv[]) { /// Load an input state file if (cmd == "load") { - if (argc < 3) { + if (objc < 3) { result = "Missing arguments\n" + help_string(); return COLVARSCRIPT_ERROR; } - proxy->input_prefix() = argv[2]; + proxy->input_prefix() = obj_to_str(objv[2]); if (colvars->setup_input() == COLVARS_OK) { return COLVARS_OK; } else { @@ -174,11 +197,11 @@ int colvarscript::run(int argc, char const *argv[]) { /// Save to an output state file if (cmd == "save") { - if (argc < 3) { + if (objc < 3) { result = "Missing arguments"; return COLVARSCRIPT_ERROR; } - proxy->output_prefix_str = argv[2]; + proxy->output_prefix() = obj_to_str(objv[2]); int error = 0; error |= colvars->setup_output(); error |= colvars->write_output_files(); @@ -200,7 +223,7 @@ int colvarscript::run(int argc, char const *argv[]) { } if (cmd == "frame") { - if (argc == 2) { + if (objc == 2) { long int f; int error = proxy->get_frame(f); if (error == COLVARS_OK) { @@ -210,10 +233,10 @@ int colvarscript::run(int argc, char const *argv[]) { result = "Frame number is not available"; return COLVARSCRIPT_ERROR; } - } else if (argc == 3) { + } else if (objc == 3) { // Failure of this function does not trigger an error, but // returns nonzero, to let scripts detect available frames - int error = proxy->set_frame(strtol(argv[2], NULL, 10)); + int error = proxy->set_frame(strtol(obj_to_str(objv[2]), NULL, 10)); result = cvm::to_str(error == COLVARS_OK ? 0 : -1); return COLVARS_OK; } else { @@ -223,8 +246,8 @@ int colvarscript::run(int argc, char const *argv[]) { } if (cmd == "addenergy") { - if (argc == 3) { - colvars->total_bias_energy += strtod(argv[2], NULL); + if (objc == 3) { + colvars->total_bias_energy += strtod(obj_to_str(objv[2]), NULL); return COLVARS_OK; } else { result = "Wrong arguments to command \"addenergy\"\n" + help_string(); @@ -237,19 +260,9 @@ int colvarscript::run(int argc, char const *argv[]) { } -int colvarscript::proc_colvar(int argc, char const *argv[]) { - if (argc < 3) { - result = "Missing parameters\n" + help_string(); - return COLVARSCRIPT_ERROR; - } +int colvarscript::proc_colvar(colvar *cv, int objc, unsigned char *const objv[]) { - std::string name = argv[1]; - colvar *cv = cvm::colvar_by_name(name); - if (cv == NULL) { - result = "Colvar not found: " + name; - return COLVARSCRIPT_ERROR; - } - std::string subcmd = argv[2]; + std::string const subcmd(obj_to_str(objv[2])); if (subcmd == "value") { result = (cv->value()).to_simple_string(); @@ -278,11 +291,11 @@ int colvarscript::proc_colvar(int argc, char const *argv[]) { for (i = 0; i < cv->biases.size(); i++) { delete cv->biases[i]; } - cv->biases.resize(0); + cv->biases.clear(); // colvar destructor is tasked with the cleanup delete cv; // TODO this could be done by the destructors - colvars->write_traj_label(colvars->cv_traj_os); + colvars->write_traj_label(*(colvars->cv_traj_os)); return COLVARS_OK; } @@ -308,11 +321,11 @@ int colvarscript::proc_colvar(int argc, char const *argv[]) { } if (subcmd == "addforce") { - if (argc < 4) { + if (objc < 4) { result = "addforce: missing parameter: force value\n" + help_string(); return COLVARSCRIPT_ERROR; } - std::string f_str = argv[3]; + std::string const f_str(obj_to_str(objv[3])); std::istringstream is(f_str); is.width(cvm::cv_width); is.precision(cvm::cv_prec); @@ -328,11 +341,11 @@ int colvarscript::proc_colvar(int argc, char const *argv[]) { } if (subcmd == "cvcflags") { - if (argc < 4) { + if (objc < 4) { result = "cvcflags: missing parameter: vector of flags"; return COLVARSCRIPT_ERROR; } - std::string flags_str = argv[3]; + std::string const flags_str(obj_to_str(objv[3])); std::istringstream is(flags_str); std::vector flags; @@ -351,7 +364,7 @@ int colvarscript::proc_colvar(int argc, char const *argv[]) { } if ((subcmd == "get") || (subcmd == "set") || (subcmd == "state")) { - return proc_features(cv, argc, argv); + return proc_features(cv, objc, objv); } result = "Syntax error\n" + help_string(); @@ -359,20 +372,10 @@ int colvarscript::proc_colvar(int argc, char const *argv[]) { } -int colvarscript::proc_bias(int argc, char const *argv[]) { - if (argc < 3) { - result = "Missing parameters\n" + help_string(); - return COLVARSCRIPT_ERROR; - } +int colvarscript::proc_bias(colvarbias *b, int objc, unsigned char *const objv[]) { - std::string name = argv[1]; - colvarbias *b = cvm::bias_by_name(name); - if (b == NULL) { - result = "Bias not found: " + name; - return COLVARSCRIPT_ERROR; - } - - std::string subcmd = argv[2]; + std::string const key(obj_to_str(objv[0])); + std::string const subcmd(obj_to_str(objv[2])); if (subcmd == "energy") { result = cvm::to_str(b->get_energy()); @@ -422,16 +425,16 @@ int colvarscript::proc_bias(int argc, char const *argv[]) { // the bias destructor takes care of the cleanup at cvm level delete b; // TODO this could be done by the destructors - colvars->write_traj_label(colvars->cv_traj_os); + colvars->write_traj_label(*(colvars->cv_traj_os)); return COLVARS_OK; } if ((subcmd == "get") || (subcmd == "set") || (subcmd == "state")) { - return proc_features(b, argc, argv); + return proc_features(b, objc, objv); } - if (argc >= 4) { - std::string param = argv[3]; + if (objc >= 4) { + std::string const param(obj_to_str(objv[3])); if (subcmd == "count") { int index; if (!(std::istringstream(param) >> index)) { @@ -452,11 +455,11 @@ int colvarscript::proc_bias(int argc, char const *argv[]) { int colvarscript::proc_features(colvardeps *obj, - int argc, char const *argv[]) { + int objc, unsigned char *const objv[]) { // size was already checked before calling - std::string subcmd = argv[2]; + std::string const subcmd(obj_to_str(objv[2])); - if (argc == 3) { + if (objc == 3) { if (subcmd == "state") { // TODO make this returned as result? obj->print_state(); @@ -470,7 +473,7 @@ int colvarscript::proc_features(colvardeps *obj, if ((subcmd == "get") || (subcmd == "set")) { std::vector &features = obj->features(); - std::string const req_feature(argv[3]); + std::string const req_feature(obj_to_str(objv[3])); colvardeps::feature *f = NULL; int fid = 0; for (fid = 0; fid < int(features.size()); fid++) { @@ -499,9 +502,9 @@ int colvarscript::proc_features(colvardeps *obj, } if (subcmd == "set") { - if (argc == 5) { + if (objc == 5) { std::string const yesno = - colvarparse::to_lower_cppstr(std::string(argv[4])); + colvarparse::to_lower_cppstr(std::string(obj_to_str(objv[4]))); if ((yesno == std::string("yes")) || (yesno == std::string("on")) || (yesno == std::string("1"))) { @@ -510,10 +513,7 @@ int colvarscript::proc_features(colvardeps *obj, } else if ((yesno == std::string("no")) || (yesno == std::string("off")) || (yesno == std::string("0"))) { - // TODO disable() function does not exist yet, - // dependencies will not be resolved - // obj->disable(fid); - obj->set_enabled(fid, false); + obj->disable(fid); return COLVARS_OK; } } @@ -533,11 +533,11 @@ std::string colvarscript::help_string() std::string buf; buf = "Usage: cv [args...]\n\ \n\ -Managing the colvars module:\n\ +Managing the Colvars module:\n\ configfile -- read configuration from a file\n\ config -- read configuration from the given string\n\ reset -- delete all internal configuration\n\ - delete -- delete this colvars module instance\n\ + delete -- delete this Colvars module instance\n\ version -- return version of colvars code\n\ \n\ Input and output:\n\ diff --git a/lib/colvars/colvarscript.h b/lib/colvars/colvarscript.h index 46b1ddd203..94d451809c 100644 --- a/lib/colvars/colvarscript.h +++ b/lib/colvars/colvarscript.h @@ -41,22 +41,30 @@ public: /// If an error is returned by one of the methods, it should set this to the error message std::string result; - /// Run script command with given positional arguments - int run(int argc, char const *argv[]); + /// Run script command with given positional arguments (objects) + int run(int objc, unsigned char *const objv[]); private: /// Run subcommands on colvar - int proc_colvar(int argc, char const *argv[]); + int proc_colvar(colvar *cv, int argc, unsigned char *const argv[]); /// Run subcommands on bias - int proc_bias(int argc, char const *argv[]); + int proc_bias(colvarbias *b, int argc, unsigned char *const argv[]); /// Run subcommands on base colvardeps object (colvar, bias, ...) int proc_features(colvardeps *obj, - int argc, char const *argv[]); + int argc, unsigned char *const argv[]); - /// Builds and return a short help + /// Build and return a short help std::string help_string(void); + +public: + + inline char const *obj_to_str(unsigned char *const obj) + { + return cvm::proxy->script_obj_to_str(obj); + } + }; diff --git a/lib/colvars/colvartypes.h b/lib/colvars/colvartypes.h index e0cebb83bc..17c09a5095 100644 --- a/lib/colvars/colvartypes.h +++ b/lib/colvars/colvartypes.h @@ -91,6 +91,11 @@ public: data.resize(n); } + inline void clear() + { + data.clear(); + } + inline T & operator [] (size_t const i) { return data[i]; } diff --git a/lib/colvars/colvarvalue.cpp b/lib/colvars/colvarvalue.cpp index deccc6b7e0..7b498be6d6 100644 --- a/lib/colvars/colvarvalue.cpp +++ b/lib/colvars/colvarvalue.cpp @@ -16,6 +16,274 @@ +std::string const colvarvalue::type_desc(Type t) +{ + switch (t) { + case colvarvalue::type_scalar: + return "scalar number"; break; + case colvarvalue::type_3vector: + return "3-dimensional vector"; break; + case colvarvalue::type_unit3vector: + return "3-dimensional unit vector"; break; + case colvarvalue::type_unit3vectorderiv: + return "derivative of a 3-dimensional unit vector"; break; + case colvarvalue::type_quaternion: + return "4-dimensional unit quaternion"; break; + case colvarvalue::type_quaternionderiv: + return "4-dimensional tangent vector"; break; + case colvarvalue::type_vector: + return "n-dimensional vector"; break; + case colvarvalue::type_notset: + // fallthrough + default: + return "not set"; break; + } +} + + +std::string const colvarvalue::type_keyword(Type t) +{ + switch (t) { + case colvarvalue::type_notset: + default: + return "not_set"; break; + case colvarvalue::type_scalar: + return "scalar"; break; + case colvarvalue::type_3vector: + return "vector3"; break; + case colvarvalue::type_unit3vector: + return "unit_vector3"; break; + case colvarvalue::type_unit3vectorderiv: + return ""; break; + case colvarvalue::type_quaternion: + return "unit_quaternion"; break; + case colvarvalue::type_quaternionderiv: + return ""; break; + case colvarvalue::type_vector: + return "vector"; break; + } +} + + +size_t colvarvalue::num_df(Type t) +{ + switch (t) { + case colvarvalue::type_notset: + default: + return 0; break; + case colvarvalue::type_scalar: + return 1; break; + case colvarvalue::type_3vector: + return 3; break; + case colvarvalue::type_unit3vector: + case colvarvalue::type_unit3vectorderiv: + return 2; break; + case colvarvalue::type_quaternion: + case colvarvalue::type_quaternionderiv: + return 3; break; + case colvarvalue::type_vector: + // the size of a vector is unknown without its object + return 0; break; + } +} + + +size_t colvarvalue::num_dimensions(Type t) +{ + switch (t) { + case colvarvalue::type_notset: + default: + return 0; break; + case colvarvalue::type_scalar: + return 1; break; + case colvarvalue::type_3vector: + case colvarvalue::type_unit3vector: + case colvarvalue::type_unit3vectorderiv: + return 3; break; + case colvarvalue::type_quaternion: + case colvarvalue::type_quaternionderiv: + return 4; break; + case colvarvalue::type_vector: + // the size of a vector is unknown without its object + return 0; break; + } +} + + +void colvarvalue::reset() +{ + switch (value_type) { + case colvarvalue::type_scalar: + real_value = 0.0; + break; + case colvarvalue::type_3vector: + case colvarvalue::type_unit3vector: + case colvarvalue::type_unit3vectorderiv: + rvector_value.reset(); + break; + case colvarvalue::type_quaternion: + case colvarvalue::type_quaternionderiv: + quaternion_value.reset(); + break; + case colvarvalue::type_vector: + vector1d_value.reset(); + break; + case colvarvalue::type_notset: + default: + break; + } +} + + +void colvarvalue::apply_constraints() +{ + switch (value_type) { + case colvarvalue::type_scalar: + case colvarvalue::type_3vector: + case colvarvalue::type_unit3vectorderiv: + case colvarvalue::type_quaternionderiv: + break; + case colvarvalue::type_unit3vector: + rvector_value /= std::sqrt(rvector_value.norm2()); + break; + case colvarvalue::type_quaternion: + quaternion_value /= std::sqrt(quaternion_value.norm2()); + break; + case colvarvalue::type_vector: + if (elem_types.size() > 0) { + // if we have information about non-scalar types, use it + size_t i; + for (i = 0; i < elem_types.size(); i++) { + if (elem_sizes[i] == 1) continue; // TODO this can be optimized further + colvarvalue cvtmp(vector1d_value.slice(elem_indices[i], + elem_indices[i] + elem_sizes[i]), elem_types[i]); + cvtmp.apply_constraints(); + set_elem(i, cvtmp); + } + } + break; + case colvarvalue::type_notset: + default: + break; + } +} + + +void colvarvalue::type(Type const &vti) +{ + if (vti != value_type) { + // reset the value based on the previous type + reset(); + if ((value_type == type_vector) && (vti != type_vector)) { + vector1d_value.clear(); + } + value_type = vti; + } +} + + +void colvarvalue::type(colvarvalue const &x) +{ + if (x.type() != value_type) { + // reset the value based on the previous type + reset(); + if (value_type == type_vector) { + vector1d_value.clear(); + } + value_type = x.type(); + } + + if (x.type() == type_vector) { + vector1d_value.resize(x.vector1d_value.size()); + } +} + + +void colvarvalue::is_derivative() +{ + switch (value_type) { + case colvarvalue::type_scalar: + case colvarvalue::type_3vector: + case colvarvalue::type_unit3vectorderiv: + case colvarvalue::type_quaternionderiv: + break; + case colvarvalue::type_unit3vector: + type(colvarvalue::type_unit3vectorderiv); + break; + case colvarvalue::type_quaternion: + type(colvarvalue::type_quaternionderiv); + break; + case colvarvalue::type_vector: + // TODO + break; + case colvarvalue::type_notset: + default: + break; + } +} + + +colvarvalue::colvarvalue(colvarvalue const &x) + : value_type(x.type()) +{ + switch (x.type()) { + case type_scalar: + real_value = x.real_value; + break; + case type_3vector: + case type_unit3vector: + case type_unit3vectorderiv: + rvector_value = x.rvector_value; + break; + case type_quaternion: + case type_quaternionderiv: + quaternion_value = x.quaternion_value; + break; + case type_vector: + vector1d_value = x.vector1d_value; + elem_types = x.elem_types; + elem_indices = x.elem_indices; + elem_sizes = x.elem_sizes; + case type_notset: + default: + break; + } +} + + +colvarvalue::colvarvalue(cvm::vector1d const &v, Type vti) +{ + if ((vti != type_vector) && (v.size() != num_dimensions(vti))) { + cvm::error("Error: trying to initialize a variable of type \""+type_desc(vti)+ + "\" using a vector of size "+cvm::to_str(v.size())+ + ".\n"); + value_type = type_notset; + } else { + value_type = vti; + switch (vti) { + case type_scalar: + real_value = v[0]; + break; + case type_3vector: + case type_unit3vector: + case type_unit3vectorderiv: + rvector_value = cvm::rvector(v); + break; + case type_quaternion: + case type_quaternionderiv: + quaternion_value = cvm::quaternion(v); + break; + case type_vector: + vector1d_value = v; + break; + case type_notset: + default: + break; + } + } +} + + void colvarvalue::add_elem(colvarvalue const &x) { if (this->value_type != type_vector) { @@ -111,6 +379,13 @@ void colvarvalue::set_random() } +void colvarvalue::undef_op() const +{ + cvm::error("Error: Undefined operation on a colvar of type \""+ + type_desc(this->type())+"\".\n"); +} + + // binary operations between two colvarvalues colvarvalue operator + (colvarvalue const &x1, diff --git a/lib/colvars/colvarvalue.h b/lib/colvars/colvarvalue.h index e369feefcd..fce0e1a970 100644 --- a/lib/colvars/colvarvalue.h +++ b/lib/colvars/colvarvalue.h @@ -169,38 +169,14 @@ public: } /// Set the type explicitly - inline void type(Type const &vti) - { - if (vti != value_type) { - // reset the value based on the previous type - reset(); - if ((value_type == type_vector) && (vti != type_vector)) { - vector1d_value.resize(0); - } - value_type = vti; - } - } + void type(Type const &vti); /// Set the type after another \link colvarvalue \endlink - inline void type(colvarvalue const &x) - { - if (x.type() != value_type) { - // reset the value based on the previous type - reset(); - if (value_type == type_vector) { - vector1d_value.resize(0); - } - value_type = x.type(); - } - - if (x.type() == type_vector) { - vector1d_value.resize(x.vector1d_value.size()); - } - } + void type(colvarvalue const &x); /// Make the type a derivative of the original type /// (so that its constraints do not apply) - inline void is_derivative(); + void is_derivative(); /// Square norm of this colvarvalue cvm::real norm2() const; @@ -303,28 +279,10 @@ public: void set_elem(int const icv, colvarvalue const &x); /// Get a scalar number out of an element of the vector - inline cvm::real operator [] (int const i) const - { - if (vector1d_value.size() > 0) { - return vector1d_value[i]; - } else { - cvm::error("Error: trying to use as a vector a variable that is not initialized as such.\n"); - return 0.0; - } - } + cvm::real operator [] (int const i) const; /// Use an element of the vector as a scalar number - inline cvm::real & operator [] (int const i) - { - if (vector1d_value.size() > 0) { - return vector1d_value[i]; - } else { - cvm::error("Error: trying to use as a vector a variable that is not initialized as such.\n"); - real_value = 0.0; - return real_value; - } - } - + cvm::real & operator [] (int const i); /// Ensure that the two types are the same within a binary operator int static check_types(colvarvalue const &x1, colvarvalue const &x2); @@ -389,101 +347,6 @@ public: }; - -inline std::string const colvarvalue::type_desc(Type t) -{ - switch (t) { - case colvarvalue::type_scalar: - return "scalar number"; break; - case colvarvalue::type_3vector: - return "3-dimensional vector"; break; - case colvarvalue::type_unit3vector: - return "3-dimensional unit vector"; break; - case colvarvalue::type_unit3vectorderiv: - return "derivative of a 3-dimensional unit vector"; break; - case colvarvalue::type_quaternion: - return "4-dimensional unit quaternion"; break; - case colvarvalue::type_quaternionderiv: - return "4-dimensional tangent vector"; break; - case colvarvalue::type_vector: - return "n-dimensional vector"; break; - case colvarvalue::type_notset: - // fallthrough - default: - return "not set"; break; - } -} - - -inline std::string const colvarvalue::type_keyword(Type t) -{ - switch (t) { - case colvarvalue::type_notset: - default: - return "not_set"; break; - case colvarvalue::type_scalar: - return "scalar"; break; - case colvarvalue::type_3vector: - return "vector3"; break; - case colvarvalue::type_unit3vector: - return "unit_vector3"; break; - case colvarvalue::type_unit3vectorderiv: - return ""; break; - case colvarvalue::type_quaternion: - return "unit_quaternion"; break; - case colvarvalue::type_quaternionderiv: - return ""; break; - case colvarvalue::type_vector: - return "vector"; break; - } -} - - -inline size_t colvarvalue::num_df(Type t) -{ - switch (t) { - case colvarvalue::type_notset: - default: - return 0; break; - case colvarvalue::type_scalar: - return 1; break; - case colvarvalue::type_3vector: - return 3; break; - case colvarvalue::type_unit3vector: - case colvarvalue::type_unit3vectorderiv: - return 2; break; - case colvarvalue::type_quaternion: - case colvarvalue::type_quaternionderiv: - return 3; break; - case colvarvalue::type_vector: - // the size of a vector is unknown without its object - return 0; break; - } -} - - -inline size_t colvarvalue::num_dimensions(Type t) -{ - switch (t) { - case colvarvalue::type_notset: - default: - return 0; break; - case colvarvalue::type_scalar: - return 1; break; - case colvarvalue::type_3vector: - case colvarvalue::type_unit3vector: - case colvarvalue::type_unit3vectorderiv: - return 3; break; - case colvarvalue::type_quaternion: - case colvarvalue::type_quaternionderiv: - return 4; break; - case colvarvalue::type_vector: - // the size of a vector is unknown without its object - return 0; break; - } -} - - inline size_t colvarvalue::size() const { switch (value_type) { @@ -505,62 +368,48 @@ inline size_t colvarvalue::size() const } -inline colvarvalue::colvarvalue(colvarvalue const &x) - : value_type(x.type()) +inline cvm::real colvarvalue::operator [] (int const i) const { - switch (x.type()) { - case type_scalar: - real_value = x.real_value; - break; - case type_3vector: - case type_unit3vector: - case type_unit3vectorderiv: - rvector_value = x.rvector_value; - break; - case type_quaternion: - case type_quaternionderiv: - quaternion_value = x.quaternion_value; - break; - case type_vector: - vector1d_value = x.vector1d_value; - elem_types = x.elem_types; - elem_indices = x.elem_indices; - elem_sizes = x.elem_sizes; - case type_notset: + switch (value_type) { + case colvarvalue::type_notset: default: - break; + cvm::error("Error: trying to access a colvar value " + "that is not initialized.\n", BUG_ERROR); + return 0.0; break; + case colvarvalue::type_scalar: + return real_value; break; + case colvarvalue::type_3vector: + case colvarvalue::type_unit3vector: + case colvarvalue::type_unit3vectorderiv: + return rvector_value[i]; break; + case colvarvalue::type_quaternion: + case colvarvalue::type_quaternionderiv: + return quaternion_value[i]; break; + case colvarvalue::type_vector: + return vector1d_value[i]; break; } } -inline colvarvalue::colvarvalue(cvm::vector1d const &v, Type vti) + +inline cvm::real & colvarvalue::operator [] (int const i) { - if ((vti != type_vector) && (v.size() != num_dimensions(vti))) { - cvm::error("Error: trying to initialize a variable of type \""+type_desc(vti)+ - "\" using a vector of size "+cvm::to_str(v.size())+ - ".\n"); - value_type = type_notset; - } else { - value_type = vti; - switch (vti) { - case type_scalar: - real_value = v[0]; - break; - case type_3vector: - case type_unit3vector: - case type_unit3vectorderiv: - rvector_value = cvm::rvector(v); - break; - case type_quaternion: - case type_quaternionderiv: - quaternion_value = cvm::quaternion(v); - break; - case type_vector: - vector1d_value = v; - break; - case type_notset: - default: - break; - } + switch (value_type) { + case colvarvalue::type_notset: + default: + cvm::error("Error: trying to access a colvar value " + "that is not initialized.\n", BUG_ERROR); + return real_value; break; + case colvarvalue::type_scalar: + return real_value; break; + case colvarvalue::type_3vector: + case colvarvalue::type_unit3vector: + case colvarvalue::type_unit3vectorderiv: + return rvector_value[i]; break; + case colvarvalue::type_quaternion: + case colvarvalue::type_quaternionderiv: + return quaternion_value[i]; break; + case colvarvalue::type_vector: + return vector1d_value[i]; break; } } @@ -638,13 +487,6 @@ inline int colvarvalue::check_types_assign(colvarvalue::Type const &vt1, } -inline void colvarvalue::undef_op() const -{ - cvm::error("Error: Undefined operation on a colvar of type \""+ - type_desc(this->type())+"\".\n"); -} - - inline colvarvalue & colvarvalue::operator = (colvarvalue const &x) { check_types_assign(this->type(), x.type()); @@ -704,6 +546,7 @@ inline void colvarvalue::operator += (colvarvalue const &x) } } + inline void colvarvalue::operator -= (colvarvalue const &x) { colvarvalue::check_types(*this, x); @@ -802,89 +645,6 @@ inline cvm::vector1d const colvarvalue::as_vector() const } -inline void colvarvalue::reset() -{ - switch (value_type) { - case colvarvalue::type_scalar: - real_value = 0.0; - break; - case colvarvalue::type_3vector: - case colvarvalue::type_unit3vector: - case colvarvalue::type_unit3vectorderiv: - rvector_value.reset(); - break; - case colvarvalue::type_quaternion: - case colvarvalue::type_quaternionderiv: - quaternion_value.reset(); - break; - case colvarvalue::type_vector: - vector1d_value.reset(); - break; - case colvarvalue::type_notset: - default: - break; - } -} - - -inline void colvarvalue::apply_constraints() -{ - switch (value_type) { - case colvarvalue::type_scalar: - case colvarvalue::type_3vector: - case colvarvalue::type_unit3vectorderiv: - case colvarvalue::type_quaternionderiv: - break; - case colvarvalue::type_unit3vector: - rvector_value /= std::sqrt(rvector_value.norm2()); - break; - case colvarvalue::type_quaternion: - quaternion_value /= std::sqrt(quaternion_value.norm2()); - break; - case colvarvalue::type_vector: - if (elem_types.size() > 0) { - // if we have information about non-scalar types, use it - size_t i; - for (i = 0; i < elem_types.size(); i++) { - if (elem_sizes[i] == 1) continue; // TODO this can be optimized further - colvarvalue cvtmp(vector1d_value.slice(elem_indices[i], - elem_indices[i] + elem_sizes[i]), elem_types[i]); - cvtmp.apply_constraints(); - set_elem(i, cvtmp); - } - } - break; - case colvarvalue::type_notset: - default: - break; - } -} - - -inline void colvarvalue::is_derivative() -{ - switch (value_type) { - case colvarvalue::type_scalar: - case colvarvalue::type_3vector: - case colvarvalue::type_unit3vectorderiv: - case colvarvalue::type_quaternionderiv: - break; - case colvarvalue::type_unit3vector: - type(colvarvalue::type_unit3vectorderiv); - break; - case colvarvalue::type_quaternion: - type(colvarvalue::type_quaternionderiv); - break; - case colvarvalue::type_vector: - // TODO - break; - case colvarvalue::type_notset: - default: - break; - } -} - - inline cvm::real colvarvalue::norm2() const { switch (value_type) { diff --git a/src/USER-COLVARS/colvarproxy_lammps.cpp b/src/USER-COLVARS/colvarproxy_lammps.cpp index 89453ded9b..17dff30567 100644 --- a/src/USER-COLVARS/colvarproxy_lammps.cpp +++ b/src/USER-COLVARS/colvarproxy_lammps.cpp @@ -308,10 +308,6 @@ void colvarproxy_lammps::error(std::string const &message) void colvarproxy_lammps::fatal_error(std::string const &message) { log(message); - // if (!cvm::debug()) - // log("If this error message is unclear, try recompiling the " - // "colvars library and LAMMPS with -DCOLVARS_DEBUG.\n"); - _lmp->error->one(FLERR, "Fatal error in the collective variables module.\n"); } diff --git a/src/USER-COLVARS/colvarproxy_lammps.h b/src/USER-COLVARS/colvarproxy_lammps.h index ad63eb2f9e..6cdf0edfe8 100644 --- a/src/USER-COLVARS/colvarproxy_lammps.h +++ b/src/USER-COLVARS/colvarproxy_lammps.h @@ -7,10 +7,11 @@ // If you wish to distribute your changes, please submit them to the // Colvars repository at GitHub. - #ifndef COLVARPROXY_LAMMPS_H #define COLVARPROXY_LAMMPS_H +#include "colvarproxy_lammps_version.h" + #include "colvarmodule.h" #include "colvarproxy.h" #include "colvarvalue.h" @@ -28,10 +29,6 @@ #include #endif -#ifndef COLVARPROXY_VERSION -#define COLVARPROXY_VERSION "2017-01-09" -#endif - /* struct for packed data communication of coordinates and forces. */ struct commdata { int tag,type; diff --git a/src/USER-COLVARS/colvarproxy_lammps_version.h b/src/USER-COLVARS/colvarproxy_lammps_version.h new file mode 100644 index 0000000000..834bd1748a --- /dev/null +++ b/src/USER-COLVARS/colvarproxy_lammps_version.h @@ -0,0 +1,10 @@ +#ifndef COLVARPROXY_VERSION +#define COLVARPROXY_VERSION "2017-07-15" +// This file is part of the Collective Variables module (Colvars). +// The original version of Colvars and its updates are located at: +// https://github.com/colvars/colvars +// Please update all Colvars source files before making any changes. +// If you wish to distribute your changes, please submit them to the +// Colvars repository at GitHub. + +#endif