X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFILTER%2Ffield2nodes.cxx;fp=src%2FFILTER%2Ffield2nodes.cxx;h=b6c275812d9394694ca172bf12484dcc666e69e7;hb=39ee2fb4dfac50f63d0695b9a7a4706c07350ad8;hp=06394789d156ee0452f4cb8066166fa8cb064880;hpb=e79342643d3d1f51e007db03168fe2f5d467b0b0;p=modules%2Ffilter.git diff --git a/src/FILTER/field2nodes.cxx b/src/FILTER/field2nodes.cxx index 0639478..b6c2758 100644 --- a/src/FILTER/field2nodes.cxx +++ b/src/FILTER/field2nodes.cxx @@ -43,8 +43,8 @@ int main (int argc, char ** argv) { string filenameIN ; string filenameOUT; - set listElements; - set ::iterator elemIt ; + set listElements, supset; + set ::iterator elemIt, ssIt; if ( argc == 3 ) { filenameIN = argv[1] ; @@ -56,8 +56,10 @@ int main (int argc, char ** argv) { cout << "-> Read all meshes " ; int NumberOfMeshes = myMed.getNumberOfMeshes() ; cout << "( "< **volume = new FIELD*[NumberOfMeshes]; deque MeshName = myMed.getMeshNames() ; for (int i=0; iread() ; cout << "-> Mesh "<addDriver(MED_DRIVER,filenameOUT,MeshName[i],MED_EN::MED_ECRI); @@ -86,83 +88,181 @@ int main (int argc, char ** argv) { switch(myField->getSupport()->getEntity()){ case MED_CELL: cout << "*************************** CHAMP AUX CELLULES" << endl; - MESH *mesh = myMed.getField(FieldName[i],FieldIteration[j].dt,FieldIteration[j].it)->getSupport()->getMesh(); - SUPPORT *sup = new SUPPORT(mesh,"Support",MED_NODE); + MESH *mesh = myField->getSupport()->getMesh(); + + // create new support for new field + SUPPORT *newSup; + if( myField->getSupport()->isOnAllElements() ) + newSup = new SUPPORT(mesh,"Support",MED_NODE); + else{ + int nbe = myField->getSupport()->getNumberOfElements(MED_ALL_ELEMENTS); + const int *numb = myField->getSupport()->getNumber(MED_ALL_ELEMENTS); + list myList; + for(int k=0;kbuildSupportOnNodeFromElementList(myList,MED_CELL); + } + // read number of nodes - int NumberOfNodes = sup->getNumberOfElements(MED_ALL_ELEMENTS); + int NumberOfNodes = newSup->getNumberOfElements(MED_ALL_ELEMENTS); // calculate reverse connectivity to have the list of elements which contains node i const int *revC = myField->getSupport()->getMesh()->getReverseConnectivity(MED_NODAL,MED_CELL); const int *indC = myField->getSupport()->getMesh()->getReverseConnectivityIndex(MED_NODAL,MED_CELL); + int ivol; // calculate volume field on mesh - FIELD *volume = myField->getSupport()->getMesh()->getVolume(myField->getSupport()); + for(int k=0;kgetName().c_str(),MeshName[k].c_str())==0) + ivol = k; + if( volume[ivol] == NULL ) + volume[ivol] = myField->getSupport()->getMesh()->getVolume(myField->getSupport()); if (dynamic_cast*>(myField)){ FIELD *myDField = (MEDMEM::FIELD*)myField; - FIELD *newDField = new FIELD(sup,NumberOfComponents); + FIELD *newDField = new FIELD(newSup,NumberOfComponents); newDField->setName(myField->getName()); + newDField->setIterationNumber(FieldIteration[j].dt); + newDField->setOrderNumber(FieldIteration[j].it); + newDField->setTime(myDField->getTime()); double *val = new double[NumberOfComponents]; - for (int k=1; kisOnAllElements() ){ + for (int k=1; kgetValueIJ(elem,1); + if( vol != 0. ){ + sigmaV += 1./vol; + for(int l=1;l<=NumberOfComponents;l++) + val[l-1] += myDField->getValueIJ(elem,l)/vol; + } + } + for(int l=1;l<=NumberOfComponents;l++) + newDField->setValueIJ(k,l,val[l-1]/sigmaV); } - - // calculate field value on node i - double sigmaV = 0.; - for(int j=0;jgetValueIJ(elem,1); - if( vol != 0. ){ - sigmaV += 1./vol; - for(int j=1;j<=NumberOfComponents;j++) - val[j] += myDField->getValueIJ(elem,j)/vol; + } + else{ + const int *numb = newSup->getNumber(MED_ALL_ELEMENTS); + for (int k=1; k<=NumberOfNodes; k++){ + int kk = numb[k-1]; + // listElements contains elements which contains a node of element i + listElements.clear(); + for(int l=indC[kk-1];lgetValueIJ(elem,1); + if( vol != 0. ){ + sigmaV += 1./vol; + for(int l=1;l<=NumberOfComponents;l++) + val[l-1] += myDField->getValueIJ(elem,l)/vol; + } } + for(int l=1;l<=NumberOfComponents;l++) + newDField->setValueIJ(k,l,val[l-1]/sigmaV); } - for(int j=1;j<=NumberOfComponents;j++) - newDField->setValueIJ(k,j,val[j]/sigmaV); } delete [] val; int id = newDField->addDriver(MED_DRIVER,filenameOUT,FieldName[i],MED_EN::MED_ECRI); newDField->write(id); + delete newSup; + delete newDField; cout << " * Iteration "< *myIField = (MEDMEM::FIELD*)myField; - FIELD *newIField = new FIELD(sup,NumberOfComponents); + FIELD *newIField = new FIELD(newSup,NumberOfComponents); newIField->setName(myField->getName()); + newIField->setIterationNumber(FieldIteration[j].dt); + newIField->setOrderNumber(FieldIteration[j].it); + newIField->setTime(myIField->getTime()); double *val = new double[NumberOfComponents]; - for (int k=1; kisOnAllElements() ){ + for (int k=1; kgetValueIJ(elem,1); - if( vol != 0. ){ - sigmaV += 1./vol; - for(int j=1;j<=NumberOfComponents;j++) - val[j] += ((double)myIField->getValueIJ(elem,j))/vol; + // calculate field value on node k + double sigmaV = 0.; + for(int l=0;lgetValueIJ(elem,1); + if( vol != 0. ){ + sigmaV += 1./vol; + for(int l=1;l<=NumberOfComponents;l++) + val[l-1] += ((double)myIField->getValueIJ(elem,l))/vol; + } + } + for(int l=1;l<=NumberOfComponents;l++) + newIField->setValueIJ(k,l,(int)(val[l-1]/sigmaV)); + } + } + else{ + const int *numb = newSup->getNumber(MED_ALL_ELEMENTS); + for (int k=1; k<=NumberOfNodes; k++){ + int kk = numb[k-1]; + // listElements contains elements which contains a node of element i + listElements.clear(); + for(int l=indC[kk-1];lgetValueIJ(elem,1); + if( vol != 0. ){ + sigmaV += 1./vol; + for(int l=1;l<=NumberOfComponents;l++) + val[l-1] += myIField->getValueIJ(elem,l)/vol; + } } + for(int l=1;l<=NumberOfComponents;l++) + newIField->setValueIJ(k,l,(int)(val[l-1]/sigmaV)); } - for(int j=1;j<=NumberOfComponents;j++) - newIField->setValueIJ(k,j,(int)(val[j]/sigmaV)); } delete [] val; int id = newIField->addDriver(MED_DRIVER,filenameOUT,FieldName[i],MED_EN::MED_ECRI); newIField->write(id); + delete newSup; + delete newIField; cout << " * Iteration "<