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 597 by mmeineke, Mon Jul 14 21:28:54 2003 UTC vs.
Revision 770 by gezelter, Fri Sep 19 14:55:41 2003 UTC

# Line 26 | Line 26 | SimInfo::SimInfo(){
26   SimInfo::SimInfo(){
27    excludes = NULL;
28    n_constraints = 0;
29 +  nZconstraints = 0;
30    n_oriented = 0;
31    n_dipoles = 0;
32    ndf = 0;
33    ndfRaw = 0;
34 +  nZconstraints = 0;
35    the_integrator = NULL;
36    setTemp = 0;
37    thermalTime = 0.0;
38 +  currentTime = 0.0;
39    rCut = 0.0;
40 +  origRcut = -1.0;
41 +  ecr = 0.0;
42 +  origEcr = -1.0;
43 +  est = 0.0;
44 +  oldEcr = 0.0;
45 +  oldRcut = 0.0;
46  
47 +  haveOrigRcut = 0;
48 +  haveOrigEcr = 0;
49 +  boxIsInit = 0;
50 +  
51 +  
52 +
53    usePBC = 0;
54    useLJ = 0;
55    useSticky = 0;
# Line 43 | Line 58 | SimInfo::SimInfo(){
58    useGB = 0;
59    useEAM = 0;
60  
61 +  myConfiguration = new SimState();
62 +
63    wrapMeSimInfo( this );
64   }
65  
66 +
67 + SimInfo::~SimInfo(){
68 +
69 +  delete myConfiguration;
70 +
71 +  map<string, GenericData*>::iterator i;
72 +  
73 +  for(i = properties.begin(); i != properties.end(); i++)
74 +    delete (*i).second;
75 +    
76 + }
77 +
78   void SimInfo::setBox(double newBox[3]) {
79    
80    int i, j;
# Line 73 | Line 102 | void SimInfo::setBoxM( double theBox[3][3] ){
102                           // [ 2 5 8 ]
103    double FortranHmatInv[9]; // the inverted Hmat (for Fortran);
104  
105 +  
106 +  if( !boxIsInit ) boxIsInit = 1;
107  
108    for(i=0; i < 3; i++)
109      for (j=0; j < 3; j++) Hmat[i][j] = theBox[i][j];
110    
80  cerr
81    << "setting Hmat ->\n"
82    << "[ " << Hmat[0][0] << ", " << Hmat[0][1] << ", " << Hmat[0][2] << " ]\n"
83    << "[ " << Hmat[1][0] << ", " << Hmat[1][1] << ", " << Hmat[1][2] << " ]\n"
84    << "[ " << Hmat[2][0] << ", " << Hmat[2][1] << ", " << Hmat[2][2] << " ]\n";
85
111    calcBoxL();
112    calcHmatInv();
113  
# Line 95 | Line 120 | void SimInfo::setBoxM( double theBox[3][3] ){
120  
121    setFortranBoxSize(FortranHmat, FortranHmatInv, &orthoRhombic);
122  
98  smallestBoxL = boxLx;
99  if (boxLy < smallestBoxL) smallestBoxL = boxLy;
100  if (boxLz < smallestBoxL) smallestBoxL = boxLz;
101
102  maxCutoff = smallestBoxL / 2.0;
103
104  if (rList > maxCutoff) {
105    sprintf( painCave.errMsg,
106             "New Box size is forcing neighborlist radius down to %lf\n",
107             maxCutoff );
108    painCave.isFatal = 0;
109    simError();
110
111    rList = maxCutoff;
112
113    sprintf( painCave.errMsg,
114             "New Box size is forcing cutoff radius down to %lf\n",
115             maxCutoff - 1.0 );
116    painCave.isFatal = 0;
117    simError();
118
119    rCut = rList - 1.0;
120
121    // list radius changed so we have to refresh the simulation structure.
122    refreshSim();
123  }
124
125  if (rCut > maxCutoff) {
126    sprintf( painCave.errMsg,
127             "New Box size is forcing cutoff radius down to %lf\n",
128             maxCutoff );
129    painCave.isFatal = 0;
130    simError();
131
132    status = 0;
133    LJ_new_rcut(&rCut, &status);
134    if (status != 0) {
135      sprintf( painCave.errMsg,
136               "Error in recomputing LJ shifts based on new rcut\n");
137      painCave.isFatal = 1;
138      simError();
139    }
140  }
123   }
124  
125  
# Line 153 | Line 135 | void SimInfo::scaleBox(double scale) {
135    double theBox[3][3];
136    int i, j;
137  
138 <  cerr << "Scaling box by " << scale << "\n";
138 >  // cerr << "Scaling box by " << scale << "\n";
139  
140    for(i=0; i<3; i++)
141      for (j=0; j<3; j++) theBox[i][j] = Hmat[i][j]*scale;
# Line 312 | Line 294 | void SimInfo::calcBoxL( void ){
294    
295    dx = Hmat[0][0]; dy = Hmat[1][0]; dz = Hmat[2][0];
296    dsq = dx*dx + dy*dy + dz*dz;
297 <  boxLx = sqrt( dsq );
297 >  boxL[0] = sqrt( dsq );
298 >  maxCutoff = 0.5 * boxL[0];
299  
300    // boxLy
301    
302    dx = Hmat[0][1]; dy = Hmat[1][1]; dz = Hmat[2][1];
303    dsq = dx*dx + dy*dy + dz*dz;
304 <  boxLy = sqrt( dsq );
304 >  boxL[1] = sqrt( dsq );
305 >  if( (0.5 * boxL[1]) < maxCutoff ) maxCutoff = 0.5 * boxL[1];
306  
307    // boxLz
308    
309    dx = Hmat[0][2]; dy = Hmat[1][2]; dz = Hmat[2][2];
310    dsq = dx*dx + dy*dy + dz*dz;
311 <  boxLz = sqrt( dsq );
311 >  boxL[2] = sqrt( dsq );
312 >  if( (0.5 * boxL[2]) < maxCutoff ) maxCutoff = 0.5 * boxL[2];
313    
314 +  checkCutOffs();
315 +
316   }
317  
318  
# Line 379 | Line 366 | int SimInfo::getNDF(){
366    ndf = ndf_local;
367   #endif
368  
369 <  ndf = ndf - 3;
369 >  ndf = ndf - 3 - nZconstraints;
370  
371    return ndf;
372   }
# Line 398 | Line 385 | int SimInfo::getNDFraw() {
385  
386    return ndfRaw;
387   }
388 <
388 >
389 > int SimInfo::getNDFtranslational() {
390 >  int ndfTrans_local, ndfTrans;
391 >
392 >  ndfTrans_local = 3 * n_atoms - n_constraints;
393 >
394 > #ifdef IS_MPI
395 >  MPI_Allreduce(&ndfTrans_local,&ndfTrans,1,MPI_INT,MPI_SUM, MPI_COMM_WORLD);
396 > #else
397 >  ndfTrans = ndfTrans_local;
398 > #endif
399 >
400 >  ndfTrans = ndfTrans - 3 - nZconstraints;
401 >
402 >  return ndfTrans;
403 > }
404 >
405   void SimInfo::refreshSim(){
406  
407    simtype fInfo;
408    int isError;
409    int n_global;
410    int* excl;
411 <  
409 <  fInfo.rrf = 0.0;
410 <  fInfo.rt = 0.0;
411 >
412    fInfo.dielect = 0.0;
413  
413  fInfo.rlist = rList;
414  fInfo.rcut = rCut;
415
414    if( useDipole ){
417    fInfo.rrf = ecr;
418    fInfo.rt = ecr - est;
415      if( useReactionField )fInfo.dielect = dielectric;
416    }
417  
# Line 461 | Line 457 | void SimInfo::refreshSim(){
457  
458    this->ndf = this->getNDF();
459    this->ndfRaw = this->getNDFraw();
460 +  this->ndfTrans = this->getNDFtranslational();
461 + }
462 +
463 +
464 + void SimInfo::setRcut( double theRcut ){
465 +
466 +  if( !haveOrigRcut ){
467 +    haveOrigRcut = 1;
468 +    origRcut = theRcut;
469 +  }
470 +
471 +  rCut = theRcut;
472 +  checkCutOffs();
473 + }
474 +
475 + void SimInfo::setEcr( double theEcr ){
476 +
477 +  if( !haveOrigEcr ){
478 +    haveOrigEcr = 1;
479 +    origEcr = theEcr;
480 +  }
481 +
482 +  ecr = theEcr;
483 +  checkCutOffs();
484 + }
485  
486 + void SimInfo::setEcr( double theEcr, double theEst ){
487 +
488 +  est = theEst;
489 +  setEcr( theEcr );
490   }
491  
492 +
493 + void SimInfo::checkCutOffs( void ){
494 +
495 +  int cutChanged = 0;
496 +  
497 +  if( boxIsInit ){
498 +    
499 +    //we need to check cutOffs against the box
500 +    
501 +    if(( maxCutoff > rCut )&&(usePBC)){
502 +      if( rCut < origRcut ){
503 +        rCut = origRcut;
504 +        if (rCut > maxCutoff) rCut = maxCutoff;
505 +        
506 +        sprintf( painCave.errMsg,
507 +                 "New Box size is setting the long range cutoff radius "
508 +                 "to %lf at time %lf\n",
509 +                 rCut, currentTime );
510 +        painCave.isFatal = 0;
511 +        simError();
512 +      }
513 +    }
514 +    
515 +    if( maxCutoff > ecr ){
516 +      if( ecr < origEcr ){
517 +        ecr = origEcr;
518 +        if (ecr > maxCutoff) ecr = maxCutoff;
519 +        
520 +        sprintf( painCave.errMsg,
521 +                 "New Box size is setting the electrostaticCutoffRadius "
522 +                 "to %lf at time %lf\n",
523 +                 ecr, currentTime );
524 +        painCave.isFatal = 0;
525 +        simError();
526 +      }
527 +    }
528 +    
529 +    
530 +    if ((rCut > maxCutoff)&&(usePBC)) {
531 +      sprintf( painCave.errMsg,
532 +               "New Box size is setting the long range cutoff radius "
533 +               "to %lf at time %lf\n",
534 +               maxCutoff, currentTime );
535 +      painCave.isFatal = 0;
536 +      simError();
537 +      rCut = maxCutoff;
538 +    }
539 +    
540 +    if( ecr > maxCutoff){
541 +      sprintf( painCave.errMsg,
542 +               "New Box size is setting the electrostaticCutoffRadius "
543 +               "to %lf at time %lf\n",
544 +               maxCutoff, currentTime  );
545 +      painCave.isFatal = 0;
546 +      simError();      
547 +      ecr = maxCutoff;
548 +    }
549 +
550 +    if( (oldEcr != ecr) || ( oldRcut != rCut ) ) cutChanged = 1;
551 +    
552 +    // rlist is the 1.0 plus max( rcut, ecr )
553 +    
554 +    ( rCut > ecr )? rList = rCut + 1.0: rList = ecr + 1.0;
555 +    
556 +    if( cutChanged ){
557 +      
558 +      notifyFortranCutOffs( &rCut, &rList, &ecr, &est );
559 +    }
560 +    
561 +    oldEcr = ecr;
562 +    oldRcut = rCut;
563 +    
564 +  } else {
565 +    // initialize this stuff before using it, OK?
566 +    sprintf( painCave.errMsg,
567 +             "Trying to check cutoffs without a box. Be smarter.\n" );
568 +    painCave.isFatal = 1;
569 +    simError();      
570 +  }
571 +  
572 + }
573 +
574 + void SimInfo::addProperty(GenericData* prop){
575 +
576 +  map<string, GenericData*>::iterator result;
577 +  result = properties.find(prop->getID());
578 +  
579 +  //we can't simply use  properties[prop->getID()] = prop,
580 +  //it will cause memory leak if we already contain a propery which has the same name of prop
581 +  
582 +  if(result != properties.end()){
583 +    
584 +    delete (*result).second;
585 +    (*result).second = prop;
586 +      
587 +  }
588 +  else{
589 +
590 +    properties[prop->getID()] = prop;
591 +
592 +  }
593 +    
594 + }
595 +
596 + GenericData* SimInfo::getProperty(const string& propName){
597 +
598 +  map<string, GenericData*>::iterator result;
599 +  
600 +  //string lowerCaseName = ();
601 +  
602 +  result = properties.find(propName);
603 +  
604 +  if(result != properties.end())
605 +    return (*result).second;  
606 +  else  
607 +    return NULL;  
608 + }
609 +
610 + vector<GenericData*> SimInfo::getProperties(){
611 +
612 +  vector<GenericData*> result;
613 +  map<string, GenericData*>::iterator i;
614 +  
615 +  for(i = properties.begin(); i != properties.end(); i++)
616 +    result.push_back((*i).second);
617 +    
618 +  return result;
619 + }
620 +
621 + double SimInfo::matTrace3(double m[3][3]){
622 +  double trace;
623 +  trace = m[0][0] + m[1][1] + m[2][2];
624 +
625 +  return trace;
626 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines