mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
moving depth difference calcualtion to init() for MultisegmentWells
instead of recalculating them for each iterations.
This commit is contained in:
parent
c2bdaa1b92
commit
d2d9bd8a80
@ -233,6 +233,43 @@ namespace Opm {
|
||||
vfp_properties_ = vfp_properties_arg;
|
||||
gravity_ = gravity_arg;
|
||||
perf_cell_depth_ = subset(depth_arg, wellOps().well_cells);;
|
||||
|
||||
const int nw = wells_multisegment_.size();
|
||||
|
||||
// Calculating the depth difference between perforation and the cell center in the peforated cells.
|
||||
std::vector<double> perf_depth_vec;
|
||||
perf_depth_vec.reserve(nperf_total_);
|
||||
for (int w = 0; w < nw; ++w) {
|
||||
WellMultiSegmentConstPtr well = wells_multisegment_[w];
|
||||
const std::vector<double>& perf_depth_well = well->perfDepth();
|
||||
perf_depth_vec.insert(perf_depth_vec.end(), perf_depth_well.begin(), perf_depth_well.end());
|
||||
}
|
||||
assert(int(perf_depth_vec.size()) == nperf_total_);
|
||||
const Vector perf_depth = Eigen::Map<Vector>(perf_depth_vec.data(), nperf_total_);
|
||||
|
||||
perf_cell_depth_diffs_ = perf_depth - perf_cell_depth_;
|
||||
|
||||
// Calculating the depth difference between segment nodes and perforations.
|
||||
well_segment_perforation_depth_diffs_ = Vector::Constant(nperf_total_, -1e100);
|
||||
|
||||
int start_perforation = 0;
|
||||
for (int w = 0; w < nw; ++w) {
|
||||
WellMultiSegmentConstPtr well = wells_multisegment_[w];
|
||||
const int nseg = well->numberOfSegments();
|
||||
const int nperf = well->numberOfPerforations();
|
||||
const std::vector<std::vector<int>>& segment_perforations = well->segmentPerforations();
|
||||
for (int s = 0; s < nseg; ++s) {
|
||||
const int nperf_seg = segment_perforations[s].size();
|
||||
const double segment_depth = well->segmentDepth()[s];
|
||||
for (int perf = 0; perf < nperf_seg; ++perf) {
|
||||
const int perf_number = segment_perforations[s][perf] + start_perforation;
|
||||
well_segment_perforation_depth_diffs_[perf_number] = segment_depth - perf_depth[perf_number];
|
||||
}
|
||||
}
|
||||
start_perforation += nperf;
|
||||
}
|
||||
|
||||
assert(start_perforation == nperf_total_);
|
||||
}
|
||||
|
||||
|
||||
|
@ -259,6 +259,9 @@ namespace Opm {
|
||||
// The depth difference between segment nodes and perforations
|
||||
Vector well_segment_perforation_depth_diffs_;
|
||||
|
||||
// The depth difference between the perforations and the perforation cells.
|
||||
Vector perf_cell_depth_diffs_;
|
||||
|
||||
// the average of the fluid densities in the grid block
|
||||
// which is used to calculate the hydrostatic head correction due to the depth difference of the perforation
|
||||
// and the cell center of the grid block
|
||||
|
@ -1079,43 +1079,7 @@ namespace Opm
|
||||
|
||||
well_perforation_cell_densities_ = Eigen::Map<const Vector>(rho_avg_perf.data(), nperf_total);
|
||||
|
||||
// We should put this in a global class
|
||||
std::vector<double> perf_depth_vec;
|
||||
perf_depth_vec.reserve(nperf_total);
|
||||
for (int w = 0; w < nw; ++w) {
|
||||
WellMultiSegmentConstPtr well = wells_multisegment_[w];
|
||||
const std::vector<double>& perf_depth_well = well->perfDepth();
|
||||
perf_depth_vec.insert(perf_depth_vec.end(), perf_depth_well.begin(), perf_depth_well.end());
|
||||
}
|
||||
assert(int(perf_depth_vec.size()) == nperf_total);
|
||||
const Vector perf_depth = Eigen::Map<Vector>(perf_depth_vec.data(), nperf_total);
|
||||
|
||||
const Vector perf_cell_depth_diffs = perf_depth - perfcelldepth;
|
||||
|
||||
well_perforation_cell_pressure_diffs_ = gravity_ * well_perforation_cell_densities_ * perf_cell_depth_diffs;
|
||||
|
||||
|
||||
// Calculating the depth difference between segment nodes and perforations.
|
||||
// TODO: should be put somewhere else for better clarity later
|
||||
well_segment_perforation_depth_diffs_ = Vector::Constant(nperf_total, -1e100);
|
||||
|
||||
int start_perforation = 0;
|
||||
for (int w = 0; w < nw; ++w) {
|
||||
WellMultiSegmentConstPtr well = wells_multisegment_[w];
|
||||
const int nseg = well->numberOfSegments();
|
||||
const int nperf = well->numberOfPerforations();
|
||||
const std::vector<std::vector<int>>& segment_perforations = well->segmentPerforations();
|
||||
for (int s = 0; s < nseg; ++s) {
|
||||
const int nperf_seg = segment_perforations[s].size();
|
||||
const double segment_depth = well->segmentDepth()[s];
|
||||
for (int perf = 0; perf < nperf_seg; ++perf) {
|
||||
const int perf_number = segment_perforations[s][perf] + start_perforation;
|
||||
well_segment_perforation_depth_diffs_[perf_number] = segment_depth - perf_depth[perf_number];
|
||||
}
|
||||
}
|
||||
start_perforation += nperf;
|
||||
}
|
||||
assert(start_perforation == nperf_total);
|
||||
well_perforation_cell_pressure_diffs_ = gravity_ * well_perforation_cell_densities_ * perf_cell_depth_diffs_;
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user