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

#include "GeomHexaCom.h"

/*
// ***********************************************************************
//                                                                       *
//     ELEMENT DE REFERENCE , POINTS D'INTEGRATION:                      *
//                                                                       *
//     Nicolas COUTY   04/12/95                                          *
//     Source : Dhatt et Touzot p 133, 134, 293                          *
//            + donnee suivante des valeurs des fonctions                *
//              d'interpolation aux points d'integration                 * 
//              (qui a permis la verification)                           * 
// ----------------------------------------------------------------------*
//
//                         |zeta
//                         | 
//        5________________|________8
//        |\               |       |\
//        | \              |       | \
//        |  \ .7          |  .5   |  \
//        |   \            |       |   \
//        |    \           |       |    \
//        |    6\________________________\7
//        |     |          |       |     | 
//        |   8.|          | 6.    |     |
//        |     |     .3    ----1.-------|----eta    
//       1|_____|___________\______|     |
//        \     |            \     \4    |
//         \    |             \     \    | 
//          \   |              \     \   |
//           \  |     .4        \.2   \  |
//            \ |                \     \ | 
//            2\|_________________\_____\|3
//                                 \
//                                  \xi
//
//
// Points d'integration 
// 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)
//
//  
// face 1 : noeud 1 4 3 2, face 2 : noeud 1 5 8 4,
// face 3 : noeud 1 2 6 5, face 4 : noeud 5 6 7 8,
// face 5 : noeud 2 3 7 6, face 6 : noeud 3 4 8 7,
//  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 2   2 3   3 4   4 1
//   1 5   2 6   3 7   4 8
//   5 6   6 7   7 8   8 5
//
//   on attribue 1 point d'integration par arete
//
//  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ù 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 GeomHexalin : public GeomHexaCom
{
  public :
    // CONSTRUCTEURS :
    // il y a 8 points d'integration  par défaut et 8 noeuds     
    GeomHexalin(int nbi = 8);
    // de copie
    GeomHexalin(const GeomHexalin& a);    
    // DESTRUCTEUR :
    ~GeomHexalin();
    
    // 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  
