From 99b8ee17daddb9e0d1d67580e7c6c55dfa4a8dc8 Mon Sep 17 00:00:00 2001 From: Vitor Hideyoshi Date: Thu, 22 Jul 2021 09:56:40 -0300 Subject: [PATCH] Initial Translation of SetGlobals - ReadKeywords Method This method reads the keywords from a given initial file and saves it for future use, each in their separate class Signed-off-by: Vitor Hideyoshi --- DPpack/SetGlobalsClass.py | 182 +++++++++++++++++++++++++++++++++++++- 1 file changed, 180 insertions(+), 2 deletions(-) diff --git a/DPpack/SetGlobalsClass.py b/DPpack/SetGlobalsClass.py index 7eaf90a..b224a45 100644 --- a/DPpack/SetGlobalsClass.py +++ b/DPpack/SetGlobalsClass.py @@ -7,12 +7,21 @@ from DPpack.Misc import * class Internal: - def __init__(self): + def __init__(self, infile): + + self.infile = infile self.player = self.Player() + self.player_keywords = [a for a in dir(self.player) if not a.startswith('__') and not callable(getattr(self.player, a))] + self.dice = self.Dice() + self.dice_keywords = [a for a in dir(self.dice) if not a.startswith('__') and not callable(getattr(self.dice, a))] + self.gaussian = self.Gaussian() - self.molca = self.Molca() + self.gaussian_keywords = [a for a in dir(self.gaussian) if not a.startswith('__') and not callable(getattr(self.gaussian, a))] + + self.molcas = self.Molcas() + self.molcas_keywords = [a for a in dir(self.molcas) if not a.startswith('__') and not callable(getattr(self.molcas, a))] ## Constanst that shall be set for global use @@ -26,6 +35,175 @@ class Internal: self.combrule = None self.randominit = None + def read_keywords(self): + + try: + with open(self.infile) as fh: + controlfile = fh.readlines() + except EnvironmentError: + sys.exit("Error: cannot open file {}".format(self.infile)) + + for line in controlfile: + + key, value = line.partition("=")[::2] # Discards the '=' + key = key.strip().lower() + if key in ('title', 'keywords'): + value = value.strip() + else: + value = value.split() + + #### Read the Diceplayer related keywords + if key in self.player_keywords and len(value) != 0: ## 'value' is not empty! + + if key == 'qmprog' and value[0].lower() in ("g03", "g09", "g16", "molcas"): + setattr(self.player, key, value[0].lower()) + + elif key == 'opt' and value[0].lower() in ("yes", "no", "ts"): + setattr(self.player, key, value[0].lower()) + + #elif key == 'zipprog' and value[0].lower() in ("zip", "gzip", "bzip"): + #player[key] = value[0].lower() + + elif key in ('lps', 'ghosts') and value[0].lower() in ("yes", "no"): + setattr(self.player, key, value[0].lower()) + + elif key in ('readhessian', 'vdwforces') and value[0].lower() in ("yes", "no"): + setattr(self.player, key, value[0].lower()) + + elif key in ('maxcyc', 'initcyc', 'nprocs', 'altsteps', 'switchcyc'): + err = "Error: expected a positive integer for keyword {} in file {}".format(key, self.infile) + try: + new_value = int(value[0]) + if new_value >= 1: + setattr(self.player, key, new_value) + elif key == 'altsteps' and new_value == 0: + setattr(self.player, key, 0) + except ValueError: + sys.exit(err) + + elif key == 'maxstep': # Cannot be less than 0.01 + err = "Error: expected a float greater than 0.01 for keyword {} in file {}".format(key, self.infile) + try: + new_value = float(value[0]) + if new_value < 0.01: + sys.exit(err) + else: + setattr(self.player, key).append(new_value) + except ValueError: + sys.exit(err) + + #### Read the Dice related keywords + elif key in self.dice_keywords and len(value) != 0: ## 'value' is not empty! + + if key == 'title': + setattr(self.dice, key, value) + + elif key in ('ljname', 'outname', 'progname'): + setattr(self.dice, key, value[0]) + + elif key in ('ncores', 'isave'): + err = "Error: expected a positive integer for keyword {} in file {}".format(key, self.infile) + if not value[0].isdigit(): + sys.exit(err) + new_value = int(value[0]) + if new_value >= 1: + setattr(self.dice, key, new_value) + + elif key in ('temp', 'press', 'dens'): # Cannot be less than 1e-10 + err = "Error: expected a positive float for keyword {} in file {}".format(key, self.infile) + try: + new_value = float(value[0]) + if new_value < 1e-10: + sys.exit(err) + else: + setattr(self.dice, key, new_value) + except ValueError: + sys.exit(err) + + elif key == 'nmol': # If defined, must be well defined (only positive integer values) + err = "Error: expected 1 to 4 positive integers for keyword {} in file {}".format(key, self.infile) + args = min(4, len(value)) + for i in range(args): + if value[i].isdigit(): + new_value = int(value[i]) + if new_value < 1: + sys.exit(err) + else: + setattr(self.dice, key, new_value) + elif i == 0: + sys.exit(err) + else: + break + + elif key == 'nstep': # If defined, must be well defined (only positive integer values) + err = "Error: expected 2 or 3 positive integers for keyword {} in file {}".format(key, self.infile) + if len(value) < 2: + sys.exit(err) + args = min(3, len(value)) + for i in range(args): + if value[i].isdigit(): + new_value = int(value[i]) + if new_value < 1: + sys.exit(err) + else: + setattr(self.dice, key, new_value) + elif i < 2: + sys.exit(err) + else: + break + + #### Read the Gaussian related keywords + elif key in self.gaussian_keywords and len(value) != 0: ## 'value' is not empty! + + if key == 'mem': # Memory in MB (minimum of 100) + err = "Error: expected a positive integer for keyword {} in file {}".format(key, self.infile) + if not value[0].isdigit(): + sys.exit(err) + new_value = int(value[0]) + if new_value >= 100: + setattr(self.gaussian, key, new_value) + + elif key == 'keywords': + setattr(self.gaussian, key, value) + + elif key == 'chgmult': # If defined, must be well defined (2 integer values) + err = "Error: expected 2 integers for keyword {} in file {}".format(key, self.infile) + if len(value) < 2: + sys.exit(err) + for i in range (2): + try: + setattr(self.gaussian, key)[i] = int(value[i]) + except ValueError: + sys.exit(err) + + elif key in ('level', 'chglevel'): + setattr(self.gaussian, key, value[0]) + + elif key in ('gmiddle', 'gbottom'): + setattr(self.gaussian, key, value[0]) + + elif key == 'pop' and value[0].lower() in ("chelpg", "mk", "nbo"): + setattr(self.gaussian, key, value[0].lower()) + + #### Read the Molcas related keywords + elif key in self.molcas_keywords and len(value) != 0: ## 'value' is not empty! + + if key == 'root': # If defined, must be well defined (only positive integer values) + err = "Error: expected a positive integer for keyword {} in file {}".format(key, infile) + if not value[0].isdigit(): + sys.exit(err) + new_value = int(value[0]) + if new_value >= 1: + setattr(self.molcas, key, new_value) + + elif key in ('mbottom', 'orbfile'): + setattr(self.molcas, key, value[0]) + + elif key == 'basis': + setattr(self.molcas ,key, value[0]) + + #### End + class Player: def __init__(self):