(git:b6ef100)
Loading...
Searching...
No Matches
openpmd_api.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
9
10#ifdef __OPENPMD
11
12 USE iso_c_binding, ONLY: &
13 c_associated, &
14 c_char, &
15 c_double, &
16 c_f_pointer, &
17 c_int, &
18 c_int64_t, &
19 c_loc, &
20 c_null_char, &
21 c_null_ptr, &
22 c_ptr, &
23 c_size_t
24 USE kinds, ONLY: default_string_length, dp, sp
26#include "./base/base_uses.f90"
27#endif
28
29 IMPLICIT NONE
30
31 PRIVATE
32
33#ifdef __OPENPMD
34
35 INTEGER, PARAMETER :: openpmd_access_create = 0
36 INTEGER, PARAMETER :: openpmd_access_read_only = 1
37
38 INTEGER, PARAMETER :: openpmd_type_char = 0
39 INTEGER, PARAMETER :: openpmd_type_uchar = 1
40 INTEGER, PARAMETER :: openpmd_type_schar = 2
41 INTEGER, PARAMETER :: openpmd_type_short = 3
42 INTEGER, PARAMETER :: openpmd_type_int = 4
43 INTEGER, PARAMETER :: openpmd_type_long = 5
44 INTEGER, PARAMETER :: openpmd_type_longlong = 6
45 INTEGER, PARAMETER :: openpmd_type_ushort = 7
46 INTEGER, PARAMETER :: openpmd_type_uint = 8
47 INTEGER, PARAMETER :: openpmd_type_ulong = 9
48 INTEGER, PARAMETER :: openpmd_type_ulonglong = 10
49 INTEGER, PARAMETER :: openpmd_type_float = 11
50 INTEGER, PARAMETER :: openpmd_type_double = 12
51 INTEGER, PARAMETER :: openpmd_type_long_double = 13
52 INTEGER, PARAMETER :: openpmd_type_cfloat = 14
53 INTEGER, PARAMETER :: openpmd_type_cdouble = 15
54 INTEGER, PARAMETER :: openpmd_type_clong_double = 16
55 INTEGER, PARAMETER :: openpmd_type_string = 17
56 INTEGER, PARAMETER :: openpmd_type_vec_char = 18
57 INTEGER, PARAMETER :: openpmd_type_vec_short = 19
58 INTEGER, PARAMETER :: openpmd_type_vec_int = 20
59 INTEGER, PARAMETER :: openpmd_type_vec_long = 21
60 INTEGER, PARAMETER :: openpmd_type_vec_longlong = 22
61 INTEGER, PARAMETER :: openpmd_type_vec_uchar = 23
62 INTEGER, PARAMETER :: openpmd_type_vec_ushort = 24
63 INTEGER, PARAMETER :: openpmd_type_vec_uint = 25
64 INTEGER, PARAMETER :: openpmd_type_vec_ulong = 26
65 INTEGER, PARAMETER :: openpmd_type_vec_ulonglong = 27
66 INTEGER, PARAMETER :: openpmd_type_vec_float = 28
67 INTEGER, PARAMETER :: openpmd_type_vec_double = 29
68 INTEGER, PARAMETER :: openpmd_type_vec_long_double = 30
69 INTEGER, PARAMETER :: openpmd_type_vec_cfloat = 31
70 INTEGER, PARAMETER :: openpmd_type_vec_cdouble = 32
71 INTEGER, PARAMETER :: openpmd_type_vec_clong_double = 33
72 INTEGER, PARAMETER :: openpmd_type_vec_schar = 34
73 INTEGER, PARAMETER :: openpmd_type_vec_string = 35
74 INTEGER, PARAMETER :: openpmd_type_arr_dbl_7 = 36
75 INTEGER, PARAMETER :: openpmd_type_bool = 37
76
77
78 TYPE openpmd_attributable_type
79 PRIVATE
80 TYPE(C_PTR) :: c_ptr = c_null_ptr
81 CONTAINS
82 PROCEDURE, PUBLIC :: set_attribute_vec_int => openpmd_attributable_set_attribute_vec_int
83 PROCEDURE, PUBLIC :: series_flush => openpmd_attributable_series_flush
84 END TYPE openpmd_attributable_type
85
86 TYPE openpmd_series_type
87 PRIVATE
88 TYPE(C_PTR) :: c_ptr = c_null_ptr
89 CONTAINS
90 PROCEDURE, PUBLIC :: as_pointer
91 PROCEDURE, PUBLIC :: as_attributable => openpmd_series_as_attributable
92 PROCEDURE, PUBLIC :: close => openpmd_series_close
93 PROCEDURE, PUBLIC :: present => openpmd_series_present
94 PROCEDURE, PUBLIC :: set_software => openpmd_series_set_software
95 PROCEDURE, PUBLIC :: write_iteration => openpmd_series_write_iteration
96 PROCEDURE, PUBLIC :: get_iteration => openpmd_series_get_iteration
97 END TYPE openpmd_series_type
98
99 TYPE openpmd_iteration_type
100 PRIVATE
101 TYPE(C_PTR) :: c_ptr = c_null_ptr
102 CONTAINS
103 PROCEDURE, PUBLIC :: as_attributable => openpmd_iteration_as_attributable
104 PROCEDURE, PUBLIC :: get_mesh => openpmd_iteration_get_mesh
105 PROCEDURE, PUBLIC :: get_particle_species => openpmd_iteration_get_particle_species
106 PROCEDURE, PUBLIC :: close => openpmd_iteration_close
107 PROCEDURE, PUBLIC :: open => openpmd_iteration_open
108 PROCEDURE, PUBLIC :: closed => openpmd_iteration_closed
109 PROCEDURE, PUBLIC :: set_time_unit_SI => openpmd_iteration_set_time_unit_si
110 PROCEDURE, PUBLIC :: set_time => openpmd_iteration_set_time
111 END TYPE openpmd_iteration_type
112
113 TYPE openpmd_mesh_type
114 PRIVATE
115 TYPE(C_PTR) :: c_ptr = c_null_ptr
116 CONTAINS
117 PROCEDURE, PUBLIC :: as_record_component => openpmd_mesh_as_record_component
118 PROCEDURE, PUBLIC :: set_axis_labels => openpmd_mesh_set_axis_labels
119 PROCEDURE, PUBLIC :: set_grid_global_offset => openpmd_mesh_set_grid_global_offset
120 PROCEDURE, PUBLIC :: set_grid_spacing => openpmd_mesh_set_grid_spacing
121 PROCEDURE, PUBLIC :: set_grid_unit_SI => openpmd_mesh_set_grid_unit_si
122 PROCEDURE, PUBLIC :: set_position => openpmd_mesh_set_position
123 PROCEDURE, PUBLIC :: set_unit_dimension => openpmd_mesh_set_unit_dimension
124 END TYPE openpmd_mesh_type
125
126 TYPE openpmd_particle_species_type
127 PRIVATE
128 TYPE(C_PTR) :: c_ptr = c_null_ptr
129 CONTAINS
130 PROCEDURE, PUBLIC :: get_record => openpmd_particle_species_get_record
131 END TYPE openpmd_particle_species_type
132
133 TYPE openpmd_record_component_type
134 PRIVATE
135 TYPE(C_PTR) :: c_ptr = c_null_ptr
136 CONTAINS
137 PROCEDURE, PUBLIC :: make_empty => openpmd_record_component_make_empty
138 PROCEDURE, PUBLIC :: make_constant_zero => openpmd_record_component_make_constant_zero
139 PROCEDURE, PUBLIC :: reset_dataset => openpmd_record_component_reset_dataset
140 PROCEDURE, PUBLIC :: set_unit_SI => openpmd_record_component_set_unit_si
141 PROCEDURE, PRIVATE :: store_chunk_1d_double &
142 => openpmd_record_component_store_chunk_1d_double
143 PROCEDURE, PUBLIC :: store_chunk_span_1d_double &
144 => openpmd_record_component_store_chunk_span_1d_double
145 PROCEDURE, PRIVATE :: store_chunk_2d_double &
146 => openpmd_record_component_store_chunk_2d_double
147 PROCEDURE, PUBLIC :: store_chunk_span_2d_double &
148 => openpmd_record_component_store_chunk_span_2d_double
149 PROCEDURE, PRIVATE :: store_chunk_3d_double &
150 => openpmd_record_component_store_chunk_3d_double
151 PROCEDURE, PUBLIC :: store_chunk_span_3d_double &
152 => openpmd_record_component_store_chunk_span_3d_double
153 generic, PUBLIC :: store_chunk => &
154 store_chunk_1d_double, &
155 store_chunk_2d_double, &
156 store_chunk_3d_double
157 END TYPE openpmd_record_component_type
158
159 TYPE openpmd_mesh_record_component_type
160 PRIVATE
161 TYPE(C_PTR) :: c_ptr = c_null_ptr
162 END TYPE openpmd_mesh_record_component_type
163
164 TYPE openpmd_record_type
165 PRIVATE
166 TYPE(C_PTR) :: c_ptr = c_null_ptr
167 CONTAINS
168 PROCEDURE, PUBLIC :: as_record_component => openpmd_record_as_record_component
169 PROCEDURE, PUBLIC :: get_component => openpmd_record_get_component
170 PROCEDURE, PUBLIC :: set_unit_dimension => openpmd_record_set_unit_dimension
171 END TYPE openpmd_record_type
172
173 TYPE openpmd_dynamic_memory_view_type_1d
174 PRIVATE
175 INTEGER, DIMENSION(1) :: chunk_extent = 0
176 TYPE(C_PTR) :: c_ptr = c_null_ptr
177
178 CONTAINS
179
180 PROCEDURE, PUBLIC :: resolve_double &
181 => openpmd_dynamic_memory_view_resolve_1d_double
182 END TYPE openpmd_dynamic_memory_view_type_1d
183 TYPE openpmd_dynamic_memory_view_type_2d
184 PRIVATE
185 INTEGER, DIMENSION(2) :: chunk_extent = 0
186 TYPE(C_PTR) :: c_ptr = c_null_ptr
187
188 CONTAINS
189
190 PROCEDURE, PUBLIC :: resolve_double &
191 => openpmd_dynamic_memory_view_resolve_2d_double
192 END TYPE openpmd_dynamic_memory_view_type_2d
193 TYPE openpmd_dynamic_memory_view_type_3d
194 PRIVATE
195 INTEGER, DIMENSION(3) :: chunk_extent = 0
196 TYPE(C_PTR) :: c_ptr = c_null_ptr
197
198 CONTAINS
199
200 PROCEDURE, PUBLIC :: resolve_double &
201 => openpmd_dynamic_memory_view_resolve_3d_double
202 END TYPE openpmd_dynamic_memory_view_type_3d
203
204 ! Types
205 PUBLIC :: openpmd_attributable_type
206 PUBLIC :: openpmd_iteration_type
207 PUBLIC :: openpmd_mesh_type
208 PUBLIC :: openpmd_particle_species_type
209 PUBLIC :: openpmd_record_component_type
210 PUBLIC :: openpmd_record_type
211 PUBLIC :: openpmd_series_type, openpmd_series_create
212
213 ! Helpers
214 PUBLIC :: openpmd_access_create, openpmd_access_read_only
215 PUBLIC :: openpmd_get_default_extension
216 PUBLIC :: openpmd_json_merge
217
218 ! openPMD datatypes
219 PUBLIC :: openpmd_type_arr_dbl_7
220 PUBLIC :: openpmd_type_bool
221 PUBLIC :: openpmd_type_cdouble
222 PUBLIC :: openpmd_type_cfloat
223 PUBLIC :: openpmd_type_char
224 PUBLIC :: openpmd_type_clong_double
225 PUBLIC :: openpmd_type_double
226 PUBLIC :: openpmd_type_float
227 PUBLIC :: openpmd_type_int
228 PUBLIC :: openpmd_type_long
229 PUBLIC :: openpmd_type_long_double
230 PUBLIC :: openpmd_type_longlong
231 PUBLIC :: openpmd_type_schar
232 PUBLIC :: openpmd_type_short
233 PUBLIC :: openpmd_type_string
234 PUBLIC :: openpmd_type_uchar
235 PUBLIC :: openpmd_type_uint
236 PUBLIC :: openpmd_type_ulong
237 PUBLIC :: openpmd_type_ulonglong
238 PUBLIC :: openpmd_type_ushort
239 PUBLIC :: openpmd_type_vec_cdouble
240 PUBLIC :: openpmd_type_vec_cfloat
241 PUBLIC :: openpmd_type_vec_char
242 PUBLIC :: openpmd_type_vec_clong_double
243 PUBLIC :: openpmd_type_vec_double
244 PUBLIC :: openpmd_type_vec_float
245 PUBLIC :: openpmd_type_vec_int
246 PUBLIC :: openpmd_type_vec_long
247 PUBLIC :: openpmd_type_vec_long_double
248 PUBLIC :: openpmd_type_vec_longlong
249 PUBLIC :: openpmd_type_vec_schar
250 PUBLIC :: openpmd_type_vec_short
251 PUBLIC :: openpmd_type_vec_string
252 PUBLIC :: openpmd_type_vec_uchar
253 PUBLIC :: openpmd_type_vec_uint
254 PUBLIC :: openpmd_type_vec_ulong
255 PUBLIC :: openpmd_type_vec_ulonglong
256 PUBLIC :: openpmd_type_vec_ushort
257
258 PUBLIC :: openpmd_series_as_attributable
259 PUBLIC :: openpmd_iteration_as_attributable
260 PUBLIC :: openpmd_record_component_as_attributable
261 PUBLIC :: openpmd_mesh_as_record_component
262 PUBLIC :: openpmd_record_as_record_component
263 PUBLIC :: openpmd_mesh_as_mesh_record_component
264 PUBLIC :: openpmd_mesh_record_component_as_record_component
265 PUBLIC :: openpmd_dynamic_memory_view_type_1d
266 PUBLIC :: openpmd_dynamic_memory_view_type_2d
267 PUBLIC :: openpmd_dynamic_memory_view_type_3d
268#endif
269
270 CONTAINS
271
272#ifdef __OPENPMD
273
274! **************************************************************************************************
275!> \brief ...
276!> \param this ...
277!> \return ...
278! **************************************************************************************************
279 FUNCTION as_pointer(this) RESULT(res)
280 CLASS(openpmd_series_type), INTENT(IN) :: this
281 TYPE(C_PTR) :: res
282
283 res = this%c_ptr
284 END FUNCTION as_pointer
285
286 FUNCTION openpmd_series_as_attributable (this) RESULT(res)
287 CLASS(openpmd_Series_type), INTENT(IN) :: this
288 TYPE(openpmd_Attributable_type) :: res
289
290 INTERFACE
291 SUBROUTINE openpmd_c_series_as_attributable (child, parent) &
292 BIND(C, name="openPMD_Series_upcast_to_Attributable")
293 IMPORT :: c_ptr
294 TYPE(C_PTR), VALUE :: child
295 TYPE(C_PTR) :: parent
296 END SUBROUTINE openpmd_c_series_as_attributable
297 END INTERFACE
298
299 CALL openpmd_c_series_as_attributable (this%c_ptr, res%c_ptr)
300 END FUNCTION openpmd_series_as_attributable
301 FUNCTION openpmd_iteration_as_attributable (this) RESULT(res)
302 CLASS(openpmd_Iteration_type), INTENT(IN) :: this
303 TYPE(openpmd_Attributable_type) :: res
304
305 INTERFACE
306 SUBROUTINE openpmd_c_iteration_as_attributable (child, parent) &
307 BIND(C, name="openPMD_Iteration_upcast_to_Attributable")
308 IMPORT :: c_ptr
309 TYPE(C_PTR), VALUE :: child
310 TYPE(C_PTR) :: parent
311 END SUBROUTINE openpmd_c_iteration_as_attributable
312 END INTERFACE
313
314 CALL openpmd_c_iteration_as_attributable (this%c_ptr, res%c_ptr)
315 END FUNCTION openpmd_iteration_as_attributable
316 FUNCTION openpmd_record_component_as_attributable (this) RESULT(res)
317 CLASS(openpmd_record_component_type), INTENT(IN) :: this
318 TYPE(openpmd_Attributable_type) :: res
319
320 INTERFACE
321 SUBROUTINE openpmd_c_record_component_as_attributable (child, parent) &
322 BIND(C, name="openPMD_RecordComponent_upcast_to_Attributable")
323 IMPORT :: c_ptr
324 TYPE(C_PTR), VALUE :: child
325 TYPE(C_PTR) :: parent
326 END SUBROUTINE openpmd_c_record_component_as_attributable
327 END INTERFACE
328
329 CALL openpmd_c_record_component_as_attributable (this%c_ptr, res%c_ptr)
330 END FUNCTION openpmd_record_component_as_attributable
331 FUNCTION openpmd_mesh_as_record_component (this) RESULT(res)
332 CLASS(openpmd_Mesh_type), INTENT(IN) :: this
333 TYPE(openpmd_record_component_type) :: res
334
335 INTERFACE
336 SUBROUTINE openpmd_c_mesh_as_record_component (child, parent) &
337 BIND(C, name="openPMD_Mesh_upcast_to_RecordComponent")
338 IMPORT :: c_ptr
339 TYPE(C_PTR), VALUE :: child
340 TYPE(C_PTR) :: parent
341 END SUBROUTINE openpmd_c_mesh_as_record_component
342 END INTERFACE
343
344 CALL openpmd_c_mesh_as_record_component (this%c_ptr, res%c_ptr)
345 END FUNCTION openpmd_mesh_as_record_component
346 FUNCTION openpmd_record_as_record_component (this) RESULT(res)
347 CLASS(openpmd_Record_type), INTENT(IN) :: this
348 TYPE(openpmd_record_component_type) :: res
349
350 INTERFACE
351 SUBROUTINE openpmd_c_record_as_record_component (child, parent) &
352 BIND(C, name="openPMD_Record_upcast_to_RecordComponent")
353 IMPORT :: c_ptr
354 TYPE(C_PTR), VALUE :: child
355 TYPE(C_PTR) :: parent
356 END SUBROUTINE openpmd_c_record_as_record_component
357 END INTERFACE
358
359 CALL openpmd_c_record_as_record_component (this%c_ptr, res%c_ptr)
360 END FUNCTION openpmd_record_as_record_component
361 FUNCTION openpmd_mesh_as_mesh_record_component (this) RESULT(res)
362 CLASS(openpmd_Mesh_type), INTENT(IN) :: this
363 TYPE(openpmd_mesh_record_component_type) :: res
364
365 INTERFACE
366 SUBROUTINE openpmd_c_mesh_as_mesh_record_component (child, parent) &
367 BIND(C, name="openPMD_Mesh_upcast_to_MeshRecordComponent")
368 IMPORT :: c_ptr
369 TYPE(C_PTR), VALUE :: child
370 TYPE(C_PTR) :: parent
371 END SUBROUTINE openpmd_c_mesh_as_mesh_record_component
372 END INTERFACE
373
374 CALL openpmd_c_mesh_as_mesh_record_component (this%c_ptr, res%c_ptr)
375 END FUNCTION openpmd_mesh_as_mesh_record_component
376 FUNCTION openpmd_mesh_record_component_as_record_component (this) RESULT(res)
377 CLASS(openpmd_mesh_record_component_type), INTENT(IN) :: this
378 TYPE(openpmd_record_component_type) :: res
379
380 INTERFACE
381 SUBROUTINE openpmd_c_mesh_record_component_as_record_component (child, parent) &
382 BIND(C, name="openPMD_MeshRecordComponent_upcast_to_RecordComponent")
383 IMPORT :: c_ptr
384 TYPE(C_PTR), VALUE :: child
385 TYPE(C_PTR) :: parent
386 END SUBROUTINE openpmd_c_mesh_record_component_as_record_component
387 END INTERFACE
388
389 CALL openpmd_c_mesh_record_component_as_record_component (this%c_ptr, res%c_ptr)
390 END FUNCTION openpmd_mesh_record_component_as_record_component
391
392! **************************************************************************************************
393!> \brief ...
394!> \param series ...
395!> \return ...
396! **************************************************************************************************
397 FUNCTION openpmd_series_present(this) RESULT(res)
398 CLASS(openpmd_series_type), INTENT(IN) :: this
399 LOGICAL :: res
400 INTEGER :: res_internal
401
402 INTERFACE
403 FUNCTION openpmd_c_series_present(series) RESULT(res) &
404 BIND(C, NAME="openPMD_Series_present")
405 IMPORT :: c_ptr, c_int
406 TYPE(C_PTR), VALUE, INTENT(IN) :: series
407 INTEGER(kind=C_INT) :: res
408 END FUNCTION openpmd_c_series_present
409 END INTERFACE
410
411 IF (.NOT. c_associated(this%c_ptr)) THEN
412 res = .false.
413 RETURN
414 END IF
415
416 res_internal = openpmd_c_series_present(this%c_ptr)
417 res = res_internal /= 0
418 END FUNCTION openpmd_series_present
419
420! **************************************************************************************************
421!> \brief ...
422!> \param path ...
423!> \param access ...
424!> \param mpi_comm ...
425!> \param config ...
426!> \return ...
427! **************************************************************************************************
428 FUNCTION openpmd_series_create(path, access, mpi_comm, config) RESULT(series)
429 CHARACTER(len=*), INTENT(IN) :: path
430 INTEGER(kind=C_INT), INTENT(IN) :: access
431 CLASS(mp_comm_type), INTENT(in), OPTIONAL :: mpi_comm
432 CHARACTER(len=*), INTENT(IN), OPTIONAL, TARGET :: config
433 TYPE(openpmd_series_type) :: series
434
435 TYPE(c_ptr), SAVE :: comm_c = c_null_ptr
436 CHARACTER(len=default_string_length), TARGET, SAVE :: default_config = "{}"
437 CHARACTER(:), POINTER :: my_config
438 INTERFACE
439! **************************************************************************************************
440!> \brief ...
441!> \param comm_f ...
442!> \param comm_c ...
443!> \param C ...
444!> \param name="CP2K_MPI_Comm_f2c" ...
445! **************************************************************************************************
446 SUBROUTINE cp2k_c_mpi_comm_f2c(comm_f, comm_c) bind(C, name="CP2K_MPI_Comm_f2c")
447 import :: c_ptr, mp_comm_type, c_int
448 INTEGER(kind=C_INT), VALUE :: comm_f
449 TYPE(c_ptr) :: comm_c
450 END SUBROUTINE cp2k_c_mpi_comm_f2c
451 END INTERFACE
452 INTERFACE
453 SUBROUTINE openpmd_c_series_create_mpi(path, access, mpi_comm, config, series) &
454 BIND(C, name="openPMD_Series_create_mpi")
455 IMPORT :: c_ptr, c_char, c_int
456 CHARACTER(kind=C_CHAR), DIMENSION(*) :: path
457 INTEGER(kind=C_INT), VALUE :: access
458 TYPE(C_PTR), value :: mpi_comm
459 CHARACTER(kind=C_CHAR), DIMENSION(*) :: config
460 TYPE(C_PTR) :: series
461 END SUBROUTINE openpmd_c_series_create_mpi
462 END INTERFACE
463 INTERFACE
464 SUBROUTINE openpmd_c_series_create(path, access, config, series) &
465 BIND(C, name="openPMD_Series_create")
466 IMPORT :: c_ptr, c_char, c_int
467 TYPE(C_PTR) :: series
468 CHARACTER(kind=C_CHAR), DIMENSION(*) :: path
469 INTEGER(kind=C_INT), VALUE :: access
470 CHARACTER(kind=C_CHAR), DIMENSION(*) :: config
471 END SUBROUTINE openpmd_c_series_create
472 END INTERFACE
473
474 IF (PRESENT(config)) THEN
475 my_config => config
476 ELSE
477 my_config => default_config
478 END IF
479
480 cpassert(.NOT. c_associated(series%c_ptr))
481 IF (PRESENT(mpi_comm)) THEN
482 CALL cp2k_c_mpi_comm_f2c(mpi_comm%get_handle(), comm_c)
483 CALL openpmd_c_series_create_mpi( &
484 path=trim(path)//c_null_char, &
485 access=access, &
486 mpi_comm=comm_c, &
487 config=my_config//c_null_char, &
488 series=series%c_ptr)
489 ELSE
490 CALL openpmd_c_series_create( &
491 path=trim(path)//c_null_char, &
492 access=access, &
493 config=my_config//c_null_char, &
494 series=series%c_ptr)
495 END IF
496 cpassert(c_associated(series%c_ptr))
497 END FUNCTION openpmd_series_create
498
499! **************************************************************************************************
500!> \brief ...
501!> \param series ...
502! **************************************************************************************************
503 SUBROUTINE openpmd_series_close(series)
504 CLASS(openpmd_series_type), INTENT(INOUT) :: series
505
506 INTERFACE
507! **************************************************************************************************
508!> \brief ...
509!> \param series ...
510! **************************************************************************************************
511 SUBROUTINE openpmd_c_series_close(series) &
512 BIND(C, name="openPMD_Series_close")
513 IMPORT :: c_ptr
514 TYPE(C_PTR), VALUE :: series
515 END SUBROUTINE openpmd_c_series_close
516 END INTERFACE
517
518 cpassert(c_associated(series%c_ptr))
519 CALL openpmd_c_series_close(series=series%c_ptr)
520 series%c_ptr = c_null_ptr
521 END SUBROUTINE openpmd_series_close
522
523! **************************************************************************************************
524!> \brief ...
525!> \param this ...
526!> \param name ...
527!> \param version ...
528! **************************************************************************************************
529 SUBROUTINE openpmd_series_set_software(this, name, version)
530 CLASS(openpmd_series_type), INTENT(IN) :: this
531 CHARACTER(len=*), INTENT(IN) :: name
532 CHARACTER(len=*), INTENT(IN), OPTIONAL :: version
533
534 INTERFACE
535 SUBROUTINE openpmd_c_series_set_software(series, name, version) &
536 BIND(C, name="openPMD_Series_setSoftware")
537 IMPORT :: c_ptr, c_char
538 TYPE(C_PTR), VALUE :: series
539 CHARACTER(kind=C_CHAR), DIMENSION(*) :: name
540 CHARACTER(kind=C_CHAR), DIMENSION(*) :: version
541 END SUBROUTINE openpmd_c_series_set_software
542 END INTERFACE
543
544 cpassert(c_associated(this%c_ptr))
545 IF (PRESENT(version)) THEN
546 CALL openpmd_c_series_set_software(this%c_ptr, name//c_null_char, version//c_null_char)
547 ELSE
548 CALL openpmd_c_series_set_software(this%c_ptr, name//c_null_char, c_null_char)
549 END IF
550 END SUBROUTINE openpmd_series_set_software
551
552! **************************************************************************************************
553!> \brief ...
554!> \param series ...
555!> \param index ...
556!> \return ...
557! **************************************************************************************************
558 FUNCTION openpmd_series_write_iteration(this, index) RESULT(iteration)
559 CLASS(openpmd_series_type) :: this
560 INTEGER, TARGET :: index
561 TYPE(openpmd_iteration_type) :: iteration
562
563 INTEGER(8) :: cast_index
564 INTEGER(kind=C_INT) :: status
565 INTERFACE
566 FUNCTION openpmd_c_series_write_iteration(series, index, iteration) RESULT(status) &
567 BIND(C, name="openPMD_Series_write_Iteration")
568 IMPORT :: c_ptr, c_int64_t, c_int, c_size_t
569 TYPE(C_PTR), VALUE :: series
570 INTEGER(kind=C_INT64_T), VALUE :: index
571 TYPE(C_PTR) :: iteration
572 INTEGER(KIND=C_INT) :: status
573 END FUNCTION openpmd_c_series_write_iteration
574 END INTERFACE
575
576 cpassert(.NOT. c_associated(iteration%c_ptr))
577 cast_index = index
578 status = openpmd_c_series_write_iteration(this%c_ptr, cast_index, iteration%c_ptr)
579 cpassert(c_associated(iteration%c_ptr))
580 END FUNCTION openpmd_series_write_iteration
581
582 FUNCTION openpmd_series_get_iteration(this, index) RESULT(iteration)
583 CLASS(openpmd_series_type) :: this
584 INTEGER, TARGET :: index
585 TYPE(openpmd_iteration_type) :: iteration
586
587 INTEGER(8) :: cast_index
588 INTEGER(kind=C_INT) :: status
589 INTERFACE
590 FUNCTION openpmd_c_series_get_iteration(series, index, iteration) RESULT(status) &
591 BIND(C, name="openPMD_Series_get_Iteration")
592 IMPORT :: c_ptr, c_int64_t, c_int, c_size_t
593 TYPE(C_PTR), VALUE :: series
594 INTEGER(kind=C_INT64_T), VALUE :: index
595 TYPE(C_PTR) :: iteration
596 INTEGER(KIND=C_INT) :: status
597 END FUNCTION openpmd_c_series_get_iteration
598 END INTERFACE
599
600 cpassert(.NOT. c_associated(iteration%c_ptr))
601 cast_index = index
602 status = openpmd_c_series_get_iteration(this%c_ptr, cast_index, iteration%c_ptr)
603 cpassert(c_associated(iteration%c_ptr))
604 END FUNCTION openpmd_series_get_iteration
605
606! **************************************************************************************************
607!> \brief ...
608!> \return ...
609! **************************************************************************************************
610 FUNCTION openpmd_get_default_extension() RESULT(extension)
611 CHARACTER(len=default_string_length) :: extension
612
613 CHARACTER(LEN=1, KIND=C_CHAR), DIMENSION(:), &
614 POINTER :: c_extension_f
615 INTEGER(C_SIZE_T) :: c_extension_length, extension_length
616 INTEGER :: i
617 TYPE(C_PTR) :: c_extension
618 INTERFACE
619 FUNCTION openpmd_c_get_default_extension() RESULT(extension) &
620 BIND(c, name="openPMD_get_default_extension")
621 IMPORT :: c_ptr
622 TYPE(C_PTR) :: extension
623 END FUNCTION openpmd_c_get_default_extension
624 END INTERFACE
625 INTERFACE
626 FUNCTION get_strlen(c_string) RESULT(strlen) &
627 BIND(C, NAME="CP2K_strlen")
628 IMPORT :: c_ptr, c_size_t
629 TYPE(C_PTR), VALUE :: c_string
630 INTEGER(C_SIZE_T) :: strlen
631 END FUNCTION get_strlen
632 END INTERFACE
633
634 extension = ""
635 c_extension = openpmd_c_get_default_extension()
636 IF (.NOT. c_associated(c_extension)) RETURN
637
638 ! Map the C string to a Fortran character array.
639 c_extension_length = get_strlen(c_extension)
640 CALL c_f_pointer(c_extension, c_extension_f, &
641 shape=[int(c_extension_length) + 1])
642 cpassert(c_extension_f(int(c_extension_length) + 1) == c_null_char)
643
644 ! Copy the contents, truncating overly long extensions.
645 extension_length = min(c_extension_length, int(default_string_length, c_size_t))
646 DO i = 1, int(extension_length)
647 extension(i:i) = c_extension_f(i)
648 END DO
649
650 END FUNCTION openpmd_get_default_extension
651
652! **************************************************************************************************
653!> \brief ...
654!> \param attributable ...
655!> \param name ...
656!> \param vec ...
657! **************************************************************************************************
658 SUBROUTINE openpmd_attributable_set_attribute_vec_int(this, name, vec)
659 CLASS(openpmd_attributable_type) :: this
660 CHARACTER(len=*), INTENT(IN) :: name
661 INTEGER, DIMENSION(:), TARGET :: vec
662
663 INTEGER, TARGET :: size_
664 INTERFACE
665 SUBROUTINE openpmd_c_attributable_set_attribute_vec_int(attributable, name, vec, length) &
666 BIND(C, NAME="openPMD_attributable_set_attribute_vec_int")
667 IMPORT :: c_char, c_size_t, c_int, c_ptr
668 TYPE(C_PTR), VALUE :: attributable
669 CHARACTER(kind=C_CHAR), DIMENSION(*) :: name
670 TYPE(C_PTR), VALUE :: vec
671 INTEGER(kind=C_INT), VALUE :: length
672 END SUBROUTINE openpmd_c_attributable_set_attribute_vec_int
673 END INTERFACE
674
675 size_ = SIZE(vec)
676 CALL openpmd_c_attributable_set_attribute_vec_int( &
677 this%c_ptr, name//c_null_char, c_loc(vec(1)), size_)
678
679 END SUBROUTINE openpmd_attributable_set_attribute_vec_int
680
681 SUBROUTINE openpmd_attributable_series_flush(this, backendconfig)
682 CLASS(openpmd_attributable_type) :: this
683 CHARACTER(len=*), INTENT(IN), OPTIONAL :: backendconfig
684 CHARACTER(len=default_string_length), SAVE :: my_backendconfig = ""
685
686 INTERFACE
687 SUBROUTINE openpmd_c_attributable_series_flush(attributable, config) &
688 BIND(C, NAME="openPMD_Attributable_series_flush")
689 IMPORT :: c_char, c_size_t, c_int, c_ptr
690 TYPE(C_PTR), VALUE :: attributable
691 CHARACTER(kind=C_CHAR), DIMENSION(*) :: config
692 END SUBROUTINE openpmd_c_attributable_series_flush
693 END INTERFACE
694
695 IF (PRESENT(backendconfig)) my_backendconfig = backendconfig
696 CALL openpmd_c_attributable_series_flush(this%c_ptr, my_backendconfig//c_null_char)
697 END SUBROUTINE openpmd_attributable_series_flush
698
699 SUBROUTINE openpmd_iteration_set_time_unit_si(this, timeUnitSI)
700 CLASS(openpmd_iteration_type) :: this
701 REAL(kind=c_double), INTENT(IN), VALUE :: timeunitsi
702
703 INTERFACE
704 SUBROUTINE openpmd_c_iteration_set_time_unit_si(iteration, timeUnitSI) &
705 BIND(C, NAME="openPMD_Iteration_setTimeUnitSI")
706 IMPORT :: c_ptr, c_double
707 TYPE(C_PTR), VALUE :: iteration
708 REAL(kind=c_double), VALUE :: timeunitsi
709 END SUBROUTINE openpmd_c_iteration_set_time_unit_si
710 END INTERFACE
711
712 CALL openpmd_c_iteration_set_time_unit_si(this%c_ptr, timeunitsi)
713 END SUBROUTINE openpmd_iteration_set_time_unit_si
714
715 SUBROUTINE openpmd_iteration_set_time(this, time)
716 CLASS(openpmd_iteration_type) :: this
717 REAL(kind=c_double), INTENT(IN), VALUE :: time
718
719 INTERFACE
720 SUBROUTINE openpmd_c_iteration_set_time(iteration, time) &
721 BIND(C, NAME="openPMD_Iteration_setTime")
722 IMPORT :: c_ptr, c_double
723 TYPE(C_PTR), VALUE :: iteration
724 REAL(kind=c_double), VALUE :: time
725 END SUBROUTINE openpmd_c_iteration_set_time
726 END INTERFACE
727
728 CALL openpmd_c_iteration_set_time(this%c_ptr, time)
729 END SUBROUTINE openpmd_iteration_set_time
730
731 FUNCTION openpmd_json_merge(into, from, mpi_comm) RESULT(merged)
732 CHARACTER(len=*), INTENT(IN) :: into, from
733 CLASS(mp_comm_type), INTENT(in), OPTIONAL :: mpi_comm
734 CHARACTER(:), ALLOCATABLE :: merged
735 CHARACTER(LEN=1, KIND=C_CHAR), DIMENSION(:), &
736 POINTER :: c_merged_f
737 INTEGER(C_SIZE_T) :: length_of_c_string
738 INTEGER :: i
739 TYPE(C_PTR) :: c_merged, comm_c
740
741 INTERFACE
742! **************************************************************************************************
743!> \brief ...
744!> \param comm_f ...
745!> \param comm_c ...
746!> \param C ...
747!> \param name="CP2K_MPI_Comm_f2c" ...
748! **************************************************************************************************
749 SUBROUTINE cp2k_c_mpi_comm_f2c(comm_f, comm_c) bind(C, name="CP2K_MPI_Comm_f2c")
750 import :: c_ptr, mp_comm_type, c_int
751 INTEGER(kind=C_INT), VALUE :: comm_f
752 TYPE(c_ptr) :: comm_c
753 END SUBROUTINE cp2k_c_mpi_comm_f2c
754 END INTERFACE
755 INTERFACE
756 FUNCTION openpmd_c_json_merge(into, from, mpi_comm) RESULT(merged) &
757 BIND(C, NAME="openPMD_json_merge")
758 IMPORT :: c_char, c_ptr
759 CHARACTER(kind=C_CHAR), DIMENSION(*) :: into, from
760 TYPE(C_PTR), VALUE :: mpi_comm
761 TYPE(C_PTR) :: merged
762 END FUNCTION openpmd_c_json_merge
763 END INTERFACE
764 INTERFACE
765 FUNCTION get_strlen(c_string) RESULT(strlen) &
766 BIND(C, NAME="CP2K_strlen")
767 IMPORT :: c_ptr, c_size_t
768 TYPE(C_PTR), VALUE :: c_string
769 INTEGER(C_SIZE_T) :: strlen
770 END FUNCTION get_strlen
771 END INTERFACE
772 INTERFACE
773 SUBROUTINE free(c_string) &
774 BIND(C, NAME="CP2K_free")
775 IMPORT :: c_ptr
776 TYPE(C_PTR), VALUE :: c_string
777 END SUBROUTINE free
778 END INTERFACE
779
780 comm_c = c_null_ptr
781 IF (PRESENT(mpi_comm)) THEN
782 CALL cp2k_c_mpi_comm_f2c(mpi_comm%get_handle(), comm_c)
783 END IF
784
785 c_merged = openpmd_c_json_merge( &
786 into//c_null_char, from//c_null_char, comm_c)
787 cpassert(c_associated(c_merged))
788
789 length_of_c_string = get_strlen(c_merged)
790 CALL c_f_pointer(c_merged, c_merged_f, &
791 shape=[int(length_of_c_string) + 1])
792 cpassert(c_merged_f(int(length_of_c_string) + 1) == c_null_char)
793
794 ALLOCATE (CHARACTER(LEN=INT(length_of_c_string)) :: merged)
795 DO i = 1, int(length_of_c_string)
796 merged(i:i) = c_merged_f(i)
797 END DO
798
799 CALL free(c_merged)
800 END FUNCTION openpmd_json_merge
801
802! **************************************************************************************************
803!> \brief ...
804!> \param iteration ...
805!> \param name ...
806!> \return ...
807! **************************************************************************************************
808 FUNCTION openpmd_iteration_get_mesh(this, name) RESULT(mesh)
809 CLASS(openpmd_iteration_type) :: this
810 CHARACTER(len=*), INTENT(IN) :: name
811 TYPE(openpmd_mesh_type) :: mesh
812
813 INTEGER(kind=C_INT) :: status
814 INTERFACE
815 FUNCTION openpmd_c_iteration_get_mesh(iteration, name, mesh) RESULT(status) &
816 BIND(C, name="openPMD_Iteration_get_mesh")
817 IMPORT :: c_ptr, c_int64_t, c_int, c_size_t, c_char
818 TYPE(C_PTR), VALUE :: iteration
819 CHARACTER(kind=C_CHAR), DIMENSION(*) :: name
820 TYPE(C_PTR) :: mesh
821 INTEGER(KIND=C_INT) :: status
822 END FUNCTION openpmd_c_iteration_get_mesh
823 END INTERFACE
824
825 cpassert(.NOT. c_associated(mesh%c_ptr))
826 status = openpmd_c_iteration_get_mesh(this%c_ptr, name//c_null_char, mesh%c_ptr)
827 cpassert(c_associated(mesh%c_ptr))
828 END FUNCTION openpmd_iteration_get_mesh
829
830! **************************************************************************************************
831!> \brief ...
832!> \param iteration ...
833!> \param name ...
834!> \return ...
835! **************************************************************************************************
836 FUNCTION openpmd_iteration_get_particle_species(this, name) RESULT(particle_species)
837 CLASS(openpmd_iteration_type) :: this
838 CHARACTER(len=*), INTENT(IN) :: name
839 TYPE(openpmd_particle_species_type) :: particle_species
840
841 INTEGER(kind=C_INT) :: status
842 INTERFACE
843 FUNCTION openpmd_c_iteration_get_particle_species(iteration, name, particle_species) RESULT(status) &
844 BIND(C, name="openPMD_Iteration_get_particle_species")
845 IMPORT :: c_ptr, c_int64_t, c_int, c_size_t, c_char
846 TYPE(C_PTR), VALUE :: iteration
847 CHARACTER(kind=C_CHAR), DIMENSION(*) :: name
848 TYPE(C_PTR) :: particle_species
849 INTEGER(KIND=C_INT) :: status
850 END FUNCTION openpmd_c_iteration_get_particle_species
851 END INTERFACE
852
853 cpassert(.NOT. c_associated(particle_species%c_ptr))
854 status = openpmd_c_iteration_get_particle_species( &
855 this%c_ptr, name//c_null_char, particle_species%c_ptr)
856 cpassert(c_associated(particle_species%c_ptr))
857 END FUNCTION openpmd_iteration_get_particle_species
858
859! **************************************************************************************************
860!> \brief ...
861!> \param iteration ...
862! **************************************************************************************************
863 SUBROUTINE openpmd_iteration_open(iteration)
864 CLASS(openpmd_iteration_type), INTENT(INOUT) :: iteration
865
866 INTERFACE
867! **************************************************************************************************
868!> \brief ...
869!> \param iteration ...
870! **************************************************************************************************
871 SUBROUTINE openpmd_c_iteration_open(iteration) &
872 BIND(C, name="openPMD_Iteration_open")
873 IMPORT :: c_ptr
874 TYPE(C_PTR), VALUE :: iteration
875 END SUBROUTINE openpmd_c_iteration_open
876 END INTERFACE
877
878 cpassert(c_associated(iteration%c_ptr))
879 CALL openpmd_c_iteration_open(iteration=iteration%c_ptr)
880 END SUBROUTINE openpmd_iteration_open
881
882 SUBROUTINE openpmd_iteration_close(iteration)
883 CLASS(openpmd_iteration_type), INTENT(INOUT) :: iteration
884
885 INTERFACE
886! **************************************************************************************************
887!> \brief ...
888!> \param iteration ...
889! **************************************************************************************************
890 SUBROUTINE openpmd_c_iteration_close(iteration) &
891 BIND(C, name="openPMD_Iteration_close")
892 IMPORT :: c_ptr
893 TYPE(C_PTR), VALUE :: iteration
894 END SUBROUTINE openpmd_c_iteration_close
895 END INTERFACE
896
897 cpassert(c_associated(iteration%c_ptr))
898 CALL openpmd_c_iteration_close(iteration=iteration%c_ptr)
899 iteration%c_ptr = c_null_ptr
900 END SUBROUTINE openpmd_iteration_close
901
902 FUNCTION openpmd_iteration_closed(iteration) RESULT(res)
903 CLASS(openpmd_iteration_type), INTENT(IN) :: iteration
904 LOGICAL :: res
905
906 INTEGER(kind=C_INT) :: res_tmp
907
908 INTERFACE
909! **************************************************************************************************
910!> \brief ...
911!> \param iteration ...
912! **************************************************************************************************
913 FUNCTION openpmd_c_iteration_closed(iteration) RESULT(res) &
914 BIND(C, name="openPMD_Iteration_closed")
915 IMPORT :: c_ptr, c_int
916 TYPE(C_PTR), VALUE :: iteration
917 INTEGER(kind=C_INT) :: res
918 END FUNCTION openpmd_c_iteration_closed
919 END INTERFACE
920
921 cpassert(c_associated(iteration%c_ptr))
922 res_tmp = openpmd_c_iteration_closed(iteration=iteration%c_ptr)
923 IF (res_tmp == 0) THEN
924 res = .false.
925 ELSE
926 res = .true.
927 END IF
928 END FUNCTION openpmd_iteration_closed
929
930! **************************************************************************************************
931!> \brief ...
932!> \param record_component ...
933!> \param dtype ...
934!> \param dimensionality ...
935! **************************************************************************************************
936 SUBROUTINE openpmd_record_component_make_empty(this, dtype, dimensionality)
937 CLASS(openpmd_record_component_type) :: this
938 INTEGER(kind=C_INT) :: dtype
939 INTEGER :: dimensionality
940
941 INTEGER(kind=C_INT) :: status
942 INTERFACE
943 FUNCTION openpmd_c_record_component_make_empty(record_component, dtype, dimensionality) RESULT(status) &
944 BIND(C, name="openPMD_RecordComponent_makeEmpty")
945 IMPORT :: c_ptr, c_int64_t, c_int, c_size_t, c_char
946 TYPE(C_PTR), VALUE :: record_component
947 INTEGER(KIND=C_INT), VALUE :: dtype
948 INTEGER(KIND=C_INT), VALUE :: dimensionality
949 INTEGER(KIND=C_INT) :: status
950 END FUNCTION openpmd_c_record_component_make_empty
951 END INTERFACE
952
953 status = openpmd_c_record_component_make_empty(this%c_ptr, dtype, dimensionality)
954 END SUBROUTINE openpmd_record_component_make_empty
955
956! **************************************************************************************************
957!> \brief ...
958!> \param record_component ...
959!> \param dtype ...
960!> \param extent ...
961! **************************************************************************************************
962 SUBROUTINE openpmd_record_component_make_constant_zero(this, dtype, extent)
963 CLASS(openpmd_record_component_type) :: this
964 INTEGER(kind=C_INT) :: dtype
965 INTEGER, DIMENSION(:), TARGET :: extent
966
967 INTEGER(kind=C_INT) :: status
968 INTERFACE
969 FUNCTION openpmd_c_record_component_make_constant( &
970 record_component, dtype, dimensions, extent, invert, value) RESULT(status) &
971 BIND(C, name="openPMD_RecordComponent_makeConstant")
972 IMPORT :: c_ptr, c_int64_t, c_int, c_size_t, c_char
973 TYPE(C_PTR), VALUE :: record_component
974 INTEGER(KIND=C_INT), VALUE :: dtype
975 INTEGER(KIND=C_INT), VALUE :: dimensions, invert
976 TYPE(C_PTR), VALUE :: extent
977 TYPE(C_PTR), VALUE :: value
978 INTEGER(KIND=C_INT) :: status
979 END FUNCTION openpmd_c_record_component_make_constant
980 END INTERFACE
981
982 status = openpmd_c_record_component_make_constant( &
983 this%c_ptr, dtype, SIZE(extent), c_loc(extent(1)), 1, c_null_ptr)
984 END SUBROUTINE openpmd_record_component_make_constant_zero
985
986 SUBROUTINE openpmd_mesh_set_axis_labels(this, labels)
987 CLASS(openpmd_mesh_type) :: this
988 CHARACTER(len=*), DIMENSION(:) :: labels
989
990 INTEGER :: i
991 CHARACTER(len=default_string_length), ALLOCATABLE, TARGET :: labels_as_null_terminated_strings(:)
992 TYPE(C_PTR), ALLOCATABLE, TARGET :: labels_as_c_strings(:)
993
994 INTERFACE
995 SUBROUTINE openpmd_c_mesh_set_axis_labels(mesh, labels, len_labels, invert) &
996 BIND(C, NAME="openPMD_Mesh_set_axis_labels")
997 IMPORT :: c_char, c_size_t, c_int, c_ptr
998 TYPE(C_PTR), VALUE :: mesh
999 TYPE(C_PTR), VALUE :: labels
1000 INTEGER(kind=C_INT), VALUE :: len_labels, invert
1001 END SUBROUTINE openpmd_c_mesh_set_axis_labels
1002 END INTERFACE
1003
1004 ALLOCATE (labels_as_null_terminated_strings(SIZE(labels)))
1005 ALLOCATE (labels_as_c_strings(SIZE(labels)))
1006
1007 DO i = 1, SIZE(labels)
1008 labels_as_null_terminated_strings(i) = trim(labels(i))//c_null_char
1009 labels_as_c_strings(i) = c_loc(labels_as_null_terminated_strings(i))
1010 END DO
1011
1012 CALL openpmd_c_mesh_set_axis_labels(this%c_ptr, c_loc(labels_as_c_strings(1)), SIZE(labels), invert=1)
1013
1014 DEALLOCATE (labels_as_c_strings)
1015 DEALLOCATE (labels_as_null_terminated_strings)
1016 END SUBROUTINE openpmd_mesh_set_axis_labels
1017
1018 SUBROUTINE openpmd_record_component_reset_dataset(this, dtype, extent, cfg)
1019 CLASS(openpmd_record_component_type) :: this
1020 INTEGER(kind=C_INT) :: dtype
1021 INTEGER, DIMENSION(:), TARGET :: extent
1022 CHARACTER(len=*), OPTIONAL :: cfg
1023
1024 CHARACTER(len=default_string_length), SAVE :: my_config = "{}"
1025 INTEGER(kind=C_INT) :: status
1026 INTERFACE
1027 FUNCTION openpmd_c_record_component_reset_dataset( &
1028 record_component, dtype, dimensions, extent, invert, cfg) RESULT(status) &
1029 BIND(C, name="openPMD_RecordComponent_resetDataset")
1030 IMPORT :: c_ptr, c_int64_t, c_int, c_size_t, c_char
1031 TYPE(C_PTR), VALUE :: record_component
1032 INTEGER(KIND=C_INT), VALUE :: dtype
1033 INTEGER(KIND=C_INT), VALUE :: dimensions, invert
1034 TYPE(C_PTR), VALUE :: extent
1035 CHARACTER(kind=C_CHAR), DIMENSION(*) :: cfg
1036 INTEGER(KIND=C_INT) :: status
1037 END FUNCTION openpmd_c_record_component_reset_dataset
1038 END INTERFACE
1039
1040 IF (PRESENT(cfg)) my_config = cfg
1041
1042 status = openpmd_c_record_component_reset_dataset( &
1043 this%c_ptr, dtype, SIZE(extent), c_loc(extent(1)), 1, my_config//c_null_char)
1044 END SUBROUTINE openpmd_record_component_reset_dataset
1045
1046 SUBROUTINE openpmd_record_component_set_unit_si(this, unitSI)
1047 CLASS(openpmd_record_component_type) :: this
1048 REAL(kind=c_double), INTENT(IN), VALUE :: unitsi
1049
1050 INTERFACE
1051 SUBROUTINE openpmd_c_record_component_set_unit_si(record_component, unitSI) &
1052 BIND(C, NAME="openPMD_RecordComponent_setUnitSI")
1053 IMPORT :: c_ptr, c_double
1054 TYPE(C_PTR), VALUE :: record_component
1055 REAL(kind=c_double), VALUE :: unitsi
1056 END SUBROUTINE openpmd_c_record_component_set_unit_si
1057 END INTERFACE
1058
1059 CALL openpmd_c_record_component_set_unit_si(this%c_ptr, unitsi)
1060 END SUBROUTINE openpmd_record_component_set_unit_si
1061
1062 ! e.g. ':,:,:'
1063 SUBROUTINE openpmd_record_component_store_chunk_1d_double (record_component, data_, offset)
1064 CLASS(openpmd_record_component_type) :: record_component
1065 REAL(kind=dp), TARGET :: data_(:)
1066 INTEGER, DIMENSION(1), TARGET :: offset, extent
1067
1068 INTEGER(kind=C_INT) :: status
1069
1070 INTERFACE
1071 FUNCTION openpmd_c_record_component_store_chunk( &
1072 record_component, dtype, dimensions, offset, extent, invert, data_) RESULT(status) &
1073 BIND(C, name="openPMD_RecordComponent_storeChunk")
1074 IMPORT :: c_ptr, c_int64_t, c_int, c_size_t, c_char
1075 TYPE(C_PTR), VALUE :: record_component
1076 INTEGER(KIND=C_INT), VALUE :: dtype
1077 INTEGER(KIND=C_INT), VALUE :: dimensions, invert
1078 TYPE(C_PTR), VALUE :: offset, extent
1079 TYPE(C_PTR), VALUE :: data_
1080 INTEGER(KIND=C_INT) :: status
1081 END FUNCTION openpmd_c_record_component_store_chunk
1082 END INTERFACE
1083
1084 extent = shape(data_)
1085 status = openpmd_c_record_component_store_chunk( &
1086 record_component%c_ptr, &
1087 openpmd_type_double, &
1088 1, &
1089 c_loc(offset(1)), &
1090 c_loc(extent(1)), &
1091 1, &
1092 c_loc(data_))
1093
1094 END SUBROUTINE openpmd_record_component_store_chunk_1d_double
1095
1096 FUNCTION openpmd_record_component_store_chunk_span_1d_double ( &
1097 record_component, offset, extent) RESULT(memory_view)
1098 CLASS(openpmd_record_component_type) :: record_component
1099 INTEGER, DIMENSION(1), TARGET :: offset, extent
1100
1101 TYPE(openpmd_dynamic_memory_view_type_1d) :: memory_view
1102
1103 INTEGER(kind=C_INT) :: status
1104
1105 INTERFACE
1106 FUNCTION openpmd_c_record_component_store_chunk_span( &
1107 record_component, dtype, dimensions, offset, extent, invert, memory_view) RESULT(status) &
1108 BIND(C, name="openPMD_RecordComponent_storeChunkSpan")
1109 IMPORT :: c_ptr, c_int64_t, c_int, c_size_t, c_char
1110 TYPE(C_PTR), VALUE :: record_component
1111 INTEGER(KIND=C_INT), VALUE :: dtype
1112 INTEGER(KIND=C_INT), VALUE :: dimensions, invert
1113 TYPE(C_PTR), VALUE :: offset, extent
1114 TYPE(C_PTR) :: memory_view
1115 INTEGER(KIND=C_INT) :: status
1116 END FUNCTION openpmd_c_record_component_store_chunk_span
1117 END INTERFACE
1118
1119 memory_view%chunk_extent = extent
1120 status = openpmd_c_record_component_store_chunk_span( &
1121 record_component%c_ptr, &
1122 openpmd_type_double, &
1123 1, &
1124 c_loc(offset(1)), &
1125 c_loc(extent(1)), &
1126 1, &
1127 memory_view%c_ptr)
1128
1129 END FUNCTION openpmd_record_component_store_chunk_span_1d_double
1130
1131 FUNCTION openpmd_dynamic_memory_view_resolve_1d_double (memory_view, deallocate) RESULT(buffer)
1132 CLASS(openpmd_dynamic_memory_view_type_1d) :: memory_view
1133 LOGICAL :: deallocate
1134 REAL(kind=dp), POINTER :: buffer(:)
1135
1136 INTEGER(kind=C_INT) :: status, deallocate_c
1137 TYPE(C_PTR), TARGET :: c_buffer
1138
1139 INTERFACE
1140 FUNCTION openpmd_c_dynamic_memory_view_resolve(memory_view, deallocate, write_buffer) RESULT(status) &
1141 BIND(C, name="openPMD_DynamicMemoryView_resolve")
1142 IMPORT :: c_ptr, c_int
1143 TYPE(C_PTR), VALUE :: memory_view
1144 INTEGER(KIND=C_INT), VALUE :: deallocate
1145 TYPE(C_PTR) :: write_buffer
1146 INTEGER(KIND=C_INT) :: status
1147 END FUNCTION openpmd_c_dynamic_memory_view_resolve
1148 END INTERFACE
1149
1150 IF (deallocate) THEN
1151 deallocate_c = 1
1152 ELSE
1153 deallocate_c = 0
1154 END IF
1155
1156 status = openpmd_c_dynamic_memory_view_resolve(memory_view%c_ptr, deallocate_c, c_buffer)
1157 CALL c_f_pointer(c_buffer, buffer, memory_view%chunk_extent)
1158 END FUNCTION openpmd_dynamic_memory_view_resolve_1d_double
1159 ! e.g. ':,:,:'
1160 SUBROUTINE openpmd_record_component_store_chunk_2d_double (record_component, data_, offset)
1161 CLASS(openpmd_record_component_type) :: record_component
1162 REAL(kind=dp), TARGET :: data_(:,:)
1163 INTEGER, DIMENSION(2), TARGET :: offset, extent
1164
1165 INTEGER(kind=C_INT) :: status
1166
1167 INTERFACE
1168 FUNCTION openpmd_c_record_component_store_chunk( &
1169 record_component, dtype, dimensions, offset, extent, invert, data_) RESULT(status) &
1170 BIND(C, name="openPMD_RecordComponent_storeChunk")
1171 IMPORT :: c_ptr, c_int64_t, c_int, c_size_t, c_char
1172 TYPE(C_PTR), VALUE :: record_component
1173 INTEGER(KIND=C_INT), VALUE :: dtype
1174 INTEGER(KIND=C_INT), VALUE :: dimensions, invert
1175 TYPE(C_PTR), VALUE :: offset, extent
1176 TYPE(C_PTR), VALUE :: data_
1177 INTEGER(KIND=C_INT) :: status
1178 END FUNCTION openpmd_c_record_component_store_chunk
1179 END INTERFACE
1180
1181 extent = shape(data_)
1182 status = openpmd_c_record_component_store_chunk( &
1183 record_component%c_ptr, &
1184 openpmd_type_double, &
1185 2, &
1186 c_loc(offset(1)), &
1187 c_loc(extent(1)), &
1188 1, &
1189 c_loc(data_))
1190
1191 END SUBROUTINE openpmd_record_component_store_chunk_2d_double
1192
1193 FUNCTION openpmd_record_component_store_chunk_span_2d_double ( &
1194 record_component, offset, extent) RESULT(memory_view)
1195 CLASS(openpmd_record_component_type) :: record_component
1196 INTEGER, DIMENSION(2), TARGET :: offset, extent
1197
1198 TYPE(openpmd_dynamic_memory_view_type_2d) :: memory_view
1199
1200 INTEGER(kind=C_INT) :: status
1201
1202 INTERFACE
1203 FUNCTION openpmd_c_record_component_store_chunk_span( &
1204 record_component, dtype, dimensions, offset, extent, invert, memory_view) RESULT(status) &
1205 BIND(C, name="openPMD_RecordComponent_storeChunkSpan")
1206 IMPORT :: c_ptr, c_int64_t, c_int, c_size_t, c_char
1207 TYPE(C_PTR), VALUE :: record_component
1208 INTEGER(KIND=C_INT), VALUE :: dtype
1209 INTEGER(KIND=C_INT), VALUE :: dimensions, invert
1210 TYPE(C_PTR), VALUE :: offset, extent
1211 TYPE(C_PTR) :: memory_view
1212 INTEGER(KIND=C_INT) :: status
1213 END FUNCTION openpmd_c_record_component_store_chunk_span
1214 END INTERFACE
1215
1216 memory_view%chunk_extent = extent
1217 status = openpmd_c_record_component_store_chunk_span( &
1218 record_component%c_ptr, &
1219 openpmd_type_double, &
1220 2, &
1221 c_loc(offset(1)), &
1222 c_loc(extent(1)), &
1223 1, &
1224 memory_view%c_ptr)
1225
1226 END FUNCTION openpmd_record_component_store_chunk_span_2d_double
1227
1228 FUNCTION openpmd_dynamic_memory_view_resolve_2d_double (memory_view, deallocate) RESULT(buffer)
1229 CLASS(openpmd_dynamic_memory_view_type_2d) :: memory_view
1230 LOGICAL :: deallocate
1231 REAL(kind=dp), POINTER :: buffer(:,:)
1232
1233 INTEGER(kind=C_INT) :: status, deallocate_c
1234 TYPE(C_PTR), TARGET :: c_buffer
1235
1236 INTERFACE
1237 FUNCTION openpmd_c_dynamic_memory_view_resolve(memory_view, deallocate, write_buffer) RESULT(status) &
1238 BIND(C, name="openPMD_DynamicMemoryView_resolve")
1239 IMPORT :: c_ptr, c_int
1240 TYPE(C_PTR), VALUE :: memory_view
1241 INTEGER(KIND=C_INT), VALUE :: deallocate
1242 TYPE(C_PTR) :: write_buffer
1243 INTEGER(KIND=C_INT) :: status
1244 END FUNCTION openpmd_c_dynamic_memory_view_resolve
1245 END INTERFACE
1246
1247 IF (deallocate) THEN
1248 deallocate_c = 1
1249 ELSE
1250 deallocate_c = 0
1251 END IF
1252
1253 status = openpmd_c_dynamic_memory_view_resolve(memory_view%c_ptr, deallocate_c, c_buffer)
1254 CALL c_f_pointer(c_buffer, buffer, memory_view%chunk_extent)
1255 END FUNCTION openpmd_dynamic_memory_view_resolve_2d_double
1256 ! e.g. ':,:,:'
1257 SUBROUTINE openpmd_record_component_store_chunk_3d_double (record_component, data_, offset)
1258 CLASS(openpmd_record_component_type) :: record_component
1259 REAL(kind=dp), TARGET :: data_(:,:,:)
1260 INTEGER, DIMENSION(3), TARGET :: offset, extent
1261
1262 INTEGER(kind=C_INT) :: status
1263
1264 INTERFACE
1265 FUNCTION openpmd_c_record_component_store_chunk( &
1266 record_component, dtype, dimensions, offset, extent, invert, data_) RESULT(status) &
1267 BIND(C, name="openPMD_RecordComponent_storeChunk")
1268 IMPORT :: c_ptr, c_int64_t, c_int, c_size_t, c_char
1269 TYPE(C_PTR), VALUE :: record_component
1270 INTEGER(KIND=C_INT), VALUE :: dtype
1271 INTEGER(KIND=C_INT), VALUE :: dimensions, invert
1272 TYPE(C_PTR), VALUE :: offset, extent
1273 TYPE(C_PTR), VALUE :: data_
1274 INTEGER(KIND=C_INT) :: status
1275 END FUNCTION openpmd_c_record_component_store_chunk
1276 END INTERFACE
1277
1278 extent = shape(data_)
1279 status = openpmd_c_record_component_store_chunk( &
1280 record_component%c_ptr, &
1281 openpmd_type_double, &
1282 3, &
1283 c_loc(offset(1)), &
1284 c_loc(extent(1)), &
1285 1, &
1286 c_loc(data_))
1287
1288 END SUBROUTINE openpmd_record_component_store_chunk_3d_double
1289
1290 FUNCTION openpmd_record_component_store_chunk_span_3d_double ( &
1291 record_component, offset, extent) RESULT(memory_view)
1292 CLASS(openpmd_record_component_type) :: record_component
1293 INTEGER, DIMENSION(3), TARGET :: offset, extent
1294
1295 TYPE(openpmd_dynamic_memory_view_type_3d) :: memory_view
1296
1297 INTEGER(kind=C_INT) :: status
1298
1299 INTERFACE
1300 FUNCTION openpmd_c_record_component_store_chunk_span( &
1301 record_component, dtype, dimensions, offset, extent, invert, memory_view) RESULT(status) &
1302 BIND(C, name="openPMD_RecordComponent_storeChunkSpan")
1303 IMPORT :: c_ptr, c_int64_t, c_int, c_size_t, c_char
1304 TYPE(C_PTR), VALUE :: record_component
1305 INTEGER(KIND=C_INT), VALUE :: dtype
1306 INTEGER(KIND=C_INT), VALUE :: dimensions, invert
1307 TYPE(C_PTR), VALUE :: offset, extent
1308 TYPE(C_PTR) :: memory_view
1309 INTEGER(KIND=C_INT) :: status
1310 END FUNCTION openpmd_c_record_component_store_chunk_span
1311 END INTERFACE
1312
1313 memory_view%chunk_extent = extent
1314 status = openpmd_c_record_component_store_chunk_span( &
1315 record_component%c_ptr, &
1316 openpmd_type_double, &
1317 3, &
1318 c_loc(offset(1)), &
1319 c_loc(extent(1)), &
1320 1, &
1321 memory_view%c_ptr)
1322
1323 END FUNCTION openpmd_record_component_store_chunk_span_3d_double
1324
1325 FUNCTION openpmd_dynamic_memory_view_resolve_3d_double (memory_view, deallocate) RESULT(buffer)
1326 CLASS(openpmd_dynamic_memory_view_type_3d) :: memory_view
1327 LOGICAL :: deallocate
1328 REAL(kind=dp), POINTER :: buffer(:,:,:)
1329
1330 INTEGER(kind=C_INT) :: status, deallocate_c
1331 TYPE(C_PTR), TARGET :: c_buffer
1332
1333 INTERFACE
1334 FUNCTION openpmd_c_dynamic_memory_view_resolve(memory_view, deallocate, write_buffer) RESULT(status) &
1335 BIND(C, name="openPMD_DynamicMemoryView_resolve")
1336 IMPORT :: c_ptr, c_int
1337 TYPE(C_PTR), VALUE :: memory_view
1338 INTEGER(KIND=C_INT), VALUE :: deallocate
1339 TYPE(C_PTR) :: write_buffer
1340 INTEGER(KIND=C_INT) :: status
1341 END FUNCTION openpmd_c_dynamic_memory_view_resolve
1342 END INTERFACE
1343
1344 IF (deallocate) THEN
1345 deallocate_c = 1
1346 ELSE
1347 deallocate_c = 0
1348 END IF
1349
1350 status = openpmd_c_dynamic_memory_view_resolve(memory_view%c_ptr, deallocate_c, c_buffer)
1351 CALL c_f_pointer(c_buffer, buffer, memory_view%chunk_extent)
1352 END FUNCTION openpmd_dynamic_memory_view_resolve_3d_double
1353
1354! **************************************************************************************************
1355!> \brief ...
1356!> \param particle_species ...
1357!> \param name ...
1358!> \return ...
1359! **************************************************************************************************
1360 FUNCTION openpmd_particle_species_get_record(this, name) RESULT(record)
1361 CLASS(openpmd_particle_species_type) :: this
1362 CHARACTER(len=*), INTENT(IN) :: name
1363 TYPE(openpmd_record_type) :: record
1364
1365 INTEGER(kind=C_INT) :: status
1366 INTERFACE
1367 FUNCTION openpmd_c_particle_species_get_record(particle_species, name, record) RESULT(status) &
1368 BIND(C, name="openPMD_ParticleSpecies_get_Record")
1369 IMPORT :: c_ptr, c_int64_t, c_int, c_size_t, c_char
1370 TYPE(C_PTR), VALUE :: particle_species
1371 CHARACTER(kind=C_CHAR), DIMENSION(*) :: name
1372 TYPE(C_PTR) :: record
1373 INTEGER(KIND=C_INT) :: status
1374 END FUNCTION openpmd_c_particle_species_get_record
1375 END INTERFACE
1376
1377 cpassert(.NOT. c_associated(record%c_ptr))
1378 status = openpmd_c_particle_species_get_record(this%c_ptr, name//c_null_char, record%c_ptr)
1379 cpassert(c_associated(record%c_ptr))
1380 END FUNCTION openpmd_particle_species_get_record
1381
1382! **************************************************************************************************
1383!> \brief ...
1384!> \param record ...
1385!> \param name ...
1386!> \return ...
1387! **************************************************************************************************
1388 FUNCTION openpmd_record_get_component(this, name) RESULT(record_component)
1389 CLASS(openpmd_record_type) :: this
1390 CHARACTER(len=*), INTENT(IN) :: name
1391 TYPE(openpmd_record_component_type) :: record_component
1392
1393 INTEGER(kind=C_INT) :: status
1394 INTERFACE
1395 FUNCTION openpmd_c_record_get_component(record, name, record_component) RESULT(status) &
1396 BIND(C, name="openPMD_Record_get_Component")
1397 IMPORT :: c_ptr, c_int64_t, c_int, c_size_t, c_char
1398 TYPE(C_PTR), VALUE :: record
1399 CHARACTER(kind=C_CHAR), DIMENSION(*) :: name
1400 TYPE(C_PTR) :: record_component
1401 INTEGER(KIND=C_INT) :: status
1402 END FUNCTION openpmd_c_record_get_component
1403 END INTERFACE
1404
1405 cpassert(.NOT. c_associated(record_component%c_ptr))
1406 status = openpmd_c_record_get_component(this%c_ptr, name//c_null_char, record_component%c_ptr)
1407 cpassert(c_associated(record_component%c_ptr))
1408 END FUNCTION openpmd_record_get_component
1409
1410 ! L = 0, //!< length
1411 ! M, //!< mass
1412 ! T, //!< time
1413 ! I, //!< electric current
1414 ! theta, //!< thermodynamic temperature
1415 ! N, //!< amount of substance
1416 ! J //!< luminous intensity
1417 SUBROUTINE openpmd_record_set_unit_dimension(this, unitDimension)
1418 CLASS(openpmd_record_type) :: this
1419 REAL(kind=c_double), DIMENSION(7), TARGET :: unitdimension
1420
1421 INTERFACE
1422 SUBROUTINE openpmd_c_record_set_unit_dimension(record, unitDimension) &
1423 BIND(C, NAME="openPMD_Record_setUnitDimension")
1424 IMPORT :: c_ptr, c_double
1425 TYPE(C_PTR), VALUE :: record
1426 REAL(kind=c_double), DIMENSION(*) :: unitdimension
1427 END SUBROUTINE openpmd_c_record_set_unit_dimension
1428 END INTERFACE
1429
1430 CALL openpmd_c_record_set_unit_dimension(this%c_ptr, unitdimension)
1431 END SUBROUTINE openpmd_record_set_unit_dimension
1432
1433
1434 SUBROUTINE openpmd_mesh_set_grid_global_offset (this, vec)
1435 CLASS(openpmd_mesh_type) :: this
1436 REAL(KIND=dp), DIMENSION(:), TARGET :: vec
1437
1438 INTEGER, TARGET :: size_
1439 INTERFACE
1440 SUBROUTINE openpmd_c_set_vector_attribute(mesh, vec, length, invert) &
1441 BIND(C, NAME="openPMD_Mesh_setGridGlobalOffset")
1442 IMPORT :: c_char, c_size_t, c_int, c_ptr
1443 TYPE(C_PTR), VALUE :: mesh
1444 TYPE(C_PTR), VALUE :: vec
1445 INTEGER(kind=C_INT), VALUE :: length, invert
1446 END SUBROUTINE openpmd_c_set_vector_attribute
1447 END INTERFACE
1448
1449 size_ = SIZE(vec)
1450 CALL openpmd_c_set_vector_attribute(this%c_ptr, c_loc(vec(1)), size_, 1)
1451
1452 END SUBROUTINE openpmd_mesh_set_grid_global_offset
1453 SUBROUTINE openpmd_mesh_set_grid_spacing (this, vec)
1454 CLASS(openpmd_mesh_type) :: this
1455 REAL(KIND=dp), DIMENSION(:), TARGET :: vec
1456
1457 INTEGER, TARGET :: size_
1458 INTERFACE
1459 SUBROUTINE openpmd_c_set_vector_attribute(mesh, vec, length, invert) &
1460 BIND(C, NAME="openPMD_Mesh_setGridSpacing")
1461 IMPORT :: c_char, c_size_t, c_int, c_ptr
1462 TYPE(C_PTR), VALUE :: mesh
1463 TYPE(C_PTR), VALUE :: vec
1464 INTEGER(kind=C_INT), VALUE :: length, invert
1465 END SUBROUTINE openpmd_c_set_vector_attribute
1466 END INTERFACE
1467
1468 size_ = SIZE(vec)
1469 CALL openpmd_c_set_vector_attribute(this%c_ptr, c_loc(vec(1)), size_, 1)
1470
1471 END SUBROUTINE openpmd_mesh_set_grid_spacing
1472 SUBROUTINE openpmd_mesh_set_position (this, vec)
1473 CLASS(openpmd_mesh_type) :: this
1474 REAL(KIND=dp), DIMENSION(:), TARGET :: vec
1475
1476 INTEGER, TARGET :: size_
1477 INTERFACE
1478 SUBROUTINE openpmd_c_set_vector_attribute(mesh, vec, length, invert) &
1479 BIND(C, NAME="openPMD_Mesh_setPosition")
1480 IMPORT :: c_char, c_size_t, c_int, c_ptr
1481 TYPE(C_PTR), VALUE :: mesh
1482 TYPE(C_PTR), VALUE :: vec
1483 INTEGER(kind=C_INT), VALUE :: length, invert
1484 END SUBROUTINE openpmd_c_set_vector_attribute
1485 END INTERFACE
1486
1487 size_ = SIZE(vec)
1488 CALL openpmd_c_set_vector_attribute(this%c_ptr, c_loc(vec(1)), size_, 1)
1489
1490 END SUBROUTINE openpmd_mesh_set_position
1491
1492 SUBROUTINE openpmd_mesh_set_grid_unit_si(this, gridUnitSI)
1493 CLASS(openpmd_mesh_type) :: this
1494 REAL(kind=c_double), INTENT(IN), VALUE :: gridunitsi
1495
1496 INTERFACE
1497 SUBROUTINE openpmd_c_mesh_set_grid_unit_si(mesh, gridUnitSI) &
1498 BIND(C, NAME="openPMD_Mesh_setGridUnitSI")
1499 IMPORT :: c_ptr, c_double
1500 TYPE(C_PTR), VALUE :: mesh
1501 REAL(kind=c_double), VALUE :: gridunitsi
1502 END SUBROUTINE openpmd_c_mesh_set_grid_unit_si
1503 END INTERFACE
1504
1505 CALL openpmd_c_mesh_set_grid_unit_si(this%c_ptr, gridunitsi)
1506 END SUBROUTINE openpmd_mesh_set_grid_unit_si
1507
1508 ! L = 0, //!< length
1509 ! M, //!< mass
1510 ! T, //!< time
1511 ! I, //!< electric current
1512 ! theta, //!< thermodynamic temperature
1513 ! N, //!< amount of substance
1514 ! J //!< luminous intensity
1515 SUBROUTINE openpmd_mesh_set_unit_dimension(this, unitDimension)
1516 CLASS(openpmd_mesh_type) :: this
1517 REAL(kind=c_double), DIMENSION(7), TARGET :: unitdimension
1518
1519 INTERFACE
1520 SUBROUTINE openpmd_c_mesh_set_unit_dimension(mesh, unitDimension) &
1521 BIND(C, NAME="openPMD_Mesh_setUnitDimension")
1522 IMPORT :: c_ptr, c_double
1523 TYPE(C_PTR), VALUE :: mesh
1524 REAL(kind=c_double), DIMENSION(*) :: unitdimension
1525 END SUBROUTINE openpmd_c_mesh_set_unit_dimension
1526 END INTERFACE
1527
1528 CALL openpmd_c_mesh_set_unit_dimension(this%c_ptr, unitdimension)
1529 END SUBROUTINE openpmd_mesh_set_unit_dimension
1530#endif
1531 END MODULE openpmd_api
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
integer, parameter, public sp
Definition kinds.F:33
Interface to the message passing library MPI.