From 611cd533800d43d48582d715e714d70e7ae9ea28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Atgeirr=20Fl=C3=B8=20Rasmussen?= Date: Tue, 5 Jun 2012 15:42:49 +0200 Subject: [PATCH] Reorganized, added opm/core/wells/ and opm/core/simulator/. --- opm/core/pressure/CompressibleTpfa.cpp | 4 +- opm/core/simulator/BlackoilState.hpp | 103 ++++ opm/core/{ => simulator}/TwophaseState.hpp | 0 opm/core/{ => simulator}/WellState.hpp | 0 opm/core/utility/newwells.c | 549 ------------------ .../{ => wells}/InjectionSpecification.cpp | 3 +- .../{ => wells}/InjectionSpecification.hpp | 0 .../{ => wells}/ProductionSpecification.cpp | 2 +- .../{ => wells}/ProductionSpecification.hpp | 0 opm/core/{ => wells}/WellCollection.cpp | 2 +- opm/core/{ => wells}/WellCollection.hpp | 2 +- opm/core/{ => wells}/WellsGroup.cpp | 2 +- opm/core/{ => wells}/WellsGroup.hpp | 4 +- opm/core/{ => wells}/WellsManager.cpp | 4 +- opm/core/{ => wells}/WellsManager.hpp | 4 +- 15 files changed, 117 insertions(+), 562 deletions(-) create mode 100644 opm/core/simulator/BlackoilState.hpp rename opm/core/{ => simulator}/TwophaseState.hpp (100%) rename opm/core/{ => simulator}/WellState.hpp (100%) delete mode 100644 opm/core/utility/newwells.c rename opm/core/{ => wells}/InjectionSpecification.cpp (88%) rename opm/core/{ => wells}/InjectionSpecification.hpp (100%) rename opm/core/{ => wells}/ProductionSpecification.cpp (88%) rename opm/core/{ => wells}/ProductionSpecification.hpp (100%) rename opm/core/{ => wells}/WellCollection.cpp (99%) rename opm/core/{ => wells}/WellCollection.hpp (99%) rename opm/core/{ => wells}/WellsGroup.cpp (99%) rename opm/core/{ => wells}/WellsGroup.hpp (99%) rename opm/core/{ => wells}/WellsManager.cpp (99%) rename opm/core/{ => wells}/WellsManager.hpp (98%) diff --git a/opm/core/pressure/CompressibleTpfa.cpp b/opm/core/pressure/CompressibleTpfa.cpp index 0ee8bf8bd..83d3b8045 100644 --- a/opm/core/pressure/CompressibleTpfa.cpp +++ b/opm/core/pressure/CompressibleTpfa.cpp @@ -28,8 +28,8 @@ #include #include #include -#include -#include +#include +#include #include #include diff --git a/opm/core/simulator/BlackoilState.hpp b/opm/core/simulator/BlackoilState.hpp new file mode 100644 index 000000000..6da857a74 --- /dev/null +++ b/opm/core/simulator/BlackoilState.hpp @@ -0,0 +1,103 @@ +/* + Copyright 2012 SINTEF ICT, Applied Mathematics. + + 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 . +*/ + +#ifndef OPM_BLACKOILSTATE_HEADER_INCLUDED +#define OPM_BLACKOILSTATE_HEADER_INCLUDED + +#include +#include +#include + +namespace Opm +{ + + /// Simulator state for a blackoil simulator. + class BlackoilState + { + public: + + void init(const UnstructuredGrid& g, const int num_phases) + { + num_phases_ = num_phases; + press_.resize(g.number_of_cells, 0.0); + fpress_.resize(g.number_of_faces, 0.0); + flux_.resize(g.number_of_faces, 0.0); + sat_.resize(num_phases * g.number_of_cells, 0.0); + for (int cell = 0; cell < g.number_of_cells; ++cell) { + // Defaulting the second saturation to 1.0. + // This will usually be oil in a water-oil case, + // gas in an oil-gas case. + // For proper initialization, one should not rely on this, + // but use available phase information instead. + sat_[num_phases*cell + 1] = 1.0; + } + } + + enum ExtremalSat { MinSat, MaxSat }; + + /// Set the first saturation to either its min or max value in + /// the indicated cells. The second saturation value s2 is set + /// to (1.0 - s1) for each cell. Any further saturation values + /// are unchanged. + void setFirstSat(const std::vector& cells, + const Opm::BlackoilPropertiesInterface& props, + ExtremalSat es) + { + const int n = cells.size(); + std::vector smin(num_phases_*n); + std::vector smax(num_phases_*n); + props.satRange(n, &cells[0], &smin[0], &smax[0]); + const double* svals = (es == MinSat) ? &smin[0] : &smax[0]; + for (int ci = 0; ci < n; ++ci) { + const int cell = cells[ci]; + sat_[num_phases_*cell] = svals[num_phases_*ci]; + sat_[num_phases_*cell + 1] = 1.0 - sat_[num_phases_*cell]; + } + } + + int numPhases() const + { + return num_phases_; + } + + std::vector& pressure () { return press_ ; } + std::vector& facepressure() { return fpress_; } + std::vector& faceflux () { return flux_ ; } + std::vector& surfacevol () { return surfvol_; } + std::vector& saturation () { return sat_ ; } + + const std::vector& pressure () const { return press_ ; } + const std::vector& facepressure() const { return fpress_; } + const std::vector& faceflux () const { return flux_ ; } + const std::vector& surfacevol () const { return surfvol_; } + const std::vector& saturation () const { return sat_ ; } + + private: + int num_phases_; + std::vector press_ ; + std::vector fpress_; + std::vector flux_ ; + std::vector surfvol_; + std::vector sat_ ; + }; + +} // namespace Opm + + +#endif // OPM_BLACKOILSTATE_HEADER_INCLUDED diff --git a/opm/core/TwophaseState.hpp b/opm/core/simulator/TwophaseState.hpp similarity index 100% rename from opm/core/TwophaseState.hpp rename to opm/core/simulator/TwophaseState.hpp diff --git a/opm/core/WellState.hpp b/opm/core/simulator/WellState.hpp similarity index 100% rename from opm/core/WellState.hpp rename to opm/core/simulator/WellState.hpp diff --git a/opm/core/utility/newwells.c b/opm/core/utility/newwells.c deleted file mode 100644 index e177f89fd..000000000 --- a/opm/core/utility/newwells.c +++ /dev/null @@ -1,549 +0,0 @@ -/*=========================================================================== -// -// File: newwells.c -// -// Created: 2012-02-03 11:28:40+0100 -// -// Authors: Knut-Andreas Lie -// Jostein R. Natvig -// Halvor M. Nilsen -// Atgeirr F. Rasmussen -// Xavier Raynaud -// Bård Skaflestad -// -//==========================================================================*/ - - -/* - Copyright 2012 SINTEF ICT, Applied Mathematics. - Copyright 2012 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 . -*/ - -#include - -#include -#include -#include -#include - -struct WellControlMgmt { - int cpty; -}; - -struct WellMgmt { - int well_cpty; - int perf_cpty; -}; - - -static void -destroy_ctrl_mgmt(struct WellControlMgmt *m) -{ - free(m); -} - - -static struct WellControlMgmt * -create_ctrl_mgmt(void) -{ - struct WellControlMgmt *m; - - m = malloc(1 * sizeof *m); - - if (m != NULL) { - m->cpty = 0; - } - - return m; -} - - -static void -destroy_well_mgmt(struct WellMgmt *m) -{ - free(m); -} - - -static struct WellMgmt * -create_well_mgmt(void) -{ - struct WellMgmt *m; - - m = malloc(1 * sizeof *m); - - if (m != NULL) { - m->well_cpty = 0; - m->perf_cpty = 0; - } - - return m; -} - - -/* ---------------------------------------------------------------------- */ -static void -well_controls_destroy(struct WellControls *ctrl) -/* ---------------------------------------------------------------------- */ -{ - if (ctrl != NULL) { - destroy_ctrl_mgmt(ctrl->data); - free (ctrl->distr); - free (ctrl->target); - free (ctrl->type); - } - - free(ctrl); -} - - -/* ---------------------------------------------------------------------- */ -static struct WellControls * -well_controls_create(void) -/* ---------------------------------------------------------------------- */ -{ - struct WellControls *ctrl; - - ctrl = malloc(1 * sizeof *ctrl); - - if (ctrl != NULL) { - /* Initialise empty control set */ - ctrl->num = 0; - ctrl->type = NULL; - ctrl->target = NULL; - ctrl->distr = NULL; - ctrl->current = -1; - - ctrl->data = create_ctrl_mgmt(); - - if (ctrl->data == NULL) { - well_controls_destroy(ctrl); - ctrl = NULL; - } - } - - return ctrl; -} - - -/* ---------------------------------------------------------------------- */ -static int -well_controls_reserve(int nctrl, int nphases, struct WellControls *ctrl) -/* ---------------------------------------------------------------------- */ -{ - int c, p, ok; - void *type, *target, *distr; - - struct WellControlMgmt *m; - - type = realloc(ctrl->type , nctrl * 1 * sizeof *ctrl->type ); - target = realloc(ctrl->target, nctrl * 1 * sizeof *ctrl->target); - distr = realloc(ctrl->distr , nctrl * nphases * sizeof *ctrl->distr ); - - ok = 0; - if (type != NULL) { ctrl->type = type ; ok++; } - if (target != NULL) { ctrl->target = target; ok++; } - if (distr != NULL) { ctrl->distr = distr ; ok++; } - - if (ok == 3) { - m = ctrl->data; - for (c = m->cpty; c < nctrl; c++) { - ctrl->type [c] = BHP; - ctrl->target[c] = -1.0; - } - - for (p = m->cpty * nphases; p < nctrl * nphases; ++p) { - ctrl->distr[ p ] = 0.0; - } - - m->cpty = nctrl; - } - - return ok == 3; -} - - -/* ---------------------------------------------------------------------- */ -static int -wells_allocate(int nwells, struct Wells *W) -/* ---------------------------------------------------------------------- */ -{ - int ok, np; - void *type, *depth_ref, *comp_frac; - void *well_connpos; - void *ctrls; - - np = W->number_of_phases; - - type = realloc(W->type , 1 * nwells * sizeof *W->type); - depth_ref = realloc(W->depth_ref, 1 * nwells * sizeof *W->depth_ref); - comp_frac = realloc(W->comp_frac, np * nwells * sizeof *W->comp_frac); - ctrls = realloc(W->ctrls , 1 * nwells * sizeof *W->ctrls); - - well_connpos = realloc(W->well_connpos, - (nwells + 1) * sizeof *W->well_connpos); - - ok = 0; - if (type != NULL) { W->type = type ; ok++; } - if (depth_ref != NULL) { W->depth_ref = depth_ref ; ok++; } - if (comp_frac != NULL) { W->comp_frac = comp_frac ; ok++; } - if (well_connpos != NULL) { W->well_connpos = well_connpos; ok++; } - if (ctrls != NULL) { W->ctrls = ctrls ; ok++; } - - return ok == 5; -} - - -/* ---------------------------------------------------------------------- */ -static int -perfs_allocate(int nperf, struct Wells *W) -/* ---------------------------------------------------------------------- */ -{ - int ok; - void *well_cells, *WI; - - well_cells = realloc(W->well_cells, nperf * sizeof *W->well_cells); - WI = realloc(W->WI , nperf * sizeof *W->WI ); - - ok = 0; - if (well_cells != NULL) { W->well_cells = well_cells; ok++; } - if (WI != NULL) { W->WI = WI ; ok++; } - - return ok == 2; -} - - -/* ---------------------------------------------------------------------- */ -static int -initialise_new_wells(int nwells, struct Wells *W) -/* ---------------------------------------------------------------------- */ -{ - int ok, w, p; - - struct WellMgmt *m; - - m = W->data; - - for (w = m->well_cpty; w < nwells; w++) { - W->type [w] = PRODUCER; - W->depth_ref[w] = -1.0; - - for (p = 0; p < W->number_of_phases; ++p) { - W->comp_frac[W->number_of_phases*w + p] = 0.0; - } - - W->well_connpos[w + 1] = W->well_connpos[w]; - } - - for (w = m->well_cpty, ok = 1; ok && (w < nwells); w++) { - W->ctrls[w] = well_controls_create(); - - ok = W->ctrls[w] != NULL; - } - - if (! ok) { - for (; w < nwells; w++) { - W->ctrls[w] = NULL; - } - } - - return ok; -} - - -/* ---------------------------------------------------------------------- */ -static void -initialise_new_perfs(int nperf, struct Wells *W) -/* ---------------------------------------------------------------------- */ -{ - int k; - - struct WellMgmt *m; - - m = W->data; - - for (k = m->perf_cpty; k < nperf; k++) { - W->well_cells[k] = -1 ; - W->WI [k] = 0.0; - } -} - - -/* ---------------------------------------------------------------------- */ -static int -wells_reserve(int nwells, int nperf, struct Wells *W) -/* ---------------------------------------------------------------------- */ -{ - int ok; - - struct WellMgmt *m; - - m = W->data; - - assert (nwells >= m->well_cpty); - assert (nperf >= m->perf_cpty); - - ok = 1; - - if (nwells > m->well_cpty) { - ok = wells_allocate(nwells, W); - - if (ok) { - ok = initialise_new_wells(nwells, W); - } - - if (ok) { - m->well_cpty = nwells; - } - } - - if (ok && (nperf > m->perf_cpty)) { - ok = perfs_allocate(nperf, W); - - if (ok) { - initialise_new_perfs(nperf, W); - m->perf_cpty = nperf; - } - } - - return ok; -} - - -/* ====================================================================== - * Public entry points below separator. - * ====================================================================== */ - - -/* ---------------------------------------------------------------------- */ -struct Wells * -create_wells(int nphases, int nwells, int nperf) -/* ---------------------------------------------------------------------- */ -{ - int ok; - struct Wells *W; - - W = malloc(1 * sizeof *W); - - if (W != NULL) { - W->number_of_wells = 0; - W->number_of_phases = nphases; - - W->type = NULL; - W->depth_ref = NULL; - W->comp_frac = NULL; - - W->well_connpos = malloc(1 * sizeof *W->well_connpos); - W->well_cells = NULL; - W->WI = NULL; - - W->ctrls = NULL; - - W->data = create_well_mgmt(); - - ok = (W->well_connpos != NULL) && (W->data != NULL); - if (ok) { - W->well_connpos[0] = 0; - - if ((nwells > 0) || (nperf > 0)) { - ok = wells_reserve(nwells, nperf, W); - } - } - - if (! ok) { - destroy_wells(W); - W = NULL; - } - } - - return W; -} - - -/* ---------------------------------------------------------------------- */ -void -destroy_wells(struct Wells *W) -/* ---------------------------------------------------------------------- */ -{ - int w; - - struct WellMgmt *m; - - if (W != NULL) { - m = W->data; - - for (w = 0; w < m->well_cpty; w++) { - well_controls_destroy(W->ctrls[w]); - } - - destroy_well_mgmt(m); - - free(W->ctrls); - free(W->WI); - free(W->well_cells); - free(W->well_connpos); - free(W->comp_frac); - free(W->depth_ref); - free(W->type); - } - - free(W); -} - - -/* ---------------------------------------------------------------------- */ -static int -alloc_size(int n, int a, int cpty) -/* ---------------------------------------------------------------------- */ -{ - if (cpty < n + a) { - cpty *= 2; /* log_2(n) allocations */ - - if (cpty < n + a) { /* Typically for the first few allocs */ - cpty = n + a; - } - } - - return cpty; -} - - -/* ---------------------------------------------------------------------- */ -int -add_well(enum WellType type , - double depth_ref, - int nperf , - const double *comp_frac, /* Injection fraction or NULL */ - const int *cells , - const double *WI , /* Well index per perf (or NULL) */ - struct Wells *W ) -/* ---------------------------------------------------------------------- */ -{ - int ok, nw, np, nperf_tot, off; - int nwalloc, nperfalloc; - - struct WellMgmt *m; - - nw = W->number_of_wells; - nperf_tot = W->well_connpos[nw]; - - m = W->data; - - ok = (nw < m->well_cpty) && (nperf_tot + nperf <= m->perf_cpty); - - if (! ok) { - nwalloc = alloc_size(nw , 1 , m->well_cpty); - nperfalloc = alloc_size(nperf_tot, nperf, m->perf_cpty); - - ok = wells_reserve(nwalloc, nperfalloc, W); - } - - off = W->well_connpos[nw]; - - if (ok && (nperf > 0)) { - assert (cells != NULL); - - memcpy(W->well_cells + off, - cells, nperf * sizeof *W->well_cells); - - if (WI != NULL) { - memcpy(W->WI + off, WI, nperf * sizeof *W->WI); - } - } - - if (ok) { - W->type [nw] = type ; - W->depth_ref[nw] = depth_ref; - - np = W->number_of_phases; - if (comp_frac != NULL) { - memcpy(W->comp_frac + np*nw, comp_frac, np * sizeof *W->comp_frac); - } - - W->well_connpos[nw + 1] = off + nperf; - W->number_of_wells += 1; - } - - return ok; -} - - -/* ---------------------------------------------------------------------- */ -int -append_well_controls(enum WellControlType type, - double target, - const double *distr, - int well_index, - struct Wells *W) -/* ---------------------------------------------------------------------- */ -{ - int ok, alloc, np; - struct WellControls *ctrl; - struct WellControlMgmt *m; - - assert (W != NULL); - - ctrl = W->ctrls[well_index]; - np = W->number_of_phases; - - assert (ctrl != NULL); - - m = ctrl->data; - ok = ctrl->num < m->cpty; - - if (! ok) { - alloc = alloc_size(ctrl->num, 1, m->cpty); - ok = well_controls_reserve(alloc, np, ctrl); - } - - if (ok) { - ctrl->type [ctrl->num] = type ; - ctrl->target[ctrl->num] = target; - - if (distr != NULL) { - memcpy(ctrl->distr + (ctrl->num * np), distr, - np * sizeof *ctrl->distr); - } - - ctrl->num += 1; - } - - return ok; -} - - -/* ---------------------------------------------------------------------- */ -void -set_current_control(int well_index, int current_control, struct Wells *W) -/* ---------------------------------------------------------------------- */ -{ - assert (W->ctrls[well_index] != NULL); - - W->ctrls[well_index]->current = current_control; -} - - -/* ---------------------------------------------------------------------- */ -void -clear_well_controls(int well_index, struct Wells *W) -/* ---------------------------------------------------------------------- */ -{ - if (W->ctrls[well_index] != NULL) { - W->ctrls[well_index]->num = 0; - } -} diff --git a/opm/core/InjectionSpecification.cpp b/opm/core/wells/InjectionSpecification.cpp similarity index 88% rename from opm/core/InjectionSpecification.cpp rename to opm/core/wells/InjectionSpecification.cpp index dca7fc76b..accae78c4 100644 --- a/opm/core/InjectionSpecification.cpp +++ b/opm/core/wells/InjectionSpecification.cpp @@ -1,4 +1,5 @@ -#include +#include + namespace Opm { diff --git a/opm/core/InjectionSpecification.hpp b/opm/core/wells/InjectionSpecification.hpp similarity index 100% rename from opm/core/InjectionSpecification.hpp rename to opm/core/wells/InjectionSpecification.hpp diff --git a/opm/core/ProductionSpecification.cpp b/opm/core/wells/ProductionSpecification.cpp similarity index 88% rename from opm/core/ProductionSpecification.cpp rename to opm/core/wells/ProductionSpecification.cpp index eb0f7d831..4d4bdf4d2 100644 --- a/opm/core/ProductionSpecification.cpp +++ b/opm/core/wells/ProductionSpecification.cpp @@ -1,4 +1,4 @@ -#include +#include namespace Opm { diff --git a/opm/core/ProductionSpecification.hpp b/opm/core/wells/ProductionSpecification.hpp similarity index 100% rename from opm/core/ProductionSpecification.hpp rename to opm/core/wells/ProductionSpecification.hpp diff --git a/opm/core/WellCollection.cpp b/opm/core/wells/WellCollection.cpp similarity index 99% rename from opm/core/WellCollection.cpp rename to opm/core/wells/WellCollection.cpp index 76b311e7e..727a7242b 100644 --- a/opm/core/WellCollection.cpp +++ b/opm/core/wells/WellCollection.cpp @@ -18,7 +18,7 @@ You should have received a copy of the GNU General Public License along with OpenRS. If not, see . */ -#include "WellCollection.hpp" +#include namespace Opm { diff --git a/opm/core/WellCollection.hpp b/opm/core/wells/WellCollection.hpp similarity index 99% rename from opm/core/WellCollection.hpp rename to opm/core/wells/WellCollection.hpp index 62abd4ee3..1957576a6 100644 --- a/opm/core/WellCollection.hpp +++ b/opm/core/wells/WellCollection.hpp @@ -23,7 +23,7 @@ along with OpenRS. If not, see . #define OPM_WELLCOLLECTION_HPP #include -#include +#include #include #include diff --git a/opm/core/WellsGroup.cpp b/opm/core/wells/WellsGroup.cpp similarity index 99% rename from opm/core/WellsGroup.cpp rename to opm/core/wells/WellsGroup.cpp index 903cc9b2f..3514bb5d0 100644 --- a/opm/core/WellsGroup.cpp +++ b/opm/core/wells/WellsGroup.cpp @@ -17,7 +17,7 @@ along with OPM. If not, see . */ -#include +#include #include #include #include diff --git a/opm/core/WellsGroup.hpp b/opm/core/wells/WellsGroup.hpp similarity index 99% rename from opm/core/WellsGroup.hpp rename to opm/core/wells/WellsGroup.hpp index 3c14950dd..f1b1afbb6 100644 --- a/opm/core/WellsGroup.hpp +++ b/opm/core/wells/WellsGroup.hpp @@ -20,8 +20,8 @@ #ifndef OPM_WELLSGROUP_HPP #define OPM_WELLSGROUP_HPP -#include -#include +#include +#include #include #include #include diff --git a/opm/core/WellsManager.cpp b/opm/core/wells/WellsManager.cpp similarity index 99% rename from opm/core/WellsManager.cpp rename to opm/core/wells/WellsManager.cpp index 8aa5d6443..d305ee9f9 100644 --- a/opm/core/WellsManager.cpp +++ b/opm/core/wells/WellsManager.cpp @@ -18,13 +18,13 @@ */ -#include +#include #include #include #include #include #include -#include +#include #include #include diff --git a/opm/core/WellsManager.hpp b/opm/core/wells/WellsManager.hpp similarity index 98% rename from opm/core/WellsManager.hpp rename to opm/core/wells/WellsManager.hpp index 3fbdbd1a1..6df65ec41 100644 --- a/opm/core/WellsManager.hpp +++ b/opm/core/wells/WellsManager.hpp @@ -21,8 +21,8 @@ #define OPM_WELLSMANAGER_HEADER_INCLUDED -#include -#include +#include +#include struct Wells; struct UnstructuredGrid;