MONC
timestepper.F90
Go to the documentation of this file.
1 
5  use state_mod, only : model_state_type
6  use grids_mod, only : x_index, y_index
9  implicit none
10 
11 #ifndef TEST_MODE
12  private
13 #endif
14 
15  type(group_descriptor_type), dimension(:), allocatable :: group_descriptors
16 
18 contains
19 
22  subroutine init_timestepper()
24  end subroutine init_timestepper
25 
29  subroutine timestep(current_state)
30  type(model_state_type), intent(inout) :: current_state
31 
32  integer :: i
33 
34  do i=1,size(group_descriptors)
35  if (group_descriptors(i)%type == group_type_whole) then
36  call timestep_whole(current_state, group_descriptors(i))
37  else if (group_descriptors(i)%type == group_type_column) then
38  call timestep_column(current_state, group_descriptors(i))
39  end if
40  end do
41  end subroutine timestep
42 
44  subroutine finalise_timestepper()
45  deallocate(group_descriptors)
46  end subroutine finalise_timestepper
47 
52  subroutine timestep_column(current_state, group_descriptor)
53  type(model_state_type), intent(inout) :: current_state
54  type(group_descriptor_type), intent(in) :: group_descriptor
55 
56  current_state%column_global_x=current_state%local_grid%start(x_index) - current_state%local_grid%halo_size(x_index)
57  current_state%column_local_x=1
58  do while (current_state%column_global_x .le. &
59  current_state%local_grid%end(x_index)+current_state%local_grid%halo_size(x_index))
60  current_state%column_global_y = current_state%local_grid%start(y_index) - current_state%local_grid%halo_size(y_index)
61  current_state%column_local_y=1
62  do while (current_state%column_global_y .le. &
63  current_state%local_grid%end(y_index)+current_state%local_grid%halo_size(y_index))
64  call update_state_sitation_flags(current_state)
65  call execute_timestep_callbacks(current_state, group_descriptor%id)
66  current_state%column_global_y = current_state%column_global_y + 1
67  current_state%column_local_y = current_state%column_local_y + 1
68  end do
69  current_state%column_global_x = current_state%column_global_x + 1
70  current_state%column_local_x = current_state%column_local_x + 1
71  end do
72  end subroutine timestep_column
73 
77  subroutine timestep_whole(current_state, group_descriptor)
78  type(model_state_type), intent(inout) :: current_state
79  type(group_descriptor_type), intent(in) :: group_descriptor
80 
81  call execute_timestep_callbacks(current_state, group_descriptor%id)
82  end subroutine timestep_whole
83 
87  subroutine update_state_sitation_flags(current_state)
88  type(model_state_type), intent(inout) :: current_state
89 
90  current_state%first_timestep_column = (current_state%column_local_x == 1 .and. current_state%column_local_y == 1)
91  current_state%last_timestep_column = (current_state%column_global_x == &
92  current_state%local_grid%end(x_index) + current_state%local_grid%halo_size(x_index) .and. &
93  current_state%column_global_y == current_state%local_grid%end(y_index) + current_state%local_grid%halo_size(y_index))
94 
95  current_state%first_nonhalo_timestep_column = (current_state%column_local_x == current_state%local_grid%halo_size(x_index)+1 &
96  .and. current_state%column_local_y == current_state%local_grid%halo_size(y_index)+1)
97 
98  current_state%halo_column = current_state%column_local_y .lt. current_state%local_grid%local_domain_start_index(y_index) .or.&
99  current_state%column_local_x .lt. current_state%local_grid%local_domain_start_index(x_index) .or.&
100  current_state%column_local_y .gt. current_state%local_grid%local_domain_end_index(y_index) .or.&
101  current_state%column_local_x .gt. current_state%local_grid%local_domain_end_index(x_index)
102  end subroutine update_state_sitation_flags
103 end module timestepper_mod
timestepper_mod::timestep_column
subroutine timestep_column(current_state, group_descriptor)
Performs timestepping for a group of components on a per column basis. Each component in the group is...
Definition: timestepper.F90:53
timestepper_mod::finalise_timestepper
subroutine, public finalise_timestepper()
Finalises the timestepper by cleaning up allocated memory.
Definition: timestepper.F90:45
timestepper_mod::init_timestepper
subroutine, public init_timestepper()
Initialises the timestepper by prefetching the groups in the order that they will be executed,...
Definition: timestepper.F90:23
grids_mod::x_index
integer, parameter, public x_index
Definition: grids.F90:14
grids_mod::y_index
integer, parameter, public y_index
Definition: grids.F90:14
registry_mod::group_type_whole
integer, parameter, public group_type_whole
Execute the callbacks in this group once per timestep.
Definition: registry.F90:22
timestepper_mod::update_state_sitation_flags
subroutine update_state_sitation_flags(current_state)
Updates the states situation flags for easy retrieval in the components that are run per timestep.
Definition: timestepper.F90:88
timestepper_mod::timestep
subroutine, public timestep(current_state)
Performs a timestep, which is comprised of executing each group of components in the order that they ...
Definition: timestepper.F90:30
timestepper_mod::timestep_whole
subroutine timestep_whole(current_state, group_descriptor)
Executes a timestep for components in a group which are designed to be executed once per timestep.
Definition: timestepper.F90:78
registry_mod::get_ordered_groups
subroutine, public get_ordered_groups(ordered_groups)
Orders all the groups (in the order that they will be called in) and returns an array with these in o...
Definition: registry.F90:363
state_mod::model_state_type
The ModelState which represents the current state of a run.
Definition: state.F90:39
registry_mod::group_type_column
integer, parameter, public group_type_column
Execute the callbacks in this group for each column per timestep.
Definition: registry.F90:22
registry_mod::group_descriptor_type
Descriptor of a group.
Definition: registry.F90:39
registry_mod
MONC component registry.
Definition: registry.F90:5
timestepper_mod
Performs the actual time stepping over groups of components. Each group can be the whole (which is on...
Definition: timestepper.F90:4
grids_mod
Functionality to support the different types of grid and abstraction between global grids and local o...
Definition: grids.F90:5
registry_mod::execute_timestep_callbacks
subroutine, public execute_timestep_callbacks(current_state, group_id)
Calls all timestep callbacks with the specified state.
Definition: registry.F90:283
timestepper_mod::group_descriptors
type(group_descriptor_type), dimension(:), allocatable group_descriptors
Prefetched ordered group descriptors.
Definition: timestepper.F90:15
state_mod
The model state which represents the current state of a run.
Definition: state.F90:2