Skip to content

Commit 9cd7cb5

Browse files
jcurtis2slayoo
andauthored
AeroState::__deepcopy__(); shared_ptr semantics for AeroData and GasData within AeroParticle, AeroState and GasState (#170)
Co-authored-by: Sylwester Arabas <[email protected]>
1 parent 6f98414 commit 9cd7cb5

File tree

10 files changed

+446
-91
lines changed

10 files changed

+446
-91
lines changed

src/aero_particle.hpp

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,24 @@ extern "C" void f_aero_particle_solute_kappa(const void *aero_particle_ptr, cons
3030
namespace py = pybind11;
3131
struct AeroParticle {
3232
PMCResource ptr;
33-
const AeroData &aero_data;
33+
std::shared_ptr<AeroData> aero_data;
3434

35-
AeroParticle( const AeroData &aero_data, const std::valarray<double>&data) :
35+
AeroParticle(
36+
std::shared_ptr<AeroData> aero_data,
37+
const std::valarray<double>&data
38+
) :
3639
ptr(f_aero_particle_ctor, f_aero_particle_dtor),
3740
aero_data(aero_data)
3841
{
3942
int len = data.size();
40-
f_aero_particle_init(ptr.f_arg(), aero_data.ptr.f_arg(), begin(data), &len);
41-
if (size_t(len)!=AeroData::__len__(aero_data))
43+
f_aero_particle_init(ptr.f_arg(), aero_data->ptr.f_arg(), begin(data), &len);
44+
if (size_t(len) != AeroData::__len__(*aero_data))
4245
throw std::runtime_error("AeroData size mistmatch");
4346
}
4447

4548
static std::valarray<double> volumes(const AeroParticle &self)
4649
{
47-
int len = AeroData::__len__(self.aero_data);
50+
int len = AeroData::__len__(*self.aero_data);
4851
std::valarray<double> data(len);
4952
f_aero_particle_volumes(&self.ptr, begin(data), &len);
5053
return data;
@@ -64,56 +67,56 @@ struct AeroParticle {
6467

6568
static double dry_volume(const AeroParticle &self) {
6669
double vol;
67-
f_aero_particle_dry_volume(&self.ptr, &self.aero_data, &vol);
70+
f_aero_particle_dry_volume(&self.ptr, self.aero_data.get(), &vol);
6871
return vol;
6972
}
7073

7174
static double radius(const AeroParticle &self) {
7275
double radius;
73-
f_aero_particle_radius(&self.ptr, &self.aero_data, &radius);
76+
f_aero_particle_radius(&self.ptr, self.aero_data.get(), &radius);
7477
return radius;
7578
}
7679

7780
static double dry_radius(const AeroParticle &self) {
7881
double radius;
79-
f_aero_particle_dry_radius(&self.ptr, &self.aero_data, &radius);
82+
f_aero_particle_dry_radius(&self.ptr, self.aero_data.get(), &radius);
8083
return radius;
8184
}
8285

8386
static double diameter(const AeroParticle &self) {
8487
double diameter;
85-
f_aero_particle_diameter(&self.ptr, &self.aero_data, &diameter);
88+
f_aero_particle_diameter(&self.ptr, self.aero_data.get(), &diameter);
8689
return diameter;
8790
}
8891

8992
static double dry_diameter(const AeroParticle &self) {
9093
double diameter;
91-
f_aero_particle_dry_diameter(&self.ptr, &self.aero_data, &diameter);
94+
f_aero_particle_dry_diameter(&self.ptr, self.aero_data.get(), &diameter);
9295
return diameter;
9396
}
9497

9598
static double mass(const AeroParticle &self) {
9699
double mass;
97-
f_aero_particle_mass(&self.ptr, &self.aero_data, &mass);
100+
f_aero_particle_mass(&self.ptr, self.aero_data.get(), &mass);
98101
return mass;
99102
}
100103

101104
static double species_mass(const AeroParticle &self, const int &i_spec) {
102105
double mass;
103-
f_aero_particle_species_mass(&self.ptr, &i_spec, &self.aero_data, &mass);
106+
f_aero_particle_species_mass(&self.ptr, &i_spec, self.aero_data.get(), &mass);
104107
return mass;
105108
}
106109

107110
static std::valarray<double> species_masses(const AeroParticle &self) {
108-
int len = AeroData::__len__(self.aero_data);
111+
int len = AeroData::__len__(*self.aero_data);
109112
std::valarray<double> masses(len);
110-
f_aero_particle_species_masses(&self.ptr, &self.aero_data, &len, begin(masses));
113+
f_aero_particle_species_masses(&self.ptr, self.aero_data.get(), &len, begin(masses));
111114
return masses;
112115
}
113116

114117
static double solute_kappa(const AeroParticle &self) {
115118
double kappa;
116-
f_aero_particle_solute_kappa(&self.ptr, &self.aero_data, &kappa);
119+
f_aero_particle_solute_kappa(&self.ptr, self.aero_data.get(), &kappa);
117120
return kappa;
118121
}
119122

src/aero_state.F90

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,4 +265,15 @@ subroutine f_aero_state_bin_average_comp(ptr_c, bin_grid_ptr_c, &
265265

266266
end subroutine
267267

268+
subroutine f_aero_state_copy(ptr_c,ptr_new_c) bind(C)
269+
type(c_ptr) :: ptr_c, ptr_new_c
270+
type(aero_state_t), pointer :: ptr_f => null()
271+
type(aero_state_t), pointer :: ptr_new_f => null()
272+
273+
call c_f_pointer(ptr_c,ptr_f)
274+
call c_f_pointer(ptr_new_c, ptr_new_f)
275+
276+
ptr_new_f = ptr_f
277+
end subroutine
278+
268279
end module

0 commit comments

Comments
 (0)