From 89f96616f5ee854c042231e82224e303a7b32331 Mon Sep 17 00:00:00 2001 From: Nick Wogan Date: Tue, 21 May 2024 10:44:52 -0700 Subject: [PATCH] python wrapper for new condensation rate stuff --- photochem/cython/AtomConservation.pyx | 40 +++++++++++ photochem/cython/AtomConservation_pxd.pxd | 15 ++++- photochem/cython/PhotochemVars.pyx | 26 +++++++ photochem/cython/PhotochemVars_pxd.pxd | 5 ++ photochem/cython/_photochem.pyx | 1 + .../fortran/AtomConservation_wrapper.f90 | 67 +++++++++++++++++++ photochem/fortran/PhotochemVars_wrapper.f90 | 30 +++++++++ photochem/fortran/photochem_c_api.f90 | 1 + src/photochem_types.f90 | 4 +- 9 files changed, 186 insertions(+), 3 deletions(-) diff --git a/photochem/cython/AtomConservation.pyx b/photochem/cython/AtomConservation.pyx index dd543e6..9cea5ce 100644 --- a/photochem/cython/AtomConservation.pyx +++ b/photochem/cython/AtomConservation.pyx @@ -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) + \ No newline at end of file diff --git a/photochem/cython/AtomConservation_pxd.pxd b/photochem/cython/AtomConservation_pxd.pxd index ab65471..1dac306 100644 --- a/photochem/cython/AtomConservation_pxd.pxd +++ b/photochem/cython/AtomConservation_pxd.pxd @@ -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) \ No newline at end of file +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) \ No newline at end of file diff --git a/photochem/cython/PhotochemVars.pyx b/photochem/cython/PhotochemVars.pyx index b829772..c486fef 100644 --- a/photochem/cython/PhotochemVars.pyx +++ b/photochem/cython/PhotochemVars.pyx @@ -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)" @@ -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 = 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): diff --git a/photochem/cython/PhotochemVars_pxd.pxd b/photochem/cython/PhotochemVars_pxd.pxd index 27fc73b..ea24afc 100644 --- a/photochem/cython/PhotochemVars_pxd.pxd +++ b/photochem/cython/PhotochemVars_pxd.pxd @@ -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) diff --git a/photochem/cython/_photochem.pyx b/photochem/cython/_photochem.pyx index d118129..3e070a7 100644 --- a/photochem/cython/_photochem.pyx +++ b/photochem/cython/_photochem.pyx @@ -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 diff --git a/photochem/fortran/AtomConservation_wrapper.f90 b/photochem/fortran/AtomConservation_wrapper.f90 index 774812b..52d8302 100644 --- a/photochem/fortran/AtomConservation_wrapper.f90 +++ b/photochem/fortran/AtomConservation_wrapper.f90 @@ -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 diff --git a/photochem/fortran/PhotochemVars_wrapper.f90 b/photochem/fortran/PhotochemVars_wrapper.f90 index 65fa883..69131b5 100644 --- a/photochem/fortran/PhotochemVars_wrapper.f90 +++ b/photochem/fortran/PhotochemVars_wrapper.f90 @@ -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 @@ -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 diff --git a/photochem/fortran/photochem_c_api.f90 b/photochem/fortran/photochem_c_api.f90 index aea3af5..453c035 100644 --- a/photochem/fortran/photochem_c_api.f90 +++ b/photochem/fortran/photochem_c_api.f90 @@ -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 diff --git a/src/photochem_types.f90 b/src/photochem_types.f90 index 032c90c..5cc94fc 100644 --- a/src/photochem_types.f90 +++ b/src/photochem_types.f90 @@ -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 @@ -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.