File tree Expand file tree Collapse file tree 4 files changed +129
-1
lines changed Expand file tree Collapse file tree 4 files changed +129
-1
lines changed Original file line number Diff line number Diff line change @@ -196,6 +196,26 @@ PYBIND11_MODULE(_PyPartMC, m) {
196196        " Return the least power-of-2 that is at least equal to n." 
197197    );
198198
199+     m.def (
200+         " sphere_vol2rad"  , &sphere_vol2rad, py::return_value_policy::copy,
201+         " Convert mass-equivalent volume (m^3) to geometric radius (m) for spherical particles." 
202+     );
203+ 
204+     m.def (
205+         " rad2diam"  , &rad2diam, py::return_value_policy::copy,
206+         " Convert radius (m) to diameter (m)." 
207+     );
208+ 
209+     m.def (
210+         " sphere_rad2vol"  , &sphere_rad2vol, py::return_value_policy::copy,
211+         " Convert geometric radius (m) to mass-equivalent volume for spherical particles." 
212+     );
213+ 
214+     m.def (
215+         " diam2rad"  , &diam2rad, py::return_value_policy::copy,
216+         " Convert diameter (m) to radius (m)." 
217+     );
218+ 
199219    m.attr (" __version__"  ) = MACRO_STRINGIFY (VERSION_INFO);
200220
201221    m.attr (" __all__"  ) = py::make_tuple (
@@ -212,6 +232,10 @@ PYBIND11_MODULE(_PyPartMC, m) {
212232        " run_part"  ,
213233        " pow2_above"  ,
214234        " histogram_1d"  ,
215-         " histogram_2d" 
235+         " histogram_2d"  ,
236+         " sphere_vol2rad"  ,
237+         " rad2diam"  ,
238+         " sphere_rad2vol"  ,
239+         " diam2rad" 
216240    );
217241}
Original file line number Diff line number Diff line change @@ -19,4 +19,36 @@ subroutine py_pow2_above(n, res) bind(C)
1919   res =  pow2_above(n)
2020end  subroutine 
2121
22+ subroutine  f_sphere_vol2rad (v , rad ) bind(C)
23+    real (c_double), intent (in ) ::  v
24+    real (c_double), intent (out ) ::  rad
25+ 
26+    rad =  sphere_vol2rad(v)
27+ 
28+ end  subroutine 
29+ 
30+ subroutine  f_rad2diam (rad , d ) bind(C)
31+    real (c_double), intent (in ) ::  rad
32+    real (c_double), intent (out ) ::  d
33+ 
34+    d =  rad2diam(rad)
35+ 
36+ end  subroutine 
37+ 
38+ subroutine  f_sphere_rad2vol (rad , v ) bind(C)
39+    real (c_double), intent (in ) ::  rad
40+    real (c_double), intent (out ) ::  v
41+ 
42+    v =  sphere_rad2vol(rad)
43+ 
44+ end  subroutine 
45+ 
46+ subroutine  f_diam2rad (d , rad ) bind(C)
47+    real (c_double), intent (in ) ::  d
48+    real (c_double), intent (out ) ::  rad
49+ 
50+    rad =  diam2rad(d)
51+ 
52+ end  subroutine 
53+ 
2254end module 
Original file line number Diff line number Diff line change 77#pragma  once
88
99extern  " C"   void  py_pow2_above (int *, int *);
10+ extern  " C"   void  f_sphere_vol2rad (const  double *, double *);
11+ extern  " C"   void  f_rad2diam (const  double *, double *);
12+ extern  " C"   void  f_sphere_rad2vol (const  double *, double *);
13+ extern  " C"   void  f_diam2rad (const  double *, double *);
1014
1115auto  pow2_above (int  n) {
1216    int  res;
1317    py_pow2_above (&n, &res);
1418    return  res;
1519}
1620
21+ double  sphere_vol2rad (double  v) {
22+     double  rad;
23+     f_sphere_vol2rad (&v, &rad);
24+     return  rad;
25+ }
26+ 
27+ double  rad2diam (double  rad) {
28+     double  d;
29+     f_rad2diam (&rad, &d);
30+     return   d;
31+ }
32+ 
33+ double  sphere_rad2vol (double  rad) {
34+     double  v;
35+     f_sphere_rad2vol (&rad, &v);
36+     return  v;
37+ }
38+ 
39+ double  diam2rad (double  d) {
40+     double  rad;
41+     f_diam2rad (&d, &rad);
42+     return  rad;
43+ }
44+ 
1745extern  " C"   double  py_deg2rad (double );
1846
Original file line number Diff line number Diff line change 44# Authors: https://github.com/open-atmos/PyPartMC/graphs/contributors                              # 
55#################################################################################################### 
66
7+ import  numpy  as  np 
78import  PyPartMC  as  ppmc 
89
910
@@ -23,3 +24,46 @@ def test_pow2_above():
2324    def  test_deg2rad ():
2425        pass 
2526
27+     @staticmethod  
28+     def  test_sphere_vol2rad ():
29+         # arrange 
30+         arg  =  (4 / 3 )* np .pi * (1e-6 )** 3 
31+ 
32+         # act 
33+         rad  =  ppmc .sphere_vol2rad (arg )
34+ 
35+         # assert 
36+         np .testing .assert_almost_equal (1e-6 , rad )
37+ 
38+     @staticmethod  
39+     def  test_rad2diam ():
40+         # arrange 
41+         arg  =  0.5e-6 
42+ 
43+         # act 
44+         diam  =  ppmc .rad2diam (arg )
45+ 
46+         # assert 
47+         assert  diam  ==  2 * arg 
48+ 
49+     @staticmethod  
50+     def  test_sphere_rad2vol ():
51+         # arrange 
52+         arg  =  1e-6 
53+ 
54+         # act 
55+         vol  =  ppmc .sphere_rad2vol (arg )
56+ 
57+         # assert 
58+         np .testing .assert_almost_equal (vol , (4 / 3 )* np .pi * (arg )** 3 )
59+ 
60+     @staticmethod  
61+     def  test_diam2rad ():
62+         # arrange 
63+         arg  =  1e-6 
64+ 
65+         # act 
66+         rad  =  ppmc .diam2rad (arg )
67+ 
68+         # assert 
69+         assert  rad  ==  arg / 2 
    
 
   
 
     
   
   
          
     
  
    
     
 
    
      
     
 
     
    You can’t perform that action at this time.
  
 
    
  
     
    
      
        
     
 
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments