python_fortran_bridge.F90 Source File


This file depends on

sourcefile~~python_fortran_bridge.f90~~EfferentGraph sourcefile~python_fortran_bridge.f90 python_fortran_bridge.F90 sourcefile~base_base.f90 Base_Base.F90 sourcefile~python_fortran_bridge.f90->sourcefile~base_base.f90 sourcefile~esmfl_mod.f90 ESMFL_Mod.F90 sourcefile~python_fortran_bridge.f90->sourcefile~esmfl_mod.f90 sourcefile~mapl_generic.f90 MAPL_Generic.F90 sourcefile~python_fortran_bridge.f90->sourcefile~mapl_generic.f90 sourcefile~maplshared.f90 MaplShared.F90 sourcefile~python_fortran_bridge.f90->sourcefile~maplshared.f90

Source Code

#include "MAPL_Generic.h"
#include "MAPL_Exceptions.h"
#include "MAPL_ErrLogMain.h"

module mapl_python_fortran_bridge
    
    use ESMFL_Mod
    use ESMF
    use MAPL_BaseMod
    use MAPL_GenericMod
    use MaplShared
    use iso_c_binding

    implicit NONE
    
    private
    public :: MAPLPy_ESMF_AttributeGet_1D_int
    public :: MAPLPy_ESMF_MethodExecute
    public :: MAPLpy_GetPointer_via_ESMFAttr
    public :: MAPLpy_GetPointer_2D
    public :: MAPLpy_GetPointer_3D
    public :: MAPLpy_GetResource_Bool
    public :: MAPLpy_GetResource_Float
    ! public :: MAPLpy_GetResource_Double ! No MAPL_GetResource for int 64?
    public :: MAPLpy_GetResource_Int32
    ! public :: MAPLpy_GetResource_Int64 ! No MAPL_GetResource for int 64?
    public :: MAPLpy_ESMF_TimeIntervalGet
    public :: MAPLpy_Associated

    character(len=ESMF_MAXSTR) :: IAm
    integer :: STATUS
    integer :: RC  ! return code
    character(len=ESMF_MAXSTR), TARGET :: F90_STRING_BUFFER

    CONTAINS

    function MAPLPy_ESMF_AttributeGet_1D_int(esmf_state_c_ptr, name_c_ptr, name_len) result(return_value) bind(c, name="MAPLPy_ESMF_AttributeGet_1D_int")
        ! Read in STATE
        type(c_ptr), intent(in), value :: esmf_state_c_ptr
        type(ESMF_State), pointer :: state

        ! Read in name
        type(c_ptr), intent(in), value :: name_c_ptr
        integer(c_int), intent(in), value :: name_len
        character(len=name_len,kind=c_char), pointer :: varname

        ! Return value
        integer :: return_value

        ! Turn the C string into a Fortran string
        call c_f_pointer(name_c_ptr, varname)

        ! Turn the ESMF State C pointer to a Fortran pointer
        call c_f_pointer(esmf_state_c_ptr, state)

        ! Call function
        call ESMF_AttributeGet(state, name=varname, value=return_value, RC=STATUS)
        VERIFY_(STATUS)
    
    end function MAPLPy_ESMF_AttributeGet_1D_int

    subroutine MAPLPy_ESMF_MethodExecute(esmf_state_c_ptr, label_c_ptr, label_len) bind(c, name="MAPLPy_ESMF_MethodExecute")
        ! Read in STATE
        type(c_ptr), intent(in), value :: esmf_state_c_ptr
        type(ESMF_State), pointer :: state

        ! Read in name
        type(c_ptr), intent(in), value :: label_c_ptr
        integer(c_int), intent(in), value :: label_len
        character(len=label_len,kind=c_char), pointer :: label

        ! Turn the C string into a Fortran string
        call c_f_pointer(label_c_ptr, label)

        ! Turn the ESMF State C pointer to a Fortran pointer
        call c_f_pointer(esmf_state_c_ptr, state)

        call ESMF_MethodExecute(state, label=label, RC=STATUS)
        VERIFY_(STATUS)

    end subroutine MAPLPy_ESMF_MethodExecute

    function MAPLpy_GetPointer_via_ESMFAttr(esmf_state_c_ptr, name_c_ptr, name_len) result(c_data_ptr) bind(c, name="MAPLpy_GetPointer_via_ESMFAttr")
        ! Read in STATE
        type(c_ptr), intent(in), value :: esmf_state_c_ptr
        type(ESMF_State), pointer :: state

        ! Read in name
        type(c_ptr), intent(in), value :: name_c_ptr
        integer(c_int), intent(in), value :: name_len
        character(len=name_len,kind=c_char), pointer :: name

        ! Results
        character(len=ESMF_MAXSTR) :: field_name_from_esmf
        real, pointer, dimension(:,:,:) :: f_ptr
        type(c_ptr) :: c_data_ptr

        ! Turn the C string into a Fortran string
        call c_f_pointer(name_c_ptr, name)

        ! Turn the ESMF State C pointer to a Fortran pointer
        call c_f_pointer(esmf_state_c_ptr, state)        

        call ESMF_AttributeGet(state, name=name, value=field_name_from_esmf, RC=STATUS)
        VERIFY_(STATUS)
        call MAPL_GetPointer(state, f_ptr, trim(field_name_from_esmf), RC=STATUS)
        VERIFY_(STATUS)
        c_data_ptr=c_loc(f_ptr)
    
    end function    

    function MAPLpy_GetPointer_2D(esmf_state_c_ptr, name_c_ptr, name_len, alloc) result(c_data_ptr) bind(c, name="MAPLpy_GetPointer_2D")
        ! Read in STATE
        type(c_ptr), intent(in), value :: esmf_state_c_ptr
        type(ESMF_State), pointer :: state

        ! Read in name
        type(c_ptr), intent(in), value :: name_c_ptr
        integer(c_int), intent(in), value :: name_len
        character(len=name_len,kind=c_char), pointer :: name
        logical(c_bool), intent(in), value :: alloc

        ! Results
        real, pointer, dimension(:,:) :: f_ptr
        type(c_ptr) :: c_data_ptr

        ! Turn the C string into a Fortran string
        call c_f_pointer(name_c_ptr, name)

        ! Turn the ESMF State C pointer to a Fortran pointer
        call c_f_pointer(esmf_state_c_ptr, state)        
        
        call MAPL_GetPointer(state, f_ptr, trim(name), alloc=logical(alloc), RC=STATUS)
        VERIFY_(STATUS)
        ! if (associated(f_ptr)) then
        c_data_ptr=c_loc(f_ptr)
        ! endif

    end function

    function MAPLpy_GetPointer_2D_associated(esmf_state_c_ptr, name_c_ptr, name_len, alloc) result(is_associated) bind(c, name="MAPLpy_GetPointer_2D_associated")
        ! Read in STATE
        type(c_ptr), intent(in), value :: esmf_state_c_ptr
        type(ESMF_State), pointer :: state

        ! Read in name
        type(c_ptr), intent(in), value :: name_c_ptr
        integer(c_int), intent(in), value :: name_len
        character(len=name_len,kind=c_char), pointer :: name
        logical(c_bool), intent(in), value :: alloc

        ! Results
        real, pointer, dimension(:,:) :: f_ptr
        logical(kind=c_bool):: is_associated

        ! Turn the C string into a Fortran string
        call c_f_pointer(name_c_ptr, name)

        ! Turn the ESMF State C pointer to a Fortran pointer
        call c_f_pointer(esmf_state_c_ptr, state)        
        
        call MAPL_GetPointer(state, f_ptr, trim(name), alloc=logical(alloc), RC=STATUS)
        VERIFY_(STATUS)
        is_associated = associated(f_ptr)
    
    end function

    function MAPLpy_GetPointer_3D(esmf_state_c_ptr, name_c_ptr, name_len, alloc) result(c_data_ptr) bind(c, name="MAPLpy_GetPointer_3D")
        ! Read in STATE
        type(c_ptr), intent(in), value :: esmf_state_c_ptr
        type(ESMF_State), pointer :: state

        ! Read in name
        type(c_ptr), intent(in), value :: name_c_ptr
        integer(c_int), intent(in), value :: name_len
        character(len=name_len,kind=c_char), pointer :: name
        logical(c_bool), intent(in), value :: alloc

        ! Results
        real, pointer, dimension(:,:,:) :: f_ptr
        type(c_ptr) :: c_data_ptr

        ! Turn the C string into a Fortran string
        call c_f_pointer(name_c_ptr, name)

        ! Turn the ESMF State C pointer to a Fortran pointer
        call c_f_pointer(esmf_state_c_ptr, state)    

        call MAPL_GetPointer(state, f_ptr, trim(name), alloc=logical(alloc), RC=STATUS)
        VERIFY_(STATUS)

        c_data_ptr=c_loc(f_ptr)
    
    end function

    function MAPLpy_GetPointer_3D_associated(esmf_state_c_ptr, name_c_ptr, name_len, alloc) result(is_associated) bind(c, name="MAPLpy_GetPointer_3D_associated")
        ! Read in STATE
        type(c_ptr), intent(in), value :: esmf_state_c_ptr
        type(ESMF_State), pointer :: state

        ! Read in name
        type(c_ptr), intent(in), value :: name_c_ptr
        integer(c_int), intent(in), value :: name_len
        character(len=name_len,kind=c_char), pointer :: name
        logical(c_bool), intent(in), value :: alloc

        ! Results
        real, pointer, dimension(:,:,:) :: f_ptr
        logical(kind=c_bool):: is_associated

        ! Turn the C string into a Fortran string
        call c_f_pointer(name_c_ptr, name)

        ! Turn the ESMF State C pointer to a Fortran pointer
        call c_f_pointer(esmf_state_c_ptr, state)        
        
        call MAPL_GetPointer(state, f_ptr, trim(name), alloc=logical(alloc), RC=STATUS)
        VERIFY_(STATUS)
        is_associated = associated(f_ptr)
    
    end function

    function MAPLpy_Associated(pointer_to_test) result(result) bind(c, name="MAPLpy_Associated")

        type(c_ptr), intent(in), value :: pointer_to_test
        type(ESMF_TimeInterval), pointer :: state
        logical(c_bool) :: result

        real, pointer :: f_ptr

        call c_f_pointer(pointer_to_test, f_ptr)
        result = associated(f_ptr)

    end function

    function MAPLpy_GetResource_Float(state_c_ptr, name_c_ptr, name_len, default) result(result) bind(c, name="MAPLpy_GetResource_Float")
        ! Read in STATE
        type(c_ptr), intent(in), value :: state_c_ptr
        type(MAPL_MetaComp), pointer :: state

        ! Read in name
        type(c_ptr), intent(in), value :: name_c_ptr
        integer(c_int), intent(in), value :: name_len
        character(len=name_len,kind=c_char), pointer :: name
        real(c_float), intent(in), value :: default

        ! Results & local
        real(c_float) :: result
        real(kind=4) :: local_r, local_d

        ! Make pointer & string fortran from C
        call c_f_pointer(name_c_ptr, name)
        call c_f_pointer(state_c_ptr, state)        

        ! Use fortran type & cast back to C types
        local_d = default
        call MAPL_GetResource(state, local_r, label=trim(name), default=local_d, RC=STATUS)
        VERIFY_(STATUS)
        result = local_r
    end function

    function MAPLpy_GetResource_Bool(mapl_metacomp_c_ptr, name_c_ptr, name_len, default) result(result) bind(c, name="MAPLpy_GetResource_Bool")
        ! Read in STATE
        type(c_ptr), intent(in), value :: mapl_metacomp_c_ptr
        type(MAPL_MetaComp), pointer :: state

        ! Read in name
        type(c_ptr), intent(in), value :: name_c_ptr
        integer(c_int), intent(in), value :: name_len
        character(len=name_len,kind=c_char), pointer :: name
        logical(c_bool), intent(in), value :: default

        ! Results
        logical(c_bool) :: result
        logical :: local_r, local_d

        ! Turn the C string into a Fortran string
        call c_f_pointer(name_c_ptr, name)

        ! Turn the ESMF State C pointer to a Fortran pointer
        call c_f_pointer(mapl_metacomp_c_ptr, state)        

        local_d = default
        call MAPL_GetResource(state, local_r, label=trim(name), default=local_d, RC=STATUS)
        VERIFY_(STATUS)
        result = local_r
    
    end function

    function MAPLpy_GetResource_Int32(state_c_ptr, name_c_ptr, name_len, default) result(result) bind(c, name="MAPLpy_GetResource_Int32")
        ! Read in STATE
        type(c_ptr), intent(in), value :: state_c_ptr
        type(MAPL_MetaComp), pointer :: state

        ! Read in name
        type(c_ptr), intent(in), value :: name_c_ptr
        integer(c_int), intent(in), value :: name_len
        character(len=name_len,kind=c_char), pointer :: name
        integer(C_INT32_T), intent(in), value :: default

        ! Results
        integer(C_INT32_T) :: result
        integer(kind=4) :: local_r, local_d

        ! Make pointer & string fortran from C
        call c_f_pointer(name_c_ptr, name)
        call c_f_pointer(state_c_ptr, state)              

        local_d = default
        call MAPL_GetResource(state, local_r, label=trim(name), default=local_d, RC=STATUS)
        VERIFY_(STATUS)
        result = local_r
    
    end function

    ! function MAPLpy_GetResource_Int64(state_c_ptr, name_c_ptr, name_len, default) result(result) bind(c, name="MAPLpy_GetResource_Int64")
    !     ! Read in STATE
    !     type(c_ptr), intent(in), value :: state_c_ptr
    !     type(ESMF_State), pointer :: state

    !     ! Read in name
    !     type(c_ptr), intent(in), value :: name_c_ptr
    !     integer(c_int), intent(in), value :: name_len
    !     character(len=name_len,kind=c_char), pointer :: name
    !     logical(c_bool), intent(in), value :: default

    !     ! Results
    !     integer(C_INT64_T) :: result

    !     ! Turn the C string into a Fortran string
    !     call c_f_pointer(name_c_ptr, name)

    !     ! Turn the ESMF State C pointer to a Fortran pointer
    !     call c_f_pointer(state_c_ptr, state)        

    !     call MAPL_GetResource(state, result, label=trim(name), default=logical(default))
    
    ! end function

    ! function MAPLpy_GetResource_Double(state_c_ptr, name_c_ptr, name_len, default) result(result) bind(c, name="MAPLpy_GetResource_Double")
    !     ! Read in STATE
    !     type(c_ptr), intent(in), value :: state_c_ptr
    !     type(ESMF_State), pointer :: state

    !     ! Read in name
    !     type(c_ptr), intent(in), value :: name_c_ptr
    !     integer(c_int), intent(in), value :: name_len
    !     character(len=name_len,kind=c_char), pointer :: name
    !     logical(c_bool), intent(in), value :: default

    !     ! Results
    !     real(c_double) :: result

    !     ! Turn the C string into a Fortran string
    !     call c_f_pointer(name_c_ptr, name)

    !     ! Turn the ESMF State C pointer to a Fortran pointer
    !     call c_f_pointer(state_c_ptr, state)        

    !     call MAPL_GetResource(state, result, label=trim(name), default=logical(default))
    
    ! end function

    function MAPLpy_ESMF_TimeIntervalGet(time_state_c_ptr) result(result) bind(c, name="MAPLpy_ESMF_TimeIntervalGet")
        ! Read in STATE
        type(c_ptr), intent(in), value :: time_state_c_ptr
        type(ESMF_TimeInterval), pointer :: state

        ! Results
        real(c_double) :: result

        ! Turn the ESMF State C pointer to a Fortran pointer
        call c_f_pointer(time_state_c_ptr, state)        

        call ESMF_TimeIntervalGet(state, S_R8=result)
    
    end function MAPLpy_ESMF_TimeIntervalGet

    function MAPLpy_ESMF_GridCompGetName(c_grid_comp) result(c_string) bind(c, name="MAPLpy_ESMF_GridCompGetName")
        
        type(c_ptr), intent(in), value     :: c_grid_comp

        type(ESMF_GridComp), pointer       :: f90_state
        type(c_ptr)                        :: c_string

        call c_f_pointer(c_grid_comp, f90_state)

        call ESMF_GridCompGet(f90_state, name=F90_STRING_BUFFER, RC=STATUS)
        c_string = c_loc(F90_STRING_BUFFER)

    end function MAPLpy_ESMF_GridCompGetName

    function MAPLPy_MAPL_GetIM(c_mapl_state) result(result) bind(c, name="MAPLPy_MAPL_GetIM")
        ! Read in STATE
        type(c_ptr), intent(in), value :: c_mapl_state
        type(MAPL_MetaComp), pointer :: state

        ! Results
        integer(C_INT32_T) :: result
        integer(kind=4) :: local_r

        ! Make pointer & string fortran from C
        call c_f_pointer(c_mapl_state, state)              

        call MAPL_Get(state, IM=local_r, RC=STATUS)
        print*, "MAPL_GetIM", result

        VERIFY_(STATUS)
        result = local_r
    
    end function

    function MAPLPy_MAPL_GetJM(c_mapl_state) result(result) bind(c, name="MAPLPy_MAPL_GetJM")
        ! Read in STATE
        type(c_ptr), intent(in), value :: c_mapl_state
        type(MAPL_MetaComp), pointer :: state

        ! Results
        integer(C_INT32_T) :: result
        integer(kind=4) :: local_r

        ! Make pointer & string fortran from C
        call c_f_pointer(c_mapl_state, state)              

        call MAPL_Get(state, JM=local_r, RC=STATUS)

        VERIFY_(STATUS)
        result = local_r
    
    end function

    function MAPLPy_MAPL_GetLM(c_mapl_state) result(result) bind(c, name="MAPLPy_MAPL_GetLM")
        ! Read in STATE
        type(c_ptr), intent(in), value :: c_mapl_state
        type(MAPL_MetaComp), pointer :: state

        ! Results
        integer(C_INT32_T) :: result
        integer(kind=4) :: local_r

        ! Make pointer & string fortran from C
        call c_f_pointer(c_mapl_state, state)              

        call MAPL_Get(state, LM=local_r, RC=STATUS)

        VERIFY_(STATUS)
        result = local_r
    
    end function

    function MAPLPy_MAPL_GetNX(c_mapl_state) result(result) bind(c, name="MAPLPy_MAPL_GetNX")
        ! Read in STATE
        type(c_ptr), intent(in), value :: c_mapl_state
        type(MAPL_MetaComp), pointer :: state

        ! Results
        integer(C_INT32_T) :: result
        integer(kind=4) :: local_r

        ! Make pointer & string fortran from C
        call c_f_pointer(c_mapl_state, state)              

        call MAPL_Get(state, NX=local_r, RC=STATUS)

        VERIFY_(STATUS)
        result = local_r
    
    end function

    function MAPLPy_MAPL_GetNY(c_mapl_state) result(result) bind(c, name="MAPLPy_MAPL_GetNY")
        ! Read in STATE
        type(c_ptr), intent(in), value :: c_mapl_state
        type(MAPL_MetaComp), pointer :: state

        ! Results
        integer(C_INT32_T) :: result
        integer(kind=4) :: local_r

        ! Make pointer & string fortran from C
        call c_f_pointer(c_mapl_state, state)              

        call MAPL_Get(state, NY=local_r, RC=STATUS)

        VERIFY_(STATUS)
        result = local_r
    
    end function

end module mapl_python_fortran_bridge