https://github.com/hpc-maths/GenEO
Tip revision: 47b05ef7165f6cee92daa3002503259f0ec84695 authored by gouarin on 28 May 2018, 11:31:32 UTC
fix binder
fix binder
Tip revision: 47b05ef
elasticity_2d.py
from __future__ import print_function, division
import sys, petsc4py
petsc4py.init(sys.argv)
import mpi4py.MPI as mpi
from petsc4py import PETSc
import numpy as np
from elasticity import *
# def rhs(coords, rhs):
# x = coords[..., 0]
# mask = x > 9.8
# rhs[mask, 0] = 0
# rhs[mask, 1] = -10
def rhs(coords, rhs):
rhs[..., 1] = -9.81
OptDB = PETSc.Options()
Lx = OptDB.getReal('Lx', 10)
Ly = OptDB.getReal('Ly', 1)
n = OptDB.getInt('n', 16)
nx = OptDB.getInt('nx', Lx*n)
ny = OptDB.getInt('ny', Ly*n)
hx = Lx/(nx - 1)
hy = Ly/(ny - 1)
da = PETSc.DMDA().create([nx, ny], dof=2, stencil_width=1)
da.setUniformCoordinates(xmax=Lx, ymax=Ly)
# constant young modulus
E = 30000
# constant Poisson coefficient
nu = 0.4
lamb = (nu*E)/((1+nu)*(1-2*nu))
mu = .5*E/(1+nu)
# lamb = .25
# mu = .1
x = da.createGlobalVec()
b = buildRHS(da, [hx, hy], rhs)
A = buildElasticityMatrix(da, [hx, hy], lamb, mu)
A.assemble()
# nullspace = PETSc.NullSpace().createRigidBody(da.getCoordinates())
# A.setNearNullSpace(nullspace)
bcApplyWest(da, A, b)
ksp = PETSc.KSP().create()
ksp.setOperators(A)
#ksp.setType("preonly")
#pc = ksp.getPC()
#pc.setType("lu")
ksp.setFromOptions()
#ksp.solve(b, x)
# viewer = PETSc.Viewer().createVTK('solution_2d_dir.vts', 'w', comm = PETSc.COMM_WORLD)
# x.view(viewer)
# A = buildElasticityMatrix(da, [hx, hy], lamb, mu)
# A.assemble()
# nullspace = PETSc.NullSpace().createRigidBody(da.getCoordinates())
# A.setNearNullSpace(nullspace)
# b = A*x
# viewer = PETSc.Viewer().createVTK('solution_2d_Ax.vts', 'w', comm = PETSc.COMM_WORLD)
# b.view(viewer)
# x1 = da.createGlobalVec()
# ksp = PETSc.KSP().create()
# ksp.setOperators(A)
# ksp.setType("preonly")
# pc = ksp.getPC()
# pc.setType("lu")
# ksp.setFromOptions()
# ksp.solve(b, x1)
# x2 = da.createGlobalVec()
# ksp = PETSc.KSP().create()
# ksp.setOperators(A)
# ksp.setType("cg")
# pc = ksp.getPC()
# pc.setType(None)
# ksp.setFromOptions()
# ksp.solve(b, x2)
# u, v, r = nullspace.getVecs()
# N = np.concatenate([u, v, r])
# N.shape = 3, x.size
# y1 = da.createGlobalVec()
# y1[:] = x1[:] - N.T@(N@x1[:])
# y2 = da.createGlobalVec()
# y2[:] = x2[:] - N.T@(N@x2[:])
# viewer = PETSc.Viewer().createVTK('solution_2d_y1.vts', 'w', comm = PETSc.COMM_WORLD)
# y1.view(viewer)
# viewer = PETSc.Viewer().createVTK('solution_2d_y2.vts', 'w', comm = PETSc.COMM_WORLD)
# y2.view(viewer)