[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Getfem-commits] r5087 - in /trunk/getfem: doc/sphinx/source/biblio.rst
From: |
Yves . Renard |
Subject: |
[Getfem-commits] r5087 - in /trunk/getfem: doc/sphinx/source/biblio.rst doc/sphinx/source/userdoc/xfem.rst src/getfem_omp.cc |
Date: |
Sun, 13 Sep 2015 15:07:08 -0000 |
Author: renard
Date: Sun Sep 13 17:07:07 2015
New Revision: 5087
URL: http://svn.gna.org/viewcvs/getfem?rev=5087&view=rev
Log:
minor corrections
Modified:
trunk/getfem/doc/sphinx/source/biblio.rst
trunk/getfem/doc/sphinx/source/userdoc/xfem.rst
trunk/getfem/src/getfem_omp.cc
Modified: trunk/getfem/doc/sphinx/source/biblio.rst
URL:
http://svn.gna.org/viewcvs/getfem/trunk/getfem/doc/sphinx/source/biblio.rst?rev=5087&r1=5086&r2=5087&view=diff
==============================================================================
--- trunk/getfem/doc/sphinx/source/biblio.rst (original)
+++ trunk/getfem/doc/sphinx/source/biblio.rst Sun Sep 13 17:07:07 2015
@@ -11,6 +11,12 @@
.. [Al-Ge1997] E.L. Allgower and K. Georg,
*Numerical Path Following*, Handbook of Numerical Analysis, Vol. V (P.G.
Ciarlet and J.L. Lions, eds.), Elsevier, pp. 3-207, 1997.
+.. [AM-MO-RE2014] S. Amdouni, M. Moakher, Y. Renard,
+ *A local projection stabilization of fictitious domain method for elliptic
boundary value problems*, Appl. Numer. Math., 76:60-75, 2014.
+
+.. [AM-MO-RE2014b] S. Amdouni, M. Moakher, Y. Renard,
+ *A stabilized Lagrange multiplier method for the enriched finite element
approximation of Tresca contact problems of cracked elastic bodies*, Comp.
Meth. Appl. Mech. Engng., 270:178-200, 2014.
+
.. [bank1983] R.E. Bank, A.H. Sherman, A. Weiser,
*Refinement algorithms and data structures for regular local mesh
refinement*, in Scientific Computing IMACS, Amsterdam, North-Holland, pp 3-17,
1983.
@@ -20,9 +26,14 @@
.. [br-ba-fo1989] F. Brezzi, K.J. Bathe, M. Fortin,
*Mixed-interpolated element for Reissner-Mindlin plates*, Internat. J.
Numer. Methods Engrg., 28, 1787-1801, 1989.
+.. [bu-ha2010] E. Burman, P. Hansbo,
+ *Fictitious domain finite element methods using cut elements: I. A
stabilized Lagrange multiplier method*, Computer Methods in Applied Mechanics,
199:41-44, 2680-2686, 2010.
.. [ca-re-so1994] D. Calvetti, L. Reichel and D.C. Sorensen.
*An implicitely restarted Lanczos method for large symmetric eigenvalue
problems*. Electronic Transaction on Numerical Analysis}. 2:1-21, 1994.
+
+.. [CH-LA-RE2011] E. Chahine, P. Laborde, Y. Renard,
+ *A non-conformal eXtended Finite Element approach: Integral matching Xfem*,
Applied Numerical Mathematics, 61:322-343, 2011.
.. [ciarlet1978] P.G. Ciarlet,
*The finite element method for elliptic problems*, Studies in Mathematics
and its Applications vol. 4, North-Holland, 1978.
@@ -55,6 +66,9 @@
.. [HA-HA2004] A Hansbo, P Hansbo,
*A finite element method for the simulation of strong and weak
discontinuities in solid mechanics*, Computer methods in applied mechanics and
engineering 193 (33-35), 3523-3540, 2004.
+.. [HA-RE2009] J. Haslinger, Y. Renard,
+ *A new fictitious domain approach inspired by the extended finite element
method*, Siam J. on Numer. Anal., 47(2):1474-1499, 2009.
+
.. [HI-RE2010] Hild P., Renard Y.
*Stabilized lagrange multiplier method for the finite element approximation
of contact problems in elastostatics.* Numer. Math. 15:1, 101--129, 2010.
@@ -65,7 +79,10 @@
*Contact problems in elasticity*, SIAM, 1988.
.. [LA-PO-RE-SA2005] Laborde P., Pommier J., Renard Y., Salaun M.
- *High order extended finite element method for cracked domains*. Int. J.
Numer. Meth. Engng., 64:354-381, 2005.
+ *High order extended finite element method for cracked domains*. Int. J.
Numer. Meth. Engng., 64:354-381, 2005.
+
+.. [LA-RE-SA2010] J. Lasry, Y. Renard, M. Salaun.
+ *eXtended Finite Element Method for thin cracked plates with Kirchhoff-Love
theory*, Int. J. Numer. Meth. Engng., 84(9):1115-1138, 2010.
.. [KO-RE2014] Poulios K., Renard Y.,
*An unconstrained integral approximation of large sliding frictional
contact between deformable solids*. Computers and Structures, 153:75-90, 2015.
@@ -90,6 +107,9 @@
.. [nedelec1991] J.-C. Nedelec.
*Notions sur les techniques d'elements finis*, Ellipses, SMAI,
Mathematiques & Applications no 7, 1991.
+
+.. [NI-RE-CH2011] S. Nicaise, Y. Renard, E. Chahine,
+ *Optimal convergence analysis for the eXtended Finite Element Method*, Int.
J. Numer. Meth. Engng., 86:528-548, 2011.
.. [Pantz2008] O. Pantz
*The Modeling of Deformable Bodies with Frictionless (Self-)Contacts*,
Archive for Rational Mechanics and Analysis, Volume 188, Issue 2, pp 183-212,
2008.
Modified: trunk/getfem/doc/sphinx/source/userdoc/xfem.rst
URL:
http://svn.gna.org/viewcvs/getfem/trunk/getfem/doc/sphinx/source/userdoc/xfem.rst?rev=5087&r1=5086&r2=5087&view=diff
==============================================================================
--- trunk/getfem/doc/sphinx/source/userdoc/xfem.rst (original)
+++ trunk/getfem/doc/sphinx/source/userdoc/xfem.rst Sun Sep 13 17:07:07 2015
@@ -9,11 +9,15 @@
Level-sets, Xfem, fictitious domains, Cut-fem
=============================================
-Since v2.0, |gf| offers a certain number of facilities to support Xfem and
fictitious domain methods with a cut-fem strategy. Most of these tools have
been initially developed by Julien Pommier for the study published in
[LA-PO-RE-SA2005]_.
+Since v2.0, |gf| offers a certain number of facilities to support Xfem and
fictitious domain methods with a cut-fem strategy. Most of these tools have
been initially mainly developed by Julien Pommier for the study published in
[LA-PO-RE-SA2005]_.
The implementation is a fairly large generality, based on the use of
level-sets, as suggested in [SU-CH-MO-BE2001]_ and allows simultaneous use of a
large number of level-sets which can cross.
The Xfem implementation for the discretization of the jump follows the
strategy of [HA-HA2004]_ although we had no knowledge of this work during
implementation. This means that there is no degree of freedom representing the
jump across the level-set. Instead, the degrees of freedom represent the
displacement of each side of the level-set. This is essential in any way in the
presence of level-set that intersect each other because it may exist more than
two different zones of continuity inside a single element.
+
+The cut fem strategy for fictitious domain method has been used for the first
time with |gf| for the study published in [HA-RE2009]_ where a quite simple
stabilization strategy is proposed. Here also, before knowing the existence of
the Work of E. Burman and P. Hanbo [bu-ha2010]_ on that topic.
+
+The tools for Xfem have been then enriched by the PhD works of J. Larsy (see
for instance [LA-RE-SA2010]_) the one of E. Chahine (see for instance
[CH-LA-RE2011]_, [NI-RE-CH2011]_), and of S. Amdouni (see for instance
[AM-MO-RE2014]_, [AM-MO-RE2014b]_).
.. important::
@@ -28,8 +32,8 @@
Representation of level-sets
----------------------------
-|gf| deals with level-set defined by piecewise polynomial function on a mesh.
It
-will be defined as the zero of this function. In the file
+Some structure are defined to manipulate level-set functions defined by
+piecewise polynomial function on a mesh. In the file
:file:`getfem/getfem_levelset.h` a level-set is represented by a function
defined
on a lagrange fem of a certain degree on a mesh. The constructor to define a
new
|gf_ls| is the following::
@@ -50,6 +54,8 @@
method ``ls.value(1)`` returns the dof vector for the secondary level-set
function
if any. The method ``ls.get_mesh_fem()`` returns a reference on the |gf_mf|
object.
+
+Not that often in applications, the level-set function evolves thanks to an
Hamilton-Jacobi equation (for its re-initialization for instance). See the
:ref:`ud-convect` which can be used in the approximation of a Hamilton-Jacobi
equation.
Mesh cut by level-sets
Modified: trunk/getfem/src/getfem_omp.cc
URL:
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_omp.cc?rev=5087&r1=5086&r2=5087&view=diff
==============================================================================
--- trunk/getfem/src/getfem_omp.cc (original)
+++ trunk/getfem/src/getfem_omp.cc Sun Sep 13 17:07:07 2015
@@ -18,148 +18,148 @@
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
===========================================================================*/
-
-#include "getfem/getfem_omp.h"
-#include "getfem/getfem_omp.h"
-#include "getfem/getfem_level_set_contact.h"
-
-namespace getfem{
-
-#ifdef GETFEM_HAVE_OPENMP
-
- boost::recursive_mutex omp_guard::boost_mutex;
-
- omp_guard::omp_guard()
- : boost::lock_guard<boost::recursive_mutex>(boost_mutex)
- {}
-
- local_guard::local_guard(boost::recursive_mutex& m) :
- mutex_(m),
- plock_(new boost::lock_guard<boost::recursive_mutex>(m))
- { }
-
- local_guard::local_guard(const local_guard& guard)
- : mutex_(guard.mutex_), plock_(guard.plock_)
- { }
-
- lock_factory::lock_factory() : mutex_() {}
- local_guard lock_factory::get_lock() const
- {
- return local_guard(mutex_);
- }
-#endif
-
- omp_distribute<bool> open_mp_is_running_properly::answer = false;
- open_mp_is_running_properly::open_mp_is_running_properly()
- {answer.all_threads()=true;}
- open_mp_is_running_properly::~open_mp_is_running_properly()
- {answer.all_threads()=false;}
- bool open_mp_is_running_properly::is_it(){return answer;}
-
- region_partition::region_partition(const region_partition& rp) :
- pparent_mesh(rp.pparent_mesh),
- original_region(rp.original_region),
- partitions(rp.partitions) { }
-
- void region_partition::operator=(const region_partition& rp)
- {
- partitions.clear();
-
- if (!rp.pparent_mesh) return;
- pparent_mesh->copy_from(*rp.pparent_mesh);
- original_region = rp.original_region;
- partitions.resize(rp.partitions.size());
- gmm::copy(rp.partitions,partitions);
- }
-
-
- region_partition::region_partition(mesh* pm, size_type id) :
- pparent_mesh(pm),original_region(0),
- partitions(num_threads())
- {
- scalar_type time = gmm::uclock_sec();
- // in case of serial Getfem nothing to partition
- if (num_threads()==1) {partitions[0]=id; return;}
-
- //in case mesh is not provided, also don't do anything
- if (!pm) return;
-
- if (id == size_type(-1)) {
- original_region.reset(new mesh_region(pm->convex_index()));
- original_region->set_parent_mesh(pm);
- } else{
- GMM_ASSERT1(pm->has_region(id),"Improper region number");
- original_region.reset(new mesh_region(pm->region(id)));
- }
- if (me_is_multithreaded_now())
- GMM_WARNING0("building partitions inside parallel region");
-
- omp_guard scoped_lock;
- GMM_NOPERATION(scoped_lock);
- size_type Nelems = original_region->size();
- size_type psize = static_cast<size_type>
- (std::ceil(static_cast<scalar_type >(Nelems)/
- static_cast<scalar_type >(num_threads())));
- mr_visitor mr(*original_region);
- for(size_type thread = 0; thread<num_threads();thread++)
- {
- partitions[thread] =
-
getfem::mesh_region::free_region_id(*(original_region->get_parent_mesh()));
- mesh_region partition;
- for(size_type i=thread*psize;i<(thread+1)*psize &&
!mr.finished();i++,++mr)
- {
- if (mr.is_face()) partition.add(mr.cv(),mr.f());
- else partition.add(mr.cv());
- }
- pparent_mesh->region(partitions[thread]) = partition;
- }
- GMM_TRACE2("Partitioning time: "<<gmm::uclock_sec()-time<<" s.");
- }
-
- size_type region_partition::
- thread_local_partition() const {
- if (pparent_mesh==0 && num_threads() >1 ){
- GMM_WARNING1("partition is empty and cannot be used \
- this means that the brick that created it should
partition \
- its domain by himself");
- return -10;
- }
- return partitions[this_thread()];
- }
-
- void omp_distribute<bool>::all_values_proxy::operator=(const bool& x)
- {
- for(std::vector<BOOL>::iterator it=distro.thread_values.begin();
- it!=distro.thread_values.end();it++) *it=x;
-
- }
-
- thread_exception::thread_exception(): exceptions_(num_threads(), nullptr)
- {}
-
- thread_exception::~thread_exception() {rethrow();}
-
- std::vector<std::exception_ptr> thread_exception::caughtExceptions() const
- {
- std::vector<std::exception_ptr> exceptions;
- for (auto &&pException : exceptions_)
- {
- if (pException != nullptr) exceptions.push_back(pException);
- }
- return exceptions;
- }
-
- void thread_exception::rethrow()
- {
- for (auto &&pException : exceptions_)
- {
- if (pException != nullptr) std::rethrow_exception(pException);
- }
- }
-
- void thread_exception::captureException()
- {
- exceptions_[omp_get_thread_num()] = std::current_exception();
- }
-
-}
+
+#include "getfem/getfem_omp.h"
+#include "getfem/getfem_omp.h"
+#include "getfem/getfem_level_set_contact.h"
+
+namespace getfem{
+
+#ifdef GETFEM_HAVE_OPENMP
+
+ boost::recursive_mutex omp_guard::boost_mutex;
+
+ omp_guard::omp_guard()
+ : boost::lock_guard<boost::recursive_mutex>(boost_mutex)
+ {}
+
+ local_guard::local_guard(boost::recursive_mutex& m) :
+ mutex_(m),
+ plock_(new boost::lock_guard<boost::recursive_mutex>(m))
+ { }
+
+ local_guard::local_guard(const local_guard& guard)
+ : mutex_(guard.mutex_), plock_(guard.plock_)
+ { }
+
+ lock_factory::lock_factory() : mutex_() {}
+ local_guard lock_factory::get_lock() const
+ {
+ return local_guard(mutex_);
+ }
+#endif
+
+ omp_distribute<bool> open_mp_is_running_properly::answer = false;
+ open_mp_is_running_properly::open_mp_is_running_properly()
+ {answer.all_threads()=true;}
+ open_mp_is_running_properly::~open_mp_is_running_properly()
+ {answer.all_threads()=false;}
+ bool open_mp_is_running_properly::is_it(){return answer;}
+
+ region_partition::region_partition(const region_partition& rp) :
+ pparent_mesh(rp.pparent_mesh),
+ original_region(rp.original_region),
+ partitions(rp.partitions) { }
+
+ void region_partition::operator=(const region_partition& rp)
+ {
+ partitions.clear();
+
+ if (!rp.pparent_mesh) return;
+ pparent_mesh->copy_from(*rp.pparent_mesh);
+ original_region = rp.original_region;
+ partitions.resize(rp.partitions.size());
+ gmm::copy(rp.partitions,partitions);
+ }
+
+
+ region_partition::region_partition(mesh* pm, size_type id) :
+ pparent_mesh(pm),original_region(0),
+ partitions(num_threads())
+ {
+ scalar_type time = gmm::uclock_sec();
+ // in case of serial Getfem nothing to partition
+ if (num_threads()==1) {partitions[0]=id; return;}
+
+ //in case mesh is not provided, also don't do anything
+ if (!pm) return;
+
+ if (id == size_type(-1)) {
+ original_region.reset(new mesh_region(pm->convex_index()));
+ original_region->set_parent_mesh(pm);
+ } else{
+ GMM_ASSERT1(pm->has_region(id),"Improper region number");
+ original_region.reset(new mesh_region(pm->region(id)));
+ }
+ if (me_is_multithreaded_now())
+ GMM_WARNING0("building partitions inside parallel region");
+
+ omp_guard scoped_lock;
+ GMM_NOPERATION(scoped_lock);
+ size_type Nelems = original_region->size();
+ size_type psize = static_cast<size_type>
+ (std::ceil(static_cast<scalar_type >(Nelems)/
+ static_cast<scalar_type >(num_threads())));
+ mr_visitor mr(*original_region);
+ for(size_type thread = 0; thread<num_threads();thread++)
+ {
+ partitions[thread] =
+
getfem::mesh_region::free_region_id(*(original_region->get_parent_mesh()));
+ mesh_region partition;
+ for(size_type i=thread*psize;i<(thread+1)*psize &&
!mr.finished();i++,++mr)
+ {
+ if (mr.is_face()) partition.add(mr.cv(),mr.f());
+ else partition.add(mr.cv());
+ }
+ pparent_mesh->region(partitions[thread]) = partition;
+ }
+ GMM_TRACE2("Partitioning time: "<<gmm::uclock_sec()-time<<" s.");
+ }
+
+ size_type region_partition::
+ thread_local_partition() const {
+ if (pparent_mesh==0 && num_threads() >1 ){
+ GMM_WARNING1("partition is empty and cannot be used \
+ this means that the brick that created it should
partition \
+ its domain by himself");
+ return -10;
+ }
+ return partitions[this_thread()];
+ }
+
+ void omp_distribute<bool>::all_values_proxy::operator=(const bool& x)
+ {
+ for(std::vector<BOOL>::iterator it=distro.thread_values.begin();
+ it!=distro.thread_values.end();it++) *it=x;
+
+ }
+
+ thread_exception::thread_exception(): exceptions_(num_threads(), nullptr)
+ {}
+
+ thread_exception::~thread_exception() {rethrow();}
+
+ std::vector<std::exception_ptr> thread_exception::caughtExceptions() const
+ {
+ std::vector<std::exception_ptr> exceptions;
+ for (auto &&pException : exceptions_)
+ {
+ if (pException != nullptr) exceptions.push_back(pException);
+ }
+ return exceptions;
+ }
+
+ void thread_exception::rethrow()
+ {
+ for (auto &&pException : exceptions_)
+ {
+ if (pException != nullptr) std::rethrow_exception(pException);
+ }
+ }
+
+ void thread_exception::captureException()
+ {
+ exceptions_[this_thread()] = std::current_exception();
+ }
+
+}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Getfem-commits] r5087 - in /trunk/getfem: doc/sphinx/source/biblio.rst doc/sphinx/source/userdoc/xfem.rst src/getfem_omp.cc,
Yves . Renard <=