Changeset 1f591b for molecuilder/src/molecule_dynamics.cpp
- Timestamp:
- Apr 13, 2010, 1:22:42 PM (16 years ago)
- Children:
- e7ea64
- Parents:
- 0f55b2
- File:
-
- 1 edited
-
molecuilder/src/molecule_dynamics.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
molecuilder/src/molecule_dynamics.cpp
r0f55b2 r1f591b 39 39 // determine normalized trajectories direction vector (n1, n2) 40 40 Sprinter = Params.PermutationMap[Walker->nr]; // find first target point 41 trajectory1.CopyVector(&Sprinter->Trajectory.R.at(Params.endstep)); 42 trajectory1.SubtractVector(&Walker->Trajectory.R.at(Params.startstep)); 41 trajectory1 = Sprinter->Trajectory.R.at(Params.endstep) - Walker->Trajectory.R.at(Params.startstep); 43 42 trajectory1.Normalize(); 44 43 Norm1 = trajectory1.Norm(); 45 44 Sprinter = Params.PermutationMap[Runner->nr]; // find second target point 46 trajectory2.CopyVector(&Sprinter->Trajectory.R.at(Params.endstep)); 47 trajectory2.SubtractVector(&Runner->Trajectory.R.at(Params.startstep)); 45 trajectory2 = Sprinter->Trajectory.R.at(Params.endstep) - Runner->Trajectory.R.at(Params.startstep); 48 46 trajectory2.Normalize(); 49 47 Norm2 = trajectory1.Norm(); 50 48 // check whether either is zero() 51 49 if ((Norm1 < MYEPSILON) && (Norm2 < MYEPSILON)) { 52 tmp = Walker->Trajectory.R.at(Params.startstep).Distance( &Runner->Trajectory.R.at(Params.startstep));50 tmp = Walker->Trajectory.R.at(Params.startstep).Distance(Runner->Trajectory.R.at(Params.startstep)); 53 51 } else if (Norm1 < MYEPSILON) { 54 52 Sprinter = Params.PermutationMap[Walker->nr]; // find first target point 55 trajectory1.CopyVector(&Sprinter->Trajectory.R.at(Params.endstep)); // copy first offset 56 trajectory1.SubtractVector(&Runner->Trajectory.R.at(Params.startstep)); // subtract second offset 57 trajectory2.Scale( trajectory1.ScalarProduct(&trajectory2) ); // trajectory2 is scaled to unity, hence we don't need to divide by anything 58 trajectory1.SubtractVector(&trajectory2); // project the part in norm direction away 53 trajectory1 = Sprinter->Trajectory.R.at(Params.endstep) - Runner->Trajectory.R.at(Params.startstep); 54 trajectory2 *= trajectory1.ScalarProduct(trajectory2); // trajectory2 is scaled to unity, hence we don't need to divide by anything 55 trajectory1 -= trajectory2; // project the part in norm direction away 59 56 tmp = trajectory1.Norm(); // remaining norm is distance 60 57 } else if (Norm2 < MYEPSILON) { 61 58 Sprinter = Params.PermutationMap[Runner->nr]; // find second target point 62 trajectory2.CopyVector(&Sprinter->Trajectory.R.at(Params.endstep)); // copy second offset 63 trajectory2.SubtractVector(&Walker->Trajectory.R.at(Params.startstep)); // subtract first offset 64 trajectory1.Scale( trajectory2.ScalarProduct(&trajectory1) ); // trajectory1 is scaled to unity, hence we don't need to divide by anything 65 trajectory2.SubtractVector(&trajectory1); // project the part in norm direction away 59 trajectory2 = Sprinter->Trajectory.R.at(Params.endstep) - Walker->Trajectory.R.at(Params.startstep); // copy second offset 60 trajectory1 *= trajectory2.ScalarProduct(trajectory1); // trajectory1 is scaled to unity, hence we don't need to divide by anything 61 trajectory2 -= trajectory1; // project the part in norm direction away 66 62 tmp = trajectory2.Norm(); // remaining norm is distance 67 } else if ((fabs(trajectory1.ScalarProduct( &trajectory2)/Norm1/Norm2) - 1.) < MYEPSILON) { // check whether they're linear dependent63 } else if ((fabs(trajectory1.ScalarProduct(trajectory2)/Norm1/Norm2) - 1.) < MYEPSILON) { // check whether they're linear dependent 68 64 // Log() << Verbose(3) << "Both trajectories of " << *Walker << " and " << *Runner << " are linear dependent: "; 69 65 // Log() << Verbose(0) << trajectory1; 70 66 // Log() << Verbose(0) << " and "; 71 67 // Log() << Verbose(0) << trajectory2; 72 tmp = Walker->Trajectory.R.at(Params.startstep).Distance( &Runner->Trajectory.R.at(Params.startstep));68 tmp = Walker->Trajectory.R.at(Params.startstep).Distance(Runner->Trajectory.R.at(Params.startstep)); 73 69 // Log() << Verbose(0) << " with distance " << tmp << "." << endl; 74 70 } else { // determine distance by finding minimum distance … … 97 93 // Log() << Verbose(0) << " with distance " << tmp << "." << endl; 98 94 // test whether we really have the intersection (by checking on c_1 and c_2) 99 TestVector.CopyVector(&Runner->Trajectory.R.at(Params.startstep));95 trajectory1.Scale(gsl_vector_get(x,0)); 100 96 trajectory2.Scale(gsl_vector_get(x,1)); 101 TestVector.AddVector(&trajectory2);102 97 normal.Scale(gsl_vector_get(x,2)); 103 TestVector.AddVector(&normal); 104 TestVector.SubtractVector(&Walker->Trajectory.R.at(Params.startstep)); 105 trajectory1.Scale(gsl_vector_get(x,0)); 106 TestVector.SubtractVector(&trajectory1); 98 TestVector = Runner->Trajectory.R.at(Params.startstep) + trajectory2 + normal 99 - (Walker->Trajectory.R.at(Params.startstep) + trajectory1); 107 100 if (TestVector.Norm() < MYEPSILON) { 108 101 // Log() << Verbose(2) << "Test: ok.\tDistance of " << tmp << " is correct." << endl; … … 173 166 // first term: distance to target 174 167 Runner = Params.PermutationMap[Walker->nr]; // find target point 175 tmp = (Walker->Trajectory.R.at(Params.startstep).Distance( &Runner->Trajectory.R.at(Params.endstep)));168 tmp = (Walker->Trajectory.R.at(Params.startstep).Distance(Runner->Trajectory.R.at(Params.endstep))); 176 169 tmp *= Params.IsAngstroem ? 1. : 1./AtomicLengthToAngstroem; 177 170 result += Params.PenaltyConstants[0] * tmp; … … 232 225 while(Runner->next != mol->end) { 233 226 Runner = Runner->next; 234 Params.DistanceList[Walker->nr]->insert( DistancePair(Walker->Trajectory.R.at(Params.startstep).Distance( &Runner->Trajectory.R.at(Params.endstep)), Runner) );227 Params.DistanceList[Walker->nr]->insert( DistancePair(Walker->Trajectory.R.at(Params.startstep).Distance(Runner->Trajectory.R.at(Params.endstep)), Runner) ); 235 228 } 236 229 }
Note:
See TracChangeset
for help on using the changeset viewer.
