source: LMDZ5/trunk/libf/phylmd/time_phylmdz_mod.F90 @ 2428

Last change on this file since 2428 was 2422, checked in by Ehouarn Millour, 9 years ago

Small modification in the way time and calendar are handled: Now all the time keeping is done in the physics and only the timestep is transfered from the dynamics to the physics. Due to changes in computations and roundoffs this will change reference bench results.
The implementation of this change in phymar is left as future work.
EM

File size: 3.4 KB
Line 
1!
2! $Id: $
3!
4MODULE 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 (s) from the begining of the run
31!$OMP THREADPRIVATE(current_time)
32   
33
34CONTAINS
35
36  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    annee_ref    = annee_ref_
50    day_ref      = day_ref_
51    day_ini      = day_ini_
52    start_time   = start_time_
53    ndays        = ndays_
54    pdtphys      = pdtphys_
55   
56    ! Initialize module variable not inherited from dynamics
57    day_step_phy = NINT(rday/pdtphys)
58    day_end  = day_ini + ndays
59 
60    raz_date = 0
61    CALL getin_p('raz_date', raz_date)
62
63    current_time=0
64   
65    CALL phys_cal_init(annee_ref,day_ref)
66   
67  END SUBROUTINE init_time
68
69  SUBROUTINE init_iteration(itau_phy_)
70  IMPLICIT NONE
71    INTEGER, INTENT(IN) :: itau_phy_
72    itau_phy=itau_phy_
73    IF (raz_date==1) itau_phy=0
74   
75    itaufin_phy=itau_phy+NINT(ndays/pdtphys)
76   
77  END SUBROUTINE init_iteration
78
79  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    REAL,INTENT(IN) :: pdtphys_
86    REAL            :: julian_date
87   
88    ! Check if the physics timestep has changed
89    IF ( ABS( (pdtphys-pdtphys_) / ((pdtphys+pdtphys_)/2))> 10.*EPSILON(pdtphys_)) THEN
90       WRITE(lunout,*) "WARNING ! Physics time step changes from a call to the next",pdtphys_,pdtphys
91       WRITE(lunout,*) "Not sure the physics parametrizations can handle this..."
92    ENDIF
93    pdtphys=pdtphys_
94   
95    ! Update elapsed time since begining of run:
96    current_time=current_time+pdtphys
97
98    ! Compute corresponding Julian date and update calendar
99    CALL ymds2ju(annee_ref,1,day_ini,start_time+current_time,julian_date)
100    CALL phys_cal_update(julian_date)
101   
102  END SUBROUTINE update_time
103
104END MODULE time_phylmdz_mod     
105
Note: See TracBrowser for help on using the repository browser.