From 2b3b266bc2eae44093d85b3935bc3fbd64db3c6f Mon Sep 17 00:00:00 2001 From: Nick Wogan Date: Sun, 5 May 2024 09:07:35 -0700 Subject: [PATCH] Python wrapper. void* passed by value. Prevent memory leaks and errors. --- equilibrate/cython/ChemEquiAnalysis_pxd.pxd | 2 +- equilibrate/cython/_equilibrate.pyx | 98 +++++++++++++-------- equilibrate/fortran/equilibrate_c_api.f90 | 64 +++++++------- 3 files changed, 93 insertions(+), 71 deletions(-) diff --git a/equilibrate/cython/ChemEquiAnalysis_pxd.pxd b/equilibrate/cython/ChemEquiAnalysis_pxd.pxd index 7cc53a1..e1b40d1 100644 --- a/equilibrate/cython/ChemEquiAnalysis_pxd.pxd +++ b/equilibrate/cython/ChemEquiAnalysis_pxd.pxd @@ -3,7 +3,7 @@ cdef extern from "": pass # Allocate and destroy -cdef extern void allocate_chemequianalysis(void *ptr); +cdef extern void *allocate_chemequianalysis(); cdef extern void deallocate_chemequianalysis(void *ptr); # Wrappers for functions diff --git a/equilibrate/cython/_equilibrate.pyx b/equilibrate/cython/_equilibrate.pyx index 60df8af..31a4059 100644 --- a/equilibrate/cython/_equilibrate.pyx +++ b/equilibrate/cython/_equilibrate.pyx @@ -1,6 +1,7 @@ from numpy cimport ndarray, uint8_t from libc.stdint cimport uintptr_t from libcpp cimport bool as cbool +from cpython.object cimport PyObject_GenericSetAttr cimport ChemEquiAnalysis_pxd as cea_pxd import numpy as np import ctypes as ct @@ -8,10 +9,28 @@ import os DEF S_STR_LEN = 20; DEF ERR_LEN = 1024; - + cdef class ChemEquiAnalysis: cdef void *_ptr + cdef cbool _init_called + + def __cinit__(self, thermofile = None, atoms = None, species = None): + self._init_called = False + self._ptr = cea_pxd.allocate_chemequianalysis() + + def __dealloc__(self): + cea_pxd.deallocate_chemequianalysis(self._ptr) + + def __getattribute__(self, name): + if not self._init_called: + raise EquilibrateException('The "__init__" method of ChemEquiAnalysis has not been called.') + return super().__getattribute__(name) + + def __setattr__(self, name, value): + if not self._init_called: + raise EquilibrateException('The "__init__" method of ChemEquiAnalysis has not been called.') + PyObject_GenericSetAttr(self, name, value) def __init__(self, thermofile = None, atoms = None, species = None): """Initializes the chemical equilibrium solver given an input thermodynamic file. @@ -33,8 +52,8 @@ cdef class ChemEquiAnalysis: species : list, optional Names of species to include. """ - # Allocate memory - cea_pxd.allocate_chemequianalysis(&self._ptr) + + self._init_called = True # convert strings to char cdef bytes thermofile_b = pystring2cstring(thermofile) @@ -61,16 +80,13 @@ cdef class ChemEquiAnalysis: raise EquilibrateException('"atoms" and "species" can not both be inputs.') # Initialize - cea_pxd.chemequianalysis_create_wrapper(&self._ptr, thermofile_c, + cea_pxd.chemequianalysis_create_wrapper(self._ptr, thermofile_c, &atoms_present, &atoms_dim, atoms_c.data, &species_present, &species_dim, species_c.data, err) if len(err.strip()) > 0: raise EquilibrateException(err.decode("utf-8").strip()) - def __dealloc__(self): - cea_pxd.deallocate_chemequianalysis(&self._ptr) - def solve(self, double P, double T, molfracs_atoms = None, molfracs_species = None): """Computes chemical equilibrium given input atom or species mole fractions. If successful, then the equilibrium composition will be stored in a number @@ -79,13 +95,19 @@ cdef class ChemEquiAnalysis: Parameters ---------- P : double - Pressure in bars + Pressure in bars T : double - Temperature in Kelvin + Temperature in Kelvin molfracs_atoms : ndarray[double,ndim=1], optional - Atom mole fractions in the same order and length as self.atoms_names. + Atom mole fractions in the same order and length as self.atoms_names. molfracs_species : ndarray[double,ndim=1], optional - Species mole fractions in the same order and length as self.species_names. + Species mole fractions in the same order and length as self.species_names. + + Results + ------- + converged : bool + If true, then the calculation successfully achieved chemical equilibrium + to within the specified tolerances. """ cdef ndarray[double, ndim=1] molfracs_atoms_ = np.empty(1,dtype=np.double) @@ -105,7 +127,7 @@ cdef class ChemEquiAnalysis: cdef cbool converged cdef char err[ERR_LEN+1] - cea_pxd.chemequianalysis_solve_wrapper(&self._ptr, &P, &T, + cea_pxd.chemequianalysis_solve_wrapper(self._ptr, &P, &T, &molfracs_atoms_present, &molfracs_atoms_dim, molfracs_atoms_.data, &molfracs_species_present, &molfracs_species_dim, molfracs_species_.data, &converged, err) @@ -119,109 +141,109 @@ cdef class ChemEquiAnalysis: "List. Names of atoms" def __get__(self): cdef int dim1 - cea_pxd.chemequianalysis_atoms_names_get_size(&self._ptr, &dim1) + cea_pxd.chemequianalysis_atoms_names_get_size(self._ptr, &dim1) cdef ndarray arr_c = np.empty(dim1*S_STR_LEN + 1, 'S1') - cea_pxd.chemequianalysis_atoms_names_get(&self._ptr, &dim1, arr_c.data) + cea_pxd.chemequianalysis_atoms_names_get(self._ptr, &dim1, arr_c.data) return c2stringarr(arr_c, S_STR_LEN, dim1) property species_names: "List. Names of species" def __get__(self): cdef int dim1 - cea_pxd.chemequianalysis_species_names_get_size(&self._ptr, &dim1) + cea_pxd.chemequianalysis_species_names_get_size(self._ptr, &dim1) cdef ndarray arr_c = np.empty(dim1*S_STR_LEN + 1, 'S1') - cea_pxd.chemequianalysis_species_names_get(&self._ptr, &dim1, arr_c.data) + cea_pxd.chemequianalysis_species_names_get(self._ptr, &dim1, arr_c.data) return c2stringarr(arr_c, S_STR_LEN, dim1) property gas_names: "List. Names of gases" def __get__(self): cdef int dim1 - cea_pxd.chemequianalysis_gas_names_get_size(&self._ptr, &dim1) + cea_pxd.chemequianalysis_gas_names_get_size(self._ptr, &dim1) cdef ndarray arr_c = np.empty(dim1*S_STR_LEN + 1, 'S1') - cea_pxd.chemequianalysis_gas_names_get(&self._ptr, &dim1, arr_c.data) + cea_pxd.chemequianalysis_gas_names_get(self._ptr, &dim1, arr_c.data) return c2stringarr(arr_c, S_STR_LEN, dim1) property condensate_names: "List. Names of condensates" def __get__(self): cdef int dim1 - cea_pxd.chemequianalysis_condensate_names_get_size(&self._ptr, &dim1) + cea_pxd.chemequianalysis_condensate_names_get_size(self._ptr, &dim1) cdef ndarray arr_c = np.empty(dim1*S_STR_LEN + 1, 'S1') - cea_pxd.chemequianalysis_condensate_names_get(&self._ptr, &dim1, arr_c.data) + cea_pxd.chemequianalysis_condensate_names_get(self._ptr, &dim1, arr_c.data) return c2stringarr(arr_c, S_STR_LEN, dim1) property molfracs_atoms: "ndarray[double,ndim=1]. Mole fractions of each atom." def __get__(self): cdef int dim1 - cea_pxd.chemequianalysis_molfracs_atoms_get_size(&self._ptr, &dim1) + cea_pxd.chemequianalysis_molfracs_atoms_get_size(self._ptr, &dim1) cdef ndarray arr = np.empty(dim1, np.double) - cea_pxd.chemequianalysis_molfracs_atoms_get(&self._ptr, &dim1, arr.data) + cea_pxd.chemequianalysis_molfracs_atoms_get(self._ptr, &dim1, arr.data) return arr property molfracs_species: "ndarray[double,ndim=1]. Mole fractions of each species." def __get__(self): cdef int dim1 - cea_pxd.chemequianalysis_molfracs_species_get_size(&self._ptr, &dim1) + cea_pxd.chemequianalysis_molfracs_species_get_size(self._ptr, &dim1) cdef ndarray arr = np.empty(dim1, np.double) - cea_pxd.chemequianalysis_molfracs_species_get(&self._ptr, &dim1, arr.data) + cea_pxd.chemequianalysis_molfracs_species_get(self._ptr, &dim1, arr.data) return arr property massfracs_species: "ndarray[double,ndim=1]. Mass fractions of each species." def __get__(self): cdef int dim1 - cea_pxd.chemequianalysis_massfracs_species_get_size(&self._ptr, &dim1) + cea_pxd.chemequianalysis_massfracs_species_get_size(self._ptr, &dim1) cdef ndarray arr = np.empty(dim1, np.double) - cea_pxd.chemequianalysis_massfracs_species_get(&self._ptr, &dim1, arr.data) + cea_pxd.chemequianalysis_massfracs_species_get(self._ptr, &dim1, arr.data) return arr property molfracs_atoms_gas: "ndarray[double,ndim=1]. Mole fractions of atoms in gas phase." def __get__(self): cdef int dim1 - cea_pxd.chemequianalysis_molfracs_atoms_gas_get_size(&self._ptr, &dim1) + cea_pxd.chemequianalysis_molfracs_atoms_gas_get_size(self._ptr, &dim1) cdef ndarray arr = np.empty(dim1, np.double) - cea_pxd.chemequianalysis_molfracs_atoms_gas_get(&self._ptr, &dim1, arr.data) + cea_pxd.chemequianalysis_molfracs_atoms_gas_get(self._ptr, &dim1, arr.data) return arr property molfracs_species_gas: "ndarray[double,ndim=1]. Mole fractions of species in gas phase." def __get__(self): cdef int dim1 - cea_pxd.chemequianalysis_molfracs_species_gas_get_size(&self._ptr, &dim1) + cea_pxd.chemequianalysis_molfracs_species_gas_get_size(self._ptr, &dim1) cdef ndarray arr = np.empty(dim1, np.double) - cea_pxd.chemequianalysis_molfracs_species_gas_get(&self._ptr, &dim1, arr.data) + cea_pxd.chemequianalysis_molfracs_species_gas_get(self._ptr, &dim1, arr.data) return arr property molfracs_atoms_condensate: "ndarray[double,ndim=1]. Mole fractions of atoms in condensed phase." def __get__(self): cdef int dim1 - cea_pxd.chemequianalysis_molfracs_atoms_condensate_get_size(&self._ptr, &dim1) + cea_pxd.chemequianalysis_molfracs_atoms_condensate_get_size(self._ptr, &dim1) cdef ndarray arr = np.empty(dim1, np.double) - cea_pxd.chemequianalysis_molfracs_atoms_condensate_get(&self._ptr, &dim1, arr.data) + cea_pxd.chemequianalysis_molfracs_atoms_condensate_get(self._ptr, &dim1, arr.data) return arr property molfracs_species_condensate: "ndarray[double,ndim=1]. Mole fractions of species in condensed phase." def __get__(self): cdef int dim1 - cea_pxd.chemequianalysis_molfracs_species_condensate_get_size(&self._ptr, &dim1) + cea_pxd.chemequianalysis_molfracs_species_condensate_get_size(self._ptr, &dim1) cdef ndarray arr = np.empty(dim1, np.double) - cea_pxd.chemequianalysis_molfracs_species_condensate_get(&self._ptr, &dim1, arr.data) + cea_pxd.chemequianalysis_molfracs_species_condensate_get(self._ptr, &dim1, arr.data) return arr property verbose: "bool. Determines amount of printing." def __get__(self): cdef cbool val - cea_pxd.chemequianalysis_verbose_get(&self._ptr, &val) + cea_pxd.chemequianalysis_verbose_get(self._ptr, &val) return val def __set__(self, cbool val): - cea_pxd.chemequianalysis_verbose_set(&self._ptr, &val) + cea_pxd.chemequianalysis_verbose_set(self._ptr, &val) property mass_tol: """float. Degree to which mass will be balanced. Gordon & McBride's default @@ -229,10 +251,10 @@ cdef class ChemEquiAnalysis: """ def __get__(self): cdef double val - cea_pxd.chemequianalysis_mass_tol_get(&self._ptr, &val) + cea_pxd.chemequianalysis_mass_tol_get(self._ptr, &val) return val def __set__(self, double val): - cea_pxd.chemequianalysis_mass_tol_set(&self._ptr, &val) + cea_pxd.chemequianalysis_mass_tol_set(self._ptr, &val) # version cdef extern void equilibrate_version_get(char *version_c) diff --git a/equilibrate/fortran/equilibrate_c_api.f90 b/equilibrate/fortran/equilibrate_c_api.f90 index 40a37ad..492b554 100644 --- a/equilibrate/fortran/equilibrate_c_api.f90 +++ b/equilibrate/fortran/equilibrate_c_api.f90 @@ -15,17 +15,17 @@ subroutine equilibrate_version_get(version_c) bind(c) !~~ Allocator and destroyer ~~! - subroutine allocate_chemequianalysis(ptr) bind(c) + function allocate_chemequianalysis() result(ptr) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(out) :: ptr + type(c_ptr) :: ptr type(ChemEquiAnalysis), pointer :: cea allocate(cea) ptr = c_loc(cea) - end subroutine + end function subroutine deallocate_chemequianalysis(ptr) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr type(ChemEquiAnalysis), pointer :: cea call c_f_pointer(ptr, cea) deallocate(cea) @@ -37,7 +37,7 @@ subroutine chemequianalysis_create_wrapper(ptr, thermofile, & atoms_present, atoms_dim, atoms, & species_present, species_dim, species, err) bind(c) use equilibrate, only: ChemEquiAnalysis, s_str_len - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr character(kind=c_char), intent(in) :: thermofile(*) logical(c_bool), intent(in) :: atoms_present integer(c_int), intent(in) :: atoms_dim @@ -96,7 +96,7 @@ subroutine chemequianalysis_solve_wrapper(ptr, P, T, & molfracs_species_present, molfracs_species_dim, molfracs_species, & converged, err) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr real(c_double), intent(in) :: P real(c_double), intent(in) :: T logical(c_bool), intent(in) :: molfracs_atoms_present @@ -134,7 +134,7 @@ subroutine chemequianalysis_solve_wrapper(ptr, P, T, & subroutine chemequianalysis_atoms_names_get_size(ptr, dim1) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(out) :: dim1 type(ChemEquiAnalysis), pointer :: cea call c_f_pointer(ptr, cea) @@ -143,7 +143,7 @@ subroutine chemequianalysis_atoms_names_get_size(ptr, dim1) bind(c) subroutine chemequianalysis_atoms_names_get(ptr, dim1, arr) bind(c) use equilibrate, only: ChemEquiAnalysis, s_str_len - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(in) :: dim1 character(kind=c_char), intent(out) :: arr(dim1*s_str_len+1) type(ChemEquiAnalysis), pointer :: cea @@ -163,7 +163,7 @@ subroutine chemequianalysis_atoms_names_get(ptr, dim1, arr) bind(c) subroutine chemequianalysis_species_names_get_size(ptr, dim1) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(out) :: dim1 type(ChemEquiAnalysis), pointer :: cea call c_f_pointer(ptr, cea) @@ -172,7 +172,7 @@ subroutine chemequianalysis_species_names_get_size(ptr, dim1) bind(c) subroutine chemequianalysis_species_names_get(ptr, dim1, arr) bind(c) use equilibrate, only: ChemEquiAnalysis, s_str_len - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(in) :: dim1 character(kind=c_char), intent(out) :: arr(dim1*s_str_len+1) type(ChemEquiAnalysis), pointer :: cea @@ -192,7 +192,7 @@ subroutine chemequianalysis_species_names_get(ptr, dim1, arr) bind(c) subroutine chemequianalysis_gas_names_get_size(ptr, dim1) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(out) :: dim1 type(ChemEquiAnalysis), pointer :: cea call c_f_pointer(ptr, cea) @@ -201,7 +201,7 @@ subroutine chemequianalysis_gas_names_get_size(ptr, dim1) bind(c) subroutine chemequianalysis_gas_names_get(ptr, dim1, arr) bind(c) use equilibrate, only: ChemEquiAnalysis, s_str_len - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(in) :: dim1 character(kind=c_char), intent(out) :: arr(dim1*s_str_len+1) type(ChemEquiAnalysis), pointer :: cea @@ -221,7 +221,7 @@ subroutine chemequianalysis_gas_names_get(ptr, dim1, arr) bind(c) subroutine chemequianalysis_condensate_names_get_size(ptr, dim1) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(out) :: dim1 type(ChemEquiAnalysis), pointer :: cea call c_f_pointer(ptr, cea) @@ -230,7 +230,7 @@ subroutine chemequianalysis_condensate_names_get_size(ptr, dim1) bind(c) subroutine chemequianalysis_condensate_names_get(ptr, dim1, arr) bind(c) use equilibrate, only: ChemEquiAnalysis, s_str_len - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(in) :: dim1 character(kind=c_char), intent(out) :: arr(dim1*s_str_len+1) type(ChemEquiAnalysis), pointer :: cea @@ -250,7 +250,7 @@ subroutine chemequianalysis_condensate_names_get(ptr, dim1, arr) bind(c) subroutine chemequianalysis_molfracs_atoms_get_size(ptr, dim1) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(out) :: dim1 type(ChemEquiAnalysis), pointer :: cea call c_f_pointer(ptr, cea) @@ -259,7 +259,7 @@ subroutine chemequianalysis_molfracs_atoms_get_size(ptr, dim1) bind(c) subroutine chemequianalysis_molfracs_atoms_get(ptr, dim1, arr) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(in) :: dim1 real(c_double), intent(out) :: arr(dim1) type(ChemEquiAnalysis), pointer :: cea @@ -269,7 +269,7 @@ subroutine chemequianalysis_molfracs_atoms_get(ptr, dim1, arr) bind(c) subroutine chemequianalysis_molfracs_species_get_size(ptr, dim1) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(out) :: dim1 type(ChemEquiAnalysis), pointer :: cea call c_f_pointer(ptr, cea) @@ -278,7 +278,7 @@ subroutine chemequianalysis_molfracs_species_get_size(ptr, dim1) bind(c) subroutine chemequianalysis_molfracs_species_get(ptr, dim1, arr) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(in) :: dim1 real(c_double), intent(out) :: arr(dim1) type(ChemEquiAnalysis), pointer :: cea @@ -288,7 +288,7 @@ subroutine chemequianalysis_molfracs_species_get(ptr, dim1, arr) bind(c) subroutine chemequianalysis_massfracs_species_get_size(ptr, dim1) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(out) :: dim1 type(ChemEquiAnalysis), pointer :: cea call c_f_pointer(ptr, cea) @@ -297,7 +297,7 @@ subroutine chemequianalysis_massfracs_species_get_size(ptr, dim1) bind(c) subroutine chemequianalysis_massfracs_species_get(ptr, dim1, arr) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(in) :: dim1 real(c_double), intent(out) :: arr(dim1) type(ChemEquiAnalysis), pointer :: cea @@ -307,7 +307,7 @@ subroutine chemequianalysis_massfracs_species_get(ptr, dim1, arr) bind(c) subroutine chemequianalysis_molfracs_atoms_gas_get_size(ptr, dim1) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(out) :: dim1 type(ChemEquiAnalysis), pointer :: cea call c_f_pointer(ptr, cea) @@ -316,7 +316,7 @@ subroutine chemequianalysis_molfracs_atoms_gas_get_size(ptr, dim1) bind(c) subroutine chemequianalysis_molfracs_atoms_gas_get(ptr, dim1, arr) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(in) :: dim1 real(c_double), intent(out) :: arr(dim1) type(ChemEquiAnalysis), pointer :: cea @@ -326,7 +326,7 @@ subroutine chemequianalysis_molfracs_atoms_gas_get(ptr, dim1, arr) bind(c) subroutine chemequianalysis_molfracs_species_gas_get_size(ptr, dim1) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(out) :: dim1 type(ChemEquiAnalysis), pointer :: cea call c_f_pointer(ptr, cea) @@ -335,7 +335,7 @@ subroutine chemequianalysis_molfracs_species_gas_get_size(ptr, dim1) bind(c) subroutine chemequianalysis_molfracs_species_gas_get(ptr, dim1, arr) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(in) :: dim1 real(c_double), intent(out) :: arr(dim1) type(ChemEquiAnalysis), pointer :: cea @@ -345,7 +345,7 @@ subroutine chemequianalysis_molfracs_species_gas_get(ptr, dim1, arr) bind(c) subroutine chemequianalysis_molfracs_atoms_condensate_get_size(ptr, dim1) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(out) :: dim1 type(ChemEquiAnalysis), pointer :: cea call c_f_pointer(ptr, cea) @@ -354,7 +354,7 @@ subroutine chemequianalysis_molfracs_atoms_condensate_get_size(ptr, dim1) bind(c subroutine chemequianalysis_molfracs_atoms_condensate_get(ptr, dim1, arr) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(in) :: dim1 real(c_double), intent(out) :: arr(dim1) type(ChemEquiAnalysis), pointer :: cea @@ -364,7 +364,7 @@ subroutine chemequianalysis_molfracs_atoms_condensate_get(ptr, dim1, arr) bind(c subroutine chemequianalysis_molfracs_species_condensate_get_size(ptr, dim1) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(out) :: dim1 type(ChemEquiAnalysis), pointer :: cea call c_f_pointer(ptr, cea) @@ -373,7 +373,7 @@ subroutine chemequianalysis_molfracs_species_condensate_get_size(ptr, dim1) bind subroutine chemequianalysis_molfracs_species_condensate_get(ptr, dim1, arr) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr integer(c_int), intent(in) :: dim1 real(c_double), intent(out) :: arr(dim1) type(ChemEquiAnalysis), pointer :: cea @@ -383,7 +383,7 @@ subroutine chemequianalysis_molfracs_species_condensate_get(ptr, dim1, arr) bind subroutine chemequianalysis_verbose_get(ptr, val) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr logical(c_bool), intent(out) :: val type(ChemEquiAnalysis), pointer :: cea call c_f_pointer(ptr, cea) @@ -392,7 +392,7 @@ subroutine chemequianalysis_verbose_get(ptr, val) bind(c) subroutine chemequianalysis_verbose_set(ptr, val) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr logical(c_bool), intent(in) :: val type(ChemEquiAnalysis), pointer :: cea call c_f_pointer(ptr, cea) @@ -401,7 +401,7 @@ subroutine chemequianalysis_verbose_set(ptr, val) bind(c) subroutine chemequianalysis_mass_tol_get(ptr, val) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr real(c_double), intent(out) :: val type(ChemEquiAnalysis), pointer :: cea call c_f_pointer(ptr, cea) @@ -410,7 +410,7 @@ subroutine chemequianalysis_mass_tol_get(ptr, val) bind(c) subroutine chemequianalysis_mass_tol_set(ptr, val) bind(c) use equilibrate, only: ChemEquiAnalysis - type(c_ptr), intent(in) :: ptr + type(c_ptr), value, intent(in) :: ptr real(c_double), intent(in) :: val type(ChemEquiAnalysis), pointer :: cea call c_f_pointer(ptr, cea)