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

Comparing trunk/OOPSE/libmdtools/SimInfo.cpp (file contents):
Revision 1154 by gezelter, Tue May 11 16:00:22 2004 UTC vs.
Revision 1218 by gezelter, Wed Jun 2 14:21:54 2004 UTC

# Line 62 | Line 62 | SimInfo::SimInfo(){
62    useReactionField = 0;
63    useGB = 0;
64    useEAM = 0;
65 +  useSolidThermInt = 0;
66 +  useLiquidThermInt = 0;
67  
68 +  haveCutoffGroups = false;
69 +
70    excludes = Exclude::Instance();
71  
72    myConfiguration = new SimState();
# Line 187 | Line 191 | void SimInfo::calcHmatInv( void ) {
191  
192    if( oldOrtho != orthoRhombic ){
193      
194 <    if( orthoRhombic ){
194 >    if( orthoRhombic ) {
195        sprintf( painCave.errMsg,
196 <               "OOPSE is switching from the default Non-Orthorhombic\n"
196 >               "\n\tOOPSE is switching from the default Non-Orthorhombic\n"
197                 "\tto the faster Orthorhombic periodic boundary computations.\n"
198                 "\tThis is usually a good thing, but if you wan't the\n"
199                 "\tNon-Orthorhombic computations, make the orthoBoxTolerance\n"
200                 "\tvariable ( currently set to %G ) smaller.\n",
201                 orthoTolerance);
202 +      painCave.severity = OOPSE_INFO;
203        simError();
204      }
205      else {
206        sprintf( painCave.errMsg,
207 <               "OOPSE is switching from the faster Orthorhombic to the more\n"
207 >               "\n\tOOPSE is switching from the faster Orthorhombic to the more\n"
208                 "\tflexible Non-Orthorhombic periodic boundary computations.\n"
209                 "\tThis is usually because the box has deformed under\n"
210                 "\tNPTf integration. If you wan't to live on the edge with\n"
211                 "\tthe Orthorhombic computations, make the orthoBoxTolerance\n"
212                 "\tvariable ( currently set to %G ) larger.\n",
213                 orthoTolerance);
214 +      painCave.severity = OOPSE_WARNING;
215        simError();
216      }
217    }
# Line 442 | Line 448 | void SimInfo::refreshSim(){
448    excl = excludes->getFortranArray();
449    
450   #ifdef IS_MPI
451 <  n_global = mpiSim->getTotAtoms();
451 >  n_global = mpiSim->getNAtomsGlobal();
452   #else
453    n_global = n_atoms;
454   #endif
455    
456    isError = 0;
457    
458 <  getFortranGroupArray(this, mfact, ngroup, groupList, groupStart);
459 <  
458 >  getFortranGroupArrays(this, FglobalGroupMembership, mfact);
459 >  //it may not be a good idea to pass the address of first element in vector
460 >  //since c++ standard does not require vector to be stored continuously in meomory
461 >  //Most of the compilers will organize the memory of vector continuously
462    setFsimulation( &fInfo, &n_global, &n_atoms, identArray, &n_exclude, excl,
463                    &nGlobalExcludes, globalExcludes, molMembershipArray,
464 <                  &mfact[0], &ngroup, &groupList[0], &groupStart[0], &isError);
465 <  
464 >                  &mfact[0], &ngroup, &FglobalGroupMembership[0], &isError);
465 >
466    if( isError ){
467      
468      sprintf( painCave.errMsg,
# Line 498 | Line 506 | void SimInfo::checkCutOffs( void ){
506      
507      if( rCut > maxCutoff ){
508        sprintf( painCave.errMsg,
509 <               "cutoffRadius is too large for the current periodic box.\n"
509 >               "\n\tcutoffRadius is too large for the current periodic box.\n"
510                 "\tCurrent Value of cutoffRadius = %G at time %G\n "
511                 "\tThis is larger than half of at least one of the\n"
512                 "\tperiodic box vectors.  Right now, the Box matrix is:\n"
# Line 510 | Line 518 | void SimInfo::checkCutOffs( void ){
518                 Hmat[0][0], Hmat[0][1], Hmat[0][2],
519                 Hmat[1][0], Hmat[1][1], Hmat[1][2],
520                 Hmat[2][0], Hmat[2][1], Hmat[2][2]);
521 +      painCave.severity = OOPSE_ERROR;
522        painCave.isFatal = 1;
523        simError();
524      }    
525    } else {
526      // initialize this stuff before using it, OK?
527      sprintf( painCave.errMsg,
528 <             "Trying to check cutoffs without a box.\n"
528 >             "\n\tTrying to check cutoffs without a box.\n"
529               "\tOOPSE should have better programmers than that.\n" );
530 +    painCave.severity = OOPSE_ERROR;
531      painCave.isFatal = 1;
532      simError();      
533    }
# Line 561 | Line 571 | GenericData* SimInfo::getProperty(const string& propNa
571   }
572  
573  
574 < void getFortranGroupArray(SimInfo* info, vector<double>& mfact, int& ngroup,
575 <                          vector<int>& groupList, vector<int>& groupStart){
576 <  Molecule* mol;
574 > void SimInfo::getFortranGroupArrays(SimInfo* info,
575 >                                    vector<int>& FglobalGroupMembership,
576 >                                    vector<double>& mfact){
577 >  
578 >  Molecule* myMols;
579    Atom** myAtoms;
580    int numAtom;
569  int curIndex;
581    double mtot;
582 <
582 >  int numMol;
583 >  int numCutoffGroups;
584 >  CutoffGroup* myCutoffGroup;
585 >  vector<CutoffGroup*>::iterator iterCutoff;
586 >  Atom* cutoffAtom;
587 >  vector<Atom*>::iterator iterAtom;
588 >  int atomIndex;
589 >  double totalMass;
590 >  
591    mfact.clear();
592 <  groupList.clear();
574 <  groupStart.clear();
592 >  FglobalGroupMembership.clear();
593    
594 <  //Be careful, fortran array begin at 1
595 <  curIndex = 1;
578 <  
579 <  if(info->useMolecularCutoffs){
580 <    
594 >
595 >  // Fix the silly fortran indexing problem
596   #ifdef IS_MPI
597 <    ngroup = mpiSim->getMyNMol();
597 >  numAtom = mpiSim->getNAtomsGlobal();
598   #else
599 <    ngroup = info->n_mol;
599 >  numAtom = n_atoms;
600   #endif
601 <    
602 <    for(int i = 0; i < ngroup; i ++){
603 <      mol = &(info->molecules[i]);
589 <      numAtom = mol->getNAtoms();
590 <      myAtoms = mol->getMyAtoms();
591 <      mtot = 0.0;
601 >  for (int i = 0; i < numAtom; i++)
602 >    FglobalGroupMembership.push_back(globalGroupMembership[i] + 1);
603 >  
604  
605 <      for(int j=0; j < numAtom; j++)
606 <        mtot += myAtoms[j]->getMass();                
607 <      
608 <      for(int j=0; j < numAtom; j++){
609 <              
610 <        // We want the local Index:
611 <        groupList.push_back(myAtoms[j]->getIndex() + 1);
600 <        mfact.push_back(myAtoms[j]->getMass() / mtot);
605 >  myMols = info->molecules;
606 >  numMol = info->n_mol;
607 >  for(int i  = 0; i < numMol; i++){
608 >    numCutoffGroups = myMols[i].getNCutoffGroups();
609 >    for(myCutoffGroup =myMols[i].beginCutoffGroup(iterCutoff);
610 >        myCutoffGroup != NULL;
611 >        myCutoffGroup =myMols[i].nextCutoffGroup(iterCutoff)){
612  
613 <      }
613 >      totalMass = myCutoffGroup->getMass();
614        
615 <      groupStart.push_back(curIndex);
616 <      curIndex += numAtom;
617 <      
618 <    } //end for(int i =0 ; i < ngroup; i++)    
615 >      for(cutoffAtom = myCutoffGroup->beginAtom(iterAtom);
616 >          cutoffAtom != NULL;
617 >          cutoffAtom = myCutoffGroup->nextAtom(iterAtom)){
618 >        mfact.push_back(cutoffAtom->getMass()/totalMass);
619 >      }  
620 >    }
621    }
622 <  else{
610 <    //using atomic cutoff, every single atom is just a group
611 <    
612 < #ifdef IS_MPI
613 <    ngroup = mpiSim->getMyNlocal();
614 < #else
615 <    ngroup = info->n_atoms;
616 < #endif
617 <    
618 <    for(int i =0 ; i < ngroup; i++){
619 <      groupStart.push_back(curIndex++);      
620 <      groupList.push_back((info->atoms[i])->getIndex() + 1);
621 <      mfact.push_back(1.0);
622 <      
623 <    }//end for(int i =0 ; i < ngroup; i++)
624 <    
625 <  }//end if (info->useMolecularCutoffs)
626 <  
622 >
623   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines