// This file is part of the Herezh++ application.
//
// The finite element software Herezh++ is dedicated to the field
// of mechanics for large transformations of solid structures.
// It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600)
// INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) <https://www.irdl.fr/>.
//
// Herezh++ is distributed under GPL 3 license ou ultérieure.
//
// Copyright (C) 1997-2022 Université Bretagne Sud (France)
// AUTHOR : Gérard Rio
// E-MAIL  : gerardrio56@free.fr
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License,
// or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
// For more information, please consult: <https://herezh.irdl.fr/>.

/************************************************************************
 *     DATE:        10/02/2012                                          *
 *                                                                $     *
 *     AUTEUR:      G RIO   (mailto:gerardrio56@free.fr)                *
 *                                                                $     *
 *     PROJET:      Herezh++                                            *
 *                                                                $     *
 ************************************************************************
 *     BUT:  Definir  La geometrie de l'hexaedre cubique complet.       *
 *           Fonction d'interpolation, points d'integration etc         *
 *                                                                $     *
 *     ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''     *                                                                      *
 *     VERIFICATION:                                                    *
 *                                                                      *
 *     !  date  !   auteur   !       but                          !     *
 *     ------------------------------------------------------------     *
 *     !        !            !                                    !     *
 *                                                                $     *
 *     ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''     *
 *     MODIFICATIONS:                                                   *
 *     !  date  !   auteur   !       but                          !     *
 *     ------------------------------------------------------------     *
 *                                                                $     *
 ************************************************************************/
#ifndef GEOMHEXACUBIQUE_H
#define GEOMHEXACUBIQUE_H

#include"GeomHexaCom.h"
 
// l'élément cubique complet

/*
// ***********************************************************************
//                                                                      *
//     ELEMENT DE REFERENCE , POINTS D'INTEGRATION:                     *
//                                                                      *
//                                                                      *
//----------------------------------------------------------------------*
//
//                         |zeta(z)
//                         |										   noeuds internes:
//        5_______32_______|__31___8     						      
//        |\               |       |\								 tranche horizontale du bas     														
//        | 25             |       | 30								 (17)-(37)--(40)-(23)
//       18  \             |       24 \								  |     |    |    |			
//        |   26           |       |  29								 (41)-(57)--(60)-(54)  
//        |    \           |       |    \								  |     |    |    |  y  				
//        |    6\_____27_________28 _____\7							 (42)-(58)--(59)-(53)
//        |     |          |       23    |							  |     |    |    |			
//       17     |          |       |     |							 (19)-(49)--(50)-(21)					
//        |     20         -------- ---- 22---eta(y)                       x 										
//       1|_____|__16_______15____ 4     |	    				 tranche horizontale du haut
//        \     |            \     \     |							(18)-(38)--(39)-(24)
//         9    |             \    14    |							 |     |    |    |	
//          \   19             \     \  21							(44)-(61)--(64)-(59) 
//           10 |               \    13  |							 |     |    |    |  y  
//            \ |                \     \ |							(43)-(62)--(63)-(56)
//            2\|______11_______12\_____\|3							 |     |    |    |		
//                                 \									(20)-(52)--(51)-(22)													
//                                  \xi(x)								      x
//																						
//																										
//		        face 1							face 3 						face 4											
//													  z
//		 (1)--(16)--(15)--(4)			(5)--(25)--(26)--(6)			(5)--(32)--(31)--(8)								
//		  |     |    |    |				 |     |    |    |			 |     |    |    |									
//		 (9)--(33)--(36)-(14)			(18)-(44)--(43)-(20)			(25)-(45)--(48)-(30) 								
//		  |     |    |    |  y			 |     |    |    |   x		 |     |    |    |  y 								
//		 (10)-(34)--(35)-(13)			(17)-(41)--(42)-(19)			(26)-(46)--(47)-(29)								
//		  |     |    |    |				 |     |    |    |			 |     |    |    |									
//		 (2)--(11)--(12)--(3)			(1)---(9)--(10)--(2)			(6)--(27)--(28)--(7)								
//					x																   x
//
//
//		      face 2      					face 5					       face 6							
//				  z									  z								  z
//		(5)--(32)--(31)--(8)				(6)--(27)--(28)--(7)			(7)--(29)--(30)--(8)							
//		 |     |    |    |				 |     |    |    |			 |     |    |    |									
//		(18)-(38)--(39)-(24)				(20)-(52)--(51)-(22)			(22)-(56)--(55)-(24) 								
//		 |     |    |    |	y			 |     |    |    |	y	  x |     |    |    |   								
//		(17)-(37)--(40)-(23)				(19)-(49)--(50)-(21)			(21)-(53)--(54)-(23)							
//		 |     |    |    |				 |     |    |    |			 |     |    |    |									
//		(1)--(16)--(15)--(4)				(2)--(11)--(12)--(3)			(3)--(13)--(14)--(4)									
//																			
//																										
//																										
//																										
// Points d'integration  8, 27, 64 : par exemple pour 8 pti: 
// a=1/racine(3)
// Pt1 (a,a,a)  ; Pt2 (a,a,-a)  ; Pt3 (a,-a,a)  ; Pt4 (a,-a,-a)
// Pt5 (-a,a,a) ; Pt6 (-a,a,-a) ; Pt7 (-a,-a,a) ; Pt8 (-a,-a,-a)
//
// sinon on utilise les points d'intégrations calculés à partir du segment
// et on a 1,2x2x2, 3x3x3, 4x4x4 etc.
//  
// face 1 : noeud 1 4 3 2 16 15 14 13 12 11 10 9 33 36 35 34,  face 2 : noeud 1 5 8 4 17 18 32 31 24 23 15 16 37 38 39 40,
// face 3 : noeud 1 2 6 5 9 10 19 20 26 25 18 17 41 42 43 44,  face 4 : noeud 5 6 7 8 25 26 27 28 29 30 31 32 45 46 47 48,
// face 5 : noeud 2 3 7 6 11 12 21 22 28 27 20 19 49 50 51 52, face 6 : noeud 3 4 8 7 13 14 23 24 30 29 22 21 53 54 55 56,
//  les normales sortent des faces des elements
//
// pour les aretes, 12 aretes
//   1 9 10 2     2 11 12 3     3 13 14 4     4 15 16 1
//   1 17 18 5    2 19 20 6     3 21 22 7     4 23 24 8
//   5 25 26 6    6 27 28 7     7 29 30 8     8 31 32 5
//   
//
//
//  concernant la triangulation de chaque face elle est réalisée à l'aide
//  de la triangulation implantée sur l'élément de référence de la face
//  
//
// ************************************************************************
*/

// dans le cas où l'on sort des points d'intégrations par défaut on se sert
// d'une combinaison de segment pour recréer l'hexaèdre ce qui permet
// d'avoir 1x1x1, ou 2x2x2, ou 3x3x3, ou 4x4x4 etc. pt d'integ

// dans le cas où on utilise 27 pti, la numérotation est la suivante
// ( ici on ne représente pas le contour de l'élément)
//                                   |zeta
//                                   |
//                  19___________22__|________25
//                  |\               |       |\
//                  | \              |       | \
//                  |  20           23        |  26
//                  |   \            |       |   \
//                 10    \       13  |       16   \
//                  |   21\___________24___________\27
//                  |     |          |       |     |
//                  | 11  |         14       |16   |
//                  |     |           -------------|----eta
//                 1|_____|______4 ___\______7  17 |
//                  \    12          15      \     18
//                   \    |             \     \    |
//                    2   |         5    \     8   |
//                     \  |               \     \  |
//                      \ |                \     \ |
//                      3\|___________6 ____\_____\|9
//                                           \
//                                            \xi
// dans le cas où on utilise 64 pti, la numérotation suit la même logique
// on va indiquer les numéros par couche
//
//  couche 1)   27pti                              64 pti
//    *-------------*                      *--------------------*
//    | (7) (8) (9) |                      | (13)(14) (15) (16) |
//    |             |                      |                    |
//    | (4) (5) (6) | --> xi               | (9) (10) (11) (12) |
//    |             |                      |                    |  --> xi
//    | (1) (2) (3) |                      | (5)  (6)  (7)  (8) |
//    *-------------*                      |                    |
//                                         | (1)  (2)  (3)  (4) |
//                                         *--------------------*
//  couche 2)   27pti                              64 pti
//    *----------------*                   *------------------------*
//    | (16) (17) (18) |                   | (29)  (30)  (31)  (32) |
//    |                |                   |                        |
//    | (13) (14) (15) | --> xi            | (25)  (26)  (27)  (28) |
//    |                |                   |                        |   --> xi
//    | (10) (11) (12) |                   | (21)  (22)  (23)  (24) |
//    *----------------*                   |                        |
//                                         | (17)  (18)  (19)  (20) |
//                                         *------------------------*
//  couche 3)   27pti                              64 pti
//    *----------------*                   *------------------------*
//    | (25) (26) (27) |                   | (45)  (46)  (47)  (48) |
//    |                |                   |                        |
//    | (22) (23) (24) | --> xi            | (41)  (42)  (43)  (44) |
//    |                |                   |                        |  --> xi
//    | (19) (20) (21) |                   | (37)  (38)  (39)  (40) |
//    *----------------*                   |                        |
//                                         | (33)  (34)  (35)  (36) |
//                                         *------------------------*
//  couche 4)                                     64 pti
//                                         *------------------------*
//                                         | (61)  (62)  (63)  (64) |
//                                         |                        |
//                                         | (57)  (58)  (59)  (60) |
//                                         |                        |   --> xi
//                                         | (53)  (54)  (55)  (56) |
//                                         |                        |
//                                         | (49)  (50)  (51)  (52) |
//                                         *------------------------*

