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 669 by chuckv, Thu Aug 7 00:47:33 2003 UTC

# Line 33 | Line 33 | SimInfo::SimInfo(){
33    the_integrator = NULL;
34    setTemp = 0;
35    thermalTime = 0.0;
36 +  currentTime = 0.0;
37    rCut = 0.0;
38 +  ecr = 0.0;
39 +  est = 0.0;
40 +  oldEcr = 0.0;
41 +  oldRcut = 0.0;
42  
43 +  haveOrigRcut = 0;
44 +  haveOrigEcr = 0;
45 +  boxIsInit = 0;
46 +  
47 +  
48 +
49    usePBC = 0;
50    useLJ = 0;
51    useSticky = 0;
# Line 46 | Line 57 | void SimInfo::setBox(double newBox[3]) {
57    wrapMeSimInfo( this );
58   }
59  
60 + SimInfo::~SimInfo(){
61 +
62 +  map<string, GenericData*>::iterator i;
63 +  
64 +  for(i = properties.begin(); i != properties.end(); i++)
65 +    delete (*i).second;
66 +
67 +  
68 + }
69 +
70   void SimInfo::setBox(double newBox[3]) {
71    
72    int i, j;
# Line 73 | Line 94 | void SimInfo::setBoxM( double theBox[3][3] ){
94                           // [ 2 5 8 ]
95    double FortranHmatInv[9]; // the inverted Hmat (for Fortran);
96  
97 +  
98 +  if( !boxIsInit ) boxIsInit = 1;
99  
100    for(i=0; i < 3; i++)
101      for (j=0; j < 3; j++) Hmat[i][j] = theBox[i][j];
102    
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
103    calcBoxL();
104    calcHmatInv();
105  
# Line 95 | Line 112 | void SimInfo::setBoxM( double theBox[3][3] ){
112  
113    setFortranBoxSize(FortranHmat, FortranHmatInv, &orthoRhombic);
114  
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  }
115   }
116  
117  
# Line 153 | Line 127 | void SimInfo::scaleBox(double scale) {
127    double theBox[3][3];
128    int i, j;
129  
130 <  cerr << "Scaling box by " << scale << "\n";
130 >  // cerr << "Scaling box by " << scale << "\n";
131  
132    for(i=0; i<3; i++)
133      for (j=0; j<3; j++) theBox[i][j] = Hmat[i][j]*scale;
# Line 312 | Line 286 | void SimInfo::calcBoxL( void ){
286    
287    dx = Hmat[0][0]; dy = Hmat[1][0]; dz = Hmat[2][0];
288    dsq = dx*dx + dy*dy + dz*dz;
289 <  boxLx = sqrt( dsq );
289 >  boxL[0] = sqrt( dsq );
290 >  maxCutoff = 0.5 * boxL[0];
291  
292    // boxLy
293    
294    dx = Hmat[0][1]; dy = Hmat[1][1]; dz = Hmat[2][1];
295    dsq = dx*dx + dy*dy + dz*dz;
296 <  boxLy = sqrt( dsq );
296 >  boxL[1] = sqrt( dsq );
297 >  if( (0.5 * boxL[1]) < maxCutoff ) maxCutoff = 0.5 * boxL[1];
298  
299    // boxLz
300    
301    dx = Hmat[0][2]; dy = Hmat[1][2]; dz = Hmat[2][2];
302    dsq = dx*dx + dy*dy + dz*dz;
303 <  boxLz = sqrt( dsq );
303 >  boxL[2] = sqrt( dsq );
304 >  if( (0.5 * boxL[2]) < maxCutoff ) maxCutoff = 0.5 * boxL[2];
305    
306 +  checkCutOffs();
307 +
308   }
309  
310  
# Line 405 | Line 384 | void SimInfo::refreshSim(){
384    int isError;
385    int n_global;
386    int* excl;
387 <  
409 <  fInfo.rrf = 0.0;
410 <  fInfo.rt = 0.0;
387 >
388    fInfo.dielect = 0.0;
389  
413  fInfo.rlist = rList;
414  fInfo.rcut = rCut;
415
390    if( useDipole ){
417    fInfo.rrf = ecr;
418    fInfo.rt = ecr - est;
391      if( useReactionField )fInfo.dielect = dielectric;
392    }
393  
# Line 461 | Line 433 | void SimInfo::refreshSim(){
433  
434    this->ndf = this->getNDF();
435    this->ndfRaw = this->getNDFraw();
436 +
437 + }
438 +
439 +
440 + void SimInfo::setRcut( double theRcut ){
441 +
442 +  if( !haveOrigRcut ){
443 +    haveOrigRcut = 1;
444 +    origRcut = theRcut;
445 +  }
446 +
447 +  rCut = theRcut;
448 +  checkCutOffs();
449 + }
450 +
451 + void SimInfo::setEcr( double theEcr ){
452 +
453 +  if( !haveOrigEcr ){
454 +    haveOrigEcr = 1;
455 +    origEcr = theEcr;
456 +  }
457 +
458 +  ecr = theEcr;
459 +  checkCutOffs();
460 + }
461 +
462 + void SimInfo::setEcr( double theEcr, double theEst ){
463 +
464 +  est = theEst;
465 +  setEcr( theEcr );
466 + }
467 +
468  
469 + void SimInfo::checkCutOffs( void ){
470 +
471 +  int cutChanged = 0;
472 +
473 +
474 +
475 +  if( boxIsInit ){
476 +    
477 +    //we need to check cutOffs against the box
478 +  
479 +    if(( maxCutoff > rCut )&&(usePBC)){
480 +      if( rCut < origRcut ){
481 +        rCut = origRcut;
482 +        if (rCut > maxCutoff) rCut = maxCutoff;
483 +        
484 +        sprintf( painCave.errMsg,
485 +                 "New Box size is setting the long range cutoff radius "
486 +                 "to %lf\n",
487 +                 rCut );
488 +        painCave.isFatal = 0;
489 +        simError();
490 +      }
491 +    }
492 +
493 +    if( maxCutoff > ecr ){
494 +      if( ecr < origEcr ){
495 +        rCut = origEcr;
496 +        if (ecr > maxCutoff) ecr = maxCutoff;
497 +        
498 +        sprintf( painCave.errMsg,
499 +                 "New Box size is setting the electrostaticCutoffRadius "
500 +                 "to %lf\n",
501 +                 ecr );
502 +        painCave.isFatal = 0;
503 +        simError();
504 +      }
505 +    }
506 +
507 +
508 +    if ((rCut > maxCutoff)&&(usePBC)) {
509 +      sprintf( painCave.errMsg,
510 +               "New Box size is setting the long range cutoff radius "
511 +               "to %lf\n",
512 +               maxCutoff );
513 +      painCave.isFatal = 0;
514 +      simError();
515 +      rCut = maxCutoff;
516 +    }
517 +
518 +    if( ecr > maxCutoff){
519 +      sprintf( painCave.errMsg,
520 +               "New Box size is setting the electrostaticCutoffRadius "
521 +               "to %lf\n",
522 +               maxCutoff  );
523 +      painCave.isFatal = 0;
524 +      simError();      
525 +      ecr = maxCutoff;
526 +    }
527 +
528 +    
529 +  }
530 +  
531 +
532 +  if( (oldEcr != ecr) || ( oldRcut != rCut ) ) cutChanged = 1;
533 +
534 +  // rlist is the 1.0 plus max( rcut, ecr )
535 +  
536 +  ( rCut > ecr )? rList = rCut + 1.0: rList = ecr + 1.0;
537 +
538 +  if( cutChanged ){
539 +    
540 +    notifyFortranCutOffs( &rCut, &rList, &ecr, &est );
541 +  }
542 +
543 +  oldEcr = ecr;
544 +  oldRcut = rCut;
545   }
546  
547 + void SimInfo::addProperty(GenericData* prop){
548 +
549 +  map<string, GenericData*>::iterator result;
550 +  result = properties.find(prop->getID());
551 +  
552 +  //we can't simply use  properties[prop->getID()] = prop,
553 +  //it will cause memory leak if we already contain a propery which has the same name of prop
554 +  
555 +  if(result != properties.end()){
556 +    
557 +    delete (*result).second;
558 +    (*result).second = prop;
559 +      
560 +  }
561 +  else{
562 +
563 +    properties[prop->getID()] = prop;
564 +
565 +  }
566 +    
567 + }
568 +
569 + GenericData* SimInfo::getProperty(const string& propName){
570 +
571 +  map<string, GenericData*>::iterator result;
572 +  
573 +  //string lowerCaseName = ();
574 +  
575 +  result = properties.find(propName);
576 +  
577 +  if(result != properties.end())
578 +    return (*result).second;  
579 +  else  
580 +    return NULL;  
581 + }
582 +
583 + vector<GenericData*> SimInfo::getProperties(){
584 +
585 +  vector<GenericData*> result;
586 +  map<string, GenericData*>::iterator i;
587 +  
588 +  for(i = properties.begin(); i != properties.end(); i++)
589 +    result.push_back((*i).second);
590 +    
591 +  return result;
592 + }
593 +
594 +

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines