示例#1
0
	def ApplyConfigSection(self, configSection):
		self.DifferenceOrder = configSection.difference_order
		self.BandCount = (self.DifferenceOrder - 1) / 2
		self.BoundaryScaling = \
				array([.0] * (self.BandCount * (self.BandCount+1) / 2))
		self.Offset = 0
		self.Logger = GetClassLogger(self)
示例#2
0
	def SetupBasis(self, repr):
		self.Representation = repr
		baseRank = repr.GetBaseRank()
		self.GridSize = len(self.Representation.GetGlobalGrid(baseRank))
		self.DifferenceOrder = 1
		self.BandCount = (self.DifferenceOrder - 1) / 2
		self.BoundaryScaling = \
				array([.0] * (self.BandCount * (self.BandCount+1) / 2))
		self.Offset = 0
		self.Logger = GetClassLogger(self)
示例#3
0
class BasisfunctionFiniteDifference(BasisfunctionBase):
	"""
	Basisfunction class for finite differences. 

	Finite differences is not really a basis expansion, as it is
	always represented on a grid, but it's practical to have it 
	in this framework, as it makes it easier to switch between 
	FD and B-splines
	"""

	def ApplyConfigSection(self, configSection):
		self.DifferenceOrder = configSection.difference_order
		self.BandCount = (self.DifferenceOrder - 1) / 2
		self.BoundaryScaling = \
				array([.0] * (self.BandCount * (self.BandCount+1) / 2))
		self.Offset = 0
		self.Logger = GetClassLogger(self)

	def SetupBasis(self, repr):
		self.Representation = repr
		baseRank = repr.GetBaseRank()
		self.GridSize = len(self.Representation.GetGlobalGrid(baseRank))
		self.DifferenceOrder = 1
		self.BandCount = (self.DifferenceOrder - 1) / 2
		self.BoundaryScaling = \
				array([.0] * (self.BandCount * (self.BandCount+1) / 2))
		self.Offset = 0
		self.Logger = GetClassLogger(self)
		
	def GetGridRepresentation(self):
		return self.Representation

	def GetBasisRepresentation(self):
		return self.Representation
		
	def GetGeometryInfo(self, geometryName):
		geom = geometryName.lower().strip()
		if geom == "identity":
			return GeometryInfoCommonIdentity(True)
		elif geom == "diagonal":
			return GeometryInfoCommonDiagonal(self.Representation, True)
		else:
			diffOrderSearch =  re.search("-\d+", geom)
			if not diffOrderSearch:
				raise  UnsupportedGeometryException("BasisfunctionFiniteDifference requires specification of difference order, you said %s" % geometryName)

			self.DifferenceOrder =  eval(diffOrderSearch.group()[1:])
			self.BandCount = (self.DifferenceOrder - 1) / 2
			if geom.startswith == "dense":
				return GeometryInfoCommonDense(self.GridSize, True)
			elif re.search("bandeddistributed", geom):
				return GeometryInfoFiniteDifferenceBandedDistributed(self.Representation, self.BandCount, True)
			elif re.search("banded-nonhermitian", geom) or re.search("banded", geom):
				return GeometryInfoCommonBandedNonHermitian(self.GridSize, self.BandCount, True)
			else:
				raise UnsupportedGeometryException("Geometry '%s' not \
					supported by BasisfunctionFiniteDifference" % geometryName)

	def RepresentPotentialInBasis(self, source, dest, rank, 
	                              geometryInfo, differentiation, configSection):
		if differentiation == 0:
			diffMatrix = ones((self.GridSize, 1), dtype=complex)
		elif differentiation == 2:
			self.BoundaryScaling = getattr(configSection, "boundary_scaling%i"\
				%  rank, self.BoundaryScaling)
			self.Offset = getattr(configSection, "offset%i"\
				%  rank, self.Offset)
			self.Logger.debug("Using boundary condition scaling for rank %i: \
					%s" % (rank, self.BoundaryScaling))
			fd = core.FiniteDifferenceHelperCustomBoundary()
			baseRank = self.Representation.GetBaseRank()
			grid = self.Representation.GetGlobalGrid(baseRank)
			fd.Setup(grid, self.DifferenceOrder, self.BoundaryScaling, \
					self.Offset)
			diffMatrix = fd.SetupLaplacianBlasBanded().copy()
		else:
			raise Exception("Finite Difference currently only supports diff \
				of order 2")

		indexPairs = geometryInfo.GetGlobalBasisPairs()
		core.RepresentPotentialInBasisFiniteDifference(diffMatrix, source, dest, indexPairs, rank)