-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrun.c
141 lines (116 loc) · 3.34 KB
/
run.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#define DEBUG 0
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <string.h>
#include "utils.h"
#include "redutils.h"
#include "redes.h"
#include "circadiano.h"
#include "orden.h"
int main(int argc, char *argv[]) {
int num; // numero de neuronas
int i,j,k,l;
neurona *n; // puntero para array de neuronas
float *m; // puntero para matriz de conectividad
float coef_k=0.8;
float con;
float t, h=PASO_T; // tiempo
float q;
int sw=0;
int sprom;
// para el calculo de fases y el parametro de orden
//int *nregs, *nregact; //cantidad de registros de picos para cada neurona
//float *x0,*x1;
//float **reg;
//float r;
int indexparametro=-1;
int ncorridas;
int nparametros;
int indexred;
char *etiqred=NULL;
// k0, kf y dk
float k_valores[3];
float *parametros=NULL; //muy importante!
float parametro_valores[3];
void (*funcionred)(int num, float *m, float param[]);
//float *auxper,*auxperfase;
char filename[200]; //supongo que es suficiente...
char charaux[100];
FILE *fout;
leer_argumentos_iniciales(argc,argv,&num,k_valores,&ncorridas,&nparametros);
#if DEBUG
printf("argumentos iniciales ok\n");
#endif
leer_argumentos_redes(argc,argv,nparametros,¶metros,&indexred,etiqred,&indexparametro,parametro_valores);
#if DEBUG
printf("argumentos redes ok\n");
#endif
redes(FUNCION,&indexred,NULL,&nparametros,&funcionred);
#if DEBUG
printf("ok. empezamos...\n");
#endif
// seteamos nombre de archivo
sprintf(filename,"data_n");
for(i=1;i<argc;i++) {
sprintf(charaux,"%s",argv[i]);
if(i<argc-1) strcat(charaux,"_");
strcat(filename,charaux);
}
// abrimos el archivo donde guardamos los datos
fout=fopen(filename,"w");
// barremos sobre valores de k (intensidad de acoplamiento)
for(coef_k=k_valores[0];coef_k<=k_valores[1];coef_k+=k_valores[2]) {
fprintf(fout,"#k=%g\n",coef_k);
for(parametros[indexparametro]=parametro_valores[0];
parametros[indexparametro]<=parametro_valores[1];
parametros[indexparametro]+=parametro_valores[2]) {
fflush(fout); // flush buffer, para que imprima cada paso ni bien termina
for(j=0;j<ncorridas;j++) {
#if DEBUG
printf("corrida %d, coefk=%f\n",j,coef_k);
printf("valores k = %f, %f, %f\n", k_valores[0],k_valores[1],k_valores[2]);
printf("valores p = %f, %f, %f\n", parametro_valores[0],parametro_valores[1],parametro_valores[2]);
#endif
iniciar_m_n(num,&n,&m);
iniciar_neuronas(n,num);
(*funcionred)(num,m,parametros);
//iniciar_fases(num,&x0,&x1,®,&nregs,&nregact);
//auxper=malloc(sizeof(float)*num);
//auxperfase=malloc(sizeof(float)*num);
t=0;
do {
sw=(t>=TMIN);
if(sw) printf("%e ",t);
for(i=0;i<num;i++) {
// calcular q_i
q=0;
for(k=0;k<num;k++) {
q+=M(i,k)*n[k].V;
}
q*=coef_k;
// paso rk4...
dzdt(t,q,n[i].e,n[i].z,n[i].dz);
rk4(n[i].z,n[i].dz,VARS,t,h,q,n[i].e,n[i].zout,dzdt);
if(sw) printf("%e ",n[i].z[0]);
}
// actualiza los pasos
for(i=0;i<num;i++) for(k=0;k<VARS;k++) n[i].z[k]=n[i].zout[k];
if(sw) printf("\n");
t+=h;
} while(t<=TMAX);
//liberar memoria!
free(n);
free(m);
//free(auxper);
//free(auxperfase);
//liberar_fases(num,x0,x1,reg,nregs,nregact);
}
fprintf(fout,"\n");
}
fprintf(fout,"\n");
}
fclose(fout);
return 0;
}