Statistiques
| Révision :

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