Statistiques
| Révision :

root / Final-Parameters_sm_fsn_fss_fsv / pulvinus4optimize.cpp @ 15

Historique | Voir | Annoter | Télécharger (7,55 ko)

1 9 akiss
include "getARGV.idp"
2 9 akiss
3 9 akiss
func real lineD(real xA, real xB, real yA, real yB)
4 9 akiss
{        return (yB-yA)/(xB-xA);
5 9 akiss
}
6 9 akiss
7 9 akiss
func real lineC(real xA, real xB, real yA, real yB)
8 9 akiss
{        return (yA*xB-yB*xA)/(xB-xA);
9 9 akiss
}
10 9 akiss
11 9 akiss
func real angleToVertical(real Mx, real My, real Nx, real Ny)
12 9 akiss
{ /*  Computes the angle between the MN vector and Oy (in degrees) */
13 9 akiss
        return asin((Nx-Mx)/sqrt((Mx-Nx)^2+(My-Ny)^2))*180/pi;
14 9 akiss
}
15 9 akiss
16 9 akiss
17 9 akiss
/*************************************************************
18 9 akiss
 *                  PARAMETERS
19 9 akiss
 * **********************************************************/
20 9 akiss
21 9 akiss
// reading script arguments
22 9 akiss
for (int i=0;i<ARGV.n;++i)
23 9 akiss
{ cout << ARGV[i] << " ";}
24 9 akiss
cout<<endl;
25 9 akiss
26 9 akiss
//verbosity = getARGV("-vv", 0);
27 9 akiss
//int vdebug = getARGV("-d", 1);
28 9 akiss
29 9 akiss
// hydrophobicity as swelling ability
30 9 akiss
real sm = -getARGV("-sm", 0.568354);// mesophyl swelling property
31 9 akiss
real fsn = getARGV("-fsn", 0.899975);// nectary     sn/sm
32 9 akiss
real fss = getARGV("-fss", 1.19112);// side        ss/sm
33 9 akiss
real fsv = getARGV("-fsv", 0.491088);// vasculature sv/sm
34 9 akiss
string outputfile = getARGV("-outfile", "test.csv");
35 9 akiss
36 9 akiss
// ---------------- geometrical parameters
37 9 akiss
38 9 akiss
// (lengths are measured in micrometers)
39 9 akiss
real units=200;
40 9 akiss
41 9 akiss
// pulvinus dimensions
42 9 akiss
real lx=491.0/units;       //sd =34.4
43 9 akiss
real ly= 240.0/units;      //sd=36.0
44 9 akiss
45 9 akiss
// nectary height
46 9 akiss
real hnect = 38.8/units;   //sd=9.6
47 9 akiss
real R=363.0/units;    //sd=49.4
48 9 akiss
49 9 akiss
// side dimensions
50 9 akiss
real hside=91.4/units;     //12.6
51 9 akiss
real lside=47.6/units;     //6.6
52 9 akiss
53 9 akiss
// vasculature dimensions
54 9 akiss
real vthickness=34.3/units;//5.5
55 9 akiss
real cwidth=74.8/units;    //15.2
56 9 akiss
real cwidthdry=44.2/units; //8.4
57 9 akiss
58 9 akiss
// vasculature displacement (from vascular bundle distance)
59 9 akiss
real vd=(cwidth-cwidthdry)/2;
60 9 akiss
real vposition=lx/2-vthickness-hnect/ly*(lx/2-cwidth/2-vthickness); //cout<<"vposition="<<vposition<<endl;
61 9 akiss
62 9 akiss
// mesh parameters
63 9 akiss
int nvertex=20; cout << "nvertex="<<nvertex<<endl;
64 9 akiss
real pinned=lx/nvertex/2;
65 9 akiss
66 9 akiss
67 9 akiss
// ---------------- Material properties
68 9 akiss
69 9 akiss
real nu = 0.29;    // Poisson's ratio
70 9 akiss
71 9 akiss
// Young modulus
72 9 akiss
real Ev;   // vasculature Young modulus
73 9 akiss
real fEm; // mesophyl Em/Ev
74 9 akiss
real fEn;  // nectary  En/Ev
75 9 akiss
real fEs;  // side     Es/Ev
76 9 akiss
77 9 akiss
// measured values for the density
78 9 akiss
//Region,Mean_tissue_density,SD_tissue_density
79 9 akiss
real dm=0.668060839; //sd=0.04091249
80 9 akiss
real dn=1.01896008; //sd=0.015464575
81 9 akiss
real ds=0.918032482; //sd=0.075097509
82 9 akiss
real dv=0.882171532; //sd=0.066651037
83 9 akiss
84 9 akiss
real nEd=1.0;
85 9 akiss
86 9 akiss
// Young modulus
87 9 akiss
Ev=1;   // vasculature Young modulus
88 9 akiss
fEm=(dm/dv)^nEd; // mesophyl Em/Ev
89 9 akiss
fEn=(dn/dv)^nEd;  // nectary  En/Ev
90 9 akiss
fEs=(ds/dv)^nEd;  // side     Es/Ev
91 9 akiss
92 9 akiss
93 9 akiss
/*************************************************************
94 9 akiss
 *                  GEOMETRY and MESH
95 9 akiss
 * **********************************************************/
