1!--------------------------------------------------------------------------------------------------!
2!   CP2K: A general program to perform molecular dynamics simulations                              !
3!   Copyright (C) 2000 - 2019  CP2K developers group                                               !
4!--------------------------------------------------------------------------------------------------!
5
6! **************************************************************************************************
7MODULE farming_types
8
9   USE kinds,                           ONLY: default_path_length,&
10                                              dp
11#include "./base/base_uses.f90"
12
13   IMPLICIT NONE
14   PRIVATE
15
16   PUBLIC :: farming_env_type, deallocate_farming_env, init_farming_env, init_job_type
17
18   INTEGER, PUBLIC, PARAMETER :: job_pending = 1, job_running = 2, job_finished = 3
19
20! **************************************************************************************************
21   TYPE job_type
22      CHARACTER(LEN=default_path_length) :: cwd ! the directory to go to
23      CHARACTER(LEN=default_path_length) :: input ! the input file to use
24      CHARACTER(LEN=default_path_length) :: output ! the output file to use
25      INTEGER                            :: ID ! the ID of this job
26      INTEGER, POINTER, DIMENSION(:)     :: dependencies ! the dependencies of this job
27      INTEGER                            :: status ! pending,running,finished
28   END TYPE job_type
29
30! **************************************************************************************************
31   TYPE farming_env_type
32      INTEGER :: group_size_wish
33      LOGICAL :: group_size_wish_set
34      INTEGER :: ngroup_wish
35      LOGICAL :: ngroup_wish_set
36      LOGICAL :: restart
37      LOGICAL :: CYCLE
38      LOGICAL :: master_slave
39      INTEGER, DIMENSION(:), POINTER                              :: group_partition ! user preference for partitioning the cpus
40      CHARACTER(LEN=default_path_length)                          :: restart_file_name ! restart file for farming
41      CHARACTER(LEN=default_path_length)                          :: cwd ! directory we started from
42      INTEGER                                                     :: Njobs ! how many jobs to run
43      INTEGER                                                     :: restart_n ! where to start
44      INTEGER                                                     :: max_steps ! max number of steps,
45      ! results in max_steps*Ngroup jobs being run
46      INTEGER                                                     :: stride ! for creating slave groups.
47      TYPE(job_type), DIMENSION(:), POINTER                       :: job ! a list of jobs
48      REAL(KIND=dp) :: wait_time
49   END TYPE farming_env_type
50
51CONTAINS
52
53! **************************************************************************************************
54!> \brief help poor compilers do their job
55!>       i.e. provide a default initialization
56!> \param farming_env an associated farming env pointer
57!> \par History
58!>      03.2004 created [Joost VandeVondele ]
59! **************************************************************************************************
60   SUBROUTINE init_farming_env(farming_env)
61      TYPE(farming_env_type), POINTER                    :: farming_env
62
63      IF (ASSOCIATED(farming_env)) THEN
64         farming_env%group_size_wish = 0
65         farming_env%group_size_wish_set = .FALSE.
66         farming_env%ngroup_wish = 0
67         farming_env%ngroup_wish_set = .FALSE.
68         farming_env%restart = .FALSE.
69         farming_env%restart_n = 1
70         farming_env%cycle = .FALSE.
71         farming_env%master_slave = .FALSE.
72         NULLIFY (farming_env%group_partition)
73         farming_env%cwd = "."
74         farming_env%Njobs = 0
75         ! so that maxsteps*ngroup is (likely) not overflowing
76         farming_env%max_steps = 65535
77         NULLIFY (farming_env%Job)
78      ENDIF
79   END SUBROUTINE
80
81! **************************************************************************************************
82!> \brief provide a default initialization
83!> \param job ...
84!> \par History
85!>      09.2007 created [Joost VandeVondele ]
86! **************************************************************************************************
87   ELEMENTAL SUBROUTINE init_job_type(job)
88      TYPE(job_type), INTENT(OUT)                        :: job
89
90      job%cwd = ""
91      job%input = ""
92      job%output = ""
93      job%ID = -1
94      job%status = job_pending
95      NULLIFY (job%dependencies)
96
97   END SUBROUTINE init_job_type
98
99! **************************************************************************************************
100!> \brief deallocates all memory associated with this job
101!> \param job ...
102!> \par History
103!>      09.2007 created [Joost VandeVondele ]
104! **************************************************************************************************
105   SUBROUTINE deallocate_job_type(job)
106      TYPE(job_type)                                     :: job
107
108      IF (ASSOCIATED(job%dependencies)) DEALLOCATE (job%dependencies)
109
110   END SUBROUTINE deallocate_job_type
111
112! **************************************************************************************************
113!> \brief deallocates all associated fields of the farming_env type
114!>      and the type itself
115!> \param farming_env ...
116!> \par History
117!>      03.2004 created [Joost VandeVondele]
118! **************************************************************************************************
119   SUBROUTINE deallocate_farming_env(farming_env)
120      TYPE(farming_env_type), POINTER                    :: farming_env
121
122      INTEGER                                            :: I
123
124      IF (ASSOCIATED(farming_env)) THEN
125         IF (ASSOCIATED(farming_env%job)) THEN
126            DO I = 1, SIZE(farming_env%job, 1)
127               CALL deallocate_job_type(farming_env%job(I))
128            ENDDO
129            DEALLOCATE (farming_env%job)
130         ENDIF
131         IF (ASSOCIATED(farming_env%group_partition)) DEALLOCATE (farming_env%group_partition)
132         DEALLOCATE (farming_env) ! and the type itself
133      ENDIF
134   END SUBROUTINE deallocate_farming_env
135END MODULE farming_types
136