OOPS
variables_mod.F90
Go to the documentation of this file.
1 !
2 ! (C) Copyright 2019 UCAR
3 !
4 ! This software is licensed under the terms of the Apache Licence Version 2.0
5 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6 
7 !> Fortran interface to Variables
8 
10 use iso_c_binding, only: c_ptr
11 implicit none
12 
13 public :: oops_variables
14 integer, parameter, private :: maxvarlen = 100
15 
17 private
18  type(c_ptr) :: ptr
19 contains
20  procedure, private :: push_back_string
21  procedure, private :: push_back_vector
22 
23  generic, public :: push_back => push_back_string, push_back_vector
24 
25  procedure, public :: nvars
26  procedure, public :: variable
27  procedure, public :: varlist
28 
29  procedure, public :: has
30 end type
31 
32 interface oops_variables
33  module procedure ctor_from_ptr
34 end interface
35 
36 private
37 
38 #include "oops/base/variables_interface.f"
39 
40 !-------------------------------------------------------------------------------
41 contains
42 !-------------------------------------------------------------------------------
43 
44 function ctor_from_ptr(ptr) result(this)
45  type(oops_variables) :: this
46  type(c_ptr), intent(in) :: ptr
47 
48  this%ptr = ptr
49 end function ctor_from_ptr
50 
51 !-------------------------------------------------------------------------------
52 
53 subroutine push_back_string(this, varname)
54  use iso_c_binding, only: c_ptr, c_char
55  use string_f_c_mod
56  implicit none
57  class(oops_variables), intent(in) :: this
58  character(*), intent(in) :: varname
59 
60  character(kind=c_char,len=1), allocatable :: c_vname(:)
61 
62  call f_c_string(trim(varname), c_vname)
63  call c_variables_push_back(this%ptr, c_vname)
64  deallocate(c_vname)
65 
66 end subroutine push_back_string
67 
68 !-------------------------------------------------------------------------------
69 
70 subroutine push_back_vector(this, varnames)
71  use iso_c_binding, only: c_ptr, c_char
72  use string_f_c_mod
73  implicit none
74  class(oops_variables), intent(in) :: this
75  character(*), intent(in) :: varnames(:)
76 
77  character(kind=c_char,len=1), allocatable :: c_vname(:)
78  integer :: iname
79 
80  do iname = 1, size(varnames)
81  call f_c_string(trim(varnames(iname)), c_vname)
82  call c_variables_push_back(this%ptr, c_vname)
83  deallocate(c_vname)
84  end do
85 
86 end subroutine push_back_vector
87 
88 !-------------------------------------------------------------------------------
89 
90 integer function nvars(this)
91  implicit none
92  class(oops_variables), intent(in) :: this
93 
94  nvars = c_variables_size(this%ptr)
95 end function nvars
96 
97 !-------------------------------------------------------------------------------
98 
99 function variable(this, jj) result(varname)
100  use iso_c_binding, only: c_ptr, c_char, c_size_t
101  use string_f_c_mod
102  implicit none
103 
104  class(oops_variables), intent(in) :: this
105  integer, intent(in) :: jj
106  character(MAXVARLEN) :: varname
107 
108  integer(c_size_t) :: lcname
109  character(kind=c_char,len=1), allocatable :: cname(:)
110 
111  ! Fortran indices start from 1, C++ indices start from 0
112  call c_variables_getvariablelength(this%ptr, int(jj-1, c_size_t), lcname)
113  allocate(cname(lcname+1))
114  call c_variables_getvariable(this%ptr, int(jj-1, c_size_t), lcname, &
115  int(size(cname), c_size_t), cname)
116  call c_f_string(cname, varname)
117  deallocate(cname)
118 
119 end function variable
120 
121 !-------------------------------------------------------------------------------
122 
123 function varlist(this)
124  implicit none
125 
126  class(oops_variables), intent(in) :: this
127  character(MAXVARLEN), allocatable :: varlist(:)
128  integer :: jj
129 
130  allocate(varlist(this%nvars()))
131 
132  do jj = 1, this%nvars()
133  varlist(jj) = this%variable(jj)
134  enddo
135 
136 end function varlist
137 !-------------------------------------------------------------------------------
138 
139 logical function has(this, var)
140  use iso_c_binding, only: c_char
141  use string_f_c_mod
142  implicit none
143 
144  class(oops_variables), intent(in) :: this
145  character(*), intent(in) :: var
146 
147  character(kind=c_char,len=1), allocatable :: c_var(:)
148 
149  call f_c_string(trim(var), c_var)
150  has = c_variables_has(this%ptr, c_var)
151  deallocate(c_var)
152 end function has
153 
154 end module oops_variables_mod
oops_variables_mod::varlist
character(maxvarlen) function, dimension(:), allocatable varlist(this)
Definition: variables_mod.F90:124
c_variables_size
Definition: variables_interface.f:23
c_variables_has
Definition: variables_interface.f:54
oops_variables_mod
Fortran interface to Variables.
Definition: variables_mod.F90:9
oops_variables_mod::maxvarlen
integer, parameter, private maxvarlen
Definition: variables_mod.F90:14
oops_variables_mod::push_back_string
subroutine push_back_string(this, varname)
Definition: variables_mod.F90:54
c_variables_getvariable
Definition: variables_interface.f:42
oops_variables_mod::nvars
integer function nvars(this)
Definition: variables_mod.F90:91
oops_variables_mod::push_back_vector
subroutine push_back_vector(this, varnames)
Definition: variables_mod.F90:71
c_variables_getvariablelength
Definition: variables_interface.f:32
c_variables_push_back
Define interface for C++ Variables code called from Fortran.
Definition: variables_interface.f:13
oops_variables_mod::oops_variables
Definition: variables_mod.F90:16
oops_variables_mod::has
logical function has(this, var)
Definition: variables_mod.F90:140
oops_variables_mod::variable
character(maxvarlen) function variable(this, jj)
Definition: variables_mod.F90:100
qg_locs_mod::ctor_from_ptr
type(qg_locs) function ctor_from_ptr(ptr)
Definition: qg_locs_mod.F90:43