Statistiques
| Révision :

root / Parameters_sm_fsn_fss_fsv / pulvinus-images.cpp @ 19

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

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