Beispiel #1
0
    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
Beispiel #2
0
    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
Beispiel #3
0
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