source: LMDZ5/branches/testing/libf/phylmd/time_phylmdz_mod.F90 @ 2488

Last change on this file since 2488 was 2488, checked in by Laurent Fairhead, 8 years ago

Merged trunk changes r2457:2487 into testing branch

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 (fraction of day) 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.