Herezh_dev/Elements/Mecanique/Deformation_gene/Met_PiPoCo2.cc
Gérard Rio 9692dbd130 intégration du répertoire Mecanique:
- contient les éléments finis, métriques associées, déformations ...
intégration du réperoire Géométrie:
- contient les géométries 1D 2D et 3D, les frontières des éléments géométriques
2021-09-27 12:42:13 +02:00

703 lines
36 KiB
C++

// FICHIER : Met_PiPoCo2.cp
// CLASSE : Met_PiPoCo
// This file is part of the Herezh++ application.
//
// The finite element software Herezh++ is dedicated to the field
// of mechanics for large transformations of solid structures.
// It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600)
// INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) <https://www.irdl.fr/>.
//
// Herezh++ is distributed under GPL 3 license ou ultérieure.
//
// Copyright (C) 1997-2021 Université Bretagne Sud (France)
// AUTHOR : Gérard Rio
// E-MAIL : gerardrio56@free.fr
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License,
// or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
// For more information, please consult: <https://herezh.irdl.fr/>.
# include <iostream>
using namespace std; //introduces namespace std
#include <math.h>
#include <stdlib.h>
#include "Sortie.h"
#include "Util.h"
#include "MathUtil.h"
#include "Met_PiPoCo.h"
// il faut regarder et mettre à jour le calcul avec l'indicateur premier_calcul ********
// comme sur les métriques standards, pour l'instant rien n'est fait, ***********
// il faut calculer Calcul_giH_0(); // base duale **********************
// il faut également changer les fonctions d'interpolation: ici il y a un mixte dans les mêmes tableaux
// phi et dphi, il y a les interpolations suivant la surface et l'épaisseurs, alors que dans pp
// les fonctions sont séparées: donc il faut faire comme dans sfe, et changer le nom de la fonction
// d'appel !!
// dans le cas du premier passage, pour l'instant pas fait !!!!!!!!!!!!!!!!!!!!!!!!!!
// =========================================================================================
// vu la taille des executables le fichier est decompose en trois
// le premier : Met_PiPoCo1.cp concerne les constructeurs, destructeur et
// la gestion des variables
// le second : Met_PiPoCo2.cp concerne le calcul des grandeurs publics
// le troisieme : Met_PiPoCo3.cp concerne le calcul des grandeurs protegees
// =========================================================================================
// METHODES PUBLIQUES :
// ------------------------ calculs ----------------------------------------
// cas explicite à t, toutes les grandeurs sont a 0 ou t
// gradV_instantane : true : calcul du gradient de vitesse instantannée
// premier_calcul : true : cas d'un premier calcul -> toutes les grandeurs sont calculées
// false: uniquement les grandeurs à t sont calculées
const Met_abstraite::Expli& Met_PiPoCo::Cal_explicit_t
(const Tableau<Noeud *>& tab_noeud,bool gradV_instantane,
Tableau<Mat_pleine const *>& tabdphi,int nombre_noeud,Tableau<Vecteur const *>& tabphi
,bool premier_calcul)
{ // pour commodité on change de notation
Mat_pleine const & dphi1 = (*tabdphi(1)); Mat_pleine const & dphi2 = (*tabdphi(2));
Vecteur const & phi1 = (*tabphi(1)); Vecteur const & phi2 = (*tabphi(2));
// initialisation des variations par rapport aux ddl externes pour tous les termes
// relatif a la base ai
int nbddl_x = tab_ddl.NbDdl_famille(X1); // nombre de ddl en position
for (int i=1;i<=nbddl_x;i++)
for (int jve=1;jve<=nbvec_base;jve++)
{ (*d_giB_t)(i).CoordoB(jve).Zero();
(*d_giH_t)(i).CoordoH(jve).Zero();
}
// Base a t=0 : tout d'abord on calcul les elements relatifs a la facette (ou l'axe)
Met_abstraite::Calcul_giB_0(tab_noeud,dphi1,nombre_noeud,phi1); // calcul de la base a t=0
*aiB_0 = *giB_0; // sauvegarde
Met_abstraite::Calcul_gijBB_0 (); // metrique base naturelle
*aijBB_0 = *gijBB_0;
Met_abstraite::Calcul_gijHH_0 (); // composantes controvariantes
*aijHH_0 = *gijHH_0;
Met_abstraite::Calcul_giH_0();
*aiH_0 = *giH_0; // sauvegarde
// calcul de la coubure a 0
curb_0 = courbure_0(tab_noeud);
//la base a t0
Calcul_giB_0(tab_noeud,dphi1,nombre_noeud,phi2);
// Base a t=t :
Met_abstraite::Calcul_giB_t(tab_noeud,dphi1,nombre_noeud,phi1); // calcul de la base a t
*aiB_t = *giB_t; // sauvegarde
Met_abstraite::Calcul_gijBB_t (); // metrique base naturelle
*aijBB_t = *gijBB_t;
Met_abstraite::Calcul_gijHH_t (); *aijHH_t = *gijHH_t; // composantes contravariantes
Met_abstraite::Calcul_giH_t(); *aiH_t = *giH_t; // calcul et sauvegarde la base duale
// les termes de variation des ai
Met_abstraite::D_giB_t(dphi1,nombre_noeud,phi1); *d_aiB_t = *d_giB_t;
Met_abstraite::D_giH_t(); *d_aiH_t = *d_giH_t;
// calcul de la coubure et variation a t
Dcourbure_t (tab_noeud,curb_t,dcurb_t);
//la base a t
Calcul_giB_t(tab_noeud,dphi1,nombre_noeud,phi2);
// les termes relatif aux gi (et non a la facette)
Met_abstraite::Calcul_gijBB_0 (); // metrique base naturelle
Met_abstraite::Calcul_gijHH_0 (); // composantes controvariantes à 0
Met_abstraite::Jacobien_0(); // calcul du jacobien a 0
Met_abstraite::Calcul_gijBB_t (); // "
Met_abstraite::Calcul_gijHH_t (); // composantes controvariantes
Met_abstraite::Jacobien_t(); // calcul du jacobien a t
Met_abstraite::Calcul_giH_t (); // base duale
// les termes de variation des gi
D_giB_t(dphi1,nombre_noeud,phi2); // pour les gi
Met_abstraite::D_gijBB_t(); //variation de la metrique en BB
// ***mise en place du calcul des gradients instantannés ou moyens et des variations associés
// ***ainsi que l'utilisation du paramétre premier_calcul comme dans les méthodes de Met_abstraite
// ***mise en place du calcul des gradients instantannés ou moyens et des variations associés
// ***ainsi que l'utilisation du paramétre premier_calcul comme dans les méthodes de Met_abstraite
// ***mise en place du calcul des gradients instantannés ou moyens et des variations associés
// ***ainsi que l'utilisation du paramétre premier_calcul comme dans les méthodes de Met_abstraite
// retour des infos
// Expli ex(giB_0,giB_t,giH_t,gijBB_0,gijBB_t,gijHH_t,
// gradVBB_t,&d_gijBB_t,jacobien_t,jacobien_0);
// liberation des tenseurs intermediaires
LibereTenseur();
return ex_expli;
};
// calcul simplifie, a utiliser lorsque l'on se sert des grandeurs
// liers a la facette deja calculee, ainsi que la courbure
// cas explicite à t, toutes les grandeurs sont a 0 ou t
// gradV_instantane : true : calcul du gradient de vitesse instantannée
// premier_calcul : true : cas d'un premier calcul -> toutes les grandeurs sont calculées
// false: uniquement les grandeurs à t sont calculées
const Met_abstraite::Expli& Met_PiPoCo::Cal_explicit_simple_t(const Tableau<Noeud *>& tab_noeud,bool gradV_instantane,
Tableau<Mat_pleine const *>& tabdphi,int nombre_noeud,Tableau<Vecteur const *>& tabphi
,bool premier_calcul)
{ // pour commodité on change de notation
Mat_pleine const & dphi1 = (*tabdphi(1)); Mat_pleine const & dphi2 = (*tabdphi(2));
Vecteur const & phi1 = (*tabphi(1)); Vecteur const & phi2 = (*tabphi(2));
// initialisation des variations par rapport aux ddl externes pour tous les termes
// relatif a la base ai
int nbddl_x = tab_ddl.NbDdl_famille(X1); // nombre de ddl en position
for (int i=1;i<=nbddl_x;i++)
for (int jve=1;jve<=nbvec_base;jve++)
{ (*d_giB_t)(i).CoordoB(jve).Zero();
}
//la base a t0
Calcul_giB_0(tab_noeud,dphi1,nombre_noeud,phi2);
//la base a t
Calcul_giB_t(tab_noeud,dphi1,nombre_noeud,phi2);
// les termes relatif aux gi (et non a la facette)
Met_abstraite::Calcul_gijBB_0 (); // metrique base naturelle
Met_abstraite::Calcul_gijHH_0 (); // composantes controvariantes à 0
Met_abstraite::Jacobien_0(); // calcul du jacobien a 0
Met_abstraite::Calcul_gijBB_t (); // "
Met_abstraite::Calcul_gijHH_t (); // composantes controvariantes
Met_abstraite::Jacobien_t(); // calcul du jacobien a t
Met_abstraite::Calcul_giH_t (); // base duale
// les termes de variation des ai puis des gi
Met_abstraite::D_giB_t(dphi1,nombre_noeud,phi1); *d_aiB_t = *d_giB_t;
D_giB_t(dphi1,nombre_noeud,phi2); // pour les gi
Met_abstraite::D_gijBB_t(); //variation de la metrique en BB
// ***mise en place du calcul des gradients instantannés ou moyens et des variations associés
// ***ainsi que l'utilisation du paramétre premier_calcul comme dans les méthodes de Met_abstraite
// ***mise en place du calcul des gradients instantannés ou moyens et des variations associés
// ***ainsi que l'utilisation du paramétre premier_calcul comme dans les méthodes de Met_abstraite
// ***mise en place du calcul des gradients instantannés ou moyens et des variations associés
// ***ainsi que l'utilisation du paramétre premier_calcul comme dans les méthodes de Met_abstraite
// retour des infos
// Expli ex(giB_0,giB_t,giH_t,gijBB_0,gijBB_t,gijHH_t,
// gradVBB_t,&d_gijBB_t,jacobien_t,jacobien_0);
LibereTenseur();
return ex_expli;
};
// cas explicite à tdt, toutes les grandeurs sont a 0 ou tdt
// gradV_instantane : true : calcul du gradient de vitesse instantannée
// premier_calcul : true : cas d'un premier calcul -> toutes les grandeurs sont calculées
// false: uniquement les grandeurs à t sont calculées
const Met_abstraite::Expli_t_tdt& Met_PiPoCo::Cal_explicit_tdt
(const Tableau<Noeud *>& tab_noeud,bool gradV_instantane,
Tableau<Mat_pleine const *>& tabdphi,int nombre_noeud
,Tableau<Vecteur const *>& tabphi,bool premier_calcul)
{ // pour commodité on change de notation
Mat_pleine const & dphi1 = (*tabdphi(1)); Mat_pleine const & dphi2 = (*tabdphi(2));
Vecteur const & phi1 = (*tabphi(1)); Vecteur const & phi2 = (*tabphi(2));
// initialisation des variations par rapport aux ddl externes pour tous les termes
// relatif a la base ai
int nbddl_x = tab_ddl.NbDdl_famille(X1); // nombre de ddl en position
for (int i=1;i<=nbddl_x;i++)
for (int jve=1;jve<=nbvec_base;jve++)
{ (*d_giB_tdt)(i).CoordoB(jve).Zero();
(*d_giH_tdt)(i).CoordoH(jve).Zero();
}
// Base a t=0 : tout d'abord on calcul les elements relatifs a la facette (ou l'axe)
Met_abstraite::Calcul_giB_0(tab_noeud,dphi1,nombre_noeud,phi1); // calcul de la base a t=0
*aiB_0 = *giB_0; // sauvegarde
Met_abstraite::Calcul_gijBB_0 (); // metrique base naturelle
*aijBB_0 = *gijBB_0;
Met_abstraite::Calcul_gijHH_0 (); // composantes controvariantes
*aijHH_0 = *gijHH_0;
Met_abstraite::Calcul_giH_0();
*aiH_0 = *giH_0; // sauvegarde
// calcul de la coubure a 0
curb_0 = courbure_0(tab_noeud);
//la base a t0
Calcul_giB_0(tab_noeud,dphi1,nombre_noeud,phi2);
// Base a t=t :
Met_abstraite::Calcul_giB_t(tab_noeud,dphi1,nombre_noeud,phi1); // calcul de la base a t
*aiB_t = *giB_t; // sauvegarde
Met_abstraite::Calcul_gijBB_t (); // metrique base naturelle
*aijBB_t = *gijBB_t;
Met_abstraite::Calcul_gijHH_t (); *aijHH_t = *gijHH_t; // composantes controvariantes
Met_abstraite::Calcul_giH_t(); *aiH_t = *giH_t; // calcul et sauvegarde la base duale
// calcul de la coubure a t
curb_t = courbure_t(tab_noeud);
//la base a t
Calcul_giB_t(tab_noeud,dphi1,nombre_noeud,phi2);
// Base a tdt :
Met_abstraite::Calcul_giB_tdt(tab_noeud,dphi1,nombre_noeud,phi1); // calcul de la base a tdt
*aiB_tdt = *giB_tdt; // sauvegarde
Met_abstraite::Calcul_gijBB_tdt (); // metrique base naturelle
*aijBB_tdt = *gijBB_tdt;
Met_abstraite::Calcul_gijHH_tdt (); *aijHH_tdt = *gijHH_tdt; // composantes controvariantes
Met_abstraite::Calcul_giH_tdt(); *aiH_tdt = *giH_tdt; // calcul et sauvegarde la base duale
// les termes de variation des ai
Met_abstraite::D_giB_tdt(dphi1,nombre_noeud,phi1); *d_aiB_tdt = *d_giB_tdt;
Met_abstraite::D_giH_tdt(); *d_aiH_tdt = *d_giH_tdt;
// calcul de la coubure et variation a tdt
Dcourbure_tdt (tab_noeud,curb_tdt,dcurb_tdt);
//la base a tdt
Calcul_giB_tdt(tab_noeud,dphi1,nombre_noeud,phi2);
// les termes relatif aux gi (et non a la facette)
Met_abstraite::Calcul_gijBB_0 (); // metrique base naturelle
Met_abstraite::Calcul_gijHH_0 (); // composantes controvariantes à 0
Met_abstraite::Jacobien_0(); // calcul du jacobien a 0
Met_abstraite::Jacobien_t(); // calcul du jacobien a t
Met_abstraite::Calcul_gijBB_t (); // métrique à t
Met_abstraite::Calcul_gijBB_tdt (); // "
Met_abstraite::Calcul_gijHH_tdt (); // composantes controvariantes
Met_abstraite::Jacobien_tdt(); // calcul du jacobien a tdt
Met_abstraite::Calcul_giH_tdt(); // base duale
// les termes de variation des gi
D_giB_tdt(dphi1,nombre_noeud,phi2); // pour les gi
Met_abstraite::D_gijBB_tdt(); //variation de la metrique en BB
// ***mise en place du calcul des gradients instantannés ou moyens et des variations associés
// ***ainsi que l'utilisation du paramétre premier_calcul comme dans les méthodes de Met_abstraite
// ***mise en place du calcul des gradients instantannés ou moyens et des variations associés
// ***ainsi que l'utilisation du paramétre premier_calcul comme dans les méthodes de Met_abstraite
// ***mise en place du calcul des gradients instantannés ou moyens et des variations associés
// ***ainsi que l'utilisation du paramétre premier_calcul comme dans les méthodes de Met_abstraite
// retour des infos
// Expli_t_tdt ex(giB_0,giB_t,giB_tdt,giH_tdt,gijBB_0,gijBB_t,gijBB_tdt,gijHH_tdt,
// gradVBB_tdt,&d_gijBB_tdt,jacobien_tdt,jacobien_0);
// liberation des tenseurs intermediaires
LibereTenseur();
return ex_expli_t_tdt;
};
// calcul simplifie, a utiliser lorsque l'on se sert des grandeurs
// liers a la facette deja calculee, ainsi que la courbure
// cas explicite à tdt, toutes les grandeurs sont a 0 ou tdt
// gradV_instantane : true : calcul du gradient de vitesse instantannée
// premier_calcul : true : cas d'un premier calcul -> toutes les grandeurs sont calculées
// false: uniquement les grandeurs à t sont calculées
const Met_abstraite::Expli_t_tdt& Met_PiPoCo::Cal_explicit_simple_tdt(const Tableau<Noeud *>& tab_noeud,bool gradV_instantane,
Tableau<Mat_pleine const *>& tabdphi,int nombre_noeud,Tableau<Vecteur const *>& tabphi
,bool premier_calcul)
{ // pour commodité on change de notation
Mat_pleine const & dphi1 = (*tabdphi(1)); Mat_pleine const & dphi2 = (*tabdphi(2));
Vecteur const & phi1 = (*tabphi(1)); Vecteur const & phi2 = (*tabphi(2));
// initialisation des variations par rapport aux ddl externes pour tous les termes
// relatif a la base ai
int nbddl_x = tab_ddl.NbDdl_famille(X1); // nombre de ddl en position
for (int i=1;i<=nbddl_x;i++)
for (int jve=1;jve<=nbvec_base;jve++)
{ (*d_giB_tdt)(i).CoordoB(jve).Zero();
}
//la base a t0
Calcul_giB_0(tab_noeud,dphi1,nombre_noeud,phi2);
//la base a t
Calcul_giB_t(tab_noeud,dphi1,nombre_noeud,phi2);
//la base a tdt
Calcul_giB_tdt(tab_noeud,dphi1,nombre_noeud,phi2);
// les termes relatif aux gi (et non a la facette)
Met_abstraite::Calcul_gijBB_0 (); // metrique base naturelle
Met_abstraite::Calcul_gijHH_0 (); // composantes controvariantes à 0
Met_abstraite::Jacobien_0(); // calcul du jacobien a 0
Met_abstraite::Jacobien_t(); // calcul du jacobien a t
Met_abstraite::Calcul_gijBB_t (); // métrique à t
Met_abstraite::Calcul_gijBB_tdt (); // " à tdt
Met_abstraite::Calcul_gijHH_tdt (); // composantes controvariantes
Met_abstraite::Jacobien_tdt(); // calcul du jacobien a tdt
Met_abstraite::Calcul_giH_tdt(); // base duale
// les termes de variation des ai puis des gi
Met_abstraite::D_giB_tdt(dphi1,nombre_noeud,phi1); *d_aiB_tdt = *d_giB_tdt;
D_giB_tdt(dphi1,nombre_noeud,phi2); // pour les gi
Met_abstraite::D_gijBB_tdt(); //variation de la metrique en BB
// ***mise en place du calcul des gradients instantannés ou moyens et des variations associés
// ***ainsi que l'utilisation du paramétre premier_calcul comme dans les méthodes de Met_abstraite
// ***mise en place du calcul des gradients instantannés ou moyens et des variations associés
// ***ainsi que l'utilisation du paramétre premier_calcul comme dans les méthodes de Met_abstraite
// ***mise en place du calcul des gradients instantannés ou moyens et des variations associés
// ***ainsi que l'utilisation du paramétre premier_calcul comme dans les méthodes de Met_abstraite
// retour des infos
// Expli_t_tdt ex(giB_0,giB_t,giB_tdt,giH_tdt,gijBB_0,gijBB_t,gijBB_tdt,gijHH_tdt,
// gradVBB_tdt,&d_gijBB_tdt,jacobien_tdt,jacobien_0);
LibereTenseur();
return ex_expli_t_tdt;
};
// cas implicite, toutes les grandeurs sont a 0 ou t+dt
// gradV_instantane : true : calcul du gradient de vitesse instantannée
// premier_calcul : true : cas d'un premier calcul -> toutes les grandeurs sont calculées
// false: uniquement les grandeurs à t sont calculées
const Met_abstraite::Impli& Met_PiPoCo::Cal_implicit
( const Tableau<Noeud *>& tab_noeud,bool gradV_instantane,
Tableau<Mat_pleine const *>& tabdphi,int nombre_noeud,
Tableau<Vecteur const *>& tabphi,
bool premier_calcul)
{// pour commodité on change de notation
Mat_pleine const & dphi1 = (*tabdphi(1)); Mat_pleine const & dphi2 = (*tabdphi(2));
Vecteur const & phi1 = (*tabphi(1)); Vecteur const & phi2 = (*tabphi(2));
// initialisation des variations par rapport aux ddl externes pour tous les termes
// relatif a la base ai
int nbddl_x = tab_ddl.NbDdl_famille(X1); // nombre de ddl en position
for (int i=1;i<=nbddl_x;i++)
for (int jve=1;jve<=nbvec_base;jve++)
{ (*d_giB_tdt)(i).CoordoB(jve).Zero();
(*d_giH_tdt)(i).CoordoH(jve).Zero();
}
// !!!!!!!il faut faire le calcul de la dérivée seconde de la métrique !!!!!!!!
// !!!!!!!il faut faire le calcul de la dérivée seconde de la métrique !!!!!!!!
// !!!!!!!il faut faire le calcul de la dérivée seconde de la métrique !!!!!!!!
// !!!!!!!il faut faire le calcul de la dérivée seconde de la métrique !!!!!!!!
// !!!!!!!il faut faire le calcul de la dérivée seconde de la métrique !!!!!!!!
// la prise en compte du paramètre pa (calcul de dérivée seconde et variation de jacobien ne sont pas fait !!!!!
// la prise en compte du paramètre pa (calcul de dérivée seconde et variation de jacobien ne sont pas fait !!!!!
// la prise en compte du paramètre pa (calcul de dérivée seconde et variation de jacobien ne sont pas fait !!!!!
// la prise en compte du paramètre pa (calcul de dérivée seconde et variation de jacobien ne sont pas fait !!!!!
// la prise en compte du paramètre pa (calcul de dérivée seconde et variation de jacobien ne sont pas fait !!!!!
// Base a t=0 : tout d'abord on calcul les elements relatifs a la facette plane
Met_abstraite::Calcul_giB_0(tab_noeud,dphi1,nombre_noeud,phi1); // calcul de la base a t=0
*aiB_0 = *giB_0; // sauvegarde
Met_abstraite::Calcul_gijBB_0 (); // metrique base naturelle
*aijBB_0 = *gijBB_0;
Met_abstraite::Calcul_gijHH_0 (); // composantes controvariantes
*aijHH_0 = *gijHH_0;
Met_abstraite::Calcul_giH_0();
*aiH_0 = *giH_0; // sauvegarde
// calcul de la coubure a 0
curb_0 = courbure_0(tab_noeud);
//la base a t0
Calcul_giB_0(tab_noeud,dphi1,nombre_noeud,phi2);
// Base a t=t :
Met_abstraite::Calcul_giB_t(tab_noeud,dphi1,nombre_noeud,phi1); // calcul de la base a t
*aiB_t = *giB_t; // sauvegarde
Met_abstraite::Calcul_gijBB_t (); // metrique base naturelle
*aijBB_t = *gijBB_t;
Met_abstraite::Calcul_gijHH_t (); *aijHH_t = *gijHH_t; // composantes controvariantes
Met_abstraite::Calcul_giH_t(); *aiH_t = *giH_t; // calcul et sauvegar de la base duale
// calcul de la coubure a t
curb_t = courbure_t(tab_noeud);
//la base a t
Calcul_giB_t(tab_noeud,dphi1,nombre_noeud,phi2);
// Base a t=t+dt :
Met_abstraite::Calcul_giB_tdt(tab_noeud,dphi1,nombre_noeud,phi1); // calcul de la base a t+dt
*aiB_tdt = *giB_tdt; // sauvegarde
Met_abstraite::Calcul_gijBB_tdt (); // metrique base naturelle
*aijBB_tdt = *gijBB_tdt;
Met_abstraite::Calcul_gijHH_tdt (); *aijHH_tdt = *gijHH_tdt; // composantes controvariantes
Met_abstraite::Calcul_giH_tdt(); *aiH_tdt = *giH_tdt; // calcul et sauvegarde la base duale
// les termes de variation des ai naturelles et duaux
Met_abstraite::D_giB_tdt(dphi1,nombre_noeud,phi1); *d_aiB_tdt = *d_giB_tdt;
Met_abstraite::D_giH_tdt(); *d_aiH_tdt = *d_giH_tdt;
// calcul de la coubure et variation a t+dt
Dcourbure_tdt (tab_noeud,curb_tdt,dcurb_tdt);
//la base a tdt
Calcul_giB_tdt(tab_noeud,dphi1,nombre_noeud,phi2);
// les termes relatif aux gi (et non a la facette)
Met_abstraite::Calcul_gijBB_0 (); // "
Met_abstraite::Calcul_gijHH_0 (); // composantes controvariantes à 0
Met_abstraite::Calcul_gijBB_t (); // "
Met_abstraite::Calcul_gijBB_tdt (); // "
Met_abstraite::Calcul_gijHH_tdt (); // composantes controvariantes
Met_abstraite::Jacobien_0(); // calcul du jacobien a 0
Met_abstraite::Jacobien_t(); // calcul du jacobien a t
Met_abstraite::Jacobien_tdt(); // calcul du jacobien a tdt
// les termes de variation des gi
D_giB_tdt(dphi1,nombre_noeud,phi2); // pour les gi
Met_abstraite::D_gijBB_tdt(); //variation de la metrique en BB
Met_abstraite::Calcul_giH_tdt(); // base duale
Met_abstraite::D_giH_tdt(); // variation de la base duale
Met_abstraite::D_gijHH_tdt(); //variation de la metrique en HH
Met_abstraite::Djacobien_tdt(); // variation du jacobien
// ***mise en place du calcul des gradients instantannés ou moyens et des variations associés
// ***ainsi que l'utilisation du paramétre premier_calcul comme dans les méthodes de Met_abstraite
// ***mise en place du calcul des gradients instantannés ou moyens et des variations associés
// ***ainsi que l'utilisation du paramétre premier_calcul comme dans les méthodes de Met_abstraite
// ***mise en place du calcul des gradients instantannés ou moyens et des variations associés
// ***ainsi que l'utilisation du paramétre premier_calcul comme dans les méthodes de Met_abstraite
// retour des infos
// Impli ex(giB_0,giB_t,giB_tdt,d_giB_tdt,giH_tdt,d_giH_tdt,gijBB_0,gijBB_t,gijBB_tdt,gijHH_tdt,
// gradVBB_tdt,&d_gijBB_tdt,&d2_gijBB_tdt,&d_gijHH_tdt,jacobien_tdt,jacobien_0,&d_jacobien_tdt);
// 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_0 = jacobien_0;
// ex.jacobien = jacobien_tdt; ex.d_jacobien_tdt = &d_jacobien_tdt;
// liberation des tenseurs intermediaires
LibereTenseur();
return ex_impli;
};
// calcul simplifie, a utiliser lorsque l'on se sert des grandeurs
// liers a la facette deja calculee, ainsi que la courbure et sa variation
// cas implicite, toutes les grandeurs sont a 0 ou t+dt
// gradV_instantane : true : calcul du gradient de vitesse instantannée
// premier_calcul : true : cas d'un premier calcul -> toutes les grandeurs sont calculées
// false: uniquement les grandeurs à t sont calculées
const Met_abstraite::Impli& Met_PiPoCo::Cal_implicit_simple(const Tableau<Noeud *>& tab_noeud,bool gradV_instantane,
Tableau<Mat_pleine const *>& tabdphi,int nombre_noeud,Tableau<Vecteur const *>& tabphi,
bool premier_calcul)
{// pour commodité on change de notation
Mat_pleine const & dphi1 = (*tabdphi(1)); Mat_pleine const & dphi2 = (*tabdphi(2));
Vecteur const & phi1 = (*tabphi(1)); Vecteur const & phi2 = (*tabphi(2));
// initialisation des variations par rapport aux ddl externes pour tous les termes
// relatif a la base ai
int nbddl_x = tab_ddl.NbDdl_famille(X1); // nombre de ddl en position
for (int i=1;i<=nbddl_x;i++)
for (int jve=1;jve<=nbvec_base;jve++)
{ (*d_giB_tdt)(i).CoordoB(jve).Zero();
(*d_giH_tdt)(i).CoordoH(jve).Zero();
}
// !!!!!!!il faut faire le calcul de la dérivée seconde de la métrique !!!!!!!!
// !!!!!!!il faut faire le calcul de la dérivée seconde de la métrique !!!!!!!!
// !!!!!!!il faut faire le calcul de la dérivée seconde de la métrique !!!!!!!!
// !!!!!!!il faut faire le calcul de la dérivée seconde de la métrique !!!!!!!!
// !!!!!!!il faut faire le calcul de la dérivée seconde de la métrique !!!!!!!!
// la prise en compte du paramètre pa (calcul de dérivée seconde et variation de jacobien ne sont pas fait !!!!!
// la prise en compte du paramètre pa (calcul de dérivée seconde et variation de jacobien ne sont pas fait !!!!!
// la prise en compte du paramètre pa (calcul de dérivée seconde et variation de jacobien ne sont pas fait !!!!!
// la prise en compte du paramètre pa (calcul de dérivée seconde et variation de jacobien ne sont pas fait !!!!!
// la prise en compte du paramètre pa (calcul de dérivée seconde et variation de jacobien ne sont pas fait !!!!!
//la base a t0
Calcul_giB_0(tab_noeud,dphi1,nombre_noeud,phi2);
//la base a t
Calcul_giB_t(tab_noeud,dphi1,nombre_noeud,phi2);
//la base a tdt
Calcul_giB_tdt(tab_noeud,dphi1,nombre_noeud,phi2);
// les termes relatif aux gi (et non a la facette)
Met_abstraite::Calcul_gijBB_0 (); // "
Met_abstraite::Calcul_gijHH_0 (); // composantes controvariantes à 0
Met_abstraite::Calcul_gijBB_t (); // "
Met_abstraite::Calcul_gijBB_tdt (); // "
Met_abstraite::Calcul_gijHH_tdt (); // composantes controvariantes
Met_abstraite::Jacobien_0(); // calcul du jacobien a 0
Met_abstraite::Jacobien_t(); // calcul du jacobien a t
Met_abstraite::Jacobien_tdt(); // calcul du jacobien a tdt
// les termes de variation des gi
D_giB_tdt(dphi1,nombre_noeud,phi2); // pour les gi
Met_abstraite::D_gijBB_tdt(); //variation de la metrique en BB
Met_abstraite::Calcul_giH_tdt(); // base duale
Met_abstraite::D_giH_tdt(); // variation de la base duale
Met_abstraite::D_gijHH_tdt(); //variation de la metrique en HH
Met_abstraite::Djacobien_tdt(); // variation du jacobien
// ***mise en place du calcul des gradients instantannés ou moyens et des variations associés
// ***ainsi que l'utilisation du paramétre premier_calcul comme dans les méthodes de Met_abstraite
// ***mise en place du calcul des gradients instantannés ou moyens et des variations associés
// ***ainsi que l'utilisation du paramétre premier_calcul comme dans les méthodes de Met_abstraite
// ***mise en place du calcul des gradients instantannés ou moyens et des variations associés
// ***ainsi que l'utilisation du paramétre premier_calcul comme dans les méthodes de Met_abstraite
// retour des infos
/* Impli ex(giB_0,giB_t,giB_tdt,d_giB_tdt,giH_tdt,d_giH_tdt,gijBB_0,gijBB_t,gijBB_tdt,gijHH_tdt,
gradVBB_tdt,&d_gijBB_tdt,&d2_gijBB_tdt,&d_gijHH_tdt,jacobien_tdt,jacobien_0,&d_jacobien_tdt);
//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_0 = jacobien_0;
//ex.jacobien = jacobien_tdt; ex.d_jacobien_tdt = &d_jacobien_tdt;
return ex; */
// liberation des tenseurs intermediaires
LibereTenseur();
return ex_impli;
};
//-------- pour la remontee aux infos duaux ------------
const Met_abstraite::InfoImp& Met_PiPoCo::Cal_InfoImp
( const Tableau<Noeud *>& tab_noeud,
Tableau<Mat_pleine const *>& tabdphi,Tableau<Vecteur const *>& tabphi, int nombre_noeud)
{ // pour commodité on change de notation
Mat_pleine const & dphi1 = (*tabdphi(1)); Mat_pleine const & dphi2 = (*tabdphi(2));
Vecteur const & phi1 = (*tabphi(1)); Vecteur const & phi2 = (*tabphi(2));
// Base et point a t=0 : tout d'abord on calcul les elements relatifs a la facette plane
Met_abstraite::Calcul_M0(tab_noeud,phi1,nombre_noeud); *P0 = *M0;
Met_abstraite::Calcul_giB_0(tab_noeud,dphi1,nombre_noeud,phi1); // calcul de la base a t=0
*aiB_0 = *giB_0; // sauvegarde
Met_abstraite::Calcul_gijBB_0 (); // metrique base naturelle
*aijBB_0 = *gijBB_0;
Met_abstraite::Calcul_gijHH_0 (); // composantes controvariantes
*aijHH_0 = *gijHH_0;
Met_abstraite::Calcul_giH_0();
*aiH_0 = *giH_0; // sauvegarde
// calcul de la coubure a 0
curb_0 = courbure_0(tab_noeud);
//la base a t0
Calcul_giB_0(tab_noeud,dphi1,nombre_noeud,phi2);
// Base et point a t=tdt :
Met_abstraite::Calcul_Mtdt(tab_noeud,phi1,nombre_noeud); *Ptdt = *Mtdt;
Met_abstraite::Calcul_giB_tdt(tab_noeud,dphi1,nombre_noeud,phi1); // calcul de la base a tdt
*aiB_tdt = *giB_tdt; // sauvegarde
Met_abstraite::Calcul_gijBB_tdt (); // metrique base naturelle
*aijBB_tdt = *gijBB_tdt;
Met_abstraite::Calcul_gijHH_tdt (); *aijHH_tdt = *gijHH_tdt; // composantes controvariantes
Met_abstraite::Calcul_giH_tdt(); *aiH_tdt = *giH_tdt; // calcul et sauvegar de la base duale
// calcul de la coubure a tdt
curb_tdt = courbure_tdt(tab_noeud);
//la base a t
Calcul_giB_tdt(tab_noeud,dphi1,nombre_noeud,phi2);
// grandeurs de sortie
Calcul_N_0 ();
Calcul_M0(tab_noeud,phi2,nombre_noeud);
Calcul_N_tdt ();
Calcul_Mtdt(tab_noeud,phi2,nombre_noeud);
Met_abstraite::Calcul_gijBB_0 (); // "
Met_abstraite::Calcul_gijHH_0 (); // composantes controvariantes
Met_abstraite::Calcul_gijBB_tdt (); // "
Met_abstraite::Calcul_gijHH_tdt (); // composantes controvariantes
// bases duales
Met_abstraite::Calcul_giH_0();
Met_abstraite::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;
return ex; */
// liberation des tenseurs intermediaires
LibereTenseur();
return ex_InfoImp;
};
const Met_abstraite::InfoExp_t& Met_PiPoCo::Cal_InfoExp_t
(const Tableau<Noeud *>& tab_noeud,
Tableau<Mat_pleine const *>& tabdphi,Tableau<Vecteur const *>& tabphi, int nombre_noeud)
{ // pour commodité on change de notation
Mat_pleine const & dphi1 = (*tabdphi(1)); Mat_pleine const & dphi2 = (*tabdphi(2));
Vecteur const & phi1 = (*tabphi(1)); Vecteur const & phi2 = (*tabphi(2));
// Base et point a t=0 : tout d'abord on calcul les elements relatifs a la facette plane
Met_abstraite::Calcul_M0(tab_noeud,phi1,nombre_noeud); *P0 = *M0;
Met_abstraite::Calcul_giB_0(tab_noeud,dphi1,nombre_noeud,phi1); // calcul de la base a t=0
*aiB_0 = *giB_0; // sauvegarde
Met_abstraite::Calcul_gijBB_0 (); // metrique base naturelle
*aijBB_0 = *gijBB_0;
Met_abstraite::Calcul_gijHH_0 (); // composantes controvariantes
*aijHH_0 = *gijHH_0;
Met_abstraite::Calcul_giH_0();
*aiH_0 = *giH_0; // sauvegarde
// calcul de la coubure a 0
curb_0 = courbure_0(tab_noeud);
//la base a t0
Calcul_giB_0(tab_noeud,dphi1,nombre_noeud,phi2);
// Base et point a t=t :
Met_abstraite::Calcul_Mt(tab_noeud,phi1,nombre_noeud); *Pt = *Mt;
Met_abstraite::Calcul_giB_t(tab_noeud,dphi1,nombre_noeud,phi1); // calcul de la base a t
*aiB_t = *giB_t; // sauvegarde
Met_abstraite::Calcul_gijBB_t (); // metrique base naturelle
*aijBB_t = *gijBB_t;
Met_abstraite::Calcul_gijHH_t (); *aijHH_t = *gijHH_t; // composantes controvariantes
Met_abstraite::Calcul_giH_t(); *aiH_t = *giH_t; // calcul et sauvegar de la base duale
// calcul de la coubure a t
curb_t = courbure_t(tab_noeud);
//la base a t
Calcul_giB_t(tab_noeud,dphi1,nombre_noeud,phi2);
// grandeurs de sortie
Calcul_N_0 ();
Calcul_M0(tab_noeud,phi2,nombre_noeud);
Calcul_N_t ();
Calcul_Mt(tab_noeud,phi2,nombre_noeud);
Met_abstraite::Calcul_gijBB_0 (); // "
Met_abstraite::Calcul_gijHH_0 (); // composantes controvariantes
Met_abstraite::Calcul_gijBB_t (); // "
Met_abstraite::Calcul_gijHH_t (); // composantes controvariantes
// bases duales
Met_abstraite::Calcul_giH_0();
Met_abstraite::Calcul_giH_t();
// retour des infos
/* InfoExp_t 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;
return ex; */
// liberation des tenseurs intermediaires
LibereTenseur();
return ex_InfoExp_t;
};
const Met_abstraite::InfoExp_tdt& Met_PiPoCo::Cal_InfoExp_tdt
(const Tableau<Noeud *>& tab_noeud,
Tableau<Mat_pleine const *>& tabdphi,Tableau<Vecteur const *>& tabphi, int nombre_noeud)
{ // pour commodité on change de notation
Mat_pleine const & dphi1 = (*tabdphi(1)); Mat_pleine const & dphi2 = (*tabdphi(2));
Vecteur const & phi1 = (*tabphi(1)); Vecteur const & phi2 = (*tabphi(2));
// Base et point a t=0 : tout d'abord on calcul les elements relatifs a la facette plane
Met_abstraite::Calcul_M0(tab_noeud,phi1,nombre_noeud); *P0 = *M0;
Met_abstraite::Calcul_giB_0(tab_noeud,dphi1,nombre_noeud,phi1); // calcul de la base a t=0
*aiB_0 = *giB_0; // sauvegarde
Met_abstraite::Calcul_gijBB_0 (); // metrique base naturelle
*aijBB_0 = *gijBB_0;
Met_abstraite::Calcul_gijHH_0 (); // composantes controvariantes
*aijHH_0 = *gijHH_0;
Met_abstraite::Calcul_giH_0();
*aiH_0 = *giH_0; // sauvegarde
// calcul de la coubure a 0
curb_0 = courbure_0(tab_noeud);
//la base a t0
Calcul_giB_0(tab_noeud,dphi1,nombre_noeud,phi2);
// Base et point a tdt :
Met_abstraite::Calcul_Mtdt(tab_noeud,phi1,nombre_noeud); *Ptdt = *Mtdt;
Met_abstraite::Calcul_giB_tdt(tab_noeud,dphi1,nombre_noeud,phi1); // calcul de la base a tdt
*aiB_tdt = *giB_tdt; // sauvegarde
Met_abstraite::Calcul_gijBB_tdt (); // metrique base naturelle
*aijBB_tdt = *gijBB_tdt;
Met_abstraite::Calcul_gijHH_tdt (); *aijHH_tdt = *gijHH_tdt; // composantes controvariantes
Met_abstraite::Calcul_giH_tdt(); *aiH_tdt = *giH_tdt; // calcul et sauvegar de la base duale
// calcul de la coubure a tdt
curb_tdt = courbure_tdt(tab_noeud);
//la base a tdt
Calcul_giB_tdt(tab_noeud,dphi1,nombre_noeud,phi2);
// grandeurs de sortie
Calcul_N_0 ();
Calcul_M0(tab_noeud,phi2,nombre_noeud);
Calcul_N_tdt ();
Calcul_Mtdt(tab_noeud,phi2,nombre_noeud);
Met_abstraite::Calcul_gijBB_0 (); // "
Met_abstraite::Calcul_gijHH_0 (); // composantes controvariantes
Met_abstraite::Calcul_gijBB_tdt (); // "
Met_abstraite::Calcul_gijHH_tdt (); // composantes controvariantes
// bases duales
Met_abstraite::Calcul_giH_0();
Met_abstraite::Calcul_giH_tdt();
// retour des infos
/* InfoExp_tdt 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
return ex; */
LibereTenseur();
return ex_InfoExp_tdt;
};