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