def optimize(self, max_cycles=350, gamma=0.0, restart=False, convergence='normal'): """ :return:This object will return the optimization status. It will optimize a structure. """ # TODO: Add a return 'CycleExceeded' with open(self.out_file, 'w') as fopt: out = subp.Popen([which("orca"), self.inp_file], stdout=fopt, stderr=fopt) out.communicate() out.poll() exit_status = out.returncode if exit_status == 0: f = open(self.out_file, "r") line = f.readlines() if "****ORCA TERMINATED NORMALLY****" in line[-2]: self.energy = self.get_energy() self.optimized_coordinates = np.loadtxt(self.inp_file[:-4] + ".xyz", dtype=float, skiprows=2, usecols=(1, 2, 3)) write_xyz(self.atoms_list, self.optimized_coordinates, self.result_xyz_file, energy=self.energy) f.close() return True else: print("Error: OPTIMIZATION PROBABLY FAILED. " "CHECK THE .out FILE FOR PARTIAL OPTIMIZTION ") print("Check for partial optimization.") print("Location: {}".format(os.getcwd())) return False
def optimize(self, max_cycles=350, gamma=0.0, restart=False, convergence='normal'): """ :return:This object will return the optimization status. It will optimize a structure. """ # TODO: Add a return 'CycleExceeded' logfile = "trial_{}.log".format(self.job_name) with open(logfile, 'w') as fopt: out = subp.Popen(["mopac", self.inp_file], stdout=fopt, stderr=fopt) out.communicate() out.poll() exit_status = out.returncode if exit_status == 0: if os.path.exists(self.arc_file): self.energy = self.get_energy() self.optimized_coordinates = self.get_coords() interface.write_xyz(self.atoms_list, self.optimized_coordinates, self.result_xyz_file, self.job_name, energy=self.energy) return True else: print("Error: File ", self.arc_file, "was not found.") print("Check for partial optimization.") print("Location: {}".format(os.getcwd())) return False
def optimize(self, max_cycles=350, gamma=0.0, restart=False, convergence='normal'): """ :return:This object will return the optimization status. It will optimize a structure. """ # TODO: Add a return 'CycleExceeded' with open(self.out_file, 'w') as fopt: out = subp.Popen(["psi4", self.inp_file], stdout=fopt, stderr=fopt) out.communicate() out.poll() exit_status = out.returncode if exit_status == 0: f = open(self.out_file, "r") if " **** Optimization is complete!" in f.read(): print("Optimized") self.energy = self.get_energy() self.optimized_coordinates = self.get_coordinates() write_xyz(self.atoms_list, self.optimized_coordinates, self.result_xyz_file, energy=self.energy) f.close() return True else: print("Error: OPTIMIZATION PROBABLY FAILED. " "CHECK THE .out FILE FOR PARTIAL OPTIMIZTION ") print("Check for partial optimization.") print("Location: {}".format(os.getcwd())) return False
def run_turbomole_jobex(self, max_cycles=350): """ return one of the following: True: converged SCFFailed GradFailed UpdateFailed CycleExceeded False: unknown error or jebex excution error :rtype: string or boolean """ with open('jobex.out', 'w') as fj: try: subp.check_call(['jobex', '-ri', '-c', str(max_cycles)], stdout=fj, stderr=fj) except subp.CalledProcessError as e: turbomole_logger.error('jobex failed, check %s/jobex.out' % os.getcwd()) return False if os.path.isfile('GEO_OPT_FAILED'): message = open('GEO_OPT_FAILED').read() if 'ERROR: Module' in message: turbomole_logger.error('Error in module!\n chcek %s/GEO_OPT_FAILED' % os.getcwd()) return False elif 'ERROR in statpt step,' in message: turbomole_logger.error('Statpt failed!\n chcek %s/GEO_OPT_FAILED' % os.getcwd()) return 'UpdateFailed' elif 'ERROR in relax step,' in message: turbomole_logger.error('Relax failed!\n chcek %s/GEO_OPT_FAILED' % os.getcwd()) return 'UpdateFailed' elif 'ERROR: your energy calculation did not converge !!,' in message: turbomole_logger.error('SCF failed!\n chcek %s/GEO_OPT_FAILED' % os.getcwd()) return 'SCFFailed' elif 'ERROR in dscf step' in message: turbomole_logger.error('SCF failed!\n chcek %s/GEO_OPT_FAILED' % os.getcwd()) return 'SCFFailed' elif 'ERROR in gradient step' in message: turbomole_logger.error('Gradient failed!\n chcek %s/GEO_OPT_FAILED' % os.getcwd()) return 'GradientFailed' elif 'OPTIMIZATION DID NOT CONVERGE' in message: turbomole_logger.error('Geometry did not converge in %d cycles.\ncheck %s' % (max_cycles, os.getcwd())) self.energy = get_energy() self.optimized_coordinates = bohr2angstrom(get_coords()) return 'CycleExceeded' else: turbomole_logger.error('Unknown Error!\n chcek the files in %s' % os.getcwd()) return False elif os.path.isfile('GEO_OPT_CONVERGED'): turbomole_logger.debug('jobex done') self.energy = get_energy() self.optimized_coordinates = bohr2angstrom(get_coords()) interface.write_xyz(self.atoms_list, self.optimized_coordinates, self.result_xyz_file, self.job_name, energy=self.energy) return True
def optimize(self, max_cycles=350, gamma=0.0, restart=False, convergence='normal'): interface.turbomole.make_coord(self.atoms_list, self.start_coords, self.coord_file) interface.turbomole.prepare_control() for cycle in range(max_cycles): xtb_turbo_logger.debug("Optimization Cycle {}".format(cycle)) # Calculate energy and gradient status, message, energy, gradients = self.calc_engrad if status is False: xtb_turbo_logger.critical('Energy/Gradient evaluation failed') return 'SCFFailed' # Calculate afir gradient if gamma is greater than zero afir_energy, afir_gradient = restraints.isotropic( self.atoms_in_fragments, self.atoms_list, interface.turbomole.get_coords(), gamma) interface.turbomole.rewrite_turbomole_energy_and_gradient_files( self.number_of_atoms, afir_energy, afir_gradient) # Update coordinates and check convergence. status = interface.turbomole.update_coord() if status is False: xtb_turbo_logger.critical( 'Coordinate update failed in cycle %d' % cycle) xtb_turbo_logger.critical('Check the job in %s' % os.getcwd()) return 'UpdateFailed' convergence_status = interface.turbomole.check_geometry_convergence( ) if convergence_status is True: xtb_turbo_logger.info('converged at {}'.format(cycle)) self.energy = interface.turbomole.get_energy() self.optimized_coordinates = bohr2angstrom( interface.turbomole.get_coords()) interface.write_xyz(self.atoms_list, self.optimized_coordinates, self.result_xyz_file, self.job_name, energy=self.energy) return True with open('energy.dat', 'a') as fe: fe.writelines("{:3d} {:15.8f} {:15.8f}\n".format( cycle, energy, energy + afir_energy)) else: xtb_turbo_logger.info("cycle exceeded") status = 'cycle_exceeded' self.energy = interface.turbomole.get_energy() self.optimized_coordinates = bohr2angstrom( interface.turbomole.get_coords()) return status
def optimize(self, max_cycles=350, gamma=0.0, restart=False, convergence='normal'): """ :returns: True, 'SCFFailed', 'GradFailed', 'UpdateFailed', 'CycleExceeded', False """ if gamma > 0.0: print('not implemented in this module. Use xtb_turbo') with open('xtb.out', 'w') as fout: try: out = subp.check_call(self.cmd.split(), stdout=fout, stderr=fout) except: print('Optimization failed') return False if os.path.isfile('.xtboptok'): write_xyz(self.atoms_list, self.optimized_coordinates, self.result_xyz_file, job_name=self.job_name, energy=self.energy) os.rename('xtbopt.log', self.trajectory_xyz_file) os.remove('.xtboptok') return True elif os.path.isfile('.sccnotconverged'): print('SCF Convergence failure in {} run in {}'.format( self.start_xyz_file, os.getcwd())) return 'SCFFailed' else: print('Something went wrong with {} run in {}'.format( self.start_xyz_file, os.getcwd())) return False
def optimize(self, max_cycles=350, gamma=0.0, convergence='normal', restart=False): """This is the python implementation of jobex of turbomole :returns: True, 'SCFFailed', 'GradFailed', 'UpdateFailed', 'CycleExceeded', False """ if convergence == 'loose': scf_conv = 6 elif convergence == 'tight': scf_conv = 8 elif convergence == 'normal': scf_conv = 7 else: scf_conv = 7 make_coord(self.atoms_list, self.start_coords) define_status = prepare_control(scf_conv=scf_conv, charge=self.charge, multiplicity=self.multiplicity) if define_status is False: turbomole_logger.error('Initial Define failed, converting to cartesian coordinate') remove('control') define_status = prepare_control(scf_conv=scf_conv, coordinates='cartesian', charge=self.charge, multiplicity=self.multiplicity) if define_status is False: turbomole_logger.error('Initial Define failed again. Quit') return 'UpdateFailed' if gamma == 0.0: return self.run_turbomole_jobex(max_cycles=max_cycles) # Test for Turbomole input if not os.path.isfile('control'): turbomole_logger.critical("Turbomole control file should exist") return False with open('not.converged', 'w') as fp: fp.write('$convcrit\n') fp.write(' energy 6\n') fp.write(' cartesian gradient 3\n') fp.write(' basis set gradient 3\n') fp.write(' cycles 1\n') fp.write('$convergence not reached\n') fp.write('$end\n') remove('statistics') remove('dscf_problem') turbomole_logger.info("Turbomole Optimization started\n") turbomole_logger.info(" at %s\n" % datetime.datetime.now()) turbomole_logger.info(" on machine %s\n"% socket.gethostname()) turbomole_logger.info(" by user %s\n" % os.getlogin()) turbomole_logger.info(" in directory %s\n" % os.getcwd()) initial_status, initial_energy = calc_energy() if initial_status is False: turbomole_logger.error('Initial energy evaluation failed.') return 'SCFFailed' turbomole_logger.debug('First step: %s, %f' %(initial_status, initial_energy)) for cycle in range(max_cycles): # Calculate Gradients gradient_status = calc_gradients() if gradient_status is False: turbomole_logger.error('Gradient evaluation failed in cycle %d' %cycle) return 'GradFailed' for line in open('gradient').readlines(): if 'cycle' in line: turbomole_logger.debug(line.strip()) # Calculate afir gradient if gamma is greater than zero # if gamma > 0.0: afir_energy, afir_gradients = restraints.isotropic(self.atoms_in_fragments, self.atoms_list, get_coords(), gamma) rewrite_turbomole_energy_and_gradient_files(self.number_of_atoms, afir_energy, afir_gradients) turbomole_logger.debug('restraint energy = %f' % (afir_energy)) # Update coordinates and check convergence. update_status = update_coord() if update_status is False: turbomole_logger.critical('Coordinate update failed in cycle %d' %cycle) turbomole_logger.critical('Check the job in %s' % os.getcwd()) return 'UpdateFailed' convergence_status = check_geometry_convergence() if convergence_status is True: turbomole_logger.info('converged at %d' % cycle) self.energy = get_energy() self.optimized_coordinates = bohr2angstrom(get_coords()) interface.write_xyz(self.atoms_list, self.optimized_coordinates, self.result_xyz_file, self.job_name, energy=self.energy) return True # Calculate energy scf_status, energy = calc_energy() if scf_status is False: turbomole_logger.critical('Energy evaluation failed in cycle %d' %cycle) return 'SCFFailed' with open('energy.dat','a') as fe: # if gamma > 0.0: fe.writelines("{:3d} {:15.8f} {:15.8f}\n".format(cycle, energy, energy+afir_energy)) # else: # fe.writelines("{:3d} {:15.8f}\n".format(cycle, energy)) else: turbomole_logger.info("OPTIMIZATION DID NOT CONVERGE WITHIN " "%d CYCLES\n Restarting it after checking " "the gradient norms\n might be a good idea..." " (grep cycle gradient)" %max_cycles) self.energy = get_energy() self.optimized_coordinates = bohr2angstrom(get_coords()) return 'CycleExceeded'