305 |
|
MPI_Type_commit(&mpiDirectionalStructType); |
306 |
|
|
307 |
|
// *********************************************************************** |
308 |
< |
|
308 |
> |
|
309 |
|
if( worldRank == 0 ){ |
310 |
|
#endif |
311 |
|
|
399 |
|
void WATER::readParams( void ){ |
400 |
|
|
401 |
|
int identNum; |
402 |
+ |
int tempDirect0, tempDirect1; |
403 |
|
|
404 |
|
atomStruct atomInfo; |
405 |
|
directionalStruct directionalInfo; |
410 |
|
|
411 |
|
atomPos = new fpos_t; |
412 |
|
bigSigma = 0.0; |
413 |
< |
|
413 |
> |
|
414 |
|
#ifdef IS_MPI |
415 |
|
if( worldRank == 0 ){ |
416 |
|
#endif |
421 |
|
headDirectionalType = new LinkedDirectionalType; |
422 |
|
|
423 |
|
fastForward( "AtomTypes", "initializeAtoms" ); |
424 |
< |
|
424 |
> |
|
425 |
|
// we are now at the AtomTypes section. |
426 |
|
|
427 |
|
eof_test = fgets( readLine, sizeof(readLine), frcFile ); |
429 |
|
|
430 |
|
|
431 |
|
// read a line, and start parsing out the atom types |
432 |
< |
|
432 |
> |
|
433 |
|
if( eof_test == NULL ){ |
434 |
|
sprintf( painCave.errMsg, |
435 |
|
"Error in reading Atoms from force file at line %d.\n", |
470 |
|
} |
471 |
|
|
472 |
|
#ifdef IS_MPI |
473 |
< |
|
473 |
> |
|
474 |
|
// send out the linked list to all the other processes |
475 |
|
|
476 |
|
sprintf( checkPointMsg, |
477 |
< |
"WATER atom structures read successfully." ); |
477 |
> |
"WATER atom and directional structures read successfully." ); |
478 |
|
MPIcheckPoint(); |
479 |
< |
currentAtomType = headAtomType->next; //skip the first element who is a place holder. |
479 |
> |
currentAtomType = headAtomType->next; //skip the first element place holder |
480 |
> |
currentDirectionalType = headDirectionalType->next; // same w/ directional |
481 |
> |
|
482 |
|
while( currentAtomType != NULL ){ |
483 |
|
currentAtomType->duplicate( atomInfo ); |
484 |
< |
|
484 |
> |
|
485 |
|
sendFrcStruct( &atomInfo, mpiAtomStructType ); |
486 |
|
|
487 |
|
sprintf( checkPointMsg, |
488 |
|
"successfully sent WATER force type: \"%s\"\n", |
489 |
|
atomInfo.name ); |
487 |
– |
MPIcheckPoint(); |
490 |
|
|
491 |
+ |
if ( atomInfo.isDirectional ){ |
492 |
+ |
// send out the directional linked list to all the other processes |
493 |
+ |
|
494 |
+ |
currentDirectionalType->duplicate( directionalInfo ); |
495 |
+ |
sendFrcStruct( &directionalInfo, mpiDirectionalStructType ); |
496 |
+ |
|
497 |
+ |
sprintf( checkPointMsg, |
498 |
+ |
"successfully sent WATER directional type: \"%s\"\n", |
499 |
+ |
directionalInfo.name ); |
500 |
+ |
} |
501 |
+ |
|
502 |
+ |
MPIcheckPoint(); |
503 |
+ |
tempDirect0 = atomInfo.isDirectional; |
504 |
|
currentAtomType = currentAtomType->next; |
505 |
+ |
if( tempDirect0 ) |
506 |
+ |
currentDirectionalType = currentDirectionalType->next; |
507 |
|
} |
508 |
< |
|
508 |
> |
|
509 |
|
atomInfo.last = 1; |
510 |
|
sendFrcStruct( &atomInfo, mpiAtomStructType ); |
511 |
< |
|
512 |
< |
if ( atomInfo.isDirectional ){ |
496 |
< |
// send out the linked list to all the other processes |
497 |
< |
|
498 |
< |
sprintf( checkPointMsg, |
499 |
< |
"WATER directional structures read successfully." ); |
500 |
< |
MPIcheckPoint(); |
501 |
< |
|
502 |
< |
currentDirectionalType = headDirectionalType->next; |
503 |
< |
while( currentDirectionalType != NULL ){ |
504 |
< |
currentDirectionalType->duplicate( directionalInfo ); |
505 |
< |
sendFrcStruct( &directionalInfo, mpiDirectionalStructType ); |
506 |
< |
currentDirectionalType = currentDirectionalType->next; |
507 |
< |
} |
508 |
< |
directionalInfo.last = 1; |
511 |
> |
directionalInfo.last = 1; |
512 |
> |
if ( atomInfo.isDirectional ) |
513 |
|
sendFrcStruct( &directionalInfo, mpiDirectionalStructType ); |
510 |
– |
} |
514 |
|
} |
515 |
< |
|
515 |
> |
|
516 |
|
else{ |
514 |
– |
|
517 |
|
// listen for node 0 to send out the force params |
518 |
|
|
519 |
|
MPIcheckPoint(); |
520 |
|
|
521 |
|
headAtomType = new LinkedAtomType; |
522 |
< |
receiveFrcStruct( &atomInfo, mpiAtomStructType ); |
523 |
< |
|
522 |
> |
headDirectionalType = new LinkedDirectionalType; |
523 |
> |
receiveFrcStruct( &atomInfo, mpiAtomStructType ); |
524 |
> |
|
525 |
> |
if ( atomInfo.isDirectional ) |
526 |
> |
receiveFrcStruct( &directionalInfo, mpiDirectionalStructType ); |
527 |
> |
|
528 |
|
while( !atomInfo.last ){ |
529 |
< |
|
529 |
> |
|
530 |
|
headAtomType->add( atomInfo ); |
531 |
|
|
532 |
|
MPIcheckPoint(); |
533 |
< |
|
533 |
> |
|
534 |
|
receiveFrcStruct( &atomInfo, mpiAtomStructType ); |
529 |
– |
} |
535 |
|
|
536 |
< |
if ( atomInfo.isDirectional ) { |
532 |
< |
// listen for node 0 to send out the force params |
533 |
< |
|
534 |
< |
MPIcheckPoint(); |
535 |
< |
|
536 |
< |
headDirectionalType = new LinkedDirectionalType; |
537 |
< |
receiveFrcStruct( &directionalInfo, mpiDirectionalStructType ); |
538 |
< |
while( !directionalInfo.last ){ |
539 |
< |
|
536 |
> |
if( atomInfo.isDirectional ){ |
537 |
|
headDirectionalType->add( directionalInfo ); |
538 |
+ |
|
539 |
|
receiveFrcStruct( &directionalInfo, mpiDirectionalStructType ); |
540 |
|
} |
543 |
– |
|
544 |
– |
sprintf( checkPointMsg, |
545 |
– |
"WATER directional structures broadcast successfully." ); |
546 |
– |
MPIcheckPoint(); |
541 |
|
} |
542 |
|
} |
543 |
|
|
630 |
|
|
631 |
|
#ifdef IS_MPI |
632 |
|
sprintf( checkPointMsg, |
633 |
< |
"WATER atom structures successfully sent to fortran\n" ); |
633 |
> |
"WATER atom and directional structures successfully" |
634 |
> |
"sent to fortran\n" ); |
635 |
|
MPIcheckPoint(); |
636 |
|
#endif // is_mpi |
637 |
|
|
640 |
|
|
641 |
|
void WATER::initializeAtoms( int nAtoms, Atom** the_atoms ){ |
642 |
|
|
643 |
< |
int i,j; |
643 |
> |
int i,j,k; |
644 |
|
|
645 |
|
// initialize the atoms |
646 |
|
DirectionalAtom* dAtom; |
647 |
|
double inertialMat[3][3]; |
648 |
|
|
649 |
|
for( i=0; i<nAtoms; i++ ){ |
655 |
– |
fprintf(stderr, "flag 1\n"); |
650 |
|
currentAtomType = headAtomType->find( the_atoms[i]->getType() ); |
657 |
– |
fprintf(stderr, "%s is the type\n", the_atoms[i]->getType()); |
651 |
|
if( currentAtomType == NULL ){ |
652 |
|
sprintf( painCave.errMsg, |
653 |
|
"AtomType error, %s not found in force file.\n", |
655 |
|
painCave.isFatal = 1; |
656 |
|
simError(); |
657 |
|
} |
665 |
– |
fprintf(stderr, "flag 2\n"); |
658 |
|
if( currentAtomType->isLJ ) the_atoms[i]->setLJ(); |
659 |
|
if( currentAtomType->isCharge ) the_atoms[i]->setCharged(); |
660 |
|
the_atoms[i]->setMass( currentAtomType->mass ); |
661 |
|
the_atoms[i]->setIdent( currentAtomType->ident ); |
662 |
< |
fprintf(stderr, "flag 3\n"); |
662 |
> |
|
663 |
|
if( bigSigma < currentAtomType->sigma ) bigSigma = currentAtomType->sigma; |
664 |
|
|
665 |
|
if( currentAtomType->isDirectional ){ |
674 |
– |
fprintf(stderr, "flag 4\n"); |
666 |
|
currentDirectionalType = |
667 |
|
headDirectionalType->find( the_atoms[i]->getType() ); |
677 |
– |
fprintf(stderr, "%s is the type\n", the_atoms[i]->getType()); |
668 |
|
if( currentDirectionalType == NULL ){ |
669 |
|
sprintf( painCave.errMsg, |
670 |
|
"DirectionalType error, %s not found in force file.\n", |
674 |
|
} |
675 |
|
|
676 |
|
// zero out the moments of inertia matrix |
677 |
< |
for( i=0; i<3; i++ ) |
678 |
< |
for( j=0; j<3; j++ ) |
679 |
< |
inertialMat[i][j] = 0.0; |
677 |
> |
for( j=0; j<3; j++ ) |
678 |
> |
for( k=0; k<3; k++ ) |
679 |
> |
inertialMat[j][k] = 0.0; |
680 |
|
|
681 |
|
// load the force file moments of inertia |
682 |
|
inertialMat[0][0] = currentDirectionalType->Ixx; |
683 |
|
inertialMat[1][1] = currentDirectionalType->Iyy; |
684 |
|
inertialMat[2][2] = currentDirectionalType->Izz; |
685 |
< |
fprintf(stderr, "Let's try pointing to isDirectional\n"); |
696 |
< |
fprintf(stderr, "%i what is this\n",the_atoms[i]->isDirectional()); |
685 |
> |
|
686 |
|
dAtom = (DirectionalAtom *) the_atoms[i]; |
698 |
– |
fprintf(stderr, "%i is isDipole\n", currentDirectionalType->isDipole); |
687 |
|
dAtom->setHasDipole( currentDirectionalType->isDipole ); |
688 |
|
dAtom->setMu( currentDirectionalType->dipole ); |
701 |
– |
fprintf(stderr, "flag 5\n"); |
689 |
|
dAtom->setMu( currentDirectionalType->dipole ); |
690 |
< |
fprintf(stderr,"flag 6\n"); |
690 |
> |
|
691 |
|
// if it's sticky then it's an SSD type |
692 |
|
dAtom->setSSD( currentDirectionalType->isSticky ); |
693 |
|
dAtom->setJx( 0.0 ); |
694 |
|
dAtom->setJy( 0.0 ); |
695 |
|
dAtom->setJz( 0.0 ); |
696 |
|
dAtom->setI( inertialMat ); |
697 |
< |
fprintf(stderr, "flag 7\n"); |
697 |
> |
|
698 |
|
entry_plug->n_dipoles++; |
712 |
– |
fprintf(stderr, "flag 8\n"); |
699 |
|
} |
700 |
|
else{ |
701 |
|
sprintf( painCave.errMsg, |