
.. _fc-hypermesh: http://www.math.univ-paris13.fr/~cuvelier/software/Python/fc-hypermesh.html 
   
.. _www.python.org: http://www.python.org/

.. _Miniconda: https://conda.io/miniconda.html

.. _Anaconda: https://www.anaconda.com

.. _Canopy: https://www.enthought.com/product/canopy/

.. _Mayavi: http://docs.enthought.com/mayavi/mayavi/

.. _Matplotlib: https://matplotlib.org/
    
.. _hypermesh-report:    https://hal.archives-ouvertes.fr/hal-01638329/file/hypermesh_0.1.1%20%281%29.pdf

.. image:: http://www.math.univ-paris13.fr/~cuvelier/software/codes/Python/fc-hypermesh/pyfc-hypermesh_400.png
  :width: 400px
  :align: center

The **fc\_hypermesh** Python package allows to generate conforming meshes
of hypercubes, hyperrectangles or of any d-orthotopes by p-order simplices or orthotopes  with their m-faces
   

   
Introduction:
------------- 

__ hypermesh-report_

.. image:: http://www.math.univ-paris13.fr/~cuvelier/images/icons/HALv3_78x78.png
   :target: https://hal.archives-ouvertes.fr/hal-01638329
   :align: left
   :alt: sysfs line plot
   :width: 55px
   
This implements `Vectorized algorithms for regular and conforming tessellations of d-orthotopes and their faces with high-order orthotopes or simplicial elements, Cuvelier F., 2019`__
   
.. _fc\_hypermesh Python package: http://www.math.univ-paris13.fr/~cuvelier/software/fc-hypermesh-Python.html
   
More documentation is available on `fc\_hypermesh Python package`_ dedicated web page.


Installation:
-------------

The **fc\_hypermesh** Python package is available from the Python Package Index, so to install/upgrade simply do

.. code:: 

    pip install fc_hypermesh -U
    
Thereafter, it's possible to run one of the demo functions 

.. code:: python

      import fc_hypermesh
      fc_hypermesh.demos.demo01()

Examples usage:
---------------

-  Meshing the rectangle [-1,1]x[0,1] by simplices with 12+1 points in
   x-axis and 5+1 points in y-axis:

   .. code:: python

       from fc_hypermesh import OrthMesh
       oTh=OrthMesh(2,[12,5],type='simplex',box=[[-1,1],[0,1]])
       print(oTh)

   The output of the ``print(oTh)`` command is::
   
      OrthMesh object 
              d : 2
          order : 1
            box : [[-1.0, 1.0], [0.0, 1.0]]
        mapping : None
      Mesh (order,type,nq,nme) : (1,simplex,78,120)
      Number of 1-faces : 4
        [ 0] (order,type,nq,nme) : (1,simplex,6,5)
        [ 1] (order,type,nq,nme) : (1,simplex,6,5)
        [ 2] (order,type,nq,nme) : (1,simplex,13,12)
        [ 3] (order,type,nq,nme) : (1,simplex,13,12)
      Number of 0-faces : 4
        [ 0] (order,type,nq,nme) : (1,simplex,1,1)
        [ 1] (order,type,nq,nme) : (1,simplex,1,1)
        [ 2] (order,type,nq,nme) : (1,simplex,1,1)
        [ 3] (order,type,nq,nme) : (1,simplex,1,1)

   If ``matplotlib`` package is installed one can represent the mesh

   .. code:: python

        from fc_tools.graphics import set_axes_equal
        import matplotlib.pyplot as plt
        plt.ion()
        plt.figure(1)
        oTh.plotmesh(legend=True)
        plt.figure(2)
        oTh.plotmesh(m=1,legend=True,linewidth=3)
        plt.axis('off')
        set_axes_equal()
        
    

   .. |OrthMesh_2D_simplicial_fig1| image:: http://www.math.univ-paris13.fr/~cuvelier/software/codes/Python/fc-hypermesh/snapshots/OrthMesh_2D_simplicial_fig1_Python374.png
      :width: 300
      :align: middle
      
   .. |OrthMesh_2D_simplicial_fig2| image:: http://www.math.univ-paris13.fr/~cuvelier/software/codes/Python/fc-hypermesh/snapshots/OrthMesh_2D_simplicial_fig2_Python374.png
      :width: 300
      :align: middle
      
   +-------------------------------+-------------------------------+
   | |OrthMesh_2D_simplicial_fig1| | |OrthMesh_2D_simplicial_fig2| |
   +-------------------------------+-------------------------------+

