4 * This source code is part of
8 * GROningen MAchine for Chemical Simulations
12 * Copyright (c) 1991-1999
13 * BIOSON Research Institute, Dept. of Biophysical Chemistry
14 * University of Groningen, The Netherlands
17 * GROMACS: A message-passing parallel molecular dynamics implementation
18 * H.J.C. Berendsen, D. van der Spoel and R. van Drunen
19 * Comp. Phys. Comm. 91, 43-56 (1995)
21 * Also check out our WWW page:
22 * http://md.chem.rug.nl/~gmx
27 * GRowing Old MAkes el Chrono Sweat
29 static char *SRCID_cmat_c
= "$Id$";
36 real
**mk_matrix(int n1
,bool b1D
)
45 for(i
=0; (i
<n1
); i
++) {
54 void done_matrix(int n1
,real
***m
)
64 t_mat
*init_mat(int n1
,bool b1D
)
77 m
->mat
= mk_matrix(n1
,b1D
);
86 void enlarge_mat(t_mat
*m
,int deltan
)
90 srenew(m
->erow
,m
->nn
+deltan
);
91 srenew(m
->m_ind
,m
->nn
+deltan
);
92 srenew(m
->mat
,m
->nn
+deltan
);
94 /* Reallocate existing rows in the matrix, and set them to zero */
95 for(i
=0; (i
<m
->nn
); i
++) {
96 srenew(m
->mat
[i
],m
->nn
+deltan
);
97 for(j
=m
->nn
; (j
<m
->nn
+deltan
); j
++)
100 /* Allocate new rows of the matrix, set energies to zero */
101 for(i
=m
->nn
; (i
<m
->nn
+deltan
); i
++) {
103 snew(m
->mat
[i
],m
->nn
+deltan
);
108 void reset_index(t_mat
*m
)
112 for(i
=0; (i
<m
->n1
); i
++)
116 void set_mat_entry(t_mat
*m
,int i
,int j
,real val
)
118 m
->mat
[i
][j
] = m
->mat
[j
][i
] = val
;
119 m
->maxrms
= max(m
->maxrms
,val
);
121 m
->nn
= max(m
->nn
,max(j
+1,i
+1));
124 void done_mat(t_mat
**m
)
128 done_matrix((*m
)->n1
,&((*m
)->mat
));
135 real
row_energy(int nn
,int row
,real
*mat
,int m_ind
[])
140 for(i
=0; (i
<nn
); i
++) {
141 re
+= abs(i
-row
)*mat
[i
];
146 real
mat_energy(t_mat
*m
)
152 for(j
=0; (j
<m
->nn
); j
++) {
154 re
= row_energy(m
->nn
,jj
,m
->mat
[j
],m
->m_ind
);
158 m
->emat
= retot
/m
->nn
;
162 void swap_rows(t_mat
*m
,int isw
,int jsw
)
169 m
->mat
[isw
] = m
->mat
[jsw
];
172 for(i
=0; (i
<m
->nn
); i
++) {
173 ttt
= m
->mat
[isw
][i
];
174 m
->mat
[isw
][i
] = m
->mat
[jsw
][i
];
175 m
->mat
[jsw
][i
] = ttt
;
179 void swap_mat(t_mat
*m
)
184 tmp
= init_mat(m
->nn
,FALSE
);
185 for(i
=0; (i
<m
->nn
); i
++)
186 for(j
=0; (j
<m
->nn
); j
++)
187 tmp
->mat
[m
->m_ind
[i
]][m
->m_ind
[j
]] = m
->mat
[i
][j
];
188 /*tmp->mat[i][j] = m->mat[m->m_ind[i]][m->m_ind[j]]; */
189 for(i
=0; (i
<m
->nn
); i
++)
190 for(j
=0; (j
<m
->nn
); j
++)
191 m
->mat
[i
][j
] = tmp
->mat
[i
][j
];
195 void low_rmsd_dist(char *fn
,real maxrms
,int nn
,real
**mat
)
203 for(i
=0; (i
<nn
); i
++)
204 for(j
=i
+1; (j
<nn
); j
++)
205 histo
[(int)(fac
*mat
[i
][j
])]++;
207 fp
= xvgropen(fn
,"RMS Distribution","RMS (nm)","a.u.");
208 for(i
=0; (i
<101); i
++)
209 fprintf(fp
,"%10g %10d\n",i
/fac
,histo
[i
]);
215 void rmsd_distribution(char *fn
,t_mat
*rms
)
217 low_rmsd_dist(fn
,rms
->maxrms
,rms
->nn
,rms
->mat
);
220 t_clustid
*new_clustid(int n1
)
226 for(i
=0; (i
<n1
); i
++) {