Herezh_dev/Elements/Mecanique/Deformation_gene/DeformationSfe1_stockage.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

203 lines
9.2 KiB
C++

// 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 "DeformationSfe1.h"
#include "ParaGlob.h"
// ----------------------------------------------------------------------------------------------
// conteneurs pour le stockage de variables spécifiques à un point de calcul
// cas des éléments SFe1
// ----------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
// // implantation concernant la classe conteneur spécifique à chaque point ou la déformation
// // est calculée
// constructeur par défaut -> à ne pas utiliser -> message d'erreur
DeformationSfe1::SaveDefResulSfe1::SaveDefResulSfe1()
{ cout << "\n **** erreur d'utilisation de constructeur "
<< "\n DeformationSfe1::SaveDefResulSfe1::SaveDefResulSfe1()";
Sortie(1);
};
// le constructeur recevable
DeformationSfe1::SaveDefResulSfe1::SaveDefResulSfe1(const Met_abstraite& meta):
Deformation::SaveDefResul(meta)
,meti_a_00(meta.Dim_vec_base(),meta.Nbvec_des_bases())
,meti_a_t(meta.Dim_vec_base(),meta.Nbvec_des_bases())
,meti_a_tdt(meta.Dim_vec_base(),meta.Nbvec_des_bases())
{enu_type=SAVEDEFRESUL_SFE1;};
// le constructeur de copie
DeformationSfe1::SaveDefResulSfe1::SaveDefResulSfe1(const SaveDefResulSfe1& a):
Deformation::SaveDefResul(a)
,meti_a_00(a.meti_a_00),meti_a_t(a.meti_a_t),meti_a_tdt(a.meti_a_tdt)
{};
// destructeur
DeformationSfe1::SaveDefResulSfe1::~SaveDefResulSfe1() {};
// surcharge de l'opérateur d'affectation
Deformation::SaveDefResul& DeformationSfe1::SaveDefResulSfe1::operator=
(const Deformation::SaveDefResul& aa)
{// on vérifie le type exacte
#ifdef MISE_AU_POINT
if (aa.Type_stocke() != enu_type)
{cout << "\nErreur en affectation etre un stockage "
<< Nom_type_stockage_def(enu_type) << " et " << Nom_type_stockage_def(aa.Type_stocke());
cout << "\n DeformationSfe1::SaveDefResulSfe1::operator= " << endl;
Sortie(1);
};
#endif
// les variables de la classe mère
this->Deformation::SaveDefResul::operator= (aa);
// puis les variables propres
DeformationSfe1::SaveDefResulSfe1& a = *((DeformationSfe1::SaveDefResulSfe1*) &aa);
meti_a_00 = a.meti_a_00; meti_a_t = a.meti_a_t; meti_a_tdt = a.meti_a_tdt;
return *this;
};
// affichage des infos
void DeformationSfe1::SaveDefResulSfe1::Affiche()
{// les variables de la classe mère
this->Deformation::SaveDefResul::Affiche();
// puis les variables propres
cout << "\n meti_a_00: " ; meti_a_00.Affiche(); cout << " meti_a_t: "; meti_a_t.Affiche();
cout << " meti_a_tdt ";meti_a_tdt.Affiche(); cout <<" ";
};
// idem sur un ofstream
void DeformationSfe1::SaveDefResulSfe1::Affiche(ofstream& sort)
{// les variables de la classe mère
this->Deformation::SaveDefResul::Affiche(sort);
// puis les variables propres
sort << "\n meti_a_00: " << meti_a_00 << " meti_a_t " << meti_a_t
<< " meti_a_tdt " << meti_a_tdt <<" ";
};
//============= lecture écriture dans base info ==========
// cas donne le niveau de la récupération
// = 1 : on récupère tout
// = 2 : on récupère uniquement les données variables (supposées comme telles)
void DeformationSfe1::SaveDefResulSfe1::Lecture_base_info (ifstream& ent,const int cas)
{// lecture de l'entête
string nom;
// lecture des données
// les variables de la classe mère
this->Deformation::SaveDefResul::Lecture_base_info(ent,cas);
// puis les variables propres
switch (cas)
{ case 1 :
ent >> nom;
if (nom != "SaveDefResulSfe1:")
{ cout << "\n erreur de lecture d'entete de SaveDefResulSfe1, nom lue: " << nom
<< "\n DeformationSfe1::SaveDefResulSfe1::Lecture_base_info (...";
Sortie(1);
}
ent >> nom >> meti_a_00 >> nom >> meti_a_t ; break;
case 2 :
// -- on test --
// ent >> nom;
// if (nom != "SaveDefResulSfe1:")
// { cout << "\n erreur de lecture d'entete de SaveDefResulSfe1, nom lue: " << nom
// << "\n DeformationSfe1::SaveDefResulSfe1::Lecture_base_info (...";
// Sortie(1);
// }
// ent >> nom >> meti_a_t ;
break;
default:
cout << "\n cas non considere !!: cas= " << cas
<< "\n DeformationSfe1::SaveDefResulSfe1::Lecture_base_info (...";
Sortie(1);
};
};
// cas donne le niveau de sauvegarde
// = 1 : on sauvegarde tout
// = 2 : on sauvegarde uniquement les données variables (supposées comme telles)
void DeformationSfe1::SaveDefResulSfe1::Ecriture_base_info(ofstream& sort,const int cas)
{// on ne sauvegarde que ce qui est à 0 et à t, ce qui est à tdt est considéré une zone de travail
// les variables de la classe mère
this->Deformation::SaveDefResul::Ecriture_base_info(sort,cas);
// puis les variables propres
switch (cas)
{ case 1 :
sort << " SaveDefResulSfe1: ";
sort << " meti_a_00: " << meti_a_00 << " meti_a_t: " << meti_a_t << " ";
break;
case 2 :
// -- on test --
// sort << " SaveDefResulSfe1: ";
// sort << " meti_a_t: " << meti_a_t << " ";
break;
default:
cout << "\n cas non considere !!: cas= " << cas
<< "\n DeformationSfe1::SaveDefResulSfe1::Ecriture_base_info(...";
Sortie(1);
};
};
// mise à jour des grandeurs meti_a_00
// *** non car dans le cas d'un restart ce n'est pas vrai !!!! //et init par recopie des grandeurs sur t
void DeformationSfe1::SaveDefResulSfe1::MiseAJourGrandeurs_a_0(const Met_abstraite * metrique)
{ // tout d'abord les variables de la classe mère
// là on sauvegarde les grandeurs au point courant (et non la facette), et qui sont sauvegardées
// dans le SaveDefResul initiale et non le spécifique sfe1
this->Deformation::SaveDefResul::MiseAJourGrandeurs_a_0(metrique);
// puis les variables propres à la facette
// on récupère des infos dans un conteneur qui normalement dans le cas de la déformation
// est correctement alimenté pour les grandeurs qui nous intéressent
// // récup du conteneur Expli_t_tdtFac c'est-à-dire des infos de la FACETTE !!!
Met_Sfe1* metSfe = (Met_Sfe1*) metrique;
const Met_abstraite::Expli_t_tdt& ex = metSfe->Conteneur_Expli_tdtFac();
// mise à jour des grandeurs à 0
*(meti_a_00.giB_) = *(ex.giB_0);*(meti_a_00.giH_) = *(ex.giH_0);
*(meti_a_00.gijBB_) = *(ex.gijBB_0);*(meti_a_00.gijHH_) = *(ex.gijHH_0);
*(meti_a_00.jacobien_) = *(ex.jacobien_0);
};
// mise à jour des grandeurs meti_a_tdt
void DeformationSfe1::SaveDefResulSfe1::MiseAJourGrandeurs_a_tdt(const Met_abstraite * metrique,const TenseurBB& Deps_BB)
{ // tout d'abord les variables de la classe mère
// là on sauvegarde les grandeurs au point courant (et non la facette), et qui sont sauvegardées
// dans le SaveDefResul initiale et non le spécifique sfe1
this->Deformation::SaveDefResul::MiseAJourGrandeurs_a_tdt(metrique,Deps_BB);
// puis les variables propres
// on récupère des infos dans un conteneur qui normalement dans le cas de la déformation
// est correctement alimenté pour les grandeurs qui nous intéressent
// récup du conteneur Expli_t_tdtFac c'est-à-dire des infos de la FACETTE !!!
Met_Sfe1* metSfe = (Met_Sfe1*) metrique;
const Met_abstraite::Expli_t_tdt& ex = metSfe->Conteneur_Expli_tdtFac();
// mise à jour des grandeurs à tdt
*(meti_a_tdt.giB_) = *(ex.giB_tdt);*(meti_a_tdt.giH_) = *(ex.giH_tdt);
*(meti_a_tdt.gijBB_) = *(ex.gijBB_tdt);*(meti_a_tdt.gijHH_) = *(ex.gijHH_tdt);
if (ex.gradVmoyBB_tdt != NULL) *(meti_a_tdt.gradVmoyBB_) = *(ex.gradVmoyBB_tdt);
if (ex.gradVBB_tdt != NULL) *(meti_a_tdt.gradVBB_) = *(ex.gradVBB_tdt);
*(meti_a_tdt.jacobien_) = *(ex.jacobien_tdt);
};