[gmx-developers] Help needed with hacking mdrun

Mark Abraham Mark.Abraham at anu.edu.au
Fri Apr 8 04:25:49 CEST 2011


On 7/04/2011 11:22 PM, Semen Esilevsky wrote:
>
>
> ------------------------------------------------------------------------
> *From:* Mark Abraham <Mark.Abraham at anu.edu.au>
> *To:* Discussion list for GROMACS development <gmx-developers at gromacs.org>
> *Sent:* Thu, April 7, 2011 3:16:05 PM
> *Subject:* Re: [gmx-developers] Help needed with hacking mdrun
>
> On 7/04/2011 7:11 PM, Semen Esilevsky wrote:
> > Dear All,
> > I need to hack mdrun in rather complex way and need some help from 
> people, who
> > understand Gromacs internals really well.
> > My  problem is the following. Each N MD steps I want to pass current
> > coordinates and forces to custom function, which transforms them in 
> a  certain
> > way (doesn't matter how at this point). Then I want to pass  
> modified forces and
> >
> > coordinates back and continue simulation. Currently I  got stuck 
> with domain
> > decomposition stuff. I figured out how to collect  data on master 
> node and pass
> > it to my function. However,  I have no  idea how to distribute it 
> back to all
> > nodes correctly after  modification.
> > Here is my additional code in md.c  so far:
> >
> > ...
> > /* ########  END FIRST UPDATE STEP  ############## */
> > /* ########  If doing VV, we now have v(dt)  ###### */
> >
> >  /* ################## START TRAJECTORY OUTPUT ################# */
> >
> > /* Some preparations goes here */
> > ...
> > /* Collecting data*/
> > if (DOMAINDECOMP(cr))
> >      {
> >          /*We need to collect x and f only*/
> >          
> dd_collect_vec(cr->dd,state_local,state_local->x,state_global->x);
> >          dd_collect_vec(cr->dd,state_local,f_local,f_global);
> >      }
> >
> > if (MASTER(cr))
> >      {
> >          printf("Collected %d atoms at step: 
> %d\n",top_global->natoms,step);
> >          /* Actually pass data */
> >          pass_to(top_global->natoms, t, state_global->x, f_global);
> >          ...
> >          /* Processing data here */
> >          ...
> >        /*  Get data back */
> >        pass_from(state_global->x, f_global);
> >      }
> > ...
> > if (DOMAINDECOMP(cr)){
> >      /* Here I have to redistribute it back from state_global->x and 
> I'm totally
> > stuck :(  */
> > }
> >
> > The problem is that functions like dd_distribute_vector(...) are 
> only used
> > deep inside domain decomposition code and they use some data 
> structures, which
> > are not exposed in .h files.
>
> dd_collect_vec() calls dd_collect_cg() which fills dd->comm->cgs_gl if 
> it is out of date. dd_partition_system() calls dd_distribute_state() 
> which calls dd_distribute_vec(). However get_cg_distribution fills() 
> dd->comm->cgs_gl immediately before dd_distribute state().
>
> So if your modifications to positions are small, then I suspect you 
> can just call dd_distribute_vec() passing dd->comm->cgs_gl. The UI and 
> documentation (ahem) could be better, I think.
>
> Otherwise, call dd_partition_system to re-do the DD partition.
>
> > Is there any other more elegant way of plugging custom code to mdrun?
>
> No.
>
> Mark
> ------------------------------------------------------------------------
>
> Dear Mark,
> That was exactly what I tried to do. The problem is that the function 
> dd_distribute_vec() is declared inside domdec.c as well as the 
> structs, which it uses. It is not exposed in any of .h files! As a 
> result the line in my additional code
>
> dd_distribute_vec(cr->dd,&cr->dd->comm->cgs_gl,state_global->x,state_local->x);

I think you can just declare this function in domdec.h and you'll be 
fine. None of those structures are internal to only domdec.c.

Mark

>
> Produces this error:
> error: dereferencing pointer to incomplete type. It doesn't see the 
> type of comm.
>
> I have tried to copy-paste all struct definitions from domdec.h to 
> md.c. This compiles, but then I get link error:
>
> md.c:(.text+0xece): undefined reference to `dd_distribute_vec'
>
> Adding md to the list of libraries mdrun links to does not help - it 
> still dosn't see dd_distribute_vec.
> How can overcome this? I'm sorry if this is something obvious - my 
> experience with pure C is very limited (I'm writing on "high level" 
> C++). I don't quite understand how to link with a function, which is 
> not exposed in h-files...

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://maillist.sys.kth.se/pipermail/gromacs.org_gmx-developers/attachments/20110408/8b45212c/attachment.html>


More information about the gromacs.org_gmx-developers mailing list