Skip to content

Commit

Permalink
python wrapper for new condensation rate stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
Nicholaswogan committed May 21, 2024
1 parent 9ad07b0 commit 89f9661
Show file tree
Hide file tree
Showing 9 changed files with 186 additions and 3 deletions.
40 changes: 40 additions & 0 deletions photochem/cython/AtomConservation.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -76,3 +76,43 @@ cdef class AtomConservation:
cdef double val
atom_pxd.atomconservation_factor_get(&self._ptr, &val)
return val

cdef class CondensationParameters:

cdef void *_ptr

def __cinit__(self):
self._ptr = NULL

property k_cond:
def __get__(self):
cdef double val
atom_pxd.condensationparameters_k_cond_get(&self._ptr, &val)
return val
def __set__(self, double val):
atom_pxd.condensationparameters_k_cond_set(&self._ptr, &val)

property k_evap:
def __get__(self):
cdef double val
atom_pxd.condensationparameters_k_evap_get(&self._ptr, &val)
return val
def __set__(self, double val):
atom_pxd.condensationparameters_k_evap_set(&self._ptr, &val)

property RHc:
def __get__(self):
cdef double val
atom_pxd.condensationparameters_rhc_get(&self._ptr, &val)
return val
def __set__(self, double val):
atom_pxd.condensationparameters_rhc_set(&self._ptr, &val)

property smooth_factor:
def __get__(self):
cdef double val
atom_pxd.condensationparameters_smooth_factor_get(&self._ptr, &val)
return val
def __set__(self, double val):
atom_pxd.condensationparameters_smooth_factor_set(&self._ptr, &val)

15 changes: 14 additions & 1 deletion photochem/cython/AtomConservation_pxd.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,17 @@ cdef extern void atomconservation_out_top_get(void *ptr, double *val)
cdef extern void atomconservation_out_rain_get(void *ptr, double *val)
cdef extern void atomconservation_out_other_get(void *ptr, double *val)
cdef extern void atomconservation_net_get(void *ptr, double *val)
cdef extern void atomconservation_factor_get(void *ptr, double *val)
cdef extern void atomconservation_factor_get(void *ptr, double *val)

# CondensationParameters
cdef extern void condensationparameters_k_cond_get(void *ptr, double *val)
cdef extern void condensationparameters_k_cond_set(void *ptr, double *val)

cdef extern void condensationparameters_k_evap_get(void *ptr, double *val)
cdef extern void condensationparameters_k_evap_set(void *ptr, double *val)

cdef extern void condensationparameters_rhc_get(void *ptr, double *val)
cdef extern void condensationparameters_rhc_set(void *ptr, double *val)

cdef extern void condensationparameters_smooth_factor_get(void *ptr, double *val)
cdef extern void condensationparameters_smooth_factor_set(void *ptr, double *val)
26 changes: 26 additions & 0 deletions photochem/cython/PhotochemVars.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,15 @@ cdef class PhotochemVars:
return val
def __set__(self, double val):
var_pxd.photochemvars_relative_humidity_set(&self._ptr, &val)

property H2O_cond_params:
"CondensationParameters. H2O condensation rate parameters."
def __get__(self):
cdef void *ptr1
var_pxd.photochemvars_h2o_cond_params_get(&self._ptr, &ptr1)
val = CondensationParameters()
val._ptr = ptr1
return val

property z:
"ndarray[double,dim=1], shape (nz). The altitude of the center of each atmopsheric layer (cm)"
Expand Down Expand Up @@ -105,6 +114,23 @@ cdef class PhotochemVars:

var_pxd.photochemvars_photon_flux_fcn_set(&self._ptr, fcn_c)

property cond_params:
"""list, shape (np). Parameters describing condensation and evaporation rates and
the RH needed for condensation.
"""
def __get__(self):
cdef int dim1
var_pxd.photochemvars_cond_params_get_size(&self._ptr, &dim1)
cdef void **arrp = <void **> malloc(dim1 * sizeof(void *))
var_pxd.photochemvars_cond_params_get(&self._ptr, &dim1, arrp)
arr1 = []
for i in range(dim1):
tmp = CondensationParameters()
tmp._ptr = arrp[i]
arr1.append(tmp)
free(arrp)
return arr1

property temperature:
"ndarray[double,dim=1], shape (nz). The temperature of each atmospheric layer (K)"
def __get__(self):
Expand Down
5 changes: 5 additions & 0 deletions photochem/cython/PhotochemVars_pxd.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,13 @@ cdef extern void photochemvars_trop_ind_get(void *ptr, int *val)
cdef extern void photochemvars_relative_humidity_get(void *ptr, double *val)
cdef extern void photochemvars_relative_humidity_set(void *ptr, double *val)

cdef extern void photochemvars_h2o_cond_params_get(void *ptr, void *ptr1)

cdef extern void photochemvars_photon_flux_fcn_set(void *ptr, time_dependent_flux_fcn fcn)

cdef extern void photochemvars_cond_params_get_size(void *ptr, int *dim1)
cdef extern void photochemvars_cond_params_get(void *ptr, int *dim1, void **ptr1)

cdef extern void photochemvars_temperature_get_size(void *ptr, int *dim1)
cdef extern void photochemvars_temperature_get(void *ptr, int *dim1, double *temperature)

Expand Down
1 change: 1 addition & 0 deletions photochem/cython/_photochem.pyx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from numpy cimport ndarray
from libcpp cimport bool
from libc.stdlib cimport malloc, free
from libc.stdint cimport uintptr_t
import numpy as np
import ctypes as ct
Expand Down
67 changes: 67 additions & 0 deletions photochem/fortran/AtomConservation_wrapper.f90
Original file line number Diff line number Diff line change
Expand Up @@ -100,3 +100,70 @@ subroutine atomconservation_factor_get(ptr, val) bind(c)
call c_f_pointer(ptr, con)
val = con%factor
end subroutine

! CondensationParameters

!~~ Getters and setters ~~!
subroutine condensationparameters_k_cond_get(ptr, val) bind(c)
type(c_ptr), intent(in) :: ptr
real(c_double), intent(out) :: val
type(CondensationParameters), pointer :: c
call c_f_pointer(ptr, c)
val = c%k_cond
end subroutine

subroutine condensationparameters_k_cond_set(ptr, val) bind(c)
type(c_ptr), intent(in) :: ptr
real(c_double), intent(in) :: val
type(CondensationParameters), pointer :: c
call c_f_pointer(ptr, c)
c%k_cond = val
end subroutine

subroutine condensationparameters_k_evap_get(ptr, val) bind(c)
type(c_ptr), intent(in) :: ptr
real(c_double), intent(out) :: val
type(CondensationParameters), pointer :: c
call c_f_pointer(ptr, c)
val = c%k_evap
end subroutine

subroutine condensationparameters_k_evap_set(ptr, val) bind(c)
type(c_ptr), intent(in) :: ptr
real(c_double), intent(in) :: val
type(CondensationParameters), pointer :: c
call c_f_pointer(ptr, c)
c%k_evap = val
end subroutine

subroutine condensationparameters_rhc_get(ptr, val) bind(c)
type(c_ptr), intent(in) :: ptr
real(c_double), intent(out) :: val
type(CondensationParameters), pointer :: c
call c_f_pointer(ptr, c)
val = c%RHc
end subroutine

subroutine condensationparameters_rhc_set(ptr, val) bind(c)
type(c_ptr), intent(in) :: ptr
real(c_double), intent(in) :: val
type(CondensationParameters), pointer :: c
call c_f_pointer(ptr, c)
c%RHc = val
end subroutine

subroutine condensationparameters_smooth_factor_get(ptr, val) bind(c)
type(c_ptr), intent(in) :: ptr
real(c_double), intent(out) :: val
type(CondensationParameters), pointer :: c
call c_f_pointer(ptr, c)
val = c%smooth_factor
end subroutine

