def casci(self, mo_coeff, ci0=None, eris=None, verbose=None, envs=None): log = logger.new_logger(self, verbose) if eris is None: fcasci = copy.copy(self) fcasci.ao2mo = self.get_h2cas else: fcasci = mc1step._fake_h_for_fast_casci(self, mo_coeff, eris) e_tot, e_cas, fcivec = casci.kernel(fcasci, mo_coeff, ci0, log) if not isinstance(e_cas, (float, numpy.number)): raise RuntimeError( 'Multiple roots are detected in fcisolver. ' 'CASSCF does not know which state to optimize.\n' 'See also mcscf.state_average or mcscf.state_specific for excited states.' ) if envs is not None and log.verbose >= logger.INFO: log.debug('CAS space CI energy = %.15g', e_cas) if getattr(self.fcisolver, 'spin_square', None): ss = self.fcisolver.spin_square(fcivec, self.ncas, self.nelecas) else: ss = None if 'imacro' in envs: # Within CASSCF iteration stat = envs['stat'] if ss is None: log.info( 'macro %d (%d JK %d micro), ' 'CASSCF E = %.15g dE = %.4g |grad|=%5.3g', envs['imacro'], stat.tot_hop + stat.tot_kf, stat.imic, e_tot, e_tot - envs['elast'], envs['norm_gall']) else: log.info( 'macro %d (%d JK %d micro), ' 'CASSCF E = %.15g dE = %.4g |grad|=%5.3g S^2 = %.7f', envs['imacro'], stat.tot_hop + stat.tot_kf, stat.imic, e_tot, e_tot - envs['elast'], envs['norm_gall'], ss[0]) else: # Initialization step elast = envs.get('elast', 0) if ss is None: log.info('CASCI E = %.15g', e_tot) else: log.info('CASCI E = %.15g dE = %.8g S^2 = %.7f', e_tot, e_tot - elast, ss[0]) return e_tot, e_cas, fcivec
def casci(self, mo_coeff, ci0=None, eris=None, verbose=None, envs=None): log = logger.new_logger(self, verbose) if eris is None: fcasci = copy.copy(self) fcasci.ao2mo = self.get_h2cas else: fcasci = mc1step._fake_h_for_fast_casci(self, mo_coeff, eris) e_tot, e_cas, fcivec = casci.kernel(fcasci, mo_coeff, ci0, log) if not isinstance(e_cas, (float, numpy.number)): raise RuntimeError('Multiple roots are detected in fcisolver. ' 'CASSCF does not know which state to optimize.\n' 'See also mcscf.state_average or mcscf.state_specific for excited states.') if envs is not None and log.verbose >= logger.INFO: log.debug('CAS space CI energy = %.15g', e_cas) if getattr(self.fcisolver, 'spin_square', None): ss = self.fcisolver.spin_square(fcivec, self.ncas, self.nelecas) else: ss = None if 'imacro' in envs: # Within CASSCF iteration stat = envs['stat'] if ss is None: log.info('macro %d (%d JK %d micro), ' 'CASSCF E = %.15g dE = %.4g |grad|=%5.3g', envs['imacro'], stat.tot_hop+stat.tot_kf, stat.imic, e_tot, e_tot-envs['elast'], envs['norm_gall']) else: log.info('macro %d (%d JK %d micro), ' 'CASSCF E = %.15g dE = %.4g |grad|=%5.3g S^2 = %.7f', envs['imacro'], stat.tot_hop+stat.tot_kf, stat.imic, e_tot, e_tot-envs['elast'], envs['norm_gall'], ss[0]) else: # Initialization step elast = envs.get('elast', 0) if ss is None: log.info('CASCI E = %.15g', e_tot) else: log.info('CASCI E = %.15g dE = %.8g S^2 = %.7f', e_tot, e_tot-elast, ss[0]) return e_tot, e_cas, fcivec
def mc1step_casci(mc, mo_coeff, ci0=None, eris=None, verbose=None, envs=None): ''' Wrapper for _ci_min_epdft_fp to mcscf.mc1step.casci function ''' if ci0 is None: ci0 = mc.ci if verbose is None: verbose = mc.verbose t0 = (time.process_time(), time.time()) ncas, nelecas = mc.ncas, mc.nelecas linkstrl = mc.fcisolver.gen_linkstr(ncas, nelecas, True) linkstr = mc.fcisolver.gen_linkstr(ncas, nelecas, False) log = lib.logger.new_logger(mc, verbose) if eris is None: h0_cas, h1_cas = mcscf.casci.h1e_for_cas(mc, mo_coeff, mc.ncas, mc.ncore) h2_cas = mcscf.casci.CASCI.ao2mo(mc, mo_coeff) else: fcasci = _fake_h_for_fast_casci(mc, mo_coeff, eris) h1_cas, h0_cas = fcasci.get_h1eff() h2_cas = fcasci.get_h2eff() if ci0 is None: # Use real Hamiltonian? Or use HF? hdiag = mc.fcisolver.make_hdiag(h1_cas, h2_cas, ncas, nelecas) ci0 = mc.fcisolver.get_init_guess(ncas, nelecas, 1, hdiag)[0] epdft, h0_pdft, ci1, emcscf = _ci_min_epdft_fp(mc, mo_coeff, ci0, hcas=(h0_cas, h1_cas, h2_cas), verbose=verbose) eci = epdft - h0_cas if envs is not None and log.verbose >= lib.logger.INFO: log.debug('CAS space CI energy = %.15g', eci) if getattr(mc.fcisolver, 'spin_square', None): ss = mc.fcisolver.spin_square(ci1, mc.ncas, mc.nelecas) else: ss = None if 'imicro' in envs: # Within CASSCF iteration if ss is None: log.info( 'macro iter %d (%d JK %d micro), ' 'MC-PDFT E = %.15g dE = %.8g CASCI E = %.15g', envs['imacro'], envs['njk'], envs['imicro'], epdft, epdft - envs['elast'], emcscf) else: log.info( 'macro iter %d (%d JK %d micro), ' 'MC-PDFT E = %.15g dE = %.8g S^2 = %.7f CASCI E = %.15g', envs['imacro'], envs['njk'], envs['imicro'], epdft, epdft - envs['elast'], ss[0], emcscf) if 'norm_gci' in envs: log.info( ' |grad[o]|=%5.3g ' '|grad[c]|= %s |ddm|=%5.3g', envs['norm_gorb0'], envs['norm_gci'], envs['norm_ddm']) else: log.info(' |grad[o]|=%5.3g |ddm|=%5.3g', envs['norm_gorb0'], envs['norm_ddm']) else: # Initialization step if ss is None: log.info('MC-PDFT E = %.15g CASCI E = %.15g', epdft, emcscf) else: log.info('MC-PDFT E = %.15g S^2 = %.7f CASCI E = %.15g', epdft, ss[0], emcscf) # For correct reporting, this function should return <CAS|H|CAS> return emcscf, emcscf - h0_cas, ci1