117 integer,
parameter,
public :: &
133 type(iteration_counter_t) :: iteration
134 character(len=:),
allocatable :: label
135 logical :: intra_interaction
138 real(real64) :: energy
141 integer,
allocatable :: system_quantities(:)
144 class(interaction_partner_t),
pointer :: partner => null()
145 integer,
allocatable :: couplings_from_partner(:)
146 logical :: partner_couplings_up_to_date = .false.
149 procedure(interaction_calculate),
deferred :: calculate
150 procedure(interaction_calculate_energy),
deferred :: calculate_energy
163 class(interaction_t),
intent(inout) :: this
171 class(interaction_t),
intent(inout) :: this
195 class(interaction_t),
intent(inout) :: this
196 class(iteration_counter_t),
intent(in) :: requested_iteration
198 type(event_handle_t) :: debug_handle
202 if (this%partner_couplings_up_to_date)
then
208 if (.not.
allocated(this%couplings_from_partner))
then
210 this%partner_couplings_up_to_date = .
true.
217 requested_iteration = requested_iteration, &
218 interaction_iteration = this%iteration)
221 call this%partner%update_on_demand_quantities(this%couplings_from_partner, requested_iteration, &
225 select case (this%partner%check_couplings_status(this%couplings_from_partner, requested_iteration))
228 this%partner_couplings_up_to_date = .
true.
229 call this%partner%copy_quantities_to_interaction(this)
240 this%partner_couplings_up_to_date = .false.
250 requested_iteration = requested_iteration, &
251 interaction_iteration = this%iteration)
268 assert(.not. (this%iteration == requested_iteration))
271 extra=
"target: "//trim(this%label)//
"-"//trim(this%partner%namespace%get()), &
272 interaction_iteration = this%iteration, &
273 requested_iteration = requested_iteration)
275 call this%calculate()
278 call this%iteration%set(requested_iteration)
280 trim(this%label)//
"-"//trim(this%partner%namespace%get()), &
281 this%iteration,
"set"))
285 this%partner_couplings_up_to_date = .false.
288 interaction_iteration = this%iteration, &
289 requested_iteration = requested_iteration)
300 if (
allocated(this%couplings_from_partner))
then
301 deallocate(this%couplings_from_partner)
303 nullify(this%partner)
305 if (
allocated(this%system_quantities))
then
306 deallocate(this%system_quantities)
309 if (
allocated(this%label))
then
310 deallocate(this%label)
339 call this%iteration%restart_write(
'restart_iteration_interaction_'//trim(this%label), namespace)
351 call this%add_ptr(interaction)
363 select type (ptr => this%get_next_ptr())
All interactions need to implement the following deferred method, which takes information form the in...
All interactions need to implement the following deferred method, which takes information form the in...
This module defines the abstract interaction_t class, and some auxiliary classes for interactions.
subroutine interaction_update_partner_couplings(this, requested_iteration)
Try to update all the couplings needed from the partner to update the interaction.
subroutine, public interaction_end(this)
subroutine interaction_update(this, requested_iteration)
Update the interaction to the requested_iteration.
logical function interaction_restart_read(this, namespace)
read restart information
class(interaction_t) function, pointer interaction_iterator_get_next(this)
integer, parameter, public timing_retarded
subroutine interaction_restart_write(this, namespace)
subroutine interaction_list_add_node(this, interaction)
This module defines classes and functions for interaction partners.
integer, parameter, public couplings_on_time
integer, parameter, public couplings_behind_in_time
integer, parameter, public couplings_ahead_in_time
integer, parameter, public couplings_undefined
This module implements fully polymorphic linked lists, and some specializations thereof.
This module implements the multisystem debug functionality.
subroutine, public multisystem_debug_write_marker(system_namespace, event)
type(event_handle_t) function, public multisystem_debug_write_event_in(system_namespace, event, extra, system_iteration, algo_iteration, interaction_iteration, partner_iteration, requested_iteration)
subroutine, public multisystem_debug_write_event_out(handle, extra, update, system_iteration, algo_iteration, interaction_iteration, partner_iteration, requested_iteration)
This module defines the quantity_t class and the IDs for quantities, which can be exposed by a system...
These class extend the list and list iterator to make an interaction list.
These classes extend the list and list iterator to make an interaction list.
abstract interaction class
surrogate interaction class to avoid circular dependencies between modules.
This class implements the iteration counter used by the multisystem algorithms. As any iteration coun...
This class implements an iterator for the polymorphic linked list.
This class implements a linked list of unlimited polymorphic values.
events marking a function call
handle to keep track of in- out- events
events marking an iteration update