43#include "../base/base_uses.f90"
49 LOGICAL,
PARAMETER,
PUBLIC ::
send_msg = .true.
50 LOGICAL,
PARAMETER,
PUBLIC ::
recv_msg = .false.
52 INTEGER,
PARAMETER :: message_end_flag = 25
54 INTEGER,
PARAMETER :: debug = 0
56 CHARACTER(len=*),
PARAMETER,
PRIVATE :: modulen =
'tmc_messages'
65 INTEGER,
PARAMETER :: tmc_send_info_size = 4
68 INTEGER,
DIMENSION(TMC_SEND_INFO_SIZE) :: info = -1
69 REAL(kind=
dp),
DIMENSION(:),
ALLOCATABLE :: task_real
70 INTEGER,
DIMENSION(:),
ALLOCATABLE :: task_int
71 CHARACTER,
DIMENSION(:),
ALLOCATABLE :: task_char
73 INTEGER,
DIMENSION(:),
ALLOCATABLE :: elem_stat
88 cpassert(
ASSOCIATED(para_env))
114 SUBROUTINE tmc_message(msg_type, send_recv, dest, para_env, tmc_params, &
115 elem, elem_array, list_elem, result_count, &
116 wait_for_message, success)
122 TYPE(
tree_type),
OPTIONAL,
POINTER :: elem
125 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: result_count
126 LOGICAL,
OPTIONAL :: wait_for_message, success
128 INTEGER :: i, message_tag, tmp_tag
129 LOGICAL :: act_send_recv, flag
130 TYPE(message_send),
POINTER :: m_send
132 cpassert(
ASSOCIATED(para_env))
133 cpassert(
ASSOCIATED(tmc_params))
148 act_send_recv = send_recv
156 IF (act_send_recv .EQV.
send_msg)
THEN
157 IF ((debug >= 7) .AND. (dest /=
bcast_group) .AND. &
159 IF (
PRESENT(elem))
THEN
160 WRITE (*, *)
"send element info to ", dest,
" of type ", msg_type,
"of subtree", elem%sub_tree_nr, &
163 WRITE (*, *)
"send element info to ", dest,
" of type ", msg_type
166 SELECT CASE (msg_type)
171 CALL create_status_message(m_send)
173 CALL create_worker_init_message(tmc_params, m_send)
175 CALL create_start_conf_message(msg_type, elem, result_count, tmc_params, m_send)
177 CALL create_energy_request_message(elem, m_send, tmc_params)
179 CALL create_approx_energy_result_message(elem, m_send, tmc_params)
181 CALL create_energy_result_message(elem, m_send, tmc_params)
184 CALL create_nmc_request_massage(msg_type, elem, m_send, tmc_params)
186 CALL create_nmc_result_massage(msg_type, elem, m_send, tmc_params)
188 cpassert(
PRESENT(list_elem))
189 CALL create_analysis_request_message(list_elem, m_send, tmc_params)
191 cpabort(
"try to send unknown message type "//
cp_to_string(msg_type))
194 message_tag = msg_type
196 m_send%info(1) = msg_type
197 IF (
ALLOCATED(m_send%task_int)) m_send%info(2) =
SIZE(m_send%task_int)
198 IF (
ALLOCATED(m_send%task_real)) m_send%info(3) =
SIZE(m_send%task_real)
199 IF (
ALLOCATED(m_send%task_char)) m_send%info(4) =
SIZE(m_send%task_char)
204 CALL para_env%send(m_send%info, dest, message_tag)
205 IF (m_send%info(2) > 0)
THEN
206 CALL para_env%send(m_send%task_int, dest, message_tag)
208 IF (m_send%info(3) > 0)
THEN
209 CALL para_env%send(m_send%task_real, dest, message_tag)
211 IF (m_send%info(4) > 0)
THEN
212 cpabort(
"Unable to send message when m_send%info(4) > 0")
216 WRITE (*, *)
"TMC|message: ID: ", para_env%mepos, &
217 " send element info to ", dest,
" of stat ", m_send%info(1), &
218 " with size int/real/char", m_send%info(2:),
" with comm ", &
219 para_env%get_handle(),
" and tag ", message_tag
221 IF (m_send%info(2) > 0)
DEALLOCATE (m_send%task_int)
222 IF (m_send%info(3) > 0)
DEALLOCATE (m_send%task_real)
223 IF (m_send%info(4) > 0)
DEALLOCATE (m_send%task_char)
224 IF (
PRESENT(success)) success = .true.
231 IF (para_env%num_pe > 1)
THEN
233 IF (m_send%info(2) > 0)
THEN
234 IF (.NOT. act_send_recv)
ALLOCATE (m_send%task_int(m_send%info(2)))
237 IF (m_send%info(3) > 0)
THEN
238 IF (.NOT. act_send_recv)
ALLOCATE (m_send%task_real(m_send%info(3)))
241 IF (m_send%info(4) > 0)
THEN
242 IF (.NOT. act_send_recv)
ALLOCATE (m_send%task_char(m_send%info(3)))
243 cpabort(
"Unable to broadcast message when m_send%info(4) > 0")
248 IF (act_send_recv)
THEN
249 IF (m_send%info(2) > 0)
DEALLOCATE (m_send%task_int)
250 IF (m_send%info(3) > 0)
DEALLOCATE (m_send%task_real)
251 IF (m_send%info(4) > 0)
DEALLOCATE (m_send%task_char)
261 IF (
PRESENT(wait_for_message))
THEN
263 CALL para_env%probe(dest, tmp_tag)
266 participant_loop:
DO i = 0, para_env%num_pe - 1
267 IF (i /= para_env%mepos)
THEN
269 CALL para_env%probe(dest, tmp_tag)
272 EXIT participant_loop
275 END DO participant_loop
277 IF (flag .EQV. .false.)
THEN
278 IF (
PRESENT(success)) success = .false.
293 CALL para_env%recv(m_send%info, dest, message_tag)
296 WRITE (*, *)
"TMC|message: ID: ", para_env%mepos, &
297 " recv element info from ", dest,
" of stat ", m_send%info(1), &
298 " with size int/real/char", m_send%info(2:)
301 IF (m_send%info(2) > 0)
THEN
302 ALLOCATE (m_send%task_int(m_send%info(2)))
303 CALL para_env%recv(m_send%task_int, dest, message_tag)
306 IF (m_send%info(3) > 0)
THEN
307 ALLOCATE (m_send%task_real(m_send%info(3)))
308 CALL para_env%recv(m_send%task_real, dest, message_tag)
311 IF (m_send%info(4) > 0)
THEN
312 ALLOCATE (m_send%task_char(m_send%info(4)))
313 cpabort(
"Unable to receive message when m_send%info(4) > 0")
319 IF (act_send_recv .EQV.
recv_msg)
THEN
322 IF (
PRESENT(elem_array))
THEN
324 msg_type = m_send%info(1)
325 IF (m_send%info(2) > 0)
DEALLOCATE (m_send%task_int)
326 IF (m_send%info(3) > 0)
DEALLOCATE (m_send%task_real)
327 IF (m_send%info(4) > 0)
DEALLOCATE (m_send%task_char)
329 IF (
PRESENT(success)) success = .true.
335 msg_type = m_send%info(1)
336 SELECT CASE (m_send%info(1))
342 CALL read_worker_init_message(tmc_params, m_send)
344 IF (
PRESENT(elem_array))
THEN
345 CALL read_start_conf_message(msg_type, elem_array(dest)%elem, &
346 result_count, m_send, tmc_params)
348 CALL read_start_conf_message(msg_type, elem, result_count, m_send, &
352 CALL read_approx_energy_result(elem_array(dest)%elem, m_send, tmc_params)
354 CALL read_energy_request_message(elem, m_send, tmc_params)
356 IF (
PRESENT(elem_array))
THEN
357 CALL read_energy_result_message(elem_array(dest)%elem, m_send, tmc_params)
361 CALL read_nmc_request_massage(msg_type, elem, m_send, tmc_params)
363 IF (
PRESENT(elem_array))
THEN
364 CALL read_nmc_result_massage(msg_type, elem_array(dest)%elem, m_send, tmc_params)
369 CALL read_scf_step_ener(elem_array(dest)%elem, m_send)
371 CALL read_analysis_request_message(elem, m_send, tmc_params)
373 CALL cp_abort(__location__, &
374 "try to receive unknown message type "//
cp_to_string(msg_type)// &
377 IF (m_send%info(2) > 0)
DEALLOCATE (m_send%task_int)
378 IF (m_send%info(3) > 0)
DEALLOCATE (m_send%task_real)
379 IF (m_send%info(4) > 0)
DEALLOCATE (m_send%task_char)
380 IF (
PRESENT(success)) success = .true.
393 SUBROUTINE create_status_message(m_send)
394 TYPE(message_send),
POINTER :: m_send
396 cpassert(
ASSOCIATED(m_send))
400 cpassert(.NOT.
ALLOCATED(m_send%task_int))
401 cpassert(.NOT.
ALLOCATED(m_send%task_real))
404 END SUBROUTINE create_status_message
496 SUBROUTINE create_worker_init_message(tmc_params, m_send)
498 TYPE(message_send),
POINTER :: m_send
500 INTEGER :: counter, msg_size_int, msg_size_real
502 cpassert(
ASSOCIATED(tmc_params))
503 cpassert(
ASSOCIATED(m_send))
504 cpassert(.NOT.
ALLOCATED(m_send%task_int))
505 cpassert(.NOT.
ALLOCATED(m_send%task_real))
506 cpassert(.NOT.
ALLOCATED(m_send%task_char))
507 cpassert(
ASSOCIATED(tmc_params%cell))
510 msg_size_int = 1 +
SIZE(tmc_params%cell%perd) + 1 + 1 + 1 + 1
511 ALLOCATE (m_send%task_int(msg_size_int))
512 m_send%task_int(counter) =
SIZE(tmc_params%cell%perd)
513 counter = counter + 1 + m_send%task_int(counter)
514 m_send%task_int(2:counter - 1) = tmc_params%cell%perd(:)
515 m_send%task_int(counter) = 1
516 m_send%task_int(counter + 1) = tmc_params%cell%symmetry_id
517 m_send%task_int(counter + 2) = 0
518 IF (tmc_params%cell%orthorhombic) m_send%task_int(counter + 2) = 1
519 counter = counter + 3
520 m_send%task_int(counter) = message_end_flag
521 cpassert(counter ==
SIZE(m_send%task_int))
524 msg_size_real = 1 +
SIZE(tmc_params%cell%hmat) + 1
525 ALLOCATE (m_send%task_real(msg_size_real))
527 m_send%task_real(counter) =
SIZE(tmc_params%cell%hmat)
528 m_send%task_real(counter + 1:counter +
SIZE(tmc_params%cell%hmat)) = &
529 reshape(tmc_params%cell%hmat(:, :), &
530 [
SIZE(tmc_params%cell%hmat)])
531 counter = counter + 1 + int(m_send%task_real(counter))
532 m_send%task_real(counter) = real(message_end_flag, kind=
dp)
533 cpassert(
SIZE(m_send%task_real) == msg_size_real)
534 cpassert(int(m_send%task_real(msg_size_real)) == message_end_flag)
535 END SUBROUTINE create_worker_init_message
543 SUBROUTINE read_worker_init_message(tmc_params, m_send)
545 TYPE(message_send),
POINTER :: m_send
550 cpassert(
ASSOCIATED(tmc_params))
551 cpassert(
ASSOCIATED(m_send))
552 cpassert(m_send%info(3) >= 4)
554 IF (.NOT.
ASSOCIATED(tmc_params%cell))
ALLOCATE (tmc_params%cell)
557 flag = int(m_send%task_int(1)) ==
SIZE(tmc_params%cell%perd)
559 counter = 1 + m_send%task_int(1) + 1
560 tmc_params%cell%perd = m_send%task_int(2:counter - 1)
561 tmc_params%cell%symmetry_id = m_send%task_int(counter + 1)
562 tmc_params%cell%orthorhombic = .false.
563 IF (m_send%task_int(counter + 2) == 1) tmc_params%cell%orthorhombic = .true.
564 counter = counter + 3
565 cpassert(counter == m_send%info(2))
566 cpassert(m_send%task_int(counter) == message_end_flag)
570 flag = int(m_send%task_real(counter)) ==
SIZE(tmc_params%cell%hmat)
572 tmc_params%cell%hmat = &
573 reshape(m_send%task_real(counter + 1:counter + &
574 SIZE(tmc_params%cell%hmat)), [3, 3])
575 counter = counter + 1 + int(m_send%task_real(counter))
577 cpassert(counter == m_send%info(3))
578 cpassert(int(m_send%task_real(m_send%info(3))) == message_end_flag)
580 END SUBROUTINE read_worker_init_message
592 SUBROUTINE create_start_conf_message(msg_type, elem, result_count, &
596 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: result_count
598 TYPE(message_send),
POINTER :: m_send
600 INTEGER :: counter, i, msg_size_int, msg_size_real
602 cpassert(
ASSOCIATED(m_send))
603 cpassert(
ASSOCIATED(elem))
604 cpassert(
ASSOCIATED(tmc_params))
605 cpassert(
ASSOCIATED(tmc_params%atoms))
606 cpassert(.NOT.
ALLOCATED(m_send%task_int))
607 cpassert(.NOT.
ALLOCATED(m_send%task_real))
608 cpassert(.NOT.
ALLOCATED(m_send%task_char))
611 msg_size_int = 1 +
SIZE(tmc_params%cell%perd) + 1 + 1 + 1 + 1 +
SIZE(elem%mol) + 1
613 cpassert(
PRESENT(result_count))
614 cpassert(
ASSOCIATED(result_count))
615 msg_size_int = msg_size_int + 1 +
SIZE(result_count(1:))
617 ALLOCATE (m_send%task_int(msg_size_int))
618 m_send%task_int(counter) =
SIZE(tmc_params%cell%perd)
619 counter = counter + 1 + m_send%task_int(counter)
620 m_send%task_int(2:counter - 1) = tmc_params%cell%perd(:)
621 m_send%task_int(counter) = 1
622 m_send%task_int(counter + 1) = tmc_params%cell%symmetry_id
623 m_send%task_int(counter + 2) = 0
624 IF (tmc_params%cell%orthorhombic) m_send%task_int(counter + 2) = 1
625 counter = counter + 3
626 m_send%task_int(counter) =
SIZE(elem%mol)
627 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = elem%mol(:)
628 counter = counter + 1 + m_send%task_int(counter)
630 m_send%task_int(counter) =
SIZE(result_count(1:))
631 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = &
633 counter = counter + 1 + m_send%task_int(counter)
635 m_send%task_int(counter) = message_end_flag
636 cpassert(counter ==
SIZE(m_send%task_int))
640 msg_size_real = 1 +
SIZE(elem%pos) + 1 +
SIZE(tmc_params%cell%hmat) &
641 + 1 +
SIZE(tmc_params%atoms) + 1
642 ALLOCATE (m_send%task_real(msg_size_real))
643 m_send%task_real(1) = real(
SIZE(elem%pos), kind=
dp)
644 counter = 2 + int(m_send%task_real(1))
645 m_send%task_real(2:counter - 1) = elem%pos
646 m_send%task_real(counter) =
SIZE(tmc_params%cell%hmat)
647 m_send%task_real(counter + 1:counter +
SIZE(tmc_params%cell%hmat)) = &
648 reshape(tmc_params%cell%hmat(:, :), &
649 [
SIZE(tmc_params%cell%hmat)])
650 counter = counter + 1 + int(m_send%task_real(counter))
651 m_send%task_real(counter) =
SIZE(tmc_params%atoms)
652 DO i = 1,
SIZE(tmc_params%atoms)
653 m_send%task_real(counter + i) = tmc_params%atoms(i)%mass
655 counter = counter + 1 + int(m_send%task_real(counter))
656 m_send%task_real(counter) = real(message_end_flag, kind=
dp)
657 cpassert(
SIZE(m_send%task_real) == msg_size_real)
658 cpassert(int(m_send%task_real(msg_size_real)) == message_end_flag)
660 END SUBROUTINE create_start_conf_message
672 SUBROUTINE read_start_conf_message(msg_type, elem, result_count, m_send, &
676 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: result_count
677 TYPE(message_send),
POINTER :: m_send
680 INTEGER :: counter, i
683 cpassert(
ASSOCIATED(tmc_params))
684 cpassert(.NOT.
ASSOCIATED(tmc_params%atoms))
685 cpassert(
ASSOCIATED(m_send))
686 cpassert(.NOT.
ASSOCIATED(elem))
687 cpassert(m_send%info(3) >= 4)
689 IF (.NOT.
ASSOCIATED(tmc_params%cell))
ALLOCATE (tmc_params%cell)
691 nr_dim=nint(m_send%task_real(1)))
694 flag = int(m_send%task_int(1)) ==
SIZE(tmc_params%cell%perd)
696 counter = 1 + m_send%task_int(1) + 1
697 tmc_params%cell%perd = m_send%task_int(2:counter - 1)
698 tmc_params%cell%symmetry_id = m_send%task_int(counter + 1)
699 tmc_params%cell%orthorhombic = .false.
700 IF (m_send%task_int(counter + 2) == 1) tmc_params%cell%orthorhombic = .true.
701 counter = counter + 3
702 elem%mol(:) = m_send%task_int(counter + 1:counter + m_send%task_int(counter))
703 counter = counter + 1 + m_send%task_int(counter)
705 cpassert(
PRESENT(result_count))
706 cpassert(.NOT.
ASSOCIATED(result_count))
707 ALLOCATE (result_count(m_send%task_int(counter)))
708 result_count(:) = m_send%task_int(counter + 1:counter + m_send%task_int(counter))
709 counter = counter + 1 + m_send%task_int(counter)
711 cpassert(counter == m_send%info(2))
712 cpassert(m_send%task_int(counter) == message_end_flag)
716 counter = 2 + int(m_send%task_real(1))
717 elem%pos = m_send%task_real(2:counter - 1)
718 flag = int(m_send%task_real(counter)) ==
SIZE(tmc_params%cell%hmat)
720 tmc_params%cell%hmat = &
721 reshape(m_send%task_real(counter + 1:counter + &
722 SIZE(tmc_params%cell%hmat)), [3, 3])
723 counter = counter + 1 + int(m_send%task_real(counter))
726 nr_atoms=int(m_send%task_real(counter)))
727 DO i = 1,
SIZE(tmc_params%atoms)
728 tmc_params%atoms(i)%mass = m_send%task_real(counter + i)
730 counter = counter + 1 + int(m_send%task_real(counter))
732 cpassert(counter == m_send%info(3))
733 cpassert(int(m_send%task_real(m_send%info(3))) == message_end_flag)
735 END SUBROUTINE read_start_conf_message
747 SUBROUTINE create_energy_request_message(elem, m_send, &
750 TYPE(message_send),
POINTER :: m_send
753 INTEGER :: counter, msg_size_int, msg_size_real
755 cpassert(
ASSOCIATED(m_send))
756 cpassert(.NOT.
ALLOCATED(m_send%task_int))
757 cpassert(.NOT.
ALLOCATED(m_send%task_real))
758 cpassert(
ASSOCIATED(elem))
759 cpassert(
ASSOCIATED(tmc_params))
763 msg_size_int = 1 + 1 + 1 + 1 + 1
764 ALLOCATE (m_send%task_int(msg_size_int))
766 m_send%task_int(counter) = 1
767 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = elem%sub_tree_nr
768 counter = counter + 1 + m_send%task_int(counter)
769 m_send%task_int(counter) = 1
770 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = elem%nr
771 counter = counter + 1 + m_send%task_int(counter)
772 m_send%task_int(counter) = message_end_flag
773 cpassert(
SIZE(m_send%task_int) == msg_size_int)
774 cpassert(m_send%task_int(msg_size_int) == message_end_flag)
777 msg_size_real = 1 +
SIZE(elem%pos) + 1
778 IF (tmc_params%pressure >= 0.0_dp) msg_size_real = msg_size_real + 1 +
SIZE(elem%box_scale(:))
779 ALLOCATE (m_send%task_real(msg_size_real))
780 m_send%task_real(1) =
SIZE(elem%pos)
781 counter = 2 + int(m_send%task_real(1))
782 m_send%task_real(2:counter - 1) = elem%pos
783 IF (tmc_params%pressure >= 0.0_dp)
THEN
784 m_send%task_real(counter) =
SIZE(elem%box_scale)
785 m_send%task_real(counter + 1:counter + int(m_send%task_real(counter))) = elem%box_scale(:)
786 counter = counter + 1 + int(m_send%task_real(counter))
788 m_send%task_real(counter) = real(message_end_flag, kind=
dp)
790 cpassert(
SIZE(m_send%task_real) == msg_size_real)
791 cpassert(int(m_send%task_real(msg_size_real)) == message_end_flag)
792 END SUBROUTINE create_energy_request_message
801 SUBROUTINE read_energy_request_message(elem, m_send, tmc_params)
803 TYPE(message_send),
POINTER :: m_send
808 cpassert(
ASSOCIATED(m_send))
809 cpassert(m_send%info(3) > 0)
810 cpassert(
ASSOCIATED(tmc_params))
811 cpassert(.NOT.
ASSOCIATED(elem))
814 IF (.NOT.
ASSOCIATED(elem))
THEN
816 tmc_params=tmc_params)
819 cpassert(m_send%info(2) > 0)
821 elem%sub_tree_nr = m_send%task_int(counter + 1)
822 counter = counter + 1 + m_send%task_int(counter)
823 elem%nr = m_send%task_int(counter + 1)
824 counter = counter + 1 + m_send%task_int(counter)
825 cpassert(m_send%task_int(counter) == message_end_flag)
829 counter = 1 + nint(m_send%task_real(1))
830 elem%pos = m_send%task_real(2:counter)
831 counter = counter + 1
832 IF (tmc_params%pressure >= 0.0_dp)
THEN
833 elem%box_scale(:) = m_send%task_real(counter + 1:counter + int(m_send%task_real(counter)))
834 counter = counter + 1 + int(m_send%task_real(counter))
837 cpassert(counter == m_send%info(3))
838 cpassert(int(m_send%task_real(m_send%info(3))) == message_end_flag)
839 END SUBROUTINE read_energy_request_message
848 SUBROUTINE create_energy_result_message(elem, m_send, tmc_params)
850 TYPE(message_send),
POINTER :: m_send
853 INTEGER :: counter, msg_size_int, msg_size_real
855 cpassert(
ASSOCIATED(m_send))
856 cpassert(.NOT.
ALLOCATED(m_send%task_int))
857 cpassert(.NOT.
ALLOCATED(m_send%task_real))
858 cpassert(
ASSOCIATED(elem))
859 cpassert(
ASSOCIATED(tmc_params))
866 msg_size_int = 1 + 1 + 1 + 1 + 1
867 ALLOCATE (m_send%task_int(msg_size_int))
869 m_send%task_int(counter) = 1
870 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = elem%sub_tree_nr
871 counter = counter + 1 + m_send%task_int(counter)
872 m_send%task_int(counter) = 1
873 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = elem%nr
874 counter = counter + m_send%task_int(counter) + 1
875 m_send%task_int(counter) = message_end_flag
879 msg_size_real = 1 + 1 + 1
880 IF (tmc_params%print_forces) msg_size_real = msg_size_real + 1 +
SIZE(elem%frc)
881 IF (tmc_params%print_dipole) msg_size_real = msg_size_real + 1 +
SIZE(elem%dipole)
883 ALLOCATE (m_send%task_real(msg_size_real))
884 m_send%task_real(1) = 1
885 m_send%task_real(2) = elem%potential
887 IF (tmc_params%print_forces)
THEN
888 m_send%task_real(counter) =
SIZE(elem%frc)
889 m_send%task_real(counter + 1:counter + nint(m_send%task_real(counter))) = elem%frc
890 counter = counter + nint(m_send%task_real(counter)) + 1
892 IF (tmc_params%print_dipole)
THEN
893 m_send%task_real(counter) =
SIZE(elem%dipole)
894 m_send%task_real(counter + 1:counter + nint(m_send%task_real(counter))) = elem%dipole
895 counter = counter + nint(m_send%task_real(counter)) + 1
898 m_send%task_real(counter) = real(message_end_flag, kind=
dp)
900 cpassert(
SIZE(m_send%task_real) == msg_size_real)
901 cpassert(int(m_send%task_real(msg_size_real)) == message_end_flag)
902 END SUBROUTINE create_energy_result_message
911 SUBROUTINE read_energy_result_message(elem, m_send, tmc_params)
913 TYPE(message_send),
POINTER :: m_send
918 cpassert(
ASSOCIATED(elem))
919 cpassert(
ASSOCIATED(m_send))
920 cpassert(m_send%info(3) > 0)
921 cpassert(
ASSOCIATED(tmc_params))
927 IF (elem%sub_tree_nr /= m_send%task_int(counter + 1) .OR. &
928 elem%nr /= m_send%task_int(counter + 3))
THEN
929 WRITE (*, *)
"ERROR: read_energy_result: master got energy result of subtree elem ", &
930 m_send%task_int(counter + 1), m_send%task_int(counter + 3), &
931 " but expect result of subtree elem", elem%sub_tree_nr, elem%nr
932 cpabort(
"read_energy_result: got energy result from unexpected tree element.")
935 cpassert(m_send%info(2) == 0)
939 elem%potential = m_send%task_real(2)
941 IF (tmc_params%print_forces)
THEN
942 elem%frc(:) = m_send%task_real((counter + 1):(counter + nint(m_send%task_real(counter))))
943 counter = counter + 1 + nint(m_send%task_real(counter))
945 IF (tmc_params%print_dipole)
THEN
946 elem%dipole(:) = m_send%task_real((counter + 1):(counter + nint(m_send%task_real(counter))))
947 counter = counter + 1 + nint(m_send%task_real(counter))
950 cpassert(counter == m_send%info(3))
951 cpassert(int(m_send%task_real(m_send%info(3))) == message_end_flag)
952 END SUBROUTINE read_energy_result_message
961 SUBROUTINE create_approx_energy_result_message(elem, m_send, &
964 TYPE(message_send),
POINTER :: m_send
967 INTEGER :: counter, msg_size_real
969 cpassert(
ASSOCIATED(m_send))
970 cpassert(.NOT.
ALLOCATED(m_send%task_int))
971 cpassert(.NOT.
ALLOCATED(m_send%task_real))
972 cpassert(
ASSOCIATED(elem))
973 cpassert(
ASSOCIATED(tmc_params))
978 msg_size_real = 1 + 1 + 1
979 IF (tmc_params%pressure >= 0.0_dp) msg_size_real = msg_size_real + 1 +
SIZE(elem%box_scale(:))
981 ALLOCATE (m_send%task_real(msg_size_real))
982 m_send%task_real(1) = 1
983 m_send%task_real(2) = elem%e_pot_approx
986 IF (tmc_params%pressure >= 0.0_dp)
THEN
987 m_send%task_real(counter) =
SIZE(elem%box_scale)
988 m_send%task_real(counter + 1:counter + int(m_send%task_real(counter))) = elem%box_scale(:)
989 counter = counter + 1 + int(m_send%task_real(counter))
991 m_send%task_real(counter) = real(message_end_flag, kind=
dp)
993 cpassert(
SIZE(m_send%task_real) == msg_size_real)
994 cpassert(int(m_send%task_real(msg_size_real)) == message_end_flag)
995 END SUBROUTINE create_approx_energy_result_message
1004 SUBROUTINE read_approx_energy_result(elem, m_send, tmc_params)
1006 TYPE(message_send),
POINTER :: m_send
1011 cpassert(
ASSOCIATED(elem))
1012 cpassert(
ASSOCIATED(m_send))
1013 cpassert(m_send%info(2) == 0 .AND. m_send%info(3) > 0)
1014 cpassert(
ASSOCIATED(tmc_params))
1017 elem%e_pot_approx = m_send%task_real(2)
1019 IF (tmc_params%pressure >= 0.0_dp)
THEN
1020 elem%box_scale(:) = m_send%task_real(counter + 1:counter + int(m_send%task_real(counter)))
1021 counter = counter + 1 + int(m_send%task_real(counter))
1024 cpassert(counter == m_send%info(3))
1025 cpassert(int(m_send%task_real(m_send%info(3))) == message_end_flag)
1026 END SUBROUTINE read_approx_energy_result
1039 SUBROUTINE create_nmc_request_massage(msg_type, elem, m_send, &
1043 TYPE(message_send),
POINTER :: m_send
1046 INTEGER :: counter, msg_size_int, msg_size_real
1048 cpassert(
ASSOCIATED(m_send))
1049 cpassert(
ASSOCIATED(elem))
1050 cpassert(.NOT.
ALLOCATED(m_send%task_int))
1051 cpassert(.NOT.
ALLOCATED(m_send%task_real))
1052 cpassert(
ASSOCIATED(tmc_params))
1056 msg_size_int = 1 +
SIZE(elem%elem_stat) + 1 +
SIZE(elem%mol) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
1058 ALLOCATE (m_send%task_int(msg_size_int))
1060 m_send%task_int(1) =
SIZE(elem%elem_stat)
1061 counter = 2 + m_send%task_int(1)
1062 m_send%task_int(2:counter - 1) = elem%elem_stat
1063 m_send%task_int(counter) =
SIZE(elem%mol)
1064 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = elem%mol(:)
1065 counter = counter + 1 + m_send%task_int(counter)
1067 m_send%task_int(counter) = 1
1068 m_send%task_int(counter + 1) = elem%move_type
1069 counter = counter + 2
1070 m_send%task_int(counter) = 1
1071 m_send%task_int(counter + 1) = elem%nr
1072 counter = counter + 2
1073 m_send%task_int(counter) = 1
1074 m_send%task_int(counter + 1) = elem%sub_tree_nr
1075 counter = counter + 2
1076 m_send%task_int(counter) = 1
1077 m_send%task_int(counter + 1) = elem%temp_created
1078 m_send%task_int(counter + 2) = message_end_flag
1082 msg_size_real = 1 +
SIZE(elem%pos) + 1 +
SIZE(elem%rng_seed) + 1 +
SIZE(elem%subbox_center(:)) + 1
1084 msg_size_real = msg_size_real + 1 +
SIZE(elem%vel)
1086 IF (tmc_params%pressure >= 0.0_dp) msg_size_real = msg_size_real + 1 +
SIZE(elem%box_scale(:))
1088 ALLOCATE (m_send%task_real(msg_size_real))
1089 m_send%task_real(1) =
SIZE(elem%pos)
1090 counter = 2 + int(m_send%task_real(1))
1091 m_send%task_real(2:counter - 1) = elem%pos
1093 m_send%task_real(counter) =
SIZE(elem%vel)
1094 m_send%task_real(counter + 1:counter + nint(m_send%task_real(counter))) = elem%vel
1095 counter = counter + 1 + nint(m_send%task_real(counter))
1098 m_send%task_real(counter) =
SIZE(elem%rng_seed)
1099 m_send%task_real(counter + 1:counter +
SIZE(elem%rng_seed)) = reshape(elem%rng_seed(:, :, :), [
SIZE(elem%rng_seed)])
1100 counter = counter + nint(m_send%task_real(counter)) + 1
1102 m_send%task_real(counter) =
SIZE(elem%subbox_center(:))
1103 m_send%task_real(counter + 1:counter +
SIZE(elem%subbox_center)) = elem%subbox_center(:)
1104 counter = counter + 1 + nint(m_send%task_real(counter))
1106 IF (tmc_params%pressure >= 0.0_dp)
THEN
1107 m_send%task_real(counter) =
SIZE(elem%box_scale)
1108 m_send%task_real(counter + 1:counter + int(m_send%task_real(counter))) = elem%box_scale(:)
1109 counter = counter + 1 + int(m_send%task_real(counter))
1111 m_send%task_real(counter) = message_end_flag
1113 cpassert(
SIZE(m_send%task_int) == msg_size_int)
1114 cpassert(
SIZE(m_send%task_real) == msg_size_real)
1115 cpassert(m_send%task_int(msg_size_int) == message_end_flag)
1116 cpassert(int(m_send%task_real(msg_size_real)) == message_end_flag)
1117 END SUBROUTINE create_nmc_request_massage
1127 SUBROUTINE read_nmc_request_massage(msg_type, elem, m_send, &
1131 TYPE(message_send),
POINTER :: m_send
1134 INTEGER :: counter, num_dim, rnd_seed_size
1136 cpassert(.NOT.
ASSOCIATED(elem))
1137 cpassert(
ASSOCIATED(m_send))
1138 cpassert(m_send%info(2) > 5 .AND. m_send%info(3) > 8)
1139 cpassert(
ASSOCIATED(tmc_params))
1143 rnd_seed_size = m_send%task_int(1 + m_send%task_int(1) + 1)
1145 IF (.NOT.
ASSOCIATED(elem))
THEN
1147 tmc_params=tmc_params)
1150 counter = 2 + m_send%task_int(1)
1151 elem%elem_stat = m_send%task_int(2:counter - 1)
1152 elem%mol(:) = m_send%task_int(counter + 1:counter + m_send%task_int(counter))
1153 counter = counter + 1 + m_send%task_int(counter)
1155 elem%move_type = m_send%task_int(counter + 1)
1156 counter = counter + 2
1157 elem%nr = m_send%task_int(counter + 1)
1158 counter = counter + 2
1159 elem%sub_tree_nr = m_send%task_int(counter + 1)
1160 counter = counter + 2
1161 elem%temp_created = m_send%task_int(counter + 1)
1162 counter = counter + 2
1163 cpassert(counter == m_send%info(2))
1167 num_dim = nint(m_send%task_real(1))
1168 counter = 2 + int(m_send%task_real(1))
1169 elem%pos = m_send%task_real(2:counter - 1)
1171 elem%vel = m_send%task_real(counter + 1:counter + nint(m_send%task_real(counter)))
1172 counter = counter + nint(m_send%task_real(counter)) + 1
1175 elem%rng_seed(:, :, :) = reshape(m_send%task_real(counter + 1:counter +
SIZE(elem%rng_seed)), [3, 2, 3])
1176 counter = counter + nint(m_send%task_real(counter)) + 1
1178 elem%subbox_center(:) = m_send%task_real(counter + 1:counter + int(m_send%task_real(counter)))
1179 counter = counter + 1 + nint(m_send%task_real(counter))
1181 IF (tmc_params%pressure >= 0.0_dp)
THEN
1182 elem%box_scale(:) = m_send%task_real(counter + 1:counter + int(m_send%task_real(counter)))
1183 counter = counter + 1 + int(m_send%task_real(counter))
1185 elem%box_scale(:) = 1.0_dp
1188 cpassert(counter == m_send%info(3))
1189 cpassert(m_send%task_int(m_send%info(2)) == message_end_flag)
1190 cpassert(int(m_send%task_real(m_send%info(3))) == message_end_flag)
1191 END SUBROUTINE read_nmc_request_massage
1204 SUBROUTINE create_nmc_result_massage(msg_type, elem, m_send, tmc_params)
1207 TYPE(message_send),
POINTER :: m_send
1210 INTEGER :: counter, msg_size_int, msg_size_real
1212 cpassert(
ASSOCIATED(m_send))
1213 cpassert(.NOT.
ALLOCATED(m_send%task_int))
1214 cpassert(.NOT.
ALLOCATED(m_send%task_real))
1215 cpassert(
ASSOCIATED(elem))
1216 cpassert(
ASSOCIATED(tmc_params))
1219 msg_size_int = 1 +
SIZE(elem%mol) &
1220 + 1 +
SIZE(tmc_params%nmc_move_types%mv_count) &
1221 + 1 +
SIZE(tmc_params%nmc_move_types%acc_count) + 1
1222 IF (debug > 0) msg_size_int = msg_size_int + 1 + 1 + 1 + 1
1223 IF (.NOT. any(tmc_params%sub_box_size <= 0.1_dp))
THEN
1224 msg_size_int = msg_size_int + 1 +
SIZE(tmc_params%nmc_move_types%subbox_count) &
1225 + 1 +
SIZE(tmc_params%nmc_move_types%subbox_acc_count)
1228 ALLOCATE (m_send%task_int(msg_size_int))
1232 m_send%task_int(counter) = 1
1233 m_send%task_int(counter + 1) = elem%sub_tree_nr
1234 counter = counter + 1 + m_send%task_int(counter)
1235 m_send%task_int(counter) = 1
1236 m_send%task_int(counter + 1) = elem%nr
1237 counter = counter + 1 + m_send%task_int(counter)
1240 m_send%task_int(counter) =
SIZE(elem%mol)
1241 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = elem%mol(:)
1242 counter = counter + 1 + m_send%task_int(counter)
1244 m_send%task_int(counter) =
SIZE(tmc_params%nmc_move_types%mv_count)
1245 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = &
1246 reshape(tmc_params%nmc_move_types%mv_count(:, :), &
1247 [
SIZE(tmc_params%nmc_move_types%mv_count)])
1248 counter = counter + 1 + m_send%task_int(counter)
1250 m_send%task_int(counter) =
SIZE(tmc_params%nmc_move_types%acc_count)
1251 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = &
1252 reshape(tmc_params%nmc_move_types%acc_count(:, :), &
1253 [
SIZE(tmc_params%nmc_move_types%acc_count)])
1254 counter = counter + 1 + m_send%task_int(counter)
1256 IF (.NOT. any(tmc_params%sub_box_size <= 0.1_dp))
THEN
1257 m_send%task_int(counter) =
SIZE(tmc_params%nmc_move_types%subbox_count)
1258 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = &
1259 reshape(tmc_params%nmc_move_types%subbox_count(:, :), &
1260 [
SIZE(tmc_params%nmc_move_types%subbox_count)])
1261 counter = counter + 1 + m_send%task_int(counter)
1262 m_send%task_int(counter) =
SIZE(tmc_params%nmc_move_types%subbox_acc_count)
1263 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = &
1264 reshape(tmc_params%nmc_move_types%subbox_acc_count(:, :), &
1265 [
SIZE(tmc_params%nmc_move_types%subbox_acc_count)])
1266 counter = counter + 1 + m_send%task_int(counter)
1268 m_send%task_int(counter) = message_end_flag
1273 msg_size_real = 1 +
SIZE(elem%pos) &
1274 + 1 +
SIZE(elem%rng_seed) &
1281 msg_size_real = msg_size_real + 1 +
SIZE(elem%vel) + 1 + 1 + 1 + 1
1284 ALLOCATE (m_send%task_real(msg_size_real))
1287 m_send%task_real(counter) =
SIZE(elem%pos)
1288 m_send%task_real(counter + 1:counter + nint(m_send%task_real(counter))) = elem%pos
1289 counter = counter + 1 + nint(m_send%task_real(counter))
1291 m_send%task_real(counter) =
SIZE(elem%rng_seed)
1292 m_send%task_real(counter + 1:counter +
SIZE(elem%rng_seed)) = &
1293 reshape(elem%rng_seed(:, :, :), [
SIZE(elem%rng_seed)])
1294 counter = counter + 1 + nint(m_send%task_real(counter))
1296 m_send%task_real(counter) = 1
1297 m_send%task_real(counter + 1) = elem%potential
1298 counter = counter + 2
1300 m_send%task_real(counter) = 1
1301 m_send%task_real(counter + 1) = elem%e_pot_approx
1302 counter = counter + 2
1306 m_send%task_real(counter) =
SIZE(elem%vel)
1307 m_send%task_real(counter + 1:counter + nint(m_send%task_real(counter))) = elem%vel
1308 counter = counter + 1 + int(m_send%task_real(counter))
1309 m_send%task_real(counter) = 1
1310 m_send%task_real(counter + 1) = elem%ekin_before_md
1311 counter = counter + 2
1312 m_send%task_real(counter) = 1
1313 m_send%task_real(counter + 1) = elem%ekin
1314 counter = counter + 2
1316 m_send%task_real(counter) = message_end_flag
1318 cpassert(
SIZE(m_send%task_int) == msg_size_int)
1319 cpassert(
SIZE(m_send%task_real) == msg_size_real)
1320 cpassert(m_send%task_int(msg_size_int) == message_end_flag)
1321 cpassert(int(m_send%task_real(msg_size_real)) == message_end_flag)
1322 END SUBROUTINE create_nmc_result_massage
1332 SUBROUTINE read_nmc_result_massage(msg_type, elem, m_send, tmc_params)
1335 TYPE(message_send),
POINTER :: m_send
1339 INTEGER,
DIMENSION(:, :),
POINTER :: acc_counter, mv_counter, &
1340 subbox_acc_counter, subbox_counter
1342 NULLIFY (mv_counter, subbox_counter, acc_counter, subbox_acc_counter)
1344 cpassert(
ASSOCIATED(elem))
1345 cpassert(
ASSOCIATED(m_send))
1346 cpassert(m_send%info(2) > 0 .AND. m_send%info(3) > 0)
1347 cpassert(
ASSOCIATED(tmc_params))
1352 IF ((m_send%task_int(counter + 1) /= elem%sub_tree_nr) .AND. (m_send%task_int(counter + 3) /= elem%nr))
THEN
1353 cpabort(
"read_NMC_result_massage: got result of wrong element")
1355 counter = counter + 2 + 2
1358 elem%mol(:) = m_send%task_int(counter + 1:counter + m_send%task_int(counter))
1359 counter = counter + 1 + m_send%task_int(counter)
1361 ALLOCATE (mv_counter(0:
SIZE(tmc_params%nmc_move_types%mv_count(:, 1)) - 1, &
1362 SIZE(tmc_params%nmc_move_types%mv_count(1, :))))
1363 mv_counter(:, :) = reshape(m_send%task_int(counter + 1:counter + m_send%task_int(counter)), &
1364 [
SIZE(tmc_params%nmc_move_types%mv_count(:, 1)), &
1365 SIZE(tmc_params%nmc_move_types%mv_count(1, :))])
1366 counter = counter + 1 + m_send%task_int(counter)
1368 ALLOCATE (acc_counter(0:
SIZE(tmc_params%nmc_move_types%acc_count(:, 1)) - 1, &
1369 SIZE(tmc_params%nmc_move_types%acc_count(1, :))))
1370 acc_counter(:, :) = reshape(m_send%task_int(counter + 1:counter + m_send%task_int(counter)), &
1371 [
SIZE(tmc_params%nmc_move_types%acc_count(:, 1)), &
1372 SIZE(tmc_params%nmc_move_types%acc_count(1, :))])
1373 counter = counter + 1 + m_send%task_int(counter)
1375 IF (.NOT. any(tmc_params%sub_box_size <= 0.1_dp))
THEN
1376 ALLOCATE (subbox_counter(
SIZE(tmc_params%nmc_move_types%subbox_count(:, 1)), &
1377 SIZE(tmc_params%nmc_move_types%subbox_count(1, :))))
1378 subbox_counter(:, :) = reshape(m_send%task_int(counter + 1:counter + m_send%task_int(counter)), &
1379 [
SIZE(tmc_params%nmc_move_types%subbox_count(:, 1)), &
1380 SIZE(tmc_params%nmc_move_types%subbox_count(1, :))])
1381 counter = counter + 1 + m_send%task_int(counter)
1382 ALLOCATE (subbox_acc_counter(
SIZE(tmc_params%nmc_move_types%subbox_acc_count(:, 1)), &
1383 SIZE(tmc_params%nmc_move_types%subbox_acc_count(1, :))))
1384 subbox_acc_counter(:, :) = reshape(m_send%task_int(counter + 1:counter + m_send%task_int(counter)), &
1385 [
SIZE(tmc_params%nmc_move_types%subbox_acc_count(:, 1)), &
1386 SIZE(tmc_params%nmc_move_types%subbox_acc_count(1, :))])
1387 counter = counter + 1 + m_send%task_int(counter)
1389 cpassert(counter == m_send%info(2))
1395 elem%pos = m_send%task_real(counter + 1:counter + nint(m_send%task_real(counter)))
1396 counter = counter + 1 + nint(m_send%task_real(counter))
1398 elem%rng_seed(:, :, :) = reshape(m_send%task_real(counter + 1:counter +
SIZE(elem%rng_seed)), [3, 2, 3])
1399 counter = counter + 1 + nint(m_send%task_real(counter))
1401 elem%potential = m_send%task_real(counter + 1)
1402 counter = counter + 2
1404 elem%e_pot_approx = m_send%task_real(counter + 1)
1405 counter = counter + 2
1409 elem%vel = m_send%task_real(counter + 1:counter + nint(m_send%task_real(counter)))
1410 counter = counter + 1 + int(m_send%task_real(counter))
1412 elem%ekin_before_md = m_send%task_real(counter + 1)
1414 counter = counter + 2
1415 elem%ekin = m_send%task_real(counter + 1)
1416 counter = counter + 2
1419 CALL add_mv_prob(move_types=tmc_params%nmc_move_types, prob_opt=tmc_params%esimate_acc_prob, &
1420 mv_counter=mv_counter, acc_counter=acc_counter)
1421 IF (.NOT. any(tmc_params%sub_box_size <= 0.1_dp))
THEN
1422 CALL add_mv_prob(move_types=tmc_params%nmc_move_types, prob_opt=tmc_params%esimate_acc_prob, &
1423 subbox_counter=subbox_counter, subbox_acc_counter=subbox_acc_counter)
1426 DEALLOCATE (mv_counter, acc_counter)
1427 IF (.NOT. any(tmc_params%sub_box_size <= 0.1_dp))
THEN
1428 DEALLOCATE (subbox_counter, subbox_acc_counter)
1430 cpassert(counter == m_send%info(3))
1431 cpassert(m_send%task_int(m_send%info(2)) == message_end_flag)
1432 cpassert(int(m_send%task_real(m_send%info(3))) == message_end_flag)
1433 END SUBROUTINE read_nmc_result_massage
1447 SUBROUTINE create_analysis_request_message(list_elem, m_send, &
1450 TYPE(message_send),
POINTER :: m_send
1453 INTEGER :: counter, msg_size_int, msg_size_real
1455 cpassert(
ASSOCIATED(m_send))
1456 cpassert(.NOT.
ALLOCATED(m_send%task_int))
1457 cpassert(.NOT.
ALLOCATED(m_send%task_real))
1458 cpassert(
ASSOCIATED(list_elem))
1459 cpassert(
ASSOCIATED(tmc_params))
1463 msg_size_int = 1 + 1 + 1 + 1 + 1
1464 ALLOCATE (m_send%task_int(msg_size_int))
1466 m_send%task_int(counter) = 1
1467 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = list_elem%temp_ind
1468 counter = counter + 1 + m_send%task_int(counter)
1469 m_send%task_int(counter) = 1
1470 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = list_elem%nr
1471 counter = counter + 1 + m_send%task_int(counter)
1472 m_send%task_int(counter) = message_end_flag
1473 cpassert(
SIZE(m_send%task_int) == msg_size_int)
1474 cpassert(m_send%task_int(msg_size_int) == message_end_flag)
1477 msg_size_real = 1 +
SIZE(list_elem%elem%pos) + 1
1478 IF (tmc_params%pressure >= 0.0_dp) msg_size_real = msg_size_real + 1 +
SIZE(list_elem%elem%box_scale(:))
1479 ALLOCATE (m_send%task_real(msg_size_real))
1480 m_send%task_real(1) =
SIZE(list_elem%elem%pos)
1481 counter = 2 + int(m_send%task_real(1))
1482 m_send%task_real(2:counter - 1) = list_elem%elem%pos
1483 IF (tmc_params%pressure >= 0.0_dp)
THEN
1484 m_send%task_real(counter) =
SIZE(list_elem%elem%box_scale)
1485 m_send%task_real(counter + 1:counter + int(m_send%task_real(counter))) = list_elem%elem%box_scale(:)
1486 counter = counter + 1 + int(m_send%task_real(counter))
1488 m_send%task_real(counter) = real(message_end_flag, kind=
dp)
1490 cpassert(
SIZE(m_send%task_real) == msg_size_real)
1491 cpassert(int(m_send%task_real(msg_size_real)) == message_end_flag)
1492 END SUBROUTINE create_analysis_request_message
1501 SUBROUTINE read_analysis_request_message(elem, m_send, tmc_params)
1503 TYPE(message_send),
POINTER :: m_send
1508 cpassert(
ASSOCIATED(m_send))
1509 cpassert(m_send%info(3) > 0)
1510 cpassert(
ASSOCIATED(tmc_params))
1511 cpassert(.NOT.
ASSOCIATED(elem))
1514 IF (.NOT.
ASSOCIATED(elem))
THEN
1516 tmc_params=tmc_params)
1519 cpassert(m_send%info(2) > 0)
1521 elem%sub_tree_nr = m_send%task_int(counter + 1)
1522 counter = counter + 1 + m_send%task_int(counter)
1523 elem%nr = m_send%task_int(counter + 1)
1524 counter = counter + 1 + m_send%task_int(counter)
1525 cpassert(m_send%task_int(counter) == message_end_flag)
1529 counter = 1 + nint(m_send%task_real(1))
1530 elem%pos = m_send%task_real(2:counter)
1531 counter = counter + 1
1532 IF (tmc_params%pressure >= 0.0_dp)
THEN
1533 elem%box_scale(:) = m_send%task_real(counter + 1:counter + int(m_send%task_real(counter)))
1534 counter = counter + 1 + int(m_send%task_real(counter))
1537 cpassert(counter == m_send%info(3))
1538 cpassert(int(m_send%task_real(m_send%info(3))) == message_end_flag)
1539 END SUBROUTINE read_analysis_request_message
1550 SUBROUTINE read_scf_step_ener(elem, m_send)
1552 TYPE(message_send),
POINTER :: m_send
1554 cpassert(
ASSOCIATED(elem))
1555 cpassert(
ASSOCIATED(m_send))
1557 elem%scf_energies(mod(elem%scf_energies_count, 4) + 1) = m_send%task_real(1)
1558 elem%scf_energies_count = elem%scf_energies_count + 1
1560 END SUBROUTINE read_scf_step_ener
1576 CHARACTER(LEN=default_string_length), &
1577 ALLOCATABLE,
DIMENSION(:) :: msg
1580 cpassert(
ASSOCIATED(para_env))
1581 cpassert(source >= 0)
1582 cpassert(source < para_env%num_pe)
1584 ALLOCATE (msg(
SIZE(atoms)))
1585 IF (para_env%mepos == source)
THEN
1586 DO i = 1,
SIZE(atoms)
1587 msg(i) = atoms(i)%name
1589 CALL para_env%bcast(msg, source)
1591 CALL para_env%bcast(msg, source)
1592 DO i = 1,
SIZE(atoms)
1593 atoms(i)%name = msg(i)
1611 POINTER :: worker_info
1614 INTEGER :: act_rank, dest_rank, stat
1616 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: rank_stoped
1620 cpassert(
ASSOCIATED(para_env))
1621 cpassert(
ASSOCIATED(tmc_params))
1623 ALLOCATE (rank_stoped(0:para_env%num_pe - 1))
1624 rank_stoped(:) = .false.
1625 rank_stoped(para_env%mepos) = .true.
1628 IF (
PRESENT(worker_info))
THEN
1629 cpassert(
ASSOCIATED(worker_info))
1631 worker_group_loop:
DO dest_rank = 1, para_env%num_pe - 1
1633 IF (worker_info(dest_rank)%busy)
THEN
1635 act_rank = dest_rank
1637 para_env=para_env, tmc_params=tmc_params)
1641 act_rank = dest_rank
1643 para_env=para_env, tmc_params=tmc_params)
1645 END DO worker_group_loop
1650 para_env=para_env, tmc_params=tmc_params)
1655 wait_for_receipts:
DO
1659 IF (
PRESENT(worker_info))
THEN
1662 para_env=para_env, tmc_params=tmc_params, &
1663 elem_array=worker_info(:), success=flag)
1666 para_env=para_env, tmc_params=tmc_params)
1672 IF (
PRESENT(worker_info))
THEN
1673 worker_info(dest_rank)%busy = .false.
1677 para_env=para_env, tmc_params=tmc_params)
1679 cpabort(
"group master should not receive cancel receipt")
1682 rank_stoped(dest_rank) = .true.
1687 CALL cp_abort(__location__, &
1689 " while stopping workers")
1691 IF (all(rank_stoped))
EXIT wait_for_receipts
1692 END DO wait_for_receipts
1694 cpabort(
"only (group) master should stop other participants")
various routines to log and control the output. The idea is that decisions about where to log should ...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Interface to the message passing library MPI.
integer, parameter, public mp_any_tag
integer, parameter, public mp_any_source
set up the different message for different tasks A TMC message consists of 3 parts (messages) 1: firs...
subroutine, public tmc_message(msg_type, send_recv, dest, para_env, tmc_params, elem, elem_array, list_elem, result_count, wait_for_message, success)
tmc message handling, packing messages with integer and real data type. Send first info message with ...
subroutine, public communicate_atom_types(atoms, source, para_env)
routines send atom names to the global master (using broadcast in a specialized group consisting of t...
integer, parameter, public bcast_group
logical function, public check_if_group_master(para_env)
checks if the core is the group master
integer, parameter, public master_comm_id
subroutine, public stop_whole_group(para_env, worker_info, tmc_params)
send stop command to all group participants
logical, parameter, public send_msg
logical, parameter, public recv_msg
acceptance ratio handling of the different Monte Carlo Moves types For each move type and each temper...
subroutine, public add_mv_prob(move_types, prob_opt, mv_counter, acc_counter, subbox_counter, subbox_acc_counter)
add the actual moves to the average probabilities
tree nodes creation, searching, deallocation, references etc.
integer, parameter, public tmc_stat_md_broadcast
integer, parameter, public tmc_status_calculating
integer, parameter, public tmc_status_failed
integer, parameter, public tmc_stat_analysis_request
integer, parameter, public task_type_gaussian_adaptation
integer, parameter, public tmc_status_worker_init
integer, parameter, public tmc_stat_md_result
integer, parameter, public tmc_stat_md_request
integer, parameter, public tmc_stat_nmc_broadcast
integer, parameter, public tmc_stat_approx_energy_result
integer, parameter, public tmc_stat_start_conf_result
integer, parameter, public tmc_status_wait_for_new_task
integer, parameter, public tmc_stat_nmc_result
integer, parameter, public tmc_stat_analysis_result
integer, parameter, public tmc_stat_init_analysis
integer, parameter, public tmc_stat_energy_result
integer, parameter, public tmc_stat_scf_step_ener_receive
integer, parameter, public tmc_stat_approx_energy_request
integer, parameter, public tmc_stat_start_conf_request
integer, parameter, public tmc_canceling_receipt
integer, parameter, public tmc_stat_energy_request
integer, parameter, public tmc_stat_nmc_request
integer, parameter, public tmc_status_stop_receipt
integer, parameter, public tmc_canceling_message
tree nodes creation, deallocation, references etc.
subroutine, public allocate_new_sub_tree_node(tmc_params, next_el, nr_dim)
allocates an elements of the subtree element structure
module handles definition of the tree nodes for the global and the subtrees binary tree parent elemen...
module handles definition of the tree nodes for the global and the subtrees binary tree parent elemen...
subroutine, public allocate_tmc_atom_type(atoms, nr_atoms)
creates a structure for storing the atom informations
stores all the informations relevant to an mpi environment