// capillary2.fe
// Demonstration of curved constraint - capillary meniscus in
// vertical tube.
// With additional constraint to prevent contact line edges from
// short-cutting the wall of the tube.
parameter radius = 1 // of tube
parameter height = 4 // of tube
parameter angle = 45 // interior contact angle, degrees
#define WALLT (-cos(angle*pi/180))
constraint 1 // the tube wall, for contact line
formula: x^2 + y^2 = radius^2
energy:
e1: -WALLT*z*y/radius
e2: WALLT*z*x/radius
e3: 0
constraint 2 // the tube wall, for display
formula: x^2 + y^2 = radius^2
// The zero level set of this constraint is a set of vertical planes
// through the axis of the tube, carefully constructed so they match
// up with where we want the contact line vertices.
parameter flute_count = 3 // start with 3 planes, enough for 6 vertices
constraint 3
formula: sin(flute_count*atan2(y,x))
vertices
// the meniscus
1 radius*cos(0*pi/3) radius*sin(0*pi/3) height/2 constraints 1,3
2 radius*cos(1*pi/3) radius*sin(1*pi/3) height/2 constraints 1,3
3 radius*cos(2*pi/3) radius*sin(2*pi/3) height/2 constraints 1,3
4 radius*cos(3*pi/3) radius*sin(3*pi/3) height/2 constraints 1,3
5 radius*cos(4*pi/3) radius*sin(4*pi/3) height/2 constraints 1,3
6 radius*cos(5*pi/3) radius*sin(5*pi/3) height/2 constraints 1,3
// bottom of tube
11 radius*cos(0*pi/3) radius*sin(0*pi/3) 0 constraint 2
12 radius*cos(1*pi/3) radius*sin(1*pi/3) 0 constraint 2
13 radius*cos(2*pi/3) radius*sin(2*pi/3) 0 constraint 2
14 radius*cos(3*pi/3) radius*sin(3*pi/3) 0 constraint 2
15 radius*cos(4*pi/3) radius*sin(4*pi/3) 0 constraint 2
16 radius*cos(5*pi/3) radius*sin(5*pi/3) 0 constraint 2
// top of tube
21 radius*cos(0*pi/3) radius*sin(0*pi/3) height constraint 2
22 radius*cos(1*pi/3) radius*sin(1*pi/3) height constraint 2
23 radius*cos(2*pi/3) radius*sin(2*pi/3) height constraint 2
24 radius*cos(3*pi/3) radius*sin(3*pi/3) height constraint 2
25 radius*cos(4*pi/3) radius*sin(4*pi/3) height constraint 2
26 radius*cos(5*pi/3) radius*sin(5*pi/3) height constraint 2
edges
// the meniscus
1 1 2 constraint 1,3
2 2 3 constraint 1,3
3 3 4 constraint 1,3
4 4 5 constraint 1,3
5 5 6 constraint 1,3
6 6 1 constraint 1,3
// the bottom of the tube
7 11 12 constraint 2 fixed bare no_refine
8 12 13 constraint 2 fixed bare no_refine
9 13 14 constraint 2 fixed bare no_refine
10 14 15 constraint 2 fixed bare no_refine
11 15 16 constraint 2 fixed bare no_refine
12 16 11 constraint 2 fixed bare no_refine
// top of the tube
13 21 22 constraint 2 fixed bare no_refine
14 22 23 constraint 2 fixed bare no_refine
15 23 24 constraint 2 fixed bare no_refine
16 24 25 constraint 2 fixed bare no_refine
17 25 26 constraint 2 fixed bare no_refine
18 26 21 constraint 2 fixed bare no_refine
// Verticals sides of tube
19 11 21 constraint 2 fixed bare no_refine
20 12 22 constraint 2 fixed bare no_refine
21 13 23 constraint 2 fixed bare no_refine
22 14 24 constraint 2 fixed bare no_refine
23 15 25 constraint 2 fixed bare no_refine
24 16 26 constraint 2 fixed bare no_refine
faces
1 1 2 3 4 5 6
bodies
1 1 volume pi*radius^2*height/2
read
// get top and bottom round-looking
refine edge where original >= 7 and original <= 18
refine edge where original >= 7 and original <= 18
refine edge where original >= 7 and original <= 18
// redefine the r command to increase flute_count
r :::= { flute_count *= 2; 'r'; }