diff --git a/Common/GmshMessage.cpp b/Common/GmshMessage.cpp index 774209bfcd3b3ce506b8cd5e6566498f3d22d808..7a5b730168f33875c87095e9366f53c7bcf4cbde 100644 --- a/Common/GmshMessage.cpp +++ b/Common/GmshMessage.cpp @@ -581,3 +581,18 @@ int Msg::GetThreadNum(){ return 0; } #endif +#include "Bindings.h" +void Msg::registerBindings (binding *b) { + classBinding *cb = b->addClass<Msg>("Msg"); + cb->setDescription("a class to manage messages, intialisations of libraries (like MPI) and mpi rank and size."); + methodBinding *mb; + mb = cb->setConstructor<Msg>(); + mb->setDescription("Msg is full static class, instances do not contain anything but they are needed to call the static functions from lua"); + mb = cb->addMethod("getCommRank", &Msg::GetCommRank); + mb->setDescription("return the id of this mpi process"); + mb = cb->addMethod("getCommSize", &Msg::GetCommSize); + mb->setDescription("return the number of mpi processes"); + mb = cb->addMethod("barrier", &Msg::Barrier); + mb->setDescription("an MPI barrier : all processes wait untill they all reach this points"); +}; + diff --git a/Common/GmshMessage.h b/Common/GmshMessage.h index f92f91ee7b5ab32453ebeccab7019c94ccb9306a..e1a95138163240c6a5b6adfe86eddeff5dd7b676 100644 --- a/Common/GmshMessage.h +++ b/Common/GmshMessage.h @@ -19,6 +19,7 @@ class GmshMessage{ virtual ~GmshMessage(){} virtual void operator()(std::string level, std::string message){} }; +class binding; // a class to manage messages class Msg { @@ -79,6 +80,7 @@ class Msg { static void InitClient(std::string sockname); static GmshClient *GetClient(){ return _client; } static void FinalizeClient(); + static void registerBindings (binding *b); }; #endif diff --git a/Common/LuaBindings.cpp b/Common/LuaBindings.cpp index 748497814a00fef6980a5a7f7421c68937b5c5b0..c2db76fa759e4024f3f65cf22d314406fe0fe221 100644 --- a/Common/LuaBindings.cpp +++ b/Common/LuaBindings.cpp @@ -29,6 +29,7 @@ #include "Bindings.h" #include "dgResidual.h" #include "drawContext.h" +#include "GmshMessage.h" extern "C" { #include "lua.h" @@ -366,6 +367,7 @@ binding::binding(){ function::registerDefaultFunctions(); functionLua::registerBindings(this); gmshOptions::registerBindings(this); + Msg::registerBindings(this); } binding *binding::_instance=NULL; #endif diff --git a/Common/LuaBindings.h b/Common/LuaBindings.h index 65d5ca74c1424a6551e099f15dc672fc5f372c7e..fca8ec1f5de55aa58aa021e20e1cdd1db6f8f4a3 100644 --- a/Common/LuaBindings.h +++ b/Common/LuaBindings.h @@ -256,10 +256,11 @@ class luaStack<const type &>{ } }; +//static template <typename cb> class argTypeNames; -template <typename tr, typename tObj, typename t0, typename t1, typename t2, typename t3, typename t4, typename t5> -class argTypeNames<tr (tObj::*)(t0,t1,t2,t3,t4,t5)>{ +template <typename tr, typename t0, typename t1, typename t2, typename t3, typename t4, typename t5> +class argTypeNames<tr (*)(t0,t1,t2,t3,t4,t5)>{ public: static void get(std::vector<std::string> &names){ names.clear(); @@ -272,8 +273,8 @@ class argTypeNames<tr (tObj::*)(t0,t1,t2,t3,t4,t5)>{ names.push_back(luaStack<t5>::getName()); } }; -template <typename tr, typename tObj, typename t0, typename t1, typename t2, typename t3, typename t4> -class argTypeNames<tr (tObj::*)(t0,t1,t2,t3,t4)>{ +template <typename tr, typename t0, typename t1, typename t2, typename t3, typename t4> +class argTypeNames<tr (*)(t0,t1,t2,t3,t4)>{ public: static void get(std::vector<std::string> &names){ names.clear(); @@ -285,8 +286,8 @@ class argTypeNames<tr (tObj::*)(t0,t1,t2,t3,t4)>{ names.push_back(luaStack<t4>::getName()); } }; -template <typename tr, typename tObj, typename t0, typename t1, typename t2, typename t3> -class argTypeNames<tr (tObj::*)(t0,t1,t2,t3)>{ +template <typename tr, typename t0, typename t1, typename t2, typename t3> +class argTypeNames<tr (*)(t0,t1,t2,t3)>{ public: static void get(std::vector<std::string> &names){ names.clear(); @@ -297,8 +298,8 @@ class argTypeNames<tr (tObj::*)(t0,t1,t2,t3)>{ names.push_back(luaStack<t3>::getName()); } }; -template <typename tr, typename tObj, typename t0, typename t1, typename t2> -class argTypeNames<tr (tObj::*)(t0,t1,t2)>{ +template <typename tr, typename t0, typename t1, typename t2> +class argTypeNames<tr (*)(t0,t1,t2)>{ public: static void get(std::vector<std::string> &names){ names.clear(); @@ -308,8 +309,8 @@ class argTypeNames<tr (tObj::*)(t0,t1,t2)>{ names.push_back(luaStack<t2>::getName()); } }; -template <typename tr, typename tObj, typename t0, typename t1> -class argTypeNames<tr (tObj::*)(t0,t1)>{ +template <typename tr, typename t0, typename t1> +class argTypeNames<tr (*)(t0,t1)>{ public: static void get(std::vector<std::string> &names){ names.clear(); @@ -318,8 +319,8 @@ class argTypeNames<tr (tObj::*)(t0,t1)>{ names.push_back(luaStack<t1>::getName()); } }; -template <typename tr, typename tObj, typename t0> -class argTypeNames<tr (tObj::*)(t0)>{ +template <typename tr, typename t0> +class argTypeNames<tr (*)(t0)>{ public: static void get(std::vector<std::string> &names){ names.clear(); @@ -327,49 +328,104 @@ class argTypeNames<tr (tObj::*)(t0)>{ names.push_back(luaStack<t0>::getName()); } }; -template <typename tr, typename tObj> -class argTypeNames<tr (tObj::*)()>{ +template <typename tr> +class argTypeNames<tr (*)()>{ public: static void get(std::vector<std::string> &names){ names.clear(); names.push_back(luaStack<tr>::getName()); } }; + +template <typename cb> +class argTypeNames; +template <typename tr, typename tObj, typename t0, typename t1, typename t2, typename t3, typename t4, typename t5> +class argTypeNames<tr (tObj::*)(t0,t1,t2,t3,t4,t5)>{ + public: + static void get(std::vector<std::string> &names){ + argTypeNames<tr(*)(t0,t1,t2,t3,t4,t5)>::get(names); + } +}; +template <typename tr, typename tObj, typename t0, typename t1, typename t2, typename t3, typename t4> +class argTypeNames<tr (tObj::*)(t0,t1,t2,t3,t4)>{ + public: + static void get(std::vector<std::string> &names){ + argTypeNames<tr(*)(t0,t1,t2,t3,t4)>::get(names); + } +}; +template <typename tr, typename tObj, typename t0, typename t1, typename t2, typename t3> +class argTypeNames<tr (tObj::*)(t0,t1,t2,t3)>{ + public: + static void get(std::vector<std::string> &names){ + argTypeNames<tr(*)(t0,t1,t2,t3)>::get(names); + } +}; +template <typename tr, typename tObj, typename t0, typename t1, typename t2> +class argTypeNames<tr (tObj::*)(t0,t1,t2)>{ + public: + static void get(std::vector<std::string> &names){ + argTypeNames<tr(*)(t0,t1,t2)>::get(names); + } +}; +template <typename tr, typename tObj, typename t0, typename t1> +class argTypeNames<tr (tObj::*)(t0,t1)>{ + public: + static void get(std::vector<std::string> &names){ + argTypeNames<tr(*)(t0,t1)>::get(names); + } +}; +template <typename tr, typename tObj, typename t0> +class argTypeNames<tr (tObj::*)(t0)>{ + public: + static void get(std::vector<std::string> &names){ + argTypeNames<tr(*)(t0)>::get(names); + } +}; +template <typename tr, typename tObj> +class argTypeNames<tr (tObj::*)()>{ + public: + static void get(std::vector<std::string> &names){ + argTypeNames<tr(*)()>::get(names); + } +}; + + +// const template <typename cb> class argTypeNames; template <typename tr, typename tObj, typename t0, typename t1, typename t2, typename t3> class argTypeNames<tr (tObj::*)(t0,t1,t2,t3)const>{ public: static void get(std::vector<std::string> &names){ - argTypeNames<tr (tObj::*)(t0,t1,t2,t3)>::get(names); + argTypeNames<tr (*)(t0,t1,t2,t3)>::get(names); } }; template <typename tr, typename tObj, typename t0, typename t1, typename t2> class argTypeNames<tr (tObj::*)(t0,t1,t2)const>{ public: static void get(std::vector<std::string> &names){ - argTypeNames<tr (tObj::*)(t0,t1,t2)>::get(names); + argTypeNames<tr (*)(t0,t1,t2)>::get(names); } }; template <typename tr, typename tObj, typename t0, typename t1> class argTypeNames<tr (tObj::*)(t0,t1)const>{ public: static void get(std::vector<std::string> &names){ - argTypeNames<tr (tObj::*)(t0,t1)>::get(names); + argTypeNames<tr (*)(t0,t1)>::get(names); } }; template <typename tr, typename tObj, typename t0> class argTypeNames<tr (tObj::*)(t0)const>{ public: static void get(std::vector<std::string> &names){ - argTypeNames<tr (tObj::*)(t0)>::get(names); + argTypeNames<tr (*)(t0)>::get(names); } }; template <typename tr, typename tObj> class argTypeNames<tr (tObj::*)()const>{ public: static void get(std::vector<std::string> &names){ - argTypeNames<tr (tObj::*)()>::get(names); + argTypeNames<tr (*)()>::get(names); } }; @@ -377,35 +433,78 @@ class argTypeNames<tr (tObj::*)()const>{ //static, return template < typename tRet, typename t0, typename t1, typename t2, typename t3> static int luaCall(lua_State *L,tRet (*_f)(t0,t1,t2,t3)) { - lua_remove(L,1); + if (lua_gettop(L)==5) + lua_remove(L,1); luaStack<tRet>::push(L,(*(_f))(luaStack<t0>::get(L,1),luaStack<t1>::get(L,2),luaStack<t2>::get(L,3),luaStack<t3>::get(L,4))); return 1; }; template < typename tRet, typename t0, typename t1, typename t2> static int luaCall(lua_State *L,tRet (*_f)(t0,t1,t2)) { - lua_remove(L,1); + if (lua_gettop(L)==4) + lua_remove(L,1); luaStack<tRet>::push(L,(*(_f))(luaStack<t0>::get(L,1),luaStack<t1>::get(L,2),luaStack<t2>::get(L,3))); return 1; }; template < typename tRet, typename t0, typename t1> static int luaCall(lua_State *L,tRet (*_f)(t0,t1)) { - lua_remove(L,1); + if (lua_gettop(L)==3) + lua_remove(L,1); luaStack<tRet>::push(L,(*(_f))(luaStack<t0>::get(L,1),luaStack<t1>::get(L,2))); return 1; }; template < typename tRet, typename t0> static int luaCall(lua_State *L,tRet (*_f)(t0)) { - lua_remove(L,1); + if (lua_gettop(L)==2) + lua_remove(L,1); luaStack<tRet>::push(L,(*(_f))(luaStack<t0>::get(L,1))); return 1; }; template < typename tRet> static int luaCall(lua_State *L,tRet (*_f)()) { - lua_remove(L,1); + printf("top=%i\n",lua_gettop(L)); + if (lua_gettop(L)==1) + lua_remove(L,1); luaStack<tRet>::push(L,(*(_f))()); return 1; }; +//static, no return +template < typename t0, typename t1, typename t2, typename t3> +static int luaCall(lua_State *L, void (*_f)(t0,t1,t2,t3)) { + if (lua_gettop(L)==5) + lua_remove(L,1); + (*(_f))(luaStack<t0>::get(L,1),luaStack<t1>::get(L,2),luaStack<t2>::get(L,3),luaStack<t3>::get(L,4)); + return 1; +}; +template <typename t0, typename t1, typename t2> +static int luaCall(lua_State *L, void (*_f)(t0,t1,t2)) { + if (lua_gettop(L)==4) + lua_remove(L,1); + (*(_f))(luaStack<t0>::get(L,1),luaStack<t1>::get(L,2),luaStack<t2>::get(L,3)); + return 1; +}; +template <typename t0, typename t1> +static int luaCall(lua_State *L,void (*_f)(t0,t1)) { + if (lua_gettop(L)==3) + lua_remove(L,1); + (*(_f))(luaStack<t0>::get(L,1),luaStack<t1>::get(L,2)); + return 1; +}; +template <typename t0> +static int luaCall(lua_State *L, void (*_f)(t0)) { + if (lua_gettop(L)==2) + lua_remove(L,1); + (*(_f))(luaStack<t0>::get(L,1)); + return 1; +}; +template < > +static int luaCall(lua_State *L,void (*_f)()) { + if (lua_gettop(L)==1) + lua_remove(L,1); + (*(_f))(); + return 1; +}; + //const, return template <typename tObj, typename tRet, typename t0, typename t1, typename t2, typename t3> static int luaCall(lua_State *L,tRet (tObj::*_f)(t0,t1,t2,t3) const) { diff --git a/Solver/TESTCASES/Stommel.lua b/Solver/TESTCASES/Stommel.lua index 2d6a259b6002398b8ffad20f93d6fab96a53c817..e9537dd96803b987da67605521431aa35a2213e9 100644 --- a/Solver/TESTCASES/Stommel.lua +++ b/Solver/TESTCASES/Stommel.lua @@ -17,12 +17,15 @@ void coriolis (fullMatrix<double> &sol, fullMatrix<double> &xyz) { } ]] -cfile = io.popen("g++ -O3 -pipe -m32 -shared -o tmp.dylib -I ../../Numeric -I../../Common -I../../build/Common -x c++ - ","w"); -cfile:write("#include\"fullMatrix.h\"\nextern \"C\" {") -cfile:write(CFunctions) -cfile:write("}") -cfile:close() +if (Msg.getCommRank() == 0 ) then + cfile = io.popen("g++ -O3 -pipe -m32 -shared -o tmp.dylib -I ../../Numeric -I../../Common -I../../build/Common -x c++ - ","w"); + cfile:write("#include\"fullMatrix.h\"\nextern \"C\" {") + cfile:write(CFunctions) + cfile:write("}") + cfile:close() +end +Msg.barrier() claw = dgConservationLawShallowWater2d() claw:addBoundaryCondition('Wall',claw:newBoundaryWall()) @@ -38,7 +41,7 @@ solution = dgDofContainer(groups, claw:getNbFields()) solution:exportMsh('output/init') rk=dgRungeKutta() -for i=1,600 do +for i=1,60000 do norm = rk:iterate33(claw,150*(3/(2.*order+1)/2),solution) if ( i%100 ==0 ) then print ('iter ', i, norm)