Statistiques
| Révision :

root / Parameters_fs / pulvinus-images.cpp @ 19

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

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