ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/EAM_FF.cpp
(Generate patch)

Comparing trunk/OOPSE/libmdtools/EAM_FF.cpp (file contents):
Revision 657 by chuckv, Wed Jul 30 21:17:01 2003 UTC vs.
Revision 1261 by gezelter, Fri Jun 11 14:14:10 2004 UTC

# Line 1 | Line 1
1 < #include <cstdlib>
2 < #include <cstdio>
3 < #include <cstring>
1 > #include <stdlib.h>
2 > #include <stdio.h>
3 > #include <string.h>
4  
5   #include <iostream>
6   using namespace std;
# Line 30 | Line 30 | namespace EAM_NS{
30      double mass;
31      double lattice_constant;
32      double eam_drho;  // The distance between each of the points indexed by rho.
33 +    double eam_rcut;  // The cutoff radius for eam.
34      double eam_dr;    // The distance between each of the rho points.    
35      int eam_nrho;  // Number of points indexed by rho
36      int eam_nr;    // The number of points based on r (Both Phi(r) and Rho(r)).
36    double eam_rcut;  // The cutoff radius for eam.
37      int eam_ident; // Atomic number
38      int ident;
39      int last;      //  0  -> default
# Line 76 | Line 76 | namespace EAM_NS{
76      void add( atomStruct &info, double *the_eam_rvals,
77                double *the_eam_rhovals,double *the_eam_Frhovals ){
78  
79      int i;
80
79        // check for duplicates
80        
81        if( !strcmp( info.name, name ) ){
82          sprintf( painCave.errMsg,
83 <                 "Duplicate LJ atom type \"%s\" found in "
84 <                 "the LJ_FF param file./n",
83 >                 "Duplicate EAM atom type \"%s\" found in "
84 >                 "the EAM_FF param file./n",
85                   name );
86          painCave.isFatal = 1;
87          simError();
# Line 157 | Line 155 | using namespace EAM_NS;
155   // begins the actual forcefield stuff.  
156   //****************************************************************
157  
158 + EAM_FF::EAM_FF() {
159 +  EAM_FF("");
160 + }
161  
162 < EAM_FF::EAM_FF(){
162 > EAM_FF::EAM_FF(char* the_variant){
163  
164    char fileName[200];
165    char* ffPath_env = "FORCE_PARAM_PATH";
166    char* ffPath;
167    char temp[200];
167  char errMsg[1000];
168  
169    headAtomType = NULL;
170    currentAtomType = NULL;
171  
172 +  // Set eamRcut to 0.0
173 +  eamRcut = 0.0;
174 +
175    // do the funtion wrapping
176    wrapMeFF( this );
177  
# Line 179 | Line 182 | EAM_FF::EAM_FF(){
182    // Init the atomStruct mpi type
183  
184    atomStruct atomProto; // mpiPrototype
185 <  int atomBC[3] = {15,4,6};  // block counts
185 >  int atomBC[3] = {15,5,5};  // block counts
186    MPI_Aint atomDspls[3];           // displacements
187    MPI_Datatype atomMbrTypes[3];    // member mpi types
188  
# Line 201 | Line 204 | EAM_FF::EAM_FF(){
204    if( worldRank == 0 ){
205   #endif
206      
207 <    // generate the force file name
207 >    // generate the force file name  
208 >
209 >    strcpy( fileName, "EAM" );
210 >
211 >    if (strlen(the_variant) > 0) {
212 >      has_variant = 1;
213 >      strcpy( variant, the_variant);
214 >      strcat( fileName, ".");
215 >      strcat( fileName, variant );
216 >
217 >      sprintf( painCave.errMsg,
218 >               "Using %s variant of EAM force field.\n",
219 >               variant );
220 >      painCave.severity = OOPSE_INFO;
221 >      painCave.isFatal = 0;
222 >      simError();
223 >    }
224 >    strcat( fileName, ".frc");
225 >
226 >    //fprintf( stderr,"Trying to open %s\n", fileName );
227      
206    strcpy( fileName, "EAM_FF.frc" );
207    //    fprintf( stderr,"Trying to open %s\n", fileName );
208    
228      // attempt to open the file in the current directory first.
229      
230      frcFile = fopen( fileName, "r" );
# Line 228 | Line 247 | EAM_FF::EAM_FF(){
247        frcFile = fopen( fileName, "r" );
248        
249        if( frcFile == NULL ){
250 <        
250 >        
251          sprintf( painCave.errMsg,
252 <                 "Error opening the force field parameter file: %s\n"
253 <                 "Have you tried setting the FORCE_PARAM_PATH environment "
254 <                 "vairable?\n",
252 >                 "Error opening the force field parameter file:\n"
253 >                 "\t%s\n"
254 >                 "\tHave you tried setting the FORCE_PARAM_PATH environment "
255 >                 "variable?\n",
256                   fileName );
257 +        painCave.severity = OOPSE_ERROR;
258          painCave.isFatal = 1;
259          simError();
260        }
261      }
262 +
263      
264   #ifdef IS_MPI
265    }
# Line 266 | Line 288 | void EAM_FF::calcRcut( void ){
288  
289  
290   void EAM_FF::calcRcut( void ){
291 <  double tempEamRcut;
292 <
293 <  entry_plug->setRcut(eamRcut);
291 >  
292 > #ifdef IS_MPI
293 >  double tempEamRcut = eamRcut;
294 >  MPI_Allreduce( &tempEamRcut, &eamRcut, 1, MPI_DOUBLE, MPI_MAX,
295 >                 MPI_COMM_WORLD);
296 > #endif  //is_mpi
297 >  entry_plug->setDefaultRcut(eamRcut);
298   }
299  
300  
# Line 298 | Line 324 | void EAM_FF::readParams( void ){
324    info.last = 1; // initialize last to have the last set.
325                   // if things go well, last will be set to 0
326  
301  int i;
327    int identNum;
328    double *eam_rvals;    // Z of r values
329    double *eam_rhovals;  // rho of r values
# Line 314 | Line 339 | void EAM_FF::readParams( void ){
339      // read in the atom types.
340  
341      headAtomType = new LinkedAtomType;
342 <    
342 >
343      fastForward( "AtomTypes", "eam atom readParams" );
344  
345      // we are now at the AtomTypes section.
# Line 404 | Line 429 | void EAM_FF::readParams( void ){
429      MPIcheckPoint();
430  
431      headAtomType = new LinkedAtomType;
432 <    recieveFrcStruct( &info, mpiAtomStructType );
432 >    receiveFrcStruct( &info, mpiAtomStructType );
433  
434      while( !info.last ){
435        
# Line 430 | Line 455 | void EAM_FF::readParams( void ){
455        
456        MPIcheckPoint();
457  
458 <      recieveFrcStruct( &info, mpiAtomStructType );
458 >      receiveFrcStruct( &info, mpiAtomStructType );
459  
460  
461      }
# Line 446 | Line 471 | void EAM_FF::readParams( void ){
471    int isDipole = 0;
472    int isSSD = 0;
473    int isGB = 0;
474 <  int isEAM= 1;
474 >  int isEAM = 1;
475 >  int isCharge = 0;
476    double dipole = 0.0;
477 +  double charge = 0.0;
478    double eamSigma = 0.0;
479    double eamEpslon = 0.0;
480    
# Line 462 | Line 489 | void EAM_FF::readParams( void ){
489                   &isDipole,
490                   &isGB,
491                   &isEAM,
492 +                 &isCharge,
493                   &eamEpslon,
494                   &eamSigma,
495 +                 &charge,
496                   &dipole,
497                   &isError );
498        if( isError ){
# Line 478 | Line 507 | void EAM_FF::readParams( void ){
507    }
508        
509    entry_plug->useLJ = 0;
510 <
510 >  entry_plug->useEAM = 1;
511    // Walk down again and send out EAM type
512    currentAtomType = headAtomType->next;
513    while( currentAtomType != NULL ){
514      
515      if( currentAtomType->name[0] != '\0' ){
516        isError = 0;
517 <      cerr << "Calling newEAMtype for type "<<currentAtomType->eam_ident <<"\n";
517 >
518        newEAMtype( &(currentAtomType->lattice_constant),
519                    &(currentAtomType->eam_nrho),
520                    &(currentAtomType->eam_drho),
# Line 497 | Line 526 | void EAM_FF::readParams( void ){
526                    currentAtomType->eam_Frhovals,
527                    &(currentAtomType->eam_ident),
528                    &isError);
529 <      cerr << "Returned from newEAMtype\n";
529 >
530        if( isError ){
531          sprintf( painCave.errMsg,
532                   "Error initializing the \"%s\" atom type in fortran EAM\n",
# Line 517 | Line 546 | void EAM_FF::readParams( void ){
546    MPIcheckPoint();
547   #endif // is_mpi
548  
520  cerr << "Done sending eamtypes to fortran\n";
549  
550 +
551   }
552  
553  
554   void EAM_FF::initializeAtoms( int nAtoms, Atom** the_atoms ){
555    
556    int i;
557 <
557 >  
558    // initialize the atoms
559    
531
532  Atom* thisAtom;
533
560    for( i=0; i<nAtoms; i++ ){
561      
562      currentAtomType = headAtomType->find( the_atoms[i]->getType() );
# Line 544 | Line 570 | void EAM_FF::initializeAtoms( int nAtoms, Atom** the_a
570      
571      the_atoms[i]->setMass( currentAtomType->mass );
572      the_atoms[i]->setIdent( currentAtomType->ident );
547    the_atoms[i]->setEAM();
573  
574 +    if (eamRcut < currentAtomType->eam_rcut) eamRcut = currentAtomType->eam_rcut;
575 +    
576    }
577   }
578  
# Line 722 | Line 749 | int EAM_NS::parseEAM(atomStruct &info, char *eamPotFil
749        sprintf( painCave.errMsg,
750                 "Error opening the EAM force parameter file: %s\n"
751                 "Have you tried setting the FORCE_PARAM_PATH environment "
752 <               "vairable?\n",
752 >               "variable?\n",
753                 eamPotFile );
754        painCave.isFatal = 1;
755        simError();
# Line 1013 | Line 1040 | int EAM_NS::parseEAM(atomStruct &info, char *eamPotFil
1040      myEam_rhovals[j+0] = atof( the_token );
1041  
1042      // Value 2
1043 <    if ( (the_token = strtok( eam_read_buffer, " \n\t,;")) == NULL){
1043 >    if ( (the_token = strtok( NULL, " \n\t,;")) == NULL){
1044        sprintf( painCave.errMsg,
1045                 "Error parseing EAM nrho: line in %s\n", eamPotFile );
1046        painCave.isFatal = 1;
# Line 1023 | Line 1050 | int EAM_NS::parseEAM(atomStruct &info, char *eamPotFil
1050      myEam_rhovals[j+1] = atof( the_token );
1051  
1052      // Value 3
1053 <    if ( (the_token = strtok( eam_read_buffer, " \n\t,;")) == NULL){
1053 >    if ( (the_token = strtok( NULL, " \n\t,;")) == NULL){
1054        sprintf( painCave.errMsg,
1055                 "Error parseing EAM nrho: line in %s\n", eamPotFile );
1056        painCave.isFatal = 1;
# Line 1033 | Line 1060 | int EAM_NS::parseEAM(atomStruct &info, char *eamPotFil
1060      myEam_rhovals[j+2] = atof( the_token );
1061  
1062      // Value 4
1063 <    if ( (the_token = strtok( eam_read_buffer, " \n\t,;")) == NULL){
1063 >    if ( (the_token = strtok( NULL, " \n\t,;")) == NULL){
1064        sprintf( painCave.errMsg,
1065                 "Error parseing EAM nrho: line in %s\n", eamPotFile );
1066        painCave.isFatal = 1;
# Line 1043 | Line 1070 | int EAM_NS::parseEAM(atomStruct &info, char *eamPotFil
1070      myEam_rhovals[j+3] = atof( the_token );
1071  
1072      // Value 5
1073 <    if ( (the_token = strtok( eam_read_buffer, " \n\t,;")) == NULL){
1073 >    if ( (the_token = strtok( NULL, " \n\t,;")) == NULL){
1074        sprintf( painCave.errMsg,
1075                 "Error parseing EAM nrho: line in %s\n", eamPotFile );
1076        painCave.isFatal = 1;
# Line 1051 | Line 1078 | int EAM_NS::parseEAM(atomStruct &info, char *eamPotFil
1078      }
1079    
1080      myEam_rhovals[j+4] = atof( the_token );
1081 <
1081 >
1082    }
1083    *eam_rvals = myEam_rvals;
1084    *eam_rhovals = myEam_rhovals;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines