Skip to content
Snippets Groups Projects
Commit ec74fd44 authored by Jonathan Lambrechts's avatar Jonathan Lambrechts
Browse files

bindings for GmshMessages and full support for bindings of static functions...

bindings for GmshMessages and full support for bindings of static functions (eg Msg:getCommRank() == Msg.getCommRank() == Msg():getCommRank())
parent 83e8e351
No related branches found
No related tags found
No related merge requests found
......@@ -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");
};
......@@ -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
......@@ -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
......@@ -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)) {
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)) {
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)) {
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)) {
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)()) {
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) {
......
......@@ -17,12 +17,15 @@ void coriolis (fullMatrix<double> &sol, fullMatrix<double> &xyz) {
}
]]
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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment