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