class SlippingFault(SaddlePointProblem): """ simple example of saddle point problem """ def __init__(self, domain): super(SlippingFault, self).__init__(self) self.domain = domain self.__pde_u = LinearPDE(domain, numEquations=self.domain.getDim(), numSolutions=self.domain.getDim()) self.__pde_u.setSymmetryOn() def initialize(self, density=1., lmbd=1., mu=1., traction=Data(), fixed_u_mask=Data(), slip=0.): d = self.domain.getDim() self.slip = slip A = self.__pde_u.createCoefficientOfGeneralPDE("A") for i in range(self.domain.getDim()): for j in range(self.domain.getDim()): A[i, j, j, i] += mu A[i, j, i, j] += mu A[i, i, j, j] += lmbd self.__pde_u.setValue(A=A, q=fixed_u_mask, Y=-kronecker(Function(self.domain))[d - 1] * g * density, y=traction) def inner(self, p0, p1): return integrate(inner(p0, p1), FunctionOnContactZero(self.domain)) def solve_f(self, u, p, tol=1.e-8): self.__pde_u.setTolerance(tol) self.__pde_u.setValue(y_contact=-p) # print "p:",inf(p),sup(p) # print "u:",inf(u),sup(u) self.__pde_u.setValue(y_contact=-p) return self.__pde_u.getSolution() def solve_g(self, u, tol=1.e-8): dp = Vector(0., FunctionOnContactZero(self.domain)) h = FunctionOnContactZero(self.domain).getSize() # print jump(u)-self.slip dp[0] = (self.slip[0] - jump(u[0])) * lam_mu / h dp[1] = (self.slip[1] - jump(u[1])) * lam_mu / h dp[2] = (self.slip[2] - jump(u[2])) * lam_mu / h return dp
class StokesProblem(SaddlePointProblem): """ simple example of saddle point problem """ def __init__(self, domain, debug=False): super(StokesProblem, self).__init__(self, debug) self.domain = domain self.__pde_u = LinearPDE(domain, numEquations=self.domain.getDim(), numSolutions=self.domain.getDim()) self.__pde_u.setSymmetryOn() self.__pde_p = LinearPDE(domain) self.__pde_p.setReducedOrderOn() self.__pde_p.setSymmetryOn() def initialize(self, f=Data(), fixed_u_mask=Data(), eta=1): self.eta = eta A = self.__pde_u.createCoefficientOfGeneralPDE("A") for i in range(self.domain.getDim()): for j in range(self.domain.getDim()): A[i, j, j, i] += self.eta A[i, j, i, j] += self.eta self.__pde_p.setValue(D=1 / self.eta) self.__pde_u.setValue(A=A, q=fixed_u_mask, Y=f) def inner(self, p0, p1): return integrate(p0 * p1, Function(self.__pde_p.getDomain())) def solve_f(self, u, p, tol=1.e-8): self.__pde_u.setTolerance(tol) g = grad(u) self.__pde_u.setValue(X=self.eta * symmetric(g) + p * kronecker(self.__pde_u.getDomain())) return self.__pde_u.getSolution() def solve_g(self, u, tol=1.e-8): self.__pde_p.setTolerance(tol) self.__pde_p.setValue(X=-u) dp = self.__pde_p.getSolution() return dp
class SlippingFault(SaddlePointProblem): """ simple example of saddle point problem """ def __init__(self,domain): super(SlippingFault, self).__init__(self) self.domain=domain self.__pde_u=LinearPDE(domain,numEquations=self.domain.getDim(),numSolutions=self.domain.getDim()) self.__pde_u.setSymmetryOn() def initialize(self,density=1.,lmbd=1., mu=1., traction=Data(),fixed_u_mask=Data(), slip=0.): d=self.domain.getDim() self.slip=slip A =self.__pde_u.createCoefficientOfGeneralPDE("A") for i in range(self.domain.getDim()): for j in range(self.domain.getDim()): A[i,j,j,i] += mu A[i,j,i,j] += mu A[i,i,j,j] += lmbd self.__pde_u.setValue(A=A,q=fixed_u_mask,Y=-kronecker(Function(self.domain))[d-1]*g*density,y=traction) def inner(self,p0,p1): return integrate(inner(p0,p1),FunctionOnContactZero(self.domain)) def solve_f(self,u,p,tol=1.e-8): self.__pde_u.setTolerance(tol) self.__pde_u.setValue(y_contact=-p) # print "p:",inf(p),sup(p) # print "u:",inf(u),sup(u) self.__pde_u.setValue(y_contact=-p) return self.__pde_u.getSolution() def solve_g(self,u,tol=1.e-8): dp=Vector(0.,FunctionOnContactZero(self.domain)) h=FunctionOnContactZero(self.domain).getSize() # print jump(u)-self.slip dp[0]=(self.slip[0]-jump(u[0]))*lam_mu/h dp[1]=(self.slip[1]-jump(u[1]))*lam_mu/h dp[2]=(self.slip[2]-jump(u[2]))*lam_mu/h return dp
class StokesProblem(SaddlePointProblem): """ simple example of saddle point problem """ def __init__(self,domain,debug=False): super(StokesProblem, self).__init__(self,debug) self.domain=domain self.__pde_u=LinearPDE(domain,numEquations=self.domain.getDim(),numSolutions=self.domain.getDim()) self.__pde_u.setSymmetryOn() self.__pde_p=LinearPDE(domain) self.__pde_p.setReducedOrderOn() self.__pde_p.setSymmetryOn() def initialize(self,f=Data(),fixed_u_mask=Data(),eta=1): self.eta=eta A =self.__pde_u.createCoefficientOfGeneralPDE("A") for i in range(self.domain.getDim()): for j in range(self.domain.getDim()): A[i,j,j,i] += self.eta A[i,j,i,j] += self.eta self.__pde_p.setValue(D=1/self.eta) self.__pde_u.setValue(A=A,q=fixed_u_mask,Y=f) def inner(self,p0,p1): return integrate(p0*p1,Function(self.__pde_p.getDomain())) def solve_f(self,u,p,tol=1.e-8): self.__pde_u.setTolerance(tol) g=grad(u) self.__pde_u.setValue(X=self.eta*symmetric(g)+p*kronecker(self.__pde_u.getDomain())) return self.__pde_u.getSolution() def solve_g(self,u,tol=1.e-8): self.__pde_p.setTolerance(tol) self.__pde_p.setValue(X=-u) dp=self.__pde_p.getSolution() return dp