Statistiques
| Révision :

root / Final-Parameters_sm_fsn_fss_fsv / pulvinus-images.cpp @ 19

Historique | Voir | Annoter | Télécharger (10,02 ko)

1 9 akiss
include "getARGV.idp"
2 9 akiss
//include "bib_meca2d.cpp"
3 9 akiss
4 9 akiss
//usage :
5 9 akiss
//Freefem++ pulvinus.edp [-fE fEvalue] [-Nit Nit] [-geometry g]
6 9 akiss
//arguments:
7 9 akiss
//-fE fEvalue:
8 9 akiss
//-Nit Nit: number of iterations
9 9 akiss
//-geometry g: differnet geometries
10 9 akiss
//1:
11 9 akiss
//2:
12 9 akiss
//3:
13 9 akiss
14 9 akiss
15 9 akiss
16 9 akiss
func real lineD(real xA, real xB, real yA, real yB)
17 9 akiss
{        return (yB-yA)/(xB-xA);
18 9 akiss
}
19 9 akiss
20 9 akiss
func real lineC(real xA, real xB, real yA, real yB)
21 9 akiss
{        return (yA*xB-yB*xA)/(xB-xA);
22 9 akiss
}
23 9 akiss
24 9 akiss
//real PI=3.14159265;
25 9 akiss
26 9 akiss
func real angleToVertical(real Mx, real My, real Nx, real Ny)
27 9 akiss
{ /*  Computes the sinus of angle between the MN vector and Oy   */
28 9 akiss
        return asin((Nx-Mx)/sqrt((Mx-Nx)^2+(My-Ny)^2))*180/pi;
29 9 akiss
}
30 9 akiss
31 9 akiss
32 9 akiss
/*************************************************************
33 9 akiss
 *                  PARAMETERS
34 9 akiss
 * **********************************************************/
35 9 akiss
36 9 akiss
// reading script arguments
37 9 akiss
for (int i=0;i<ARGV.n;++i)
38 9 akiss
{ cout << ARGV[i] << " ";}
39 9 akiss
cout<<endl;
40 9 akiss
41 9 akiss
verbosity = getARGV("-vv", 0);
42 9 akiss
int vdebug = getARGV("-d", 1);
43 9 akiss
// swelling ability of each region is a parameter
44 9 akiss
real sm = -getARGV("-sm", 0.568354);// mesophyl swelling property
45 9 akiss
real fsn = getARGV("-fsn", 0.899975);// nectary     sn/sm
46 9 akiss
real fss = getARGV("-fss", 1.19112);// side        ss/sm
47 9 akiss
real fsv = getARGV("-fsv", 0.491088);// vasculature sv/sm
48 9 akiss
int Nit = getARGV("-Nit", 1);
49 9 akiss
string geom = getARGV("-geometry", "1");
50 9 akiss
string output = getARGV("-out", ".");
51 9 akiss
52 9 akiss
53 9 akiss
cout<<"----------------------------------------------"<< endl;
54 9 akiss
cout<<"   sm="<<sm<< endl;
55 9 akiss
56 9 akiss
// ---------------- geometrical parameters
57 9 akiss
58 9 akiss
// (lengths are measured in micrometers)
59 9 akiss
real units=200;
60 9 akiss
61 9 akiss
// pulvinus dimensions
62 9 akiss
real lx=491.0/units;       //sd =34.4
63 9 akiss
real ly= 240.0/units;      //sd=36.0
64 9 akiss
65 9 akiss
// nectary height
66 9 akiss
real hnect = 38.8/units;   //sd=9.6
67 9 akiss
real R=363.0/units;    //sd=49.4
68 9 akiss
69 9 akiss
// side dimensions
70 9 akiss
real hside=91.4/units;     //12.6
71 9 akiss
real lside=47.6/units/2;     //6.6
72 9 akiss
73 9 akiss
// vasculature dimensions
74 9 akiss
real vthickness=34.3/units;//5.5
75 9 akiss
real cwidth=74.8/units;    //15.2
76 9 akiss
real cwidthdry=44.2/units; //8.4
77 9 akiss
78 9 akiss
// vasculature displacement (from vascular bundle distance)
79 9 akiss
real vd=(cwidth-cwidthdry)/2;
80 9 akiss
real vposition=lx/2-vthickness-hnect/ly*(lx/2-cwidth/2-vthickness); //cout<<"vposition="<<vposition<<endl;
81 9 akiss
82 9 akiss
// mesh parameters
83 9 akiss
int nvertex=50; cout << "nvertex="<<nvertex<<endl;
84 9 akiss
real pinned=lx/nvertex/2;
85 9 akiss
86 9 akiss
87 9 akiss
// ---------------- Material properties
88 9 akiss
89 9 akiss
real nu = 0.29;    // Poisson's ratio
90 9 akiss
91 9 akiss
// Young modulus
92 9 akiss
real Ev;   // vasculature Young modulus
93 9 akiss
real fEm; // mesophyl Em/Ev
94 9 akiss
real fEn;  // nectary  En/Ev
95 9 akiss
real fEs;  // side     Es/Ev
96 9 akiss
97 9 akiss
// measured values for the density
98 9 akiss
//Region,Mean_tissue_density,SD_tissue_density
99 9 akiss
real dm=0.668060839; //sd=0.04091249
100 9 akiss
real dn=1.01896008; //sd=0.015464575
101 9 akiss
real ds=0.918032482; //sd=0.075097509
102 9 akiss
real dv=0.882171532; //sd=0.066651037
103 9 akiss
104 9 akiss
real nEd=1.0;
105 9 akiss
106 9 akiss
// Young modulus
107 9 akiss
Ev=1;   // vasculature Young modulus
108 9 akiss
fEm=(dm/dv)^nEd; // mesophyl Em/Ev
109 9 akiss
fEn=(dn/dv)^nEd;  // nectary  En/Ev
110 9 akiss
fEs=(ds/dv)^nEd;  // side     Es/Ev
111 9 akiss
112 9 akiss
// hydrophobicity as swelling ability
113 9 akiss
114 9 akiss
115 9 akiss
/*************************************************************
116 9 akiss
 *                  GEOMETRY and MESH
117 9 akiss
 * **********************************************************/
