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 770 by gezelter, Fri Sep 19 14:55:41 2003 UTC vs.
Revision 781 by tim, Mon Sep 22 23:07:57 2003 UTC

# Line 48 | Line 48 | SimInfo::SimInfo(){
48    haveOrigEcr = 0;
49    boxIsInit = 0;
50    
51 +  resetTime = 1e99;
52    
53  
54    usePBC = 0;
# Line 279 | Line 280 | void SimInfo::printMat9(double A[9] ){
280              << "[ " << A[0] << ", " << A[1] << ", " << A[2] << " ]\n"
281              << "[ " << A[3] << ", " << A[4] << ", " << A[5] << " ]\n"
282              << "[ " << A[6] << ", " << A[7] << ", " << A[8] << " ]\n";
283 + }
284 +
285 +
286 + void SimInfo::crossProduct3(double a[3],double b[3], double out[3]){
287 +
288 +      out[0] = a[1] * b[2] - a[2] * b[1];
289 +      out[1] = a[2] * b[0] - a[0] * b[2] ;
290 +      out[2] = a[0] * b[1] - a[1] * b[0];
291 +      
292 + }
293 +
294 + double SimInfo::dotProduct3(double a[3], double b[3]){
295 +  return a[0]*b[0] + a[1]*b[1]+ a[2]*b[2];
296 + }
297 +
298 + double SimInfo::length3(double a[3]){
299 +  return sqrt(a[0]*a[0] + a[1]*a[1] + a[2]*a[2]);
300   }
301  
302   void SimInfo::calcBoxL( void ){
# Line 295 | Line 313 | void SimInfo::calcBoxL( void ){
313    dx = Hmat[0][0]; dy = Hmat[1][0]; dz = Hmat[2][0];
314    dsq = dx*dx + dy*dy + dz*dz;
315    boxL[0] = sqrt( dsq );
316 <  maxCutoff = 0.5 * boxL[0];
316 >  //maxCutoff = 0.5 * boxL[0];
317  
318    // boxLy
319    
320    dx = Hmat[0][1]; dy = Hmat[1][1]; dz = Hmat[2][1];
321    dsq = dx*dx + dy*dy + dz*dz;
322    boxL[1] = sqrt( dsq );
323 <  if( (0.5 * boxL[1]) < maxCutoff ) maxCutoff = 0.5 * boxL[1];
323 >  //if( (0.5 * boxL[1]) < maxCutoff ) maxCutoff = 0.5 * boxL[1];
324  
325 +
326    // boxLz
327    
328    dx = Hmat[0][2]; dy = Hmat[1][2]; dz = Hmat[2][2];
329    dsq = dx*dx + dy*dy + dz*dz;
330    boxL[2] = sqrt( dsq );
331 <  if( (0.5 * boxL[2]) < maxCutoff ) maxCutoff = 0.5 * boxL[2];
331 >  //if( (0.5 * boxL[2]) < maxCutoff ) maxCutoff = 0.5 * boxL[2];
332 >
333 >  //calculate the max cutoff
334 >  maxCutoff =  calcMaxCutOff();
335    
336    checkCutOffs();
337  
338   }
339  
340  
341 + double SimInfo::calcMaxCutOff(){
342 +
343 +  double ri[3], rj[3], rk[3];
344 +  double rij[3], rjk[3], rki[3];
345 +  double minDist;
346 +
347 +  ri[0] = Hmat[0][0];
348 +  ri[1] = Hmat[1][0];
349 +  ri[2] = Hmat[2][0];
350 +
351 +  rj[0] = Hmat[0][1];
352 +  rj[1] = Hmat[1][1];
353 +  rj[2] = Hmat[2][1];
354 +
355 +  rk[0] = Hmat[0][2];
356 +  rk[1] = Hmat[1][2];
357 +  rk[2] = Hmat[2][2];
358 +  
359 +  crossProduct3(ri,rj, rij);
360 +  distXY = dotProduct3(rk,rij) / length3(rij);
361 +
362 +  crossProduct3(rj,rk, rjk);
363 +  distYZ = dotProduct3(ri,rjk) / length3(rjk);
364 +
365 +  crossProduct3(rk,ri, rki);
366 +  distZX = dotProduct3(rj,rki) / length3(rki);
367 +
368 +  minDist = min(min(distXY, distYZ), distZX);
369 +  return minDist/2;
370 +  
371 + }
372 +
373   void SimInfo::wrapVector( double thePos[3] ){
374  
375    int i, j, k;
# Line 497 | Line 551 | void SimInfo::checkCutOffs( void ){
551    if( boxIsInit ){
552      
553      //we need to check cutOffs against the box
554 <    
554 >
555 >    //detect the change of rCut
556      if(( maxCutoff > rCut )&&(usePBC)){
557        if( rCut < origRcut ){
558 <        rCut = origRcut;
559 <        if (rCut > maxCutoff) rCut = maxCutoff;
560 <        
561 <        sprintf( painCave.errMsg,
562 <                 "New Box size is setting the long range cutoff radius "
563 <                 "to %lf at time %lf\n",
564 <                 rCut, currentTime );
565 <        painCave.isFatal = 0;
566 <        simError();
558 >        rCut = origRcut;
559 >        
560 >        if (rCut > maxCutoff)
561 >          rCut = maxCutoff;
562 >  
563 >          sprintf( painCave.errMsg,
564 >                    "New Box size is setting the long range cutoff radius "
565 >                    "to %lf at time %lf\n",
566 >                    rCut, currentTime );
567 >          painCave.isFatal = 0;
568 >          simError();
569        }
570      }
571 <    
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)) {
571 >    else if ((rCut > maxCutoff)&&(usePBC)) {
572        sprintf( painCave.errMsg,
573                 "New Box size is setting the long range cutoff radius "
574 <               "to %lf at time %lf\n",
574 >               "to %lf at time %lf\n",
575                 maxCutoff, currentTime );
576        painCave.isFatal = 0;
577        simError();
578        rCut = maxCutoff;
579      }
580 <    
581 <    if( ecr > maxCutoff){
580 >
581 >
582 >    //detect the change of ecr
583 >    if( maxCutoff > ecr ){
584 >      if( ecr < origEcr ){
585 >        ecr = origEcr;
586 >        if (ecr > maxCutoff) ecr = maxCutoff;
587 >  
588 >          sprintf( painCave.errMsg,
589 >                    "New Box size is setting the electrostaticCutoffRadius "
590 >                    "to %lf at time %lf\n",
591 >                    ecr, currentTime );
592 >            painCave.isFatal = 0;
593 >            simError();
594 >      }
595 >    }
596 >    else if( ecr > maxCutoff){
597        sprintf( painCave.errMsg,
598                 "New Box size is setting the electrostaticCutoffRadius "
599                 "to %lf at time %lf\n",

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines