!=============================================================================== ! SVN $Id: shr_inputinfo_mod.F90 7482 2007-11-07 20:54:58Z erik $ ! SVN $URL: https://svn-ccsm-models.cgd.ucar.edu/csm_share/branch_tags/cesm1_0_rel_tags/cesm1_0_rel01_share3_100616/shr/shr_inputinfo_mod.F90 $ !=============================================================================== !BOP =========================================================================== ! ! !MODULE: shr_inputInfo_mod --- Module for input data shared between CCSM components ! ! !DESCRIPTION: ! ! A module to create a derived type and a namelist read for data that will ! be shared between CCSM components. This data is also written out to a NetCDF restart ! file and read in when restarting. ! ! Typical usage: ! ! ! Set the default values of the object... ! shr_inputInfo_initSetDefaults( CCSMInit ) ! ! ! Change some of the values in the object... ! shr_inputInfo_initPutData( CCSMInit, start_type="continue", aqua_planet=.true. ) ! ! ! Set data for the object based on input namelist ! shr_inputInfo_initRead( NLFileName, LogPrint=.true., mpicom=mpicom, & ! MasterTask=mastertask, CCSMInitOut=CCSMInit ) ! ! Print the object out ! shr_inputInfo_initPrint( CCSMInit ) ! ! ! Get data from the object ! shr_inputInfo_initGetData( CCSMInit, case_name=case_name, case_desc=case_desc ) ! ! ! Check some of the logical values... ! if ( shr_inputInfo_initIsRestart( CCSMInit ) ) .... ! if ( shr_inputInfo_initIsContinue( CCSMInit ) ) .... ! if ( shr_inputInfo_initIsBranch( CCSMInit ) ) .... ! ! ! Read in restart pointer file and then restart file for inputinfo... ! shr_inputInfo_initRPointerRead( restart_file, MPICom, MasterTask, & ! CCSMInitOut ) ! Also gets file from archive ! shr_inputInfo_initRestRead( restart_file, MPICom, MasterTask, & ! CCSMInitOut ) ! .... read any other object data from this same driver restart file ! ! ! Now write out a driver restart file ! ! First write out the driver restart pointer file and get file-name with time-stamp ! shr_inputInfo_initRPointerWrite( ymd, tod, MPICom, MasterTask, & ! CCSMInit, restart_file ) ! shr_inputInfo_initRestWrite( restart_file, MPICom, MasterTask, & ! CCSMInit ) ! .... write any other object data to this same driver restart file ! ! !REMARKS: ! ! !REVISION HISTORY: ! 2005-Nov-11 - E. Kluzek - creation ! ! !INTERFACE: ------------------------------------------------------------------ MODULE shr_inputInfo_mod,5 ! !USES: USE shr_kind_mod, ONLY : SHR_KIND_CS, SHR_KIND_CL, SHR_KIND_IN, & SHR_KIND_R8, SHR_KIND_I8 USE shr_sys_mod, ONLY : shr_sys_flush, shr_sys_abort USE shr_ncio_mod, ONLY : shr_ncio_descripType, shr_ncio_open, & shr_ncio_close use shr_log_mod, ONLY : s_loglev => shr_log_Level use shr_log_mod, ONLY : s_logunit => shr_log_Unit implicit none private ! default private ! !PUBLIC TYPES: public :: shr_inputInfo_initType ! Derived type for shared data ! !PUBLIC MEMBER FUNCTIONS public :: shr_inputInfo_initSetDefaults ! Set default values public :: shr_inputInfo_initPrint ! Print out values public :: shr_inputInfo_initGetData ! Get values from object public :: shr_inputInfo_initPutData ! Change values public :: shr_inputInfo_initRead ! Input namelist read method public :: shr_inputInfo_initIsStartup ! Return if startup case or not public :: shr_inputInfo_initIsRestart ! Return if restart (branch OR continue) public :: shr_inputInfo_initIsContinue ! Return if continue case or not public :: shr_inputInfo_initIsBranch ! Return if branch case or not public :: shr_inputInfo_initIsSame ! Check that the two input objects are same public :: shr_inputInfo_initRestRead ! Read in restart information public :: shr_inputInfo_initRestWrite ! Write out restart information public :: shr_inputInfo_initRPointerRead ! Read restart pointer file get filename public :: shr_inputInfo_initRPointerWrite ! Write restart pointer file get filename public :: shr_inputInfo_initCheck ! Check object for consistency/validity ! !PUBLIC DATA MEMBERS: ! Shared namelist name character(len=*), public, parameter :: shr_inputInfo_NLFilename = "namelist" ! Strings of valid start_type options character(len=*), public, parameter :: shr_inputInfo_start_type_start = "startup" character(len=*), public, parameter :: shr_inputInfo_start_type_cont = "continue" character(len=*), public, parameter :: shr_inputInfo_start_type_brnch = "branch" !EOP integer, parameter :: NVars = 11 ! Number of variables saved on the restart file ! Names of variables from InitType to save on restart file character(len=*), parameter :: shr_inputInfo_saveRestart(NVars) = (/ & "case_desc ", & "case_name ", & "version ", & "username ", & "hostname ", & "atm_adiabatic ", & "atm_ideal_phys ", & "aqua_planet ", & "single_column ", & "scmlat ", & "scmlon " & /) ! ! InputInfo derived type ! type shr_inputInfo_initType private ! This type is opaque !----------------------------------------------------------------------------- ! Information shared by all model components !----------------------------------------------------------------------------- ! ----------- Information not saved on restart -------------------- ! Start type: startup, branch or continue character(SHR_KIND_CL) :: start_type ! Type of startup character(SHR_KIND_CS) :: logFilePostFix ! postfix for output log files character(SHR_KIND_CL) :: outPathRoot ! root for output log files ! ----------- Information saved on restart ------------------------ ! Case description and name (save these on restart) character(SHR_KIND_CL) :: case_desc ! Long description of this case character(SHR_KIND_CS) :: case_name ! Short case identification character(SHR_KIND_CL) :: version ! Model version character(SHR_KIND_CL) :: username ! Username running model character(SHR_KIND_CL) :: hostname ! Hostname of machine running model ! Special configurations (save these on restart) logical :: atm_adiabatic ! No surface models and atm adiabatic mode logical :: atm_ideal_phys ! No surface models and atm ideal-physics logical :: aqua_planet ! No ice/lnd, analytic ocn, perpetual time logical :: single_column ! single column mode real (SHR_KIND_R8) :: scmlat ! single column lat real (SHR_KIND_R8) :: scmlon ! single column lon integer(SHR_KIND_IN) :: info_debug ! debug level !----------------------------------------------------------------------------- ! Information ONLY used by the top level application driver. !----------------------------------------------------------------------------- ! ----------- Information not saved on restart -------------------- ! Run time information set by model logical :: lnd_present ! lnd is run logical :: ice_present ! ice is run logical :: ocn_present ! ocn is run logical :: rof_present ! rof is calculated by lnd logical :: atm_prognostic ! atm needs input (not data) logical :: lnd_prognostic ! lnd needs input (not data) logical :: ice_prognostic ! ice needs input (not data) logical :: ocn_prognostic ! ocn needs input (not data) logical :: ocnrof_prognostic ! ocn needs input runoff logical :: samegrid logical :: dead_comps ! Restart set by model or driver logical :: userest_atm logical :: userest_lnd logical :: userest_ocn logical :: userest_ice ! Restart file info character(SHR_KIND_CL) :: restart_pfile ! Restart pointer file character(SHR_KIND_CL) :: restart_file ! Full archive path to restart file character(SHR_KIND_CL) :: restart_file_override ! List to override on restart file logical :: brnch_retain_casename ! If branch and can use same casename !----------------------------------------------------------------------------- ! Variables that are written out to restart file from above !----------------------------------------------------------------------------- type(shr_ncio_descripType) :: var(NVars) end type shr_inputInfo_InitType ! ! List of values read in from restart_file that can be over-ridden on namelist ! character(len=*), private, parameter :: restartFileOverRideList = & ":case_name" & ! Case name (only for branch) //":case_desc" & ! Case description //":version" & ! Version //":username" & ! User name //":hostname" ! Machine hostname ! ! Prefix to put in front of variable names on restart file ! character(len=*), parameter :: prefix = "shr_inputInfo_" character(len=*), parameter :: LogPrefix = "(shr_inputInfo) " character(len=*), parameter :: FAA = "('"//LogPrefix//"',A)" !=============================================================================== CONTAINS !=============================================================================== !=============================================================================== !=============================================================================== ! !IROUTINE: shr_inputInfo_initSetDefaults -- Set defaults for shr_CCSMInit data ! ! !DESCRIPTION: ! ! Set the defaults for the input CCSMInit object. ! ! !INTERFACE: ------------------------------------------------------------------ SUBROUTINE shr_inputInfo_initSetDefaults( CCSMInit ),15 ! !USES: USE shr_ncio_mod, ONLY: shr_ncio_descripInit, shr_ncio_descripSetDefault USE shr_string_mod, ONLY: shr_string_listGetNum, shr_string_listIntersect, & shr_string_listGetName implicit none ! !INPUT/OUTPUT PARAMETERS: ! Bluevista requires intent to be IN/OUT (even though IN is unneeded) when running ! with debug compiler options and serial mode. Version 10.01.0000.0004 of xlf90 EBK Jul/18/2007 type(shr_inputInfo_InitType), intent(INOUT) :: CCSMInit ! Output CCSM structure !EOP !----- local ----- character(len=*), parameter :: subname = '(shr_inputInfo_initSetDefaults) ' character(len=SHR_KIND_CL) :: restartList ! Items in restart-list and override character(len=SHR_KIND_CL) :: name ! name of list item integer :: n ! Index integer :: rc ! Return code logical :: init ! If MPI initialized or not !------------------------------------------------------------------------------- ! Notes: !------------------------------------------------------------------------------- !--------------------------------------------------------------------------- ! Set default values for each item !--------------------------------------------------------------------------- CCSMInit%case_desc = ' ' CCSMInit%case_name = ' ' CCSMInit%version = ' ' CCSMInit%username = ' ' CCSMInit%hostname = ' ' CCSMInit%start_type = ' ' CCSMInit%atm_ideal_phys = .false. CCSMInit%atm_adiabatic = .false. CCSMInit%aqua_planet = .false. CCSMInit%single_column = .false. CCSMInit%scmlat = -999. CCSMInit%scmlon = -999. CCSMInit%restart_pfile = ' ' CCSMInit%restart_file = ' ' CCSMInit%restart_file_override = ' ' CCSMInit%brnch_retain_casename = .false. CCSMInit%logFilePostFix = '.log' CCSMInit%outPathRoot = './' CCSMInit%lnd_present = .true. CCSMInit%ice_present = .true. CCSMInit%ocn_present = .true. CCSMInit%rof_present = .true. CCSMInit%atm_prognostic = .false. CCSMInit%lnd_prognostic = .false. CCSMInit%ice_prognostic = .false. CCSMInit%ocn_prognostic = .false. CCSMInit%ocnrof_prognostic = .false. CCSMInit%samegrid = .false. CCSMInit%dead_comps = .false. CCSMInit%info_debug = 1 !--------------------------------------------------------------------------- ! Prepare names of data to write to restart file !--------------------------------------------------------------------------- call shr_ncio_descripSetDefault( NVars, CCSMInit%var ) do n = 1, NVars name = shr_inputInfo_saveRestart(n) if ( trim(name) == "atm_adiabatic" )then call shr_ncio_descripInit( CCSMInit%var(n), name, & LongName="Atmosphere runs in adiabatic mode", & LogicalData=.true. ) else if ( trim(name) == "atm_ideal_phys" )then call shr_ncio_descripInit( CCSMInit%var(n), name, & LongName="Atmosphere runs in idealized physics mode", & LogicalData=.true. ) else if ( trim(name) == "aqua_planet" )then call shr_ncio_descripInit( CCSMInit%var(n), name, & LongName="Aqua_planet mode (no-land/ice, "// & "perpetual-date, and analytic SST)", & LogicalData=.true. ) else if ( trim(name) == "single_column" )then call shr_ncio_descripInit( CCSMInit%var(n), name, & LongName="CCSM run in Single Column Mode", & LogicalData=.true. ) else if ( trim(name) == "scmlat" )then call shr_ncio_descripInit( CCSMInit%var(n), name, & LongName="Single Column Mode Latitude", & units="degrees_north", RealR8Data=.true. ) else if ( trim(name) == "scmlon" )then call shr_ncio_descripInit( CCSMInit%var(n), name, & LongName="Single Column Mode Longitude", & units="degrees_east", RealR8Data=.true. ) else if ( trim(name) == "case_desc" )then call shr_ncio_descripInit( CCSMInit%var(n), name, & LongName="Case description", & StringData=.true. ) else if ( trim(name) == "case_name" )then call shr_ncio_descripInit( CCSMInit%var(n), name, & LongName="Case identification name", & StringData=.true. ) else if ( trim(name) == "version" )then call shr_ncio_descripInit( CCSMInit%var(n), name, & LongName="Code version name or description", & StringData=.true. ) else if ( trim(name) == "username" )then call shr_ncio_descripInit( CCSMInit%var(n), name, & LongName="username of person running this simulation", & StringData=.true. ) else if ( trim(name) == "hostname" )then call shr_ncio_descripInit( CCSMInit%var(n), name, & LongName="hostname of machine running this simulation", & StringData=.true. ) else call shr_sys_abort( subname//': unrecognized variable to store ' // & 'on restart file: '//name ) end if end do END SUBROUTINE shr_inputInfo_initSetDefaults !=============================================================================== !=============================================================================== ! !IROUTINE: shr_inputInfo_initPrint -- Print out values to log file ! ! !DESCRIPTION: ! ! Print derivied type out to screen. ! ! !INTERFACE: ------------------------------------------------------------------ SUBROUTINE shr_inputInfo_initPrint( CCSMInit ) 1,2 implicit none ! !INPUT/OUTPUT PARAMETERS: type(shr_inputInfo_initType), intent(IN) :: CCSMInit ! Output CCSM structure !EOP !----- local ----- character(len=*), parameter :: subname = '(shr_inputInfo_initPrint) ' character(len=*), parameter :: F0A = "('"//LogPrefix//"',A,T45,' = ', A)" character(len=*), parameter :: F0L = "('"//LogPrefix//"',A,T45,' = ', L1)" character(len=*), parameter :: F0I = "('"//LogPrefix//"',A,T45,' = ', I4)" character(len=*), parameter :: F01 = "('"//LogPrefix//"',A,T45,' = ', f18.13)" !------------------------------------------------------------------------------- ! Notes: !------------------------------------------------------------------------------- if (s_loglev > 0) then write(s_logunit,F0A) 'Case description: ', trim(CCSMInit%case_desc) write(s_logunit,F0A) 'Case name: ', trim(CCSMInit%case_name) write(s_logunit,F0A) 'Version: ', trim(CCSMInit%version) write(s_logunit,F0A) 'Username: ', trim(CCSMInit%username) write(s_logunit,F0A) 'Hostname: ', trim(CCSMInit%hostname) write(s_logunit,F0A) 'Start type: ', trim(CCSMInit%start_type) write(s_logunit,F0A) 'Log output ending name: ', trim(CCSMInit%logFilePostFix) !BUG write(s_logunit,F0L) 'info_debug: ', CCSMInit%info_debug write(s_logunit,*) 'info_debug: ', CCSMInit%info_debug write(s_logunit,F0A) 'Output path root directory: ', trim(CCSMInit%outPathRoot) write(s_logunit,F0L) 'atm idealized-physics mode: ', CCSMInit%atm_ideal_phys write(s_logunit,F0L) 'atm adiabatic mode: ', CCSMInit%atm_adiabatic write(s_logunit,F0L) 'aqua_planet mode: ', CCSMInit%aqua_planet write(s_logunit,F0L) 'single_column: ', CCSMInit%single_column if ( CCSMInit%single_column )then write(s_logunit,F01) 'scmlat: ', CCSMInit%scmlat write(s_logunit,F01) 'scmlon: ', CCSMInit%scmlon end if write(s_logunit,F0A) 'Restart pointer file: ', trim(CCSMInit%restart_pfile) ! --- Some values only printed out on restart ------ if ( shr_inputInfo_initIsRestart( CCSMInit ) )then if ( shr_inputInfo_initIsBranch( CCSMInit ) ) & write(s_logunit,F0A) 'Restart file (full path): ', trim(CCSMInit%restart_file) if ( len_trim(CCSMInit%restart_file_override) == 0 )then write(s_logunit,FAA) 'Do NOT override any values from restart_file by namelist' else write(s_logunit,F0A) 'Restart file override list: ', & trim(CCSMInit%restart_file_override) end if end if endif END SUBROUTINE shr_inputInfo_initPrint !=============================================================================== !=============================================================================== ! !IROUTINE: shr_inputInfo_initGetData -- Get values from CCSMInit object ! ! !DESCRIPTION: ! ! Get values out of the CCSMInit object. ! ! !INTERFACE: ------------------------------------------------------------------ SUBROUTINE shr_inputInfo_initGetData( CCSMInit, case_name, case_desc, &,1 version, username, hostname, & start_type, restart_pfile, & restart_file, perpetual_run, & perpetual_ymd, aqua_planet, & atm_ideal_phys, atm_adiabatic, & brnch_retain_casename, single_column, & scmlat,scmlon, & logFilePostFix, outPathRoot, & lnd_present, ice_present, ocn_present, rof_present, & atm_prognostic, lnd_prognostic, ice_prognostic, & ocn_prognostic, ocnrof_prognostic, & dead_comps, samegrid, info_debug) implicit none ! !INPUT/OUTPUT PARAMETERS: type(shr_inputInfo_InitType), intent(IN) :: CCSMInit ! Input CCSM structure character(len=*), optional, intent(OUT) :: case_name ! Short case identification character(len=*), optional, intent(OUT) :: case_desc ! Long case description character(len=*), optional, intent(OUT) :: version ! Code version name or description character(len=*), optional, intent(OUT) :: username ! Username of person running simulation character(len=*), optional, intent(OUT) :: hostname ! Username of machine running simulation character(len=*), optional, intent(OUT) :: start_type ! Start type character(len=*), optional, intent(OUT) :: restart_pfile ! Restart pointer file character(len=*), optional, intent(OUT) :: restart_file ! Restart file pathname logical, optional, intent(OUT) :: perpetual_run ! If this is perpetual integer, optional, intent(OUT) :: perpetual_ymd ! If perpetual, date logical, optional, intent(OUT) :: aqua_planet ! aqua_planet mode logical, optional, intent(OUT) :: atm_adiabatic ! atm adiabatic mode logical, optional, intent(OUT) :: atm_ideal_phys! atm idealized-physics mode character(len=*), optional, intent(OUT) :: logFilePostFix! output log file postfix character(len=*), optional, intent(OUT) :: outPathRoot ! output file root logical, optional, intent(OUT) :: brnch_retain_casename logical, optional, intent(OUT) :: single_column real (SHR_KIND_R8), optional, intent(OUT) :: scmlat real (SHR_KIND_R8), optional, intent(OUT) :: scmlon ! --- Flags reset by models --- logical, optional, intent(OUT) :: dead_comps logical, optional, intent(OUT) :: lnd_present logical, optional, intent(OUT) :: ice_present logical, optional, intent(OUT) :: ocn_present logical, optional, intent(OUT) :: rof_present logical, optional, intent(OUT) :: atm_prognostic logical, optional, intent(OUT) :: lnd_prognostic logical, optional, intent(OUT) :: ice_prognostic logical, optional, intent(OUT) :: ocn_prognostic logical, optional, intent(OUT) :: ocnrof_prognostic logical, optional, intent(OUT) :: samegrid integer(SHR_KIND_IN),optional, intent(OUT) :: info_debug !EOP !----- local ----- character(len=*), parameter :: subname = '(shr_inputInfo_initGetData) ' integer, parameter :: aqua_perpetual_ymd = 321 ! Default perpetual date !------------------------------------------------------------------------------- if ( present(aqua_planet) ) aqua_planet = CCSMInit%aqua_planet if ( present(single_column) ) single_column = CCSMInit%single_column if ( present(scmlat) ) scmlat = CCSMInit%scmlat if ( present(scmlon) ) scmlon = CCSMInit%scmlon if ( present(atm_adiabatic) ) atm_adiabatic = CCSMInit%atm_adiabatic if ( present(atm_ideal_phys) ) atm_ideal_phys = CCSMInit%atm_ideal_phys if ( present(start_type) ) start_type = CCSMInit%start_type if ( present(restart_pfile) ) restart_pfile = CCSMInit%restart_pfile if ( present(restart_file) ) restart_file = CCSMInit%restart_file if ( present(case_name) ) case_name = CCSMInit%case_name if ( present(case_desc) ) case_desc = CCSMInit%case_desc if ( present(version) ) version = CCSMInit%version if ( present(username) ) username = CCSMInit%username if ( present(hostname) ) hostname = CCSMInit%hostname if ( present(logFilePostFix) ) logFilePostFix = CCSMInit%logFilePostFix if ( present(outPathRoot) ) outPathRoot = CCSMInit%outPathRoot if ( present(brnch_retain_casename) ) & brnch_retain_casename = CCSMInit%brnch_retain_casename ! --- Perpetual run mode and date (if aqua_planet mode set else false) ------ if ( present(perpetual_run) )then if ( .not. present(perpetual_ymd) )then call shr_sys_abort( subname//':: asking for perpetual_run but not '//& 'perpetual_ymd' ) end if if ( CCSMInit%aqua_planet )then perpetual_run = .true. perpetual_ymd = aqua_perpetual_ymd else perpetual_run = .false. perpetual_ymd = 0 end if end if if ( present(dead_comps) ) dead_comps = CCSMInit%dead_comps if ( present(lnd_present) ) lnd_present = CCSMInit%lnd_present if ( present(ice_present) ) ice_present = CCSMInit%ice_present if ( present(ocn_present) ) ocn_present = CCSMInit%ocn_present if ( present(rof_present) ) rof_present = CCSMInit%rof_present if ( present(atm_prognostic) ) atm_prognostic = CCSMInit%atm_prognostic if ( present(lnd_prognostic) ) lnd_prognostic = CCSMInit%lnd_prognostic if ( present(ice_prognostic) ) ice_prognostic = CCSMInit%ice_prognostic if ( present(ocn_prognostic) ) ocn_prognostic = CCSMInit%ocn_prognostic if ( present(ocnrof_prognostic)) ocnrof_prognostic= CCSMInit%ocnrof_prognostic if ( present(samegrid) ) samegrid = CCSMInit%samegrid if ( present(info_debug) ) info_debug = CCSMInit%info_debug END SUBROUTINE shr_inputInfo_initGetData !=============================================================================== !=============================================================================== ! !IROUTINE: shr_inputInfo_initPutData -- Change values of input CCSMInit object ! ! !DESCRIPTION: ! ! Change the values of the input CCSMInit object. ! ! !INTERFACE: ------------------------------------------------------------------ SUBROUTINE shr_inputInfo_initPutData( CCSMInit, case_name, case_desc, & version, username, hostname, & start_type, atm_adiabatic, & atm_ideal_phys, aqua_planet, & restart_file, restart_pfile, & restart_file_override, & brnch_retain_casename,single_column, & scmlat, scmlon, & logFilePostFix, outPathRoot, & lnd_present, ice_present, ocn_present, rof_present, & atm_prognostic, lnd_prognostic, ice_prognostic, & ocn_prognostic, ocnrof_prognostic, & dead_comps, samegrid, info_debug) implicit none ! !INPUT/OUTPUT PARAMETERS: type(shr_inputInfo_InitType), intent(INOUT) :: CCSMInit ! Output CCSM structure character(len=*), intent(IN), optional :: case_name ! Short case identification character(len=*), intent(IN), optional :: case_desc ! Long case description character(len=*), intent(IN), optional :: version ! Code version name or description character(len=*), intent(IN), optional :: username ! Username of person running simulation character(len=*), intent(IN), optional :: hostname ! Username of machine running simulation character(len=*), intent(IN), optional :: start_type ! Type of startup character(len=*), intent(IN), optional :: restart_file ! Restart file pathname character(len=*), intent(IN), optional :: restart_pfile ! Restart pointer file character(len=*), intent(IN), optional :: logFilePostFix ! Output log file postfix character(len=*), intent(IN), optional :: outPathRoot ! Output file root ! -- Items to override on restart_file --- character(len=*), intent(IN), optional :: restart_file_override logical, intent(IN), optional :: atm_adiabatic ! no surf & atm adiabatic logical, intent(IN), optional :: atm_ideal_phys ! no surf & atm ideal-phyps logical, intent(IN), optional :: aqua_planet ! Pure ocean surface logical, intent(IN), optional :: single_column ! single column mode real(SHR_KIND_R8),intent(IN), optional :: scmlat ! single column mode latitude real(SHR_KIND_R8),intent(IN), optional :: scmlon ! single column mode longitude ! --- If retain previous casename or not ------ logical, intent(IN), optional :: brnch_retain_casename ! --- Flags reset by models --- logical, intent(IN), optional :: dead_comps logical, intent(IN), optional :: lnd_present logical, intent(IN), optional :: ice_present logical, intent(IN), optional :: ocn_present logical, intent(IN), optional :: samegrid logical, intent(IN), optional :: rof_present logical, intent(IN), optional :: atm_prognostic logical, intent(IN), optional :: lnd_prognostic logical, intent(IN), optional :: ice_prognostic logical, intent(IN), optional :: ocn_prognostic logical, intent(IN), optional :: ocnrof_prognostic integer(SHR_KIND_IN),intent(IN),optional :: info_debug !EOP !----- local ----- character(len=*), parameter :: subname = '(shr_inputInfo_initPutData) ' !------------------------------------------------------------------------------- ! Notes: !------------------------------------------------------------------------------- if ( present(case_name) ) CCSMInit%case_name = case_name if ( present(case_desc) ) CCSMInit%case_desc = case_desc if ( present(version) ) CCSMInit%version = version if ( present(username) ) CCSMInit%username = username if ( present(hostname) ) CCSMInit%hostname = hostname if ( present(start_type) ) CCSMInit%start_type = start_type if ( present(atm_adiabatic) ) CCSMInit%atm_adiabatic = atm_adiabatic if ( present(atm_ideal_phys) ) CCSMInit%atm_ideal_phys = atm_ideal_phys if ( present(aqua_planet) ) CCSMInit%aqua_planet = aqua_planet if ( present(single_column) ) CCSMInit%single_column = single_column if ( present(scmlat) ) CCSMInit%scmlat = scmlat if ( present(scmlon) ) CCSMInit%scmlon = scmlon if ( present(restart_file) ) CCSMInit%restart_file = restart_file if ( present(restart_pfile) ) CCSMInit%restart_pfile = restart_pfile if ( present(logFilePostFix) ) CCSMInit%logFilePostFix = logFilePostFix if ( present(outPathRoot) ) CCSMInit%outPathRoot = outPathRoot if ( present(restart_file_override)) CCSMInit%restart_file_override = restart_file_override if ( present(brnch_retain_casename)) CCSMInit%brnch_retain_casename = brnch_retain_casename if ( present(dead_comps) ) CCSMInit%dead_comps = dead_comps if ( present(lnd_present) ) CCSMInit%lnd_present = lnd_present if ( present(ice_present) ) CCSMInit%ice_present = ice_present if ( present(ocn_present) ) CCSMInit%ocn_present = ocn_present if ( present(rof_present) ) CCSMInit%rof_present = rof_present if ( present(atm_prognostic) ) CCSMInit%atm_prognostic = atm_prognostic if ( present(lnd_prognostic) ) CCSMInit%lnd_prognostic = lnd_prognostic if ( present(ice_prognostic) ) CCSMInit%ice_prognostic = ice_prognostic if ( present(ocn_prognostic) ) CCSMInit%ocn_prognostic = ocn_prognostic if ( present(ocnrof_prognostic)) CCSMInit%ocnrof_prognostic= ocnrof_prognostic if ( present(samegrid) ) CCSMInit%samegrid = samegrid if ( present(info_debug) ) CCSMInit%info_debug = info_debug END SUBROUTINE shr_inputInfo_initPutData !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_inputInfo_initRead -- read in CCSM shared namelist ! ! !DESCRIPTION: ! ! Read in input from ccsm_inparm namelist, output ccsm derived type for ! miscillaneous info. ! ! !INTERFACE: ------------------------------------------------------------------ SUBROUTINE shr_inputInfo_initRead( NLFilename, LogPrint, mpicom, masterTask, &,12 CCSMInitOut ) ! !USES: USE shr_file_mod, ONLY : shr_file_getUnit, shr_file_freeUnit USE shr_string_mod, ONLY : shr_string_toUpper, shr_string_listAppend USE shr_mpi_mod, ONLY : shr_mpi_bcast implicit none ! !INPUT/OUTPUT PARAMETERS: character(len=*), intent(IN) :: NLFilename ! Name-list filename logical, intent(IN) :: LogPrint ! If print out to log file integer, optional, intent(IN) :: mpicom ! MPI communicator logical, optional, intent(IN) :: MasterTask ! If MPI master task type(shr_inputInfo_InitType), intent(INOUT) :: CCSMInitOut ! Output CCSM structure !EOP !----- local ----- character(len=*), parameter :: subname = '(shr_inputInfo_initRead) ' logical :: MasterTask2 ! If MPI master task character(len=SHR_KIND_CL) :: case_desc ! Case long description character(SHR_KIND_CS) :: case_name ! Case short name character(SHR_KIND_CL) :: version ! Code version using character(SHR_KIND_CL) :: username ! Username of person running simulation character(SHR_KIND_CL) :: hostname ! hostname of machine running simulation character(SHR_KIND_CL) :: start_type ! Startup-type: startup, continue, branch character(SHR_KIND_CL) :: restart_pfile ! Restart pointer filename character(SHR_KIND_CL) :: restart_file ! Restart filename ! ----- Namelist items to override from the restart-file ------ character(SHR_KIND_CL) :: restart_file_override logical :: aqua_planet ! Aqua-planet mode (surface is all ocean) logical :: single_column ! single column mode real (SHR_KIND_R8) :: scmlat ! single column mode latitude real (SHR_KIND_R8) :: scmlon ! single column mode longitude logical :: atm_adiabatic ! Atmosphere adiabatic physics mode logical :: atm_ideal_phys ! Atmosphere idealized physics mode logical :: brnch_retain_casename ! If retain casename for branch character(len=SHR_KIND_CS) :: logFilePostFix ! postfix for output log files character(len=SHR_KIND_CL) :: outPathRoot ! root output files integer :: rcode ! Return code integer :: ierr ! I/O error code integer :: unitn ! Namelist unit number to read integer(SHR_KIND_IN) :: info_debug namelist /ccsm_inparm/ & case_desc, case_name, version, username, & hostname, start_type, brnch_retain_casename, & atm_adiabatic, atm_ideal_phys, aqua_planet, & restart_pfile, restart_file, info_debug, & restart_file_override,single_column, scmlat, & scmlon, logFilePostFix, outPathRoot !------------------------------------------------------------------------------- if ( present(MasterTask) )then MasterTask2 = MasterTask else MasterTask2 = .true. end if if ( present(MasterTask) .and. .not. present(mpicom) )then call shr_sys_abort( subname//':: if MasterTask input, so must mpicom' ) endif if ( .not. present(MasterTask) .and. present(mpicom) )then call shr_sys_abort( subname//':: if mpicom input, so must MasterTask' ) endif !--------------------------------------------------------------------------- ! Set defaults based on current value of input object !--------------------------------------------------------------------------- case_desc = CCSMInitOut%case_desc case_name = CCSMInitOut%case_name version = CCSMInitOut%version username = CCSMInitOut%username hostname = CCSMInitOut%hostname start_type = CCSMInitOut%start_type atm_ideal_phys = CCSMInitOut%atm_ideal_phys atm_adiabatic = CCSMInitOut%atm_adiabatic aqua_planet = CCSMInitOut%aqua_planet single_column = CCSMInitOut%single_column scmlat = CCSMInitOut%scmlat scmlon = CCSMInitOut%scmlon restart_pfile = CCSMInitOut%restart_pfile restart_file = CCSMInitOut%restart_file restart_file_override = CCSMInitOut%restart_file_override brnch_retain_casename = CCSMInitOut%brnch_retain_casename logFilePostFix = CCSMInitOut%logFilePostFix outPathRoot = CCSMInitOut%outPathRoot info_debug = CCSMInitOut%info_debug !--------------------------------------------------------------------------- ! Read in namelist !--------------------------------------------------------------------------- if ( MasterTask2 )then unitn = shr_file_getUnit() if (s_loglev > 0) write(s_logunit,FAA) 'Read in ccsm_inparm namelist from: '//trim(NLFilename) open( unitn, file=trim(NLFilename), status='old' ) ierr = 1 do while( ierr /= 0 ) read(unitn,nml=ccsm_inparm,iostat=ierr) if (ierr < 0) then call shr_sys_abort( subname//':: namelist read returns an'// & ' end of file or end of record condition' ) end if end do close(unitn) call shr_file_freeUnit( unitn ) end if !--------------------------------------------------------------------------- ! If MPI broadcast values to all processors !--------------------------------------------------------------------------- if ( present(mpicom) )then call shr_mpi_bcast( case_desc, MPICom ) call shr_mpi_bcast( case_name, MPICom ) call shr_mpi_bcast( version, MPICom ) call shr_mpi_bcast( username, MPICom ) call shr_mpi_bcast( hostname, MPICom ) call shr_mpi_bcast( start_type, MPICom ) call shr_mpi_bcast( atm_ideal_phys, MPICom ) call shr_mpi_bcast( atm_adiabatic, MPICom ) call shr_mpi_bcast( aqua_planet, MPICom ) call shr_mpi_bcast( single_column, MPICom ) call shr_mpi_bcast( scmlat, MPICom ) call shr_mpi_bcast( scmlon, MPICom ) call shr_mpi_bcast( restart_pfile, MPICom ) call shr_mpi_bcast( restart_file, MPICom ) call shr_mpi_bcast( restart_file_override, MPICom ) call shr_mpi_bcast( brnch_retain_casename, MPICom ) call shr_mpi_bcast( logFilePostFix, MPICom ) call shr_mpi_bcast( outPathRoot, MPICom ) call shr_mpi_bcast( info_debug, MPICom ) end if !--------------------------------------------------------------------------- ! Put into ccsm init derived type !--------------------------------------------------------------------------- CCSMInitOut%case_desc = case_desc CCSMInitOut%case_name = case_name CCSMInitOut%version = version CCSMInitOut%username = username CCSMInitOut%hostname = hostname CCSMInitOut%start_type = start_type CCSMInitOut%atm_ideal_phys = atm_ideal_phys CCSMInitOut%atm_adiabatic = atm_adiabatic CCSMInitOut%aqua_planet = aqua_planet CCSMInitOut%single_column = single_column CCSMInitOut%scmlat = scmlat CCSMInitOut%scmlon = scmlon CCSMInitOut%restart_pfile = restart_pfile CCSMInitOut%restart_file = restart_file CCSMInitOut%restart_file_override = restart_file_override CCSMInitOut%brnch_retain_casename = brnch_retain_casename CCSMInitOut%logFilePostFix = logFilePostFix CCSMInitOut%outPathRoot = outPathRoot CCSMInitOut%info_debug = info_debug if (CCSMInitOut%aqua_planet) then CCSMInitOut%lnd_present = .false. CCSMInitOut%ice_present = .false. CCSMInitOut%ocn_present = .true. end if if (CCSMInitOut%atm_adiabatic .or. CCSMInitOut%atm_ideal_phys) then CCSMInitOut%lnd_present = .false. CCSMInitOut%ice_present = .false. CCSMInitOut%ocn_present = .false. end if !--------------------------------------------------------------------------- ! Set restart pointer file name if wasn't set on namelist !--------------------------------------------------------------------------- if ( len_trim(CCSMInitOut%restart_pfile) == 0 )then CCSMInitOut%restart_pfile = 'rpointer' //'.drv' end if !--------------------------------------------------------------------------- ! Append values to override list depending on type ! (For branch, override, case_name, for restart don't) !--------------------------------------------------------------------------- if ( shr_inputInfo_initIsBranch( CCSMInitOut ) .and. & (.not. CCSMInitOut%brnch_retain_casename) )then call shr_string_listAppend( CCSMInitOut%restart_file_override, & "case_name" ) end if ! --- Error check the input values and print them out ------ call shr_inputInfo_initCheck( CCSMInitOut ) if ( LogPrint) call shr_inputInfo_initPrint( CCSMInitOut ) END SUBROUTINE shr_inputInfo_initRead !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_inputInfo_initIsStartup -- Return true if this is a startup case ! ! !DESCRIPTION: ! ! Check if this is a startup case. ! ! !INTERFACE: ------------------------------------------------------------------ logical FUNCTION shr_inputInfo_initIsStartup( CCSMInit ) 1 implicit none ! !INPUT/OUTPUT PARAMETERS: type(shr_inputInfo_InitType), intent(IN) :: CCSMInit ! Input CCSM structure !EOP !----- local ----- !------------------------------------------------------------------------------- ! Notes: !------------------------------------------------------------------------------- ! --- Return if startup or not ----- if ( trim(CCSMInit%start_type) == shr_inputInfo_start_type_start )then shr_inputInfo_initIsStartup = .true. else shr_inputInfo_initIsStartup = .false. end if END FUNCTION shr_inputInfo_initIsStartup !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_inputInfo_initIsRestart -- Return true if this is continue or branch ! ! !DESCRIPTION: ! ! Check if this is a continue or "branch" case" ! ! !INTERFACE: ------------------------------------------------------------------ logical FUNCTION shr_inputInfo_initIsRestart( CCSMInit ) 1,1 implicit none ! !INPUT/OUTPUT PARAMETERS: type(shr_inputInfo_InitType), intent(IN) :: CCSMInit ! Input CCSM structure !EOP !----- local ----- !------------------------------------------------------------------------------- ! Notes: !------------------------------------------------------------------------------- ! --- Return if restart or not (negation of startup case) shr_inputInfo_initIsRestart = .not. shr_inputInfo_initIsStartup( CCSMInit ) END FUNCTION shr_inputInfo_initIsRestart !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_inputInfo_initIsContinue -- Return true if this is a continue case ! ! !DESCRIPTION: ! ! Check if this is a continue case. ! ! !INTERFACE: ------------------------------------------------------------------ logical FUNCTION shr_inputInfo_initIsContinue( CCSMInit ) 1 implicit none ! !INPUT/OUTPUT PARAMETERS: type(shr_inputInfo_InitType), intent(IN) :: CCSMInit ! Input CCSM structure !EOP !----- local ----- !------------------------------------------------------------------------------- ! Notes: !------------------------------------------------------------------------------- ! --- Return if continue or not ------ if ( trim(CCSMInit%start_type) == shr_inputInfo_start_type_cont )then shr_inputInfo_initIsContinue = .true. else shr_inputInfo_initIsContinue = .false. end if END FUNCTION shr_inputInfo_initIsContinue !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_inputInfo_initIsBranch -- Return true if this is a branch case ! ! !DESCRIPTION: ! ! Check if this is a branch case. ! ! !INTERFACE: ------------------------------------------------------------------ logical FUNCTION shr_inputInfo_initIsBranch( CCSMInit ) 4 implicit none ! !INPUT/OUTPUT PARAMETERS: type(shr_inputInfo_InitType), intent(IN) :: CCSMInit ! Input CCSM structure !EOP !----- local ----- !------------------------------------------------------------------------------- ! Notes: !------------------------------------------------------------------------------- ! --- Return if branch or not ----- if ( trim(CCSMInit%start_type) == shr_inputInfo_start_type_brnch )then shr_inputInfo_initIsBranch = .true. else shr_inputInfo_initIsBranch = .false. end if END FUNCTION shr_inputInfo_initIsBranch !BOP =========================================================================== ! ! !IROUTINE: shr_inputInfo_initIsSame - Return true if input objects same ! ! !DESCRIPTION: ! ! Check if the two input init objects have the same values. ! ! !INTERFACE: ------------------------------------------------------------------ logical FUNCTION shr_inputInfo_initIsSame( CCSMInit, CCSMInit2 ) implicit none ! !INPUT/OUTPUT PARAMETERS: type(shr_inputInfo_InitType), intent(IN) :: CCSMInit ! Input CCSM structure type(shr_inputInfo_InitType), intent(IN) :: CCSMInit2 ! Second Input CCSM structure !EOP !----- local ----- !------------------------------------------------------------------------------- ! Notes: !------------------------------------------------------------------------------- shr_inputInfo_initIsSame = .false. if ( CCSMInit%start_type /= CCSMInit2%start_type ) return if ( CCSMInit%case_desc /= CCSMInit2%case_desc ) return if ( CCSMInit%case_name /= CCSMInit2%case_name ) return if ( CCSMInit%version /= CCSMInit2%version ) return if ( CCSMInit%username /= CCSMInit2%username ) return if ( CCSMInit%hostname /= CCSMInit2%hostname ) return if ( CCSMInit%atm_adiabatic .neqv. CCSMInit2%atm_adiabatic ) return if ( CCSMInit%atm_ideal_phys .neqv. CCSMInit2%atm_ideal_phys ) return if ( CCSMInit%aqua_planet .neqv. CCSMInit2%aqua_planet ) return if ( CCSMInit%restart_pfile /= CCSMInit2%restart_pfile ) return if ( CCSMInit%restart_file /= CCSMInit2%restart_file ) return if ( CCSMInit%restart_file_override /= CCSMInit2%restart_file_override ) return if ( CCSMInit%logFilePostFix /= CCSMInit2%logFilePostFix ) return if ( CCSMInit%outPathRoot /= CCSMInit2%outPathRoot ) return if ( CCSMInit%brnch_retain_casename .neqv. CCSMInit2%brnch_retain_casename ) return shr_inputInfo_initIsSame = .true. return END FUNCTION shr_inputInfo_initIsSame !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_inputInfo_initRestRead -- Read in NetCDF restart file ! ! !DESCRIPTION: ! ! Read in restart file information from netCDF input restart file ! ! !INTERFACE: ------------------------------------------------------------------ SUBROUTINE shr_inputInfo_initRestRead( restart_file, MPICom, MasterTask, &,60 CCSMInitOut ) !USES: use netcdf use shr_ncio_mod, only: shr_ncio_descripRead, shr_ncio_descripName, & shr_ncio_descripGetString, & shr_ncio_descripGetRealR8, & shr_ncio_descripGetInteger, & shr_ncio_descripGetLogical use shr_string_mod, only: shr_string_listGetIndexF implicit none ! !INPUT/OUTPUT PARAMETERS: character(len=SHR_KIND_CL), intent(IN) :: restart_file ! Restart local filename integer, optional, intent(IN) :: MPICom ! MPI Communicator logical, optional, intent(IN) :: MasterTask ! If MPI master task type(shr_inputInfo_InitType), intent(INOUT) :: CCSMInitOut ! Output CCSM structure !EOP !----- local ----- character(len=*), parameter :: subname = "(shr_inputInfo_initRestRead) " logical :: MasterTask2 ! If MPI master task integer :: i ! Index integer :: list ! Index in override list integer :: ncId ! NetCDF file handle logical :: exists ! If file exists or not !------------------------------------------------------------------------------- ! Notes: !------------------------------------------------------------------------------- if ( present(MasterTask) )then MasterTask2 = MasterTask else MasterTask2 = .true. end if if ( present(MasterTask) .and. .not. present(mpicom) )then call shr_sys_abort( subname//':: if MasterTask input, so must mpicom' ) endif if ( .not. present(MasterTask) .and. present(mpicom) )then call shr_sys_abort( subname//':: if mpicom input, so must MasterTask' ) endif if ( .not. shr_inputInfo_initIsRestart( CCSMInitOut ) ) return if ( shr_inputInfo_initIsBranch( CCSMInitOut ) .and. len_trim(restart_file) == 0 & )then call shr_sys_abort( subname//': on a branch run, restart_file MUST be '// & 'set on namelist' ) end if ! --- Read the restart file ----- call shr_ncio_open( restart_file, MasterTask2, FileType=prefix//"restart_file", & ncId=ncId, exists=exists ) if ( present(MPICom) )then call shr_ncio_descripRead( ncId, NVars, prefix, MPICom, MasterTask2, & var=CCSMInitOut%var ) else call shr_ncio_descripRead( ncId, NVars, prefix, var=CCSMInitOut%var ) end if call shr_ncio_close( ncId, MasterTask2, type=prefix//"restart_file", & NCFileName=restart_file ) !----------------------------------------------------------------------------- ! Put input read into derived type ! Check if item is on over-ride list (if list_index != 0) ! If it is not over-ride list -- use the value from the restart file !----------------------------------------------------------------------------- do i = 1, NVars if ( trim(shr_ncio_descripName(CCSMInitOut%var(i))) == "case_desc" )then list = shr_string_listGetIndexF( CCSMInitOut%restart_file_override, & trim(shr_ncio_descripName(CCSMInitOut%var(i)) ) ) if ( list == 0 ) CCSMInitOut%case_desc = & shr_ncio_descripGetString(CCSMInitOut%var(i)) else if ( trim(shr_ncio_descripName(CCSMInitOut%var(i))) == "case_name" )then list = shr_string_listGetIndexF( CCSMInitOut%restart_file_override, & trim(shr_ncio_descripName(CCSMInitOut%var(i)) ) ) if ( shr_inputInfo_initIsBranch( CCSMInitOut ) .and. & (.not. CCSMInitOut%brnch_retain_casename) )then if ( trim(CCSMInitOut%case_name) == & trim(shr_ncio_descripGetString(CCSMInitOut%var(i))) )then call shr_sys_abort( subname//': Branch and case_name same as '// & 'on restart_file and brnch_retain_casename not set' ) end if end if if ( list == 0 ) CCSMInitOut%case_name = & shr_ncio_descripGetString(CCSMInitOut%var(i)) else if ( trim(shr_ncio_descripName(CCSMInitOut%var(i))) == "version" )then list = shr_string_listGetIndexF( CCSMInitOut%restart_file_override, & trim(shr_ncio_descripName(CCSMInitOut%var(i)) ) ) if ( list == 0 ) CCSMInitOut%version = & shr_ncio_descripGetString(CCSMInitOut%var(i)) else if ( trim(shr_ncio_descripName(CCSMInitOut%var(i))) == "username" )then list = shr_string_listGetIndexF( CCSMInitOut%restart_file_override, & trim(shr_ncio_descripName(CCSMInitOut%var(i)) ) ) if ( list == 0 ) CCSMInitOut%username = & shr_ncio_descripGetString(CCSMInitOut%var(i)) else if ( trim(shr_ncio_descripName(CCSMInitOut%var(i))) == "hostname" )then list = shr_string_listGetIndexF( CCSMInitOut%restart_file_override, & trim(shr_ncio_descripName(CCSMInitOut%var(i)) ) ) if ( list == 0 ) CCSMInitOut%hostname = & shr_ncio_descripGetString(CCSMInitOut%var(i)) else if ( trim(shr_ncio_descripName(CCSMInitOut%var(i))) == "atm_adiabatic" )then list = shr_string_listGetIndexF( CCSMInitOut%restart_file_override, & trim(shr_ncio_descripName(CCSMInitOut%var(i)) ) ) if ( list == 0 ) CCSMInitOut%atm_adiabatic = & shr_ncio_descripGetLogical(CCSMInitOut%var(i)) else if ( trim(shr_ncio_descripName(CCSMInitOut%var(i))) == "atm_ideal_phys" )then list = shr_string_listGetIndexF( CCSMInitOut%restart_file_override, & trim(shr_ncio_descripName(CCSMInitOut%var(i)) ) ) if ( list == 0 ) CCSMInitOut%atm_ideal_phys = & shr_ncio_descripGetLogical(CCSMInitOut%var(i)) else if ( trim(shr_ncio_descripName(CCSMInitOut%var(i))) == "aqua_planet" )then list = shr_string_listGetIndexF( CCSMInitOut%restart_file_override, & trim(shr_ncio_descripName(CCSMInitOut%var(i)) ) ) if ( list == 0 ) CCSMInitOut%aqua_planet = & shr_ncio_descripGetLogical(CCSMInitOut%var(i)) else if ( trim(shr_ncio_descripName(CCSMInitOut%var(i))) == "single_column" )then list = shr_string_listGetIndexF( CCSMInitOut%restart_file_override, & trim(shr_ncio_descripName(CCSMInitOut%var(i)) ) ) if ( list == 0 ) CCSMInitOut%single_column = & shr_ncio_descripGetLogical(CCSMInitOut%var(i)) else if ( trim(shr_ncio_descripName(CCSMInitOut%var(i))) == "scmlat" )then list = shr_string_listGetIndexF( CCSMInitOut%restart_file_override, & trim(shr_ncio_descripName(CCSMInitOut%var(i)) ) ) if ( list == 0 ) CCSMInitOut%scmlat = & shr_ncio_descripGetRealR8(CCSMInitOut%var(i)) else if ( trim(shr_ncio_descripName(CCSMInitOut%var(i))) == "scmlon" )then list = shr_string_listGetIndexF( CCSMInitOut%restart_file_override, & trim(shr_ncio_descripName(CCSMInitOut%var(i)) ) ) if ( list == 0 ) CCSMInitOut%scmlon = & shr_ncio_descripGetRealR8(CCSMInitOut%var(i)) else call shr_sys_abort( subname//': unrecognized variable: '// & trim(shr_ncio_descripName(CCSMInitOut%var(i))) ) end if end do ! --- Check to make sure the structure is valid ------ call shr_inputInfo_initCheck( CCSMInitOut ) END SUBROUTINE shr_inputInfo_initRestRead !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_inputInfo_initRestWrite -- Write out the NetCDF restart file ! ! !DESCRIPTION: ! ! Write out restart file information to netCDF restart file ! ! !INTERFACE: ------------------------------------------------------------------ SUBROUTINE shr_inputInfo_initRestWrite( restart_file, MPICom, MasterTask, &,31 CCSMInit ) ! !USES: use netcdf use shr_ncio_mod, only: shr_ncio_descripWrite, shr_ncio_descripPutData, & shr_ncio_descripName implicit none ! !INPUT/OUTPUT PARAMETERS: character(len=SHR_KIND_CL), intent(IN) :: restart_file ! Restart local filename integer, optional, intent(IN) :: MPICom ! MPI Communicator logical, optional, intent(IN) :: MasterTask ! If MPI master task type(shr_inputInfo_InitType), intent(INOUT) :: CCSMInit ! Output CCSM structure !EOP !----- local ----- character(len=*), parameter :: subname = "(shr_inputInfo_initRestWrite) " logical :: MasterTask2 ! If MPI master task logical :: exists ! If file exists already or not integer :: ncId ! NetCDF file handle integer :: i ! Index !------------------------------------------------------------------------------- ! Notes: !------------------------------------------------------------------------------- if ( present(MasterTask) )then MasterTask2 = MasterTask else MasterTask2 = .true. end if if ( present(MasterTask) .and. .not. present(mpicom) )then call shr_sys_abort( subname//':: if MasterTask input, so must mpicom' ) endif if ( .not. present(MasterTask) .and. present(mpicom) )then call shr_sys_abort( subname//':: if mpicom input, so must MasterTask' ) endif !----------------------------------------------------------------------------- ! Loop over variables, set the data for each structure element !----------------------------------------------------------------------------- do i = 1, NVars if ( trim(shr_ncio_descripName( CCSMInit%var(i) ) ) == "atm_adiabatic" )then call shr_ncio_descripPutData( CCSMInit%var(i), "atm_adiabatic", & LogicalData=CCSMInit%atm_adiabatic ) else if ( trim(shr_ncio_descripName( CCSMInit%var(i) ) ) == "atm_ideal_phys" & )then call shr_ncio_descripPutData( CCSMInit%var(i), "atm_ideal_phys", & LogicalData=CCSMInit%atm_ideal_phys ) else if ( trim(shr_ncio_descripName( CCSMInit%var(i) ) ) == "aqua_planet" )then call shr_ncio_descripPutData( CCSMInit%var(i), "aqua_planet", & LogicalData=CCSMInit%aqua_planet ) else if ( trim(shr_ncio_descripName( CCSMInit%var(i) ) ) == "single_column" )then call shr_ncio_descripPutData( CCSMInit%var(i), "single_column", & LogicalData=CCSMInit%single_column ) else if ( trim(shr_ncio_descripName( CCSMInit%var(i) ) ) == "scmlat" )then call shr_ncio_descripPutData( CCSMInit%var(i), "scmlat", & RealR8Data=CCSMInit%scmlat ) else if ( trim(shr_ncio_descripName( CCSMInit%var(i) ) ) == "scmlon" )then call shr_ncio_descripPutData( CCSMInit%var(i), "scmlon", & RealR8Data=CCSMInit%scmlon ) else if ( trim(shr_ncio_descripName( CCSMInit%var(i) ) ) == "case_desc" )then call shr_ncio_descripPutData( CCSMInit%var(i), "case_desc", & StringData=CCSMInit%case_desc ) else if ( trim(shr_ncio_descripName( CCSMInit%var(i) ) ) == "case_name" )then call shr_ncio_descripPutData( CCSMInit%var(i), "case_name", & StringData=CCSMInit%case_name ) else if ( trim(shr_ncio_descripName( CCSMInit%var(i) ) ) == "version" )then call shr_ncio_descripPutData( CCSMInit%var(i), "version", & StringData=CCSMInit%version ) else if ( trim(shr_ncio_descripName( CCSMInit%var(i) ) ) == "username" )then call shr_ncio_descripPutData( CCSMInit%var(i), "username", & StringData=CCSMInit%username ) else if ( trim(shr_ncio_descripName( CCSMInit%var(i) ) ) == "hostname" )then call shr_ncio_descripPutData( CCSMInit%var(i), "hostname", & StringData=CCSMInit%hostname ) else call shr_sys_abort( subname//': unknown variable name: '// & trim(shr_ncio_descripName( CCSMInit%var(i) ) ) ) end if end do ! --- Actually write the data to the file ------- ! --- Force a clobber here, then exist becomes false call shr_ncio_open( NCFileName=restart_file, MasterTask=masterTask2, & FileType=trim(prefix)//"restart_file", & ncId=ncId, exists=exists, writing=.true., clobber=.true. ) exists = .false. if ( present(MPICom) )then call shr_ncio_descripWrite( ncId, NVars, prefix, mpicom, MasterTask2, & exists=exists, var=CCSMInit%var ) else call shr_ncio_descripWrite( ncId, NVars, prefix, exists=exists, & var=CCSMInit%var ) end if call shr_ncio_close( ncId, MasterTask2, type=prefix//"restart_file", & NCFileName=restart_file ) END SUBROUTINE shr_inputInfo_initRestWrite !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_inputInfo_initRPointerRead -- Read in the restart pointer file ! ! !DESCRIPTION: ! ! Read in restart pointer file, also get the local restart filename ! ! !INTERFACE: ------------------------------------------------------------------ SUBROUTINE shr_inputInfo_initRPointerRead( MPICom, MasterTask, CCSMInit, &,9 restart_file ) ! !USES: USE shr_file_mod, ONLY : shr_file_getUnit, shr_file_freeUnit, shr_file_get USE shr_mpi_mod, ONLY : shr_mpi_bcast implicit none ! !INPUT/OUTPUT PARAMETERS: integer, optional, intent(IN) :: MPICom ! MPI communicator logical, optional, intent(IN) :: MasterTask ! If MPI master task type(shr_inputInfo_InitType), intent(INOUT) :: CCSMInit ! Output CCSM structure character(len=SHR_KIND_CL), intent(OUT) :: restart_file ! Local restart filename !EOP !----- local ----- character(len=*), parameter :: subname = "(shr_inputInfo_initRPointerRead) " integer :: rUnit ! Fortran unit to open logical :: MasterTask2 ! If MPI master task character(len=SHR_KIND_CL) :: rest_file_archive ! Restart filename full archive path integer :: ierr ! Return code integer :: i ! Index !------------------------------------------------------------------------------- ! Notes: !------------------------------------------------------------------------------- if ( present(MasterTask) )then MasterTask2 = MasterTask else MasterTask2 = .true. end if if ( present(MasterTask) .and. .not. present(mpicom) )then call shr_sys_abort( subname//':: if MasterTask input, so must mpicom' ) endif if ( .not. present(MasterTask) .and. present(mpicom) )then call shr_sys_abort( subname//':: if mpicom input, so must MasterTask' ) endif ! --- Only continue if this is a continue or restart case if ( .not. shr_inputInfo_initIsRestart( CCSMInit ) )then call shr_sys_abort( subname//":: can only read RPointer file if "// & "restart or continue" ) end if ! --- Only read restart pointer file -- if this is a continue case ----- if ( shr_inputInfo_initIsContinue( CCSMInit ) )then ! --- Read restart pointer file only on MasterTask ----- if ( MasterTask2 )then rUnit = shr_file_getUnit() if (s_loglev > 0) write(s_logunit,FAA) 'Read ccsm driver restart pointer file: '// & trim(CCSMInit%restart_pfile) open(rUnit, file=CCSMInit%restart_pfile, form='FORMATTED', status='old') read(rUnit,'(a)') rest_file_archive close(rUnit) call shr_file_freeUnit( rUnit ) end if ! --- If MPI broadcast archive filename to all tasks ------- if ( present(MPICom) ) call shr_mpi_bcast( rest_file_archive, MPICom ) else ! --- For branch case get restart_file archive name from input object --- rest_file_archive = CCSMInit%restart_file end if CCSMInit%restart_file = rest_file_archive ! --- Get restart file from archival system, and get local filename ---- i = index( rest_file_archive, "/", back=.true. ) if ( i > 0 )then restart_file = rest_file_archive(i+1:len_trim(rest_file_archive)) else restart_file = rest_file_archive end if if ( MasterTask2 ) call shr_file_get( ierr, restart_file, rest_file_archive ) END SUBROUTINE shr_inputInfo_initRPointerRead !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_inputInfo_initRPointerWrite -- Write out the restart pointer file ! ! !DESCRIPTION: ! ! Write out restart pointer file also get local restart filename ! ! !INTERFACE: ------------------------------------------------------------------ SUBROUTINE shr_inputInfo_initRPointerWrite( ymd, tod, MPICom, MasterTask, &,3 FileType, CCSMInit, restart_file ) ! !USES: use shr_file_mod, only: shr_file_getUnit, shr_file_freeUnit, shr_file_get implicit none ! !INPUT/OUTPUT PARAMETERS: integer, intent(IN) :: ymd ! Simulation date (YYYYMMDD) integer, intent(IN) :: tod ! Simulation time of day (s) integer, optional, intent(IN) :: MPICom ! MPI communicator logical, optional, intent(IN) :: MasterTask ! If MPI master task character(len=*), optional, intent(IN) :: FileType ! File-type descriptor type(shr_inputInfo_InitType), intent(INOUT) :: CCSMInit ! Output CCSM structure character(len=SHR_KIND_CL), intent(OUT) :: restart_file ! Restart local filename !EOP !----- local ----- character(len=*), parameter :: subname = "(shr_inputInfo_initRPointerWrite) " integer :: rUnit ! Restart pointer file unit number` character(len=*), parameter :: filename_format = & "(a,'.',a,'.', i4.4,'-',i2.2,'-',i2.2,'-',i5.5,'.nc')" character(len=SHR_KIND_CS) :: type ! String to describe type of restart logical :: MasterTask2 ! If MPI master task integer :: ierr ! Error code integer :: yr ! Simulation year integer :: mon ! Simulation month integer :: day ! Simulation day of month !------------------------------------------------------------------------------- ! Notes: !------------------------------------------------------------------------------- if ( present(MasterTask) )then MasterTask2 = MasterTask else MasterTask2 = .true. end if if ( present(FileType) )then type = trim(FileType) else type = "drv.r" end if ! --- Figure out restart filename ------- yr = ymd / 10000 mon = (ymd - yr*10000) / 100 day = ymd - yr*10000 - mon*100 write(restart_file,filename_format) trim(CCSMInit%case_name), trim(type), & yr, mon, day, tod CCSMInit%restart_file = restart_file ! --- Only write file out if master-task ------- if ( MasterTask2 )then if (s_loglev > 0) write(s_logunit,FAA) 'Write ccsm driver restart pointer file: '// & trim(CCSMInit%restart_pfile) rUnit = shr_file_getUnit() open(rUnit, file=CCSMInit%restart_pfile, form='FORMATTED', & status='UNKNOWN') write(rUnit,'(a)') trim(restart_file) close(rUnit) call shr_file_freeUnit( rUnit ) end if END SUBROUTINE shr_inputInfo_initRPointerWrite !=============================================================================== !BOP =========================================================================== ! ! !IROUTINE: shr_inputInfo_initCheck -- Check that input InputInfo derived type is valid ! ! !DESCRIPTION: ! ! Check that input CCSMInit object has reasonable values ! ! !INTERFACE: ------------------------------------------------------------------ subroutine shr_inputInfo_initCheck( CCSMInit ) 2,13 ! !USES: use shr_string_mod, only: shr_string_listIntersect implicit none ! !INPUT/OUTPUT PARAMETERS: type(shr_inputInfo_InitType), intent(INOUT) :: CCSMInit ! Output CCSM structure !EOP !----- local ----- character(len=*), parameter :: subname = '(shr_inputInfo_initCheck) ' ! --- Intersection of over-ride list to master override list ------ character(len=SHR_KIND_CL) :: OverrideList integer :: lastchar ! Last character index integer :: rc ! Return code character(len=*), parameter :: F00 = "('"//LogPrefix//"',A,I3,A)" !------------------------------------------------------------------------------- ! Notes: !------------------------------------------------------------------------------- if (CCSMInit%case_name==' ') then call shr_sys_abort( subname//': variable case_name must be set') end if ! --- Override values ------------------------------------------------------ if ( len_trim(CCSMInit%restart_file_override) > 0 )then call shr_string_listIntersect( & CCSMInit%restart_file_override,restartFileOverRideList, & OverRideList, rc) if ( trim(OverRideList) /= trim(CCSMInit%restart_file_override) )then write(s_logunit,FAA)'ERROR: the only values that can be overridden are: '// & trim(restartFileOverRideList) call shr_sys_abort( subname//': list of values to override ' // & 'includes values that can NOT' & //" be overridden" ) end if end if ! --- Case name ------ lastchar = len(CCSMInit%case_name) if ( len_trim(CCSMInit%case_name) == 0) then call shr_sys_abort( subname//': variable case_name must be set, aborting') end if if (CCSMInit%case_name(lastchar:lastchar) /= ' ') then write(s_logunit,F00)'ERROR: case_name must not exceed ', len(CCSMInit%case_name)-1, & ' characters' call shr_sys_abort( subname//': variable case_name must be set, aborting') end if ! --- Special configurations ----- if ( CCSMInit%atm_adiabatic .and. (CCSMInit%atm_ideal_phys .or. & CCSMInit%aqua_planet) )then call shr_sys_abort( subname//': only one of atm_adiabatic, ' // & 'atm_ideal_phys or aqua_planet can be set' ) end if ! --- Restart pointer file ----- if ( len_trim(CCSMInit%restart_pfile) == 0 ) then call shr_sys_abort( subname//': restart_pfile must be set' ) end if ! --- LogFile ending name ----- if ( len_trim(CCSMInit%logFilePostFix) == 0 ) then call shr_sys_abort( subname//': logFilePostFix must be set to something not blank' ) end if ! --- Output path root directory ----- if ( len_trim(CCSMInit%outPathRoot) == 0 ) then call shr_sys_abort( subname//': outPathRoot must be set' ) end if if ( index(CCSMInit%outPathRoot,"/",back=.true.) /= & len_trim(CCSMInit%outPathRoot) ) then call shr_sys_abort( subname//': outPathRoot must end with a slash' ) end if ! --- Start-type ------ if ( len_trim(CCSMInit%start_type) == 0 ) then call shr_sys_abort( subname//': variable start_type must be set') end if if ( (trim(CCSMInit%start_type) /= shr_inputInfo_start_type_start ) & .and. (trim(CCSMInit%start_type) /= shr_inputInfo_start_type_cont ) & .and. (trim(CCSMInit%start_type) /= shr_inputInfo_start_type_brnch) & ) then call shr_sys_abort( subname//': variable start_type can only be ' // & 'set to:' // & shr_inputInfo_start_type_start//', '// & shr_inputInfo_start_type_cont//', or'// & shr_inputInfo_start_type_brnch ) end if END SUBROUTINE shr_inputInfo_initCheck !=============================================================================== !=============================================================================== END MODULE shr_inputInfo_mod