96 9 akiss
97 9 akiss
include "geometry1.cpp";
98 9 akiss
99 9 akiss
// -------------------- define the finite element space
100 9 akiss
101 9 akiss
fespace Vh(Th,[P2,P2]);  // vector on the mesh (displacement vector)
102 9 akiss
Vh [u1,u2], [v1,v2];
103 9 akiss
104 9 akiss
fespace Sh(Th, P2);   // scalar on the mesh, P2 elements
105 9 akiss
fespace Sh0(Th,P0);   // scalar on the mesh, P0 elements
106 9 akiss
fespace Sh1(Th,P1);   // scalar on the mesh, P1 elements
107 9 akiss
108 9 akiss
// macro to redefine variables on the displaced mesh
109 9 akiss
macro redefineVariable(vvv)
110 9 akiss
{        real[int] temp(vvv[].n);
111 9 akiss
        temp=vvv[]; vvv=0; vvv[]=temp;
112 9 akiss
        vvv=vvv;
113 9 akiss
}//
114 9 akiss
115 9 akiss
real sqrt2=sqrt(2.);
116 9 akiss
macro epsilon(u1,u2)  [dx(u1),dy(u2),(dy(u1)+dx(u2))/sqrt2] // EOM
117 9 akiss
//the sqrt2 is because we want: epsilon(u1,u2)'* epsilon(v1,v2) $==  \epsilon(\bm{u}): \epsilon(\bm{v})$
118 9 akiss
macro div(u1,u2) ( dx(u1)+dy(u2) ) // EOM
119 9 akiss
120 9 akiss
/*************************************************************
121 9 akiss
 *                  MECHANICS
122 9 akiss
 * **********************************************************/
123 9 akiss
124 9 akiss
// definition of integer functions for the structural domains
125 9 akiss
func vasculature=int(vasculatureBool(x,y));
126 9 akiss
func nectary=int(nectaryBool(x,y));
127 9 akiss
func side=int(sideBool(x,y));
128 9 akiss
func mesophyl=int(mesophylBool(x,y));
129 9 akiss
func geometry = 1*vasculature + 3*nectary + 2*side + 4*mesophyl;
130 9 akiss
131 9 akiss
// definition of FE variables for the structural domains
132 9 akiss
Sh0 vasculatureh=vasculature;
133 9 akiss
Sh0 nectaryh=nectary;
134 9 akiss
Sh0 sideh=side;
135 9 akiss
Sh0 mesophylh=mesophyl;
136 9 akiss
137 9 akiss
Sh0 geometryh=geometry;
138 9 akiss
//string fname=output+"/geometry-original.png";
139 9 akiss
//plot(geometryh,fill=1, ps=fname, bb=bb);
140 9 akiss
141 9 akiss
// spatial dependence of Young modulus
142 9 akiss
func E=Ev*(vasculature + fEn*nectary + fEs*side + fEm*mesophyl);
143 9 akiss
Sh0 Eh=E;
144 9 akiss
145 9 akiss
// spatial dependence of the swelling property
146 9 akiss
func s=sm*(fsv*vasculature + fsn*nectary + fss*side + mesophyl);
147 9 akiss
Sh0 sh=s;
148 9 akiss
149 9 akiss
func mu=E/(2*(1+nu));
150 9 akiss
func lambda=E*nu/((1+nu)*(1-2*nu));
151 14 akiss
//func K=lambda+2*mu/3;
152 14 akiss
func K=lambda+mu;
153 9 akiss
154 9 akiss
155 9 akiss
/*************************************************************
156 9 akiss
 *                  SOLVING THE FEM
157 9 akiss
 * **********************************************************/
