Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Kirill Terekhov
INMOST
Commits
38603367
Commit
38603367
authored
Jun 23, 2017
by
Kirill Terekhov
Browse files
Some corretions for processing of wells in GRDECL
parent
a1dd7aac
Changes
2
Hide whitespace changes
Inline
Side-by-side
Source/IO/mesh_ecl_file.cpp
View file @
38603367
...
...
@@ -67,6 +67,7 @@
//this controls what is recorded into tag CTRL of well sets
#define ECL_WCTRL_RATE 0
#define ECL_WCTRL_BHP 1
#define ECL_WCTRL_RESV 2
//this controls what is recorded into tag PHASE of well sets
#define ECL_WPHASE_WATER 0
...
...
@@ -86,6 +87,7 @@
#define ECL_WTAG_CTRL 4
#define ECL_WTAG_TYPE 5
#define ECL_WTAG_PHASE 6
#define ECL_WTAG_BHP 7
//eclipse states
#define ECL_NEVER -1
...
...
@@ -2072,8 +2074,9 @@ namespace INMOST
wconprodinje_cur
.
second
.
type
=
"PROD"
;
else
wconprodinje_cur
.
second
.
type
=
"WATER"
;
memset
(
wconprodinje_cur
.
second
.
urats
.
rats
,
0
,
sizeof
(
double
)
*
5
);
wconprodinje_cur
.
second
.
bhp
=
1.0e+5
;
//default psia in eclipse
for
(
int
k
=
0
;
k
<
5
;
++
k
)
wconprodinje_cur
.
second
.
urats
.
rats
[
k
]
=
-
1
;
wconprodinje_cur
.
second
.
bhp
=
-
1
;
//default psia in eclipse
if
(
wconprod
)
state
=
ECL_WCONPRODINJE_OPEN
;
else
...
...
@@ -2095,25 +2098,33 @@ namespace INMOST
}
if
(
p
==
pend
)
break
;
case
ECL_WCONPRODINJE_TYPE
:
if
(
ReadName
(
p
,
pend
,
rec
,
&
nchars
)
)
if
(
state
==
ECL_WCONPRODINJE_TYPE
)
{
if
(
rec
[
0
]
!=
'*'
)
wconprodinje_cur
.
second
.
type
=
std
::
string
(
rec
);
state
=
ECL_WCONPRODINJE_OPEN
;
p
+=
nchars
;
while
(
isspace
(
*
p
)
&&
p
<
pend
)
++
p
;
}
else
{
std
::
cout
<<
__FILE__
<<
":"
<<
__LINE__
<<
" cannot read data "
<<
p
<<
" in "
<<
fs
.
back
().
first
.
second
<<
":"
<<
fs
.
back
().
second
<<
std
::
endl
;
throw
BadFile
;
if
(
ReadName
(
p
,
pend
,
rec
,
&
nchars
))
{
if
(
rec
[
0
]
!=
'*'
)
wconprodinje_cur
.
second
.
type
=
std
::
string
(
rec
);
state
=
ECL_WCONPRODINJE_OPEN
;
p
+=
nchars
;
while
(
isspace
(
*
p
)
&&
p
<
pend
)
++
p
;
}
else
{
std
::
cout
<<
__FILE__
<<
":"
<<
__LINE__
<<
" cannot read data "
<<
p
<<
" in "
<<
fs
.
back
().
first
.
second
<<
":"
<<
fs
.
back
().
second
<<
std
::
endl
;
throw
BadFile
;
}
if
(
p
==
pend
)
break
;
}
if
(
p
==
pend
)
break
;
case
ECL_WCONPRODINJE_OPEN
:
if
(
ReadName
(
p
,
pend
,
rec
,
&
nchars
))
{
if
(
rec
[
0
]
!=
'*'
)
wconprodinje_cur
.
second
.
type
=
std
::
string
(
rec
);
{
if
(
std
::
string
(
rec
)
==
"OPEN"
)
wconprodinje_cur
.
second
.
open
=
true
;
else
wconprodinje_cur
.
second
.
open
=
false
;
}
state
=
ECL_WCONPRODINJE_CTRL
;
p
+=
nchars
;
while
(
isspace
(
*
p
)
&&
p
<
pend
)
++
p
;
...
...
@@ -4860,6 +4871,7 @@ namespace INMOST
TagReal
tagopen
=
CreateTag
(
"WELL_STATE"
,
DATA_REAL
,
CELL
|
ESET
,
CELL
|
ESET
,
1
);
TagReal
tagctrl
=
CreateTag
(
"WELL_CTRL"
,
DATA_REAL
,
ESET
,
ESET
,
1
);
TagReal
tagz
=
CreateTag
(
"WELL_DEPTH"
,
DATA_REAL
,
ESET
,
ESET
,
1
);
TagReal
tagbhp
=
CreateTag
(
"WELL_BHP"
,
DATA_REAL
,
ESET
,
ESET
,
1
);
TagBulk
tagdir
=
CreateTag
(
"WELL_DIRECTION"
,
DATA_BULK
,
CELL
,
CELL
,
1
);
TagRealArray
tagschd_time
=
CreateTag
(
"SCHEDULE_TIME"
,
DATA_REAL
,
ESET
,
ESET
);
//time of simulation that activates record
TagBulkArray
tagschd_tag
=
CreateTag
(
"SCHEDULE_TAG"
,
DATA_BULK
,
ESET
,
ESET
);
//names of changed tags separated by '\0'
...
...
@@ -4884,7 +4896,8 @@ namespace INMOST
//default behavior
tagz
[
set
]
=
wspec
.
depth
;
tagopen
[
set
]
=
false
;
tagcval
[
set
]
=
1.0e+5
;
tagbhp
[
set
]
=
-
1
;
tagcval
[
set
]
=
-
1
;
tagph
[
set
]
=
ECL_WPHASE_WATER
;
tagctrl
[
set
]
=
ECL_WCTRL_BHP
;
tagtype
[
set
]
=
ECL_WTYPE_PROD
;
...
...
@@ -5003,39 +5016,46 @@ namespace INMOST
{
if
(
jt
->
first
==
1
)
//first record
{
tagbhp
[
set
]
=
jt
->
second
.
bhp
;
tagopen
[
set
]
=
jt
->
second
.
open
;
if
(
jt
->
second
.
type
==
"PROD"
)
{
tagtype
[
set
]
=
ECL_WTYPE_PROD
;
if
(
jt
->
second
.
ctrl
==
"ORAT"
)
{
tagph
[
set
]
=
ECL_WPHASE_
WATER
;
tagph
[
set
]
=
ECL_WPHASE_
OIL
;
tagctrl
[
set
]
=
ECL_WCTRL_RATE
;
tagcval
[
set
]
=
jt
->
second
.
urats
.
prat
.
orat
;
}
else
if
(
jt
->
second
.
type
==
"GRAT"
)
else
if
(
jt
->
second
.
ctrl
==
"WRAT"
)
{
tagph
[
set
]
=
ECL_WPHASE_WATER
;
tagctrl
[
set
]
=
ECL_WCTRL_RATE
;
tagcval
[
set
]
=
jt
->
second
.
urats
.
prat
.
wrat
;
}
else
if
(
jt
->
second
.
ctrl
==
"GRAT"
)
{
tagph
[
set
]
=
ECL_WPHASE_GAS
;
tagctrl
[
set
]
=
ECL_WCTRL_RATE
;
tagcval
[
set
]
=
jt
->
second
.
urats
.
prat
.
grat
;
}
else
if
(
jt
->
second
.
type
==
"LRAT"
)
else
if
(
jt
->
second
.
ctrl
==
"LRAT"
)
{
tagph
[
set
]
=
ECL_WPHASE_MULTI
;
tagctrl
[
set
]
=
ECL_WCTRL_RATE
;
tagcval
[
set
]
=
jt
->
second
.
urats
.
prat
.
lrat
;
}
else
if
(
jt
->
second
.
type
==
"RESV"
)
//TODO10.3: what should we do with this?
else
if
(
jt
->
second
.
ctrl
==
"RESV"
)
//TODO10.3: what should we do with this?
{
tagph
[
set
]
=
ECL_WPHASE_MULTI
;
tagctrl
[
set
]
=
ECL_WCTRL_R
ATE
;
tagctrl
[
set
]
=
ECL_WCTRL_R
ESV
;
tagcval
[
set
]
=
jt
->
second
.
urats
.
prat
.
resv
;
}
else
if
(
jt
->
second
.
type
==
"BHP"
)
else
if
(
jt
->
second
.
ctrl
==
"BHP"
)
{
tagph
[
set
]
=
ECL_WPHASE_MULTI
;
tagctrl
[
set
]
=
ECL_WCTRL_
RATE
;
tagcval
[
set
]
=
jt
->
second
.
urats
.
prat
.
lrat
;
tagctrl
[
set
]
=
ECL_WCTRL_
BHP
;
tagcval
[
set
]
=
jt
->
second
.
bhp
;
}
}
else
...
...
@@ -5056,7 +5076,7 @@ namespace INMOST
}
else
if
(
jt
->
second
.
ctrl
==
"RESV"
)
//TODO10.3:
{
tagctrl
[
set
]
=
ECL_WCTRL_R
ATE
;
tagctrl
[
set
]
=
ECL_WCTRL_R
ESV
;
tagcval
[
set
]
=
jt
->
second
.
urats
.
irat
.
resv
;
}
else
if
(
jt
->
second
.
ctrl
==
"BHP"
)
...
...
@@ -5069,27 +5089,36 @@ namespace INMOST
}
else
//schedule change
{
schedule
sopen
,
stype
,
sph
,
sctrl
,
scval
;
schedule
sopen
,
stype
,
sph
,
sctrl
,
scval
,
sbhp
;
sbhp
.
element
=
set
->
GetHandle
();
sopen
.
element
=
set
->
GetHandle
();
stype
.
element
=
set
->
GetHandle
();
sph
.
element
=
set
->
GetHandle
();
sctrl
.
element
=
set
->
GetHandle
();
scval
.
element
=
set
->
GetHandle
();
sbhp
.
tagnum
=
ECL_WTAG_BHP
;
sopen
.
tagnum
=
ECL_WTAG_STATE
;
stype
.
tagnum
=
ECL_WTAG_TYPE
;
sph
.
tagnum
=
ECL_WTAG_PHASE
;
sctrl
.
tagnum
=
ECL_WTAG_CTRL
;
scval
.
tagnum
=
ECL_WTAG_CVAL
;
sbhp
.
value
=
jt
->
second
.
bhp
;
sopen
.
value
=
jt
->
second
.
open
;
if
(
jt
->
second
.
type
==
"PROD"
)
{
stype
.
value
=
ECL_WTYPE_PROD
;
if
(
jt
->
second
.
ctrl
==
"ORAT"
)
{
sph
.
value
=
ECL_WPHASE_
WATER
;
sph
.
value
=
ECL_WPHASE_
OIL
;
sctrl
.
value
=
ECL_WCTRL_RATE
;
scval
.
value
=
jt
->
second
.
urats
.
prat
.
orat
;
}
else
if
(
jt
->
second
.
ctrl
==
"WRAT"
)
{
sph
.
value
=
ECL_WPHASE_WATER
;
sctrl
.
value
=
ECL_WCTRL_RATE
;
scval
.
value
=
jt
->
second
.
urats
.
prat
.
wrat
;
}
else
if
(
jt
->
second
.
type
==
"GRAT"
)
{
sph
.
value
=
ECL_WPHASE_GAS
;
...
...
@@ -5105,7 +5134,7 @@ namespace INMOST
else
if
(
jt
->
second
.
type
==
"RESV"
)
//TODO10.3: what should we do with this?
{
sph
.
value
=
ECL_WPHASE_MULTI
;
sctrl
.
value
=
ECL_WCTRL_R
ATE
;
sctrl
.
value
=
ECL_WCTRL_R
ESV
;
scval
.
value
=
jt
->
second
.
urats
.
prat
.
resv
;
}
else
if
(
jt
->
second
.
type
==
"BHP"
)
...
...
@@ -5133,7 +5162,7 @@ namespace INMOST
}
else
if
(
jt
->
second
.
ctrl
==
"RESV"
)
//TODO10.3:
{
sctrl
.
value
=
ECL_WCTRL_R
ATE
;
sctrl
.
value
=
ECL_WCTRL_R
ESV
;
scval
.
value
=
jt
->
second
.
urats
.
irat
.
resv
;
}
else
if
(
jt
->
second
.
ctrl
==
"BHP"
)
...
...
@@ -5143,6 +5172,7 @@ namespace INMOST
}
}
//add records
wschd
[
jt
->
first
].
push_back
(
sbhp
);
wschd
[
jt
->
first
].
push_back
(
sopen
);
wschd
[
jt
->
first
].
push_back
(
stype
);
wschd
[
jt
->
first
].
push_back
(
sph
);
...
...
@@ -5170,7 +5200,29 @@ namespace INMOST
}
}
if
(
verbosity
>
1
)
std
::
cout
<<
"Total scheduled records "
<<
changes
<<
std
::
endl
;
std
::
cout
<<
"Total scheduled records "
<<
changes
<<
" for well "
<<
set
->
GetName
()
<<
std
::
endl
;
//debug
/*
{
for (int k = 0; k < (int)tagschd_time[set].size(); ++k)
{
std::cout << std::setw(4) << k << " " << std::setw(12) << tagschd_time[set][k] << " ";
switch (tagschd_tag[set][k])
{
case ECL_WTAG_BHP: std::cout << "BHP "; break;
case ECL_WTAG_CTRL: std::cout << "CTRL "; break;
case ECL_WTAG_CVAL: std::cout << "CVAL "; break;
case ECL_WTAG_PHASE: std::cout << "PHASE"; break;
case ECL_WTAG_STATE: std::cout << "OPEN "; break;
case ECL_WTAG_TYPE: std::cout << "TYPE "; break;
case ECL_WTAG_WI: std::cout << "WI "; break;
}
std::cout << " " << std::setw(12) << tagschd_val[set][k] << " on ";
std::cout << ElementTypeName(tagschd_elem[set][k].GetElementType());
std::cout << ":" << tagschd_elem[set][k].LocalID() << std::endl;
}
}
*/
}
set
->
RemMarkerElements
(
added
);
well_sets
.
push_back
(
set
->
GetHandle
());
...
...
Source/Mesh/mesh.cpp
View file @
38603367
...
...
@@ -2455,7 +2455,7 @@ namespace INMOST
if
(
e
->
GetName
()
==
name
)
return
e
;
}
return
ElementSet
(
this
,
InvalidHandle
()
);
return
Invalid
ElementSet
();
}
ElementArray
<
ElementSet
>
Mesh
::
GetSetsByPrefix
(
std
::
string
name
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment