ParaMonte Fortran 2.0.0
Parallel Monte Carlo and Machine Learning Library
See the latest version documentation.
pm_parallelism.F90
Go to the documentation of this file.
1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3!!!! !!!!
4!!!! ParaMonte: Parallel Monte Carlo and Machine Learning Library. !!!!
5!!!! !!!!
6!!!! Copyright (C) 2012-present, The Computational Data Science Lab !!!!
7!!!! !!!!
8!!!! This file is part of the ParaMonte library. !!!!
9!!!! !!!!
10!!!! LICENSE !!!!
11!!!! !!!!
12!!!! https://github.com/cdslaborg/paramonte/blob/main/LICENSE.md !!!!
13!!!! !!!!
14!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
15!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
16
32
33!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
34
36
37 use pm_kind, only: SK, IK, LK
38 use pm_val2str, only: getStr
39
40 implicit none
41
42 character(*, SK), parameter :: MODULE_NAME = SK_"@pm_parallelism"
43
44#if CAF_ENABLED || MPI_ENABLED
45
49 character(*, SK), parameter :: PARALLELIZATION_MODE = SK_"parallel"
50#else
51 character(*, SK), parameter :: PARALLELIZATION_MODE = SK_"serial"
52#endif
53
54!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
55
79 logical(LK) :: first = .false._LK
80 logical(LK) :: extra = .false._LK
81 logical(LK) :: leader = .false._LK
84 logical(LK) :: rooter = .false._LK
87 end type
88
134 integer(IK) :: count = -huge(1_IK)
135 integer(IK) :: id = -huge(1_IK)
137 character(:, SK), allocatable :: label
138 contains
139 procedure, nopass :: sync => setImageSynced
140 procedure, nopass :: finalize => setImageFinalized
141 end type
142
144 interface image_type
145 module procedure :: image_typer
146 end interface
148
149!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
150
228
230
231 !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
232
233#if RK5_ENABLED
234 PURE module subroutine setForkJoinScaling_RK5(conProb, seqSecTime, parSecTime, comSecTime, scaling, numproc, scalingMaxVal, scalingMaxLoc, scalingMinLen)
235#if __INTEL_COMPILER && DLL_ENABLED && (_WIN32 || _WIN64)
236 !DEC$ ATTRIBUTES DLLEXPORT :: setForkJoinScaling_RK5
237#endif
238 use pm_kind, only: RKG => RK5
239 integer(IK) , intent(out) :: scalingMaxLoc
240 integer(IK) , intent(in) , optional :: scalingMinLen
241 integer(IK) , intent(out) , allocatable :: numproc(:)
242 real(RKG) , intent(out) , allocatable :: scaling(:)
243 real(RKG) , intent(in) :: conProb, seqSecTime, parSecTime, comSecTime
244 real(RKG) , intent(out) :: scalingMaxVal
245 end subroutine
246#endif
247
248#if RK4_ENABLED
249 PURE module subroutine setForkJoinScaling_RK4(conProb, seqSecTime, parSecTime, comSecTime, scaling, numproc, scalingMaxVal, scalingMaxLoc, scalingMinLen)
250#if __INTEL_COMPILER && DLL_ENABLED && (_WIN32 || _WIN64)
251 !DEC$ ATTRIBUTES DLLEXPORT :: setForkJoinScaling_RK4
252#endif
253 use pm_kind, only: RKG => RK4
254 integer(IK) , intent(out) :: scalingMaxLoc
255 integer(IK) , intent(in) , optional :: scalingMinLen
256 integer(IK) , intent(out) , allocatable :: numproc(:)
257 real(RKG) , intent(out) , allocatable :: scaling(:)
258 real(RKG) , intent(in) :: conProb, seqSecTime, parSecTime, comSecTime
259 real(RKG) , intent(out) :: scalingMaxVal
260 end subroutine
261#endif
262
263#if RK3_ENABLED
264 PURE module subroutine setForkJoinScaling_RK3(conProb, seqSecTime, parSecTime, comSecTime, scaling, numproc, scalingMaxVal, scalingMaxLoc, scalingMinLen)
265#if __INTEL_COMPILER && DLL_ENABLED && (_WIN32 || _WIN64)
266 !DEC$ ATTRIBUTES DLLEXPORT :: setForkJoinScaling_RK3
267#endif
268 use pm_kind, only: RKG => RK3
269 integer(IK) , intent(out) :: scalingMaxLoc
270 integer(IK) , intent(in) , optional :: scalingMinLen
271 integer(IK) , intent(out) , allocatable :: numproc(:)
272 real(RKG) , intent(out) , allocatable :: scaling(:)
273 real(RKG) , intent(in) :: conProb, seqSecTime, parSecTime, comSecTime
274 real(RKG) , intent(out) :: scalingMaxVal
275 end subroutine
276#endif
277
278#if RK2_ENABLED
279 PURE module subroutine setForkJoinScaling_RK2(conProb, seqSecTime, parSecTime, comSecTime, scaling, numproc, scalingMaxVal, scalingMaxLoc, scalingMinLen)
280#if __INTEL_COMPILER && DLL_ENABLED && (_WIN32 || _WIN64)
281 !DEC$ ATTRIBUTES DLLEXPORT :: setForkJoinScaling_RK2
282#endif
283 use pm_kind, only: RKG => RK2
284 integer(IK) , intent(out) :: scalingMaxLoc
285 integer(IK) , intent(in) , optional :: scalingMinLen
286 integer(IK) , intent(out) , allocatable :: numproc(:)
287 real(RKG) , intent(out) , allocatable :: scaling(:)
288 real(RKG) , intent(in) :: conProb, seqSecTime, parSecTime, comSecTime
289 real(RKG) , intent(out) :: scalingMaxVal
290 end subroutine
291#endif
292
293#if RK1_ENABLED
294 PURE module subroutine setForkJoinScaling_RK1(conProb, seqSecTime, parSecTime, comSecTime, scaling, numproc, scalingMaxVal, scalingMaxLoc, scalingMinLen)
295#if __INTEL_COMPILER && DLL_ENABLED && (_WIN32 || _WIN64)
296 !DEC$ ATTRIBUTES DLLEXPORT :: setForkJoinScaling_RK1
297#endif
298 use pm_kind, only: RKG => RK1
299 integer(IK) , intent(out) :: scalingMaxLoc
300 integer(IK) , intent(in) , optional :: scalingMinLen
301 integer(IK) , intent(out) , allocatable :: numproc(:)
302 real(RKG) , intent(out) , allocatable :: scaling(:)
303 real(RKG) , intent(in) :: conProb, seqSecTime, parSecTime, comSecTime
304 real(RKG) , intent(out) :: scalingMaxVal
305 end subroutine
306#endif
307
308 !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
309
310 end interface
311
312!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
313
315#if OMP_ENABLED
316 logical(LK) , save :: mv_failed = .false._LK
317#endif
318
319
320!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
321
322contains
323
324!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
325
363 function image_typer() result(image)
364 type(image_type) :: image
365 !integer(IK), intent(in), optional :: nthread
366 ! setup general processor / coarray image variables
367 image%id = getImageID()
368 image%count = getImageCount()
369 image%label = SK_"@process("//getStr(image%id)//SK_")"
370 image%is%first = image%id == 1_IK
371 image%is%extra = image%id /= 1_IK
372 !image%is%leader = .false._LK ! ATTN: this is to be set by the user at runtime, depending on the parallelism type.
373 !image%is%rooter = .false._LK ! ATTN: this is to be set by the user at runtime, depending on the parallelism type.
374 end function
375
376!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
377
412 subroutine setImageSynced()
413#if __INTEL_COMPILER && DLL_ENABLED && (_WIN32 || _WIN64)
414 !DEC$ ATTRIBUTES DLLEXPORT :: setImageSynced
415#endif
416#if CAF_ENABLED
417 sync all
418#elif MPI_ENABLED
419 block
420 use mpi !, only: mpi_barrier, mpi_comm_world
421 integer :: ierrMPI
422 call mpi_barrier(mpi_comm_world, ierrMPI)
423 end block
424#elif OMP_ENABLED
425 !$omp barrier
426#endif
427 end subroutine
428
429!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
430
465 subroutine setImageFinalized() ! LCOV_EXCL_LINE
466#if __INTEL_COMPILER && DLL_ENABLED && (_WIN32 || _WIN64)
467 !DEC$ ATTRIBUTES DLLEXPORT :: setImageFinalized
468#endif
469#if CAF_ENABLED
470 sync all
471#elif MPI_ENABLED
472 use mpi !mpi_f08, only: mpi_comm_world, mpi_finalized, mpi_finalize, mpi_barrier
473 implicit none
474 integer :: ierrMPI
475 logical :: isFinalized
476 call mpi_finalized(isFinalized, ierrMPI)
477 if (.not. isFinalized) then
478 call mpi_barrier(mpi_comm_world, ierrMPI)
479 call mpi_finalize(ierrMPI)
480 end if
481#elif OMP_ENABLED
482 !$omp barrier
483#endif
484 end subroutine
485
486!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
487
523 function getImageID() result(imageID)
524#if __INTEL_COMPILER && DLL_ENABLED && (_WIN32 || _WIN64)
525 !DEC$ ATTRIBUTES DLLEXPORT :: getImageID
526#endif
527 integer(IK) :: imageID
528#if CAF_ENABLED
529 imageID = this_image()
530#elif MPI_ENABLED
531 block
532 use mpi !mpi_f08, only : mpi_initialized, mpi_comm_world, mpi_comm_size, mpi_init
533 integer :: rank, ierrMPI
534 logical :: isinit, isfinit
535 call mpi_initialized(isinit, ierrMPI)
536 if (.not. isinit) then
537 call mpi_finalized(isfinit, ierrMPI)
538 if (isfinit) error stop MODULE_NAME//"@getImageID(): Error occurred. A finalized MPI library cannot be reinitialized."
539 call mpi_init(ierrMPI)
540 end if
541 call mpi_comm_rank(mpi_comm_world, rank, ierrMPI)
542 if (ierrMPI /= 0) error stop "Failed to fetch the MPI process counts."
543 imageID = int(rank, IK) + 1_IK
544 end block
545#elif OMP_ENABLED
546 block
547 use omp_lib, only: omp_get_thread_num
548 imageID = int(omp_get_thread_num() + 1, IK)
549 end block
550#else
551 imageID = 1_IK
552#endif
553 end function
554
555!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
556
599 function getImageCount() result(imageCount)
600#if __INTEL_COMPILER && DLL_ENABLED && (_WIN32 || _WIN64)
601 !DEC$ ATTRIBUTES DLLEXPORT :: getImageCount
602#endif
603 integer(IK) :: imageCount
604#if CAF_ENABLED
605 imageCount = num_images()
606#elif MPI_ENABLED
607 imageCount = getImageCountMPI()
608#elif OMP_ENABLED
609 imageCount = getImageCountOMP()
610#else
611 imageCount = 1_IK
612#endif
613 end function
614
615!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
616
654 function getImageCountMPI() result(imageCount) bind(C, name = "getImageCountMPI")
655#if __INTEL_COMPILER && DLL_ENABLED && (_WIN32 || _WIN64)
656 !DEC$ ATTRIBUTES DLLEXPORT :: getImageCountMPI
657#endif
658#if MPI_ENABLED
659 use mpi !mpi_f08, only : mpi_initialized, mpi_comm_world, mpi_comm_size, mpi_init
660 integer :: nproc
661 integer :: ierrMPI
662 logical :: isinit
663 integer(IK) :: imageCount
664 imageCount = 0_IK
665 call mpi_initialized(isinit, ierrMPI)
666 if (ierrMPI /= 0) return ! LCOV_EXCL_LINE
667 if (.not. isinit) then
668 call mpi_init(ierrMPI) ! LCOV_EXCL_LINE
669 if (ierrMPI /= 0) return ! LCOV_EXCL_LINE
670 end if
671 call mpi_comm_size(mpi_comm_world, nproc, ierrMPI)
672 if (ierrMPI /= 0) return ! LCOV_EXCL_LINE
673 imageCount = int(nproc, IK)
674#else
675 integer(IK) :: imageCount
676 imageCount = 0_IK
677#endif
678 end function
679
680!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
681
712 function getImageCountOMP() result(imageCount) bind(C, name = "getImageCountOMP")
713#if __INTEL_COMPILER && DLL_ENABLED && (_WIN32 || _WIN64)
714 !DEC$ ATTRIBUTES DLLEXPORT :: getImageCountOMP
715#endif
716#if OMP_ENABLED
717 use omp_lib, only: omp_get_num_threads
718 integer(IK) :: imageCount
719 imageCount = omp_get_num_threads()
720#else
721 integer(IK) :: imageCount
722 imageCount = 0_IK
723#endif
724 end function
725
726!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
727
761 subroutine setImageCount(count)
762#if __INTEL_COMPILER && DLL_ENABLED && (_WIN32 || _WIN64)
763 !DEC$ ATTRIBUTES DLLEXPORT :: setImageCount
764#endif
765 integer(IK), intent(in), optional :: count
766#if OMP_ENABLED
767 block
768 use omp_lib, only: omp_get_num_procs, omp_set_num_threads
769 integer :: count_def
770 count_def = omp_get_num_procs()
771 if (present(count)) then
772 if (0_IK < count) count_def = int(count)
773 end if
774 call omp_set_num_threads(count_def)
775 end block
776#endif
777 end subroutine
778
779!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
780
828 function isFailedImage(failed) result(failedParallelism)
829#if __INTEL_COMPILER && DLL_ENABLED && (_WIN32 || _WIN64)
830 !DEC$ ATTRIBUTES DLLEXPORT :: isFailedImage
831#endif
832 logical(LK), intent(in) :: failed
833 logical(LK) :: failedParallelism
834#if CAF_ENABLED
835 logical(LK), allocatable, save :: failure(:)[:]
836 integer :: iid, imageCount
837 imageCount = num_images()
838 allocate(failure(imageCount)[*])
839 failure(this_image()) = failed
840 sync all
841 do iid = 1, imageCount
842 failedParallelism = failure(iid)[iid]
843 if (failedParallelism) return
844 end do
845#elif MPI_ENABLED
846 logical, allocatable :: failure(:) ! This must be default kind.
847 integer :: imageCount!, imageID ! This must be default kind.
848 block
849 use mpi !mpi_f08, only: mpi_comm_world, mpi_comm_rank, mpi_comm_size, mpi_allgather, mpi_logical
850 use pm_arrayResize, only: setResized
851 integer :: ierrMPI
852 !call mpi_comm_rank(mpi_comm_world, imageID, ierrMPI)
853 call mpi_comm_size(mpi_comm_world, imageCount, ierrMPI)
854 call setResized(failure, int(imageCount, IK))
855 call mpi_allgather ( logical(failed) & ! LCOV_EXCL_LINE : send buffer
856 , 1 & ! LCOV_EXCL_LINE : send count
857 , mpi_logical & ! LCOV_EXCL_LINE : send datatype
858 , failure(:) & ! LCOV_EXCL_LINE : receive buffer
859 , 1 & ! LCOV_EXCL_LINE : receive count
860 , mpi_logical & ! LCOV_EXCL_LINE : receive datatype
861 , mpi_comm_world & ! LCOV_EXCL_LINE : comm
862 , ierrMPI & ! LCOV_EXCL_LINE : error code
863 )
864 !call mpi_alltoall ( err%occurred & ! buffer_send : The buffer containing the data that will be scattered to other processes.<br>
865 ! , 1 & ! count_send : The number of elements that will be sent to each process.<br>
866 ! , mpi_logical & ! datatype_send : The type of one send buffer element.<br>
867 ! , failure & ! buffer_recv : The buffer in which store the gathered data.<br>
868 ! , imageCount & ! count_recv : The number of elements in the message to receive per process, not the total number of elements to receive from all processes altogether.<br>
869 ! , mpi_logical & ! datatype_recv : The type of one receive buffer element.<br>
870 ! , mpi_comm_world & ! communicator : The communicator in which the all to all takes place.<br>
871 ! , ierrMPI & ! LCOV_EXCL_LINE : error code
872 ! )
873 failedParallelism = logical(any(failure), LK)
874 end block
875#elif OMP_ENABLED
876 !$omp critical
877 mv_failed = mv_failed .or. failed
878 !$omp end critical
879 !$omp barrier
880 failedParallelism = mv_failed
881 !$omp master
882 mv_failed = .false._LK
883 !$omp end master
884#else
885 failedParallelism = failed
886#endif
887 end function
888
889!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
890
891end module pm_parallelism ! LCOV_EXCL_LINE
Allocate or resize (shrink or expand) an input allocatable scalar string or array of rank 1....
Return the predicted parallel Fork-Join speedup scaling behavior for simulations whose image contribu...
Generate and return the conversion of the input value to an output Fortran string,...
Definition: pm_val2str.F90:167
This module contains procedures and generic interfaces for resizing allocatable arrays of various typ...
This module defines the relevant Fortran kind type-parameters frequently used in the ParaMonte librar...
Definition: pm_kind.F90:268
integer, parameter RK5
Definition: pm_kind.F90:478
integer, parameter RK4
Definition: pm_kind.F90:489
integer, parameter RK2
Definition: pm_kind.F90:511
integer, parameter RK3
Definition: pm_kind.F90:500
integer, parameter LK
The default logical kind in the ParaMonte library: kind(.true.) in Fortran, kind(....
Definition: pm_kind.F90:541
integer, parameter IK
The default integer kind in the ParaMonte library: int32 in Fortran, c_int32_t in C-Fortran Interoper...
Definition: pm_kind.F90:540
integer, parameter SK
The default character kind in the ParaMonte library: kind("a") in Fortran, c_char in C-Fortran Intero...
Definition: pm_kind.F90:539
integer, parameter RK1
Definition: pm_kind.F90:522
This module contains procedures and generic interfaces for facilitating parallel computations or comp...
integer(IK) integer(IK) function getImageCountOMP()
Generate and return the number of available processes in the current OpenMP-parallel world communicat...
integer(IK) integer(IK) function getImageCountMPI()
Generate and return the number of available processes in the current MPI-parallel world communication...
type(image_type) function image_typer()
Generate and return an object of class image_type containing information and statistics of the parall...
subroutine setImageCount(count)
Set the number the parallel threads for an OpenMP-enabled application.
character(*, SK), parameter MODULE_NAME
logical(LK) function isFailedImage(failed)
Broadcast the error condition from all images/processes to all images/processes.
character(*, SK), parameter PARALLELIZATION_MODE
The scalar constant of type character of default kind SK, whose value is set to parallel if the ParaM...
subroutine setImageSynced()
Synchronize all existing parallel images and return nothing.
integer(IK) function getImageID()
Generate and return the ID of the current Coarray image / MPI process / OpenMP thread,...
integer(IK) function getImageCount()
Generate and return the number of available processes in the current parallel world communication.
subroutine setImageFinalized()
Finalize the current parallel simulation and return nothing.
This module contains the generic procedures for converting values of different types and kinds to For...
Definition: pm_val2str.F90:58
This is the image_type type for generating objects that contain information about the current image/p...
This is the imageis_type type for generating objects with components of type logical of default kind ...