diff --git a/datm/CMakeLists.txt b/datm/CMakeLists.txt
index 1676125d7..522a68761 100644
--- a/datm/CMakeLists.txt
+++ b/datm/CMakeLists.txt
@@ -6,7 +6,8 @@ set(SRCFILES atm_comp_nuopc.F90
datm_datamode_jra_mod.F90
datm_datamode_gefs_mod.F90
datm_datamode_cfsr_mod.F90
- datm_datamode_era5_mod.F90)
+ datm_datamode_era5_mod.F90
+ datm_datamode_simple_mod.F90)
foreach(FILE ${SRCFILES})
diff --git a/datm/atm_comp_nuopc.F90 b/datm/atm_comp_nuopc.F90
index 5e504a0fb..8d9a4835c 100644
--- a/datm/atm_comp_nuopc.F90
+++ b/datm/atm_comp_nuopc.F90
@@ -82,6 +82,12 @@ module cdeps_datm_comp
use datm_datamode_cfsr_mod , only : datm_datamode_cfsr_restart_write
use datm_datamode_cfsr_mod , only : datm_datamode_cfsr_restart_read
+ use datm_datamode_simple_mod , only : datm_datamode_simple_advertise
+ use datm_datamode_simple_mod , only : datm_datamode_simple_init_pointers
+ use datm_datamode_simple_mod , only : datm_datamode_simple_advance
+ use datm_datamode_simple_mod , only : datm_datamode_simple_restart_write
+ use datm_datamode_simple_mod , only : datm_datamode_simple_restart_read
+
implicit none
private ! except
@@ -350,7 +356,8 @@ subroutine InitializeAdvertise(gcomp, importState, exportState, clock, rc)
trim(datamode) == 'CPLHIST' .or. &
trim(datamode) == 'GEFS' .or. &
trim(datamode) == 'CFSR' .or. &
- trim(datamode) == 'ERA5') then
+ trim(datamode) == 'ERA5' .or. &
+ trim(datamode) == 'SIMPLE') then
else
call shr_sys_abort(' ERROR illegal datm datamode = '//trim(datamode))
endif
@@ -382,6 +389,10 @@ subroutine InitializeAdvertise(gcomp, importState, exportState, clock, rc)
case ('CFSR')
call datm_datamode_cfsr_advertise(exportState, fldsExport, flds_scalar_name, rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ case ('SIMPLE')
+ call datm_datamode_simple_advertise(exportState, fldsExport, flds_scalar_name, &
+ nlfilename, my_task, vm, rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
end select
end subroutine InitializeAdvertise
@@ -625,6 +636,9 @@ subroutine datm_comp_run(importState, exportState, target_ymd, target_tod, targe
case('CFSR')
call datm_datamode_cfsr_init_pointers(exportState, sdat, rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ case('SIMPLE')
+ call datm_datamode_simple_init_pointers(exportState, sdat, rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
end select
! Read restart if needed
@@ -644,6 +658,8 @@ subroutine datm_comp_run(importState, exportState, target_ymd, target_tod, targe
call datm_datamode_gefs_restart_read(restfilm, inst_suffix, logunit, my_task, mpicom, sdat)
case('CFSR')
call datm_datamode_cfsr_restart_read(restfilm, inst_suffix, logunit, my_task, mpicom, sdat)
+ case('SIMPLE')
+ call datm_datamode_simple_restart_read(restfilm, inst_suffix, logunit, my_task, mpicom, sdat)
end select
end if
@@ -698,6 +714,10 @@ subroutine datm_comp_run(importState, exportState, target_ymd, target_tod, targe
call datm_datamode_cfsr_advance(exportstate, mainproc, logunit, mpicom, target_ymd, &
target_tod, sdat%model_calendar, rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ case('SIMPLE')
+ call datm_datamode_simple_advance(target_ymd, target_tod, target_mon, &
+ sdat%model_calendar, rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
end select
! Write restarts if needed
@@ -726,6 +746,9 @@ subroutine datm_comp_run(importState, exportState, target_ymd, target_tod, targe
call datm_datamode_cfsr_restart_write(case_name, inst_suffix, target_ymd, target_tod, &
logunit, my_task, sdat)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ case('SIMPLE')
+ call datm_datamode_simple_restart_write(case_name, inst_suffix, target_ymd, target_tod, &
+ logunit, my_task, sdat)
end select
end if
diff --git a/datm/cime_config/buildnml b/datm/cime_config/buildnml
index d8c11a452..afee50344 100755
--- a/datm/cime_config/buildnml
+++ b/datm/cime_config/buildnml
@@ -174,7 +174,7 @@ def _create_namelists(case, confdir, inst_string, infile, nmlgen, data_list_path
# Generate datm_in
namelist_file = os.path.join(confdir, "datm_in")
- nmlgen.write_output_file(namelist_file, data_list_path, groups=['datm_nml'])
+ nmlgen.write_output_file(namelist_file, data_list_path, groups=['datm_nml','const_forcing_nml'])
# Determine streams
streamlist = nmlgen.get_streams()
diff --git a/datm/cime_config/config_component.xml b/datm/cime_config/config_component.xml
index de8840a01..e0a04797d 100644
--- a/datm/cime_config/config_component.xml
+++ b/datm/cime_config/config_component.xml
@@ -10,7 +10,7 @@
This file may have atm desc entries.
-->
- Data driven ATM
+ Data driven ATM
QIAN data set
QIAN with water isotopes
CRUNCEP data set
@@ -27,6 +27,7 @@
JRA55 Repeat Year Forcing v1.3 1990-1991
JRA55 Repeat Year Forcing v1.3 2003-2004
ERA5 interannual forcing
+ Namelist-configurable, constant datm forcing for simple experiments
@@ -40,7 +41,7 @@
char
- CORE2_NYF,CORE2_IAF,CLM_QIAN,CLM_QIAN_WISO,1PT,CLMCRUNCEP,CLMCRUNCEPv7,CLMGSWP3v1,CLMNLDAS2,CPLHIST,CORE_IAF_JRA,CORE_IAF_JRA_1p4_2018,ERA5
+ CORE2_NYF,CORE2_IAF,CLM_QIAN,CLM_QIAN_WISO,1PT,CLMCRUNCEP,CLMCRUNCEPv7,CLMGSWP3v1,CLMNLDAS2,CPLHIST,CORE_IAF_JRA,CORE_IAF_JRA_1p4_2018,ERA5,SIMPLE
CORE2_NYF
run_component_datm
env_run.xml
@@ -61,6 +62,7 @@
1PT
ERA5
CPLHIST
+ SIMPLE
diff --git a/datm/cime_config/namelist_definition_datm.xml b/datm/cime_config/namelist_definition_datm.xml
index 08749a02b..491b6f6d1 100644
--- a/datm/cime_config/namelist_definition_datm.xml
+++ b/datm/cime_config/namelist_definition_datm.xml
@@ -70,6 +70,7 @@
ERA5_HOURLY
+
CPLHISTForcing.Solar,CPLHISTForcing.nonSolarFlux,CPLHISTForcing.State3hr,CPLHISTForcing.State1hr
@@ -80,7 +81,7 @@
char
datm
datm_nml
- CLMNCEP,CORE2_NYF,CORE2_IAF,CORE_IAF_JRA,ERA5,CPLHIST,1PT
+ CLMNCEP,CORE2_NYF,CORE2_IAF,CORE_IAF_JRA,ERA5,SIMPLE,CPLHIST,1PT
general method that operates on the data.
----datamode = "CPLHIST"----
@@ -114,6 +115,8 @@
active-land-only simulations.
----datamode = "ERA5"----
Fifth generation ECMWF atmospheric reanalysis of the global climate
+ ----datamode = "SIMPLE"----
+ Namelist-configurable, constant datm forcing for simple experiments
----datamode = "CPLHIST" ----
@@ -132,6 +135,9 @@
ERA5
+
+ SIMPLE
+
CPLHIST
@@ -364,4 +370,107 @@
+
+ real
+ datm
+ const_forcing_nml
+
+ density at the lowest model layer
+ units: kg m-3
+
+
+ 1.204
+
+
+
+
+ real
+ datm
+ const_forcing_nml
+
+ inst_pres_height_surface
+ units: Pa
+
+
+ 101325.0
+
+
+
+
+ real
+ datm
+ const_forcing_nml
+
+ Constant bottom layer specific humidity
+ units: kg kg-1
+
+
+ 0.0
+
+
+
+
+ real
+ datm
+ const_forcing_nml
+
+ Constant air temperature at lowest model layer
+ units: K
+
+
+ 273.15
+
+
+
+
+ real
+ datm
+ const_forcing_nml
+
+ Constant zonal wind speed forcing for simple models.
+ units: m s-1
+
+
+ 0.0
+
+
+
+
+ real
+ datm
+ const_forcing_nml
+
+ Constant meridional wind speed forcing for simple models.
+ units: m s-1
+
+
+ 0.0
+
+
+
+
+ real
+ datm
+ const_forcing_nml
+
+ Peak idealized shortwave radiation to be passed to ice/ocean surface.
+ units: W m-2
+
+
+ 330.0
+
+
+
+
+ real
+ datm
+ const_forcing_nml
+
+ Peak idealized longwave radiation to be passed to ice/ocean surface.
+ units: W m-2
+
+
+ 450.0
+
+
diff --git a/datm/cime_config/stream_definition_datm.xml b/datm/cime_config/stream_definition_datm.xml
index 07f05f825..310c5097e 100644
--- a/datm/cime_config/stream_definition_datm.xml
+++ b/datm/cime_config/stream_definition_datm.xml
@@ -41,6 +41,7 @@
CORE_RYF9091_JRA = JRA55 repeat year forcing, v1.3, 1990-1991 (for forcing POP and CICE)
CORE_RYF0304_JRA = JRA55 repeat year forcing, v1.3, 2003-2004 (for forcing POP and CICE)
ERA5 = ERA5 intra-annual year forcing
+ SIMPLE = Namelist-configurable, constant datm forcing for simple experiments
CPLHIST = Streams for lnd or ocn/ice forcing used for spinup
Currently the following optional streams are supported
diff --git a/datm/datm_datamode_simple_mod.F90 b/datm/datm_datamode_simple_mod.F90
new file mode 100644
index 000000000..9d670dbea
--- /dev/null
+++ b/datm/datm_datamode_simple_mod.F90
@@ -0,0 +1,377 @@
+module datm_datamode_simple_mod
+
+ use ESMF , only : ESMF_State, ESMF_StateGet, ESMF_Field, ESMF_FieldBundle
+ use ESMF , only : ESMF_DistGrid, ESMF_RouteHandle, ESMF_MeshCreate
+ use ESMF , only : ESMF_Mesh, ESMF_MeshGet, ESMF_MeshCreate
+ use ESMF , only : ESMF_SUCCESS, ESMF_LogWrite, ESMF_FILEFORMAT_ESMFMESH
+ use ESMF , only : ESMF_StateItem_Flag, ESMF_STATEITEM_NOTFOUND, operator(/=)
+ use ESMF , only : ESMF_FieldBundleCreate, ESMF_FieldCreate, ESMF_MESHLOC_ELEMENT
+ use ESMF , only : ESMF_FieldBundleAdd, ESMF_LOGMSG_INFO, ESMF_TYPEKIND_R8
+ use ESMF , only : ESMF_RouteHandleDestroy, ESMF_EXTRAPMETHOD_NEAREST_STOD
+ use ESMF , only : ESMF_POLEMETHOD_ALLAVG, ESMF_REGRIDMETHOD_BILINEAR
+ use ESMF , only : ESMF_DistGridGet, ESMF_FieldRegridStore, ESMF_FieldRedistStore
+ use ESMF , only : ESMF_VM, ESMF_VMBroadcast
+ use pio , only : Var_Desc_t, file_desc_t, io_desc_t, pio_read_darray, pio_freedecomp
+ use pio , only : pio_openfile, PIO_NOWRITE, pio_seterrorhandling, PIO_BCAST_ERROR
+ use pio , only : pio_initdecomp, pio_inq_dimlen, pio_inq_varid
+ use pio , only : pio_inq_varndims, pio_inq_vardimid, pio_double
+ use pio , only : pio_closefile
+ use NUOPC , only : NUOPC_Advertise
+ use shr_kind_mod , only : r8=>shr_kind_r8, i8=>shr_kind_i8, cl=>shr_kind_cl, cs=>shr_kind_cs
+ use shr_sys_mod , only : shr_sys_abort
+ use shr_cal_mod , only : shr_cal_date2julian
+ use shr_const_mod , only : shr_const_tkfrz, shr_const_pi
+ use dshr_strdata_mod , only : shr_strdata_get_stream_pointer, shr_strdata_type
+ use dshr_methods_mod , only : dshr_state_getfldptr, dshr_fldbun_getfldptr, dshr_fldbun_regrid, chkerr
+ use dshr_mod , only : dshr_restart_read, dshr_restart_write
+ use dshr_strdata_mod , only : shr_strdata_type
+ use dshr_fldlist_mod , only : fldlist_type, dshr_fldlist_add
+
+ implicit none
+ private ! except
+
+ public :: datm_datamode_simple_advertise
+ public :: datm_datamode_simple_init_pointers
+ public :: datm_datamode_simple_advance
+ public :: datm_datamode_simple_restart_write
+ public :: datm_datamode_simple_restart_read
+
+ ! export state pointers
+ real(r8), pointer :: Sa_u(:) => null()
+ real(r8), pointer :: Sa_v(:) => null()
+ real(r8), pointer :: Sa_z(:) => null()
+ real(r8), pointer :: Sa_tbot(:) => null()
+ real(r8), pointer :: Sa_ptem(:) => null()
+ real(r8), pointer :: Sa_shum(:) => null()
+ real(r8), pointer :: Sa_pbot(:) => null()
+ real(r8), pointer :: Sa_dens(:) => null()
+ real(r8), pointer :: Sa_pslv(:) => null()
+ real(r8), pointer :: Faxa_lwdn(:) => null()
+ real(r8), pointer :: Faxa_rainc(:) => null()
+ real(r8), pointer :: Faxa_rainl(:) => null()
+ real(r8), pointer :: Faxa_snowc(:) => null()
+ real(r8), pointer :: Faxa_snowl(:) => null()
+ real(r8), pointer :: Faxa_swndr(:) => null()
+ real(r8), pointer :: Faxa_swndf(:) => null()
+ real(r8), pointer :: Faxa_swvdr(:) => null()
+ real(r8), pointer :: Faxa_swvdf(:) => null()
+ real(r8), pointer :: Faxa_swnet(:) => null()
+ real(r8), pointer :: Faxa_ndep(:,:) => null()
+
+ ! othe module arrays
+ real(R8), pointer :: yc(:) ! array of model latitudes
+ real(R8), pointer :: xc(:) ! array of model longitudes
+
+ ! constant forcing values to be set via const_forcing_nml
+ real(R8) :: dn10 = 1.204_R8
+ real(R8) :: slp = 101325.0_R8
+ real(R8) :: q = 0.0_R8
+ real(R8) :: t = 273.15_R8
+ real(R8) :: u = 0.0_R8
+ real(R8) :: v = 0.0_R8
+ real(R8) :: peak_swdn = 330.0_R8
+ real(R8) :: peak_lwdn = 450.0_R8
+
+ ! constants
+ real(R8) , parameter :: tKFrz = SHR_CONST_TKFRZ
+ real(R8) , parameter :: degtorad = SHR_CONST_PI/180.0_R8
+ real(R8) , parameter :: phs_c0 = 0.298_R8
+ real(R8) , parameter :: dLWarc = -5.000_R8
+
+ character(*), parameter :: nullstr = 'null'
+ character(*), parameter :: rpfile = 'rpointer.atm'
+ character(*), parameter :: u_FILE_u = &
+ __FILE__
+
+!===============================================================================
+contains
+!===============================================================================
+
+ subroutine datm_datamode_simple_advertise(exportState, fldsexport, flds_scalar_name, &
+ nlfilename, my_task, vm, rc)
+
+ ! input/output variables
+ type(esmf_State) , intent(inout) :: exportState
+ type(fldlist_type) , pointer :: fldsexport
+ character(len=*) , intent(in) :: flds_scalar_name
+ character(len=*) , intent(in) :: nlfilename
+ integer , intent(in) :: my_task
+ type(ESMF_VM) , intent(in) :: vm
+ integer , intent(out) :: rc
+
+ ! local variables
+ type(fldlist_type), pointer :: fldList
+ integer , parameter :: main_task = 0 ! task number of main task
+ integer :: ierr ! error code
+ integer :: nu ! unit number
+ character(len=*) , parameter :: subname='(datm_datamode_simple_advertise): '
+ real(R8) :: bcasttmp(8)
+
+ !-------------------------------------------------------------------------------
+
+ namelist / const_forcing_nml / dn10, slp, q, t, u, v, peak_swdn, peak_lwdn
+
+ rc = ESMF_SUCCESS
+
+ ! Read const_forcing_nml from nlfilename
+ if (my_task == main_task) then
+ open (newunit=nu,file=trim(nlfilename),status="old",action="read")
+ read (nu,nml=const_forcing_nml,iostat=ierr)
+ close(nu)
+ if (ierr > 0) then
+ call shr_sys_abort(subName//': namelist read error '//trim(nlfilename))
+ end if
+
+ bcasttmp = 0
+ bcasttmp(1) = dn10
+ bcasttmp(2) = slp
+ bcasttmp(3) = q
+ bcasttmp(4) = t
+ bcasttmp(5) = u
+ bcasttmp(6) = v
+ bcasttmp(7) = peak_swdn
+ bcasttmp(8) = peak_lwdn
+ end if
+
+ call ESMF_VMBroadcast(vm, bcasttmp, 8, main_task, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+
+ dn10 = bcasttmp(1)
+ slp = bcasttmp(2)
+ q = bcasttmp(3)
+ t = bcasttmp(4)
+ u = bcasttmp(5)
+ v = bcasttmp(6)
+ peak_swdn = bcasttmp(7)
+ peak_lwdn = bcasttmp(8)
+
+ call dshr_fldList_add(fldsExport, trim(flds_scalar_name))
+ call dshr_fldList_add(fldsExport, 'Sa_z' )
+ call dshr_fldList_add(fldsExport, 'Sa_u' )
+ call dshr_fldList_add(fldsExport, 'Sa_v' )
+ call dshr_fldList_add(fldsExport, 'Sa_ptem' )
+ call dshr_fldList_add(fldsExport, 'Sa_dens' )
+ call dshr_fldList_add(fldsExport, 'Sa_pslv' )
+ call dshr_fldList_add(fldsExport, 'Sa_tbot' )
+ call dshr_fldList_add(fldsExport, 'Sa_pbot' )
+ call dshr_fldList_add(fldsExport, 'Sa_shum' )
+ call dshr_fldList_add(fldsExport, 'Faxa_rainc' )
+ call dshr_fldList_add(fldsExport, 'Faxa_rainl' )
+ call dshr_fldList_add(fldsExport, 'Faxa_snowc' )
+ call dshr_fldList_add(fldsExport, 'Faxa_snowl' )
+ call dshr_fldList_add(fldsExport, 'Faxa_swndr' )
+ call dshr_fldList_add(fldsExport, 'Faxa_swvdr' )
+ call dshr_fldList_add(fldsExport, 'Faxa_swndf' )
+ call dshr_fldList_add(fldsExport, 'Faxa_swvdf' )
+ call dshr_fldList_add(fldsExport, 'Faxa_swnet' )
+ call dshr_fldList_add(fldsExport, 'Faxa_lwdn' )
+ call dshr_fldList_add(fldsExport, 'Faxa_swdn' )
+
+ fldlist => fldsExport ! the head of the linked list
+ do while (associated(fldlist))
+ call NUOPC_Advertise(exportState, standardName=fldlist%stdname, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ call ESMF_LogWrite('(datm_comp_advertise): Fr_atm'//trim(fldList%stdname), ESMF_LOGMSG_INFO)
+ fldList => fldList%next
+ enddo
+
+ end subroutine datm_datamode_simple_advertise
+
+ !===============================================================================
+ subroutine datm_datamode_simple_init_pointers(exportState, sdat, rc)
+
+ ! input/output variables
+ type(ESMF_State) , intent(inout) :: exportState
+ type(shr_strdata_type) , intent(in) :: sdat
+ integer , intent(out) :: rc
+
+ ! local variables
+ integer :: n
+ integer :: lsize
+ integer :: spatialDim ! number of dimension in mesh
+ integer :: numOwnedElements ! size of mesh
+ real(r8), pointer :: ownedElemCoords(:) ! mesh lat and lons
+ type(ESMF_StateItem_Flag) :: itemFlag
+ character(len=*), parameter :: subname='(datm_init_pointers): '
+ !-------------------------------------------------------------------------------
+
+ rc = ESMF_SUCCESS
+
+ lsize = sdat%model_lsize
+
+ call ESMF_MeshGet(sdat%model_mesh, spatialDim=spatialDim, numOwnedElements=numOwnedElements, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ allocate(ownedElemCoords(spatialDim*numOwnedElements))
+ allocate(yc(numOwnedElements))
+ allocate(xc(numOwnedElements))
+ call ESMF_MeshGet(sdat%model_mesh, ownedElemCoords=ownedElemCoords)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ do n = 1,numOwnedElements
+ yc(n) = ownedElemCoords(2*n)
+ xc(n) = ownedElemCoords(2*n-1)
+ end do
+
+ ! get export state pointers
+ call dshr_state_getfldptr(exportState, 'Sa_z' , fldptr1=Sa_z , rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ call dshr_state_getfldptr(exportState, 'Sa_u' , fldptr1=Sa_u , rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ call dshr_state_getfldptr(exportState, 'Sa_v' , fldptr1=Sa_v , rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ call dshr_state_getfldptr(exportState, 'Sa_tbot' , fldptr1=Sa_tbot , rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ call dshr_state_getfldptr(exportState, 'Sa_pbot' , fldptr1=Sa_pbot , rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ call dshr_state_getfldptr(exportState, 'Sa_dens' , fldptr1=Sa_dens , rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ call dshr_state_getfldptr(exportState, 'Sa_pslv' , fldptr1=Sa_pslv , rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ call dshr_state_getfldptr(exportState, 'Sa_ptem' , fldptr1=Sa_ptem , rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ call dshr_state_getfldptr(exportState, 'Sa_shum' , fldptr1=Sa_shum , rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ call dshr_state_getfldptr(exportState, 'Faxa_rainc' , fldptr1=Faxa_rainc , rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ call dshr_state_getfldptr(exportState, 'Faxa_rainl' , fldptr1=Faxa_rainl , rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ call dshr_state_getfldptr(exportState, 'Faxa_snowc' , fldptr1=Faxa_snowc , rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ call dshr_state_getfldptr(exportState, 'Faxa_snowl' , fldptr1=Faxa_snowl , rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ call dshr_state_getfldptr(exportState, 'Faxa_swvdr' , fldptr1=Faxa_swvdr , rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ call dshr_state_getfldptr(exportState, 'Faxa_swvdf' , fldptr1=Faxa_swvdf , rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ call dshr_state_getfldptr(exportState, 'Faxa_swndr' , fldptr1=Faxa_swndr , rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ call dshr_state_getfldptr(exportState, 'Faxa_swndf' , fldptr1=Faxa_swndf , rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ call dshr_state_getfldptr(exportState, 'Faxa_swnet' , fldptr1=Faxa_swnet , rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ call dshr_state_getfldptr(exportState, 'Faxa_lwdn' , fldptr1=Faxa_lwdn , rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+
+ call ESMF_StateGet(exportstate, 'Faxa_ndep', itemFlag, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ if (itemflag /= ESMF_STATEITEM_NOTFOUND) then
+ call dshr_state_getfldptr(exportState, 'Faxa_ndep', fldptr2=Faxa_ndep, rc=rc)
+ if (ChkErr(rc,__LINE__,u_FILE_u)) return
+ end if
+
+ end subroutine datm_datamode_simple_init_pointers
+
+ !===============================================================================
+ subroutine datm_datamode_simple_advance(target_ymd, target_tod, target_mon, &
+ model_calendar, rc)
+
+ ! input/output variables
+ integer , intent(in) :: target_ymd
+ integer , intent(in) :: target_tod
+ integer , intent(in) :: target_mon
+ character(len=*) , intent(in) :: model_calendar
+ integer , intent(out) :: rc
+
+ ! local variables
+ integer :: n
+ integer :: lsize
+ real(R8) :: rday ! elapsed day
+ character(len=*), parameter :: subname='(datm_datamode_simple): '
+ real(R8), parameter :: epsilon_deg = 23.45 ! axial tilt of the Earth
+ real(R8) :: solar_decl ! solar declination angle (rad) to be used in idealized radiation calculations
+ real(R8) :: hour_angle ! hour angle (rad) to be used in idealized radiation calculations
+ real(R8) :: zenith_angle ! solar senith angle (rad) to be used in idealized radiation calculations
+ !-------------------------------------------------------------------------------
+
+ rc = ESMF_SUCCESS
+
+ lsize = size(Sa_z)
+
+ call shr_cal_date2julian(target_ymd, target_tod, rday, model_calendar)
+ rday = mod((rday - 1.0_R8),365.0_R8)
+
+ do n = 1,lsize
+ Sa_z(n) = 10.0_R8
+
+ !--- (i) Set forcing fields to constant values read from the namelist file ---
+ Sa_dens(n) = dn10
+ Sa_pslv(n) = slp
+ Sa_pbot(n) = Sa_pslv(n)
+ Sa_shum(n) = q
+ Sa_tbot(n) = t
+ Sa_ptem(n) = Sa_tbot(n)
+ Sa_u(n) = u
+ Sa_v(n) = v
+
+ !--- (ii) Set precipitation (currently all zeros) ---
+
+ Faxa_rainc(n) = 0.0_R8 ! default zero
+ Faxa_snowc(n) = 0.0_R8
+ if (Sa_tbot(n) < tKFrz ) then ! assign precip to rain/snow components
+ Faxa_rainl(n) = 0.0_R8
+ Faxa_snowl(n) = 0.0_R8 ! todo
+ else
+ Faxa_rainl(n) = 0.0_R8 ! todo
+ Faxa_snowl(n) = 0.0_R8
+ endif
+
+ !--- (iii) RADIATION DATA ---
+
+ ! long wave
+ solar_decl = (epsilon_deg * degtorad) * sin( 2.0_R8 * shr_const_pi * (int(rday) + 284.0_R8) / 365.0_R8)
+ zenith_angle = acos(sin(yc(n) * degtorad ) * sin(solar_decl) + cos(yc(n) * degtorad) * cos(solar_decl) )
+ Faxa_lwdn(n) = max(0.0_R8, peak_lwdn * cos(zenith_angle))
+
+ ! short wave
+ hour_angle = (15.0_R8 * (target_tod/3600.0_R8 - 12.0_R8) + xc(n) ) * degtorad
+ zenith_angle = acos(sin(yc(n) * degtorad ) * sin(solar_decl) + cos(yc(n) * degtorad) * cos(solar_decl) * cos(hour_angle) )
+ Faxa_swnet(n) = max(0.0_R8, peak_swdn * cos(zenith_angle))
+ Faxa_swvdr(n) = Faxa_swnet(n)*(0.28_R8)
+ Faxa_swndr(n) = Faxa_swnet(n)*(0.31_R8)
+ Faxa_swvdf(n) = Faxa_swnet(n)*(0.24_R8)
+ Faxa_swndf(n) = Faxa_swnet(n)*(0.17_R8)
+
+ enddo ! lsize
+
+ if (associated(Faxa_ndep)) then
+ ! convert ndep flux to units of kgN/m2/s (input is in gN/m2/s)
+ Faxa_ndep(:,:) = Faxa_ndep(:,:) / 1000._r8
+ end if
+
+ end subroutine datm_datamode_simple_advance
+
+ !===============================================================================
+ subroutine datm_datamode_simple_restart_write(case_name, inst_suffix, ymd, tod, &
+ logunit, my_task, sdat)
+
+ ! input/output variables
+ character(len=*) , intent(in) :: case_name
+ character(len=*) , intent(in) :: inst_suffix
+ integer , intent(in) :: ymd ! model date
+ integer , intent(in) :: tod ! model sec into model date
+ integer , intent(in) :: logunit
+ integer , intent(in) :: my_task
+ type(shr_strdata_type) , intent(inout) :: sdat
+ !-------------------------------------------------------------------------------
+
+ call dshr_restart_write(rpfile, case_name, 'datm', inst_suffix, ymd, tod, &
+ logunit, my_task, sdat)
+
+ end subroutine datm_datamode_simple_restart_write
+
+ !===============================================================================
+ subroutine datm_datamode_simple_restart_read(rest_filem, inst_suffix, logunit, my_task, mpicom, sdat)
+
+ ! input/output arguments
+ character(len=*) , intent(inout) :: rest_filem
+ character(len=*) , intent(in) :: inst_suffix
+ integer , intent(in) :: logunit
+ integer , intent(in) :: my_task
+ integer , intent(in) :: mpicom
+ type(shr_strdata_type) , intent(inout) :: sdat
+ !-------------------------------------------------------------------------------
+
+ call dshr_restart_read(rest_filem, rpfile, inst_suffix, nullstr, logunit, my_task, mpicom, sdat)
+
+ end subroutine datm_datamode_simple_restart_read
+
+end module datm_datamode_simple_mod