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

Comparing trunk/OOPSE/libmdtools/WATER.cpp (file contents):
Revision 989 by gezelter, Tue Jan 27 19:38:27 2004 UTC vs.
Revision 999 by chrisfen, Fri Jan 30 15:01:09 2004 UTC

# Line 305 | Line 305 | WATER::WATER(){
305    MPI_Type_commit(&mpiDirectionalStructType);
306  
307    // ***********************************************************************
308 <  
308 >
309    if( worldRank == 0 ){
310   #endif
311      
# Line 399 | Line 399 | void WATER::readParams( void ){
399   void WATER::readParams( void ){
400  
401    int identNum;
402 +  int tempDirect0, tempDirect1;
403  
404    atomStruct atomInfo;
405    directionalStruct directionalInfo;
# Line 409 | Line 410 | void WATER::readParams( void ){
410    
411    atomPos = new fpos_t;
412    bigSigma = 0.0;
413 <
413 >  
414   #ifdef IS_MPI
415    if( worldRank == 0 ){
416   #endif
# Line 420 | Line 421 | void WATER::readParams( void ){
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 );
# Line 428 | Line 429 | void WATER::readParams( void ){
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",
# Line 469 | Line 470 | void WATER::readParams( void ){
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  
# Line 636 | Line 630 | void WATER::readParams( void ){
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  
# Line 645 | Line 640 | void WATER::initializeAtoms( int nAtoms, Atom** the_at
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",
# Line 662 | Line 655 | void WATER::initializeAtoms( int nAtoms, Atom** the_at
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",
# Line 684 | Line 674 | void WATER::initializeAtoms( int nAtoms, Atom** the_at
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,

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines