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