The way that it works is that each code feeds DTK its mesh (nodes, elements and connectivity). DTK then creates a "union" mesh out of all of the meshes of all of the coupled codes. It then uses this union mesh to push and pull fields from all the coupled codes. This all works in parallel... and handles the case where two different codes are using two different parallel decompositions.
There are three basic interfaces to DTK:
1. The mesh
2. DTK will give your code one of your own elements (by ID) and a point that lies within that element and ask you for the value of a field there.
3. DTK will give your code one of your own elements (by ID) and ask you for the integral of one of your fields on that element.
I could grow an interface to DTK at the MOOSE level... but I'm actually thinking of putting all of the main plumbing directly into libMesh. This will enable any libMesh based code to transfer data to and from other DTK enabled codes (including other libMesh based codes!).
So here's what I'm proposing to do at the libMesh level:
1. Create the mesh translator that will take a Mesh and output a DTK mesh.
2. Allow any System to provide a field to DTK
3. Allow any System to accept a field from DTK
Since libMesh understands our fields at a basic level, I believe I can grow something very generic at the libMesh level that will work for most libMesh based codes.
What do you guys think?