예제 #1
0
파일: genfchk.py 프로젝트: fksheong/PIO
def gen_fchk(mfn, data, ofn='', title=None, suffix='_rlo', overwrite=False):
    # text: info, energy, coeff, rest
    # data: energy, coeff, dim

    if not ofn:
        t, ext = os.path.splitext(mfn)
        ofn = t + suffix + ext
    if not overwrite and os.path.exists(ofn):
        overwriteflag = raw_input('Overwrite file %s? Y/N ' % ofn)
        if overwriteflag.lower() != 'y':
            print ofn, 'skipped.'
            return False
    title = title or os.path.splitext(ofn)[0]

    fchk = parse_fchk(mfn)
    text = fchk['text']
    dim_mo, dim_bs = fchk['data']['dim']

    dim_nmo, dim_nbs = data.get('dim', (dim_mo, dim_bs))
    assert dim_bs == dim_nbs
    if dim_nmo == dim_mo:
        for e in data['energy']:
            assert e.shape == (dim_nmo, )
        for c in data['coeff']:
            assert c.shape == (dim_nmo, dim_bs)
    elif dim_nmo < dim_mo:
        for spin, e in enumerate(data['energy']):
            data['energy'][spin] = np.append(e,
                                             np.zeros(dim_mo - dim_nmo),
                                             axis=0)
            assert data['energy'][spin].shape == (dim_mo, )
        for spin, c in enumerate(data['coeff']):
            data['coeff'][spin] = np.append(c,
                                            np.zeros(
                                                (dim_mo - dim_nmo, dim_bs)),
                                            axis=0)
            assert data['coeff'][spin].shape == (dim_mo, dim_bs)
        dim_nmo = dim_mo
    else:
        # raise AssertionError('Number of new orbitals exceeds number of original orbitals')
        for lid, line in enumerate(text['info']):
            text['info'][lid] = line.replace(str(dim_mo), str(dim_nmo))
        text['energy'][0] = text['energy'][0].replace(str(dim_mo),
                                                      str(dim_nmo))
        text['coeff'][0] = text['coeff'][0].replace(str(dim_mo * dim_bs),
                                                    str(dim_nmo * dim_bs))
    if len(data['energy']) != len(text['energy']):
        print 'Warning: Spin symmetry not match!'
    amoeline = text['energy'][0]
    bmoeline = amoeline.replace('Alpha Orbital Energies',
                                'Beta Orbital Energies ')
    text['energy'] = [amoeline, bmoeline]
    amocline = text['coeff'][0]
    bmocline = amocline.replace('Alpha MO coefficients',
                                'Beta MO coefficients ')
    text['coeff'] = [amocline, bmocline]

    # print '%s generated.' % ofn
    f = open(ofn, 'w')
    write = f.write
    writes = lambda s: write(s + '\n')
    writel = lambda l: write('\n'.join(l) + '\n')

    writes(title)
    writel(text['info'][1:])
    for spin, energy in enumerate(data['energy']):
        writes(text['energy'][spin])
        for i, e in enumerate(['%16.8E' % e for e in energy]):
            write(e)
            if (i + 1) % 5 == 0:
                write('\n')
        if (i + 1) % 5 != 0:
            write('\n')
    for spin, coeff in enumerate(data['coeff']):
        writes(text['coeff'][spin])
        # print coeff
        for i, e in enumerate(['%16.8E' % e for e in coeff.reshape(1, -1)[0]]):
            write(e)
            if (i + 1) % 5 == 0:
                write('\n')
        if (i + 1) % 5 != 0:
            write('\n')
    writel(text['rest'])

    f.close()
    return ofn
예제 #2
0
파일: genfchk.py 프로젝트: fksheong/PIO
    if xoao.ndim == 2:
        if fmxo.ndim == 2:
            energies = np.diag(fmxo)
        elif fmxo.ndim == 1:
            energies = fmxo
        else:
            raise UserWarning('Invalid shape of fock matrix')
        assert energies.shape[0] == xoao.shape[0]
        data = {'energy': [energies], 'coeff': [xoao], 'dim': xoao.shape}
    elif xoao.ndim == 3:
        if fmxo.ndim == 3:
            energies = np.diagonal(fmxo, axis1=1, axis2=2)
        elif fmxo.ndim == 2:
            energies = fmxo
        else:
            raise UserWarning('Invalid shape of fock matrix')
        assert energies.shape[1] == xoao.shape[1]
        assert energies.shape[0] == 2
        assert xoao.shape[0] == 2
        data = {'energy': energies, 'coeff': xoao, 'dim': xoao.shape[1:]}
    else:
        raise UserWarning('Unrecognized data shape: %s' % xoao.shape)

    return gen_fchk(mfn, data, suffix=suffix, overwrite=overwrite)


if __name__ == '__main__':
    import sys
    mfn = sys.argv[1]
    gen_fchk(mfn, parse_fchk(mfn)['data'])