GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: phylmd/time_phylmdz_mod.F90 Lines: 30 32 93.8 %
Date: 2023-06-30 12:51:15 Branches: 2 4 50.0 %

Line Branch Exec Source
1
!
2
! $Id: time_phylmdz_mod.F90 2805 2017-03-01 16:50:11Z fairhead $
3
!
4
MODULE time_phylmdz_mod
5
6
    IMPLICIT NONE
7
    REAL,SAVE    :: pdtphys     ! physics time step (s)
8
!$OMP THREADPRIVATE(pdtphys)
9
    INTEGER,SAVE :: day_step_phy    ! number of physical steps per day
10
!$OMP THREADPRIVATE(day_step_phy)
11
    INTEGER,SAVE :: ndays       ! number of days to run
12
!$OMP THREADPRIVATE(ndays)
13
    INTEGER,SAVE :: annee_ref   ! reference year from the origin
14
!$OMP THREADPRIVATE(annee_ref)
15
    INTEGER,SAVE :: day_ref     ! reference year of the origin
16
!$OMP THREADPRIVATE(day_ref)
17
    INTEGER,SAVE :: day_ini     ! initial day of the run starting from 1st january of annee_ref
18
!$OMP THREADPRIVATE(day_ini)
19
    INTEGER,SAVE :: day_end     ! final day of the run starting from 1st january of annee_ref
20
!$OMP THREADPRIVATE(day_end)
21
    REAL,SAVE    :: start_time  ! starting time from the begining of the initial day
22
!$OMP THREADPRIVATE(start_time)
23
    INTEGER,SAVE :: raz_date
24
!$OMP THREADPRIVATE(raz_date)
25
26
    INTEGER,SAVE :: itau_phy     ! number of physiq iteration from origin
27
!$OMP THREADPRIVATE(itau_phy)
28
    INTEGER,SAVE :: itaufin_phy      ! final iteration (in itau_phy steps)
29
!$OMP THREADPRIVATE(itaufin_phy)
30
    REAL,SAVE    :: current_time ! current elapsed time in seconds from the begining of the run
31
!$OMP THREADPRIVATE(current_time)
32
33
34
CONTAINS
35
36
289
  SUBROUTINE init_time(annee_ref_, day_ref_, day_ini_, start_time_, &
37
                       ndays_, pdtphys_)
38
  USE ioipsl_getin_p_mod, ONLY : getin_p
39
  USE phys_cal_mod, ONLY: phys_cal_init
40
  IMPLICIT NONE
41
  INCLUDE 'YOMCST.h'
42
    INTEGER, INTENT(IN) :: annee_ref_
43
    INTEGER, INTENT(IN) :: day_ref_
44
    INTEGER, INTENT(IN) :: day_ini_
45
    REAL,    INTENT(IN) :: start_time_
46
    INTEGER, INTENT(IN) :: ndays_
47
    REAL,    INTENT(IN) :: pdtphys_
48
49
1
    annee_ref    = annee_ref_
50
1
    day_ref      = day_ref_
51
1
    day_ini      = day_ini_
52
1
    start_time   = start_time_
53
1
    ndays        = ndays_
54
1
    pdtphys      = pdtphys_
55
56
    ! Initialize module variable not inherited from dynamics
57
1
    day_step_phy = NINT(rday/pdtphys)
58
1
    day_end  = day_ini + ndays
59
60
1
    raz_date = 0
61
1
    CALL getin_p('raz_date', raz_date)
62
63
1
    current_time=0.
64
65
1
    CALL phys_cal_init(annee_ref,day_ref)
66
67
1
  END SUBROUTINE init_time
68
69
1
  SUBROUTINE init_iteration(itau_phy_)
70
  IMPLICIT NONE
71
    INTEGER, INTENT(IN) :: itau_phy_
72
1
    itau_phy=itau_phy_
73
1
    IF (raz_date==1) itau_phy=0
74
75
1
    itaufin_phy=itau_phy+NINT(ndays/pdtphys)
76
77
1
  END SUBROUTINE init_iteration
78
79
288
  SUBROUTINE update_time(pdtphys_)
80
  ! This subroutine updates the module saved variables.
81
  USE ioipsl, ONLY : ymds2ju
82
  USE phys_cal_mod, ONLY: phys_cal_update
83
  USE print_control_mod, ONLY: lunout
84
  IMPLICIT NONE
85
  INCLUDE 'YOMCST.h'
86
  REAL,INTENT(IN) :: pdtphys_
87
  REAL            :: julian_date
88
  INTEGER         :: cur_day
89
  REAL            :: cur_sec
90
91
    ! Check if the physics timestep has changed
92
288
    IF ( ABS( (pdtphys-pdtphys_) / ((pdtphys+pdtphys_)/2))> 10.*EPSILON(pdtphys_)) THEN
93
       WRITE(lunout,*) "WARNING ! Physics time step changes from a call to the next",pdtphys_,pdtphys
94
       WRITE(lunout,*) "Not sure the physics parametrizations can handle this..."
95
    ENDIF
96
288
    pdtphys=pdtphys_
97
98
    ! Update elapsed time since begining of run:
99
288
    current_time = current_time + pdtphys
100
288
    cur_day = int(current_time/rday)
101
288
    cur_sec = current_time - (cur_day * rday)
102
103
    ! Compute corresponding Julian date and update calendar
104
288
    cur_day = cur_day + day_ini
105
288
    cur_sec = cur_sec + (start_time * rday)
106
288
    CALL ymds2ju(annee_ref,1, cur_day, cur_sec, julian_date)
107
288
    CALL phys_cal_update(julian_date)
108
109
288
  END SUBROUTINE update_time
110
111
END MODULE time_phylmdz_mod
112