
// 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:        17/03/2003                                          *
 *                                                                $     *
 *     AUTEUR:      G RIO   (mailto:gerardrio56@free.fr)                *
 *                                                                $     *
 *     PROJET:      Herezh++                                            *
 *                                                                $     *
 ************************************************************************
 *     BUT:  Definir  La geometrie de l'hexaedre quadratique complet.   *
 *           Fonction d'interpolation, points d'integration etc         *
 *                                                                $     *
 *     ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''     *                                                                      *
 *     VERIFICATION:                                                    *
 *                                                                      *
 *     !  date  !   auteur   !       but                          !     *
 *     ------------------------------------------------------------     *
 *     !        !            !                                    !     *
 *                                                                $     *
 *     ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''     *
 *     MODIFICATIONS:                                                   *
 *     !  date  !   auteur   !       but                          !     *
 *     ------------------------------------------------------------     *
 *                                                                $     *
 ************************************************************************/
#ifndef GEOMHEXAQUADCOMP_H
#define GEOMHEXAQUADCOMP_H

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


/*
// ***********************************************************************
//                                                                      *
//     ELEMENT DE REFERENCE , POINTS D'INTEGRATION:                     *
//                                                                      *
//     construction à partir de l'éléments quadratique incomplet        *
//                                                                      *
//----------------------------------------------------------------------*
//
//                         |zeta
//                         |
//        5____________20__|________8
//        |\               |       |\
//        | \              |       | \
//        |  17           26        |  19
//        |   \            |       |   \
//       13    \       25  |       16   \
//        |    6\___________18___________\7
//        |     |          |       |     |
//        | 22  |         27       |  24 |
//        |     |           -------------|----eta
//       1|_____|______12___\______|     |
//        \     14          23     \4   15 
//         \    |             \     \    |
//          9   |         21   \     11  |
//           \  |               \     \  |
//            \ |                \     \ |
//            2\|___________10____\_____\|3
//                                 \
//                                  \xi
//
// par rapport au quadratique incomplet, 21 est au centre de  la face 1,
// 22 sur la face 3, 23 sur la face 5, 24 sur la face 6
// 25 sur la face 2, 26 sur la face 4, 27 au centre de l'élément
// Points d'integration  8 par défaut 
// 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 12 11 10 9 21, face 2 : noeud 1 5 8 4 13 20 16 12 25,
// face 3 : noeud 1 2 6 5 9 14 17 13 22, face 4 : noeud 5 6 7 8 17 18 19 20 26,
// face 5 : noeud 2 3 7 6 10 15 18 14 23, face 6 : noeud 3 4 8 7 11 16 19 15 24,
//  les normales sortent des faces des elements
//  on attribue 4 points d'integration par face
//
// pour les aretes on suis le fichier Elmail, 12 aretes
//   1 9 2   2 10 3   3 11 4   4 12 1
//   1 13 5  2 14 6   3 15 7   4 16 8
//   5 17 6   6 18 7   7 19 8   8 20 5
//   
//
//   on attribue 2 point d'integration par arete par défaut
//
//  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 GeomHexaQuadComp : public GeomHexaCom
{
  public :
    // CONSTRUCTEURS :
    // il y a 8 points d'integration par défaut et 27 noeuds     
    GeomHexaQuadComp(int nbi = 8);
    // de copie
    GeomHexaQuadComp(const GeomHexaQuadComp& a);    
    // DESTRUCTEUR :
    ~GeomHexaQuadComp();
    
    // 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  
