@@ -223,7 +223,6 @@ def __init__(self, cell, kpts=None, exxdiv='ewald'):
223223 get_occ = get_occ
224224 energy_elec = energy_elec
225225 get_rho = khf .get_rho
226- analyze = NotImplemented
227226 canonicalize = canonicalize
228227
229228 def get_init_guess (self , cell = None , key = 'minao' , s1e = None ):
@@ -323,3 +322,37 @@ def to_cpu(self):
323322 mf = kuhf_cpu .KUHF (self .cell )
324323 utils .to_cpu (self , out = mf )
325324 return mf
325+
326+ def analyze (self , verbose = None , ** kwargs ):
327+ '''Analyze the given SCF object: print orbital energies, occupancies;
328+ print orbital coefficients; Mulliken population analysis; Dipole moment
329+ '''
330+ from pyscf .pbc .scf .kuhf import mulliken_meta
331+ if verbose is None :
332+ verbose = self .verbose
333+ log = logger .new_logger (self , verbose )
334+ mo_energy = self .mo_energy .get ()
335+ mo_occ = self .mo_occ .get ()
336+ cell = self .cell
337+ kpts = self .kpts
338+ if log .verbose >= logger .NOTE :
339+ self .dump_scf_summary (log )
340+ log .note ('**** MO energy ****' )
341+ log .note (' alpha | beta' )
342+ log .note ('k-point nocc HOMO/AU LUMO/AU | nocc HOMO/AU LUMO/AU' )
343+ for k , kpt in enumerate (cell .get_scaled_kpts (kpts )):
344+ nocca = np .count_nonzero (mo_occ [0 ,k ])
345+ noccb = np .count_nonzero (mo_occ [1 ,k ])
346+ homoa = mo_energy [0 ,k ,nocca - 1 ]
347+ homob = mo_energy [1 ,k ,noccb - 1 ]
348+ lumoa = mo_energy [0 ,k ,nocca ]
349+ lumob = mo_energy [1 ,k ,noccb ]
350+ log .note ('%2d (%6.3f %6.3f %6.3f) %2d %15.9f %15.9f |%2d %15.9f %15.9f' ,
351+ k , kpt [0 ], kpt [1 ], kpt [2 ], nocca , homoa , lumoa , noccb , homob , lumob )
352+
353+ log .note ('**** Population analysis for atoms in the reference cell ****' )
354+ s = self .get_ovlp (kpts = kpts ).get ()
355+ dm = self .make_rdm1 ().get ()
356+ pop , chg = mulliken_meta (cell , dm , kpts = kpts , s = s , verbose = verbose )
357+ dip = None
358+ return (pop , chg ), dip
0 commit comments