Statistiques
| Révision :

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=&parameters;
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=&parameters;
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
}