ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/Verlet.cpp
(Generate patch)

Comparing:
branches/mmeineke/OOPSE/libmdtools/Verlet.cpp (file contents), Revision 377 by mmeineke, Fri Mar 21 17:42:12 2003 UTC vs.
trunk/OOPSE/libmdtools/Verlet.cpp (file contents), Revision 483 by gezelter, Wed Apr 9 04:06:43 2003 UTC

# Line 7 | Line 7
7   #include "SimInfo.hpp"
8   #include "Thermo.hpp"
9   #include "ReadWrite.hpp"
10 + #include "ExtendedSystem.hpp"
11  
12   extern "C"{
13    
# Line 29 | Line 30 | Verlet::Verlet( SimInfo &info, ForceFields* the_ff ){
30   }
31  
32    
33 < Verlet::Verlet( SimInfo &info, ForceFields* the_ff ){
33 > Verlet::Verlet( SimInfo &info, ForceFields* the_ff, ExtendedSystem* the_es ){
34    
35    // get what information we need from the SimInfo object
36  
37    entry_plug = &info;
38    myFF = the_ff;
39 <
40 <
39 >  myES = the_es;
40 >  
41    c_natoms = info.n_atoms;
42    c_atoms = info.atoms;
43 <  c_sr_interactions = info.sr_interactions;
44 <  c_n_SRI = info.n_SRI;
43 >  nMols = info.n_mol;
44 >  molecules = info.molecules;
45    c_is_constrained = 0;
46    c_box_x = info.box_x;
47    c_box_y = info.box_y;
# Line 67 | Line 68 | Verlet::Verlet( SimInfo &info, ForceFields* the_ff ){
68  
69    Constraint *temp_con;
70    Constraint *dummy_plug;
71 <  temp_con = new Constraint[c_n_SRI];
71 >  temp_con = new Constraint[info.n_SRI];
72  
73    c_n_constrained = 0;
74    int constrained = 0;
75 <  
76 <  for(int i = 0; i < c_n_SRI; i++){
75 >  SRI** theArray;
76 >  for(int i = 0; i < nMols; i++){
77      
78 <    constrained = c_sr_interactions[i]->is_constrained();
78 >    theArray = (SRI**) molecules[i].getMyBonds();
79 >    for(int j=0; j<molecules[i].getNBonds(); j++){
80 >      
81 >      constrained = theArray[j]->is_constrained();
82 >      
83 >      if(constrained){
84 >        
85 >        dummy_plug = theArray[j]->get_constraint();
86 >        temp_con[c_n_constrained].set_a( dummy_plug->get_a() );
87 >        temp_con[c_n_constrained].set_b( dummy_plug->get_b() );
88 >        temp_con[c_n_constrained].set_dsqr( dummy_plug->get_dsqr() );
89 >        
90 >        c_n_constrained++;
91 >        constrained = 0;
92 >      }
93 >    }
94  
95 <    if(constrained){
95 >    theArray = (SRI**) molecules[i].getMyBends();
96 >    for(int j=0; j<molecules[i].getNBends(); j++){
97        
98 <      dummy_plug = c_sr_interactions[i]->get_constraint();
99 <      temp_con[c_n_constrained].set_a( dummy_plug->get_a() );
100 <      temp_con[c_n_constrained].set_b( dummy_plug->get_b() );
101 <      temp_con[c_n_constrained].set_dsqr( dummy_plug->get_dsqr() );
98 >      constrained = theArray[j]->is_constrained();
99 >      
100 >      if(constrained){
101 >        
102 >        dummy_plug = theArray[j]->get_constraint();
103 >        temp_con[c_n_constrained].set_a( dummy_plug->get_a() );
104 >        temp_con[c_n_constrained].set_b( dummy_plug->get_b() );
105 >        temp_con[c_n_constrained].set_dsqr( dummy_plug->get_dsqr() );
106 >        
107 >        c_n_constrained++;
108 >        constrained = 0;
109 >      }
110 >    }
111  
112 <      c_n_constrained++;
113 <      constrained = 0;
112 >    theArray = (SRI**) molecules[i].getMyTorsions();
113 >    for(int j=0; j<molecules[i].getNTorsions(); j++){
114 >      
115 >      constrained = theArray[j]->is_constrained();
116 >      
117 >      if(constrained){
118 >        
119 >        dummy_plug = theArray[j]->get_constraint();
120 >        temp_con[c_n_constrained].set_a( dummy_plug->get_a() );
121 >        temp_con[c_n_constrained].set_b( dummy_plug->get_b() );
122 >        temp_con[c_n_constrained].set_dsqr( dummy_plug->get_dsqr() );
123 >        
124 >        c_n_constrained++;
125 >        constrained = 0;
126 >      }
127      }
128 +
129 +
130    }
131  
132    if(c_n_constrained > 0){
# Line 94 | Line 135 | Verlet::Verlet( SimInfo &info, ForceFields* the_ff ){
135      c_constrained_i = new int[c_n_constrained];
136      c_constrained_j = new int[c_n_constrained];
137      c_constrained_dsqr = new double[c_n_constrained];
138 <
138 >    
139      for( int i = 0; i < c_n_constrained; i++){
140        
141        /* add 1 to the index for the fortran arrays. */
142 <
142 >      
143        c_constrained_i[i] = temp_con[i].get_a() + 1;
144        c_constrained_j[i] = temp_con[i].get_b() + 1;
145        c_constrained_dsqr[i] = temp_con[i].get_dsqr();
# Line 126 | Line 167 | void Verlet::integrate( void ){
167   void Verlet::integrate( void ){
168    
169    int i, j; /* loop counters */
170 <  int calcPot;
170 >  int calcPot, calcStress;
171  
172    double kE;
173  
# Line 144 | Line 185 | void Verlet::integrate( void ){
185    
186    int time;
187  
188 +  double press[9];
189 +
190    double dt = entry_plug->dt;
191    double runTime = entry_plug->run_time;
192    double sampleTime = entry_plug->sampleTime;
# Line 161 | Line 204 | void Verlet::integrate( void ){
204    DumpWriter*  dump_out = new DumpWriter( entry_plug );
205  
206    // the first time integrate is called, the forces need to be initialized
164
207    
208 <  myFF->doForces(1,0);
208 >  myFF->doForces(1,1);
209    
210    if( entry_plug->setTemp ){
211      tStats->velocitize();
# Line 175 | Line 217 | void Verlet::integrate( void ){
217  
218    calcPot = 0;
219  
220 +  if (!strcasecmp( entry_plug->ensemble, "NPT")) {
221 +    calcStress = 1;
222 +  } else {
223 +    calcStress = 0;
224 +  }
225 +
226    if( c_is_constrained ){
227      for(i = 0; i < n_loops; i++){
228        
229 +      if (!strcasecmp( entry_plug->ensemble, "NVT"))
230 +        myES->NoseHooverNVT( dt / 2.0 , tStats->getKinetic() );
231 +      
232        // fill R, V, and F arrays and RATTLE in fortran
233 <
233 >      
234        for( j=0; j<c_natoms; j++ ){
235 <
235 >        
236          Rx[j] = c_atoms[j]->getX();
237          Ry[j] = c_atoms[j]->getY();
238          Rz[j] = c_atoms[j]->getZ();
# Line 215 | Line 266 | void Verlet::integrate( void ){
266  
267        // calculate the forces
268        
269 <      myFF->doForces(calcPot,0);
269 >      myFF->doForces(calcPot,calcStress);
270        
271        // finish the constrain move ( same as above. )
272  
# Line 234 | Line 285 | void Verlet::integrate( void ){
285          Fz[j] = c_atoms[j]->getFz();
286        }
287          
288 +
289        v_constrain_b_( dt, c_natoms, c_mass, Rx, Ry, Rz, Vx, Vy, Vz,
290                        Fx, Fy, Fz,
291                        kE, c_n_constrained, c_constrained_dsqr,
# Line 251 | Line 303 | void Verlet::integrate( void ){
303          c_atoms[j]->set_vz(Vz[j]);
304        }
305        
306 +      if (!strcasecmp( entry_plug->ensemble, "NVT"))
307 +        myES->NoseHooverNVT( dt / 2.0, tStats->getKinetic() );
308 +      
309 +      if (!strcasecmp( entry_plug->ensemble, "NPT") ) {        
310 +        tStats->getPressureTensor(press);
311 +        myES->NoseHooverAndersonNPT( dt,
312 +                                     tStats->getKinetic(),
313 +                                     press);
314 +      }
315 +
316        time = i + 1;
317        
318        if( entry_plug->setTemp ){
319          if( !(time % vel_n) ) tStats->velocitize();
320        }
321        if( !(time % sample_n) ) dump_out->writeDump( time * dt );
322 <      if( !((time+1) % status_n) ) calcPot = 1;
323 <      if( !(time % status_n) ){ e_out->writeStat( time * dt ); calcPot = 0; }
322 >
323 >      if( !((time+1) % status_n) ) {
324 >        calcPot = 1;
325 >        calcStress = 1;
326 >      }
327 >      if( !(time % status_n) ){
328 >        e_out->writeStat( time * dt );
329 >        calcPot = 0;
330 >        if (!strcasecmp(entry_plug->ensemble, "NPT")) calcStress = 1;
331 >        else calcStress = 0;
332 >      }
333      }
334    }
335    else{
336      for(i = 0; i < n_loops; i++){
337 <      
337 >
338 >      if (!strcasecmp( entry_plug->ensemble, "NVT"))
339 >        myES->NoseHooverNVT( dt / 2.0, tStats->getKinetic() );
340 >    
341        move_a( dt );
342        
343        // calculate the forces
344        
345 <      myFF->doForces(calcPot,0);
345 >      myFF->doForces(calcPot,calcStress);
346              
347        // complete the verlet move
348        
349        move_b( dt );
350  
351 +      if (!strcasecmp( entry_plug->ensemble, "NVT"))
352 +        myES->NoseHooverNVT( dt / 2.0 , tStats->getKinetic() );
353 +
354 +      if (!strcasecmp( entry_plug->ensemble, "NPT") ) {
355 +        tStats->getPressureTensor(press);
356 +        myES->NoseHooverAndersonNPT( dt,
357 +                                     tStats->getKinetic(),
358 +                                     press);
359 +      }
360 +
361        time = i + 1;
362        
363        if( entry_plug->setTemp ){
364          if( !(time % vel_n) ) tStats->velocitize();
365        }
366        if( !(time % sample_n) )  dump_out->writeDump( time * dt );
367 <      if( !((time+1) % status_n) ) calcPot = 1;
368 <      if( !(time % status_n) ){ e_out->writeStat( time * dt ); calcPot = 0; }
367 >      if( !((time+1) % status_n) ) {
368 >        calcPot = 1;
369 >        calcStress = 1;
370 >      }
371 >      if( !(time % status_n) ){
372 >        e_out->writeStat( time * dt );
373 >        calcPot = 0;
374 >        if (!strcasecmp(entry_plug->ensemble, "NPT")) calcStress = 1;
375 >        else calcStress = 0;
376 >      }
377      }
378    }
379    

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines