// FICHIER : Met_Sfe1.cp // CLASSE : Met_Sfe1 #include #include #include #include "Sortie.h" #include "Util.h" #include "MathUtil.h" #include "Met_Sfe1.h" // ========================================================================================= // vu la taille des executables le fichier est decompose en deux // le premier : Met_Sfe1s1.cp concerne les constructeurs, destructeur et // la gestion des variables // le second : Met_Sfe1s2.cp concerne le calcul // ========================================================================================= // METHODES PUBLIQUES : // ------------------------ calculs ---------------------------------------- // cas explicite, toutes les grandeurs sont a 0 ou t /* Met_Sfe1::Expli Met_Sfe1::Cal_explicit ( Tableau& tab_noeud, Mat_pleine& dphi,int nombre_noeud) { Met_abstraite::Calcul_giB_0(tab_noeud,dphi,nombre_noeud); // calcul de la base a t=0 Calcul_giB_t(tab_noeud,dphi,nombre_noeud); // calcul de la base a t Calcul_gijBB_0 (); // metrique base naturelle Calcul_gijBB_t (); // " Calcul_gijHH_t (); // composantes controvariantes Jacobien_t(); // calcul du jacobien a t D_giB_t(dphi); // D_gijBB_t(); //variation de la metrique en BB // retour des infos Expli ex; ex.gijBB_0 = gijBB_0; ex.gijBB_t = gijBB_t; ex.gijHH_t = gijHH_t; ex.d_gijBB_t = &d_gijBB_t; ex.jacobien = jacobien_t; // liberation des tenseurs intermediaires LibereTenseur(); return ex; }; */ // cas implicite, toutes les grandeurs sont a 0 ou t+dt /*Met_abstraite::Impli Met_Sfe1::Cal_implicit ( Tableau& tab_noeud, Mat_pleine& dphi, int nombre_noeud) { // tout d'abord on calcul les elements relatifs a la facette plane Met_abstraite::Calcul_giB_0(tab_noeud,dphi,nombre_noeud); // calcul de la base a t=0 *aiB_0 = *giB_0; Met_abstraite::Calcul_giB_t(tab_noeud,dphi,nombre_noeud); // calcul de la base a t *aiB_t = *giB_t; Met_abstraite::Calcul_giB_tdt(tab_noeud,dphi,nombre_noeud); // calcul de la base a tdt *aiB_tdt = *giB_tdt; Met_abstraite::Calcul_gijBB_0 (); // metrique base naturelle Met_abstraite::Calcul_gijBB_t (); // " Met_abstraite::Calcul_gijBB_tdt (); // " Met_abstraite::Calcul_gijHH_tdt (); // composantes controvariantes *aijBB_0 = *gijBB_0; *aijBB_t = *gijBB_t; *aijBB_tdt = *gijBB_tdt; *aijHH_tdt = *gijHH_tdt; Met_abstraite::Jacobien_tdt(); // calcul du jacobien a t ajacobien_tdt = jacobien_tdt; */ /* D_giB_tdt(dphi); // D_gijBB_tdt(); //variation de la metrique en BB Calcul_giH_tdt(); // base duale D_giH_tdt(); // variation de la base duale D_gijHH_tdt(); //variation de la metrique en HH Djacobien_tdt(); // variation du jacobien */ // retour des infos /* Impli ex; ex.gijBB_0 = gijBB_0; ex.gijBB_t = gijBB_t; ex.gijBB_tdt = gijBB_tdt; ex.gijHH_tdt = gijHH_tdt; ex.d_gijBB_tdt = &d_gijBB_tdt; ex.d_gijHH_tdt = &d_gijHH_tdt; ex.jacobien = jacobien_tdt; ex.d_jacobien_tdt = &d_jacobien_tdt; // liberation des tenseurs intermediaires LibereTenseur(); return ex; };*/ /* // pour la remontee au infos duaux Met_abstraite::InfoImp Met_Sfe1::Cal_InfoImp ( Tableau& tab_noeud, Mat_pleine& dphi,Vecteur& phi, int nombre_noeud) { Calcul_M0(tab_noeud,phi,nombre_noeud); Calcul_Mtdt(tab_noeud,phi,nombre_noeud); Calcul_giB_0(tab_noeud,dphi,nombre_noeud); // calcul de la base a t=0 Calcul_giB_tdt(tab_noeud,dphi,nombre_noeud); // calcul de la base a tdt Calcul_gijBB_0 (); // " Calcul_gijHH_0 (); // composantes controvariantes Calcul_gijBB_tdt (); // " Calcul_gijHH_tdt (); // composantes controvariantes // bases duales Calcul_giH_0(); Calcul_giH_tdt(); // retour des infos InfoImp ex; ex.M0 = M0; ex.Mtdt = Mtdt; ex.giB_0 = giB_0; ex.giB_tdt = giB_tdt; ex.gijBB_tdt = gijBB_tdt; ex.gijHH_tdt = gijHH_tdt; ex.giH_0 = giH_0; ex.giH_tdt = giH_tdt; // liberation des tenseurs intermediaires LibereTenseur(); return ex; }; Met_abstraite::InfoExp Met_Sfe1::Cal_InfoExp (Tableau& tab_noeud, Mat_pleine& dphi,Vecteur& phi, int nombre_noeud) { Calcul_M0(tab_noeud,phi,nombre_noeud); Calcul_Mt(tab_noeud,phi,nombre_noeud); Calcul_giB_0(tab_noeud,dphi,nombre_noeud); // calcul de la base a t=0 Calcul_giB_t(tab_noeud,dphi,nombre_noeud); // calcul de la base a t Calcul_gijBB_0 (); // " Calcul_gijHH_0 (); // composantes controvariantes Calcul_gijBB_t (); // " Calcul_gijHH_t (); // composantes controvariantes // bases duales Calcul_giH_0(); Calcul_giH_t(); // retour des infos InfoExp ex; ex.M0 = M0; ex.Mt = Mt; ex.giB_0 = giB_0; ex.giB_t = giB_t; ex.gijBB_t = gijBB_t; ex.gijHH_t = gijHH_t; ex.giH_0 = giH_0; ex.giH_t = giH_t; // liberation des tenseurs intermediaires LibereTenseur(); return ex; }; // ========== utilise par le contact ========================= // calcul d'un point M0 en fonction de phi et des coordonnees a 0 Coordonnee & Met_Sfe1::PointM_0 // ( stockage a t=0) (Tableau& tab_noeud,Vecteur& Phi) { Calcul_M0(tab_noeud,Phi,tab_noeud.Taille()); return *M0; }; // calcul d'un point M0 en fonction de phi et des coordonnees a t Coordonnee & Met_Sfe1::PointM_t // ( stockage a t) (Tableau& tab_noeud,Vecteur& Phi) { Calcul_Mt(tab_noeud,Phi,tab_noeud.Taille()); return *Mt; }; // calcul d'un point Mt en fonction de phi et des coordonnees a tdt Coordonnee & Met_Sfe1::PointM_tdt // ( stockage a tdt) (Tableau& tab_noeud,Vecteur& Phi) { Calcul_Mtdt(tab_noeud,Phi,tab_noeud.Taille()); return *Mtdt; }; // calcul de la base naturel ( stockage a t=0) au point correspondant au dphi BaseB& Met_Sfe1::BaseNat_0 // en fonction des coordonnees a t=0 (Tableau& tab_noeud,Mat_pleine& dphi) { Calcul_giB_0 (tab_noeud,dphi,tab_noeud.Taille()); return *giB_0; }; // calcul de la base naturel ( stockage a t) au point correspondant au dphi BaseB& Met_Sfe1::BaseNat_t // en fonction des coordonnees a t (Tableau& tab_noeud,Mat_pleine& dphi) { Calcul_giB_t (tab_noeud,dphi,tab_noeud.Taille()); return *giB_t; }; // calcul de la base naturel ( stockage a t=tdt) au point correspondant au dphi BaseB& Met_Sfe1::BaseNat_tdt // en fonction des coordonnees a tdt (Tableau& tab_noeud,Mat_pleine& dphi) { Calcul_giB_tdt (tab_noeud,dphi,tab_noeud.Taille()); return *giB_tdt; }; // calcul de la base naturelle et duale ( stockage a t=0) en fonction des coord a 0 void Met_Sfe1::BaseND_0(Tableau& tab_noeud,Mat_pleine& dphi,BaseB& bB,BaseH& bH) { Calcul_giB_0 (tab_noeud,dphi,tab_noeud.Taille()); Calcul_gijBB_0 (); // " Calcul_gijHH_0 (); // composantes controvariantes Calcul_giH_0 (); bB = *giB_0; bH = *giH_0; }; // calcul de la base naturelle et duale ( stockage a t) en fonction des coord a t void Met_Sfe1::BaseND_t(Tableau& tab_noeud,Mat_pleine& dphi,BaseB& bB,BaseH& bH) { Calcul_giB_t (tab_noeud,dphi,tab_noeud.Taille()); Calcul_gijBB_t (); // " Calcul_gijHH_t (); // composantes controvariantes Calcul_giH_t (); bB = *giB_t; bH = *giH_t; }; // calcul de la base naturelle et duale ( stockage a tdt) en fonction des coord a tdt void Met_Sfe1::BaseND_tdt(Tableau& tab_noeud,Mat_pleine& dphi,BaseB& bB,BaseH& bH) { Calcul_giB_tdt (tab_noeud,dphi,tab_noeud.Taille()); Calcul_gijBB_tdt (); // " Calcul_gijHH_tdt (); // composantes controvariantes Calcul_giH_tdt (); bB = *giB_tdt; bH = *giH_tdt; }; */ //==================== METHODES PROTEGEES=============================== /* // calcul de la base naturel a t0 // a changer void Met_Sfe1::Calcul_giB_0 {}; */ //-----------// calcul du tenseur de courbure dans la base naturelle // plusieurs cas sont etudies suivant l'instant considere // a l'instant t = 0 Vecteur& Met_Sfe1::courbure_0 (Tableau& tab_noeud) { Vecteur & aiB1 = (*aiB_0)(1); Vecteur & aiB2 = (*aiB_0)(2); // pour simplifier Vecteur & aiH1 = (*aiH_0)(1); Vecteur & aiH2 = (*aiH_0)(2); // pour simplifier Tableau tab_coor(6); for (int i=1;i<=6;i++) tab_coor(i) = tab_noeud(i)->Coord0(); return courbure1(tab_coor,aiB1,aiB2,aiH1,aiH2,tab_noeud); }; // a l'instant t Vecteur& Met_Sfe1::courbure_t (Tableau& tab_noeud) { Vecteur & aiB1 = (*aiB_t)(1); Vecteur & aiB2 = (*aiB_t)(2); // pour simplifier Vecteur & aiH1 = (*aiH_t)(1); Vecteur & aiH2 = (*aiH_t)(2); // pour simplifier Tableau tab_coor(6); for (int i=1;i<=6;i++) tab_coor(i) = tab_noeud(i)->Coord1(); return courbure1(tab_coor,aiB1,aiB2,aiH1,aiH2,tab_noeud); }; // a l'instant t+dt Vecteur& Met_Sfe1::courbure_tdt (Tableau& tab_noeud) { Vecteur & aiB1 = (*aiB_tdt)(1); Vecteur & aiB2 = (*aiB_tdt)(2); // pour simplifier Vecteur & aiH1 = (*aiH_tdt)(1); Vecteur & aiH2 = (*aiH_tdt)(2); // pour simplifier Tableau tab_coor(6); for (int i=1;i<=6;i++) tab_coor(i) = tab_noeud(i)->Coord2(); return courbure1(tab_coor,aiB1,aiB2,aiH1,aiH2,tab_noeud); }; // routine generale de calcul de la courbure Vecteur& Met_Sfe1::courbure (Tableau& tab_coor,Vecteur & aiB1,Vecteur & aiB2, Vecteur & aiH1,Vecteur & aiH2,Tableau& tab_noeud) { Vecteur curbp(3),curb(3); // : lestenseurs de courbures d'abord dans les axes // locaux des arretes du triangle puis dans le repere naturel: b11,b12,b22 Mat_pleine mat(3,3); // matrice pour calculer le tenseur de courbure // calcul de la normale centrale Vecteur N = (ProdVec(aiB1,aiB2)).Normer(); // calcul du centre de gravite Coordonnee G = (tab_coor(1) + tab_coor(2) + tab_coor(3)) / 3.; // le meme calcul est effectue pour les trois cotes du triangle principale //1- tout d'abord un tableau d'indice pour ne pas etre embete par les modulos 3 Vecteur indi(5);indi(1) = 1; indi(2) = 2; indi(3) = 3; indi(4) = 1; indi(5) = 2; // 2- on boucle sur le cotes du triangle Vecteur Ni(3); // normale du triangle exterieur for (int ncot=1;ncot<=3;ncot++) { // on utilise les notations : triangle principal DBC et secondaire BAC // on cherche a calculer la longueur H2G2 // simplification de l'ecriture Coordonnee& D = tab_noeud(indi(ncot))->Coord0(); Coordonnee& B = tab_noeud(indi(ncot+1))->Coord0(); Coordonnee& C = tab_noeud(indi(ncot+2))->Coord0(); Coordonnee& A = tab_noeud(ncot+1)->Coord0(); // calcul de G2, centre de gravite du triangle exterieur Coordonnee G2 = (B + C + A) / 3.; // calcul de U1 Vecteur CB = B - C; Vecteur U1 = CB / CB.Norme(); // vecteur CG2 Vecteur CG2 = G2 - C; // longueur H2G2 et GH1 Vecteur H2G2 = CG2 - (CG2 * U1) * U1; double h2G2 = CG2.Norme(); Vecteur CG = G - C; double GH1 = sqrt ( CG * CG - SQR( CG * U1)) ; // calcul de la normale du triangle exterieur Vecteur CA = A - C; Ni = (ProdVec(CB,CA)).Normer(); // calcul de la derivee de la normale Vecteur dNdV = ( Ni - N) / ( GH1 + h2G2); // courbure dans la direction u2 c-a-d H2G2 curbp(ncot) = dNdV * H2G2; // calcul de la matrice de passage de Ualpha a aalpha double Beta21 = H2G2 * aiH1; double Beta22 = H2G2 * aiH2; // remplissage de la matrice mat mat(ncot,1) = Beta21*Beta21; mat(ncot,2) = Beta21*Beta22; mat(ncot,3) = Beta22*Beta22; }; // calcul du tenseur de courbure dans la base ai Mat_pleine mati = mat.Inverse(); curb = mati * curbp; // retour de la courbure return curb; }; //--------------// calcul du tenseur de courbure et de sa variation // plusieurs cas sont etudies suivant l'instant considere // a l'instant t void Met_Sfe1::Dcourbure_t (Tableau& tab_noeud,Vecteur& curb,TabOper& dcurb) { Vecteur & aiB1 = (*aiB_t)(1); Vecteur & aiB2 = (*aiB_t)(2); // pour simplifier Vecteur & aiH1 = (*aiH_t)(1); Vecteur & aiH2 = (*aiH_t)(2); // pour simplifier Tableau tab_coor(6); for (int i=1;i<=6;i++) tab_coor(i) = tab_noeud(i)->Coord1(); Dcourbure1 (tab_coor,aiB1,aiB2,aiH1,aiH2,*d_aiB_t,*d_aiH_t,tab_noeud,curb,dcurb); }; // a l'instant t+dt void Met_Sfe1::Dcourbure_tdt (Tableau& tab_noeud,Vecteur& curb,TabOper& dcurb) { Vecteur & aiB1 = (*aiB_tdt)(1); Vecteur & aiB2 = (*aiB_tdt)(2); // pour simplifier Vecteur & aiH1 = (*aiH_tdt)(1); Vecteur & aiH2 = (*aiH_tdt)(2); // pour simplifier Tableau tab_coor(6); for (int i=1;i<=6;i++) tab_coor(i) = tab_noeud(i)->Coord2(); Dcourbure1 (tab_coor,aiB1,aiB2,aiH1,aiH2,*d_aiB_t,*d_aiH_t,tab_noeud,curb,dcurb); }; // routine generale de calcul de la courbure et de sa variation // en sortie : curb , la courbure b11,b12,b22 // dcurb , la variation de courbure. void Met_Sfe1::Dcourbure (Tableau& tab_coor,Vecteur & aiB1,Vecteur & aiB2, Vecteur & aiH1,Vecteur & aiH2,Tableau & DaiB,Tableau & DaiH, Tableau& tab_noeud,Vecteur& curb,TabOper & dcurb) { int nbddl = 18; // nombre de ddl total int nbddlint = 9; // nombre de ddl interne Vecteur Nul(3); // le vecteur nul de dim 3, pour les initialisations Vecteur curbp(3); // : les tenseurs de courbures dans les axes // locaux des arretes du triangle Tableau dcurbp(nbddl); // variation des courbures Mat_pleine mat(3,3); // matrice pour calculer le tenseur de courbure Tableau dmat(nbddl,mat); // calcul de la normale centrale Vecteur NN = ProdVec(aiB1,aiB2); // normale non normee double nor = NN.Norme(); // la norme Vecteur N = NN / nor; Vecteur DNN; // vecteur intermediair Tableau dN(nbddl,Nul); for (int i1=1;i1<= nbddlint;i1++) { DNN = ProdVec(DaiB(i1)(1),aiB2) + ProdVec(aiB1,DaiB(i1)(2)); dN(i1) = VarUnVect(NN,DNN,nor); } // calcul du centre de gravite Coordonnee G = (tab_coor(1) + tab_coor(2) + tab_coor(3)) / 3.; Tableau dG(nbddl); for (int ia=1;ia<= 3;ia++) {dG(ia) = Ia(ia)/3. ;dG(ia+3) = Ia(ia)/3. ;dG(ia+6) = Ia(ia)/3. ;} // le meme calcul est effectue pour les trois cotes du triangle principale //1- tout d'abord un tableau d'indice pour ne pas etre embete par les modulos 3 Tableau indi(5);indi(1) = 1; indi(2) = 2; indi(3) = 3; indi(4) = 1; indi(5) = 2; // 2- on boucle sur le cotes du triangle Vecteur Ni(3); // normale du triangle exterieur // -------- declaration pour la boucle sur les 3 cotes ------------ Coordonnee G2(3); // init a zero et a 3 composantes Tableau dD(nbddl,Nul),dB(nbddl,Nul),dC(nbddl,Nul),dA(nbddl,Nul) ; // variation des points Tableau dG2(nbddl,Nul); Vecteur CB(3),U1(3),CG2(3),H2G2(3); Tableau dCB(nbddl,Nul),dU1(nbddl,Nul),dH2G2(nbddl,Nul); Tableau dh2G2(nbddl); Vecteur CG(3),CA(3),dNdV(3); Tableau dCA(nbddl,Nul),dNi(nbddl,Nul); double under3 = 1./3.; Vecteur dCG(3),dGH1(3),ddNdv(3),dCG2_jnB,dCG2_jnC,dCG2_jnA; for (int ncot=1;ncot<=3;ncot++) { // on utilise les notations : triangle principal DBC et secondaire BAC // on cherche a calculer la longueur H2G2 // simplification de l'ecriture Coordonnee& D = tab_noeud(indi(ncot))->Coord0(); Coordonnee& B = tab_noeud(indi(ncot+1))->Coord0(); Coordonnee& C = tab_noeud(indi(ncot+2))->Coord0(); Coordonnee& A = tab_noeud(ncot+1)->Coord0(); // calcul de G2, centre de gravite du triangle exterieur G2 = (B + C + A) * under3; // calcul de U1 CB = B - C; double norCB = CB.Norme(); U1 = CB / norCB; // vecteur CG2 CG2 = G2 - C; // longueur H2G2 et GH1 H2G2 = CG2 - (CG2 * U1) * U1; double h2G2 = CG2.Norme(); double unSurh2G2= 1./h2G2; CG = G - C; double GH1 = sqrt ( CG * CG - SQR( CG * U1)) ; // calcul de la normale du triangle exterieur CA = A - C; Ni = ProdVec(CB,CA); double norNi = Ni.Norme(); Ni /= norNi; // calcul de la derivee de la normale dNdV = ( Ni - N) / ( GH1 + h2G2); // courbure dans la direction u2 c-a-d H2G2 curbp(ncot) = dNdV * H2G2; // calcul de la matrice de passage de Ualpha a aalpha double Beta21 = H2G2 * aiH1; double Beta22 = H2G2 * aiH2; // remplissage de la matrice mat mat(ncot,1) = Beta21*Beta21; mat(ncot,2) = Beta21*Beta22; mat(ncot,3) = Beta22*Beta22; // calcul des variations for (int ia=1;ia<= 3;ia++) { // on a 4 indices pour chaque ia, pour lesquels la variation est non nulle // dans cette boucle on n'utilise pas systematiquement les 4 indices int jnD = (indi(ncot)-1)*3+ia; int jnB = (indi(ncot+1)-1)*3+ia; int jnC = (indi(ncot+2)-1)*3+ia; int jnA = 9+(ncot-1)*3+ia; // tout d'abord les variations des points dD(jnD) = Ia(ia);dB(jnB) = Ia(ia); dC(jnC) = Ia(ia);dA(jnA) = Ia(ia); // centre de gravite dG2(jnB) = Ia(ia)*under3; dG2(jnC) = Ia(ia)*under3; dG2(jnA) = Ia(ia)*under3; // vecteur CB dCB(jnB) = dB(jnB); dCB(jnC) = - dC(jnC); // vecteur U1 dU1(jnB) = VarUnVect(CB,dCB(jnB),norCB); dU1(jnC) = VarUnVect(CB,dCB(jnC),norCB); // vecteur CG2 dCG2_jnB = dG2(jnB) - dC(jnB); dCG2_jnC = dG2(jnC) - dC(jnC); dCG2_jnA = dG2(jnA); // vecteur H2G2= CG2 - (CG2 * U1) * U1; dH2G2(jnB) = dCG2_jnB-(dCG2_jnB*U1 + CG2*dU1(jnB))* U1- (CG2 * U1)* dU1(jnB); dH2G2(jnC) = dCG2_jnC-(dCG2_jnC*U1 + CG2*dU1(jnC))* U1- (CG2 * U1)* dU1(jnC); dH2G2(jnA) = dCG2_jnA-(dCG2_jnA*U1 + CG2*dU1(jnA))* U1- (CG2 * U1)* dU1(jnA); // scalaire h2G2 = CG2.Norme(); dh2G2(jnB) = dH2G2(jnB) * H2G2 /unSurh2G2; dh2G2(jnC) = dH2G2(jnC) * H2G2 /unSurh2G2; dh2G2(jnA) = dH2G2(jnA) * H2G2 /unSurh2G2; // Vecteur CA = A - C dCA(jnC) = -dC(jnC); dCA(jnA) = dA(jnA); // Vecteur Ni = (ProdVec(CB,CA)).Normer() dNi(jnC) = VarUnVect(Ni,(ProdVec(dCB(jnC),CA)+ProdVec(CA,dCA(jnC))),norNi); dNi(jnB) = VarUnVect(Ni,(ProdVec(dCB(jnB),CA)+ProdVec(CA,dCA(jnB))),norNi); dNi(jnA) = VarUnVect(Ni,(ProdVec(dCB(jnA),CA)+ProdVec(CA,dCA(jnA))),norNi); } for (int ib=1;ib<= 3;ib++) { // on a 4 indices pour chaque ia, pour lesquels la variation est non nulle // mais ici on utilise systematiquement les 4 indices d'ou une seconde boucle // egalement moins de stockage intermediaire int jnb[4] = {(indi(ncot)-1)*3+ib,(indi(ncot+1)-1)*3+ib, (indi(ncot+2)-1)*3+ib,9+(ncot-1)*3+ib}; for (int jb=0;jb<=3;jb++) { // vecteur CG = G - C dCG = dG(jnb[jb]) - dC(jnb[jb]); // scalaire GH1 = sqrt ( CG * CG - SQR( CG * U1)) dGH1 = (dCG * CG - (CG * U1) * (dCG * U1 + CG * dU1(jnb[jb])))/ GH1 ; // vecteur dNdV = ( Ni - N) / ( GH1 + h2G2) ddNdv = (dNi(jnb[jb]) - dN(jnb[jb])) / ( GH1 + h2G2) - ( dGH1 + dh2G2(jnb[jb])) * (Ni - N) / ( SQR ( GH1 + h2G2)); // courbure curbp(ncot) = dNdV * H2G2; dcurbp(jnb[jb])(ncot) = ddNdv * H2G2 + dNdV * dH2G2(jnb[jb]); // matrice de passage : Beta21 = H2G2 * aiH1 et Beta22 = H2G2 * aiH2 double dBeta21 = dH2G2(jnb[jb]) * aiH1 + H2G2 * DaiH(1)(jnb[jb]); double dBeta22 = dH2G2(jnb[jb]) * aiH2 + H2G2 * DaiH(2)(jnb[jb]); // matrice mat : mat(ncot,1) = Beta21*Beta21 ; mat(ncot,2) = Beta21*Beta22; // mat(ncot,3) = Beta22*Beta22; dmat(jnb[jb])(ncot,1) = 2. * dBeta21 * Beta21; dmat(jnb[jb])(ncot,2) = dBeta21 * Beta22 + Beta21 * dBeta22; dmat(jnb[jb])(ncot,3) = dBeta22 * Beta22 + Beta22 * dBeta22; } } }; // calcul du tenseur de courbure dans la base ai Mat_pleine mati = mat.Inverse(); curb = mati * curbp; // variations Mat_pleine dmati(mati); for (int ddl=1;ddl<=nbddl;ddl++) { dmati = - mat * ( dmat(ddl) * mati); dcurb(ddl) = dmati * curbp + mati * dcurbp(ddl); } }; /*// void Met_Sfe1::courbure2 (Tableau& tab_noeud, Mat_pleine& dphi, int nombre_noeud) { // tout d'abord on calcul la base naturelle du triangle central if (giB_0 =! NULL) Calcul_giB_0 (tab_noeud,dphi,3); // 3 pour les 3 noeuds centrals Vecteur & aiB1 = (*giB_0)(1); Vecteur & aiB2 = (*giB_0)(2); // pour simplicite Calcul_gijBB_0 (); // puis la metrique " Calcul_gijHH_0 (); // composantes controvariantes // les bases duales Calcul_giH_0(); Vecteur & aiH1 = (*giH_0)(1); Vecteur & aiH2 = (*giH_0)(2); // pour simplicite Vecteur curbp(3),curb(3); // lestenseurs de courbures d'abord dans les axes // locaux des arretes du triangle puis dans le repere naturel: b11,b12,b22 Mat_pleine mat(3,3); // matrice pour calculer le tenseur de courbure // calcul de la normale centrale Vecteur N = (ProdVec(aiB1,aiB2)).Normer(); // calcul du centre de gravite Coordonnee G = (tab_noeud(1)->Coord0() + tab_noeud(2)->Coord0() + tab_noeud(3)->Coord0()) / 3.; // le meme calcul est effectue pour les trois cotes du triangle principale //1- tout d'abord un tableau d'indice pour ne pas etre embete par les modulos 3 Vecteur indi(5);indi(1) = 1; indi(2) = 2; indi(3) = 3; indi(4) = 1; indi(5) = 2; // 2- on boucle sur le cotes du triangle Vecteur Ni(3); // normale du triangle exterieur for (int ncot=1;ncot<=3;ncot++) { // on utilise les notations : triangle principal DBC et secondaire BAC // on cherche l'image de par rotation du plan BAC dans le plan DBC // le point A devient alors Ap // calcul des vecteurs cote Vecteur CA = tab_noeud(ncot+3)->Coord0() - tab_noeud(indi(ncot)+2)->Coord0(); Vecteur CB = tab_noeud(indi(ncot)+1)->Coord0() - tab_noeud(indi(ncot)+2)->Coord0(); Vecteur BA = tab_noeud(ncot+3)->Coord0() - tab_noeud(indi(ncot)+1)->Coord0(); // calcul du terme (i) appele xi double CA2 = CA * CA; double xi = CA2 + CB * CB - BA * BA; // calcul des coefficients a et b double g1CB = aiB1 * CB; double a = -(aiB2 * CB) / g1CB ; double b = xi * 0.5 / g1CB; // calcul des coefficients de l'equation du second degre Vecteur ag1g2 = a * aiB1 + aiB2; double aa = ag1g2 * ag1g2; double bb = (2 * b) * (aiB1 * ag1g2); double cc = (b*b) * (aiB1 * aiB1) - CA2; // resolution de l'equation du second degre double x1,x2; int isol; // ResoEqua2(aa,bb,cc,x1,x2,isol); // calcul de la position du point externe sur le plan de la facette centrale double teta1 = x1 * a + b; // choix de x1 a priori pour teta2 Coordonnee Ap = teta1 * aiB1 + x1 * aiB2; // verif du point Vecteur DC = tab_noeud(indi(ncot)+2)->Coord0() - tab_noeud(indi(ncot))->Coord0(); Vecteur CAp = Ap - tab_noeud(indi(ncot)+2)->Coord0(); if (DC * CAp < 0) { // cas ou c'etait x2 le teta2 teta1 = x2 * a + b; Ap = teta1 * aiB1 + x2 * aiB2; CAp = Ap - tab_noeud(indi(ncot)+2)->Coord0(); } // calcul de la normale du triangle exterieur Ni = (ProdVec(CB,CAp)).Normer(); // calcul de GH1 et GpH2 Vecteur CG = G - tab_noeud(indi(ncot)+2)->Coord0(); Vecteur U1 = CB / CB.Norme(); double GH1 = sqrt ( CG * CG - ( CG * U1) * ( CG * U2)) ; // a modifier !!!! double H2Gp = sqrt ( CG * CGp - ( CGp * U2) * ( CGp * U2)) ; // a modifier !!!! // calcul de la derivee de la normale Vecteur dNdV = ( Ni - N) / ( GH1 + H2Gp); // calcul du vecteur normal a U1, c'a dire U2, mais qui n'est pas norme Vecteur U2 = CAp - (CAp * U1) * U1; // courbure dans la direction u22 curbp(ncot) = dNdV * U2; // calcul de la matrice de passage de Ualpha a aalpha double Beta21 = U2 * giH(1); double Beta22 = U2 * giH(2); // remplissage de la matrice mat mat(ncot,1) = Beta21*Beta21; mat(ncot,2) = Beta21*Beta22; mat(ncot,3) = Beta22*Beta22; }; // calcul du tenseur de courbure dans la base gi Mat_pleine mati = mat.Inverse(); curb = mati * curbp; }; // calcul de la base naturel a t void Met_Sfe1::Calcul_giB_t ( Tableau& tab_noeud, Mat_pleine& dphi, int nombre_noeud) { for (int a=1;a<= dim_base;a++) { (*(giB_t))(1)(a)= 0.; for (int r=1;r<=nombre_noeud;r++) { (*(giB_t))(1)(a)=(*(giB_t))(1)(a) + tab_noeud(r)->Coord1()(a) * dphi(1,r); }; }; }; // calcul de la base naturel a tdt void Met_Sfe1::Calcul_giB_tdt ( Tableau& tab_noeud, Mat_pleine& dphi, int nombre_noeud) { for (int a=1;a<= dim_base;a++) { (*(giB_tdt))(1)(a)= 0.; for (int r=1;r<=nombre_noeud;r++) { (*(giB_tdt))(1)(a)=(*(giB_tdt))(1)(a) + tab_noeud(r)->Coord2()(a) * dphi(1,r); }; }; }; */