118 9 akiss
119 9 akiss
string geomfilename="geometry"+geom+".cpp";
120 9 akiss
cout<<"including "<<geomfilename<<endl;
121 9 akiss
include "geometry1.cpp";
122 9 akiss
123 9 akiss
// -------------------- define the finite element space
124 9 akiss
125 9 akiss
fespace Vh(Th,[P2,P2]);  // vector on the mesh (displacement vector)
126 9 akiss
Vh [u1,u2], [v1,v2];
127 9 akiss
128 9 akiss
fespace Sh(Th, P2);   // scalar on the mesh, P2 elements
129 9 akiss
fespace Sh0(Th,P0);   // scalar on the mesh, P0 elements
130 9 akiss
fespace Sh1(Th,P1);   // scalar on the mesh, P1 elements
131 9 akiss
132 9 akiss
Sh0 strain, stress;
133 9 akiss
134 9 akiss
// bounding box for the plot (use the same for all images so that they can be superposed)
135 9 akiss
func bb=[[-lx/2*1.5,-ly*1],[lx/2*1.5,ly*.1]];
136 9 akiss
real coef=1;
137 9 akiss
cout << "Coefficent of amplification:"<<coef<<endl;
138 9 akiss
//plot(Th, fill=1, ps=output+"/original_geometry.png", bb=bb); -------------------------------
139 9 akiss
140 9 akiss
// macro to redefine variables on the displaced mesh
141 9 akiss
macro redefineVariable(vvv)
142 9 akiss
{        real[int] temp(vvv[].n);
143 9 akiss
        temp=vvv[]; vvv=0; vvv[]=temp;
144 9 akiss
        vvv=vvv;
145 9 akiss
}//
146 9 akiss
147 9 akiss
148 9 akiss
real sqrt2=sqrt(2.);
149 9 akiss
macro epsilon(u1,u2)  [dx(u1),dy(u2),(dy(u1)+dx(u2))/sqrt2] // EOM
150 9 akiss
//the sqrt2 is because we want: epsilon(u1,u2)'* epsilon(v1,v2) $==  \epsilon(\bm{u}): \epsilon(\bm{v})$
151 9 akiss
macro div(u1,u2) ( dx(u1)+dy(u2) ) // EOM
152 9 akiss
153 9 akiss
/*************************************************************
154 9 akiss
 *                  MECHANICS
155 9 akiss
 * **********************************************************/
