{"action":"created","issue":{"url":"https://api.github.com/repos/ufz/ogs/issues/1062","repository_url":"https://api.github.com/repos/ufz/ogs","labels_url":"https://api.github.com/repos/ufz/ogs/issues/1062/labels{/name}","comments_url":"https://api.github.com/repos/ufz/ogs/issues/1062/comments","events_url":"https://api.github.com/repos/ufz/ogs/issues/1062/events","html_url":"https://github.com/ufz/ogs/issues/1062","id":137525727,"number":1062,"title":"Abstract base class of local assemblers","user":{"login":"chleh","id":10530151,"avatar_url":"https://avatars.githubusercontent.com/u/10530151?v=3","gravatar_id":"","url":"https://api.github.com/users/chleh","html_url":"https://github.com/chleh","followers_url":"https://api.github.com/users/chleh/followers","following_url":"https://api.github.com/users/chleh/following{/other_user}","gists_url":"https://api.github.com/users/chleh/gists{/gist_id}","starred_url":"https://api.github.com/users/chleh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chleh/subscriptions","organizations_url":"https://api.github.com/users/chleh/orgs","repos_url":"https://api.github.com/users/chleh/repos","events_url":"https://api.github.com/users/chleh/events{/privacy}","received_events_url":"https://api.github.com/users/chleh/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/ufz/ogs/labels/discussion","name":"discussion","color":"DDDDDD"}],"state":"open","locked":false,"assignee":{"login":"endJunction","id":329493,"avatar_url":"https://avatars.githubusercontent.com/u/329493?v=3","gravatar_id":"","url":"https://api.github.com/users/endJunction","html_url":"https://github.com/endJunction","followers_url":"https://api.github.com/users/endJunction/followers","following_url":"https://api.github.com/users/endJunction/following{/other_user}","gists_url":"https://api.github.com/users/endJunction/gists{/gist_id}","starred_url":"https://api.github.com/users/endJunction/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/endJunction/subscriptions","organizations_url":"https://api.github.com/users/endJunction/orgs","repos_url":"https://api.github.com/users/endJunction/repos","events_url":"https://api.github.com/users/endJunction/events{/privacy}","received_events_url":"https://api.github.com/users/endJunction/received_events","type":"User","site_admin":false},"milestone":null,"comments":1,"created_at":"2016-03-01T09:55:47Z","updated_at":"2016-03-02T01:30:04Z","closed_at":null,"body":"Moved here from ProcessLib/GroundwaterFlowFEM.h\r\n\r\n```{c++}\r\n// TODO\r\n// As far as I can see, this interface is necessary only, because we want to use\r\n// fixed-size Eigen matrices for the shape matrices. Sure, they improve\r\n// performance. On the other side, virtual calls degrade performance. Maybe\r\n// somebody should make a measurement and if the performance gain by fixed-size\r\n// matrices is negligible, we should abandon them.  Additionally that would save\r\n// compile time.\r\ntemplate <typename GlobalMatrix, typename GlobalVector>\r\nclass LocalAssemblerDataInterface\r\n{\r\npublic:\r\n    virtual ~LocalAssemblerDataInterface() = default;\r\n\r\n    virtual void init(MeshLib::Element const& e,\r\n            std::size_t const local_matrix_size,\r\n            Parameter<double, MeshLib::Element const&> const& hydraulic_conductivity,\r\n            unsigned const integration_order) = 0;\r\n\r\n    virtual void assemble(double const t, std::vector<double> const& local_x) = 0;\r\n\r\n    // TODO: Don't we waste quite some time by having this as a virtual method?\r\n    //       If we put a callback arg to the assemble() call, this funcitonality can\r\n    //       be provided by a non-virtual method.\r\n    //       Otherwise we could also pass local matrices in with the assemble() call.\r\n    //       Thereby we would not have to expose global matrices/vectors.\r\n    virtual void addToGlobal(AssemblerLib::LocalToGlobalIndexMap::RowColumnIndices const&,\r\n            GlobalMatrix& M, GlobalMatrix& K, GlobalVector& b) const = 0;\r\n};\r\n```"},"comment":{"url":"https://api.github.com/repos/ufz/ogs/issues/comments/191008804","html_url":"https://github.com/ufz/ogs/issues/1062#issuecomment-191008804","issue_url":"https://api.github.com/repos/ufz/ogs/issues/1062","id":191008804,"user":{"login":"endJunction","id":329493,"avatar_url":"https://avatars.githubusercontent.com/u/329493?v=3","gravatar_id":"","url":"https://api.github.com/users/endJunction","html_url":"https://github.com/endJunction","followers_url":"https://api.github.com/users/endJunction/followers","following_url":"https://api.github.com/users/endJunction/following{/other_user}","gists_url":"https://api.github.com/users/endJunction/gists{/gist_id}","starred_url":"https://api.github.com/users/endJunction/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/endJunction/subscriptions","organizations_url":"https://api.github.com/users/endJunction/orgs","repos_url":"https://api.github.com/users/endJunction/repos","events_url":"https://api.github.com/users/endJunction/events{/privacy}","received_events_url":"https://api.github.com/users/endJunction/received_events","type":"User","site_admin":false},"created_at":"2016-03-02T01:30:04Z","updated_at":"2016-03-02T01:30:04Z","body":"Some test results on performance; tested fixed _vs._ dynamic shape matrices on two branches:\r\n[before ode solver](https://github.com/ufz/ogs/tree/f00778e) and after [t-int-ogs6 + matrix pool](https://github.com/ufz/ogs/pull/1059). Compiled with eigen_lis solver, single-threaded, clang-3.7.1, Release. Accuracy of the measurement is low, but the load on the machine was similar, so the relative differences should be ok.\r\n\r\nTotal ctest time in seconds (on a i7-3770K CPU @ 3.50GHz):\r\n\r\n | f00778e | [t_int+matrix_pool](https://github.com/ufz/ogs/pull/1059)\r\n----------- | ----------- | -------------\r\ndynamic | 262 | 259\r\nstatic | 245 | 240"}}