-  Meshing the rectangular cuboid [-1,1]x[0,1]x[0,2] by simplices with 11+1 points in
   x-axis, 5+1 points in y-axis and 10+1 points in z-axis:

   .. code:: python

        from fc_hypermesh import OrthMesh
        oTh=OrthMesh(3,[10,5,10],box=[[-1,1],[0,1],[0,2]])

   If ``matplotlib`` package is installed one can represent the mesh

   .. code:: python
   
        from fc_tools.graphics import set_axes_equal
        import matplotlib.pyplot as plt
        plt.ion()
        plt.figure(1)
        oTh.plotmesh(legend=True,linewidth=0.5)
        set_axes_equal()
        plt.figure(2)
        oTh.plotmesh(m=2,legend=True,edgecolor=[0,0,0])
        plt.axis('off')
        set_axes_equal()
        
   .. |OrthMesh_3D_simplicial_fig1| image:: http://www.math.univ-paris13.fr/~cuvelier/software/codes/Python/fc-hypermesh/snapshots/OrthMesh_3D_simplicial_fig1_Python374.png
      :width: 300
      :align: middle
      
   .. |OrthMesh_3D_simplicial_fig2| image:: http://www.math.univ-paris13.fr/~cuvelier/software/codes/Python/fc-hypermesh/snapshots/OrthMesh_3D_simplicial_fig2_Python374.png
      :width: 300
      :align: middle
      
   +-------------------------------+-------------------------------+
   | |OrthMesh_3D_simplicial_fig1| | |OrthMesh_3D_simplicial_fig2| |
   +-------------------------------+-------------------------------+
      
-  Meshing the rectangle [-1,1]x[0,1] by orthotopes with 12+1 points in
   x-axis, 5+1 points in y-axis and 10+1 points in z-axis:

   .. code:: python

        from fc_hypermesh import OrthMesh
        oTh=OrthMesh(2,[12,5],type='orthotope',box=[[-1,1],[0,1]])

   If ``matplotlib`` package is installed one can represent the mesh

   .. code:: python
   
        from fc_tools.graphics import set_axes_equal
        import matplotlib.pyplot as plt
        plt.ion()
        plt.figure(1)
        oTh.plotmesh(legend=True)
        set_axes_equal()
        plt.figure(2)
        oTh.plotmesh(m=1,legend=True,linewidth=3)
        plt.axis('off')
        set_axes_equal()
        
   .. |OrthMesh_2D_orthotope_fig1| image:: http://www.math.univ-paris13.fr/~cuvelier/software/codes/Python/fc-hypermesh/snapshots/OrthMesh_2D_orthotope_fig1_Python374.png
      :width: 300
      :align: middle
      
   .. |OrthMesh_2D_orthotope_fig2| image:: http://www.math.univ-paris13.fr/~cuvelier/software/codes/Python/fc-hypermesh/snapshots/OrthMesh_2D_orthotope_fig2_Python374.png
      :width: 300
      :align: middle
      
   +------------------------------+------------------------------+
   | |OrthMesh_2D_orthotope_fig1| | |OrthMesh_2D_orthotope_fig2| |
   +------------------------------+------------------------------+
      
-  Meshing the rectangular cuboid [-1,1]x[0,1]x[0,2] by orthotopes with 11+1 points in
   x-axis, 5+1 points in y-axis and 10+1 points in z-axis:

   .. code:: python

        from fc_hypermesh import OrthMesh
        oTh=OrthMesh(3,[10,5,10],type='orthotope', box=[[-1,1],[0,1],[0,2]])

   If ``matplotlib`` package is installed one can represent the mesh

   .. code:: python
   
        from fc_tools.graphics import set_axes_equal
        import matplotlib.pyplot as plt
        plt.ion()
        plt.figure(1)
        oTh.plotmesh(legend=True,linewidth=0.5)
        set_axes_equal()
        plt.figure(2)
        oTh.plotmesh(m=2,legend=True,edgecolor=[0,0,0])
        plt.axis('off')
        set_axes_equal()
        
   .. |OrthMesh_3D_orthotope_fig1| image:: http://www.math.univ-paris13.fr/~cuvelier/software/codes/Python/fc-hypermesh/snapshots/OrthMesh_3D_orthotope_fig1_Python374.png
      :width: 300
      :align: middle
      
   .. |OrthMesh_3D_orthotope_fig2| image:: http://www.math.univ-paris13.fr/~cuvelier/software/codes/Python/fc-hypermesh/snapshots/OrthMesh_3D_orthotope_fig2_Python374.png
      :width: 300
      :align: middle
      
   +------------------------------+------------------------------+
   | |OrthMesh_3D_orthotope_fig1| | |OrthMesh_3D_orthotope_fig2| |
   +------------------------------+------------------------------+
      
Testing :
---------      
  There are eight demos functions in the ``fc_hypermesh.demos`` module named ``demo01`` to ``demo08``.
  The source code is in module ``demos.py``.
  For example, run the following code under Python:
  
  .. code:: python
  
      import fc_hypermesh
      fc_hypermesh.demos.demo01()
        
