Guest User

MRE.py

a guest
Jul 16th, 2015
409
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.16 KB | None | 0 0
  1.  
  2. from dolfin import *
  3. import numpy as np
  4.  
  5. import sys
  6.  
  7. discret=2
  8. mesh =  UnitCubeMesh(discret,discret,discret)
  9.  
  10. dolfin.plot(mesh, "3D mesh")
  11.  
  12. FS = FunctionSpace(mesh, "CG", 2)
  13.  
  14. W = MixedFunctionSpace([FS, FS, FS, FS, FS, FS, FS, FS, FS, FS,
  15.                         FS, FS, FS, FS, FS, FS, FS, FS, FS, FS,
  16.                         FS, FS, FS, FS, FS, FS, FS, FS, FS, FS])
  17.  
  18. (u0, u1, u2, v000, v001, v002, v010, v011, v012, v020, v021, v022, v100, v101, v102, v110, v111, v112, v120, v121, v122, v200, v201, v202, v210, v211, v212, v220, v221, v222) = TrialFunctions(W)
  19. (du0, du1, du2, dv000, dv001, dv002, dv010, dv011, dv012, dv020, dv021, dv022, dv100, dv101, dv102, dv110, dv111, dv112, dv120, dv121, dv122, dv200, dv201, dv202, dv210, dv211, dv212, dv220, dv221, dv222) = TestFunctions(W)
  20.  
  21. # Lower face
  22. def DB_0(x, on_boundary):
  23.     return x[2] < DOLFIN_EPS and on_boundary
  24.  
  25. # Point on upper face
  26. TOL = 1e-3
  27. class Pinpoint(SubDomain):
  28.     def __init__(self, coords):
  29.         self.coords = np.array(coords)
  30.         SubDomain.__init__(self)
  31.     def move(self, coords):
  32.         self.coords[:] = np.array(coords)
  33.     def inside(self, x, on_boundary):
  34.         return np.linalg.norm(x-self.coords) < TOL
  35.  
  36. pinpoint = Pinpoint([0.5, 0.5, 1.0])
  37.  
  38. # Neumann boundary: everything but the lower face
  39.  
  40. class Neumann(SubDomain):
  41.     def inside(self, x, on_boundary):
  42.         return x[0] < DOLFIN_EPS and on_boundary or \
  43.         x[0] > 1.0 - DOLFIN_EPS and on_boundary or \
  44.         x[1] < DOLFIN_EPS and on_boundary or \
  45.         x[1] > 1.0 - DOLFIN_EPS and on_boundary  or \
  46.         x[2] > 1.0 - DOLFIN_EPS and on_boundary
  47.  
  48. subdomains = MeshFunction("double", mesh)
  49. neumann = Neumann()
  50. neumann.mark(subdomains, 1)
  51.  
  52. # Displacement boundary condition on Dirichlet boundary (lower face and pinpoint)
  53. u0_0=Expression('0.0')
  54. u1_0=Expression('0.0')
  55. u2_0=Expression('0.0')
  56. u0_1=Expression('0.0')
  57. u1_1=Expression('0.0')
  58. u2_1=Expression('-0.01')
  59.  
  60. bc = [
  61. DirichletBC(W.sub(0), u0_0, DB_0),
  62. DirichletBC(W.sub(1), u1_0, DB_0),
  63. DirichletBC(W.sub(2), u2_0, DB_0),
  64. DirichletBC(W.sub(0), u0_1, pinpoint, 'pointwise'),
  65. DirichletBC(W.sub(1), u1_1, pinpoint, 'pointwise'),
  66. DirichletBC(W.sub(2), u2_1, pinpoint, 'pointwise')]
  67.  
  68. # Isotropic stiffness tetradic and hexadic
  69. delta=[[1,0,0],[0,1,0],[0,0,1]]
  70. lambada=100.0
  71. mu=100.0
  72. c1=0.0
  73. c2=0.0
  74. c3=0.0
  75. c4=10.0
  76. c5=0.0
  77.  
  78. C4=[[[[
  79.     lambada*delta[i][j]*delta[k][l]+mu*(delta[i][k]*delta[j][l]+delta[i][l]*delta[j][k])
  80.     for i in range(3)]
  81.     for j in range(3)]
  82.     for k in range(3)]
  83.     for l in range(3)]
  84.    
  85. C6=[[[[[[
  86.     c1 * ( delta[i][j]*delta[k][l]*delta[m][n] + delta[i][j]*delta[k][m]*delta[l][n] + delta[i][k]*delta[j][n]*delta[l][m] + delta[i][n]*delta[k][j]*delta[l][m] ) +
  87.     c2 * ( delta[i][k]*delta[j][l]*delta[m][n] + delta[i][l]*delta[j][k]*delta[m][n] + delta[i][k]*delta[j][m]*delta[l][n] + delta[i][m]*delta[k][j]*delta[l][n] ) +
  88.     c3 * ( delta[i][l]*delta[j][n]*delta[k][m] + delta[i][n]*delta[k][m]*delta[j][l] + delta[i][m]*delta[k][l]*delta[j][n] + delta[i][n]*delta[k][l]*delta[m][j] ) +
  89.     c4 * ( delta[i][m]*delta[k][n]*delta[j][l] + delta[i][l]*delta[j][m]*delta[k][n] ) +
  90.     c5 *   delta[i][j]*delta[k][n]*delta[l][m]
  91.     for i in range(3)]
  92.     for j in range(3)]
  93.     for k in range(3)]
  94.     for l in range(3)]
  95.     for m in range(3)]
  96.     for n in range(3)]
  97.  
  98. # Generation of equation string
  99.  
  100. eq1 = "("
  101. for i in range(3):
  102.     for j in range(3):
  103.         for k in range(3):
  104.             eq1 = eq1 + ("+v"+"%g%g%g" %(i,j,k) +"*dv"+"%g%g%g" %(i,j,k))
  105.             eq1 = eq1 + ("+u%g.dx(%g)" %(i,j) +"*dv%g%g%g.dx(%g)" %(i,j,k,k))
  106.             for l in range(3):
  107.                 if(C4[i][j][k][l]!=0.0):
  108.                     eq1 = eq1 + "+C4[%g][%g][%g][%g]*v%g%g%g*du%g" %(i,j,k,l,k,l,j,i)
  109.                 for m in range(3):
  110.                     for n in range(3):
  111.                         if(C6[i][j][k][l][m][n]!=0.0):
  112.                             eq1 = eq1 + "+C6[%g][%g][%g][%g][%g][%g]*v%g%g%g.dx(%g)*du%g.dx(%g)" %(i,j,k,l,m,n,l,m,n,j,i,k)
  113.  
  114. eq1 = eq1+")*dx"
  115.  
  116. n = FacetNormal(mesh)
  117.  
  118. eq2 = "("
  119.  
  120. for i in range(3):
  121.     for j in range(3):
  122.         for k in range(3):
  123.             eq2 = eq2 + "-u%g.dx(%g)*n[%g]*dv%g%g%g" %(i,j,k,i,j,k)
  124.             for l in range(3):
  125.                 for m in range(3):
  126.                     for o in range(3):
  127.                         if(C6[i][j][k][l][m][o]!=0.0):
  128.                             eq2 = eq2 + "-C6[%g][%g][%g][%g][%g][%g]*v%g%g%g.dx(%g)*n[%g]*du%g" %(i,j,k,l,m,o,l,m,o,j,k,i)
  129.  
  130. eq2 = eq2 + ")*ds(1)"
  131.  
  132. a=eval(eq1+"+"+eq2)
  133.  
  134. z = Constant(0.0)
  135. L = z*(du0+du1+du2+dv000+dv001+dv002+dv010+dv011+dv012+dv020+dv021+dv022+dv100+dv101+dv102+dv110+dv111+dv112+dv120+dv121+dv122+dv200+dv201+dv202+dv210+dv211+dv212+dv220+dv221+dv222)*dx
  136.  
  137. w = Function(W)
  138.  
  139. solve(a == L, w, bc)
  140. #~ solve(a == L, w, bc, solver_parameters={'linear_solver':'mumps'})
  141.  
  142. (u0, u1, u2, v000, v001, v002, v010, v011, v012, v020, v021, v022, v100, v101, v102, v110, v111, v112, v120, v121, v122, v200, v201, v202, v210, v211, v212, v220, v221, v222) = w.split(deepcopy=True)
  143.  
  144. # Plot displacements
  145. plot(u0, title="u_x")
  146. plot(u1, title="u_y")
  147. plot(u2, title="u_z")
  148.  
  149. # Plot norm of strain tensor
  150. plot(sqrt(u0.dx(0)*u0.dx(0)+
  151.           u1.dx(1)*u1.dx(1)+
  152.           u2.dx(2)*u2.dx(2)+
  153.           2.0*(0.5*(u0.dx(1)+u1.dx(0)))*(0.5*(u0.dx(1)+u1.dx(0)))+
  154.           2.0*(0.5*(u0.dx(2)+u2.dx(0)))*(0.5*(u0.dx(2)+u2.dx(0)))+
  155.           2.0*(0.5*(u1.dx(2)+u2.dx(1)))*(0.5*(u1.dx(2)+u2.dx(1)))),title="norm sym grad u")
  156.  
  157. # plot usual elastic energy
  158. string=""
  159. for i in range(3):
  160.     for j in range(3):
  161.         for k in range(3):
  162.             for l in range(3):
  163.                 string=string+ "+C4[%g][%g][%g][%g]*u%g.dx(%g)*u%g.dx(%g)" %(i,j,k,l,i,j,k,l)
  164.  
  165. plot(eval(string),title="el energy classical part")
  166.  
  167. # plot gradient elastic energy
  168. string=""
  169. for i in range(3):
  170.     for j in range(3):
  171.         for k in range(3):
  172.             for l in range(3):
  173.                 for m in range(3):
  174.                     for n in range(3):
  175.                         string=string+ "+C6[%g][%g][%g][%g][%g][%g]*v%g%g%g*v%g%g%g" %(i,j,k,l,m,n,i,j,k,l,m,n)
  176.  
  177. plot(eval(string),title="el energy gradient part")
  178.  
  179. interactive()
Advertisement
Add Comment
Please, Sign In to add comment