Implementation (not finished) of wells_equal, well_controls_equal, and tests. To build a WellsManager test for old and new parser

Conflicts:
	CMakeLists_files.cmake
This commit is contained in:
Kristian Flikka 2013-12-18 15:06:38 +01:00 committed by Joakim Hove
parent b280af372b
commit fd942e347d
6 changed files with 206 additions and 13 deletions

View File

@ -164,9 +164,11 @@ list (APPEND TEST_SOURCE_FILES
tests/test_param.cpp
tests/test_blackoilfluid.cpp
tests/test_shadow.cpp
tests/test_units.cpp
tests/test_blackoilstate.cpp
)
tests/test_units.cpp
tests/test_blackoilstate.cpp
tests/test_parser.cpp
tests/test_wellsmanager.cpp
)
# originally generated with the command:
# find tests -name '*.xml' -a ! -wholename '*/not-unit/*' -printf '\t%p\n' | sort
@ -174,8 +176,9 @@ list (APPEND TEST_DATA_FILES
tests/extratestdata.xml
tests/testdata.xml
tests/testFluid.DATA
tests/testBlackoilState1.DATA
tests/testBlackoilState2.DATA
tests/testBlackoilState1.DATA
tests/testBlackoilState2.DATA
tests/wells_manager_data.data
)
# originally generated with the command:

View File

@ -20,6 +20,7 @@
#ifndef OPM_WELLS_H_INCLUDED
#define OPM_WELLS_H_INCLUDED
#include <stdbool.h>
/**
* \file
@ -82,6 +83,8 @@ struct WellControls
*/
int num;
int number_of_phases;
/**
* Array of control types.
*/
@ -94,7 +97,7 @@ struct WellControls
/**
* Array of rate control distributions,
* <CODE>Wells::number_of_phases</CODE> numbers for each control
* <CODE>number_of_phases</CODE> numbers for each control
*/
double *distr;
@ -327,6 +330,12 @@ destroy_wells(struct Wells *W);
struct Wells *
clone_wells(const struct Wells *W);
bool
wells_equal(const struct Wells *W1, const struct Wells *W2);
bool
well_controls_equal(const struct WellControls *ctrls1, const struct WellControls *ctrls2);
#ifdef __cplusplus
}

View File

@ -41,6 +41,8 @@
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
struct WellControlMgmt {
int cpty;
};
@ -123,13 +125,14 @@ well_controls_create(void)
if (ctrl != NULL) {
/* Initialise empty control set */
ctrl->num = 0;
ctrl->type = NULL;
ctrl->target = NULL;
ctrl->distr = NULL;
ctrl->current = -1;
ctrl->num = 0;
ctrl->number_of_phases = 0;
ctrl->type = NULL;
ctrl->target = NULL;
ctrl->distr = NULL;
ctrl->current = -1;
ctrl->data = create_ctrl_mgmt();
ctrl->data = create_ctrl_mgmt();
if (ctrl->data == NULL) {
well_controls_destroy(ctrl);
@ -160,6 +163,8 @@ well_controls_reserve(int nctrl, int nphases, struct WellControls *ctrl)
if (target != NULL) { ctrl->target = target; ok++; }
if (distr != NULL) { ctrl->distr = distr ; ok++; }
ctrl->number_of_phases = nphases;
if (ok == 3) {
m = ctrl->data;
for (c = m->cpty; c < nctrl; c++) {
@ -167,7 +172,7 @@ well_controls_reserve(int nctrl, int nphases, struct WellControls *ctrl)
ctrl->target[c] = -1.0;
}
for (p = m->cpty * nphases; p < nctrl * nphases; ++p) {
for (p = m->cpty * ctrl->number_of_phases; p < nctrl * ctrl->number_of_phases; ++p) {
ctrl->distr[ p ] = 0.0;
}
@ -591,6 +596,7 @@ clear_well_controls(int well_index, struct Wells *W)
if (W->ctrls[well_index] != NULL) {
W->ctrls[well_index]->num = 0;
W->ctrls[well_index]->number_of_phases = 0;
}
}
@ -668,3 +674,67 @@ clone_wells(const struct Wells *W)
return ret;
}
/* ---------------------------------------------------------------------- */
bool
wells_equal(const struct Wells *W1, const struct Wells *W2)
/* ---------------------------------------------------------------------- */
{
bool are_equal = true;
are_equal = (W1->number_of_wells == W2->number_of_wells);
are_equal &= (W1->number_of_phases == W2->number_of_phases);
if (!are_equal) {
return are_equal;
}
for (int i=0; i<W1->number_of_wells; i++) {
are_equal &= (strcmp(W1->name[i], W2->name[i]) == 0);
are_equal &= (W1->type[i] == W2->type[i]);
are_equal &= (W1->depth_ref[i] == W2->depth_ref[i]);
are_equal &= (well_controls_equal(W1->ctrls[i], W2->ctrls[i]));
}
struct WellMgmt* mgmt1 = (struct WellMgmt*)(W1->data);
struct WellMgmt* mgmt2 = (struct WellMgmt*)(W2->data);
are_equal &= (mgmt1->perf_cpty == mgmt2->perf_cpty);
are_equal &= (mgmt1->well_cpty == mgmt2->well_cpty);
are_equal &= (memcmp(W1->comp_frac, W2->comp_frac, W1->number_of_wells * W1->number_of_phases * sizeof *W1->comp_frac ) == 0);
are_equal &= (memcmp(W1->well_connpos, W2->well_connpos, (1 + W1->number_of_wells) * sizeof *W1->well_connpos ) == 0);
if (!are_equal) {
return are_equal;
}
{
int number_of_perforations = W1->well_connpos[W1->number_of_wells];
are_equal &= (memcmp(W1->well_cells, W2->well_cells, number_of_perforations * sizeof *W1->well_cells ) == 0);
are_equal &= (memcmp(W1->WI, W2->WI, number_of_perforations * sizeof *W1->WI ) == 0);
}
return are_equal;
}
/* ---------------------------------------------------------------------- */
bool
well_controls_equal(const struct WellControls *ctrls1, const struct WellControls *ctrls2)
/* ---------------------------------------------------------------------- */
{
bool are_equal = true;
are_equal = (ctrls1->num == ctrls2->num);
are_equal &= (ctrls1->number_of_phases == ctrls2->number_of_phases);
if (!are_equal) {
return are_equal;
}
are_equal &= (memcmp(ctrls1->type, ctrls2->type, ctrls1->num * sizeof *ctrls1->type ) == 0);
are_equal &= (memcmp(ctrls1->target, ctrls2->target, ctrls1->num * sizeof *ctrls1->target ) == 0);
are_equal &= (memcmp(ctrls1->distr, ctrls2->distr, ctrls1->num * ctrls1->number_of_phases * sizeof *ctrls1->distr ) == 0);
struct WellControlMgmt* mgmt1 = (struct WellControlMgmt*)(ctrls1->data);
struct WellControlMgmt* mgmt2 = (struct WellControlMgmt*)(ctrls2->data);
are_equal &= (mgmt1->cpty == mgmt2->cpty);
return are_equal;
}

View File

@ -203,3 +203,29 @@ BOOST_AUTO_TEST_CASE(Copy)
}
}
}
BOOST_AUTO_TEST_CASE(Equals_WellsEqual_ReturnsTrue) {
const int nphases = 2;
const int nwells = 2;
const int nperfs = 2;
std::shared_ptr<Wells> W1(create_wells(nphases, nwells, nperfs),
destroy_wells);
std::shared_ptr<Wells> W2(create_wells(nphases, nwells, nperfs),
destroy_wells);
BOOST_CHECK(wells_equal(W1.get(), W2.get()));
}
BOOST_AUTO_TEST_CASE(Equals_WellsDiffer_ReturnsFalse) {
const int nphases = 2;
const int nperfs = 2;
std::shared_ptr<Wells> W1(create_wells(nphases, 2, nperfs),
destroy_wells);
std::shared_ptr<Wells> W2(create_wells(nphases, 3, nperfs),
destroy_wells);
BOOST_CHECK(!wells_equal(W1.get(), W2.get()));
}

View File

@ -0,0 +1,40 @@
/*
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 <http://www.gnu.org/licenses/>.
*/
#include <config.h>
#if HAVE_DYNAMIC_BOOST_TEST
#define BOOST_TEST_DYN_LINK
#endif
#define NVERBOSE // Suppress own messages when throw()ing
#define BOOST_TEST_MODULE WellsManagerTests
#include <boost/test/unit_test.hpp>
#include <opm/core/wells/WellsManager.hpp>
#include <opm/core/io/eclipse/EclipseGridParser.hpp>
#include <opm/core/grid/GridManager.hpp>
BOOST_AUTO_TEST_CASE(Constructor_Old_Works) {
Opm::EclipseGridParser oldParser("wells_manager_data.data");
Opm::GridManager gridManager(oldParser);
Opm::WellsManager wellsManager(oldParser, *gridManager.c_grid(), NULL);
const Wells* oldWells = wellsManager.c_wells();
BOOST_CHECK_EQUAL(oldWells->number_of_wells, 2);
}

45
tests/wells_manager_data.data Executable file
View File

@ -0,0 +1,45 @@
OIL
GAS
WATER
DIMENS
15 5 5 /
GRID
DXV
15*1000.0 /
DYV
5*1000.0 /
DZV
10.0 20.0 30.0 10.0 5.0 /
SCHEDULE
WELSPECS
'INJ1' 'G' 1 1 8335 'GAS' /
'PROD1' 'G' 10 10 8400 'OIL' /
/
COMPDAT
'INJ1' 1 1 1 1 'OPEN' 1 10.6092 0.5 /
'PROD1' 10 3 3 3 'OPEN' 0 10.6092 0.5 /
/
WCONPROD
'PROD1' 'OPEN' 'ORAT' 20000 4* 1000 /
/
WCONINJE
'INJ1' 'GAS' 'OPEN' 'RATE' 100000 100000 50000/
/
TSTEP
14.0
/
END