root / bin / compute_energy_and_forces.cpp @ 1
Historique | Voir | Annoter | Télécharger (9,47 ko)
1 | 1 | akiss | #include "compute_energy_and_forces.h" |
---|---|---|---|
2 | 1 | akiss | #include "constants.h" |
3 | 1 | akiss | #include "compute_areas.h" |
4 | 1 | akiss | #include "compute_cell_areas.h" |
5 | 1 | akiss | #include "compute_lengths.h" |
6 | 1 | akiss | #include <math.h> |
7 | 1 | akiss | #include <stdio.h> |
8 | 1 | akiss | #include <nlopt.h> |
9 | 1 | akiss | #include <omp.h> |
10 | 1 | akiss | |
11 | 1 | akiss | /* this function computes the mechanical energy and its derivatives */
|
12 | 1 | akiss | |
13 | 1 | akiss | double compute_energy_and_forces(unsigned n, const double *vertices, double *forces, void *parameters){ |
14 | 1 | akiss | |
15 | 1 | akiss | struct parameters_list {int vertex_number; int edge_number; int *edges_vertices; |
16 | 1 | akiss | double *lengths; double *rest_lengths; double *edges_width; int *periodizer; int anisotropy; double ref_width; double ref_height;}; |
17 | 1 | akiss | double energy=0; |
18 | 1 | akiss | |
19 | 1 | akiss | compute_lengths((double*)vertices, ((parameters_list*)parameters)->edges_vertices, ((parameters_list*)parameters)->edge_number,
|
20 | 1 | akiss | ((parameters_list*)parameters)->lengths, ((parameters_list*)parameters)->periodizer, (double)vertices[2*(((parameters_list*)parameters)->vertex_number)], (double)vertices[2*(((parameters_list*)parameters)->vertex_number)+1]); |
21 | 1 | akiss | |
22 | 1 | akiss | if (forces){ for (int i=0;i<2*((parameters_list*)parameters)->vertex_number+2;i++){forces[i]=0.;}} |
23 | 1 | akiss | |
24 | 1 | akiss | |
25 | 1 | akiss | if (forces){
|
26 | 1 | akiss | forces[2*(((parameters_list*)parameters)->vertex_number)]-=vertices[2*(((parameters_list*)parameters)->vertex_number)+1]; |
27 | 1 | akiss | forces[2*(((parameters_list*)parameters)->vertex_number)+1]-=vertices[2*(((parameters_list*)parameters)->vertex_number)]; |
28 | 1 | akiss | } |
29 | 1 | akiss | /* pressure energy */
|
30 | 1 | akiss | energy-=vertices[2*(((parameters_list*)parameters)->vertex_number)]*vertices[2*(((parameters_list*)parameters)->vertex_number)+1]; |
31 | 1 | akiss | |
32 | 1 | akiss | |
33 | 1 | akiss | |
34 | 1 | akiss | for (int i=0;i<((parameters_list*)parameters)->edge_number;i++){ |
35 | 1 | akiss | /* derivatives of the lengths of the walls */
|
36 | 1 | akiss | if (forces){
|
37 | 1 | akiss | forces[2*(((parameters_list*)parameters)->edges_vertices)[2*i]]+=youngs_modulus*((((parameters_list*)parameters)->edges_width)[i])*((((parameters_list*)parameters)->rest_lengths)[i])* |
38 | 1 | akiss | ((((parameters_list*)parameters)->lengths)[i]-(((parameters_list*)parameters)->rest_lengths)[i])* |
39 | 1 | akiss | (vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i]]+vertices[2*((parameters_list*)parameters)->vertex_number]*(double)(((parameters_list*)parameters)->periodizer)[4*i] |
40 | 1 | akiss | -vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i+1]]-vertices[2*((parameters_list*)parameters)->vertex_number]*(double)(((parameters_list*)parameters)->periodizer)[4*i+2])/ |
41 | 1 | akiss | ((((parameters_list*)parameters)->lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]); |
42 | 1 | akiss | forces[2*(((parameters_list*)parameters)->edges_vertices)[2*i+1]]-=youngs_modulus*((((parameters_list*)parameters)->edges_width)[i])*((((parameters_list*)parameters)->rest_lengths)[i])* |
43 | 1 | akiss | ((((parameters_list*)parameters)->lengths)[i]-(((parameters_list*)parameters)->rest_lengths)[i])* |
44 | 1 | akiss | (vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i]]+vertices[2*((parameters_list*)parameters)->vertex_number]*(double)(((parameters_list*)parameters)->periodizer)[4*i] |
45 | 1 | akiss | -vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i+1]]-vertices[2*((parameters_list*)parameters)->vertex_number]*(double)(((parameters_list*)parameters)->periodizer)[4*i+2])/ |
46 | 1 | akiss | ((((parameters_list*)parameters)->lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]); |
47 | 1 | akiss | forces[2*(((parameters_list*)parameters)->edges_vertices)[2*i]+1]+=youngs_modulus*((((parameters_list*)parameters)->edges_width)[i])*((((parameters_list*)parameters)->rest_lengths)[i])* |
48 | 1 | akiss | ((((parameters_list*)parameters)->lengths)[i]-(((parameters_list*)parameters)->rest_lengths)[i])* |
49 | 1 | akiss | (vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i]+1]+vertices[2*((parameters_list*)parameters)->vertex_number+1]*(double)(((parameters_list*)parameters)->periodizer)[4*i+1] |
50 | 1 | akiss | -vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i+1]+1]-vertices[2*((parameters_list*)parameters)->vertex_number+1]*(double)(((parameters_list*)parameters)->periodizer)[4*i+3])/ |
51 | 1 | akiss | ((((parameters_list*)parameters)->lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]); |
52 | 1 | akiss | forces[2*(((parameters_list*)parameters)->edges_vertices)[2*i+1]+1]-=youngs_modulus*((((parameters_list*)parameters)->edges_width)[i])*((((parameters_list*)parameters)->rest_lengths)[i])* |
53 | 1 | akiss | ((((parameters_list*)parameters)->lengths)[i]-(((parameters_list*)parameters)->rest_lengths)[i])* |
54 | 1 | akiss | (vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i]+1]+vertices[2*((parameters_list*)parameters)->vertex_number+1]*(double)(((parameters_list*)parameters)->periodizer)[4*i+1] |
55 | 1 | akiss | -vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i+1]+1]-vertices[2*((parameters_list*)parameters)->vertex_number+1]*(double)(((parameters_list*)parameters)->periodizer)[4*i+3])/ |
56 | 1 | akiss | ((((parameters_list*)parameters)->lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]); |
57 | 1 | akiss | |
58 | 1 | akiss | forces[2*((parameters_list*)parameters)->vertex_number]+=youngs_modulus*((((parameters_list*)parameters)->edges_width)[i])*((((parameters_list*)parameters)->rest_lengths)[i])*
|
59 | 1 | akiss | ((double)(((parameters_list*)parameters)->periodizer)[4*i]-(double)(((parameters_list*)parameters)->periodizer)[4*i+2])* |
60 | 1 | akiss | ((((parameters_list*)parameters)->lengths)[i]-(((parameters_list*)parameters)->rest_lengths)[i])* |
61 | 1 | akiss | (vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i]]+vertices[2*((parameters_list*)parameters)->vertex_number]*(double)(((parameters_list*)parameters)->periodizer)[4*i] |
62 | 1 | akiss | -vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i+1]]-vertices[2*((parameters_list*)parameters)->vertex_number]*(double)(((parameters_list*)parameters)->periodizer)[4*i+2])/ |
63 | 1 | akiss | ((((parameters_list*)parameters)->lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]); |
64 | 1 | akiss | |
65 | 1 | akiss | forces[2*((parameters_list*)parameters)->vertex_number+1]+=youngs_modulus*((((parameters_list*)parameters)->edges_width)[i])*((((parameters_list*)parameters)->rest_lengths)[i])* |
66 | 1 | akiss | ((double)(((parameters_list*)parameters)->periodizer)[4*i+1]-(double)(((parameters_list*)parameters)->periodizer)[4*i+3])* |
67 | 1 | akiss | ((((parameters_list*)parameters)->lengths)[i]-(((parameters_list*)parameters)->rest_lengths)[i])* |
68 | 1 | akiss | (vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i]+1]+vertices[2*((parameters_list*)parameters)->vertex_number+1]*(double)(((parameters_list*)parameters)->periodizer)[4*i+1] |
69 | 1 | akiss | -vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i+1]+1]-vertices[2*((parameters_list*)parameters)->vertex_number+1]*(double)(((parameters_list*)parameters)->periodizer)[4*i+3])/ |
70 | 1 | akiss | ((((parameters_list*)parameters)->lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]); |
71 | 1 | akiss | |
72 | 1 | akiss | } |
73 | 1 | akiss | /* wall elastic energy */
|
74 | 1 | akiss | energy+=0.5*youngs_modulus*((((parameters_list*)parameters)->edges_width)[i])*((((parameters_list*)parameters)->rest_lengths)[i])* |
75 | 1 | akiss | pow((((parameters_list*)parameters)->lengths)[i]/(((parameters_list*)parameters)->rest_lengths)[i]-1.,2.); |
76 | 1 | akiss | } |
77 | 1 | akiss | |
78 | 1 | akiss | /* external, anisotropic stretching */
|
79 | 1 | akiss | if ((((parameters_list*)parameters)->anisotropy)==1){ |
80 | 1 | akiss | |
81 | 1 | akiss | if (forces){
|
82 | 1 | akiss | forces[2*(((parameters_list*)parameters)->vertex_number)]-=stress_x*(((parameters_list*)parameters)->ref_height);
|
83 | 1 | akiss | forces[2*(((parameters_list*)parameters)->vertex_number)+1]-=stress_y*(((parameters_list*)parameters)->ref_width); |
84 | 1 | akiss | } |
85 | 1 | akiss | |
86 | 1 | akiss | energy-=stress_x*(((parameters_list*)parameters)->ref_height)*(vertices[2*(((parameters_list*)parameters)->vertex_number)]-(((parameters_list*)parameters)->ref_width))+
|
87 | 1 | akiss | stress_y*(((parameters_list*)parameters)->ref_width)*(vertices[2*(((parameters_list*)parameters)->vertex_number)+1]-(((parameters_list*)parameters)->ref_height)); |
88 | 1 | akiss | |
89 | 1 | akiss | } |
90 | 1 | akiss | |
91 | 1 | akiss | return(energy);
|
92 | 1 | akiss | |
93 | 1 | akiss | } |