[gmx-users] Re: SD temperature coupling groups

A.Rzepiela A.Rzepiela at rug.nl
Tue Jun 30 13:29:11 CEST 2009


Hey!

I think Your problem is from function init_stochd in update.c 
(src/mdlib).
When You set tau_t to 0 You got division by 0 on line 288:

for(n=0; n<ngtc; n++) {
       sdc[n].gdt = ir->delta_t/ir->opts.tau_t[n];
       sdc[n].eph = exp(sdc[n].gdt/2);
       sdc[n].emh = exp(-sdc[n].gdt/2);
       sdc[n].em  = exp(-sdc[n].gdt);

I think the easiest solution, I checked it for sd1, is to change in 
do_update_sd1 (update.c) following lines

     for(d=0; d<DIM; d++) {
       if((ptype[n] != eptVSite) && (ptype[n] != eptShell) && 
!nFreeze[gf][d]) {
         sd_V = ism*sig[gt].V*gmx_rng_gaussian_table(gaussrand);

         v[n][d] = v[n][d]*sdc[gt].em
           + (invmass[n]*f[n][d] + accel[ga][d])*tau_t[gt]*(1 - 
sdc[gt].em)
           + sd_V;

         xprime[n][d] = x[n][d] + v[n][d]*dt;
       } else {
         v[n][d]      = 0.0;
         xprime[n][d] = x[n][d];
       }
     }


to

    for(d=0; d<DIM; d++) {
       if((ptype[n] != eptVSite) && (ptype[n] != eptShell) && 
!nFreeze[gf][d] && (tau_t[gt] != 0.0)) {
         sd_V = ism*sig[gt].V*gmx_rng_gaussian_table(gaussrand);
         v[n][d] = v[n][d]*sdc[gt].em
           + (invmass[n]*f[n][d] + accel[ga][d])*tau_t[gt]*(1 - 
sdc[gt].em)
           + sd_V;

         xprime[n][d] = x[n][d] + v[n][d]*dt;
       } else  {
               if((ptype[n] != eptVSite) && (ptype[n] != eptShell) && 
!nFreeze[gf][d]){
                  v[n][d]      = v[n][d] + (invmass[n]*f[n][d] + 
accel[ga][d])*dt;
                  xprime[n][d] = x[n][d] + v[n][d]*dt ;
               }
               else {
                  v[n][d] = 0;
                  xprime[n][d] = x[n][d]; }
       }
     }

You can do similar change  for sd2.
Hope somebody corrects me if I am wrong.
Greetings
Andrzej
  



More information about the gromacs.org_gmx-users mailing list