Statistiques
| Révision :

root / Test-Formulation / test-formulation.cpp @ 19

Historique | Voir | Annoter | Télécharger (3,94 ko)

1 2 akiss
include "getARGV.idp"
2 2 akiss
3 2 akiss
//usage :
4 2 akiss
//Freefem++ test-formulation.cpp [-fE fEvalue] [-Nit Nit] [-geometry g]
5 2 akiss
//arguments:
6 2 akiss
//-fE fEvalue:
7 2 akiss
//-Nit Nit: number of iterations
8 2 akiss
//-geometry g: differnet geometries
9 2 akiss
//1:
10 2 akiss
//2:
11 2 akiss
//3:
12 2 akiss
13 2 akiss
14 2 akiss
/*************************************************************
15 2 akiss
 *                  PARAMETERS
16 2 akiss
 * **********************************************************/
17 2 akiss
18 2 akiss
// reading script arguments
19 2 akiss
for (int i=0;i<ARGV.n;++i)
20 2 akiss
{ cout << ARGV[i] << " ";}
21 2 akiss
cout<<endl;
22 2 akiss
23 2 akiss
verbosity = getARGV("-vv", 0);
24 2 akiss
int vdebug = getARGV("-d", 1);
25 2 akiss
real E = getARGV("-E", 0.2);
26 2 akiss
real s = -getARGV("-s", 0.4);
27 2 akiss
string outputdir = getARGV("-out", ".");
28 2 akiss
29 2 akiss
30 2 akiss
cout<<"----------------------------------------------"<< endl;
31 2 akiss
cout<<"E="<<E <<"   s="<<s<< endl;
32 2 akiss
33 2 akiss
// ---------------- geometrical parameters
34 2 akiss
35 2 akiss
// (lengths are measured in micrometers)
36 2 akiss
real units=1;
37 2 akiss
38 2 akiss
// pulvinus dimensions
39 2 akiss
real lx=1/units;       //sd =34.4
40 2 akiss
real ly= 1/units;      //sd=36.0
41 2 akiss
42 2 akiss
43 2 akiss
// mesh parameters
44 2 akiss
int nvertex=10;
45 2 akiss
cout << "nvertex="<<nvertex<<endl;
46 2 akiss
47 2 akiss
int[int] labs=[10,20,30,40]; // bottom, right, top, left
48 2 akiss
mesh Th=square(lx*nvertex,ly*nvertex, label=labs, region=0, [x*lx,y*ly]);
49 2 akiss
50 2 akiss
// bounding box for the plot (use the same for all images so that they can be superposed)
51 2 akiss
func bb=[[-1,-1],[lx+1,ly+1]];
52 2 akiss
real coef=1;
53 2 akiss
54 2 akiss
string root=outputdir+"/test-formulation";
55 2 akiss
56 2 akiss
57 2 akiss
// -------------------- define the finite element space
58 2 akiss
59 2 akiss
fespace Vh(Th,[P2,P2]);  // vector on the mesh (displacement vector)
60 2 akiss
Vh [u1,u2], [v1,v2];
61 2 akiss
62 2 akiss
fespace Sh(Th, P2);   // scalar on the mesh, P2 elements
63 2 akiss
fespace Sh0(Th,P0);   // scalar on the mesh, P0 elements
64 2 akiss
fespace Sh1(Th,P1);   // scalar on the mesh, P1 elements
65 2 akiss
66 2 akiss
Sh0 Eh=E;// Young modulus
67 2 akiss
Sh0 sh=s;// hydrophobicity as swelling ability
68 2 akiss
real nu = 0.29;    // Poisson's ratio
69 2 akiss
70 2 akiss
71 2 akiss
func mu=E/(2*(1+nu));
72 2 akiss
func lambda=E*nu/((1+nu)*(1-2*nu));
73 9 akiss
//func K=lambda+2*mu/3;
74 9 akiss
func K=lambda+mu;
75 2 akiss
76 2 akiss
// macro to redefine variables on the displaced mesh
77 2 akiss
macro redefineVariable(vvv)
78 2 akiss
{        real[int] temp(vvv[].n);
79 2 akiss
        temp=vvv[]; vvv=0; vvv[]=temp;
80 2 akiss
        vvv=vvv;
81 2 akiss
}//
82 2 akiss
83 2 akiss
84 2 akiss
real sqrt2=sqrt(2.);
85 2 akiss
macro epsilon(u1,u2)  [dx(u1),dy(u2),(dy(u1)+dx(u2))/sqrt2] // EOM
86 2 akiss
//the sqrt2 is because we want: epsilon(u1,u2)'* epsilon(v1,v2) $==  \epsilon(\bm{u}): \epsilon(\bm{v})$
87 2 akiss
macro div(u1,u2) ( dx(u1)+dy(u2) ) // EOM
88 2 akiss
89 2 akiss
90 2 akiss
/*************************************************************
91 2 akiss
 *                  SOLVING THE FEM
92 2 akiss
 * **********************************************************/