subroutine condensationparameters_smooth_factor_set(ptr, val) bind(c)
type(c_ptr), intent(in) :: ptr
real(c_double), intent(in) :: val
type(CondensationParameters), pointer :: c
call c_f_pointer(ptr, c)
c%smooth_factor = val
end subroutine
30 changes: 30 additions & 0 deletions photochem/fortran/PhotochemVars_wrapper.f90
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,14 @@ subroutine photochemvars_relative_humidity_set(ptr, val) bind(c)
var%relative_humidity = val
end subroutine

subroutine photochemvars_h2o_cond_params_get(ptr, ptr1) bind(c)
type(c_ptr), intent(in) :: ptr
type(c_ptr), intent(out) :: ptr1
type(PhotochemVars), pointer :: var
call c_f_pointer(ptr, var)
ptr1 = c_loc(var%H2O_cond_params)
end subroutine

subroutine photochemvars_photon_flux_fcn_set(ptr, photon_flux_fcn_c) bind(c)
use photochem_types, only: time_dependent_flux_fcn
type(c_ptr), intent(in) :: ptr
Expand All @@ -116,6 +124,28 @@ subroutine photochemvars_photon_flux_fcn_set(ptr, photon_flux_fcn_c) bind(c)
var%photon_flux_fcn => photon_flux_fcn_f

end subroutine

subroutine photochemvars_cond_params_get_size(ptr, dim1) bind(c)
type(c_ptr), intent(in) :: ptr
integer(c_int), intent(out) :: dim1
type(PhotochemVars), pointer :: var
call c_f_pointer(ptr, var)
dim1 = size(var%cond_params,1)
end subroutine

subroutine photochemvars_cond_params_get(ptr, dim1, ptr1) bind(c)
type(c_ptr), intent(in) :: ptr
integer(c_int), intent(in) :: dim1
type(c_ptr), intent(out) :: ptr1(dim1)
integer :: i
type(CondensationParameters), pointer :: t1_p(:)
type(PhotochemVars), pointer :: var
call c_f_pointer(ptr, var)
t1_p => var%cond_params
do i = 1,dim1
ptr1(i) = c_loc(t1_p(i))
enddo
end subroutine

subroutine photochemvars_temperature_get_size(ptr, dim1) bind(c)
type(c_ptr), intent(in) :: ptr
Expand Down
1 change: 1 addition & 0 deletions photochem/fortran/photochem_c_api.f90
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ module photochem_c_api
use photochem_types, only: PhotochemVars
use photochem_types, only: PhotochemWrk, PhotochemWrkEvo
use photochem_types, only: AtomConservation, ProductionLoss
use photochem_types, only: CondensationParameters
use photochem, only: err_len
use photochem_const, only: s_str_len, m_str_len
implicit none
Expand Down
4 changes: 2 additions & 2 deletions src/photochem_types.f90
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ module photochem_types ! make a giant IO object

public :: PhotoSettings, SettingsBC
public :: PhotochemData, PhotochemVars, PhotochemWrk, PhotochemWrkEvo
public :: ProductionLoss, AtomConservation, ThermodynamicData
public :: ProductionLoss, AtomConservation, ThermodynamicData, CondensationParameters
public :: Reaction, Efficiencies, BaseRate, PhotolysisRate, PressDependentRate, MultiArrheniusRate
public :: ElementaryRate, ThreeBodyRate, FalloffRate, ProdLoss
public :: SundialsDataFinalizer
Expand Down Expand Up @@ -422,7 +422,7 @@ subroutine time_dependent_rate_fcn(tn, nz, rate)
integer :: trop_ind !! index of troposphere (only for fix_water_in_trop == true or gas_rainout == true)
logical :: use_manabe !! use manabe formula
real(dp) :: relative_humidity !! relative humidity if no manabe
type(CondensationParameters) :: H2O_cond_params !! H2O condesation rate parameters
type(CondensationParameters) :: H2O_cond_params !! H2O condensation rate parameters

! radiative transfer
real(dp), allocatable :: photon_flux(:) !! (nw) photon/cm^2/s in each wavelength bin hitting planet.
Expand Down

0 comments on commit 89f9661

Please sign in to comment.