Author: renard Date: Thu Oct 27 21:52:18 2016 New Revision: 5449 URL: http://svn.gna.org/viewcvs/getfem?rev=5449&view=rev Log: some small optimizations
Modified: trunk/getfem/contrib/opt_assembly/opt_assembly.cc trunk/getfem/src/getfem/getfem_context.h trunk/getfem/src/getfem/getfem_mesh_fem.h trunk/getfem/src/getfem_context.cc trunk/getfem/src/getfem_generic_assembly.cc trunk/getfem/src/getfem_mesh_fem.cc Modified: trunk/getfem/contrib/opt_assembly/opt_assembly.cc URL: http://svn.gna.org/viewcvs/getfem/trunk/getfem/contrib/opt_assembly/opt_assembly.cc?rev=5449&r1=5448&r2=5449&view=diff ============================================================================== --- trunk/getfem/contrib/opt_assembly/opt_assembly.cc (original) +++ trunk/getfem/contrib/opt_assembly/opt_assembly.cc Thu Oct 27 21:52:18 2016 @@ -256,7 +256,7 @@ bool all = false; bool select = true; - int only_one = 2; + int only_one = 1; if (all || select || only_one == 1) { VEC_TEST_1("Test for source term", ndofu, "u.Test_u", mim, size_type(-1), Modified: trunk/getfem/src/getfem/getfem_context.h URL: http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/getfem_context.h?rev=5449&r1=5448&r2=5449&view=diff ============================================================================== --- trunk/getfem/src/getfem/getfem_context.h (original) +++ trunk/getfem/src/getfem/getfem_context.h Thu Oct 27 21:52:18 2016 @@ -97,15 +97,16 @@ void sup_dependent_(const context_dependencies &cd) const; void sup_dependency_(const context_dependencies &cd) const; - void invalid_context(void) const; + void invalid_context() const; + bool go_check() const; public : /** this function has to be defined and should update the object when the context is modified. */ - virtual void update_from_context(void) const = 0; + virtual void update_from_context() const = 0; - void change_context(void) const + void change_context() const { if (state == CONTEXT_NORMAL) { @@ -125,11 +126,12 @@ void clear_dependencies(); - bool is_context_valid(void) const { return (state != CONTEXT_INVALID); } + bool is_context_valid() const { return (state != CONTEXT_INVALID); } bool is_context_changed() const { return (state == CONTEXT_CHANGED); } /** return true if update_from_context was called */ - bool context_check(void) const; - void touch(void) const; + bool context_check() const + { if (state == CONTEXT_NORMAL) return false; return go_check(); } + void touch() const; virtual ~context_dependencies(); context_dependencies() : state(CONTEXT_NORMAL), touched( ) {touched = false;} context_dependencies(const context_dependencies& cd); Modified: trunk/getfem/src/getfem/getfem_mesh_fem.h URL: http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/getfem_mesh_fem.h?rev=5449&r1=5448&r2=5449&view=diff ============================================================================== --- trunk/getfem/src/getfem/getfem_mesh_fem.h (original) +++ trunk/getfem/src/getfem/getfem_mesh_fem.h Thu Oct 27 21:52:18 2016 @@ -153,7 +153,7 @@ void copy_from(const mesh_fem &mf); /* Remember to change copy_from if adding components to mesh_fem */ - dal::dynamic_array<pfem> f_elems; + std::vector<pfem> f_elems; dal::bit_vector fe_convex; const mesh *linked_mesh_; REDUCTION_MATRIX R_; @@ -424,7 +424,7 @@ * vectorization due to qdim nor the optional reduction. */ virtual pfem fem_of_element(size_type cv) const - { return f_elems[cv]; } + { return f_elems[cv]; } /** Give an array of the dof numbers a of convex. * @param cv the convex number. * @return a pseudo-container of the dof number. @@ -577,7 +577,7 @@ size_type memsize() const { return dof_structure.memsize() + sizeof(mesh_fem) - sizeof(bgeot::mesh_structure) + - f_elems.memsize() + fe_convex.memsize(); + f_elems.size() * sizeof(pfem) + fe_convex.memsize(); } void init_with_mesh(const mesh &me, dim_type Q = 1); /** Build a new mesh_fem. A mesh object must be supplied. @@ -660,6 +660,29 @@ } } + template <typename VEC1, typename VEC2> + void slice_vector_on_basic_dof_of_element(const mesh_fem &mf, + const VEC1 &vec, + size_type cv, VEC2 &coeff, + size_type qmult) { + auto &ct = mf.ind_scalar_basic_dof_of_element(cv); + size_type qmult2 = mf.get_qdim(); + if (qmult2 > 1) qmult2 /= mf.fem_of_element(cv)->target_dim(); + size_type qmultot = qmult*qmult2; + gmm::resize(coeff, ct.size()*qmultot); + + auto it = ct.begin(); + auto itc = coeff.begin(); + if (qmultot == 1) { + for (; it != ct.end(); ++it) *itc++ = vec[*it]; + } else { + for (; it != ct.end(); ++it) { + auto itv = vec.begin()+(*it)*qmult; + for (size_type m = 0; m < qmultot; ++m) *itc++ = *itv++; + } + } + } + void vectorize_base_tensor(const base_tensor &t, base_matrix &vt, size_type ndof, size_type qdim, size_type N); Modified: trunk/getfem/src/getfem_context.cc URL: http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_context.cc?rev=5449&r1=5448&r2=5449&view=diff ============================================================================== --- trunk/getfem/src/getfem_context.cc (original) +++ trunk/getfem/src/getfem_context.cc Thu Oct 27 21:52:18 2016 @@ -62,7 +62,7 @@ dependencies.resize(s); } - void context_dependencies::invalid_context(void) const { + void context_dependencies::invalid_context() const { if (state != CONTEXT_INVALID) { iterator_list it = dependent.begin(), ite = dependent.end(); @@ -84,7 +84,7 @@ cd.dependent.push_back(this); } - bool context_dependencies::context_check(void) const + bool context_dependencies::go_check() const { if (state == CONTEXT_CHANGED) { @@ -103,7 +103,7 @@ return false; } - void context_dependencies::touch(void) const + void context_dependencies::touch() const { if (!touched) { Modified: trunk/getfem/src/getfem_generic_assembly.cc URL: http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_generic_assembly.cc?rev=5449&r1=5448&r2=5449&view=diff ============================================================================== --- trunk/getfem/src/getfem_generic_assembly.cc (original) +++ trunk/getfem/src/getfem_generic_assembly.cc Thu Oct 27 21:52:18 2016 @@ -2708,23 +2708,26 @@ cv_old(-1) {} }; + struct ga_instruction_slice_local_dofs : public ga_instruction { const mesh_fem &mf; const base_vector &U; const fem_interpolation_context &ctx; base_vector &coeff; const size_type &ipt; + size_type qmult; virtual int exec() { - GA_DEBUG_INFO("Instruction: Slice local dofs"); if (ipt == 0) { - slice_vector_on_basic_dof_of_element(mf, U, ctx.convex_num(), coeff); + GA_DEBUG_INFO("Instruction: Slice local dofs"); + slice_vector_on_basic_dof_of_element(mf,U,ctx.convex_num(),coeff,qmult); } return 0; } ga_instruction_slice_local_dofs(const mesh_fem &mf_, const base_vector &U_, const fem_interpolation_context &ctx_, - base_vector &coeff_, const size_type &ipt_) - : mf(mf_), U(U_), ctx(ctx_), coeff(coeff_), ipt(ipt_) {} + base_vector &coeff_, const size_type &ipt_, + size_type qmult_) + : mf(mf_), U(U_), ctx(ctx_), coeff(coeff_), ipt(ipt_), qmult(qmult_) {} }; struct ga_instruction_update_pfp : public ga_instruction { @@ -10597,7 +10600,8 @@ // cout << "local dof of " << pnode->name << endl; pgai = std::make_shared<ga_instruction_slice_local_dofs> (*mf, *(gis.extended_vars[pnode->name]), gis.ctx, - rmi.local_dofs[pnode->name], gis.ipt); + rmi.local_dofs[pnode->name], gis.ipt, + gis.extended_vars[pnode->name]->size() / mf->nb_basic_dof()); rmi.instructions.push_back(std::move(pgai)); } Modified: trunk/getfem/src/getfem_mesh_fem.cc URL: http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_mesh_fem.cc?rev=5449&r1=5448&r2=5449&view=diff ============================================================================== --- trunk/getfem/src/getfem_mesh_fem.cc (original) +++ trunk/getfem/src/getfem_mesh_fem.cc Thu Oct 27 21:52:18 2016 @@ -142,11 +142,21 @@ "Incompatibility between Qdim=" << int(Qdim) << " and target_dim " << int(pf->target_dim()) << " of " << name_of_fem(pf)); - if (!fe_convex.is_in(cv) || f_elems[cv] != pf) { - fe_convex.add(cv); - f_elems[cv] = pf; - dof_enumeration_made = false; + + + if (cv == f_elems.size()) { + f_elems.push_back(pf); + fe_convex.add(cv); + dof_enumeration_made = false; touch(); v_num = act_counter(); + } else { + if (cv > f_elems.size()) f_elems.resize(cv+1); + if (!fe_convex.is_in(cv) || f_elems[cv] != pf) { + fe_convex.add(cv); + f_elems[cv] = pf; + dof_enumeration_made = false; + touch(); v_num = act_counter(); + } } } } _______________________________________________ Getfem-commits mailing list Getfem-commits@gna.org https://mail.gna.org/listinfo/getfem-commits