ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/branches/new_design/OOPSE-3.0/src/UseTheForce/DUFF.cpp
(Generate patch)

Comparing:
trunk/OOPSE-3.0/src/UseTheForce/DUFF.cpp (file contents), Revision 1650 by gezelter, Tue Oct 26 22:24:52 2004 UTC vs.
branches/new_design/OOPSE-3.0/src/UseTheForce/DUFF.cpp (file contents), Revision 1753 by tim, Thu Nov 18 05:42:06 2004 UTC

# Line 1 | Line 1
1 < #include <stdlib.h>
2 < #include <stdio.h>
3 < #include <string.h>
1 > /*
2 > * Copyright (C) 2000-2004  Object Oriented Parallel Simulation Engine (OOPSE) project
3 > *
4 > * Contact: oopse@oopse.org
5 > *
6 > * This program is free software; you can redistribute it and/or
7 > * modify it under the terms of the GNU Lesser General Public License
8 > * as published by the Free Software Foundation; either version 2.1
9 > * of the License, or (at your option) any later version.
10 > * All we ask is that proper credit is given for our work, which includes
11 > * - but is not limited to - adding the above copyright notice to the beginning
12 > * of your source code files, and to any copyright notice that you may distribute
13 > * with programs based on this work.
14 > *
15 > * This program is distributed in the hope that it will be useful,
16 > * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 > * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 > * GNU Lesser General Public License for more details.
19 > *
20 > * You should have received a copy of the GNU Lesser General Public License
21 > * along with this program; if not, write to the Free Software
22 > * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23 > *
24 > */
25  
26 < #include <iostream>
6 < using namespace std;
7 <
8 < #include "UseTheForce/ForceFields.hpp"
9 < #include "primitives/SRI.hpp"
10 < #include "utils/simError.h"
11 < #include "types/DirectionalAtomType.hpp"
26 > #include "UseTheForce/DUFF.hpp"
27   #include "UseTheForce/DarkSide/lj_interface.h"
13 #include "UseTheForce/DarkSide/dipole_interface.h"
14 #include "UseTheForce/DarkSide/sticky_interface.h"
28  
29 < #ifdef IS_MPI
17 < #include "UseTheForce/mpiForceField.h"
18 < #endif // is_mpi
29 > namespace oopse {
30  
31 + //definition of createDUFF
32 + ForceField* createDUFF() {
33 +    return new DUFF();
34 + }
35  
36 < // define some bond Types
36 > //register createDUFF to ForceFieldCreator
37 > ForceFieldFactory::getInstance()->registerForceField("DUFF", createDUFF);
38  
39 < #define FIXED_BOND    0
40 < #define HARMONIC_BOND 1
41 <
42 <
43 < namespace DUFF_NS {  // restrict the access of the folowing to this file only.
44 <
45 <
30 <  // Declare the structures that will be passed by MPI
31 <  
32 <  typedef struct{
33 <    char name[15];
39 > void DUFF::parse(const std::string& filename) {
40 >    ifstrstream* ffStream;
41 >    ffStream = openForceFiledFile(filename);
42 >    const int bufferSize = 65535;
43 >    char line[bufferSize];
44 >    AtomType* atomType;
45 >    std::string atomTypeName;
46      double mass;
47 <    double epslon;
47 >    double epsilon;
48      double sigma;
49 <    double charge;
50 <    double dipole;
51 <    double w0;
40 <    double v0;
41 <    double v0p;
42 <    double rl;
43 <    double ru;
44 <    double rlp;
45 <    double rup;
46 <    int isSSD;
47 <    int isCharge;
48 <    int isDipole;
49 <    int ident;
50 <    int last;      //  0  -> default
51 <                   //  1  -> tells nodes to stop listening
52 <  } atomStruct;
53 <  
54 <  
55 <  typedef struct{
56 <    char nameA[15];
57 <    char nameB[15];
58 <    double d0;
59 <    double k0;
60 <    int last;      //  0  -> default
61 <                   //  1  -> tells nodes to stop listening
62 <    int type;
63 <  } bondStruct;
64 <  
65 <  
66 <  typedef struct{
67 <    char nameA[15];
68 <    char nameB[15];
69 <    char nameC[15];
70 <    char type[30];
71 <    double k1, k2, k3, t0;
72 <    int last;      //  0  -> default
73 <                   //  1  -> tells nodes to stop listening
74 <  } bendStruct;
75 <  
49 >    int status;
50 >    int ident = 1; //ident begins from 1 (fortran's index begins from 1)
51 >    int lineNo = 0;
52  
53 <  typedef struct{
54 <    char nameA[15];
79 <    char nameB[15];
80 <    char nameC[15];
81 <    char nameD[15];
82 <    char type[30];
83 <    double k1, k2, k3, k4;
84 <    int last;      //  0  -> default
85 <                   //  1  -> tells nodes to stop listening
86 <  } torsionStruct;
87 <  
88 <  
89 <  int parseAtom(    char *lineBuffer, int lineNum, atomStruct     &info );
90 <  int parseBond(    char *lineBuffer, int lineNum, bondStruct     &info );
91 <  int parseBend(    char *lineBuffer, int lineNum, bendStruct     &info );
92 <  int parseTorsion( char *lineBuffer, int lineNum, torsionStruct  &info );
93 <  
94 <  
95 < #ifdef IS_MPI
53 >    while(ffStream.getline(line, bufferSize)){
54 >        ++lineNo;
55  
56 <  MPI_Datatype mpiAtomStructType;
57 <  MPI_Datatype mpiBondStructType;
58 <  MPI_Datatype mpiBendStructType;
59 <  MPI_Datatype mpiTorsionStructType;
56 >        //a line begins with '#' or '!' is comment which is skipped
57 >        if (line[0] != '#' ||line[0] != '!') {
58 >            StringTokenizer tokenizer(line);
59 >            
60 >            if (tokenizer.countTokens() >= 4) {
61 >                atomTypeName = tokenizer.nextToken();
62 >                mass = tokenizer.nextTokenAsDouble();
63 >                epsilon = tokenizer.nextTokenAsDouble();
64 >                sigma = tokenizer.nextTokenAsDouble();
65  
66 < #endif
66 >                atomType = new AtomType();
67 >                atomType->setName(atomTypeName);
68 >                atomType->setMass(mass);
69 >                
70 >                //by default, all of the properties in AtomTypeProperties is set to 0
71 >                //In  Lennard-Jones Force Field, we only need to set Lennard-Jones to true
72 >                atomType->setLennardJones();
73  
74 <  class LinkedAtomType {
75 <  public:
76 <    LinkedAtomType(){
77 <      next = NULL;
78 <      name[0] = '\0';
79 <    }
110 <    ~LinkedAtomType(){ if( next != NULL ) delete next; }
74 >                atomType->setIdent(ident);
75 >                atomType->addProperty(new DoubleGenericData("Epsilon", epsilon));                                
76 >                atomType->addProperty(new DoubleGenericData("Sigma", sigma));                                
77 >                atomType->complete();
78 >                //notify a new LJtype atom type is created
79 >                newLJtype(&ident, &sigma, &epsilon, &status);
80  
81 <    LinkedAtomType* find(char* key){
82 <      if( !strcmp(name, key) ) return this;
83 <      if( next != NULL ) return next->find(key);
84 <      return NULL;
81 >                //add atom type to AtomTypeContainer
82 >                addAtomType(atomTypeName, atomType);
83 >                ++ident;
84 >                
85 >            } else {
86 >                sprintf( painCave.errMsg,
87 >                       "Not enough tokens when parsing Lennard-Jones Force Field : %s\n"
88 >                       "in line %d : %s\n",
89 >                       filename.c_str(), lineNo, line);
90 >                painCave.severity = OOPSE_ERROR;
91 >                painCave.isFatal = 1;
92 >                simError();                
93 >            }
94 >            
95 >        }
96      }
97      
98 <    void printMe( void ){
99 <      
120 <      std::cerr << "LinkedAtype " << name << ": ident = " << ident << "\n";
121 <      //      if( next != NULL ) next->printMe();
98 >    delete ffStream;
99 > }
100  
123    }
101  
102 <    void add( atomStruct &info ){
103 <
127 <      // check for duplicates
128 <      
129 <      if( !strcmp( info.name, name ) ){
130 <        sprintf( painCave.errMsg,
131 <                 "Duplicate DUFF atom type \"%s\" found in "
132 <                 "the DUFF param file./n",
133 <                 name );
134 <        painCave.isFatal = 1;
135 <        simError();
136 <      }
137 <
138 <      if( next != NULL ) next->add(info);
139 <      else{
140 <        next = new LinkedAtomType();
141 <        strcpy(next->name, info.name);
142 <        next->isDipole = info.isDipole;
143 <        next->isSSD    = info.isSSD;
144 <        next->mass     = info.mass;
145 <        next->epslon   = info.epslon;
146 <        next->sigma    = info.sigma;
147 <        next->dipole   = info.dipole;
148 <        next->w0       = info.w0;
149 <        next->v0       = info.v0;
150 <        next->v0p      = info.v0p;
151 <        next->rl       = info.rl;
152 <        next->ru       = info.ru;
153 <        next->rlp      = info.rlp;
154 <        next->rup      = info.rup;
155 <        next->ident    = info.ident;
156 <      }
157 <    }
158 <
159 < #ifdef IS_MPI
160 <    
161 <    void duplicate( atomStruct &info ){
162 <      strcpy(info.name, name);
163 <      info.isDipole = isDipole;
164 <      info.isSSD    = isSSD;
165 <      info.mass     = mass;
166 <      info.epslon   = epslon;
167 <      info.sigma    = sigma;
168 <      info.dipole   = dipole;
169 <      info.w0       = w0;
170 <      info.v0       = v0;
171 <      info.v0p      = v0p;
172 <      info.rl       = rl;
173 <      info.ru       = ru;
174 <      info.rlp      = rlp;
175 <      info.rup      = rup;
176 <      info.ident    = ident;
177 <      info.last     = 0;
178 <    }
102 > void DUFF::parseAtomType(){
103 > }
104  
105 + void DUFF::parseBondType(){
106 + }
107  
108 < #endif
182 <
183 <    char name[15];
184 <    int isDipole;
185 <    int isSSD;
186 <    double mass;
187 <    double epslon;
188 <    double sigma;
189 <    double dipole;
190 <    double w0;
191 <    double v0;
192 <    double v0p;
193 <    double rl;
194 <    double ru;
195 <    double rlp;
196 <    double rup;
197 <    int ident;
198 <    LinkedAtomType* next;
199 <  };
200 <
201 <  class LinkedBondType {
202 <  public:
203 <    LinkedBondType(){
204 <      next = NULL;
205 <      nameA[0] = '\0';
206 <      nameB[0] = '\0';
207 <    }
208 <    ~LinkedBondType(){ if( next != NULL ) delete next; }
209 <
210 <    LinkedBondType* find(char* key1, char* key2){
211 <      if( !strcmp(nameA, key1 ) && !strcmp( nameB, key2 ) ) return this;
212 <      if( !strcmp(nameA, key2 ) && !strcmp( nameB, key1 ) ) return this;
213 <      if( next != NULL ) return next->find(key1, key2);
214 <      return NULL;
215 <    }
216 <    
217 <
218 <    void add( bondStruct &info ){
219 <      
220 <      // check for duplicates
221 <      int dup = 0;
222 <
223 <      if( !strcmp(nameA, info.nameA ) && !strcmp( nameB, info.nameB ) ) dup = 1;
224 <      if( !strcmp(nameA, info.nameB ) && !strcmp( nameB, info.nameA ) ) dup = 1;
225 <      
226 <      if(dup){
227 <        sprintf( painCave.errMsg,
228 <                 "Duplicate DUFF bond type \"%s - %s\" found in "
229 <                 "the DUFF param file./n",
230 <                 nameA, nameB );
231 <        painCave.isFatal = 1;
232 <        simError();
233 <      }
234 <
235 <        
236 <      if( next != NULL ) next->add(info);
237 <      else{
238 <        next = new LinkedBondType();
239 <        strcpy(next->nameA, info.nameA);
240 <        strcpy(next->nameB, info.nameB);
241 <        next->type = info.type;
242 <        next->d0 = info.d0;
243 <        next->k0 = info.k0;
244 <      }
245 <    }
246 <    
247 < #ifdef IS_MPI
248 <    void duplicate( bondStruct &info ){
249 <      strcpy(info.nameA, nameA);
250 <      strcpy(info.nameB, nameB);
251 <      info.type = type;
252 <      info.d0   = d0;
253 <      info.k0   = k0;
254 <      info.last = 0;
255 <    }
256 <
257 <
258 < #endif
259 <
260 <    char nameA[15];
261 <    char nameB[15];
262 <    int type;
263 <    double d0;
264 <    double k0;
265 <
266 <    LinkedBondType* next;
267 <  };
268 <
269 <  class LinkedBendType {
270 <  public:
271 <    LinkedBendType(){
272 <      next = NULL;
273 <      nameA[0] = '\0';
274 <      nameB[0] = '\0';
275 <      nameC[0] = '\0';
276 <      type[0] = '\0';
277 <    }
278 <    ~LinkedBendType(){ if( next != NULL ) delete next; }
279 <
280 <    LinkedBendType* find( char* key1, char* key2, char* key3 ){
281 <      if( !strcmp( nameA, key1 ) && !strcmp( nameB, key2 )
282 <          && !strcmp( nameC, key3 ) ) return this;
283 <      if( !strcmp( nameA, key3 ) && !strcmp( nameB, key2 )
284 <          && !strcmp( nameC, key1 ) ) return this;
285 <      if( next != NULL ) return next->find(key1, key2, key3);
286 <      return NULL;
287 <    }
288 <    
289 <    void add( bendStruct &info ){
290 <
291 <      // check for duplicates
292 <      int dup = 0;
293 <      
294 <      if( !strcmp( nameA, info.nameA ) && !strcmp( nameB, info.nameB )
295 <          && !strcmp( nameC, info.nameC ) ) dup = 1;
296 <      if( !strcmp( nameA, info.nameC ) && !strcmp( nameB, info.nameB )
297 <          && !strcmp( nameC, info.nameA ) ) dup = 1;
298 <
299 <      if(dup){
300 <        sprintf( painCave.errMsg,
301 <                 "Duplicate DUFF bend type \"%s - %s - %s\" found in "
302 <                 "the DUFF param file./n",
303 <                 nameA, nameB, nameC );
304 <        painCave.isFatal = 1;
305 <        simError();
306 <      }
307 <
308 <      if( next != NULL ) next->add(info);
309 <      else{
310 <        next = new LinkedBendType();
311 <        strcpy(next->nameA, info.nameA);
312 <        strcpy(next->nameB, info.nameB);
313 <        strcpy(next->nameC, info.nameC);
314 <        strcpy(next->type,  info.type);
315 <        next->k1 = info.k1;
316 <        next->k2 = info.k2;
317 <        next->k3 = info.k3;
318 <        next->t0 = info.t0;
319 <      }
320 <    }
321 <
322 < #ifdef IS_MPI    
323 <
324 <    void duplicate( bendStruct &info ){
325 <      strcpy(info.nameA, nameA);
326 <      strcpy(info.nameB, nameB);
327 <      strcpy(info.nameC, nameC);
328 <      strcpy(info.type,  type);
329 <      info.k1   = k1;
330 <      info.k2   = k2;
331 <      info.k3   = k3;
332 <      info.t0   = t0;
333 <      info.last = 0;
334 <    }
335 <
336 < #endif // is_mpi
337 <
338 <    char nameA[15];
339 <    char nameB[15];
340 <    char nameC[15];
341 <    char type[30];
342 <    double k1, k2, k3, t0;
343 <
344 <    LinkedBendType* next;
345 <  };
346 <
347 <  class LinkedTorsionType {
348 <  public:
349 <    LinkedTorsionType(){
350 <      next = NULL;
351 <      nameA[0] = '\0';
352 <      nameB[0] = '\0';
353 <      nameC[0] = '\0';
354 <      type[0] = '\0';
355 <    }
356 <    ~LinkedTorsionType(){ if( next != NULL ) delete next; }
357 <
358 <    LinkedTorsionType* find( char* key1, char* key2, char* key3, char* key4 ){
359 <      
360 <
361 <
362 <
363 <      if( !strcmp( nameA, key1 ) && !strcmp( nameB, key2 ) &&
364 <          !strcmp( nameC, key3 ) && !strcmp( nameD, key4 ) ) return this;
365 <
366 <      if( !strcmp( nameA, key4 ) && !strcmp( nameB, key3 ) &&
367 <          !strcmp( nameC, key2 ) && !strcmp( nameD, key1 ) ) return this;
368 <
369 <      if( next != NULL ) return next->find(key1, key2, key3, key4);
370 <      return NULL;
371 <    }
372 <
373 <    void add( torsionStruct &info ){
374 <
375 <      // check for duplicates
376 <      int dup = 0;
377 <
378 <      if( !strcmp( nameA, info.nameA ) && !strcmp( nameB, info.nameB ) &&
379 <          !strcmp( nameC, info.nameC ) && !strcmp( nameD, info.nameD ) ) dup = 1;
380 <      
381 <      if( !strcmp( nameA, info.nameD ) && !strcmp( nameB, info.nameC ) &&
382 <          !strcmp( nameC, info.nameB ) && !strcmp( nameD, info.nameA ) ) dup = 1;
383 <      
384 <      if(dup){
385 <        sprintf( painCave.errMsg,
386 <                 "Duplicate DUFF torsion type \"%s - %s - %s - %s\" found in "
387 <                 "the DUFF param file./n", nameA, nameB, nameC, nameD );
388 <        painCave.isFatal = 1;
389 <        simError();
390 <      }
391 <
392 <      if( next != NULL ) next->add(info);
393 <      else{
394 <        next = new LinkedTorsionType();
395 <        strcpy(next->nameA, info.nameA);
396 <        strcpy(next->nameB, info.nameB);
397 <        strcpy(next->nameC, info.nameC);
398 <        strcpy(next->nameD, info.nameD);
399 <        strcpy(next->type,  info.type);
400 <        next->k1 = info.k1;
401 <        next->k2 = info.k2;
402 <        next->k3 = info.k3;
403 <        next->k4 = info.k4;
404 <
405 <      }
406 <    }
407 <
408 < #ifdef IS_MPI
409 <    
410 <    void duplicate( torsionStruct &info ){
411 <      strcpy(info.nameA, nameA);
412 <      strcpy(info.nameB, nameB);
413 <      strcpy(info.nameC, nameC);
414 <      strcpy(info.nameD, nameD);
415 <      strcpy(info.type,  type);
416 <      info.k1   = k1;
417 <      info.k2   = k2;
418 <      info.k3   = k3;
419 <      info.k4   = k4;
420 <      info.last = 0;
421 <    }
422 <
423 < #endif
424 <
425 <    char nameA[15];
426 <    char nameB[15];
427 <    char nameC[15];
428 <    char nameD[15];
429 <    char type[30];
430 <    double k1, k2, k3, k4;
431 <
432 <    LinkedTorsionType* next;
433 <  };
434 <
435 <
436 <  LinkedAtomType* headAtomType;
437 <  LinkedAtomType* currentAtomType;
438 <  LinkedBondType* headBondType;
439 <  LinkedBondType* currentBondType;
440 <  LinkedBendType* headBendType;
441 <  LinkedBendType* currentBendType;
442 <  LinkedTorsionType* headTorsionType;
443 <  LinkedTorsionType* currentTorsionType;
444 <
445 < } // namespace
446 <
447 < using namespace DUFF_NS;
448 <
449 <
450 < //****************************************************************
451 < // begins the actual forcefield stuff.  
452 < //****************************************************************
453 <
454 <
455 < DUFF::DUFF(){
456 <
457 <  char fileName[200];
458 <  char* ffPath_env = "FORCE_PARAM_PATH";
459 <  char* ffPath;
460 <  char temp[200];
461 <
462 <  headAtomType       = NULL;
463 <  currentAtomType    = NULL;
464 <  headBondType       = NULL;
465 <  currentBondType    = NULL;
466 <  headBendType       = NULL;
467 <  currentBendType    = NULL;
468 <  headTorsionType    = NULL;
469 <  currentTorsionType = NULL;
470 <
471 <
472 < #ifdef IS_MPI
473 <  int i;
474 <  
475 <  // **********************************************************************
476 <  // Init the atomStruct mpi type
477 <
478 <  atomStruct atomProto; // mpiPrototype
479 <  int atomBC[3] = {15,12,5};  // block counts
480 <  MPI_Aint atomDspls[3];           // displacements
481 <  MPI_Datatype atomMbrTypes[3];    // member mpi types
482 <
483 <  MPI_Address(&atomProto.name, &atomDspls[0]);
484 <  MPI_Address(&atomProto.mass, &atomDspls[1]);
485 <  MPI_Address(&atomProto.isSSD, &atomDspls[2]);
486 <  
487 <  atomMbrTypes[0] = MPI_CHAR;
488 <  atomMbrTypes[1] = MPI_DOUBLE;
489 <  atomMbrTypes[2] = MPI_INT;
490 <  
491 <  for (i=2; i >= 0; i--) atomDspls[i] -= atomDspls[0];
492 <  
493 <  MPI_Type_struct(3, atomBC, atomDspls, atomMbrTypes, &mpiAtomStructType);
494 <  MPI_Type_commit(&mpiAtomStructType);
495 <
496 <
497 <  // **********************************************************************
498 <  // Init the bondStruct mpi type
499 <  
500 <  bondStruct bondProto; // mpiPrototype
501 <  int bondBC[3] = {30,2,2};  // block counts
502 <  MPI_Aint bondDspls[3];           // displacements
503 <  MPI_Datatype bondMbrTypes[3];    // member mpi types
504 <  
505 <  MPI_Address(&bondProto.nameA, &bondDspls[0]);
506 <  MPI_Address(&bondProto.d0,    &bondDspls[1]);
507 <  MPI_Address(&bondProto.last,  &bondDspls[2]);
508 <  
509 <  bondMbrTypes[0] = MPI_CHAR;
510 <  bondMbrTypes[1] = MPI_DOUBLE;
511 <  bondMbrTypes[2] = MPI_INT;
512 <  
513 <  for (i=2; i >= 0; i--) bondDspls[i] -= bondDspls[0];
514 <  
515 <  MPI_Type_struct(3, bondBC, bondDspls, bondMbrTypes, &mpiBondStructType);
516 <  MPI_Type_commit(&mpiBondStructType);
517 <
518 <
519 <  // **********************************************************************
520 <  // Init the bendStruct mpi type
521 <  
522 <  bendStruct bendProto; // mpiPrototype
523 <  int bendBC[3] = {75,4,1};  // block counts
524 <  MPI_Aint bendDspls[3];           // displacements
525 <  MPI_Datatype bendMbrTypes[3];    // member mpi types
526 <  
527 <  MPI_Address(&bendProto.nameA, &bendDspls[0]);
528 <  MPI_Address(&bendProto.k1,    &bendDspls[1]);
529 <  MPI_Address(&bendProto.last,  &bendDspls[2]);
530 <  
531 <  bendMbrTypes[0] = MPI_CHAR;
532 <  bendMbrTypes[1] = MPI_DOUBLE;
533 <  bendMbrTypes[2] = MPI_INT;
534 <  
535 <  for (i=2; i >= 0; i--) bendDspls[i] -= bendDspls[0];
536 <  
537 <  MPI_Type_struct(3, bendBC, bendDspls, bendMbrTypes, &mpiBendStructType);
538 <  MPI_Type_commit(&mpiBendStructType);
539 <
540 <
541 <  // **********************************************************************
542 <  // Init the torsionStruct mpi type
543 <  
544 <  torsionStruct torsionProto; // mpiPrototype
545 <  int torsionBC[3] = {90,4,1};  // block counts
546 <  MPI_Aint torsionDspls[3];           // displacements
547 <  MPI_Datatype torsionMbrTypes[3];    // member mpi types
548 <  
549 <  MPI_Address(&torsionProto.nameA, &torsionDspls[0]);
550 <  MPI_Address(&torsionProto.k1,    &torsionDspls[1]);
551 <  MPI_Address(&torsionProto.last,  &torsionDspls[2]);
552 <  
553 <  torsionMbrTypes[0] = MPI_CHAR;
554 <  torsionMbrTypes[1] = MPI_DOUBLE;
555 <  torsionMbrTypes[2] = MPI_INT;
556 <  
557 <  for (i=2; i >= 0; i--) torsionDspls[i] -= torsionDspls[0];
558 <  
559 <  MPI_Type_struct(3, torsionBC, torsionDspls, torsionMbrTypes,
560 <                  &mpiTorsionStructType);
561 <  MPI_Type_commit(&mpiTorsionStructType);
562 <
563 <  // ***********************************************************************
564 <  
565 <  if( worldRank == 0 ){
566 < #endif
567 <    
568 <    // generate the force file name
569 <    
570 <    strcpy( fileName, "DUFF.frc" );
571 <    //    fprintf( stderr,"Trying to open %s\n", fileName );
572 <    
573 <    // attempt to open the file in the current directory first.
574 <    
575 <    frcFile = fopen( fileName, "r" );
576 <    
577 <    if( frcFile == NULL ){
578 <      
579 <      // next see if the force path enviorment variable is set
580 <      
581 <      ffPath = getenv( ffPath_env );
582 <      if( ffPath == NULL ) {
583 <        STR_DEFINE(ffPath, FRC_PATH );
584 <      }
585 <      
586 <      
587 <      strcpy( temp, ffPath );
588 <      strcat( temp, "/" );
589 <      strcat( temp, fileName );
590 <      strcpy( fileName, temp );
591 <      
592 <      frcFile = fopen( fileName, "r" );
593 <      
594 <      if( frcFile == NULL ){
595 <        
596 <        sprintf( painCave.errMsg,
597 <                 "Error opening the force field parameter file:\n"
598 <                 "\t%s\n"
599 <                 "\tHave you tried setting the FORCE_PARAM_PATH environment "
600 <                 "variable?\n",
601 <                 fileName );
602 <        painCave.severity = OOPSE_ERROR;
603 <        painCave.isFatal = 1;
604 <        simError();
605 <      }
606 <    }
607 <    
608 < #ifdef IS_MPI
609 <  }
610 <  
611 <  sprintf( checkPointMsg, "DUFF file opened sucessfully." );
612 <  MPIcheckPoint();
613 <  
614 < #endif // is_mpi
108 > void DUFF::parseBendType(){
109   }
110  
111 + void DUFF::parseTorsionType(){
112  
618 DUFF::~DUFF(){
619
620  if( headAtomType != NULL ) delete headAtomType;
621  if( headBondType != NULL ) delete headBondType;
622  if( headBendType != NULL ) delete headBendType;
623  if( headTorsionType != NULL ) delete headTorsionType;
624
625 #ifdef IS_MPI
626  if( worldRank == 0 ){
627 #endif // is_mpi
628    
629    fclose( frcFile );
630    
631 #ifdef IS_MPI
632  }
633 #endif // is_mpi
634 }
635
636 void DUFF::cleanMe( void ){
637
638 #ifdef IS_MPI
639  
640  // keep the linked lists in the mpi version
641
642 #else // is_mpi
643
644  // delete the linked lists in the single processor version
645
646  if( headAtomType != NULL ) delete headAtomType;
647  if( headBondType != NULL ) delete headBondType;
648  if( headBendType != NULL ) delete headBendType;
649  if( headTorsionType != NULL ) delete headTorsionType;
650
651 #endif // is_mpi
652 }
653
654
655 void DUFF::initForceField(){
656  
657  initFortran( entry_plug->useReactionField );
658 }
659
660
661 void DUFF::readParams( void ){
662
663  int identNum, isError;
664  
665  atomStruct atomInfo;
666  bondStruct bondInfo;
667  bendStruct bendInfo;
668  torsionStruct torsionInfo;
669
670  AtomType* at;
671  
672  bigSigma = 0.0;
673
674  atomInfo.last = 1;
675  bondInfo.last = 1;
676  bendInfo.last = 1;
677  torsionInfo.last = 1;
678
679  // read in the atom info
680  
681 #ifdef IS_MPI
682  if( worldRank == 0 ){
683 #endif
684    
685    // read in the atom types.
686    
687    headAtomType = new LinkedAtomType;
688    
689    fastForward( "AtomTypes", "initializeAtoms" );
690
691    // we are now at the AtomTypes section.
692    
693    eof_test = fgets( readLine, sizeof(readLine), frcFile );
694    lineNum++;
695    
696    
697    // read a line, and start parseing out the atom types
698
699    if( eof_test == NULL ){
700      sprintf( painCave.errMsg,
701               "Error in reading Atoms from force file at line %d.\n",
702               lineNum );
703      painCave.isFatal = 1;
704      simError();
705    }
706    
707    identNum = 1;
708    // stop reading at end of file, or at next section
709    while( readLine[0] != '#' && eof_test != NULL ){
710
711      // toss comment lines
712      if( readLine[0] != '!' ){
713        
714        // the parser returns 0 if the line was blank
715        if( parseAtom( readLine, lineNum, atomInfo ) ){
716          atomInfo.ident = identNum;
717          headAtomType->add( atomInfo );;
718          identNum++;
719        }
720      }
721      eof_test = fgets( readLine, sizeof(readLine), frcFile );
722      lineNum++;
723    }
724
725 #ifdef IS_MPI
726    
727    // send out the linked list to all the other processes
728
729    sprintf( checkPointMsg,
730             "DUFF atom structures read successfully." );
731    MPIcheckPoint();
732
733    currentAtomType = headAtomType->next; //skip the first element who is a place holder.
734    while( currentAtomType != NULL ){
735      currentAtomType->duplicate( atomInfo );
736
737      sendFrcStruct( &atomInfo, mpiAtomStructType );
738
739      sprintf( checkPointMsg,
740               "successfully sent DUFF force type: \"%s\"\n",
741               atomInfo.name );
742      MPIcheckPoint();
743
744      currentAtomType = currentAtomType->next;
745    }
746    atomInfo.last = 1;
747    sendFrcStruct( &atomInfo, mpiAtomStructType );
748    
749  }
750
751  else{
752    
753    // listen for node 0 to send out the force params
754
755    MPIcheckPoint();
756
757    headAtomType = new LinkedAtomType;
758    receiveFrcStruct( &atomInfo, mpiAtomStructType );
759    
760    while( !atomInfo.last ){
761
762      headAtomType->add( atomInfo );
763      
764      MPIcheckPoint();
765
766      receiveFrcStruct( &atomInfo, mpiAtomStructType );
767    }
768  }
769
770 #endif // is_mpi
771
772  // dummy variables
773      
774  currentAtomType = headAtomType->next;;
775  while( currentAtomType != NULL ){    
776
777    if( currentAtomType->name[0] != '\0' ){
778      
779      if (currentAtomType->isSSD || currentAtomType->isDipole)
780        DirectionalAtomType* at = new DirectionalAtomType();
781      else
782        AtomType* at = new AtomType();
783      
784      if (currentAtomType->isSSD) {
785        ((DirectionalAtomType*)at)->setSticky();
786        entry_plug->useSticky = 1;
787      }
788      
789      if (currentAtomType->isDipole) {
790        ((DirectionalAtomType*)at)->setDipole();
791        entry_plug->useDipoles = 1;              
792      }
793      
794      at->setIdent(currentAtomType->ident);
795      at->setName(currentAtomType->name);    
796      at->setLennardJones();
797      at->complete();
798    }
799    currentAtomType = currentAtomType->next;
800  }
801  
802  currentAtomType = headAtomType->next;;
803  while( currentAtomType != NULL ){    
804
805    if( currentAtomType->name[0] != '\0' ){
806      isError = 0;
807      newLJtype( &(currentAtomType->ident), &(currentAtomType->sigma),
808                 &(currentAtomType->epslon), &isError);
809      if( isError ){
810        sprintf( painCave.errMsg,
811                 "Error initializing the \"%s\" LJ type in fortran\n",
812                 currentAtomType->name );
813        painCave.isFatal = 1;
814        simError();
815      }
816          
817      if (currentAtomType->isDipole) {
818        newDipoleType(&(currentAtomType->ident), &(currentAtomType->dipole),
819                      &isError);
820        if( isError ){
821          sprintf( painCave.errMsg,
822                   "Error initializing the \"%s\" dipole type in fortran\n",
823                   currentAtomType->name );
824          painCave.isFatal = 1;
825          simError();
826        }
827      }
828      
829      if(currentAtomType->isSSD) {        
830        makeStickyType( &(currentAtomType->w0), &(currentAtomType->v0),
831                        &(currentAtomType->v0p),
832                        &(currentAtomType->rl), &(currentAtomType->ru),
833                        &(currentAtomType->rlp), &(currentAtomType->rup));
834      }
835      
836    }
837    currentAtomType = currentAtomType->next;
838  }
839      
840 #ifdef IS_MPI
841  sprintf( checkPointMsg,
842           "DUFF atom structures successfully sent to fortran\n" );
843  MPIcheckPoint();
844 #endif // is_mpi
845
846  
847
848  // read in the bonds
849  
850 #ifdef IS_MPI
851  if( worldRank == 0 ){
852 #endif
853    
854    // read in the bond types.
855    
856    headBondType = new LinkedBondType;
857    
858    fastForward( "BondTypes", "initializeBonds" );
859
860    // we are now at the bondTypes section
861
862    eof_test =  fgets( readLine, sizeof(readLine), frcFile );
863    lineNum++;
864    
865    
866    // read a line, and start parseing out the atom types
867
868    if( eof_test == NULL ){
869      sprintf( painCave.errMsg,
870               "Error in reading bonds from force file at line %d.\n",
871               lineNum );
872      painCave.isFatal = 1;
873      simError();
874    }
875    
876    // stop reading at end of file, or at next section
877    while( readLine[0] != '#' && eof_test != NULL ){
878
879      // toss comment lines
880      if( readLine[0] != '!' ){
881        
882        // the parser returns 0 if the line was blank
883        if( parseBond( readLine, lineNum, bondInfo ) ){
884          headBondType->add( bondInfo );
885        }
886      }
887      eof_test = fgets( readLine, sizeof(readLine), frcFile );
888      lineNum++;
889    }
890        
891 #ifdef IS_MPI
892    
893    // send out the linked list to all the other processes
894    
895    sprintf( checkPointMsg,
896             "DUFF bond structures read successfully." );
897    MPIcheckPoint();
898    
899    currentBondType = headBondType->next;
900    while( currentBondType != NULL ){
901      currentBondType->duplicate( bondInfo );
902      sendFrcStruct( &bondInfo, mpiBondStructType );
903      currentBondType = currentBondType->next;
904    }
905    bondInfo.last = 1;
906    sendFrcStruct( &bondInfo, mpiBondStructType );
907    
908  }
909
910  else{
911    
912    // listen for node 0 to send out the force params
913    
914    MPIcheckPoint();
915
916    headBondType = new LinkedBondType;
917    receiveFrcStruct( &bondInfo, mpiBondStructType );
918    while( !bondInfo.last ){
919
920      headBondType->add( bondInfo );
921      receiveFrcStruct( &bondInfo, mpiBondStructType );
922    }
923  }
924
925  sprintf( checkPointMsg,
926           "DUFF bond structures broadcast successfully." );
927  MPIcheckPoint();
928
929 #endif // is_mpi
930  
931
932  // read in the bends
933
934 #ifdef IS_MPI
935  if( worldRank == 0 ){
936 #endif
937
938    // read in the bend types.
939
940    headBendType = new LinkedBendType;
941    
942    fastForward( "BendTypes", "initializeBends" );
943
944    // we are now at the bendTypes section
945    
946    eof_test =  fgets( readLine, sizeof(readLine), frcFile );
947    lineNum++;
948        
949    // read a line, and start parseing out the bend types
950
951    if( eof_test == NULL ){
952      sprintf( painCave.errMsg,
953               "Error in reading bends from force file at line %d.\n",
954               lineNum );
955      painCave.isFatal = 1;
956      simError();
957    }
958    
959    // stop reading at end of file, or at next section
960    while( readLine[0] != '#' && eof_test != NULL ){
961      
962      // toss comment lines
963      if( readLine[0] != '!' ){
964        
965        // the parser returns 0 if the line was blank
966        if( parseBend( readLine, lineNum, bendInfo ) ){
967          headBendType->add( bendInfo );
968        }
969      }
970      eof_test = fgets( readLine, sizeof(readLine), frcFile );
971      lineNum++;
972    }
973    
974 #ifdef IS_MPI
975    
976    // send out the linked list to all the other processes
977
978    sprintf( checkPointMsg,
979             "DUFF bend structures read successfully." );
980    MPIcheckPoint();
981
982    currentBendType = headBendType->next;
983    while( currentBendType != NULL ){
984      currentBendType->duplicate( bendInfo );
985      sendFrcStruct( &bendInfo, mpiBendStructType );
986      currentBendType = currentBendType->next;
987    }
988    bendInfo.last = 1;
989    sendFrcStruct( &bendInfo, mpiBendStructType );
990    
991  }
992
993  else{
994    
995    // listen for node 0 to send out the force params
996    
997    MPIcheckPoint();
998
999    headBendType = new LinkedBendType;
1000    receiveFrcStruct( &bendInfo, mpiBendStructType );
1001    while( !bendInfo.last ){
1002
1003      headBendType->add( bendInfo );
1004      receiveFrcStruct( &bendInfo, mpiBendStructType );
1005    }
1006  }
1007
1008  sprintf( checkPointMsg,
1009           "DUFF bend structures broadcast successfully." );
1010  MPIcheckPoint();
1011
1012 #endif // is_mpi
1013
1014
1015  // read in the torsions
1016
1017 #ifdef IS_MPI
1018  if( worldRank == 0 ){
1019 #endif
1020
1021    // read in the torsion types.
1022
1023    headTorsionType = new LinkedTorsionType;
1024    
1025    fastForward( "TorsionTypes", "initializeTorsions" );
1026
1027    // we are now at the torsionTypes section
1028
1029    eof_test =  fgets( readLine, sizeof(readLine), frcFile );
1030    lineNum++;
1031    
1032    
1033    // read a line, and start parseing out the atom types
1034
1035    if( eof_test == NULL ){
1036      sprintf( painCave.errMsg,
1037               "Error in reading torsions from force file at line %d.\n",
1038               lineNum );
1039      painCave.isFatal = 1;
1040      simError();
1041    }
1042    
1043    // stop reading at end of file, or at next section
1044    while( readLine[0] != '#' && eof_test != NULL ){
1045
1046      // toss comment lines
1047      if( readLine[0] != '!' ){
1048        
1049        // the parser returns 0 if the line was blank
1050        if( parseTorsion( readLine, lineNum, torsionInfo ) ){
1051          headTorsionType->add( torsionInfo );
1052
1053        }
1054      }
1055      eof_test = fgets( readLine, sizeof(readLine), frcFile );
1056      lineNum++;
1057    }
1058
1059 #ifdef IS_MPI
1060    
1061    // send out the linked list to all the other processes
1062    
1063    sprintf( checkPointMsg,
1064             "DUFF torsion structures read successfully." );
1065    MPIcheckPoint();
1066    
1067    currentTorsionType = headTorsionType->next;
1068    while( currentTorsionType != NULL ){
1069      currentTorsionType->duplicate( torsionInfo );
1070      sendFrcStruct( &torsionInfo, mpiTorsionStructType );
1071      currentTorsionType = currentTorsionType->next;
1072    }
1073    torsionInfo.last = 1;
1074    sendFrcStruct( &torsionInfo, mpiTorsionStructType );
1075    
1076  }
1077
1078  else{
1079    
1080    // listen for node 0 to send out the force params
1081    
1082    MPIcheckPoint();
1083
1084    headTorsionType = new LinkedTorsionType;
1085    receiveFrcStruct( &torsionInfo, mpiTorsionStructType );
1086    while( !torsionInfo.last ){
1087
1088      headTorsionType->add( torsionInfo );
1089      receiveFrcStruct( &torsionInfo, mpiTorsionStructType );
1090    }
1091  }
1092
1093  sprintf( checkPointMsg,
1094           "DUFF torsion structures broadcast successfully." );
1095  MPIcheckPoint();
1096
1097 #endif // is_mpi
1098
1099  entry_plug->useLennardJones = 1;
113   }
114  
115 + } //end namespace oopse
116  
1103
1104 void DUFF::initializeAtoms( int nAtoms, Atom** the_atoms ){
1105  
1106  
1107  //////////////////////////////////////////////////
1108  // a quick water fix
1109
1110  double waterI[3][3];
1111  waterI[0][0] = 1.76958347772500;
1112  waterI[0][1] = 0.0;
1113  waterI[0][2] = 0.0;
1114
1115  waterI[1][0] = 0.0;
1116  waterI[1][1] = 0.614537057924513;
1117  waterI[1][2] = 0.0;
1118
1119  waterI[2][0] = 0.0;
1120  waterI[2][1] = 0.0;
1121  waterI[2][2] = 1.15504641980049;
1122
1123
1124  double headI[3][3];
1125  headI[0][0] = 1125;
1126  headI[0][1] = 0.0;
1127  headI[0][2] = 0.0;
1128
1129  headI[1][0] = 0.0;
1130  headI[1][1] = 1125;
1131  headI[1][2] = 0.0;
1132
1133  headI[2][0] = 0.0;
1134  headI[2][1] = 0.0;
1135  headI[2][2] = 250;
1136
1137  //////////////////////////////////////////////////
1138
1139  
1140  // initialize the atoms
1141  
1142  DirectionalAtom* dAtom;
1143  double ji[3];
1144
1145  for(int i=0; i<nAtoms; i++ ){
1146
1147    currentAtomType = headAtomType->find( the_atoms[i]->getType() );
1148    if( currentAtomType == NULL ){
1149      sprintf( painCave.errMsg,
1150               "AtomType error, %s not found in force file.\n",
1151               the_atoms[i]->getType() );
1152      painCave.isFatal = 1;
1153      simError();
1154    }
1155    
1156    the_atoms[i]->setMass( currentAtomType->mass );
1157    the_atoms[i]->setIdent( currentAtomType->ident );
1158
1159    if( bigSigma < currentAtomType->sigma ) bigSigma = currentAtomType->sigma;
1160
1161    if( currentAtomType->isDipole ){
1162      if( the_atoms[i]->isDirectional() ){
1163        
1164        dAtom = (DirectionalAtom *) the_atoms[i];
1165        dAtom->setHasDipole( 1 );
1166
1167        ji[0] = 0.0;
1168        ji[1] = 0.0;
1169        ji[2] = 0.0;
1170
1171        dAtom->setJ( ji );
1172        
1173        if(!strcmp("SSD",the_atoms[i]->getType())){
1174          dAtom->setI( waterI );
1175        }
1176        else if(!strcmp("HEAD",the_atoms[i]->getType())){
1177          dAtom->setI( headI );
1178        }
1179        else{
1180          sprintf(painCave.errMsg,
1181                  "AtmType error, %s does not have a moment of inertia set.\n",
1182                  the_atoms[i]->getType() );
1183          painCave.isFatal = 1;
1184          simError();
1185        }
1186        entry_plug->n_dipoles++;
1187      }
1188      else{
1189        
1190        sprintf( painCave.errMsg,
1191                "DUFF error: Atom \"%s\" is a dipole, yet no standard"
1192                 " orientation was specifed in the meta-data file.\n",
1193                 currentAtomType->name );
1194        painCave.isFatal = 1;
1195        simError();
1196      }
1197    }
1198    else{
1199      if( the_atoms[i]->isDirectional() ){
1200        sprintf( painCave.errMsg,
1201                 "DUFF error: Atom \"%s\" was given a standard "
1202                 "orientation in the meta-data file, yet it is not a dipole.\n",
1203                 currentAtomType->name);
1204        painCave.isFatal = 1;
1205        simError();
1206      }
1207    }
1208  }
1209 }
1210
1211 void DUFF::initializeBonds( int nBonds, Bond** bondArray,
1212                                   bond_pair* the_bonds ){
1213  int i,a,b;
1214  char* atomA;
1215  char* atomB;
1216  
1217  Atom** the_atoms;
1218  the_atoms = entry_plug->atoms;
1219  
1220
1221  // initialize the Bonds
1222  
1223  for( i=0; i<nBonds; i++ ){
1224    
1225    a = the_bonds[i].a;
1226    b = the_bonds[i].b;
1227
1228    atomA = the_atoms[a]->getType();
1229    atomB = the_atoms[b]->getType();
1230    currentBondType = headBondType->find( atomA, atomB );
1231    if( currentBondType == NULL ){
1232      sprintf( painCave.errMsg,
1233               "BondType error, %s - %s not found in force file.\n",
1234               atomA, atomB );
1235      painCave.isFatal = 1;
1236      simError();
1237    }
1238    
1239    switch( currentBondType->type ){
1240
1241    case FIXED_BOND:
1242            
1243      bondArray[i] = new ConstrainedBond( *the_atoms[a],
1244                                          *the_atoms[b],
1245                                          currentBondType->d0 );
1246      entry_plug->n_constraints++;
1247      break;
1248
1249    case HARMONIC_BOND:
1250      
1251      bondArray[i] = new HarmonicBond( *the_atoms[a],
1252                                       *the_atoms[b],
1253                                       currentBondType->d0,
1254                                       currentBondType->k0 );
1255      break;
1256      
1257    default:
1258
1259      break;
1260      // do nothing
1261    }
1262  }
1263 }
1264
1265 void DUFF::initializeBends( int nBends, Bend** bendArray,
1266                                   bend_set* the_bends ){
1267  
1268  QuadraticBend* qBend;
1269  GhostBend* gBend;
1270  Atom** the_atoms;
1271  the_atoms = entry_plug->atoms;
1272  
1273  int i, a, b, c;
1274  char* atomA;
1275  char* atomB;
1276  char* atomC;
1277  
1278  // initialize the Bends
1279
1280  for( i=0; i<nBends; i++ ){
1281    
1282    a = the_bends[i].a;
1283    b = the_bends[i].b;
1284    c = the_bends[i].c;
1285
1286    atomA = the_atoms[a]->getType();
1287    atomB = the_atoms[b]->getType();
1288
1289    if( the_bends[i].isGhost ) atomC = "GHOST";
1290    else atomC = the_atoms[c]->getType();
1291
1292    currentBendType = headBendType->find( atomA, atomB, atomC );
1293    if( currentBendType == NULL ){
1294      sprintf( painCave.errMsg, "BendType error, %s - %s - %s not found"
1295               " in force file.\n",
1296               atomA, atomB, atomC );
1297      painCave.isFatal = 1;
1298      simError();
1299    }
1300    
1301    if( !strcmp( currentBendType->type, "quadratic" ) ){
1302      
1303      if( the_bends[i].isGhost){
1304        
1305        if( the_bends[i].ghost == b ){
1306          // do nothing
1307        }
1308        else if( the_bends[i].ghost == a ){
1309          c = a;
1310          a = b;
1311          b = c;
1312        }
1313        else{
1314          sprintf( painCave.errMsg,
1315                   "BendType error, %s - %s - %s,\n"
1316                   "  --> central atom is not "
1317                   "correctly identified with the "
1318                   "\"ghostVectorSource = \" tag.\n",
1319                   atomA, atomB, atomC );
1320          painCave.isFatal = 1;
1321          simError();
1322        }
1323        
1324        gBend = new GhostBend( *the_atoms[a],
1325                               *the_atoms[b]);
1326                                                                      
1327        gBend->setConstants( currentBendType->k1,
1328                             currentBendType->k2,
1329                             currentBendType->k3,
1330                             currentBendType->t0 );
1331        bendArray[i] = gBend;
1332      }
1333      else{
1334        qBend = new QuadraticBend( *the_atoms[a],
1335                                   *the_atoms[b],
1336                                   *the_atoms[c] );
1337        qBend->setConstants( currentBendType->k1,
1338                             currentBendType->k2,
1339                             currentBendType->k3,
1340                             currentBendType->t0 );
1341        bendArray[i] = qBend;
1342      }      
1343    }
1344  }
1345 }
1346
1347 void DUFF::initializeTorsions( int nTorsions, Torsion** torsionArray,
1348                                      torsion_set* the_torsions ){
1349
1350  int i, a, b, c, d;
1351  char* atomA;
1352  char* atomB;
1353  char* atomC;
1354  char* atomD;
1355
1356  CubicTorsion* cTors;
1357  Atom** the_atoms;
1358  the_atoms = entry_plug->atoms;
1359
1360  // initialize the Torsions
1361
1362  for( i=0; i<nTorsions; i++ ){
1363    
1364    a = the_torsions[i].a;
1365    b = the_torsions[i].b;
1366    c = the_torsions[i].c;
1367    d = the_torsions[i].d;
1368
1369    atomA = the_atoms[a]->getType();
1370    atomB = the_atoms[b]->getType();
1371    atomC = the_atoms[c]->getType();
1372    atomD = the_atoms[d]->getType();
1373    currentTorsionType = headTorsionType->find( atomA, atomB, atomC, atomD );
1374    if( currentTorsionType == NULL ){
1375      sprintf( painCave.errMsg,
1376               "TorsionType error, %s - %s - %s - %s not found"
1377               " in force file.\n",
1378               atomA, atomB, atomC, atomD );
1379      painCave.isFatal = 1;
1380      simError();
1381    }
1382    
1383    if( !strcmp( currentTorsionType->type, "cubic" ) ){
1384      
1385      cTors = new CubicTorsion( *the_atoms[a], *the_atoms[b],
1386                                *the_atoms[c], *the_atoms[d] );
1387      cTors->setConstants( currentTorsionType->k1, currentTorsionType->k2,
1388                           currentTorsionType->k3, currentTorsionType->k4 );
1389      torsionArray[i] = cTors;
1390    }
1391  }
1392 }
1393
1394 void DUFF::fastForward( char* stopText, char* searchOwner ){
1395
1396  int foundText = 0;
1397  char* the_token;
1398
1399  rewind( frcFile );
1400  lineNum = 0;
1401
1402  eof_test = fgets( readLine, sizeof(readLine), frcFile );
1403  lineNum++;
1404  if( eof_test == NULL ){
1405    sprintf( painCave.errMsg, "Error fast forwarding force file for %s: "
1406             " file is empty.\n",
1407             searchOwner );
1408    painCave.isFatal = 1;
1409    simError();
1410  }
1411  
1412  
1413  while( !foundText ){
1414    while( eof_test != NULL && readLine[0] != '#' ){
1415      eof_test = fgets( readLine, sizeof(readLine), frcFile );
1416      lineNum++;
1417    }
1418    if( eof_test == NULL ){
1419      sprintf( painCave.errMsg,
1420               "Error fast forwarding force file for %s at "
1421               "line %d: file ended unexpectedly.\n",
1422               searchOwner,
1423               lineNum );
1424      painCave.isFatal = 1;
1425      simError();
1426    }
1427    
1428    the_token = strtok( readLine, " ,;\t#\n" );
1429    foundText = !strcmp( stopText, the_token );
1430    
1431    if( !foundText ){
1432      eof_test = fgets( readLine, sizeof(readLine), frcFile );
1433      lineNum++;
1434      
1435      if( eof_test == NULL ){
1436        sprintf( painCave.errMsg,
1437                 "Error fast forwarding force file for %s at "
1438                 "line %d: file ended unexpectedly.\n",
1439                 searchOwner,
1440                 lineNum );
1441        painCave.isFatal = 1;
1442        simError();
1443      }
1444    }
1445  }  
1446 }
1447
1448
1449 int DUFF_NS::parseAtom( char *lineBuffer, int lineNum, atomStruct &info ){
1450
1451  char* the_token;
1452  
1453  the_token = strtok( lineBuffer, " \n\t,;" );
1454  if( the_token != NULL ){
1455    
1456    strcpy( info.name, the_token );
1457
1458    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1459      sprintf( painCave.errMsg,
1460               "Error parseing AtomTypes: line %d\n", lineNum );
1461      painCave.isFatal = 1;
1462      simError();
1463    }
1464    
1465    info.isDipole = atoi( the_token );
1466
1467    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1468      sprintf( painCave.errMsg,
1469               "Error parseing AtomTypes: line %d\n", lineNum );
1470      painCave.isFatal = 1;
1471      simError();
1472    }
1473
1474    info.isSSD = atoi( the_token );
1475
1476    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1477      sprintf( painCave.errMsg,
1478               "Error parseing AtomTypes: line %d\n", lineNum );
1479      painCave.isFatal = 1;
1480      simError();
1481    }
1482    
1483    info.mass = atof( the_token );
1484    
1485    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1486      sprintf( painCave.errMsg,
1487               "Error parseing AtomTypes: line %d\n", lineNum );
1488      painCave.isFatal = 1;
1489      simError();
1490    }
1491        
1492    info.epslon = atof( the_token );
1493          
1494    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1495      sprintf( painCave.errMsg,
1496               "Error parseing AtomTypes: line %d\n", lineNum );
1497      painCave.isFatal = 1;
1498      simError();
1499    }
1500        
1501    info.sigma = atof( the_token );
1502
1503    if( info.isDipole ){
1504      
1505      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1506        sprintf( painCave.errMsg,
1507                 "Error parseing AtomTypes: line %d\n", lineNum );
1508        painCave.isFatal = 1;
1509        simError();
1510      }
1511      
1512      info.dipole = atof( the_token );
1513    }
1514    else info.dipole = 0.0;
1515
1516    if( info.isSSD ){
1517
1518      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1519        sprintf( painCave.errMsg,
1520                 "Error parseing AtomTypes: line %d\n", lineNum );
1521        painCave.isFatal = 1;
1522        simError();
1523      }
1524      
1525      info.w0 = atof( the_token );
1526
1527      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1528        sprintf( painCave.errMsg,
1529                 "Error parseing AtomTypes: line %d\n", lineNum );
1530        painCave.isFatal = 1;
1531        simError();
1532      }
1533      
1534      info.v0 = atof( the_token );
1535      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1536        sprintf( painCave.errMsg,
1537                 "Error parseing AtomTypes: line %d\n", lineNum );
1538        painCave.isFatal = 1;
1539        simError();
1540      }
1541      
1542      info.v0p = atof( the_token );
1543
1544      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1545        sprintf( painCave.errMsg,
1546                 "Error parseing AtomTypes: line %d\n", lineNum );
1547        painCave.isFatal = 1;
1548        simError();
1549      }
1550      
1551      info.rl = atof( the_token );
1552
1553      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1554        sprintf( painCave.errMsg,
1555                 "Error parseing AtomTypes: line %d\n", lineNum );
1556        painCave.isFatal = 1;
1557        simError();
1558      }
1559      
1560      info.ru = atof( the_token );
1561
1562      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1563        sprintf( painCave.errMsg,
1564                 "Error parseing AtomTypes: line %d\n", lineNum );
1565        painCave.isFatal = 1;
1566        simError();
1567      }
1568      
1569      info.rlp = atof( the_token );
1570
1571      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1572        sprintf( painCave.errMsg,
1573                 "Error parseing AtomTypes: line %d\n", lineNum );
1574        painCave.isFatal = 1;
1575        simError();
1576      }
1577      
1578      info.rup = atof( the_token );
1579    }
1580    else info.v0 = info.w0 = info.v0p = info.rl = info.ru = info.rlp = info.rup = 0.0;
1581
1582    return 1;
1583  }
1584  else return 0;
1585 }
1586
1587 int DUFF_NS::parseBond( char *lineBuffer, int lineNum, bondStruct &info ){
1588
1589  char* the_token;
1590  char bondType[30];
1591  
1592  the_token = strtok( lineBuffer, " \n\t,;" );
1593  if( the_token != NULL ){
1594    
1595    strcpy( info.nameA, the_token );
1596
1597    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1598      sprintf( painCave.errMsg,
1599               "Error parseing BondTypes: line %d\n", lineNum );
1600      painCave.isFatal = 1;
1601      simError();
1602    }
1603    
1604    strcpy( info.nameB, the_token );
1605
1606    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1607      sprintf( painCave.errMsg,
1608               "Error parseing BondTypes: line %d\n", lineNum );
1609      painCave.isFatal = 1;
1610      simError();
1611    }
1612    
1613    strcpy( bondType, the_token );
1614    
1615    if( !strcmp( bondType, "fixed" ) ){
1616      info.type = FIXED_BOND;
1617      
1618      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1619        sprintf( painCave.errMsg,
1620                 "Error parseing BondTypes: line %d\n", lineNum );
1621        painCave.isFatal = 1;
1622        simError();
1623      }
1624      
1625      info.d0 = atof( the_token );
1626      
1627      info.k0=0.0;
1628    }
1629    else if( !strcmp( bondType, "harmonic" ) ){
1630      info.type = HARMONIC_BOND;
1631      
1632      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1633        sprintf( painCave.errMsg,
1634                 "Error parseing BondTypes: line %d\n", lineNum );
1635        painCave.isFatal = 1;
1636        simError();
1637      }
1638      
1639      info.d0 = atof( the_token );
1640
1641      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1642        sprintf( painCave.errMsg,
1643                 "Error parseing BondTypes: line %d\n", lineNum );
1644        painCave.isFatal = 1;
1645        simError();
1646      }
1647      
1648      info.k0 = atof( the_token );
1649    }
1650
1651    else{
1652      sprintf( painCave.errMsg,
1653               "Unknown DUFF bond type \"%s\" at line %d\n",
1654               bondType,
1655               lineNum );
1656      painCave.isFatal = 1;
1657      simError();
1658    }            
1659    
1660    return 1;
1661  }
1662  else return 0;
1663 }
1664
1665
1666 int DUFF_NS::parseBend( char *lineBuffer, int lineNum, bendStruct &info ){
1667
1668  char* the_token;
1669  
1670  the_token = strtok( lineBuffer, " \n\t,;" );
1671  if( the_token != NULL ){
1672    
1673    strcpy( info.nameA, the_token );
1674
1675    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1676      sprintf( painCave.errMsg,
1677               "Error parseing BendTypes: line %d\n", lineNum );
1678      painCave.isFatal = 1;
1679      simError();
1680    }
1681    
1682    strcpy( info.nameB, the_token );
1683
1684    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1685      sprintf( painCave.errMsg,
1686               "Error parseing BendTypes: line %d\n", lineNum );
1687      painCave.isFatal = 1;
1688      simError();
1689    }
1690    
1691    strcpy( info.nameC, the_token );
1692
1693    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1694      sprintf( painCave.errMsg,
1695               "Error parseing BendTypes: line %d\n", lineNum );
1696      painCave.isFatal = 1;
1697      simError();
1698    }
1699    
1700    strcpy( info.type, the_token );
1701
1702    if( !strcmp( info.type, "quadratic" ) ){
1703      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1704        sprintf( painCave.errMsg,
1705                 "Error parseing BendTypes: line %d\n", lineNum );
1706        painCave.isFatal = 1;
1707        simError();
1708      }
1709        
1710      info.k1 = atof( the_token );
1711      
1712      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1713        sprintf( painCave.errMsg,
1714                 "Error parseing BendTypes: line %d\n", lineNum );
1715        painCave.isFatal = 1;
1716        simError();
1717      }
1718      
1719      info.k2 = atof( the_token );
1720      
1721      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1722        sprintf( painCave.errMsg,
1723                 "Error parseing BendTypes: line %d\n", lineNum );
1724        painCave.isFatal = 1;
1725        simError();
1726      }
1727        
1728      info.k3 = atof( the_token );
1729      
1730      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1731        sprintf( painCave.errMsg,
1732                 "Error parseing BendTypes: line %d\n", lineNum );
1733        painCave.isFatal = 1;
1734        simError();
1735      }
1736      
1737      info.t0 = atof( the_token );
1738    }
1739    
1740    else{
1741      sprintf( painCave.errMsg,
1742               "Unknown DUFF bend type \"%s\" at line %d\n",
1743               info.type,
1744               lineNum );
1745      painCave.isFatal = 1;
1746      simError();
1747    }            
1748        
1749    return 1;
1750  }
1751  else return 0;
1752 }
1753
1754 int DUFF_NS::parseTorsion( char *lineBuffer, int lineNum, torsionStruct &info ){
1755  
1756  char*  the_token;
1757
1758  the_token = strtok( lineBuffer, " \n\t,;" );
1759  if( the_token != NULL ){
1760    
1761    strcpy( info.nameA, the_token );
1762        
1763    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1764      sprintf( painCave.errMsg,
1765               "Error parseing TorsionTypes: line %d\n", lineNum );
1766      painCave.isFatal = 1;
1767      simError();
1768    }
1769    
1770    strcpy( info.nameB, the_token );
1771
1772    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1773      sprintf( painCave.errMsg,
1774               "Error parseing TorsionTypes: line %d\n", lineNum );
1775      painCave.isFatal = 1;
1776      simError();
1777    }
1778    
1779    strcpy( info.nameC, the_token );
1780    
1781    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1782      sprintf( painCave.errMsg,
1783               "Error parseing TorsionTypes: line %d\n", lineNum );
1784      painCave.isFatal = 1;
1785      simError();
1786    }
1787    
1788    strcpy( info.nameD, the_token );
1789    
1790    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1791      sprintf( painCave.errMsg,
1792               "Error parseing TorsionTypes: line %d\n", lineNum );
1793      painCave.isFatal = 1;
1794      simError();
1795    }
1796    
1797    strcpy( info.type, the_token );
1798    
1799    if( !strcmp( info.type, "cubic" ) ){
1800      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1801        sprintf( painCave.errMsg,
1802                 "Error parseing TorsionTypes: line %d\n", lineNum );
1803        painCave.isFatal = 1;
1804        simError();
1805      }
1806      
1807      info.k1 = atof( the_token );
1808      
1809      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1810        sprintf( painCave.errMsg,
1811                 "Error parseing TorsionTypes: line %d\n", lineNum );
1812        painCave.isFatal = 1;
1813        simError();
1814      }
1815      
1816      info.k2 = atof( the_token );
1817      
1818      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1819        sprintf( painCave.errMsg,
1820                 "Error parseing TorsionTypes: line %d\n", lineNum );
1821        painCave.isFatal = 1;
1822        simError();
1823      }
1824      
1825      info.k3 = atof( the_token );
1826      
1827      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1828        sprintf( painCave.errMsg,
1829                 "Error parseing TorsionTypes: line %d\n", lineNum );
1830        painCave.isFatal = 1;
1831        simError();
1832      }
1833      
1834      info.k4 = atof( the_token );
1835    
1836    }
1837    
1838    else{
1839      sprintf( painCave.errMsg,
1840               "Unknown DUFF torsion type \"%s\" at line %d\n",
1841               info.type,
1842               lineNum );
1843      painCave.isFatal = 1;
1844      simError();
1845    }            
1846    
1847    return 1;
1848  }
1849  
1850  else return 0;
1851 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines