12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- from dolfin import *
- import sympy as sp
- # Credits:
- # https://github.com/pf4d/fenics_scripts/calc_surface_area.py
- x, y = sp.symbols('x, y')
- # surface :
- def s(x,y): return sp.exp(x)
- # x-derivative of surface
- def dsdx(x,y): return s(x,y).diff(x, 1)
- # y-derivative of surface
- def dsdy(x,y): return s(x,y).diff(y, 1)
- # outward-pointing-normal-vector magnitude at surface :
- def n_mag_s(x,y): return sp.sqrt(1 + dsdx(x,y)**2 + dsdy(x,y)**2)
- # surface area of surface :
- def area(x,y): return sp.integrate(n_mag_s(x,y), (x,0,1), (y,0,1))
- A_exact = area(x,y)
- for n in [5,10,100,500]:
- mesh = UnitSquareMesh(n,n)
- Q = FunctionSpace(mesh, "CG", 1)
- e = Expression('exp(x[0])', degree=2)
- f = interpolate(e, Q)
- A_num = assemble( sqrt(f.dx(0)**2 + f.dx(1)**2 + 1) * dx)
- print('for n = %i -- error = %.2e' % (n, abs(A_exact.evalf()-A_num)))
- n = 10
- mesh = UnitSquareMesh(n,n)
- Q = FunctionSpace(mesh, "CG", 1)
- e = Expression('exp(x[0])', degree=2)
- f = interpolate(e, Q)
- A_vector = project( sqrt(f.dx(0)**2 + f.dx(1)**2 + 1), Q)
- from vedo.dolfin import plot
- plot(A_vector)
|