LCOV - code coverage report
Current view: top level - control - cam_control_mod.F90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 46 55 83.6 %
Date: 2025-01-13 21:54:50 Functions: 3 3 100.0 %

          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

Generated by: LCOV version 1.14