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 1201 by tim, Thu May 27 15:31:36 2004 UTC vs.
Revision 1234 by tim, Fri Jun 4 03:15:31 2004 UTC

# Line 14 | Line 14 | using namespace std;
14  
15   #include "MatVec3.h"
16  
17 + #include "ConstraintManager.hpp"
18 +
19   #ifdef IS_MPI
20   #include "mpiSimulation.hpp"
21   #endif
# Line 62 | Line 64 | SimInfo::SimInfo(){
64    useReactionField = 0;
65    useGB = 0;
66    useEAM = 0;
67 <  useThermInt = 0;
67 >  useSolidThermInt = 0;
68 >  useLiquidThermInt = 0;
69  
70    haveCutoffGroups = false;
71  
# Line 75 | Line 78 | SimInfo::SimInfo(){
78  
79    ngroup = 0;
80  
81 +  consMan = NULL;
82 +  
83    wrapMeSimInfo( this );
84   }
85  
# Line 87 | Line 92 | SimInfo::~SimInfo(){
92    
93    for(i = properties.begin(); i != properties.end(); i++)
94      delete (*i).second;
95 <  
95 >
96 >  if (!consMan)
97 >    delete consMan;  
98   }
99  
100   void SimInfo::setBox(double newBox[3]) {
# Line 190 | Line 197 | void SimInfo::calcHmatInv( void ) {
197  
198    if( oldOrtho != orthoRhombic ){
199      
200 <    if( orthoRhombic ){
200 >    if( orthoRhombic ) {
201        sprintf( painCave.errMsg,
202                 "OOPSE is switching from the default Non-Orthorhombic\n"
203                 "\tto the faster Orthorhombic periodic boundary computations.\n"
# Line 198 | Line 205 | void SimInfo::calcHmatInv( void ) {
205                 "\tNon-Orthorhombic computations, make the orthoBoxTolerance\n"
206                 "\tvariable ( currently set to %G ) smaller.\n",
207                 orthoTolerance);
208 +      painCave.severity = OOPSE_INFO;
209        simError();
210      }
211      else {
# Line 209 | Line 217 | void SimInfo::calcHmatInv( void ) {
217                 "\tthe Orthorhombic computations, make the orthoBoxTolerance\n"
218                 "\tvariable ( currently set to %G ) larger.\n",
219                 orthoTolerance);
220 +      painCave.severity = OOPSE_WARNING;
221        simError();
222      }
223    }
# Line 445 | Line 454 | void SimInfo::refreshSim(){
454    excl = excludes->getFortranArray();
455    
456   #ifdef IS_MPI
457 <  n_global = mpiSim->getTotAtoms();
457 >  n_global = mpiSim->getNAtomsGlobal();
458   #else
459    n_global = n_atoms;
460   #endif
461    
462    isError = 0;
463    
464 <  getFortranGroupArray(this, mfact, ngroup, groupList, groupStart);
464 >  getFortranGroupArrays(this, FglobalGroupMembership, mfact);
465    //it may not be a good idea to pass the address of first element in vector
466    //since c++ standard does not require vector to be stored continuously in meomory
467    //Most of the compilers will organize the memory of vector continuously
468    setFsimulation( &fInfo, &n_global, &n_atoms, identArray, &n_exclude, excl,
469                    &nGlobalExcludes, globalExcludes, molMembershipArray,
470 <                  &mfact[0], &ngroup, &groupList[0], &groupStart[0], &isError);
471 <  
470 >                  &mfact[0], &ngroup, &FglobalGroupMembership[0], &isError);
471 >
472    if( isError ){
473      
474      sprintf( painCave.errMsg,
475               "There was an error setting the simulation information in fortran.\n" );
476      painCave.isFatal = 1;
477 +    painCave.severity = OOPSE_ERROR;
478      simError();
479    }
480    
# Line 515 | Line 525 | void SimInfo::checkCutOffs( void ){
525                 Hmat[0][0], Hmat[0][1], Hmat[0][2],
526                 Hmat[1][0], Hmat[1][1], Hmat[1][2],
527                 Hmat[2][0], Hmat[2][1], Hmat[2][2]);
528 +      painCave.severity = OOPSE_ERROR;
529        painCave.isFatal = 1;
530        simError();
531      }    
# Line 523 | Line 534 | void SimInfo::checkCutOffs( void ){
534      sprintf( painCave.errMsg,
535               "Trying to check cutoffs without a box.\n"
536               "\tOOPSE should have better programmers than that.\n" );
537 +    painCave.severity = OOPSE_ERROR;
538      painCave.isFatal = 1;
539      simError();      
540    }
# Line 566 | Line 578 | GenericData* SimInfo::getProperty(const string& propNa
578   }
579  
580  
581 < void getFortranGroupArray(SimInfo* info, vector<double>& mfact, int& ngroup,
582 <                          vector<int>& groupList, vector<int>& groupStart){
581 > void SimInfo::getFortranGroupArrays(SimInfo* info,
582 >                                    vector<int>& FglobalGroupMembership,
583 >                                    vector<double>& mfact){
584 >  
585    Molecule* myMols;
586    Atom** myAtoms;
587    int numAtom;
574  int curIndex;
588    double mtot;
589    int numMol;
590    int numCutoffGroups;
# Line 583 | Line 596 | void getFortranGroupArray(SimInfo* info, vector<double
596    double totalMass;
597    
598    mfact.clear();
599 <  groupList.clear();
587 <  groupStart.clear();
599 >  FglobalGroupMembership.clear();
600    
589  //Be careful, fortran array begin at 1
590  curIndex = 1;
601  
602 +  // Fix the silly fortran indexing problem
603 + #ifdef IS_MPI
604 +  numAtom = mpiSim->getNAtomsGlobal();
605 + #else
606 +  numAtom = n_atoms;
607 + #endif
608 +  for (int i = 0; i < numAtom; i++)
609 +    FglobalGroupMembership.push_back(globalGroupMembership[i] + 1);
610 +  
611 +
612    myMols = info->molecules;
613    numMol = info->n_mol;
614    for(int i  = 0; i < numMol; i++){
615      numCutoffGroups = myMols[i].getNCutoffGroups();
616 <    for(myCutoffGroup =myMols[i].beginCutoffGroup(iterCutoff); myCutoffGroup != NULL;
617 <                                                  myCutoffGroup =myMols[i].nextCutoffGroup(iterCutoff)){
616 >    for(myCutoffGroup =myMols[i].beginCutoffGroup(iterCutoff);
617 >        myCutoffGroup != NULL;
618 >        myCutoffGroup =myMols[i].nextCutoffGroup(iterCutoff)){
619  
620        totalMass = myCutoffGroup->getMass();
621        
622 <      for(cutoffAtom = myCutoffGroup->beginAtom(iterAtom); cutoffAtom != NULL;
623 <                                           cutoffAtom = myCutoffGroup->nextAtom(iterAtom)){
622 >      for(cutoffAtom = myCutoffGroup->beginAtom(iterAtom);
623 >          cutoffAtom != NULL;
624 >          cutoffAtom = myCutoffGroup->nextAtom(iterAtom)){
625          mfact.push_back(cutoffAtom->getMass()/totalMass);
604 #ifdef IS_MPI        
605        groupList.push_back(cutoffAtom->getGlobalIndex() + 1);
606 #else
607        groupList.push_back(cutoffAtom->getIndex() + 1);
608 #endif
626        }  
627 <                              
628 <      groupStart.push_back(curIndex);
612 <      curIndex += myCutoffGroup->getNumAtom();
627 >    }
628 >  }
629  
614    }//end for(myCutoffGroup =myMols[i].beginCutoffGroup(iterCutoff))
615
616  }//end for(int i  = 0; i < numMol; i++)
617
618
619  //The last cutoff group need more element to indicate the end of the cutoff
620  ngroup = groupStart.size();
630   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines