1! 2! Copyright (C) 2013, Northwestern University and Argonne National Laboratory 3! See COPYRIGHT notice in top-level directory. 4! 5! $Id: attributes.f90 2519 2016-10-06 00:41:33Z wkliao $ 6! 7! This file is taken from netcdf_attributes.f90 with changes for PnetCDF use 8! 9! 10 11 ! 12 ! Attribute routines: 13 ! 14 ! ------- 15 function nf90mpi_copy_att(ncid_in, varid_in, name, ncid_out, varid_out) 16 integer, intent(in) :: ncid_in, varid_in 17 character (len = *), intent(in) :: name 18 integer, intent(in) :: ncid_out, varid_out 19 integer :: nf90mpi_copy_att 20 21 nf90mpi_copy_att = nfmpi_copy_att(ncid_in, varid_in, name, ncid_out, varid_out) 22 end function nf90mpi_copy_att 23 ! ------- 24 function nf90mpi_rename_att(ncid, varid, curname, newname) 25 integer, intent(in) :: ncid, varid 26 character (len = *), intent(in) :: curname, newname 27 integer :: nf90mpi_rename_att 28 29 nf90mpi_rename_att = nfmpi_rename_att(ncid, varid, curname, newname) 30 end function nf90mpi_rename_att 31 ! ------- 32 function nf90mpi_del_att(ncid, varid, name) 33 integer, intent(in) :: ncid, varid 34 character (len = *), intent(in) :: name 35 integer :: nf90mpi_del_att 36 37 nf90mpi_del_att = nfmpi_del_att(ncid, varid, name) 38 end function nf90mpi_del_att 39 ! ------- 40 ! Attribute inquiry functions 41 ! ------- 42 function nf90mpi_inq_attname(ncid, varid, attnum, name) 43 integer, intent( in) :: ncid, varid, attnum 44 character (len = *), intent(out) :: name 45 integer :: nf90mpi_inq_attname 46 47 nf90mpi_inq_attname = nfmpi_inq_attname(ncid, varid, attnum, name) 48 end function nf90mpi_inq_attname 49 ! ------- 50 function nf90mpi_inquire_attribute(ncid, varid, name, xtype, len, attnum) 51 integer, intent( in) :: ncid, varid 52 character (len = *), intent( in) :: name 53 integer, optional, intent(out) :: xtype, attnum 54 integer (kind=MPI_OFFSET_KIND), optional, intent(out) :: len 55 integer :: nf90mpi_inquire_attribute 56 57 integer :: local_xtype 58 integer (kind=MPI_OFFSET_KIND) :: local_len 59 60 ! Do we need to worry about not saving the state from this call? 61 if(present(attnum)) & 62 nf90mpi_inquire_attribute = nfmpi_inq_attid(ncid, varid, name, attnum) 63 64 nf90mpi_inquire_attribute = nfmpi_inq_att (ncid, varid, name, local_xtype, local_len) 65 66 if(present(xtype)) xtype = local_xtype 67 if(present(len )) len = local_len 68 end function nf90mpi_inquire_attribute 69 ! ------- 70 ! Put and get functions; these will get overloaded 71 ! ------- 72 ! Text 73 ! ------- 74 function nf90mpi_put_att_text(ncid, varid, name, values) 75 integer, intent(in) :: ncid, varid 76 character(len = *), intent(in) :: name 77 character(len = *), intent(in) :: values 78 integer :: nf90mpi_put_att_text 79 integer (kind=MPI_OFFSET_KIND) :: ilen 80 81 ilen = len_trim(values) 82 nf90mpi_put_att_text = nfmpi_put_att_text(ncid, varid, name, ilen, trim(values)) 83 end function nf90mpi_put_att_text 84 ! ------- 85 function nf90mpi_get_att_text(ncid, varid, name, values) 86 integer, intent( in) :: ncid, varid 87 character(len = *), intent( in) :: name 88 character(len = *), intent(out) :: values 89 integer :: nf90mpi_get_att_text 90 91 values = ' ' !! make sure result will be blank padded 92 nf90mpi_get_att_text = nfmpi_get_att_text(ncid, varid, name, values) 93 end function nf90mpi_get_att_text 94 ! ------- 95 ! Integer attributes 96 ! ------- 97 function nf90mpi_put_att_OneByteInt(ncid, varid, name, values) 98 integer, intent( in) :: ncid, varid 99 character(len = *), intent( in) :: name 100 integer (kind = OneByteInt), dimension(:), intent( in) :: values 101 integer :: nf90mpi_put_att_OneByteInt 102 integer (kind=MPI_OFFSET_KIND) :: ilen 103 104 ilen = size(values) 105 nf90mpi_put_att_OneByteInt = nfmpi_put_att_int1(ncid, varid, name, nf90_int1, ilen, values) 106 end function nf90mpi_put_att_OneByteInt 107 ! ------- 108 function nf90mpi_put_att_one_OneByteInt(ncid, varid, name, values) 109 integer, intent( in) :: ncid, varid 110 character(len = *), intent( in) :: name 111 integer (kind = OneByteInt), intent( in) :: values 112 integer :: nf90mpi_put_att_one_OneByteInt 113 integer (kind = OneByteInt), dimension(1) :: valuesA 114 115 valuesA(1) = values 116 nf90mpi_put_att_one_OneByteInt = nfmpi_put_att_int1(ncid, varid, name, nf90_int1, 1_MPI_OFFSET_KIND, valuesA) 117 end function nf90mpi_put_att_one_OneByteInt 118 ! ------- 119 function nf90mpi_get_att_OneByteInt(ncid, varid, name, values) 120 integer, intent( in) :: ncid, varid 121 character(len = *), intent( in) :: name 122 integer (kind = OneByteInt), dimension(:), intent(out) :: values 123 integer :: nf90mpi_get_att_OneByteInt 124 125 nf90mpi_get_att_OneByteInt = nfmpi_get_att_int1(ncid, varid, name, values) 126 end function nf90mpi_get_att_OneByteInt 127 ! ------- 128 function nf90mpi_get_att_one_OneByteInt(ncid, varid, name, values) 129 integer, intent( in) :: ncid, varid 130 character(len = *), intent( in) :: name 131 integer (kind = OneByteInt), intent(out) :: values 132 integer :: nf90mpi_get_att_one_OneByteInt 133 integer (kind = OneByteInt), dimension(1) :: valuesA 134 135 nf90mpi_get_att_one_OneByteInt = nfmpi_get_att_int1(ncid, varid, name, valuesA) 136 values = valuesA(1) 137 end function nf90mpi_get_att_one_OneByteInt 138 ! ------- 139 function nf90mpi_put_att_TwoByteInt(ncid, varid, name, values) 140 integer, intent(in) :: ncid, varid 141 character(len = *), intent(in) :: name 142 integer (kind = TwoByteInt), dimension(:), intent(in) :: values 143 integer :: nf90mpi_put_att_TwoByteInt 144 integer (kind=MPI_OFFSET_KIND) :: ilen 145 146 ilen = size(values) 147 nf90mpi_put_att_TwoByteInt = nfmpi_put_att_int2(ncid, varid, name, nf90_int2, ilen, values) 148 end function nf90mpi_put_att_TwoByteInt 149 ! ------- 150 function nf90mpi_put_att_one_TwoByteInt(ncid, varid, name, values) 151 integer, intent(in) :: ncid, varid 152 character(len = *), intent(in) :: name 153 integer (kind = TwoByteInt), intent(in) :: values 154 integer :: nf90mpi_put_att_one_TwoByteInt 155 integer (kind = TwoByteInt), dimension(1) :: valuesA 156 157 valuesA(1) = values 158 nf90mpi_put_att_one_TwoByteInt = nfmpi_put_att_int2(ncid, varid, name, nf90_int2, 1_MPI_OFFSET_KIND, valuesA) 159 end function nf90mpi_put_att_one_TwoByteInt 160 ! ------- 161 function nf90mpi_get_att_TwoByteInt(ncid, varid, name, values) 162 integer, intent( in) :: ncid, varid 163 character(len = *), intent( in) :: name 164 integer (kind = TwoByteInt), dimension(:), intent(out) :: values 165 integer :: nf90mpi_get_att_TwoByteInt 166 167 nf90mpi_get_att_TwoByteInt = nfmpi_get_att_int2(ncid, varid, name, values) 168 end function nf90mpi_get_att_TwoByteInt 169 ! ------- 170 function nf90mpi_get_att_one_TwoByteInt(ncid, varid, name, values) 171 integer, intent( in) :: ncid, varid 172 character(len = *), intent( in) :: name 173 integer (kind = TwoByteInt), intent(out) :: values 174 integer :: nf90mpi_get_att_one_TwoByteInt 175 integer (kind = TwoByteInt), dimension(1) :: valuesA 176 177 nf90mpi_get_att_one_TwoByteInt = nfmpi_get_att_int2(ncid, varid, name, valuesA) 178 values = valuesA(1) 179 end function nf90mpi_get_att_one_TwoByteInt 180 ! ------- 181 function nf90mpi_put_att_FourByteInt(ncid, varid, name, values) 182 integer, intent(in) :: ncid, varid 183 character(len = *), intent(in) :: name 184 integer (kind = FourByteInt), dimension(:), intent(in) :: values 185 integer :: nf90mpi_put_att_FourByteInt 186 integer (kind=MPI_OFFSET_KIND) :: ilen 187 188 ilen = size(values) 189 nf90mpi_put_att_FourByteInt = nfmpi_put_att_int(ncid, varid, name, nf90_int, ilen, values) 190 end function nf90mpi_put_att_FourByteInt 191 ! ------- 192 function nf90mpi_put_att_one_FourByteInt(ncid, varid, name, values) 193 integer, intent(in) :: ncid, varid 194 character(len = *), intent(in) :: name 195 integer (kind = FourByteInt), intent(in) :: values 196 integer :: nf90mpi_put_att_one_FourByteInt 197 integer (kind = FourByteInt), dimension(1) :: valuesA 198 199 valuesA(1) = int(values) 200 nf90mpi_put_att_one_FourByteInt = nfmpi_put_att_int(ncid, varid, name, nf90_int, 1_MPI_OFFSET_KIND, valuesA) 201 end function nf90mpi_put_att_one_FourByteInt 202 ! ------- 203 function nf90mpi_get_att_FourByteInt(ncid, varid, name, values) 204 integer, intent(in) :: ncid, varid 205 character(len = *), intent(in) :: name 206 integer (kind = FourByteInt), dimension(:), intent(out) :: values 207 integer :: nf90mpi_get_att_FourByteInt 208 integer, dimension(size(values)) :: defaultInteger 209 210 nf90mpi_get_att_FourByteInt = nfmpi_get_att_int(ncid, varid, name, defaultInteger) 211 values(:) = defaultInteger(:) 212 end function nf90mpi_get_att_FourByteInt 213 ! ------- 214 function nf90mpi_get_att_one_FourByteInt(ncid, varid, name, values) 215 integer, intent(in) :: ncid, varid 216 character(len = *), intent(in) :: name 217 integer (kind = FourByteInt), intent(out) :: values 218 integer :: nf90mpi_get_att_one_FourByteInt 219 integer, dimension(1) :: defaultInteger 220 221 nf90mpi_get_att_one_FourByteInt = nfmpi_get_att_int(ncid, varid, name, defaultInteger) 222 values = defaultInteger(1) 223 end function nf90mpi_get_att_one_FourByteInt 224 ! ------- 225 function nf90mpi_put_att_EightByteInt(ncid, varid, name, values) 226 integer, intent(in) :: ncid, varid 227 character(len = *), intent(in) :: name 228 integer (kind = EightByteInt), dimension(:), intent(in) :: values 229 integer :: nf90mpi_put_att_EightByteInt 230 integer (kind=MPI_OFFSET_KIND) :: ilen 231 232 ilen = size(values) 233 nf90mpi_put_att_EightByteInt = nfmpi_put_att_int8(ncid, varid, name, nf90_int, ilen, values) 234 end function nf90mpi_put_att_EightByteInt 235 ! ------- 236 function nf90mpi_put_att_one_EightByteInt(ncid, varid, name, values) 237 integer, intent(in) :: ncid, varid 238 character(len = *), intent(in) :: name 239 integer (kind = EightByteInt), intent(in) :: values 240 integer :: nf90mpi_put_att_one_EightByteInt 241 242 integer (kind = EightByteInt), dimension(1) :: valuesA 243 valuesA(1) = values 244 nf90mpi_put_att_one_EightByteInt = nfmpi_put_att_int8(ncid, varid, name, nf90_int, 1_MPI_OFFSET_KIND, valuesA) 245 end function nf90mpi_put_att_one_EightByteInt 246 ! ------- 247 function nf90mpi_get_att_EightByteInt(ncid, varid, name, values) 248 integer, intent(in) :: ncid, varid 249 character(len = *), intent(in) :: name 250 integer (kind = EightByteInt), dimension(:), intent(out) :: values 251 integer :: nf90mpi_get_att_EightByteInt 252 253 nf90mpi_get_att_EightByteInt = nfmpi_get_att_int8(ncid, varid, name, values) 254 end function nf90mpi_get_att_EightByteInt 255 ! ------- 256 function nf90mpi_get_att_one_EightByteInt(ncid, varid, name, values) 257 integer, intent(in) :: ncid, varid 258 character(len = *), intent(in) :: name 259 integer (kind = EightByteInt), intent(out) :: values 260 integer :: nf90mpi_get_att_one_EightByteInt 261 262 integer (kind = EightByteInt), dimension(1) :: valuesA 263 264 nf90mpi_get_att_one_EightByteInt = nfmpi_get_att_int8(ncid, varid, name, valuesA) 265 values = valuesA(1) 266 end function nf90mpi_get_att_one_EightByteInt 267 ! ------- 268 ! Real attributes 269 ! ------- 270 function nf90mpi_put_att_FourByteReal(ncid, varid, name, values) 271 integer, intent(in) :: ncid, varid 272 character(len = *), intent(in) :: name 273 real (kind = FourByteReal), dimension(:), intent(in) :: values 274 integer :: nf90mpi_put_att_FourByteReal 275 integer (kind=MPI_OFFSET_KIND) :: ilen 276 277 ilen = size(values) 278 nf90mpi_put_att_FourByteReal = nfmpi_put_att_real(ncid, varid, name, nf90_real4, ilen, values) 279 end function nf90mpi_put_att_FourByteReal 280 ! ------- 281 function nf90mpi_put_att_one_FourByteReal(ncid, varid, name, values) 282 integer, intent(in) :: ncid, varid 283 character(len = *), intent(in) :: name 284 real (kind = FourByteReal), intent(in) :: values 285 integer :: nf90mpi_put_att_one_FourByteReal 286 287 real (kind = FourByteReal), dimension(1) :: valuesA 288 valuesA(1) = values 289 nf90mpi_put_att_one_FourByteReal = nfmpi_put_att_real(ncid, varid, name, nf90_real4, 1_MPI_OFFSET_KIND, valuesA) 290 end function nf90mpi_put_att_one_FourByteReal 291 ! ------- 292 function nf90mpi_get_att_FourByteReal(ncid, varid, name, values) 293 integer, intent(in) :: ncid, varid 294 character(len = *), intent(in) :: name 295 real (kind = FourByteReal), dimension(:), intent(out) :: values 296 integer :: nf90mpi_get_att_FourByteReal 297 298 nf90mpi_get_att_FourByteReal = nfmpi_get_att_real(ncid, varid, name, values) 299 end function nf90mpi_get_att_FourByteReal 300 ! ------- 301 function nf90mpi_get_att_one_FourByteReal(ncid, varid, name, values) 302 integer, intent(in) :: ncid, varid 303 character(len = *), intent(in) :: name 304 real (kind = FourByteReal), intent(out) :: values 305 integer :: nf90mpi_get_att_one_FourByteReal 306 307 real (kind = FourByteReal), dimension(1) :: valuesA 308 nf90mpi_get_att_one_FourByteReal = nfmpi_get_att_real(ncid, varid, name, valuesA) 309 values = valuesA(1) 310 end function nf90mpi_get_att_one_FourByteReal 311 ! ------- 312 function nf90mpi_put_att_EightByteReal(ncid, varid, name, values) 313 integer, intent(in) :: ncid, varid 314 character(len = *), intent(in) :: name 315 real (kind = EightByteReal), dimension(:), intent(in) :: values 316 integer :: nf90mpi_put_att_EightByteReal 317 integer (kind=MPI_OFFSET_KIND) :: ilen 318 319 ilen = size(values) 320 nf90mpi_put_att_EightByteReal = nfmpi_put_att_double(ncid, varid, name, nf90_real8, ilen, values) 321 end function nf90mpi_put_att_EightByteReal 322 ! ------- 323 function nf90mpi_put_att_one_EightByteReal(ncid, varid, name, values) 324 integer, intent(in) :: ncid, varid 325 character(len = *), intent(in) :: name 326 real (kind = EightByteReal), intent(in) :: values 327 integer :: nf90mpi_put_att_one_EightByteReal 328 329 real (kind = EightByteReal), dimension(1) :: valuesA 330 valuesA(1) = values 331 nf90mpi_put_att_one_EightByteReal = nfmpi_put_att_double(ncid, varid, name, nf90_real8, 1_MPI_OFFSET_KIND, valuesA) 332 end function nf90mpi_put_att_one_EightByteReal 333 ! ------- 334 function nf90mpi_get_att_EightByteReal(ncid, varid, name, values) 335 integer, intent(in) :: ncid, varid 336 character(len = *), intent(in) :: name 337 real (kind = EightByteReal), dimension(:), intent(out) :: values 338 integer :: nf90mpi_get_att_EightByteReal 339 340 nf90mpi_get_att_EightByteReal = nfmpi_get_att_double(ncid, varid, name, values) 341 end function nf90mpi_get_att_EightByteReal 342 ! ------- 343 function nf90mpi_get_att_one_EightByteReal(ncid, varid, name, values) 344 integer, intent(in) :: ncid, varid 345 character(len = *), intent(in) :: name 346 real (kind = EightByteReal), intent(out) :: values 347 integer :: nf90mpi_get_att_one_EightByteReal 348 349 real (kind = EightByteReal), dimension(1) :: valuesA 350 nf90mpi_get_att_one_EightByteReal = nfmpi_get_att_double(ncid, varid, name, valuesA) 351 values = valuesA(1) 352 end function nf90mpi_get_att_one_EightByteReal 353 ! ------- 354