1!--------------------------------------------------------------------------------------------------!
2!   CP2K: A general program to perform molecular dynamics simulations                              !
3!   Copyright (C) 2000 - 2019  CP2K developers group                                               !
4!--------------------------------------------------------------------------------------------------!
5
6! **************************************************************************************************
7!> \brief some minimal info about CP2K, including its version and license
8!> \par History
9!>      - created (2007-09, Joost VandeVondele)
10!>      - moved into this module information related to runtime:pid, user_name,
11!>        host_name, cwd, datx  (2009-06, Teodoro Laino)
12!> \author Joost VandeVondele
13! **************************************************************************************************
14MODULE cp2k_info
15
16   USE input_constants,                 ONLY: id_development_version,&
17                                              id_release_version
18   USE kinds,                           ONLY: default_path_length,&
19                                              default_string_length
20   USE machine,                         ONLY: m_datum,&
21                                              m_getcwd,&
22                                              m_getlog,&
23                                              m_getpid,&
24                                              m_hostnm
25   USE string_utilities,                ONLY: integer_to_string
26
27   IMPLICIT NONE
28   PRIVATE
29
30   PUBLIC :: cp2k_year, cp2k_version, cp2k_home, id_cp2k_version, cp2k_flags
31   PUBLIC :: compile_arch, compile_date, compile_host, compile_revision
32   PUBLIC :: print_cp2k_license, get_runtime_info, write_restart_header
33
34   ! the version string of CP2K intended to be adjust after releases and branches
35#if defined(__RELEASE_VERSION)
36   INTEGER, PARAMETER          :: id_cp2k_version = id_release_version ! (Uncomment for release     version)
37#else
38!  INTEGER, PARAMETER          :: id_cp2k_version = id_development_version ! (Uncomment for development version)
39   INTEGER, PARAMETER          :: id_cp2k_version = 2                      ! (Uncomment for branch      version)
40#endif
41
42#if defined(__COMPILE_REVISION)
43   CHARACTER(LEN=*), PARAMETER :: compile_revision = __COMPILE_REVISION
44#else
45   CHARACTER(LEN=*), PARAMETER :: compile_revision = "unknown"
46#endif
47
48   CHARACTER(LEN=*), PARAMETER :: version_nr = "7.1"
49   CHARACTER(LEN=*), PARAMETER :: cp2k_year = "2019"
50   CHARACTER(LEN=*), PARAMETER :: cp2k_version = "CP2K version "//TRIM(version_nr)
51   CHARACTER(LEN=*), PARAMETER :: cp2k_home = "https://www.cp2k.org/"
52
53   ! compile time information
54#if defined(__COMPILE_ARCH)
55   CHARACTER(LEN=*), PARAMETER :: compile_arch = __COMPILE_ARCH
56#else
57   CHARACTER(LEN=*), PARAMETER :: compile_arch = "unknown: -D__COMPILE_ARCH=?"
58#endif
59
60#if defined(__COMPILE_DATE)
61   CHARACTER(LEN=*), PARAMETER :: compile_date = __COMPILE_DATE
62#else
63   CHARACTER(LEN=*), PARAMETER :: compile_date = "unknown: -D__COMPILE_DATE=?"
64#endif
65
66#if defined(__COMPILE_HOST)
67   CHARACTER(LEN=*), PARAMETER :: compile_host = __COMPILE_HOST
68#else
69   CHARACTER(LEN=*), PARAMETER :: compile_host = "unknown: -D__COMPILE_HOST=?"
70#endif
71
72   ! Local runtime informations
73   CHARACTER(LEN=26), PUBLIC                        :: r_datx
74   CHARACTER(LEN=default_path_length), PUBLIC       :: r_cwd
75   CHARACTER(LEN=default_string_length), PUBLIC     :: r_host_name, r_user_name
76   INTEGER, PUBLIC                                  :: r_pid
77
78   CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'cp2k_info'
79CONTAINS
80
81! **************************************************************************************************
82!> \brief list all compile time options that influence the capabilities of cp2k.
83!>        All new flags should be added here (and be unique grep-able)
84!> \return ...
85! **************************************************************************************************
86   FUNCTION cp2k_flags() RESULT(flags)
87      CHARACTER(len=10*default_string_length)            :: flags
88
89      CHARACTER(len=default_string_length)               :: tmp_str
90
91      flags = "cp2kflags:"
92
93      ! Ensure that tmp_str is used to silence compiler warnings
94      tmp_str = ""
95      flags = TRIM(flags)//TRIM(tmp_str)
96
97#if defined(NDEBUG)
98      flags = TRIM(flags)//" ndebug"
99#endif
100!$    flags = TRIM(flags)//" omp"
101#if defined(__LIBINT)
102      flags = TRIM(flags)//" libint"
103#endif
104#if defined(__FFTW3)
105      flags = TRIM(flags)//" fftw3"
106#endif
107#if defined(__LIBXC)
108      flags = TRIM(flags)//" libxc"
109#endif
110#if defined(__LIBPEXSI)
111      flags = TRIM(flags)//" pexsi"
112#endif
113#if defined(__ELPA)
114      flags = TRIM(flags)//" elpa"
115#endif
116#if defined(__parallel)
117      flags = TRIM(flags)//" parallel"
118#if !defined(__MPI_VERSION) || (__MPI_VERSION > 2)
119      flags = TRIM(flags)//" mpi3"
120#else
121      flags = TRIM(flags)//" mpi2"
122#endif
123#endif
124#if defined(__SCALAPACK)
125      flags = TRIM(flags)//" scalapack"
126#endif
127
128#if defined(__QUIP)
129      flags = TRIM(flags)//" quip"
130#endif
131
132#if defined(__ACC)
133      flags = TRIM(flags)//" acc"
134#endif
135#if defined(__PW_CUDA)
136      flags = TRIM(flags)//" pw_cuda"
137#endif
138#if defined(__PW_FPGA)
139      flags = TRIM(flags)//" pw_fpga"
140#endif
141#if defined(__PW_FPGA_SP)
142      flags = TRIM(flags)//" pw_fpga_sp"
143#endif
144#if defined(__HAS_PATCHED_CUFFT_70)
145      flags = TRIM(flags)//" patched_cufft_70"
146#endif
147
148#if defined __HAS_smm_vec
149      flags = TRIM(flags)//" smm_vec"
150#endif
151#if defined __HAS_smm_snn
152      flags = TRIM(flags)//" smm_snn"
153#endif
154#if defined __HAS_smm_snt
155      flags = TRIM(flags)//" smm_snt"
156#endif
157#if defined __HAS_smm_stn
158      flags = TRIM(flags)//" smm_stn"
159#endif
160#if defined __HAS_smm_stt
161      flags = TRIM(flags)//" smm_stt"
162#endif
163#if defined __HAS_smm_znn
164      flags = TRIM(flags)//" smm_znn"
165#endif
166#if defined __HAS_smm_znt
167      flags = TRIM(flags)//" smm_znt"
168#endif
169#if defined __HAS_smm_ztn
170      flags = TRIM(flags)//" smm_ztn"
171#endif
172#if defined __HAS_smm_ztt
173      flags = TRIM(flags)//" smm_ztt"
174#endif
175#if defined __HAS_smm_cnn
176      flags = TRIM(flags)//" smm_cnn"
177#endif
178#if defined __HAS_smm_cnt
179      flags = TRIM(flags)//" smm_cnt"
180#endif
181#if defined __HAS_smm_ctn
182      flags = TRIM(flags)//" smm_ctn"
183#endif
184#if defined __HAS_smm_ctt
185      flags = TRIM(flags)//" smm_ctt"
186#endif
187#if defined __HAS_smm_dnn
188      flags = TRIM(flags)//" smm_dnn"
189#endif
190#if defined __HAS_smm_dnt
191      flags = TRIM(flags)//" smm_dnt"
192#endif
193#if defined __HAS_smm_dtn
194      flags = TRIM(flags)//" smm_dtn"
195#endif
196#if defined __HAS_smm_dtt
197      flags = TRIM(flags)//" smm_dtt"
198#endif
199      IF (INDEX(flags, " smm_") > 0) THEN
200         flags = TRIM(flags)//" smm"
201      ENDIF
202
203#if defined __LIBXSMM
204      flags = TRIM(flags)//" xsmm"
205#endif
206
207#if defined __CRAY_PM_ACCEL_ENERGY
208      flags = TRIM(flags)//" cray_pm_accel_energy"
209#endif
210#if defined __CRAY_PM_ENERGY
211      flags = TRIM(flags)//" cray_pm_energy"
212#endif
213#if defined __CRAY_PM_FAKE_ENERGY
214      flags = TRIM(flags)//" cray_pm_fake_energy"
215#endif
216#if defined __CUDA_PROFILING
217      flags = TRIM(flags)//" cuda_profiling"
218#endif
219#if defined __DBCSR_ACC
220      flags = TRIM(flags)//" dbcsr_acc"
221#endif
222#if defined __HAS_LIBGRID
223      flags = TRIM(flags)//" libgrid"
224#endif
225#if defined __HAS_NO_CUDA_STREAM_PRIORITIES
226      flags = TRIM(flags)//" has_no_cuda_stream_priorities"
227#endif
228#if defined __MAX_CONTR
229      CALL integer_to_string(__MAX_CONTR, tmp_str)
230      flags = TRIM(flags)//" max_contr="//TRIM(tmp_str)
231#endif
232#if defined __NO_IPI_DRIVER
233      flags = TRIM(flags)//" no_ipi_driver"
234#endif
235#if defined __NO_MPI_THREAD_SUPPORT_CHECK
236      flags = TRIM(flags)//" no_mpi_thread_support_check"
237#endif
238#if defined __NO_STATM_ACCESS
239      flags = TRIM(flags)//" no_statm_access"
240#endif
241#if defined __MINGW
242      flags = TRIM(flags)//" mingw"
243#endif
244#if defined __PW_CUDA_NO_HOSTALLOC
245      flags = TRIM(flags)//" pw_cuda_no_hostalloc"
246#endif
247#if defined __STATM_RESIDENT
248      flags = TRIM(flags)//" statm_resident"
249#endif
250#if defined __STATM_TOTAL
251      flags = TRIM(flags)//" statm_total"
252#endif
253#if defined __PLUMED2
254      flags = TRIM(flags)//" plumed2"
255#endif
256#if defined __HAS_IEEE_EXCEPTIONS
257      flags = TRIM(flags)//" has_ieee_exceptions"
258#endif
259#if defined __NO_ABORT
260      flags = TRIM(flags)//" no_abort"
261#endif
262#if defined __SPGLIB
263      flags = TRIM(flags)//" spglib"
264#endif
265#if defined __ACCELERATE
266      flags = TRIM(flags)//" accelerate"
267#endif
268#if defined __MKL
269      flags = TRIM(flags)//" mkl"
270#endif
271#if defined __SIRIUS
272      flags = TRIM(flags)//" sirius"
273#endif
274#if defined __CHECK_DIAG
275      flags = TRIM(flags)//" check_diag"
276#endif
277
278   END FUNCTION cp2k_flags
279
280! **************************************************************************************************
281!> \brief ...
282!> \param iunit ...
283! **************************************************************************************************
284   SUBROUTINE print_cp2k_license(iunit)
285      INTEGER                                            :: iunit
286
287      WRITE (iunit, '(T2,A)') '!-----------------------------------------------------------------------------!'
288      WRITE (iunit, '(T2,A)') '!                                                                             !'
289      WRITE (iunit, '(T2,A)') '!   CP2K: A general program to perform molecular dynamics simulations         !'
290      WRITE (iunit, '(T2,A)') '!   Copyright (C) 2000, 2001, 2002, 2003  CP2K developers group               !'
291      WRITE (iunit, '(T2,A)') '!   Copyright (C) 2004, 2005, 2006, 2007  CP2K developers group               !'
292      WRITE (iunit, '(T2,A)') '!   Copyright (C) 2008, 2009, 2010, 2011  CP2K developers group               !'
293      WRITE (iunit, '(T2,A)') '!   Copyright (C) 2012, 2013, 2014, 2015  CP2K developers group               !'
294      WRITE (iunit, '(T2,A)') '!   Copyright (C) 2016, 2017, 2018, 2019  CP2K developers group               !'
295      WRITE (iunit, '(T2,A)') '!                                                                             !'
296      WRITE (iunit, '(T2,A)') '!   This program is free software; you can redistribute it and/or modify      !'
297      WRITE (iunit, '(T2,A)') '!   it under the terms of the GNU General Public License as published by      !'
298      WRITE (iunit, '(T2,A)') '!   the Free Software Foundation; either version 2 of the License, or         !'
299      WRITE (iunit, '(T2,A)') '!   (at your option) any later version.                                       !'
300      WRITE (iunit, '(T2,A)') '!                                                                             !'
301      WRITE (iunit, '(T2,A)') '!   This program is distributed in the hope that it will be useful,           !'
302      WRITE (iunit, '(T2,A)') '!   but WITHOUT ANY WARRANTY; without even the implied warranty of            !'
303      WRITE (iunit, '(T2,A)') '!   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             !'
304      WRITE (iunit, '(T2,A)') '!   GNU General Public License for more details.                              !'
305      WRITE (iunit, '(T2,A)') '!                                                                             !'
306      WRITE (iunit, '(T2,A)') '!   You should have received a copy of the GNU General Public License         !'
307      WRITE (iunit, '(T2,A)') '!   along with this program; if not, write to the Free Software               !'
308      WRITE (iunit, '(T2,A)') '!   Foundation, Inc., 51 Franklin Street, Fifth Floor,                        !'
309      WRITE (iunit, '(T2,A)') '!   Boston, MA  02110-1301, USA.                                              !'
310      WRITE (iunit, '(T2,A)') '!                                                                             !'
311      WRITE (iunit, '(T2,A)') '!   See also https://www.fsf.org/licensing/licenses/gpl.html                  !'
312      WRITE (iunit, '(T2,A)') '!                                                                             !'
313      WRITE (iunit, '(T2,A)') '!-----------------------------------------------------------------------------!'
314      WRITE (iunit, '(T2,A)') '!   CP2K, including its sources and pointers to the authors                   !'
315      WRITE (iunit, '(T2,A)') '!   can be found at  https://www.cp2k.org/                                    !'
316      WRITE (iunit, '(T2,A)') '!-----------------------------------------------------------------------------!'
317
318   END SUBROUTINE print_cp2k_license
319
320! **************************************************************************************************
321!> \brief ...
322! **************************************************************************************************
323   SUBROUTINE get_runtime_info()
324
325      r_datx = ""
326      r_cwd = ""
327      r_host_name = ""
328      r_user_name = ""
329      r_pid = -1
330
331      CALL m_getpid(r_pid)
332      CALL m_getlog(r_user_name)
333      CALL m_hostnm(r_host_name)
334      CALL m_datum(r_datx)
335      CALL m_getcwd(r_cwd)
336
337   END SUBROUTINE
338
339! **************************************************************************************************
340!> \brief Writes the header for the restart file
341!> \param iunit ...
342!> \par History
343!>      01.2008 [created] - Split from write_restart
344!> \author Teodoro Laino - University of Zurich - 01.2008
345! **************************************************************************************************
346   SUBROUTINE write_restart_header(iunit)
347      INTEGER, INTENT(IN)                                :: iunit
348
349      CHARACTER(LEN=*), PARAMETER :: routineN = 'write_restart_header', &
350         routineP = moduleN//':'//routineN
351
352      CHARACTER(LEN=256)                                 :: cwd, datx
353
354      CALL m_datum(datx)
355      CALL m_getcwd(cwd)
356
357      WRITE (UNIT=iunit, FMT="(T2,A)") "# Version information for this restart file "
358      WRITE (UNIT=iunit, FMT="(T2,A)") "# current date "//TRIM(datx)
359      WRITE (UNIT=iunit, FMT="(T2,A)") "# current working dir "//TRIM(cwd)
360
361      WRITE (UNIT=iunit, FMT="(T2,A,T31,A50)") &
362         "# Program compiled at", &
363         ADJUSTR(compile_date(1:MIN(50, LEN(compile_date))))
364      WRITE (UNIT=iunit, FMT="(T2,A,T31,A50)") &
365         "# Program compiled on", &
366         ADJUSTR(compile_host(1:MIN(50, LEN(compile_host))))
367      WRITE (UNIT=iunit, FMT="(T2,A,T31,A50)") &
368         "# Program compiled for", &
369         ADJUSTR(compile_arch(1:MIN(50, LEN(compile_arch))))
370      WRITE (UNIT=iunit, FMT="(T2,A,T31,A50)") &
371         "# Source code revision number", &
372         ADJUSTR(compile_revision)
373
374   END SUBROUTINE write_restart_header
375
376END MODULE cp2k_info
377