Skip to content

Commit

Permalink
python wrapper for autodiff and version
Browse files Browse the repository at this point in the history
  • Loading branch information
Nicholaswogan committed Apr 3, 2024
1 parent 035437d commit 52944df
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 3 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION "3.14")
cmake_policy(SET CMP0148 OLD)
project(Photochem LANGUAGES Fortran C VERSION "0.4.7")
project(Photochem LANGUAGES Fortran C VERSION "0.5.0")

include(FortranCInterface)
FortranCInterface_VERIFY()
Expand Down
20 changes: 18 additions & 2 deletions photochem/cython/PhotochemVars.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,9 @@ cdef class PhotochemVars:
var_pxd.photochemvars_rtol_set(&self._ptr, &val)

property atol:
"double. Integration absolute tolerance."
"""double. Integration absolute tolerance. If autodiff == .true., then the model
works better when atol is smaller (e.g., atol = ~1.0e-18).
"""
def __get__(self):
cdef double val
var_pxd.photochemvars_atol_get(&self._ptr, &val)
Expand Down Expand Up @@ -252,7 +254,9 @@ cdef class PhotochemVars:
var_pxd.photochemvars_conv_min_mix_set(&self._ptr, &val)

property conv_longdy:
"double. Threshold normalized change in mixing ratios for converchecking check."
"""double. Threshold normalized change in mixing ratios for converchecking check.
A reasonable value is ~1.0e-2.
"""
def __get__(self):
cdef double val
var_pxd.photochemvars_conv_longdy_get(&self._ptr, &val)
Expand All @@ -271,7 +275,19 @@ cdef class PhotochemVars:
def __set__(self, double val):
var_pxd.photochemvars_conv_longdydt_set(&self._ptr, &val)

property autodiff:
"""bool. If True, then the chemistry terms of the Jacobian are computed uses
foward mode automatic differentiation.
"""
def __get__(self):
cdef bool val
var_pxd.photochemvars_autodiff_get(&self._ptr, &val)
return val
def __set__(self, bool val):
var_pxd.photochemvars_autodiff_set(&self._ptr, &val)

property epsj:
"double. Perturbation for finite difference Jacobian calculation, when autodiff == .false."
def __get__(self):
cdef double val
var_pxd.photochemvars_epsj_get(&self._ptr, &val)
Expand Down
3 changes: 3 additions & 0 deletions photochem/cython/PhotochemVars_pxd.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,9 @@ cdef extern void photochemvars_conv_longdy_set(void *ptr, double *val)
cdef extern void photochemvars_conv_longdydt_get(void *ptr, double *val)
cdef extern void photochemvars_conv_longdydt_set(void *ptr, double *val)

cdef extern void photochemvars_autodiff_get(void *ptr, bool *val)
cdef extern void photochemvars_autodiff_set(void *ptr, bool *val)

cdef extern void photochemvars_epsj_get(void *ptr, double *val)
cdef extern void photochemvars_epsj_set(void *ptr, double *val)

Expand Down
16 changes: 16 additions & 0 deletions photochem/fortran/PhotochemVars_wrapper.f90
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,22 @@ subroutine photochemvars_conv_longdydt_set(ptr, val) bind(c)
var%conv_longdydt = val
end subroutine

subroutine photochemvars_autodiff_get(ptr, val) bind(c)
type(c_ptr), intent(in) :: ptr
logical(c_bool), intent(out) :: val
type(PhotochemVars), pointer :: var
call c_f_pointer(ptr, var)
val = var%autodiff
end subroutine

subroutine photochemvars_autodiff_set(ptr, val) bind(c)
type(c_ptr), intent(in) :: ptr
logical(c_bool), intent(in) :: val
type(PhotochemVars), pointer :: var
call c_f_pointer(ptr, var)
var%autodiff = val
end subroutine

subroutine photochemvars_epsj_get(ptr, val) bind(c)
type(c_ptr), intent(in) :: ptr
real(c_double), intent(out) :: val
Expand Down

0 comments on commit 52944df

Please sign in to comment.