Skip to content

Commit a6a14fc

Browse files
committed
always use shared_ptr for ISweeper and ITransfers
1 parent 2e6f1ac commit a6a14fc

File tree

9 files changed

+66
-64
lines changed

9 files changed

+66
-64
lines changed

examples/advection_diffusion/serial_mlsdc.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ int main(int argc, char** argv)
3939
* (according to 'xrat').
4040
*/
4141
for (size_t l = 0; l < nlevs; l++) {
42-
auto nodes = compute_nodes<double>(nnodes, "gauss-lobatto");
43-
shared_ptr<VectorFactory<double>> factory = make_shared<VectorFactory<double>>(ndofs);
44-
AdvectionDiffusionSweeper<>* sweeper = new AdvectionDiffusionSweeper<>(ndofs);
45-
SpectralTransfer1D<>* transfer = new SpectralTransfer1D<>();
42+
auto nodes = compute_nodes<double>(nnodes, "gauss-lobatto");
43+
auto factory = make_shared<VectorFactory<double>>(ndofs);
44+
auto sweeper = make_shared<AdvectionDiffusionSweeper<>>(ndofs);
45+
auto transfer = make_shared<SpectralTransfer1D<>>();
4646

4747
sweeper->set_nodes(nodes);
4848
sweeper->set_factory(factory);
@@ -63,7 +63,7 @@ int main(int argc, char** argv)
6363
/*
6464
* set initial conditions on each level
6565
*/
66-
auto* sweeper = mlsdc.get_level<AdvectionDiffusionSweeper<>>(mlsdc.nlevels() - 1);
66+
auto sweeper = mlsdc.get_level<AdvectionDiffusionSweeper<>>(mlsdc.nlevels() - 1);
6767
auto q0 = sweeper->get_state(0);
6868
sweeper->exact(q0, 0.0);
6969

examples/advection_diffusion/serial_mlsdc_autobuild.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ int main(int argc, char** argv)
4747
*/
4848
auto build_level = [ndofs](size_t level) {
4949
auto factory = make_shared<VectorFactory<double>>(ndofs[level]);
50-
auto* sweeper = new AdvectionDiffusionSweeper<>(ndofs[level]);
51-
auto* transfer = new SpectralTransfer1D<>();
50+
auto sweeper = make_shared<AdvectionDiffusionSweeper<>>(ndofs[level]);
51+
auto transfer = make_shared<SpectralTransfer1D<>>();
5252

5353
return AutoBuildTuple<>(sweeper, transfer, factory);
5454
};
@@ -57,9 +57,9 @@ int main(int argc, char** argv)
5757
* the 'initial' function is called once for each level to set the
5858
* intial conditions.
5959
*/
60-
auto initial = [](EncapSweeper<>* sweeper, shared_ptr<Encapsulation<>> q0) {
61-
auto* ad = dynamic_cast<AdvectionDiffusionSweeper<>*>(sweeper);
62-
assert(ad != nullptr);
60+
auto initial = [](shared_ptr<EncapSweeper<>> sweeper, shared_ptr<Encapsulation<>> q0) {
61+
auto ad = dynamic_pointer_cast<AdvectionDiffusionSweeper<>>(sweeper);
62+
assert(ad);
6363
ad->exact(q0, 0.0);
6464
};
6565

examples/advection_diffusion/vanilla_sdc.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
* This example uses a vanilla SDC sweeper.
55
*/
66

7+
#include <memory>
8+
79
#include <fftw3.h>
810

911
#include <pfasst.hpp>
@@ -22,9 +24,9 @@ int main(int argc, char** argv)
2224
const size_t ndofs = 64;
2325
const size_t niters = 4;
2426

25-
auto nodes = pfasst::compute_nodes(nnodes, "gauss-lobatto");
27+
auto nodes = pfasst::compute_nodes(nnodes, "gauss-lobatto");
2628
auto factory = make_shared<pfasst::encap::VectorFactory<double>>(ndofs);
27-
auto* sweeper = new AdvectionDiffusionSweeper<>(ndofs);
29+
auto sweeper = make_shared<AdvectionDiffusionSweeper<>>(ndofs);
2830

2931
sweeper->set_nodes(nodes);
3032
sweeper->set_factory(factory);

include/pfasst/controller.hpp

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
namespace pfasst
1515
{
16-
1716
/**
1817
* base SDC/MLSDC/PFASST controller.
1918
* @tparam time time precision
@@ -44,30 +43,30 @@ namespace pfasst
4443
this->niters = niters;
4544
}
4645

47-
void add_level(ISweeper<time>* swpr, ITransfer<time>* trnsfr = NULL, bool coarse = true)
46+
void add_level(shared_ptr<ISweeper<time>> swpr, shared_ptr<ITransfer<time>> trnsfr = shared_ptr<ITransfer<time>>(nullptr), bool coarse = true)
4847
{
4948
if (coarse) {
50-
levels.push_front(shared_ptr<ISweeper<time>>(swpr));
51-
transfer.push_front(shared_ptr<ITransfer<time>>(trnsfr));
49+
levels.push_front(swpr);
50+
transfer.push_front(trnsfr);
5251
} else {
53-
levels.push_back(shared_ptr<ISweeper<time>>(swpr));
54-
transfer.push_back(shared_ptr<ITransfer<time>>(trnsfr));
52+
levels.push_back(swpr);
53+
transfer.push_back(trnsfr);
5554
}
5655
}
5756

5857
template<typename R = ISweeper<time>>
59-
R* get_level(size_t level)
58+
shared_ptr<R> get_level(size_t level)
6059
{
61-
R* r = dynamic_cast<R*>(levels[level].get());
62-
assert(r != nullptr);
60+
shared_ptr<R> r = dynamic_pointer_cast<R>(levels[level]);
61+
assert(r);
6362
return r;
6463
}
6564

6665
template<typename R = ITransfer<time>>
67-
R* get_transfer(size_t level)
66+
shared_ptr<R> get_transfer(size_t level)
6867
{
69-
R* r = dynamic_cast<R*>(transfer[level].get());
70-
assert(r != nullptr);
68+
shared_ptr<R> r = dynamic_pointer_cast<R>(transfer[level]);
69+
assert(r);
7170
return r;
7271
}
7372

@@ -94,27 +93,27 @@ namespace pfasst
9493
LevelIter(size_t level, Controller* ts) : ts(ts), level(level) {}
9594

9695
template<typename R = ISweeper<time>>
97-
R* current()
96+
shared_ptr<R> current()
9897
{
9998
return ts->template get_level<R>(level);
10099
}
101100
template<typename R = ISweeper<time>>
102-
R* fine()
101+
shared_ptr<R> fine()
103102
{
104103
return ts->template get_level<R>(level + 1);
105104
}
106105
template<typename R = ISweeper<time>>
107-
R* coarse()
106+
shared_ptr<R> coarse()
108107
{
109108
return ts->template get_level<R>(level - 1);
110109
}
111110
template<typename R = ITransfer<time>>
112-
R* transfer()
111+
shared_ptr<R> transfer()
113112
{
114113
return ts->template get_transfer<R>(level);
115114
}
116115

117-
ISweeper<time>* operator*() { return current(); }
116+
shared_ptr<ISweeper<time>> operator*() { return current(); }
118117
bool operator==(LevelIter i) { return level == i.level; }
119118
bool operator!=(LevelIter i) { return level != i.level; }
120119
bool operator<=(LevelIter i) { return level <= i.level; }

include/pfasst/encap/automagic.hpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#define _PFASST_ENCAP_AUTOMAGIC_HPP_
44

55
#include <tuple>
6+
#include <cassert>
67

78
#include "../quadrature.hpp"
89
#include "encap_sweeper.hpp"
@@ -15,8 +16,8 @@ namespace pfasst
1516
{
1617

1718
template<typename time = time_precision>
18-
using AutoBuildTuple = tuple<pfasst::encap::EncapSweeper<time>*,
19-
pfasst::ITransfer<time>*,
19+
using AutoBuildTuple = tuple<shared_ptr<pfasst::encap::EncapSweeper<time>>,
20+
shared_ptr<pfasst::ITransfer<time>>,
2021
shared_ptr<pfasst::encap::EncapFactory<time>>>;
2122

2223
template<typename ControllerT, typename BuildT, typename time = time_precision>
@@ -25,8 +26,8 @@ namespace pfasst
2526
for (size_t l = 0; l < nodes.size(); l++) {
2627
auto nds = pfasst::compute_nodes<time>(get<0>(nodes[l]), get<1>(nodes[l]));
2728
AutoBuildTuple<time> tpl = build(l);
28-
auto* sweeper = get<0>(tpl);
29-
auto* transfer = get<1>(tpl);
29+
auto sweeper = get<0>(tpl);
30+
auto transfer = get<1>(tpl);
3031
auto factory = get<2>(tpl);
3132
sweeper->set_nodes(nds);
3233
sweeper->set_factory(factory);
@@ -40,8 +41,8 @@ namespace pfasst
4041
c.setup();
4142
for (size_t l = 0; l < c.nlevels(); l++) {
4243
auto isweeper = c.get_level(l);
43-
auto* sweeper = dynamic_cast<pfasst::encap::EncapSweeper<time>*>(isweeper);
44-
assert(sweeper != nullptr);
44+
auto sweeper = dynamic_pointer_cast<pfasst::encap::EncapSweeper<time>>(isweeper);
45+
assert(sweeper);
4546
auto q0 = sweeper->get_state(0);
4647
initial(sweeper, q0);
4748
}

include/pfasst/encap/poly_interp.hpp

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,19 @@ namespace pfasst
2525
public:
2626
virtual ~PolyInterpMixin() { }
2727

28-
virtual void interpolate(ISweeper<time>* dst, const ISweeper<time>* src,
28+
virtual void interpolate(shared_ptr<ISweeper<time>> dst, shared_ptr<const ISweeper<time>> src,
2929
bool interp_delta_from_initial,
3030
bool interp_initial)
3131
{
32-
EncapSweeper<time>* fine = dynamic_cast<EncapSweeper<time>*>(dst);
33-
assert(fine != nullptr);
34-
const EncapSweeper<time>* crse = dynamic_cast<const EncapSweeper<time>*>(src);
35-
assert(crse != nullptr);
32+
shared_ptr<EncapSweeper<time>> fine = dynamic_pointer_cast<EncapSweeper<time>>(dst);
33+
assert(fine);
34+
shared_ptr<const EncapSweeper<time>> crse = dynamic_pointer_cast<const EncapSweeper<time>>(src);
35+
assert(crse);
3636

3737
this->interpolate(fine, crse, interp_delta_from_initial, interp_initial);
3838
}
3939

40-
virtual void interpolate(EncapSweeper<time>* fine, const EncapSweeper<time>* crse,
40+
virtual void interpolate(shared_ptr<EncapSweeper<time>> fine, shared_ptr<const EncapSweeper<time>> crse,
4141
bool interp_delta_from_initial,
4242
bool interp_initial)
4343
{
@@ -83,17 +83,17 @@ namespace pfasst
8383
for (size_t m = m0; m < nfine; m++) { fine->evaluate(m); }
8484
}
8585

86-
virtual void restrict(ISweeper<time>* dst, const ISweeper<time>* src, bool restrict_initial)
86+
virtual void restrict(shared_ptr<ISweeper<time>> dst, shared_ptr<const ISweeper<time>> src, bool restrict_initial)
8787
{
88-
EncapSweeper<time>* crse = dynamic_cast<EncapSweeper<time>*>(dst);
89-
assert(crse != nullptr);
90-
const EncapSweeper<time>* fine = dynamic_cast<const EncapSweeper<time>*>(src);
91-
assert(fine != nullptr);
88+
shared_ptr<EncapSweeper<time>> crse = dynamic_pointer_cast<EncapSweeper<time>>(dst);
89+
assert(crse);
90+
shared_ptr<const EncapSweeper<time>> fine = dynamic_pointer_cast<const EncapSweeper<time>>(src);
91+
assert(fine);
9292

9393
this->restrict(crse, fine, restrict_initial);
9494
}
9595

96-
virtual void restrict(EncapSweeper<time>* crse, const EncapSweeper<time>* fine, bool restrict_initial)
96+
virtual void restrict(shared_ptr<EncapSweeper<time>> crse, shared_ptr<const EncapSweeper<time>> fine, bool restrict_initial)
9797
{
9898
auto dnodes = crse->get_nodes();
9999
auto snodes = fine->get_nodes();
@@ -115,17 +115,17 @@ namespace pfasst
115115
for (size_t m = m0; m < ncrse; m++) { crse->evaluate(m); }
116116
}
117117

118-
virtual void fas(time dt, ISweeper<time>* dst, const ISweeper<time>* src)
118+
virtual void fas(time dt, shared_ptr<ISweeper<time>> dst, shared_ptr<const ISweeper<time>> src)
119119
{
120-
EncapSweeper<time>* crse = dynamic_cast<EncapSweeper<time>*>(dst);
121-
assert(crse != nullptr);
122-
const EncapSweeper<time>* fine = dynamic_cast<const EncapSweeper<time>*>(src);
123-
assert(fine != nullptr);
120+
shared_ptr<EncapSweeper<time>> crse = dynamic_pointer_cast<EncapSweeper<time>>(dst);
121+
assert(crse);
122+
shared_ptr<const EncapSweeper<time>> fine = dynamic_pointer_cast<const EncapSweeper<time>>(src);
123+
assert(fine);
124124

125125
this->fas(dt, crse, fine);
126126
}
127127

128-
virtual void fas(time dt, EncapSweeper<time>* crse, const EncapSweeper<time>* fine)
128+
virtual void fas(time dt, shared_ptr<EncapSweeper<time>> crse, shared_ptr<const EncapSweeper<time>> fine)
129129
{
130130
size_t ncrse = crse->get_nodes().size();
131131
assert(ncrse > 1);

include/pfasst/interfaces.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ namespace pfasst
128128
* @param[in] interp_initial
129129
* `true` if a delta for the initial condtion should also be computed (PFASST).
130130
*/
131-
virtual void interpolate(ISweeper<time>* dst, const ISweeper<time>* src,
131+
virtual void interpolate(shared_ptr<ISweeper<time>> dst, shared_ptr<const ISweeper<time>> src,
132132
bool interp_delta_from_initial = false,
133133
bool interp_initial = false) = 0;
134134

@@ -137,13 +137,13 @@ namespace pfasst
137137
* @param[in] restrict_initial
138138
* `true` if the initial condition should also be restricted.
139139
*/
140-
virtual void restrict(ISweeper<time>* dst, const ISweeper<time>* src,
140+
virtual void restrict(shared_ptr<ISweeper<time>> dst, shared_ptr<const ISweeper<time>> src,
141141
bool restrict_initial = false) = 0;
142142

143143
/**
144144
* compute FAS correction between the coarse and fine sweepers.
145145
*/
146-
virtual void fas(time dt, ISweeper<time>* dst, const ISweeper<time>* src) = 0;
146+
virtual void fas(time dt, shared_ptr<ISweeper<time>> dst, shared_ptr<const ISweeper<time>> src) = 0;
147147

148148
};
149149

include/pfasst/mlsdc.hpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ namespace pfasst
2727

2828
void perform_sweeps(LevelIter leviter, time t, time dt)
2929
{
30-
auto* sweeper = leviter.current();
30+
auto sweeper = leviter.current();
3131
for (size_t s = 0; s < nsweeps[leviter.level]; s++) {
3232
if (predict) {
3333
sweeper->predict(t, dt, initial & predict);
@@ -79,9 +79,9 @@ namespace pfasst
7979
*/
8080
LevelIter cycle_down(LevelIter leviter, time t, time dt)
8181
{
82-
auto* fine = leviter.current();
83-
auto* crse = leviter.coarse();
84-
auto* trns = leviter.transfer();
82+
auto fine = leviter.current();
83+
auto crse = leviter.coarse();
84+
auto trns = leviter.transfer();
8585

8686
perform_sweeps(leviter, t, dt);
8787

@@ -101,9 +101,9 @@ namespace pfasst
101101
*/
102102
LevelIter cycle_up(LevelIter leviter, time t, time dt)
103103
{
104-
auto* fine = leviter.current();
105-
auto* crse = leviter.coarse();
106-
auto* trns = leviter.transfer();
104+
auto fine = leviter.current();
105+
auto crse = leviter.coarse();
106+
auto trns = leviter.transfer();
107107

108108
trns->interpolate(fine, crse);
109109

include/pfasst/sdc.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace pfasst
1717

1818
void run()
1919
{
20-
auto* sweeper = this->get_level(0);
20+
auto sweeper = this->get_level(0);
2121

2222
for (size_t nstep = 0; nstep < this->nsteps; nstep++) {
2323
time t = nstep * this->dt;

0 commit comments

Comments
 (0)