From: Michael P. <mpo...@pu...> - 2013-07-26 16:43:46
|
Dear Libmesh developers, recently I moved from the version 0.7 to 0.9. Unfortunately my code stopped working. It seems to me that I'm doing something wrong with libmesh. I need to do the following: solve two systems on the same mesh, and exchange data between them. So, I have done something like this EquationSystems es(mesh); es.add_system(...); //add fist system es.init(); /* do domething with the first system*/ es.add_system(...); //ad second system es.init(); /* do domething with the second system*/ this used to work in the old version, but now what happens is that the second system has 2 times more DOFs than it should. I modified my code in such a way that instead of initializing es, I'm initializing just the newly created system. This seems to work. My question: when it is appropriate to initialize the System object, and when one has to initialize the EquationSystems object? Thank you, Michael. -- Michael Povolotskyi, PhD Research Assistant Professor Network for Computational Nanotechnology 207 S Martin Jischke Drive Purdue University, DLR, room 441-10 West Lafayette, Indiana 47907 phone: +1-765-494-9396 fax: +1-765-496-6026 |
From: Jens L. E. <jle...@gm...> - 2013-07-26 16:54:28
|
Hi Michael, I'm not a libmesh developer, but I have had a very similar problem in the context of first reading in data for a system from file, in which case I believe the system is inited, and then add another system to the EquationSystems, and then init again. The issue was not related to using the same mesh for two systems within the same EquationSystems (which shouldn't be a problem), but rather to calling init() twice. My workaround to do first add the first system, and then read the second system from file, something like sys = es.ad_system() sys.add_variable() es.read() that is, I am not calling init() explicitly because that's done by es.read(). Did you try EquationSystems es(mesh); es.add_system(...); //add fist system es.init(); /* do domething with the first system*/ es.add_system(...); //ad second system es.reinit(); /* do domething with the second system*/ ? Best, Jens this precise problem earlier On 07/26/2013 12:43 PM, Michael Povolotskyi wrote: > Dear Libmesh developers, > recently I moved from the version 0.7 to 0.9. > Unfortunately my code stopped working. > It seems to me that I'm doing something wrong with libmesh. > I need to do the following: > solve two systems on the same mesh, and exchange data between them. > > So, I have done something like this > > EquationSystems es(mesh); > es.add_system(...); //add fist system > es.init(); > /* do domething with the first system*/ > > es.add_system(...); //ad second system > es.init(); > /* do domething with the second system*/ > > this used to work in the old version, but now what happens is that the > second system has 2 times more DOFs than it should. > I modified my code in such a way that instead of initializing es, I'm > initializing just the newly created system. > This seems to work. > > My question: > when it is appropriate to initialize the System object, and when one has > to initialize the EquationSystems object? > Thank you, > Michael. > |
From: Roy S. <roy...@ic...> - 2013-07-26 16:55:43
|
On Fri, 26 Jul 2013, Michael Povolotskyi wrote: > It seems to me that I'm doing something wrong with libmesh. Not "wrong", exactly, just unexpected. The original libMesh design didn't all you to add_anything() after initialization (except as you discovered, accidentally) and we've been fixing that piecemeal as developers discover need to. > EquationSystems es(mesh); > es.add_system(...); //add fist system > es.init(); > /* do domething with the first system*/ > > es.add_system(...); //ad second system > es.init(); > /* do domething with the second system*/ > > this used to work in the old version, but now what happens is that the > second system has 2 times more DOFs than it should. > I modified my code in such a way that instead of initializing es, I'm > initializing just the newly created system. > This seems to work. > > My question: > when it is appropriate to initialize the System object, and when one has > to initialize the EquationSystems object? I believe the current behavior is exactly as you discovered: each System and EquationSystems needs be initialized only once, nothing but init() does that for you, and the EquationSystems object is only capable of passing down the initialization call to systems it already knows about. The proper behavior (based on our other fixed add_foo() APIs) would be for add_system() to check whether the EquationSystems is already initialized, and if so to initialize the new system at that time. I don't have time to work on that at the moment, but we'd love a patch implementing it (or if you're pressed for time too, just a simple unit test which verifies the current behavior so we don't accidentally regress it for you further in the future). --- Roy |