93 2 akiss
94 2 akiss
solve Lame([u1,u2],[v1,v2])=
95 2 akiss
  int2d(Th)(
96 2 akiss
            lambda*div(u1,u2)*div(v1,v2)
97 2 akiss
            + 2.*mu*( epsilon(u1,u2)'*epsilon(v1,v2) )
98 2 akiss
              )
99 2 akiss
  - int2d(Th) ( K*sh*div(v1,v2))
100 9 akiss
  + on(10,u2=0, u1=0)
101 9 akiss
  //+ on(40,u1=0)
102 2 akiss
  ;
103 2 akiss
104 2 akiss
105 2 akiss
/*************************************************************
106 2 akiss
 * **********************************************************/
107 2 akiss
108 2 akiss
109 9 akiss
Sh0 e11=dx(u1)+1.;
110 9 akiss
Sh0 e12=1/2.*(dx(u2) + dy(u1));
111 9 akiss
Sh0 e22=dy(u2)+1.;
112 2 akiss
113 9 akiss
Sh0 strain=e11+e22 ;
114 9 akiss
Sh0 Det=e11*e22-e12*e12;
115 2 akiss
116 9 akiss
Sh0 l1=abs(strain+sqrt(strain*strain-4*Det))/2.;
117 9 akiss
Sh0 l2=abs(strain-sqrt(strain*strain-4*Det))/2.;
118 2 akiss
119 9 akiss
Sh0 lmax=(l1-l2+abs(l1-l2))/2.+l2;
120 9 akiss
Sh0 lmin=(l1-l2-abs(l1-l2))/2.+l2;
121 2 akiss
122 9 akiss
Sh0 strainanisotropy=lmin/lmax;
123 9 akiss
plot(strainanisotropy, fill=1, value=true, ps="satrainanisotropy-s"+string(s)+".png",  bb=bb, wait=1);
124 2 akiss
125 9 akiss
mesh Thm1=movemesh(Th, [x+u1, y+u2]);
126 9 akiss
plot(Th, Thm1, ps=root+"_geometry-moved.png", wait=1, bb=bb);
127 9 akiss
128 9 akiss
129 9 akiss
// compute original and deformed volume
130 9 akiss
131 9 akiss
real vol0=int2d(Th)(1);
132 9 akiss
real vol=int2d(Thm1)(1);
133 9 akiss
134 9 akiss
// compute mean strain
135 9 akiss
real meanstrain=int2d(Th)(strain/2)/vol0;
136 9 akiss
137 9 akiss
// compute mean strain anisotropy
138 9 akiss
real straina0=int2d(Th)(strainanisotropy)/vol0;
139 9 akiss
140 9 akiss
real straina1=int2d(Thm1)(strainanisotropy)/vol;
141 9 akiss
142 9 akiss
real strainamixed=int2d(Thm1)(strainanisotropy)/vol0;
143 9 akiss
144 9 akiss
145 9 akiss
146 9 akiss
cout<<"Initial volume:"<<string(vol0)<<endl;
147 9 akiss
cout<<"Final volume:"<<string(vol)<<endl;
148 9 akiss
cout<<"A1/A0="<<vol/vol0<<endl;
149 9 akiss
cout<<"Mean strain:"<<string(meanstrain)<<endl;
150 9 akiss
cout<<"Strain anisotropy 0:"<<string(straina0)<<endl;
151 9 akiss
cout<<"Strain anisotropy 1:"<<string(straina1)<<endl;
152 9 akiss
cout<<"Strain anisotropy mixed:"<<string(strainamixed)<<endl;
153 9 akiss
154 9 akiss
155 9 akiss
plot(Th, Thm1, ps="deformation-s"+string(s)+".png",  bb=bb, wait=1);
156 9 akiss