Added smart pointers

This commit is contained in:
Jose Eduardo Bueno 2020-09-30 17:31:35 -03:00
parent 3a680f728e
commit 7aad035bcf
3 changed files with 21 additions and 24 deletions

View File

@ -43,22 +43,13 @@ WellContributions::WellContributions(std::string gpu_mode){
WellContributions::~WellContributions()
{
#if HAVE_CUDA
// delete MultisegmentWellContributions
for (auto ms : multisegments) {
delete ms;
}
multisegments.clear();
#if HAVE_OPENCL
h_Cnnzs_ocl.clear();
h_Dnnzs_ocl.clear();
h_Bnnzs_ocl.clear();
h_Ccols_ocl.clear();
h_Bcols_ocl.clear();
h_val_pointers_ocl.clear();
#endif
#if HAVE_CUDA
if(cuda_gpu){
freeCudaMemory(); // should come before 'delete[] h_x'
}

View File

@ -30,6 +30,18 @@ namespace bda
using Opm::OpmLog;
using Dune::Timer;
WellContributionsOCLContainer::WellContributionsOCLContainer(){
multisegments.reset(new mswVecT());
}
WellContributionsOCLContainer::~WellContributionsOCLContainer(){
if(num_ms_wells > 0){
for (auto ms : *multisegments) {
delete ms;
}
}
}
void WellContributionsOCLContainer::init(Opm::WellContributions &wellContribs, int N_, int Nb_){
N = N_;
Nb = Nb_;
@ -79,8 +91,8 @@ namespace bda
}
if(!wellContribs.multisegments.empty()){
multisegments = std::move(wellContribs.multisegments);
num_ms_wells = multisegments.size();
multisegments = std::move(std::make_unique<mswVecT>(wellContribs.multisegments));
num_ms_wells = multisegments->size();
x_msw.reserve(N);
y_msw.reserve(N);
}
@ -104,7 +116,7 @@ namespace bda
}
if(!wellContribs.multisegments.empty()){
multisegments = std::move(wellContribs.multisegments);
multisegments = std::move(std::make_unique<mswVecT>(wellContribs.multisegments));
}
}
@ -146,7 +158,7 @@ namespace bda
event.waitForEvents(events);
// actually apply MultisegmentWells
for(Opm::MultisegmentWellContribution *well: multisegments){
for(auto well: *multisegments){
well->setReordering(toOrder.data(), true);
well->apply(x_msw.data(), y_msw.data());
}
@ -165,12 +177,4 @@ namespace bda
applyMSWells(x, y);
}
}
WellContributionsOCLContainer::~WellContributionsOCLContainer(){
if(num_ms_wells > 0){
for (auto ms : multisegments) {
delete ms;
}
}
}
} // end namespace bda

View File

@ -29,6 +29,8 @@ namespace bda
class WellContributionsOCLContainer
{
private:
typedef std::vector<Opm::MultisegmentWellContribution*> mswVecT;
unsigned int dim, dim_wells;
unsigned int num_blocks = 0;
unsigned int num_std_wells = 0;
@ -36,7 +38,7 @@ namespace bda
int N, Nb;
std::vector<int> toOrder;
std::vector<double> x_msw, y_msw;
std::vector<Opm::MultisegmentWellContribution*> multisegments;
std::unique_ptr<mswVecT> multisegments;
typedef struct {
cl::Buffer Cnnzs, Dnnzs, Bnnzs;
@ -57,7 +59,7 @@ namespace bda
void applyMSWells(cl::Buffer& x, cl::Buffer& y);
public:
WellContributionsOCLContainer() {};
WellContributionsOCLContainer();
~WellContributionsOCLContainer();
void apply(cl::Buffer& x, cl::Buffer& y);