// pour ne pas surcharger la figure, on indique les pti de la base
// puis uniquement sur les arêtes
// à noter qu'ici on n'indique pas le cube d'interpolation des noeuds
// qui engloble les pti !
//                  |zeta
//                  |
// 49______53_______|57______61
// |\               |       |\
// |50              |       | \62
//33  \             |       45 \
// |  51            |       |   \63
// |    \           |       |    \
// |   52\______56_______60_______\64
//17     |          |       29    |
// |     |          |       |     |
// |    36           ------------48----eta
//1|_____|_5______9 _\_____13  17 |
// \     |            \      \    |
//  2    |  6      10  \     14  32
//   \  20              \      \  |
//    3  |    7      11  \     15 |
//     \ |                \      \|
//     4\|______8______12 _\______|16
//                          \
//                           \xi
//
         
/// @addtogroup Les_Elements_de_geometrie
///  @{
///

class GeomHexaCubique : public GeomHexaCom
{
  public :
    // CONSTRUCTEURS :
    // il y a 8 points d'integration par défaut et 27 noeuds     
    GeomHexaCubique(int nbi = 8);
    // de copie
    GeomHexaCubique(const GeomHexaCubique& a);    
    // DESTRUCTEUR :
    ~GeomHexaCubique();
    
    // création d'élément identiques : cette fonction est analogue à la fonction new
    // elle y fait d'ailleurs appel. l'implantation est spécifique dans chaque classe
    // dérivée
    // pt est le pointeur qui est affecté par la fonction 
    ElemGeomC0 * newElemGeomC0(ElemGeomC0 * pt) ;

    //--------- cas de coordonnees locales quelconques ---------------- 
    // retourne les fonctions d'interpolation au point M (en coordonnees locales)
    const Vecteur& Phi_point(const Coordonnee& M);
    // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales)
    const Mat_pleine& Dphi_point(const Coordonnee& M);
        
  protected :  
 
    // variables de stockage transitoire, locales pour éviter de les reconstruire à chaque appel
    Vecteur phi_M; // le tableau phi au point M(en coordonnees locales)
    Mat_pleine dphi_M; //les derivees des fonctions d'interpolation au point M(en coordonnees locales)

    // METHODES PROTEGEES :
    inline double& DPHI(int i,int j,int k) { return tabDPhi(k)(i,j);};
    inline double& PHI(int i,int j) {return tabPhi(j)(i); }; 
    // because les routine de calcul de phi et dphi aux pt d'integ sont trop grandes
    // on en fait des routines 
    void Phiphi();
    void DphiDphi();
    // constitution du tableau Extrapol
    void Calcul_extrapol(int nbi);
        
 };
 /// @}  // end of group

#endif