// 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) . // // 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 . // // For more information, please consult: . //#include "Debug.h" #include "GeomPentaQ.h" #include #include "GeomSeg.h" #include "GeomTriangle.h" #include "GeomQuadrangle.h" #include "MathUtil.h" #include "GeomPentaL.h" // constructeur // la dimension est 3, on a nbi pt d'integration ( 6 par défaut), 15 noeuds et 5 faces, 9 aretes GeomPentaQ::GeomPentaQ(int nbi) : GeomPentaCom(nbi,15,QUADRATIQUE) ,phi_M(),dphi_M() { // coordonnees dans l'élément de référence des noeuds ptelem(1) = Coordonnee(0,0,-1.); ptelem(2) = Coordonnee(1.,0,-1.); ptelem(3) = Coordonnee(0,1.,-1.); ptelem(4) = Coordonnee(0,0,1.); ptelem(5) = Coordonnee(1.,0,1.); ptelem(6) = Coordonnee(0,1.,1.); ptelem(7) = Coordonnee(0.5,0,-1.); ptelem(8) = Coordonnee(0.5,0.5,-1.); ptelem(9) = Coordonnee(0,0.5,-1.); ptelem(10) = Coordonnee(0,0,0); ptelem(11) = Coordonnee(1.,0,0.); ptelem(12) = Coordonnee(0,1.,0); ptelem(13) = Coordonnee(0.5,0,1.); ptelem(14) = Coordonnee(0.5,0.5,1.); ptelem(15) = Coordonnee(0,0.5,1.); // définition de la numérotation locale de l'élément de direction inverse INVCONNEC(1) = 1; INVCONNEC(2) = 3; INVCONNEC(3) = 2; INVCONNEC(4) = 4; INVCONNEC(5) = 6; INVCONNEC(6) = 5; INVCONNEC(7) = 9; INVCONNEC(8) = 8; INVCONNEC(9) = 7; INVCONNEC(10) = 10;INVCONNEC(11) = 12; INVCONNEC(12) = 11; INVCONNEC(13) = 15;INVCONNEC(14) = 14; INVCONNEC(15) = 13; // le tableau des tranches IND.Change_taille(4); IND(1)= 6; // les sommets IND(2)= 3; // les 3 noeuds quadratiques de la face du dessous IND(3)= 3; // les 3 noeuds quadratiques verticaux IND(4)= 3; // les 3 noeuds quadratiques de la face du dessus //-------------------------------- //def des arretes //-------------------------------- int nbill =2; // nb de pt d'integ par ligne int nbnel =3; // nb de noeud du segment seg(1) = new GeomSeg(nbill,nbnel); for (int il=2;il<= NBSE; il++) // ici NBSE = 9 seg(il) = seg(1); // def des tableaux de connection des noeuds des aretes for (int i =1;i<=NBSE;i++) NONS(i).Change_taille(nbnel); // la description est fait selon le fichier EIMail NONS(1)(1) = 1;NONS(1)(2) = 7;NONS(1)(3) = 2; NONS(2)(1) = 2;NONS(2)(2) = 8;NONS(2)(3) = 3; NONS(3)(1) = 3;NONS(3)(2) = 9;NONS(3)(3) = 1; NONS(4)(1) = 1;NONS(4)(2) = 10;NONS(4)(3) = 4; NONS(5)(1) = 2;NONS(5)(2) = 11;NONS(5)(3) = 5; NONS(6)(1) = 3;NONS(6)(2) = 12;NONS(6)(3) = 6; NONS(7)(1) = 4;NONS(7)(2) = 13;NONS(7)(3) = 5; NONS(8)(1) = 5;NONS(8)(2) = 14;NONS(8)(3) = 6; NONS(9)(1) = 6;NONS(9)(2) = 15;NONS(9)(3) = 4; //-------------------------------- //def des faces //-------------------------------- // 1) tout d'abord les faces verticales quadrangulaire int nbqis =4; // nb de pt d'integ par facee int nbqnes =8; // nb de noeud de la face face(2) = new GeomQuadrangle(nbqis,nbqnes); face(3) = face(2); face(5) = face(2); // 2) puis les faces haut et bas triangulairesv int nbtis =3; // nb de pt d'integ par facee int nbtnes =6; // nb de noeud de la face face(1) = new GeomTriangle(nbtis,nbtnes); face(4) = face(1); // def des tableaux de connection des noeuds des faces // 1) les quadrangles NONF(2).Change_taille(nbqnes);NONF(3).Change_taille(nbqnes); NONF(5).Change_taille(nbqnes); // 2) les triangles NONF(1).Change_taille(nbtnes);NONF(4).Change_taille(nbtnes); // connection entre les noeuds des faces et les noeuds des elements NONF(1)(1)= 1; NONF(1)(2)= 3; NONF(1)(3)= 2; NONF(1)(4)= 9; NONF(1)(5)= 8; NONF(1)(6)= 7; NONF(2)(1)= 1;NONF(2)(2)= 4; NONF(2)(3)= 6;NONF(2)(4)= 3; NONF(2)(5)= 10;NONF(2)(6)= 15; NONF(2)(7)= 12;NONF(2)(8)= 9; NONF(3)(1)= 1; NONF(3)(2)= 2;NONF(3)(3)= 5;NONF(3)(4)= 4; NONF(3)(5)= 7; NONF(3)(6)= 11;NONF(3)(7)= 13;NONF(3)(8)= 10; NONF(4)(1)= 4; NONF(4)(2)= 5; NONF(4)(3)= 6; NONF(4)(4)= 13; NONF(4)(5)= 14; NONF(4)(6)= 15; NONF(5)(1)= 2; NONF(5)(2)= 3;NONF(5)(3)= 6;NONF(5)(4)= 5; NONF(5)(5)= 8; NONF(5)(6)= 12;NONF(5)(7)= 14;NONF(5)(8)= 11; // triangulation des différentes faces // on se sert d'une part de l'élément de référence de chaque face // puis de la connection les faces par rapport à celle de l'élément // ici c'est le même élément pour toutes les faces // on est obligé de boucler sur tous les indices et de faire // de l'adressage indirecte for (int isf=1;isf<= NBFE; isf++) // boucle sur les faces {// 1) récup du tableau de l'élément de référence de la face const Tableau > > & tabi = face(isf)->Trian_lin(); int nbtria = tabi(1).Taille(); // nombre de triangle par face NONFt(isf).Change_taille(nbtria); for (int if1=1;if1<= nbtria; if1++) // boucle sur les triangles de la face { NONFt(isf)(if1).Change_taille(3); for (int in1=1;in1<= 3; in1++) // boucle sur les noeuds du triangle NONFt(isf)(if1)(in1) = NONF(isf)(tabi(1)(if1)(in1)); } } // fonctions d'interpolation globales aux points d'intégrations for (int ptint=1;ptint<= nbi; ptint++) tabPhi(ptint) = Phi_point( ptInteg(ptint)); // derivees des fonctions d'interpolations aux points d'intégrations for (int ptint=1;ptint<= nbi; ptint++) tabDPhi(ptint) = Dphi_point( ptInteg(ptint)); // ---- constitution du tableau Extrapol ----- Calcul_extrapol(nbi); }; // destructeur GeomPentaQ::~GeomPentaQ() { delete seg(1); delete face(1); delete face(2); }; // constructeur de copie GeomPentaQ::GeomPentaQ(const GeomPentaQ& a) : GeomPentaCom(a),phi_M(a.phi_M),dphi_M(a.dphi_M) { // la copie des parties pointées est à la charge de la classe spécifique // definition des faces face(1) = new GeomTriangle(*((GeomTriangle*)(a.face(1)))); face(4) = face(1); face(2) = new GeomQuadrangle(*((GeomQuadrangle*)(a.face(2)))); face(3) = face(2); face(5) = face(2); // def des segments seg(1) = new GeomSeg(*((GeomSeg*)(a.seg(1)))) ; for (int il=2;il<= NBSE; il++) seg(il) = seg(1); }; // 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 * GeomPentaQ::newElemGeomC0(ElemGeomC0 * pt) { pt = new GeomPentaQ(*this); return pt; }; //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) const Vecteur& GeomPentaQ::Phi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales if (M.Dimension() != 3) { cout << "\n erreur la dimension des coordonnees locales :" << M.Dimension() <<"n\'est pas egale a 3 " << "\nGeomPentaQ::Phi(Coordonnee& M)"; Sortie(1); } #endif // Vecteur phi(NBNE); // tableau des fonctions d'interpolation // dimentionnement éventuelle du tableau des fonctions d'interpolation phi_M.Change_taille(NBNE); // si la taille est identique -> aucune action // construction à partir des triangles des faces Vecteur phisurf=face(1)->Phi_point(Coordonnee(M(1),M(2))); double KSI = M(1); double ETA = M(2); double DZETA = M(3); double fsup=(1.+ DZETA)*DZETA/2.; double finf=-(1.-DZETA)*DZETA/2.; double LAMBDA= 1. - KSI - ETA; double C = 1. - DZETA*DZETA; phi_M(1)=phisurf(1)*finf; phi_M(2)=phisurf(2)*finf; phi_M(3)=phisurf(3)*finf; phi_M(7)=phisurf(4)*finf; phi_M(8)=phisurf(5)*finf; phi_M(9)=phisurf(6)*finf; phi_M(4) =phisurf(1)*fsup; phi_M(5) =phisurf(2)*fsup; phi_M(6) =phisurf(3)*fsup; phi_M(13)=phisurf(4)*fsup; phi_M(14)=phisurf(5)*fsup; phi_M(15)=phisurf(6)*fsup; phi_M(10)=LAMBDA*C;phi_M(11)=KSI *C;phi_M(12)=ETA *C; /* // -------------------------------------------------------- // -------------------- cas quadratique ------------------- // ---- (voir p. 178 livre de J.L. BATOZ, G. DHATT) ---- // ---- Modelisation des structures par elements finis ---- // -------------------- volume1 ------------------------ // -------------------------------------------------------- double KSI = M(1); double ETA = M(2); double DZETA = M(3); double LAMBDA= 1. - KSI - ETA; double A = (1.-DZETA)/2.; double B = (1.+DZETA)/2.; double C = 1. - DZETA*DZETA; phi(1)=A*LAMBDA*(2.*LAMBDA-DZETA-2.); phi(2)=A*KSI *(2.*KSI - DZETA - 2.); phi(3)=A*ETA *(2.*ETA - DZETA - 2.); phi(4)=B*LAMBDA*(2.*LAMBDA+DZETA - 2.); phi(5)=B*KSI *(2.*KSI +DZETA - 2.); phi(6)=B*ETA *(2.*ETA +DZETA - 2.); phi(7)=4.*A*LAMBDA*KSI; phi(8)=4.*A*KSI *ETA; phi(9)=4.*A*ETA *LAMBDA; phi(10)=LAMBDA*C; phi(11)=KSI *C; phi(12)=ETA *C; phi(13)=4.*B*LAMBDA*KSI; phi(14)=4.*B*KSI *ETA; phi(15)=4.*B*ETA *LAMBDA;*/ // retour de phi return phi_M; }; // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) const Mat_pleine& GeomPentaQ::Dphi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales if (M.Dimension() != 3) { cout << "\n erreur la dimension des coordonnees locales :" << M.Dimension() <<"n\'est pas egale a 3 " << "\nGeomPentaQ::Dphi(Coordonnee& M)"; Sortie(1); } #endif // Mat_pleine dphi(3,NBNE); // le tableau des derivees // le tableau des derivees: redimentionnement si nécessaire if ((dphi_M.Nb_ligne() != 3)&&(dphi_M.Nb_colonne() != NBNE)) dphi_M.Initialise (3,NBNE,0.); // construction à partir des triangles des faces Vecteur phisurf=face(1)->Phi_point(Coordonnee(M(1),M(2))); Mat_pleine dphisurf=face(1)->Dphi_point(Coordonnee(M(1),M(2))); double KSI = M(1); double ETA = M(2); double DZETA = M(3); double fsup=(1.+ DZETA)*DZETA/2.; double finf=-(1.-DZETA)*DZETA/2.; double dfsup=(1.+ 2.*DZETA)/2.; double dfinf=(2.*DZETA-1.)/2.; double LAMBDA= 1. - KSI - ETA; double C = 1. - DZETA*DZETA; double d1LAMBDA= -1.; double d2LAMBDA=-1.; double dC= -2.* DZETA; dphi_M(1,1)=dphisurf(1,1)*finf; dphi_M(1,2)=dphisurf(1,2)*finf; dphi_M(1,3)=dphisurf(1,3)*finf; dphi_M(1,7)=dphisurf(1,4)*finf; dphi_M(1,8)=dphisurf(1,5)*finf; dphi_M(1,9)=dphisurf(1,6)*finf; dphi_M(2,1)=dphisurf(2,1)*finf; dphi_M(2,2)=dphisurf(2,2)*finf; dphi_M(2,3)=dphisurf(2,3)*finf; dphi_M(2,7)=dphisurf(2,4)*finf; dphi_M(2,8)=dphisurf(2,5)*finf; dphi_M(2,9)=dphisurf(2,6)*finf; dphi_M(3,1)=phisurf(1)*dfinf; dphi_M(3,2)=phisurf(2)*dfinf; dphi_M(3,3)=phisurf(3)*dfinf; dphi_M(3,7)=phisurf(4)*dfinf; dphi_M(3,8)=phisurf(5)*dfinf; dphi_M(3,9)=phisurf(6)*dfinf; dphi_M(1,4) = dphisurf(1,1)*fsup; dphi_M(1,5) = dphisurf(1,2)*fsup; dphi_M(1,6) = dphisurf(1,3)*fsup; dphi_M(1,13)= dphisurf(1,4)*fsup; dphi_M(1,14)= dphisurf(1,5)*fsup; dphi_M(1,15)= dphisurf(1,6)*fsup; dphi_M(2,4) = dphisurf(2,1)*fsup; dphi_M(2,5) = dphisurf(2,2)*fsup; dphi_M(2,6) = dphisurf(2,3)*fsup; dphi_M(2,13)= dphisurf(2,4)*fsup; dphi_M(2,14)= dphisurf(2,5)*fsup; dphi_M(2,15)= dphisurf(2,6)*fsup; dphi_M(3,4) = phisurf(1)*dfsup; dphi_M(3,5) = phisurf(2)*dfsup; dphi_M(3,6) = phisurf(3)*dfsup; dphi_M(3,13)= phisurf(4)*dfsup; dphi_M(3,14)= phisurf(5)*dfsup; dphi_M(3,15)= phisurf(6)*dfsup; dphi_M(1,10)=d1LAMBDA*C; dphi_M(1,11)=C; dphi_M(1,12)=0.; dphi_M(2,10)=d2LAMBDA*C; dphi_M(2,11)=0.; dphi_M(2,12)=C; dphi_M(3,10)=LAMBDA*dC; dphi_M(3,11)=KSI * dC; dphi_M(3,12)=ETA * dC; /* // -------------------------------------------------------- // -------------------- cas quadratique ------------------- // ---- (voir p. 178 livre de J.L. BATOZ, G. DHATT) ---- // ---- Modelisation des structures par elements finis ---- // -------------------- volume1 ------------------------ // -------------------------------------------------------- double KSI = M(1); double ETA = M(2); double DZETA = M(3); double LAMBDA= 1. - KSI - ETA; double A = (1.-DZETA)/2.; double B = (1.+DZETA)/2.; double C = 1. - DZETA*DZETA; // ------------------------------------------ // derivees par rapport a KSI et ETA // ------------------------------------------ dphi_M(1,1)=A*(-4.*LAMBDA+DZETA+2.); dphi_M(2,1)=A*(-4.*LAMBDA+DZETA+2.); dphi_M(1,2)=A*(4.*KSI-DZETA-2.); dphi_M(2,2)=0; dphi_M(1,3)=0; dphi_M(2,3)=A*(4.*ETA-DZETA-2.); dphi_M(1,4)=B*(-4.*LAMBDA-DZETA+2.); dphi_M(2,4)=B*(-4.*LAMBDA-DZETA+2.); dphi_M(1,5)=B*(4.*KSI+DZETA-2.); dphi_M(2,5)=0.; dphi_M(1,6)=0.; dphi_M(2,6)=B*(4.*ETA+DZETA-2.); dphi_M(1,7)=4.*A*(-KSI+LAMBDA); dphi_M(2,7)=-4.*A*KSI; dphi_M(1,8)=4.*A*ETA; dphi_M(2,8)=4.*A*KSI; dphi_M(1,9)=-4.*A*ETA; dphi_M(2,9)=4.*A*(LAMBDA-ETA); dphi_M(1,10)=-C; dphi_M(2,10)=-C; dphi_M(1,11)=C; dphi_M(2,11)=0.; dphi_M(1,12)=0.; dphi_M(2,12)=C; dphi_M(1,13)=4.*B*(LAMBDA-KSI); dphi_M(2,13)=-4.*B*KSI; dphi_M(1,14)=4.*B*ETA; dphi_M(2,14)=4.*B*KSI; dphi_M(1,15)=-4.*B*ETA; dphi_M(2,15)=4.*B*(LAMBDA-ETA); // ------------------------------------- // derivees par rapport a DZETA // ------------------------------------- dphi_M(3,1)=-0.5*LAMBDA*(2.*LAMBDA-DZETA-2.)-LAMBDA*A; dphi_M(3,2)=-0.5*KSI*(2.*KSI-DZETA-2.)-KSI*A; dphi_M(3,3)=-0.5*ETA*(2.*ETA-DZETA-2.)-ETA*A; dphi_M(3,4)=0.5*LAMBDA*(2.*LAMBDA+DZETA-2.)+LAMBDA*B; dphi_M(3,5)=0.5*KSI*(2.*KSI+DZETA-2.)+KSI*B; dphi_M(3,6)=0.5*ETA*(2.*ETA+DZETA-2.)+ETA*B; dphi_M(3,7)=-2.*LAMBDA*KSI; dphi_M(3,8)=-2.*KSI*ETA; dphi_M(3,9)=-2.*ETA*LAMBDA; dphi_M(3,10)=-2.*DZETA*LAMBDA; dphi_M(3,11)=-2.*DZETA*KSI; dphi_M(3,12)=-2.*DZETA*ETA; dphi_M(3,13)=2.*LAMBDA*KSI; dphi_M(3,14)=2.*KSI*ETA; dphi_M(3,15)=2.*ETA*LAMBDA;*/ // retour des derivees return dphi_M; }; /* // retourne les fonctions d'interpolation au point M (en coordonnees locales) Vecteur GeomPentaQ::Phi(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales if (M.Dimension() != 3) { cout << "\n erreur la dimension des coordonnees locales :" << M.Dimension() <<"n\'est pas egale a 3 " << "\nGeomPentaQ::Phi(Coordonnee& M)"; Sortie(1); } #endif Vecteur phi(NBNE); // tableau des fonctions d'interpolation // -------------------------------------------------------- // -------------------- cas quadratique ------------------- // ---- (voir p. 178 livre de J.L. BATOZ, G. DHATT) ---- // ---- Modelisation des structures par elements finis ---- // -------------------- volume1 ------------------------ // -------------------------------------------------------- int nbi = tabPhi.Taille(); int nbil,nbis; // nbptint dans la hauteur et dans la surface switch (nbi) { case 2 : nbil = 2; nbis = 1; break; case 3 : nbil = 3; nbis = 1; break; case 6 : nbil = 2; nbis = 3; break; case 8 : nbil = 2; nbis = 4; break; case 9 : nbil = 3; nbis = 3; break; case 12 : nbil = 3; nbis = 4; break; default : {cout << "\n erreur le pentaèdre quadratique de nombre de point d'intégration = " << nbi << "\n n\'est pas implante !! "; cout << "\nVecteur GeomPentaQ::Phi(const Coordonnee& M) " << endl; Sortie(1); } } int ni=1; double KSI = M(1); double ETA = M(2); double DZETA = M(3); for (int NIS =1;NIS<= nbis;NIS++) {double LAMBDA= 1. -M(1) -M(2); for (int NIH=1;NIH<=nbil;NIH++,ni++) { double LAMBDA= 1. - KSI - ETA; double A = (1.-DZETA)/2.; double B = (1.+DZETA)/2.; double C = 1. - DZETA*DZETA; tabPhi(ni)(1)=A*LAMBDA*(2.*LAMBDA-DZETA-2.); tabPhi(ni)(2)=A*KSI *(2.*KSI - DZETA - 2.); tabPhi(ni)(3)=A*ETA *(2.*ETA - DZETA - 2.); tabPhi(ni)(4)=B*LAMBDA*(2.*LAMBDA+DZETA - 2.); tabPhi(ni)(5)=B*KSI *(2.*KSI +DZETA - 2.); tabPhi(ni)(6)=B*ETA *(2.*ETA +DZETA - 2.); tabPhi(ni)(7)=4.*A*LAMBDA*KSI; tabPhi(ni)(8)=4.*A*KSI *ETA; tabPhi(ni)(9)=4.*A*ETA *LAMBDA; tabPhi(ni)(10)=LAMBDA*C; tabPhi(ni)(11)=KSI *C; tabPhi(ni)(12)=ETA *C; tabPhi(ni)(13)=4.*B*LAMBDA*KSI; tabPhi(ni)(14)=4.*B*KSI *ETA; tabPhi(ni)(15)=4.*B*ETA *LAMBDA; } } // retour de phi return phi; }; // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) Mat_pleine GeomPentaQ::Dphi(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales if (M.Dimension() != 3) { cout << "\n erreur la dimension des coordonnees locales :" << M.Dimension() <<"n\'est pas egale a 3 " << "\nGeomPentaQ::Dphi(Coordonnee& M)"; Sortie(1); } #endif Mat_pleine dphi(3,NBNE); // le tableau des derivees // -------------------------------------------------------- // -------------------- cas quadratique ------------------- // ---- (voir p. 178 livre de J.L. BATOZ, G. DHATT) ---- // ---- Modelisation des structures par elements finis ---- // -------------------- volume1 ------------------------ // -------------------------------------------------------- int nbi = tabPhi.Taille(); int nbil,nbis; // nbptint dans la hauteur et dans la surface switch (nbi) { case 2 : nbil = 2; nbis = 1; break; case 3 : nbil = 3; nbis = 1; break; case 6 : nbil = 2; nbis = 3; break; case 8 : nbil = 2; nbis = 4; break; case 9 : nbil = 3; nbis = 3; break; case 12 : nbil = 3; nbis = 4; break; default : {cout << "\n erreur le pentaèdre quadratique de nombre de point d'intégration = " << nbi << "\n n\'est pas implante !! "; cout << "\nVecteur GeomPentaQ::Phi(const Coordonnee& M) " << endl; Sortie(1); } } int ni=1; double KSI = M(1); double ETA = M(2); double DZETA = M(3); for (int NIS =1;NIS<= nbis;NIS++) {double LAMBDA= 1. -M(1) -M(2); for (int NIH=1;NIH<=nbil;NIH++,ni++) { double LAMBDA= 1. - KSI - ETA; double A = (1.-DZETA)/2.; double B = (1.+DZETA)/2.; double C = 1. - DZETA*DZETA; // ------------------------------------------ // derivees par rapport a KSI et ETA // ------------------------------------------ DPHI(1,1,ni)=A*(-4.*LAMBDA+DZETA+2.); DPHI(2,1,ni)=A*(-4.*LAMBDA+DZETA+2.); DPHI(1,2,ni)=A*(4.*KSI-DZETA-2.); DPHI(2,2,ni)=0; DPHI(1,3,ni)=0; DPHI(2,3,ni)=A*(4.*ETA-DZETA-2.); DPHI(1,4,ni)=B*(-4.*LAMBDA-DZETA+2.); DPHI(2,4,ni)=B*(-4.*LAMBDA-DZETA+2.); DPHI(1,5,ni)=B*(4.*KSI+DZETA-2.); DPHI(2,5,ni)=0.; DPHI(1,6,ni)=0.; DPHI(2,6,ni)=B*(4.*ETA+DZETA-2.); DPHI(1,7,ni)=4.*A*(-KSI+LAMBDA); DPHI(2,7,ni)=-4.*A*KSI; DPHI(1,8,ni)=4.*A*ETA; DPHI(2,8,ni)=4.*A*KSI; DPHI(1,9,ni)=-4.*A*ETA; DPHI(2,9,ni)=4.*A*(LAMBDA-ETA); DPHI(1,10,ni)=-C; DPHI(2,10,ni)=-C; DPHI(1,11,ni)=C; DPHI(2,11,ni)=0.; DPHI(1,12,ni)=0.; DPHI(2,12,ni)=C; DPHI(1,13,ni)=4.*B*(LAMBDA-KSI); DPHI(2,13,ni)=-4.*B*KSI; DPHI(1,14,ni)=4.*B*ETA; DPHI(2,14,ni)=4.*B*KSI; DPHI(1,15,ni)=-4.*B*ETA; DPHI(2,15,ni)=4.*B*(LAMBDA-ETA); // ------------------------------------- // derivees par rapport a DZETA // ------------------------------------- DPHI(3,1,ni)=-0.5*LAMBDA*(2.*LAMBDA-DZETA-2.)-LAMBDA*A; DPHI(3,2,ni)=-0.5*KSI*(2.*KSI-DZETA-2.)-KSI*A; DPHI(3,3,ni)=-0.5*ETA*(2.*ETA-DZETA-2.)-ETA*A; DPHI(3,4,ni)=0.5*LAMBDA*(2.*LAMBDA+DZETA-2.)+LAMBDA*B; DPHI(3,5,ni)=0.5*KSI*(2.*KSI+DZETA-2.)+KSI*B; DPHI(3,6,ni)=0.5*ETA*(2.*ETA+DZETA-2.)+ETA*B; DPHI(3,7,ni)=-2.*LAMBDA*KSI; DPHI(3,8,ni)=-2.*KSI*ETA; DPHI(3,9,ni)=-2.*ETA*LAMBDA; DPHI(3,10,ni)=-2.*DZETA*LAMBDA; DPHI(3,11,ni)=-2.*DZETA*KSI; DPHI(3,12,ni)=-2.*DZETA*ETA; DPHI(3,13,ni)=2.*LAMBDA*KSI; DPHI(3,14,ni)=2.*KSI*ETA; DPHI(3,15,ni)=2.*ETA*LAMBDA; } } // retour des derivees return dphi; }; // en fonction de coordonnees locales, retourne true si le point est a l'interieur // de l'element, false sinon bool GeomPentaQ::Interieur(const Coordonnee& M) { if ((seg(1)->Interieur(M(3))) &&(face(1)->Interieur(Coordonnee(M(1),M(2))))) return true; else return false; }; */ // constitution du tableau Extrapol void GeomPentaQ::Calcul_extrapol(int nbi) { // cas de l'extrapolation de grandeur des points d'intégrations aux noeuds // def du tableau de pondération tab(i)(j) qu'il faut appliquer // aux noeuds pour avoir la valeur aux noeuds // val_au_noeud(i) = somme_(de j=indir(i)(1) à indir(i)(taille(indir(i)) )) {tab(i)(j) * val_pt_integ(j) } // cas = 1: la valeur au noeud = la valeur au pt d'integ le plus près ou une moyenne des // pt les plus près (si le nb de pt d'integ < nb noeud) // --- pour l'instant seul le cas 1 est implanté --- Tableau > & indir = extrapol(1).indir; // pour simplifier Tableau > & tab = extrapol(1).tab; // pour simplifier //on définit un pentaèdre linéaire qui va nous permettre d'extrapoler // pour les nbi >= 6 GeomPentaL penta(6); switch (nbi) { case 2: { // cas avec deux points d'intégration, Tableau indirect(nbi); // tableau de travail: on a 2 pondérations // tab est supposé être initialisé à 0. Tableau gi_B,gi_H; // bases naturelle et duale // --- méthode 1 (par défaut), on utilise une extrapolation linéaire dans l'épaisseur {Tableau > & indir = extrapol(1).indir; // pour simplifier Tableau > & tab = extrapol(1).tab; // pour simplifier indirect(1)=1; indirect(2)=2; tab.Change_taille(NBNE);indir.Change_taille(NBNE); // cas de la première nappe quadratique { // il nous faut calculer la coordonnée locale theta^3 des 6 noeuds // par exemple du premier noeud. int ne1 = 1; // les pti ici considérés, sont les extrémités d'un segment Coordonnee theta(1); // la coordonnée que l'on cherche Vecteur phi_z(2); // le conteneur pour les fonctions d'interpolation // suivant z {Bases_naturel_duales(indirect,gi_B,gi_H); Coordonnee O(0.5*(ptInteg(indirect(1))+ptInteg(indirect(2)))); // ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne1),phi_z,theta); } // maintenant on va attribuer aux 6 noeuds de la facette la valeur extrapolée Tableau J(6); J(1)=1; J(2) = 2; J(3) = 3; J(4) = 7; J(5)=8; J(6)=9; // indirection for (int ine=1;ine<=6;ine++) {int ne = J(ine); indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); // ici nbi ==2 for (int i=1;i<=nbi;i++) {tab(ne)(indirect(i))=phi_z(i); indir(ne)(i)=indirect(i); }; }; }; // idem pour la seconde nappe qui est ici linéaire donc 3 noeuds { // il nous faut calculer la coordonnée locale theta^3 des 3 noeuds // c-a-d celle du centre de gravité par exemple ou du 4ieme noeud. // on retient le 10ieme noeud int ne1 = 10; // les pti ici considérés, sont les extrémités d'un segment Coordonnee theta(1); // la coordonnée que l'on cherche Vecteur phi_z(2); // le conteneur pour les fonctions d'interpolation // suivant z {Bases_naturel_duales(indirect,gi_B,gi_H); Coordonnee O(0.5*(ptInteg(indirect(1))+ptInteg(indirect(2)))); // ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne1),phi_z,theta); } // maintenant on va attribuer aux 3 noeuds de la facette la valeur extrapolée for (int ne=10;ne<=12;ne++) {indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); // ici nbi ==2 for (int i=1;i<=nbi;i++) {tab(ne)(indirect(i))=phi_z(i); indir(ne)(i)=indirect(i); }; }; }; }; // et enfin le cas de la dernière nappe quadratique { // il nous faut calculer la coordonnée locale theta^3 des 6 noeuds // par exemple du 5ième noeud. int ne1 = 5; // les pti ici considérés, sont les extrémités d'un segment Coordonnee theta(1); // la coordonnée que l'on cherche Vecteur phi_z(2); // le conteneur pour les fonctions d'interpolation // suivant z {Bases_naturel_duales(indirect,gi_B,gi_H); Coordonnee O(0.5*(ptInteg(indirect(1))+ptInteg(indirect(2)))); // ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne1),phi_z,theta); } // maintenant on va attribuer aux 6 noeuds de la facette la valeur extrapolée Tableau J(6); J(1)=4; J(2) = 5; J(3) = 6; J(4) = 13; J(5)= 14; J(6)= 15; // indirection for (int ine=1;ine<=6;ine++) {int ne = J(ine); indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); // ici nbi ==2 for (int i=1;i<=nbi;i++) {tab(ne)(indirect(i))=phi_z(i); indir(ne)(i)=indirect(i); }; }; }; // --- ancienne méthode // // on reporte la valeur au premier pt d'integ, telle quelle aux noeuds du bas // for (int ne=1;ne<=3;ne++) // {tab(ne)(1)=1.; // indir(ne).Change_taille(1); indir(ne)(1)=1; // }; // for (int ne=7;ne<=9;ne++) // {tab(ne)(1)=1.; // indir(ne).Change_taille(1); indir(ne)(1)=1; // }; // // on reporte la valeur au second pt d'integ, telle quelle aux noeuds du haut // for (int ne=4;ne<=6;ne++) // {tab(ne)(2)=1.; // indir(ne).Change_taille(1); indir(ne)(1)=2; // }; // for (int ne=13;ne<=15;ne++) // {tab(ne)(2)=1.; // indir(ne).Change_taille(1); indir(ne)(1)=2; // }; // // on reporte la moyenne des valeurs deux pt d'integ pour les noeuds du milieu // for (int ne=10;ne<=12;ne++) // {tab(ne)(1)=0.5;tab(ne)(2)=0.5; // indir(ne).Change_taille(2); indir(ne)(1)=1;indir(ne)(2)=2; // }; break; } case 3: { // cas avec 3 points d'intégration, // tab est supposé être initialisé à 0. Tableau gi_B,gi_H; // bases naturelle et duale // --- méthode 1 (par défaut), on utilise une extrapolation linéaire dans l'épaisseur {Tableau > & indir = extrapol(1).indir; // pour simplifier Tableau > & tab = extrapol(1).tab; // pour simplifier Tableau indirect(nbi); // tableau de travail: on a 2 pondérations tab.Change_taille(NBNE);indir.Change_taille(NBNE); // cas de la première nappe quadratique { // il nous faut calculer la coordonnée locale theta^3 des 6 noeuds // par exemple du premier noeud. int ne1 = 1; // les pti ici considérés, sont les extrémités d'un segment Coordonnee theta(1); // la coordonnée que l'on cherche Vecteur phi_z(2); // le conteneur pour les fonctions d'interpolation indirect(1)=1; indirect(2)=2; // on utilise les 2 premiers pti pour l'extrapolation // suivant z {Bases_naturel_duales(indirect,gi_B,gi_H); Coordonnee O(0.5*(ptInteg(indirect(1))+ptInteg(indirect(2)))); // ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne1),phi_z,theta); } // maintenant on va attribuer aux 6 noeuds de la facette la valeur extrapolée Tableau J(6); J(1)=1; J(2) = 2; J(3) = 3; J(4) = 7; J(5)=8; J(6)=9; // indirection for (int ine=1;ine<=6;ine++) {int ne = J(ine); indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); // ici nbi ==2 for (int i=1;i<=nbi;i++) {tab(ne)(indirect(i))=phi_z(i); indir(ne)(i)=indirect(i); }; }; }; //la seconde nappe est forcément au même z que le 2ième pti // on reporte la valeur du pt d'integ 2 pour les noeuds du milieu for (int ne=10;ne<=12;ne++) {tab(ne)(2)=1; indir(ne).Change_taille(1); indir(ne)(1)=2; }; // et enfin le cas de la dernière nappe quadratique { // il nous faut calculer la coordonnée locale theta^3 des 6 noeuds // par exemple du 5ième noeud. int ne1 = 5; // les pti ici considérés, sont les extrémités d'un segment Coordonnee theta(1); // la coordonnée que l'on cherche Vecteur phi_z(2); // le conteneur pour les fonctions d'interpolation indirect(1)=2; indirect(2)=3; // on utilise les 2 derniers pti pour // suivant z {Bases_naturel_duales(indirect,gi_B,gi_H); Coordonnee O(0.5*(ptInteg(indirect(1))+ptInteg(indirect(2)))); // ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne1),phi_z,theta); } // maintenant on va attribuer aux 6 noeuds de la facette la valeur extrapolée Tableau J(6); J(1)=4; J(2) = 5; J(3) = 6; J(4) = 13; J(5)= 14; J(6)= 15; // indirection for (int ine=1;ine<=6;ine++) {int ne = J(ine); indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); // ici nbi ==2 for (int i=1;i<=nbi;i++) {tab(ne)(indirect(i))=phi_z(i); indir(ne)(i)=indirect(i); }; }; }; }; // --- ancienne méthode // // cas avec un point d'intégration à chaque couche, // // on reporte la valeur au premier pt d'integ, telle quelle aux noeuds du bas // for (int ne=1;ne<=3;ne++) // {tab(ne)(1)=1.; // indir(ne).Change_taille(1); indir(ne)(1)=1; // }; // for (int ne=7;ne<=9;ne++) // {tab(ne)(1)=1.; // indir(ne).Change_taille(1); indir(ne)(1)=1; // }; // // on reporte la valeur au pt d'integ 3, telle quelle aux noeuds du haut // for (int ne=4;ne<=6;ne++) // {tab(ne)(3)=1.; // indir(ne).Change_taille(1); indir(ne)(1)=3; // }; // for (int ne=13;ne<=15;ne++) // {tab(ne)(3)=1.; // indir(ne).Change_taille(1); indir(ne)(1)=3; // }; // // on reporte la valeur du pt d'integ 2 pour les noeuds du milieu // for (int ne=10;ne<=12;ne++) // {tab(ne)(2)=1; // indir(ne).Change_taille(1); indir(ne)(1)=2; // }; break; } case 6: // 3 pt de surface en bas et en haut { // tab est supposé être initialisé à 0. Tableau gi_B,gi_H; // bases naturelle et duale // --- méthode 1 (par défaut), on utilise une extrapolation linéaire dans l'épaisseur // et une extrapolation linéaire dans le plan du triangle // donc en fait on extrapole via un pentaèdre linéaire dont les sommets sont au niveau // des 6 pti {Tableau > & indir = extrapol(1).indir; // pour simplifier Tableau > & tab = extrapol(1).tab; // pour simplifier tab.Change_taille(NBNE);indir.Change_taille(NBNE); Tableau indirect(nbi); // tableau de travail: on a 6 pondérations // même numérotation des pti for (int i=1;i<=nbi;i++) indirect(i) = i; // on traite tous les noeuds de la même manière for (int ne=1;ne<=NBNE;ne++) {// il nous faut calculer les coordonnées locales du noeud // sachant que les pti ici considérés, sont aux sommets d'un pentaèdre linéaire orthogonal // on peut traiter séparément les coordonnées dans le plan et la coordonnée z Coordonnee theta(3); // les coordonnées que l'on cherche // suivant x et y: calcul de theta^alpha {Tableau indirect_local(3); // tableau de travail // on considère le triangle des 3 premiers pti indirect_local(1) = indirect(1);indirect_local(2) = indirect(2); indirect_local(3) = indirect(3); Coordonnee theta_loc(2); // le conteneur pour les coordonnées locales en x y Tableau gi_loc_B,gi_loc_H; // bases naturelle et duale Bases_naturel_duales(indirect_local,gi_loc_B,gi_loc_H); Coordonnee O(ptInteg(indirect(1))); // Vecteur phi_xy(3); // le conteneur pour les fonctions ElemGeomC0::Coor_phi(O,gi_loc_H,ptelem(ne),phi_xy,theta_loc); theta(1)=theta_loc(1); // on enregistre theta(2)=theta_loc(2); // on enregistre } // suivant z: calcul de theta^3 {Tableau indirect_local(2); // tableau de travail // on considère la ligne du pti 1 -> pti 4 indirect_local(1) = indirect(1);indirect_local(2) = indirect(4); Coordonnee theta_loc(1); // le conteneur pour les coordonnées locales Tableau gi_loc_B,gi_loc_H; // bases naturelle et duale Bases_naturel_duales(indirect_local,gi_loc_B,gi_loc_H); Coordonnee O(0.5*(ptInteg(indirect(1))+ptInteg(indirect(2)))); // Vecteur phi_z(2); // le conteneur pour les fonctions d'interpolation ElemGeomC0::Coor_phi(O,gi_loc_H,ptelem(ne),phi_z,theta_loc); theta(3)=theta_loc(1); // on enregistre } // maintenant on va attribuer au noeud la valeur extrapolée // on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre linéaire const Vecteur& phiphi = penta.Phi_point(theta); // et on enregistre indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); // on boucle sur les pti du pentaèdre linéaire d'interpolation for (int i=1;i<7;i++) {tab(ne)(indirect(i))=phiphi(i); indir(ne)(i)=indirect(i); }; }; }; // --- ancienne méthode // // on utilise systématiquement le pt d'integ le plus proche // int ne = 1; tab(ne)(1) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=1; // ne = 2; tab(ne)(2) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=2; // ne = 3; tab(ne)(3) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=3; // ne = 4; tab(ne)(4) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=4; // ne = 5; tab(ne)(5) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=5; // ne = 6; tab(ne)(6) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=6; // // pour les noeuds intermédiaires on moyenne les pt d'integ de part et autre // ne = 7; tab(ne)(1) = 0.5;tab(ne)(2) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=1;indir(ne)(2)=2; // ne = 8; tab(ne)(2) = 0.5;tab(ne)(3) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=2;indir(ne)(2)=3; // ne = 9; tab(ne)(1) = 0.5;tab(ne)(3) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=1;indir(ne)(2)=3; // ne = 10; tab(ne)(1) = 0.5;tab(ne)(4) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=1;indir(ne)(2)=4; // ne = 11; tab(ne)(2) = 0.5;tab(ne)(5) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=2;indir(ne)(2)=5; // ne = 12; tab(ne)(3) = 0.5;tab(ne)(6) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=3;indir(ne)(2)=6; // ne = 13; tab(ne)(4) = 0.5;tab(ne)(5) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=4;indir(ne)(2)=5; // ne = 14; tab(ne)(5) = 0.5;tab(ne)(6) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=5;indir(ne)(2)=6; // ne = 15; tab(ne)(6) = 0.5;tab(ne)(4) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=6;indir(ne)(2)=4; break; } // fin du cas avec 6 pt d'intégration case 8: // 4 pt de surface en bas et en haut { // tab est supposé être initialisé à 0. Tableau gi_B,gi_H; // bases naturelle et duale /* // --- méthode 1 (par défaut), on utilise une extrapolation linéaire dans l'épaisseur // et une extrapolation linéaire dans le plan du triangle // donc en fait on extrapole via un pentaèdre linéaire dont les sommets sont au niveau // de 6 pti // couche du bas couche du haut // 4 points 4 points // (3) (6) // | \ | \ // | \ | \ // | 4 \ | 8 \ // | \ | \ // face 2 -> | \ <- face 5 | \ // | 1 \ | 5 \ // | \ | \ // | \ | \ // | 2 3 \ | 6 7 \ // |______________\ |______________\ // (1) (2) (4) (5) // ^ // | // face 3 // |zeta // | // 4---15----6 // /| * | // / | * | // / | * | // 13 10-14------12----- eta // / / * | // / * | | // / * / | | // 5 / 1----9----3 // | / / * // | / / * // |/ / * // 11 7 8 // /| / * // xi | / * // |/ * // 2 // // // cas du triquadratique -> description des faces // face 1 : noeud 9 3 8 2 7 1, face 2 : noeud 9 1 10 4 15 6 12 3, // face 3 : noeud 7 2 11 5 13 4 10 1, face 4 : noeud 15 6 14 5 13 4, // face 5 : noeud 8 3 12 6 14 5 11 2, */ // on va utiliser un pentaèdre linéaire particulier par face verticale de l'élément for (int iface = 1; iface <=3; iface++) // correspond aux faces 2 3 5 de l'élément {// pour chaque face on définit les sommets du pentaèdre linéaire Tableau indirect(6); // pti concernés Tableau J(8); // les noeuds concernés: init initiale // est ensuite redimentionné switch (iface) {case 1: // face 2 {indirect(1)=4;indirect(2)=2;indirect(3)=1; indirect(4)=8;indirect(5)=6;indirect(6)=5; J(1)=1; J(2)=4; J(3)=6; J(4)=3; J(5)=10; J(6)=15; J(7)=12; J(8)=9; break; } case 2: // face 3 {indirect(1)=1;indirect(2)=2;indirect(3)=3; indirect(4)=5;indirect(5)=6;indirect(6)=7; J.Change_taille(5); // il y a 1,10,4 qui ont déjà été traités dans face 2 J(1)=2; J(2)=5; J(3)=7; J(4)=11; J(5)=13; break; } case 3: // face 5 : il ne reste plus que les noeuds 8 et 14 {indirect(1)=1;indirect(2)=1;indirect(3)=3; indirect(4)=5;indirect(5)=6;indirect(6)=7; J.Change_taille(2); J(1)=8; J(2)=14; break; } default: break; }; // on boucle sur les noeuds à traiter for (int ine = 1;ine<= J.Taille(); ine++) {int ne = J(ine); // il nous faut calculer les coordonnées locales du noeud // sachant que les pti ici considérés, sont aux sommets d'un pentaèdre linéaire orthogonal // on peut traiter séparément les coordonnées dans le plan et la coordonnée z Coordonnee theta(3); // les coordonnées que l'on cherche // suivant x et y: calcul de theta^alpha {Tableau indirect_local(3); // tableau de travail // on considère le triangle des 3 premiers pti indirect_local(1) = indirect(1);indirect_local(2) = indirect(2); indirect_local(3) = indirect(3); Coordonnee theta_loc(2); // le conteneur pour les coordonnées locales en x y Tableau gi_loc_B,gi_loc_H; // bases naturelle et duale Bases_naturel_duales(indirect_local,gi_loc_B,gi_loc_H); Coordonnee O(ptInteg(indirect(1))); // Vecteur phi_xy(3); // le conteneur pour les fonctions ElemGeomC0::Coor_phi(O,gi_loc_H,ptelem(ne),phi_xy,theta_loc); theta(1)=theta_loc(1); // on enregistre theta(2)=theta_loc(2); // on enregistre } // suivant z: calcul de theta^3 {Tableau indirect_local(2); // tableau de travail // on considère la ligne du pti 1 -> pti 5 indirect_local(1) = indirect(1);indirect_local(2) = indirect(4); Coordonnee theta_loc(1); // le conteneur pour les coordonnées locales Tableau gi_loc_B,gi_loc_H; // bases naturelle et duale Bases_naturel_duales(indirect_local,gi_loc_B,gi_loc_H); Coordonnee O(0.5*(ptInteg(indirect(1))+ptInteg(indirect(2)))); // Vecteur phi_z(2); // le conteneur pour les fonctions d'interpolation ElemGeomC0::Coor_phi(O,gi_loc_H,ptelem(ne),phi_z,theta_loc); theta(3)=theta_loc(1); // on enregistre } // maintenant on va attribuer au noeud la valeur extrapolée // on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre linéaire const Vecteur& phiphi = penta.Phi_point(theta); // et on enregistre indir(ne).Change_taille(6); tab(ne).Change_taille(nbi); // on boucle sur les pti du pentaèdre linéaire d'interpolation for (int i=1;i<7;i++) {tab(ne)(indirect(i))=phiphi(i); indir(ne)(i)=indirect(i); }; }; }; // --- ancienne méthode /* // // on utilise systématiquement le pt d'integ le plus proche // int ne = 1; tab(ne)(2) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=2; // ne = 2; tab(ne)(3) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=3; // ne = 3; tab(ne)(4) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=4; // ne = 4; tab(ne)(6) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=6; // ne = 5; tab(ne)(7) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=7; // ne = 6; tab(ne)(8) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=8; // // pour les noeuds intermédiaires on moyenne les pt d'integ de part et autre // ne = 7; tab(ne)(2) = 0.5;tab(ne)(3) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=2;indir(ne)(2)=3; // ne = 8; tab(ne)(3) = 0.5;tab(ne)(4) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=3;indir(ne)(2)=4; // ne = 9; tab(ne)(2) = 0.5;tab(ne)(4) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=2;indir(ne)(2)=4; // ne = 10; tab(ne)(2) = 0.5;tab(ne)(6) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=2;indir(ne)(2)=6; // ne = 11; tab(ne)(3) = 0.5;tab(ne)(7) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=3;indir(ne)(2)=7; // ne = 12; tab(ne)(4) = 0.5;tab(ne)(8) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=4;indir(ne)(2)=8; // ne = 13; tab(ne)(6) = 0.5;tab(ne)(7) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=6;indir(ne)(2)=7; // ne = 14; tab(ne)(7) = 0.5;tab(ne)(8) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=7;indir(ne)(2)=8; // ne = 15; tab(ne)(8) = 0.5;tab(ne)(6) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=8;indir(ne)(2)=6; */ break; } // fin du cas avec 8 pt d'intégration case 9: // 3 * 3pt de surface de bas en haut { // tab est supposé être initialisé à 0. Tableau gi_B,gi_H; // bases naturelle et duale // --- méthode 1 (par défaut), on utilise une extrapolation linéaire dans l'épaisseur // on va utiliser les 6 premiers pti pour définir un penta linéaire // qui servira pour les noeuds du bas et du milieu // NB: en fait pour les noeuds du milieu, compte tenu qu'ils sont // exactement au même niveau que les pti 4 5 5, ce sera uniquement ceux là // qui seront interpolé, // puis avec les pti de 4 à 9 on définit le second penta linéaire // pour interpoler les noeuds du haut {Tableau > & indir = extrapol(1).indir; // pour simplifier Tableau > & tab = extrapol(1).tab; // pour simplifier tab.Change_taille(NBNE);indir.Change_taille(NBNE); Tableau indirect(6); // tableau de travail: on a 6 pondérations for (int inappe = 1; inappe <=3; inappe++) {Tableau J(9); // les noeuds concernés int nbn_concernes; switch (inappe) {case 1: // nappe de noeuds du bas {nbn_concernes = 6; J(1)=1; J(2)=7; J(3)=2; J(4)=8; J(5)=3; J(6)=9; // même numérotation des pti pour les 6 premiers pti for (int i=1;i<=6;i++) indirect(i) = i; }; break; case 2: // nappe de noeuds du milieu {nbn_concernes = 3; J(1)=10; J(2)=11; J(3)=12; // les pti pour le penta linéaire // même numérotation des pti pour les 6 premiers pti for (int i=1;i<=6;i++) indirect(i) = i; }; break; case 3: // nappe de noeuds du haut {nbn_concernes = 6; J(1)=4; J(2)=13; J(3)=5; J(4)=14; J(5)=6; J(6)=15; // les pti pour le penta linéaire for (int i=1;i<=6;i++) indirect(i) = i+3; }; break; default: break; }; // on traite tous les noeuds de la même manière for (int ine = 1;ine<= nbn_concernes; ine++) {int ne = J(ine); // il nous faut calculer les coordonnées locales du noeud // sachant que les pti ici considérés, sont aux sommets d'un pentaèdre linéaire orthogonal // on peut traiter séparément les coordonnées dans le plan et la coordonnée z Coordonnee theta(3); // les coordonnées que l'on cherche // suivant x et y: calcul de theta^alpha {Tableau indirect_local(3); // tableau de travail // on considère le triangle des 3 premiers pti indirect_local(1) = indirect(1);indirect_local(2) = indirect(2); indirect_local(3) = indirect(3); Coordonnee theta_loc(2); // le conteneur pour les coordonnées locales en x y Tableau gi_loc_B,gi_loc_H; // bases naturelle et duale Bases_naturel_duales(indirect_local,gi_loc_B,gi_loc_H); Coordonnee O(ptInteg(indirect(1))); // Vecteur phi_xy(3); // le conteneur pour les fonctions ElemGeomC0::Coor_phi(O,gi_loc_H,ptelem(ne),phi_xy,theta_loc); theta(1)=theta_loc(1); // on enregistre theta(2)=theta_loc(2); // on enregistre } // suivant z: calcul de theta^3 {Tableau indirect_local(2); // tableau de travail // on considère la ligne du pti 1 -> pti 4 indirect_local(1) = indirect(1);indirect_local(2) = indirect(4); Coordonnee theta_loc(1); // le conteneur pour les coordonnées locales Tableau gi_loc_B,gi_loc_H; // bases naturelle et duale Bases_naturel_duales(indirect_local,gi_loc_B,gi_loc_H); Coordonnee O(0.5*(ptInteg(indirect(1))+ptInteg(indirect(2)))); // Vecteur phi_z(2); // le conteneur pour les fonctions d'interpolation ElemGeomC0::Coor_phi(O,gi_loc_H,ptelem(ne),phi_z,theta_loc); theta(3)=theta_loc(1); // on enregistre } // maintenant on va attribuer au noeud la valeur extrapolée // on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre linéaire const Vecteur& phiphi = penta.Phi_point(theta); // et on enregistre indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); // on boucle sur les pti du pentaèdre linéaire d'interpolation for (int i=1;i<7;i++) {tab(ne)(indirect(i))=phiphi(i); indir(ne)(i)=indirect(i); }; }; } }; // --- ancienne méthode // // on utilise systématiquement le pt d'integ le plus proche // int ne = 1; tab(ne)(1) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=1; // ne = 2; tab(ne)(2) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=2; // ne = 3; tab(ne)(3) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=3; // ne = 4; tab(ne)(7) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=7; // ne = 5; tab(ne)(8) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=8; // ne = 6; tab(ne)(9) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=9; // // pour les noeuds intermédiaires on moyenne les pt d'integ de part et autre // ne = 7; tab(ne)(1) = 0.5;tab(ne)(2) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=1;indir(ne)(2)=2; // ne = 8; tab(ne)(2) = 0.5;tab(ne)(3) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=2;indir(ne)(2)=3; // ne = 9; tab(ne)(1) = 0.5;tab(ne)(3) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=1;indir(ne)(2)=3; // ne = 10; tab(ne)(4) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=4; // ne = 11; tab(ne)(5) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=5; // ne = 12; tab(ne)(6) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=6; // ne = 13; tab(ne)(7) = 0.5;tab(ne)(8) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=7;indir(ne)(2)=8; // ne = 14; tab(ne)(8) = 0.5;tab(ne)(9) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=8;indir(ne)(2)=9; // ne = 15; tab(ne)(9) = 0.5;tab(ne)(7) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=9;indir(ne)(2)=7; break; } // fin du cas avec 9 pt d'intégration case 12: // 3 * 4 pt de surface de bas en haut {// rappel des pti pour une nappe triangle // 4 pti // (3) // | \ // | \ // | 4 \ <- face 5 basse (2) -> (label 4) // | \ hautes (2) -> (label 8) // face 2 basse-> | \ <- face 5 // (label 1) | 1 \ // | \ // face 2 haute-> | \ <- face 5 basse (1) -> (label 3) // (label 5) | 2 3 \ haute (1) -> (label 7) // |______________\ // (1) (2) // ^ // | // face 3 basse (label 2), haute (label 6) // tab est supposé être initialisé à 0. Tableau gi_B,gi_H; // bases naturelle et duale {Tableau > & indir = extrapol(1).indir; // pour simplifier Tableau > & tab = extrapol(1).tab; // pour simplifier tab.Change_taille(NBNE);indir.Change_taille(NBNE); // on va utiliser un pentaèdre linéaire particulier par face verticale de l'élément for (int ilabel = 1; ilabel <=8; ilabel++) // correspond aux 8 labels de l'élément {// pour chaque label on définit les sommets du pentaèdre linéaire Tableau indirect(6); // pti concernés int nbn_concernes; Tableau J(9); // les noeuds concernés switch (ilabel) {case 1: // sur la face 2 basse {indirect(1)=4;indirect(2)=2;indirect(3)=1; indirect(4)=8;indirect(5)=6;indirect(6)=5; nbn_concernes = 5; J(1)=1; J(2)=10; J(3)=12; J(4)=3; J(5)=9; break; } case 2: // sur la face 3 basse {indirect(1)=1;indirect(2)=2;indirect(3)=3; indirect(4)=5;indirect(5)=6;indirect(6)=7; nbn_concernes = 3; // les noeuds 1 et 10 sont déjà traité (case 1) J(1)=7; J(2)=2; J(3)=11; break; } case 3: // face 5 basse (1) -> (label 3) reste le noeud 8 {indirect(1)=1;indirect(2)=2;indirect(3)=3; indirect(4)=5;indirect(5)=6;indirect(6)=7; nbn_concernes = 1; J(1)=8; break; } case 4: // face 5 basse (2) -> (label 4) : ne reste aucun noeud {nbn_concernes = 0; break; } case 5: // sur la face 2 haute {indirect(1)=8;indirect(2)=6;indirect(3)=5; indirect(4)=12;indirect(5)=10;indirect(6)=9; nbn_concernes = 3; J(1)=4; J(2)=15; J(3)=6; break; } case 6: // sur la face 3 basse {indirect(1)=5;indirect(2)=6;indirect(3)=7; indirect(4)=9;indirect(5)=10;indirect(6)=11; nbn_concernes = 2; J(1)=13; J(2)=5; break; } case 7: // face 5 haute (1) {indirect(1)=5;indirect(2)=6;indirect(3)=7; indirect(4)=9;indirect(5)=10;indirect(6)=11; nbn_concernes = 2; J(1)=5; J(2)=14; break; } case 8: // il ne reste aucun noeud {nbn_concernes = 0; break; } default: break; }; // on traite tous les noeuds de la même manière for (int ine = 1;ine<= nbn_concernes; ine++) {int ne = J(ine); // il nous faut calculer les coordonnées locales du noeud // sachant que les pti ici considérés, sont aux sommets d'un pentaèdre linéaire orthogonal // on peut traiter séparément les coordonnées dans le plan et la coordonnée z Coordonnee theta(3); // les coordonnées que l'on cherche // suivant x et y: calcul de theta^alpha {Tableau indirect_local(3); // tableau de travail // on considère le triangle des 3 premiers pti indirect_local(1) = indirect(1);indirect_local(2) = indirect(2); indirect_local(3) = indirect(3); Coordonnee theta_loc(2); // le conteneur pour les coordonnées locales en x y Tableau gi_loc_B,gi_loc_H; // bases naturelle et duale Bases_naturel_duales(indirect_local,gi_loc_B,gi_loc_H); Coordonnee O(ptInteg(indirect(1))); // Vecteur phi_xy(3); // le conteneur pour les fonctions ElemGeomC0::Coor_phi(O,gi_loc_H,ptelem(ne),phi_xy,theta_loc); theta(1)=theta_loc(1); // on enregistre theta(2)=theta_loc(2); // on enregistre } // suivant z: calcul de theta^3 {Tableau indirect_local(2); // tableau de travail // on considère la ligne du pti 1 -> pti 4 indirect_local(1) = indirect(1);indirect_local(2) = indirect(4); Coordonnee theta_loc(1); // le conteneur pour les coordonnées locales Tableau gi_loc_B,gi_loc_H; // bases naturelle et duale Bases_naturel_duales(indirect_local,gi_loc_B,gi_loc_H); Coordonnee O(0.5*(ptInteg(indirect(1))+ptInteg(indirect(2)))); // Vecteur phi_z(2); // le conteneur pour les fonctions d'interpolation ElemGeomC0::Coor_phi(O,gi_loc_H,ptelem(ne),phi_z,theta_loc); theta(3)=theta_loc(1); // on enregistre } // maintenant on va attribuer au noeud la valeur extrapolée // on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre linéaire const Vecteur& phiphi = penta.Phi_point(theta); // et on enregistre indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); // on boucle sur les pti du pentaèdre linéaire d'interpolation for (int i=1;i<7;i++) {tab(ne)(indirect(i))=phiphi(i); indir(ne)(i)=indirect(i); }; }; }; }; // --- ancienne méthode // // on utilise systématiquement le pt d'integ le plus proche // { int ne = 1; tab(ne)(2) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=2; // ne = 2; tab(ne)(3) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=3; // ne = 3; tab(ne)(4) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=4; // ne = 4; tab(ne)(10) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=10; // ne = 5; tab(ne)(11) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=11; // ne = 6; tab(ne)(12) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=12; // // pour les noeuds intermédiaires on moyenne les pt d'integ de part et autre // ne = 7; tab(ne)(2) = 0.5;tab(ne)(3) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=2;indir(ne)(2)=3; // ne = 8; tab(ne)(3) = 0.5;tab(ne)(4) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=3;indir(ne)(2)=4; // ne = 9; tab(ne)(2) = 0.5;tab(ne)(4) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=2;indir(ne)(2)=4; // ne = 10; tab(ne)(6) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=6; // ne = 11; tab(ne)(7) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=7; // ne = 12; tab(ne)(8) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=8; // ne = 13; tab(ne)(10) = 0.5;tab(ne)(11) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=10;indir(ne)(2)=11; // ne = 14; tab(ne)(11) = 0.5;tab(ne)(12) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=11;indir(ne)(2)=12; // ne = 15; tab(ne)(12) = 0.5;tab(ne)(10) = 0.5; // indir(ne).Change_taille(2); indir(ne)(1)=12;indir(ne)(2)=10; break; } // fin du cas avec 12 pt d'intégration case 18: // 3 * 6 pt de surface de bas en haut {// rappel des pti pour une nappe triangle // 6 pti // // (3) // | \ // | \ // face 2 basse-> | 6 \ <- face 5 basse droite -> (label 6) // gauche (1) | \ hautes droite -> (label 12) // droite (2) | \ <- face 5 // face 2 haute-> | 2 1 \ // gauche (7) | \ // droite (8) | \ <- face 5 basse gauche -> (label 5) // | 4 3 5 \ haute gauche -> (label 11) // |______________\ // (1) (2) // ^ ^ // | | // face 3 basse gauche(3) droite (4) // haute gauche(9) droite (10) // tab est supposé être initialisé à 0. Tableau gi_B,gi_H; // bases naturelle et duale {Tableau > & indir = extrapol(1).indir; // pour simplifier Tableau > & tab = extrapol(1).tab; // pour simplifier tab.Change_taille(NBNE);indir.Change_taille(NBNE); // on va utiliser un pentaèdre linéaire particulier par face verticale de l'élément for (int ilabel = 1; ilabel <=12; ilabel++) // correspond aux 12 labels de l'élément {// pour chaque label on définit les sommets du pentaèdre linéaire Tableau indirect(6); // pti concernés int nbn_concernes; Tableau J(9); // les noeuds concernés switch (ilabel) {case 1: // sur la face 2 basse gauche {indirect(1)=2;indirect(2)=1;indirect(3)=6; indirect(4)=8;indirect(5)=7;indirect(6)=12; nbn_concernes = 3; J(1)=9; J(2)=3; J(3)=12; break; } case 2: // sur la face 2 basse droite {indirect(1)=2;indirect(2)=4;indirect(3)=3; indirect(4)=8;indirect(5)=10;indirect(6)=9; nbn_concernes = 2; J(1)=1; J(2)=10; break; } case 3: // face 3 basse gauche {indirect(1)=2;indirect(2)=4;indirect(3)=3; indirect(4)=8;indirect(5)=10;indirect(6)=9; nbn_concernes = 1; J(1)=7; break; } case 4: // face 3 basse droite {indirect(1)=1;indirect(2)=3;indirect(3)=5; indirect(4)=7;indirect(5)=9;indirect(6)=11; nbn_concernes = 2; J(1)=2; J(2) = 11; break; } case 5: // face 5 basse gauche {indirect(1)=1;indirect(2)=3;indirect(3)=5; indirect(4)=7;indirect(5)=9;indirect(6)=11; nbn_concernes = 1; J(1)=8; break; } case 6: // face 5 basse droite {indirect(1)=2;indirect(2)=1;indirect(3)=6; indirect(4)=8;indirect(5)=7;indirect(6)=12; nbn_concernes = 2; J(1)=3; J(2)=12; break; } case 7: // face 2 haute gauche {indirect(1)=8;indirect(2)=7;indirect(3)=12; indirect(4)=14;indirect(5)=13;indirect(6)=18; nbn_concernes = 2; J(1)=6; J(2)=15; break; } case 8: // face 2 haute droite {indirect(1)=8;indirect(2)=10;indirect(3)=9; indirect(4)=14;indirect(5)=16;indirect(6)=15; nbn_concernes = 1; J(1)=4; break; } case 9: // face 3 haute gauche {indirect(1)=8;indirect(2)=10;indirect(3)=9; indirect(4)=14;indirect(5)=16;indirect(6)=15; nbn_concernes = 1; J(1)=13; break; } case 10: // face 3 haute droite {indirect(1)=7;indirect(2)=9;indirect(3)=11; indirect(4)=13;indirect(5)=15;indirect(6)=17; nbn_concernes = 1; J(1)=5; break; } case 11: // face 5 haute gauche {indirect(1)=8;indirect(2)=10;indirect(3)=9; indirect(4)=14;indirect(5)=16;indirect(6)=15; nbn_concernes = 1; J(1)=14; break; } case 12: // face 5 haute droite {nbn_concernes = 0; break; } default: break; }; // on traite tous les noeuds de la même manière for (int ine = 1;ine<= nbn_concernes; ine++) {int ne = J(ine); // il nous faut calculer les coordonnées locales du noeud // sachant que les pti ici considérés, sont aux sommets d'un pentaèdre linéaire orthogonal // on peut traiter séparément les coordonnées dans le plan et la coordonnée z Coordonnee theta(3); // les coordonnées que l'on cherche // suivant x et y: calcul de theta^alpha {Tableau indirect_local(3); // tableau de travail // on considère le triangle des 3 premiers pti indirect_local(1) = indirect(1);indirect_local(2) = indirect(2); indirect_local(3) = indirect(3); Coordonnee theta_loc(2); // le conteneur pour les coordonnées locales en x y Tableau gi_loc_B,gi_loc_H; // bases naturelle et duale Bases_naturel_duales(indirect_local,gi_loc_B,gi_loc_H); Coordonnee O(ptInteg(indirect(1))); // Vecteur phi_xy(3); // le conteneur pour les fonctions ElemGeomC0::Coor_phi(O,gi_loc_H,ptelem(ne),phi_xy,theta_loc); theta(1)=theta_loc(1); // on enregistre theta(2)=theta_loc(2); // on enregistre } // suivant z: calcul de theta^3 {Tableau indirect_local(2); // tableau de travail // on considère la ligne du pti 1 -> pti 4 indirect_local(1) = indirect(1);indirect_local(2) = indirect(4); Coordonnee theta_loc(1); // le conteneur pour les coordonnées locales Tableau gi_loc_B,gi_loc_H; // bases naturelle et duale Bases_naturel_duales(indirect_local,gi_loc_B,gi_loc_H); Coordonnee O(0.5*(ptInteg(indirect(1))+ptInteg(indirect(2)))); // Vecteur phi_z(2); // le conteneur pour les fonctions d'interpolation ElemGeomC0::Coor_phi(O,gi_loc_H,ptelem(ne),phi_z,theta_loc); theta(3)=theta_loc(1); // on enregistre } // maintenant on va attribuer au noeud la valeur extrapolée // on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre linéaire const Vecteur& phiphi = penta.Phi_point(theta); // et on enregistre indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); // on boucle sur les pti du pentaèdre linéaire d'interpolation for (int i=1;i<7;i++) {tab(ne)(indirect(i))=phiphi(i); indir(ne)(i)=indirect(i); }; }; }; }; // --- ancienne méthode // { // on utilise systématiquement le pt d'integ le plus proche // int ne = 1; tab(ne)(4) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=4; // ne = 2; tab(ne)(5) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=5; // ne = 3; tab(ne)(6) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=6; // ne = 4; tab(ne)(16) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=16; // ne = 5; tab(ne)(17) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=17; // ne = 6; tab(ne)(18) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=18; // ne = 7; tab(ne)(3) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=3; // ne = 8; tab(ne)(1) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=1; // ne = 9; tab(ne)(2) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=2; // ne = 10; tab(ne)(10) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=10; // ne = 11; tab(ne)(11) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=11; // ne = 12; tab(ne)(12) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=12; // ne = 13; tab(ne)(15) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=15; // ne = 14; tab(ne)(13) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=13; // ne = 15; tab(ne)(14) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=14; break; } // fin du cas avec 18 pt d'intégration default: { cout << "\n erreur le nombre de point d'integration demande :" << nbi <<"n\'est pas implante " << "\nGeomTriangle::Calcul_extrapol(.."; Sortie(1); }; }; };