3 * This source code is part of
7 * GROningen MAchine for Chemical Simulations
10 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
11 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
12 * Copyright (c) 2001-2004, The GROMACS development team,
13 * check out http://www.gromacs.org for more information.
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version 2
18 * of the License, or (at your option) any later version.
20 * If you want to redistribute modifications, please consider that
21 * scientific software is very special. Version control is crucial -
22 * bugs must be traceable. We will be happy to consider code for
23 * inclusion in the official distribution, but derived work must not
24 * be called official GROMACS. Details are found in the README & COPYING
25 * files - if they are missing, get the official version at www.gromacs.org.
27 * To help us fund GROMACS development, we humbly ask that you cite
28 * the papers on the package - you can find them in the top README file.
30 * For more info, check our website at http://www.gromacs.org
33 * Green Red Orange Magenta Azure Cyan Skyblue
47 void read_eigenvectors(const char *file
,int *natoms
,gmx_bool
*bFit
,
48 rvec
**xref
,gmx_bool
*bDMR
,
49 rvec
**xav
,gmx_bool
*bDMA
,
50 int *nvec
, int **eignr
,
51 rvec
***eigvec
,real
**eigval
)
62 /* read (reference (t=-1) and) average (t=0) structure */
63 status
=open_trn(file
,"r");
64 fread_trnheader(status
,&head
,&bOK
);
67 fread_htrn(status
,&head
,box
,*xav
,NULL
,NULL
);
69 if ((head
.t
>=-1.1) && (head
.t
<=-0.9))
72 for(i
=0; i
<*natoms
; i
++)
73 copy_rvec((*xav
)[i
],(*xref
)[i
]);
74 *bDMR
= (head
.lambda
> 0.5);
75 *bFit
= (head
.lambda
> -0.5);
78 fprintf(stderr
,"Read %smass weighted reference structure with %d atoms from %s\n", *bDMR
? "" : "non ",*natoms
,file
);
82 fprintf(stderr
,"Eigenvectors in %s were determined without fitting\n",file
);
86 fread_trnheader(status
,&head
,&bOK
);
87 fread_htrn(status
,&head
,box
,*xav
,NULL
,NULL
);
94 *bDMA
= (head
.lambda
> 0.5);
95 if ((head
.t
<=-0.01) || (head
.t
>=0.01))
97 fprintf(stderr
,"WARNING: %s does not start with t=0, which should be the "
98 "average structure. This might not be a eigenvector file. "
99 "Some things might go wrong.\n",
105 "Read %smass weighted average/minimum structure with %d atoms from %s\n",
106 *bDMA
? "" : "non ",*natoms
,file
);
111 snew(*eignr
,snew_size
);
112 snew(*eigval
,snew_size
);
113 snew(*eigvec
,snew_size
);
116 while (fread_trnheader(status
,&head
,&bOK
))
118 fread_htrn(status
,&head
,box
,x
,NULL
,NULL
);
119 if (*nvec
>= snew_size
)
122 srenew(*eignr
,snew_size
);
123 srenew(*eigval
,snew_size
);
124 srenew(*eigvec
,snew_size
);
127 (*eigval
)[*nvec
]=head
.t
;
129 snew((*eigvec
)[*nvec
],*natoms
);
130 for(i
=0; i
<*natoms
; i
++)
132 copy_rvec(x
[i
],(*eigvec
)[*nvec
][i
]);
137 fprintf(stderr
,"Read %d eigenvectors (for %d atoms)\n\n",*nvec
,*natoms
);
141 void write_eigenvectors(const char *trnname
,int natoms
,real mat
[],
142 gmx_bool bReverse
,int begin
,int end
,
143 int WriteXref
,rvec
*xref
,gmx_bool bDMR
,
144 rvec xav
[], gmx_bool bDMA
,real eigval
[])
156 "\nWriting %saverage structure & eigenvectors %d--%d to %s\n",
157 (WriteXref
==eWXR_YES
) ? "reference, " : "",
160 trnout
= open_tpx(trnname
,"w");
161 if (WriteXref
== eWXR_YES
)
163 /* misuse lambda: 0/1 mass weighted fit no/yes */
164 fwrite_trn(trnout
,-1,-1,bDMR
? 1.0 : 0.0,zerobox
,natoms
,xref
,NULL
,NULL
);
166 else if (WriteXref
== eWXR_NOFIT
)
168 /* misuse lambda: -1 no fit */
169 fwrite_trn(trnout
,-1,-1,-1.0,zerobox
,natoms
,x
,NULL
,NULL
);
172 /* misuse lambda: 0/1 mass weighted analysis no/yes */
173 fwrite_trn(trnout
,0,0,bDMA
? 1.0 : 0.0,zerobox
,natoms
,xav
,NULL
,NULL
);
175 for(i
=0; i
<=(end
-begin
); i
++)
183 for (j
=0; j
<natoms
; j
++)
185 x
[j
][d
]=mat
[vec
*ndim
+DIM
*j
+d
];
187 /* Store the eigenvalue in the time field */
188 fwrite_trn(trnout
,begin
+i
,eigval
[vec
],0,zerobox
,natoms
,x
,NULL
,NULL
);