ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/UseTheForce/EAM_FF.cpp
Revision: 1656
Committed: Wed Oct 27 03:00:51 2004 UTC (19 years, 8 months ago) by gezelter
File size: 25992 byte(s)
Log Message:
bug fix

File Contents

# User Rev Content
1 gezelter 1490 #include <stdlib.h>
2     #include <stdio.h>
3     #include <string.h>
4    
5     #include <iostream>
6     using namespace std;
7    
8     #ifdef IS_MPI
9     #include <mpi.h>
10     #endif //is_mpi
11    
12 tim 1492 #include "UseTheForce/ForceFields.hpp"
13     #include "primitives/SRI.hpp"
14     #include "utils/simError.h"
15 gezelter 1634 #include "types/AtomType.hpp"
16     #include "UseTheForce/DarkSide/eam_interface.h"
17 gezelter 1490
18 chuckv 1617 //#include "UseTheForce/fortranWrappers.hpp"
19 gezelter 1490
20     #ifdef IS_MPI
21 tim 1492 #include "UseTheForce/mpiForceField.h"
22 gezelter 1490 #endif // is_mpi
23    
24    
25    
26     namespace EAM_NS{
27    
28     // Declare the structures that will be passed by the parser and MPI
29    
30     typedef struct{
31     char name[15];
32     double mass;
33     double lattice_constant;
34     double eam_drho; // The distance between each of the points indexed by rho.
35     double eam_rcut; // The cutoff radius for eam.
36     double eam_dr; // The distance between each of the rho points.
37     int eam_nrho; // Number of points indexed by rho
38     int eam_nr; // The number of points based on r (Both Phi(r) and Rho(r)).
39     int eam_ident; // Atomic number
40     int ident;
41     int last; // 0 -> default
42     // 1 -> in MPI: tells nodes to stop listening
43     } atomStruct;
44    
45 gezelter 1654 int parseAtom( char *lineBuffer, int lineNum, atomStruct &info, string eamPotFile );
46 gezelter 1656 int parseEAM( atomStruct &info, string ffPath, string eamPotFile,
47     double **eam_rvals, double **eam_rhovals,
48     double **eam_Frhovals);
49 gezelter 1490 #ifdef IS_MPI
50    
51     MPI_Datatype mpiAtomStructType;
52    
53     #endif
54    
55     class LinkedAtomType {
56     public:
57     LinkedAtomType(){
58     next = NULL;
59     name[0] = '\0';
60     eam_rvals = NULL;
61     eam_rhovals = NULL;
62     eam_Frhovals = NULL;
63     }
64    
65     ~LinkedAtomType(){
66     if( next != NULL ) delete next;
67     if( eam_rvals != NULL ) delete[] eam_rvals;
68     if( eam_rhovals != NULL ) delete[] eam_rhovals;
69     if( eam_Frhovals != NULL ) delete[] eam_Frhovals;
70     }
71    
72     LinkedAtomType* find(char* key){
73     if( !strcmp(name, key) ) return this;
74     if( next != NULL ) return next->find(key);
75     return NULL;
76     }
77    
78    
79     void add( atomStruct &info, double *the_eam_rvals,
80     double *the_eam_rhovals,double *the_eam_Frhovals ){
81    
82     // check for duplicates
83    
84     if( !strcmp( info.name, name ) ){
85     sprintf( painCave.errMsg,
86     "Duplicate EAM atom type \"%s\" found in "
87     "the EAM_FF param file./n",
88     name );
89     painCave.isFatal = 1;
90     simError();
91     }
92    
93     if( next != NULL ) next->add(info, the_eam_rvals, the_eam_rhovals, the_eam_Frhovals);
94     else{
95     next = new LinkedAtomType();
96     strcpy(next->name, info.name);
97     next->mass = info.mass;
98     next->lattice_constant = info.lattice_constant;
99     next->eam_nrho = info.eam_nrho;
100     next->eam_drho = info.eam_drho;
101     next->eam_nr = info.eam_nr;
102     next->eam_dr = info.eam_dr;
103     next->eam_rcut = info.eam_rcut;
104     next->eam_ident = info.eam_ident;
105     next->ident = info.ident;
106    
107     next->eam_rvals = the_eam_rvals;
108     next->eam_rhovals = the_eam_rhovals;
109     next->eam_Frhovals = the_eam_Frhovals;
110     }
111     }
112    
113    
114     #ifdef IS_MPI
115    
116     void duplicate( atomStruct &info ){
117     strcpy(info.name, name);
118     info.mass = mass;
119     info.lattice_constant = lattice_constant;
120     info.eam_nrho = eam_nrho;
121     info.eam_drho = eam_drho;
122     info.eam_nr = eam_nr;
123     info.eam_dr = eam_dr;
124     info.eam_rcut = eam_rcut;
125     info.eam_ident = eam_ident;
126     info.ident = ident;
127     info.last = 0;
128     }
129    
130    
131     #endif
132    
133     char name[15];
134     double mass;
135     double lattice_constant;
136     int eam_nrho; // Number of points indexed by rho
137     double eam_drho; // The distance between each of the points indexed by rho.
138     int eam_nr; // The number of points based on r (Both Phi(r) and Rho(r)).
139     double eam_dr; // The distance between each of the rho points.
140     double eam_rcut; // The cutoff radius for eam.
141    
142     double *eam_rvals; // Z of r values
143     double *eam_rhovals; // rho of r values
144     double *eam_Frhovals; // F of rho values
145     int eam_ident; // eam identity (atomic number)
146     int ident;
147     LinkedAtomType* next;
148     };
149    
150     LinkedAtomType* headAtomType;
151     LinkedAtomType* currentAtomType;
152    
153     }
154    
155     using namespace EAM_NS;
156    
157     //****************************************************************
158     // begins the actual forcefield stuff.
159     //****************************************************************
160    
161     EAM_FF::EAM_FF() {
162     EAM_FF("");
163     }
164    
165 gezelter 1653 EAM_FF::EAM_FF(string the_variant){
166 gezelter 1490
167 gezelter 1653 string fileName;
168     string tempString;
169 gezelter 1490
170     headAtomType = NULL;
171     currentAtomType = NULL;
172    
173     // Set eamRcut to 0.0
174     eamRcut = 0.0;
175    
176     #ifdef IS_MPI
177     int i;
178    
179     // **********************************************************************
180     // Init the atomStruct mpi type
181    
182     atomStruct atomProto; // mpiPrototype
183     int atomBC[3] = {15,5,5}; // block counts
184     MPI_Aint atomDspls[3]; // displacements
185     MPI_Datatype atomMbrTypes[3]; // member mpi types
186    
187     MPI_Address(&atomProto.name, &atomDspls[0]);
188     MPI_Address(&atomProto.mass, &atomDspls[1]);
189     MPI_Address(&atomProto.eam_nrho, &atomDspls[2]);
190    
191     atomMbrTypes[0] = MPI_CHAR;
192     atomMbrTypes[1] = MPI_DOUBLE;
193     atomMbrTypes[2] = MPI_INT;
194    
195     for (i=2; i >= 0; i--) atomDspls[i] -= atomDspls[0];
196    
197     MPI_Type_struct(3, atomBC, atomDspls, atomMbrTypes, &mpiAtomStructType);
198     MPI_Type_commit(&mpiAtomStructType);
199    
200     // ***********************************************************************
201    
202     if( worldRank == 0 ){
203     #endif
204    
205     // generate the force file name
206    
207 gezelter 1653 fileName = "EAM";
208 gezelter 1490
209 gezelter 1653 if (!the_variant.empty()) {
210 gezelter 1490 has_variant = 1;
211 gezelter 1654 fileName += "." + the_variant;
212 gezelter 1653
213 gezelter 1490 sprintf( painCave.errMsg,
214     "Using %s variant of EAM force field.\n",
215 gezelter 1653 the_variant.c_str() );
216 gezelter 1490 painCave.severity = OOPSE_INFO;
217     painCave.isFatal = 0;
218     simError();
219 gezelter 1653 }
220 gezelter 1490
221 gezelter 1654 fileName += ".frc";
222    
223 gezelter 1490 //fprintf( stderr,"Trying to open %s\n", fileName );
224    
225     // attempt to open the file in the current directory first.
226    
227 gezelter 1653 frcFile = fopen( fileName.c_str(), "r" );
228 gezelter 1490
229     if( frcFile == NULL ){
230    
231     // next see if the force path enviorment variable is set
232    
233 gezelter 1653 tempString = ffPath + "/" + fileName;
234     fileName = tempString;
235    
236     frcFile = fopen( fileName.c_str(), "r" );
237 gezelter 1490
238     if( frcFile == NULL ){
239    
240     sprintf( painCave.errMsg,
241     "Error opening the force field parameter file:\n"
242     "\t%s\n"
243     "\tHave you tried setting the FORCE_PARAM_PATH environment "
244     "variable?\n",
245 gezelter 1653 fileName.c_str() );
246 gezelter 1490 painCave.severity = OOPSE_ERROR;
247     painCave.isFatal = 1;
248     simError();
249     }
250     }
251    
252    
253     #ifdef IS_MPI
254     }
255    
256     sprintf( checkPointMsg, "EAM_FF file opened sucessfully." );
257     MPIcheckPoint();
258    
259     #endif // is_mpi
260     }
261    
262    
263     EAM_FF::~EAM_FF(){
264    
265     if( headAtomType != NULL ) delete headAtomType;
266    
267     #ifdef IS_MPI
268     if( worldRank == 0 ){
269     #endif // is_mpi
270    
271     fclose( frcFile );
272    
273     #ifdef IS_MPI
274     }
275     #endif // is_mpi
276     }
277    
278    
279     void EAM_FF::calcRcut( void ){
280    
281     #ifdef IS_MPI
282     double tempEamRcut = eamRcut;
283     MPI_Allreduce( &tempEamRcut, &eamRcut, 1, MPI_DOUBLE, MPI_MAX,
284     MPI_COMM_WORLD);
285     #endif //is_mpi
286     entry_plug->setDefaultRcut(eamRcut);
287     }
288    
289    
290 gezelter 1628 void EAM_FF::initForceField( ){
291     initFortran(0);
292 gezelter 1490 }
293    
294     void EAM_FF::cleanMe( void ){
295    
296     #ifdef IS_MPI
297    
298     // keep the linked list in the mpi version
299    
300     #else // is_mpi
301    
302     // delete the linked list in the single processor version
303    
304     if( headAtomType != NULL ) delete headAtomType;
305    
306     #endif // is_mpi
307     }
308    
309    
310     void EAM_FF::readParams( void ){
311    
312     atomStruct info;
313     info.last = 1; // initialize last to have the last set.
314     // if things go well, last will be set to 0
315    
316     int identNum;
317     double *eam_rvals; // Z of r values
318     double *eam_rhovals; // rho of r values
319     double *eam_Frhovals; // F of rho values
320 gezelter 1654 string eamPotFile;
321 gezelter 1634
322 gezelter 1490
323    
324     bigSigma = 0.0;
325     #ifdef IS_MPI
326     if( worldRank == 0 ){
327     #endif
328    
329     // read in the atom types.
330    
331     headAtomType = new LinkedAtomType;
332    
333     fastForward( "AtomTypes", "eam atom readParams" );
334    
335     // we are now at the AtomTypes section.
336    
337     eof_test = fgets( readLine, sizeof(readLine), frcFile );
338     lineNum++;
339    
340    
341     // read a line, and start parseing out the atom types
342    
343     if( eof_test == NULL ){
344     sprintf( painCave.errMsg,
345     "Error in reading Atoms from force file at line %d.\n",
346     lineNum );
347     painCave.isFatal = 1;
348     simError();
349     }
350    
351     identNum = 1;
352     // stop reading at end of file, or at next section
353    
354     while( readLine[0] != '#' && eof_test != NULL ){
355    
356     // toss comment lines
357     if( readLine[0] != '!' ){
358    
359     // the parser returns 0 if the line was blank
360     if( parseAtom( readLine, lineNum, info, eamPotFile ) ){
361 gezelter 1656 parseEAM(info, ffPath, eamPotFile, &eam_rvals,
362 gezelter 1490 &eam_rhovals, &eam_Frhovals);
363     info.ident = identNum;
364     headAtomType->add( info, eam_rvals,
365     eam_rhovals,eam_Frhovals );
366     identNum++;
367     }
368     }
369     eof_test = fgets( readLine, sizeof(readLine), frcFile );
370     lineNum++;
371     }
372    
373    
374    
375     #ifdef IS_MPI
376    
377    
378     // send out the linked list to all the other processes
379    
380     sprintf( checkPointMsg,
381     "EAM_FF atom structures read successfully." );
382     MPIcheckPoint();
383    
384     currentAtomType = headAtomType->next; //skip the first element who is a place holder.
385     while( currentAtomType != NULL ){
386     currentAtomType->duplicate( info );
387    
388    
389    
390     sendFrcStruct( &info, mpiAtomStructType );
391    
392     // We have to now broadcast the Arrays
393     MPI_Bcast(currentAtomType->eam_rvals,
394     currentAtomType->eam_nr,
395     MPI_DOUBLE,0,MPI_COMM_WORLD);
396     MPI_Bcast(currentAtomType->eam_rhovals,
397     currentAtomType->eam_nr,
398     MPI_DOUBLE,0,MPI_COMM_WORLD);
399     MPI_Bcast(currentAtomType->eam_Frhovals,
400     currentAtomType->eam_nrho,
401     MPI_DOUBLE,0,MPI_COMM_WORLD);
402    
403     sprintf( checkPointMsg,
404     "successfully sent EAM force type: \"%s\"\n",
405     info.name );
406     MPIcheckPoint();
407    
408     currentAtomType = currentAtomType->next;
409     }
410     info.last = 1;
411     sendFrcStruct( &info, mpiAtomStructType );
412    
413     }
414    
415     else{
416    
417     // listen for node 0 to send out the force params
418    
419     MPIcheckPoint();
420    
421     headAtomType = new LinkedAtomType;
422     receiveFrcStruct( &info, mpiAtomStructType );
423    
424     while( !info.last ){
425    
426     // allocate the arrays
427    
428     eam_rvals = new double[info.eam_nr];
429     eam_rhovals = new double[info.eam_nr];
430     eam_Frhovals = new double[info.eam_nrho];
431    
432     // We have to now broadcast the Arrays
433     MPI_Bcast(eam_rvals,
434     info.eam_nr,
435     MPI_DOUBLE,0,MPI_COMM_WORLD);
436     MPI_Bcast(eam_rhovals,
437     info.eam_nr,
438     MPI_DOUBLE,0,MPI_COMM_WORLD);
439     MPI_Bcast(eam_Frhovals,
440     info.eam_nrho,
441     MPI_DOUBLE,0,MPI_COMM_WORLD);
442    
443    
444     headAtomType->add( info, eam_rvals, eam_rhovals, eam_Frhovals );
445    
446     MPIcheckPoint();
447    
448     receiveFrcStruct( &info, mpiAtomStructType );
449    
450    
451     }
452     }
453     #endif // is_mpi
454    
455     // call new A_types in fortran
456    
457     int isError;
458    
459     // dummy variables
460    
461     currentAtomType = headAtomType->next;
462     while( currentAtomType != NULL ){
463    
464     if( currentAtomType->name[0] != '\0' ){
465 gezelter 1634
466     AtomType* at = new AtomType();
467     at->setIdent(currentAtomType->ident);
468     at->setName(currentAtomType->name);
469     at->setEAM();
470     at->complete();
471    
472     }
473    
474 gezelter 1490 currentAtomType = currentAtomType->next;
475     }
476    
477 chrisfen 1636 entry_plug->useLennardJones = 0;
478 gezelter 1490 entry_plug->useEAM = 1;
479     // Walk down again and send out EAM type
480     currentAtomType = headAtomType->next;
481     while( currentAtomType != NULL ){
482    
483     if( currentAtomType->name[0] != '\0' ){
484     isError = 0;
485    
486     newEAMtype( &(currentAtomType->lattice_constant),
487     &(currentAtomType->eam_nrho),
488     &(currentAtomType->eam_drho),
489     &(currentAtomType->eam_nr),
490     &(currentAtomType->eam_dr),
491     &(currentAtomType->eam_rcut),
492     currentAtomType->eam_rvals,
493     currentAtomType->eam_rhovals,
494     currentAtomType->eam_Frhovals,
495     &(currentAtomType->eam_ident),
496     &isError);
497    
498     if( isError ){
499     sprintf( painCave.errMsg,
500     "Error initializing the \"%s\" atom type in fortran EAM\n",
501     currentAtomType->name );
502     painCave.isFatal = 1;
503     simError();
504     }
505     }
506     currentAtomType = currentAtomType->next;
507     }
508    
509    
510    
511     #ifdef IS_MPI
512     sprintf( checkPointMsg,
513     "EAM_FF atom structures successfully sent to fortran\n" );
514     MPIcheckPoint();
515     #endif // is_mpi
516    
517    
518    
519     }
520    
521    
522     void EAM_FF::initializeAtoms( int nAtoms, Atom** the_atoms ){
523    
524     int i;
525    
526     // initialize the atoms
527    
528     for( i=0; i<nAtoms; i++ ){
529    
530     currentAtomType = headAtomType->find( the_atoms[i]->getType() );
531     if( currentAtomType == NULL ){
532     sprintf( painCave.errMsg,
533     "AtomType error, %s not found in force file.\n",
534     the_atoms[i]->getType() );
535     painCave.isFatal = 1;
536     simError();
537     }
538    
539     the_atoms[i]->setMass( currentAtomType->mass );
540     the_atoms[i]->setIdent( currentAtomType->ident );
541    
542     if (eamRcut < currentAtomType->eam_rcut) eamRcut = currentAtomType->eam_rcut;
543    
544     }
545     }
546    
547     void EAM_FF::initializeBonds( int nBonds, Bond** BondArray,
548     bond_pair* the_bonds ){
549    
550     if( nBonds ){
551     sprintf( painCave.errMsg,
552     "LJ_FF does not support bonds.\n" );
553     painCave.isFatal = 1;
554     simError();
555     }
556     }
557    
558     void EAM_FF::initializeBends( int nBends, Bend** bendArray,
559     bend_set* the_bends ){
560    
561     if( nBends ){
562     sprintf( painCave.errMsg,
563     "LJ_FF does not support bends.\n" );
564     painCave.isFatal = 1;
565     simError();
566     }
567     }
568    
569     void EAM_FF::initializeTorsions( int nTorsions, Torsion** torsionArray,
570     torsion_set* the_torsions ){
571    
572     if( nTorsions ){
573     sprintf( painCave.errMsg,
574     "LJ_FF does not support torsions.\n" );
575     painCave.isFatal = 1;
576     simError();
577     }
578     }
579    
580     void EAM_FF::fastForward( char* stopText, char* searchOwner ){
581    
582     int foundText = 0;
583     char* the_token;
584    
585     rewind( frcFile );
586     lineNum = 0;
587    
588     eof_test = fgets( readLine, sizeof(readLine), frcFile );
589     lineNum++;
590     if( eof_test == NULL ){
591     sprintf( painCave.errMsg, "Error fast forwarding force file for %s: "
592     " file is empty.\n",
593     searchOwner );
594     painCave.isFatal = 1;
595     simError();
596     }
597    
598    
599     while( !foundText ){
600     while( eof_test != NULL && readLine[0] != '#' ){
601     eof_test = fgets( readLine, sizeof(readLine), frcFile );
602     lineNum++;
603     }
604     if( eof_test == NULL ){
605     sprintf( painCave.errMsg,
606     "Error fast forwarding force file for %s at "
607     "line %d: file ended unexpectedly.\n",
608     searchOwner,
609     lineNum );
610     painCave.isFatal = 1;
611     simError();
612     }
613    
614     the_token = strtok( readLine, " ,;\t#\n" );
615     foundText = !strcmp( stopText, the_token );
616    
617     if( !foundText ){
618     eof_test = fgets( readLine, sizeof(readLine), frcFile );
619     lineNum++;
620    
621     if( eof_test == NULL ){
622     sprintf( painCave.errMsg,
623     "Error fast forwarding force file for %s at "
624     "line %d: file ended unexpectedly.\n",
625     searchOwner,
626     lineNum );
627     painCave.isFatal = 1;
628     simError();
629     }
630     }
631     }
632     }
633    
634    
635    
636 gezelter 1654 int EAM_NS::parseAtom( char *lineBuffer, int lineNum, atomStruct &info, string eamPotFile ){
637 gezelter 1490
638     char* the_token;
639    
640     the_token = strtok( lineBuffer, " \n\t,;" );
641     if( the_token != NULL ){
642    
643     strcpy( info.name, the_token );
644    
645     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
646     sprintf( painCave.errMsg,
647     "Error parseing AtomTypes: line %d\n", lineNum );
648     painCave.isFatal = 1;
649     simError();
650     }
651    
652     info.mass = atof( the_token );
653    
654     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
655     sprintf( painCave.errMsg,
656     "Error parseing AtomTypes: line %d\n", lineNum );
657     painCave.isFatal = 1;
658     simError();
659     }
660 gezelter 1654
661     eamPotFile = the_token;
662    
663 gezelter 1490 return 1;
664     }
665     else return 0;
666     }
667    
668 gezelter 1656 int EAM_NS::parseEAM(atomStruct &info, string ffPath, string eamPotFile,
669 gezelter 1490 double **eam_rvals,
670     double **eam_rhovals,
671     double **eam_Frhovals){
672     double* myEam_rvals;
673     double* myEam_rhovals;
674     double* myEam_Frhovals;
675    
676     char* the_token;
677     char* eam_eof_test;
678     FILE *eamFile;
679     const int BUFFERSIZE = 3000;
680    
681 gezelter 1654 string tempString;
682 gezelter 1490 int linenumber;
683     int nReadLines;
684     char eam_read_buffer[BUFFERSIZE];
685    
686     int i,j;
687    
688     linenumber = 0;
689    
690     // Open eam file
691 gezelter 1654 eamFile = fopen( eamPotFile.c_str(), "r" );
692 gezelter 1490
693     if( eamFile == NULL ){
694    
695     // next see if the force path enviorment variable is set
696    
697 gezelter 1654 tempString = ffPath + "/" + eamPotFile;
698     eamPotFile = tempString;
699 gezelter 1490
700 gezelter 1654 eamFile = fopen( eamPotFile.c_str(), "r" );
701 gezelter 1490
702     if( eamFile == NULL ){
703    
704     sprintf( painCave.errMsg,
705     "Error opening the EAM force parameter file: %s\n"
706     "Have you tried setting the FORCE_PARAM_PATH environment "
707     "variable?\n",
708 gezelter 1654 eamPotFile.c_str() );
709 gezelter 1490 painCave.isFatal = 1;
710     simError();
711     }
712     }
713    
714     // First line is a comment line, read and toss it....
715     eam_eof_test = fgets(eam_read_buffer, sizeof(eam_read_buffer),eamFile);
716     linenumber++;
717     if(eam_eof_test == NULL){
718     sprintf( painCave.errMsg,
719 gezelter 1654 "error in reading commment in %s\n", eamPotFile.c_str());
720 gezelter 1490 painCave.isFatal = 1;
721     simError();
722     }
723    
724    
725    
726     // The Second line contains atomic number, atomic mass and a lattice constant
727     eam_eof_test = fgets(eam_read_buffer, sizeof(eam_read_buffer),eamFile);
728     linenumber++;
729     if(eam_eof_test == NULL){
730     sprintf( painCave.errMsg,
731 gezelter 1654 "error in reading Identifier line in %s\n", eamPotFile.c_str());
732 gezelter 1490 painCave.isFatal = 1;
733     simError();
734     }
735    
736    
737    
738    
739     if ( (the_token = strtok( eam_read_buffer, " \n\t,;")) == NULL){
740     sprintf( painCave.errMsg,
741 gezelter 1654 "Error parsing EAM ident line in %s\n", eamPotFile.c_str() );
742 gezelter 1490 painCave.isFatal = 1;
743     simError();
744     }
745    
746     info.eam_ident = atoi( the_token );
747    
748     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
749     sprintf( painCave.errMsg,
750 gezelter 1654 "Error parsing EAM mass in %s\n", eamPotFile.c_str() );
751 gezelter 1490 painCave.isFatal = 1;
752     simError();
753     }
754     info.mass = atof( the_token);
755    
756     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
757     sprintf( painCave.errMsg,
758 gezelter 1654 "Error parsing EAM Lattice Constant %s\n", eamPotFile.c_str() );
759 gezelter 1490 painCave.isFatal = 1;
760     simError();
761     }
762     info.lattice_constant = atof( the_token);
763    
764     // Next line is nrho, drho, nr, dr and rcut
765     eam_eof_test = fgets(eam_read_buffer, sizeof(eam_read_buffer),eamFile);
766     if(eam_eof_test == NULL){
767     sprintf( painCave.errMsg,
768 gezelter 1654 "error in reading number of points line in %s\n",
769     eamPotFile.c_str());
770 gezelter 1490 painCave.isFatal = 1;
771     simError();
772     }
773    
774     if ( (the_token = strtok( eam_read_buffer, " \n\t,;")) == NULL){
775     sprintf( painCave.errMsg,
776 gezelter 1654 "Error parseing EAM nrho: line in %s\n", eamPotFile.c_str() );
777 gezelter 1490 painCave.isFatal = 1;
778     simError();
779     }
780    
781     info.eam_nrho = atoi( the_token );
782    
783     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
784     sprintf( painCave.errMsg,
785 gezelter 1654 "Error parsing EAM drho in %s\n", eamPotFile.c_str() );
786 gezelter 1490 painCave.isFatal = 1;
787     simError();
788     }
789     info.eam_drho = atof( the_token);
790    
791     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
792     sprintf( painCave.errMsg,
793 gezelter 1654 "Error parsing EAM # r in %s\n", eamPotFile.c_str() );
794 gezelter 1490 painCave.isFatal = 1;
795     simError();
796     }
797     info.eam_nr = atoi( the_token);
798    
799     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
800     sprintf( painCave.errMsg,
801 gezelter 1654 "Error parsing EAM dr in %s\n", eamPotFile.c_str() );
802 gezelter 1490 painCave.isFatal = 1;
803     simError();
804     }
805     info.eam_dr = atof( the_token);
806    
807     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
808     sprintf( painCave.errMsg,
809 gezelter 1654 "Error parsing EAM rcut in %s\n", eamPotFile.c_str() );
810 gezelter 1490 painCave.isFatal = 1;
811     simError();
812     }
813     info.eam_rcut = atof( the_token);
814    
815    
816    
817    
818    
819     // Ok now we have to allocate point arrays and read in number of points
820     // Index the arrays for fortran, starting at 1
821     myEam_Frhovals = new double[info.eam_nrho];
822     myEam_rvals = new double[info.eam_nr];
823     myEam_rhovals = new double[info.eam_nr];
824    
825     // Parse F of rho vals.
826    
827     // Assume for now that we have a complete number of lines
828     nReadLines = int(info.eam_nrho/5);
829    
830    
831    
832     for (i=0;i<nReadLines;i++){
833     j = i*5;
834    
835     // Read next line
836     eam_eof_test = fgets(eam_read_buffer, sizeof(eam_read_buffer),eamFile);
837     linenumber++;
838     if(eam_eof_test == NULL){
839     sprintf( painCave.errMsg,
840     "error in reading EAM file %s at line %d\n",
841 gezelter 1654 eamPotFile.c_str(), linenumber);
842 gezelter 1490 painCave.isFatal = 1;
843     simError();
844     }
845    
846     // Parse 5 values on each line into array
847     // Value 1
848     if ( (the_token = strtok( eam_read_buffer, " \n\t,;")) == NULL){
849     sprintf( painCave.errMsg,
850 gezelter 1654 "Error parsing EAM nrho: line in %s\n", eamPotFile.c_str() );
851 gezelter 1490 painCave.isFatal = 1;
852     simError();
853     }
854    
855     myEam_Frhovals[j+0] = atof( the_token );
856    
857     // Value 2
858     if ( (the_token = strtok( NULL, " \n\t,;")) == NULL){
859     sprintf( painCave.errMsg,
860 gezelter 1654 "Error parsing EAM nrho: line in %s\n", eamPotFile.c_str() );
861 gezelter 1490 painCave.isFatal = 1;
862     simError();
863     }
864    
865     myEam_Frhovals[j+1] = atof( the_token );
866    
867     // Value 3
868     if ( (the_token = strtok( NULL, " \n\t,;")) == NULL){
869     sprintf( painCave.errMsg,
870 gezelter 1654 "Error parsing EAM nrho: line in %s\n", eamPotFile.c_str() );
871 gezelter 1490 painCave.isFatal = 1;
872     simError();
873     }
874    
875     myEam_Frhovals[j+2] = atof( the_token );
876    
877     // Value 4
878     if ( (the_token = strtok( NULL, " \n\t,;")) == NULL){
879     sprintf( painCave.errMsg,
880 gezelter 1654 "Error parsing EAM nrho: line in %s\n", eamPotFile.c_str() );
881 gezelter 1490 painCave.isFatal = 1;
882     simError();
883     }
884    
885     myEam_Frhovals[j+3] = atof( the_token );
886    
887     // Value 5
888     if ( (the_token = strtok( NULL, " \n\t,;")) == NULL){
889     sprintf( painCave.errMsg,
890 gezelter 1654 "Error parsing EAM nrho: line in %s\n", eamPotFile.c_str() );
891 gezelter 1490 painCave.isFatal = 1;
892     simError();
893     }
894    
895     myEam_Frhovals[j+4] = atof( the_token );
896    
897     }
898     // Parse Z of r vals
899    
900     // Assume for now that we have a complete number of lines
901     nReadLines = int(info.eam_nr/5);
902    
903     for (i=0;i<nReadLines;i++){
904     j = i*5;
905    
906     // Read next line
907     eam_eof_test = fgets(eam_read_buffer, sizeof(eam_read_buffer),eamFile);
908     linenumber++;
909     if(eam_eof_test == NULL){
910     sprintf( painCave.errMsg,
911     "error in reading EAM file %s at line %d\n",
912 gezelter 1654 eamPotFile.c_str(), linenumber);
913 gezelter 1490 painCave.isFatal = 1;
914     simError();
915     }
916    
917     // Parse 5 values on each line into array
918     // Value 1
919     if ( (the_token = strtok( eam_read_buffer, " \n\t,;")) == NULL){
920     sprintf( painCave.errMsg,
921 gezelter 1654 "Error parsing EAM nrho: line in %s\n", eamPotFile.c_str() );
922 gezelter 1490 painCave.isFatal = 1;
923     simError();
924     }
925    
926     myEam_rvals[j+0] = atof( the_token );
927    
928     // Value 2
929     if ( (the_token = strtok( NULL, " \n\t,;")) == NULL){
930     sprintf( painCave.errMsg,
931 gezelter 1654 "Error parsing EAM nrho: line in %s\n", eamPotFile.c_str() );
932 gezelter 1490 painCave.isFatal = 1;
933     simError();
934     }
935    
936     myEam_rvals[j+1] = atof( the_token );
937    
938     // Value 3
939     if ( (the_token = strtok( NULL, " \n\t,;")) == NULL){
940     sprintf( painCave.errMsg,
941 gezelter 1654 "Error parsing EAM nrho: line in %s\n", eamPotFile.c_str() );
942 gezelter 1490 painCave.isFatal = 1;
943     simError();
944     }
945    
946     myEam_rvals[j+2] = atof( the_token );
947    
948     // Value 4
949     if ( (the_token = strtok( NULL, " \n\t,;")) == NULL){
950     sprintf( painCave.errMsg,
951 gezelter 1654 "Error parsing EAM nrho: line in %s\n", eamPotFile.c_str() );
952 gezelter 1490 painCave.isFatal = 1;
953     simError();
954     }
955    
956     myEam_rvals[j+3] = atof( the_token );
957    
958     // Value 5
959     if ( (the_token = strtok( NULL, " \n\t,;")) == NULL){
960     sprintf( painCave.errMsg,
961 gezelter 1654 "Error parsing EAM nrho: line in %s\n", eamPotFile.c_str() );
962 gezelter 1490 painCave.isFatal = 1;
963     simError();
964     }
965    
966     myEam_rvals[j+4] = atof( the_token );
967    
968     }
969     // Parse rho of r vals
970    
971     // Assume for now that we have a complete number of lines
972    
973     for (i=0;i<nReadLines;i++){
974     j = i*5;
975    
976     // Read next line
977     eam_eof_test = fgets(eam_read_buffer, sizeof(eam_read_buffer),eamFile);
978     linenumber++;
979     if(eam_eof_test == NULL){
980     sprintf( painCave.errMsg,
981     "error in reading EAM file %s at line %d\n",
982 gezelter 1654 eamPotFile.c_str(), linenumber);
983 gezelter 1490 painCave.isFatal = 1;
984     simError();
985     }
986    
987     // Parse 5 values on each line into array
988     // Value 1
989     if ( (the_token = strtok( eam_read_buffer, " \n\t,;")) == NULL){
990     sprintf( painCave.errMsg,
991 gezelter 1654 "Error parsing EAM nrho: line in %s\n", eamPotFile.c_str() );
992 gezelter 1490 painCave.isFatal = 1;
993     simError();
994     }
995    
996     myEam_rhovals[j+0] = atof( the_token );
997    
998     // Value 2
999     if ( (the_token = strtok( NULL, " \n\t,;")) == NULL){
1000     sprintf( painCave.errMsg,
1001 gezelter 1654 "Error parsing EAM nrho: line in %s\n", eamPotFile.c_str() );
1002 gezelter 1490 painCave.isFatal = 1;
1003     simError();
1004     }
1005    
1006     myEam_rhovals[j+1] = atof( the_token );
1007    
1008     // Value 3
1009     if ( (the_token = strtok( NULL, " \n\t,;")) == NULL){
1010     sprintf( painCave.errMsg,
1011 gezelter 1654 "Error parsing EAM nrho: line in %s\n", eamPotFile.c_str() );
1012 gezelter 1490 painCave.isFatal = 1;
1013     simError();
1014     }
1015    
1016     myEam_rhovals[j+2] = atof( the_token );
1017    
1018     // Value 4
1019     if ( (the_token = strtok( NULL, " \n\t,;")) == NULL){
1020     sprintf( painCave.errMsg,
1021 gezelter 1654 "Error parsing EAM nrho: line in %s\n", eamPotFile.c_str() );
1022 gezelter 1490 painCave.isFatal = 1;
1023     simError();
1024     }
1025    
1026     myEam_rhovals[j+3] = atof( the_token );
1027    
1028     // Value 5
1029     if ( (the_token = strtok( NULL, " \n\t,;")) == NULL){
1030     sprintf( painCave.errMsg,
1031 gezelter 1654 "Error parsing EAM nrho: line in %s\n", eamPotFile.c_str() );
1032 gezelter 1490 painCave.isFatal = 1;
1033     simError();
1034     }
1035    
1036     myEam_rhovals[j+4] = atof( the_token );
1037    
1038     }
1039     *eam_rvals = myEam_rvals;
1040     *eam_rhovals = myEam_rhovals;
1041     *eam_Frhovals = myEam_Frhovals;
1042    
1043     fclose(eamFile);
1044     return 0;
1045     }