156 9 akiss
157 9 akiss
// definition of integer functions for the structural domains
158 9 akiss
func vasculature=int(vasculatureBool(x,y));
159 9 akiss
func nectary=int(nectaryBool(x,y));
160 9 akiss
func side=int(sideBool(x,y));
161 9 akiss
func mesophyl=int(mesophylBool(x,y));
162 9 akiss
func geometry = 1*vasculature + 3*nectary + 2*side + 4*mesophyl;
163 9 akiss
164 9 akiss
// definition of FE variables for the structural domains
165 9 akiss
Sh0 vasculatureh=vasculature;
166 9 akiss
//plot(vasculatureh,wait=1,value=true,fill=1, ps=output+"/vasculature-original.png", bb=bb);
167 9 akiss
168 9 akiss
Sh0 nectaryh=nectary;
169 9 akiss
//plot(nectaryh,wait=1,value=true,fill=1, ps=output+"/nectary-original.png", bb=bb);
170 9 akiss
171 9 akiss
Sh0 sideh=side;
172 9 akiss
//plot(sideh,wait=1,value=true,fill=1, ps=output+"/side-original.png", bb=bb);
173 9 akiss
174 9 akiss
Sh0 mesophylh=mesophyl;
175 9 akiss
//plot(mesophylh,wait=1,value=true,fill=1, ps=output+"/mesophyl-original.png", bb=bb);
176 9 akiss
177 9 akiss
Sh0 geometryh=geometry;
178 9 akiss
string fname=output+"/geometry-original.png";
179 9 akiss
plot(geometryh,fill=1, ps=fname, bb=bb);
180 9 akiss
181 9 akiss
// spatial dependence of Young modulus
182 9 akiss
func E=Ev*(vasculature + fEn*nectary + fEs*side + fEm*mesophyl);
183 9 akiss
Sh0 Eh=E;
184 9 akiss
185 9 akiss
// spatial dependence of the swelling property
186 9 akiss
func s=sm*(fsv*vasculature + fsn*nectary + fss*side + mesophyl);
187 9 akiss
Sh0 sh=s;
188 9 akiss
189 9 akiss
func mu=E/(2*(1+nu));
190 9 akiss
func lambda=E*nu/((1+nu)*(1-2*nu));
191 9 akiss
func K=lambda+2*mu/3;
192 9 akiss
193 9 akiss
194 9 akiss
195 9 akiss
/*************************************************************
196 9 akiss
 *                  SOLVING THE FEM
197 9 akiss
 * **********************************************************/
198 9 akiss
199 9 akiss
solve Lame([u1,u2],[v1,v2])=
200 9 akiss
  int2d(Th)(
201 9 akiss
            lambda*div(u1,u2)*div(v1,v2)
202 9 akiss
            + 2.*mu*( epsilon(u1,u2)'*epsilon(v1,v2) )
203 9 akiss
              )
204 9 akiss
  - int2d(Th) ( K*sh*div(v1,v2))
205 9 akiss
  + on(32,u1=vd,u2=0)
206 9 akiss
  + on(33,u1=-vd,u2=0)
207 9 akiss
  ;
208 9 akiss
209 9 akiss
210 9 akiss
stress=2*K*(strain-s);
211 9 akiss
212 9 akiss
Sh0 e11=dx(u1)+1.;
213 9 akiss
Sh0 e12=1/2.*(dx(u2) + dy(u1));
214 9 akiss
Sh0 e22=dy(u2)+1.;
215 9 akiss
216 9 akiss
strain=e11+e22 ;
217 9 akiss
Sh0 Det=e11*e22-e12*e12;
218 9 akiss
219 9 akiss
Sh0 l1=abs(strain+sqrt(strain*strain-4*Det))/2.;
220 9 akiss
Sh0 l2=abs(strain-sqrt(strain*strain-4*Det))/2.;
221 9 akiss
222 9 akiss
Sh0 lmax=(l1-l2+abs(l1-l2))/2.+l2;
223 9 akiss
Sh0 lmin=(l1-l2-abs(l1-l2))/2.+l2;
224 9 akiss
225 9 akiss
Sh0 strainanisotropy=lmin/lmax;
226 9 akiss
227 9 akiss
228 9 akiss
/*************************************************************
229 9 akiss
 *                  VISUALISATION
230 9 akiss
 * **********************************************************/
231 9 akiss
real voltotal0=int2d(Th)(1);
232 9 akiss
real volvasculature0=int2d(Th)(vasculatureh);
233 9 akiss
real volnectary0=int2d(Th)(nectaryh);
234 9 akiss
real volmesophyl0=int2d(Th)(mesophylh);
235 9 akiss
real volside0=int2d(Th)(sideh);
236 9 akiss
237 9 akiss
cout<<"Original volume="<<voltotal0<<endl;
238 9 akiss
cout<<"Original vasculature volume="<<volvasculature0<<endl;
239 9 akiss
240 9 akiss
241 9 akiss
242 9 akiss
// compute mean strain per region
243 9 akiss
real straintotal=int2d(Th)(strain)/voltotal0;
244 9 akiss
real strainvasculature=int2d(Th)(strain*vasculatureh)/volvasculature0;
245 9 akiss
real strainnectary=int2d(Th)(strain*nectaryh)/volnectary0;
246 9 akiss
real strainside=int2d(Th)(strain*sideh)/volside0;
247 9 akiss
real strainmesophyl=int2d(Th)(strain*mesophylh)/volmesophyl0;
248 9 akiss
249 9 akiss
250 9 akiss
// compute mean strain anisotropy per region
251 9 akiss
real satotal=int2d(Th)(strainanisotropy)/voltotal0;
252 9 akiss
real savasculature=int2d(Th)(strainanisotropy*vasculatureh)/volvasculature0;
253 9 akiss
real sanectary=int2d(Th)(strainanisotropy*nectaryh)/volnectary0;
254 9 akiss
real saside=int2d(Th)(strainanisotropy*sideh)/volside0;
255 9 akiss
real samesophyl=int2d(Th)(strainanisotropy*mesophylh)/volmesophyl0;
256 9 akiss
257 9 akiss
258 10 akiss
// =====================================================================
259 10 akiss
260 10 akiss
mesh Th0=Th;
261 10 akiss
Th=movemesh(Th,[x+u1*coef,y+u2*coef]);
262 10 akiss
263 10 akiss
264 9 akiss
cout<<"Mean strain and strain anisotropy per region :"<<endl;
265 9 akiss
cout<<"Mesophyll:"<<strainmesophyl<<"   "<<samesophyl<<endl;
266 9 akiss
cout<<"Nectary:"<<strainnectary<<"   "<<sanectary<<endl;
267 9 akiss
cout<<"Side:"<<strainside<<"   "<<saside<<endl;
268 9 akiss
cout<<"Vasculature:"<<strainvasculature<<"   "<<savasculature<<endl;
269 9 akiss
cout<<"Total:"<<straintotal<<"   "<<satotal<<endl;
270 9 akiss
271 9 akiss
272 9 akiss
plot(Th, Th0, wait=1, ps=output+"/geometry-deformed-superposed_sm"+string(sm)+"_fsn"+string(fsn)+"_fss"+string(fss)+"_fsv"+string(fsv)+".png",bb=bb);
273 9 akiss
274 9 akiss
275 9 akiss
redefineVariable(strain);
276 9 akiss
redefineVariable(stress);
277 9 akiss
plot(strain, fill=1,wait=1,value=true, ps="strain.png",bb=bb);
278 9 akiss
plot(stress, fill=1,wait=1,value=true, ps="stress.png",bb=bb);
279 9 akiss
280 9 akiss
281 9 akiss
redefineVariable(geometryh);
282 9 akiss
plot(geometryh, fill=1, ps=output+"/geometry-deformed_sm"+string(sm)+".png",bb=bb);
283 9 akiss
284 9 akiss
redefineVariable(vasculatureh);
285 9 akiss
redefineVariable(nectaryh);
286 9 akiss
redefineVariable(sideh);
287 9 akiss
redefineVariable(mesophylh);
288 9 akiss
289 9 akiss
// compute structure volumes
290 9 akiss
real voltotal=int2d(Th)(1);
291 9 akiss
real volvasculature=int2d(Th)(vasculatureh);
292 9 akiss
real volnectary=int2d(Th)(nectaryh);
293 9 akiss
real volside=int2d(Th)(sideh);
294 9 akiss
real volmesophyl=int2d(Th)(mesophylh);
295 9 akiss
296 9 akiss
cout<<"Deformed total volume="<<voltotal<<endl;
297 9 akiss
cout<<"Deformed vasculature volume="<<volvasculature<<endl;
298 9 akiss
299 9 akiss
300 9 akiss
/*************************************************************
301 9 akiss
 *         LOOKING FOR ANGLE AND NECKHEIGHT
302 9 akiss
 * **********************************************************/
303 9 akiss
304 9 akiss
// displaced upper corner
305 9 akiss
real Nx=lx/2+u1(lx/2.,0), Ny=u2(lx/2.,0);
306 9 akiss
307 9 akiss
308 9 akiss
// compute tangentangle
309 9 akiss
real height=ly/nvertex/100;
310 9 akiss
real Mx=lx/2+u1(lx/2.,-height), My=-height+u2(lx/2.,-height);
311 9 akiss
real tangentangle=angleToVertical(Mx, My, Nx, Ny);
312 9 akiss
cout<<"Tangent angle="<<tangentangle<<endl;
313 9 akiss
314 9 akiss
// compute sideangle
315 9 akiss
height=hside;
316 9 akiss
Mx=lx/2+u1(lx/2.,-height); My=-height+u2(lx/2.,-height);
317 9 akiss
real sideangle=angleToVertical(Mx, My, Nx, Ny);
318 9 akiss
319 9 akiss
320 9 akiss
cout<<"Side angle="<<sideangle<<endl;
321 9 akiss
322 9 akiss
323 9 akiss
real am=volmesophyl0/volmesophyl;
324 9 akiss
real an=volnectary0/volnectary;
325 9 akiss
real as=volside0/volside;
326 9 akiss
real av=volvasculature0/volvasculature;
327 9 akiss
328 9 akiss
329 9 akiss
330 9 akiss
/*************************************************************
331 9 akiss
 *         Writing results
332 9 akiss
 * **********************************************************/
333 9 akiss
334 9 akiss
335 10 akiss
cout<<"sm;fsn;fss;fsv;tangentangle;sideangle;am;an;as;av;sam;san;sas;sav"<<endl;
336 10 akiss
337 10 akiss
338 9 akiss
ofstream textfile(output+"/results.csv", append);
339 9 akiss
340 9 akiss
341 12 akiss
textfile<<sm<<";"<<fsn<<";"<<fss<<";"<<fsv
342 12 akiss
<<";"<<tangentangle/38<<";"<<sideangle/38
343 9 akiss
<<";"<<am<<";"<<an<<";"<<as<<";"<<av
344 9 akiss
<<";"<<samesophyl<<";"<<sanectary<<";"<<saside<<";"<<savasculature
345 9 akiss
<<endl;
346 9 akiss
347 12 akiss
cout<<sm<<";"<<fsn<<";"<<fss<<";"<<fsv
348 12 akiss
<<";"<<tangentangle/38<<";"<<sideangle/38
349 9 akiss
<<";"<<am<<";"<<an<<";"<<as<<";"<<av
350 9 akiss
<<";"<<samesophyl<<";"<<sanectary<<";"<<saside<<";"<<savasculature
351 9 akiss
<<endl;
352 9 akiss
353 9 akiss
354 9 akiss