From 6f765dba85b62851f0569866085e41b8f35407d4 Mon Sep 17 00:00:00 2001 From: Jonathan Lambrechts <jonathan.lambrechts@uclouvain.be> Date: Wed, 13 Jan 2010 21:21:12 +0000 Subject: [PATCH] LuaBindings : accept reference as argument --- Common/LuaBindings.h | 40 +++++++++++++++++++-- Solver/TESTCASES/WavePulse.lua | 64 ---------------------------------- 2 files changed, 38 insertions(+), 66 deletions(-) delete mode 100644 Solver/TESTCASES/WavePulse.lua diff --git a/Common/LuaBindings.h b/Common/LuaBindings.h index 9d201a57e9..6e28eb222e 100644 --- a/Common/LuaBindings.h +++ b/Common/LuaBindings.h @@ -58,7 +58,7 @@ class luaStack { printf("error cannot get generic class in lua, only pointers are implemented\n"); } static void push(lua_State *L, type obj){ - printf("error cannot push generic class in lua, only pointers are implemented\n"); + Msg::Error("cannot push generic class in lua, only pointers are implemented\n"); } }; @@ -69,7 +69,7 @@ class luaStack<lua_State *>{ return L; } static void push(lua_State *L, int i){ - printf("error cannot push a lua_State in lua\n"); + Msg::Error("error cannot push a lua_State in lua\n"); } }; @@ -159,6 +159,42 @@ class luaStack<const type *>{ } }; +template <typename type> +class luaStack<type &>{ + typedef struct { type *pT;} userdataType; + public: + static type& get(lua_State *L, int ia){ + userdataType *ud = static_cast<userdataType*>(lua_touserdata(L, ia)); + if(!ud) luaL_typerror(L, ia, className<type>::get().c_str()); + return *ud->pT; + } + static void push(lua_State *L,type &obj){ +/* userdataType *ud = static_cast<userdataType*>(lua_newuserdata(L, sizeof(userdataType))); + ud->pT=&obj; + luaL_getmetatable(L,className<type>::get().c_str()); // lookup metatable in Lua registry + lua_setmetatable(L, -2);*/ + Msg::Error("cannot push a reference lua\n"); + } +}; + +template <typename type> +class luaStack<const type &>{ + typedef struct { type *pT;} userdataType; + public: + static type& get(lua_State *L, int ia){ + userdataType *ud = static_cast<userdataType*>(lua_touserdata(L, ia)); + if(!ud) luaL_typerror(L, ia, className<type>::get().c_str()); + return *ud->pT; + } + static void push(lua_State *L,const type &obj){ + /*userdataType *ud = static_cast<userdataType*>(lua_newuserdata(L, sizeof(userdataType))); + ud->pT=(type*)&obj; + luaL_getmetatable(L,className<type>::get().c_str()); // lookup metatable in Lua registry + lua_setmetatable(L, -2);*/ + Msg::Error("cannot push a reference lua\n"); + } +}; + /*** template to call c function from the lua stack ***/ //static, return template < typename tRet, typename t0, typename t1, typename t2, typename t3> diff --git a/Solver/TESTCASES/WavePulse.lua b/Solver/TESTCASES/WavePulse.lua deleted file mode 100644 index 93adba1dab..0000000000 --- a/Solver/TESTCASES/WavePulse.lua +++ /dev/null @@ -1,64 +0,0 @@ ---[[ - Function for initial conditions ---]] -function initial_condition( xyz , f ) - for i=0,xyz:size1()-1 do - X = xyz:get(i,0) - .5 - Y = xyz:get(i,1) - .5 - Z = xyz:get(i,2) --- X2 = xyz:get(i,0) - 1.5 --- Y2 = xyz:get(i,1) - .5 --- Z2 = xyz:get(i,2) - VALUE = math.exp(-40*(X*X+Y*Y+Z*Z)) --- + math.exp(-40*(X2*X2+Y2*Y2+Z2*Z2)); - f:set(i,0,VALUE) - f:set(i,1,0.0) - f:set(i,2,0.0) - end -end - - -print'*** Loading the mesh and the model ***' -myModel = GModel () ---myModel:load('box.geo') ---myModel:load('box.msh') ---myModel:load('square_quads.msh') -myModel:load('square_mixed.msh') - - -print'*** Create a dg solver ***' -DG = dgSystemOfEquations (myModel) -DG:setOrder(3) -law=dgConservationLawWaveEquation(2) -DG:setConservationLaw(law) -law:addBoundaryCondition('Border',law:newBoundaryWall()) -DG:setup() - -initialCondition = functionLua(3,'initial_condition',{'XYZ'}):getName() - -print'*** setting the initial solution ***' - -DG:L2Projection(initialCondition) - -print'*** export ***' - -DG:exportSolution('output/solution_000') - -print'*** solve ***' - -N = 100; -CFL = 2.1; -dt = CFL * DG:computeInvSpectralRadius(); -print('DT = ',dt) -for i=1,N do --- norm = DG:multirateRK43(dt) - norm = DG:RK44(dt) - if (i % 100 == 0) then - print('*** ITER ***',i,norm) - DG:exportSolution(string.format("output/solution-%04d", i)) - end -end - -print'*** done ***' - - -- GitLab