00001
00007
00008
00009
00010
00011 #include "InfoStream.h"
00012 #include "common.h"
00013 #include "NamdTypes.h"
00014 #include "NamdOneTools.h"
00015 #include "Vector.h"
00016 #include "PDB.h"
00017 #include "Molecule.h"
00018 #define MIN_DEBUG_LEVEL 4
00019
00020 #include "Debug.h"
00021
00022
00023 #include "Debug.h"
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 void read_binary_coors(char *fname, PDB *pdbobj) {
00035 Vector *newcoords;
00036
00037
00038 newcoords = new Vector[pdbobj->num_atoms()];
00039
00040
00041 read_binary_file(fname,newcoords,pdbobj->num_atoms());
00042
00043
00044 pdbobj->set_all_positions(newcoords);
00045
00046
00047 delete [] newcoords;
00048
00049 }
00050
00051
00052 void read_binary_file(const char *fname, Vector *data, int n)
00053 {
00054 int32 filen;
00055 FILE *fp;
00056 int needToFlip = 0;
00057
00058
00059 if ( (fp = Fopen(fname, "rb")) == NULL)
00060 {
00061 char errmsg[256];
00062 sprintf(errmsg, "Unable to open binary file %s", fname);
00063 NAMD_die(errmsg);
00064 }
00065
00066
00067 if (fread(&filen, sizeof(int32), 1, fp) != (size_t)1)
00068 {
00069 char errmsg[256];
00070 sprintf(errmsg, "Error reading binary file %s", fname);
00071 NAMD_die(errmsg);
00072 }
00073
00074
00075
00076 char lenbuf[4];
00077 memcpy(lenbuf, (const char *)&filen, 4);
00078 char tmpc;
00079 tmpc = lenbuf[0]; lenbuf[0] = lenbuf[3]; lenbuf[3] = tmpc;
00080 tmpc = lenbuf[1]; lenbuf[1] = lenbuf[2]; lenbuf[2] = tmpc;
00081 if ( ! memcmp((const char *)&filen, lenbuf, 4) ) {
00082 iout << iWARN << "Number of atoms in binary file " << fname <<
00083 " is palindromic, assuming same endian.\n" << endi;
00084 }
00085
00086
00087 if (filen != n)
00088 {
00089 needToFlip = 1;
00090 memcpy((char *)&filen, lenbuf, 4);
00091 }
00092 if (filen != n)
00093 {
00094 char errmsg[256];
00095 sprintf(errmsg, "Incorrect atom count in binary file %s", fname);
00096 NAMD_die(errmsg);
00097 }
00098
00099 if (fread(data, sizeof(Vector), n, fp) != (size_t)n)
00100 {
00101 char errmsg[256];
00102 sprintf(errmsg, "Error reading binary file %s", fname);
00103 NAMD_die(errmsg);
00104 }
00105
00106 Fclose(fp);
00107
00108 if (needToFlip) {
00109 iout << iWARN << "Converting binary file " << fname << "\n" << endi;
00110 int i;
00111 char *cdata = (char *) data;
00112 for ( i=0; i<3*n; ++i, cdata+=8 ) {
00113 char tmp0, tmp1, tmp2, tmp3;
00114 tmp0 = cdata[0]; tmp1 = cdata[1];
00115 tmp2 = cdata[2]; tmp3 = cdata[3];
00116 cdata[0] = cdata[7]; cdata[1] = cdata[6];
00117 cdata[2] = cdata[5]; cdata[3] = cdata[4];
00118 cdata[7] = tmp0; cdata[6] = tmp1;
00119 cdata[5] = tmp2; cdata[4] = tmp3;
00120 }
00121 }
00122
00123 }
00124
00125
00126
00127
00128
00129
00130 void vec_rotation_matrix( BigReal angle, Vector v, BigReal m[] ) {
00131
00132 BigReal mag, s, c;
00133 BigReal xx, yy, zz, xy, yz, zx, xs, ys, zs, one_c;
00134
00135 s = sin(angle * PI/180.0);
00136 c = cos(angle * PI/180.0);
00137
00138 mag = v.length();
00139
00140 if (mag == 0.0) {
00141
00142 for ( int i = 0; i < 9; ++i ) m[i] = 0.0;
00143 m[0] = m[4] = m[8] = 1.0;
00144 return;
00145 }
00146
00147
00148 v /= mag;
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205 xx = v.x * v.x;
00206 yy = v.y * v.y;
00207 zz = v.z * v.z;
00208 xy = v.x * v.y;
00209 yz = v.y * v.z;
00210 zx = v.z * v.x;
00211 xs = v.x * s;
00212 ys = v.y * s;
00213 zs = v.z * s;
00214 one_c = 1.0 - c;
00215
00216 m[0] = (one_c * xx) + c;
00217 m[1] = (one_c * xy) - zs;
00218 m[2] = (one_c * zx) + ys;
00219
00220 m[3] = (one_c * xy) + zs;
00221 m[4] = (one_c * yy) + c;
00222 m[5] = (one_c * yz) - xs;
00223
00224 m[6] = (one_c * zx) - ys;
00225 m[7] = (one_c * yz) + xs;
00226 m[8] = (one_c * zz) + c;
00227 }
00228
00229
00230 Vector mat_multiply_vec(const Vector &v, BigReal m[]) {
00231 return Vector( m[0]*v.x + m[1]*v.y + m[2]*v.z,
00232 m[3]*v.x + m[4]*v.y + m[5]*v.z,
00233 m[6]*v.x + m[7]*v.y + m[8]*v.z );
00234 }
00235