Timo,

Thank you. I managed to obtain what I wanted. Yes, I used the lambda in Parameters::init. I decided not to use MPI at all at this point because the library currently deals with only light-weight 1D problems.

Best regards,

Dmitry


On 16.04.2022 15:06, Timo Koch wrote:

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). 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)


- 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

Reply via email to