diff --git a/src/tools/OpenMP.cpp b/src/tools/OpenMP.cpp
index 52e6c8ce3ca344af55a570efbee044808c4eb9eb..9d61de34504f9f57d4ad3b72db6bad38aeb10b2a 100644
--- a/src/tools/OpenMP.cpp
+++ b/src/tools/OpenMP.cpp
@@ -29,16 +29,37 @@
 
 namespace PLMD {
 
+
+struct OpenMPVars {
+  unsigned cacheline_size=512;
+  bool cache_set=false;
+  unsigned num_threads=1;
+  bool nt_env_set=false;
+};
+
+static OpenMPVars & getOpenMPVars() {
+  static OpenMPVars vars;
+  return vars;
+}
+
+void OpenMP::setNumThreads(const unsigned nt) {
+  getOpenMPVars().num_threads=nt;
+}
+
 unsigned OpenMP::getCachelineSize() {
-  static unsigned cachelineSize=512;
-  if(std::getenv("PLUMED_CACHELINE_SIZE")) Tools::convert(std::getenv("PLUMED_CACHELINE_SIZE"),cachelineSize);
-  return cachelineSize;
+  if(!getOpenMPVars().cache_set) {
+    if(std::getenv("PLUMED_CACHELINE_SIZE")) Tools::convert(std::getenv("PLUMED_CACHELINE_SIZE"),getOpenMPVars().cacheline_size);
+    getOpenMPVars().cache_set = true;
+  }
+  return getOpenMPVars().cacheline_size;
 }
 
 unsigned OpenMP::getNumThreads() {
-  static unsigned numThreads=1;
-  if(std::getenv("PLUMED_NUM_THREADS")) Tools::convert(std::getenv("PLUMED_NUM_THREADS"),numThreads);
-  return numThreads;
+  if(!getOpenMPVars().nt_env_set) {
+    if(std::getenv("PLUMED_NUM_THREADS")) Tools::convert(std::getenv("PLUMED_NUM_THREADS"),getOpenMPVars().num_threads);
+    getOpenMPVars().nt_env_set = true;
+  }
+  return getOpenMPVars().num_threads;
 }
 
 unsigned OpenMP::getThreadNum() {
diff --git a/src/tools/OpenMP.h b/src/tools/OpenMP.h
index 702f8d38f9199e64bb63ee8301d95fb69e404801..c36d13873314f474c948e1c75833a0505c88ce82 100644
--- a/src/tools/OpenMP.h
+++ b/src/tools/OpenMP.h
@@ -30,6 +30,9 @@ class OpenMP {
 
 public:
 
+/// Set number of threads that can be used by openMP
+  static void setNumThreads(const unsigned nt);
+
 /// Get number of threads that can be used by openMP
   static unsigned getNumThreads();