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 1636 by chrisfen, Fri Oct 22 22:54:01 2004 UTC vs.
branches/new_design/OOPSE-3.0/src/UseTheForce/DUFF.cpp (file contents), Revision 1741 by tim, Tue Nov 16 02:07:14 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.nextTokenAsFloat();
63 >                epsilon = tokenizer.nextTokenAsFloat();
64 >                sigma = tokenizer.nextTokenAsFloat();
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 ){
102 > void DUFF::parseAtomType(){
103 > }
104  
105 <      // check for duplicates
106 <      
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 <    }
105 > void DUFF::parseBondType(){
106 > }
107  
108 <
181 < #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 <
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 < double DUFF::getAtomTypeMass (char* atomType) {
661 <
662 <  currentAtomType = headAtomType->find( atomType );
663 <  if( currentAtomType == NULL ){
664 <    sprintf( painCave.errMsg,
665 <            "AtomType error, %s not found in force file.\n",
666 <             atomType );
667 <    painCave.isFatal = 1;
668 <    simError();
669 <  }
670 <
671 <  return currentAtomType->mass;
672 < }
673 <
674 < void DUFF::readParams( void ){
675 <
676 <  int identNum, isError;
677 <  
678 <  atomStruct atomInfo;
679 <  bondStruct bondInfo;
680 <  bendStruct bendInfo;
681 <  torsionStruct torsionInfo;
682 <
683 <  AtomType* at;
684 <  
685 <  bigSigma = 0.0;
686 <
687 <  atomInfo.last = 1;
688 <  bondInfo.last = 1;
689 <  bendInfo.last = 1;
690 <  torsionInfo.last = 1;
691 <
692 <  // read in the atom info
693 <  
694 < #ifdef IS_MPI
695 <  if( worldRank == 0 ){
696 < #endif
697 <    
698 <    // read in the atom types.
699 <    
700 <    headAtomType = new LinkedAtomType;
701 <    
702 <    fastForward( "AtomTypes", "initializeAtoms" );
703 <
704 <    // we are now at the AtomTypes section.
705 <    
706 <    eof_test = fgets( readLine, sizeof(readLine), frcFile );
707 <    lineNum++;
708 <    
709 <    
710 <    // read a line, and start parseing out the atom types
711 <
712 <    if( eof_test == NULL ){
713 <      sprintf( painCave.errMsg,
714 <               "Error in reading Atoms from force file at line %d.\n",
715 <               lineNum );
716 <      painCave.isFatal = 1;
717 <      simError();
718 <    }
719 <    
720 <    identNum = 1;
721 <    // stop reading at end of file, or at next section
722 <    while( readLine[0] != '#' && eof_test != NULL ){
723 <
724 <      // toss comment lines
725 <      if( readLine[0] != '!' ){
726 <        
727 <        // the parser returns 0 if the line was blank
728 <        if( parseAtom( readLine, lineNum, atomInfo ) ){
729 <          atomInfo.ident = identNum;
730 <          headAtomType->add( atomInfo );;
731 <          identNum++;
732 <        }
733 <      }
734 <      eof_test = fgets( readLine, sizeof(readLine), frcFile );
735 <      lineNum++;
736 <    }
737 <
738 < #ifdef IS_MPI
739 <    
740 <    // send out the linked list to all the other processes
741 <
742 <    sprintf( checkPointMsg,
743 <             "DUFF atom structures read successfully." );
744 <    MPIcheckPoint();
745 <
746 <    currentAtomType = headAtomType->next; //skip the first element who is a place holder.
747 <    while( currentAtomType != NULL ){
748 <      currentAtomType->duplicate( atomInfo );
749 <
750 <      sendFrcStruct( &atomInfo, mpiAtomStructType );
751 <
752 <      sprintf( checkPointMsg,
753 <               "successfully sent DUFF force type: \"%s\"\n",
754 <               atomInfo.name );
755 <      MPIcheckPoint();
756 <
757 <      currentAtomType = currentAtomType->next;
758 <    }
759 <    atomInfo.last = 1;
760 <    sendFrcStruct( &atomInfo, mpiAtomStructType );
761 <    
762 <  }
763 <
764 <  else{
765 <    
766 <    // listen for node 0 to send out the force params
767 <
768 <    MPIcheckPoint();
769 <
770 <    headAtomType = new LinkedAtomType;
771 <    receiveFrcStruct( &atomInfo, mpiAtomStructType );
772 <    
773 <    while( !atomInfo.last ){
774 <
775 <      headAtomType->add( atomInfo );
776 <      
777 <      MPIcheckPoint();
778 <
779 <      receiveFrcStruct( &atomInfo, mpiAtomStructType );
780 <    }
781 <  }
782 <
783 < #endif // is_mpi
784 <
785 <  // dummy variables
786 <      
787 <  currentAtomType = headAtomType->next;;
788 <  while( currentAtomType != NULL ){    
789 <
790 <    if( currentAtomType->name[0] != '\0' ){
791 <      
792 <      if (currentAtomType->isSSD || currentAtomType->isDipole)
793 <        DirectionalAtomType* at = new DirectionalAtomType();
794 <      else
795 <        AtomType* at = new AtomType();
796 <      
797 <      if (currentAtomType->isSSD) {
798 <        ((DirectionalAtomType*)at)->setSticky();
799 <        entry_plug->useSticky = 1;
800 <      }
801 <      
802 <      if (currentAtomType->isDipole) {
803 <        ((DirectionalAtomType*)at)->setDipole();
804 <        entry_plug->useDipoles = 1;              
805 <      }
806 <      
807 <      at->setIdent(currentAtomType->ident);
808 <      at->setName(currentAtomType->name);    
809 <      at->setLennardJones();
810 <      at->complete();
811 <    }
812 <    currentAtomType = currentAtomType->next;
813 <  }
814 <  
815 <  currentAtomType = headAtomType->next;;
816 <  while( currentAtomType != NULL ){    
817 <
818 <    if( currentAtomType->name[0] != '\0' ){
819 <      isError = 0;
820 <      newLJtype( &(currentAtomType->ident), &(currentAtomType->sigma),
821 <                 &(currentAtomType->epslon), &isError);
822 <      if( isError ){
823 <        sprintf( painCave.errMsg,
824 <                 "Error initializing the \"%s\" LJ type in fortran\n",
825 <                 currentAtomType->name );
826 <        painCave.isFatal = 1;
827 <        simError();
828 <      }
829 <          
830 <      if (currentAtomType->isDipole) {
831 <        newDipoleType(&(currentAtomType->ident), &(currentAtomType->dipole),
832 <                      &isError);
833 <        if( isError ){
834 <          sprintf( painCave.errMsg,
835 <                   "Error initializing the \"%s\" dipole type in fortran\n",
836 <                   currentAtomType->name );
837 <          painCave.isFatal = 1;
838 <          simError();
839 <        }
840 <      }
841 <      
842 <      if(currentAtomType->isSSD) {        
843 <        makeStickyType( &(currentAtomType->w0), &(currentAtomType->v0),
844 <                        &(currentAtomType->v0p),
845 <                        &(currentAtomType->rl), &(currentAtomType->ru),
846 <                        &(currentAtomType->rlp), &(currentAtomType->rup));
847 <      }
848 <      
849 <    }
850 <    currentAtomType = currentAtomType->next;
851 <  }
852 <      
853 < #ifdef IS_MPI
854 <  sprintf( checkPointMsg,
855 <           "DUFF atom structures successfully sent to fortran\n" );
856 <  MPIcheckPoint();
857 < #endif // is_mpi
858 <
859 <  
860 <
861 <  // read in the bonds
862 <  
863 < #ifdef IS_MPI
864 <  if( worldRank == 0 ){
865 < #endif
866 <    
867 <    // read in the bond types.
868 <    
869 <    headBondType = new LinkedBondType;
870 <    
871 <    fastForward( "BondTypes", "initializeBonds" );
872 <
873 <    // we are now at the bondTypes section
874 <
875 <    eof_test =  fgets( readLine, sizeof(readLine), frcFile );
876 <    lineNum++;
877 <    
878 <    
879 <    // read a line, and start parseing out the atom types
880 <
881 <    if( eof_test == NULL ){
882 <      sprintf( painCave.errMsg,
883 <               "Error in reading bonds from force file at line %d.\n",
884 <               lineNum );
885 <      painCave.isFatal = 1;
886 <      simError();
887 <    }
888 <    
889 <    // stop reading at end of file, or at next section
890 <    while( readLine[0] != '#' && eof_test != NULL ){
891 <
892 <      // toss comment lines
893 <      if( readLine[0] != '!' ){
894 <        
895 <        // the parser returns 0 if the line was blank
896 <        if( parseBond( readLine, lineNum, bondInfo ) ){
897 <          headBondType->add( bondInfo );
898 <        }
899 <      }
900 <      eof_test = fgets( readLine, sizeof(readLine), frcFile );
901 <      lineNum++;
902 <    }
903 <        
904 < #ifdef IS_MPI
905 <    
906 <    // send out the linked list to all the other processes
907 <    
908 <    sprintf( checkPointMsg,
909 <             "DUFF bond structures read successfully." );
910 <    MPIcheckPoint();
911 <    
912 <    currentBondType = headBondType->next;
913 <    while( currentBondType != NULL ){
914 <      currentBondType->duplicate( bondInfo );
915 <      sendFrcStruct( &bondInfo, mpiBondStructType );
916 <      currentBondType = currentBondType->next;
917 <    }
918 <    bondInfo.last = 1;
919 <    sendFrcStruct( &bondInfo, mpiBondStructType );
920 <    
921 <  }
111 > void DUFF::parseTorsionType(){
112  
923  else{
924    
925    // listen for node 0 to send out the force params
926    
927    MPIcheckPoint();
928
929    headBondType = new LinkedBondType;
930    receiveFrcStruct( &bondInfo, mpiBondStructType );
931    while( !bondInfo.last ){
932
933      headBondType->add( bondInfo );
934      receiveFrcStruct( &bondInfo, mpiBondStructType );
935    }
936  }
937
938  sprintf( checkPointMsg,
939           "DUFF bond structures broadcast successfully." );
940  MPIcheckPoint();
941
942 #endif // is_mpi
943  
944
945  // read in the bends
946
947 #ifdef IS_MPI
948  if( worldRank == 0 ){
949 #endif
950
951    // read in the bend types.
952
953    headBendType = new LinkedBendType;
954    
955    fastForward( "BendTypes", "initializeBends" );
956
957    // we are now at the bendTypes section
958    
959    eof_test =  fgets( readLine, sizeof(readLine), frcFile );
960    lineNum++;
961        
962    // read a line, and start parseing out the bend types
963
964    if( eof_test == NULL ){
965      sprintf( painCave.errMsg,
966               "Error in reading bends from force file at line %d.\n",
967               lineNum );
968      painCave.isFatal = 1;
969      simError();
970    }
971    
972    // stop reading at end of file, or at next section
973    while( readLine[0] != '#' && eof_test != NULL ){
974      
975      // toss comment lines
976      if( readLine[0] != '!' ){
977        
978        // the parser returns 0 if the line was blank
979        if( parseBend( readLine, lineNum, bendInfo ) ){
980          headBendType->add( bendInfo );
981        }
982      }
983      eof_test = fgets( readLine, sizeof(readLine), frcFile );
984      lineNum++;
985    }
986    
987 #ifdef IS_MPI
988    
989    // send out the linked list to all the other processes
990
991    sprintf( checkPointMsg,
992             "DUFF bend structures read successfully." );
993    MPIcheckPoint();
994
995    currentBendType = headBendType->next;
996    while( currentBendType != NULL ){
997      currentBendType->duplicate( bendInfo );
998      sendFrcStruct( &bendInfo, mpiBendStructType );
999      currentBendType = currentBendType->next;
1000    }
1001    bendInfo.last = 1;
1002    sendFrcStruct( &bendInfo, mpiBendStructType );
1003    
1004  }
1005
1006  else{
1007    
1008    // listen for node 0 to send out the force params
1009    
1010    MPIcheckPoint();
1011
1012    headBendType = new LinkedBendType;
1013    receiveFrcStruct( &bendInfo, mpiBendStructType );
1014    while( !bendInfo.last ){
1015
1016      headBendType->add( bendInfo );
1017      receiveFrcStruct( &bendInfo, mpiBendStructType );
1018    }
1019  }
1020
1021  sprintf( checkPointMsg,
1022           "DUFF bend structures broadcast successfully." );
1023  MPIcheckPoint();
1024
1025 #endif // is_mpi
1026
1027
1028  // read in the torsions
1029
1030 #ifdef IS_MPI
1031  if( worldRank == 0 ){
1032 #endif
1033
1034    // read in the torsion types.
1035
1036    headTorsionType = new LinkedTorsionType;
1037    
1038    fastForward( "TorsionTypes", "initializeTorsions" );
1039
1040    // we are now at the torsionTypes section
1041
1042    eof_test =  fgets( readLine, sizeof(readLine), frcFile );
1043    lineNum++;
1044    
1045    
1046    // read a line, and start parseing out the atom types
1047
1048    if( eof_test == NULL ){
1049      sprintf( painCave.errMsg,
1050               "Error in reading torsions from force file at line %d.\n",
1051               lineNum );
1052      painCave.isFatal = 1;
1053      simError();
1054    }
1055    
1056    // stop reading at end of file, or at next section
1057    while( readLine[0] != '#' && eof_test != NULL ){
1058
1059      // toss comment lines
1060      if( readLine[0] != '!' ){
1061        
1062        // the parser returns 0 if the line was blank
1063        if( parseTorsion( readLine, lineNum, torsionInfo ) ){
1064          headTorsionType->add( torsionInfo );
1065
1066        }
1067      }
1068      eof_test = fgets( readLine, sizeof(readLine), frcFile );
1069      lineNum++;
1070    }
1071
1072 #ifdef IS_MPI
1073    
1074    // send out the linked list to all the other processes
1075    
1076    sprintf( checkPointMsg,
1077             "DUFF torsion structures read successfully." );
1078    MPIcheckPoint();
1079    
1080    currentTorsionType = headTorsionType->next;
1081    while( currentTorsionType != NULL ){
1082      currentTorsionType->duplicate( torsionInfo );
1083      sendFrcStruct( &torsionInfo, mpiTorsionStructType );
1084      currentTorsionType = currentTorsionType->next;
1085    }
1086    torsionInfo.last = 1;
1087    sendFrcStruct( &torsionInfo, mpiTorsionStructType );
1088    
1089  }
1090
1091  else{
1092    
1093    // listen for node 0 to send out the force params
1094    
1095    MPIcheckPoint();
1096
1097    headTorsionType = new LinkedTorsionType;
1098    receiveFrcStruct( &torsionInfo, mpiTorsionStructType );
1099    while( !torsionInfo.last ){
1100
1101      headTorsionType->add( torsionInfo );
1102      receiveFrcStruct( &torsionInfo, mpiTorsionStructType );
1103    }
1104  }
1105
1106  sprintf( checkPointMsg,
1107           "DUFF torsion structures broadcast successfully." );
1108  MPIcheckPoint();
1109
1110 #endif // is_mpi
1111
1112  entry_plug->useLennardJones = 1;
113   }
114  
115 + } //end namespace oopse
116  
1116
1117 void DUFF::initializeAtoms( int nAtoms, Atom** the_atoms ){
1118  
1119  
1120  //////////////////////////////////////////////////
1121  // a quick water fix
1122
1123  double waterI[3][3];
1124  waterI[0][0] = 1.76958347772500;
1125  waterI[0][1] = 0.0;
1126  waterI[0][2] = 0.0;
1127
1128  waterI[1][0] = 0.0;
1129  waterI[1][1] = 0.614537057924513;
1130  waterI[1][2] = 0.0;
1131
1132  waterI[2][0] = 0.0;
1133  waterI[2][1] = 0.0;
1134  waterI[2][2] = 1.15504641980049;
1135
1136
1137  double headI[3][3];
1138  headI[0][0] = 1125;
1139  headI[0][1] = 0.0;
1140  headI[0][2] = 0.0;
1141
1142  headI[1][0] = 0.0;
1143  headI[1][1] = 1125;
1144  headI[1][2] = 0.0;
1145
1146  headI[2][0] = 0.0;
1147  headI[2][1] = 0.0;
1148  headI[2][2] = 250;
1149
1150  //////////////////////////////////////////////////
1151
1152  
1153  // initialize the atoms
1154  
1155  DirectionalAtom* dAtom;
1156  double ji[3];
1157
1158  for(int i=0; i<nAtoms; i++ ){
1159
1160    currentAtomType = headAtomType->find( the_atoms[i]->getType() );
1161    if( currentAtomType == NULL ){
1162      sprintf( painCave.errMsg,
1163               "AtomType error, %s not found in force file.\n",
1164               the_atoms[i]->getType() );
1165      painCave.isFatal = 1;
1166      simError();
1167    }
1168    
1169    the_atoms[i]->setMass( currentAtomType->mass );
1170    the_atoms[i]->setIdent( currentAtomType->ident );
1171
1172    if( bigSigma < currentAtomType->sigma ) bigSigma = currentAtomType->sigma;
1173
1174    if( currentAtomType->isDipole ){
1175      if( the_atoms[i]->isDirectional() ){
1176        
1177        dAtom = (DirectionalAtom *) the_atoms[i];
1178        dAtom->setHasDipole( 1 );
1179
1180        ji[0] = 0.0;
1181        ji[1] = 0.0;
1182        ji[2] = 0.0;
1183
1184        dAtom->setJ( ji );
1185        
1186        if(!strcmp("SSD",the_atoms[i]->getType())){
1187          dAtom->setI( waterI );
1188        }
1189        else if(!strcmp("HEAD",the_atoms[i]->getType())){
1190          dAtom->setI( headI );
1191        }
1192        else{
1193          sprintf(painCave.errMsg,
1194                  "AtmType error, %s does not have a moment of inertia set.\n",
1195                  the_atoms[i]->getType() );
1196          painCave.isFatal = 1;
1197          simError();
1198        }
1199        entry_plug->n_dipoles++;
1200      }
1201      else{
1202        
1203        sprintf( painCave.errMsg,
1204                "DUFF error: Atom \"%s\" is a dipole, yet no standard"
1205                 " orientation was specifed in the meta-data file.\n",
1206                 currentAtomType->name );
1207        painCave.isFatal = 1;
1208        simError();
1209      }
1210    }
1211    else{
1212      if( the_atoms[i]->isDirectional() ){
1213        sprintf( painCave.errMsg,
1214                 "DUFF error: Atom \"%s\" was given a standard "
1215                 "orientation in the meta-data file, yet it is not a dipole.\n",
1216                 currentAtomType->name);
1217        painCave.isFatal = 1;
1218        simError();
1219      }
1220    }
1221  }
1222 }
1223
1224 void DUFF::initializeBonds( int nBonds, Bond** bondArray,
1225                                   bond_pair* the_bonds ){
1226  int i,a,b;
1227  char* atomA;
1228  char* atomB;
1229  
1230  Atom** the_atoms;
1231  the_atoms = entry_plug->atoms;
1232  
1233
1234  // initialize the Bonds
1235  
1236  for( i=0; i<nBonds; i++ ){
1237    
1238    a = the_bonds[i].a;
1239    b = the_bonds[i].b;
1240
1241    atomA = the_atoms[a]->getType();
1242    atomB = the_atoms[b]->getType();
1243    currentBondType = headBondType->find( atomA, atomB );
1244    if( currentBondType == NULL ){
1245      sprintf( painCave.errMsg,
1246               "BondType error, %s - %s not found in force file.\n",
1247               atomA, atomB );
1248      painCave.isFatal = 1;
1249      simError();
1250    }
1251    
1252    switch( currentBondType->type ){
1253
1254    case FIXED_BOND:
1255            
1256      bondArray[i] = new ConstrainedBond( *the_atoms[a],
1257                                          *the_atoms[b],
1258                                          currentBondType->d0 );
1259      entry_plug->n_constraints++;
1260      break;
1261
1262    case HARMONIC_BOND:
1263      
1264      bondArray[i] = new HarmonicBond( *the_atoms[a],
1265                                       *the_atoms[b],
1266                                       currentBondType->d0,
1267                                       currentBondType->k0 );
1268      break;
1269      
1270    default:
1271
1272      break;
1273      // do nothing
1274    }
1275  }
1276 }
1277
1278 void DUFF::initializeBends( int nBends, Bend** bendArray,
1279                                   bend_set* the_bends ){
1280  
1281  QuadraticBend* qBend;
1282  GhostBend* gBend;
1283  Atom** the_atoms;
1284  the_atoms = entry_plug->atoms;
1285  
1286  int i, a, b, c;
1287  char* atomA;
1288  char* atomB;
1289  char* atomC;
1290  
1291  // initialize the Bends
1292
1293  for( i=0; i<nBends; i++ ){
1294    
1295    a = the_bends[i].a;
1296    b = the_bends[i].b;
1297    c = the_bends[i].c;
1298
1299    atomA = the_atoms[a]->getType();
1300    atomB = the_atoms[b]->getType();
1301
1302    if( the_bends[i].isGhost ) atomC = "GHOST";
1303    else atomC = the_atoms[c]->getType();
1304
1305    currentBendType = headBendType->find( atomA, atomB, atomC );
1306    if( currentBendType == NULL ){
1307      sprintf( painCave.errMsg, "BendType error, %s - %s - %s not found"
1308               " in force file.\n",
1309               atomA, atomB, atomC );
1310      painCave.isFatal = 1;
1311      simError();
1312    }
1313    
1314    if( !strcmp( currentBendType->type, "quadratic" ) ){
1315      
1316      if( the_bends[i].isGhost){
1317        
1318        if( the_bends[i].ghost == b ){
1319          // do nothing
1320        }
1321        else if( the_bends[i].ghost == a ){
1322          c = a;
1323          a = b;
1324          b = c;
1325        }
1326        else{
1327          sprintf( painCave.errMsg,
1328                   "BendType error, %s - %s - %s,\n"
1329                   "  --> central atom is not "
1330                   "correctly identified with the "
1331                   "\"ghostVectorSource = \" tag.\n",
1332                   atomA, atomB, atomC );
1333          painCave.isFatal = 1;
1334          simError();
1335        }
1336        
1337        gBend = new GhostBend( *the_atoms[a],
1338                               *the_atoms[b]);
1339                                                                      
1340        gBend->setConstants( currentBendType->k1,
1341                             currentBendType->k2,
1342                             currentBendType->k3,
1343                             currentBendType->t0 );
1344        bendArray[i] = gBend;
1345      }
1346      else{
1347        qBend = new QuadraticBend( *the_atoms[a],
1348                                   *the_atoms[b],
1349                                   *the_atoms[c] );
1350        qBend->setConstants( currentBendType->k1,
1351                             currentBendType->k2,
1352                             currentBendType->k3,
1353                             currentBendType->t0 );
1354        bendArray[i] = qBend;
1355      }      
1356    }
1357  }
1358 }
1359
1360 void DUFF::initializeTorsions( int nTorsions, Torsion** torsionArray,
1361                                      torsion_set* the_torsions ){
1362
1363  int i, a, b, c, d;
1364  char* atomA;
1365  char* atomB;
1366  char* atomC;
1367  char* atomD;
1368
1369  CubicTorsion* cTors;
1370  Atom** the_atoms;
1371  the_atoms = entry_plug->atoms;
1372
1373  // initialize the Torsions
1374
1375  for( i=0; i<nTorsions; i++ ){
1376    
1377    a = the_torsions[i].a;
1378    b = the_torsions[i].b;
1379    c = the_torsions[i].c;
1380    d = the_torsions[i].d;
1381
1382    atomA = the_atoms[a]->getType();
1383    atomB = the_atoms[b]->getType();
1384    atomC = the_atoms[c]->getType();
1385    atomD = the_atoms[d]->getType();
1386    currentTorsionType = headTorsionType->find( atomA, atomB, atomC, atomD );
1387    if( currentTorsionType == NULL ){
1388      sprintf( painCave.errMsg,
1389               "TorsionType error, %s - %s - %s - %s not found"
1390               " in force file.\n",
1391               atomA, atomB, atomC, atomD );
1392      painCave.isFatal = 1;
1393      simError();
1394    }
1395    
1396    if( !strcmp( currentTorsionType->type, "cubic" ) ){
1397      
1398      cTors = new CubicTorsion( *the_atoms[a], *the_atoms[b],
1399                                *the_atoms[c], *the_atoms[d] );
1400      cTors->setConstants( currentTorsionType->k1, currentTorsionType->k2,
1401                           currentTorsionType->k3, currentTorsionType->k4 );
1402      torsionArray[i] = cTors;
1403    }
1404  }
1405 }
1406
1407 void DUFF::fastForward( char* stopText, char* searchOwner ){
1408
1409  int foundText = 0;
1410  char* the_token;
1411
1412  rewind( frcFile );
1413  lineNum = 0;
1414
1415  eof_test = fgets( readLine, sizeof(readLine), frcFile );
1416  lineNum++;
1417  if( eof_test == NULL ){
1418    sprintf( painCave.errMsg, "Error fast forwarding force file for %s: "
1419             " file is empty.\n",
1420             searchOwner );
1421    painCave.isFatal = 1;
1422    simError();
1423  }
1424  
1425  
1426  while( !foundText ){
1427    while( eof_test != NULL && readLine[0] != '#' ){
1428      eof_test = fgets( readLine, sizeof(readLine), frcFile );
1429      lineNum++;
1430    }
1431    if( eof_test == NULL ){
1432      sprintf( painCave.errMsg,
1433               "Error fast forwarding force file for %s at "
1434               "line %d: file ended unexpectedly.\n",
1435               searchOwner,
1436               lineNum );
1437      painCave.isFatal = 1;
1438      simError();
1439    }
1440    
1441    the_token = strtok( readLine, " ,;\t#\n" );
1442    foundText = !strcmp( stopText, the_token );
1443    
1444    if( !foundText ){
1445      eof_test = fgets( readLine, sizeof(readLine), frcFile );
1446      lineNum++;
1447      
1448      if( eof_test == NULL ){
1449        sprintf( painCave.errMsg,
1450                 "Error fast forwarding force file for %s at "
1451                 "line %d: file ended unexpectedly.\n",
1452                 searchOwner,
1453                 lineNum );
1454        painCave.isFatal = 1;
1455        simError();
1456      }
1457    }
1458  }  
1459 }
1460
1461
1462 int DUFF_NS::parseAtom( char *lineBuffer, int lineNum, atomStruct &info ){
1463
1464  char* the_token;
1465  
1466  the_token = strtok( lineBuffer, " \n\t,;" );
1467  if( the_token != NULL ){
1468    
1469    strcpy( info.name, the_token );
1470
1471    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1472      sprintf( painCave.errMsg,
1473               "Error parseing AtomTypes: line %d\n", lineNum );
1474      painCave.isFatal = 1;
1475      simError();
1476    }
1477    
1478    info.isDipole = atoi( the_token );
1479
1480    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1481      sprintf( painCave.errMsg,
1482               "Error parseing AtomTypes: line %d\n", lineNum );
1483      painCave.isFatal = 1;
1484      simError();
1485    }
1486
1487    info.isSSD = atoi( the_token );
1488
1489    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1490      sprintf( painCave.errMsg,
1491               "Error parseing AtomTypes: line %d\n", lineNum );
1492      painCave.isFatal = 1;
1493      simError();
1494    }
1495    
1496    info.mass = atof( the_token );
1497    
1498    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1499      sprintf( painCave.errMsg,
1500               "Error parseing AtomTypes: line %d\n", lineNum );
1501      painCave.isFatal = 1;
1502      simError();
1503    }
1504        
1505    info.epslon = atof( the_token );
1506          
1507    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1508      sprintf( painCave.errMsg,
1509               "Error parseing AtomTypes: line %d\n", lineNum );
1510      painCave.isFatal = 1;
1511      simError();
1512    }
1513        
1514    info.sigma = atof( the_token );
1515
1516    if( info.isDipole ){
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.dipole = atof( the_token );
1526    }
1527    else info.dipole = 0.0;
1528
1529    if( info.isSSD ){
1530
1531      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1532        sprintf( painCave.errMsg,
1533                 "Error parseing AtomTypes: line %d\n", lineNum );
1534        painCave.isFatal = 1;
1535        simError();
1536      }
1537      
1538      info.w0 = atof( the_token );
1539
1540      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1541        sprintf( painCave.errMsg,
1542                 "Error parseing AtomTypes: line %d\n", lineNum );
1543        painCave.isFatal = 1;
1544        simError();
1545      }
1546      
1547      info.v0 = atof( the_token );
1548      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1549        sprintf( painCave.errMsg,
1550                 "Error parseing AtomTypes: line %d\n", lineNum );
1551        painCave.isFatal = 1;
1552        simError();
1553      }
1554      
1555      info.v0p = atof( the_token );
1556
1557      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1558        sprintf( painCave.errMsg,
1559                 "Error parseing AtomTypes: line %d\n", lineNum );
1560        painCave.isFatal = 1;
1561        simError();
1562      }
1563      
1564      info.rl = atof( the_token );
1565
1566      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1567        sprintf( painCave.errMsg,
1568                 "Error parseing AtomTypes: line %d\n", lineNum );
1569        painCave.isFatal = 1;
1570        simError();
1571      }
1572      
1573      info.ru = atof( the_token );
1574
1575      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1576        sprintf( painCave.errMsg,
1577                 "Error parseing AtomTypes: line %d\n", lineNum );
1578        painCave.isFatal = 1;
1579        simError();
1580      }
1581      
1582      info.rlp = atof( the_token );
1583
1584      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1585        sprintf( painCave.errMsg,
1586                 "Error parseing AtomTypes: line %d\n", lineNum );
1587        painCave.isFatal = 1;
1588        simError();
1589      }
1590      
1591      info.rup = atof( the_token );
1592    }
1593    else info.v0 = info.w0 = info.v0p = info.rl = info.ru = info.rlp = info.rup = 0.0;
1594
1595    return 1;
1596  }
1597  else return 0;
1598 }
1599
1600 int DUFF_NS::parseBond( char *lineBuffer, int lineNum, bondStruct &info ){
1601
1602  char* the_token;
1603  char bondType[30];
1604  
1605  the_token = strtok( lineBuffer, " \n\t,;" );
1606  if( the_token != NULL ){
1607    
1608    strcpy( info.nameA, the_token );
1609
1610    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1611      sprintf( painCave.errMsg,
1612               "Error parseing BondTypes: line %d\n", lineNum );
1613      painCave.isFatal = 1;
1614      simError();
1615    }
1616    
1617    strcpy( info.nameB, the_token );
1618
1619    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1620      sprintf( painCave.errMsg,
1621               "Error parseing BondTypes: line %d\n", lineNum );
1622      painCave.isFatal = 1;
1623      simError();
1624    }
1625    
1626    strcpy( bondType, the_token );
1627    
1628    if( !strcmp( bondType, "fixed" ) ){
1629      info.type = FIXED_BOND;
1630      
1631      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1632        sprintf( painCave.errMsg,
1633                 "Error parseing BondTypes: line %d\n", lineNum );
1634        painCave.isFatal = 1;
1635        simError();
1636      }
1637      
1638      info.d0 = atof( the_token );
1639      
1640      info.k0=0.0;
1641    }
1642    else if( !strcmp( bondType, "harmonic" ) ){
1643      info.type = HARMONIC_BOND;
1644      
1645      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1646        sprintf( painCave.errMsg,
1647                 "Error parseing BondTypes: line %d\n", lineNum );
1648        painCave.isFatal = 1;
1649        simError();
1650      }
1651      
1652      info.d0 = atof( the_token );
1653
1654      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1655        sprintf( painCave.errMsg,
1656                 "Error parseing BondTypes: line %d\n", lineNum );
1657        painCave.isFatal = 1;
1658        simError();
1659      }
1660      
1661      info.k0 = atof( the_token );
1662    }
1663
1664    else{
1665      sprintf( painCave.errMsg,
1666               "Unknown DUFF bond type \"%s\" at line %d\n",
1667               bondType,
1668               lineNum );
1669      painCave.isFatal = 1;
1670      simError();
1671    }            
1672    
1673    return 1;
1674  }
1675  else return 0;
1676 }
1677
1678
1679 int DUFF_NS::parseBend( char *lineBuffer, int lineNum, bendStruct &info ){
1680
1681  char* the_token;
1682  
1683  the_token = strtok( lineBuffer, " \n\t,;" );
1684  if( the_token != NULL ){
1685    
1686    strcpy( info.nameA, the_token );
1687
1688    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1689      sprintf( painCave.errMsg,
1690               "Error parseing BendTypes: line %d\n", lineNum );
1691      painCave.isFatal = 1;
1692      simError();
1693    }
1694    
1695    strcpy( info.nameB, the_token );
1696
1697    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1698      sprintf( painCave.errMsg,
1699               "Error parseing BendTypes: line %d\n", lineNum );
1700      painCave.isFatal = 1;
1701      simError();
1702    }
1703    
1704    strcpy( info.nameC, the_token );
1705
1706    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1707      sprintf( painCave.errMsg,
1708               "Error parseing BendTypes: line %d\n", lineNum );
1709      painCave.isFatal = 1;
1710      simError();
1711    }
1712    
1713    strcpy( info.type, the_token );
1714
1715    if( !strcmp( info.type, "quadratic" ) ){
1716      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1717        sprintf( painCave.errMsg,
1718                 "Error parseing BendTypes: line %d\n", lineNum );
1719        painCave.isFatal = 1;
1720        simError();
1721      }
1722        
1723      info.k1 = atof( the_token );
1724      
1725      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1726        sprintf( painCave.errMsg,
1727                 "Error parseing BendTypes: line %d\n", lineNum );
1728        painCave.isFatal = 1;
1729        simError();
1730      }
1731      
1732      info.k2 = atof( the_token );
1733      
1734      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1735        sprintf( painCave.errMsg,
1736                 "Error parseing BendTypes: line %d\n", lineNum );
1737        painCave.isFatal = 1;
1738        simError();
1739      }
1740        
1741      info.k3 = atof( the_token );
1742      
1743      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1744        sprintf( painCave.errMsg,
1745                 "Error parseing BendTypes: line %d\n", lineNum );
1746        painCave.isFatal = 1;
1747        simError();
1748      }
1749      
1750      info.t0 = atof( the_token );
1751    }
1752    
1753    else{
1754      sprintf( painCave.errMsg,
1755               "Unknown DUFF bend type \"%s\" at line %d\n",
1756               info.type,
1757               lineNum );
1758      painCave.isFatal = 1;
1759      simError();
1760    }            
1761        
1762    return 1;
1763  }
1764  else return 0;
1765 }
1766
1767 int DUFF_NS::parseTorsion( char *lineBuffer, int lineNum, torsionStruct &info ){
1768  
1769  char*  the_token;
1770
1771  the_token = strtok( lineBuffer, " \n\t,;" );
1772  if( the_token != NULL ){
1773    
1774    strcpy( info.nameA, the_token );
1775        
1776    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1777      sprintf( painCave.errMsg,
1778               "Error parseing TorsionTypes: line %d\n", lineNum );
1779      painCave.isFatal = 1;
1780      simError();
1781    }
1782    
1783    strcpy( info.nameB, the_token );
1784
1785    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1786      sprintf( painCave.errMsg,
1787               "Error parseing TorsionTypes: line %d\n", lineNum );
1788      painCave.isFatal = 1;
1789      simError();
1790    }
1791    
1792    strcpy( info.nameC, the_token );
1793    
1794    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1795      sprintf( painCave.errMsg,
1796               "Error parseing TorsionTypes: line %d\n", lineNum );
1797      painCave.isFatal = 1;
1798      simError();
1799    }
1800    
1801    strcpy( info.nameD, the_token );
1802    
1803    if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1804      sprintf( painCave.errMsg,
1805               "Error parseing TorsionTypes: line %d\n", lineNum );
1806      painCave.isFatal = 1;
1807      simError();
1808    }
1809    
1810    strcpy( info.type, the_token );
1811    
1812    if( !strcmp( info.type, "cubic" ) ){
1813      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1814        sprintf( painCave.errMsg,
1815                 "Error parseing TorsionTypes: line %d\n", lineNum );
1816        painCave.isFatal = 1;
1817        simError();
1818      }
1819      
1820      info.k1 = atof( the_token );
1821      
1822      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1823        sprintf( painCave.errMsg,
1824                 "Error parseing TorsionTypes: line %d\n", lineNum );
1825        painCave.isFatal = 1;
1826        simError();
1827      }
1828      
1829      info.k2 = atof( the_token );
1830      
1831      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1832        sprintf( painCave.errMsg,
1833                 "Error parseing TorsionTypes: line %d\n", lineNum );
1834        painCave.isFatal = 1;
1835        simError();
1836      }
1837      
1838      info.k3 = atof( the_token );
1839      
1840      if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1841        sprintf( painCave.errMsg,
1842                 "Error parseing TorsionTypes: line %d\n", lineNum );
1843        painCave.isFatal = 1;
1844        simError();
1845      }
1846      
1847      info.k4 = atof( the_token );
1848    
1849    }
1850    
1851    else{
1852      sprintf( painCave.errMsg,
1853               "Unknown DUFF torsion type \"%s\" at line %d\n",
1854               info.type,
1855               lineNum );
1856      painCave.isFatal = 1;
1857      simError();
1858    }            
1859    
1860    return 1;
1861  }
1862  
1863  else return 0;
1864 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines