On Tue, Sep 24, 2013 at 9:52 PM, Garth N. Wells <gn...@cam.ac.uk> wrote:
> On 24 September 2013 20:18, Anders Logg <l...@chalmers.se> wrote: > > Yes, I like DofMapToDofMapMapping much better. > > > > I like the design, much the name looks horrible! :-) What design? A class that hold the mapping between 1-N,N-1,1-1 dofmaps? If so I agree. But it is not clear to me what you think the syntax for the assignment statement should be. I do not think: dmtdmm = DofMapToDofMapMapping([V,V,V], VV) assign([u0,u1,u2],u, dmtdmm) is better than for example: dmtdmm = DofMapToDofMapMapping([V,V,V], VV) dmtdmm.assign([u0,u1,u2],u) The first is similar to what Martin suggested and the latter is basically what I first suggested with a different naming. We can still support a more general free function: assign([u0,u1,u2],u) where a DofMapToDofMapMapping is created inside the assign function and then discarded. > My suggestion for a short name would be > > > > DofMapTransformation > > > > I don't like this name - it doesn't make clear that if defined a > relationship between two domps. > Agree. No dofmaps are transformed. I don't have a good name suggestion just yet, but maybe we should > raise the abstraction. A dofmap is a type of graph, and what we want > is the relationship between a graph and some subgraph (related to > this, I'd like to use a more graph-centric approach in DofMapBuilder > to simplify it and to extend the functionality). Sounds good. I suppose a general mapping class between dofmaps could be useful for different cases. However, I am not sure what these cases are, and I have therefor difficulties envision how such class should be looking. I have one particular task in mind, and for that I need a mapping between 1-N,N-1,1-1 dofmaps. > > Yes, BoundingBoxTree has a lot of methods but it is an implementation > > detail that the methods are actually implemented as part of the > > BoundingBoxTree class hierarchy (and not outsourced to algorithm > > classes as we do in other places). > > > And what is the difference? Couldn't an assign method be implemented as part of a DofMapToDofMapMapping class? > I just want to stay away from the horror in dolfin/common/unittest.h: > > > > CppUnit::TestResult result; > > CppUnit::TestResultCollector collected_results; > > result.addListener(&collected_results); > > CppUnit::TestRunner runner; > > runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); > > runner.run(result); > > CppUnit::CompilerOutputter outputter(&collected_results, std::cerr); > > outputter.write (); > > return collected_results.wasSuccessful () ? 0 : 1; > I think this example is just stupid. It has nothing to do with what I suggested. As I said we can hide the instantiation of the class within a free function for people who wants to solve a problem with a small script with nice syntax. I suggest adding a useful class that solves a problem many has requested in an elegant way. > Adding FunctionAssigner is just one class but it's a slippery > > slope... :-) > The slope is as slippery as adding DOLFIN_EPS_LARGE, which easily could lead to the addition of DOLFIN_EPS_NOT_SO_LARGE ;) Johan > > -- > > Anders > > > > > > On Tue, Sep 24, 2013 at 10:44:05AM +0200, Martin Sandve Alnæs wrote: > >> Would you agree that that the BoundingBoxTree represents data > associations, not > >> an operation, similar to my just-now suggestion DofMapToDofMapMapping > instead > >> of FunctionAssigner? An object that represents the mapping could > conceivably be > >> useful for operations other than assign as well. > >> > >> Martin > >> > >> > >> On 24 September 2013 10:39, Johan Hake <hake....@gmail.com> wrote: > >> > >> Well, we have the BoundingBoxTree, which similarly caches data that > speed > >> up certain operations. We also have a Solver class and a free > function > >> solve, an Assembler class and a free function assemble. Similarly > we could > >> have a free function assign, which construct a FunctionAssign > object. > >> However there is a lot of data which could be reused in the > FunctionAssign > >> object. If a user want to utelize that he should instantiate the > object and > >> use that in his code. > >> > >> Johan > >> > >> > >> > >> On Tue, Sep 24, 2013 at 10:27 AM, Anders Logg <l...@chalmers.se> > wrote: > >> > >> Is it possible to solve this without introducing the design > pattern > >> with a class FunctionAssigner? We have been careful to avoid > this in > >> other places. > >> > >> > >> > >> > >> On Mon, Sep 23, 2013 at 07:20:03PM +0200, Johan Hake wrote: > >> > I am working on sub-function assignment. To facilitate > caching of dof > >> indices > >> > for a particular assignment combination I suggest introducing > a > >> > FunctionAssigner class which caches the necessary indices > (dofs) for > >> the whole > >> > domain. > >> > > >> > Something like: > >> > > >> > mesh = UnitSquareMesh(10,10) > >> > V = FunctionSpace(mesh, "CG", 1) > >> > VV = V*V > >> > > >> > # Assign two scalar functions to the components of a mixed > function > >> > assigner0 = FunctionAssigner([V, V], VV) > >> > > >> > # Assign components of a mixed function to scalar Functions > >> > assigner1 = FunctionAssigner(VV, [V, V]) > >> > > >> > # Assign a scalar function to a component of a mixed > function > >> > assigner2 = FunctionAssigner(V, VV.sub(1)) > >> > > >> > u0, u1 = Function(V), Function(V) > >> > U = Function(VV) > >> > > >> > Then in some time loop: > >> > > >> > while t < tstop: > >> > ... > >> > assigner0.assign([u0, u1], U) > >> > ... > >> > assigner1.assign(U, [u0, u1]) > >> > ... > >> > assigner2.assign(u0, U.sub(1)) > >> > > >> > In C++ the equivalent to a list of Foo will be a std::vector > of > >> shared Foos. > >> > > >> > Comments? > >> > > >> > By using sub spaces and sub functions we avoid using indices > in the > >> interface, > >> > which I think is neat. However, there are some limitations > with the > >> present > >> > interface: > >> > > >> > 1) The FunctionAssigner needs to have access to the local > ownership > >> range of a > >> > sub dofmap, but that is not possible as it is set to 0,0 > during > >> construction. > >> > Could we add a proper local ownership range to a sub dofmap? > >> > 2) The FunctionAssigner need to be able to access the private > _vector > >> of a > >> > parent Function during the assignment, as calling > subfunc.vector() > >> raises an > >> > error. This can be fixed by a friend statement. Is that > acceptable? > >> > > >> > Johan > >> > >> > _______________________________________________ > >> > fenics mailing list > >> > fenics@fenicsproject.org > >> > http://fenicsproject.org/mailman/listinfo/fenics > >> > >> > >> > >> > >> _______________________________________________ > >> fenics mailing list > >> fenics@fenicsproject.org > >> http://fenicsproject.org/mailman/listinfo/fenics > >> > >> > >> > > _______________________________________________ > > fenics mailing list > > fenics@fenicsproject.org > > http://fenicsproject.org/mailman/listinfo/fenics > _______________________________________________ > fenics mailing list > fenics@fenicsproject.org > http://fenicsproject.org/mailman/listinfo/fenics >
_______________________________________________ fenics mailing list fenics@fenicsproject.org http://fenicsproject.org/mailman/listinfo/fenics