// 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 "Met_abstraite.h" #include "Util.h" #include "Coordonnee3.h" using namespace std; //introduces namespace std // a priori on n'en n'a pas besoin mais c'est pour que l'éditeur reconnaisse les différentes // fonctions ?? // ========================================================================================= // vu la taille des executables le fichier est decompose en trois // le premier : Met_abstraite1s2.cp concerne les constructeurs, destructeur et // la gestion des variables // le deuxième : Met_abstraite2s2.cp concerne le calcul des méthodes publiques // le troisième: Met_abstraite2s2.cp concerne le calcul des méthodes privées // ========================================================================================= // ***********$ il faut utiliser des références pour optimiser l'opérateur parenthèse /// ceci dans la plupart des routines gourmandes !!!!!!!!!!!!!!!!!!!! //==================== METHODES PROTEGEES=============================== // calcul des points // calcul du point a t0 void Met_abstraite::Calcul_M0 ( const Tableau& tab_noeud, const Vecteur& phi, int nombre_noeud) { #ifdef MISE_AU_POINT if (M0 == NULL) { cout << "\nErreur : le point a t=0 n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_M0 \n"; Sortie(1); }; #endif int amax = M0->Dimension(); for (int a=1;a<= amax;a++) { double & M0a=(*(M0))(a); M0a=0.; // (*(M0))(a)= 0.; for (int r=1;r<=nombre_noeud;r++) { M0a +=tab_noeud(r)->Coord0()(a) * phi(r); }; }; }; // calcul du point a t void Met_abstraite::Calcul_Mt ( const Tableau& tab_noeud, const Vecteur& phi, int nombre_noeud) { #ifdef MISE_AU_POINT if (Mt == NULL) { cout << "\nErreur : le point a t n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_Mt \n"; Sortie(1); }; #endif int amax = Mt->Dimension(); for (int a=1;a<= amax;a++) { double & Mta=(*(Mt))(a); Mta=0.; // (*(Mt))(a)= 0.; for (int r=1;r<=nombre_noeud;r++) { Mta +=tab_noeud(r)->Coord1()(a) * phi(r); }; }; }; // calcul des variations du point a t void Met_abstraite::Calcul_d_Mt (const Tableau& , const Vecteur& phi, int nbnoeu) { #ifdef MISE_AU_POINT if (d_Mt == NULL) { cout << "\nErreur : le de variation du point a t n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_d_Mt \n"; Sortie(1); }; #endif int indice; for (int b = 1; b<= dim_base; b++) for (int r = 1; r <= nbnoeu; r++) { indice = (r-1)*dim_base + b; Coordonnee & d_Mt_indice=(*d_Mt)(indice); d_Mt_indice.Zero(); d_Mt_indice(b)=phi(r); } }; // calcul du point a tdt void Met_abstraite::Calcul_Mtdt ( const Tableau& tab_noeud, const Vecteur& phi, int nombre_noeud) { #ifdef MISE_AU_POINT if (Mtdt == NULL) { cout << "\nErreur : le point a t+dt n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_Mtdt \n"; Sortie(1); }; #endif int amax = Mtdt->Dimension(); for (int a=1;a<= amax;a++) { double & Mtdta=(*(Mtdt))(a); Mtdta=0.; // (*(Mtdt))(a)= 0.; for (int r=1;r<=nombre_noeud;r++) { Mtdta +=tab_noeud(r)->Coord2()(a) * phi(r); }; }; }; // calcul des variations du point a tdt void Met_abstraite::Calcul_d_Mtdt (const Tableau& , const Vecteur& phi, int nbnoeu) { #ifdef MISE_AU_POINT if (d_Mtdt == NULL) { cout << "\nErreur : le de variation du point a t n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_d_Mtdt \n"; Sortie(1); }; #endif int indice; for (int b = 1; b<= dim_base; b++) for (int r = 1; r <= nbnoeu; r++) { indice = (r-1)*dim_base + b; Coordonnee & d_Mtdt_indice=(*d_Mtdt)(indice); d_Mtdt_indice.Zero(); d_Mtdt_indice(b)=phi(r); } }; // calcul de la base naturel a t0 -- calcul classique void Met_abstraite::Calcul_giB_0 ( const Tableau& tab_noeud, const Mat_pleine& dphi, int nombre_noeud,const Vecteur&) { #ifdef MISE_AU_POINT if (giB_0 == NULL) { cout << "\nErreur : la base a t=0 n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_giB_0 \n"; Sortie(1); }; #endif for (int i=1;i<= nbvec_base;i++) {for (int a=1;a<= dim_base;a++) { double & gib0_i_a = giB_0->CoordoB(i)(a); gib0_i_a = 0.; for (int r=1;r<=nombre_noeud;r++) { gib0_i_a += tab_noeud(r)->Coord0()(a) * dphi(i,r); }; }; }; }; // calcul de la base naturel a t -- calcul classique void Met_abstraite::Calcul_giB_t ( const Tableau& tab_noeud, const Mat_pleine& dphi, int nombre_noeud,const Vecteur&) { #ifdef MISE_AU_POINT if (giB_t == NULL) { cout << "\nErreur : la base a t n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_giB_t \n"; Sortie(1); }; #endif for (int i=1;i<= nbvec_base;i++) {for (int a=1;a<= dim_base;a++) { double & gibt_i_a = giB_t->CoordoB(i)(a); gibt_i_a = 0.; for (int r=1;r<=nombre_noeud;r++) { gibt_i_a += tab_noeud(r)->Coord1()(a) * dphi(i,r); }; }; }; }; // calcul de la base naturel a tdt -- calcul classique void Met_abstraite::Calcul_giB_tdt ( const Tableau& tab_noeud, const Mat_pleine& dphi, int nombre_noeud,const Vecteur&) { #ifdef MISE_AU_POINT if (giB_tdt == NULL) { cout << "\nErreur : la base a t+dt n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_giB_tdt \n"; Sortie(1); }; #endif for (int i=1;i<= nbvec_base;i++) {for (int a=1;a<= dim_base;a++) { double & gibtdt_i_a = giB_tdt->CoordoB(i)(a); gibtdt_i_a = 0.; for (int r=1;r<=nombre_noeud;r++) { gibtdt_i_a += tab_noeud(r)->Coord2()(a) * dphi(i,r); }; }; }; }; // calcul des metriques // Calcul des composantes covariantes de la metrique d'une base naturelle: void Met_abstraite::Calcul_gijBB (BaseB & giB,TenseurBB & gijBB) { int giBnbVecteur = giB.NbVecteur(); for (int i = 1; i<= giBnbVecteur; i++) for (int j=1; j<= i; j++) gijBB.Coor(i,j) = (giB(i)).ScalBB(giB(j)); }; // Calcul des composantes covariantes de la metrique de la base naturelle a 0 : void Met_abstraite::Calcul_gijBB_0 () { #ifdef MISE_AU_POINT if ((giB_0 == NULL) || (gijBB_0 == NULL)) { cout << "\nErreur : la base et/ou metrique a t=0 n'est pas defini !\n"; cout << "Calcul_gijBB_0 \n"; Sortie(1); }; #endif Calcul_gijBB(*(giB_0),*(gijBB_0)); }; // Calcul des composantes covariantes de la metrique de la base naturelle a t : void Met_abstraite::Calcul_gijBB_t () { #ifdef MISE_AU_POINT if ((giB_t == NULL) || (gijBB_t == NULL)) { cout << "\nErreur : la base et/ou metrique a t n'est pas defini !\n"; cout << "Calcul_gijBB_t \n"; Sortie(1); }; #endif Calcul_gijBB(*(giB_t),*(gijBB_t)); }; // Calcul des composantes covariantes de la metrique de la base naturelle a tdt : void Met_abstraite::Calcul_gijBB_tdt () { #ifdef MISE_AU_POINT if ((giB_tdt == NULL) || (gijBB_tdt == NULL)) { cout << "\nErreur : la base et/ou metrique a t+dt n'est pas defini !\n"; cout << "Calcul_gijBB_tdt \n"; Sortie(1); }; #endif Calcul_gijBB(*(giB_tdt),*(gijBB_tdt)); }; // calcul du gradient de vitesse à t void Met_abstraite::Calcul_gradVBB_t (const Tableau& tab_noeud, const Mat_pleine& dphi,int nombre_noeud) { #ifdef MISE_AU_POINT if ((giB_t == NULL) || (gradVBB_t == NULL)) { cout << "\nErreur : la base et/ou le gradient de vitesse a t n'est pas defini !\n"; cout << "\nMet_abstraite::Calcul_gradVBB_t \n"; Sortie(1); }; #endif // Vi|j = V^{ar} \phi_{r,j} \vec I_a . \vec g_i for (int i=1;i<= nbvec_base;i++) {CoordonneeB & giBt = giB_t->CoordoB(i); for (int j=1;j<= nbvec_base;j++) {double& gradVij=(*gradVBB_t).Coor(i,j); gradVij = 0.; for (int r=1;r<=nombre_noeud;r++) {switch (dim_base) {case 3: gradVij += tab_noeud(r)->Valeur_t(V3) * dphi(j,r) * giBt(3); case 2: gradVij += tab_noeud(r)->Valeur_t(V2) * dphi(j,r) * giBt(2); case 1: gradVij += tab_noeud(r)->Valeur_t(V1) * dphi(j,r) * giBt(1); } //-- fin du switch } // -- fin du for sur r } // -- fin du for sur j }// -- fin du for sur i }; // calcul gradient de vitesse à t+dt void Met_abstraite::Calcul_gradVBB_tdt (const Tableau& tab_noeud, const Mat_pleine& dphi,int nombre_noeud) { #ifdef MISE_AU_POINT if ((giB_tdt == NULL) || (gradVBB_tdt == NULL)) { cout << "\nErreur : la base et/ou le gradient de vitesse a t+dt n'est pas defini !\n"; cout << "\nMet_abstraite::Calcul_gradVBB_tdt \n"; Sortie(1); }; #endif // Vi|j = V^{ar} \phi_{r,j} \vec I_a . \vec g_i for (int i=1;i<= nbvec_base;i++) {CoordonneeB & giBtdt = giB_tdt->CoordoB(i); for (int j=1;j<= nbvec_base;j++) {double& gradVij=(*gradVBB_tdt).Coor(i,j); gradVij = 0.; for (int r=1;r<=nombre_noeud;r++) {switch (dim_base) {case 3: gradVij += tab_noeud(r)->Valeur_tdt(V3) * dphi(j,r) * giBtdt(3); case 2: gradVij += tab_noeud(r)->Valeur_tdt(V2) * dphi(j,r) * giBtdt(2); case 1: gradVij += tab_noeud(r)->Valeur_tdt(V1) * dphi(j,r) * giBtdt(1); } //-- fin du switch } // -- fin du for sur r } // -- fin du for sur j }// -- fin du for sur i }; // calcul du gradient de vitesse moyen en utilisant delta x^ar/delta t // dans le cas où les ddl à tdt n'existent pas -> utilisation de la vitesse sécante entre 0 et t !! void Met_abstraite::Calcul_gradVBB_moyen_t (const Tableau& tab_noeud, const Mat_pleine& dphi,int nombre_noeud) { #ifdef MISE_AU_POINT if ((giB_t == NULL) || (gradVmoyBB_t == NULL)) { cout << "\nErreur : la base et/ou le gradient de vitesse a t+dt n'est pas defini !\n"; cout << "\nMet_abstraite::Calcul_gradVBB_moyen_t \n"; Sortie(1); }; #endif // on pose V^{ar} = delta X^{ar} / delta t // on choisit une vitesse de déformation pour l'instant identique à deltaeps/t const VariablesTemps& vartemps = ParaGlob::Variables_de_temps(); // dans le cas où l'incrément de temps est nul la vitesse est nulle double deltat=vartemps.IncreTempsCourant();double unsurdeltat; double temps =vartemps.TempsCourant(); // on regarde le premier noeud pour savoir s'il y a des coordonnées à t+dt if (tab_noeud(1)->ExisteCoord2()) {// dans ce cas on utilise l'incrément de temps if (deltat >= ConstMath::trespetit) {unsurdeltat = 1./deltat;} else {unsurdeltat = 0.;} // o car on veut une vitesse nulle } else // sinon on utilise la variation totale de 0 à t, le delta t vaudra le temps actuel { if (temps >= ConstMath::trespetit) {unsurdeltat = 1./temps;} else {unsurdeltat = 0.;} // o car on veut une vitesse nulle } // Vi|j = V^{ar} \phi_{r,j} \vec I_a . \vec g_i gradVmoyBB_t->Inita(0.); for (int iv=1;iv<=nbvec_base;iv++) dmatV_moy_t->CoordoB(iv).Zero(); for (int r=1;r<=nombre_noeud;r++) { // on construit d'abord le vecteur vitesse Coordonnee & V = V_moy_t(r); if (tab_noeud(r)->ExisteCoord2()) V = (tab_noeud(r)->Coord2() - tab_noeud(r)->Coord1())*unsurdeltat; else // sinon utilisation des coordonnées sécantes !!! V = (tab_noeud(r)->Coord1() - tab_noeud(r)->Coord0())*unsurdeltat; for (int i=1;i<= nbvec_base;i++) {CoordonneeB & giBt = giB_t->CoordoB(i); // calcul de gradVij for (int j=1;j<= nbvec_base;j++) {double& gradVij=(*gradVmoyBB_t).Coor(i,j); switch (dim_base) {case 3: gradVij += V(3) * dphi(j,r) * giBt(3); case 2: gradVij += V(2) * dphi(j,r) * giBt(2); case 1: gradVij += V(1) * dphi(j,r) * giBt(1); } //-- fin du switch } // -- fin du for sur j // calcul des vecteurs V,i moyens CoordonneeB & dmatV_moy_t_i= dmatV_moy_t->CoordoB(i); switch (dim_base) {case 3: dmatV_moy_t_i(3) += V(3) * dphi(i,r); case 2: dmatV_moy_t_i(2) += V(2) * dphi(i,r); case 1: dmatV_moy_t_i(1) += V(1) * dphi(i,r); } //-- fin du switch }// -- fin du for sur i } // -- fin du for sur r }; // calcul du gradient de vitesse moyen en utilisant delta x^ar/delta t void Met_abstraite::Calcul_gradVBB_moyen_tdt (const Tableau& tab_noeud, const Mat_pleine& dphi,int nombre_noeud) { #ifdef MISE_AU_POINT if ((giB_tdt == NULL) || (gradVmoyBB_tdt == NULL)) { cout << "\nErreur : la base et/ou le gradient de vitesse a t+dt n'est pas defini !\n"; cout << "\nMet_abstraite::Calcul_gradVBB_moyen_tdt \n"; Sortie(1); }; #endif // on pose V^{ar} = delta X^{ar} / delta t // on choisit une vitesse de déformation pour l'instant identique à deltaeps/t const VariablesTemps& vartemps = ParaGlob::Variables_de_temps(); // dans le cas où l'incrément de temps est nul la vitesse est nulle double deltat=vartemps.IncreTempsCourant(); double unsurdeltat; if (deltat >= ConstMath::trespetit) {unsurdeltat = 1./deltat;} else {unsurdeltat = 0.;} // o car on veut une vitesse nulle // Vi|j = V^{ar} \phi_{r,j} \vec I_a . \vec g_i gradVmoyBB_tdt->Inita(0.); for (int iv=1;iv<=nbvec_base;iv++) dmatV_moy_tdt->CoordoB(iv).Zero(); for (int r=1;r<=nombre_noeud;r++) { // on construit d'abord le vecteur vitesse Coordonnee & V = V_moy_t(r); V = (tab_noeud(r)->Coord2() - tab_noeud(r)->Coord1())*unsurdeltat; for (int i=1;i<= nbvec_base;i++) {CoordonneeB & giBtdt = giB_tdt->CoordoB(i); for (int j=1;j<= nbvec_base;j++) {double& gradVij=(*gradVmoyBB_tdt).Coor(i,j); switch (dim_base) {case 3: gradVij += V(3) * dphi(j,r) * giBtdt(3); case 2: gradVij += V(2) * dphi(j,r) * giBtdt(2); case 1: gradVij += V(1) * dphi(j,r) * giBtdt(1); } //-- fin du switch } // -- fin du for sur j // calcul des vecteurs V,i moyens CoordonneeB & dmatV_moy_tdt_i= dmatV_moy_tdt->CoordoB(i); switch (dim_base) {case 3: dmatV_moy_tdt_i(3) += V(3) * dphi(i,r); case 2: dmatV_moy_tdt_i(2) += V(2) * dphi(i,r); case 1: dmatV_moy_tdt_i(1) += V(1) * dphi(i,r); } //-- fin du switch }// -- fin du for sur i }; // -- fin du for sur r }; // Calcul des composantes contravariantes de la metrique de la base naturelle a 0 : void Met_abstraite::Calcul_gijHH_0 () { #ifdef MISE_AU_POINT if ((giB_0 == NULL) || (gijBB_0 == NULL) || (gijHH_0 == NULL)) { cout << "\nErreur : la base ou la metrique cov ou contra ne sont definis !\n"; cout << "Calcul_gijHH_0 \n"; Sortie(1); }; #endif *gijHH_0 = gijBB_0->Inverse(); }; // Calcul des composantes contravariantes de la metrique de la base naturelle a t : void Met_abstraite::Calcul_gijHH_t () { #ifdef MISE_AU_POINT if ((giB_t == NULL) || (gijBB_t == NULL)) { cout << "\nErreur : la base et la metrique n'est pas defini !\n"; cout << "Calcul_gijHH_t \n"; Sortie(1); }; #endif *gijHH_t = gijBB_t->Inverse(); }; // Calcul des composantes contravariantes de la metrique de la base naturelle a tdt : void Met_abstraite::Calcul_gijHH_tdt () { #ifdef MISE_AU_POINT if ((giB_tdt == NULL) || (gijBB_tdt == NULL)) { cout << "\nErreur : la base et la metrique n'est pas defini !\n"; cout << "Calcul_gijHH_tdt \n"; Sortie(1); }; #endif *gijHH_tdt = gijBB_tdt->Inverse(); }; // calcul des bases duales void Met_abstraite::Calcul_giH(BaseB* giB, TenseurHH* gijHH, BaseH * giH) { #ifdef MISE_AU_POINT if ((giB == NULL) || (gijHH == NULL)) { cout << "\nErreur : la base naturelle n'existe pas !\n"; cout << "Erreur : la base metrique contravariante n'existe pas !\n"; cout << "Calcul_giH \n"; Sortie(1); }; #endif int nb = giB->NbVecteur(); for (int i=1; i<= nb; i++) {CoordonneeH & giH_i= giH->CoordoH(i); giH_i.Zero(); //(*giH)(i).Zero(); // mise a zero du vecteur for (int j=1; j<= nb; j++) { CoordonneeB & giB_j= giB->CoordoB(j); for (int k=1;k<= dim_base; k++) giH_i(k) += (*gijHH)(i,j) * giB_j(k); // (*giH)(i)(k) += gijHH(i,j) * giB(j)(k); } } }; void Met_abstraite::Calcul_giH_0() { Calcul_giH( giB_0, gijHH_0,giH_0);}; void Met_abstraite::Calcul_giH_t() { Calcul_giH( giB_t, gijHH_t,giH_t);}; void Met_abstraite::Calcul_giH_tdt() { Calcul_giH( giB_tdt, gijHH_tdt,giH_tdt);}; // calcul des Jacobiens----------------------------------------- void Met_abstraite::Jacobien_0() { #ifdef MISE_AU_POINT if (gijBB_0 == NULL) { cout << "\nErreur : la metrique n'est pas defini a t=0 !\n"; cout << "Met_abstraite::Jacobien_0 \n"; Sortie(1); }; #endif // jacobien_0 = sqrt (gijBB_0->Det()); toujours positif donc pb donc calcul en produit mixte jacobien_0 = Util::ProduitMixte(*giB_0); }; void Met_abstraite::Jacobien_t() { #ifdef MISE_AU_POINT if (gijBB_t == NULL) { cout << "\nErreur : la metrique n'est pas defini a t !\n"; cout << "Met_abstraite::Jacobien_t \n"; Sortie(1); }; #endif // jacobien_t = sqrt (gijBB_t->Det()); toujours positif donc pb donc calcul en produit mixte jacobien_t = Util::ProduitMixte(*giB_t); }; void Met_abstraite::Jacobien_tdt() { #ifdef MISE_AU_POINT if (gijBB_tdt == NULL) { cout << "\nErreur : la metrique n'est pas defini a tdt !\n"; cout << "Met_abstraite::Jacobien_tdt \n"; Sortie(1); }; #endif // jacobien_tdt = sqrt (gijBB_tdt->Det()); toujours positif donc pb donc calcul en produit mixte jacobien_tdt = Util::ProduitMixte(*giB_tdt); }; //== calcul de la variation des bases void Met_abstraite::D_giB_t( const Mat_pleine& dphi, int nbnoeu,const Vecteur & ) { int indice; // derivees de gBi par rapport a XHbr for (int b = 1; b<= dim_base; b++) for (int r = 1; r <= nbnoeu; r++) { indice = (r-1)*dim_base + b; BaseB & d_giB_t_indice=(*d_giB_t)(indice); for (int i =1;i<=nbvec_base;i++) { d_giB_t_indice.CoordoB(i).Zero(); d_giB_t_indice.CoordoB(i)(b)=dphi(i,r); } } }; void Met_abstraite::D_giB_tdt( const Mat_pleine& dphi, int nbnoeu,const Vecteur &) { int indice; for (int b = 1; b<= dim_base; b++) for (int r = 1; r <= nbnoeu; r++) { indice = (r-1)*dim_base + b; BaseB & d_giB_tdt_indice=(*d_giB_tdt)(indice); for (int i =1;i<=nbvec_base;i++) { d_giB_tdt_indice.CoordoB(i).Zero(); d_giB_tdt_indice.CoordoB(i)(b)=dphi(i,r); } } }; void Met_abstraite::D_giH_t() { int nbddl = d_giH_t->Taille(); for ( int indice = 1; indice <= nbddl; indice ++) for (int j =1;j<=nbvec_base;j++) { ((*d_giH_t)(indice).CoordoH(j)).Zero(); for (int i =1;i<=nbvec_base;i++) (*d_giH_t)(indice).CoordoH(j) += (-((*d_giB_t)(indice)(i)) * (*giH_t)(j)) * (*giH_t)(i); } }; void Met_abstraite::D_giH_tdt() { int nbddl = d_giH_tdt->Taille(); for (int indice = 1; indice <= nbddl; indice ++) for (int j =1;j<=nbvec_base;j++) { CoordonneeH & d_giH_tdt_indice_j = (*d_giH_tdt)(indice).CoordoH(j); BaseB & d_giB_tdt_indice = (*d_giB_tdt)(indice); CoordonneeH & giH_tdt_j = (*giH_tdt).CoordoH(j); d_giH_tdt_indice_j.Zero();//((*d_giH_tdt)(indice)(j)).Zero(); for (int i =1;i<=nbvec_base;i++) d_giH_tdt_indice_j += (-(d_giB_tdt_indice(i)) * giH_tdt_j) * (*giH_tdt)(i); } }; //== calcul de la variation des metriques void Met_abstraite::D_gijBB_t() { int nbddl = d_gijBB_t.Taille(); for ( int indice = 1; indice <= nbddl; indice ++) { TenseurBB & d_gijBB_t_indice = (*(d_gijBB_t(indice))); BaseB & d_giB_t_indice = (*d_giB_t)(indice); for (int j =1;j<=nbvec_base;j++) for (int i =1;i<=nbvec_base;i++) d_gijBB_t_indice.Coor(i,j) = (d_giB_t_indice(i).ScalBB((*giB_t)(j))) + (d_giB_t_indice(j).ScalBB((*giB_t)(i))); } }; void Met_abstraite::D_gijBB_tdt() { int nbddl = d_gijBB_tdt.Taille(); for ( int indice = 1; indice <= nbddl; indice ++) { TenseurBB & d_gijBB_tdt_indice = (*(d_gijBB_tdt(indice))); BaseB & d_giB_tdt_indice = (*d_giB_tdt)(indice); for (int j =1;j<=nbvec_base;j++) for (int i =1;i<=nbvec_base;i++) d_gijBB_tdt_indice.Coor(i,j) = (d_giB_tdt_indice(i).ScalBB((*giB_tdt)(j))) + (d_giB_tdt_indice(j).ScalBB((*giB_tdt)(i))); } }; void Met_abstraite::D_gijHH_t() { int nbddl = d_gijHH_t.Taille(); for ( int indice = 1; indice <= nbddl; indice ++) { TenseurHH & d_gijHH_t_indice = (*(d_gijHH_t(indice))); BaseH & d_giH_t_indice = (*d_giH_t)(indice); for (int j =1;j<=nbvec_base;j++) for (int i =1;i<=nbvec_base;i++) d_gijHH_t_indice.Coor(i,j) = (d_giH_t_indice(i).ScalHH((*giH_t)(j))) + (d_giH_t_indice(j).ScalHH((*giH_t)(i))); } }; void Met_abstraite::D_gijHH_tdt() { int nbddl = d_gijHH_tdt.Taille(); for ( int indice = 1; indice <= nbddl; indice ++) { TenseurHH & d_gijHH_tdt_indice = (*(d_gijHH_tdt(indice))); BaseH & d_giH_tdt_indice = (*d_giH_tdt)(indice); for (int j =1;j<=nbvec_base;j++) for (int i =1;i<=nbvec_base;i++) d_gijHH_tdt_indice.Coor(i,j) = (d_giH_tdt_indice(i).ScalHH((*giH_tdt)(j))) + (d_giH_tdt_indice(j).ScalHH((*giH_tdt)(i))); } }; //== calcul de la variation seconde des metriques void Met_abstraite::D2_gijBB_tdt() // ici on ne considère que la variation première des vecteurs de base, c-a-d que // l'on considère que leurs variations secondes sont nulles // ce qui est vrai dans le cas d'une cinématique simple { int nbddl = d_giB_tdt->Taille(); for ( int indice = 1; indice <= nbddl; indice ++) for ( int jndice = 1; jndice <= indice; jndice ++) {TenseurBB & d2_gijBB_tdt_indice_jndice = (*(d2_gijBB_tdt(indice,jndice))); TenseurBB & d2_gijBB_tdt_jndice_indice = (*(d2_gijBB_tdt(jndice,indice))); BaseB & d_giB_tdt_indice = (*d_giB_tdt)(indice); BaseB & d_giB_tdt_jndice = (*d_giB_tdt)(jndice); for (int j =1;j<=nbvec_base;j++) for (int i =1;i<=j;i++) { d2_gijBB_tdt_indice_jndice.Coor(i,j) = d_giB_tdt_indice(i).ScalBB(d_giB_tdt_jndice(j)) +d_giB_tdt_indice(j).ScalBB(d_giB_tdt_jndice(i)) ; // on utilise les symétries i<->j et indice<->jndice d2_gijBB_tdt_indice_jndice.Coor(j,i) = d2_gijBB_tdt_indice_jndice(i,j); d2_gijBB_tdt_jndice_indice.Coor(i,j) = d2_gijBB_tdt_indice_jndice(i,j); d2_gijBB_tdt_jndice_indice.Coor(j,i) = d2_gijBB_tdt_indice_jndice(i,j); } } }; //== calcul de la variation des jacobiens // pas valable dans le cas à une dimension void Met_abstraite::Djacobien_t() { int nbddl = d_giB_t->Taille(); switch (nbvec_base) { case 1 : cout << "\n **** erreur le calcul de la variation du jacobien n'est pas définit " << " dans le cas d'une métrique à un vecteur " << "\n Met_abstraite::Djacobien_t()"; Sortie(1); break; case 2 : // pour 2 vecteurs le jacobien est calculé // soit comme la norme du produit vectoriel de deux vecteurs en dim 3 // soit comme le produit en croix des composantes des deux vecteurs en dim 2 // il faut donc calculer la dérivée en conséquence { if (ParaGlob::Dimension() == 2) { for ( int indice = 1; indice <= nbddl; indice ++) d_jacobien_t(indice) = ( Util::DeterminantB((*d_giB_t)(indice)(1),(*giB_t)(2)) + Util::DeterminantB((*giB_t)(1),(*d_giB_t)(indice)(2)) ); // je pense erreur car pas commutatif + Util::DeterminantB((*d_giB_t)(indice)(2),(*giB_t)(1)) ); } else // sinon cela veut dire que l'on est en dim 3 { Coordonnee3B g1vecg2(Util::ProdVec_coorB((*giB_t)(1),(*giB_t)(2))); for ( int indice = 1; indice <= nbddl; indice ++) { Coordonnee3B D_g1vecg2(Util::ProdVec_coorB((*d_giB_t)(indice)(1),(*giB_t)(2)) + Util::ProdVec_coorB((*giB_t)(1),(*d_giB_t)(indice)(2))); d_jacobien_t(indice) = 0.5 * (D_g1vecg2.ScalBB(g1vecg2)+ g1vecg2.ScalBB(D_g1vecg2)) / jacobien_t; }; } } break; case 3 : for ( int indice = 1; indice <= nbddl; indice ++) d_jacobien_t(indice) = ( Util::DeterminantB((*d_giB_t)(indice)(1),(*giB_t)(2),(*giB_t)(3)) + Util::DeterminantB((*giB_t)(1),(*d_giB_t)(indice)(2),(*giB_t)(3)) + Util::DeterminantB((*giB_t)(1),(*giB_t)(2),(*d_giB_t)(indice)(3)) ); break; default : cout << "\n taille incorecte,Met_abstraite::Djacobien_t() \n"; Sortie(1); } }; void Met_abstraite::Djacobien_tdt() { int nbddl = d_giB_tdt->Taille(); switch (nbvec_base) {case 1 : {cout << "\n **** erreur le calcul de la variation du jacobien n'est pas définit " << " dans le cas d'une métrique à un vecteur " << "\n Met_abstraite::Djacobien_tdt()"; Sortie(1); break; } case 2 : // pour 2 vecteurs le jacobien est calculé // soit comme la norme du produit vectoriel de deux vecteurs en dim 3 // soit comme le produit en croix des composantes des deux vecteurs en dim 2 // il faut donc calculer la dérivée en conséquence { if (ParaGlob::Dimension() == 2) { for ( int indice = 1; indice <= nbddl; indice ++) d_jacobien_tdt(indice) = ( Util::DeterminantB((*d_giB_tdt)(indice)(1),(*giB_tdt)(2)) + Util::DeterminantB((*giB_tdt)(1),(*d_giB_tdt)(indice)(2)) ); } else // sinon cela veut dire que l'on est en dim 3 { Coordonnee3B g1vecg2(Util::ProdVec_coorB((*giB_tdt)(1),(*giB_tdt)(2))); for ( int indice = 1; indice <= nbddl; indice ++) { Coordonnee3B D_g1vecg2(Util::ProdVec_coorB((*d_giB_tdt)(indice)(1),(*giB_tdt)(2)) + Util::ProdVec_coorB((*giB_tdt)(1),(*d_giB_tdt)(indice)(2))); d_jacobien_tdt(indice) = 0.5 * (D_g1vecg2.ScalBB(g1vecg2)+ g1vecg2.ScalBB(D_g1vecg2)) / jacobien_tdt; }; }; break; } case 3 : { for ( int indice = 1; indice <= nbddl; indice ++) d_jacobien_tdt(indice) = ( Util::DeterminantB((*d_giB_tdt)(indice)(1),(*giB_tdt)(2),(*giB_tdt)(3)) + Util::DeterminantB((*giB_tdt)(1),(*d_giB_tdt)(indice)(2),(*giB_tdt)(3)) + Util::DeterminantB((*giB_tdt)(1),(*giB_tdt)(2),(*d_giB_tdt)(indice)(3)) ); break; } default : cout << "\n taille incorecte,Met_abstraite::Djacobien_t() \n"; Sortie(1); }; }; //== calcul de la variation du gradient instantannée // par rapport aux composantes de la vitesse (et non les X^ar) void Met_abstraite::DgradVBB_t(const Mat_pleine& dphi) { int indice; // derivees par rapport a VHbr for (int b = 1; b<= dim_base; b++) for (int r = 1; r <= nomb_noeud; r++) { indice = (r-1)*dim_base + b; TenseurBB & d_gradVBB_t_indice = (*(d_gradVBB_t(indice))); for (int j =1;j<=nbvec_base;j++) for (int i =1;i<=nbvec_base;i++) // grad(i,j) = Vi|j = gj_point * gi d_gradVBB_t_indice.Coor(i,j) = dphi(j,r) * (*giB_t)(i)(b); } }; //== calcul de la variation du gradient void Met_abstraite::DgradVBB_tdt(const Mat_pleine& dphi) // par rapport aux composantes de la vitesse (et non les X^ar) { int indice; // derivees par rapport a VHbr for (int b = 1; b<= dim_base; b++) for (int r = 1; r <= nomb_noeud; r++) { indice = (r-1)*dim_base + b; TenseurBB & d_gradVBB_tdt_indice = (*(d_gradVBB_tdt(indice))); for (int j =1;j<=nbvec_base;j++) for (int i =1;i<=nbvec_base;i++) // grad(i,j) = Vi|j = gj_point * gi d_gradVBB_tdt_indice.Coor(i,j) = dphi(j,r) * (*giB_tdt)(i)(b); } }; // calcul de la variation du gradient moyen à t // par rapport ici aux composantes X^ar (et non les V^ar ) void Met_abstraite::DgradVmoyBB_t(const Mat_pleine& dphi,const Tableau& tab_noeud) { // récup de delta t const VariablesTemps& vartemps = ParaGlob::Variables_de_temps(); // dans le cas où l'incrément de temps est nul la vitesse est nulle double deltat=vartemps.IncreTempsCourant();double unsurdeltat; double temps =vartemps.TempsCourant(); // on regarde le premier noeud pour savoir s'il y a des coordonnées à t+dt if (tab_noeud(1)->ExisteCoord2()) {// dans ce cas on utilise l'incrément de temps if (deltat >= ConstMath::trespetit) {unsurdeltat = 1./deltat;} else {unsurdeltat = 0.;} // o car on veut une vitesse nulle } else // sinon on utilise la variation totale de 0 à t, le delta t vaudra le temps actuel { if (temps >= ConstMath::trespetit) {unsurdeltat = 1./temps;} else {unsurdeltat = 0.;} // o car on veut une vitesse nulle } int indice; // derivees par rapport a XHbr for (int b = 1; b<= dim_base; b++) for (int r = 1; r <= nomb_noeud; r++) { indice = (r-1)*dim_base + b; TenseurBB & d_gradVmoyBB_t_indice = (*(d_gradVmoyBB_t(indice))); BaseB & d_giB_t_indice=(*d_giB_t)(indice); for (int j =1;j<=nbvec_base;j++) for (int i =1;i<=nbvec_base;i++) // grad(i,j) = Vi|j = gj_point * gi d_gradVmoyBB_t_indice.Coor(i,j) = dphi(j,r) *( unsurdeltat * (*giB_t)(i)(b) + (*dmatV_moy_t)(j).ScalBB(d_giB_t_indice(i)) ); } }; // calcul de la variation du gradient à t dt // par rapport ici aux composantes X^ar (et non les V^ar ) void Met_abstraite::DgradVmoyBB_tdt(const Mat_pleine& dphi) { // récup de delta t const VariablesTemps& vartemps = ParaGlob::Variables_de_temps(); // dans le cas où l'incrément de temps est nul la vitesse est nulle double deltat=vartemps.IncreTempsCourant(); double unsurdeltat; if (deltat >= ConstMath::trespetit) {unsurdeltat = 1./deltat;} else {unsurdeltat = 0.;} // o car on veut une vitesse nulle int indice; // derivees par rapport a XHbr for (int b = 1; b<= dim_base; b++) for (int r = 1; r <= nomb_noeud; r++) { indice = (r-1)*dim_base + b; TenseurBB & d_gradVmoyBB_tdt_indice = (*(d_gradVmoyBB_tdt(indice))); BaseB & d_giB_tdt_indice=(*d_giB_tdt)(indice); for (int j =1;j<=nbvec_base;j++) for (int i =1;i<=nbvec_base;i++) // grad(i,j) = Vi|j = gj_point * gi d_gradVmoyBB_tdt_indice.Coor(i,j) = dphi(j,r) *( unsurdeltat * (*giB_tdt)(i)(b) + (*dmatV_moy_tdt)(j).ScalBB(d_giB_tdt_indice(i)) ); } }; // ---------------- calcul de données interpolées aux même points d'integ que la mécanique -------- // et utilisées par la mécanique (ex: température, taux de cristalinité, vecteur, etc..) double Met_abstraite::DonneeInterpoleeScalaire (const Tableau& tab_noeud,const Vecteur& phi,int nombre_noeud ,Enum_ddl enu,Enum_dure temps) const { double resultat=0.; #ifdef MISE_AU_POINT if (!(tab_noeud(1)->Existe_ici(enu))) {cout << "\n\n *** erreur, la grandeur " << Nom_ddl(enu) << " n'existe pas aux noeuds on ne peut pas l'interpoler "; Sortie(1); }; #endif switch (temps) { case TEMPS_0: { for (int r=1;r<=nombre_noeud;r++) resultat += tab_noeud(r)->Valeur_0(enu) * phi(r); break; } case TEMPS_t: { for (int r=1;r<=nombre_noeud;r++) resultat += tab_noeud(r)->Valeur_t(enu) * phi(r); break; } case TEMPS_tdt: { for (int r=1;r<=nombre_noeud;r++) resultat += tab_noeud(r)->Valeur_tdt(enu) * phi(r); break; } }; return resultat; }; // --------- calcul de la variation d'une donnée interpolée par rapport aux ddl de la donnée ------ // aux même points d'integ que la mécanique -------- // et utilisées par la mécanique (ex: température, taux de cristalinité, vitesse, etc..) // en sortie : d_A Tableau & Met_abstraite::DerDonneeInterpoleeScalaire (Tableau & d_A, const Tableau& ,const Vecteur& phi ,int nombre_noeud,Enum_ddl enu) const { d_A.Change_taille(nombre_noeud); for (int r=1;r<=nombre_noeud;r++) d_A(r) = phi(r); return d_A; }; // ---------------- calcul du gradient d'une donnée interpolée aux même points d'integ que la mécanique -------- // et utilisées par la mécanique (ex: température, taux de cristalinité, vitesse, etc..) // en sortie : gradB CoordonneeB& Met_abstraite::GradDonneeInterpoleeScalaire (CoordonneeB& gradA_B,const Tableau& tab_noeud,const Mat_pleine& dphi ,int nombre_noeud,Enum_ddl enu,Enum_dure temps) const { //gradA_B_i = A^{r} \phi_{r,i} gradA_B.Zero(); switch (temps) { case TEMPS_0: { for (int i=1;i<= nbvec_base;i++) { double & gradA_B_i = gradA_B(i); gradA_B_i = 0.; for (int r=1;r<=nombre_noeud;r++) gradA_B_i += tab_noeud(r)->Valeur_0(enu) * dphi(i,r); }; break; } case TEMPS_t: { for (int i=1;i<= nbvec_base;i++) { double & gradA_B_i = gradA_B(i); gradA_B_i = 0.; for (int r=1;r<=nombre_noeud;r++) gradA_B_i += tab_noeud(r)->Valeur_t(enu) * dphi(i,r); }; break; } case TEMPS_tdt: { for (int i=1;i<= nbvec_base;i++) { double & gradA_B_i = gradA_B(i); gradA_B_i = 0.; for (int r=1;r<=nombre_noeud;r++) gradA_B_i += tab_noeud(r)->Valeur_tdt(enu) * dphi(i,r); }; break; } }; // retour du gradient return gradA_B; }; // --------- calcul de la variation du gradient d'une donnée interpolée par rapport aux ddl de la donnée ------ // aux même points d'integ que la mécanique -------- // et utilisées par la mécanique (ex: température, taux de cristalinité, vitesse, etc..) // en sortie : d_gradB Tableau & Met_abstraite::DerGradDonneeInterpoleeScalaire (Tableau & d_gradB,const Tableau& ,const Vecteur& ,const Mat_pleine& dphi,int nombre_noeud,Enum_ddl ) const {// ici dans la version de base, il s'agit uniquement d'un transfert de dphi dans d_gradB // par contre pour une interpolation plus sophistiquée, ça pourrait -être très différent // d'où l'intérêt d'avoir une différenciation entre la variation et dphi //gradA_B_i = A^{r} \phi_{r,i} d_gradB.Change_taille(nombre_noeud); for (int i=1;i<= nbvec_base;i++) { for (int r=1;r<=nombre_noeud;r++) d_gradB(r)(i) = dphi(i,r); }; // retour du gradient return d_gradB; }; // --------- calcul de la variation seconde du gradient d'une donnée interpolée par rapport aux ddl de la donnée ------ // aux même points d'integ que la mécanique -------- // et utilisées par la mécanique (ex: température, taux de cristalinité, vitesse, etc..) // en sortie : d2_gradB // si d2_gradB est NULL cela signifie qu'il ne faut pas considérer cette grandeur Tableau2 * Met_abstraite::Der2GradDonneeInterpoleeScalaire (Tableau2 * d2_gradB,const Tableau& tab_noeud ,const Vecteur& phi,const Mat_pleine& dphi,int nombre_noeud,Enum_ddl enu) const { // par défaut avec une interpolation simple la dérivée seconde est nulle return NULL; }; // calcul de la vitesse du point a t0 en fonction des ddl existants de vitesse void Met_abstraite::Calcul_V0 ( const Tableau& tab_noeud,const Vecteur& phi, int nombre_noeud) { #ifdef MISE_AU_POINT if (V0 == NULL) { cout << "\nErreur : la vitesse au point a t=0 n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_V0 \n"; Sortie(1); }; #endif int amax = V0->Dimension(); V0->Zero(); for (int r=1;r<=nombre_noeud;r++) {switch (amax) {case 3: (*(V0))(3) += tab_noeud(r)->Valeur_0(V3) * phi(r) ; case 2: (*(V0))(2) += tab_noeud(r)->Valeur_0(V2) * phi(r) ; case 1: (*(V0))(1) += tab_noeud(r)->Valeur_0(V1) * phi(r) ; }; }; }; // idem mais au noeud passé en paramètre void Met_abstraite::Calcul_V0 (const Noeud* noeud) { #ifdef MISE_AU_POINT if (V0 == NULL) { cout << "\nErreur : la vitesse au point a t=0 n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_V0(const Noeud* \n"; Sortie(1); }; #endif int amax = V0->Dimension(); V0->Zero(); switch (amax) {case 3: (*(V0))(3) += noeud->Valeur_0(V3) ; case 2: (*(V0))(2) += noeud->Valeur_0(V2) ; case 1: (*(V0))(1) += noeud->Valeur_0(V1) ; }; }; // calcul de la vitesse du point a t en fonction des ddl existants de vitesse void Met_abstraite::Calcul_Vt (const Tableau& tab_noeud, const Vecteur& phi, int nombre_noeud) { #ifdef MISE_AU_POINT if (Vt == NULL) { cout << "\nErreur : la vitesse au point a t n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_Vt \n"; Sortie(1); }; #endif int amax = Vt->Dimension(); Vt->Zero(); for (int r=1;r<=nombre_noeud;r++) {switch (amax) {case 3: (*(Vt))(3) += tab_noeud(r)->Valeur_t(V3) * phi(r) ; case 2: (*(Vt))(2) += tab_noeud(r)->Valeur_t(V2) * phi(r) ; case 1: (*(Vt))(1) += tab_noeud(r)->Valeur_t(V1) * phi(r) ; }; }; }; // idem mais au noeud passé en paramètre void Met_abstraite::Calcul_Vt (const Noeud* noeud) { #ifdef MISE_AU_POINT if (Vt == NULL) { cout << "\nErreur : la vitesse au point a t n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_Vt(const Noeud* \n"; Sortie(1); }; #endif int amax = Vt->Dimension(); Vt->Zero(); switch (amax) {case 3: (*(Vt))(3) += noeud->Valeur_t(V3) ; case 2: (*(Vt))(2) += noeud->Valeur_t(V2) ; case 1: (*(Vt))(1) += noeud->Valeur_t(V1) ; }; }; // calcul des variations de la vitesse du point a t en fonction des ddl existants de vitesse void Met_abstraite::Calcul_d_Vt (const Tableau& , const Vecteur& phi, int nombre_noeud) { #ifdef MISE_AU_POINT if (d_Vt == NULL) { cout << "\nErreur : la variation de vitesse au point a t n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_d_Vt \n"; Sortie(1); }; #endif int indice; for (int b = 1; b<= dim_base; b++) {for (int r = 1; r <= nombre_noeud; r++) { indice = (r-1)*dim_base + b; Coordonnee & d_Vt_indice=(*d_Vt)(indice); d_Vt_indice.Zero(); d_Vt_indice(b)=phi(r); }; }; }; // idem mais au noeud passé en paramètre void Met_abstraite::Calcul_d_Vt (const Noeud* ) { #ifdef MISE_AU_POINT if (d_Vt == NULL) { cout << "\nErreur : la variation de vitesse au point a t n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_d_Vt(const Noeud* \n"; Sortie(1); }; #endif for (int b = 1; b<= dim_base; b++) { Coordonnee & d_Vt_indice=(*d_Vt)(b); d_Vt_indice.Zero(); d_Vt_indice(b)=1; }; }; // calcul de la vitesse du point a tdt en fonction des ddl existants de vitesse void Met_abstraite::Calcul_Vtdt (const Tableau& tab_noeud,const Vecteur& phi, int nombre_noeud) { #ifdef MISE_AU_POINT if (Vtdt == NULL) { cout << "\nErreur : la vitesse au point a t+dt n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_Vtdt \n"; Sortie(1); }; #endif int amax = Vtdt->Dimension(); Vtdt->Zero(); for (int r=1;r<=nombre_noeud;r++) {switch (amax) {case 3: (*(Vtdt))(3) += tab_noeud(r)->Valeur_tdt(V3) * phi(r) ; case 2: (*(Vtdt))(2) += tab_noeud(r)->Valeur_tdt(V2) * phi(r) ; case 1: (*(Vtdt))(1) += tab_noeud(r)->Valeur_tdt(V1) * phi(r) ; }; }; }; // idem mais au noeud passé en paramètre void Met_abstraite::Calcul_Vtdt (const Noeud* noeud) { #ifdef MISE_AU_POINT if (Vtdt == NULL) { cout << "\nErreur : la vitesse au point a tdt n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_Vtdt(const Noeud* \n"; Sortie(1); }; #endif int amax = Vtdt->Dimension(); Vtdt->Zero(); switch (amax) {case 3: (*(Vtdt))(3) += noeud->Valeur_tdt(V3) ; case 2: (*(Vtdt))(2) += noeud->Valeur_tdt(V2) ; case 1: (*(Vtdt))(1) += noeud->Valeur_tdt(V1) ; }; }; // calcul des variations de la vitesse du point a tdt en fonction des ddl existants de vitesse void Met_abstraite::Calcul_d_Vtdt (const Tableau& , const Vecteur& phi, int nombre_noeud) { #ifdef MISE_AU_POINT if (d_Vtdt == NULL) { cout << "\nErreur : la variation de vitesse au point a t n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_d_Vtdt \n"; Sortie(1); }; #endif int indice; for (int b = 1; b<= dim_base; b++) {for (int r = 1; r <= nombre_noeud; r++) { indice = (r-1)*dim_base + b; Coordonnee & d_Vtdt_indice=(*d_Vtdt)(indice); d_Vtdt_indice.Zero(); d_Vtdt_indice(b)=phi(r); }; }; }; // idem mais au noeud passé en paramètre void Met_abstraite::Calcul_d_Vtdt (const Noeud* ) { #ifdef MISE_AU_POINT if (d_Vtdt == NULL) { cout << "\nErreur : la variation de vitesse au point a tdt n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_d_Vtdt(const Noeud* \n"; Sortie(1); }; #endif for (int b = 1; b<= dim_base; b++) { Coordonnee & d_Vtdt_indice=(*d_Vtdt)(b); d_Vtdt_indice.Zero(); d_Vtdt_indice(b)=1; }; }; // calcul de la vitesse moyenne du point a t0 en fonction des ddl de position void Met_abstraite::Calcul_V_moy0 ( const Tableau& ,const Vecteur& , int ) { #ifdef MISE_AU_POINT if (V0 == NULL) { cout << "\nErreur : la vitesse au point a t=0 n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_V_moy0 \n"; Sortie(1); }; #endif // a priori lorsque l'on calcul la vitesse moyenne initiale, on n'a pas d'élément pour la déterminer // on la fige donc à 0 V0->Zero(); }; // idem mais au noeud passé en paramètre void Met_abstraite::Calcul_V_moy0 (const Noeud* ) { #ifdef MISE_AU_POINT if (V0 == NULL) { cout << "\nErreur : la vitesse au point a t=0 n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_V_moy0(const Noeud* \n"; Sortie(1); }; #endif // a priori lorsque l'on calcul la vitesse moyenne initiale, on n'a pas d'élément pour la déterminer // on la fige donc à 0 V0->Zero(); }; // calcul de la vitesse moyenne du point a t en fonction des ddl de position void Met_abstraite::Calcul_V_moyt (const Tableau& tab_noeud, const Vecteur& phi, int nombre_noeud) { #ifdef MISE_AU_POINT if (Vt == NULL) { cout << "\nErreur : la vitesse au point a t n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_V_moyt \n"; Sortie(1); }; #endif // la vitesse est calculée selon (M(t)-M(0)) / t // dans le cas où le temps est nul on pose que la vitesse est nulle et non infinie ! double temps = ParaGlob::Variables_de_temps().TempsCourant(); double unsurt; if (temps >= ConstMath::trespetit) {unsurt = 1./temps;} else {unsurt = 0.;} // o car on veut une vitesse nulle Vt->Zero(); for (int r=1;r<=nombre_noeud;r++) { (*Vt) += (tab_noeud(r)->Coord1() - tab_noeud(r)->Coord0()) * (unsurt * phi(r));} ; }; // idem mais au noeud passé en paramètre void Met_abstraite::Calcul_V_moyt (const Noeud* noeud) { #ifdef MISE_AU_POINT if (Vt == NULL) { cout << "\nErreur : la vitesse au point a t n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_V_moyt(const Noeud* \n"; Sortie(1); }; #endif // la vitesse est calculée selon (M(t)-M(0)) / t // dans le cas où le temps est nul on pose que la vitesse est nulle et non infinie ! double temps = ParaGlob::Variables_de_temps().TempsCourant(); double unsurt; if (temps >= ConstMath::trespetit) {unsurt = 1./temps;} else {unsurt = 0.;} // o car on veut une vitesse nulle Vt->Zero(); (*Vt) += (noeud->Coord1() - noeud->Coord0()) * unsurt; }; // calcul des variations de la vitesse moyenne du point a t en fonction des ddl de position void Met_abstraite::Calcul_d_V_moyt (const Tableau& , const Vecteur& phi, int nombre_noeud) { #ifdef MISE_AU_POINT if (d_Vt == NULL) { cout << "\nErreur : la variation de vitesse moyenne au point a t n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_d_V_moyt \n"; Sortie(1); }; #endif // la vitesse est calculée selon (M(t)-M(0)) / t, ici on se réfère par rapport au ddl de M(t) // dans le cas où le temps est nul on pose que la vitesse est nulle et non infinie ! double temps = ParaGlob::Variables_de_temps().TempsCourant(); double unsurt; if (temps >= ConstMath::trespetit) {unsurt = 1./temps;} else {unsurt = 0.;} // o car on veut une vitesse nulle int indice; for (int b = 1; b<= dim_base; b++) {for (int r = 1; r <= nombre_noeud; r++) { indice = (r-1)*dim_base + b; Coordonnee & d_Vt_indice=(*d_Vt)(indice); d_Vt_indice.Zero(); d_Vt_indice(b)=unsurt * phi(r); }; }; }; // idem mais au noeud passé en paramètre void Met_abstraite::Calcul_d_V_moyt(const Noeud* ) { #ifdef MISE_AU_POINT if (d_Vt == NULL) { cout << "\nErreur : la variation de vitesse moyenne au point a t n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_d_V_moyt(const Noeud* \n"; Sortie(1); }; #endif // la vitesse est calculée selon (M(t)-M(0)) / t, ici on se réfère par rapport au ddl de M(t) // dans le cas où le temps est nul on pose que la vitesse est nulle et non infinie ! double temps = ParaGlob::Variables_de_temps().TempsCourant(); double unsurt; if (temps >= ConstMath::trespetit) {unsurt = 1./temps;} else {unsurt = 0.;} // o car on veut une vitesse nulle for (int b = 1; b<= dim_base; b++) {Coordonnee & d_Vt_indice=(*d_Vt)(b); d_Vt_indice.Zero(); d_Vt_indice(b)=unsurt; }; }; // calcul de la vitesse moyenne du point a tdt en fonction des ddl de position void Met_abstraite::Calcul_V_moytdt (const Tableau& tab_noeud,const Vecteur& phi, int nombre_noeud) { #ifdef MISE_AU_POINT if (Vtdt == NULL) { cout << "\nErreur : la vitesse au point a t+dt n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_V_moytdt \n"; Sortie(1); }; #endif // la vitesse est calculée selon (M(tdt)-M(t)) / deltat // dans le cas où l'incrément de temps est nul on pose que la vitesse est nulle et non infinie ! double deltat=ParaGlob::Variables_de_temps().IncreTempsCourant();double unsurdeltat; if (deltat >= ConstMath::trespetit) {unsurdeltat = 1./deltat;} else {unsurdeltat = 0.;} // o car on veut une vitesse nulle Vtdt->Zero(); for (int r=1;r<=nombre_noeud;r++) { (*Vtdt) += (tab_noeud(r)->Coord2() - tab_noeud(r)->Coord1()) * (unsurdeltat * phi(r));} ; }; // idem mais au noeud passé en paramètre void Met_abstraite::Calcul_V_moytdt(const Noeud* noeud) { #ifdef MISE_AU_POINT if (Vtdt == NULL) { cout << "\nErreur : la vitesse au point a t+dt n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_V_moytdt(const Noeud* \n"; Sortie(1); }; #endif // la vitesse est calculée selon (M(tdt)-M(t)) / deltat // dans le cas où l'incrément de temps est nul on pose que la vitesse est nulle et non infinie ! double deltat=ParaGlob::Variables_de_temps().IncreTempsCourant();double unsurdeltat; if (deltat >= ConstMath::trespetit) {unsurdeltat = 1./deltat;} else {unsurdeltat = 0.;} // o car on veut une vitesse nulle Vtdt->Zero(); (*Vtdt) += (noeud->Coord2() - noeud->Coord1()) * unsurdeltat ; }; // calcul des variations de la vitesse moyenne du point a tdt en fonction des ddl de position void Met_abstraite::Calcul_d_V_moytdt (const Tableau& , const Vecteur& phi, int nombre_noeud) { #ifdef MISE_AU_POINT if (d_Vtdt == NULL) { cout << "\nErreur : la variation de vitesse moyenne au point a t n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_d_V_moytdt \n"; Sortie(1); }; #endif // la vitesse est calculée selon (M(tdt)-M(t)) / deltat, les ddl sont ceux de M(tdt) // dans le cas où l'incrément de temps est nul on pose que la vitesse est nulle et non infinie ! double deltat=ParaGlob::Variables_de_temps().IncreTempsCourant();double unsurdeltat; if (deltat >= ConstMath::trespetit) {unsurdeltat = 1./deltat;} else {unsurdeltat = 0.;} // o car on veut une vitesse nulle int indice; for (int b = 1; b<= dim_base; b++) {for (int r = 1; r <= nombre_noeud; r++) { indice = (r-1)*dim_base + b; Coordonnee & d_Vtdt_indice=(*d_Vtdt)(indice); d_Vtdt_indice.Zero(); d_Vtdt_indice(b)=phi(r) * unsurdeltat; }; }; }; // idem mais au noeud passé en paramètre void Met_abstraite::Calcul_d_V_moytdt(const Noeud* ) { #ifdef MISE_AU_POINT if (d_Vtdt == NULL) { cout << "\nErreur : la variation de vitesse moyenne au point a t n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_d_V_moytdt(const Noeud* \n"; Sortie(1); }; #endif // la vitesse est calculée selon (M(tdt)-M(t)) / deltat, les ddl sont ceux de M(tdt) // dans le cas où l'incrément de temps est nul on pose que la vitesse est nulle et non infinie ! double deltat=ParaGlob::Variables_de_temps().IncreTempsCourant();double unsurdeltat; if (deltat >= ConstMath::trespetit) {unsurdeltat = 1./deltat;} else {unsurdeltat = 0.;} // o car on veut une vitesse nulle for (int b = 1; b<= dim_base; b++) { Coordonnee & d_Vtdt_indice=(*d_Vtdt)(b); d_Vtdt_indice.Zero(); d_Vtdt_indice(b)= unsurdeltat; }; }; //--- cas des accélérations // calcul de l'accélération du point a t0 en fonction des ddl existants d'accélération void Met_abstraite::Calcul_gamma0 ( const Tableau& tab_noeud,const Vecteur& phi, int nombre_noeud) { #ifdef MISE_AU_POINT if (gamma0 == NULL) { cout << "\nErreur : l'acceleration au point a t=0 n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_gamma0 \n"; Sortie(1); }; if (!(tab_noeud(1)->Existe_ici(GAMMA1))) {cout << "\n *** erreur l'acceleration nest pas definie aux noeuds !! " << "\n Met_abstraite::Calcul_gamma0(..)"; Sortie(1); }; #endif int amax = gamma0->Dimension(); gamma0->Zero(); for (int r=1;r<=nombre_noeud;r++) {switch (amax) {case 3: (*(gamma0))(3) += tab_noeud(r)->Valeur_0(GAMMA3) * phi(r) ; case 2: (*(gamma0))(2) += tab_noeud(r)->Valeur_0(GAMMA2) * phi(r) ; case 1: (*(gamma0))(1) += tab_noeud(r)->Valeur_0(GAMMA1) * phi(r) ; }; }; }; // idem mais au noeud passé en paramètre void Met_abstraite::Calcul_gamma0 (const Noeud* noeud) { #ifdef MISE_AU_POINT if (gamma0 == NULL) { cout << "\nErreur : l'acceleration au point a t=0 n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_gamma0(const Noeud* )\n"; Sortie(1); }; if (!(noeud->Existe_ici(GAMMA1))) {cout << "\n *** erreur l'acceleration nest pas definie aux noeuds !! " << "\n Met_abstraite::Calcul_gamma0(..)"; Sortie(1); }; #endif int amax = gamma0->Dimension(); gamma0->Zero(); switch (amax) {case 3: (*(gamma0))(3) += noeud->Valeur_0(GAMMA3) ; case 2: (*(gamma0))(2) += noeud->Valeur_0(GAMMA2) ; case 1: (*(gamma0))(1) += noeud->Valeur_0(GAMMA1) ; }; }; // idem a t void Met_abstraite::Calcul_gammat ( const Tableau& tab_noeud,const Vecteur& phi, int nombre_noeud) { #ifdef MISE_AU_POINT if (gammat == NULL) { cout << "\nErreur : l'acceleration au point a t n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_gammat \n"; Sortie(1); }; if (!(tab_noeud(1)->Existe_ici(GAMMA1))) {cout << "\n *** erreur l'acceleration nest pas definie aux noeuds !! " << "\n Met_abstraite::Calcul_gammat(..)"; Sortie(1); }; #endif int amax = gammat->Dimension(); gammat->Zero(); for (int r=1;r<=nombre_noeud;r++) {switch (amax) {case 3: (*(gammat))(3) += tab_noeud(r)->Valeur_t(GAMMA3) * phi(r) ; case 2: (*(gammat))(2) += tab_noeud(r)->Valeur_t(GAMMA2) * phi(r) ; case 1: (*(gammat))(1) += tab_noeud(r)->Valeur_t(GAMMA1) * phi(r) ; }; }; }; // idem mais au noeud passé en paramètre void Met_abstraite::Calcul_gammat (const Noeud* noeud) { #ifdef MISE_AU_POINT if (gammat == NULL) { cout << "\nErreur : l'acceleration au point a t n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_gammat(const Noeud* )\n"; Sortie(1); }; if (!(noeud->Existe_ici(GAMMA1))) {cout << "\n *** erreur l'acceleration nest pas definie aux noeuds !! " << "\n Met_abstraite::Calcul_gamma0(..)"; Sortie(1); }; #endif int amax = gammat->Dimension(); gammat->Zero(); switch (amax) {case 3: (*(gammat))(3) += noeud->Valeur_t(GAMMA3) ; case 2: (*(gammat))(2) += noeud->Valeur_t(GAMMA2) ; case 1: (*(gammat))(1) += noeud->Valeur_t(GAMMA1) ; }; }; // idem à tdt void Met_abstraite::Calcul_gammatdt ( const Tableau& tab_noeud,const Vecteur& phi, int nombre_noeud) { #ifdef MISE_AU_POINT if (gammatdt == NULL) { cout << "\nErreur : l'acceleration au point a tdt n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_gammatdt \n"; Sortie(1); }; if (!(tab_noeud(1)->Existe_ici(GAMMA1))) {cout << "\n *** erreur l'acceleration nest pas definie aux noeuds !! " << "\n Met_abstraite::Calcul_gammatdt(..)"; Sortie(1); }; #endif int amax = gammatdt->Dimension(); gammatdt->Zero(); for (int r=1;r<=nombre_noeud;r++) {switch (amax) {case 3: (*(gammatdt))(3) += tab_noeud(r)->Valeur_tdt(GAMMA3) * phi(r) ; case 2: (*(gammatdt))(2) += tab_noeud(r)->Valeur_tdt(GAMMA2) * phi(r) ; case 1: (*(gammatdt))(1) += tab_noeud(r)->Valeur_tdt(GAMMA1) * phi(r) ; }; }; }; // idem mais au noeud passé en paramètre void Met_abstraite::Calcul_gammatdt (const Noeud* noeud) { #ifdef MISE_AU_POINT if (gammatdt == NULL) { cout << "\nErreur : l'acceleration au point a tdt n'est pas dimensionne !\n"; cout << "void Met_abstraite::Calcul_gammatdt(const Noeud* )\n"; Sortie(1); }; if (!(noeud->Existe_ici(GAMMA1))) {cout << "\n *** erreur l'acceleration nest pas definie aux noeuds !! " << "\n Met_abstraite::Calcul_gamma0(..)"; Sortie(1); }; #endif int amax = gammatdt->Dimension(); gammatdt->Zero(); switch (amax) {case 3: (*(gammatdt))(3) += noeud->Valeur_tdt(GAMMA3) ; case 2: (*(gammatdt))(2) += noeud->Valeur_tdt(GAMMA2) ; case 1: (*(gammatdt))(1) += noeud->Valeur_tdt(GAMMA1) ; }; };