From fa335b50fb41f5e17940190c76a76d4a282dcb4e Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Fri, 19 Sep 2014 12:53:46 +0200 Subject: [PATCH] Integrated the MULTREGT in the EclipseState/TransMult --- .../eclipse/EclipseState/EclipseState.cpp | 35 +++- .../eclipse/EclipseState/EclipseState.hpp | 1 + .../eclipse/EclipseState/Grid/TransMult.cpp | 17 ++ .../eclipse/EclipseState/Grid/TransMult.hpp | 5 + .../EclipseState/Grid/tests/CMakeLists.txt | 5 + .../Grid/tests/MULTREGTScannerTests.cpp | 12 +- .../EclipseState/tests/EclipseStateTests.cpp | 8 +- .../eclipse/IntegrationTests/MULTREGT.cpp | 43 ++++ .../IntegrationTests/ParseMULTREGT.cpp | 65 ++++++ testdata/integration_tests/MULTREGT/MULTREGT | 192 ++++++++++++++++++ .../integration_tests/MULTREGT/MULTREGT.DATA | 54 +++++ 11 files changed, 424 insertions(+), 13 deletions(-) create mode 100644 opm/parser/eclipse/IntegrationTests/MULTREGT.cpp create mode 100644 opm/parser/eclipse/IntegrationTests/ParseMULTREGT.cpp create mode 100644 testdata/integration_tests/MULTREGT/MULTREGT create mode 100644 testdata/integration_tests/MULTREGT/MULTREGT.DATA diff --git a/opm/parser/eclipse/EclipseState/EclipseState.cpp b/opm/parser/eclipse/EclipseState/EclipseState.cpp index 9fb1e02c4..dbe477982 100644 --- a/opm/parser/eclipse/EclipseState/EclipseState.cpp +++ b/opm/parser/eclipse/EclipseState/EclipseState.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -51,6 +52,7 @@ namespace Opm { initProperties(deck); initTransMult(); initFaults(deck); + initMULTREGT(deck); } std::shared_ptr EclipseState::getDeckUnitSystem() const { @@ -247,6 +249,7 @@ namespace Opm { } + void EclipseState::setMULTFLT(std::shared_ptr section) const { for (size_t index=0; index < section->count("MULTFLT"); index++) { DeckKeywordConstPtr faultsKeyword = section->getKeyword("MULTFLT" , index); @@ -261,6 +264,33 @@ namespace Opm { } + + void EclipseState::initMULTREGT(DeckConstPtr deck) { + EclipseGridConstPtr grid = getEclipseGrid(); + std::shared_ptr scanner = std::make_shared(); + + { + std::shared_ptr gridSection(new Opm::GRIDSection(deck) ); + for (size_t index=0; index < gridSection->count("MULTREGT"); index++) { + DeckKeywordConstPtr multregtKeyword = gridSection->getKeyword("MULTREGT" , index); + scanner->addKeyword( multregtKeyword ); + } + } + + + if (Section::hasEDIT(deck)) { + std::shared_ptr editSection(new Opm::EDITSection(deck) ); + for (size_t index=0; index < editSection->count("MULTREGT"); index++) { + DeckKeywordConstPtr multregtKeyword = editSection->getKeyword("MULTREGT" , index); + scanner->addKeyword( multregtKeyword ); + } + } + + m_transMult->applyMULTREGT( scanner , m_intGridProperties); + } + + + void EclipseState::initEclipseGrid(DeckConstPtr deck) { m_eclipseGrid = EclipseGridConstPtr( new EclipseGrid( deck )); } @@ -384,9 +414,8 @@ namespace Opm { SupportedIntKeywordInfo( "PVTNUM" , 1, "1" ), SupportedIntKeywordInfo( "EQLNUM" , 1, "1" ), SupportedIntKeywordInfo( "ENDNUM" , 1, "1" ), - // TODO: implement regular expression matching for - // keyword names? -// SupportedIntKeywordInfo( "FIP???" , 0 ), + SupportedIntKeywordInfo( "FLUXNUM" , 1 , "1" ), + SupportedIntKeywordInfo( "MULTNUM", 1 , "1" ), SupportedIntKeywordInfo( "FIPNUM" , 1, "1" )}; double nan = std::numeric_limits::quiet_NaN(); diff --git a/opm/parser/eclipse/EclipseState/EclipseState.hpp b/opm/parser/eclipse/EclipseState/EclipseState.hpp index 46925b63f..3ea813d98 100644 --- a/opm/parser/eclipse/EclipseState/EclipseState.hpp +++ b/opm/parser/eclipse/EclipseState/EclipseState.hpp @@ -168,6 +168,7 @@ namespace Opm { void initRocktabTables(DeckConstPtr deck); void setMULTFLT(std::shared_ptr section) const; + void initMULTREGT(DeckConstPtr deck); double getSIScaling(const std::string &dimensionString) const; diff --git a/opm/parser/eclipse/EclipseState/Grid/TransMult.cpp b/opm/parser/eclipse/EclipseState/Grid/TransMult.cpp index 6c4392a16..a8a0ebc24 100644 --- a/opm/parser/eclipse/EclipseState/Grid/TransMult.cpp +++ b/opm/parser/eclipse/EclipseState/Grid/TransMult.cpp @@ -124,4 +124,21 @@ namespace Opm { } } + + + + void TransMult::applyMULTREGT( std::shared_ptr multregtScanner , std::shared_ptr > regions) { + const std::vector< MULTREGTConnection > connections = multregtScanner->scanRegions( regions ); + for (auto iter = connections.begin(); iter != connections.end(); ++iter) { + MULTREGTConnection connection = *iter; + FaceDir::DirEnum faceDir = std::get<1>( connection ); + std::shared_ptr > multProperty = getDirectionProperty(faceDir); + { + size_t globalIndex = std::get<0>( connection ); + double transMult = std::get<2>( connection ); + + multProperty->multiplyValueAtIndex( globalIndex , transMult); + } + } + } } diff --git a/opm/parser/eclipse/EclipseState/Grid/TransMult.hpp b/opm/parser/eclipse/EclipseState/Grid/TransMult.hpp index 788b17c13..d42eb713d 100644 --- a/opm/parser/eclipse/EclipseState/Grid/TransMult.hpp +++ b/opm/parser/eclipse/EclipseState/Grid/TransMult.hpp @@ -32,9 +32,13 @@ #include #include +#include + #include #include +#include #include +#include namespace Opm { @@ -48,6 +52,7 @@ namespace Opm { std::shared_ptr > getDirectionProperty(FaceDir::DirEnum faceDir); void applyMULT(std::shared_ptr > srcMultProp, FaceDir::DirEnum faceDir); void applyMULTFLT( std::shared_ptr faults); + void applyMULTREGT( std::shared_ptr multregtScanner , std::shared_ptr > regions); private: size_t getGlobalIndex(size_t i , size_t j , size_t k) const; diff --git a/opm/parser/eclipse/EclipseState/Grid/tests/CMakeLists.txt b/opm/parser/eclipse/EclipseState/Grid/tests/CMakeLists.txt index 2107ebdc5..0ba44e30f 100644 --- a/opm/parser/eclipse/EclipseState/Grid/tests/CMakeLists.txt +++ b/opm/parser/eclipse/EclipseState/Grid/tests/CMakeLists.txt @@ -3,6 +3,11 @@ target_link_libraries(runEclipseGridTests Parser ${Boost_LIBRARIES}) add_test(NAME runEclipseGridTests WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${TEST_MEMCHECK_TOOL} ${EXECUTABLE_OUTPUT_PATH}/runEclipseGridTests ) +add_executable(runMULTREGTScannerTests MULTREGTScannerTests.cpp) +target_link_libraries(runMULTREGTScannerTests Parser ${Boost_LIBRARIES}) +add_test(NAME runMULTREGTScannerTests WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${TEST_MEMCHECK_TOOL} ${EXECUTABLE_OUTPUT_PATH}/runMULTREGTScannerTests ) + + add_executable(runGridPropertyTests GridPropertyTests.cpp) target_link_libraries(runGridPropertyTests Parser ${Boost_LIBRARIES}) add_test(NAME runGridPropertyTests WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${TEST_MEMCHECK_TOOL} ${EXECUTABLE_OUTPUT_PATH}/runGridPropertyTests ) diff --git a/opm/parser/eclipse/EclipseState/Grid/tests/MULTREGTScannerTests.cpp b/opm/parser/eclipse/EclipseState/Grid/tests/MULTREGTScannerTests.cpp index 426971658..c1ce41762 100644 --- a/opm/parser/eclipse/EclipseState/Grid/tests/MULTREGTScannerTests.cpp +++ b/opm/parser/eclipse/EclipseState/Grid/tests/MULTREGTScannerTests.cpp @@ -106,9 +106,9 @@ static Opm::DeckPtr createInvalidMULTREGTDeck() { BOOST_AUTO_TEST_CASE(InvalidInput) { typedef Opm::GridProperties::SupportedKeywordInfo SupportedKeywordInfo; - std::vector supportedKeywords = { SupportedKeywordInfo("FLUXNUM" , 0) , - SupportedKeywordInfo("OPERNUM" , 0) , - SupportedKeywordInfo("MULTNUM" , 0) }; + std::vector supportedKeywords = { SupportedKeywordInfo("FLUXNUM" , 1 , "1") , + SupportedKeywordInfo("OPERNUM" , 1 , "1") , + SupportedKeywordInfo("MULTNUM" , 1 , "1") }; Opm::MULTREGTScanner scanner; Opm::DeckPtr deck = createInvalidMULTREGTDeck(); @@ -243,9 +243,9 @@ static Opm::DeckPtr createSimpleMULTREGTDeck() { BOOST_AUTO_TEST_CASE(SimpleMULTREGT) { typedef Opm::GridProperties::SupportedKeywordInfo SupportedKeywordInfo; - std::vector supportedKeywords = { SupportedKeywordInfo("FLUXNUM" , 0) , - SupportedKeywordInfo("OPERNUM" , 0) , - SupportedKeywordInfo("MULTNUM" , 0) }; + std::vector supportedKeywords = { SupportedKeywordInfo("FLUXNUM" , 1 , "1") , + SupportedKeywordInfo("OPERNUM" , 1 , "1") , + SupportedKeywordInfo("MULTNUM" , 1 , "1") }; Opm::DeckPtr deck = createSimpleMULTREGTDeck(); Opm::EclipseGrid grid(deck); diff --git a/opm/parser/eclipse/EclipseState/tests/EclipseStateTests.cpp b/opm/parser/eclipse/EclipseState/tests/EclipseStateTests.cpp index 0595560eb..b3c0ade87 100644 --- a/opm/parser/eclipse/EclipseState/tests/EclipseStateTests.cpp +++ b/opm/parser/eclipse/EclipseState/tests/EclipseStateTests.cpp @@ -75,7 +75,7 @@ static DeckPtr createDeck() { "\n" "PROPS\n" "REGIONS\n" - "FLUXNUM\n" + "SWAT\n" "1000*1 /\n" "SATNUM\n" "1000*2 /\n" @@ -170,9 +170,9 @@ BOOST_AUTO_TEST_CASE(IntProperties) { BOOST_AUTO_TEST_CASE(PropertiesNotSupportedThrows) { DeckPtr deck = createDeck(); EclipseState state(deck, /*beStrict=*/false); - DeckKeywordConstPtr fluxNUM = deck->getKeyword("FLUXNUM"); - BOOST_CHECK_EQUAL( false , state.supportsGridProperty("FLUXNUM")); - BOOST_CHECK_THROW( state.loadGridPropertyFromDeckKeyword( std::make_shared(10,10,10) , fluxNUM ) , std::invalid_argument) + DeckKeywordConstPtr swat = deck->getKeyword("SWAT"); + BOOST_CHECK_EQUAL( false , state.supportsGridProperty("SWAT")); + BOOST_CHECK_THROW( state.loadGridPropertyFromDeckKeyword( std::make_shared(10,10,10) , swat ) , std::invalid_argument) } diff --git a/opm/parser/eclipse/IntegrationTests/MULTREGT.cpp b/opm/parser/eclipse/IntegrationTests/MULTREGT.cpp new file mode 100644 index 000000000..6c317be34 --- /dev/null +++ b/opm/parser/eclipse/IntegrationTests/MULTREGT.cpp @@ -0,0 +1,43 @@ +/* + Copyright 2013 Statoil ASA. + + This file is part of the Open Porous Media project (OPM). + + OPM is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OPM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OPM. If not, see . + */ + +#define BOOST_TEST_MODULE MULTREGT +#include +#include + +#include + +#include +#include +#include +#include + +#include + +using namespace Opm; + + + + +BOOST_AUTO_TEST_CASE( parse_WCHONHIST_OK ) { + ParserPtr parser(new Parser()); + boost::filesystem::path wconhistFile("testdata/integration_tests/WCONHIST/WCONHIST1"); + DeckPtr deck = parser->parseFile(wconhistFile.string()); + DeckKeywordConstPtr kw1 = deck->getKeyword("WCONHIST" , 0); + BOOST_CHECK_EQUAL( 3U , kw1->size() ); diff --git a/opm/parser/eclipse/IntegrationTests/ParseMULTREGT.cpp b/opm/parser/eclipse/IntegrationTests/ParseMULTREGT.cpp new file mode 100644 index 000000000..28a06b3af --- /dev/null +++ b/opm/parser/eclipse/IntegrationTests/ParseMULTREGT.cpp @@ -0,0 +1,65 @@ +/* + Copyright 2013 Statoil ASA. + + This file is part of the Open Porous Media project (OPM). + + OPM is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OPM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OPM. If not, see . + */ + +#define BOOST_TEST_MODULE ParseMULTREGT +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +using namespace Opm; + + + + +BOOST_AUTO_TEST_CASE( parse_MULTREGT_OK ) { + ParserPtr parser(new Parser()); + DeckPtr deck = parser->parseFile("testdata/integration_tests/MULTREGT/MULTREGT"); + DeckKeywordConstPtr multregtKeyword = deck->getKeyword("MULTREGT" , 0); + BOOST_CHECK_NO_THROW( MULTREGTScanner::assertKeywordSupported( multregtKeyword ) ); +} + + + +BOOST_AUTO_TEST_CASE( MULTREGT_ECLIPSE_STATE ) { + ParserPtr parser(new Parser()); + DeckPtr deck = parser->parseFile("testdata/integration_tests/MULTREGT/MULTREGT.DATA"); + EclipseState state(deck); + auto transMult = state.getTransMult(); + + BOOST_CHECK_EQUAL( 0.10 , transMult->getMultiplier( 0 , 0 , 0 , FaceDir::XPlus )); + BOOST_CHECK_EQUAL( 0.10 , transMult->getMultiplier( 0 , 1 , 0 , FaceDir::XPlus )); + BOOST_CHECK_EQUAL( 0.20 , transMult->getMultiplier( 1 , 0 , 0 , FaceDir::XMinus )); + BOOST_CHECK_EQUAL( 0.20 , transMult->getMultiplier( 1 , 1 , 0 , FaceDir::XMinus )); + BOOST_CHECK_EQUAL( 1.50 , transMult->getMultiplier( 0 , 0 , 0 , FaceDir::ZPlus )); + BOOST_CHECK_EQUAL( 1.50 , transMult->getMultiplier( 0 , 1 , 0 , FaceDir::ZPlus )); + BOOST_CHECK_EQUAL( 1.00 , transMult->getMultiplier( 1 , 0 , 0 , FaceDir::ZPlus )); + BOOST_CHECK_EQUAL( 1.00 , transMult->getMultiplier( 1 , 1 , 0 , FaceDir::ZPlus )); + BOOST_CHECK_EQUAL( 0.60 , transMult->getMultiplier( 1 , 0 , 1 , FaceDir::ZMinus )); + BOOST_CHECK_EQUAL( 0.60 , transMult->getMultiplier( 1 , 1 , 1 , FaceDir::ZMinus )); +} diff --git a/testdata/integration_tests/MULTREGT/MULTREGT b/testdata/integration_tests/MULTREGT/MULTREGT new file mode 100644 index 000000000..45cb89ee0 --- /dev/null +++ b/testdata/integration_tests/MULTREGT/MULTREGT @@ -0,0 +1,192 @@ +MULTREGT + 2 1 1.0000000000 / + 3 1 1.0000000000 / + 3 2 1.0000000000 / + 4 1 0.0050000000 / + 4 2 1.0000000000 / + 4 3 1.0000000000 / + 5 1 0.0000000000 / + 5 2 0.0000000000 / + 5 3 0.0000000000 / + 5 4 0.0000000000 / + 6 1 0.0000000000 / + 6 2 0.0000000000 / + 6 3 0.0000000000 / + 6 4 0.0000000000 / + 6 5 1.0000000000 / + 7 1 0.0000000000 / + 7 2 0.0000000000 / + 7 3 0.0000000000 / + 7 4 0.0000000000 / + 7 5 1.0000000000 / + 7 6 0.0500000000 / + 8 1 0.0000000000 / + 8 2 0.0000000000 / + 8 3 0.0000000000 / + 8 4 0.0000000000 / + 8 5 0.0100000000 / + 8 6 1.0000000000 / + 8 7 1.0000000000 / + 9 1 0.0000000000 / + 9 2 0.0000000000 / + 9 3 0.0000000000 / + 9 4 0.0000000000 / + 9 5 1.0000000000 / + 9 6 1.0000000000 / + 9 7 1.0000000000 / + 9 8 1.0000000000 / + 10 1 0.0000000000 / + 10 2 0.0000000000 / + 10 3 0.0000000000 / + 10 4 0.0000000000 / + 10 5 1.0000000000 / + 10 6 1.0000000000 / + 10 7 1.0000000000 / + 10 8 1.0000000000 / + 10 9 1.0000000000 / + 11 1 0.0000000000 / + 11 2 0.0000000000 / + 11 3 0.0000000000 / + 11 4 0.0000000000 / + 11 5 1.0000000000 / + 11 6 1.0000000000 / + 11 7 1.0000000000 / + 11 8 1.0000000000 / + 11 9 1.0000000000 / + 11 10 1.0000000000 / + 12 1 0.0000000000 / + 12 2 0.0000000000 / + 12 3 0.0000000000 / + 12 4 0.0000000000 / + 12 5 1.0000000000 / + 12 6 1.0000000000 / + 12 7 1.0000000000 / + 12 8 1.0000000000 / + 12 9 0.0100000000 / + 12 10 1.0000000000 / + 12 11 1.0000000000 / + 13 1 0.0000000000 / + 13 2 0.0000000000 / + 13 3 0.0000000000 / + 13 4 0.0000000000 / + 13 5 0.1000000000 / + 13 6 0.1000000000 / + 13 7 0.1000000000 / + 13 8 0.1000000000 / + 13 9 1.0000000000 / + 13 10 1.0000000000 / + 13 11 1.0000000000 / + 13 12 1.0000000000 / + 14 1 0.0000000000 / + 14 2 0.0000000000 / + 14 3 0.0000000000 / + 14 4 0.0000000000 / + 14 5 0.1000000000 / + 14 6 1.0000000000 / + 14 7 0.1000000000 / + 14 8 0.1000000000 / + 14 9 1.0000000000 / + 14 10 100.0000000000 / + 14 11 1.0000000000 / + 14 12 1.0000000000 / + 14 13 1.0000000000 / + 15 1 0.0000000000 / + 15 2 0.0000000000 / + 15 3 0.0000000000 / + 15 4 0.0000000000 / + 15 5 0.1000000000 / + 15 6 0.1000000000 / + 15 7 0.1000000000 / + 15 8 0.1000000000 / + 15 9 1.0000000000 / + 15 10 1.0000000000 / + 15 11 1.0000000000 / + 15 12 1.0000000000 / + 15 13 1.0000000000 / + 15 14 1.0000000000 / + 16 1 0.0000000000 / + 16 2 0.0000000000 / + 16 3 0.0000000000 / + 16 4 0.0000000000 / + 16 5 0.0100000000 / + 16 6 0.1000000000 / + 16 7 0.1000000000 / + 16 8 0.1000000000 / + 16 9 1.0000000000 / + 16 10 1.0000000000 / + 16 11 1.0000000000 / + 16 12 1.0000000000 / + 16 13 0.0100000000 / + 16 14 1.0000000000 / + 16 15 1.0000000000 / + 17 1 0.0000000000 / + 17 2 0.0000000000 / + 17 3 0.0000000000 / + 17 4 0.0000000000 / + 17 5 0.0000000000 / + 17 6 0.0000000000 / + 17 7 0.0000000000 / + 17 8 0.0000000000 / + 17 9 0.0010000000 / + 17 10 0.0000000000 / + 17 11 0.0000000000 / + 17 12 0.0000000000 / + 17 13 0.0008000000 / + 17 14 0.0000000000 / + 17 15 0.0000000000 / + 17 16 0.0000000000 / + 18 1 0.0000000000 / + 18 2 0.0000000000 / + 18 3 0.0000000000 / + 18 4 0.0000000000 / + 18 5 0.0000000000 / + 18 6 0.0000000000 / + 18 7 0.0000000000 / + 18 8 0.0000000000 / + 18 9 0.0000000000 / + 18 10 1.0000000000 / + 18 11 0.0000000000 / + 18 12 0.0000000000 / + 18 13 0.0000000000 / + 18 14 0.1000000000 / + 18 15 0.0000000000 / + 18 16 0.0000000000 / + 18 17 1.0000000000 / + 19 1 0.0000000000 / + 19 2 0.0000000000 / + 19 3 0.0000000000 / + 19 4 0.0000000000 / + 19 5 0.0000000000 / + 19 6 0.0000000000 / + 19 7 0.0000000000 / + 19 8 0.0000000000 / + 19 9 0.0000000000 / + 19 10 0.0000000000 / + 19 11 0.0010000000 / + 19 12 0.0000000000 / + 19 13 0.0000000000 / + 19 14 0.0000001 / + 19 15 0.0500000000 / + 19 16 0.0000000000 / + 19 17 1.0000000000 / + 19 18 1.0000000000 / + 20 1 0.0000000000 / + 20 2 0.0000000000 / + 20 3 0.0000000000 / + 20 4 0.0000000000 / + 20 5 0.0000000000 / + 20 6 0.0000000000 / + 20 7 0.0000000000 / + 20 8 0.0000000000 / + 20 9 0.0000000000 / + 20 10 0.0000000000 / + 20 11 0.0000000000 / + 20 12 1.0000000000 / + 20 13 0.0000000000 / + 20 14 0.0000000000 / + 20 15 0.0000000000 / + 20 16 0.0010000000 / + 20 17 0.1000000000 / + 20 18 1.0000000000 / + 20 19 1.0000000000 / +/ diff --git a/testdata/integration_tests/MULTREGT/MULTREGT.DATA b/testdata/integration_tests/MULTREGT/MULTREGT.DATA new file mode 100644 index 000000000..5d9241b0f --- /dev/null +++ b/testdata/integration_tests/MULTREGT/MULTREGT.DATA @@ -0,0 +1,54 @@ +RUNSPEC + +DIMENS +2 2 2 / + +GRID +DX +8*0.25 / + +DYV +2*0.25 / + +DZ +8*0.25 / + +TOPS +4*0.25 / + +FLUXNUM +1 2 +1 2 +3 4 +3 4 +/ + +MULTNUM +1 2 +1 2 +3 4 +3 4 +/ + +MULTREGT +1 2 0.10 X ALL M / +/ + +MULTREGT +2 1 0.20 X ALL M / +/ + +MULTREGT +1 3 1.50 XYZ ALL F / +/ + + +MULTREGT +2 4 0.75 Z ALL M / -- This record should be completely overwritten by the next. +2 4 2.50 XY ALL F / +4 2 0.6 XYZ ALL F / +/ + + +EDIT +