def restore(self, filename, inplace=True): '''Read diis contents from a diis file and replace the attributes of current diis object if needed, then construct the vector. ''' fdiis = misc.H5TmpFile(filename) if inplace: self.filename = filename self._diisfile = fdiis diis_keys = fdiis.keys() x_keys = [k for k in diis_keys if k[0] == 'x'] e_keys = [k for k in diis_keys if k[0] == 'e'] # errvec may be incomplete if program is terminated when generating errvec. # The last vector or errvec should be excluded. nd = min(len(x_keys), len(e_keys)) if nd == 0: return self if inplace: if fdiis[x_keys[0]].size < INCORE_SIZE or self.incore: for key in diis_keys: self._buffer[key] = numpy.asarray(fdiis[key]) if 'xprev' in diis_keys: self._xprev = fdiis['xprev'] else: for key in diis_keys: self._store(key, fdiis[key].value) if 'xprev' in diis_keys: self._store('xprev', numpy.asarray(fdiis['xprev'])) if 'xprev' in self._buffer: # incore self._xprev = self._buffer['xprev'] else: self._xprev = self._diisfile['xprev'] self._bookkeep = list(range(nd)) self._head = nd vecsize = 0 e_mat = [] for i in range(nd): dti = numpy.asarray(self.get_err_vec(i)) vecsize = dti.size for j in range(i + 1): dtj = self.get_err_vec(j) assert (dtj.size == vecsize) tmp = 0 for p0, p1 in misc.prange(0, vecsize, BLOCK_SIZE): tmp += numpy.dot(dti[p0:p1].conj(), dtj[p0:p1]) e_mat.append(tmp) dti = dtj = None e_mat = numpy_helper.unpack_tril(e_mat) space = max(nd, self.space) self._H = numpy.zeros((space + 1, space + 1), e_mat.dtype) self._H[0, 1:] = self._H[1:, 0] = 1 self._H[1:nd + 1, 1:nd + 1] = e_mat return self
def _store(self, key, value): incore = value.size < INCORE_SIZE or self.incore if incore: self._buffer[key] = value # save the error vector if filename is given, this file can be used to # restore the DIIS state if (not incore) or isinstance(self.filename, str): if self._diisfile is None: self._diisfile = misc.H5TmpFile(self.filename, 'w') if key in self._diisfile: self._diisfile[key][:] = value else: self._diisfile[key] = value # to avoid "Unable to find a valid file signature" error when reload the hdf5 # file from a crashed claculation self._diisfile.flush()