root / bin / minimize_BFGS.cpp @ 1
Historique | Voir | Annoter | Télécharger (3,71 ko)
1 | 1 | akiss | #include "compute_energy_and_forces.h" |
---|---|---|---|
2 | 1 | akiss | #include "minimize_BFGS.h" |
3 | 1 | akiss | #include <nlopt.h> |
4 | 1 | akiss | #include <stdio.h> |
5 | 1 | akiss | #include <stdlib.h> |
6 | 1 | akiss | #include <cmath> |
7 | 1 | akiss | |
8 | 1 | akiss | /* this function minimizes the mechanical energy */
|
9 | 1 | akiss | |
10 | 1 | akiss | void minimize_BFGS(int vertices_number, int cell_number, double *vertices, int *cells_vertices, int *vertices_number_in_each_cell, double *barycenters, double *shapes, double *targets, double *areas, double *cell_areas, |
11 | 1 | akiss | int *wall_vertices, int wall_number, double *lengths, double *target_lengths, int *boundary, double *relative_pressure){ |
12 | 1 | akiss | |
13 | 1 | akiss | nlopt_opt opt; |
14 | 1 | akiss | opt=nlopt_create(NLOPT_LD_LBFGS,2*vertices_number);
|
15 | 1 | akiss | |
16 | 1 | akiss | nlopt_set_stopval(opt, -HUGE_VAL); |
17 | 1 | akiss | nlopt_set_maxeval(opt, -1.);
|
18 | 1 | akiss | nlopt_set_maxtime(opt, -1.);
|
19 | 1 | akiss | nlopt_set_xtol_rel(opt, -1.);
|
20 | 1 | akiss | nlopt_set_xtol_abs1(opt, 1.e-6); |
21 | 1 | akiss | nlopt_set_ftol_rel(opt, -1.);
|
22 | 1 | akiss | nlopt_set_ftol_abs(opt, -1.);
|
23 | 1 | akiss | |
24 | 1 | akiss | struct parameters_list {int vertices_number; int cell_number; int *cells_vertices; int *vertices_number_in_each_cell; double *barycenters; double *shapes; double *targets; double *areas; double *cell_areas; |
25 | 1 | akiss | int *wall_vertices; int wall_number; double *lengths; double *target_lengths; int *boundary; double *tissue_target; int anisotropy; double *relative_pressure;}; |
26 | 1 | akiss | |
27 | 1 | akiss | double min_energy; double tissue_target[2]={1.,1.}; |
28 | 1 | akiss | struct parameters_list parameters;
|
29 | 1 | akiss | parameters.vertices_number=vertices_number; |
30 | 1 | akiss | parameters.cell_number=cell_number; |
31 | 1 | akiss | parameters.cells_vertices=cells_vertices; |
32 | 1 | akiss | parameters.vertices_number_in_each_cell=vertices_number_in_each_cell; |
33 | 1 | akiss | parameters.barycenters=barycenters; |
34 | 1 | akiss | parameters.shapes=shapes; |
35 | 1 | akiss | parameters.targets=targets; |
36 | 1 | akiss | parameters.areas=areas; |
37 | 1 | akiss | parameters.cell_areas=cell_areas; |
38 | 1 | akiss | parameters.wall_vertices=wall_vertices; |
39 | 1 | akiss | parameters.wall_number=wall_number; |
40 | 1 | akiss | parameters.lengths=lengths; |
41 | 1 | akiss | parameters.target_lengths=target_lengths; |
42 | 1 | akiss | parameters.boundary=boundary; |
43 | 1 | akiss | parameters.tissue_target=tissue_target; |
44 | 1 | akiss | parameters.anisotropy=0;
|
45 | 1 | akiss | parameters.relative_pressure=relative_pressure; |
46 | 1 | akiss | void* pparameters=¶meters;
|
47 | 1 | akiss | |
48 | 1 | akiss | //double forces[2*vertices_number];
|
49 | 1 | akiss | //double test=compute_energy_and_forces(0, vertices, forces, pparameters);
|
50 | 1 | akiss | ////for (int i=0; i<vertices_number;i++){ printf("%f %f %d %d\n",forces[2*i],forces[2*i+1],i,vertices_number);} printf("test\n");
|
51 | 1 | akiss | //double test2;
|
52 | 1 | akiss | //for (int i=0;i<2*vertices_number;i++){vertices[i]+=1.e-8;
|
53 | 1 | akiss | //test2=compute_energy_and_forces(0, vertices, forces, pparameters);
|
54 | 1 | akiss | //test2-=test;
|
55 | 1 | akiss | //test2*=1.e8;
|
56 | 1 | akiss | //vertices[i]-=1.e-8;
|
57 | 1 | akiss | //printf("%f %f %f\n",test2,forces[i],(test2-forces[i])/forces[i]);
|
58 | 1 | akiss | //}printf("\n");
|
59 | 1 | akiss | |
60 | 1 | akiss | int reso=nlopt_set_min_objective(opt, compute_energy_and_forces, pparameters);
|
61 | 1 | akiss | nlopt_optimize(opt, vertices, &min_energy); |
62 | 1 | akiss | |
63 | 1 | akiss | tissue_target[0]=0.; tissue_target[1]=0.; |
64 | 1 | akiss | int boundary_vertices_number=0.; double tissue_barycenter[2]={0.,0.}; |
65 | 1 | akiss | for (int i=0;i<vertices_number_in_each_cell[cell_number];i++){ |
66 | 1 | akiss | tissue_barycenter[0]+=((double)boundary[i])*vertices[2*cells_vertices[i]]; |
67 | 1 | akiss | tissue_barycenter[1]+=((double)boundary[i])*vertices[2*cells_vertices[i]+1]; |
68 | 1 | akiss | boundary_vertices_number+=boundary[i]; |
69 | 1 | akiss | } |
70 | 1 | akiss | tissue_barycenter[0]/=boundary_vertices_number;
|
71 | 1 | akiss | tissue_barycenter[1]/=boundary_vertices_number;
|
72 | 1 | akiss | |
73 | 1 | akiss | for (int i=0;i<vertices_number_in_each_cell[cell_number];i++){ |
74 | 1 | akiss | tissue_target[0]+=((double)boundary[i])*(vertices[2*cells_vertices[i]]-tissue_barycenter[0])*(vertices[2*cells_vertices[i]]-tissue_barycenter[0]); |
75 | 1 | akiss | tissue_target[1]+=((double)boundary[i])*(vertices[2*cells_vertices[i]+1]-tissue_barycenter[1])*(vertices[2*cells_vertices[i]+1]-tissue_barycenter[1]); |
76 | 1 | akiss | } |
77 | 1 | akiss | tissue_target[0]/=boundary_vertices_number;
|
78 | 1 | akiss | tissue_target[1]/=boundary_vertices_number;
|
79 | 1 | akiss | |
80 | 1 | akiss | parameters.tissue_target=tissue_target; |
81 | 1 | akiss | parameters.anisotropy=1;
|
82 | 1 | akiss | pparameters=¶meters; |
83 | 1 | akiss | |
84 | 1 | akiss | reso=nlopt_set_min_objective(opt, compute_energy_and_forces, pparameters); |
85 | 1 | akiss | nlopt_optimize(opt, vertices, &min_energy); |
86 | 1 | akiss | nlopt_destroy(opt); |
87 | 1 | akiss | |
88 | 1 | akiss | } |