// 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 "ResRaid_MPI.h" #include #include #include #include namespace mpi = boost::mpi; // constructeur par défaut ResRaid_MPI::ResRaid_MPI(): res(NULL),raid(NULL),val_de_base() {}; // constructeur de copie ResRaid_MPI::ResRaid_MPI (const ResRaid_MPI& a): res(NULL),raid(NULL) ,val_de_base(a.val_de_base) { // création et affectation des vecteurs Creation_res_raid(true,a.res,a.raid); }; // fonction d'un resraid et d'un élément particulier // avec_recopie : indique si on veut une recopie ou pas // si false: c'est seulement les tailles qui sont utilisées ResRaid_MPI::ResRaid_MPI(const DeuxEntiers& elem, const Vecteur* ress, const Mat_pleine* raidd,bool avec_recopie): res(NULL),raid(NULL),val_de_base() { // on remplit val_de_base // 1) on dimensionne int taille = 2; // init avec les numéros if (ress != NULL) taille +=ress->Taille(); if (raidd != NULL) taille +=raidd->Nb_ligne() * raidd->Nb_colonne(); // mise à jour de la taille globale val_de_base.Change_taille(taille); // affectation des numéros val_de_base(1) = elem.un; val_de_base(2) = elem.deux; // création et affectation des vecteurs Creation_res_raid(avec_recopie,ress,raidd); }; // DESTRUCTEUR : ResRaid_MPI::~ResRaid_MPI() { // comme on a fait des new, il faut faire des delete delete res; delete raid; } ; // affectation à partir d'un élément particulier et d'un resraid // opération analogue à la construction, mais dédié à une instance déjà existante // correspond à la surcharge d'affectation, mais je préfère une fonction plus explicite ! // pour éviter des affectations non voulues void ResRaid_MPI::Affectation(const DeuxEntiers& elem, const Vecteur* ress, const Mat_pleine* raidd) {// tout d'abord les num // num_elt=elem.un; // num_maillage=elem.deux; // // puis les conteneurs // if (ress != NULL) // res = *(ress); // if (raidd != NULL) // raid = *(raidd); }; // 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 ResRaid_MPI::Lecture_base_info(ifstream& ent,const int cas) { // on suit exactement la même procédure que pour archive // load(ent,cas); }; // cas donne le niveau de sauvegarde // = 1 : on sauvegarde tout // = 2 : on sauvegarde uniquement les données variables (supposées comme telles) void ResRaid_MPI::Ecriture_base_info(ofstream& sort,const int cas) { // on suit exactement la même procédure que pour archive // save(sort,cas); }; // méthode interne pour créer les vecteurs tranches // ce qui crée une liaison entre les deux stockages // avec_recopie : indique si on veut une recopie ou pas void ResRaid_MPI::Creation_res_raid(bool avec_recopie,const Vecteur* ress, const Mat_pleine* raidd) { double * pt = val_de_base.Pointeur_vect(); // le début du tableau pt++; pt++; // on passe les numéros bool memoire = false; // on va faire des tranches if (ress != NULL) {int taille1 = ress->Taille(); // on crée un vecteur lié res = new Vecteur(taille1,pt,memoire); if (avec_recopie) // on recopie si c'est demandé *res = *ress; pt = &pt[2+taille1]; // on pointe sur le début de la suite }; if (raidd != NULL) {// on crée une matrice liée raid = new Mat_pleine(avec_recopie,pt,*raidd); }; }; // idem pour modifier éventuellement les tailles uniquement void ResRaid_MPI::Change_tailles_res_raid(bool avec_recopie,const Vecteur* ress, const Mat_pleine* raidd) { double * pt = val_de_base.Pointeur_vect(); // le début du tableau pt++; pt++; // on passe les numéros bool memoire = false; // on travaille avec des tranches #ifdef MISE_AU_POINT int taille_globale = 2; // init if (ress != NULL) taille_globale += ress->Taille(); if (raidd != NULL) taille_globale += raidd->Nb_ligne() * raidd->Nb_colonne(); if (taille_globale != val_de_base.Taille()) { cout << "\n*** Erreur : la taille de val_de_base: " << val_de_base.Taille() << " est differente de 2 + la taille du vecteur: " << ress->Taille() << " + la taille de la matrice : nb_lig*nb_col: " << raidd->Nb_ligne() * raidd->Nb_colonne(); cout << "ResRaid_MPI::Change_tailles_res_raid(.. \n" << endl; Sortie(1); } #endif //à continuer à modifier ... // if (ress != NULL) // {int taille1 = ress->Taille(); // // on crée un vecteur lié // res = new Vecteur(taille1,pt,memoire); // if (avec_recopie) // on recopie si c'est demandé // *res = *ress; // pt = &pt[2+taille1]; // on pointe sur le début de la suite // }; // if (raidd != NULL) // {// on crée une matrice liée // raid = new Mat_pleine(avec_recopie,pt,*raidd); // }; };