X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDLoader%2FTest%2FSauvLoaderTest.cxx;h=b6195f6df1abfefeea187b429a92e2c50e308779;hb=3c911ce36f5caa779ea60042e738fa57671a44b1;hp=249f192067c66d59ff7d77ca18579bf0d4ac957f;hpb=10f37bf6f33a762626d7f1093b2f5450c1688667;p=tools%2Fmedcoupling.git diff --git a/src/MEDLoader/Test/SauvLoaderTest.cxx b/src/MEDLoader/Test/SauvLoaderTest.cxx index 249f19206..b6195f6df 100644 --- a/src/MEDLoader/Test/SauvLoaderTest.cxx +++ b/src/MEDLoader/Test/SauvLoaderTest.cxx @@ -1,9 +1,9 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D // // 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. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -25,7 +25,7 @@ #include "MEDCouplingFieldDouble.hxx" #include "MEDCouplingMemArray.hxx" -#ifdef WNT +#ifdef WIN32 # include #else # include @@ -51,6 +51,120 @@ void SauvLoaderTest::testSauv2Med() CPPUNIT_ASSERT_EQUAL(17,int(m->getGroupsNames().size())); } +void SauvLoaderTest::testMed2SauvOnAMeshWithVoidFamily() +{ + // Create a mesh with 2 quads. + const int spaceDim = 2; + const int nbOfNodes = 6; + double coords[nbOfNodes*spaceDim] = {0,0, 1,0, 1,1, 0,1, 2,0, 2,1}; + int conn[8]={0,1,2,3, 1,4,5,2}; + MEDCouplingAutoRefCountObjectPtr mesh2d=MEDCouplingUMesh::New("Mesh",spaceDim); + mesh2d->allocateCells(2); + mesh2d->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn); + mesh2d->insertNextCell(INTERP_KERNEL::NORM_QUAD4,4,conn+4); + mesh2d->finishInsertingCells(); + MEDCouplingAutoRefCountObjectPtr myCoords=DataArrayDouble::New(); + myCoords->alloc(nbOfNodes,spaceDim); + std::copy(coords,coords+nbOfNodes*spaceDim,myCoords->getPointer()); + mesh2d->setCoords(myCoords); + + // create a MedFileUMesh + MEDCouplingAutoRefCountObjectPtr m= MEDFileUMesh::New(); + m->setMeshAtLevel(0,mesh2d); + + // Create families and groups + + MEDCouplingAutoRefCountObjectPtr fam = DataArrayInt::New(); + fam->alloc(2,1); + int elemsFams[2] = {-2,-3}; + std::copy(elemsFams,elemsFams+2,fam->getPointer()); + + m->setFamilyFieldArr(0,fam); + + std::map theFamilies; + theFamilies["FAM_-1"]=-1; + theFamilies["FAM_-2"]=-2; + theFamilies["FAM_-3"]=-3; + + std::map > theGroups; + theGroups["Group1"].push_back("FAM_-2"); + theGroups["Group2"].push_back("FAM_-3"); + theGroups["Grouptot"].push_back("FAM_-1"); + theGroups["Grouptot"].push_back("FAM_-2"); + theGroups["Grouptot"].push_back("FAM_-3"); + m->setFamilyInfo(theFamilies); + m->setGroupInfo(theGroups); + + // write to MED for visual check + //const char* medFile = "mesh_with_void_family.med"; + //m->write(medFile, 2); + + // write to SAUV + const char* sauvFile = "mesh_with_void_family.sauv"; + MEDCouplingAutoRefCountObjectPtr medData = MEDFileData::New(); + MEDCouplingAutoRefCountObjectPtr medMeshes = MEDFileMeshes::New(); + MEDCouplingAutoRefCountObjectPtr sw=SauvWriter::New(); + medMeshes->setMeshAtPos(0, m); + medData->setMeshes(medMeshes); + sw->setMEDFileDS(medData); + sw->write(sauvFile); + + // read SAUV and check groups + MEDCouplingAutoRefCountObjectPtr sr=SauvReader::New(sauvFile); + MEDCouplingAutoRefCountObjectPtr d2=sr->loadInMEDFileDS(); + MEDFileUMesh* m2 = static_cast( d2->getMeshes()->getMeshAtPos(0) ); + MEDCouplingAutoRefCountObjectPtr group1 = m2->getGroup(0, "Group1"); + CPPUNIT_ASSERT_EQUAL(1,(int)group1->getNumberOfCells()); + MEDCouplingAutoRefCountObjectPtr group2 = m2->getGroup(0, "Group2"); + CPPUNIT_ASSERT_EQUAL(1,(int)group2->getNumberOfCells()); + MEDCouplingAutoRefCountObjectPtr grptot = m2->getGroup(0, "Grouptot"); + CPPUNIT_ASSERT_EQUAL(2,(int)grptot->getNumberOfCells()); +} + +void SauvLoaderTest::testSauv2MedOnA3SubsField() +{ + // read SAUV + std::string sauvFile = getResourceFile("portico_3subs.sauv"); + MEDCouplingAutoRefCountObjectPtr sr=SauvReader::New(sauvFile.c_str()); + MEDCouplingAutoRefCountObjectPtr d2=sr->loadInMEDFileDS(); + // check mesh + MEDFileUMesh* m2 = static_cast(d2->getMeshes()->getMeshAtPos(0)); + MEDCouplingAutoRefCountObjectPtr mesh1d = m2->getMeshAtLevel(0); + MEDCouplingAutoRefCountObjectPtr length1dField = mesh1d->getMeasureField(0); + std::cout << "Length of 1d elements: " << length1dField->accumulate(0) << std::endl; + CPPUNIT_ASSERT_DOUBLES_EQUAL(3, length1dField->accumulate(0), 1e-12); + // check field + MEDCouplingAutoRefCountObjectPtr field = + dynamic_cast(d2->getFields()->getFieldWithName("CHAM1D")); + std::cout << "Number of components in field: " << field->getInfo().size() << std::endl; + CPPUNIT_ASSERT_EQUAL(6,(int)field->getInfo().size()); + std::vector< std::pair > timesteps = field->getIterations(); + + MEDCouplingAutoRefCountObjectPtr field1d = + field->getFieldOnMeshAtLevel(ON_GAUSS_NE, timesteps[0].first, timesteps[0].second, 0, m2); + + // Check first component of the field + // 2 gauss points per element => 12 values + double values[12] = { + -7.687500000000e-03, + -7.687500000000e-03, + -4.562500000000e-03, + -4.562500000000e-03, + -8.208333333333e-03, + -8.208333333333e-03, + -6.125000000000e-03, + -6.125000000000e-03, + -4.041666666666e-03, + -4.041666666666e-03, + -6.111413346910e-07, + -6.111413346910e-07}; + + for (int i=0; i < field1d->getNumberOfTuples(); i++) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL( values[i], field1d->getIJ(i, 0), 1e-12 ); + } +} + void SauvLoaderTest::testMed2Sauv() { // read pointe.med @@ -105,7 +219,7 @@ void SauvLoaderTest::testMed2Sauv() MEDFileFields* pointeFields = pointeMed->getFields(); for ( int i = 0; i < pointeFields->getNumberOfFields(); ++i ) { - MEDCouplingAutoRefCountObjectPtr ts = pointeFields->getFieldAtPos(i); + MEDCouplingAutoRefCountObjectPtr ts = pointeFields->getFieldAtPos(i); if ( std::string("fieldnodeint") == ts->getName()) { pointeFields->destroyFieldAtPos( i ); @@ -152,9 +266,9 @@ void SauvLoaderTest::testMed2Sauv() // check fields // fieldnodedouble MEDCouplingAutoRefCountObjectPtr fieldnodedoubleTS1 = - pointeMed->getFields()->getFieldWithName("fieldnodedouble"); + dynamic_cast(pointeMed->getFields()->getFieldWithName("fieldnodedouble")); MEDCouplingAutoRefCountObjectPtr fieldnodedoubleTS2 = - d2->getFields()->getFieldWithName("fieldnodedouble"); + dynamic_cast(d2->getFields()->getFieldWithName("fieldnodedouble")); CPPUNIT_ASSERT_EQUAL( fieldnodedoubleTS1->getInfo().size(), fieldnodedoubleTS2->getInfo().size()); for ( size_t i = 0; i < fieldnodedoubleTS1->getInfo().size(); ++i ) CPPUNIT_ASSERT_EQUAL( fieldnodedoubleTS1->getInfo()[i], fieldnodedoubleTS2->getInfo()[i]); @@ -171,9 +285,9 @@ void SauvLoaderTest::testMed2Sauv() } // fieldcelldoublevector MEDCouplingAutoRefCountObjectPtr fieldcelldoublevectorTS1 = - pointeMed->getFields()->getFieldWithName("fieldcelldoublevector"); + dynamic_cast(pointeMed->getFields()->getFieldWithName("fieldcelldoublevector")); MEDCouplingAutoRefCountObjectPtr fieldcelldoublevectorTS2 = - d2->getFields()->getFieldWithName("fieldcelldoublevector"); + dynamic_cast(d2->getFields()->getFieldWithName("fieldcelldoublevector")); CPPUNIT_ASSERT_EQUAL( fieldcelldoublevectorTS1->getInfo().size(), fieldcelldoublevectorTS2->getInfo().size()); for ( size_t i = 0; i < fieldcelldoublevectorTS1->getInfo().size(); ++i ) CPPUNIT_ASSERT_EQUAL( fieldcelldoublevectorTS1->getInfo()[i], fieldcelldoublevectorTS2->getInfo()[i]); @@ -192,7 +306,7 @@ void SauvLoaderTest::testMed2Sauv() } // "Field on 2 faces" MEDCouplingAutoRefCountObjectPtr fieldOnFaces = - d2->getFields()->getFieldWithName(f1->getName()); + dynamic_cast(d2->getFields()->getFieldWithName(f1->getName().c_str())); io1 = fieldOnFaces->getIterations(); MEDCouplingAutoRefCountObjectPtr fof = fieldOnFaces->getFieldOnMeshAtLevel(f1->getTypeOfField(),io1[0].first,io1[0].second,um1); @@ -201,11 +315,11 @@ void SauvLoaderTest::testMed2Sauv() void SauvLoaderTest::tearDown() { - const int nbFilesToRemove = 2; - const char* fileToRemove[nbFilesToRemove] = { "allPillesTest.med", "pointe.sauv" }; + const int nbFilesToRemove = 3; + const char* fileToRemove[nbFilesToRemove] = { "allPillesTest.med", "pointe.sauv", "mesh_with_void_family.sauv" }; for ( int i = 0; i < nbFilesToRemove; ++i ) { -#ifdef WNT +#ifdef WIN32 if (GetFileAttributes(fileToRemove[i]) != INVALID_FILE_ATTRIBUTES) #else if (access(fileToRemove[i], F_OK) == 0) @@ -219,7 +333,7 @@ std::string SauvLoaderTest::getResourceFile( const std::string& filename ) std::string resourceFile = ""; if ( getenv("top_srcdir") ) { - // we are in 'make check' step + // we are in 'make test' step resourceFile = getenv("top_srcdir"); resourceFile += "/resources/"; } @@ -229,7 +343,7 @@ std::string SauvLoaderTest::getResourceFile( const std::string& filename ) resourceFile += "/share/salome/resources/med/"; } resourceFile += filename; -#ifdef WNT +#ifdef WIN32 std::string fixedpath = resourceFile; for ( int i=0; i < fixedpath.length(); ++i ) if (fixedpath[i] == '/')