Esempio n. 1
0
def SaveEigenpairsSolverShiftInvert(solver, shiftInvertSolver):
	"""
	Saves the output of FindEigenvaluesInverseIterationsPiram, 
	including error estimates, to a hdf5 file.
	"""
	
	logger = GetFunctionLogger()

	conf = solver.BaseProblem.Config
	shift = conf.Eigenvalues.shift
	angularRank = 0

	#Get angular momentum and z-projection
	psi = solver.BaseProblem.psi
	angRange = \
		psi.GetRepresentation().GetRepresentation(angularRank).Range
	angSize = angRange.Count()
	l = sort(unique([angRange.GetLmIndex(i).l for i in range(angSize)]))
	m = sort(unique([angRange.GetLmIndex(i).m for i in range(angSize)]))

	#generate filename
	filename = NameGeneratorBoundstates(conf, l, m)

	#Get eigenvalue error estimates
	errorEstimatesPIRAM = solver.Solver.GetErrorEstimates()
	convergenceEstimatesEig = solver.Solver.GetConvergenceEstimates()
	errorEstimatesGMRES = shiftInvertSolver.Solver.GetErrorEstimateList()

	#Get eigenvalues
	prop = solver.BaseProblem
	E = 1.0 / array(solver.GetEigenvalues()) + shift

	#remove file if it exists
	try:
		if os.path.exists(filename):
			if pyprop.ProcId == 0:
				os.remove(filename)
	except:
		logger.error("Could not remove %s (%s)" % (filename, sys.exc_info()[1]))

	#Store eigenvalues and eigenvectors
	logger.info("Now storing eigenvectors...")
	for i in range(len(E)):
		solver.SetEigenvector(prop.psi, i)
		prop.SaveWavefunctionHDF(filename, GetEigenvectorDatasetPath(i))

	if pyprop.ProcId == 0:
		eigGroupName = GetEigenvectorGroupName()
		RemoveExistingDataset(filename, "/%s/Eigenvalues" % eigGroupName)
		RemoveExistingDataset(filename, "/%s/ErrorEstimateListGMRES" \
				% eigGroupName)
		RemoveExistingDataset(filename, "/%s/ErrorEstimateListPIRAM" \
				% eigGroupName)
		RemoveExistingDataset(filename, "/%s/ConvergenceEstimateEig" \
				% eigGroupName)
		h5file = tables.openFile(filename, "r+")
		try:
			#myGroup = h5file.createGroup("/", "Eig")
			myGroup = h5file.getNode(eigGroupName)
			h5file.createArray(myGroup, "Eigenvalues", E)
			h5file.createArray(myGroup, "ErrorEstimateListGMRES", errorEstimatesGMRES)
			h5file.createArray(myGroup, "ErrorEstimateListPIRAM", errorEstimatesPIRAM)
			h5file.createArray(myGroup, "ConvergenceEstimateEig", convergenceEstimatesEig)

			#Store config
			myGroup._v_attrs.configObject = prop.Config.cfgObj
			
			#PIRAM stats
			myGroup._v_attrs.opCount = solver.Solver.GetOperatorCount()
			myGroup._v_attrs.restartCount = solver.Solver.GetRestartCount()
			myGroup._v_attrs.orthCount = solver.Solver.GetOrthogonalizationCount()
		except:
			logger.warning("Warning: could not store eigenvalues and error estimates!")
		finally:
			h5file.close()

		pypar.barrier()