-
Notifications
You must be signed in to change notification settings - Fork 21
Expand file tree
/
Copy pathpipe.fee
More file actions
93 lines (69 loc) · 3.24 KB
/
Copy pathpipe.fee
File metadata and controls
93 lines (69 loc) · 3.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# from https://github.com/seamplex/pipe-linearize
# convergence study of linearized stresses in an infinite pipe
# with respect to the number of elements in the pipe thickness
PROBLEM mechanical PC mumps
# PETSC_OPTIONS -mg_levels_pc_type sor
# t0 = wall_time() # initial wall time
# read mesh according to shape $1, order $2 and number of elements through thickness $2
DEFAULT_ARGUMENT_VALUE 2 2
DEFAULT_ARGUMENT_VALUE 3 2
READ_MESH pipe-$1-$2-$3.msh
# problem parameters for
# 12"-inch schedule 100
b = 323.8/2 # external radius [ mm ]
a = b-21.5 # internal radius [ mm ]
l = 2*(b-a) # axial length [ mm ]
E = 200e3 # Young modulus [ MPa ]
nu = 0.3 # Poisson's ratio [ non-dimensional ]
p = 10 # internal pressure [ MPa ]
# ------------------------------------------------------------------------
# definition of analytical solutions for comparison from
# <http://eprints.whiterose.ac.uk/110536/1/art%253A10.1007%252Fs00707-016-1762-7.pdf>
ur(x,y,z) = (p*a^2*sqrt(y^2+z^2))/(E*(b^2-a^2)) * ((1-2*nu)*(1+nu) + (1+nu)*b^2/(y^2+z^2))
sigmal(x,y,z) = 2*nu*p*a^2/(b^2-a^2)
sigmar(x,y,z) = p*a^2/(b^2-a^2) * (1 - b^2/(y^2+z^2))
sigmatheta(x,y,z) = p*a^2/(b^2-a^2) * (1 + b^2/(y^2+z^2))
# principal stresses along the radial coordinate (may be y or z)
sigma1_anal(r) = sigmatheta(0,0,r)
sigma2_anal(r) = sigmal(0,0,r)
sigma3_anal(r) = sigmar(0,0,r)
# computation of main membrane stresses
M1 = 1/(b-a)*integral(sigma1_anal(r), r, a, b)
M2 = 1/(b-a)*integral(sigma2_anal(r), r, a, b)
M3 = 1/(b-a)*integral(sigma3_anal(r), r, a, b)
# von mises and tresca membrane stresses
Mt_anal = max(abs(M1-M2), abs(M2-M3), abs(M3-M1))
Mv_anal = sqrt(((M1-M2)^2 + (M2-M3)^2 + (M3-M1)^2)/2)
# computation of membrane plus bending stresses
MB1 = M1 + 6/(b-a)^2*integral(sigma1_anal(r)*((a+b)/2-r), r, a, b)
MB2 = M2 + 6/(b-a)^2*integral(sigma2_anal(r)*((a+b)/2-r), r, a, b)
MB3 = M3 + 6/(b-a)^2*integral(sigma3_anal(r)*((a+b)/2-r), r, a, b)
# von mises and tresca
MBv_anal = sqrt(((MB1-MB2)^2 + (MB2-MB3)^2 + (MB3-MB1)^2)/2)
MBt_anal = max(abs(MB1-MB2), abs(MB2-MB3), abs(MB3-MB1))
# set boundary conditions
BC pressure pressure=p
BC front tangential radial
BC back tangential radial
SOLVE_PROBLEM
# write distribution of results in gmsh format (optional)
# WRITE_MESH pipe-out-$1-$2-$3.msh VECTOR u v w sigma1 sigma2 sigma3 sigmax sigmay sigmaz tauxy tauyz tauzx
# write same thing as ASCII data
# PRINT_FUNCTION v sigma1 sigma2 sigma3 MIN 0 a 0 MAX 0 b 0 NSTEPS 1 200 1 FILE pipe-dist-$1-$2-$3.dat
# compute linearized stresses for both von Mises and Tresca
LINEARIZE_STRESS FROM 0 a 0 TO 0 b 0 M Mv MB MBv Mt Mt MBt MBt
# compute L2 errors
volume = pi*(b^2-a^2)*l
h = (volume/cells)^(1/3)
ur_fea(x,y,z) = sqrt(v(x,y,z)^2+w(x,y,z)^2)
INTEGRATE (ur_fea(x,y,z)-ur(x,y,z))^2 RESULT e2ur
INTEGRATE (sigma1(x,y,z)-sigmatheta(x,y,z))^2 RESULT e2sigma1
INTEGRATE (sigma3(x,y,z)-sigmar(x,y,z))^2 RESULT e2sigma3
error_ur = sqrt(e2ur)/volume
error_sigma1 = sqrt(e2sigma1)/volume
error_sigma3 = sqrt(e2sigma3)/volume
error_Mv = abs(Mv-Mv_anal)/Mv_anal
error_MBv = abs(MBv-MBv_anal)/Mv_anal
error_Mt = abs(Mt-Mt_anal)/Mv_anal
error_MBt = abs(MBt-MBt_anal)/Mv_anal
PRINT error_ur+error_sigma1+error_sigma3+error_Mv+error_MBv+error_Mt+error_MBt