From 64dda8edabc61e1fd4ed4b3a07926b595772e459 Mon Sep 17 00:00:00 2001 From: nadir Date: Thu, 14 Oct 2004 08:19:59 +0000 Subject: [PATCH] Final version V2_0_1 whicjh work with Med File V2.1 --- .../INTERPOLATION/MEDMEM_Interpolation.hxx | 378 -------- .../MEDMEM_InterpolationHighLevelObjects.hxx | 453 --------- ...DMEM_InterpolationHighLevelObjects.hxx.old | 104 -- .../MEDMEM_InterpolationTools.hxx | 532 ---------- src/MEDMEM/INTERPOLATION/MEDMEM_Mapping.hxx | 258 ----- .../INTERPOLATION/MEDMEM_MappingTools.hxx | 241 ----- .../INTERPOLATION/MEDMEM_WrapperCells.hxx | 917 ------------------ .../MEDMEM_WrapperConnectivity.hxx | 61 -- .../INTERPOLATION/MEDMEM_WrapperField.hxx | 207 ---- .../INTERPOLATION/MEDMEM_WrapperMesh.hxx | 309 ------ .../INTERPOLATION/MEDMEM_WrapperNodes.hxx | 119 --- src/MEDMEM/INTERPOLATION/MEDMEM_dTree.hxx | 656 ------------- .../INTERPOLATION/MEDMEM_dTreeSommet.hxx | 59 -- src/MEDMEM/INTERPOLATION/Makefile.in | 100 -- .../INTERPOLATION/UseCaseInterpolationts.cxx | 78 -- .../UseCaseInterpolationwots.cxx | 43 - src/MEDMEM/INTERPOLATION/UseCaseMapping.cxx | 50 - .../INTERPOLATION/UseCaseWrapper_Maillage.cxx | 36 - src/MEDMEM/INTERPOLATION/UseCasedTree.cxx | 58 -- .../INTERPOLATION/create_mesh_interpolation.c | 523 ---------- .../test_MEDMEM_Interpolation.cxx | 56 -- .../test_MEDMEM_InterpolationFlipBack.cxx | 252 ----- ...st_MEDMEM_InterpolationFromMesh_toMesh.cxx | 56 -- ...st_MEDMEM_InterpolationRecopieMaillage.cxx | 156 --- ...EDMEM_InterpolationSansRecopieMaillage.cxx | 54 -- .../test_MEDMEM_InterpolationTimeStep.cxx | 108 --- 26 files changed, 5864 deletions(-) delete mode 100644 src/MEDMEM/INTERPOLATION/MEDMEM_Interpolation.hxx delete mode 100644 src/MEDMEM/INTERPOLATION/MEDMEM_InterpolationHighLevelObjects.hxx delete mode 100644 src/MEDMEM/INTERPOLATION/MEDMEM_InterpolationHighLevelObjects.hxx.old delete mode 100644 src/MEDMEM/INTERPOLATION/MEDMEM_InterpolationTools.hxx delete mode 100644 src/MEDMEM/INTERPOLATION/MEDMEM_Mapping.hxx delete mode 100644 src/MEDMEM/INTERPOLATION/MEDMEM_MappingTools.hxx delete mode 100644 src/MEDMEM/INTERPOLATION/MEDMEM_WrapperCells.hxx delete mode 100644 src/MEDMEM/INTERPOLATION/MEDMEM_WrapperConnectivity.hxx delete mode 100644 src/MEDMEM/INTERPOLATION/MEDMEM_WrapperField.hxx delete mode 100644 src/MEDMEM/INTERPOLATION/MEDMEM_WrapperMesh.hxx delete mode 100644 src/MEDMEM/INTERPOLATION/MEDMEM_WrapperNodes.hxx delete mode 100644 src/MEDMEM/INTERPOLATION/MEDMEM_dTree.hxx delete mode 100644 src/MEDMEM/INTERPOLATION/MEDMEM_dTreeSommet.hxx delete mode 100644 src/MEDMEM/INTERPOLATION/Makefile.in delete mode 100644 src/MEDMEM/INTERPOLATION/UseCaseInterpolationts.cxx delete mode 100644 src/MEDMEM/INTERPOLATION/UseCaseInterpolationwots.cxx delete mode 100644 src/MEDMEM/INTERPOLATION/UseCaseMapping.cxx delete mode 100644 src/MEDMEM/INTERPOLATION/UseCaseWrapper_Maillage.cxx delete mode 100644 src/MEDMEM/INTERPOLATION/UseCasedTree.cxx delete mode 100644 src/MEDMEM/INTERPOLATION/create_mesh_interpolation.c delete mode 100644 src/MEDMEM/INTERPOLATION/test_MEDMEM_Interpolation.cxx delete mode 100644 src/MEDMEM/INTERPOLATION/test_MEDMEM_InterpolationFlipBack.cxx delete mode 100644 src/MEDMEM/INTERPOLATION/test_MEDMEM_InterpolationFromMesh_toMesh.cxx delete mode 100644 src/MEDMEM/INTERPOLATION/test_MEDMEM_InterpolationRecopieMaillage.cxx delete mode 100644 src/MEDMEM/INTERPOLATION/test_MEDMEM_InterpolationSansRecopieMaillage.cxx delete mode 100644 src/MEDMEM/INTERPOLATION/test_MEDMEM_InterpolationTimeStep.cxx diff --git a/src/MEDMEM/INTERPOLATION/MEDMEM_Interpolation.hxx b/src/MEDMEM/INTERPOLATION/MEDMEM_Interpolation.hxx deleted file mode 100644 index d9aea1d85..000000000 --- a/src/MEDMEM/INTERPOLATION/MEDMEM_Interpolation.hxx +++ /dev/null @@ -1,378 +0,0 @@ -# ifndef INTERPOLATION_HXX -# define INTERPOLATION_HXX - -//template < class T> class FIELD; -//template < int > class Wrapper_Nuage; -//template < int > class Wrapper_Noeud; -//template class dTree; - -#include -#include "utilities.h" -#include "MEDMEM_Exception.hxx" -#include "MEDMEM_define.hxx" - -#include "MEDMEM_InterpolationHighLevelObjects.hxx" -#include "MEDMEM_Mesh.hxx" -#include "MEDMEM_Field.hxx" - -namespace MEDMEM { -class MESH; - -template class INTERPOLATION -{ -protected: - - FIELD * _fromField; - FIELD * _toField; - MESH * _fromMesh; - MESH * _toMesh; - - Meta_Wrapper * _fromWrapper; - Meta_Wrapper * _toWrapper; - - Meta_Mapping * _mapping; - -// only used when multi timestep are interpolated -// but always coherent - int _iType; - int _isConvexFromMesh; - -public : - - void init(); - - // Initialize INTERPOLATION in order to get : - // 1- the node number in the MESH which - // is the nearest from a given one ( use method : getNearestNode( double * node ) ); - // 2- the cell number (if exists) in the MESH which - // contains a specified node ( use method : getContainingCell ( double * node) ) - INTERPOLATION(const MESH & fromMesh ); - // Initialize INTERPOLATION in order to get : - // 1- the complete mapping ( use methode : getMapping() ) - // 2- the functionalities above - INTERPOLATION(const MESH & fromMesh,const MESH & toMesh ); - // Initialize INTERPOLATION in order to get the interpolation of on - // Moreover, all the others functionalities are so available - INTERPOLATION(const FIELD & fromField, const MESH & toMesh); - - ~INTERPOLATION( ); - - // Get the node number in the MESH which is the nearest from a given one - int getNearestNode ( double * node ); - // Get the cell number (if exists) in the MESH which contains a specified node - int getContainingCell ( double * node , int beginingCell=0, int flagIsConvexMesh=0 ); - // Get the complete mapping, defaultly, fromMesh is supposed to be non-convex, if it is false, set flagIsConvexMesh to 1 - vector getMapping ( int flagIsConvexMesh=0 ); - // Get the interpolated field toField - FIELD * interpolate( /*med_interpolation_type*/ int itype,int flagIsConvexFromMesh=0); - // reset the parameters in order not to redo the mapping (if the mesh are identical) - // and then get the interpoated field toField - // this method is specifictly used on multi-timestep (or order number) fields - // it has only to be used after the first step, the interpolation paramaters are the same for every step - FIELD * interpolateNextStep(const FIELD &nextFromField ,int & flagNewMapping); - -}; - -template void INTERPOLATION::init() { - - const char * LOC = "INTERPOLATION::init(): "; - - BEGIN_OF(LOC); - _fromField = ( FIELD * ) NULL; - _toField = ( FIELD * ) NULL; - _fromMesh = ( MESH * ) NULL; - _toMesh = ( MESH * ) NULL; - _fromWrapper = ( Meta_Wrapper * ) NULL; - _toWrapper = ( Meta_Wrapper * ) NULL; - _mapping = ( Meta_Mapping * ) NULL; - _iType = UNDEFINED ; - _isConvexFromMesh = UNDEFINED ; - END_OF(LOC); -} - - -template INTERPOLATION::INTERPOLATION(const MESH & fromMesh ) { - - const char * LOC = "INTERPOLATION::INTERPOLATION(MESH * fromMesh ) : "; - BEGIN_OF(LOC); - - init(); - - _fromMesh=const_cast (&fromMesh); - - if (! _fromMesh ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"fromMesh is a NULL pointer !")) ; - - int spaceDimension = _fromMesh->getSpaceDimension(); - if (spaceDimension != DIMENSION ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"The spaceDimension of mesh |" << _fromMesh->getName() << "| is |" << spaceDimension << "| and should be |" << DIMENSION << "|" << endl)) ; - - _fromWrapper = new Meta_Wrapper(_fromMesh->getNumberOfNodes(), - const_cast (_fromMesh->getCoordinates(MED_FULL_INTERLACE)), - const_cast (_fromMesh->getConnectivityptr()) - ); - - _mapping = new Meta_Mapping (_fromWrapper); - - END_OF(LOC); -}; - -template INTERPOLATION::INTERPOLATION(const MESH & fromMesh,const MESH & toMesh ) { - - const char * LOC = "INTERPOLATION::INTERPOLATION(MESH * fromMesh,,const MESH & toMesh) : "; - BEGIN_OF(LOC); - - init(); - - _fromMesh = const_cast ( &fromMesh ); - _toMesh = const_cast ( &toMesh ); - - if (! _fromMesh ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"fromMesh is a NULL pointer !")) ; - if (! _toMesh ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"toMesh is a NULL pointer !")) ; - - int fromSpaceDimension = _fromMesh->getSpaceDimension(); - int toSpaceDimension = _toMesh->getSpaceDimension(); - - if (fromSpaceDimension != DIMENSION ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"The spaceDimension of mesh |" << _fromMesh->getName() << "| is |" << spaceDimension << "| and should be |" << DIMENSION << "|" << endl)) ; - if ( toSpaceDimension != DIMENSION ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"The spaceDimension of mesh |" << _toMesh->getName() << "| is |" << spaceDimension << "| and should be |" << DIMENSION << "|" << endl)) ; - - _fromWrapper = new Meta_Wrapper(_fromMesh->getNumberOfNodes(), - const_cast (_fromMesh->getCoordinates(MED_FULL_INTERLACE)), - const_cast (_fromMesh->getConnectivityptr()) - ); - - _toWrapper = new Meta_Wrapper(_toMesh->getNumberOfNodes(), - const_cast (_toMesh->getCoordinates(MED_FULL_INTERLACE)) - ); - - _mapping = new Meta_Mapping (_fromWrapper); - - END_OF(LOC); -}; - -template INTERPOLATION::INTERPOLATION(const FIELD & fromField,const MESH & toMesh) { - - const char * LOC = "INTERPOLATION(const FIELD & field,const MESH & toMesh) : "; - BEGIN_OF(LOC); - - init(); - - _toMesh = const_cast(&toMesh); - _fromField = const_cast *>(&fromField); - - if ( ! _toMesh ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"toMesh is a NULL pointer !")) ; - if ( ! _fromField ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"field is a NULL pointer !")) ; - - _fromMesh = _fromField->getSupport()->getMesh(); - - if ( ! _fromMesh ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"fromMesh is a NULL pointer !")) ; - - _fromWrapper = new Meta_Wrapper(_fromMesh->getNumberOfNodes(), - const_cast (_fromMesh->getCoordinates(MED_FULL_INTERLACE)), - const_cast (_fromMesh->getConnectivityptr()), - const_cast *>(_fromField) - ); - - - _toWrapper = new Meta_Wrapper(_toMesh->getNumberOfNodes(), - const_cast (_toMesh->getCoordinates(MED_FULL_INTERLACE)) - ); - - - _mapping = new Meta_Mapping (_fromWrapper); - - - END_OF(LOC); -}; - -template INTERPOLATION::~INTERPOLATION() -{ - if ( _fromWrapper ) delete _fromWrapper ; - if ( _toWrapper ) delete _toWrapper ; - if ( _mapping ) delete _mapping ; -}; - -template int INTERPOLATION::getNearestNode( double * node ) { - - const char * LOC = "INTERPOLATION::getNearestNode( double * node ) "; - - BEGIN_OF(LOC); - - if ( ! _mapping ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"mapping is a NULL pointer !")) ; - - return _mapping->Donne_dTree()->trouve_plus_proche_point(Wrapper_Noeud (node) ); - - END_OF(LOC); - -}; - -template int INTERPOLATION::getContainingCell ( double * node , int beginingCell, int flagIsConvexMesh ) { - - const char * LOC = "INTERPOLATION::getContainingCell( double * node ) "; - - BEGIN_OF(LOC); - - if ( ! _mapping ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"mapping is a NULL pointer !")) ; - - _isConvexFromMesh=flagIsConvexMesh; - - _mapping->Cree_Mapping(_toWrapper,_isConvexFromMesh); - - return _mapping->Trouve_Maille_Contenant_Noeud(node,beginingCell,flagIsConvexMesh); - - END_OF(LOC); - -}; - -template vector INTERPOLATION::getMapping ( int flagIsConvexMesh ) { - - const char * LOC = "INTERPOLATION::getMapping( ) "; - - BEGIN_OF(LOC); - - if ( ! _mapping ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"mapping is a NULL pointer !")) ; - if ( ! _toWrapper ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"toWrapper is a NULL pointer !")) ; - - _isConvexFromMesh=flagIsConvexMesh; - - _mapping->Cree_Mapping(_toWrapper,_isConvexFromMesh); - - return _mapping->Get_Mapping(); - - END_OF(LOC); - -}; - -template FIELD * INTERPOLATION::interpolate(int itype,int flagIsConvexFromMesh) { - - const char * LOC = "INTERPOLATION::interpolate(int itype,int flagIsConvexFromMesh) "; - - BEGIN_OF(LOC); - - if ( ! _mapping ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"mapping is a NULL pointer !")) ; - if ( ! _toWrapper ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"toWrapper is a NULL pointer !")) ; - if ( ! _fromField ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"fromField is a NULL pointer !")) ; - - _iType=itype; - - _isConvexFromMesh=flagIsConvexFromMesh; - - _mapping->Cree_Mapping(_toWrapper,_isConvexFromMesh); - - Wrapper_Nuage_Noeud * toNodes = _toWrapper->Get_Nuage_Noeuds(); - - Wrapper_MED_Field resultat; - - /* - cout<<"Mapping"<affiche(); - cout<<"Mailles"<Get_Maillage()->DONNE_POINTEUR_NUAGEMAILLE()->affiche(); - cout<<"Noeuds"<Get_Nuage_Noeuds()->affiche(); - */ - - switch (_iType) - { - case 0 : // INTERPOLATION P0 - cout<<"Avant ="<,DIMENSION >(_mapping,_fromWrapper).Perform_Interpolation(toNodes); - break; - case 1 : // INTERPOLATION P-Hybride (Interpole avec la fonction d'interpolation naturelle de la maille contenant le point) - resultat=Meta_Interpolateur< Meta_Calcul_Interpolation_Hybride,DIMENSION >(_mapping,_fromWrapper).Perform_Interpolation(toNodes); - break; - case 2 : // INTERPOLATION (P/Q) 1 forcée (Interpole avec la fonction élément fini de la maille de degré 1 -meme si la maille est de degré supérieur-) - resultat=Meta_Interpolateur< Meta_Calcul_Interpolation_Hybride_P1, DIMENSION >(_mapping,_fromWrapper).Perform_Interpolation(toNodes); - break; - default : - throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Interpolation type "<; - - _toField->setName ( _fromField->getName() ); - _toField->setDescription ( _fromField->getDescription() ); - _toField->setNumberOfComponents ( _fromField->getNumberOfComponents() ); - _toField->setNumberOfValues ( _toMesh ->getNumberOfNodes() ); - _toField->setComponentsNames ( _fromField->getComponentsNames() ); - _toField->setComponentsDescriptions ( _fromField->getComponentsDescriptions() ); - _toField->setMEDComponentsUnits ( _fromField->getMEDComponentsUnits() ); - _toField->setIterationNumber ( _fromField->getIterationNumber() ); - _toField->setTime ( _fromField->getTime() ); - _toField->setOrderNumber ( _fromField->getOrderNumber() ); - _toField->setValueType ( MED_EN::MED_REEL64 ); - - SUPPORT * mySupport(new SUPPORT(_toMesh,"support",MED_NODE)); - _toField->setSupport(mySupport); - - _toField->allocValue(_toField->getNumberOfComponents(),_toField->getNumberOfValues()); - - _toField->setValue(MED_FULL_INTERLACE,resultat.Get_Valeurs()); - - _toWrapper->Construit_Wrapper_Champ(_toField); - - return _toField; - - END_OF(LOC); - -}; - -template FIELD * INTERPOLATION::interpolateNextStep(const FIELD & nextFromField, int & flagNewMapping) { - - const char * LOC = "INTERPOLATION::interpolateNextStep(int itype,int flagIsConvexFromMesh) "; - - BEGIN_OF(LOC); - - if ( ! _mapping ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"mapping is a NULL pointer !" )); - if ( ! _toWrapper ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"toWrapper is a NULL pointer !" )) ; - if ( ! _fromWrapper ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"fromWrapper is a NULL pointer !" )) ; - if ( ! _fromField ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"fromField is a NULL pointer !" )) ; - - - if ( ! _toField ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"toField is a NULL pointer, wrong use of interpolateNextStep" )) ; - if ( _iType==UNDEFINED ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"_iType is not defined, wrong use of interpolateNextStep" )) ; - if ( _isConvexFromMesh==UNDEFINED ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"_isConvexFromMesh is not defined, wrong use of interpolateNextStep" )) ; - - // delete _toField; ???????????????????????????? - - // if the mesh are identical, the mapping is the same, if not, the mapping has to be re-calculated - if (nextFromField.getSupport()->getMesh()->getName()!=_fromMesh->getName()) - { - - flagNewMapping=1; - - delete _mapping; - delete _fromWrapper; - - _fromField = const_cast *>(&nextFromField); - - _fromMesh = _fromField->getSupport()->getMesh(); - - _fromWrapper = new Meta_Wrapper(_fromMesh->getNumberOfNodes(), - const_cast (_fromMesh->getCoordinates(MED_FULL_INTERLACE)), - const_cast (_fromMesh->getConnectivityptr()), - const_cast *>(_fromField) - ); - _mapping = new Meta_Mapping (_fromWrapper); - - _mapping->Cree_Mapping(_toWrapper,_isConvexFromMesh); - - } - else - { - - flagNewMapping=0; - - _fromField = const_cast *>(&nextFromField); - _fromWrapper->Change_Champ(const_cast *>(_fromField)); - } - - return interpolate(_iType,_isConvexFromMesh); - -}; - -}; - -#endif - - diff --git a/src/MEDMEM/INTERPOLATION/MEDMEM_InterpolationHighLevelObjects.hxx b/src/MEDMEM/INTERPOLATION/MEDMEM_InterpolationHighLevelObjects.hxx deleted file mode 100644 index 8d12d901b..000000000 --- a/src/MEDMEM/INTERPOLATION/MEDMEM_InterpolationHighLevelObjects.hxx +++ /dev/null @@ -1,453 +0,0 @@ -#ifndef MEDMEM_INTERPOLATION_HIGHLEVEL_OBJECTS_HXX -#define MEDMEM_INTERPOLATION_HIGHLEVEL_OBJECTS_HXX - -#include "MEDMEM_Connectivity.hxx" -#include "MEDMEM_WrapperConnectivity.hxx" -#include "MEDMEM_dTree.hxx" -#include "MEDMEM_WrapperNodes.hxx" -#include "MEDMEM_WrapperMesh.hxx" -#include "MEDMEM_WrapperCells.hxx" -#include "MEDMEM_Mapping.hxx" -#include "MEDMEM_WrapperField.hxx" -#include "MEDMEM_InterpolationTools.hxx" - -////////////////////////////////////////////////////////////////// -/// /// -/// DECLARATIONS /// -/// /// -////////////////////////////////////////////////////////////////// - -template class Meta_Wrapper; - -/*********************************************************/ -/* */ -/* Meta_dTree */ -/* */ -/*********************************************************/ - -template class Meta_dTree : public dTree,Wrapper_Nuage_Noeud,DIMENSION> -{ -protected : - // PATCH - Wrapper_Nuage_Noeud * noeuds; - // FIN PATCH -public : - // PATCH - Meta_dTree():noeuds(NULL) {} - ~Meta_dTree() {if (noeuds) delete noeuds;} - Meta_dTree(int nbr_noeuds,double *coord):dTree,Wrapper_Nuage_Noeud,DIMENSION>(noeuds=new Wrapper_Nuage_Noeud(nbr_noeuds,coord)) {} - inline int trouve_plus_proche_point_bourrin(double *node); - // FIN PATCH - inline int trouve_plus_proche_point(double * node); -}; - -/*********************************************************/ -/* */ -/* Meta_Nuage_Maille */ -/* */ -/*********************************************************/ - - -class Meta_Nuage_Maille : public Wrapper_Nuage_Maille -{ -protected : - Wrapper_Med_Connectivity * connectivite_med; -public : - Meta_Nuage_Maille(CONNECTIVITY * connmed); - Meta_Nuage_Maille():connectivite_med(NULL) {} - ~Meta_Nuage_Maille() {if (connectivite_med) delete connectivite_med;} -}; - -/*********************************************************/ -/* */ -/* Meta_Maillage */ -/* */ -/*********************************************************/ - - -typedef Wrapper_Maillage Meta_Maillage; - -/*********************************************************/ -/* */ -/* Meta_Mapping */ -/* */ -/*********************************************************/ - -template class Meta_Mapping : public Mapping,Wrapper_Noeud,DIMENSION> -{ -public : - Meta_Mapping(Meta_Wrapper * MW):Mapping,Wrapper_Noeud,DIMENSION>(MW->Get_Maillage(),MW->Get_Nuage_Noeuds(),NULL) {} - Meta_Mapping(Meta_Wrapper * MW,Meta_Wrapper * TWB):Mapping,Wrapper_Noeud,DIMENSION>(MW->Get_Maillage(),MW->Get_Nuage_Noeuds(),TWB->Get_Nuage_Noeuds()) {} - // PATCH - inline void Cree_Mapping(Meta_Wrapper * MWB, int flag_convexe) {Mapping,Wrapper_Noeud,DIMENSION>::Cree_Mapping(MWB->Get_Nuage_Noeuds(),flag_convexe);} - inline void Cree_Mapping(int flag_convexe) {Mapping,Wrapper_Noeud,DIMENSION>::Cree_Mapping(flag_convexe);} - inline vector & Get_Mapping() {return Mapping,Wrapper_Noeud,DIMENSION>::Get_Mapping();} - //FIN PATCH - inline int Trouve_Maille_Contenant_Noeud(double * node,int num_maille, int flag_convexe=0); -}; - -/*********************************************************/ -/* */ -/* Meta_Wrapper */ -/* */ -/*********************************************************/ - - -template class Meta_Wrapper -{ -protected : - Wrapper_Nuage_Noeud * noeuds ; - Meta_Nuage_Maille * mailles ; - Meta_Maillage * maillage ; - Wrapper_MED_Field * champ ; - - void init( ){noeuds=NULL;mailles=NULL;maillage=NULL;champ=NULL;} -public : - Meta_Wrapper():noeuds(NULL),mailles(NULL),maillage(NULL),champ(NULL){} - ~Meta_Wrapper(); - inline void Construit_Wrapper_Nuage_Noeud ( int nn, double * nodes ); - inline void Construit_Wrapper_Nuage_Maille ( CONNECTIVITY * connmed ); - inline void Construit_Wrapper_Maillage ( void ); - inline void Construit_Wrapper_Champ ( const FIELD * medfield ); - Meta_Wrapper(int nn,double *nodes,CONNECTIVITY *connmed, int flag_maillage=1); - Meta_Wrapper(int nn,double *nodes); - // defaultly, the connectivity (neighbouhood and so like) is built, - // Set flag_mesh to 0 if you don't want these informations to be built - Meta_Wrapper(int nn,double *nodes,CONNECTIVITY *connmed, const FIELD * c,int flag_mesh=1); - // fonctions d'acces sures - inline Wrapper_Nuage_Noeud * Get_Nuage_Noeuds ( void ); - inline Meta_Nuage_Maille * Get_Nuage_Mailles ( void ); - inline Meta_Maillage * Get_Maillage ( void ); - inline Wrapper_MED_Field * Get_Champ ( void ); - inline void Change_Champ ( const FIELD * medfield ); -}; - -/*********************************************************/ -/* */ -/* Meta_Calcul_Interpolation_Hybride */ -/* */ -/*********************************************************/ - -template class Meta_Calcul_Interpolation_Hybride : public Calcul_Hybride,Wrapper_Nuage_Noeud,Wrapper_Noeud,Meta_Nuage_Maille> -{ -public : - Meta_Calcul_Interpolation_Hybride(Meta_Wrapper * MW):Calcul_Hybride,Wrapper_Nuage_Noeud,Wrapper_Noeud,Meta_Nuage_Maille>(MW->Get_Nuage_Noeuds(),MW->Get_Nuage_Mailles(),MW->Get_Champ()) {} - Valeur operator() (Wrapper_Noeud & node, int num_maille){return Calcul_Hybride,Wrapper_Nuage_Noeud,Wrapper_Noeud,Meta_Nuage_Maille>::operator()(node,num_maille);} - Valeur operator() (double * node, int num_maille) - { - static Wrapper_Noeud tmp; - tmp.positionne(node); - return Calcul_Hybride,Wrapper_Nuage_Noeud,Wrapper_Noeud,Meta_Nuage_Maille>(tmp,num_maille); - } -}; - -/*********************************************************/ -/* */ -/* Meta_Calcul_Interpolation_Hybride_P1 */ -/* */ -/*********************************************************/ - -template class Meta_Calcul_Interpolation_Hybride_P1 : public Calcul_Hybride,Wrapper_Nuage_Noeud,Wrapper_Noeud,Meta_Nuage_Maille> -{ -public : - Meta_Calcul_Interpolation_Hybride_P1(Meta_Wrapper * MW) - { - - Wrapper_Nuage_Noeud * nn = MW->Get_Nuage_Noeuds(); - Meta_Nuage_Maille * nm = MW->Get_Nuage_Mailles(); - Wrapper_MED_Field * c = MW->Get_Champ(); - - mailles=nm; - - fonctions[MED_TRIA3 ]=new Calcul_Interpolation_Tria3 ,Wrapper_Nuage_Noeud,Wrapper_Noeud,Meta_Nuage_Maille>(nn,nm,c); - fonctions[MED_QUAD4 ]=new Calcul_Interpolation_Quad4 ,Wrapper_Nuage_Noeud,Wrapper_Noeud,Meta_Nuage_Maille>(nn,nm,c); - fonctions[MED_TETRA4 ]=new Calcul_Interpolation_Tetra4 ,Wrapper_Nuage_Noeud,Wrapper_Noeud,Meta_Nuage_Maille>(nn,nm,c); - fonctions[MED_HEXA8 ]=new Calcul_Interpolation_Hexa8 ,Wrapper_Nuage_Noeud,Wrapper_Noeud,Meta_Nuage_Maille>(nn,nm,c); - fonctions[MED_PENTA6 ]=new Calcul_Interpolation_Penta6 ,Wrapper_Nuage_Noeud,Wrapper_Noeud,Meta_Nuage_Maille>(nn,nm,c); - fonctions[MED_PYRA5 ]=new Calcul_Interpolation_Pyra5 ,Wrapper_Nuage_Noeud,Wrapper_Noeud,Meta_Nuage_Maille>(nn,nm,c); - fonctions[MED_TRIA6 ]=fonctions[MED_TRIA3 ]; - fonctions[MED_QUAD8 ]=fonctions[MED_QUAD4 ]; - fonctions[MED_TETRA10]=fonctions[MED_TETRA4 ]; - fonctions[MED_HEXA20 ]=fonctions[MED_HEXA8 ]; - fonctions[MED_PENTA15]=fonctions[MED_PENTA6 ]; - fonctions[MED_PYRA13 ]=fonctions[MED_PYRA5 ]; - } - Valeur operator() (Wrapper_Noeud & node, int num_maille){return Calcul_Hybride,Wrapper_Nuage_Noeud,Wrapper_Noeud,Meta_Nuage_Maille>::operator()(node,num_maille);} - Valeur operator() (double * node, int num_maille) - { - static Wrapper_Noeud tmp; - tmp.positionne(node); - return Calcul_Hybride,Wrapper_Nuage_Noeud,Wrapper_Noeud,Meta_Nuage_Maille>(tmp,num_maille); - } -}; - -/*********************************************************/ -/* */ -/* Meta_Calcul_Interpolation_P0 */ -/* */ -/*********************************************************/ - -template class Meta_Calcul_Interpolation_P0 : public Calcul_Interpolation_P0,Wrapper_Nuage_Noeud,Wrapper_Noeud,Meta_Nuage_Maille> -{ -public : - Meta_Calcul_Interpolation_P0(Meta_Wrapper * MW):Calcul_Interpolation_P0,Wrapper_Nuage_Noeud,Wrapper_Noeud,Meta_Nuage_Maille>(MW->Get_Nuage_Noeuds(),MW->Get_Nuage_Mailles(),MW->Get_Champ()) {} - Valeur operator() (Wrapper_Noeud & node, int num_maille){return Calcul_Interpolation_P0,Wrapper_Nuage_Noeud,Wrapper_Noeud,Meta_Nuage_Maille>::operator()(node,num_maille);} - Valeur operator() (double * node, int num_maille) - { - static Wrapper_Noeud tmp; - tmp.positionne(node); - return Calcul_Interpolation_P0,Wrapper_Nuage_Noeud,Wrapper_Noeud,Meta_Nuage_Maille>(tmp,num_maille); - } -}; - -/*********************************************************/ -/* */ -/* Meta_Interpolateur */ -/* */ -/*********************************************************/ - -template class Meta_Interpolateur -{ -protected : - FONCTEUR * fct; - Meta_Mapping * mapping; - Meta_Wrapper * fromWrapper; -public : - Meta_Interpolateur():fct(NULL),mapping(NULL),fromWrapper(NULL) {} - Meta_Interpolateur(Meta_Mapping * map, Meta_Wrapper * mw):mapping(map),fromWrapper(mw),fct(new FONCTEUR(mw)){} - ~Meta_Interpolateur() {if (fct) delete fct;} - Wrapper_MED_Field Perform_Interpolation(Wrapper_Nuage_Noeud * toNodes) - { - int i; - - int ni=0; - int ne=0; - - int nbr_composantes = fromWrapper->Get_Champ()->Get_Nbr_Composantes(); - int nbr_valeurs = toNodes->SIZE(); - - double * valeurs=new double[nbr_valeurs*nbr_composantes]; - - Wrapper_MED_Field resultat(nbr_valeurs,nbr_composantes,valeurs); - - int nlpp,nmc; - - for (i=0;i OK ! "< inline void Meta_Wrapper::Construit_Wrapper_Nuage_Maille ( CONNECTIVITY * connmed ) - { - if (connmed) mailles=new Meta_Nuage_Maille(connmed); - else - { - cerr<<"Meta_Wrapper : CONNECTIVITY vide passée en argument au constructeur"< inline void Meta_Wrapper::Construit_Wrapper_Maillage ( void ) - { - if (mailles==NULL) - { - cerr<<"Meta_Wrapper : Le nuage de maille n'a pas été initialisé !"<SIZE()); - } -template inline void Meta_Wrapper::Construit_Wrapper_Champ ( const FIELD * medfield ) - { - if (medfield) champ=new Wrapper_MED_Field(medfield); - else - { - cerr<<"Meta_Wrapper : FIELD MED vide passé en argument au constructeur"< inline void Meta_Wrapper::Change_Champ ( const FIELD * medfield ) - { - if (medfield) - { - if (champ) delete champ; - champ=new Wrapper_MED_Field(medfield); - } - else - { - cerr<<"Meta_Wrapper : FIELD MED vide passé en argument Change_Champ"< Meta_Wrapper::Meta_Wrapper(int nn,double *nodes,CONNECTIVITY *connmed, int flag_maillage) - { - init(); - Construit_Wrapper_Nuage_Noeud(nn,nodes); - Construit_Wrapper_Nuage_Maille(connmed); - if (flag_maillage) Construit_Wrapper_Maillage(); - } -template Meta_Wrapper::Meta_Wrapper(int nn,double *nodes,CONNECTIVITY *connmed, const FIELD * c,int flag_maillage) - { - init(); - Construit_Wrapper_Nuage_Noeud(nn,nodes); - Construit_Wrapper_Nuage_Maille(connmed); - if (flag_maillage) Construit_Wrapper_Maillage(); - Construit_Wrapper_Champ(c); - } -template Meta_Wrapper::Meta_Wrapper(int nn,double *nodes) - { - init(); - Construit_Wrapper_Nuage_Noeud(nn,nodes); - } -template inline Wrapper_Nuage_Noeud * Meta_Wrapper::Get_Nuage_Noeuds ( void ) - { - if (noeuds) return noeuds; - else - { - cerr<<"Meta_Wrapper : Nuage noeuds demandé alors qu'il n'est pas construit !"< inline Meta_Nuage_Maille * Meta_Wrapper::Get_Nuage_Mailles ( void ) - { - if (mailles) return mailles ; - else - { - cerr<<"Meta_Wrapper : Nuage mailles demandé alors qu'il n'est pas construit !"< inline Meta_Maillage * Meta_Wrapper::Get_Maillage ( void ) - { - if (maillage) return maillage ; - else - { - cerr<<"Meta_Wrapper : Connectivitée maillage demandée alors qu'elle n'est pas construite !"< inline Wrapper_MED_Field * Meta_Wrapper::Get_Champ ( void ) - { - if (champ) return champ; - else - { - cerr<<"Meta_Wrapper : Champ demandé alors qu'il n'est pas construit !"< class Meta_dTree : public dTree,Wrapper_Nuage_Noeud,DIMENSION> -{ -protected : - Wrapper_Nuage_Noeud * nuagetmp; -public : - Meta_dTree(int nn,double * fullinterlace); - ~Meta_dTree() {if ((etat==DTREE_RACINE)&&(nuagetmp)) delete nuagetmp;} - inline int trouve_plus_proche_point(double *node); -}; - -class Meta_Nuage_Maille : public Wrapper_Nuage_Maille -{ -protected : - Wrapper_Med_Connectivity * connectivite_med; -public : - Meta_Nuage_Maille(CONNECTIVITY * connmed); - Meta_Nuage_Maille():Wrapper_Nuage_Maille(connectivite_med=new Wrapper_Med_Connectivity) {} - ~Meta_Nuage_Maille() {if (connectivite_med) delete connectivite_med;} -}; - - -typedef Wrapper_Maillage Meta_Maillage; - -template class Meta_Mapping : public Mapping,Wrapper_Noeud,DIMENSION> -{ -protected : - Wrapper_Nuage_Noeud * wrapping_nuage_source; - Wrapper_Nuage_Noeud * wrapping_nuage_cible; -public : - Meta_Mapping(Meta_Maillage * mb,double * noeudssource,int ns,double * noeudscible,int nc); - ~Meta_Mapping() {if (wrapping_nuage_source) delete wrapping_nuage_source;if (wrapping_nuage_cible) delete wrapping_nuage_cible;} - inline int Trouve_Maille_Contenant_Noeud(double * node,int num_maille, int flag_convexe=0); - double donne_valeur_interpolee_P1(double * node,vector vals); -}; - -// CODE - -template Meta_dTree::Meta_dTree(int nn,double * fullinterlace) -:dTree,Wrapper_Nuage_Noeud,DIMENSION> -(nuagetmp=new Wrapper_Nuage_Noeud(nn,fullinterlace)) - { - } - -template inline int Meta_dTree::trouve_plus_proche_point(double *node) - { - static Wrapper_Noeud nodetmp; - nodetmp.positionne(node); - return dTree,Wrapper_Nuage_Noeud,DIMENSION>::trouve_plus_proche_point(Wrapper_Noeud(nodetmp)); - } - -//* -Meta_Nuage_Maille::Meta_Nuage_Maille(CONNECTIVITY * conmed):Wrapper_Nuage_Maille(connectivite_med=new Wrapper_Med_Connectivity(conmed)) - { - } -//*/ - -template Meta_Mapping::Meta_Mapping(Meta_Maillage * mb,double * noeudssource,int ns,double * noeudscible,int nc) -:Mapping,Wrapper_Noeud,DIMENSION> -(mb, -wrapping_nuage_source=new Wrapper_Nuage_Noeud(ns,noeudssource), -wrapping_nuage_cible=new Wrapper_Nuage_Noeud(nc,noeudscible)) - { - } - -template inline int Meta_Mapping::Trouve_Maille_Contenant_Noeud(double * node,int num_maille,int flag_convexe) - { - int interdit=num_maille; - int max_loop=100; - int nme=0; - static Wrapper_Noeud nodetmp; - nodetmp.positionne(node); - return Mapping,Wrapper_Noeud,DIMENSION>::Trouve_Maille_Contenant_Point_Mth_Co(nodetmp,num_maille,interdit,max_loop,nme,flag_convexe); - } -template double Meta_Mapping::donne_valeur_interpolee_P1(double * node,vector vals) - { - int num_maille_contenant=Trouve_Maille_Contenant_Noeud(node,0); - double valeur_interpol=0; - vector valeurs=CB->Calcule_Coord_Baryc(num_maille_contenant,node); - int i; - int num_som; - for (i=0;i -#define _PARAM_ CHAMP,VALEURCHAMP,NUAGENOEUD,NOEUD,NUAGEMAILLE - -// ces macros définissent pour une face carrée plane la fonction projection sur cette face, non normalisée, la numérotation est dans le cas d'un hexaedre -#define face2367(x,y,z) ((x6*(-y2 + y3) + x3*(y2 - y6) + x2*(-y3 + y6))*z - x6*y3*z2 + x3*y6*z2 + x6*y2*z3 - x2*y6*z3 - x3*y2*z6 + x2*y3*z6 + y*(x6*(z2 - z3) + x2*(z3 - z6) + x3*(-z2 + z6)) + x*(y6*(-z2 + z3) + y3*(z2 - z6) + y2*(-z3 + z6))) -#define face4567(x,y,z) ((x6*(-y4 + y5) + x5*(y4 - y6) + x4*(-y5 + y6))*z - x6*y5*z4 + x5*y6*z4 + x6*y4*z5 - x4*y6*z5 - x5*y4*z6 + x4*y5*z6 + y*(x6*(z4 - z5) + x4*(z5 - z6) + x5*(-z4 + z6)) + x*(y6*(-z4 + z5) + y5*(z4 - z6) + y4*(-z5 + z6))) -#define face1256(x,y,z) ((x5*(-y1 + y2) + x2*(y1 - y5) + x1*(-y2 + y5))*z - x5*y2*z1 + x2*y5*z1 + x5*y1*z2 - x1*y5*z2 - x2*y1*z5 + x1*y2*z5 + y*(x5*(z1 - z2) + x1*(z2 - z5) + x2*(-z1 + z5)) + x*(y5*(-z1 + z2) + y2*(z1 - z5) + y1*(-z2 + z5))) -#define face0347(x,y,z) ((x4*(-y0 + y3) + x3*(y0 - y4) + x0*(-y3 + y4))*z - x4*y3*z0 + x3*y4*z0 + x4*y0*z3 - x0*y4*z3 - x3*y0*z4 + x0*y3*z4 + y*(x4*(z0 - z3) + x0*(z3 - z4) + x3*(-z0 + z4)) + x*(y4*(-z0 + z3) + y3*(z0 - z4) + y0*(-z3 + z4))) -#define face0145(x,y,z) ((x4*(-y0 + y1) + x1*(y0 - y4) + x0*(-y1 + y4))*z - x4*y1*z0 + x1*y4*z0 + x4*y0*z1 - x0*y4*z1 - x1*y0*z4 + x0*y1*z4 + y*(x4*(z0 - z1) + x0*(z1 - z4) + x1*(-z0 + z4)) + x*(y4*(-z0 + z1) + y1*(z0 - z4) + y0*(-z1 + z4))) -#define face0123(x,y,z) ((x2*(-y0 + y1) + x1*(y0 - y2) + x0*(-y1 + y2))*z - x2*y1*z0 + x1*y2*z0 + x2*y0*z1 - x0*y2*z1 - x1*y0*z2 + x0*y1*z2 + y*(x2*(z0 - z1) + x0*(z1 - z2) + x1*(-z0 + z2)) + x*(y2*(-z0 + z1) + y1*(z0 - z2) + y0*(-z1 + z2))) -// des macros définissent pour une face triangulaire orientée vers l'extérieur de la maille la fonction de projection, non normalisée ( =(12^13).1M ) -#define face(x1,y1,z1,x2,y2,z2,x3,y3,z3,x,y,z) ( ((y2-y1)*(z3-z1)-(z2-z1)*(y3-y1))*(x-x1)+((z2-z1)*(x3-x1)-(x2-x1)*(z3-z1))*(y-y1)+((x2-x1)*(y3-y1)-(y2-y1)*(x3-x1))*(z-z1) ) -#define projection(x1,y1,z1,x2,y2,z2,x3,y3,z3,x0,y0,z0,x,y,z) (face(x1,y1,z1,x2,y2,z2,x3,y3,z3,x,y,z)/face(x1,y1,z1,x2,y2,z2,x3,y3,z3,x0,y0,z0)) - -// DECLARATION - -_TEMPLATE_ class Calcul_Interpolation -{ -protected : - NUAGENOEUD * noeuds; - NUAGEMAILLE * mailles; - CHAMP * champ; -public : - Calcul_Interpolation():noeuds(NULL),mailles(NULL),champ(NULL) {} - Calcul_Interpolation(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):noeuds(nn),mailles(nm),champ(c) {} - ~Calcul_Interpolation() {} - virtual VALEURCHAMP operator() (const NOEUD & n, int num_maille) {cerr<<"APPEL OPERATOR() DE LA CLASSE MERE CALCUL_INTERPOLATION => EXIT(-1)"< *> fonctions; -public : - Calcul_Hybride():mailles(NULL) {} - Calcul_Hybride(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c); - ~Calcul_Hybride() {} - VALEURCHAMP operator() (const NOEUD & n, int num_maille); -}; - -//CODE - -_TEMPLATE_ Calcul_Hybride<_PARAM_>::Calcul_Hybride(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):mailles(nm) - { - fonctions[MED_TRIA3 ]=new Calcul_Interpolation_Tria3 <_PARAM_>(nn,nm,c); - fonctions[MED_TRIA6 ]=new Calcul_Interpolation_Tria6 <_PARAM_>(nn,nm,c); - fonctions[MED_QUAD4 ]=new Calcul_Interpolation_Quad4 <_PARAM_>(nn,nm,c); - fonctions[MED_QUAD8 ]=new Calcul_Interpolation_Quad8 <_PARAM_>(nn,nm,c); - fonctions[MED_TETRA4 ]=new Calcul_Interpolation_Tetra4 <_PARAM_>(nn,nm,c); - fonctions[MED_TETRA10]=new Calcul_Interpolation_Tetra10<_PARAM_>(nn,nm,c); - fonctions[MED_HEXA8 ]=new Calcul_Interpolation_Hexa8 <_PARAM_>(nn,nm,c); - fonctions[MED_HEXA20 ]=new Calcul_Interpolation_Hexa20 <_PARAM_>(nn,nm,c); - fonctions[MED_PENTA6 ]=new Calcul_Interpolation_Penta6 <_PARAM_>(nn,nm,c); - fonctions[MED_PENTA15]=new Calcul_Interpolation_Penta15<_PARAM_>(nn,nm,c); - fonctions[MED_PYRA5 ]=new Calcul_Interpolation_Pyra5 <_PARAM_>(nn,nm,c); - fonctions[MED_PYRA13 ]=new Calcul_Interpolation_Pyra13 <_PARAM_>(nn,nm,c); - } - -_TEMPLATE_ VALEURCHAMP Calcul_Hybride<_PARAM_>::operator() (const NOEUD & n, int num_maille) - { - return fonctions[(*mailles)[num_maille].DONNE_TYPE_MED_MAILLE()]->operator()(n,num_maille); - } - -_TEMPLATE_ class Calcul_Interpolation_P0 : public Calcul_Interpolation<_PARAM_> -{ -public : Calcul_Interpolation_P0(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {} -public : VALEURCHAMP operator() (const NOEUD & n, int num_maille) - { - return (*champ)[num_maille]; - } -}; -_TEMPLATE_ class Calcul_Interpolation_Tria3 : public Calcul_Interpolation<_PARAM_> -{ -public : Calcul_Interpolation_Tria3(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {} -public : VALEURCHAMP operator() (const NOEUD & n, int num_maille) - { - int num0=(*mailles)[num_maille][0]; - int num1=(*mailles)[num_maille][1]; - int num2=(*mailles)[num_maille][2]; - - double x0=(*noeuds)[num0][0]; - double y0=(*noeuds)[num0][1]; - double x1=(*noeuds)[num1][0]; - double y1=(*noeuds)[num1][1]; - double x2=(*noeuds)[num2][0]; - double y2=(*noeuds)[num2][1]; - - VALEURCHAMP v0=(*champ)[num0]; - VALEURCHAMP v1=(*champ)[num1]; - VALEURCHAMP v2=(*champ)[num2]; - - double x=n[0]; - double y=n[1]; - - double lambda0=(y1-y2)*x+(x2-x1)*y+(x1*y2-x2*y1); - double lambda1=(y2-y0)*x+(x0-x2)*y+(x2*y0-x0*y2); - double lambda2=(y0-y1)*x+(x1-x0)*y+(x0*y1-x1*y0); - - double delta = (x2-x1)*y0+(x0-x2)*y1+(x1-x0)*y2; - - VALEURCHAMP retour(v0.SIZE()); - - retour=(1/delta)*(lambda0*v0+lambda1*v1+lambda2*v2); - - return retour; // - } -}; -_TEMPLATE_ class Calcul_Interpolation_Tria6 : public Calcul_Interpolation<_PARAM_> -{ -public : Calcul_Interpolation_Tria6(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {} -public : VALEURCHAMP operator() (const NOEUD & n, int num_maille) - { - // ON SUPPOSE IMPLICITEMENT QUE LES NOEUDS SUPPLEMENTAIRES SONT BIEN DES NOEUDS MILIEUX - int num0 =(*mailles)[num_maille][0]; - int num1 =(*mailles)[num_maille][1]; - int num2 =(*mailles)[num_maille][2]; - int num01=(*mailles)[num_maille][3]; - int num12=(*mailles)[num_maille][4]; - int num20=(*mailles)[num_maille][5]; - - double x0=(*noeuds)[num0][0]; - double y0=(*noeuds)[num0][1]; - double x1=(*noeuds)[num1][0]; - double y1=(*noeuds)[num1][1]; - double x2=(*noeuds)[num2][0]; - double y2=(*noeuds)[num2][1]; - - VALEURCHAMP v0=(*champ)[num0]; - VALEURCHAMP v1=(*champ)[num1]; - VALEURCHAMP v2=(*champ)[num2]; - VALEURCHAMP v01=(*champ)[num01]; - VALEURCHAMP v12=(*champ)[num12]; - VALEURCHAMP v20=(*champ)[num20]; - - double x=n[0]; - double y=n[1]; - - double lambda0=(y1-y2)*x+(x2-x1)*y+(x1*y2-x2*y1); - double lambda1=(y2-y0)*x+(x0-x2)*y+(x2*y0-x0*y2); - double lambda2=(y0-y1)*x+(x1-x0)*y+(x0*y1-x1*y0); - - double delta = (x2-x1)*y0+(x0-x2)*y1+(x1-x0)*y2; - - - // VALEURCHAMP retour(v0.SIZE()); // - - return 2*(lambda0*lambda0*v0+ - lambda1*lambda1*v1+ - lambda2*lambda2*v2+ - 2*(lambda0*lambda1*v01+ - lambda1*lambda2*v12+ - lambda2*lambda0*v20))/(delta*delta)+ - (lambda0*v0+lambda1*v1+lambda2*v2)/(-delta); - - // return retour; // - } -}; -_TEMPLATE_ class Calcul_Interpolation_Quad4 : public Calcul_Interpolation<_PARAM_> -{ -public : Calcul_Interpolation_Quad4(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {} -public : VALEURCHAMP operator() (const NOEUD & n, int num_maille) - { - int num0=(*mailles)[num_maille][0]; - int num1=(*mailles)[num_maille][1]; - int num2=(*mailles)[num_maille][2]; - int num3=(*mailles)[num_maille][3]; - - double x0=(*noeuds)[num0][0]; - double y0=(*noeuds)[num0][1]; - double x1=(*noeuds)[num1][0]; - double y1=(*noeuds)[num1][1]; - double x2=(*noeuds)[num2][0]; - double y2=(*noeuds)[num2][1]; - double x3=(*noeuds)[num3][0]; - double y3=(*noeuds)[num3][1]; - - VALEURCHAMP v0=(*champ)[num0]; - VALEURCHAMP v1=(*champ)[num1]; - VALEURCHAMP v2=(*champ)[num2]; - VALEURCHAMP v3=(*champ)[num3]; - - double x=n[0]; - double y=n[1]; - - - double mu0=-((x3*(y1-y2)+x1*(y2-y3)+x2*(y3-y1))*x*y+(x2*y2*(y1-y3)+x3*(-y1+y2)*y3+x1*y1*(y3-y2))*x+(x2*x3*(y2-y3)+x1*(x2*(y1-y2)+x3*(y3-y1)))*y+(x2*x3*y1*(y3-y2)+x1*(x3*y2*(y1-y3)+x2*(y2-y1)*y3))); - double mu1=(x0*(y2-y3)+x2*(y3-y0)+x3*(y0-y2))*x*y+(x3*y3*(y2-y0)+x0*(-y2+y3)*y0+x2*y2*(y0-y3))*x+(x3*x0*(y3-y0)+x2*(x3*(y2-y3)+x0*(y0-y2)))*y+(x2*x0*y2*(y0-y2)+x2*(x0*y2*(y2-y0)+x3*(y3-y2)*y0)); - double mu2=-((x1*(y3-y0)+x3*(y0-y1)+x0*(y1-y3))*x*y+(x0*y0*(y3-y1)+x1*(-y3+y0)*y1+x3*y3*(y1-y0))*x+(x0*x1*(y0-y1)+x3*(x0*(y3-y0)+x1*(y1-y3)))*y+(x3*x1*y3*(y1-y2)+x3*(x1*y2*(y3-y1)+x0*(y0-y3)*y1))); - double mu3=(x2*(y0-y1)+x0*(y1-y2)+x1*(y2-y0))*x*y+(x1*y1*(y0-y2)+x2*(-y0+y1)*y2+x0*y0*(y2-y1))*x+(x1*x2*(y1-y2)+x0*(x1*(y0-y1)+x2*(y2-y0)))*y+(x0*x2*y0*(y2-y2)+x0*(x2*y2*(y0-y2)+x1*(y1-y0)*y2)); - - double delta=(y0-y2)*(y1-y3)*(x0*x2+x1*x3)-(x1*x2+x0*x3)*(y1-y2)*(y0-y3)-(x0*x1+x2*x3)*(y0-y1)*(y2-y3); - - /* - cout<<" ### Pour ( "< -{ -public : Calcul_Interpolation_Tetra4(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {} -public : VALEURCHAMP operator() (const NOEUD & n, int num_maille) - { - int num0=(*mailles)[num_maille][0]; - int num1=(*mailles)[num_maille][1]; - int num2=(*mailles)[num_maille][2]; - int num3=(*mailles)[num_maille][3]; - - double x0=(*noeuds)[num0][0]; - double y0=(*noeuds)[num0][1]; - double z0=(*noeuds)[num0][2]; - double x1=(*noeuds)[num1][0]; - double y1=(*noeuds)[num1][1]; - double z1=(*noeuds)[num1][2]; - double x2=(*noeuds)[num2][0]; - double y2=(*noeuds)[num2][1]; - double z2=(*noeuds)[num2][2]; - double x3=(*noeuds)[num3][0]; - double y3=(*noeuds)[num3][1]; - double z3=(*noeuds)[num3][2]; - - VALEURCHAMP v0=(*champ)[num0]; - VALEURCHAMP v1=(*champ)[num1]; - VALEURCHAMP v2=(*champ)[num2]; - VALEURCHAMP v3=(*champ)[num3]; - - double x=n[0]; - double y=n[1]; - double z=n[2]; - - double lambda0=face(x1,y1,z1,x2,y2,z2,x3,y3,z3,x,y,z)/face(x1,y1,z1,x2,y2,z2,x3,y3,z3,x0,y0,z0); - double lambda1=face(x0,y0,z0,x2,y2,z2,x3,y3,z3,x,y,z)/face(x0,y0,z0,x2,y2,z2,x3,y3,z3,x1,y1,z1); - double lambda2=face(x1,y1,z1,x0,y0,z0,x3,y3,z3,x,y,z)/face(x1,y1,z1,x0,y0,z0,x3,y3,z3,x2,y2,z2); - double lambda3=face(x1,y1,z1,x2,y2,z2,x0,y0,z0,x,y,z)/face(x1,y1,z1,x2,y2,z2,x0,y0,z0,x3,y3,z3); - - VALEURCHAMP retour(v0.SIZE()); // - - retour=(lambda0*v0+lambda1*v1+lambda2*v2+lambda3*v3); - - return retour; // - } -}; -_TEMPLATE_ class Calcul_Interpolation_Tetra10 : public Calcul_Interpolation<_PARAM_> -{ -public : Calcul_Interpolation_Tetra10(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {} -public : VALEURCHAMP operator() (const NOEUD & n, int num_maille) - { - // ON SUPPOSE IMPLICITEMENT QUE LES NOEUDS SUPPLEMENTAIRES SONT BIEN DES NOEUDS MILIEUX - int num0 =(*mailles)[num_maille][0]; - int num1 =(*mailles)[num_maille][1]; - int num2 =(*mailles)[num_maille][2]; - int num3 =(*mailles)[num_maille][3]; - int num01=(*mailles)[num_maille][4]; - int num02=(*mailles)[num_maille][6]; - int num03=(*mailles)[num_maille][7]; - int num12=(*mailles)[num_maille][5]; - int num13=(*mailles)[num_maille][8]; - int num23=(*mailles)[num_maille][9]; - - double x0=(*noeuds)[num0][0];double y0=(*noeuds)[num0][1];double z0=(*noeuds)[num0][2]; - double x1=(*noeuds)[num1][0];double y1=(*noeuds)[num1][1];double z1=(*noeuds)[num1][2]; - double x2=(*noeuds)[num2][0];double y2=(*noeuds)[num2][1];double z2=(*noeuds)[num2][2]; - double x3=(*noeuds)[num3][0];double y3=(*noeuds)[num3][1];double z3=(*noeuds)[num3][2]; - - VALEURCHAMP v0=(*champ)[num0]; - VALEURCHAMP v1=(*champ)[num1]; - VALEURCHAMP v2=(*champ)[num2]; - VALEURCHAMP v3=(*champ)[num3]; - VALEURCHAMP v01=(*champ)[num01]; - VALEURCHAMP v02=(*champ)[num02]; - VALEURCHAMP v03=(*champ)[num03]; - VALEURCHAMP v12=(*champ)[num12]; - VALEURCHAMP v13=(*champ)[num13]; - VALEURCHAMP v23=(*champ)[num23]; - - double x=n[0]; - double y=n[1]; - double z=n[2]; - - double lambda0=face(x1,y1,z1,x2,y2,z2,x3,y3,z3,x,y,z)/face(x1,y1,z1,x2,y2,z2,x3,y3,z3,x0,y0,z0); - double lambda1=face(x0,y0,z0,x2,y2,z2,x3,y3,z3,x,y,z)/face(x0,y0,z0,x2,y2,z2,x3,y3,z3,x1,y1,z1); - double lambda2=face(x1,y1,z1,x0,y0,z0,x3,y3,z3,x,y,z)/face(x1,y1,z1,x0,y0,z0,x3,y3,z3,x2,y2,z2); - double lambda3=face(x1,y1,z1,x2,y2,z2,x0,y0,z0,x,y,z)/face(x1,y1,z1,x2,y2,z2,x0,y0,z0,x3,y3,z3); - - /* - cout<<" ### Pour ( "< -{ -public : Calcul_Interpolation_Penta6(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {} -public : VALEURCHAMP operator() (const NOEUD & n, int num_maille) - { - int num0=(*mailles)[num_maille][0]; - int num1=(*mailles)[num_maille][1]; - int num2=(*mailles)[num_maille][2]; - int num3=(*mailles)[num_maille][3]; - int num4=(*mailles)[num_maille][4]; - int num5=(*mailles)[num_maille][5]; - - double x0=(*noeuds)[num0][0];double y0=(*noeuds)[num0][1];double z0=(*noeuds)[num0][2]; - double x1=(*noeuds)[num1][0];double y1=(*noeuds)[num1][1];double z1=(*noeuds)[num1][2]; - double x2=(*noeuds)[num2][0];double y2=(*noeuds)[num2][1];double z2=(*noeuds)[num2][2]; - double x3=(*noeuds)[num3][0];double y3=(*noeuds)[num3][1];double z3=(*noeuds)[num3][2]; - double x4=(*noeuds)[num4][0];double y4=(*noeuds)[num4][1];double z4=(*noeuds)[num4][2]; - double x5=(*noeuds)[num5][0];double y5=(*noeuds)[num5][1];double z5=(*noeuds)[num5][2]; - - VALEURCHAMP v0=(*champ)[num0]; - VALEURCHAMP v1=(*champ)[num1]; - VALEURCHAMP v2=(*champ)[num2]; - VALEURCHAMP v3=(*champ)[num3]; - VALEURCHAMP v4=(*champ)[num4]; - VALEURCHAMP v5=(*champ)[num5]; - - double x=n[0]; - double y=n[1]; - double z=n[2]; - - double mu0=face(x1,y1,z1,x2,y2,z2,x5,y5,z5,x,y,z)*face(x3,y3,z3,x4,y4,z4,x5,y5,z5,x,y,z)/(face(x1,y1,z1,x2,y2,z2,x5,y5,z5,x0,y0,z0)*face(x3,y3,z3,x4,y4,z4,x5,y5,z5,x0,y0,z0)); - double mu1=face(x0,y0,z0,x2,y2,z2,x5,y5,z5,x,y,z)*face(x3,y3,z3,x4,y4,z4,x5,y5,z5,x,y,z)/(face(x0,y0,z0,x2,y2,z2,x5,y5,z5,x1,y1,z1)*face(x3,y3,z3,x4,y4,z4,x5,y5,z5,x1,y1,z1)); - double mu2=face(x0,y0,z0,x1,y1,z1,x4,y4,z4,x,y,z)*face(x3,y3,z3,x4,y4,z4,x5,y5,z5,x,y,z)/(face(x0,y0,z0,x1,y1,z1,x4,y4,z4,x2,y2,z2)*face(x3,y3,z3,x4,y4,z4,x5,y5,z5,x2,y2,z2)); - double mu3=face(x1,y1,z1,x2,y2,z2,x5,y5,z5,x,y,z)*face(x0,y0,z0,x1,y1,z1,x2,y2,z2,x,y,z)/(face(x1,y1,z1,x2,y2,z2,x5,y5,z5,x3,y3,z3)*face(x0,y0,z0,x1,y1,z1,x2,y2,z2,x3,y3,z3)); - double mu4=face(x0,y0,z0,x2,y2,z2,x5,y5,z5,x,y,z)*face(x0,y0,z0,x1,y1,z1,x2,y2,z2,x,y,z)/(face(x0,y0,z0,x2,y2,z2,x5,y5,z5,x4,y4,z4)*face(x0,y0,z0,x1,y1,z1,x2,y2,z2,x4,y4,z4)); - double mu5=face(x0,y0,z0,x1,y1,z1,x4,y4,z4,x,y,z)*face(x0,y0,z0,x1,y1,z1,x2,y2,z2,x,y,z)/(face(x0,y0,z0,x1,y1,z1,x4,y4,z4,x5,y5,z5)*face(x0,y0,z0,x1,y1,z1,x2,y2,z2,x5,y5,z5)); - - VALEURCHAMP retour(v0.SIZE()); // - - retour=(mu0*v0+mu1*v1+mu2*v2+mu3*v3+mu4*v4+mu5*v5); - - return retour; // - } -}; -_TEMPLATE_ class Calcul_Interpolation_Penta15 : public Calcul_Interpolation<_PARAM_> -{ -public : Calcul_Interpolation_Penta15(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {} -public : VALEURCHAMP operator() (const NOEUD & n, int num_maille) - { - cerr<<"Interpolation Pe2 pasencore implémentée"< -{ -public : Calcul_Interpolation_Pyra5(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {} -public : VALEURCHAMP operator() (const NOEUD & n, int num_maille) - { - // NON TESTE - int num0=(*mailles)[num_maille][0]; - int num1=(*mailles)[num_maille][1]; - int num2=(*mailles)[num_maille][2]; - int num3=(*mailles)[num_maille][3]; - int num4=(*mailles)[num_maille][4]; - - double x0=(*noeuds)[num0][0];double y0=(*noeuds)[num0][1];double z0=(*noeuds)[num0][2]; - double x1=(*noeuds)[num1][0];double y1=(*noeuds)[num1][1];double z1=(*noeuds)[num1][2]; - double x2=(*noeuds)[num2][0];double y2=(*noeuds)[num2][1];double z2=(*noeuds)[num2][2]; - double x3=(*noeuds)[num3][0];double y3=(*noeuds)[num3][1];double z3=(*noeuds)[num3][2]; - double x4=(*noeuds)[num4][0];double y4=(*noeuds)[num4][1];double z4=(*noeuds)[num4][2]; - - VALEURCHAMP v0=(*champ)[num0]; - VALEURCHAMP v1=(*champ)[num1]; - VALEURCHAMP v2=(*champ)[num2]; - VALEURCHAMP v3=(*champ)[num3]; - VALEURCHAMP v4=(*champ)[num4]; - - double x=n[0]; - double y=n[1]; - double z=n[2]; - - double mu0=face(x1,y1,z1,x2,y2,z2,x4,y4,z4,x,y,z)*face(x2,y2,z2,x3,y3,z3,x4,y4,z4,x,y,z)/(face(x1,y1,z1,x2,y2,z2,x4,y4,z4,x0,y0,z0)*face(x2,y2,z2,x3,y3,z3,x4,y4,z4,x0,y0,z0)); - double mu1=face(x0,y0,z0,x3,y3,z3,x4,y4,z4,x,y,z)*face(x2,y2,z2,x3,y3,z3,x4,y4,z4,x,y,z)/(face(x0,y0,z0,x3,y3,z3,x4,y4,z4,x1,y1,z1)*face(x2,y2,z2,x3,y3,z3,x4,y4,z4,x1,y1,z1)); - double mu2=face(x0,y0,z0,x1,y1,z1,x4,y4,z4,x,y,z)*face(x0,y0,z0,x3,y3,z3,x4,y4,z4,x,y,z)/(face(x0,y0,z0,x1,y1,z1,x4,y4,z4,x2,y2,z2)*face(x0,y0,z0,x3,y3,z3,x4,y4,z4,x2,y2,z2)); - double mu3=face(x0,y0,z0,x1,y1,z1,x4,y4,z4,x,y,z)*face(x1,y1,z1,x2,y2,z2,x4,y4,z4,x,y,z)/(face(x0,y0,z0,x1,y1,z1,x4,y4,z4,x3,y3,z3)*face(x1,y1,z1,x2,y2,z2,x4,y4,z4,x3,y3,z3)); - double mu4=face(x0,y0,z0,x1,y1,z1,x2,y2,z2,x,y,z)/face(x0,y0,z0,x1,y1,z1,x2,y2,z2,x4,y4,z4); - - VALEURCHAMP retour(v0.SIZE()); // - - retour=(mu0*v0+mu1*v1+mu2*v2+mu3*v3+mu4*v4); - - return retour; // - } -}; -_TEMPLATE_ class Calcul_Interpolation_Pyra13 : public Calcul_Interpolation<_PARAM_> -{ -public : Calcul_Interpolation_Pyra13(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {} -public : VALEURCHAMP operator() (const NOEUD & n, int num_maille) - { - cerr<<"Interpolation Py2 pasencore implémentée"< -#define _MAPPING_ Mapping - - -////////////////////////////////////////////////////////////////// -/// /// -/// DECLARATIONS /// -/// /// -////////////////////////////////////////////////////////////////// - -/*********************************************************/ -/* */ -/* Classe Mapping */ -/* */ -/*********************************************************/ - -// ATTENTION LE NUAGE DE NOEUD EST SUPPOSE NON REDONDANT ET AUCUNE VERIFICATION N'EST FAITE ! - -template class Mapping -{ -protected : - MAILLAGE * maillage_back; - NUAGEMAILLE * mailles_back; - NUAGENOEUD * noeuds_back; - NUAGENOEUD * noeuds_front; - Coordonnees_Barycentriques * CB; - dTree * my_dTree; - vector resultat_mapping; - vector point_le_plus_proche; - -public : - - Mapping():maillage_back(NULL),mailles_back(NULL),noeuds_back(NULL),noeuds_front(NULL),CB(NULL),my_dTree(NULL) {} - Mapping(MAILLAGE * mb,NUAGENOEUD * nb,NUAGENOEUD * nf); // le dTree est crée à l'initialisation, par contre, le mapping lui meme doit etre invoqué - ~Mapping() {if (CB) delete CB;if (my_dTree) delete my_dTree;} - dTree * Donne_dTree() {return my_dTree;} - int Donne_Directions(int num_maille,const NOEUD &n,int etat_face[NBR_FACES_MAX]); - // Méthode interne de localisation - int Trouve_Maille_Contenant_Point_Mth_Co(const NOEUD &n,int num_maille,int num_maille_interdit,int max_loop,int &nbr_mailles_examinees,int flag_convexe); - void Cree_Mapping(int flag_convexe=0); // SUPPOSE NON CONVEXE PAR DEFAUT - void Cree_Mapping(NUAGENOEUD * nf, int flag_convexe=0); // SUPPOSE NON CONVEXE PAR DEFAUT - inline int operator[](int i) const {return resultat_mapping[i];} // Renvoie la valeur mappé, si le mapping a été fait, sinon, n'importe quoi - inline vector & Get_Mapping() {return resultat_mapping;} // Renvoie le vector contenant le mapping - inline int Get_Noeud_Le_Plus_Proche(int i) const {return point_le_plus_proche[i];} // Invoque la méthode de d-Tree qui donne le noeud le plus proche - inline int Exist_dTree() const {return (my_dTree);} // Teste si le dTree existe - void affiche() - { - for (int i=0;iSIZE(); - int num_maille_depart; - int nma=0; - resultat_mapping = vector(nbr_noeuds,UNDEFINED); - point_le_plus_proche = vector(nbr_noeuds,UNDEFINED); - - // noeuds_back->affiche(); - - for (i=0;itrouve_plus_proche_point((*noeuds_front)[i]); - num_maille_depart=maillage_back->DONNE_PREMIERE_MAILLE_CONTENANT(point_le_plus_proche[i]); - resultat_mapping[i]=Trouve_Maille_Contenant_Point_Mth_Co((*noeuds_front)[i],num_maille_depart,num_maille_depart,NBR_MAX_MAILLES_EXAMINEES,nma,flag_convexe); - } - } - - else - { - cout<<"Le mapping semble déja existé, interrogation sur l'existant"<DONNE_POINTEUR_NUAGEMAILLE(); - - CB=new Coordonnees_Barycentriques(mailles_back,noeuds_back); - - // TEST REDONDANCE - /* - int nnb=noeuds_back->SIZE(); - if (nnb<20000) - { - cout<<"MAPPING : VERIFICATION REDONDANCES DANS NUAGE NOEUD BACK"<affiche(); - int i,j; - vector redondance(nnb,0); - for (i=0;i(noeuds_back); - - } -// Renvoie : -// 1 si le point est intérieur -// -1 si le point est extérieur à la maille via uniquement des faces qui ne sont pas au bord -// -2 si le point est extérieur à la maille par au moins une face de bord -// Et modifie etat_face de telle sorte que : -// etat_face[i] = -1 s'il n'existe pas de voisin via la face i -// etat_face[i] = 0 si le point est intérieur via la face i et que le voisin i existe -// etat_face[i] = 1 si le point est extérieur via la face i et que le voisin i existe -_TEMPLATE_ int _MAPPING_::Donne_Directions(int num_maille,const NOEUD &n,int etat_face[NBR_FACES_MAX]) - { - vector ef=CB->Donne_Pseudo_Coord_Baryc(num_maille,n); - int etat_int=VRAI; - int etat_ext_bord=FAUX; - int tf,tv,tb; - int nbr_faces=(*mailles_back)[num_maille].DONNE_NBR_FACES(); - for (int i=0;iDONNE_VOISIN_DE_MAILLE(num_maille,i)==UNDEFINED); - tb=(maillage_back->EST_AU_BORD_FACE_DE_MAILLE(num_maille,i)); - if (tf) - { - etat_int=FAUX; - if (tb) etat_ext_bord=VRAI; - } - if (tv) etat_face[i]=-1; - else - { - if (tf) etat_face[i]=1; - else etat_face[i]=0; - } - } - if (etat_int) return 1; - if (etat_ext_bord) return -2; - return -1; - } -_TEMPLATE_ int _MAPPING_::Trouve_Maille_Contenant_Point_Mth_Co(const NOEUD &n,int num_maille,int num_maille_interdit,int max_loop,int &nbr_mailles_examinees,int flag_convexe) - { - - int etat_face[NBR_FACES_MAX]; - int i,tmp,nbr_rnd; - int indirection[NBR_FACES_MAX]; - int ind_reel; - int num_reel; - int new_num=UNDEFINED; - - int test=Donne_Directions(num_maille,n,etat_face); - - int nbr_faces=maillage_back->DONNE_NBR_FACES_MAILLE(num_maille); - - for (i=0;iDONNE_VOISIN_DE_MAILLE(num_maille,ind_reel); - if ((etat_face[ind_reel]==1)&&(num_reel!=num_maille_interdit)) - { - new_num=num_reel; - } - } - for (i=0;(iDONNE_VOISIN_DE_MAILLE(num_maille,ind_reel); - if ((etat_face[ind_reel]==0)&&(num_reel!=num_maille_interdit)) - { - new_num=num_reel; - } - } - if (new_num==UNDEFINED) - { - new_num=num_maille_interdit; - } - num_maille_interdit=num_maille; - num_maille=new_num; - new_num=UNDEFINED; - test=Donne_Directions(num_maille,n,etat_face); - } - return UNDEFINED; - } - -#undef _TEMPLATE_ -#undef _MAPPING_ - -#endif diff --git a/src/MEDMEM/INTERPOLATION/MEDMEM_MappingTools.hxx b/src/MEDMEM/INTERPOLATION/MEDMEM_MappingTools.hxx deleted file mode 100644 index 095ef8ac1..000000000 --- a/src/MEDMEM/INTERPOLATION/MEDMEM_MappingTools.hxx +++ /dev/null @@ -1,241 +0,0 @@ -#ifndef COORDONNEES_BARYCENTRIQUES_HPP -#define COORDONNEES_BARYCENTRIQUES_HPP - -#define _TEMPLATE_SPE_ template -#define _COORDBARYC_ Coordonnees_Barycentriques -#define _COORDBARY_2D_ Coordonnees_Barycentriques -#define _COORDBARY_3D_ Coordonnees_Barycentriques - -////////////////////////////////////////////////////////////////// -/// /// -/// DECLARATIONS /// -/// /// -////////////////////////////////////////////////////////////////// - -/*********************************************************/ -/* */ -/* Classe Coordonnees_Barycentriques */ -/* */ -/*********************************************************/ - -// C'est la définition de la classe générique template qui n'est utilisée qu'à travers ses spécialisations -// vu que le nombre de spécialisations a faire est petit (nombre de dimensions utilisée, 3 pour MED) -// et vu que l'acces a ces classes doit etre rapide, car ce sont des classes de calcul -// la technique de spécialisation, plus lourde, mais plus rapide, a été préférée aux techniques d'héritage - -template class Coordonnees_Barycentriques -{ -// TEMPLATE GENERIQUE VIDE OBLIGE DE PASSER PAR UNE SPECIALISATION -}; - -/*********************************************************/ -/* */ -/* Spécialisation 2D */ -/* */ -/*********************************************************/ - -_TEMPLATE_SPE_ class _COORDBARY_2D_ -{ -protected : - NUAGEMAILLE * mailles; - NUAGENOEUD * sommets; - - vector etat_coord_baryc; - vector< vector< vector > > coord_baryc; - -public : - - Coordonnees_Barycentriques():mailles(NULL),sommets(NULL) {} - Coordonnees_Barycentriques(NUAGEMAILLE * m, NUAGENOEUD *n); - ~Coordonnees_Barycentriques() {} - // donne les pseudos coordonnées barycentriques de M dans ma maille de numéro global num_maille dans mailles - // la pseudo coordonnées barycentrique par rapport a une face est la distance normalisée a cette face, - // dans le cas d'une face triangulaire, c'est la coordonnées ba - vector Donne_Pseudo_Coord_Baryc(int num_maille,const NOEUD &M); - vector Calcule_Base_Coord_Baryc(const vector &simplexe_base); - vector Calcule_Coord_Baryc(int num_maille, const NOEUD & M); -}; - -/*********************************************************/ -/* */ -/* Spécialisation 3D */ -/* */ -/*********************************************************/ - - -_TEMPLATE_SPE_ class _COORDBARY_3D_ -{ -protected : - NUAGEMAILLE * mailles; - NUAGENOEUD * sommets; - - vector etat_coord_baryc; - vector< vector< vector > > coord_baryc; - -public : - - Coordonnees_Barycentriques():mailles(NULL),sommets(NULL) {} - Coordonnees_Barycentriques(NUAGEMAILLE * m, NUAGENOEUD *n); - ~Coordonnees_Barycentriques() {} - vector Donne_Pseudo_Coord_Baryc(int num_maille,const NOEUD &M); - vector Calcule_Base_Coord_Baryc(const vector &simplexe_base); - vector Calcule_Coord_Baryc(int num_maille, const NOEUD & M); -}; - -////////////////////////////////////////////////////////////////// -/// /// -/// CODE /// -/// /// -////////////////////////////////////////////////////////////////// - -_TEMPLATE_SPE_ _COORDBARY_2D_::Coordonnees_Barycentriques(NUAGEMAILLE * m, NUAGENOEUD *n):mailles(m),sommets(n) - { - cout<<"Creation des Coordonnées Barycentriques : "<SIZE(); - etat_coord_baryc=vector(nbr_mailles,FAUX); - coord_baryc=vector< vector< vector > >(nbr_mailles); - cout<<"OK ! "< _COORDBARY_2D_::Donne_Pseudo_Coord_Baryc(int num_maille,const NOEUD &M) - { - int i,j,nbr_faces; - if (etat_coord_baryc[num_maille]==FAUX) - { - nbr_faces=(*mailles).DONNE_NBR_FACES(); - - coord_baryc[num_maille]=vector< vector >(nbr_faces); - - for (i=0;i simplexe_base=(*mailles).DONNE_SIMPLEXE_BASE(i); - coord_baryc[num_maille][i]=Calcule_Base_Coord_Baryc(simplexe_base); - etat_coord_baryc[num_maille]=VRAI; - } - } - return Calcule_Coord_Baryc(num_maille,M); - } - -_TEMPLATE_SPE_ vector _COORDBARY_2D_::Calcule_Base_Coord_Baryc(const vector &simplexe_base) - { - const vector &ref=simplexe_base; - vector retour(3); - int i,j; - - double x0=(*sommets)[ref[0]][0]; - double y0=(*sommets)[ref[0]][1]; - double x1=(*sommets)[ref[1]][0]; - double y1=(*sommets)[ref[1]][1]; - double x2=(*sommets)[ref[2]][0]; - double y2=(*sommets)[ref[2]][1]; - - double delta=(x1*y2-x2*y1)+(x2*y0-x0*y2)+(x0*y1-x1*y0); - - retour[0]=(y1-y2)/delta; - retour[1]=(x2-x1)/delta; - retour[2]=(x1*y2-x2*y1)/delta; - - return retour; - } - -_TEMPLATE_SPE_ vector _COORDBARY_2D_::Calcule_Coord_Baryc(int num_maille, const NOEUD & M) - { - int i,j; - vector coord_baryc_M(3,0); - for (i=0;i<3;i++) - { - for (j=0;j<2;j++) coord_baryc_M[i]+=coord_baryc[num_maille][i][j]*M[j]; - coord_baryc_M[i]+=coord_baryc[num_maille][i][2]; - } - return coord_baryc_M; - } - -_TEMPLATE_SPE_ _COORDBARY_3D_::Coordonnees_Barycentriques(NUAGEMAILLE * m, NUAGENOEUD *n):mailles(m),sommets(n) - { - cout<<"Creation des Coordonnées Barycentriques : "<SIZE(); - etat_coord_baryc=vector(nbr_mailles,FAUX); - coord_baryc=vector< vector< vector > >(nbr_mailles); - cout<<"OK ! "< _COORDBARY_3D_::Donne_Pseudo_Coord_Baryc(int num_maille,const NOEUD &M) - { - int i,j,nbr_faces; - if (etat_coord_baryc[num_maille]==FAUX) - { - nbr_faces=(*mailles)[num_maille].DONNE_NBR_FACES(); - - coord_baryc[num_maille]=vector< vector >(nbr_faces); - - type_retour simplexe_base; - - for (i=0;i(&simplexe_base.quoi[0],&simplexe_base.quoi[simplexe_base.combien])); - etat_coord_baryc[num_maille]=VRAI; - } - } - return Calcule_Coord_Baryc(num_maille,M); - } - - -_TEMPLATE_SPE_ vector _COORDBARY_3D_::Calcule_Base_Coord_Baryc(const vector &simplexe_base) - { - const vector &ref=simplexe_base; - vector retour(4); - int i,j; - - double x0=(*sommets)[ref[0]][0]; - double y0=(*sommets)[ref[0]][1]; - double z0=(*sommets)[ref[0]][2]; - double x1=(*sommets)[ref[1]][0]; - double y1=(*sommets)[ref[1]][1]; - double z1=(*sommets)[ref[1]][2]; - double x2=(*sommets)[ref[2]][0]; - double y2=(*sommets)[ref[2]][1]; - double z2=(*sommets)[ref[2]][2]; - double x3=(*sommets)[ref[3]][0]; - double y3=(*sommets)[ref[3]][1]; - double z3=(*sommets)[ref[3]][2]; - - double delta1=((y2-y1)*(z3-z1)-(z2-z1)*(y3-y1)); - double delta2=((x3-x1)*(z2-z1)-(x2-x1)*(z3-z1)); - double delta3=((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1)); - - double delta=delta1*(x0-x1)+delta2*(y0-y1)+delta3*(z0-z1); - - retour[0]=delta1/delta; - retour[1]=delta2/delta; - retour[2]=delta3/delta; - retour[3]=-(delta1*x1+delta2*y1+delta3*z1)/delta; - - return retour; - } - -_TEMPLATE_SPE_ vector _COORDBARY_3D_::Calcule_Coord_Baryc(int num_maille, const NOEUD & M) - { - int i,j; - int nbr_faces=coord_baryc[num_maille].size(); - vector coord_baryc_M(nbr_faces,0); - for (i=0;i -#undef _COORDBARYC_ -// Coordonnees_Barycentriques -#undef _COORDBARY_2D_ -// Coordonnees_Barycentriques -#undef _COORDBARY_3D_ -// Coordonnees_Barycentriques - -#endif diff --git a/src/MEDMEM/INTERPOLATION/MEDMEM_WrapperCells.hxx b/src/MEDMEM/INTERPOLATION/MEDMEM_WrapperCells.hxx deleted file mode 100644 index 9859b48da..000000000 --- a/src/MEDMEM/INTERPOLATION/MEDMEM_WrapperCells.hxx +++ /dev/null @@ -1,917 +0,0 @@ -#ifndef WRAPPERS_CELLS_HXX -#define WRAPPERS_CELLS_HXX - -#include "stdio.h" -#include "stdlib.h" - -#include - -#include -#include - -#ifndef FAUX -#define FAUX 0 -#endif - -#ifndef VRAI -#define VRAI 1 -#endif - -#ifndef UNDEFINED -#define UNDEFINED -1 -#endif - -#include "MEDMEM_define.hxx" - -#define MAXNBR 10 - -////////////////////////////////////////////////////////////////// -/// /// -/// DECLARATIONS /// -/// /// -////////////////////////////////////////////////////////////////// - -/*********************************************************/ -/* */ -/* Equivalence num modele local => MED */ -/* */ -/*********************************************************/ - -#define NBR_MODELES_MAILLES_DEFINIS 15 -int Equivalence_Local_MED[NBR_MODELES_MAILLES_DEFINIS] = { MED_POINT1 , - MED_SEG2 , MED_SEG3, - MED_TRIA3 , MED_TRIA6 , MED_QUAD4 , MED_QUAD8 , - MED_TETRA4 , MED_TETRA10 , MED_HEXA8 , MED_HEXA20 , MED_PYRA5 , MED_PYRA13 , MED_PENTA6 , MED_PENTA15 }; - -/*********************************************************/ -/* */ -/* Classe Connectivite_Canonique_Base */ -/* */ -/*********************************************************/ - -// classe mere des connectivités cannoniques -// N'a aucune méthode virtuelle pour éviter les pertes de temps -// Ce sont les constructeurs des classes dérivées qui renseignent les attributs spécifiques -// un simplexe de base est constitué par un sommet de la maille qui n'est pas contenu dans la face démandée et par trois points de cette face -// Ce simplexe est utilisé dans le calcul des fonctions barycentriques -// LES MAILLES SONT DONC ET PAR CONSEQUENT DES MAILLES A FACES PLANES -// Une face est une face P1, c'est a dire contenant uniquement les sommets, par les noeuds milieux -// Ces faces sont utilisées pour le calcul de connexité - - -class Connectivite_Canonique_Base -{ -protected : - int type ; - int nbr_noeuds ; - int nbr_faces ; - vector premier_noeud ; - vector< vector > simplexe_base ; - vector< vector > face ; -public : - inline int DONNE_NBR_NOEUDS() const { return nbr_noeuds; } - inline int DONNE_NBR_FACES() const { return nbr_faces; } - inline const vector & DONNE_SIMPLEXE_BASE(int num_face) const { return simplexe_base[num_face]; } - inline const vector & DONNE_FACE(int num_face) const { return face[num_face]; } - inline int DONNE_PREMIER_NOEUD_DE_FACE(int num_face) const { return premier_noeud[num_face]; } - friend class Wrapper_Maille; -}; - -/*********************************************************/ -/* */ -/* Classe Connectivite_Canonique_* */ -/* */ -/*********************************************************/ - -// définies dans la partie CODE -// les constructeurs construisent tous les tableaux de connectivités nécessaires en fonction du MODELE MED - -//class Connectivite_Canonique_Point1 : public Connectivite_Canonique_Base; -//class Connectivite_Canonique_Seg2 : public Connectivite_Canonique_Base; -//class Connectivite_Canonique_Seg3 : public Connectivite_Canonique_Base; -//class Connectivite_Canonique_Tria3 : public Connectivite_Canonique_Base; -//class Connectivite_Canonique_Tria6 : public Connectivite_Canonique_Base; -//class Connectivite_Canonique_Quad4 : public Connectivite_Canonique_Base; -//class Connectivite_Canonique_Quad8 : public Connectivite_Canonique_Base; -//class Connectivite_Canonique_Tetra4 : public Connectivite_Canonique_Base; -//class Connectivite_Canonique_Tetra10 : public Connectivite_Canonique_Base; -//class Connectivite_Canonique_Hexa8 : public Connectivite_Canonique_Base; -//class Connectivite_Canonique_Hexa20 : public Connectivite_Canonique_Base; -//class Connectivite_Canonique_Pyra5 : public Connectivite_Canonique_Base; -//class Connectivite_Canonique_Pyra13 : public Connectivite_Canonique_Base; -//class Connectivite_Canonique_Penta6 : public Connectivite_Canonique_Base; -//class Connectivite_Canonique_Penta15 : public Connectivite_Canonique_Base; - -/*********************************************************/ -/* */ -/* Classe Connectivite_Generale */ -/* */ -/*********************************************************/ - -// Cette classe contient toutes les connectivités canoniques, elle est utilisée dans Wrapper_Nuage_Maille - -class Connectivite_Generale -{ -protected : - vector AllConn; -public : - Connectivite_Generale(); - ~Connectivite_Generale(); - // Renvoie la connectivite locale de la maille de numero local de modele i, dont l'equivalent MED est Equivalence_Local_MED[i] - Connectivite_Canonique_Base * operator[](int i) const {return AllConn[i];} -}; - -/*********************************************************/ -/* */ -/* Structure type_retour */ -/* */ -/*********************************************************/ - -// c'est une structure de type petit tableau statique, pour accelerer les acces et eviter les allocations dynamiques - -struct type_retour - { - int quoi[MAXNBR]; - int combien; - }; - -/*********************************************************/ -/* */ -/* Fonction Comparaison_Informe(...) */ -/* */ -/*********************************************************/ - -// renvoie vrai si v1 et v2 contiennent la meme chose et sont de meme tailles, faux sinon - -int Comparaison_Informe(const type_retour &v1,const type_retour &v2); - -/*********************************************************/ -/* */ -/* Classe Wrapper_Maille */ -/* */ -/*********************************************************/ - -// c'est le wrapper maille sur int[] -// cette classe n'est pas dérivée, tous les types de mailles sont stockées sous cette forme -// la variable qui définit les type est la Connectivité_Canonique_Base, qui est toujours polymorphée en un type spécifique - - -class Wrapper_Maille -{ -protected : - - // la référence du premier sommet - int * sommets; - // la connectivité canonique, toujours polymorphée - Connectivite_Canonique_Base * modele; - -public : - Wrapper_Maille():sommets(NULL) {} - ~Wrapper_Maille() {} - - // sorte de transtypeur, cette méthode prend une référence vers un premier sommet et un modele canonique et renvoie *this en tant que wrapper sur ces données - inline const Wrapper_Maille & positionne(int * pos, Connectivite_Canonique_Base * mod){sommets=pos;modele=mod;return *this;} - // méthodes de la politique (les numéros renvoyés sont des numéros GLOBAUX, calculés à partir de l'indirection fournie par la connectivité canonique - // par contre les numéros de face fournis sont des numéros locaux - // renvoie le numéro global du sommet de numéro local i - inline int operator[](int i) const {return sommets[i];} - inline int DONNE_NBR_NOEUDS() const; - inline int DONNE_NBR_FACES() const; - inline void DONNE_SIMPLEXE_BASE(int num_face,type_retour & simplexe) const; - inline void DONNE_FACE(int num_face,type_retour & face) const; - inline int DONNE_PREMIER_NOEUD_DE_FACE(int num_face) const; - // pour une face, donne, s'il existe, le numéro local de face équivalente, -1 sinon - inline int DONNE_NUM_LOC_FACE_EGALE_A_FORMANT(const type_retour & sommets_face) const; - // donne le numéro local de modele - inline int DONNE_TYPE_MAILLE() const; - // donne le numéro MED de modele - inline int DONNE_TYPE_MED_MAILLE() const; -}; - - -/*********************************************************/ -/* */ -/* Classe Wrapper_Nuage_Maille */ -/* */ -/*********************************************************/ - -// Classe de Wrapping sur un nuage de maille donné sous forme SKYLINE -// voir la classe Wrapper_Med_Connectivity dans MEDMEM_Wrapper_Connectivity.hxx pour la politique de classe - -template class Wrapper_Nuage_Maille -{ -protected : - // pointeur sur une forme skyline - FORME_SKYLINE * mailles; - // toutes les connectivités canoniques - Connectivite_Generale ConnGen; - int nbr_mailles; - // ATTENTION, c'est le type en numero local de modele, pour éviter une map, le numéro de modele MED correponsdant est donné par Equivalence_Local_MED - vector types; - // pointeur dans mailles du premier sommet de chaque maille (évite les calculs du au nombres éventuellement différents de sommets par maille) - vector< int * > premier_pointeur; - // maille_courante, est un Wrapper_Maille déja instancié utilisé par l'opérateur [] pour accelerer les acces - Wrapper_Maille maille_courante; -public : - Wrapper_Nuage_Maille():mailles(NULL) {} - // le constructeur renseigne types et premier_pointeur, instantie ConnGenn et positionne maille_courante sur la premiere maille - Wrapper_Nuage_Maille(FORME_SKYLINE * fs); - ~Wrapper_Nuage_Maille() {} - // Méthodes de la politique - // positionne maille_courante sur la maille de numéro global i et renvoie maille_courante - inline const Wrapper_Maille & operator[](int i); - inline int SIZE() {return nbr_mailles;} - void affiche(); -}; - -////////////////////////////////////////////////////////////////// -/// /// -/// CODE /// -/// /// -////////////////////////////////////////////////////////////////// - -/*********************************************************/ -/* */ -/* Fonction Comparaison_Informe(...) */ -/* */ -/*********************************************************/ - -// effectue le test (v1 et v2 ont meme taille)&&(chaque élément de v1 est dans v2) -// c'est une égalité forte si on est sur que v1 et v2 n'ont pas de doublets, -// ce qui est le cas pour les mailles et les simplexes - -int Comparaison_Informe(const type_retour &v1,const type_retour &v2) - { - int t1=v1.combien; - int t2=v2.combien; - if (t1!=t2) return FAUX; - int i1,i2; - int test; - for (i1=0;i1DONNE_NBR_NOEUDS(); - } -inline int Wrapper_Maille::DONNE_NBR_FACES() const - { - return modele->DONNE_NBR_FACES(); - } -inline void Wrapper_Maille::DONNE_SIMPLEXE_BASE(int num_face,type_retour & simplexe) const - { - const vector & simplexelocal=modele->DONNE_SIMPLEXE_BASE(num_face); - simplexe.combien=simplexelocal.size(); - for (int i=0;i & facelocal=modele->DONNE_FACE(num_face); - face.combien=facelocal.size(); - for (int i=0;iDONNE_PREMIER_NOEUD_DE_FACE(num_face)]; - } -inline int Wrapper_Maille::DONNE_NUM_LOC_FACE_EGALE_A_FORMANT(const type_retour & sommets_face) const - { - type_retour face_loc; - int num_face; - int taille_face_exam; - int test=FAUX; - for (num_face=0;num_facetype; - } -inline int Wrapper_Maille::DONNE_TYPE_MED_MAILLE() const - { - return Equivalence_Local_MED[modele->type]; - } - - -/*********************************************************/ -/* */ -/* Classe Wrapper_Nuage_Maille */ -/* */ -/*********************************************************/ - -template Wrapper_Nuage_Maille::Wrapper_Nuage_Maille(FORME_SKYLINE * fs):mailles(fs) - { - int i; - map Equivalence_MED_Local; - // calcule la map de convertion des types med en numéro local, pour accelerer l'acces - for (i=0;iSIZE(); - types.resize(nbr_mailles); - premier_pointeur.resize(nbr_mailles); - for (i=0;iDONNE_TYPE_MAILLE(i)]; - premier_pointeur[i]=mailles->DONNE_PREMIER_POINTEUR(i); - } - maille_courante.positionne(premier_pointeur[0],ConnGen[types[0]]); - } -template const Wrapper_Maille & Wrapper_Nuage_Maille::operator[](int i) - { - return maille_courante.positionne(premier_pointeur[i],ConnGen[types[i]]); - } -template void Wrapper_Nuage_Maille::affiche() - { - int i,j; - for (i=0;i(0); - - simplexe_base = vector< vector >(nbr_faces); - face = vector< vector >(nbr_faces); - - } - ~Connectivite_Canonique_Point1() {} -}; - -/*********************************************************/ -/* */ -/* Classe Connectivite_Canonique_Seg2 */ -/* */ -/*********************************************************/ - -class Connectivite_Canonique_Seg2 : public Connectivite_Canonique_Base -{ -public : - Connectivite_Canonique_Seg2() - { - - type=1; - - int pn[2] = {0,1}; - int sb[4] = {1,0,0,1}; - int fa[2] = {0,1}; - int po[3] = {0,1,2}; - - nbr_noeuds = 2; - nbr_faces = 2; - - - premier_noeud = vector(&pn[0],&pn[nbr_faces]); - - simplexe_base = vector< vector >(nbr_faces); - face = vector< vector >(nbr_faces); - - int i; - - for (i=0;i(&sb[2*i],&sb[2*(i+1)]); - for (i=0;i(&fa[po[i]],&fa[po[i+1]]); - - } - ~Connectivite_Canonique_Seg2() {} -}; -/*********************************************************/ -/* */ -/* Classe Connectivite_Canonique_Seg3 */ -/* */ -/*********************************************************/ - -class Connectivite_Canonique_Seg3 : public Connectivite_Canonique_Base -{ -public : - Connectivite_Canonique_Seg3() - { - - type=2; - - int pn[2] = {0,1}; - int sb[4] = {1,0,0,1}; - int fa[2] = {0,1}; - int po[3] = {0,1,2}; - - nbr_noeuds = 3; - nbr_faces = 2; - - - premier_noeud = vector(&pn[0],&pn[nbr_faces]); - - simplexe_base = vector< vector >(nbr_faces); - face = vector< vector >(nbr_faces); - - int i; - - for (i=0;i(&sb[2*i],&sb[2*(i+1)]); - for (i=0;i(&fa[po[i]],&fa[po[i+1]]); - - } - ~Connectivite_Canonique_Seg3() {} -}; - - -/*********************************************************/ -/* */ -/* Classe Connectivite_Canonique_Tria3 */ -/* */ -/*********************************************************/ - -class Connectivite_Canonique_Tria3 : public Connectivite_Canonique_Base -{ -public : - Connectivite_Canonique_Tria3() - { - - type=3; - - int pn[3] = {0,1,2}; - int sb[9] = {2,0,1,0,1,2,1,2,0}; - int fa[6] = {0,1,1,2,2,0}; - int po[4] = {0,2,4,6}; - nbr_noeuds = 3; - nbr_faces = 3; - - - premier_noeud = vector(&pn[0],&pn[nbr_faces]); - - simplexe_base = vector< vector >(nbr_faces); - face = vector< vector >(nbr_faces); - - int i; - - for (i=0;i(&sb[3*i],&sb[3*(i+1)]); - for (i=0;i(&fa[po[i]],&fa[po[i+1]]); - - } - ~Connectivite_Canonique_Tria3() {} -}; - -/*********************************************************/ -/* */ -/* Classe Connectivite_Canonique_Tria6 */ -/* */ -/*********************************************************/ - -class Connectivite_Canonique_Tria6 : public Connectivite_Canonique_Base -{ -public : - Connectivite_Canonique_Tria6() - { - - type=4; - - int pn[3] = {0,1,2}; - int sb[9] = {2,0,1,0,1,2,1,2,0}; - int fa[6] = {0,1,1,2,2,0}; - int po[4] = {0,2,4,6}; - nbr_noeuds = 6; - nbr_faces = 3; - - - premier_noeud = vector(&pn[0],&pn[nbr_faces]); - - simplexe_base = vector< vector >(nbr_faces); - face = vector< vector >(nbr_faces); - - int i; - - for (i=0;i(&sb[3*i],&sb[3*(i+1)]); - for (i=0;i(&fa[po[i]],&fa[po[i+1]]); - - } - ~Connectivite_Canonique_Tria6() {} -}; - -/*********************************************************/ -/* */ -/* Classe Connectivite_Canonique_Quad4 */ -/* */ -/*********************************************************/ - -class Connectivite_Canonique_Quad4 : public Connectivite_Canonique_Base -{ -public : - Connectivite_Canonique_Quad4() - { - - type=5; - - int pn[4] = {0,1,2,3}; - int sb[12] = {2,0,1,3,1,2,0,2,3,1,0,2}; - int fa[8] = {0,1,1,2,2,3,3,0}; - int po[5] = {0,2,4,6,8}; - nbr_noeuds = 4; - nbr_faces = 4; - - - premier_noeud = vector(&pn[0],&pn[nbr_faces]); - - simplexe_base = vector< vector >(nbr_faces); - face = vector< vector >(nbr_faces); - - int i; - - for (i=0;i(&sb[3*i],&sb[3*(i+1)]); - for (i=0;i(&fa[po[i]],&fa[po[i+1]]); - - } - ~Connectivite_Canonique_Quad4() {} -}; - - -/*********************************************************/ -/* */ -/* Classe Connectivite_Canonique_Quad8 */ -/* */ -/*********************************************************/ - -class Connectivite_Canonique_Quad8 : public Connectivite_Canonique_Base -{ -public : - Connectivite_Canonique_Quad8() - { - - type=6; - - int pn[4] = {0,1,2,3}; - int sb[12] = {2,0,1,3,1,2,0,2,3,1,0,2}; - int fa[8] = {0,1,1,2,2,3,3,0}; - int po[5] = {0,2,4,6,8}; - nbr_noeuds = 8; - nbr_faces = 4; - - - premier_noeud = vector(&pn[0],&pn[nbr_faces]); - - simplexe_base = vector< vector >(nbr_faces); - face = vector< vector >(nbr_faces); - - int i; - - for (i=0;i(&sb[3*i],&sb[3*(i+1)]); - for (i=0;i(&fa[po[i]],&fa[po[i+1]]); - - } - ~Connectivite_Canonique_Quad8() {} -}; - -/*********************************************************/ -/* */ -/* Classe Connectivite_Canonique_Tetra4 */ -/* */ -/*********************************************************/ - -class Connectivite_Canonique_Tetra4 : public Connectivite_Canonique_Base -{ -public : - Connectivite_Canonique_Tetra4() - { - - type=7; - - int pn[4] = {0,0,1,2}; - int sb[16] = {3,0,1,2,2,0,3,1,0,1,3,2,1,2,3,0}; - int fa[12] = {0,1,2,0,3,1,1,3,2,2,3,0}; - int po[5] = {0,3,6,9,12}; - nbr_noeuds = 4; - nbr_faces = 4; - - - premier_noeud = vector(&pn[0],&pn[nbr_faces]); - - simplexe_base = vector< vector >(nbr_faces); - face = vector< vector >(nbr_faces); - - int i; - - for (i=0;i(&sb[4*i],&sb[4*(i+1)]); - for (i=0;i(&fa[po[i]],&fa[po[i+1]]); - - } - ~Connectivite_Canonique_Tetra4() {} -}; - -/*********************************************************/ -/* */ -/* Classe Connectivite_Canonique_Tetra10 */ -/* */ -/*********************************************************/ - -class Connectivite_Canonique_Tetra10 : public Connectivite_Canonique_Base -{ -public : - Connectivite_Canonique_Tetra10() - { - - type=8; - - int pn[4] = {0,0,1,2}; - int sb[16] = {3,0,1,2,2,0,3,1,0,1,3,2,1,2,3,0}; - int fa[12] = { 0,1,2, 0,3,1, 1,3,2, 2,3,0}; - int po[5] = {0,3,6,9,12}; - - nbr_noeuds = 10; - nbr_faces = 4; - - - premier_noeud = vector(&pn[0],&pn[nbr_faces]); - - simplexe_base = vector< vector >(nbr_faces); - face = vector< vector >(nbr_faces); - - int i; - - for (i=0;i(&sb[4*i],&sb[4*(i+1)]); - for (i=0;i(&fa[po[i]],&fa[po[i+1]]); - - } - ~Connectivite_Canonique_Tetra10() {} -}; - -/*********************************************************/ -/* */ -/* Classe Connectivite_Canonique_Hexa8 */ -/* */ -/*********************************************************/ - -class Connectivite_Canonique_Hexa8 : public Connectivite_Canonique_Base -{ -public : - Connectivite_Canonique_Hexa8() - { - - type=9; - - int pn[6] = {0,4,0,1,2,3}; - int sb[24] = {5,0,1,2,0,7,6,5,3,0,4,5,4,1,5,6,1,2,6,3,2,3,7,0}; - int fa[24] = {0,1,2,3,4,5,6,7,0,4,5,1,1,5,6,2,2,6,7,3,3,7,4,0}; - int po[7] = {0,4,8,12,16,20,24}; - nbr_noeuds = 8; - nbr_faces = 6; - - - premier_noeud = vector(&pn[0],&pn[nbr_faces]); - - simplexe_base = vector< vector >(nbr_faces); - face = vector< vector >(nbr_faces); - - int i; - - for (i=0;i(&sb[4*i],&sb[4*(i+1)]); - for (i=0;i(&fa[po[i]],&fa[po[i+1]]); - - } - ~Connectivite_Canonique_Hexa8() {} -}; - -/*********************************************************/ -/* */ -/* Classe Connectivite_Canonique_Hexa20 */ -/* */ -/*********************************************************/ - -class Connectivite_Canonique_Hexa20 : public Connectivite_Canonique_Base -{ -public : - Connectivite_Canonique_Hexa20() - { - - type=10; - - int pn[6] = {0,4,0,1,2,3}; - int sb[24] = {5,0,1,2,0,7,6,5,3,0,4,5,4,1,5,6,1,2,6,3,2,3,7,0}; - int fa[24] = {0,1,2,3,4,5,6,7,0,4,5,1,1,5,6,2,2,6,7,3,3,7,4,0}; - int po[7] = {0,4,8,12,16,20,24}; - nbr_noeuds = 20; - nbr_faces = 6; - - - premier_noeud = vector(&pn[0],&pn[nbr_faces]); - - simplexe_base = vector< vector >(nbr_faces); - face = vector< vector >(nbr_faces); - - int i; - - for (i=0;i(&sb[4*i],&sb[4*(i+1)]); - for (i=0;i(&fa[po[i]],&fa[po[i+1]]); - - } - ~Connectivite_Canonique_Hexa20() {} -}; - -/*********************************************************/ -/* */ -/* Classe Connectivite_Canonique_Pyra5 */ -/* */ -/*********************************************************/ - -class Connectivite_Canonique_Pyra5 : public Connectivite_Canonique_Base -{ -public : - Connectivite_Canonique_Pyra5() - { - - type=11; - - int pn[5] = {0,0,1,2,3}; - int sb[20] = {4,0,1,2,3,0,4,1,0,1,4,2,1,2,4,3,2,0,3,4}; - int fa[16] = {0,1,2,3,0,4,1,1,4,2,2,4,3,3,4,0}; - int po[6] = {0,4,7,10,13,16}; - nbr_noeuds = 5; - nbr_faces = 5; - - - premier_noeud = vector(&pn[0],&pn[nbr_faces]); - - simplexe_base = vector< vector >(nbr_faces); - face = vector< vector >(nbr_faces); - - int i; - - for (i=0;i(&sb[4*i],&sb[4*(i+1)]); - for (i=0;i(&fa[po[i]],&fa[po[i+1]]); - - } - ~Connectivite_Canonique_Pyra5() {} -}; - -/*********************************************************/ -/* */ -/* Classe Connectivite_Canonique_Pyra13 */ -/* */ -/*********************************************************/ - -class Connectivite_Canonique_Pyra13 : public Connectivite_Canonique_Base -{ -public : - Connectivite_Canonique_Pyra13() - { - - type=12; - - int pn[5] = {0,0,1,2,3}; - int sb[20] = {4,0,1,2,3,0,4,1,0,1,4,2,1,2,4,3,2,0,3,4}; - int fa[16] = {0,1,2,3,0,4,1,1,4,2,2,4,3,3,4,0}; - int po[6] = {0,4,7,10,13,16}; - nbr_noeuds = 13; - nbr_faces = 5; - - - premier_noeud = vector(&pn[0],&pn[nbr_faces]); - - simplexe_base = vector< vector >(nbr_faces); - face = vector< vector >(nbr_faces); - - int i; - - for (i=0;i(&sb[4*i],&sb[4*(i+1)]); - for (i=0;i(&fa[po[i]],&fa[po[i+1]]); - - } - ~Connectivite_Canonique_Pyra13() {} -}; - -/*********************************************************/ -/* */ -/* Classe Connectivite_Canonique_Penta6 */ -/* */ -/*********************************************************/ - -class Connectivite_Canonique_Penta6 : public Connectivite_Canonique_Base -{ -public : - Connectivite_Canonique_Penta6() - { - - type=13; - - int pn[5] = {0,3,0,1,2}; - int sb[20] = {3,0,1,2,2,3,4,5,5,0,3,1,0,1,4,2,1,2,5,0}; - int fa[18] = {0,1,2,3,4,5,0,3,4,1,1,4,5,2,2,5,3,1}; - int po[6] = {0,3,6,10,14,18}; - nbr_noeuds = 6; - nbr_faces = 5; - - - premier_noeud = vector(&pn[0],&pn[nbr_faces]); - - simplexe_base = vector< vector >(nbr_faces); - face = vector< vector >(nbr_faces); - - int i; - - for (i=0;i(&sb[4*i],&sb[4*(i+1)]); - for (i=0;i(&fa[po[i]],&fa[po[i+1]]); - - } - ~Connectivite_Canonique_Penta6() {} -}; - -/*********************************************************/ -/* */ -/* Classe Connectivite_Canonique_Penta15 */ -/* */ -/*********************************************************/ - -class Connectivite_Canonique_Penta15 : public Connectivite_Canonique_Base -{ -public : - Connectivite_Canonique_Penta15() - { - - type=14; - - int pn[5] = {0,3,0,1,2}; - int sb[20] = {3,0,1,2,2,3,4,5,5,0,3,1,0,1,4,2,1,2,5,0}; - int fa[18] = {0,1,2,3,4,5,0,3,4,1,1,4,5,2,2,5,3,1}; - int po[6] = {0,3,6,10,14,18}; - nbr_noeuds = 15; - nbr_faces = 5; - - - premier_noeud = vector(&pn[0],&pn[nbr_faces]); - - simplexe_base = vector< vector >(nbr_faces); - face = vector< vector >(nbr_faces); - - int i; - - for (i=0;i(&sb[4*i],&sb[4*(i+1)]); - for (i=0;i(&fa[po[i]],&fa[po[i+1]]); - - } - ~Connectivite_Canonique_Penta15() {} -}; - -/*********************************************************/ -/* */ -/* Classe Connectivite_Generale */ -/* */ -/*********************************************************/ - -Connectivite_Generale::Connectivite_Generale():AllConn(NBR_MODELES_MAILLES_DEFINIS) - { - // l'ordre est important, il dépend de la relation entre numéro local et modele et numéro MED - AllConn[ 0]=new Connectivite_Canonique_Point1 (); - AllConn[ 1]=new Connectivite_Canonique_Seg2 (); - AllConn[ 2]=new Connectivite_Canonique_Seg3 (); - AllConn[ 3]=new Connectivite_Canonique_Tria3 (); - AllConn[ 4]=new Connectivite_Canonique_Tria6 (); - AllConn[ 5]=new Connectivite_Canonique_Quad4 (); - AllConn[ 6]=new Connectivite_Canonique_Quad8 (); - AllConn[ 7]=new Connectivite_Canonique_Tetra4 (); - AllConn[ 8]=new Connectivite_Canonique_Tetra10 (); - AllConn[ 9]=new Connectivite_Canonique_Hexa8 (); - AllConn[10]=new Connectivite_Canonique_Hexa20 (); - AllConn[11]=new Connectivite_Canonique_Pyra5 (); - AllConn[12]=new Connectivite_Canonique_Pyra13 (); - AllConn[13]=new Connectivite_Canonique_Penta6 (); - AllConn[14]=new Connectivite_Canonique_Penta15 (); - } -Connectivite_Generale::~Connectivite_Generale() - { - for (int i=0;i - -////////////////////////////////////////////////////////////////// -/// /// -/// DECLARATIONS ET CODE /// -/// /// -////////////////////////////////////////////////////////////////// - -/*********************************************************/ -/* */ -/* Wrapper_Med_Connectivity */ -/* */ -/*********************************************************/ - -// obligé de faire de la recopie car MED n'utilise pas la numérotation standart C - -class Wrapper_Med_Connectivity -{ -protected : - int * mailles; - int nbr_mailles; - vector types; - vector< int* > premier_pointeur; - -public : - ~Wrapper_Med_Connectivity() {if (mailles) delete [] mailles;} - Wrapper_Med_Connectivity():mailles(NULL) {} - Wrapper_Med_Connectivity(CONNECTIVITY * maillesmed) - { - const med_int * tab_sommets_mailles=maillesmed->getConnectivity(MED_NODAL,MED_CELL,MED_ALL_ELEMENTS); - const med_int * med_connectivite=maillesmed->getConnectivityIndex(MED_FULL_INTERLACE,MED_CELL); - const med_int * med_index=maillesmed->getValueIndex(MED_FULL_INTERLACE); - nbr_mailles=maillesmed->getNumberOf(MED_CELL,MED_ALL_ELEMENTS); - int size=med_index[nbr_mailles]-med_index[0]; - types.resize(nbr_mailles); - premier_pointeur.resize(nbr_mailles); - mailles=new int[size]; - int i; - for (i=0;igetElementType(MED_CELL,i+1); // A VERIFIER : le +1 - premier_pointeur[i]=&mailles[med_index[i]-1]; // A VERIFIER : la formule - } - } - // Méthodes de la politique - inline int SIZE() {return nbr_mailles;} - inline int DONNE_TYPE_MAILLE(int i) {return types[i];} - inline int * DONNE_PREMIER_POINTEUR(int i) {return premier_pointeur[i];} -}; - - -#endif diff --git a/src/MEDMEM/INTERPOLATION/MEDMEM_WrapperField.hxx b/src/MEDMEM/INTERPOLATION/MEDMEM_WrapperField.hxx deleted file mode 100644 index b432a1c70..000000000 --- a/src/MEDMEM/INTERPOLATION/MEDMEM_WrapperField.hxx +++ /dev/null @@ -1,207 +0,0 @@ -#ifndef MEDMEM_WRAPPER_FIELD_HXX -#define MEDMEM_WRAPPER_FIELD_HXX - -#include "MEDMEM_Field.hxx" - -#include - -////////////////////////////////////////////////////////////////// -/// /// -/// DECLARATIONS ET CODE /// -/// /// -////////////////////////////////////////////////////////////////// - -/*********************************************************/ -/* */ -/* Template Arithmétiques de Valdhuizen */ -/* */ -/*********************************************************/ - -// permet de faire des opérations algébriques sur des Wrappers_MED_Field sans faire d'allocations inutiles -// voir les articles de Valdhuizen pour la compréhension du processus - -template class Valeur; - -struct Plus -{ -public : - static double apply(double a,double b) {return a+b;} -}; - -struct Multiply -{ -public : - static double apply(double a,double b) {return a*b;} -}; - - -template struct X -{ - Left left; - Right right; - X(Left l,Right r):left(l),right(r){} - double operator[](int i) - { - return Op::apply(left[i],right[i]); - } -}; - -template struct X -{ - double left; - Right right; - X(double l,Right r):left(l),right(r){} - double operator[](int i) - { - return Multiply::apply(left,right[i]); - } -}; - -template X< Valeur,Plus,Valeur > operator+(Valeur v1,Valeur v2) -{ -return X< Valeur,Plus,Valeur >(v1,v2); -} - -template X< double,Multiply,Valeur > operator*(TYPE sca,Valeur v) -{ -return X< TYPE,Multiply,Valeur >(sca,v); -} - -template X< Valeur,Plus,X > operator+(Valeur v,X expression) -{ -return X< Valeur,Plus,X >(v,expression); -} - -template X< X,Plus,Valeur > operator+(X expression,Valeur v) -{ -return X< X,Plus,Valeur >(expression,v); -} - -template X< X,Plus, X > operator+(X el, X er ) -{ -return X< X,Plus,X >(el,er); -} - -template X< double,Multiply,X > operator*(double sca,X expression) -{ -return X< double,Multiply,X >(sca,expression); -} - -template X< double,Multiply,X > operator/(X l,double x) -{ -return X< double,Multiply,X >(((double) 1/x),l); -} - -/*********************************************************/ -/* */ -/* Classe Valeur */ -/* */ -/*********************************************************/ - -// Problèmes : les constructeurs par copie ne sont pas satisfaisants -// Valeur est symboliquement l'argument d'une classe formelle Vecteur -// elle peut etre un réel ou un pointeur sur réel, simulant un vecteur de vecteur - -template class Valeur -{ -protected : - TYPE * valeurs; - int nbr_valeurs; - int a_detruire; -public : - Valeur():valeurs(NULL),a_detruire(0){} - Valeur(TYPE * val,int nv):valeurs(val),nbr_valeurs(nv),a_detruire(0){} // A VERIFIER - Valeur(int n):nbr_valeurs(n),a_detruire(1) - { - valeurs=new TYPE[nbr_valeurs]; - } - template Valeur(X expression) - { - for (int i=0;i void operator=(X expression) - { - for (int i=0;i ostream &operator<<(ostream &os,Valeur v) - { - os<<"("< MEDMEMOIRE - -class Wrapper_MED_Field -{ -protected : - int nbr_valeurs; - int nbr_composantes; - double * valeurs; -public : - Wrapper_MED_Field():valeurs(NULL){} - Wrapper_MED_Field(int nv, int nc, double * v):nbr_valeurs(nv),nbr_composantes(nc),valeurs(v) - { - } - Wrapper_MED_Field(const FIELD * medfield) - { - nbr_valeurs=medfield->getNumberOfValues(); - nbr_composantes=medfield->getNumberOfComponents(); - valeurs=const_cast(medfield->getValue(MED_FULL_INTERLACE)); - } - ~Wrapper_MED_Field(){} - inline Valeur operator[](int i) - { - return Valeur(&valeurs[nbr_composantes*i],nbr_composantes); - } - double * Get_Valeurs() {return valeurs;} - inline int Get_Nbr_Valeurs() const {return nbr_valeurs;} - inline int Get_Nbr_Composantes() const {return nbr_composantes;} - friend ostream & operator<<(ostream &os, Wrapper_MED_Field); -}; - -ostream & operator<<(ostream &os, Wrapper_MED_Field wmf) -{ -for (int i=0;i - -#ifndef UNDEFINED -#define UNDEFINED -1 -#endif - -#ifndef FAUX -#define FAUX 0 -#endif - -#ifndef VRAI -#define VRAI 1 -#endif - -////////////////////////////////////////////////////////////////// -/// /// -/// DECLARATIONS /// -/// /// -////////////////////////////////////////////////////////////////// - -/*********************************************************/ -/* */ -/* Wrapper_Maillage */ -/* */ -/*********************************************************/ - -// cette classe est à la fois un wrapper sur un nuage de maille et une classe d'algorithme -// elle s'occupe de construire les liens de connexités minimums du nuage de maille -// pour le transformer en maillage suffisament riche pour etre utilisé par les algorithmes de connexités -// et autres méthodes nécessitant des informations de connexité sur un maillage - -// la version utilisée dans MEDMEMOIRE est dé-templatifiée dans MEDMEM_InterpolationHighLevelObject.hxx - -template class Wrapper_Maillage -{ -protected : - // référence vers le nuage de maille, - // voir la classe Wrapper_Nuage_Maille dans MEDMEM_WrapperCells.hxx pour la politique - NUAGEMAILLE * mailles; - - int nbr_noeuds; - - // liste des numéros globaux de faces contenues dans une maille - vector< vector > faces_contenues; - // liste des numéros globaux de mailles qui contiennent un noeud - vector< vector > mailles_contenant_noeud; - // liste des numéros globaux de mailles voisines d'une maille donnée via une face - // l'ordre du voisin dans la liste implique par quelle face dans le tableau faces_contenues il est voisin - vector< vector > voisins_de_maille; - - // liste des numéros globaux de faces qui sont au bord du maillage - // Ce sont les faces qui n'ont qu'une seule maille de rattachement - vector face_au_bord; - // liste des numéros globaux de mailles qui sont au bord - // ce sont les mailles qui ont une face sans voisin - vector maille_au_bord; - - // Méthode privée - // construit le tableau mailles_contenant_noeud - void Construit_Contenant_Noeud(); - -public : - - Wrapper_Maillage():mailles(NULL) {} - // Construit les Connectivités du maillage à la construction - Wrapper_Maillage(NUAGEMAILLE * fs, int nn); - ~Wrapper_Maillage() {} - - // Méthodes de la politique - inline int DONNE_NBR_FACES_MAILLE(int num_maille); - inline int DONNE_VOISIN_DE_MAILLE(int num_maille,int num_face) const; - inline int EST_AU_BORD_FACE_DE_MAILLE(int num_maille,int num_face) const; - inline int DONNE_NBR_FACES(int num_maille) const; - inline int DONNE_PREMIERE_MAILLE_CONTENANT(int num_noeud) const; - inline NUAGEMAILLE * DONNE_POINTEUR_NUAGEMAILLE(); - -}; - -////////////////////////////////////////////////////////////////// -/// /// -/// CODE /// -/// /// -////////////////////////////////////////////////////////////////// - -template int Wrapper_Maillage::DONNE_PREMIERE_MAILLE_CONTENANT(int num_noeud) const - { - return mailles_contenant_noeud[num_noeud][0]; - } -template int Wrapper_Maillage::DONNE_VOISIN_DE_MAILLE(int num_maille,int num_face) const - { - return voisins_de_maille[num_maille][num_face]; - } -template int Wrapper_Maillage::EST_AU_BORD_FACE_DE_MAILLE(int num_maille,int num_face) const - { - return face_au_bord[faces_contenues[num_maille][num_face]]; - } -template int Wrapper_Maillage::DONNE_NBR_FACES_MAILLE(int num_maille) - { - return (*mailles)[num_maille].DONNE_NBR_FACES(); - } -template NUAGEMAILLE * Wrapper_Maillage::DONNE_POINTEUR_NUAGEMAILLE() - { - return mailles; - } -template void Wrapper_Maillage::Construit_Contenant_Noeud() - { - int nbr_noeuds_maille; - int num,num_noeud,num_maille; - - mailles_contenant_noeud.resize(nbr_noeuds); - - // parcours le tableau des mailles, puis les sommets de chaque maille - // et utilise un push_back pour renseigner mailles_contenant_noeud - - for (num_maille=0;num_mailleSIZE();num_maille++) - { - nbr_noeuds_maille=(*mailles)[num_maille].DONNE_NBR_NOEUDS(); - for (num_noeud=0;num_noeud Wrapper_Maillage::Wrapper_Maillage(NUAGEMAILLE * fs,int nn) - { - - if (fs) mailles=fs; - else - { - cerr<<"Wrapper_Maillage : Nuage mailles vide passé en argument"<SIZE(); - int nbr_formants=0; - int approx_nbr_formants=0; - int tmp; - int num_loc; - - nbr_noeuds=nn; - - voisins_de_maille.resize(nbr_mailles); - faces_contenues.resize(nbr_mailles); - maille_au_bord.resize(nbr_mailles,UNDEFINED); - - type_retour sommets_face; - - Construit_Contenant_Noeud(); - - // mise a taille des tableaux et calcul d'une approximation du nombre de faces - // on postule que le nombre de faces réel est le dixieme de la somme du nombre de faces par maille sur toutes les mailles - // on calcule cette approximation pour éviter les allocations fréquentes dues aux push_back pour des petits tableaux - - for (num_maille=0;num_maille(tmp,UNDEFINED); - faces_contenues[num_maille]=vector(tmp,UNDEFINED); - approx_nbr_formants+=tmp; - } - - face_au_bord.reserve(approx_nbr_formants/10); - - // algorithme principal - - // REMARQUE : les faces sont numérotées mais ne sont pas construites ni stockées - - int flag_interm; - - // on parcourt en premier lieu le nuage de maille (linéaire, en Nombre de Maille) - - for (num_maille=0;num_maillenum_maille) - { - flag_interm=1; - - // pour cette maille secondaire on regarde si elle contient la face primaire - // (borné, par 8*4=32) - - num_loc=(*mailles)[num_maille_sec].DONNE_NUM_LOC_FACE_EGALE_A_FORMANT(sommets_face); - if (num_loc>UNDEFINED) - { - - // et dans ce cas, la maille secondaire est voisine de la maille primaire, on met à jour les tableaux - // si on voulait construire le tableau des faces, c'est ici qu'il faudrait le faire -1- - - // MESSAGE("La maille "< class Wrapper_Noeud -{ -protected : - double * coordonnees; -public : - Wrapper_Noeud():coordonnees(NULL) - { - } - Wrapper_Noeud(double * coord):coordonnees(coord) - { - } - ~Wrapper_Noeud() - { - } - void positionne(double *place) - { - coordonnees=place; - } - const double & operator[] (int i) const - { - return coordonnees[i]; - } - double operator[] (int i) - { - return coordonnees[i]; - } - friend double DistanceInf(const Wrapper_Noeud &A,const Wrapper_Noeud &B) - { - double max=0; - double tmp; - for (int i=0;imax) max=tmp; - } - return max; - } - friend double DistanceL2(const Wrapper_Noeud &A,const Wrapper_Noeud &B) - { - double tmp,somme=0; - for (int i=0;i &A,const Wrapper_Noeud &B) - { - for (int i=0;i &A) - { - os<<"( "< class Wrapper_Nuage_Noeud - { - protected : - int nbr_noeuds; - double * noeuds; - Wrapper_Noeud show; - public : - Wrapper_Nuage_Noeud():nbr_noeuds(0),noeuds(NULL) {} - Wrapper_Nuage_Noeud(int nn, double *n):nbr_noeuds(nn),noeuds(n),show(noeuds) {} - ~Wrapper_Nuage_Noeud() {} - Wrapper_Noeud & operator [] (int i) - { - show.positionne((double *) &noeuds[DIMENSION*i]); - return show; - } - int size() const {return nbr_noeuds;} - int SIZE() const {return nbr_noeuds;} - void affiche() - { - int i,j; - for (i=0;i -#define _DTREE_ dTree - -////////////////////////////////////////////////////////////////// -/// /// -/// DECLARATIONS /// -/// /// -////////////////////////////////////////////////////////////////// - -/*********************************************************/ -/* */ -/* Calcul Statique de Puissance */ -/* */ -/*********************************************************/ - -// Permet de Calculer 2^n de façon statique - -template < int DIMENSION > struct DeuxPuissance - { - enum { valeur = 2 * DeuxPuissance::valeur } ; - }; - -template <> struct DeuxPuissance<0> - { - enum { valeur = 1 } ; - }; - -/*********************************************************/ -/* */ -/* DTREE */ -/* */ -/*********************************************************/ - -// Construit un d-Tree sur un nuage de noeud et pour un noeud donné donne lequel des noeuds du nuage est le plus proche - -// # Bugs connus : -// - Problemes avec points sur les faces des hypercubes ? -// - Plantage sauvage si le point est plus loin de l'hypercube père que le diametre Linf de celui-ci. -// # Politique de classe : -// - NOEUD : voir dans MEDMEM_WrapperNodes.hxx la classe Wrapper_Noeud<..> -// - NUAGENOEUD : typiquement, c'est vector en rédefinissant NUAGENOEUD<...>::SIZE()=vector<...>::size() -// Remarques : -// - NBR_NOEUDS_PAR_CASE ne doit pas être modifié sauf peut-être dans le cas où l'utilisateur veut utiliser des d-Tree parallèles -// ou utilise des nuages de noeud trop grands - -template class dTree -{ -protected : - // types - typedef _DTREE_ * Ptr_dTree; - // Static Const - static const int nbr_descendants=DeuxPuissance::valeur; - // champs - NUAGENOEUD * nuage; - Ptr_dTree descendant[nbr_descendants]; - // numéro des noeuds contenus - vector * noeud_contenu; - int etat; - int niveau; - dTree * pere; - // extrémités de l'hypercube du dTree - Sommet_dTree coord_max; - Sommet_dTree coord_min; -public : - - void init(); - dTree(); - // Ce constructeur est le seul constructeur utilisateur, il construit le père puis tous les descendants - dTree(NUAGENOEUD *n); - // Ce Constructeur est utilisé par le précédent, pour un pere donné, avec deux extrémités données, - // il instantie un dTree sans en calculer les noeuds contenus - dTree(const Sommet_dTree &A,const Sommet_dTree &B,dTree *mypere); - dTree(const dTree &F); - ~dTree(); - // Renvoie les numéros de noeuds contenus dans le dTree - void Get_Noeuds_Filtre(vector &tmp); - // renvoie les extrémités - Sommet_dTree Get_Max() const; - Sommet_dTree Get_Min() const; - // renvoie vrai si P est dans le dTree - int is_in_dTree(NOEUD P) const; - // calcule la distance topologique locale de P au dTree - double calcule_distance(NOEUD P) const; - dTree & operator = (const dTree & F); - // retourne le sommet du dTree codé par l'entier selecteur (voir explications dans le code) - Sommet_dTree donne_sommet(int selecteur) const; - int a_des_fils() const; - // renvoi une reference sur le dTree terminal descendant de this contenant P - dTree * trouve_dTree_contenant(NOEUD P) const; - // renvoie le point le plus proche de P dans this par la méthode exhaustive brutale - int trouve_plus_proche_point_bourrin(NOEUD P) const; - // renvoie le point le plus proche de p dans this par la méthode dtree - int trouve_plus_proche_point(NOEUD P) const; - // renvoie un numéro de point contenu dans this - int trouve_un_point() const; - // méthode récursive utilisée par trouve_plus_proche_point - int tppp_rec(NOEUD P,double &delta,int &flag) const; - // dit si P est d-proche de l'hypercube de this - int Localise_Point(NOEUD P,double d) const; - // utilisé par le constructeur pour créer tout la filiation du dTree - void cree_filiation(); - // méthodes de mesure - int Get_Nbr_Descendants_Non_Vides() const; - int Get_Nbr_Descendants_Vides() const; - int Get_Profondeur_Max() const; -}; - - -////////////////////////////////////////////////////////////////// -/// /// -/// CODE /// -/// /// -////////////////////////////////////////////////////////////////// - -_TEMPLATE_ void _DTREE_::init() - { - int i; - nuage=NULL; - noeud_contenu=NULL; - etat=DTREE_FANTOME; - for (i=0;i(nuage->size()); - niveau=0; - - // calcule les extrémités du dTree pere - for (i=0;isize();i++) - { - (*noeud_contenu)[i]=i; - for (j=0;jcoord_max[j]) coord_max[j]=(*nuage)[i][j]; - if ((*nuage)[i][j] &A,const Sommet_dTree &B,dTree *mypere) - { - if (mypere!=NULL) - { - - int i,j; - double tmp; - - init(); - - pere=mypere; - nuage=pere->nuage; - niveau=pere->niveau+1; - - etat=DTREE_COURANT; - - noeud_contenu=new vector; - noeud_contenu->reserve((pere->noeud_contenu->size())/nbr_descendants); - - for (i=0;iB[i]) - { - coord_max[i]=A[i]; - coord_min[i]=B[i]; - } - else - { - coord_min[i]=A[i]; - coord_max[i]=B[i]; - } - } - } - else - { - cerr<<"DTREE : Construction de descendance sans père !"< &tmp) - { - int i; - switch (etat) - { - case DTREE_RACINE : int pourlefunlecompilolesttropcon; - case DTREE_COURANT : - for (i=0;iGet_Noeuds_Filtre(tmp); - case DTREE_TERMINAL : - if (noeud_contenu->size()>0) - { - for (i=0;i _DTREE_::Get_Max() const - { - return coord_max; - } -_TEMPLATE_ Sommet_dTree _DTREE_::Get_Min() const - { - return coord_min; - } -_TEMPLATE_ int _DTREE_::is_in_dTree(NOEUD P) const - { - int test; - for (int i=0;itmp) min=tmp; - tmp=fabs(coord_min[i]-P[i]); - if (min>tmp) min=tmp; - } - return min; - } -_TEMPLATE_ _DTREE_ & _DTREE_::operator = (const _DTREE_ & F) - { - // Pas Super Top Moumoute ... Recopie de pointeurs et pas de contenus, merdique - int i,j; - init(); - for (i=0;i _DTREE_::donne_sommet(int selecteur) const - { - Sommet_dTree p; - int i; - int residu=selecteur; - int reste; - for (i=0;i B(coord_min,coord_max); - int i; - if ((etat==DTREE_RACINE)&&(!is_in_dTree(P))) return NULL; // Le noeud est extérieur a l'dTree - else if (etat==DTREE_TERMINAL) return (dTree *) this; // Le noeud est dans *this qui est terminal - - for (i=0;i A=donne_sommet(i); - int test,j; - for (j=0;j=P[j])&&(P[j]>=B[j])); - if (!test) break; - } - - if (test) return descendant[i]->trouve_dTree_contenant(P); // Propagation - } - } -// si de le dTree n'est pas TERMINAL, scanne tous les points du nuage du pere pour trouver le point le plus proche -// sinon scanne uniquement les points contenus dans le dTree -_TEMPLATE_ int _DTREE_::trouve_plus_proche_point_bourrin(NOEUD P) const - { - int i; - int num_sol=0; - double min; - double tmp; - if (etat!=DTREE_TERMINAL) - { - min=DistanceL2(P,(*nuage)[0]); - for (i=1;isize();i++) - { - tmp=DistanceL2(P,(*nuage)[i]); - if (tmpsize()!=0) - { - num_sol=(*noeud_contenu)[0]; - min=DistanceL2(P,(*nuage)[num_sol]); - for (i=1;isize();i++) - { - tmp=DistanceL2(P,(*nuage)[(*noeud_contenu)[i]]); - if (tmppere!=NULL) - { - delta=DistanceInf((ref->pere->coord_max),(ref->pere->coord_min)); - } - else - { - cerr<<"DTREE : TROUVE PLUS PROCHE POINT : l'octree contenant le noeud n'a pas de pere !"<size()>0) return (*(noeud_contenu))[0]; - } - else - { - int i; - for (i=0;itrouve_un_point(); - } - } - } -// partie recursive de trouve_plus_proche_point -// change le flag en 1 si un point plus proche est trouvé -// adapte automatiquement la distance delta de filtrage -_TEMPLATE_ int _DTREE_::tppp_rec(NOEUD P,double &delta,int &flag) const - { - if (Localise_Point(P,delta)==0) - { - - // La distance du point à l'octree est plus grande que delta - - return DTREE_FANTOME; - } - int num_Ptmp; - double dtmp; - if (etat==DTREE_TERMINAL) - { - if (noeud_contenu->size()>0) - { - num_Ptmp=trouve_plus_proche_point_bourrin(P); - dtmp=DistanceL2((*nuage)[num_Ptmp],P); - if (dtmp<=delta) - { - - // Le point le plus proche minimise delta, c'est un bon candidat, on l'envoie ! - - delta=dtmp; - flag=1; - return num_Ptmp; - } - - // Le point le plus proche ne minimise pas delta - - // ===========> peut etre rajouter exit(-1); ?????????? - return DTREE_FANTOME; - } - else - { - - // L'octree qui contient P ne contient aucun point - - return DTREE_FANTOME; - } - } - int i; - int num_sol=DTREE_FANTOME; - for (i=0;itppp_rec(P,delta,flag); - if ((num_Ptmp!=DTREE_FANTOME)&&(flag==1)) - { - - // On a trouvé un point qui minimise delta dans une branche - - num_sol=num_Ptmp; - } - } - // A ce stade, on a trouvé un point qui minimise tous les deltas, c'est donc le point le plus proche - // REMARQUE : cette affirmation est à la base de l'algorithme par dTree mais est loin d'étre évidente - - return num_sol; - } - -// renvoie 1 si la distance L inf du noeud a l'octree est plus petite que d, 0 sinon -_TEMPLATE_ int _DTREE_::Localise_Point(NOEUD P,double d) const - { - int i; - for (i=0;icoord_max[i]+d) return 0; - if (P[i]niveau+1; - } - else - { - niveau=0; - } - - if (noeud_contenu->size()<=NBR_NOEUDS_PAR_CASE) - { - etat=DTREE_TERMINAL; - } - else - { - int i,num_loc,test; - - Sommet_dTree centre(coord_max,coord_min); - - for (i=0;isize();num_loc++) - { - int indice=(*noeud_contenu)[num_loc]; - NOEUD & courant=(*nuage)[indice]; - test=1; - for (i=0;(test)&&(iis_in_dTree(courant)) - { - descendant[i]->noeud_contenu->push_back(indice); - test=0; - } - } - } - - delete noeud_contenu; - noeud_contenu=NULL; - - for (i=0;icree_filiation(); - } - } -_TEMPLATE_ int _DTREE_::Get_Nbr_Descendants_Non_Vides() const - { - int i; - int ndnv=0; - switch (etat) - { - case DTREE_RACINE : int pourlefunlecompilolesttropcon; - case DTREE_COURANT : - for (i=0;iGet_Nbr_Descendants_Non_Vides(); - return ndnv; - case DTREE_TERMINAL : - if (noeud_contenu->size()>0) return 1; - else return 0; - default : - cerr<<"dTree Non Valide dans Get_Nbr_Descendants_Non_Vides"<Get_Nbr_Descendants_Vides(); - return ndnv; - case DTREE_TERMINAL : - if (noeud_contenu->size()==0) return 1; - else return 0; - default : - cerr<<"dTree Non Valide dans Get_Nbr_Descendants_Non_Vides"<Get_Profondeur_Max(); - if (tmp>prof) prof=tmp; - } - return prof; - case DTREE_TERMINAL : return niveau; - default : - cerr<<"dTree Non Valide dans Get_Nbr_Descendants_Non_Vides"< class Sommet_dTree -{ -protected : - double coord[DIMENSION]; -public : - Sommet_dTree() - { - } - Sommet_dTree(double *c) - { - for (int i=0;i &A,const Sommet_dTree &B) - { - double max=0; - double tmp; - for (int i=0;imax) max=tmp; - } - return max; - } -}; - -#endif diff --git a/src/MEDMEM/INTERPOLATION/Makefile.in b/src/MEDMEM/INTERPOLATION/Makefile.in deleted file mode 100644 index b3ff8292e..000000000 --- a/src/MEDMEM/INTERPOLATION/Makefile.in +++ /dev/null @@ -1,100 +0,0 @@ -# MED MEDMEM : MED files in memory -# -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : Makefile.in -# Module : MED - -top_srcdir=@top_srcdir@ -top_builddir=../../.. -srcdir=@srcdir@ -VPATH=.:$(srcdir):$(srcdir)/tests - -MACHINE=PCLINUX - -@COMMENCE@ - - -EXPORT_PYSCRIPTS = \ - - -EXPORT_HEADERS = \ -MEDMEM_dTree.hxx\ -MEDMEM_dTreeSommet.hxx\ -MEDMEM_InterpolationHighLevelObjects.hxx\ -MEDMEM_Interpolation.hxx\ -MEDMEM_InterpolationTools.hxx\ -MEDMEM_Mapping.hxx\ -MEDMEM_MappingTools.hxx\ -MEDMEM_WrapperCells.hxx\ -MEDMEM_WrapperConnectivity.hxx\ -MEDMEM_WrapperField.hxx\ -MEDMEM_WrapperMesh.hxx\ -MEDMEM_WrapperNodes.hxx - - -# Libraries targets - -LIB= -LIB_SRC = - - -# Executables targets -BIN = -BIN_SRC = -BIN_SERVER_IDL = -BIN_CLIENT_IDL = - -TEST_PROGS = \ -test_MEDMEM_InterpolationFlipBack\ -test_MEDMEM_InterpolationFromMesh_toMesh\ -test_MEDMEM_InterpolationRecopieMaillage\ -test_MEDMEM_InterpolationSansRecopieMaillage\ -test_MEDMEM_InterpolationTimeStep\ -UseCasedTree\ -UseCaseInterpolationts\ -UseCaseInterpolationwots\ -UseCaseMapping\ -UseCaseWrapper_Maillage - - - - -CPPFLAGS+=-U_DEBUG_ $(MED2_INCLUDES) $(HDF5_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -I../ -CXXFLAGS+=-U_DEBUG_ -ftemplate-depth-42 -I${KERNEL_ROOT_DIR}/include/salome -LDFLAGS+=$(MED2_LIBS) $(HDF5_LIBS) -lSalomeLoggerServer -L${KERNEL_ROOT_DIR}/lib/salome - -LDFLAGSFORBIN+=$(MED2_LIBS) $(HDF5_LIBS) -L../.libs -lmedmem -lSalomeLoggerServer -L${KERNEL_ROOT_DIR}/lib/salome - -LIBSFORBIN= - -LDFLAGS= - -LIBS= - -# build create_mesh : -bin: create_mesh_interpolation - -create_mesh_interpolation: %: %.c - $(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $(MED2_LIBS) $(HDF5_LIBS) $< - -@CONCLUDE@ diff --git a/src/MEDMEM/INTERPOLATION/UseCaseInterpolationts.cxx b/src/MEDMEM/INTERPOLATION/UseCaseInterpolationts.cxx deleted file mode 100644 index 288cd72de..000000000 --- a/src/MEDMEM/INTERPOLATION/UseCaseInterpolationts.cxx +++ /dev/null @@ -1,78 +0,0 @@ -#include "MEDMEM_Exception.hxx" -#include "MEDMEM_define.hxx" - -#include "MEDMEM_Med.hxx" -#include "MEDMEM_Field.hxx" -#include "MEDMEM_Mesh.hxx" -#include "MEDMEM_Interpolation.hxx" - -#include - -#include "stdio.h" - -main () { - - const char * fromFileName = "ResultatSyrthes.med"; - const char * toFileName = "MaillageAster.med"; - const char * resultFileName = "ResultatInterpolation.med"; - - const char * fromFieldName = "THERDEP_TEMP____________________"; - - const char * fromMeshName = "MA"; - const char * toMeshName = "MAILLAGE_IDEAS"; - int handle; - - try { - - - MED fromMED(MED_DRIVER,fromFileName); - - fromMED.updateSupport(); - - MESH toMesh(MED_DRIVER,toFileName,toMeshName); - - deque pasDeTemps=fromMED.getFieldIteration (fromFieldName); - - deque::const_iterator currentStep; - - INTERPOLATION<3> * myInter ; - FIELD * toField ; - int flagNewMapping = 1; - - for (currentStep=pasDeTemps.begin();currentStep!=pasDeTemps.end();currentStep++) - { - FIELD_ * fromField_ = fromMED.getField(fromFieldName,(*currentStep).dt,(*currentStep).it) ; - - FIELD * fromField = dynamic_cast *>(fromField_); - - fromField->getSupport()->getMesh()->read(); - - fromField->read(); - - if (currentStep==pasDeTemps.begin()) - { - myInter = new INTERPOLATION<3>(*fromField,toMesh) ; - - toField = myInter->interpolate(1,1); - } - else - { - toField = myInter->interpolateNextStep(*fromField,flagNewMapping); - } - - toField->addDriver(MED_DRIVER,resultFileName,toField->getName()); - - toField->write(); - - if (flagNewMapping==1) - { - handle = toMesh.addDriver(MED_DRIVER,resultFileName,toMesh.getName()) ; - - toMesh.write(handle); - } - } - - } catch (MEDEXCEPTION& ex){ - MESSAGE(ex.what()) ; - } -} diff --git a/src/MEDMEM/INTERPOLATION/UseCaseInterpolationwots.cxx b/src/MEDMEM/INTERPOLATION/UseCaseInterpolationwots.cxx deleted file mode 100644 index 67a3b790c..000000000 --- a/src/MEDMEM/INTERPOLATION/UseCaseInterpolationwots.cxx +++ /dev/null @@ -1,43 +0,0 @@ -#include "MEDMEM_Exception.hxx" -#include "MEDMEM_define.hxx" - -#include "MEDMEM_Field.hxx" -#include "MEDMEM_Mesh.hxx" -#include "MEDMEM_Interpolation.hxx" - -#include "stdio.h" - -using namespace MEDMEM; - -main () { - - const char * fromFileName = "fromMesh.med"; - const char * toFileName = "toMesh.med"; - const char * fieldName = "fieldnodedouble"; - - const char * fromMeshName = "fromMesh"; - const char * toMeshName = "toMesh"; - - const int flagConvex = 1; - const int interpolationType = 1; - - try { - - MESH fromMesh (MED_DRIVER,fromFileName,fromMeshName); - SUPPORT fromSupport (&fromMesh,"XsupportX",MED_NODE); - FIELD fromField (&fromSupport,MED_DRIVER,fromFileName,fieldName); - MESH toMesh (MED_DRIVER,toFileName,toMeshName); - - INTERPOLATION<3> myInter (fromField,toMesh); - - FIELD * toField = myInter.interpolate(interpolationType,flagConvex); - - toField->addDriver(MED_DRIVER,toFileName,toField->getName()) ; - - toField->write(); - - - } catch (MEDEXCEPTION& ex){ - MESSAGE(ex.what()) ; - } -} diff --git a/src/MEDMEM/INTERPOLATION/UseCaseMapping.cxx b/src/MEDMEM/INTERPOLATION/UseCaseMapping.cxx deleted file mode 100644 index 0c98da028..000000000 --- a/src/MEDMEM/INTERPOLATION/UseCaseMapping.cxx +++ /dev/null @@ -1,50 +0,0 @@ -#include "stdio.h" -#include "stdlib.h" - -#include - -#include "MEDMEM_InterpolationHighLevelObjects.hxx" - -int main (void) -{ -int i; - -const int DIMENSION = 3; - -const int isConvexFromMesh = 1; - -const char * fromFileName = "fromMesh.med"; -const char * fromMeshName = "fromMesh"; - -MESH * fromMesh = new MESH(MED_DRIVER,fromFileName,fromMeshName); - -const char * toFileName = "toMesh.med"; -const char * toMeshName = "toMesh"; - -MESH * toMesh = new MESH(MED_DRIVER,toFileName,toMeshName); - -Meta_Wrapper * fromWrapper = new Meta_Wrapper - ( - fromMesh->getNumberOfNodes(), - const_cast (fromMesh->getCoordinates(MED_FULL_INTERLACE)), - const_cast (fromMesh->getConnectivityptr()) - ); - -Meta_Wrapper * toWrapper = new Meta_Wrapper - ( - toMesh->getNumberOfNodes(), - const_cast (toMesh->getCoordinates(MED_FULL_INTERLACE)) - ); - -Meta_Mapping * mapping = new Meta_Mapping (fromWrapper,toWrapper); - -mapping->Cree_Mapping(isConvexFromMesh); - -vector vectormapping = mapping->Get_Mapping(); - -for (i=0;i - -#include "MEDMEM_InterpolationHighLevelObjects.hxx" - -int main (void) -{ -int i,j; - -const char * fromFileName = "fromMesh.med"; -const char * fromMeshName = "fromMesh"; - -MESH fromMesh(MED_DRIVER,fromFileName,fromMeshName); - -Meta_Nuage_Maille * nuagemailles = new Meta_Nuage_Maille(const_cast (fromMesh.getConnectivityptr())); - -int nbr_noeuds = fromMesh.getNumberOfNodes(); - -Meta_Maillage * maillage = new Meta_Maillage(nuagemailles,nbr_noeuds); - -int nbr_mailles = maillage->DONNE_POINTEUR_NUAGEMAILLE()->SIZE(); - -int nbr_faces; - -for (i=0;iDONNE_NBR_FACES_MAILLE(i); - for (j=0;jDONNE_VOISIN_DE_MAILLE(i,j)<<"]-("<EST_AU_BORD_FACE_DE_MAILLE(i,j)<<") "< - -#include "MEDMEM_InterpolationHighLevelObjects.hxx" - -#define affiche(NOEUD) cout< -#include - -#define MED_NOPG 1 /* -> pas de point de Gauss */ -#define MED_NOPFL "" /* -> pas de profils utilisateur */ -#define MED_NOPFLi " " /* Variable Interne */ -#define MED_NOPF 0 /* -> pas de profils pour _MEDdataseNnumEcrire */ -#define MED_NOPDT -1 /* rem: pas de pas de temps negatifs */ -#define MED_NONOR -1 /* rem: pas de n°ordre negatif */ -#define MED_DIM1 1 /* PAS */ - -#define MED_ALL 0 - -/*****************************************************************************************************/ - -void affiche_noeuds(med_float * nodes,int nnpl) - { - int nbr_nodes=nnpl*nnpl*nnpl; - int i; - - for (i=0;i=3*nbr_nodes) {printf("%d : OUT OF RANGE REQUEST\n",num_noeud);exit(-1);} - if (3*num_noeud+1>=3*nbr_nodes) {printf("%d : OUT OF RANGE REQUEST\n",num_noeud);exit(-1);} - if (3*num_noeud+2>=3*nbr_nodes) {printf("%d : OUT OF RANGE REQUEST\n",num_noeud);exit(-1);} - - coord_nodes[3*num_noeud ]= (double) (i+flag)/diviseur; - coord_nodes[3*num_noeud+1]= (double) (j+flag)/diviseur; - coord_nodes[3*num_noeud+2]= (double) (k+flag)/diviseur; - } - - affiche_noeuds(coord_nodes,nnpl); - - } -void cree_num_nodes(med_int * num_nodes,int nnpl) - { - int nbr_nodes=nnpl*nnpl*nnpl; - int i; - /*num_nodes=(med_int *) malloc(nbr_nodes*sizeof(med_int));*/ - for (i=0;i=8*nbr_hexa8) {printf("%d : OUT OF RANGE REQUEST\n",num_hexa8);exit(-1);} - if (8*num_hexa8+1>=8*nbr_hexa8) {printf("%d : OUT OF RANGE REQUEST\n",num_hexa8);exit(-1);} - if (8*num_hexa8+2>=8*nbr_hexa8) {printf("%d : OUT OF RANGE REQUEST\n",num_hexa8);exit(-1);} - if (8*num_hexa8+3>=8*nbr_hexa8) {printf("%d : OUT OF RANGE REQUEST\n",num_hexa8);exit(-1);} - if (8*num_hexa8+4>=8*nbr_hexa8) {printf("%d : OUT OF RANGE REQUEST\n",num_hexa8);exit(-1);} - if (8*num_hexa8+5>=8*nbr_hexa8) {printf("%d : OUT OF RANGE REQUEST\n",num_hexa8);exit(-1);} - if (8*num_hexa8+6>=8*nbr_hexa8) {printf("%d : OUT OF RANGE REQUEST\n",num_hexa8);exit(-1);} - if (8*num_hexa8+7>=8*nbr_hexa8) {printf("%d : OUT OF RANGE REQUEST\n",num_hexa8);exit(-1);} - - conn_hexa8[8*num_hexa8 ] = num_nodes[ i0+nnpl*j1+nnpl*nnpl*k1 ]; - conn_hexa8[8*num_hexa8+1] = num_nodes[ i0+nnpl*j0+nnpl*nnpl*k1 ]; - conn_hexa8[8*num_hexa8+2] = num_nodes[ i1+nnpl*j0+nnpl*nnpl*k1 ]; - conn_hexa8[8*num_hexa8+3] = num_nodes[ i1+nnpl*j1+nnpl*nnpl*k1 ]; - conn_hexa8[8*num_hexa8+4] = num_nodes[ i0+nnpl*j1+nnpl*nnpl*k0 ]; - conn_hexa8[8*num_hexa8+5] = num_nodes[ i0+nnpl*j0+nnpl*nnpl*k0 ]; - conn_hexa8[8*num_hexa8+6] = num_nodes[ i1+nnpl*j0+nnpl*nnpl*k0 ]; - conn_hexa8[8*num_hexa8+7] = num_nodes[ i1+nnpl*j1+nnpl*nnpl*k0 ]; - - - } - - for (num_hexa8=0;num_hexa8 0 - - les numeros de familles des elements sont < 0 - - rien d'imposer sur les noms de familles - */ - -/* la famille 0 */ - if (ret == 0) - { - strcpy(nomfam,"FAMILLE_0"); - numfam = 0; - ret = MEDfamCr(fromfid,frommaa,nomfam,numfam,&attide,&attval,attdes,0,gro,0); - } - printf("MEDfamCr : %d \n",ret); -/*****************************************************************************************************/ - - if (ret == 0) - { - strcpy(nomfam,"FAMILLE_0"); - numfam = 0; - ret = MEDfamCr(tofid,tomaa,nomfam,numfam,&attide,&attval,attdes,0,gro,0); - } - printf("MEDfamCr : %d \n",ret); - -/*****************************************************************************************************/ -/* Les champs */ - - if (ret == 0) - { - ret = MEDchampCr(fromfid,champnode,MED_REEL64,champnode_comp,champnode_unit,1); - printf("MEDchampCr : %d \n",ret); - if (ret == 0) - { - ret = MEDchampEcr(fromfid, frommaa, champnode, (unsigned char *)fieldnodedouble, - MED_FULL_INTERLACE, fromnnoe, - MED_NOPG, MED_ALL, MED_NOPFL, MED_ECRI, MED_NOEUD, - 0, MED_NOPDT," ", 0. , MED_NONOR); - printf("MEDchampEcr : %d \n",ret); - } - } - - if (ret == 0) - { - ret = MEDchampCr(fromfid,champcell,MED_REEL64,champcell_comp,champcell_unit,3); - printf("MEDchampCr : %d \n",ret); - if (ret == 0) - { - ret = MEDchampEcr(fromfid, frommaa, champcell, (unsigned char *)fieldcelldoublevector, - MED_FULL_INTERLACE, fromnhexa8, - MED_NOPG, MED_ALL, MED_NOPFL, MED_ECRI, MED_MAILLE, - MED_HEXA8, MED_NOPDT," ", 0., MED_NONOR); - printf("MEDchampEcr : %d \n",ret); - } - } - - if (ret == 0) - { - ret = MEDchampCr(fromfid,champcellscalar,MED_REEL64,champcellscalar_comp,champcellscalar_unit,1); - printf("MEDchampCr : %d \n",ret); - if (ret == 0) - { - ret = MEDchampEcr(fromfid, frommaa, champcellscalar, (unsigned char *)fieldcelldouble, - MED_FULL_INTERLACE, fromnhexa8, - MED_NOPG, MED_ALL, MED_NOPFL, MED_ECRI, MED_MAILLE, - MED_HEXA8, MED_NOPDT," ", 0., MED_NONOR); - printf("MEDchampEcr : %d \n",ret); - } - } - - if (ret == 0) - { - ret = MEDchampCr(fromfid,champnodevector,MED_REEL64,champnodevector_comp,champnodevector_unit,3); - printf("MEDchampCr : %d \n",ret); - if (ret == 0) - { - ret = MEDchampEcr(fromfid, frommaa, champnodevector, (unsigned char *)fieldnodedoublevector, - MED_FULL_INTERLACE, fromnnoe, - MED_NOPG, MED_ALL, MED_NOPFL, MED_ECRI, MED_NOEUD, - 0, MED_NOPDT," ", 0. , MED_NONOR); - printf("MEDchampEcr : %d \n",ret); - } - } - - -/***************************************************************************/ -ret = MEDfermer(fromfid); -printf("MEDfermer : %d\n",ret); -/***************************************************************************/ -ret = MEDfermer(tofid); -printf("MEDfermer : %d\n",ret); - -return 0; -} - diff --git a/src/MEDMEM/INTERPOLATION/test_MEDMEM_Interpolation.cxx b/src/MEDMEM/INTERPOLATION/test_MEDMEM_Interpolation.cxx deleted file mode 100644 index 5d8112d8e..000000000 --- a/src/MEDMEM/INTERPOLATION/test_MEDMEM_Interpolation.cxx +++ /dev/null @@ -1,56 +0,0 @@ -#include "MEDMEM_Exception.hxx" -#include "MEDMEM_define.hxx" - -#include "MEDMEM_Field.hxx" -#include "MEDMEM_Mesh.hxx" -#include "MEDMEM_Interpolation.hxx" - -#include "stdio.h" - -main () { - - const char * fromFileName = "fromMesh.med"; - const char * toFileName = "toMesh.med"; - //const char * fieldName = "fieldcelldoublevector"; - const char * fieldName = "fieldnodedouble"; - - const char * fromMeshName = "fromMesh"; - const char * toMeshName = "toMesh"; - - try { - - cout<<"Lecture du Maillage Source : "< fromField (&fromSupport,MED_DRIVER,fromFileName,fieldName); cout<<"OK !"< myInter (fromField,toMesh); - - //FIELD * toField = myInter.interpolate(0,1); - FIELD * toField = myInter.interpolate(1,1); - - cout<<"Creation du driver"<addDriver(MED_DRIVER,toFileName,toField->getName()) ; - - cout<<"toField->getName() = "<getName() <getDescription() = "<getDescription() <getNumberOfComponents() = "<getNumberOfComponents() <getNumberOfValues() = "<getNumberOfValues() <getComponentsNames() = "<getComponentsNames() <getComponentsDescriptions() = "<getComponentsDescriptions()<getMEDComponentsUnits() = "<getMEDComponentsUnits() <getIterationNumber() = "<getIterationNumber() <getTime() = "<getTime() <getOrderNumber() = "<getOrderNumber() <getValueType() = "<getValueType() <write(); - - cout<<"Fin"< - -#include "stdio.h" - -using namespace MEDMEM; - -// pour gestion timings -#include "time.h" - -#define RUN(procedure) {double t0,t1;cout<<"# =============> TEMPS D'EXECUTION A PARTIR D'ICI "< TEMPS D'EXECUTION : "< v) - { - double tmp=0; - int i; - for (i=0;i v1,Valeur v2) - { - double tmp=0; - int i; - for (i=0;i * firstField, FIELD * secondField) - { - Wrapper_MED_Field first ( firstField); - Wrapper_MED_Field second (secondField); - int nbr_valeurs_first = first.Get_Nbr_Valeurs(); - int nbr_valeurs_second = second.Get_Nbr_Valeurs(); - - double max1 = 0; - double max2 = 0; - - double min1 = ABS(first[0]); - double min2 = ABS(second[0]); - - int imax1,imax2; - - double tmp; - - int i; - - //cout<>tyty; - - if (nbr_valeurs_first!=nbr_valeurs_second) - { - cerr<<"Les champs à soustraire n'ont pas le meme nombre de valeurs"< pasDeTemps=fromMED.getFieldIteration (fromFieldName); - cout<<"OK !"<::const_iterator currentStep; - - INTERPOLATION<3> * interFromTo ; - INTERPOLATION<3> * interToFrom ; - FIELD * toField ; - FIELD * toToField ; - int flagNewMappingFromTo = 0; - int flagNewMappingToFrom = 0; - - for (currentStep=pasDeTemps.begin();currentStep!=pasDeTemps.end();currentStep++) - { - cout< * fromField = dynamic_cast *>(fromField_); - cout<<"OK !"<getSupport()->getMesh()->read()); - } - - MESH * fromMesh = fromField->getSupport()->getMesh(); - - cout<read()); - cout<<"OK !"<(*fromField,toMesh)); - cout<<"OK !"<interpolate(1,1)); - cout<<"OK !"<(*toField,*fromMesh)); - cout<<"OK !"<interpolate(1,1)); - cout<<"OK !"<interpolateNextStep(*fromField,flagNewMappingFromTo)); - cout<<"OK !"<interpolateNextStep(*toField,flagNewMappingToFrom)); - cout<<"OK !"<addDriver(MED_DRIVER,resultFileName,toToField->getName()); - cout<<"OK !"<write(); - cout<<"OK !"<addDriver(MED_DRIVER,resultFileName,fromMesh->getName()) ; - cout<<"OK !"<write(handle); - cout<<"OK !"< fromField (&fromSupport,MED_DRIVER,fromFileName,fieldName); cout<<"OK !"< myInter (fromField,toMesh); - - //FIELD * toField = myInter.interpolate(0,1); - FIELD * toField = myInter.interpolate(1,1); - - cout<<"Creation du driver"<addDriver(MED_DRIVER,toFileName,toField->getName()) ; - - cout<<"toField->getName() = "<getName() <getDescription() = "<getDescription() <getNumberOfComponents() = "<getNumberOfComponents() <getNumberOfValues() = "<getNumberOfValues() <getComponentsNames() = "<getComponentsNames() <getComponentsDescriptions() = "<getComponentsDescriptions()<getMEDComponentsUnits() = "<getMEDComponentsUnits() <getIterationNumber() = "<getIterationNumber() <getTime() = "<getTime() <getOrderNumber() = "<getOrderNumber() <getValueType() = "<getValueType() <write(); - - cout<<"Fin"< - -#include "stdio.h" - - - -// pour gestion timings -#include "time.h" - -#define RUN(procedure) {double t0,t1;cout<<"# =============> TEMPS D'EXECUTION A PARTIR D'ICI "< TEMPS D'EXECUTION : "< pasDeTemps=fromMED.getFieldIteration (fromFieldName); - cout<<"OK !"<::const_iterator currentStep; - - INTERPOLATION<3> * myInter ; - FIELD * toField ; - int flagNewMapping = 1; - - for (currentStep=pasDeTemps.begin();currentStep!=pasDeTemps.end();currentStep++) - { - cout< * fromField = dynamic_cast *>(fromField_); - cout<<"OK !"<getSupport()->getMesh()->read()); - } - - cout<read()); - cout<<"OK !"<(*fromField,toMesh)); - cout<<"OK !"<interpolate(1,1)); - cout<<"OK !"<interpolateNextStep(*fromField,flagNewMapping)); - cout<<"OK !"<addDriver(MED_DRIVER,resultFileName,toField->getName()); - cout<<"OK !"<write(); - cout<<"OK !"< - -#include "stdio.h" - -main () { - - const char * fromFileName = "ResultatSyrthes.med"; - const char * toFileName = "MaillageAster.med"; -// const char * resultFileName = "ResultatInterpolation.med"; - - const char * fromFieldName = "THERDEP_TEMP____________________"; - - const char * fromMeshName = "MA"; - const char * toMeshName = "MAILLAGE_IDEAS"; - - try { - - string flag="================[MAIN MESSAGES]================> "; - - cout< pasDeTemps=fromMED.getFieldIteration (fromFieldName) ; cout<<"OK !"< * fromField = dynamic_cast *>(fromField_) ; cout<<"OK !"<getSupport()->getMesh()->read(); - - cout<read() ; cout<<"OK !"< myInter (*fromField,toMesh) ; cout<<"OK !"< * toField = myInter.interpolate(1,1) ; cout<<"OK !"<addDriver(MED_DRIVER,toFileName,toField->getName()) ; cout<<"OK !"<addDriver(MED_DRIVER,resultFileName,toField->getName()) ; cout<<"OK !"<write() ; cout<<"OK !"< - -#include "stdio.h" - -main () { - - const char * fromFileName = "ResultatSyrthes.med"; - const char * toFileName = "MaillageAster.med"; - const char * resultFileName = "ResultatInterpolation.med"; - - const char * fromFieldName = "THERDEP_TEMP____________________"; - - const char * fromMeshName = "MA"; - const char * toMeshName = "MAILLAGE_IDEAS"; - int handle; - - try { - - string flag="================[MAIN MESSAGES]================> "; - - cout< pasDeTemps=fromMED.getFieldIteration (fromFieldName); - cout<<"OK !"<::const_iterator currentStep; - - INTERPOLATION<3> * myInter ; - FIELD * toField ; - int flagNewMapping = 1; - - for (currentStep=pasDeTemps.begin();currentStep!=pasDeTemps.end();currentStep++) - { - cout< * fromField = dynamic_cast *>(fromField_); - cout<<"OK !"<getSupport()->getMesh()->read(); - - cout<read(); - cout<<"OK !"<(*fromField,toMesh) ; - cout<<"OK !"<interpolate(1,1); - cout<<"OK !"<interpolateNextStep(*fromField,flagNewMapping); - cout<<"OK !"<addDriver(MED_DRIVER,resultFileName,toField->getName()); - cout<<"OK !"<write(); - cout<<"OK !"<