158 9 akiss
159 9 akiss
solve Lame([u1,u2],[v1,v2])=
160 9 akiss
  int2d(Th)(
161 9 akiss
            lambda*div(u1,u2)*div(v1,v2)
162 9 akiss
            + 2.*mu*( epsilon(u1,u2)'*epsilon(v1,v2) )
163 9 akiss
              )
164 9 akiss
  - int2d(Th) ( K*sh*div(v1,v2))
165 9 akiss
  + on(32,u1=vd,u2=0)
166 9 akiss
  + on(33,u1=-vd,u2=0)
167 9 akiss
  ;
168 9 akiss
169 9 akiss
/*************************************************************
170 9 akiss
 *         Measuring angles
171 9 akiss
 * **********************************************************/
172 9 akiss
173 9 akiss
real Nx=lx/2+u1(lx/2.,0), Ny=u2(lx/2.,0);
174 9 akiss
175 9 akiss
// compute tangentangle
176 9 akiss
real height=ly/nvertex/100;
177 9 akiss
real Mx=lx/2+u1(lx/2.,-height), My=-height+u2(lx/2.,-height);
178 9 akiss
real tangentangle=angleToVertical(Mx, My, Nx, Ny);
179 9 akiss
180 9 akiss
// compute sideangle
181 9 akiss
height=hside;
182 9 akiss
Mx=lx/2+u1(lx/2.,-height); My=-height+u2(lx/2.,-height);
183 9 akiss
real sideangle=angleToVertical(Mx, My, Nx, Ny);
184 9 akiss
185 9 akiss
186 9 akiss
/*************************************************************
187 9 akiss
 *         Measuring original areas
188 9 akiss
 * **********************************************************/
189 9 akiss
190 9 akiss
// original volumes
191 9 akiss
real voltotal0=int2d(Th)(1);
192 9 akiss
real volvasculature0=int2d(Th)(vasculatureh);
193 9 akiss
real volnectary0=int2d(Th)(nectaryh);
194 9 akiss
real volmesophyl0=int2d(Th)(mesophylh);
195 9 akiss
real volside0=int2d(Th)(sideh);
196 9 akiss
197 9 akiss
198 9 akiss
/*************************************************************
199 9 akiss
 *         Measuring strain anisotropies
200 9 akiss
 * **********************************************************/
201 9 akiss
202 9 akiss
Sh0 e11=dx(u1)+1.;
203 9 akiss
Sh0 e12=1/2.*(dx(u2) + dy(u1));
204 9 akiss
Sh0 e22=dy(u2)+1.;
205 9 akiss
206 9 akiss
Sh0 strain=e11+e22 ;
207 9 akiss
Sh0 Det=e11*e22-e12*e12;
208 9 akiss
209 9 akiss
Sh0 l1=abs(strain+sqrt(strain*strain-4*Det))/2.;
210 9 akiss
Sh0 l2=abs(strain-sqrt(strain*strain-4*Det))/2.;
211 9 akiss
212 9 akiss
Sh0 lmax=(l1-l2+abs(l1-l2))/2.+l2;
213 9 akiss
Sh0 lmin=(l1-l2-abs(l1-l2))/2.+l2;
214 9 akiss
215 9 akiss
Sh0 strainanisotropy=lmin/lmax;
216 9 akiss
217 9 akiss
218 9 akiss
// compute mean strain anisotropy per region
219 9 akiss
real satotal=int2d(Th)(strainanisotropy)/voltotal0;
220 9 akiss
real savasculature=int2d(Th)(strainanisotropy*vasculatureh)/volvasculature0;
221 9 akiss
real sanectary=int2d(Th)(strainanisotropy*nectaryh)/volnectary0;
222 9 akiss
real saside=int2d(Th)(strainanisotropy*sideh)/volside0;
223 9 akiss
real samesophyl=int2d(Th)(strainanisotropy*mesophylh)/volmesophyl0;
224 9 akiss
225 9 akiss
226 9 akiss
/*************************************************************
227 9 akiss
 *         Measuring area changes
228 9 akiss
 * **********************************************************/
229 9 akiss
230 9 akiss
// deformed volumes
231 9 akiss
Th=movemesh(Th,[x+u1,y+u2]);
232 9 akiss
233 9 akiss
234 9 akiss
redefineVariable(vasculatureh);
235 9 akiss
redefineVariable(nectaryh);
236 9 akiss
redefineVariable(sideh);
237 9 akiss
redefineVariable(mesophylh);
238 9 akiss
239 9 akiss
240 9 akiss
real voltotal=int2d(Th)(1);
241 9 akiss
real volvasculature=int2d(Th)(vasculatureh);
242 9 akiss
real volnectary=int2d(Th)(nectaryh);
243 9 akiss
real volside=int2d(Th)(sideh);
244 9 akiss
real volmesophyl=int2d(Th)(mesophylh);
245 9 akiss
246 9 akiss
real am=volmesophyl0/volmesophyl;
247 9 akiss
real an=volnectary0/volnectary;
248 9 akiss
real as=volside0/volside;
249 9 akiss
real av=volvasculature0/volvasculature;
250 9 akiss
251 9 akiss
252 9 akiss
253 9 akiss
/*************************************************************
254 9 akiss
 *         Writing results
255 9 akiss
 * **********************************************************/
256 9 akiss
cout<<"sm;fsn;fss;fsv;sideangle;am;an;as;av;sam;san;sas;sav;"<<endl;
257 9 akiss
258 9 akiss
string toprint=string(sm)+";"+string(fsn)+";"+string(fss)+";"+string(fsv)+";"
259 9 akiss
+string(sideangle/38)+";"
260 9 akiss
+string(am)+";"+string(an)+";"+string(as)+";"+string(av)+";"
261 9 akiss
+string(samesophyl)+";"+string(sanectary)+ ";"+string(saside)+";"+string(savasculature);
262 9 akiss
263 9 akiss
cout<<toprint<<endl;
264 9 akiss
265 9 akiss
ofstream textfile(outputfile);
266 9 akiss
textfile<<toprint<<endl;
267 9 akiss