Benchmarking:
-------------

- Bench of the ``OrthMesh`` constructor for a 3-dimensional orthotope tessellated with (order 1) simplices.

  .. code:: python
  
      import fc_hypermesh
      fc_hypermesh.bench(3,range(20,170,20),type='simplex',box=[[-1,1],[-1,1],[-1,1]])
      
  The output of this code is::
  
      #---------------------------------------------------------------------------
      #    computer: zbook17
      #      system: Ubuntu 18.04.3 LTS (x86_64)
      #   processor: Intel(R) Core(TM) i7-4800MQ CPU @ 2.70GHz
      #              (1 procs/4 cores by proc/2 threads by core)
      #         RAM: 31.3 Go
      #    software: Python
      #     release: 3.7.6
      #---------------------------------------------------------------------------
      # fc_hypermesh.OrthMesh constructor with
      #   d      =3
      #   type   =simplex
      #   order  =1
      #   box    =[[-1, 1], [-1, 1], [-1, 1]]
      #   mapping=None
      #---------------------------------------------------------------------------
      #date:2019-12-29_14-13-35
      #nbruns:5
      #numpy:      i8        i8        i8            f8
      #format: {:>7d}   {:>10d}   {:>10d}      {:11.3f}
      #labels:      N        nq       nme   OrthMesh(s)
                   20      9261     48000         0.196
                   40     68921    384000         0.209
                   60    226981   1296000         0.302
                   80    531441   3072000         0.411
                  100   1030301   6000000         0.576
                  120   1771561  10368000         0.840
                  140   2803221  16464000         1.197
                  160   4173281  24576000         1.679  
                  
- Bench of the ``OrthMesh`` constructor for a 3-dimensional orthotope tessellated with 3-order simplices.

  .. code:: python
  
      import fc_hypermesh
      fc_hypermesh.bench(3,range(10,61,10),order=3,type='simplex',box=[[-1,1],[-1,1],[-1,1]])
      
  The output of this code is::

      #---------------------------------------------------------------------------
      #    computer: zbook17
      #      system: Ubuntu 18.04.3 LTS (x86_64)
      #   processor: Intel(R) Core(TM) i7-4800MQ CPU @ 2.70GHz
      #              (1 procs/4 cores by proc/2 threads by core)
      #         RAM: 31.3 Go
      #    software: Python
      #     release: 3.7.6
      #---------------------------------------------------------------------------
      # fc_hypermesh.OrthMesh constructor with
      #   d      =3
      #   type   =simplex
      #   order  =3
      #   box    =[[-1, 1], [-1, 1], [-1, 1]]
      #   mapping=None
      #---------------------------------------------------------------------------
      #date:2019-12-29_14-26-34
      #nbruns:5
      #numpy:      i8        i8        i8            f8
      #format: {:>7d}   {:>10d}   {:>10d}      {:11.3f}
      #labels:      N        nq       nme   OrthMesh(s)
                   10     29791      6000         0.143
                   20    226981     48000         0.222
                   30    753571    162000         0.269
                   40   1771561    384000         0.357
                   50   3442951    750000         0.500
                   60   5929741   1296000         0.733
  
- Bench of the ``OrthMesh`` constructor for a 5-dimensional orthotope tessellated with (order 1) orthotopes.

  .. code:: python
  
      import fc_hypermesh
      fc_hypermesh.bench(5,[5,10,15,20,25,27],type='orthotope',box=[[-1,1],[-1,1],[-1,1],[-1,1],[-1,1]])
      
  The output of this code is::

      #---------------------------------------------------------------------------
      #    computer: zbook17
      #      system: Ubuntu 18.04.3 LTS (x86_64)
      #   processor: Intel(R) Core(TM) i7-4800MQ CPU @ 2.70GHz
      #              (1 procs/4 cores by proc/2 threads by core)
      #         RAM: 31.3 Go
      #    software: Python
      #     release: 3.7.6
      #---------------------------------------------------------------------------
      # fc_hypermesh.OrthMesh constructor with
      #   d      =5
      #   type   =orthotope
      #   order  =1
      #   box    =[[-1, 1], [-1, 1], [-1, 1], [-1, 1], [-1, 1]]
      #   mapping=None
      #---------------------------------------------------------------------------
      #date:2019-12-29_14-18-30
      #nbruns:5
      #numpy:      i8        i8        i8            f8
      #format: {:>7d}   {:>10d}   {:>10d}      {:11.3f}
      #labels:      N        nq       nme   OrthMesh(s)
                    5      7776      3125         0.427
                   10    161051    100000         0.529
                   15   1048576    759375         0.844
                   20   4084101   3200000         1.789
                   25  11881376   9765625         4.296
                   27  17210368  14348907         5.958

