root / bin / minimize_steepest_descent.cpp @ 1
Historique | Voir | Annoter | Télécharger (2,16 ko)
1 | 1 | akiss | #include "compute_energy_and_forces.h" |
---|---|---|---|
2 | 1 | akiss | #include "minimize_steepest_descent.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. It is an alternative to the BFGS algorithm, just for debugging */
|
9 | 1 | akiss | |
10 | 1 | akiss | void minimize_steepest_descent(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, double *target_areas, |
11 | 1 | akiss | int *wall_vertices, int wall_number, double *lengths, double *target_lengths){ |
12 | 1 | akiss | |
13 | 1 | akiss | double step_size=1.e-2; |
14 | 1 | akiss | double precision=1.e-2; |
15 | 1 | akiss | |
16 | 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; double *target_areas; |
17 | 1 | akiss | int *wall_vertices; int wall_number; double *lengths; double *target_lengths;}; |
18 | 1 | akiss | |
19 | 1 | akiss | struct parameters_list parameters;
|
20 | 1 | akiss | parameters.vertices_number=vertices_number; |
21 | 1 | akiss | parameters.cell_number=cell_number; |
22 | 1 | akiss | parameters.cells_vertices=cells_vertices; |
23 | 1 | akiss | parameters.vertices_number_in_each_cell=vertices_number_in_each_cell; |
24 | 1 | akiss | parameters.barycenters=barycenters; |
25 | 1 | akiss | parameters.shapes=shapes; |
26 | 1 | akiss | parameters.targets=targets; |
27 | 1 | akiss | parameters.areas=areas; |
28 | 1 | akiss | parameters.cell_areas=cell_areas; |
29 | 1 | akiss | parameters.target_areas=target_areas; |
30 | 1 | akiss | parameters.wall_vertices=wall_vertices; |
31 | 1 | akiss | parameters.wall_number=wall_number; |
32 | 1 | akiss | parameters.lengths=lengths; |
33 | 1 | akiss | parameters.target_lengths=target_lengths; |
34 | 1 | akiss | void* pparameters=¶meters;
|
35 | 1 | akiss | |
36 | 1 | akiss | double forces[2*vertices_number]; |
37 | 1 | akiss | double energy=compute_energy_and_forces(0, vertices, forces, pparameters); |
38 | 1 | akiss | double max_step=0.; for (int i=0;i<2*vertices_number;i++){ if (fabs(forces[i])>max_step){ max_step=fabs(forces[i]);}} |
39 | 1 | akiss | int step_number=0; |
40 | 1 | akiss | |
41 | 1 | akiss | while (max_step>precision){
|
42 | 1 | akiss | step_number++; |
43 | 1 | akiss | for (int i=0;i<2*vertices_number;i++){ vertices[i]-=step_size*forces[i];} |
44 | 1 | akiss | energy=compute_energy_and_forces(0, vertices, forces, pparameters);
|
45 | 1 | akiss | max_step=0;
|
46 | 1 | akiss | for (int i=0;i<2*vertices_number;i++){ if (fabs(forces[i])>max_step){ max_step=fabs(forces[i]);}} |
47 | 1 | akiss | } |
48 | 1 | akiss | |
49 | 1 | akiss | printf("opt %f %d\n",energy,step_number);
|
50 | 1 | akiss | |
51 | 1 | akiss | } |