> On 15. Apr 2022, at 13:07, Dmitry Pavlov <dmitry.pav...@outlook.com> wrote: > > Hello, > > I am considering a possibility to use a DuMuX program not as an executable, > but as a shared library. In addition, this library is going to pass the > results to caller via memory, rather than storing .vtu files on disk. Also, > the library is to be called more than once, each time accepting a different > params.input, also via memory. > > If anybody has done a similar thing, I will be grateful if you share your > experience.
Hi Dmitry, this should be essentially what is done when Dumux is used through Python bindings. See below for some pointers. > > The issues I see now are: > > - Not sure if MPI will remain possible. But multiprocessing is not a priority > in my particular case, since the library will be used mostly for 1D problems. What would be the problem exactly? I could imagine that Dumux used the Dune::MPIHelper at some point to obtain the communicator via the singleton inside some class. That would be a problem that needs to be fixed. The communicator needs to be passed from outside. Other than that I don’t really see where MPI support would break. > > - DuMuX expects params.input to be a file, not a stream. But a more generic > DUNE interface accepts a stream, so I think it will not be hard to adjust > DuMuX's behavior. Parameters can also be passed via a lambda function to Parameters::init (see the other function signatures at https://dumux.org/docs/doxygen/master/a02848.html <https://dumux.org/docs/doxygen/master/a02848.html>). This means you can simply pass parameters stored in a ParameterTree (which you can read from stream or construct otherwise) or any other convertible format. This is the interface I use if I want to e.g. wrap a Dumux simulator as a single Python driver function (see e.g. https://git.iws.uni-stuttgart.de/dumux-pub/Koch2019a/-/blob/master/appl/src/msbern.hh <https://git.iws.uni-stuttgart.de/dumux-pub/Koch2019a/-/blob/master/appl/src/msbern.hh>) > > - Some of the parameters in DuMuX codebase are only initialized once (grep > for "getParam" and "static" on the same line). For example, > assembly/boxlocalassembler.hh: > > static const int numDiffMethod = > getParamFromGroup<int>(this->problem().paramGroup(), > "Assembly.NumericDifferenceMethod"); > > This would be a problem if I wanted to pass different > Assembly.NumericDifferenceMethod with sequential calls of the library. > Fortunately, I do not. Aside from problem-specific parameters, I want to vary > parameters of grid and time stepping, and it seems that they can be > re-initialized, as least for porous medium flow problems. This is indeed a problem / bad design. It probably results either from laziness or comes from some difficulties maintaining backwards-compatibility when introducing the parameter. These parameters should be settable from the “outside”, via the class interface either with dedicated interface functions or by passing a parameter tree explicitly. Any improvements are welcome. Best, Timo > > > Do I miss any other obstacles? > > Is there a consistent pattern in which parameters are initialized once and > which can be re-initialized? > > > Best regards, > > Dmitry > > > _______________________________________________ > DuMux mailing list > DuMux@listserv.uni-stuttgart.de > https://listserv.uni-stuttgart.de/mailman/listinfo/dumux
_______________________________________________ DuMux mailing list DuMux@listserv.uni-stuttgart.de https://listserv.uni-stuttgart.de/mailman/listinfo/dumux