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
85 TYPE(mp_para_env_type),
POINTER :: para_env
88 cpassert(
ASSOCIATED(para_env))
113 SUBROUTINE tmc_message(msg_type, send_recv, dest, para_env, tmc_params, &
114 elem, elem_array, list_elem, result_count, &
115 wait_for_message, success)
119 TYPE(mp_para_env_type),
POINTER :: para_env
120 TYPE(tmc_param_type),
POINTER :: tmc_params
121 TYPE(tree_type),
OPTIONAL,
POINTER :: elem
122 TYPE(elem_array_type),
DIMENSION(:),
OPTIONAL :: elem_array
123 TYPE(elem_list_type),
OPTIONAL,
POINTER :: list_elem
124 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: result_count
125 LOGICAL,
OPTIONAL :: wait_for_message, success
127 INTEGER :: i, message_tag, tmp_tag
128 LOGICAL :: act_send_recv, flag
129 TYPE(message_send),
POINTER :: m_send
131 cpassert(
ASSOCIATED(para_env))
132 cpassert(
ASSOCIATED(tmc_params))
147 act_send_recv = send_recv
155 IF (act_send_recv .EQV.
send_msg)
THEN
156 IF ((debug .GE. 7) .AND. (dest .NE.
bcast_group) .AND. &
158 IF (
PRESENT(elem))
THEN
159 WRITE (*, *)
"send element info to ", dest,
" of type ", msg_type,
"of subtree", elem%sub_tree_nr, &
162 WRITE (*, *)
"send element info to ", dest,
" of type ", msg_type
165 SELECT CASE (msg_type)
170 CALL create_status_message(m_send)
172 CALL create_worker_init_message(tmc_params, m_send)
174 CALL create_start_conf_message(msg_type, elem, result_count, tmc_params, m_send)
176 CALL create_energy_request_message(elem, m_send, tmc_params)
178 CALL create_approx_energy_result_message(elem, m_send, tmc_params)
180 CALL create_energy_result_message(elem, m_send, tmc_params)
183 CALL create_nmc_request_massage(msg_type, elem, m_send, tmc_params)
185 CALL create_nmc_result_massage(msg_type, elem, m_send, tmc_params)
187 cpassert(
PRESENT(list_elem))
188 CALL create_analysis_request_message(list_elem, m_send, tmc_params)
190 cpabort(
"try to send unknown message type "//cp_to_string(msg_type))
193 message_tag = msg_type
195 m_send%info(1) = msg_type
196 IF (
ALLOCATED(m_send%task_int)) m_send%info(2) =
SIZE(m_send%task_int)
197 IF (
ALLOCATED(m_send%task_real)) m_send%info(3) =
SIZE(m_send%task_real)
198 IF (
ALLOCATED(m_send%task_char)) m_send%info(4) =
SIZE(m_send%task_char)
203 CALL para_env%send(m_send%info, dest, message_tag)
204 IF (m_send%info(2) .GT. 0)
THEN
205 CALL para_env%send(m_send%task_int, dest, message_tag)
207 IF (m_send%info(3) .GT. 0)
THEN
208 CALL para_env%send(m_send%task_real, dest, message_tag)
210 IF (m_send%info(4) .GT. 0)
THEN
215 WRITE (*, *)
"TMC|message: ID: ", para_env%mepos, &
216 " send element info to ", dest,
" of stat ", m_send%info(1), &
217 " with size int/real/char", m_send%info(2:),
" with comm ", &
218 para_env%get_handle(),
" and tag ", message_tag
219 IF (m_send%info(2) .GT. 0)
DEALLOCATE (m_send%task_int)
220 IF (m_send%info(3) .GT. 0)
DEALLOCATE (m_send%task_real)
221 IF (m_send%info(4) .GT. 0)
DEALLOCATE (m_send%task_char)
222 IF (
PRESENT(success)) success = .true.
229 IF (para_env%num_pe .GT. 1)
THEN
231 IF (m_send%info(2) .GT. 0)
THEN
232 IF (.NOT. act_send_recv)
ALLOCATE (m_send%task_int(m_send%info(2)))
235 IF (m_send%info(3) .GT. 0)
THEN
236 IF (.NOT. act_send_recv)
ALLOCATE (m_send%task_real(m_send%info(3)))
239 IF (m_send%info(4) .GT. 0)
THEN
240 IF (.NOT. act_send_recv)
ALLOCATE (m_send%task_char(m_send%info(3)))
246 IF (act_send_recv)
THEN
247 IF (m_send%info(2) .GT. 0)
DEALLOCATE (m_send%task_int)
248 IF (m_send%info(3) .GT. 0)
DEALLOCATE (m_send%task_real)
249 IF (m_send%info(4) .GT. 0)
DEALLOCATE (m_send%task_char)
259 IF (
PRESENT(wait_for_message))
THEN
261 CALL para_env%probe(dest, tmp_tag)
264 participant_loop:
DO i = 0, para_env%num_pe - 1
265 IF (i .NE. para_env%mepos)
THEN
267 CALL para_env%probe(dest, tmp_tag)
268 IF (dest .EQ. i)
THEN
270 EXIT participant_loop
273 END DO participant_loop
275 IF (flag .EQV. .false.)
THEN
276 IF (
PRESENT(success)) success = .false.
291 CALL para_env%recv(m_send%info, dest, message_tag)
294 WRITE (*, *)
"TMC|message: ID: ", para_env%mepos, &
295 " recv element info from ", dest,
" of stat ", m_send%info(1), &
296 " with size int/real/char", m_send%info(2:)
298 IF (m_send%info(2) .GT. 0)
THEN
299 ALLOCATE (m_send%task_int(m_send%info(2)))
300 CALL para_env%recv(m_send%task_int, dest, message_tag)
303 IF (m_send%info(3) .GT. 0)
THEN
304 ALLOCATE (m_send%task_real(m_send%info(3)))
305 CALL para_env%recv(m_send%task_real, dest, message_tag)
308 IF (m_send%info(4) .GT. 0)
THEN
309 ALLOCATE (m_send%task_char(m_send%info(4)))
316 IF (act_send_recv .EQV.
recv_msg)
THEN
319 IF (
PRESENT(elem_array))
THEN
321 msg_type = m_send%info(1)
322 IF (m_send%info(2) .GT. 0)
DEALLOCATE (m_send%task_int)
323 IF (m_send%info(3) .GT. 0)
DEALLOCATE (m_send%task_real)
324 IF (m_send%info(4) .GT. 0)
DEALLOCATE (m_send%task_char)
326 IF (
PRESENT(success)) success = .true.
332 msg_type = m_send%info(1)
333 SELECT CASE (m_send%info(1))
339 CALL read_worker_init_message(tmc_params, m_send)
341 IF (
PRESENT(elem_array))
THEN
342 CALL read_start_conf_message(msg_type, elem_array(dest)%elem, &
343 result_count, m_send, tmc_params)
345 CALL read_start_conf_message(msg_type, elem, result_count, m_send, &
349 CALL read_approx_energy_result(elem_array(dest)%elem, m_send, tmc_params)
351 CALL read_energy_request_message(elem, m_send, tmc_params)
353 IF (
PRESENT(elem_array)) &
354 CALL read_energy_result_message(elem_array(dest)%elem, m_send, tmc_params)
357 CALL read_nmc_request_massage(msg_type, elem, m_send, tmc_params)
359 IF (
PRESENT(elem_array)) &
360 CALL read_nmc_result_massage(msg_type, elem_array(dest)%elem, m_send, tmc_params)
364 CALL read_scf_step_ener(elem_array(dest)%elem, m_send)
366 CALL read_analysis_request_message(elem, m_send, tmc_params)
368 CALL cp_abort(__location__, &
369 "try to receive unknown message type "//cp_to_string(msg_type)// &
370 "from source "//cp_to_string(dest))
372 IF (m_send%info(2) .GT. 0)
DEALLOCATE (m_send%task_int)
373 IF (m_send%info(3) .GT. 0)
DEALLOCATE (m_send%task_real)
374 IF (m_send%info(4) .GT. 0)
DEALLOCATE (m_send%task_char)
375 IF (
PRESENT(success)) success = .true.
388 SUBROUTINE create_status_message(m_send)
389 TYPE(message_send),
POINTER :: m_send
391 cpassert(
ASSOCIATED(m_send))
395 cpassert(.NOT.
ALLOCATED(m_send%task_int))
396 cpassert(.NOT.
ALLOCATED(m_send%task_real))
399 END SUBROUTINE create_status_message
491 SUBROUTINE create_worker_init_message(tmc_params, m_send)
492 TYPE(tmc_param_type),
POINTER :: tmc_params
493 TYPE(message_send),
POINTER :: m_send
495 INTEGER :: counter, msg_size_int, msg_size_real
497 cpassert(
ASSOCIATED(tmc_params))
498 cpassert(
ASSOCIATED(m_send))
499 cpassert(.NOT.
ALLOCATED(m_send%task_int))
500 cpassert(.NOT.
ALLOCATED(m_send%task_real))
501 cpassert(.NOT.
ALLOCATED(m_send%task_char))
502 cpassert(
ASSOCIATED(tmc_params%cell))
505 msg_size_int = 1 +
SIZE(tmc_params%cell%perd) + 1 + 1 + 1 + 1
506 ALLOCATE (m_send%task_int(msg_size_int))
507 m_send%task_int(counter) =
SIZE(tmc_params%cell%perd)
508 counter = counter + 1 + m_send%task_int(counter)
509 m_send%task_int(2:counter - 1) = tmc_params%cell%perd(:)
510 m_send%task_int(counter) = 1
511 m_send%task_int(counter + 1) = tmc_params%cell%symmetry_id
512 m_send%task_int(counter + 2) = 0
513 IF (tmc_params%cell%orthorhombic) m_send%task_int(counter + 2) = 1
514 counter = counter + 3
515 m_send%task_int(counter) = message_end_flag
516 cpassert(counter .EQ.
SIZE(m_send%task_int))
519 msg_size_real = 1 +
SIZE(tmc_params%cell%hmat) + 1
520 ALLOCATE (m_send%task_real(msg_size_real))
522 m_send%task_real(counter) =
SIZE(tmc_params%cell%hmat)
523 m_send%task_real(counter + 1:counter +
SIZE(tmc_params%cell%hmat)) = &
524 reshape(tmc_params%cell%hmat(:, :), &
525 (/
SIZE(tmc_params%cell%hmat)/))
526 counter = counter + 1 + int(m_send%task_real(counter))
527 m_send%task_real(counter) = real(message_end_flag, kind=
dp)
528 cpassert(
SIZE(m_send%task_real) .EQ. msg_size_real)
529 cpassert(int(m_send%task_real(msg_size_real)) .EQ. message_end_flag)
530 END SUBROUTINE create_worker_init_message
538 SUBROUTINE read_worker_init_message(tmc_params, m_send)
539 TYPE(tmc_param_type),
POINTER :: tmc_params
540 TYPE(message_send),
POINTER :: m_send
545 cpassert(
ASSOCIATED(tmc_params))
546 cpassert(
ASSOCIATED(m_send))
547 cpassert(m_send%info(3) .GE. 4)
549 IF (.NOT.
ASSOCIATED(tmc_params%cell))
ALLOCATE (tmc_params%cell)
552 flag = int(m_send%task_int(1)) .EQ.
SIZE(tmc_params%cell%perd)
554 counter = 1 + m_send%task_int(1) + 1
555 tmc_params%cell%perd = m_send%task_int(2:counter - 1)
556 tmc_params%cell%symmetry_id = m_send%task_int(counter + 1)
557 tmc_params%cell%orthorhombic = .false.
558 IF (m_send%task_int(counter + 2) .EQ. 1) tmc_params%cell%orthorhombic = .true.
559 counter = counter + 3
560 cpassert(counter .EQ. m_send%info(2))
561 cpassert(m_send%task_int(counter) .EQ. message_end_flag)
565 flag = int(m_send%task_real(counter)) .EQ.
SIZE(tmc_params%cell%hmat)
567 tmc_params%cell%hmat = &
568 reshape(m_send%task_real(counter + 1:counter + &
569 SIZE(tmc_params%cell%hmat)), (/3, 3/))
570 counter = counter + 1 + int(m_send%task_real(counter))
572 cpassert(counter .EQ. m_send%info(3))
573 cpassert(int(m_send%task_real(m_send%info(3))) .EQ. message_end_flag)
575 END SUBROUTINE read_worker_init_message
587 SUBROUTINE create_start_conf_message(msg_type, elem, result_count, &
590 TYPE(tree_type),
POINTER :: elem
591 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: result_count
592 TYPE(tmc_param_type),
POINTER :: tmc_params
593 TYPE(message_send),
POINTER :: m_send
595 INTEGER :: counter, i, msg_size_int, msg_size_real
597 cpassert(
ASSOCIATED(m_send))
598 cpassert(
ASSOCIATED(elem))
599 cpassert(
ASSOCIATED(tmc_params))
600 cpassert(
ASSOCIATED(tmc_params%atoms))
601 cpassert(.NOT.
ALLOCATED(m_send%task_int))
602 cpassert(.NOT.
ALLOCATED(m_send%task_real))
603 cpassert(.NOT.
ALLOCATED(m_send%task_char))
606 msg_size_int = 1 +
SIZE(tmc_params%cell%perd) + 1 + 1 + 1 + 1 +
SIZE(elem%mol) + 1
608 cpassert(
PRESENT(result_count))
609 cpassert(
ASSOCIATED(result_count))
610 msg_size_int = msg_size_int + 1 +
SIZE(result_count(1:))
612 ALLOCATE (m_send%task_int(msg_size_int))
613 m_send%task_int(counter) =
SIZE(tmc_params%cell%perd)
614 counter = counter + 1 + m_send%task_int(counter)
615 m_send%task_int(2:counter - 1) = tmc_params%cell%perd(:)
616 m_send%task_int(counter) = 1
617 m_send%task_int(counter + 1) = tmc_params%cell%symmetry_id
618 m_send%task_int(counter + 2) = 0
619 IF (tmc_params%cell%orthorhombic) m_send%task_int(counter + 2) = 1
620 counter = counter + 3
621 m_send%task_int(counter) =
SIZE(elem%mol)
622 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = elem%mol(:)
623 counter = counter + 1 + m_send%task_int(counter)
625 m_send%task_int(counter) =
SIZE(result_count(1:))
626 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = &
628 counter = counter + 1 + m_send%task_int(counter)
630 m_send%task_int(counter) = message_end_flag
631 cpassert(counter .EQ.
SIZE(m_send%task_int))
635 msg_size_real = 1 +
SIZE(elem%pos) + 1 +
SIZE(tmc_params%cell%hmat) &
636 + 1 +
SIZE(tmc_params%atoms) + 1
637 ALLOCATE (m_send%task_real(msg_size_real))
638 m_send%task_real(1) = real(
SIZE(elem%pos), kind=
dp)
639 counter = 2 + int(m_send%task_real(1))
640 m_send%task_real(2:counter - 1) = elem%pos
641 m_send%task_real(counter) =
SIZE(tmc_params%cell%hmat)
642 m_send%task_real(counter + 1:counter +
SIZE(tmc_params%cell%hmat)) = &
643 reshape(tmc_params%cell%hmat(:, :), &
644 (/
SIZE(tmc_params%cell%hmat)/))
645 counter = counter + 1 + int(m_send%task_real(counter))
646 m_send%task_real(counter) =
SIZE(tmc_params%atoms)
647 DO i = 1,
SIZE(tmc_params%atoms)
648 m_send%task_real(counter + i) = tmc_params%atoms(i)%mass
650 counter = counter + 1 + int(m_send%task_real(counter))
651 m_send%task_real(counter) = real(message_end_flag, kind=
dp)
652 cpassert(
SIZE(m_send%task_real) .EQ. msg_size_real)
653 cpassert(int(m_send%task_real(msg_size_real)) .EQ. message_end_flag)
655 END SUBROUTINE create_start_conf_message
667 SUBROUTINE read_start_conf_message(msg_type, elem, result_count, m_send, &
670 TYPE(tree_type),
POINTER :: elem
671 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: result_count
672 TYPE(message_send),
POINTER :: m_send
673 TYPE(tmc_param_type),
POINTER :: tmc_params
675 INTEGER :: counter, i
678 cpassert(
ASSOCIATED(tmc_params))
679 cpassert(.NOT.
ASSOCIATED(tmc_params%atoms))
680 cpassert(
ASSOCIATED(m_send))
681 cpassert(.NOT.
ASSOCIATED(elem))
682 cpassert(m_send%info(3) .GE. 4)
684 IF (.NOT.
ASSOCIATED(tmc_params%cell))
ALLOCATE (tmc_params%cell)
686 nr_dim=nint(m_send%task_real(1)))
689 flag = int(m_send%task_int(1)) .EQ.
SIZE(tmc_params%cell%perd)
691 counter = 1 + m_send%task_int(1) + 1
692 tmc_params%cell%perd = m_send%task_int(2:counter - 1)
693 tmc_params%cell%symmetry_id = m_send%task_int(counter + 1)
694 tmc_params%cell%orthorhombic = .false.
695 IF (m_send%task_int(counter + 2) .EQ. 1) tmc_params%cell%orthorhombic = .true.
696 counter = counter + 3
697 elem%mol(:) = m_send%task_int(counter + 1:counter + m_send%task_int(counter))
698 counter = counter + 1 + m_send%task_int(counter)
700 cpassert(
PRESENT(result_count))
701 cpassert(.NOT.
ASSOCIATED(result_count))
702 ALLOCATE (result_count(m_send%task_int(counter)))
703 result_count(:) = m_send%task_int(counter + 1:counter + m_send%task_int(counter))
704 counter = counter + 1 + m_send%task_int(counter)
706 cpassert(counter .EQ. m_send%info(2))
707 cpassert(m_send%task_int(counter) .EQ. message_end_flag)
711 counter = 2 + int(m_send%task_real(1))
712 elem%pos = m_send%task_real(2:counter - 1)
713 flag = int(m_send%task_real(counter)) .EQ.
SIZE(tmc_params%cell%hmat)
715 tmc_params%cell%hmat = &
716 reshape(m_send%task_real(counter + 1:counter + &
717 SIZE(tmc_params%cell%hmat)), (/3, 3/))
718 counter = counter + 1 + int(m_send%task_real(counter))
721 nr_atoms=int(m_send%task_real(counter)))
722 DO i = 1,
SIZE(tmc_params%atoms)
723 tmc_params%atoms(i)%mass = m_send%task_real(counter + i)
725 counter = counter + 1 + int(m_send%task_real(counter))
727 cpassert(counter .EQ. m_send%info(3))
728 cpassert(int(m_send%task_real(m_send%info(3))) .EQ. message_end_flag)
730 END SUBROUTINE read_start_conf_message
742 SUBROUTINE create_energy_request_message(elem, m_send, &
744 TYPE(tree_type),
POINTER :: elem
745 TYPE(message_send),
POINTER :: m_send
746 TYPE(tmc_param_type),
POINTER :: tmc_params
748 INTEGER :: counter, msg_size_int, msg_size_real
750 cpassert(
ASSOCIATED(m_send))
751 cpassert(.NOT.
ALLOCATED(m_send%task_int))
752 cpassert(.NOT.
ALLOCATED(m_send%task_real))
753 cpassert(
ASSOCIATED(elem))
754 cpassert(
ASSOCIATED(tmc_params))
758 msg_size_int = 1 + 1 + 1 + 1 + 1
759 ALLOCATE (m_send%task_int(msg_size_int))
761 m_send%task_int(counter) = 1
762 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = elem%sub_tree_nr
763 counter = counter + 1 + m_send%task_int(counter)
764 m_send%task_int(counter) = 1
765 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = elem%nr
766 counter = counter + 1 + m_send%task_int(counter)
767 m_send%task_int(counter) = message_end_flag
768 cpassert(
SIZE(m_send%task_int) .EQ. msg_size_int)
769 cpassert(m_send%task_int(msg_size_int) .EQ. message_end_flag)
772 msg_size_real = 1 +
SIZE(elem%pos) + 1
773 IF (tmc_params%pressure .GE. 0.0_dp) msg_size_real = msg_size_real + 1 +
SIZE(elem%box_scale(:))
774 ALLOCATE (m_send%task_real(msg_size_real))
775 m_send%task_real(1) =
SIZE(elem%pos)
776 counter = 2 + int(m_send%task_real(1))
777 m_send%task_real(2:counter - 1) = elem%pos
778 IF (tmc_params%pressure .GE. 0.0_dp)
THEN
779 m_send%task_real(counter) =
SIZE(elem%box_scale)
780 m_send%task_real(counter + 1:counter + int(m_send%task_real(counter))) = elem%box_scale(:)
781 counter = counter + 1 + int(m_send%task_real(counter))
783 m_send%task_real(counter) = real(message_end_flag, kind=
dp)
785 cpassert(
SIZE(m_send%task_real) .EQ. msg_size_real)
786 cpassert(int(m_send%task_real(msg_size_real)) .EQ. message_end_flag)
787 END SUBROUTINE create_energy_request_message
796 SUBROUTINE read_energy_request_message(elem, m_send, tmc_params)
797 TYPE(tree_type),
POINTER :: elem
798 TYPE(message_send),
POINTER :: m_send
799 TYPE(tmc_param_type),
POINTER :: tmc_params
803 cpassert(
ASSOCIATED(m_send))
804 cpassert(m_send%info(3) .GT. 0)
805 cpassert(
ASSOCIATED(tmc_params))
806 cpassert(.NOT.
ASSOCIATED(elem))
809 IF (.NOT.
ASSOCIATED(elem))
THEN
811 tmc_params=tmc_params)
814 cpassert(m_send%info(2) .GT. 0)
816 elem%sub_tree_nr = m_send%task_int(counter + 1)
817 counter = counter + 1 + m_send%task_int(counter)
818 elem%nr = m_send%task_int(counter + 1)
819 counter = counter + 1 + m_send%task_int(counter)
820 cpassert(m_send%task_int(counter) .EQ. message_end_flag)
824 counter = 1 + nint(m_send%task_real(1))
825 elem%pos = m_send%task_real(2:counter)
826 counter = counter + 1
827 IF (tmc_params%pressure .GE. 0.0_dp)
THEN
828 elem%box_scale(:) = m_send%task_real(counter + 1:counter + int(m_send%task_real(counter)))
829 counter = counter + 1 + int(m_send%task_real(counter))
832 cpassert(counter .EQ. m_send%info(3))
833 cpassert(int(m_send%task_real(m_send%info(3))) .EQ. message_end_flag)
834 END SUBROUTINE read_energy_request_message
843 SUBROUTINE create_energy_result_message(elem, m_send, tmc_params)
844 TYPE(tree_type),
POINTER :: elem
845 TYPE(message_send),
POINTER :: m_send
846 TYPE(tmc_param_type),
POINTER :: tmc_params
848 INTEGER :: counter, msg_size_int, msg_size_real
850 cpassert(
ASSOCIATED(m_send))
851 cpassert(.NOT.
ALLOCATED(m_send%task_int))
852 cpassert(.NOT.
ALLOCATED(m_send%task_real))
853 cpassert(
ASSOCIATED(elem))
854 cpassert(
ASSOCIATED(tmc_params))
860 IF (debug .GT. 0)
THEN
861 msg_size_int = 1 + 1 + 1 + 1 + 1
862 ALLOCATE (m_send%task_int(msg_size_int))
864 m_send%task_int(counter) = 1
865 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = elem%sub_tree_nr
866 counter = counter + 1 + m_send%task_int(counter)
867 m_send%task_int(counter) = 1
868 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = elem%nr
869 counter = counter + m_send%task_int(counter) + 1
870 m_send%task_int(counter) = message_end_flag
874 msg_size_real = 1 + 1 + 1
875 IF (tmc_params%print_forces) msg_size_real = msg_size_real + 1 +
SIZE(elem%frc)
876 IF (tmc_params%print_dipole) msg_size_real = msg_size_real + 1 +
SIZE(elem%dipole)
878 ALLOCATE (m_send%task_real(msg_size_real))
879 m_send%task_real(1) = 1
880 m_send%task_real(2) = elem%potential
882 IF (tmc_params%print_forces)
THEN
883 m_send%task_real(counter) =
SIZE(elem%frc)
884 m_send%task_real(counter + 1:counter + nint(m_send%task_real(counter))) = elem%frc
885 counter = counter + nint(m_send%task_real(counter)) + 1
887 IF (tmc_params%print_dipole)
THEN
888 m_send%task_real(counter) =
SIZE(elem%dipole)
889 m_send%task_real(counter + 1:counter + nint(m_send%task_real(counter))) = elem%dipole
890 counter = counter + nint(m_send%task_real(counter)) + 1
893 m_send%task_real(counter) = real(message_end_flag, kind=
dp)
895 cpassert(
SIZE(m_send%task_real) .EQ. msg_size_real)
896 cpassert(int(m_send%task_real(msg_size_real)) .EQ. message_end_flag)
897 END SUBROUTINE create_energy_result_message
906 SUBROUTINE read_energy_result_message(elem, m_send, tmc_params)
907 TYPE(tree_type),
POINTER :: elem
908 TYPE(message_send),
POINTER :: m_send
909 TYPE(tmc_param_type),
POINTER :: tmc_params
913 cpassert(
ASSOCIATED(elem))
914 cpassert(
ASSOCIATED(m_send))
915 cpassert(m_send%info(3) .GT. 0)
916 cpassert(
ASSOCIATED(tmc_params))
920 IF (debug .GT. 0)
THEN
922 IF (elem%sub_tree_nr .NE. m_send%task_int(counter + 1) .OR. &
923 elem%nr .NE. m_send%task_int(counter + 3))
THEN
924 WRITE (*, *)
"ERROR: read_energy_result: master got energy result of subtree elem ", &
925 m_send%task_int(counter + 1), m_send%task_int(counter + 3), &
926 " but expect result of subtree elem", elem%sub_tree_nr, elem%nr
927 cpabort(
"read_energy_result: got energy result from unexpected tree element.")
930 cpassert(m_send%info(2) .EQ. 0)
934 elem%potential = m_send%task_real(2)
936 IF (tmc_params%print_forces)
THEN
937 elem%frc(:) = m_send%task_real((counter + 1):(counter + nint(m_send%task_real(counter))))
938 counter = counter + 1 + nint(m_send%task_real(counter))
940 IF (tmc_params%print_dipole)
THEN
941 elem%dipole(:) = m_send%task_real((counter + 1):(counter + nint(m_send%task_real(counter))))
942 counter = counter + 1 + nint(m_send%task_real(counter))
945 cpassert(counter .EQ. m_send%info(3))
946 cpassert(int(m_send%task_real(m_send%info(3))) .EQ. message_end_flag)
947 END SUBROUTINE read_energy_result_message
956 SUBROUTINE create_approx_energy_result_message(elem, m_send, &
958 TYPE(tree_type),
POINTER :: elem
959 TYPE(message_send),
POINTER :: m_send
960 TYPE(tmc_param_type),
POINTER :: tmc_params
962 INTEGER :: counter, msg_size_real
964 cpassert(
ASSOCIATED(m_send))
965 cpassert(.NOT.
ALLOCATED(m_send%task_int))
966 cpassert(.NOT.
ALLOCATED(m_send%task_real))
967 cpassert(
ASSOCIATED(elem))
968 cpassert(
ASSOCIATED(tmc_params))
973 msg_size_real = 1 + 1 + 1
974 IF (tmc_params%pressure .GE. 0.0_dp) msg_size_real = msg_size_real + 1 +
SIZE(elem%box_scale(:))
976 ALLOCATE (m_send%task_real(msg_size_real))
977 m_send%task_real(1) = 1
978 m_send%task_real(2) = elem%e_pot_approx
981 IF (tmc_params%pressure .GE. 0.0_dp)
THEN
982 m_send%task_real(counter) =
SIZE(elem%box_scale)
983 m_send%task_real(counter + 1:counter + int(m_send%task_real(counter))) = elem%box_scale(:)
984 counter = counter + 1 + int(m_send%task_real(counter))
986 m_send%task_real(counter) = real(message_end_flag, kind=
dp)
988 cpassert(
SIZE(m_send%task_real) .EQ. msg_size_real)
989 cpassert(int(m_send%task_real(msg_size_real)) .EQ. message_end_flag)
990 END SUBROUTINE create_approx_energy_result_message
999 SUBROUTINE read_approx_energy_result(elem, m_send, tmc_params)
1000 TYPE(tree_type),
POINTER :: elem
1001 TYPE(message_send),
POINTER :: m_send
1002 TYPE(tmc_param_type),
POINTER :: tmc_params
1006 cpassert(
ASSOCIATED(elem))
1007 cpassert(
ASSOCIATED(m_send))
1008 cpassert(m_send%info(2) .EQ. 0 .AND. m_send%info(3) .GT. 0)
1009 cpassert(
ASSOCIATED(tmc_params))
1012 elem%e_pot_approx = m_send%task_real(2)
1014 IF (tmc_params%pressure .GE. 0.0_dp)
THEN
1015 elem%box_scale(:) = m_send%task_real(counter + 1:counter + int(m_send%task_real(counter)))
1016 counter = counter + 1 + int(m_send%task_real(counter))
1019 cpassert(counter .EQ. m_send%info(3))
1020 cpassert(int(m_send%task_real(m_send%info(3))) .EQ. message_end_flag)
1021 END SUBROUTINE read_approx_energy_result
1034 SUBROUTINE create_nmc_request_massage(msg_type, elem, m_send, &
1037 TYPE(tree_type),
POINTER :: elem
1038 TYPE(message_send),
POINTER :: m_send
1039 TYPE(tmc_param_type),
POINTER :: tmc_params
1041 INTEGER :: counter, msg_size_int, msg_size_real
1043 cpassert(
ASSOCIATED(m_send))
1044 cpassert(
ASSOCIATED(elem))
1045 cpassert(.NOT.
ALLOCATED(m_send%task_int))
1046 cpassert(.NOT.
ALLOCATED(m_send%task_real))
1047 cpassert(
ASSOCIATED(tmc_params))
1051 msg_size_int = 1 +
SIZE(elem%elem_stat) + 1 +
SIZE(elem%mol) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
1053 ALLOCATE (m_send%task_int(msg_size_int))
1055 m_send%task_int(1) =
SIZE(elem%elem_stat)
1056 counter = 2 + m_send%task_int(1)
1057 m_send%task_int(2:counter - 1) = elem%elem_stat
1058 m_send%task_int(counter) =
SIZE(elem%mol)
1059 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = elem%mol(:)
1060 counter = counter + 1 + m_send%task_int(counter)
1062 m_send%task_int(counter) = 1
1063 m_send%task_int(counter + 1) = elem%move_type
1064 counter = counter + 2
1065 m_send%task_int(counter) = 1
1066 m_send%task_int(counter + 1) = elem%nr
1067 counter = counter + 2
1068 m_send%task_int(counter) = 1
1069 m_send%task_int(counter + 1) = elem%sub_tree_nr
1070 counter = counter + 2
1071 m_send%task_int(counter) = 1
1072 m_send%task_int(counter + 1) = elem%temp_created
1073 m_send%task_int(counter + 2) = message_end_flag
1077 msg_size_real = 1 +
SIZE(elem%pos) + 1 +
SIZE(elem%rng_seed) + 1 +
SIZE(elem%subbox_center(:)) + 1
1079 msg_size_real = msg_size_real + 1 +
SIZE(elem%vel)
1080 IF (tmc_params%pressure .GE. 0.0_dp) msg_size_real = msg_size_real + 1 +
SIZE(elem%box_scale(:))
1082 ALLOCATE (m_send%task_real(msg_size_real))
1083 m_send%task_real(1) =
SIZE(elem%pos)
1084 counter = 2 + int(m_send%task_real(1))
1085 m_send%task_real(2:counter - 1) = elem%pos
1087 m_send%task_real(counter) =
SIZE(elem%vel)
1088 m_send%task_real(counter + 1:counter + nint(m_send%task_real(counter))) = elem%vel
1089 counter = counter + 1 + nint(m_send%task_real(counter))
1092 m_send%task_real(counter) =
SIZE(elem%rng_seed)
1093 m_send%task_real(counter + 1:counter +
SIZE(elem%rng_seed)) = reshape(elem%rng_seed(:, :, :), (/
SIZE(elem%rng_seed)/))
1094 counter = counter + nint(m_send%task_real(counter)) + 1
1096 m_send%task_real(counter) =
SIZE(elem%subbox_center(:))
1097 m_send%task_real(counter + 1:counter +
SIZE(elem%subbox_center)) = elem%subbox_center(:)
1098 counter = counter + 1 + nint(m_send%task_real(counter))
1100 IF (tmc_params%pressure .GE. 0.0_dp)
THEN
1101 m_send%task_real(counter) =
SIZE(elem%box_scale)
1102 m_send%task_real(counter + 1:counter + int(m_send%task_real(counter))) = elem%box_scale(:)
1103 counter = counter + 1 + int(m_send%task_real(counter))
1105 m_send%task_real(counter) = message_end_flag
1107 cpassert(
SIZE(m_send%task_int) .EQ. msg_size_int)
1108 cpassert(
SIZE(m_send%task_real) .EQ. msg_size_real)
1109 cpassert(m_send%task_int(msg_size_int) .EQ. message_end_flag)
1110 cpassert(int(m_send%task_real(msg_size_real)) .EQ. message_end_flag)
1111 END SUBROUTINE create_nmc_request_massage
1121 SUBROUTINE read_nmc_request_massage(msg_type, elem, m_send, &
1124 TYPE(tree_type),
POINTER :: elem
1125 TYPE(message_send),
POINTER :: m_send
1126 TYPE(tmc_param_type),
POINTER :: tmc_params
1128 INTEGER :: counter, num_dim, rnd_seed_size
1130 cpassert(.NOT.
ASSOCIATED(elem))
1131 cpassert(
ASSOCIATED(m_send))
1132 cpassert(m_send%info(2) .GT. 5 .AND. m_send%info(3) .GT. 8)
1133 cpassert(
ASSOCIATED(tmc_params))
1137 rnd_seed_size = m_send%task_int(1 + m_send%task_int(1) + 1)
1139 IF (.NOT.
ASSOCIATED(elem))
THEN
1141 tmc_params=tmc_params)
1144 counter = 2 + m_send%task_int(1)
1145 elem%elem_stat = m_send%task_int(2:counter - 1)
1146 elem%mol(:) = m_send%task_int(counter + 1:counter + m_send%task_int(counter))
1147 counter = counter + 1 + m_send%task_int(counter)
1149 elem%move_type = m_send%task_int(counter + 1)
1150 counter = counter + 2
1151 elem%nr = m_send%task_int(counter + 1)
1152 counter = counter + 2
1153 elem%sub_tree_nr = m_send%task_int(counter + 1)
1154 counter = counter + 2
1155 elem%temp_created = m_send%task_int(counter + 1)
1156 counter = counter + 2
1157 cpassert(counter .EQ. m_send%info(2))
1161 num_dim = nint(m_send%task_real(1))
1162 counter = 2 + int(m_send%task_real(1))
1163 elem%pos = m_send%task_real(2:counter - 1)
1165 elem%vel = m_send%task_real(counter + 1:counter + nint(m_send%task_real(counter)))
1166 counter = counter + nint(m_send%task_real(counter)) + 1
1169 elem%rng_seed(:, :, :) = reshape(m_send%task_real(counter + 1:counter +
SIZE(elem%rng_seed)), (/3, 2, 3/))
1170 counter = counter + nint(m_send%task_real(counter)) + 1
1172 elem%subbox_center(:) = m_send%task_real(counter + 1:counter + int(m_send%task_real(counter)))
1173 counter = counter + 1 + nint(m_send%task_real(counter))
1175 IF (tmc_params%pressure .GE. 0.0_dp)
THEN
1176 elem%box_scale(:) = m_send%task_real(counter + 1:counter + int(m_send%task_real(counter)))
1177 counter = counter + 1 + int(m_send%task_real(counter))
1179 elem%box_scale(:) = 1.0_dp
1182 cpassert(counter .EQ. m_send%info(3))
1183 cpassert(m_send%task_int(m_send%info(2)) .EQ. message_end_flag)
1184 cpassert(int(m_send%task_real(m_send%info(3))) .EQ. message_end_flag)
1185 END SUBROUTINE read_nmc_request_massage
1198 SUBROUTINE create_nmc_result_massage(msg_type, elem, m_send, tmc_params)
1200 TYPE(tree_type),
POINTER :: elem
1201 TYPE(message_send),
POINTER :: m_send
1202 TYPE(tmc_param_type),
POINTER :: tmc_params
1204 INTEGER :: counter, msg_size_int, msg_size_real
1206 cpassert(
ASSOCIATED(m_send))
1207 cpassert(.NOT.
ALLOCATED(m_send%task_int))
1208 cpassert(.NOT.
ALLOCATED(m_send%task_real))
1209 cpassert(
ASSOCIATED(elem))
1210 cpassert(
ASSOCIATED(tmc_params))
1213 msg_size_int = 1 +
SIZE(elem%mol) &
1214 + 1 +
SIZE(tmc_params%nmc_move_types%mv_count) &
1215 + 1 +
SIZE(tmc_params%nmc_move_types%acc_count) + 1
1216 IF (debug .GT. 0) msg_size_int = msg_size_int + 1 + 1 + 1 + 1
1217 IF (.NOT. any(tmc_params%sub_box_size .LE. 0.1_dp)) &
1218 msg_size_int = msg_size_int + 1 +
SIZE(tmc_params%nmc_move_types%subbox_count) &
1219 + 1 +
SIZE(tmc_params%nmc_move_types%subbox_acc_count)
1221 ALLOCATE (m_send%task_int(msg_size_int))
1223 IF (debug .GT. 0)
THEN
1225 m_send%task_int(counter) = 1
1226 m_send%task_int(counter + 1) = elem%sub_tree_nr
1227 counter = counter + 1 + m_send%task_int(counter)
1228 m_send%task_int(counter) = 1
1229 m_send%task_int(counter + 1) = elem%nr
1230 counter = counter + 1 + m_send%task_int(counter)
1233 m_send%task_int(counter) =
SIZE(elem%mol)
1234 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = elem%mol(:)
1235 counter = counter + 1 + m_send%task_int(counter)
1237 m_send%task_int(counter) =
SIZE(tmc_params%nmc_move_types%mv_count)
1238 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = &
1239 reshape(tmc_params%nmc_move_types%mv_count(:, :), &
1240 (/
SIZE(tmc_params%nmc_move_types%mv_count)/))
1241 counter = counter + 1 + m_send%task_int(counter)
1243 m_send%task_int(counter) =
SIZE(tmc_params%nmc_move_types%acc_count)
1244 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = &
1245 reshape(tmc_params%nmc_move_types%acc_count(:, :), &
1246 (/
SIZE(tmc_params%nmc_move_types%acc_count)/))
1247 counter = counter + 1 + m_send%task_int(counter)
1249 IF (.NOT. any(tmc_params%sub_box_size .LE. 0.1_dp))
THEN
1250 m_send%task_int(counter) =
SIZE(tmc_params%nmc_move_types%subbox_count)
1251 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = &
1252 reshape(tmc_params%nmc_move_types%subbox_count(:, :), &
1253 (/
SIZE(tmc_params%nmc_move_types%subbox_count)/))
1254 counter = counter + 1 + m_send%task_int(counter)
1255 m_send%task_int(counter) =
SIZE(tmc_params%nmc_move_types%subbox_acc_count)
1256 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = &
1257 reshape(tmc_params%nmc_move_types%subbox_acc_count(:, :), &
1258 (/
SIZE(tmc_params%nmc_move_types%subbox_acc_count)/))
1259 counter = counter + 1 + m_send%task_int(counter)
1261 m_send%task_int(counter) = message_end_flag
1266 msg_size_real = 1 +
SIZE(elem%pos) &
1267 + 1 +
SIZE(elem%rng_seed) &
1274 msg_size_real = msg_size_real + 1 +
SIZE(elem%vel) + 1 + 1 + 1 + 1
1276 ALLOCATE (m_send%task_real(msg_size_real))
1279 m_send%task_real(counter) =
SIZE(elem%pos)
1280 m_send%task_real(counter + 1:counter + nint(m_send%task_real(counter))) = elem%pos
1281 counter = counter + 1 + nint(m_send%task_real(counter))
1283 m_send%task_real(counter) =
SIZE(elem%rng_seed)
1284 m_send%task_real(counter + 1:counter +
SIZE(elem%rng_seed)) = &
1285 reshape(elem%rng_seed(:, :, :), (/
SIZE(elem%rng_seed)/))
1286 counter = counter + 1 + nint(m_send%task_real(counter))
1288 m_send%task_real(counter) = 1
1289 m_send%task_real(counter + 1) = elem%potential
1290 counter = counter + 2
1292 m_send%task_real(counter) = 1
1293 m_send%task_real(counter + 1) = elem%e_pot_approx
1294 counter = counter + 2
1298 m_send%task_real(counter) =
SIZE(elem%vel)
1299 m_send%task_real(counter + 1:counter + nint(m_send%task_real(counter))) = elem%vel
1300 counter = counter + 1 + int(m_send%task_real(counter))
1301 m_send%task_real(counter) = 1
1302 m_send%task_real(counter + 1) = elem%ekin_before_md
1303 counter = counter + 2
1304 m_send%task_real(counter) = 1
1305 m_send%task_real(counter + 1) = elem%ekin
1306 counter = counter + 2
1308 m_send%task_real(counter) = message_end_flag
1310 cpassert(
SIZE(m_send%task_int) .EQ. msg_size_int)
1311 cpassert(
SIZE(m_send%task_real) .EQ. msg_size_real)
1312 cpassert(m_send%task_int(msg_size_int) .EQ. message_end_flag)
1313 cpassert(int(m_send%task_real(msg_size_real)) .EQ. message_end_flag)
1314 END SUBROUTINE create_nmc_result_massage
1324 SUBROUTINE read_nmc_result_massage(msg_type, elem, m_send, tmc_params)
1326 TYPE(tree_type),
POINTER :: elem
1327 TYPE(message_send),
POINTER :: m_send
1328 TYPE(tmc_param_type),
POINTER :: tmc_params
1331 INTEGER,
DIMENSION(:, :),
POINTER :: acc_counter, mv_counter, &
1332 subbox_acc_counter, subbox_counter
1334 NULLIFY (mv_counter, subbox_counter, acc_counter, subbox_acc_counter)
1336 cpassert(
ASSOCIATED(elem))
1337 cpassert(
ASSOCIATED(m_send))
1338 cpassert(m_send%info(2) .GT. 0 .AND. m_send%info(3) .GT. 0)
1339 cpassert(
ASSOCIATED(tmc_params))
1343 IF (debug .GT. 0)
THEN
1344 IF ((m_send%task_int(counter + 1) .NE. elem%sub_tree_nr) .AND. (m_send%task_int(counter + 3) .NE. elem%nr))
THEN
1345 cpabort(
"read_NMC_result_massage: got result of wrong element")
1347 counter = counter + 2 + 2
1350 elem%mol(:) = m_send%task_int(counter + 1:counter + m_send%task_int(counter))
1351 counter = counter + 1 + m_send%task_int(counter)
1353 ALLOCATE (mv_counter(0:
SIZE(tmc_params%nmc_move_types%mv_count(:, 1)) - 1, &
1354 SIZE(tmc_params%nmc_move_types%mv_count(1, :))))
1355 mv_counter(:, :) = reshape(m_send%task_int(counter + 1:counter + m_send%task_int(counter)), &
1356 (/
SIZE(tmc_params%nmc_move_types%mv_count(:, 1)), &
1357 SIZE(tmc_params%nmc_move_types%mv_count(1, :))/))
1358 counter = counter + 1 + m_send%task_int(counter)
1360 ALLOCATE (acc_counter(0:
SIZE(tmc_params%nmc_move_types%acc_count(:, 1)) - 1, &
1361 SIZE(tmc_params%nmc_move_types%acc_count(1, :))))
1362 acc_counter(:, :) = reshape(m_send%task_int(counter + 1:counter + m_send%task_int(counter)), &
1363 (/
SIZE(tmc_params%nmc_move_types%acc_count(:, 1)), &
1364 SIZE(tmc_params%nmc_move_types%acc_count(1, :))/))
1365 counter = counter + 1 + m_send%task_int(counter)
1367 IF (.NOT. any(tmc_params%sub_box_size .LE. 0.1_dp))
THEN
1368 ALLOCATE (subbox_counter(
SIZE(tmc_params%nmc_move_types%subbox_count(:, 1)), &
1369 SIZE(tmc_params%nmc_move_types%subbox_count(1, :))))
1370 subbox_counter(:, :) = reshape(m_send%task_int(counter + 1:counter + m_send%task_int(counter)), &
1371 (/
SIZE(tmc_params%nmc_move_types%subbox_count(:, 1)), &
1372 SIZE(tmc_params%nmc_move_types%subbox_count(1, :))/))
1373 counter = counter + 1 + m_send%task_int(counter)
1374 ALLOCATE (subbox_acc_counter(
SIZE(tmc_params%nmc_move_types%subbox_acc_count(:, 1)), &
1375 SIZE(tmc_params%nmc_move_types%subbox_acc_count(1, :))))
1376 subbox_acc_counter(:, :) = reshape(m_send%task_int(counter + 1:counter + m_send%task_int(counter)), &
1377 (/
SIZE(tmc_params%nmc_move_types%subbox_acc_count(:, 1)), &
1378 SIZE(tmc_params%nmc_move_types%subbox_acc_count(1, :))/))
1379 counter = counter + 1 + m_send%task_int(counter)
1381 cpassert(counter .EQ. m_send%info(2))
1387 elem%pos = m_send%task_real(counter + 1:counter + nint(m_send%task_real(counter)))
1388 counter = counter + 1 + nint(m_send%task_real(counter))
1390 elem%rng_seed(:, :, :) = reshape(m_send%task_real(counter + 1:counter +
SIZE(elem%rng_seed)), (/3, 2, 3/))
1391 counter = counter + 1 + nint(m_send%task_real(counter))
1393 elem%potential = m_send%task_real(counter + 1)
1394 counter = counter + 2
1396 elem%e_pot_approx = m_send%task_real(counter + 1)
1397 counter = counter + 2
1401 elem%vel = m_send%task_real(counter + 1:counter + nint(m_send%task_real(counter)))
1402 counter = counter + 1 + int(m_send%task_real(counter))
1404 elem%ekin_before_md = m_send%task_real(counter + 1)
1405 counter = counter + 2
1406 elem%ekin = m_send%task_real(counter + 1)
1407 counter = counter + 2
1410 CALL add_mv_prob(move_types=tmc_params%nmc_move_types, prob_opt=tmc_params%esimate_acc_prob, &
1411 mv_counter=mv_counter, acc_counter=acc_counter)
1412 IF (.NOT. any(tmc_params%sub_box_size .LE. 0.1_dp))
THEN
1413 CALL add_mv_prob(move_types=tmc_params%nmc_move_types, prob_opt=tmc_params%esimate_acc_prob, &
1414 subbox_counter=subbox_counter, subbox_acc_counter=subbox_acc_counter)
1417 DEALLOCATE (mv_counter, acc_counter)
1418 IF (.NOT. any(tmc_params%sub_box_size .LE. 0.1_dp)) &
1419 DEALLOCATE (subbox_counter, subbox_acc_counter)
1420 cpassert(counter .EQ. m_send%info(3))
1421 cpassert(m_send%task_int(m_send%info(2)) .EQ. message_end_flag)
1422 cpassert(int(m_send%task_real(m_send%info(3))) .EQ. message_end_flag)
1423 END SUBROUTINE read_nmc_result_massage
1437 SUBROUTINE create_analysis_request_message(list_elem, m_send, &
1439 TYPE(elem_list_type),
POINTER :: list_elem
1440 TYPE(message_send),
POINTER :: m_send
1441 TYPE(tmc_param_type),
POINTER :: tmc_params
1443 INTEGER :: counter, msg_size_int, msg_size_real
1445 cpassert(
ASSOCIATED(m_send))
1446 cpassert(.NOT.
ALLOCATED(m_send%task_int))
1447 cpassert(.NOT.
ALLOCATED(m_send%task_real))
1448 cpassert(
ASSOCIATED(list_elem))
1449 cpassert(
ASSOCIATED(tmc_params))
1453 msg_size_int = 1 + 1 + 1 + 1 + 1
1454 ALLOCATE (m_send%task_int(msg_size_int))
1456 m_send%task_int(counter) = 1
1457 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = list_elem%temp_ind
1458 counter = counter + 1 + m_send%task_int(counter)
1459 m_send%task_int(counter) = 1
1460 m_send%task_int(counter + 1:counter + m_send%task_int(counter)) = list_elem%nr
1461 counter = counter + 1 + m_send%task_int(counter)
1462 m_send%task_int(counter) = message_end_flag
1463 cpassert(
SIZE(m_send%task_int) .EQ. msg_size_int)
1464 cpassert(m_send%task_int(msg_size_int) .EQ. message_end_flag)
1467 msg_size_real = 1 +
SIZE(list_elem%elem%pos) + 1
1468 IF (tmc_params%pressure .GE. 0.0_dp) msg_size_real = msg_size_real + 1 +
SIZE(list_elem%elem%box_scale(:))
1469 ALLOCATE (m_send%task_real(msg_size_real))
1470 m_send%task_real(1) =
SIZE(list_elem%elem%pos)
1471 counter = 2 + int(m_send%task_real(1))
1472 m_send%task_real(2:counter - 1) = list_elem%elem%pos
1473 IF (tmc_params%pressure .GE. 0.0_dp)
THEN
1474 m_send%task_real(counter) =
SIZE(list_elem%elem%box_scale)
1475 m_send%task_real(counter + 1:counter + int(m_send%task_real(counter))) = list_elem%elem%box_scale(:)
1476 counter = counter + 1 + int(m_send%task_real(counter))
1478 m_send%task_real(counter) = real(message_end_flag, kind=
dp)
1480 cpassert(
SIZE(m_send%task_real) .EQ. msg_size_real)
1481 cpassert(int(m_send%task_real(msg_size_real)) .EQ. message_end_flag)
1482 END SUBROUTINE create_analysis_request_message
1491 SUBROUTINE read_analysis_request_message(elem, m_send, tmc_params)
1492 TYPE(tree_type),
POINTER :: elem
1493 TYPE(message_send),
POINTER :: m_send
1494 TYPE(tmc_param_type),
POINTER :: tmc_params
1498 cpassert(
ASSOCIATED(m_send))
1499 cpassert(m_send%info(3) .GT. 0)
1500 cpassert(
ASSOCIATED(tmc_params))
1501 cpassert(.NOT.
ASSOCIATED(elem))
1504 IF (.NOT.
ASSOCIATED(elem))
THEN
1506 tmc_params=tmc_params)
1509 cpassert(m_send%info(2) .GT. 0)
1511 elem%sub_tree_nr = m_send%task_int(counter + 1)
1512 counter = counter + 1 + m_send%task_int(counter)
1513 elem%nr = m_send%task_int(counter + 1)
1514 counter = counter + 1 + m_send%task_int(counter)
1515 cpassert(m_send%task_int(counter) .EQ. message_end_flag)
1519 counter = 1 + nint(m_send%task_real(1))
1520 elem%pos = m_send%task_real(2:counter)
1521 counter = counter + 1
1522 IF (tmc_params%pressure .GE. 0.0_dp)
THEN
1523 elem%box_scale(:) = m_send%task_real(counter + 1:counter + int(m_send%task_real(counter)))
1524 counter = counter + 1 + int(m_send%task_real(counter))
1527 cpassert(counter .EQ. m_send%info(3))
1528 cpassert(int(m_send%task_real(m_send%info(3))) .EQ. message_end_flag)
1529 END SUBROUTINE read_analysis_request_message
1540 SUBROUTINE read_scf_step_ener(elem, m_send)
1541 TYPE(tree_type),
POINTER :: elem
1542 TYPE(message_send),
POINTER :: m_send
1544 cpassert(
ASSOCIATED(elem))
1545 cpassert(
ASSOCIATED(m_send))
1547 elem%scf_energies(mod(elem%scf_energies_count, 4) + 1) = m_send%task_real(1)
1548 elem%scf_energies_count = elem%scf_energies_count + 1
1550 END SUBROUTINE read_scf_step_ener
1562 TYPE(tmc_atom_type),
DIMENSION(:),
POINTER :: atoms
1564 TYPE(mp_para_env_type),
POINTER :: para_env
1566 CHARACTER(LEN=default_string_length), &
1567 ALLOCATABLE,
DIMENSION(:) :: msg(:)
1570 cpassert(
ASSOCIATED(para_env))
1571 cpassert(source .GE. 0)
1572 cpassert(source .LT. para_env%num_pe)
1574 ALLOCATE (msg(
SIZE(atoms)))
1575 IF (para_env%mepos .EQ. source)
THEN
1576 DO i = 1,
SIZE(atoms)
1577 msg(i) = atoms(i)%name
1579 CALL para_env%bcast(msg, source)
1581 CALL para_env%bcast(msg, source)
1582 DO i = 1,
SIZE(atoms)
1583 atoms(i)%name = msg(i)
1599 TYPE(mp_para_env_type),
POINTER :: para_env
1600 TYPE(elem_array_type),
DIMENSION(:),
OPTIONAL, &
1601 POINTER :: worker_info
1602 TYPE(tmc_param_type),
POINTER :: tmc_params
1604 INTEGER :: act_rank, dest_rank, stat
1606 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: rank_stoped
1610 cpassert(
ASSOCIATED(para_env))
1611 cpassert(
ASSOCIATED(tmc_params))
1613 ALLOCATE (rank_stoped(0:para_env%num_pe - 1))
1614 rank_stoped(:) = .false.
1615 rank_stoped(para_env%mepos) = .true.
1618 IF (
PRESENT(worker_info))
THEN
1619 cpassert(
ASSOCIATED(worker_info))
1621 worker_group_loop:
DO dest_rank = 1, para_env%num_pe - 1
1623 IF (worker_info(dest_rank)%busy)
THEN
1625 act_rank = dest_rank
1627 para_env=para_env, tmc_params=tmc_params)
1631 act_rank = dest_rank
1633 para_env=para_env, tmc_params=tmc_params)
1635 END DO worker_group_loop
1640 para_env=para_env, tmc_params=tmc_params)
1645 wait_for_receipts:
DO
1649 IF (
PRESENT(worker_info))
THEN
1652 para_env=para_env, tmc_params=tmc_params, &
1653 elem_array=worker_info(:), success=flag)
1656 para_env=para_env, tmc_params=tmc_params)
1662 IF (
PRESENT(worker_info))
THEN
1663 worker_info(dest_rank)%busy = .false.
1667 para_env=para_env, tmc_params=tmc_params)
1669 cpabort(
"group master should not receive cancel receipt")
1672 rank_stoped(dest_rank) = .true.
1677 CALL cp_abort(__location__, &
1678 "master received status "//cp_to_string(stat)// &
1679 " while stopping workers")
1681 IF (all(rank_stoped))
EXIT wait_for_receipts
1682 END DO wait_for_receipts
1684 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