From 89cefd8d953577129d024cd557379bfa7e389f4c Mon Sep 17 00:00:00 2001 From: Jose Eduardo Bueno Date: Wed, 30 Sep 2020 18:34:50 -0300 Subject: [PATCH] Fixed seg fault when there are only mswells --- .../linalg/bda/WellContributionsOCLContainer.cpp | 7 ++++--- .../linalg/bda/WellContributionsOCLContainer.hpp | 4 +++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/opm/simulators/linalg/bda/WellContributionsOCLContainer.cpp b/opm/simulators/linalg/bda/WellContributionsOCLContainer.cpp index b7e94141b..a0082e8f8 100644 --- a/opm/simulators/linalg/bda/WellContributionsOCLContainer.cpp +++ b/opm/simulators/linalg/bda/WellContributionsOCLContainer.cpp @@ -75,9 +75,9 @@ namespace bda } void WellContributionsOCLContainer::copy_to_gpu(Opm::WellContributions &wellContribs, int *toOrder_){ - if(num_std_wells > 0){ - toOrder.insert(toOrder.end(), toOrder_, toOrder_ + Nb); + toOrder.insert(toOrder.end(), toOrder_, toOrder_ + Nb); + if(num_std_wells > 0){ cl::Event event; std::vector events(7); queue->enqueueWriteBuffer(s.Cnnzs, CL_FALSE, 0, sizeof(double) * wellContribs.h_Cnnzs_ocl.size(), wellContribs.h_Cnnzs_ocl.data(), nullptr, &events[0]); @@ -159,10 +159,11 @@ namespace bda // actually apply MultisegmentWells for(auto well: *multisegments){ - well->setReordering(toOrder.data(), true); + well->setReordering(toOrder.data(), reorder); well->apply(x_msw.data(), y_msw.data()); } + // copy vector y from CPU to GPU queue->enqueueWriteBuffer(y, CL_FALSE, 0, sizeof(double) * N, y_msw.data(), nullptr, &event); event.wait(); diff --git a/opm/simulators/linalg/bda/WellContributionsOCLContainer.hpp b/opm/simulators/linalg/bda/WellContributionsOCLContainer.hpp index 1fbd4b2fa..847fd1ff0 100644 --- a/opm/simulators/linalg/bda/WellContributionsOCLContainer.hpp +++ b/opm/simulators/linalg/bda/WellContributionsOCLContainer.hpp @@ -31,11 +31,13 @@ namespace bda private: typedef std::vector mswVecT; + int N, Nb; unsigned int dim, dim_wells; unsigned int num_blocks = 0; unsigned int num_std_wells = 0; unsigned int num_ms_wells = 0; // number of MultisegmentWells in this object, must equal multisegments.size() - int N, Nb; + + bool reorder = true; std::vector toOrder; std::vector x_msw, y_msw; std::unique_ptr multisegments;