ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/EAM_FF.cpp
Revision: 657
Committed: Wed Jul 30 21:17:01 2003 UTC (20 years, 11 months ago) by chuckv
File size: 25925 byte(s)
Log Message:
More bug fixes for eam.

File Contents

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