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)
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)