Line data Source code
1 : module cam_control_mod
2 : !------------------------------------------------------------------------------------------------
3 : !
4 : ! High level control variables. Information received from the driver/coupler is
5 : ! stored here.
6 : !
7 : !------------------------------------------------------------------------------------------------
8 :
9 : use shr_kind_mod, only: r8=>shr_kind_r8, cs=>shr_kind_cs, cl=>shr_kind_cl
10 : use spmd_utils, only: masterproc
11 : use cam_logfile, only: iulog
12 : use cam_abortutils, only: endrun
13 :
14 : implicit none
15 : public
16 : save
17 :
18 : ! Public Routines:
19 : !
20 : ! cam_ctrl_init
21 : ! cam_ctrl_set_orbit
22 : ! cam_ctrl_set_physics_type
23 :
24 : character(len=cl), protected :: caseid ! case ID
25 : character(len=cl), protected :: ctitle ! case title
26 :
27 : logical, protected :: initial_run ! startup mode which only requires a minimal initial file
28 : logical, protected :: restart_run ! continue a previous run; requires a restart file
29 : logical, protected :: branch_run ! branch from a previous run; requires a restart file
30 : logical, protected :: post_assim ! We are resuming after a pause
31 :
32 : logical, protected :: adiabatic ! true => no physics
33 : logical, protected :: ideal_phys ! true => run Held-Suarez (1994) physics
34 : logical, protected :: kessler_phys ! true => run Kessler physics
35 : logical, protected :: tj2016_phys ! true => run tj2016 physics
36 : logical, protected :: frierson_phys ! true => run frierson physics
37 : logical, protected :: simple_phys ! true => adiabatic or ideal_phys or kessler_phys
38 : ! or tj2016 or frierson
39 : logical, protected :: aqua_planet ! Flag to run model in "aqua planet" mode
40 : logical, protected :: moist_physics ! true => moist physics enabled, i.e.,
41 : ! (.not. ideal_phys) .and. (.not. adiabatic)
42 :
43 : logical, protected :: brnch_retain_casename ! true => branch run may use same caseid as
44 : ! the run being branched from
45 :
46 : real(r8), protected :: eccen ! Earth's eccentricity factor (unitless) (typically 0 to 0.1)
47 : real(r8), protected :: obliqr ! Earth's obliquity in radians
48 : real(r8), protected :: lambm0 ! Mean longitude of perihelion at the
49 : ! vernal equinox (radians)
50 : real(r8), protected :: mvelpp ! Earth's moving vernal equinox longitude
51 : ! of perihelion plus pi (radians)
52 :
53 : !================================================================================================
54 : contains
55 : !================================================================================================
56 :
57 1536 : subroutine cam_ctrl_init( &
58 1536 : caseid_in, ctitle_in, &
59 : initial_run_in, restart_run_in, branch_run_in, post_assim_in, &
60 : aqua_planet_in, brnch_retain_casename_in)
61 :
62 : character(len=cl), intent(in) :: caseid_in ! case ID
63 : character(len=cl), intent(in) :: ctitle_in ! case title
64 : logical, intent(in) :: initial_run_in ! true => inital run
65 : logical, intent(in) :: restart_run_in ! true => restart run
66 : logical, intent(in) :: branch_run_in ! true => branch run
67 : logical, intent(in) :: post_assim_in ! true => resume mode
68 : logical, intent(in) :: aqua_planet_in ! Flag to run model in "aqua planet" mode
69 : logical, intent(in) :: brnch_retain_casename_in ! Flag to allow a branch to use the same
70 : ! caseid as the run being branched from.
71 :
72 : character(len=*), parameter :: sub='cam_ctrl_init'
73 : !---------------------------------------------------------------------------------------------
74 :
75 1536 : caseid = caseid_in
76 1536 : ctitle = ctitle_in
77 :
78 1536 : initial_run = initial_run_in
79 1536 : restart_run = restart_run_in
80 1536 : branch_run = branch_run_in
81 1536 : post_assim = post_assim_in
82 :
83 1536 : aqua_planet = aqua_planet_in
84 :
85 1536 : brnch_retain_casename = brnch_retain_casename_in
86 :
87 1536 : if (masterproc) then
88 2 : write(iulog,*)' '
89 2 : write(iulog,*)' ------------------------------------------'
90 2 : write(iulog,*)' *********** CAM LOG OUTPUT ***************'
91 2 : write(iulog,*)' ------------------------------------------'
92 2 : if (restart_run) then
93 1 : write(iulog,*) ' Restart of an earlier run'
94 1 : else if (branch_run) then
95 0 : write(iulog,*) ' Branch of an earlier run'
96 1 : else if (post_assim) then
97 0 : write(iulog,*) ' DART run using CAM initial mode'
98 : else
99 1 : write(iulog,*) ' Initial run'
100 : end if
101 2 : write(iulog,*) ' ********** CASE = ',trim(caseid),' **********'
102 2 : write(iulog,'(1x,a)') ctitle
103 :
104 :
105 2 : if (aqua_planet) write(iulog,*) 'Run model in "AQUA_PLANET" mode'
106 :
107 : end if
108 :
109 1536 : end subroutine cam_ctrl_init
110 :
111 : !--------------------------------------------------------------------------------------------------
112 :
113 4608 : subroutine cam_ctrl_set_orbit(eccen_in, obliqr_in, lambm0_in, mvelpp_in)
114 :
115 : real(r8), intent(in) :: eccen_in
116 : real(r8), intent(in) :: obliqr_in
117 : real(r8), intent(in) :: lambm0_in
118 : real(r8), intent(in) :: mvelpp_in
119 :
120 4608 : eccen = eccen_in
121 4608 : obliqr = obliqr_in
122 4608 : lambm0 = lambm0_in
123 4608 : mvelpp = mvelpp_in
124 :
125 4608 : end subroutine cam_ctrl_set_orbit
126 :
127 : !--------------------------------------------------------------------------------------------------
128 :
129 1536 : subroutine cam_ctrl_set_physics_type(phys_package)
130 : ! Dummy argument
131 : character(len=*), intent(in) :: phys_package
132 : ! Local variable
133 : character(len=*), parameter :: subname = 'cam_ctrl_set_physics_type'
134 :
135 1536 : adiabatic = trim(phys_package) == 'adiabatic'
136 1536 : ideal_phys = trim(phys_package) == 'held_suarez'
137 1536 : kessler_phys = trim(phys_package) == 'kessler'
138 1536 : tj2016_phys = trim(phys_package) == 'tj2016'
139 1536 : frierson_phys = trim(phys_package) == 'grayrad'
140 :
141 1536 : simple_phys = adiabatic .or. ideal_phys .or. kessler_phys .or. tj2016_phys .or. frierson_phys
142 :
143 1536 : moist_physics = .not. (adiabatic .or. ideal_phys)
144 :
145 1536 : if ((.not. moist_physics) .and. aqua_planet) then
146 0 : call endrun (subname//': FATAL: AQUA_PLANET not compatible with dry physics package, ('//trim(phys_package)//')')
147 : end if
148 :
149 1536 : if (masterproc) then
150 2 : if (adiabatic) then
151 0 : write(iulog,*) 'Run model ADIABATICALLY (i.e. no physics)'
152 0 : write(iulog,*) ' Global energy fixer is on for non-Eulerian dycores.'
153 2 : else if (ideal_phys) then
154 0 : write(iulog,*) 'Run model with Held-Suarez physics forcing'
155 2 : else if (kessler_phys) then
156 0 : write(iulog,*) 'Run model with Kessler warm-rain physics forcing'
157 2 : else if (tj2016_phys) then
158 0 : write(iulog,*) 'Run model with Thatcher-Jablonowski (2016) physics forcing (moist Held-Suarez)'
159 2 : else if (frierson_phys) then
160 0 : write(iulog,*) 'Run model with Frierson (2006) physics'
161 : end if
162 : end if
163 :
164 1536 : end subroutine cam_ctrl_set_physics_type
165 :
166 : end module cam_control_mod
|