Herezh_dev/Elements/Thermique/ElemThermi4.cc

736 lines
31 KiB
C++
Raw Normal View History

// 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 "Debug.h"
#include "ElemThermi.h"
#include <iomanip>
#include "ConstMath.h"
#include "Util.h"
#include "Coordonnee2.h"
#include "Coordonnee3.h"
#include "TypeQuelconqueParticulier.h"
#include "TypeConsTens.h"
// affichage dans la sortie transmise, des variables duales "nom"
// aux differents points d'integration
// dans le cas ou nom est vide, affichage de "toute" les variables
void ElemThermi::VarDualSort(ofstream& sort, Tableau<string>& nom,int ,int cas)
{ if ((cas == 1) || (cas == 2))
{ // cas d'une premiere initialisation
Tableau<Enum_variable_metrique> tab(5);
tab(1) = iM0; tab(2) = iMt; tab(3) = iMtdt;
tab(4) = igiH_0; tab(5) = igijHH_0;
met->PlusInitVariables(tab) ;
}
// def de la dimension des Coordonnées
int dim = ParaGlob::Dimension();
// def de tenseurs pour la sortie
Coordonnee fluxD(dim);
CoordonneeH fluxDH(dim) ;
Coordonnee gradT(dim);
CoordonneeB gradTB(dim);
CoordonneeB DgradTB(dim);
Coordonnee DgradT(dim);
CoordonneeB DeltagradTB(dim) ;
Coordonnee DeltagradT(dim) ;
Enum_dure temps;
// a priori ici on travaille en absolue
bool absolue = true;
int ni; // compteur globale de point d'integration
for (def->PremierPtInteg(), ni = 1;def->DernierPtInteg();def->NevezPtInteg(),ni++)
// for (int ni=1;ni<= nbi;ni++)
{// éléments de métrique et matrices de passage
TenseurHH* gijHH;TenseurBB* gijBB;
Coordonnee* Mpt0;Coordonnee* Mptfin;
BaseB * giB_0; BaseB * giB_tdt;
BaseH * giH_0; BaseH * giH_tdt;
Mat_pleine jB0(dim,dim),jBfin(dim,dim);
if ((cas==1) || (cas==11))
// calcul d'une ortho interessance de visualisation des tenseurs
// cas de tenseur 3D -> Ia, cas 1D on prend un vecteur norme collineaire
// avec g1, dans le cas 2D
// la nouvelle base jB est calculee dans def par projection de "Ia" sur Galpha
// le resultat est une matrice de passage utilisable pour le changement de base
// jB0 a t=0, B pour les tenseurs BB, jH0 idem pour les tenseurs HH
// resultat a t+dt
{const Met_abstraite::InfoImp& ex = def->RemontImp(absolue,jB0,jBfin);
temps=TEMPS_tdt;
Mpt0 = ex.M0; Mptfin = ex.Mtdt;
giB_0 = ex.giB_0;giB_tdt = ex.giB_tdt;
giH_0 = ex.giH_0; giH_tdt = ex.giH_tdt;
gijHH = ex.gijHH_tdt;gijBB = ex.gijBB_tdt;
}
else if ((cas==2) || (cas==12))
{ // resultat a tdt
const Met_abstraite::InfoExp_tdt& ex= def->RemontExp_tdt(absolue,jB0,jBfin);
temps=TEMPS_tdt;
Mpt0 = ex.M0; Mptfin = ex.Mtdt;
giB_0 = ex.giB_0;giB_tdt = ex.giB_tdt;
giH_0 = ex.giH_0; giH_tdt = ex.giH_tdt;
gijHH = ex.gijHH_tdt;gijBB = ex.gijBB_tdt;
}
// calcul des grandeurs
PtIntegThermiInterne & ptIntegThermi = (*lesPtIntegThermiInterne)(ni);
fluxDH = (ptIntegThermi.FluxH());
CoordonneeB interB(dim); // variable inter
for (int i=1;i<= dim; i++)
interB += (*giB_tdt)(i) * fluxDH(i);
fluxD = interB.Coor();
gradTB = (ptIntegThermi.GradTB());
CoordonneeH interH(dim); // variable inter
for (int i=1;i<= dim; i++)
interH += gradTB(i) * (*giH_tdt)(i);
gradT = interH.Coor();
DgradTB = (ptIntegThermi.DgradTB());
interH.Zero(); // variable inter
for (int i=1;i<= dim; i++)
interH += DgradTB(i) * (*giH_tdt)(i);
DgradT = interH.Coor();
DeltagradTB = (ptIntegThermi.DeltaGradTB());
interH.Zero(); // variable inter
for (int i=1;i<= dim; i++)
interH += DeltagradTB(i) * (*giH_tdt)(i);
DeltagradT = interH.Coor();
// donnees propre a la loi thermique au pt d'integ
CompThermoPhysiqueAbstraite::SaveResul* sTP = tabSaveTP(ni);
// donnees propre a la loi mécanique au pt d'integ
Loi_comp_abstraite::SaveResul* sDon=NULL; // les données spécifique mécanique
if (sDon != NULL) {sDon = tabSaveDon(ni);}; // au pt d'integ si elles existes
// données propre à la déformation au pt d'integ
Deformation::SaveDefResul * sDefDon = tabSaveDefDon(ni);
// affichage
sort << "\n=================== Point d\'integration [[[ " << ni<<" ]]] ==================" ;
sort << "\nCoordonnees avant deformation " ; Mpt0->Affiche(sort,16);
sort << "\nCoordonnees apres deformation " ; Mptfin->Affiche(sort,16);
sort <<" \n et les variations " ; ((*Mptfin) - (*Mpt0)).Affiche(sort,16);
if (nom.Taille() == 0)
{ // cas d'une sortie complete
for (int indic =1; indic<=11; indic++)
AffDefCont
(sort,sTP,gradTB,gradT,ptIntegThermi.Norme_gradT()
,DgradTB,DgradT,ptIntegThermi.Norme_DGradT()
,fluxDH,fluxD,ptIntegThermi.Norme_flux()
,ptIntegThermi.Temperature(),indic) ;
}
else
{
// pour mémoire je laisse le reste
// for (int ij = 1;ij<= nom.Taille(); ij++)
// if (nom(ij) == "Green-Lagrange")
// AffDefCont(sort,sDon,gradT0B,gradTB,DgradTB,DeltagradTB,fluxDH,epsHB,sigHB,valPropreEps,valPropreDeps,valPropreSig,Mises
// ,epsAlmBB,epslogBB,1);
};
};
// liberation des tenseurs intermediaires
LibereTenseur();
};
void ElemThermi::AffDefCont( ofstream& sort,CompThermoPhysiqueAbstraite::SaveResul * saveDon,
CoordonneeB& gradTB,Coordonnee& gradT,double& norme_gradT,
CoordonneeB& DgradTB,Coordonnee& DgradT,double& norme_dGradT,
CoordonneeH& fluxDH,Coordonnee & fluxD,double& norme_flux,
double& temperature, int indic)
{ int dim = fluxDH.Dimension();
switch (dim)
{ case 1:
AffDefCont1D(sort,saveDon,gradTB,gradT,norme_gradT
,DgradTB,DgradT,norme_dGradT
,fluxDH,fluxD,norme_flux
,temperature,indic);
break;
case 2:
AffDefCont2D(sort,saveDon,gradTB,gradT,norme_gradT
,DgradTB,DgradT,norme_dGradT
,fluxDH,fluxD,norme_flux
,temperature,indic);
break;
case 3:
AffDefCont3D(sort,saveDon,gradTB,gradT,norme_gradT
,DgradTB,DgradT,norme_dGradT
,fluxDH,fluxD,norme_flux
,temperature,indic);
break;
default :
{cout << "\nerreur seules les cas 1D 2D 3D sont pris considere et non " << dim;
cout << "\nElemThermi::AffDefCont( etc ..." << endl;
}
}
};
void ElemThermi::AffDefCont1D( ofstream& sort,CompThermoPhysiqueAbstraite::SaveResul * saveDon,
CoordonneeB& gradTB,Coordonnee& gradT,double& norme_gradT,
CoordonneeB& DgradTB,Coordonnee& DgradT,double& norme_DGradT,
CoordonneeH& fluxDH,Coordonnee & fluxD,double& norme_flux,
double& temperature, int indic)
{
switch (indic)
{case 1 :{ sort << "\nGradient de temperature dans repere global";
sort << "\n gradT " ;
sort << setw (16) << gradT(1) ;
}
break;
case 2 :{ sort << "\nGradient de temperature dans repere global";
sort << "\n gradTB " ;
sort << setw (16) << gradTB(1) ;
}
break;
case 3 :{ sort << "\nDensite de flux dans repere global";
sort << "\n fluxD " ;
sort << setw (16) << fluxD(1) ;
}
break;
case 4 :{ sort << "\nDensite de flux dans repere local";
sort << "\n fluxDH " ;
sort << setw (16) << fluxDH(1) ;
}
break;
case 5 :{ sort << "\nVitesse du gradient de temperature dans repere global";
sort << "\n DgradT " ;
sort << setw (16) << DgradT(1) ;
}
break;
case 6 :{ sort << "\nVitesse du gradient de temperature dans repere local";
sort << "\n DgradTB " ;
sort << setw (16) << DgradTB(1) ;
}
break;
case 7 :{ sort << "\n norme gradT ";
sort << "\n norme_gradT " ;
sort << setw (16) << norme_gradT ;
}
break;
case 8 :{ sort << "\n norme DgradT ";
sort << "\n norme_DGradT " ;
sort << setw (16) << norme_DGradT ;
}
break;
case 9 :{ sort << "\n norme fluxD ";
sort << "\n norme_flux " ;
sort << setw (16) << norme_flux;
}
break;
case 10 :{ sort << "\n Temperature ";
sort << "\n temperature " ;
sort << setw (16) << temperature ;
}
break;
case 11 :{ if (saveDon != NULL)
{ sort << "\ngrandeurs attachees a la loi et au point ";
loiTP->AfficheDataSpecif(sort,saveDon);
}
}
break;
default :
{cout << "\nerreur seules les cas de 1 a 11 sont pris en consideration et non " << indic;
cout << "\nElemThermi::AffDefCont1D( etc ..." << endl;
}
};
};
void ElemThermi::AffDefCont2D( ofstream& sort,CompThermoPhysiqueAbstraite::SaveResul * saveDon,
CoordonneeB& gradTB,Coordonnee& gradT,double& norme_gradT,
CoordonneeB& DgradTB,Coordonnee& DgradT,double& norme_DGradT,
CoordonneeH& fluxDH,Coordonnee & fluxD,double& norme_flux,
double& temperature, int indic)
{
string type_repere=" repere global";
int dim_glob = ParaGlob::Dimension();
if (dim_glob == 3)
// lorsque que l'on sort des vecteur de dim 2 en dimension 3, on utilise un repère particulier local orthonormé
type_repere=" repere orthonorme local";
int dim_loc = gradTB.Dimension();
switch (indic)
{case 1 :{ sort << "\nGradient de temperature dans repere global";
sort << "\n gradT \n" ;
for (int i=1;i<=dim_glob;i++) sort << setw (16) << gradT(i) << " ";
}
break;
case 2 :{ sort << "\nGradient de temperature dans repere global";
sort << "\n gradTB \n" ;
for (int i=1;i<=dim_loc;i++) sort << setw (16) << gradTB(i) << " ";
}
break;
case 3 :{ sort << "\nDensite de flux dans repere global";
sort << "\n fluxD \n" ;
for (int i=1;i<=dim_glob;i++) sort << setw (16) << fluxD(i) << " ";
}
break;
case 4 :{ sort << "\nDensite de flux dans repere local";
sort << "\n fluxDH \n" ;
for (int i=1;i<=dim_loc;i++) sort << setw (16) << fluxDH(i) << " ";
}
break;
case 5 :{ sort << "\nVitesse du gradient de temperature dans repere global";
sort << "\n DgradT \n" ;
for (int i=1;i<=dim_glob;i++) sort << setw (16) << DgradT(i) << " ";
}
break;
case 6 :{ sort << "\nVitesse du gradient de temperature dans repere local";
sort << "\n DgradTB \n" ;
for (int i=1;i<=dim_loc;i++) sort << setw (16) << DgradTB(i) << " ";
}
break;
case 7 :{ sort << "\n norme gradT ";
sort << "\n norme_gradT " ;
sort << setw (16) << norme_gradT ;
}
break;
case 8 :{ sort << "\n norme DgradT ";
sort << "\n norme_DGradT " ;
sort << setw (16) << norme_DGradT ;
}
break;
case 9 :{ sort << "\n norme fluxD ";
sort << "\n norme_flux " ;
sort << setw (16) << norme_flux;
}
break;
case 10 :{ sort << "\n Temperature ";
sort << "\n temperature " ;
sort << setw (16) << temperature ;
}
break;
case 11 :{ if (saveDon != NULL)
{ sort << "\ngrandeurs attachees a la loi et au point ";
loiTP->AfficheDataSpecif(sort,saveDon);
}
}
default :
{cout << "\nerreur seules les cas de 1 a 11 sont pris en consideration et non " << indic;
cout << "\nElemThermi::AffDefCont2D( etc ..." << endl;
}
}
};
void ElemThermi::AffDefCont3D( ofstream& sort,CompThermoPhysiqueAbstraite::SaveResul * saveDon,
CoordonneeB& gradTB,Coordonnee& gradT,double& norme_gradT,
CoordonneeB& DgradTB,Coordonnee& DgradT,double& norme_DGradT,
CoordonneeH& fluxDH,Coordonnee & fluxD,double& norme_flux,
double& temperature, int indic)
{int dim_glob = 3; int dim_loc = 3;
switch (indic)
{case 1 :{ sort << "\nGradient de temperature dans repere global";
sort << "\n gradT \n" ;
for (int i=1;i<=dim_glob;i++) sort << setw (16) << gradT(i) << " ";
}
break;
case 2 :{ sort << "\nGradient de temperature dans repere global";
sort << "\n gradTB \n" ;
for (int i=1;i<=dim_loc;i++) sort << setw (16) << gradTB(i) << " ";
}
break;
case 3 :{ sort << "\nDensite de flux dans repere global";
sort << "\n fluxD \n" ;
for (int i=1;i<=dim_glob;i++) sort << setw (16) << fluxD(i) << " ";
}
break;
case 4 :{ sort << "\nDensite de flux dans repere local";
sort << "\n fluxDH \n" ;
for (int i=1;i<=dim_loc;i++) sort << setw (16) << fluxDH(i) << " ";
}
break;
case 5 :{ sort << "\nVitesse du gradient de temperature dans repere global";
sort << "\n DgradT \n" ;
for (int i=1;i<=dim_glob;i++) sort << setw (16) << DgradT(i) << " ";
}
break;
case 6 :{ sort << "\nVitesse du gradient de temperature dans repere local";
sort << "\n DgradTB \n" ;
for (int i=1;i<=dim_loc;i++) sort << setw (16) << DgradTB(i) << " ";
}
break;
case 7 :{ sort << "\n norme gradT ";
sort << "\n norme_gradT " ;
sort << setw (16) << norme_gradT ;
}
break;
case 8 :{ sort << "\n norme DgradT ";
sort << "\n norme_DGradT " ;
sort << setw (16) << norme_DGradT ;
}
break;
case 9 :{ sort << "\n norme fluxD ";
sort << "\n norme_flux " ;
sort << setw (16) << norme_flux;
}
break;
case 10 :{ sort << "\n Temperature ";
sort << "\n temperature " ;
sort << setw (16) << temperature ;
}
break;
case 11 :{ if (saveDon != NULL)
{ sort << "\ngrandeurs attachees a la loi et au point ";
loiTP->AfficheDataSpecif(sort,saveDon);
}
}
default :
{cout << "\nerreur seules les cas de 1 a 11 sont pris en consideration et non " << indic;
cout << "\nElemThermi::AffDefCont2D( etc ..." << endl;
}
}
};
// récupération des valeurs au numéro d'ordre = iteg pour
// les grandeur enu
// absolue: indique si oui ou non on sort les tenseurs dans la base absolue ou une base particulière
Tableau <double> ElemThermi::Valeur_multi
(bool absolue,Enum_dure temps,const List_io<Ddl_enum_etendu>& enu,int iteg,int cas )
{ // ----- def de grandeurs de travail
// def de la dimension des tenseurs
int dim = ParaGlob::Dimension();
PtIntegThermiInterne & ptIntegThermi = (*lesPtIntegThermiInterne)(iteg);
// recup de l'incrément de temps
double deltat=ParaGlob::Variables_de_temps().IncreTempsCourant();
double unSurDeltat=0;
if (Abs(deltat) >= ConstMath::trespetit)
{unSurDeltat = 1./deltat;}
else // si l'incrément de temps est tres petit on remplace 1/deltat par un nombre tres grand
{ // un pas de temps doit être positif !! or certaine fois il peut y avoir des pb
if (unSurDeltat < 0)
{ cout << "\n le pas de temps est négatif !! "; };
unSurDeltat = ConstMath::tresgrand;
};
// def de grandeurs pour la sortie
Coordonnee fluxD(dim);
CoordonneeH fluxDH(dim) ;
Coordonnee gradT(dim);
CoordonneeB gradTB(dim);
CoordonneeB DgradTB(dim);
Coordonnee DgradT(dim);
CoordonneeB DeltagradTB(dim) ;
Coordonnee DeltagradT(dim) ;
Coordonnee Mtdt(ParaGlob::Dimension()); // coordonnées éventuelles du point d'intégration considéré
Tableau <double> tab_ret (enu.size());
// définition des grandeurs qui sont indépendante de la boucle sur les ddl_enum_etendue
def->ChangeNumInteg(iteg); // on change le numéro de point d'intégration courant
if (((cas == 1) || (cas == 2)))
{ // cas d'une premiere initialisation
Tableau<Enum_variable_metrique> tab(5);
tab(1) = iM0; tab(2) = iMt; tab(3) = iMtdt;
tab(4) = igiH_0; tab(5) = igijHH_0;
met->PlusInitVariables(tab) ;
}
// éléments de métrique et matrices de passage
TenseurHH* gijHH;TenseurBB* gijBB;
Coordonnee* Mpt0;Coordonnee* Mptfin;
BaseB * giB_0; BaseB * giB_tdt;
BaseH * giH_0; BaseH * giH_tdt;
Mat_pleine jB0(dim,dim),jBfin(dim,dim);
if ((cas==1) || (cas==11))
// calcul d'une ortho interessance de visualisation des tenseurs
// cas de tenseur 3D -> Ia, cas 1D on prend un vecteur norme collineaire
// avec g1, dans le cas 2D
// la nouvelle base jB est calculee dans def par projection de "Ia" sur Galpha
// le resultat est une matrice de passage utilisable pour le changement de base
// jB0 a t=0, B pour les tenseurs BB, jH0 idem pour les tenseurs HH
// resultat a t+dt
{const Met_abstraite::InfoImp& ex = def->RemontImp(absolue,jB0,jBfin);
Mpt0 = ex.M0; Mptfin = ex.Mtdt;
gijHH = ex.gijHH_tdt;gijBB = ex.gijBB_tdt;
giB_0 = ex.giB_0;giB_tdt = ex.giB_tdt;
giH_0 = ex.giH_0; giH_tdt = ex.giH_tdt;
}
else if ((cas==2) || (cas==12))
// resultat a t
{const Met_abstraite::InfoExp_tdt& ex= def->RemontExp_tdt(absolue,jB0,jBfin);
Mpt0 = ex.M0; Mptfin = ex.Mtdt;
giB_0 = ex.giB_0;giB_tdt = ex.giB_tdt;
giH_0 = ex.giH_0; giH_tdt = ex.giH_tdt;
gijHH = ex.gijHH_tdt;gijBB = ex.gijBB_tdt;
};
// on définie des indicateurs pour ne pas faire plusieurs fois le même calcul
List_io<Ddl_enum_etendu>::const_iterator ie,iefin=enu.end();
bool besoin_coordonnees = false;
for (ie=enu.begin(); ie!=iefin;ie++)
{ if (Meme_famille((*ie).Enum(),X1)) besoin_coordonnees=true;
};
// ----- maintenant on calcule les grandeurs nécessaires -----
fluxDH = (ptIntegThermi.FluxH());
CoordonneeB interB(dim); // variable inter
for (int i=1;i<= dim; i++)
interB += (*giB_tdt)(i) * fluxDH(i);
fluxD = interB.Coor();
gradTB = (ptIntegThermi.GradTB());
CoordonneeH interH(dim); // variable inter
for (int i=1;i<= dim; i++)
interH += gradTB(i) * (*giH_tdt)(i);
gradT = interH.Coor();
DgradTB = (ptIntegThermi.DgradTB());
interH.Zero(); // variable inter
for (int i=1;i<= dim; i++)
interH += DgradTB(i) * (*giH_tdt)(i);
DgradT = interH.Coor();
DeltagradTB = (ptIntegThermi.DeltaGradTB());
interH.Zero(); // variable inter
for (int i=1;i<= dim; i++)
interH += DeltagradTB(i) * (*giH_tdt)(i);
DeltagradT = interH.Coor();
if (besoin_coordonnees)
Mtdt = def->Position_tdt();
// donnees propre a la loi thermique au pt d'integ
CompThermoPhysiqueAbstraite::SaveResul* sTP = tabSaveTP(iteg);
// donnees propre a la loi mécanique au pt d'integ
Loi_comp_abstraite::SaveResul* sDon=NULL; // les données spécifique mécanique
if (sDon != NULL) {sDon = tabSaveDon(iteg);}; // au pt d'integ si elles existes
// données propre à la déformation au pt d'integ
Deformation::SaveDefResul * sDefDon = tabSaveDefDon(iteg);
//----- fin du calcul des grandeurs nécessaires -----
// on balaie maintenant la liste des grandeurs à sortir
int it; // it est l'indice dans le tableau de retour
for (it=1,ie=enu.begin(); ie!=iefin;ie++,it++)
{
switch ((*ie).Enum())
{ case FLUXD1 : tab_ret(it)= fluxD(1); break;
case FLUXD2 : tab_ret(it)= fluxD(2); break;
case FLUXD3 : tab_ret(it)= fluxD(3); break;
case GRADT1 : tab_ret(it)= gradT(1); break;
case GRADT2 : tab_ret(it)= gradT(2); break;
case GRADT3 : tab_ret(it)= gradT(3); break;
case DGRADT1 : tab_ret(it)= DgradT(1); break;
case DGRADT2 : tab_ret(it)= DgradT(2); break;
case DGRADT3 : tab_ret(it)= DgradT(3); break;
case TEMP : tab_ret(it)= ptIntegThermi.Temperature(); break;
case X1 : tab_ret(it)= Mtdt(1); break;
case X2 : tab_ret(it)= Mtdt(2); break;
case X3 : tab_ret(it)= Mtdt(3); break;
default :
{int posi = (*ie).Position()-NbEnum_ddl();
switch (posi)
{ case 107: /*norme_gradT*/ tab_ret(it)=ptIntegThermi.Norme_gradT() ;break;
case 108: /*norme_DgradT*/ tab_ret(it)=ptIntegThermi.Norme_DGradT_const() ;break;
case 109: /*norme_dens_flux*/ tab_ret(it)=ptIntegThermi.Norme_flux_const() ;break;
case 111: /*DeltagradT1*/ tab_ret(it)=DeltagradT(1) ;break;
case 112: /*DeltagradT2*/ tab_ret(it)=DeltagradT(2) ;break;
case 113: /*DeltagradT3*/ tab_ret(it)=DeltagradT(3) ;break;
default :
{cout << "\n cas de ddl actuellement non traite "
<< "\n pas de ddl " << (*ie).Nom() << " dans l'element "
<< "\n ou cas non implante pour l'instant"
<< "\n ElemThermi::Valeur_multi(....";
};
}; // fin cas **** 2 >>>>>
};
};
};// -- fin de la boucle sur la liste de Ddl_enum_etendu
// liberation des tenseurs intermediaires
LibereTenseur();
return tab_ret;
};
// récupération des valeurs Tensorielles (et non scalaire comme avec Valeur_multi)
// au numéro d'ordre = iteg pour les grandeur enu
// enu contiend les grandeurs de retour
// absolue: indique si oui ou non on sort les tenseurs dans la base absolue ou une base particulière
void ElemThermi::Valeurs_Tensorielles(bool absolue,Enum_dure temps,List_io<TypeQuelconque>& enu
,int iteg,int cas )
{ // ----- def de grandeurs de travail
// def de la dimension des tenseurs
int dim = ParaGlob::Dimension();
PtIntegThermiInterne & ptIntegThermi = (*lesPtIntegThermiInterne)(iteg);
// def de conteneur pour la sortie
Coordonnee* fluxD=NULL; bool besoin_fluxD = false;
Coordonnee* gradT=NULL; bool besoin_gradT = false;
Coordonnee* DgradT=NULL; bool besoin_DgradT = false;
Coordonnee* DeltagradT=NULL; bool besoin_deltagradT = false;
Coordonnee* Mtdt=NULL; // coordonnées éventuelles du point d'intégration considéré
bool besoin_coordonnees = false;
double* erreur = NULL; bool besoin_erreur = false;
// --- dev d'un ensemble de variable booléenne pour gérer les sorties en une passe -----
// on se réfère au informations définit dans la méthode: Les_type_evolues_internes()
// on initialise ces variables booléennes
List_io<TypeQuelconque>::iterator ipq,ipqfin=enu.end();
for (ipq=enu.begin();ipq!=ipqfin;ipq++)
{switch ((*ipq).EnuTypeQuelconque().EnumTQ()) //,FLUXD, GRADT, DGRADT
{case FLUXD : {besoin_fluxD=true;
Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) ((*ipq).Grandeur_pointee()));
fluxD = gr.ConteneurCoordonnee(); break;}
case GRADT : {besoin_gradT=true;
Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) ((*ipq).Grandeur_pointee()));
gradT = gr.ConteneurCoordonnee(); break;}
case DGRADT : {besoin_DgradT=true;
Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) ((*ipq).Grandeur_pointee()));
DgradT = gr.ConteneurCoordonnee(); break;}
case DELTAGRADT : {besoin_deltagradT=true;
Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) ((*ipq).Grandeur_pointee()));
DeltagradT = gr.ConteneurCoordonnee(); break;}
default :
{// on initialise la grandeur pour éviter d'avoir des valeurs aléatoires
((*ipq).Grandeur_pointee())->InitParDefaut();
if (ParaGlob::NiveauImpression() > 0)
{cout << "\nWarning : attention cas non traite: "
<< ((*ipq).EnuTypeQuelconque().NomPlein()) << "!\n";
if (ParaGlob::NiveauImpression() > 5)
cout << "\n ElemThermi::Valeurs_Tensorielles(....";
};
};
};
};
// definition générale
def->ChangeNumInteg(iteg); // on change le numéro de point d'intégration courant
if (((cas == 1) || (cas == 2)))
{ // cas d'une premiere initialisation
Tableau<Enum_variable_metrique> tab(5);
tab(1) = iM0; tab(2) = iMt; tab(3) = iMtdt;
tab(4) = igiH_0; tab(5) = igijHH_0;
met->PlusInitVariables(tab) ;
}
// éléments de métrique et matrices de passage
TenseurHH* gijHH;TenseurBB* gijBB;
Coordonnee* Mpt0;Coordonnee* Mptfin;
BaseB * giB_0; BaseB * giB_tdt;
BaseH * giH_0; BaseH * giH_tdt;
Mat_pleine jB0(dim,dim),jBfin(dim,dim);
if ((cas==1) || (cas==11))
// calcul d'une ortho interessance de visualisation des tenseurs
// cas de tenseur 3D -> Ia, cas 1D on prend un vecteur norme collineaire
// avec g1, dans le cas 2D
// la nouvelle base jB est calculee dans def par projection de "Ia" sur Galpha
// le resultat est une matrice de passage utilisable pour le changement de base
// jB0 a t=0, B pour les tenseurs BB, jH0 idem pour les tenseurs HH
// resultat a t+dt
{const Met_abstraite::InfoImp& ex = def->RemontImp(absolue,jB0,jBfin);
Mpt0 = ex.M0; Mptfin = ex.Mtdt;
gijHH = ex.gijHH_tdt;gijBB = ex.gijBB_tdt;
giB_0 = ex.giB_0;giB_tdt = ex.giB_tdt;
giH_0 = ex.giH_0; giH_tdt = ex.giH_tdt;
}
else if ((cas==2) || (cas==12))
// resultat a t
{const Met_abstraite::InfoExp_tdt& ex= def->RemontExp_tdt(absolue,jB0,jBfin);
Mpt0 = ex.M0; Mptfin = ex.Mtdt;
gijHH = ex.gijHH_tdt;gijBB = ex.gijBB_tdt;
giB_0 = ex.giB_0;giB_tdt = ex.giB_tdt;
giH_0 = ex.giH_0; giH_tdt = ex.giH_tdt;
}
else
{ cout << "\n erreur, cas non prevu! " << "\n ElemThermi::Valeurs_Tensorielles(..."; Sortie(1);};
// ----- calcul des grandeurs à sortir
// ----- maintenant on calcule les grandeurs nécessaires -----
if (besoin_fluxD)
{CoordonneeH & fluxDH = (ptIntegThermi.FluxH());
CoordonneeB interB(dim); // variable inter
for (int i=1;i<= dim; i++)
interB += (*giB_tdt)(i) * fluxDH(i);
(*fluxD) = interB.Coor();
};
if (besoin_gradT)
{CoordonneeB & gradTB = (ptIntegThermi.GradTB());
CoordonneeH interH(dim); // variable inter
for (int i=1;i<= dim; i++)
interH += gradTB(i) * (*giH_tdt)(i);
(*gradT) = interH.Coor();
};
if (besoin_DgradT)
{CoordonneeB & DgradTB = (ptIntegThermi.DgradTB());
CoordonneeH interH(dim); // variable inter
for (int i=1;i<= dim; i++)
interH += DgradTB(i) * (*giH_tdt)(i);
(*DgradT) = interH.Coor();
};
if (besoin_deltagradT)
{CoordonneeB & DeltagradTB = (ptIntegThermi.DeltaGradTB());
CoordonneeH interH(dim); // variable inter
for (int i=1;i<= dim; i++)
interH += DeltagradTB(i) * (*giH_tdt)(i);
(*DeltagradT) = interH.Coor();
};
if (besoin_coordonnees)
(*Mtdt) = def->Position_tdt();
// donnees propre a la loi thermique au pt d'integ
CompThermoPhysiqueAbstraite::SaveResul* sTP = tabSaveTP(iteg);
// donnees propre a la loi mécanique au pt d'integ
Loi_comp_abstraite::SaveResul* sDon=NULL; // les données spécifique mécanique
if (sDon != NULL) {sDon = tabSaveDon(iteg);}; // au pt d'integ si elles existes
// données propre à la déformation au pt d'integ
Deformation::SaveDefResul * sDefDon = tabSaveDefDon(iteg);
// liberation des tenseurs intermediaires
LibereTenseur();
};