ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-2.0/src/UseTheForce/Shapes_FF.cpp
(Generate patch)

Comparing trunk/OOPSE-2.0/src/UseTheForce/Shapes_FF.cpp (file contents):
Revision 1672 by gezelter, Thu Oct 28 17:20:22 2004 UTC vs.
Revision 1930 by gezelter, Wed Jan 12 22:41:40 2005 UTC

# Line 1 | Line 1
1 < /*
2 < *  Shapes_FF.cpp
3 < *  oopse
1 > /*
2 > * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3   *
4 < *  Created by Chris Fennell on 10/20/04.
5 < *  Copyright 2004 __MyCompanyName__. All rights reserved.
4 > * The University of Notre Dame grants you ("Licensee") a
5 > * non-exclusive, royalty free, license to use, modify and
6 > * redistribute this software in source and binary code form, provided
7 > * that the following conditions are met:
8   *
9 + * 1. Acknowledgement of the program authors must be made in any
10 + *    publication of scientific results based in part on use of the
11 + *    program.  An acceptable form of acknowledgement is citation of
12 + *    the article in which the program was described (Matthew
13 + *    A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher
14 + *    J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented
15 + *    Parallel Simulation Engine for Molecular Dynamics,"
16 + *    J. Comput. Chem. 26, pp. 252-271 (2005))
17 + *
18 + * 2. Redistributions of source code must retain the above copyright
19 + *    notice, this list of conditions and the following disclaimer.
20 + *
21 + * 3. Redistributions in binary form must reproduce the above copyright
22 + *    notice, this list of conditions and the following disclaimer in the
23 + *    documentation and/or other materials provided with the
24 + *    distribution.
25 + *
26 + * This software is provided "AS IS," without a warranty of any
27 + * kind. All express or implied conditions, representations and
28 + * warranties, including any implied warranty of merchantability,
29 + * fitness for a particular purpose or non-infringement, are hereby
30 + * excluded.  The University of Notre Dame and its licensors shall not
31 + * be liable for any damages suffered by licensee as a result of
32 + * using, modifying or distributing the software or its
33 + * derivatives. In no event will the University of Notre Dame or its
34 + * licensors be liable for any lost revenue, profit or data, or for
35 + * direct, indirect, special, consequential, incidental or punitive
36 + * damages, however caused and regardless of the theory of liability,
37 + * arising out of the use of or inability to use software, even if the
38 + * University of Notre Dame has been advised of the possibility of
39 + * such damages.
40   */
41 <
41 >
42   #include <stdlib.h>
43   #include <stdio.h>
44   #include <string.h>
# Line 33 | Line 65 | using namespace std;
65   #include "UseTheForce/mpiForceField.h"
66   #endif // is_mpi
67  
68 < using namespace std;
68 >
69   using namespace oopse;
70  
71   Shapes_FF::~Shapes_FF(){
# Line 53 | Line 85 | void Shapes_FF::calcRcut( void ){
85   void Shapes_FF::calcRcut( void ){
86    
87   #ifdef IS_MPI
88 <  double tempShapesRcut = shapesRcut;
88 >  double tempShapesRcut = bigContact;
89    MPI_Allreduce( &tempShapesRcut, &shapesRcut, 1, MPI_DOUBLE, MPI_MAX,
90                   MPI_COMM_WORLD);
91 + #else
92 +  shapesRcut = bigContact;
93   #endif  //is_mpi
94    entry_plug->setDefaultRcut(shapesRcut);
95   }
# Line 70 | Line 104 | void Shapes_FF::readParams( void ){
104  
105    char readLine[1024];
106  
107 <  string fileName;
108 <  string shapeFileName;
109 <  string tempString;
107 >   std::string fileName;
108 >   std::string shapeFileName;
109 >   std::string tempString;
110  
111    char *nameToken;
112    char *delim = " ,;\t\n";
# Line 82 | Line 116 | void Shapes_FF::readParams( void ){
116    int nStrength = 0;
117    int myATID;
118    int isError;
119 <  string nameString;
119 >   std::string nameString;
120    AtomType* at;
121    DirectionalAtomType* dat;
122    ShapeAtomType* st;
123  
124 <  map<string, AtomType*>::iterator iter;
124 >   std::map<string, AtomType*>::iterator iter;
125  
126    // vectors for shape transfer to fortran
127 <  vector<RealSphericalHarmonic*> tempSHVector;
128 <  vector<int> contactL;
129 <  vector<int> contactM;
130 <  vector<int> contactFunc;
131 <  vector<double> contactCoeff;
132 <  vector<int> rangeL;
133 <  vector<int> rangeM;
134 <  vector<int> rangeFunc;
135 <  vector<double> rangeCoeff;
136 <  vector<int> strengthL;
137 <  vector<int> strengthM;
138 <  vector<int> strengthFunc;
139 <  vector<double> strengthCoeff;
127 >   std::vector<RealSphericalHarmonic*> tempSHVector;
128 >   std::vector<int> contactL;
129 >   std::vector<int> contactM;
130 >   std::vector<int> contactFunc;
131 >   std::vector<double> contactCoeff;
132 >   std::vector<int> rangeL;
133 >   std::vector<int> rangeM;
134 >   std::vector<int> rangeFunc;
135 >   std::vector<double> rangeCoeff;
136 >   std::vector<int> strengthL;
137 >   std::vector<int> strengthM;
138 >   std::vector<int> strengthFunc;
139 >   std::vector<double> strengthCoeff;
140    
141    // generate the force file name  
142    fileName = "Shapes.frc";
# Line 170 | Line 204 | void Shapes_FF::readParams( void ){
204            st = new ShapeAtomType();
205  
206            st->setName(nameString);
207 <          myATID = atomTypeMap.size();
207 >          myATID = atomTypeMap.size() + 1;
208            st->setIdent(myATID);
209            parseShapeFile(shapeFileName, st);
210            st->complete();
211            atomTypeMap.insert(make_pair(nameString, st));
212            
213          } else {
214 <          // atomType map already contained this string (i.e. it was
214 >          // atomType map already contained this  std::string (i.e. it was
215            // declared in a previous block, and we just need to add
216            // the shape-specific information for this AtomType:
217  
# Line 257 | Line 291 | void Shapes_FF::readParams( void ){
291          
292          isError = 0;
293          myATID = at->getIdent();
294 +
295          makeShape( &nContact, &contactL[0], &contactM[0], &contactFunc[0],
296                     &contactCoeff[0],
297                     &nRange, &rangeL[0], &rangeM[0], &rangeFunc[0],
# Line 265 | Line 300 | void Shapes_FF::readParams( void ){
300                     &strengthFunc[0], &strengthCoeff[0],
301                     &myATID,
302                     &isError);
303 +
304          if( isError ){
305            sprintf( painCave.errMsg,
306                     "Error initializing the \"%s\" shape in fortran\n",
# Line 276 | Line 312 | void Shapes_FF::readParams( void ){
312      }
313    }
314    
315 +  isError = 0;
316 +  completeShapeFF(&isError);
317 +  if( isError ){
318 +    sprintf( painCave.errMsg,
319 +             "Error completing Shape FF in fortran\n");
320 +    painCave.isFatal = 1;
321 +    simError();
322 +  }
323 +  
324   #ifdef IS_MPI
325    sprintf( checkPointMsg,
326             "Shapes_FF atom structures successfully sent to fortran\n" );
# Line 291 | Line 336 | void Shapes_FF::initializeAtoms( int nAtoms, Atom** th
336   void Shapes_FF::initializeAtoms( int nAtoms, Atom** the_atoms ){
337    
338    int i,j,k;
339 <  map<string, AtomType*>::iterator iter;
339 >   std::map<string, AtomType*>::iterator iter;
340  
341    // initialize the atoms
342    DirectionalAtom* dAtom;
343    AtomType* at;
344    DirectionalAtomType* dat;
345    ShapeAtomType* sat;
346 <  double sigma;
346 >  double longCutoff;
347    double ji[3];
348    double inertialMat[3][3];
349    Mat3x3d momInt;
350 <  string myTypeString;
350 >   std::string myTypeString;
351  
352 +  bigContact = 0.0;
353 +
354    for( i=0; i<nAtoms; i++ ){
355      
356 <    myTypeString = the_atoms[i]->getType();
356 >    myTypeString = the_atoms[i]->getType().c_str();
357      iter = atomTypeMap.find(myTypeString);
358  
359      if (iter == atomTypeMap.end()) {
360        sprintf( painCave.errMsg,
361                 "AtomType error, %s not found in force file.\n",
362 <               the_atoms[i]->getType() );
362 >               the_atoms[i]->getType().c_str() );
363        painCave.isFatal = 1;
364        simError();
365      } else {
# Line 325 | Line 372 | void Shapes_FF::initializeAtoms( int nAtoms, Atom** th
372        if ( at->isShape() ) {
373          
374          sat = (ShapeAtomType*)at;
375 <        sigma = findLargestContactDistance(sat);
376 <        if (sigma > bigSigma) bigSigma = sigma;
377 <
375 >        longCutoff = findCutoffDistance(sat);
376 >        if (longCutoff > bigContact) bigContact = longCutoff;  
377 >        cout << bigContact << " is the cutoff value\n";
378 >        
379 >        entry_plug->useShapes = 1;
380        }
381  
382        the_atoms[i]->setHasCharge(at->isCharge());
# Line 400 | Line 449 | void Shapes_FF::parseShapeFile(string shapeFileName, S
449    int nTokens;
450    Mat3x3d momInert;
451    RealSphericalHarmonic* rsh;
452 <  vector<RealSphericalHarmonic*> functionVector;
452 >   std::vector<RealSphericalHarmonic*> functionVector;
453    ifstrstream shapeFile;
454 <  string tempString;
454 >   std::string tempString;
455  
456    shapeFile.open( shapeFileName.c_str() );
457    
# Line 450 | Line 499 | void Shapes_FF::parseShapeFile(string shapeFileName, S
499            painCave.severity = OOPSE_ERROR;
500            painCave.isFatal = 1;
501            simError();
502 <
502 >        } else {
503            token = strtok(inLine, delim);
504            token = strtok(NULL, delim);
505            st->setMass(atof(token));
# Line 477 | Line 526 | void Shapes_FF::parseShapeFile(string shapeFileName, S
526      if( inLine[0] != '!' && inLine[0] != '#' ){
527        // end marks section completion
528        if (isEndLine(inLine)) break;
480      
529        nTokens = countTokens(inLine, delim);
530        if (nTokens != 0) {
531          if (nTokens < 4) {
# Line 487 | Line 535 | void Shapes_FF::parseShapeFile(string shapeFileName, S
535            painCave.severity = OOPSE_ERROR;
536            painCave.isFatal = 1;
537            simError();
538 <          
538 >        } else {
539            // read in a spherical harmonic function
540            token = strtok(inLine, delim);
541            rsh = new RealSphericalHarmonic();
# Line 510 | Line 558 | void Shapes_FF::parseShapeFile(string shapeFileName, S
558    }
559  
560    // pass contact functions to ShapeType
561 +
562    st->setContactFuncs(functionVector);
563  
564    // now grab the range functions
# Line 532 | Line 581 | void Shapes_FF::parseShapeFile(string shapeFileName, S
581            painCave.severity = OOPSE_ERROR;
582            painCave.isFatal = 1;
583            simError();
584 +        } else {
585            
586            // read in a spherical harmonic function
587            token = strtok(inLine, delim);
# Line 578 | Line 628 | void Shapes_FF::parseShapeFile(string shapeFileName, S
628            painCave.severity = OOPSE_ERROR;
629            painCave.isFatal = 1;
630            simError();
631 +        } else {
632            
633            // read in a spherical harmonic function
634            token = strtok(inLine, delim);
# Line 611 | Line 662 | double Shapes_FF::findLargestContactDistance(ShapeAtom
662    int i, j,  nSteps;
663    double theta, thetaStep, thetaMin, costheta;
664    double phi, phiStep;
665 <  double sigma, bigSigma;
665 >  double sigma, bs;
666 >  
667 >  nSteps = 16;
668 >
669 >  thetaStep = M_PI / nSteps;
670 >  thetaMin = thetaStep / 2.0;
671 >  phiStep = thetaStep * 2.0;
672 >  bs = 0.0;
673 >  
674 >  for (i = 0; i < nSteps; i++) {
675 >    
676 >    theta = thetaMin + i * thetaStep;
677 >    costheta = cos(theta);
678  
679 +    for (j = 0; j < nSteps; j++) {
680 +
681 +      phi = j*phiStep;
682 +
683 +      sigma = st->getContactValueAt(costheta, phi);
684 +      
685 +      if (sigma > bs) bs = sigma;
686 +    }
687 +  }
688 +
689 +  return bs;  
690 + }
691 +
692 +
693 + double Shapes_FF::findCutoffDistance(ShapeAtomType* st) {
694 +  int i, j,  nSteps;
695 +  double theta, thetaStep, thetaMin, costheta;
696 +  double phi, phiStep;
697 +  double sigma, range;
698 +  double bigCut, tempCut;
699 +
700    nSteps = 16;
701  
702    thetaStep = M_PI / nSteps;
703    thetaMin = thetaStep / 2.0;
704    phiStep = thetaStep * 2.0;
705 <  bigSigma = 0.0;
705 >  bigCut = 0.0;
706    
707    for (i = 0; i < nSteps; i++) {
708      
# Line 630 | Line 714 | double Shapes_FF::findLargestContactDistance(ShapeAtom
714        phi = j*phiStep;
715  
716        sigma = st->getContactValueAt(costheta, phi);
717 <      
718 <      if (sigma > bigSigma) bigSigma = sigma;
717 >      range = st->getRangeValueAt(costheta, phi);
718 >
719 >       // cutoff for a shape is taken to be (2.5*rangeVal + contactVal)
720 >      tempCut = 1.5*range + sigma;
721 >
722 >      if (tempCut > bigCut) bigCut = tempCut;
723      }
724    }
725 <
726 <  return bigSigma;  
725 >
726 >  return bigCut;  
727   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines