# | 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; |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |