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 |