[gmx-developers] Help needed with hacking mdrun

Semen Esilevsky yesint4 at yahoo.com
Thu Apr 7 15:22:37 CEST 2011






________________________________
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);

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/20110407/ba8b1bc6/attachment.html>


More information about the gromacs.org_gmx-developers mailing list